@aura3d/engine 1.0.3 → 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.
Files changed (198) hide show
  1. package/README.md +309 -7
  2. package/dist/animation/AnimationClipEvents.d.ts +57 -0
  3. package/dist/animation/AnimationClipEvents.d.ts.map +1 -0
  4. package/dist/animation/AnimationClipEvents.js +171 -0
  5. package/dist/animation/AnimationClipEvents.js.map +1 -0
  6. package/dist/animation/AnimationClipRegistry.d.ts +76 -0
  7. package/dist/animation/AnimationClipRegistry.d.ts.map +1 -0
  8. package/dist/animation/AnimationClipRegistry.js +130 -0
  9. package/dist/animation/AnimationClipRegistry.js.map +1 -0
  10. package/dist/animation/AnimationController.d.ts +168 -0
  11. package/dist/animation/AnimationController.d.ts.map +1 -0
  12. package/dist/animation/AnimationController.js +619 -0
  13. package/dist/animation/AnimationController.js.map +1 -0
  14. package/dist/animation/HumanoidRetargeting.d.ts +76 -0
  15. package/dist/animation/HumanoidRetargeting.d.ts.map +1 -0
  16. package/dist/animation/HumanoidRetargeting.js +331 -0
  17. package/dist/animation/HumanoidRetargeting.js.map +1 -0
  18. package/dist/animation/browser-index.d.ts +18 -0
  19. package/dist/animation/browser-index.d.ts.map +1 -1
  20. package/dist/animation/browser-index.js +13 -0
  21. package/dist/animation/browser-index.js.map +1 -1
  22. package/dist/animation/index.d.ts +16 -1
  23. package/dist/animation/index.d.ts.map +1 -1
  24. package/dist/animation/index.js +11 -1
  25. package/dist/animation/index.js.map +1 -1
  26. package/dist/animation/threejs-compatibility/AnimationDiagnostics.d.ts.map +1 -1
  27. package/dist/animation/threejs-compatibility/AnimationDiagnostics.js +3 -5
  28. package/dist/animation/threejs-compatibility/AnimationDiagnostics.js.map +1 -1
  29. package/dist/assets/GLTFAnimationRuntime.js +1 -1
  30. package/dist/assets/GLTFLoader.js +1 -1
  31. package/dist/aura3d-cli/cli.js +194 -8
  32. package/dist/aura3d-cli/cli.js.map +1 -1
  33. package/dist/aura3d-cli/index.d.ts +280 -3
  34. package/dist/aura3d-cli/index.d.ts.map +1 -1
  35. package/dist/aura3d-cli/index.js +886 -4
  36. package/dist/aura3d-cli/index.js.map +1 -1
  37. package/dist/aura3d-cli/pull-bridge.d.ts +95 -0
  38. package/dist/aura3d-cli/pull-bridge.d.ts.map +1 -0
  39. package/dist/aura3d-cli/pull-bridge.js +247 -0
  40. package/dist/aura3d-cli/pull-bridge.js.map +1 -0
  41. package/dist/create-aura3d/index.d.ts +1 -1
  42. package/dist/create-aura3d/index.d.ts.map +1 -1
  43. package/dist/create-aura3d/index.js +9 -2
  44. package/dist/create-aura3d/index.js.map +1 -1
  45. package/dist/editor-runtime/ProjectSerializer.d.ts +74 -1
  46. package/dist/editor-runtime/ProjectSerializer.d.ts.map +1 -1
  47. package/dist/editor-runtime/ProjectSerializer.js +123 -6
  48. package/dist/editor-runtime/ProjectSerializer.js.map +1 -1
  49. package/dist/editor-runtime/TimelineModel.d.ts +18 -0
  50. package/dist/editor-runtime/TimelineModel.d.ts.map +1 -1
  51. package/dist/editor-runtime/TimelineModel.js +67 -3
  52. package/dist/editor-runtime/TimelineModel.js.map +1 -1
  53. package/dist/editor-runtime/TimelineRuntimeBridge.d.ts +98 -0
  54. package/dist/editor-runtime/TimelineRuntimeBridge.d.ts.map +1 -0
  55. package/dist/editor-runtime/TimelineRuntimeBridge.js +186 -0
  56. package/dist/editor-runtime/TimelineRuntimeBridge.js.map +1 -0
  57. package/dist/editor-runtime/index.d.ts +3 -1
  58. package/dist/editor-runtime/index.d.ts.map +1 -1
  59. package/dist/editor-runtime/index.js +1 -0
  60. package/dist/editor-runtime/index.js.map +1 -1
  61. package/dist/engine/agent-api/AnimationController.d.ts +607 -0
  62. package/dist/engine/agent-api/AnimationController.d.ts.map +1 -0
  63. package/dist/engine/agent-api/AnimationController.js +2192 -0
  64. package/dist/engine/agent-api/AnimationController.js.map +1 -0
  65. package/dist/engine/agent-api/AssetEvidence.d.ts +88 -0
  66. package/dist/engine/agent-api/AssetEvidence.d.ts.map +1 -0
  67. package/dist/engine/agent-api/AssetEvidence.js +157 -0
  68. package/dist/engine/agent-api/AssetEvidence.js.map +1 -0
  69. package/dist/engine/agent-api/AuraAppHandle.d.ts +55 -0
  70. package/dist/engine/agent-api/AuraAppHandle.d.ts.map +1 -0
  71. package/dist/engine/agent-api/AuraAppHandle.js +15 -0
  72. package/dist/engine/agent-api/AuraAppHandle.js.map +1 -0
  73. package/dist/engine/agent-api/AuraVoiceBridge.d.ts +96 -0
  74. package/dist/engine/agent-api/AuraVoiceBridge.d.ts.map +1 -0
  75. package/dist/engine/agent-api/AuraVoiceBridge.js +370 -0
  76. package/dist/engine/agent-api/AuraVoiceBridge.js.map +1 -0
  77. package/dist/engine/agent-api/CartoonDirector.d.ts +95 -0
  78. package/dist/engine/agent-api/CartoonDirector.d.ts.map +1 -0
  79. package/dist/engine/agent-api/CartoonDirector.js +342 -0
  80. package/dist/engine/agent-api/CartoonDirector.js.map +1 -0
  81. package/dist/engine/agent-api/CartoonPerformance.d.ts +149 -0
  82. package/dist/engine/agent-api/CartoonPerformance.d.ts.map +1 -0
  83. package/dist/engine/agent-api/CartoonPerformance.js +317 -0
  84. package/dist/engine/agent-api/CartoonPerformance.js.map +1 -0
  85. package/dist/engine/agent-api/CartoonRenderQueue.d.ts +132 -0
  86. package/dist/engine/agent-api/CartoonRenderQueue.d.ts.map +1 -0
  87. package/dist/engine/agent-api/CartoonRenderQueue.js +385 -0
  88. package/dist/engine/agent-api/CartoonRenderQueue.js.map +1 -0
  89. package/dist/engine/agent-api/CharacterAssembly.d.ts +126 -0
  90. package/dist/engine/agent-api/CharacterAssembly.d.ts.map +1 -0
  91. package/dist/engine/agent-api/CharacterAssembly.js +280 -0
  92. package/dist/engine/agent-api/CharacterAssembly.js.map +1 -0
  93. package/dist/engine/agent-api/DialoguePerformance.d.ts +150 -0
  94. package/dist/engine/agent-api/DialoguePerformance.d.ts.map +1 -0
  95. package/dist/engine/agent-api/DialoguePerformance.js +335 -0
  96. package/dist/engine/agent-api/DialoguePerformance.js.map +1 -0
  97. package/dist/engine/agent-api/FrameLoop.d.ts +70 -0
  98. package/dist/engine/agent-api/FrameLoop.d.ts.map +1 -0
  99. package/dist/engine/agent-api/FrameLoop.js +165 -0
  100. package/dist/engine/agent-api/FrameLoop.js.map +1 -0
  101. package/dist/engine/agent-api/GameAssetValidation.d.ts +279 -0
  102. package/dist/engine/agent-api/GameAssetValidation.d.ts.map +1 -0
  103. package/dist/engine/agent-api/GameAssetValidation.js +719 -0
  104. package/dist/engine/agent-api/GameAssetValidation.js.map +1 -0
  105. package/dist/engine/agent-api/GameEvidence.d.ts +148 -0
  106. package/dist/engine/agent-api/GameEvidence.d.ts.map +1 -0
  107. package/dist/engine/agent-api/GameEvidence.js +269 -0
  108. package/dist/engine/agent-api/GameEvidence.js.map +1 -0
  109. package/dist/engine/agent-api/GameRuntime.d.ts +931 -0
  110. package/dist/engine/agent-api/GameRuntime.d.ts.map +1 -0
  111. package/dist/engine/agent-api/GameRuntime.js +2229 -0
  112. package/dist/engine/agent-api/GameRuntime.js.map +1 -0
  113. package/dist/engine/agent-api/GameSceneBridge.d.ts +54 -0
  114. package/dist/engine/agent-api/GameSceneBridge.d.ts.map +1 -0
  115. package/dist/engine/agent-api/GameSceneBridge.js +110 -0
  116. package/dist/engine/agent-api/GameSceneBridge.js.map +1 -0
  117. package/dist/engine/agent-api/PromptAnimationContract.d.ts +278 -0
  118. package/dist/engine/agent-api/PromptAnimationContract.d.ts.map +1 -0
  119. package/dist/engine/agent-api/PromptAnimationContract.js +238 -0
  120. package/dist/engine/agent-api/PromptAnimationContract.js.map +1 -0
  121. package/dist/engine/agent-api/PromptAnimationEvidence.d.ts +183 -0
  122. package/dist/engine/agent-api/PromptAnimationEvidence.d.ts.map +1 -0
  123. package/dist/engine/agent-api/PromptAnimationEvidence.js +454 -0
  124. package/dist/engine/agent-api/PromptAnimationEvidence.js.map +1 -0
  125. package/dist/engine/agent-api/RuntimeNodeHandle.d.ts +100 -0
  126. package/dist/engine/agent-api/RuntimeNodeHandle.d.ts.map +1 -0
  127. package/dist/engine/agent-api/RuntimeNodeHandle.js +36 -0
  128. package/dist/engine/agent-api/RuntimeNodeHandle.js.map +1 -0
  129. package/dist/engine/agent-api/ShotTimeline.d.ts +179 -0
  130. package/dist/engine/agent-api/ShotTimeline.d.ts.map +1 -0
  131. package/dist/engine/agent-api/ShotTimeline.js +264 -0
  132. package/dist/engine/agent-api/ShotTimeline.js.map +1 -0
  133. package/dist/engine/agent-api/VisemeController.d.ts +89 -0
  134. package/dist/engine/agent-api/VisemeController.d.ts.map +1 -0
  135. package/dist/engine/agent-api/VisemeController.js +207 -0
  136. package/dist/engine/agent-api/VisemeController.js.map +1 -0
  137. package/dist/engine/agent-api/game-kits/fighting.d.ts +123 -0
  138. package/dist/engine/agent-api/game-kits/fighting.d.ts.map +1 -0
  139. package/dist/engine/agent-api/game-kits/fighting.js +483 -0
  140. package/dist/engine/agent-api/game-kits/fighting.js.map +1 -0
  141. package/dist/engine/agent-api/game-kits/index.d.ts +15 -0
  142. package/dist/engine/agent-api/game-kits/index.d.ts.map +1 -0
  143. package/dist/engine/agent-api/game-kits/index.js +6 -0
  144. package/dist/engine/agent-api/game-kits/index.js.map +1 -0
  145. package/dist/engine/agent-api/humanoid-walk-runtime.d.ts +1 -0
  146. package/dist/engine/agent-api/humanoid-walk-runtime.d.ts.map +1 -1
  147. package/dist/engine/agent-api/index.d.ts +487 -1
  148. package/dist/engine/agent-api/index.d.ts.map +1 -1
  149. package/dist/engine/agent-api/index.js +740 -6
  150. package/dist/engine/agent-api/index.js.map +1 -1
  151. package/dist/engine/agent-api/product-viewer-runtime.d.ts.map +1 -1
  152. package/dist/index.d.ts +1 -0
  153. package/dist/index.js +1 -0
  154. package/dist/physics/CollisionVolumes.d.ts +57 -0
  155. package/dist/physics/CollisionVolumes.d.ts.map +1 -0
  156. package/dist/physics/CollisionVolumes.js +159 -0
  157. package/dist/physics/CollisionVolumes.js.map +1 -0
  158. package/dist/physics/HitboxWorld.d.ts +229 -0
  159. package/dist/physics/HitboxWorld.d.ts.map +1 -0
  160. package/dist/physics/HitboxWorld.js +640 -0
  161. package/dist/physics/HitboxWorld.js.map +1 -0
  162. package/dist/physics/KinematicBody.d.ts +157 -0
  163. package/dist/physics/KinematicBody.d.ts.map +1 -0
  164. package/dist/physics/KinematicBody.js +405 -0
  165. package/dist/physics/KinematicBody.js.map +1 -0
  166. package/dist/physics/KinematicWorld.d.ts +58 -0
  167. package/dist/physics/KinematicWorld.d.ts.map +1 -0
  168. package/dist/physics/KinematicWorld.js +246 -0
  169. package/dist/physics/KinematicWorld.js.map +1 -0
  170. package/dist/physics/index.d.ts +4 -0
  171. package/dist/physics/index.d.ts.map +1 -1
  172. package/dist/physics/index.js +4 -0
  173. package/dist/physics/index.js.map +1 -1
  174. package/dist/rendering/ForwardPass.js +2 -2
  175. package/dist/rendering/ShaderLibrary.js +2 -2
  176. package/dist/rendering/SkinnedLitMaterial.js +3 -3
  177. package/dist/rendering/SkinnedUnlitMaterial.js +3 -3
  178. package/dist/scene/Renderable.js +2 -2
  179. package/dist/scripting/VisualGraph.d.ts +2 -1
  180. package/dist/scripting/VisualGraph.d.ts.map +1 -1
  181. package/dist/scripting/VisualGraph.js +118 -1
  182. package/dist/scripting/VisualGraph.js.map +1 -1
  183. package/dist/scripting/VisualGraphContext.d.ts +123 -0
  184. package/dist/scripting/VisualGraphContext.d.ts.map +1 -0
  185. package/dist/scripting/VisualGraphContext.js +2 -0
  186. package/dist/scripting/VisualGraphContext.js.map +1 -0
  187. package/dist/scripting/VisualGraphExecutor.d.ts +6 -1
  188. package/dist/scripting/VisualGraphExecutor.d.ts.map +1 -1
  189. package/dist/scripting/VisualGraphExecutor.js +364 -7
  190. package/dist/scripting/VisualGraphExecutor.js.map +1 -1
  191. package/dist/scripting/VisualNodeCatalog.d.ts +1 -1
  192. package/dist/scripting/VisualNodeCatalog.d.ts.map +1 -1
  193. package/dist/scripting/VisualNodeCatalog.js +61 -1
  194. package/dist/scripting/VisualNodeCatalog.js.map +1 -1
  195. package/dist/scripting/index.d.ts +1 -0
  196. package/dist/scripting/index.d.ts.map +1 -1
  197. package/dist/scripting/index.js.map +1 -1
  198. package/package.json +192 -118
