Skip to content

Commit 3db3bdc

Browse files
author
Benoit Hudson
committed
Review comment: Potentially survive failure in FbxMesh.CreateLayer
CreateLayer theoretically can return -1 on error. The old code would have had an infinite loop if that happened; the new code will throw an exception. We've never seen the -1 return value in the wild.
1 parent 0234d4a commit 3db3bdc

File tree

1 file changed

+15
-6
lines changed

1 file changed

+15
-6
lines changed

Assets/FbxExporters/Editor/FbxExporter.cs

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -145,15 +145,24 @@ public static string GetVersionFromReadme()
145145
/// Get a layer (to store UVs, normals, etc) on the mesh.
146146
/// If it doesn't exist yet, create it.
147147
/// </summary>
148-
///
149148
public static FbxLayer GetOrCreateLayer(FbxMesh fbxMesh, int layer = 0 /* default layer */)
150149
{
151-
FbxLayer fbxLayer = fbxMesh.GetLayer (layer);
152-
while (fbxLayer == null) {
153-
fbxMesh.CreateLayer ();
154-
fbxLayer = fbxMesh.GetLayer (layer);
150+
int maxLayerIndex = fbxMesh.GetLayerCount() - 1;
151+
while (layer > maxLayerIndex) {
152+
// We'll have to create the layer (potentially several).
153+
// Make sure to avoid infinite loops even if there's an
154+
// FbxSdk bug.
155+
int newLayerIndex = fbxMesh.CreateLayer();
156+
if (newLayerIndex <= maxLayerIndex) {
157+
// Error!
158+
throw new System.Exception(
159+
"Internal error: Unable to create mesh layer "
160+
+ (maxLayerIndex + 1)
161+
+ " on mesh " + fbxMesh.GetName());
162+
}
163+
maxLayerIndex = newLayerIndex;
155164
}
156-
return fbxLayer;
165+
return fbxMesh.GetLayer (layer);
157166
}
158167

159168
/// <summary>

0 commit comments

Comments
 (0)