From ab86b67542ff74869e0733ee80075617f77143d7 Mon Sep 17 00:00:00 2001 From: Zachary Ferguson Date: Thu, 27 Jul 2023 10:47:28 -0400 Subject: [PATCH] Logo (#52) * Add logo * Update docs to RST --- README.md | 16 +- docs/CHANGELOG.md | 281 ++++++++++++++++---------------- docs/source/_static/logo.png | Bin 0 -> 107472 bytes docs/source/changelog.md | 2 - docs/source/changelog.rst | 2 + docs/source/code_of_conduct.md | 2 - docs/source/code_of_conduct.rst | 2 + docs/source/conf.py | 4 + docs/source/contributing.md | 2 - docs/source/contributing.rst | 2 + docs/source/cpp.md | 79 --------- docs/source/cpp.rst | 99 +++++++++++ docs/source/index.md | 63 ------- docs/source/index.rst | 65 ++++++++ docs/source/license.md | 6 - docs/source/license.rst | 6 + docs/source/python.md | 5 - docs/source/python.rst | 6 + docs/source/style_guide.md | 36 ---- docs/source/style_guide.rst | 42 +++++ 20 files changed, 377 insertions(+), 343 deletions(-) create mode 100644 docs/source/_static/logo.png delete mode 100644 docs/source/changelog.md create mode 100644 docs/source/changelog.rst delete mode 100644 docs/source/code_of_conduct.md create mode 100644 docs/source/code_of_conduct.rst delete mode 100644 docs/source/contributing.md create mode 100644 docs/source/contributing.rst delete mode 100644 docs/source/cpp.md create mode 100644 docs/source/cpp.rst delete mode 100644 docs/source/index.md create mode 100644 docs/source/index.rst delete mode 100644 docs/source/license.md create mode 100644 docs/source/license.rst delete mode 100644 docs/source/python.md create mode 100644 docs/source/python.rst delete mode 100644 docs/source/style_guide.md create mode 100644 docs/source/style_guide.rst diff --git a/README.md b/README.md index e1db9f1b8..a067f796e 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,13 @@ -# IPC Toolkit - -[![Build](https://github.com/ipc-sim/ipc-toolkit/actions/workflows/continuous.yml/badge.svg)](https://github.com/ipc-sim/ipc-toolkit/actions/workflows/continuous.yml) -[![Python](https://github.com/ipc-sim/ipc-toolkit/actions/workflows/python.yml/badge.svg)](https://github.com/ipc-sim/ipc-toolkit/actions/workflows/python.yml) -[![Docs](https://github.com/ipc-sim/ipc-toolkit/actions/workflows/docs.yml/badge.svg)](https://ipc-sim.github.io/ipc-toolkit/) -[![License](https://img.shields.io/github/license/ipc-sim/ipc-toolkit.svg?color=blue)](https://github.com/ipc-sim/ipc-toolkit/blob/main/LICENSE) +

+IPC Toolkit +

+ +

+ + + + +

## Description diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 471b26278..209ef8ba2 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -2,93 +2,90 @@ All notable changes to this project will be documented in this file. - - -## 2023-03-14 ([pr-30](https://github.com/ipc-sim/ipc-toolkit/pull/30)) - -### Changed - -* Default `project_hessian_to_psd` changed to `false` - -## 2023-03-14 ([pr-25](https://github.com/ipc-sim/ipc-toolkit/pull/25)) - -### Added - -* Generic `CollisionStencil` parent class to `Candidates`, `CollisionConstraints`, and `FrictionConstraints`. They all share the same distance functions. - -### Changed - -* Large refactor to make the code more object-oriented: - * `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_*(...)` -* Renamed `Constraints` to `CollisionConstraints` -* Renamed `*_index` → `*_id` -* `CollisionConstraints::use_convergent_formulation` and `are_shape_derivatives_enabled` must now be accessed through getter and setter functions -* Friction potentials are now functions of velocity. Previously `V0` and `V1` were passed and `U = V1-V0` was used. This limited the integration scheme to implicit Euler. Upstream this means you need to multiply the potential by $\left(\frac{dv}{dx}\right)^{-1}$ to get the correct friction force. - * TODO: Update the `compute_force` and `compute_force_jacobian` to take velocity as well. - -## 2023-01-17 ([pr-22](https://github.com/ipc-sim/ipc-toolkit/pull/22)) -### Changed -* Added a minimum distance optional parameter to all CCD functions (`const double min_distance = 0.0`). This is placed as the first optional argument which can break calling code if optional parameters were previously used. - -## 2022-02-21 ([pr-7](https://github.com/ipc-sim/ipc-toolkit/pull/7)) -### Added -* CollisionMesh to wrap up face and edges into a single data structure. - -### Removed -* Support for ignoring internal vertices. - * Instead, users should use the CollisionMesh to map from the full mesh to the surface mesh. - * This also includes a `to_full_dof` function that can map the reduced gradient/hessian to the full mesh's DOF - -## 2021-10-05 ([9e2cc2a](https://github.com/ipc-sim/ipc-toolkit/commit/574f7577daa5e0b51bf5baf20998994b8371216e)) -### Added +## v1.1.0 (Jul 25, 2023) + +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. + +### Details + +* Large Refactor in [#25](https://github.com/ipc-sim/ipc-toolkit/pull/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 `CollisionStencil` parent class to `Candidates`, `CollisionConstraints`, and `FrictionConstraints`. + * Renamed `Constraints` to `CollisionConstraints` + * Replaced single letter variable names `V`, `E`, `F` with `vertices`/`positions`, `edges`, `faces` + * Renamed `*_index` -> `*_id` + * Replaced `inflation_radius = min_distance / 1.99` with `inflation_radius = min_distance / 2` and use rounding mode to conservativly inflate AABBs + * `CollisionConstraints::use_convergent_formulation` and `are_shape_derivatives_enabled` must now be accessed through getter and setter functions + * Friction potentials are now functions of velocity. Previously `V0` and `V1` were passed and `U = V1-V0`. This limited the integration scheme to implicit Euler. Upstream this means you need to multiply the potential by `1/(dv/dx)` to get the correct friction force. + * Change input $\epsilon_vh$ to $\epsilon_v$ in [#37](https://github.com/ipc-sim/ipc-toolkit/pull/37) to reflect the fact that friction is defined in terms of velocity instead of displacement now. +* Changed default `project_hessian_to_psd` to `false` in [#30](https://github.com/ipc-sim/ipc-toolkit/pull/30) +* Update website with a tutorial ([#31](https://github.com/ipc-sim/ipc-toolkit/pull/31)) and version dropdown list ([#34](https://github.com/ipc-sim/ipc-toolkit/pull/34)) +* Switch from templates to using `Eigen::Ref` in [#28](https://github.com/ipc-sim/ipc-toolkit/pull/28) +* Speed up the CCD by limiting the maximum minimum distance to `1e-4` in [#43](https://github.com/ipc-sim/ipc-toolkit/pull/43) +* Fix the bug pointed out in [#41](https://github.com/ipc-sim/ipc-toolkit/pull/41) in [#42](https://github.com/ipc-sim/ipc-toolkit/pull/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](https://github.com/ipc-sim/ipc-toolkit/pull/44) +* Switched from FetchContent to CPM in [#48](https://github.com/ipc-sim/ipc-toolkit/pull/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](https://github.com/ipc-sim/ipc-toolkit/pull/50) + +## v1.0.0 (Feb 21, 2023) + +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. + +### Details + +* Added a minimum distance optional parameter to all CCD functions (`const double min_distance = 0.0`) in [#22](https://github.com/ipc-sim/ipc-toolkit/pull/22). This is placed as the first optional argument which can break calling code if optional parameters were previously used. +* Added `CollisionMesh` in [#7](https://github.com/ipc-sim/ipc-toolkit/pull/7) to wrap up face and edges into a single data structure. + * Removes Support for ignoring internal vertices. Instead, users should use the CollisionMesh to map from the full mesh to the surface mesh. + * This also includes a `to_full_dof` function that can map the reduced gradient/hessian to the full mesh's DOF. + +## Pre-v1.0.0 + +### 2021-10-05 ([9e2cc2a](https://github.com/ipc-sim/ipc-toolkit/commit/574f7577daa5e0b51bf5baf20998994b8371216e)) +#### Added * Added implicits source folder to organize point-plane collisions -## 2021-09-05 ([9e2cc2a](https://github.com/ipc-sim/ipc-toolkit/commit/9e22cc2a5f7e7ca048a579f2c94d2241782ecf17)) -### Added +### 2021-09-05 ([9e2cc2a](https://github.com/ipc-sim/ipc-toolkit/commit/9e22cc2a5f7e7ca048a579f2c94d2241782ecf17)) +#### Added * Added support for point vs. (static) analytical plane contact -## 2021-08-21 ([acf2a80](https://github.com/ipc-sim/ipc-toolkit/commit/acf2a80544ebe27dc5e440602a3a89243e575e8a)) -### Changed +### 2021-08-21 ([acf2a80](https://github.com/ipc-sim/ipc-toolkit/commit/acf2a80544ebe27dc5e440602a3a89243e575e8a)) +#### Changed * Changed CMake target name to `ipc::toolkit` -## 2021-07-26 ([1479aae](https://github.com/ipc-sim/ipc-toolkit/commit/1479aaea958daaa4e963529493e4169dc7757913)) -### Changed +### 2021-07-26 ([1479aae](https://github.com/ipc-sim/ipc-toolkit/commit/1479aaea958daaa4e963529493e4169dc7757913)) +#### Changed * Updated the CMake system to use modern `FetchContent` to download externals -## 2021-07-22 ([e24c76d](https://github.com/ipc-sim/ipc-toolkit/commit/e24c76ddc818fb9efc4d522ef72a581a15abf751)) -### Fixed +### 2021-07-22 ([e24c76d](https://github.com/ipc-sim/ipc-toolkit/commit/e24c76ddc818fb9efc4d522ef72a581a15abf751)) +#### Fixed * Updated CCD strategy when using Tight Inclusion to only perform `no_zero_toi=true` when there is no minimum distance -## 2021-07-17 ([a20f7a2](https://github.com/ipc-sim/ipc-toolkit/commit/a20f7a2dfea5a04c67ef71d0cd523f69391f2f54)) -### Added +### 2021-07-17 ([a20f7a2](https://github.com/ipc-sim/ipc-toolkit/commit/a20f7a2dfea5a04c67ef71d0cd523f69391f2f54)) +#### Added * Added `detect_edge_face_collision_candidates_brute_force` for 3D intersection broad-phase * Added ability to save an obj of collision candidates * Added tests for has_intersection (all pass after fixes) -### Fixed +#### Fixed * Fixed possible numerical rounding problems in HashGrid `AABB::are_overlapping` * Fixed HashGrid's function for getting edge-face intersection candidates -## 2021-07-15 ([7301b42](https://github.com/ipc-sim/ipc-toolkit/commit/7301b422a9b9a90c76d9e7abf2f9127bf6d0dbd6)) -### Fixed +### 2021-07-15 ([7301b42](https://github.com/ipc-sim/ipc-toolkit/commit/7301b422a9b9a90c76d9e7abf2f9127bf6d0dbd6)) +#### Fixed * Use `ignore_codimensional_vertices` in the brute force broad-phase method * Fixed AABB inflation in brute force and SpatialHash methods -## 2021-07-08 ([86ae4e5](https://github.com/ipc-sim/ipc-toolkit/commit/86ae4e5f87eb2c65585920ad3ca0bbb3b57702f6)) -### Changed +### 2021-07-08 ([86ae4e5](https://github.com/ipc-sim/ipc-toolkit/commit/86ae4e5f87eb2c65585920ad3ca0bbb3b57702f6)) +#### Changed * Replaced vertex group ids with more powerful can_collide function. By default everything can collide with everything (same as before) * Reordered parameters in `construct_constraint_set()`, @@ -97,205 +94,205 @@ default everything can collide with everything (same as before) than building it * `update_barrier_stiffness` dropped dhat parameter -### Fixed +#### Fixed * SpatialHash for 2D -### Removed +#### Removed * Verison of `initial_barrier_stiffness` that computes the constraint set and barrier gradient because there are a lot of parameters to these functions -## 2021-07-05 ([4d16954](https://github.com/ipc-sim/ipc-toolkit/commit/4d16954012570b3a15346b99b5aedea77266fe86)) -### Changed +### 2021-07-05 ([4d16954](https://github.com/ipc-sim/ipc-toolkit/commit/4d16954012570b3a15346b99b5aedea77266fe86)) +#### Changed * Renamed directory `src/spatial_hash/` → `src/broad_phase/` * Renamed files `src/ccd/broad_phase.*` → `src/ccd/aabb.*` -## 2021-07-05 ([b3808e1](https://github.com/ipc-sim/ipc-toolkit/commit/b3808e15bdbaba9a6efd4b731db3070e85bcc4b7)) -### Added +### 2021-07-05 ([b3808e1](https://github.com/ipc-sim/ipc-toolkit/commit/b3808e15bdbaba9a6efd4b731db3070e85bcc4b7)) +#### Added * Select the broad-phase method for CCD and distance constraints * Methods: `HASH_GRID`, `SPATIAL_HASH`, `BRUTE_FORCE` * CCD parameters for Tight Inclusion's tolerance and maximum iterations -### Changed +#### Changed * `ignore_codimensional_vertices` to `false` by default * CMake option `TIGHT_INCLUSION_WITH_NO_ZERO_TOI=ON` as default -## 2021-06-18 ([aa59aeb](https://github.com/ipc-sim/ipc-toolkit/commit/aa59aeb0634af981a8f1cfbb6d2ff2b76a04d610)) -### Changed +### 2021-06-18 ([aa59aeb](https://github.com/ipc-sim/ipc-toolkit/commit/aa59aeb0634af981a8f1cfbb6d2ff2b76a04d610)) +#### Changed * `construct_friction_constraint_set` now clears the given `friction_constraint_set` -## 2021-05-18 ([245b13b](https://github.com/ipc-sim/ipc-toolkit/commit/245b13bcc5e99ed52850ae865aaa0ad4e71a43a8)) -### Changed +### 2021-05-18 ([245b13b](https://github.com/ipc-sim/ipc-toolkit/commit/245b13bcc5e99ed52850ae865aaa0ad4e71a43a8)) +#### Changed * Use TightInclusion degenerate edge-edge for point-point and point-edge CCD -## 2021-05-11 ([5c34dcd](https://github.com/ipc-sim/ipc-toolkit/commit/5c34dcdf226d46ada962204585fa386eb9b67859)) -### Changed +### 2021-05-11 ([5c34dcd](https://github.com/ipc-sim/ipc-toolkit/commit/5c34dcdf226d46ada962204585fa386eb9b67859)) +#### Changed * `char*` exceptions to `std::exceptions` -## 2021-05-06 ([24056cc](https://github.com/ipc-sim/ipc-toolkit/commit/24056ccb2ca0a03bdef8141bc5011c41547f06b5)) -### Changed +### 2021-05-06 ([24056cc](https://github.com/ipc-sim/ipc-toolkit/commit/24056ccb2ca0a03bdef8141bc5011c41547f06b5)) +#### Changed * Gave `dhat_epsilon_scale` a default value of `1e-9` in `update_barrier_stiffness` * :warning: Changed order of parameters to `update_barrier_stiffness` * Flipped `bbox_diagonal` and `dhat_epsilon_scale` -## 2021-05-06 ([81d65f3](https://github.com/ipc-sim/ipc-toolkit/commit/81d65f32e479fea32d0acc29c8a7a532fa55518b)) -### Fixed +### 2021-05-06 ([81d65f3](https://github.com/ipc-sim/ipc-toolkit/commit/81d65f32e479fea32d0acc29c8a7a532fa55518b)) +#### Fixed * Bug in output min distance of `update_barrier_stiffness` -## 2021-05-04 ([59ec167](https://github.com/ipc-sim/ipc-toolkit/commit/59ec167b85eaf56095a2d0333bdd96146d658ebf)) -### Changed +### 2021-05-04 ([59ec167](https://github.com/ipc-sim/ipc-toolkit/commit/59ec167b85eaf56095a2d0333bdd96146d658ebf)) +#### Changed * Moved eigen_ext functions into ipc namespace * Renamed max size matrices with `Max` * `Eigen::VectorX([0-9])` → `ipc::VectorMax$1` * `Eigen::MatrixXX([0-9])` → `ipc::VectorMax$1` * `Eigen::ArrayMax([0-9])` → `ipc::ArrayMax$1` -## 2021-05-03 ([664d65f](https://github.com/ipc-sim/ipc-toolkit/commit/664d65fd70dbd350b6bfe5f8a311a89ff4fef3bd)) -### Added +### 2021-05-03 ([664d65f](https://github.com/ipc-sim/ipc-toolkit/commit/664d65fd70dbd350b6bfe5f8a311a89ff4fef3bd)) +#### Added * Added utility function to check for edge-edge intersection in 2D and edge-triangle intersection in 3D. * Optionally: use GMP for exact edge-triangle intersection checks -## 2021-05-03 ([9b4ebfc](https://github.com/ipc-sim/ipc-toolkit/commit/9b4ebfc0f458645cf33eeebf8211607f45ad9cb4)) -### Added +### 2021-05-03 ([9b4ebfc](https://github.com/ipc-sim/ipc-toolkit/commit/9b4ebfc0f458645cf33eeebf8211607f45ad9cb4)) +#### Added * voxel_size_heuristic.cpp which suggests a good voxel size for the SpatialHash and HashGrid -### Changed +#### Changed * Changed HashGrid voxel size to be the average edge length not considering displacement length. This results in better performance, but can result in large memory usage. -## 2021-04-29 ([293d0ad](https://github.com/ipc-sim/ipc-toolkit/commit/293d0ad992c01df561e25c286043c9ae9b901ff0)) -### Added +### 2021-04-29 ([293d0ad](https://github.com/ipc-sim/ipc-toolkit/commit/293d0ad992c01df561e25c286043c9ae9b901ff0)) +#### Added * Added TBB parallel loops to the main function (`compute_potential`, `compute_friction_potential`, `compute_collision_free_stepsize`, etc.) * Added function `addVerticesFromEdges` that adds the vertices connected to edges in parallel and avoids duplicates -### Changed +#### Changed * Changed the HashGrid to use `ArrayMax3` over `VectorX3` to simplify the code -### Fixed +#### Fixed * Fixed some parameters that were not by reference -## 2021-04-21 ([c8a6d5](https://github.com/ipc-sim/ipc-toolkit/commit/c8a6d56823793e7be5e89238c3793e25bc45ffa0)) -### Added +### 2021-04-21 ([c8a6d5](https://github.com/ipc-sim/ipc-toolkit/commit/c8a6d56823793e7be5e89238c3793e25bc45ffa0)) +#### Added * Added the SpatialHash from the original IPC code base with some modification to get all candidates in parallel * Benchmark results indicate this SpatialHash is faster than the HashGrid with multithreading * TODO: Improve HashGrid or fully integrate SpatialHash into ipc.hpp -## 2021-02-11 ([9c7493](https://github.com/ipc-sim/ipc-toolkit/commit/9c74938fefa691db6b79c73489c8c661638019c6)) -### Changed +### 2021-02-11 ([9c7493](https://github.com/ipc-sim/ipc-toolkit/commit/9c74938fefa691db6b79c73489c8c661638019c6)) +#### Changed * Switched to the correct (conservative) CCD of [[Wang and Ferguson et al. 2020]](https://continuous-collision-detection.github.io/) * Can select Etienne Vouga's CCD in the CMake (see README.md) -## 2021-02-01 ([b510253](https://github.com/ipc-sim/ipc-toolkit/commit/b51025310223b487e7c39858265d8d5c3e8b1e8a)) -### Added +### 2021-02-01 ([b510253](https://github.com/ipc-sim/ipc-toolkit/commit/b51025310223b487e7c39858265d8d5c3e8b1e8a)) +#### Added * Added minimum seperation distance (thickness) to distance constraints * Based on [Codimensional Incremental Potential Contact [Li et al. 2020]](https://arxiv.org/abs/2012.04457) -## 2021-02-01 ([a395175](https://github.com/ipc-sim/ipc-toolkit/commit/a3951750ca5f167ab1d546ae1dadd87d0a9e2497)) -### Added +### 2021-02-01 ([a395175](https://github.com/ipc-sim/ipc-toolkit/commit/a3951750ca5f167ab1d546ae1dadd87d0a9e2497)) +#### Added * Added 2D friction model based on the 3D formulation. * TODO: Test this further -## 2021-01-12 ([deee6d0](https://github.com/ipc-sim/ipc-toolkit/commit/deee6d0f9802910c5565f800492f9a995e65cf7e)) -### Added +### 2021-01-12 ([deee6d0](https://github.com/ipc-sim/ipc-toolkit/commit/deee6d0f9802910c5565f800492f9a995e65cf7e)) +#### Added * Added and optional parameter `F2E` to `construct_constraint_set()`. This is similar to `F` (which maps faces to vertices), but maps faces to edges. This is optional, but recommended for better performance. If not provided a simple linear search will be done per face edge! * TODO: Add a function to compute this mapping. -## 2021-01-09 ([deee6d0](https://github.com/ipc-sim/ipc-toolkit/commit/deee6d0f9802910c5565f800492f9a995e65cf7e)) -### Changed +### 2021-01-09 ([deee6d0](https://github.com/ipc-sim/ipc-toolkit/commit/deee6d0f9802910c5565f800492f9a995e65cf7e)) +#### Changed * Replaced VectorXd and MatrixXd with static size versions for local gradient and hessians -## 2020-11-20 ([93143ad](https://github.com/ipc-sim/ipc-toolkit/commit/93143ad9b31030cde7324a83354268021e1cb9da)) -### Changed +### 2020-11-20 ([93143ad](https://github.com/ipc-sim/ipc-toolkit/commit/93143ad9b31030cde7324a83354268021e1cb9da)) +#### Changed * Removed TBB parallelization form the hash grid because we get better performance without it. * TODO: Improve parallelization in the hash grid or switch to the original IPC spatial hash -## 2020-11-06 ([4553509](https://github.com/ipc-sim/ipc-toolkit/commit/4553509fe6a4e6b78c041018cd6db3fdf23b4730)) -### Fixed +### 2020-11-06 ([4553509](https://github.com/ipc-sim/ipc-toolkit/commit/4553509fe6a4e6b78c041018cd6db3fdf23b4730)) +#### Fixed * Fixed multiplicity for point-triangle distance computation to avoid duplicate point-point and point-edge pairs. -## 2020-10-22 ([51f4903](https://github.com/ipc-sim/ipc-toolkit/commit/51f49030dbeec15a6a7544826f5531811a779402)) -### Fixed +### 2020-10-22 ([51f4903](https://github.com/ipc-sim/ipc-toolkit/commit/51f49030dbeec15a6a7544826f5531811a779402)) +#### Fixed * Projection of the hessian to PSD. This was completely broken as the projected matrix was never used. -## 2020-10-22 ([9be6c0f](https://github.com/ipc-sim/ipc-toolkit/commit/9be6c0f7e2534e426e3f09f4c547406d50d5cf9c)) -### Fixed +### 2020-10-22 ([9be6c0f](https://github.com/ipc-sim/ipc-toolkit/commit/9be6c0f7e2534e426e3f09f4c547406d50d5cf9c)) +#### Fixed * Mollification of EE constraints that have a distance type of PP or PE * If there is no mollification needed then the PP and PE constraints are stored with multiplicity * Set the parallel EE friction constraint threshold to eps_x like in IPC * This avoid needing the mollification for the normal force and these forces are small anyways -## 2020-10-10 ([cb8b53f](https://github.com/ipc-sim/ipc-toolkit/commit/cb8b53fb098598ba5e8c95d4bdb4730e8df9382e)) -### Fixed +### 2020-10-10 ([cb8b53f](https://github.com/ipc-sim/ipc-toolkit/commit/cb8b53fb098598ba5e8c95d4bdb4730e8df9382e)) +#### Fixed * Assertions in `compute_collision_free_stepsize` -## 2020-10-10 ([4a5f84f](https://github.com/ipc-sim/ipc-toolkit/commit/4a5f84f1177bdae1a265dc15a84603bbc389936d)) -### Fixed +### 2020-10-10 ([4a5f84f](https://github.com/ipc-sim/ipc-toolkit/commit/4a5f84f1177bdae1a265dc15a84603bbc389936d)) +#### Fixed * Point-triangle distance type by replacing it with the one used in the original IPC code -## 2020-10-10 ([1d51a61](https://github.com/ipc-sim/ipc-toolkit/commit/1d51a61d60bb25e08c9937285ff9e44459a2223f)) -### Added +### 2020-10-10 ([1d51a61](https://github.com/ipc-sim/ipc-toolkit/commit/1d51a61d60bb25e08c9937285ff9e44459a2223f)) +#### Added * Boolean parameter in `compute_friction_potential_hessian` that controls if the hessian is projected to PSD -## 2020-10-09 ([b737fb0](https://github.com/ipc-sim/ipc-toolkit/commit/b737fb0e708eac5a7775766f162a5d2067db2fa4)) -### Added +### 2020-10-09 ([b737fb0](https://github.com/ipc-sim/ipc-toolkit/commit/b737fb0e708eac5a7775766f162a5d2067db2fa4)) +#### Added * Parameter for vertex group IDs to exclude some collisions (e.g., self collisions) -## 2020-10-08 ([6ee60ae](https://github.com/ipc-sim/ipc-toolkit/commit/6ee60aeaef6d7f88013ee2ee3d544e7403282527)) -### Added +### 2020-10-08 ([6ee60ae](https://github.com/ipc-sim/ipc-toolkit/commit/6ee60aeaef6d7f88013ee2ee3d544e7403282527)) +#### Added * Second version of `update_barrier_stiffness()` that takes an already computed minimum distance and world bounding box diagonal -## 2020-10-08 ([cc3947d](https://github.com/ipc-sim/ipc-toolkit/commit/cc3947d48bc069488f6a773424e30fe67eb4b5f1)) -### Added +### 2020-10-08 ([cc3947d](https://github.com/ipc-sim/ipc-toolkit/commit/cc3947d48bc069488f6a773424e30fe67eb4b5f1)) +#### Added * Second version of `initial_barrier_stiffness()` that takes an already computed barrier gradient * Assertions on `initial_barrier_stiffness()` input * `average_mass > 0 && min_barrier_stiffness_scale > 0` -### Changed +#### Changed * Fixed typo in `initial_barrier_stiffness()` name (was `intial_barrier_stiffness()`) -## 2020-10-07 ([5582582](https://github.com/ipc-sim/ipc-toolkit/commit/5582582bc2f54464bfcee4ba0ec2b7e6975f596f)) -### Added +### 2020-10-07 ([5582582](https://github.com/ipc-sim/ipc-toolkit/commit/5582582bc2f54464bfcee4ba0ec2b7e6975f596f)) +#### Added * `FrictionConstraint` structures to store friction information (i.e., tangent basis, normal force magnitude, closest points, and coefficient of friction) * Unit test that compares the original IPC code's friction components with the toolkit's -### Changed +#### Changed * `compute_friction_bases()` is now `construct_friction_constraint_set()` * It now takes the coefficient of friction (`mu`) * It now puts all information inside of the `FrictionConstraints` (`friction_constraint_set`) -## 2020-10-06 ([b48ba0e](https://github.com/ipc-sim/ipc-toolkit/commit/b48ba0ec9d60754e7670e28fd1987b0c78cd809f)) +### 2020-10-06 ([b48ba0e](https://github.com/ipc-sim/ipc-toolkit/commit/b48ba0ec9d60754e7670e28fd1987b0c78cd809f)) -### Changed +#### Changed * During `construct_constraint_set()` the constraints are added based on distance type * Duplicate vertex-vertex and edge-vertex constraints are handled by a multiplicity multiplier * Edge-edge constraints are always line-line distances * Point-triangle constraints are always point-plane distances -## 2020-10-05 ([9a4576b](https://github.com/ipc-sim/ipc-toolkit/commit/9a4576b209302c79296593ac213ed8ce85510f3b)) +### 2020-10-05 ([9a4576b](https://github.com/ipc-sim/ipc-toolkit/commit/9a4576b209302c79296593ac213ed8ce85510f3b)) -### Fixed +#### Fixed * Fixed a bug in the point-triangle closest points and tangent basis computed in `compute_friction_bases()` * Fixed a bug in `edge_edge_tangent_basis()` used to compute the tangent basis for friction -## 2020-09-19 ([31a37e0](https://github.com/ipc-sim/ipc-toolkit/commit/31a37e04abc9ecec325e00be97fd42b89c895b45)) +### 2020-09-19 ([31a37e0](https://github.com/ipc-sim/ipc-toolkit/commit/31a37e04abc9ecec325e00be97fd42b89c895b45)) -### Added +#### Added * spdlog for logging information -## 2020-09-19 ([acb7664](https://github.com/ipc-sim/ipc-toolkit/commit/acb7664792982685f6de28468ba126f5e531834f)) +### 2020-09-19 ([acb7664](https://github.com/ipc-sim/ipc-toolkit/commit/acb7664792982685f6de28468ba126f5e531834f)) -### Changed +#### Changed * Headers are now include with the prefix `ipc/` * E.g., `#include ` → `#include ` -## 2020-09-04 ([7dd2ab7](https://github.com/ipc-sim/ipc-toolkit/commit/7dd2ab7a255ffd23ccdfe5aee08bca6a142f75a7)) +### 2020-09-04 ([7dd2ab7](https://github.com/ipc-sim/ipc-toolkit/commit/7dd2ab7a255ffd23ccdfe5aee08bca6a142f75a7)) -### Added +#### Added * Collision constraint to store distance constraint pairs * `EdgeEdgeConstraint` stores the edge-edge mollifier threshold (`eps_x`) -### Changed +#### Changed * Input parameter `dhat_squared` is now `dhat` (i.e., non-squared value) * Input parameter `epsv_times_h_squared` is now `epsv_times_h` (i.e., non-squared value) * `Constraints` replaced `Candidates` diff --git a/docs/source/_static/logo.png b/docs/source/_static/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..4d6f8d3a22f30d08fce4f8031d821a4938af0941 GIT binary patch literal 107472 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

mX03 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

Z78EqJ9)3urv~eZ0`0=CD++h@MjH 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

BeY-R)LwNY{QWAFg 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 ME2=A0%9)4!7p<_?HUIzs literal 0 HcmV?d00001 diff --git a/docs/source/changelog.md b/docs/source/changelog.md deleted file mode 100644 index 66efc0fec..000000000 --- a/docs/source/changelog.md +++ /dev/null @@ -1,2 +0,0 @@ -```{include} ../CHANGELOG.md -``` diff --git a/docs/source/changelog.rst b/docs/source/changelog.rst new file mode 100644 index 000000000..4156c14bd --- /dev/null +++ b/docs/source/changelog.rst @@ -0,0 +1,2 @@ +.. include:: ../CHANGELOG.md + :parser: myst_parser.sphinx_ \ No newline at end of file diff --git a/docs/source/code_of_conduct.md b/docs/source/code_of_conduct.md deleted file mode 100644 index 1c46998a4..000000000 --- a/docs/source/code_of_conduct.md +++ /dev/null @@ -1,2 +0,0 @@ -```{include} ../CODE_OF_CONDUCT.md -``` diff --git a/docs/source/code_of_conduct.rst b/docs/source/code_of_conduct.rst new file mode 100644 index 000000000..f6ba82411 --- /dev/null +++ b/docs/source/code_of_conduct.rst @@ -0,0 +1,2 @@ +.. include:: ../CODE_OF_CONDUCT.md + :parser: myst_parser.sphinx_ \ No newline at end of file diff --git a/docs/source/conf.py b/docs/source/conf.py index c796f60dc..011abbe19 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -58,6 +58,10 @@ # 'sphinx_autodoc_toolbox.collapse', ] +myst_enable_extensions = [ + "dollarmath", +] + object_description_options = [ ("cpp:.*", dict(clang_format_style={"BasedOnStyle": "WebKit"})), ] diff --git a/docs/source/contributing.md b/docs/source/contributing.md deleted file mode 100644 index 78caf34e3..000000000 --- a/docs/source/contributing.md +++ /dev/null @@ -1,2 +0,0 @@ -```{include} ../CONTRIBUTING.md -``` diff --git a/docs/source/contributing.rst b/docs/source/contributing.rst new file mode 100644 index 000000000..d1b6e78cb --- /dev/null +++ b/docs/source/contributing.rst @@ -0,0 +1,2 @@ +.. include:: ../CONTRIBUTING.md + :parser: myst_parser.sphinx_ \ No newline at end of file diff --git a/docs/source/cpp.md b/docs/source/cpp.md deleted file mode 100644 index 4bdd62fdf..000000000 --- a/docs/source/cpp.md +++ /dev/null @@ -1,79 +0,0 @@ -# C++ - -[![Build](https://github.com/ipc-sim/ipc-toolkit/actions/workflows/continuous.yml/badge.svg)](https://github.com/ipc-sim/ipc-toolkit/actions/workflows/continuous.yml) -[![Docs](https://github.com/ipc-sim/ipc-toolkit/actions/workflows/docs.yml/badge.svg)](https://ipc-sim.github.io/ipc-toolkit/) -[![License](https://img.shields.io/github/license/ipc-sim/ipc-toolkit.svg?color=blue)](https://github.com/ipc-sim/ipc-toolkit/blob/main/LICENSE) - -## Build - -The easiest way to add the toolkit to an existing CMake project is to download it through CMake. -CMake provides functionality for doing this called [FetchContent](https://cmake.org/cmake/help/latest/module/FetchContent.html) (requires CMake ≥ 3.14). -We use this same process to download all external dependencies. - -For example, - -```cmake -include(FetchContent) -FetchContent_Declare( - ipc_toolkit - GIT_REPOSITORY https://github.com/ipc-sim/ipc-toolkit.git - GIT_TAG ${IPC_TOOLKIT_GIT_TAG} -) -FetchContent_MakeAvailable(ipc_toolkit) -``` - -where `IPC_TOOLKIT_GIT_TAG` is set to the version of the toolkit you want to use. This will download and add the toolkit to CMake. The toolkit can then be linked against using - -```cmake -# Link against the IPC Toolkit -target_link_libraries(${PROJECT_NAME} PUBLIC ipc::toolkit) -``` - -where `PROJECT_NAME` is the name of your library/binary. - -```{eval-rst} -.. tip:: - If your ``IPC_TOOLKIT_GIT_TAG`` is a tag (e.g. ``v1.1.0``), then you can use the ``FetchContent_Declare`` argument ``GIT_SHALLOW TRUE`` to download only a single commit. - Otherwise, you should use the default ``GIT_SHALLOW FALSE``. -``` - -### Dependencies - -**All required dependencies are downloaded through CMake** depending on the build options. - -The following libraries are used in this project: - -* [Eigen](https://eigen.tuxfamily.org/): linear algebra -* [libigl](https://github.com/libigl/libigl): basic geometry functions and predicates -* [TBB](https://github.com/wjakob/tbb): parallelization -* [Tight-Inclusion](https://github.com/Continuous-Collision-Detection/Tight-Inclusion): correct (conservative) CCD -* [spdlog](https://github.com/gabime/spdlog): logging information -* [robin-map](https://github.com/Tessil/robin-map): faster hash set/map than `std::unordered_set`/`std::unordered_map` -* [Abseil](https://abseil.io/): hashing utilities - -#### Optional - -* [GMP](https://gmplib.org/): rational arithmetic used for exact intersection checks - * Enable by using the CMake option `IPC_TOOLKIT_WITH_RATIONAL_INTERSECTION` - * GMP must be installed at a system level -* [Etienne Vouga's Collision Detection Library](https://github.com/evouga/collisiondetection): inexact CCD - * Included for comparison with the original IPC library - * Enable by disabling the CMake option `IPC_TOOLKIT_WITH_CORRECT_CCD` - * Replaces the default Tight-Inclusion CCD - -## Usage - -The main functionality is provided in the `ipc.hpp` header. Use the prefix directory `ipc` to include all header files (e.g. `#include `). - -## Unit Tests - -We provide unit tests for ensuring the correctness of our algorithmic pieces. -To enable the unit tests use the CMake option `IPC_TOOLKIT_BUILD_UNIT_TESTS`. - -### Dependencies - -The following are downloaded when unit tests are enabled (`IPC_TOOLKIT_BUILD_TESTS`) - -* [Catch2](https://github.com/catchorg/Catch2.git): testing framework -* [finite-diff](https://github.com/zfergus/finite-diff): finite-difference comparisons -* [Nlohman's JSON library](https://github.com/nlohmann/json): loading test data from JSON files \ No newline at end of file diff --git a/docs/source/cpp.rst b/docs/source/cpp.rst new file mode 100644 index 000000000..db9b354aa --- /dev/null +++ b/docs/source/cpp.rst @@ -0,0 +1,99 @@ +C++ +=== + +.. role:: cpp(code) + :language: c++ +.. role:: cmake(code) + :language: cmake + +.. image:: https://github.com/ipc-sim/ipc-toolkit/actions/workflows/continuous.yml/badge.svg + :target: https://github.com/ipc-sim/ipc-toolkit/actions/workflows/continuous.yml + :alt: Build +.. image:: https://github.com/ipc-sim/ipc-toolkit/actions/workflows/docs.yml/badge.svg + :target: https://ipc-sim.github.io/ipc-toolkit/ + :alt: Docs +.. image:: https://img.shields.io/github/license/ipc-sim/ipc-toolkit.svg?color=blue + :target: https://github.com/ipc-sim/ipc-toolkit/blob/main/LICENSE + :alt: License + +Build +----- + +The easiest way to add the toolkit to an existing CMake project is to download it through CMake. +CMake provides functionality for doing this called `FetchContent `__ (requires CMake ≥ 3.14). +We use this same process to download all external dependencies. + +For example, + +.. code:: cmake + + include(FetchContent) + FetchContent_Declare( + ipc_toolkit + GIT_REPOSITORY https://github.com/ipc-sim/ipc-toolkit.git + GIT_TAG ${IPC_TOOLKIT_GIT_TAG} + ) + FetchContent_MakeAvailable(ipc_toolkit) + +where :cmake:`IPC_TOOLKIT_GIT_TAG` is set to the version of the toolkit you want to use. This will download and add the toolkit to CMake. The toolkit can then be linked against using + +.. code:: cmake + + # Link against the IPC Toolkit + target_link_libraries(${PROJECT_NAME} PUBLIC ipc::toolkit) + +where :cmake:`PROJECT_NAME` is the name of your library/binary. + +.. tip:: + If your :cmake:`IPC_TOOLKIT_GIT_TAG` is a tag (e.g. ``v1.1.0``), then you can use the :cmake:`FetchContent_Declare` argument :cmake:`GIT_SHALLOW TRUE` to download only a single commit. Otherwise, you should use the default :cmake:`GIT_SHALLOW FALSE`. + +Dependencies +------------ + +**All required dependencies are downloaded through CMake** depending on the build options. + +The following libraries are used in this project: + +* `Eigen `__: linear algebra +* `libigl `__: basic geometry functions and predicates +* `TBB `__: parallelization +* `Tight-Inclusion `__: correct (conservative) CCD +* `spdlog `__: logging information + +Optional +-------- + +* `robin-map `__: faster hash set/map than :cpp:`std::unordered_set`/:cpp:`std::unordered_map` + * Enable by using the CMake option :cmake:`IPC_TOOLKIT_WITH_ROBIN_MAP` + * Enabled by default +* `Abseil `__: hashing utilities + * Enable by using the CMake option :cmake:`IPC_TOOLKIT_WITH_ABSEIL` + * Enabled by default +* `GMP `__: rational arithmetic used for exact intersection checks + * Enable by using the CMake option :cmake:`IPC_TOOLKIT_WITH_RATIONAL_INTERSECTION` + * GMP must be installed at a system level +* `Etienne Vouga's Collision Detection Library `__: inexact CCD + * Included for comparison with the original IPC library + * Enable by disabling the CMake option :cmake:`IPC_TOOLKIT_WITH_CORRECT_CCD` + * Replaces the default Tight-Inclusion CCD + +Usage +----- + +The main functionality is provided in the ``ipc.hpp`` header. Use the prefix directory ``ipc`` to include all header files (e.g. :cpp:`#include `). + +Unit Tests +---------- + +We provide unit tests for ensuring the correctness of our algorithmic pieces. To enable the unit tests use the CMake option :cmake:`IPC_TOOLKIT_BUILD_UNIT_TESTS`. + +.. _dependencies-1: + +Dependencies +^^^^^^^^^^^^ + +The following are downloaded when unit tests are enabled(:cmake:`IPC_TOOLKIT_BUILD_TESTS`) + +* `Catch2 `__: testing framework +* `finite-diff `__: finite-difference comparisons +* `Nlohman's JSON library `__: loading test data from JSON files \ No newline at end of file diff --git a/docs/source/index.md b/docs/source/index.md deleted file mode 100644 index e26c20f49..000000000 --- a/docs/source/index.md +++ /dev/null @@ -1,63 +0,0 @@ -```{toctree} -:caption: General -:hidden: - -Home -changelog -license -``` - -```{toctree} -:caption: Tutorial -:hidden: - -tutorial/getting_started.rst -tutorial/simulation.rst -tutorial/misc.rst -``` - -```{toctree} -:caption: C++ -:hidden: - -Getting Started -cpp-api/collision_mesh.rst -cpp-api/collision_constraints.rst -cpp-api/friction.rst -cpp-api/candidates.rst -cpp-api/broad_phase.rst -cpp-api/ccd.rst -cpp-api/distance.rst -cpp-api/barrier.rst -cpp-api/utils.rst -``` - -```{toctree} -:caption: Python -:hidden: - -Getting Started -python-api/collision_mesh.rst -python-api/collision_constraints.rst -python-api/friction.rst -python-api/candidates.rst -python-api/broad_phase.rst -python-api/ccd.rst -python-api/distance.rst -python-api/barrier.rst -python-api/utils.rst -``` - -```{toctree} -:caption: Developers -:hidden: - -contributing -style_guide -Code of Conduct -``` - - - -```{include} ../../README.md -``` diff --git a/docs/source/index.rst b/docs/source/index.rst new file mode 100644 index 000000000..ef5d627f5 --- /dev/null +++ b/docs/source/index.rst @@ -0,0 +1,65 @@ +.. toctree:: + :caption: General + :hidden: + + Home + changelog.rst + license.rst + +.. toctree:: + :caption: Tutorial + :hidden: + + tutorial/getting_started.rst + tutorial/simulation.rst + tutorial/misc.rst + +.. toctree:: + :caption: C++ + :hidden: + + Getting Started + cpp-api/collision_mesh.rst + cpp-api/collision_constraints.rst + cpp-api/friction.rst + cpp-api/candidates.rst + cpp-api/broad_phase.rst + cpp-api/ccd.rst + cpp-api/distance.rst + cpp-api/barrier.rst + cpp-api/utils.rst + +.. toctree:: + :caption: Python + :hidden: + + Getting Started + python-api/collision_mesh.rst + python-api/collision_constraints.rst + python-api/friction.rst + python-api/candidates.rst + python-api/broad_phase.rst + python-api/ccd.rst + python-api/distance.rst + python-api/barrier.rst + python-api/utils.rst + +.. toctree:: + :caption: Developers + :hidden: + + contributing + style_guide + Code of Conduct + +.. + +Home +==== + +.. image:: _static/logo.png + :alt: IPC Toolkit + +.. include:: ../../README.md + :parser: myst_parser.sphinx_ + :start-line: 4 diff --git a/docs/source/license.md b/docs/source/license.md deleted file mode 100644 index 7d79ba6c5..000000000 --- a/docs/source/license.md +++ /dev/null @@ -1,6 +0,0 @@ - -# License - -```{literalinclude} ../../LICENSE -:language: md -``` \ No newline at end of file diff --git a/docs/source/license.rst b/docs/source/license.rst new file mode 100644 index 000000000..573b5673c --- /dev/null +++ b/docs/source/license.rst @@ -0,0 +1,6 @@ + +License +======= + +.. literalinclude:: ../../LICENSE + :language: md \ No newline at end of file diff --git a/docs/source/python.md b/docs/source/python.md deleted file mode 100644 index 2be0e1640..000000000 --- a/docs/source/python.md +++ /dev/null @@ -1,5 +0,0 @@ -# Python - -```{include} ../../python/README.md -:start-line: 2 -``` diff --git a/docs/source/python.rst b/docs/source/python.rst new file mode 100644 index 000000000..5ec67e667 --- /dev/null +++ b/docs/source/python.rst @@ -0,0 +1,6 @@ +Python +====== + +.. include:: ../../python/README.md + :parser: myst_parser.sphinx_ + :start-line: 2 diff --git a/docs/source/style_guide.md b/docs/source/style_guide.md deleted file mode 100644 index 27dccad0b..000000000 --- a/docs/source/style_guide.md +++ /dev/null @@ -1,36 +0,0 @@ -# Style Guide - -This document provides a guide to the style used in this project. - -## Code Formatting - -We utilize [ClangFormat](https://clang.llvm.org/docs/ClangFormat.html) to automate code formatting. Please format your code before pushing and/or creating a pull request. - -## Naming conventions - -### General - -In general, we stick to the following naming conventions: - -* `snake_case` for variables, functions, and filenames -* `PascalCase` for classes and structs -* `ALL_CAPS` for constants and enum members -* `m_` prefix for class member variables (if the member is not public) -* `member()` to get a class member variable (if the member is not public) -* `set_member()` to set a class member variable (if the member is not public) - -### Specific - -* vertex positions: `vertices` or `positions` -* vertex displacements: `displacements` -* vertex rest positions/material coordinates: `rest_positions` -* vertex velocities: `velocities` -* mesh edge matrix: `edges` -* mesh face matrix: `faces` -* element vertices: we use a numeral suffix (e.g., `e0` and `e1` for the end-points of an edge) -* edge-edge pairings: suffix of `a` and `b` -* continuous collision detection pairs: suffix of `_t0` for starting values and `_t1` for end values - -## Documentation - -We use [Doxygen](https://www.doxygen.nl/index.html) to generate documentation. Please document your code before pushing and/or creating a pull request. \ No newline at end of file diff --git a/docs/source/style_guide.rst b/docs/source/style_guide.rst new file mode 100644 index 000000000..ccece75cf --- /dev/null +++ b/docs/source/style_guide.rst @@ -0,0 +1,42 @@ +Style Guide +=========== + +This document provides a guide to the style used in this project. + +Code Formatting +--------------- + +We utilize `ClangFormat `_ to automate code formatting. Please format your code before pushing and/or creating a pull request. + +Naming conventions +------------------ + +General +^^^^^^^ + +In general, we stick to the following naming conventions: + +* ``snake_case`` for variables, functions, and filenames +* ``PascalCase`` for classes and structs +* ``ALL_CAPS`` for constants and enum members +* ``m_`` prefix for class member variables (if the member is not public) +* ``member()`` to get a class member variable (if the member is not public) +* ``set_member()`` to set a class member variable (if the member is not public) + +Specific +^^^^^^^^ + +* vertex positions: ``vertices`` or ``positions`` +* vertex displacements: ``displacements`` +* vertex rest positions/material coordinates: ``rest_positions`` +* vertex velocities: ``velocities`` +* mesh edge matrix: ``edges`` +* mesh face matrix: ``faces`` +* element vertices: we use a numeral suffix (e.g., ``e0`` and ``e1`` for the end-points of an edge) +* edge-edge pairings: suffix of ``a`` and ``b`` +* continuous collision detection pairs: suffix of ``_t0`` for starting values and ``_t1`` for end values + +Documentation +------------- + +We use `Doxygen `_ to generate documentation. Please document your code before pushing and/or creating a pull request. \ No newline at end of file