1. 1.15.5Houdini 22.0+

    Added

    • Viewport UI size (TumbleTrove Settings > TumbleRig > General, 50 to 250 %): TumbleRig's header, toolbar, tab bar, Tool Panels and viewport text get bigger on large or high-resolution screens, on top of Houdini's own UI size, without changing the rest of Houdini. Applies at once.

  2. 1.15.4Houdini 22.0+

    Fixed

    • Animating with face shapes no longer gets slower over time. The blendshapes node kept a new copy of its GPU buffers for every rig update in the Animate state (each drag, key and frame) and never freed them, until the graphics card was full and the rig dropped below 1 fps. Memory now stays flat, and setting a key is about twice as fast.

  3. 1.15.3Houdini 22.0+

    Fixed

    • The Viewport Tabs' Recent list only shows TumbleRig nodes. Entering the Animate state on a Scene Animate (or any other node that isn't a TumbleRig tool) no longer adds it as a tab.

  4. 1.15.2Houdini 22.0+

    Changed

    • Maintenance update.

  5. 1.15.1Houdini 22.0+

    Changed

    • The rig visualization (joint boxes, bone tubes, IK and tint overlays) is built natively: about 10x faster per update and cheaper to draw. It is no longer see-through: IK and spine overlays draw as solid tubes, and the viz Alpha parm is hidden.

    • Dragging controls in the Animate state is faster on rigs with deformers: the rest mesh is no longer copied on every update while Main isn't scaled.

    • The tool header shows the node's icon in front of its name.

    • Viewport Tabs look the same in every placement (the floating bar, the viewport edge, across the top and on a Tool Panel's edge), and tab names that don't fit are shortened instead of overlapping.

  6. 1.15.0Houdini 22.0+What's new

    Added

    • Docs for every node: a Docs link beside each node on TumbleRig's TumbleTrove page, and a book icon in every tool's header that opens the node's docs in a floating window (what it does, inputs and outputs, every parameter with its help).

    • Noodle example 1.3: the artist's open-shoulder mesh, held on the torso by a shoulder shrinkwrap with normals and attribute transfer, so the join shades as one surface. Its sculpted face shapes stay editable, and it opens on the neutral face (the Chad shape is still on its slider).

    • Shoot Director (preview): record a take in Houdini and get a clean, looping clip with the cursor drawn on; the Shot Editor retimes, mutes and crops it. Opened from its page in TumbleTrove Settings.

    • apex_spline 6.1: picks its joints from the rest skeleton, so a rig edit above your splines no longer evaluates the rig once per Spline block (a Joints edit on the noodle 3.0 s to 2.4 s, the same rig). Read Joints From: Evaluated Rig gives 6.0's result.

    • Reopening a saved scene reuses its rig builds: saving writes them to a cache folder in your Houdini preferences, and the noodle's chain cooks in 4.2 s instead of 7.0 s after opening. TUMBLERIG_RIG_CACHE_DISK=0 turns it off.

    Changed

    • Tuning a mask or shape upstream no longer rebuilds the rig, and the steps whose input didn't change are skipped: a Delta Mush mask edit on the noodle drops from 3 s to 1.1 s, with the same result. Rig edits skip the skin steps that only read the mesh, so a Delta Mush edit is about 19% faster. It's on by default; TUMBLERIG_NO_RIG_CACHE=1 turns it off.

    • Rig edits spend less time in Sliders blocks: apex_sliders 2.0 renames its channels inside the rig script, so the ten Python renames on the noodle are gone (Python time per Joints edit about 580 to 180 ms).

    • The first edit after opening a scene no longer re-runs every skeleton step.

    • Dragging a control in the Animate state is faster on rigs with spline blocks: each spline's rest is solved once instead of on every update (6 to 8 ms less per update on the noodle, same result). TUMBLERIG_NO_SPLINE_REST_CACHE=1 turns it off.

    • Shrinkwrap and Attribute Transfer bind much faster on NVIDIA GPUs (Windows and Linux): Shrinkwrap's per-pose capture search 3.2 to 0.09 ms and Attribute Transfer's animated re-binding 3.7 to 0.5 ms on the noodle, with identical results, so dragging controls on rigs that use them is smoother. TUMBLERIG_SW_CAPTURE_SERIAL=1 runs the old search.

    • Show Invoked is 35 to 110 ms faster per edit: Delta Mush, Normals and Attribute Transfer keep their GPU setup when the rig rebuilds.

    • Spline IK 1.2, Eye Rig 1.1 and the noodle 1.3 use apex_spline 6.1 inside, with the same result.

    • Spline IK 1.2, Eye Rig 1.1, Rivet 1.0 and Joint Cages 1.0 load a precompiled rig script instead of compiling it on every cook.

    • apex_spline: layer controls sit at the middle of their span's length. They used to bunch toward the inner CV (4.4 cm off on the noodle's upper arm). Existing rigs change: keys on layer controls now act at the new spot.

    Removed

    • apex_ctrls 2.0: the Polished control style. Its filled rings covered the mesh while animating. Scenes saved with it reopen with the plain wire controls; colour themes and role shapes stay.

    Fixed

    • Plugging a wire into Bone Deform, Delta Mush, Joint Capture or Shrinkwrap no longer freezes Houdini (up to 6 s before, now instant). The match-count labels say "counts once the input has cooked" until the viewport has cooked the chain.

    • Shrinkwrap: the seam ring starts untwisted, and its roll follows the Parent Controller from its rest pose. The noodle's shoulders started 62 degrees twisted, now 2. Existing setups lose that starting twist.

    • apex_spline 6.0: with Main scaled, spline-driven arms and legs now shrink with the character (they kept their full size). At Main 1 nothing changes.

    • Spline Display: scaling or turning the whole rig no longer reads as stretch or twist, and twist warnings only mark real jumps.

    • A GPU node after a masked Delta Mush now reads the masked result: it read the unmasked one, which smoothed away up to 2.7 cm of the noodle's face shapes.

    • Noodle examples 1.0 to 1.3 show the posed character in the viewport, not the raw rig graph.

    • Sliders: the joint-tag fallback came back empty, and stripping '_to' left a trailing underscore.

    • The rig cache now notices a capture that moves to other joints with the same weights.

    • Update in the out-of-date warning no longer crashes Houdini (apex_spline most often).

  7. 1.14.1Houdini 22.0+
    • Joint Capture: per-frame content check runs in parallel (7x cheaper)

    • Rewires never cook inside the wiring event (76 assets)

    • Rewiring a TumbleRig node no longer rebuilds it a second time

    • IK Spline: no more false 'rest_transform missing' errors; a real Fit Offset failure says what is missing

    • Joint Capture: first cooks 7-20x faster, weights unchanged

  8. 1.14.0Houdini 22.0+What's new
    • Joint Capture: refuse a mesh in the Capture Pose input instead of crashing

    • Tool header: the node's version after its name, the warning beside it

    • HUD windows stay with Houdini: no popups over other applications

    • noodle example 1.2: Locality 1 on its nested splines

    • Capture Merge: multithreaded, 1M points in 19 ms instead of 158 ms

    • Tool Panels open about 8x faster: a new row never flashes up as its own window

    • Tool Panels and count labels never cook from their timers or during a scene load

    • Settings: TumbleRig's first page is "General", with the viewport HUD switch on top

    • Out-of-date warning: the tool's own node only, with Update and Scan all nodes

    • No pass over the scene's nodes on load or in the background

    • apex_rigExample_noodle 1.2: the blendshapes sculpted in the noodle rig workfile

    • Tool header: out-of-date nodes show as a warning icon with a list

    • Capture Merge: one node merges the capture weights of many capture nodes

    • cuda_joint_capture: Mask Blur, by Surface or Distance

    • apex_spline 6.0: Locality walls, a layer control stops at the layer below

    • cuda_joint_capture: Smooth By Surface or Distance

    • TumbleRig viewport HUD setting to turn it all off; the tab bar lists Recent tools by default and never scans the whole scene

    • Tab bar: a gear opens quick settings beside it

    • Header warns when the scene has TumbleRig nodes on an older version

    • Header: the TumbleRig wordmark's two colours line up at any UI scale

    • Control Parms HUD sliders keep inside the controls' limits; G keeps the HUD open

    • Viewport tools: the toolbar stays centred when the Control Parms HUD opens

    • apex_ik_spline 1.2 and apex_rigExample_noodle 1.2: every nested TumbleRig node on its newest version

    • Nested TumbleRig nodes on their newest versions: eye rig, joints, IK chains, inverse foot, space switcher

    • noodle example: a drawn icon instead of the character render

  9. 1.13.0Houdini 22.0+What's new
    • cuda_joint_capture: mask input red muted to sit with the other connector colours

    • cuda_joint_capture: the Mask Geometry input is red, the mask visualizer's colour

    • GPU nodes on OpenCL compute every point on Apple silicon; Subdivide and Solidify (ARAP) work on macOS

    • Header bar: a settings gear that opens TumbleTrove Settings on TumbleRig's page

    • noodle example 1.1: the colour theme colours the controls by side

    • apex_ctrls 2.0 Look: polished control shapes, colour themes and role shapes

    • apex_zipper: keep sep_weights / sep_zipper as hidden parms so saved scenes load quietly

    • Changelog 1.13 recipes: slider joysticks thumbnail shows the rounded frames

    • skeleton_doctor: keep sepparm as a hidden parm so saved scenes load quietly

    • Changelog 1.13 recipes: every example on the 1.13 what's new page, ready to drop

    • Toolbar buttons drop Houdini's icons: labels, and a lamp on switches

    • Joystick boards: Center Lines setting to draw plain frames

    • Joystick boards: 1D rows drawn as boxes, more room around the handle

    • Houdini's hint line on the viewport's bottom edge is hidden by default (a TumbleRig setting)

    • Camera moves leave the HUD alone: no "Can't edit yet", no greyed-out panels, no jumping tab bar

    • apex_joints 8.0 -> 8.1 swaps keep the FK control size

    • GPU settings page: a CUDA-off build reads "this build has no CUDA"

    • GPU nodes build without CUDA: macOS and --no-sops get every verb on OpenCL

    • Asset Browser: a Changelog section for the examples on each release's what's new page

    • GPU settings page: find GPUCache on macOS (.dylib, with and without the lib prefix)

    • Spline Display Reach: name the control the artist picked, count the chain it moves

    • Shapes panel: the selected shape's row is highlighted

    • Set Driven Keys: clip rows on the same control stack

    • Spline Display: every visit to Animate starts on the joint boxes

    • Fit Skeleton: a click inside a handle's box, ball or ring selects it

    • Viewport Tabs: the bar steps below a SideFX tool's title (Sculpt) instead of covering it

    • Fit Skeleton: a handle dragged back onto its press point restores its slider; Reset goes back to the scene's fit

    • Viewport tools keep the transform gadget's mode across their rig reloads

    • Shapes panel: drag a shape's value right in the panel; the hint names the control you clicked

    • Tool Panels grow and shrink with what they show: status lines, folded Quick Actions sections

    • apex_blendshapes 3.0: a shape's Range sets its slider's range, so a smile can go to 2

    • apex_spline 6.0: swapping from 5.x keeps the layers and their controls

    • cuda_bonecapture: VRAM reserve capped at 1 GB, so small captures no longer fail on a busy card

    • apex_spline 6.0 audit: keyed per-CV sliders move the skin, a whole-rig turn no longer reshapes the spline, layers no longer thin the joints, display ribbon right on layered / fit / multi-node rigs

    • Tool Panels: a panel that was open comes back after File > Open

    • HUD: header and toolbar lifted to a lighter grey, in the tab bar's family

    • HUD: soft macOS-style shadows, no header / toolbar flicker, panels survive camera moves

    • Port colours: every node's inputs and outputs follow the colour convention

    • HUD depth: soft glow around the header and toolbar, drop shadow on the tab bar

    • apex_wrap icon pops on the deformer node: bolder bands, no thin grey line

    • GPU settings page: menu is Automatic (CUDA) / CUDA / OpenCL, found card as a line under it

    • Tool Panels: selection survives writes, Joint Cages fields type, Space Switch follows any selection

    • Tool Panels for every node with a viewport tool; Blender-style number fields

    • Quick Actions: custom shapes under a 'Custom · input 2' row, dashed tile border

    • apex_spline 6.0: display ribbon (Squash & Stretch, Twist, Per-CV Value, Reach) + Spline Display Tool Panel; Rotation Pin ramp

    • Icons stay inside their box: apex_wrap redrawn, overflowing drawings fitted

    • Tool Panels: keys that leave the Animate state's F and S alone, plain hint separators

    • Small helper nodes: help cards, named inputs, match count on Selection Pattern

    • Fit joint In-Between reparents the child when a Suffix is set

    • Skeleton prep nodes: readable labels, match counts, help and named inputs

    • HUD audit fixes: every tool names itself in the header, the Channel Widget stays hidden, Viewport Tabs wait for the post-load refresh

    • Icons: black keylines on every coloured shape, softer secondary lines

    • Attribute and plumbing nodes: readable labels, menus, match counts and help

    • OpenCL backend: elastic delta mush

    • apex_spline 6.0 per-CV overrides: Twist Follow / Rotation Pin keep bind on rest, Roundness rows reach the layered final

    • CMake: drop a stray blank line in SOP_CudaAttribTransfer

    • ARAP runs on OpenCL too

    • Muted palette, brighter take: sage + clay at chroma 0.09, value 0.60

    • Wrinkles run on OpenCL too

    • Subdivide runs on OpenCL too; GpuDevice for one-bridge-two-backends ports

    • Muted node palette (sage + clay) and icon lights tinted to their node

    • Rig structure panels: help on every row parm, row separators, zipper corners folder and chain checks, inverse foot joint count

    • Toolbar chips: centre the lamp, icon and label as one group

    • Rivet runs on OpenCL too

    • Normals run on OpenCL too

    • GPU page shows what Automatic picks on this machine

    • Toolbar buttons get Houdini icons, and switches a lamp

    • Icons draw the controls their nodes build: IK pole, fit handles, cage handle, ctrl edit colour

    • apex_ctrls 2.0 Fit to Bone: Thickness Mode, Relative to Bone or Absolute

    • GPU page in TumbleTrove Settings: one switch for every GPU node

    • Surface deformer panels: real labels and help, steps grouped in run order, match counts next to every group field

    • Shrinkwrap runs on OpenCL too

    • Tool Panels rounded like the tab bar; no divider after the toolbar's icon tile

    • Wrap runs on OpenCL too; capture ties no longer depend on rounding

    • Lattice, geo merge and register positions run on OpenCL too

    • apex_ctrls 2.0: Fit to Bone -- control shapes that span their bone, in Edits By Patterns rows and the Quick Actions strip

    • Skinning, Wrap and Lattice panels: help on every parm, match counts next to the group fields, cuda capture laid out like Joint Capture

    • Viewport Tabs: snap by the pointer (no flicker near edges), running vs selected marks, the toolbar's panel toggle as an icon tile

    • apex_spline icon: its CVs drawn as the teal layer-1 controls it builds

    • apex_spline 6.0: pick CVs by their controls in Scene Animate; new Baked Rows start empty

    • IK Chains, Rig Defaults and Visibility Tool Panels: switch FK / IK without a pop, store rest poses from the selection, click through replacement shapes

    • apex_ik_spline icon: its ends drawn as the controls it builds

    • th::cuda_blendshapes: OpenCL backend (Auto falls back on unsupported cards)

    • Viewport Tabs: drag the icon bar by its grip, snapping to the viewport's edges; the SideFX Tool Info HUD stays off in TumbleRig tools

    • apex_ik_chains icon: the chain ends in the IK control, a dark-red square

    • Viewport Tabs: floating icon bar by default, one tile per node type with a pick list, Channel Widget and viewport prompt hidden in TumbleRig tools

    • Space Switch and Driven Keys Tool Panels: switch a control's space and keep its pose; check a driven key from its driver

    • cuda_bonecapture: OpenCL backend (GPU Backend parm, Auto falls back on unsupported cards)

    • Tool Panels: left-drag on number fields and stepper values

    • Asset Browser catalogue: node sections under a root Nodes section

    • Node thumbnails show their input and output dots

    • cuda_bonedeform + cuda_deltamush: OpenCL backend, GPU Backend parm (Auto/CUDA/OpenCL)

    • macOS build path: split src/sops into CPU-only and CUDA tiers, hpm macos scripts

    • macOS build path: CPU-only SOP verbs build everywhere, Apple silicon CI dry run

    • Asset Browser + website: node thumbnails

    • Shrinkwrap panel: Setup always open, match counts next to Seed Edges, Collider Group and Region

    • Eye Rig 1.1 cooks again: its lid curves select the lid joints as points

    • Sliders, Set Driven Keys, Space Switcher and Eye Rig panels: clearer rows, animator labels, help on every parm

    • Viewport tools: header bar in the toolbar's look

    • CUDA nodes: build for RTX 20 / GTX 16 (sm_75), clear error on unsupported GPUs

    • Button toolbar docks on the viewport's bottom edge

    • Rig tools: no dark band behind the button toolbar

    • Viewport tools: the buttons sit in one toolbar strip

    • Tool Panel: extra height goes above the key hints (panel as tall as its tabs)

    • Viewport Tabs review 2: button row back in place, panel flush with the tabs

    • Viewport Tabs: 'On the panel's edge' as Blender-style flags

    • Viewport Tabs: the tab rail on every Scene Viewer

    • Viewport tools: chip buttons, a pin on every Tool Panel, TumbleRig settings in TumbleTrove

    • apex_bonedeform 2.2: compat parms, so apex_skinning and older scenes load without warnings

    • apex_blendshapes 3.0: fixture re-saved, labels right after a scene load, long shape names end in ...

    • Deprecate skin_layer: still shipped, hidden from the Tab menu and the Asset Browser

    • Stop publishing th::attach_joint_geo (the compiled verb of the retired apex_attach_joint_geo)

    • apex_merge_graph / apex_merge_skel 1.0: repair the corrupt TypePropertiesOptions section

    • apex script refresh: a deferred view-flag sync on a deleted node is a skip, not a traceback

    • Compat parms: scenes saved with 1.12 load without 'Skipping unrecognized parameter'

    • apexgraph: recompile rig, sdk, thctrl, thsliders from the committed sources

    • apex_blendshapes 3.0: Optimize is an explicit, stored step

    • apex_blendshapes Shapes panel: GUI-verified; solo meters, narrower meter, hint; map built

    • apex_blendshapes 3.0: Shapes tool + Tool Panel (layout A)

    • Stop publishing apex_optimize_rig

    • Tool Panels never outlive their tool: lifecycle audit fixes

    • Icons: ring joints, FK / IK joint icons, orange audit fixes

    • Joint Cages and Join

    ...(truncated)

  10. 1.12.6Houdini 22.0+

    Changed

    • joint_cages / apex_attach_joint_geo: new Single Cage per Joint toggle (on by default). A joint with several children gets ONE cage aimed at the average of its children and widened to cover them (a palm over every finger base, a pelvis over both hips) instead of one cage per child bone. Children pointing in opposite directions get a cage spanning all of them. Turn it off for the previous one-cage-per-bone behaviour.

    Fixed

    • Joints whose child is an END joint outside the Joints group now get their cage. The group only selects which joints host a cage.

    • A wrist whose only children are L_/R_ fingers no longer loses its cage to the L/R branching filter.

    • joint_cages guide no longer fails to cook when the HDA is built under TumbleTrove Desktop hython.

  11. 1.12.5Houdini 22.0+

    Added

    • th::joint_cages::1.0: pure-SOP successor of apex_attach_joint_geo. Builds per-joint capture cages from a bare KineFX skeleton (plus optional skin auto-fit) that feed cuda_joint_capture directly. Includes an apexanimate handle rig for tweaking individual cages: the handle is the cage, channels are absolute (zero = un-edited cage), edits persist as override rows (mirror / un-bake / reset), and the shaded cages are part of the invoked output so they stay visible outside the animate state.

    Changed

    • joint_cages: Selection folder open by default; override rows live in a collapsed folder.

  12. 1.12.4Houdini 22.0+

    Added

    • apex_attach_joint_geo ships again. th::apex_attach_joint_geo::1.0 (TH Apex Attach Joint Geo, under _TumbleRig/apex) was held out of release archives and the operator index as "not ready". It instantiates and cooks clean on a live character stream, so it is back in the package for adding joint volumes ahead of capture.

  13. 1.12.3Houdini 22.0+

    Fixed

    • apex_ik_chains: translating the Main control no longer squashes the IK limbs. With scale_parent left empty, the rig-scale factor was read through a Vector3-by-Matrix4 multiply that treats the vector as a point, so Main's translation leaked into the measured scale (1.88 at a 1.6 unit move) and the solver's rest chain was rescaled on every move. The default path now extracts scale the same way the explicit scale_parent path does. Setting scale_parent to Main is no longer needed as a workaround.

    Changed

    • fit_skeleton 3.0 and the noodle example rig pick up their latest saved definitions.

  14. 1.12.2Houdini 22.0+

    Fixed

    • apex_ik_chains: the build-time IK roll fix no longer flips skinned joints on well-bent limbs. It guessed from rest-frame handedness, aim axis and pole side, none of which decide the answer; rest bend does. Chains whose mid joint sits more than 0.5% of limb length off the root-to-end line now never receive a roll, which is where the solver already reproduces the authored rest frame. On affected rigs this showed up as a shoulder spike and a thigh seam, with the controls behaving correctly because the roll sat only on the solver output. Near-straight chains keep the previous behaviour.

  15. 1.12.1Houdini 22.0+

    Fully revamped Noodle example rig

    The shipped noodle example is rebuilt from the ground up on the current toolset, and now demonstrates the two headline features of this release directly: apex_ik_spline drives its spine, and apex_motion_effects drives its secondary motion. It also carries fit_skeleton 3.0, apex_blendshapes 2.4 with three sculpted shapes (smile, frown, asymmetric head), apex_ctrls, three apex_spline systems (arms/legs, body, feet), bone deform, delta mush and rig defaults - a full production chain rather than a minimal demo.

    Added

    • NEW HDA: th::apex_ik_spline::1.0 - hips/spine/chest IK spline. Guide spline plus a deform spline that emits spline joints, blended into the original spine controls, with an ik_chains-style FKIK settings control, a Hip Swing control, a chest IK control at the graph root, and output 1 = evaluated Base.skel.

    • fit_skeleton 3.0: an apexanimate handle rig that writes back to the sliders. A handle for every Placement slider (22 handles / 36 axes), 13 positional handles with working undo, rotate-gadget sliders, a spine-segments handle, volume handles with a Volumes toggle, and a synchronous live solve with a skeleton overlay during drags.

    • apex_blendshapes 2.4: the Shapes table is the ground truth. Per-row authoring and ranges, per-row Slider Name toggle for shared sliders, combo modes with a driver multiparm, in-between as a role row, a Sculpt button that shows and selects the node, auto-populate on wire, and Group as a real deform region.

    • apex_motion_effects: Spring Model (Legacy | Physical) with true damping-ratio damping, a real angular spring, and a rebalanced stiffness curve; Settle, to keep a big overshoot without the long wobble; Strength above 1 to extrapolate past the computed result; an envelope slider on the Main control; and effect nodes on root-level and IK goal controls.

    • apex_spline 5.1: per-layer Auto Tangent and Auto Aim Ends, Post Chord / Scale / Twist Smooth, a Skeleton Group parm, and hover help on every parm.

    • apex_ctrls: "Same Shape As" to copy another control's shape; Quick Actions reworked into Edits By Patterns.

    • cuda_joint_capture: Mask Attribute dropdown listing float point attributes on the rest geometry.

    Changed

    • motion_effects Spring Model defaults to Physical, which changes how already-authored motion_effects nodes behave. Set Spring Model = Legacy for the previous feel (bit-identical).

    • apex_bonedeform 2.2: dead SideFX-era parms dropped, method menu trimmed to LBS / DQS.

    • Pose storage no longer rebuilds the rig on every mouse-up (56 definitions).

    • apex_spline: the Group picker and menu no longer offer upstream spline joints.

    Fixed

    • Blendshapes survive a downstream bone deform: the deform region is stamped inside the rig graph instead of on a stream prim a later HDA repacks.

    • apex_motion_effects no longer packs its slider dict as Base.shp, which had been replacing the skin mesh with an empty packed prim for the rest of the chain.

    • th::spline fit-mode roll: own-frame rest_transform fallback plus u-order tangents and transport.

    • cuda_joint_capture: Max Influences honoured, geodesic mode respects the group.

    • fit_skeleton: rotate-delta read that broke every drag.

    Release engineering

    • v1.12.0's tag-triggered CI failed the subgraph freshness gate on thctrl and thviz: the manifest hashes the worktree, CI hashes the checkout, and two sources were CRLF locally against LF blobs. Both recompiled against their committed bytes, and release preflight now gates on worktree-vs-git byte drift so this cannot burn another tag.

  16. 1.11.0Houdini 22.0+
    • release: v1.11.0

    • apex_spline 5.1: tangent_scale v2 — handle DIRECTION follows the ctrl axis

    • apex_spline 5.1: ctrl down-chain scale drives tangent length (tangent_scale)

    • Icons: unique artwork for the 22 HDAs sharing or lacking an icon

    • apex_spline: redefine locality as chord-anchored broken tangents

    • apex_spline 5.1: restructure parm UX — layer collapsibles on Spline tab

    • apex_spline 5.1: "Layer N Overrides" — per-layer arc + arc_width + follow_pos

    • apex_spline 5.1: per-layer Arc overrides (layer2_arc / layer3_arc)

    • Drop Tumblehead-proprietary License sections from READMEs

    • th::spline: v1 rest-bound placement extended to the per-CV path

    • apex_spline 5.1: anti-swim v1 placement (rest-bound) + locality re-enabled

    • apex_spline 5.1: World-Spacing layers align to FK (guides forced to 2N-1)

    • th::viz: glyph gate = named joints, not skel_bind — FK glyphs survive bind_spline_only

    • apex_spline 5.1: opt-in even spline-joint distribution (sampling_version=1)

    • cuda_joint_capture: embed native capture-weight viewport visualizer

    • th::spline: sampling_version gate — legacy distribution stays default

    • th::spline: World Spacing sampling is follow_pos-invariant

    • apex_ik_chains 2.2: re-serialize Contents, dropping obsolete apex::graph parms

    • Group-select buttons open with the current group pre-selected

    • Gate HDA version removals on a stated reason at release preflight

    • Restore th::apex_ik_chains::2.2; never delete a shipped HDA version

    • selection_pattern: branch-aware bone selection in Group + Primitives mode

    • Document the apex_spline per-CV attribute override channel

    • apex_ik_chains: roll fix on the solver OUTPUT, not the solver twistoffset

    • apex_ik_chains: per-chain solver twistoffset so IK == FK at bind pose

    • IK viz overlay: drive tube radius off the rig-scale multiplier

  17. 1.10.1Houdini 22.0+
    • release: v1.10.1

    • Add sm_120 (consumer Blackwell / RTX 50xx) to the CUDA arch list

  18. 1.10.0Houdini 22.0+

    BETA: apex_boolean and apex_rivet ship as BETA. They are usable, but their parm layouts and behaviour may still change between releases — don't build production rigs that depend on their exact interface yet.

    Added

    • apex_rivet (BETA): ride skeleton joints on a deforming surface. Per-rivet overrides via a Rivets multiparm, Second Input joint source with a skeleton_doctor fallback, collapsible folders + discovery menus.

    • apex_boolean (BETA): optional second input as cutter source (cutter_source), plus target_group / cutter_group for stream-scoped cutting.

    • apex_ik_chains 2.4: multi-FKIK-system support — fkik_mode (Automatic | Specific) + an FKIK System dropdown, so parallel ik_chains siblings each target their own system on a merged rig.

    • apex_spline: per-CV unbounded roll ("infinite twist") — winding that does not wrap at ±360°, applied to the deformed joints only.

    • apex_wrap 1.6: driven_source (Second Input | Character Stream).

    • Group-mode selection gains a real Primitives class: pick BONES, with chains derived from connectivity + hierarchy depth.

    • Viewport pickers on the Selection Group field (joints or bones), following the selector-subnet convention.

    • require_ik_chains_built: the HDA now fails loudly when the IK build produces no solvers instead of silently doing nothing.

    • An operator asset index ships with the package.

    Changed

    • apex_ik_chains 2.4 derives Group-mode chains from the skeleton hierarchy, so bare joint names and a single glob both work and two chains need no wildcard. 2.3 keeps the previous pattern-slot reading, so existing scenes are untouched.

    • apex_ik_chains 2.4: the IK viz overlay follows the chains actually built (Viz Follows Built Chains, default on) instead of the upstream @ik=1 bone flag, which painted limbs the node never touched.

    • apex_shrinkwrap 1.1: defaults a Per-Piece Joints row, drops two dead parms.

    • Tag selection menus are toggles (add/remove, like a group parm), with a single machine-tag denylist.

    • The package no longer ships 56 MB of PDBs.

    • README replaced with the actual package contents.

    Fixed

    • apex_shrinkwrap: seed gate accepts ad-hoc edge selections; topology-true gate.

    • apex_rivet: joint_source = Second Input actually routes the skeleton; working guards on every failure path.

    • apex_wrap 1.6: the driven_shp menu lists the raw stream prims.

    • IK wire viz revived through computeRigViz (dead since the viz refactor) and blasting bones rather than points.

    • apex_ik_chains: dead ../group parameter references removed — they logged "Bad parameter reference" on every cook — and the stale 2.4 precompiled program refreshed.

    • cuda_boolean: near-degenerate bail emits a face partition rather than the whole face; grazing-cut notice demoted from warning to info.

    • An empty selection is a warning rather than a cook error, so a blank Selection Group no longer deadlocks the picker.

  19. 1.9.2Houdini 22.0+
    • release: v1.9.2

  20. 1.9.1Houdini 22.0+
    • release: v1.9.1

    • Fix subgraph manifest CRLF: re-seed cns source hashes as LF + pin subgraph .apex eol=lf

  21. 1.8.0Houdini 22.0+
    • release: v1.8.0

    • thutils: explicit apexscript import header + recompiled subgraph libs; apex_joints def re-save

    • apex_spline: per-CV twist multiplier (delta-since-rest) + FK-parent handoff

    • apex_spline: layered cascade inherits per-CV slider values

    • rig_defaults FKIK match: evaluate deform skeleton, never the viz ghost

    • apex_spline: arc gates smooth/follow_pos; post_smooth goes per-CV

    • rig_defaults: read ALL guide skeleton blobs for FKIK matching

    • selection_pattern: repair geotype-era def, redo comma support surgically

    • selection_pattern: Tags parm accepts commas as separators

    • cuda_joint_capture: preserve foreign joints through the mask/blend path

    • pose_session: flush stale baked-character snapshot, not just /animation poses

    • apex_spline 5.0: tags_attrib parm (dropdown + point/prim tags) + fit UI fix

    • rig_defaults: isolate discovers children through chain-subnet boundaries (ankle->ball)

    • rig_defaults: harden Set from Posed against capturing compensate counter-poses

    • rig_defaults: Isolate / Child Compensate — pose FK joints without children following

    • Cage tool v3: offset_ctrls edit scene + total-placement bake; no apex_joints

    • apex_bonedeform: rest_skel_prim dropdown (input-stream .skel prims)

    • apex_bonedeform: place rest_skel_prim next to skelrootpath + help text

    • apex_bonedeform: rest_skel_prim override (bind-at-corrected-pose)

    • apex_attach_joint_geo: fix dead cage deform (no live update in state)

    • apex_attach_joint_geo: input 1 MUST be a character stream

    • apex_attach_joint_geo: stream mode uses the INVOKED skeleton

    • apex_spline: move Tweak CV Defaults button into the Static CV Overrides folder

    • apex_attach_joint_geo: character-stream input (phase A)

    • apex_spline: Tweak CV Defaults one-click round trip

    • Cage controls: default Control Size 0.05 -> 0.1

    • apex_attach_joint_geo v2: pure-SOP output path, rows on the HDA, invoke tail deleted

    • Cage-edit live write-through: hook onPoseEndEvent (gadget + direct drags)

    • rot_pin redesign: pinned CV = twist boundary (twist starts AT the CV)

    • Invoked-skeleton convention: th::apex_skeleton_output + spline bones now OPEN polylines

    • spline_overrides_bake: read the real pose-store shape (nested packed clip)

    • skel_bind convention defaults: spline Spline-Joints-Only ON; attach + cuda_joint_capture default to skel_bind

    • apex_spline 5.0: replace custom override viewer state with stock pick + slider flow

    • Cage controls: Control Size parm (default 5% of avg cage length)

    • apex_spline 5.0: static CV + per-chain overrides, spline-overrides viewer state

    • attach_joint_geo: tolerate non-bone prims riding the skeleton input

    • Cage-edit: name-pattern selectors + live write-through + th_ball controls + viz strip

    • Code review changelog: 2026-07-18 findings resolved

    • Address cage-edit review findings (feature/2026-07-18_v1)

    • Code review: cage-edit stock-chain rebuild + mirror modes (Pass with Notes)

    • rig_defaults mirror_mode dropdown + true topological mirror; cage controls inherit host-joint names

    • apex_attach_joint_geo: compose from stock nodes + topology-based mirror in rig_defaults

    • CI: gate the SideFX picker-surface probe to windows

    • BooleanCPU: constexpr Grid::kEmpty (undefined-symbol link error on linux)

    • CI: cap linux cmake parallelism at -j2 (bare -j OOMs the worker + kills the agent)

    • apex_attach_joint_geo: keep_pose defaults ON (cage edits persist past state exit)

    • apex_attach_joint_geo: cage-edit sub-tool + ophide raw attach verb (phases 5+6)

    • apex_attach_joint_geo: cage repack -- output cages now move (phase 4)

    • CageDeformCore: hoist coordSum/coordAbsSum above the invert_fail goto (linux nvcc)

    • apex_eye_rig 1.1: update HDA definition

    • Re-enable linux-x86_64 release: build-linux CI + platform + .so archive include

    • apex_attach_joint_geo: singular-transform guards (degenerate skeleton hotfix)

    • apex_attach_joint_geo: per-cage control rig (phase 3 of cage-edit tool)

    • apex_attach_joint_geo: embed HDK attach node behind Selection/Radius/Shape tabs

    • th::spline: equivariant degenerate-tangent fallback (fit-endpoint world-lock fix)

    • edge_to_skeleton + th_spline_prepper: repair event sections corrupted by def re-save

    • edge_to_skeleton + th_spline_prepper: resync embedded skeleton_doctor parm data

    • cns::aim: mirror-safe live baseline (direct_rest_aim_local, kernel-convention bake)

    • cns constraints: complete the Main-follow sweep (aim 1.3 up wiring + point MO offset)

    • cns::aim: live dihedral baseline -- aim rows now follow Main at weight<1

    • apex_spline 5.0: twist-follow redesign (follow_rot) + per-CV rot_pin

  22. 1.7.9Houdini 22.0+
    • release: v1.7.9

    • CI: gate the SideFX picker-surface probe to windows

  23. 1.7.4Houdini 22.0+
    • release: v1.7.4

    • apex_shrinkwrap 1.0: Main-scale-comp the Second Input collider

    • apex_wrap 1.5: Main-scale-comp the wrap_shp accessory input (all 3 output modes)

    • apex_rig_defaults: mirror_selected clears the mirror targets' pose

  24. 1.7.3Houdini 22.0+
    • release: v1.7.3

    • Bump houdini_build_pin 22.0.367 -> 22.0.368

    • apex_eye_rig 1.1: update HDA definition

    • apex_ik_chains: import apexscript in ik subgraph builder; recompile mainscript

    • Precompiled mainscripts: broad rollout to 35 more HDA types (43 targets total)

    • tr-hda check: precompiled/* drift lint (md5, flatten, subgraph-stale, TARGETS wiring)

    • Precompiled mainscripts: flatten registry subgraphs at compile time; default back ON

    • Registry-subgraph mainscripts + CRITICAL: precompiled path now opt-in (tag aliasing)

    • apex_visibility: fix silent slider break on duplicate instance names ('visibility' default)

    • apex_visibility 1.2: per-setup Mode (Visibility/Activation) + apex_wrap 1.5 runtime 'active' gate

    • pose_session: defer exit-clear past state teardown (writeToSopNode re-stash)

    • Precompiled mainscripts rollout: joints, ik_chains, wrap, bonedeform, ctrls, sliders

    • Precompiled apex::script mainscripts: file-load the compiled graph (autorigcomponent pattern)

    • pose storage v2: session-scoped posing (keep_pose replaces autoresetanim)

    • apex_rig_defaults: mirror + world-to-row through the hybrid channel map

    • apex_rig_defaults: hybrid TRS offset — full-conj rotate/scale, rot-only translate

    • cuda_wrap perf: cheap re-capture + O(512) signature + deterministic ties

    • apex_rig_defaults: TRS offset is the captured channels VERBATIM, not conjugated

    • apex_rig_defaults: Set from Selected uses the clear-captured pair (stash+live)

    • th::visibility: mode parm (auto/prims/points/all) for points-only streams

    • apex_wrap 1.5: Rest Driver Source dropdown lists stream prims

    • apex_blendshapes 2.4: remove Sculpt on Invoked (superseded by Rest Shape Source)

    • apex_blendshapes 2.4: UI polish by Magnus (separators, flattened top strip)

    • apex_blendshapes 2.4: spline-style parm layout (Source box top, Pose bottom)

  25. 1.7.2Houdini 22.0+
    • release: v1.7.2

    • Def-save sweep: display-invoke callbacks + joints-8.0 slider tuning

    • th::subdivide: add Loop subdivision mode (mode 2) + apex_subdivide menu

    • apex_blendshapes 2.4: Rest Shape Source (matches apex_wrap 1.5 fc03188)

    • apex_wrap 1.5: Rest Driver Source -> stream-prim string parm (UX simplify)

    • apex_wrap 1.5: Rest Driver Source menu + custom rest-pose input (input 3)

    • apex_visibility: Geo Stream dropdown lists the ACTUAL input streams

    • apex_rig_defaults: slider default bake survives downstream chain HDAs

    • apex_rig_defaults: python post-pass writes slider defaults (DSL cannot)

    • apex_blendshapes 2.4: Sculpt on Invoked (context-delta sculpting)

    • apex_rig_defaults: thread the setDefaultParms result (bare inplace call orphaned)

    • apex_rig_defaults: one mirror_direction dropdown drives all mirror buttons

    • apex_rig_defaults: overlay baked slider values onto the live state after reset

    • apex_wrap 1.5: invoked-default-pose rest driver + cuda_wrap group/rest fixes

    • apex_rig_defaults: slider bake also writes the graph default-parm entry

    • apex_arap 1.0: Pattern A chain HDA wrapping th::arap_deform

    • arap_deform: group parm viewport selector + group/@name dropdown

    • arap_deform: group parm + bend stiffness + clearer input labels

    • cuda_wrap: Gaussian-splat support — glob deform_attribs with typeinfo gate

    • apex_blendshapes 2.4: mode-aware shape scaffolds (second-input/library)

    • apex_rig_defaults: non-TRS (slider/fkik) channels work through every button

    • arap_deform: per-point pin map + usable Follow Strength default

    • apex_rig_defaults: Set from Posed fully resets the viewer pose (no double transforms)

    • apex_rig_defaults: mirror v3 -- rest-skeleton G frames + IK end-space transfer

    • apex_rig_defaults: Set from Scene Animate is authoritative (replaces all rows)

    • apex_rig_defaults: Set from Scene Animate resets the WHOLE viewer pose

    • apex_rig_defaults: Match IK from FK / Match FK from IK buttons

    • apex_rig_defaults: general mirror math + immediate-result auto-clear/refresh

    • apex_blendshapes 2.4: parm-UI declutter (tabs + 2-line shape rows)

    • apex_rig_defaults: warn when a stashed viewer pose masks Set from Scene Animate

    • apex_rig_defaults: Scene Animate input + Set from Scene Animate / Mirror L->R / R->L buttons

    • cuda_wrap audit: capture/deform overhaul + apex_wrap def re-sync

    • edges_to_curves: resolve ad-hoc edge patterns via GOP_Manager

    • Withdraw elastic_deltamush 2.0 pending directional-response redesign

    • apex_eye_rig 1.1: repair uncookable 1.0 + wire colors + drop vestige parms

    • audit(avbd): full-stack third audit 2026-07 — entry-memory drape capture (C4), cloth-on-curved instability (C5), parse-layer holes (A6-A10)

    • Audit fixes: vocab/promotion drift documented, indexes caught up

    • Fix startsWith regression in deriveGroupsFromTags (audit catch)

    • tr-hda: fix two rule false-positives (parms-dict spine walk, utility-HDA Base.rig)

    • AVBD Phase 3.5: SDF-volume + mesh colliders (sampled-grid contact path)

    • Docs: joint-tags — bone-selector subtool shipped

    • Bone-selection subtool: viewport prim picks -> child-end joint names

    • AVBD Phase 3.5: sphere/capsule entry-normal memory + entry-memory toggle

    • Docs: joint-tags — Phase 2 presentation core status + known gaps

    • Tag discovery menus on constraints driven, motion_effects joints, parent child/parent

    • apex_tags UX: tag discovery menus + Point Group Per Tag default ON

    • th::tags::filterPromotable: ONE promotion exclusion list, shared

    • Parm-UI sweep: joint/subnet discovery menus on six HDAs

    • AVBD Phase 3.5: capsule collider implemented

    • AVBD Phase 3.5: collider restitution (f@restitution now consumed)

    • codereview: apex_spline second pass — cross-feature interaction audit (v2)

    • Docs: joint-tags status — Phase 1 complete

    • apex_joints consumes joint tags: bind union, side override, filtered promotion

    • elastic_deltamush 2.0: mesh-adaptive Auto defaults (drop-in squishiness)

    • Blendshape editing goes plain-SOP: build + help-sweep scripts

    • Un-track two WIP scripts swept into a842001 (another agent's staged files; back to untracked, files kept on disk)

    • apex_spline 5.0: resolve review findings W1-W4

    • elastic_deltamush 2.0: elasticity scales the full response; topological cleanup smooths

    • Docs: joint-tags status — per-tag point groups shipped

    • codereview: apex_spline 5.0 change-set review (2026-07-08..10)

    • apex_tags: per-tag point groups (th::tags::deriveGroupsFromTags)

    • apex_spline 5.0: From-Mesh-Edges auto-sources Base.shp when input 3 is empty

    • apex_spline 5.0: label inputs 2+3 (Fit Skeleton / Edge Source Mesh)

    • elastic_deltamush 2.0: saturating squash & stretch response + Elastic Scale

    • apex_spline 5.0: even joint placement for layered Subdivisions (subdiv_group)

    • Docs: joint-tags status — apex_tags 1.0 shipped

    • apex_tags 1.0: artist-facing joint-tag authoring HDA (Pattern E)

    • apex_blendshapes: Shot Sculpt (Post-Invoke) scaffold button (Wave C)

    • apex_edit_shape 1.0 + Shapes-table sculpt scaffolds (Wave B)

    • elastic_deltamush 2.0: radius-native, resolution-independent parameterization

    • apex_paint_mask: grooming-parity mask buttons (editable paint node + state entry)

    • apex_spline 5.0: Subdivisions is layer-independent

    • th::tags Tier 1-3: bone identity, topology queries, skeleton validation

    • apex_blendshapes 2.4: Shapes table UX + in-betweens + combos + solo

    • apex_spline 5.0: repair cv_slider_wire snippet — per-CV sliders were dead

    • Joint-tags contract Phase 0+1: th::tags subgraph group + lint rules + design doc

    • apex_blendshapes 2.4: explicit index matching + Character Stream / KineFX source mode

    • bonedeform: fix review findings W1/W2/W4/W5/W6 + S1 (orient skinning)

    • th::spline: follow_pos<1 distribution remap — joints keep the fp=1 arc distribution

    • Code review: bonedeform orient/other-attribute skinning (9e1588a)

    • bonecapture point-cloud path + bonedeform orient/other-attribute skinning

    • apex_rig_defaults: add 'Set from Posed' button (capture all non-default controls)

    • Gate attach_joint_geo verb against mesh input (prevent cage-explosion crash)

    • Display-invoke FlagChanged re-sync + HUD parm panel default-off (fleet sweep)

    • Revert detail-stamp force-eval: it half-builds the loop and severs Base.shp

    • Viz toggle: fix discovery (live-debugged on the goblin rig)

    • Rig sub-tool: fix Viz toggle (channel-path write) + mask clicks behind buttons

    • Rig sub-tool: Viz + Skin toggle buttons

  26. 1.7.1Houdini 22.0+
    • release: v1.7.1

    • apex_constraints 2.0: driven-side Control/Joint split + two-lane validate_cns

  27. 1.7.0Houdini 22.0+
    • release: v1.7.0

    • release prep: ignore WIP 2.0 HDAs + scratch patch scripts + dev-local manifest

    • cuda_attrib_transfer: point/vertex/primitive sample modes

    • Two-lane constraints: aim/orient/point 1.3, ik_reparent, inverse_foot, parent + recompiled subgraphs

    • release prep: exclude not-ready HDAs + ignore local scratch/build dirs

    • HDA in-session fixes: apex_spline 5.0, apex_set_driven_keys, cuda_joint_capture

    • apex_rigExample_noodle 1.0: author re-save of the example noodle rig

    • Anchored brand seam: TextDrawable.size() cannot measure rendered markup

    • Segmented overlay titles: positional two-tone TumbleRig brand

    • New HDA: th::apex_rigExample_noodle::1.0 — example rig under TAB > _TumbleRig/Rigs

    • Re-arm Tool Info hide after button actions + scene reloads

    • Bands 1.0->1.2 fade extension; robust Tool Info hide; channel widget hidden by default

    • Rig sub-tool default enforced fleet-wide + rule + convention doc

    • apex_spline 5.0: new default look — Layers=2, L2 in-betweens-only, L2 scale 0.44, Subdivisions=4

    • Band fade confined to inner 30%, brighter buttons, two-tone brand retry

    • apex_spline 5.0: defaults look-dev (post_smooth=2, smooth_width=1) + lock/hide locality

    • Hide the state-info HUD (Shift+F1 hotkey listing) in TumbleRig tools

    • Overlay polish round: gradient bands, brand-name fix, no text glow, button centering bias, Reset Pose via SideFX reset path

    • Brand-style overlay theme: dark bands, accent words, packaged brand fonts

    • th::spline: post_smooth — rest-neutral relaxation of the final spline; SS reads smoothed arcs

    • Center band + button text vertically (measured text height)

    • th::spline: Delta Mush smoothing mode (smooth_mode=2) — smooth the deformation, not the shape

    • Persistent posing fleet-wide + tr-hda pose-storage patcher/rules

    • docs: smooth_mode visible again on apex_spline 5.0

    • apex_spline 5.0: un-hide smooth_mode (default stays Taubin)

    • viewport_theme: centralize all overlay styling + fix rig-subtool clicks

    • Untrack skel_add_fit_joint-2.0 + skin_layer-2.0 HDAs (not mine to commit)

    • TumbleRig rig sub-tool: default animate tool with on-screen buttons

    • apex_spline 5.0: layered noise fix — Shape Tuning acts at layer 1 only

    • th::spline: locality-true handle proportions + Taubin smoothing default

    • th::spline: squash/stretch distribution — ss_pin_start/end/falloff + per-CV stretch slider

    • th::spline: segment-local squash/stretch + pose-transported locality; hide arc_width/smooth_mode

    • th::spline: revert smooth pin-preservation -- relaxing across CVs is intended

    • CI: SideFX private-API surface probe for the picker sub-tools

    • Control picker: suppress the empty cursor-icon box in select-only mode

    • Letterbox text legibility: bigger + bolder bottom-band text, harder glow

    • th::spline math audit: fix smooth-vs-pinned-CVs, strip dead slide + rot_locality machinery

    • Joint picker: grey-dim parity with the control picker

    • apex_spline 5.0: arc_width rework (roundness blend) + UX pass (defaults, layer grouping, gated fit/symmetric)

    • Picker polish: instant activation, grey-dim selection, letterbox text fix

    • apex_spline 5.0: Subdivisions sample mode + empty-edge-selection crash guard

    • rig viz: fix glyph dispatch (whole library on every joint) + small spline-CV glyph class

    • Root-clutter cleanup: rest-shp scale comp -> system subnet, markers -> detail stamps, root-level-addnode lint

    • Promote memory-only field knowledge into the docs

    • Picker UX batch: 15 improvements across control + joint pickers

    • Docs + tr-hda: codify the subgraph-context traps from the Win 1 migration

    • apex_spline 5.0 layered splines: L1-relative control scales + in-betweens-only toggles

    • control_picker: letterbox pick-mode overlay (translucent bands + banner text)

    • apex_spline 5.0 layered splines: per-layer control scale + color parms

    • apex_spline 5.0 UX: pin Source parms above the tab bar

    • control_picker: anchor to the HDA's OWN viewer state, never a downstream sceneanimate

    • Win 1: constraints-2.0 precompiled + deep-identity fixes for the migrated fleet

    • apex_spline 5.0 layered splines: review fixes (visible gizmos + collision-proof channel names)

    • control_picker v2: Secondary-Motion feel + auto state entry

    • Control picker sub-tool: replace passive '+' grab with Secondary-Motion-style pick mode (14 buttons, 10 HDAs)

    • apex_spline 5.0: layered splines (layers 1-3, guide cascade + per-layer CV controls)

    • ctrl_select: membership-gate the '+' buttons against the HDA's OWN input rig

    • apex_motion_effects: surface no-target rows as a node warning (__tr_warnings__ + Message Node)

    • Win 1 fleet: precompile ctrls/joints/ik builders as th:: subgraphs

    • apex_sliders 2.0: precompile builder as th::sliders::addSlidersFromParms (Win 1 prototype)

    • apex_spline 5.0: canonical selectors + header parm order

    • Handover 2: remaining cook-time wins (perf-remaining-wins-handover.md)

    • docs: apex_spline 5.0 reference section (previously undocumented)

    • apex_spline 5.0: geometry fixture + io-map refresh + spline_test repoint

    • Task C Step 0 results: perfMon split of the cook-time rebuild (handover 5.1)

    • apex_spline 5.0: WS5 parm UX overhaul

    • apex_spline 5.0: SELECT FROM GEOMETRY (WS3+WS4) + zero-chain loud-fail (A6)

    • apex_spline 5.0: A3 — scale-parent unified on the Float path

    • apex_spline 5.0: A2 — splice dedup via th::utils::spliceSplineOutputsIntoStream

    • apex_spline 5.0: dead-bind kill (A4) + data-driven sliders (A1)

    • apex_spline-5.0.apex: A5 mechanical pass

    • apex_spline 5.0: version scaffold (verbatim copy of 4.0)

    • th::skel::buildFkControls subgraph — reusable animatable-FK builder

    • refactor(avbd): single-source the bend dihedral math (evalBendAngle)

    • edges_to_curves: source_pt + is_loop attrs, deterministic tracing, open-poly fallback fix

    • Remove graph.layout() from production .apex scripts (apex_view owns layout)

    • fix(avbd): Dirichlet pin kernel (M7) — and animated hard pins were frozen (C3); pin-parse dedup (M6)

    • feat(avbd): contact entry transition — M4 Cprev clamp + box entry-face memory (anti-tunneling)

    • Two-lane gap closure: control-lane ME stacking, scale driven joint lane, aim up-driver Joint source

    • fix(avbd): collider transforms were never parsed — every stream collider sat at the world origin (audit C2)

    • SDK: clip rows are Control-lane only + skeleton-space clip-layer design; patch-ds hidewhen hardening

    • Fix scene-open tax: don't force-cook to sync display-invoke view-flags

    • test(avbd): QS-mode regression validator — verifies the C1 fix end-to-end

    • cuda_boolean: orchestration pass -- 2.05x (141 -> 68.6 ms at 50K), CPU now matches GPU

    • codereview: cuda_boolean performance audit (post hot-path pass)

    • cuda_boolean: CPU hot-path pass -- weld/solve-glue/build (1.42x total, byte-identical)

    • cuda_boolean: Stage-2-lite persistent classify buffers + D2D decision record

    • cuda_boolean + apex_boolean: keep-only modes (A/B x inside/outside)

    • cuda_boolean: string-attribute transport (handle-based copy, zero-cost)

    • apex_constraints: driven-side output lane (Apply On) + driver taps via resolveTapSourcePort

    • apex_boolean 1.0: chain HDA wrapping cuda_boolean, cutter picked from the character stream

    • Design doc: constraints driven-side output lane (Joint / post-solve)

    • apex_set_driven_keys: per-row Apply On (Control pre-solve / Joint post-solve) + two-lane docs

    • Bump TumbleRig: apex_spline-4.0 label drop baked-in version suffix

    • Two-lane augmentation model: th::cns::resolveTapSourcePort + ME output-lane migration

    • Bump TumbleRig: th::spline squash/stretch soft caps (max_squash/min_stretch)

    • cuda_boolean: surface GPU fallback honestly + sticky-error drain + GPU regression gate

    • apex_motion_effects: fix silent no-op Joint mode on IK-driven joints (wire-walk splice port)

    • apex_motion_effects: kill the TD relapse — literal \$FF in snippet COMMENTS is live HScript

    • apex_sliders: sliders_no_lock must also omit min_lock:x/max_lock:x (the real clamp)

    • apex_sliders: opt-in sliders_no_lock flag; set_driven_keys create channel is unbounded

    • apex_set_driven_keys: per-mode source names + Main driver default + mode-conditional UI

    • display-invoke: enforce identical boilerplate toggles (new rule) + conform 2 HDAs

    • apex_set_driven_keys: Set-from-Clip button uses the same single-clip fallback as apply

    • display-invoke: enforce show_invoked + prune at top, in order (new rule + conform 3 HDAs)

    • apex_set_driven_keys: create-mode channel-widget (embedded apex_sliders) + control filter + docs

    • Enable show_invoked "Join with Next" across th apex HDAs + tr-hda rule

    • apex_motion_effects: live frame via official frame_input graph property (fixes reset/EMA/Lag)

    • Bump TumbleRig: apex_spline-4.0 default to Tags mode / Primitives / tags="spline"

    • apex_set_driven_keys: rig-defaults harvest works with a RAW apex_rig_defaults input

    • apex_set_driven_keys: add Cycle Mode (none / cycle / zig zag) for clips

    • apex_motion_effects: per-target nodes (fix "Graph contains cycles" on joint chains)

    • apex_motion_effects: Control/Joint source mode with mode-dependent insertion + viewport joint picker

    • apex_motion_effects: control-centric selection (resolveDrivens) + kill $FF per-frame rebuild

    • apex_motion_effects: fix silent no-op on cfg-packed joints; drop 2nd input; add "apex secondary motion" alias

    • joint picker: visible selection outline + single-joint box-drag

    • apex_constraints 2.0: transient viewport joint-driver picker (Scene Animate)

    • apex_set_driven_keys: max 2 parms per row (Min|Max, Clip Start|Clip End)

    • apex_visibility: fix 3 silent-failure cases (dup names, un-parented setup, control-only chaining)

    • apex_set_driven_keys: clip mode must not sever control promotions

    • apex_set_driven_keys: fix clip application (drive t/r/s, not an offset compose)

    • apex_motion_effects: clarify stiffness help (kept the label — it's correct)

    • tr-hda: single-HDA check only loads fixtures containing that HDA (fixes check segfault)

    ...(truncated)

  28. 1.6.9Houdini 22.0+
    • release: v1.6.9

    • Pin Houdini build to 22.0.367

    • ci: incremental dev builds; clean rebuild only for releases

  29. 1.6.7Houdini 22.0+
    • release: v1.6.7

    • th::spline: plane-agnostic mirror handling (fix ~180° frame twist on mirrored skeletons)

    • apex_blendshapes Rig Input: control-name prefixing + Add Prefix toggle

    • mergeCharacterStreams: tag renamed clashing system subnets mc_b

    • cuda_noise + cuda_sphere_inversion: envelope master blend

    • cuda_bonecapture: propagate new upstream attributes (attr-schema skip sig)

  30. 1.6.6Houdini 22.0+
    • release: v1.6.6

    • apex_sliders: let several multiparm rows share a slider name (multi-target)

  31. 1.6.5Houdini 22.0+
    • release: v1.6.5

    • apex_sliders: reuse an existing control instead of duplicating it

    • cuda_normals: envelope master blend (off-at-0 passthrough + nlerp)

  32. 1.6.4Houdini 22.0+
    • release: v1.6.4

    • shrinkwrap: fix namespace step/smooth base name drift (chained HDAs no-op)

  33. 1.6.3Houdini 22.0+
    • release: v1.6.3

    • shrinkwrap: per-instance namespace so chained HDAs don't clobber each other

    • shrinkwrap: fix duplicated (mirrored) arm aiming at the wrong shoulder

    • shrinkwrap: joint-anchoring for cavity joints (stable placement in openings)

  34. 1.6.2Houdini 22.0+
    • release: v1.6.2

    • apex_ik_chains: add scale_parent + per-chain IK scale-multiplier slider

    • apex_shrinkwrap: expose Wildcard Joint Split selector (cuda_joint_split)

    • cuda_shrinkwrap: wildcard joint split modes (Proximity / Capture Influence)

    • apex_ik_chains: scale IK rest inputs by Main (root-cause fix for IK scaling)

    • apex_ik_chains: scale ONLY the IK joint cross-section with Main (preserve stretch)

    • apex_ik_chains: scale IK joints with the Main control (fixes thin IK limbs)

  35. 1.6.1Houdini 22.0+
    • release: v1.6.1

    • attrib_transfer: fix build break vs new shrinkwrap boundary-capture signature

  36. 1.5.2Houdini 22.0+
    • release: v1.5.2

    • viz: mutator HDAs no longer invent viz; eye rig gets a Show Viz checkbox

    • Three production fixes: anchor ray joint->centroid, system-subnet clash false positive, separate-mode rest slots

    • elastic_deltamush: rotation-invariant strain — fixes inflation under joint rotation

    • perf: th::merge change-gated template refresh + th::spline plan-rank CV ordering

  37. 1.5.1Houdini 22.0+
    • release: v1.5.1

    • duplicate rest folds: per-PORT geo_parms→parms ladder (viz-only /geo_parms skipped 4b/4e)

  38. 1.5.0Houdini 22.0+
    • release: v1.5.0

    • Rebuild SOP_CudaShrinkwrap dev binary (RelWithDebInfo) for joint-ray anchor

    • apex_lattice-1.3 + apex_eye_rig: corner ctrl names derive from lattice name parm

    • cuda_shrinkwrap: joint-ray anchor + real per-piece sign test (far-side punch-through)

    • apex_eye_rig: derive inner apex_parent names from parms, drop dead lattice_corner_prefix

    • mergeCharacterStreams step-5 sweep: route severed th::merge geo slots to the renamed rest prim

    • cuda_shrinkwrap: full-pass binding-attrib signatures (sampled stride missed sparse regions)

    • cuda_shrinkwrap: wildcard joint-map joints ('*_shoulder') resolved per copy prefix

    • apex_shrinkwrap: derive the deform region per .shp prim, not only on /Base.shp

    • duplicate/merge: geometry parms ports are a binding contract — never rename, never per-copy promote, never count as clashes

    • Rebuild DSO suite RelWithDebInfo (symbol-carrying dev binaries, release CRT)

    • Stream-selector dropdowns list actual graph output ports, not packed prims

    • Add hpm debug build profile: RelWithDebInfo DSOs + PDBs via HPM_BUILD_PROFILE

    • apex_wrap-1.3: /parms fallback — rest re-point was silently skipped on geo_parms-less rigs

    • mergeCharacterStreams: stamp geometry NAMES with the control namespace, not prim suffixes

    • apex_eye_rig-1.0: HDA merge-mode parms now reach the inner merge_graph

    • apex_blendshapes-2.3: repair group-selector (sel_deform_group/select)

    • apex_blendshapes-2.3: 2nd-input library shapes are ALWAYS static; live = Rig Input only

  39. 1.4.0Houdini 22.0+
    • release: v1.4.0

    • Fix maintain_offset for nested rig-only ctrls: true rest-world via parent-chain walk

    • apex_blendshapes-2.3: rest reference tracks the chain's Base.shp_rest endpoint

    • apex_blendshapes-2.3: validate_index accepts point_index on any rest .shp stream

    • audit(avbd): full-stack audit 2026-06 — fix dead Quasi-Static mode, collider debug isolation, CUDA error surfacing, harness drift

    • motion_effects: working Reset Simulation button (resetcount channel)

    • motion_effects UI pass: simmode index bug, resetthreshold wired, frame hidden

    • motion_effects: soften cross-subnet enforcement to warn-only (no behavior change)

    • motion_effects: deltatime input (real-time integration step)

    • apex_motion_effects review: enforce single-subnet constraint, warn on dead patterns

  40. 1.3.71Houdini 22.0+
    • release: v1.3.71

    • apex_wrap: fix empty/undeformed output in all three output modes

    • shared tr::CudaErrorState + ARAP audit fixes + restSignature consolidation

    • th::merge skip path: refresh prim attribs + groups listed in update_attribs (fixes frozen eyelid visibility after apex_duplicate)

    • elastic_deltamush audit: recompute wired, topo sig, group warning, stale mask docs

    • cuda_blendshapes: rest-relative deltas (fixes inverted control motion) + per-shape weight defaults

    • cuda_deltamush audit: 3 dead parms fixed/removed, group-mask key, per-frame alloc churn

    • codereview: ARAP deformer audit (Pass with Notes — dev-only)

    • codereview: cuda_wrinkles full audit (2 critical, 5 warnings)

    • cuda_wrinkles: rest content signature + CUDA error propagation (audit items 1+2)

    • apex_blendshapes-2.3: Rig Input config moves to a top-level section (UX)

    • apex_blendshapes-2.3: error loudly on Rig Input misconfiguration (was a silent no-op)

    • cuda_wrinkles: parallel speculative edge coloring (kills the O(N*R^4) rings wall)

    • cuda_wrinkles: ~10x faster initialize (allocation-free topology/coloring/BFS)

    • th::subdivide: inherit prim + point groups through the rebuild

    • apex_wrap 1.3: collapse merge/hide toggles into one 'Output Mode' menu

    • apex_wrap 1.3: 'Hide Driver (Replace Stream)' output mode

    • apex_joints 8.0: guarantee a Viz.shp output on viz-less rigs (show_viz=0)

    • apex_blendshapes-2.3: Rig Input source mode (3rd input = self-contained blendshape rig)

    • mergeCharacterStreams: geo_merge_mode='none' (caller-wired) + lean-head geo0 routing fix

    • addFitJoint: tab menu _RIGGING -> _TumbleRig/utility + canonical label

    • Update .tmp/(_audit_shp_repack_capture.json, _fk_ctrl_color_scal...

    • th::spline::6.0: strip via filtered tmp + periodic-refresh diag env reads (profile.md round 2)

    • apex_blendshapes_animated fixture: spatially contiguous subset target

    • th::spline::6.0: kill per-frame string-attrib copies (rest COW cache + filtered CV merge)

    • apex_blendshapes 2.3: animated blendshape targets (per-shape live rig sources)

  41. 1.3.70Houdini 22.0+
    • release: v1.3.70 — apex_wrap ships its DLL (SOP_CudaWrap)

    • release: ship SOP_CudaWrap.dll (apex_wrap verb) + verb-dll-excluded guard rule

    • apexdso: precompiled name matching for @name= group filters (spline hot path)

    • cuda_blendshapes: GPU scatter for indexed targets + animated-target hardening

  42. 1.3.69Houdini 22.0+
    • release: v1.3.69 — lean-anim-stream contract + visibility rest-pose fix

    • apexdso: rebuild apex_tumblehead_nodes (APEX_Merge rest-fold sig)

    • apex_joints 8.0: FK ctrl color/scale + shape parms; bundle th::addFitJoint::1

    • deformer group-targets + rest-fold generalization (APEX layer) + merge character streams

    • deformer group-targets C++ (wrinkles/subdivide) + merge rest-fold sig; rebuilt DSO artifacts

    • docs: lean-anim-stream contract (4 invariants, enforcement, strip-set rules)

    • lean_strip: content signatures -- the strip cooks ONLY on init (per Magnus)

    • tr-hda rule lean-stream/invoke-repack-shp: I4 write-back enforcement

    • contract enforcement: bonedeform wired-empty bind errors; verb stable-skip count guard; fixture stack + scene migrations

    • lean-anim-stream contract: th::lean_strip verb + canonical chain-head strip

    • apex_visibility-1.2: restore the 337c0b1 rest-prim repack (un-revert)

    • cuda_bonecapture: content-sig cook-skip — capture weights are bind-time static

    • apex_transfer_attribute audit: fix 3 shipped bugs + D2D rebind path + animated/static toggles

    • apex_zipper/merge_skel/boxit/parent: ensure Base.shp chain endpoint (passthrough/base-shp-missing, part 2)

    • apex_ctrls/constraints/spline: ensure Base.shp chain endpoint (passthrough/base-shp-missing)

  43. 1.3.68Houdini 22.0+
    • release: v1.3.68 — capture-weight D2D bind + normals registry

    • gpu_cache: normals registry + capture-weight D2D bind in cuda_bonedeform

  44. 1.3.67Houdini 22.0+
    • release: v1.3.67 — verb-layer fix for the animation-strip regression

    • verb-layer fix for the v1.3.64 animation strip: bonedeform keeps boneCapture on output; th::visibility gets a topology-stable skip

  45. 1.3.66Houdini 22.0+
    • release: v1.3.66 — visibility repack via th::visibility callback (supersedes 1.3.65 band-aid)

    • apex_visibility: repack Base.shp via the th::visibility callback, not a rig invoke

  46. 1.3.65Houdini 22.0+
    • release: v1.3.65 — hotfix: boneCapture restore on invoke-repacked Base.shp (animation-strip regression)

    • visibility/blendshapes: restore boneCapture on the invoke-repacked Base.shp (v1.3.64 animation-strip regression)

  47. 1.3.64Houdini 22.0+
    • release: v1.3.64 — viz if-block gate + apex_transfer_attribute + visibility GPU verb

    • apex_joints viz: gate the entire rig-viz compute behind a runtime if-block

    • apex_transfer_attribute: GPU closest-point attribute transfer between .shp regions

    • th::visibility: split perf log into parse vs write timing

    • apex_visibility: GPU-residency-preserving th::visibility SOP verb

    • apex_visibility: collapse th::set_visibility to a single geometry path

    • boneCapture off the per-frame stream: blendshapes template-strip + bonedeform static capture input (Phase 2)

    • cuda_bonedeform: strip boneCapture from output (Phase 1)

  48. 1.3.63Houdini 22.0+
    • release: v1.3.63 — visibility chaining fix

    • apex_visibility: th::set_visibility cumulative=1 so stacked instances don't clear each other's visibility

  49. 1.3.62Houdini 22.0+
    • release: v1.3.62 — ship RelWithDebInfo build with PDB symbols

    • build: RelWithDebInfo output dirs + local-dev hpm build escape hatches

  50. 1.3.61Houdini 22.0+
    • release: v1.3.61

    • Rebuild DSOs against Houdini 22.0.345 + remove stale splinelib.bgeo

    • apex_optimize_rig: group toggles into collapsible folders

    • apex_optimize_rig: add control-shape strip diagnostics

  51. 1.3.60Houdini 22.0+
    • release: v1.3.60

    • Kill per-frame time-dependency in inner sceneinvoke taps across all HDAs

  52. 1.3.59Houdini 22.0+
    • release: v1.3.59

    • fixtures: save animated shrinkwrap perf-test scene + apex_visibility refresh

    • apex_shrinkwrap: isolate stream collider in-callback (no per-frame blast)

    • apex_visibility: default 'default value' (visdefault) to 1 (visible)

    • apex_sliders: resolve <orig> from cfg subnet name in add-mode

  53. 1.3.58Houdini 22.0+
    • release: v1.3.58

    • skeleton_doctor: HDA update

    • apex_blendshapes: HDA update + refresh fixture scene

    • SOP_CudaShrinkwrap: named-but-empty deform group deforms nothing

    • apex_boxit: add "Build Viz System" toggle to gate auto-viz synthesis

    • apex_eye_rig: restore model-chain Value<Geometry> freezes

  54. 1.3.57Houdini 22.0+
    • release: v1.3.57

    • apex_eye_rig: continued sample rig HDA + apex script updates

    • scripts: add dev probe/cookloop helpers

    • apex_eye_rig: update sample rig HDA + fixture

    • apex_visibility: fix Exclude for cfg-group controls + add picker dropdown

    • apex_optimize_rig: add Delete Eye FK/IK toggle (eye-rig eval probe)

    • apex_deltamush: add @name group dropdown (menutoggle) on Group parm

    • apex_visibility: add per-control "Exclude" field (set-subtraction)

    • apex_visibility: make "default value" per switch setup (slider default)

    • apex_visibility: add Geo Stream parm + per-row "default value"

    • SOP_CudaNormals: fix frozen geometry — replaceWith every cook

    • apex_optimize_rig: add Delete Lattices / Delete Bone Deform toggles

    • apex_optimize_rig: add Bypass Merges (passthrough merge bisection)

    • apex_optimize_rig: add 14 diagnostic subsystem-strip toggles

    • apex_optimize_rig: add flatten_control_groups toggle (unpack cfg subnets, keep contents)

  55. 1.3.56Houdini 22.0+
    • release: v1.3.56

    • fixtures: refresh apex_optimize_rig + apex_shrinkwrap test scenes

    • apex_optimize_rig: add flatten_pattern (scoped / bisection flatten lever)

    • docs: apexanimate headless eval-testing workflow + apex_optimize_rig fixture

    • apex_optimize_rig: add Flatten Subnets feature + per-feature checkboxes

    • rest-bind deformers: catch rest-pose edits + harden content signature

    • apex_shrinkwrap: clean rest ring + best-fit joint rotation (handles skinned squash)

    • apex_shrinkwrap: rigid-rotate the live ring onto the contact (stable, joint-driven)

    • cuda_shrinkwrap + cuda_lattice: content-signature cache invalidation (fresh-detail fix)

    • apex_shrinkwrap: chirality from mesh winding normal (stable at side/underside)

    • apex_shrinkwrap: fix mirrored ring (chirality pinned to live mesh)

    • perf: PerfScope th::spline + th::merge

    • apex_shrinkwrap: kill ring flip/pop/squash at grazing + any rest orientation

    • apex_shrinkwrap: rigid-transport ring placement (no flip on curved colliders)

    • perf: add tr::perf profiling system + cns instrumentation

    • apex_shrinkwrap: stable-aim ring placement (no squash at any joint angle)

    • apex_shrinkwrap: add edge-group dropdown to Seed Edges

    • apex_shrinkwrap: drive the suction-cup ring from the REST cross-section (no collapse at steep angles)

    • apex_shrinkwrap: surface-aligned ring (no squash/flip), remove Automatic mode

    • cuda_bonedeform: stop re-running initializeCapture every apexanimate frame

    • apex_shrinkwrap: re-expose Projection Mode toggle, default Automatic (fixes ring squash on joint rotation)

    • apex_shrinkwrap: unify collider group, @name group dropdowns, fix empty Joint menu

    • th::spline orientation solve: faster shortest-arc quaternion + per-CV index cache

    • th::merge::1.0: eliminate per-frame rebuild via string-keyed template cache

    • apex_shrinkwrap: DialogScript UX cleanup + fix Group-picker regression

    • apex_shrinkwrap: drop Deform Group, derive deform set from per-piece rows

    • TumbleRig: refresh test fixtures (blendshapes/deltamush/shrinkwrap/spline) + apex_joints/skeleton_doctor HDA tweaks

    • th::spline::6.0: eliminate per-frame rebuild via per-chain caches

    • apex_spline: scale_parent fallback to main-tagged joint, else Base.skel root

    • apex_blendshapes: point-index (shared-id) matching for subset blendshapes

    • apex_shrinkwrap: collider-from-stream mode + Projection-folder consolidation

    • apex_normals: GPU normal recompute + single-N-authority + target_shp wildcard

    • apex_eye_rig: fix eyeball double-rotation + preserve Scale

  56. 1.3.55Houdini 22.0+
    • release: v1.3.55

    • apex_blendshapes 2.2: use shared th::apex_sliders::2.0 for weight sliders

    • apex_shrinkwrap: guard collider name against doubled .shp suffix

    • apex_spline: harden th::spline::6.0 in-place skip with a bone-count guard

  57. 1.3.54Houdini 22.0+
    • release: v1.3.54

    • apex_optimize_rig: new cook-time rig finalizer HDA (Phase 0)

    • apex_shrinkwrap: per-piece projection axis override (axis_attrib)

    • apex_spline: lean output schema in th::spline::6.0 (Lever D) — drop unused inherited CV attribs/groups

    • apex_blendshapes: fix group1.basegroup stored as expression (syntax error)

    • apex_spline: in-place output skip in th::spline::6.0 (Lever B) — no per-frame topology rebuild

    • apex_spline: bake the rest stream at cook (th::spline::6.0) — skip the per-frame rest solve

    • apex_shrinkwrap: multiparm is single source of truth for pieces+joints

    • cuda_bonecapture: add SOP icon

    • apex_shrinkwrap: convention dropdowns for projection parms

  58. 1.3.53Houdini 22.0+
    • release: v1.3.53

    • scripts: add shrinkwrap joint-writer dev helper

    • fixtures: update apex_zipper test scene

    • apex_shrinkwrap: restore joint-matrix projection mode + per-piece joint source

    • apex_rig_defaults: add Mirror Selected button

    • cuda_bonecapture: preserve incoming boneCapture on out-of-group points

    • apex_shrinkwrap: decouple smooth_max_step from cuda_max_steps

    • apex_offset_ctrls: conventions audit remediation (tr-hda check 0 findings)

    • Fix apex_shrinkwrap smoothing: deltamush had no rest input + reversed connect

    • Fix apex_shrinkwrap: collider never bound at runtime -> empty Base.shp

    • Fix apex_shrinkwrap: guide display-invoke drift, broken group selectors, orphaned hidewhen

    • apex_offset_ctrls: new HDA — generic per-joint offset controls

    • apex_eye_rig + fixtures: eye lattice working updates

    • apex_spline: remove add_joint_offsets feature

    • apex_rig_defaults: Set-from-Selected no longer captures child controls

    • apex_spline: build offset controls post-merge (fix fit-mode world-zero)

    • apex_spline: default offset-control size 0.01

  59. 1.3.52Houdini 22.0+
    • release: v1.3.52

    • apex_rig_defaults: re-Set accumulates onto the baked offset

    • apex_spline: build offset controls in fit mode (count from fitparams)

    • apex_rig_defaults: simplify to Set/Reset Selected + clear cached offsets

    • apex_spline: give offset controls a drawable th_ball shape

    • apex_spline: add_joint_offsets — per-evaluated-joint offset controls

    • apex_rig_defaults: fix capture-channels + scale-aware value defaults

  60. 1.3.51Houdini 22.0+
    • release: v1.3.51

    • Fix apex_zipper chain menu for fit-based splines

  61. 1.3.50Houdini 22.0+
    • release: v1.3.50

    • apex_eye_rig: hotfix sample rig HDA

  62. 1.3.49Houdini 22.0+
    • release: v1.3.49

    • apex_eye_rig: update sample rig HDA

    • Looks: brighten deformer preset color

    • apex_rig_defaults: add icon (control parked at orange default detent)

  63. 1.3.48Houdini 22.0+
    • release: v1.3.48

    • th::utils::flattenNestedMerges: collapse nested th::merge nodes (duplicate->merge_graph)

    • HDAs: strip baked-in version from TAB-menu labels

    • apex_space_switcher: fix dangling icon ref → th-apex_space_switcher disk icon

    • build_default_viz: viz_stamp_merge + viz_library sop::merge -> th::merge

    • test: merge-migration regression (collapse + 0 cuda_geo_merge)

    • apex_wrap: collapse chained wraps into ONE shared th::merge (was per-wrap cuda_geo_merge)

    • apex_merge_skel: sop::merge + array::Build -> th::merge (force_cpu=1)

    • merge_character_streams: migrate skel + rest streams cuda_geo_merge -> th::merge

    • spliceIntoStreamMerge: derive update_attribs from force_cpu (skel anim-freeze fix)

  64. 1.3.47Houdini 22.0+
    • release: v1.3.47

    • apex_parent: cook-time cycle/missing detection + surfacing

    • test(harness): apex_parent at end of eye-rig chain -- 285 parent/child combos

    • test(harness): Finding D resolved -- eye_rig must be boxit-sealed before merge

    • docs(Finding D): refine root cause after eye_rig investigation

    • test(harness): eye-rig combos (apex_combo_eyerig.hip) + Finding D

    • test(harness): add deeper merge/dup stress combos (apex_combo_stress.hip)

    • test(harness): add space_switcher + zipper to #3 combos

    • test(harness): add constraints combos (single/cross-copy/cross-char)

    • test(harness): add Pattern-D deformer-chain combos (apex_combo_deformers.hip)

    • test(harness): add behavioral/evaluated-rig verification layer

    • fix(apex subgraphs): make guard-returns actually bail (gate the mutating body)

    • fix(apex_duplicate): gate rest-skel merge on output port (Finding C) + document APEX guard short-circuit trap

    • fix(merge_graph): chain-aware ctrl prefix for stacked merges (Finding B)

    • fix(th::merge): eliminate double-merge in spliceIntoStreamMerge (APEX dataflow early-return trap)

    • fixtures: APEX combination test harness (spline x duplicate x merge_graph) + 3 bug findings

    • fixtures: matchCurrentDefinition sync spline nodes to 4.0 (was emitting stale th::spline::3.0)

    • fixtures: remove apex_spline2.hip (superseded 2.1 spline-fit dev scene)

    • fixtures: migrate spline fixtures to apex_joints 8.0 + apex_spline 4.0

    • fixtures: re-save apex_shrinkwrap + apex_spline2 with current HDA defs

    • merge_character_streams: anim-shp fold uses th::utils::spliceIntoStreamMerge

    • apex_duplicate: anim shp+skel streams use th::utils::spliceIntoStreamMerge (dynamic)

    • th::utils::spliceIntoStreamMerge: dynamic stream-merge splice primitive

    • apex_duplicate: collapse the 4 chained cuda_geo_merge folds into single variadic th::merge

    • th::merge::1.0: add GPU position path + per-input name prefixes (Dict)

    • apex_spline-4.0: share ONE join across chained spline HDAs (6 merges -> 2 per rig)

    • apex_spline-4.0 Phase 4: parallel spline compute via shared FK-root CV tap

    • fixtures: re-save apex_eye_rig + apex_wrap (current HDA defs)

    • apex_spline-4.0: spline join on th::merge::1.0 (delete array::Build + Value passthroughs)

    • th::merge::1.0: variadic CPU geometry merge for the apex_spline join

    • Looks panel: Refresh subnets button (re-bake locked th::* HDA subnet colors)

    • Revert "apex_spline Phase 2 (part 2): cuda_geo_merge variadic inputs (geo0 + auxgeo)"

    • apex_spline Phase 2 (part 2): cuda_geo_merge variadic inputs (geo0 + auxgeo)

    • apex_spline Phase 2 (part 1): cuda_geo_merge skel_attribs skip-path sync

    • apex_spline Phase 1: th::spline::5.0 stamps its own output point groups

    • apex_spline: bake fitparams for fit-mode rigs (feed bake the fit joints)

    • th::spline: hard error when fit requested but resolves to 0 joints

    • apex_parent + constraints: wildcard & space-separated child/driven controls

    • apex_eye_rig: add display-invoke / apex_graph machinery (tr-hda pass)

  65. 1.3.46Houdini 22.0+
    • Bump TumbleRig 1.3.46: apex_parent multiparm + fix, Looks family overrides, apex_visibility/proxy/zipper cfg pickers, apex_rig_defaults fixes

    • apex_eye_rig: recolor sample HDA via new Looks overrides + update fixture

    • Looks: per-HDA family override + ctrls/deformer presets

    • apex_parent: multi-row multiparm (set up multiple parent->child pairs in one HDA)

    • apex_visibility: skip Base.shp splice for control-only setups

    • apex_proxy/apex_zipper: cfg-aware control pickers

    • apex_parent: fix wrong-control parenting in shared multi-control subnets

    • apex_visibility 1.2: cfg-aware control pickers

    • apex_rig_defaults: channel Value is a vec4, read first N by channel

    • apex_rig_defaults: expand wildcard control targets to all matches

    • apex_rig_defaults: coerce captured TRS channels to 3-component vec3

  66. 1.3.45Houdini 22.0+
    • Bump TumbleRig to v1.3.45

    • apex_spline: scale_parent reads control scale via transform::Explode

  67. 1.3.44Houdini 22.0+
    • Bump TumbleRig to v1.3.44

    • TumbleRig WIP for v1.3.44: H22.0.339 rebuild + apex_spline/duplicate updates

    • apex_joints 8.0: viz toggle as an apex_sliders channel slider (not a TO ctrl)

    • apex_parent: add Maintain Offset toggle + custom TRS offset (parent-local)

    • apex_rig_defaults: persist slider defaults as node parms + control picker + channel menu

    • apex_joints 8.0: runtime Viz on/off switch for the rig viz system

    • apex_constraints: resolve cfg-subnet control names to their inner PRIMARY TO

    • Rename apex_add_proxy_shp -> apex_proxy (v2.0)

    • apex_joints: tag controls left/right/middle for side selection

    • apex_spline + apex_zipper: multiparm-driven slider settings on controls

    • Fix rest-shp scale comp leaking Main translation (mesh-vs-mesh deformers explode on move)

    • apex_spline 4.0: scale spline samples with the Main control

    • apex_spline 4.0: drop the vestigial rest_transform strip

    • fixtures: update apex_eye_rig (merge_graph test scene)

    • 456.py: fail-loud package-provisioning guard

    • apex_zipper: spline-mode auto-resolution

    • apex_ctrls: QA panel FlowLayout + per-axis transform buttons; multi-axis payload

    • apex_merge_graph + apex_duplicate: multi-shape separate/merge modes; decouple control prefix from geo mode

    • zipper_select: document chain_names output_name static-parm assumption

    • apex_zipper 3.0: zipper_falloff default 0.1 -> 0

    • th::splineblend: fix zipper_falloff overlap kink (clamp inner ramp edges to center)

    • apex_zipper 3.0: single-input chain zipper + thviz viz_shape stamp fix

    • apex_merge_graph: fold REST channels + callback-aware leaf harvest

    • thviz buildDefaultRigViz: internal viz_shape stamp (dormant, gated)

    • boxit/duplicate: enforce single viz system at root (never inside body/clones)

    • apex control-visibility: reusable th::ctrl::driveControlVisibility + docs + regression gate

    • apex_visibility 1.2: working slider-driven control hiding

    • apex_boxit: fix rest-shp passthrough stale-port bug (viz_at_root=1)

    • apex_merge_graph: collision-aware prefix_b (don't re-prefix an already-unique rig_b)

    • apex_merge_graph: single /viz fed by the merged skel (drop rig_b's viz)

    • apex_merge_graph: merge Base.skel too + editable prefix_a/prefix_b parms

    • Single-/main convention: boxit keeps main at root + parent ports; merge shares one main

    • apex_merge_graph: merge two INDEPENDENT characters into one rig stream

    • TumbleRig: apex_spline per-CV sliders v3 + apex_ctrls/eye_rig/merge bundle for release

    • Bundle in-progress apex_ctrls / eye_rig / merge work for release

    • apex_spline v3: restore follow_pos/follow_rot endpoint continuity

    • apex_spline v3: rewrite per-CV slider gate for the downstream graph + callback unit test

    • apex_spline v3: bake per-CV slider chain into the HDA + document surgical-stream pattern

    • WIP: apex_spline per-CV sliders v3 — cv_slider_wire post-step (control->dict::Build wiring)

    • cuda_geo_merge: apply per-input name prefix in-merge (drop per-frame prefixMeshNames)

    • apex_duplicate: auto-iterate Manual prefixes when Amount exceeds labels

    • WIP: apex_spline per-CV sliders v3 — th::set_point_attribs::3.0 (generic Dict-variadic)

    • fix(cuda_geo_merge): value-hash prim-attrib change detection (fixes apex_duplicate per-frame full-merge)

    • apex_duplicate audit: fix stale comments, drop broken verify, refresh fixture

    • cuda_geo_merge: re-merge when prim attribs change (live usdvisibility fix)

    • apex_duplicate: rewrite cfg control-group control.primary on rename

    • apex_duplicate: prefix EVERY node in each copy (full name uniqueness)

    • apex_spline 3.2: collapse per-CV setter chain into one th::set_point_attribs node

    • apex_duplicate: merge-after refactor (control-prefix + mesh-merge, no skel prefix)

    • apex_spline Stage 2: cook-time plan bake (th::spline::5.0) + retire 3.0

    • apex_duplicate T2.2: N-copy naming UI (amount + Manual/Index/Alphabetic)

    • apex_duplicate: generalize duplicateSubnet to N copies (prefixes loop)

    • apex_duplicate skel-in-graph + boxit color/viz_at_root (+ session WIP)

    • apex_spline: fuse dual-solve (th::spline::4.0) + Base.skel viz/pscale leak fix

  68. 1.3.43Houdini 22.0+
    • release: v1.3.43

    • scripts: add _exp_apex_merge dev experiment

    • apex_eye_rig: re-save HDA + fixture

    • WIP: apex_duplicate + apex_rig_defaults HDAs, proxy/visibility/sliders, BoneDeform updates; repo cleanup (.research/.tmp gitignored)

    • apex_lattice Deform Space (World parent-tracked) + zipper fkik consolidation + spline fit-group hardening

  69. 1.3.42Houdini 22.0+
    • release: v1.3.42 — fix compile-subgraphs hython DLL resolution

  70. 1.3.38Houdini 22.0+
    • release: v1.3.38

    • chore: update docs version refs, mark Pattern B complete, update th_spline_prepper HDA

  71. 1.3.37Houdini 22.0+
    • release: v1.3.37

    • chore: add apex_eye_rig fixture

    • feat(apex_rig_defaults): new chain HDA — bake apexanimate pose as rig defaults

    • feat(apex_spline): topological CV ordering via cv_order param

    • feat(apex_parent): direct parent wiring via offset spacer, guard for unconfigured instances

    • fix(apex_ctrls): enable-toggle now reverts overrides; menu no longer unlocks HDA

    • fix(apex_ctrls): reliable quick-action shape changes, cfg-subnet targeting, undo

  72. 1.3.36Houdini 22.0+
    • release: v1.3.36

    • SOP_CudaBoneDeform: always replaceWith on bail, remove topology-only guard

    • apex_parent: new HDA — simple parent constraint via th::cns::parent::2.0

    • apex_sliders: rename cfg boundary ports from <name>_{t,r,s} to bare t/r/s

  73. 1.3.35Houdini 22.0+
    • release: v1.3.35

  74. 1.3.34Houdini 22.0+
    • release: v1.3.34

    • apex_sliders + apex_space_switcher: two follow-up fixes

  75. 1.3.33Houdini 22.0+
    • release: v1.3.33

    • apex_joints: per-ctrl uniformScale via reusable subgraph

    • apex_ik_chains: natural FK parent for IK + Pole; drop always-on Main cns

  76. 1.3.32Houdini 22.0+
    • release: v1.3.32

    • apex_ik_chains: per-joint Lock slider label ('Knee Lock' / 'Elbow Lock')

    • apex_space_switcher: merge sliders dict into upstream parms

  77. 1.3.31Houdini 22.0+
    • release: v1.3.31

    • Update .tmp/(apex_ctrls_DialogScript_live.txt, apex_ctrls_Python...

    • apex_view: Step 5 — prune cross-subnet Float wires

    • apex_spline: move rig_scale nodes inside spline subnet

    • apex_spline: fix viz pipeline — stamp viz_shape in subnets, remove 9 root-level viz nodes

    • apex_spline-2.2: add bind_spline_only toggle

    • apex_space_switcher: swap inner pipeline order so sliders wire to cns

    • apex_ik_chains: always-on Main parent + uniformized scale for IK + pole

    • apex_ik_chains: add hide_FK slider on FKIK ctrl + capitalize FKIK in labels

    • apex_ik_chains: remove IK ctrl follow_Main row entirely

    • apex_constraints: fix wire helper LCA when driver/cns is already at LCA level

    • apex_ik_chains: pole follows chain-end IK ctrl, not Main; LCA-based cross-subnet wire fix

    • apex_constraints: fix cross-subnet driver-wire coalescing in wireDriverXformToPort

    • apex_spline: refresh fixture + capture baseline

    • test: fix allSubChildren iterator crash when matchCurrentDefinition destroys nested th:: nodes

    • apex_spline-2.2: fix CV setter chain geo port names (was geo_in/geo_out, must be geo)

    • apex_ik_chains: parent FKIK settings ctrl to chain root

    • apex_ik_chains: blend=1 so follow_* sliders actually constrain

    • apex_spline-2.2: embed per-CV sliders via apex_sliders (remove apex_spline_cv_ctrl HDA)

    • apex_sliders: short channel-widget labels via auto-prefixed promote

    • apex_spline-2.2: apply HDA -- add spline_cv_attr_* tags to setter nodes

    • docs: handover note for motion-effects + spline slider agents (2026-05-26)

    • docs: apex-constraints duplicate-cns bug fix note

    • docs: apex-constraints conventions (Phase 3)

    • apex_constraints: unified resolver for aim (Phase 2 complete)

    • apex_constraints: unified resolver for point/orient/scale

    • apex_constraints: unified resolver subgraphs + apex_constraint_parent refactor

    • apex_ik_chains: pole_follow_chain_end toggle + per-chain follow sliders

    • apex_constraint_point: rig-only ctrl branch (mirrors apex_constraint_parent)

    • apex_constraints + apex_space_switcher: fix latent constraint-chain bugs

    • apex_spline_cv_ctrl: fix per-CV slider independence (promote with unique parms port name)

    • apex_spline_cv_ctrl-1.0: per-CV spline attribute sliders via AbstractControl

    • apex_ik_chains: squash + dampen sliders on settings ctrl

    • poleBlendRederive: detect bone aim axis per joint (not hardcoded +X)

    • apex_ik_chains: axis-aligned bone stretch + animator-friendly slider names

    • apex_ik_chains v2.3: per-chain subnets + shared chain naming

    • WIP: pole_blend bone re-derive + multi-HDA accumulated changes

    • apex_sliders: roll back pack-wrapper experiment; document v2.4 followup

    • apex_ik_chains v2.3 + apex_constraints + apex_sliders — rig-only ctrl constraints (checkpoint)

    • apex_ik_chains v2.3 — pole_blend slider + FKIK/stretch sliders via nested apex_sliders

    • WIP apex_ik_chains v2.3 — apex script + pole_blend subgraph (no HDA changes yet)

  78. 1.3.30Houdini 22.0+
    • release: v1.3.30

    • apex_ctrls: QA panel polish + DialogScript parm grouping

    • apex_sliders: fix STANDALONE wire (findOrAddPort tuple-discard + variadic port semantics)

    • apex_constraints/sliders/space_switcher: audit-2 fixes (M-1, m-1..m-3)

    • apex_space_switcher v1.1: mixed-types-per-joint + aim UI + sliders fixture

    • apex_constraints/sliders/space_switcher: audit fixes (C-1, M-3..M-8, m-10, m-11, o-14)

    • docs: apex-hda-conventions Per-Joint Config Subnet section + fix wrapper order

    • apex_space_switcher UX fixes: subnet=joint name, bare slider labels, slider after t/r/s

    • apex_space_switcher::1.0 + supporting refactors

    • apex_boxit-1.0: universal chain adapter HDA

  79. 1.3.29Houdini 22.0+
    • release: v1.3.29

    • Bundle: apex_spline refactor, apex_sliders 2.0, apex_joints/constraints tweaks

    • apex_spline: compensate for rig parent scale in squash/stretch ratio

  80. 1.3.28Houdini 22.0+
    • release: v1.3.28

    • chain HDA additions + apex_joints viz wire optimization

    • fix(avbd): reparse constraints on reset so rewind-to-f1 applies parm tweaks

    • fix(avbd): revert per-cook constraint reparse — high bend stiffness exploded on f1

    • avbd_constraints: warn when Enable Shear is on but input has no quads

  81. 1.3.27Houdini 22.0+
    • release: v1.3.27

    • selection_pattern: skip closed + single-vertex marker prims in validate_attrib_input (fixes false positive on attach_joint_geo upstream)

  82. 1.3.26Houdini 22.0+
    • release: v1.3.26

    • apex_spline: World Spacing density mode + force_symmetric rest stability + Bezier handle-crossing guard

    • fix(avbd): warmstartBendKernel pins k=stiffness for soft bend constraints

    • fix(avbd): gate bend dual k_ramp on isHard — paper §3.2 + impact stability

  83. 1.3.25Houdini 22.0+
    • release: v1.3.25

    • wip: rest-bound apex_spline axisMap (frog-leg 90° flip past -86°), HDA housekeeping batch, AVBD ground IPC friction, sliders/motion_effects per-row refactor in flight

    • AVBD: switch ground friction to IPC smooth mollifier

    • feat(avbd): Debug parm folder + paper-aligned defaults + toggle-sweep harness

  84. 1.3.24Houdini 22.0+
    • release: v1.3.24

    • chore: re-pack apex_ctrls HDA after .apex normalization

    • chore: normalize CRLF->LF on apex_ctrls-1.0.apex

    • wip: in-flight work across AVBD solver, spline/shrinkwrap refactors, motion_effects HDA, OPcustomize -> color system migration, apex_ctrls UX, CI tweaks

    • fix(avbd): don't reset sim on rest-P data-id bump

    • chore(avbd): env-gated FNV-1a buffer-hash instrumentation

    • fix(avbd): post-stab uses color loop, eliminates Jacobi race

    • fix(avbd): bypass GPUGeometryCache to fix cross-bridge state leak

    • feat(avbd): Phase 7a — bounded dual variables (paper §4)

    • feat(avbd): Phase 6a — greedy vertex coloring for Gauss-Seidel primal (paper §4)

    • feat(avbd): Phase 5 — constraint regularization α (paper §3.6 Eq. 18)

    • feat(avbd): Phase 4b — Coulomb friction cone + paper §3.3 static/dynamic switch

    • feat(avbd): fork VBD as paper-canonical AVBD solver — phases 1–4a + ground-contact detect-band

  85. 1.3.23Houdini 22.0+
    • release: v1.3.23 - reliable display-invoke flag sync + CI build fix

  86. 1.3.20Houdini 22.0+
    • release: v1.3.20

    • fix(SOP_CudaGeoMerge): use open=0 in GU_PrimPoly::build (not closed=true)

    • fix(opcustomize): add th::apex_wrap::1.3 color line

  87. 1.3.18Houdini 22.0+
    • release: v1.3.18 — recover from v1.3.17 register failure + restore multi-platform

  88. 1.3.16Houdini 22.0+
    • release: v1.3.16 — windows-only until hpm registry fix lands

  89. 1.3.15Houdini 22.0+
    • release: v1.3.15

    • ci: map hpm <os>-<arch> platforms to API short form in register_release

  90. 1.3.13Houdini 22.0+
    • release: v1.3.13 — drop macOS again (SideFX still hasn't shipped H22 macOS)

  91. 1.3.11Houdini 22.0+
    • release: v1.3.11 — windows-only release while linux runner is missing HDK toolkit

  92. 1.3.7Houdini 22.0+
    • release: v1.3.7 — HDK plugins rebuilt against H22.0.310

    • docs(apex_spline): document why parallel-transport-twist was rejected

  93. 1.3.6Houdini 22.0+
    • release: v1.3.6

    • fix(apex_spline): eliminate hemisphere flip in Gram-Schmidt orientation

  94. 1.3.5Houdini 22.0+
    • release: v1.3.5

  95. 1.3.4Houdini 22.0+
    • release: v1.3.4

  96. 1.3.2Houdini 22.0+
    • release: v1.3.2 — fix creator API route (creator/slug, not pkg_id)

  97. 1.2.0Houdini 22.0+
    • ci: use TUMBLERIG_PACKAGE_ID env var for TumbleTrove creator API

    • ci: fix TumbleTrove storage API routes (post-2026-04) + macOS Python 3.11

    • ci: remove apex_tools dependency from CI path; use uv run for Python

    • release: exclude orphaned + not-ready DLLs from archive

    • ci: fix --path= POSIX expansion on Windows; add tomllib fallback for Python <3.11

    • ci: fix infisical token auth, remove test-bak files, add file_exclude safety net

    • ci: add --projectId to infisical run commands

    • release: v1.2.0

  98. 1.0.7Houdini 21.0+

    No changelog for this version.

TumbleRig
Version 1.15.5
What's new in 1.15.0

Custom rigging nodes for Houdini 22

Free

Created by Tumblehead

Users34
Views1.1K
File Size72.9 MB
ReleasedOct 6, 2026
UpdatedSep 3, 2026
Free

Free, open in the desktop app.

Sign in to use it