Hi Rudi,

As a quick note, a Viewer::makeCurrent() is inappropriate as
makeCurrent is only associated with a graphics context, rather than a
viewer.  A viewer can have multiple graphics context as well - and
OpenGL only supports on thread per context so trying to do makeCurrent
on all contexts will just lead to the last one having any affect.

The hint itself should be also about whether the lazy makeCurrent() is
used - i.e. whether the app can assume that it still has its context
current on each subsequent frame.

Finally if you plan to submit code for inclusion with the OSG itself
you should post the changes through to osg-submissions so they can get
reviewed and not lost in the sea of osg-users posts.

Robert.

On Tue, Jun 3, 2008 at 6:50 PM, Wiedemann, Rudolf, OPS3
<[EMAIL PROTECTED]> wrote:
> Hi Robert,
>
> thank you very much for the hint!
>
> Using CompositeViewer would be better, but I need a solution with two 
> Viewers, too.
>
> I extended the osgViewer::Viewer class as you suggested (see attachment, 
> based on OSG revision 8402).
>
> There are three new methods:
>  setMakeCurrentHint() // sets flag _makeCurrentHint
>  getMakeCurrentHint()
>  makeCurrent() // makes all graphics contexts current
> and method
>  osgViewer::ViewerBase::frame()
> is overloaded.  // osgViewer::Viewer::frame() calls "makeCurrent()" if 
> "_makeCurrentHint" is true before calling osgViewer::ViewerBase::frame()
>
> I hope, I've done the changes correctly!
> The following test code works now with the extended osgViewer::Viewer class:
>
> #include <osg/ref_ptr>
> #include <osgDB/ReadFile>
> #include <osgViewer/Viewer>
> #include <osgGA/TrackballManipulator>
>
> int main( int argc, char * argv[] )
> {
>  // read model
>  osg::ref_ptr< osg::Node > model = osgDB::readNodeFile( "cow.osg" );
>
>  // create viewer #1
>  osg::ref_ptr< osgViewer::Viewer > viewer1 = new osgViewer::Viewer;
>  viewer1->setSceneData( model.get() );
>  viewer1->setUpViewInWindow( 10, 10, 400, 300 );
>  viewer1->setCameraManipulator( new osgGA::TrackballManipulator() );
>  viewer1->setThreadingModel( osgViewer::Viewer::SingleThreaded );
>  viewer1->setMakeCurrentHint();
>
>  // create viewer #2
>  osg::ref_ptr< osgViewer::Viewer > viewer2 = new osgViewer::Viewer;
>  viewer2->setSceneData( model.get() );
>  viewer2->setUpViewInWindow( 500, 10, 200, 300 );
>  viewer2->setCameraManipulator( new osgGA::TrackballManipulator() );
>  viewer2->setThreadingModel( osgViewer::Viewer::SingleThreaded );
>  viewer2->setMakeCurrentHint();
>
>  // render
>  while( ( viewer1->done() == false ) && ( viewer2->done() == false ) )
> {
>   viewer1->frame();
>   viewer2->frame();
>  }
>
>  return 0;
> }
>
> Rudi
>
> -----Ursprüngliche Nachricht-----
> Von: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] Im Auftrag von Robert Osfield
> Gesendet: Dienstag, 3. Juni 2008 16:51
> An: OpenSceneGraph Users
> Betreff: Re: [osg-users] Threading problem when using two viewers
>
> Hi Rudolf,
>
> The lazy makeCurrent() calling on each new frame is probably the cause of 
> problem here.  To fix this we'd probably need a hint to osgViewer::Viewer to 
> always call makeCurrent on a new frame.
>
> As a general note, you should use a single CompositeViewer composed of two 
> views, rather than two separate viewers like you have done here - your type 
> of usage is exactly what CompositeViewer was written for.
>
> Robert.
>
> On Tue, Jun 3, 2008 at 3:20 PM, Wiedemann, Rudolf, OPS3 <[EMAIL PROTECTED]> 
> wrote:
>> Hi,
>>
>> when I create two instances of "osgViewer::Viewer" in one program,
>> then the first viewer freezes (no trackball manipulation possible)
>> when setting threading model of both viewers to "SingleThreaded". Is
>> that expected behaviour and why, or is it a bug?
>> When I'm setting one or both viewer(s) to e.g. "ThreadPerContext",
>> then both viewers are working properly.
>>
>> I'm using OSG-Rev. 8402 and OpenSUSE-10.2-64.
>>
>> Thanks in advance!
>> Rudi
>>
>>
>> The following code reproduces the problem:
>>
>> #include <osg/ref_ptr>
>> #include <osgDB/ReadFile>
>> #include <osgViewer/Viewer>
>> #include <osgGA/TrackballManipulator>
>>
>> int main( int argc, char * argv[] )
>> {
>>  // read model
>>  osg::ref_ptr< osg::Node > model = osgDB::readNodeFile( "cow.osg" );
>>
>>  // create viewer #1
>>  osg::ref_ptr< osgViewer::Viewer > viewer1 = new osgViewer::Viewer;
>> viewer1->setSceneData( model.get() );  viewer1->setUpViewInWindow( 10,
>> 10, 400, 300 );  viewer1->setCameraManipulator( new
>> osgGA::TrackballManipulator() );  viewer1->setThreadingModel(
>> osgViewer::Viewer::SingleThreaded ); //  viewer1->setThreadingModel(
>> osgViewer::Viewer::ThreadPerContext );
>>
>>  // create viewer #2
>>  osg::ref_ptr< osgViewer::Viewer > viewer2 = new osgViewer::Viewer;
>> viewer2->setSceneData( model.get() );  viewer2->setUpViewInWindow(
>> 500, 10, 200, 300 );  viewer2->setCameraManipulator( new
>> osgGA::TrackballManipulator() );  viewer2->setThreadingModel(
>> osgViewer::Viewer::SingleThreaded ); //  viewer2->setThreadingModel(
>> osgViewer::Viewer::ThreadPerContext );
>>
>>  // render
>>  while( ( viewer1->done() == false ) && ( viewer2->done() == false ) )
>> {
>>    viewer1->frame();
>>    viewer2->frame();
>>  }
>>
>>  return 0;
>> }
>>
>> _______________________________________________
>> osg-users mailing list
>> [EMAIL PROTECTED]
>> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.
>> org
>>
> _______________________________________________
> osg-users mailing list
> [EMAIL PROTECTED]
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>
> _______________________________________________
> osg-submissions mailing list
> [email protected]
> http://lists.openscenegraph.org/listinfo.cgi/osg-submissions-openscenegraph.org
>
>
_______________________________________________
osg-submissions mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-submissions-openscenegraph.org

Reply via email to