On Wed, Aug 4, 2010 at 9:33 AM, PCJohn <[email protected]> wrote:

> Hi,
>
> captureCurrentState name is misleading - it is not capturing state from
> OpenGL.
> It should be, maybe, getCurrentState. It is just taking last pushed
> attributes on the state stack. These attributes are returned in the StateSet
> given as parameter. Thus, the function should work any time during cull
> traversal, I guess.
>
> No. CullVisitor::pushStateSet does not affect the graphics state
immediately. It is used to build the state graph that is used during the
draw traversal to change the state. You really can't use osg::State for much
outside of the graphics traversal.

I do not understand, but it work with SingleThreaded and
> CullDrawThreadPerContext while it crashes with DrawThreadPerContext and
>  CullThreadPerCameraDrawThreadPerContext. It seems to me like two threads
> are accessing state stack...
>
> There isn't a state stack. See
http://www.bricoworks.com/articles/stateset/stateset.html and
http://www.bricoworks.com/articles/stategraph/stategraph.html.

Tim


> John
>
>
>
> Wojciech Lewandowski wrote:
>
>> Hi,
>>
>> I don't think its allowed to call captureCurrentState in Cull stage. I am
>> not certain about this, but would expect that captureCurrentState would read
>> OpenGL state  and update osg::State accordingly. If this is the case then it
>> does require valid OpenGL context, which is only guaranteed to be valid in
>> Render stage. SingleThreaded mode is bit different and manages SceneViews
>> differently which has the side effect that OpenGL context often remains
>> valid beetwen Render stages .
>>
>> Wojtek
>>
>> --------------------------------------------------
>> From: "PCJohn" <[email protected]>
>> Sent: Tuesday, August 03, 2010 4:38 PM
>> To: "OpenSceneGraph Users" <[email protected]>
>> Subject: [osg-users] threading and captureCurrentState
>>
>>  Hi,
>>>
>>> I see a threading issue when capturing current attributes in cull phase.
>>>
>>> My code placed in my derived ShadowTechnique::cull():
>>>
>>> void MyShadowVolume::cull( osgUtil::CullVisitor& cv )
>>> {
>>>   ref_ptr< StateSet > currentState = new StateSet;
>>>   cv.getState()->captureCurrentState( *currentState );
>>>
>>>   cv.pushStateSet( _ss1 );
>>>   _shadowedScene->Group::traverse( cv );
>>>   cv.popStateSet();
>>>
>>>   cv.pushStateSet( _ss2 );
>>>   _shadowedScene->Group::traverse( cv );
>>>   cv.popStateSet();
>>> }
>>>
>>> StateSets are not changing. It crashes inside captureCurrentState while I
>>> have to wait few seconds. However, the time changes (race-condition?). It
>>> looks like threading issue and if I set viewer.setThreadingModel(
>>> SingleThreaded ), the problem seems to disappear.
>>>
>>> Is the code above correct? Am I using captureCurrentState correctly? I
>>> need it to determine FrontFace attribute settings.
>>> Thanks,
>>> John
>>>
>>>
>>>
>>>
>>>
>>>
>>> _______________________________________________
>>> 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-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

Reply via email to