Skip to content

Commit 7d3211c

Browse files
committed
fix existing blendshape test for checking blendshape vertex positions
1 parent 5c4b434 commit 7d3211c

File tree

1 file changed

+44
-11
lines changed

1 file changed

+44
-11
lines changed

com.unity.formats.fbx/Tests/FbxTests/ModelExporterTest.cs

Lines changed: 44 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -568,6 +568,10 @@ private void ExportSkinnedMesh(string fileToExport, out SkinnedMeshRenderer orig
568568
#if UNITY_2019_1_OR_NEWER
569569
importer.optimizeMeshPolygons = false;
570570
importer.optimizeMeshVertices = false;
571+
importer.meshCompression = ModelImporterMeshCompression.Off;
572+
importer.importBlendShapeNormals = ModelImporterNormals.None;
573+
importer.importBlendShapes = true;
574+
importer.weldVertices = true;
571575
#else
572576
importer.optimizeMesh = false;
573577
#endif // UNITY_2019_1_OR_NEWER
@@ -731,21 +735,41 @@ public void TestSkinnedMeshes (string fbxPath) {
731735
Debug.LogWarningFormat ("Compared {0} out of a possible {1} bone weights", comparisonCount, minVertCount);
732736
}
733737

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)
735740
{
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++)
737746
{
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+
}
742764
}
765+
return maxDistance;
743766
}
744767

745-
[Ignore("Blendshapes not working yet")]
746768
[Test, TestCaseSource(typeof(AnimationTestDataClass), "BlendShapeTestCases")]
747769
public void TestBlendShapeExport(string fbxPath)
748770
{
771+
const float epsilon = 0.001f;
772+
749773
fbxPath = FindPathInUnitTests (fbxPath);
750774
Assert.That (fbxPath, Is.Not.Null);
751775

@@ -768,6 +792,8 @@ public void TestBlendShapeExport(string fbxPath)
768792
var fbxDeltaNormals = new Vector3[exportedMesh.vertexCount];
769793
var fbxDeltaTangents = new Vector3[exportedMesh.vertexCount];
770794

795+
Assert.AreEqual(deltaVertices.Length, fbxDeltaVertices.Length);
796+
771797
for (int bi = 0; bi < originalMesh.blendShapeCount; ++bi)
772798
{
773799
Assert.That(originalMesh.GetBlendShapeName(bi), Is.EqualTo(exportedMesh.GetBlendShapeName(bi)));
@@ -781,10 +807,17 @@ public void TestBlendShapeExport(string fbxPath)
781807
originalMesh.GetBlendShapeFrameVertices(bi, fi, deltaVertices, deltaNormals, deltaTangents);
782808
exportedMesh.GetBlendShapeFrameVertices(bi, fi, fbxDeltaVertices, fbxDeltaNormals, fbxDeltaTangents);
783809

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");
788821

789822
}
790823
}

0 commit comments

Comments
 (0)