23 class DynamicNavMeshQuery;
24 class MakeNavFloorStitchQuery;
25 class QueryCounterOnDone;
26 typedef Collection<Ptr<TagVolume>, MemStat_NavData> TagVolumeCollection;
29 enum DatabaseUpdateStatus
31 DatabaseUpdateManagerIdle = 0,
33 UpdatingNavDataInDatabases_ProcessingNavData = 1,
34 UpdatingNavDataInDatabases_WaitingDynamicNavMeshQueries = 2,
35 UpdatingNavDataInDatabases_PerformingStitchOneToOne = 3,
36 UpdatingNavDataInDatabases_WaitingRunTimeStitchQueries = 4,
37 UpdatingNavDataInDatabases_FinalizeNavDataUpdate = 5,
39 UpdatingTagVolumeIntegration_ProcessingTagVolumes = 6,
40 UpdatingTagVolumeIntegration_WaitingDynamicNavMeshQueries = 7,
41 UpdatingTagVolumeIntegration_ProcessingDynNavMeshResults = 8,
42 UpdatingTagVolumeIntegration_WaitingRunTimeStitchQueries = 9,
43 UpdatingTagVolumeIntegration_FinalizeTagVolumeUpdate = 10,
45 CancellingTagVolumeIntegration = 11,
47 DatabaseUpdateStatus_Count = 12
50 class DatabaseUpdateManager
55 explicit DatabaseUpdateManager(World* world);
56 ~DatabaseUpdateManager();
63 void TagVolumeIntegrationUpdateImmediate();
66 void CompleteAddRemoveNavDataOrCancelTagVolumeIntegration();
69 void CancelTagVolumeIntegrationUpdate();
71 void ToggleDebugRender(
bool toggle);
74 bool IsDoingNavDataAddRemoveUpdate() const;
75 bool IsDoingTagVolumeIntegrationUpdate() const;
77 DatabaseUpdateStatus GetStatus()
const {
return m_status; }
78 void SetStatus(DatabaseUpdateStatus status) { m_status = status; }
80 bool HasDynamicNavMeshQueriesInProcess()
const {
return m_dynamicNavmeshQueriesInProcess != 0; }
81 bool HasNavMeshStitchQueriesInProcess()
const {
return m_stitchQueriesInProcess != 0; }
83 KyInt32 GetDynamicNavMeshQueriesInProcess()
const {
return m_dynamicNavmeshQueriesInProcess; }
84 KyInt32 GetNavMeshStitchQueriesInProcess()
const {
return m_stitchQueriesInProcess; }
92 void PushStitchQuery(
KyUInt32 databseIndex,
const Kaim::Ptr<Kaim::MakeNavFloorStitchQuery>& query);
96 friend class NavCellGrid;
99 friend class Database;
101 void ForceUpdateToCompleteSynchronously();
103 void UpdateFrameIdxInAllDatabases();
104 void ClearChangeInAllDatabases();
105 void PerformNextUpdateStepAccordingToStatus(QueryProcessMode processMode);
108 bool IsThereNavDataAddRemovePending()
const;
109 void StartNavDataAddRemoveUpdate(QueryProcessMode processMode);
110 void PerformStitchOneToOne(QueryProcessMode processMode);
111 void FinalizeNavDataAddRemoveUpdate();
114 bool IsThereTagVolumeIntegrationPending()
const;
115 void StartTagVolumeIntegrationUpdate(QueryProcessMode processMode);
116 void CreateDynamicNavMeshQueriesForDatabase(
KyUInt32 databaseIdx, QueryProcessMode queryProcessMode);
117 void ProcessDynamicNavMeshQueryResults(QueryProcessMode queryProcessMode);
118 void FinalizeTagVolumeIntegrationUpdate();
120 void CreateMakeNavFloorStitchQuery(Database* database, NavCell* navCell, QueryProcessMode queryProcessMode);
121 void CreateDynamicNavMeshQuery(Database* database, NavCell* navCell,
122 const TagVolumeCollection* integratedTagVolumesAtCellPos,
const TagVolumeCollection* newTagVolumes, QueryProcessMode queryProcessMode);
124 KyUInt32 GetNumberOfWaitingDynamicNavMeshQueries()
const {
return m_dynamicNavmeshQueriesInProcess; }
125 KyUInt32 GetNumberOfWaitingRunTimeStitchQueries()
const {
return m_stitchQueriesInProcess; }
127 void RunSynchronouslyAllNonFinishedQueries();
130 bool IsThereWaitingTagVolumesInDatabase(
KyUInt32 databaseIdx);
131 void EnlargeCellBoxAccordingToWaitingTagVolumes(
KyUInt32 databaseIdx,
CellBox& currentNavMeshUpdateCellBox);
132 void SpatializeWaitingTagVolumesInNavCellGrid(
KyUInt32 databaseIdx);
134 void RenderDisplayLists();
135 void ClearDebugRender();
137 void DebugTagVolumeInUpdateDisplayList();
140 void TakeSnapshotOfTagVolumesToIntegrateAndToRemove();
141 void ComputeCellBoxOfTagvolumeToIntegratePerDatabase();
142 void MarkAllCellsConcernedByTagVolumeIntegrationUpdate(TagVolume* tagVolume);
143 void MarkAllCellsConcernedByUpdateInDatabase(Database* database,
const CellBox& tagVolumeCellBox);
145 void PushNewIntegratedTagVolumeInCellBox(TagVolume* tagVolume, Database* database,
const CellBox& cellBoxInDatabase);
146 void RemoveDeIntegratedTagVolumeFromCellBox(TagVolume* tagVolume, Database* database,
const CellBox& cellBoxInDatabase);
148 void PostProcessIntegratedTagVolumes();
149 void PostProcessDeIntegratedTagVolumes();
151 void CancelAllQueries();
153 void PrintErrorMessageForFaillingDynamicNavMeshQueries();
158 DatabaseUpdateStatus m_status;
160 KyArray<CellBox, MemStat_DynamicNavMesh> m_cellBoxOfUpdateInDatabase;
161 KyArray<CellBox, MemStat_DynamicNavMesh> m_cellBoxOfTagvolumeToIntegrate;
163 KyArray<Collection<Ptr<TagVolume>, MemStat_DynamicNavMesh>, MemStat_DynamicNavMesh> m_waitingTagVolumesPerDatabase;
165 KyArray<KyArray<Ptr<DynamicNavMeshQuery>, MemStat_DynamicNavMesh>, MemStat_DynamicNavMesh> m_dynNavMeshQueriesPerDatabase;
166 KyArray<KyArray<Ptr<MakeNavFloorStitchQuery>, MemStat_DynamicNavMesh>, MemStat_DynamicNavMesh> m_stitchQueriesPerDatabase;
168 std::atomic<int> m_dynamicNavmeshQueriesInProcess;
169 std::atomic<int> m_stitchQueriesInProcess;
171 Ptr<QueryCounterOnDone> m_OnDoneForDynamicNavMeshQueries;
172 Ptr<QueryCounterOnDone> m_OnDoneForRunTimeStitchQueries;
174 TagVolumeCollection m_tagVolumesInDeIntegration;
175 TagVolumeCollection m_tagVolumesInIntegration;
178 bool m_debugDisplayListsEnabled;
179 KyArray<DisplayList*> m_debugDisplayLists;
183 KY_INLINE
bool DatabaseUpdateManager::IsIdle()
const {
return m_status == DatabaseUpdateManagerIdle; }
185 KY_INLINE
bool DatabaseUpdateManager::IsDoingNavDataAddRemoveUpdate()
const
187 return m_status >= UpdatingNavDataInDatabases_ProcessingNavData && m_status <= UpdatingNavDataInDatabases_FinalizeNavDataUpdate;
190 KY_INLINE
bool DatabaseUpdateManager::IsDoingTagVolumeIntegrationUpdate()
const
192 return m_status >= UpdatingTagVolumeIntegration_ProcessingTagVolumes && m_status <= UpdatingTagVolumeIntegration_FinalizeTagVolumeUpdate;
195 KY_INLINE
bool DatabaseUpdateManager::IsThereWaitingTagVolumesInDatabase(
KyUInt32 databaseIdx)
197 return m_waitingTagVolumesPerDatabase[databaseIdx].GetCount() != 0;
200 const char* GetDatabaseUpdateStatusString(DatabaseUpdateStatus status);
Box2i CellBox
A type that represents a bounding box around cells in a 2D grid.
Definition: navmeshtypes.h:31
std::uint32_t KyUInt32
uint32_t
Definition: types.h:29
#define KY_DEFINE_NEW_DELETE_OPERATORS(MemStat)
This macro defines new and delete operators.
Definition: memory.h:132
2d vector using KyInt32
Definition: vec2i.h:18
The Autodesk Navigation namespace.
Definition: gamekitcrowddispersion.cpp:17
std::int32_t KyInt32
int32_t
Definition: types.h:24
#define KyUInt32MAXVAL
KyUInt32 max value
Definition: types.h:68