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/md2_loader.cc

    r236 r239  
    203203static bool s_md2_normal_ready = false;
    204204
    205 md2_loader::md2_loader() : m_md2( nullptr ), m_size( 0 )
     205md2_loader::md2_loader() : m_md2( nullptr )
    206206{
    207207        if ( !s_md2_normal_ready )
     
    230230bool md2_loader::load( stream& source )
    231231{
    232         m_size = 0;
    233232        m_md2 = (void*)(new md2_t);
    234233        if ( !read_md2( (md2_t*)m_md2, source ) )
     
    237236        }
    238237        reindex();
    239         m_size = m_new_indexes.size();
    240238        return true;
    241239}
    242240
    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 
    298241size_t md2_loader::get_max_frames() const
    299242{
    300243        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() );
    378244}
    379245
     
    433299        NV_LOG( LOG_INFO, "Reuse count      = " << stats_reuse );
    434300}
     301
     302
     303struct vtx_md2_pn
     304{
     305        nv::vec3 position;
     306        nv::vec3 normal;
     307};
     308
     309struct vtx_md2_t
     310{
     311        nv::vec2 texcoord;
     312};
     313
     314
     315mesh_data* nv::md2_loader::release_mesh_data()
     316{
     317        return release_mesh_data( -1 );
     318}
     319
     320mesh_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.