Release v3.2.0.3

Updates
This release brings MeshLib to Rust and Java. Key algorithms are faster than in 3.1.4: Booleans run 1.7 to 4.7 times faster and parallel decimation 4 to 6 times faster. The Rust crate is on crates.io, the Java package on Maven Central, and every example now exists in C++, Python, C, C#, Rust and Java. Point clouds can be aligned without an initial guess, the Python modules are rebuilt over the C bindings and work with future Python versions, the AABB tree goes 4-wide for faster projections, ray casting and collision queries, Draco joins the file formats, and G-code and LAS/LAZ point clouds can now be saved.
Rust and Java
Two more languages join C++, Python, C, C# and JavaScript:
- Rust: the
meshlibcrate on crates.io. The native libraries are downloaded on the first build or bundled with the crate,no_stdbuilds are supported, andinto_result()andinto_option()turn returned expected and optional values into Rust types. Add it withcargo add meshlib@3.2.0-3. - Java:
com.meshinspector:meshlibon Maven Central, for JDK 22 and newer. The native libraries are downloaded on first use,Expected<T>results are unwrapped, and errors are thrown as exceptions.
The C, Rust and Java bindings now use readable names instead of numbered overload suffixes, and every example exists in C++, Python, C, C#, Rust and Java, all run by CI, including the new BooleanBenchmark. The Rust setup guide and the Java setup guide walk through the installation, and the API reference now covers Rust and Java.
Faster key algorithms ⚡
Booleans and decimation, measured against 3.1.4:
- Booleans run 1.7 to 4.7 times faster, depending on the models. A union of two shifted copies of a 2-million-triangle Nefertiti scan takes 55 ms instead of 105 ms, a union of the scan with a noisy copy of itself 99 ms instead of 370 ms, and a dental union of about 500K triangles 11 ms instead of 51 ms. Many steps of Boolean and
cutMeshare now parallel or allocation-free, and both allocate with mimalloc. - Decimation: parallel decimation of a 2-million-triangle scan to 10% of its triangles is about 6 times faster, 0.19 s instead of 1.13 s, and a 291K-triangle dental model about 4 times faster, 30 ms instead of 124 ms.
Measured on an Apple M5 with the MeshLib 3.1.4.297 and 3.2.0.3 Python packages: the fastest of 30 runs per test and version, in 3 rounds. Loading, copying and packing the meshes is not timed. Both versions return the same number of triangles, or within about 0.01% for the noisy and dental Booleans.
Also faster or smaller:
- AABB tree: now 4-wide with up to 4 triangles per leaf, and leaves store the triangle vertices, which speeds up projections, ray casting and collision queries. The tree is also built faster and in parallel.
- Mesh building:
MeshBuilderbuilds the topology of large meshes in parallel. - Memory: mimalloc in MeshLib libraries and executables on all platforms.
- Smaller bindings: the C# assembly
MRDotNet2.dllis 22% smaller with its DllImports at class scope, the C bindings use minimal containers, and the JavaScript module is served Brotli-compressed. - Third-party: vcpkg 2026.10.16 and libE57Format 3.4.1, and support for OpenVDB 14 and OpenCASCADE 8.
Point clouds that find each other
ICP refines an alignment, but it needs the two clouds roughly in place first. New functions find that starting pose without any initial guess:
computeFPFH: a Fast Point Feature Histogram for every point, describing how the normals turn around it.findFPFHMatches: pairs of points with the closest descriptors in two clouds, the candidate correspondences.findRigidXfRansac: the rigid transformation behind those matches, even when most of them are wrong. Optional overlap scoring holds up when only a few percent of the matches are correct, as on partial scans.findUniqueFPFHPointsandcomputeFPFHUniqueness: the points whose descriptors stand out, and a per-point score of how much.
This is the pipeline behind Auto Initial in the Registration tool of MeshInspector.
New geometry tools
- Ball pivoting:
findBallPivotingSeed,findBallPivotingComponent,findBallPivotingTrianglesandfindBallPivotingMeshbuild the outer shape of a point cloud without normals. - Denoising with creases:
meshDenoiseWithCreaseskeeps caller-given creases sharp, anddenoiseNormals,NormalsToPointsandmeshDenoiseViaNormalscan work in a region. - Sharp edges and patches:
findSharpEdges,getAllComponentsMapBySharpEdges,getAllComponentsFaces,patchMeshByGroupsandcutAroundVertSets. - Inside volume:
makeInsideMeshVolumeby precise ray casting, andmakeInsideMeshVolumeVdbthrough OpenVDB, which fills cavities and unites self-overlaps. - Shape measures:
computeLocalConvexityfor meshes and point clouds, and discrete curvatures for all vertices at once. - Self-intersections:
selfBooleanhandles nested self-intersections and maps result faces to input faces, andSelfIntersections::fixgets a SelfBoolean method. - Surface distances:
SurfaceDistanceBuildertakes point sources, finite lines, and separate start edges and start points, and updates across seams. - Decimation: with
DecimateSettings::partsModeset toAABBTree, parallel decimation (subdivideParts> 1) takes its parts from the AABB tree without a priorpackOptimally, which still gives the best performance. SettingpreventNormalFlipsto false turns off the normal flip check: together withmaxTriangleAspectRatio = FLT_MAX, this makes decimation faster, but some triangles may come out inverted. - Double precision:
MeshTriPointd,EdgePointdandEdgeSegmentd. - Partial updates:
Mesh::updateCachesandAABBTree::refittake the changed vertices, and relaxation refits the trees instead of dropping them. - Also new:
eliminateDoubleTriscan remove pillows,fixMeshDataDegeneracieskeeps mesh attributes,uniteManyMeshesgets anew2oldFacesoutput, and there aregetRegionInnerVerts,FindOverlappingSettings::minNormalDot,SubdivideSettings::onlyNearNotFlippable,decomposeMatrix3withsignedScale, publicMR::nextUpandMR::nextDown, andBitSet::atomicTestSet.
More robust Booleans and cuts
- Boolean no longer loses a mesh when the meshes only touch, connects lone contours by monotone chords instead of subdividing faces, and treats a component projecting on the boundary of an open mesh as outside it.
cutMeshuses exact predicates for the planar sweep inside cut triangles, gets a force-fill mode that splits crossing contours, and is fixed along open borders and in the contour conversions near boundary edges.- Decimation no longer folds the neighbours of a deleted triangle onto each other, tries the other end of an edge when a collapse fails, and handles small closed tetrahedra.
- Ray casting:
rayTriangleIntersectandrayMeshIntersectAllwith aLine3dfind near-coplanar hits reliably. - Also fixed:
makeConvexHullno longer loses vertices in the plane of the first triangle, remesh edge flips no longer deviate from the surface, and intersection contours no longer walk endlessly.
Python, rebuilt on the C bindings
The Python modules are now built over the C bindings instead of pybind11. They use only the limited API of Python, so the wheels work with Python 3.15 and future versions, and macOS uses Python 3.12 by default.
- Vector types support
len()and construction from Python lists. mrmeshnumpyreturns float data asfloat32and convertsVoxelBitSet. Check code that expectsfloat64.- The Python viewer works from the macOS interactive prompt and shuts down cleanly with the interpreter.
File formats
- Google Draco:
.drcmeshes and point clouds, and Draco-compressed glTF. - New savers and loaders: G-code files and LAS and LAZ point clouds can now be saved, and binary OFF files can be loaded.
- STEP: the Force Load Sub-Shapes option splits single-body parts, and the STEP import settings are in the Settings tool.
- TIFF and GeoTIFF: non-ASCII paths on Windows, RGBA with unassociated alpha, no-data values, and correct tie points and PixelIsPoint offsets.
- OBJ: warnings about missing materials and textures, and correct handling of faces and
usemtllines outside of objects. - DICOM: Enhanced CT slices without functional groups.
- Zip archives and folders skip macOS metadata, and zip errors name the file and the reason.
Viewer and MCP
- Navigation: several keys per action, Ctrl+Y for Redo, two-key chords such as Space and a digit for the standard views, and animated camera moves and View Cube turns. The mouse wheel zoom is smoother, can be inverted and follows the physical wheel direction on macOS.
- Scene tree and export: Shift-click selects a range inside groups, object class names can be translated, and Export says which object type cannot be exported.
- Surface Manipulation brush: Relax keeps creases sharp, and one Undo step reverts a stroke together with its smoothing, creases and subdivision.
- Rendering: a viewport background texture, a property that culls back faces, fully transparent colors that no longer force the transparent pass, antialiased edges of opaque objects that stay in front of transparent ones, a
-noMSAAlaunch flag, and 2x MSAA under software rasterizers. - Windows and dialogs: modal popups no longer close each other, dialogs can sit over the ribbon and the scene list, a modal gets its own OS window when other platform windows exist, macOS shows a splash window that can be turned off, and Linux gets experimental Wayland support.
- MCP server: new tools and options, among them
viewer_getCamera,viewer_shutdown, camera fit and animated moves, the viewport background and object statistics. Failures come back asisErrorresults, arguments are checked, waits for a busy viewer are bounded, and failed calls are logged.
Before you upgrade
MR::Vector:vec_is nowvec, astd::vectorwithMR::Allocator. TheVector(std::vector<T>&&)constructor is removed, andresizeWithReserveofVectorandBitSetis deprecated.- TIFF moved out of MRMesh:
MRTiffIOis replaced by the Raster API with a load and save registry in MRIOExtras. - The contour conversion functions are renamed to
xToYnames, for exampleoffsetSurfaceLineToMeshContoursandsurfaceLineToMeshContour. VertNormalsModereplacesbool saveNormalsinmeshToPointCloud,meshToDensePointCloudandObjectPoints, andSignDetectionMode::WindingRuleis nowOddCrossings.findProjections,fromNumpyArrayandMeshOnVoxels::getPointsuseVertCoords, andOneMeshContoursis one array of intersections withoutstd::variant.
Downloads
Binaries for Windows x64 (Visual Studio 2019, 2022, 2026) and arm64 (Visual Studio 2026), new clang-cl builds for both with a CMake package config, Ubuntu 22 / 24 / 26 LTS (x64 + arm64), Linux vcpkg (glibc 2.28, x64 + arm64), macOS Intel and Apple Silicon with a signed and notarized .pkg, and Emscripten (single-thread, multi-thread, multi-thread Wasm64). Packages on PyPI, NuGet, npm, crates.io and Maven Central.
- Builds: on Windows, clang-cl now builds the wheels, the NuGet package and the native libraries of Rust and Java, and on macOS, vcpkg builds the packages.
- Windows: the embedded Python ships its extension modules, and the symbols archive has the PDBs of the vcpkg libraries.
- Stack traces use
std::stacktracewhere available and find PDBs next to the binaries. - Documentation: the crates.io and NuGet packages come with readmes and examples, and CONTRIBUTING has a section on writing and running tests.
Full changelog, including the new API, deprecations and every fix: GitHub release v3.2.0.3.
