From e7208bb80e4b676f4ef661bfa85009671b0ddede Mon Sep 17 00:00:00 2001 From: Capostrophic Date: Fri, 24 May 2019 18:40:06 +0300 Subject: [PATCH] Improve face shielding behavior in general case (bug #4240) --- CHANGELOG.md | 1 + apps/openmw/mwmechanics/character.cpp | 49 ++++++++++++--------------- apps/openmw/mwworld/weather.cpp | 5 ++- 3 files changed, 25 insertions(+), 30 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f117a09bc..dd677267a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ Bug #3765: DisableTeleporting makes Mark/Recall/Intervention effects undetectable Bug #3778: [Mod] Improved Thrown Weapon Projectiles - weapons have wrong transformation during throw animation Bug #3812: Wrong multiline tooltips width when word-wrapping is enabled + Bug #4240: Ash storm origin coordinates and hand shielding animation behavior are incorrect Bug #4329: Removed birthsign abilities are restored after reloading the save Bug #4383: Bow model obscures crosshair when arrow is drawn Bug #4384: Resist Normal Weapons only checks ammunition for ranged weapons diff --git a/apps/openmw/mwmechanics/character.cpp b/apps/openmw/mwmechanics/character.cpp index 09794d15f..c3eadff59 100644 --- a/apps/openmw/mwmechanics/character.cpp +++ b/apps/openmw/mwmechanics/character.cpp @@ -1119,41 +1119,36 @@ void CharacterController::updatePtr(const MWWorld::Ptr &ptr) void CharacterController::updateIdleStormState(bool inwater) { - bool inStormDirection = false; - if (MWBase::Environment::get().getWorld()->isInStorm()) + if (!mAnimation->hasAnimation("idlestorm") || mUpperBodyState != UpperCharState_Nothing || inwater) { - osg::Vec3f stormDirection = MWBase::Environment::get().getWorld()->getStormDirection(); - osg::Vec3f characterDirection = mPtr.getRefData().getBaseNode()->getAttitude() * osg::Vec3f(0,1,0); - inStormDirection = std::acos(stormDirection * characterDirection / (stormDirection.length() * characterDirection.length())) - > osg::DegreesToRadians(120.f); + mAnimation->disable("idlestorm"); + return; } - if (inStormDirection && !inwater && mUpperBodyState == UpperCharState_Nothing && mAnimation->hasAnimation("idlestorm")) - { - float complete = 0; - mAnimation->getInfo("idlestorm", &complete); - if (complete == 0) - mAnimation->play("idlestorm", Priority_Storm, MWRender::Animation::BlendMask_RightArm, false, - 1.0f, "start", "loop start", 0.0f, 0); - else if (complete == 1) - mAnimation->play("idlestorm", Priority_Storm, MWRender::Animation::BlendMask_RightArm, false, - 1.0f, "loop start", "loop stop", 0.0f, ~0ul); - } - else + if (MWBase::Environment::get().getWorld()->isInStorm()) { - if (mUpperBodyState == UpperCharState_Nothing) + osg::Vec3f stormDirection = MWBase::Environment::get().getWorld()->getStormDirection(); + osg::Vec3f characterDirection = mPtr.getRefData().getBaseNode()->getAttitude() * osg::Vec3f(0,1,0); + stormDirection.normalize(); + characterDirection.normalize(); + if (stormDirection * characterDirection < -0.5f) { - if (mAnimation->isPlaying("idlestorm")) + if (!mAnimation->isPlaying("idlestorm")) { - if (mAnimation->getCurrentTime("idlestorm") < mAnimation->getTextKeyTime("idlestorm: loop stop")) - { - mAnimation->play("idlestorm", Priority_Storm, MWRender::Animation::BlendMask_RightArm, true, - 1.0f, "loop stop", "stop", 0.0f, 0); - } + mAnimation->play("idlestorm", Priority_Storm, MWRender::Animation::BlendMask_RightArm, true, + 1.0f, "start", "stop", 0.0f, ~0ul); + } + else + { + mAnimation->setLoopingEnabled("idlestorm", true); } + return; } - else - mAnimation->disable("idlestorm"); + } + + if (mAnimation->isPlaying("idlestorm")) + { + mAnimation->setLoopingEnabled("idlestorm", false); } } diff --git a/apps/openmw/mwworld/weather.cpp b/apps/openmw/mwworld/weather.cpp index fcb9926be..ce328ba4a 100644 --- a/apps/openmw/mwworld/weather.cpp +++ b/apps/openmw/mwworld/weather.cpp @@ -710,10 +710,9 @@ void WeatherManager::update(float duration, bool paused, const TimeStamp& time, if (mIsStorm) { osg::Vec3f playerPos (player.getRefData().getPosition().asVec3()); - osg::Vec3f redMountainPos (19950, 72032, 27831); - + playerPos.z() = 0; + osg::Vec3f redMountainPos (25000, 70000, 0); mStormDirection = (playerPos - redMountainPos); - mStormDirection.z() = 0; mStormDirection.normalize(); mRendering.getSkyManager()->setStormDirection(mStormDirection); }