mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-09-13 14:25:24 -04:00
Extend the animation priority system to one priority value per bone group / distinct blend mask
This commit is contained in:
parent
335ef97cf5
commit
e93a578f23
@ -461,7 +461,7 @@ namespace MWRender
|
|||||||
mTextKeyListener->handleTextKey(groupname, key, map);
|
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)
|
const std::string &start, const std::string &stop, float startpoint, size_t loops, bool loopfallback)
|
||||||
{
|
{
|
||||||
if(!mObjectRoot || mAnimSources.empty())
|
if(!mObjectRoot || mAnimSources.empty())
|
||||||
@ -473,8 +473,6 @@ namespace MWRender
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
priority = std::max(0, priority);
|
|
||||||
|
|
||||||
AnimStateMap::iterator stateiter = mStates.begin();
|
AnimStateMap::iterator stateiter = mStates.begin();
|
||||||
while(stateiter != mStates.end())
|
while(stateiter != mStates.end())
|
||||||
{
|
{
|
||||||
@ -653,7 +651,7 @@ namespace MWRender
|
|||||||
if(!(state->second.mBlendMask&(1<<blendMask)))
|
if(!(state->second.mBlendMask&(1<<blendMask)))
|
||||||
continue;
|
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;
|
active = state;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -690,6 +688,7 @@ namespace MWRender
|
|||||||
addControllers();
|
addControllers();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: remove
|
||||||
void Animation::changeBlendMask(const std::string &groupname, int mask)
|
void Animation::changeBlendMask(const std::string &groupname, int mask)
|
||||||
{
|
{
|
||||||
AnimStateMap::iterator stateiter = mStates.find(groupname);
|
AnimStateMap::iterator stateiter = mStates.find(groupname);
|
||||||
@ -1208,9 +1207,10 @@ namespace MWRender
|
|||||||
{
|
{
|
||||||
for (AnimStateMap::const_iterator stateiter = mStates.begin(); stateiter != mStates.end(); ++stateiter)
|
for (AnimStateMap::const_iterator stateiter = mStates.begin(); stateiter != mStates.end(); ++stateiter)
|
||||||
{
|
{
|
||||||
if((stateiter->second.mPriority > MWMechanics::Priority_Movement
|
if (stateiter->second.mPriority.contains(int(MWMechanics::Priority_Hit))
|
||||||
&& stateiter->second.mPriority < MWMechanics::Priority_Torch)
|
|| stateiter->second.mPriority.contains(int(MWMechanics::Priority_Weapon))
|
||||||
|| stateiter->second.mPriority == MWMechanics::Priority_Death)
|
|| stateiter->second.mPriority.contains(int(MWMechanics::Priority_Knockdown))
|
||||||
|
|| stateiter->second.mPriority.contains(int(MWMechanics::Priority_Death)))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
@ -118,6 +118,35 @@ protected:
|
|||||||
|
|
||||||
struct AnimSource;
|
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 {
|
struct AnimState {
|
||||||
boost::shared_ptr<AnimSource> mSource;
|
boost::shared_ptr<AnimSource> mSource;
|
||||||
float mStartTime;
|
float mStartTime;
|
||||||
@ -132,7 +161,7 @@ protected:
|
|||||||
bool mPlaying;
|
bool mPlaying;
|
||||||
size_t mLoopCount;
|
size_t mLoopCount;
|
||||||
|
|
||||||
int mPriority;
|
AnimPriority mPriority;
|
||||||
int mBlendMask;
|
int mBlendMask;
|
||||||
bool mAutoDisable;
|
bool mAutoDisable;
|
||||||
|
|
||||||
@ -319,7 +348,7 @@ public:
|
|||||||
* \param loopFallback Allow looping an animation that has no loop keys, i.e. fall back to use
|
* \param loopFallback Allow looping an animation that has no loop keys, i.e. fall back to use
|
||||||
* the "start" and "stop" keys for looping?
|
* 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 speedmult, const std::string &start, const std::string &stop,
|
||||||
float startpoint, size_t loops, bool loopfallback=false);
|
float startpoint, size_t loops, bool loopfallback=false);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user