@@ -294,7 +294,7 @@ void MD5Surface::buildIndexArray()
294294 }
295295}
296296
297- void MD5Surface::parseFromTokens (parser::DefTokeniser& tok)
297+ void MD5Surface::parseFromTokens (parser::DefTokeniser& tok, int version )
298298{
299299 // Start of datablock
300300 tok.assertNextToken (" mesh" );
@@ -303,10 +303,25 @@ void MD5Surface::parseFromTokens(parser::DefTokeniser& tok)
303303 // Get the reference to the mesh definition
304304 MD5Mesh& mesh = *_mesh;
305305
306+ // v11 may have an optional "name" field before shader
307+ if (tok.peek () == " name" )
308+ {
309+ tok.nextToken (); // "name"
310+ tok.nextToken (); // skip the name string
311+ }
312+
306313 // Get the shader name
307314 tok.assertNextToken (" shader" );
308315 setDefaultMaterial (tok.nextToken ());
309316
317+ // v11 may have an optional "flags { ... }" block
318+ if (tok.peek () == " flags" )
319+ {
320+ tok.nextToken (); // "flags"
321+ tok.assertNextToken (" {" );
322+ while (tok.nextToken () != " }" ) {} // skip until closing brace
323+ }
324+
310325 // ----- VERTICES ------
311326
312327 // Read the vertex count
@@ -335,6 +350,27 @@ void MD5Surface::parseFromTokens(parser::DefTokeniser& tok)
335350 vt->weight_index = string::convert<std::size_t >(tok.nextToken ());
336351 vt->weight_count = string::convert<std::size_t >(tok.nextToken ());
337352
353+ if (version == 11 )
354+ {
355+ // v11: optional per-vertex RGBA as ( R G B A )
356+ if (tok.peek () == " (" )
357+ {
358+ tok.nextToken (); // "("
359+ tok.skipTokens (4 ); // R G B A
360+ tok.assertNextToken (" )" );
361+ }
362+ }
363+ else if (version == 12 )
364+ {
365+ // v12: per-vertex normal ( nx ny nz ) and tangent ( tx ty tz tw )
366+ tok.assertNextToken (" (" );
367+ tok.skipTokens (3 ); // nx ny nz
368+ tok.assertNextToken (" )" );
369+ tok.assertNextToken (" (" );
370+ tok.skipTokens (4 ); // tx ty tz tw
371+ tok.assertNextToken (" )" );
372+ }
373+
338374 } // for each vertex
339375
340376 // ------ TRIANGLES ------
@@ -385,6 +421,21 @@ void MD5Surface::parseFromTokens(parser::DefTokeniser& tok)
385421
386422 } // for each weight
387423
424+ // v12: optional vertex colors block
425+ if (version == 12 && tok.peek () == " numvertexcolors" )
426+ {
427+ tok.nextToken (); // "numvertexcolors"
428+ std::size_t numColors = string::convert<std::size_t >(tok.nextToken ());
429+ for (std::size_t i = 0 ; i < numColors; ++i)
430+ {
431+ tok.assertNextToken (" vertexcolor" );
432+ tok.skipTokens (1 ); // index
433+ tok.assertNextToken (" (" );
434+ tok.skipTokens (4 ); // R G B A
435+ tok.assertNextToken (" )" );
436+ }
437+ }
438+
388439 // ----- END OF MESH DECL -----
389440
390441 tok.assertNextToken (" }" );
0 commit comments