1/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
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.
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.
14#ifndef OSGUTIL_GLOBJECTSVISITOR
15#define OSGUTIL_GLOBJECTSVISITOR 1
17#include <OpenThreads/Mutex>
18#include <osg/NodeVisitor>
22#include <osgUtil/Export>
26/** Visitor for traversing scene graph and setting each osg::Drawable's _useDisplayList flag,
27 * with option to immediately compile osg::Drawable OpenGL Display lists and
28 * osg::StateAttribute's.
30class OSGUTIL_EXPORT GLObjectsVisitor : public osg::NodeVisitor
34 /** Operation modes of the.*/
37 SWITCH_ON_DISPLAY_LISTS = 0x1,
38 SWITCH_OFF_DISPLAY_LISTS = 0x2,
39 COMPILE_DISPLAY_LISTS = 0x4,
40 COMPILE_STATE_ATTRIBUTES = 0x8,
41 RELEASE_DISPLAY_LISTS = 0x10,
42 RELEASE_STATE_ATTRIBUTES = 0x20,
43 SWITCH_ON_VERTEX_BUFFER_OBJECTS = 0x40,
44 SWITCH_OFF_VERTEX_BUFFER_OBJECTS = 0x80,
45 CHECK_BLACK_LISTED_MODES = 0x100
48 typedef unsigned int Mode;
50 /** Construct a GLObjectsVisitor to traverse all children, operating on
51 * node according to specified mode, such as to compile or release
52 * display list/texture objects etc. Default mode is to compile
55 GLObjectsVisitor(Mode mode=COMPILE_DISPLAY_LISTS|COMPILE_STATE_ATTRIBUTES|CHECK_BLACK_LISTED_MODES);
57 META_NodeVisitor(osgUtil, GLObjectsVisitor)
61 _drawablesAppliedSet.clear();
62 _stateSetAppliedSet.clear();
66 /** Set the operational mode of what operations to do on the scene graph.*/
67 void setMode(Mode mode) { _mode = mode; }
69 /** Get the operational mode.*/
70 Mode getMode() const { return _mode; }
73 /** Set the State to use during traversal. */
74 void setState(osg::State* state)
76 _renderInfo.setState(state);
79 osg::State* getState()
81 return _renderInfo.getState();
84 void setRenderInfo(osg::RenderInfo& renderInfo)
86 _renderInfo = renderInfo;
89 osg::RenderInfo& getRenderInfo()
94 /** Set whether and how often OpenGL errors should be checked for, defaults to osg::State::ONCE_PER_ATTRIBUTE. */
95 void setCheckForGLErrors(osg::State::CheckForGLErrors check) { _checkGLErrors = check; }
97 /** Get whether and how often OpenGL errors should be checked for.*/
98 osg::State::CheckForGLErrors getCheckForGLErrors() const { return _checkGLErrors; }
100 /** Simply traverse using standard NodeVisitor traverse method.*/
101 virtual void apply(osg::Node& node);
103 void apply(osg::Drawable& drawable);
104 void apply(osg::StateSet& stateset);
106 /** Do a compile traversal and then reset any state,*/
107 void compile(osg::Node& node);
111 typedef std::set<osg::Drawable*> DrawableAppliedSet;
112 typedef std::set<osg::StateSet*> StatesSetAppliedSet;
115 osg::RenderInfo _renderInfo;
116 osg::State::CheckForGLErrors _checkGLErrors;
118 DrawableAppliedSet _drawablesAppliedSet;
119 StatesSetAppliedSet _stateSetAppliedSet;
120 osg::ref_ptr<osg::Program> _lastCompiledProgram;
124class OSGUTIL_EXPORT GLObjectsOperation : public osg::GraphicsOperation
128 GLObjectsOperation(GLObjectsVisitor::Mode mode = GLObjectsVisitor::COMPILE_DISPLAY_LISTS|GLObjectsVisitor::COMPILE_STATE_ATTRIBUTES|GLObjectsVisitor::CHECK_BLACK_LISTED_MODES);
130 GLObjectsOperation(osg::Node* subgraph, GLObjectsVisitor::Mode mode = GLObjectsVisitor::COMPILE_DISPLAY_LISTS|GLObjectsVisitor::COMPILE_STATE_ATTRIBUTES|GLObjectsVisitor::CHECK_BLACK_LISTED_MODES);
132 virtual void operator () (osg::GraphicsContext* context);
136 osg::ref_ptr<osg::Node> _subgraph;
137 GLObjectsVisitor::Mode _mode;