#ifndef OSGUTIL_DISPLAYLISTVISITOR #define OSGUTIL_DISPLAYLISTVISITOR 1 #include #include #include #include namespace osgUtil { /** Visitor for traversing scene graph and setting each osg::GeoSet's _useDisplayList flag, * with option to immediately compile osg::GeoSet's OpenGL Display lists. * The mode of operation * of the visitor is controlled by setting the DisplayListMode either on visitor * constructor or via the setDisplayListMode() method. DisplayListMode options are: * _displayListMode == SWITCH_ON_AND_COMPILE_DISPLAY_LISTS cals gset->compile() on * all Geode children. Note, the visitor must only be used within a valid * OpenGL context as compile uses OpenGL calls. * _displayListMode == SWITCH_ON_DISPLAY_LISTS sets the Geode's children with * gset->setUseDisplayList(true), this method does not directly create display list, * or uses OpenGL calls so if safe to use before a valid OpenGL context has been set up. * On the next redraw of the scene, the gset's draw methods will be called * which then will respond to their _useDisplayList being set by creating display lists * automatically. * _displayListMode == SWITCH_OFF_DISPLAY_LISTS sets the Geode's children with * gset->setUseDisplayList(false), this method does not directly create display list, * or uses OpenGL calls so if safe to use before a valid OpenGL context has been set up. */ class OSGUTIL_EXPORT DisplayListVisitor : public osg::NodeVisitor { public: /** Operation modes of the DisplayListVisitor.*/ enum DisplayListMode { SWITCH_ON_AND_COMPILE_DISPLAY_LISTS, COMPILE_ON_DISPLAY_LISTS, SWITCH_ON_DISPLAY_LISTS, SWITCH_OFF_DISPLAY_LISTS }; /** Construct a CompileGeoSetsVisior to traverse all child, * with set specified display list mode. Default mode is to * gset->setUseDisplayList(true). */ DisplayListVisitor(DisplayListMode mode=SWITCH_ON_DISPLAY_LISTS); /** Set the operational mode of how the visitor should set up osg::GeoSet's.*/ void setDisplayListMode(DisplayListMode mode) { _displayListMode = mode; } /** Get the operational mode.*/ DisplayListMode getDisplayListMode() const { return _displayListMode; } /** Set the State to use during traversal. */ void setState(osg::State* state) { _externalState = state; if (_externalState.valid()) _activeState = _externalState; else _activeState = _localState; } osg::State* getState() { return _activeState.get(); } /** Simply traverse using standard NodeVisitor traverse method.*/ virtual void apply(osg::Node& node) { traverse(node); } /** For each Geode visited set the display list usage according to the * _displayListMode. */ virtual void apply(osg::Geode& node); protected: DisplayListMode _displayListMode; /** local state is created in constructor and used as the default state during traversal.*/ osg::ref_ptr _localState; /** external state is used to override the default state.*/ osg::ref_ptr _externalState; /** active state is equal to _externalState when it is valid, otherwise defaults to _localState.*/ osg::ref_ptr _activeState; }; }; #endif