create-aura3d 1.1.2 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/package.json +11 -9
- package/templates/{cartoon-channel → animation-channel}/README.md +11 -11
- package/templates/{cartoon-studio → animation-channel}/index.html +1 -1
- package/templates/{cartoon-channel → animation-channel}/package.json +2 -2
- package/templates/{cartoon-channel → animation-channel}/src/episode.ts +22 -22
- package/templates/{cartoon-channel → animation-channel}/src/experimental/README.md +5 -5
- package/templates/{cartoon-channel → animation-channel}/src/experimental/concept-episode-2-5d.css +3 -3
- package/templates/{cartoon-channel → animation-channel}/src/experimental/concept-episode-2-5d.ts +7 -7
- package/templates/{cartoon-channel → animation-channel}/src/experimental/image-puppet-episode.css +4 -4
- package/templates/{cartoon-channel → animation-channel}/src/experimental/image-puppet-episode.ts +6 -6
- package/templates/{cartoon-channel → animation-channel}/src/experimental/puppet-episode-2d.css +3 -3
- package/templates/{cartoon-channel → animation-channel}/src/experimental/puppet-episode-2d.ts +7 -7
- package/templates/{cartoon-channel → animation-channel}/src/main.ts +32 -32
- package/templates/{cartoon-channel → animation-channel}/src/render-plan.ts +13 -13
- package/templates/{cartoon-channel → animation-channel}/src/sample-episode-visual.css +34 -34
- package/templates/{cartoon-channel → animation-channel}/src/sample-episode-visual.ts +20 -20
- package/templates/{cartoon-channel → animation-channel}/tests/concept-2-5d-animation.spec.ts +3 -3
- package/templates/{cartoon-channel → animation-channel}/tests/concept-2-5d.spec.ts +6 -6
- package/templates/{cartoon-channel → animation-channel}/tests/image-puppet-animation.spec.ts +3 -3
- package/templates/{cartoon-channel → animation-channel}/tests/image-puppet.spec.ts +5 -5
- package/templates/{cartoon-channel → animation-channel}/tests/puppet-2d-animation.spec.ts +3 -3
- package/templates/{cartoon-channel → animation-channel}/tests/puppet-2d.spec.ts +4 -4
- package/templates/{prompt-cartoon-channel → animation-channel}/tests/route-health.spec.ts +1 -1
- package/templates/{cartoon-channel → animation-channel}/tests/sample-episode-visual.spec.ts +5 -5
- package/templates/{cartoon-channel → animation-channel}/tests/storyboard-playback.spec.ts +7 -7
- package/templates/animation-studio/AGENTS.md +71 -0
- package/templates/{cartoon-studio → animation-studio}/ASSET-LICENSES.md +7 -7
- package/templates/{cartoon-studio → animation-studio}/README.md +6 -6
- package/templates/animation-studio/aura.assets.json +669 -0
- package/templates/animation-studio/dist/episodes/scene/episode-3d.webm +0 -0
- package/templates/animation-studio/dist/episodes/scene/frames/action.png +0 -0
- package/templates/animation-studio/dist/episodes/scene/frames/dialogue.png +0 -0
- package/templates/animation-studio/dist/episodes/scene/frames/final.png +0 -0
- package/templates/animation-studio/dist/episodes/scene/frames/first.png +0 -0
- package/templates/animation-studio/dist/episodes/scene/frames/mouth-closed.png +0 -0
- package/templates/animation-studio/dist/episodes/scene/frames/mouth-open.png +0 -0
- package/templates/animation-studio/dist/episodes/scene/render-live-summary.json +10284 -0
- package/templates/animation-studio/dist/episodes/scene/skeleton-overlays/worker-1.png +0 -0
- package/templates/animation-studio/dist/episodes/scene/skeleton-overlays/worker-2.png +0 -0
- package/templates/animation-studio/dist/generated/second-scene.document.json +1210 -0
- package/templates/animation-studio/dist/generated/studio-edited.document.json +1196 -0
- package/templates/animation-studio/dist/scene/inshader-accept.document.json +1 -0
- package/templates/animation-studio/dist/scene/inshader-test.document.json +1 -0
- package/templates/animation-studio/dist/scene/integ.document.json +1 -0
- package/templates/animation-studio/dist/scene/working.document.json +723 -0
- package/templates/animation-studio/dist/scene/working.history.json +1 -0
- package/templates/{cartoon-studio → animation-studio}/live-route.html +1 -1
- package/templates/{cartoon-studio → animation-studio}/package-lock.json +2 -2
- package/templates/animation-studio/package.json +32 -0
- package/templates/animation-studio/public/aura-assets/cast-a.catalog.glb +0 -0
- package/templates/animation-studio/public/aura-assets/cast-b.catalog.glb +0 -0
- package/templates/animation-studio/public/aura-assets/luma.catalog.glb +0 -0
- package/templates/animation-studio/public/aura-assets/luma2.catalog.glb +0 -0
- package/templates/animation-studio/public/aura-assets/miko.catalog.glb +0 -0
- package/templates/{cartoon-studio → animation-studio}/public/aura-assets/moonGarden.gltf +1 -1
- package/templates/animation-studio/public/aura-assets/mushroom.catalog.glb +0 -0
- package/templates/animation-studio/public/aura-assets/rusty.catalog.glb +0 -0
- package/templates/animation-studio/public/cast-library/cast-library.json +71 -0
- package/templates/animation-studio/public/clip-library/gesture.json +173903 -0
- package/templates/animation-studio/public/clip-library/idle.json +23035 -0
- package/templates/animation-studio/public/clip-library/manifest.json +154 -0
- package/templates/animation-studio/public/clip-library/nod.json +173903 -0
- package/templates/animation-studio/public/clip-library/point.json +69879 -0
- package/templates/animation-studio/public/clip-library/react.json +66084 -0
- package/templates/animation-studio/public/clip-library/run.json +9648 -0
- package/templates/animation-studio/public/clip-library/talk.json +69879 -0
- package/templates/animation-studio/public/clip-library/walk.json +8283 -0
- package/templates/animation-studio/public/hifi-cast/BrainStem.glb +0 -0
- package/templates/animation-studio/public/hifi-cast/CesiumMan.glb +0 -0
- package/templates/animation-studio/public/hifi-cast/RiggedFigure.glb +0 -0
- package/templates/animation-studio/public/hifi-cast/kaykit/Barbarian.glb +0 -0
- package/templates/animation-studio/public/hifi-cast/kaykit/Knight.glb +0 -0
- package/templates/animation-studio/public/hifi-cast/kaykit/Mage.glb +0 -0
- package/templates/animation-studio/public/hifi-cast/kaykit/Rogue.glb +0 -0
- package/templates/animation-studio/public/hifi-cast/kaykit/Rogue_Hooded.glb +0 -0
- package/templates/animation-studio/public/hifi-cast/khronos-report.json +295 -0
- package/templates/animation-studio/public/hifi-cast/quaternius-report.json +449 -0
- package/templates/animation-studio/public/hifi-cast/rpm/cesiumman.glb +0 -0
- package/templates/animation-studio/public/hifi-cast/rpm/fox.glb +0 -0
- package/templates/animation-studio/public/hifi-cast/rpm/riggedfigure.glb +0 -0
- package/templates/animation-studio/public/hifi-cast/rpm-report.json +301 -0
- package/templates/animation-studio/scripts/anim.ts +103 -0
- package/templates/animation-studio/scripts/animation-scene.ts +457 -0
- package/templates/animation-studio/scripts/asset-motion-probe.ts +450 -0
- package/templates/animation-studio/scripts/asset-render-probe.ts +152 -0
- package/templates/animation-studio/scripts/author-office-scene.ts +65 -0
- package/templates/animation-studio/scripts/build-cast-library.ts +97 -0
- package/templates/animation-studio/scripts/build-characters.ts +1543 -0
- package/templates/animation-studio/scripts/build-clip-library.ts +972 -0
- package/templates/animation-studio/scripts/clip-decision-cli.ts +51 -0
- package/templates/animation-studio/scripts/determinism-check.ts +48 -0
- package/templates/animation-studio/scripts/generate-scene.ts +95 -0
- package/templates/animation-studio/scripts/hifi-cast-validate.ts +572 -0
- package/templates/animation-studio/scripts/motion-evidence-cli.ts +150 -0
- package/templates/animation-studio/scripts/motion-evidence.ts +362 -0
- package/templates/animation-studio/scripts/preview-server.ts +52 -0
- package/templates/animation-studio/scripts/regen-manifest.ts +156 -0
- package/templates/animation-studio/scripts/render-core.ts +360 -0
- package/templates/animation-studio/scripts/render-live.ts +813 -0
- package/templates/animation-studio/scripts/render-parallel.ts +70 -0
- package/templates/animation-studio/scripts/render-server.ts +119 -0
- package/templates/animation-studio/scripts/resolve-asset.ts +669 -0
- package/templates/animation-studio/scripts/skeleton-overlay-cli.ts +82 -0
- package/templates/animation-studio/scripts/skeleton-overlay.ts +293 -0
- package/templates/animation-studio/scripts/studio-tools-demo.ts +45 -0
- package/templates/animation-studio/scripts/texture-bake.ts +297 -0
- package/templates/{cartoon-studio → animation-studio}/scripts/validate-characters.ts +0 -0
- package/templates/animation-studio/scripts/verify-extracted-overlay-cli.ts +264 -0
- package/templates/animation-studio/src/animation-episode-validator.ts +97 -0
- package/templates/animation-studio/src/animation-performance.ts +556 -0
- package/templates/animation-studio/src/aura-assets.ts +71 -0
- package/templates/animation-studio/src/character.ts +40 -0
- package/templates/animation-studio/src/director/compile-episode-document.ts +45 -0
- package/templates/animation-studio/src/director/director-heuristics.ts +697 -0
- package/templates/animation-studio/src/director/prompt-to-scene.ts +369 -0
- package/templates/animation-studio/src/empty-document.ts +77 -0
- package/templates/animation-studio/src/episode-document.ts +442 -0
- package/templates/animation-studio/src/examples/moon-garden.example.ts +183 -0
- package/templates/animation-studio/src/fidelity.ts +129 -0
- package/templates/animation-studio/src/graph.ts +14 -0
- package/templates/animation-studio/src/procedural-hdri.ts +243 -0
- package/templates/animation-studio/src/profile.ts +97 -0
- package/templates/animation-studio/src/render-live-route.ts +42 -0
- package/templates/animation-studio/src/render-modes.ts +137 -0
- package/templates/animation-studio/src/scene-player.ts +867 -0
- package/templates/animation-studio/src/set-templates.ts +361 -0
- package/templates/animation-studio/src/studio/episode-document-store.ts +72 -0
- package/templates/animation-studio/src/studio/scene-tool-registry.ts +86 -0
- package/templates/animation-studio/src/studio/scene-tools.ts +169 -0
- package/templates/animation-studio/tests/reports/animation-studio/hifi-cast-validation.json +938 -0
- package/templates/animation-studio/tsconfig.json +26 -0
- package/templates/{cartoon-studio → animation-studio}/vite.config.ts +6 -1
- package/templates/character-controller/README.md +33 -0
- package/templates/character-controller/index.html +19 -0
- package/templates/character-controller/package.json +23 -0
- package/templates/character-controller/playwright.config.ts +14 -0
- package/templates/character-controller/src/controller.ts +44 -0
- package/templates/character-controller/src/main.ts +62 -0
- package/templates/character-controller/tests/route-health.spec.ts +26 -0
- package/templates/character-controller/tests/screenshot.spec.ts +9 -0
- package/templates/character-controller/tsconfig.json +15 -0
- package/templates/cinematic-scene/package.json +1 -1
- package/templates/episode-builder/README.md +4 -4
- package/templates/episode-builder/package.json +1 -1
- package/templates/episode-builder/src/aura-assets.ts +1 -1
- package/templates/episode-builder/src/builder.ts +4 -4
- package/templates/episode-builder/src/episode.ts +21 -21
- package/templates/episode-builder/src/main.ts +20 -20
- package/templates/episode-builder/src/render-plan.ts +13 -13
- package/templates/episode-builder/tests/storyboard-playback.spec.ts +7 -7
- package/templates/fighting-game/package.json +1 -1
- package/templates/mini-game/package.json +1 -1
- package/templates/product-viewer/package.json +1 -1
- package/templates/{prompt-cartoon-channel → prompt-animation-channel}/README.md +5 -5
- package/templates/{cartoon-channel → prompt-animation-channel}/index.html +1 -1
- package/templates/{prompt-cartoon-channel → prompt-animation-channel}/package.json +2 -2
- package/templates/{prompt-cartoon-channel → prompt-animation-channel}/src/aura-assets.ts +1 -1
- package/templates/{prompt-cartoon-channel → prompt-animation-channel}/src/episode.ts +22 -22
- package/templates/{prompt-cartoon-channel → prompt-animation-channel}/src/main.ts +28 -28
- package/templates/{prompt-cartoon-channel → prompt-animation-channel}/src/render-plan.ts +13 -13
- package/templates/{cartoon-channel → prompt-animation-channel}/tests/route-health.spec.ts +1 -1
- package/templates/{prompt-cartoon-channel → prompt-animation-channel}/tests/storyboard-playback.spec.ts +8 -8
- package/templates/cartoon-studio/aura.assets.json +0 -400
- package/templates/cartoon-studio/package.json +0 -33
- package/templates/cartoon-studio/public/aura-assets/luma.authored.glb +0 -0
- package/templates/cartoon-studio/public/aura-assets/miko.authored.glb +0 -0
- package/templates/cartoon-studio/scripts/build-characters.ts +0 -738
- package/templates/cartoon-studio/scripts/build-dialogue-audio.ts +0 -262
- package/templates/cartoon-studio/scripts/episode.ts +0 -323
- package/templates/cartoon-studio/scripts/render-live.ts +0 -873
- package/templates/cartoon-studio/src/aura-assets.ts +0 -64
- package/templates/cartoon-studio/src/characters.ts +0 -65
- package/templates/cartoon-studio/src/episode-renderer.ts +0 -605
- package/templates/cartoon-studio/src/episode.ts +0 -306
- package/templates/cartoon-studio/src/main.ts +0 -400
- package/templates/cartoon-studio/src/render-live-route.ts +0 -913
- package/templates/cartoon-studio/src/render-plan.ts +0 -567
- package/templates/cartoon-studio/src/review.ts +0 -99
- package/templates/cartoon-studio/src/studio.ts +0 -101
- package/templates/cartoon-studio/test-results/.last-run.json +0 -4
- package/templates/cartoon-studio/tests/episode-render.spec.ts +0 -44
- package/templates/cartoon-studio/tests/motion-quality.spec.ts +0 -45
- package/templates/cartoon-studio/tests/route-health.spec.ts +0 -7
- package/templates/cartoon-studio/tests/storyboard-playback.spec.ts +0 -99
- package/templates/cartoon-studio/tests/visual-review.spec.ts +0 -21
- package/templates/cartoon-studio/tsconfig.json +0 -14
- package/templates/prompt-cartoon-channel/index.html +0 -13
- package/templates/prompt-cartoon-channel/src/sets.ts +0 -14
- /package/templates/{cartoon-channel → animation-channel}/aura.assets.json +0 -0
- /package/templates/{cartoon-channel → animation-channel}/playwright.config.ts +0 -0
- /package/templates/{cartoon-channel → animation-channel}/public/aura-assets/luma.047f5e5f.glb +0 -0
- /package/templates/{cartoon-channel → animation-channel}/public/aura-assets/luma.thumb.svg +0 -0
- /package/templates/{cartoon-channel → animation-channel}/public/aura-assets/miko.047f5e5f.glb +0 -0
- /package/templates/{cartoon-channel → animation-channel}/public/aura-assets/miko.thumb.svg +0 -0
- /package/templates/{cartoon-channel → animation-channel}/public/aura-assets/moon-garden-feature-frame.png +0 -0
- /package/templates/{cartoon-channel → animation-channel}/src/aura-assets.ts +0 -0
- /package/templates/{cartoon-channel → animation-channel}/src/characters.ts +0 -0
- /package/templates/{cartoon-channel → animation-channel}/src/contract.ts +0 -0
- /package/templates/{cartoon-channel → animation-channel}/src/sets.ts +0 -0
- /package/templates/{cartoon-channel → animation-channel}/test-results/.last-run.json +0 -0
- /package/templates/{cartoon-channel → animation-channel}/tests/reports/prompt-animation/cartoon-sample-episode.png +0 -0
- /package/templates/{cartoon-channel → animation-channel}/tsconfig.json +0 -0
- /package/templates/{cartoon-studio → animation-studio}/playwright.config.ts +0 -0
- /package/templates/{cartoon-studio → animation-studio}/public/aura-assets/luma.thumb.svg +0 -0
- /package/templates/{cartoon-studio → animation-studio}/public/aura-assets/miko.thumb.svg +0 -0
- /package/templates/{cartoon-studio → animation-studio}/src/contract.ts +0 -0
- /package/templates/{prompt-cartoon-channel → prompt-animation-channel}/playwright.config.ts +0 -0
- /package/templates/{prompt-cartoon-channel → prompt-animation-channel}/src/characters.ts +0 -0
- /package/templates/{prompt-cartoon-channel → prompt-animation-channel}/src/contract.ts +0 -0
- /package/templates/{cartoon-studio → prompt-animation-channel}/src/sets.ts +0 -0
- /package/templates/{prompt-cartoon-channel → prompt-animation-channel}/tsconfig.json +0 -0
|
@@ -5,14 +5,14 @@ test("episode builder storyboard caption renders", async ({ page }) => {
|
|
|
5
5
|
await expect(page.getByText(/Aura3D episode builder|moon|robot/i)).toBeVisible();
|
|
6
6
|
});
|
|
7
7
|
|
|
8
|
-
test("storyboard playback, character performance, caption timing, cuts, and nonblank
|
|
8
|
+
test("storyboard playback, character performance, caption timing, cuts, and nonblank animation frames are sourced", async ({
|
|
9
9
|
page
|
|
10
10
|
}) => {
|
|
11
11
|
await page.goto("/");
|
|
12
12
|
|
|
13
13
|
const routeProof = (await page.evaluate(() => {
|
|
14
14
|
const template = (window as unknown as {
|
|
15
|
-
|
|
15
|
+
__AURA3D_ANIMATION_TEMPLATE__?: {
|
|
16
16
|
shotIds: readonly string[];
|
|
17
17
|
captionIds: readonly string[];
|
|
18
18
|
storyBible?: unknown;
|
|
@@ -20,7 +20,7 @@ test("storyboard playback, character performance, caption timing, cuts, and nonb
|
|
|
20
20
|
playbackProbeSamples: readonly unknown[];
|
|
21
21
|
sampleAt(time: number): unknown;
|
|
22
22
|
};
|
|
23
|
-
}).
|
|
23
|
+
}).__AURA3D_ANIMATION_TEMPLATE__;
|
|
24
24
|
return {
|
|
25
25
|
shotIds: template?.shotIds ?? [],
|
|
26
26
|
captionIds: template?.captionIds ?? [],
|
|
@@ -28,8 +28,8 @@ test("storyboard playback, character performance, caption timing, cuts, and nonb
|
|
|
28
28
|
builder: template?.builder,
|
|
29
29
|
samples: [1, 21, 43].map((time) => template?.sampleAt(time)),
|
|
30
30
|
playbackProbeSamples: template?.playbackProbeSamples ?? [],
|
|
31
|
-
bodyShotCount: document.body.dataset.
|
|
32
|
-
bodyCaptionCount: document.body.dataset.
|
|
31
|
+
bodyShotCount: document.body.dataset.animationShotCount,
|
|
32
|
+
bodyCaptionCount: document.body.dataset.animationCaptionCount,
|
|
33
33
|
bodyFormats: document.body.dataset.episodeBuilderFormats
|
|
34
34
|
};
|
|
35
35
|
})) as {
|
|
@@ -73,7 +73,7 @@ test("storyboard playback, character performance, caption timing, cuts, and nonb
|
|
|
73
73
|
expect(routeProof.samples.flatMap((sample) => sample.nodeUpdates ?? []).some((update) => update.characterId === "miko")).toBe(true);
|
|
74
74
|
expect(routeProof.samples.flatMap((sample) => sample.nodeUpdates ?? []).some((update) => update.characterId === "luma")).toBe(true);
|
|
75
75
|
expect(routeProof.storyBible?.props?.length).toBeGreaterThanOrEqual(3);
|
|
76
|
-
expect(routeProof.storyBible?.styleGuide?.visualStyle).toMatch(/
|
|
76
|
+
expect(routeProof.storyBible?.styleGuide?.visualStyle).toMatch(/animation/i);
|
|
77
77
|
expect(routeProof.storyBible?.shotList).toHaveLength(3);
|
|
78
78
|
expect(routeProof.playbackProbeSamples).toHaveLength(3);
|
|
79
79
|
expect(routeProof.bodyShotCount).toBe("3");
|
|
@@ -89,7 +89,7 @@ test("storyboard playback, character performance, caption timing, cuts, and nonb
|
|
|
89
89
|
expect(routeProof.builder?.compiledEpisode?.shotCount).toBe(3);
|
|
90
90
|
expect(routeProof.builder?.compiledEpisode?.captionCount).toBe(6);
|
|
91
91
|
expect(routeProof.builder?.compiledEpisode?.renderQueueItems).toBeGreaterThan(0);
|
|
92
|
-
expect(routeProof.builder?.typedAssets?.commands?.some((command) => command.includes("assets validate-
|
|
92
|
+
expect(routeProof.builder?.typedAssets?.commands?.some((command) => command.includes("assets validate-animation"))).toBe(true);
|
|
93
93
|
expect(routeProof.bodyFormats).toBe("short-form,standard,series-pilot,educational,music-video");
|
|
94
94
|
await expect(page.locator("#episode-builder-panel")).toBeVisible();
|
|
95
95
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
# Aura3D
|
|
1
|
+
# Aura3D Animation Channel Template
|
|
2
2
|
|
|
3
|
-
> **Status: example / experimental.** The flagship
|
|
4
|
-
> [`
|
|
3
|
+
> **Status: example / experimental.** The flagship animation pipeline is the
|
|
4
|
+
> [`animation-studio`](../animation-studio) template. This template is a
|
|
5
5
|
> contract/example only.
|
|
6
6
|
|
|
7
7
|
This template demonstrates the AuraVoice-to-Aura3D prompt-animation contract.
|
|
@@ -23,7 +23,7 @@ Replace primitive characters with typed GLB assets by running:
|
|
|
23
23
|
```bash
|
|
24
24
|
npx @aura3d/cli@latest assets add ./assets/miko.glb --name miko
|
|
25
25
|
npx @aura3d/cli@latest assets add ./assets/luma.glb --name luma
|
|
26
|
-
npx @aura3d/cli@latest assets validate-
|
|
26
|
+
npx @aura3d/cli@latest assets validate-animation
|
|
27
27
|
```
|
|
28
28
|
|
|
29
29
|
Then import `assets.miko` and `assets.luma` from `src/aura-assets.ts` and pass them to `model(assets.miko)` and `model(assets.luma)`.
|
|
@@ -41,6 +41,6 @@ Do not replace this with a string asset id or a raw loader.
|
|
|
41
41
|
|
|
42
42
|
This scaffold intentionally does not claim publish readiness from source alone.
|
|
43
43
|
Before closing build, route, asset, screenshot, render, or visual-quality gates,
|
|
44
|
-
archive the matching `npm run build`, `assets validate-
|
|
44
|
+
archive the matching `npm run build`, `assets validate-animation`, browser
|
|
45
45
|
evidence, screenshot hashes, render outputs, and human or automated review
|
|
46
46
|
artifacts.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"name": "aura3d-
|
|
2
|
+
"name": "aura3d-animation-channel",
|
|
3
3
|
"version": "0.1.0",
|
|
4
4
|
"private": true,
|
|
5
5
|
"type": "module",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"test": "playwright test tests/route-health.spec.ts tests/storyboard-playback.spec.ts --workers=1"
|
|
12
12
|
},
|
|
13
13
|
"dependencies": {
|
|
14
|
-
"@aura3d/engine": "1.
|
|
14
|
+
"@aura3d/engine": "1.3.0"
|
|
15
15
|
},
|
|
16
16
|
"devDependencies": {
|
|
17
17
|
"@playwright/test": "^1.52.0",
|
|
@@ -9,6 +9,6 @@ export const assets = defineAuraAssets({
|
|
|
9
9
|
*
|
|
10
10
|
* npx @aura3d/cli@latest assets add ./assets/miko.glb --name miko
|
|
11
11
|
* npx @aura3d/cli@latest assets add ./assets/luma.glb --name luma
|
|
12
|
-
* npx @aura3d/cli@latest assets validate-
|
|
12
|
+
* npx @aura3d/cli@latest assets validate-animation
|
|
13
13
|
*/
|
|
14
14
|
});
|
|
@@ -4,37 +4,37 @@ import { AURAVOICE_AURA3D_PROMPT_ANIMATION_CONTRACT_ID } from "./contract";
|
|
|
4
4
|
|
|
5
5
|
export const episodeContractId = AURAVOICE_AURA3D_PROMPT_ANIMATION_CONTRACT_ID;
|
|
6
6
|
|
|
7
|
-
export type
|
|
7
|
+
export type AnimationAssetKey = "miko" | "luma" | "glowBroom" | "glowStones" | "moonLilies";
|
|
8
8
|
|
|
9
|
-
type
|
|
9
|
+
type TypedAnimationAssets = Partial<Record<AnimationAssetKey, AuraAssetRef<"model">>>;
|
|
10
10
|
|
|
11
|
-
const
|
|
11
|
+
const typedAnimationAssets = assets as TypedAnimationAssets;
|
|
12
12
|
|
|
13
|
-
export const
|
|
14
|
-
export const
|
|
15
|
-
export const
|
|
13
|
+
export const requiredAnimationCharacterAssets = ["miko", "luma"] as const;
|
|
14
|
+
export const optionalAnimationPropAssets = ["glowBroom", "glowStones", "moonLilies"] as const;
|
|
15
|
+
export const publicAnimationAssetInstructions = [
|
|
16
16
|
"npx @aura3d/cli@latest assets add ./assets/miko.glb --name miko",
|
|
17
17
|
"npx @aura3d/cli@latest assets add ./assets/luma.glb --name luma",
|
|
18
|
-
"npx @aura3d/cli@latest assets validate-
|
|
18
|
+
"npx @aura3d/cli@latest assets validate-animation"
|
|
19
19
|
] as const;
|
|
20
20
|
|
|
21
|
-
export const
|
|
22
|
-
export const
|
|
23
|
-
requiredCharacterAssets:
|
|
24
|
-
optionalPropAssets:
|
|
25
|
-
typedCharacterAssetCount:
|
|
26
|
-
missingCharacterAssets:
|
|
21
|
+
export const missingAnimationCharacterAssets = requiredAnimationCharacterAssets.filter((key) => !typedAnimationAssets[key]);
|
|
22
|
+
export const typedAnimationAssetSummary = {
|
|
23
|
+
requiredCharacterAssets: requiredAnimationCharacterAssets,
|
|
24
|
+
optionalPropAssets: optionalAnimationPropAssets,
|
|
25
|
+
typedCharacterAssetCount: requiredAnimationCharacterAssets.length - missingAnimationCharacterAssets.length,
|
|
26
|
+
missingCharacterAssets: missingAnimationCharacterAssets
|
|
27
27
|
} as const;
|
|
28
28
|
|
|
29
|
-
function typedAsset(key:
|
|
30
|
-
return
|
|
29
|
+
function typedAsset(key: AnimationAssetKey): AuraAssetRef<"model"> | undefined {
|
|
30
|
+
return typedAnimationAssets[key];
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
export const youtubeDraftMetadata = {
|
|
34
34
|
contractId: episodeContractId,
|
|
35
|
-
title: "Moon Garden Cleanup | Aura3D
|
|
35
|
+
title: "Moon Garden Cleanup | Aura3D Animation Channel",
|
|
36
36
|
description: "Two tiny robots clean a glowing moon garden with soft captions and reduced-flash visuals.",
|
|
37
|
-
tags: ["Aura3D", "kids
|
|
37
|
+
tags: ["Aura3D", "kids animation", "moon garden", "robots"],
|
|
38
38
|
madeForKids: true,
|
|
39
39
|
thumbnailCaptureTime: 10,
|
|
40
40
|
defaultLanguage: "en",
|
|
@@ -77,15 +77,15 @@ export const episodeSampleDescription = {
|
|
|
77
77
|
shotCount: 3,
|
|
78
78
|
speakingCharacters: ["miko", "luma"],
|
|
79
79
|
captionSource: "captions are derived one-to-one from the AuraVoice dialogue track",
|
|
80
|
-
performanceSource: "body, facial, gesture, blocking, and gaze cues are generated from the
|
|
80
|
+
performanceSource: "body, facial, gesture, blocking, and gaze cues are generated from the animation director",
|
|
81
81
|
musicAmbience: ["music:moon-garden-lullaby", "ambience:moon-garden-night"],
|
|
82
82
|
sfxCue: "sfx:glow-stone-chime",
|
|
83
83
|
thumbnailCaptureTime: youtubeDraftMetadata.thumbnailCaptureTime,
|
|
84
84
|
thumbnailSource: "same Aura3D scene state and AuraVoice timestamp as the render queue capture",
|
|
85
85
|
typedAssetSource: "./src/aura-assets",
|
|
86
|
-
requiredTypedAssets:
|
|
87
|
-
missingTypedAssets:
|
|
88
|
-
assetCommands:
|
|
86
|
+
requiredTypedAssets: requiredAnimationCharacterAssets,
|
|
87
|
+
missingTypedAssets: missingAnimationCharacterAssets,
|
|
88
|
+
assetCommands: publicAnimationAssetInstructions,
|
|
89
89
|
reviewPackageRequiredPaths: ["video", "captions", "thumbnail", "timeline", "audio-stems", "evidence-json", "youtube-draft-metadata"],
|
|
90
90
|
accessibilityProof: ["captions", "reduced motion", "high contrast"]
|
|
91
91
|
} as const;
|
|
@@ -167,7 +167,7 @@ export const episode = compilePromptEpisodePlan({
|
|
|
167
167
|
}
|
|
168
168
|
],
|
|
169
169
|
styleGuide: {
|
|
170
|
-
visualStyle: "rounded bedtime sci-fi
|
|
170
|
+
visualStyle: "rounded bedtime sci-fi animation with toy-like robot silhouettes",
|
|
171
171
|
palette: ["#081b2a", "#7de2ff", "#ffe18e", "#40ffbf", "#f8fff2"],
|
|
172
172
|
shapeLanguage: "circles, capsules, crescent props, and chunky moon-garden forms",
|
|
173
173
|
lighting: "soft blue night key, warm prop glows, no hard flashes",
|
|
@@ -19,11 +19,11 @@ import { assets } from "./aura-assets";
|
|
|
19
19
|
import {
|
|
20
20
|
episode,
|
|
21
21
|
episodeContractId,
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
type
|
|
22
|
+
missingAnimationCharacterAssets,
|
|
23
|
+
publicAnimationAssetInstructions,
|
|
24
|
+
requiredAnimationCharacterAssets,
|
|
25
|
+
typedAnimationAssetSummary,
|
|
26
|
+
type AnimationAssetKey
|
|
27
27
|
} from "./episode";
|
|
28
28
|
import {
|
|
29
29
|
accessibilityProofMetadata,
|
|
@@ -47,7 +47,7 @@ import {
|
|
|
47
47
|
|
|
48
48
|
declare global {
|
|
49
49
|
interface Window {
|
|
50
|
-
|
|
50
|
+
__AURA3D_ANIMATION_TEMPLATE__?: {
|
|
51
51
|
readonly contractId: string;
|
|
52
52
|
readonly template: string;
|
|
53
53
|
readonly storyBible: unknown;
|
|
@@ -75,11 +75,11 @@ const firstCaption = episode.captionTrack.cues[0];
|
|
|
75
75
|
const thumbnailCapture = renderOutputPackage.thumbnailCapture;
|
|
76
76
|
const thumbnailCaption = captionCueAtTime(episode.captionTrack, thumbnailCapture.time);
|
|
77
77
|
const storyBible = episode.storyBible;
|
|
78
|
-
const
|
|
78
|
+
const typedAnimationAssets = assets as Partial<Record<AnimationAssetKey, AuraAssetRef<"model">>>;
|
|
79
79
|
|
|
80
80
|
const captionOverlay = document.createElement("div");
|
|
81
81
|
captionOverlay.id = "caption-overlay";
|
|
82
|
-
captionOverlay.textContent = firstCaption?.text ?? firstStoryboardShot?.storyBeat ?? "Aura3D
|
|
82
|
+
captionOverlay.textContent = firstCaption?.text ?? firstStoryboardShot?.storyBeat ?? "Aura3D animation channel";
|
|
83
83
|
captionOverlay.style.cssText = [
|
|
84
84
|
"position:fixed",
|
|
85
85
|
"left:50%",
|
|
@@ -111,12 +111,12 @@ const shotPlaybackPlan = createShotPlaybackPlan({
|
|
|
111
111
|
});
|
|
112
112
|
|
|
113
113
|
const playbackProbeTimes = [1, 21, 43] as const;
|
|
114
|
-
const playbackProbeSamples = playbackProbeTimes.map((time) =>
|
|
114
|
+
const playbackProbeSamples = playbackProbeTimes.map((time) => sampleAnimationRouteAt(time));
|
|
115
115
|
captionOverlay.dataset.shotId = playbackProbeSamples[0]?.shotId ?? "";
|
|
116
116
|
captionOverlay.dataset.captionId = playbackProbeSamples[0]?.captionId ?? firstCaption?.captionId ?? "";
|
|
117
|
-
document.body.dataset.
|
|
118
|
-
document.body.dataset.
|
|
119
|
-
document.body.dataset.
|
|
117
|
+
document.body.dataset.animationShotCount = String(episode.shotTimeline.shots.length);
|
|
118
|
+
document.body.dataset.animationCaptionCount = String(episode.captionTrack.cues.length);
|
|
119
|
+
document.body.dataset.animationStoryBibleProps = String(storyBible.props.length);
|
|
120
120
|
|
|
121
121
|
const app = createAuraApp("#app", {
|
|
122
122
|
scene: scene()
|
|
@@ -143,14 +143,14 @@ const app = createAuraApp("#app", {
|
|
|
143
143
|
.position(-0.38, 0.2, 0.18)
|
|
144
144
|
.scale([0.12, 0.24, 0.04])
|
|
145
145
|
)
|
|
146
|
-
.add(labels.hud({ text: firstCaption?.text ?? firstStoryboardShot?.storyBeat ?? "Aura3D
|
|
146
|
+
.add(labels.hud({ text: firstCaption?.text ?? firstStoryboardShot?.storyBeat ?? "Aura3D animation channel", position: "bottom-center" }))
|
|
147
147
|
.add(lights.studio({ intensity: 1.2 }))
|
|
148
148
|
.add(effects.bloom({ intensity: 0.18, color: "#7de2ff" }))
|
|
149
149
|
.camera(camera.perspective({ position: [0, 1.4, 4.2], target: [0, 0.7, 0], fov: 42 })),
|
|
150
150
|
diagnostics: true,
|
|
151
151
|
metadata: {
|
|
152
152
|
contractId: episodeContractId,
|
|
153
|
-
template: "prompt-
|
|
153
|
+
template: "prompt-animation-channel",
|
|
154
154
|
runtimePlayback: "app.onFrame updates runtime nodes; createAuraApp is called once",
|
|
155
155
|
renderQueueItems: renderPlan.items.length,
|
|
156
156
|
renderPackageId: renderOutputPackage.packageId,
|
|
@@ -170,10 +170,10 @@ const app = createAuraApp("#app", {
|
|
|
170
170
|
thumbnailCaptionId: thumbnailCaption?.captionId,
|
|
171
171
|
deterministicCaptureItems: renderPlan.items.filter((item) => item.sourceSceneState).length,
|
|
172
172
|
deterministicScreenshotFixtures,
|
|
173
|
-
typedAssets:
|
|
174
|
-
requiredTypedAssets:
|
|
175
|
-
missingTypedAssets:
|
|
176
|
-
assetCommands:
|
|
173
|
+
typedAssets: typedAnimationAssetSummary,
|
|
174
|
+
requiredTypedAssets: requiredAnimationCharacterAssets,
|
|
175
|
+
missingTypedAssets: missingAnimationCharacterAssets,
|
|
176
|
+
assetCommands: publicAnimationAssetInstructions,
|
|
177
177
|
bridgeIssueCount: bridgeIssues.length,
|
|
178
178
|
bridgeSampleAtThumbnail: {
|
|
179
179
|
time: bridgeSampleAtThumbnail.time,
|
|
@@ -212,19 +212,19 @@ const app = createAuraApp("#app", {
|
|
|
212
212
|
}
|
|
213
213
|
});
|
|
214
214
|
|
|
215
|
-
window.
|
|
215
|
+
window.__AURA3D_ANIMATION_TEMPLATE__ = {
|
|
216
216
|
contractId: episodeContractId,
|
|
217
|
-
template: "prompt-
|
|
217
|
+
template: "prompt-animation-channel",
|
|
218
218
|
storyBible,
|
|
219
219
|
shotIds: episode.shotTimeline.shots.map((shot) => shot.shotId),
|
|
220
220
|
captionIds: episode.captionTrack.cues.map((caption) => caption.captionId),
|
|
221
221
|
playbackProbeTimes,
|
|
222
222
|
playbackProbeSamples,
|
|
223
223
|
renderQueueItems: renderPlan.items.length,
|
|
224
|
-
typedAssets:
|
|
225
|
-
requiredTypedAssets:
|
|
226
|
-
missingTypedAssets:
|
|
227
|
-
assetCommands:
|
|
224
|
+
typedAssets: typedAnimationAssetSummary,
|
|
225
|
+
requiredTypedAssets: requiredAnimationCharacterAssets,
|
|
226
|
+
missingTypedAssets: missingAnimationCharacterAssets,
|
|
227
|
+
assetCommands: publicAnimationAssetInstructions,
|
|
228
228
|
bridgeIssues,
|
|
229
229
|
promptAnimationEvidence,
|
|
230
230
|
publishReadiness,
|
|
@@ -235,7 +235,7 @@ window.__AURA3D_CARTOON_TEMPLATE__ = {
|
|
|
235
235
|
},
|
|
236
236
|
sampleRenderSourceWorkflow,
|
|
237
237
|
sampleAt(time: number) {
|
|
238
|
-
return
|
|
238
|
+
return sampleAnimationRouteAt(time);
|
|
239
239
|
}
|
|
240
240
|
};
|
|
241
241
|
|
|
@@ -254,13 +254,13 @@ installShotPlayback(app, shotPlaybackPlan, {
|
|
|
254
254
|
function createCharacterBody(
|
|
255
255
|
id: "miko" | "luma",
|
|
256
256
|
name: string,
|
|
257
|
-
assetKey:
|
|
257
|
+
assetKey: AnimationAssetKey,
|
|
258
258
|
position: readonly [number, number, number],
|
|
259
259
|
fallbackScale: readonly [number, number, number],
|
|
260
260
|
modelScale: number,
|
|
261
261
|
color: string
|
|
262
262
|
) {
|
|
263
|
-
const asset =
|
|
263
|
+
const asset = typedAnimationAssets[assetKey];
|
|
264
264
|
const runtime = game.runtimeNode(id, { tags: ["character", id, asset ? "typed-asset" : "primitive-fallback"] });
|
|
265
265
|
if (asset) {
|
|
266
266
|
return model(asset, { name: `${name} typed character asset` })
|
|
@@ -289,7 +289,7 @@ function createMouthCard(id: "miko:mouth" | "luma:mouth", name: string, position
|
|
|
289
289
|
.runtime(game.runtimeNode(id, { tags: ["mouth", "primitive", name.toLowerCase()] }));
|
|
290
290
|
}
|
|
291
291
|
|
|
292
|
-
function
|
|
292
|
+
function sampleAnimationRouteAt(time: number) {
|
|
293
293
|
const bridgeSample = sampleAuraVoiceBridgeAtTime(auraVoicePackage, time);
|
|
294
294
|
const caption = captionCueAtTime(episode.captionTrack, time);
|
|
295
295
|
const speakingCharacterId = bridgeSample.dialogue?.speakerId;
|
|
@@ -5,8 +5,8 @@ import {
|
|
|
5
5
|
createAuraVoiceVisemeTrack,
|
|
6
6
|
createCaptionTimingProof,
|
|
7
7
|
createGlbBlendshapeVisemeCue,
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
createAnimationPerformanceCoverage,
|
|
9
|
+
createAnimationRenderOutputPackageMetadata,
|
|
10
10
|
createPrimitiveMouthVisemeCues,
|
|
11
11
|
createPromptAnimationDeterministicScreenshotFixtureMetadata,
|
|
12
12
|
evaluatePromptAnimationPublishReadiness,
|
|
@@ -21,10 +21,10 @@ import {
|
|
|
21
21
|
episode,
|
|
22
22
|
episodeAudioCues,
|
|
23
23
|
episodeContractId,
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
24
|
+
missingAnimationCharacterAssets,
|
|
25
|
+
publicAnimationAssetInstructions,
|
|
26
|
+
requiredAnimationCharacterAssets,
|
|
27
|
+
typedAnimationAssetSummary,
|
|
28
28
|
youtubeDraftMetadata
|
|
29
29
|
} from "./episode";
|
|
30
30
|
|
|
@@ -34,7 +34,7 @@ export const renderContractId = episodeContractId;
|
|
|
34
34
|
|
|
35
35
|
export const renderPlan = episode.renderQueue;
|
|
36
36
|
|
|
37
|
-
export const renderOutputPackage =
|
|
37
|
+
export const renderOutputPackage = createAnimationRenderOutputPackageMetadata({
|
|
38
38
|
episodePlan: episode.episodePlan,
|
|
39
39
|
shotTimeline: episode.shotTimeline,
|
|
40
40
|
renderQueue: renderPlan,
|
|
@@ -255,7 +255,7 @@ export const phonemeVisemeDubSyncSourceProof = {
|
|
|
255
255
|
executionBoundary: "Source harness only; actual phoneme, viseme, and dub playback proof requires rendered frame/video evidence."
|
|
256
256
|
} as const;
|
|
257
257
|
|
|
258
|
-
export const performanceCoverage =
|
|
258
|
+
export const performanceCoverage = createAnimationPerformanceCoverage(episode.performance, episode.dialogueTrack);
|
|
259
259
|
|
|
260
260
|
export const reviewPackagePaths = renderOutputPackage.reviewPackagePaths;
|
|
261
261
|
|
|
@@ -283,10 +283,10 @@ export const sampleRenderSourceWorkflow = {
|
|
|
283
283
|
resolution: episode.episodePlan.runtime.resolution,
|
|
284
284
|
shotCount: episode.shotTimeline.shots.length,
|
|
285
285
|
speakingCharacterIds: Array.from(new Set(episode.dialogueTrack.lines.map((line) => line.speakerId))),
|
|
286
|
-
requiredTypedAssets:
|
|
287
|
-
typedAssetSummary:
|
|
288
|
-
missingTypedCharacterAssets:
|
|
289
|
-
assetCommands:
|
|
286
|
+
requiredTypedAssets: requiredAnimationCharacterAssets,
|
|
287
|
+
typedAssetSummary: typedAnimationAssetSummary,
|
|
288
|
+
missingTypedCharacterAssets: missingAnimationCharacterAssets,
|
|
289
|
+
assetCommands: publicAnimationAssetInstructions,
|
|
290
290
|
audioStemRoles: audioStemManifest.stems.map((stem) => stem.role),
|
|
291
291
|
requiresNoManualTimingEdits: true,
|
|
292
292
|
doesNotClaimRenderedArtifacts: true,
|
|
@@ -357,7 +357,7 @@ export const sampleRenderSourceWorkflow = {
|
|
|
357
357
|
"Fresh scaffold npm run build output",
|
|
358
358
|
"Browser route health and storyboard playback output",
|
|
359
359
|
"Typed character GLBs added through src/aura-assets.ts",
|
|
360
|
-
"npx @aura3d/cli@latest assets validate-
|
|
360
|
+
"npx @aura3d/cli@latest assets validate-animation output",
|
|
361
361
|
"Actual 60-second MP4/WebM render artifact",
|
|
362
362
|
"Actual thumbnail artifact captured from the same Aura3D scene state",
|
|
363
363
|
"Actual captions/timeline/audio-stems/evidence JSON files with hashes",
|
|
@@ -1,33 +1,33 @@
|
|
|
1
1
|
import { expect, test } from "@playwright/test";
|
|
2
2
|
|
|
3
|
-
test("
|
|
3
|
+
test("animation channel storyboard caption renders", async ({ page }) => {
|
|
4
4
|
await page.goto("/");
|
|
5
|
-
await expect(page.getByText(/Aura3D
|
|
5
|
+
await expect(page.getByText(/Aura3D animation channel|moon|robot/i)).toBeVisible();
|
|
6
6
|
});
|
|
7
7
|
|
|
8
|
-
test("storyboard playback, character performance, caption timing, cuts, and nonblank
|
|
8
|
+
test("storyboard playback, character performance, caption timing, cuts, and nonblank animation frames are sourced", async ({
|
|
9
9
|
page
|
|
10
10
|
}) => {
|
|
11
11
|
await page.goto("/");
|
|
12
12
|
|
|
13
13
|
const routeProof = (await page.evaluate(() => {
|
|
14
14
|
const template = (window as unknown as {
|
|
15
|
-
|
|
15
|
+
__AURA3D_ANIMATION_TEMPLATE__?: {
|
|
16
16
|
shotIds: readonly string[];
|
|
17
17
|
captionIds: readonly string[];
|
|
18
18
|
storyBible?: unknown;
|
|
19
19
|
playbackProbeSamples: readonly unknown[];
|
|
20
20
|
sampleAt(time: number): unknown;
|
|
21
21
|
};
|
|
22
|
-
}).
|
|
22
|
+
}).__AURA3D_ANIMATION_TEMPLATE__;
|
|
23
23
|
return {
|
|
24
24
|
shotIds: template?.shotIds ?? [],
|
|
25
25
|
captionIds: template?.captionIds ?? [],
|
|
26
26
|
storyBible: template?.storyBible,
|
|
27
27
|
samples: [1, 21, 43].map((time) => template?.sampleAt(time)),
|
|
28
28
|
playbackProbeSamples: template?.playbackProbeSamples ?? [],
|
|
29
|
-
bodyShotCount: document.body.dataset.
|
|
30
|
-
bodyCaptionCount: document.body.dataset.
|
|
29
|
+
bodyShotCount: document.body.dataset.animationShotCount,
|
|
30
|
+
bodyCaptionCount: document.body.dataset.animationCaptionCount
|
|
31
31
|
};
|
|
32
32
|
})) as {
|
|
33
33
|
shotIds: string[];
|
|
@@ -63,7 +63,7 @@ test("storyboard playback, character performance, caption timing, cuts, and nonb
|
|
|
63
63
|
expect(routeProof.samples.flatMap((sample) => sample.nodeUpdates ?? []).some((update) => update.characterId === "miko")).toBe(true);
|
|
64
64
|
expect(routeProof.samples.flatMap((sample) => sample.nodeUpdates ?? []).some((update) => update.characterId === "luma")).toBe(true);
|
|
65
65
|
expect(routeProof.storyBible?.props?.length).toBeGreaterThanOrEqual(3);
|
|
66
|
-
expect(routeProof.storyBible?.styleGuide?.visualStyle).toMatch(/
|
|
66
|
+
expect(routeProof.storyBible?.styleGuide?.visualStyle).toMatch(/animation/i);
|
|
67
67
|
expect(routeProof.storyBible?.shotList).toHaveLength(3);
|
|
68
68
|
expect(routeProof.playbackProbeSamples).toHaveLength(3);
|
|
69
69
|
expect(routeProof.bodyShotCount).toBe("3");
|