@@ -594,5 +594,85 @@ public void TestSkinnedMeshExport(){
594
594
var expWeights = exportedMesh . boneWeights ;
595
595
Assert . IsNotNull ( expWeights ) ;
596
596
}
597
+
598
+
599
+ public static void AreNearEqual ( Vector3 a , Vector3 b )
600
+ {
601
+ Assert . That ( a . x , Is . EqualTo ( b . x ) . Within ( 0.0001f ) ) ;
602
+ Assert . That ( a . y , Is . EqualTo ( b . y ) . Within ( 0.0001f ) ) ;
603
+ Assert . That ( a . z , Is . EqualTo ( b . z ) . Within ( 0.0001f ) ) ;
604
+ }
605
+ public static void AreNearEqual ( Vector3 [ ] a , Vector3 [ ] b )
606
+ {
607
+ Assert . AreEqual ( a . Length , b . Length ) ;
608
+ for ( int i = 0 ; i < a . Length ; ++ i )
609
+ AreNearEqual ( a [ i ] , b [ i ] ) ;
610
+ }
611
+
612
+ [ Test ]
613
+ public void TestBlendShapeExport ( )
614
+ {
615
+ // TODO: find more practical test data
616
+ var fbxPaths = new string [ ] {
617
+ "FbxExporters/Editor/UnitTests/Models/blendshape.fbx" ,
618
+ "FbxExporters/Editor/UnitTests/Models/blendshape_with_skinning.fbx"
619
+ } ;
620
+ foreach ( var fbxPath in fbxPaths )
621
+ {
622
+ // add fbx to scene
623
+ GameObject originalFbxObj = AssetDatabase . LoadMainAssetAtPath ( "Assets/" + fbxPath ) as GameObject ;
624
+ Assert . IsNotNull ( originalFbxObj ) ;
625
+ GameObject originalGO = GameObject . Instantiate ( originalFbxObj ) ;
626
+ Assert . IsTrue ( originalGO ) ;
627
+
628
+ // export fbx
629
+ // get GameObject
630
+ string filename = GetRandomFbxFilePath ( ) ;
631
+ ModelExporter . ExportObject ( filename , originalGO ) ;
632
+ GameObject fbxObj = AssetDatabase . LoadMainAssetAtPath ( filename ) as GameObject ;
633
+ Assert . IsTrue ( fbxObj ) ;
634
+
635
+ var originalSMR = originalGO . GetComponentInChildren < SkinnedMeshRenderer > ( ) ;
636
+ var exportedSMR = fbxObj . GetComponentInChildren < SkinnedMeshRenderer > ( ) ;
637
+ Assert . IsNotNull ( originalSMR ) ;
638
+ Assert . IsNotNull ( exportedSMR ) ;
639
+
640
+ var originalMesh = originalSMR . sharedMesh ;
641
+ var exportedMesh = exportedSMR . sharedMesh ;
642
+ Assert . IsNotNull ( originalMesh ) ;
643
+ Assert . IsNotNull ( exportedMesh ) ;
644
+
645
+ // compare blend shape data
646
+ Assert . AreEqual ( originalMesh . blendShapeCount , exportedMesh . blendShapeCount ) ;
647
+ if ( originalMesh . blendShapeCount > 0 )
648
+ {
649
+ var deltaVertices = new Vector3 [ originalMesh . vertexCount ] ;
650
+ var deltaNormals = new Vector3 [ originalMesh . vertexCount ] ;
651
+ var deltaTangents = new Vector3 [ originalMesh . vertexCount ] ;
652
+ var fbxDeltaVertices = new Vector3 [ originalMesh . vertexCount ] ;
653
+ var fbxDeltaNormals = new Vector3 [ originalMesh . vertexCount ] ;
654
+ var fbxDeltaTangents = new Vector3 [ originalMesh . vertexCount ] ;
655
+
656
+ for ( int bi = 0 ; bi < originalMesh . blendShapeCount ; ++ bi )
657
+ {
658
+ Assert . AreEqual ( originalMesh . GetBlendShapeName ( bi ) , exportedMesh . GetBlendShapeName ( bi ) ) ;
659
+ Assert . AreEqual ( originalMesh . GetBlendShapeFrameCount ( bi ) , exportedMesh . GetBlendShapeFrameCount ( bi ) ) ;
660
+
661
+ int frameCount = originalMesh . GetBlendShapeFrameCount ( bi ) ;
662
+ for ( int fi = 0 ; fi < frameCount ; ++ fi )
663
+ {
664
+ Assert . AreEqual ( originalMesh . GetBlendShapeFrameWeight ( bi , fi ) , exportedMesh . GetBlendShapeFrameWeight ( bi , fi ) ) ;
665
+
666
+ originalMesh . GetBlendShapeFrameVertices ( bi , fi , deltaVertices , deltaNormals , deltaTangents ) ;
667
+ exportedMesh . GetBlendShapeFrameVertices ( bi , fi , fbxDeltaVertices , fbxDeltaNormals , fbxDeltaTangents ) ;
668
+ AreNearEqual ( deltaVertices , fbxDeltaVertices ) ;
669
+ AreNearEqual ( deltaNormals , fbxDeltaNormals ) ;
670
+ AreNearEqual ( deltaTangents , fbxDeltaTangents ) ;
671
+
672
+ }
673
+ }
674
+ }
675
+ }
676
+ }
597
677
}
598
678
}
0 commit comments