BFS Copy WIP

This commit is contained in:
Xiao Qi 2023-01-04 18:08:08 +08:00
parent d03c12d1e2
commit e6f6f9b0c5
3 changed files with 25 additions and 34 deletions

View File

@ -17,11 +17,24 @@
#include <fstream> #include <fstream>
#include <iostream> #include <iostream>
#include <stack> #include <queue>
namespace SH_COMP namespace SH_COMP
{ {
SHMat4 aiTransformToMat4(aiMatrix4x4 const& inMatrx)
{
SHMat4 result;
std::memcpy(
reinterpret_cast<char*>(&result),
reinterpret_cast<char const*>(&inMatrx),
sizeof(result)
);
return result;
}
Assimp::Importer MeshCompiler::aiImporter; Assimp::Importer MeshCompiler::aiImporter;
uint32_t MeshCompiler::rigNodeIDCounter { 0 }; uint32_t MeshCompiler::rigNodeIDCounter { 0 };
@ -165,20 +178,6 @@ namespace SH_COMP
} }
} }
uint32_t MeshCompiler::RegisterNewNode(aiNode const& node, RigData& rig) noexcept
{
auto const result = rigNodeIDCounter++;
rig.nodeDataCollection[result].name = node.mName.C_Str();
std::memcpy(
&rig.nodeDataCollection[result].transform,
&node.mTransformation,
sizeof(SHMat4)
);
return result;
}
void MeshCompiler::ParseAnimations(aiScene const& scene, std::vector<AnimData>& anims) noexcept void MeshCompiler::ParseAnimations(aiScene const& scene, std::vector<AnimData>& anims) noexcept
{ {
// Size and read for number of animation clips // Size and read for number of animation clips
@ -275,26 +274,15 @@ namespace SH_COMP
void MeshCompiler::BuildArmature(aiNode const& baseNode, RigData& rig) noexcept void MeshCompiler::BuildArmature(aiNode const& baseNode, RigData& rig) noexcept
{ {
std::stack<std::pair<RigNode*, aiNode const*>> nodesQueue; std::queue<std::pair<RigNodeData*, aiNode const&>> nodeQueue;
rig.root = new RigNode(); auto& collection = rig.nodeDataCollection;
rig.root->idRef = RegisterNewNode(**baseNode.mChildren, rig); collection.clear();
nodesQueue.push({rig.root, *baseNode.mChildren});
while(!nodesQueue.empty()) //TODO FINISH BFS COPY
while(!nodeQueue.empty())
{ {
auto& rigNode { *nodesQueue.top().first };
auto const& dataNode { *nodesQueue.top().second };
nodesQueue.pop();
for (auto i{ 0 }; i < dataNode.mNumChildren; ++i)
{
rigNode.children.push_back(new RigNode());
rigNode.children[i]->idRef = RegisterNewNode(*dataNode.mChildren[i], rig);
nodesQueue.push({
rigNode.children[i],
dataNode.mChildren[i]
});
}
} }
} }

View File

@ -38,7 +38,6 @@ namespace SH_COMP
static void BuildHeaders(ModelRef asset) noexcept; static void BuildHeaders(ModelRef asset) noexcept;
static void BuildArmature(aiNode const& node, RigData& rig) noexcept; static void BuildArmature(aiNode const& node, RigData& rig) noexcept;
static uint32_t RegisterNewNode(aiNode const& node, RigData& rig) noexcept;
static void ParseAnimations(aiScene const& scene, std::vector<AnimData>& anims) noexcept; static void ParseAnimations(aiScene const& scene, std::vector<AnimData>& anims) noexcept;
static void LoadFromFile(AssetPath path, ModelRef asset) noexcept; static void LoadFromFile(AssetPath path, ModelRef asset) noexcept;

View File

@ -16,6 +16,9 @@ namespace SH_COMP
struct RigNodeData struct RigNodeData
{ {
RigNodeData(const char* cstr, SHMat4 mat)
:name {cstr}, transform{mat} {}
std::string name; std::string name;
SHMat4 transform; SHMat4 transform;
}; };
@ -28,6 +31,7 @@ namespace SH_COMP
struct RigData struct RigData
{ {
RigDataHeader header;
std::map<uint32_t, RigNodeData> nodeDataCollection; std::map<uint32_t, RigNodeData> nodeDataCollection;
RigNode* root; RigNode* root;
}; };