Skip to content

Releases: adobe/lagrange

Lagrange Release 6.46.0

Choose a tag to compare

@HasKha HasKha released this 22 Jun 15:56
Immutable release. Only release title and notes can be modified.
cd1321c

Infrastructure

  • 📌 Update imgui (1.91.5 → 1.92.8), polyscope, and imguizmo, and add implot: fixes the polyscope Isosurface mode.
  • 🏗️ Add Windows ARM64 (MSVC) build support.

Core Module

  • 🎨 Add split_obtuse_triangles mesh 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, and insert_isoline embeds 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::xatlas module: wraps jpcy/xatlas (MIT) for UV unwrapping and atlas repacking; provides unwrap/repack for mesh and scene, a reusable AtlasEngine, multi-atlas (UDIM) policies, and Python bindings.
  • 🎨 Add an include_boundary_edges option to compute_seam_edges: treat boundary edges as seams in one pass; Python and JS bindings.

Sampling Module

  • ✨ New sampling module: random_sample_uniform and random_sample_blue_noise.

Bug Fixes

  • 🐛 Fix a mesh_viewer crash for meshes with edge attributes: install a polyscope edge permutation before registering edge-valued quantities.
  • 🐛 Fix sanitizer-detected bugs in polyddg and unflip_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 uri when embedding so .glb files are self-contained.
  • 🐛 Remap invalid indexed-attribute indices to a dummy sentinel value to avoid a weld_indexed_attribute crash.
  • 🐛 Avoid a segfault in load_fbx when the file does not exist (throw an exception instead).

Python & Bindings

  • 🐍 Expose TransformOptions::reorient in the scene and transform_mesh Python bindings.
  • 🐍 Add Python bindings for the winding number module (FastWindingNumber).
  • 🐍 Add Python bindings for RayCaster cast, closest_point, and occluded: single and batched queries with automatic SIMD dispatch.

Lagrange Release 6.45.0

Choose a tag to compare

@jdumas jdumas released this 28 May 21:42
Immutable release. Only release title and notes can be modified.
9a92c93

Infrastructure

  • 🏗️ Fix sccache CMake flags for open-source CI.
  • 🐛 Fix sanitizer presets: TSan ASLR workaround + LSAN suppressions.
  • 🐛 Fix std::format custom formatter on MSVC 14.50 + CI VS 2026 toolset.

Core Module

  • 🧪 Add orient_outward regression test.
  • 📝 Add orient_outward example and use barycenter anchor for signed-volume robustness.
  • ♻️ Modernize mesh_cleanup example to use SurfaceMesh API.
  • 🐛 Disconnect bowtie UV vertices in disconnect_uv_charts.
  • 🎨 Add compute_uv_orientation and unflip_uv_charts: per-facet orientation attribute via Shewchuk's exact predicate; wired into Python, meshstat, and texproc.

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 from Scene; promotes CameraTransforms to 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_sphere and generate_rounded_cone.

Python & Scripts

  • 🐍 Add Python bindings for packing::repack_uv_charts.
  • 🐍 Add Python bindings for scene::compute_mesh_weights.
  • 🐍 Refactor meshstat into a package and add UV statistics.
  • 🐍 Expand Python bindings for volume.Grid: CSG ops, transforms, factories.

Lagrange Release v6.44.0

Choose a tag to compare

@qnzhou qnzhou released this 29 Apr 13:21
Immutable release. Only release title and notes can be modified.
080b47b

Dependencies

  • 📌 Update vcpkg baseline for CMake 4 compatibility.
  • 📌 Update TextureSignalProcessing dependency.

Infrastructure / CI

  • 🏗️ Enable SPDLOG_USE_STD_FORMAT in 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.json generation for IDE support.
  • 🏗️ Update cibuildwheel.
  • 🏗️ Fix Xcode 26.4 compiler crash with Eigen matrix operations.
  • 🏗️ Suppress GCC 13.x false-positive -Warray-bounds with sanitizers.

Core Module

  • 🎨 remove_short_edges respects sharp features, boundaries and non-manifoldness.
  • 🐛 Fix unify_index_buffer resize 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.py to report the number of UV charts and self-intersections.
  • ✨ Add disconnect_uv_charts support.
  • 🎨 Support mixed UV scalar types in uv_mesh, compute_uv_charts, compute_uv_overlap, repack_uv_charts.
  • 🐛 Fix compute_barycentric_coordinates for coplanar triangles.
  • 🎨 Add get_unique_attribute_name helper.
  • 🐛 Support calling clear_edges() on a mesh with no edges.
  • ⚡ Fix O(G×V) performance in separate_by_facet_groups via 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_id attribute.
  • 🐛 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 clone to JavaScript bindings.

Lagrange Release v6.43.0

Choose a tag to compare

@HasKha HasKha released this 31 Mar 17:04
Immutable release. Only release title and notes can be modified.
771d858

