ADDED Requirements
Requirement: Provide a reusable GNM Head scene component
The system SHALL provide a gnmHeadComponent that loads and renders a parametric GNM Head through the existing tresjs/Three.js pipeline without requiring a backend service.
Scenario: Render the default head
- WHEN the component is mounted with its default props
- THEN it MUST load the configured GNM head container in the browser
- AND it MUST first display the neutral head as one transformable object hierarchy
- AND it MUST apply the registered semantic defaults when the sampler becomes ready
Requirement: Keep dynamic import responsive while loading large resources
The component SHALL NOT fetch either GNM binary container at module evaluation time, SHALL mount without waiting for the binary download, and SHALL show an owned lightweight Three.js loading placeholder until the main head becomes renderable.
Scenario: Register the component without mounting it
- WHEN the service discovers or imports the component module
- THEN no GNM binary request MUST start
Scenario: Mount while the main model is uncached
- WHEN the component mounts and
gnm_head_web.bin is not cached
- THEN the component module and instance MUST become available without waiting for the model download
- AND a loading placeholder MUST be renderable while download progress is reported
- AND the main head request MUST begin only after mount
Requirement: Stage the two binary downloads
The component SHALL load the main head container before the semantic sampler container.
Scenario: Main model becomes ready
- WHEN
gnm_head_web.bin has loaded and parsed successfully
- THEN the neutral mesh MUST become renderable without waiting for
gnm_samplers_web.bin
- AND the main-model loading placeholder MUST be removed and disposed
- AND semantic sampler loading MUST continue separately
Requirement: Expose compact deterministic parameters
The component SHALL expose resource URLs, identity seed and strength, expression seed/class and strength, basic pose, material, skin opacity, and non-skin anatomical visibility props through both the Vue component and src/dcsConfig.ts.
Scenario: Use default semantic strengths
- WHEN the component mounts with its registered defaults
- THEN identity strength MUST be
0.58
- AND expression strength MUST be
0.68
Scenario: Change identity settings
- WHEN identity seed or strength changes after the semantic sampler is ready
- THEN the head identity MUST update deterministically
Scenario: Change expression settings
- WHEN expression seed, class, or strength changes after the semantic sampler is ready
- THEN the head expression MUST update deterministically
Scenario: Restore neutral semantics
- WHEN identity or expression strength is zero
- THEN the corresponding GNM parameter vector MUST be reset to zero
Scenario: Change basic pose
- WHEN head or eye rotation props change
- THEN the component MUST update the GNM joint pose without remounting
Scenario: Change skin opacity
- WHEN
skinOpacity changes
- THEN only skin triangles MUST change opacity
- AND eyes, teeth, gums, and tongue MUST remain opaque
Requirement: Keep scene ownership outside the component
The component MUST NOT create or expose a renderer, camera, controls, background, environment, scene light, GUI, DOM panel, XR panel, keyboard shortcut, or demo animation loop.
Scenario: Add the head to an existing host scene
- WHEN the component is mounted in the advanced dynamic component preview or regional editor
- THEN the host MUST retain ownership of camera, lighting, renderer, environment, controls, and application UI
Requirement: Cancel stale loading work
The component SHALL abort active requests and reject stale asynchronous results when resource URLs change or the component unmounts.
Scenario: Unmount while downloading
- WHEN the component unmounts before a binary request completes
- THEN the active request MUST be aborted
- AND no Three.js object from that request may be mounted afterward
Scenario: Change a resource URL while downloading
- WHEN either configured binary URL changes
- THEN the prior loading generation MUST be cancelled
- AND only the newest generation may update component state
Requirement: Manage Three.js resources safely
The component SHALL dispose all owned geometries and materials when replacing the model or unmounting.
Scenario: Reload the model
- WHEN a new head URL replaces an already rendered head
- THEN the previous runtime resources MUST be removed and disposed
Scenario: Unmount the component
- WHEN the component leaves the scene
- THEN its owned head and loading-placeholder Three.js resources MUST be disposed
Requirement: Preserve upstream attribution
The component SHALL include the Apache-2.0 provenance and license notice for the ported XR Blocks GNM code.
Scenario: Audit third-party code
- WHEN a maintainer inspects the component directory
- THEN the upstream repository, relevant source paths, and Apache-2.0 license notice MUST be present