From 7e6e248511e5712a7e4510883203b0ecb7183839 Mon Sep 17 00:00:00 2001 From: MiroslavR Date: Tue, 9 Sep 2014 17:50:56 +0200 Subject: [PATCH] Don't cache faced handle, as its context may have been changed during the frame by input events --- apps/openmw/mwgui/tooltips.cpp | 2 -- apps/openmw/mwworld/worldimp.cpp | 42 +++++++++++++++----------------- apps/openmw/mwworld/worldimp.hpp | 2 -- 3 files changed, 20 insertions(+), 26 deletions(-) diff --git a/apps/openmw/mwgui/tooltips.cpp b/apps/openmw/mwgui/tooltips.cpp index aaf4f10b5..5d481fa37 100644 --- a/apps/openmw/mwgui/tooltips.cpp +++ b/apps/openmw/mwgui/tooltips.cpp @@ -88,8 +88,6 @@ namespace MWGui || (MWBase::Environment::get().getWindowManager()->getMode() == GM_Container) || (MWBase::Environment::get().getWindowManager()->getMode() == GM_Inventory))) { - mFocusObject = MWBase::Environment::get().getWorld()->getFacedObject(); - if (mFocusObject.isEmpty ()) return; diff --git a/apps/openmw/mwworld/worldimp.cpp b/apps/openmw/mwworld/worldimp.cpp index ec8433262..3a1ae1b20 100644 --- a/apps/openmw/mwworld/worldimp.cpp +++ b/apps/openmw/mwworld/worldimp.cpp @@ -953,9 +953,27 @@ namespace MWWorld MWWorld::Ptr World::getFacedObject() { - if (mFacedHandle.empty()) + std::string facedHandle; + + if (MWBase::Environment::get().getWindowManager()->isGuiMode() && + MWBase::Environment::get().getWindowManager()->isConsoleMode()) + getFacedHandle(facedHandle, getMaxActivationDistance() * 50, false); + else + { + float telekinesisRangeBonus = + mPlayer->getPlayer().getClass().getCreatureStats(mPlayer->getPlayer()).getMagicEffects() + .get(ESM::MagicEffect::Telekinesis).getMagnitude(); + telekinesisRangeBonus = feetToGameUnits(telekinesisRangeBonus); + + float activationDistance = getMaxActivationDistance() + telekinesisRangeBonus; + + getFacedHandle(facedHandle, activationDistance); + } + + if (facedHandle.empty()) return MWWorld::Ptr(); - return searchPtrViaHandle(mFacedHandle); + + return searchPtrViaHandle(facedHandle); } std::pair World::getHitContact(const MWWorld::Ptr &ptr, float distance) @@ -1503,8 +1521,6 @@ namespace MWWorld Vector3 sun = mRendering->getSkyManager()->getRealSunPos(); mRendering->getSkyManager()->setGlare(!mPhysics->castRay(Ogre::Vector3(p[0], p[1], p[2]), sun)); } - - updateFacedHandle (); } void World::getFacedHandle(std::string& facedHandle, float maxDistance, bool ignorePlayer) @@ -1534,24 +1550,6 @@ namespace MWWorld facedHandle = results.front().second; } - void World::updateFacedHandle () - { - if (MWBase::Environment::get().getWindowManager()->isGuiMode() && - MWBase::Environment::get().getWindowManager()->isConsoleMode()) - getFacedHandle(mFacedHandle, getMaxActivationDistance() * 50, false); - else - { - float telekinesisRangeBonus = - mPlayer->getPlayer().getClass().getCreatureStats(mPlayer->getPlayer()).getMagicEffects() - .get(ESM::MagicEffect::Telekinesis).getMagnitude(); - telekinesisRangeBonus = feetToGameUnits(telekinesisRangeBonus); - - float activationDistance = getMaxActivationDistance() + telekinesisRangeBonus; - - getFacedHandle(mFacedHandle, activationDistance); - } - } - bool World::isCellExterior() const { CellStore *currentCell = mWorldScene->getCurrentCell(); diff --git a/apps/openmw/mwworld/worldimp.hpp b/apps/openmw/mwworld/worldimp.hpp index 5e4c9155a..54827d042 100644 --- a/apps/openmw/mwworld/worldimp.hpp +++ b/apps/openmw/mwworld/worldimp.hpp @@ -91,7 +91,6 @@ namespace MWWorld Ptr getPtrViaHandle (const std::string& handle, CellStore& cellStore); int mActivationDistanceOverride; - std::string mFacedHandle; std::string mStartupScript; @@ -112,7 +111,6 @@ namespace MWWorld void updateWindowManager (); void performUpdateSceneQueries (); - void updateFacedHandle (); void getFacedHandle(std::string& facedHandle, float maxDistance, bool ignorePlayer=true); float getMaxActivationDistance ();