@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,90 @@
1
+ import { Offline } from 'tone';
2
+ /**
3
+ * G2 — Integrate Tone with the Canonical Clock, OFFLINE-render half (spec
4
+ * §13 G2, and the G4/I6 seam it is deliberately shaped for). This module
5
+ * renders a Tone composition over an exact `[start, end)` time range to a
6
+ * real `AudioBuffer` via `Tone.Offline` — i.e. `OfflineAudioContext`, NOT a
7
+ * live real-time `AudioContext` — such that identical inputs produce
8
+ * bit-identical output samples on every call. This is what makes offline
9
+ * Tone audio safe to mux into a deterministically-rendered video (G4/I6):
10
+ * the video side already re-renders frame-by-frame from an exact clock
11
+ * position, and this is the audio side's equivalent — an exact re-render
12
+ * from an exact time range, not a live capture of whatever happened to play.
13
+ *
14
+ * ## Why this can't run in plain Node (documented, not assumed)
15
+ *
16
+ * `Tone.Offline` ultimately constructs a real `OfflineAudioContext`
17
+ * (via `standardized-audio-context`, Tone's own dependency). Node has no
18
+ * native Web Audio implementation, so `standardized-audio-context` throws
19
+ * `"Missing the native OfflineAudioContext constructor."` the moment
20
+ * `Tone.Offline(...)` is actually invoked — confirmed empirically against
21
+ * this repo's installed `tone@15.1.22` before writing this module (plain
22
+ * `import * as Tone from 'tone'` succeeds; calling `Tone.Offline(...)` in a
23
+ * Node process throws immediately). There is no lightweight polyfill in this
24
+ * repo's dependency tree, and installing a native Node Web Audio addon is
25
+ * out of scope for this unit (build-box constraints). The determinism proof
26
+ * for this module therefore runs in a REAL headless-Chromium page via
27
+ * Playwright — see `packages/engine/e2e/tests/tone-audio-g1-g2.spec.ts`
28
+ * — mirroring how I0 proved video-frame determinism. This module's own
29
+ * `packages/engine/test/audio/tone-offline-render.test.ts` covers everything
30
+ * that does NOT require a real `OfflineAudioContext` (range validation,
31
+ * synchronous pre-render cancellation) directly in Node.
32
+ *
33
+ * ## Composition contract
34
+ *
35
+ * `compose` is called by `Tone.Offline` itself, inside the offline context —
36
+ * build the SAME graph you would in real-time Tone code
37
+ * (`new Tone.Synth().toDestination()`, `context.transport.schedule(...)`,
38
+ * etc; see Tone's own `Offline` docs). Nothing about this wrapper changes
39
+ * Tone's native API surface — `compose`'s parameter is `Tone.Offline`'s own
40
+ * callback type, re-derived structurally (`Parameters<typeof Offline>[0]`)
41
+ * rather than duplicated, so this module can never drift from Tone's actual
42
+ * signature.
43
+ *
44
+ * ## Cancellation — cooperative, not a true mid-render abort
45
+ *
46
+ * The Web Audio spec gives `OfflineAudioContext` no `.close()`/cancel API
47
+ * once `startRendering()` is in flight, and neither does Tone. `signal`
48
+ * therefore provides COOPERATIVE cancellation only: if `signal` is already
49
+ * aborted before this function calls `Tone.Offline`, the render never
50
+ * starts at all (checked synchronously, before any `OfflineAudioContext` is
51
+ * created). If `signal` aborts WHILE a render is in flight, this function's
52
+ * returned promise rejects immediately with an `AbortError` — so a caller
53
+ * (e.g. a render-cancellation UI action) sees the render "stop" from its own
54
+ * perspective and never receives/uses the resulting buffer — even though
55
+ * the underlying browser-native render may keep running in the background
56
+ * until it would have finished anyway. This is an honest, documented
57
+ * limitation, not a gap: no browser API makes a stronger guarantee possible.
58
+ */
59
+ /** Tone's own `Offline` callback signature, re-derived (not re-typed) so
60
+ * this module can never drift from the real function it wraps. */
61
+ export type ToneOfflineComposeFn = Parameters<typeof Offline>[0];
62
+ export interface ToneOfflineRenderRequest {
63
+ /** Canonical/Theatre-time range start, in seconds. */
64
+ readonly start: number;
65
+ /** Canonical/Theatre-time range end, in seconds. Must be `> start`. */
66
+ readonly end: number;
67
+ /** Output sample rate. Default 44100 (CD-quality, FFmpeg's usual default). */
68
+ readonly sampleRate?: number;
69
+ /** Output channel count. Default 2 (stereo). */
70
+ readonly channels?: number;
71
+ /** Builds the Tone graph inside the offline context — Tone's native
72
+ * `Offline` callback, unmodified. Receives local time `0` at `start`. */
73
+ readonly compose: ToneOfflineComposeFn;
74
+ /** Optional cooperative-cancellation signal — see module doc above. */
75
+ readonly signal?: AbortSignal;
76
+ }
77
+ export interface ToneOfflineRenderResult {
78
+ /** The rendered PCM, as a real (native) `AudioBuffer` — `.getChannelData(n)`
79
+ * gives the Float32 samples for channel `n`, ready for a digest/RMS
80
+ * computation or (eventually, G4/I6) FFmpeg muxing. */
81
+ readonly buffer: AudioBuffer;
82
+ readonly durationSeconds: number;
83
+ readonly sampleRate: number;
84
+ readonly channels: number;
85
+ }
86
+ /** Render `request.compose`'s Tone graph offline over `[start, end)`,
87
+ * producing a deterministic `AudioBuffer`. See module doc for the
88
+ * determinism/cancellation contract. */
89
+ export declare function renderToneOffline(request: ToneOfflineRenderRequest): Promise<ToneOfflineRenderResult>;
90
+ //# sourceMappingURL=tone-offline-render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tone-offline-render.d.ts","sourceRoot":"","sources":["../../src/audio/tone-offline-render.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AAEH;mEACmE;AACnE,MAAM,MAAM,oBAAoB,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AAEjE,MAAM,WAAW,wBAAwB;IACvC,sDAAsD;IACtD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,uEAAuE;IACvE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,8EAA8E;IAC9E,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,gDAAgD;IAChD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B;8EAC0E;IAC1E,QAAQ,CAAC,OAAO,EAAE,oBAAoB,CAAC;IACvC,uEAAuE;IACvE,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;CAC/B;AAED,MAAM,WAAW,uBAAuB;IACtC;;4DAEwD;IACxD,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAKD;;yCAEyC;AACzC,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,uBAAuB,CAAC,CA4ClC"}
@@ -0,0 +1,56 @@
1
+ import { Offline } from 'tone';
2
+ const DEFAULT_SAMPLE_RATE = 44100;
3
+ const DEFAULT_CHANNELS = 2;
4
+ /** Render `request.compose`'s Tone graph offline over `[start, end)`,
5
+ * producing a deterministic `AudioBuffer`. See module doc for the
6
+ * determinism/cancellation contract. */
7
+ export async function renderToneOffline(request) {
8
+ const { start, end, sampleRate = DEFAULT_SAMPLE_RATE, channels = DEFAULT_CHANNELS, compose, signal, } = request;
9
+ if (!Number.isFinite(start) || !Number.isFinite(end) || end <= start) {
10
+ throw new Error(`[tone-offline-render] invalid range [${start}, ${end}) — end must be a finite number > start`);
11
+ }
12
+ if (!Number.isFinite(sampleRate) || sampleRate <= 0) {
13
+ throw new Error(`[tone-offline-render] sampleRate must be a finite number > 0, got ${sampleRate}`);
14
+ }
15
+ if (!Number.isInteger(channels) || channels <= 0) {
16
+ throw new Error(`[tone-offline-render] channels must be a positive integer, got ${channels}`);
17
+ }
18
+ // Cooperative cancellation, checked BEFORE ever constructing an
19
+ // OfflineAudioContext — an already-aborted signal must never start a
20
+ // render at all (see module doc).
21
+ if (signal?.aborted) {
22
+ throw createAbortError();
23
+ }
24
+ const durationSeconds = end - start;
25
+ const renderPromise = Offline(compose, durationSeconds, channels, sampleRate);
26
+ const toneBuffer = signal ? await raceAbort(renderPromise, signal) : await renderPromise;
27
+ const buffer = toneBuffer.get();
28
+ if (!buffer) {
29
+ throw new Error('[tone-offline-render] Tone.Offline resolved without a decoded AudioBuffer');
30
+ }
31
+ return {
32
+ buffer,
33
+ durationSeconds,
34
+ sampleRate: buffer.sampleRate,
35
+ channels: buffer.numberOfChannels,
36
+ };
37
+ }
38
+ function createAbortError() {
39
+ return new DOMException('[tone-offline-render] render canceled', 'AbortError');
40
+ }
41
+ /** Race `promise` against `signal` firing — resolves/rejects with whichever
42
+ * happens first, without altering the underlying Web Audio render (see
43
+ * module doc's "cooperative, not a true mid-render abort" section). */
44
+ function raceAbort(promise, signal) {
45
+ return new Promise((resolve, reject) => {
46
+ const onAbort = () => reject(createAbortError());
47
+ signal.addEventListener('abort', onAbort, { once: true });
48
+ promise.then((value) => {
49
+ signal.removeEventListener('abort', onAbort);
50
+ resolve(value);
51
+ }, (err) => {
52
+ signal.removeEventListener('abort', onAbort);
53
+ reject(err);
54
+ });
55
+ });
56
+ }
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Pure PCM -> 16-bit WAV encoder (spec §15 I6 "Encode and Mux", audio half —
3
+ * `docs/AI-NATIVE-AUTHORING-IMPLEMENTATION-SPEC.md`). This module takes
4
+ * already-rendered Float32 channel data (e.g. `AudioBuffer.getChannelData(n)`
5
+ * from a `Tone.Offline` render, `audio/tone-offline-render.ts`) and produces
6
+ * a standard little-endian, 16-bit-PCM, interleaved RIFF/WAVE file as raw
7
+ * bytes — no `AudioBuffer`/`AudioContext` dependency, so this runs equally in
8
+ * a browser render-mode page (`runtime/render-audio-control.ts`) and in
9
+ * plain Node (this module's own `packages/engine/test/audio/wav-encode.test.ts`,
10
+ * no Playwright needed).
11
+ *
12
+ * 16-bit PCM (not 32-bit float) is the deliberate choice named by the I6 AC
13
+ * ("16-bit PCM WAV is fine") — it is universally decodable by every FFmpeg
14
+ * build without an extra format flag, keeping the video-mux step's ffmpeg
15
+ * invocation ordinary and portable.
16
+ */
17
+ export interface PcmToWavInput {
18
+ /** One `Float32Array` per channel, each sample in `[-1, 1]` (values outside
19
+ * that range are clamped, not thrown on — real synthesis can transiently
20
+ * clip). All channels must have equal length. */
21
+ readonly channelData: readonly Float32Array[];
22
+ readonly sampleRate: number;
23
+ }
24
+ /** Encode `input` as a complete little-endian, 16-bit-PCM, interleaved
25
+ * RIFF/WAVE file (44-byte canonical header + data chunk). Throws on an
26
+ * empty/mismatched channel set rather than silently producing a malformed
27
+ * file — this module's own contribution to the "fail loudly, never a
28
+ * silent no-op" convention `runtime/render-control.ts` documents. */
29
+ export declare function encodeWav16(input: PcmToWavInput): Uint8Array;
30
+ /** RMS + peak over all channels/samples — the same "non-trivial audio, not
31
+ * an all-zero buffer" sanity check `tone-audio-main.ts`'s fixture computes,
32
+ * factored out here so both that fixture and the render-audio harness can
33
+ * share one implementation instead of drifting copies. */
34
+ export declare function pcmStats(channelData: readonly Float32Array[]): {
35
+ rms: number;
36
+ peak: number;
37
+ };
38
+ //# sourceMappingURL=wav-encode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wav-encode.d.ts","sourceRoot":"","sources":["../../src/audio/wav-encode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,WAAW,aAAa;IAC5B;;sDAEkD;IAClD,QAAQ,CAAC,WAAW,EAAE,SAAS,YAAY,EAAE,CAAC;IAC9C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAeD;;;;sEAIsE;AACtE,wBAAgB,WAAW,CAAC,KAAK,EAAE,aAAa,GAAG,UAAU,CAwD5D;AAED;;;2DAG2D;AAC3D,wBAAgB,QAAQ,CAAC,WAAW,EAAE,SAAS,YAAY,EAAE,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAa5F"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Pure PCM -> 16-bit WAV encoder (spec §15 I6 "Encode and Mux", audio half —
3
+ * `docs/AI-NATIVE-AUTHORING-IMPLEMENTATION-SPEC.md`). This module takes
4
+ * already-rendered Float32 channel data (e.g. `AudioBuffer.getChannelData(n)`
5
+ * from a `Tone.Offline` render, `audio/tone-offline-render.ts`) and produces
6
+ * a standard little-endian, 16-bit-PCM, interleaved RIFF/WAVE file as raw
7
+ * bytes — no `AudioBuffer`/`AudioContext` dependency, so this runs equally in
8
+ * a browser render-mode page (`runtime/render-audio-control.ts`) and in
9
+ * plain Node (this module's own `packages/engine/test/audio/wav-encode.test.ts`,
10
+ * no Playwright needed).
11
+ *
12
+ * 16-bit PCM (not 32-bit float) is the deliberate choice named by the I6 AC
13
+ * ("16-bit PCM WAV is fine") — it is universally decodable by every FFmpeg
14
+ * build without an extra format flag, keeping the video-mux step's ffmpeg
15
+ * invocation ordinary and portable.
16
+ */
17
+ const BYTES_PER_SAMPLE = 2; // 16-bit PCM
18
+ const WAV_HEADER_BYTES = 44;
19
+ function clamp(value, lo, hi) {
20
+ return Math.min(hi, Math.max(lo, value));
21
+ }
22
+ function writeAsciiString(view, offset, text) {
23
+ for (let i = 0; i < text.length; i++) {
24
+ view.setUint8(offset + i, text.charCodeAt(i));
25
+ }
26
+ }
27
+ /** Encode `input` as a complete little-endian, 16-bit-PCM, interleaved
28
+ * RIFF/WAVE file (44-byte canonical header + data chunk). Throws on an
29
+ * empty/mismatched channel set rather than silently producing a malformed
30
+ * file — this module's own contribution to the "fail loudly, never a
31
+ * silent no-op" convention `runtime/render-control.ts` documents. */
32
+ export function encodeWav16(input) {
33
+ const { channelData, sampleRate } = input;
34
+ const numChannels = channelData.length;
35
+ if (numChannels === 0) {
36
+ throw new Error('[wav-encode] channelData must contain at least one channel');
37
+ }
38
+ if (!Number.isFinite(sampleRate) || sampleRate <= 0) {
39
+ throw new Error(`[wav-encode] sampleRate must be a finite number > 0, got ${sampleRate}`);
40
+ }
41
+ const numFrames = channelData[0]?.length ?? 0;
42
+ for (let ch = 0; ch < numChannels; ch++) {
43
+ const len = channelData[ch]?.length ?? -1;
44
+ if (len !== numFrames) {
45
+ throw new Error(`[wav-encode] channel ${ch} has length ${len}, expected ${numFrames} (all channels must match)`);
46
+ }
47
+ }
48
+ const blockAlign = numChannels * BYTES_PER_SAMPLE;
49
+ const byteRate = sampleRate * blockAlign;
50
+ const dataSize = numFrames * blockAlign;
51
+ const buffer = new ArrayBuffer(WAV_HEADER_BYTES + dataSize);
52
+ const view = new DataView(buffer);
53
+ // RIFF chunk descriptor
54
+ writeAsciiString(view, 0, 'RIFF');
55
+ view.setUint32(4, 36 + dataSize, true);
56
+ writeAsciiString(view, 8, 'WAVE');
57
+ // fmt subchunk (PCM)
58
+ writeAsciiString(view, 12, 'fmt ');
59
+ view.setUint32(16, 16, true); // subchunk size for PCM
60
+ view.setUint16(20, 1, true); // audio format 1 = PCM
61
+ view.setUint16(22, numChannels, true);
62
+ view.setUint32(24, sampleRate, true);
63
+ view.setUint32(28, byteRate, true);
64
+ view.setUint16(32, blockAlign, true);
65
+ view.setUint16(34, BYTES_PER_SAMPLE * 8, true); // bits per sample
66
+ // data subchunk
67
+ writeAsciiString(view, 36, 'data');
68
+ view.setUint32(40, dataSize, true);
69
+ let offset = WAV_HEADER_BYTES;
70
+ for (let i = 0; i < numFrames; i++) {
71
+ for (let ch = 0; ch < numChannels; ch++) {
72
+ const sample = clamp(channelData[ch]?.[i] ?? 0, -1, 1);
73
+ const intSample = Math.round(sample < 0 ? sample * 0x8000 : sample * 0x7fff);
74
+ view.setInt16(offset, intSample, true);
75
+ offset += BYTES_PER_SAMPLE;
76
+ }
77
+ }
78
+ return new Uint8Array(buffer);
79
+ }
80
+ /** RMS + peak over all channels/samples — the same "non-trivial audio, not
81
+ * an all-zero buffer" sanity check `tone-audio-main.ts`'s fixture computes,
82
+ * factored out here so both that fixture and the render-audio harness can
83
+ * share one implementation instead of drifting copies. */
84
+ export function pcmStats(channelData) {
85
+ let sumSquares = 0;
86
+ let peak = 0;
87
+ let count = 0;
88
+ for (const data of channelData) {
89
+ for (let i = 0; i < data.length; i++) {
90
+ const v = data[i] ?? 0;
91
+ sumSquares += v * v;
92
+ peak = Math.max(peak, Math.abs(v));
93
+ count++;
94
+ }
95
+ }
96
+ return { rms: count > 0 ? Math.sqrt(sumSquares / count) : 0, peak };
97
+ }
@@ -0,0 +1,21 @@
1
+ import type { GameLoopConfig } from './types';
2
+ /**
3
+ * Fixed-timestep game loop with accumulator pattern.
4
+ *
5
+ * Physics/logic run at a fixed rate (default 60 Hz) regardless of display
6
+ * frame rate. Rendering is deliberately fixed-rate too (decided — D1, see
7
+ * `docs/DECISIONS-PENDING.md`): `config.update(fixedDt)` runs once per
8
+ * consumed substep, and per the documented phase order (`PHASE_ORDER` in
9
+ * `core/types.ts`) the `render` phase executes as the last phase of that
10
+ * same call — there is no separate per-real-frame render step and no
11
+ * display-refresh interpolation. A frame whose accumulator produces zero
12
+ * substeps therefore calls `update` zero times and renders zero times; do
13
+ * not reintroduce a render call outside the substep loop below.
14
+ */
15
+ export declare function createGameLoop(config: GameLoopConfig): {
16
+ start(): void;
17
+ stop(): void;
18
+ readonly isRunning: boolean;
19
+ timeScale: number;
20
+ };
21
+ //# sourceMappingURL=game-loop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"game-loop.d.ts","sourceRoot":"","sources":["../../src/core/game-loop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc;;;;eAkH5B,MAAM;EAc9B"}
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Fixed-timestep game loop with accumulator pattern.
3
+ *
4
+ * Physics/logic run at a fixed rate (default 60 Hz) regardless of display
5
+ * frame rate. Rendering is deliberately fixed-rate too (decided — D1, see
6
+ * `docs/DECISIONS-PENDING.md`): `config.update(fixedDt)` runs once per
7
+ * consumed substep, and per the documented phase order (`PHASE_ORDER` in
8
+ * `core/types.ts`) the `render` phase executes as the last phase of that
9
+ * same call — there is no separate per-real-frame render step and no
10
+ * display-refresh interpolation. A frame whose accumulator produces zero
11
+ * substeps therefore calls `update` zero times and renders zero times; do
12
+ * not reintroduce a render call outside the substep loop below.
13
+ */
14
+ export function createGameLoop(config) {
15
+ const fixedDt = config.fixedTimestep ?? 1 / 60;
16
+ const maxSubSteps = config.maxSubSteps ?? 8;
17
+ // Also the accumulator's hard ceiling (see the spiral-of-death guard below).
18
+ const maxAccumulator = fixedDt * maxSubSteps;
19
+ // I2 (render-control runtime mode, see `GameLoopConfig.externalDrive`'s
20
+ // doc comment): in this mode `start()` below deliberately skips both the
21
+ // `requestAnimationFrame` arm AND the `visibilitychange` listener install —
22
+ // no wall-clock timing source ever exists for this loop instance, so
23
+ // `config.update` can only ever be invoked by an external driver calling
24
+ // into the render-control seam, never by this file's own `frame()`.
25
+ const externalDrive = config.externalDrive ?? false;
26
+ let accumulator = 0;
27
+ let lastTime = 0;
28
+ let running = false;
29
+ let rafId = 0;
30
+ let timeScale = 1.0;
31
+ // Idle throttle (T2.1): a hidden tab stops the loop outright; becoming
32
+ // visible again restarts it with the accumulator clock resynced to "now" —
33
+ // deliberately no catch-up burst for the wall-clock time spent hidden.
34
+ let hiddenPaused = false;
35
+ let visibilityListenerAttached = false;
36
+ function handleVisibilityChange() {
37
+ if (typeof document === 'undefined')
38
+ return;
39
+ if (document.hidden) {
40
+ if (running) {
41
+ running = false;
42
+ cancelAnimationFrame(rafId);
43
+ hiddenPaused = true;
44
+ }
45
+ }
46
+ else if (hiddenPaused) {
47
+ hiddenPaused = false;
48
+ running = true;
49
+ lastTime = performance.now();
50
+ accumulator = 0;
51
+ rafId = requestAnimationFrame(frame);
52
+ }
53
+ }
54
+ function frame(currentTime) {
55
+ if (!running)
56
+ return;
57
+ rafId = requestAnimationFrame(frame);
58
+ // Convert to seconds
59
+ const rawDt = (currentTime - lastTime) / 1000;
60
+ lastTime = currentTime;
61
+ // Clamp large frame gaps (e.g. a slow frame) before scaling by timeScale.
62
+ const dt = Math.min(rawDt, maxAccumulator) * timeScale;
63
+ accumulator += dt;
64
+ // Spiral-of-death guard: bound the accumulator regardless of timeScale
65
+ // (up to the clamped max of 8) or frame-gap size. Time that can't
66
+ // possibly be caught up on is dropped, never carried forward.
67
+ if (accumulator > maxAccumulator)
68
+ accumulator = maxAccumulator;
69
+ // Run fixed timestep updates (this is also where rendering happens —
70
+ // see the module doc comment above).
71
+ let steps = 0;
72
+ while (accumulator >= fixedDt && steps < maxSubSteps) {
73
+ config.update(fixedDt);
74
+ accumulator -= fixedDt;
75
+ steps++;
76
+ }
77
+ }
78
+ return {
79
+ start() {
80
+ if (running)
81
+ return;
82
+ running = true;
83
+ // A direct start() call can land while the loop is auto-hidden-paused
84
+ // (`hiddenPaused` true, `running` false, no rAF pending). Without this
85
+ // reset, a later visibilitychange-to-visible would see stale
86
+ // `hiddenPaused === true` and spawn a SECOND rAF chain on top of the
87
+ // one this call is about to start (doubled update()/render() overhead
88
+ // until the next stop() — no sim-speed effect, but wasted work).
89
+ hiddenPaused = false;
90
+ lastTime = performance.now();
91
+ accumulator = 0;
92
+ // External-drive mode (I2): never arm rAF and never install the
93
+ // visibilitychange auto-stop handler. `running` still flips `true`
94
+ // above (so `isRunning`/`stop()` behave normally for a caller that
95
+ // treats this loop as "started"), but nothing will ever call
96
+ // `frame()` — a headless/backgrounded capture page cannot have this
97
+ // loop silently killed by `document.hidden`, because there is no
98
+ // listener to fire in the first place.
99
+ if (externalDrive)
100
+ return;
101
+ rafId = requestAnimationFrame(frame);
102
+ if (!visibilityListenerAttached && typeof document !== 'undefined') {
103
+ document.addEventListener('visibilitychange', handleVisibilityChange);
104
+ visibilityListenerAttached = true;
105
+ }
106
+ },
107
+ stop() {
108
+ running = false;
109
+ hiddenPaused = false;
110
+ cancelAnimationFrame(rafId);
111
+ if (visibilityListenerAttached && typeof document !== 'undefined') {
112
+ document.removeEventListener('visibilitychange', handleVisibilityChange);
113
+ visibilityListenerAttached = false;
114
+ }
115
+ },
116
+ get isRunning() {
117
+ return running;
118
+ },
119
+ set timeScale(value) {
120
+ const clamped = Math.min(8, Math.max(0, value));
121
+ if (clamped !== value) {
122
+ console.warn(`[game-loop] timeScale ${value} is out of range [0, 8]; clamped to ${clamped}.`);
123
+ }
124
+ timeScale = clamped;
125
+ },
126
+ get timeScale() {
127
+ return timeScale;
128
+ },
129
+ };
130
+ }
@@ -0,0 +1,120 @@
1
+ import { type SystemDef, type SystemFn, type SystemPhaseName } from './types';
2
+ /**
3
+ * Ordered system execution by named phase.
4
+ *
5
+ * Systems are registered with a phase name. When `run(dt)` is called, all
6
+ * phases execute in `PHASE_ORDER` via `runPhase(phase, dt)`. Within a phase,
7
+ * `runPhase` executes three ordered buckets (GAME-ROOT-DESIGN.md §4, T7.1
8
+ * slice 2):
9
+ *
10
+ * 1. **engine** — everything `add()`/`register()`ed at or before the last
11
+ * `markEngineBoundary()` call, or EVERYTHING if no boundary has ever
12
+ * been marked (the world2d-silo case: it never calls
13
+ * `markEngineBoundary`, so its systems are all "engine").
14
+ * 2. **componentTick** — the single per-phase slot set via
15
+ * `setComponentTick(phase, fn)`. Component ticks are engine
16
+ * infrastructure: they always run after every engine system and before
17
+ * every game system in that phase, REGARDLESS of when
18
+ * `setComponentTick` was called relative to other `add()` calls. This
19
+ * is what makes "engine systems run before component ticks" a
20
+ * structural guarantee rather than a registration-order convention
21
+ * (see `component-manager.ts`, which registers its tick this way).
22
+ * 3. **game** — everything `add()`/`register()`ed AFTER the last
23
+ * `markEngineBoundary()` call.
24
+ *
25
+ * Within each bucket, systems run in registration order.
26
+ */
27
+ export declare function createSystemRunner(): {
28
+ /**
29
+ * Register a bare system function in a specific phase.
30
+ * Systems within the same phase run in the order they were added.
31
+ */
32
+ add(phase: SystemPhaseName, fn: SystemFn): void;
33
+ /**
34
+ * Remove a bare system function from a phase. Also drops it from the
35
+ * engine-membership set (if present) — the fix for the length-based
36
+ * bookkeeping bug: removing this has no effect on how any OTHER entry
37
+ * (before or after it) is classified, since classification is now
38
+ * per-function membership, not position.
39
+ */
40
+ remove(phase: SystemPhaseName, fn: SystemFn): void;
41
+ /**
42
+ * Register a lifecycle system. Adds its update to the correct phase.
43
+ * Call runInit() after all systems are registered to invoke init hooks.
44
+ */
45
+ register(system: SystemDef): void;
46
+ /**
47
+ * Unregister a lifecycle system. Removes its update and calls dispose.
48
+ */
49
+ unregister(system: SystemDef): void;
50
+ /**
51
+ * Register the ONE component-tick function for a phase (T7.1 slice 2).
52
+ * Component ticks are engine infrastructure, not a bare `add()`ed
53
+ * system: they always execute after every engine-bucket system and
54
+ * before every game-bucket system in that phase (see `runPhase`),
55
+ * they are never touched by `removeAllNonEngine()`, and they do not
56
+ * count toward `markEngineBoundary()`'s bookkeeping. Throws if a tick
57
+ * is already set for this phase — at most one component manager may
58
+ * own a phase's tick slot.
59
+ */
60
+ setComponentTick(phase: SystemPhaseName, fn: SystemFn): void;
61
+ /**
62
+ * Call init() on all registered lifecycle systems, in phase order.
63
+ * Call once after scene load, before the first game loop tick.
64
+ */
65
+ runInit(): void;
66
+ /**
67
+ * Call dispose() on all registered lifecycle systems and remove them.
68
+ */
69
+ runDispose(): void;
70
+ /**
71
+ * Run ONE phase's three ordered buckets — engine, componentTick, game
72
+ * (see the module doc comment). Each system call is isolated: a
73
+ * throwing system is loudly logged (never swallowed) but does not stop
74
+ * its siblings in the same bucket, a later bucket in this phase, or a
75
+ * later phase, from running this frame.
76
+ *
77
+ * Public — the Game root's frame executor (`runtime/game.ts`) calls this
78
+ * directly per (phase, world); `run(dt)` below is just a loop over it,
79
+ * preserved for the world2d silo and any direct caller.
80
+ */
81
+ runPhase(phase: SystemPhaseName, dt: number): void;
82
+ /**
83
+ * Run all phases in order, via `runPhase`.
84
+ */
85
+ run(dt: number): void;
86
+ /**
87
+ * Mark everything registered so far (via `add()`/`register()`, in every
88
+ * phase) as "engine" — infrastructure that must survive a warm restart.
89
+ * Call once, right after mount finishes wiring engine-level systems and
90
+ * BEFORE any game (`setup()`/scene load) registers its own. `hotReload`
91
+ * calls `removeAllNonEngine()` on every restart, which only ever removes
92
+ * what was added after this mark. Component-tick slots (`setComponentTick`)
93
+ * are unaffected — they are never part of this boundary.
94
+ */
95
+ markEngineBoundary(): void;
96
+ /**
97
+ * Bulk-remove every system registered after the last `markEngineBoundary()`
98
+ * call — both bare `add()`ed functions and lifecycle `register()`ed systems
99
+ * (the latter get `dispose()`d, mirroring `unregister()`). A no-op if no
100
+ * boundary has been marked. Idempotent: calling it again with nothing new
101
+ * registered since is a safe no-op. Component-tick slots are NEVER cleared
102
+ * by this — they are engine infrastructure, not game content.
103
+ *
104
+ * This is what makes a warm restart (`hotReload`) safe to call N times
105
+ * without accumulating duplicate systems/listeners — each restart's
106
+ * outgoing game systems are fully removed before the new one registers its
107
+ * own, while the engine systems (input/physics/render/the ComponentManager
108
+ * tick/...) registered before the boundary are never touched.
109
+ */
110
+ removeAllNonEngine(): void;
111
+ /**
112
+ * Total system-function count, optionally scoped to one phase. Includes
113
+ * component-tick slots (a set slot counts as 1 per phase it occupies).
114
+ * Test/introspection helper — used to assert a warm restart doesn't
115
+ * accumulate systems (see `removeAllNonEngine`).
116
+ */
117
+ count(phase?: SystemPhaseName): number;
118
+ };
119
+ export type SystemRunner = ReturnType<typeof createSystemRunner>;
120
+ //# sourceMappingURL=system-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system-runner.d.ts","sourceRoot":"","sources":["../../src/core/system-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,SAAS,EAAE,KAAK,QAAQ,EAAE,KAAK,eAAe,EAAE,MAAM,SAAS,CAAC;AAE3F;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,kBAAkB;IAwC9B;;;OAGG;eACQ,eAAe,MAAM,QAAQ;IAQxC;;;;;;OAMG;kBACW,eAAe,MAAM,QAAQ;IAQ3C;;;OAGG;qBACc,SAAS;IAS1B;;OAEG;uBACgB,SAAS;IAa5B;;;;;;;;;OASG;4BACqB,eAAe,MAAM,QAAQ;IAYrD;;;OAGG;;IAUH;;OAEG;;IAaH;;;;;;;;;;OAUG;oBACa,eAAe,MAAM,MAAM;IA+B3C;;OAEG;YACK,MAAM;IAMd;;;;;;;;OAQG;;IAUH;;;;;;;;;;;;;OAaG;;IAsBH;;;;;OAKG;kBACW,eAAe,GAAG,MAAM;EAYzC;AAED,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC"}