7 #ifndef Navigation_DatabaseUpdateManager_H
8 #define Navigation_DatabaseUpdateManager_H
24 class DynamicNavMeshQuery;
25 class MakeNavFloorStitchQuery;
26 class QueryCounterOnDone;
27 typedef Collection<Ptr<TagVolume>, MemStat_NavData> TagVolumeCollection;
30 enum DatabaseUpdateStatus
32 DatabaseUpdateManagerIdle = 0,
34 UpdatingNavDataInDatabases_ProcessingNavData = 1,
35 UpdatingNavDataInDatabases_WaitingDynamicNavMeshQueries = 2,
36 UpdatingNavDataInDatabases_PerformingStitchOneToOne = 3,
37 UpdatingNavDataInDatabases_WaitingRunTimeStitchQueries = 4,
38 UpdatingNavDataInDatabases_FinalizeNavDataUpdate = 5,
40 UpdatingTagVolumeIntegration_ProcessingTagVolumes = 6,
41 UpdatingTagVolumeIntegration_WaitingDynamicNavMeshQueries = 7,
42 UpdatingTagVolumeIntegration_ProcessingDynNavMeshResults = 8,
43 UpdatingTagVolumeIntegration_WaitingRunTimeStitchQueries = 9,
44 UpdatingTagVolumeIntegration_FinalizeTagVolumeUpdate = 10,
46 CancellingTagVolumeIntegration = 11
49 class DatabaseUpdateManager
54 explicit DatabaseUpdateManager(World* world);
55 ~DatabaseUpdateManager();
61 void FullTagVolumeIntegrationUpdate();
64 void ForceUpdateToCompleteSynchronously();
67 void CancelTagVolumeIntegrationUpdate();
69 void ToggleDebugRender(
bool toggle);
72 bool IsUpdatingNavData() const;
73 bool IsUpdatingTagVolumeIntegration() const;
75 void UpdateFrameIdxInAllDatabases();
76 void PerformNextUpdateStepAccordingToStatus(QueryProcessMode processMode);
78 bool IsThereNavDataToAddedOrRemovedInOneDatabase();
79 void StartNewNavDataUpdateInDatabase(QueryProcessMode processMode);
80 void PerformStitchOneToOne(QueryProcessMode processMode);
81 void FinalizeNavDataAddRemoveUpdate();
83 bool IsThereNewTagVolumesToIntegrateOrDeIntegrate();
84 void StartNewTagVolumeIntegrationUpdate(QueryProcessMode processMode);
85 void CreateDynamicNavMeshQueriesForDatabase(
KyUInt32 databaseIdx, QueryProcessMode queryProcessMode);
86 void ProcessDynamicNavMeshQueryResults(QueryProcessMode queryProcessMode);
87 void FinalizeTagVolumeIntegrationUpdate();
91 void CreateMakeNavFloorStitchQuery(Database* database, NavCell* navCell, QueryProcessMode queryProcessMode);
92 void CreateDynamicNavMeshQuery(Database* database, NavCell* navCell,
93 const TagVolumeCollection* integratedTagVolumesAtCellPos, const TagVolumeCollection* newTagVolumes, QueryProcessMode queryProcessMode);
95 KyUInt32 GetNumberOfWaitingDynamicNavMeshQueries()
const {
return m_dynamicNavmeshQueriesInProcess; }
96 KyUInt32 GetNumberOfWaitingRunTimeStitchQueries()
const {
return m_stitchQueriesInProcess; }
98 void RunSynchronouslyAllNonFinishedQueries();
101 bool IsThereWaitingTagVolumesInDatabase(
KyUInt32 databaseIdx);
102 void EnlargeCellBoxAccordingToWaitingTagVolumes(
KyUInt32 databaseIdx,
CellBox& currentNavMeshUpdateCellBox);
103 void SpatializeWaitingTagVolumesInNavCellGrid(
KyUInt32 databaseIdx);
105 void RenderDisplayLists();
106 void ClearDebugRender();
108 void DebugTagVolumeInUpdateDisplayList();
110 void SnapshotOfTagVolumesToIntegrateAndToRemove();
111 void ComputeCellBoxOfTagvolumeToIntegratePerDatabase();
112 void MarkAllCellsConcernedByTagVolumeIntegrationUpdate(TagVolume* tagVolume);
113 void MarkAllCellsConcernedByUpdateInDatabase(Database* database,
const CellBox& tagVolumeCellBox);
115 void PushNewIntegratedTagVolumeInCellBox(TagVolume* tagVolume, Database* database,
const CellBox& cellBoxInDatabase);
116 void RemoveDeIntegratedTagVolumeFromCellBox(TagVolume* tagVolume, Database* database,
const CellBox& cellBoxInDatabase);
118 void PostProcessIntegratedTagVolumes();
119 void PostProcessDeIntegratedTagVolumes();
121 void CancelAllQueries();
123 void PrintErrorMessageForFaillingDynamicNavMeshQueries();
127 DatabaseUpdateStatus m_status;
129 KyArray<CellBox, MemStat_DynamicNavMesh> m_cellBoxOfUpdateInDatabase;
130 KyArray<CellBox, MemStat_DynamicNavMesh> m_cellBoxOfTagvolumeToIntegrate;
132 KyArray<Collection<Ptr<TagVolume>, MemStat_DynamicNavMesh>, MemStat_DynamicNavMesh> m_waitingTagVolumesPerDatabase;
134 KyArray<KyArray<Ptr<DynamicNavMeshQuery>, MemStat_DynamicNavMesh>, MemStat_DynamicNavMesh> m_dynNavMeshQueriesPerDatabase;
135 KyArray<KyArray<Ptr<MakeNavFloorStitchQuery>, MemStat_DynamicNavMesh>, MemStat_DynamicNavMesh> m_stitchQueriesPerDatabase;
137 AtomicInt<int> m_dynamicNavmeshQueriesInProcess;
138 AtomicInt<int> m_stitchQueriesInProcess;
140 Ptr<QueryCounterOnDone> m_OnDoneForDynamicNavMeshQueries;
141 Ptr<QueryCounterOnDone> m_OnDoneForRunTimeStitchQueries;
143 TagVolumeCollection m_tagVolumesInDeIntegration;
144 TagVolumeCollection m_tagVolumesInIntegration;
147 bool m_debugDisplayListsEnabled;
148 KyArray<ScopedDisplayList*> m_debugDisplayLists;
151 KY_INLINE
bool DatabaseUpdateManager::IsIdle()
const {
return m_status == DatabaseUpdateManagerIdle; }
152 KY_INLINE
bool DatabaseUpdateManager::IsUpdatingNavData()
const
154 return m_status >= UpdatingNavDataInDatabases_ProcessingNavData && m_status <= UpdatingNavDataInDatabases_FinalizeNavDataUpdate;
157 KY_INLINE
bool DatabaseUpdateManager::IsUpdatingTagVolumeIntegration()
const
159 return m_status >= UpdatingTagVolumeIntegration_ProcessingTagVolumes && m_status <= UpdatingTagVolumeIntegration_FinalizeTagVolumeUpdate;
162 KY_INLINE
bool DatabaseUpdateManager::IsThereWaitingTagVolumesInDatabase(
KyUInt32 databaseIdx)
164 return m_waitingTagVolumesPerDatabase[databaseIdx].GetCount() != 0;
169 #endif //Navigation_DatabaseUpdateManager_H
Box2i CellBox
A type that represents a bounding box around cells in a 2D grid.
Definition: navmeshtypes.h:34
Definition: gamekitcrowddispersion.h:20
#define KY_DEFINE_NEW_DELETE_OPERATORS(MemStat)
This macro defines new and delete operators.
Definition: memory.h:137
unsigned int KyUInt32
Type used internally to represent an unsigned 32-bit integer.
Definition: types.h:36
#define KyUInt32MAXVAL
The maximum value that can be stored in the KyUInt32 variable type.
Definition: types.h:226