Skip to content

Changelog ​

Changelog ​

All notable changes to this project are documented here. Versions follow Semantic Versioning. Format follows Keep a Changelog.

[2.2.0] — 2026-11-06 ​

Added ​

  • surface: Mass properties of a closed body

  • pose: Inertia in the world frame and the principal frame

  • curve: Mass properties of the region bounded by a curve

  • cli: Fossilizer --mass_properties

  • surface: Sampled deviation from another surface

  • surface: Certified upper bound of the surface deviation

  • device: Surface deviation on the device

  • curve: Deviation and Hausdorff distance of curves

  • cli: Fossilizer --compare

  • surface: Feature edges, corners and polylines

  • amr: Refinement along feature edges

  • query: Distance to the nearest feature edge

  • curve: Corners, corner tags and distances

  • cli: Feature edges as VTK, fossilizer --features

  • surface: Ray thickness and gap per facet

  • surface: Medial thickness and gap, the shrinking ball

  • amr: Thin regions and refinement of walls thinner than the cell

  • curve: Thickness and gaps of curves, thin runs and tags

  • cli: Thickness as VTK, fossilizer --thickness

  • predicates: Implicit points and exact predicates on them

  • boolean: Exact arrangement on implicit points, selection by patches

  • boolean: Opt-in exact vertex weld

  • surface: Named patches, read and written

  • surface: Named patches through the pipeline

  • boolean: Named patches through booleans

  • remesh: Named patches through remeshing

  • query: Patch of the closest facet in the IB queries

  • curve: Named patches on 2-D curves

  • distance: Distance between two bodies

  • distance: Body-body distance with poses

  • distance: Pairs of bodies closer than a cutoff

  • curve: Distance between two curves

Documentation ​

  • Date the GPU validation of the device build on 8c78a46

  • Booleans validated by identities, limits from the evidence

  • boolean: The exact arrangement, the weld, the degenerate map

  • patches: Named patches, cookbook, tutorial, figures, CLI

  • distance: Body-body distance, cookbook, tutorial, figures, CLI

Fixed ​

  • surface: The centroid of the enclosed volume

  • dt: Grow the Delaunay triangle store

  • boolean: Near-coincident surfaces crack or lose volume

  • predicates: Exact products without ieee_fma

  • io: ASCII STL lines longer than 80 characters lost digits

  • surface: An empty patch writes no solid block

Performance ​

  • aabb: Distribute facets to the octree in linear time

  • boolean: One bounded query per sub-triangle in the selection

[2.1.0] — 2026-11-05 ​

Added ​

  • alpha-wrap: Carve on a cell grid, wrap on the offset surface

  • alpha-wrap: Coarsen the wrap by constrained edge collapses

Changed ​

  • alpha-wrap: Remove the MVP octree stages ⚠ BREAKING CHANGE

Documentation ​

  • Figures of the tutorial, computed by FOSSIL

  • Figures of the cookbook, computed by FOSSIL

  • One gallery for the landing page and the README

  • Animations in the figure renderer

  • Animations of hole filling and of a moving body

  • Animations of the booleans and of decimation

  • Animated cards in the gallery

  • Computed figures on the booleans, alpha wrap, Laplacian, curvature and decimation pages

  • Computed figures on the remeshing, marching-cubes, self-intersection, smoothing and winding-number pages

  • Drop the ParaView pictures the computed figures replace

  • alpha-wrap: What the MVP wrap guarantees, measured

  • The figures and numbers after the marching-cubes and curvature fixes

  • alpha-wrap: The wrap on the offset surface, measured

  • self-intersection: Regenerate the dragon figure after #55

  • alpha-wrap: The coarsened wrap, re-measured

Fixed ​

  • facet: Area from the cross product, never NaN

  • marching-cubes: Watertight output, crossings welded bit for bit

  • curvature: The foot curvature on a collapsed facet

  • self-intersection: Decide the pairs sharing a vertex exactly

  • alpha-wrap: Keep repaired vertices at the offset

Performance ​

  • alpha-wrap: Decide point contacts in floating point

[2.0.0] — 2026-11-04 ​

