Releases: adobe/lagrange
Releases · adobe/lagrange
Release list
Lagrange Release 6.46.0
Infrastructure
- 📌 Update
imgui(1.91.5 → 1.92.8),polyscope, andimguizmo, and addimplot: fixes the polyscope Isosurface mode. - 🏗️ Add Windows ARM64 (MSVC) build support.
Core Module
- 🎨 Add
split_obtuse_trianglesmesh cleanup: iteratively splits triangles past an angle threshold at the foot of the perpendicular; Python binding. - 🎨 Preserve attributes in isoline ops and add
insert_isoline: attributes are interpolated through trim/extract, andinsert_isolineembeds the isoline as a chain of interior edges. - 🎨 Improve
meshstat: facet-type counts, Euler characteristic, and UV attribute cleanup. - 🎨 Add vertex-connectivity support to
compute_facet_facet_adjacency.
UV & Atlas
- ✨ Add the
lagrange::xatlasmodule: wrapsjpcy/xatlas(MIT) for UV unwrapping and atlas repacking; provides unwrap/repack for mesh and scene, a reusableAtlasEngine, multi-atlas (UDIM) policies, and Python bindings. - 🎨 Add an
include_boundary_edgesoption tocompute_seam_edges: treat boundary edges as seams in one pass; Python and JS bindings.
Sampling Module
- ✨ New
samplingmodule:random_sample_uniformandrandom_sample_blue_noise.
Bug Fixes
- 🐛 Fix a
mesh_viewercrash for meshes with edge attributes: install a polyscope edge permutation before registering edge-valued quantities. - 🐛 Fix sanitizer-detected bugs in
polyddgandunflip_uv_charts: eager-evaluate an Eigen expression (use-after-scope) and use atomic writes for a TSan data race on shared UV vertices. - 🐛 Fix a dangling external texture reference in embedded glTF export: drop the source
uriwhen embedding so.glbfiles are self-contained. - 🐛 Remap invalid indexed-attribute indices to a dummy sentinel value to avoid a
weld_indexed_attributecrash. - 🐛 Avoid a segfault in
load_fbxwhen the file does not exist (throw an exception instead).
Python & Bindings
- 🐍 Expose
TransformOptions::reorientin the scene andtransform_meshPython bindings. - 🐍 Add Python bindings for the winding number module (
FastWindingNumber). - 🐍 Add Python bindings for
RayCastercast,closest_point, andoccluded: single and batched queries with automatic SIMD dispatch.
Lagrange Release 6.45.0
Infrastructure
- 🏗️ Fix sccache CMake flags for open-source CI.
- 🐛 Fix sanitizer presets: TSan ASLR workaround + LSAN suppressions.
- 🐛 Fix
std::formatcustom formatter on MSVC 14.50 + CI VS 2026 toolset.
Core Module
- 🧪 Add
orient_outwardregression test. - 📝 Add
orient_outwardexample and use barycenter anchor for signed-volume robustness. - ♻️ Modernize
mesh_cleanupexample to use SurfaceMesh API. - 🐛 Disconnect bowtie UV vertices in
disconnect_uv_charts. - 🎨 Add
compute_uv_orientationandunflip_uv_charts: per-facet orientation attribute via Shewchuk's exact predicate; wired into Python,meshstat, andtexproc.
Raycasting Module
- ✨ Remove occluded meshes and faces using ray casting: instance- and facet-level occlusion estimation/removal for CAD interior cleanup.
Texproc Module
- 🎨 Add
CameraTransforms,split_grid, and mesh+cameras rasterizer overload: decouples rasterizer fromScene; promotesCameraTransformsto core with Python binding.
PolyDDG Module
- 🐛 Fix anti-aligned result in
compute_smooth_direction_field. - ✨ Add face-based connection Laplacian to
compute_smooth_direction_field.
Primitive Module
- 🐛 Handle empty attribute names in
generate_sphereandgenerate_rounded_cone.
Python & Scripts
- 🐍 Add Python bindings for
packing::repack_uv_charts. - 🐍 Add Python bindings for
scene::compute_mesh_weights. - 🐍 Refactor
meshstatinto a package and add UV statistics. - 🐍 Expand Python bindings for
volume.Grid: CSG ops, transforms, factories.
Lagrange Release v6.44.0
Dependencies
- 📌 Update vcpkg baseline for CMake 4 compatibility.
- 📌 Update TextureSignalProcessing dependency.
Infrastructure / CI
- 🏗️ Enable
SPDLOG_USE_STD_FORMATin C++20 preset. - 🏗️ Fix cista include dirs.
- 🏗️ Add swap + use mold in open-source CI.
- 🏗️ Improve compiler cache (ccache/sccache) configuration.
- 🏗️ Fix sanitizer presets: mock polyscope backend + sequential MKL.
- 🏗️ Update
.gitignore. - 🏗️ Enable
compile_commands.jsongeneration for IDE support. - 🏗️ Update cibuildwheel.
- 🏗️ Fix Xcode 26.4 compiler crash with Eigen matrix operations.
- 🏗️ Suppress GCC 13.x false-positive
-Warray-boundswith sanitizers.
Core Module
- 🎨
remove_short_edgesrespects sharp features, boundaries and non-manifoldness. - 🐛 Fix
unify_index_bufferresize for isolated vertices with selected indexed attributes. - 🎨 Support edge/point facets in
mesh_to_volume. - ✨ Add robust
triangle_triangle_intersection()using exact predicates. - 🎨 Update
meshstat.pyto report the number of UV charts and self-intersections. - ✨ Add
disconnect_uv_chartssupport. - 🎨 Support mixed UV scalar types in
uv_mesh,compute_uv_charts,compute_uv_overlap,repack_uv_charts. - 🐛 Fix
compute_barycentric_coordinatesfor coplanar triangles. - 🎨 Add
get_unique_attribute_namehelper. - 🐛 Support calling
clear_edges()on a mesh with no edges. - ⚡ Fix O(G×V) performance in
separate_by_facet_groupsvia single-pass parallel submesh extraction.
BVH Module
- ✨ Add
compute_intersecting_pairs()for self-intersection detection. - 🎨 Add point cloud support for mesh distance computation.
IO Module
- 🎨 Add OBJ line element loading/saving with
line_idattribute. - 🐛 Fix glTF save/load for meshes without materials.
- 🎨 Fix 2D OBJ vertex output and weld indexed attributes in
stitch_mesh.
Geodesic Module
- ✨ Add point-to-point geodesic path computation.
Texproc Module
- 🎨 Add timing instrumentation to texture compositing.
UI Module
- 🐛 Fix orthographic camera projection and view transform.
Python Bindings
- 🐛 Fix module name mismatch in stub.
JavaScript / WASM Bindings
- ✨ Add TypeScript bindings with WASM. 🎉
- 🎨 Add
cloneto JavaScript bindings.
Lagrange Release v6.43.0
Dependencies
- 📌 Add support for Eigen 5
- 📌 Update vcpkg baseline to move to OpenVDB 13
New Module: serialization2
- ✨ New
serialization2module forSurfaceMesh,SimpleScene, andScene- Uses
cistafor zero-copy deserialization andzstdfor optional multi-threaded compression - Does not require the full dependency set of
lagrange::io - API:
serialize_mesh/deserialize_mesh/save_mesh/load_mesh(and scene equivalents) - Suggested file extensions:
.lgm(SurfaceMesh) and.lgs(Scene / SimpleScene) - Cross-type deserialization via
allow_scene_conversionandallow_type_cast
- Uses
Core Module
- ✨ Add
mesh_bbox()utility to replace unsafe Eigen 5 iteration patterns - ✨ Add
compute_facet_facet_adjacency()— supports non-manifold meshes; returns a compressed CSRAdjacencyList; non-manifold edges (3+ incident facets) produce complete clique connections - ✨ Add opt-in corner attribute support to
uv_mesh_refanduv_mesh_view - 🐛 Avoid welding invalid values in
weld_indexed_attribute
Scene and IO Modules
- 🐛 Map missing OBJ indices (normals, UVs) to invalid attribute values instead of crashing
- 🐛 Fix WASM/Emscripten test failure by forcing embedded images for binary glTF
BVH Module
- ✨ Add
compute_uv_overlapfor detecting overlapping triangles in UV space
Raycasting Module
- ✨ Add
compute_local_feature_size
Polyddg Module
- ✨ Helmholtz-Hodge decomposition for 1-forms on polygonal meshes
- Decomposes into exact (gradient), co-exact (divergence-free), and harmonic parts
- VEM-stabilized inner products for consistent differential operators
- Saddle-point solver for the co-exact part;
dim(harmonic) = 2gfor genus-g surfaces
- ✨ Hodge decomposition for vertex vector fields with n-rosy support
Subdivision Module
- ✨ Add adaptive tessellation based on chordal deviation: new
max_chordal_deviationoption, mutually exclusive withmax_edge_length - 🐛 Fix
subdivide_meshwith zero subdivision levels
Texproc Module
- ✨ Precise alpha carving with threshold interpolation
- 🐛 Fix ambiguous marching squares case and add bilinear alpha sampling
Python
- 🐛 Allow
extract_submeshto accept list or tensor forselected_facets - 🐛 Fix Python submodule imports
- 🎨 Move OpenVDB initialization to the
volumemodule
Miscellaneous
- 🐛 [polyscope] Fix registration of 4-channel vector/color attributes
- 🎨 [polyscope] Use categorical data type for integer scalar attributes
- 🐛 [volume] Add support for meshes with >4-vertex facets in voxelization
Lagrange Release v6.42.0
Dependencies
- 📌 Update spdlog to 1.17.0
- 📌 Update gl3w to fix link issues on Linux
- 📌 Add support for Embree 4, now the default
Python
- 🚨 Rename Lagrange Python package to
adobe-lagrangeto improve compatibility with internal releases while avoiding PyPI collision- Before:
uv pip install lagrange-open - After:
uv pip install adobe-lagrange - Import name unchanged (
import lagrange) - Redirection packages ensure transitions to the latest versions
- Before:
- 🐛 Fix hierarchical logging in Python
Core Module
- 🎨 Broadcast constant value attributes in
map_attribute - 🐛 Fix issues with
weld_indexed_attributes - 🐛 Fix double-flip bug in facet reorientation for
orient_outward
Scene and IO Modules
- ✨ Add Scene to SimpleScene conversion functions
- 🐛 Fix node indexing bug in
save_gltfwhen using explicit root nodes - 🐛 Skip non-triangle primitives in
load_scene_gltf, load empty placeholder mesh - 🐛 Fix FBX load issue with duplicate attribute names
- 🐛 Account for geometry transforms and scale inherit mode in
load_fbx - 🐛 Fix image size assert in
load_gltf
Remeshing Module
- ✨ New
remeshing_immodule wrapping Instant Meshes
Polyddg Module
- ✨ Shape operator for discrete curvature computation
BVH Module
- ✨ Add mesh-to-mesh distance evaluation
- New
bvh::compute_mesh_distancesfor per-vertex distance - Add
bvh::compute_hausdorffandbvh::compute_chamfermetrics - Python bindings available
- New
Raycasting Module
- ✨ New
RayCasterclass forSurfaceMesh- Construction:
add_mesh(),add_instance(),add_scene() - Modification:
update_mesh(),update_vertices(),update_transform() - Support visibility, intersection and occlusion filters
- Distance queries:
closest_pointN(),closest_vertexN() - Ray queries:
castN(),occludedN()
- Construction:
- Refactored projection functions to support
SurfaceMesh:- Can project either vertex positions or attributes such as colors
project_closest_point(),project_closest_vertex(),project_directional()
- Python bindings available
TexProc Module
- ✨ Mesh with alpha mask to SDF conversion
- 🐛 Apply regularization consistently to LHS and RHS (filtering + stitching)
Miscellaneous
- 🏗️ Chainload WindowsToolchain for vcpkg on Windows
- 🐛 Support empty inputs in mesh subdivision
- 🎨 Unify index buffer in polyscope mesh viewer example
- 🎨 Expose grid background value in Python bindings
- 🎨 Update default rendering setting for large point clouds
Lagrange Release v6.41.0
Dependencies
- 📌 Update Eigen to 3.4.1
- 📌 Update ufbx to v0.21.2
- 📌 Downgrade Entt to v3.15.0 due to type matching issues
- 📌 Switch pcg-cpp repo source with WinARM support
- 📌 Update OpenVDB to 13.0.0
Infrastructure
- 🐛 Numpy 2.4.0 compatibility fix
- 🏗️ New trigger to build python wheel for PRs
- 🏗️ Fix doc build failures
- 🏗️ Auto extract version from git tags
Scene and IO Modules
- 🎨 Add
scene_to_meshesandsimple_scene_to_meshes - 🎨 Add option to triangulate mesh during saving
- 🎨 Allow saving scenes with invalid URI to OBJ with warnings
- 🐛 Fix target axis and units when loading FBX models
- 🐛 Load empty images when failed to load FBX textures
- 🐛 Proper attribute usage for tangent/bitangent attributes from FBX
Core Module
- 🎨 Faster per-vertex component computation (~23% faster)
BVH Module
- ✨ Add
remove_interior_shellssupport for removing non-intersecting interior shells
TexProc Module
- 🎨 New graphical demo for texture stitching
Subdiv Module
- 🎨 Add
compute_sharpnesshelper function
Volume Module
- 🎨
mesh_to_volumeupdates:- New
Unsignedsigning mode - Update winding number signing
- Bug fix in quad-to-tri tessellation
- New
- 📝 Update example demos
- New
voxelize_guiand grid_viewer examples - New
register_grid.hutility for visualizing VDB grids with Polyscope in examples - Rename
voxelize_mesh->voxelize_cliand support additional input/output files
- New
- 🎨 Add NanoVDB support in demos/Python bindings
- ✨ New Grid class wrapping OpenVDB grids (CPU only)
.to_mesh()and.from_mesh()for converting between mesh <-> SDF grid (float or double).save(),.to_buffer()and.load()for serialization (supports NanoVDB and compression)- Grid properties:
.bbox_index,.bbox_world,.num_active_voxels .world_to_index()and.index_to_world()to apply coordinate transforms.sample_trilinear_*()to sample points in parallel.resample(),.densify(),.redistance()and.offset_in_place()utility methods
Lagrange Release v6.40.1
Minor release to fix Python documentation issues.
Lagrange Release v6.40.0
Dependencies
- 📌 Updated oneTBB to 2022.3.0 and oneMKL to 2025.3.0
- 📌 Updated spdlog from 1.15.1 to 1.16.0
- 📌 Updated fmt from 11.1.4 to 12.0.0
- 📌 Updated EnTT from 3.13.2 to 3.16.0
Core Module
- ✨Added
compute_uv_areafunction - 🎨
compute_edge_is_manifoldcan now compute a per-edge attribute indicating manifoldness - 🎨 Added support for inverting normal/bitangent attributes when flipping facets
orient_outwardwill now flip normal/bitangent attributes
- 🐛 Fixed infinite loop issue in earcut triangulation
Python Bindings
- 🐍 Added python bindings for:
compute_edge_is_orientedcompute_vertex_is_manifoldcompute_edge_is_manifold
- 🐍 Added python bindings for
SurfaceMesh::foreach_*functions - 🎨 Improved
meshstat.py: added orientation check, non-manifold count, facet stats
Primitive Module
- 🎨 Now open source!
IO Module
- 🏗️ Silenced IO warnings in unit tests
- 🎨 Added
quietoption for saving meshes
Texproc Module
- 🎨 Added option to regularize the stiffness matrix in texture filtering and stitching
- 🎨 Added option to clamp output values in texture filtering / stitching / compositing
- 🎨🐍 Exposed options to C++ examples and python bindings
- 🐛 Fixed non-deterministic __randomize option in texture stitching
- 🏗️ Made unit tests single-threaded to ensure reproducibility, and changed to stricter tolerances
Polyscope Module
- ✨ New dedicated module to facilitate interop with Polyscope
- Register explicit structure:
register_edge_networkregister_meshregister_point_cloud
- Infer structure type from mesh connectivity:
register_structure
- Create or update Polyscope attribute based on Lagrange's:
register_attribute
- Register explicit structure:
Lagrange Release v6.39.0
Infrastructure
- 🏗️ Compilation fixes for Xcode 26
- 🏗️ Fix CMake sanitizer setup for MSVC
- 📌 Update earcut.hpp dependency to
f36ced7 - 📌 Update cpptrace to 1.0.4
- 📌 🐛 Update PoissonRecon dependency to fix a memory allocation bug
Core Module
- 🎨 Add overload to
SurfaceMesh::delete_attributeto accept id as input
IO Module
- 🐛 Throw error when saving float/double texture to glTF file
- 📖 Add explicit warning when loading glTF without explicit stitching behavior
- 🎨 Add new
LoadOptions::quietto silence IO related log messages - 🎨 Update STL mesh load to not stitch vertices by default for consistency with other formats
Solver Module
- ✨ Add support for Spectra-based sparse eigenvalue solver
[generalized_]selfadjoint_eigen_[largest|smallest]()in C++lagrange.solver.eigsh()in Python (follows a similar API toscipy.linalg.eigsh())
Texproc Module
- 🐛 Fix out-of-bound access in rasterization code
- 🐛 Add checks to ensure number of channels consistency
- 🐍 Update
texture_from_multiview.pyto accept list of render images + ensure output uses .exr - 🐛 Fix vertical flip in
geodesic_dilationcode introduced in v6.38.0 - 🐛 Fix image transpose issue in Python bindings
- 🐍 Add
geodesic_dilation.pydemo
Geodesic Module
- ✨ New geodesic module to compute single-source and point-to-point geodesic distance
- Added
GeodesicEngine[...]class for repeated computation - Choice of algorithm between DGPC, MMP and Heat
- Two methods available:
single_source_geodesic()andpoint_to_point_geodesic()
- Added
Polyddg Module
✨ New polyddg module that implements most of the operators from this paper:
De Goes, F., Butts, A., & Desbrun, M. (2020).
Discrete differential operators on polygonal meshes.
ACM Transactions on Graphics (TOG), 39(4), 110-1.
Documentation
- 📖 Docstring updates for scene module
- 📖 Update
voxelize_meshexample code to read/write .vdb files - 📖 Fixed typos and grammar in comments with Copilot
Python Bindings
- 📌 Updated scikit-build core to 0.11.6
- 📌 Updated sphinx and autoapi
- 🏗️ Set upper-bound to Python <3.14 due to nanobind uncertainty
- 📖 Fixed generated Sphinx documentation due to refactored stub files
Full Changelog: v6.38.0...v6.39.0
Lagrange Release v6.38.0
Infrastructure
- 🏗️ New CMake option
LAGRANGE_PROPAGATE_WARNINGS - 📌 Update Catch2 to v3.10.0
- 📌 Update WindingNumber to v0.3.15
- 🏗 Enable
\Z7flag in MetaBuild for debug build
Core module
- 🏗️ Replace
M_PIwithlagrange::internal::pi - ✨ Add
compute_facet_circumcenter - ✨ Add
compute_facet_vector_area - 🐍 Add
SurfaceMesh.edgesin python binding - 🎨 Update
point_triangle_squared_distanceandpoint_segment_squared_distanceto be dimension independent
IO module
- 🐛 Bug fix in directory creation when saving obj file
Texproc module
- 🐛 Add check for flipped UV triangles
- 🗑️ Cleanup geodesic dilation code
BVH module
- 🎨 Refactor AABB as a stand-alone class
- 🎨 Add support for
TriangleAABBTree - 🎨 Update
EdgeAABBTree - 🎨 Add python binding for
TriangeAABBTreeandEdgeAABBTree
Documentation and other updates
- 📌 Update Doxygen and CSS version
- 📌 Update website dependency
- 💄 Update code format for the entire repo
- 📖 Improve texproc documentation
- 🏗️ Add explicit ref to Doxygen comments
- 🏗️ Remove doxygen autolink
- 📖 Update python doc strings
- 🐛 Fix python stub generation