You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-24 15:26:15 +00:00
@@ -1,21 +1,21 @@
|
||||
diff --git a/thirdparty/meshoptimizer/meshoptimizer.h b/thirdparty/meshoptimizer/meshoptimizer.h
|
||||
index be4b765d97..463fad29da 100644
|
||||
index d95725dd71..46d28d3ea3 100644
|
||||
--- a/thirdparty/meshoptimizer/meshoptimizer.h
|
||||
+++ b/thirdparty/meshoptimizer/meshoptimizer.h
|
||||
@@ -328,6 +328,11 @@ MESHOPTIMIZER_EXPERIMENTAL void meshopt_encodeFilterExp(void* destination, size_
|
||||
*/
|
||||
MESHOPTIMIZER_EXPERIMENTAL size_t meshopt_simplify(unsigned int* destination, const unsigned int* indices, size_t index_count, const float* vertex_positions, size_t vertex_count, size_t vertex_positions_stride, size_t target_index_count, float target_error, float* result_error);
|
||||
@@ -321,6 +321,11 @@ enum
|
||||
meshopt_SimplifyLockBorder = 1 << 0,
|
||||
};
|
||||
|
||||
+/**
|
||||
+ * Experimental: Mesh simplifier with attribute metric; attributes follow xyz position data atm (vertex data must contain 3 + attribute_count floats per vertex)
|
||||
+ */
|
||||
+MESHOPTIMIZER_EXPERIMENTAL size_t meshopt_simplifyWithAttributes(unsigned int* destination, const unsigned int* indices, size_t index_count, const float* vertex_data, size_t vertex_count, size_t vertex_stride, size_t target_index_count, float target_error, float* result_error, const float* attributes, const float* attribute_weights, size_t attribute_count);
|
||||
+MESHOPTIMIZER_EXPERIMENTAL size_t meshopt_simplifyWithAttributes(unsigned int* destination, const unsigned int* indices, size_t index_count, const float* vertex_data, size_t vertex_count, size_t vertex_stride, size_t target_index_count, float target_error, unsigned int options, float* result_error, const float* attributes, const float* attribute_weights, size_t attribute_count);
|
||||
+
|
||||
/**
|
||||
* Experimental: Mesh simplifier (sloppy)
|
||||
* Reduces the number of triangles in the mesh, sacrificing mesh appearance for simplification performance
|
||||
* Mesh simplifier
|
||||
* Reduces the number of triangles in the mesh, attempting to preserve mesh appearance as much as possible
|
||||
diff --git a/thirdparty/meshoptimizer/simplifier.cpp b/thirdparty/meshoptimizer/simplifier.cpp
|
||||
index a74b08a97d..5e92e2dc73 100644
|
||||
index 5f0e9bac31..797329b010 100644
|
||||
--- a/thirdparty/meshoptimizer/simplifier.cpp
|
||||
+++ b/thirdparty/meshoptimizer/simplifier.cpp
|
||||
@@ -20,6 +20,8 @@
|
||||
@@ -27,7 +27,7 @@ index a74b08a97d..5e92e2dc73 100644
|
||||
// This work is based on:
|
||||
// Michael Garland and Paul S. Heckbert. Surface simplification using quadric error metrics. 1997
|
||||
// Michael Garland. Quadric-based polygonal surface simplification. 1999
|
||||
@@ -371,6 +373,10 @@ static void classifyVertices(unsigned char* result, unsigned int* loop, unsigned
|
||||
@@ -376,6 +378,10 @@ static void classifyVertices(unsigned char* result, unsigned int* loop, unsigned
|
||||
struct Vector3
|
||||
{
|
||||
float x, y, z;
|
||||
@@ -38,7 +38,7 @@ index a74b08a97d..5e92e2dc73 100644
|
||||
};
|
||||
|
||||
static float rescalePositions(Vector3* result, const float* vertex_positions_data, size_t vertex_count, size_t vertex_positions_stride)
|
||||
@@ -427,6 +433,13 @@ struct Quadric
|
||||
@@ -432,6 +438,13 @@ struct Quadric
|
||||
float a10, a20, a21;
|
||||
float b0, b1, b2, c;
|
||||
float w;
|
||||
@@ -52,7 +52,7 @@ index a74b08a97d..5e92e2dc73 100644
|
||||
};
|
||||
|
||||
struct Collapse
|
||||
@@ -469,6 +482,16 @@ static void quadricAdd(Quadric& Q, const Quadric& R)
|
||||
@@ -474,6 +487,16 @@ static void quadricAdd(Quadric& Q, const Quadric& R)
|
||||
Q.b2 += R.b2;
|
||||
Q.c += R.c;
|
||||
Q.w += R.w;
|
||||
@@ -69,7 +69,7 @@ index a74b08a97d..5e92e2dc73 100644
|
||||
}
|
||||
|
||||
static float quadricError(const Quadric& Q, const Vector3& v)
|
||||
@@ -494,6 +517,17 @@ static float quadricError(const Quadric& Q, const Vector3& v)
|
||||
@@ -499,6 +522,17 @@ static float quadricError(const Quadric& Q, const Vector3& v)
|
||||
r += ry * v.y;
|
||||
r += rz * v.z;
|
||||
|
||||
@@ -87,7 +87,7 @@ index a74b08a97d..5e92e2dc73 100644
|
||||
float s = Q.w == 0.f ? 0.f : 1.f / Q.w;
|
||||
|
||||
return fabsf(r) * s;
|
||||
@@ -517,6 +551,13 @@ static void quadricFromPlane(Quadric& Q, float a, float b, float c, float d, flo
|
||||
@@ -522,6 +556,13 @@ static void quadricFromPlane(Quadric& Q, float a, float b, float c, float d, flo
|
||||
Q.b2 = c * dw;
|
||||
Q.c = d * dw;
|
||||
Q.w = w;
|
||||
@@ -101,7 +101,7 @@ index a74b08a97d..5e92e2dc73 100644
|
||||
}
|
||||
|
||||
static void quadricFromPoint(Quadric& Q, float x, float y, float z, float w)
|
||||
@@ -569,6 +610,84 @@ static void quadricFromTriangleEdge(Quadric& Q, const Vector3& p0, const Vector3
|
||||
@@ -574,6 +615,84 @@ static void quadricFromTriangleEdge(Quadric& Q, const Vector3& p0, const Vector3
|
||||
quadricFromPlane(Q, normal.x, normal.y, normal.z, -distance, length * weight);
|
||||
}
|
||||
|
||||
@@ -186,7 +186,7 @@ index a74b08a97d..5e92e2dc73 100644
|
||||
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)
|
||||
@@ -580,6 +699,9 @@ static void fillFaceQuadrics(Quadric* vertex_quadrics, const unsigned int* indic
|
||||
@@ -585,6 +704,9 @@ static void fillFaceQuadrics(Quadric* vertex_quadrics, const unsigned int* indic
|
||||
Quadric Q;
|
||||
quadricFromTriangle(Q, vertex_positions[i0], vertex_positions[i1], vertex_positions[i2], 1.f);
|
||||
|
||||
@@ -196,29 +196,30 @@ index a74b08a97d..5e92e2dc73 100644
|
||||
quadricAdd(vertex_quadrics[remap[i0]], Q);
|
||||
quadricAdd(vertex_quadrics[remap[i1]], Q);
|
||||
quadricAdd(vertex_quadrics[remap[i2]], Q);
|
||||
@@ -1273,13 +1395,19 @@ MESHOPTIMIZER_API unsigned int* meshopt_simplifyDebugLoopBack = 0;
|
||||
@@ -1278,14 +1400,20 @@ MESHOPTIMIZER_API unsigned int* meshopt_simplifyDebugLoopBack = 0;
|
||||
#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, unsigned int options, float* out_result_error)
|
||||
+{
|
||||
+ return meshopt_simplifyWithAttributes(destination, indices, index_count, vertex_positions_data, vertex_count, vertex_positions_stride, target_index_count, target_error, out_result_error, 0, 0, 0);
|
||||
+ return meshopt_simplifyWithAttributes(destination, indices, index_count, vertex_positions_data, vertex_count, vertex_positions_stride, target_index_count, target_error, options, out_result_error, 0, 0, 0);
|
||||
+}
|
||||
+
|
||||
+size_t meshopt_simplifyWithAttributes(unsigned int* destination, const unsigned int* indices, size_t index_count, const float* vertex_data, size_t vertex_count, size_t vertex_stride, size_t target_index_count, float target_error, float* out_result_error, const float* attributes, const float* attribute_weights, size_t attribute_count)
|
||||
+size_t meshopt_simplifyWithAttributes(unsigned int* destination, const unsigned int* indices, size_t index_count, const float* vertex_data, size_t vertex_count, size_t vertex_stride, size_t target_index_count, float target_error, unsigned int options, float* out_result_error, const float* attributes, const float* attribute_weights, size_t attribute_count)
|
||||
{
|
||||
using namespace meshopt;
|
||||
|
||||
assert(index_count % 3 == 0);
|
||||
- assert(vertex_positions_stride > 0 && vertex_positions_stride <= 256);
|
||||
- assert(vertex_positions_stride >= 12 && vertex_positions_stride <= 256);
|
||||
- assert(vertex_positions_stride % sizeof(float) == 0);
|
||||
+ assert(vertex_stride > 0 && vertex_stride <= 256);
|
||||
+ assert(vertex_stride >= 12 && vertex_stride <= 256);
|
||||
+ assert(vertex_stride % sizeof(float) == 0);
|
||||
assert(target_index_count <= index_count);
|
||||
assert((options & ~(meshopt_SimplifyLockBorder)) == 0);
|
||||
+ assert(attribute_count <= ATTRIBUTES);
|
||||
|
||||
meshopt_Allocator allocator;
|
||||
|
||||
@@ -1293,7 +1421,7 @@ size_t meshopt_simplify(unsigned int* destination, const unsigned int* indices,
|
||||
@@ -1299,7 +1427,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
|
||||
unsigned int* remap = allocator.allocate<unsigned int>(vertex_count);
|
||||
unsigned int* wedge = allocator.allocate<unsigned int>(vertex_count);
|
||||
@@ -227,7 +228,7 @@ index a74b08a97d..5e92e2dc73 100644
|
||||
|
||||
// classify vertices; vertex kind determines collapse rules, see kCanCollapse
|
||||
unsigned char* vertex_kind = allocator.allocate<unsigned char>(vertex_count);
|
||||
@@ -1317,7 +1445,21 @@ size_t meshopt_simplify(unsigned int* destination, const unsigned int* indices,
|
||||
@@ -1323,7 +1451,21 @@ size_t meshopt_simplify(unsigned int* destination, const unsigned int* indices,
|
||||
#endif
|
||||
|
||||
Vector3* vertex_positions = allocator.allocate<Vector3>(vertex_count);
|
||||
@@ -250,7 +251,7 @@ index a74b08a97d..5e92e2dc73 100644
|
||||
|
||||
Quadric* vertex_quadrics = allocator.allocate<Quadric>(vertex_count);
|
||||
memset(vertex_quadrics, 0, vertex_count * sizeof(Quadric));
|
||||
@@ -1409,7 +1551,9 @@ size_t meshopt_simplify(unsigned int* destination, const unsigned int* indices,
|
||||
@@ -1415,7 +1557,9 @@ size_t meshopt_simplify(unsigned int* destination, const unsigned int* indices,
|
||||
|
||||
// result_error is quadratic; we need to remap it back to linear
|
||||
if (out_result_error)
|
||||
|
||||
Reference in New Issue
Block a user