@@ -0,0 +1,264 @@
1
+ import { createPromptAnimationIssue, normalizePromptAnimationTime, promptAnimationContractVersion, promptAnimationFrameAtTime } from "./PromptAnimationContract.js";
2
+ import { sampleVisemeTrack } from "./VisemeController.js";
3
+ export function defineShotTimeline(timeline) {
4
+ return timeline;
5
+ }
6
+ export function createShotTimeline(input) {
7
+ let duration = input.duration ?? 0;
8
+ for (const shot of input.shots) {
9
+ duration = Math.max(duration, shot.endTime);
10
+ }
11
+ return {
12
+ artifact: "shot-timeline",
13
+ contractId: promptAnimationContractVersion,
14
+ episodeId: input.episodeId,
15
+ frameRate: input.frameRate,
16
+ duration: normalizePromptAnimationTime(duration),
17
+ shots: input.shots,
18
+ ...(input.generatedAt ? { generatedAt: input.generatedAt } : {})
19
+ };
20
+ }
21
+ export function shotTimeline(input) {
22
+ return createShotTimeline(input);
23
+ }
24
+ export function createShotPlaybackPlan(input) {
25
+ const runtimeNodeByCharacterId = {};
26
+ for (const shot of input.timeline.shots) {
27
+ for (const character of shot.characters) {
28
+ runtimeNodeByCharacterId[character.characterId] =
29
+ input.runtimeNodeByCharacterId?.[character.characterId] ?? character.characterId;
30
+ }
31
+ }
32
+ return {
33
+ kind: "shot-playback-plan",
34
+ timeline: input.timeline,
35
+ ...(input.performance ? { performance: input.performance } : {}),
36
+ ...(input.captions ? { captions: input.captions } : {}),
37
+ ...(input.visemes ? { visemes: input.visemes } : {}),
38
+ runtimeNodeByCharacterId,
39
+ loop: input.loop ?? false
40
+ };
41
+ }
42
+ export function sampleShotPlaybackPlan(plan, time) {
43
+ const sampledTime = normalizeShotPlaybackTime(plan, time);
44
+ const shot = getShotAtTime(plan.timeline, sampledTime);
45
+ if (!shot) {
46
+ return {
47
+ time: sampledTime,
48
+ frame: promptAnimationFrameAtTime(sampledTime, plan.timeline.frameRate),
49
+ nodeUpdates: []
50
+ };
51
+ }
52
+ const caption = plan.captions?.cues.find((cue) => sampledTime >= cue.startTime && sampledTime < cue.endTime);
53
+ const nodeUpdates = shot.characters.map((character) => {
54
+ const activeCues = activePerformanceCues(plan.performance, sampledTime, character.characterId, shot.shotId);
55
+ const primaryCue = activeCues.find((cue) => cue.action === "speak") ??
56
+ activeCues.find((cue) => cue.animationClip || cue.blocking || cue.body) ??
57
+ activeCues[activeCues.length - 1];
58
+ const viseme = plan.visemes ? sampleVisemeTrack(plan.visemes, sampledTime, character.characterId) : undefined;
59
+ const blockingPosition = primaryCue?.blocking?.position ?? primaryCue?.body?.position ?? character.position;
60
+ const blockingRotation = primaryCue?.blocking?.rotation ?? primaryCue?.body?.rotation ?? facingRotation(character.facing);
61
+ const scale = primaryCue?.blocking?.scale ?? primaryCue?.body?.scale;
62
+ return {
63
+ nodeId: plan.runtimeNodeByCharacterId[character.characterId] ?? character.characterId,
64
+ characterId: character.characterId,
65
+ ...(blockingPosition ? { position: blockingPosition } : {}),
66
+ ...(blockingRotation ? { rotation: blockingRotation } : {}),
67
+ ...(scale !== undefined ? { scale } : {}),
68
+ visible: primaryCue?.blocking?.visible ?? true,
69
+ ...(primaryCue?.animationClip ?? character.animationClip
70
+ ? { animationClip: primaryCue?.animationClip ?? character.animationClip }
71
+ : {}),
72
+ action: primaryCue?.action ?? character.action,
73
+ ...(primaryCue?.emotion ?? character.emotion ? { emotion: primaryCue?.emotion ?? character.emotion } : {}),
74
+ ...(primaryCue?.gaze?.targetId
75
+ ? { gazeTargetId: primaryCue.gaze.targetId }
76
+ : typeof character.lookAt === "string"
77
+ ? { gazeTargetId: character.lookAt }
78
+ : {}),
79
+ activeCueIds: activeCues.map((cue) => cue.id),
80
+ ...(viseme
81
+ ? {
82
+ mouth: {
83
+ visemeId: viseme.primaryVisemeId,
84
+ mouthOpenness: viseme.mouthOpenness,
85
+ primitiveMouthCard: viseme.primitiveMouthCard,
86
+ blendshapeWeights: viseme.blendshapeWeights
87
+ }
88
+ }
89
+ : {})
90
+ };
91
+ });
92
+ return {
93
+ time: sampledTime,
94
+ frame: promptAnimationFrameAtTime(sampledTime, plan.timeline.frameRate),
95
+ shot,
96
+ shotId: shot.shotId,
97
+ sceneId: shot.sceneId,
98
+ ...(caption ? { caption } : {}),
99
+ nodeUpdates
100
+ };
101
+ }
102
+ export function applyShotPlaybackFrame(app, framePlan, options = {}) {
103
+ for (const update of framePlan.nodeUpdates) {
104
+ const node = app.nodes.get(update.nodeId);
105
+ if (node)
106
+ applyNodeUpdate(node, update, options.playAnimationClips ?? true);
107
+ const mouthNodeId = update.characterId ? options.primitiveMouthNodeByCharacterId?.[update.characterId] : undefined;
108
+ const mouthNode = mouthNodeId ? app.nodes.get(mouthNodeId) : undefined;
109
+ if (mouthNode && update.mouth)
110
+ applyPrimitiveMouthUpdate(mouthNode, update.mouth, update.position);
111
+ }
112
+ options.onCaption?.(framePlan.caption, framePlan);
113
+ }
114
+ export function installShotPlayback(app, plan, options = {}) {
115
+ let localTime = options.timeOffset ?? 0;
116
+ return app.onFrame((frame) => {
117
+ const sampledTime = options.useRuntimeTime === false ? localTime : frame.time + (options.timeOffset ?? 0);
118
+ applyShotPlaybackFrame(app, sampleShotPlaybackPlan(plan, sampledTime), options);
119
+ localTime = normalizePromptAnimationTime(localTime + frame.dt);
120
+ });
121
+ }
122
+ export function shotDuration(shot) {
123
+ return normalizePromptAnimationTime(shot.endTime - shot.startTime);
124
+ }
125
+ export function getShotAtTime(timeline, time) {
126
+ const normalized = normalizePromptAnimationTime(time);
127
+ for (const shot of timeline.shots) {
128
+ if (normalized >= shot.startTime && normalized < shot.endTime)
129
+ return shot;
130
+ }
131
+ const lastShot = timeline.shots[timeline.shots.length - 1];
132
+ if (lastShot && normalized === lastShot.endTime)
133
+ return lastShot;
134
+ return undefined;
135
+ }
136
+ export function getShotTimelineCaptureTimes(timeline) {
137
+ const times = new Set();
138
+ for (const shot of timeline.shots) {
139
+ for (const captureTime of shot.captureTimes) {
140
+ times.add(normalizePromptAnimationTime(captureTime));
141
+ }
142
+ }
143
+ return [...times].sort((a, b) => a - b);
144
+ }
145
+ export function validateShotTimeline(timeline) {
146
+ const issues = [];
147
+ const shotIds = new Set();
148
+ let previousEnd = 0;
149
+ if (timeline.frameRate <= 0) {
150
+ issues.push(createPromptAnimationIssue("error", "shot-timeline-frame-rate", "Shot timeline frame rate must be positive."));
151
+ }
152
+ if (timeline.shots.length === 0) {
153
+ issues.push(createPromptAnimationIssue("error", "shot-timeline-empty", "Shot timeline must contain at least one shot."));
154
+ }
155
+ timeline.shots.forEach((shot, index) => {
156
+ if (!shot.shotId) {
157
+ issues.push(createPromptAnimationIssue("error", "shot-id-missing", `Shot at index ${index} is missing a stable shot id.`, {
158
+ path: `shots.${index}.shotId`
159
+ }));
160
+ }
161
+ if (shotIds.has(shot.shotId)) {
162
+ issues.push(createPromptAnimationIssue("error", "shot-id-duplicate", `Duplicate shot id "${shot.shotId}".`, {
163
+ path: `shots.${index}.shotId`
164
+ }));
165
+ }
166
+ shotIds.add(shot.shotId);
167
+ if (shot.endTime <= shot.startTime) {
168
+ issues.push(createPromptAnimationIssue("error", "shot-duration-invalid", `Shot "${shot.shotId}" must end after it starts.`, {
169
+ path: `shots.${index}`,
170
+ time: shot.startTime
171
+ }));
172
+ }
173
+ if (index > 0 && shot.startTime < previousEnd) {
174
+ issues.push(createPromptAnimationIssue("error", "shot-overlap", `Shot "${shot.shotId}" overlaps the previous shot.`, {
175
+ path: `shots.${index}`,
176
+ time: shot.startTime
177
+ }));
178
+ }
179
+ for (const captureTime of shot.captureTimes) {
180
+ if (captureTime < shot.startTime || captureTime > shot.endTime) {
181
+ issues.push(createPromptAnimationIssue("error", "shot-capture-outside-bounds", `Capture time ${captureTime}s is outside shot "${shot.shotId}".`, {
182
+ path: `shots.${index}.captureTimes`,
183
+ frame: promptAnimationFrameAtTime(captureTime, timeline.frameRate),
184
+ time: captureTime
185
+ }));
186
+ }
187
+ }
188
+ previousEnd = Math.max(previousEnd, shot.endTime);
189
+ });
190
+ if (previousEnd > timeline.duration) {
191
+ issues.push(createPromptAnimationIssue("error", "shot-timeline-duration-short", "Shot timeline duration is shorter than its final shot.", { time: previousEnd }));
192
+ }
193
+ return issues;
194
+ }
195
+ export function createShotTimelineDiagnostics(timeline) {
196
+ const sceneIds = new Set();
197
+ for (const shot of timeline.shots)
198
+ sceneIds.add(shot.sceneId);
199
+ const captureTimes = getShotTimelineCaptureTimes(timeline);
200
+ return {
201
+ shotCount: timeline.shots.length,
202
+ duration: timeline.duration,
203
+ captureCount: captureTimes.length,
204
+ uniqueSceneIds: [...sceneIds],
205
+ frameRate: timeline.frameRate,
206
+ issues: validateShotTimeline(timeline)
207
+ };
208
+ }
209
+ function activePerformanceCues(performance, time, characterId, shotId) {
210
+ if (!performance)
211
+ return [];
212
+ return performance.cues.filter((cue) => {
213
+ if (cue.characterId !== characterId)
214
+ return false;
215
+ if (cue.shotId && cue.shotId !== shotId)
216
+ return false;
217
+ return time >= cue.startTime && time < cue.endTime;
218
+ });
219
+ }
220
+ function normalizeShotPlaybackTime(plan, time) {
221
+ const normalized = normalizePromptAnimationTime(time);
222
+ if (!plan.loop || plan.timeline.duration <= 0)
223
+ return normalized;
224
+ return normalizePromptAnimationTime(normalized % plan.timeline.duration);
225
+ }
226
+ function facingRotation(facing) {
227
+ if (facing === "left")
228
+ return [0, -0.35, 0];
229
+ if (facing === "right")
230
+ return [0, 0.35, 0];
231
+ if (facing === "three-quarter")
232
+ return [0, 0.18, 0];
233
+ return undefined;
234
+ }
235
+ function applyNodeUpdate(node, update, playAnimationClips) {
236
+ if (update.visible !== undefined)
237
+ node.setVisible?.(update.visible);
238
+ if (update.position)
239
+ node.setPosition?.(update.position[0], update.position[1], update.position[2]);
240
+ if (update.rotation)
241
+ node.setRotation?.(update.rotation[0], update.rotation[1], update.rotation[2]);
242
+ if (update.scale !== undefined)
243
+ node.setScale?.(update.scale);
244
+ if (playAnimationClips && update.animationClip)
245
+ node.play?.(update.animationClip, { loop: true });
246
+ }
247
+ function applyPrimitiveMouthUpdate(mouthNode, mouth, bodyPosition) {
248
+ const openness = Math.min(1, Math.max(0, mouth.mouthOpenness));
249
+ const width = mouth.primitiveMouthCard === "round"
250
+ ? 0.16
251
+ : mouth.primitiveMouthCard === "wide"
252
+ ? 0.34
253
+ : mouth.primitiveMouthCard === "narrow"
254
+ ? 0.12
255
+ : mouth.primitiveMouthCard === "smile"
256
+ ? 0.3
257
+ : 0.22;
258
+ const height = mouth.primitiveMouthCard === "closed" ? 0.025 : 0.035 + openness * 0.12;
259
+ if (bodyPosition)
260
+ mouthNode.setPosition?.(bodyPosition[0], bodyPosition[1] + 0.05, bodyPosition[2] + 0.32);
261
+ mouthNode.setScale?.([width, height, 0.025]);
262
+ mouthNode.setVisible?.(mouth.primitiveMouthCard !== "closed" || openness > 0.04);
263
+ }
264
+ //# sourceMappingURL=ShotTimeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ShotTimeline.js","sourceRoot":"","sources":["../../../../../packages/engine/src/agent-api/ShotTimeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ import { type PromptAnimationArtifactBase, type PromptAnimationFrameRate, type PromptAnimationId, type PromptAnimationLanguageCode, type PromptAnimationSeconds, type PromptAnimationValidationIssue } from "./PromptAnimationContract.js";
2
+ export type AuraVoiceVisemeFormat = "auravoice-visemes-v2";
3
+ export type AuraVoiceVisemeId = "sil" | "aa" | "ae" | "ah" | "ao" | "eh" | "er" | "ih" | "iy" | "oh" | "ow" | "uh" | "uw" | "bmp" | "ch" | "d" | "fv" | "g" | "k" | "l" | "m" | "n" | "p" | "r" | "s" | "th" | "wq" | string;
4
+ export type PrimitiveMouthCard = "closed" | "narrow" | "open" | "wide" | "round" | "smile";
5
+ export interface AuraVoiceVisemeCue {
6
+ readonly id: PromptAnimationId;
7
+ readonly characterId: PromptAnimationId;
8
+ readonly speakerId?: PromptAnimationId | undefined;
9
+ readonly lineId?: PromptAnimationId | undefined;
10
+ readonly phoneme?: string | undefined;
11
+ readonly phonemeId?: string | undefined;
12
+ readonly word?: string | undefined;
13
+ readonly wordIndex?: number | undefined;
14
+ readonly wordStartTime?: PromptAnimationSeconds | undefined;
15
+ readonly wordEndTime?: PromptAnimationSeconds | undefined;
16
+ readonly startTime: PromptAnimationSeconds;
17
+ readonly endTime: PromptAnimationSeconds;
18
+ readonly visemeId: AuraVoiceVisemeId;
19
+ readonly mouthOpenness: number;
20
+ readonly weight: number;
21
+ readonly weights?: Record<string, number> | undefined;
22
+ readonly blendshapeWeights?: Record<string, number> | undefined;
23
+ readonly blendshapeNames?: readonly string[] | undefined;
24
+ }
25
+ export interface AuraVoiceVisemeTrack extends PromptAnimationArtifactBase<"visemes"> {
26
+ readonly format: AuraVoiceVisemeFormat;
27
+ readonly language: PromptAnimationLanguageCode;
28
+ readonly frameRate: PromptAnimationFrameRate;
29
+ readonly cues: readonly AuraVoiceVisemeCue[];
30
+ }
31
+ export interface VisemeSample {
32
+ readonly time: PromptAnimationSeconds;
33
+ readonly characterId?: PromptAnimationId | undefined;
34
+ readonly activeCues: readonly AuraVoiceVisemeCue[];
35
+ readonly visemeId: AuraVoiceVisemeId;
36
+ readonly primaryVisemeId: AuraVoiceVisemeId;
37
+ readonly mouthOpenness: number;
38
+ readonly primitiveMouthCard: PrimitiveMouthCard;
39
+ readonly weights: Record<string, number>;
40
+ readonly blendshapeWeights: Record<string, number>;
41
+ }
42
+ export interface VisemeController {
43
+ readonly track: AuraVoiceVisemeTrack;
44
+ sample(time: PromptAnimationSeconds, characterId?: PromptAnimationId): VisemeSample;
45
+ validate(): readonly PromptAnimationValidationIssue[];
46
+ }
47
+ export interface PrimitiveMouthVisemeCueInput {
48
+ readonly characterId: PromptAnimationId;
49
+ readonly speakerId?: PromptAnimationId | undefined;
50
+ readonly lineId?: PromptAnimationId | undefined;
51
+ readonly startTime: PromptAnimationSeconds;
52
+ readonly endTime: PromptAnimationSeconds;
53
+ readonly openVisemeId?: AuraVoiceVisemeId | undefined;
54
+ readonly closeVisemeId?: AuraVoiceVisemeId | undefined;
55
+ }
56
+ export interface GlbVisemeBlendshapeExample {
57
+ readonly description: string;
58
+ readonly mouthFallback: "blendshape";
59
+ readonly requiredCharacterAssetRule: string;
60
+ readonly blendshapeMap: Record<string, string>;
61
+ readonly sampleWeights: Record<string, number>;
62
+ readonly notes: readonly string[];
63
+ }
64
+ export interface PrimitiveMouthExample {
65
+ readonly description: string;
66
+ readonly mouthFallback: "primitive-mouth-card";
67
+ readonly runtimeNodeSuffix: string;
68
+ readonly cards: readonly PrimitiveMouthCard[];
69
+ readonly notes: readonly string[];
70
+ }
71
+ export declare const primitiveMouthVisemeExample: PrimitiveMouthExample;
72
+ export declare const glbVisemeBlendshapeExample: GlbVisemeBlendshapeExample;
73
+ export declare function defineAuraVoiceVisemes<const TTrack extends AuraVoiceVisemeTrack>(track: TTrack): TTrack;
74
+ export declare function createAuraVoiceVisemeTrack(input: {
75
+ readonly episodeId: PromptAnimationId;
76
+ readonly language: PromptAnimationLanguageCode;
77
+ readonly frameRate: PromptAnimationFrameRate;
78
+ readonly cues: readonly AuraVoiceVisemeCue[];
79
+ readonly generatedAt?: string | undefined;
80
+ }): AuraVoiceVisemeTrack;
81
+ export declare function createPrimitiveMouthVisemeCues(input: PrimitiveMouthVisemeCueInput): readonly AuraVoiceVisemeCue[];
82
+ export declare function createGlbBlendshapeVisemeCue(input: Omit<AuraVoiceVisemeCue, "blendshapeWeights" | "blendshapeNames"> & {
83
+ readonly blendshapeMap?: Record<string, string> | undefined;
84
+ }): AuraVoiceVisemeCue;
85
+ export declare function primitiveMouthCardForViseme(visemeId: AuraVoiceVisemeId, mouthOpenness: number): PrimitiveMouthCard;
86
+ export declare function sampleVisemeTrack(track: AuraVoiceVisemeTrack, time: PromptAnimationSeconds, characterId?: PromptAnimationId): VisemeSample;
87
+ export declare function createVisemeController(track: AuraVoiceVisemeTrack): VisemeController;
88
+ export declare function validateVisemeTrack(track: AuraVoiceVisemeTrack): readonly PromptAnimationValidationIssue[];
89
+ //# sourceMappingURL=VisemeController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VisemeController.d.ts","sourceRoot":"","sources":["../../../../../packages/engine/src/agent-api/VisemeController.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,2BAA2B,EAChC,KAAK,wBAAwB,EAC7B,KAAK,iBAAiB,EACtB,KAAK,2BAA2B,EAChC,KAAK,sBAAsB,EAC3B,KAAK,8BAA8B,EACpC,MAAM,8BAA8B,CAAC;AAEtC,MAAM,MAAM,qBAAqB,GAAG,sBAAsB,CAAC;AAE3D,MAAM,MAAM,iBAAiB,GACzB,KAAK,GACL,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,KAAK,GACL,IAAI,GACJ,GAAG,GACH,IAAI,GACJ,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,IAAI,GACJ,IAAI,GACJ,MAAM,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;AAE3F,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,EAAE,iBAAiB,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,iBAAiB,CAAC;IACxC,QAAQ,CAAC,SAAS,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;IACnD,QAAQ,CAAC,MAAM,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;IAChD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,aAAa,CAAC,EAAE,sBAAsB,GAAG,SAAS,CAAC;IAC5D,QAAQ,CAAC,WAAW,CAAC,EAAE,sBAAsB,GAAG,SAAS,CAAC;IAC1D,QAAQ,CAAC,SAAS,EAAE,sBAAsB,CAAC;IAC3C,QAAQ,CAAC,OAAO,EAAE,sBAAsB,CAAC;IACzC,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IACtD,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IAChE,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;CAC1D;AAED,MAAM,WAAW,oBAAqB,SAAQ,2BAA2B,CAAC,SAAS,CAAC;IAClF,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,2BAA2B,CAAC;IAC/C,QAAQ,CAAC,SAAS,EAAE,wBAAwB,CAAC;IAC7C,QAAQ,CAAC,IAAI,EAAE,SAAS,kBAAkB,EAAE,CAAC;CAC9C;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC;IACtC,QAAQ,CAAC,WAAW,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;IACrD,QAAQ,CAAC,UAAU,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACnD,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,eAAe,EAAE,iBAAiB,CAAC;IAC5C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;IAChD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACpD;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,oBAAoB,CAAC;IACrC,MAAM,CAAC,IAAI,EAAE,sBAAsB,EAAE,WAAW,CAAC,EAAE,iBAAiB,GAAG,YAAY,CAAC;IACpF,QAAQ,IAAI,SAAS,8BAA8B,EAAE,CAAC;CACvD;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,WAAW,EAAE,iBAAiB,CAAC;IACxC,QAAQ,CAAC,SAAS,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;IACnD,QAAQ,CAAC,MAAM,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;IAChD,QAAQ,CAAC,SAAS,EAAE,sBAAsB,CAAC;IAC3C,QAAQ,CAAC,OAAO,EAAE,sBAAsB,CAAC;IACzC,QAAQ,CAAC,YAAY,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;IACtD,QAAQ,CAAC,aAAa,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;CACxD;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,EAAE,YAAY,CAAC;IACrC,QAAQ,CAAC,0BAA0B,EAAE,MAAM,CAAC;IAC5C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/C,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,EAAE,sBAAsB,CAAC;IAC/C,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAC9C,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED,eAAO,MAAM,2BAA2B,EAAE,qBASzC,CAAC;AAEF,eAAO,MAAM,0BAA0B,EAAE,0BA8BxC,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,KAAK,CAAC,MAAM,SAAS,oBAAoB,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEvG;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE;IAChD,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,2BAA2B,CAAC;IAC/C,QAAQ,CAAC,SAAS,EAAE,wBAAwB,CAAC;IAC7C,QAAQ,CAAC,IAAI,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAC7C,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3C,GAAG,oBAAoB,CAWvB;AAED,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,4BAA4B,GAAG,SAAS,kBAAkB,EAAE,CA2BjH;AAED,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE,mBAAmB,GAAG,iBAAiB,CAAC,GAAG;IACzE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;CAC7D,GACA,kBAAkB,CAWpB;AAED,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,GAAG,kBAAkB,CAOlH;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,oBAAoB,EAC3B,IAAI,EAAE,sBAAsB,EAC5B,WAAW,CAAC,EAAE,iBAAiB,GAC9B,YAAY,CAyCd;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,oBAAoB,GAAG,gBAAgB,CAUpF;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,oBAAoB,GAAG,SAAS,8BAA8B,EAAE,CA0E1G"}
@@ -0,0 +1,207 @@
1
+ import { createPromptAnimationIssue, normalizePromptAnimationTime, promptAnimationContractVersion } from "./PromptAnimationContract.js";
2
+ export const primitiveMouthVisemeExample = {
3
+ description: "Primitive character fallback that scales a small mouth-card runtime node from sampled visemes.",
4
+ mouthFallback: "primitive-mouth-card",
5
+ runtimeNodeSuffix: ":mouth",
6
+ cards: ["closed", "narrow", "open", "wide", "round", "smile"],
7
+ notes: [
8
+ "Use this for generated primitive characters only.",
9
+ "Register the mouth card with game.runtimeNode(`${characterId}:mouth`) and update it from sampleVisemeTrack."
10
+ ]
11
+ };
12
+ export const glbVisemeBlendshapeExample = {
13
+ description: "Typed GLB character example that drives named blendshape weights from AuraVoice visemes.",
14
+ mouthFallback: "blendshape",
15
+ requiredCharacterAssetRule: "Add the GLB with `npx @aura3d/cli@latest assets add ./assets/character.glb --name character`, then use model(assets.character).",
16
+ blendshapeMap: {
17
+ sil: "mouthClose",
18
+ aa: "mouthOpen",
19
+ ah: "mouthOpen",
20
+ ae: "mouthSmile",
21
+ eh: "mouthSmile",
22
+ iy: "mouthNarrow",
23
+ oh: "mouthFunnel",
24
+ ow: "mouthFunnel",
25
+ uw: "mouthPucker",
26
+ bmp: "mouthPress",
27
+ m: "mouthPress",
28
+ p: "mouthPress",
29
+ fv: "mouthLowerLipBite",
30
+ th: "tongueOut"
31
+ },
32
+ sampleWeights: {
33
+ mouthOpen: 0.68,
34
+ mouthFunnel: 0.12,
35
+ mouthSmile: 0.18,
36
+ mouthPress: 0
37
+ },
38
+ notes: [
39
+ "Do not reference a string asset id; import generated typed assets from ./aura-assets.",
40
+ "Keep primitive-mouth-card available as a fallback when a GLB does not expose matching blendshapes."
41
+ ]
42
+ };
43
+ export function defineAuraVoiceVisemes(track) {
44
+ return track;
45
+ }
46
+ export function createAuraVoiceVisemeTrack(input) {
47
+ return {
48
+ artifact: "visemes",
49
+ contractId: promptAnimationContractVersion,
50
+ episodeId: input.episodeId,
51
+ format: "auravoice-visemes-v2",
52
+ language: input.language,
53
+ frameRate: input.frameRate,
54
+ cues: input.cues,
55
+ ...(input.generatedAt ? { generatedAt: input.generatedAt } : {})
56
+ };
57
+ }
58
+ export function createPrimitiveMouthVisemeCues(input) {
59
+ const duration = Math.max(0.001, input.endTime - input.startTime);
60
+ const openEnd = input.startTime + duration * 0.62;
61
+ return [
62
+ {
63
+ id: `${input.lineId ?? input.characterId}:${input.startTime}:primitive-mouth-open`,
64
+ characterId: input.characterId,
65
+ ...(input.speakerId ? { speakerId: input.speakerId } : {}),
66
+ ...(input.lineId ? { lineId: input.lineId } : {}),
67
+ startTime: input.startTime,
68
+ endTime: normalizePromptAnimationTime(openEnd),
69
+ visemeId: input.openVisemeId ?? "ah",
70
+ mouthOpenness: 0.58,
71
+ weight: 0.9
72
+ },
73
+ {
74
+ id: `${input.lineId ?? input.characterId}:${input.startTime}:primitive-mouth-close`,
75
+ characterId: input.characterId,
76
+ ...(input.speakerId ? { speakerId: input.speakerId } : {}),
77
+ ...(input.lineId ? { lineId: input.lineId } : {}),
78
+ startTime: normalizePromptAnimationTime(openEnd),
79
+ endTime: input.endTime,
80
+ visemeId: input.closeVisemeId ?? "m",
81
+ mouthOpenness: 0.12,
82
+ weight: 0.82
83
+ }
84
+ ];
85
+ }
86
+ export function createGlbBlendshapeVisemeCue(input) {
87
+ const { blendshapeMap: inputBlendshapeMap, ...cue } = input;
88
+ const blendshapeMap = inputBlendshapeMap ?? glbVisemeBlendshapeExample.blendshapeMap;
89
+ const blendshapeName = blendshapeMap[input.visemeId] ?? blendshapeMap[String(input.visemeId)] ?? input.visemeId;
90
+ return {
91
+ ...cue,
92
+ blendshapeNames: [blendshapeName],
93
+ blendshapeWeights: {
94
+ [blendshapeName]: Math.min(1, Math.max(0, input.weight * Math.max(input.mouthOpenness, 0.12)))
95
+ }
96
+ };
97
+ }
98
+ export function primitiveMouthCardForViseme(visemeId, mouthOpenness) {
99
+ if (mouthOpenness <= 0.08 || visemeId === "sil")
100
+ return "closed";
101
+ if (visemeId === "oh" || visemeId === "ow" || visemeId === "uw" || visemeId === "wq")
102
+ return "round";
103
+ if (visemeId === "iy" || visemeId === "s" || visemeId === "th")
104
+ return "narrow";
105
+ if (mouthOpenness >= 0.72 || visemeId === "aa" || visemeId === "ah")
106
+ return "wide";
107
+ if (visemeId === "eh" || visemeId === "ae")
108
+ return "smile";
109
+ return "open";
110
+ }
111
+ export function sampleVisemeTrack(track, time, characterId) {
112
+ const normalized = normalizePromptAnimationTime(time);
113
+ const activeCues = [];
114
+ let primary;
115
+ let mouthOpenness = 0;
116
+ const weights = {};
117
+ const blendshapeWeights = {};
118
+ for (const cue of track.cues) {
119
+ if (characterId && cue.characterId !== characterId)
120
+ continue;
121
+ if (normalized < cue.startTime || normalized >= cue.endTime)
122
+ continue;
123
+ activeCues.push(cue);
124
+ if (!primary || cue.weight > primary.weight)
125
+ primary = cue;
126
+ mouthOpenness = Math.max(mouthOpenness, cue.mouthOpenness * cue.weight);
127
+ weights[cue.visemeId] = Math.max(weights[cue.visemeId] ?? 0, cue.weight);
128
+ if (cue.weights) {
129
+ for (const [name, value] of Object.entries(cue.weights)) {
130
+ weights[name] = Math.max(weights[name] ?? 0, value);
131
+ }
132
+ }
133
+ if (cue.blendshapeWeights) {
134
+ for (const [name, value] of Object.entries(cue.blendshapeWeights)) {
135
+ blendshapeWeights[name] = Math.max(blendshapeWeights[name] ?? 0, value * cue.weight);
136
+ }
137
+ }
138
+ }
139
+ const primaryVisemeId = primary?.visemeId ?? "sil";
140
+ return {
141
+ time: normalized,
142
+ ...(characterId ? { characterId } : {}),
143
+ activeCues,
144
+ visemeId: primaryVisemeId,
145
+ primaryVisemeId,
146
+ mouthOpenness,
147
+ primitiveMouthCard: primitiveMouthCardForViseme(primaryVisemeId, mouthOpenness),
148
+ weights,
149
+ blendshapeWeights
150
+ };
151
+ }
152
+ export function createVisemeController(track) {
153
+ return {
154
+ track,
155
+ sample(time, characterId) {
156
+ return sampleVisemeTrack(track, time, characterId);
157
+ },
158
+ validate() {
159
+ return validateVisemeTrack(track);
160
+ }
161
+ };
162
+ }
163
+ export function validateVisemeTrack(track) {
164
+ const issues = [];
165
+ const ids = new Set();
166
+ if (track.format !== "auravoice-visemes-v2") {
167
+ issues.push(createPromptAnimationIssue("error", "viseme-format", "Viseme track must use AuraVoice v2 format."));
168
+ }
169
+ if (track.frameRate <= 0) {
170
+ issues.push(createPromptAnimationIssue("error", "viseme-frame-rate", "Viseme track frame rate must be positive."));
171
+ }
172
+ track.cues.forEach((cue, index) => {
173
+ if (ids.has(cue.id)) {
174
+ issues.push(createPromptAnimationIssue("error", "viseme-id-duplicate", `Duplicate viseme cue id "${cue.id}".`, {
175
+ path: `cues.${index}.id`,
176
+ time: cue.startTime
177
+ }));
178
+ }
179
+ ids.add(cue.id);
180
+ if (cue.endTime <= cue.startTime) {
181
+ issues.push(createPromptAnimationIssue("error", "viseme-duration", `Viseme cue "${cue.id}" must end after it starts.`, {
182
+ path: `cues.${index}`,
183
+ time: cue.startTime
184
+ }));
185
+ }
186
+ if (cue.wordStartTime !== undefined && cue.wordEndTime !== undefined && cue.wordEndTime < cue.wordStartTime) {
187
+ issues.push(createPromptAnimationIssue("error", "viseme-word-timing-order", `Viseme cue "${cue.id}" word timing must not end before it starts.`, { path: `cues.${index}.wordEndTime`, time: cue.startTime }));
188
+ }
189
+ if (cue.wordIndex !== undefined && cue.wordIndex < 0) {
190
+ issues.push(createPromptAnimationIssue("error", "viseme-word-index", `Viseme cue "${cue.id}" word index must be non-negative.`, {
191
+ path: `cues.${index}.wordIndex`,
192
+ time: cue.startTime
193
+ }));
194
+ }
195
+ if (cue.mouthOpenness < 0 || cue.mouthOpenness > 1) {
196
+ issues.push(createPromptAnimationIssue("error", "viseme-mouth-openness", `Viseme cue "${cue.id}" mouth openness must be between 0 and 1.`, { path: `cues.${index}.mouthOpenness`, time: cue.startTime }));
197
+ }
198
+ if (cue.weight < 0 || cue.weight > 1) {
199
+ issues.push(createPromptAnimationIssue("error", "viseme-weight", `Viseme cue "${cue.id}" weight must be between 0 and 1.`, {
200
+ path: `cues.${index}.weight`,
201
+ time: cue.startTime
202
+ }));
203
+ }
204
+ });
205
+ return issues;
206
+ }
207
+ //# sourceMappingURL=VisemeController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VisemeController.js","sourceRoot":"","sources":["../../../../../packages/engine/src/agent-api/VisemeController.ts"],"names":[],"mappings":"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"}