Utility/OBJSaver: Handle case where normal and/or texcoords are not present

This commit is contained in:
Lynix 2022-01-21 14:57:07 +01:00
parent b917738ed4
commit 213c7d8a1e
2 changed files with 44 additions and 30 deletions

View File

@ -537,38 +537,44 @@ namespace Nz
} }
EmitLine(); EmitLine();
Emit("# normal count: "); if (!m_normals.empty())
EmitLine(m_normals.size());
for (const Nz::Vector3f& normal : m_normals)
{ {
Emit("vn "); Emit("# normal count: ");
Emit(normal.x); EmitLine(m_normals.size());
Emit(' ');
Emit(normal.y);
Emit(' ');
Emit(normal.y);
EmitLine();
}
EmitLine();
Emit("# texcoords count: "); for (const Nz::Vector3f& normal : m_normals)
EmitLine(m_texCoords.size());
for (const Nz::Vector3f& uvw : m_texCoords)
{
Emit("vt ");
Emit(uvw.x);
Emit(' ');
Emit(uvw.y);
if (NumberEquals(uvw.z, 0.f))
{ {
Emit("vn ");
Emit(normal.x);
Emit(' '); Emit(' ');
Emit(uvw.z); Emit(normal.y);
Emit(' ');
Emit(normal.y);
EmitLine();
}
EmitLine();
}
if (!m_texCoords.empty())
{
Emit("# texcoords count: ");
EmitLine(m_texCoords.size());
for (const Nz::Vector3f& uvw : m_texCoords)
{
Emit("vt ");
Emit(uvw.x);
Emit(' ');
Emit(uvw.y);
if (NumberEquals(uvw.z, 0.f))
{
Emit(' ');
Emit(uvw.z);
}
EmitLine();
} }
EmitLine(); EmitLine();
} }
EmitLine();
std::unordered_map<std::size_t /* mesh */, std::vector<std::size_t> /* meshes*/> meshesByMaterials; std::unordered_map<std::size_t /* mesh */, std::vector<std::size_t> /* meshes*/> meshesByMaterials;
std::size_t meshIndex = 0; std::size_t meshIndex = 0;

View File

@ -160,7 +160,7 @@ namespace Nz
SparsePtr<Vector2f> texCoordsPtr = vertexMapper.GetComponentPtr<Vector2f>(VertexComponent::TexCoord); SparsePtr<Vector2f> texCoordsPtr = vertexMapper.GetComponentPtr<Vector2f>(VertexComponent::TexCoord);
std::size_t faceIndex = 0; std::size_t faceIndex = 0;
TriangleIterator triangle(staticMesh); TriangleIterator triangleIt(staticMesh);
do do
{ {
OBJParser::Face& face = meshes[i].faces[faceIndex]; OBJParser::Face& face = meshes[i].faces[faceIndex];
@ -171,15 +171,23 @@ namespace Nz
{ {
OBJParser::FaceVertex& vertexIndices = meshes[i].vertices[face.firstVertex + j]; OBJParser::FaceVertex& vertexIndices = meshes[i].vertices[face.firstVertex + j];
std::size_t index = triangle[j]; std::size_t index = triangleIt[j];
vertexIndices.normal = normalCache.Insert(normalPtr[index]);
vertexIndices.position = positionCache.Insert(positionPtr[index]); vertexIndices.position = positionCache.Insert(positionPtr[index]);
vertexIndices.texCoord = texCoordsCache.Insert(texCoordsPtr[index]);
if (normalPtr)
vertexIndices.normal = normalCache.Insert(normalPtr[index]);
else
vertexIndices.normal = 0;
if (texCoordsPtr)
vertexIndices.texCoord = texCoordsCache.Insert(texCoordsPtr[index]);
else
vertexIndices.texCoord = 0;
} }
faceIndex++; faceIndex++;
} }
while (triangle.Advance()); while (triangleIt.Advance());
} }
} }