Changeset 261
- Timestamp:
- 06/18/14 20:05:35 (11 years ago)
- Location:
- trunk
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/nv/common.hh
r255 r261 109 109 110 110 #include <typeinfo> 111 #include <iterator> 111 112 #include <cstddef> 112 113 #include <cstdint> -
trunk/nv/formats/md5_loader.hh
r259 r261 15 15 16 16 #include <nv/common.hh> 17 #include <unordered_map> 18 #include <vector> 17 #include <nv/array.hh> 19 18 #include <nv/interface/mesh_loader.hh> 20 19 … … 69 68 70 69 bool load_animation( stream& source ); 71 void update_skeleton( std::vector<transform>&skeleton, float anim_time ) const;70 void update_skeleton( transform* skeleton, float anim_time ) const; 72 71 73 72 size_t get_num_joints() const { return m_num_joints; } … … 93 92 friend class md5_mesh_data; 94 93 public: 95 const void* data() const { return m_pntdata ; }94 const void* data() const { return m_pntdata.data(); } 96 95 uint32 get_index_count() const { return m_indices; } 97 size_t size() const { return m_ size * sizeof( md5_vtx_pnt); }98 void apply( const std::vector< transform >&skeleton );96 size_t size() const { return m_pntdata.raw_size(); } 97 void apply( const transform* skeleton ); 99 98 const md5_mesh_data* get_mesh_data() const { return m_data; } 100 ~md5_mesh_instance() { delete[] m_pntdata; }101 99 private: 102 100 md5_mesh_instance( const md5_mesh_data* a_data ); 103 101 104 uint32 m_size; 105 uint32 m_indices; 106 md5_vtx_pnt* m_pntdata; 107 std::vector< transform > m_pos_offset; 108 const md5_mesh_data* m_data; 102 uint32 m_indices; 103 dynamic_array< md5_vtx_pnt > m_pntdata; 104 dynamic_array< transform > m_pos_offset; 105 const md5_mesh_data* m_data; 109 106 }; 110 107 … … 116 113 md5_mesh_instance* spawn() const; 117 114 private: 118 uint32* m_idata;119 md5_vtx_t* m_tdata;120 md5_vtx_pnt* m_pntdata;121 std::string m_shader;122 std::vector< transform > m_bone_offset;123 std::vector< md5_vtx_data > m_vtx_data;115 uint32* m_idata; 116 md5_vtx_t* m_tdata; 117 md5_vtx_pnt* m_pntdata; 118 std::string m_shader; 119 dynamic_array< transform > m_bone_offset; 120 dynamic_array< md5_vtx_data > m_vtx_data; 124 121 }; 125 122 … … 154 151 }; 155 152 protected: 156 bool prepare_mesh( md5_mesh_data* mdata, std::vector< md5_weight >& weights, std::vector< md5_weight_info >&weight_info );153 bool prepare_mesh( md5_mesh_data* mdata, md5_weight* weights, md5_weight_info* weight_info ); 157 154 protected: 158 155 uint32 m_md5_version; … … 160 157 uint32 m_num_meshes; 161 158 162 std::vector<md5_joint> m_joints;163 std::vector<md5_mesh_data*> m_meshes;159 dynamic_array<md5_joint> m_joints; 160 dynamic_array<md5_mesh_data*> m_meshes; 164 161 }; 165 162 -
trunk/nv/transform.hh
r259 r261 71 71 } 72 72 73 vec3 transformed( const vec3 v ) const73 vec3 transformed( const vec3& v ) const 74 74 { 75 75 return m_orientation * v + m_position; -
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 } -
trunk/src/gfx/skeletal_mesh.cc
r252 r261 41 41 uint32 anim_duration = uint32( frame_duration * (float)m_animation->get_frame_count() ); 42 42 while ( m_animation_time >= anim_duration ) m_animation_time -= anim_duration; 43 m_animation->update_skeleton( m_transform , (float)m_animation_time * 0.001f );44 m_mesh_data->apply( m_transform );43 m_animation->update_skeleton( m_transform.data(), (float)m_animation_time * 0.001f ); 44 m_mesh_data->apply( m_transform.data() ); 45 45 vertex_buffer* vb = m_va->find_buffer( nv::POSITION ); 46 46 vb->bind(); -
trunk/tests/md5_test/md5_test.cc
r239 r261 103 103 } 104 104 105 load_animation( "data/ idle02.md5anim" );105 load_animation( "data/walk.md5anim" ); 106 106 return true; 107 107 } … … 135 135 NV_PROFILE( "update_sh" ); 136 136 137 glm::vec3 source( 150.0f, 0.0f, 0.0f );137 glm::vec3 source( 250.0f, 0.0f, 0.0f ); 138 138 glm::vec3 eye = glm::rotate( source, (ticks / 20.f), glm::vec3( 0.0,1.0,0.0 ) ); 139 139
Note: See TracChangeset
for help on using the changeset viewer.