163 lines
6.2 KiB
C++
163 lines
6.2 KiB
C++
|
#include <map>
|
||
|
#include <string>
|
||
|
#include <string.h>
|
||
|
#include <osg/StateAttribute>
|
||
|
|
||
|
namespace dx {
|
||
|
|
||
|
typedef std::map<osg::StateAttribute::GLMode,std::string> ModeMap;
|
||
|
|
||
|
static ModeMap S_mode_map;
|
||
|
|
||
|
#define ADD_NAME(str,mode) (S_mode_map[(mode)] = (str));
|
||
|
|
||
|
// This is a copy of some of the code in src/osgPlugins/osg/StateSet.cpp.
|
||
|
// We need to translate GLModes and StateSet attributes into strings,
|
||
|
// and that's not available in an OSG public API (yet).
|
||
|
|
||
|
static void initGLNames()
|
||
|
{
|
||
|
static bool first_time = true;
|
||
|
if (!first_time) return;
|
||
|
|
||
|
ADD_NAME("GL_ALPHA_TEST",GL_ALPHA_TEST)
|
||
|
ADD_NAME("GL_BLEND",GL_BLEND)
|
||
|
ADD_NAME("GL_COLOR_MATERIAL",GL_COLOR_MATERIAL)
|
||
|
ADD_NAME("GL_CULL_FACE",GL_CULL_FACE)
|
||
|
ADD_NAME("GL_DEPTH_TEST",GL_DEPTH_TEST)
|
||
|
ADD_NAME("GL_FOG",GL_FOG)
|
||
|
ADD_NAME("GL_LIGHTING",GL_LIGHTING)
|
||
|
ADD_NAME("GL_POINT_SMOOTH",GL_POINT_SMOOTH)
|
||
|
ADD_NAME("GL_POLYGON_OFFSET_FILL",GL_POLYGON_OFFSET_FILL)
|
||
|
ADD_NAME("GL_POLYGON_OFFSET_LINE",GL_POLYGON_OFFSET_LINE)
|
||
|
ADD_NAME("GL_POLYGON_OFFSET_POINT",GL_POLYGON_OFFSET_POINT)
|
||
|
|
||
|
ADD_NAME("GL_TEXTURE_2D",GL_TEXTURE_2D)
|
||
|
ADD_NAME("GL_TEXTURE_GEN_Q",GL_TEXTURE_GEN_Q)
|
||
|
ADD_NAME("GL_TEXTURE_GEN_R",GL_TEXTURE_GEN_R)
|
||
|
ADD_NAME("GL_TEXTURE_GEN_S",GL_TEXTURE_GEN_S)
|
||
|
ADD_NAME("GL_TEXTURE_GEN_T",GL_TEXTURE_GEN_T)
|
||
|
|
||
|
ADD_NAME("GL_STENCIL_TEST",GL_STENCIL_TEST)
|
||
|
|
||
|
ADD_NAME("GL_CLIP_PLANE0",GL_CLIP_PLANE0);
|
||
|
ADD_NAME("GL_CLIP_PLANE1",GL_CLIP_PLANE1);
|
||
|
ADD_NAME("GL_CLIP_PLANE2",GL_CLIP_PLANE2);
|
||
|
ADD_NAME("GL_CLIP_PLANE3",GL_CLIP_PLANE3);
|
||
|
ADD_NAME("GL_CLIP_PLANE4",GL_CLIP_PLANE4);
|
||
|
ADD_NAME("GL_CLIP_PLANE5",GL_CLIP_PLANE5);
|
||
|
|
||
|
ADD_NAME("GL_LIGHT0",GL_LIGHT0);
|
||
|
ADD_NAME("GL_LIGHT1",GL_LIGHT1);
|
||
|
ADD_NAME("GL_LIGHT2",GL_LIGHT2);
|
||
|
ADD_NAME("GL_LIGHT3",GL_LIGHT3);
|
||
|
ADD_NAME("GL_LIGHT4",GL_LIGHT4);
|
||
|
ADD_NAME("GL_LIGHT5",GL_LIGHT5);
|
||
|
ADD_NAME("GL_LIGHT6",GL_LIGHT6);
|
||
|
ADD_NAME("GL_LIGHT7",GL_LIGHT7);
|
||
|
|
||
|
first_time = false;
|
||
|
}
|
||
|
|
||
|
const char *GLModeToModeStr( osg::StateAttribute::GLMode mode )
|
||
|
{
|
||
|
initGLNames();
|
||
|
ModeMap::const_iterator mitr = S_mode_map.find(mode);
|
||
|
if ( mitr != S_mode_map.end() )
|
||
|
return mitr->second.c_str();
|
||
|
else
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
osg::StateAttribute::GLMode GLModeStrToMode( const char mode_str[] )
|
||
|
{
|
||
|
initGLNames();
|
||
|
for( ModeMap::const_iterator mitr = S_mode_map.begin();
|
||
|
mitr != S_mode_map.end();
|
||
|
++mitr )
|
||
|
if ( strcmp( mode_str, mitr->second.c_str() ) == 0 )
|
||
|
return mitr->first;
|
||
|
return (osg::StateAttribute::GLMode) -1;
|
||
|
}
|
||
|
|
||
|
//===========================================================================
|
||
|
|
||
|
typedef std::map<osg::StateAttribute::Type,std::string> AttrMap;
|
||
|
|
||
|
static AttrMap S_attr_map;
|
||
|
|
||
|
#define ADD_ATTR(attr,str) (S_attr_map[(attr)] = (str));
|
||
|
|
||
|
static void initOSGAttrNames()
|
||
|
{
|
||
|
static bool first_time = true;
|
||
|
if (!first_time) return;
|
||
|
|
||
|
ADD_ATTR( osg::StateAttribute::TEXTURE , "TEXTURE" );
|
||
|
ADD_ATTR( osg::StateAttribute::TEXTURE_0 , "TEXTURE_0" );
|
||
|
ADD_ATTR( osg::StateAttribute::TEXTURE_1 , "TEXTURE_1" );
|
||
|
ADD_ATTR( osg::StateAttribute::TEXTURE_2 , "TEXTURE_2" );
|
||
|
ADD_ATTR( osg::StateAttribute::TEXTURE_3 , "TEXTURE_3" );
|
||
|
ADD_ATTR( osg::StateAttribute::MATERIAL , "MATERIAL" );
|
||
|
ADD_ATTR( osg::StateAttribute::ALPHAFUNC , "ALPHAFUNC" );
|
||
|
ADD_ATTR( osg::StateAttribute::ANTIALIAS , "ANTIALIAS" );
|
||
|
ADD_ATTR( osg::StateAttribute::COLORTABLE , "COLORTABLE" );
|
||
|
ADD_ATTR( osg::StateAttribute::CULLFACE , "CULLFACE" );
|
||
|
ADD_ATTR( osg::StateAttribute::FOG , "FOG" );
|
||
|
ADD_ATTR( osg::StateAttribute::FRONTFACE , "FRONTFACE" );
|
||
|
ADD_ATTR( osg::StateAttribute::LIGHT , "LIGHT" );
|
||
|
ADD_ATTR( osg::StateAttribute::LIGHT_0 , "LIGHT_0" );
|
||
|
ADD_ATTR( osg::StateAttribute::LIGHT_1 , "LIGHT_1" );
|
||
|
ADD_ATTR( osg::StateAttribute::LIGHT_2 , "LIGHT_2" );
|
||
|
ADD_ATTR( osg::StateAttribute::LIGHT_3 , "LIGHT_3" );
|
||
|
ADD_ATTR( osg::StateAttribute::LIGHT_4 , "LIGHT_4" );
|
||
|
ADD_ATTR( osg::StateAttribute::LIGHT_5 , "LIGHT_5" );
|
||
|
ADD_ATTR( osg::StateAttribute::LIGHT_6 , "LIGHT_6" );
|
||
|
ADD_ATTR( osg::StateAttribute::LIGHT_7 , "LIGHT_7" );
|
||
|
ADD_ATTR( osg::StateAttribute::POINT , "POINT" );
|
||
|
ADD_ATTR( osg::StateAttribute::LINEWIDTH , "LINEWIDTH" );
|
||
|
ADD_ATTR( osg::StateAttribute::POLYGONMODE , "POLYGONMODE" );
|
||
|
ADD_ATTR( osg::StateAttribute::POLYGONOFFSET , "POLYGONOFFSET");
|
||
|
ADD_ATTR( osg::StateAttribute::TEXENV , "TEXENV" );
|
||
|
ADD_ATTR( osg::StateAttribute::TEXGEN , "TEXGEN" );
|
||
|
ADD_ATTR( osg::StateAttribute::TEXMAT , "TEXMAT" );
|
||
|
ADD_ATTR( osg::StateAttribute::TRANSPARENCY , "TRANSPARENCY" );
|
||
|
ADD_ATTR( osg::StateAttribute::STENCIL , "STENCIL" );
|
||
|
ADD_ATTR( osg::StateAttribute::COLORMASK , "COLORMASK" );
|
||
|
ADD_ATTR( osg::StateAttribute::DEPTH , "DEPTH" );
|
||
|
ADD_ATTR( osg::StateAttribute::VIEWPORT , "VIEWPORT" );
|
||
|
ADD_ATTR( osg::StateAttribute::CLIPPLANE , "CLIPPLANE" );
|
||
|
ADD_ATTR( osg::StateAttribute::CLIPPLANE_0 , "CLIPPLANE_0" );
|
||
|
ADD_ATTR( osg::StateAttribute::CLIPPLANE_1 , "CLIPPLANE_1" );
|
||
|
ADD_ATTR( osg::StateAttribute::CLIPPLANE_2 , "CLIPPLANE_2" );
|
||
|
ADD_ATTR( osg::StateAttribute::CLIPPLANE_3 , "CLIPPLANE_3" );
|
||
|
ADD_ATTR( osg::StateAttribute::CLIPPLANE_4 , "CLIPPLANE_4" );
|
||
|
ADD_ATTR( osg::StateAttribute::CLIPPLANE_5 , "CLIPPLANE_5" );
|
||
|
ADD_ATTR( osg::StateAttribute::COLORMATRIX , "COLORMATRIX" );
|
||
|
|
||
|
first_time = false;
|
||
|
}
|
||
|
|
||
|
const char *OSGAttrToAttrStr( osg::StateAttribute::Type attr )
|
||
|
{
|
||
|
initOSGAttrNames();
|
||
|
AttrMap::const_iterator aitr = S_attr_map.find(attr);
|
||
|
if ( aitr != S_attr_map.end() )
|
||
|
return aitr->second.c_str();
|
||
|
else
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
osg::StateAttribute::Type OSGAttrStrToAttr( const char attr_str[] )
|
||
|
{
|
||
|
initGLNames();
|
||
|
for( AttrMap::const_iterator aitr = S_attr_map.begin();
|
||
|
aitr != S_attr_map.end();
|
||
|
++aitr )
|
||
|
if ( strcmp( attr_str, aitr->second.c_str() ) == 0 )
|
||
|
return aitr->first;
|
||
|
return (osg::StateAttribute::Type) -1;
|
||
|
}
|
||
|
|
||
|
}; // namespace dx
|