rf-geom / ridgeforge Public

changelog

Releases

Twelve releases over two and a half years. Markers: breaking source changes that need an edit, output changed the same input now decimates differently, faster a measurable speed change.

Versioning policy

0.9 series

0.9.4

  • Normals and one UV set now survive decimation; values at a merged vertex are interpolated by the collapse weights. Seam vertices still pick one side - see RF-68.
  • Fixed RF-72: the remesher deleted components of two triangles or fewer instead of leaving them alone.
  • Added DecimateReport::target_reached, so a caller can tell a satisfied target from one blocked by locks without comparing counts itself.
  • Added rfmesh check --self-intersect and --max-pairs, which makes the tool usable as a pipeline gate.
  • Stats::of now takes a MeshView instead of a const Mesh&. Existing calls still compile through the implicit conversion.

0.9.3 faster

  • Collapse heap entries packed from 36 to 28 bytes by folding both version counters into one word. Decimation got 12 % faster on meshes above a million triangles and uses 22 % less peak memory.
  • Fixed the PLY reader on big-endian binary files, which had been reading the vertex count correctly and the coordinates byte-swapped since 0.5.0.
  • Added Stats::oriented. It was previously derivable, awkwardly, by calling orient_consistently on a copy.

0.9.2

  • Added SelfIntersection::resolve, marked experimental from the first day because of RF-41: it cannot separate nested shells and will exhaust its passes on them.
  • Added ResolveOptions::move_limit, defaulting to one average edge length.
  • find gained max_pairs; the search now stops descending once the cap is hit rather than filtering afterwards.

0.9.1

  • fill_holes falls back to a centroid fan when a loop is not nearly planar, instead of producing the badly folded ear-clipped patch it used to. The fan can still self-intersect: RF-57.
  • Progress stage names are now string literals with a documented set of values, so comparing them is legitimate.
  • Build fix for MSVC 19.36, which rejected the digit separators in the example sources when the standard flag was left at its default.

0.9.0 breaking output changed

  • Added Remesher, isotropic only, with optional projection onto the input surface.
  • SelfIntersection::find promoted to stable after the filtered predicates were rewritten; the tolerance parameter it used to accept is gone, because the answer is now exact. Breaking: delete the argument.
  • The collapse guards were reordered so that the cheap locks are tested before the error ceiling. Output changes on meshes where a collapse used to be rejected for cost and is now rejected for a lock, and the reported max_applied_error changes with it.
  • Added RF_SANITIZE to the build.

0.8 and earlier

0.8.0 breaking

  • Added RidgeExtractor: sharp-edge chains as ordered polylines, split at junctions and at sign changes, with ridge and valley distinguished.
  • Added RidgeKind::Boundary so that boundary loops can come out of the same call.
  • Breaking: RidgeOptions::ridge_threshold renamed to min_angle_deg, and the units changed from radians to degrees. A build against the old name fails to compile, which is the intended outcome - a silent unit change would have been far worse.

0.7.0 faster output changed

  • Decimator rewritten around a lazy heap with version counters, replacing the full re-sort after every collapse. 2.3× faster on a million triangles, and the first version where decimation was practical above that size.
  • Added the max_aspect_ratio guard, which rejects collapses that produce slivers. This changes output on almost every mesh, generally for the better.
  • Equal costs are now broken by the smaller vertex index, which made runs reproducible for the first time.

0.6.0

  • Added the Repair namespace: weld_vertices, remove_degenerate, remove_duplicate_triangles, remove_small_components, orient_consistently, fill_holes.
  • Documented RF-68, the welded UV seam, after the third report of it as a bug.

0.5.0

  • PLY and binary STL reading and writing; Format::Auto detection by extension; WriteOptions.
  • PLY files with double coordinates are rejected rather than narrowed: RF-74.

0.4.0 breaking

  • Split the read-only MeshView out of Mesh, so that algorithms that do not mutate cannot.
  • Breaking: Index narrowed from 64 to 32 bits, halving the memory for the triangle array and capping meshes at 2³¹ − 1 vertices. Nobody has yet complained about the cap.

0.3.0 breaking

  • Breaking: exceptions replaced by Result<T> and Status throughout. RF_USE_EXCEPTIONS keeps the old behaviour for allocation failure only.

0.1.0

  • First public release: Mesh, OBJ reading and writing, Stats, and a decimator that re-sorted the whole edge list after every collapse and was, in hindsight, a demonstration rather than a tool.