Changeset 226 for trunk/src/formats


Ignore:
Timestamp:
01/05/14 04:43:48 (11 years ago)
Author:
epyon
Message:
  • md5 implementation fixes and optimizations
File:
1 edited

Legend:

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

    r224 r226  
    2323static inline void discard( std::istream& stream, const std::string& token )
    2424{
     25//      stream.ignore( std::numeric_limits<std::streamsize>::max(), ' ' );
    2526        std::string discarded;
    2627        stream >> discarded;
     
    8990                else if ( command == "mesh" )
    9091                {
    91                         // TODO : efficiency dammit
    9292                        md5_mesh* mesh = new md5_mesh;
    9393                        int num_verts, num_tris, num_weights;
     
    108108                                        sstream >> num_verts;
    109109                                        next_line( sstream );
     110                                        std::string line;
    110111                                        for ( int i = 0; i < num_verts; ++i )
    111112                                        {
    112113                                                md5_vertex vert;
    113                                                 std::string ignore;
    114                                                 discard( sstream, "vert" );
    115                                                 sstream >> ignore;
    116                                                 discard( sstream, "(" );
    117                                                 sstream >> vert.texcoord.x >> vert.texcoord.y;
    118                                                 discard( sstream, ")" );
    119                                                 sstream >> vert.start_weight >> vert.weight_count;
    120                                                 next_line( sstream );
     114
     115                                                std::getline( sstream, line );
     116                                                sscanf( line.c_str(), "%*s %*u ( %f %f ) %u %u", &(vert.texcoord.x), &(vert.texcoord.y), &(vert.start_weight), &(vert.weight_count) );
     117
     118//                                              std::string ignore;
     119//                                              discard( sstream, "vert" );
     120//                                              sstream >> ignore;
     121//                                              discard( sstream, "(" );
     122//                                              sstream >> vert.texcoord.x >> vert.texcoord.y;
     123//                                              discard( sstream, ")" );
     124//                                              sstream >> vert.start_weight >> vert.weight_count;
     125//                                              next_line( sstream );
    121126
    122127                                                mesh->verts.push_back(vert);
     
    128133                                        sstream >> num_tris;
    129134                                        next_line( sstream );
     135                                        std::string line;
    130136                                        for ( int i = 0; i < num_tris; ++i )
    131137                                        {
    132138                                                md5_triangle tri;
    133                                                 std::string ignore;
    134                                                 discard( sstream, "tri" );
    135                                                 sstream >> ignore >> tri.indices[0] >> tri.indices[1] >> tri.indices[2];
    136                                                 next_line( sstream );
     139
     140                                                std::getline( sstream, line );
     141                                                sscanf( line.c_str(), "%*s %*u %u %u %u )", &(tri.indices[0]), &(tri.indices[1]), &(tri.indices[2]));
     142
     143//                                              std::string ignore;
     144//                                              discard( sstream, "tri" );
     145//                                              sstream >> ignore >> tri.indices[0] >> tri.indices[1] >> tri.indices[2];
     146//                                              next_line( sstream );
    137147
    138148                                                mesh->tris.push_back( tri );
     
    145155                                {
    146156                                        sstream >> num_weights;
     157                                        mesh->weights.reserve( num_weights );
    147158                                        next_line( sstream );
     159                                        std::string line;
    148160                                        for ( int i = 0; i < num_weights; ++i )
    149161                                        {
    150162                                                md5_weight weight;
    151                                                 std::string ignore;
    152                                                 discard( sstream, "weight" );
    153                                                 sstream >> ignore >> weight.joint_id >> weight.bias;
    154                                                 discard( sstream, "(" );
    155                                                 sstream >> weight.pos.x >> weight.pos.y >> weight.pos.z;
    156                                                 discard( sstream, ")" );
    157                                                 next_line( sstream );
    158                                                 mesh->weights.push_back(weight);
     163
     164                                                std::getline( sstream, line );
     165                                                sscanf( line.c_str(), "%*s %*u %u %f ( %f %f %f )", &(weight.joint_id), &(weight.bias), &(weight.pos.x), &(weight.pos.y), &(weight.pos.z));
     166
     167//                                              std::string ignore;
     168//                                              discard( sstream, "weight" );
     169//                                              sstream >> ignore >> weight.joint_id >> weight.bias;
     170//                                              discard( sstream, "(" );
     171//                                              sstream >> weight.pos.x >> weight.pos.y >> weight.pos.z;
     172//                                              discard( sstream, ")" );
     173//                                              next_line( sstream );
     174                                                mesh->weights.push_back(weight);
    159175                                        }
    160176                                }
     
    425441                        next_line( sstream );
    426442
     443                        frame.frame_data.reserve( m_num_animated_components );
     444                        char buf[50];
    427445                        for ( size_t i = 0; i < m_num_animated_components; ++i )
    428446                        {
    429                                 float frameData;
    430                                 sstream >> frameData;
    431                                 frame.frame_data.push_back(frameData);
     447                                sstream >> buf;
     448                                frame.frame_data.push_back((float)atof(buf));
    432449                        }
    433450
Note: See TracChangeset for help on using the changeset viewer.