Skip to content

Commit fad7a88

Browse files
committed
export multiple uvs
1 parent 8815d2c commit fad7a88

File tree

1 file changed

+68
-28
lines changed

1 file changed

+68
-28
lines changed

Assets/FbxExporters/Editor/FbxExporter.cs

Lines changed: 68 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -65,16 +65,29 @@ public static ModelExporter Create ()
6565
Dictionary<string, FbxTexture> TextureMap = new Dictionary<string, FbxTexture> ();
6666

6767
/// <summary>
68-
/// Export the mesh's attributes using layer 0.
6968
/// </summary>
70-
public void ExportComponentAttributes (MeshInfo mesh, FbxMesh fbxMesh, int[] unmergedTriangles)
69+
70+
/// <summary>
71+
/// return layer for mesh
72+
/// </summary>
73+
///
74+
private FbxLayer GetLayer(FbxMesh fbxMesh, int layer = 0 /* default layer */)
7175
{
72-
// Set the normals on Layer 0.
73-
FbxLayer fbxLayer = fbxMesh.GetLayer (0 /* default layer */);
76+
FbxLayer fbxLayer = fbxMesh.GetLayer (layer);
7477
if (fbxLayer == null) {
7578
fbxMesh.CreateLayer ();
76-
fbxLayer = fbxMesh.GetLayer (0 /* default layer */);
79+
fbxLayer = fbxMesh.GetLayer (layer);
7780
}
81+
return fbxLayer;
82+
}
83+
84+
/// <summary>
85+
/// Export the mesh's attributes using layer 0.
86+
/// </summary>
87+
public void ExportComponentAttributes (MeshInfo mesh, FbxMesh fbxMesh, int[] unmergedTriangles)
88+
{
89+
// Set the normals on Layer 0.
90+
FbxLayer fbxLayer = GetLayer(fbxMesh);
7891

7992
using (var fbxLayerElement = FbxLayerElementNormal.Create (fbxMesh, "Normals")) {
8093
fbxLayerElement.SetMappingMode (FbxLayerElement.EMappingMode.eByPolygonVertex);
@@ -128,29 +141,7 @@ public void ExportComponentAttributes (MeshInfo mesh, FbxMesh fbxMesh, int[] unm
128141
fbxLayer.SetTangents (fbxLayerElement);
129142
}
130143

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

155146
using (var fbxLayerElement = FbxLayerElementVertexColor.Create (fbxMesh, "VertexColors"))
156147
{
@@ -183,6 +174,55 @@ public void ExportComponentAttributes (MeshInfo mesh, FbxMesh fbxMesh, int[] unm
183174
}
184175
}
185176

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

0 commit comments

Comments
 (0)