Index: trunk/src/formats/md5_loader.cc
===================================================================
--- trunk/src/formats/md5_loader.cc	(revision 225)
+++ trunk/src/formats/md5_loader.cc	(revision 226)
@@ -23,4 +23,5 @@
 static inline void discard( std::istream& stream, const std::string& token )
 {
+//	stream.ignore( std::numeric_limits<std::streamsize>::max(), ' ' );
 	std::string discarded;
 	stream >> discarded;
@@ -89,5 +90,4 @@
 		else if ( command == "mesh" )
 		{
-			// TODO : efficiency dammit
 			md5_mesh* mesh = new md5_mesh;
 			int num_verts, num_tris, num_weights;
@@ -108,15 +108,20 @@
 					sstream >> num_verts; 
 					next_line( sstream );
+					std::string line;
 					for ( int i = 0; i < num_verts; ++i )
 					{
 						md5_vertex vert;
-						std::string ignore;
-						discard( sstream, "vert" );
-						sstream >> ignore;
-						discard( sstream, "(" );
-						sstream >> vert.texcoord.x >> vert.texcoord.y;
-						discard( sstream, ")" );
-						sstream >> vert.start_weight >> vert.weight_count;
-						next_line( sstream );
+
+						std::getline( sstream, line );
+						sscanf( line.c_str(), "%*s %*u ( %f %f ) %u %u", &(vert.texcoord.x), &(vert.texcoord.y), &(vert.start_weight), &(vert.weight_count) );
+
+// 						std::string ignore;
+// 						discard( sstream, "vert" );
+// 						sstream >> ignore;
+// 						discard( sstream, "(" );
+// 						sstream >> vert.texcoord.x >> vert.texcoord.y;
+// 						discard( sstream, ")" );
+// 						sstream >> vert.start_weight >> vert.weight_count;
+// 						next_line( sstream );
 
 						mesh->verts.push_back(vert);
@@ -128,11 +133,16 @@
 					sstream >> num_tris;
 					next_line( sstream );
+					std::string line;
 					for ( int i = 0; i < num_tris; ++i )
 					{
 						md5_triangle tri;
-						std::string ignore;
-						discard( sstream, "tri" );
-						sstream >> ignore >> tri.indices[0] >> tri.indices[1] >> tri.indices[2];
-						next_line( sstream );
+
+						std::getline( sstream, line );
+						sscanf( line.c_str(), "%*s %*u %u %u %u )", &(tri.indices[0]), &(tri.indices[1]), &(tri.indices[2]));
+
+// 						std::string ignore;
+// 						discard( sstream, "tri" );
+// 						sstream >> ignore >> tri.indices[0] >> tri.indices[1] >> tri.indices[2];
+// 						next_line( sstream );
 
 						mesh->tris.push_back( tri );
@@ -145,16 +155,22 @@
 				{
 					sstream >> num_weights;
+					mesh->weights.reserve( num_weights );
 					next_line( sstream );
+					std::string line;
 					for ( int i = 0; i < num_weights; ++i )
 					{
 						md5_weight weight;
-						std::string ignore;
-						discard( sstream, "weight" );
-						sstream >> ignore >> weight.joint_id >> weight.bias;
-						discard( sstream, "(" );
-						sstream >> weight.pos.x >> weight.pos.y >> weight.pos.z;
-						discard( sstream, ")" );
-						next_line( sstream );
-						mesh->weights.push_back(weight);
+
+						std::getline( sstream, line );
+						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));
+
+//  						std::string ignore;
+//  						discard( sstream, "weight" );
+//  						sstream >> ignore >> weight.joint_id >> weight.bias;
+//  						discard( sstream, "(" );
+//  						sstream >> weight.pos.x >> weight.pos.y >> weight.pos.z;
+//  						discard( sstream, ")" );
+//  						next_line( sstream );
+ 						mesh->weights.push_back(weight);
 					}
 				}
@@ -425,9 +441,10 @@
 			next_line( sstream ); 
 
+			frame.frame_data.reserve( m_num_animated_components );
+			char buf[50];
 			for ( size_t i = 0; i < m_num_animated_components; ++i )
 			{
-				float frameData;
-				sstream >> frameData;
-				frame.frame_data.push_back(frameData);
+				sstream >> buf;
+				frame.frame_data.push_back((float)atof(buf));
 			}
 
