Ignore:
Timestamp:
05/17/14 02:35:19 (11 years ago)
Author:
epyon
Message:
  • massive update of mesh handling
  • universal mesh handling routines
  • removed a lot of legacy code
  • significantly streamlined MD5 loading
  • all tests updated to new features
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/formats/md3_loader.cc

    r236 r239  
    234234
    235235md3_loader::md3_loader()
    236         : m_md3( nullptr ), m_size( 0 )
     236        : m_md3( nullptr )
    237237{
    238238        if ( !s_normal_ready )
     
    276276{
    277277        m_tags.clear();
    278         m_size = 0;
    279278
    280279        m_md3 = (void*)(new md3_t);
     
    285284        return true;
    286285}
    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 */
    329286
    330287void nv::md3_loader::load_tags( std::vector<transform>& t, const std::string& tag )
     
    351308}
    352309
    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*/ )
     310struct vtx_md3_pn
     311{
     312        nv::vec3 position;
     313        nv::vec3 normal;
     314};
     315
     316struct vtx_md3_t
     317{
     318        nv::vec2 texcoord;
     319};
     320
     321mesh_data* nv::md3_loader::release_mesh_data()
     322{
     323        return release_mesh_data( -1 );
     324}
     325
     326mesh_data* nv::md3_loader::release_mesh_data( sint32 frame )
    435327{
    436328        md3_t* md3 = (md3_t*)m_md3;
    437329        sint32 num_surfaces = md3->header.num_surfaces;
    438         p.clear();
     330        sint32 num_verts    = md3->vertices_per_frame;
    439331        sint32 current_frame = ( frame == -1 ? 0 : frame );
    440332        sint32 frame_count   = ( frame == -1 ? md3->header.num_frames : 1 );
    441333
    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;
    444338        while ( frame_count > 0 )
    445339        {
     
    453347                        {
    454348                                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++;
    456352                        }
     353
    457354                }
    458355                ++current_frame;
    459356                --frame_count;
    460357        }
    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;
    496362        for ( sint32 i = 0; i < num_surfaces; ++i )
    497363        {
    498364                const md3_surface_t& surface = md3->surfaces[i];
    499365                const uint32         vcount  = static_cast< uint32 >( surface.header.num_verts );
    500                 t.reserve( t.size() + vcount );
    501366                for (uint32 j = 0; j < vcount; ++j )
    502367                {
    503                         t.push_back( md3_texcoord( surface.st[j] ) );
     368                        vtx_t[index++].texcoord = md3_texcoord( surface.st[j] );
    504369                }
    505370        }
    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;
    513379        sint32 index_base = 0;
     380        mesh_raw_index_channel* ic = mesh_raw_index_channel::create< uint16 >( index_count );
     381        uint16* icp = (uint16*)ic->data;
    514382        for ( sint32 i = 0; i < num_surfaces; ++i )
    515383        {
    516384                const md3_surface_t& surface = md3->surfaces[i];
    517385                const size_t         tcount  = static_cast< size_t >( surface.header.num_triangles );
    518 
    519                 idx.reserve( idx.size() + tcount * 3 );
    520386                for (size_t j = 0; j < tcount; ++j )
    521387                {
    522388                        const md3_triangle_t& t = surface.triangles[j];
    523                         idx.push_back( static_cast< uint32 >( index_base + t.indexes[0] ) );
    524                         idx.push_back( static_cast< uint32 >( index_base + t.indexes[1] ) );
    525                         idx.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] );
    526392                }
    527 
    528393                index_base += surface.header.num_verts;
    529394        }
    530395
    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
     403tag_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
     416size_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.