diff --git a/components/nif/node.hpp b/components/nif/node.hpp index 2f64e39a75..b63fc03804 100644 --- a/components/nif/node.hpp +++ b/components/nif/node.hpp @@ -433,17 +433,17 @@ struct NiLODNode : public NiSwitchNode struct NiFltAnimationNode : public NiSwitchNode { - float mInterval; + float mDuration; enum Flags { - Flag_Reverse = 0x40 + Flag_Swing = 0x40 }; void read(NIFStream *nif) override { NiSwitchNode::read(nif); - mInterval = nif->getFloat(); + mDuration = nif->getFloat(); } }; diff --git a/components/nifosg/nifloader.cpp b/components/nifosg/nifloader.cpp index 9cd2685747..403fc8fef8 100644 --- a/components/nifosg/nifloader.cpp +++ b/components/nifosg/nifloader.cpp @@ -417,19 +417,33 @@ namespace NifOsg return switchNode; } - static osg::ref_ptr handleSequenceNode(const Nif::NiFltAnimationNode* niFltAnimationNode) + static osg::ref_ptr prepareSequenceNode(const Nif::Node* nifNode) { + const Nif::NiFltAnimationNode* niFltAnimationNode = static_cast(nifNode); osg::ref_ptr sequenceNode (new osg::Sequence); sequenceNode->setName(niFltAnimationNode->name); - sequenceNode->setDefaultTime(niFltAnimationNode->mInterval); - sequenceNode->setMode(osg::Sequence::START); - if (niFltAnimationNode->flags & Nif::NiFltAnimationNode::Flag_Reverse) - sequenceNode->setDuration(0.2f, -1); - else - sequenceNode->setDuration(-0.2f, -1); + if (niFltAnimationNode->children.length()!=0) + { + if (niFltAnimationNode->flags & Nif::NiFltAnimationNode::Flag_Swing) + sequenceNode->setDefaultTime(niFltAnimationNode->mDuration/(niFltAnimationNode->children.length()*2)); + else + sequenceNode->setDefaultTime(niFltAnimationNode->mDuration/niFltAnimationNode->children.length()); + } return sequenceNode; } + static void activateSequenceNode(osg::Group* osgNode, const Nif::Node* nifNode) + { + const Nif::NiFltAnimationNode* niFltAnimationNode = static_cast(nifNode); + osg::Sequence* sequenceNode = static_cast(osgNode); + if (niFltAnimationNode->flags & Nif::NiFltAnimationNode::Flag_Swing) + sequenceNode->setInterval(osg::Sequence::SWING, 0,-1); + else + sequenceNode->setInterval(osg::Sequence::LOOP, 0,-1); + sequenceNode->setDuration(1.0f, -1); + sequenceNode->setMode(osg::Sequence::START); + } + osg::ref_ptr handleSourceTexture(const Nif::NiSourceTexture* st, Resource::ImageManager* imageManager) { if (!st) @@ -727,8 +741,7 @@ namespace NifOsg } else if (nifNode->recType == Nif::RC_NiFltAnimationNode) { - const Nif::NiFltAnimationNode* niFltAnimationNode = static_cast(nifNode); - osg::ref_ptr sequenceNode = handleSequenceNode(niFltAnimationNode); + osg::ref_ptr sequenceNode = prepareSequenceNode(nifNode); node->addChild(sequenceNode); currentNode = sequenceNode; } @@ -752,6 +765,9 @@ namespace NifOsg } } + if (nifNode->recType == Nif::RC_NiFltAnimationNode) + activateSequenceNode(currentNode,nifNode); + return node; }