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