From 857b3e03c30ef8977d44dc85c8004bc4a6b80b37 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Tue, 8 Nov 2005 11:46:52 +0000 Subject: [PATCH] Added sorting and clearing of pre and post RenderStages stored in RenderStage, and added some debugging comments which are currently commented out from compilation - these are left in just in case future debug work requires them. --- include/osgUtil/RenderBin | 2 +- include/osgUtil/RenderLeaf | 2 +- include/osgUtil/RenderStage | 2 ++ src/osgUtil/RenderBin.cpp | 4 +++- src/osgUtil/RenderLeaf.cpp | 5 ++++- src/osgUtil/RenderStage.cpp | 37 ++++++++++++++++++++++++++++++++++++- src/osgUtil/SceneView.cpp | 1 + 7 files changed, 48 insertions(+), 5 deletions(-) diff --git a/include/osgUtil/RenderBin b/include/osgUtil/RenderBin index 2de9d6d8a..8fd458ed1 100644 --- a/include/osgUtil/RenderBin +++ b/include/osgUtil/RenderBin @@ -97,7 +97,7 @@ class OSGUTIL_EXPORT RenderBin : public osg::Object _stateGraphList.push_back(rg); } - void sort(); + virtual void sort(); virtual void sortImplementation(); diff --git a/include/osgUtil/RenderLeaf b/include/osgUtil/RenderLeaf index b004b6e86..cc0851269 100644 --- a/include/osgUtil/RenderLeaf +++ b/include/osgUtil/RenderLeaf @@ -66,7 +66,7 @@ class OSGUTIL_EXPORT RenderLeaf : public osg::Referenced public: - StateGraph* _parent; + StateGraph* _parent; osg::Drawable* _drawable; osg::ref_ptr _projection; osg::ref_ptr _modelview; diff --git a/include/osgUtil/RenderStage b/include/osgUtil/RenderStage index e0c27d09e..46a8b48b9 100644 --- a/include/osgUtil/RenderStage +++ b/include/osgUtil/RenderStage @@ -179,6 +179,8 @@ class OSGUTIL_EXPORT RenderStage : public RenderBin void copyTexture(osg::State& state); + virtual void sort(); + virtual void drawPreRenderStages(osg::State& state,RenderLeaf*& previous); virtual void draw(osg::State& state,RenderLeaf*& previous); diff --git a/src/osgUtil/RenderBin.cpp b/src/osgUtil/RenderBin.cpp index f8fa38981..3d9ec5182 100644 --- a/src/osgUtil/RenderBin.cpp +++ b/src/osgUtil/RenderBin.cpp @@ -346,6 +346,8 @@ void RenderBin::draw(osg::State& state,RenderLeaf*& previous) void RenderBin::drawImplementation(osg::State& state,RenderLeaf*& previous) { + // osg::notify(osg::NOTICE)<<"begin RenderBin::drawImplementation "<second->draw(state,previous); } - + //osg::notify(osg::NOTICE)<<"end RenderBin::drawImplementation "< #include +#include using namespace osg; using namespace osgUtil; @@ -63,11 +64,13 @@ void RenderLeaf::render(State& state,RenderLeaf* previous) state.applyModelViewMatrix(_modelview.get()); // apply state if required. - StateGraph::moveStateGraph(state,NULL,_parent->_parent); + StateGraph::moveStateGraph(state,NULL,_parent->_parent); state.apply(_parent->_stateset); // draw the drawable _drawable->draw(state); } + + // osg::notify(osg::NOTICE)<<"RenderLeaf "<<_drawable->getName()<<" "<<_depth<reset(); + for(RenderStageList::iterator pre_itr = _preRenderList.begin(); + pre_itr != _preRenderList.end(); + ++pre_itr) + { + (*pre_itr)->reset(); + } + RenderBin::reset(); + + for(RenderStageList::iterator post_itr = _postRenderList.begin(); + post_itr != _postRenderList.end(); + ++post_itr) + { + (*post_itr)->reset(); + } + + _preRenderList.clear(); + _postRenderList.clear(); +} + +void RenderStage::sort() +{ + for(RenderStageList::iterator pre_itr = _preRenderList.begin(); + pre_itr != _preRenderList.end(); + ++pre_itr) + { + (*pre_itr)->sort(); + } + + RenderBin::sort(); + + for(RenderStageList::iterator post_itr = _postRenderList.begin(); + post_itr != _postRenderList.end(); + ++post_itr) + { + (*post_itr)->sort(); + } } void RenderStage::addPreRenderStage(RenderStage* rs) diff --git a/src/osgUtil/SceneView.cpp b/src/osgUtil/SceneView.cpp index 2cc1f6a1c..c8028ace6 100644 --- a/src/osgUtil/SceneView.cpp +++ b/src/osgUtil/SceneView.cpp @@ -582,6 +582,7 @@ void SceneView::cullStage(const osg::Matrixd& projection,const osg::Matrixd& mod osg::ref_ptr proj = new osg::RefMatrix(projection); osg::ref_ptr mv = new osg::RefMatrix(modelview); + // collect any occluder in the view frustum. if (_camera->containsOccluderNodes()) {