Skip to content

Commit 816a5d1

Browse files
authored
Merge pull request #37 from Unity-Technologies/UNI-20956-export-lightmap-uvs
UNI-20956 export multiple uvs
2 parents c51ec5e + f5ad3aa commit 816a5d1

File tree

1 file changed

+65
-28
lines changed

1 file changed

+65
-28
lines changed

Assets/FbxExporters/Editor/FbxExporter.cs

Lines changed: 65 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -70,16 +70,26 @@ public static ModelExporter Create ()
7070
Dictionary<string, FbxMesh> SharedMeshes = new Dictionary<string, FbxMesh>();
7171

7272
/// <summary>
73-
/// Export the mesh's attributes using layer 0.
73+
/// return layer for mesh
7474
/// </summary>
75-
public void ExportComponentAttributes (MeshInfo mesh, FbxMesh fbxMesh, int[] unmergedTriangles)
75+
///
76+
private FbxLayer GetLayer(FbxMesh fbxMesh, int layer = 0 /* default layer */)
7677
{
77-
// Set the normals on Layer 0.
78-
FbxLayer fbxLayer = fbxMesh.GetLayer (0 /* default layer */);
78+
FbxLayer fbxLayer = fbxMesh.GetLayer (layer);
7979
if (fbxLayer == null) {
8080
fbxMesh.CreateLayer ();
81-
fbxLayer = fbxMesh.GetLayer (0 /* default layer */);
81+
fbxLayer = fbxMesh.GetLayer (layer);
8282
}
83+
return fbxLayer;
84+
}
85+
86+
/// <summary>
87+
/// Export the mesh's attributes using layer 0.
88+
/// </summary>
89+
public void ExportComponentAttributes (MeshInfo mesh, FbxMesh fbxMesh, int[] unmergedTriangles)
90+
{
91+
// Set the normals on Layer 0.
92+
FbxLayer fbxLayer = GetLayer(fbxMesh);
8393

8494
using (var fbxLayerElement = FbxLayerElementNormal.Create (fbxMesh, "Normals")) {
8595
fbxLayerElement.SetMappingMode (FbxLayerElement.EMappingMode.eByPolygonVertex);
@@ -133,29 +143,7 @@ public void ExportComponentAttributes (MeshInfo mesh, FbxMesh fbxMesh, int[] unm
133143
fbxLayer.SetTangents (fbxLayerElement);
134144
}
135145

136-
using (var fbxLayerElement = FbxLayerElementUV.Create (fbxMesh, "UVSet"))
137-
{
138-
fbxLayerElement.SetMappingMode (FbxLayerElement.EMappingMode.eByPolygonVertex);
139-
fbxLayerElement.SetReferenceMode (FbxLayerElement.EReferenceMode.eIndexToDirect);
140-
141-
// set texture coordinates per vertex
142-
FbxLayerElementArray fbxElementArray = fbxLayerElement.GetDirectArray ();
143-
144-
// TODO: only copy unique UVs into this array, and index appropriately
145-
for (int n = 0; n < mesh.UV.Length; n++) {
146-
fbxElementArray.Add (new FbxVector2 (mesh.UV [n] [0],
147-
mesh.UV [n] [1]));
148-
}
149-
150-
// For each face index, point to a texture uv
151-
FbxLayerElementArray fbxIndexArray = fbxLayerElement.GetIndexArray ();
152-
fbxIndexArray.SetCount (unmergedTriangles.Length);
153-
154-
for(int i = 0; i < unmergedTriangles.Length; i++){
155-
fbxIndexArray.SetAt (i, unmergedTriangles [i]);
156-
}
157-
fbxLayer.SetUVs (fbxLayerElement, FbxLayerElement.EType.eTextureDiffuse);
158-
}
146+
ExportUVs (fbxMesh, mesh, unmergedTriangles);
159147

160148
using (var fbxLayerElement = FbxLayerElementVertexColor.Create (fbxMesh, "VertexColors"))
161149
{
@@ -188,6 +176,55 @@ public void ExportComponentAttributes (MeshInfo mesh, FbxMesh fbxMesh, int[] unm
188176
}
189177
}
190178

179+
/// <summary>
180+
/// Unity has up to 4 uv sets per mesh. Export all the ones that exist.
181+
/// </summary>
182+
/// <param name="fbxMesh">Fbx mesh.</param>
183+
/// <param name="mesh">Mesh.</param>
184+
/// <param name="unmergedTriangles">Unmerged triangles.</param>
185+
protected void ExportUVs(FbxMesh fbxMesh, MeshInfo mesh, int[] unmergedTriangles)
186+
{
187+
Vector2[][] uvs = new Vector2[][] {
188+
mesh.UV,
189+
mesh.mesh.uv2,
190+
mesh.mesh.uv3,
191+
mesh.mesh.uv4
192+
};
193+
194+
int k = 0;
195+
for (int i = 0; i < uvs.Length; i++) {
196+
if (uvs [i] == null || uvs [i].Length == 0) {
197+
continue; // don't have these UV's, so skip
198+
}
199+
200+
FbxLayer fbxLayer = GetLayer (fbxMesh, k);
201+
using (var fbxLayerElement = FbxLayerElementUV.Create (fbxMesh, "UVSet" + i))
202+
{
203+
fbxLayerElement.SetMappingMode (FbxLayerElement.EMappingMode.eByPolygonVertex);
204+
fbxLayerElement.SetReferenceMode (FbxLayerElement.EReferenceMode.eIndexToDirect);
205+
206+
// set texture coordinates per vertex
207+
FbxLayerElementArray fbxElementArray = fbxLayerElement.GetDirectArray ();
208+
209+
// TODO: only copy unique UVs into this array, and index appropriately
210+
for (int n = 0; n < uvs[i].Length; n++) {
211+
fbxElementArray.Add (new FbxVector2 (uvs[i] [n] [0],
212+
uvs[i] [n] [1]));
213+
}
214+
215+
// For each face index, point to a texture uv
216+
FbxLayerElementArray fbxIndexArray = fbxLayerElement.GetIndexArray ();
217+
fbxIndexArray.SetCount (unmergedTriangles.Length);
218+
219+
for(int j = 0; j < unmergedTriangles.Length; j++){
220+
fbxIndexArray.SetAt (j, unmergedTriangles [j]);
221+
}
222+
fbxLayer.SetUVs (fbxLayerElement, FbxLayerElement.EType.eTextureDiffuse);
223+
}
224+
k++;
225+
}
226+
}
227+
191228
/// <summary>
192229
/// Takes in a left-handed Vector3, and returns a right-handed FbxVector4.
193230
/// Helper for ExportComponentAttributes()

0 commit comments

Comments
 (0)