From af77bd4812d0b3efd7033278b44f8edd775a686f Mon Sep 17 00:00:00 2001 From: maverickdgg Date: Fri, 24 Mar 2023 18:04:44 +0800 Subject: [PATCH] Saved Nav Data --- .../Level2_AITest_NavData.shnav | Bin 0 -> 836 bytes .../Level2_AITest_NavData.shnav.shmeta | 3 ++ Assets/Scenes/Level2_AITest.shade | 6 +++ .../EditorWindow/MenuBar/SHEditorMenuBar.cpp | 3 ++ .../src/Navigation/SHNavigationSystem.cpp | 36 +++++++++++++++++- .../src/Navigation/SHNavigationSystem.h | 9 +++-- .../src/Serialization/SHSerialization.cpp | 26 +++++++++++-- 7 files changed, 74 insertions(+), 9 deletions(-) create mode 100644 Assets/Navigation Data/Level2_AITest_NavData.shnav create mode 100644 Assets/Navigation Data/Level2_AITest_NavData.shnav.shmeta diff --git a/Assets/Navigation Data/Level2_AITest_NavData.shnav b/Assets/Navigation Data/Level2_AITest_NavData.shnav new file mode 100644 index 0000000000000000000000000000000000000000..845951a567ca7291a5494b4bb2edc358f824bf29 GIT binary patch literal 836 zcmcJN%?-jZ4254sr5+gpj@<%vgO0!`S&dCVEWoj+m}fg7ML<+l)Q9M+e_m}TBSySi zKLFtb^uuwNB9kP;cWOM$=&ed6uR>I4AaJ1?u}9`znWzMuVF8Wbd)7Xv5M?n1 zNflio$v$?OqE4-LX1Clear(); navSystem->GenerateNavigationGridData(); + std::string name = SHSceneManager::GetSceneName(); + name += "_NavData"; + navSystem->SaveToFile(name); } } diff --git a/SHADE_Engine/src/Navigation/SHNavigationSystem.cpp b/SHADE_Engine/src/Navigation/SHNavigationSystem.cpp index a517a105..457338d1 100644 --- a/SHADE_Engine/src/Navigation/SHNavigationSystem.cpp +++ b/SHADE_Engine/src/Navigation/SHNavigationSystem.cpp @@ -8,6 +8,7 @@ #include "Scene/SHSceneManager.h" #include "Graphics/MiddleEnd/Interface/SHDebugDrawSystem.h" #include "Assets/SHAssetManager.h" +#include "Assets/Asset Types/SHNavDataAsset.h" #include #include @@ -89,12 +90,43 @@ namespace SHADE origin = SHVec3{ 0.0f }; size = SHVec3{ 0.0f }; navigationGrid.clear(); + + navDataAsset = 0; } - void SHNavigationSystem::SaveToFile(std::string const& name) noexcept + void SHNavigationSystem::LoadFromFile(AssetID id) noexcept { - + auto data = SHAssetManager::GetData(id); + if (data != nullptr) + { + this->origin = data->origin; + this->navigationGrid = data->grid; + this->size = data->size; + this->numRows = data->rows; + this->numCols = data->cols; + } + navDataAsset = id; + } + + + + + AssetID SHNavigationSystem::SaveToFile(std::string const& name) noexcept + { + AssetID result = SHAssetManager::CreateNewAsset(AssetType::NAV_DATA, name); + auto data = SHAssetManager::GetData(result); + data->origin = this->origin; + data->grid = this->navigationGrid; + data->size = this->size; + data->rows = this->numRows; + data->cols = this->numCols; + + SHAssetManager::SaveAsset(result); + + navDataAsset = result; + + return result; } SHVec3 SHNavigationSystem::GetGridWorldPos(NavigationGridIndex index) noexcept diff --git a/SHADE_Engine/src/Navigation/SHNavigationSystem.h b/SHADE_Engine/src/Navigation/SHNavigationSystem.h index ce73f9a0..5b3fa0ca 100644 --- a/SHADE_Engine/src/Navigation/SHNavigationSystem.h +++ b/SHADE_Engine/src/Navigation/SHNavigationSystem.h @@ -5,7 +5,7 @@ #include "SHNavigationComponent.h" #include "Math/Vector/SHVec2.h" #include "Math/Vector/SHVec3.h" - +#include "Assets/SHAssetMacros.h" #include "SH_API.h" @@ -73,6 +73,8 @@ namespace SHADE //Size of the navigation area SHVec3 size_editor{ 0.0f }; + AssetID navDataAsset{}; + void GenerateNavigationGridData(SHVec3 origin, SHVec3 size, uint16_t numRow, uint16_t numCol) noexcept; @@ -84,9 +86,10 @@ namespace SHADE NavigationGridIndex GetNavigationGridIndex(SHVec3 const& worldPosition) noexcept; - void Clear() noexcept; - void SaveToFile(std::string const& name) noexcept; + void Clear() noexcept; + void LoadFromFile(AssetID id) noexcept; + AssetID SaveToFile(std::string const& name) noexcept; class SH_API NavigationSystemGenerateRoutine final: public SHSystemRoutine { diff --git a/SHADE_Engine/src/Serialization/SHSerialization.cpp b/SHADE_Engine/src/Serialization/SHSerialization.cpp index 842c0c4e..5b0aaced 100644 --- a/SHADE_Engine/src/Serialization/SHSerialization.cpp +++ b/SHADE_Engine/src/Serialization/SHSerialization.cpp @@ -16,6 +16,7 @@ #include "Scripting/SHScriptEngine.h" #include "Tools/FileIO/SHFileIO.h" #include "Prefab/SHPrefabManager.h" +#include namespace SHADE { @@ -50,6 +51,12 @@ namespace SHADE auto const& children = root->GetChildren(); out << YAML::BeginSeq; + if (auto navSystem = SHSystemManager::GetSystem()) + { + YAML::Node navData; + navData["NavData"] = navSystem->navDataAsset; + out << navData; + } auto pred = [&out](SHSceneNode* node) {out << SerializeEntityToNode(node); }; sceneGraph.Traverse(pred); @@ -113,9 +120,20 @@ namespace SHADE } YAML::Node entities = YAML::Load(assetData->data); CreatedEntitiesList createdEntities{}; - + auto entitiesBegin = entities.begin(); + if (auto navSystem = SHSystemManager::GetSystem()) + { + navSystem->Clear(); + YAML::Node navDataNode = *entitiesBegin; + if (navDataNode["NavData"].IsDefined()) + { + AssetID navDataAssetID = navDataNode["NavData"].as(); + navSystem->LoadFromFile(navDataAssetID); + ++entitiesBegin; + } + } //Create Entities - for (auto it = entities.begin(); it != entities.end(); ++it) + for (auto it = entitiesBegin; it != entities.end(); ++it) { DeserializeEntity(it, (*it), createdEntities); } @@ -126,14 +144,14 @@ namespace SHADE } auto entityVecIt = createdEntities.begin(); AssetQueue assetQueue; - for (auto it = entities.begin(); it != entities.end(); ++it) + for (auto it = entitiesBegin; it != entities.end(); ++it) { SHSerializationHelper::FetchAssetsFromComponent((*it)[ComponentsNode], createdEntities[(*it)[EIDNode].as()], assetQueue); } LoadAssetsFromAssetQueue(assetQueue); //Initialize Entity entityVecIt = createdEntities.begin(); - for (auto it = entities.begin(); it != entities.end(); ++it) + for (auto it = entitiesBegin; it != entities.end(); ++it) { InitializeEntity(*it, createdEntities[(*it)[EIDNode].as()]); }