diff --git a/.pql/changelog/ticket_idmap/2026-07.sql b/.pql/changelog/ticket_idmap/2026-07.sql index e51ee6339..a75f22422 100644 --- a/.pql/changelog/ticket_idmap/2026-07.sql +++ b/.pql/changelog/ticket_idmap/2026-07.sql @@ -7,3 +7,4 @@ INSERT INTO ticket_idmap (record_id, ticket_id, created_at, updated_at, deleted_ INSERT INTO ticket_idmap (record_id, ticket_id, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FKE0J4B8GQ17NFFV8N7D45BW', 'T-1091', '2026-07-06 10:38:43.290', '2026-07-06 10:38:43.290', NULL, 'da0796307c06acd6609ac466d6ea48c3', 2) ON CONFLICT(record_id) DO UPDATE SET ticket_id=excluded.ticket_id, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > ticket_idmap.updated_at OR (excluded.updated_at = ticket_idmap.updated_at AND excluded.hash > ticket_idmap.hash); INSERT INTO ticket_idmap (record_id, ticket_id, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FKH8SJRMXTP6XQNBXHRD4CQ0', 'T-1092', '2026-07-06 18:14:07.303', '2026-07-06 18:14:07.303', NULL, 'e34fe437eac3bdbd6a73f8d98bc871a9', 2) ON CONFLICT(record_id) DO UPDATE SET ticket_id=excluded.ticket_id, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > ticket_idmap.updated_at OR (excluded.updated_at = ticket_idmap.updated_at AND excluded.hash > ticket_idmap.hash); INSERT INTO ticket_idmap (record_id, ticket_id, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FKHFRCP5R0VBA9BKR97RRBJ0', 'T-1093', '2026-07-06 18:44:32.562', '2026-07-06 18:44:32.562', NULL, 'ce581695739eea8cd11433cb9f6c86d1', 2) ON CONFLICT(record_id) DO UPDATE SET ticket_id=excluded.ticket_id, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > ticket_idmap.updated_at OR (excluded.updated_at = ticket_idmap.updated_at AND excluded.hash > ticket_idmap.hash); +INSERT INTO ticket_idmap (record_id, ticket_id, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FKJ25KG3ADM4M5XRXCVR2GQG', 'T-1094', '2026-07-06 20:04:59.393', '2026-07-06 20:04:59.393', NULL, 'e856fa3f89f621007a058db26aff2a05', 2) ON CONFLICT(record_id) DO UPDATE SET ticket_id=excluded.ticket_id, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > ticket_idmap.updated_at OR (excluded.updated_at = ticket_idmap.updated_at AND excluded.hash > ticket_idmap.hash); diff --git a/.pql/changelog/tickets/2026-07.sql b/.pql/changelog/tickets/2026-07.sql index f69345da5..f0b71e781 100644 --- a/.pql/changelog/tickets/2026-07.sql +++ b/.pql/changelog/tickets/2026-07.sql @@ -712,3 +712,10 @@ INSERT INTO tickets (record_id, type, parent_record_id, title, description, stat INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FKHFRCP5R0VBA9BKR97RRBJ0', 'task', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Server aim-lock: explicit SetFacing should survive accepted moves (vision-cone flap during path-follows)', 'Found live in the T-1088 sandbox: during a client path-follow the vision cone flaps to path-forward on every accepted step because movement.rs facing_from_delta overwrites Facing on each move, and D-054''s change-gated SetFacing never re-asserts an unchanged octant. Client mitigation shipped (InputMapper.reassert_facing ~2 ticks after each emitted step) shrinks the flap to ~100ms per step but cannot eliminate it — movement wins within a tick. Proper fix is server-side facing decoupling (e.g. an explicit-aim flag/timestamp on Facing that accepted moves do not overwrite while fresh), which is exactly Q-084''s parked walk-vs-aim split now with play evidence. Needs a D-record before wire semantics change; touch nothing until the sidequest''s presentation-layer constraint lifts.', 'in_progress', 'medium', NULL, 'server', NULL, '2026-07-06 18:44:32.561', '2026-07-06 18:55:29.037', NULL, '01cc8d20f141986d0d4fdfe4d6cb1f22', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash); INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FKHFRCP5R0VBA9BKR97RRBJ0', 'task', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Server aim-lock: explicit SetFacing should survive accepted moves (vision-cone flap during path-follows)', 'Found live in the T-1088 sandbox: during a client path-follow the vision cone flaps to path-forward on every accepted step because movement.rs facing_from_delta overwrites Facing on each move, and D-054''s change-gated SetFacing never re-asserts an unchanged octant. Client mitigation shipped (InputMapper.reassert_facing ~2 ticks after each emitted step) shrinks the flap to ~100ms per step but cannot eliminate it — movement wins within a tick. Proper fix is server-side facing decoupling (e.g. an explicit-aim flag/timestamp on Facing that accepted moves do not overwrite while fresh), which is exactly Q-084''s parked walk-vs-aim split now with play evidence. Needs a D-record before wire semantics change; touch nothing until the sidequest''s presentation-layer constraint lifts.', 'done', 'medium', NULL, 'server', NULL, '2026-07-06 18:44:32.561', '2026-07-06 19:18:30.657', NULL, 'a71401dfc41971383da8d314361e15bb', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash); INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FKE0EW2617K9VE4QHSYSR9HW', 'bug', '06FB0TNSRXX29H5X0EB0F0GBW4', '5 of 11 body types misrender bare in CharacterVisual (thin_f/m, heavy_f/m, child)', 'Found by the T-1089 Synty intake spike (2026-07-06), body-only controls with NO garment attached: thin_f/m, heavy_f/m, child misrender in CharacterVisual (exploded/spider arms, detached head/hair; child 303mm max warp, 87 collapsed edges; f-bodies bust-through). These are the newer high-poly bodies (no seg_hips, different segmentation) — exactly the 5 with no production peasant-clothing variants. Upstream of ANY clothing route; blocks T-1089''s 11-of-11 acceptance criterion and resolves part of Q-060. Evidence: spikes/synty-intake/out/bodies_fit_log.json + out/qa_bodies/ (44 screenshots) + out/bodies_recon.json.', 'in_progress', 'high', NULL, 'client', NULL, '2026-07-06 10:38:16.593', '2026-07-06 19:25:35.248', NULL, 'ec4a20d81cb872c936cd825d4ebca616', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash); +INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FKE0EW2617K9VE4QHSYSR9HW', 'bug', '06FB0TNSRXX29H5X0EB0F0GBW4', '5 of 11 body types misrender bare in CharacterVisual (thin_f/m, heavy_f/m, child)', 'Found by the T-1089 Synty intake spike (2026-07-06), body-only controls with NO garment attached: thin_f/m, heavy_f/m, child misrender in CharacterVisual (exploded/spider arms, detached head/hair; child 303mm max warp, 87 collapsed edges; f-bodies bust-through). These are the newer high-poly bodies (no seg_hips, different segmentation) — exactly the 5 with no production peasant-clothing variants. Upstream of ANY clothing route; blocks T-1089''s 11-of-11 acceptance criterion and resolves part of Q-060. Evidence: spikes/synty-intake/out/bodies_fit_log.json + out/qa_bodies/ (44 screenshots) + out/bodies_recon.json. + +RESOLVED (pending review). Root cause: fork bodies (thin/heavy/child) had a mesh<->armature mismatch. blender_segment_body.py apply_scale scaled mesh vertices ONLY, leaving the embedded armature at source scale; since character_visual.gd binds every segment onto ONE shared skeleton (skeleton/armature.glb) by bone name, each segment must be internally consistent with its own embedded armature — the mesh-only scale dropped the head ~0.35m below the Head bone and flung limbs apart on relocation. thin/heavy were additionally stale high-poly artifacts (torso 1419-1704v vs 375v) missing seg_hips entirely. Fix: replaced apply_scale with apply_fork_scale (tooling/blender_segment_body.py) which scales mesh AND armature together and BAKES via Blender transform_apply (edit-bone poking alone shears connected chains — arms/fingers still exploded). Rebuilt all 5 via new tooling/blender_rebuild_forks.py from Source-tier gltf; now 19 segments incl seg_hips, low-poly matching the healthy six. Bare-body QA (idle+walk, front+side, real CharacterVisual): all 5 coherent, head/hair attached, no explosion; healthy 6 untouched. Q-060: all 3 peasant garments Surface-Deform-fit onto all 5 forks (15/15 surface_deform, 0 shrinkwrap fallback) — Surface Deform HOLDS at the extremes on repaired bodies. No manifest change (body ids/paths unchanged).', 'in_progress', 'high', NULL, 'client', NULL, '2026-07-06 10:38:16.593', '2026-07-06 20:02:30.990', NULL, 'faba67bd9fa9be117a752e07459c5814', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash); +INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FKE0EW2617K9VE4QHSYSR9HW', 'bug', '06FB0TNSRXX29H5X0EB0F0GBW4', '5 of 11 body types misrender bare in CharacterVisual (thin_f/m, heavy_f/m, child)', 'Found by the T-1089 Synty intake spike (2026-07-06), body-only controls with NO garment attached: thin_f/m, heavy_f/m, child misrender in CharacterVisual (exploded/spider arms, detached head/hair; child 303mm max warp, 87 collapsed edges; f-bodies bust-through). These are the newer high-poly bodies (no seg_hips, different segmentation) — exactly the 5 with no production peasant-clothing variants. Upstream of ANY clothing route; blocks T-1089''s 11-of-11 acceptance criterion and resolves part of Q-060. Evidence: spikes/synty-intake/out/bodies_fit_log.json + out/qa_bodies/ (44 screenshots) + out/bodies_recon.json. + +RESOLVED (pending review). Root cause: fork bodies (thin/heavy/child) had a mesh<->armature mismatch. blender_segment_body.py apply_scale scaled mesh vertices ONLY, leaving the embedded armature at source scale; since character_visual.gd binds every segment onto ONE shared skeleton (skeleton/armature.glb) by bone name, each segment must be internally consistent with its own embedded armature — the mesh-only scale dropped the head ~0.35m below the Head bone and flung limbs apart on relocation. thin/heavy were additionally stale high-poly artifacts (torso 1419-1704v vs 375v) missing seg_hips entirely. Fix: replaced apply_scale with apply_fork_scale (tooling/blender_segment_body.py) which scales mesh AND armature together and BAKES via Blender transform_apply (edit-bone poking alone shears connected chains — arms/fingers still exploded). Rebuilt all 5 via new tooling/blender_rebuild_forks.py from Source-tier gltf; now 19 segments incl seg_hips, low-poly matching the healthy six. Bare-body QA (idle+walk, front+side, real CharacterVisual): all 5 coherent, head/hair attached, no explosion; healthy 6 untouched. Q-060: all 3 peasant garments Surface-Deform-fit onto all 5 forks (15/15 surface_deform, 0 shrinkwrap fallback) — Surface Deform HOLDS at the extremes on repaired bodies. No manifest change (body ids/paths unchanged).', 'review', 'high', NULL, 'client', NULL, '2026-07-06 10:38:16.593', '2026-07-06 20:02:31.012', NULL, '5cec3f5395cb96910151ae43d10076dc', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash); +INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FKJ25KG3ADM4M5XRXCVR2GQG', 'task', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Child/teen bodies composite at adult height — shared-skeleton normalization discards stature', 'Found during T-1090 repair (2026-07-06): the shared-skeleton compositor (character_visual.gd binds every segment to the one Regular-sized armature by bone name) normalizes global scale — only cross-sectional shape survives, so thin reads narrow and heavy reads wide (correct) but child and teen stand at ADULT height. Pre-existing behavior, not a T-1090 regression. If stature matters (it will — children in crowds), options: per-body runtime skeleton, node-level scale on CharacterVisual, or bone-length retarget at load. Interacts with animation retargeting (shorter limbs vs shared UAL clips) and D-164. Sprint-28 verdict warns runtime BONE scaling fails — evaluate NODE scale first.', 'backlog', 'medium', NULL, 'client', NULL, '2026-07-06 20:04:59.392', '2026-07-06 20:04:59.392', NULL, '7ceb0fb9f90b36988d9d2b75765c9585', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash); diff --git a/client/assets/characters/bodies/child/README.md b/client/assets/characters/bodies/child/README.md index d7982ca1e..ee5c2f3b5 100644 --- a/client/assets/characters/bodies/child/README.md +++ b/client/assets/characters/bodies/child/README.md @@ -1,20 +1,19 @@ -# Fork body type — auto-generated from mesh scaling +# Fork body type — auto-generated from mesh + armature scaling (T-1090) -This directory contains **child** body segments, generated by applying -a proportional mesh scale to the source body (Teen_Male_FullBody.gltf): +This directory contains **child** body segments, generated by applying a +proportional scale to the source body (Teen_Male_FullBody.gltf) mesh AND its armature rest pose +together, then segmenting: Scale: (0.75, 0.72, 0.75) -The Y scale (0.72) differs from XZ (0.75) intentionally: children have different -proportions from adults. They are not simply uniformly smaller — their limbs are -shorter relative to torso height (Y) compared to torso width/depth (XZ). The -non-uniform scale captures this: the child is 75% of teen width/depth but only -72% of teen height, reflecting the head-to-body ratio and limb length differences -typical of pre-teen proportions. +The scale is applied to the mesh vertices and the embedded armature rest pose +with the SAME affine (T-1090 fix). This keeps each segment internally consistent +with its own skeleton, which the shared-skeleton compositor +(character_visual.gd) requires — a mesh-only scale detaches the head and +explodes the limbs on relocation. -These segments are APPROXIMATE. They produce a visually distinct silhouette -but are not artist-authored from scratch. Review the proportions and refine -the base mesh manually if the auto-scale result is not satisfactory. +Cross-sectional differentiation (thin = narrow, heavy = wide) survives the +composite; global height normalises to the shared skeleton (see T-1090 report / +Q-060 for the shared-skeleton scale-normalisation note). -Status: auto-generated, needs artist review -Sprint 28 — visual team +Status: auto-generated (rebuilt T-1090), 18 segments incl. seg_hips diff --git a/client/assets/characters/bodies/child/seg_arm_lower_l.glb b/client/assets/characters/bodies/child/seg_arm_lower_l.glb index 9ffd64c11..c6b5c5174 100644 Binary files a/client/assets/characters/bodies/child/seg_arm_lower_l.glb and b/client/assets/characters/bodies/child/seg_arm_lower_l.glb differ diff --git a/client/assets/characters/bodies/child/seg_arm_lower_r.glb b/client/assets/characters/bodies/child/seg_arm_lower_r.glb index 96c0dd5ac..0dd9c5be1 100644 Binary files a/client/assets/characters/bodies/child/seg_arm_lower_r.glb and b/client/assets/characters/bodies/child/seg_arm_lower_r.glb differ diff --git a/client/assets/characters/bodies/child/seg_arm_upper_l.glb b/client/assets/characters/bodies/child/seg_arm_upper_l.glb index 59fb6e90e..887e8c872 100644 Binary files a/client/assets/characters/bodies/child/seg_arm_upper_l.glb and b/client/assets/characters/bodies/child/seg_arm_upper_l.glb differ diff --git a/client/assets/characters/bodies/child/seg_arm_upper_r.glb b/client/assets/characters/bodies/child/seg_arm_upper_r.glb index c514adbcd..7ae50bbf7 100644 Binary files a/client/assets/characters/bodies/child/seg_arm_upper_r.glb and b/client/assets/characters/bodies/child/seg_arm_upper_r.glb differ diff --git a/client/assets/characters/bodies/child/seg_eyebrows.glb b/client/assets/characters/bodies/child/seg_eyebrows.glb index 5f2311d9a..02878425c 100644 Binary files a/client/assets/characters/bodies/child/seg_eyebrows.glb and b/client/assets/characters/bodies/child/seg_eyebrows.glb differ diff --git a/client/assets/characters/bodies/child/seg_eyes.glb b/client/assets/characters/bodies/child/seg_eyes.glb index 99a236a87..9f7cd4fb6 100644 Binary files a/client/assets/characters/bodies/child/seg_eyes.glb and b/client/assets/characters/bodies/child/seg_eyes.glb differ diff --git a/client/assets/characters/bodies/child/seg_foot_l.glb b/client/assets/characters/bodies/child/seg_foot_l.glb index 70c4ad747..f36fb2fa4 100644 Binary files a/client/assets/characters/bodies/child/seg_foot_l.glb and b/client/assets/characters/bodies/child/seg_foot_l.glb differ diff --git a/client/assets/characters/bodies/child/seg_foot_r.glb b/client/assets/characters/bodies/child/seg_foot_r.glb index 8177efd69..b26baca20 100644 Binary files a/client/assets/characters/bodies/child/seg_foot_r.glb and b/client/assets/characters/bodies/child/seg_foot_r.glb differ diff --git a/client/assets/characters/bodies/child/seg_hand_l.glb b/client/assets/characters/bodies/child/seg_hand_l.glb index 864443088..8ca065234 100644 Binary files a/client/assets/characters/bodies/child/seg_hand_l.glb and b/client/assets/characters/bodies/child/seg_hand_l.glb differ diff --git a/client/assets/characters/bodies/child/seg_hand_r.glb b/client/assets/characters/bodies/child/seg_hand_r.glb index adf4adb96..e79264e25 100644 Binary files a/client/assets/characters/bodies/child/seg_hand_r.glb and b/client/assets/characters/bodies/child/seg_hand_r.glb differ diff --git a/client/assets/characters/bodies/child/seg_head.glb b/client/assets/characters/bodies/child/seg_head.glb index 307bcbd3e..3e8a89096 100644 Binary files a/client/assets/characters/bodies/child/seg_head.glb and b/client/assets/characters/bodies/child/seg_head.glb differ diff --git a/client/assets/characters/bodies/child/seg_hips.glb b/client/assets/characters/bodies/child/seg_hips.glb index 3a375afa7..ed17c2567 100644 Binary files a/client/assets/characters/bodies/child/seg_hips.glb and b/client/assets/characters/bodies/child/seg_hips.glb differ diff --git a/client/assets/characters/bodies/child/seg_leg_lower_l.glb b/client/assets/characters/bodies/child/seg_leg_lower_l.glb index 5eab73a25..9987ff31a 100644 Binary files a/client/assets/characters/bodies/child/seg_leg_lower_l.glb and b/client/assets/characters/bodies/child/seg_leg_lower_l.glb differ diff --git a/client/assets/characters/bodies/child/seg_leg_lower_r.glb b/client/assets/characters/bodies/child/seg_leg_lower_r.glb index 974e7f7a3..71d44e24a 100644 Binary files a/client/assets/characters/bodies/child/seg_leg_lower_r.glb and b/client/assets/characters/bodies/child/seg_leg_lower_r.glb differ diff --git a/client/assets/characters/bodies/child/seg_leg_upper_l.glb b/client/assets/characters/bodies/child/seg_leg_upper_l.glb index a9fe41163..78b8ba7f5 100644 Binary files a/client/assets/characters/bodies/child/seg_leg_upper_l.glb and b/client/assets/characters/bodies/child/seg_leg_upper_l.glb differ diff --git a/client/assets/characters/bodies/child/seg_leg_upper_r.glb b/client/assets/characters/bodies/child/seg_leg_upper_r.glb index c1ee9a073..d384e3a76 100644 Binary files a/client/assets/characters/bodies/child/seg_leg_upper_r.glb and b/client/assets/characters/bodies/child/seg_leg_upper_r.glb differ diff --git a/client/assets/characters/bodies/child/seg_neck.glb b/client/assets/characters/bodies/child/seg_neck.glb index 60079c094..2917ec0b5 100644 Binary files a/client/assets/characters/bodies/child/seg_neck.glb and b/client/assets/characters/bodies/child/seg_neck.glb differ diff --git a/client/assets/characters/bodies/child/seg_torso.glb b/client/assets/characters/bodies/child/seg_torso.glb index d21ef6852..fef1a8576 100644 Binary files a/client/assets/characters/bodies/child/seg_torso.glb and b/client/assets/characters/bodies/child/seg_torso.glb differ diff --git a/client/assets/characters/bodies/child/seg_torso_upper.glb b/client/assets/characters/bodies/child/seg_torso_upper.glb index eeff75b76..342dfd669 100644 Binary files a/client/assets/characters/bodies/child/seg_torso_upper.glb and b/client/assets/characters/bodies/child/seg_torso_upper.glb differ diff --git a/client/assets/characters/bodies/heavy_f/README.md b/client/assets/characters/bodies/heavy_f/README.md index 6f8f19eba..52e92519b 100644 --- a/client/assets/characters/bodies/heavy_f/README.md +++ b/client/assets/characters/bodies/heavy_f/README.md @@ -1,13 +1,19 @@ -# Fork body type — auto-generated from mesh scaling +# Fork body type — auto-generated from mesh + armature scaling (T-1090) -This directory contains **heavy_f** body segments, generated by applying -a proportional mesh scale to the source body (Regular_Female_FullBody.gltf): +This directory contains **heavy_f** body segments, generated by applying a +proportional scale to the source body (Regular_Female_FullBody.gltf) mesh AND its armature rest pose +together, then segmenting: Scale: (1.20, 1.08, 1.00) -These segments are APPROXIMATE. They produce a visually distinct silhouette -but are not artist-authored from scratch. Review the proportions and refine -the base mesh manually if the auto-scale result is not satisfactory. +The scale is applied to the mesh vertices and the embedded armature rest pose +with the SAME affine (T-1090 fix). This keeps each segment internally consistent +with its own skeleton, which the shared-skeleton compositor +(character_visual.gd) requires — a mesh-only scale detaches the head and +explodes the limbs on relocation. -Status: auto-generated, needs artist review -Sprint 28 — visual team +Cross-sectional differentiation (thin = narrow, heavy = wide) survives the +composite; global height normalises to the shared skeleton (see T-1090 report / +Q-060 for the shared-skeleton scale-normalisation note). + +Status: auto-generated (rebuilt T-1090), 18 segments incl. seg_hips diff --git a/client/assets/characters/bodies/heavy_f/seg_arm_lower_l.glb b/client/assets/characters/bodies/heavy_f/seg_arm_lower_l.glb index 0e5722fe6..fe2808c5b 100644 Binary files a/client/assets/characters/bodies/heavy_f/seg_arm_lower_l.glb and b/client/assets/characters/bodies/heavy_f/seg_arm_lower_l.glb differ diff --git a/client/assets/characters/bodies/heavy_f/seg_arm_lower_r.glb b/client/assets/characters/bodies/heavy_f/seg_arm_lower_r.glb index a2478c6d6..899ff0024 100644 Binary files a/client/assets/characters/bodies/heavy_f/seg_arm_lower_r.glb and b/client/assets/characters/bodies/heavy_f/seg_arm_lower_r.glb differ diff --git a/client/assets/characters/bodies/heavy_f/seg_arm_upper_l.glb b/client/assets/characters/bodies/heavy_f/seg_arm_upper_l.glb index 6af1b83c3..3356d4154 100644 Binary files a/client/assets/characters/bodies/heavy_f/seg_arm_upper_l.glb and b/client/assets/characters/bodies/heavy_f/seg_arm_upper_l.glb differ diff --git a/client/assets/characters/bodies/heavy_f/seg_arm_upper_r.glb b/client/assets/characters/bodies/heavy_f/seg_arm_upper_r.glb index 973d852b5..056826080 100644 Binary files a/client/assets/characters/bodies/heavy_f/seg_arm_upper_r.glb and b/client/assets/characters/bodies/heavy_f/seg_arm_upper_r.glb differ diff --git a/client/assets/characters/bodies/heavy_f/seg_eyebrows.glb b/client/assets/characters/bodies/heavy_f/seg_eyebrows.glb index f4fdda131..e7ea6d599 100644 Binary files a/client/assets/characters/bodies/heavy_f/seg_eyebrows.glb and b/client/assets/characters/bodies/heavy_f/seg_eyebrows.glb differ diff --git a/client/assets/characters/bodies/heavy_f/seg_eyes.glb b/client/assets/characters/bodies/heavy_f/seg_eyes.glb index 374a7ea40..df2273eb2 100644 Binary files a/client/assets/characters/bodies/heavy_f/seg_eyes.glb and b/client/assets/characters/bodies/heavy_f/seg_eyes.glb differ diff --git a/client/assets/characters/bodies/heavy_f/seg_foot_l.glb b/client/assets/characters/bodies/heavy_f/seg_foot_l.glb index b2e3161ed..595b5eb21 100644 Binary files a/client/assets/characters/bodies/heavy_f/seg_foot_l.glb and b/client/assets/characters/bodies/heavy_f/seg_foot_l.glb differ diff --git a/client/assets/characters/bodies/heavy_f/seg_foot_r.glb b/client/assets/characters/bodies/heavy_f/seg_foot_r.glb index 37ffe639c..99b758f57 100644 Binary files a/client/assets/characters/bodies/heavy_f/seg_foot_r.glb and b/client/assets/characters/bodies/heavy_f/seg_foot_r.glb differ diff --git a/client/assets/characters/bodies/heavy_f/seg_hand_l.glb b/client/assets/characters/bodies/heavy_f/seg_hand_l.glb index 0f8efba1f..8f13fbf51 100644 Binary files a/client/assets/characters/bodies/heavy_f/seg_hand_l.glb and b/client/assets/characters/bodies/heavy_f/seg_hand_l.glb differ diff --git a/client/assets/characters/bodies/heavy_f/seg_hand_r.glb b/client/assets/characters/bodies/heavy_f/seg_hand_r.glb index 50e5f83f8..83cf8d303 100644 Binary files a/client/assets/characters/bodies/heavy_f/seg_hand_r.glb and b/client/assets/characters/bodies/heavy_f/seg_hand_r.glb differ diff --git a/client/assets/characters/bodies/heavy_f/seg_head.glb b/client/assets/characters/bodies/heavy_f/seg_head.glb index 18905a1a2..e50ac828a 100644 Binary files a/client/assets/characters/bodies/heavy_f/seg_head.glb and b/client/assets/characters/bodies/heavy_f/seg_head.glb differ diff --git a/client/assets/characters/bodies/heavy_f/seg_hips.glb b/client/assets/characters/bodies/heavy_f/seg_hips.glb new file mode 100644 index 000000000..93d5623a0 Binary files /dev/null and b/client/assets/characters/bodies/heavy_f/seg_hips.glb differ diff --git a/client/assets/characters/bodies/heavy_f/seg_hips_T_Regular_Female_Dark_BaseColor_png.png b/client/assets/characters/bodies/heavy_f/seg_hips_T_Regular_Female_Dark_BaseColor_png.png new file mode 100644 index 000000000..4b9758204 Binary files /dev/null and b/client/assets/characters/bodies/heavy_f/seg_hips_T_Regular_Female_Dark_BaseColor_png.png differ diff --git a/client/assets/characters/bodies/heavy_f/seg_hips_T_Regular_Female_Normal_png.png b/client/assets/characters/bodies/heavy_f/seg_hips_T_Regular_Female_Normal_png.png new file mode 100644 index 000000000..f452ce11e Binary files /dev/null and b/client/assets/characters/bodies/heavy_f/seg_hips_T_Regular_Female_Normal_png.png differ diff --git a/client/assets/characters/bodies/heavy_f/seg_hips_T_Regular_Female_Roughness_png.png b/client/assets/characters/bodies/heavy_f/seg_hips_T_Regular_Female_Roughness_png.png new file mode 100644 index 000000000..8dae8d598 Binary files /dev/null and b/client/assets/characters/bodies/heavy_f/seg_hips_T_Regular_Female_Roughness_png.png differ diff --git a/client/assets/characters/bodies/heavy_f/seg_leg_lower_l.glb b/client/assets/characters/bodies/heavy_f/seg_leg_lower_l.glb index 0a674e92b..f49eb1464 100644 Binary files a/client/assets/characters/bodies/heavy_f/seg_leg_lower_l.glb and b/client/assets/characters/bodies/heavy_f/seg_leg_lower_l.glb differ diff --git a/client/assets/characters/bodies/heavy_f/seg_leg_lower_r.glb b/client/assets/characters/bodies/heavy_f/seg_leg_lower_r.glb index 2d8159c69..b695056ba 100644 Binary files a/client/assets/characters/bodies/heavy_f/seg_leg_lower_r.glb and b/client/assets/characters/bodies/heavy_f/seg_leg_lower_r.glb differ diff --git a/client/assets/characters/bodies/heavy_f/seg_leg_upper_l.glb b/client/assets/characters/bodies/heavy_f/seg_leg_upper_l.glb index eab165310..8a295413c 100644 Binary files a/client/assets/characters/bodies/heavy_f/seg_leg_upper_l.glb and b/client/assets/characters/bodies/heavy_f/seg_leg_upper_l.glb differ diff --git a/client/assets/characters/bodies/heavy_f/seg_leg_upper_r.glb b/client/assets/characters/bodies/heavy_f/seg_leg_upper_r.glb index 7b58a62be..8bc093256 100644 Binary files a/client/assets/characters/bodies/heavy_f/seg_leg_upper_r.glb and b/client/assets/characters/bodies/heavy_f/seg_leg_upper_r.glb differ diff --git a/client/assets/characters/bodies/heavy_f/seg_neck.glb b/client/assets/characters/bodies/heavy_f/seg_neck.glb index 1561824ab..7e8d28bb2 100644 Binary files a/client/assets/characters/bodies/heavy_f/seg_neck.glb and b/client/assets/characters/bodies/heavy_f/seg_neck.glb differ diff --git a/client/assets/characters/bodies/heavy_f/seg_torso.glb b/client/assets/characters/bodies/heavy_f/seg_torso.glb index 84fd927b1..413085954 100644 Binary files a/client/assets/characters/bodies/heavy_f/seg_torso.glb and b/client/assets/characters/bodies/heavy_f/seg_torso.glb differ diff --git a/client/assets/characters/bodies/heavy_f/seg_torso_upper.glb b/client/assets/characters/bodies/heavy_f/seg_torso_upper.glb index 04a0748bd..974a5e8c7 100644 Binary files a/client/assets/characters/bodies/heavy_f/seg_torso_upper.glb and b/client/assets/characters/bodies/heavy_f/seg_torso_upper.glb differ diff --git a/client/assets/characters/bodies/heavy_m/README.md b/client/assets/characters/bodies/heavy_m/README.md index c3de3956d..9087edbd8 100644 --- a/client/assets/characters/bodies/heavy_m/README.md +++ b/client/assets/characters/bodies/heavy_m/README.md @@ -1,13 +1,19 @@ -# Fork body type — auto-generated from mesh scaling +# Fork body type — auto-generated from mesh + armature scaling (T-1090) -This directory contains **heavy_m** body segments, generated by applying -a proportional mesh scale to the source body (Regular_Male_FullBody.gltf): +This directory contains **heavy_m** body segments, generated by applying a +proportional scale to the source body (Regular_Male_FullBody.gltf) mesh AND its armature rest pose +together, then segmenting: Scale: (1.20, 1.08, 1.00) -These segments are APPROXIMATE. They produce a visually distinct silhouette -but are not artist-authored from scratch. Review the proportions and refine -the base mesh manually if the auto-scale result is not satisfactory. +The scale is applied to the mesh vertices and the embedded armature rest pose +with the SAME affine (T-1090 fix). This keeps each segment internally consistent +with its own skeleton, which the shared-skeleton compositor +(character_visual.gd) requires — a mesh-only scale detaches the head and +explodes the limbs on relocation. -Status: auto-generated, needs artist review -Sprint 28 — visual team +Cross-sectional differentiation (thin = narrow, heavy = wide) survives the +composite; global height normalises to the shared skeleton (see T-1090 report / +Q-060 for the shared-skeleton scale-normalisation note). + +Status: auto-generated (rebuilt T-1090), 18 segments incl. seg_hips diff --git a/client/assets/characters/bodies/heavy_m/seg_arm_lower_l.glb b/client/assets/characters/bodies/heavy_m/seg_arm_lower_l.glb index 63f0e5069..6b60dbab6 100644 Binary files a/client/assets/characters/bodies/heavy_m/seg_arm_lower_l.glb and b/client/assets/characters/bodies/heavy_m/seg_arm_lower_l.glb differ diff --git a/client/assets/characters/bodies/heavy_m/seg_arm_lower_r.glb b/client/assets/characters/bodies/heavy_m/seg_arm_lower_r.glb index b4c80c2c8..eccf9deee 100644 Binary files a/client/assets/characters/bodies/heavy_m/seg_arm_lower_r.glb and b/client/assets/characters/bodies/heavy_m/seg_arm_lower_r.glb differ diff --git a/client/assets/characters/bodies/heavy_m/seg_arm_upper_l.glb b/client/assets/characters/bodies/heavy_m/seg_arm_upper_l.glb index e60da6c25..1f7df8f46 100644 Binary files a/client/assets/characters/bodies/heavy_m/seg_arm_upper_l.glb and b/client/assets/characters/bodies/heavy_m/seg_arm_upper_l.glb differ diff --git a/client/assets/characters/bodies/heavy_m/seg_arm_upper_r.glb b/client/assets/characters/bodies/heavy_m/seg_arm_upper_r.glb index 8fea07c9f..6b573b2b9 100644 Binary files a/client/assets/characters/bodies/heavy_m/seg_arm_upper_r.glb and b/client/assets/characters/bodies/heavy_m/seg_arm_upper_r.glb differ diff --git a/client/assets/characters/bodies/heavy_m/seg_eyebrows.glb b/client/assets/characters/bodies/heavy_m/seg_eyebrows.glb index 63c028e6a..48b93084c 100644 Binary files a/client/assets/characters/bodies/heavy_m/seg_eyebrows.glb and b/client/assets/characters/bodies/heavy_m/seg_eyebrows.glb differ diff --git a/client/assets/characters/bodies/heavy_m/seg_eyes.glb b/client/assets/characters/bodies/heavy_m/seg_eyes.glb index f78074429..4952081f8 100644 Binary files a/client/assets/characters/bodies/heavy_m/seg_eyes.glb and b/client/assets/characters/bodies/heavy_m/seg_eyes.glb differ diff --git a/client/assets/characters/bodies/heavy_m/seg_foot_l.glb b/client/assets/characters/bodies/heavy_m/seg_foot_l.glb index 450df680c..23a1889cb 100644 Binary files a/client/assets/characters/bodies/heavy_m/seg_foot_l.glb and b/client/assets/characters/bodies/heavy_m/seg_foot_l.glb differ diff --git a/client/assets/characters/bodies/heavy_m/seg_foot_r.glb b/client/assets/characters/bodies/heavy_m/seg_foot_r.glb index a50ecfdfd..ca147622f 100644 Binary files a/client/assets/characters/bodies/heavy_m/seg_foot_r.glb and b/client/assets/characters/bodies/heavy_m/seg_foot_r.glb differ diff --git a/client/assets/characters/bodies/heavy_m/seg_hand_l.glb b/client/assets/characters/bodies/heavy_m/seg_hand_l.glb index 87d82b422..32f18fb2d 100644 Binary files a/client/assets/characters/bodies/heavy_m/seg_hand_l.glb and b/client/assets/characters/bodies/heavy_m/seg_hand_l.glb differ diff --git a/client/assets/characters/bodies/heavy_m/seg_hand_r.glb b/client/assets/characters/bodies/heavy_m/seg_hand_r.glb index b2ba52815..e94433abb 100644 Binary files a/client/assets/characters/bodies/heavy_m/seg_hand_r.glb and b/client/assets/characters/bodies/heavy_m/seg_hand_r.glb differ diff --git a/client/assets/characters/bodies/heavy_m/seg_head.glb b/client/assets/characters/bodies/heavy_m/seg_head.glb index 5afacc64a..d425547aa 100644 Binary files a/client/assets/characters/bodies/heavy_m/seg_head.glb and b/client/assets/characters/bodies/heavy_m/seg_head.glb differ diff --git a/client/assets/characters/bodies/heavy_m/seg_hips.glb b/client/assets/characters/bodies/heavy_m/seg_hips.glb new file mode 100644 index 000000000..57456dafb Binary files /dev/null and b/client/assets/characters/bodies/heavy_m/seg_hips.glb differ diff --git a/client/assets/characters/bodies/heavy_m/seg_hips_T_Regular_Male_Dark_BaseColor_png.png b/client/assets/characters/bodies/heavy_m/seg_hips_T_Regular_Male_Dark_BaseColor_png.png new file mode 100644 index 000000000..4520f4cc2 Binary files /dev/null and b/client/assets/characters/bodies/heavy_m/seg_hips_T_Regular_Male_Dark_BaseColor_png.png differ diff --git a/client/assets/characters/bodies/heavy_m/seg_hips_T_Regular_Male_Normal_png.png b/client/assets/characters/bodies/heavy_m/seg_hips_T_Regular_Male_Normal_png.png new file mode 100644 index 000000000..705c2f2f2 Binary files /dev/null and b/client/assets/characters/bodies/heavy_m/seg_hips_T_Regular_Male_Normal_png.png differ diff --git a/client/assets/characters/bodies/heavy_m/seg_hips_T_Regular_Male_Roughness_png.png b/client/assets/characters/bodies/heavy_m/seg_hips_T_Regular_Male_Roughness_png.png new file mode 100644 index 000000000..3979c3ed3 Binary files /dev/null and b/client/assets/characters/bodies/heavy_m/seg_hips_T_Regular_Male_Roughness_png.png differ diff --git a/client/assets/characters/bodies/heavy_m/seg_leg_lower_l.glb b/client/assets/characters/bodies/heavy_m/seg_leg_lower_l.glb index 272039cd9..dfb8aac6c 100644 Binary files a/client/assets/characters/bodies/heavy_m/seg_leg_lower_l.glb and b/client/assets/characters/bodies/heavy_m/seg_leg_lower_l.glb differ diff --git a/client/assets/characters/bodies/heavy_m/seg_leg_lower_r.glb b/client/assets/characters/bodies/heavy_m/seg_leg_lower_r.glb index 444de9929..c7b75e630 100644 Binary files a/client/assets/characters/bodies/heavy_m/seg_leg_lower_r.glb and b/client/assets/characters/bodies/heavy_m/seg_leg_lower_r.glb differ diff --git a/client/assets/characters/bodies/heavy_m/seg_leg_upper_l.glb b/client/assets/characters/bodies/heavy_m/seg_leg_upper_l.glb index aa44047be..ea6161c7d 100644 Binary files a/client/assets/characters/bodies/heavy_m/seg_leg_upper_l.glb and b/client/assets/characters/bodies/heavy_m/seg_leg_upper_l.glb differ diff --git a/client/assets/characters/bodies/heavy_m/seg_leg_upper_r.glb b/client/assets/characters/bodies/heavy_m/seg_leg_upper_r.glb index db2c981da..dfa18a75f 100644 Binary files a/client/assets/characters/bodies/heavy_m/seg_leg_upper_r.glb and b/client/assets/characters/bodies/heavy_m/seg_leg_upper_r.glb differ diff --git a/client/assets/characters/bodies/heavy_m/seg_neck.glb b/client/assets/characters/bodies/heavy_m/seg_neck.glb index b4f58a051..2f5070d7f 100644 Binary files a/client/assets/characters/bodies/heavy_m/seg_neck.glb and b/client/assets/characters/bodies/heavy_m/seg_neck.glb differ diff --git a/client/assets/characters/bodies/heavy_m/seg_torso.glb b/client/assets/characters/bodies/heavy_m/seg_torso.glb index b51732f01..671dcca9c 100644 Binary files a/client/assets/characters/bodies/heavy_m/seg_torso.glb and b/client/assets/characters/bodies/heavy_m/seg_torso.glb differ diff --git a/client/assets/characters/bodies/heavy_m/seg_torso_upper.glb b/client/assets/characters/bodies/heavy_m/seg_torso_upper.glb index d441bf317..9761726e0 100644 Binary files a/client/assets/characters/bodies/heavy_m/seg_torso_upper.glb and b/client/assets/characters/bodies/heavy_m/seg_torso_upper.glb differ diff --git a/client/assets/characters/bodies/thin_f/README.md b/client/assets/characters/bodies/thin_f/README.md index 419ac0653..a23b5ad55 100644 --- a/client/assets/characters/bodies/thin_f/README.md +++ b/client/assets/characters/bodies/thin_f/README.md @@ -1,13 +1,19 @@ -# Fork body type — auto-generated from mesh scaling +# Fork body type — auto-generated from mesh + armature scaling (T-1090) -This directory contains **thin_f** body segments, generated by applying -a proportional mesh scale to the source body (Regular_Female_FullBody.gltf): +This directory contains **thin_f** body segments, generated by applying a +proportional scale to the source body (Regular_Female_FullBody.gltf) mesh AND its armature rest pose +together, then segmenting: Scale: (0.82, 1.00, 0.88) -These segments are APPROXIMATE. They produce a visually distinct silhouette -but are not artist-authored from scratch. Review the proportions and refine -the base mesh manually if the auto-scale result is not satisfactory. +The scale is applied to the mesh vertices and the embedded armature rest pose +with the SAME affine (T-1090 fix). This keeps each segment internally consistent +with its own skeleton, which the shared-skeleton compositor +(character_visual.gd) requires — a mesh-only scale detaches the head and +explodes the limbs on relocation. -Status: auto-generated, needs artist review -Sprint 28 — visual team +Cross-sectional differentiation (thin = narrow, heavy = wide) survives the +composite; global height normalises to the shared skeleton (see T-1090 report / +Q-060 for the shared-skeleton scale-normalisation note). + +Status: auto-generated (rebuilt T-1090), 18 segments incl. seg_hips diff --git a/client/assets/characters/bodies/thin_f/seg_arm_lower_l.glb b/client/assets/characters/bodies/thin_f/seg_arm_lower_l.glb index 80b409f2d..0ab6747a6 100644 Binary files a/client/assets/characters/bodies/thin_f/seg_arm_lower_l.glb and b/client/assets/characters/bodies/thin_f/seg_arm_lower_l.glb differ diff --git a/client/assets/characters/bodies/thin_f/seg_arm_lower_r.glb b/client/assets/characters/bodies/thin_f/seg_arm_lower_r.glb index a301624f1..2870f2bfa 100644 Binary files a/client/assets/characters/bodies/thin_f/seg_arm_lower_r.glb and b/client/assets/characters/bodies/thin_f/seg_arm_lower_r.glb differ diff --git a/client/assets/characters/bodies/thin_f/seg_arm_upper_l.glb b/client/assets/characters/bodies/thin_f/seg_arm_upper_l.glb index 5a50712ad..352751e22 100644 Binary files a/client/assets/characters/bodies/thin_f/seg_arm_upper_l.glb and b/client/assets/characters/bodies/thin_f/seg_arm_upper_l.glb differ diff --git a/client/assets/characters/bodies/thin_f/seg_arm_upper_r.glb b/client/assets/characters/bodies/thin_f/seg_arm_upper_r.glb index 457b11a0e..081d42e44 100644 Binary files a/client/assets/characters/bodies/thin_f/seg_arm_upper_r.glb and b/client/assets/characters/bodies/thin_f/seg_arm_upper_r.glb differ diff --git a/client/assets/characters/bodies/thin_f/seg_eyebrows.glb b/client/assets/characters/bodies/thin_f/seg_eyebrows.glb index d81247962..6ab6b52e3 100644 Binary files a/client/assets/characters/bodies/thin_f/seg_eyebrows.glb and b/client/assets/characters/bodies/thin_f/seg_eyebrows.glb differ diff --git a/client/assets/characters/bodies/thin_f/seg_eyes.glb b/client/assets/characters/bodies/thin_f/seg_eyes.glb index e88e9b8a6..f1628dc80 100644 Binary files a/client/assets/characters/bodies/thin_f/seg_eyes.glb and b/client/assets/characters/bodies/thin_f/seg_eyes.glb differ diff --git a/client/assets/characters/bodies/thin_f/seg_foot_l.glb b/client/assets/characters/bodies/thin_f/seg_foot_l.glb index 6d4837fcf..a0e905aba 100644 Binary files a/client/assets/characters/bodies/thin_f/seg_foot_l.glb and b/client/assets/characters/bodies/thin_f/seg_foot_l.glb differ diff --git a/client/assets/characters/bodies/thin_f/seg_foot_r.glb b/client/assets/characters/bodies/thin_f/seg_foot_r.glb index 86717ebbe..adf0d6cee 100644 Binary files a/client/assets/characters/bodies/thin_f/seg_foot_r.glb and b/client/assets/characters/bodies/thin_f/seg_foot_r.glb differ diff --git a/client/assets/characters/bodies/thin_f/seg_hand_l.glb b/client/assets/characters/bodies/thin_f/seg_hand_l.glb index 3d2d7926d..1033791df 100644 Binary files a/client/assets/characters/bodies/thin_f/seg_hand_l.glb and b/client/assets/characters/bodies/thin_f/seg_hand_l.glb differ diff --git a/client/assets/characters/bodies/thin_f/seg_hand_r.glb b/client/assets/characters/bodies/thin_f/seg_hand_r.glb index 057a69ea3..5f740f5d2 100644 Binary files a/client/assets/characters/bodies/thin_f/seg_hand_r.glb and b/client/assets/characters/bodies/thin_f/seg_hand_r.glb differ diff --git a/client/assets/characters/bodies/thin_f/seg_head.glb b/client/assets/characters/bodies/thin_f/seg_head.glb index 5ce4af522..e22e6768f 100644 Binary files a/client/assets/characters/bodies/thin_f/seg_head.glb and b/client/assets/characters/bodies/thin_f/seg_head.glb differ diff --git a/client/assets/characters/bodies/thin_f/seg_hips.glb b/client/assets/characters/bodies/thin_f/seg_hips.glb new file mode 100644 index 000000000..a50f3206a Binary files /dev/null and b/client/assets/characters/bodies/thin_f/seg_hips.glb differ diff --git a/client/assets/characters/bodies/thin_f/seg_hips_T_Regular_Female_Dark_BaseColor_png.png b/client/assets/characters/bodies/thin_f/seg_hips_T_Regular_Female_Dark_BaseColor_png.png new file mode 100644 index 000000000..4b9758204 Binary files /dev/null and b/client/assets/characters/bodies/thin_f/seg_hips_T_Regular_Female_Dark_BaseColor_png.png differ diff --git a/client/assets/characters/bodies/thin_f/seg_hips_T_Regular_Female_Normal_png.png b/client/assets/characters/bodies/thin_f/seg_hips_T_Regular_Female_Normal_png.png new file mode 100644 index 000000000..f452ce11e Binary files /dev/null and b/client/assets/characters/bodies/thin_f/seg_hips_T_Regular_Female_Normal_png.png differ diff --git a/client/assets/characters/bodies/thin_f/seg_hips_T_Regular_Female_Roughness_png.png b/client/assets/characters/bodies/thin_f/seg_hips_T_Regular_Female_Roughness_png.png new file mode 100644 index 000000000..8dae8d598 Binary files /dev/null and b/client/assets/characters/bodies/thin_f/seg_hips_T_Regular_Female_Roughness_png.png differ diff --git a/client/assets/characters/bodies/thin_f/seg_leg_lower_l.glb b/client/assets/characters/bodies/thin_f/seg_leg_lower_l.glb index ee50b4f36..453213b6a 100644 Binary files a/client/assets/characters/bodies/thin_f/seg_leg_lower_l.glb and b/client/assets/characters/bodies/thin_f/seg_leg_lower_l.glb differ diff --git a/client/assets/characters/bodies/thin_f/seg_leg_lower_r.glb b/client/assets/characters/bodies/thin_f/seg_leg_lower_r.glb index 87489d17b..463542d9c 100644 Binary files a/client/assets/characters/bodies/thin_f/seg_leg_lower_r.glb and b/client/assets/characters/bodies/thin_f/seg_leg_lower_r.glb differ diff --git a/client/assets/characters/bodies/thin_f/seg_leg_upper_l.glb b/client/assets/characters/bodies/thin_f/seg_leg_upper_l.glb index fae54a483..55878a59e 100644 Binary files a/client/assets/characters/bodies/thin_f/seg_leg_upper_l.glb and b/client/assets/characters/bodies/thin_f/seg_leg_upper_l.glb differ diff --git a/client/assets/characters/bodies/thin_f/seg_leg_upper_r.glb b/client/assets/characters/bodies/thin_f/seg_leg_upper_r.glb index a5ef6a4e9..266a8a969 100644 Binary files a/client/assets/characters/bodies/thin_f/seg_leg_upper_r.glb and b/client/assets/characters/bodies/thin_f/seg_leg_upper_r.glb differ diff --git a/client/assets/characters/bodies/thin_f/seg_neck.glb b/client/assets/characters/bodies/thin_f/seg_neck.glb index da1a64f01..bb0984acd 100644 Binary files a/client/assets/characters/bodies/thin_f/seg_neck.glb and b/client/assets/characters/bodies/thin_f/seg_neck.glb differ diff --git a/client/assets/characters/bodies/thin_f/seg_torso.glb b/client/assets/characters/bodies/thin_f/seg_torso.glb index b0e4b495d..67becdb5f 100644 Binary files a/client/assets/characters/bodies/thin_f/seg_torso.glb and b/client/assets/characters/bodies/thin_f/seg_torso.glb differ diff --git a/client/assets/characters/bodies/thin_f/seg_torso_upper.glb b/client/assets/characters/bodies/thin_f/seg_torso_upper.glb index 4ec153d95..f6dd37e71 100644 Binary files a/client/assets/characters/bodies/thin_f/seg_torso_upper.glb and b/client/assets/characters/bodies/thin_f/seg_torso_upper.glb differ diff --git a/client/assets/characters/bodies/thin_m/README.md b/client/assets/characters/bodies/thin_m/README.md index 02d18f4d8..85396dca6 100644 --- a/client/assets/characters/bodies/thin_m/README.md +++ b/client/assets/characters/bodies/thin_m/README.md @@ -1,13 +1,19 @@ -# Fork body type — auto-generated from mesh scaling +# Fork body type — auto-generated from mesh + armature scaling (T-1090) -This directory contains **thin_m** body segments, generated by applying -a proportional mesh scale to the source body (Regular_Male_FullBody.gltf): +This directory contains **thin_m** body segments, generated by applying a +proportional scale to the source body (Regular_Male_FullBody.gltf) mesh AND its armature rest pose +together, then segmenting: Scale: (0.82, 1.00, 0.88) -These segments are APPROXIMATE. They produce a visually distinct silhouette -but are not artist-authored from scratch. Review the proportions and refine -the base mesh manually if the auto-scale result is not satisfactory. +The scale is applied to the mesh vertices and the embedded armature rest pose +with the SAME affine (T-1090 fix). This keeps each segment internally consistent +with its own skeleton, which the shared-skeleton compositor +(character_visual.gd) requires — a mesh-only scale detaches the head and +explodes the limbs on relocation. -Status: auto-generated, needs artist review -Sprint 28 — visual team +Cross-sectional differentiation (thin = narrow, heavy = wide) survives the +composite; global height normalises to the shared skeleton (see T-1090 report / +Q-060 for the shared-skeleton scale-normalisation note). + +Status: auto-generated (rebuilt T-1090), 18 segments incl. seg_hips diff --git a/client/assets/characters/bodies/thin_m/seg_arm_lower_l.glb b/client/assets/characters/bodies/thin_m/seg_arm_lower_l.glb index 2e5320dc4..c0ab26c7d 100644 Binary files a/client/assets/characters/bodies/thin_m/seg_arm_lower_l.glb and b/client/assets/characters/bodies/thin_m/seg_arm_lower_l.glb differ diff --git a/client/assets/characters/bodies/thin_m/seg_arm_lower_r.glb b/client/assets/characters/bodies/thin_m/seg_arm_lower_r.glb index 599f36023..74381bd62 100644 Binary files a/client/assets/characters/bodies/thin_m/seg_arm_lower_r.glb and b/client/assets/characters/bodies/thin_m/seg_arm_lower_r.glb differ diff --git a/client/assets/characters/bodies/thin_m/seg_arm_upper_l.glb b/client/assets/characters/bodies/thin_m/seg_arm_upper_l.glb index 00d779ef6..acb8edbea 100644 Binary files a/client/assets/characters/bodies/thin_m/seg_arm_upper_l.glb and b/client/assets/characters/bodies/thin_m/seg_arm_upper_l.glb differ diff --git a/client/assets/characters/bodies/thin_m/seg_arm_upper_r.glb b/client/assets/characters/bodies/thin_m/seg_arm_upper_r.glb index 2f4b999ed..a66062616 100644 Binary files a/client/assets/characters/bodies/thin_m/seg_arm_upper_r.glb and b/client/assets/characters/bodies/thin_m/seg_arm_upper_r.glb differ diff --git a/client/assets/characters/bodies/thin_m/seg_eyebrows.glb b/client/assets/characters/bodies/thin_m/seg_eyebrows.glb index ce605d949..df014b4c6 100644 Binary files a/client/assets/characters/bodies/thin_m/seg_eyebrows.glb and b/client/assets/characters/bodies/thin_m/seg_eyebrows.glb differ diff --git a/client/assets/characters/bodies/thin_m/seg_eyes.glb b/client/assets/characters/bodies/thin_m/seg_eyes.glb index 51cd7c7f4..6cb6886b2 100644 Binary files a/client/assets/characters/bodies/thin_m/seg_eyes.glb and b/client/assets/characters/bodies/thin_m/seg_eyes.glb differ diff --git a/client/assets/characters/bodies/thin_m/seg_foot_l.glb b/client/assets/characters/bodies/thin_m/seg_foot_l.glb index f14eeaec9..e27cfb1fa 100644 Binary files a/client/assets/characters/bodies/thin_m/seg_foot_l.glb and b/client/assets/characters/bodies/thin_m/seg_foot_l.glb differ diff --git a/client/assets/characters/bodies/thin_m/seg_foot_r.glb b/client/assets/characters/bodies/thin_m/seg_foot_r.glb index e5c9df766..fe196d0a2 100644 Binary files a/client/assets/characters/bodies/thin_m/seg_foot_r.glb and b/client/assets/characters/bodies/thin_m/seg_foot_r.glb differ diff --git a/client/assets/characters/bodies/thin_m/seg_hand_l.glb b/client/assets/characters/bodies/thin_m/seg_hand_l.glb index 221a14b7c..71e1acbac 100644 Binary files a/client/assets/characters/bodies/thin_m/seg_hand_l.glb and b/client/assets/characters/bodies/thin_m/seg_hand_l.glb differ diff --git a/client/assets/characters/bodies/thin_m/seg_hand_r.glb b/client/assets/characters/bodies/thin_m/seg_hand_r.glb index 9b82e068e..0124e0557 100644 Binary files a/client/assets/characters/bodies/thin_m/seg_hand_r.glb and b/client/assets/characters/bodies/thin_m/seg_hand_r.glb differ diff --git a/client/assets/characters/bodies/thin_m/seg_head.glb b/client/assets/characters/bodies/thin_m/seg_head.glb index a9d8b92ea..981157b61 100644 Binary files a/client/assets/characters/bodies/thin_m/seg_head.glb and b/client/assets/characters/bodies/thin_m/seg_head.glb differ diff --git a/client/assets/characters/bodies/thin_m/seg_hips.glb b/client/assets/characters/bodies/thin_m/seg_hips.glb new file mode 100644 index 000000000..015ef3d92 Binary files /dev/null and b/client/assets/characters/bodies/thin_m/seg_hips.glb differ diff --git a/client/assets/characters/bodies/thin_m/seg_hips_T_Regular_Male_Dark_BaseColor_png.png b/client/assets/characters/bodies/thin_m/seg_hips_T_Regular_Male_Dark_BaseColor_png.png new file mode 100644 index 000000000..4520f4cc2 Binary files /dev/null and b/client/assets/characters/bodies/thin_m/seg_hips_T_Regular_Male_Dark_BaseColor_png.png differ diff --git a/client/assets/characters/bodies/thin_m/seg_hips_T_Regular_Male_Normal_png.png b/client/assets/characters/bodies/thin_m/seg_hips_T_Regular_Male_Normal_png.png new file mode 100644 index 000000000..705c2f2f2 Binary files /dev/null and b/client/assets/characters/bodies/thin_m/seg_hips_T_Regular_Male_Normal_png.png differ diff --git a/client/assets/characters/bodies/thin_m/seg_hips_T_Regular_Male_Roughness_png.png b/client/assets/characters/bodies/thin_m/seg_hips_T_Regular_Male_Roughness_png.png new file mode 100644 index 000000000..3979c3ed3 Binary files /dev/null and b/client/assets/characters/bodies/thin_m/seg_hips_T_Regular_Male_Roughness_png.png differ diff --git a/client/assets/characters/bodies/thin_m/seg_leg_lower_l.glb b/client/assets/characters/bodies/thin_m/seg_leg_lower_l.glb index 460fb834a..5a602f90a 100644 Binary files a/client/assets/characters/bodies/thin_m/seg_leg_lower_l.glb and b/client/assets/characters/bodies/thin_m/seg_leg_lower_l.glb differ diff --git a/client/assets/characters/bodies/thin_m/seg_leg_lower_r.glb b/client/assets/characters/bodies/thin_m/seg_leg_lower_r.glb index 00d0d8cbb..43eccafa1 100644 Binary files a/client/assets/characters/bodies/thin_m/seg_leg_lower_r.glb and b/client/assets/characters/bodies/thin_m/seg_leg_lower_r.glb differ diff --git a/client/assets/characters/bodies/thin_m/seg_leg_upper_l.glb b/client/assets/characters/bodies/thin_m/seg_leg_upper_l.glb index 8aa459cda..09f5d2c2c 100644 Binary files a/client/assets/characters/bodies/thin_m/seg_leg_upper_l.glb and b/client/assets/characters/bodies/thin_m/seg_leg_upper_l.glb differ diff --git a/client/assets/characters/bodies/thin_m/seg_leg_upper_r.glb b/client/assets/characters/bodies/thin_m/seg_leg_upper_r.glb index 626465a37..1ee98c786 100644 Binary files a/client/assets/characters/bodies/thin_m/seg_leg_upper_r.glb and b/client/assets/characters/bodies/thin_m/seg_leg_upper_r.glb differ diff --git a/client/assets/characters/bodies/thin_m/seg_neck.glb b/client/assets/characters/bodies/thin_m/seg_neck.glb index 898f9cfc8..f86df1f14 100644 Binary files a/client/assets/characters/bodies/thin_m/seg_neck.glb and b/client/assets/characters/bodies/thin_m/seg_neck.glb differ diff --git a/client/assets/characters/bodies/thin_m/seg_torso.glb b/client/assets/characters/bodies/thin_m/seg_torso.glb index 8ba9dccfe..4a3d8b822 100644 Binary files a/client/assets/characters/bodies/thin_m/seg_torso.glb and b/client/assets/characters/bodies/thin_m/seg_torso.glb differ diff --git a/client/assets/characters/bodies/thin_m/seg_torso_upper.glb b/client/assets/characters/bodies/thin_m/seg_torso_upper.glb index d15f5fc75..33b69f4b5 100644 Binary files a/client/assets/characters/bodies/thin_m/seg_torso_upper.glb and b/client/assets/characters/bodies/thin_m/seg_torso_upper.glb differ diff --git a/client/assets/characters/clothing/peasant_pants/child.glb b/client/assets/characters/clothing/peasant_pants/child.glb new file mode 100644 index 000000000..bce32c1b6 Binary files /dev/null and b/client/assets/characters/clothing/peasant_pants/child.glb differ diff --git a/client/assets/characters/clothing/peasant_pants/child_T_Peasant_BaseColor.png b/client/assets/characters/clothing/peasant_pants/child_T_Peasant_BaseColor.png new file mode 100644 index 000000000..8f1cb9966 Binary files /dev/null and b/client/assets/characters/clothing/peasant_pants/child_T_Peasant_BaseColor.png differ diff --git a/client/assets/characters/clothing/peasant_pants/child_T_Peasant_Normal.png b/client/assets/characters/clothing/peasant_pants/child_T_Peasant_Normal.png new file mode 100644 index 000000000..78498b58b Binary files /dev/null and b/client/assets/characters/clothing/peasant_pants/child_T_Peasant_Normal.png differ diff --git a/client/assets/characters/clothing/peasant_pants/child_T_Peasant_ORM.png b/client/assets/characters/clothing/peasant_pants/child_T_Peasant_ORM.png new file mode 100644 index 000000000..5ce2e1abd Binary files /dev/null and b/client/assets/characters/clothing/peasant_pants/child_T_Peasant_ORM.png differ diff --git a/client/assets/characters/clothing/peasant_pants/heavy_f.glb b/client/assets/characters/clothing/peasant_pants/heavy_f.glb new file mode 100644 index 000000000..da135fd69 Binary files /dev/null and b/client/assets/characters/clothing/peasant_pants/heavy_f.glb differ diff --git a/client/assets/characters/clothing/peasant_pants/heavy_f_T_Peasant_BaseColor.png b/client/assets/characters/clothing/peasant_pants/heavy_f_T_Peasant_BaseColor.png new file mode 100644 index 000000000..8f1cb9966 Binary files /dev/null and b/client/assets/characters/clothing/peasant_pants/heavy_f_T_Peasant_BaseColor.png differ diff --git a/client/assets/characters/clothing/peasant_pants/heavy_f_T_Peasant_Normal.png b/client/assets/characters/clothing/peasant_pants/heavy_f_T_Peasant_Normal.png new file mode 100644 index 000000000..78498b58b Binary files /dev/null and b/client/assets/characters/clothing/peasant_pants/heavy_f_T_Peasant_Normal.png differ diff --git a/client/assets/characters/clothing/peasant_pants/heavy_f_T_Peasant_ORM.png b/client/assets/characters/clothing/peasant_pants/heavy_f_T_Peasant_ORM.png new file mode 100644 index 000000000..5ce2e1abd Binary files /dev/null and b/client/assets/characters/clothing/peasant_pants/heavy_f_T_Peasant_ORM.png differ diff --git a/client/assets/characters/clothing/peasant_pants/heavy_m.glb b/client/assets/characters/clothing/peasant_pants/heavy_m.glb new file mode 100644 index 000000000..54b6a4662 Binary files /dev/null and b/client/assets/characters/clothing/peasant_pants/heavy_m.glb differ diff --git a/client/assets/characters/clothing/peasant_pants/heavy_m_T_Peasant_BaseColor.png b/client/assets/characters/clothing/peasant_pants/heavy_m_T_Peasant_BaseColor.png new file mode 100644 index 000000000..8f1cb9966 Binary files /dev/null and b/client/assets/characters/clothing/peasant_pants/heavy_m_T_Peasant_BaseColor.png differ diff --git a/client/assets/characters/clothing/peasant_pants/heavy_m_T_Peasant_Normal.png b/client/assets/characters/clothing/peasant_pants/heavy_m_T_Peasant_Normal.png new file mode 100644 index 000000000..78498b58b Binary files /dev/null and b/client/assets/characters/clothing/peasant_pants/heavy_m_T_Peasant_Normal.png differ diff --git a/client/assets/characters/clothing/peasant_pants/heavy_m_T_Peasant_ORM.png b/client/assets/characters/clothing/peasant_pants/heavy_m_T_Peasant_ORM.png new file mode 100644 index 000000000..5ce2e1abd Binary files /dev/null and b/client/assets/characters/clothing/peasant_pants/heavy_m_T_Peasant_ORM.png differ diff --git a/client/assets/characters/clothing/peasant_pants/thin_f.glb b/client/assets/characters/clothing/peasant_pants/thin_f.glb new file mode 100644 index 000000000..24287c617 Binary files /dev/null and b/client/assets/characters/clothing/peasant_pants/thin_f.glb differ diff --git a/client/assets/characters/clothing/peasant_pants/thin_f_T_Peasant_BaseColor.png b/client/assets/characters/clothing/peasant_pants/thin_f_T_Peasant_BaseColor.png new file mode 100644 index 000000000..8f1cb9966 Binary files /dev/null and b/client/assets/characters/clothing/peasant_pants/thin_f_T_Peasant_BaseColor.png differ diff --git a/client/assets/characters/clothing/peasant_pants/thin_f_T_Peasant_Normal.png b/client/assets/characters/clothing/peasant_pants/thin_f_T_Peasant_Normal.png new file mode 100644 index 000000000..78498b58b Binary files /dev/null and b/client/assets/characters/clothing/peasant_pants/thin_f_T_Peasant_Normal.png differ diff --git a/client/assets/characters/clothing/peasant_pants/thin_f_T_Peasant_ORM.png b/client/assets/characters/clothing/peasant_pants/thin_f_T_Peasant_ORM.png new file mode 100644 index 000000000..5ce2e1abd Binary files /dev/null and b/client/assets/characters/clothing/peasant_pants/thin_f_T_Peasant_ORM.png differ diff --git a/client/assets/characters/clothing/peasant_pants/thin_m.glb b/client/assets/characters/clothing/peasant_pants/thin_m.glb new file mode 100644 index 000000000..57b569a11 Binary files /dev/null and b/client/assets/characters/clothing/peasant_pants/thin_m.glb differ diff --git a/client/assets/characters/clothing/peasant_pants/thin_m_T_Peasant_BaseColor.png b/client/assets/characters/clothing/peasant_pants/thin_m_T_Peasant_BaseColor.png new file mode 100644 index 000000000..8f1cb9966 Binary files /dev/null and b/client/assets/characters/clothing/peasant_pants/thin_m_T_Peasant_BaseColor.png differ diff --git a/client/assets/characters/clothing/peasant_pants/thin_m_T_Peasant_Normal.png b/client/assets/characters/clothing/peasant_pants/thin_m_T_Peasant_Normal.png new file mode 100644 index 000000000..78498b58b Binary files /dev/null and b/client/assets/characters/clothing/peasant_pants/thin_m_T_Peasant_Normal.png differ diff --git a/client/assets/characters/clothing/peasant_pants/thin_m_T_Peasant_ORM.png b/client/assets/characters/clothing/peasant_pants/thin_m_T_Peasant_ORM.png new file mode 100644 index 000000000..5ce2e1abd Binary files /dev/null and b/client/assets/characters/clothing/peasant_pants/thin_m_T_Peasant_ORM.png differ diff --git a/client/assets/characters/clothing/peasant_shoes/child.glb b/client/assets/characters/clothing/peasant_shoes/child.glb new file mode 100644 index 000000000..e23f03c76 Binary files /dev/null and b/client/assets/characters/clothing/peasant_shoes/child.glb differ diff --git a/client/assets/characters/clothing/peasant_shoes/child_T_Peasant_BaseColor.png b/client/assets/characters/clothing/peasant_shoes/child_T_Peasant_BaseColor.png new file mode 100644 index 000000000..8f1cb9966 Binary files /dev/null and b/client/assets/characters/clothing/peasant_shoes/child_T_Peasant_BaseColor.png differ diff --git a/client/assets/characters/clothing/peasant_shoes/child_T_Peasant_Normal.png b/client/assets/characters/clothing/peasant_shoes/child_T_Peasant_Normal.png new file mode 100644 index 000000000..78498b58b Binary files /dev/null and b/client/assets/characters/clothing/peasant_shoes/child_T_Peasant_Normal.png differ diff --git a/client/assets/characters/clothing/peasant_shoes/child_T_Peasant_ORM.png b/client/assets/characters/clothing/peasant_shoes/child_T_Peasant_ORM.png new file mode 100644 index 000000000..5ce2e1abd Binary files /dev/null and b/client/assets/characters/clothing/peasant_shoes/child_T_Peasant_ORM.png differ diff --git a/client/assets/characters/clothing/peasant_shoes/heavy_f.glb b/client/assets/characters/clothing/peasant_shoes/heavy_f.glb new file mode 100644 index 000000000..cba3d903d Binary files /dev/null and b/client/assets/characters/clothing/peasant_shoes/heavy_f.glb differ diff --git a/client/assets/characters/clothing/peasant_shoes/heavy_f_T_Peasant_BaseColor.png b/client/assets/characters/clothing/peasant_shoes/heavy_f_T_Peasant_BaseColor.png new file mode 100644 index 000000000..8f1cb9966 Binary files /dev/null and b/client/assets/characters/clothing/peasant_shoes/heavy_f_T_Peasant_BaseColor.png differ diff --git a/client/assets/characters/clothing/peasant_shoes/heavy_f_T_Peasant_Normal.png b/client/assets/characters/clothing/peasant_shoes/heavy_f_T_Peasant_Normal.png new file mode 100644 index 000000000..78498b58b Binary files /dev/null and b/client/assets/characters/clothing/peasant_shoes/heavy_f_T_Peasant_Normal.png differ diff --git a/client/assets/characters/clothing/peasant_shoes/heavy_f_T_Peasant_ORM.png b/client/assets/characters/clothing/peasant_shoes/heavy_f_T_Peasant_ORM.png new file mode 100644 index 000000000..5ce2e1abd Binary files /dev/null and b/client/assets/characters/clothing/peasant_shoes/heavy_f_T_Peasant_ORM.png differ diff --git a/client/assets/characters/clothing/peasant_shoes/heavy_m.glb b/client/assets/characters/clothing/peasant_shoes/heavy_m.glb new file mode 100644 index 000000000..04254925d Binary files /dev/null and b/client/assets/characters/clothing/peasant_shoes/heavy_m.glb differ diff --git a/client/assets/characters/clothing/peasant_shoes/heavy_m_T_Peasant_BaseColor.png b/client/assets/characters/clothing/peasant_shoes/heavy_m_T_Peasant_BaseColor.png new file mode 100644 index 000000000..8f1cb9966 Binary files /dev/null and b/client/assets/characters/clothing/peasant_shoes/heavy_m_T_Peasant_BaseColor.png differ diff --git a/client/assets/characters/clothing/peasant_shoes/heavy_m_T_Peasant_Normal.png b/client/assets/characters/clothing/peasant_shoes/heavy_m_T_Peasant_Normal.png new file mode 100644 index 000000000..78498b58b Binary files /dev/null and b/client/assets/characters/clothing/peasant_shoes/heavy_m_T_Peasant_Normal.png differ diff --git a/client/assets/characters/clothing/peasant_shoes/heavy_m_T_Peasant_ORM.png b/client/assets/characters/clothing/peasant_shoes/heavy_m_T_Peasant_ORM.png new file mode 100644 index 000000000..5ce2e1abd Binary files /dev/null and b/client/assets/characters/clothing/peasant_shoes/heavy_m_T_Peasant_ORM.png differ diff --git a/client/assets/characters/clothing/peasant_shoes/thin_f.glb b/client/assets/characters/clothing/peasant_shoes/thin_f.glb new file mode 100644 index 000000000..a348284ce Binary files /dev/null and b/client/assets/characters/clothing/peasant_shoes/thin_f.glb differ diff --git a/client/assets/characters/clothing/peasant_shoes/thin_f_T_Peasant_BaseColor.png b/client/assets/characters/clothing/peasant_shoes/thin_f_T_Peasant_BaseColor.png new file mode 100644 index 000000000..8f1cb9966 Binary files /dev/null and b/client/assets/characters/clothing/peasant_shoes/thin_f_T_Peasant_BaseColor.png differ diff --git a/client/assets/characters/clothing/peasant_shoes/thin_f_T_Peasant_Normal.png b/client/assets/characters/clothing/peasant_shoes/thin_f_T_Peasant_Normal.png new file mode 100644 index 000000000..78498b58b Binary files /dev/null and b/client/assets/characters/clothing/peasant_shoes/thin_f_T_Peasant_Normal.png differ diff --git a/client/assets/characters/clothing/peasant_shoes/thin_f_T_Peasant_ORM.png b/client/assets/characters/clothing/peasant_shoes/thin_f_T_Peasant_ORM.png new file mode 100644 index 000000000..5ce2e1abd Binary files /dev/null and b/client/assets/characters/clothing/peasant_shoes/thin_f_T_Peasant_ORM.png differ diff --git a/client/assets/characters/clothing/peasant_shoes/thin_m.glb b/client/assets/characters/clothing/peasant_shoes/thin_m.glb new file mode 100644 index 000000000..dba541485 Binary files /dev/null and b/client/assets/characters/clothing/peasant_shoes/thin_m.glb differ diff --git a/client/assets/characters/clothing/peasant_shoes/thin_m_T_Peasant_BaseColor.png b/client/assets/characters/clothing/peasant_shoes/thin_m_T_Peasant_BaseColor.png new file mode 100644 index 000000000..8f1cb9966 Binary files /dev/null and b/client/assets/characters/clothing/peasant_shoes/thin_m_T_Peasant_BaseColor.png differ diff --git a/client/assets/characters/clothing/peasant_shoes/thin_m_T_Peasant_Normal.png b/client/assets/characters/clothing/peasant_shoes/thin_m_T_Peasant_Normal.png new file mode 100644 index 000000000..78498b58b Binary files /dev/null and b/client/assets/characters/clothing/peasant_shoes/thin_m_T_Peasant_Normal.png differ diff --git a/client/assets/characters/clothing/peasant_shoes/thin_m_T_Peasant_ORM.png b/client/assets/characters/clothing/peasant_shoes/thin_m_T_Peasant_ORM.png new file mode 100644 index 000000000..5ce2e1abd Binary files /dev/null and b/client/assets/characters/clothing/peasant_shoes/thin_m_T_Peasant_ORM.png differ diff --git a/client/assets/characters/clothing/peasant_tunic/child.glb b/client/assets/characters/clothing/peasant_tunic/child.glb new file mode 100644 index 000000000..03a07350a Binary files /dev/null and b/client/assets/characters/clothing/peasant_tunic/child.glb differ diff --git a/client/assets/characters/clothing/peasant_tunic/child_T_Peasant_BaseColor.png b/client/assets/characters/clothing/peasant_tunic/child_T_Peasant_BaseColor.png new file mode 100644 index 000000000..8f1cb9966 Binary files /dev/null and b/client/assets/characters/clothing/peasant_tunic/child_T_Peasant_BaseColor.png differ diff --git a/client/assets/characters/clothing/peasant_tunic/child_T_Peasant_Normal.png b/client/assets/characters/clothing/peasant_tunic/child_T_Peasant_Normal.png new file mode 100644 index 000000000..78498b58b Binary files /dev/null and b/client/assets/characters/clothing/peasant_tunic/child_T_Peasant_Normal.png differ diff --git a/client/assets/characters/clothing/peasant_tunic/child_T_Peasant_ORM.png b/client/assets/characters/clothing/peasant_tunic/child_T_Peasant_ORM.png new file mode 100644 index 000000000..5ce2e1abd Binary files /dev/null and b/client/assets/characters/clothing/peasant_tunic/child_T_Peasant_ORM.png differ diff --git a/client/assets/characters/clothing/peasant_tunic/heavy_f.glb b/client/assets/characters/clothing/peasant_tunic/heavy_f.glb new file mode 100644 index 000000000..974648147 Binary files /dev/null and b/client/assets/characters/clothing/peasant_tunic/heavy_f.glb differ diff --git a/client/assets/characters/clothing/peasant_tunic/heavy_f_T_Peasant_BaseColor.png b/client/assets/characters/clothing/peasant_tunic/heavy_f_T_Peasant_BaseColor.png new file mode 100644 index 000000000..8f1cb9966 Binary files /dev/null and b/client/assets/characters/clothing/peasant_tunic/heavy_f_T_Peasant_BaseColor.png differ diff --git a/client/assets/characters/clothing/peasant_tunic/heavy_f_T_Peasant_Normal.png b/client/assets/characters/clothing/peasant_tunic/heavy_f_T_Peasant_Normal.png new file mode 100644 index 000000000..78498b58b Binary files /dev/null and b/client/assets/characters/clothing/peasant_tunic/heavy_f_T_Peasant_Normal.png differ diff --git a/client/assets/characters/clothing/peasant_tunic/heavy_f_T_Peasant_ORM.png b/client/assets/characters/clothing/peasant_tunic/heavy_f_T_Peasant_ORM.png new file mode 100644 index 000000000..5ce2e1abd Binary files /dev/null and b/client/assets/characters/clothing/peasant_tunic/heavy_f_T_Peasant_ORM.png differ diff --git a/client/assets/characters/clothing/peasant_tunic/heavy_m.glb b/client/assets/characters/clothing/peasant_tunic/heavy_m.glb new file mode 100644 index 000000000..5ed1e0bad Binary files /dev/null and b/client/assets/characters/clothing/peasant_tunic/heavy_m.glb differ diff --git a/client/assets/characters/clothing/peasant_tunic/heavy_m_T_Peasant_BaseColor.png b/client/assets/characters/clothing/peasant_tunic/heavy_m_T_Peasant_BaseColor.png new file mode 100644 index 000000000..8f1cb9966 Binary files /dev/null and b/client/assets/characters/clothing/peasant_tunic/heavy_m_T_Peasant_BaseColor.png differ diff --git a/client/assets/characters/clothing/peasant_tunic/heavy_m_T_Peasant_Normal.png b/client/assets/characters/clothing/peasant_tunic/heavy_m_T_Peasant_Normal.png new file mode 100644 index 000000000..78498b58b Binary files /dev/null and b/client/assets/characters/clothing/peasant_tunic/heavy_m_T_Peasant_Normal.png differ diff --git a/client/assets/characters/clothing/peasant_tunic/heavy_m_T_Peasant_ORM.png b/client/assets/characters/clothing/peasant_tunic/heavy_m_T_Peasant_ORM.png new file mode 100644 index 000000000..5ce2e1abd Binary files /dev/null and b/client/assets/characters/clothing/peasant_tunic/heavy_m_T_Peasant_ORM.png differ diff --git a/client/assets/characters/clothing/peasant_tunic/thin_f.glb b/client/assets/characters/clothing/peasant_tunic/thin_f.glb new file mode 100644 index 000000000..d47924271 Binary files /dev/null and b/client/assets/characters/clothing/peasant_tunic/thin_f.glb differ diff --git a/client/assets/characters/clothing/peasant_tunic/thin_f_T_Peasant_BaseColor.png b/client/assets/characters/clothing/peasant_tunic/thin_f_T_Peasant_BaseColor.png new file mode 100644 index 000000000..8f1cb9966 Binary files /dev/null and b/client/assets/characters/clothing/peasant_tunic/thin_f_T_Peasant_BaseColor.png differ diff --git a/client/assets/characters/clothing/peasant_tunic/thin_f_T_Peasant_Normal.png b/client/assets/characters/clothing/peasant_tunic/thin_f_T_Peasant_Normal.png new file mode 100644 index 000000000..78498b58b Binary files /dev/null and b/client/assets/characters/clothing/peasant_tunic/thin_f_T_Peasant_Normal.png differ diff --git a/client/assets/characters/clothing/peasant_tunic/thin_f_T_Peasant_ORM.png b/client/assets/characters/clothing/peasant_tunic/thin_f_T_Peasant_ORM.png new file mode 100644 index 000000000..5ce2e1abd Binary files /dev/null and b/client/assets/characters/clothing/peasant_tunic/thin_f_T_Peasant_ORM.png differ diff --git a/client/assets/characters/clothing/peasant_tunic/thin_m.glb b/client/assets/characters/clothing/peasant_tunic/thin_m.glb new file mode 100644 index 000000000..b3f3f76e0 Binary files /dev/null and b/client/assets/characters/clothing/peasant_tunic/thin_m.glb differ diff --git a/client/assets/characters/clothing/peasant_tunic/thin_m_T_Peasant_BaseColor.png b/client/assets/characters/clothing/peasant_tunic/thin_m_T_Peasant_BaseColor.png new file mode 100644 index 000000000..8f1cb9966 Binary files /dev/null and b/client/assets/characters/clothing/peasant_tunic/thin_m_T_Peasant_BaseColor.png differ diff --git a/client/assets/characters/clothing/peasant_tunic/thin_m_T_Peasant_Normal.png b/client/assets/characters/clothing/peasant_tunic/thin_m_T_Peasant_Normal.png new file mode 100644 index 000000000..78498b58b Binary files /dev/null and b/client/assets/characters/clothing/peasant_tunic/thin_m_T_Peasant_Normal.png differ diff --git a/client/assets/characters/clothing/peasant_tunic/thin_m_T_Peasant_ORM.png b/client/assets/characters/clothing/peasant_tunic/thin_m_T_Peasant_ORM.png new file mode 100644 index 000000000..5ce2e1abd Binary files /dev/null and b/client/assets/characters/clothing/peasant_tunic/thin_m_T_Peasant_ORM.png differ diff --git a/tooling/blender_rebuild_forks.py b/tooling/blender_rebuild_forks.py new file mode 100644 index 000000000..adcc86759 --- /dev/null +++ b/tooling/blender_rebuild_forks.py @@ -0,0 +1,104 @@ +""" +blender_rebuild_forks.py +Usage: tooling/blender --background --python tooling/blender_rebuild_forks.py -- [body_type ...] + +Rebuilds ONLY the fork body types (thin_m/f, heavy_m/f, child) through the same +segmentation pipeline that produced the healthy six (blender_segment_body.py), +using the T-1090 fix: the fork scale is applied to the mesh AND the embedded +armature rest pose so each segment stays internally consistent with its own +skeleton (required by the shared-skeleton compositor in character_visual.gd). + +Sources (Source-tier Godot - UE exports): + Regular_Male_FullBody.gltf + scale (0.82, 1.0, 0.88) -> thin_m + Regular_Female_FullBody.gltf + scale (0.82, 1.0, 0.88) -> thin_f + Regular_Male_FullBody.gltf + scale (1.20, 1.08, 1.0) -> heavy_m + Regular_Female_FullBody.gltf + scale (1.20, 1.08, 1.0) -> heavy_f + Teen_Male_FullBody.gltf + scale (0.75, 0.72, 0.75) -> child [gender-neutral] + +The fork scale factors and source mapping are unchanged from +blender_process_bodies.py — this driver reuses the same table so the healthy six +are never touched. Output layout matches production: /{body_type}/seg_*.glb. +""" + +import sys +import os + +script_dir = os.path.dirname(os.path.abspath(__file__)) +sys.path.insert(0, script_dir) +from blender_segment_body import segment_body + +# (gltf_filename, body_type_key, scale, source_label) — forks only. +FORK_MANIFEST = [ + ("Regular_Male_FullBody.gltf", "thin_m", (0.82, 1.0, 0.88), "Regular_Male_FullBody.gltf"), + ("Regular_Female_FullBody.gltf", "thin_f", (0.82, 1.0, 0.88), "Regular_Female_FullBody.gltf"), + ("Regular_Male_FullBody.gltf", "heavy_m", (1.20, 1.08, 1.0), "Regular_Male_FullBody.gltf"), + ("Regular_Female_FullBody.gltf", "heavy_f", (1.20, 1.08, 1.0), "Regular_Female_FullBody.gltf"), + ("Teen_Male_FullBody.gltf", "child", (0.75, 0.72, 0.75), "Teen_Male_FullBody.gltf"), +] + +FORK_README = """\ +# Fork body type — auto-generated from mesh + armature scaling (T-1090) + +This directory contains **{body_type}** body segments, generated by applying a +proportional scale to the source body ({source}) mesh AND its armature rest pose +together, then segmenting: + + Scale: ({sx:.2f}, {sy:.2f}, {sz:.2f}) + +The scale is applied to the mesh vertices and the embedded armature rest pose +with the SAME affine (T-1090 fix). This keeps each segment internally consistent +with its own skeleton, which the shared-skeleton compositor +(character_visual.gd) requires — a mesh-only scale detaches the head and +explodes the limbs on relocation. + +Cross-sectional differentiation (thin = narrow, heavy = wide) survives the +composite; global height normalises to the shared skeleton (see T-1090 report / +Q-060 for the shared-skeleton scale-normalisation note). + +Status: auto-generated (rebuilt T-1090), 18 segments incl. seg_hips +""" + + +def write_fork_readme(output_dir, body_type, source, scale): + sx, sy, sz = scale + with open(os.path.join(output_dir, "README.md"), "w") as f: + f.write(FORK_README.format(body_type=body_type, source=source, sx=sx, sy=sy, sz=sz)) + + +if __name__ == "__main__": + argv = sys.argv + args = argv[argv.index("--") + 1:] if "--" in argv else [] + if len(args) < 2: + print("Usage: -- [body_type ...]") + sys.exit(1) + + source_dir = args[0] + output_base_dir = args[1] + only = set(args[2:]) # optional subset filter + + manifest = [m for m in FORK_MANIFEST if not only or m[1] in only] + + unique_sources = {gltf for (gltf, _, _, _) in manifest} + missing = [ + os.path.join(source_dir, f) + for f in sorted(unique_sources) + if not os.path.exists(os.path.join(source_dir, f)) + ] + if missing: + print("\nERROR: Missing source GLTF files:") + for p in missing: + print(f" {p}") + sys.exit(1) + + results = [] + for (gltf_filename, body_type, scale, source_label) in manifest: + gltf_path = os.path.join(source_dir, gltf_filename) + output_dir = os.path.join(output_base_dir, body_type) + print(f"\n{'='*60}\n Fork: {body_type} scale={scale}\n Source: {gltf_filename}") + exported, skipped = segment_body(gltf_path, output_dir, scale) + write_fork_readme(output_dir, body_type, source_label, scale) + results.append((body_type, exported, skipped)) + + print(f"\n{'='*60}\n=== Fork rebuild complete ===") + for body_type, exported, skipped in results: + print(f" {body_type}: {len(exported)} exported, {len(skipped)} skipped") diff --git a/tooling/blender_segment_body.py b/tooling/blender_segment_body.py index 14c356f41..239927081 100644 --- a/tooling/blender_segment_body.py +++ b/tooling/blender_segment_body.py @@ -125,6 +125,65 @@ def apply_scale(mesh_obj, sx, sy, sz): mesh_obj.data.update() +def apply_fork_scale(body_mesh, special_meshes, armature, sx, sy, sz): + """ + Scale a fork body (thin/heavy/child) so mesh AND armature stay CONSISTENT. + + This is the load-bearing fix for fork body types (T-1090). The segment GLBs + are reparented onto a single SHARED skeleton at runtime (character_visual.gd + loads skeleton/armature.glb and drives all segments by bone name). A segment + composites coherently ONLY if its mesh matches its own embedded armature's + rest pose — the shared skeleton then relocates the whole segment as a rigid + unit (this is why the pristine-rig teen body composites fine despite a very + different rig; see the T-1090 report). + + The previous behaviour scaled mesh vertices ALONE, leaving the armature at + source scale: the head mesh dropped ~0.35 m below the Head bone, limbs flung + apart on relocation — the "detached head / spider arms" misrender. + + The scale must be BAKED by Blender via object transform_apply, NOT by poking + edit-bone head/tail directly: manual head/tail edits do not recompute bone + roll or honour connected-chain constraints, so long chains (arm→hand→fingers, + neck→head) accumulate error and still explode. transform_apply rebuilds the + bone matrices correctly. + + Method: de-parent meshes (keep transform) so mesh and armature are + independent objects sharing the world origin, give each the SAME object + scale, then apply. Identical affine about the same origin → mesh verts and + bone rest move together; the Armature modifier + vertex groups re-derive a + consistent bind, which the glTF exporter bakes into the inverse-bind + matrices. + """ + if sx == 1.0 and sy == 1.0 and sz == 1.0: + return + print(f" Applying baked fork scale: ({sx:.3f}, {sy:.3f}, {sz:.3f})") + meshes = [body_mesh] + [m for m in special_meshes if m is not None] + + if armature.mode != 'OBJECT': + bpy.context.view_layer.objects.active = armature + bpy.ops.object.mode_set(mode='OBJECT') + + # De-parent meshes from the armature (keep world transform). The Armature + # MODIFIER and vertex groups are untouched — only the parenting relationship + # is cleared, so scaling each object about the origin is not double-applied. + bpy.ops.object.select_all(action='DESELECT') + for m in meshes: + if m.parent is armature: + m.select_set(True) + if bpy.context.selected_objects: + bpy.context.view_layer.objects.active = meshes[0] + bpy.ops.object.parent_clear(type='CLEAR_KEEP_TRANSFORM') + + # Scale armature + all meshes by the same object scale, then bake. + objs = [armature] + meshes + bpy.ops.object.select_all(action='DESELECT') + for o in objs: + o.select_set(True) + o.scale = (sx, sy, sz) + bpy.context.view_layer.objects.active = armature + bpy.ops.object.transform_apply(location=False, rotation=False, scale=True) + + def export_glb(objects, output_path): """Select the given objects and export as GLB.""" bpy.ops.object.select_all(action='DESELECT') @@ -353,13 +412,13 @@ def segment_body(gltf_path, output_dir, scale=(1.0, 1.0, 1.0)): remaining_names = [o.name for o in bpy.context.scene.objects] print(f" Removed {removed} utility objects. Scene now: {remaining_names}") - # Apply optional scale transform (for fork body types) + # Apply optional scale transform (for fork body types). Mesh AND armature + # are scaled together and baked by Blender so the segment stays internally + # consistent when reparented onto the shared runtime skeleton (T-1090 fix — + # see apply_fork_scale). sx, sy, sz = scale - apply_scale(body_mesh, sx, sy, sz) - # Also scale Eyes/Eyebrows for child (uniform scale applies to all meshes) if scale != (1.0, 1.0, 1.0): - for obj in special.values(): - apply_scale(obj, sx, sy, sz) + apply_fork_scale(body_mesh, list(special.values()), armature, sx, sy, sz) os.makedirs(output_dir, exist_ok=True)