1
0
Fork 1
mirror of https://github.com/TES3MP/openmw-tes3mp.git synced 2025-02-06 18:15:32 +00:00

Extend the animation priority system to one priority value per bone group / distinct blend mask

This commit is contained in:
scrawl 2015-07-15 14:18:31 +02:00
parent 335ef97cf5
commit e93a578f23
2 changed files with 38 additions and 9 deletions

View file

@ -461,7 +461,7 @@ namespace MWRender
mTextKeyListener->handleTextKey(groupname, key, map);
}
void Animation::play(const std::string &groupname, int priority, int blendMask, bool autodisable, float speedmult,
void Animation::play(const std::string &groupname, AnimPriority priority, int blendMask, bool autodisable, float speedmult,
const std::string &start, const std::string &stop, float startpoint, size_t loops, bool loopfallback)
{
if(!mObjectRoot || mAnimSources.empty())
@ -473,8 +473,6 @@ namespace MWRender
return;
}
priority = std::max(0, priority);
AnimStateMap::iterator stateiter = mStates.begin();
while(stateiter != mStates.end())
{
@ -653,7 +651,7 @@ namespace MWRender
if(!(state->second.mBlendMask&(1<<blendMask)))
continue;
if(active == mStates.end() || active->second.mPriority < state->second.mPriority)
if(active == mStates.end() || active->second.mPriority.mPriority[blendMask] < state->second.mPriority.mPriority[blendMask])
active = state;
}
@ -690,6 +688,7 @@ namespace MWRender
addControllers();
}
// TODO: remove
void Animation::changeBlendMask(const std::string &groupname, int mask)
{
AnimStateMap::iterator stateiter = mStates.find(groupname);
@ -1208,9 +1207,10 @@ namespace MWRender
{
for (AnimStateMap::const_iterator stateiter = mStates.begin(); stateiter != mStates.end(); ++stateiter)
{
if((stateiter->second.mPriority > MWMechanics::Priority_Movement
&& stateiter->second.mPriority < MWMechanics::Priority_Torch)
|| stateiter->second.mPriority == MWMechanics::Priority_Death)
if (stateiter->second.mPriority.contains(int(MWMechanics::Priority_Hit))
|| stateiter->second.mPriority.contains(int(MWMechanics::Priority_Weapon))
|| stateiter->second.mPriority.contains(int(MWMechanics::Priority_Knockdown))
|| stateiter->second.mPriority.contains(int(MWMechanics::Priority_Death)))
return false;
}
return true;

View file

@ -118,6 +118,35 @@ protected:
struct AnimSource;
/// Holds an animation priority value for each distinct bone blendmask.
struct AnimPriority
{
/// Convenience constructor, initialises all priorities to the same value.
AnimPriority(int priority)
{
for (unsigned int i=0; i<sNumBlendMasks; ++i)
mPriority[i] = priority;
}
bool operator == (const AnimPriority& other) const
{
for (unsigned int i=0; i<sNumBlendMasks; ++i)
if (other.mPriority[i] != mPriority[i])
return false;
return true;
}
bool contains(int priority) const
{
for (unsigned int i=0; i<sNumBlendMasks; ++i)
if (priority == mPriority[i])
return true;
return false;
}
int mPriority[sNumBlendMasks];
};
struct AnimState {
boost::shared_ptr<AnimSource> mSource;
float mStartTime;
@ -132,7 +161,7 @@ protected:
bool mPlaying;
size_t mLoopCount;
int mPriority;
AnimPriority mPriority;
int mBlendMask;
bool mAutoDisable;
@ -319,7 +348,7 @@ public:
* \param loopFallback Allow looping an animation that has no loop keys, i.e. fall back to use
* the "start" and "stop" keys for looping?
*/
void play(const std::string &groupname, int priority, int blendMask, bool autodisable,
void play(const std::string &groupname, AnimPriority priority, int blendMask, bool autodisable,
float speedmult, const std::string &start, const std::string &stop,
float startpoint, size_t loops, bool loopfallback=false);