Skip to content

Commit 5698190

Browse files
committed
add blend shape support
1 parent 52a5771 commit 5698190

File tree

1 file changed

+83
-0
lines changed

1 file changed

+83
-0
lines changed

Assets/FbxExporters/Editor/FbxExporter.cs

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -426,6 +426,86 @@ private static bool ExportUVs(FbxMesh fbxMesh, MeshInfo mesh, int[] unmergedTria
426426
return k > 0;
427427
}
428428

429+
/// <summary>
430+
/// Export the mesh's blend shapes.
431+
/// </summary>
432+
private bool ExportBlendShapes(MeshInfo mesh, FbxMesh fbxMesh, FbxScene fbxScene, int[] unmergedTriangles)
433+
{
434+
var umesh = mesh.mesh;
435+
if (umesh.blendShapeCount == 0)
436+
return false;
437+
438+
var fbxBlendShape = FbxBlendShape.Create(fbxScene, umesh.name + "_BlendShape");
439+
fbxMesh.AddDeformer(fbxBlendShape);
440+
441+
var numVertices = umesh.vertexCount;
442+
var basePoints = umesh.vertices;
443+
var baseNormals = umesh.normals;
444+
var baseTangents = umesh.tangents;
445+
var deltaPoints = new Vector3[numVertices];
446+
var deltaNormals = new Vector3[numVertices];
447+
var deltaTangents = new Vector3[numVertices];
448+
449+
for (int bi = 0; bi < umesh.blendShapeCount; ++bi)
450+
{
451+
var bsName = umesh.GetBlendShapeName(bi);
452+
var numFrames = umesh.GetBlendShapeFrameCount(bi);
453+
var fbxChannel = FbxBlendShapeChannel.Create(fbxScene, bsName);
454+
fbxBlendShape.AddBlendShapeChannel(fbxChannel);
455+
456+
for (int fi = 0; fi < numFrames; ++fi)
457+
{
458+
var weight = umesh.GetBlendShapeFrameWeight(bi, fi);
459+
umesh.GetBlendShapeFrameVertices(bi, fi, deltaPoints, deltaNormals, deltaTangents);
460+
461+
var fbxShape = FbxShape.Create(fbxScene, "");
462+
fbxChannel.AddTargetShape(fbxShape, weight);
463+
464+
// control points
465+
fbxShape.InitControlPoints(ControlPointToIndex.Count());
466+
for (int vi = 0; vi < numVertices; ++vi)
467+
{
468+
int ni = ControlPointToIndex[basePoints[vi]];
469+
var v = basePoints[vi] + deltaPoints[vi];
470+
fbxShape.SetControlPointAt(ConvertToRightHanded(v, UnitScaleFactor), ni);
471+
}
472+
473+
// normals
474+
if (mesh.HasValidNormals())
475+
{
476+
var elemNormals = fbxShape.CreateElementNormal();
477+
elemNormals.SetMappingMode(FbxLayerElement.EMappingMode.eByPolygonVertex);
478+
elemNormals.SetReferenceMode(FbxLayerElement.EReferenceMode.eDirect);
479+
var dstNormals = elemNormals.GetDirectArray();
480+
dstNormals.SetCount(unmergedTriangles.Length);
481+
for (int ii = 0; ii < unmergedTriangles.Length; ++ii)
482+
{
483+
int vi = unmergedTriangles[ii];
484+
var n = baseNormals[vi] + deltaNormals[vi];
485+
dstNormals.SetAt(ii, ConvertToRightHanded(n));
486+
}
487+
}
488+
489+
// tangents
490+
if (mesh.HasValidTangents())
491+
{
492+
var elemTangents = fbxShape.CreateElementTangent();
493+
elemTangents.SetMappingMode(FbxLayerElement.EMappingMode.eByPolygonVertex);
494+
elemTangents.SetReferenceMode(FbxLayerElement.EReferenceMode.eDirect);
495+
var dstTangents = elemTangents.GetDirectArray();
496+
dstTangents.SetCount(unmergedTriangles.Length);
497+
for (int ii = 0; ii < unmergedTriangles.Length; ++ii)
498+
{
499+
int vi = unmergedTriangles[ii];
500+
var t = (Vector3)baseTangents[vi] + deltaTangents[vi];
501+
dstTangents.SetAt(ii, ConvertToRightHanded(t));
502+
}
503+
}
504+
}
505+
}
506+
return true;
507+
}
508+
429509
/// <summary>
430510
/// Takes in a left-handed UnityEngine.Vector3 denoting a normal,
431511
/// returns a right-handed FbxVector4.
@@ -754,6 +834,9 @@ bool ExportMesh (MeshInfo meshInfo, FbxNode fbxNode)
754834
// Set up normals, etc.
755835
ExportComponentAttributes (meshInfo, fbxMesh, unmergedPolygons.ToArray());
756836

837+
// Set up blend shapes.
838+
ExportBlendShapes(meshInfo, fbxMesh, fbxScene, unmergedPolygons.ToArray());
839+
757840
// set the fbxNode containing the mesh
758841
fbxNode.SetNodeAttribute (fbxMesh);
759842
fbxNode.SetShadingMode (FbxNode.EShadingMode.eWireFrame);

0 commit comments

Comments
 (0)