From b9b013e15bca55104c23046bda6728dff9649eb5 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Wed, 7 Aug 2002 15:52:24 +0000 Subject: [PATCH] Changed the support for anisotropic filtering in osg::Texture so that it is now controlled via the setMaxAnisotropy(float) method, and is set up independently for the mag filter mode, which it previously was done. --- include/osg/Texture | 15 ++++- src/Demos/osgbillboard/osgbillboard.cpp | 4 +- src/Demos/osgtexture/osgtexture.cpp | 4 +- src/osg/Texture.cpp | 76 ++++++++++++------------- src/osgPlugins/flt/ReaderWriterATTR.cpp | 5 +- src/osgPlugins/osg/Texture.cpp | 13 ++++- src/osgUtil/Optimizer.cpp | 2 - 7 files changed, 69 insertions(+), 50 deletions(-) diff --git a/include/osg/Texture b/include/osg/Texture index 4d597f68f..eb1ebfe71 100644 --- a/include/osg/Texture +++ b/include/osg/Texture @@ -165,7 +165,6 @@ class SG_EXPORT Texture : public StateAttribute NEAREST = GL_NEAREST, NEAREST_MIPMAP_LINEAR = GL_NEAREST_MIPMAP_LINEAR, NEAREST_MIPMAP_NEAREST = GL_NEAREST_MIPMAP_NEAREST, - ANISOTROPIC = GL_TEXTURE_MAX_ANISOTROPY_EXT }; @@ -175,6 +174,15 @@ class SG_EXPORT Texture : public StateAttribute /** Get the texture filter mode.*/ const FilterMode getFilter(const FilterParameter which) const; + /** Set the maximum anisotropy value, default value is 1.0 for + * no anisotropic filtering. If hardware does not support anisotropic + * filtering then normal filtering is used, equivilant to a max anisotropy value of 1.0. + * valid range is 1.0f upwards. The maximum value depends on the graphics + * system being used.*/ + inline void setMaxAnisotropy(float anis); + + /** Get the maximum anisotropy value.*/ + inline float getMaxAnisotropy() const { return _maxAnisotropy; } enum InternalFormatMode { USE_IMAGE_DATA_FORMAT, @@ -361,8 +369,9 @@ class SG_EXPORT Texture : public StateAttribute WrapMode _wrap_t; WrapMode _wrap_r; - FilterMode _min_filter; - FilterMode _mag_filter; + FilterMode _min_filter; + FilterMode _mag_filter; + float _maxAnisotropy; // true if apply tex parameters required. mutable bool _texParamtersDirty; diff --git a/src/Demos/osgbillboard/osgbillboard.cpp b/src/Demos/osgbillboard/osgbillboard.cpp index ce72322cc..1d867e126 100644 --- a/src/Demos/osgbillboard/osgbillboard.cpp +++ b/src/Demos/osgbillboard/osgbillboard.cpp @@ -180,8 +180,10 @@ osg::Node* createLayer(const osg::Vec3& offset,osg::Image* image,osg::Node* geom // set up anistropic filtering. texture->setFilter(osg::Texture::MIN_FILTER,osg::Texture::LINEAR_MIPMAP_LINEAR); - texture->setFilter(osg::Texture::MAG_FILTER,osg::Texture::ANISOTROPIC); + texture->setFilter(osg::Texture::MAG_FILTER,osg::Texture::LINEAR); + texture->setMaxAnisotropy(2.0f); + // add the transform node to root group node. top_transform->addChild(createTexturedItem(local_offset,texture,geometry)); diff --git a/src/Demos/osgtexture/osgtexture.cpp b/src/Demos/osgtexture/osgtexture.cpp index bca42f465..ae4539e40 100644 --- a/src/Demos/osgtexture/osgtexture.cpp +++ b/src/Demos/osgtexture/osgtexture.cpp @@ -35,7 +35,6 @@ class TextureCallback : public osg::NodeCallback _filterRange.push_back(osg::Texture::NEAREST); _filterRange.push_back(osg::Texture::NEAREST_MIPMAP_LINEAR); _filterRange.push_back(osg::Texture::NEAREST_MIPMAP_NEAREST); - _filterRange.push_back(osg::Texture::ANISOTROPIC); _currPos = 0; _prevTime = 0.0; } @@ -240,7 +239,8 @@ osg::Node* createLayer(const osg::Vec3& offset,osg::Image* image,osg::Node* geom // set up anistropic filtering. texture->setFilter(osg::Texture::MIN_FILTER,osg::Texture::LINEAR_MIPMAP_LINEAR); - texture->setFilter(osg::Texture::MAG_FILTER,osg::Texture::ANISOTROPIC); + texture->setFilter(osg::Texture::MAG_FILTER,osg::Texture::LINEAR); + texture->setMaxAnisotropy(2.0f); // add the transform node to root group node. top_transform->addChild(createTexturedItem(local_offset,texture,geometry)); diff --git a/src/osg/Texture.cpp b/src/osg/Texture.cpp index e9a7902bd..af50c0f07 100644 --- a/src/osg/Texture.cpp +++ b/src/osg/Texture.cpp @@ -19,26 +19,27 @@ using namespace osg; Texture::DeletedTextureObjectCache Texture::s_deletedTextureObjectCache; Texture::Texture(): - _unrefImageAfterApply(false), - _target(GL_TEXTURE_2D), - _wrap_s(CLAMP), - _wrap_t(CLAMP), - _wrap_r(CLAMP), - _min_filter(LINEAR_MIPMAP_LINEAR), // trilinear - _mag_filter(LINEAR), - _texParamtersDirty(true), - _internalFormatMode(USE_IMAGE_DATA_FORMAT), - _internalFormatValue(0), - _borderColor(0.0, 0.0, 0.0, 0.0), - _textureWidth(0), - _textureHeight(0), - _subloadMode(OFF), - _subloadTextureOffsetX(0), - _subloadTextureOffsetY(0), - _subloadImageOffsetX(0), - _subloadImageOffsetY(0), - _subloadImageWidth(0), - _subloadImageHeight(0) + _unrefImageAfterApply(false), + _target(GL_TEXTURE_2D), + _wrap_s(CLAMP), + _wrap_t(CLAMP), + _wrap_r(CLAMP), + _min_filter(LINEAR_MIPMAP_LINEAR), // trilinear + _mag_filter(LINEAR), + _maxAnisotropy(1.0f), + _texParamtersDirty(true), + _internalFormatMode(USE_IMAGE_DATA_FORMAT), + _internalFormatValue(0), + _borderColor(0.0, 0.0, 0.0, 0.0), + _textureWidth(0), + _textureHeight(0), + _subloadMode(OFF), + _subloadTextureOffsetX(0), + _subloadTextureOffsetY(0), + _subloadImageOffsetX(0), + _subloadImageOffsetY(0), + _subloadImageWidth(0), + _subloadImageHeight(0) { _handleList.resize(DisplaySettings::instance()->getMaxNumberOfGraphicsContexts(),0); _modifiedTag.resize(DisplaySettings::instance()->getMaxNumberOfGraphicsContexts(),0); @@ -57,6 +58,7 @@ Texture::Texture(const Texture& text,const CopyOp& copyop): _wrap_r(text._wrap_r), _min_filter(text._min_filter), _mag_filter(text._mag_filter), + _maxAnisotropy(text._maxAnisotropy), _texParamtersDirty(false), _internalFormatMode(text._internalFormatMode), _internalFormatValue(text._internalFormatValue), @@ -191,6 +193,15 @@ const Texture::FilterMode Texture::getFilter(const FilterParameter which) const } } +void Texture::setMaxAnisotropy(float anis) +{ + if (_maxAnisotropy!=anis) + { + _maxAnisotropy = anis; + _texParamtersDirty = true; + } +} + /** Force a recompile on next apply() of associated OpenGL texture objects.*/ void Texture::dirtyTextureObject() { @@ -207,11 +218,6 @@ void Texture::dirtyTextureObject() void Texture::apply(State& state) const { -// Texture* texture = const_cast(this); -// texture->_min_filter = LINEAR_MIPMAP_LINEAR; -// texture->_mag_filter = ANISOTROPIC; - - // get the contextID (user defined ID of 0 upwards) for the // current OpenGL context. const uint contextID = state.getContextID(); @@ -314,13 +320,9 @@ void Texture::applyTexParameters(GLenum target, State&) const glTexParameteri( target, GL_TEXTURE_WRAP_T, wt ); glTexParameteri( target, GL_TEXTURE_MIN_FILTER, _min_filter); + glTexParameteri( target, GL_TEXTURE_MAG_FILTER, _mag_filter); - if (s_borderClampSupported) - { - glTexParameterfv(target, GL_TEXTURE_BORDER_COLOR, _borderColor.ptr()); - } - - if (_mag_filter == ANISOTROPIC) + if (_maxAnisotropy>1.0f) { // check for support for anisotropic filter, // note since this is static varible it is intialised @@ -333,18 +335,16 @@ void Texture::applyTexParameters(GLenum target, State&) const { // note, GL_TEXTURE_MAX_ANISOTROPY_EXT will either be defined // by gl.h (or via glext.h) or by include/osg/Texture. - glTexParameterf(target, GL_TEXTURE_MAX_ANISOTROPY_EXT, 2.f); - } - else - { - glTexParameteri(target, GL_TEXTURE_MAG_FILTER, LINEAR); + glTexParameterf(target, GL_TEXTURE_MAX_ANISOTROPY_EXT, _maxAnisotropy); } } - else + + if (s_borderClampSupported) { - glTexParameteri( _target, GL_TEXTURE_MAG_FILTER, _mag_filter); + glTexParameterfv(target, GL_TEXTURE_BORDER_COLOR, _borderColor.ptr()); } + _texParamtersDirty=false; } diff --git a/src/osgPlugins/flt/ReaderWriterATTR.cpp b/src/osgPlugins/flt/ReaderWriterATTR.cpp index efe253296..7b8125743 100644 --- a/src/osgPlugins/flt/ReaderWriterATTR.cpp +++ b/src/osgPlugins/flt/ReaderWriterATTR.cpp @@ -652,12 +652,13 @@ StateSet* Attr::createOsgStateSet() case MAG_FILTER_BICUBIC: case MAG_FILTER_BICUBIC_GEQUAL: case MAG_FILTER_BICUBIC_LEQUAL: - osgTexture->setFilter(osg::Texture::MAG_FILTER, Texture::ANISOTROPIC); + osgTexture->setFilter(osg::Texture::MAG_FILTER, Texture::LINEAR); + osgTexture->setMaxAnisotropy(2.0f); break; // case MAG_FILTER_ADD_DETAIL: // case MAG_FILTER_MODULATE_DETAIL: -// osgTexture->setFilter(osg::Texture::MAG_FILTER, Texture::ANISOTROPIC); +// osgTexture->setFilter(osg::Texture::MAG_FILTER, Texture::LINEAR); // break; } diff --git a/src/osgPlugins/osg/Texture.cpp b/src/osgPlugins/osg/Texture.cpp index 1667c32a2..96b587756 100644 --- a/src/osgPlugins/osg/Texture.cpp +++ b/src/osgPlugins/osg/Texture.cpp @@ -92,6 +92,15 @@ bool Texture_readLocalData(Object& obj, Input& fr) iteratorAdvanced = true; } + if (fr.matchSequence("maxAnisotropy %f")) + { + float anis=1.0f; + fr[1].getFloat(anis); + texture.setMaxAnisotropy(anis); + fr +=2 ; + iteratorAdvanced = true; + } + Texture::InternalFormatMode mode; if (fr[0].matchWord("internalFormatMode") && Texture_matchInternalFormatModeStr(fr[1].getStr(),mode)) { @@ -198,6 +207,7 @@ bool Texture_writeLocalData(const Object& obj, Output& fw) fw.indent() << "min_filter " << Texture_getFilterStr(texture.getFilter(Texture::MIN_FILTER)) << std::endl; fw.indent() << "mag_filter " << Texture_getFilterStr(texture.getFilter(Texture::MAG_FILTER)) << std::endl; + fw.indent() << "maxAnisotropy " << texture.getMaxAnisotropy() << std::endl; fw.indent() << "internalFormatMode " << Texture_getInternalFormatModeStr(texture.getInternalFormatMode()) << std::endl; @@ -264,7 +274,7 @@ bool Texture_matchFilterStr(const char* str,Texture::FilterMode& filter) else if (strcmp(str,"LINEAR_MIPMAP_NEAREST")==0) filter = Texture::LINEAR_MIPMAP_NEAREST; else if (strcmp(str,"NEAREST_MIPMAP_LINEAR")==0) filter = Texture::NEAREST_MIPMAP_LINEAR; else if (strcmp(str,"LINEAR_MIPMAP_LINEAR")==0) filter = Texture::LINEAR_MIPMAP_LINEAR; - else if (strcmp(str,"ANISOTROPIC")==0) filter = Texture::ANISOTROPIC; + else if (strcmp(str,"ANISOTROPIC")==0) filter = Texture::LINEAR; else return false; return true; } @@ -280,7 +290,6 @@ const char* Texture_getFilterStr(Texture::FilterMode filter) case(Texture::LINEAR_MIPMAP_NEAREST): return "LINEAR_MIPMAP_NEAREST"; case(Texture::NEAREST_MIPMAP_LINEAR): return "NEAREST_MIPMAP_LINEAR"; case(Texture::LINEAR_MIPMAP_LINEAR): return "LINEAR_MIPMAP_LINEAR"; - case(Texture::ANISOTROPIC): return "ANISOTROPIC"; } return ""; } diff --git a/src/osgUtil/Optimizer.cpp b/src/osgUtil/Optimizer.cpp index 4673b4acf..b89911937 100644 --- a/src/osgUtil/Optimizer.cpp +++ b/src/osgUtil/Optimizer.cpp @@ -21,8 +21,6 @@ using namespace osgUtil; void Optimizer::optimize(osg::Node* node, unsigned int options) { - - return; if (options & COMBINE_ADJACENT_LODS) {