design: KHR_materials_specular feeds the body specular map (Tim t998u.4)
@@ -529,3 +529,7 @@ Supersedes the neck pivot of t952u (the fixed framing itself is unchanged).
529
529
- **Depth range.** Unchanged rule (T-pose span plus one arm length per side, or a manual total), centred on the orbit pivot at camera distance 10, so it now follows the new pivot depth.
530
530
- **Perspective.** Production renders and the fixed render frame in the live view are orthographic, i.e. already the limit of "infinitely far and zoomed in": there is no perspective to weaken, the camera distance does not change the image, and no `.ppd` setting is added. Only the free live view (fixed frame unchecked) is perspective; it now sits 2.5× further away with a narrowed field of view (`2·atan(tan(19°)/2.5)` ≈ 15.4° instead of 38°), so the on-screen size stays the same with weaker perspective.
531
531
- **Check.** A GPU production render of Tim's `maleb.glb`/`femaleb.glb` with his framing must report 0 clamped depth pixels at 8 bit for all pitches including ±60; `depth_clamp_probe` cross-checks per pitch on the CPU.
532
533
## Decision 2026-11-07 (Tim t998u.4): glTF KHR_materials_specular feeds the body specular map
534
535
When a glTF body material carries `KHR_materials_specular`, its specular strength becomes the body's specular map: `specularFactor` × the alpha channel of `specularTexture` (when present), per primitive, as loaded. `specularColorFactor`/`specularColorTexture` are not used (our specular map is a scalar strength). The specular texture is sampled with the same (base-colour) UV set and transform as the albedo; a specular texture on a different `texCoord` is ignored with a load notice-free fallback to the factor alone. Materials without the extension keep specular 0 as before; there is no roughness/metallic conversion (KHR_materials_specular was straightforward, so the roughness fallback is not needed). The live preview uses the same per-primitive strength and texture for its highlight. FBX/OBJ bodies are unchanged (specular 0).
@@ -529,3 +529,7 @@ Supersedes the neck pivot of t952u (the fixed framing itself is unchanged).529
- **Depth range.** Unchanged rule (T-pose span plus one arm length per side, or a manual total), centred on the orbit pivot at camera distance 10, so it now follows the new pivot depth.529
- **Depth range.** Unchanged rule (T-pose span plus one arm length per side, or a manual total), centred on the orbit pivot at camera distance 10, so it now follows the new pivot depth.530
- **Perspective.** Production renders and the fixed render frame in the live view are orthographic, i.e. already the limit of "infinitely far and zoomed in": there is no perspective to weaken, the camera distance does not change the image, and no `.ppd` setting is added. Only the free live view (fixed frame unchecked) is perspective; it now sits 2.5× further away with a narrowed field of view (`2·atan(tan(19°)/2.5)` ≈ 15.4° instead of 38°), so the on-screen size stays the same with weaker perspective.530
- **Perspective.** Production renders and the fixed render frame in the live view are orthographic, i.e. already the limit of "infinitely far and zoomed in": there is no perspective to weaken, the camera distance does not change the image, and no `.ppd` setting is added. Only the free live view (fixed frame unchecked) is perspective; it now sits 2.5× further away with a narrowed field of view (`2·atan(tan(19°)/2.5)` ≈ 15.4° instead of 38°), so the on-screen size stays the same with weaker perspective.531
- **Check.** A GPU production render of Tim's `maleb.glb`/`femaleb.glb` with his framing must report 0 clamped depth pixels at 8 bit for all pitches including ±60; `depth_clamp_probe` cross-checks per pitch on the CPU.531
- **Check.** A GPU production render of Tim's `maleb.glb`/`femaleb.glb` with his framing must report 0 clamped depth pixels at 8 bit for all pitches including ±60; `depth_clamp_probe` cross-checks per pitch on the CPU.532
533
## Decision 2026-11-07 (Tim t998u.4): glTF KHR_materials_specular feeds the body specular map534
535
When a glTF body material carries `KHR_materials_specular`, its specular strength becomes the body's specular map: `specularFactor` × the alpha channel of `specularTexture` (when present), per primitive, as loaded. `specularColorFactor`/`specularColorTexture` are not used (our specular map is a scalar strength). The specular texture is sampled with the same (base-colour) UV set and transform as the albedo; a specular texture on a different `texCoord` is ignored with a load notice-free fallback to the factor alone. Materials without the extension keep specular 0 as before; there is no roughness/metallic conversion (KHR_materials_specular was straightforward, so the roughness fallback is not needed). The live preview uses the same per-primitive strength and texture for its highlight. FBX/OBJ bodies are unchanged (specular 0).