123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240 |
- /****************************************************************************
- Copyright (c) 2015-2016 Chukong Technologies Inc.
- Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd.
-
- http://www.cocos2d-x.org
-
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- THE SOFTWARE.
- ****************************************************************************/
- #ifndef __CCNAV_MESH_AGENT_H__
- #define __CCNAV_MESH_AGENT_H__
- #include "base/ccConfig.h"
- #if CC_USE_NAVMESH
- #include "2d/CCComponent.h"
- #include "base/CCRef.h"
- #include "math/Vec3.h"
- #include "recast/DetourCrowd/DetourCrowd.h"
- class dtNavMeshQuery;
- NS_CC_BEGIN
- /**
- * @addtogroup 3d
- * @{
- */
- struct CC_DLL NavMeshAgentParam
- {
- NavMeshAgentParam();
- float radius; ///< Agent radius. [Limit: >= 0]
- float height; ///< Agent height. [Limit: > 0]
- float maxAcceleration; ///< Maximum allowed acceleration. [Limit: >= 0]
- float maxSpeed; ///< Maximum allowed speed. [Limit: >= 0]
- /// Defines how close a collision element must be before it is considered for steering behaviors. [Limits: > 0]
- float collisionQueryRange;
- float pathOptimizationRange; ///< The path visibility optimization range. [Limit: > 0]
- /// How aggressive the agent manager should be at avoiding collisions with this agent. [Limit: >= 0]
- float separationWeight;
- /// Flags that impact steering behavior. (See: #UpdateFlags)
- unsigned char updateFlags;
- /// The index of the avoidance configuration to use for the agent.
- /// [Limits: 0 <= value <= #DT_CROWD_MAX_OBSTAVOIDANCE_PARAMS]
- unsigned char obstacleAvoidanceType;
- /// The index of the query filter used by this agent.
- unsigned char queryFilterType;
- };
- struct CC_DLL OffMeshLinkData
- {
- Vec3 startPosition;//position in local coordinate system.
- Vec3 endPosition;//position in local coordinate system.
- };
- /** @brief NavMeshAgent: The code wrapping of dtCrowdAgent, use component mode. */
- class CC_DLL NavMeshAgent : public Component
- {
- friend class NavMesh;
- public:
- enum NavMeshAgentSyncFlag
- {
- NONE = 0,
- NODE_TO_AGENT = 1,
- AGENT_TO_NODE = 2,
- NODE_AND_NODE = NODE_TO_AGENT | AGENT_TO_NODE,
- };
- typedef std::function<void(NavMeshAgent *agent, float totalTimeAfterMove)> MoveCallback;
- /**
- Create agent
- @param param The parameters of agent.
- */
- static NavMeshAgent* create(const NavMeshAgentParam ¶m);
- static const std::string& getNavMeshAgentComponentName();
- virtual void onEnter() override;
- virtual void onExit() override;
- /** set agent radius */
- void setRadius(float radius);
- /** get agent radius */
- float getRadius() const;
- /** set agent height */
- void setHeight(float height);
- /** get agent height */
- float getHeight() const;
- /** set maximal acceleration of agent*/
- void setMaxAcceleration(float maxAcceleration);
- /** get maximal acceleration of agent*/
- float getMaxAcceleration() const;
- /** set maximal speed of agent */
- void setMaxSpeed(float maxSpeed);
- /** get maximal speed of agent */
- float getMaxSpeed() const;
- /** set separation weight */
- void setSeparationWeight(float weight);
- /** get separation weight */
- float getSeparationWeight() const;
- /** set obstacle avoidance type */
- void setObstacleAvoidanceType(unsigned char type);
- /** get obstacle avoidance type */
- unsigned char getObstacleAvoidanceType() const;
- /** get current velocity */
- Vec3 getCurrentVelocity() const;
- /**
- Move agent to a destination
- @param destination The position in world coordinate system.
- @param callback Use this function can catch movement state.
- */
- void move(const Vec3 &destination, const MoveCallback &callback = nullptr);
- /** pause movement */
- void pause();
- /** resume movement */
- void resume();
- /** stop movement */
- void stop();
- /**
- Set the reference axes of agent's orientation
- @param rotRefAxes The value of reference axes in local coordinate system.
- */
- void setOrientationRefAxes(const Vec3 &rotRefAxes);
- /**Set automatic Orientation */
- void setAutoOrientation(bool isAuto);
- /**Set automatic Traverse OffMeshLink */
- void setAutoTraverseOffMeshLink(bool isAuto);
- /**Check agent arrived OffMeshLink */
- bool isOnOffMeshLink();
- /**Traverse OffMeshLink manually*/
- void completeOffMeshLink();
- /**Get current OffMeshLink information*/
- OffMeshLinkData getCurrentOffMeshLinkData();
- void setUserData(void *data) { _userData = data; };
- void* getUserData() const { return _userData; };
- /**
- * synchronization between node and agent is time consuming, you can skip some synchronization using this function
- */
- void setSyncFlag(const NavMeshAgentSyncFlag &flag) { _syncFlag = flag; }
- NavMeshAgentSyncFlag getSyncFlag() const { return _syncFlag; }
- /** synchronize parameter to agent. */
- void syncToAgent();
- /** synchronize parameter to node. */
- void syncToNode();
-
- /** get current velocity */
- Vec3 getVelocity() const;
- CC_CONSTRUCTOR_ACCESS:
- NavMeshAgent();
- virtual ~NavMeshAgent();
- private:
- bool initWith(const NavMeshAgentParam ¶m);
- void addTo(dtCrowd *crowed);
- void removeFrom(dtCrowd *crowed);
- void setNavMeshQuery(dtNavMeshQuery *query);
- void preUpdate(float delta);
- void postUpdate(float delta);
- static void convertTodtAgentParam(const NavMeshAgentParam &inParam, dtCrowdAgentParams &outParam);
- private:
- MoveCallback _moveCallback;
- NavMeshAgentParam _param;
- NavMeshAgentSyncFlag _syncFlag;
- Vec3 _origination;
- Vec3 _destination;
- Vec3 _rotRefAxes;
- unsigned char _state;
- bool _needAutoOrientation;
- int _agentID;
- bool _needUpdateAgent;
- bool _needMove;
- float _totalTimeAfterMove;
- void *_userData;
- dtCrowd *_crowd;
- dtNavMeshQuery *_navMeshQuery;
- };
- /** @} */
- NS_CC_END
- #endif //CC_USE_NAVMESH
- #endif // __CCNAV_MESH_AGENT_H__
|