diff --git a/examples/osganimate/osganimate.cpp b/examples/osganimate/osganimate.cpp index 8996c6c13..ad467e218 100644 --- a/examples/osganimate/osganimate.cpp +++ b/examples/osganimate/osganimate.cpp @@ -242,7 +242,7 @@ int main( int argc, char **argv ) viewer.setSceneData(rootnode); // create the windows and run the threads. - viewer.realize(Producer::CameraGroup::ThreadPerCamera); + viewer.realize(); while( !viewer.done() ) { diff --git a/examples/osgbillboard/osgbillboard.cpp b/examples/osgbillboard/osgbillboard.cpp index 5191e6c9a..87902f6d9 100644 --- a/examples/osgbillboard/osgbillboard.cpp +++ b/examples/osgbillboard/osgbillboard.cpp @@ -204,7 +204,7 @@ int main( int argc, char **argv ) viewer.setSceneData(rootNode); // create the windows and run the threads. - viewer.realize(Producer::CameraGroup::ThreadPerCamera); + viewer.realize(); while( !viewer.done() ) { diff --git a/examples/osgcallback/osgcallback.cpp b/examples/osgcallback/osgcallback.cpp index 7adc6845e..6b021e4fa 100644 --- a/examples/osgcallback/osgcallback.cpp +++ b/examples/osgcallback/osgcallback.cpp @@ -187,7 +187,7 @@ int main( int argc, char **argv ) viewer.setSceneData(rootnode); // create the windows and run the threads. - viewer.realize(Producer::CameraGroup::ThreadPerCamera); + viewer.realize(); while( !viewer.done() ) { diff --git a/examples/osgclip/osgclip.cpp b/examples/osgclip/osgclip.cpp index c8d5055cd..0c024861f 100644 --- a/examples/osgclip/osgclip.cpp +++ b/examples/osgclip/osgclip.cpp @@ -187,7 +187,7 @@ int main( int argc, char **argv ) viewer.setSceneData(rootnode); // create the windows and run the threads. - viewer.realize(Producer::CameraGroup::ThreadPerCamera); + viewer.realize(); while( !viewer.done() ) { diff --git a/examples/osgcluster/osgcluster.cpp b/examples/osgcluster/osgcluster.cpp index 8ea8280ba..6dcf34300 100644 --- a/examples/osgcluster/osgcluster.cpp +++ b/examples/osgcluster/osgcluster.cpp @@ -53,7 +53,7 @@ class CameraPacket { void getModelView(osg::Matrix& matrix,float angle_offset=0.0f) { - matrix = _matrix * osg::Matrix::rotate(angle_offset,0.0f,1.0f,1.0f); + matrix = _matrix * osg::Matrix::rotate(angle_offset,0.0f,1.0f,0.0f); } void checkByteOrder( void ) @@ -164,7 +164,7 @@ int main( int argc, char **argv ) viewer.setSceneData(rootnode.get()); // create the windows and run the threads. - viewer.realize(Producer::CameraGroup::ThreadPerCamera); + viewer.realize(); // objects for managing the broadcasting and recieving of camera packets. Broadcaster bc; diff --git a/examples/osgcopy/osgcopy.cpp b/examples/osgcopy/osgcopy.cpp index 1dcecd2cd..c706a116a 100644 --- a/examples/osgcopy/osgcopy.cpp +++ b/examples/osgcopy/osgcopy.cpp @@ -231,7 +231,7 @@ int main( int argc, char **argv ) viewer.setSceneData(rootnode); // create the windows and run the threads. - viewer.realize(Producer::CameraGroup::ThreadPerCamera); + viewer.realize(); while( !viewer.done() ) { diff --git a/examples/osgcubemap/osgcubemap.cpp b/examples/osgcubemap/osgcubemap.cpp index 891ba0d3c..e02936b4d 100644 --- a/examples/osgcubemap/osgcubemap.cpp +++ b/examples/osgcubemap/osgcubemap.cpp @@ -126,7 +126,7 @@ int main(int argc, char *argv[]) viewer.setSceneData(rootnode); // create the windows and run the threads. - viewer.realize(Producer::CameraGroup::ThreadPerCamera); + viewer.realize(); while( !viewer.done() ) { diff --git a/examples/osggeodemo/osggeodemo.cpp b/examples/osggeodemo/osggeodemo.cpp index 14eaa9b18..559feffbc 100644 --- a/examples/osggeodemo/osggeodemo.cpp +++ b/examples/osggeodemo/osggeodemo.cpp @@ -171,7 +171,7 @@ int main( int argc, char **argv ) } // create the windows and run the threads. - viewer.realize(Producer::CameraGroup::ThreadPerCamera); + viewer.realize(); while( !viewer.done() ) { diff --git a/examples/osggeometry/osggeometry.cpp b/examples/osggeometry/osggeometry.cpp index 6a322a0b9..62ff76767 100644 --- a/examples/osggeometry/osggeometry.cpp +++ b/examples/osggeometry/osggeometry.cpp @@ -688,7 +688,7 @@ int main( int argc, char **argv ) viewer.setSceneData( root ); // create the windows and run the threads. - viewer.realize(Producer::CameraGroup::ThreadPerCamera); + viewer.realize(); while( !viewer.done() ) { diff --git a/examples/osghangglide/osghangglide.cpp b/examples/osghangglide/osghangglide.cpp index 255011a62..d891bb087 100644 --- a/examples/osghangglide/osghangglide.cpp +++ b/examples/osghangglide/osghangglide.cpp @@ -147,7 +147,7 @@ int main( int argc, char **argv ) viewer.setSceneData( rootnode ); // create the windows and run the threads. - viewer.realize(Producer::CameraGroup::ThreadPerCamera); + viewer.realize(); while( !viewer.done() ) { diff --git a/examples/osghud/osghud.cpp b/examples/osghud/osghud.cpp index 447e8bda3..7a9f793f5 100644 --- a/examples/osghud/osghud.cpp +++ b/examples/osghud/osghud.cpp @@ -164,7 +164,7 @@ int main( int argc, char **argv ) viewer.setSceneData(group.get()); // create the windows and run the threads. - viewer.realize(Producer::CameraGroup::ThreadPerCamera); + viewer.realize(); while( !viewer.done() ) { diff --git a/examples/osgimpostor/osgimpostor.cpp b/examples/osgimpostor/osgimpostor.cpp index a86e2e64b..e9b45ae0f 100644 --- a/examples/osgimpostor/osgimpostor.cpp +++ b/examples/osgimpostor/osgimpostor.cpp @@ -319,7 +319,7 @@ int main( int argc, char **argv ) // register trackball, flight and drive. // create the windows and run the threads. - viewer.realize(Producer::CameraGroup::ThreadPerCamera); + viewer.realize(); while( !viewer.done() ) { diff --git a/examples/osgkeyboard/osgkeyboard.cpp b/examples/osgkeyboard/osgkeyboard.cpp index b8325407f..c7882c190 100644 --- a/examples/osgkeyboard/osgkeyboard.cpp +++ b/examples/osgkeyboard/osgkeyboard.cpp @@ -423,7 +423,7 @@ int main( int argc, char **argv ) //osgDB::writeNodeFile(*keyboardModel->getScene(),"test.osg"); // create the windows and run the threads. - viewer.realize(Producer::CameraGroup::ThreadPerCamera); + viewer.realize(); while( !viewer.done() ) diff --git a/examples/osglight/osglight.cpp b/examples/osglight/osglight.cpp index 91bf10da3..44d936bcc 100644 --- a/examples/osglight/osglight.cpp +++ b/examples/osglight/osglight.cpp @@ -347,7 +347,7 @@ int main( int argc, char **argv ) // create the windows and run the threads. - viewer.realize(Producer::CameraGroup::ThreadPerCamera); + viewer.realize(); // set all the sceneview's up so that their left and right add cull masks are set up. for(osgProducer::OsgCameraGroup::SceneHandlerList::iterator itr=viewer.getSceneHandlerList().begin(); diff --git a/examples/osglightpoint/osglightpoint.cpp b/examples/osglightpoint/osglightpoint.cpp index 65e5599c8..74be5e34f 100644 --- a/examples/osglightpoint/osglightpoint.cpp +++ b/examples/osglightpoint/osglightpoint.cpp @@ -159,7 +159,7 @@ int main( int argc, char **argv ) viewer.setSceneData( rootnode ); // create the windows and run the threads. - viewer.realize(Producer::CameraGroup::ThreadPerCamera); + viewer.realize(); while( !viewer.done() ) { diff --git a/examples/osglogo/osglogo.cpp b/examples/osglogo/osglogo.cpp index 24c0989bd..bdca9d377 100644 --- a/examples/osglogo/osglogo.cpp +++ b/examples/osglogo/osglogo.cpp @@ -445,7 +445,7 @@ int main( int argc, char **argv ) viewer.setSceneData( node ); // create the windows and run the threads. - viewer.realize(Producer::CameraGroup::ThreadPerCamera); + viewer.realize(); while( !viewer.done() ) { diff --git a/examples/osgmultitexture/osgmultitexture.cpp b/examples/osgmultitexture/osgmultitexture.cpp index 0b4b8c0e8..dbc128870 100644 --- a/examples/osgmultitexture/osgmultitexture.cpp +++ b/examples/osgmultitexture/osgmultitexture.cpp @@ -98,7 +98,7 @@ int main( int argc, char **argv ) viewer.setSceneData( rootnode ); // create the windows and run the threads. - viewer.realize(Producer::CameraGroup::ThreadPerCamera); + viewer.realize(); while( !viewer.done() ) { diff --git a/examples/osgoccluder/osgoccluder.cpp b/examples/osgoccluder/osgoccluder.cpp index 96bc52239..2a9d0f96b 100644 --- a/examples/osgoccluder/osgoccluder.cpp +++ b/examples/osgoccluder/osgoccluder.cpp @@ -346,7 +346,7 @@ int main( int argc, char **argv ) // create the windows and run the threads. - viewer.realize(Producer::CameraGroup::ThreadPerCamera); + viewer.realize(); if (manuallyCreateOccluders) { diff --git a/examples/osgparticle/osgparticle.cpp b/examples/osgparticle/osgparticle.cpp index e778c9c0f..d20692358 100644 --- a/examples/osgparticle/osgparticle.cpp +++ b/examples/osgparticle/osgparticle.cpp @@ -385,7 +385,7 @@ int main(int argc, char **argv) viewer.setSceneData(root); // create the windows and run the threads. - // viewer.realize(Producer::CameraGroup::ThreadPerCamera); + // viewer.realize(); // run single threaded since osgParticle still writes during cull. viewer.realize(Producer::CameraGroup::SingleThreaded); diff --git a/examples/osgpbuffer/osgpbuffer.cpp b/examples/osgpbuffer/osgpbuffer.cpp index 11e001f8b..242f33462 100644 --- a/examples/osgpbuffer/osgpbuffer.cpp +++ b/examples/osgpbuffer/osgpbuffer.cpp @@ -647,7 +647,7 @@ int main( int argc, char **argv ) viewer.setSceneData(rootNode); // create the windows and run the threads. - viewer.realize(Producer::CameraGroup::ThreadPerCamera); + viewer.realize(); g_pPixelBuffer = new PBuffer(512,512); g_pPixelBuffer->initialize(); diff --git a/examples/osgprerender/osgprerender.cpp b/examples/osgprerender/osgprerender.cpp index 7485bdfe4..e9aefcc75 100644 --- a/examples/osgprerender/osgprerender.cpp +++ b/examples/osgprerender/osgprerender.cpp @@ -430,7 +430,7 @@ int main( int argc, char **argv ) // create the windows and run the threads. - viewer.realize(Producer::CameraGroup::ThreadPerCamera); + viewer.realize(); while( !viewer.done() ) { diff --git a/examples/osgreflect/osgreflect.cpp b/examples/osgreflect/osgreflect.cpp index 559f1ea9a..180713528 100644 --- a/examples/osgreflect/osgreflect.cpp +++ b/examples/osgreflect/osgreflect.cpp @@ -393,7 +393,7 @@ int main( int argc, char **argv ) viewer.setSceneData(rootNode.get()); // create the windows and run the threads. - viewer.realize(Producer::CameraGroup::ThreadPerCamera); + viewer.realize(); while( !viewer.done() ) { diff --git a/examples/osgscribe/osgscribe.cpp b/examples/osgscribe/osgscribe.cpp index 23ac6d2e9..8abb4dbaf 100644 --- a/examples/osgscribe/osgscribe.cpp +++ b/examples/osgscribe/osgscribe.cpp @@ -111,7 +111,7 @@ int main( int argc, char **argv ) viewer.setSceneData( rootnode ); // create the windows and run the threads. - viewer.realize(Producer::CameraGroup::ThreadPerCamera); + viewer.realize(); while( !viewer.done() ) { diff --git a/examples/osgsequence/osgsequence.cpp b/examples/osgsequence/osgsequence.cpp index 46653d6c8..c66c9a4e5 100644 --- a/examples/osgsequence/osgsequence.cpp +++ b/examples/osgsequence/osgsequence.cpp @@ -185,7 +185,7 @@ int main( int argc, char **argv ) viewer.getEventHandlerList().push_front(new MyEventHandler(&seq)); // create the windows and run the threads. - viewer.realize(Producer::CameraGroup::ThreadPerCamera); + viewer.realize(); while( !viewer.done() ) { diff --git a/examples/osgshadowtexture/osgshadowtexture.cpp b/examples/osgshadowtexture/osgshadowtexture.cpp index a9b78cbcd..a8e8687b3 100644 --- a/examples/osgshadowtexture/osgshadowtexture.cpp +++ b/examples/osgshadowtexture/osgshadowtexture.cpp @@ -215,7 +215,7 @@ int main( int argc, char **argv ) viewer.setSceneData( model ); // create the windows and run the threads. - viewer.realize(Producer::CameraGroup::ThreadPerCamera); + viewer.realize(); while( !viewer.done() ) { diff --git a/examples/osgshape/osgshape.cpp b/examples/osgshape/osgshape.cpp index 3d8e5d5ff..fbcdd55d7 100644 --- a/examples/osgshape/osgshape.cpp +++ b/examples/osgshape/osgshape.cpp @@ -121,7 +121,7 @@ int main( int argc, char **argv ) viewer.setSceneData( node ); // create the windows and run the threads. - viewer.realize(Producer::CameraGroup::ThreadPerCamera); + viewer.realize(); while( !viewer.done() ) { diff --git a/examples/osgstereoimage/osgstereoimage.cpp b/examples/osgstereoimage/osgstereoimage.cpp index 9f0ceec15..ee653dc51 100644 --- a/examples/osgstereoimage/osgstereoimage.cpp +++ b/examples/osgstereoimage/osgstereoimage.cpp @@ -471,7 +471,7 @@ int main( int argc, char **argv ) if (ds) ds->setStereo(true); // create the windows and run the threads. - viewer.realize(Producer::CameraGroup::ThreadPerCamera); + viewer.realize(); // now the windows have been realized we switch off the cursor to prevent it // distracting the people seeing the stereo images. diff --git a/examples/osgteapot/osgteapot.cpp b/examples/osgteapot/osgteapot.cpp index a302cbed7..67a7f49e3 100644 --- a/examples/osgteapot/osgteapot.cpp +++ b/examples/osgteapot/osgteapot.cpp @@ -352,7 +352,7 @@ int main( int argc, char **argv ) viewer.setSceneData( createTeapot() ); // create the windows and run the threads. - viewer.realize(Producer::CameraGroup::ThreadPerCamera); + viewer.realize(); while( !viewer.done() ) { diff --git a/examples/osgtext/osgtext.cpp b/examples/osgtext/osgtext.cpp index 581e3adcb..25bac0e87 100644 --- a/examples/osgtext/osgtext.cpp +++ b/examples/osgtext/osgtext.cpp @@ -516,7 +516,7 @@ int main( int argc, char **argv ) viewer.setSceneData(rootNode.get()); // create the windows and run the threads. - viewer.realize(Producer::CameraGroup::ThreadPerCamera); + viewer.realize(); while( !viewer.done() ) { diff --git a/examples/osgtexture1D/osgtexture1D.cpp b/examples/osgtexture1D/osgtexture1D.cpp index 60fccfb24..f02fd6dfb 100644 --- a/examples/osgtexture1D/osgtexture1D.cpp +++ b/examples/osgtexture1D/osgtexture1D.cpp @@ -201,7 +201,7 @@ int main( int argc, char **argv ) viewer.setSceneData( loadedModel ); // create the windows and run the threads. - viewer.realize(Producer::CameraGroup::ThreadPerCamera); + viewer.realize(); while( !viewer.done() ) { diff --git a/examples/osgtexture2D/osgtexture2D.cpp b/examples/osgtexture2D/osgtexture2D.cpp index f572d3477..439e0194e 100644 --- a/examples/osgtexture2D/osgtexture2D.cpp +++ b/examples/osgtexture2D/osgtexture2D.cpp @@ -723,7 +723,7 @@ int main( int argc, char **argv ) viewer.setSceneData( rootNode ); // create the windows and run the threads. - viewer.realize(Producer::CameraGroup::ThreadPerCamera); + viewer.realize(); while( !viewer.done() ) { diff --git a/examples/osgtexture3D/osgtexture3D.cpp b/examples/osgtexture3D/osgtexture3D.cpp index 5f7dc94e2..35e6d7e1b 100644 --- a/examples/osgtexture3D/osgtexture3D.cpp +++ b/examples/osgtexture3D/osgtexture3D.cpp @@ -263,7 +263,7 @@ int main( int argc, char **argv ) viewer.setRealizeCallback(new ConstructStateCallback(rootNode)); // create the windows and run the threads. - viewer.realize(Producer::CameraGroup::ThreadPerCamera); + viewer.realize(); while( !viewer.done() ) { diff --git a/examples/osgvertexprogram/osgvertexprogram.cpp b/examples/osgvertexprogram/osgvertexprogram.cpp index 5fd8e9dbb..272bd566b 100644 --- a/examples/osgvertexprogram/osgvertexprogram.cpp +++ b/examples/osgvertexprogram/osgvertexprogram.cpp @@ -402,7 +402,7 @@ int main(int argc, char *argv[]) viewer.setSceneData(rootnode); // create the windows and run the threads. - viewer.realize(Producer::CameraGroup::ThreadPerCamera); + viewer.realize(); while( !viewer.done() ) { diff --git a/examples/osgviewer/osgviewer.cpp b/examples/osgviewer/osgviewer.cpp index 524ab582b..416b75966 100644 --- a/examples/osgviewer/osgviewer.cpp +++ b/examples/osgviewer/osgviewer.cpp @@ -77,7 +77,7 @@ int main( int argc, char **argv ) viewer.setSceneData(loadedModel.get()); // create the windows and run the threads. - viewer.realize(Producer::CameraGroup::ThreadPerCamera); + viewer.realize(); while( !viewer.done() ) { diff --git a/examples/osgwindows/osgwindows.cpp b/examples/osgwindows/osgwindows.cpp index e2b0da10d..b5f3dc34a 100644 --- a/examples/osgwindows/osgwindows.cpp +++ b/examples/osgwindows/osgwindows.cpp @@ -109,8 +109,7 @@ int main( int argc, char **argv ) viewer.setSceneData(loadedModel.get()); // create the windows and run the threads. -// viewer.realize(Producer::CameraGroup::ThreadPerCamera); - viewer.realize(Producer::CameraGroup::SingleThreaded); + viewer.realize(); while( !viewer.done() ) { diff --git a/include/osgParticle/ParticleProcessor b/include/osgParticle/ParticleProcessor index 23ecb2ed1..cf717d82e 100644 --- a/include/osgParticle/ParticleProcessor +++ b/include/osgParticle/ParticleProcessor @@ -46,6 +46,7 @@ namespace osgParticle ParticleProcessor(); ParticleProcessor(const ParticleProcessor ©, const osg::CopyOp ©op = osg::CopyOp::SHALLOW_COPY); + virtual const char *libraryName() const { return "osgParticle"; } virtual const char *className() const { return "ParticleProcessor"; } virtual bool isSameKindAs(const osg::Object *obj) const { return dynamic_cast(obj) != 0; } virtual void accept(osg::NodeVisitor& nv) { if (nv.validNodeMask(*this)) { nv.pushOntoNodePath(this); nv.apply(*this); nv.popFromNodePath(); } } diff --git a/include/osgParticle/VariableRateCounter b/include/osgParticle/VariableRateCounter index 98a34537e..c15ed8c9c 100644 --- a/include/osgParticle/VariableRateCounter +++ b/include/osgParticle/VariableRateCounter @@ -29,6 +29,7 @@ namespace osgParticle inline VariableRateCounter(); inline VariableRateCounter(const VariableRateCounter ©, const osg::CopyOp ©op = osg::CopyOp::SHALLOW_COPY); + virtual const char *libraryName() const { return "osgParticle"; } virtual const char *className() const { return "VariableRateCounter"; } virtual bool isSameKindAs(const osg::Object *obj) const { return dynamic_cast(obj) != 0; } diff --git a/include/osgProducer/OsgCameraGroup b/include/osgProducer/OsgCameraGroup index a0c936930..ae7d88854 100644 --- a/include/osgProducer/OsgCameraGroup +++ b/include/osgProducer/OsgCameraGroup @@ -137,9 +137,11 @@ class OSGPRODUCER_EXPORT OsgCameraGroup : public Producer::CameraGroup void advance(); + /** Set the threading model and then call realize().*/ + virtual bool realize(ThreadingModel thread_model ); /** Realize the render surfaces (OpenGL graphics) and various threads, and call any realize callbacks.*/ - virtual void realize( ThreadingModel thread_model= SingleThreaded ); + virtual bool realize(); /** Set the model view matrix of the camera group, * by individually set all the camera groups's camera.*/ diff --git a/include/osgProducer/Viewer b/include/osgProducer/Viewer index d09227519..0f7d31672 100644 --- a/include/osgProducer/Viewer +++ b/include/osgProducer/Viewer @@ -72,7 +72,10 @@ class OSGPRODUCER_EXPORT Viewer : public OsgCameraGroup, public osgGA::GUIAction bool done() const { return _done; } - virtual void realize( ThreadingModel thread_model= SingleThreaded ); + /** Set the threading model and then call realize().*/ + virtual bool realize(ThreadingModel thread_model); + + virtual bool realize(); virtual void sync(); diff --git a/src/osgProducer/OsgCameraGroup.cpp b/src/osgProducer/OsgCameraGroup.cpp index be001ba58..8a8775d94 100644 --- a/src/osgProducer/OsgCameraGroup.cpp +++ b/src/osgProducer/OsgCameraGroup.cpp @@ -112,6 +112,8 @@ OsgCameraGroup::OsgCameraGroup(osg::ArgumentParser& arguments): void OsgCameraGroup::_init() { + _thread_model = ThreadPerCamera; + _scene_data = NULL; _global_stateset = NULL; _background_color.set( 0.2f, 0.2f, 0.4f, 1.0f ); @@ -230,11 +232,40 @@ void OsgCameraGroup::advance() CameraGroup::advance(); } -void OsgCameraGroup::realize( ThreadingModel thread_model) +bool OsgCameraGroup::realize( ThreadingModel thread_model ) { - if( _initialized ) return; + if( _realized ) return _realized; + _thread_model = thread_model; + return realize(); +} +// small visitor to check for the existance of particle systems, +// which currently arn't thread safe, so we would need to disable +// multithreading of cull and draw. +class SearchForParticleNodes : public osg::NodeVisitor +{ +public: + SearchForParticleNodes(): + osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN), + _foundParticles(false) + { + } + + virtual void apply(osg::Node& node) + { + if (strcmp(node.libraryName(),"osgParticle")==0) _foundParticles = true; + if (!_foundParticles) traverse(node); + } + + + bool _foundParticles; +}; + +bool OsgCameraGroup::realize() +{ + if( _initialized ) return _realized; + if (!_ds) _ds = osg::DisplaySettings::instance(); _ds->setMaxNumberOfGraphicsContexts( _cfg->getNumberOfCameras() ); @@ -319,9 +350,22 @@ void OsgCameraGroup::realize( ThreadingModel thread_model) } setUpSceneViewsWithData(); + + if (getTopMostSceneData() && _thread_model!=Producer::CameraGroup::SingleThreaded) + { + SearchForParticleNodes sfpn; + getTopMostSceneData()->accept(sfpn); + if (sfpn._foundParticles) + { + osg::notify(osg::NOTICE)<<"Warning: disabling multi-threading of cull and draw"<getCurrentCameraManipulator()) { @@ -201,6 +208,7 @@ void Viewer::realize( ThreadingModel thread_model) (*p)->setCamera(_old_style_osg_camera.get()); } + return _realized; } void Viewer::sync()