From 52a60b7f2f65a5ace3f03a9b717a21e7d7d139b3 Mon Sep 17 00:00:00 2001 From: David Rose Date: Thu, 26 Jun 2008 19:27:00 +0000 Subject: [PATCH] robustify reading of buggy x files --- pandatool/src/xfile/xFileDataNodeTemplate.cxx | 3 +- pandatool/src/xfileegg/xFileMaterial.cxx | 1 - pandatool/src/xfileegg/xFileMesh.cxx | 59 ++++++++++--------- 3 files changed, 32 insertions(+), 31 deletions(-) diff --git a/pandatool/src/xfile/xFileDataNodeTemplate.cxx b/pandatool/src/xfile/xFileDataNodeTemplate.cxx index 25ed31e55c..34dc63f2b5 100644 --- a/pandatool/src/xfile/xFileDataNodeTemplate.cxx +++ b/pandatool/src/xfile/xFileDataNodeTemplate.cxx @@ -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; diff --git a/pandatool/src/xfileegg/xFileMaterial.cxx b/pandatool/src/xfileegg/xFileMaterial.cxx index 4004616bd7..da67f7fc2e 100644 --- a/pandatool/src/xfileegg/xFileMaterial.cxx +++ b/pandatool/src/xfileegg/xFileMaterial.cxx @@ -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)); diff --git a/pandatool/src/xfileegg/xFileMesh.cxx b/pandatool/src/xfileegg/xFileMesh.cxx index 18b2c9c553..4cbde70f86 100644 --- a/pandatool/src/xfileegg/xFileMesh.cxx +++ b/pandatool/src/xfileegg/xFileMesh.cxx @@ -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;