← Back to the portfolio

CurioMesh

A free, open-source (GPLv3) Blender add-on that retopologises dense sculpts and photogrammetry scans into all-quad meshes, part by part, with a camera check on every result. Python for the Blender side, Rust for the slow steps.

The problem

Artists get dense meshes from sculpts, scans and high-poly game assets, and need a clean low-poly all-quad version. Automatic remeshers redo the whole object and give you little way to tell whether the result still looks like the original. Big scans make it worse: a run can take most of an hour.

CurioMesh works one loose part at a time, measures every result against the source, and lets the artist redo only the part that still looks wrong. It runs on the user's PC and uploads nothing.

How it works

Per-part retopology

You say what the mesh is for (game asset, animation, subdivision, scan cleanup and so on), press one button, and the add-on reduces the model one loose part at a time. Nothing in the scene changes until Apply. The original is kept as an immutable reference, and work happens on separate objects.

Camera check from six sides

The add-on renders the original and the result from six sides and measures View changed: the share of the picture that differs. The camera also chooses between layouts per part, keeps a layout only where the view holds, and undoes a repair it dislikes. The default Game Asset setting allows 6% of the view to change.

Python and Rust, and why

The Blender integration, panel and orchestration are Python, because that is what Blender exposes. The slow steps (camera pictures, pairing, quad closing, reduction, crossing checks, fitting) live in a Rust crate under native/ that uses all CPU cores and no GPU. In 0.6.0 the topology checks and quad closing got about 30x faster, and a 1.26M-face scan went from 47 to about 5 minutes with Blender staying usable. Every zip ships the compiled core for Windows, Linux and macOS, and an automatic Python fallback keeps the add-on working where the native core cannot load. The Blender extensions site allows no compiled code, so that listing is the Python-only build.

CI that checks Rust against the Python reference

Two jobs run on every push. The Python job runs ruff and the unit tests. The native job builds the Rust core with cargo, then runs equivalence tests that compare it with the Python implementation. The Python code is the reference, so a faster Rust path cannot quietly change results. Tests that need Blender itself exist but are not run in CI, so the badge does not cover the add-on inside Blender.

Results

Every example ran the real add-on on a free CC0 Poly Haven model at default Game Asset settings (Keep Detail, Detail 6%), on Blender 5.2.3 LTS. Original on the left, result on the right.

Wireframe of an air compressor before and after CurioMesh
Old military compressor: 79,042 faces to 15,881 quads, 5.6% of the view changed.
Wireframe of a chess set before and after CurioMesh
Chess set (33 pieces): 76,832 faces to 10,110 quads, 3.6% of the view changed.
Wireframe of a concrete road barrier before and after CurioMesh
Concrete road barrier: 60,928 faces to 987 quads, 5.9% of the view changed. Quads follow the shape, so on smooth surfaces they can look slanted.
Three CurioMesh layout styles: Clean Rows on a bust and a scan, and a low-poly game asset with a baked normal map
Layout styles: Clean Rows on a sculpt and on a scan, and a 47,214-face sculpt reduced to 1,068 faces with a baked normal map.

On the large scans, a 1,260,423-face coast-rocks scan became 434,995 quads in 5 minutes, and a 1,537,926-face cliff scan became 362,292 quads in 7 minutes, on a PC that was also doing other work. Both stayed all quads. The README lists all 20 models and states its own limits: quads can look slanted on smooth surfaces, fine ornaments go jagged at high reduction, and big scans take minutes.

Engineering decisions

These are design choices recorded in the repository's docs (docs/ALGORITHM.md, docs/ORIGINALITY.md, the README).

How it was built

AI coding agents (Claude, Codex) write most of the code; I spec, review, test and measure it. The commit history shows this plainly, with co-author trailers on most recent commits. My part is the design, the choice of what to measure, accepting each release against the numbers above, and the written limits.