1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-02-21 22:39:41 +00:00

Merge branch 'refactor/headtracking' into 'master'

Small improvement for headtracking

See merge request OpenMW/openmw!1683
This commit is contained in:
Petr Mikheev 2022-03-03 20:39:53 +00:00
commit df41b4080d

View file

@ -1457,26 +1457,32 @@ namespace MWMechanics
MWMechanics::CreatureStats& stats = iter->first.getClass().getCreatureStats(iter->first); MWMechanics::CreatureStats& stats = iter->first.getClass().getCreatureStats(iter->first);
bool firstPersonPlayer = isPlayer && world->isFirstPerson(); bool firstPersonPlayer = isPlayer && world->isFirstPerson();
bool inCombatOrPursue = stats.getAiSequence().isInCombat() || stats.getAiSequence().hasPackage(AiPackageTypeId::Pursue);
MWWorld::Ptr activePackageTarget;
// 1. Unconsious actor can not track target // 1. Unconsious actor can not track target
// 2. Actors in combat and pursue mode do not bother to headtrack anyone except their target // 2. Actors in combat and pursue mode do not bother to headtrack anyone except their target
// 3. Player character does not use headtracking in the 1st-person view // 3. Player character does not use headtracking in the 1st-person view
if (!stats.getKnockedDown() && !firstPersonPlayer) if (!stats.getKnockedDown() && !firstPersonPlayer)
{ {
bool inCombatOrPursue = stats.getAiSequence().isInCombat() || stats.getAiSequence().isInPursuit();
if (inCombatOrPursue) if (inCombatOrPursue)
activePackageTarget = stats.getAiSequence().getActivePackage().getTarget();
for (PtrActorMap::iterator it(mActors.begin()); it != mActors.end(); ++it)
{ {
if (it->first == iter->first) auto activePackageTarget = stats.getAiSequence().getActivePackage().getTarget();
continue; if (!activePackageTarget.isEmpty())
{
// Track the specified target of package.
updateHeadTracking(iter->first, activePackageTarget, headTrackTarget, sqrHeadTrackDistance, inCombatOrPursue);
}
}
else
{
// Find something nearby.
for (auto& [ptr, _] : mActors)
{
if (ptr == iter->first)
continue;
if (inCombatOrPursue && it->first != activePackageTarget) updateHeadTracking(iter->first, ptr, headTrackTarget, sqrHeadTrackDistance, inCombatOrPursue);
continue; }
updateHeadTracking(iter->first, it->first, headTrackTarget, sqrHeadTrackDistance, inCombatOrPursue);
} }
} }