aiinfo subclass inheritance cleanups, and default constructor removals for safeties

This commit is contained in:
AzaezelX 2025-04-17 14:38:27 -05:00
parent 4f87ad4cf7
commit c72c3068f8
6 changed files with 63 additions and 13 deletions

View file

@ -23,7 +23,7 @@
#define _AIAIMTARGET_H_ #define _AIAIMTARGET_H_
#include "AIInfo.h" #include "AIInfo.h"
struct AIAimTarget : AIInfo struct AIAimTarget : public AIInfo
{ {
typedef AIInfo Parent; typedef AIInfo Parent;
Point3F mAimOffset; Point3F mAimOffset;
@ -32,6 +32,7 @@ struct AIAimTarget : AIInfo
bool checkInLos(SceneObject* target = NULL, bool _useMuzzle = false, bool _checkEnabled = false); bool checkInLos(SceneObject* target = NULL, bool _useMuzzle = false, bool _checkEnabled = false);
bool checkInFoV(SceneObject* target = NULL, F32 camFov = 45.0f, bool _checkEnabled = false); bool checkInFoV(SceneObject* target = NULL, F32 camFov = 45.0f, bool _checkEnabled = false);
F32 getTargetDistance(SceneObject* target, bool _checkEnabled); F32 getTargetDistance(SceneObject* target, bool _checkEnabled);
AIAimTarget() = delete;
AIAimTarget(AIController* controller) : Parent(controller) { mTargetInLOS = false; }; AIAimTarget(AIController* controller) : Parent(controller) { mTargetInLOS = false; };
AIAimTarget(AIController* controller, SimObjectPtr<SceneObject> objIn, F32 radIn) : Parent(controller, objIn, radIn) { mTargetInLOS = false; }; AIAimTarget(AIController* controller, SimObjectPtr<SceneObject> objIn, F32 radIn) : Parent(controller, objIn, radIn) { mTargetInLOS = false; };
AIAimTarget(AIController* controller, Point3F pointIn, F32 radIn) : Parent(controller, pointIn, radIn) { mTargetInLOS = false; }; AIAimTarget(AIController* controller, Point3F pointIn, F32 radIn) : Parent(controller, pointIn, radIn) { mTargetInLOS = false; };

View file

@ -64,6 +64,48 @@ bool AIController::setControllerDataProperty(void* obj, const char* index, const
return false; return false;
} }
void AIController::setGoal(AIInfo* targ)
{
if (mGoal) { delete(mGoal); mGoal = NULL; }
if (targ->mObj.isValid())
{
delete(mGoal);
mGoal = new AIGoal(this, targ->mObj, targ->mRadius);
}
else if (targ->mPosSet)
{
delete(mGoal);
mGoal = new AIGoal(this, targ->mPosition, targ->mRadius);
}
}
void AIController::setGoal(Point3F loc, F32 rad)
{
if (mGoal) delete(mGoal);
mGoal = new AIGoal(this, loc, rad);
}
void AIController::setGoal(SimObjectPtr<SceneObject> objIn, F32 rad)
{
if (mGoal) delete(mGoal);
mGoal = new AIGoal(this, objIn, rad);
}
void AIController::setAim(Point3F loc, F32 rad, Point3F offset)
{
if (mAimTarget) delete(mAimTarget);
mAimTarget = new AIAimTarget(this, loc, rad);
mAimTarget->mAimOffset = offset;
}
void AIController::setAim(SimObjectPtr<SceneObject> objIn, F32 rad, Point3F offset)
{
if (mAimTarget) delete(mAimTarget);
mAimTarget = new AIAimTarget(this, objIn, rad);
mAimTarget->mAimOffset = offset;
}
#ifdef TORQUE_NAVIGATION_ENABLED #ifdef TORQUE_NAVIGATION_ENABLED
bool AIController::getAIMove(Move* movePtr) bool AIController::getAIMove(Move* movePtr)
{ {
@ -89,7 +131,7 @@ bool AIController::getAIMove(Move* movePtr)
{ {
if (getGoal()->mObj.isValid()) if (getGoal()->mObj.isValid())
getNav()->followObject(getGoal()->mObj, mControllerData->mFollowTolerance); getNav()->followObject(getGoal()->mObj, mControllerData->mFollowTolerance);
else else if (getGoal()->mPosSet)
getNav()->setPathDestination(getGoal()->getPosition()); getNav()->setPathDestination(getGoal()->getPosition());
} }
} }

View file

@ -55,16 +55,16 @@ public:
private: private:
AIGoal* mGoal; AIGoal* mGoal;
public: public:
void setGoal(AIInfo* targ) { mGoal = (targ) ? new AIGoal(this, targ->getPosition(), targ->mRadius) : NULL; } void setGoal(AIInfo* targ);
void setGoal(Point3F loc, F32 rad = 0.0f) { delete(mGoal); mGoal = new AIGoal(this, loc, rad); } void setGoal(Point3F loc, F32 rad = 0.0f);
void setGoal(SimObjectPtr<SceneObject> objIn, F32 rad = 0.0f) { delete(mGoal); mGoal = new AIGoal(this, objIn, rad); } void setGoal(SimObjectPtr<SceneObject> objIn, F32 rad = 0.0f);
AIGoal* getGoal() { return mGoal; } AIGoal* getGoal() { return mGoal; }
void clearGoal() { SAFE_DELETE(mGoal); } void clearGoal() { SAFE_DELETE(mGoal); }
private: private:
AIAimTarget* mAimTarget; AIAimTarget* mAimTarget;
public: public:
void setAim(Point3F loc, F32 rad = 0.0f, Point3F offset = Point3F(0.0f,0.0f,0.0f)) { delete(mAimTarget); mAimTarget = new AIAimTarget(this, loc, rad); mAimTarget->mAimOffset = offset; } void setAim(Point3F loc, F32 rad = 0.0f, Point3F offset = Point3F(0.0f, 0.0f, 0.0f));
void setAim(SimObjectPtr<SceneObject> objIn, F32 rad = 0.0f, Point3F offset = Point3F(0.0f, 0.0f, 0.0f)) { delete(mAimTarget); mAimTarget = new AIAimTarget(this, objIn, rad); mAimTarget->mAimOffset = offset; } void setAim(SimObjectPtr<SceneObject> objIn, F32 rad = 0.0f, Point3F offset = Point3F(0.0f, 0.0f, 0.0f));
AIAimTarget* getAim() { return mAimTarget; } AIAimTarget* getAim() { return mAimTarget; }
void clearAim() { SAFE_DELETE(mAimTarget); } void clearAim() { SAFE_DELETE(mAimTarget); }
private: private:

View file

@ -27,11 +27,12 @@
struct AICover : AIInfo struct AICover : public AIInfo
{ {
typedef AIInfo Parent; typedef AIInfo Parent;
/// Pointer to a cover point. /// Pointer to a cover point.
SimObjectPtr<CoverPoint> mCoverPoint; SimObjectPtr<CoverPoint> mCoverPoint;
AICover() = delete;
AICover(AIController* controller) : Parent(controller) {}; AICover(AIController* controller) : Parent(controller) {};
AICover(AIController* controller, SimObjectPtr<SceneObject> objIn, F32 radIn) : Parent(controller, objIn, radIn) { mCoverPoint = dynamic_cast<CoverPoint*>(objIn.getPointer());}; AICover(AIController* controller, SimObjectPtr<SceneObject> objIn, F32 radIn) : Parent(controller, objIn, radIn) { mCoverPoint = dynamic_cast<CoverPoint*>(objIn.getPointer());};
AICover(AIController* controller, Point3F pointIn, F32 radIn) : Parent(controller, pointIn, radIn) {}; AICover(AIController* controller, Point3F pointIn, F32 radIn) : Parent(controller, pointIn, radIn) {};

View file

@ -24,9 +24,10 @@
#include "AIInfo.h" #include "AIInfo.h"
struct AIGoal : AIInfo struct AIGoal : public AIInfo
{ {
typedef AIInfo Parent; typedef AIInfo Parent;
AIGoal() = delete;
AIGoal(AIController* controller): Parent(controller) {}; AIGoal(AIController* controller): Parent(controller) {};
AIGoal(AIController* controller, SimObjectPtr<SceneObject> objIn, F32 radIn) : Parent(controller, objIn, radIn) {}; AIGoal(AIController* controller, SimObjectPtr<SceneObject> objIn, F32 radIn) : Parent(controller, objIn, radIn) {};
AIGoal(AIController* controller, Point3F pointIn, F32 radIn) : Parent(controller, pointIn, radIn) {}; AIGoal(AIController* controller, Point3F pointIn, F32 radIn) : Parent(controller, pointIn, radIn) {};

View file

@ -64,6 +64,7 @@ NavMesh* AINavigation::findNavMesh() const
void AINavigation::updateNavMesh() void AINavigation::updateNavMesh()
{ {
GameBase* gbo = dynamic_cast<GameBase*>(mControllerRef->getAIInfo()->mObj.getPointer()); GameBase* gbo = dynamic_cast<GameBase*>(mControllerRef->getAIInfo()->mObj.getPointer());
NavMesh* old = mNavMesh;
if (mNavMesh.isNull()) if (mNavMesh.isNull())
mNavMesh = findNavMesh(); mNavMesh = findNavMesh();
else else
@ -72,9 +73,9 @@ void AINavigation::updateNavMesh()
mNavMesh = findNavMesh(); mNavMesh = findNavMesh();
} }
// See if we need to update our path. // See if we need to update our path.
if (mNavMesh) if (mNavMesh != old && !mPathData.path.isNull())
{ {
setPathDestination(getCtrl()->getGoal()->getPosition()); setPathDestination(mPathData.path->mTo);
} }
} }
@ -175,7 +176,11 @@ void AINavigation::onReachDestination()
bool AINavigation::setPathDestination(const Point3F& pos) bool AINavigation::setPathDestination(const Point3F& pos)
{ {
if (!getCtrl()->getGoal()) getCtrl()->setGoal(pos, getCtrl()->mControllerData->mMoveTolerance); AIGoal* curgoal = getCtrl()->getGoal();
if (!curgoal || !curgoal->mObj.isValid())
getCtrl()->setGoal(pos, getCtrl()->mControllerData->mMoveTolerance);
if (!mNavMesh) if (!mNavMesh)
updateNavMesh(); updateNavMesh();
// If we can't find a mesh, just move regularly. // If we can't find a mesh, just move regularly.
@ -191,7 +196,7 @@ bool AINavigation::setPathDestination(const Point3F& pos)
path->mMesh = mNavMesh; path->mMesh = mNavMesh;
path->mFrom = getCtrl()->getAIInfo()->getPosition(); path->mFrom = getCtrl()->getAIInfo()->getPosition();
path->mTo = pos; path->mTo = getCtrl()->getGoal()->getPosition();
path->mFromSet = path->mToSet = true; path->mFromSet = path->mToSet = true;
path->mAlwaysRender = true; path->mAlwaysRender = true;
path->mLinkTypes = getCtrl()->mControllerData->mLinkTypes; path->mLinkTypes = getCtrl()->mControllerData->mLinkTypes;