Don't cache faced handle, as its context may have been changed during the frame by input events

This commit is contained in:
MiroslavR 2014-09-09 17:50:56 +02:00
parent 86c286c24e
commit 7e6e248511
3 changed files with 20 additions and 26 deletions

View file

@ -88,8 +88,6 @@ namespace MWGui
|| (MWBase::Environment::get().getWindowManager()->getMode() == GM_Container) || (MWBase::Environment::get().getWindowManager()->getMode() == GM_Container)
|| (MWBase::Environment::get().getWindowManager()->getMode() == GM_Inventory))) || (MWBase::Environment::get().getWindowManager()->getMode() == GM_Inventory)))
{ {
mFocusObject = MWBase::Environment::get().getWorld()->getFacedObject();
if (mFocusObject.isEmpty ()) if (mFocusObject.isEmpty ())
return; return;

View file

@ -953,9 +953,27 @@ namespace MWWorld
MWWorld::Ptr World::getFacedObject() 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 MWWorld::Ptr();
return searchPtrViaHandle(mFacedHandle);
return searchPtrViaHandle(facedHandle);
} }
std::pair<MWWorld::Ptr,Ogre::Vector3> World::getHitContact(const MWWorld::Ptr &ptr, float distance) std::pair<MWWorld::Ptr,Ogre::Vector3> World::getHitContact(const MWWorld::Ptr &ptr, float distance)
@ -1503,8 +1521,6 @@ namespace MWWorld
Vector3 sun = mRendering->getSkyManager()->getRealSunPos(); Vector3 sun = mRendering->getSkyManager()->getRealSunPos();
mRendering->getSkyManager()->setGlare(!mPhysics->castRay(Ogre::Vector3(p[0], p[1], p[2]), sun)); 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) void World::getFacedHandle(std::string& facedHandle, float maxDistance, bool ignorePlayer)
@ -1534,24 +1550,6 @@ namespace MWWorld
facedHandle = results.front().second; 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 bool World::isCellExterior() const
{ {
CellStore *currentCell = mWorldScene->getCurrentCell(); CellStore *currentCell = mWorldScene->getCurrentCell();

View file

@ -91,7 +91,6 @@ namespace MWWorld
Ptr getPtrViaHandle (const std::string& handle, CellStore& cellStore); Ptr getPtrViaHandle (const std::string& handle, CellStore& cellStore);
int mActivationDistanceOverride; int mActivationDistanceOverride;
std::string mFacedHandle;
std::string mStartupScript; std::string mStartupScript;
@ -112,7 +111,6 @@ namespace MWWorld
void updateWindowManager (); void updateWindowManager ();
void performUpdateSceneQueries (); void performUpdateSceneQueries ();
void updateFacedHandle ();
void getFacedHandle(std::string& facedHandle, float maxDistance, bool ignorePlayer=true); void getFacedHandle(std::string& facedHandle, float maxDistance, bool ignorePlayer=true);
float getMaxActivationDistance (); float getMaxActivationDistance ();