Uses a basic iterative position solver to ensure that points don't
penetrate the curve surface during editing. Contact points are found
using raycast against the surface. The combing, pinch, and puff brushes
currently have collision support.
The contact constraints are solved for each individual curve (no
interaction between curves). Contact and segment-length constraints are
solved alternatingly in multiple iterations. This is a Gauss-Seidel
method as used in position-based dynamics solvers.
The curve radius determines the offset between curves and the surface,
but currently requires using temporary geometry nodes to set the radius
and then apply the nodes to the base geometry.
Brushes have inconsistent ways of defining the changed curves list. This
requires intermediate arrays for a consistent way to pass changed curves
to the constraint solver. Eventually brushes should use a unified
method of gathering affected curves to make this step unnecessary.
- Better method for setting curve radius
- Bring back the single-iteration, unphysical solver method (FLT) for fast editing
- Move the code to geometry module
- Add performance test with different thread grain sizes
- Add performance test with different curve lengths
- Add performance test with different BVH branching factors (child node count)
- Ensure correct curve transforms for deformed surfaces
- Add root-distance constraint to the pbd solver to speed up convergence





