Skip to content

Commit f8a7dc7

Browse files
committed
add test to check that exported FbxShapes have non empty names
1 parent 7d3211c commit f8a7dc7

File tree

1 file changed

+85
-2
lines changed

1 file changed

+85
-2
lines changed

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

Lines changed: 85 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -552,7 +552,7 @@ private void CompareMeshComponentAttributes(Mesh mesh, Mesh fbxMesh)
552552
Assert.AreEqual (mesh.tangents, fbxMesh.tangents);
553553
}
554554

555-
private void ExportSkinnedMesh(string fileToExport, out SkinnedMeshRenderer originalSkinnedMesh, out SkinnedMeshRenderer exportedSkinnedMesh){
555+
private string ExportSkinnedMesh(string fileToExport, out SkinnedMeshRenderer originalSkinnedMesh, out SkinnedMeshRenderer exportedSkinnedMesh){
556556
// add fbx to scene
557557
GameObject originalFbxObj = AssetDatabase.LoadMainAssetAtPath(fileToExport) as GameObject;
558558
Assert.IsNotNull (originalFbxObj);
@@ -585,6 +585,8 @@ private void ExportSkinnedMesh(string fileToExport, out SkinnedMeshRenderer orig
585585

586586
exportedSkinnedMesh = fbxObj.GetComponentInChildren<SkinnedMeshRenderer> ();
587587
Assert.IsNotNull (exportedSkinnedMesh);
588+
589+
return filename;
588590
}
589591

590592
public class SkinnedMeshTestDataClass
@@ -765,6 +767,85 @@ private static float ComputeHausdorffDistance<T>(T[] orig, T[] converted, GetDis
765767
return maxDistance;
766768
}
767769

770+
private void TestFbxShapeNamesNotEmpty(FbxNode node)
771+
{
772+
var mesh = node.GetMesh();
773+
if (mesh != null)
774+
{
775+
for (int i = 0; i < mesh.GetDeformerCount(); i++)
776+
{
777+
var blendshape = mesh.GetBlendShapeDeformer(i);
778+
if (blendshape == null)
779+
{
780+
continue;
781+
}
782+
783+
for(int j = 0; j < blendshape.GetBlendShapeChannelCount(); j++)
784+
{
785+
var blendShapeChannel = blendshape.GetBlendShapeChannel(j);
786+
for (int k = 0; k < blendShapeChannel.GetTargetShapeCount(); k++)
787+
{
788+
var shape = blendShapeChannel.GetTargetShape(k);
789+
Assert.That(string.IsNullOrEmpty(shape.GetName()), Is.False, string.Format("FbxShape missing name on blendshape {0}", blendshape.GetName()));
790+
}
791+
}
792+
}
793+
}
794+
795+
for (int i = 0; i < node.GetChildCount(); i++)
796+
{
797+
TestFbxShapeNamesNotEmpty(node.GetChild(i));
798+
}
799+
}
800+
801+
private void FbxImportAndTestBlendshapes(string fbxPath)
802+
{
803+
// Create the FBX manager
804+
using (var fbxManager = FbxManager.Create())
805+
{
806+
FbxIOSettings fbxIOSettings = FbxIOSettings.Create(fbxManager, Globals.IOSROOT);
807+
808+
// Configure the IO settings.
809+
fbxManager.SetIOSettings(fbxIOSettings);
810+
811+
// Create the importer
812+
var fbxImporter = FbxImporter.Create(fbxManager, "Importer");
813+
814+
// Initialize the importer.
815+
int fileFormat = -1;
816+
817+
bool status = fbxImporter.Initialize(fbxPath, fileFormat, fbxIOSettings);
818+
FbxStatus fbxStatus = fbxImporter.GetStatus();
819+
820+
Assert.That(status, Is.True, fbxStatus.GetErrorString());
821+
Assert.That(fbxImporter.IsFBX(), "file does not contain FBX data");
822+
823+
// Import options. Determine what kind of data is to be imported.
824+
// The default is true, but here we set the options explictly.
825+
fbxIOSettings.SetBoolProp(Globals.IMP_FBX_MATERIAL, false);
826+
fbxIOSettings.SetBoolProp(Globals.IMP_FBX_TEXTURE, false);
827+
fbxIOSettings.SetBoolProp(Globals.IMP_FBX_ANIMATION, false);
828+
fbxIOSettings.SetBoolProp(Globals.IMP_FBX_EXTRACT_EMBEDDED_DATA, false);
829+
fbxIOSettings.SetBoolProp(Globals.IMP_FBX_GLOBAL_SETTINGS, true);
830+
831+
// Create a scene
832+
var fbxScene = FbxScene.Create(fbxManager, "Scene");
833+
834+
// Import the scene to the file.
835+
status = fbxImporter.Import(fbxScene);
836+
fbxStatus = fbxImporter.GetStatus();
837+
Assert.That(status, Is.True, fbxStatus.GetErrorString());
838+
839+
// Get blendshapes and check that the FbxShapes all have names
840+
var rootNode = fbxScene.GetRootNode();
841+
TestFbxShapeNamesNotEmpty(rootNode);
842+
843+
// cleanup
844+
fbxScene.Destroy();
845+
fbxImporter.Destroy();
846+
}
847+
}
848+
768849
[Test, TestCaseSource(typeof(AnimationTestDataClass), "BlendShapeTestCases")]
769850
public void TestBlendShapeExport(string fbxPath)
770851
{
@@ -774,7 +855,7 @@ public void TestBlendShapeExport(string fbxPath)
774855
Assert.That (fbxPath, Is.Not.Null);
775856

776857
SkinnedMeshRenderer originalSMR, exportedSMR;
777-
ExportSkinnedMesh (fbxPath, out originalSMR, out exportedSMR);
858+
var exportedFbxPath = ExportSkinnedMesh (fbxPath, out originalSMR, out exportedSMR);
778859

779860
var originalMesh = originalSMR.sharedMesh;
780861
var exportedMesh = exportedSMR.sharedMesh;
@@ -822,6 +903,8 @@ public void TestBlendShapeExport(string fbxPath)
822903
}
823904
}
824905
}
906+
907+
FbxImportAndTestBlendshapes(exportedFbxPath);
825908
}
826909

827910
[Test]

0 commit comments

Comments
 (0)