@aura3d/engine 1.0.2 → 1.0.5
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/README.md +331 -16
- package/dist/animation/AnimationClipEvents.d.ts +57 -0
- package/dist/animation/AnimationClipEvents.d.ts.map +1 -0
- package/dist/animation/AnimationClipEvents.js +171 -0
- package/dist/animation/AnimationClipEvents.js.map +1 -0
- package/dist/animation/AnimationClipRegistry.d.ts +76 -0
- package/dist/animation/AnimationClipRegistry.d.ts.map +1 -0
- package/dist/animation/AnimationClipRegistry.js +130 -0
- package/dist/animation/AnimationClipRegistry.js.map +1 -0
- package/dist/animation/AnimationController.d.ts +168 -0
- package/dist/animation/AnimationController.d.ts.map +1 -0
- package/dist/animation/AnimationController.js +619 -0
- package/dist/animation/AnimationController.js.map +1 -0
- package/dist/animation/HumanoidRetargeting.d.ts +76 -0
- package/dist/animation/HumanoidRetargeting.d.ts.map +1 -0
- package/dist/animation/HumanoidRetargeting.js +331 -0
- package/dist/animation/HumanoidRetargeting.js.map +1 -0
- package/dist/animation/browser-index.d.ts +18 -0
- package/dist/animation/browser-index.d.ts.map +1 -1
- package/dist/animation/browser-index.js +13 -0
- package/dist/animation/browser-index.js.map +1 -1
- package/dist/animation/index.d.ts +16 -1
- package/dist/animation/index.d.ts.map +1 -1
- package/dist/animation/index.js +11 -1
- package/dist/animation/index.js.map +1 -1
- package/dist/animation/threejs-compatibility/AnimationDiagnostics.d.ts.map +1 -1
- package/dist/animation/threejs-compatibility/AnimationDiagnostics.js +3 -5
- package/dist/animation/threejs-compatibility/AnimationDiagnostics.js.map +1 -1
- package/dist/assets/GLTFAnimationRuntime.js +1 -1
- package/dist/assets/GLTFLoader.js +1 -1
- package/dist/aura3d-cli/cli.js +194 -8
- package/dist/aura3d-cli/cli.js.map +1 -1
- package/dist/aura3d-cli/index.d.ts +280 -3
- package/dist/aura3d-cli/index.d.ts.map +1 -1
- package/dist/aura3d-cli/index.js +886 -4
- package/dist/aura3d-cli/index.js.map +1 -1
- package/dist/aura3d-cli/pull-bridge.d.ts +95 -0
- package/dist/aura3d-cli/pull-bridge.d.ts.map +1 -0
- package/dist/aura3d-cli/pull-bridge.js +247 -0
- package/dist/aura3d-cli/pull-bridge.js.map +1 -0
- package/dist/create-aura3d/index.d.ts +1 -1
- package/dist/create-aura3d/index.d.ts.map +1 -1
- package/dist/create-aura3d/index.js +9 -2
- package/dist/create-aura3d/index.js.map +1 -1
- package/dist/editor-runtime/ProjectSerializer.d.ts +74 -1
- package/dist/editor-runtime/ProjectSerializer.d.ts.map +1 -1
- package/dist/editor-runtime/ProjectSerializer.js +123 -6
- package/dist/editor-runtime/ProjectSerializer.js.map +1 -1
- package/dist/editor-runtime/TimelineModel.d.ts +18 -0
- package/dist/editor-runtime/TimelineModel.d.ts.map +1 -1
- package/dist/editor-runtime/TimelineModel.js +67 -3
- package/dist/editor-runtime/TimelineModel.js.map +1 -1
- package/dist/editor-runtime/TimelineRuntimeBridge.d.ts +98 -0
- package/dist/editor-runtime/TimelineRuntimeBridge.d.ts.map +1 -0
- package/dist/editor-runtime/TimelineRuntimeBridge.js +186 -0
- package/dist/editor-runtime/TimelineRuntimeBridge.js.map +1 -0
- package/dist/editor-runtime/index.d.ts +3 -1
- package/dist/editor-runtime/index.d.ts.map +1 -1
- package/dist/editor-runtime/index.js +1 -0
- package/dist/editor-runtime/index.js.map +1 -1
- package/dist/engine/agent-api/AnimationController.d.ts +607 -0
- package/dist/engine/agent-api/AnimationController.d.ts.map +1 -0
- package/dist/engine/agent-api/AnimationController.js +2192 -0
- package/dist/engine/agent-api/AnimationController.js.map +1 -0
- package/dist/engine/agent-api/AssetEvidence.d.ts +88 -0
- package/dist/engine/agent-api/AssetEvidence.d.ts.map +1 -0
- package/dist/engine/agent-api/AssetEvidence.js +157 -0
- package/dist/engine/agent-api/AssetEvidence.js.map +1 -0
- package/dist/engine/agent-api/AuraAppHandle.d.ts +55 -0
- package/dist/engine/agent-api/AuraAppHandle.d.ts.map +1 -0
- package/dist/engine/agent-api/AuraAppHandle.js +15 -0
- package/dist/engine/agent-api/AuraAppHandle.js.map +1 -0
- package/dist/engine/agent-api/AuraVoiceBridge.d.ts +96 -0
- package/dist/engine/agent-api/AuraVoiceBridge.d.ts.map +1 -0
- package/dist/engine/agent-api/AuraVoiceBridge.js +370 -0
- package/dist/engine/agent-api/AuraVoiceBridge.js.map +1 -0
- package/dist/engine/agent-api/CartoonDirector.d.ts +95 -0
- package/dist/engine/agent-api/CartoonDirector.d.ts.map +1 -0
- package/dist/engine/agent-api/CartoonDirector.js +342 -0
- package/dist/engine/agent-api/CartoonDirector.js.map +1 -0
- package/dist/engine/agent-api/CartoonPerformance.d.ts +149 -0
- package/dist/engine/agent-api/CartoonPerformance.d.ts.map +1 -0
- package/dist/engine/agent-api/CartoonPerformance.js +317 -0
- package/dist/engine/agent-api/CartoonPerformance.js.map +1 -0
- package/dist/engine/agent-api/CartoonRenderQueue.d.ts +132 -0
- package/dist/engine/agent-api/CartoonRenderQueue.d.ts.map +1 -0
- package/dist/engine/agent-api/CartoonRenderQueue.js +385 -0
- package/dist/engine/agent-api/CartoonRenderQueue.js.map +1 -0
- package/dist/engine/agent-api/CharacterAssembly.d.ts +126 -0
- package/dist/engine/agent-api/CharacterAssembly.d.ts.map +1 -0
- package/dist/engine/agent-api/CharacterAssembly.js +280 -0
- package/dist/engine/agent-api/CharacterAssembly.js.map +1 -0
- package/dist/engine/agent-api/DialoguePerformance.d.ts +150 -0
- package/dist/engine/agent-api/DialoguePerformance.d.ts.map +1 -0
- package/dist/engine/agent-api/DialoguePerformance.js +335 -0
- package/dist/engine/agent-api/DialoguePerformance.js.map +1 -0
- package/dist/engine/agent-api/FrameLoop.d.ts +70 -0
- package/dist/engine/agent-api/FrameLoop.d.ts.map +1 -0
- package/dist/engine/agent-api/FrameLoop.js +165 -0
- package/dist/engine/agent-api/FrameLoop.js.map +1 -0
- package/dist/engine/agent-api/GameAssetValidation.d.ts +279 -0
- package/dist/engine/agent-api/GameAssetValidation.d.ts.map +1 -0
- package/dist/engine/agent-api/GameAssetValidation.js +719 -0
- package/dist/engine/agent-api/GameAssetValidation.js.map +1 -0
- package/dist/engine/agent-api/GameEvidence.d.ts +148 -0
- package/dist/engine/agent-api/GameEvidence.d.ts.map +1 -0
- package/dist/engine/agent-api/GameEvidence.js +269 -0
- package/dist/engine/agent-api/GameEvidence.js.map +1 -0
- package/dist/engine/agent-api/GameRuntime.d.ts +931 -0
- package/dist/engine/agent-api/GameRuntime.d.ts.map +1 -0
- package/dist/engine/agent-api/GameRuntime.js +2229 -0
- package/dist/engine/agent-api/GameRuntime.js.map +1 -0
- package/dist/engine/agent-api/GameSceneBridge.d.ts +54 -0
- package/dist/engine/agent-api/GameSceneBridge.d.ts.map +1 -0
- package/dist/engine/agent-api/GameSceneBridge.js +110 -0
- package/dist/engine/agent-api/GameSceneBridge.js.map +1 -0
- package/dist/engine/agent-api/PromptAnimationContract.d.ts +278 -0
- package/dist/engine/agent-api/PromptAnimationContract.d.ts.map +1 -0
- package/dist/engine/agent-api/PromptAnimationContract.js +238 -0
- package/dist/engine/agent-api/PromptAnimationContract.js.map +1 -0
- package/dist/engine/agent-api/PromptAnimationEvidence.d.ts +183 -0
- package/dist/engine/agent-api/PromptAnimationEvidence.d.ts.map +1 -0
- package/dist/engine/agent-api/PromptAnimationEvidence.js +454 -0
- package/dist/engine/agent-api/PromptAnimationEvidence.js.map +1 -0
- package/dist/engine/agent-api/RuntimeNodeHandle.d.ts +100 -0
- package/dist/engine/agent-api/RuntimeNodeHandle.d.ts.map +1 -0
- package/dist/engine/agent-api/RuntimeNodeHandle.js +36 -0
- package/dist/engine/agent-api/RuntimeNodeHandle.js.map +1 -0
- package/dist/engine/agent-api/ShotTimeline.d.ts +179 -0
- package/dist/engine/agent-api/ShotTimeline.d.ts.map +1 -0
- package/dist/engine/agent-api/ShotTimeline.js +264 -0
- package/dist/engine/agent-api/ShotTimeline.js.map +1 -0
- package/dist/engine/agent-api/VisemeController.d.ts +89 -0
- package/dist/engine/agent-api/VisemeController.d.ts.map +1 -0
- package/dist/engine/agent-api/VisemeController.js +207 -0
- package/dist/engine/agent-api/VisemeController.js.map +1 -0
- package/dist/engine/agent-api/game-kits/fighting.d.ts +123 -0
- package/dist/engine/agent-api/game-kits/fighting.d.ts.map +1 -0
- package/dist/engine/agent-api/game-kits/fighting.js +483 -0
- package/dist/engine/agent-api/game-kits/fighting.js.map +1 -0
- package/dist/engine/agent-api/game-kits/index.d.ts +15 -0
- package/dist/engine/agent-api/game-kits/index.d.ts.map +1 -0
- package/dist/engine/agent-api/game-kits/index.js +6 -0
- package/dist/engine/agent-api/game-kits/index.js.map +1 -0
- package/dist/engine/agent-api/humanoid-walk-runtime.d.ts +18 -81
- package/dist/engine/agent-api/humanoid-walk-runtime.d.ts.map +1 -1
- package/dist/engine/agent-api/humanoid-walk-runtime.js +4 -279
- package/dist/engine/agent-api/humanoid-walk-runtime.js.map +1 -1
- package/dist/engine/agent-api/index.d.ts +490 -4
- package/dist/engine/agent-api/index.d.ts.map +1 -1
- package/dist/engine/agent-api/index.js +759 -1802
- package/dist/engine/agent-api/index.js.map +1 -1
- package/dist/engine/agent-api/particle-fountain-runtime.d.ts +5 -80
- package/dist/engine/agent-api/particle-fountain-runtime.d.ts.map +1 -1
- package/dist/engine/agent-api/particle-fountain-runtime.js +7 -291
- package/dist/engine/agent-api/particle-fountain-runtime.js.map +1 -1
- package/dist/engine/agent-api/product-viewer-runtime.d.ts +17 -107
- package/dist/engine/agent-api/product-viewer-runtime.d.ts.map +1 -1
- package/dist/engine/agent-api/product-viewer-runtime.js +4 -330
- package/dist/engine/agent-api/product-viewer-runtime.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/physics/CollisionVolumes.d.ts +57 -0
- package/dist/physics/CollisionVolumes.d.ts.map +1 -0
- package/dist/physics/CollisionVolumes.js +159 -0
- package/dist/physics/CollisionVolumes.js.map +1 -0
- package/dist/physics/HitboxWorld.d.ts +229 -0
- package/dist/physics/HitboxWorld.d.ts.map +1 -0
- package/dist/physics/HitboxWorld.js +640 -0
- package/dist/physics/HitboxWorld.js.map +1 -0
- package/dist/physics/KinematicBody.d.ts +157 -0
- package/dist/physics/KinematicBody.d.ts.map +1 -0
- package/dist/physics/KinematicBody.js +405 -0
- package/dist/physics/KinematicBody.js.map +1 -0
- package/dist/physics/KinematicWorld.d.ts +58 -0
- package/dist/physics/KinematicWorld.d.ts.map +1 -0
- package/dist/physics/KinematicWorld.js +246 -0
- package/dist/physics/KinematicWorld.js.map +1 -0
- package/dist/physics/index.d.ts +4 -0
- package/dist/physics/index.d.ts.map +1 -1
- package/dist/physics/index.js +4 -0
- package/dist/physics/index.js.map +1 -1
- package/dist/rendering/ForwardPass.js +2 -2
- package/dist/rendering/ShaderLibrary.js +2 -2
- package/dist/rendering/SkinnedLitMaterial.js +3 -3
- package/dist/rendering/SkinnedUnlitMaterial.js +3 -3
- package/dist/scene/Renderable.js +2 -2
- package/dist/scripting/VisualGraph.d.ts +2 -1
- package/dist/scripting/VisualGraph.d.ts.map +1 -1
- package/dist/scripting/VisualGraph.js +118 -1
- package/dist/scripting/VisualGraph.js.map +1 -1
- package/dist/scripting/VisualGraphContext.d.ts +123 -0
- package/dist/scripting/VisualGraphContext.d.ts.map +1 -0
- package/dist/scripting/VisualGraphContext.js +2 -0
- package/dist/scripting/VisualGraphContext.js.map +1 -0
- package/dist/scripting/VisualGraphExecutor.d.ts +6 -1
- package/dist/scripting/VisualGraphExecutor.d.ts.map +1 -1
- package/dist/scripting/VisualGraphExecutor.js +364 -7
- package/dist/scripting/VisualGraphExecutor.js.map +1 -1
- package/dist/scripting/VisualNodeCatalog.d.ts +1 -1
- package/dist/scripting/VisualNodeCatalog.d.ts.map +1 -1
- package/dist/scripting/VisualNodeCatalog.js +61 -1
- package/dist/scripting/VisualNodeCatalog.js.map +1 -1
- package/dist/scripting/index.d.ts +1 -0
- package/dist/scripting/index.d.ts.map +1 -1
- package/dist/scripting/index.js.map +1 -1
- package/package.json +193 -121
- package/templates/product-viewer/src/main.ts +1 -0
- package/dist/three-compat/ThreeApiInventory.d.ts +0 -18
- package/dist/three-compat/ThreeApiInventory.d.ts.map +0 -1
- package/dist/three-compat/ThreeApiInventory.js +0 -99
- package/dist/three-compat/ThreeApiInventory.js.map +0 -1
- package/dist/three-compat/ThreeCompatibilityMatrix.d.ts +0 -30
- package/dist/three-compat/ThreeCompatibilityMatrix.d.ts.map +0 -1
- package/dist/three-compat/ThreeCompatibilityMatrix.js +0 -69
- package/dist/three-compat/ThreeCompatibilityMatrix.js.map +0 -1
- package/dist/three-compat/animation/index.d.ts +0 -3
- package/dist/three-compat/animation/index.d.ts.map +0 -1
- package/dist/three-compat/animation/index.js +0 -2
- package/dist/three-compat/animation/index.js.map +0 -1
- package/dist/three-compat/cameras/index.d.ts +0 -24
- package/dist/three-compat/cameras/index.d.ts.map +0 -1
- package/dist/three-compat/cameras/index.js +0 -44
- package/dist/three-compat/cameras/index.js.map +0 -1
- package/dist/three-compat/controls/index.d.ts +0 -3
- package/dist/three-compat/controls/index.d.ts.map +0 -1
- package/dist/three-compat/controls/index.js +0 -2
- package/dist/three-compat/controls/index.js.map +0 -1
- package/dist/three-compat/core/Object3DCompat.d.ts +0 -62
- package/dist/three-compat/core/Object3DCompat.d.ts.map +0 -1
- package/dist/three-compat/core/Object3DCompat.js +0 -112
- package/dist/three-compat/core/Object3DCompat.js.map +0 -1
- package/dist/three-compat/core/RaycasterCompat.d.ts +0 -18
- package/dist/three-compat/core/RaycasterCompat.d.ts.map +0 -1
- package/dist/three-compat/core/RaycasterCompat.js +0 -28
- package/dist/three-compat/core/RaycasterCompat.js.map +0 -1
- package/dist/three-compat/core/SceneCompat.d.ts +0 -8
- package/dist/three-compat/core/SceneCompat.d.ts.map +0 -1
- package/dist/three-compat/core/SceneCompat.js +0 -8
- package/dist/three-compat/core/SceneCompat.js.map +0 -1
- package/dist/three-compat/geometries/index.d.ts +0 -67
- package/dist/three-compat/geometries/index.d.ts.map +0 -1
- package/dist/three-compat/geometries/index.js +0 -114
- package/dist/three-compat/geometries/index.js.map +0 -1
- package/dist/three-compat/helpers/index.d.ts +0 -40
- package/dist/three-compat/helpers/index.d.ts.map +0 -1
- package/dist/three-compat/helpers/index.js +0 -129
- package/dist/three-compat/helpers/index.js.map +0 -1
- package/dist/three-compat/index.d.ts +0 -32
- package/dist/three-compat/index.d.ts.map +0 -1
- package/dist/three-compat/index.js +0 -22
- package/dist/three-compat/index.js.map +0 -1
- package/dist/three-compat/lights/index.d.ts +0 -35
- package/dist/three-compat/lights/index.d.ts.map +0 -1
- package/dist/three-compat/lights/index.js +0 -39
- package/dist/three-compat/lights/index.js.map +0 -1
- package/dist/three-compat/loaders/index.d.ts +0 -54
- package/dist/three-compat/loaders/index.d.ts.map +0 -1
- package/dist/three-compat/loaders/index.js +0 -79
- package/dist/three-compat/loaders/index.js.map +0 -1
- package/dist/three-compat/materials/index.d.ts +0 -70
- package/dist/three-compat/materials/index.d.ts.map +0 -1
- package/dist/three-compat/materials/index.js +0 -85
- package/dist/three-compat/materials/index.js.map +0 -1
- package/dist/three-compat/math/index.d.ts +0 -34
- package/dist/three-compat/math/index.d.ts.map +0 -1
- package/dist/three-compat/math/index.js +0 -90
- package/dist/three-compat/math/index.js.map +0 -1
- package/dist/three-compat/migration/CompatibilityWarnings.d.ts +0 -6
- package/dist/three-compat/migration/CompatibilityWarnings.d.ts.map +0 -1
- package/dist/three-compat/migration/CompatibilityWarnings.js +0 -8
- package/dist/three-compat/migration/CompatibilityWarnings.js.map +0 -1
- package/dist/three-compat/migration/ImportMap.d.ts +0 -2
- package/dist/three-compat/migration/ImportMap.d.ts.map +0 -1
- package/dist/three-compat/migration/ImportMap.js +0 -10
- package/dist/three-compat/migration/ImportMap.js.map +0 -1
- package/dist/three-compat/migration/ThreeToA3DAdapter.d.ts +0 -8
- package/dist/three-compat/migration/ThreeToA3DAdapter.d.ts.map +0 -1
- package/dist/three-compat/migration/ThreeToA3DAdapter.js +0 -20
- package/dist/three-compat/migration/ThreeToA3DAdapter.js.map +0 -1
- package/dist/three-compat/postprocessing/index.d.ts +0 -2
- package/dist/three-compat/postprocessing/index.d.ts.map +0 -1
- package/dist/three-compat/postprocessing/index.js +0 -2
- package/dist/three-compat/postprocessing/index.js.map +0 -1
- package/dist/three-compat/render-targets/index.d.ts +0 -17
- package/dist/three-compat/render-targets/index.d.ts.map +0 -1
- package/dist/three-compat/render-targets/index.js +0 -29
- package/dist/three-compat/render-targets/index.js.map +0 -1
- package/dist/three-compat/shaders/index.d.ts +0 -3
- package/dist/three-compat/shaders/index.d.ts.map +0 -1
- package/dist/three-compat/shaders/index.js +0 -3
- package/dist/three-compat/shaders/index.js.map +0 -1
- package/dist/three-compat/textures/index.d.ts +0 -19
- package/dist/three-compat/textures/index.d.ts.map +0 -1
- package/dist/three-compat/textures/index.js +0 -24
- package/dist/three-compat/textures/index.js.map +0 -1
package/README.md
CHANGED
|
@@ -5,13 +5,40 @@
|
|
|
5
5
|
[](./LICENSE)
|
|
6
6
|
[](https://www.typescriptlang.org/)
|
|
7
7
|
|
|
8
|
-
Aura3D is an AI-native TypeScript 3D SDK for browser 3D apps, prompt-to-code scenes, GLB/glTF product viewers,
|
|
8
|
+
Aura3D is an AI-native TypeScript 3D SDK for browser 3D apps, prompt-to-code scenes, GLB/glTF product viewers, browser-native games, Vite templates, typed asset workflows, diagnostics, screenshots, and static deployment checks.
|
|
9
9
|
|
|
10
10
|
Describe the scene. Keep the TypeScript. Ship the browser app.
|
|
11
11
|
|
|
12
|
-
Aura3D is built for developers and AI coding agents that need real 3D software, not a blank canvas and renderer glue. It gives agents maintained scene kits, typed GLB/glTF assets, product-viewer workflows, route-health diagnostics, screenshot evidence, and deployment checks through a public TypeScript API.
|
|
12
|
+
Aura3D is built for developers and AI coding agents that need real 3D software, not a blank canvas and renderer glue. It gives agents maintained scene kits, typed GLB/glTF assets, product-viewer workflows, browser-game workflows, route-health diagnostics, screenshot evidence, and deployment checks through a public TypeScript API.
|
|
13
13
|
|
|
14
|
-
Use Aura3D when you are
|
|
14
|
+
Use Aura3D when you are building browser 3D apps, prompt-authored scenes, product configurators, GLB viewers, browser-native game showcases, static-deployed interactive websites, or AI-generated 3D scene tooling.
|
|
15
|
+
|
|
16
|
+
## Current release
|
|
17
|
+
|
|
18
|
+
`@aura3d/engine@1.0.5` is the current release candidate for browser-native game routes, visible GLB animation runtime evidence, prompt-cartoon playback, AuraVoice timing packages, typed assets, diagnostics, screenshots, and readiness evidence. The root engine runtime remains free of Three.js imports; Three.js migration support lives in the separately installed `@aura3d/three-compat` package.
|
|
19
|
+
|
|
20
|
+
Registry status before publish: npm `latest` still points at `@aura3d/engine@1.0.3`, and `@aura3d/cli` / `create-aura3d` must be published before the `npx ...@latest` commands below work for external users. Do not claim the 1.0.5 release is live until registry verification passes.
|
|
21
|
+
|
|
22
|
+
## Aura3D 1.0.5 asset catalog
|
|
23
|
+
|
|
24
|
+
Aura3D 1.0.5 includes the catalog-first asset workflow for AI coding agents. When a prompt names a real object, agents should search the hosted Aura3D catalog before writing scene code:
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
npx @aura3d/cli@latest assets search "battle-worn knight helmet"
|
|
28
|
+
npx @aura3d/cli@latest assets resolve "battle-worn knight helmet" --name helmet
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
The resolver pulls only verified auto-pullable candidates into the existing typed asset pipeline, then scene code uses `model(assets.helmet)`. Unverified or marketplace candidates stay as deep-links until the user approves and supplies the asset.
|
|
32
|
+
## Aura3D 1.0.5 runtime launch track
|
|
33
|
+
|
|
34
|
+
Aura3D 1.0.5 is the active runtime and animation evidence foundation for the next public showcase wave:
|
|
35
|
+
|
|
36
|
+
- `game runtime`: mutable runtime nodes, app-owned frame loops, input, kinematic bodies, hitboxes, combat events, camera direction, effects, and evidence for browser-native game routes.
|
|
37
|
+
- `fighting-game template`: `npx create-aura3d@latest my-fighter --template fighting-game` scaffolds a public-API playable starter using typed assets, `app.input(...)`, `app.onFrame(...)`, `game.kinematicBody(...)`, `game.combatWorld(...)`, and `app.evidence(...)`.
|
|
38
|
+
- `prompt animation`: `npx create-aura3d@latest my-episode --template prompt-cartoon-channel` scaffolds structured episode plans, storyboards, shot timelines, captions, visemes, render queues, and evidence for prompt-authored cartoon/video workflows. The shorter `cartoon-channel` template name remains supported.
|
|
39
|
+
- `AuraVoice bridge`: AuraVoice owns script/audio/caption/viseme timing; Aura3D owns typed scene generation, character performance, camera choreography, rendering, screenshots, and visual evidence.
|
|
40
|
+
|
|
41
|
+
Aura Clash requires Aura3D 1.0.5 runtime and animation evidence before it should be marketed as a polished public game showcase. Until the runtime, screenshot, route, GLB, package-smoke, and visual approval gates pass, Aura Clash remains a development showcase proving the direction of the public API.
|
|
15
42
|
|
|
16
43
|
## Install
|
|
17
44
|
|
|
@@ -46,11 +73,26 @@ import { createAuraApp, sceneKits } from "@aura3d/engine";
|
|
|
46
73
|
- AI-generated 3D scenes that remain editable TypeScript.
|
|
47
74
|
- Browser 3D apps built with a stable SDK instead of improvised renderer glue.
|
|
48
75
|
- Typed GLB/glTF product viewers, product configurators, and model showcases.
|
|
76
|
+
- Browser-native games with playable routes, HUDs, input, evidence, tests, and deploy-ready output.
|
|
49
77
|
- Prompt-to-3D workflows for AI coding agents, Cursor, Claude, Codex, and other assistants.
|
|
50
78
|
- WebGL/WebGPU-ready examples with maintained scene kits and diagnostics.
|
|
51
79
|
- Vite 3D starter apps with route health, screenshot tests, and deploy checks.
|
|
52
80
|
- Static-deployed 3D websites where proof, screenshots, and reliability matter.
|
|
53
|
-
|
|
81
|
+
|
|
82
|
+
## Flagship game showcase
|
|
83
|
+
|
|
84
|
+
AuraClash is the active Aura3D game-runtime proof target: an original 1v1 browser arena fighter built with `@aura3d/engine` public APIs.
|
|
85
|
+
|
|
86
|
+
The showcase includes:
|
|
87
|
+
|
|
88
|
+
- typed or validated stylized fighter assets;
|
|
89
|
+
- typed asset members from `src/aura-assets.ts`;
|
|
90
|
+
- `model(assets.x)` runtime usage;
|
|
91
|
+
- arena primitives, lighting, effects, camera composition, and material polish;
|
|
92
|
+
- arcade movement, hitboxes, guard state, meter, AI pressure, and results;
|
|
93
|
+
- evidence routes, accessibility settings, poster capture, Playwright contracts, sitemap and robots integration, and marketing homepage placement.
|
|
94
|
+
|
|
95
|
+
Open the source route at `apps/aura-clash-showcase/`.
|
|
54
96
|
|
|
55
97
|
## 30-second product viewer
|
|
56
98
|
|
|
@@ -68,6 +110,269 @@ createAuraApp("#app", {
|
|
|
68
110
|
|
|
69
111
|
The safe API uses generated refs such as `assets.robot`. Do not write `model("robot")`, hand-written GLB URLs, or invented asset ids.
|
|
70
112
|
|
|
113
|
+
## Aura3D 1.0.5 game runtime example
|
|
114
|
+
|
|
115
|
+
Add typed assets before writing model code:
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
npx @aura3d/cli@latest assets add ./assets/fighter.glb --name fighter
|
|
119
|
+
npx @aura3d/cli@latest assets add ./assets/opponent.glb --name opponent
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
Then use the public game facade and stage builders:
|
|
123
|
+
|
|
124
|
+
```ts
|
|
125
|
+
import {
|
|
126
|
+
AnimationController,
|
|
127
|
+
createAuraApp,
|
|
128
|
+
game,
|
|
129
|
+
games,
|
|
130
|
+
lights,
|
|
131
|
+
model,
|
|
132
|
+
scene
|
|
133
|
+
} from "@aura3d/engine";
|
|
134
|
+
import { assets } from "./aura-assets";
|
|
135
|
+
|
|
136
|
+
const stage = games.fighting.stagePreset("neon-dojo");
|
|
137
|
+
const stageIssues = games.fighting.validateStage(stage);
|
|
138
|
+
|
|
139
|
+
const fighting = game.fighting({
|
|
140
|
+
playerId: "player",
|
|
141
|
+
opponentId: "opponent",
|
|
142
|
+
stage: { width: stage.combatBounds.maxX - stage.combatBounds.minX },
|
|
143
|
+
autoListen: true
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
const app = createAuraApp("#app", {
|
|
147
|
+
scene: stage.nodes
|
|
148
|
+
.reduce((builder, node) => builder.add(node), scene())
|
|
149
|
+
.add(model(assets.fighter).runtime(game.runtimeNode("player", { tags: ["fighter", "local"] })))
|
|
150
|
+
.add(model(assets.opponent).runtime(game.runtimeNode("opponent", { tags: ["fighter", "ai"] })))
|
|
151
|
+
.add(lights.studio())
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
const player = app.nodes.require("player");
|
|
155
|
+
const opponent = app.nodes.require("opponent");
|
|
156
|
+
const animation = new AnimationController({
|
|
157
|
+
clipRegistry: assets.fighter,
|
|
158
|
+
requiredClips: ["Idle", "Walk", "LightPunch"],
|
|
159
|
+
suppressRootMotion: true
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
const touchLayout = game.touchControls({
|
|
163
|
+
width: window.innerWidth,
|
|
164
|
+
height: window.innerHeight,
|
|
165
|
+
buttons: [
|
|
166
|
+
{ action: "jump", label: "Jump", binding: "TouchJump" },
|
|
167
|
+
{ action: "light", label: "Light", binding: "TouchLight" }
|
|
168
|
+
]
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
const jumpAssist = game.jumpAssist({ coyoteMs: 100, bufferMs: 120 });
|
|
172
|
+
const hud = game.hud.bindings([
|
|
173
|
+
game.hud.health({ actorId: "player", label: "Player health" }),
|
|
174
|
+
game.hud.health({ actorId: "opponent", label: "Opponent health" }),
|
|
175
|
+
game.hud.timer({ valuePath: "round.timeRemaining" }),
|
|
176
|
+
game.hud.debugToggle({ action: "debug", statePath: "debug.visible" })
|
|
177
|
+
]);
|
|
178
|
+
const accessibility = [
|
|
179
|
+
game.accessibility.label({ targetId: "player-health", label: "Player health", live: true }),
|
|
180
|
+
game.accessibility.pauseControls({ actions: ["pause", "Escape"], resumeActions: ["pause", "Enter"], menuId: "pause-menu" })
|
|
181
|
+
];
|
|
182
|
+
|
|
183
|
+
app.onFrame(({ dt }) => {
|
|
184
|
+
const snapshot = fighting.update(dt);
|
|
185
|
+
animation.update(dt);
|
|
186
|
+
|
|
187
|
+
jumpAssist.update(dt, {
|
|
188
|
+
grounded: fighting.bodies.player.grounded,
|
|
189
|
+
jumpPressed: fighting.input.pressed("jump")
|
|
190
|
+
});
|
|
191
|
+
if (jumpAssist.consume()) fighting.bodies.player.jump();
|
|
192
|
+
|
|
193
|
+
if (fighting.input.pressed("light")) {
|
|
194
|
+
animation.crossFade("LightPunch", 0.08, { restart: true });
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
player.setPosition(snapshot.player.position[0], snapshot.player.position[1], snapshot.player.position[2]);
|
|
198
|
+
opponent.setPosition(snapshot.opponent.position[0], snapshot.opponent.position[1], snapshot.opponent.position[2]);
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
const replayPlan = game.inputReplay(fighting.input.recorded(), { fps: 60, label: "round-1" });
|
|
202
|
+
const replayInput = game.input({
|
|
203
|
+
actions: fighting.controls.actions,
|
|
204
|
+
axes: fighting.controls.axes,
|
|
205
|
+
autoListen: false
|
|
206
|
+
});
|
|
207
|
+
const replayDriver = game.inputReplayDriver(replayInput, replayPlan);
|
|
208
|
+
|
|
209
|
+
const colliders = [
|
|
210
|
+
game.collider.capsule({ id: "player-body", center: fighting.bodies.player.position, radius: 0.34, height: 1.7 }),
|
|
211
|
+
game.collider.capsule({ id: "opponent-body", center: fighting.bodies.opponent.position, radius: 0.34, height: 1.7 })
|
|
212
|
+
];
|
|
213
|
+
const overlay = game.debug.overlay({
|
|
214
|
+
runtime: app.runtime,
|
|
215
|
+
input: fighting.input,
|
|
216
|
+
bodies: [fighting.bodies.player, fighting.bodies.opponent],
|
|
217
|
+
combat: fighting.combat,
|
|
218
|
+
effects: fighting.effects,
|
|
219
|
+
camera: fighting.camera,
|
|
220
|
+
colliders,
|
|
221
|
+
warnings: stageIssues.map((issue) => issue.message)
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
const evidence = app.evidence({
|
|
225
|
+
input: fighting.input,
|
|
226
|
+
bodies: [fighting.bodies.player, fighting.bodies.opponent],
|
|
227
|
+
combat: fighting.combat,
|
|
228
|
+
effects: fighting.effects,
|
|
229
|
+
camera: fighting.camera,
|
|
230
|
+
hud,
|
|
231
|
+
accessibility,
|
|
232
|
+
stage: { id: stage.id, safeZones: true, bounds: stage.combatBounds, warnings: stageIssues.map((issue) => issue.message) }
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
console.log(touchLayout.controls.length, replayDriver.snapshot(), overlay.sections, evidence.systems);
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
## Aura3D 1.0.5 prompt-cartoon and AuraVoice example
|
|
239
|
+
|
|
240
|
+
Prompt-cartoon routes use typed assets, contract artifacts, shot playback, captions, visemes, and AuraVoice timing packages.
|
|
241
|
+
|
|
242
|
+
```ts
|
|
243
|
+
import {
|
|
244
|
+
collectPromptAnimationEvidence,
|
|
245
|
+
compilePromptEpisodePlan,
|
|
246
|
+
createAudioStemManifest,
|
|
247
|
+
createAuraApp,
|
|
248
|
+
createAuraVoiceBridgePackage,
|
|
249
|
+
createAuraVoiceVisemeTrack,
|
|
250
|
+
createCartoonRenderOutputPackageMetadata,
|
|
251
|
+
createGlbBlendshapeVisemeCue,
|
|
252
|
+
createPrimitiveMouthVisemeCues,
|
|
253
|
+
createShotPlaybackPlan,
|
|
254
|
+
evaluatePromptAnimationPublishReadiness,
|
|
255
|
+
game,
|
|
256
|
+
installShotPlayback,
|
|
257
|
+
lights,
|
|
258
|
+
model,
|
|
259
|
+
scene,
|
|
260
|
+
sampleAuraVoiceBridgeAtTime,
|
|
261
|
+
validateAuraVoiceBridgePackage
|
|
262
|
+
} from "@aura3d/engine";
|
|
263
|
+
import { assets } from "./aura-assets";
|
|
264
|
+
|
|
265
|
+
const plan = compilePromptEpisodePlan({
|
|
266
|
+
episodeId: "moon-garden",
|
|
267
|
+
title: "Moon Garden Helpers",
|
|
268
|
+
prompt: "Two robots clean a glowing moon garden.",
|
|
269
|
+
language: "en",
|
|
270
|
+
runtime: { duration: 30, frameRate: 30, resolution: { width: 1280, height: 720 }, maxTimingDriftFrames: 1 },
|
|
271
|
+
characters: [
|
|
272
|
+
{ id: "miko", name: "Miko", role: "hero", asset: assets.miko },
|
|
273
|
+
{ id: "luma", name: "Luma", role: "sidekick", asset: assets.luma }
|
|
274
|
+
],
|
|
275
|
+
locations: [{ id: "moon-garden", name: "Moon Garden", mood: "soft neon bedtime" }],
|
|
276
|
+
beats: [
|
|
277
|
+
{
|
|
278
|
+
id: "beat-001",
|
|
279
|
+
locationId: "moon-garden",
|
|
280
|
+
summary: "Miko and Luma clean the glowing weeds.",
|
|
281
|
+
visualIntent: "Two readable typed characters, safe captions, and gentle light.",
|
|
282
|
+
duration: 8,
|
|
283
|
+
characters: ["miko", "luma"],
|
|
284
|
+
dialogue: [{ speakerId: "miko", text: "The moon garden is glowing again.", emotion: "curious" }]
|
|
285
|
+
}
|
|
286
|
+
],
|
|
287
|
+
route: "/episodes/moon-garden"
|
|
288
|
+
});
|
|
289
|
+
|
|
290
|
+
const visemes = createAuraVoiceVisemeTrack({
|
|
291
|
+
episodeId: plan.episodePlan.episodeId,
|
|
292
|
+
language: plan.episodePlan.language,
|
|
293
|
+
frameRate: plan.shotTimeline.frameRate,
|
|
294
|
+
cues: plan.dialogueTrack.lines.flatMap((line) =>
|
|
295
|
+
createPrimitiveMouthVisemeCues({
|
|
296
|
+
characterId: line.speakerId,
|
|
297
|
+
speakerId: line.speakerId,
|
|
298
|
+
lineId: line.lineId,
|
|
299
|
+
startTime: line.startTime,
|
|
300
|
+
endTime: line.endTime
|
|
301
|
+
}).map((cue) => createGlbBlendshapeVisemeCue(cue))
|
|
302
|
+
)
|
|
303
|
+
});
|
|
304
|
+
|
|
305
|
+
const audioStems = createAudioStemManifest({
|
|
306
|
+
episodeId: plan.episodePlan.episodeId,
|
|
307
|
+
duration: plan.dialogueTrack.duration,
|
|
308
|
+
stems: plan.dialogueTrack.lines.map((line) => ({
|
|
309
|
+
id: `audio:${line.lineId}`,
|
|
310
|
+
role: "dialogue",
|
|
311
|
+
path: line.audioFile ?? `assets/audio/${line.language}/${line.lineId}.wav`,
|
|
312
|
+
startTime: line.startTime,
|
|
313
|
+
duration: line.endTime - line.startTime,
|
|
314
|
+
language: line.language
|
|
315
|
+
}))
|
|
316
|
+
});
|
|
317
|
+
|
|
318
|
+
const renderOutputPackage = createCartoonRenderOutputPackageMetadata({
|
|
319
|
+
episodePlan: plan.episodePlan,
|
|
320
|
+
shotTimeline: plan.shotTimeline,
|
|
321
|
+
renderQueue: plan.renderQueue
|
|
322
|
+
});
|
|
323
|
+
|
|
324
|
+
const bridge = createAuraVoiceBridgePackage({
|
|
325
|
+
episodePlan: plan.episodePlan,
|
|
326
|
+
storyboard: plan.storyboard,
|
|
327
|
+
shotTimeline: plan.shotTimeline,
|
|
328
|
+
dialogueTrack: plan.dialogueTrack,
|
|
329
|
+
captionTrack: plan.captionTrack,
|
|
330
|
+
visemes,
|
|
331
|
+
audioStems,
|
|
332
|
+
renderQueue: plan.renderQueue,
|
|
333
|
+
renderOutputPackage
|
|
334
|
+
});
|
|
335
|
+
const bridgeIssues = validateAuraVoiceBridgePackage(bridge);
|
|
336
|
+
|
|
337
|
+
const playback = createShotPlaybackPlan({
|
|
338
|
+
timeline: plan.shotTimeline,
|
|
339
|
+
performance: plan.performance,
|
|
340
|
+
captions: plan.captionTrack,
|
|
341
|
+
visemes,
|
|
342
|
+
runtimeNodeByCharacterId: { miko: "miko", luma: "luma" },
|
|
343
|
+
loop: true
|
|
344
|
+
});
|
|
345
|
+
|
|
346
|
+
const app = createAuraApp("#app", {
|
|
347
|
+
scene: scene()
|
|
348
|
+
.add(model(assets.miko).runtime(game.runtimeNode("miko", { tags: ["character"] })))
|
|
349
|
+
.add(model(assets.luma).runtime(game.runtimeNode("luma", { tags: ["character"] })))
|
|
350
|
+
.add(lights.studio())
|
|
351
|
+
});
|
|
352
|
+
installShotPlayback(app, playback);
|
|
353
|
+
|
|
354
|
+
const sample = sampleAuraVoiceBridgeAtTime(bridge, 3);
|
|
355
|
+
const evidence = collectPromptAnimationEvidence({
|
|
356
|
+
bridgePackage: bridge,
|
|
357
|
+
screenshots: [
|
|
358
|
+
{
|
|
359
|
+
id: "shot-001",
|
|
360
|
+
time: sample.time,
|
|
361
|
+
path: "artifacts/screenshots/shot-001.png",
|
|
362
|
+
hash: "sha256:replace-with-rendered-screenshot-hash",
|
|
363
|
+
width: 1280,
|
|
364
|
+
height: 720
|
|
365
|
+
}
|
|
366
|
+
],
|
|
367
|
+
routeHealth: { status: "pass" }
|
|
368
|
+
});
|
|
369
|
+
const readiness = evaluatePromptAnimationPublishReadiness(evidence);
|
|
370
|
+
|
|
371
|
+
console.log(bridgeIssues, evidence.publishReady, readiness.ready);
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
Do not publish placeholder screenshot hashes. Deterministic render output must replace the placeholder before a prompt-cartoon or AuraVoice route is called publish-ready.
|
|
375
|
+
|
|
71
376
|
## Prompt-to-3D scene kits
|
|
72
377
|
|
|
73
378
|
Use scene kits when an AI prompt asks for generated 3D systems rather than a supplied model.
|
|
@@ -97,20 +402,13 @@ Maintained scene-kit families include physics playgrounds, particle fountains, s
|
|
|
97
402
|
- `@aura3d/cli`: typed GLB/glTF asset workflow, diagnostics, and deploy checks.
|
|
98
403
|
- `@aura3d/react`: optional thin React adapter.
|
|
99
404
|
- `create-aura3d`: Vite templates for product viewers, cinematic scenes, and mini-games.
|
|
405
|
+
- `@aura3d/three-compat`: optional migration compatibility package, installed separately when a Three.js migration workflow needs it.
|
|
100
406
|
|
|
101
|
-
##
|
|
102
|
-
|
|
103
|
-
Aura3D is built for the AI-assisted browser 3D era. It gives teams a higher-level TypeScript workflow than renderer-first libraries and a lighter web-native path than heavyweight game-engine exports.
|
|
104
|
-
|
|
105
|
-
Use Aura3D when you want:
|
|
407
|
+
## Production browser 3D workflow
|
|
106
408
|
|
|
107
|
-
-
|
|
108
|
-
- A Babylon.js alternative for teams that want AI agents to build real TypeScript scenes without hand-rolling every system.
|
|
109
|
-
- A faster product-viewer and 3D website workflow than Unity WebGL export pipelines.
|
|
110
|
-
- A web-first alternative to Unreal-heavy runtime delivery for interactive product, data, and cinematic scenes.
|
|
111
|
-
- A source-code-first SDK where agents generate maintainable TypeScript instead of opaque scene blobs.
|
|
409
|
+
Aura3D is built for the AI-assisted browser 3D era. It gives teams a source-code-first TypeScript workflow where agents generate maintainable scenes, game routes, product viewers, and deployable interactive websites.
|
|
112
410
|
|
|
113
|
-
Aura3D combines scene kits, GLB/glTF asset typing, product viewers, physics scenes, particles, material labs, data worlds, route diagnostics, screenshot workflows, and static deployment into one agent-ready SDK.
|
|
411
|
+
Aura3D combines scene kits, GLB/glTF asset typing, product viewers, browser-game systems, physics scenes, particles, material labs, data worlds, route diagnostics, screenshot workflows, and static deployment into one agent-ready SDK.
|
|
114
412
|
|
|
115
413
|
## Documentation
|
|
116
414
|
|
|
@@ -129,7 +427,24 @@ pnpm run check:release
|
|
|
129
427
|
|
|
130
428
|
Use release checks to confirm package integrity, generated assets, examples, and static deployment output before shipping.
|
|
131
429
|
|
|
430
|
+
Aura3D 1.0.5 route-specific readiness commands:
|
|
431
|
+
|
|
432
|
+
```bash
|
|
433
|
+
npx @aura3d/cli@latest assets validate-game
|
|
434
|
+
npx @aura3d/cli@latest assets validate-cartoon
|
|
435
|
+
npx @aura3d/cli@latest check-deploy --dist dist
|
|
436
|
+
pnpm game-runtime:docs
|
|
437
|
+
pnpm game-runtime:template
|
|
438
|
+
pnpm game-runtime:package
|
|
439
|
+
pnpm game-runtime:release
|
|
440
|
+
pnpm prompt-animation:docs
|
|
441
|
+
pnpm prompt-animation:template
|
|
442
|
+
pnpm prompt-animation:package
|
|
443
|
+
pnpm prompt-animation:release
|
|
444
|
+
```
|
|
445
|
+
|
|
446
|
+
Do not mark a game, prompt-cartoon, or AuraVoice route launch-ready from source evidence alone. Asset readiness, package smoke, browser route health, deterministic screenshots, visual review, accessibility proof, and deployment checks must also pass.
|
|
447
|
+
|
|
132
448
|
## Contributing
|
|
133
449
|
|
|
134
450
|
Star the repo if you want AI-native browser 3D tooling for TypeScript, WebGL, WebGPU, GLB/glTF assets, product viewers, prompt-to-3D scenes, and deployable 3D websites. Open issues with the prompt, package version, asset source or license, commands run, route-health output, screenshots, and deploy context.
|
|
135
|
-
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
export type AnimationPlaybackDirection = 1 | -1;
|
|
2
|
+
export type AnimationClipEventType = "marker" | "hitbox" | "hurtbox" | "footstep" | "sfx" | "vfx" | "camera" | "state" | "custom" | (string & {});
|
|
3
|
+
export interface AnimationClipEvent<TName extends string = string, TPayload = unknown> {
|
|
4
|
+
readonly id?: string;
|
|
5
|
+
readonly name: TName;
|
|
6
|
+
readonly type?: AnimationClipEventType;
|
|
7
|
+
readonly time: number;
|
|
8
|
+
readonly duration?: number;
|
|
9
|
+
readonly payload?: TPayload;
|
|
10
|
+
readonly once?: boolean;
|
|
11
|
+
readonly tags?: readonly string[];
|
|
12
|
+
}
|
|
13
|
+
export interface AnimationClipEventSource<TEvent extends AnimationClipEvent = AnimationClipEvent> {
|
|
14
|
+
readonly id: string;
|
|
15
|
+
readonly duration: number;
|
|
16
|
+
readonly events?: readonly TEvent[];
|
|
17
|
+
}
|
|
18
|
+
export interface AnimationClipEventSamplingOptions {
|
|
19
|
+
readonly from: number;
|
|
20
|
+
readonly to: number;
|
|
21
|
+
readonly duration?: number;
|
|
22
|
+
readonly loop?: boolean;
|
|
23
|
+
readonly direction?: AnimationPlaybackDirection;
|
|
24
|
+
readonly includeStart?: boolean;
|
|
25
|
+
readonly includeEnd?: boolean;
|
|
26
|
+
readonly loopCount?: number;
|
|
27
|
+
readonly playbackTime?: number;
|
|
28
|
+
}
|
|
29
|
+
export interface AnimationClipEventInvocation<TEvent extends AnimationClipEvent = AnimationClipEvent, TClipId extends string = string> {
|
|
30
|
+
readonly clipId: TClipId;
|
|
31
|
+
readonly event: TEvent;
|
|
32
|
+
readonly time: number;
|
|
33
|
+
readonly previousTime: number;
|
|
34
|
+
readonly localTime: number;
|
|
35
|
+
readonly normalizedTime: number;
|
|
36
|
+
readonly loopCount: number;
|
|
37
|
+
readonly direction: AnimationPlaybackDirection;
|
|
38
|
+
readonly playbackTime?: number;
|
|
39
|
+
}
|
|
40
|
+
export type AnimationClipEventListener<TPayload> = (payload: TPayload) => void;
|
|
41
|
+
export type AnimationClipEventUnsubscribe = () => void;
|
|
42
|
+
export declare class AnimationEventDispatcher<TEventMap = Record<string, unknown>> {
|
|
43
|
+
private readonly listeners;
|
|
44
|
+
on<K extends Extract<keyof TEventMap, string>>(type: K, listener: AnimationClipEventListener<TEventMap[K]>): AnimationClipEventUnsubscribe;
|
|
45
|
+
once<K extends Extract<keyof TEventMap, string>>(type: K, listener: AnimationClipEventListener<TEventMap[K]>): AnimationClipEventUnsubscribe;
|
|
46
|
+
off<K extends Extract<keyof TEventMap, string>>(type: K, listener: AnimationClipEventListener<TEventMap[K]>): void;
|
|
47
|
+
emit<K extends Extract<keyof TEventMap, string>>(type: K, payload: TEventMap[K]): void;
|
|
48
|
+
clear(type?: Extract<keyof TEventMap, string>): void;
|
|
49
|
+
listenerCount(type?: Extract<keyof TEventMap, string>): number;
|
|
50
|
+
}
|
|
51
|
+
export declare function createAnimationClipEvent<TName extends string, TPayload = unknown>(name: TName, time: number, options?: Omit<AnimationClipEvent<TName, TPayload>, "name" | "time">): AnimationClipEvent<TName, TPayload>;
|
|
52
|
+
export declare function normalizeClipEvents<TEvent extends AnimationClipEvent>(events?: readonly TEvent[]): readonly TEvent[];
|
|
53
|
+
export declare function animationClipEventKey(clipId: string, event: AnimationClipEvent): string;
|
|
54
|
+
export declare function sampleClipEvents<TEvent extends AnimationClipEvent, TClipId extends string = string>(source: AnimationClipEventSource<TEvent> & {
|
|
55
|
+
readonly id: TClipId;
|
|
56
|
+
}, options: AnimationClipEventSamplingOptions): AnimationClipEventInvocation<TEvent, TClipId>[];
|
|
57
|
+
//# sourceMappingURL=AnimationClipEvents.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AnimationClipEvents.d.ts","sourceRoot":"","sources":["../../../../packages/animation/src/AnimationClipEvents.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
export class AnimationEventDispatcher {
|
|
2
|
+
listeners = new Map();
|
|
3
|
+
on(type, listener) {
|
|
4
|
+
const listeners = this.listeners.get(type) ?? new Set();
|
|
5
|
+
listeners.add(listener);
|
|
6
|
+
this.listeners.set(type, listeners);
|
|
7
|
+
return () => {
|
|
8
|
+
this.off(type, listener);
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
once(type, listener) {
|
|
12
|
+
const unsubscribe = this.on(type, (payload) => {
|
|
13
|
+
unsubscribe();
|
|
14
|
+
listener(payload);
|
|
15
|
+
});
|
|
16
|
+
return unsubscribe;
|
|
17
|
+
}
|
|
18
|
+
off(type, listener) {
|
|
19
|
+
const listeners = this.listeners.get(type);
|
|
20
|
+
if (!listeners)
|
|
21
|
+
return;
|
|
22
|
+
listeners.delete(listener);
|
|
23
|
+
if (listeners.size === 0) {
|
|
24
|
+
this.listeners.delete(type);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
emit(type, payload) {
|
|
28
|
+
const listeners = this.listeners.get(type);
|
|
29
|
+
if (!listeners)
|
|
30
|
+
return;
|
|
31
|
+
for (const listener of [...listeners]) {
|
|
32
|
+
listener(payload);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
clear(type) {
|
|
36
|
+
if (type) {
|
|
37
|
+
this.listeners.delete(type);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
this.listeners.clear();
|
|
41
|
+
}
|
|
42
|
+
listenerCount(type) {
|
|
43
|
+
if (type) {
|
|
44
|
+
return this.listeners.get(type)?.size ?? 0;
|
|
45
|
+
}
|
|
46
|
+
let count = 0;
|
|
47
|
+
for (const listeners of this.listeners.values()) {
|
|
48
|
+
count += listeners.size;
|
|
49
|
+
}
|
|
50
|
+
return count;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
export function createAnimationClipEvent(name, time, options = {}) {
|
|
54
|
+
return {
|
|
55
|
+
...options,
|
|
56
|
+
name,
|
|
57
|
+
time
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
export function normalizeClipEvents(events = []) {
|
|
61
|
+
return [...events].sort((a, b) => {
|
|
62
|
+
if (a.time !== b.time)
|
|
63
|
+
return a.time - b.time;
|
|
64
|
+
return a.name.localeCompare(b.name);
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
export function animationClipEventKey(clipId, event) {
|
|
68
|
+
return `${clipId}:${event.id ?? event.name}:${event.type ?? "marker"}:${event.time}`;
|
|
69
|
+
}
|
|
70
|
+
export function sampleClipEvents(source, options) {
|
|
71
|
+
const events = normalizeClipEvents(source.events);
|
|
72
|
+
if (events.length === 0)
|
|
73
|
+
return [];
|
|
74
|
+
const duration = sanitizeDuration(options.duration ?? source.duration);
|
|
75
|
+
const direction = options.direction ?? (options.to >= options.from ? 1 : -1);
|
|
76
|
+
const includeStart = options.includeStart ?? false;
|
|
77
|
+
const includeEnd = options.includeEnd ?? true;
|
|
78
|
+
const loopCount = options.loopCount ?? 0;
|
|
79
|
+
const playbackTime = options.playbackTime;
|
|
80
|
+
if (duration === 0) {
|
|
81
|
+
return events
|
|
82
|
+
.filter((event) => event.time === 0 && includesBoundary(includeStart, includeEnd))
|
|
83
|
+
.map((event) => createInvocation(source.id, event, options.from, 0, duration, loopCount, direction, playbackTime));
|
|
84
|
+
}
|
|
85
|
+
const from = normalizeLocalTime(options.from, duration, options.loop ?? false);
|
|
86
|
+
const to = normalizeLocalTime(options.to, duration, options.loop ?? false);
|
|
87
|
+
const segments = createSamplingSegments(from, to, duration, options.loop ?? false, direction);
|
|
88
|
+
const invocations = [];
|
|
89
|
+
for (let segmentIndex = 0; segmentIndex < segments.length; segmentIndex += 1) {
|
|
90
|
+
const segment = segments[segmentIndex];
|
|
91
|
+
const segmentIncludeStart = segmentIndex === 0 ? includeStart : true;
|
|
92
|
+
const segmentIncludeEnd = segmentIndex === segments.length - 1 ? includeEnd : true;
|
|
93
|
+
const matching = events.filter((event) => eventInSegment(event.time, segment.start, segment.end, segmentIncludeStart, segmentIncludeEnd));
|
|
94
|
+
if (direction === -1) {
|
|
95
|
+
matching.reverse();
|
|
96
|
+
}
|
|
97
|
+
for (const event of matching) {
|
|
98
|
+
invocations.push(createInvocation(source.id, event, options.from, event.time, duration, loopCount + segment.loopOffset, direction, playbackTime));
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return invocations;
|
|
102
|
+
}
|
|
103
|
+
function createSamplingSegments(from, to, duration, loop, direction) {
|
|
104
|
+
if (!loop) {
|
|
105
|
+
return [
|
|
106
|
+
{
|
|
107
|
+
start: Math.min(from, to),
|
|
108
|
+
end: Math.max(from, to),
|
|
109
|
+
loopOffset: 0
|
|
110
|
+
}
|
|
111
|
+
];
|
|
112
|
+
}
|
|
113
|
+
if (direction === 1) {
|
|
114
|
+
if (to >= from) {
|
|
115
|
+
return [{ start: from, end: to, loopOffset: 0 }];
|
|
116
|
+
}
|
|
117
|
+
return [
|
|
118
|
+
{ start: from, end: duration, loopOffset: 0 },
|
|
119
|
+
{ start: 0, end: to, loopOffset: 1 }
|
|
120
|
+
];
|
|
121
|
+
}
|
|
122
|
+
if (to <= from) {
|
|
123
|
+
return [{ start: to, end: from, loopOffset: 0 }];
|
|
124
|
+
}
|
|
125
|
+
return [
|
|
126
|
+
{ start: 0, end: from, loopOffset: 0 },
|
|
127
|
+
{ start: to, end: duration, loopOffset: 1 }
|
|
128
|
+
];
|
|
129
|
+
}
|
|
130
|
+
function createInvocation(clipId, event, previousTime, localTime, duration, loopCount, direction, playbackTime) {
|
|
131
|
+
return {
|
|
132
|
+
clipId,
|
|
133
|
+
event,
|
|
134
|
+
time: event.time,
|
|
135
|
+
previousTime,
|
|
136
|
+
localTime,
|
|
137
|
+
normalizedTime: duration > 0 ? event.time / duration : 0,
|
|
138
|
+
loopCount,
|
|
139
|
+
direction,
|
|
140
|
+
playbackTime
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
function eventInSegment(time, start, end, includeStart, includeEnd) {
|
|
144
|
+
const startsAfter = includeStart ? time >= start : time > start;
|
|
145
|
+
const endsBefore = includeEnd ? time <= end : time < end;
|
|
146
|
+
return startsAfter && endsBefore;
|
|
147
|
+
}
|
|
148
|
+
function includesBoundary(includeStart, includeEnd) {
|
|
149
|
+
return includeStart || includeEnd;
|
|
150
|
+
}
|
|
151
|
+
function normalizeLocalTime(time, duration, loop) {
|
|
152
|
+
if (!Number.isFinite(time))
|
|
153
|
+
return 0;
|
|
154
|
+
if (!loop)
|
|
155
|
+
return clamp(time, 0, duration);
|
|
156
|
+
return positiveModulo(time, duration);
|
|
157
|
+
}
|
|
158
|
+
function sanitizeDuration(duration) {
|
|
159
|
+
if (!Number.isFinite(duration) || duration <= 0)
|
|
160
|
+
return 0;
|
|
161
|
+
return duration;
|
|
162
|
+
}
|
|
163
|
+
function positiveModulo(value, divisor) {
|
|
164
|
+
if (divisor <= 0)
|
|
165
|
+
return 0;
|
|
166
|
+
return ((value % divisor) + divisor) % divisor;
|
|
167
|
+
}
|
|
168
|
+
function clamp(value, min, max) {
|
|
169
|
+
return Math.min(max, Math.max(min, value));
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=AnimationClipEvents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AnimationClipEvents.js","sourceRoot":"","sources":["../../../../packages/animation/src/AnimationClipEvents.ts"],"names":[],"mappings":"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"}
|