git.lucas.co / hou-control
SideFX Houdini customization package
git clone https://git.lucas.co/hou-control.git

commitaadd210efef83443868b37a84496da4639564e10
parentb8846d4601
authorLucas Galante <[email protected]>
date2026-09-16 14:33
developer_surface_detangle: the Shapeshifter algorithm

The Shapeshifter branch raised Not Implemented. It is now a point
repulsion for a growing surface, inside a Repeat block driven by
Iterations: each pass pushes every point away from any other point
closer than Thickness (in average edge lengths, nearest-neighbour
spacing on a point cloud) that is not a topological neighbour within
Neighbour Rings edges, by half the overlap, and marks changed = 1.
Iterations defaults to 0 and the SideFX branch is untouched, so
existing instances behave as before; each algorithm's folder shows
only when it is selected.

Verified: two grids 0.3 apart open to the 0.556 thickness in one pass
and hold there, every point marked; a single flat grid is untouched.

Co-Authored-By: Claude Fable 5.1 <[email protected]>

 developer.md                                         |   2 +-
 otls-audit.md                                        |   3 ++-
 ...op_lsgalante.developer_surface_detangle.1.0.hdalc | Bin 6332 -> 11265 bytes
 3 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/developer.md b/developer.md
index eb8f816..3943d40 100644
--- a/developer.md
+++ b/developer.md
@@ -109,7 +109,7 @@ Names are the tab-menu labels without the "Developer" prefix; the file in `otls/
 
 ### Developer/Surface
 - Surface Adapt
-- Surface Detangle (Detangle)
+- Surface Detangle (Detangle): resolves self-intersections with the Detangle SOP, or with a point repulsion that pushes non-neighbouring points apart to a thickness.
 - Surface Open
 - Surface Remesh 1.0 and 1.1 (Remesh)
 - Surface Subdivide (Subdivide)
diff --git a/otls-audit.md b/otls-audit.md
index 346044b..53056f5 100644
--- a/otls-audit.md
+++ b/otls-audit.md
@@ -17,6 +17,8 @@ Audit of every HDA in `otls/`, run 2026-09-14 against Houdini 22.0.429 (Indie) w
 > | `developer_vector_from_scalar` | `developer_gradient 1.0` | `95abc44` |
 > | `developer_vector_rotate` | `developer_rotate 1.0` | `95abc44` |
 >
+> `developer_surface_detangle`'s Shapeshifter algorithm is built: a point repulsion over Iterations passes with Thickness in edge lengths and a Neighbour Rings exclusion, replacing the Not Implemented error. Section 4 now lists only the empty shells.
+>
 > `developer_attribute_remap`'s Class (point, primitive, detail) and Type (float, vector) and `developer_normalize`'s Method (summation, maximum, range) are real menus now.
 >
 > `developer_attribute_clip` is built (an Attribute field and a clamp to Range); `developer_attribute_constant`'s Class and `developer_surface_remesh 1.0`'s Transfer Method drive their switches, which were fixed at input 0. What is left in section 4 is single-entry menus, empty shells and the unimplemented Detangle algorithm.
@@ -171,7 +173,6 @@ For each top-level parameter the audit looked for a channel reference from any c
 | `developer_expire::1.0` | `attr` (empty shell) |
 | `developer_lead::1.0` | `amt` |
 | `developer_select::1.0` | `rnd_float_variation`, `rnd_float_variation_seed`, `rnd_float_multiplier`, `newparameter` (all read or removed in 1.1) |
-| `developer_surface_detangle::1.0` | `developer_iteration_ct` (the Shapeshifter algorithm is not implemented) |
 | `developer_surface_suture::1.0` | none since the thresholds drive the fuse |
 | `developer_weight::1.0` | `attr`, `multiplier` (empty shell) |
 | `gem_build_area::1.0` | `machine`, `dimensions` |
diff --git a/otls/sop_lsgalante.developer_surface_detangle.1.0.hdalc b/otls/sop_lsgalante.developer_surface_detangle.1.0.hdalc
index fc2fad4..160fca4 100644
Binary files a/otls/sop_lsgalante.developer_surface_detangle.1.0.hdalc and b/otls/sop_lsgalante.developer_surface_detangle.1.0.hdalc differ