From abd3f2dd53824d126969599862e8323ed522ffb5 Mon Sep 17 00:00:00 2001 From: Xiao Qi Date: Sat, 7 Jan 2023 00:16:28 +0800 Subject: [PATCH] Gave up on trying to build node collection while copying ai node tree. Tree copy is done, finish writing to file after building node data collection --- src/Libraries/MeshCompiler.cpp | 98 +++++++++++++++++++++------------- src/Libraries/MeshCompiler.h | 9 +++- src/Libraries/MeshWriter.cpp | 2 +- src/Libraries/MeshWriter.h | 4 +- src/Types/RigAsset.h | 11 ++-- 5 files changed, 73 insertions(+), 51 deletions(-) diff --git a/src/Libraries/MeshCompiler.cpp b/src/Libraries/MeshCompiler.cpp index 103f0aa..b160977 100644 --- a/src/Libraries/MeshCompiler.cpp +++ b/src/Libraries/MeshCompiler.cpp @@ -27,8 +27,8 @@ namespace SH_COMP SHMat4 result; std::memcpy( - reinterpret_cast(&result), - reinterpret_cast(&inMatrx), + &result, + &inMatrx, sizeof(result) ); @@ -38,22 +38,22 @@ namespace SH_COMP Assimp::Importer MeshCompiler::aiImporter; uint32_t MeshCompiler::rigNodeIDCounter { 0 }; - void MeshCompiler::ProcessNode(aiNode const& node, aiScene const& scene, MeshVectorRef meshes, RigData& rig) noexcept + void MeshCompiler::ProcessNode(AiNodeConstPtr node, aiScene const& scene, MeshVectorRef meshes, RigData& rig) noexcept { - for (auto i{0}; i < node.mNumChildren; ++i) + for (auto i{ 0 }; i < node->mNumChildren; ++i) { - auto const& child {*node.mChildren[i]}; + auto child{ node->mChildren[i] }; - if (child.mNumMeshes > 0) + if (child->mNumMeshes > 0) { - aiMesh* mesh = scene.mMeshes[child.mMeshes[0]]; - meshes.emplace_back(); - GetMesh(*mesh, meshes.back()); - meshes.back().name = child.mName.C_Str(); + aiMesh* mesh = scene.mMeshes[child->mMeshes[0]]; + meshes.emplace_back(); + GetMesh(*mesh, meshes.back()); + meshes.back().name = child->mName.C_Str(); } else { - BuildArmature(child, rig); + BuildArmature(child, rig); } } } @@ -68,7 +68,7 @@ namespace SH_COMP meshData.bonesInfo.resize(mesh.mNumBones); meshData.bones.resize(mesh.mNumBones); - for (auto i {0}; i < mesh.mNumBones; ++i) + for (auto i{ 0 }; i < mesh.mNumBones; ++i) { auto const& bone = *mesh.mBones[i]; auto& newBone = meshData.bones[i]; @@ -80,7 +80,7 @@ namespace SH_COMP std::memcpy(&newBone.offset, &bone.mOffsetMatrix, sizeof(SHMat4)); newBone.weights.resize(bone.mNumWeights); - for (auto j {0}; j < bone.mNumWeights; ++j) + for (auto j{ 0 }; j < bone.mNumWeights; ++j) { newBone.weights[j].index = bone.mWeights[j].mVertexId; newBone.weights[j].weight = bone.mWeights[j].mWeight; @@ -142,7 +142,7 @@ namespace SH_COMP // Mesh Headers asset.meshHeaders.resize(asset.meshes.size()); asset.header.meshCount = asset.meshes.size(); - for (auto i{0}; i < asset.header.meshCount; ++i) + for (auto i{ 0 }; i < asset.header.meshCount; ++i) { auto const& mesh = asset.meshes[i]; auto& head = asset.meshHeaders[i]; @@ -156,18 +156,18 @@ namespace SH_COMP // Anim Headers asset.animHeaders.resize(asset.anims.size()); asset.header.animCount = asset.anims.size(); - for (auto i{0}; i < asset.header.animCount; ++i) + for (auto i{ 0 }; i < asset.header.animCount; ++i) { auto const& anim = asset.anims[i]; auto& head = asset.animHeaders[i]; - + head.charCount = anim.name.size(); head.animNodeCount = anim.nodeChannels.size(); head.nodeHeaders.resize(head.animNodeCount); - for (auto j{0}; j < head.animNodeCount; ++j) + for (auto j{ 0 }; j < head.animNodeCount; ++j) { - auto const& animNode = anim.nodeChannels[j]; + auto const& animNode = anim.nodeChannels[j]; auto& nodeHeader = head.nodeHeaders[j]; nodeHeader.charCount = animNode.name.size(); @@ -182,9 +182,9 @@ namespace SH_COMP { // Size and read for number of animation clips anims.resize(scene.mNumAnimations); - for (auto i {0}; i < scene.mNumAnimations; ++i) + for (auto i{ 0 }; i < scene.mNumAnimations; ++i) { - auto const& animData = *scene.mAnimations[i]; + auto const& animData = *scene.mAnimations[i]; auto& anim = anims[i]; anim.name = animData.mName.C_Str(); @@ -193,7 +193,7 @@ namespace SH_COMP // Size and read for number of animation frames anim.nodeChannels.resize(animData.mNumChannels); - for (auto j {0}; j < animData.mNumChannels; ++j) + for (auto j{ 0 }; j < animData.mNumChannels; ++j) { auto const& channelData = *animData.mChannels[j]; auto& node = anim.nodeChannels[j]; @@ -202,9 +202,9 @@ namespace SH_COMP // Position Keys node.positionKeys.resize(channelData.mNumPositionKeys); - for (auto k{0}; k < channelData.mNumPositionKeys; ++k) + for (auto k{ 0 }; k < channelData.mNumPositionKeys; ++k) { - auto const& posKeyData = channelData.mPositionKeys[k]; + auto const& posKeyData = channelData.mPositionKeys[k]; auto& posKey = node.positionKeys[k]; posKey.time = posKeyData.mTime; @@ -212,12 +212,12 @@ namespace SH_COMP posKey.value.y = posKeyData.mValue.y; posKey.value.z = posKeyData.mValue.z; } - + // Rotation Keys node.rotationKeys.resize(channelData.mNumRotationKeys); - for (auto k{0}; k < channelData.mNumRotationKeys; ++k) + for (auto k{ 0 }; k < channelData.mNumRotationKeys; ++k) { - auto const& rotKeyData = channelData.mRotationKeys[k]; + auto const& rotKeyData = channelData.mRotationKeys[k]; auto& rotKey = node.rotationKeys[k]; rotKey.time = rotKeyData.mTime; @@ -226,12 +226,12 @@ namespace SH_COMP rotKey.value.z = rotKeyData.mValue.z; rotKey.value.w = rotKeyData.mValue.w; } - + // Scale Keys node.scaleKeys.resize(channelData.mNumScalingKeys); - for (auto k{0}; k < channelData.mNumScalingKeys; ++k) + for (auto k{ 0 }; k < channelData.mNumScalingKeys; ++k) { - auto const& scaKeyData = channelData.mScalingKeys[k]; + auto const& scaKeyData = channelData.mScalingKeys[k]; auto& scaKey = node.scaleKeys[k]; scaKey.time = scaKeyData.mTime; @@ -243,9 +243,19 @@ namespace SH_COMP } } + std::pair MeshCompiler::PairHelper(AiNodeConstPtr node) + { + return std::make_pair(NewNode(node), node); + } + + RigNodeData* MeshCompiler::NewNode(AiNodeConstPtr inNode) + { + return new RigNodeData(inNode->mName.C_Str(), aiTransformToMat4(inNode->mTransformation)); + } + void MeshCompiler::LoadFromFile(AssetPath path, ModelAsset& asset) noexcept { - const aiScene* scene = aiImporter.ReadFile(path.string().c_str(),0 + const aiScene* scene = aiImporter.ReadFile(path.string().c_str(), 0 //aiProcess_Triangulate // Make sure we get triangles rather than nvert polygons //| aiProcess_GenUVCoords // Convert any type of mapping to uv mapping //| aiProcess_TransformUVCoords // preprocess UV transformations (scaling, translation ...) @@ -264,26 +274,38 @@ namespace SH_COMP return; } - ProcessNode(*scene->mRootNode, *scene, asset.meshes, asset.rig); + ProcessNode(scene->mRootNode, *scene, asset.meshes, asset.rig); ParseAnimations(*scene, asset.anims); aiImporter.FreeScene(); } - - void MeshCompiler::BuildArmature(aiNode const& baseNode, RigData& rig) noexcept + void MeshCompiler::BuildArmature(AiNodeConstPtr baseNode, RigData& rig) noexcept { - std::queue> nodeQueue; - auto& collection = rig.nodeDataCollection; - collection.clear(); + // Build implementation copy of armature tree + // node collection write done later when writing to file + std::queue> nodeQueue; - //TODO FINISH BFS COPY + nodeQueue.emplace(PairHelper(baseNode)); + rig.root = nodeQueue.front().first; while(!nodeQueue.empty()) { - + auto currPair = nodeQueue.front(); + nodeQueue.pop(); + auto currNode = currPair.first; + auto const& currAiNode = currPair.second; + + for (auto i {0}; i < currAiNode->mNumChildren; ++i) + { + auto newPair = PairHelper(currAiNode->mChildren[i]); + currNode->children.push_back(newPair.first); + nodeQueue.push(newPair); + } } + + std::cout << "Done\n"; } void MeshCompiler::LoadAndCompile(AssetPath path) noexcept diff --git a/src/Libraries/MeshCompiler.h b/src/Libraries/MeshCompiler.h index 099da74..60920d7 100644 --- a/src/Libraries/MeshCompiler.h +++ b/src/Libraries/MeshCompiler.h @@ -30,16 +30,21 @@ namespace SH_COMP using ModelRef = ModelAsset&; + using AiNodeConstPtr = aiNode const*; + static Assimp::Importer aiImporter; static uint32_t rigNodeIDCounter; - static void ProcessNode(aiNode const& node, aiScene const& scene, MeshVectorRef meshes, RigData& rig) noexcept; + static void ProcessNode(AiNodeConstPtr node, aiScene const& scene, MeshVectorRef meshes, RigData& rig) noexcept; static void GetMesh(aiMesh const& mesh, MeshData& meshData) noexcept; static void BuildHeaders(ModelRef asset) noexcept; - static void BuildArmature(aiNode const& node, RigData& rig) noexcept; + static void BuildArmature(AiNodeConstPtr node, RigData& rig) noexcept; static void ParseAnimations(aiScene const& scene, std::vector& anims) noexcept; + static std::pair PairHelper(AiNodeConstPtr node); + static RigNodeData* NewNode(AiNodeConstPtr inNode); + static void LoadFromFile(AssetPath path, ModelRef asset) noexcept; public: diff --git a/src/Libraries/MeshWriter.cpp b/src/Libraries/MeshWriter.cpp index 39f99a1..4622325 100644 --- a/src/Libraries/MeshWriter.cpp +++ b/src/Libraries/MeshWriter.cpp @@ -149,7 +149,7 @@ namespace SH_COMP } void MeshWriter::WriteRigData(FileReference file, RigDataHeader const& header, - std::map const& data) + RigData const& data) { for (auto i {0}; i < header.nodeCount; ++i) { diff --git a/src/Libraries/MeshWriter.h b/src/Libraries/MeshWriter.h index 5f60edb..81398e2 100644 --- a/src/Libraries/MeshWriter.h +++ b/src/Libraries/MeshWriter.h @@ -28,8 +28,8 @@ namespace SH_COMP static void WriteAnimNode(FileReference file, AnimNodeInfo const& info, AnimNode const& node); static void WriteRigHeader(FileReference file, RigDataHeader const& header); - static void WriteRigData(FileReference file, RigDataHeader const& header, std::map const& data); - static void WriteRigNodes(FileReference file, RigDataHeader const& header, RigNode const* root); + static void WriteRigData(FileReference file, RigDataHeader const& header, RigData const& data); + //static void WriteRigNodes(FileReference file, RigDataHeader const& header, RigNode const* root); static void WriteHeaders(FileReference file, ModelConstRef asset); static void WriteData(FileReference file, ModelConstRef asset); diff --git a/src/Types/RigAsset.h b/src/Types/RigAsset.h index 0177892..c90b0d9 100644 --- a/src/Types/RigAsset.h +++ b/src/Types/RigAsset.h @@ -21,18 +21,13 @@ namespace SH_COMP std::string name; SHMat4 transform; - }; - - struct RigNode - { - uint32_t idRef; - std::vector children; + std::vector children; }; struct RigData { RigDataHeader header; - std::map nodeDataCollection; - RigNode* root; + // std::map nodeDataCollection; + RigNodeData* root; }; }