Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
d09f90a
demo: Add initial remesh scaffolding
zeux Jul 15, 2026
e6c019d
demo: Remeshing harness now merges input scene
zeux Jul 15, 2026
e9af026
demo: Use a separate pseudo-remesh step before simplification
zeux Jul 15, 2026
faa20ce
demo: Implement basic vertex color transfer
zeux Jul 15, 2026
76fba2c
demo: Implement texture unwrapping and color transfer
zeux Jul 15, 2026
6a93189
demo: Implement texture gutters for remeshing transfer
zeux Jul 15, 2026
5f4ac36
demo: Reimplement wireframe overlay setting
zeux Jul 15, 2026
b7505b1
demo: Fix a few remeshing issues
zeux Jul 16, 2026
88bbfaf
remesher: Add initial scaffolding for remesher
zeux Jul 17, 2026
c4f9264
remesher: Use input mesh bounds to map mesh to the grid
zeux Jul 17, 2026
75c35cf
remesher: Implement initial version of the voxelizer
zeux Jul 17, 2026
d6b4ce6
remesher: Initial implementation of Marching Cubes
zeux Jul 17, 2026
f78cb46
remesher: Implement voxel position accumulation
zeux Jul 17, 2026
4d0f347
remesher: Fix triangle capacity accounting to exclude degenerates
zeux Jul 17, 2026
8f56f4e
remesher: Flip polygonization polarity
zeux Jul 17, 2026
4e6a874
remesher: Reindex tables to remove redundant indirections and flips
zeux Jul 17, 2026
3e93776
remesher: Fix point clamping at the positive grid boundary
zeux Jul 17, 2026
17052c7
remesher: Implement optional sheet thickening
zeux Jul 17, 2026
1916e49
remesher: Add debug option that disables position computation
zeux Jul 20, 2026
b856629
demo: Enhance remesher demo with texture / normal options
zeux Jul 20, 2026
afd153f
remesher: Implement voxel solidification to avoid interior geometry
zeux Jul 20, 2026
d4c02e5
remesher: Use branchless logic for neighbor propagation
zeux Jul 20, 2026
cb60db7
js: Expose new remesh functionality through MeshoptSimplifier
zeux Jul 20, 2026
d8809bc
demo: Integrate voxel remeshing into the demo
zeux Jul 20, 2026
8bba3e5
remesher: Implement voxel position solve using QEFs
zeux Jul 21, 2026
6f59f0d
demo: Assorted fixes/improvements to remeshing demo
zeux Jul 21, 2026
61a4533
remesher: Reuse a slice of cube bits across iterations
zeux Jul 21, 2026
5fa4831
remesher: Solve voxel positions in a separate pass
zeux Jul 21, 2026
5600d9d
remesher: Skip quadric accumulation if solve is disabled
zeux Jul 21, 2026
33ece83
remesher: Extract voxel row packing into a function and optimize it
zeux Jul 21, 2026
a7dfdb2
js: Expose Solve flag in remesher as well
zeux Jul 21, 2026
834b038
demo: Reformat remesh.html with Prettier
zeux Jul 21, 2026
6ecce87
remesher: Skip degenerate triangles during voxelization
zeux Jul 22, 2026
2cbd55b
remesher: Separate position solve so that we solve each voxel once
zeux Jul 22, 2026
8954694
remesher: Fix debug vertex placement and make option internal
zeux Jul 24, 2026
14f9a02
js: Fix remeshOptions to align with new native numbering
zeux Jul 24, 2026
1437a98
demo: Assorted fixes/improvements in remeshing demo
zeux Jul 23, 2026
5dc5b97
demo: Add remesh call to the testing harness
zeux Jul 24, 2026
53d724e
remesher: Add header documentation and fix function attributes
zeux Jul 25, 2026
c9d3635
remesher: Use pre-computed table for triangle counting
zeux Jul 25, 2026
cf5c8d7
js: Update MeshoptSimplifier Wasm binary
zeux Jul 26, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ set(SOURCES
src/partition.cpp
src/quantization.cpp
src/rasterizer.cpp
src/remesher.cpp
src/simplifier.cpp
src/spatialorder.cpp
src/stripifier.cpp
Expand Down
4 changes: 2 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,8 @@ WASM_DECODER_EXPORTS=meshopt_decodeVertexBuffer meshopt_decodeIndexBuffer meshop
WASM_ENCODER_SOURCES=src/vertexcodec.cpp src/indexcodec.cpp src/vertexfilter.cpp src/vcacheoptimizer.cpp src/vfetchoptimizer.cpp src/spatialorder.cpp tools/wasmstubs.cpp
WASM_ENCODER_EXPORTS=meshopt_encodeVertexBuffer meshopt_encodeVertexBufferBound meshopt_encodeVertexBufferLevel meshopt_encodeIndexBuffer meshopt_encodeIndexBufferBound meshopt_encodeIndexSequence meshopt_encodeIndexSequenceBound meshopt_encodeVertexVersion meshopt_encodeIndexVersion meshopt_encodeFilterOct meshopt_encodeFilterQuat meshopt_encodeFilterExp meshopt_encodeFilterColor meshopt_optimizeVertexCache meshopt_optimizeVertexCacheStrip meshopt_optimizeVertexFetchRemap meshopt_spatialSortRemap sbrk __wasm_call_ctors

WASM_SIMPLIFIER_SOURCES=src/simplifier.cpp src/vfetchoptimizer.cpp src/indexgenerator.cpp tools/wasmstubs.cpp
WASM_SIMPLIFIER_EXPORTS=meshopt_simplify meshopt_simplifyWithAttributes meshopt_simplifyWithUpdate meshopt_simplifyScale meshopt_simplifyPoints meshopt_simplifySloppy meshopt_simplifyPrune meshopt_optimizeVertexFetchRemap meshopt_generatePositionRemap sbrk __wasm_call_ctors
WASM_SIMPLIFIER_SOURCES=src/simplifier.cpp src/remesher.cpp src/vfetchoptimizer.cpp src/indexgenerator.cpp tools/wasmstubs.cpp
WASM_SIMPLIFIER_EXPORTS=meshopt_simplify meshopt_simplifyWithAttributes meshopt_simplifyWithUpdate meshopt_simplifyScale meshopt_simplifyPoints meshopt_simplifySloppy meshopt_simplifyPrune meshopt_remesh meshopt_optimizeVertexFetchRemap meshopt_generatePositionRemap sbrk __wasm_call_ctors

WASM_CLUSTERIZER_SOURCES=src/clusterizer.cpp src/meshletutils.cpp tools/wasmstubs.cpp
WASM_CLUSTERIZER_EXPORTS=meshopt_buildMeshletsBound meshopt_buildMeshletsFlex meshopt_buildMeshletsSpatial meshopt_computeClusterBounds meshopt_computeMeshletBounds meshopt_computeSphereBounds meshopt_optimizeMeshlet sbrk __wasm_call_ctors
Expand Down
21 changes: 20 additions & 1 deletion demo/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1677,6 +1677,21 @@ void tangents(const Mesh& mesh)
printf("Tangents : %d corners, %d splits in %.2f msec\n", int(mesh.indices.size()), int(newvertices.size() - mesh.vertices.size()), (end - start) * 1000);
}

