From 7aae7206369528bcc3a2d6a5ed50e16b97f44a97 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Fri, 25 Sep 2015 10:09:27 +0000 Subject: [PATCH] Refactored the way that FrameStamp is managed in osgViewer::Renderer to avoid thread conflicts git-svn-id: http://svn.openscenegraph.org/osg/OpenSceneGraph/trunk@15138 16af8721-9629-0410-8352-f15c8da7e697 --- include/osgUtil/SceneView | 3 +++ src/osgViewer/Renderer.cpp | 14 +++++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/include/osgUtil/SceneView b/include/osgUtil/SceneView index d1def681d..29fe8e803 100644 --- a/include/osgUtil/SceneView +++ b/include/osgUtil/SceneView @@ -408,6 +408,9 @@ class OSGUTIL_EXPORT SceneView : public osg::Object, public osg::CullSettings inline void setFrameStamp(osg::FrameStamp* fs) { _frameStamp = fs; } /** Get the frame stamp for the current frame.*/ + inline osg::FrameStamp* getFrameStamp() { return _frameStamp.get(); } + + /** Get the const frame stamp for the current frame.*/ inline const osg::FrameStamp* getFrameStamp() const { return _frameStamp.get(); } diff --git a/src/osgViewer/Renderer.cpp b/src/osgViewer/Renderer.cpp index c376e2982..6c4afb3c1 100644 --- a/src/osgViewer/Renderer.cpp +++ b/src/osgViewer/Renderer.cpp @@ -368,6 +368,10 @@ Renderer::Renderer(osg::Camera* camera): _sceneView[0] = new osgUtil::SceneView; _sceneView[1] = new osgUtil::SceneView; + // each SceneView to have their own FrameStamp to avoid thread conflicts with the Viewer's main FrameStamp + _sceneView[0]->setFrameStamp(new osg::FrameStamp()); + _sceneView[1]->setFrameStamp(new osg::FrameStamp()); + osg::Camera* masterCamera = _camera->getView() ? _camera->getView()->getCamera() : camera; osg::StateSet* global_stateset = 0; @@ -528,7 +532,11 @@ void Renderer::updateSceneView(osgUtil::SceneView* sceneView) osgDB::ImagePager* imagePager = view ? view->getImagePager() : 0; sceneView->getCullVisitor()->setImageRequestHandler(imagePager); - sceneView->setFrameStamp(view ? view->getFrameStamp() : state->getFrameStamp()); + + if (view->getFrameStamp()) + { + (*sceneView->getFrameStamp()) = *(view->getFrameStamp()); + } osg::DisplaySettings* ds = _camera->getDisplaySettings() ? _camera->getDisplaySettings() : ((view &&view->getDisplaySettings()) ? view->getDisplaySettings() : osg::DisplaySettings::instance().get()); @@ -627,8 +635,7 @@ void Renderer::cull() if (view) sceneView->setFusionDistance(view->getFusionDistanceMode(), view->getFusionDistanceValue()); osg::Stats* stats = sceneView->getCamera()->getStats(); - osg::State* state = sceneView->getState(); - const osg::FrameStamp* fs = state->getFrameStamp(); + const osg::FrameStamp* fs = sceneView->getFrameStamp(); unsigned int frameNumber = fs ? fs->getFrameNumber() : 0; // do cull traversal @@ -640,6 +647,7 @@ void Renderer::cull() osg::Timer_t afterCullTick = osg::Timer::instance()->tick(); #if 0 + osg::State* state = sceneView->getState(); if (sceneView->getDynamicObjectCount()==0 && state->getDynamicObjectRenderingCompletedCallback()) { // OSG_NOTICE<<"Completed in cull"<