Use Rig/MorphGeometry state for its child geometry

Cherry-pick of ed44095cdc from 0.48 branch
depth-refraction
Alexei Dobrohotov 2 years ago committed by AnyOldName3
parent 8e36d5e704
commit 20e799dadc

@ -1,5 +1,7 @@
#include "morphgeometry.hpp"
#include <osgUtil/CullVisitor>
#include <cassert>
#include <components/resource/scenemanager.hpp>
@ -89,7 +91,18 @@ namespace SceneUtil
nv.pushOntoNodePath(this);
if (nv.getVisitorType() == osg::NodeVisitor::CULL_VISITOR)
{
// The cull visitor won't be applied to the node itself,
// but we want to use its state to render the child geometry.
osg::StateSet* stateset = getStateSet();
osgUtil::CullVisitor* cv = static_cast<osgUtil::CullVisitor*>(&nv);
if (stateset)
cv->pushStateSet(stateset);
cull(&nv);
if (stateset)
cv->popStateSet();
}
else
nv.apply(*this);

@ -1,8 +1,11 @@
#include "riggeometry.hpp"
#include <osg/MatrixTransform>
#include <osgUtil/CullVisitor>
#include <components/debug/debuglog.hpp>
#include <components/resource/scenemanager.hpp>
#include <osg/MatrixTransform>
#include "skeleton.hpp"
#include "util.hpp"
@ -393,7 +396,18 @@ namespace SceneUtil
nv.pushOntoNodePath(this);
if (nv.getVisitorType() == osg::NodeVisitor::CULL_VISITOR)
{
// The cull visitor won't be applied to the node itself,
// but we want to use its state to render the child geometry.
osg::StateSet* stateset = getStateSet();
osgUtil::CullVisitor* cv = static_cast<osgUtil::CullVisitor*>(&nv);
if (stateset)
cv->pushStateSet(stateset);
cull(&nv);
if (stateset)
cv->popStateSet();
}
else if (nv.getVisitorType() == osg::NodeVisitor::UPDATE_VISITOR)
updateBounds(&nv);
else

@ -5,6 +5,8 @@
#include <osg/Drawable>
#include <osg/NodeVisitor>
#include <osgUtil/CullVisitor>
#include <components/debug/debuglog.hpp>
#include <components/resource/scenemanager.hpp>
@ -236,6 +238,13 @@ namespace SceneUtil
if (nv.getVisitorType() == osg::NodeVisitor::CULL_VISITOR && mSourceRigGeometry.get())
{
// The cull visitor won't be applied to the node itself,
// but we want to use its state to render the child geometry.
osg::StateSet* stateset = getStateSet();
osgUtil::CullVisitor* cv = static_cast<osgUtil::CullVisitor*>(&nv);
if (stateset)
cv->pushStateSet(stateset);
unsigned int traversalNumber = nv.getTraversalNumber();
if (mLastFrameNumber == traversalNumber)
{
@ -273,6 +282,9 @@ namespace SceneUtil
nv.apply(geom);
nv.popFromNodePath();
}
if (stateset)
cv->popStateSet();
}
else if (nv.getVisitorType() == osg::NodeVisitor::UPDATE_VISITOR)
{

Loading…
Cancel
Save