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
- While the major version is 0, a minor release may break source compatibility. Every such break is listed here with the replacement.
- A patch release only fixes defects and never changes a signature. It may still change output if the defect was in a numerical decision, and then it is marked.
- 1.0 means the public headers stop moving. No date is promised; the remaining work is
resolveand the attribute pipeline, both tracked on the known issues list. - Binary compatibility is not maintained between any two versions. Rebuild dependents.
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-intersectand--max-pairs, which makes the tool usable as a pipeline gate. Stats::ofnow takes aMeshViewinstead of aconst 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 callingorient_consistentlyon a copy.
0.9.2
- Added
SelfIntersection::resolve, marked experimental from the first day because ofRF-41: it cannot separate nested shells and will exhaust its passes on them. - Added
ResolveOptions::move_limit, defaulting to one average edge length. findgainedmax_pairs; the search now stops descending once the cap is hit rather than filtering afterwards.
0.9.1
fill_holesfalls 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.Progressstage 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::findpromoted 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_errorchanges with it. - Added
RF_SANITIZEto 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::Boundaryso that boundary loops can come out of the same call. - Breaking:
RidgeOptions::ridge_thresholdrenamed tomin_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
Decimatorrewritten 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_ratioguard, 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
Repairnamespace: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::Autodetection by extension;WriteOptions. - PLY files with
doublecoordinates are rejected rather than narrowed:RF-74.
0.4.0 breaking
- Split the read-only
MeshViewout ofMesh, so that algorithms that do not mutate cannot. - Breaking:
Indexnarrowed 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>andStatusthroughout.RF_USE_EXCEPTIONSkeeps 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.