Draw both arms on the supine motions and retire the hide list

Hollow Body Hold, Leg Raises, and Reverse Crunch hid the far arm
because it was never authored - a leftover from the planar rig. Both
arms are now posed, so the far arm reads as the standard light member
behind the near one, the same visual language every other exercise
uses, and the figures stay truthful from any viewpoint. With no
remaining users, the hide mechanism is deleted from both renderers,
the motion schema, and the docs.

Claude-Session: https://claude.ai/code/session_01HJDQQDA9QdP8zByg43H5v3
This commit is contained in:
2026-07-06 22:19:23 -04:00
parent 81186c51b1
commit b8c3b326c1
25 changed files with 35 additions and 45 deletions
@@ -22,8 +22,6 @@ struct FigureAnimation {
let timeline: MotionTimeline
/// Parts drawn in the working accent color (`arm_r`, `leg_l`, `spine`, ).
let working: Set<String>
/// Limbs fully occluded in this view never drawn.
let hide: Set<String>
/// Equipment layer (see SYSTEM.md "The props layer").
let props: [MotionProp]
@@ -34,28 +32,20 @@ struct FigureAnimation {
else { return nil }
self.timeline = timeline
self.working = Set(resources.motion.working ?? [])
self.hide = Set(resources.motion.hide ?? [])
self.props = resources.motion.props ?? []
}
/// Seconds per full camera revolution for orbiting motions.
private static let orbitPeriod: Double = 24
/// Prop-free, hide-free motions slowly orbit the camera while animating the
/// bodyweight moves. Scene equipment is a view-locked billboard and a `hide` list
/// describes one authored viewpoint, so machines keep their fixed camera.
var orbits: Bool { props.isEmpty && hide.isEmpty }
/// Prop-free motions slowly orbit the camera while animating the bodyweight
/// moves. Machines keep their fixed camera until their equipment rotates too.
var orbits: Bool { props.isEmpty }
/// Drawable geometry at `time` the figure plus the resolved equipment layers
/// with limbs listed in `hide` dropped so neither they nor any prop riding them
/// are drawn.
/// Drawable geometry at `time` the figure plus the resolved equipment layers.
func geometry(at time: Double) -> FigureGeometry {
let yaw = orbits ? 360 * (time / Self.orbitPeriod) : 0
var geo = timeline.geometry(at: time, yawOffset: yaw, props: props)
for name in hide {
if let limb = FigureLimb(rawValue: name) { geo.limbs[limb] = nil }
}
return geo
return timeline.geometry(at: time, yawOffset: yaw, props: props)
}
}
@@ -235,8 +235,6 @@ struct ExerciseMotion: Codable {
let camera: MotionCamera?
/// Parts (`arm_r`, `leg_l`, `spine`, ) drawn in the working accent color.
let working: [String]?
/// Limbs fully occluded in this view never drawn.
let hide: [String]?
/// Equipment layer: scene shapes and cables behind the figure, joint-attached
/// items (bar/dumbbell/pad) over the limbs. See SYSTEM.md "The props layer".
let props: [MotionProp]?