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:
@@ -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]?
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
"name": "Hollow Body Hold",
|
||||
"primary": 2,
|
||||
"working": ["spine"],
|
||||
"hide": ["arm_l"],
|
||||
"frames": [
|
||||
{
|
||||
"hold": 0.4, "tween": 0.8,
|
||||
@@ -10,6 +9,7 @@
|
||||
"spine": [0, 0],
|
||||
"neck": 12, "head": -12,
|
||||
"shoulder_r": 180, "elbow_r": 0,
|
||||
"shoulder_l": 180, "elbow_l": 0,
|
||||
"hip_r": 0, "knee_r": 0,
|
||||
"hip_l": 0, "knee_l": 0
|
||||
},
|
||||
@@ -19,6 +19,7 @@
|
||||
"spine": [0, 14],
|
||||
"neck": 20,
|
||||
"shoulder_r": 175, "elbow_r": 0,
|
||||
"shoulder_l": 175, "elbow_l": 0,
|
||||
"hip_r": 18, "knee_r": 0,
|
||||
"hip_l": 18, "knee_l": 0
|
||||
}
|
||||
|
||||
@@ -2,13 +2,13 @@
|
||||
"name": "Leg Raises",
|
||||
"primary": 1,
|
||||
"working": ["leg_r", "leg_l"],
|
||||
"hide": ["arm_r"],
|
||||
"frames": [
|
||||
{
|
||||
"hold": 0.5, "tween": 1.4,
|
||||
"root": {"pos": [185, 148], "pitch": -90},
|
||||
"spine": [0, 0],
|
||||
"neck": 12, "head": -12,
|
||||
"shoulder_r": -2, "elbow_r": 0,
|
||||
"shoulder_l": -2, "elbow_l": 0,
|
||||
"hip_r": 60, "knee_r": 0,
|
||||
"hip_l": 60, "knee_l": 0
|
||||
@@ -18,6 +18,7 @@
|
||||
"root": {"pos": [185, 148], "pitch": -90},
|
||||
"spine": [0, 0],
|
||||
"neck": 12, "head": -12,
|
||||
"shoulder_r": -2, "elbow_r": 0,
|
||||
"shoulder_l": -2, "elbow_l": 0,
|
||||
"hip_r": 8, "knee_r": 0,
|
||||
"hip_l": 8, "knee_l": 0
|
||||
|
||||
@@ -2,13 +2,13 @@
|
||||
"name": "Reverse Crunch",
|
||||
"primary": 2,
|
||||
"working": ["spine"],
|
||||
"hide": ["arm_r"],
|
||||
"frames": [
|
||||
{
|
||||
"hold": 0.5, "tween": 0.7,
|
||||
"root": {"pos": [172, 148], "pitch": -90},
|
||||
"spine": [0, 0],
|
||||
"neck": 12, "head": -12,
|
||||
"shoulder_r": -2, "elbow_r": 0,
|
||||
"shoulder_l": -2, "elbow_l": 0,
|
||||
"hip_r": 100, "knee_r": 120,
|
||||
"hip_l": 100, "knee_l": 120
|
||||
@@ -18,6 +18,7 @@
|
||||
"root": {"pos": [166, 136], "pitch": -105},
|
||||
"spine": [0, 20],
|
||||
"neck": -7, "head": 2,
|
||||
"shoulder_r": 3, "elbow_r": 0,
|
||||
"shoulder_l": 3, "elbow_l": 0,
|
||||
"hip_r": 100, "knee_r": 125,
|
||||
"hip_l": 100, "knee_l": 125
|
||||
|
||||
Reference in New Issue
Block a user