@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,152 @@
1
+ /**
2
+ * Project tools — W4/W3 of `docs/DATA-TOOLS-DESIGN.md` (§3 contract).
3
+ *
4
+ * A project tool is ONE file, `src/tools/<name>.tool.tsx`, discovered by
5
+ * folder scan (same physics as data assets, §3.1: zero registration, delete
6
+ * the file → gone). The file exports exactly two things:
7
+ *
8
+ * ```tsx
9
+ * export const tool = defineTool({
10
+ * id: 'tuning', // stable slug — becomes the tab's test id
11
+ * title: 'Tuning', // the tab label (rendered after a ⚙ marker)
12
+ * placement: 'dock', // project-global dashboard tab (§3.2)
13
+ * });
14
+ * export default function Tuning() { … } // plain React
15
+ * ```
16
+ *
17
+ * or, selection-scoped (W3 — §3.2's second placement):
18
+ *
19
+ * ```tsx
20
+ * export const tool = defineTool({
21
+ * id: 'spin',
22
+ * title: 'Spin',
23
+ * placement: 'inspector', // selection-scoped section
24
+ * match: (node) => node?.kind === 'mesh', // same contract as the
25
+ * }); // inspector-section registry
26
+ * export default function Spin({ node }: InspectorToolProps) { … }
27
+ * ```
28
+ *
29
+ * The editor renders dock tools as visually distinct tabs after a separator
30
+ * at the end of the bottom dock's tab row (§3.5); inspector tools render as
31
+ * a ⚙-marked section in the Inspector rail whenever `match` accepts the
32
+ * current selection. Both render inside an error boundary — a crashing tool
33
+ * never takes the editor down. Tools are EDITOR-ONLY: no game build bundles
34
+ * `src/tools/` (§4 — nothing in game code imports it), so dev/cheat surfaces
35
+ * can never leak into a tester serve.
36
+ *
37
+ * This module is deliberately react-free metadata (the engine core outside
38
+ * `src/react/` must not import react — `test/react-core-import-ban.test.ts`);
39
+ * the react-facing tool hooks live in `@engine/react/use-data`, and the
40
+ * editor-styled widget kit tools build panels from is `@editor/widgets`.
41
+ */
42
+
43
+ import type { AuthoringAdapter, EditorNode } from '../adapter';
44
+
45
+ /** The two placements (§3.2). Deliberately nothing else — no floating
46
+ * windows, no in-game overlay host (§3.2 "deliberately NOT built"). */
47
+ export type ToolPlacement = 'dock' | 'inspector';
48
+
49
+ /** Fields every tool declares — see {@link defineTool} for the contract. */
50
+ interface ToolConfigBase {
51
+ /**
52
+ * Stable slug for this tool: letters/digits/`-`/`_` only. It becomes the
53
+ * mount's `data-testid` (`bottom-tab-tool-<id>` for dock tools,
54
+ * `inspector-tool-<id>` for inspector tools), so keep it short and never
55
+ * rename it casually — automation and saved layouts key off it.
56
+ */
57
+ id: string;
58
+ /** Human label: the dock tab text, or the inspector section's header,
59
+ * rendered after the ⚙ project-tool marker (§3.5). */
60
+ title: string;
61
+ }
62
+
63
+ /** A project-global dashboard tab in the bottom dock (§3.2, W4). */
64
+ export interface DockToolConfig extends ToolConfigBase {
65
+ placement: 'dock';
66
+ }
67
+
68
+ /** A selection-scoped Inspector section (§3.2, W3). */
69
+ export interface InspectorToolConfig extends ToolConfigBase {
70
+ placement: 'inspector';
71
+ /**
72
+ * When this section appears — the SAME contract as the editor's
73
+ * `inspector-section-registry`: called with the currently selected node
74
+ * (`null` in the no-selection/environment state) and the active authoring
75
+ * adapter; return `true` to render. Keep it cheap and pure — it runs on
76
+ * every inspector render. A `match` that throws is treated as `false`
77
+ * (with one console teaching error), never crashing the inspector.
78
+ */
79
+ match: (node: EditorNode | null, adapter: AuthoringAdapter) => boolean;
80
+ }
81
+
82
+ /** Metadata for a project tool — a discriminated union on `placement`. */
83
+ export type ToolConfig = DockToolConfig | InspectorToolConfig;
84
+
85
+ /**
86
+ * Props the editor passes to an INSPECTOR tool's default-exported component
87
+ * (dock tools receive no props). Everything richer (live game store, field
88
+ * addresses) arrives through the §3.3 hooks, not through more props.
89
+ */
90
+ export interface InspectorToolProps {
91
+ /** The selected node your `match` accepted (`null` in the no-selection
92
+ * state, if your `match` chose to accept it). */
93
+ node: EditorNode | null;
94
+ /** The selected node's stable id (`null` in the no-selection state). */
95
+ nodeId: string | null;
96
+ }
97
+
98
+ const TEMPLATE_EXAMPLE = 'the template worked example: src/tools/example.tool.tsx';
99
+
100
+ /** Teaching-error helper (§6.5): every rejection names the fix and cites the
101
+ * template example by path. */
102
+ function toolError(problem: string, fix: string): Error {
103
+ return new Error(`defineTool: ${problem} — ${fix} (see ${TEMPLATE_EXAMPLE}).`);
104
+ }
105
+
106
+ /**
107
+ * Validate and freeze a project tool's metadata (docs/DATA-TOOLS-DESIGN.md
108
+ * §3.1). Call it once at module scope of a `src/tools/<name>.tool.tsx` file
109
+ * and export the result as `tool`, next to a default-exported React
110
+ * component — the editor's folder scan picks the file up automatically.
111
+ *
112
+ * Fails loud (§6.5 "errors teach") on anything malformed rather than letting
113
+ * a half-shaped tool render confusingly: bad `id`/`title`, an unknown
114
+ * placement, an inspector tool without a callable `match`.
115
+ *
116
+ * The returned config is frozen: tool metadata is a definition, not state
117
+ * (the same immutability rule data assets follow, §2.1).
118
+ */
119
+ export function defineTool(config: ToolConfig): Readonly<ToolConfig> {
120
+ if (config === null || typeof config !== 'object') {
121
+ throw toolError(
122
+ 'expected a config object',
123
+ "call it as defineTool({ id, title, placement: 'dock' })",
124
+ );
125
+ }
126
+ const { id, title, placement } = config;
127
+ if (placement !== 'dock' && placement !== 'inspector') {
128
+ throw toolError(
129
+ `unknown placement ${JSON.stringify(placement)}`,
130
+ "the placements are 'dock' (project-global bottom tab) and 'inspector' (selection-scoped section, §3.2)",
131
+ );
132
+ }
133
+ if (typeof id !== 'string' || !/^[a-zA-Z0-9_-]+$/.test(id)) {
134
+ throw toolError(
135
+ `invalid id ${JSON.stringify(id)}`,
136
+ 'pass a non-empty slug of letters, digits, "-" or "_" — it becomes the tool\'s data-testid (bottom-tab-tool-<id> / inspector-tool-<id>)',
137
+ );
138
+ }
139
+ if (typeof title !== 'string' || title.trim() === '') {
140
+ throw toolError(`invalid title ${JSON.stringify(title)}`, 'pass a short human-readable label');
141
+ }
142
+ if (placement === 'inspector') {
143
+ if (typeof config.match !== 'function') {
144
+ throw toolError(
145
+ `placement 'inspector' requires a match function (got ${JSON.stringify(config.match)})`,
146
+ "pass match: (node) => boolean — e.g. match: (node) => node?.kind === 'mesh' — deciding which selections show this section",
147
+ );
148
+ }
149
+ return Object.freeze({ id, title, placement, match: config.match });
150
+ }
151
+ return Object.freeze({ id, title, placement });
152
+ }
@@ -1,406 +0,0 @@
1
- import * as THREE from 'three';
2
- import type {
3
- AnimGraphFile,
4
- AnimLayer,
5
- AnimState,
6
- AnimTransition,
7
- TransitionCondition,
8
- } from './anim-graph-types';
9
- import { evaluateBlendTree } from './blend-node';
10
-
11
- /**
12
- * Runtime animation graph for a single entity.
13
- *
14
- * This is the core custom code that Three.js doesn't provide.
15
- * Three.js AnimationMixer handles clip playback and crossfading.
16
- * This adds: state machines, parameter-driven transitions, blend trees.
17
- *
18
- * Weight management: all AnimationActions are pre-played at creation with
19
- * weight 0. Weights are set explicitly every frame — we never use Three.js's
20
- * fadeIn/fadeOut, which can cause total weight to dip below 1.0 and flash
21
- * the bind pose (T-pose).
22
- *
23
- * Usage:
24
- * const graph = new AnimGraph(mixer, graphData, clips);
25
- * graph.setParameter('speed', 5.0);
26
- * graph.update(dt); // call each frame
27
- */
28
- export class AnimGraph {
29
- private mixer: THREE.AnimationMixer;
30
- private layers: LayerRuntime[] = [];
31
- private parameters = new Map<string, number | boolean>();
32
- private triggers = new Set<string>();
33
-
34
- constructor(
35
- mixer: THREE.AnimationMixer,
36
- data: AnimGraphFile,
37
- clips: Map<string, THREE.AnimationClip>,
38
- ) {
39
- this.mixer = mixer;
40
-
41
- // Initialize parameters with defaults
42
- for (const [name, param] of Object.entries(data.parameters)) {
43
- this.parameters.set(name, param.default);
44
- }
45
-
46
- // Create runtime for each layer
47
- for (const layerDef of data.layers) {
48
- this.layers.push(new LayerRuntime(mixer, layerDef, clips));
49
- }
50
- }
51
-
52
- /** The names of all declared parameters (for the AnimationAdapter to enumerate). */
53
- parameterNames(): string[] {
54
- return [...this.parameters.keys()];
55
- }
56
-
57
- /** Set a float/int/bool parameter */
58
- setParameter(name: string, value: number | boolean) {
59
- this.parameters.set(name, value);
60
- }
61
-
62
- /** Get a parameter value */
63
- getParameter(name: string): number | boolean | undefined {
64
- return this.parameters.get(name);
65
- }
66
-
67
- /** Fire a trigger (auto-resets after consumed by a transition) */
68
- trigger(name: string) {
69
- this.triggers.add(name);
70
- }
71
-
72
- /** Get the current state name for a layer (default: first layer) */
73
- getCurrentState(layerIndex = 0): string {
74
- return this.layers[layerIndex]?.currentState ?? '';
75
- }
76
-
77
- /** Update the animation graph. Call once per frame. */
78
- update(dt: number) {
79
- // Triggers persist until a transition actually consumes them — we do NOT
80
- // clear every frame. A trigger fired mid-crossfade (when no transition can
81
- // fire) survives until the layer is ready to act on it.
82
- const consumed = new Set<string>();
83
- for (const layer of this.layers) {
84
- layer.update(dt, this.parameters, this.triggers, consumed);
85
- }
86
-
87
- // Clear only triggers that were consumed by a transition this frame.
88
- for (const name of consumed) {
89
- this.triggers.delete(name);
90
- }
91
-
92
- // Advance the mixer
93
- this.mixer.update(dt);
94
- }
95
- }
96
-
97
- /**
98
- * Runtime state for a single animation layer.
99
- */
100
- class LayerRuntime {
101
- private mixer: THREE.AnimationMixer;
102
- private states: Map<string, AnimState>;
103
- private transitions: AnimTransition[];
104
- private actionMap = new Map<string, THREE.AnimationAction>();
105
- currentState: string;
106
- private previousState = '';
107
- private stateTime = 0;
108
- private stateDuration = 0;
109
- private transitioning = false;
110
- private transitionElapsed = 0;
111
- private transitionDuration = 0;
112
-
113
- constructor(
114
- mixer: THREE.AnimationMixer,
115
- layerDef: AnimLayer,
116
- clips: Map<string, THREE.AnimationClip>,
117
- ) {
118
- this.mixer = mixer;
119
- this.states = new Map(Object.entries(layerDef.states));
120
- this.transitions = layerDef.transitions;
121
- this.currentState = layerDef.defaultState;
122
-
123
- // Collect the (loop, speed) config each clip name is played with. A clip
124
- // name is a key into a single shared THREE.AnimationAction (ensureAction
125
- // dedupes by name), so two states — or a state and a blend-tree child —
126
- // that reference the same clip with different loop/speed would silently
127
- // let whichever state was processed first win, and the other's config
128
- // would be dropped with no signal. Per-state clip config is deferred
129
- // (no real need for it yet) — the correct behavior for now is a loud
130
- // error at graph load, not silent last-write-wins.
131
- const clipConfigs = new Map<string, { loop: boolean; speed: number; state: string }>();
132
- for (const [stateName, state] of this.states) {
133
- if (state.clip) {
134
- this.registerClipConfig(
135
- clipConfigs,
136
- state.clip,
137
- state.loop ?? true,
138
- state.speed ?? 1,
139
- stateName,
140
- );
141
- }
142
- if (state.blendTree) {
143
- for (const child of state.blendTree.children) {
144
- this.registerClipConfig(clipConfigs, child.clip, true, 1, stateName);
145
- }
146
- }
147
- }
148
-
149
- // Create AnimationActions for all referenced clips.
150
- // All actions are played immediately at weight 0 — they stay active in the
151
- // mixer but contribute nothing visually until we raise their weight.
152
- for (const [clipName, config] of clipConfigs) {
153
- this.ensureAction(clipName, clips, config.loop, config.speed);
154
- }
155
-
156
- // Start default state
157
- this.enterState(this.currentState, new Map());
158
- }
159
-
160
- /** Record a clip's (loop, speed) config, throwing if a prior state disagrees. */
161
- private registerClipConfig(
162
- configs: Map<string, { loop: boolean; speed: number; state: string }>,
163
- clipName: string,
164
- loop: boolean,
165
- speed: number,
166
- stateName: string,
167
- ) {
168
- const existing = configs.get(clipName);
169
- if (existing && (existing.loop !== loop || existing.speed !== speed)) {
170
- throw new Error(
171
- `AnimGraph: clip "${clipName}" is configured inconsistently across states — ` +
172
- `state "${existing.state}" uses loop=${existing.loop}/speed=${existing.speed}, ` +
173
- `but state "${stateName}" uses loop=${loop}/speed=${speed}. ` +
174
- `Per-state clip config is not supported: every state (and blend-tree child) that ` +
175
- `plays a given clip must agree on its loop/speed.`,
176
- );
177
- }
178
- if (!existing) configs.set(clipName, { loop, speed, state: stateName });
179
- }
180
-
181
- private ensureAction(
182
- clipName: string,
183
- clips: Map<string, THREE.AnimationClip>,
184
- loop: boolean,
185
- speed: number,
186
- ) {
187
- if (this.actionMap.has(clipName)) return;
188
- const clip = clips.get(clipName);
189
- if (!clip) return;
190
-
191
- const action = this.mixer.clipAction(clip);
192
- action.setLoop(loop ? THREE.LoopRepeat : THREE.LoopOnce, Infinity);
193
- action.clampWhenFinished = !loop;
194
- action.timeScale = speed;
195
- action.setEffectiveWeight(0);
196
- action.play();
197
- this.actionMap.set(clipName, action);
198
- }
199
-
200
- private enterState(stateName: string, parameters: Map<string, number | boolean>) {
201
- const state = this.states.get(stateName);
202
- if (!state) return;
203
-
204
- this.currentState = stateName;
205
- this.stateTime = 0;
206
- this.transitioning = false;
207
-
208
- // Zero all, then set the entering state to full weight
209
- this.zeroAllWeights();
210
-
211
- if (state.clip) {
212
- const action = this.actionMap.get(state.clip);
213
- if (action) {
214
- action.reset();
215
- action.setEffectiveWeight(1);
216
- action.play();
217
- this.stateDuration = action.getClip().duration;
218
- }
219
- }
220
-
221
- if (state.blendTree) {
222
- const weights = evaluateBlendTree(state.blendTree, parameters);
223
- this.setWeights(weights, 1);
224
- const heaviest = weights.reduce((a, b) => (b.weight > a.weight ? b : a), weights[0]!);
225
- const action = this.actionMap.get(heaviest.clip);
226
- this.stateDuration = action?.getClip().duration ?? 1;
227
- }
228
- }
229
-
230
- /** Zero all action weights. */
231
- private zeroAllWeights() {
232
- for (const action of this.actionMap.values()) {
233
- action.setEffectiveWeight(0);
234
- }
235
- }
236
-
237
- /** Set weights for a list of clip/weight pairs, multiplied by a scale factor. */
238
- private setWeights(weights: { clip: string; weight: number }[], scale: number) {
239
- for (const { clip, weight } of weights) {
240
- const action = this.actionMap.get(clip);
241
- if (action) {
242
- action.setEffectiveWeight(weight * scale);
243
- }
244
- }
245
- }
246
-
247
- /** Get the weight list for a state (single clip at weight 1, or blend tree evaluated). */
248
- private getStateWeights(
249
- stateName: string,
250
- parameters: Map<string, number | boolean>,
251
- ): { clip: string; weight: number }[] {
252
- const state = this.states.get(stateName);
253
- if (!state) return [];
254
- if (state.clip) return [{ clip: state.clip, weight: 1 }];
255
- if (state.blendTree) return evaluateBlendTree(state.blendTree, parameters);
256
- return [];
257
- }
258
-
259
- update(
260
- dt: number,
261
- parameters: Map<string, number | boolean>,
262
- triggers: Set<string>,
263
- consumed: Set<string>,
264
- ) {
265
- this.stateTime += dt;
266
- const normalizedTime = this.stateDuration > 0 ? this.stateTime / this.stateDuration : 1;
267
-
268
- // Zero all weights, then set them based on current (and previous) state.
269
- // This guarantees total weight = 1.0 every frame — no bind-pose bleed.
270
- this.zeroAllWeights();
271
-
272
- if (this.transitioning) {
273
- this.transitionElapsed += dt;
274
- const alpha = Math.min(this.transitionElapsed / this.transitionDuration, 1);
275
-
276
- // Crossfade: outgoing * (1 - alpha) + incoming * alpha — sums to exactly 1.0
277
- this.setWeights(this.getStateWeights(this.previousState, parameters), 1 - alpha);
278
- this.setWeights(this.getStateWeights(this.currentState, parameters), alpha);
279
-
280
- if (alpha >= 1) {
281
- this.transitioning = false;
282
- }
283
- return;
284
- }
285
-
286
- // Not transitioning — current state at full weight
287
- this.setWeights(this.getStateWeights(this.currentState, parameters), 1);
288
-
289
- // Check transitions
290
- for (const transition of this.transitions) {
291
- // Match: exact state or wildcard
292
- if (transition.from !== '*' && transition.from !== this.currentState) continue;
293
- // A wildcard transition must never re-enter the state we're already in —
294
- // otherwise a wildcard whose condition stays true fires every single
295
- // frame (performTransition resets the action to time 0 each time), so
296
- // the state is "entered" over and over and its animation never advances
297
- // past frame 0. An explicit from:X→to:X self-transition is a deliberate
298
- // restart and is allowed to fire.
299
- if (transition.from === '*' && transition.to === this.currentState) continue;
300
-
301
- // Check exit time
302
- if (transition.exitTime !== undefined && normalizedTime < transition.exitTime) continue;
303
-
304
- // Check conditions
305
- if (
306
- transition.conditions &&
307
- !this.checkConditions(transition.conditions, parameters, triggers)
308
- ) {
309
- continue;
310
- }
311
-
312
- // Transition! Mark any trigger conditions as consumed so the graph
313
- // clears them after all layers have had a chance to react this frame.
314
- if (transition.conditions) {
315
- for (const cond of transition.conditions) {
316
- if (cond.op === 'trigger') consumed.add(cond.param);
317
- }
318
- }
319
- this.performTransition(transition, parameters);
320
- return;
321
- }
322
- }
323
-
324
- private checkConditions(
325
- conditions: TransitionCondition[],
326
- parameters: Map<string, number | boolean>,
327
- triggers: Set<string>,
328
- ): boolean {
329
- for (const cond of conditions) {
330
- if (cond.op === 'trigger') {
331
- if (!triggers.has(cond.param)) return false;
332
- continue;
333
- }
334
-
335
- const paramVal = parameters.get(cond.param);
336
- if (paramVal === undefined) return false;
337
-
338
- const a = Number(paramVal);
339
- const b = Number(cond.value ?? 0);
340
-
341
- switch (cond.op) {
342
- case '>':
343
- if (!(a > b)) return false;
344
- break;
345
- case '<':
346
- if (!(a < b)) return false;
347
- break;
348
- case '>=':
349
- if (!(a >= b)) return false;
350
- break;
351
- case '<=':
352
- if (!(a <= b)) return false;
353
- break;
354
- case '==':
355
- if (paramVal !== cond.value && a !== b) return false;
356
- break;
357
- case '!=':
358
- if (paramVal === cond.value || a === b) return false;
359
- break;
360
- }
361
- }
362
- return true;
363
- }
364
-
365
- private performTransition(transition: AnimTransition, parameters: Map<string, number | boolean>) {
366
- const toState = this.states.get(transition.to);
367
- if (!toState) return;
368
-
369
- this.previousState = this.currentState;
370
- this.currentState = transition.to;
371
- this.stateTime = 0;
372
- this.transitioning = true;
373
- this.transitionElapsed = 0;
374
- this.transitionDuration = transition.duration;
375
-
376
- // Reset incoming actions to time=0 so they start fresh.
377
- // No fadeIn/fadeOut — weights are managed explicitly in update().
378
- if (toState.clip) {
379
- const action = this.actionMap.get(toState.clip);
380
- if (action) {
381
- action.reset();
382
- action.play();
383
- }
384
- }
385
- if (toState.blendTree) {
386
- for (const child of toState.blendTree.children) {
387
- const action = this.actionMap.get(child.clip);
388
- if (action) {
389
- action.reset();
390
- action.play();
391
- }
392
- }
393
- }
394
-
395
- // Estimate state duration for exitTime calculations
396
- if (toState.clip) {
397
- const action = this.actionMap.get(toState.clip);
398
- this.stateDuration = action?.getClip().duration ?? 1;
399
- } else if (toState.blendTree) {
400
- const weights = evaluateBlendTree(toState.blendTree, parameters);
401
- const heaviest = weights.reduce((a, b) => (b.weight > a.weight ? b : a), weights[0]!);
402
- const action = this.actionMap.get(heaviest.clip);
403
- this.stateDuration = action?.getClip().duration ?? 1;
404
- }
405
- }
406
- }
@@ -1,28 +0,0 @@
1
- import type * as THREE from 'three';
2
- import type { AnimGraph } from './anim-graph';
3
-
4
- /**
5
- * Registry of active animation graphs, keyed by Object3D (the entity).
6
- *
7
- * AnimGraph wraps a THREE.AnimationMixer (a class instance), so it can't live in
8
- * a flat data store — we keep a simple Map<Object3D, AnimGraph> and update each
9
- * one every frame. Each runtime owns its own map (see createGameRuntime) so that
10
- * multiple concurrent runtimes never cross-contaminate each other's graphs.
11
- *
12
- * Usage:
13
- * const animGraphs: AnimGraphMap = new Map();
14
- * animGraphs.set(playerObject3D, new AnimGraph(mixer, data, clips));
15
- * // In system runner:
16
- * systems.add('animation', (dt) => animationSystem(animGraphs, dt));
17
- */
18
- export type AnimGraphMap = Map<THREE.Object3D, AnimGraph>;
19
-
20
- /**
21
- * Updates all active animation graphs.
22
- * Call this in the ANIMATION phase.
23
- */
24
- export function animationSystem(graphs: AnimGraphMap, dt: number) {
25
- for (const graph of graphs.values()) {
26
- graph.update(dt);
27
- }
28
- }