From 3b614b2da1aa9ed1ca08b8e9e46c4d0c6ffd15ec Mon Sep 17 00:00:00 2001 From: lzwdgc Date: Fri, 6 Mar 2020 13:38:19 +0300 Subject: [PATCH] Disable link faces by default as uvs work is not over. Restore basic link faces. --- src/mod_converter/fbx.cpp | 2 +- src/mod_converter/mod_converter.cpp | 3 +- src/model/model.cpp | 70 ++++++++++++++++------------- src/model/model.h | 2 + 4 files changed, 44 insertions(+), 33 deletions(-) diff --git a/src/mod_converter/fbx.cpp b/src/mod_converter/fbx.cpp index 8b8f245..3ca182b 100644 --- a/src/mod_converter/fbx.cpp +++ b/src/mod_converter/fbx.cpp @@ -277,7 +277,7 @@ static FbxMesh *create_mesh(FbxScene *s, const block &b) { auto uv = m->CreateElementUV("uv", FbxLayerElement::eTextureDiffuse); uv->SetMappingMode(FbxGeometryElement::eByControlPoint); - uv->SetReferenceMode(FbxGeometryElement::eDirect); + uv->SetReferenceMode(FbxGeometryElement::eDirect); // not needed? for (const auto &[u,v] : b.pmd.uvs) uv->GetDirectArray().Add(FbxVector2(u, v)); //float f; diff --git a/src/mod_converter/mod_converter.cpp b/src/mod_converter/mod_converter.cpp index 1efe01e..7045341 100644 --- a/src/mod_converter/mod_converter.cpp +++ b/src/mod_converter/mod_converter.cpp @@ -41,7 +41,8 @@ bool printMaxPolygonBlock = false; cl::opt p(cl::Positional, cl::desc(""), cl::value_desc("file or directory"), cl::Required); cl::opt all_formats("af", cl::desc("All formats (.obj, .fbx)")); -cl::opt link_faces("lf", cl::desc("Link faces (default: true)"), cl::init(true)); +// link_faces is not currently complete, after processing we have bad uvs +cl::opt link_faces("lf", cl::desc("Link faces (default: true)")/*, cl::init(true)*/); yaml root; cl::opt stats("i", cl::desc("Gather information from (models)")); diff --git a/src/model/model.cpp b/src/model/model.cpp index 332e844..1d25ee0 100644 --- a/src/model/model.cpp +++ b/src/model/model.cpp @@ -324,19 +324,25 @@ static std::string printTex(const uv &texture_coordinates) std::string processed_model_data::print(int group_offset, AxisSystem as) const { std::string s; + + // s += "# " + std::to_string(vertices.size()) + " vertices\n"; for (auto &v : vertices) s += printVertex(v, as) + "\n"; s += "\n"; - s += "# " + std::to_string(normals.size()) + " vertex normals\n"; - for (auto &n : normals) - s += printNormal(n, as) + "\n"; - s += "\n"; + + // s += "# " + std::to_string(uvs.size()) + " texture coords\n"; for (auto &v : uvs) s += printTex(v) + "\n"; s += "\n"; + // + s += "# " + std::to_string(normals.size()) + " vertex normals\n"; + for (auto &n : normals) + s += printNormal(n, as) + "\n"; + s += "\n"; + s += "# " + std::to_string(vertices.size()) + " faces\n"; for (auto &t : faces) { @@ -578,50 +584,52 @@ static processed_model_data linkFaces(const processed_model_data &d) { // reference implementation by Razum: https://pastebin.com/KewhggDj - processed_model_data pmd = d; + processed_model_data pmd; - /*std::vector vertices2; - vertices2.reserve(vertices.size()); + pmd.vertices.reserve(d.vertices.size()); + pmd.normals.reserve(d.normals.size()); + pmd.uvs.reserve(d.uvs.size()); std::unordered_map vrepl, trepl; - vrepl.reserve(vertices.size()); - trepl.reserve(vertices.size()); + vrepl.reserve(d.vertices.size()); + trepl.reserve(d.vertices.size()); - auto sz = vertices.size(); + auto sz = d.vertices.size(); for (int i = 0; i < sz; i++) { - auto it = std::find_if(vertices2.begin(), vertices2.end(), [&vertices, i](auto &v1) + auto it = std::find(pmd.vertices.begin(), pmd.vertices.end(), d.vertices[i]); + if (it == pmd.vertices.end()) { - return (aim_vector3f&)vertices[i].coordinates == (aim_vector3f&)v1.coordinates; - }); - if (it == vertices2.end()) - { - vertices2.push_back(vertices[i]); - vrepl[i] = vertices2.size() - 1; + pmd.vertices.push_back(d.vertices[i]); + pmd.normals.push_back(d.normals[i]); // as is for now + pmd.uvs.push_back(d.uvs[i]); // as is for now + vrepl[i] = pmd.vertices.size() - 1; } else - vrepl[i] = std::distance(vertices2.begin(), it); + vrepl[i] = std::distance(pmd.vertices.begin(), it); } - std::vector uvs2; - uvs2.reserve(uvs.size()); + /*uvs2.reserve(uvs.size()); for (auto &f : uvs) { // remove duplicates if (std::find(uvs2.begin(), uvs2.end(), f) == uvs2.end()) uvs2.push_back(f); - } - - std::vector faces2; - faces2.reserve(faces.size()); - for (auto f : faces) - { - for (auto &v : f.vertex_list) - v = vrepl[v]; - // remove duplicates - if (std::find(faces2.begin(), faces2.end(), f) == faces2.end()) - faces2.push_back(f); }*/ + pmd.faces.reserve(d.faces.size()); + for (auto f : d.faces) + { + for (auto &v : f.points) + { + v.vertex = vrepl[v.vertex]; + v.normal = vrepl[v.normal]; + v.uv = vrepl[v.uv]; + } + // remove duplicates + if (std::find(pmd.faces.begin(), pmd.faces.end(), f) == pmd.faces.end()) + pmd.faces.push_back(f); + } + return pmd; } diff --git a/src/model/model.h b/src/model/model.h index 836364f..74a7c3c 100644 --- a/src/model/model.h +++ b/src/model/model.h @@ -175,6 +175,8 @@ struct processed_model_data }; point points[3]; + + bool operator==(const face &rhs) const { return points == rhs.points; } }; std::vector vertices;