Dependencies

  • 📌 Add support for Eigen 5
  • 📌 Update vcpkg baseline to move to OpenVDB 13

New Module: serialization2

  • ✨ New serialization2 module for SurfaceMesh, SimpleScene, and Scene
    • Uses cista for zero-copy deserialization and zstd for 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_conversion and allow_type_cast

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 CSR AdjacencyList; non-manifold edges (3+ incident facets) produce complete clique connections
  • ✨ Add opt-in corner attribute support to uv_mesh_ref and uv_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_overlap for 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) = 2g for 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_deviation option, mutually exclusive with max_edge_length
  • 🐛 Fix subdivide_mesh with zero subdivision levels

Texproc Module

  • ✨ Precise alpha carving with threshold interpolation
  • 🐛 Fix ambiguous marching squares case and add bilinear alpha sampling

Python

  • 🐛 Allow extract_submesh to accept list or tensor for selected_facets
  • 🐛 Fix Python submodule imports
  • 🎨 Move OpenVDB initialization to the volume module

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

Choose a tag to compare

@jdumas jdumas released this 09 Mar 18:55
Immutable release. Only release title and notes can be modified.
9a9cae0

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-lagrange to 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
  • 🐛 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_gltf when 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_im module wrapping Instant Meshes

Polyddg Module

  • ✨ Shape operator for discrete curvature computation

BVH Module

  • ✨ Add mesh-to-mesh distance evaluation
    • New bvh::compute_mesh_distances for per-vertex distance
    • Add bvh::compute_hausdorff and bvh::compute_chamfer metrics
    • Python bindings available

Raycasting Module

  • ✨ New RayCaster class for SurfaceMesh
    • 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()
  • 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

Choose a tag to compare

@qnzhou qnzhou released this 11 Feb 01:38
Immutable release. Only release title and notes can be modified.
cf7782d

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_meshes and simple_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_shells support for removing non-intersecting interior shells

TexProc Module

  • 🎨 New graphical demo for texture stitching

Subdiv Module

  • 🎨 Add compute_sharpness helper function

Volume Module

  • 🎨 mesh_to_volume updates:
    • New Unsigned signing mode
    • Update winding number signing
    • Bug fix in quad-to-tri tessellation
  • 📝 Update example demos
    • New voxelize_gui and grid_viewer examples
    • New register_grid.h utility for visualizing VDB grids with Polyscope in examples
    • Rename voxelize_mesh -> voxelize_cli and support additional input/output files
  • 🎨 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

Choose a tag to compare

@jdumas jdumas released this 20 Jan 23:03
Immutable release. Only release title and notes can be modified.
ced6e05

Minor release to fix Python documentation issues.

Lagrange Release v6.40.0

Choose a tag to compare

@HasKha HasKha released this 12 Dec 23:34
Immutable release. Only release title and notes can be modified.
5b7deeb

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_area function
  • 🎨 compute_edge_is_manifold can now compute a per-edge attribute indicating manifoldness
  • 🎨 Added support for inverting normal/bitangent attributes when flipping facets
    • orient_outward will now flip normal/bitangent attributes
  • 🐛 Fixed infinite loop issue in earcut triangulation

Python Bindings

  • 🐍 Added python bindings for:
    • compute_edge_is_oriented
    • compute_vertex_is_manifold
    • compute_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 quiet option 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_network
      • register_mesh
      • register_point_cloud
    • Infer structure type from mesh connectivity:
      • register_structure
    • Create or update Polyscope attribute based on Lagrange's:
      • register_attribute

Lagrange Release v6.39.0

Choose a tag to compare

@jdumas jdumas released this 14 Nov 18:22
ee6f7f0

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_attribute to 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::quiet to 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 to scipy.linalg.eigsh())

Texproc Module

  • 🐛 Fix out-of-bound access in rasterization code
  • 🐛 Add checks to ensure number of channels consistency
  • 🐍 Update texture_from_multiview.py to accept list of render images + ensure output uses .exr
  • 🐛 Fix vertical flip in geodesic_dilation code introduced in v6.38.0
  • 🐛 Fix image transpose issue in Python bindings
  • 🐍 Add geodesic_dilation.py demo

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() and point_to_point_geodesic()

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_mesh example 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

Choose a tag to compare

@qnzhou qnzhou released this 17 Oct 02:45
eb3522d

Infrastructure

  • 🏗️ New CMake option LAGRANGE_PROPAGATE_WARNINGS
  • 📌 Update Catch2 to v3.10.0
  • 📌 Update WindingNumber to v0.3.15
  • 🏗 Enable \Z7 flag in MetaBuild for debug build

Core module

  • 🏗️ Replace M_PI with lagrange::internal::pi
  • ✨ Add compute_facet_circumcenter
  • ✨ Add compute_facet_vector_area
  • 🐍 Add SurfaceMesh.edges in python binding
  • 🎨 Update point_triangle_squared_distance and point_segment_squared_distance to 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 TriangeAABBTree and EdgeAABBTree

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