From 8fa79e8c7e4ccc17019bd7cf4eef095b2bc69971 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Mon, 30 Jul 2007 10:52:37 +0000 Subject: [PATCH] Ported across Viewer's to use osgUtil::GLObjectOperation, added second option in GLObjectOperation to handle cases when no subgraph is registered, in these case the code now compile all Camera subgraphs. --- include/osgUtil/GLObjectsVisitor | 2 ++ src/osgUtil/GLObjectsVisitor.cpp | 22 +++++++++++- src/osgViewer/CompositeViewer.cpp | 35 +------------------- src/osgViewer/Viewer.cpp | 33 +----------------- src/osgWrappers/osgUtil/GLObjectsVisitor.cpp | 5 +++ 5 files changed, 30 insertions(+), 67 deletions(-) diff --git a/include/osgUtil/GLObjectsVisitor b/include/osgUtil/GLObjectsVisitor index 6e05e1f55..b93db359c 100644 --- a/include/osgUtil/GLObjectsVisitor +++ b/include/osgUtil/GLObjectsVisitor @@ -117,6 +117,8 @@ class OSGUTIL_EXPORT GLObjectsOperation : public osg::GraphicsOperation { public: + GLObjectsOperation(GLObjectsVisitor::Mode mode = GLObjectsVisitor::COMPILE_DISPLAY_LISTS|GLObjectsVisitor::COMPILE_STATE_ATTRIBUTES|GLObjectsVisitor::CHECK_BLACK_LISTED_MODES); + GLObjectsOperation(osg::Node* subgraph, GLObjectsVisitor::Mode mode = GLObjectsVisitor::COMPILE_DISPLAY_LISTS|GLObjectsVisitor::COMPILE_STATE_ATTRIBUTES|GLObjectsVisitor::CHECK_BLACK_LISTED_MODES); virtual void operator () (osg::GraphicsContext* context); diff --git a/src/osgUtil/GLObjectsVisitor.cpp b/src/osgUtil/GLObjectsVisitor.cpp index f1f5c6bc5..0f86d161d 100644 --- a/src/osgUtil/GLObjectsVisitor.cpp +++ b/src/osgUtil/GLObjectsVisitor.cpp @@ -139,6 +139,12 @@ void GLObjectsVisitor::apply(osg::StateSet& stateset) } } +GLObjectsOperation::GLObjectsOperation(GLObjectsVisitor::Mode mode): + osg::GraphicsOperation("GLObjectOperation",false), + _mode(mode) +{ +} + GLObjectsOperation::GLObjectsOperation(osg::Node* subgraph, GLObjectsVisitor::Mode mode): osg::GraphicsOperation("GLObjectOperation",false), _subgraph(subgraph), @@ -150,9 +156,23 @@ void GLObjectsOperation::operator () (osg::GraphicsContext* context) { GLObjectsVisitor glObjectsVisitor(_mode); + context->getState()->initializeExtensionProcs(); + glObjectsVisitor.setState(context->getState()); // osg::notify(osg::NOTICE)<<"GLObjectsOperation::before <<<<<<<<<<<"<accept(glObjectsVisitor); + if (_subgraph.valid()) + { + _subgraph->accept(glObjectsVisitor); + } + else + { + for(osg::GraphicsContext::Cameras::iterator itr = context->getCameras().begin(); + itr != context->getCameras().end(); + ++itr) + { + (*itr)->accept(glObjectsVisitor); + } + } // osg::notify(osg::NOTICE)<<"GLObjectsOperation::after >>>>>>>>>>> "<(object); - if (!context) return; - - // OpenThreads::ScopedLock lock(mutex); - // osg::notify(osg::NOTICE)<<"Compile "<getState()->initializeExtensionProcs(); - - osgUtil::GLObjectsVisitor compileVisitor; - compileVisitor.setState(context->getState()); - - for(osg::GraphicsContext::Cameras::iterator itr = context->getCameras().begin(); - itr != context->getCameras().end(); - ++itr) - { - (*itr)->accept(compileVisitor); - } - - // osg::notify(osg::NOTICE)<<"Done Compile "<getGraphicsThread()->setProcessorAffinity(processNum % numProcessors); - gc->getGraphicsThread()->add(new CompositeViewerCompileOperation()); + gc->getGraphicsThread()->add(new osgUtil::GLObjectsOperation()); // add the startRenderingBarrier gc->getGraphicsThread()->add(_startRenderingBarrier.get()); diff --git a/src/osgViewer/Viewer.cpp b/src/osgViewer/Viewer.cpp index 7cb736176..14658e058 100644 --- a/src/osgViewer/Viewer.cpp +++ b/src/osgViewer/Viewer.cpp @@ -1029,37 +1029,6 @@ void Viewer::stopThreading() osg::notify(osg::INFO)<<"Viewer::stopThreading() - stopped threading."< lock(mutex); - // osg::notify(osg::NOTICE)<<"Compile "<makeCurrent(); - - context->getState()->initializeExtensionProcs(); - - osgUtil::GLObjectsVisitor compileVisitor; - compileVisitor.setState(context->getState()); - - // do the compile traversal - if (_scene.valid()) _scene->accept(compileVisitor); - - // osg::notify(osg::NOTICE)<<"Done Compile "< _scene; -}; - - // Draw operation, that does a draw on the scene graph. struct ViewerRunOperations : public osg::GraphicsOperation { @@ -1265,7 +1234,7 @@ void Viewer::startThreading() if (affinity) gc->getGraphicsThread()->setProcessorAffinity(processNum % numProcessors); threadAffinityMap[gc->getGraphicsThread()] = processNum % numProcessors; - gc->getGraphicsThread()->add(new ViewerCompileOperation(getSceneData())); + gc->getGraphicsThread()->add(new osgUtil::GLObjectsOperation()); // add the startRenderingBarrier if (_threadingModel==CullDrawThreadPerContext && _startRenderingBarrier.valid()) gc->getGraphicsThread()->add(_startRenderingBarrier.get()); diff --git a/src/osgWrappers/osgUtil/GLObjectsVisitor.cpp b/src/osgWrappers/osgUtil/GLObjectsVisitor.cpp index 7e529d1ce..e330ff200 100644 --- a/src/osgWrappers/osgUtil/GLObjectsVisitor.cpp +++ b/src/osgWrappers/osgUtil/GLObjectsVisitor.cpp @@ -30,6 +30,11 @@ BEGIN_OBJECT_REFLECTOR(osgUtil::GLObjectsOperation) I_DeclaringFile("osgUtil/GLObjectsVisitor"); I_BaseType(osg::GraphicsOperation); + I_ConstructorWithDefaults1(IN, osgUtil::GLObjectsVisitor::Mode, mode, osgUtil::GLObjectsVisitor::COMPILE_DISPLAY_LISTS|osgUtil::GLObjectsVisitor::COMPILE_STATE_ATTRIBUTES|osgUtil::GLObjectsVisitor::CHECK_BLACK_LISTED_MODES, + Properties::NON_EXPLICIT, + ____GLObjectsOperation__GLObjectsVisitor_Mode, + "", + ""); I_ConstructorWithDefaults2(IN, osg::Node *, subgraph, , IN, osgUtil::GLObjectsVisitor::Mode, mode, osgUtil::GLObjectsVisitor::COMPILE_DISPLAY_LISTS|osgUtil::GLObjectsVisitor::COMPILE_STATE_ATTRIBUTES|osgUtil::GLObjectsVisitor::CHECK_BLACK_LISTED_MODES, ____GLObjectsOperation__osg_Node_P1__GLObjectsVisitor_Mode, "",