@@ -236,9 +236,13 @@ public void ReadVertices(EndianReader reader, uint meshVersion, bool isNextGen,
236236 }
237237 else
238238 {
239- newVert . uvCheck = reader . ReadInt32 ( ) ;
240- if ( newVert . uvCheck == - 1 )
239+ if ( compressionType == 1 )
241240 {
241+ uint value = reader . ReadUInt32 ( ) ;
242+ newVert . vertexColors . r = ( byte ) ( ( value >> 24 ) & 0xFF ) ;
243+ newVert . vertexColors . g = ( byte ) ( ( value >> 16 ) & 0xFF ) ;
244+ newVert . vertexColors . b = ( byte ) ( ( value >> 8 ) & 0xFF ) ;
245+ newVert . vertexColors . a = ( byte ) ( value & 0xFF ) ;
242246 newVert . u = reader . ReadHalfFloat ( ) ;
243247 newVert . v = reader . ReadHalfFloat ( ) ;
244248
@@ -270,56 +274,44 @@ public void ReadVertices(EndianReader reader, uint meshVersion, bool isNextGen,
270274 newVert . bone2 = reader . ReadByte ( ) ;
271275 newVert . bone3 = reader . ReadByte ( ) ;
272276 }
273- else
277+ else if ( compressionType == 2 )
274278 {
275- if ( compressionType == 1 )
276- {
277- reader . BaseStream . Position -= 4 ;
278- newVert . u = reader . ReadHalfFloat ( ) ;
279- newVert . v = reader . ReadHalfFloat ( ) ;
280-
281- Vertex . QTangent tangents = new Vertex . QTangent ( ) ;
282- tangents . Read ( reader ) ;
283- newVert . tangent0 = tangents . x . fValue ;
284- newVert . tangent1 = tangents . y . fValue ;
285- newVert . tangent2 = tangents . z . fValue ;
286- newVert . tangent3 = tangents . w . fValue ;
287-
288- newVert . weight0 = reader . ReadByte ( ) ;
289- newVert . weight1 = reader . ReadByte ( ) ;
290- newVert . weight2 = reader . ReadByte ( ) ;
291- newVert . weight3 = reader . ReadByte ( ) ;
292-
293- newVert . bone0 = reader . ReadUInt16 ( ) ;
294- newVert . bone1 = reader . ReadUInt16 ( ) ;
295- newVert . bone2 = reader . ReadUInt16 ( ) ;
296- newVert . bone3 = reader . ReadUInt16 ( ) ;
297- }
298- else if ( compressionType == 2 )
299- {
300- reader . BaseStream . Position -= 4 ;
301- newVert . u = reader . ReadHalfFloat ( ) ;
302- newVert . v = reader . ReadHalfFloat ( ) ;
303-
304- newVert . unknown2 = reader . ReadFloat ( ) ;
305-
306- Vertex . QTangent tangents = new Vertex . QTangent ( ) ;
307- tangents . Read ( reader ) ;
308- newVert . tangent0 = tangents . x . fValue ;
309- newVert . tangent1 = tangents . y . fValue ;
310- newVert . tangent2 = tangents . z . fValue ;
311- newVert . tangent3 = tangents . w . fValue ;
312-
313- newVert . weight0 = reader . ReadByte ( ) ;
314- newVert . weight1 = reader . ReadByte ( ) ;
315- newVert . weight2 = reader . ReadByte ( ) ;
316- newVert . weight3 = reader . ReadByte ( ) ;
317-
318- newVert . bone0 = reader . ReadUInt16 ( ) ;
319- newVert . bone1 = reader . ReadUInt16 ( ) ;
320- newVert . bone2 = reader . ReadUInt16 ( ) ;
321- newVert . bone3 = reader . ReadUInt16 ( ) ;
322- }
279+ newVert . u = reader . ReadHalfFloat ( ) ;
280+ newVert . v = reader . ReadHalfFloat ( ) ;
281+
282+ Vertex . PS3SignedCompressedVec3 norms = new Vertex . PS3SignedCompressedVec3 ( ) ;
283+ norms . Read ( reader ) ;
284+ newVert . nx = norms . x ;
285+ newVert . ny = norms . y ;
286+ newVert . nz = norms . z ;
287+ newVert . nw = norms . w ;
288+
289+ Vertex . PS3SignedCompressedVec3 tangents = new Vertex . PS3SignedCompressedVec3 ( ) ;
290+ tangents . Read ( reader ) ;
291+
292+ newVert . tangent0 = tangents . x ;
293+ newVert . tangent1 = tangents . y ;
294+ newVert . tangent2 = tangents . z ;
295+ newVert . tangent3 = tangents . w ;
296+
297+ Vertex . PS3UnsignedCompressedVec3 weights = new Vertex . PS3UnsignedCompressedVec3 ( ) ;
298+ weights . Read ( reader ) ;
299+
300+ uint value = reader . ReadUInt32 ( ) ;
301+ newVert . vertexColors . a = ( byte ) ( ( value >> 24 ) & 0xFF ) ;
302+ newVert . vertexColors . r = ( byte ) ( ( value >> 16 ) & 0xFF ) ;
303+ newVert . vertexColors . g = ( byte ) ( ( value >> 8 ) & 0xFF ) ;
304+ newVert . vertexColors . b = ( byte ) ( value & 0xFF ) ;
305+
306+ newVert . weight0 = weights . x ;
307+ newVert . weight1 = weights . y ;
308+ newVert . weight2 = weights . z ;
309+ newVert . weight3 = weights . w ;
310+
311+ newVert . bone0 = reader . ReadUInt16 ( ) ;
312+ newVert . bone1 = reader . ReadUInt16 ( ) ;
313+ newVert . bone2 = reader . ReadUInt16 ( ) ;
314+ newVert . bone3 = reader . ReadUInt16 ( ) ;
323315 }
324316 }
325317
@@ -449,11 +441,11 @@ public void WriteVertices(EndianWriter writer, uint meshVersion, bool isNextGen,
449441 }
450442 else
451443 {
452- // We assume we have stored an int 'UvIndicator' in vertex indicating the read 'uv' value:
453- writer . WriteInt32 ( vertex . uvCheck ) ;
454-
455- if ( vertex . uvCheck == - 1 )
444+ if ( compressionType == 1 )
456445 {
446+ // vertex colors in RGBA?
447+ uint value = ( ( uint ) vertex . vertexColors . r << 24 ) | ( ( uint ) vertex . vertexColors . g << 16 ) | ( ( uint ) vertex . vertexColors . b << 8 ) | ( uint ) vertex . vertexColors . a ;
448+ writer . WriteUInt32 ( value ) ;
457449 writer . WriteHalfFloat ( vertex . u ) ;
458450 writer . WriteHalfFloat ( vertex . v ) ;
459451
@@ -489,58 +481,52 @@ public void WriteVertices(EndianWriter writer, uint meshVersion, bool isNextGen,
489481 writer . WriteByte ( ( byte ) vertex . bone2 ) ;
490482 writer . WriteByte ( ( byte ) vertex . bone3 ) ;
491483 }
492- else
484+ else if ( compressionType == 2 )
493485 {
494- if ( compressionType == 1 )
486+ writer . WriteHalfFloat ( vertex . u ) ;
487+ writer . WriteHalfFloat ( vertex . v ) ;
488+
489+ Vertex . PS3SignedCompressedVec3 norms = new Vertex . PS3SignedCompressedVec3
495490 {
496- writer . BaseStream . Position -= 4 ;
497- writer . WriteHalfFloat ( vertex . u ) ;
498- writer . WriteHalfFloat ( vertex . v ) ;
491+ x = vertex . nx ,
492+ y = vertex . ny ,
493+ z = vertex . nz ,
494+ w = vertex . nw
495+ } ;
496+ norms . Write ( writer ) ;
499497
500- Vertex . QTangent tangents = new Vertex . QTangent
501- {
502- x = new Vertex . QTangent . SNorm ( ( short ) vertex . tangent0 ) ,
503- y = new Vertex . QTangent . SNorm ( ( short ) vertex . tangent1 ) ,
504- z = new Vertex . QTangent . SNorm ( ( short ) vertex . tangent2 ) ,
505- w = new Vertex . QTangent . SNorm ( ( short ) vertex . tangent3 )
506- } ;
507-
508- writer . WriteByte ( ( byte ) vertex . weight0 ) ;
509- writer . WriteByte ( ( byte ) vertex . weight1 ) ;
510- writer . WriteByte ( ( byte ) vertex . weight2 ) ;
511- writer . WriteByte ( ( byte ) vertex . weight3 ) ;
512-
513- writer . WriteUInt16 ( vertex . bone0 ) ;
514- writer . WriteUInt16 ( vertex . bone1 ) ;
515- writer . WriteUInt16 ( vertex . bone2 ) ;
516- writer . WriteUInt16 ( vertex . bone3 ) ;
517- }
518- else if ( compressionType == 2 )
498+ Vertex . PS3SignedCompressedVec3 tangents = new Vertex . PS3SignedCompressedVec3
499+ {
500+ x = vertex . tangent0 ,
501+ y = vertex . tangent1 ,
502+ z = vertex . tangent2 ,
503+ w = vertex . tangent3
504+ } ;
505+ tangents . Write ( writer ) ;
506+
507+ Vertex . PS3UnsignedCompressedVec3 weights = new Vertex . PS3UnsignedCompressedVec3
519508 {
520- writer . BaseStream . Position -= 4 ;
521- writer . WriteHalfFloat ( vertex . u ) ;
522- writer . WriteHalfFloat ( vertex . v ) ;
509+ x = vertex . weight0 ,
510+ y = vertex . weight1 ,
511+ z = vertex . weight2 ,
512+ w = vertex . weight3
513+ } ;
514+ weights . Write ( writer ) ;
523515
524- writer . WriteFloat ( vertex . unknown2 ) ;
516+ Vertex . PS3UnsignedCompressedVec3 unknown = new Vertex . PS3UnsignedCompressedVec3
517+ {
518+ x = vertex . weight0 ,
519+ y = vertex . weight1 ,
520+ z = vertex . weight2 ,
521+ w = vertex . weight3
522+ } ;
523+ uint value = ( ( uint ) vertex . vertexColors . a << 24 ) | ( ( uint ) vertex . vertexColors . r << 16 ) | ( ( uint ) vertex . vertexColors . g << 8 ) | ( uint ) vertex . vertexColors . b ;
524+ writer . WriteUInt32 ( value ) ;
525525
526- Vertex . QTangent tangents = new Vertex . QTangent
527- {
528- x = new Vertex . QTangent . SNorm ( ( short ) vertex . tangent0 ) ,
529- y = new Vertex . QTangent . SNorm ( ( short ) vertex . tangent1 ) ,
530- z = new Vertex . QTangent . SNorm ( ( short ) vertex . tangent2 ) ,
531- w = new Vertex . QTangent . SNorm ( ( short ) vertex . tangent3 )
532- } ;
533-
534- writer . WriteByte ( ( byte ) vertex . weight0 ) ;
535- writer . WriteByte ( ( byte ) vertex . weight1 ) ;
536- writer . WriteByte ( ( byte ) vertex . weight2 ) ;
537- writer . WriteByte ( ( byte ) vertex . weight3 ) ;
538-
539- writer . WriteUInt16 ( vertex . bone0 ) ;
540- writer . WriteUInt16 ( vertex . bone1 ) ;
541- writer . WriteUInt16 ( vertex . bone2 ) ;
542- writer . WriteUInt16 ( vertex . bone3 ) ;
543- }
526+ writer . WriteUInt16 ( ( byte ) vertex . bone0 ) ;
527+ writer . WriteUInt16 ( ( byte ) vertex . bone1 ) ;
528+ writer . WriteUInt16 ( ( byte ) vertex . bone2 ) ;
529+ writer . WriteUInt16 ( ( byte ) vertex . bone3 ) ;
544530 }
545531 }
546532 }
0 commit comments