@@ -568,6 +568,10 @@ private void ExportSkinnedMesh(string fileToExport, out SkinnedMeshRenderer orig
568
568
#if UNITY_2019_1_OR_NEWER
569
569
importer . optimizeMeshPolygons = false ;
570
570
importer . optimizeMeshVertices = false ;
571
+ importer . meshCompression = ModelImporterMeshCompression . Off ;
572
+ importer . importBlendShapeNormals = ModelImporterNormals . None ;
573
+ importer . importBlendShapes = true ;
574
+ importer . weldVertices = true ;
571
575
#else
572
576
importer . optimizeMesh = false ;
573
577
#endif // UNITY_2019_1_OR_NEWER
@@ -731,21 +735,41 @@ public void TestSkinnedMeshes (string fbxPath) {
731
735
Debug . LogWarningFormat ( "Compared {0} out of a possible {1} bone weights" , comparisonCount , minVertCount ) ;
732
736
}
733
737
734
- public class Vector3Comparer : IComparer < Vector3 >
738
+ private delegate float GetDistance < T > ( T x , T y ) ;
739
+ private static float ComputeHausdorffDistance < T > ( T [ ] orig , T [ ] converted , GetDistance < T > getDistance )
735
740
{
736
- public int Compare ( Vector3 a , Vector3 b )
741
+ Assert . AreEqual ( orig . Length , converted . Length ) ;
742
+ // Compute the Hausdorff distance to determine if two meshes have the same vertices as
743
+ // we can't rely on the vertex order matching.
744
+ float maxDistance = 0 ;
745
+ for ( int j = 0 ; j < orig . Length ; j ++ )
737
746
{
738
- Assert . That ( a . x , Is . EqualTo ( b . x ) . Within ( 0.00001f ) ) ;
739
- Assert . That ( a . y , Is . EqualTo ( b . y ) . Within ( 0.00001f ) ) ;
740
- Assert . That ( a . z , Is . EqualTo ( b . z ) . Within ( 0.00001f ) ) ;
741
- return 0 ; // we're almost equal
747
+ float minDistance = float . PositiveInfinity ;
748
+ var pos = orig [ j ] ;
749
+ for ( int k = 0 ; k < orig . Length ; k ++ )
750
+ {
751
+ // find closest vertex in convertedMeshes
752
+ var convertedPos = converted [ k ] ;
753
+
754
+ var distance = getDistance ( pos , convertedPos ) ;
755
+ if ( distance < minDistance )
756
+ {
757
+ minDistance = distance ;
758
+ }
759
+ }
760
+ if ( minDistance > maxDistance )
761
+ {
762
+ maxDistance = minDistance ;
763
+ }
742
764
}
765
+ return maxDistance ;
743
766
}
744
767
745
- [ Ignore ( "Blendshapes not working yet" ) ]
746
768
[ Test , TestCaseSource ( typeof ( AnimationTestDataClass ) , "BlendShapeTestCases" ) ]
747
769
public void TestBlendShapeExport ( string fbxPath )
748
770
{
771
+ const float epsilon = 0.001f ;
772
+
749
773
fbxPath = FindPathInUnitTests ( fbxPath ) ;
750
774
Assert . That ( fbxPath , Is . Not . Null ) ;
751
775
@@ -768,6 +792,8 @@ public void TestBlendShapeExport(string fbxPath)
768
792
var fbxDeltaNormals = new Vector3 [ exportedMesh . vertexCount ] ;
769
793
var fbxDeltaTangents = new Vector3 [ exportedMesh . vertexCount ] ;
770
794
795
+ Assert . AreEqual ( deltaVertices . Length , fbxDeltaVertices . Length ) ;
796
+
771
797
for ( int bi = 0 ; bi < originalMesh . blendShapeCount ; ++ bi )
772
798
{
773
799
Assert . That ( originalMesh . GetBlendShapeName ( bi ) , Is . EqualTo ( exportedMesh . GetBlendShapeName ( bi ) ) ) ;
@@ -781,10 +807,17 @@ public void TestBlendShapeExport(string fbxPath)
781
807
originalMesh . GetBlendShapeFrameVertices ( bi , fi , deltaVertices , deltaNormals , deltaTangents ) ;
782
808
exportedMesh . GetBlendShapeFrameVertices ( bi , fi , fbxDeltaVertices , fbxDeltaNormals , fbxDeltaTangents ) ;
783
809
784
- var v3comparer = new Vector3Comparer ( ) ;
785
- Assert . That ( deltaVertices , Is . EqualTo ( fbxDeltaVertices ) . Using < Vector3 > ( v3comparer ) , string . Format ( "delta vertices don't match" ) ) ;
786
- Assert . That ( deltaNormals , Is . EqualTo ( fbxDeltaNormals ) . Using < Vector3 > ( v3comparer ) , string . Format ( "delta normals don't match" ) ) ;
787
- Assert . That ( deltaTangents , Is . EqualTo ( fbxDeltaTangents ) . Using < Vector3 > ( v3comparer ) , string . Format ( "delta tangents don't match" ) ) ;
810
+ var worldVertices = new Vector3 [ originalSMR . sharedMesh . vertices . Length ] ;
811
+ var exportedWorldVertices = new Vector3 [ exportedSMR . sharedMesh . vertices . Length ] ;
812
+ for ( int k = 0 ; k < worldVertices . Length ; k ++ )
813
+ {
814
+ worldVertices [ k ] = originalSMR . transform . TransformPoint ( originalMesh . vertices [ k ] + deltaVertices [ k ] ) ;
815
+ exportedWorldVertices [ k ] = exportedSMR . transform . TransformPoint ( exportedMesh . vertices [ k ] + fbxDeltaVertices [ k ] ) ;
816
+ }
817
+ // Compute the Hausdorff distance to determine if two meshes have the same vertices as
818
+ // we can't rely on the vertex order matching.
819
+ var hausdorffDistance = ComputeHausdorffDistance < Vector3 > ( worldVertices , exportedWorldVertices , ( Vector3 a , Vector3 b ) => Vector3 . Distance ( a , b ) ) ;
820
+ Assert . That ( hausdorffDistance , Is . LessThan ( epsilon ) , "Maximum distance between two vertices greater than epsilon" ) ;
788
821
789
822
}
790
823
}
0 commit comments