From acbf67f2a8726fd6eeced5188b4e9b8316207a5c Mon Sep 17 00:00:00 2001 From: Xiao Qi Date: Wed, 1 Mar 2023 17:54:27 +0800 Subject: [PATCH] Completed rig node data and rig structure write --- src/Libraries/MeshCompiler.hpp | 2 ++ src/Libraries/MeshWriter.cpp | 46 +++++++++++++++++++++++++++++++--- src/Libraries/MeshWriter.h | 1 + src/Types/MeshAsset.h | 1 - src/Types/RigAsset.h | 14 ++++------- 5 files changed, 50 insertions(+), 14 deletions(-) diff --git a/src/Libraries/MeshCompiler.hpp b/src/Libraries/MeshCompiler.hpp index bacefd2..ca2cfa7 100644 --- a/src/Libraries/MeshCompiler.hpp +++ b/src/Libraries/MeshCompiler.hpp @@ -301,6 +301,7 @@ namespace SH_COMP //node.weights ); } + for (auto const& skin : data.skins) { std::vector inverseBindMatrices; @@ -314,5 +315,6 @@ namespace SH_COMP nodes[joint].inverseBindMatrix = *(matrix++); } } + asset.rig.header.startNode = data.skins[0].joints[0]; } } diff --git a/src/Libraries/MeshWriter.cpp b/src/Libraries/MeshWriter.cpp index cb5f40c..df74954 100644 --- a/src/Libraries/MeshWriter.cpp +++ b/src/Libraries/MeshWriter.cpp @@ -128,6 +128,7 @@ namespace SH_COMP { WriteRigHeader(file, data.header); WriteRigNodeData(file, data); + WriteRigStructure(file, data); } void MeshWriter::WriteRigHeader(FileReference file, RigDataHeader const& header) @@ -174,26 +175,63 @@ namespace SH_COMP file.write( reinterpret_cast(node.rotation.data()), - sizeof(double) * NODE_COMPONENT_COUNT_ROTATION + sizeof(double) * node.rotation.size() ); file.write( reinterpret_cast(node.scale.data()), - sizeof(double) * NODE_COMPONENT_COUNT_SCALE + sizeof(double) * node.scale.size() ); file.write( reinterpret_cast(node.translation.data()), - sizeof(double) * NODE_COMPONENT_COUNT_TRANSLATION + sizeof(double) * node.translation.size() ); file.write( reinterpret_cast(node.matrix.data()), - sizeof(double) * NODE_COMPONENT_COUNT_MATRIX + sizeof(double) * node.matrix.size() ); } } + void MeshWriter::WriteRigStructure(FileReference file, RigData const& rig) + { + std::queue> nodeQueue; + nodeQueue.push( + std::make_pair( + rig.header.startNode, + rig.nodes.data() + rig.header.startNode + ) + ); + + while (!nodeQueue.empty()) + { + auto const currentPair = nodeQueue.front(); + auto const& node = *currentPair.second; + nodeQueue.pop(); + + file.write( + reinterpret_cast(¤tPair.first), + sizeof(IndexType) + ); + + auto const childCount{ static_cast(node.children.size()) }; + file.write( + reinterpret_cast(&childCount), + sizeof(uint32_t) + ); + + for (auto const& child : node.children) + { + nodeQueue.push(std::make_pair( + child, + rig.nodes.data() + child + )); + } + } + } + void MeshWriter::WriteHeaders(FileReference file, ModelConstRef asset) { file.write( diff --git a/src/Libraries/MeshWriter.h b/src/Libraries/MeshWriter.h index 87c57f5..e51fdeb 100644 --- a/src/Libraries/MeshWriter.h +++ b/src/Libraries/MeshWriter.h @@ -27,6 +27,7 @@ namespace SH_COMP static void WriteRig(FileReference file, RigData const& data); static void WriteRigHeader(FileReference file, RigDataHeader const& header); static void WriteRigNodeData(FileReference file, RigData const& rig); + static void WriteRigStructure(FileReference file, RigData const& rig); static void WriteHeaders(FileReference file, ModelConstRef asset); static void WriteData(FileReference file, ModelConstRef asset); diff --git a/src/Types/MeshAsset.h b/src/Types/MeshAsset.h index c419f88..91680f9 100644 --- a/src/Types/MeshAsset.h +++ b/src/Types/MeshAsset.h @@ -2,7 +2,6 @@ #include #include -#include #include "PseudoMath.h" diff --git a/src/Types/RigAsset.h b/src/Types/RigAsset.h index 7ec5102..d01c193 100644 --- a/src/Types/RigAsset.h +++ b/src/Types/RigAsset.h @@ -10,20 +10,16 @@ namespace SH_COMP { using NodeDataFlag = unsigned char; - constexpr NodeDataFlag NODE_DATA_ROTATION = 0b00001; - constexpr NodeDataFlag NODE_DATA_SCALE = 0b00010; - constexpr NodeDataFlag NODE_DATA_TRANSLATION = 0b00100; - constexpr NodeDataFlag NODE_DATA_MATRIX = 0b01000; + constexpr NodeDataFlag NODE_DATA_ROTATION = 0b0001; + constexpr NodeDataFlag NODE_DATA_SCALE = 0b0010; + constexpr NodeDataFlag NODE_DATA_TRANSLATION = 0b0100; + constexpr NodeDataFlag NODE_DATA_MATRIX = 0b1000; //constexpr NodeDataFlag NODE_DATA_WEIGHTS = 0b10000; - constexpr size_t NODE_COMPONENT_COUNT_ROTATION{ 4 }; - constexpr size_t NODE_COMPONENT_COUNT_SCALE{ 3 }; - constexpr size_t NODE_COMPONENT_COUNT_TRANSLATION{ 3 }; - constexpr size_t NODE_COMPONENT_COUNT_MATRIX{ 16 }; - struct RigDataHeader { uint32_t nodeCount; + IndexType startNode; std::vector charCounts; std::vector childCount; std::vector dataFlags;