Changeset 239 for trunk/src/formats/md3_loader.cc
- Timestamp:
- 05/17/14 02:35:19 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/formats/md3_loader.cc
r236 r239 234 234 235 235 md3_loader::md3_loader() 236 : m_md3( nullptr ) , m_size( 0 )236 : m_md3( nullptr ) 237 237 { 238 238 if ( !s_normal_ready ) … … 276 276 { 277 277 m_tags.clear(); 278 m_size = 0;279 278 280 279 m_md3 = (void*)(new md3_t); … … 285 284 return true; 286 285 } 287 288 /*289 mesh* nv::md3_loader::release_mesh()290 {291 return get_frame( 0 );292 }293 294 mesh* nv::md3_loader::get_frame( sint32 frame )295 {296 mesh* m = new mesh();297 md3_t* md3 = (md3_t*)m_md3;298 299 NV_LOG( LOG_INFO, "Tags:" );300 for ( sint32 i = 0; i < md3->header.num_tags; ++i )301 {302 const md3_tag_t& rtag = md3->tags[i + md3->header.num_tags * frame];303 304 md3_tag& tag = m_tags[ (char*)(rtag.name) ];305 tag.name = (char*)(rtag.name);306 vec4 axisx = vec4( md3_vec3( rtag.axis[0] ), 0.0 );307 vec4 axisz = vec4( md3_vec3( rtag.axis[1] ), 0.0 );308 vec4 axisy = vec4( md3_vec3( rtag.axis[2] ), 0.0 );309 vec4 origin = vec4( md3_vec3( rtag.origin ), 1.0 );310 tag.transform = glm::mat4( axisx, axisy, axisz, origin );311 NV_LOG( LOG_INFO, "Tag " << tag.name << " found" );312 }313 314 vertex_attribute< vec3 >* position = m->add_attribute<vec3>("nv_position");315 vertex_attribute< vec3 >* normal = m->add_attribute<vec3>("nv_normal");316 vertex_attribute< vec2 >* texcoord = m->add_attribute<vec2>("nv_texcoord");317 vertex_attribute< uint32 >* indices = m->add_indices<uint32>();318 319 load_positions( position->get(), frame );320 load_normals( normal->get(), frame );321 322 load_texcoords( texcoord->get() );323 load_indicies( indices->get() );324 325 m_size = indices->get().size();326 return m;327 }328 */329 286 330 287 void nv::md3_loader::load_tags( std::vector<transform>& t, const std::string& tag ) … … 351 308 } 352 309 353 mesh_data_old* nv::md3_loader::release_mesh_data() 354 { 355 mesh_data_creator m; 356 357 load_positions( m.get_positions() ); 358 load_normals( m.get_normals() ); 359 load_texcoords( m.get_texcoords() ); 360 load_indicies( m.get_indices() ); 361 362 std::vector< std::string > names; 363 load_tag_names( names ); 364 365 for ( auto& name : names ) 366 { 367 load_tags( m.get_tag_map()[ name ], name ); 368 } 369 370 return m.release(); 371 } 372 373 mesh_data_old* nv::md3_loader::get_frame( sint32 frame ) 374 { 375 mesh_data_creator m; 376 377 load_positions( m.get_positions(), frame ); 378 load_normals( m.get_normals(), frame ); 379 load_texcoords( m.get_texcoords() ); 380 load_indicies( m.get_indices() ); 381 382 std::vector< std::string > names; 383 load_tag_names( names ); 384 385 for ( auto& name : names ) 386 { 387 load_tags( m.get_tag_map()[ name ], name ); 388 } 389 return m.release(); 390 } 391 392 size_t md3_loader::get_max_frames() const 393 { 394 return static_cast< size_t >( ((md3_t*)m_md3)->header.num_frames ); 395 } 396 397 void md3_loader::load_tag_names( std::vector< std::string >& tags ) 398 { 399 tags.clear(); 400 md3_t* md3 = (md3_t*)m_md3; 401 for ( sint32 i = 0; i < md3->header.num_tags; ++i ) 402 { 403 const md3_tag_t& rtag = md3->tags[i + md3->header.num_tags]; 404 tags.push_back( (char*)(rtag.name) ); 405 } 406 } 407 408 transform md3_loader::get_tag( sint32 frame, const std::string& name ) const 409 { 410 md3_t* md3 = (md3_t*)m_md3; 411 for ( sint32 i = 0; i < md3->header.num_tags; ++i ) 412 { 413 const md3_tag_t& rtag = md3->tags[i + md3->header.num_tags * frame]; 414 std::string rname((char*)(rtag.name)); 415 if (rname == name) 416 { 417 vec3 axisx ( md3_vec3( rtag.axis[0] ) ); 418 vec3 axisz ( md3_vec3( rtag.axis[1] ) ); 419 vec3 axisy ( md3_vec3( rtag.axis[2] ) ); 420 vec3 origin( md3_vec3( rtag.origin ) ); 421 return transform( origin, quat( mat3( axisx, axisy, axisz ) ) ); 422 } 423 } 424 return transform(); 425 } 426 427 const md3_tag* md3_loader::get_tag( const std::string& name ) const 428 { 429 auto it = m_tags.find( name ); 430 if ( it == m_tags.end() ) return nullptr; 431 return &(it->second); 432 } 433 434 void md3_loader::load_positions( std::vector<vec3>& p, sint32 frame /*=-1*/ ) 310 struct vtx_md3_pn 311 { 312 nv::vec3 position; 313 nv::vec3 normal; 314 }; 315 316 struct vtx_md3_t 317 { 318 nv::vec2 texcoord; 319 }; 320 321 mesh_data* nv::md3_loader::release_mesh_data() 322 { 323 return release_mesh_data( -1 ); 324 } 325 326 mesh_data* nv::md3_loader::release_mesh_data( sint32 frame ) 435 327 { 436 328 md3_t* md3 = (md3_t*)m_md3; 437 329 sint32 num_surfaces = md3->header.num_surfaces; 438 p.clear();330 sint32 num_verts = md3->vertices_per_frame; 439 331 sint32 current_frame = ( frame == -1 ? 0 : frame ); 440 332 sint32 frame_count = ( frame == -1 ? md3->header.num_frames : 1 ); 441 333 442 p.reserve( static_cast< size_t >( md3->vertices_per_frame * frame_count ) ); 443 334 mesh_raw_channel* mc_pn = mesh_raw_channel::create< vtx_md3_pn >( num_verts * frame_count ); 335 vtx_md3_pn* vtx_pn = (vtx_md3_pn*)mc_pn->data; 336 337 uint32 index = 0; 444 338 while ( frame_count > 0 ) 445 339 { … … 453 347 { 454 348 md3_vertex_t& v = surface.vertices[j]; 455 p.push_back( vec3( v.x * MD3_XYZ_SCALE, v.z * MD3_XYZ_SCALE, v.y * MD3_XYZ_SCALE ) ); 349 vtx_pn[index].position = vec3( v.x * MD3_XYZ_SCALE, v.z * MD3_XYZ_SCALE, v.y * MD3_XYZ_SCALE ); 350 vtx_pn[index].normal = s_normal_cache[ v.normal ]; 351 index++; 456 352 } 353 457 354 } 458 355 ++current_frame; 459 356 --frame_count; 460 357 } 461 } 462 463 void md3_loader::load_normals( std::vector<vec3>& n, sint32 frame /*=-1*/ ) 464 { 465 md3_t* md3 = (md3_t*)m_md3; 466 sint32 num_surfaces = md3->header.num_surfaces; 467 n.clear(); 468 sint32 current_frame = ( frame == -1 ? 0 : frame ); 469 sint32 frame_count = ( frame == -1 ? md3->header.num_frames : 1 ); 470 471 n.reserve( static_cast< size_t >( md3->vertices_per_frame * frame_count ) ); 472 473 while ( frame_count > 0 ) 474 { 475 for ( sint32 i = 0; i < num_surfaces; ++i ) 476 { 477 md3_surface_t& surface = md3->surfaces[i]; 478 sint32 vcount = surface.header.num_verts; 479 sint32 offset = vcount * current_frame; 480 sint32 limit = vcount + offset; 481 for (sint32 j = offset; j < limit; ++j ) 482 { 483 n.push_back( s_normal_cache[ surface.vertices[j].normal ] ); 484 } 485 } 486 ++current_frame; 487 --frame_count; 488 } 489 } 490 491 void md3_loader::load_texcoords( std::vector<vec2>& t ) 492 { 493 md3_t* md3 = (md3_t*)m_md3; 494 sint32 num_surfaces = md3->header.num_surfaces; 495 t.clear(); 358 359 index = 0; 360 mesh_raw_channel* mc_t = mesh_raw_channel::create< vtx_md3_t >( num_verts ); 361 vtx_md3_t* vtx_t = (vtx_md3_t*)mc_t->data; 496 362 for ( sint32 i = 0; i < num_surfaces; ++i ) 497 363 { 498 364 const md3_surface_t& surface = md3->surfaces[i]; 499 365 const uint32 vcount = static_cast< uint32 >( surface.header.num_verts ); 500 t.reserve( t.size() + vcount );501 366 for (uint32 j = 0; j < vcount; ++j ) 502 367 { 503 t.push_back( md3_texcoord( surface.st[j] ));368 vtx_t[index++].texcoord = md3_texcoord( surface.st[j] ); 504 369 } 505 370 } 506 } 507 508 void md3_loader::load_indicies( std::vector<uint32>& idx ) 509 { 510 md3_t* md3 = (md3_t*)m_md3; 511 sint32 num_surfaces = md3->header.num_surfaces; 512 idx.clear(); 371 372 sint32 index_count = 0; 373 for ( sint32 i = 0; i < num_surfaces; ++i ) 374 { 375 index_count += md3->surfaces[i].header.num_triangles * 3; 376 } 377 378 index = 0; 513 379 sint32 index_base = 0; 380 mesh_raw_index_channel* ic = mesh_raw_index_channel::create< uint16 >( index_count ); 381 uint16* icp = (uint16*)ic->data; 514 382 for ( sint32 i = 0; i < num_surfaces; ++i ) 515 383 { 516 384 const md3_surface_t& surface = md3->surfaces[i]; 517 385 const size_t tcount = static_cast< size_t >( surface.header.num_triangles ); 518 519 idx.reserve( idx.size() + tcount * 3 );520 386 for (size_t j = 0; j < tcount; ++j ) 521 387 { 522 388 const md3_triangle_t& t = surface.triangles[j]; 523 i dx.push_back( static_cast< uint32 >( index_base + t.indexes[0] ));524 i dx.push_back( static_cast< uint32 >( index_base + t.indexes[1] ));525 i dx.push_back( static_cast< uint32 >( index_base + t.indexes[2] ));389 icp[index++] = static_cast< uint16 >( index_base + t.indexes[0] ); 390 icp[index++] = static_cast< uint16 >( index_base + t.indexes[1] ); 391 icp[index++] = static_cast< uint16 >( index_base + t.indexes[2] ); 526 392 } 527 528 393 index_base += surface.header.num_verts; 529 394 } 530 395 531 } 532 396 mesh_data* result = new mesh_data(); 397 result->add_channel( mc_pn ); 398 result->add_channel( mc_t ); 399 result->set_index_channel( ic ); 400 return result; 401 } 402 403 tag_map* nv::md3_loader::create_tag_map() 404 { 405 md3_t* md3 = (md3_t*)m_md3; 406 tag_map* result = new tag_map(); 407 for ( sint32 i = 0; i < md3->header.num_tags; ++i ) 408 { 409 const md3_tag_t& rtag = md3->tags[i + md3->header.num_tags]; 410 std::string name( (char*)(rtag.name) ); 411 load_tags( result->get_map()[ name ], name ); 412 } 413 return result; 414 } 415 416 size_t md3_loader::get_max_frames() const 417 { 418 return static_cast< size_t >( ((md3_t*)m_md3)->header.num_frames ); 419 }
Note: See TracChangeset
for help on using the changeset viewer.