Pose Studio: our own poser (OP Pose HUD UI) with poses shared via the LSL bridge, and consent-based posing of others #500

Closed
opened 2026-10-06 17:53:35 +00:00 by sky_line · 4 comments
Owner

Re-scoped 2026-10-07. This ticket now covers our own poser, built on the owner's OP Pose HUD UI, with poses shared with other Slipstream users through the LSL bridge (#428), and posing others only with consent. It replaces the earlier "pre-generated animations played by asset ID" design; that idea is kept below as an optional later phase. The reference HUD screenshot and UI notes are in the first comment.

Why the bridge, not IMs

  • One to many: one chat message on a known channel reaches every listening bridge in range. Black Dragon's sync (2025, IM-based, one IM per person, 15 bones per IM) runs into IM rate limits and only reaches people you paired with one by one.
  • The sim vouches for identity: a listening script gets the speaker's key from the sim, and llGetOwnerKey() gives the avatar behind a bridge, so nobody can fake poses or consent for someone else.
  • Consent works on any viewer: the bridge can show an llDialog to anyone, on any viewer, and their button press comes back authenticated as them.

1. Rework the current poser (the Firestorm port) into our own

  • UI based on the OP Pose HUD:
    • a T-pose figure with clickable bone dots (pony first; human/Bento figures later);
    • three axis dials coloured to match the gizmo (X red, Y green, Z blue), with numeric entry;
    • mirror mode across the spine; freeze; reset bone / reset all;
    • a pose list with save/load and sequenced playback (loop, step, play/stop).
  • Engine: keep the local joint-override posing we have (it already works under Vulkan via llcleananimstore isAvatarPosedLocally). Firestorm's extra tools (trackpad, IK #253, BVH export) are kept where they fit, and the old floater goes once the new one covers them.
  • Provenance: this supersedes #450's "re-import from Firestorm release": what remains of Firestorm's code is credited; the UI and protocol are ours.

