Ignore:
Timestamp:
01/02/14 20:52:34 (11 years ago)
Author:
epyon
Message:
  • universal mesh format
  • removed keyframed_mesh_data
File:
1 edited

Legend:

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

    r200 r224  
    9090                {
    9191                        // TODO : efficiency dammit
    92                         md5_mesh mesh;
     92                        md5_mesh* mesh = new md5_mesh;
    9393                        int num_verts, num_tris, num_weights;
    9494
     
    9999                                if ( command == "shader" )
    100100                                {
    101                                         sstream >> mesh.shader;
    102                                         remove_quotes( mesh.shader );
     101                                        sstream >> mesh->shader;
     102                                        remove_quotes( mesh->shader );
    103103                                        // texturePath.replace_extension( ".tga" );
    104104                                        next_line( sstream );
     
    120120                                                next_line( sstream );
    121121
    122                                                 mesh.verts.push_back(vert);
    123                                                 mesh.texcoord_buffer.push_back( vert.texcoord );
     122                                                mesh->verts.push_back(vert);
     123                                                mesh->texcoord_buffer.push_back( vert.texcoord );
    124124                                        } 
    125125                                }
     
    136136                                                next_line( sstream );
    137137
    138                                                 mesh.tris.push_back( tri );
    139                                                 mesh.index_buffer.push_back( (uint32)tri.indices[0] );
    140                                                 mesh.index_buffer.push_back( (uint32)tri.indices[1] );
    141                                                 mesh.index_buffer.push_back( (uint32)tri.indices[2] );
     138                                                mesh->tris.push_back( tri );
     139                                                mesh->index_buffer.push_back( (uint32)tri.indices[0] );
     140                                                mesh->index_buffer.push_back( (uint32)tri.indices[1] );
     141                                                mesh->index_buffer.push_back( (uint32)tri.indices[2] );
    142142                                        }             
    143143                                }
     
    156156                                                discard( sstream, ")" );
    157157                                                next_line( sstream );
    158                                                 mesh.weights.push_back(weight);
     158                                                mesh->weights.push_back(weight);
    159159                                        }
    160160                                }
     
    180180}
    181181
    182 bool md5_loader::prepare_mesh( md5_mesh& mesh )
    183 {
    184         mesh.position_buffer.clear();
    185         mesh.texcoord_buffer.clear();
    186 
    187         for ( uint32 i = 0; i < mesh.verts.size(); ++i )
    188         {
    189                 md5_vertex& vert = mesh.verts[i];
     182bool md5_loader::prepare_mesh( md5_mesh* mesh )
     183{
     184        mesh->position_buffer.clear();
     185        mesh->texcoord_buffer.clear();
     186
     187        for ( uint32 i = 0; i < mesh->verts.size(); ++i )
     188        {
     189                md5_vertex& vert = mesh->verts[i];
    190190
    191191                vert.position = glm::vec3(0);
     
    195195                for ( size_t j = 0; j < vert.weight_count; ++j )
    196196                {
    197                         md5_weight& weight = mesh.weights[vert.start_weight + j];
     197                        md5_weight& weight = mesh->weights[vert.start_weight + j];
    198198                        md5_joint&  joint  = m_joints[weight.joint_id];
    199199
     
    203203                }
    204204
    205                 mesh.position_buffer.push_back(vert.position);
    206                 mesh.texcoord_buffer.push_back(vert.texcoord);
     205                mesh->position_buffer.push_back(vert.position);
     206                mesh->texcoord_buffer.push_back(vert.texcoord);
    207207        }
    208208
     
    210210}
    211211
    212 bool md5_loader::prepare_normals( md5_mesh& mesh )
    213 {
    214         mesh.normal_buffer.clear();
    215 
    216         for ( unsigned int i = 0; i < mesh.tris.size(); ++i )
    217         {
    218                 const md5_triangle& tri = mesh.tris[i];
    219                 glm::vec3 v1 = mesh.verts[ tri.indices[0] ].position;
    220                 glm::vec3 v2 = mesh.verts[ tri.indices[1] ].position;
    221                 glm::vec3 v3 = mesh.verts[ tri.indices[2] ].position;
     212bool md5_loader::prepare_normals( md5_mesh* mesh )
     213{
     214        mesh->normal_buffer.clear();
     215
     216        for ( unsigned int i = 0; i < mesh->tris.size(); ++i )
     217        {
     218                const md5_triangle& tri = mesh->tris[i];
     219                glm::vec3 v1 = mesh->verts[ tri.indices[0] ].position;
     220                glm::vec3 v2 = mesh->verts[ tri.indices[1] ].position;
     221                glm::vec3 v3 = mesh->verts[ tri.indices[2] ].position;
    222222                glm::vec3 xyz1 = v3 - v1;
    223223                glm::vec3 xyz2 = v2 - v1;
     
    225225                glm::vec3 normal = glm::cross( xyz1, xyz2 );
    226226
    227                 mesh.verts[ tri.indices[0] ].normal += normal;
    228                 mesh.verts[ tri.indices[1] ].normal += normal;
    229                 mesh.verts[ tri.indices[2] ].normal += normal;
    230 
    231                 const vec2& w1 = mesh.verts[ tri.indices[0] ].texcoord;
    232                 const vec2& w2 = mesh.verts[ tri.indices[1] ].texcoord;
    233                 const vec2& w3 = mesh.verts[ tri.indices[2] ].texcoord;
     227                mesh->verts[ tri.indices[0] ].normal += normal;
     228                mesh->verts[ tri.indices[1] ].normal += normal;
     229                mesh->verts[ tri.indices[2] ].normal += normal;
     230
     231                const vec2& w1 = mesh->verts[ tri.indices[0] ].texcoord;
     232                const vec2& w2 = mesh->verts[ tri.indices[1] ].texcoord;
     233                const vec2& w3 = mesh->verts[ tri.indices[2] ].texcoord;
    234234
    235235                vec2 st1 = w3 - w1;
     
    240240                vec3 tangent = (( xyz1 * st2.y ) - ( xyz2 * st1.y )) * coef;
    241241
    242                 mesh.verts[ tri.indices[0] ].tangent += tangent;
    243                 mesh.verts[ tri.indices[1] ].tangent += tangent;
    244                 mesh.verts[ tri.indices[2] ].tangent += tangent;
    245         }
    246 
    247         for ( size_t i = 0; i < mesh.verts.size(); ++i )
    248         {
    249                 md5_vertex& vert = mesh.verts[i];
     242                mesh->verts[ tri.indices[0] ].tangent += tangent;
     243                mesh->verts[ tri.indices[1] ].tangent += tangent;
     244                mesh->verts[ tri.indices[2] ].tangent += tangent;
     245        }
     246
     247        for ( size_t i = 0; i < mesh->verts.size(); ++i )
     248        {
     249                md5_vertex& vert = mesh->verts[i];
    250250
    251251                glm::vec3 normal  = glm::normalize( vert.normal );
    252252                glm::vec3 tangent = glm::normalize( vert.tangent );
    253                 mesh.normal_buffer.push_back( normal );
    254                 mesh.tangent_buffer.push_back( tangent );
     253                mesh->normal_buffer.push_back( normal );
     254                mesh->tangent_buffer.push_back( tangent );
    255255
    256256                vert.normal  = glm::vec3(0);
     
    259259                for ( size_t j = 0; j < vert.weight_count; ++j )
    260260                {
    261                         const md5_weight& weight = mesh.weights[vert.start_weight + j];
     261                        const md5_weight& weight = mesh->weights[vert.start_weight + j];
    262262                        const md5_joint&  joint  = m_joints[weight.joint_id];
    263263                        vert.normal  += ( normal  * joint.orient ) * weight.bias;
     
    269269}
    270270
     271mesh_data* nv::md5_loader::release_submesh_data( uint32 mesh_id )
     272{
     273        mesh_data_creator m;
     274        m.get_positions().assign( m_meshes[mesh_id]->position_buffer.begin(), m_meshes[mesh_id]->position_buffer.begin() );
     275        m.get_normals()  .assign( m_meshes[mesh_id]->normal_buffer.begin(),   m_meshes[mesh_id]->normal_buffer.begin() );
     276        m.get_tangents() .assign( m_meshes[mesh_id]->tangent_buffer.begin(),  m_meshes[mesh_id]->tangent_buffer.begin() );
     277        m.get_texcoords().assign( m_meshes[mesh_id]->texcoord_buffer.begin(), m_meshes[mesh_id]->texcoord_buffer.begin() );
     278        m.get_indices()  .assign( m_meshes[mesh_id]->index_buffer.begin(),    m_meshes[mesh_id]->index_buffer.begin() );
     279
     280        return m.release();
     281}
     282
     283/*
    271284mesh* md5_loader::release_mesh()
    272285{
     
    287300        return m;
    288301}
     302*/
    289303
    290304md5_animation::md5_animation()
     
    539553}
    540554
    541 bool md5_loader::prepare_animated_mesh( md5_mesh& mesh, const md5_animation::md5_frame_skeleton& skel )
    542 {
    543         for ( unsigned int i = 0; i < mesh.verts.size(); ++i )
    544         {
    545                 const md5_vertex& vert = mesh.verts[i];
    546                 glm::vec3& pos     = mesh.position_buffer[i];
    547                 glm::vec3& normal  = mesh.normal_buffer[i];
    548                 glm::vec3& tangent = mesh.tangent_buffer[i];
     555bool md5_loader::prepare_animated_mesh( md5_mesh* mesh, const md5_animation::md5_frame_skeleton& skel )
     556{
     557        for ( unsigned int i = 0; i < mesh->verts.size(); ++i )
     558        {
     559                const md5_vertex& vert = mesh->verts[i];
     560                glm::vec3& pos     = mesh->position_buffer[i];
     561                glm::vec3& normal  = mesh->normal_buffer[i];
     562                glm::vec3& tangent = mesh->tangent_buffer[i];
    549563
    550564                pos     = glm::vec3(0);
     
    554568                for ( size_t j = 0; j < vert.weight_count; ++j )
    555569                {
    556                         const md5_weight& weight = mesh.weights[vert.start_weight + j];
     570                        const md5_weight& weight = mesh->weights[vert.start_weight + j];
    557571                        const md5_animation::md5_skeleton_joint& joint = skel.joints[weight.joint_id];
    558572
Note: See TracChangeset for help on using the changeset viewer.