Skip to content

Commit d332251

Browse files
committed
fix binormals export error if normals.length != tangents.length
+ add comparison test
1 parent 94a5615 commit d332251

File tree

2 files changed

+65
-13
lines changed

2 files changed

+65
-13
lines changed

Assets/FbxExporters/Editor/FbxExporter.cs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1430,7 +1430,7 @@ public Vector3 [] Binormals {
14301430
var normals = Normals;
14311431
var tangents = Tangents;
14321432

1433-
if (HasValidNormals() && HasValidTangents()) {
1433+
if (HasValidNormals() && HasValidTangents() && normals.Length == tangents.Length) {
14341434
m_Binormals = new Vector3 [normals.Length];
14351435

14361436
for (int i = 0; i < normals.Length; i++)
@@ -1512,19 +1512,22 @@ public MeshInfo (Mesh mesh, Material[] materials)
15121512
}
15131513

15141514
public bool HasValidNormals(){
1515-
return Normals != null && Normals.Length >= 0;
1515+
return Normals != null && Normals.Length > 0;
15161516
}
15171517

15181518
public bool HasValidBinormals(){
1519-
return HasValidNormals () && HasValidTangents () && Binormals != null;
1519+
return HasValidNormals () &&
1520+
HasValidTangents () &&
1521+
Normals.Length == Tangents.Length &&
1522+
Binormals != null;
15201523
}
15211524

15221525
public bool HasValidTangents(){
1523-
return Tangents != null && Tangents.Length >= 0;
1526+
return Tangents != null && Tangents.Length > 0;
15241527
}
15251528

15261529
public bool HasValidVertexColors(){
1527-
return VertexColors != null && VertexColors.Length >= 0;
1530+
return VertexColors != null && VertexColors.Length > 0;
15281531
}
15291532
}
15301533

Assets/FbxExporters/Editor/UnitTests/ModelExporterTest.cs

Lines changed: 57 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -362,13 +362,7 @@ public void TestExportCamera(){
362362
/// <param name="filename">Filename.</param>
363363
/// <param name="cameraObj">Camera object.</param>
364364
private Camera ExportCamera(string filename, GameObject cameraObj){
365-
ModelExporter.ExportObject (filename, cameraObj);
366-
367-
GameObject fbxObj = AssetDatabase.LoadMainAssetAtPath(filename) as GameObject;
368-
var fbxCamera = fbxObj.GetComponent<Camera> ();
369-
370-
Assert.IsNotNull (fbxCamera);
371-
return fbxCamera;
365+
return ExportComponent<Camera> (filename, cameraObj);
372366
}
373367

374368
private void CompareCameraValues(Camera camera, Camera fbxCamera, float delta=0.001f){
@@ -378,6 +372,23 @@ private void CompareCameraValues(Camera camera, Camera fbxCamera, float delta=0.
378372
Assert.AreEqual (camera.farClipPlane, fbxCamera.farClipPlane, delta);
379373
}
380374

375+
/// <summary>
376+
/// Exports the GameObject and returns component of type T.
377+
/// </summary>
378+
/// <returns>The component.</returns>
379+
/// <param name="filename">Filename.</param>
380+
/// <param name="obj">Object.</param>
381+
/// <typeparam name="T">The component type.</typeparam>
382+
private T ExportComponent<T>(string filename, GameObject obj) where T : Component {
383+
ModelExporter.ExportObject (filename, obj);
384+
385+
GameObject fbxObj = AssetDatabase.LoadMainAssetAtPath(filename) as GameObject;
386+
var fbxComponent = fbxObj.GetComponent<T> ();
387+
388+
Assert.IsNotNull (fbxComponent);
389+
return fbxComponent;
390+
}
391+
381392
[Test]
382393
public void TestComponentAttributeExport()
383394
{
@@ -396,17 +407,55 @@ public void TestComponentAttributeExport()
396407

397408
mesh.vertices = quadMesh.vertices;
398409
mesh.triangles = quadMesh.triangles;
410+
mesh.tangents = quadMesh.tangents;
399411
mesh.normals = quadMesh.normals;
400412
mesh.colors = quadMesh.colors;
401413

414+
Assert.IsNotNull (mesh.tangents);
415+
Assert.IsNotNull (mesh.vertices);
416+
Assert.IsNotNull (mesh.triangles);
417+
Assert.IsNotNull (mesh.normals);
418+
Assert.IsNotNull (mesh.colors);
419+
402420
var gameObject = new GameObject ();
403421
var meshFilter = gameObject.AddComponent<MeshFilter> ();
404-
gameObject.AddComponent<MeshRenderer> ();
405422

406423
meshFilter.sharedMesh = mesh;
407424

408425
// don't need quad anymore
409426
Object.DestroyImmediate(quad);
427+
428+
// try exporting default values
429+
string filename = GetRandomFbxFilePath();
430+
var fbxMeshFilter = ExportComponent<MeshFilter> (filename, gameObject);
431+
var fbxMesh = fbxMeshFilter.sharedMesh;
432+
CompareMeshComponentAttributes (mesh, fbxMesh);
433+
434+
// try exporting mesh without vertex colors
435+
mesh.colors = new Color[]{ };
436+
437+
filename = GetRandomFbxFilePath();
438+
fbxMeshFilter = ExportComponent<MeshFilter> (filename, gameObject);
439+
fbxMesh = fbxMeshFilter.sharedMesh;
440+
CompareMeshComponentAttributes (mesh, fbxMesh);
441+
442+
Object.DestroyImmediate (mesh);
443+
}
444+
445+
private void CompareMeshComponentAttributes(Mesh mesh, Mesh fbxMesh)
446+
{
447+
Assert.IsNotNull (fbxMesh);
448+
Assert.IsNotNull (fbxMesh.vertices);
449+
Assert.IsNotNull (fbxMesh.triangles);
450+
Assert.IsNotNull (fbxMesh.normals);
451+
Assert.IsNotNull (fbxMesh.colors);
452+
Assert.IsNotNull (fbxMesh.tangents);
453+
454+
Assert.AreEqual (mesh.vertices, fbxMesh.vertices);
455+
Assert.AreEqual (mesh.triangles, fbxMesh.triangles);
456+
Assert.AreEqual (mesh.normals, fbxMesh.normals);
457+
Assert.AreEqual (mesh.colors, fbxMesh.colors);
458+
Assert.AreEqual (mesh.tangents, fbxMesh.tangents);
410459
}
411460
}
412461
}

0 commit comments

Comments
 (0)