2. Share your own pose with other Slipstream users (bridge broadcast)

  • Send: viewer → own bridge (private owner-only channel, per #428's security rules) → bridge says it on a public Slipstream pose channel (llRegionSay, or say/shout range; decide).
  • Receive: other Slipstream users' bridges listen on that channel, check llGetOwnerKey(id), and pass the data to their viewer with llOwnerSay, which the viewer intercepts silently. The pose is applied only to the avatar that owns the sending bridge.
  • Encoding: compact and versioned: quantised quaternions (and positions/scale where used) per bone, base64, a protocol version and a sequence number. Send changed bones only, full pose on request / every N seconds / when a newcomer arrives; whole message under 1024 bytes, splitting a full skeleton across a few messages.
  • Rate: preview locally while a dial is dragging; send on release or at a capped rate. Respect the sim's chat throttles.
  • Receiver controls: a "Show other people's synced poses" toggle, per-avatar ignore, and muted avatars always ignored. Poses end when the sender stops posing, detaches the bridge, or leaves.
  • Only Slipstream viewers see synced poses; other viewers see the avatar's normal animations.
  • Request: you pick someone; your bridge shows them an llDialog (" wants to pose you", Accept / Deny). This works whatever viewer they use.
  • Grant: the button reply arrives authenticated as them. Use a well-known consent channel so every Slipstream bridge in range can verify the grant itself, instead of trusting the poser's claim. (Verify the hearing range of dialog replies in testing.)
  • Scope: temporary and revocable: ends on revoke, teleport/region change, logout, or the poser stopping. Slipstream targets get a "Stop being posed" control; others get a Stop button in a follow-up dialog or a chat command.
  • Abuse limits: rate-limit requests per person; "block pose requests from this person"; muted people can't send requests.
  • What people see: the target (if on Slipstream) and other Slipstream users nearby see the pose, but only while a verified grant exists. Receivers drop pose data for anyone without one.

Interim (done 2026-10-07): posing other avatars is disabled in the current poser (self and own animesh only) until this ships.

Optional later phase: visible to every viewer

The original idea for this ticket: play pre-generated single-bone animations (the OP Pose HUD's procedural set) by asset ID through AgentAnimation, so the sim relays the pose to all viewers. Needs a pack format (bone/angle step → animation UUID), the server's limit on concurrent animations, and priority handling. Could also become "bake pose to animation" (upload, costs L$). Only after parts 1–3.

Depends on

  • #428 LSL bridge: this is its first must-have feature. Attach on demand while posing or showing synced poses (no permanent slot otherwise).
  • AO (#496): pause AO stands while posed.

Done when

  • The new poser floater replaces the Firestorm one for everyday posing.
  • Two Slipstream users in range see each other's poses live; a third viewer type sees nothing odd.
  • Posing someone else requires their Accept, is verifiable by every Slipstream observer, and stops cleanly on revoke / teleport / logout.
  • Request spam and spoofing attempts (fake consent, fake pose data for someone else) are rejected in testing.
**Re-scoped 2026-10-07.** This ticket now covers our own poser, built on the owner's **OP Pose HUD** UI, with poses shared with other Slipstream users through the **LSL bridge** (#428), and posing others only with consent. It replaces the earlier "pre-generated animations played by asset ID" design; that idea is kept below as an optional later phase. The reference HUD screenshot and UI notes are in the first comment. ## Why the bridge, not IMs - **One to many:** one chat message on a known channel reaches every listening bridge in range. Black Dragon's sync (2025, IM-based, one IM per person, 15 bones per IM) runs into IM rate limits and only reaches people you paired with one by one. - **The sim vouches for identity:** a listening script gets the speaker's key from the sim, and `llGetOwnerKey()` gives the avatar behind a bridge, so nobody can fake poses or consent for someone else. - **Consent works on any viewer:** the bridge can show an `llDialog` to anyone, on any viewer, and their button press comes back authenticated as them. ## 1. Rework the current poser (the Firestorm port) into our own - **UI based on the OP Pose HUD:** - a T-pose figure with clickable bone dots (pony first; human/Bento figures later); - three axis dials coloured to match the gizmo (X red, Y green, Z blue), with numeric entry; - mirror mode across the spine; freeze; reset bone / reset all; - a pose list with save/load and sequenced playback (loop, step, play/stop). - **Engine:** keep the local joint-override posing we have (it already works under Vulkan via `llcleananimstore isAvatarPosedLocally`). Firestorm's extra tools (trackpad, IK #253, BVH export) are kept where they fit, and the old floater goes once the new one covers them. - **Provenance:** this supersedes #450's "re-import from Firestorm release": what remains of Firestorm's code is credited; the UI and protocol are ours. ## 2. Share your own pose with other Slipstream users (bridge broadcast) - **Send:** viewer → own bridge (private owner-only channel, per #428's security rules) → bridge says it on a public **Slipstream pose channel** (`llRegionSay`, or say/shout range; decide). - **Receive:** other Slipstream users' bridges listen on that channel, check `llGetOwnerKey(id)`, and pass the data to their viewer with `llOwnerSay`, which the viewer intercepts silently. The pose is applied **only to the avatar that owns the sending bridge**. - **Encoding:** compact and versioned: quantised quaternions (and positions/scale where used) per bone, base64, a protocol version and a sequence number. Send changed bones only, full pose on request / every N seconds / when a newcomer arrives; whole message under 1024 bytes, splitting a full skeleton across a few messages. - **Rate:** preview locally while a dial is dragging; send on release or at a capped rate. Respect the sim's chat throttles. - **Receiver controls:** a "Show other people's synced poses" toggle, per-avatar ignore, and muted avatars always ignored. Poses end when the sender stops posing, detaches the bridge, or leaves. - Only Slipstream viewers see synced poses; other viewers see the avatar's normal animations. ## 3. Posing other people, with consent - **Request:** you pick someone; your bridge shows them an `llDialog` ("<you> wants to pose you", Accept / Deny). This works whatever viewer they use. - **Grant:** the button reply arrives authenticated as them. Use a well-known consent channel so **every Slipstream bridge in range can verify the grant itself**, instead of trusting the poser's claim. (Verify the hearing range of dialog replies in testing.) - **Scope:** temporary and revocable: ends on revoke, teleport/region change, logout, or the poser stopping. Slipstream targets get a "Stop being posed" control; others get a Stop button in a follow-up dialog or a chat command. - **Abuse limits:** rate-limit requests per person; "block pose requests from this person"; muted people can't send requests. - **What people see:** the target (if on Slipstream) and other Slipstream users nearby see the pose, but only while a verified grant exists. Receivers drop pose data for anyone without one. **Interim (done 2026-10-07):** posing other avatars is disabled in the current poser (self and own animesh only) until this ships. ## Optional later phase: visible to every viewer The original idea for this ticket: play pre-generated single-bone animations (the OP Pose HUD's procedural set) by asset ID through `AgentAnimation`, so the sim relays the pose to all viewers. Needs a pack format (bone/angle step → animation UUID), the server's limit on concurrent animations, and priority handling. Could also become "bake pose to animation" (upload, costs L$). Only after parts 1–3. ## Depends on - **#428 LSL bridge:** this is its first must-have feature. Attach on demand while posing or showing synced poses (no permanent slot otherwise). - AO (#496): pause AO stands while posed. ## Done when - The new poser floater replaces the Firestorm one for everyday posing. - Two Slipstream users in range see each other's poses live; a third viewer type sees nothing odd. - Posing someone else requires their Accept, is verifiable by every Slipstream observer, and stops cleanly on revoke / teleport / logout. - Request spam and spoofing attempts (fake consent, fake pose data for someone else) are rejected in testing.
sky_line added this to the Slipstream project 2026-10-06 17:53:35 +00:00
Author
Owner

Reference: the current OP Pose HUD UI (from the owner). It's a reference for layout and workflow, not something to copy exactly.

OP Pose HUD

What's on it:

  • Bone picker: a T-posing pony silhouette with a dot per bone. The selected bone is highlighted (white), and the head, ears, spine, arms, legs and a segmented tail are all pickable.
  • Three axis dials, coloured X (red), Y (green) and Z (blue). Each is a half-ring around a small head icon, with a pointer marker, arranged around an XYZ gizmo, so you can see which axis you're turning.
  • Side tools (top to bottom):
    • export/share;
    • save;
    • the two-heads icon: pose another avatar who wears the same HUD (see the stretch goal below);
    • exit / release;
    • reset All;
    • reset Bone.
  • Freeze (snowflake), bottom-left.
  • Mirror mode (the figure icon, bottom-left): mirrors across the spine. Posing one arm or leg applies the mirrored rotation to the opposite side, so both arms or both legs can be posed the same way at once.
  • Right panel: a pose list with scroll arrows. Its toolbar has delete, loop/repeat, add/remove, and sequence playback (previous / next / stop / play). So poses can be strung together and played as an animation sequence.

Ideas to carry over:

  • dial colours that match the axis gizmo;
  • reset-bone and reset-all;
  • mirror mode across the spine (pose one limb, the opposite limb follows mirrored);
  • freeze;
  • saved poses with sequenced playback (loop and step) — worth adding to the design sketch above.

Stretch goal (not first version): posing someone else. In the HUD, the two-heads icon poses another pony wearing the same HUD. A viewer can only start animations on its own avatar, so the built-in version would need the other person to run Slipstream (or wear a helper) and agree to it. Your viewer sends pose commands, and their viewer plays the animations on their own avatar. The channel could be an IM with a hidden payload, or the bridge (#428). It needs a consent prompt, a revoke option, and rate limits. Skip it for now.

**Reference: the current OP Pose HUD UI** (from the owner). It's a reference for layout and workflow, not something to copy exactly. ![OP Pose HUD](https://git.slipstreamviewer.org/attachments/4e4fc7ce-ea7d-4405-81af-5afe2be4c534) What's on it: - **Bone picker:** a T-posing pony silhouette with a dot per bone. The selected bone is highlighted (white), and the head, ears, spine, arms, legs and a segmented tail are all pickable. - **Three axis dials**, coloured X (red), Y (green) and Z (blue). Each is a half-ring around a small head icon, with a pointer marker, arranged around an XYZ gizmo, so you can see which axis you're turning. - **Side tools (top to bottom):** - export/share; - save; - the two-heads icon: **pose another avatar** who wears the same HUD (see the stretch goal below); - exit / release; - reset **All**; - reset **Bone**. - **Freeze** (snowflake), bottom-left. - **Mirror mode** (the figure icon, bottom-left): mirrors across the spine. Posing one arm or leg applies the mirrored rotation to the opposite side, so both arms or both legs can be posed the same way at once. - **Right panel:** a pose list with scroll arrows. Its toolbar has delete, loop/repeat, add/remove, and sequence playback (previous / next / stop / play). So poses can be strung together and played as an animation sequence. Ideas to carry over: - dial colours that match the axis gizmo; - reset-bone and reset-all; - **mirror mode across the spine** (pose one limb, the opposite limb follows mirrored); - freeze; - saved poses with sequenced playback (loop and step) — worth adding to the design sketch above. **Stretch goal (not first version): posing someone else.** In the HUD, the two-heads icon poses another pony wearing the same HUD. A viewer can only start animations on its own avatar, so the built-in version would need the other person to run Slipstream (or wear a helper) and agree to it. Your viewer sends pose commands, and their viewer plays the animations on their own avatar. The channel could be an IM with a hidden payload, or the bridge (#428). It needs a consent prompt, a revoke option, and rate limits. Skip it for now.
sky_line changed title from Built-in pose builder from the OP Pose HUD: per-bone pre-generated animations played by asset ID (visible to everyone) to Pose Studio: our own poser (OP Pose HUD UI) with poses shared via the LSL bridge, and consent-based posing of others 2026-10-07 04:39:41 +00:00
Author
Owner

Background for the re-scope (2026-10-07): Black Dragon's history (github.com/NiranV/Black-Dragon-Viewer).

  • 2018: posing others was shelved (ef783ccb49), at LL's request per the developer.
  • 2025-06 onward: request/accept permission over IMs (;PoserRequest / ;PoserAccept, b786c6479e), then pairwise pose sync over IMs (9aba3180f8, 9e3f3e23a6). Nobody sees a synced pose except the paired people.
  • Their receive path applies an incoming sync without re-checking consent; ours must verify on receipt.
    We go with the bridge instead of IMs for one-to-many delivery, sim-authenticated identity, and consent dialogs that work on any viewer.
Background for the re-scope (2026-10-07): Black Dragon's history (github.com/NiranV/Black-Dragon-Viewer). - 2018: posing others was shelved (`ef783ccb49`), at LL's request per the developer. - 2025-06 onward: request/accept permission over IMs (`;PoserRequest` / `;PoserAccept`, `b786c6479e`), then pairwise pose sync over IMs (`9aba3180f8`, `9e3f3e23a6`). Nobody sees a synced pose except the paired people. - Their receive path applies an incoming sync without re-checking consent; ours must verify on receipt. We go with the bridge instead of IMs for one-to-many delivery, sim-authenticated identity, and consent dialogs that work on any viewer.
Author
Owner

Planned for 1.1.0 Beta 10 (the beta after the octree work lands in Beta 9): the new poser with consent-based posing and one-to-all pose sharing via the bridge (#428).

Planned for **1.1.0 Beta 10** (the beta after the octree work lands in Beta 9): the new poser with consent-based posing and one-to-all pose sharing via the bridge (#428).
Author
Owner

Rotation model (owner requirement): the dials use swing + twist, not raw Euler. Y and Z = azimuth and elevation (aim the bone), X = twist about the bone's own forward axis, applied last. A head roll/tilt is then always the X dial whatever Y/Z are. (Black Dragon's poser doesn't do this and is harder to use; the OP Pose HUD does.) Stable near the poles; mirror mode mirrors in this parametrisation; loaded quaternion poses decompose back into swing + twist for the dials.

**Rotation model (owner requirement):** the dials use swing + twist, not raw Euler. **Y and Z = azimuth and elevation** (aim the bone), **X = twist** about the bone's own forward axis, applied last. A head roll/tilt is then always the X dial whatever Y/Z are. (Black Dragon's poser doesn't do this and is harder to use; the OP Pose HUD does.) Stable near the poles; mirror mode mirrors in this parametrisation; loaded quaternion poses decompose back into swing + twist for the dials.
sky_line 2026-10-09 04:33:31 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
sky_line/Slipstream#500
No description provided.