@ -170,6 +170,17 @@ namespace NifOsg
class CollisionSwitch : public osg : : MatrixTransform
{
public :
CollisionSwitch ( ) : osg : : MatrixTransform ( )
{
}
CollisionSwitch ( const CollisionSwitch & copy , const osg : : CopyOp & copyop )
: osg : : MatrixTransform ( copy , copyop )
{
}
META_Node ( NifOsg , CollisionSwitch )
CollisionSwitch ( const osg : : Matrixf & transformations , bool enabled ) : osg : : MatrixTransform ( transformations )
{
setEnabled ( enabled ) ;
@ -472,17 +483,8 @@ namespace NifOsg
osg : : ref_ptr < osg : : Group > node ;
osg : : Object : : DataVariance dataVariance = osg : : Object : : UNSPECIFIED ;
// TODO: it is unclear how to handle transformations of LOD nodes and controllers for them.
switch ( nifNode - > recType )
{
case Nif : : RC_NiLODNode :
{
const Nif : : NiLODNode * niLodNode = static_cast < const Nif : : NiLODNode * > ( nifNode ) ;
node = handleLodNode ( niLodNode ) ;
dataVariance = osg : : Object : : DYNAMIC ;
break ;
}
case Nif : : RC_NiSwitchNode :
case Nif : : RC_NiAutoNormalParticles :
case Nif : : RC_NiRotatingParticles :
// Leaf nodes in the NIF hierarchy, so won't be able to dynamically attach children.
@ -663,6 +665,11 @@ namespace NifOsg
& & ! nifNode - > controller . empty ( ) & & node - > getDataVariance ( ) = = osg : : Object : : DYNAMIC )
handleNodeControllers ( nifNode , static_cast < osg : : MatrixTransform * > ( node . get ( ) ) , animflags ) ;
// LOD and Switch nodes must be wrapped by a transform (the current node) to support transformations properly
// and we need to attach their children to the osg::LOD/osg::Switch nodes
// but we must return that transform to the caller of handleNode instead of the actual LOD/Switch nodes.
osg : : ref_ptr < osg : : Group > currentNode = node ;
if ( nifNode - > recType = = Nif : : RC_NiSwitchNode )
{
const Nif : : NiSwitchNode * niSwitchNode = static_cast < const Nif : : NiSwitchNode * > ( nifNode ) ;
@ -673,7 +680,14 @@ namespace NifOsg
else if ( niSwitchNode - > name = = Constants : : HerbalismLabel & & ! SceneUtil : : hasUserDescription ( rootNode , Constants : : HerbalismLabel ) )
rootNode - > getOrCreateUserDataContainer ( ) - > addDescription ( Constants : : HerbalismLabel ) ;
node = switchNode ;
currentNode = switchNode ;
}
else if ( nifNode - > recType = = Nif : : RC_NiLODNode )
{
const Nif : : NiLODNode * niLodNode = static_cast < const Nif : : NiLODNode * > ( nifNode ) ;
osg : : ref_ptr < osg : : LOD > lodNode = handleLodNode ( niLodNode ) ;
node - > addChild ( lodNode ) ;
currentNode = lodNode ;
}
const Nif : : NiNode * ninode = dynamic_cast < const Nif : : NiNode * > ( nifNode ) ;
@ -683,14 +697,14 @@ namespace NifOsg
for ( size_t i = 0 ; i < effects . length ( ) ; + + i )
{
if ( ! effects [ i ] . empty ( ) )
handleEffect ( effects [ i ] . getPtr ( ) , node, imageManager ) ;
handleEffect ( effects [ i ] . getPtr ( ) , curre ntN ode, imageManager ) ;
}
const Nif : : NodeList & children = ninode - > children ;
for ( size_t i = 0 ; i < children . length ( ) ; + + i )
{
if ( ! children [ i ] . empty ( ) )
handleNode ( children [ i ] . getPtr ( ) , node, imageManager , boundTextures , animflags , skipMeshes , hasMarkers , isAnimated , textKeys , rootNode ) ;
handleNode ( children [ i ] . getPtr ( ) , curre ntN ode, imageManager , boundTextures , animflags , skipMeshes , hasMarkers , isAnimated , textKeys , rootNode ) ;
}
}