Changeset 8299

Show
Ignore:
Timestamp:
05/10/08 19:04:02
Author:
robert
Message:

Moved compile setup from osgViewer::ViewerBase? into osgViewer::Renderer to
avoid threading issues associated with compile running in a parallel with
update/cull on the first frame.

Also added automatic recompile when a new SceneData? is applied to a View.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • OpenSceneGraph/trunk/include/osgViewer/Renderer

    r8121 r8299  
    6767        bool getGraphicsThreadDoesCull() const { return _graphicsThreadDoesCull; } 
    6868 
     69 
    6970        virtual void cull(); 
    7071        virtual void draw(); 
    7172        virtual void cull_draw(); 
     73 
     74        virtual void compile(); 
     75         
     76        void setCompileOnNextDraw(bool flag) { _compileOnNextDraw = flag; } 
     77        bool getCompileOnNextDraw() const { return _compileOnNextDraw; } 
    7278 
    7379        virtual void operator () (osg::Object* object); 
     
    137143        bool                                                _done; 
    138144        bool                                                _graphicsThreadDoesCull; 
     145        bool                                                _compileOnNextDraw; 
    139146         
    140147        osg::ref_ptr<osgUtil::SceneView>                    _sceneView[2]; 
  • OpenSceneGraph/trunk/src/osgViewer/Renderer.cpp

    r8121 r8299  
    168168    _camera(camera), 
    169169    _done(false), 
    170     _graphicsThreadDoesCull(true) 
     170    _graphicsThreadDoesCull(true), 
     171    _compileOnNextDraw(true) 
    171172{ 
    172173 
     
    252253} 
    253254 
     255void Renderer::compile() 
     256{ 
     257    DEBUG_MESSAGE<<"Renderer::compile()"<<std::endl; 
     258 
     259    _compileOnNextDraw = false; 
     260     
     261    osgUtil::SceneView* sceneView = _sceneView[0].get(); 
     262    if (!sceneView || _done) return; 
     263 
     264    if (sceneView->getSceneData())  
     265    { 
     266        osgUtil::GLObjectsVisitor glov; 
     267        glov.setState(sceneView->getState()); 
     268        sceneView->getSceneData()->accept(glov); 
     269    } 
     270} 
    254271 
    255272void Renderer::cull() 
     
    323340    osg::GraphicsThread* compileThread = compileContext ? compileContext->getGraphicsThread() : 0; 
    324341 
    325     if (sceneView || _done) 
    326     { 
     342    if (sceneView && !_done) 
     343    { 
     344        if (_compileOnNextDraw) 
     345        { 
     346            compile(); 
     347        } 
     348     
    327349        osgViewer::View* view = dynamic_cast<osgViewer::View*>(_camera->getView()); 
    328350        osgDB::DatabasePager* databasePager = view ? view->getDatabasePager() : 0; 
     
    431453    osgUtil::SceneView* sceneView = _sceneView[0].get(); 
    432454    if (!sceneView || _done) return; 
     455 
     456    if (_compileOnNextDraw) 
     457    { 
     458        compile(); 
     459    } 
    433460 
    434461    updateSceneView(sceneView); 
  • OpenSceneGraph/trunk/src/osgViewer/View.cpp

    r8276 r8299  
    16351635        _camera->removeChildren(0,_camera->getNumChildren()); 
    16361636        if (sceneData) _camera->addChild(sceneData); 
     1637         
     1638        Renderer* renderer = dynamic_cast<Renderer*>(_camera->getRenderer()); 
     1639        if (renderer) renderer->setCompileOnNextDraw(true); 
     1640 
    16371641    } 
    16381642 
     
    16441648            slave._camera->removeChildren(0,slave._camera->getNumChildren()); 
    16451649            if (sceneData) slave._camera->addChild(sceneData); 
     1650         
     1651            Renderer* renderer = dynamic_cast<Renderer*>(slave._camera->getRenderer()); 
     1652            if (renderer) renderer->setCompileOnNextDraw(true); 
    16461653        } 
    16471654    }     
  • OpenSceneGraph/trunk/src/osgViewer/ViewerBase.cpp

    r7837 r8299  
    2727#include <osgUtil/Optimizer> 
    2828#include <osgUtil/IntersectionVisitor> 
    29 #include <osgUtil/GLObjectsVisitor> 
    30 #include <osgUtil/RenderLeaf> 
    3129 
    3230static osg::ApplicationUsageProxy ViewerBase_e0(osg::ApplicationUsage::ENVIRONMENTAL_VARIABLE,"OSG_CONFIG_FILE <filename>","Specify a viewer configuration file to load by default."); 
     
    282280    osg::Referenced::setThreadSafeReferenceCounting(true); 
    283281 
    284  
    285282    Scenes scenes; 
    286283    getScenes(scenes); 
     
    375372        if (affinity) gc->getGraphicsThread()->setProcessorAffinity(processNum % numProcessors); 
    376373        threadAffinityMap[gc->getGraphicsThread()] = processNum % numProcessors; 
    377  
    378         gc->getGraphicsThread()->add(new osgUtil::GLObjectsOperation()); 
    379374 
    380375        // add the startRenderingBarrier