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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { expect, test } from "@playwright/test";
|
|
2
2
|
|
|
3
|
-
test("2D puppet query is quarantined from release-facing
|
|
3
|
+
test("2D puppet query is quarantined from release-facing animation-channel proof", async ({ page }) => {
|
|
4
4
|
await page.setViewportSize({ width: 1440, height: 900 });
|
|
5
5
|
await page.goto("/?view=puppet-2d&sampleTime=24");
|
|
6
6
|
|
|
@@ -9,14 +9,14 @@ test("2D puppet query is quarantined from release-facing cartoon-channel proof",
|
|
|
9
9
|
await expect(page.locator(".puppet-robot")).toHaveCount(0);
|
|
10
10
|
|
|
11
11
|
const quarantine = await page.evaluate(() => ({
|
|
12
|
-
puppetProof: (window as unknown as {
|
|
12
|
+
puppetProof: (window as unknown as { __AURA3D_ANIMATION_2D_PUPPET_PROOF__?: unknown }).__AURA3D_ANIMATION_2D_PUPPET_PROOF__,
|
|
13
13
|
template: (window as unknown as {
|
|
14
|
-
|
|
14
|
+
__AURA3D_ANIMATION_TEMPLATE__?: {
|
|
15
15
|
readonly releaseFacingViews?: readonly string[];
|
|
16
16
|
readonly rejectedViews?: readonly string[];
|
|
17
17
|
readonly rejectedViewReason?: string;
|
|
18
18
|
};
|
|
19
|
-
}).
|
|
19
|
+
}).__AURA3D_ANIMATION_TEMPLATE__
|
|
20
20
|
}));
|
|
21
21
|
|
|
22
22
|
expect(quarantine.puppetProof).toBeUndefined();
|
|
@@ -2,7 +2,7 @@ import { existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
|
2
2
|
import { dirname, resolve } from "node:path";
|
|
3
3
|
import { expect, test } from "@playwright/test";
|
|
4
4
|
|
|
5
|
-
test("sample episode visual renders a reviewable
|
|
5
|
+
test("sample episode visual renders a reviewable animation frame", async ({ page }) => {
|
|
6
6
|
await page.setViewportSize({ width: 1440, height: 900 });
|
|
7
7
|
await page.goto("/?sampleTime=24");
|
|
8
8
|
|
|
@@ -10,16 +10,16 @@ test("sample episode visual renders a reviewable cartoon frame", async ({ page }
|
|
|
10
10
|
await expect(frame).toBeVisible();
|
|
11
11
|
await expect(page.locator("[data-sample-caption]")).toContainText(/tiny circle|stones|cleanup/i);
|
|
12
12
|
|
|
13
|
-
const proof = await page.evaluate(() => window.
|
|
13
|
+
const proof = await page.evaluate(() => window.__AURA3D_ANIMATION_SAMPLE_EPISODE__);
|
|
14
14
|
expect(proof?.episodeId).toBe("moon-garden-cleanup-001");
|
|
15
15
|
expect(proof?.sample.shotId).toBe("shot-glow-stone-teamwork");
|
|
16
16
|
expect(proof?.visualLayer.characters).toEqual(["miko", "luma"]);
|
|
17
17
|
expect(proof?.visualLayer.screenshotTarget).toBe("#sample-episode-visual");
|
|
18
|
-
expect(proof?.visualLayer.styleGuide).toMatch(/
|
|
18
|
+
expect(proof?.visualLayer.styleGuide).toMatch(/animation/i);
|
|
19
19
|
expect(proof?.visualLayer.renderedBy).toBe("aura3d-scene");
|
|
20
20
|
expect(proof?.visualLayer.usesTypedAssets).toBe(true);
|
|
21
21
|
await expect(frame).toHaveAttribute("data-uses-typed-assets", "true");
|
|
22
|
-
await expect(page.locator(".
|
|
22
|
+
await expect(page.locator(".animation-robot").first()).toBeHidden();
|
|
23
23
|
|
|
24
24
|
const box = await frame.boundingBox();
|
|
25
25
|
expect(box?.width).toBeGreaterThan(900);
|
|
@@ -28,7 +28,7 @@ test("sample episode visual renders a reviewable cartoon frame", async ({ page }
|
|
|
28
28
|
const screenshot = await frame.screenshot({ animations: "disabled" });
|
|
29
29
|
expect(screenshot.byteLength).toBeGreaterThan(40_000);
|
|
30
30
|
|
|
31
|
-
const outputPath = resolve(findWorkspaceRoot(process.cwd()), "tests/reports/prompt-animation/
|
|
31
|
+
const outputPath = resolve(findWorkspaceRoot(process.cwd()), "tests/reports/prompt-animation/animation-sample-episode.png");
|
|
32
32
|
mkdirSync(dirname(outputPath), { recursive: true });
|
|
33
33
|
writeFileSync(outputPath, screenshot);
|
|
34
34
|
});
|
|
@@ -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
5
|
await expect(page.locator("#sample-episode-visual [data-sample-caption]")).toContainText(/moon|robot|lilies|stones/i);
|
|
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");
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# Animation Studio — you are the director
|
|
2
|
+
|
|
3
|
+
**You** (Claude Code, Codex, Cursor, the API, whatever coding agent the user is already
|
|
4
|
+
running) are the director. There is **no separate AI model and no API key** wired into this
|
|
5
|
+
studio. The user gives a prompt; **you** turn it into a finished scene by driving the
|
|
6
|
+
Scene-Tool CLI. You generate everything — the cast, the script/subtitles, the staging, the
|
|
7
|
+
performance. The CLI is your hands; the renderer is deterministic.
|
|
8
|
+
|
|
9
|
+
Every command edits one working document (`dist/scene/working.document.json`), is **validated**
|
|
10
|
+
before it commits, and is **rejected** if it would break the scene (off-set, missing clip,
|
|
11
|
+
bad framing). You cannot produce a broken document.
|
|
12
|
+
|
|
13
|
+
## The loop (run these as shell commands)
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
S="pnpm exec tsx --tsconfig tsconfig.base.json packages/create-aura3d/templates/animation-studio/scripts/animation-scene.ts"
|
|
17
|
+
# or, from an installed project: aura3d animation scene <args...>
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
1. **Start a skeleton from the prompt** (picks a SET template + shots + timeline; NO dialogue —
|
|
21
|
+
you write that):
|
|
22
|
+
```bash
|
|
23
|
+
$S new --prompt "two robots argue on a space station"
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
2. **Cast real characters** — resolve them from the live asset catalog by description. Use
|
|
27
|
+
DISTINCT queries so they look and move differently (each GLB brings its own clips):
|
|
28
|
+
```bash
|
|
29
|
+
$S cast add --id rusty --query "rusty industrial robot"
|
|
30
|
+
$S cast add --id sleek --query "sleek white android robot"
|
|
31
|
+
```
|
|
32
|
+
Provenance/license/scale are recorded automatically. `--scale N` overrides auto-fit.
|
|
33
|
+
|
|
34
|
+
3. **Write the script** — this is the story AND the subtitles AND the AuraVoice lip-sync
|
|
35
|
+
contract, all one timed track. Author every line yourself; make it an actual arc:
|
|
36
|
+
```bash
|
|
37
|
+
$S dialogue --line l1 --speaker rusty --text "You rerouted the coolant without telling me." --start 1 --end 6
|
|
38
|
+
$S dialogue --line l2 --speaker sleek --text "Because you'd have said no. The core was overheating." --start 7 --end 13
|
|
39
|
+
$S dialogue --line l3 --speaker rusty --text "That was MY system to balance." --start 21 --end 27
|
|
40
|
+
# …carry the argument to a turn and a resolution across the shots.
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
4. **Direct distinct performance per beat** — make the two characters DO different things so
|
|
44
|
+
it reads as an argument, not two idle loops. Move one in, push one back, face them off,
|
|
45
|
+
assign gestures. Motion is bounded by each GLB's clips — pick the clip that fits the beat:
|
|
46
|
+
```bash
|
|
47
|
+
$S block --character rusty --shot shot-1 --to -1.2,0 --yaw 1.2 --clip walk
|
|
48
|
+
$S block --character sleek --shot shot-1 --to 1.2,0 --yaw -1.2
|
|
49
|
+
$S gesture --character rusty --shot shot-3 --clip <a-clip-the-GLB-has>
|
|
50
|
+
$S shot retime --id shot-2 --duration 24 # give the escalation room
|
|
51
|
+
```
|
|
52
|
+
Use `$S show` to see the cast's real clip names before assigning them.
|
|
53
|
+
|
|
54
|
+
5. **Render** and review:
|
|
55
|
+
```bash
|
|
56
|
+
$S render
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Honest boundaries (do not oversell to the user)
|
|
60
|
+
|
|
61
|
+
- **You write the story.** The skeleton has no dialogue on purpose. If you skip step 3 there
|
|
62
|
+
are no captions — that is correct, not a bug.
|
|
63
|
+
- **Performance is limited by the asset's clips.** You can stage position, facing, camera, who
|
|
64
|
+
moves, and which existing clip plays — but you cannot synthesize motion a GLB doesn't contain.
|
|
65
|
+
If both characters look the same, you cast look-alike GLBs or left them on one clip; fix it by
|
|
66
|
+
casting distinct characters (step 2) and assigning per-beat clips/blocking (step 4).
|
|
67
|
+
- **Subtitles ≠ voice.** Aura3D never does TTS. The dialogue track you write is the timed
|
|
68
|
+
contract AuraVoice consumes later to generate the voice locked to this timeline.
|
|
69
|
+
|
|
70
|
+
The user's measure is "is this a watchable animation with a real story." That is **your** job as
|
|
71
|
+
director — the tools guarantee a *valid* document, not a *good* one. Make it good.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Animation Studio — Asset Licenses & Provenance
|
|
2
2
|
|
|
3
3
|
> **Honesty note:** the two character assets (`miko`, `luma`) are now **Aura3D-authored,
|
|
4
|
-
> procedurally generated CC0
|
|
4
|
+
> procedurally generated CC0 animation characters** — genuine authored rigged GLBs with a
|
|
5
5
|
> real face blendshape — that REPLACE the former reused three.js RobotExpressive + Mixamo
|
|
6
6
|
> Soldier placeholders. They are simple, low-poly, stylized helper robots (not finished
|
|
7
7
|
> production hero art); a commercial release would still benefit from art-directed
|
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
|
|
12
12
|
| Asset | File | What it actually is | License / provenance | Status |
|
|
13
13
|
|---|---|---|---|---|
|
|
14
|
-
| `miko` | `miko.authored.glb` | **Aura3D-authored procedural**
|
|
15
|
-
| `luma` | `luma.authored.glb` | **Aura3D-authored procedural**
|
|
14
|
+
| `miko` | `miko.authored.glb` | **Aura3D-authored procedural** animation helper robot (rounded, cyan). Skinned low-poly mesh, 7-joint skeleton (root/spine/head + 2 arms + 2 legs), clips `Idle/Wave/Walk`, and ONE real `mouthOpen` face blendshape (lower-lip drop) that drives lip-sync in pixels. Generated by `scripts/build-characters.ts`; verified to load through the engine GLTF loader by `scripts/validate-characters.ts`. | **CC0-1.0**, authored by Aura3D (no third-party source) | Authored — distinct stylized "Miko" |
|
|
15
|
+
| `luma` | `luma.authored.glb` | **Aura3D-authored procedural** animation helper robot (taller, warm-gold). Same rig/clip/morph structure as Miko, visibly different proportions + color. | **CC0-1.0**, authored by Aura3D (no third-party source) | Authored — distinct stylized "Luma" |
|
|
16
16
|
| `moonGarden` | `moonGarden.gltf` | 3-quad anchor stub (floor / glow-stone / skyline markers) — not real garden geometry | Aura3D starter stub, **MIT** | Placeholder — the live-3D route builds a primitive garden instead |
|
|
17
17
|
|
|
18
18
|
> The previous placeholders `miko.047f5e5f.glb` (three.js RobotExpressive, CC0) and
|
|
@@ -20,9 +20,9 @@
|
|
|
20
20
|
> or `aura.assets.json`.
|
|
21
21
|
|
|
22
22
|
## Catalog / starter pack
|
|
23
|
-
The `@aura3d/asset-index`
|
|
23
|
+
The `@aura3d/asset-index` animation starter pack maps to **Kenney CC0** game-kit GLBs
|
|
24
24
|
(`cdn.jsdelivr.net/gh/gchahal1982/aura3d-cc0-assets`). These are generic blocks (e.g.
|
|
25
|
-
"moon-garden" → a grass cube), suitable as license-clean filler, not art-directed
|
|
25
|
+
"moon-garden" → a grass cube), suitable as license-clean filler, not art-directed animation assets.
|
|
26
26
|
|
|
27
27
|
## Live-3D render path (`episode:render-3d`)
|
|
28
28
|
The real-3D path (`src/render-live-route.ts`) loads the two **Aura3D-authored** rigged GLBs
|
|
@@ -38,4 +38,4 @@ lilies, broom) — procedural primitives/emissive materials, no third-party art.
|
|
|
38
38
|
art-directed hero models with textures.)
|
|
39
39
|
2. Author a real **moon-garden set** + props (broom, glow-stones, lilies) or source license-clean equivalents.
|
|
40
40
|
3. Record/synthesize **dialogue audio** (none ships; AuraVoice is timing metadata only).
|
|
41
|
-
4. Re-run `assets validate-
|
|
41
|
+
4. Re-run `assets validate-animation --require-license --no-placeholders` against the new assets and update this file.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# Aura3D
|
|
1
|
+
# Aura3D Animation Studio Template
|
|
2
2
|
|
|
3
|
-
This template demonstrates a compact
|
|
3
|
+
This template demonstrates a compact animation production workspace on top of the
|
|
4
4
|
AuraVoice-to-Aura3D prompt-animation contract.
|
|
5
5
|
|
|
6
6
|
It uses:
|
|
@@ -24,7 +24,7 @@ Replace primitive characters with typed GLB assets by running:
|
|
|
24
24
|
```bash
|
|
25
25
|
npx @aura3d/cli@latest assets add ./assets/miko.glb --name miko
|
|
26
26
|
npx @aura3d/cli@latest assets add ./assets/luma.glb --name luma
|
|
27
|
-
npx @aura3d/cli@latest assets validate-
|
|
27
|
+
npx @aura3d/cli@latest assets validate-animation
|
|
28
28
|
```
|
|
29
29
|
|
|
30
30
|
Then import `assets.miko` and `assets.luma` from `src/aura-assets.ts` and pass them to `model(assets.miko)` and `model(assets.luma)`.
|
|
@@ -42,13 +42,13 @@ Do not replace this with a string asset id or a raw loader.
|
|
|
42
42
|
|
|
43
43
|
This scaffold intentionally does not claim publish readiness from source alone.
|
|
44
44
|
Before closing build, route, asset, screenshot, render, or visual-quality gates,
|
|
45
|
-
archive the matching `npm run build`, `assets validate-
|
|
45
|
+
archive the matching `npm run build`, `assets validate-animation`, browser
|
|
46
46
|
evidence, screenshot hashes, render outputs, and human or automated review
|
|
47
47
|
artifacts.
|
|
48
48
|
|
|
49
49
|
## Episode package scripts
|
|
50
50
|
|
|
51
|
-
The template includes the 1.1
|
|
51
|
+
The template includes the 1.1 Animation Studio command lane:
|
|
52
52
|
|
|
53
53
|
```bash
|
|
54
54
|
npm run episode:plan
|
|
@@ -77,6 +77,6 @@ dist/episodes/moon-garden-001/
|
|
|
77
77
|
If no browser video encoder adapter is available, `episode:render` writes
|
|
78
78
|
`episode.png-sequence-fallback.json` and deterministic PNG frame placeholders
|
|
79
79
|
under `frames/`. That fallback proves the package/review workflow, but it is not
|
|
80
|
-
publish-ready
|
|
80
|
+
publish-ready animation video evidence. A release build must attach a real
|
|
81
81
|
WebM/MP4 encoder, use typed character/set assets, and pass human visual review
|
|
82
82
|
before claiming the episode is ready to publish.
|