@vgai/engine 0.2.0 → 0.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.
Files changed (541) hide show
  1. package/README.md +3 -1
  2. package/dist/adapter/authoring.d.ts +404 -0
  3. package/dist/adapter/authoring.d.ts.map +1 -0
  4. package/dist/adapter/authoring.js +22 -0
  5. package/dist/adapter/colyseus-networking-adapter.d.ts +43 -0
  6. package/dist/adapter/colyseus-networking-adapter.d.ts.map +1 -0
  7. package/dist/adapter/colyseus-networking-adapter.js +38 -0
  8. package/dist/adapter/first-party-systems.d.ts +38 -0
  9. package/dist/adapter/first-party-systems.d.ts.map +1 -0
  10. package/dist/adapter/first-party-systems.js +77 -0
  11. package/dist/adapter/game-adapter.d.ts +133 -0
  12. package/dist/adapter/game-adapter.d.ts.map +1 -0
  13. package/dist/adapter/game-adapter.js +10 -0
  14. package/dist/adapter/host-context.d.ts +73 -0
  15. package/dist/adapter/host-context.d.ts.map +1 -0
  16. package/dist/adapter/host-context.js +16 -0
  17. package/dist/adapter/index.d.ts +22 -0
  18. package/dist/adapter/index.d.ts.map +1 -0
  19. package/dist/adapter/index.js +15 -0
  20. package/dist/adapter/ingest/game-contract.d.ts +53 -0
  21. package/dist/adapter/ingest/game-contract.d.ts.map +1 -0
  22. package/dist/adapter/ingest/game-contract.js +30 -0
  23. package/dist/adapter/ingest/overlay-applier.d.ts +118 -0
  24. package/dist/adapter/ingest/overlay-applier.d.ts.map +1 -0
  25. package/dist/adapter/ingest/overlay-applier.js +132 -0
  26. package/dist/adapter/ingest/overlay-apply.d.ts +60 -0
  27. package/dist/adapter/ingest/overlay-apply.d.ts.map +1 -0
  28. package/dist/adapter/ingest/overlay-apply.js +101 -0
  29. package/dist/adapter/ingest/overlay-file.d.ts +79 -0
  30. package/dist/adapter/ingest/overlay-file.d.ts.map +1 -0
  31. package/dist/adapter/ingest/overlay-file.js +66 -0
  32. package/dist/adapter/ingest/overlay-report.d.ts +113 -0
  33. package/dist/adapter/ingest/overlay-report.d.ts.map +1 -0
  34. package/dist/adapter/ingest/overlay-report.js +103 -0
  35. package/dist/adapter/ingest/scene-capture.d.ts +97 -0
  36. package/dist/adapter/ingest/scene-capture.d.ts.map +1 -0
  37. package/dist/adapter/ingest/scene-capture.js +248 -0
  38. package/dist/adapter/ingest/upstream-pin.d.ts +47 -0
  39. package/dist/adapter/ingest/upstream-pin.d.ts.map +1 -0
  40. package/dist/adapter/ingest/upstream-pin.js +50 -0
  41. package/dist/adapter/loop-gate-report.d.ts +34 -0
  42. package/dist/adapter/loop-gate-report.d.ts.map +1 -0
  43. package/dist/adapter/loop-gate-report.js +37 -0
  44. package/dist/adapter/rapier-physics-adapter.d.ts +12 -0
  45. package/dist/adapter/rapier-physics-adapter.d.ts.map +1 -0
  46. package/dist/adapter/rapier-physics-adapter.js +46 -0
  47. package/dist/adapter/system-adapter.d.ts +133 -0
  48. package/dist/adapter/system-adapter.d.ts.map +1 -0
  49. package/dist/adapter/system-adapter.js +13 -0
  50. package/dist/adapter/transform.d.ts +18 -0
  51. package/dist/adapter/transform.d.ts.map +1 -0
  52. package/dist/adapter/transform.js +1 -0
  53. package/dist/adapter/vgai-scene-game-adapter.d.ts +116 -0
  54. package/dist/adapter/vgai-scene-game-adapter.d.ts.map +1 -0
  55. package/dist/adapter/vgai-scene-game-adapter.js +714 -0
  56. package/dist/adapter/world-kind.d.ts +30 -0
  57. package/dist/adapter/world-kind.d.ts.map +1 -0
  58. package/dist/adapter/world-kind.js +18 -0
  59. package/dist/ai/navigation.d.ts +64 -0
  60. package/dist/ai/navigation.d.ts.map +1 -0
  61. package/dist/ai/navigation.js +133 -0
  62. package/dist/animation/anim-graph-types.d.ts +25 -0
  63. package/dist/animation/anim-graph-types.d.ts.map +1 -0
  64. package/dist/animation/anim-graph-types.js +1 -0
  65. package/dist/animation/animation-clock.d.ts +213 -0
  66. package/dist/animation/animation-clock.d.ts.map +1 -0
  67. package/dist/animation/animation-clock.js +301 -0
  68. package/dist/animation/blend-node.d.ts +22 -0
  69. package/dist/animation/blend-node.d.ts.map +1 -0
  70. package/dist/animation/blend-node.js +97 -0
  71. package/dist/animation/camera-ownership.d.ts +250 -0
  72. package/dist/animation/camera-ownership.d.ts.map +1 -0
  73. package/dist/animation/camera-ownership.js +169 -0
  74. package/dist/animation/cinematic-cues.d.ts +200 -0
  75. package/dist/animation/cinematic-cues.d.ts.map +1 -0
  76. package/dist/animation/cinematic-cues.js +213 -0
  77. package/dist/animation/clip-map.d.ts +12 -0
  78. package/dist/animation/clip-map.d.ts.map +1 -0
  79. package/dist/animation/clip-map.js +37 -0
  80. package/dist/animation/gsap-registration.d.ts +119 -0
  81. package/dist/animation/gsap-registration.d.ts.map +1 -0
  82. package/dist/animation/gsap-registration.js +92 -0
  83. package/dist/animation/theatre-clock-binding.d.ts +89 -0
  84. package/dist/animation/theatre-clock-binding.d.ts.map +1 -0
  85. package/dist/animation/theatre-clock-binding.js +29 -0
  86. package/dist/animation/theatre-director.d.ts +242 -0
  87. package/dist/animation/theatre-director.d.ts.map +1 -0
  88. package/dist/animation/theatre-director.js +235 -0
  89. package/dist/animation/theatre-object-binding.d.ts +305 -0
  90. package/dist/animation/theatre-object-binding.d.ts.map +1 -0
  91. package/dist/animation/theatre-object-binding.js +351 -0
  92. package/dist/animation/xstate-animation-binding.d.ts +111 -0
  93. package/dist/animation/xstate-animation-binding.d.ts.map +1 -0
  94. package/dist/animation/xstate-animation-binding.js +307 -0
  95. package/dist/animation/xstate-animation-meta.d.ts +228 -0
  96. package/dist/animation/xstate-animation-meta.d.ts.map +1 -0
  97. package/dist/animation/xstate-animation-meta.js +221 -0
  98. package/dist/assets.d.ts +26 -0
  99. package/dist/assets.d.ts.map +1 -0
  100. package/dist/assets.js +55 -0
  101. package/dist/audio/index.d.ts +4 -0
  102. package/dist/audio/index.d.ts.map +1 -0
  103. package/dist/audio/index.js +24 -0
  104. package/dist/audio/tone-clock-binding.d.ts +75 -0
  105. package/dist/audio/tone-clock-binding.d.ts.map +1 -0
  106. package/dist/audio/tone-clock-binding.js +29 -0
  107. package/dist/audio/tone-context.d.ts +114 -0
  108. package/dist/audio/tone-context.d.ts.map +1 -0
  109. package/dist/audio/tone-context.js +39 -0
  110. package/dist/audio/tone-offline-render.d.ts +90 -0
  111. package/dist/audio/tone-offline-render.d.ts.map +1 -0
  112. package/dist/audio/tone-offline-render.js +56 -0
  113. package/dist/audio/wav-encode.d.ts +38 -0
  114. package/dist/audio/wav-encode.d.ts.map +1 -0
  115. package/dist/audio/wav-encode.js +97 -0
  116. package/dist/core/game-loop.d.ts +21 -0
  117. package/dist/core/game-loop.d.ts.map +1 -0
  118. package/dist/core/game-loop.js +130 -0
  119. package/dist/core/system-runner.d.ts +120 -0
  120. package/dist/core/system-runner.d.ts.map +1 -0
  121. package/dist/core/system-runner.js +286 -0
  122. package/dist/core/types.d.ts +58 -0
  123. package/dist/core/types.d.ts.map +1 -0
  124. package/dist/core/types.js +25 -0
  125. package/dist/data/data-asset.d.ts +101 -0
  126. package/dist/data/data-asset.d.ts.map +1 -0
  127. package/dist/data/data-asset.js +122 -0
  128. package/dist/data/data-check-core.d.ts +110 -0
  129. package/dist/data/data-check-core.d.ts.map +1 -0
  130. package/dist/data/data-check-core.js +178 -0
  131. package/dist/data/data-ref.d.ts +79 -0
  132. package/dist/data/data-ref.d.ts.map +1 -0
  133. package/dist/data/data-ref.js +130 -0
  134. package/dist/data/vite-plugin-data.d.ts +79 -0
  135. package/dist/data/vite-plugin-data.d.ts.map +1 -0
  136. package/dist/data/vite-plugin-data.js +217 -0
  137. package/dist/dev/console-bridge.d.ts +22 -0
  138. package/dist/dev/console-bridge.d.ts.map +1 -0
  139. package/dist/dev/console-bridge.js +71 -0
  140. package/dist/dev/debug-draw.d.ts +24 -0
  141. package/dist/dev/debug-draw.d.ts.map +1 -0
  142. package/dist/dev/debug-draw.js +73 -0
  143. package/dist/dev/logger.d.ts +30 -0
  144. package/dist/dev/logger.d.ts.map +1 -0
  145. package/dist/dev/logger.js +90 -0
  146. package/dist/ecs/component-manager.d.ts +189 -0
  147. package/dist/ecs/component-manager.d.ts.map +1 -0
  148. package/dist/ecs/component-manager.js +676 -0
  149. package/dist/ecs/game-component.d.ts +97 -0
  150. package/dist/ecs/game-component.d.ts.map +1 -0
  151. package/dist/ecs/game-component.js +80 -0
  152. package/dist/ecs/hmr-swap-report.d.ts +53 -0
  153. package/dist/ecs/hmr-swap-report.d.ts.map +1 -0
  154. package/dist/ecs/hmr-swap-report.js +55 -0
  155. package/dist/index.d.ts +37 -0
  156. package/dist/index.d.ts.map +1 -0
  157. package/dist/index.js +30 -0
  158. package/dist/input/input-manager.d.ts +596 -0
  159. package/dist/input/input-manager.d.ts.map +1 -0
  160. package/dist/input/input-manager.js +1564 -0
  161. package/dist/input/input-types.d.ts +171 -0
  162. package/dist/input/input-types.d.ts.map +1 -0
  163. package/dist/input/input-types.js +1 -0
  164. package/dist/input/prompt-labels.d.ts +21 -0
  165. package/dist/input/prompt-labels.d.ts.map +1 -0
  166. package/dist/input/prompt-labels.js +121 -0
  167. package/dist/input/rebind-controller.d.ts +59 -0
  168. package/dist/input/rebind-controller.d.ts.map +1 -0
  169. package/dist/input/rebind-controller.js +85 -0
  170. package/dist/input/schema.d.ts +16 -0
  171. package/dist/input/schema.d.ts.map +1 -0
  172. package/dist/input/schema.js +228 -0
  173. package/dist/loader.d.ts +43 -0
  174. package/dist/loader.d.ts.map +1 -0
  175. package/dist/loader.js +59 -0
  176. package/dist/manifest/index.d.ts +5 -0
  177. package/dist/manifest/index.d.ts.map +1 -0
  178. package/dist/manifest/index.js +8 -0
  179. package/dist/manifest/load-file.d.ts +4 -0
  180. package/dist/manifest/load-file.d.ts.map +1 -0
  181. package/dist/manifest/load-file.js +14 -0
  182. package/dist/manifest/load.d.ts +117 -0
  183. package/dist/manifest/load.d.ts.map +1 -0
  184. package/dist/manifest/load.js +255 -0
  185. package/dist/manifest/schema.d.ts +173 -0
  186. package/dist/manifest/schema.d.ts.map +1 -0
  187. package/dist/manifest/schema.js +302 -0
  188. package/dist/physics/collision-system.d.ts +41 -0
  189. package/dist/physics/collision-system.d.ts.map +1 -0
  190. package/dist/physics/collision-system.js +64 -0
  191. package/dist/physics/physics-registry.d.ts +45 -0
  192. package/dist/physics/physics-registry.d.ts.map +1 -0
  193. package/dist/physics/physics-registry.js +65 -0
  194. package/dist/physics/transform-writer.d.ts +16 -0
  195. package/dist/physics/transform-writer.d.ts.map +1 -0
  196. package/dist/physics/transform-writer.js +38 -0
  197. package/dist/physics/trigger-dispatch.d.ts +24 -0
  198. package/dist/physics/trigger-dispatch.d.ts.map +1 -0
  199. package/dist/physics/trigger-dispatch.js +80 -0
  200. package/dist/react/game-state.d.ts +105 -0
  201. package/dist/react/game-state.d.ts.map +1 -0
  202. package/dist/react/game-state.js +144 -0
  203. package/dist/react/use-data.d.ts +60 -0
  204. package/dist/react/use-data.d.ts.map +1 -0
  205. package/dist/react/use-data.js +96 -0
  206. package/dist/react/use-selection.d.ts +75 -0
  207. package/dist/react/use-selection.d.ts.map +1 -0
  208. package/dist/react/use-selection.js +90 -0
  209. package/dist/render/auto-batcher.d.ts +34 -0
  210. package/dist/render/auto-batcher.d.ts.map +1 -0
  211. package/dist/render/auto-batcher.js +140 -0
  212. package/dist/render/render-batch-system.d.ts +33 -0
  213. package/dist/render/render-batch-system.d.ts.map +1 -0
  214. package/dist/render/render-batch-system.js +230 -0
  215. package/dist/render/render-features.d.ts +47 -0
  216. package/dist/render/render-features.d.ts.map +1 -0
  217. package/dist/render/render-features.js +105 -0
  218. package/dist/render/render-settings.d.ts +36 -0
  219. package/dist/render/render-settings.d.ts.map +1 -0
  220. package/dist/render/render-settings.js +51 -0
  221. package/dist/runtime/create-runtime.d.ts +280 -0
  222. package/dist/runtime/create-runtime.d.ts.map +1 -0
  223. package/dist/runtime/create-runtime.js +795 -0
  224. package/dist/runtime/frame-selector-cache.d.ts +41 -0
  225. package/dist/runtime/frame-selector-cache.d.ts.map +1 -0
  226. package/dist/runtime/frame-selector-cache.js +65 -0
  227. package/dist/runtime/game.d.ts +433 -0
  228. package/dist/runtime/game.d.ts.map +1 -0
  229. package/dist/runtime/game.js +569 -0
  230. package/dist/runtime/input-router.d.ts +78 -0
  231. package/dist/runtime/input-router.d.ts.map +1 -0
  232. package/dist/runtime/input-router.js +171 -0
  233. package/dist/runtime/mount-game.d.ts +129 -0
  234. package/dist/runtime/mount-game.d.ts.map +1 -0
  235. package/dist/runtime/mount-game.js +152 -0
  236. package/dist/runtime/mount-manifest.d.ts +119 -0
  237. package/dist/runtime/mount-manifest.d.ts.map +1 -0
  238. package/dist/runtime/mount-manifest.js +204 -0
  239. package/dist/runtime/render-audio-control.d.ts +110 -0
  240. package/dist/runtime/render-audio-control.d.ts.map +1 -0
  241. package/dist/runtime/render-audio-control.js +111 -0
  242. package/dist/runtime/render-control.d.ts +291 -0
  243. package/dist/runtime/render-control.d.ts.map +1 -0
  244. package/dist/runtime/render-control.js +264 -0
  245. package/dist/runtime/render-seed.d.ts +57 -0
  246. package/dist/runtime/render-seed.d.ts.map +1 -0
  247. package/dist/runtime/render-seed.js +74 -0
  248. package/dist/runtime/scene-ui-bridge.d.ts +69 -0
  249. package/dist/runtime/scene-ui-bridge.d.ts.map +1 -0
  250. package/dist/runtime/scene-ui-bridge.js +23 -0
  251. package/dist/runtime/scene-ui-data.d.ts +13 -0
  252. package/dist/runtime/scene-ui-data.d.ts.map +1 -0
  253. package/dist/runtime/scene-ui-data.js +92 -0
  254. package/dist/runtime/state-bridge.d.ts +47 -0
  255. package/dist/runtime/state-bridge.d.ts.map +1 -0
  256. package/dist/runtime/state-bridge.js +53 -0
  257. package/dist/runtime/types.d.ts +179 -0
  258. package/dist/runtime/types.d.ts.map +1 -0
  259. package/dist/runtime/types.js +1 -0
  260. package/dist/scene/asset-loaders.d.ts +79 -0
  261. package/dist/scene/asset-loaders.d.ts.map +1 -0
  262. package/dist/scene/asset-loaders.js +141 -0
  263. package/dist/scene/asset-paths.d.ts +11 -0
  264. package/dist/scene/asset-paths.d.ts.map +1 -0
  265. package/dist/scene/asset-paths.js +108 -0
  266. package/dist/scene/asset-ref-check.d.ts +88 -0
  267. package/dist/scene/asset-ref-check.d.ts.map +1 -0
  268. package/dist/scene/asset-ref-check.js +214 -0
  269. package/dist/scene/asset-registry.d.ts +30 -0
  270. package/dist/scene/asset-registry.d.ts.map +1 -0
  271. package/dist/scene/asset-registry.js +50 -0
  272. package/dist/scene/collider-dimensions.d.ts +63 -0
  273. package/dist/scene/collider-dimensions.d.ts.map +1 -0
  274. package/dist/scene/collider-dimensions.js +98 -0
  275. package/dist/scene/component-registry.d.ts +17 -0
  276. package/dist/scene/component-registry.d.ts.map +1 -0
  277. package/dist/scene/component-registry.js +28 -0
  278. package/dist/scene/defaults.d.ts +252 -0
  279. package/dist/scene/defaults.d.ts.map +1 -0
  280. package/dist/scene/defaults.js +151 -0
  281. package/dist/scene/geometries/index.d.ts +8 -0
  282. package/dist/scene/geometries/index.d.ts.map +1 -0
  283. package/dist/scene/geometries/index.js +7 -0
  284. package/dist/scene/geometries/terrain.d.ts +2 -0
  285. package/dist/scene/geometries/terrain.d.ts.map +1 -0
  286. package/dist/scene/geometries/terrain.js +37 -0
  287. package/dist/scene/geometry-registry.d.ts +24 -0
  288. package/dist/scene/geometry-registry.d.ts.map +1 -0
  289. package/dist/scene/geometry-registry.js +20 -0
  290. package/dist/scene/instance-registry.d.ts +36 -0
  291. package/dist/scene/instance-registry.d.ts.map +1 -0
  292. package/dist/scene/instance-registry.js +55 -0
  293. package/dist/scene/instancers/grid.d.ts +2 -0
  294. package/dist/scene/instancers/grid.d.ts.map +1 -0
  295. package/dist/scene/instancers/grid.js +36 -0
  296. package/dist/scene/instancers/index.d.ts +8 -0
  297. package/dist/scene/instancers/index.d.ts.map +1 -0
  298. package/dist/scene/instancers/index.js +7 -0
  299. package/dist/scene/light-camera-factory.d.ts +23 -0
  300. package/dist/scene/light-camera-factory.d.ts.map +1 -0
  301. package/dist/scene/light-camera-factory.js +68 -0
  302. package/dist/scene/material-factory.d.ts +17 -0
  303. package/dist/scene/material-factory.d.ts.map +1 -0
  304. package/dist/scene/material-factory.js +197 -0
  305. package/dist/scene/material-registry.d.ts +40 -0
  306. package/dist/scene/material-registry.d.ts.map +1 -0
  307. package/dist/scene/material-registry.js +44 -0
  308. package/dist/scene/materials/index.d.ts +8 -0
  309. package/dist/scene/materials/index.d.ts.map +1 -0
  310. package/dist/scene/materials/index.js +7 -0
  311. package/dist/scene/materials/water.d.ts +2 -0
  312. package/dist/scene/materials/water.d.ts.map +1 -0
  313. package/dist/scene/materials/water.js +54 -0
  314. package/dist/scene/parse.d.ts +23 -0
  315. package/dist/scene/parse.d.ts.map +1 -0
  316. package/dist/scene/parse.js +179 -0
  317. package/dist/scene/particles-factory.d.ts +33 -0
  318. package/dist/scene/particles-factory.d.ts.map +1 -0
  319. package/dist/scene/particles-factory.js +282 -0
  320. package/dist/scene/scene-apply.d.ts +109 -0
  321. package/dist/scene/scene-apply.d.ts.map +1 -0
  322. package/dist/scene/scene-apply.js +326 -0
  323. package/dist/scene/scene-diff-schema.d.ts +285 -0
  324. package/dist/scene/scene-diff-schema.d.ts.map +1 -0
  325. package/dist/scene/scene-diff-schema.js +92 -0
  326. package/dist/scene/scene-diff-types.d.ts +40 -0
  327. package/dist/scene/scene-diff-types.d.ts.map +1 -0
  328. package/dist/scene/scene-diff-types.js +14 -0
  329. package/dist/scene/scene-loader.d.ts +177 -0
  330. package/dist/scene/scene-loader.d.ts.map +1 -0
  331. package/dist/scene/scene-loader.js +1213 -0
  332. package/dist/scene/scene-query.d.ts +11 -0
  333. package/dist/scene/scene-query.d.ts.map +1 -0
  334. package/dist/scene/scene-query.js +63 -0
  335. package/dist/scene/scene-types.d.ts +10 -0
  336. package/dist/scene/scene-types.d.ts.map +1 -0
  337. package/dist/scene/scene-types.js +8 -0
  338. package/dist/scene/scene-version.d.ts +26 -0
  339. package/dist/scene/scene-version.d.ts.map +1 -0
  340. package/dist/scene/scene-version.js +34 -0
  341. package/dist/scene/schema/animation.d.ts +8 -0
  342. package/dist/scene/schema/animation.d.ts.map +1 -0
  343. package/dist/scene/schema/animation.js +42 -0
  344. package/dist/scene/schema/audio.d.ts +13 -0
  345. package/dist/scene/schema/audio.d.ts.map +1 -0
  346. package/dist/scene/schema/audio.js +22 -0
  347. package/dist/scene/schema/camera.d.ts +28 -0
  348. package/dist/scene/schema/camera.d.ts.map +1 -0
  349. package/dist/scene/schema/camera.js +17 -0
  350. package/dist/scene/schema/collider.d.ts +40 -0
  351. package/dist/scene/schema/collider.d.ts.map +1 -0
  352. package/dist/scene/schema/collider.js +55 -0
  353. package/dist/scene/schema/entity-ref.d.ts +31 -0
  354. package/dist/scene/schema/entity-ref.d.ts.map +1 -0
  355. package/dist/scene/schema/entity-ref.js +61 -0
  356. package/dist/scene/schema/entity.d.ts +1036 -0
  357. package/dist/scene/schema/entity.d.ts.map +1 -0
  358. package/dist/scene/schema/entity.js +153 -0
  359. package/dist/scene/schema/environment.d.ts +425 -0
  360. package/dist/scene/schema/environment.d.ts.map +1 -0
  361. package/dist/scene/schema/environment.js +357 -0
  362. package/dist/scene/schema/index.d.ts +39 -0
  363. package/dist/scene/schema/index.d.ts.map +1 -0
  364. package/dist/scene/schema/index.js +20 -0
  365. package/dist/scene/schema/instances.d.ts +14 -0
  366. package/dist/scene/schema/instances.d.ts.map +1 -0
  367. package/dist/scene/schema/instances.js +28 -0
  368. package/dist/scene/schema/joint.d.ts +23 -0
  369. package/dist/scene/schema/joint.d.ts.map +1 -0
  370. package/dist/scene/schema/joint.js +23 -0
  371. package/dist/scene/schema/light.d.ts +38 -0
  372. package/dist/scene/schema/light.d.ts.map +1 -0
  373. package/dist/scene/schema/light.js +26 -0
  374. package/dist/scene/schema/material.d.ts +199 -0
  375. package/dist/scene/schema/material.d.ts.map +1 -0
  376. package/dist/scene/schema/material.js +99 -0
  377. package/dist/scene/schema/mesh.d.ts +48 -0
  378. package/dist/scene/schema/mesh.d.ts.map +1 -0
  379. package/dist/scene/schema/mesh.js +82 -0
  380. package/dist/scene/schema/particles.d.ts +2178 -0
  381. package/dist/scene/schema/particles.d.ts.map +1 -0
  382. package/dist/scene/schema/particles.js +321 -0
  383. package/dist/scene/schema/physics.d.ts +56 -0
  384. package/dist/scene/schema/physics.d.ts.map +1 -0
  385. package/dist/scene/schema/physics.js +37 -0
  386. package/dist/scene/schema/scene-file.d.ts +304 -0
  387. package/dist/scene/schema/scene-file.d.ts.map +1 -0
  388. package/dist/scene/schema/scene-file.js +262 -0
  389. package/dist/scene/schema/shadow.d.ts +28 -0
  390. package/dist/scene/schema/shadow.d.ts.map +1 -0
  391. package/dist/scene/schema/shadow.js +20 -0
  392. package/dist/scene/schema/spline.d.ts +25 -0
  393. package/dist/scene/schema/spline.d.ts.map +1 -0
  394. package/dist/scene/schema/spline.js +15 -0
  395. package/dist/scene/schema/tuples.d.ts +12 -0
  396. package/dist/scene/schema/tuples.d.ts.map +1 -0
  397. package/dist/scene/schema/tuples.js +14 -0
  398. package/dist/scene/schema/ui.d.ts +880 -0
  399. package/dist/scene/schema/ui.d.ts.map +1 -0
  400. package/dist/scene/schema/ui.js +506 -0
  401. package/dist/scene/user-data.d.ts +171 -0
  402. package/dist/scene/user-data.d.ts.map +1 -0
  403. package/dist/scene/user-data.js +137 -0
  404. package/dist/setup/setup-audio.d.ts +20 -0
  405. package/dist/setup/setup-audio.d.ts.map +1 -0
  406. package/dist/setup/setup-audio.js +41 -0
  407. package/dist/setup/setup-particles.d.ts +17 -0
  408. package/dist/setup/setup-particles.d.ts.map +1 -0
  409. package/dist/setup/setup-particles.js +16 -0
  410. package/dist/setup/setup-physics.d.ts +25 -0
  411. package/dist/setup/setup-physics.d.ts.map +1 -0
  412. package/dist/setup/setup-physics.js +51 -0
  413. package/dist/setup/setup-renderer.d.ts +69 -0
  414. package/dist/setup/setup-renderer.d.ts.map +1 -0
  415. package/dist/setup/setup-renderer.js +363 -0
  416. package/dist/tools/define-tool.d.ts +105 -0
  417. package/dist/tools/define-tool.d.ts.map +1 -0
  418. package/dist/tools/define-tool.js +82 -0
  419. package/dist/world2d/authoring-2d.d.ts +76 -0
  420. package/dist/world2d/authoring-2d.d.ts.map +1 -0
  421. package/dist/world2d/authoring-2d.js +176 -0
  422. package/dist/world2d/capture-to-scene2d.d.ts +5 -0
  423. package/dist/world2d/capture-to-scene2d.d.ts.map +1 -0
  424. package/dist/world2d/capture-to-scene2d.js +49 -0
  425. package/dist/world2d/collision-2d.d.ts +52 -0
  426. package/dist/world2d/collision-2d.d.ts.map +1 -0
  427. package/dist/world2d/collision-2d.js +70 -0
  428. package/dist/world2d/components-2d.d.ts +47 -0
  429. package/dist/world2d/components-2d.d.ts.map +1 -0
  430. package/dist/world2d/components-2d.js +77 -0
  431. package/dist/world2d/index.d.ts +34 -0
  432. package/dist/world2d/index.d.ts.map +1 -0
  433. package/dist/world2d/index.js +32 -0
  434. package/dist/world2d/ingest-iframe-2d.d.ts +82 -0
  435. package/dist/world2d/ingest-iframe-2d.d.ts.map +1 -0
  436. package/dist/world2d/ingest-iframe-2d.js +166 -0
  437. package/dist/world2d/ingest2d.d.ts +97 -0
  438. package/dist/world2d/ingest2d.d.ts.map +1 -0
  439. package/dist/world2d/ingest2d.js +40 -0
  440. package/dist/world2d/physics2d-registry.d.ts +24 -0
  441. package/dist/world2d/physics2d-registry.d.ts.map +1 -0
  442. package/dist/world2d/physics2d-registry.js +38 -0
  443. package/dist/world2d/pixi-game-adapter.d.ts +107 -0
  444. package/dist/world2d/pixi-game-adapter.d.ts.map +1 -0
  445. package/dist/world2d/pixi-game-adapter.js +211 -0
  446. package/dist/world2d/pixi-surface.d.ts +39 -0
  447. package/dist/world2d/pixi-surface.d.ts.map +1 -0
  448. package/dist/world2d/pixi-surface.js +47 -0
  449. package/dist/world2d/scene-capture-2d.d.ts +43 -0
  450. package/dist/world2d/scene-capture-2d.d.ts.map +1 -0
  451. package/dist/world2d/scene-capture-2d.js +92 -0
  452. package/dist/world2d/scene2d-loader.d.ts +27 -0
  453. package/dist/world2d/scene2d-loader.d.ts.map +1 -0
  454. package/dist/world2d/scene2d-loader.js +274 -0
  455. package/dist/world2d/schema/entity2d.d.ts +102 -0
  456. package/dist/world2d/schema/entity2d.d.ts.map +1 -0
  457. package/dist/world2d/schema/entity2d.js +119 -0
  458. package/dist/world2d/schema/physics2d.d.ts +46 -0
  459. package/dist/world2d/schema/physics2d.d.ts.map +1 -0
  460. package/dist/world2d/schema/physics2d.js +45 -0
  461. package/dist/world2d/schema/sprite.d.ts +42 -0
  462. package/dist/world2d/schema/sprite.d.ts.map +1 -0
  463. package/dist/world2d/schema/sprite.js +63 -0
  464. package/dist/world2d/schema/tilemap.d.ts +15 -0
  465. package/dist/world2d/schema/tilemap.d.ts.map +1 -0
  466. package/dist/world2d/schema/tilemap.js +19 -0
  467. package/dist/world2d/schema/tuples2d.d.ts +20 -0
  468. package/dist/world2d/schema/tuples2d.d.ts.map +1 -0
  469. package/dist/world2d/schema/tuples2d.js +19 -0
  470. package/dist/world2d/system-adapters-2d.d.ts +16 -0
  471. package/dist/world2d/system-adapters-2d.d.ts.map +1 -0
  472. package/dist/world2d/system-adapters-2d.js +37 -0
  473. package/dist/world2d/transform-writer-2d.d.ts +16 -0
  474. package/dist/world2d/transform-writer-2d.d.ts.map +1 -0
  475. package/dist/world2d/transform-writer-2d.js +22 -0
  476. package/dist/world2d/types.d.ts +53 -0
  477. package/dist/world2d/types.d.ts.map +1 -0
  478. package/dist/world2d/types.js +1 -0
  479. package/package.json +18 -4
  480. package/src/adapter/authoring.ts +10 -0
  481. package/src/adapter/first-party-systems.ts +23 -34
  482. package/src/adapter/index.ts +1 -3
  483. package/src/adapter/system-adapter.ts +15 -22
  484. package/src/adapter/vgai-scene-game-adapter.ts +5 -14
  485. package/src/animation/anim-graph-types.ts +12 -43
  486. package/src/animation/animation-clock.ts +479 -0
  487. package/src/animation/camera-ownership.ts +467 -0
  488. package/src/animation/cinematic-cues.ts +451 -0
  489. package/src/animation/clip-map.ts +41 -0
  490. package/src/animation/gsap-registration.ts +184 -0
  491. package/src/animation/theatre-clock-binding.ts +111 -0
  492. package/src/animation/theatre-director.ts +347 -0
  493. package/src/animation/theatre-object-binding.ts +661 -0
  494. package/src/animation/xstate-animation-binding.ts +398 -0
  495. package/src/animation/xstate-animation-meta.ts +282 -0
  496. package/src/audio/index.ts +39 -7
  497. package/src/audio/tone-clock-binding.ts +98 -0
  498. package/src/audio/tone-context.ts +129 -0
  499. package/src/audio/tone-offline-render.ts +167 -0
  500. package/src/audio/wav-encode.ts +119 -0
  501. package/src/core/game-loop.ts +17 -0
  502. package/src/core/types.ts +13 -0
  503. package/src/data/data-asset.ts +167 -0
  504. package/src/data/data-check-core.ts +242 -0
  505. package/src/data/data-ref.ts +145 -0
  506. package/src/data/vite-plugin-data.ts +290 -0
  507. package/src/index.ts +48 -0
  508. package/src/input/input-manager.ts +1206 -32
  509. package/src/input/input-types.ts +155 -3
  510. package/src/input/prompt-labels.ts +122 -0
  511. package/src/input/rebind-controller.ts +105 -0
  512. package/src/input/schema.ts +206 -52
  513. package/src/react/use-data.ts +114 -0
  514. package/src/react/use-selection.tsx +135 -0
  515. package/src/runtime/create-runtime.ts +30 -9
  516. package/src/runtime/render-audio-control.ts +168 -0
  517. package/src/runtime/render-control.ts +522 -0
  518. package/src/runtime/render-seed.ts +79 -0
  519. package/src/runtime/types.ts +0 -5
  520. package/src/scene/asset-loaders.ts +10 -36
  521. package/src/scene/asset-paths.ts +0 -2
  522. package/src/scene/asset-ref-check.ts +248 -0
  523. package/src/scene/parse.ts +133 -0
  524. package/src/scene/scene-loader.ts +81 -96
  525. package/src/scene/schema/animation.ts +30 -79
  526. package/src/scene/schema/entity.ts +20 -0
  527. package/src/scene/schema/index.ts +2 -12
  528. package/src/scene/user-data.ts +8 -9
  529. package/src/setup/setup-renderer.ts +9 -2
  530. package/src/tools/define-tool.ts +152 -0
  531. package/src/animation/anim-graph.ts +0 -406
  532. package/src/animation/anim-system.ts +0 -28
  533. package/src/animation/property-track.ts +0 -178
  534. package/src/animation/schema.ts +0 -204
  535. package/src/audio/ambient.ts +0 -300
  536. package/src/audio/impacts.ts +0 -212
  537. package/src/audio/movement.ts +0 -140
  538. package/src/audio/musical.ts +0 -200
  539. package/src/audio/ui-sounds.ts +0 -171
  540. package/src/audio/vehicle.ts +0 -235
  541. package/src/audio/weapons.ts +0 -152
