BVB Source Codes

CRYENGINE Show CollisionAvoidanceSystem.h Source code

Return Download CRYENGINE: download CollisionAvoidanceSystem.h Source code - Download CRYENGINE Source code - Type:.h
  1. // Copyright 2001-2016 Crytek GmbH / Crytek Group. All rights reserved.
  2.  
  3. #ifndef __CollisionAvoidanceSystem_h__
  4. #define __CollisionAvoidanceSystem_h__
  5.  
  6. #pragma once
  7.  
  8. class CollisionAvoidanceSystem
  9. {
  10. public:
  11.         CollisionAvoidanceSystem();
  12.  
  13.         typedef size_t AgentID;
  14.         typedef size_t ObstacleID;
  15.  
  16.         struct Agent
  17.         {
  18.                 Agent()
  19.                         : radius(0.4f)
  20.                         , maxSpeed(4.5f)
  21.                         , maxAcceleration(0.1f)
  22.                         , currentLocation(ZERO)
  23.                         , currentLookDirection(ZERO)
  24.                         , currentVelocity(ZERO)
  25.                         , desiredVelocity(ZERO)
  26.                 {
  27.                 };
  28.  
  29.                 Agent(float _radius, float _maxSpeed, float _maxAcceleration, const Vec2& _currentLocation, const Vec2& _currentVelocity,
  30.                       const Vec2& _currentLookDirection, const Vec2& _desiredVelocity)
  31.                         : radius(_radius)
  32.                         , maxSpeed(_maxSpeed)
  33.                         , maxAcceleration(_maxAcceleration)
  34.                         , currentLocation(_currentLocation)
  35.                         , currentVelocity(_currentVelocity)
  36.                         , currentLookDirection(_currentLookDirection)
  37.                         , desiredVelocity(_desiredVelocity)
  38.                 {
  39.                 };
  40.  
  41.                 float radius;
  42.                 float maxSpeed;
  43.                 float maxAcceleration;
  44.  
  45.                 Vec3  currentLocation;
  46.                 Vec2  currentVelocity;
  47.                 Vec2  currentLookDirection;
  48.                 Vec2  desiredVelocity;
  49.         };
  50.  
  51.         struct Obstacle
  52.         {
  53.                 Obstacle()
  54.                         : radius(1.0f)
  55.                         , currentLocation(ZERO)
  56.                 {
  57.                 }
  58.  
  59.                 float radius;
  60.  
  61.                 Vec3  currentLocation;
  62.                 Vec2  currentVelocity;
  63.         };
  64.  
  65.         AgentID         CreateAgent(tAIObjectID objectID);
  66.         ObstacleID      CreateObstable();
  67.  
  68.         void            RemoveAgent(AgentID agentID);
  69.         void            RemoveObstacle(ObstacleID obstacleID);
  70.  
  71.         void            SetAgent(AgentID agentID, const Agent& params);
  72.         const Agent&    GetAgent(AgentID agentID) const;
  73.  
  74.         void            SetObstacle(ObstacleID obstacleID, const Obstacle& params);
  75.         const Obstacle& GetObstacle(ObstacleID obstacleID) const;
  76.  
  77.         const Vec2&     GetAvoidanceVelocity(AgentID agentID);
  78.  
  79.         void            Reset(bool bUnload = false);
  80.         void            Update(float updateTime);
  81.  
  82.         void            DebugDraw();
  83. private:
  84.         ILINE float     LeftOf(const Vec2& line, const Vec2& point) const
  85.         {
  86.                 return line.Cross(point);
  87.         }
  88.  
  89.         struct ConstraintLine
  90.         {
  91.                 enum EOrigin
  92.                 {
  93.                         AgentConstraint    = 0,
  94.                         ObstacleConstraint = 1,
  95.                 };
  96.  
  97.                 Vec2   direction;
  98.                 Vec2   point;
  99.  
  100.                 uint16 flags;
  101.                 uint16 objectID; // debug only
  102.         };
  103.  
  104.         struct NearbyAgent
  105.         {
  106.                 NearbyAgent()
  107.                 {
  108.                 };
  109.  
  110.                 NearbyAgent(float _distanceSq, uint16 _agentID, uint16 _flags = 0)
  111.                         : distanceSq(_distanceSq)
  112.                         , agentID(_agentID)
  113.                         , flags(_flags)
  114.                 {
  115.                 };
  116.  
  117.                 enum EFlags
  118.                 {
  119.                         CanSeeMe = 1 << 0,
  120.                         IsMoving = 1 << 1,
  121.                 };
  122.  
  123.                 bool operator<(const NearbyAgent& other) const
  124.                 {
  125.                         return distanceSq < other.distanceSq;
  126.                 };
  127.  
  128.                 float  distanceSq;
  129.                 uint16 agentID;
  130.                 uint16 flags;
  131.         };
  132.  
  133.         struct NearbyObstacle
  134.         {
  135.                 NearbyObstacle()
  136.                         : distanceSq(0)
  137.                         , obstacleID(0)
  138.                         , flags(0)
  139.                 {
  140.                 };
  141.  
  142.                 NearbyObstacle(float _distanceSq, uint16 _agentID, uint16 _flags = 0)
  143.                         : distanceSq(_distanceSq)
  144.                         , obstacleID(_agentID)
  145.                         , flags(_flags)
  146.                 {
  147.                 };
  148.  
  149.                 enum EFlags
  150.                 {
  151.                         CanSeeMe = 1 << 0,
  152.                         IsMoving = 1 << 1,
  153.                 };
  154.  
  155.                 ILINE bool operator<(const NearbyObstacle& other) const
  156.                 {
  157.                         return distanceSq < other.distanceSq;
  158.                 };
  159.  
  160.                 float  distanceSq;
  161.                 uint16 obstacleID;
  162.                 uint16 flags;
  163.         };
  164.  
  165.         enum { FeasibleAreaMaxVertexCount = 64, };
  166.  
  167.         typedef std::vector<NearbyAgent>    NearbyAgents;
  168.         typedef std::vector<NearbyObstacle> NearbyObstacles;
  169.         typedef std::vector<ConstraintLine> ConstraintLines;
  170.  
  171.         size_t ComputeNearbyAgents(const Agent& agent, size_t agentIndex, float range, NearbyAgents& nearbyAgents) const;
  172.         size_t ComputeNearbyObstacles(const Agent& agent, size_t agentIndex, float range, NearbyObstacles& nearbyObstacles) const;
  173.  
  174.         size_t ComputeConstraintLinesForAgent(const Agent& agent, size_t agentIndex, float timeHorizonScale,
  175.                                               NearbyAgents& nearbyAgents, size_t maxAgentsConsidered, NearbyObstacles& nearbyObstacles, ConstraintLines& lines) const;
  176.         void   ComputeAgentConstraintLine(const Agent& agent, const Agent& obstacleAgent, bool reciprocal, float timeHorizonScale,
  177.                                           ConstraintLine& line) const;
  178.         void   ComputeObstacleConstraintLine(const Agent& agent, const Obstacle& obstacle, float timeHorizonScale,
  179.                                              ConstraintLine& line) const;
  180.  
  181.         bool   ClipPolygon(const Vec2* polygon, size_t vertexCount, const ConstraintLine& line, Vec2* output,
  182.                            size_t* outputVertexCount) const;
  183.         size_t ComputeFeasibleArea(const ConstraintLine* lines, size_t lineCount, float radius, Vec2* feasibleArea) const;
  184.         bool   ClipVelocityByFeasibleArea(const Vec2& velocity, Vec2* feasibleArea, size_t vertexCount, Vec2& output) const;
  185.  
  186.         struct CandidateVelocity
  187.         {
  188.                 float distanceSq;
  189.                 Vec2  velocity;
  190.  
  191.                 ILINE bool operator<(const CandidateVelocity& other) const
  192.                 {
  193.                         return distanceSq < other.distanceSq;
  194.                 }
  195.         };
  196.  
  197.         size_t ComputeOptimalAvoidanceVelocity(Vec2* feasibleArea, size_t vertexCount, const Agent& agent,
  198.                                                const float minSpeed, const float maxSpeed, CandidateVelocity* output) const;
  199.  
  200.         Vec2 ClampSpeedWithNavigationMesh(const NavigationAgentTypeID agentTypeID, const Vec3 agentPosition, const Vec2& currentVelocity, const Vec2& velocityToClamp) const;
  201.         bool FindFirstWalkableVelocity(AgentID agentID, CandidateVelocity* candidates, size_t candidateCount,
  202.                                        Vec2& output) const;
  203.  
  204.         bool FindLineCandidate(const ConstraintLine* lines, size_t lineCount, size_t lineNumber, float radius, const Vec2& velocity,
  205.                                Vec2& candidate) const;
  206.         bool FindCandidate(const ConstraintLine* lines, size_t lineCount, float radius, const Vec2& velocity, Vec2& candidate) const;
  207.  
  208.         void DebugDrawConstraintLine(const Vec3& agentLocation, const ConstraintLine& line, const ColorB& color);
  209.  
  210.         typedef std::vector<Agent> Agents;
  211.         Agents m_agents;
  212.  
  213.         typedef std::vector<Vec2> AgentAvoidanceVelocities;
  214.         AgentAvoidanceVelocities m_agentAvoidanceVelocities;
  215.  
  216.         typedef std::vector<Obstacle> Obstacles;
  217.         Obstacles       m_obstacles;
  218.  
  219.         NearbyAgents    m_nearbyAgents;
  220.         NearbyObstacles m_nearbyObstacles;
  221.         ConstraintLines m_constraintLines;
  222.  
  223.         typedef std::vector<tAIObjectID> AgentObjectIDs;
  224.         AgentObjectIDs m_agentObjectIDs;
  225.  
  226.         typedef std::vector<string> AgentNames;
  227.         AgentNames m_agentNames;
  228. };
  229.  
  230. #endif //__CollisionAvoidanceSystem_h__
  231.  
downloadCollisionAvoidanceSystem.h Source code - Download CRYENGINE Source code
Related Source Codes/Software:
postal - 2017-06-11
reactide - Reactide is the first dedicated IDE for React web ... 2017-06-11
rkt - rkt is a pod-native container engine for Linux. It... 2017-06-11
uWebSockets - Tiny WebSockets https://for... 2017-06-11
realworld - TodoMVC for the RealWorld - Exemplary fullstack Me... 2017-06-11
CRYENGINE - CRYENGINE is a powerful real-time game development... 2017-06-11
goreplay - GoReplay is an open-source tool for capturing and ... 2017-06-10
pyenv - Simple Python version management 2017-06-10
redux-saga - An alternative side effect model for Redux apps ... 2017-06-10
angular-starter - 2017-06-10

 Back to top