Changeset 261 for trunk/src/formats/md5_loader.cc
- Timestamp:
- 06/18/14 20:05:35 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/formats/md5_loader.cc
r259 r261 45 45 bool md5_loader::load( stream& source ) 46 46 { 47 NV_PROFILE( "Load MD5" ); // 16XXms original 47 48 std_stream sstream( &source ); 48 49 std::string command; 49 std::vector< md5_weight > weights;50 std::vector< md5_weight_info > weight_info;50 dynamic_array< md5_weight > weights; 51 dynamic_array< md5_weight_info > weight_info; 51 52 52 53 sstream >> command; … … 65 66 { 66 67 sstream >> m_num_joints; 67 m_joints.res erve( m_num_joints );68 m_joints.resize( m_num_joints ); 68 69 } 69 70 else if ( command == "numMeshes" ) 70 71 { 71 72 sstream >> m_num_meshes; 72 m_meshes.reserve( m_num_meshes ); 73 m_meshes.resize( m_num_meshes ); 74 m_num_meshes = 0; 73 75 } 74 76 else if ( command == "joints" ) … … 87 89 remove_quotes( joint.name ); 88 90 unit_quat_w( joint.orient ); 89 m_joints .push_back( joint );91 m_joints[i] = joint; 90 92 next_line( sstream ); 91 93 } … … 168 170 { 169 171 sstream >> num_weights; 170 weights.res erve( num_weights );172 weights.resize( num_weights ); 171 173 next_line( sstream ); 172 174 std::string line; … … 177 179 std::getline( sstream, line ); 178 180 sscanf( line.c_str(), "%*s %*u %u %f ( %f %f %f )", &(weight.joint_id), &(weight.bias), &(weight.pos.x), &(weight.pos.y), &(weight.pos.z)); 179 weights .push_back(weight);181 weights[i] = weight; 180 182 } 181 183 } … … 188 190 } 189 191 190 prepare_mesh( mesh, weights, weight_info ); 191 192 m_meshes.push_back(mesh); 192 prepare_mesh( mesh, weights.data(), weight_info.data() ); 193 194 m_meshes[ m_num_meshes ] = mesh; 195 m_num_meshes++; 193 196 } 194 197 sstream >> command; 195 198 } 196 199 197 assert( m_joints.size() == m_num_joints );198 assert( m_meshes.size() == m_num_meshes );199 200 return true; 200 201 } 201 202 202 bool md5_loader::prepare_mesh( md5_mesh_data* mdata, std::vector< md5_weight >& weights, std::vector< md5_weight_info >&weight_info )203 bool md5_loader::prepare_mesh( md5_mesh_data* mdata, md5_weight* weights, md5_weight_info* weight_info ) 203 204 { 204 205 uint32 vtx_count = mdata->m_vtx_data.size(); 205 206 md5_vtx_pnt* vtcs = mdata->m_pntdata; 206 207 207 for ( auto joint : m_joints ) 208 { 209 transform j( joint.pos, joint.orient ); 210 mdata->m_bone_offset.push_back(j.inverse()); 208 mdata->m_bone_offset.resize( m_joints.size() ); 209 for ( uint32 i = 0; i < m_joints.size(); ++i ) 210 { 211 transform j( m_joints[i].pos, m_joints[i].orient ); 212 mdata->m_bone_offset[i] = j.inverse(); 211 213 } 212 214 … … 222 224 vtc.tangent = glm::vec3(0); 223 225 224 std::sort( weights .begin() + start_weight, weights.begin()+ start_weight + weight_count, [](const md5_weight& a, const md5_weight& b) -> bool { return a.bias > b.bias; } );226 std::sort( weights + start_weight, weights + start_weight + weight_count, [](const md5_weight& a, const md5_weight& b) -> bool { return a.bias > b.bias; } ); 225 227 226 228 if ( weight_count > 4 ) … … 475 477 476 478 477 void nv::md5_animation::update_skeleton( std::vector<transform>& skeleton, float anim_time ) const 478 { 479 NV_ASSERT( skeleton.size() == m_num_joints, "Incompatible skeleton passed!" ); 479 void nv::md5_animation::update_skeleton( transform* skeleton, float anim_time ) const 480 { 480 481 anim_time = glm::clamp( anim_time, 0.0f, m_anim_duration ); 481 482 float frame_num = anim_time * (float)m_frame_rate; … … 551 552 552 553 nv::md5_mesh_instance::md5_mesh_instance( const md5_mesh_data* a_data ) 553 : m_data( a_data ), m_size( 0 ), m_indices( 0 ), m_pntdata( nullptr ) 554 { 555 m_size = m_data->m_vtx_data.size(); 554 : m_data( a_data ), m_indices( 0 ) 555 { 556 556 m_indices = m_data->get_count(); 557 m_pntdata = new md5_vtx_pnt[ m_size ]; 558 std::copy_n( m_data->m_pntdata, m_size, m_pntdata ); 559 } 560 561 void nv::md5_mesh_instance::apply( const std::vector< transform >& skeleton ) 557 m_pntdata.assign( m_data->m_pntdata, m_data->m_vtx_data.size() ); 558 } 559 560 void nv::md5_mesh_instance::apply( const transform* skeleton ) 562 561 { 563 562 NV_PROFILE("md5::apply"); 564 m_pos_offset.resize( skeleton.size() ); 565 for ( unsigned int i = 0; i < skeleton.size(); ++i ) 563 size_t skeleton_size = m_data->m_bone_offset.size(); 564 size_t vertex_count = m_pntdata.size(); 565 m_pos_offset.resize( skeleton_size ); 566 for ( unsigned int i = 0; i < skeleton_size; ++i ) 566 567 { 567 568 m_pos_offset[i] = skeleton[i] * m_data->m_bone_offset[i]; 568 569 } 569 570 570 char* fill_ptr = (char*)&(m_pntdata[0]); 571 std::fill( fill_ptr, fill_ptr + m_size * ( sizeof( md5_vtx_pnt ) ), 0 ); 572 for ( unsigned int i = 0; i < m_size; ++i ) 571 std::fill( m_pntdata.raw_data(), m_pntdata.raw_data() + m_pntdata.raw_size(), 0 ); 572 for ( unsigned int i = 0; i < vertex_count; ++i ) 573 573 { 574 574 const md5_vtx_data& vert = m_data->m_vtx_data[i]; … … 579 579 int index = vert.boneindex[j]; 580 580 float weight = vert.boneweight[j]; 581 transform joint = skeleton[index];582 transformoffset = m_pos_offset[index];581 const quat& orient = skeleton[index].get_orientation(); 582 const transform& offset = m_pos_offset[index]; 583 583 result.position += offset.transformed( vert.position ) * weight; 584 result.normal += ( joint.get_orientation()* vert.normal ) * weight;585 result.tangent += ( joint.get_orientation()* vert.tangent ) * weight;586 } 587 } 588 } 584 result.normal += ( orient * vert.normal ) * weight; 585 result.tangent += ( orient * vert.tangent ) * weight; 586 } 587 } 588 }
Note: See TracChangeset
for help on using the changeset viewer.