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.
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.
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.
1.15.2Houdini 22.0+
Changed
Maintenance update.
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.
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).
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
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
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)
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.
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.
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.
1.12.3Houdini 22.0+
Fixed
apex_ik_chains: translating the Main control no longer squashes the IK limbs. With
scale_parentleft 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 explicitscale_parentpath does. Settingscale_parentto Main is no longer needed as a workaround.
Changed
fit_skeleton 3.0 and the noodle example rig pick up their latest saved definitions.
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.
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.
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
1.10.1Houdini 22.0+
release: v1.10.1
Add sm_120 (consumer Blackwell / RTX 50xx) to the CUDA arch list
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.
1.9.2Houdini 22.0+
release: v1.9.2
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
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
1.7.9Houdini 22.0+
release: v1.7.9
CI: gate the SideFX picker-surface probe to windows
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
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)
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
1.7.1Houdini 22.0+
release: v1.7.1
apex_constraints 2.0: driven-side Control/Joint split + two-lane validate_cns
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)
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
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)
1.6.6Houdini 22.0+
release: v1.6.6
apex_sliders: let several multiparm rows share a slider name (multi-target)
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)
1.6.4Houdini 22.0+
release: v1.6.4
shrinkwrap: fix namespace step/smooth base name drift (chained HDAs no-op)
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)
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)
1.6.1Houdini 22.0+
release: v1.6.1
attrib_transfer: fix build break vs new shrinkwrap boundary-capture signature
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
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)
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
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
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)
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
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)
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
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
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
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)
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)
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
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
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
1.3.60Houdini 22.0+
release: v1.3.60
Kill per-frame time-dependency in inner sceneinvoke taps across all HDAs
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
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
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)
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
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
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
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
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
1.3.51Houdini 22.0+
release: v1.3.51
Fix apex_zipper chain menu for fit-based splines
1.3.50Houdini 22.0+
release: v1.3.50
apex_eye_rig: hotfix sample rig HDA
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)
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)
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)
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
1.3.45Houdini 22.0+
Bump TumbleRig to v1.3.45
apex_spline: scale_parent reads control scale via transform::Explode
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
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
1.3.42Houdini 22.0+
release: v1.3.42 — fix compile-subgraphs hython DLL resolution
1.3.38Houdini 22.0+
release: v1.3.38
chore: update docs version refs, mark Pattern B complete, update th_spline_prepper HDA
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
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
1.3.35Houdini 22.0+
release: v1.3.35
1.3.34Houdini 22.0+
release: v1.3.34
apex_sliders + apex_space_switcher: two follow-up fixes
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
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
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)
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
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
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
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)
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
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
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
1.3.23Houdini 22.0+
release: v1.3.23 - reliable display-invoke flag sync + CI build fix
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
1.3.18Houdini 22.0+
release: v1.3.18 — recover from v1.3.17 register failure + restore multi-platform
1.3.16Houdini 22.0+
release: v1.3.16 — windows-only until hpm registry fix lands
1.3.15Houdini 22.0+
release: v1.3.15
ci: map hpm
<os>-<arch>platforms to API short form in register_release
1.3.13Houdini 22.0+
release: v1.3.13 — drop macOS again (SideFX still hasn't shipped H22 macOS)
1.3.11Houdini 22.0+
release: v1.3.11 — windows-only release while linux runner is missing HDK toolkit
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
1.3.6Houdini 22.0+
release: v1.3.6
fix(apex_spline): eliminate hemisphere flip in Gram-Schmidt orientation
1.3.5Houdini 22.0+
release: v1.3.5
1.3.4Houdini 22.0+
release: v1.3.4
1.3.2Houdini 22.0+
release: v1.3.2 — fix creator API route (creator/slug, not pkg_id)
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
1.0.7Houdini 21.0+
No changelog for this version.
Custom rigging nodes for Houdini 22
Created by Tumblehead