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 "morphgeometry.hpp"
#include <osgUtil/CullVisitor>
#include <cassert> #include <cassert>
#include <components/resource/scenemanager.hpp> #include <components/resource/scenemanager.hpp>
@ -89,7 +91,18 @@ namespace SceneUtil
nv.pushOntoNodePath(this); nv.pushOntoNodePath(this);
if (nv.getVisitorType() == osg::NodeVisitor::CULL_VISITOR) 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); cull(&nv);
if (stateset)
cv->popStateSet();
}
else else
nv.apply(*this); nv.apply(*this);

@ -1,8 +1,11 @@
#include "riggeometry.hpp" #include "riggeometry.hpp"
#include <osg/MatrixTransform>
#include <osgUtil/CullVisitor>
#include <components/debug/debuglog.hpp> #include <components/debug/debuglog.hpp>
#include <components/resource/scenemanager.hpp> #include <components/resource/scenemanager.hpp>
#include <osg/MatrixTransform>
#include "skeleton.hpp" #include "skeleton.hpp"
#include "util.hpp" #include "util.hpp"
@ -393,7 +396,18 @@ namespace SceneUtil
nv.pushOntoNodePath(this); nv.pushOntoNodePath(this);
if (nv.getVisitorType() == osg::NodeVisitor::CULL_VISITOR) 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); cull(&nv);
if (stateset)
cv->popStateSet();
}
else if (nv.getVisitorType() == osg::NodeVisitor::UPDATE_VISITOR) else if (nv.getVisitorType() == osg::NodeVisitor::UPDATE_VISITOR)
updateBounds(&nv); updateBounds(&nv);
else else

@ -5,6 +5,8 @@
#include <osg/Drawable> #include <osg/Drawable>
#include <osg/NodeVisitor> #include <osg/NodeVisitor>
#include <osgUtil/CullVisitor>
#include <components/debug/debuglog.hpp> #include <components/debug/debuglog.hpp>
#include <components/resource/scenemanager.hpp> #include <components/resource/scenemanager.hpp>
@ -236,6 +238,13 @@ namespace SceneUtil
if (nv.getVisitorType() == osg::NodeVisitor::CULL_VISITOR && mSourceRigGeometry.get()) 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(); unsigned int traversalNumber = nv.getTraversalNumber();
if (mLastFrameNumber == traversalNumber) if (mLastFrameNumber == traversalNumber)
{ {
@ -273,6 +282,9 @@ namespace SceneUtil
nv.apply(geom); nv.apply(geom);
nv.popFromNodePath(); nv.popFromNodePath();
} }
if (stateset)
cv->popStateSet();
} }
else if (nv.getVisitorType() == osg::NodeVisitor::UPDATE_VISITOR) else if (nv.getVisitorType() == osg::NodeVisitor::UPDATE_VISITOR)
{ {

Loading…
Cancel
Save