diff --git a/SHADE_Engine/src/Animation/SHAnimatorComponent.cpp b/SHADE_Engine/src/Animation/SHAnimatorComponent.cpp index 518f87fb..0b4e9795 100644 --- a/SHADE_Engine/src/Animation/SHAnimatorComponent.cpp +++ b/SHADE_Engine/src/Animation/SHAnimatorComponent.cpp @@ -132,19 +132,19 @@ namespace SHADE void SHAnimatorComponent::updatePoseWithClip(int closestFrameIndex, float poseTime, Handle node, const SHMatrix& parentMatrix) { // Check if there is a channel for this node - const int BONE_IDX = rig->GetNodeIndex(node); SHMatrix transformMatrix = node->TransformMatrix; - const auto& CHANNELS = currClip->GetChannels(); - if (BONE_IDX < CHANNELS.size()) - { - const auto& CHANNEL = CHANNELS[BONE_IDX]; - transformMatrix = SHMatrix::Transform - ( - getInterpolatedValue(CHANNEL.PositionKeyFrames, closestFrameIndex, poseTime), - getInterpolatedValue(CHANNEL.RotationKeyFrames, closestFrameIndex, poseTime), - getInterpolatedValue(CHANNEL.ScaleKeyFrames, closestFrameIndex, poseTime) - ); - } + //const int BONE_IDX = rig->GetNodeIndex(node); + //const auto& CHANNELS = currClip->GetChannels(); + //if (BONE_IDX < CHANNELS.size()) + //{ + // const auto& CHANNEL = CHANNELS[BONE_IDX]; + // transformMatrix = SHMatrix::Transform + // ( + // getInterpolatedValue(CHANNEL.PositionKeyFrames, closestFrameIndex, poseTime), + // getInterpolatedValue(CHANNEL.RotationKeyFrames, closestFrameIndex, poseTime), + // getInterpolatedValue(CHANNEL.ScaleKeyFrames, closestFrameIndex, poseTime) + // ); + //} // Apply parent's transformation transformMatrix = transformMatrix * parentMatrix; diff --git a/SHADE_Engine/src/Animation/SHRig.cpp b/SHADE_Engine/src/Animation/SHRig.cpp index e088622e..f6fad3d5 100644 --- a/SHADE_Engine/src/Animation/SHRig.cpp +++ b/SHADE_Engine/src/Animation/SHRig.cpp @@ -120,8 +120,10 @@ namespace SHADE // Fill the node with data const auto& NODE_DATA = asset.nodeDataCollection.at(sourceNode->idRef); - newNode->OffsetMatrix = SHMatrix::Transpose(NODE_DATA.inverseBindMatrix); - newNode->TransformMatrix = SHMatrix::Transpose(NODE_DATA.transform); + //newNode->OffsetMatrix = SHMatrix::Transpose(NODE_DATA.inverseBindMatrix); + //newNode->TransformMatrix = SHMatrix::Transpose(NODE_DATA.transform); + newNode->OffsetMatrix = NODE_DATA.inverseBindMatrix; + newNode->TransformMatrix = NODE_DATA.transform; // Populate maps if (!NODE_DATA.name.empty()) diff --git a/SHADE_Engine/src/Assets/Libraries/Loaders/SHModelLoader.cpp b/SHADE_Engine/src/Assets/Libraries/Loaders/SHModelLoader.cpp index 26f16d34..19078d90 100644 --- a/SHADE_Engine/src/Assets/Libraries/Loaders/SHModelLoader.cpp +++ b/SHADE_Engine/src/Assets/Libraries/Loaders/SHModelLoader.cpp @@ -108,6 +108,8 @@ namespace SHADE { mesh->BoneCount = asset.rig.nodeDataCollection.size(); } + + //BuildTransformMatrices(asset.rig); } } @@ -138,6 +140,26 @@ namespace SHADE ); } + void SHModelLoader::BuildTransformMatrices(SHRigAsset& rig) + { + std::queue nodeQueue; + nodeQueue.push(rig.root); + + while(!nodeQueue.empty()) + { + auto& current = nodeQueue.front(); + nodeQueue.pop(); + auto& parentData {rig.nodeDataCollection[current->idRef]}; + + for (auto const& child: current->children) + { + nodeQueue.push(child); + auto& childData {rig.nodeDataCollection[child->idRef]}; + childData.transform = childData.transform * parentData.transform; + } + } + } + void SHModelLoader::ReadRigHeader(FileReference file, SHRigDataHeader& header) { file.read( @@ -174,7 +196,7 @@ namespace SHADE reinterpret_cast(&node.inverseBindMatrix), sizeof(SHMatrix) ); - node.inverseBindMatrix = SHMatrix::Transpose(node.inverseBindMatrix); + node.inverseBindMatrix = node.inverseBindMatrix; NodeDataFlag flag; file.get(reinterpret_cast(flag)); @@ -214,20 +236,21 @@ namespace SHADE translation = GetVec3FromVector(carrier); } - //if (flag & NODE_DATA_MATRIX) - //{ - // carrier.resize(NODE_COMPONENT_COUNT_MATRIX); - // file.read( - // reinterpret_cast(carrier.data()), - // sizeof(double) * NODE_COMPONENT_COUNT_MATRIX - // ); - // matrix = GetMatrixFromVector(carrier); - //} + if (flag & NODE_DATA_MATRIX) + { + carrier.resize(NODE_COMPONENT_COUNT_MATRIX); + file.read( + reinterpret_cast(carrier.data()), + sizeof(double) * NODE_COMPONENT_COUNT_MATRIX + ); + matrix = GetMatrixFromVector(carrier); + } //matrix *= SHMatrix::Transform(translation, rotation, scale); matrix *= SHMatrix::Translate(translation) * SHMatrix::Rotate(rotation) * SHMatrix::Scale(scale); - //result = SHMatrix::Transpose(result); node.transform = matrix; + //node.transform = SHMatrix::Inverse(node.inverseBindMatrix); + } } diff --git a/SHADE_Engine/src/Assets/Libraries/Loaders/SHModelLoader.h b/SHADE_Engine/src/Assets/Libraries/Loaders/SHModelLoader.h index d1afba6a..3861b70e 100644 --- a/SHADE_Engine/src/Assets/Libraries/Loaders/SHModelLoader.h +++ b/SHADE_Engine/src/Assets/Libraries/Loaders/SHModelLoader.h @@ -29,6 +29,8 @@ namespace SHADE void ReadAnimData(FileReference file, std::vector const& headers, std::vector& anims); void ReadAnimNode(FileReference file, uint32_t frameCount, SHAnimNode& data); + void BuildTransformMatrices(SHRigAsset& rig); + void ReadHeaders(FileReference file, SHModelAsset& asset); void ReadData(FileReference file, SHModelAsset& asset); public: diff --git a/SHADE_Engine/src/Assets/SHAssetMacros.h b/SHADE_Engine/src/Assets/SHAssetMacros.h index 54f775fa..db66f823 100644 --- a/SHADE_Engine/src/Assets/SHAssetMacros.h +++ b/SHADE_Engine/src/Assets/SHAssetMacros.h @@ -107,7 +107,6 @@ constexpr std::string_view EXTENSIONS[] = { "dummy", SCRIPT_EXTENSION, FONT_EXTENSION, - AUDIO_WAV_EXTENSION, AUDIO_BANK_EXTENSION }; diff --git a/SHADE_Engine/src/Filesystem/SHFileSystem.cpp b/SHADE_Engine/src/Filesystem/SHFileSystem.cpp index cbcbd45b..2ee7b062 100644 --- a/SHADE_Engine/src/Filesystem/SHFileSystem.cpp +++ b/SHADE_Engine/src/Filesystem/SHFileSystem.cpp @@ -162,6 +162,7 @@ namespace SHADE { assetCollection.emplace(asset.id, asset); } + if (file.name == asset.name) { AssetPath path{ file.path };