@@ -0,0 +1,111 @@
1
+ import type { ISequence } from '@theatre/core';
2
+ import type { SystemPhaseName } from '../core/types';
3
+ import type { AnimationClock, ClockEvaluatorHandle } from './animation-clock';
4
+
5
+ /**
6
+ * D2 — bind the canonical `AnimationClock` to a Theatre sequence's playhead
7
+ * (spec §10 D2, §5.3, §3.2).
8
+ *
9
+ * This is VGAI's ENTIRE glue for Theatre integration on the clock side:
10
+ * games import and configure `@theatre/core` with its own native vocabulary
11
+ * (`getProject`/`types`/`sheet`/`object`, spec §5.3) — there is no renamed
12
+ * Theatre API here. The only thing VGAI owns is *who drives time*: the
13
+ * canonical clock is the single source of truth, and this binding seeks
14
+ * Theatre's sequence position to match it every time the clock moves. Theatre
15
+ * must never be left to drive its own `requestAnimationFrame` loop — see the
16
+ * module doc on `animation-clock.ts` for why (deterministic export, offline
17
+ * scrubbing, no wall-clock dependency).
18
+ *
19
+ * ## Why setting `sequence.position` is enough (no `sequence.play()`)
20
+ *
21
+ * Theatre's `ISequence.position` setter synchronously updates every bound
22
+ * `SheetObject`'s pull-based `.value` (proven against the real `@theatre/core`
23
+ * runtime in `packages/engine/test/theatre-binding.test.ts` — setting
24
+ * `position` and immediately reading `.value` reflects the new keyframe
25
+ * interpolation with no `requestAnimationFrame`/ticker wait, which is exactly
26
+ * what makes this safe to drive from a synchronous, wall-clock-free
27
+ * `AnimationClock.seek()`/`advance()` call, including headlessly in Node for
28
+ * the render/export seam, I2). Theatre's *push* notification channel
29
+ * (`onValuesChange`/`onChange`) is batched on its own internal raf-driven
30
+ * ticker — it is not delivered 1:1 with each programmatic `position` write,
31
+ * so a subscriber can observe several coalesced position writes as a single
32
+ * notification, or (in a headless/no-raf context) none at all — so object
33
+ * bindings (`theatre-object-binding.ts`) deliberately read `sheetObject.value`
34
+ * (pull) after this binding has run, rather than subscribing to Theatre's
35
+ * push channel, to stay exactly in lockstep with the clock.
36
+ *
37
+ * ## Phase choice
38
+ *
39
+ * Note on phase semantics: `phase` here orders evaluators WITHIN a single
40
+ * clock `emit()` — i.e. within one `seek()`/`advance()` call — using the
41
+ * engine's `SystemPhaseName` vocabulary purely as a shared, familiar naming
42
+ * convention (`animation-clock.ts`'s module doc). It does NOT mean an
43
+ * evaluator registered at, say, `'preRender'` executes during the live
44
+ * engine's own `system-runner` `preRender` phase call within a running RAF
45
+ * frame — the `AnimationClock` is independent of the live game loop's phase
46
+ * execution, and during offline export/scrub there is no RAF frame at all.
47
+ * `phase` only orders same-emit evaluators relative to each other (e.g.
48
+ * guaranteeing this clock-to-sequence binding runs before an object binding
49
+ * reads the sequence on the same crossing), never relative to unrelated
50
+ * engine systems that happen to run in a same-named phase during a live
51
+ * frame.
52
+ *
53
+ * Registered by default at the `'animation'` phase — the same phase
54
+ * XState-bound `AnimationMixer` playback ticks in (see `ARCHITECTURE.md`'s
55
+ * phase table: `... gameLogic → animation → preRender → render`). Object
56
+ * bindings (`bindObject3DTransform`/`bindCameraLens`) default to `'preRender'`
57
+ * (the documented home for camera placement/material tick) specifically so
58
+ * `PHASE_ORDER` — not registration order — guarantees they observe the
59
+ * position this binding just set, regardless of which binding a caller sets
60
+ * up first.
61
+ */
62
+
63
+ export interface TheatreClockBindingOptions {
64
+ /**
65
+ * Which `AnimationClock` phase to seek the sequence in. Defaults to
66
+ * `'animation'`. Any object binding reading this sheet's objects should use
67
+ * a phase that runs no earlier (see module doc above) — `'preRender'`, the
68
+ * default for `bindObject3DTransform`/`bindCameraLens`, always qualifies.
69
+ */
70
+ phase?: SystemPhaseName;
71
+ }
72
+
73
+ export interface TheatreClockBinding {
74
+ /** Removes the clock evaluator. No further `sequence.position` writes occur after this. */
75
+ dispose(): void;
76
+ }
77
+
78
+ /**
79
+ * Subscribe `sequence.position = clock.time` to every crossing of `clock` in
80
+ * the given phase (default `'animation'`). Returns a disposer; call it to
81
+ * stop driving the sequence (e.g. on `GameCleanup.dispose()` or before
82
+ * rebinding on hot reload — this is what keeps HMR from accumulating
83
+ * duplicate listeners, since re-running `setup()` disposes the old binding
84
+ * before creating a new one).
85
+ *
86
+ * Multiple sheets/sequences can each get their own binding with no shared
87
+ * mutable state on VGAI's side — collision avoidance for the underlying
88
+ * Theatre project/sheet identity is Theatre's own `getProject(id)`/
89
+ * `project.sheet(id)` namespacing (spec §5.3), which this function does not
90
+ * touch or wrap.
91
+ */
92
+ export function bindClockToTheatreSequence(
93
+ clock: AnimationClock,
94
+ sequence: ISequence,
95
+ options: TheatreClockBindingOptions = {},
96
+ ): TheatreClockBinding {
97
+ const phase = options.phase ?? 'animation';
98
+
99
+ const handle: ClockEvaluatorHandle = clock.subscribe(phase, () => {
100
+ sequence.position = clock.time;
101
+ });
102
+
103
+ let disposed = false;
104
+ return {
105
+ dispose(): void {
106
+ if (disposed) return;
107
+ disposed = true;
108
+ handle.dispose();
109
+ },
110
+ };
111
+ }
@@ -0,0 +1,347 @@
1
+ import type { ISheetObject, UnknownShorthandCompoundProps } from '@theatre/core';
2
+ import type { SystemPhaseName } from '../core/types';
3
+ import type { AnimationClock, ClockEvaluatorHandle } from './animation-clock';
4
+
5
+ /**
6
+ * D4 — the Theatre "Director" convention (spec §10 D4, §5.3, §3.2).
7
+ *
8
+ * A `Director` is an ordinary Theatre Sheet Object, authored with Theatre's
9
+ * NATIVE `types.stringLiteral`/`types.boolean` vocabulary exactly as shown in
10
+ * spec §5.3 — this module never wraps or renames that API. It is a
11
+ * *convention* (a documented, stable shape) plus a thin binding, not a new
12
+ * animation format:
13
+ *
14
+ * ```ts
15
+ * import { types } from '@theatre/core';
16
+ * const director = sheet.object('Director', {
17
+ * activeCamera: types.stringLiteral('wide', { wide: 'wide', close: 'close', gameplay: 'gameplay' }),
18
+ * shot: types.stringLiteral('opening', { opening: 'opening', reveal: 'reveal', ending: 'ending' }),
19
+ * letterbox: types.boolean(false),
20
+ * // extensible: any additional directorial prop is carried through verbatim
21
+ * // as `DirectorState.extras`, e.g.:
22
+ * blendSeconds: types.number(0, { range: [0, Infinity] }),
23
+ * });
24
+ * ```
25
+ *
26
+ * `activeCamera`/`shot`/`letterbox` are required by the convention (spec §10
27
+ * D4 AC: "covers active camera, shot ID, letterbox, and optional directorial
28
+ * properties"). Anything else declared on the same Theatre object (exposure,
29
+ * grade, a blend-duration prop, ...) is an "optional directorial property" —
30
+ * it is read and surfaced verbatim through `DirectorState.extras`, never
31
+ * hardcoded here, which is what keeps the convention extensible without
32
+ * VGAI inventing a schema for it.
33
+ *
34
+ * ## Binding: pull-based, same lockstep pattern as D2/D3
35
+ *
36
+ * `bindDirectorToClock` follows exactly the `theatre-clock-binding.ts` /
37
+ * `theatre-object-binding.ts` pattern: it reads the Director object's
38
+ * pull-based `sheetObject.value` on every canonical-clock crossing (never
39
+ * Theatre's own batched `onValuesChange` push channel — see those modules'
40
+ * doc comments for why that would desync from a synchronous `clock.seek()`).
41
+ * Default phase is `'preRender'`, the same default `bindObject3DTransform`/
42
+ * `bindCameraLens` use, so — via `PHASE_ORDER`, not registration order — the
43
+ * Director always reads a sequence position that `bindClockToTheatreSequence`
44
+ * (registered at `'animation'`, which runs earlier) has already set for this
45
+ * crossing, regardless of which binding a caller sets up first.
46
+ *
47
+ * ## Seeking updates Director without firing gameplay cues
48
+ *
49
+ * This binding has NO concept of "seek" vs "advance" — unlike
50
+ * `CueRunner` (D5, `cinematic-cues.ts`), which deliberately distinguishes the
51
+ * two (via its own `seek()`/`advance()` wrapper methods) so a
52
+ * `firesDuringSeek: false` cue can be skipped on scrub. A Director value is
53
+ * *visual/directorial state*, not a gameplay consequence (spec §3.2: "Theatre
54
+ * carries visual/directorial values; ordinary TypeScript cues carry gameplay
55
+ * consequences") — it should always reflect the clock's current time,
56
+ * however the clock got there. Composing the two on the SAME
57
+ * `AnimationClock` (Director bound directly to the clock; cues bound through
58
+ * a `CueRunner` wrapping the same clock) is exactly what makes "seek updates
59
+ * Director but does not spuriously fire gameplay cues" fall out for free: a
60
+ * `CueRunner.seek(t)` call moves the one shared clock, which both this
61
+ * binding (always reacts) and the cue runner (gates on `firesDuringSeek`)
62
+ * observe on the same crossing. See `theatre-director.test.ts`'s
63
+ * "composes with D5" suite for the proof.
64
+ *
65
+ * ## Camera-ownership hook — the D6 seam
66
+ *
67
+ * Discrete `activeCamera` changes are exactly the moments a *camera
68
+ * ownership* system (D6, not built in this unit) needs to know about, to cut
69
+ * or blend the live gameplay camera to the Director's declared shot. This
70
+ * module does not own or perform any camera mutation — it only DETECTS a
71
+ * change in the Director's `activeCamera` value across successive
72
+ * evaluations and reports it through `onActiveCameraChange`
73
+ * (`CameraOwnershipHook`), a minimal, one-directional seam:
74
+ *
75
+ * - fired once per detected `activeCamera` transition (never for a
76
+ * no-op/unchanged evaluation, including a re-seek to the same time or a
77
+ * seek that stays within the same shot's camera);
78
+ * - the FIRST evaluation after bind is treated as an "assignment", not a
79
+ * "cut from something" — `previousCameraKey` is `null` and `mode` is
80
+ * forced to `'cut'` (there is nothing to blend FROM yet; D6 is expected
81
+ * to use this event to perform its initial camera capture/placement);
82
+ * - `mode`/`blendSeconds` are derived from an optional extra numeric prop on
83
+ * the SAME Director object (`blendSecondsKey`, default `'blendSeconds'`)
84
+ * — a positive value at the moment of the transition means `'blend'`
85
+ * (with that duration), anything else means `'cut'`. This is the "expose
86
+ * enough for a consumer to cut or blend" seam named in the D4 AC; the
87
+ * ACTUAL blend implementation (interpolating the live camera pose over
88
+ * `blendSeconds`) is D6's job, not this module's.
89
+ *
90
+ * ### `blendSeconds` MUST be authored as HOLD keyframes
91
+ *
92
+ * `blendSeconds` is read at the EXACT moment `activeCamera` is detected to
93
+ * change, whatever clock time that happens to land on. If `blendSeconds` is
94
+ * authored as an ordinary interpolating (bezier) track, a transition
95
+ * detected at a time that isn't exactly a keyframe position reads whatever
96
+ * partially-interpolated value the bezier curve has reached AT THAT MOMENT —
97
+ * not the value actually authored FOR that transition. Concretely: a cut
98
+ * authored at `t=3` with `blendSeconds=0`, followed by a blend authored at
99
+ * `t=6` with `blendSeconds=1.5`, makes the track interpolate from `0` to
100
+ * `1.5` across `[3, 6)`. If the `activeCamera` transition at `t=3` is first
101
+ * *observed* at some later non-keyframe time inside that span (e.g. a coarse
102
+ * seek from `t=2` straight to `t=4.5`, skipping past `t=3` without an
103
+ * intermediate evaluation), `blendSeconds` at `t=4.5` reads a nonzero,
104
+ * partially-interpolated value — misreporting an authored CUT as a partial
105
+ * BLEND.
106
+ *
107
+ * The fix is to author `blendSeconds` keyframes as Theatre HOLD keyframes
108
+ * (`connectedRight: false`, optionally also `type: 'hold'`) rather than the
109
+ * default interpolating bezier keyframes. `connectedRight: false` makes
110
+ * Theatre's own sequence evaluator hold the LEFT keyframe's value constant
111
+ * across the entire span up to (not including) the next keyframe, then snap
112
+ * — never partially interpolate. With `blendSeconds` authored this way, its
113
+ * value at ANY time within `[3, 6)` reads exactly `0` (the cut authored at
114
+ * `t=3`), and only reads `1.5` once the clock reaches `t=6` (the blend
115
+ * authored there) — correct regardless of which non-keyframe time a
116
+ * transition happens to first be observed at. See
117
+ * `fixtures/theatre-director-proof.theatre-project.json` (its `blendSeconds`
118
+ * track uses `connectedRight: false` on every keyframe) and
119
+ * `theatre-director.test.ts`'s "playback grid" suite, which proves this by
120
+ * evaluating a fine-grained, non-keyframe-aligned time grid across the whole
121
+ * span and asserting the reported `mode` never drifts from what was
122
+ * authored at the keyframe that produced the transition.
123
+ *
124
+ * D6 will most likely implement `CameraOwnershipHook` as (roughly) "capture
125
+ * gameplay camera pose once on the first `mode: 'cut'` event; on each
126
+ * subsequent event, cut or blend the owned camera to the shot named by
127
+ * `cameraKey`". Nothing above depends on that implementation existing —
128
+ * `onActiveCameraChange` is optional and this module works with no hook
129
+ * attached at all (Director values are still readable via `getState()`).
130
+ *
131
+ * ## Read API (SDK/CLI seam, B5)
132
+ *
133
+ * `readDirectorState` is a pure, synchronous read of whatever a Director
134
+ * Theatre object's CURRENT value is — no clock/binding required. It is what
135
+ * a later `cinematic.*` SDK/CLI operation (B5) would call to inspect Director
136
+ * state (e.g. "what shot is authored at time t") without needing to spin up
137
+ * a full runtime binding. `TheatreDirectorBinding.getState()` is the
138
+ * clock-driven equivalent — it returns the value read at bind time until the
139
+ * FIRST clock crossing occurs (not "the most recent crossing" — before any
140
+ * crossing there IS no crossing yet), and the value as of the most recent
141
+ * crossing thereafter.
142
+ *
143
+ * Authoring `Director` keyframes in Theatre Studio is a dev-only workflow
144
+ * (spec §10 D2: "Theatre Studio is available only in authoring/development
145
+ * contexts"); the committed project-state JSON is the source of truth this
146
+ * module reads in production — nothing here imports the Theatre Studio
147
+ * package (see `theatre-binding.test.ts`'s repo-wide grep proof of that).
148
+ */
149
+
150
+ /** Thrown when a Theatre object does not conform to the Director convention. */
151
+ export class TheatreDirectorError extends Error {
152
+ constructor(
153
+ message: string,
154
+ readonly objectKey: string,
155
+ ) {
156
+ super(message);
157
+ this.name = 'TheatreDirectorError';
158
+ }
159
+ }
160
+
161
+ /** The Director convention's three required props, plus everything else verbatim. */
162
+ export interface DirectorState {
163
+ readonly activeCamera: string;
164
+ readonly shot: string;
165
+ readonly letterbox: boolean;
166
+ /**
167
+ * Any additional directorial props declared on the same Theatre object
168
+ * (e.g. `exposure`, `grade`, `blendSeconds`), captured verbatim from
169
+ * `sheetObject.value`. The Director convention is deliberately extensible
170
+ * here — VGAI does not enumerate or validate extras beyond the three
171
+ * required props.
172
+ */
173
+ readonly extras: Readonly<Record<string, unknown>>;
174
+ }
175
+
176
+ const REQUIRED_DIRECTOR_KEYS = new Set(['activeCamera', 'shot', 'letterbox']);
177
+
178
+ /**
179
+ * Pure, synchronous read of a Director Theatre object's CURRENT value.
180
+ * No clock/binding involved — suitable for one-shot inspection (the later
181
+ * SDK/CLI read path, B5) as well as being the function
182
+ * `bindDirectorToClock` itself calls on every crossing.
183
+ *
184
+ * @throws {TheatreDirectorError} if the object's value does not conform to
185
+ * the Director convention (missing/mistyped `activeCamera`/`shot`/`letterbox`).
186
+ */
187
+ export function readDirectorState<Props extends UnknownShorthandCompoundProps>(
188
+ sheetObject: ISheetObject<Props>,
189
+ ): DirectorState {
190
+ const raw = sheetObject.value as Record<string, unknown>;
191
+ const objectKey = sheetObject.address.objectKey;
192
+
193
+ const activeCamera = raw['activeCamera'];
194
+ if (typeof activeCamera !== 'string') {
195
+ throw new TheatreDirectorError(
196
+ `[readDirectorState] Director object "${objectKey}" is missing a string "activeCamera" prop — ` +
197
+ `declare it with types.stringLiteral(...) (spec §5.3/§10 D4)`,
198
+ objectKey,
199
+ );
200
+ }
201
+
202
+ const shot = raw['shot'];
203
+ if (typeof shot !== 'string') {
204
+ throw new TheatreDirectorError(
205
+ `[readDirectorState] Director object "${objectKey}" is missing a string "shot" prop — ` +
206
+ `declare it with types.stringLiteral(...) (spec §5.3/§10 D4)`,
207
+ objectKey,
208
+ );
209
+ }
210
+
211
+ const letterbox = raw['letterbox'];
212
+ if (typeof letterbox !== 'boolean') {
213
+ throw new TheatreDirectorError(
214
+ `[readDirectorState] Director object "${objectKey}" is missing a boolean "letterbox" prop — ` +
215
+ `declare it with types.boolean(...) (spec §5.3/§10 D4)`,
216
+ objectKey,
217
+ );
218
+ }
219
+
220
+ const extras: Record<string, unknown> = {};
221
+ for (const key of Object.keys(raw)) {
222
+ if (!REQUIRED_DIRECTOR_KEYS.has(key)) extras[key] = raw[key];
223
+ }
224
+
225
+ return { activeCamera, shot, letterbox, extras: Object.freeze(extras) };
226
+ }
227
+
228
+ /** Whether a reported `activeCamera` transition should be a hard cut or a blend. */
229
+ export type CameraCutMode = 'cut' | 'blend';
230
+
231
+ /**
232
+ * One detected `activeCamera` transition. This is the entire payload the
233
+ * D6 camera-ownership system needs to decide what to do — it carries no
234
+ * camera object or mutation itself (that stays entirely on the consumer's
235
+ * side, matching "no arbitrary unsafe property-path evaluator" / "thin
236
+ * integration code" throughout D2-D5).
237
+ */
238
+ export interface CameraOwnershipChangeEvent {
239
+ /** The Director's new `activeCamera` value. */
240
+ readonly cameraKey: string;
241
+ /** The Director's previous `activeCamera` value, or `null` on the first (assignment) event. */
242
+ readonly previousCameraKey: string | null;
243
+ /** `'cut'` unless a positive blend duration was authored for this transition. */
244
+ readonly mode: CameraCutMode;
245
+ /** Blend duration in seconds; `0` for a `'cut'`. */
246
+ readonly blendSeconds: number;
247
+ /** The Director's `shot` value at the moment of this transition, for convenience. */
248
+ readonly shot: string;
249
+ }
250
+
251
+ /**
252
+ * D6 seam: implemented fully by the camera-ownership/restoration system
253
+ * (spec §10 D6). This module only detects and reports discrete
254
+ * `activeCamera` transitions — it performs no camera capture, cut, blend, or
255
+ * restoration itself.
256
+ */
257
+ export type CameraOwnershipHook = (event: CameraOwnershipChangeEvent) => void;
258
+
259
+ export interface TheatreDirectorBindingOptions {
260
+ /**
261
+ * Which `AnimationClock` phase to evaluate the Director in. Defaults to
262
+ * `'preRender'` (see module doc — guaranteed by `PHASE_ORDER` to observe a
263
+ * sequence position `bindClockToTheatreSequence`'s `'animation'`-phase
264
+ * default has already set for this crossing).
265
+ */
266
+ phase?: SystemPhaseName;
267
+ /** Camera-ownership seam (D6) — see module doc. Optional; omit to just read state. */
268
+ onActiveCameraChange?: CameraOwnershipHook;
269
+ /**
270
+ * Name of an optional extra numeric Director prop that carries the blend
271
+ * duration (seconds) for the transition landing on the CURRENT
272
+ * evaluation. Defaults to `'blendSeconds'`. Absent, non-numeric, or
273
+ * non-positive at the moment of a transition reports `mode: 'cut'`.
274
+ */
275
+ blendSecondsKey?: string;
276
+ }
277
+
278
+ export interface TheatreDirectorBinding {
279
+ /**
280
+ * Current Director state (D4 AC: inspectable read API). Before the first
281
+ * clock crossing, this is the bind-time value (`readDirectorState` called
282
+ * once at bind); from the first crossing onward, it is the value as of the
283
+ * most recent crossing.
284
+ */
285
+ getState(): DirectorState;
286
+ /** Removes the clock evaluator. No further evaluation (or hook calls) occurs after this. */
287
+ dispose(): void;
288
+ }
289
+
290
+ /**
291
+ * Bind a Director Theatre Sheet Object to `clock`: on every crossing, read
292
+ * its current value (`readDirectorState`) and, if `activeCamera` changed
293
+ * since the last evaluation, report the transition through
294
+ * `onActiveCameraChange` (the D6 seam). Returns a disposer and a `getState()`
295
+ * read API. See the module doc comment for the full contract.
296
+ */
297
+ export function bindDirectorToClock<Props extends UnknownShorthandCompoundProps>(
298
+ clock: AnimationClock,
299
+ sheetObject: ISheetObject<Props>,
300
+ options: TheatreDirectorBindingOptions = {},
301
+ ): TheatreDirectorBinding {
302
+ const phase = options.phase ?? 'preRender';
303
+ const blendSecondsKey = options.blendSecondsKey ?? 'blendSeconds';
304
+
305
+ let state: DirectorState = readDirectorState(sheetObject);
306
+ let previousCameraKey: string | null = null;
307
+ let hasEvaluatedOnClock = false;
308
+
309
+ function evaluate(): void {
310
+ state = readDirectorState(sheetObject);
311
+
312
+ const changed = !hasEvaluatedOnClock || state.activeCamera !== previousCameraKey;
313
+ if (changed) {
314
+ const blendRaw = state.extras[blendSecondsKey];
315
+ const blendSeconds =
316
+ hasEvaluatedOnClock && typeof blendRaw === 'number' && blendRaw > 0 ? blendRaw : 0;
317
+ const mode: CameraCutMode = blendSeconds > 0 ? 'blend' : 'cut';
318
+
319
+ options.onActiveCameraChange?.({
320
+ cameraKey: state.activeCamera,
321
+ previousCameraKey: hasEvaluatedOnClock ? previousCameraKey : null,
322
+ mode,
323
+ blendSeconds,
324
+ shot: state.shot,
325
+ });
326
+
327
+ previousCameraKey = state.activeCamera;
328
+ hasEvaluatedOnClock = true;
329
+ }
330
+ }
331
+
332
+ const handle: ClockEvaluatorHandle = clock.subscribe(phase, () => {
333
+ evaluate();
334
+ });
335
+
336
+ let disposed = false;
337
+ return {
338
+ getState(): DirectorState {
339
+ return state;
340
+ },
341
+ dispose(): void {
342
+ if (disposed) return;
343
+ disposed = true;
344
+ handle.dispose();
345
+ },
346
+ };
347
+ }