-bool MD5Model_parse(Model& model, Tokeniser& tokeniser)
-{
- MD5_RETURN_FALSE_IF_FAIL(MD5_parseVersion(tokeniser));
- tokeniser.nextLine();
-
- MD5_RETURN_FALSE_IF_FAIL(MD5_parseToken(tokeniser, "commandline"));
- const char* commandline;
- MD5_RETURN_FALSE_IF_FAIL(MD5_parseString(tokeniser, commandline));
- tokeniser.nextLine();
-
- MD5_RETURN_FALSE_IF_FAIL(MD5_parseToken(tokeniser, "numJoints"));
- std::size_t numJoints;
- MD5_RETURN_FALSE_IF_FAIL(MD5_parseSize(tokeniser, numJoints));
- tokeniser.nextLine();
-
- MD5_RETURN_FALSE_IF_FAIL(MD5_parseToken(tokeniser, "numMeshes"));
- std::size_t numMeshes;
- MD5_RETURN_FALSE_IF_FAIL(MD5_parseSize(tokeniser, numMeshes));
- tokeniser.nextLine();
-
- MD5Joints joints(numJoints);
-
- MD5_RETURN_FALSE_IF_FAIL(MD5_parseToken(tokeniser, "joints"));
- MD5_RETURN_FALSE_IF_FAIL(MD5_parseToken(tokeniser, "{"));
- tokeniser.nextLine();
-
- for(MD5Joints::iterator i = joints.begin(); i != joints.end(); ++i)
- {
- const char* jointName;
- MD5_RETURN_FALSE_IF_FAIL(MD5_parseString(tokeniser, jointName));
- MD5_RETURN_FALSE_IF_FAIL(MD5_parseInteger(tokeniser, (*i).parent));
- MD5_RETURN_FALSE_IF_FAIL(MD5_parseVector3(tokeniser, (*i).position));
- MD5_RETURN_FALSE_IF_FAIL(MD5_parseVector3(tokeniser, vector4_to_vector3((*i).rotation)));
- (*i).rotation.w() = -static_cast<float>(sqrt(1.0f - (float_squared((*i).rotation.x()) + float_squared((*i).rotation.y()) + float_squared((*i).rotation.z()))));
- tokeniser.nextLine();
- }
-
- MD5_RETURN_FALSE_IF_FAIL(MD5_parseToken(tokeniser, "}"));
- tokeniser.nextLine();
-
- for(std::size_t i = 0; i < numMeshes; ++i)
- {
- Surface& surface = model.newSurface();
-
- MD5_RETURN_FALSE_IF_FAIL(MD5_parseToken(tokeniser, "mesh"));
- MD5_RETURN_FALSE_IF_FAIL(MD5_parseToken(tokeniser, "{"));
- tokeniser.nextLine();
-
- MD5_RETURN_FALSE_IF_FAIL(MD5_parseToken(tokeniser, "shader"));
- const char* shader;
- MD5_RETURN_FALSE_IF_FAIL(MD5_parseString(tokeniser, shader));
- surface.setShader(shader);
- tokeniser.nextLine();
-
- MD5_RETURN_FALSE_IF_FAIL(MD5_parseToken(tokeniser, "numverts"));
- std::size_t numVerts;
- MD5_RETURN_FALSE_IF_FAIL(MD5_parseSize(tokeniser, numVerts));
- tokeniser.nextLine();
-
- MD5Verts verts(numVerts);
-
- for(MD5Verts::iterator j = verts.begin(); j != verts.end(); ++j)
- {
- MD5_RETURN_FALSE_IF_FAIL(MD5_parseToken(tokeniser, "vert"));
- MD5_RETURN_FALSE_IF_FAIL(MD5_parseSize(tokeniser, (*j).index));
- MD5_RETURN_FALSE_IF_FAIL((*j).index == std::size_t(j - verts.begin()));
- MD5_RETURN_FALSE_IF_FAIL(MD5_parseToken(tokeniser, "("));
- MD5_RETURN_FALSE_IF_FAIL(MD5_parseFloat(tokeniser, (*j).u));
- MD5_RETURN_FALSE_IF_FAIL(MD5_parseFloat(tokeniser, (*j).v));
- MD5_RETURN_FALSE_IF_FAIL(MD5_parseToken(tokeniser, ")"));
- MD5_RETURN_FALSE_IF_FAIL(MD5_parseSize(tokeniser, (*j).weight_index));
- MD5_RETURN_FALSE_IF_FAIL(MD5_parseSize(tokeniser, (*j).weight_count));
- tokeniser.nextLine();
- }
-
- MD5_RETURN_FALSE_IF_FAIL(MD5_parseToken(tokeniser, "numtris"));
- std::size_t numTris;
- MD5_RETURN_FALSE_IF_FAIL(MD5_parseSize(tokeniser, numTris));
- tokeniser.nextLine();
-
- MD5Tris tris(numTris);
-
- for(MD5Tris::iterator j = tris.begin(); j != tris.end(); ++j)
- {
- MD5_RETURN_FALSE_IF_FAIL(MD5_parseToken(tokeniser, "tri"));
- MD5_RETURN_FALSE_IF_FAIL(MD5_parseSize(tokeniser, (*j).index));
- MD5_RETURN_FALSE_IF_FAIL((*j).index == std::size_t(j - tris.begin()));
- MD5_RETURN_FALSE_IF_FAIL(MD5_parseSize(tokeniser, (*j).a));
- MD5_RETURN_FALSE_IF_FAIL(MD5_parseSize(tokeniser, (*j).b));
- MD5_RETURN_FALSE_IF_FAIL(MD5_parseSize(tokeniser, (*j).c));
- tokeniser.nextLine();
- }
-
- MD5_RETURN_FALSE_IF_FAIL(MD5_parseToken(tokeniser, "numweights"));
- std::size_t numWeights;
- MD5_RETURN_FALSE_IF_FAIL(MD5_parseSize(tokeniser, numWeights));
- tokeniser.nextLine();
-
- MD5Weights weights(numWeights);
-
- for(MD5Weights::iterator j = weights.begin(); j != weights.end(); ++j)
- {
- MD5_RETURN_FALSE_IF_FAIL(MD5_parseToken(tokeniser, "weight"));
- MD5_RETURN_FALSE_IF_FAIL(MD5_parseSize(tokeniser, (*j).index));
- MD5_RETURN_FALSE_IF_FAIL((*j).index == std::size_t(j - weights.begin()));
- MD5_RETURN_FALSE_IF_FAIL(MD5_parseSize(tokeniser, (*j).joint));
- MD5_RETURN_FALSE_IF_FAIL(MD5_parseFloat(tokeniser, (*j).t));
- MD5_RETURN_FALSE_IF_FAIL(MD5_parseVector3(tokeniser, (*j).v));
- tokeniser.nextLine();
- }
-
- MD5_RETURN_FALSE_IF_FAIL(MD5_parseToken(tokeniser, "}"));
- tokeniser.nextLine();
-
- for(MD5Verts::iterator j = verts.begin(); j != verts.end(); ++j)
- {
- MD5Vert& vert = (*j);
-
- Vector3 skinned(0, 0, 0);
- for(std::size_t k = 0; k != vert.weight_count; ++k)
- {
- MD5Weight& weight = weights[vert.weight_index + k];
- MD5Joint& joint = joints[weight.joint];
-
- skinned += (quaternion_transformed_point(joint.rotation, weight.v) + joint.position) * weight.t;
- }
-
- surface.vertices().push_back(ArbitraryMeshVertex(vertex3f_for_vector3(skinned), Normal3f(0, 0, 0), TexCoord2f(vert.u, vert.v)));
- }
-
- for(MD5Tris::iterator j = tris.begin(); j != tris.end(); ++j)
- {
- MD5Tri& tri = (*j);
- surface.indices().insert(RenderIndex(tri.a));
- surface.indices().insert(RenderIndex(tri.b));
- surface.indices().insert(RenderIndex(tri.c));
- }
-
- for(Surface::indices_t::iterator j = surface.indices().begin(); j != surface.indices().end(); j += 3)
- {
- ArbitraryMeshVertex& a = surface.vertices()[*(j + 0)];
- ArbitraryMeshVertex& b = surface.vertices()[*(j + 1)];
- ArbitraryMeshVertex& c = surface.vertices()[*(j + 2)];
+bool MD5Model_parse( Model& model, Tokeniser& tokeniser ){
+ MD5_RETURN_FALSE_IF_FAIL( MD5_parseVersion( tokeniser ) );
+ tokeniser.nextLine();
+
+ MD5_RETURN_FALSE_IF_FAIL( MD5_parseToken( tokeniser, "commandline" ) );
+ const char* commandline;
+ MD5_RETURN_FALSE_IF_FAIL( MD5_parseString( tokeniser, commandline ) );
+ tokeniser.nextLine();
+
+ MD5_RETURN_FALSE_IF_FAIL( MD5_parseToken( tokeniser, "numJoints" ) );
+ std::size_t numJoints;
+ MD5_RETURN_FALSE_IF_FAIL( MD5_parseSize( tokeniser, numJoints ) );
+ tokeniser.nextLine();
+
+ MD5_RETURN_FALSE_IF_FAIL( MD5_parseToken( tokeniser, "numMeshes" ) );
+ std::size_t numMeshes;
+ MD5_RETURN_FALSE_IF_FAIL( MD5_parseSize( tokeniser, numMeshes ) );
+ tokeniser.nextLine();
+
+ MD5Joints joints( numJoints );
+
+ MD5_RETURN_FALSE_IF_FAIL( MD5_parseToken( tokeniser, "joints" ) );
+ MD5_RETURN_FALSE_IF_FAIL( MD5_parseToken( tokeniser, "{" ) );
+ tokeniser.nextLine();
+
+ for ( MD5Joints::iterator i = joints.begin(); i != joints.end(); ++i )
+ {
+ const char* jointName;
+ MD5_RETURN_FALSE_IF_FAIL( MD5_parseString( tokeniser, jointName ) );
+ MD5_RETURN_FALSE_IF_FAIL( MD5_parseInteger( tokeniser, ( *i ).parent ) );
+ MD5_RETURN_FALSE_IF_FAIL( MD5_parseVector3( tokeniser, ( *i ).position ) );
+ MD5_RETURN_FALSE_IF_FAIL( MD5_parseVector3( tokeniser, vector4_to_vector3( ( *i ).rotation ) ) );
+ ( *i ).rotation.w() = -static_cast<float>( sqrt( 1.0f - ( float_squared( ( *i ).rotation.x() ) + float_squared( ( *i ).rotation.y() ) + float_squared( ( *i ).rotation.z() ) ) ) );
+ tokeniser.nextLine();
+ }
+
+ MD5_RETURN_FALSE_IF_FAIL( MD5_parseToken( tokeniser, "}" ) );
+ tokeniser.nextLine();
+
+ for ( std::size_t i = 0; i < numMeshes; ++i )
+ {
+ Surface& surface = model.newSurface();
+
+ MD5_RETURN_FALSE_IF_FAIL( MD5_parseToken( tokeniser, "mesh" ) );
+ MD5_RETURN_FALSE_IF_FAIL( MD5_parseToken( tokeniser, "{" ) );
+ tokeniser.nextLine();
+
+ MD5_RETURN_FALSE_IF_FAIL( MD5_parseToken( tokeniser, "shader" ) );
+ const char* shader;
+ MD5_RETURN_FALSE_IF_FAIL( MD5_parseString( tokeniser, shader ) );
+ surface.setShader( shader );
+ tokeniser.nextLine();
+
+ MD5_RETURN_FALSE_IF_FAIL( MD5_parseToken( tokeniser, "numverts" ) );
+ std::size_t numVerts;
+ MD5_RETURN_FALSE_IF_FAIL( MD5_parseSize( tokeniser, numVerts ) );
+ tokeniser.nextLine();
+
+ MD5Verts verts( numVerts );
+
+ for ( MD5Verts::iterator j = verts.begin(); j != verts.end(); ++j )
+ {
+ MD5_RETURN_FALSE_IF_FAIL( MD5_parseToken( tokeniser, "vert" ) );
+ MD5_RETURN_FALSE_IF_FAIL( MD5_parseSize( tokeniser, ( *j ).index ) );
+ MD5_RETURN_FALSE_IF_FAIL( ( *j ).index == std::size_t( j - verts.begin() ) );
+ MD5_RETURN_FALSE_IF_FAIL( MD5_parseToken( tokeniser, "(" ) );
+ MD5_RETURN_FALSE_IF_FAIL( MD5_parseFloat( tokeniser, ( *j ).u ) );
+ MD5_RETURN_FALSE_IF_FAIL( MD5_parseFloat( tokeniser, ( *j ).v ) );
+ MD5_RETURN_FALSE_IF_FAIL( MD5_parseToken( tokeniser, ")" ) );
+ MD5_RETURN_FALSE_IF_FAIL( MD5_parseSize( tokeniser, ( *j ).weight_index ) );
+ MD5_RETURN_FALSE_IF_FAIL( MD5_parseSize( tokeniser, ( *j ).weight_count ) );
+ tokeniser.nextLine();
+ }
+
+ MD5_RETURN_FALSE_IF_FAIL( MD5_parseToken( tokeniser, "numtris" ) );
+ std::size_t numTris;
+ MD5_RETURN_FALSE_IF_FAIL( MD5_parseSize( tokeniser, numTris ) );
+ tokeniser.nextLine();
+
+ MD5Tris tris( numTris );
+
+ for ( MD5Tris::iterator j = tris.begin(); j != tris.end(); ++j )
+ {
+ MD5_RETURN_FALSE_IF_FAIL( MD5_parseToken( tokeniser, "tri" ) );
+ MD5_RETURN_FALSE_IF_FAIL( MD5_parseSize( tokeniser, ( *j ).index ) );
+ MD5_RETURN_FALSE_IF_FAIL( ( *j ).index == std::size_t( j - tris.begin() ) );
+ MD5_RETURN_FALSE_IF_FAIL( MD5_parseSize( tokeniser, ( *j ).a ) );
+ MD5_RETURN_FALSE_IF_FAIL( MD5_parseSize( tokeniser, ( *j ).b ) );
+ MD5_RETURN_FALSE_IF_FAIL( MD5_parseSize( tokeniser, ( *j ).c ) );
+ tokeniser.nextLine();
+ }
+
+ MD5_RETURN_FALSE_IF_FAIL( MD5_parseToken( tokeniser, "numweights" ) );
+ std::size_t numWeights;
+ MD5_RETURN_FALSE_IF_FAIL( MD5_parseSize( tokeniser, numWeights ) );
+ tokeniser.nextLine();
+
+ MD5Weights weights( numWeights );
+
+ for ( MD5Weights::iterator j = weights.begin(); j != weights.end(); ++j )
+ {
+ MD5_RETURN_FALSE_IF_FAIL( MD5_parseToken( tokeniser, "weight" ) );
+ MD5_RETURN_FALSE_IF_FAIL( MD5_parseSize( tokeniser, ( *j ).index ) );
+ MD5_RETURN_FALSE_IF_FAIL( ( *j ).index == std::size_t( j - weights.begin() ) );
+ MD5_RETURN_FALSE_IF_FAIL( MD5_parseSize( tokeniser, ( *j ).joint ) );
+ MD5_RETURN_FALSE_IF_FAIL( MD5_parseFloat( tokeniser, ( *j ).t ) );
+ MD5_RETURN_FALSE_IF_FAIL( MD5_parseVector3( tokeniser, ( *j ).v ) );
+ tokeniser.nextLine();
+ }
+
+ MD5_RETURN_FALSE_IF_FAIL( MD5_parseToken( tokeniser, "}" ) );
+ tokeniser.nextLine();
+
+ for ( MD5Verts::iterator j = verts.begin(); j != verts.end(); ++j )
+ {
+ MD5Vert& vert = ( *j );
+
+ Vector3 skinned( 0, 0, 0 );
+ for ( std::size_t k = 0; k != vert.weight_count; ++k )
+ {
+ MD5Weight& weight = weights[vert.weight_index + k];
+ MD5Joint& joint = joints[weight.joint];
+
+ skinned += ( quaternion_transformed_point( joint.rotation, weight.v ) + joint.position ) * weight.t;
+ }
+
+ surface.vertices().push_back( ArbitraryMeshVertex( vertex3f_for_vector3( skinned ), Normal3f( 0, 0, 0 ), TexCoord2f( vert.u, vert.v ) ) );
+ }
+
+ for ( MD5Tris::iterator j = tris.begin(); j != tris.end(); ++j )
+ {
+ MD5Tri& tri = ( *j );
+ surface.indices().insert( RenderIndex( tri.a ) );
+ surface.indices().insert( RenderIndex( tri.b ) );
+ surface.indices().insert( RenderIndex( tri.c ) );
+ }
+
+ for ( Surface::indices_t::iterator j = surface.indices().begin(); j != surface.indices().end(); j += 3 )
+ {
+ ArbitraryMeshVertex& a = surface.vertices()[*( j + 0 )];
+ ArbitraryMeshVertex& b = surface.vertices()[*( j + 1 )];
+ ArbitraryMeshVertex& c = surface.vertices()[*( j + 2 )];