Changeset 482 for trunk/src/gfx/skeleton_instance.cc
- Timestamp:
- 11/12/15 19:02:08 (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/gfx/skeleton_instance.cc
r481 r482 9 9 #include "nv/core/profiler.hh" 10 10 11 void nv::skeleton_binding::prepare( const mesh_nodes_data* node_data, const mesh_nodes_data*bone_data )11 void nv::skeleton_binding::prepare( const mesh_nodes_data* node_data, const data_node_list& bone_data ) 12 12 { 13 13 if ( m_indices.empty() ) … … 16 16 hash_store< shash64, uint16 > bone_names; 17 17 m_indices.resize( node_data->size() ); 18 19 for ( nv::uint16 bi = 0; bi < bone_data->size(); ++bi ) 20 { 21 const data_channel_set* bone = ( *bone_data )[bi]; 22 bone_names[bone->get_name()] = bi; 23 } 18 19 for ( nv::uint16 bi = 0; bi < bone_data.size(); ++bi ) 20 bone_names[bone_data[bi].name] = bi; 24 21 25 22 for ( uint32 n = 0; n < node_data->size(); ++n ) 26 23 { 27 const data_channel_set* node = ( *node_data )[n];28 24 sint16 bone_id = -1; 29 30 auto bi = bone_names.find( node->get_name() ); 25 auto bi = bone_names.find( node_data->get_info( n ).name ); 31 26 if ( bi != bone_names.end() ) 32 27 { … … 36 31 37 32 } 38 m_bone_count = bone_data ->size();33 m_bone_count = bone_data.size(); 39 34 } 40 35 … … 48 43 } 49 44 } 50 51 52 45 } 53 54 // void nv::skeleton_instance::animate_( const mesh_nodes_data* node_data, const skeleton_binding& binding, float frame )55 // {56 // if ( m_matrix.size() > 0 )57 // {58 // if ( node_data->is_flat() )59 // {60 // animate_flat( node_data, binding, frame );61 // }62 // else63 // {64 // for ( uint32 n = 0; n < node_data->size(); ++n )65 // if ( ( *node_data )[n]->get_parent_id() == -1 )66 // animate_rec( node_data, binding, frame, n, transform() );67 // }68 // }69 // }70 //71 // void nv::skeleton_instance::animate_rec( const mesh_nodes_data* node_data, const skeleton_binding& binding, float frame, uint32 id, const transform& parent )72 // {73 // // TODO: fix transforms, which are now embedded,74 // // see note in assimp_loader.cc:load_node75 // const data_channel_set* node = ( *node_data )[id];76 // transform node_mat( node->get_transform() );77 //78 // if ( node->size() > 0 )79 // {80 // raw_channel_interpolator interpolator( node, binding.m_key );81 // node_mat = interpolator.get< transform >( frame );82 // }83 //84 // transform global_mat = parent * node_mat;85 //86 // sint16 bone_id = binding.m_indices[id];87 // if ( bone_id >= 0 )88 // {89 // m_matrix[bone_id] = global_mat.extract() * binding.m_offsets[bone_id];90 // }91 //92 // for ( auto child : node_data->children( id ) )93 // {94 // animate_rec( node_data, binding, frame, child, global_mat );95 // }96 // }97 //98 // void nv::skeleton_instance::animate_flat( const mesh_nodes_data* node_data, const skeleton_binding& binding, float frame )99 // {100 // for ( uint32 n = 0; n < node_data->size(); ++n )101 // if ( binding.m_indices[n] >= 0 )102 // {103 // const data_channel_set* node = ( *node_data )[n];104 // nv::mat4 node_mat( node->get_transform() );105 //106 // if ( node->size() > 0 )107 // {108 // raw_channel_interpolator interpolator( node, binding.m_key );109 // node_mat = interpolator.get< mat4 >( frame );110 // }111 // sint16 bone_id = binding.m_indices[n];112 // m_matrix[bone_id] = node_mat * binding.m_offsets[bone_id];113 // }114 // }115 46 116 47 void nv::skeleton_instance::assign( const skeleton_transforms& skeleton, const bone_transforms& bones ) … … 120 51 const transform* transforms = skeleton.transforms(); 121 52 for ( uint32 n = 0; n < skeleton.size(); ++n ) 53 { 122 54 m_matrix[n] = transforms[n].extract() * bones.m_offsets[n]; 55 } 123 56 } 124 57 … … 129 62 } 130 63 131 void nv::skeleton_transforms::animate_rec( const mesh_nodes_data* node_data, const skeleton_binding& binding, float frame, uint32 id, const transform& parent ) 64 void nv::skeleton_transforms::animate_local( const mesh_nodes_data* node_data, const skeleton_binding& binding, float frame ) 65 { 66 if ( m_transforms.size() != binding.skeleton_size() ) 67 m_transforms.resize( binding.skeleton_size() ); 68 for ( uint32 n = 0; n < node_data->size(); ++n ) 69 { 70 const data_channel_set* node = ( *node_data )[n]; 71 sint16 bone_id = binding.m_indices[n]; 72 if ( bone_id >= 0 ) 73 { 74 if ( node->size() > 0 ) 75 m_transforms[bone_id] = raw_channel_interpolator( node, binding.m_key ).get< transform >( frame ); 76 int confirm_that_not_needed; 77 // else 78 // m_transforms[bone_id] = transform( node->get_transform() ); 79 } 80 } 81 } 82 83 void nv::skeleton_transforms::blend_local( const mesh_nodes_data* node_data, const skeleton_binding& binding, float frame, float blend ) 84 { 85 if ( m_transforms.size() != binding.skeleton_size() ) 86 m_transforms.resize( binding.skeleton_size() ); 87 for ( uint32 n = 0; n < node_data->size(); ++n ) 88 { 89 const data_channel_set* node = ( *node_data )[n]; 90 sint16 bone_id = binding.m_indices[n]; 91 if ( bone_id >= 0 ) 92 { 93 94 transform tr = node->size() > 0 ? raw_channel_interpolator( node, binding.m_key ).get< transform >( frame ) : transform( /*node->get_transform()*/ ); int confirm_that_not_needed; 95 m_transforms[bone_id] = nv::interpolate( m_transforms[bone_id], tr, blend ); 96 } 97 } 98 } 99 100 void nv::skeleton_transforms::delocalize_rec( const data_node_tree& node_data, const skeleton_binding& binding, uint32 id, const transform& parent ) 101 { 102 sint16 bone_id = binding.m_indices[id]; 103 transform global_mat = parent; 104 if ( bone_id >= 0 ) 105 { 106 global_mat *= m_transforms[bone_id]; 107 m_transforms[bone_id] = global_mat; 108 } 109 for ( auto child : node_data.children( id ) ) 110 { 111 delocalize_rec( node_data, binding, child, global_mat ); 112 } 113 } 114 115 void nv::skeleton_transforms::animate_rec( const mesh_nodes_data* node_data, const skeleton_binding& binding, float frame, uint32 id, const transform& parent, bool local ) 132 116 { 133 117 const data_channel_set* node = ( *node_data )[id]; 134 transform node_mat( node->get_transform() ); 118 transform node_mat; 119 120 if ( node->size() > 0 ) 121 node_mat = raw_channel_interpolator( node, binding.m_key ).get< transform >( frame ); 122 int confirm_that_not_needed; 123 // else 124 // node_mat = transform( node->get_transform() ); 125 sint16 bone_id = binding.m_indices[id]; 126 transform global_mat = parent * node_mat; 127 if ( bone_id >= 0 ) 128 { 129 m_transforms[bone_id] = local ? node_mat : global_mat; 130 } 131 for ( auto child : node_data->children( id ) ) 132 { 133 animate_rec( node_data, binding, frame, child, global_mat, local ); 134 } 135 } 136 137 void nv::skeleton_transforms::blend_rec( const mesh_nodes_data* node_data, const skeleton_binding& binding, float frame, uint32 id, const transform& parent, bool local, float blend ) 138 { 139 const data_channel_set* node = ( *node_data )[id]; 140 int confirm_that_not_needed; 141 transform node_mat/*( node->get_transform() )*/; 135 142 136 143 if ( node->size() > 0 ) … … 143 150 if ( bone_id >= 0 ) 144 151 { 145 m_transforms[bone_id] = global_mat;152 m_transforms[bone_id] = nv::interpolate( m_transforms[bone_id], local ? node_mat : global_mat, blend ); 146 153 } 147 154 for ( auto child : node_data->children( id ) ) 148 155 { 149 animate_rec( node_data, binding, frame, child, global_mat);156 blend_rec( node_data, binding, frame, child, global_mat, local, blend ); 150 157 } 151 158 } 152 159 153 void nv::bone_transforms::prepare( const mesh_nodes_data* bone_data ) 160 161 void nv::bone_transforms::prepare( const data_node_list& bone_data ) 154 162 { 155 163 if ( m_offsets.empty() ) 156 164 { 157 m_offsets.resize( bone_data ->size() );165 m_offsets.resize( bone_data.size() ); 158 166 159 for ( nv::uint16 bi = 0; bi < bone_data->size(); ++bi ) 160 { 161 const data_channel_set* bone = ( *bone_data )[bi]; 162 m_offsets[bi] = bone->get_transform(); 163 } 167 for ( nv::uint16 bi = 0; bi < bone_data.size(); ++bi ) 168 m_offsets[bi] = bone_data[bi].transform; 164 169 } 165 170 }
Note: See TracChangeset
for help on using the changeset viewer.