1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-01-21 03:53:54 +00:00

appropriate camera vanity<>preview mode switch + hit recoils fix

This commit is contained in:
mrcheko 2014-01-09 23:36:40 +02:00
parent 46519062d3
commit d41f27451b
5 changed files with 21 additions and 11 deletions

View file

@ -179,6 +179,12 @@ void CharacterController::refreshCurrentAnims(CharacterState idle, CharacterStat
mHitState = CharState_Hit;
int iHit = rand() % (sHitListSize-1);
mCurrentHit = sHitList[iHit];
if(mPtr.getRefData().getHandle()=="player" && !mAnimation->hasAnimation(mCurrentHit))
{
//only 4 different hit animations if player is in 1st person
int iHit = rand() % (sHitListSize-3);
mCurrentHit = sHitList[iHit];
}
mAnimation->play(mCurrentHit, Priority_Hit, MWRender::Animation::Group_All, true, 1, "start", "stop", 0.0f, 0);
}
}

View file

@ -387,7 +387,6 @@ Ogre::Node *Animation::getNode(const std::string &name)
return NULL;
}
NifOgre::TextKeyMap::const_iterator Animation::findGroupStart(const NifOgre::TextKeyMap &keys, const std::string &groupname)
{
NifOgre::TextKeyMap::const_iterator iter(keys.begin());
@ -1008,14 +1007,16 @@ void Animation::detachObjectFromBone(Ogre::MovableObject *obj)
mSkelBase->detachObjectFromBone(obj);
}
bool Animation::isPlaying(Group group) const
bool Animation::allowSwitchViewMode() const
{
for (AnimStateMap::const_iterator stateiter = mStates.begin(); stateiter != mStates.end(); ++stateiter)
{
if(stateiter->second.mGroups == group)
return true;
}
if(stateiter->second.mGroups == Group_UpperBody
|| (stateiter->first.size()==4 && stateiter->first.find("hit") != std::string::npos)
|| (stateiter->first.find("knock") != std::string::npos) )
return false;
}
return true;
}
void Animation::addEffect(const std::string &model, int effectId, bool loop, const std::string &bonename, std::string texture)

View file

@ -258,7 +258,7 @@ public:
/** Returns true if the named animation group is playing. */
bool isPlaying(const std::string &groupname) const;
bool isPlaying(Group group) const;
bool allowSwitchViewMode() const;
/** Gets info about the given animation group.
* \param groupname Animation group to check.

View file

@ -107,7 +107,7 @@ namespace MWRender
void Camera::update(float duration, bool paused)
{
if (!mAnimation->isPlaying(MWRender::Animation::Group_UpperBody))
if (mAnimation->allowSwitchViewMode())
{
// Now process the view changes we queued earlier
if (mVanityToggleQueued)
@ -144,7 +144,7 @@ namespace MWRender
{
// Changing the view will stop all playing animations, so if we are playing
// anything important, queue the view change for later
if (mAnimation->isPlaying(MWRender::Animation::Group_UpperBody))
if (!mAnimation->allowSwitchViewMode())
{
mViewModeToggleQueued = true;
return;
@ -171,7 +171,7 @@ namespace MWRender
{
// Changing the view will stop all playing animations, so if we are playing
// anything important, queue the view change for later
if (mAnimation->isPlaying(MWRender::Animation::Group_UpperBody))
if (!mPreviewMode)
{
mVanityToggleQueued = true;
return false;
@ -205,7 +205,7 @@ namespace MWRender
void Camera::togglePreviewMode(bool enable)
{
if (mAnimation->isPlaying(MWRender::Animation::Group_UpperBody))
if (mFirstPersonView && !mAnimation->allowSwitchViewMode())
return;
if(mPreviewMode == enable)

View file

@ -140,6 +140,9 @@ NpcAnimation::NpcAnimation(const MWWorld::Ptr& ptr, Ogre::SceneNode* node, int v
void NpcAnimation::setViewMode(NpcAnimation::ViewMode viewMode)
{
assert(viewMode != VM_HeadOnly);
if(mViewMode == viewMode)
return;
mViewMode = viewMode;
rebuild();
}