Utility/OBJSaver: Handle case where normal and/or texcoords are not present
This commit is contained in:
parent
b917738ed4
commit
213c7d8a1e
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue