Files
bullet3/Extras/GPUphysics/fboSupport.h
2006-10-01 03:45:08 +00:00

102 lines
2.4 KiB
C++

GLuint makeTextureTarget ( GLuint textureHandle ) ;
void renderTo2DTexture ( GLuint fboHandle ) ;
void renderToFrameBuffer () ;
// #define NEED_STENCIL_BUFFER 1
// #define NEED_DEPTH_BUFFER 1
enum fboDataType
{
#ifndef GL_BYTE
FBO_BYTE = 0x1400,
FBO_UNSIGNED_BYTE = 0x1401,
FBO_SHORT = 0x1402,
FBO_UNSIGNED_SHORT = 0x1403,
FBO_INT = 0x1404,
FBO_UNSIGNED_INT = 0x1405,
FBO_FLOAT = 0x1406,
FBO_DOUBLE = 0x140A,
#else
FBO_BYTE = GL_BYTE,
FBO_UNSIGNED_BYTE = GL_UNSIGNED_BYTE,
FBO_SHORT = GL_SHORT,
FBO_UNSIGNED_SHORT = GL_UNSIGNED_SHORT,
FBO_INT = GL_INT,
FBO_UNSIGNED_INT = GL_UNSIGNED_INT,
FBO_FLOAT = GL_FLOAT,
FBO_DOUBLE = GL_DOUBLE,
#endif
#ifndef GL_HALF_FLOAT_NV
FBO_HALF = 0x140B
#else
FBO_HALF = GL_HALF_FLOAT_NV
#endif
} ;
class FrameBufferObject
{
int width ;
int height ;
int ncomps ;
fboDataType type ;
GLenum format ;
GLenum iformat ;
GLuint textureHandle ;
GLuint fboHandle ;
void fillTexture ( void *data ) ;
void fetchTexture ( void *data ) ;
public:
FrameBufferObject ( int _width, /* Must be a power of two! */
int _height, /* Must be a power of two! */
int _numComponents, /* 1, 2, 3 or 4 only! */
fboDataType _type ) ;
void makeDestination ()
{
#ifndef NEED_DEPTH_BUFFER
glDepthMask ( 0 ) ;
#endif
#ifndef NEED_STENCIL_BUFFER
glStencilMask ( 0 ) ;
#endif
glBindFramebufferEXT ( GL_FRAMEBUFFER_EXT, fboHandle ) ;
}
void use ( int texture_unit )
{
glActiveTexture ( GL_TEXTURE0 + texture_unit ) ;
glBindTexture ( GL_TEXTURE_2D, textureHandle ) ;
}
void prepare ( bool clear = false ) ;
void fill () ;
void paint ( bool clear = false ) { prepare ( clear ) ; fill () ; }
void fillTexture ( float *data ) ;
void fillTexture ( unsigned short *data ) ;
void fillTexture ( unsigned char *data ) ;
void fetchTexture ( float *data ) ;
void fetchTexture ( unsigned short *data ) ;
void fetchTexture ( unsigned char *data ) ;
} ;
inline void restoreFrameBuffer ()
{
glBindFramebufferEXT ( GL_FRAMEBUFFER_EXT, 0 ) ;
#ifndef NEED_DEPTH_BUFFER
glDepthMask ( 1 ) ;
#endif
#ifndef NEED_STENCIL_BUFFER
glStencilMask ( 1 ) ;
#endif
}