1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-02-05 11:45:34 +00:00

Animation port complete

This commit is contained in:
scrawl 2015-04-23 23:30:06 +02:00
parent 86b4a610cb
commit 6f3e920f85
4 changed files with 54 additions and 28 deletions

View file

@ -27,6 +27,7 @@
#include <components/sceneutil/lightmanager.hpp> #include <components/sceneutil/lightmanager.hpp>
#include <components/sceneutil/util.hpp> #include <components/sceneutil/util.hpp>
#include <components/sceneutil/lightcontroller.hpp> #include <components/sceneutil/lightcontroller.hpp>
#include <components/sceneutil/skeleton.hpp>
#include "../mwbase/environment.hpp" #include "../mwbase/environment.hpp"
#include "../mwbase/world.hpp" #include "../mwbase/world.hpp"
@ -310,6 +311,18 @@ namespace MWRender
} }
} }
void Animation::clearAnimSources()
{
mStates.clear();
for(size_t i = 0;i < sNumGroups;i++)
mAnimationTimePtr[i]->setAnimName(std::string());
mAccumCtrl = NULL;
mAnimSources.clear();
}
bool Animation::hasAnimation(const std::string &anim) bool Animation::hasAnimation(const std::string &anim)
{ {
AnimSourceList::const_iterator iter(mAnimSources.begin()); AnimSourceList::const_iterator iter(mAnimSources.begin());
@ -668,13 +681,14 @@ namespace MWRender
float Animation::getVelocity(const std::string &groupname) const float Animation::getVelocity(const std::string &groupname) const
{ {
return 0.f; if (!mAccumRoot)
/* return 0.0f;
// Look in reverse; last-inserted source has priority. // Look in reverse; last-inserted source has priority.
AnimSourceList::const_reverse_iterator animsrc(mAnimSources.rbegin()); AnimSourceList::const_reverse_iterator animsrc(mAnimSources.rbegin());
for(;animsrc != mAnimSources.rend();++animsrc) for(;animsrc != mAnimSources.rend();++animsrc)
{ {
const NifOsg::TextKeyMap &keys = (*animsrc)->mTextKeys; const NifOsg::TextKeyMap &keys = (*animsrc)->getTextKeys();
if(findGroupStart(keys, groupname) != keys.end()) if(findGroupStart(keys, groupname) != keys.end())
break; break;
} }
@ -682,15 +696,14 @@ namespace MWRender
return 0.0f; return 0.0f;
float velocity = 0.0f; float velocity = 0.0f;
const NifOsg::TextKeyMap &keys = (*animsrc)->mTextKeys; const NifOsg::TextKeyMap &keys = (*animsrc)->getTextKeys();
const std::vector<Ogre::Controller<Ogre::Real> >&ctrls = (*animsrc)->mControllers[0];
for(size_t i = 0;i < ctrls.size();i++) const AnimSource::ControllerMap& ctrls = (*animsrc)->mControllerMap[0];
for (AnimSource::ControllerMap::const_iterator it = ctrls.begin(); it != ctrls.end(); ++it)
{ {
NifOsg::NodeTargetValue<Ogre::Real> *dstval; if (Misc::StringUtils::ciEqual(it->first, mAccumRoot->getName()))
dstval = static_cast<NifOgre::NodeTargetValue<Ogre::Real>*>(ctrls[i].getDestination().getPointer());
if(dstval->getNode() == mNonAccumRoot)
{ {
velocity = calcAnimVelocity(keys, dstval, mAccumulate, groupname); velocity = calcAnimVelocity(keys, it->second, mAccumulate, groupname);
break; break;
} }
} }
@ -704,15 +717,14 @@ namespace MWRender
while(!(velocity > 1.0f) && ++animiter != mAnimSources.rend()) while(!(velocity > 1.0f) && ++animiter != mAnimSources.rend())
{ {
const NifOgre::TextKeyMap &keys = (*animiter)->mTextKeys; const NifOsg::TextKeyMap &keys = (*animiter)->getTextKeys();
const std::vector<Ogre::Controller<Ogre::Real> >&ctrls = (*animiter)->mControllers[0];
for(size_t i = 0;i < ctrls.size();i++) const AnimSource::ControllerMap& ctrls = (*animiter)->mControllerMap[0];
for (AnimSource::ControllerMap::const_iterator it = ctrls.begin(); it != ctrls.end(); ++it)
{ {
NifOgre::NodeTargetValue<Ogre::Real> *dstval; if (Misc::StringUtils::ciEqual(it->first, mAccumRoot->getName()))
dstval = static_cast<NifOgre::NodeTargetValue<Ogre::Real>*>(ctrls[i].getDestination().getPointer());
if(dstval->getNode() == mNonAccumRoot)
{ {
velocity = calcAnimVelocity(keys, dstval, mAccumulate, groupname); velocity = calcAnimVelocity(keys, it->second, mAccumulate, groupname);
break; break;
} }
} }
@ -720,7 +732,6 @@ namespace MWRender
} }
return velocity; return velocity;
*/
} }
void Animation::updatePosition(float oldtime, float newtime, osg::Vec3f& position) void Animation::updatePosition(float oldtime, float newtime, osg::Vec3f& position)
@ -808,7 +819,7 @@ namespace MWRender
return movement; return movement;
} }
void Animation::setObjectRoot(const std::string &model) void Animation::setObjectRoot(const std::string &model, bool forceskeleton)
{ {
if (mObjectRoot) if (mObjectRoot)
{ {
@ -821,7 +832,20 @@ namespace MWRender
mAccumRoot = NULL; mAccumRoot = NULL;
mAccumCtrl = NULL; mAccumCtrl = NULL;
mObjectRoot = mResourceSystem->getSceneManager()->createInstance(model, mInsert); if (!forceskeleton)
mObjectRoot = mResourceSystem->getSceneManager()->createInstance(model, mInsert);
else
{
osg::ref_ptr<osg::Node> newObjectRoot = mResourceSystem->getSceneManager()->createInstance(model);
if (!dynamic_cast<SceneUtil::Skeleton*>(newObjectRoot.get()))
{
osg::ref_ptr<SceneUtil::Skeleton> skel = new SceneUtil::Skeleton;
skel->addChild(newObjectRoot);
newObjectRoot = skel;
}
mInsert->addChild(newObjectRoot);
mObjectRoot = newObjectRoot;
}
NodeMapVisitor visitor; NodeMapVisitor visitor;
mObjectRoot->accept(visitor); mObjectRoot->accept(visitor);
@ -1062,7 +1086,7 @@ namespace MWRender
{ {
if (!model.empty()) if (!model.empty())
{ {
setObjectRoot(model); setObjectRoot(model, false);
if (!ptr.getClass().getEnchantment(ptr).empty()) if (!ptr.getClass().getEnchantment(ptr).empty())
addGlow(mObjectRoot, getEnchantmentColor(ptr)); addGlow(mObjectRoot, getEnchantmentColor(ptr));

View file

@ -215,12 +215,13 @@ protected:
void handleTextKey(AnimState &state, const std::string &groupname, const std::multimap<float, std::string>::const_iterator &key, void handleTextKey(AnimState &state, const std::string &groupname, const std::multimap<float, std::string>::const_iterator &key,
const std::multimap<float, std::string>& map); const std::multimap<float, std::string>& map);
/* Sets the root model of the object. /** Sets the root model of the object.
* *
* Note that you must make sure all animation sources are cleared before reseting the object * Note that you must make sure all animation sources are cleared before reseting the object
* root. All nodes previously retrieved with getNode will also become invalidated. * root. All nodes previously retrieved with getNode will also become invalidated.
* @param forceskeleton Wrap the object root in a Skeleton, even if it contains no skinned parts. Use this if you intend to add skinned parts manually.
*/ */
void setObjectRoot(const std::string &model); void setObjectRoot(const std::string &model, bool forceskeleton);
/* Adds the keyframe controllers in the specified model as a new animation source. Note that /* Adds the keyframe controllers in the specified model as a new animation source. Note that
* the filename portion of the provided model name will be prepended with 'x', and the .nif * the filename portion of the provided model name will be prepended with 'x', and the .nif
@ -230,7 +231,7 @@ protected:
/** Adds an additional light to the given node using the specified ESM record. */ /** Adds an additional light to the given node using the specified ESM record. */
void addExtraLight(osg::ref_ptr<osg::Group> parent, const ESM::Light *light); void addExtraLight(osg::ref_ptr<osg::Group> parent, const ESM::Light *light);
//void clearAnimSources(); void clearAnimSources();
osg::Vec4f getEnchantmentColor(MWWorld::Ptr item); osg::Vec4f getEnchantmentColor(MWWorld::Ptr item);

View file

@ -26,7 +26,7 @@ CreatureAnimation::CreatureAnimation(const MWWorld::Ptr &ptr,
if(!model.empty()) if(!model.empty())
{ {
setObjectRoot(model /* , baseonly = false */); setObjectRoot(model, false /* , baseonly = false */);
//setRenderProperties(mObjectRoot, RV_Actors, RQG_Main, RQG_Alpha); //setRenderProperties(mObjectRoot, RV_Actors, RQG_Main, RQG_Alpha);
if((ref->mBase->mFlags&ESM::Creature::Bipedal)) if((ref->mBase->mFlags&ESM::Creature::Bipedal))
@ -45,7 +45,7 @@ CreatureWeaponAnimation::CreatureWeaponAnimation(const MWWorld::Ptr &ptr, const
if(!model.empty()) if(!model.empty())
{ {
setObjectRoot(model /* , baseonly = false*/); setObjectRoot(model, true /* , baseonly = false*/);
//setRenderProperties(mObjectRoot, RV_Actors, RQG_Main, RQG_Alpha); //setRenderProperties(mObjectRoot, RV_Actors, RQG_Main, RQG_Alpha);
if((ref->mBase->mFlags&ESM::Creature::Bipedal)) if((ref->mBase->mFlags&ESM::Creature::Bipedal))

View file

@ -233,7 +233,7 @@ void NpcAnimation::rebuild()
void NpcAnimation::updateNpcBase() void NpcAnimation::updateNpcBase()
{ {
//clearAnimSources(); clearAnimSources();
const MWWorld::ESMStore &store = MWBase::Environment::get().getWorld()->getStore(); const MWWorld::ESMStore &store = MWBase::Environment::get().getWorld()->getStore();
const ESM::Race *race = store.get<ESM::Race>().find(mNpc->mRace); const ESM::Race *race = store.get<ESM::Race>().find(mNpc->mRace);
@ -279,7 +279,8 @@ void NpcAnimation::updateNpcBase()
: "meshes\\base_animkna.1st.nif" : "meshes\\base_animkna.1st.nif"
: "meshes\\wolf\\skin.1st.nif"); : "meshes\\wolf\\skin.1st.nif");
smodel = Misc::ResourceHelpers::correctActorModelPath(smodel, mResourceSystem->getVFS()); smodel = Misc::ResourceHelpers::correctActorModelPath(smodel, mResourceSystem->getVFS());
setObjectRoot(smodel /*, baseonly = true*/);
setObjectRoot(smodel, true /*, baseonly = true*/);
if(mViewMode != VM_FirstPerson) if(mViewMode != VM_FirstPerson)
{ {