Skip to content

Commit c897484

Browse files
Add check for invalid tangent data in Maya (#1132)
Added check for avoid exporting invalid tangent data.
1 parent 2413a8a commit c897484

File tree

1 file changed

+35
-15
lines changed

1 file changed

+35
-15
lines changed

Maya/Exporter/BabylonExporter.Mesh.cs

+35-15
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ internal partial class BabylonExporter
1515
private MStringArray allMayaInfluenceNames; // the joint names that influence the mesh (joint with 0 weight included)
1616
private MDoubleArray allMayaInfluenceWeights; // the joint weights for the vertex (0 weight included)
1717
private Dictionary<string, int> indexByNodeName = new Dictionary<string, int>(); // contains the node (joint and parents of the current skin) fullPathName and its index
18-
18+
1919
/// <summary>
2020
///
2121
/// </summary>
@@ -919,15 +919,25 @@ private GlobalVertex ExtractVertex(MFnMesh mFnMesh, int polygonId, int vertexInd
919919
{
920920
MVector tangent = new MVector();
921921
mFnMesh.getFaceVertexTangent(polygonId, vertexIndexGlobal, tangent);
922+
923+
if (tangent.isEquivalent(MVector.zero))
924+
{
925+
isTangentExportSuccess = false;
926+
RaiseWarning($"Mesh has invalid tangent data. Exporter will not export tangets for the mesh {mFnMesh?.name ?? "Unknown"}");
927+
}
928+
else
929+
{
930+
tangent.normalize();
922931

923-
// Switch coordinate system at object level
924-
tangent.z *= -1;
932+
// Switch coordinate system at object level
933+
tangent.z *= -1;
925934

926-
int tangentId = mFnMesh.getTangentId(polygonId, vertexIndexGlobal);
927-
bool isRightHandedTangent = mFnMesh.isRightHandedTangent(tangentId);
935+
int tangentId = mFnMesh.getTangentId(polygonId, vertexIndexGlobal);
936+
bool isRightHandedTangent = mFnMesh.isRightHandedTangent(tangentId);
928937

929-
// Invert W to switch to left handed system
930-
vertex.Tangent = new float[] { (float)tangent.x, (float)tangent.y, (float)tangent.z, isRightHandedTangent ? -1 : 1 };
938+
// Invert W to switch to left handed system
939+
vertex.Tangent = new float[] { (float)tangent.x, (float)tangent.y, (float)tangent.z, isRightHandedTangent ? -1 : 1 };
940+
}
931941
}
932942
catch
933943
{
@@ -1342,14 +1352,24 @@ private IList<BabylonMorphTarget> GetMorphTargets(BabylonMesh babylonMesh, MFnMe
13421352
MVector tangent = new MVector();
13431353
targetMesh.getFaceVertexTangent(vertexData.polygonId, vertexData.vertexIndexGlobal, tangent);
13441354

1345-
// Switch coordinate system at object level
1346-
tangent.z *= -1;
1347-
1348-
int tangentId = targetMesh.getTangentId(vertexData.polygonId, vertexData.vertexIndexGlobal);
1349-
bool isRightHandedTangent = targetMesh.isRightHandedTangent(tangentId);
1350-
1351-
// Invert W to switch to left handed system
1352-
vertex.Tangent = new float[] { (float)tangent.x, (float)tangent.y, (float)tangent.z, isRightHandedTangent ? -1 : 1 };
1355+
if (tangent.isEquivalent(MVector.zero))
1356+
{
1357+
isTangentExportSuccess = false;
1358+
RaiseWarning($"Mesh has invalid tangent data. Exporter will not export tangets for the mesh {mesh?.name ?? "Unknown"}");
1359+
}
1360+
else
1361+
{
1362+
tangent.normalize();
1363+
1364+
// Switch coordinate system at object level
1365+
tangent.z *= -1;
1366+
1367+
int tangentId = targetMesh.getTangentId(vertexData.polygonId, vertexData.vertexIndexGlobal);
1368+
bool isRightHandedTangent = targetMesh.isRightHandedTangent(tangentId);
1369+
1370+
// Invert W to switch to left handed system
1371+
vertex.Tangent = new float[] { (float)tangent.x, (float)tangent.y, (float)tangent.z, isRightHandedTangent ? -1 : 1 };
1372+
}
13531373
}
13541374
catch
13551375
{

0 commit comments

Comments
 (0)