# 0.10.19

<!--{ "parent": "CHANGELOG", "order": 9989981 }-->

## Added

- **Auto-rig finds the fingers a mesh has** (Tonio: the skinny weasel has three fingers and a thumb, and they were not rigged). Palm down in a T-pose, fingers are separate only from above, so `fitSkeleton` looks down on each hand (`MeshQuery.fromAbove()`): slices across the hand from the tips back find the fingers as separate runs, where they join is the knuckle, and a prong that reaches forward near the wrist is the thumb. Each joint sits along the real finger at the middle of its thickness, and found fingers take the skin (the hand then runs to the knuckles). `rig.fingers` says which were found; the rest are placed by proportion as before and take none. The skinny weasel gets index, middle, ring and thumb; omnidude's mitten an index and a thumb; the chunky weasel's paws none.
- **A strand is laid along a path** (Tonio: map out the tail or the ponytail, not one stub, and choose how many links). `StrandSpringRecipe.path` is the line it follows at rest, root first; its `segments` links are spaced evenly along it (`strandPoints`). In the rig tool every point is an orange handle you drag, `+ point` adds one beyond the tip, `− point` takes one away, `links` sets the count, and the chosen strand marks where each link falls. A straight strand still reads as before, and `setStrandPath` keeps `offset`, `length`, `yawDeg` and `pitchDeg` true to a path for a reader that knows nothing of paths.
- **The rig tool snaps its view** to a face of the character (see `inspectView` below), and its API gains `view` and `play(clip)`. A bone chain spring shows every link, not only its first bone, and an auto-rigged tail has a `tail links` slider.
- **`inspectView(camera)`: front, back, side, top and bottom views, orthographic and held** (Tonio, #3419). It turns an `ArcRotateCamera` orthographic and pins it to a face, so a drag no longer orbits and is free for what is under the pointer; pan and zoom still work. The camera's own `radius` is the zoom: each frame the orthographic box is what a perspective camera at that radius would show, so leaving the view leaves the scene the same size. The near plane moves behind the camera, so zooming in close never cuts the subject open.
- **Panels and the system bar work under an orthographic camera.** They were placed from the camera's field of view, so they shrank to a stamp. `viewSpanAt(camera, d, w, h)` in frame-panel answers both kinds of camera.
- **`barMenu(...)`: a system-bar button that is a menu**: one press opens a short list under the bar, a choice closes it, flat and in a headset. `viewMenu(inspect, scene, options)` is the camera one: it picks the face or `perspective`, and its faces, labels and whether it stays in the perspective view can all be configured.
- **`seamMaterial` / `withBarycentrics`: a mesh drawn as its polygons**: a flat fill (desaturated pink by default) with soft white edges, drawn in the fragment shader from barycentric coordinates, so the edges are smooth and the same width in pixels at any zoom; they fade where triangles shrink to a few pixels. `seamOverlay(mesh)` draws a twin in the mesh's place (its own unshared geometry, the same skeleton), so the mesh itself is untouched.
- **The rig tool's view is its pose** (Tonio): standing at rest it is orthographic (front by default) and drawn as its polygons; `perspective` plays the clip. The camera on the system bar picks either, and the animate toggle moves the view the other way. Seen from a side, the mannequin stands beside the character rather than in front of it.
- **Auto-rig: a hand with no fingers apart gets a mitten and a thumb** (Tonio, the space marine's claws). Seen from above such a hand is one blob, so no finger was found and four were placed by proportion, in the air past a claw that hooks down. Now its middle line is followed slice by slice from the wrist (the middle of the flesh in height and depth across each slice), so one chain (the index, as Mixamo's mittens have) runs down the hook to its tip. A thumb that grows straight out of the palm's edge, with no gap, is found as a bump on the palm's front edge. The chunky weasel's paws get a mitten each, so a paw curls on a grip.
- **The seam material hides the diagonals that split quads** (Tonio): `quadDiagonals` finds the quads again (two triangles sharing the longest edge of both, nearly flat together) and that edge is not drawn. `withBarycentrics(mesh, { quads: false })` draws every edge.
- **The biped sprints**: near full speed it plays the rig's `sprint` state (UAL's `Sprint_Loop`, already mapped by `ualAnimationStates()` but never played) instead of the jog sped up, held until the speed drops back a little so an analog trigger does not flicker between them. A rig without a sprint clip jogs as before (Tonio).
- **`inspectStage(scene)`**: a neutral floor to look at a model on (light grey, ruled every metre and faintly every quarter) and a key light. The rig tool stands on it. Shadows are not on yet (see #3420).
- **The rig tool's mannequin is a ghost** (translucent, so it compares without competing), and its toggle is called `mannequin` (it was `compare`). The glTF loader marks materials opaque, which `visibility` alone cannot override, so they are set to blend. The clip picker lists loops first.
- **The seam material can receive shadows**: `seamOverlay`'s twin receives them, and `shade` (now 0.45 by default) is the part of the fill that light, and so shadow, reaches. Fill and line colours are options.
- **The effect tool mounts in a host's scene** on the same contract (tosijs-3d#122, for ensemble's `effect` piece): `mountEffectTool(b3d, { recipe, target, files, stage, camera })`, `change` and `commit` with the recipe, a system panel when hosted, `unmount()` that returns every count. `effectTool()` is the same tool in a scene of its own.
- **A scene's last effect player takes the shared parts with it**: the per-scene driver observer, pooled lights and sprite textures are released when the last `EffectPlayer` in a scene is disposed (they used to stay until the scene went), and made again by the next effect.
- **The rig tool mounts in a host's scene** (tosijs-3d#122, for ensemble's `figure` piece): `mountRigTool(b3d, { models, recipe, files, stage, camera })` returns a handle firing `change` (every edit) and `commit` (one per finished gesture) with a copy of the recipe, its `api`, and `unmount()`. `files: false` drops save, load, copy and the browser's working copy; `stage: false` adds no floor or light; a given camera is driven and restored exactly (angles, distance, target, projection, limits). Hosted, its panel is a system panel. Unmount (safe twice, and mid-load) returns the scene's mesh, material, texture, node, skeleton, animation, observer and panel counts to where they were, checked headless. `rigTool()` is now the same tool mounted in a scene of its own, with `change` and `commit` dispatched on the element.

