手动UV分支
This commit is contained in:
1 parent
5e1623e303
commit
7fd81ffbea
7 files changed
+1192
-242
No files matched your search
+62
-12
@@ -1191,15 +1191,14 @@ namespace BasicPLY {
|
||||
} // namespace MeshInternal
|
||||
|
||||
// import the mesh from the given file
|
||||
bool Mesh::Load(const String& fileName)
|
||||
bool Mesh::Load(const String& fileName, bool bLoadUV)
|
||||
{
|
||||
TD_TIMER_STARTD();
|
||||
const String ext(Util::getFileExt(fileName).ToLower());
|
||||
bool ret;
|
||||
if (ext == _T(".obj"))
|
||||
ret = LoadOBJ(fileName);
|
||||
else
|
||||
if (ext == _T(".gltf") || ext == _T(".glb"))
|
||||
ret = LoadOBJ(fileName, bLoadUV);
|
||||
else if (ext == _T(".gltf") || ext == _T(".glb"))
|
||||
ret = LoadGLTF(fileName, ext == _T(".glb"));
|
||||
else
|
||||
ret = LoadPLY(fileName);
|
||||
@@ -1208,6 +1207,43 @@ bool Mesh::Load(const String& fileName)
|
||||
DEBUG_EXTRA("Mesh loaded: %u vertices, %u faces (%s)", vertices.size(), faces.size(), TD_TIMER_GET_FMT().c_str());
|
||||
return true;
|
||||
}
|
||||
|
||||
void Mesh::CheckUVValid()
|
||||
{
|
||||
for (int_t idxFace = 0; idxFace < (int_t)faces.size(); ++idxFace)
|
||||
{
|
||||
FOREACH(idxFace, faces)
|
||||
{
|
||||
const FIndex faceID = (FIndex)idxFace;
|
||||
|
||||
const TexCoord* uv = &faceTexcoords[faceID * 3];
|
||||
|
||||
const Point2f& a = uv[0];
|
||||
const Point2f& b = uv[1];
|
||||
const Point2f& c = uv[2];
|
||||
|
||||
// DEBUG_EXTRA("a=(%f,%f),b=(%f,%f),c=(%f,%f)", a.x, a.y, b.x, b.y, c.x, c.y);
|
||||
|
||||
// 计算边向量
|
||||
Point2f v0 = b - a;
|
||||
Point2f v1 = c - a;
|
||||
float denom = (v0.x * v0.x + v0.y * v0.y) * (v1.x * v1.x + v1.y * v1.y) -
|
||||
std::pow(v0.x * v1.x + v0.y * v1.y, 2);
|
||||
|
||||
// 处理退化三角形情况(面积接近0)
|
||||
const float epsilon = 1e-10f;
|
||||
if (std::abs(denom) < epsilon)
|
||||
{
|
||||
// DEBUG_EXTRA("PointInTriangle - Degenerate triangle, denom=%.10f", denom);
|
||||
}
|
||||
else
|
||||
{
|
||||
DEBUG_EXTRA("PointInTriangle Yes idxFace=%d", idxFace);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// import the mesh as a PLY file
|
||||
bool Mesh::LoadPLY(const String& fileName)
|
||||
{
|
||||
@@ -1302,16 +1338,28 @@ bool Mesh::LoadPLY(const String& fileName)
|
||||
return true;
|
||||
}
|
||||
// import the mesh as a OBJ file
|
||||
bool Mesh::LoadOBJ(const String& fileName)
|
||||
bool Mesh::LoadOBJ(const String& fileName, bool bLoadUV)
|
||||
{
|
||||
ASSERT(!fileName.empty());
|
||||
Release();
|
||||
|
||||
// open and parse OBJ file
|
||||
ObjModel model;
|
||||
if (!model.Load(fileName)) {
|
||||
DEBUG_EXTRA("error: invalid OBJ file");
|
||||
return false;
|
||||
if (bLoadUV)
|
||||
{
|
||||
if (!model.LoadUV(fileName, faceTexcoords, true)) {
|
||||
DEBUG_EXTRA("error: LoadUV invalid OBJ file %s", fileName.c_str());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!model.LoadUV(fileName, faceTexcoords)) {
|
||||
// if (!model.Load(fileName)) {
|
||||
DEBUG_EXTRA("error: Load invalid OBJ file %s", fileName.c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (model.get_vertices().empty() || model.get_groups().empty()) {
|
||||
@@ -1340,11 +1388,13 @@ bool Mesh::LoadOBJ(const String& fileName)
|
||||
for (const ObjModel::Face& f: group.faces) {
|
||||
ASSERT(f.vertices[0] != NO_ID);
|
||||
faces.emplace_back(f.vertices[0], f.vertices[1], f.vertices[2]);
|
||||
/*
|
||||
if (f.texcoords[0] != NO_ID) {
|
||||
for (int i=0; i<3; ++i)
|
||||
faceTexcoords.emplace_back(model.get_texcoords()[f.texcoords[i]]);
|
||||
faceTexindices.emplace_back((TexIndex)groupIdx);
|
||||
}
|
||||
*/
|
||||
if (f.normals[0] != NO_ID) {
|
||||
Normal& n = faceNormals.emplace_back(Normal::ZERO);
|
||||
for (int i=0; i<3; ++i)
|
||||
@@ -1445,13 +1495,13 @@ bool Mesh::LoadGLTF(const String& fileName, bool bBinary)
|
||||
/*----------------------------------------------------------------*/
|
||||
|
||||
// export the mesh to the given file
|
||||
bool Mesh::Save(const String& fileName, const cList<String>& comments, bool bBinary) const
|
||||
bool Mesh::Save(const String& fileName, const cList<String>& comments, bool bBinary, bool bUseExistingUV) const
|
||||
{
|
||||
TD_TIMER_STARTD();
|
||||
const String ext(Util::getFileExt(fileName).ToLower());
|
||||
bool ret;
|
||||
if (ext == _T(".obj"))
|
||||
ret = SaveOBJ(fileName);
|
||||
ret = SaveOBJ(fileName, bUseExistingUV);
|
||||
else
|
||||
if (ext == _T(".gltf") || ext == _T(".glb"))
|
||||
ret = SaveGLTF(fileName, ext == _T(".glb"));
|
||||
@@ -1538,7 +1588,7 @@ bool Mesh::SavePLY(const String& fileName, const cList<String>& comments, bool b
|
||||
return true;
|
||||
}
|
||||
// export the mesh as a OBJ file
|
||||
bool Mesh::SaveOBJ(const String& fileName) const
|
||||
bool Mesh::SaveOBJ(const String& fileName, bool bUseExistingUV) const
|
||||
{
|
||||
ASSERT(!fileName.empty());
|
||||
Util::ensureFolder(fileName);
|
||||
@@ -1597,7 +1647,7 @@ bool Mesh::SaveOBJ(const String& fileName) const
|
||||
pMaterial->diffuse_map = texturesDiffuse[idxTexture];
|
||||
}
|
||||
|
||||
return model.Save(fileName, 6U, true);
|
||||
return model.Save(fileName, 6U, true, bUseExistingUV);
|
||||
}
|
||||
// export the mesh as a GLTF file
|
||||
template <typename T>
|
||||
|
||||
Reference in new issue
Block a user