1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-03-31 07:06:45 +00:00

Optimize AI package target comparisons

This commit is contained in:
Evil Eye 2024-01-29 22:25:39 +01:00
parent 8ed7a5319d
commit 340d1423c6
4 changed files with 30 additions and 8 deletions

View file

@ -2083,7 +2083,7 @@ namespace MWMechanics
for (const auto& package : stats.getAiSequence()) for (const auto& package : stats.getAiSequence())
{ {
if (excludeInfighting && !sameActor && package->getTypeId() == AiPackageTypeId::Combat if (excludeInfighting && !sameActor && package->getTypeId() == AiPackageTypeId::Combat
&& package->getTarget() == actorPtr) && package->targetIs(actorPtr))
break; break;
if (package->sideWithTarget() && !package->getTarget().isEmpty()) if (package->sideWithTarget() && !package->getTarget().isEmpty())
{ {
@ -2103,7 +2103,7 @@ namespace MWMechanics
} }
list.push_back(package->getTarget()); list.push_back(package->getTarget());
} }
else if (package->getTarget() == actorPtr) else if (package->targetIs(actorPtr))
{ {
list.push_back(iteratedActor); list.push_back(iteratedActor);
} }
@ -2122,7 +2122,7 @@ namespace MWMechanics
std::vector<MWWorld::Ptr> list; std::vector<MWWorld::Ptr> list;
forEachFollowingPackage( forEachFollowingPackage(
mActors, actorPtr, getPlayer(), [&](const Actor& actor, const std::shared_ptr<AiPackage>& package) { mActors, actorPtr, getPlayer(), [&](const Actor& actor, const std::shared_ptr<AiPackage>& package) {
if (package->followTargetThroughDoors() && package->getTarget() == actorPtr) if (package->followTargetThroughDoors() && package->targetIs(actorPtr))
list.push_back(actor.getPtr()); list.push_back(actor.getPtr());
else if (package->getTypeId() != AiPackageTypeId::Combat else if (package->getTypeId() != AiPackageTypeId::Combat
&& package->getTypeId() != AiPackageTypeId::Wander) && package->getTypeId() != AiPackageTypeId::Wander)
@ -2154,7 +2154,7 @@ namespace MWMechanics
std::vector<int> list; std::vector<int> list;
forEachFollowingPackage( forEachFollowingPackage(
mActors, actor, getPlayer(), [&](const Actor&, const std::shared_ptr<AiPackage>& package) { mActors, actor, getPlayer(), [&](const Actor&, const std::shared_ptr<AiPackage>& package) {
if (package->followTargetThroughDoors() && package->getTarget() == actor) if (package->followTargetThroughDoors() && package->targetIs(actor))
{ {
list.push_back(static_cast<const AiFollow*>(package.get())->getFollowIndex()); list.push_back(static_cast<const AiFollow*>(package.get())->getFollowIndex());
return false; return false;
@ -2172,7 +2172,7 @@ namespace MWMechanics
std::map<int, MWWorld::Ptr> map; std::map<int, MWWorld::Ptr> map;
forEachFollowingPackage( forEachFollowingPackage(
mActors, actor, getPlayer(), [&](const Actor& otherActor, const std::shared_ptr<AiPackage>& package) { mActors, actor, getPlayer(), [&](const Actor& otherActor, const std::shared_ptr<AiPackage>& package) {
if (package->followTargetThroughDoors() && package->getTarget() == actor) if (package->followTargetThroughDoors() && package->targetIs(actor))
{ {
const int index = static_cast<const AiFollow*>(package.get())->getFollowIndex(); const int index = static_cast<const AiFollow*>(package.get())->getFollowIndex();
map[index] = otherActor.getPtr(); map[index] = otherActor.getPtr();

View file

@ -98,6 +98,26 @@ MWWorld::Ptr MWMechanics::AiPackage::getTarget() const
return mCachedTarget; return mCachedTarget;
} }
bool MWMechanics::AiPackage::targetIs(const MWWorld::Ptr& ptr) const
{
if (mTargetActorId == -2)
return ptr.isEmpty();
else if (mTargetActorId == -1)
{
if (mTargetActorRefId.empty())
{
mTargetActorId = -2;
return ptr.isEmpty();
}
if (!ptr.isEmpty() && ptr.getCellRef().getRefId() == mTargetActorRefId)
return getTarget() == ptr;
return false;
}
if (ptr.isEmpty() || !ptr.getClass().isActor())
return false;
return ptr.getClass().getCreatureStats(ptr).getActorId() == mTargetActorId;
}
void MWMechanics::AiPackage::reset() void MWMechanics::AiPackage::reset()
{ {
// reset all members // reset all members

View file

@ -87,6 +87,8 @@ namespace MWMechanics
/// Get the target actor the AI is targeted at (not applicable to all AI packages, default return empty Ptr) /// Get the target actor the AI is targeted at (not applicable to all AI packages, default return empty Ptr)
virtual MWWorld::Ptr getTarget() const; virtual MWWorld::Ptr getTarget() const;
/// Optimized version of getTarget() == ptr
virtual bool targetIs(const MWWorld::Ptr& ptr) const;
/// Get the destination point of the AI package (not applicable to all AI packages, default return (0, 0, 0)) /// Get the destination point of the AI package (not applicable to all AI packages, default return (0, 0, 0))
virtual osg::Vec3f getDestination(const MWWorld::Ptr& actor) const { return osg::Vec3f(0, 0, 0); } virtual osg::Vec3f getDestination(const MWWorld::Ptr& actor) const { return osg::Vec3f(0, 0, 0); }

View file

@ -176,11 +176,11 @@ namespace MWMechanics
if (!isInCombat()) if (!isInCombat())
return false; return false;
for (auto it = mPackages.begin(); it != mPackages.end(); ++it) for (const auto& package : mPackages)
{ {
if ((*it)->getTypeId() == AiPackageTypeId::Combat) if (package->getTypeId() == AiPackageTypeId::Combat)
{ {
if ((*it)->getTarget() == actor) if (package->targetIs(actor))
return true; return true;
} }
} }