[osg-users] Disabling small feature culling for a subgraph

Robert Osfield robert.osfield at gmail.com
Tue Mar 3 12:04:33 PST 2009


Hi Per,

Great news that you've been able to find a way.  Quite a simple change
in the end.  The trick is knowing exactly what bits to tweak... even I
didn't know this in this instance!

Robert.

On Tue, Mar 3, 2009 at 7:59 PM, Per Fahlberg <perfa at remograph.com> wrote:
> Hi,
>
> For the record I've found a way to get things working the way I want it, by
> changing the culling mask of the culling set at the back of the projection
> culling stack, small feature culling can now be both enabled and disabled
> for subgraphs. The code for my callback looks like this now (the code is for
> enabling small feature culling, change the "|" to "& ~" to disable small
> feature culling):
>
> virtual void operator() (osg::Node *node, osg::NodeVisitor *nv)
>  {
>   osgUtil::CullVisitor *cv = dynamic_cast<osgUtil::CullVisitor*>(nv);
>   if(cv){
>     osg::CullStack::CullingStack &projCullStack =
> cv->getProjectionCullingStack();
>     if(!projCullStack.empty()){
>       osg::CullingSet& cullingSet = projCullStack.back();
>       osg::CullingSet::Mask cullingSetMask = cullingSet.getCullingMask();
>       cullingSet.setCullingMask(cullingSetMask |
> osg::CullSettings::SMALL_FEATURE_CULLING);
>
>       traverse(node,nv);
>             cullingSet.setCullingMask(cullingSetMask);
>     }else
>       // Do not really now what to do if it is empty
>       traverse(node,nv);
>   }else
>     traverse(node,nv);
>  }
>
> Regards,
> Per
>
> Robert Osfield wrote:
>>
>> Hi Per,
>>
>> Unfortunately this is too a niche a part of the OSG to provide an
>> answer off the top of my head.
>>
>> Rober.
>>
>> On Mon, Mar 2, 2009 at 8:01 PM, Per Fahlberg <perfa at remograph.com> wrote:
>>
>>>
>>> Hi Robert,
>>>
>>> Ok, so if I change the mask of the current CullingSet in a cull callback,
>>> should it only affect the culling of the node that the callback is
>>> attached
>>> to and not the nodes below in the scenegraph?
>>>
>>> If I change the culling mode of the cull visitor in a cull callback,
>>> should
>>> it affect all nodes traversed after the node with the callback? This was
>>> what I thought, but it didn't work for disabling or enabling small
>>> feature
>>> culling at least. From my debugging it seams like changing the culling
>>> mode
>>> of the cullvisitor during traversal doesn't have any affect on culling,
>>> i.e.
>>> it doesn't change the mask of any culling sets used after the culling
>>> mode
>>> is changed. I tried to fix this with the patch earlier that you rejected.
>>>
>>> Is there any other way to change the culling mode from a cull callback so
>>> that it affects the culling of nodes below the node with the cull
>>> callback?
>>>
>>> Regrads,
>>> Per
>>>
>>> Robert Osfield wrote:
>>>
>>>>
>>>> Hi Per,
>>>>
>>>> I'm a bit rusty on this topic, too many topics coming flying by each
>>>> day that niche stuff drops out of focus quite quickly...
>>>>
>>>> Something I can answer right away is to to explain the relationship
>>>> between the CullingSet CullingMode and CullingMask.  The Mode is the
>>>> base mode that specifies what the overall mode should be, while the
>>>> CullingMask is the current active subset of this mode, that handles
>>>> the fact that different faces of the view frustum get disabled when
>>>> subgraphs are completely inside the faces of the view frustum.   At
>>>> least that what I can recall/work out from a brief look through the
>>>> code.
>>>>
>>>> Robert.
>>>>
>>>> On Fri, Feb 27, 2009 at 9:16 PM, Per Fahlberg <perfa at remograph.com>
>>>> wrote:
>>>>
>>>>
>>>>>
>>>>> A correction, my earlier proposed fix also solves this problem if the
>>>>> cull
>>>>> callback is changed to also modify the culling mode of the cull
>>>>> visitor,
>>>>> so
>>>>> that the callback reads something like this:
>>>>> ...
>>>>> osg::CullSettings::CullingMode cullVisitorCullingMode =
>>>>> cv->getCullingMode();
>>>>> osg::CullingSet &cs = cv->getCurrentCullingSet();
>>>>> osg::CullingSet::Mask cullingSetMask = cs.getCullingMask();
>>>>>
>>>>> cv->setCullingMode(cullVisitorCullingMode |
>>>>> osg::CullSettings::SMALL_FEATURE_CULLING);
>>>>> cs.setCullingMask(cullingSetMask |
>>>>> osg::CullSettings::SMALL_FEATURE_CULLING);
>>>>>
>>>>> traverse(node,nv);
>>>>>
>>>>> cs.setCullingMask(cullingSetMask);
>>>>> cv->setCullingMode(cullVisitorCullingMode);
>>>>> ...
>>>>>
>>>>> I'm a bit confused about all the culling masks/modes and which ones to
>>>>> modify and how they are propagated when the cull visitor traverses the
>>>>> scenegraph.
>>>>>
>>>>> Regards,
>>>>> Per
>>>>>
>>>>> Per Fahlberg wrote:
>>>>>
>>>>>
>>>>>>
>>>>>> Hi Robert,
>>>>>>
>>>>>> I've been busy with other work and only now been able to try your
>>>>>> proposed
>>>>>> change and found that it doesn't quite work as expected. When I run
>>>>>> the
>>>>>> attached modified osgscribe example with the attached box-sphere.osg
>>>>>> model
>>>>>> the small feature culling only culls the entire model, i.e. both the
>>>>>> box
>>>>>> and
>>>>>> the sphere together not separately as I was expecting. If small
>>>>>> feature
>>>>>> culling is turned on on the camera the box and sphere is culled by the
>>>>>> small
>>>>>> feature culling individually. I would like to enable small feature
>>>>>> culling
>>>>>> on quite large subgraphs and it seams that it only turns on small
>>>>>> feature
>>>>>> culling on the node with the callback not on the nodes bellow it. This
>>>>>> feels
>>>>>> very similar to the problem I was originally trying to solve, where
>>>>>> the
>>>>>> disabling of small feature culling wasn't propagated downwards but the
>>>>>> fix I
>>>>>> submitted then didn't fix this problem. Do I need to add the callback
>>>>>> to
>>>>>> all
>>>>>> nodes that I wish to be culled by small feature culling or is this a
>>>>>> problem
>>>>>> in osg?
>>>>>>
>>>>>> Regards,
>>>>>> Per
>>>>>>
>>>>>> Robert Osfield wrote:
>>>>>>
>>>>>>
>>>>>>>
>>>>>>> Hi Per,
>>>>>>>
>>>>>>> On Wed, Jan 28, 2009 at 8:55 PM, Per Fahlberg <perfa at remograph.com>
>>>>>>> wrote:
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>>
>>>>>>>> I don't really understand how this is not a bug since it is possible
>>>>>>>> to
>>>>>>>> switch small feature culling on for a subgraph but not switch it
>>>>>>>> off?
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>> The scene graph itself doesn't support switching off small feature
>>>>>>> culling in a subgraph. The way you tried to add this back in was
>>>>>>> inappropriate, so didn't work.
>>>>>>>
>>>>>>> My proposed change to just enable small feature culling for subgraphs
>>>>>>> that needn't it didn't require disabling culling for subgraphs so
>>>>>>> would be more efficient as culling would never be complete disabled.
>>>>>>> Disabling culling for a deeply embedded subgraph causes all the
>>>>>>> parents culling to be disabled as well, which prevents early
>>>>>>> termination of traversal that would otherwise be done so I wouldn't
>>>>>>> recommend it.
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>>
>>>>>>>> I will however scratch my head and try to figure out if I can
>>>>>>>> somehow
>>>>>>>> easily
>>>>>>>> invert the enabling and disabling of small feature culling in my
>>>>>>>> program.
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>> You could just use LOD's, this is effectively all that small feature
>>>>>>> culling simulates.
>>>>>>>
>>>>>>> Alternatively you could just set the bounding box of the drawables of
>>>>>>> interest to an artificially large size to prevent the small feature
>>>>>>> culling from effecting them.
>>>>>>>
>>>>>>> Robert.
>>>>>>> _______________________________________________
>>>>>>> osg-users mailing list
>>>>>>> osg-users at lists.openscenegraph.org
>>>>>>>
>>>>>>>
>>>>>>> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>
>>>>>>
>>>>>> ------------------------------------------------------------------------
>>>>>>
>>>>>> _______________________________________________
>>>>>> osg-users mailing list
>>>>>> osg-users at lists.openscenegraph.org
>>>>>>
>>>>>>
>>>>>> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>>>>>>
>>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> osg-users mailing list
>>>>> osg-users at lists.openscenegraph.org
>>>>>
>>>>> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>>>>>
>>>>>
>>>>>
>>>>
>>>> _______________________________________________
>>>> osg-users mailing list
>>>> osg-users at lists.openscenegraph.org
>>>>
>>>> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>>>>
>>>>
>>>>
>>>
>>> _______________________________________________
>>> osg-users mailing list
>>> osg-users at lists.openscenegraph.org
>>> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>>>
>>>
>>
>> _______________________________________________
>> osg-users mailing list
>> osg-users at lists.openscenegraph.org
>> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>>
>>
>
> _______________________________________________
> osg-users mailing list
> osg-users at lists.openscenegraph.org
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>



More information about the osg-users mailing list