mirror of
https://github.com/OpenMW/openmw.git
synced 2025-02-22 18:39:42 +00:00
Avoid storing text keys for each animation
This commit is contained in:
parent
7d59340ed6
commit
2345b5e8b3
4 changed files with 6 additions and 19 deletions
|
@ -121,24 +121,15 @@ void Animation::addObjectList(Ogre::SceneNode *node, const std::string &model, b
|
||||||
Ogre::Bone *bone = boneiter.getNext();
|
Ogre::Bone *bone = boneiter.getNext();
|
||||||
Ogre::UserObjectBindings &bindings = bone->getUserObjectBindings();
|
Ogre::UserObjectBindings &bindings = bone->getUserObjectBindings();
|
||||||
const Ogre::Any &data = bindings.getUserAny(NifOgre::sTextKeyExtraDataID);
|
const Ogre::Any &data = bindings.getUserAny(NifOgre::sTextKeyExtraDataID);
|
||||||
if(data.isEmpty() || !Ogre::any_cast<bool>(data))
|
if(data.isEmpty()) continue;
|
||||||
continue;
|
|
||||||
|
|
||||||
|
objlist.mTextKeys[bone->getHandle()] = Ogre::any_cast<NifOgre::TextKeyMap>(data);
|
||||||
if(!mNonAccumRoot)
|
if(!mNonAccumRoot)
|
||||||
{
|
{
|
||||||
mAccumRoot = mInsert;
|
mAccumRoot = mInsert;
|
||||||
mNonAccumRoot = mSkelBase->getSkeleton()->getBone(bone->getName());
|
mNonAccumRoot = mSkelBase->getSkeleton()->getBone(bone->getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
for(int i = 0;i < skel->getNumAnimations();i++)
|
|
||||||
{
|
|
||||||
Ogre::Animation *anim = skel->getAnimation(i);
|
|
||||||
const Ogre::Any &groupdata = bindings.getUserAny(std::string(NifOgre::sTextKeyExtraDataID)+
|
|
||||||
"@"+anim->getName());
|
|
||||||
if(!groupdata.isEmpty())
|
|
||||||
mTextKeys[anim->getName()] = Ogre::any_cast<NifOgre::TextKeyMap>(groupdata);
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -451,7 +442,7 @@ void Animation::play(const std::string &groupname, const std::string &start, con
|
||||||
{
|
{
|
||||||
Ogre::SkeletonInstance *skel = iter->mSkelBase->getSkeleton();
|
Ogre::SkeletonInstance *skel = iter->mSkelBase->getSkeleton();
|
||||||
mCurrentAnim = skel->getAnimation(groupname);
|
mCurrentAnim = skel->getAnimation(groupname);
|
||||||
mCurrentKeys = &mTextKeys[groupname];
|
mCurrentKeys = &iter->mTextKeys.begin()->second;
|
||||||
mCurrentGroup = groupname;
|
mCurrentGroup = groupname;
|
||||||
mCurrentControllers = &iter->mControllers;
|
mCurrentControllers = &iter->mControllers;
|
||||||
|
|
||||||
|
|
|
@ -46,7 +46,6 @@ protected:
|
||||||
Ogre::SceneNode *mInsert;
|
Ogre::SceneNode *mInsert;
|
||||||
Ogre::Entity *mSkelBase;
|
Ogre::Entity *mSkelBase;
|
||||||
std::vector<NifOgre::ObjectList> mObjectLists;
|
std::vector<NifOgre::ObjectList> mObjectLists;
|
||||||
std::map<std::string,NifOgre::TextKeyMap> mTextKeys;
|
|
||||||
Ogre::Node *mAccumRoot;
|
Ogre::Node *mAccumRoot;
|
||||||
Ogre::Bone *mNonAccumRoot;
|
Ogre::Bone *mNonAccumRoot;
|
||||||
Ogre::Vector3 mAccumulate;
|
Ogre::Vector3 mAccumulate;
|
||||||
|
|
|
@ -50,6 +50,8 @@ struct ObjectList {
|
||||||
// bones in the mSkelBase which are NiCamera nodes.
|
// bones in the mSkelBase which are NiCamera nodes.
|
||||||
std::vector<Ogre::Bone*> mCameras;
|
std::vector<Ogre::Bone*> mCameras;
|
||||||
|
|
||||||
|
std::map<int,TextKeyMap> mTextKeys;
|
||||||
|
|
||||||
std::vector<Ogre::Controller<Ogre::Real> > mControllers;
|
std::vector<Ogre::Controller<Ogre::Real> > mControllers;
|
||||||
|
|
||||||
ObjectList() : mSkelBase(0)
|
ObjectList() : mSkelBase(0)
|
||||||
|
|
|
@ -193,6 +193,7 @@ void NIFSkeletonLoader::buildBones(Ogre::Skeleton *skel, const Nif::Node *node,
|
||||||
const Nif::NiTextKeyExtraData *tk = static_cast<const Nif::NiTextKeyExtraData*>(e.getPtr());
|
const Nif::NiTextKeyExtraData *tk = static_cast<const Nif::NiTextKeyExtraData*>(e.getPtr());
|
||||||
textkeys = extractTextKeys(tk);
|
textkeys = extractTextKeys(tk);
|
||||||
animroot = bone;
|
animroot = bone;
|
||||||
|
bone->getUserObjectBindings().setUserAny(sTextKeyExtraDataID, Ogre::Any(textkeys));
|
||||||
}
|
}
|
||||||
e = e->extra;
|
e = e->extra;
|
||||||
}
|
}
|
||||||
|
@ -255,9 +256,6 @@ void NIFSkeletonLoader::loadResource(Ogre::Resource *resource)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Ogre::UserObjectBindings &bindings = animroot->getUserObjectBindings();
|
|
||||||
bindings.setUserAny(sTextKeyExtraDataID, Ogre::Any(true));
|
|
||||||
|
|
||||||
std::string currentgroup;
|
std::string currentgroup;
|
||||||
TextKeyMap::const_iterator keyiter = textkeys.begin();
|
TextKeyMap::const_iterator keyiter = textkeys.begin();
|
||||||
for(keyiter = textkeys.begin();keyiter != textkeys.end();keyiter++)
|
for(keyiter = textkeys.begin();keyiter != textkeys.end();keyiter++)
|
||||||
|
@ -281,9 +279,6 @@ void NIFSkeletonLoader::loadResource(Ogre::Resource *resource)
|
||||||
}
|
}
|
||||||
|
|
||||||
buildAnimation(skel, currentgroup, ctrls, targets, keyiter->first, lastkeyiter->first);
|
buildAnimation(skel, currentgroup, ctrls, targets, keyiter->first, lastkeyiter->first);
|
||||||
|
|
||||||
TextKeyMap groupkeys(keyiter, ++lastkeyiter);
|
|
||||||
bindings.setUserAny(std::string(sTextKeyExtraDataID)+"@"+currentgroup, Ogre::Any(groupkeys));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue