The same NIST CTC/FTC STEP corpus, tessellated by NativeCAD and by cascadio (a free, OpenCASCADE-backed converter), scored on triangle count, watertightness, volume error against a reference value, chordal deviation from the exact B-rep, and wall-clock time. Mayo/Open CASCADE and Epic's Datasmith Exporter for CAD get a reproducible methodology in §4/§5 and no numbers, because nobody here has run them.
node benchmarks/tessellation_quality_bench.js yourself and you get the same
benchmarks/out/cadsf-778/report.json this page renders from.
tests/test_cadsf-778_tessellation_bench.js keeps the page's embedded copy of that report
in sync with the file on disk.
Tessellation turns an exact B-rep solid (faces bounded by trimmed curves and analytic
or spline surfaces) into a triangle mesh a GPU, a slicer, or a physics engine can actually consume. Every
tessellator makes the same trade: more triangles track the true surface more closely but cost more time and
memory, so the numbers below are all versions of "how much of that trade did this run buy." The benchmark
bodies are the NIST CTC/FTC STEP corpus (§1/§2's —) plus five closed-form
primitives (§2) chosen because their exact volumes are known formulas, not another mesh.
—). It moves with CPU, load on the
machine at measurement time, and the mesh density chosen — a slower number is not necessarily a
regression without a same-machine, same-commit comparison.maxSag (absolute, model units) and maxSagRatio
(relative to the tessellator's target deviation); meanSag/p95Sag show the
typical and near-worst-case facet, since a single outlier facet can dominate the max.—mm chord tolerance (the
"anchor" — see §1's note). This corpus has no independently published analytic volume, so the anchor is
a self-referential ceiling, not ground truth; §2's primitives are the one comparison on this page with
an independent, closed-form answer.benchmarks/out/cadsf-778/report.json.Provenance for every figure on this page: measured
— on — /
—. The report JSON does not record a commit hash or build id, so this
page does not claim one — reproduce with node benchmarks/tessellation_quality_bench.js
against the commit you have checked out if you need that link.
Per solid: triangle count at the kernel's default (shipped) chord tolerance
— which since CADSF-959 is curvature-adaptive on B-spline faces (pass adaptive: false
to restore the fixed grid these numbers were first taken on) —
watertightness (open / non-manifold / duplicate-directed edges), chordal deviation of the facets from the
exact analytic surface behind them, and volume error against an anchor, the same kernel's volume
at a forced 0.05mm chord tolerance. These are real STEP parts with no published analytic volume, so the
anchor measures how far the shipped default moves from the kernel's own highest-resolution answer;
independent ground truth is §2. A solid whose shipped mesh exceeds the harness's triangle or
wall-clock budget skips the anchor pass, with the reason in its row and in the report's
notes; its triangle count and watertightness are measured regardless.
At a glance — same solids as the table above, so a bar is one row. The first chart is tessellation time vs. body complexity (proxied by triangle count, since that is what the harness actually varies per solid); the second is triangle count at the shipped default vs. the 0.05mm anchor tolerance, for the solids where an anchor pass ran; the third is the watertightness split the summary line above states as a fraction.
Five primitives (box, cylinder, cone, sphere, torus) built directly from
ops/primitives.js, each carrying its own closed-form volume formula. This is the one
comparison on this page with an independent, non-self-referential ground truth.
cascadio (pip install
cascadio) wraps OpenCASCADE's own STEP reader and BRepMesh_IncrementalMesh
tessellator. It converts a whole STEP document to one GLB per call with no public per-solid API, so these
numbers are reported at file granularity; sum NativeCAD's solids per file before comparing with
§1. Volumes are in cascadio's own GLB output units: glTF mandates metres, and whether cascadio rescales
this corpus's native mm has not been independently verified, so compare volume magnitudes across tools
with that in mind. Watertightness is measured after welding exactly-coincident vertex positions, because
cascadio, like most CAD-to-glTF exporters, emits one vertex per triangle corner and a census over the
raw indices would flag nearly every shared edge as "open" (the report's notes carry the
numbers behind this).
notes field carries the thresholds. Triangle count and watertightness are
reported for every solid regardless.tools/cascadio_convert.py attaches to every row; a raw ratio between §1/§2's mm volumes
and §3's is not a real-world discrepancy until the units are checked.ops/primitives.js, CADSB-26), so a row near that ceiling is expected.cascadio, Mayo, OpenCASCADE (OCCT), Datasmith and Unreal Engine are named to identify the software described or measured; they are their owners' marks and NativeCAD is not affiliated with or endorsed by any of those projects. Site-wide notices: legal notes.
Free for education and makers with a registered key · $200 per seat per year · Kernel SDK for products.