SideFX Houdini customization package
git clone https://git.lucas.co/hou-control.git
otls: real menus on Attribute Remap and Normalize
Attribute Remap's Class and Type menus had one entry each. The network
is rebuilt as a detail pass for the domains and a class-run pass for
the fit, so Class offers Point, Primitive and Detail and a vector
attribute is remapped componentwise with one shared domain; Type is
informational since the attribute's own size decides. Domain and
ramp behaviour are unchanged.
Normalize's Method offered only Summation. Maximum scales so the
largest value becomes Target, and Range fits the values from their
minimum and maximum onto 0..Target; a detail pass replaces the sum
promote. Target's default moves from 0, which zeroed everything, to 1.
Existing entries keep their positions, so both stay at 1.0.
Co-Authored-By: Claude Fable 5.1 <[email protected]>
developer.md | 4 ++--
otls-audit.md | 4 ++--
...op_lsgalante.developer_attribute_remap.1.0.hdalc | Bin 10753 -> 11026 bytes
otls/sop_lsgalante.developer_normalize.1.0.hdalc | Bin 9605 -> 10008 bytes
4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/developer.md b/developer.md
index 9c9b9f9..eb8f816 100644
--- a/developer.md
+++ b/developer.md
@@ -87,7 +87,7 @@ Names are the tab-menu labels without the "Developer" prefix; the file in `otls/
- Measure: the Measure SOP; a primitive measurement is promoted to a detail attribute under the chosen name.
- Metamax: running minimum and maximum of an attribute across a frame range, as detail attributes; can read the range's end frame from outside the solver.
- Migrate 1.2 (Scalar Migrate, Vector Migrate): pushes an attribute's values along a per-point direction vector, by proximity or connectivity; the sender loses what the target gains.
-- Normalize (Scalar Normalize, Vector Normalize): rescales a float attribute so its values sum to a target, or makes a vector attribute unit length.
+- Normalize (Scalar Normalize, Vector Normalize): rescales a float attribute by its sum, maximum or range to a target, or makes a vector attribute unit length.
- Panel: one visualizer tab per attribute.
- Region Center
- Release
@@ -105,7 +105,7 @@ Names are the tab-menu labels without the "Developer" prefix; the file in `otls/
- Attribute Constant (Constant): a float or vector attribute holding one value, on points, primitives or the detail.
- Attribute Initialize (Scalar Initialize, Vector Initialize): one tab per float, vector or integer attribute; creates it from a constant or a source attribute with optional noise variation, plus an `<attr>_info` dictionary holding its range and any zeroed age attributes.
- Attribute Promote
-- Attribute Remap (Scalar Map, Scalar Ramp)
+- Attribute Remap (Scalar Map, Scalar Ramp): fits a float or vector attribute on points, primitives or the detail from one range to another, optionally through a ramp.
### Developer/Surface
- Surface Adapt
diff --git a/otls-audit.md b/otls-audit.md
index c7b1504..346044b 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_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.
>
> `developer_embryo` reads Source (internal sphere or the second input, which was wired to the first input's connector) and Base Resolution (default now 50, the value the sphere was fixed at).
@@ -165,11 +167,9 @@ For each top-level parameter the audit looked for a channel reference from any c
| node | unreferenced parameters |
|---|---|
-| `developer_attribute_remap::1.0` | `class`, `type` (single-entry menus) |
| `developer_charge::1.0` | `release`, `amount` (empty shell) |
| `developer_expire::1.0` | `attr` (empty shell) |
| `developer_lead::1.0` | `amt` |
-| `developer_normalize::1.0` | `method` (`type` drives the branch switch since the vector fix; `method` has one entry) |
| `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 |
diff --git a/otls/sop_lsgalante.developer_attribute_remap.1.0.hdalc b/otls/sop_lsgalante.developer_attribute_remap.1.0.hdalc
index 1c78f1f..867b058 100644
Binary files a/otls/sop_lsgalante.developer_attribute_remap.1.0.hdalc and b/otls/sop_lsgalante.developer_attribute_remap.1.0.hdalc differ
diff --git a/otls/sop_lsgalante.developer_normalize.1.0.hdalc b/otls/sop_lsgalante.developer_normalize.1.0.hdalc
index 33ae97f..c3cfe9b 100755
Binary files a/otls/sop_lsgalante.developer_normalize.1.0.hdalc and b/otls/sop_lsgalante.developer_normalize.1.0.hdalc differ