robustify reading of buggy x files

This commit is contained in:
David Rose 2008-06-26 19:27:00 +00:00
parent 7937d29ab1
commit 52a60b7f2f
3 changed files with 32 additions and 31 deletions

View File

@ -127,8 +127,7 @@ finalize_parse_data() {
}
if (index != _parse_data_list._list.size()) {
xyyerror("Too many data elements in structure.");
return false;
xyywarning("Too many data elements in structure.");
}
return true;

View File

@ -112,7 +112,6 @@ apply_to_egg(EggPrimitive *egg_prim, XFileToEggConverter *converter) {
EggMaterial temp("");
temp.set_diff(_face_color);
if (got_spec) {
cerr << "shininess = " << _power << "\n";
temp.set_shininess(_power);
temp.set_spec(Colorf(_specular_color[0], _specular_color[1],
_specular_color[2], 1.0));

View File

@ -292,9 +292,9 @@ create_polygons(XFileToEggConverter *converter) {
int vertex_index = (*vi)._vertex_index;
int normal_index = (*vi)._normal_index;
if (vertex_index < 0 || vertex_index >= (int)_vertices.size()) {
xfile_cat.error()
<< "Vertex index out of range in Mesh.\n";
return false;
xfile_cat.warning()
<< "Vertex index out of range in Mesh " << get_name() << "\n";
continue;
}
XFileVertex *vertex = _vertices[vertex_index];
XFileNormal *normal = (XFileNormal *)NULL;
@ -763,23 +763,25 @@ fill_normals(XFileDataNode *obj) {
const XFileDataObject &faceNormals = (*obj)["faceNormals"];
if (faceNormals.size() != (int)_faces.size()) {
xfile_cat.error()
<< "Incorrect number of faces in MeshNormals.\n";
return false;
xfile_cat.warning()
<< "Incorrect number of faces in MeshNormals within "
<< get_name() << "\n";
}
for (i = 0; i < faceNormals.size(); i++) {
int num_normals = min(faceNormals.size(), (int)_faces.size());
for (i = 0; i < num_normals; i++) {
XFileFace *face = _faces[i];
const XFileDataObject &faceIndices = faceNormals[i]["faceVertexIndices"];
if (faceIndices.size() != (int)face->_vertices.size()) {
xfile_cat.error()
<< "Incorrect number of vertices for face in MeshNormals.\n";
return false;
xfile_cat.warning()
<< "Incorrect number of vertices for face in MeshNormals within "
<< get_name() << "\n";
}
for (j = 0; j < faceIndices.size(); j++) {
int num_vertices = min(faceIndices.size(), (int)face->_vertices.size());
for (j = 0; j < num_vertices; j++) {
face->_vertices[j]._normal_index = faceIndices[j].i();
}
}
@ -799,9 +801,10 @@ fill_colors(XFileDataNode *obj) {
for (int i = 0; i < vertexColors.size(); i++) {
int vertex_index = vertexColors[i]["index"].i();
if (vertex_index < 0 || vertex_index >= (int)_vertices.size()) {
xfile_cat.error()
<< "Vertex index out of range in MeshVertexColors.\n";
return false;
xfile_cat.warning()
<< "Vertex index out of range in MeshVertexColors within "
<< get_name() << "\n";
continue;
}
XFileVertex *vertex = _vertices[vertex_index];
@ -822,12 +825,13 @@ bool XFileMesh::
fill_uvs(XFileDataNode *obj) {
const XFileDataObject &textureCoords = (*obj)["textureCoords"];
if (textureCoords.size() != (int)_vertices.size()) {
xfile_cat.error()
<< "Wrong number of vertices in MeshTextureCoords.\n";
return false;
xfile_cat.warning()
<< "Wrong number of vertices in MeshTextureCoords within "
<< get_name() << "\n";
}
for (int i = 0; i < textureCoords.size(); i++) {
int num_texcoords = min(textureCoords.size(), (int)_vertices.size());
for (int i = 0; i < num_texcoords; i++) {
XFileVertex *vertex = _vertices[i];
vertex->_uv = textureCoords[i].vec2();
vertex->_has_uv = true;
@ -855,20 +859,20 @@ fill_skin_weights(XFileDataNode *obj) {
const XFileDataObject &weights = (*obj)["weights"];
if (weights.size() != vertexIndices.size()) {
xfile_cat.error()
<< "Inconsistent number of vertices in SkinWeights.\n";
return false;
xfile_cat.warning()
<< "Inconsistent number of vertices in SkinWeights within " << get_name() << "\n";
}
// Unpack the weight for each vertex.
for (int i = 0; i < weights.size(); i++) {
size_t num_weights = min(weights.size(), vertexIndices.size());
for (size_t i = 0; i < num_weights; i++) {
int vindex = vertexIndices[i].i();
double weight = weights[i].d();
if (vindex < 0 || vindex > (int)_vertices.size()) {
xfile_cat.error()
xfile_cat.warning()
<< "Illegal vertex index " << vindex << " in SkinWeights.\n";
return false;
continue;
}
data._weight_map[vindex] = weight;
}
@ -889,14 +893,13 @@ bool XFileMesh::
fill_material_list(XFileDataNode *obj) {
const XFileDataObject &faceIndexes = (*obj)["faceIndexes"];
if (faceIndexes.size() > (int)_faces.size()) {
xfile_cat.error()
<< "Too many faces in MeshMaterialList.\n";
return false;
xfile_cat.warning()
<< "Too many faces in MeshMaterialList within " << get_name() << "\n";
}
int material_index = -1;
int i = 0;
while (i < faceIndexes.size()) {
while (i < faceIndexes.size() && i < (int)_faces.size()) {
XFileFace *face = _faces[i];
material_index = faceIndexes[i].i();
face->_material_index = material_index;