1
0
Fork 1
mirror of https://github.com/TES3MP/openmw-tes3mp.git synced 2025-07-10 00:51:35 +00:00

Cache the Animation's Skeleton

This commit is contained in:
scrawl 2015-12-03 20:06:00 +01:00
parent eb458bf9c8
commit 795f6d77f2
2 changed files with 9 additions and 5 deletions

View file

@ -311,6 +311,7 @@ namespace MWRender
Animation::Animation(const MWWorld::Ptr &ptr, osg::ref_ptr<osg::Group> parentNode, Resource::ResourceSystem* resourceSystem) Animation::Animation(const MWWorld::Ptr &ptr, osg::ref_ptr<osg::Group> parentNode, Resource::ResourceSystem* resourceSystem)
: mInsert(parentNode) : mInsert(parentNode)
, mSkeleton(NULL)
, mPtr(ptr) , mPtr(ptr)
, mResourceSystem(resourceSystem) , mResourceSystem(resourceSystem)
, mAccumulate(1.f, 1.f, 0.f) , mAccumulate(1.f, 1.f, 0.f)
@ -338,10 +339,8 @@ namespace MWRender
void Animation::setActive(bool active) void Animation::setActive(bool active)
{ {
if (SceneUtil::Skeleton* skel = dynamic_cast<SceneUtil::Skeleton*>(mObjectRoot.get())) if (mSkeleton)
{ mSkeleton->setActive(active);
skel->setActive(active);
}
} }
void Animation::updatePtr(const MWWorld::Ptr &ptr) void Animation::updatePtr(const MWWorld::Ptr &ptr)
@ -965,6 +964,7 @@ namespace MWRender
mObjectRoot->getParent(0)->removeChild(mObjectRoot); mObjectRoot->getParent(0)->removeChild(mObjectRoot);
} }
mObjectRoot = NULL; mObjectRoot = NULL;
mSkeleton = NULL;
mNodeMap.clear(); mNodeMap.clear();
mActiveControllers.clear(); mActiveControllers.clear();
@ -976,9 +976,11 @@ namespace MWRender
else else
{ {
osg::ref_ptr<osg::Node> newObjectRoot = mResourceSystem->getSceneManager()->createInstance(model); osg::ref_ptr<osg::Node> newObjectRoot = mResourceSystem->getSceneManager()->createInstance(model);
if (!dynamic_cast<SceneUtil::Skeleton*>(newObjectRoot.get())) mSkeleton = dynamic_cast<SceneUtil::Skeleton*>(newObjectRoot.get());
if (!mSkeleton)
{ {
osg::ref_ptr<SceneUtil::Skeleton> skel = new SceneUtil::Skeleton; osg::ref_ptr<SceneUtil::Skeleton> skel = new SceneUtil::Skeleton;
mSkeleton = skel.get();
skel->addChild(newObjectRoot); skel->addChild(newObjectRoot);
newObjectRoot = skel; newObjectRoot = skel;
} }

View file

@ -24,6 +24,7 @@ namespace NifOsg
namespace SceneUtil namespace SceneUtil
{ {
class LightSource; class LightSource;
class Skeleton;
} }
namespace MWRender namespace MWRender
@ -208,6 +209,7 @@ protected:
osg::ref_ptr<osg::Group> mInsert; osg::ref_ptr<osg::Group> mInsert;
osg::ref_ptr<osg::Node> mObjectRoot; osg::ref_ptr<osg::Node> mObjectRoot;
SceneUtil::Skeleton* mSkeleton;
// The node expected to accumulate movement during movement animations. // The node expected to accumulate movement during movement animations.
osg::ref_ptr<osg::Node> mAccumRoot; osg::ref_ptr<osg::Node> mAccumRoot;