BVB Source Codes

CRYENGINE Show NavigationSystem.h Source code

Return Download CRYENGINE: download NavigationSystem.h Source code - Download CRYENGINE Source code - Type:.h
  1. // Copyright 2001-2016 Crytek GmbH / Crytek Group. All rights reserved.
  2.  
  3. #ifndef __NavigationSystem_h__
  4. #define __NavigationSystem_h__
  5.  
  6. #pragma once
  7.  
  8. #include <CryAISystem/INavigationSystem.h>
  9.  
  10. #include "../MNM/MNM.h"
  11. #include "../MNM/Tile.h"
  12. #include "../MNM/NavMesh.h"
  13. #include "../MNM/TileGenerator.h"
  14.  
  15. #include "WorldMonitor.h"
  16. #include "OffMeshNavigationManager.h"
  17. #include "VolumesManager.h"
  18. #include "IslandConnectionsManager.h"
  19.  
  20. #include <CryCore/Containers/CryListenerSet.h>
  21.  
  22. #include <CryThreading/IThreadManager.h>
  23.  
  24. #if CRY_PLATFORM_WINDOWS
  25.         #define NAVIGATION_SYSTEM_EDITOR_BACKGROUND_UPDATE 1
  26. #else
  27.         #define NAVIGATION_SYSTEM_EDITOR_BACKGROUND_UPDATE 0
  28. #endif
  29.  
  30. #if CRY_PLATFORM_WINDOWS
  31.         #define NAVIGATION_SYSTEM_PC_ONLY 1
  32. #else
  33.         #define NAVIGATION_SYSTEM_PC_ONLY 0
  34. #endif
  35.  
  36. #if DEBUG_MNM_ENABLED || NAVIGATION_SYSTEM_EDITOR_BACKGROUND_UPDATE
  37. class NavigationSystem;
  38. struct NavigationMesh;
  39. #endif
  40.  
  41. #if DEBUG_MNM_ENABLED
  42. class NavigationSystem;
  43. struct NavigationMesh;
  44.  
  45. class NavigationSystemDebugDraw
  46. {
  47.         struct NavigationSystemWorkingProgress
  48.         {
  49.                 NavigationSystemWorkingProgress()
  50.                         : m_initialQueueSize(0)
  51.                         , m_currentQueueSize(0)
  52.                         , m_timeUpdating(0.0f)
  53.                 {
  54.  
  55.                 }
  56.  
  57.                 void Update(const float frameTime, const size_t queueSize);
  58.                 void Draw();
  59.  
  60.         private:
  61.  
  62.                 void BeginDraw();
  63.                 void EndDraw();
  64.                 void DrawQuad(const Vec2& origin, const Vec2& size, const ColorB& color);
  65.  
  66.                 float               m_timeUpdating;
  67.                 size_t              m_initialQueueSize;
  68.                 size_t              m_currentQueueSize;
  69.                 SAuxGeomRenderFlags m_oldRenderFlags;
  70.         };
  71.  
  72.         struct DebugDrawSettings
  73.         {
  74.                 DebugDrawSettings()
  75.                         : meshID(0)
  76.                         , selectedX(0)
  77.                         , selectedY(0)
  78.                         , selectedZ(0)
  79.                         , forceGeneration(false)
  80.                 {
  81.  
  82.                 }
  83.  
  84.                 inline bool Valid() const { return (meshID != NavigationMeshID(0)); }
  85.  
  86.                 NavigationMeshID meshID;
  87.  
  88.                 size_t           selectedX;
  89.                 size_t           selectedY;
  90.                 size_t           selectedZ;
  91.  
  92.                 bool             forceGeneration;
  93.         };
  94.  
  95. public:
  96.  
  97.         NavigationSystemDebugDraw()
  98.                 : m_agentTypeID(0)
  99.         {
  100.  
  101.         }
  102.  
  103.         inline void SetAgentType(const NavigationAgentTypeID agentType)
  104.         {
  105.                 m_agentTypeID = agentType;
  106.         }
  107.  
  108.         inline NavigationAgentTypeID GetAgentType() const
  109.         {
  110.                 return m_agentTypeID;
  111.         }
  112.  
  113.         void DebugDraw(NavigationSystem& navigationSystem);
  114.         void UpdateWorkingProgress(const float frameTime, const size_t queueSize);
  115.  
  116. private:
  117.  
  118.         MNM::TileID       DebugDrawTileGeneration(NavigationSystem& navigationSystem, const DebugDrawSettings& settings);
  119.         void              DebugDrawRayCast(NavigationSystem& navigationSystem, const DebugDrawSettings& settings);
  120.         void              DebugDrawPathFinder(NavigationSystem& navigationSystem, const DebugDrawSettings& settings);
  121.         void              DebugDrawClosestPoint(NavigationSystem& navigationSystem, const DebugDrawSettings& settings);
  122.         void              DebugDrawGroundPoint(NavigationSystem& navigationSystem, const DebugDrawSettings& settings);
  123.         void              DebugDrawIslandConnection(NavigationSystem& navigationSystem, const DebugDrawSettings& settings);
  124.  
  125.         void              DebugDrawNavigationMeshesForSelectedAgent(NavigationSystem& navigationSystem, MNM::TileID excludeTileID);
  126.         void              DebugDrawNavigationSystemState(NavigationSystem& navigationSystem);
  127.         void              DebugDrawMemoryStats(NavigationSystem& navigationSystem);
  128.  
  129.         DebugDrawSettings GetDebugDrawSettings(NavigationSystem& navigationSystem);
  130.  
  131.         inline Vec3       TriangleCenter(const Vec3& a, const Vec3& b, const Vec3& c)
  132.         {
  133.                 return (a + b + c) / 3.f;
  134.         }
  135.  
  136.         NavigationAgentTypeID           m_agentTypeID;
  137.         NavigationSystemWorkingProgress m_progress;
  138. };
  139. #else
  140. class NavigationSystemDebugDraw
  141. {
  142. public:
  143.         inline void                  SetAgentType(const NavigationAgentTypeID agentType)                  {};
  144.         inline NavigationAgentTypeID GetAgentType() const                                                 { return NavigationAgentTypeID(0); };
  145.         inline void                  DebugDraw(const NavigationSystem& navigationSystem)                  {};
  146.         inline void                  UpdateWorkingProgress(const float frameTime, const size_t queueSize) {};
  147. };
  148. #endif
  149.  
  150. #if NAVIGATION_SYSTEM_EDITOR_BACKGROUND_UPDATE
  151. class NavigationSystemBackgroundUpdate : public ISystemEventListener
  152. {
  153.         class Thread : public IThread
  154.         {
  155.         public:
  156.                 Thread(NavigationSystem& navigationSystem)
  157.                         : m_navigationSystem(navigationSystem)
  158.                         , m_requestedStop(false)
  159.                 {
  160.  
  161.                 }
  162.  
  163.                 // Start accepting work on thread
  164.                 virtual void ThreadEntry();
  165.  
  166.                 // Signals the thread that it should not accept anymore work and exit
  167.                 void SignalStopWork();
  168.  
  169.         private:
  170.                 NavigationSystem& m_navigationSystem;
  171.  
  172.                 volatile bool     m_requestedStop;
  173.         };
  174.  
  175. public:
  176.         NavigationSystemBackgroundUpdate(NavigationSystem& navigationSystem)
  177.                 : m_pBackgroundThread(NULL)
  178.                 , m_navigationSystem(navigationSystem)
  179.                 , m_enabled(gEnv->IsEditor())
  180.                 , m_paused(false)
  181.         {
  182.                 RegisterAsSystemListener();
  183.         }
  184.  
  185.         ~NavigationSystemBackgroundUpdate()
  186.         {
  187.                 RemoveAsSystemListener();
  188.                 Stop();
  189.         }
  190.  
  191.         bool IsRunning() const
  192.         {
  193.                 return (m_pBackgroundThread != NULL);
  194.         }
  195.  
  196.         void Pause(const bool pause)
  197.         {
  198.                 if (pause)
  199.                 {
  200.                         if (Stop())   // Stop and synch if necessary
  201.                         {
  202.                                 CryLog("NavMesh generation background thread stopped");
  203.                         }
  204.                 }
  205.  
  206.                 m_paused = pause;
  207.         }
  208.  
  209.         // ISystemEventListener
  210.         virtual void OnSystemEvent(ESystemEvent event, UINT_PTR wparam, UINT_PTR lparam);
  211.         // ~ISystemEventListener
  212.  
  213. private:
  214.  
  215.         bool Start();
  216.         bool Stop();
  217.  
  218.         void RegisterAsSystemListener();
  219.         void RemoveAsSystemListener();
  220.  
  221.         bool IsEnabled() const { return m_enabled; }
  222.  
  223.         Thread*           m_pBackgroundThread;
  224.         NavigationSystem& m_navigationSystem;
  225.  
  226.         bool              m_enabled;
  227.         bool              m_paused;
  228. };
  229. #else
  230. class NavigationSystemBackgroundUpdate
  231. {
  232. public:
  233.         NavigationSystemBackgroundUpdate(NavigationSystem& navigationSystem)
  234.         {
  235.  
  236.         }
  237.  
  238.         bool IsRunning() const                     { return false; }
  239.         void Pause(const bool readingOrSavingMesh) {}
  240. };
  241. #endif
  242.  
  243. typedef MNM::BoundingVolume NavigationBoundingVolume;
  244.  
  245. struct NavigationMesh
  246. {
  247.         NavigationMesh(NavigationAgentTypeID _agentTypeID)
  248.                 : agentTypeID(_agentTypeID)
  249.                 , version(0)
  250.         {
  251.         };
  252.  
  253. #if DEBUG_MNM_ENABLED
  254.         struct ProfileMemoryStats
  255.         {
  256.                 ProfileMemoryStats(const MNM::CNavMesh::ProfilerType& _navMeshProfiler)
  257.                         : navMeshProfiler(_navMeshProfiler)
  258.                         , totalNavigationMeshMemory(0)
  259.                 {
  260.  
  261.                 }
  262.  
  263.                 const MNM::CNavMesh::ProfilerType& navMeshProfiler;
  264.                 size_t                             totalNavigationMeshMemory;
  265.         };
  266.  
  267.         ProfileMemoryStats GetMemoryStats(ICrySizer* pSizer) const;
  268. #endif
  269.  
  270.         NavigationAgentTypeID agentTypeID;
  271.         size_t                version;
  272.  
  273.         MNM::CNavMesh         navMesh;
  274.         NavigationVolumeID    boundary;
  275. #ifdef SW_NAVMESH_USE_GUID
  276.         NavigationVolumeGUID  boundaryGUID;
  277. #endif
  278.  
  279.         typedef std::vector<NavigationVolumeID> ExclusionVolumes;
  280.         ExclusionVolumes exclusions;
  281. #ifdef SW_NAVMESH_USE_GUID
  282.         typedef std::vector<NavigationVolumeGUID> ExclusionVolumesGUID;
  283.         ExclusionVolumesGUID exclusionsGUID;
  284. #endif
  285.  
  286.         string name; // TODO: this is currently duplicated for all agent types
  287. };
  288.  
  289. struct AgentType
  290. {
  291.         // Copying the AgentType in a multi threaded environment
  292.         // is not safe due to our string class being implemented as a
  293.         // not thread safe Copy-on-Write
  294.         // Using a custom assignment operator and a custom copy constructor
  295.         // gives us thread safety without the usage of code locks
  296.  
  297.         AgentType() {}
  298.  
  299.         AgentType(const AgentType& other)
  300.         {
  301.                 MakeDeepCopy(other);
  302.         }
  303.  
  304.         struct Settings
  305.         {
  306.                 Settings()
  307.                         : voxelSize(Vec3Constants<float>::fVec3_Zero)
  308.                         , radiusVoxelCount(0)
  309.                         , climbableVoxelCount(0)
  310.                         , climbableInclineGradient(0.0f)
  311.                         , climbableStepRatio(0.0f)
  312.                         , heightVoxelCount(0)
  313.                         , maxWaterDepthVoxelCount(0)
  314.                 {}
  315.  
  316.                 Vec3   voxelSize;
  317.  
  318.                 uint16 radiusVoxelCount;
  319.                 uint16 climbableVoxelCount;
  320.                 float  climbableInclineGradient;
  321.                 float  climbableStepRatio;
  322.                 uint16 heightVoxelCount;
  323.                 uint16 maxWaterDepthVoxelCount;
  324.         };
  325.  
  326.         struct MeshInfo
  327.         {
  328. #ifdef SW_NAVMESH_USE_GUID
  329.                 MeshInfo(NavigationMeshGUID& _guid, const NavigationMeshID& _id, uint32 _name)
  330.                         : guid(_guid)
  331.                         , id(_id)
  332.                         , name(_name)
  333.                 {
  334.                 }
  335.                 NavigationMeshGUID guid;
  336. #else
  337.                 MeshInfo(const NavigationMeshID& _id, uint32 _name)
  338.                         : id(_id)
  339.                         , name(_name)
  340.                 {
  341.                 }
  342. #endif
  343.  
  344.                 NavigationMeshID id;
  345.                 uint32           name;
  346.         };
  347.  
  348.         AgentType& operator=(const AgentType& other)
  349.         {
  350.                 MakeDeepCopy(other);
  351.  
  352.                 return *this;
  353.         }
  354.  
  355.         void MakeDeepCopy(const AgentType& other)
  356.         {
  357.                 settings = other.settings;
  358.  
  359.                 meshes = other.meshes;
  360.  
  361.                 exclusions = other.exclusions;
  362.  
  363.                 callbacks = other.callbacks;
  364.  
  365.                 meshEntityCallback = other.meshEntityCallback;
  366.  
  367.                 smartObjectUserClasses.reserve(other.smartObjectUserClasses.size());
  368.                 SmartObjectUserClasses::const_iterator end = other.smartObjectUserClasses.end();
  369.                 for (SmartObjectUserClasses::const_iterator it = other.smartObjectUserClasses.begin(); it != end; ++it)
  370.                         smartObjectUserClasses.push_back(it->c_str());
  371.  
  372.                 name = other.name.c_str();
  373.         }
  374.  
  375.         Settings settings;
  376.  
  377.         typedef std::vector<MeshInfo> Meshes;
  378.         Meshes meshes;
  379.  
  380.         typedef std::vector<NavigationVolumeID> ExclusionVolumes;
  381.         ExclusionVolumes exclusions;
  382.  
  383.         typedef std::vector<NavigationMeshChangeCallback> Callbacks;
  384.         Callbacks                    callbacks;
  385.  
  386.         NavigationMeshEntityCallback meshEntityCallback;
  387.  
  388.         typedef std::vector<string> SmartObjectUserClasses;
  389.         SmartObjectUserClasses smartObjectUserClasses;
  390.  
  391.         string                 name;
  392. };
  393.  
  394. class NavigationSystem :
  395.         public INavigationSystem, public ISystemEventListener
  396. {
  397.         friend class NavigationSystemDebugDraw;
  398.         friend class NavigationSystemBackgroundUpdate;
  399.  
  400. public:
  401.         NavigationSystem(const char* configName);
  402.         ~NavigationSystem();
  403.  
  404.         virtual NavigationAgentTypeID CreateAgentType(const char* name, const CreateAgentTypeParams& params) override;
  405.         virtual NavigationAgentTypeID GetAgentTypeID(const char* name) const override;
  406.         virtual NavigationAgentTypeID GetAgentTypeID(size_t index) const override;
  407.         virtual const char*           GetAgentTypeName(NavigationAgentTypeID agentTypeID) const override;
  408.         virtual size_t                GetAgentTypeCount() const override;
  409.         bool                          GetAgentTypeProperties(const NavigationAgentTypeID agentTypeID, AgentType& agentTypeProperties) const;
  410.  
  411. #ifdef SW_NAVMESH_USE_GUID
  412.         virtual NavigationMeshID CreateMesh(const char* name, NavigationAgentTypeID agentTypeID, const CreateMeshParams& params, NavigationMeshGUID guid) override;
  413.         virtual NavigationMeshID CreateMesh(const char* name, NavigationAgentTypeID agentTypeID, const CreateMeshParams& params, NavigationMeshID requestedId, NavigationMeshGUID guid) override;
  414. #else
  415.         virtual NavigationMeshID CreateMesh(const char* name, NavigationAgentTypeID agentTypeID, const CreateMeshParams& params) override;
  416.         virtual NavigationMeshID CreateMesh(const char* name, NavigationAgentTypeID agentTypeID, const CreateMeshParams& params, NavigationMeshID requestedId) override;
  417. #endif
  418.         virtual void             DestroyMesh(NavigationMeshID meshID) override;
  419.  
  420.         virtual void             SetMeshEntityCallback(NavigationAgentTypeID agentTypeID, const NavigationMeshEntityCallback& callback) override;
  421.         virtual void             AddMeshChangeCallback(NavigationAgentTypeID agentTypeID, const NavigationMeshChangeCallback& callback) override;
  422.         virtual void             RemoveMeshChangeCallback(NavigationAgentTypeID agentTypeID, const NavigationMeshChangeCallback& callback) override;
  423.  
  424. #ifdef SW_NAVMESH_USE_GUID
  425.         virtual NavigationVolumeID CreateVolume(Vec3* vertices, size_t vertexCount, float height, NavigationVolumeGUID guid) override;
  426. #else
  427.         virtual NavigationVolumeID CreateVolume(Vec3* vertices, size_t vertexCount, float height) override;
  428. #endif
  429.         virtual NavigationVolumeID CreateVolume(Vec3* vertices, size_t vertexCount, float height, NavigationVolumeID requestedID) override;
  430.         virtual void               DestroyVolume(NavigationVolumeID volumeID) override;
  431.         virtual void               SetVolume(NavigationVolumeID volumeID, Vec3* vertices, size_t vertexCount, float height) override;
  432.         virtual bool               ValidateVolume(NavigationVolumeID volumeID) const override;
  433.         virtual NavigationVolumeID GetVolumeID(NavigationMeshID meshID) const override;
  434.  
  435. #ifdef SW_NAVMESH_USE_GUID
  436.         virtual void SetMeshBoundaryVolume(NavigationMeshID meshID, NavigationVolumeID volumeID, NavigationVolumeGUID volumeGUID) override;
  437.         virtual void SetExclusionVolume(const NavigationAgentTypeID* agentTypeIDs, size_t agentTypeIDCount,
  438.                                         NavigationVolumeID volumeID, NavigationVolumeGUID volumeGUID) override;
  439. #else
  440.         virtual void SetMeshBoundaryVolume(NavigationMeshID meshID, NavigationVolumeID volumeID) override;
  441.         virtual void SetExclusionVolume(const NavigationAgentTypeID* agentTypeIDs, size_t agentTypeIDCount,
  442.                                         NavigationVolumeID volumeID) override;
  443. #endif
  444.  
  445.         virtual NavigationMeshID      GetMeshID(const char* name, NavigationAgentTypeID agentTypeID) const override;
  446.         virtual const char*           GetMeshName(NavigationMeshID meshID) const override;
  447.         virtual void                  SetMeshName(NavigationMeshID meshID, const char* name) override;
  448.  
  449.         virtual WorkingState          GetState() const override;
  450.         virtual WorkingState          Update(bool blocking) override;
  451.         virtual void                  PauseNavigationUpdate() override;
  452.         virtual void                  RestartNavigationUpdate() override;
  453.  
  454.         virtual size_t                QueueMeshUpdate(NavigationMeshID meshID, const AABB& aabb) override;
  455.         virtual void                  ProcessQueuedMeshUpdates() override;
  456.  
  457.         virtual void                  Clear() override;
  458.         virtual void                  ClearAndNotify() override;
  459.         virtual bool                  ReloadConfig() override;
  460.         virtual void                  DebugDraw() override;
  461.         virtual void                  Reset() override;
  462.  
  463.         void                          GetMemoryStatistics(ICrySizer* pSizer);
  464.  
  465.         virtual void                  SetDebugDisplayAgentType(NavigationAgentTypeID agentTypeID) override;
  466.         virtual NavigationAgentTypeID GetDebugDisplayAgentType() const override;
  467.  
  468.         void                          QueueDifferenceUpdate(NavigationMeshID meshID, const NavigationBoundingVolume& oldVolume,
  469.                                                             const NavigationBoundingVolume& newVolume);
  470.  
  471.         virtual void          WorldChanged(const AABB& aabb) override;
  472.  
  473.         const NavigationMesh& GetMesh(const NavigationMeshID& meshID) const;
  474.         NavigationMesh&       GetMesh(const NavigationMeshID& meshID);
  475.         NavigationMeshID      GetEnclosingMeshID(NavigationAgentTypeID agentTypeID, const Vec3& location) const override;
  476.         bool                  IsLocationInMesh(NavigationMeshID meshID, const Vec3& location) const;
  477.         MNM::TriangleID       GetClosestMeshLocation(NavigationMeshID meshID, const Vec3& location, float vrange, float hrange,
  478.                                                      Vec3* meshLocation, float* distance) const;
  479.         bool                  GetGroundLocationInMesh(NavigationMeshID meshID, const Vec3& location,
  480.                                                       float vDownwardRange, float hRange, Vec3* meshLocation) const;
  481.  
  482.         virtual bool                GetClosestPointInNavigationMesh(const NavigationAgentTypeID agentID, const Vec3& location, float vrange, float hrange, Vec3* meshLocation, float minIslandArea = 0.f) const override;
  483.  
  484.         virtual bool                IsLocationValidInNavigationMesh(const NavigationAgentTypeID agentID, const Vec3& location) const override;
  485.         virtual bool                IsPointReachableFromPosition(const NavigationAgentTypeID agentID, const IEntity* pEntityToTestOffGridLinks, const Vec3& startLocation, const Vec3& endLocation) const override;
  486.         virtual bool                IsLocationContainedWithinTriangleInNavigationMesh(const NavigationAgentTypeID agentID, const Vec3& location, float downRange, float upRange) const override;
  487.  
  488.         virtual size_t              GetTriangleCenterLocationsInMesh(const NavigationMeshID meshID, const Vec3& location, const AABB& searchAABB, Vec3* centerLocations, size_t maxCenterLocationCount, float minIslandArea = 0.f) const override;
  489.  
  490.         virtual size_t              GetTriangleBorders(const NavigationMeshID meshID, const AABB& aabb, Vec3* pBorders, size_t maxBorderCount, float minIslandArea = 0.f) const override;
  491.         virtual size_t              GetTriangleInfo(const NavigationMeshID meshID, const AABB& aabb, Vec3* centerLocations, uint32* islandids, size_t max_count, float minIslandArea = 0.f) const override;
  492.         virtual MNM::GlobalIslandID GetGlobalIslandIdAtPosition(const NavigationAgentTypeID agentID, const Vec3& location) override;
  493.  
  494.         virtual bool                ReadFromFile(const char* fileName, bool bAfterExporting) override;
  495. #if defined(SEG_WORLD)
  496.         virtual bool                SaveToFile(const char* fileName, const AABB& segmentAABB) const override;
  497. #else
  498.         virtual bool                SaveToFile(const char* fileName) const override;
  499. #endif
  500.  
  501.         virtual void                             RegisterListener(INavigationSystemListener* pListener, const char* name = NULL) override { m_listenersList.Add(pListener, name); }
  502.         virtual void                             UnRegisterListener(INavigationSystemListener* pListener) override                        { m_listenersList.Remove(pListener); }
  503.  
  504.         virtual void                             RegisterUser(INavigationSystemUser* pUser, const char* name = NULL) override             { m_users.Add(pUser, name); }
  505.         virtual void                             UnRegisterUser(INavigationSystemUser* pUser) override                                    { m_users.Remove(pUser); }
  506.  
  507.         virtual bool                             RegisterArea(const char* shapeName, NavigationVolumeID& outVolumeId) override;
  508.         virtual void                             UnRegisterArea(const char* shapeName) override;
  509.         virtual NavigationVolumeID               GetAreaId(const char* shapeName) const override;
  510.         virtual void                             SetAreaId(const char* shapeName, NavigationVolumeID id) override;
  511.         virtual void                             UpdateAreaNameForId(const NavigationVolumeID id, const char* newShapeName) override;
  512.         virtual void                             RemoveLoadedMeshesWithoutRegisteredAreas() override;
  513.  
  514.         virtual void                             StartWorldMonitoring() override;
  515.         virtual void                             StopWorldMonitoring() override;
  516.  
  517.         virtual bool                             IsInUse() const override;
  518.         virtual void                             CalculateAccessibility() override;
  519.  
  520.         virtual void                             OnSystemEvent(ESystemEvent event, UINT_PTR wparam, UINT_PTR lparam) override;
  521.  
  522.         void                                     OffsetBoundingVolume(const Vec3& additionalOffset, const NavigationVolumeID volumeId);
  523.         void                                     OffsetAllMeshes(const Vec3& additionalOffset);
  524.  
  525.         void                                     ComputeIslands();
  526.         void                                     AddIslandConnectionsBetweenTriangles(const NavigationMeshID& meshID, const MNM::TriangleID startingTriangleID, const MNM::TriangleID endingTriangleID);
  527.         void                                     RemoveIslandsConnectionBetweenTriangles(const NavigationMeshID& meshID, const MNM::TriangleID startingTriangleID, const MNM::TriangleID endingTriangleID = 0);
  528.         void                                     RemoveAllIslandConnectionsForObject(const NavigationMeshID& meshID, const uint32 objectId);
  529.  
  530.         void                                     AddOffMeshLinkIslandConnectionsBetweenTriangles(const NavigationMeshID& meshID, const MNM::TriangleID startingTriangleID, const MNM::TriangleID endingTriangleID, const MNM::OffMeshLinkID& linkID);
  531.         void                                     RemoveOffMeshLinkIslandsConnectionBetweenTriangles(const NavigationMeshID& meshID, const MNM::TriangleID startingTriangleID, const MNM::TriangleID endingTriangleID, const MNM::OffMeshLinkID& linkID);
  532.  
  533.         virtual MNM::TileID                      GetTileIdWhereLocationIsAtForMesh(NavigationMeshID meshID, const Vec3& location) override;
  534.         virtual void                             GetTileBoundsForMesh(NavigationMeshID meshID, MNM::TileID tileID, AABB& bounds) const override;
  535.         virtual MNM::TriangleID                  GetTriangleIDWhereLocationIsAtForMesh(const NavigationAgentTypeID agentID, const Vec3& location) override;
  536.  
  537.         virtual const MNM::INavMesh*             GetMNMNavMesh(NavigationMeshID meshID) const override;
  538.  
  539.         virtual const IOffMeshNavigationManager& GetIOffMeshNavigationManager() const override { return m_offMeshNavigationManager; }
  540.         virtual IOffMeshNavigationManager&       GetIOffMeshNavigationManager() override       { return m_offMeshNavigationManager; }
  541.  
  542.         bool                                     AgentTypeSupportSmartObjectUserClass(NavigationAgentTypeID agentTypeID, const char* smartObjectUserClass) const;
  543.         uint16                                   GetAgentRadiusInVoxelUnits(NavigationAgentTypeID agentTypeID) const;
  544.         uint16                                   GetAgentHeightInVoxelUnits(NavigationAgentTypeID agentTypeID) const;
  545.  
  546.         virtual TileGeneratorExtensionID         RegisterTileGeneratorExtension(MNM::TileGenerator::IExtension& extension) override;
  547.         virtual bool                             UnRegisterTileGeneratorExtension(const TileGeneratorExtensionID extensionId) override;
  548.  
  549.         inline const WorldMonitor*               GetWorldMonitor() const
  550.         {
  551.                 return &m_worldMonitor;
  552.         }
  553.  
  554.         inline WorldMonitor* GetWorldMonitor()
  555.         {
  556.                 return &m_worldMonitor;
  557.         }
  558.  
  559.         inline const OffMeshNavigationManager* GetOffMeshNavigationManager() const
  560.         {
  561.                 return &m_offMeshNavigationManager;
  562.         }
  563.  
  564.         inline OffMeshNavigationManager* GetOffMeshNavigationManager()
  565.         {
  566.                 return &m_offMeshNavigationManager;
  567.         }
  568.  
  569.         inline const IslandConnectionsManager* GetIslandConnectionsManager() const
  570.         {
  571.                 return &m_islandConnectionsManager;
  572.         }
  573.  
  574.         inline IslandConnectionsManager* GetIslandConnectionsManager()
  575.         {
  576.                 return &m_islandConnectionsManager;
  577.         }
  578.  
  579.         struct TileTask
  580.         {
  581.                 TileTask()
  582.                         : aborted(false)
  583.                 {
  584.                 }
  585.  
  586.                 inline bool operator==(const TileTask& other) const
  587.                 {
  588.                         return (meshID == other.meshID) && (x == other.y) && (y == other.y) && (z == other.z);
  589.                 }
  590.  
  591.                 inline bool operator<(const TileTask& other) const
  592.                 {
  593.                         if (meshID != other.meshID)
  594.                                 return meshID < other.meshID;
  595.  
  596.                         if (x != other.x)
  597.                                 return x < other.x;
  598.  
  599.                         if (y != other.y)
  600.                                 return y < other.y;
  601.  
  602.                         if (z != other.z)
  603.                                 return z < other.z;
  604.  
  605.                         return false;
  606.                 }
  607.  
  608.                 NavigationMeshID meshID;
  609.  
  610.                 uint16           x;
  611.                 uint16           y;
  612.                 uint16           z;
  613.  
  614.                 bool             aborted;
  615.         };
  616.  
  617.         struct TileTaskResult
  618.         {
  619.                 TileTaskResult()
  620.                         : state(Running)
  621.                         , hashValue(0)
  622.                 {
  623.                 };
  624.  
  625.                 enum State
  626.                 {
  627.                         Running = 0,
  628.                         Completed,
  629.                         NoChanges,
  630.                         Failed,
  631.                 };
  632.  
  633.                 JobManager::SJobState jobState;
  634.                 MNM::STile            tile;
  635.                 uint32                hashValue;
  636.  
  637.                 NavigationMeshID      meshID;
  638.  
  639.                 uint16                x;
  640.                 uint16                y;
  641.                 uint16                z;
  642.                 uint16                volumeCopy;
  643.  
  644.                 volatile uint16       state; // communicated over thread boundaries
  645.                 uint16                next;  // next free
  646.         };
  647.  
  648. private:
  649.  
  650. #if NAVIGATION_SYSTEM_PC_ONLY
  651.         void UpdateMeshes(const float frameTime, const bool blocking, const bool multiThreaded, const bool bBackground);
  652.         void SetupGenerator(NavigationMeshID meshID, const MNM::CNavMesh::SGridParams& paramsGrid,
  653.                             uint16 x, uint16 y, uint16 z, MNM::CTileGenerator::Params& params,
  654.                             const MNM::BoundingVolume* boundary, const MNM::BoundingVolume* exclusions,
  655.                             size_t exclusionCount);
  656.         bool SpawnJob(TileTaskResult& result, NavigationMeshID meshID, const MNM::CNavMesh::SGridParams& paramsGrid,
  657.                       uint16 x, uint16 y, uint16 z, bool mt);
  658.         void CommitTile(TileTaskResult& result);
  659. #endif
  660.  
  661.         void ResetAllNavigationSystemUsers();
  662.  
  663.         void WaitForAllNavigationSystemUsersCompleteTheirReadingAsynchronousTasks();
  664.         void UpdateNavigationSystemUsersForSynchronousWritingOperations();
  665.         void UpdateNavigationSystemUsersForSynchronousOrAsynchronousReadingOperations();
  666.         void UpdateInternalNavigationSystemData(const bool blocking);
  667.         void UpdateInternalSubsystems();
  668.  
  669.         void ComputeWorldAABB();
  670.         void SetupTasks();
  671.         void StopAllTasks();
  672.  
  673.         void UpdateAllListener(const ENavigationEvent event);
  674.  
  675. #if MNM_USE_EXPORT_INFORMATION
  676.         void ClearAllAccessibility(uint8 resetValue);
  677.         void ComputeAccessibility(IAIObject* pIAIObject, NavigationAgentTypeID agentTypeId = NavigationAgentTypeID(0));
  678. #endif
  679.  
  680.         void GatherNavigationVolumesToSave(std::vector<NavigationVolumeID>& usedVolumes) const;
  681.  
  682.         typedef std::deque<TileTask> TileTaskQueue;
  683.         TileTaskQueue m_tileQueue;
  684.  
  685.         typedef std::vector<uint16> RunningTasks;
  686.         RunningTasks m_runningTasks;
  687.         size_t       m_maxRunningTaskCount;
  688.         float        m_cacheHitRate;
  689.         float        m_throughput;
  690.  
  691.         typedef stl::aligned_vector<TileTaskResult, alignof(TileTaskResult)> TileTaskResults;
  692.         TileTaskResults m_results;
  693.         uint16          m_free;
  694.         WorkingState    m_state;
  695.  
  696.         typedef id_map<uint32, NavigationMesh> Meshes;
  697.         Meshes m_meshes;
  698.  
  699.         typedef id_map<uint32, MNM::BoundingVolume> Volumes;
  700.         Volumes m_volumes;
  701.  
  702. #ifdef SW_NAVMESH_USE_GUID
  703.         typedef std::map<NavigationMeshGUID, NavigationMeshID> MeshMap;
  704.         MeshMap m_swMeshes;
  705.  
  706.         typedef std::map<NavigationVolumeGUID, NavigationVolumeID> VolumeMap;
  707.         VolumeMap m_swVolumes;
  708.  
  709.         int       m_nextFreeMeshId;
  710.         int       m_nextFreeVolumeId;
  711. #endif
  712.  
  713.         typedef std::vector<AgentType> AgentTypes;
  714.         AgentTypes                        m_agentTypes;
  715.         uint32                            m_configurationVersion;
  716.  
  717.         NavigationSystemDebugDraw         m_debugDraw;
  718.  
  719.         NavigationSystemBackgroundUpdate* m_pEditorBackgroundUpdate;
  720.  
  721.         AABB                              m_worldAABB;
  722.         WorldMonitor                      m_worldMonitor;
  723.  
  724.         OffMeshNavigationManager          m_offMeshNavigationManager;
  725.         IslandConnectionsManager          m_islandConnectionsManager;
  726.  
  727.         struct VolumeDefCopy
  728.         {
  729.                 VolumeDefCopy()
  730.                         : version(~0ul)
  731.                         , refCount(0)
  732.                         , meshID(0)
  733.                 {
  734.                 }
  735.  
  736.                 size_t                           version;
  737.                 size_t                           refCount;
  738.  
  739.                 NavigationMeshID                 meshID;
  740.  
  741.                 MNM::BoundingVolume              boundary;
  742.                 std::vector<MNM::BoundingVolume> exclusions;
  743.         };
  744.  
  745.         std::vector<VolumeDefCopy> m_volumeDefCopy;
  746.  
  747.         string                     m_configName;
  748.  
  749.         typedef CListenerSet<INavigationSystemListener*> NavigationListeners;
  750.         NavigationListeners m_listenersList;
  751.  
  752.         typedef CListenerSet<INavigationSystemUser*> NavigationSystemUsers;
  753.         NavigationSystemUsers                  m_users;
  754.  
  755.         CVolumesManager                        m_volumesManager;
  756.         bool                                   m_isNavigationUpdatePaused;
  757.  
  758.         MNM::STileGeneratorExtensionsContainer m_tileGeneratorExtensionsContainer;
  759. };
  760.  
  761. namespace NavigationSystemUtils
  762. {
  763. inline bool IsDynamicObjectPartOfTheMNMGenerationProcess(IPhysicalEntity* pPhysicalEntity)
  764. {
  765.         if (pPhysicalEntity)
  766.         {
  767.                 pe_status_dynamics dyn;
  768.                 if (pPhysicalEntity->GetStatus(&dyn) && (dyn.mass <= 1e-6f))
  769.                         return true;
  770.         }
  771.  
  772.         return false;
  773. }
  774. }
  775.  
  776. #endif
  777.  
downloadNavigationSystem.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