Changeset 481 for trunk/src/gfx
- Timestamp:
- 11/09/15 19:55:25 (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/gfx/skeleton_instance.cc
r480 r481 11 11 void nv::skeleton_binding::prepare( const mesh_nodes_data* node_data, const mesh_nodes_data* bone_data ) 12 12 { 13 if ( !m_offsets || !m_indices)13 if ( m_indices.empty() ) 14 14 { 15 15 // TODO: either fixed size struct or static allocator 16 16 hash_store< shash64, uint16 > bone_names; 17 m_offsets = new mat4[bone_data->size()]; 18 m_indices = new sint16[node_data->size()]; 19 17 m_indices.resize( node_data->size() ); 18 20 19 for ( nv::uint16 bi = 0; bi < bone_data->size(); ++bi ) 21 20 { 22 21 const data_channel_set* bone = ( *bone_data )[bi]; 23 22 bone_names[bone->get_name()] = bi; 24 m_offsets[bi] = bone->get_transform();25 23 } 26 24 … … 38 36 39 37 } 38 m_bone_count = bone_data->size(); 40 39 } 41 40 … … 50 49 } 51 50 51 52 52 } 53 53 54 void nv::skeleton_instance::animate( const mesh_nodes_data* node_data, const skeleton_binding& binding, float frame ) 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 // else 63 // { 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_node 75 // 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 116 void nv::skeleton_instance::assign( const skeleton_transforms& skeleton, const bone_transforms& bones ) 55 117 { 56 if ( m_transform.size() > 0 ) 57 { 58 if ( node_data->is_flat() ) 59 { 60 animate_flat( node_data, binding, frame ); 61 } 62 else 63 { 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 } 118 if ( bones.size() != m_matrix.size() ) 119 m_matrix.resize( bones.size() ); 120 const transform* transforms = skeleton.transforms(); 121 for ( uint32 n = 0; n < skeleton.size(); ++n ) 122 m_matrix[n] = transforms[n].extract() * bones.m_offsets[n]; 69 123 } 70 124 71 void nv::skeleton_instance::a nimate_rec( const mesh_nodes_data* node_data, const skeleton_binding& binding, float frame, uint32 id, const transform& parent)125 void nv::skeleton_instance::assign( const bone_transforms& bones ) 72 126 { 73 // TODO: fix transforms, which are now embedded, 74 // see note in assimp_loader.cc:load_node 127 if ( bones.size() != m_matrix.size() ) 128 m_matrix.resize( bones.size() ); 129 } 130 131 void nv::skeleton_transforms::animate_rec( const mesh_nodes_data* node_data, const skeleton_binding& binding, float frame, uint32 id, const transform& parent ) 132 { 75 133 const data_channel_set* node = ( *node_data )[id]; 76 134 transform node_mat( node->get_transform() ); … … 81 139 node_mat = interpolator.get< transform >( frame ); 82 140 } 83 141 sint16 bone_id = binding.m_indices[id]; 84 142 transform global_mat = parent * node_mat; 85 86 sint16 bone_id = binding.m_indices[id];87 143 if ( bone_id >= 0 ) 88 144 { 89 m_transform [bone_id] = global_mat.extract() * binding.m_offsets[bone_id];145 m_transforms[bone_id] = global_mat; 90 146 } 91 92 147 for ( auto child : node_data->children( id ) ) 93 148 { … … 96 151 } 97 152 98 void nv:: skeleton_instance::animate_flat( const mesh_nodes_data* node_data, const skeleton_binding& binding, float frame )153 void nv::bone_transforms::prepare( const mesh_nodes_data* bone_data ) 99 154 { 100 for ( uint32 n = 0; n < node_data->size(); ++n ) 101 if ( binding.m_indices[n] >= 0 ) 155 if ( m_offsets.empty() ) 156 { 157 m_offsets.resize( bone_data->size() ); 158 159 for ( nv::uint16 bi = 0; bi < bone_data->size(); ++bi ) 102 160 { 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 112 sint16 bone_id = binding.m_indices[n]; 113 m_transform[bone_id] = node_mat * binding.m_offsets[bone_id]; 161 const data_channel_set* bone = ( *bone_data )[bi]; 162 m_offsets[bi] = bone->get_transform(); 114 163 } 164 } 115 165 }
Note: See TracChangeset
for help on using the changeset viewer.