1 /* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
2  *
3  * This library is open source and may be redistributed and/or modified under
4  * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
5  * (at your option) any later version.  The full license is in LICENSE file
6  * included with this distribution, and on the openscenegraph.org website.
7  *
8  * This library is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11  * OpenSceneGraph Public License for more details.
12 */
13 #include <string.h>
14 
15 #include <osg/GL>
16 #include <osg/PolygonOffset>
17 #include <osg/Notify>
18 
19 using namespace osg;
20 
21 static float s_FactorMultipler = 1.0f;
22 static float s_UnitsMultipler = 1.0f;
23 static bool s_MultiplerSet = false;
24 
setFactorMultiplier(float multiplier)25 void PolygonOffset::setFactorMultiplier(float multiplier)
26 {
27     s_MultiplerSet = true;
28     s_FactorMultipler = multiplier;
29 }
30 
getFactorMultiplier()31 float PolygonOffset::getFactorMultiplier()
32 {
33     return s_FactorMultipler;
34 }
35 
setUnitsMultiplier(float multiplier)36 void PolygonOffset::setUnitsMultiplier(float multiplier)
37 {
38     s_MultiplerSet = true;
39     s_UnitsMultipler = multiplier;
40 }
41 
getUnitsMultiplier()42 float PolygonOffset::getUnitsMultiplier()
43 {
44     return s_UnitsMultipler;
45 }
46 
areFactorAndUnitsMultipliersSet()47 bool PolygonOffset::areFactorAndUnitsMultipliersSet()
48 {
49     return s_MultiplerSet;
50 }
51 
52 
setFactorAndUnitsMultipliersUsingBestGuessForDriver()53 void PolygonOffset::setFactorAndUnitsMultipliersUsingBestGuessForDriver()
54 {
55     s_MultiplerSet = true;
56     // OSG_NOTICE<<"PolygonOffset::setFactorAndUnitMultipliersUsingBestGuessForDriver()"<<std::endl;
57 
58 #if 0
59     const GLubyte* renderer = glGetString(GL_RENDERER);
60     if (renderer)
61     {
62         if ((strstr((const char*)renderer,"Radeon")!=0) ||
63             (strstr((const char*)renderer,"RADEON")!=0) ||
64             (strstr((const char*)renderer,"ALL-IN-WONDER")!=0))
65         {
66             setFactorMultiplier(1.0f);
67             setUnitsMultiplier(128.0f);
68             OSG_INFO<<"PolygonOffset::setFactorAndUnitsMultipliersUsingBestGuessForDriver() apply ATI workaround."<<std::endl;
69         }
70     }
71 #endif
72 }
73 
74 
PolygonOffset()75 PolygonOffset::PolygonOffset():
76     _factor(0.0f),
77     _units(0.0f)
78 {
79 }
80 
PolygonOffset(float factor,float units)81 PolygonOffset::PolygonOffset(float factor, float units):
82     _factor(factor),
83     _units(units)
84 {
85 }
86 
~PolygonOffset()87 PolygonOffset::~PolygonOffset()
88 {
89 }
90 
apply(State &) const91 void PolygonOffset::apply(State&) const
92 {
93     if (!s_MultiplerSet) setFactorAndUnitsMultipliersUsingBestGuessForDriver();
94 
95     glPolygonOffset(_factor * s_FactorMultipler,
96                     _units * s_UnitsMultipler);
97 }
98