Improved OBJ loader

Former-commit-id: 201392edba571e66d0fab14e63c5c4284494808b
This commit is contained in:
Lynix 2013-04-01 02:52:41 +02:00
parent e111e6b907
commit 8c942ef19b
2 changed files with 55 additions and 7 deletions

View File

@ -184,13 +184,13 @@ namespace
NzString mtlLib = parser.GetMtlLib(); NzString mtlLib = parser.GetMtlLib();
if (parameters.loadMaterials && !mtlLib.IsEmpty()) if (parameters.loadMaterials && !mtlLib.IsEmpty())
{ {
NzString baseDir = stream.GetDirectory(); NzFile file(stream.GetDirectory() + mtlLib);
NzFile file(baseDir + mtlLib);
if (file.Open(NzFile::ReadOnly | NzFile::Text)) if (file.Open(NzFile::ReadOnly | NzFile::Text))
{ {
NzMTLParser materialParser(file); NzMTLParser materialParser(file);
if (materialParser.Parse()) if (materialParser.Parse())
{ {
NzString baseDir = file.GetDirectory();
for (unsigned int i = 0; i < meshCount; ++i) for (unsigned int i = 0; i < meshCount; ++i)
{ {
const NzString& matName = materials[meshes[i].material]; const NzString& matName = materials[meshes[i].material];

View File

@ -170,23 +170,65 @@ bool NzOBJParser::Parse()
break; break;
} }
pos += offset; if (p < 0)
{
p += m_positions.size() + 1;
if (p < 0)
{
Error("Vertex index out of range (" + NzString::Number(p) + " < 0");
error = true;
break;
}
}
else
p--;
if (n < 0)
{
n += m_normals.size() + 1;
if (n < 0)
{
Error("Vertex index out of range (" + NzString::Number(n) + " < 0");
error = true;
break;
}
}
else
n--;
if (t < 0)
{
t += m_texCoords.size() + 1;
if (t < 0)
{
Error("Vertex index out of range (" + NzString::Number(t) + " < 0");
error = true;
break;
}
}
else
t--;
if (static_cast<unsigned int>(p) >= m_positions.size()) if (static_cast<unsigned int>(p) >= m_positions.size())
{ {
Error("Vertex index out of range " + NzString::Number(p) + " > " + NzString::Number(m_positions.size())); Error("Vertex index out of range (" + NzString::Number(p) + " >= " + NzString::Number(m_positions.size()) + ')');
error = true;
break; break;
} }
else if (n >= 0 && static_cast<unsigned int>(n) >= m_normals.size()) else if (n >= 0 && static_cast<unsigned int>(n) >= m_normals.size())
{ {
Error("Normal index out of range " + NzString::Number(n) + " > " + NzString::Number(m_normals.size())); Error("Normal index out of range (" + NzString::Number(n) + " >= " + NzString::Number(m_normals.size()) + ')');
error = true;
break; break;
} }
else if (t >= 0 && static_cast<unsigned int>(t) >= m_texCoords.size()) else if (t >= 0 && static_cast<unsigned int>(t) >= m_texCoords.size())
{ {
Error("TexCoord index out of range " + NzString::Number(t) + " > " + NzString::Number(m_texCoords.size())); Error("TexCoord index out of range (" + NzString::Number(t) + " >= " + NzString::Number(m_texCoords.size()) + ')');
error = true;
break; break;
} }
pos += offset;
} }
if (!error) if (!error)
@ -234,7 +276,7 @@ bool NzOBJParser::Parse()
if (m_currentLine[1] == ' ') if (m_currentLine[1] == ' ')
{ {
NzString param = m_currentLine.Substr(2); NzString param = m_currentLine.Substr(2);
if (param != '0' && param != '1' && param != "on" && param != "off") if (param != "all" && param != "on" && param != "off" && !param.IsNumber())
UnrecognizedLine(); UnrecognizedLine();
} }
else else
@ -339,6 +381,12 @@ bool NzOBJParser::Parse()
} }
} }
if (m_meshes.empty())
{
NazaraError("No meshes");
return false;
}
m_materials.resize(matCount); m_materials.resize(matCount);
for (auto it : materials) for (auto it : materials)
m_materials[it.second] = it.first; m_materials[it.second] = it.first;