From eae6f6399b1a392cdc7006ecf2d115b7709275b0 Mon Sep 17 00:00:00 2001 From: Xiao Qi Date: Tue, 7 Mar 2023 22:05:33 +0800 Subject: [PATCH 1/3] Changed implementation of binary loader to load animation clip containers instead of individual animation clips --- .../Libraries/Loaders/SHBinaryLoader.cpp | 93 ++++++++++++++++--- .../Assets/Libraries/Loaders/SHBinaryLoader.h | 5 + 2 files changed, 83 insertions(+), 15 deletions(-) diff --git a/SHADE_Engine/src/Assets/Libraries/Loaders/SHBinaryLoader.cpp b/SHADE_Engine/src/Assets/Libraries/Loaders/SHBinaryLoader.cpp index 8ea85811..ad2a7f2c 100644 --- a/SHADE_Engine/src/Assets/Libraries/Loaders/SHBinaryLoader.cpp +++ b/SHADE_Engine/src/Assets/Libraries/Loaders/SHBinaryLoader.cpp @@ -1,7 +1,7 @@ #include "SHpch.h" #include "SHBinaryLoader.h" -#include "Assets/Asset Types/SHAnimClipAsset.h" +#include "Assets/Asset Types/SHAnimClipContainerAsset.h" #include @@ -19,15 +19,9 @@ namespace SHADE auto const extension = path.extension().string(); SHAssetData* result{nullptr}; - if (extension == ANIM_CLIP_EXTENSION) + if (extension == ANIM_CONTAINER_EXTENSION) { - const auto data = new SHAnimClipAsset(); - file.read( - reinterpret_cast(&data->animRawDataAssetId), - sizeof(uint32_t) * 3 - ); - data->name = path.stem().string(); - result = data; + LoadAnimClipContainer(file, result, path); } file.close(); @@ -47,15 +41,84 @@ namespace SHADE auto const extension = path.extension().string(); - if (extension == ANIM_CLIP_EXTENSION) + if (extension == ANIM_CONTAINER_EXTENSION) { - auto animClip = dynamic_cast(data); - file.write( - reinterpret_cast(&animClip->animRawDataAssetId), - sizeof(uint32_t) * 3 - ); + WriteAnimClipContainer(file, data, path); } file.close(); } + + void SHBinaryLoader::WriteAnimClipContainer(std::ofstream& file, SHAssetData const* data, AssetPath path) + { + auto const& anim = *dynamic_cast(data); + file.write( + reinterpret_cast(&anim.animRawDataAssetId), + sizeof(uint32_t) + ); + + uint32_t const size {static_cast(anim.clips.size())}; + + file.write( + reinterpret_cast(&size), + sizeof(uint32_t) + ); + + for (auto const& clip : anim.clips) + { + uint32_t charCount {static_cast(clip.name.size())}; + file.write( + reinterpret_cast(&charCount), + sizeof(uint32_t) + ); + + file.write( + clip.name.data(), + charCount + ); + + file.write( + reinterpret_cast(&clip.firstIndex), + sizeof(uint32_t) * 2 + ); + } + } + + void SHBinaryLoader::LoadAnimClipContainer(std::ifstream& file, SHAssetData* result, AssetPath path) + { + auto const data = new SHAnimClipContainerAsset(); + + file.read( + reinterpret_cast(&data->animRawDataAssetId), + sizeof(uint32_t) + ); + + uint32_t size; + + file.read( + reinterpret_cast(&size), + sizeof(uint32_t) + ); + + for (auto i{0}; i < size; ++i) + { + auto& clip {data->clips.emplace_back()}; + uint32_t charCount; + file.read( + reinterpret_cast(&charCount), + sizeof(uint32_t) + ); + + clip.name.resize(charCount); + file.read( + clip.name.data(), + charCount + ); + + file.read( + reinterpret_cast(&clip.firstIndex), + sizeof(uint32_t) * 2 + ); + } + } } diff --git a/SHADE_Engine/src/Assets/Libraries/Loaders/SHBinaryLoader.h b/SHADE_Engine/src/Assets/Libraries/Loaders/SHBinaryLoader.h index db2316e8..7cf50d51 100644 --- a/SHADE_Engine/src/Assets/Libraries/Loaders/SHBinaryLoader.h +++ b/SHADE_Engine/src/Assets/Libraries/Loaders/SHBinaryLoader.h @@ -8,5 +8,10 @@ namespace SHADE { SHAssetData* Load(AssetPath path) override; void Write(SHAssetData const* data, AssetPath path) override; + + private: + //Individual functions to write files + void WriteAnimClipContainer(std::ofstream& file,SHAssetData const* data, AssetPath path); + void LoadAnimClipContainer(std::ifstream& file,SHAssetData* result, AssetPath path); }; } \ No newline at end of file From 07100de9508b2b53d1658998711d962629571777 Mon Sep 17 00:00:00 2001 From: Xiao Qi Date: Tue, 7 Mar 2023 22:06:42 +0800 Subject: [PATCH 2/3] Added recognition for animation clip container as a file Added functions to create new sub asset for animation clips Added recognition for animation clip containers when creating new assets --- SHADE_Engine/src/Assets/SHAssetMacros.h | 13 +-- SHADE_Engine/src/Assets/SHAssetManager.cpp | 95 +++++++++++++++++++--- SHADE_Engine/src/Assets/SHAssetManager.h | 1 + 3 files changed, 91 insertions(+), 18 deletions(-) diff --git a/SHADE_Engine/src/Assets/SHAssetMacros.h b/SHADE_Engine/src/Assets/SHAssetMacros.h index 510bc35a..f9e21f15 100644 --- a/SHADE_Engine/src/Assets/SHAssetMacros.h +++ b/SHADE_Engine/src/Assets/SHAssetMacros.h @@ -57,6 +57,7 @@ enum class AssetType : AssetTypeMeta MESH, SCRIPT, FONT, + ANIM_CONTAINER, ANIM_CLIP, MAX_COUNT }; @@ -79,7 +80,7 @@ constexpr std::string_view FONT_COMPILER_EXE{ "FontCompiler.exe" }; constexpr std::string_view SCENE_FOLDER{ "/Scenes/" }; constexpr std::string_view PREFAB_FOLDER{ "/Prefabs/" }; constexpr std::string_view MATERIAL_FOLDER{ "/Materials/" }; -constexpr std::string_view ANIM_CLIP_FOLDER{ "/Animation Clips/" }; +constexpr std::string_view ANIM_CLIP_FOLDER{ "/Animations/" }; // ASSET EXTENSIONS @@ -95,7 +96,8 @@ constexpr std::string_view PREFAB_EXTENSION {".shprefab"}; constexpr std::string_view MATERIAL_EXTENSION {".shmat"}; constexpr std::string_view TEXTURE_EXTENSION {".shtex"}; constexpr std::string_view MODEL_EXTENSION{ ".shmodel" }; -constexpr std::string_view ANIM_CLIP_EXTENSION{ ".shanimclip" }; +constexpr std::string_view ANIM_CONTAINER_EXTENSION{ ".shanimcontainer" }; +constexpr std::string_view FILLER_EXTENSION{"dummy"}; constexpr std::string_view EXTENSIONS[] = { AUDIO_EXTENSION, @@ -106,14 +108,15 @@ constexpr std::string_view EXTENSIONS[] = { SCENE_EXTENSION, PREFAB_EXTENSION, MATERIAL_EXTENSION, - "dummy", + FILLER_EXTENSION, SCRIPT_EXTENSION, FONT_EXTENSION, AUDIO_WAV_EXTENSION, - ANIM_CLIP_EXTENSION + ANIM_CONTAINER_EXTENSION, + FILLER_EXTENSION }; -constexpr size_t EXTENSIONS_COUNT{ 11 }; +constexpr size_t EXTENSIONS_COUNT{ static_cast(AssetType::MAX_COUNT) }; // EXTERNAL EXTENSIONS constexpr std::string_view GLSL_EXTENSION{ ".glsl" }; diff --git a/SHADE_Engine/src/Assets/SHAssetManager.cpp b/SHADE_Engine/src/Assets/SHAssetManager.cpp index 503f9082..5ad2bbd4 100644 --- a/SHADE_Engine/src/Assets/SHAssetManager.cpp +++ b/SHADE_Engine/src/Assets/SHAssetManager.cpp @@ -26,7 +26,7 @@ #include "Asset Types/SHPrefabAsset.h" #include "Asset Types/SHMaterialAsset.h" #include "Asset Types/SHSceneAsset.h" -#include "Asset Types/SHAnimClipAsset.h" +#include "Asset Types/SHAnimClipContainerAsset.h" #include "Libraries/Compilers/SHTextureCompiler.h" #include "Libraries/Compilers/SHShaderSourceCompiler.h" @@ -238,10 +238,10 @@ namespace SHADE } break; - case AssetType::ANIM_CLIP: + case AssetType::ANIM_CONTAINER: newPath += ANIM_CLIP_FOLDER; newPath += name; - newPath += ANIM_CLIP_EXTENSION; + newPath += ANIM_CONTAINER_EXTENSION; { auto animClip = new SHAnimClipAsset(); @@ -252,7 +252,7 @@ namespace SHADE default: - SHLOG_ERROR("[Asset Manager] Asset type of {} not an internal asset type, cannot be created", name); + SHLOG_ERROR("[Asset Manager] Asset type of {} not an internal parent asset type, cannot be created", name); return 0; } @@ -267,13 +267,13 @@ namespace SHADE auto result = assetCollection.emplace( id, - SHAsset( - name, - id, - type, - newPath, - false - ) + SHAsset( + name, + id, + type, + newPath, + false + ) ); assetData.emplace(id, data); @@ -284,6 +284,40 @@ namespace SHADE return id; } + AssetID SHAssetManager::CreateNewSubAsset(AssetType type, AssetName name, AssetID parent) + { + if (!assetData.contains(parent)) + { + SHLOG_ERROR("[Asset Manager] Failed to create new sub asset, parent does not exist: {}", name); + return 0; + } + + switch(type) + { + case AssetType::ANIM_CLIP: + { + auto const animContainer {dynamic_cast(assetData[parent])}; + auto id = GenerateAssetID(type); + SHAsset asset{ + .name = name, + .id = id, + .type = type, + .isSubAsset = true, + .parent = parent + }; + auto& newClip {animContainer->clips.emplace_back()}; + newClip.name = name; + assetCollection.emplace(id, asset); + assetData.emplace(id, &newClip); + return id; + } + + default: + SHLOG_ERROR("[Asset Manager] Asset type of {} not an internal sub asset type, cannot be created", name); + return 0; + } + } + bool SHAssetManager::SaveAsset(AssetID id) noexcept { if (assetCollection.contains(id)) @@ -547,7 +581,8 @@ namespace SHADE loaders[static_cast(AssetType::MESH)] = nullptr; loaders[static_cast(AssetType::SCRIPT)] = nullptr; loaders[static_cast(AssetType::FONT)] = dynamic_cast(new SHFontLoader()); - loaders[static_cast(AssetType::ANIM_CLIP)] = dynamic_cast(new SHBinaryLoader()); + loaders[static_cast(AssetType::ANIM_CONTAINER)] = dynamic_cast(new SHBinaryLoader()); + loaders[static_cast(AssetType::ANIM_CLIP)] = nullptr; } /**************************************************************************** @@ -758,6 +793,38 @@ namespace SHADE return newAsset.id; } + else if(ext==ANIM_CONTAINER_EXTENSION) + { + SHAsset newAsset{ + path.stem().string(), + GenerateAssetID(AssetType::ANIM_CONTAINER), + AssetType::ANIM_CONTAINER, + path, + false + }; + + assetCollection.emplace(newAsset.id, newAsset); + + SHAnimClipContainerAsset* const data = reinterpret_cast(LoadData(newAsset)); + assetData.emplace(newAsset.id, data); + for(auto& clip : data->clips) + { + SHAsset subAsset{ + .name = clip.name, + .id = GenerateAssetID(AssetType::ANIM_CLIP), + .type = AssetType::ANIM_CLIP, + .isSubAsset = true, + .parent = newAsset.id + }; + + assetCollection.emplace(subAsset.id, subAsset); + assetCollection[newAsset.id].subAssets.push_back(&assetCollection[subAsset.id]); + + assetData.emplace(subAsset.id, &clip); + } + + SHAssetMetaHandler::WriteMetaData(assetCollection[newAsset.id]); + } } void SHAssetManager::BuildAssetCollection() noexcept @@ -814,7 +881,9 @@ namespace rttr value("Material", AssetType::MATERIAL), value("Mesh", AssetType::MESH), value("Script", AssetType::SCRIPT), - value("Font", AssetType::FONT) + value("Font", AssetType::FONT), + value("Animation Container", AssetType::ANIM_CONTAINER), + value("Animation Clip", AssetType::ANIM_CLIP) ); } } diff --git a/SHADE_Engine/src/Assets/SHAssetManager.h b/SHADE_Engine/src/Assets/SHAssetManager.h index e5cd0359..6a8f91ef 100644 --- a/SHADE_Engine/src/Assets/SHAssetManager.h +++ b/SHADE_Engine/src/Assets/SHAssetManager.h @@ -63,6 +63,7 @@ namespace SHADE * \return resource id generated for new asset ****************************************************************************/ static AssetID CreateNewAsset(AssetType type, AssetName name) noexcept; + static AssetID CreateNewSubAsset(AssetType type, AssetName name, AssetID parent); static bool SaveAsset(AssetID id) noexcept; static bool DeleteAsset(AssetID id) noexcept; From 3cc949bb7eafc67ab474ac6be1ee8b15df0cbbb4 Mon Sep 17 00:00:00 2001 From: Xiao Qi Date: Tue, 7 Mar 2023 22:07:38 +0800 Subject: [PATCH 3/3] Animation container redefinition --- .../Assets/Asset Types/Models/SHAnimationAsset.h | 2 -- ...AnimClipAsset.h => SHAnimClipContainerAsset.h} | 15 +++++++++++---- SHADE_Engine/src/Resource/SHResourceManager.h | 2 +- 3 files changed, 12 insertions(+), 7 deletions(-) rename SHADE_Engine/src/Assets/Asset Types/{SHAnimClipAsset.h => SHAnimClipContainerAsset.h} (81%) diff --git a/SHADE_Engine/src/Assets/Asset Types/Models/SHAnimationAsset.h b/SHADE_Engine/src/Assets/Asset Types/Models/SHAnimationAsset.h index d7128977..6e98c661 100644 --- a/SHADE_Engine/src/Assets/Asset Types/Models/SHAnimationAsset.h +++ b/SHADE_Engine/src/Assets/Asset Types/Models/SHAnimationAsset.h @@ -82,7 +82,5 @@ namespace SHADE double ticksPerSecond; std::vector nodeChannels; - //std::vector meshChannels; - //std::vector morphMeshChannels; }; } \ No newline at end of file diff --git a/SHADE_Engine/src/Assets/Asset Types/SHAnimClipAsset.h b/SHADE_Engine/src/Assets/Asset Types/SHAnimClipContainerAsset.h similarity index 81% rename from SHADE_Engine/src/Assets/Asset Types/SHAnimClipAsset.h rename to SHADE_Engine/src/Assets/Asset Types/SHAnimClipContainerAsset.h index c6887316..bac68579 100644 --- a/SHADE_Engine/src/Assets/Asset Types/SHAnimClipAsset.h +++ b/SHADE_Engine/src/Assets/Asset Types/SHAnimClipContainerAsset.h @@ -12,17 +12,24 @@ of DigiPen Institute of Technology is prohibited. #pragma once #include "SH_API.h" -#include "SHAssetData.h" #include +#include "Assets/SHAssetMacros.h" +#include "SHAssetData.h" + namespace SHADE { - struct SH_API SHAnimClipAsset : SHAssetData + struct SHAnimClipAsset : SHAssetData { std::string name; - AssetID animRawDataAssetId; uint32_t firstIndex; uint32_t lastIndex; }; -} \ No newline at end of file + + struct SH_API SHAnimClipContainerAsset final : SHAssetData + { + AssetID animRawDataAssetId; + std::vector clips; + }; +} diff --git a/SHADE_Engine/src/Resource/SHResourceManager.h b/SHADE_Engine/src/Resource/SHResourceManager.h index 21303982..2dfc7dac 100644 --- a/SHADE_Engine/src/Resource/SHResourceManager.h +++ b/SHADE_Engine/src/Resource/SHResourceManager.h @@ -21,7 +21,7 @@ of DigiPen Institute of Technology is prohibited. #include "Assets/Asset Types/Models/SHModelAsset.h" #include "Assets/Asset Types/SHTextureAsset.h" #include "Assets/Asset Types/SHShaderAsset.h" -#include "Assets/Asset Types/SHAnimClipAsset.h" +#include "Assets/Asset Types/SHAnimClipContainerAsset.h" #include "Assets/Asset Types/SHAnimControllerAsset.h" #include "Graphics/Shaders/SHVkShaderModule.h" #include "Graphics/MiddleEnd/Textures/SHTextureLibrary.h"