@@ -541,7 +541,19 @@ private void CompareMeshComponentAttributes(Mesh mesh, Mesh fbxMesh)
541541 Assert . AreEqual ( mesh . tangents , fbxMesh . tangents ) ;
542542 }
543543
544- private string ExportSkinnedMesh ( string fileToExport , out SkinnedMeshRenderer originalSkinnedMesh , out SkinnedMeshRenderer exportedSkinnedMesh ) {
544+ private delegate void SetImportSettings ( ModelImporter importer ) ;
545+ private ( string filename , SkinnedMeshRenderer originalSkinnedMesh , SkinnedMeshRenderer exportedSkinnedMesh ) ExportSkinnedMesh (
546+ string fileToExport ,
547+ SetImportSettings setImportSettings = null )
548+ {
549+ // change import settings of original FBX
550+ if ( setImportSettings != null )
551+ {
552+ var origImporter = AssetImporter . GetAtPath ( fileToExport ) as ModelImporter ;
553+ setImportSettings ( origImporter ) ;
554+ origImporter . SaveAndReimport ( ) ;
555+ }
556+
545557 // add fbx to scene
546558 GameObject originalFbxObj = AssetDatabase . LoadMainAssetAtPath ( fileToExport ) as GameObject ;
547559 Assert . IsNotNull ( originalFbxObj ) ;
@@ -553,39 +565,23 @@ private string ExportSkinnedMesh(string fileToExport, out SkinnedMeshRenderer or
553565 string filename = GetRandomFbxFilePath ( ) ;
554566 ModelExporter . ExportObject ( filename , originalGO ) ;
555567
556- var importer = AssetImporter . GetAtPath ( filename ) as ModelImporter ;
557- #if UNITY_2019_1_OR_NEWER
558- importer . importBlendShapes = true ;
559- importer . optimizeMeshPolygons = false ;
560- importer . optimizeMeshVertices = false ;
561- importer . meshCompression = ModelImporterMeshCompression . Off ;
562- // If either blendshape normals are imported or weldVertices is turned off (or both),
563- // the vertex count between the original and exported meshes does not match.
564- // TODO (UT-3410): investigate why the original and exported blendshape normals split the vertices differently.
565- importer . importBlendShapeNormals = ModelImporterNormals . None ;
566- importer . weldVertices = true ;
567- #else
568- importer . importBlendShapes = true ;
569- importer . optimizeMesh = false ;
570- importer . meshCompression = ModelImporterMeshCompression . Off ;
571- // If either blendshape normals are imported or weldVertices is turned off (or both),
572- // the vertex count between the original and exported meshes does not match.
573- // TODO (UT-3410): investigate why the original and exported blendshape normals split the vertices differently.
574- importer . importBlendShapeNormals = ModelImporterNormals . None ;
575- importer . weldVertices = true ;
576- #endif // UNITY_2019_1_OR_NEWER
577- importer . SaveAndReimport ( ) ;
568+ if ( setImportSettings != null )
569+ {
570+ var importer = AssetImporter . GetAtPath ( filename ) as ModelImporter ;
571+ setImportSettings ( importer ) ;
572+ importer . SaveAndReimport ( ) ;
573+ }
578574
579575 GameObject fbxObj = AssetDatabase . LoadMainAssetAtPath ( filename ) as GameObject ;
580576 Assert . IsTrue ( fbxObj ) ;
581577
582- originalSkinnedMesh = originalGO . GetComponentInChildren < SkinnedMeshRenderer > ( ) ;
578+ var originalSkinnedMesh = originalGO . GetComponentInChildren < SkinnedMeshRenderer > ( ) ;
583579 Assert . IsNotNull ( originalSkinnedMesh ) ;
584580
585- exportedSkinnedMesh = fbxObj . GetComponentInChildren < SkinnedMeshRenderer > ( ) ;
581+ var exportedSkinnedMesh = fbxObj . GetComponentInChildren < SkinnedMeshRenderer > ( ) ;
586582 Assert . IsNotNull ( exportedSkinnedMesh ) ;
587583
588- return filename ;
584+ return ( filename , originalSkinnedMesh , exportedSkinnedMesh ) ;
589585 }
590586
591587 public class SkinnedMeshTestDataClass
@@ -624,7 +620,9 @@ public void TestSkinnedMeshes (string fbxPath) {
624620 Assert . That ( fbxPath , Is . Not . Null ) ;
625621
626622 SkinnedMeshRenderer originalSkinnedMesh , exportedSkinnedMesh ;
627- ExportSkinnedMesh ( fbxPath , out originalSkinnedMesh , out exportedSkinnedMesh ) ;
623+ var exportResult = ExportSkinnedMesh ( fbxPath ) ;
624+ originalSkinnedMesh = exportResult . originalSkinnedMesh ;
625+ exportedSkinnedMesh = exportResult . exportedSkinnedMesh ;
628626
629627 Assert . IsTrue ( originalSkinnedMesh . name == exportedSkinnedMesh . name ||
630628 ( originalSkinnedMesh . transform . parent == null && exportedSkinnedMesh . transform . parent == null ) ) ;
@@ -852,7 +850,38 @@ public void TestBlendShapeExport(string fbxPath)
852850 Assert . That ( fbxPath , Is . Not . Null ) ;
853851
854852 SkinnedMeshRenderer originalSMR , exportedSMR ;
855- var exportedFbxPath = ExportSkinnedMesh ( fbxPath , out originalSMR , out exportedSMR ) ;
853+ SetImportSettings setImportSettings = ( importer ) =>
854+ {
855+ importer . importBlendShapes = true ;
856+ importer . meshCompression = ModelImporterMeshCompression . Off ;
857+
858+ #if UNITY_2019_1_OR_NEWER
859+ importer . optimizeMeshPolygons = false ;
860+ importer . optimizeMeshVertices = false ;
861+ #else
862+ importer . optimizeMesh = false ;
863+ #endif // UNITY_2019_1_OR_NEWER
864+
865+ #if UNITY_2018_4_OR_NEWER
866+ importer . importNormals = ModelImporterNormals . Import ;
867+ importer . importTangents = ModelImporterTangents . CalculateMikk ;
868+ #else
869+ // In 2018.3, the vertices still do not match unless no normals
870+ // are imported.
871+ importer . importNormals = ModelImporterNormals . None ;
872+ #endif
873+ // If either blendshape normals are imported or weldVertices is turned off (or both),
874+ // the vertex count between the original and exported meshes does not match.
875+ // TODO (UT-3410): investigate why the original and exported blendshape normals split the vertices differently.
876+ importer . importBlendShapeNormals = ModelImporterNormals . None ;
877+ importer . weldVertices = true ;
878+ } ;
879+
880+ var exportResult = ExportSkinnedMesh ( fbxPath , setImportSettings ) ;
881+ var exportedFbxPath = exportResult . filename ;
882+ originalSMR = exportResult . originalSkinnedMesh ;
883+ exportedSMR = exportResult . exportedSkinnedMesh ;
884+
856885
857886 var originalMesh = originalSMR . sharedMesh ;
858887 var exportedMesh = exportedSMR . sharedMesh ;
0 commit comments