1 #include <Core/Asset/HandleToSkeleton.hpp>
5 #include <Core/Animation/Skeleton.hpp>
6 #include <Core/Asset/HandleData.hpp>
7 #include <Core/Utils/Log.hpp>
9 using namespace Ra::Core::Utils;
17 void addBone(
const uint parent,
20 const Ra::Core::AlignedStdVector<Ra::Core::Vector2ui>& edgeList,
21 std::vector<bool>& processed,
22 Core::Animation::Skeleton& skelOut )
24 if ( !processed[dataID] ) {
25 processed[dataID] =
true;
27 uint index = skelOut.addBone(
28 parent, dd.m_frame, Ra::Core::Animation::HandleArray::SpaceType::MODEL, dd.m_name );
29 for (
const auto& edge : edgeList ) {
30 if ( edge[0] == dataID ) {
31 addBone( index, edge[1], data, edgeList, processed, skelOut );
37 void addRoot(
const uint dataID,
39 const Ra::Core::AlignedStdVector<Ra::Core::Vector2ui>& edgeList,
40 std::vector<bool>& processed,
41 Core::Animation::Skeleton& skelOut )
43 if ( !processed[dataID] ) {
44 processed[dataID] =
true;
46 uint index = skelOut.addRoot( dd.m_frame, dd.m_name );
47 for (
const auto& edge : edgeList ) {
48 if ( edge[0] == dataID ) {
49 addBone( index, edge[1], data, edgeList, processed, skelOut );
61 for ( uint i = 0; i < size; ++i ) {
64 std::set<uint> leaves = root;
67 for (
const auto& edge : edgeList ) {
68 root.erase( edge[1] );
69 leaves.erase( edge[0] );
72 std::vector<bool> processed( size,
false );
73 for (
const auto& r : root ) {
74 addRoot( r, data, edgeList, processed, skelOut );
78 std::map<std::string, uint> boneNameMap;
79 for ( uint i = 0; i < skelOut.size(); ++i ) {
80 boneNameMap[skelOut.getLabel( i )] = i;
82 for (
const auto& l : leaves ) {
83 const auto& dd = component[l];
84 if ( dd.m_weights.size() ) {
85 LOG( logDEBUG ) <<
"Adding end-bone at " << dd.m_name <<
".";
86 skelOut.addBone( boneNameMap[dd.m_name],
87 data.
getFrame().inverse() * dd.m_frame,
88 Ra::Core::Animation::HandleArray::SpaceType::MODEL,
89 dd.m_name +
"_Ra_endBone" );
uint getComponentDataSize() const
const Core::AlignedStdVector< HandleComponentData > & getComponentData() const
bool needsEndNodes() const
const Core::AlignedStdVector< Core::Vector2ui > & getEdgeData() const
Core::Transform getFrame() const