## Changed

- **A character's head is no longer tipped back by its own neck** (Tonio: the weasels looked up). Retargeting lined every bone up with the source's rest direction, which is right for a limb (an A-pose against a T-pose) and wrong for the body's axis: the weasel's neck leans forward to a chin under its snout, and pulled upright to match the mannequin's, it tipped the head up by about 14° through every clip. The hips, spine, chest, neck and head now take the clip's turn as it is.
- **A tap on the body no longer reassigns a bone on its own** in the rig tool (Tonio: on an iPhone the weasels' heads sank into their chests and a tail pointed forward). The chosen role starts as the head, and any press that did not travel set the head's bone to whatever was under it. On a phone that was every attempt to orbit, and the tool remembered it. Now a tap sets a bone only right after a dot, the role or `clicking sets` was chosen, and only once. `start over` clears a recipe that was already changed.
- **The weasels' tails are stiffer** in the rig tool (Tonio: too floppy): stiffness 0.6 and damping 0.85, down from 0.25 and 0.6, which cuts the tail tip's sway on a walk to about 40%. A recipe the tool remembered keeps its own values; `start over` takes the new ones. Stiffness is the knob for floppiness: damping only trims the swing a little.

Size: barrel (min, packages external) 1224.9 KB raw / 420.2 KB gz, +1.2% on 0.10.18 (inspect views, the seam material, bar menus, the inspect stage, finger and mitten fitting; the rig and effect tools are subpaths, outside the barrel).
