diff --git a/code/AssetLib/FBX/FBXExporter.cpp b/code/AssetLib/FBX/FBXExporter.cpp index 08e81bb3f..ca0c992d4 100644 --- a/code/AssetLib/FBX/FBXExporter.cpp +++ b/code/AssetLib/FBX/FBXExporter.cpp @@ -1244,38 +1244,42 @@ void FBXExporter::WriteObjects () { FBX::Node::WritePropertyNode("PolygonVertexIndex", polygon_data, outstream, binary, indent); FBX::Node::WritePropertyNode("GeometryVersion", int32_t(124), outstream, binary, indent); - FBX::Node normals("LayerElementNormal", int32_t(0)); - normals.Begin(outstream, binary, indent); - normals.DumpProperties(outstream, binary, indent); - normals.EndProperties(outstream, binary, indent); - normals.BeginChildren(outstream, binary, indent); - indent = 3; - FBX::Node::WritePropertyNode("Version", int32_t(101),outstream,binary,indent); - FBX::Node::WritePropertyNode("Name", "",outstream,binary,indent); - FBX::Node::WritePropertyNode("MappingInformationType", "ByPolygonVertex",outstream,binary,indent); - FBX::Node::WritePropertyNode("ReferenceInformationType", "Direct",outstream,binary,indent); - FBX::Node::WritePropertyNode("Normals", normal_data,outstream,binary,indent); - // note: version 102 has a NormalsW also... not sure what it is, - // so stick with version 101 for now. - indent = 2; - normals.End(outstream,binary,indent,true); + if (!normal_data.empty()) { + FBX::Node normals("LayerElementNormal", int32_t(0)); + normals.Begin(outstream, binary, indent); + normals.DumpProperties(outstream, binary, indent); + normals.EndProperties(outstream, binary, indent); + normals.BeginChildren(outstream, binary, indent); + indent = 3; + FBX::Node::WritePropertyNode("Version", int32_t(101), outstream, binary, indent); + FBX::Node::WritePropertyNode("Name", "", outstream, binary, indent); + FBX::Node::WritePropertyNode("MappingInformationType", "ByPolygonVertex", outstream, binary, indent); + FBX::Node::WritePropertyNode("ReferenceInformationType", "Direct", outstream, binary, indent); + FBX::Node::WritePropertyNode("Normals", normal_data, outstream, binary, indent); + // note: version 102 has a NormalsW also... not sure what it is, + // so stick with version 101 for now. + indent = 2; + normals.End(outstream, binary, indent, true); + } - const auto colorChannelIndex = 0; - FBX::Node vertexcolors("LayerElementColor", int32_t(colorChannelIndex)); - vertexcolors.Begin(outstream, binary, indent); - vertexcolors.DumpProperties(outstream, binary, indent); - vertexcolors.EndProperties(outstream, binary, indent); - vertexcolors.BeginChildren(outstream, binary, indent); - indent = 3; - FBX::Node::WritePropertyNode("Version", int32_t(101), outstream, binary, indent); - char layerName[8]; - snprintf(layerName, sizeof(layerName), "COLOR_%d", colorChannelIndex); - FBX::Node::WritePropertyNode("Name", (const char *)layerName, outstream, binary, indent); - FBX::Node::WritePropertyNode("MappingInformationType", "ByPolygonVertex", outstream, binary, indent); - FBX::Node::WritePropertyNode("ReferenceInformationType", "Direct", outstream, binary, indent); - FBX::Node::WritePropertyNode("Colors", color_data, outstream, binary, indent); - indent = 2; - vertexcolors.End(outstream, binary, indent, true); + if (!color_data.empty()) { + const auto colorChannelIndex = 0; + FBX::Node vertexcolors("LayerElementColor", int32_t(colorChannelIndex)); + vertexcolors.Begin(outstream, binary, indent); + vertexcolors.DumpProperties(outstream, binary, indent); + vertexcolors.EndProperties(outstream, binary, indent); + vertexcolors.BeginChildren(outstream, binary, indent); + indent = 3; + FBX::Node::WritePropertyNode("Version", int32_t(101), outstream, binary, indent); + char layerName[8]; + snprintf(layerName, sizeof(layerName), "COLOR_%d", colorChannelIndex); + FBX::Node::WritePropertyNode("Name", (const char *)layerName, outstream, binary, indent); + FBX::Node::WritePropertyNode("MappingInformationType", "ByPolygonVertex", outstream, binary, indent); + FBX::Node::WritePropertyNode("ReferenceInformationType", "Direct", outstream, binary, indent); + FBX::Node::WritePropertyNode("Colors", color_data, outstream, binary, indent); + indent = 2; + vertexcolors.End(outstream, binary, indent, true); + } for (uint32_t uvi = 0; uvi < uv_data.size(); uvi++) { FBX::Node uv("LayerElementUV", int32_t(uvi)); @@ -1327,15 +1331,21 @@ void FBXExporter::WriteObjects () { // TODO: handle multiple uv sets correctly? FBX::Node layer("Layer", int32_t(0)); layer.AddChild("Version", int32_t(100)); - FBX::Node le("LayerElement"); - le.AddChild("Type", "LayerElementNormal"); - le.AddChild("TypedIndex", int32_t(0)); - layer.AddChild(le); + FBX::Node le; - le = FBX::Node("LayerElement"); - le.AddChild("Type", "LayerElementColor"); - le.AddChild("TypedIndex", int32_t(0)); - layer.AddChild(le); + if (normal_data.size()) { + le = FBX::Node("LayerElement"); + le.AddChild("Type", "LayerElementNormal"); + le.AddChild("TypedIndex", int32_t(0)); + layer.AddChild(le); + } + + if (color_data.size()) { + le = FBX::Node("LayerElement"); + le.AddChild("Type", "LayerElementColor"); + le.AddChild("TypedIndex", int32_t(0)); + layer.AddChild(le); + } le = FBX::Node("LayerElement"); le.AddChild("Type", "LayerElementMaterial");