Added ​

  • tests: Add concurrency test for fossil distance calculations

  • ib_generator: Print CLI options and rework xall export bounds

  • distance: GPU-offloadable distance_many_device path (issue #20 Step 5)

  • geometry: Add a plain-real, device-callable solid-angle core

  • winding: Persistent per-node fast-winding-number cache

  • winding: Iterative second-order fast-winding-number traversal

  • distance: Add the SIGN_FAST_WINDING_NUMBER sign algorithm

  • ib_generator: List fast_winding_number among the sign algorithms

  • repair: Extract boundary loops for hole filling

  • repair: Triangulate boundary loops by Liepa minimum-weight DP

  • repair: Add surface%fill_holes

  • repair: Optional hole filling in sanitize

  • fossilizer: Add --fill_holes, --max_hole_edges, --max_hole_size

  • distance: Fast-winding-number sign in distance_many_device

  • distance-field: Narrow-band exact distances on rectilinear grids

  • distance-field: Signs outside the band by flood fill

  • distance-field: Far field by fast sweeping on stretched grids

  • distance-field: Narrow band on the GPU (use_device)

  • ib_generator: Far field from the distance field, not copied values

  • ib_generator: --squared writes the former output quantity

  • arrangement: Exact pair classification and canonical cut points

  • boolean: Cut and classify coplanar overlaps

  • arrangement: Close T-junctions; coplanar boolean matrix passes

  • csr: Conjugate gradient solver for sparse SPD systems

  • repair: Refine hole patches to the surrounding density

  • repair: Fair hole patches with a bi-Laplacian solve

  • repair: Refine and fair holes from sanitize and fossilizer

  • predicates: Exact orient2d

  • curve: Closed planar curves for 2-D geometry

  • curve: Segment BVH, signed distance and self-intersections

  • curve: 2-D winding number, inside test and open loops

  • curve: Slice a surface by an axis-aligned plane

  • curve: Repair loops (join, close, merge, orient)

  • curve: Batched distances on the CPU and the device

  • distance-field: 2-D fields from curves

  • surface: Shells and bodies for surfaces and curves

  • surface: Batched rich queries

  • surface: Rich queries on the device

  • curve: Batched rich queries on curves

  • distance-field: Vector level set

  • query: Probe and image points with visibility

  • query: Report multiple foot points

  • box: Box predicates for AMR tagging

  • box: Classify AMR boxes against surfaces and curves

  • box: Box classification on the device

  • box: Signed tag bands on a block of cells

  • line: Exact crossings of grid lines with the wall

  • line: Grid-line crossings on the device

  • cut: Exact 2-D cut cells

  • cut: 3-D cut-cell faces from exact plane sections

  • cut: 3-D cut-cell volumes by the divergence theorem

  • pose: Rigid poses and body-frame point queries

  • pose: Body-frame queries on the device

  • pose: Rigid move with tree refit

  • pose: Fresh and dead points between two poses

  • field: Eikonal diagnostic of a distance field

  • query: Wall distance with body id and early cutoff

  • query: Curvature at the foot point

  • query: Grid-adapted surface and curve markers

  • box: Fast winding number as the default sign of box tagging ⚠ BREAKING CHANGE

  • curvature: Pointwise-convergent curvature by a local jet fit

  • pose: Swept geometry of a translating curve on a fixed grid

  • pose: Exact swept geometry of a translating surface

  • predicates: Exact orient3d

  • cut: Fluid pieces of the 3-D cut cells

  • cut: Measures of the fluid pieces of the 3-D cut cells

  • curve: Optional self-intersection checks of curves and swept inputs

Changed ​

  • aabb: Inline aabb_object into aabb_node_object (issue #20 Step 2)

  • distance: Iterative explicit-stack bvh traversal (issue #20 Step 3)

  • distance: Device-callable bvh kernel chain (issue #20 Step 4)

  • distance: Drop obsolete nvfortran 26.1 device workarounds (issue #20)

Documentation ​

  • curvature: Make curvature example snippets compile standalone

  • nvidia: Correct manual-validation workflow + narrow tests-nvidia target

  • install: Correct the minimum gfortran version (issue #24)

  • install: Replace stale submodule and CMake instructions

  • advanced: Add the GPU distance queries page

  • features: List the batch and GPU distance queries

  • distance: Correct the exit_device docstring

  • advanced: Describe the BVH depth cap instead of the overflow risk

  • api: State what the transforms leave stale and how to refresh it

  • api: Document the re-analyze after sanitize_normals flips

  • api: Reflections now preserve orientation

  • Describe the generic sign rays, per-shell orientation and rotate

  • Document the fast-winding-number sign and the rebuilt winding number

  • Add the hole-filling page and list fill_holes

  • Document the fast-winding-number sign on the device

  • Document the signed-distance field

  • Coplanar booleans

  • Hole refinement and fairing

  • boolean: Update stale module header comments

  • 2-D geometry (curves)

  • Immersed-boundary queries

  • AMR tagging

  • Sign algorithms at sharp features

  • Cut-cell geometry

  • Moving bodies

  • Wall distance and field diagnostic

  • Foot curvature and grid-adapted markers

  • Swept geometry of moving bodies

  • Exact swept geometry of a translating surface

  • Exact orient3d and 3-D fluid pieces

  • Measures of the 3-D cut-cell pieces

  • surface: Correct the is_manifold and clip-box comments

  • Refactor the documentation on the sibling skeleton

  • A self-intersecting wall breaks the swept-geometry balance

  • The regression and validation test tiers

  • Self-intersection pairs sharing one vertex

Fixed ​

  • distance: Work around nvfortran 26.1 codegen bugs in device build (issue #20 Step 4)

  • docs: Regenerate package-lock.json for vitepress 1.6 downgrade

  • docs: Pin esbuild override to 0.25.x for vite 5.4 compatibility

  • ci: Run install smoke test from the release workflow

  • build: Exclude third-party docs/ and scripts/ sources from builds

  • build: Exclude the FoXy benchmarks from the builds

  • build: Exclude the StringiFor scripts from the builds

  • tests: Avoid gfortran ICE on associate with an operator selector

  • aabb: Cap the SAH BVH depth to bound the traversal stack

  • sanitize: Rebuild derived data after sanitize_normals flips facets

  • facet: Keep the outward orientation through reflections

  • facet: Keep the orientation through an improper rotation matrix

  • distance: Cast the ray-intersection sign rays off the axes

  • sanitize: Orient each closed shell by its nesting parity

  • winding: Use the persistent cache; correct sign and octree counts

  • distance-field: Build the module into libfossil and re-export it

  • ib_generator: Read list options with get_varying under nvfortran

  • repair: Keep sharp edges when fairing hole patches

  • build: Split code lines over 132 columns

  • distance: Accurate point-triangle distance near the surface

  • remesh: Keep sharp edges split during remeshing

  • build: Split a test line over 132 columns

  • build: Follow the VecFor _dev rename of device procedures

  • distance: Robust closest point on needle triangles

  • device: Restore the bit-exact nvfortran device build

  • aabb: Drop the unused octree nodes when the depth is lowered

  • self-intersection: Report crossings of facets sharing one vertex

Performance ​

  • distance-field: OpenMP fast sweeping, bit-exact with serial

  • distance-field: Sign point queries on the device too

Security ​

  • docs: Untrack docs/package-lock.json and gitignore it

[1.3.3] — 2026-05-14 ​

Performance ​

  • distance: Split point-to-triangle kernel into lean and rich faces

[1.3.2] — 2026-05-14 ​

Added ​

  • surface: Add OpenMP-parallel distance_many batch query

[1.3.1] — 2026-05-14 ​

Performance ​

  • distance: Flatten BVH leaf facets into a contiguous distance SoA

[1.3.0] — 2026-05-14 ​

Documentation ​

  • advanced: Document cotangent Laplacian, curvature, smoothing + sync hero

[1.2.13] — 2026-05-14 ​

Added ​

  • laplacian,surface: Cotangent Laplacian + barycentric mass (issue #18 §2.1)

  • curvature,surface: Per-vertex Gaussian curvature (issue #18 §2.4)

  • curvature,surface: Per-vertex signed mean curvature (issue #18 §2.4)

  • smoothing,surface: Explicit Laplacian + Taubin lambda|mu (issue #18 §2.3)

Documentation ​

  • advanced: Add user-facing pages for the 9 advanced primitives

[1.2.12] — 2026-05-13 ​

Added ​

  • alpha-wrap: Step 1 — leaf-size-α octree (issue #18 §1.6)

  • alpha-wrap: Step 2 — inside/outside flood fill (issue #18 §1.6)

  • alpha-wrap: Step 3 — boundary surface extraction (issue #18 §1.6)

  • alpha-wrap: Step 4 — vertex projection toward input (issue #18 §1.6)

  • alpha-wrap: Step 5 — surface%alpha_wrap capstone TBP (issue #18 §1.6)

[1.2.11] — 2026-05-13 ​

Added ​

  • fossil: Implement SDF functionality with AABB tree ray query and test coverage

  • sdf: Implement Laplacian smoothing for SDF values with test coverage

  • sdf,surface: Step 3 — GMM clustering + segment_sdf TBP (issue #18 §1.9)

[1.2.10] — 2026-05-13 ​

Added ​

  • fossil: Implement ray query functionality with test coverage

  • fossil: Implement AABB tree ray query with test coverage

  • ray-query,surface: Step 3 — any-hit early-exit (issue #18 §2.5)

Fixed ​

  • fossil_decimate: Prevent out-of-bounds heap access with nested guards

[1.2.9] — 2026-05-13 ​

Added ​

  • remesh: Isotropic remeshing foundation, steps 1-4 (issue #18 §1.7)

  • remesh: Step 5 — edge flip pass for valence balancing (issue #18 §1.7)

  • remesh: Step 6 — relax + projection (issue #18 §1.7)

  • remesh,surface: Step 7 — feature lock + surface TBP (issue #18 §1.7)

[1.2.8] — 2026-05-13 ​

Added ​

  • decimate,surface: QEM mesh decimation (issue #18 §1.3)

[1.2.7] — 2026-05-13 ​

Added ​

  • mc,surface: Marching cubes isosurface extraction (issue #18 §1.5)

[1.2.6] — 2026-05-13 ​

Added ​

  • predicates,arrangement: Boolean foundation (issue #18 §1.1 stage 1)

  • dt: 2D Delaunay triangulation, Phase 1 (issue #18 §1.1 stage 2)

  • dt: Constrained Delaunay triangulation, Phase 2 (issue #18 §1.1 stage 2)

  • boolean: Mesh-mesh booleans, BOOL_DIFFERENCE MVP (issue #18 §1.1)

  • facet: Clip tri-tri intersection segments to both triangles (issue #18 §1.1)

  • boolean: Coplanar-aware shared-boundary tagging (issue #18 §1.1)

  • boolean: Wire UNION/INTERSECT/SYMDIFF + complete §1.1 (issue #18 §1.1)

[1.2.5] — 2026-05-13 ​

Added ​

  • surface: Add self-intersection detection (issue #18 §1.2)

[1.2.4] — 2026-05-12 ​

Added ​

  • surface: Add generalized / fast winding number (issue #18 §1.4)

Documentation ​

  • guide: Add API companion guide with CI-verified snippets

[1.2.3] — 2026-05-12 ​

Added ​

  • facet,surface: Expose facet%area() and surface%get_area() (#7)

[1.2.2] — 2026-05-12 ​

Added ​

  • rotate: Add optional center argument for body-frame rotation (#6)

[1.2.1] — 2026-05-12 ​

Added ​

  • lib: Implement vertex pool object for fossil surface handling

Changed ​

  • surface: Make vertex pool the source of truth for coincidence (#5)

Fixed ​

  • clip: Use full SAT for triangle-AABB overlap (#1)

[1.2.0] — 2026-05-12 ​

Added ​

  • distance: Correct AABB traversal and add pseudo-normal sign

  • surface: Implement connectivity symmetry checks for fossil surfaces

  • surface: Expand sanitization pipeline and add validity predicates

  • aabb: Auto-tune octree refinement depth from facet count

  • aabb: Scaffold tree-kind selector for upcoming SAH BVH

  • aabb: Implement SAH BVH builder

  • aabb: Make SAH BVH queryable via tree-kind dispatch

Documentation ​

  • Refresh user-facing docs after the signed-distance arc

Fixed ​

  • block: Avoid associate alias as allocate bound; wrap long lines

  • surface: Orient sanitize_normals outward, populate pseudo-normals ⚠ BREAKING CHANGE

Performance ​

  • aabb: Switch default tree to SAH BVH

[1.1.0] — 2026-05-11 ​

Added ​

  • api: Add optional status argument to mutating procedures (audit #14 S1)

  • api: Add optional status argument to mutating procedures (audit #14 S1)

Changed ​

  • aabb-tree: Encapsulate aabb_tree_object state via accessors

  • surface,file: Encapsulate components and remove stale API docs ⚠ BREAKING CHANGE

  • facet: Collapse edge fields and replace edge_dir with integer ⚠ BREAKING CHANGE

  • surface: Remove unimplemented compute_mesh_distance ⚠ BREAKING CHANGE

  • api: Replace sign_algorithm string with integer enum ⚠ BREAKING CHANGE

  • surface: Encapsulate surface fully, delete file_stl_object ⚠ BREAKING CHANGE

Fixed ​

  • api: Define intent(out) and stop on invalid enums ⚠ BREAKING CHANGE

  • api: Guard centroid, strict ascii prefix, add finalisers

  • io: Size-based STL probe and EOF/iostat guards on facet reads

  • surface: Replace order-dependent vertex merge with union-find

  • Drop custom assignment overloads, rely on intrinsic assignment

  • surface: Error stop on ambiguous translate/resize arguments

  • api,surface: Rename analize, warn on residual disconnected facets after sanitize ⚠ BREAKING CHANGE

[1.0.12] — 2026-05-09 ​

Documentation ​

  • Fix src_dir path and update package dependencies

  • cliff: Remove unused github remote section from cliff.toml

Fixed ​

  • fobos: Correct gcov_analyzer flag syntax in makecoverage-analysis rule

  • scaffold: Update release script to handle fobos directory changes

  • scaffold: Improve trunk branch detection in release script

  • scaffold: Handle missing trunk branch detection in release script

  • scaffold: Improve git fetch error handling in release script

ci ​

  • Modernize CI/CD workflows and actions ⚠ BREAKING CHANGE

[1.0.7] — 2026-02-21 ​

Added ​

  • Add full VitePress guide and modernise project tooling

[1.0.6] — 2024-09-24 ​

Fixed ​

  • update: Update third party submodules