From ae55ad2b509be6c240bfd2c7528ad77f04ac224b Mon Sep 17 00:00:00 2001 From: Azaezel Date: Fri, 11 Jul 2014 06:58:19 -0500 Subject: [PATCH] revised checkInLos and CheckFoV. boith now take all parameters as optional as suggested, with a target value of NULL resulting in checking the present one. cleaned up internal usage of checkInLos, tightened the typemask used, and provided further documentation. --- Engine/source/T3D/aiPlayer.cpp | 61 +++++++++++++++++++++++----------- Engine/source/T3D/aiPlayer.h | 4 +-- 2 files changed, 44 insertions(+), 21 deletions(-) diff --git a/Engine/source/T3D/aiPlayer.cpp b/Engine/source/T3D/aiPlayer.cpp index d3aed1fd4..fd0c179a3 100644 --- a/Engine/source/T3D/aiPlayer.cpp +++ b/Engine/source/T3D/aiPlayer.cpp @@ -29,8 +29,7 @@ #include "console/engineAPI.h" static U32 sAIPlayerLoSMask = TerrainObjectType | WaterObjectType | - ShapeBaseObjectType | StaticShapeObjectType | - PlayerObjectType | ItemObjectType; + ShapeBaseObjectType | StaticShapeObjectType; IMPLEMENT_CO_NETOBJECT_V1(AIPlayer); @@ -423,13 +422,15 @@ bool AIPlayer::getAIMove(Move *movePtr) // which is not very accurate. if (mAimObject) { - mTargetInLOS = checkInLos(mAimObject.getPointer(), false); - if (mTargetInLOS) + if (checkInLos(mAimObject.getPointer())) { - throwCallback("onTargetEnterLOS"); - mTargetInLOS = true; + if (!mTargetInLOS) + { + throwCallback("onTargetEnterLOS"); + mTargetInLOS = true; + } } - else + else if (mTargetInLOS) { throwCallback("onTargetExitLOS"); mTargetInLOS = false; @@ -605,11 +606,16 @@ DefineEngineMethod( AIPlayer, getAimObject, S32, (),, GameBase* obj = object->getAimObject(); return obj? obj->getId(): -1; } - -bool AIPlayer::checkInLos(GameBase* target, bool _checkEnabled = false) + +bool AIPlayer::checkInLos(GameBase* target, bool _useMuzzle, bool _checkEnabled) { if (!isServerObject()) return false; - if (!(bool(target))) return false; + if (!(bool(target))) + { + target = mAimObject.getPointer(); + if (!(bool(target))) + return false; + } if (_checkEnabled) { ShapeBase *shapeBaseCheck = dynamic_cast(target); @@ -626,9 +632,18 @@ bool AIPlayer::checkInLos(GameBase* target, bool _checkEnabled = false) { target->getMountedObject(i)->disableCollision(); } - Point3F muzzlePoint; - getMuzzlePointAI(0, &muzzlePoint); - bool hit = gServerContainer.castRay(muzzlePoint, target->getBoxCenter(), sAIPlayerLoSMask, &ri); + + Point3F checkPoint ; + if (_useMuzzle) + getMuzzlePointAI(0, &checkPoint ); + else + { + MatrixF eyeMat; + getEyeTransform(&eyeMat); + eyeMat.getColumn(3, &checkPoint ); + } + + bool hit = gServerContainer.castRay(checkPoint , target->getBoxCenter(), sAIPlayerLoSMask, &ri); enableCollision(); for (S32 i = 0; i < mountCount; i++) @@ -644,6 +659,7 @@ bool AIPlayer::checkInLos(GameBase* target, bool _checkEnabled = false) return hit; } + bool AIPlayer::checkLosClear(Point3F _pos) { if (!isServerObject()) return false; @@ -660,13 +676,17 @@ bool AIPlayer::checkLosClear(Point3F _pos) return emptySpace; } -DefineEngineMethod(AIPlayer, checkInLos, bool, (ShapeBase* obj, bool checkEnabled), (0, false), - "@brief Check for an object in line of sight.\n") +DefineEngineMethod(AIPlayer, checkInLos, bool, (ShapeBase* obj, bool useMuzzle, bool checkEnabled),(NULL, false, false), + "@brief Check for an object in line of sight.\n" + "@obj Object to check. if blank it will check the current target.\n" + "@useMuzzle Use muzzle position (otherwise use eye position).\n" + "@checkEnabled check if the object is not disabled.\n") { - return object->checkInLos(obj, checkEnabled); + return object->checkInLos(obj, useMuzzle, checkEnabled); } -bool AIPlayer::checkInFoV(GameBase* target, F32 camFov, bool _checkEnabled = false) + +bool AIPlayer::checkInFoV(GameBase* target, F32 camFov, bool _checkEnabled) { if (!isServerObject()) return false; if (!(bool(target))) return false; @@ -700,8 +720,11 @@ bool AIPlayer::checkInFoV(GameBase* target, F32 camFov, bool _checkEnabled = fal return (dot > camFov); } -DefineEngineMethod(AIPlayer, checkInFoV, bool, (ShapeBase* obj, F32 fov, bool checkEnabled), (0, 45, false), - "@brief Check for an object within a specified veiw cone.\n") +DefineEngineMethod(AIPlayer, checkInFoV, bool, (ShapeBase* obj, F32 fov, bool checkEnabled), (NULL, 45.0f, false), + "@brief Check for an object within a specified veiw cone.\n" + "@obj Object to check. if blank it will check the current target.\n" + "@fov view angle (in degrees)\n" + "@checkEnabled check if the object is not disabled.\n") { return object->checkInFoV(obj, fov, checkEnabled); } \ No newline at end of file diff --git a/Engine/source/T3D/aiPlayer.h b/Engine/source/T3D/aiPlayer.h index 283db14db..851482021 100644 --- a/Engine/source/T3D/aiPlayer.h +++ b/Engine/source/T3D/aiPlayer.h @@ -80,9 +80,9 @@ public: void setAimLocation( const Point3F &location ); Point3F getAimLocation() const { return mAimLocation; } void clearAim(); - bool checkInLos(GameBase* target, bool _checkEnabled); + bool checkInLos(GameBase* target = NULL, bool _useMuzzle = false, bool _checkEnabled = false); bool checkLosClear(Point3F _pos); - bool checkInFoV(GameBase* target, F32 camFov, bool _checkEnabled); + bool checkInFoV(GameBase* target = NULL, F32 camFov = 45.0f, bool _checkEnabled = false); // Movement sets/gets void setMoveSpeed( const F32 speed );