Disable link faces by default as uvs work is not over. Restore basic link faces.

This commit is contained in:
lzwdgc 2020-03-06 13:38:19 +03:00
parent 33787f94ae
commit 3b614b2da1
4 changed files with 44 additions and 33 deletions

View file

@ -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;

View file

@ -41,7 +41,8 @@ bool printMaxPolygonBlock = false;
cl::opt<path> p(cl::Positional, cl::desc("<MOD_ file or directory with MOD_ files or .mod file saved from AIM2 SDK viewer>"), cl::value_desc("file or directory"), cl::Required);
cl::opt<bool> all_formats("af", cl::desc("All formats (.obj, .fbx)"));
cl::opt<bool> 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<bool> link_faces("lf", cl::desc("Link faces (default: true)")/*, cl::init(true)*/);
yaml root;
cl::opt<bool> stats("i", cl::desc("Gather information from (models)"));

View file

@ -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<vertex> 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<short, short> 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<uv> 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<face> 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;
}

View file

@ -175,6 +175,8 @@ struct processed_model_data
};
point points[3];
bool operator==(const face &rhs) const { return points == rhs.points; }
};
std::vector<aim_vector4> vertices;