diff --git a/SHADE_Engine/src/Animation/SHRig.cpp b/SHADE_Engine/src/Animation/SHRig.cpp index 87ae3bff..d96d6153 100644 --- a/SHADE_Engine/src/Animation/SHRig.cpp +++ b/SHADE_Engine/src/Animation/SHRig.cpp @@ -23,7 +23,7 @@ namespace SHADE /*-----------------------------------------------------------------------------------*/ /* Constructors */ /*-----------------------------------------------------------------------------------*/ - SHRig::SHRig(const SHRigAsset& asset) + SHRig::SHRig(const SHRigAsset& asset, SHResourceLibrary& nodeStore) { // Don't bother if empty if (asset.root == nullptr) @@ -33,13 +33,47 @@ namespace SHADE } // Do a recursive depth first traversal to populate the rig - rootNode = recurseCreateNode(asset, asset.root); + rootNode = recurseCreateNode(asset, asset.root, nodeStore); if (rootNode) { globalInverseMatrix = SHMatrix::Inverse(rootNode->TransformMatrix); } } + SHRig::SHRig(SHRig&& rhs) + : rootNode { rhs.rootNode } + , nodeNames { std::move(rhs.nodeNames) } + , nodesByName { std::move(rhs.nodesByName) } + , nodes { std::move(rhs.nodes) } + , nodeIndexMap { std::move(rhs.nodeIndexMap) } + , globalInverseMatrix { std::move(rhs.globalInverseMatrix) } + { + rhs.rootNode = {}; + } + SHRig::~SHRig() + { + // Unload all nodes + for (auto node : nodes) + { + if (node) + node.Free(); + } + nodes.clear(); + } + + SHRig& SHRig::operator=(SHRig&& rhs) + { + rootNode = rhs.rootNode; + nodeNames = std::move(rhs.nodeNames); + nodesByName = std::move(rhs.nodesByName); + nodes = std::move(rhs.nodes); + nodeIndexMap = std::move(rhs.nodeIndexMap); + globalInverseMatrix = std::move(rhs.globalInverseMatrix); + + rhs.rootNode = {}; + + return *this; + } /*-----------------------------------------------------------------------------------*/ /* Usage Functions */ /*-----------------------------------------------------------------------------------*/ @@ -79,7 +113,7 @@ namespace SHADE /*-----------------------------------------------------------------------------------*/ /* Helper Functions */ /*-----------------------------------------------------------------------------------*/ - Handle SHRig::recurseCreateNode(const SHRigAsset& asset, const SHRigNodeAsset* sourceNode) + Handle SHRig::recurseCreateNode(const SHRigAsset& asset, const SHRigNodeAsset* sourceNode, SHResourceLibrary& nodeStore) { // Construct the node auto newNode = nodeStore.Create(); @@ -106,7 +140,7 @@ namespace SHADE continue; // Recursively create children - auto childNode = recurseCreateNode(asset, child); // Not sure why this works but it is required for + auto childNode = recurseCreateNode(asset, child, nodeStore); // Not sure why this works but it is required for newNode->Children.emplace_back(childNode); // the emplace_back operation to not crash } diff --git a/SHADE_Engine/src/Animation/SHRig.h b/SHADE_Engine/src/Animation/SHRig.h index 0329dc6e..ae198317 100644 --- a/SHADE_Engine/src/Animation/SHRig.h +++ b/SHADE_Engine/src/Animation/SHRig.h @@ -53,19 +53,43 @@ namespace SHADE }; /// - /// + /// Represents an animation skeletal rig for a model. /// class SH_API SHRig { public: /*---------------------------------------------------------------------------------*/ - /* Constructors */ + /* Constructors/Destructors */ /*---------------------------------------------------------------------------------*/ /// - /// + /// Constructs a rig from a SHRigAsset. /// - /// - explicit SHRig(const SHRigAsset& asset); + /// + /// SHRigAsset to load. + /// + /// + /// Reference to a ResourceLibrary to use to create the rig's nodes. + /// + explicit SHRig(const SHRigAsset& asset, SHResourceLibrary& nodeStore); + /// + /// Move Constructor + /// + /// SHRig to move from. + /// Reference to this object. + SHRig& operator=(SHRig&& rhs); /*---------------------------------------------------------------------------------*/ /* Getter Functions */ @@ -114,11 +138,10 @@ namespace SHADE std::vector> nodes; std::unordered_map, int> nodeIndexMap; SHMatrix globalInverseMatrix; - SHResourceLibrary nodeStore; /*---------------------------------------------------------------------------------*/ /* Helper Functions */ /*---------------------------------------------------------------------------------*/ - Handle recurseCreateNode(const SHRigAsset& asset, const SHRigNodeAsset* sourceNode); + Handle recurseCreateNode(const SHRigAsset& asset, const SHRigNodeAsset* sourceNode, SHResourceLibrary& nodeStore); }; } \ No newline at end of file diff --git a/SHADE_Engine/src/Resource/SHResourceManager.cpp b/SHADE_Engine/src/Resource/SHResourceManager.cpp index 5cb93bb0..5a99cad1 100644 --- a/SHADE_Engine/src/Resource/SHResourceManager.cpp +++ b/SHADE_Engine/src/Resource/SHResourceManager.cpp @@ -20,6 +20,7 @@ namespace SHADE /* Static Data Member Definitions */ /*-----------------------------------------------------------------------------------*/ SHResourceHub SHResourceManager::resourceHub; + SHResourceLibrary SHResourceManager::rigNodeStore; std::unordered_map>> SHResourceManager::handlesMap; std::unordered_map SHResourceManager::assetIdMap; std::unordered_map> SHResourceManager::typedFreeFuncMap; diff --git a/SHADE_Engine/src/Resource/SHResourceManager.h b/SHADE_Engine/src/Resource/SHResourceManager.h index 3b9089a2..837c0195 100644 --- a/SHADE_Engine/src/Resource/SHResourceManager.h +++ b/SHADE_Engine/src/Resource/SHResourceManager.h @@ -13,6 +13,7 @@ of DigiPen Institute of Technology is prohibited. // STL Includes #include + // Project Includes #include "SH_API.h" #include "SHResourceLibrary.h" @@ -36,6 +37,7 @@ namespace SHADE /* Forward Declarations */ /*-----------------------------------------------------------------------------------*/ class SHMaterial; + struct SHRigNode; /*-----------------------------------------------------------------------------------*/ /* Type Definitions */ @@ -176,6 +178,7 @@ namespace SHADE /*---------------------------------------------------------------------------------*/ // Handles static SHResourceHub resourceHub; + static SHResourceLibrary rigNodeStore; static std::unordered_map handlesMap; static std::unordered_map assetIdMap; static std::unordered_map> typedFreeFuncMap; diff --git a/SHADE_Engine/src/Resource/SHResourceManager.hpp b/SHADE_Engine/src/Resource/SHResourceManager.hpp index ea6b4ad9..ea0d75a4 100644 --- a/SHADE_Engine/src/Resource/SHResourceManager.hpp +++ b/SHADE_Engine/src/Resource/SHResourceManager.hpp @@ -353,7 +353,7 @@ namespace SHADE else if constexpr (std::is_same_v) { loadedAssetData.emplace_back(assetId); - return resourceHub.Create(assetData.rig); + return resourceHub.Create(assetData.rig, rigNodeStore); } else if constexpr (std::is_same_v) {