meshoptimizer: Sync with upstream commit ea4558d1c

ea4558d1c0
This commit is contained in:
Rémi Verschelde 2022-06-10 12:46:50 +02:00
parent cb7d5723b4
commit a3195dd4eb
4 changed files with 37 additions and 29 deletions

View file

@ -345,7 +345,7 @@ File extracted from upstream release tarball:
## meshoptimizer ## meshoptimizer
- Upstream: https://github.com/zeux/meshoptimizer - Upstream: https://github.com/zeux/meshoptimizer
- Version: git (8a7d69caa68f778cb559f1879b6beb7987c8c6b7, 2022) - Version: git (ea4558d1c0f217f1d67ed7fe0b07896ece88ae18, 2022)
- License: MIT - License: MIT
Files extracted from upstream repository: Files extracted from upstream repository:

View file

@ -1,5 +1,5 @@
diff --git a/thirdparty/meshoptimizer/simplifier.cpp b/thirdparty/meshoptimizer/simplifier.cpp diff --git a/thirdparty/meshoptimizer/simplifier.cpp b/thirdparty/meshoptimizer/simplifier.cpp
index e384046ffe..ccc99edb1a 100644 index 5e92e2dc73..e40c141e76 100644
--- a/thirdparty/meshoptimizer/simplifier.cpp --- a/thirdparty/meshoptimizer/simplifier.cpp
+++ b/thirdparty/meshoptimizer/simplifier.cpp +++ b/thirdparty/meshoptimizer/simplifier.cpp
@@ -20,7 +20,7 @@ @@ -20,7 +20,7 @@
@ -11,7 +11,7 @@ index e384046ffe..ccc99edb1a 100644
// This work is based on: // This work is based on:
// Michael Garland and Paul S. Heckbert. Surface simplification using quadric error metrics. 1997 // Michael Garland and Paul S. Heckbert. Surface simplification using quadric error metrics. 1997
@@ -445,6 +445,7 @@ struct Collapse @@ -453,6 +453,7 @@ struct Collapse
float error; float error;
unsigned int errorui; unsigned int errorui;
}; };
@ -19,7 +19,7 @@ index e384046ffe..ccc99edb1a 100644
}; };
static float normalize(Vector3& v) static float normalize(Vector3& v)
@@ -525,6 +526,34 @@ static float quadricError(const Quadric& Q, const Vector3& v) @@ -533,6 +534,34 @@ static float quadricError(const Quadric& Q, const Vector3& v)
return fabsf(r) * s; return fabsf(r) * s;
} }
@ -54,7 +54,7 @@ index e384046ffe..ccc99edb1a 100644
static void quadricFromPlane(Quadric& Q, float a, float b, float c, float d, float w) static void quadricFromPlane(Quadric& Q, float a, float b, float c, float d, float w)
{ {
float aw = a * w; float aw = a * w;
@@ -680,7 +709,7 @@ static void quadricUpdateAttributes(Quadric& Q, const Vector3& p0, const Vector3 @@ -688,7 +717,7 @@ static void quadricUpdateAttributes(Quadric& Q, const Vector3& p0, const Vector3
} }
#endif #endif
@ -63,7 +63,7 @@ index e384046ffe..ccc99edb1a 100644
{ {
for (size_t i = 0; i < index_count; i += 3) for (size_t i = 0; i < index_count; i += 3)
{ {
@@ -690,6 +719,9 @@ static void fillFaceQuadrics(Quadric* vertex_quadrics, const unsigned int* indic @@ -698,6 +727,9 @@ static void fillFaceQuadrics(Quadric* vertex_quadrics, const unsigned int* indic
Quadric Q; Quadric Q;
quadricFromTriangle(Q, vertex_positions[i0], vertex_positions[i1], vertex_positions[i2], 1.f); quadricFromTriangle(Q, vertex_positions[i0], vertex_positions[i1], vertex_positions[i2], 1.f);
@ -73,7 +73,7 @@ index e384046ffe..ccc99edb1a 100644
#if ATTRIBUTES #if ATTRIBUTES
quadricUpdateAttributes(Q, vertex_positions[i0], vertex_positions[i1], vertex_positions[i2], Q.w); quadricUpdateAttributes(Q, vertex_positions[i0], vertex_positions[i1], vertex_positions[i2], Q.w);
@@ -700,7 +732,7 @@ static void fillFaceQuadrics(Quadric* vertex_quadrics, const unsigned int* indic @@ -708,7 +740,7 @@ static void fillFaceQuadrics(Quadric* vertex_quadrics, const unsigned int* indic
} }
} }
@ -82,7 +82,7 @@ index e384046ffe..ccc99edb1a 100644
{ {
for (size_t i = 0; i < index_count; i += 3) for (size_t i = 0; i < index_count; i += 3)
{ {
@@ -744,6 +776,9 @@ static void fillEdgeQuadrics(Quadric* vertex_quadrics, const unsigned int* indic @@ -752,6 +784,9 @@ static void fillEdgeQuadrics(Quadric* vertex_quadrics, const unsigned int* indic
quadricAdd(vertex_quadrics[remap[i0]], Q); quadricAdd(vertex_quadrics[remap[i0]], Q);
quadricAdd(vertex_quadrics[remap[i1]], Q); quadricAdd(vertex_quadrics[remap[i1]], Q);
@ -92,7 +92,7 @@ index e384046ffe..ccc99edb1a 100644
} }
} }
} }
@@ -848,7 +883,7 @@ static size_t pickEdgeCollapses(Collapse* collapses, const unsigned int* indices @@ -856,7 +891,7 @@ static size_t pickEdgeCollapses(Collapse* collapses, const unsigned int* indices
return collapse_count; return collapse_count;
} }
@ -101,7 +101,7 @@ index e384046ffe..ccc99edb1a 100644
{ {
for (size_t i = 0; i < collapse_count; ++i) for (size_t i = 0; i < collapse_count; ++i)
{ {
@@ -868,10 +903,14 @@ static void rankEdgeCollapses(Collapse* collapses, size_t collapse_count, const @@ -876,10 +911,14 @@ static void rankEdgeCollapses(Collapse* collapses, size_t collapse_count, const
float ei = quadricError(qi, vertex_positions[i1]); float ei = quadricError(qi, vertex_positions[i1]);
float ej = quadricError(qj, vertex_positions[j1]); float ej = quadricError(qj, vertex_positions[j1]);
@ -116,7 +116,7 @@ index e384046ffe..ccc99edb1a 100644
} }
} }
@@ -968,7 +1007,7 @@ static void sortEdgeCollapses(unsigned int* sort_order, const Collapse* collapse @@ -976,7 +1015,7 @@ static void sortEdgeCollapses(unsigned int* sort_order, const Collapse* collapse
} }
} }
@ -125,7 +125,7 @@ index e384046ffe..ccc99edb1a 100644
{ {
size_t edge_collapses = 0; size_t edge_collapses = 0;
size_t triangle_collapses = 0; size_t triangle_collapses = 0;
@@ -1030,6 +1069,7 @@ static size_t performEdgeCollapses(unsigned int* collapse_remap, unsigned char* @@ -1038,6 +1077,7 @@ static size_t performEdgeCollapses(unsigned int* collapse_remap, unsigned char*
assert(collapse_remap[r1] == r1); assert(collapse_remap[r1] == r1);
quadricAdd(vertex_quadrics[r1], vertex_quadrics[r0]); quadricAdd(vertex_quadrics[r1], vertex_quadrics[r0]);
@ -133,7 +133,7 @@ index e384046ffe..ccc99edb1a 100644
if (vertex_kind[i0] == Kind_Complex) if (vertex_kind[i0] == Kind_Complex)
{ {
@@ -1067,7 +1107,7 @@ static size_t performEdgeCollapses(unsigned int* collapse_remap, unsigned char* @@ -1075,7 +1115,7 @@ static size_t performEdgeCollapses(unsigned int* collapse_remap, unsigned char*
triangle_collapses += (vertex_kind[i0] == Kind_Border) ? 1 : 2; triangle_collapses += (vertex_kind[i0] == Kind_Border) ? 1 : 2;
edge_collapses++; edge_collapses++;
@ -142,7 +142,7 @@ index e384046ffe..ccc99edb1a 100644
} }
#if TRACE #if TRACE
@@ -1455,9 +1495,11 @@ size_t meshopt_simplifyWithAttributes(unsigned int* destination, const unsigned @@ -1463,9 +1503,11 @@ size_t meshopt_simplifyWithAttributes(unsigned int* destination, const unsigned
Quadric* vertex_quadrics = allocator.allocate<Quadric>(vertex_count); Quadric* vertex_quadrics = allocator.allocate<Quadric>(vertex_count);
memset(vertex_quadrics, 0, vertex_count * sizeof(Quadric)); memset(vertex_quadrics, 0, vertex_count * sizeof(Quadric));
@ -156,7 +156,7 @@ index e384046ffe..ccc99edb1a 100644
if (result != indices) if (result != indices)
memcpy(result, indices, index_count * sizeof(unsigned int)); memcpy(result, indices, index_count * sizeof(unsigned int));
@@ -1488,7 +1530,7 @@ size_t meshopt_simplifyWithAttributes(unsigned int* destination, const unsigned @@ -1496,7 +1538,7 @@ size_t meshopt_simplifyWithAttributes(unsigned int* destination, const unsigned
if (edge_collapse_count == 0) if (edge_collapse_count == 0)
break; break;
@ -165,7 +165,7 @@ index e384046ffe..ccc99edb1a 100644
#if TRACE > 1 #if TRACE > 1
dumpEdgeCollapses(edge_collapses, edge_collapse_count, vertex_kind); dumpEdgeCollapses(edge_collapses, edge_collapse_count, vertex_kind);
@@ -1507,7 +1549,7 @@ size_t meshopt_simplifyWithAttributes(unsigned int* destination, const unsigned @@ -1515,7 +1557,7 @@ size_t meshopt_simplifyWithAttributes(unsigned int* destination, const unsigned
printf("pass %d: ", int(pass_count++)); printf("pass %d: ", int(pass_count++));
#endif #endif

View file

@ -15,7 +15,7 @@ index be4b765d97..463fad29da 100644
* Experimental: Mesh simplifier (sloppy) * Experimental: Mesh simplifier (sloppy)
* Reduces the number of triangles in the mesh, sacrificing mesh appearance for simplification performance * Reduces the number of triangles in the mesh, sacrificing mesh appearance for simplification performance
diff --git a/thirdparty/meshoptimizer/simplifier.cpp b/thirdparty/meshoptimizer/simplifier.cpp diff --git a/thirdparty/meshoptimizer/simplifier.cpp b/thirdparty/meshoptimizer/simplifier.cpp
index bf1431269d..e384046ffe 100644 index a74b08a97d..5e92e2dc73 100644
--- a/thirdparty/meshoptimizer/simplifier.cpp --- a/thirdparty/meshoptimizer/simplifier.cpp
+++ b/thirdparty/meshoptimizer/simplifier.cpp +++ b/thirdparty/meshoptimizer/simplifier.cpp
@@ -20,6 +20,8 @@ @@ -20,6 +20,8 @@
@ -27,7 +27,7 @@ index bf1431269d..e384046ffe 100644
// This work is based on: // This work is based on:
// Michael Garland and Paul S. Heckbert. Surface simplification using quadric error metrics. 1997 // Michael Garland and Paul S. Heckbert. Surface simplification using quadric error metrics. 1997
// Michael Garland. Quadric-based polygonal surface simplification. 1999 // Michael Garland. Quadric-based polygonal surface simplification. 1999
@@ -363,6 +365,10 @@ static void classifyVertices(unsigned char* result, unsigned int* loop, unsigned @@ -371,6 +373,10 @@ static void classifyVertices(unsigned char* result, unsigned int* loop, unsigned
struct Vector3 struct Vector3
{ {
float x, y, z; float x, y, z;
@ -38,7 +38,7 @@ index bf1431269d..e384046ffe 100644
}; };
static float rescalePositions(Vector3* result, const float* vertex_positions_data, size_t vertex_count, size_t vertex_positions_stride) static float rescalePositions(Vector3* result, const float* vertex_positions_data, size_t vertex_count, size_t vertex_positions_stride)
@@ -419,6 +425,13 @@ struct Quadric @@ -427,6 +433,13 @@ struct Quadric
float a10, a20, a21; float a10, a20, a21;
float b0, b1, b2, c; float b0, b1, b2, c;
float w; float w;
@ -52,7 +52,7 @@ index bf1431269d..e384046ffe 100644
}; };
struct Collapse struct Collapse
@@ -461,6 +474,16 @@ static void quadricAdd(Quadric& Q, const Quadric& R) @@ -469,6 +482,16 @@ static void quadricAdd(Quadric& Q, const Quadric& R)
Q.b2 += R.b2; Q.b2 += R.b2;
Q.c += R.c; Q.c += R.c;
Q.w += R.w; Q.w += R.w;
@ -69,7 +69,7 @@ index bf1431269d..e384046ffe 100644
} }
static float quadricError(const Quadric& Q, const Vector3& v) static float quadricError(const Quadric& Q, const Vector3& v)
@@ -486,6 +509,17 @@ static float quadricError(const Quadric& Q, const Vector3& v) @@ -494,6 +517,17 @@ static float quadricError(const Quadric& Q, const Vector3& v)
r += ry * v.y; r += ry * v.y;
r += rz * v.z; r += rz * v.z;
@ -87,7 +87,7 @@ index bf1431269d..e384046ffe 100644
float s = Q.w == 0.f ? 0.f : 1.f / Q.w; float s = Q.w == 0.f ? 0.f : 1.f / Q.w;
return fabsf(r) * s; return fabsf(r) * s;
@@ -509,6 +543,13 @@ static void quadricFromPlane(Quadric& Q, float a, float b, float c, float d, flo @@ -517,6 +551,13 @@ static void quadricFromPlane(Quadric& Q, float a, float b, float c, float d, flo
Q.b2 = c * dw; Q.b2 = c * dw;
Q.c = d * dw; Q.c = d * dw;
Q.w = w; Q.w = w;
@ -101,7 +101,7 @@ index bf1431269d..e384046ffe 100644
} }
static void quadricFromPoint(Quadric& Q, float x, float y, float z, float w) static void quadricFromPoint(Quadric& Q, float x, float y, float z, float w)
@@ -561,6 +602,84 @@ static void quadricFromTriangleEdge(Quadric& Q, const Vector3& p0, const Vector3 @@ -569,6 +610,84 @@ static void quadricFromTriangleEdge(Quadric& Q, const Vector3& p0, const Vector3
quadricFromPlane(Q, normal.x, normal.y, normal.z, -distance, length * weight); quadricFromPlane(Q, normal.x, normal.y, normal.z, -distance, length * weight);
} }
@ -186,7 +186,7 @@ index bf1431269d..e384046ffe 100644
static void fillFaceQuadrics(Quadric* vertex_quadrics, const unsigned int* indices, size_t index_count, const Vector3* vertex_positions, const unsigned int* remap) static void fillFaceQuadrics(Quadric* vertex_quadrics, const unsigned int* indices, size_t index_count, const Vector3* vertex_positions, const unsigned int* remap)
{ {
for (size_t i = 0; i < index_count; i += 3) for (size_t i = 0; i < index_count; i += 3)
@@ -572,6 +691,9 @@ static void fillFaceQuadrics(Quadric* vertex_quadrics, const unsigned int* indic @@ -580,6 +699,9 @@ static void fillFaceQuadrics(Quadric* vertex_quadrics, const unsigned int* indic
Quadric Q; Quadric Q;
quadricFromTriangle(Q, vertex_positions[i0], vertex_positions[i1], vertex_positions[i2], 1.f); quadricFromTriangle(Q, vertex_positions[i0], vertex_positions[i1], vertex_positions[i2], 1.f);
@ -196,7 +196,7 @@ index bf1431269d..e384046ffe 100644
quadricAdd(vertex_quadrics[remap[i0]], Q); quadricAdd(vertex_quadrics[remap[i0]], Q);
quadricAdd(vertex_quadrics[remap[i1]], Q); quadricAdd(vertex_quadrics[remap[i1]], Q);
quadricAdd(vertex_quadrics[remap[i2]], Q); quadricAdd(vertex_quadrics[remap[i2]], Q);
@@ -1265,13 +1387,19 @@ MESHOPTIMIZER_API unsigned int* meshopt_simplifyDebugLoopBack = 0; @@ -1273,13 +1395,19 @@ MESHOPTIMIZER_API unsigned int* meshopt_simplifyDebugLoopBack = 0;
#endif #endif
size_t meshopt_simplify(unsigned int* destination, const unsigned int* indices, size_t index_count, const float* vertex_positions_data, size_t vertex_count, size_t vertex_positions_stride, size_t target_index_count, float target_error, float* out_result_error) size_t meshopt_simplify(unsigned int* destination, const unsigned int* indices, size_t index_count, const float* vertex_positions_data, size_t vertex_count, size_t vertex_positions_stride, size_t target_index_count, float target_error, float* out_result_error)
@ -218,7 +218,7 @@ index bf1431269d..e384046ffe 100644
meshopt_Allocator allocator; meshopt_Allocator allocator;
@@ -1285,7 +1413,7 @@ size_t meshopt_simplify(unsigned int* destination, const unsigned int* indices, @@ -1293,7 +1421,7 @@ size_t meshopt_simplify(unsigned int* destination, const unsigned int* indices,
// build position remap that maps each vertex to the one with identical position // build position remap that maps each vertex to the one with identical position
unsigned int* remap = allocator.allocate<unsigned int>(vertex_count); unsigned int* remap = allocator.allocate<unsigned int>(vertex_count);
unsigned int* wedge = allocator.allocate<unsigned int>(vertex_count); unsigned int* wedge = allocator.allocate<unsigned int>(vertex_count);
@ -227,7 +227,7 @@ index bf1431269d..e384046ffe 100644
// classify vertices; vertex kind determines collapse rules, see kCanCollapse // classify vertices; vertex kind determines collapse rules, see kCanCollapse
unsigned char* vertex_kind = allocator.allocate<unsigned char>(vertex_count); unsigned char* vertex_kind = allocator.allocate<unsigned char>(vertex_count);
@@ -1309,7 +1437,21 @@ size_t meshopt_simplify(unsigned int* destination, const unsigned int* indices, @@ -1317,7 +1445,21 @@ size_t meshopt_simplify(unsigned int* destination, const unsigned int* indices,
#endif #endif
Vector3* vertex_positions = allocator.allocate<Vector3>(vertex_count); Vector3* vertex_positions = allocator.allocate<Vector3>(vertex_count);
@ -250,7 +250,7 @@ index bf1431269d..e384046ffe 100644
Quadric* vertex_quadrics = allocator.allocate<Quadric>(vertex_count); Quadric* vertex_quadrics = allocator.allocate<Quadric>(vertex_count);
memset(vertex_quadrics, 0, vertex_count * sizeof(Quadric)); memset(vertex_quadrics, 0, vertex_count * sizeof(Quadric));
@@ -1401,7 +1543,9 @@ size_t meshopt_simplify(unsigned int* destination, const unsigned int* indices, @@ -1409,7 +1551,9 @@ size_t meshopt_simplify(unsigned int* destination, const unsigned int* indices,
// result_error is quadratic; we need to remap it back to linear // result_error is quadratic; we need to remap it back to linear
if (out_result_error) if (out_result_error)

View file

@ -276,7 +276,15 @@ static void classifyVertices(unsigned char* result, unsigned int* loop, unsigned
{ {
unsigned int target = edges[j].next; unsigned int target = edges[j].next;
if (!hasEdge(adjacency, target, vertex)) if (target == vertex)
{
// degenerate triangles have two distinct edges instead of three, and the self edge
// is bi-directional by definition; this can break border/seam classification by "closing"
// the open edge from another triangle and falsely marking the vertex as manifold
// instead we mark the vertex as having >1 open edges which turns it into locked/complex
openinc[vertex] = openout[vertex] = vertex;
}
else if (!hasEdge(adjacency, target, vertex))
{ {
openinc[target] = (openinc[target] == ~0u) ? vertex : target; openinc[target] = (openinc[target] == ~0u) ? vertex : target;
openout[vertex] = (openout[vertex] == ~0u) ? target : vertex; openout[vertex] = (openout[vertex] == ~0u) ? target : vertex;