diff --git a/include/osg/Drawable b/include/osg/Drawable index 07680a10c..06ed34233 100644 --- a/include/osg/Drawable +++ b/include/osg/Drawable @@ -462,6 +462,9 @@ class SG_EXPORT Drawable : public Object void setMultiTexSupported(bool flag) { _isMultiTexSupported=flag; } bool isMultiTexSupported() const { return _isMultiTexSupported; } + void setOcclusionQuerySupported(bool flag) { _isOcclusionQuerySupported=flag; } + bool isOcclusionQuerySupported() const { return _isOcclusionQuerySupported; } + void glSecondaryColor3ubv(const GLubyte* coord) const; void glSecondaryColor3fv(const GLfloat* coord) const; @@ -486,6 +489,13 @@ class SG_EXPORT Drawable : public Object void glBufferSubData (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid *data) const; void glDeleteBuffers (GLsizei n, const GLuint *buffers) const; + void glGenOcclusionQueries( GLsizei n, GLuint *ids ) const; + void glDeleteOcclusionQueries( GLsizei n, const GLuint *ids ) const; + GLboolean glIsOcclusionQuery( GLuint id ) const; + void glBeginOcclusionQuery( GLuint id ) const; + void glEndOcclusionQuery() const; + void glGetOcclusionQueryiv( GLuint id, GLenum pname, GLint *params ) const; + void glGetOcclusionQueryuiv( GLuint id, GLenum pname, GLuint *params ) const; protected: @@ -508,13 +518,22 @@ class SG_EXPORT Drawable : public Object typedef void (APIENTRY * BufferSubDataProc) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid *data); typedef void (APIENTRY * DeleteBuffersProc) (GLsizei n, const GLuint *buffers); - ~Extensions() {} + typedef void (APIENTRY * GenOcclusionQueriesProc) ( GLsizei n, GLuint *ids ); + typedef void (APIENTRY * DeleteOcclusionQueriesProc) ( GLsizei n, const GLuint *ids ); + typedef GLboolean (APIENTRY * IsOcclusionQueryProc) ( GLuint id ); + typedef void (APIENTRY * BeginOcclusionQueryProc) ( GLuint id ); + typedef void (APIENTRY * EndOcclusionQueryProc) (); + typedef void (APIENTRY * GetOcclusionQueryivProc) ( GLuint id, GLenum pname, GLint *params ); + typedef void (APIENTRY * GetOcclusionQueryuivProc) ( GLuint id, GLenum pname, GLuint *params ); + + ~Extensions() {} bool _isVertexProgramSupported; bool _isSecondaryColorSupported; bool _isFogCoordSupported; bool _isMultiTexSupported; - + bool _isOcclusionQuerySupported; + FogCoordProc _glFogCoordfv; SecondaryColor3ubvProc _glSecondaryColor3ubv; @@ -538,6 +557,14 @@ class SG_EXPORT Drawable : public Object BufferDataProc _glBufferData; BufferSubDataProc _glBufferSubData; DeleteBuffersProc _glDeleteBuffers; + + GenOcclusionQueriesProc _glGenOcclusionQueries; + DeleteOcclusionQueriesProc _glDeleteOcclusionQueries; + IsOcclusionQueryProc _glIsOcclusionQuery; + BeginOcclusionQueryProc _glBeginOcclusionQuery; + EndOcclusionQueryProc _glEndOcclusionQuery; + GetOcclusionQueryivProc _glGetOcclusionQueryiv; + GetOcclusionQueryuivProc _glGetOcclusionQueryuiv; }; /** Function to call to get the extension of a specified context. diff --git a/src/osg/Drawable.cpp b/src/osg/Drawable.cpp index bea82343c..2716fde7c 100644 --- a/src/osg/Drawable.cpp +++ b/src/osg/Drawable.cpp @@ -470,6 +470,7 @@ Drawable::Extensions::Extensions(const Extensions& rhs): _isSecondaryColorSupported = rhs._isSecondaryColorSupported; _isFogCoordSupported = rhs._isFogCoordSupported; _isMultiTexSupported = rhs._isMultiTexSupported; + _isOcclusionQuerySupported = rhs._isOcclusionQuerySupported; _glFogCoordfv = rhs._glFogCoordfv; _glSecondaryColor3ubv = rhs._glSecondaryColor3ubv; _glSecondaryColor3fv = rhs._glSecondaryColor3fv; @@ -489,6 +490,13 @@ Drawable::Extensions::Extensions(const Extensions& rhs): _glBufferData = rhs._glBufferData; _glBufferSubData = rhs._glBufferSubData; _glDeleteBuffers = rhs._glDeleteBuffers; + _glGenOcclusionQueries = rhs._glGenOcclusionQueries; + _glDeleteOcclusionQueries = rhs._glDeleteOcclusionQueries; + _glIsOcclusionQuery = rhs._glIsOcclusionQuery; + _glBeginOcclusionQuery = rhs._glBeginOcclusionQuery; + _glEndOcclusionQuery = rhs._glEndOcclusionQuery; + _glGetOcclusionQueryiv = rhs._glGetOcclusionQueryiv; + _glGetOcclusionQueryuiv = rhs._glGetOcclusionQueryuiv; } @@ -498,6 +506,7 @@ void Drawable::Extensions::lowestCommonDenominator(const Extensions& rhs) if (!rhs._isSecondaryColorSupported) _isSecondaryColorSupported = false; if (!rhs._isFogCoordSupported) _isFogCoordSupported = false; if (!rhs._isMultiTexSupported) _isMultiTexSupported = false; + if (!rhs._isOcclusionQuerySupported) _isOcclusionQuerySupported = false; if (!rhs._glFogCoordfv) _glFogCoordfv = 0; if (!rhs._glSecondaryColor3ubv) _glSecondaryColor3ubv = 0; @@ -520,6 +529,14 @@ void Drawable::Extensions::lowestCommonDenominator(const Extensions& rhs) if (!rhs._glBufferData) _glBufferData = 0; if (!rhs._glBufferSubData) _glBufferSubData = 0; if (!rhs._glDeleteBuffers) _glDeleteBuffers = 0; + + if (!rhs._glGenOcclusionQueries) _glGenOcclusionQueries = 0; + if (!rhs._glDeleteOcclusionQueries) _glDeleteOcclusionQueries = 0; + if (!rhs._glIsOcclusionQuery) _glIsOcclusionQuery = 0; + if (!rhs._glBeginOcclusionQuery) _glBeginOcclusionQuery = 0; + if (!rhs._glEndOcclusionQuery) _glEndOcclusionQuery = 0; + if (!rhs._glGetOcclusionQueryiv) _glGetOcclusionQueryiv = 0; + if (!rhs._glGetOcclusionQueryuiv) _glGetOcclusionQueryuiv = 0; } void Drawable::Extensions::setupGLExtenions() @@ -528,6 +545,7 @@ void Drawable::Extensions::setupGLExtenions() _isSecondaryColorSupported = isGLExtensionSupported("GL_EXT_secondary_color"); _isFogCoordSupported = isGLExtensionSupported("GL_EXT_fog_coord"); _isMultiTexSupported = isGLExtensionSupported("GL_ARB_multitexture"); + _isOcclusionQuerySupported = osg::isGLExtensionSupported( "GL_NV_occlusion_query" ); _glFogCoordfv = ((FogCoordProc)osg::getGLExtensionFuncPtr("glFogCoordfv","glFogCoordfvEXT")); _glSecondaryColor3ubv = ((SecondaryColor3ubvProc)osg::getGLExtensionFuncPtr("glSecondaryColor3ubv","glSecondaryColor3ubvEXT")); @@ -551,7 +569,15 @@ void Drawable::Extensions::setupGLExtenions() _glBufferSubData = ((BufferSubDataProc)osg::getGLExtensionFuncPtr("glBufferSubData","glBufferSubDataARB")); _glDeleteBuffers = ((DeleteBuffersProc)osg::getGLExtensionFuncPtr("glDeleteBuffers","glDeleteBuffersARB")); + _glGenOcclusionQueries = ((GenOcclusionQueriesProc)osg::getGLExtensionFuncPtr("glGenOcclusionQueries","glGenOcclusionQueriesNV")); + _glDeleteOcclusionQueries = ((DeleteOcclusionQueriesProc)osg::getGLExtensionFuncPtr("glDeleteOcclusionQueries","glDeleteOcclusionQueriesNV")); + _glIsOcclusionQuery = ((IsOcclusionQueryProc)osg::getGLExtensionFuncPtr("glIsOcclusionQuery","_glIsOcclusionQueryNV")); + _glBeginOcclusionQuery = ((BeginOcclusionQueryProc)osg::getGLExtensionFuncPtr("glBeginOcclusionQuery","glBeginOcclusionQueryNV")); + _glEndOcclusionQuery = ((EndOcclusionQueryProc)osg::getGLExtensionFuncPtr("glEndOcclusionQuery","glEndOcclusionQueryNV")); + _glGetOcclusionQueryiv = ((GetOcclusionQueryivProc)osg::getGLExtensionFuncPtr("glGetOcclusionQueryiv","glGetOcclusionQueryivNV")); + _glGetOcclusionQueryuiv = ((GetOcclusionQueryuivProc)osg::getGLExtensionFuncPtr("glGetOcclusionQueryuiv","glGetOcclusionQueryuivNV")); } + void Drawable::Extensions::glFogCoordfv(const GLfloat* coord) const { if (_glFogCoordfv) @@ -779,3 +805,89 @@ void Drawable::Extensions::glDeleteBuffers(GLsizei n, const GLuint *buffers) con notify(WARN)<<"Error: glBufferData not supported by OpenGL driver"<