1 | #ifndef __PBUFFERS_H__
|
---|
2 | #define __PBUFFERS_H__
|
---|
3 |
|
---|
4 | #if defined(WIN32)
|
---|
5 | # include <windows.h>
|
---|
6 | # include <GL/gl.h>
|
---|
7 | # include <GL/wglext.h>
|
---|
8 | # pragma warning (disable : 4786)
|
---|
9 | #elif defined(UNIX)
|
---|
10 | # include <GL/glx.h>
|
---|
11 | # include <GL/glxext.h>
|
---|
12 | #elif defined(MACOS)
|
---|
13 | # include <AGL/agl.h>
|
---|
14 | #endif
|
---|
15 |
|
---|
16 | #include <string>
|
---|
17 | #include <vector>
|
---|
18 |
|
---|
19 | // The pixel format for the pbuffer is controlled by the mode string passed
|
---|
20 | // into the PBuffer constructor. This string can have the following attributes:
|
---|
21 | //
|
---|
22 | // r - r pixel format (for float buffer).
|
---|
23 | // rg - rg pixel format (for float buffer).
|
---|
24 | // rgb - rgb pixel format. 8 bit or 16/32 bit in float buffer mode
|
---|
25 | // rgba - same as "rgb alpha" string
|
---|
26 | // alpha - must have alpha channel
|
---|
27 | // depth - must have a depth buffer
|
---|
28 | // depth=n - must have n-bit depth buffer
|
---|
29 | // stencil - must have a stencil buffer
|
---|
30 | // double - must support double buffered rendering
|
---|
31 | // samples=n - must support n-sample antialiasing (n can be 2 or 4)
|
---|
32 | // float=n - must support n-bit per channel floating point
|
---|
33 | //
|
---|
34 | // texture2D
|
---|
35 | // textureRECT
|
---|
36 | // textureCUBE - must support binding pbuffer as texture to specified target
|
---|
37 | // - binding the depth buffer is also supporting by specifying
|
---|
38 | // '=depth' like so: texture2D=depth or textureRECT=depth
|
---|
39 | // - the internal format of the texture will be rgba by default or
|
---|
40 | // float if pbuffer is floating point
|
---|
41 | //
|
---|
42 | class PBuffer
|
---|
43 | {
|
---|
44 | public:
|
---|
45 | bool m_HasDepthTexture;
|
---|
46 | bool m_HasAuxBuffers;
|
---|
47 | // see above for documentation on strMode format
|
---|
48 | // set managed to true if you want the class to cleanup OpenGL objects in destructor
|
---|
49 | PBuffer(const char *strMode, bool managed = false);
|
---|
50 | ~PBuffer();
|
---|
51 |
|
---|
52 | bool Initialize(int iWidth, int iHeight, bool bShareContexts, bool bShareObjects);
|
---|
53 | void Destroy();
|
---|
54 |
|
---|
55 | void Activate(PBuffer *current = NULL); // to switch between pbuffers, pass active pbuffer as argument
|
---|
56 | void Deactivate();
|
---|
57 |
|
---|
58 | #if defined(WIN32)
|
---|
59 | int Bind(int iBuffer);
|
---|
60 | int Release(int iBuffer);
|
---|
61 |
|
---|
62 | void HandleModeSwitch();
|
---|
63 | #endif
|
---|
64 |
|
---|
65 | unsigned int GetSizeInBytes();
|
---|
66 | unsigned int CopyToBuffer(void *ptr, int w=-1, int h=-1);
|
---|
67 |
|
---|
68 | inline int GetNumComponents()
|
---|
69 | { return m_iNComponents; }
|
---|
70 |
|
---|
71 | inline int GetBitsPerComponent()
|
---|
72 | { return m_iBitsPerComponent; }
|
---|
73 |
|
---|
74 | inline int GetWidth()
|
---|
75 | { return m_iWidth; }
|
---|
76 |
|
---|
77 | inline int GetHeight()
|
---|
78 | { return m_iHeight; }
|
---|
79 |
|
---|
80 | inline bool IsSharedContext()
|
---|
81 | { return m_bSharedContext; }
|
---|
82 |
|
---|
83 | #if defined(WIN32)
|
---|
84 | inline bool IsTexture()
|
---|
85 | { return m_bIsTexture; }
|
---|
86 | #endif
|
---|
87 |
|
---|
88 | protected:
|
---|
89 | #if defined(WIN32)
|
---|
90 | HDC m_hDC; ///< Handle to a device context.
|
---|
91 | HGLRC m_hGLRC; ///< Handle to a GL context.
|
---|
92 | HPBUFFERARB m_hPBuffer;///< Handle to a pbuffer.
|
---|
93 |
|
---|
94 | HGLRC m_hOldGLRC;
|
---|
95 | HDC m_hOldDC;
|
---|
96 |
|
---|
97 | std::vector<int> m_pfAttribList;
|
---|
98 | std::vector<int> m_pbAttribList;
|
---|
99 |
|
---|
100 | bool m_bIsTexture;
|
---|
101 | #elif defined(UNIX)
|
---|
102 | Display *m_pDisplay;
|
---|
103 | GLXPbuffer m_glxPbuffer;
|
---|
104 | GLXContext m_glxContext;
|
---|
105 |
|
---|
106 | Display *m_pOldDisplay;
|
---|
107 | GLXPbuffer m_glxOldDrawable;
|
---|
108 | GLXContext m_glxOldContext;
|
---|
109 |
|
---|
110 | std::vector<int> m_pfAttribList;
|
---|
111 | std::vector<int> m_pbAttribList;
|
---|
112 | #elif defined(MACOS)
|
---|
113 | AGLContext m_context;
|
---|
114 | WindowPtr m_window;
|
---|
115 | std::vector<int> m_pfAttribList;
|
---|
116 | #endif
|
---|
117 |
|
---|
118 | int m_iWidth;
|
---|
119 | int m_iHeight;
|
---|
120 | int m_iNComponents;
|
---|
121 | int m_iBitsPerComponent;
|
---|
122 |
|
---|
123 | const char *m_strMode;
|
---|
124 | bool m_bSharedContext;
|
---|
125 | bool m_bShareObjects;
|
---|
126 |
|
---|
127 | private:
|
---|
128 | std::string getStringValue(std::string token);
|
---|
129 | int getIntegerValue(std::string token);
|
---|
130 | #if defined(UNIX) || defined(WIN32)
|
---|
131 | void parseModeString(const char *modeString, std::vector<int> *pfAttribList, std::vector<int> *pbAttribList);
|
---|
132 |
|
---|
133 | bool m_bIsBound;
|
---|
134 | bool m_bIsActive;
|
---|
135 | bool m_bManaged;
|
---|
136 | #endif
|
---|
137 |
|
---|
138 | };
|
---|
139 |
|
---|
140 | #endif
|
---|