diff --git a/Volt/Navigation/src/Navigation/Filesystem/NavMeshImporter.cpp b/Volt/Navigation/src/Navigation/Filesystem/NavMeshImporter.cpp index 8d53f75e9..71d84d4a7 100644 --- a/Volt/Navigation/src/Navigation/Filesystem/NavMeshImporter.cpp +++ b/Volt/Navigation/src/Navigation/Filesystem/NavMeshImporter.cpp @@ -6,6 +6,9 @@ #include +#include +#include + namespace Volt { namespace AI @@ -16,23 +19,7 @@ namespace Volt static const int TILECACHESET_MAGIC = 'T' << 24 | 'S' << 16 | 'E' << 8 | 'T'; //'TSET'; static const int TILECACHESET_VERSION = 2; - struct NavMeshSetHeader - { - int magic; - int version; - int numTiles; - dtNavMeshParams params; - }; - - struct NavMeshTileHeader - { - dtTileRef tileRef; - int dataSize; - }; - - VT_OPTIMIZE_OFF - - bool NavMeshImporter::SaveNavMesh(std::ostream& output, Ref& asset) + bool NavMeshImporter::SaveNavMesh(BinaryStreamWriter& output, Ref& asset) { if (asset->GetNavMesh()->GetTileCache()) { @@ -44,39 +31,30 @@ namespace Volt } } - bool NavMeshImporter::LoadNavMesh(std::ifstream& input, Ref& asset) + bool NavMeshImporter::LoadNavMesh(BinaryStreamReader& input, Ref& asset) { - std::streampos currentPosition = input.tellg(); - // Read header. NavMeshSetHeader header; - if (!input.read(reinterpret_cast(&header), sizeof(NavMeshSetHeader))) - { - input.close(); - return false; - } - - input.seekg(currentPosition); + input.Read(header); switch (header.magic) { case NAVMESHSET_MAGIC: { - return LoadSingleNavMesh(input, asset); + return LoadSingleNavMesh(input, header, asset); } case TILECACHESET_MAGIC: { - return LoadTiledNavMesh(input, asset); + return LoadTiledNavMesh(input, header, asset); } default: { - input.close(); return false; } } } - bool NavMeshImporter::SaveSingleNavMesh(std::ostream& output, Ref& asset) + bool NavMeshImporter::SaveSingleNavMesh(BinaryStreamWriter& output, Ref& asset) { const auto* mesh = asset->GetNavMesh()->GetNavMesh().get(); @@ -92,7 +70,7 @@ namespace Volt header.numTiles++; } memcpy(&header.params, mesh->getParams(), sizeof(dtNavMeshParams)); - output.write(reinterpret_cast(&header), sizeof(NavMeshSetHeader)); + output.Write(header); // Store tiles. for (int i = 0; i < mesh->getMaxTiles(); ++i) @@ -103,50 +81,37 @@ namespace Volt NavMeshTileHeader tileHeader; tileHeader.tileRef = mesh->getTileRef(tile); tileHeader.dataSize = tile->dataSize; - output.write(reinterpret_cast(&tileHeader), sizeof(NavMeshTileHeader)); - - output.write(reinterpret_cast(tile->data), tile->dataSize); + output.Write(tileHeader); + output.Write(tile->data); } return true; } - bool NavMeshImporter::SaveTiledNavMesh(std::ostream& output, Ref& asset) + bool NavMeshImporter::SaveTiledNavMesh(BinaryStreamWriter& output, Ref& asset) { return true; } - bool NavMeshImporter::LoadSingleNavMesh(std::ifstream& input, Ref& asset) + bool NavMeshImporter::LoadSingleNavMesh(BinaryStreamReader& input, const NavMeshSetHeader& header, Ref& asset) { - // Read header. - NavMeshSetHeader header; - if (!input.read(reinterpret_cast(&header), sizeof(NavMeshSetHeader))) - { - input.close(); - return false; - } - if (header.magic != NAVMESHSET_MAGIC) { - input.close(); return false; } if (header.version != NAVMESHSET_VERSION) { - input.close(); return false; } dtNavMesh* mesh = dtAllocNavMesh(); if (!mesh) { - input.close(); dtFree(mesh); return false; } dtStatus status = mesh->init(&header.params); if (dtStatusFailed(status)) { - input.close(); dtFree(mesh); return false; } @@ -155,12 +120,7 @@ namespace Volt for (int i = 0; i < header.numTiles; ++i) { NavMeshTileHeader tileHeader; - if (!input.read(reinterpret_cast(&tileHeader), sizeof(NavMeshTileHeader))) - { - input.close(); - dtFree(mesh); - return false; - } + input.Read(tileHeader); if (!tileHeader.tileRef || !tileHeader.dataSize) break; @@ -168,14 +128,8 @@ namespace Volt unsigned char* data = (unsigned char*)dtAlloc(tileHeader.dataSize, DT_ALLOC_PERM); if (!data) break; memset(data, 0, tileHeader.dataSize); - if (!input.read(reinterpret_cast(data), tileHeader.dataSize)) - { - dtFree(data); - dtFree(mesh); - input.close(); - return false; - } + input.Read(data); mesh->addTile(data, tileHeader.dataSize, DT_TILE_FREE_DATA, tileHeader.tileRef, 0); } @@ -184,7 +138,7 @@ namespace Volt return true; } - bool NavMeshImporter::LoadTiledNavMesh(std::ifstream& input, Ref& asset) + bool NavMeshImporter::LoadTiledNavMesh(BinaryStreamReader& input, const NavMeshSetHeader& header, Ref& asset) { return true; } diff --git a/Volt/Navigation/src/Navigation/Filesystem/NavMeshImporter.h b/Volt/Navigation/src/Navigation/Filesystem/NavMeshImporter.h index 4f5adc20c..2082c1a21 100644 --- a/Volt/Navigation/src/Navigation/Filesystem/NavMeshImporter.h +++ b/Volt/Navigation/src/Navigation/Filesystem/NavMeshImporter.h @@ -6,6 +6,9 @@ namespace Volt { + class BinaryStreamReader; + class BinaryStreamWriter; + namespace AI { class NavMeshImporter @@ -14,15 +17,29 @@ namespace Volt NavMeshImporter() = delete; virtual ~NavMeshImporter() = delete; - static bool SaveNavMesh(std::ostream& output, Ref& asset); - static bool LoadNavMesh(std::ifstream& input, Ref& asset); + static bool SaveNavMesh(BinaryStreamWriter& output, Ref& asset); + static bool LoadNavMesh(BinaryStreamReader& input, Ref& asset); private: - static bool SaveSingleNavMesh(std::ostream& output, Ref& asset); - static bool SaveTiledNavMesh(std::ostream& output, Ref& asset); + struct NavMeshSetHeader + { + int magic; + int version; + int numTiles; + dtNavMeshParams params; + }; + + struct NavMeshTileHeader + { + dtTileRef tileRef; + int dataSize; + }; + + static bool SaveSingleNavMesh(BinaryStreamWriter& output, Ref& asset); + static bool SaveTiledNavMesh(BinaryStreamWriter& output, Ref& asset); - static bool LoadSingleNavMesh(std::ifstream& input, Ref& asset); - static bool LoadTiledNavMesh(std::ifstream& input, Ref& asset); + static bool LoadSingleNavMesh(BinaryStreamReader& input, const NavMeshSetHeader& header, Ref& asset); + static bool LoadTiledNavMesh(BinaryStreamReader& input, const NavMeshSetHeader& header, Ref& asset); }; } } diff --git a/Volt/Navigation/src/Navigation/NavMesh/VTNavMesh.cpp b/Volt/Navigation/src/Navigation/NavMesh/VTNavMesh.cpp index 63f0d54f9..fb9d12fe2 100644 --- a/Volt/Navigation/src/Navigation/NavMesh/VTNavMesh.cpp +++ b/Volt/Navigation/src/Navigation/NavMesh/VTNavMesh.cpp @@ -7,7 +7,7 @@ namespace Volt { namespace AI { - NavMesh::NavMesh(Ref navmesh, Ref tilecache) + void NavMesh::Initialize(Ref navmesh, Ref tilecache) { myNavMesh = CreateRef(navmesh, tilecache); myCrowd = CreateRef(myNavMesh); diff --git a/Volt/Navigation/src/Navigation/NavMesh/VTNavMesh.h b/Volt/Navigation/src/Navigation/NavMesh/VTNavMesh.h index bac96a977..5955b00d0 100644 --- a/Volt/Navigation/src/Navigation/NavMesh/VTNavMesh.h +++ b/Volt/Navigation/src/Navigation/NavMesh/VTNavMesh.h @@ -19,9 +19,10 @@ namespace Volt { public: NavMesh() = default; - NavMesh(Ref navmesh, Ref tilecache = nullptr); virtual ~NavMesh() = default; + void Initialize(Ref navmesh, Ref tilecache = nullptr); + Ref& GetNavMesh() { return myNavMesh; } Ref& GetCrowd() { return myCrowd; } @@ -30,6 +31,7 @@ namespace Volt private: friend class NavigationSystem; + void Update(float deltaTime); Ref myNavMesh = nullptr; diff --git a/Volt/Navigation/src/NavigationEditor/Builder/RecastBuilder.cpp b/Volt/Navigation/src/NavigationEditor/Builder/RecastBuilder.cpp index ba6081827..9ad398879 100644 --- a/Volt/Navigation/src/NavigationEditor/Builder/RecastBuilder.cpp +++ b/Volt/Navigation/src/NavigationEditor/Builder/RecastBuilder.cpp @@ -762,7 +762,8 @@ Ref RecastBuilder::BuildSingleNavMesh() return nullptr; } - result = CreateRef(navMesh); + result = CreateRef(); + result->Initialize(navMesh); if (result) { @@ -948,7 +949,8 @@ Ref RecastBuilder::BuildTiledNavMesh() } } - result = CreateRef(navMesh, tileCache); + result = CreateRef(); + result->Initialize(navMesh, tileCache); auto gridSize = tw * th; const float compressionRatio = (float)m_cacheCompressedSize / (float)(m_cacheRawSize + 1); diff --git a/Volt/Sandbox/src/Sandbox/Sandbox.cpp b/Volt/Sandbox/src/Sandbox/Sandbox.cpp index f78e58f8f..84eb642a3 100644 --- a/Volt/Sandbox/src/Sandbox/Sandbox.cpp +++ b/Volt/Sandbox/src/Sandbox/Sandbox.cpp @@ -90,6 +90,9 @@ #include +#include "Volt/Asset/ImportersNew/SourceTextureSerializer.h" +#include "Volt/Asset/ImportersNew/TextureSerializer.h" + Sandbox::Sandbox() { VT_ASSERT(!myInstance, "Sandbox already exists!"); @@ -101,6 +104,8 @@ Sandbox::~Sandbox() myInstance = nullptr; } +static Ref tex; + void Sandbox::OnAttach() { SelectionManager::Init(); @@ -224,6 +229,20 @@ void Sandbox::OnAttach() myRuntimeScene->InitializeEngineScripts(); + Volt::AssetMetadata metadata; + Ref texSourceImporter = CreateRef(); + metadata.filePath = "Assets/Player Test/CH_Player_01_MAT_C.dds"; + + Ref sourceTex = CreateRef(); + texSourceImporter->Deserialize(metadata, sourceTex); + + Ref texSerializer = CreateRef(); + metadata.filePath = "Assets/Player Test/CH_Player_01_MAT_C.vtasset"; + texSerializer->Serialize(metadata, sourceTex); + + tex = CreateRef(); + texSerializer->Deserialize(metadata, tex); + m_isInitialized = true; } @@ -880,6 +899,13 @@ bool Sandbox::OnImGuiUpdateEvent(Volt::AppImGuiUpdateEvent& e) RenderProgressBar(buildProgess); } + if (ImGui::Begin("Test")) + { + ImGui::Image(UI::GetTextureID(tex), { 512, 512 }); + + ImGui::End(); + } + return false; } diff --git a/Volt/Sandbox/src/Sandbox/Window/AssetBrowser/AssetBrowserPanel.cpp b/Volt/Sandbox/src/Sandbox/Window/AssetBrowser/AssetBrowserPanel.cpp index 7101c3b77..53d8cd603 100644 --- a/Volt/Sandbox/src/Sandbox/Window/AssetBrowser/AssetBrowserPanel.cpp +++ b/Volt/Sandbox/src/Sandbox/Window/AssetBrowser/AssetBrowserPanel.cpp @@ -1638,7 +1638,9 @@ void AssetBrowserPanel::CreateNewShaderModal() fout << out.c_str(); fout.close(); - Ref newShader = Volt::AssetManager::CreateAsset(Volt::AssetManager::GetRelativePath(myCurrentDirectory->path), tempName + ".vtsdef", tempName, shaderPaths, false); + Ref newShader = Volt::AssetManager::CreateAsset(Volt::AssetManager::GetRelativePath(myCurrentDirectory->path), tempName + ".vtsdef"); + newShader->Initialize(tempName, shaderPaths, false); + Volt::ShaderRegistry::Register(tempName, newShader); } diff --git a/Volt/Volt/src/Volt/Asset/Animation/AnimatedCharacter.h b/Volt/Volt/src/Volt/Asset/Animation/AnimatedCharacter.h index 0936e4076..09b179fbf 100644 --- a/Volt/Volt/src/Volt/Asset/Animation/AnimatedCharacter.h +++ b/Volt/Volt/src/Volt/Asset/Animation/AnimatedCharacter.h @@ -67,6 +67,7 @@ namespace Volt private: friend class AnimatedCharacterImporter; + friend class AnimatedCharacterSerializer; Ref mySkeleton; Ref mySkin; diff --git a/Volt/Volt/src/Volt/Asset/Animation/Animation.h b/Volt/Volt/src/Volt/Asset/Animation/Animation.h index 0f4d12a97..c4daeb2ae 100644 --- a/Volt/Volt/src/Volt/Asset/Animation/Animation.h +++ b/Volt/Volt/src/Volt/Asset/Animation/Animation.h @@ -2,6 +2,9 @@ #include "Volt/Asset/Asset.h" +#include "Volt/Utility/FileIO/BinaryStreamWriter.h" +#include "Volt/Utility/FileIO/BinaryStreamReader.h" + #include namespace Volt @@ -15,11 +18,35 @@ namespace Volt glm::vec3 position = { 0.f }; glm::quat rotation = { 1.f, 0.f, 0.f, 0.f }; glm::vec3 scale = { 1.f }; + + static void Serialize(BinaryStreamWriter& streamWriter, const TRS& data) + { + streamWriter.Write(data.position); + streamWriter.Write(data.rotation); + streamWriter.Write(data.scale); + } + + static void Deserialize(BinaryStreamReader& streamReader, TRS& outData) + { + streamReader.Read(outData.position); + streamReader.Read(outData.rotation); + streamReader.Read(outData.scale); + } }; struct Pose { std::vector localTRS; + + static void Serialize(BinaryStreamWriter& streamWriter, const Pose& data) + { + streamWriter.WriteRaw(data.localTRS); + } + + static void Deserialize(BinaryStreamReader& streamReader, Pose& outData) + { + streamReader.ReadRaw(outData.localTRS); + } }; const std::vector Sample(float aStartTime, Ref aSkeleton, bool looping); @@ -51,6 +78,7 @@ namespace Volt friend class FbxImporter; friend class AnimationImporter; + friend class AnimationSerializer; std::vector myFrames; diff --git a/Volt/Volt/src/Volt/Asset/Animation/AnimationGraphAsset.h b/Volt/Volt/src/Volt/Asset/Animation/AnimationGraphAsset.h index 9daae894d..fecaf1006 100644 --- a/Volt/Volt/src/Volt/Asset/Animation/AnimationGraphAsset.h +++ b/Volt/Volt/src/Volt/Asset/Animation/AnimationGraphAsset.h @@ -42,6 +42,7 @@ namespace Volt Ref GetRelevantAnimationNode(); private: friend class AnimationGraphImporter; + friend class AnimationGraphSerializer; AssetHandle mySkeletonHandle = Asset::Null(); std::string myGraphState; diff --git a/Volt/Volt/src/Volt/Asset/Animation/Skeleton.h b/Volt/Volt/src/Volt/Asset/Animation/Skeleton.h index 1a6b062ff..6308e6ce4 100644 --- a/Volt/Volt/src/Volt/Asset/Animation/Skeleton.h +++ b/Volt/Volt/src/Volt/Asset/Animation/Skeleton.h @@ -14,6 +14,18 @@ namespace Volt { std::string name; int32_t parentIndex = -1; + + static void Serialize(BinaryStreamWriter& streamWriter, const Joint& data) + { + streamWriter.Write(data.name); + streamWriter.Write(data.parentIndex); + } + + static void Deserialize(BinaryStreamReader& streamReader, Joint& outData) + { + streamReader.Read(outData.name); + streamReader.Read(outData.parentIndex); + } }; Skeleton() = default; @@ -39,6 +51,7 @@ namespace Volt private: friend class FbxImporter; friend class SkeletonImporter; + friend class SkeletonSerializer; std::vector myJoints; std::vector myRestPose; diff --git a/Volt/Volt/src/Volt/Asset/Asset.h b/Volt/Volt/src/Volt/Asset/Asset.h index 5522f532d..762fb01d0 100644 --- a/Volt/Volt/src/Volt/Asset/Asset.h +++ b/Volt/Volt/src/Volt/Asset/Asset.h @@ -14,7 +14,7 @@ namespace Volt { using AssetHandle = UUID; - enum class AssetFlag : uint16_t + enum class AssetFlag : uint8_t { None = 0, Missing = BIT(0), @@ -22,7 +22,7 @@ namespace Volt Queued = BIT(2) }; - enum class AssetType : uint32_t + enum class AssetType : uint64_t { None = 0, Mesh = BIT(0), @@ -206,7 +206,7 @@ namespace Volt public: virtual ~Asset() = default; - inline bool IsValid() const { return ((assetFlags & (uint16_t)AssetFlag::Missing) | (assetFlags & (uint16_t)AssetFlag::Invalid) | (assetFlags & (uint16_t)AssetFlag::Queued)) == 0; } + inline bool IsValid() const { return ((assetFlags & (uint8_t)AssetFlag::Missing) | (assetFlags & (uint8_t)AssetFlag::Invalid) | (assetFlags & (uint8_t)AssetFlag::Queued)) == 0; } inline virtual bool operator==(const Asset& other) { @@ -218,16 +218,16 @@ namespace Volt return !(*this == other); } - inline bool IsFlagSet(AssetFlag flag) { return (assetFlags & (uint16_t)flag) != 0; } + inline bool IsFlagSet(AssetFlag flag) { return (assetFlags & (uint8_t)flag) != 0; } inline void SetFlag(AssetFlag flag, bool state) { if (state) { - assetFlags |= (uint16_t)flag; + assetFlags |= (uint8_t)flag; } else { - assetFlags &= ~(uint16_t)flag; + assetFlags &= ~(uint8_t)flag; } } @@ -235,8 +235,9 @@ namespace Volt static AssetType GetStaticType() { return AssetType::None; } virtual AssetType GetType() { assert(false); return AssetType::None; } + //virtual uint32_t GetVersion() = 0; // #TODO_Ivar: Implement - uint16_t assetFlags = (uint16_t)AssetFlag::None; + uint8_t assetFlags = (uint8_t)AssetFlag::None; AssetHandle handle = {}; std::string assetName; }; diff --git a/Volt/Volt/src/Volt/Asset/AssetManager.cpp b/Volt/Volt/src/Volt/Asset/AssetManager.cpp index 98063cef0..541ffbf8d 100644 --- a/Volt/Volt/src/Volt/Asset/AssetManager.cpp +++ b/Volt/Volt/src/Volt/Asset/AssetManager.cpp @@ -47,22 +47,22 @@ namespace Volt MeshTypeImporter::Initialize(); TextureImporter::Initialize(); - m_assetImporters.emplace(AssetType::MeshSource, CreateScope()); - m_assetImporters.emplace(AssetType::Texture, CreateScope()); - m_assetImporters.emplace(AssetType::Shader, CreateScope()); + m_assetImporters.emplace(AssetType::MeshSource, CreateScope()); // Done + m_assetImporters.emplace(AssetType::Texture, CreateScope()); // Done + m_assetImporters.emplace(AssetType::Shader, CreateScope()); // Done m_assetImporters.emplace(AssetType::Material, CreateScope()); - m_assetImporters.emplace(AssetType::Mesh, CreateScope()); - m_assetImporters.emplace(AssetType::NavMesh, CreateScope()); - m_assetImporters.emplace(AssetType::Scene, CreateScope()); - m_assetImporters.emplace(AssetType::Skeleton, CreateScope()); - m_assetImporters.emplace(AssetType::AnimationGraph, CreateScope()); - m_assetImporters.emplace(AssetType::Animation, CreateScope()); - m_assetImporters.emplace(AssetType::AnimatedCharacter, CreateScope()); - m_assetImporters.emplace(AssetType::ParticlePreset, CreateScope()); - m_assetImporters.emplace(AssetType::Prefab, CreateScope()); - m_assetImporters.emplace(AssetType::Font, CreateScope()); - m_assetImporters.emplace(AssetType::PhysicsMaterial, CreateScope()); - m_assetImporters.emplace(AssetType::Video, CreateScope()); + m_assetImporters.emplace(AssetType::Mesh, CreateScope()); // Done + m_assetImporters.emplace(AssetType::NavMesh, CreateScope()); // Done + m_assetImporters.emplace(AssetType::Scene, CreateScope()); // Done + m_assetImporters.emplace(AssetType::Skeleton, CreateScope()); // Done + m_assetImporters.emplace(AssetType::AnimationGraph, CreateScope()); // Done + m_assetImporters.emplace(AssetType::Animation, CreateScope()); // Done + m_assetImporters.emplace(AssetType::AnimatedCharacter, CreateScope()); // Done + m_assetImporters.emplace(AssetType::ParticlePreset, CreateScope()); // Done + m_assetImporters.emplace(AssetType::Prefab, CreateScope()); // Done + m_assetImporters.emplace(AssetType::Font, CreateScope()); // Done + m_assetImporters.emplace(AssetType::PhysicsMaterial, CreateScope()); // Done + m_assetImporters.emplace(AssetType::Video, CreateScope()); // Done m_assetImporters.emplace(AssetType::BehaviorGraph, CreateScope()); m_assetImporters.emplace(AssetType::BlendSpace, CreateScope()); m_assetImporters.emplace(AssetType::PostProcessingStack, CreateScope()); diff --git a/Volt/Volt/src/Volt/Asset/Importers/AssetImporter.cpp b/Volt/Volt/src/Volt/Asset/Importers/AssetImporter.cpp index 93546a5a8..136d40427 100644 --- a/Volt/Volt/src/Volt/Asset/Importers/AssetImporter.cpp +++ b/Volt/Volt/src/Volt/Asset/Importers/AssetImporter.cpp @@ -602,7 +602,8 @@ namespace Volt return false; } - asset = CreateRef(filePath); + asset = CreateRef(); + std::reinterpret_pointer_cast(asset)->Initialize(filePath); return true; } @@ -685,7 +686,8 @@ namespace Volt return false; } - asset = CreateRef