Skip to content

Commit d0cccbe

Browse files
committed
handle missing normals, binormals, tangents, vertex colors
* check that arrays are not null, not empty, and are the same length as the unmerged triangles array
1 parent cd0309f commit d0cccbe

File tree

1 file changed

+77
-68
lines changed

1 file changed

+77
-68
lines changed

Assets/FbxExporters/Editor/FbxExporter.cs

Lines changed: 77 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -174,88 +174,93 @@ void ExportComponentAttributes (MeshInfo mesh, FbxMesh fbxMesh, int[] unmergedTr
174174
// Set the normals on Layer 0.
175175
FbxLayer fbxLayer = GetOrCreateLayer(fbxMesh);
176176

177-
using (var fbxLayerElement = FbxLayerElementNormal.Create (fbxMesh, "Normals")) {
178-
fbxLayerElement.SetMappingMode (FbxLayerElement.EMappingMode.eByPolygonVertex);
179-
fbxLayerElement.SetReferenceMode (FbxLayerElement.EReferenceMode.eDirect);
177+
if (mesh.Normals != null && mesh.Normals.Length > 0 && mesh.Normals.Length == unmergedTriangles.Length) {
178+
using (var fbxLayerElement = FbxLayerElementNormal.Create (fbxMesh, "Normals")) {
179+
fbxLayerElement.SetMappingMode (FbxLayerElement.EMappingMode.eByPolygonVertex);
180+
fbxLayerElement.SetReferenceMode (FbxLayerElement.EReferenceMode.eDirect);
180181

181-
// Add one normal per each vertex face index (3 per triangle)
182-
FbxLayerElementArray fbxElementArray = fbxLayerElement.GetDirectArray ();
182+
// Add one normal per each vertex face index (3 per triangle)
183+
FbxLayerElementArray fbxElementArray = fbxLayerElement.GetDirectArray ();
183184

184-
for (int n = 0; n < unmergedTriangles.Length; n++) {
185-
int unityTriangle = unmergedTriangles [n];
186-
fbxElementArray.Add (ConvertNormalToRightHanded (mesh.Normals [unityTriangle]));
187-
}
185+
for (int n = 0; n < unmergedTriangles.Length; n++) {
186+
int unityTriangle = unmergedTriangles [n];
187+
fbxElementArray.Add (ConvertNormalToRightHanded (mesh.Normals [unityTriangle]));
188+
}
188189

189-
fbxLayer.SetNormals (fbxLayerElement);
190+
fbxLayer.SetNormals (fbxLayerElement);
191+
}
190192
}
191193

192-
/// Set the binormals on Layer 0.
193-
using (var fbxLayerElement = FbxLayerElementBinormal.Create (fbxMesh, "Binormals"))
194-
{
195-
fbxLayerElement.SetMappingMode (FbxLayerElement.EMappingMode.eByPolygonVertex);
196-
fbxLayerElement.SetReferenceMode (FbxLayerElement.EReferenceMode.eDirect);
194+
/// Set the binormals on Layer 0.
195+
if (mesh.Binormals != null && mesh.Binormals.Length > 0 && mesh.Binormals.Length == unmergedTriangles.Length) {
196+
using (var fbxLayerElement = FbxLayerElementBinormal.Create (fbxMesh, "Binormals")) {
197+
fbxLayerElement.SetMappingMode (FbxLayerElement.EMappingMode.eByPolygonVertex);
198+
fbxLayerElement.SetReferenceMode (FbxLayerElement.EReferenceMode.eDirect);
197199

198-
// Add one normal per each vertex face index (3 per triangle)
199-
FbxLayerElementArray fbxElementArray = fbxLayerElement.GetDirectArray ();
200+
// Add one normal per each vertex face index (3 per triangle)
201+
FbxLayerElementArray fbxElementArray = fbxLayerElement.GetDirectArray ();
200202

201-
for (int n = 0; n < unmergedTriangles.Length; n++) {
202-
int unityTriangle = unmergedTriangles [n];
203-
fbxElementArray.Add (ConvertNormalToRightHanded (mesh.Binormals [unityTriangle]));
203+
for (int n = 0; n < unmergedTriangles.Length; n++) {
204+
int unityTriangle = unmergedTriangles [n];
205+
fbxElementArray.Add (ConvertNormalToRightHanded (mesh.Binormals [unityTriangle]));
206+
}
207+
fbxLayer.SetBinormals (fbxLayerElement);
204208
}
205-
fbxLayer.SetBinormals (fbxLayerElement);
206209
}
207210

208211
/// Set the tangents on Layer 0.
209-
using (var fbxLayerElement = FbxLayerElementTangent.Create (fbxMesh, "Tangents"))
210-
{
211-
fbxLayerElement.SetMappingMode (FbxLayerElement.EMappingMode.eByPolygonVertex);
212-
fbxLayerElement.SetReferenceMode (FbxLayerElement.EReferenceMode.eDirect);
213-
214-
// Add one normal per each vertex face index (3 per triangle)
215-
FbxLayerElementArray fbxElementArray = fbxLayerElement.GetDirectArray ();
216-
217-
for (int n = 0; n < unmergedTriangles.Length; n++) {
218-
int unityTriangle = unmergedTriangles [n];
219-
fbxElementArray.Add (ConvertNormalToRightHanded(
220-
new Vector3(
221-
mesh.Tangents[unityTriangle][0],
222-
mesh.Tangents[unityTriangle][1],
223-
mesh.Tangents[unityTriangle][2]
224-
)));
212+
if (mesh.Tangents != null && mesh.Tangents.Length > 0 && mesh.Tangents.Length == unmergedTriangles.Length) {
213+
using (var fbxLayerElement = FbxLayerElementTangent.Create (fbxMesh, "Tangents")) {
214+
fbxLayerElement.SetMappingMode (FbxLayerElement.EMappingMode.eByPolygonVertex);
215+
fbxLayerElement.SetReferenceMode (FbxLayerElement.EReferenceMode.eDirect);
216+
217+
// Add one normal per each vertex face index (3 per triangle)
218+
FbxLayerElementArray fbxElementArray = fbxLayerElement.GetDirectArray ();
219+
220+
for (int n = 0; n < unmergedTriangles.Length; n++) {
221+
int unityTriangle = unmergedTriangles [n];
222+
fbxElementArray.Add (ConvertNormalToRightHanded (
223+
new Vector3 (
224+
mesh.Tangents [unityTriangle] [0],
225+
mesh.Tangents [unityTriangle] [1],
226+
mesh.Tangents [unityTriangle] [2]
227+
)));
228+
}
229+
fbxLayer.SetTangents (fbxLayerElement);
225230
}
226-
fbxLayer.SetTangents (fbxLayerElement);
227231
}
228232

229233
ExportUVs (fbxMesh, mesh, unmergedTriangles);
230234

231-
using (var fbxLayerElement = FbxLayerElementVertexColor.Create (fbxMesh, "VertexColors"))
232-
{
233-
fbxLayerElement.SetMappingMode (FbxLayerElement.EMappingMode.eByPolygonVertex);
234-
fbxLayerElement.SetReferenceMode (FbxLayerElement.EReferenceMode.eIndexToDirect);
235-
236-
// set texture coordinates per vertex
237-
FbxLayerElementArray fbxElementArray = fbxLayerElement.GetDirectArray ();
238-
239-
// (Uni-31596) only copy unique UVs into this array, and index appropriately
240-
for (int n = 0; n < mesh.VertexColors.Length; n++) {
241-
// Converting to Color from Color32, as Color32 stores the colors
242-
// as ints between 0-255, while FbxColor and Color
243-
// use doubles between 0-1
244-
Color color = mesh.VertexColors [n];
245-
fbxElementArray.Add (new FbxColor (color.r,
246-
color.g,
247-
color.b,
248-
color.a));
249-
}
235+
if (mesh.VertexColors != null && mesh.VertexColors.Length > 0) {
236+
using (var fbxLayerElement = FbxLayerElementVertexColor.Create (fbxMesh, "VertexColors")) {
237+
fbxLayerElement.SetMappingMode (FbxLayerElement.EMappingMode.eByPolygonVertex);
238+
fbxLayerElement.SetReferenceMode (FbxLayerElement.EReferenceMode.eIndexToDirect);
239+
240+
// set texture coordinates per vertex
241+
FbxLayerElementArray fbxElementArray = fbxLayerElement.GetDirectArray ();
250242

251-
// For each face index, point to a texture uv
252-
FbxLayerElementArray fbxIndexArray = fbxLayerElement.GetIndexArray ();
253-
fbxIndexArray.SetCount (unmergedTriangles.Length);
243+
// (Uni-31596) only copy unique UVs into this array, and index appropriately
244+
for (int n = 0; n < mesh.VertexColors.Length; n++) {
245+
// Converting to Color from Color32, as Color32 stores the colors
246+
// as ints between 0-255, while FbxColor and Color
247+
// use doubles between 0-1
248+
Color color = mesh.VertexColors [n];
249+
fbxElementArray.Add (new FbxColor (color.r,
250+
color.g,
251+
color.b,
252+
color.a));
253+
}
254254

255-
for(int i = 0; i < unmergedTriangles.Length; i++){
256-
fbxIndexArray.SetAt (i, unmergedTriangles [i]);
255+
// For each face index, point to a texture uv
256+
FbxLayerElementArray fbxIndexArray = fbxLayerElement.GetIndexArray ();
257+
fbxIndexArray.SetCount (unmergedTriangles.Length);
258+
259+
for (int i = 0; i < unmergedTriangles.Length; i++) {
260+
fbxIndexArray.SetAt (i, unmergedTriangles [i]);
261+
}
262+
fbxLayer.SetVertexColors (fbxLayerElement);
257263
}
258-
fbxLayer.SetVertexColors (fbxLayerElement);
259264
}
260265
}
261266

@@ -1257,13 +1262,17 @@ public Vector3 [] Binormals {
12571262
var normals = Normals;
12581263
var tangents = Tangents;
12591264

1260-
m_Binormals = new Vector3 [normals.Length];
1265+
if (normals != null && normals.Length > 0 &&
1266+
tangents != null && tangents.Length > 0 &&
1267+
normals.Length == tangents.Length
1268+
) {
1269+
m_Binormals = new Vector3 [normals.Length];
12611270

1262-
for (int i = 0; i < normals.Length; i++)
1263-
m_Binormals [i] = Vector3.Cross (normals [i],
1264-
tangents [i])
1271+
for (int i = 0; i < normals.Length; i++)
1272+
m_Binormals [i] = Vector3.Cross (normals [i],
1273+
tangents [i])
12651274
* tangents [i].w;
1266-
1275+
}
12671276
}
12681277
return m_Binormals;
12691278
}

0 commit comments

Comments
 (0)