Changeset 475 for trunk/src/gfx/skeletal_mesh.cc
- Timestamp:
- 10/09/15 14:08:44 (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/gfx/skeletal_mesh.cc
r471 r475 11 11 #include "nv/stl/unordered_map.hh" 12 12 13 void nv::skeletal_animation_entry::initialize() 14 { 15 m_root = uint32(-1); 16 m_prepared = false; 17 m_children = nullptr; 18 m_offsets = nullptr; 19 m_bone_ids = new sint16[m_node_data->size()]; 20 21 NV_ASSERT( m_node_data, "node data empty!" ); 22 23 if ( !m_node_data->is_flat() ) 24 { 25 m_children = new vector< uint32 >[m_node_data->size()]; 26 for ( uint32 n = 0; n < m_node_data->size(); ++n ) 27 { 28 const data_channel_set* node = (*m_node_data)[n]; 29 if ( node->get_parent_id() != -1 ) 30 { 31 m_children[ node->get_parent_id()].push_back( n ); 32 } 33 else 34 { 35 if ( m_root >= 0 ) 36 { 37 m_root = uint32( -2 ); 38 } 39 else 40 m_root = n; 41 } 42 } 43 NV_ASSERT( m_root != uint32( -1 ), "Animation without root!" ); 44 } 45 } 13 #include "nv/core/logging.hh" 46 14 47 15 void nv::skeletal_animation_entry::update_skeleton( mat4* data, uint32 a_ms_time ) const … … 70 38 } 71 39 72 if ( !m_node_data->is_flat() ) 73 { 74 if ( m_root == uint32( -2 ) ) // multi-root 75 { 76 for ( uint32 n = 0; n < m_node_data->size(); ++n ) 77 if ( ( *m_node_data )[n]->get_parent_id() == -1 ) 78 animate_rec( data, fframe, n, mat4() ); 79 } 80 else 81 animate_rec( data, fframe, m_root, mat4() ); 82 return; 83 } 84 85 for ( uint32 n = 0; n < m_node_data->size(); ++n ) 86 if ( m_bone_ids[n] >= 0 ) 87 { 88 const data_channel_set* node = (*m_node_data)[n]; 89 nv::mat4 node_mat( node->get_transform() ); 90 91 if ( node->size() > 0 ) 92 { 93 raw_channel_interpolator interpolator( node, m_interpolation_key ); 94 node_mat = interpolator.get< mat4 >( fframe ); 95 } 96 97 sint16 bone_id = m_bone_ids[n]; 98 data[ bone_id ] = node_mat * m_offsets[ bone_id ]; 99 } 40 m_data.animate( data, fframe ); 100 41 } 101 42 102 43 void nv::skeletal_animation_entry::prepare( const mesh_nodes_data* bones ) 103 44 { 104 if ( m_prepared ) return; 105 nv::hash_store< shash64, uint16 > bone_names; 106 m_offsets = new mat4[ bones->size() ]; 107 for ( nv::uint16 bi = 0; bi < bones->size(); ++bi ) 108 { 109 const data_channel_set* bone = (*bones)[ bi ]; 110 bone_names[ bone->get_name() ] = bi; 111 m_offsets[bi] = bone->get_transform(); 112 } 113 114 for ( uint32 n = 0; n < m_node_data->size(); ++n ) 115 { 116 const data_channel_set* node = (*m_node_data)[ n ]; 117 sint16 bone_id = -1; 118 119 auto bi = bone_names.find( node->get_name() ); 120 if ( bi != bone_names.end() ) 121 { 122 bone_id = sint16( bi->second ); 123 } 124 m_bone_ids[n] = bone_id; 125 126 if ( m_interpolation_key.size() == 0 && node->size() > 0 ) 127 m_interpolation_key = node->get_interpolation_key(); 128 129 } 130 m_prepared = true; 131 } 132 133 void nv::skeletal_animation_entry::animate_rec( mat4* data, float time, uint32 node_id, const mat4& parent_mat ) const 134 { 135 // TODO: fix transforms, which are now embedded, 136 // see note in assimp_loader.cc:load_node 137 const data_channel_set* node = ( *m_node_data )[ node_id ]; 138 mat4 node_mat( node->get_transform() ); 139 140 if ( node->size() > 0 ) 141 { 142 raw_channel_interpolator interpolator( node, m_interpolation_key ); 143 node_mat = interpolator.get< mat4 >( time ); 144 } 145 146 mat4 global_mat = parent_mat * node_mat; 147 148 sint16 bone_id = m_bone_ids[ node_id ]; 149 if ( bone_id >= 0 ) 150 { 151 data[ bone_id ] = global_mat * m_offsets[ bone_id ]; 152 } 153 154 for ( auto child : m_children[ node_id ] ) 155 { 156 animate_rec( data, time, child, global_mat ); 157 } 158 } 159 160 nv::skeletal_animation_entry::~skeletal_animation_entry() 161 { 162 delete[] m_offsets; 163 delete[] m_children; 164 delete[] m_bone_ids; 45 m_data.prepare( bones ); 165 46 } 166 47 … … 198 79 nv::transform nv::skeletal_mesh::get_node_transform( uint32 node_id ) const 199 80 { 200 if ( node_id == 0 ) return transform();201 if ( node_id == uint32(-1) ) return transform( m_transform[0] );202 81 return transform( m_transform[ node_id ] ); 203 82 }
Note: See TracChangeset
for help on using the changeset viewer.