void remesh(const Mesh& mesh, char name, int resolution, unsigned int options = 0)
{
double start = timestamp();
size_t capacity = meshopt_remesh(NULL, 0, &mesh.indices[0], mesh.indices.size(), &mesh.vertices[0].px, mesh.vertices.size(), sizeof(Vertex), resolution, options);
double middle = timestamp();
std::vector<float> triangles(capacity * 3 * 3);
size_t count = meshopt_remesh(&triangles[0], capacity, &mesh.indices[0], mesh.indices.size(), &mesh.vertices[0].px, mesh.vertices.size(), sizeof(Vertex), resolution, options);
double end = timestamp();

assert(count <= capacity);

printf("Remesh%c : %d triangles => %d triangles in %.2f msec (count %.2f msec, compute %.2f msec)\n", name,
int(mesh.indices.size() / 3), int(count), (end - start) * 1000, (middle - start) * 1000, (end - middle) * 1000);
}

void nanite(const std::vector<Vertex>& vertices, const std::vector<unsigned int>& indices); // nanite.cpp

bool loadMesh(Mesh& mesh, const char* path)
Expand Down Expand Up @@ -1868,6 +1883,9 @@ void process(const char* path)

tangents(mesh);

remesh(mesh, ' ', 128);
remesh(mesh, 'T', 128, meshopt_RemeshThicken);

if (path)
processDeinterleaved(path);
}
Expand All @@ -1878,7 +1896,8 @@ void processDev(const char* path)
if (!loadMesh(mesh, path))
return;

encodeMeshletsDXR(mesh, 128, /* min_exp= */ -14);
remesh(mesh, ' ', 128);
remesh(mesh, 'T', 128, meshopt_RemeshThicken);
}

void processNanite(const char* path)
Expand Down
Loading