diff --git a/examples/osgcubemap/osgcubemap.cpp b/examples/osgcubemap/osgcubemap.cpp index 123c3c540..47c3dd3cb 100644 --- a/examples/osgcubemap/osgcubemap.cpp +++ b/examples/osgcubemap/osgcubemap.cpp @@ -43,21 +43,21 @@ void create_specular_highlights(osg::Node *node) { osg::StateSet *ss = node->getOrCreateStateSet(); - + // create and setup the texture object osg::TextureCubeMap *tcm = new osg::TextureCubeMap; tcm->setWrap(osg::Texture::WRAP_S, osg::Texture::CLAMP); tcm->setWrap(osg::Texture::WRAP_T, osg::Texture::CLAMP); tcm->setWrap(osg::Texture::WRAP_R, osg::Texture::CLAMP); tcm->setFilter(osg::Texture::MIN_FILTER, osg::Texture::LINEAR_MIPMAP_LINEAR); - tcm->setFilter(osg::Texture::MAG_FILTER, osg::Texture::LINEAR); + tcm->setFilter(osg::Texture::MAG_FILTER, osg::Texture::LINEAR); // generate the six highlight map images (light direction = [1, 1, -1]) osgUtil::HighlightMapGenerator *mapgen = new osgUtil::HighlightMapGenerator( osg::Vec3(1, 1, -1), // light direction osg::Vec4(1, 0.9f, 0.8f, 1), // light color 8); // specular exponent - + mapgen->generateMap(); // assign the six images to the texture object @@ -77,7 +77,7 @@ void create_specular_highlights(osg::Node *node) ss->setTextureAttributeAndModes(0, tg, osg::StateAttribute::OVERRIDE | osg::StateAttribute::ON); // use TexEnvCombine to add the highlights to the original lighting - osg::TexEnvCombine *te = new osg::TexEnvCombine; + osg::TexEnvCombine *te = new osg::TexEnvCombine; te->setCombine_RGB(osg::TexEnvCombine::ADD); te->setSource0_RGB(osg::TexEnvCombine::TEXTURE); te->setOperand0_RGB(osg::TexEnvCombine::SRC_COLOR); @@ -93,7 +93,7 @@ int main(int argc, char *argv[]) // construct the viewer. osgViewer::Viewer viewer; - + // load the nodes from the commandline arguments. osg::Node* rootnode = osgDB::readNodeFiles(arguments); @@ -108,32 +108,16 @@ int main(int argc, char *argv[]) // create specular highlights create_specular_highlights(rootnode); - + // run optimization over the scene graph osgUtil::Optimizer optimzer; optimzer.optimize(rootnode); - + // add a viewport to the viewer and attach the scene graph. viewer.setSceneData(rootnode); - + // create the windows and run the threads. viewer.realize(); - // now check to see if texture cube map is supported. - for(unsigned int contextID = 0; - contextIDgetMaxNumberOfGraphicsContexts(); - ++contextID) - { - osg::TextureCubeMap::Extensions* tcmExt = osg::TextureCubeMap::getExtensions(contextID,false); - if (tcmExt) - { - if (!tcmExt->isCubeMapSupported()) - { - std::cout<<"Warning: texture_cube_map not supported by OpenGL drivers, unable to run application."<*rhs.*/ virtual int compare(const StateAttribute& sa) const; - + inline void setMask(unsigned int mask, unsigned int maskNumber = 0u ) { _sampleMask[maskNumber] = mask; } - + inline unsigned int getMask(unsigned int maskNumber = 0u) const { return _sampleMask[maskNumber]; } virtual void apply(State& state) const; - public: - - /** Extensions class which encapsulates the querying of extensions and - * associated function pointers, and provide convenience wrappers to - * check for the extensions or use the associated functions. - */ - class OSG_EXPORT Extensions : public osg::Referenced - { - public: - Extensions(unsigned int contextID); - - Extensions(const Extensions& rhs); - - void lowestCommonDenominator(const Extensions& rhs); - - void setupGLExtensions(unsigned int contextID); - - bool isOpenGL32upported() const { return _isOpenGL32upported; } - bool isTextureMultisampleSupported() const { return _isTextureMultisampleSupported; } - bool isSampleMaskiSupported() const { return _isSampleMaskiSupported; } - - void glSampleMaski(GLuint maskNumber, GLbitfield mask) const; - - protected: - - ~Extensions() {} - - bool _isOpenGL32upported; - bool _isTextureMultisampleSupported; - bool _isSampleMaskiSupported; - - typedef void (GL_APIENTRY * SampleMaski) ( GLuint maskNumber, GLbitfield mask ); - - SampleMaski _glSampleMaski; - }; - - static Extensions* getExtensions(unsigned int contextID,bool createIfNotInitalized); - - static void setExtensions(unsigned int contextID,Extensions* extensions); - - protected: virtual ~SampleMaski(); diff --git a/src/osg/GL2Extensions.cpp b/src/osg/GL2Extensions.cpp index 4ca7aa787..6d877e52a 100644 --- a/src/osg/GL2Extensions.cpp +++ b/src/osg/GL2Extensions.cpp @@ -388,6 +388,15 @@ GL2Extensions::GL2Extensions(unsigned int contextID) setGLExtensionFuncPtr(glQueryCounter, "glQueryCounter"); setGLExtensionFuncPtr(glGetInteger64v, "glGetInteger64v"); + + // SampleMaski functionality + isTextureMultisampleSupported = isGLExtensionSupported(contextID, "GL_ARB_texture_multisample"); + isOpenGL32upported = getGLVersionNumber() >= 3.2; + + // function pointers + setGLExtensionFuncPtr(glSampleMaski, "glSampleMaski"); + // protect against buggy drivers (maybe not necessary) + isSampleMaskiSupported = glSampleMaski!=0; } diff --git a/src/osg/SampleMaski.cpp b/src/osg/SampleMaski.cpp index cc40292cc..dd471d801 100644 --- a/src/osg/SampleMaski.cpp +++ b/src/osg/SampleMaski.cpp @@ -51,93 +51,16 @@ int SampleMaski::compare(const StateAttribute& sa) const void SampleMaski::apply(State& state) const { // get "per-context" extensions - const unsigned int contextID = state.getContextID(); - const Extensions* extensions = getExtensions(contextID,true); - - if ( (extensions->isTextureMultisampleSupported()) || (extensions->isOpenGL32upported()) || (extensions->isSampleMaskiSupported()) ) + const GL2Extensions* extensions = state.get(); + + if ( (extensions->isTextureMultisampleSupported) || (extensions->isOpenGL32upported) || (extensions->isSampleMaskiSupported) ) { extensions->glSampleMaski(0u, _sampleMask[0u]); -//For now we use only 32-bit Sample mask -// extensions->glSampleMaski(1u, _sampleMask[1u]); + //For now we use only 32-bit Sample mask + // extensions->glSampleMaski(1u, _sampleMask[1u]); return; } - OSG_WARN << "SampleMaski failed as the required graphics capabilities were\n" - " not found (contextID " << contextID << "). OpenGL 3.2 or \n" - " ARB_texture_multisample extension is required." << std::endl; + OSG_WARN << "SampleMaski failed as the required graphics capabilities were not found. \n" + "OpenGL 3.2 or ARB_texture_multisample extension is required." << std::endl; } - - -typedef buffered_value< ref_ptr > BufferedExtensions; -static BufferedExtensions s_extensions; - -SampleMaski::Extensions* SampleMaski::getExtensions(unsigned int contextID,bool createIfNotInitalized) -{ - if (!s_extensions[contextID] && createIfNotInitalized) s_extensions[contextID] = new Extensions(contextID); - return s_extensions[contextID].get(); -} - -void SampleMaski::setExtensions(unsigned int contextID,Extensions* extensions) -{ - s_extensions[contextID] = extensions; -} - -SampleMaski::Extensions::Extensions(unsigned int contextID) -{ - setupGLExtensions(contextID); -} - -SampleMaski::Extensions::Extensions(const Extensions& rhs): - Referenced() -{ - _isTextureMultisampleSupported = rhs._isTextureMultisampleSupported; - _isOpenGL32upported = rhs._isOpenGL32upported; - _isSampleMaskiSupported = rhs._isSampleMaskiSupported; - _glSampleMaski = rhs._glSampleMaski; -} - - -void SampleMaski::Extensions::lowestCommonDenominator(const Extensions& rhs) -{ - if (!rhs._isTextureMultisampleSupported) _isTextureMultisampleSupported = false; - if (!rhs._isOpenGL32upported) _isOpenGL32upported = false; - if (!rhs._isSampleMaskiSupported) _isSampleMaskiSupported = false; - - if (!rhs._glSampleMaski) _glSampleMaski = NULL; -} - -void SampleMaski::Extensions::setupGLExtensions(unsigned int contextID) -{ - // extension support - _isTextureMultisampleSupported = isGLExtensionSupported(contextID, "GL_ARB_texture_multisample"); - _isOpenGL32upported = getGLVersionNumber() >= 3.2; - - // function pointers - setGLExtensionFuncPtr(_glSampleMaski, "glSampleMaski"); - - - // protect against buggy drivers (maybe not necessary) - if (!_glSampleMaski) _isSampleMaskiSupported = false; - - // notify - if( _isOpenGL32upported ) - { - OSG_INFO << "SampleMaski is going to use OpenGL 3.2 API (contextID " << contextID << ")." << std::endl; - } - else if( _isTextureMultisampleSupported ) - { - OSG_INFO << "SampleMaski is going to use GL_ARB_texture_multisample extension (contextID " << contextID << ")." << std::endl; - } - else - { - OSG_INFO << "SampleMaski did not found required graphics capabilities\n" - " (contextID " << contextID << "). OpenGL 3.2 or \n" - " GL_ARB_texture_multisample extension is required." << std::endl; - } -} - -void SampleMaski::Extensions::glSampleMaski(GLuint maskNumber, GLbitfield mask) const -{ - _glSampleMaski(maskNumber, mask); -} -