mirror of
https://github.com/OpenMW/openmw.git
synced 2025-01-21 01:23:53 +00:00
appropriate camera vanity<>preview mode switch + hit recoils fix
This commit is contained in:
parent
46519062d3
commit
d41f27451b
5 changed files with 21 additions and 11 deletions
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 false;
|
||||
return true;
|
||||
}
|
||||
|
||||
void Animation::addEffect(const std::string &model, int effectId, bool loop, const std::string &bonename, std::string texture)
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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)
|
||||
|
@ -358,7 +358,7 @@ namespace MWRender
|
|||
Ogre::TagPoint *tag = mAnimation->attachObjectToBone("Head", mCamera);
|
||||
tag->setInheritOrientation(false);
|
||||
}
|
||||
else
|
||||
else
|
||||
{
|
||||
mAnimation->setViewMode(NpcAnimation::VM_Normal);
|
||||
mCameraNode->attachObject(mCamera);
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue