Releases: ipc-sim/ipc-toolkit
Releases · ipc-sim/ipc-toolkit
v1.5.0
Highlights
- Implement "Geometric Contact Potential" [Huang et al. 2025] by @Huangzizhou in #191
- Implement "Offset Geometric Contact" [Chen et al. 2025] by @zfergus in #192
- Implement fully parallel LBVH Broad Phase by @zfergus in #188
- Add geometry utilities for collision normals, signed distances, and dihedral angles with gradients and Hessians.
What's Changed
New Formulations
-
Geometric Contact Potential (GCP) by @Huangzizhou in #191
- The implementation includes the collision and friction potential with gradients and Hessians.
- Tutorial available here.
-
Offset Geometric Contact (OGC) by @zfergus in #192
- OGC is a penetration-free contact model that replaces continuous collision detection (CCD) with a trust-region-based approach.
-
New Namespace: Introduced
ipc::ogcto encapsulate OGC-specific functionality. -
Trust Region Implementation:
- Added
TrustRegionclass (trust_region.hpp,trust_region.cpp) to manage per-vertex conservative bounds. - Implemented
warm_start_time_stepto initialize the trust region and handle initial predictions. - Implemented
filter_stepto scale optimization steps ensuring vertices stay within safe bounds. - Implemented
updateandupdate_if_neededto dynamically resize trust regions based on motion.
- Added
-
Feasible Region Logic:
- Added
feasible_region.hppandfeasible_region.cppcontaining geometric predicates (e.g.,check_vertex_feasible_region,is_edge_edge_feasible) to verify if primitives are within valid non-penetrating regions. - Integrated feasible region checks into the
NormalCollisionsclass to filter out invalid collision candidates. Enabled viaset_collision_set_type(NormalCollisions::CollisionSetType::OGC).
- Added
-
Step Scaling: Unlike the original paper's projection method,
TrustRegion::filter_stepscales the descent direction$\beta$ to keep vertices on the trust region boundary. This preserves the descent direction, ensuring compatibility with line-search-based solvers. - Tutorial available here.
Broad Phase
- Parallel CPU LBVH implementation by @zfergus in #188
- New broad phase collision detection method with memory optimizations on the AABB structure.
- LBVH Broad Phase:
- Implemented
LBVHclass insrc/ipc/broad_phase/lbvh.hpp, providing a Linear Bounding Volume Hierarchy method for broad phase collision detection. - Fully parallel build and traversal routines using Intel TBB.
- SIMD optimizations for AABB overlap tests.
- Faster than the existing BVH method and all other broad phase methods in IPC Toolkit for large scenes.
- More than 3x faster to build.
- Up to 1.5x faster for candidate detection.
- Detailed performance charts available below.
- Added
python/examples/lbvh.pyto demonstrate usage and visualization.
- Implemented
- ⚡ Enhancements
- Performance Optimizations:
- Added
DefaultInitAllocatorto reduce overhead when allocating large arrays of POD types. - Replaced
std::vector<AABB>withstd::vector<AABB, DefaultInitAllocator<AABB>>.
- Added
- Memory Optimization:
- Switched
AABB::minandAABB::maxfromArrayMax3dtoEigen::Array3d. - Result: Reduces
sizeof(AABB)from 76 to 64 bytes, allowing AABB to fit into a single cache line (assuming 64-byte lines).
- Switched
- Replaced hardware rounding in
AABB::conservative_inflationwith software rounding usingstd::nextafter.
- Performance Optimizations:
- 💥 Breaking Changes
- API & Structural Changes:
- Moved dimension variable: Removed dim from
AABBand moved it toBroadPhaseto handle 2D/3D data more cleanly.dimis now set inBroadPhase::build. - Handle 2D data by setting AABB's z-components to zero.
- Constructor Removal: Removed the AABB default constructor and the initialization of
AABB::vertex_ids. - Type Change: Changed
to_3Dinipc/utils/eigen_ext.hppto operate onEigen::Arraytypes instead ofEigen::Vector.
- Moved dimension variable: Removed dim from
- Deprecated
BVHclass in favor of the newLBVHclass for better performance on large scenes.
- API & Structural Changes:
- Refactor BroadPhase to Build from Vertex Boxes Directly in #187
- Rename
sweep_and_tiniest_queue.cppto.cufile by @iiiian in #203 - Fix vertex id assignment by @iiiian in #204
- Fix vertex id assignment logic in
SweepAndTiniestQueue.
- Fix vertex id assignment logic in
- Replace optional
const shared_ptr<BroadPhase>¶meters withBroadPhase*in #205- Change
make_default_broad_phaseto return aunique_ptr
- Change
- Pass parameters to Scalable CCD Narrow-Phase by @antoinebou12 in #208
- Replace hardcoded
TightInclusionCCD::DEFAULT_TOLERANCEandTightInclusionCCD::DEFAULT_MAX_ITERATIONwithnarrow_phase.toleranceandnarrow_phase.toleranceif passed aTightInclusionCCDobject. - If
narrow_phase_ccdis not aTightInclusionCCDinstance, we fall back to default values to preserve backward compatibility.
- Replace hardcoded
- Add SIMD support via
xsimdlibrary in #207- Cross-platform SIMD (Single Instruction, Multiple Data) support using the
xsimdlibrary in the LBVH code. - Update the
IPC_TOOLKIT_WITH_SIMDto be enabled by default, and improve CMake logic to detect SIMD capabilities and configure the build accordingly. - Disable Eigen's internal vectorization to avoid crashes on Linux.
- Cross-platform SIMD (Single Instruction, Multiple Data) support using the
Math and Geometry Utilities
- Add normal computation and Jacobian methods for collision candidates in #182
- Collect normal utilities into
geometry/normalfiles in #197 - Organize geometry and math utilities into
geometryandmathfolders in #198 - Add signed distance computations for point-plane, point-line, and line-line geometries in #206
- Optimized edge_edge_mollifier.cpp with FMA operator in gradient calculations.
Miscellaneous
- Updated dependencies:
- Bump Abseil from
20250512.1to20260107.0 - Bump Catch2 from
v3.8.1tov3.12.0 - Bump Eigen from
3.4.0to5.0.1 - Bump JSON from
v3.11.2tov3.12.0 - Bump libigl from
89267b4a80b1904de3f6f2812a2053e5e9332b7etov2.6.0 - Bump TBB from
v2022.1.0tov2022.3.0 - Bump Pybind11 from
v2.13.1tov3.0.1 - Bump robin-map from
v1.4.0tov1.4.1 - Bump spdlog from
v1.15.3tov1.17.0
- Bump Abseil from
- Make most dependencies private
- Added a figure for default dependencies of the
ipc::toolkitlibrary: https://ipctk.xyz/about/dependencies.html - Refactored
BVHclass to use unique_ptr to hideSimpleBVH - Updated Sweep and Prune and Sweep and Tiniest Queue classes to use a Pimpl pattern for encapsulation.
- Mark
tsl::robin_mapandabsl::hashas private dependencies in CMake. Update the dependency documentation accordingly. - Convert
SpatialHashto PImpl idiom to hidetsl::robin_mapandabsl::hashfrom the public API.
- Added a figure for default dependencies of the
- Add Clang Tidy check
- Added a
.clang-tidyconfiguration file with a comprehensive set of checks, exclusions, naming conventions, and options to enforce modern C++ practices and treat all warnings as errors. - Introduced a GitHub Actions workflow (
.github/workflows/clang-tidy-check.yml) to automatically run Clang-Tidy on relevant files for every push and pull request, improving code quality and review automation.
- Added a
- Simplify CMake CUDA setup by @iiiian in #201
- Disable CUDA builds by default.
- Bump CMake minimum version to
3.24to supportCMAKE_CUDA_ARCHITECTURES="native"
- Add performance profiling utilities in #188
- Added a (optional) profiler utility (
src/ipc/utils/profiler.hpp) to measure/record metrics with CSV output support. - Added Nlohmann JSON as a dependency for profiler storage.
- Use
IPC_TOOLKIT_WITH_PROFILERCMake option to enable/disable profiling.
- Added a (optional) profiler utility (
- Refactor to use
Eigen::ConstReffor vertices in #200
New Contributors
Full Changelog: v1.4.0...v1.5.0
v1.4.0
Highlights
- Add adhesion potentials for sticky interactions, allowing for more realistic simulations of contact between objects.
- Based on the paper "Augmented Incremental Potential Contact for Sticky Interactions" by Fang et al. [2023]
- Implement new barrier functions from the literature.
NormalizedClampedLogBarrier: unit-less clamped log barrier function.ClampedLogSqBarrier: clamped log barrier with a quadratic log term from [Huang et al. 2024]CubicBarrier: cubic barrier function from [Ando 2024]
- Add support for separate static and kinetic coefficients in tangential collisions.
What's Changed
- Adhesion by @zfergus in #85
- Implement the adhesion potentials from "Augmented Incremental Potential Contact for Sticky Interactions" [Fang et al. 2023]
- Files moved from
ipc/frictionto genericipc/tangentialandipc/collisions/tangentialfolders. - Renamed
Collisionclasses toNormalCollision - Renamed
FrictionCollisionclasses toTangentialCollision - Renamed
DistanceBasedPotentialtoNormalPotential- Added
force_magnitudeandforce_magnitude_gradientmethods toNormalPotential
- Added
- Added
TangentialPotentialparent class toFrictionPotentialandTangentialAdhesionPotential - Tutorial added by @antoinebou12 in #144
- Use normal potential in tangential collisions by @maxpaik16 in #142
- Replaces the
const BarrierPotential¶meter with aconst NormalPotential& - This allows tangential adhesion to be properly set up in simulation.
- Replaces the
- Add
NormalizedClampedLogBarrierby @zfergus in #143 - Add max_iterations parameter to Additive CCD by @zfergus in #145
- Add cubic barrier with elasticity-inclusive dynamic stiffness by @zfergus in #148
- Implement the cubic barrier and elasticity-inclusive dynamic stiffness from [Ando 2024]
- Implement
$log^2$ -barrier from GIPC [Huang et al. 2024] - Add
compute_coefficients()toCollisionStencil– computes the coefficients$\vec{c}$ s.t.$d(x) = \Vert \sum c_i x_i\Vert^2$ - Add
compute_distance()toCollisionStenciltaking$V$ ,$E$ ,$F$ directly
- Replace
BroadPhaseMethodenum withshared_ptr<BroadPhase>by @zfergus in #152 - Remove
ContinuousCollisionCandidateinheritance by @zfergus in #156- Replace it with the
CollisionStencilclass.
- Replace it with the
- Replace
const Eigen::Matrix&withEigen::ConstRef<Matrix>by @zfergus in #157- This allows for more efficient passing of matrices to functions.
- Separate Static and Kinetic Coefficients of Friction by @zfergus in #177
- Enhancements to tangential collision handling by distinguishing between static and kinetic friction coefficients (
mu_sandmu_k) and implementing smooth transitions between them. - Updated
TangentialCollisionclass to replacemuwith separatemu_s(static friction coefficient) andmu_k(kinetic friction coefficient). This change applies to the class definition and all related methods. -
New
smooth_mufunctions: Added functions to compute smooth transitions between static and kinetic friction coefficients, including derivatives and related mathematical formulations. These functions improve the modeling of friction forces at varying tangential velocities. - Integration with adhesion module: Incorporated smooth friction coefficient calculations into the adhesion module.
- Tutorial added by @zfergus in #178
- Enhancements to tangential collision handling by distinguishing between static and kinetic friction coefficients (
Python Specific
- Add faster
can_collidefunctions to Python by @zfergus in #135 - Add
PyBroadPhaseandPyNarrowPhaseCCDclasses to wrap theBroadPhaseandNarrowPhaseCCDclasses, respectively, allowing for custom implementations of these classes in Python. - Add new constructors to candidate classes (
EdgeEdgeCandidate,EdgeFaceCandidate,EdgeVertexCandidate,FaceFaceCandidate,FaceVertexCandidate,VertexVertexCandidate) that accept tuples for easier initialization. - Include a call to
std::atexitto reset the thread limiter upon program exit to ensure proper cleanup. ⚠️ PythonNarrowPhaseCCDimplementations will not work with multi-threading because of GIL locking.- Switch from
py::argto_aliterals by @zfergus in #168
Miscellaneous
- Add
/Walland/MPcompiler flags for MSVC by @zfergus in #134 - Enable CUDA by default if CUDA is detected by CMake by @zfergus in #134
- Devcontainer by @antoinebou12 in #136
- Update dependencies for CMake 4.0 by @zfergus in #158
- Organize folder structure for generated Xcode project by @zfergus in #159
- Refactor CMake configurations and improve project structure
- Updated CMake recipes for third-party libraries to set appropriate folder properties for IDE organization.
- Changed the CPMAddPackage references for scalable-ccd to a more recent commit.
- Enhanced logging functionality by adding a new
log_and_throw_errorfunction to improve error handling. - Improved documentation in the style guide for naming conventions.
- Move generated
config.hppfile fromsrc/ipctobuild/include/src/ipc - Update CUDA builds in
CMakePresets.json - Remove
virtualtag fromBroadPhase::detect_collision_candidates
- Index typedef by @zfergus in #161
- Add a
index_ttypedef for vertex/edge/face ids. Changes default fromlongtoint32_t.
- Add a
- Update Tight Inclusion package version to 1.0.6 by @zfergus in #165
- Fix cmake for non-top-level inclusion by @sin3point14 in #167
- Improve and clean up documentation:
New Contributors
- @maxpaik16 made their first contribution in #142
- @sin3point14 made their first contribution in #167
Full Changelog: v1.3.1...v1.4.0
v1.3.1
What's Changed
- Move test data to an external repository by @zfergus in #113
- Download test data at compile time as needed using CMake
- Bump actions/download-artifact from 3 to 4.1.7 in /.github/workflows by @dependabot in #119
- Individual convergent formulation flags by @zfergus in #120
- Replace the
use_convergent_formulationflag inCollisionswith two flags:use_area_weightinganduse_improved_max_approximator. - Move the physical barrier rescaling from collision weights into the
BarrierPotentialusing a flaguse_physcial_barrier.
- Replace the
- Replace scalar
tbb::enumerable_thread_specificwithtbb::parallel_reduceby @zfergus in #121 - Fix missing
max_iterationsandtolerancevariables incompute_collision_free_stepsizewhen usingSWEEP_AND_TINIEST_QUEUEby @antoinebou12 in #123 - Add
cuda.ymlto test if the code compile with CUDA enabled by @zfergus in #125 - Update filib to allow shared library build by @zfergus in #122
- Fix
friction_collisions.buildtutorial (Issue #126) by @zfergus in #127 - Sort includes using clang-format by @zfergus in #129
- Add frequently asked questions page to the tutorial documentation
- Fix barrier API documentation
- On Apple, link Eigen against Accelerate as a BLAS/LAPACK backend
- Requires
brew install lapackto install LAPACKE headers
- Requires
New Contributors
- @dependabot made their first contribution in #119
- @antoinebou12 made their first contribution in #123
Full Changelog: v1.3.0...v1.3.1
v1.3.0
Highlights
- Separated the collision set and potential computations. This allows us to more easily add new potentials in the future. This will require updating calls to
compute_potential_*. See the tutorial for details. - Add a
Barrierclass to enable dynamic selection of barrier function. - Add a
NarrowPhaseCCDclass to enable dynamic selection of narrow-phase CCD method.
What's Changed
- Refactor potentials by @zfergus in #83
- Replace "constraint" and "contact" names with "collision"
- Removed
compute_potential_*fromCollisionandCollisions - Add a new class hierarchy
Potentialwhich represents computing the sum of individual potentials per collision- Implement the barrier potential and friction dissipative potential as Potentials:
BarrierPotentialandFrictionPotential
- Implement the barrier potential and friction dissipative potential as Potentials:
- Now,
Collisionsserve solely as the set of active collisions - Add the distance mollifier to all collisions with a
is_mollified()function- The default mollifier is
$m(x) = 1$ , and onlyEdgeEdgeCollisionoverrides this
- The default mollifier is
- Remove versions of
compute_distanceandccdfrom CollisionStencil which take the full mesh as input- Instead, expose the versions that take the collision stencil's vertex positions directly
- Polymorphic barrier in #84
- Make the barrier function an object so it can be changed at runtime
- Add a virtual class
Barrieras an interface for generic barriers - Add
ClampedLogBarrierclass which implements the smoothly clamped log barrier functions from [Li et al. 2020] -
barrier_gradientandbarrier_hessianrenamed tobarrier_first_derivativeandbarrier_second_derivativerespectively - Co-authored by @arvigj
- Update compiler warnings in #88
- Add
-Werror=enum-conversionand-Wfloat-conversion
- Add
- Fix 🐛 hash when not using Abseil in #90
- Clean-up SpatialHash Broad Phase in #91
- Replace
IPC_TOOLKIT_WITH_CORRECT_CCDwithIPC_TOOLKIT_WITH_INEXACT_CCD- Always include Tight Inclusion CCD because it is used by Nonlinear CCD
- Add support for face-face collision (not used anywhere but for completeness and future-proof nonlinear face-face)
- Add and use generic functions to
SpatialHash - Replace
camelCasewithsnake_caseinSpatialHashandHashGrid
- Replace
- Update Scalable CCD in #92
- Updated Scalable CCD (i.e., Sweep and Tiniest Queue and CUDA Tight Inclusion CCD) to the unified repository with support for generic collision pairs.
- Renamed
SWEEP_AND_TINIEST_QUEUEtoSWEEP_AND_PRUNEto reflect that it is a standard implementation of the sweep and prune algorithm (see, e.g., "Real-Time Collision Detection" [Ericson 2004]) - Renamed
SWEEP_AND_TINIEST_QUEUE_GPUtoSWEEP_AND_TINIEST_QUEUEto reflect that it is the only existing implementation of the sweep and tiniest queue algorithm
- Mark single argument constructors explicit in #93
- Mark
BarrierPotential(double)andFrictionPotential(double)as explicit constructors to avoid implicit conversions from double
- Mark
- Fix compatibility with the latest Eigen by @teseoch in #94
- Add clang-format check action in #96
- Add new project PSD option by @Huangzizhou in #95
- Instead of clamping the negative eigenvalues to zero, add the option to flips the sign of negative eigenvalues according to [Chen et al. 2024]
- Fix 🐛 Python bindings for Numpy 2 in #100
- Make faces an optional parameter to
CollisionMeshin #105 - Fix Python documentation by @rc in #108
- Polymorphic CCD in #110
- Add narrow phase CCD parent class; pass CCD object to choose method
- Replace
toleranceandmax_iterationsparameters withconst NarrowPhaseCCD& narrow_phase_ccdparameter -
NarrowPhaseCCDis a virtual class containing the CCD methods for point-point, point-edge, edge-edge, and point-triangle CCD -
NarrowPhaseCCDis implemented byInexactCCD,TightInclusionCCD, andAdditiveCCDclasses -
[Breaking] The optional parameter order to
is_step_collision_freeandcompute_collision_free_stepsizeis changed fromtoconst BroadPhaseMethod broad_phase_method = DEFAULT_BROAD_PHASE_METHOD, const double min_distance = 0.0, const double tolerance = DEFAULT_CCD_TOLERANCE, const long max_iterations = DEFAULT_CCD_MAX_ITERATIONS);
const double min_distance = 0.0, const BroadPhaseMethod broad_phase_method = DEFAULT_BROAD_PHASE_METHOD, const NarrowPhaseCCD& narrow_phase_ccd = DEFAULT_NARROW_PHASE_CCD);
- The inexact floating-point CCD can be enabled beside the Tight Inclusion CCD rather than replacing it
New Contributors
- @Huangzizhou made their first contribution in #95
- @rc made their first contribution in #108
Full Changelog: v1.2.1...v1.3.0
v1.2.1
v1.2.0
Various new features 🚀 and some bug fixes 🐛.
Highlights
- Implement the improved max approximator as described in [Li et al. 2023]
- Add a port of the Additive CCD method from [Li et al. 2021]
- Add a generic implementation of the nonlinear CCD (of linear geometry) algorithm from [Ferguson et al. 2021]
- Add missing codimensional collision support (point-point and point-edge)
What's Changed
- Update website URL to ipctk.xyz in #54
- Simplify tangential basis Jacobian calculation thanks to @halehOssadat and @jpanetta in #56
- Update
FindSIMD.cmaketo now add support for Neon (Arm/Apple Silicon SIMD instruction set) in #58- Credit:
FindSIMD.cmakefrom Project CHRONO under BSD 3-Clause "New" or "Revised" License.
- Credit:
- Improve the max approximator used (i.e., sum over constraints) as described in [Li et al. 2023] in #55
- Add a
dtypeto EE collisions to keep track of the distance type for mollified constraints - Initialize mesh adjacencies by default
- Use edge length as the area weighting for codimensional edges
- Add a
- Improve documentation and tutorials in #61
- Add documentation describing the convergent formulation
- Add documentation describing the constraint offset/minimum distance
- Add documentation for broad- and narrow-phase CCD
- Add documentation for High-Order IPC
- Also, renames
CollisionConstraint::minimum_distancetoCollisionConstraint::dmin
- Add a port of the Additive CCD method from [Li et al. 2021] in #62
- This is a modified version of the original open-source implementation which is under the Appache-2.0 License.
- Modifications: remove broad phase functions, refactor code to use a single implementation of the
additive_ccdalgorithm, utilize our distance function rather than porting the Codim-IPC versions, returntrueif the initial distance is less than the minimum distance, and add an explicittmaxparameter rather than relying on the initial value oftoi. - This is mostly for reference comparison and it is not integrated into the full code. This also includes the ability to pull the sample CCD queries and run them in a unit-test (requires GMP).
- This adds missing feature mentioned in #63
- Add Codecov to get a report of unit test code coverage in #64
- Add more tests to improve code coverage and fix small bugs in #65
- Fix the symmetric matrix assertion in
project_to_psdandproject_to_pdin #67 - Handle codim. point-point collisions in #66
- This adds missing feature as discussed in #63
- Add tests of Python bindings using nose2 in #69
- In CCD, check the initial distance when no motion occurs in #71
- Add a generic implementation of the nonlinear CCD (of linear geometry) algorithm from [Ferguson et al. 2021] in #72
- Generic nonlinear trajectories are specified through a
NonlinearTrajectoryvirtual class. By default the maximum distance between the trajectory and a linearized version is computed using interval arithmetic. That is$\max_{t \in [0, 1]} \Vert p(\mathrm{lerp}(t_0, t_1, t)) - \mathrm{lerp}(p(t_0), p(t_1), t) \Vert_2 \leq \sup(\Vert p([t_0, t_1]) - \mathrm{lerp}(p(t_0), p(t_1), [0, 1]) \Vert_2)$ where$p$ is the point's position over time,$\mathrm{lerp}(a, b, t) := (b - a) t + a$ and$\sup([a,b]):=b$ . Because this can be an overly conservative approximation, users can override theNonlinearTrajectory::max_distance_from_linearfunction to compute the max directly in closed form, if known. - We perform interval arithmetic using filib which has been shown to be "the only library that is correct, consistent, portable, and efficient" [Tang et al. 2022].
- Add a nonlinear CCD tutorial to the docs in #78
- Generic nonlinear trajectories are specified through a
- Add additional compiler warnings and resolve them to be warning-free in #73
- Add Python bindings for
igl::predicate::segment_segment_intersectin #74 - Integrate SimpleBVH as a broad-phase method in #75
- Fix the shape derivative of mollified edge-edge contact in #76
- Additionally, this makes the shape derivative computation object-oriented.
- Update Python bindings with recent changes and unified comments in #77
- Add support for collision between codimensional edges and points in 3D in #79
- Implements missing features discussed in #63.
Full Changelog: v1.1.1...v1.2.0
New Contributors
- @halehOssadat made their first contribution in #56
- @jpanetta made their first contribution in #56
v1.1.1
v1.1.0
Large refactoring to make the code more object-oriented rather than passing objects to functions. Other changes include the friction potential now being a function of velocity, bug fixes, and a new tutorial.
What's Changed
- Large Refactor in #25
-
construct_collision_candidates(..., candidates)->candidates.build(...) -
is_step_collision_free(candidates, ...)->candidates.is_step_collision_free(...) -
compute_collision_free_stepsize(candidates, ...)->candidates.compute_collision_free_stepsize(...) -
compute_barrier_potential*(constraints, ...)->constraints.compute_potential*(...) -
compute_shape_derivative(constraints, ...)->constraints.compute_shape_derivative(...) -
compute_minimum_distance(constraints, ...)->constraints.compute_minimum_distance(...) -
construct_friction_constraint_set(..., friction_constraints)->friction_constraints.build(...) -
compute_friction_*(..., friction_constraints, ...)->friction_constraints.compute_*(...) - Generic
CollisionStencilparent class toCandidates,CollisionConstraints, andFrictionConstraints. - Renamed
ConstraintstoCollisionConstraints - Replaced single letter variable names
V,E,Fwithvertices/positions,edges,faces - Renamed
*_index->*_id - Replaced
inflation_radius = min_distance / 1.99withinflation_radius = min_distance / 2and use rounding mode to conservativly inflate AABBs -
CollisionConstraints::use_convergent_formulationandare_shape_derivatives_enabledmust now be accessed through getter and setter functions - Friction potentials are now functions of velocity. Previously
V0andV1were passed andU = V1-V0. This limited the integration scheme to implicit Euler. Upstream this means you need to multiply the potential by1/(dv/dx)to get the correct friction force.- Change input
$\epsilon_vh$ to$\epsilon_v$ in #37 to reflect the fact that friction is defined in terms of velocity instead of displacement now.
- Change input
-
- Changed default
project_hessian_to_psdtofalsein #30 - Update website with a tutorial (#31) and version dropdown list (#34)
- Switch from templates to using Eigen::Ref in #28
- Speed up the CCD by limiting the maximum minimum distance to
1e-4in #43 - Fix the bug pointed out in #41 in #42. Namely, to get units of distance in the barrier we should divide the original function by
$\hat{d}\cdot(\hat{d} + 2d_\min)^2$ when using distance squared. Before it was being divided by$2d_\min \hat{d} + \hat{d}^2$ . - Fix build for IPC_TOOLKIT_WITH_CORRECT_CCD=OFF in #44
- Switched from FetchContent to CPM in #48. This provides better caching between builds. Additionally, made robin-map and Abseil optional dependencies.
- Add the CFL-Inspired Culling of CCD as described in Section 3 of the Technical Supplement to IPC in #50
Full Changelog: v1.0.0...v1.1.0
v1.0.0
This is the first official release. 🎉
This is a stable release of the toolkit prior to refactoring the code and making updates to the API.
New Contributors
- @danielepanozzo made their first contribution in #20
- @arvigj made their first contribution in #22
Full Changelog: https://github.com/ipc-sim/ipc-toolkit/commits/v1.0.0