@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,302 @@
1
+ // T3.1 slice 1 — the game manifest schema (`vgai.game.json`).
2
+ //
3
+ // This is the serialized form of the Game's world list
4
+ // (docs/GAME-ROOT-DESIGN.md §1, D6) — see docs/GAME-MANIFEST-DESIGN.md §3 for
5
+ // the adjudicated field list this file implements exactly. `load.ts` is this
6
+ // schema's runtime reader (T4.1 policy): it parses via this schema, then
7
+ // layers the cross-field checks and default resolution §3/§5 describe. Every
8
+ // field below has a `.describe()` (repo policy — powers
9
+ // `scripts/generate-schema.ts` and the T4.1 schema-walk coverage test).
10
+ //
11
+ // Naming: this file follows the repo's `XxxSchema` (Zod schema) / `Xxx`
12
+ // (inferred type) convention used throughout `scene/schema/` — the design
13
+ // doc's §3 sketch names the bare consts (`Tier`, `IngestStrategy`,
14
+ // `WorldEntry`) without the `Schema` suffix; that sketch is explicitly a
15
+ // "Zod sketch" the doc tells implementers to adapt to real code style
16
+ // ("mirror the style in scene/schema/scene-file.ts" per CLAUDE.md), so the
17
+ // schema consts here are suffixed and the bare names are reserved for the
18
+ // inferred types, matching every other schema file in the repo.
19
+ //
20
+ // World `kind` intentionally mirrors `WorldKind` in
21
+ // `packages/engine/src/runtime/game.ts` (`'threejs' | 'pixijs' | 'react'`)
22
+ // by value, not by import — this schema module has no runtime dependency
23
+ // beyond `zod` (kept parseable/bundlable in any context), matching the
24
+ // `scene/schema/` precedent.
25
+ import { z } from 'zod';
26
+ // ---------------------------------------------------------------------------
27
+ // Ingest capture strategy (world2d today; the general vocabulary D6/§4 names)
28
+ // ---------------------------------------------------------------------------
29
+ export const IngestStrategySchema = z.enum([
30
+ 'shared', // game imports host-served ESM three — full in-realm capture
31
+ 'deduped', // game source built by OUR pipeline, bundler dedupe — full capture
32
+ 'iframe-reachable', // prebuilt bundle in iframe, three reachable — cross-realm capture
33
+ 'opaque-embed', // prebuilt bundle, nothing reachable — host lifecycle only
34
+ ]);
35
+ // ---------------------------------------------------------------------------
36
+ // Capability tier — one ordered enum, declared per delivery context (§4)
37
+ // ---------------------------------------------------------------------------
38
+ export const TierSchema = z.enum([
39
+ 'first-party', // vgai-native world: full editor, full loop control
40
+ 'shared', // = IngestStrategy 'shared' rung
41
+ 'deduped', // = IngestStrategy 'deduped' rung
42
+ 'iframe-reachable', // = IngestStrategy 'iframe-reachable' rung
43
+ 'opaque-embed', // = IngestStrategy 'opaque-embed' rung
44
+ 'unsupported', // this world does not function in this delivery context
45
+ ]);
46
+ // ---------------------------------------------------------------------------
47
+ // World adapter identity — "make invalid states unrepresentable" (§2): a
48
+ // world names its `kind` once, and its `adapter` is either resolved BY kind
49
+ // (D6's default-*), a custom module, or an ingest strategy. There is no field
50
+ // that lets a world spell out a kind/adapter combination that cannot exist.
51
+ // ---------------------------------------------------------------------------
52
+ export const WorldAdapterSchema = z
53
+ .union([
54
+ z.literal('default'),
55
+ z.object({
56
+ module: z
57
+ .string()
58
+ .describe('Game-folder-relative path to a custom adapter module (trust boundary)'),
59
+ }),
60
+ z.object({
61
+ ingest: z
62
+ .object({
63
+ strategy: IngestStrategySchema.describe('Capture mechanics rung this ingested world uses (§4) — also the world`s natural local capability tier'),
64
+ entryHtml: z
65
+ .string()
66
+ .optional()
67
+ .describe('Entry HTML path, project-relative. WIRED for opaque-embed (D-W2, ' +
68
+ 'docs/WAVE4-FTUE-HARDENING-DESIGN.md): the file`s bytes are read verbatim through ' +
69
+ 'the project-static route and hosted in a sandboxed iframe (embed-only, no scene ' +
70
+ 'introspection), for both pixijs and threejs worlds. Legal but NOT wired to a ' +
71
+ 'mount for iframe-reachable (a named error at resolve names this — use `bundleUrl` ' +
72
+ 'instead, the wired reachable route).'),
73
+ assets: z
74
+ .record(z.string(), z.string())
75
+ .optional()
76
+ .describe('Path-substring -> served-URL rewrites for this ingested game (IngestGame.assets today)'),
77
+ domStubs: z
78
+ .array(z.string())
79
+ .optional()
80
+ .describe('DOM API stub ids this ingested game requires to run headlessly/in-realm'),
81
+ captureTimeoutMs: z
82
+ .number()
83
+ .optional()
84
+ .describe('Max time to wait for in-realm/cross-realm capture before failing loudly'),
85
+ // Track P (docs/PIXI-INGEST-LANDING-DESIGN.md §2) — the six
86
+ // iframe-reachable-multi mount fields (`ingest-iframe-2d.ts`'s
87
+ // `IframeReachableMultiOpts`), legal ONLY when `strategy` is
88
+ // 'iframe-reachable' (enforced by the `.superRefine` below).
89
+ bundleUrl: z
90
+ .string()
91
+ .optional()
92
+ .describe('Absolute URL of the externalized built game bundle — the WIRED iframe-reachable ' +
93
+ 'mount route (iframe-reachable only), for BOTH pixijs (Track P, ' +
94
+ "ingest-iframe-2d.ts's mountIngestGame2DIframeReachableMulti) and threejs (D-W1, " +
95
+ 'docs/WAVE4-FTUE-HARDENING-DESIGN.md, ' +
96
+ "ingest-iframe-reachable-adapter.ts's mountIngestGameIframeReachableBundle). " +
97
+ 'PRECONDITION: the bundle must externalize its world`s own runtime as a bare, ' +
98
+ 'un-rewritten import (`pixi.js` for pixijs, `three` for threejs — `vgai bundle` ' +
99
+ 'does this for you) so it resolves through the iframe importmap to the HOST ' +
100
+ 'instance the capture trap is installed on; a bundle with an inlined runtime is ' +
101
+ 'unreachable and degrades to the embed-only floor. Exactly one of bundleUrl/' +
102
+ 'entryHtml is required when strategy is iframe-reachable.'),
103
+ baseHref: z
104
+ .string()
105
+ .optional()
106
+ .describe("Iframe <base href> so the game's relative asset URLs resolve (iframe-reachable only)."),
107
+ assetBaseUrl: z
108
+ .string()
109
+ .optional()
110
+ .describe("Host-side basePath forced onto the trapped runtime's own asset resolution — " +
111
+ "pixi's `Assets.init` for a pixijs world, three's " +
112
+ '`DefaultLoadingManager.setURLModifier` for a threejs world (D-W1) — absolute, or ' +
113
+ "root-relative (resolved against the editor page's own origin at mount time, " +
114
+ 'ingest-mode.ts, so a static manifest never has to know the dev-server port) ' +
115
+ '(iframe-reachable only — a document.write iframe keeps the parent window.location).'),
116
+ extraDeps: z
117
+ .array(z.string())
118
+ .optional()
119
+ .describe("Bare specifiers of this world's externalized deps beyond its own runtime " +
120
+ "(pixi.js/three — e.g. '@pixi/sound', 'gsap'). Resolved by the editor's " +
121
+ 'host-namespace registry into module namespaces when known (D-P1 — the manifest ' +
122
+ 'carries data, not code); an unregistered specifier falls back to the open ' +
123
+ "project's own node_modules (D-Z3, docs/WAVE3-ADAPTER-PLUMBING-DESIGN.md), served " +
124
+ 'as a verbatim iframe importmap URL. Throws a named error if neither resolves it ' +
125
+ '(iframe-reachable only).'),
126
+ pixiModuleUrl: z
127
+ .string()
128
+ .optional()
129
+ .describe('PIXI-ONLY: standalone matching-major pixi ESM URL to trap instead of the host ' +
130
+ "pixi, for version-skewed games (e.g. a v6 game on a v8 host); this field's " +
131
+ 'PRESENCE is how the skew is expressed (D-P2 — no separate strategy/tier for ' +
132
+ 'version skew) (iframe-reachable only). Declaring this on a `kind: "threejs"` ' +
133
+ 'world is schema-legal (this field is kind-agnostic here) but throws a NAMED ' +
134
+ 'not-supported error at resolve — three has no version-skew mount this wave (D-W7, ' +
135
+ 'docs/WAVE4-FTUE-HARDENING-DESIGN.md: a hypothetical `threeModuleUrl` is explicitly ' +
136
+ 'parked, no consumer exists).'),
137
+ bodyHtml: z
138
+ .string()
139
+ .optional()
140
+ .describe('HTML injected into the iframe body before the game script boots (e.g. a ' +
141
+ '`<div id="game-root">` the game expects to find) (iframe-reachable only).'),
142
+ })
143
+ .describe('Ingest adapter configuration for an unmodified game (a repo-vendored game or your ' +
144
+ 'own external folder)')
145
+ .superRefine((ingest, ctx) => {
146
+ // Track P (docs/PIXI-INGEST-LANDING-DESIGN.md §2/D-P4): the six
147
+ // iframe-reachable-multi fields only make sense for the
148
+ // iframe-reachable-multi mount — reject them under any other
149
+ // strategy (mirrors ui.ts's dead-field-under-wrong-variant pattern).
150
+ const iframeOnlyFields = [
151
+ ['bundleUrl', ingest.bundleUrl !== undefined],
152
+ ['baseHref', ingest.baseHref !== undefined],
153
+ ['assetBaseUrl', ingest.assetBaseUrl !== undefined],
154
+ ['extraDeps', ingest.extraDeps !== undefined],
155
+ ['pixiModuleUrl', ingest.pixiModuleUrl !== undefined],
156
+ ['bodyHtml', ingest.bodyHtml !== undefined],
157
+ ];
158
+ if (ingest.strategy !== 'iframe-reachable') {
159
+ for (const [key, present] of iframeOnlyFields) {
160
+ if (present) {
161
+ ctx.addIssue({
162
+ code: z.ZodIssueCode.custom,
163
+ message: `\`${key}\` is only legal when strategy is 'iframe-reachable' (got ` +
164
+ `"${ingest.strategy}") — bundleUrl/baseHref/assetBaseUrl/extraDeps/` +
165
+ "pixiModuleUrl/bodyHtml are the iframe-reachable-multi mount's options " +
166
+ '(pixijs: ingest-iframe-2d.ts IframeReachableMultiOpts; threejs, D-W1: ' +
167
+ 'ingest-iframe-reachable-adapter.ts IframeReachableBundleOpts) and have no ' +
168
+ 'meaning under any other strategy.',
169
+ path: [key],
170
+ });
171
+ }
172
+ }
173
+ return;
174
+ }
175
+ const hasBundleUrl = ingest.bundleUrl !== undefined;
176
+ const hasEntryHtml = ingest.entryHtml !== undefined;
177
+ if (hasBundleUrl === hasEntryHtml) {
178
+ ctx.addIssue({
179
+ code: z.ZodIssueCode.custom,
180
+ message: "strategy 'iframe-reachable' requires EXACTLY ONE of `bundleUrl` (externalized " +
181
+ 'multi-file bundle, the iframe-reachable-multi mount) or `entryHtml` (single-' +
182
+ `file/legacy iframe entry) — ${hasBundleUrl ? 'both are present' : 'neither is present'}.`,
183
+ path: hasBundleUrl ? ['bundleUrl'] : ['entryHtml'],
184
+ });
185
+ }
186
+ }),
187
+ }),
188
+ ])
189
+ .describe("World adapter identity: 'default' (resolved by world kind to the built-in default " +
190
+ 'adapter), a custom { module } adapter, or an { ingest } strategy for an unmodified ' +
191
+ 'game (a repo-vendored game or your own external folder)');
192
+ // ---------------------------------------------------------------------------
193
+ // World entry
194
+ // ---------------------------------------------------------------------------
195
+ export const WorldEntrySchema = z.object({
196
+ id: z
197
+ .string()
198
+ .describe('Unique id for this world within the manifest (enforced-unique, D-V6 — GameManifestSchema.worlds rejects duplicates)'),
199
+ kind: z
200
+ .enum(['threejs', 'pixijs', 'react'])
201
+ .describe('World render substrate kind (mirrors runtime/game.ts WorldKind)'),
202
+ description: z
203
+ .string()
204
+ .optional()
205
+ .describe("Optional one-line description of this world's game/content (e.g. an ingested game's " +
206
+ "blurb — the manifest-native replacement for a registry entry's description field)"),
207
+ adapter: WorldAdapterSchema.default('default').describe("This world's adapter — see WorldAdapterSchema; defaults to 'default' (resolved by kind)"),
208
+ scene: z
209
+ .string()
210
+ .optional()
211
+ .describe('.vscn.json / .scn2d.json scene path (default adapters only — ingest adapters keep their own formats)'),
212
+ entry: z
213
+ .string()
214
+ .optional()
215
+ .describe("Module exporting setup()/adapter (default adapters' code-authored alternative to `scene`)"),
216
+ zOrder: z
217
+ .number()
218
+ .int()
219
+ .default(0)
220
+ .describe('Canvas stacking order (COMPOSITION-DESIGN); ties broken by array order'),
221
+ pausable: z
222
+ .boolean()
223
+ .default(true)
224
+ .describe('Whether play-mode pause/step applies to this world'),
225
+ loop: z
226
+ .enum(['gated', 'self-driven'])
227
+ .default('gated')
228
+ .describe('gated: host-driven loop (default). self-driven: this world drives its own loop ' +
229
+ '(the "composited, unsynchronized" tier) — an axis independent of capability tier'),
230
+ capabilities: z
231
+ .object({
232
+ local: TierSchema.optional().describe('Declared capability tier when served via the local CLI (Vite pipeline); omitted -> derived (§4)'),
233
+ hosted: TierSchema.optional().describe('Declared capability tier when served hosted (no bundler: esbuild-wasm + externals only); omitted -> derived (§4)'),
234
+ })
235
+ .optional()
236
+ .describe("Per-delivery-context capability tier declarations (§4). Declaring above the adapter's " +
237
+ 'ceiling for that context is an error; declaring at or below it (including `unsupported`) is legal.'),
238
+ });
239
+ // ---------------------------------------------------------------------------
240
+ // Game manifest (vgai.game.json)
241
+ // ---------------------------------------------------------------------------
242
+ export const GameManifestSchema = z
243
+ .object({
244
+ manifestVersion: z.literal(1).describe('Manifest file format version (currently always 1)'),
245
+ name: z.string().describe('Game display name'),
246
+ version: z.string().describe("The game's own version (used for orphan detection)"),
247
+ engine: z
248
+ .object({
249
+ version: z
250
+ .string()
251
+ .describe('Exact @vgai/engine semver this game was scaffolded/last upgraded against — an ' +
252
+ 'identity pin, not a range'),
253
+ })
254
+ .describe('Engine version pin'),
255
+ worlds: z
256
+ .array(WorldEntrySchema)
257
+ .min(1)
258
+ .superRefine((worlds, ctx) => {
259
+ // D-V6 (docs/WAVE5-MULTIWORLD-INGEST-DESIGN.md §1G debt,
260
+ // docs/MULTI-WORLD-DESIGN.md §1G): world ids are described as unique
261
+ // above but that was describe-only at the SCHEMA level — only
262
+ // load.ts's loader-level cross-field check caught a collision, so
263
+ // any OTHER consumer of this schema (the generated JSON Schema,
264
+ // editor tooling) saw duplicate ids as legal. Enforced HERE instead,
265
+ // naming every colliding id (not just the first found) — overlay
266
+ // files are keyed by world id (`.vgai/overlays/<id>.json`), so a
267
+ // silently-permitted duplicate would have two worlds silently share
268
+ // one overlay.
269
+ const counts = new Map();
270
+ for (const world of worlds)
271
+ counts.set(world.id, (counts.get(world.id) ?? 0) + 1);
272
+ const duplicates = [...counts.entries()].filter(([, n]) => n > 1).map(([id]) => id);
273
+ if (duplicates.length === 0)
274
+ return;
275
+ const idsText = duplicates.map((id) => `"${id}"`).join(', ');
276
+ ctx.addIssue({
277
+ code: z.ZodIssueCode.custom,
278
+ message: duplicates.length === 1
279
+ ? `Game manifest: duplicate world id ${idsText} — world ids must be unique across the manifest (enforced-unique).`
280
+ : `Game manifest: duplicate world ids: ${idsText} — world ids must be unique across the manifest (enforced-unique).`,
281
+ });
282
+ })
283
+ .describe("The Game's world list — this manifest is its serialized form"),
284
+ server: z
285
+ .object({
286
+ room: z.string().describe('Colyseus room name'),
287
+ module: z
288
+ .string()
289
+ .optional()
290
+ .describe('Module path for the Colyseus room bootstrap; defaults to the scaffolded server bootstrap'),
291
+ })
292
+ .optional()
293
+ .describe('Multiplayer server config (Colyseus), if this game registers a room'),
294
+ resolution: z
295
+ .object({
296
+ width: z.number().describe('Canvas width in pixels'),
297
+ height: z.number().describe('Canvas height in pixels'),
298
+ })
299
+ .optional()
300
+ .describe("Canvas resolution (subsumed from today's project.json)"),
301
+ })
302
+ .describe('Game manifest (vgai.game.json) — the serialized form of the Game world list');
@@ -0,0 +1,41 @@
1
+ import type RAPIER from '@dimforge/rapier3d-compat';
2
+ /**
3
+ * Collision event handler.
4
+ * Called with the two collider handles and whether contact started or stopped.
5
+ */
6
+ export type CollisionHandler = (handleA: number, handleB: number, started: boolean) => void;
7
+ /**
8
+ * Drains the Rapier event queue each frame and dispatches collision events.
9
+ *
10
+ * Usage:
11
+ * const collisions = createCollisionSystem(rapierWorld, eventQueue);
12
+ * collisions.onCollision((a, b, started) => { ... });
13
+ * // In physics phase: rapierWorld.step(eventQueue);
14
+ * // In postPhysics: collisions.drain();
15
+ */
16
+ export declare function createCollisionSystem(rapierWorld: RAPIER.World, eventQueue: RAPIER.EventQueue): {
17
+ /** Register a collision handler. */
18
+ onCollision(handler: CollisionHandler): void;
19
+ /** Remove a collision handler. */
20
+ offCollision(handler: CollisionHandler): void;
21
+ /**
22
+ * Drain the event queue and dispatch collision events.
23
+ * Call this in POST_PHYSICS phase, after rapierWorld.step(eventQueue).
24
+ *
25
+ * Events are buffered first, then handlers run *after* the drain callback
26
+ * returns. This is required: a handler that calls back into the Rapier world
27
+ * (e.g. trigger dispatch resolving a collider, or an `onTriggerEnter` that
28
+ * spawns/removes a body) would otherwise re-enter Rapier while it is still
29
+ * borrowed by `drainCollisionEvents`, throwing "recursive use of an object
30
+ * ... unsafe aliasing in rust".
31
+ */
32
+ drain(): void;
33
+ /**
34
+ * Look up the rigid body handle that owns a collider handle.
35
+ * To resolve a collider directly to its Object3D entity, use the physics
36
+ * registry's `getByColliderHandle` reverse index instead.
37
+ */
38
+ getBodyHandleFromCollider(colliderHandle: number): number | undefined;
39
+ };
40
+ export type CollisionSystem = ReturnType<typeof createCollisionSystem>;
41
+ //# sourceMappingURL=collision-system.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collision-system.d.ts","sourceRoot":"","sources":["../../src/physics/collision-system.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,2BAA2B,CAAC;AAEpD;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;AAE5F;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU;IAI1F,oCAAoC;yBACf,gBAAgB;IAIrC,kCAAkC;0BACZ,gBAAgB;IAKtC;;;;;;;;;;OAUG;;IAkBH;;;;OAIG;8CACuC,MAAM,GAAG,MAAM,GAAG,SAAS;EAQxE;AAED,MAAM,MAAM,eAAe,GAAG,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Drains the Rapier event queue each frame and dispatches collision events.
3
+ *
4
+ * Usage:
5
+ * const collisions = createCollisionSystem(rapierWorld, eventQueue);
6
+ * collisions.onCollision((a, b, started) => { ... });
7
+ * // In physics phase: rapierWorld.step(eventQueue);
8
+ * // In postPhysics: collisions.drain();
9
+ */
10
+ export function createCollisionSystem(rapierWorld, eventQueue) {
11
+ const handlers = [];
12
+ return {
13
+ /** Register a collision handler. */
14
+ onCollision(handler) {
15
+ handlers.push(handler);
16
+ },
17
+ /** Remove a collision handler. */
18
+ offCollision(handler) {
19
+ const idx = handlers.indexOf(handler);
20
+ if (idx !== -1)
21
+ handlers.splice(idx, 1);
22
+ },
23
+ /**
24
+ * Drain the event queue and dispatch collision events.
25
+ * Call this in POST_PHYSICS phase, after rapierWorld.step(eventQueue).
26
+ *
27
+ * Events are buffered first, then handlers run *after* the drain callback
28
+ * returns. This is required: a handler that calls back into the Rapier world
29
+ * (e.g. trigger dispatch resolving a collider, or an `onTriggerEnter` that
30
+ * spawns/removes a body) would otherwise re-enter Rapier while it is still
31
+ * borrowed by `drainCollisionEvents`, throwing "recursive use of an object
32
+ * ... unsafe aliasing in rust".
33
+ */
34
+ drain() {
35
+ const events = [];
36
+ eventQueue.drainCollisionEvents((handle1, handle2, started) => {
37
+ events.push([handle1, handle2, started]);
38
+ });
39
+ eventQueue.drainContactForceEvents((_event) => {
40
+ // Contact force events available for advanced use.
41
+ // Game code can subscribe to these by extending this system.
42
+ });
43
+ for (const [handle1, handle2, started] of events) {
44
+ for (let i = 0; i < handlers.length; i++) {
45
+ handlers[i](handle1, handle2, started);
46
+ }
47
+ }
48
+ },
49
+ /**
50
+ * Look up the rigid body handle that owns a collider handle.
51
+ * To resolve a collider directly to its Object3D entity, use the physics
52
+ * registry's `getByColliderHandle` reverse index instead.
53
+ */
54
+ getBodyHandleFromCollider(colliderHandle) {
55
+ const collider = rapierWorld.getCollider(colliderHandle);
56
+ if (!collider)
57
+ return undefined;
58
+ const body = collider.parent();
59
+ if (!body)
60
+ return undefined;
61
+ return body.handle;
62
+ },
63
+ };
64
+ }
@@ -0,0 +1,45 @@
1
+ import type RAPIER from '@dimforge/rapier3d-compat';
2
+ import type * as THREE from 'three';
3
+ /** The Rapier handles owned by a single Object3D entity. */
4
+ export interface PhysicsRefs {
5
+ body: RAPIER.RigidBody;
6
+ collider: RAPIER.Collider;
7
+ }
8
+ /**
9
+ * Maps Three.js Object3Ds to their Rapier bodies/colliders, and Rapier collider
10
+ * handles back to Object3Ds.
11
+ *
12
+ * Replaces the old bitecs RigidBodyRef/ColliderRef SoA components. Two indexes:
13
+ * - `Object3D → {body, collider}` for the postPhysics transform writer and for
14
+ * GameComponents/editor to reach an entity's physics.
15
+ * - `colliderHandle → Object3D` reverse index for collision/trigger dispatch
16
+ * (Rapier collision events report collider handles).
17
+ */
18
+ export declare function createPhysicsRegistry(): {
19
+ /** Register an Object3D's body + collider, indexing both directions. */
20
+ add(object3D: THREE.Object3D, body: RAPIER.RigidBody, collider: RAPIER.Collider): void;
21
+ /** Get the physics refs for an Object3D, if any. */
22
+ get(object3D: THREE.Object3D): PhysicsRefs | undefined;
23
+ /** Resolve a Rapier collider handle to the Object3D that owns it. */
24
+ getByColliderHandle(handle: number): THREE.Object3D | undefined;
25
+ /**
26
+ * Register a callback fired synchronously, just before an entry is torn
27
+ * down, for every `remove()` call (both indexes are still intact at call
28
+ * time). Used by trigger-dispatch (T1.12d) to flush any pending
29
+ * `onTriggerExit` for a sensor overlap involving this object before the
30
+ * collider handle becomes unresolvable — otherwise an entity despawned
31
+ * between the physical exit and the next `collisions.drain()` silently
32
+ * drops the exit callback on its still-live overlap partner.
33
+ */
34
+ onRemove(listener: (object3D: THREE.Object3D, refs: PhysicsRefs) => void): void;
35
+ /** Remove an Object3D's entry from both indexes. */
36
+ remove(object3D: THREE.Object3D): void;
37
+ /** Iterate every (Object3D, refs) pair — used by the transform writer. */
38
+ entries(): IterableIterator<[THREE.Object3D, PhysicsRefs]>;
39
+ /** Number of registered physics entities. */
40
+ readonly size: number;
41
+ /** Clear both indexes (does not free Rapier bodies). */
42
+ clear(): void;
43
+ };
44
+ export type PhysicsRegistry = ReturnType<typeof createPhysicsRegistry>;
45
+ //# sourceMappingURL=physics-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"physics-registry.d.ts","sourceRoot":"","sources":["../../src/physics/physics-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,2BAA2B,CAAC;AACpD,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAEpC,4DAA4D;AAC5D,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC,SAAS,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;CAC3B;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB;IAMjC,wEAAwE;kBAC1D,KAAK,CAAC,QAAQ,QAAQ,MAAM,CAAC,SAAS,YAAY,MAAM,CAAC,QAAQ,GAAG,IAAI;IAKtF,oDAAoD;kBACtC,KAAK,CAAC,QAAQ,GAAG,WAAW,GAAG,SAAS;IAItD,qEAAqE;gCACzC,MAAM,GAAG,KAAK,CAAC,QAAQ,GAAG,SAAS;IAI/D;;;;;;;;OAQG;uBACgB,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,KAAK,IAAI,GAAG,IAAI;IAI/E,oDAAoD;qBACnC,KAAK,CAAC,QAAQ,GAAG,IAAI;IAStC,0EAA0E;eAC/D,gBAAgB,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAI1D,6CAA6C;mBACjC,MAAM;IAIlB,wDAAwD;aAC/C,IAAI;EAKhB;AAED,MAAM,MAAM,eAAe,GAAG,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Maps Three.js Object3Ds to their Rapier bodies/colliders, and Rapier collider
3
+ * handles back to Object3Ds.
4
+ *
5
+ * Replaces the old bitecs RigidBodyRef/ColliderRef SoA components. Two indexes:
6
+ * - `Object3D → {body, collider}` for the postPhysics transform writer and for
7
+ * GameComponents/editor to reach an entity's physics.
8
+ * - `colliderHandle → Object3D` reverse index for collision/trigger dispatch
9
+ * (Rapier collision events report collider handles).
10
+ */
11
+ export function createPhysicsRegistry() {
12
+ const byObject = new Map();
13
+ const byColliderHandle = new Map();
14
+ const removeListeners = [];
15
+ return {
16
+ /** Register an Object3D's body + collider, indexing both directions. */
17
+ add(object3D, body, collider) {
18
+ byObject.set(object3D, { body, collider });
19
+ byColliderHandle.set(collider.handle, object3D);
20
+ },
21
+ /** Get the physics refs for an Object3D, if any. */
22
+ get(object3D) {
23
+ return byObject.get(object3D);
24
+ },
25
+ /** Resolve a Rapier collider handle to the Object3D that owns it. */
26
+ getByColliderHandle(handle) {
27
+ return byColliderHandle.get(handle);
28
+ },
29
+ /**
30
+ * Register a callback fired synchronously, just before an entry is torn
31
+ * down, for every `remove()` call (both indexes are still intact at call
32
+ * time). Used by trigger-dispatch (T1.12d) to flush any pending
33
+ * `onTriggerExit` for a sensor overlap involving this object before the
34
+ * collider handle becomes unresolvable — otherwise an entity despawned
35
+ * between the physical exit and the next `collisions.drain()` silently
36
+ * drops the exit callback on its still-live overlap partner.
37
+ */
38
+ onRemove(listener) {
39
+ removeListeners.push(listener);
40
+ },
41
+ /** Remove an Object3D's entry from both indexes. */
42
+ remove(object3D) {
43
+ const refs = byObject.get(object3D);
44
+ if (refs) {
45
+ for (const listener of removeListeners)
46
+ listener(object3D, refs);
47
+ byColliderHandle.delete(refs.collider.handle);
48
+ }
49
+ byObject.delete(object3D);
50
+ },
51
+ /** Iterate every (Object3D, refs) pair — used by the transform writer. */
52
+ entries() {
53
+ return byObject.entries();
54
+ },
55
+ /** Number of registered physics entities. */
56
+ get size() {
57
+ return byObject.size;
58
+ },
59
+ /** Clear both indexes (does not free Rapier bodies). */
60
+ clear() {
61
+ byObject.clear();
62
+ byColliderHandle.clear();
63
+ },
64
+ };
65
+ }
@@ -0,0 +1,16 @@
1
+ import * as THREE from 'three';
2
+ import type { PhysicsRegistry } from './physics-registry';
3
+ /**
4
+ * Build the single postPhysics transform writer.
5
+ *
6
+ * Replaces the old three-step path (physicsSyncSystem → ECS Position/Rotation →
7
+ * vnode-manager.syncTransforms). Rapier always reports world-space transforms, so
8
+ * for objects parented under something other than the scene root we convert the
9
+ * body's world position/rotation into the parent's local space (P1.5) — the old
10
+ * vnode path wrote world transforms as local and mis-placed parented children.
11
+ *
12
+ * Scale is left untouched: Rapier carries no scale, so the Object3D keeps its
13
+ * authored local scale.
14
+ */
15
+ export declare function createTransformWriter(physics: PhysicsRegistry, sceneRoot: THREE.Object3D): () => void;
16
+ //# sourceMappingURL=transform-writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform-writer.d.ts","sourceRoot":"","sources":["../../src/physics/transform-writer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAM1D;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,KAAK,CAAC,QAAQ,SACpD,IAAI,CAoBxC"}
@@ -0,0 +1,38 @@
1
+ import * as THREE from 'three';
2
+ const _quat = new THREE.Quaternion();
3
+ const _parentInv = new THREE.Matrix4();
4
+ const _parentQuat = new THREE.Quaternion();
5
+ /**
6
+ * Build the single postPhysics transform writer.
7
+ *
8
+ * Replaces the old three-step path (physicsSyncSystem → ECS Position/Rotation →
9
+ * vnode-manager.syncTransforms). Rapier always reports world-space transforms, so
10
+ * for objects parented under something other than the scene root we convert the
11
+ * body's world position/rotation into the parent's local space (P1.5) — the old
12
+ * vnode path wrote world transforms as local and mis-placed parented children.
13
+ *
14
+ * Scale is left untouched: Rapier carries no scale, so the Object3D keeps its
15
+ * authored local scale.
16
+ */
17
+ export function createTransformWriter(physics, sceneRoot) {
18
+ return function writeTransforms() {
19
+ for (const [object3D, { body }] of physics.entries()) {
20
+ const t = body.translation();
21
+ const r = body.rotation();
22
+ const parent = object3D.parent;
23
+ if (parent && parent !== sceneRoot) {
24
+ // World → local: position through the inverse parent world matrix,
25
+ // rotation through the inverse parent world quaternion.
26
+ parent.updateWorldMatrix(true, false);
27
+ _parentInv.copy(parent.matrixWorld).invert();
28
+ object3D.position.set(t.x, t.y, t.z).applyMatrix4(_parentInv);
29
+ parent.getWorldQuaternion(_parentQuat).invert();
30
+ object3D.quaternion.copy(_parentQuat.multiply(_quat.set(r.x, r.y, r.z, r.w)));
31
+ }
32
+ else {
33
+ object3D.position.set(t.x, t.y, t.z);
34
+ object3D.quaternion.set(r.x, r.y, r.z, r.w);
35
+ }
36
+ }
37
+ };
38
+ }
@@ -0,0 +1,24 @@
1
+ import type RAPIER from '@dimforge/rapier3d-compat';
2
+ import type { ComponentManager } from '../ecs/component-manager';
3
+ import type { GameContext } from '../runtime/types';
4
+ import type { CollisionHandler } from './collision-system';
5
+ import type { PhysicsRegistry } from './physics-registry';
6
+ /**
7
+ * Build a {@link CollisionHandler} that turns Rapier sensor overlaps into
8
+ * `onTriggerEnter` / `onTriggerExit` callbacks on the GameComponents of the two
9
+ * involved Object3Ds.
10
+ *
11
+ * Rapier collision events report collider *handles*; we resolve each to its
12
+ * Object3D via the physics registry's reverse index, then notify each side's
13
+ * components with the *other* Object3D. Only sensor-involved collisions dispatch
14
+ * triggers (a solid-vs-solid contact is a regular collision, not a trigger).
15
+ *
16
+ * Tracks currently-active trigger partners so that if one side is unregistered
17
+ * (despawned) from the physics registry before Rapier's own exit event is
18
+ * drained, the still-live side still gets its `onTriggerExit` (T1.12d) — see
19
+ * `physics.onRemove` below.
20
+ *
21
+ * Register with `collisions.onCollision(createTriggerDispatch(...))`.
22
+ */
23
+ export declare function createTriggerDispatch(physics: PhysicsRegistry, components: ComponentManager, rapierWorld: RAPIER.World, ctx: GameContext): CollisionHandler;
24
+ //# sourceMappingURL=trigger-dispatch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trigger-dispatch.d.ts","sourceRoot":"","sources":["../../src/physics/trigger-dispatch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,2BAA2B,CAAC;AAEpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,eAAe,EACxB,UAAU,EAAE,gBAAgB,EAC5B,WAAW,EAAE,MAAM,CAAC,KAAK,EACzB,GAAG,EAAE,WAAW,GACf,gBAAgB,CAsDlB"}