From f083147806d330eb68405192224684a6f18eac35 Mon Sep 17 00:00:00 2001 From: Xiao Qi Date: Thu, 2 Mar 2023 16:35:30 +0800 Subject: [PATCH] WIP Retrofit new data into existing structure --- .../Asset Types/Models/SHAnimationAsset.h | 6 +- .../Assets/Asset Types/Models/SHMeshAsset.h | 11 +- .../Assets/Asset Types/Models/SHRigAsset.cpp | 4 +- .../Assets/Asset Types/Models/SHRigAsset.h | 6 +- .../Libraries/Loaders/SHModelLoader.cpp | 101 +++++++++++++++--- 5 files changed, 98 insertions(+), 30 deletions(-) diff --git a/SHADE_Engine/src/Assets/Asset Types/Models/SHAnimationAsset.h b/SHADE_Engine/src/Assets/Asset Types/Models/SHAnimationAsset.h index bdc2a88d..8b6db749 100644 --- a/SHADE_Engine/src/Assets/Asset Types/Models/SHAnimationAsset.h +++ b/SHADE_Engine/src/Assets/Asset Types/Models/SHAnimationAsset.h @@ -61,9 +61,9 @@ namespace SHADE { AnimationInterpolation interpolation; - std::vector positionKeys; - std::vector rotationKeys; - std::vector scaleKeys; + std::vector positionKeys{}; + std::vector rotationKeys{}; + std::vector scaleKeys{}; }; struct SH_API SHAnimAsset final : SHAssetData diff --git a/SHADE_Engine/src/Assets/Asset Types/Models/SHMeshAsset.h b/SHADE_Engine/src/Assets/Asset Types/Models/SHMeshAsset.h index 37172070..e4ed6060 100644 --- a/SHADE_Engine/src/Assets/Asset Types/Models/SHMeshAsset.h +++ b/SHADE_Engine/src/Assets/Asset Types/Models/SHMeshAsset.h @@ -28,12 +28,6 @@ namespace SHADE bool hasWeights; }; - struct VertexWeight - { - SHVec4 weights; - SHVec4U joints; - }; - struct SH_API SHMeshAsset : SHAssetData { std::string name; @@ -44,6 +38,9 @@ namespace SHADE std::vector Indices{}; //Variables - std::vector VertexWeights{}; + std::vector VertexBoneWeights{}; + std::vector VertexBoneIndices{}; + + uint32_t BoneCount; }; } diff --git a/SHADE_Engine/src/Assets/Asset Types/Models/SHRigAsset.cpp b/SHADE_Engine/src/Assets/Asset Types/Models/SHRigAsset.cpp index f5186a0c..d5af3dbf 100644 --- a/SHADE_Engine/src/Assets/Asset Types/Models/SHRigAsset.cpp +++ b/SHADE_Engine/src/Assets/Asset Types/Models/SHRigAsset.cpp @@ -1,13 +1,11 @@ #include "SHpch.h" #include "SHRigAsset.h" -#include - namespace SHADE { SHRigAsset::~SHRigAsset() { if (root != nullptr) - delete[] root; + delete[] root; } } diff --git a/SHADE_Engine/src/Assets/Asset Types/Models/SHRigAsset.h b/SHADE_Engine/src/Assets/Asset Types/Models/SHRigAsset.h index 66edc081..be9c8b14 100644 --- a/SHADE_Engine/src/Assets/Asset Types/Models/SHRigAsset.h +++ b/SHADE_Engine/src/Assets/Asset Types/Models/SHRigAsset.h @@ -39,11 +39,7 @@ namespace SHADE struct SHRigNodeData { std::string name; - std::vector - rotation, - scale, - translation, - matrix; + SHMatrix transform; SHMatrix inverseBindMatrix; }; diff --git a/SHADE_Engine/src/Assets/Libraries/Loaders/SHModelLoader.cpp b/SHADE_Engine/src/Assets/Libraries/Loaders/SHModelLoader.cpp index ba2b8be4..bdccf55e 100644 --- a/SHADE_Engine/src/Assets/Libraries/Loaders/SHModelLoader.cpp +++ b/SHADE_Engine/src/Assets/Libraries/Loaders/SHModelLoader.cpp @@ -17,6 +17,52 @@ namespace SHADE { + inline SHVec3 GetVec3FromVector(std::vector const& vec) + { + assert(vec.size() == NODE_COMPONENT_COUNT_TRANSLATION); + + return SHVec3{ + static_cast(vec[0]), + static_cast(vec[1]), + static_cast(vec[2]) + }; + } + + inline SHVec4 GetVec4FromVector(std::vector const& vec) + { + assert(vec.size() == NODE_COMPONENT_COUNT_ROTATION); + return SHVec4{ + static_cast(vec[0]), + static_cast(vec[1]), + static_cast(vec[2]), + static_cast(vec[3]) + }; + } + + inline SHMatrix GetMatrixFromVector(std::vector const& vec) + { + assert(vec.size() == NODE_COMPONENT_COUNT_MATRIX); + + return SHMatrix{ + static_cast(vec[0]), + static_cast(vec[1]), + static_cast(vec[2]), + static_cast(vec[3]), + static_cast(vec[4]), + static_cast(vec[5]), + static_cast(vec[6]), + static_cast(vec[7]), + static_cast(vec[8]), + static_cast(vec[9]), + static_cast(vec[10]), + static_cast(vec[11]), + static_cast(vec[12]), + static_cast(vec[13]), + static_cast(vec[14]), + static_cast(vec[15]) + }; + } + void SHModelLoader::ReadHeaders(FileReference file, SHModelAsset& asset) { file.read( @@ -57,6 +103,11 @@ namespace SHADE ReadRigHeader(file, asset.rig.header); ReadRigData(file, asset.rig.header, asset.rig.nodeDataCollection); ReadRigTree(file, asset.rig.header, asset.rig.root); + + for (auto& mesh : asset.meshes) + { + mesh->BoneCount = asset.rig.nodeDataCollection.size(); + } } } @@ -115,48 +166,64 @@ namespace SHADE auto& node = data[i]; node.name.resize(header.charCounts[i]); file.read( - data[i].name.data(), + node.name.data(), header.charCounts[i] ); + file.read( + reinterpret_cast(&node.inverseBindMatrix), + sizeof(SHMatrix) + ); + NodeDataFlag flag; file.get(reinterpret_cast(flag)); + SHVec3 scale{ SHVec3::One }, translation{ SHVec3::Zero }; + SHVec4 rotation{ SHVec4::UnitW }; + SHMatrix matrix{ SHMatrix::Identity }; + std::vector carrier; + if (flag & NODE_DATA_ROTATION) { - node.rotation.resize(NODE_COMPONENT_COUNT_ROTATION); + carrier.resize(NODE_COMPONENT_COUNT_ROTATION); file.read( - reinterpret_cast(node.rotation.data()), + reinterpret_cast(carrier.data()), sizeof(double) * NODE_COMPONENT_COUNT_ROTATION ); + rotation = GetVec4FromVector(carrier); } if (flag & NODE_DATA_SCALE) { - node.scale.resize(NODE_COMPONENT_COUNT_SCALE); + carrier.resize(NODE_COMPONENT_COUNT_SCALE); file.read( - reinterpret_cast(node.scale.data()), + reinterpret_cast(carrier.data()), sizeof(double) * NODE_COMPONENT_COUNT_SCALE ); + scale = GetVec3FromVector(carrier); } if (flag & NODE_DATA_TRANSLATION) { - node.translation.resize(NODE_COMPONENT_COUNT_TRANSLATION); + carrier.resize(NODE_COMPONENT_COUNT_TRANSLATION); file.read( - reinterpret_cast(node.translation.data()), + reinterpret_cast(carrier.data()), sizeof(double) * NODE_COMPONENT_COUNT_TRANSLATION ); + translation = GetVec3FromVector(carrier); } if (flag & NODE_DATA_MATRIX) { - node.matrix.resize(NODE_COMPONENT_COUNT_MATRIX); + carrier.resize(NODE_COMPONENT_COUNT_MATRIX); file.read( - reinterpret_cast(node.matrix.data()), - sizeof(double) * NODE_DATA_MATRIX + reinterpret_cast(carrier.data()), + sizeof(double) * NODE_COMPONENT_COUNT_MATRIX ); + matrix = GetMatrixFromVector(carrier); } + + auto result{ SHMatrix::Transform(translation, rotation, scale) }; } } @@ -230,8 +297,18 @@ namespace SHADE if (header.hasWeights) { - data.VertexWeights.resize(header.vertexCount); - file.read(reinterpret_cast(data.VertexWeights.data()), sizeof(VertexWeight) * header.vertexCount); + data.VertexBoneIndices.resize(header.vertexCount); + data.VertexBoneWeights.resize(header.vertexCount); + + file.read( + reinterpret_cast(data.VertexBoneWeights.data()), + sizeof(SHVec4) * header.vertexCount + ); + + file.read( + reinterpret_cast(data.VertexBoneIndices.data()), + sizeof(SHVec4U) * header.vertexCount + ); } meshes[i] = &data;