Changeset 239 for trunk/src/formats/md2_loader.cc
- Timestamp:
- 05/17/14 02:35:19 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/formats/md2_loader.cc
r236 r239 203 203 static bool s_md2_normal_ready = false; 204 204 205 md2_loader::md2_loader() : m_md2( nullptr ) , m_size( 0 )205 md2_loader::md2_loader() : m_md2( nullptr ) 206 206 { 207 207 if ( !s_md2_normal_ready ) … … 230 230 bool md2_loader::load( stream& source ) 231 231 { 232 m_size = 0;233 232 m_md2 = (void*)(new md2_t); 234 233 if ( !read_md2( (md2_t*)m_md2, source ) ) … … 237 236 } 238 237 reindex(); 239 m_size = m_new_indexes.size();240 238 return true; 241 239 } 242 240 243 mesh_data_old* nv::md2_loader::release_mesh_data()244 {245 mesh_data_creator m;246 247 load_positions( m.get_positions() );248 load_normals( m.get_normals() );249 load_texcoords( m.get_texcoords() );250 load_indicies( m.get_indices() );251 252 m_size = m.get_indices().size();253 return m.release();254 }255 256 mesh_data_old* nv::md2_loader::get_frame( sint32 frame )257 {258 mesh_data_creator m;259 260 load_positions( m.get_positions(), frame );261 load_normals( m.get_normals(), frame );262 load_texcoords( m.get_texcoords() );263 load_indicies( m.get_indices() );264 265 m_size = m.get_indices().size();266 return m.release();267 }268 269 270 /*271 mesh* nv::md2_loader::release_mesh()272 {273 return get_frame( 0 );274 }275 276 mesh* nv::md2_loader::get_frame( sint32 frame )277 {278 md2_t* md2 = (md2_t*)m_md2;279 if ( md2 == nullptr || frame >= md2->header.num_frames ) return nullptr;280 mesh* m = new mesh();281 282 vertex_attribute< vec3 >* position = m->add_attribute<vec3>("nv_position");283 vertex_attribute< vec3 >* normal = m->add_attribute<vec3>("nv_normal");284 vertex_attribute< vec2 >* texcoord = m->add_attribute<vec2>("nv_texcoord");285 vertex_attribute< uint32 >* indices = m->add_indices<uint32>();286 287 load_positions( position->get(), frame );288 load_normals( normal->get(), frame );289 290 load_texcoords( texcoord->get() );291 load_indicies( indices->get() );292 293 m_size = indices->get().size();294 return m;295 }296 */297 298 241 size_t md2_loader::get_max_frames() const 299 242 { 300 243 return static_cast< size_t >( ((md2_t*)m_md2)->header.num_frames ); 301 }302 303 void md2_loader::load_positions( std::vector<vec3>& p, sint32 frame /*=-1*/ )304 {305 md2_t* md2 = (md2_t*)m_md2;306 size_t num_frames = static_cast< size_t >( md2->header.num_frames );307 size_t num_verts = m_new_vindexes.size();308 p.clear();309 size_t current_frame = ( frame == -1 ? 0 : static_cast< size_t >( frame ) );310 size_t frame_count = ( frame == -1 ? num_frames : 1 );311 312 p.reserve( num_verts * frame_count );313 314 while ( frame_count > 0 )315 {316 const md2_frame_t& cframe = md2->frames[current_frame];317 NV_LOG( LOG_INFO, "FrameID = " << cframe.name );318 319 vec3 scale = md2_vec3( cframe.scale );320 vec3 translate = md2_vec3( cframe.translate );321 322 for (size_t i = 0; i < num_verts; ++i )323 {324 const md2_vertex_t& v = cframe.vertices[ m_new_vindexes[ i ] ];325 p.push_back( vec3( v.v[0], v.v[2], v.v[1] ) * scale + translate );326 }327 ++current_frame;328 --frame_count;329 }330 }331 332 void md2_loader::load_normals( std::vector<vec3>& n, sint32 frame /*=-1*/ )333 {334 md2_t* md2 = (md2_t*)m_md2;335 size_t num_frames = static_cast< size_t >( md2->header.num_frames );336 size_t num_verts = m_new_vindexes.size();337 n.clear();338 size_t current_frame = ( frame == -1 ? 0 : static_cast< size_t>( frame ) );339 size_t frame_count = ( frame == -1 ? num_frames : 1 );340 341 n.reserve( num_verts * frame_count );342 343 while ( frame_count > 0 )344 {345 const md2_frame_t& cframe = md2->frames[current_frame];346 347 for (size_t i = 0; i < num_verts; ++i )348 {349 const md2_vertex_t& v = cframe.vertices[ m_new_vindexes[ i ] ];350 n.push_back( s_md2_normal_cache[ v.n ] );351 }352 ++current_frame;353 --frame_count;354 }355 }356 357 void md2_loader::load_texcoords( std::vector<vec2>& t )358 {359 md2_t* md2 = (md2_t*)m_md2;360 size_t num_verts = m_new_vindexes.size();361 362 t.clear();363 t.reserve( num_verts );364 365 vec2 scale( 1.0f / (float) md2->header.skinwidth, 1.0f / (float) md2->header.skinheight );366 367 for (size_t i = 0; i < num_verts; ++i )368 {369 const md2_texcoord_t& st = md2->texcoords[ m_new_tindexes[ i ] ];370 t.push_back( scale * vec2( st.s, st.t ) );371 }372 373 }374 375 void md2_loader::load_indicies( std::vector<uint32>& idx )376 {377 idx.assign( m_new_indexes.begin(), m_new_indexes.end() );378 244 } 379 245 … … 433 299 NV_LOG( LOG_INFO, "Reuse count = " << stats_reuse ); 434 300 } 301 302 303 struct vtx_md2_pn 304 { 305 nv::vec3 position; 306 nv::vec3 normal; 307 }; 308 309 struct vtx_md2_t 310 { 311 nv::vec2 texcoord; 312 }; 313 314 315 mesh_data* nv::md2_loader::release_mesh_data() 316 { 317 return release_mesh_data( -1 ); 318 } 319 320 mesh_data* nv::md2_loader::release_mesh_data( sint32 frame ) 321 { 322 md2_t* md2 = (md2_t*)m_md2; 323 size_t num_frames = static_cast< size_t >( md2->header.num_frames ); 324 size_t num_verts = m_new_vindexes.size(); 325 size_t current_frame = ( frame == -1 ? 0 : static_cast< size_t >( frame ) ); 326 size_t frame_count = ( frame == -1 ? num_frames : 1 ); 327 328 mesh_raw_channel* mc_pn = mesh_raw_channel::create< vtx_md2_pn >( num_verts * frame_count ); 329 vtx_md2_pn* vtx_pn = (vtx_md2_pn*)mc_pn->data; 330 331 uint32 index = 0; 332 while ( frame_count > 0 ) 333 { 334 const md2_frame_t& cframe = md2->frames[current_frame]; 335 NV_LOG( LOG_INFO, "FrameID = " << cframe.name ); 336 337 vec3 scale = md2_vec3( cframe.scale ); 338 vec3 translate = md2_vec3( cframe.translate ); 339 340 for (size_t i = 0; i < num_verts; ++i ) 341 { 342 const md2_vertex_t& v = cframe.vertices[ m_new_vindexes[ i ] ]; 343 vtx_pn[index].position = vec3( v.v[0], v.v[2], v.v[1] ) * scale + translate; 344 vtx_pn[index].normal = s_md2_normal_cache[ v.n ]; 345 index++; 346 } 347 ++current_frame; 348 --frame_count; 349 } 350 351 mesh_raw_channel* mc_t = mesh_raw_channel::create< vtx_md2_t >( num_verts ); 352 vtx_md2_t* vtx_t = (vtx_md2_t*)mc_t->data; 353 354 vec2 scale( 1.0f / (float) md2->header.skinwidth, 1.0f / (float) md2->header.skinheight ); 355 for (size_t i = 0; i < num_verts; ++i ) 356 { 357 const md2_texcoord_t& st = md2->texcoords[ m_new_tindexes[ i ] ]; 358 vtx_t[i].texcoord = scale * vec2( st.s, st.t ); 359 } 360 361 mesh_raw_index_channel* ic = mesh_raw_index_channel::create< uint16 >( m_new_indexes.size() ); 362 if ( m_new_indexes.size() > 0 ) 363 { 364 uint16* icp = (uint16*)ic->data; 365 std::copy_n( m_new_indexes.data(), m_new_indexes.size(), icp ); 366 } 367 368 mesh_data* result = new mesh_data(); 369 result->add_channel( mc_pn ); 370 result->add_channel( mc_t ); 371 result->set_index_channel( ic ); 372 return result; 373 }
Note: See TracChangeset
for help on using the changeset viewer.