diff options
author | Nick Samarin <nicks1987@bigmir.net> | 2010-06-05 03:29:49 +0400 |
---|---|---|
committer | Nick Samarin <nicks1987@bigmir.net> | 2010-06-05 03:29:49 +0400 |
commit | 0932f365bfefb5ddabcc042abfa5f3d3a5c0246e (patch) | |
tree | 522e53fbae9257b3a5ca56cf23a3136cb005dbf5 /source/gameengine/Ketsji/KX_SteeringActuator.cpp | |
parent | 1be4a74f6c1ca7c1698e2f7eaed3d7c4a7071dac (diff) |
added obstacle avoidance code; object movement is implemented via setting velocity
Diffstat (limited to 'source/gameengine/Ketsji/KX_SteeringActuator.cpp')
-rw-r--r-- | source/gameengine/Ketsji/KX_SteeringActuator.cpp | 147 |
1 files changed, 92 insertions, 55 deletions
diff --git a/source/gameengine/Ketsji/KX_SteeringActuator.cpp b/source/gameengine/Ketsji/KX_SteeringActuator.cpp index 803ed510f45..45f3482ed5b 100644 --- a/source/gameengine/Ketsji/KX_SteeringActuator.cpp +++ b/source/gameengine/Ketsji/KX_SteeringActuator.cpp @@ -35,6 +35,7 @@ #include "KX_SteeringActuator.h" #include "KX_GameObject.h" #include "KX_NavMeshObject.h" +#include "KX_ObstacleSimulation.h" /* ------------------------------------------------------------------------- */ /* Native functions */ @@ -44,19 +45,27 @@ KX_SteeringActuator::KX_SteeringActuator(SCA_IObject *gameobj, int mode, KX_GameObject *target, KX_GameObject *navmesh, - MT_Scalar movement, - MT_Scalar distance) : + MT_Scalar velocity, + MT_Scalar distance, + KX_ObstacleSimulation* simulation) : SCA_IActuator(gameobj, KX_ACT_STEERING), m_mode(mode), m_target(target), - m_movement(movement), - m_distance(distance) + m_velocity(velocity), + m_distance(distance), + m_updateTime(0), + m_isActive(false), + m_simulation(simulation), + m_obstacle(NULL) { m_navmesh = static_cast<KX_NavMeshObject*>(navmesh); if (m_navmesh) m_navmesh->RegisterActuator(this); if (m_target) m_target->RegisterActuator(this); + + if (m_simulation) + m_obstacle = m_simulation->GetObstacle((KX_GameObject*)gameobj); } KX_SteeringActuator::~KX_SteeringActuator() @@ -121,64 +130,92 @@ void KX_SteeringActuator::Relink(GEN_Map<GEN_HashedPtr, void*> *obj_map) } } -bool KX_SteeringActuator::Update() +bool KX_SteeringActuator::Update(double curtime, bool frame) { - bool bNegativeEvent = IsNegativeEvent(); - RemoveAllEvents(); - - if (bNegativeEvent) - return false; // do nothing on negative events - - KX_GameObject *obj = (KX_GameObject*) GetParent(); - const MT_Point3& mypos = obj->NodeGetWorldPosition(); - const MT_Point3& targpos = m_target->NodeGetWorldPosition(); - MT_Vector3 vectotarg = targpos - mypos; - MT_Vector3 steervec = MT_Vector3(0, 0, 0); - bool apply_steerforce = false; - - switch (m_mode) { - case KX_STEERING_SEEK: - if (vectotarg.length2()>m_distance*m_distance) - { - apply_steerforce = true; - steervec = vectotarg; - steervec.normalize(); - } - break; - case KX_STEERING_FLEE: - if (vectotarg.length2()<m_distance*m_distance) - { - apply_steerforce = true; - steervec = -vectotarg; - steervec.normalize(); - } - case KX_STEERING_PATHFOLLOWING: - if (m_navmesh && vectotarg.length2()>m_distance*m_distance) - { - static const int MAX_PATH_LENGTH = 128; - static const MT_Vector3 PATH_COLOR(1,0,0); - - float path[MAX_PATH_LENGTH*3]; - int pathlen = m_navmesh->FindPath(mypos, targpos, path, MAX_PATH_LENGTH); - if (pathlen > 1) + if (frame) + { + double delta = curtime - m_updateTime; + m_updateTime = curtime; + + if (m_posevent && !m_isActive) + { + delta = 0; + m_updateTime = curtime; + m_isActive = true; + } + bool bNegativeEvent = IsNegativeEvent(); + if (bNegativeEvent) + m_isActive = false; + + RemoveAllEvents(); + + if (bNegativeEvent || !delta) + return false; // do nothing on negative events + + KX_GameObject *obj = (KX_GameObject*) GetParent(); + const MT_Point3& mypos = obj->NodeGetWorldPosition(); + const MT_Point3& targpos = m_target->NodeGetWorldPosition(); + MT_Vector3 vectotarg = targpos - mypos; + MT_Vector3 steervec = MT_Vector3(0, 0, 0); + bool apply_steerforce = false; + + switch (m_mode) { + case KX_STEERING_SEEK: + if (vectotarg.length2()>m_distance*m_distance) { - //debug draw - m_navmesh->DrawPath(path, pathlen, PATH_COLOR); - apply_steerforce = true; - MT_Vector3 waypoint(&path[3]); - steervec = waypoint - mypos; - steervec.z() = 0; + steervec = vectotarg; steervec.normalize(); } + break; + case KX_STEERING_FLEE: + if (vectotarg.length2()<m_distance*m_distance) + { + apply_steerforce = true; + steervec = -vectotarg; + steervec.normalize(); + } + case KX_STEERING_PATHFOLLOWING: + if (m_navmesh && vectotarg.length2()>m_distance*m_distance) + { + static const int MAX_PATH_LENGTH = 128; + static const MT_Vector3 PATH_COLOR(1,0,0); + + float path[MAX_PATH_LENGTH*3]; + int pathlen = m_navmesh->FindPath(mypos, targpos, path, MAX_PATH_LENGTH); + if (pathlen > 1) + { + //debug draw + m_navmesh->DrawPath(path, pathlen, PATH_COLOR); + + apply_steerforce = true; + MT_Vector3 waypoint(&path[3]); + steervec = waypoint - mypos; + steervec.z() = 0; + steervec.normalize(); + } + } + break; + } + + if (apply_steerforce) + { + MT_Vector3 newvel = m_velocity*steervec; + + //adjust velocity to avoid obstacles + if (m_simulation && m_obstacle) + { + m_simulation->AdjustObstacleVelocity(m_obstacle, newvel); } - break; - } - if (apply_steerforce) - { - MT_Vector3 vel = m_movement*steervec; - obj->ApplyMovement(vel, false); + //temporary solution: set 2D steering velocity directly to obj + //correct way is to apply physical force + //MT_Vector3 movement = delta*m_velocity*steervec; + //obj->ApplyMovement(movement, false); + MT_Vector3 curvel = obj->GetLinearVelocity(); + newvel.z() = curvel.z(); + obj->setLinearVelocity(newvel, false); + } } return true; |