@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
@@ -3,8 +3,7 @@ import * as THREE from 'three';
3
3
  import { RGBELoader } from 'three/addons/loaders/RGBELoader.js';
4
4
  import type { BatchedRenderer } from 'three.quarks';
5
5
  import { initNavigation, NavMeshManager } from '../ai/navigation';
6
- import { AnimGraph } from '../animation/anim-graph';
7
- import { PropertyTrackRunner } from '../animation/property-track';
6
+ import { buildClipMap } from '../animation/clip-map';
8
7
  import { log } from '../dev/logger';
9
8
  import type { ComponentManager } from '../ecs/component-manager';
10
9
  import type { GameComponentClass } from '../ecs/game-component';
@@ -14,7 +13,6 @@ import { type RenderScope, resolveRenderSettings } from '../render/render-settin
14
13
  import {
15
14
  assetCacheSizes,
16
15
  clearAssetCaches as clearSharedAssetCaches,
17
- loadAnimGraphData,
18
16
  loadGLTF,
19
17
  resolveGltfNode,
20
18
  } from './asset-loaders';
@@ -46,18 +44,18 @@ import {
46
44
  import { isEntityRefSchema } from './schema/entity-ref';
47
45
  import { getUserData, setUserData } from './user-data';
48
46
 
49
- // GLTF / texture / animgraph load+cache logic lives in the shared ./asset-loaders
50
- // module (A2) so the editor and runtime share one cache + one clone-safety
51
- // contract. Only the IBL/skybox env-map cache stays here — it needs a
52
- // WebGLRenderer (PMREM), which the shared module deliberately doesn't depend on.
47
+ // GLTF / texture load+cache logic lives in the shared ./asset-loaders module
48
+ // (A2) so the editor and runtime share one cache + one clone-safety contract.
49
+ // Only the IBL/skybox env-map cache stays here — it needs a WebGLRenderer
50
+ // (PMREM), which the shared module deliberately doesn't depend on.
53
51
  const envTextureCache = new Map<string, THREE.Texture>();
54
52
  let pmremGenerator: THREE.PMREMGenerator | null = null;
55
53
 
56
54
  /**
57
- * Clear module-level asset caches (textures, GLTF scenes, anim graphs, IBL env
58
- * maps). Call on full runtime teardown to release cached GPU resources and avoid
59
- * leaking across editor Play sessions. Delegates the GLTF/texture/animgraph
60
- * caches to {@link clearSharedAssetCaches} and additionally frees the local
55
+ * Clear module-level asset caches (textures, GLTF scenes, IBL env maps). Call
56
+ * on full runtime teardown to release cached GPU resources and avoid leaking
57
+ * across editor Play sessions. Delegates the GLTF/texture caches to
58
+ * {@link clearSharedAssetCaches} and additionally frees the local
61
59
  * IBL env-map cache + PMREM generator.
62
60
  *
63
61
  * Lifetime / P1.8: these caches are intentionally module-level and persist
@@ -99,14 +97,12 @@ export function updateSceneLODs(scene: THREE.Scene, camera: THREE.Camera): void
99
97
  export function __assetCacheSizesForTest(): {
100
98
  textures: number;
101
99
  gltf: number;
102
- animGraphs: number;
103
100
  env: number;
104
101
  } {
105
102
  const sizes = assetCacheSizes();
106
103
  return {
107
104
  textures: sizes.textures,
108
105
  gltf: sizes.gltf,
109
- animGraphs: sizes.animGraphs,
110
106
  env: envTextureCache.size,
111
107
  };
112
108
  }
@@ -176,19 +172,6 @@ function createCurveFromSpline(spline: SceneSpline): THREE.CatmullRomCurve3 | nu
176
172
  );
177
173
  }
178
174
 
179
- function buildClipMap(
180
- animations: THREE.AnimationClip[],
181
- aliases?: Record<string, string>,
182
- ): Map<string, THREE.AnimationClip> {
183
- const clips = new Map<string, THREE.AnimationClip>();
184
- for (const clip of animations) {
185
- const raw = clip.name.split('|').pop()?.toLowerCase() ?? clip.name;
186
- const name = aliases?.[raw] ?? raw;
187
- clips.set(name, clip);
188
- }
189
- return clips;
190
- }
191
-
192
175
  export interface SceneLoadContext {
193
176
  scene: THREE.Scene;
194
177
  rapierWorld: RAPIER.World;
@@ -205,10 +188,6 @@ export interface SceneLoadContext {
205
188
  instancesFileCache?: Map<string, InstancesFile>;
206
189
  /** Supply an AudioListener (attached to camera) to enable audio entity spawning. */
207
190
  audioListener?: THREE.AudioListener;
208
- /** AnimGraph registry keyed by Object3D. If provided, loader registers created
209
- * AnimGraphs here (and skips tickFns to avoid double-ticking with the global
210
- * animationSystem). */
211
- animGraphs?: Map<THREE.Object3D, AnimGraph>;
212
191
  /** ComponentManager for instantiating GameComponent classes from scene data. */
213
192
  componentManager?: ComponentManager;
214
193
  /** three.quarks BatchedRenderer. If provided, particle systems declared on
@@ -351,15 +330,15 @@ function entityLabel(def: SceneEntity): string {
351
330
  // ---------------------------------------------------------------------------
352
331
  // T3.9 — bounded-concurrency asset prefetch.
353
332
  //
354
- // Child/asset fetches (prefab files, materials, GLTF models, animgraphs) used
355
- // to only ever happen inline, one at a time, inside the fully-sequential
333
+ // Child/asset fetches (prefab files, materials, GLTF models) used to only
334
+ // ever happen inline, one at a time, inside the fully-sequential
356
335
  // `spawnEntity` recursion — fine at ~20 assets, product-breaking at hundreds
357
336
  // (every fetch's network round-trip is paid serially). Rather than restructure
358
337
  // the deterministic sequential spawn walk itself (which authored array order,
359
338
  // tickFns/mixers order, and GameComponent registration order all depend on),
360
339
  // this prefetch pass walks the WHOLE entity tree up front and warms the
361
- // existing URL-keyed caches (asset-loaders.ts's module-level GLTF/animgraph
362
- // caches, and this module's ctx-level prefab/material file caches) with a
340
+ // existing URL-keyed caches (asset-loaders.ts's module-level GLTF cache, and
341
+ // this module's ctx-level prefab/material file caches) with a
363
342
  // small concurrency limiter. The sequential spawn pass below is completely
364
343
  // unchanged — its `await`s just resolve instantly against a warm cache, so
365
344
  // wall-clock time is bounded by ceil(assetCount / limit) round-trips instead
@@ -416,10 +395,6 @@ function collectPrefetchTasks(
416
395
  const ref = def.materialRef;
417
396
  tasks.push(() => loadMaterialFile(ref, ctx));
418
397
  }
419
- if (def.animation?.animGraph) {
420
- const graph = def.animation.animGraph;
421
- tasks.push(() => loadAnimGraphData(graph));
422
- }
423
398
  if (def.prefab && !ctx.prefabs?.has(def.prefab) && !seenPrefabUrls.has(def.prefab)) {
424
399
  const prefabUrl = def.prefab;
425
400
  seenPrefabUrls.add(prefabUrl);
@@ -502,6 +477,12 @@ async function instantiateScene(
502
477
  ctx.scene.add(obj);
503
478
  }
504
479
 
480
+ // Pass 1.5: animated attachments must resolve only after every entity and
481
+ // GLTF skeleton has spawned. Reparenting preserves the authored transform
482
+ // as the local socket offset; gameplay components remain on the same
483
+ // Object3D and therefore require no mirror or adapter entity.
484
+ resolveBoneAttachments(data.entities, idMap);
485
+
505
486
  // Pass 2: create joints between physics bodies
506
487
  createSceneJoints(data.entities, idMap, ctx);
507
488
 
@@ -714,40 +695,33 @@ async function spawnEntity(
714
695
  wrapper.add(content);
715
696
  object3d = wrapper;
716
697
 
717
- // Set up animation if defined
698
+ // Set up animation if defined. Always build the mixer + clip map (and
699
+ // expose both via userData) whenever the entity has clips — not just
700
+ // when `autoplay` is set — so a GameComponent (e.g. an XState-driven
701
+ // character controller, E5's replacement for the removed AnimGraph) can
702
+ // pick up `_animMixer`/`_animClips` in its own `init()` and drive the
703
+ // SAME mixer via `bindXStateAnimation` (xstate-animation-binding.ts).
704
+ // Only `autoplay` self-ticks here (`tickFns`) — a component driving its
705
+ // own binding calls `mixer.update(dt)` itself (inside the binding's
706
+ // `tick`), so auto-ticking unconditionally would double-advance it.
718
707
  if (def.animation && animations.length > 0) {
719
708
  const clipMap = buildClipMap(animations, def.animation.clipAliases);
709
+ const mixer = new THREE.AnimationMixer(gltfScene);
710
+ setUserData(object3d, '_animMixer', mixer);
711
+ setUserData(object3d, '_animClips', clipMap);
712
+ setUserData(object3d, '_availableClips', [...clipMap.keys()]);
713
+ mixers.push(mixer);
720
714
 
721
- if (def.animation.animGraph) {
722
- // Full AnimGraph state machine
723
- const graphData = await loadAnimGraphData(def.animation.animGraph);
724
- const mixer = new THREE.AnimationMixer(gltfScene);
725
- const graph = new AnimGraph(mixer, graphData, clipMap);
726
- if (def.animation.parameters) {
727
- for (const [key, value] of Object.entries(def.animation.parameters)) {
728
- graph.setParameter(key, value);
729
- }
730
- }
731
- if (ctx.animGraphs) {
732
- // Register in global map (keyed by Object3D); animationSystem ticks it.
733
- ctx.animGraphs.set(object3d, graph);
734
- } else {
735
- // Standalone: tick via scene instance update
736
- tickFns.push((dt) => graph.update(dt));
737
- }
738
- mixers.push(mixer);
739
- } else if (def.animation.autoplay) {
715
+ if (def.animation.autoplay) {
740
716
  // Simple clip autoplay
741
717
  const clip = clipMap.get(def.animation.autoplay);
742
718
  if (clip) {
743
- const mixer = new THREE.AnimationMixer(gltfScene);
744
719
  const action = mixer.clipAction(clip);
745
720
  const loop = def.animation.loop ?? DEFAULTS.animation.loop;
746
721
  action.setLoop(loop ? THREE.LoopRepeat : THREE.LoopOnce, Infinity);
747
722
  action.clampWhenFinished = !loop;
748
723
  action.play();
749
724
  tickFns.push((dt) => mixer.update(dt));
750
- mixers.push(mixer);
751
725
  }
752
726
  }
753
727
  }
@@ -914,17 +888,6 @@ async function spawnEntity(
914
888
  // Visibility (mirrors editor: visible unless explicitly false)
915
889
  object3d.visible = def.visible ?? DEFAULTS.entity.visible;
916
890
 
917
- // F5 — declarative property tracks (docs/VSCN-STRUCTURAL-GAPS-DESIGN.md).
918
- // Unlike gltf autoplay/animGraph above (clip-driven, gltf-only), tracks work
919
- // on ANY entity — a box, a light, no gltf/clips required — so this lives
920
- // OUTSIDE the gltf branch. Registered in the same tickFns list the
921
- // AnimationMixers use, so it ticks on the same deterministic dt (honors
922
- // pause/timeScale for free — no new clock).
923
- if (def.animation?.tracks?.length) {
924
- const runner = new PropertyTrackRunner(object3d, def.animation.tracks);
925
- tickFns.push((dt) => runner.update(dt));
926
- }
927
-
928
891
  // Physics — stores {body, collider} in the physics registry keyed by object3d.
929
892
  // T1.1: the body is created at the COMPOSED WORLD transform (ancestorCtx's
930
893
  // world matrix × this entity's own local transform), not the raw authored
@@ -1161,6 +1124,42 @@ function walkEntities(entities: SceneEntity[], fn: (e: SceneEntity) => void): vo
1161
1124
  }
1162
1125
  }
1163
1126
 
1127
+ /** Reparent scene-authored entities to named bones/sockets in loaded GLTF skeletons. */
1128
+ function resolveBoneAttachments(entities: SceneEntity[], idMap: Map<string, THREE.Object3D>): void {
1129
+ walkEntities(entities, (def) => {
1130
+ const attachment = def.boneAttachment;
1131
+ if (!attachment || !def.id) return;
1132
+
1133
+ const object = idMap.get(def.id);
1134
+ if (!object) return;
1135
+ const target = idMap.get(attachment.target);
1136
+ if (!target) {
1137
+ throw new Error(
1138
+ `Bone attachment target "${attachment.target}" not found for entity "${entityLabel(def)}".`,
1139
+ );
1140
+ }
1141
+ if (target === object) {
1142
+ throw new Error(`Entity "${entityLabel(def)}" cannot attach to its own skeleton.`);
1143
+ }
1144
+
1145
+ const socket = target.getObjectByName(attachment.bone);
1146
+ if (!socket) {
1147
+ const available: string[] = [];
1148
+ target.traverse((node) => {
1149
+ if (node.name && node instanceof THREE.Bone) {
1150
+ available.push(node.name);
1151
+ }
1152
+ });
1153
+ const suffix = available.length > 0 ? ` Available bones: ${available.sort().join(', ')}` : '';
1154
+ throw new Error(
1155
+ `Bone/socket "${attachment.bone}" was not found on target "${attachment.target}" for entity "${entityLabel(def)}".${suffix}`,
1156
+ );
1157
+ }
1158
+
1159
+ socket.add(object);
1160
+ });
1161
+ }
1162
+
1164
1163
  /** Create Rapier joints for all entities that define them. */
1165
1164
  function createSceneJoints(
1166
1165
  entities: SceneEntity[],
@@ -1370,10 +1369,10 @@ export interface SpawnedPrefab {
1370
1369
  /** The Object3D of the spawned prefab root (added to the scene). */
1371
1370
  object3D: THREE.Object3D;
1372
1371
  /**
1373
- * Tick standalone (non-animGraph) animations for this prefab — e.g. a simple
1374
- * `animation.autoplay` clip. AnimGraphs are registered into `ctx.animGraphs`
1375
- * (when provided) and ticked by the global animationSystem instead, so this
1376
- * is a no-op for those. Call once per frame, mirroring SceneInstance.update.
1372
+ * Tick standalone `animation.autoplay` clips for this prefab. A GameComponent
1373
+ * that attaches its own XState-driven animation binding (E5 — see
1374
+ * `xstate-animation-binding.ts`) ticks that binding itself, so this is a
1375
+ * no-op for those. Call once per frame, mirroring SceneInstance.update.
1377
1376
  */
1378
1377
  update(dt: number): void;
1379
1378
  /** Stop any mixers this prefab created. */
@@ -1385,16 +1384,16 @@ export interface SpawnedPrefab {
1385
1384
  *
1386
1385
  * Returns a {@link SpawnedPrefab}. The previous version passed throwaway
1387
1386
  * tickFns/mixers arrays, so a runtime-spawned prefab's `animation.autoplay`
1388
- * (or an animGraph with no `ctx.animGraphs`) never advanced. Now the tick
1389
- * functions are captured and exposed via `update()`, consistent with how
1390
- * loadScene's SceneInstance.update drives animations.
1387
+ * never advanced. Now the tick functions are captured and exposed via
1388
+ * `update()`, consistent with how loadScene's SceneInstance.update drives
1389
+ * animations.
1391
1390
  *
1392
1391
  * Usage:
1393
1392
  * const crate = await spawnPrefab('/data/prefabs/crate.prefab.json', ctx, {
1394
1393
  * transform: { position: [x, y, z] },
1395
1394
  * components: { Health: { current: 50 } },
1396
1395
  * });
1397
- * // each frame (only needed for autoplay clips; animGraphs tick globally):
1396
+ * // each frame (only needed for autoplay clips):
1398
1397
  * crate.update(dt);
1399
1398
  */
1400
1399
  export async function spawnPrefab(
@@ -1445,13 +1444,8 @@ export async function spawnPrefab(
1445
1444
  // - mixers (THREE.AnimationMixer, simple `animation.autoplay` clips)
1446
1445
  // DISPOSED — stopAllAction() on every mixer this spawn created
1447
1446
  // (pre-existing).
1448
- // - tickFns (standalone animGraph/mixer tick closures, only used when
1449
- // `ctx.animGraphs` is NOT provided) DISPOSED — array cleared so
1450
- // update() becomes a no-op (pre-existing).
1451
- // - ctx.animGraphs (Object3D -> AnimGraph, when provided)
1452
- // NEWLY-DISPOSED — every entry whose key is inside the spawned
1453
- // subtree is deleted, so the global animationSystem stops ticking a
1454
- // despawned graph (probe1: previously leaked forever).
1447
+ // - tickFns (standalone `animation.autoplay` mixer tick closures)
1448
+ // DISPOSED — array cleared so update() becomes a no-op (pre-existing).
1455
1449
  // - ctx.particleRenderer (three.quarks BatchedRenderer, when provided)
1456
1450
  // NEWLY-DISPOSED — every particle system tagged via the
1457
1451
  // `_particleSystem` userData key (mirrors editor scene-sync's own
@@ -1469,7 +1463,7 @@ export async function spawnPrefab(
1469
1463
  // tags on Object3Ds that get garbage-collected with the subtree once
1470
1464
  // `ctx.scene.remove(object3D)` drops the last reference; there is no
1471
1465
  // separate ctx-level registry entry to leak.
1472
- // - GLTF/texture/animgraph asset caches (asset-loaders.ts, module-level)
1466
+ // - GLTF/texture asset caches (asset-loaders.ts, module-level)
1473
1467
  // DELIBERATELY NOT DISPOSED — these are shared, URL-keyed caches
1474
1468
  // across the whole runtime session (P1.8 contract: repeated
1475
1469
  // spawns/loads of the same asset must NOT re-fetch or re-parse), not
@@ -1492,15 +1486,6 @@ export async function spawnPrefab(
1492
1486
  ctx.rapierWorld.removeRigidBody(refs.body);
1493
1487
  ctx.physics.remove(node);
1494
1488
  });
1495
- // Unregister any AnimGraphs this subtree registered into the shared,
1496
- // Object3D-keyed ctx.animGraphs map — otherwise the global
1497
- // animationSystem keeps ticking a despawned graph forever.
1498
- if (ctx.animGraphs) {
1499
- const animGraphs = ctx.animGraphs;
1500
- object3D.traverse((node) => {
1501
- animGraphs.delete(node);
1502
- });
1503
- }
1504
1489
  // Unregister any particle systems this subtree registered with the
1505
1490
  // shared BatchedRenderer — otherwise they keep simulating/rendering
1506
1491
  // after the visual object is gone. `_particleSystem` is the same
@@ -1,94 +1,45 @@
1
1
  import { z } from 'zod';
2
- // Reuse the UI track easing vocabulary (S1) so there is ONE easing enum across
3
- // the codebase — see F5 (docs/VSCN-STRUCTURAL-GAPS-DESIGN.md). Do NOT reuse
4
- // UIKeyframeSchema itself: its `value` is `z.union([z.number(), z.string()])`,
5
- // and property-track values MUST be numbers only (no expression/string-logic
6
- // values — in-scene scripting is banned, G1).
7
- import { UIEasingSchema } from './ui';
8
-
9
- /** Validated at runtime against AnimGraph parameter definitions. */
10
- const AnimParameterOverridesSchema = z.record(z.string(), z.union([z.number(), z.boolean()]));
11
2
 
12
3
  // ---------------------------------------------------------------------------
13
- // F5Declarative property tracks (deterministic timeline).
4
+ // D8declarative property tracks (formerly F5,
5
+ // docs/VSCN-STRUCTURAL-GAPS-DESIGN.md) were REMOVED: Theatre
6
+ // (`@theatre/core`) is the sole authored continuous-animation source (spec
7
+ // §3.2, §10 D2-D4/D8). `PropertyTrackSchema`/`PropertyTrackRunner` and the
8
+ // `tracks` field are deleted, not deprecated-in-place — see
9
+ // packages/engine/src/scene/parse.ts (`assertNoRemovedPropertyTracks`) for
10
+ // the loud migration-error guard that rejects any `.vscn`/`.prefab.json`
11
+ // still authoring `animation.tracks`, since Zod would otherwise silently
12
+ // strip an unrecognized field rather than failing loudly (Global AC §6).
13
+ //
14
+ // E5 — the AnimGraph state-machine runtime, `.animgraph.json` format, and
15
+ // every consumer were removed (spec §3.3, §11 E5; XState + native Three
16
+ // `AnimationMixer` replace it — see `xstate-animation-binding.ts`). The
17
+ // `animGraph` field is deleted outright, not deprecated-in-place, for the
18
+ // same reason as `tracks` above: Zod's default object mode would otherwise
19
+ // silently STRIP an authored `animation.animGraph` rather than reporting it,
20
+ // violating Global AC §6 ("Removed formats fail with a concise migration/
21
+ // removal error rather than being partially read"). The raw-JSON guard
22
+ // (`assertNoRemovedAnimGraph` in packages/engine/src/scene/parse.ts) rejects
23
+ // any `.vscn`/`.prefab.json` still authoring it before Zod ever parses the
24
+ // data — see packages/engine/test/anim-graph-removed.test.ts.
14
25
  //
15
- // A track is DATA: a pure function of time (keyframes + named easing), never
16
- // behavior. `target` is a FIXED allowlist, not an arbitrary property path —
17
- // this is the guardrail that keeps the format from becoming an in-scene
18
- // scripting surface (G1, docs/VSCN-STRUCTURAL-GAPS-DESIGN.md). Anything
19
- // state-dependent ("move WHEN the player steps on it") stays a GameComponent,
20
- // which may start/stop/seek a track it never grows conditionals here.
26
+ // `parameters` is deleted alongside `animGraph`, though it isn't itself named
27
+ // in the spec/removal-inventory: its ONLY documented purpose was seeding an
28
+ // `AnimGraph`'s initial parameter values (its only readers were
29
+ // `scene-loader.ts`'s former animGraph branch, the editor's entity-factory.ts,
30
+ // and AnimationSection.tsx's parameter-row UI all deleted with the runtime).
31
+ // Leaving it declared with zero remaining readers would violate this repo's
32
+ // "no schema field without a runtime reader" policy (CLAUDE.md).
21
33
  // ---------------------------------------------------------------------------
22
34
 
23
- export const PropertyTrackTargetSchema = z
24
- .enum([
25
- 'position.x',
26
- 'position.y',
27
- 'position.z',
28
- 'rotation.x',
29
- 'rotation.y',
30
- 'rotation.z',
31
- 'scale.x',
32
- 'scale.y',
33
- 'scale.z',
34
- 'material.opacity',
35
- 'light.intensity',
36
- ])
37
- .describe(
38
- 'The Object3D property this track drives. A FIXED allowlist, not an arbitrary property ' +
39
- 'path — an open path would let scene data address/mutate arbitrary runtime state, which ' +
40
- 'is in-scene scripting (banned, G1). Add new targets here deliberately, one at a time.',
41
- );
42
- export type PropertyTrackTarget = z.infer<typeof PropertyTrackTargetSchema>;
43
-
44
- export const PropertyTrackKeyframeSchema = z
45
- .object({
46
- time: z.number().describe('Seconds from track start'),
47
- value: z
48
- .number()
49
- .describe(
50
- 'Numeric value at this time — numbers only; no expressions/strings (in-scene scripting is banned)',
51
- ),
52
- easing: UIEasingSchema.optional().describe(
53
- 'Easing of the segment after this keyframe (reuses the UI track easing vocabulary)',
54
- ),
55
- })
56
- .describe('A single keyframe (time + numeric value + optional easing) on a property track');
57
- export type PropertyTrackKeyframe = z.infer<typeof PropertyTrackKeyframeSchema>;
58
-
59
- export const PropertyTrackSchema = z
60
- .object({
61
- target: PropertyTrackTargetSchema,
62
- keyframes: z.array(PropertyTrackKeyframeSchema).describe('Ordered by time'),
63
- loop: z.boolean().optional().describe('Whether the track repeats after reaching `duration`'),
64
- duration: z.number().describe('Track length in seconds'),
65
- })
66
- .describe('A deterministic keyframed timeline driving one allowlisted property');
67
- export type PropertyTrack = z.infer<typeof PropertyTrackSchema>;
68
-
69
35
  export const SceneAnimationSchema = z
70
36
  .object({
71
- animGraph: z.string().optional().describe('Path to .animgraph.json state machine file'),
72
- parameters: AnimParameterOverridesSchema.optional().describe(
73
- 'Initial parameter values for the animation graph',
74
- ),
75
- autoplay: z
76
- .string()
77
- .optional()
78
- .describe('Clip name to play automatically on load (when no animGraph is set)'),
37
+ autoplay: z.string().optional().describe('Clip name to play automatically on load'),
79
38
  loop: z.boolean().optional().describe('Whether the autoplay clip should loop'),
80
39
  clipAliases: z
81
40
  .record(z.string(), z.string())
82
41
  .optional()
83
- .describe('Map raw GLTF clip names to clean names used by the animation graph'),
84
- tracks: z
85
- .array(PropertyTrackSchema)
86
- .optional()
87
- .describe(
88
- 'Deterministic keyframed property timelines (data, not behavior — pure function of ' +
89
- 'time; state-dependent motion stays a GameComponent). Runs in the animation phase, ' +
90
- 'honors pause/timeScale.',
91
- ),
42
+ .describe('Map raw GLTF clip names to clean names'),
92
43
  })
93
44
  .describe('Animation playback configuration');
94
45
 
@@ -13,6 +13,15 @@ import { SceneShadowOverrideSchema, SceneShadowSchema } from './shadow';
13
13
  import { SceneSplineOverrideSchema, SceneSplineSchema } from './spline';
14
14
  import { TransformSchema, Vec3Schema } from './tuples';
15
15
 
16
+ const BoneAttachmentSchema = z
17
+ .object({
18
+ target: z.string().describe('Entity ID whose animated skeleton owns the target bone'),
19
+ bone: z.string().describe('Exact name of the target bone or socket Object3D'),
20
+ })
21
+ .describe(
22
+ 'Attach this entity to a named bone/socket after the complete scene has loaded. The entity transform becomes its local attachment offset',
23
+ );
24
+
16
25
  /**
17
26
  * User-defined ECS component data. Validated at runtime against ComponentRegistry.
18
27
  *
@@ -65,6 +74,9 @@ const SharedEntityFields = {
65
74
  .optional()
66
75
  .describe('Path to shared .mat.json material asset. Mutually exclusive with inline material'),
67
76
  transform: TransformSchema.optional().describe('Local transform relative to parent'),
77
+ boneAttachment: BoneAttachmentSchema.optional().describe(
78
+ 'Animated bone/socket attachment. Use transform for the local position, rotation, and scale offset',
79
+ ),
68
80
  pivot: Vec3Schema.optional().describe(
69
81
  'Local-space pivot point for rotation/scale. [0,0,0] = geometry center',
70
82
  ),
@@ -165,5 +177,13 @@ export const SceneEntitySchema: z.ZodType<SceneEntity> = z.lazy(() =>
165
177
  path: ['material'],
166
178
  });
167
179
  }
180
+ if (entity.boneAttachment !== undefined && entity.physics !== undefined) {
181
+ ctx.addIssue({
182
+ code: z.ZodIssueCode.custom,
183
+ message:
184
+ 'A bone-attached entity cannot declare physics. Attachments follow an animated transform; add gameplay collision to a separate entity.',
185
+ path: ['boneAttachment'],
186
+ });
187
+ }
168
188
  }),
169
189
  ) as z.ZodType<SceneEntity>;
@@ -1,17 +1,7 @@
1
1
  // Zod schemas
2
2
 
3
- export type {
4
- PropertyTrack,
5
- PropertyTrackKeyframe,
6
- PropertyTrackTarget,
7
- SceneAnimation,
8
- } from './animation';
9
- export {
10
- PropertyTrackKeyframeSchema,
11
- PropertyTrackSchema,
12
- PropertyTrackTargetSchema,
13
- SceneAnimationSchema,
14
- } from './animation';
3
+ export type { SceneAnimation } from './animation';
4
+ export { SceneAnimationSchema } from './animation';
15
5
  export type { SceneAudio } from './audio';
16
6
  export { SceneAudioSchema } from './audio';
17
7
  export type { SceneCamera } from './camera';
@@ -36,9 +36,12 @@
36
36
  *
37
37
  * Animation (load-bearing — ED5 disposal contract):
38
38
  * - `_animMixer` — THREE.AnimationMixer driving this subtree's clips.
39
- * - `_animGraph` — live AnimGraph instance (state machine) for this entity.
40
- * - `_animGraphData` — the AnimGraphFile the graph was built from (inspector cache).
41
- * - `_availableClips` string[] of clip names discovered on the GLTF.
39
+ * - `_animClips` — Map<string, AnimationClip> discovered on the GLTF (E5
40
+ * lets a GameComponent build its own XState-driven
41
+ * binding via `bindXStateAnimation` over the SAME
42
+ * mixer; see xstate-animation-binding.ts).
43
+ * - `_availableClips` — string[] of clip names discovered on the GLTF
44
+ * (inspector dropdown; same names as `_animClips`' keys).
42
45
  *
43
46
  * Disposal contract:
44
47
  * - `__sharedGeometry` — `true` when a mesh's geometry is shared/cached and MUST
@@ -81,8 +84,6 @@
81
84
 
82
85
  import type * as THREE from 'three';
83
86
  import type { ParticleSystem } from 'three.quarks';
84
- import type { AnimGraph } from '../animation/anim-graph';
85
- import type { AnimGraphFile } from '../animation/anim-graph-types';
86
87
  import type { SceneEntity } from './scene-types';
87
88
 
88
89
  /** The kinds of editor helper objects tagged via `editorHelperType`. */
@@ -112,8 +113,7 @@ export interface UserDataSchema {
112
113
  _camera: THREE.Camera;
113
114
  _particleSystem: ParticleSystem;
114
115
  _animMixer: THREE.AnimationMixer;
115
- _animGraph: AnimGraph;
116
- _animGraphData: AnimGraphFile;
116
+ _animClips: Map<string, THREE.AnimationClip>;
117
117
  _availableClips: string[];
118
118
  __sharedGeometry: boolean;
119
119
  __shadeOrig: THREE.Material | THREE.Material[];
@@ -152,8 +152,7 @@ export const UserDataKeys = {
152
152
  _camera: '_camera',
153
153
  _particleSystem: '_particleSystem',
154
154
  _animMixer: '_animMixer',
155
- _animGraph: '_animGraph',
156
- _animGraphData: '_animGraphData',
155
+ _animClips: '_animClips',
157
156
  _availableClips: '_availableClips',
158
157
  __sharedGeometry: '__sharedGeometry',
159
158
  __shadeOrig: '__shadeOrig',
@@ -86,6 +86,11 @@ export function createHostRenderer(
86
86
  rendering?: RenderScope,
87
87
  opts?: { alpha?: boolean; preserveDrawingBuffer?: boolean },
88
88
  ): THREE.WebGLRenderer {
89
+ // A newly-shown editor tab can report 0x0 for one layout frame. WebGL render
90
+ // targets cannot have zero-sized attachments, so boot at the smallest valid
91
+ // backing size and let the normal resize path apply the real dimensions.
92
+ const safeWidth = Math.max(1, width);
93
+ const safeHeight = Math.max(1, height);
89
94
  const settings = resolveRenderSettings(rendering);
90
95
  const renderer = new THREE.WebGLRenderer({
91
96
  canvas,
@@ -94,7 +99,7 @@ export function createHostRenderer(
94
99
  ...(opts?.alpha ? { alpha: true } : {}),
95
100
  ...(opts?.preserveDrawingBuffer ? { preserveDrawingBuffer: true } : {}),
96
101
  });
97
- renderer.setSize(width, height);
102
+ renderer.setSize(safeWidth, safeHeight);
98
103
  applyRendererSettings(renderer, rendering);
99
104
  renderer.shadowMap.type = THREE.PCFSoftShadowMap;
100
105
  renderer.toneMapping = toneMappingModes[DEFAULTS.toneMapping.mode] ?? THREE.ACESFilmicToneMapping;
@@ -112,12 +117,14 @@ export function createSceneView(
112
117
  width = window.innerWidth,
113
118
  height = window.innerHeight,
114
119
  ): { scene: THREE.Scene; camera: THREE.PerspectiveCamera; composer: EffectComposer } {
120
+ const safeWidth = Math.max(1, width);
121
+ const safeHeight = Math.max(1, height);
115
122
  const scene = new THREE.Scene();
116
123
  scene.background = new THREE.Color(0x1a1a2e);
117
124
 
118
125
  const camera = new THREE.PerspectiveCamera(
119
126
  DEFAULTS.camera.fov,
120
- width / height,
127
+ safeWidth / safeHeight,
121
128
  DEFAULTS.camera.near,
122
129
  DEFAULTS.camera.far,
123
130
  );