Fixed OBJ Loader sometimes creating empty mesh
Former-commit-id: 6b5624db279f3818edb6b4544ad0114b7c5e1e27
This commit is contained in:
parent
bbecdf4a92
commit
4d06ca3906
|
|
@ -61,6 +61,8 @@ namespace
|
||||||
for (unsigned int i = 0; i < meshCount; ++i)
|
for (unsigned int i = 0; i < meshCount; ++i)
|
||||||
{
|
{
|
||||||
unsigned int faceCount = meshes[i].faces.size();
|
unsigned int faceCount = meshes[i].faces.size();
|
||||||
|
if (faceCount == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
std::vector<unsigned int> indices;
|
std::vector<unsigned int> indices;
|
||||||
indices.reserve(faceCount*3); // Pire cas si les faces sont des triangles
|
indices.reserve(faceCount*3); // Pire cas si les faces sont des triangles
|
||||||
|
|
@ -97,6 +99,7 @@ namespace
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Création des buffers
|
||||||
std::unique_ptr<NzIndexBuffer> indexBuffer(new NzIndexBuffer(vertexCount > std::numeric_limits<nzUInt16>::max(), indices.size(), parameters.mesh.storage, nzBufferUsage_Static));
|
std::unique_ptr<NzIndexBuffer> indexBuffer(new NzIndexBuffer(vertexCount > std::numeric_limits<nzUInt16>::max(), indices.size(), parameters.mesh.storage, nzBufferUsage_Static));
|
||||||
indexBuffer->SetPersistent(false);
|
indexBuffer->SetPersistent(false);
|
||||||
|
|
||||||
|
|
@ -108,7 +111,7 @@ namespace
|
||||||
for (unsigned int j = 0; j < indices.size(); ++j)
|
for (unsigned int j = 0; j < indices.size(); ++j)
|
||||||
indexMapper.Set(j, indices[j]);
|
indexMapper.Set(j, indices[j]);
|
||||||
|
|
||||||
indexMapper.Unmap();
|
indexMapper.Unmap(); // Pour laisser les autres tâches affecter l'index buffer
|
||||||
|
|
||||||
// Remplissage des vertices
|
// Remplissage des vertices
|
||||||
bool hasNormals = true;
|
bool hasNormals = true;
|
||||||
|
|
@ -170,6 +173,7 @@ namespace
|
||||||
if (parameters.mesh.center)
|
if (parameters.mesh.center)
|
||||||
subMesh->Center();
|
subMesh->Center();
|
||||||
|
|
||||||
|
// Ce que nous pouvons générer dépend des données à disposition (par exemple les tangentes nécessitent des coordonnées de texture)
|
||||||
if (hasNormals && hasTexCoords)
|
if (hasNormals && hasTexCoords)
|
||||||
subMesh->GenerateTangents();
|
subMesh->GenerateTangents();
|
||||||
else if (hasTexCoords)
|
else if (hasTexCoords)
|
||||||
|
|
|
||||||
|
|
@ -93,13 +93,15 @@ bool NzOBJParser::Parse()
|
||||||
m_positions.clear();
|
m_positions.clear();
|
||||||
m_texCoords.clear();
|
m_texCoords.clear();
|
||||||
|
|
||||||
// Beaucoup de meshs font plus de 100 sommets, on prépare le terrain
|
// Beaucoup de meshs font plus de 100 sommets, préparons le terrain
|
||||||
m_normals.reserve(100);
|
m_normals.reserve(100);
|
||||||
m_positions.reserve(100);
|
m_positions.reserve(100);
|
||||||
m_texCoords.reserve(100);
|
m_texCoords.reserve(100);
|
||||||
|
|
||||||
|
// On va regrouper les meshs par nom et par matériau
|
||||||
std::unordered_map<NzString, std::unordered_map<NzString, std::vector<Face>>> meshes;
|
std::unordered_map<NzString, std::unordered_map<NzString, std::vector<Face>>> meshes;
|
||||||
|
|
||||||
|
// On prépare le mesh par défaut
|
||||||
std::vector<Face>* currentMesh = &meshes[meshName][matName];
|
std::vector<Face>* currentMesh = &meshes[meshName][matName];
|
||||||
|
|
||||||
while (Advance(false))
|
while (Advance(false))
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue