diff --git a/include/osg/PolygonOffset b/include/osg/PolygonOffset index 6801b691c..5ffdfe9dc 100644 --- a/include/osg/PolygonOffset +++ b/include/osg/PolygonOffset @@ -65,6 +65,19 @@ class OSG_EXPORT PolygonOffset : public StateAttribute virtual void apply(State& state) const; + + static void setFactorMultiplier(float multiplier); + static float getFactorMultiplier(); + + static void setUnitMultiplier(float multiplier); + static float getUnitMultiplier(); + + static bool areUnitAndMultipliersSet(); + + /** Checks with the OpenGL driver to try and pick multiplier approrpriate for the hardware. + note, requires a valid graphics context to be current. */ + static void setFactorAndUnitMultipliersUsingBestGuessForDriver(); + protected : virtual ~PolygonOffset(); diff --git a/src/osg/PolygonOffset.cpp b/src/osg/PolygonOffset.cpp index 61d7414f0..cd5c17d32 100644 --- a/src/osg/PolygonOffset.cpp +++ b/src/osg/PolygonOffset.cpp @@ -12,9 +12,49 @@ */ #include #include +#include using namespace osg; +static float s_FactorMultipler = 1.0f; +static float s_UnitMultipler = 1.0f; +static bool s_MultiplerSet = false; + +void PolygonOffset::setFactorMultiplier(float multiplier) +{ + s_MultiplerSet = true; + s_FactorMultipler = multiplier; +} + +float PolygonOffset::getFactorMultiplier() +{ + return s_FactorMultipler; +} + +void PolygonOffset::setUnitMultiplier(float multiplier) +{ + s_MultiplerSet = true; + s_UnitMultipler = multiplier; +} + +float PolygonOffset::getUnitMultiplier() +{ + return s_UnitMultipler; +} + +bool PolygonOffset::areUnitAndMultipliersSet() +{ + return s_MultiplerSet; +} + + +void PolygonOffset::setFactorAndUnitMultipliersUsingBestGuessForDriver() +{ + s_MultiplerSet = true; + // osg::notify(osg::NOTICE)<<"PolygonOffset::setFactorAndUnitMultipliersUsingBestGuessForDriver()"< #include #include #include #include +#include + #include + #include #include "DefaultFont.h" @@ -1446,6 +1448,11 @@ void Text::drawImplementation(osg::State& state) const if(_backdropType != NONE) { + if (!osg::PolygonOffset::areUnitAndMultipliersSet()) + { + osg::PolygonOffset::setFactorAndUnitMultipliersUsingBestGuessForDriver(); + } + // Do I really need to do this for glPolygonOffset? glPushAttrib(GL_POLYGON_OFFSET_FILL); glEnable(GL_POLYGON_OFFSET_FILL); @@ -1486,12 +1493,13 @@ void Text::drawImplementation(osg::State& state) const if (!transformedBackdropCoords.empty()) { state.setVertexPointer( 3, GL_FLOAT, 0, &(transformedBackdropCoords.front())); - glPolygonOffset(1.0f, 2.0f * (max_backdrop_index-backdrop_index) ); + glPolygonOffset(2.0f * osg::PolygonOffset::getFactorMultiplier(), + 2.0f * osg::PolygonOffset::getUnitMultiplier() * (max_backdrop_index-backdrop_index) ); glDrawArrays(GL_QUADS,0,transformedBackdropCoords.size()); } } - glPolygonOffset(0,0); + glPolygonOffset(0.0f,0.0f); } // end of backdrop text