@vgai/engine 0.5.0 → 0.5.1

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 (538) hide show
  1. package/package.json +1 -1
  2. package/schemas/engine-capabilities.json +4 -4
  3. package/schemas/vgai-game.schema.json +2 -2
  4. package/src/adapter/authoring.ts +42 -0
  5. package/src/adapter/index.ts +3 -0
  6. package/src/adapter/ingest/overlay-apply.ts +50 -6
  7. package/src/adapter/ingest/scene-capture.ts +51 -2
  8. package/src/adapter/vgai-scene-game-adapter.ts +24 -0
  9. package/src/manifest/schema.ts +7 -3
  10. package/src/runtime/create-runtime.ts +97 -0
  11. package/src/runtime/game.ts +11 -1
  12. package/src/scene/asset-ref-check.ts +1 -1
  13. package/src/scene/scene-loader.ts +2 -2
  14. package/src/scene/user-data.ts +18 -0
  15. package/src/world3d-react/behavior.tsx +19 -11
  16. package/src/world3d-react/r3f-adapter.tsx +8 -0
  17. package/dist/adapter/adapter-surface.d.ts +0 -30
  18. package/dist/adapter/adapter-surface.d.ts.map +0 -1
  19. package/dist/adapter/adapter-surface.js +0 -18
  20. package/dist/adapter/authoring.d.ts +0 -461
  21. package/dist/adapter/authoring.d.ts.map +0 -1
  22. package/dist/adapter/authoring.js +0 -22
  23. package/dist/adapter/colyseus-networking-adapter.d.ts +0 -43
  24. package/dist/adapter/colyseus-networking-adapter.d.ts.map +0 -1
  25. package/dist/adapter/colyseus-networking-adapter.js +0 -38
  26. package/dist/adapter/first-party-systems.d.ts +0 -38
  27. package/dist/adapter/first-party-systems.d.ts.map +0 -1
  28. package/dist/adapter/first-party-systems.js +0 -77
  29. package/dist/adapter/game-adapter.d.ts +0 -133
  30. package/dist/adapter/game-adapter.d.ts.map +0 -1
  31. package/dist/adapter/game-adapter.js +0 -10
  32. package/dist/adapter/host-context.d.ts +0 -71
  33. package/dist/adapter/host-context.d.ts.map +0 -1
  34. package/dist/adapter/host-context.js +0 -16
  35. package/dist/adapter/index.d.ts +0 -22
  36. package/dist/adapter/index.d.ts.map +0 -1
  37. package/dist/adapter/index.js +0 -15
  38. package/dist/adapter/ingest/game-contract.d.ts +0 -53
  39. package/dist/adapter/ingest/game-contract.d.ts.map +0 -1
  40. package/dist/adapter/ingest/game-contract.js +0 -30
  41. package/dist/adapter/ingest/overlay-applier.d.ts +0 -118
  42. package/dist/adapter/ingest/overlay-applier.d.ts.map +0 -1
  43. package/dist/adapter/ingest/overlay-applier.js +0 -132
  44. package/dist/adapter/ingest/overlay-apply.d.ts +0 -60
  45. package/dist/adapter/ingest/overlay-apply.d.ts.map +0 -1
  46. package/dist/adapter/ingest/overlay-apply.js +0 -101
  47. package/dist/adapter/ingest/overlay-file.d.ts +0 -79
  48. package/dist/adapter/ingest/overlay-file.d.ts.map +0 -1
  49. package/dist/adapter/ingest/overlay-file.js +0 -66
  50. package/dist/adapter/ingest/overlay-report.d.ts +0 -113
  51. package/dist/adapter/ingest/overlay-report.d.ts.map +0 -1
  52. package/dist/adapter/ingest/overlay-report.js +0 -103
  53. package/dist/adapter/ingest/scene-capture.d.ts +0 -97
  54. package/dist/adapter/ingest/scene-capture.d.ts.map +0 -1
  55. package/dist/adapter/ingest/scene-capture.js +0 -248
  56. package/dist/adapter/ingest/upstream-pin.d.ts +0 -47
  57. package/dist/adapter/ingest/upstream-pin.d.ts.map +0 -1
  58. package/dist/adapter/ingest/upstream-pin.js +0 -50
  59. package/dist/adapter/loop-gate-report.d.ts +0 -34
  60. package/dist/adapter/loop-gate-report.d.ts.map +0 -1
  61. package/dist/adapter/loop-gate-report.js +0 -37
  62. package/dist/adapter/rapier-physics-adapter.d.ts +0 -12
  63. package/dist/adapter/rapier-physics-adapter.d.ts.map +0 -1
  64. package/dist/adapter/rapier-physics-adapter.js +0 -46
  65. package/dist/adapter/system-adapter.d.ts +0 -206
  66. package/dist/adapter/system-adapter.d.ts.map +0 -1
  67. package/dist/adapter/system-adapter.js +0 -13
  68. package/dist/adapter/transform.d.ts +0 -18
  69. package/dist/adapter/transform.d.ts.map +0 -1
  70. package/dist/adapter/transform.js +0 -1
  71. package/dist/adapter/vgai-scene-game-adapter.d.ts +0 -108
  72. package/dist/adapter/vgai-scene-game-adapter.d.ts.map +0 -1
  73. package/dist/adapter/vgai-scene-game-adapter.js +0 -762
  74. package/dist/ai/navigation.d.ts +0 -64
  75. package/dist/ai/navigation.d.ts.map +0 -1
  76. package/dist/ai/navigation.js +0 -133
  77. package/dist/animation/anim-graph-types.d.ts +0 -25
  78. package/dist/animation/anim-graph-types.d.ts.map +0 -1
  79. package/dist/animation/anim-graph-types.js +0 -1
  80. package/dist/animation/animation-clock.d.ts +0 -213
  81. package/dist/animation/animation-clock.d.ts.map +0 -1
  82. package/dist/animation/animation-clock.js +0 -301
  83. package/dist/animation/blend-node.d.ts +0 -22
  84. package/dist/animation/blend-node.d.ts.map +0 -1
  85. package/dist/animation/blend-node.js +0 -97
  86. package/dist/animation/camera-ownership.d.ts +0 -250
  87. package/dist/animation/camera-ownership.d.ts.map +0 -1
  88. package/dist/animation/camera-ownership.js +0 -169
  89. package/dist/animation/cinematic-cues.d.ts +0 -200
  90. package/dist/animation/cinematic-cues.d.ts.map +0 -1
  91. package/dist/animation/cinematic-cues.js +0 -213
  92. package/dist/animation/clip-map.d.ts +0 -12
  93. package/dist/animation/clip-map.d.ts.map +0 -1
  94. package/dist/animation/clip-map.js +0 -37
  95. package/dist/animation/gsap-registration.d.ts +0 -119
  96. package/dist/animation/gsap-registration.d.ts.map +0 -1
  97. package/dist/animation/gsap-registration.js +0 -92
  98. package/dist/animation/theatre-clock-binding.d.ts +0 -89
  99. package/dist/animation/theatre-clock-binding.d.ts.map +0 -1
  100. package/dist/animation/theatre-clock-binding.js +0 -29
  101. package/dist/animation/theatre-director.d.ts +0 -242
  102. package/dist/animation/theatre-director.d.ts.map +0 -1
  103. package/dist/animation/theatre-director.js +0 -235
  104. package/dist/animation/theatre-object-binding.d.ts +0 -305
  105. package/dist/animation/theatre-object-binding.d.ts.map +0 -1
  106. package/dist/animation/theatre-object-binding.js +0 -351
  107. package/dist/animation/xstate-animation-binding.d.ts +0 -56
  108. package/dist/animation/xstate-animation-binding.d.ts.map +0 -1
  109. package/dist/animation/xstate-animation-binding.js +0 -331
  110. package/dist/animation/xstate-animation-meta.d.ts +0 -266
  111. package/dist/animation/xstate-animation-meta.d.ts.map +0 -1
  112. package/dist/animation/xstate-animation-meta.js +0 -252
  113. package/dist/assets.d.ts +0 -26
  114. package/dist/assets.d.ts.map +0 -1
  115. package/dist/assets.js +0 -55
  116. package/dist/audio/index.d.ts +0 -4
  117. package/dist/audio/index.d.ts.map +0 -1
  118. package/dist/audio/index.js +0 -24
  119. package/dist/audio/tone-clock-binding.d.ts +0 -75
  120. package/dist/audio/tone-clock-binding.d.ts.map +0 -1
  121. package/dist/audio/tone-clock-binding.js +0 -29
  122. package/dist/audio/tone-context.d.ts +0 -114
  123. package/dist/audio/tone-context.d.ts.map +0 -1
  124. package/dist/audio/tone-context.js +0 -39
  125. package/dist/audio/tone-offline-render.d.ts +0 -90
  126. package/dist/audio/tone-offline-render.d.ts.map +0 -1
  127. package/dist/audio/tone-offline-render.js +0 -56
  128. package/dist/audio/wav-encode.d.ts +0 -38
  129. package/dist/audio/wav-encode.d.ts.map +0 -1
  130. package/dist/audio/wav-encode.js +0 -97
  131. package/dist/character/cloth-sim.d.ts +0 -179
  132. package/dist/character/cloth-sim.d.ts.map +0 -1
  133. package/dist/character/cloth-sim.js +0 -334
  134. package/dist/character/spring-chain.d.ts +0 -135
  135. package/dist/character/spring-chain.d.ts.map +0 -1
  136. package/dist/character/spring-chain.js +0 -165
  137. package/dist/core/game-loop.d.ts +0 -42
  138. package/dist/core/game-loop.d.ts.map +0 -1
  139. package/dist/core/game-loop.js +0 -167
  140. package/dist/core/seeded-random.d.ts +0 -69
  141. package/dist/core/seeded-random.d.ts.map +0 -1
  142. package/dist/core/seeded-random.js +0 -121
  143. package/dist/core/system-runner.d.ts +0 -120
  144. package/dist/core/system-runner.d.ts.map +0 -1
  145. package/dist/core/system-runner.js +0 -297
  146. package/dist/core/types.d.ts +0 -92
  147. package/dist/core/types.d.ts.map +0 -1
  148. package/dist/core/types.js +0 -25
  149. package/dist/data/data-asset.d.ts +0 -101
  150. package/dist/data/data-asset.d.ts.map +0 -1
  151. package/dist/data/data-asset.js +0 -122
  152. package/dist/data/data-check-core.d.ts +0 -110
  153. package/dist/data/data-check-core.d.ts.map +0 -1
  154. package/dist/data/data-check-core.js +0 -178
  155. package/dist/data/data-ref.d.ts +0 -79
  156. package/dist/data/data-ref.d.ts.map +0 -1
  157. package/dist/data/data-ref.js +0 -130
  158. package/dist/data/vite-plugin-data.d.ts +0 -79
  159. package/dist/data/vite-plugin-data.d.ts.map +0 -1
  160. package/dist/data/vite-plugin-data.js +0 -217
  161. package/dist/dev/console-bridge.d.ts +0 -22
  162. package/dist/dev/console-bridge.d.ts.map +0 -1
  163. package/dist/dev/console-bridge.js +0 -71
  164. package/dist/dev/debug-draw.d.ts +0 -24
  165. package/dist/dev/debug-draw.d.ts.map +0 -1
  166. package/dist/dev/debug-draw.js +0 -73
  167. package/dist/dev/logger.d.ts +0 -30
  168. package/dist/dev/logger.d.ts.map +0 -1
  169. package/dist/dev/logger.js +0 -90
  170. package/dist/dev/performance-profiler.d.ts +0 -60
  171. package/dist/dev/performance-profiler.d.ts.map +0 -1
  172. package/dist/dev/performance-profiler.js +0 -181
  173. package/dist/dev/webgl-gpu-timer.d.ts +0 -8
  174. package/dist/dev/webgl-gpu-timer.d.ts.map +0 -1
  175. package/dist/dev/webgl-gpu-timer.js +0 -52
  176. package/dist/ecs/component-manager.d.ts +0 -205
  177. package/dist/ecs/component-manager.d.ts.map +0 -1
  178. package/dist/ecs/component-manager.js +0 -706
  179. package/dist/ecs/game-component.d.ts +0 -146
  180. package/dist/ecs/game-component.d.ts.map +0 -1
  181. package/dist/ecs/game-component.js +0 -141
  182. package/dist/ecs/hmr-swap-report.d.ts +0 -53
  183. package/dist/ecs/hmr-swap-report.d.ts.map +0 -1
  184. package/dist/ecs/hmr-swap-report.js +0 -55
  185. package/dist/humanoid/bake.operation.d.ts +0 -119
  186. package/dist/humanoid/bake.operation.d.ts.map +0 -1
  187. package/dist/humanoid/bake.operation.js +0 -228
  188. package/dist/humanoid/body.d.ts +0 -101
  189. package/dist/humanoid/body.d.ts.map +0 -1
  190. package/dist/humanoid/body.js +0 -530
  191. package/dist/humanoid/clips.d.ts +0 -62
  192. package/dist/humanoid/clips.d.ts.map +0 -1
  193. package/dist/humanoid/clips.js +0 -121
  194. package/dist/humanoid/compose.d.ts +0 -75
  195. package/dist/humanoid/compose.d.ts.map +0 -1
  196. package/dist/humanoid/compose.js +0 -176
  197. package/dist/humanoid/generate.d.ts +0 -92
  198. package/dist/humanoid/generate.d.ts.map +0 -1
  199. package/dist/humanoid/generate.js +0 -124
  200. package/dist/humanoid/index.d.ts +0 -24
  201. package/dist/humanoid/index.d.ts.map +0 -1
  202. package/dist/humanoid/index.js +0 -18
  203. package/dist/humanoid/schema.d.ts +0 -35
  204. package/dist/humanoid/schema.d.ts.map +0 -1
  205. package/dist/humanoid/schema.js +0 -87
  206. package/dist/humanoid/skeleton.d.ts +0 -103
  207. package/dist/humanoid/skeleton.d.ts.map +0 -1
  208. package/dist/humanoid/skeleton.js +0 -289
  209. package/dist/index.d.ts +0 -37
  210. package/dist/index.d.ts.map +0 -1
  211. package/dist/index.js +0 -30
  212. package/dist/input/input-manager.d.ts +0 -945
  213. package/dist/input/input-manager.d.ts.map +0 -1
  214. package/dist/input/input-manager.js +0 -2207
  215. package/dist/input/input-types.d.ts +0 -174
  216. package/dist/input/input-types.d.ts.map +0 -1
  217. package/dist/input/input-types.js +0 -1
  218. package/dist/input/prompt-labels.d.ts +0 -21
  219. package/dist/input/prompt-labels.d.ts.map +0 -1
  220. package/dist/input/prompt-labels.js +0 -121
  221. package/dist/input/rebind-controller.d.ts +0 -59
  222. package/dist/input/rebind-controller.d.ts.map +0 -1
  223. package/dist/input/rebind-controller.js +0 -85
  224. package/dist/input/schema.d.ts +0 -16
  225. package/dist/input/schema.d.ts.map +0 -1
  226. package/dist/input/schema.js +0 -228
  227. package/dist/loader.d.ts +0 -43
  228. package/dist/loader.d.ts.map +0 -1
  229. package/dist/loader.js +0 -59
  230. package/dist/manifest/index.d.ts +0 -5
  231. package/dist/manifest/index.d.ts.map +0 -1
  232. package/dist/manifest/index.js +0 -8
  233. package/dist/manifest/load-file.d.ts +0 -4
  234. package/dist/manifest/load-file.d.ts.map +0 -1
  235. package/dist/manifest/load-file.js +0 -14
  236. package/dist/manifest/load.d.ts +0 -144
  237. package/dist/manifest/load.d.ts.map +0 -1
  238. package/dist/manifest/load.js +0 -273
  239. package/dist/manifest/schema.d.ts +0 -230
  240. package/dist/manifest/schema.d.ts.map +0 -1
  241. package/dist/manifest/schema.js +0 -394
  242. package/dist/physics/collision-system.d.ts +0 -41
  243. package/dist/physics/collision-system.d.ts.map +0 -1
  244. package/dist/physics/collision-system.js +0 -64
  245. package/dist/physics/physics-registry.d.ts +0 -45
  246. package/dist/physics/physics-registry.d.ts.map +0 -1
  247. package/dist/physics/physics-registry.js +0 -65
  248. package/dist/physics/transform-writer.d.ts +0 -16
  249. package/dist/physics/transform-writer.d.ts.map +0 -1
  250. package/dist/physics/transform-writer.js +0 -38
  251. package/dist/physics/trigger-dispatch.d.ts +0 -24
  252. package/dist/physics/trigger-dispatch.d.ts.map +0 -1
  253. package/dist/physics/trigger-dispatch.js +0 -80
  254. package/dist/react/game-state.d.ts +0 -156
  255. package/dist/react/game-state.d.ts.map +0 -1
  256. package/dist/react/game-state.js +0 -222
  257. package/dist/react/root-adapter.d.ts +0 -11
  258. package/dist/react/root-adapter.d.ts.map +0 -1
  259. package/dist/react/root-adapter.js +0 -41
  260. package/dist/react/unmanaged-root-detector.d.ts +0 -12
  261. package/dist/react/unmanaged-root-detector.d.ts.map +0 -1
  262. package/dist/react/unmanaged-root-detector.js +0 -45
  263. package/dist/react/use-data.d.ts +0 -60
  264. package/dist/react/use-data.d.ts.map +0 -1
  265. package/dist/react/use-data.js +0 -101
  266. package/dist/react/use-selection.d.ts +0 -75
  267. package/dist/react/use-selection.d.ts.map +0 -1
  268. package/dist/react/use-selection.js +0 -90
  269. package/dist/render/auto-batcher.d.ts +0 -34
  270. package/dist/render/auto-batcher.d.ts.map +0 -1
  271. package/dist/render/auto-batcher.js +0 -140
  272. package/dist/render/render-batch-system.d.ts +0 -33
  273. package/dist/render/render-batch-system.d.ts.map +0 -1
  274. package/dist/render/render-batch-system.js +0 -230
  275. package/dist/render/render-features.d.ts +0 -47
  276. package/dist/render/render-features.d.ts.map +0 -1
  277. package/dist/render/render-features.js +0 -105
  278. package/dist/render/render-settings.d.ts +0 -36
  279. package/dist/render/render-settings.d.ts.map +0 -1
  280. package/dist/render/render-settings.js +0 -51
  281. package/dist/runtime/create-runtime.d.ts +0 -249
  282. package/dist/runtime/create-runtime.d.ts.map +0 -1
  283. package/dist/runtime/create-runtime.js +0 -641
  284. package/dist/runtime/debug-bridge.d.ts +0 -257
  285. package/dist/runtime/debug-bridge.d.ts.map +0 -1
  286. package/dist/runtime/debug-bridge.js +0 -224
  287. package/dist/runtime/debug-registry.d.ts +0 -288
  288. package/dist/runtime/debug-registry.d.ts.map +0 -1
  289. package/dist/runtime/debug-registry.js +0 -513
  290. package/dist/runtime/frame-selector-cache.d.ts +0 -41
  291. package/dist/runtime/frame-selector-cache.d.ts.map +0 -1
  292. package/dist/runtime/frame-selector-cache.js +0 -65
  293. package/dist/runtime/game.d.ts +0 -496
  294. package/dist/runtime/game.d.ts.map +0 -1
  295. package/dist/runtime/game.js +0 -741
  296. package/dist/runtime/gameplay-rng-trap.d.ts +0 -48
  297. package/dist/runtime/gameplay-rng-trap.d.ts.map +0 -1
  298. package/dist/runtime/gameplay-rng-trap.js +0 -96
  299. package/dist/runtime/input-router.d.ts +0 -78
  300. package/dist/runtime/input-router.d.ts.map +0 -1
  301. package/dist/runtime/input-router.js +0 -171
  302. package/dist/runtime/mount-game.d.ts +0 -129
  303. package/dist/runtime/mount-game.d.ts.map +0 -1
  304. package/dist/runtime/mount-game.js +0 -152
  305. package/dist/runtime/mount-manifest.d.ts +0 -173
  306. package/dist/runtime/mount-manifest.d.ts.map +0 -1
  307. package/dist/runtime/mount-manifest.js +0 -297
  308. package/dist/runtime/render-audio-control.d.ts +0 -110
  309. package/dist/runtime/render-audio-control.d.ts.map +0 -1
  310. package/dist/runtime/render-audio-control.js +0 -111
  311. package/dist/runtime/render-control.d.ts +0 -291
  312. package/dist/runtime/render-control.d.ts.map +0 -1
  313. package/dist/runtime/render-control.js +0 -264
  314. package/dist/runtime/render-seed.d.ts +0 -57
  315. package/dist/runtime/render-seed.d.ts.map +0 -1
  316. package/dist/runtime/render-seed.js +0 -74
  317. package/dist/runtime/state-bridge.d.ts +0 -61
  318. package/dist/runtime/state-bridge.d.ts.map +0 -1
  319. package/dist/runtime/state-bridge.js +0 -63
  320. package/dist/runtime/types.d.ts +0 -253
  321. package/dist/runtime/types.d.ts.map +0 -1
  322. package/dist/runtime/types.js +0 -1
  323. package/dist/scene/asset-loaders.d.ts +0 -79
  324. package/dist/scene/asset-loaders.d.ts.map +0 -1
  325. package/dist/scene/asset-loaders.js +0 -141
  326. package/dist/scene/asset-paths.d.ts +0 -11
  327. package/dist/scene/asset-paths.d.ts.map +0 -1
  328. package/dist/scene/asset-paths.js +0 -108
  329. package/dist/scene/asset-ref-check.d.ts +0 -88
  330. package/dist/scene/asset-ref-check.d.ts.map +0 -1
  331. package/dist/scene/asset-ref-check.js +0 -214
  332. package/dist/scene/asset-registry.d.ts +0 -38
  333. package/dist/scene/asset-registry.d.ts.map +0 -1
  334. package/dist/scene/asset-registry.js +0 -66
  335. package/dist/scene/collider-dimensions.d.ts +0 -63
  336. package/dist/scene/collider-dimensions.d.ts.map +0 -1
  337. package/dist/scene/collider-dimensions.js +0 -98
  338. package/dist/scene/component-registry.d.ts +0 -22
  339. package/dist/scene/component-registry.d.ts.map +0 -1
  340. package/dist/scene/component-registry.js +0 -37
  341. package/dist/scene/defaults.d.ts +0 -252
  342. package/dist/scene/defaults.d.ts.map +0 -1
  343. package/dist/scene/defaults.js +0 -151
  344. package/dist/scene/geometries/index.d.ts +0 -8
  345. package/dist/scene/geometries/index.d.ts.map +0 -1
  346. package/dist/scene/geometries/index.js +0 -7
  347. package/dist/scene/geometries/terrain.d.ts +0 -2
  348. package/dist/scene/geometries/terrain.d.ts.map +0 -1
  349. package/dist/scene/geometries/terrain.js +0 -37
  350. package/dist/scene/geometry-registry.d.ts +0 -24
  351. package/dist/scene/geometry-registry.d.ts.map +0 -1
  352. package/dist/scene/geometry-registry.js +0 -20
  353. package/dist/scene/instance-registry.d.ts +0 -36
  354. package/dist/scene/instance-registry.d.ts.map +0 -1
  355. package/dist/scene/instance-registry.js +0 -55
  356. package/dist/scene/instancers/grid.d.ts +0 -2
  357. package/dist/scene/instancers/grid.d.ts.map +0 -1
  358. package/dist/scene/instancers/grid.js +0 -36
  359. package/dist/scene/instancers/index.d.ts +0 -8
  360. package/dist/scene/instancers/index.d.ts.map +0 -1
  361. package/dist/scene/instancers/index.js +0 -7
  362. package/dist/scene/light-camera-factory.d.ts +0 -23
  363. package/dist/scene/light-camera-factory.d.ts.map +0 -1
  364. package/dist/scene/light-camera-factory.js +0 -68
  365. package/dist/scene/material-factory.d.ts +0 -17
  366. package/dist/scene/material-factory.d.ts.map +0 -1
  367. package/dist/scene/material-factory.js +0 -197
  368. package/dist/scene/material-registry.d.ts +0 -40
  369. package/dist/scene/material-registry.d.ts.map +0 -1
  370. package/dist/scene/material-registry.js +0 -44
  371. package/dist/scene/materials/index.d.ts +0 -8
  372. package/dist/scene/materials/index.d.ts.map +0 -1
  373. package/dist/scene/materials/index.js +0 -7
  374. package/dist/scene/materials/water.d.ts +0 -2
  375. package/dist/scene/materials/water.d.ts.map +0 -1
  376. package/dist/scene/materials/water.js +0 -54
  377. package/dist/scene/parse.d.ts +0 -23
  378. package/dist/scene/parse.d.ts.map +0 -1
  379. package/dist/scene/parse.js +0 -179
  380. package/dist/scene/particles-factory.d.ts +0 -33
  381. package/dist/scene/particles-factory.d.ts.map +0 -1
  382. package/dist/scene/particles-factory.js +0 -282
  383. package/dist/scene/scene-apply.d.ts +0 -109
  384. package/dist/scene/scene-apply.d.ts.map +0 -1
  385. package/dist/scene/scene-apply.js +0 -370
  386. package/dist/scene/scene-diff-schema.d.ts +0 -285
  387. package/dist/scene/scene-diff-schema.d.ts.map +0 -1
  388. package/dist/scene/scene-diff-schema.js +0 -92
  389. package/dist/scene/scene-diff-types.d.ts +0 -40
  390. package/dist/scene/scene-diff-types.d.ts.map +0 -1
  391. package/dist/scene/scene-diff-types.js +0 -14
  392. package/dist/scene/scene-loader.d.ts +0 -167
  393. package/dist/scene/scene-loader.d.ts.map +0 -1
  394. package/dist/scene/scene-loader.js +0 -1211
  395. package/dist/scene/scene-query.d.ts +0 -11
  396. package/dist/scene/scene-query.d.ts.map +0 -1
  397. package/dist/scene/scene-query.js +0 -63
  398. package/dist/scene/scene-types.d.ts +0 -10
  399. package/dist/scene/scene-types.d.ts.map +0 -1
  400. package/dist/scene/scene-types.js +0 -8
  401. package/dist/scene/scene-version.d.ts +0 -26
  402. package/dist/scene/scene-version.d.ts.map +0 -1
  403. package/dist/scene/scene-version.js +0 -34
  404. package/dist/scene/schema/animation.d.ts +0 -8
  405. package/dist/scene/schema/animation.d.ts.map +0 -1
  406. package/dist/scene/schema/animation.js +0 -42
  407. package/dist/scene/schema/audio.d.ts +0 -13
  408. package/dist/scene/schema/audio.d.ts.map +0 -1
  409. package/dist/scene/schema/audio.js +0 -22
  410. package/dist/scene/schema/camera.d.ts +0 -28
  411. package/dist/scene/schema/camera.d.ts.map +0 -1
  412. package/dist/scene/schema/camera.js +0 -17
  413. package/dist/scene/schema/collider.d.ts +0 -40
  414. package/dist/scene/schema/collider.d.ts.map +0 -1
  415. package/dist/scene/schema/collider.js +0 -55
  416. package/dist/scene/schema/entity-ref.d.ts +0 -31
  417. package/dist/scene/schema/entity-ref.d.ts.map +0 -1
  418. package/dist/scene/schema/entity-ref.js +0 -61
  419. package/dist/scene/schema/entity.d.ts +0 -1036
  420. package/dist/scene/schema/entity.d.ts.map +0 -1
  421. package/dist/scene/schema/entity.js +0 -153
  422. package/dist/scene/schema/environment.d.ts +0 -425
  423. package/dist/scene/schema/environment.d.ts.map +0 -1
  424. package/dist/scene/schema/environment.js +0 -357
  425. package/dist/scene/schema/index.d.ts +0 -37
  426. package/dist/scene/schema/index.d.ts.map +0 -1
  427. package/dist/scene/schema/index.js +0 -19
  428. package/dist/scene/schema/instances.d.ts +0 -14
  429. package/dist/scene/schema/instances.d.ts.map +0 -1
  430. package/dist/scene/schema/instances.js +0 -28
  431. package/dist/scene/schema/joint.d.ts +0 -23
  432. package/dist/scene/schema/joint.d.ts.map +0 -1
  433. package/dist/scene/schema/joint.js +0 -23
  434. package/dist/scene/schema/light.d.ts +0 -38
  435. package/dist/scene/schema/light.d.ts.map +0 -1
  436. package/dist/scene/schema/light.js +0 -26
  437. package/dist/scene/schema/material.d.ts +0 -199
  438. package/dist/scene/schema/material.d.ts.map +0 -1
  439. package/dist/scene/schema/material.js +0 -103
  440. package/dist/scene/schema/mesh.d.ts +0 -48
  441. package/dist/scene/schema/mesh.d.ts.map +0 -1
  442. package/dist/scene/schema/mesh.js +0 -82
  443. package/dist/scene/schema/particles.d.ts +0 -2178
  444. package/dist/scene/schema/particles.d.ts.map +0 -1
  445. package/dist/scene/schema/particles.js +0 -321
  446. package/dist/scene/schema/physics.d.ts +0 -56
  447. package/dist/scene/schema/physics.d.ts.map +0 -1
  448. package/dist/scene/schema/physics.js +0 -37
  449. package/dist/scene/schema/scene-file.d.ts +0 -303
  450. package/dist/scene/schema/scene-file.d.ts.map +0 -1
  451. package/dist/scene/schema/scene-file.js +0 -256
  452. package/dist/scene/schema/shadow.d.ts +0 -28
  453. package/dist/scene/schema/shadow.d.ts.map +0 -1
  454. package/dist/scene/schema/shadow.js +0 -20
  455. package/dist/scene/schema/spline.d.ts +0 -25
  456. package/dist/scene/schema/spline.d.ts.map +0 -1
  457. package/dist/scene/schema/spline.js +0 -15
  458. package/dist/scene/schema/tuples.d.ts +0 -12
  459. package/dist/scene/schema/tuples.d.ts.map +0 -1
  460. package/dist/scene/schema/tuples.js +0 -14
  461. package/dist/scene/user-data.d.ts +0 -185
  462. package/dist/scene/user-data.d.ts.map +0 -1
  463. package/dist/scene/user-data.js +0 -144
  464. package/dist/setup/setup-audio.d.ts +0 -20
  465. package/dist/setup/setup-audio.d.ts.map +0 -1
  466. package/dist/setup/setup-audio.js +0 -41
  467. package/dist/setup/setup-particles.d.ts +0 -17
  468. package/dist/setup/setup-particles.d.ts.map +0 -1
  469. package/dist/setup/setup-particles.js +0 -16
  470. package/dist/setup/setup-physics.d.ts +0 -25
  471. package/dist/setup/setup-physics.d.ts.map +0 -1
  472. package/dist/setup/setup-physics.js +0 -51
  473. package/dist/setup/setup-renderer.d.ts +0 -69
  474. package/dist/setup/setup-renderer.d.ts.map +0 -1
  475. package/dist/setup/setup-renderer.js +0 -363
  476. package/dist/tools/define-tool.d.ts +0 -130
  477. package/dist/tools/define-tool.d.ts.map +0 -1
  478. package/dist/tools/define-tool.js +0 -96
  479. package/dist/world2d/authoring-2d.d.ts +0 -80
  480. package/dist/world2d/authoring-2d.d.ts.map +0 -1
  481. package/dist/world2d/authoring-2d.js +0 -195
  482. package/dist/world2d/capture-to-scene2d.d.ts +0 -5
  483. package/dist/world2d/capture-to-scene2d.d.ts.map +0 -1
  484. package/dist/world2d/capture-to-scene2d.js +0 -49
  485. package/dist/world2d/collision-2d.d.ts +0 -52
  486. package/dist/world2d/collision-2d.d.ts.map +0 -1
  487. package/dist/world2d/collision-2d.js +0 -70
  488. package/dist/world2d/components-2d.d.ts +0 -47
  489. package/dist/world2d/components-2d.d.ts.map +0 -1
  490. package/dist/world2d/components-2d.js +0 -77
  491. package/dist/world2d/index.d.ts +0 -34
  492. package/dist/world2d/index.d.ts.map +0 -1
  493. package/dist/world2d/index.js +0 -32
  494. package/dist/world2d/ingest-iframe-2d.d.ts +0 -82
  495. package/dist/world2d/ingest-iframe-2d.d.ts.map +0 -1
  496. package/dist/world2d/ingest-iframe-2d.js +0 -166
  497. package/dist/world2d/ingest2d.d.ts +0 -97
  498. package/dist/world2d/ingest2d.d.ts.map +0 -1
  499. package/dist/world2d/ingest2d.js +0 -40
  500. package/dist/world2d/physics2d-registry.d.ts +0 -24
  501. package/dist/world2d/physics2d-registry.d.ts.map +0 -1
  502. package/dist/world2d/physics2d-registry.js +0 -38
  503. package/dist/world2d/pixi-game-adapter.d.ts +0 -107
  504. package/dist/world2d/pixi-game-adapter.d.ts.map +0 -1
  505. package/dist/world2d/pixi-game-adapter.js +0 -210
  506. package/dist/world2d/pixi-surface.d.ts +0 -39
  507. package/dist/world2d/pixi-surface.d.ts.map +0 -1
  508. package/dist/world2d/pixi-surface.js +0 -47
  509. package/dist/world2d/scene-capture-2d.d.ts +0 -43
  510. package/dist/world2d/scene-capture-2d.d.ts.map +0 -1
  511. package/dist/world2d/scene-capture-2d.js +0 -92
  512. package/dist/world2d/scene2d-loader.d.ts +0 -27
  513. package/dist/world2d/scene2d-loader.d.ts.map +0 -1
  514. package/dist/world2d/scene2d-loader.js +0 -275
  515. package/dist/world2d/schema/entity2d.d.ts +0 -102
  516. package/dist/world2d/schema/entity2d.d.ts.map +0 -1
  517. package/dist/world2d/schema/entity2d.js +0 -119
  518. package/dist/world2d/schema/physics2d.d.ts +0 -46
  519. package/dist/world2d/schema/physics2d.d.ts.map +0 -1
  520. package/dist/world2d/schema/physics2d.js +0 -45
  521. package/dist/world2d/schema/sprite.d.ts +0 -42
  522. package/dist/world2d/schema/sprite.d.ts.map +0 -1
  523. package/dist/world2d/schema/sprite.js +0 -63
  524. package/dist/world2d/schema/tilemap.d.ts +0 -15
  525. package/dist/world2d/schema/tilemap.d.ts.map +0 -1
  526. package/dist/world2d/schema/tilemap.js +0 -19
  527. package/dist/world2d/schema/tuples2d.d.ts +0 -20
  528. package/dist/world2d/schema/tuples2d.d.ts.map +0 -1
  529. package/dist/world2d/schema/tuples2d.js +0 -19
  530. package/dist/world2d/system-adapters-2d.d.ts +0 -16
  531. package/dist/world2d/system-adapters-2d.d.ts.map +0 -1
  532. package/dist/world2d/system-adapters-2d.js +0 -37
  533. package/dist/world2d/transform-writer-2d.d.ts +0 -16
  534. package/dist/world2d/transform-writer-2d.d.ts.map +0 -1
  535. package/dist/world2d/transform-writer-2d.js +0 -22
  536. package/dist/world2d/types.d.ts +0 -59
  537. package/dist/world2d/types.d.ts.map +0 -1
  538. package/dist/world2d/types.js +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"camera-ownership.d.ts","sourceRoot":"","sources":["../../src/animation/camera-ownership.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAwB,MAAM,mBAAmB,CAAC;AAC9E,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAErE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0KG;AAEH,4EAA4E;AAC5E,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,QAAQ,GAAG,qBAAqB,CAAC;AAE/E,qEAAqE;AACrE,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC;IACjC,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC;IACtC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,2GAA2G;AAC3G,qBAAa,oBAAqB,SAAQ,KAAK;IAG3C,QAAQ,CAAC,OAAO,EAAE,MAAM;gBADxB,OAAO,EAAE,MAAM,EACN,OAAO,EAAE,MAAM;CAK3B;AAED,kGAAkG;AAClG,wBAAgB,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,iBAAiB,GAAG,UAAU,CAQvE;AAED,2EAA2E;AAC3E,wBAAgB,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,iBAAiB,EAAE,IAAI,EAAE,UAAU,GAAG,IAAI,CAOjF;AAED,6EAA6E;AAC7E,wBAAgB,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,GAAG,UAAU,CAQhF;AAqBD,MAAM,WAAW,0BAA0B;IACzC,4GAA4G;IAC5G,MAAM,CAAC,EAAE,mBAAmB,CAAC;CAC9B;AAED,MAAM,WAAW,6BAA6B;IAC5C;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,4BAA4B;IAC3C,yHAAyH;IACzH,UAAU,EAAE,KAAK,CAAC,iBAAiB,CAAC;IACpC;;;;;OAKG;IACH,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAC3D,oEAAoE;IACpE,KAAK,EAAE,cAAc,CAAC;IACtB,oGAAoG;IACpG,aAAa,CAAC,EAAE,mBAAmB,CAAC;IACpC,oGAAoG;IACpG,KAAK,CAAC,EAAE,eAAe,CAAC;CACzB;AAED,MAAM,WAAW,qBAAqB;IACpC,yJAAyJ;IACzJ,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,0BAA0B,GAAG,IAAI,CAAC;IAClE,kHAAkH;IAClH,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9C,yHAAyH;IACzH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACtE,iHAAiH;IACjH,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,0BAA0B,GAAG,IAAI,CAAC;IAC7E,yGAAyG;IACzG,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,6BAA6B,GAAG,IAAI,CAAC;IACxE,qEAAqE;IACrE,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IAClC,kFAAkF;IAClF,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,sHAAsH;IACtH,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,4BAA4B,GACpC,qBAAqB,CA6JvB"}
@@ -1,169 +0,0 @@
1
- import * as THREE from 'three';
2
- /** Thrown on an ownership-stack rule violation (not-current-owner, unknown camera key, duplicate take). */
3
- export class CameraOwnershipError extends Error {
4
- ownerId;
5
- constructor(message, ownerId) {
6
- super(message);
7
- this.ownerId = ownerId;
8
- this.name = 'CameraOwnershipError';
9
- }
10
- }
11
- /** Snapshot a camera's full pose (position/quaternion cloned — never aliases the live object). */
12
- export function capturePose(camera) {
13
- return {
14
- position: camera.position.clone(),
15
- quaternion: camera.quaternion.clone(),
16
- fov: camera.fov,
17
- near: camera.near,
18
- far: camera.far,
19
- };
20
- }
21
- /** Write a captured pose onto a camera, updating its projection matrix. */
22
- export function applyPose(camera, pose) {
23
- camera.position.copy(pose.position);
24
- camera.quaternion.copy(pose.quaternion);
25
- camera.fov = pose.fov;
26
- camera.near = pose.near;
27
- camera.far = pose.far;
28
- camera.updateProjectionMatrix();
29
- }
30
- /** Position LERP + quaternion SLERP + fov/near/far LERP, `t` in `[0, 1]`. */
31
- export function lerpPose(from, to, t) {
32
- return {
33
- position: from.position.clone().lerp(to.position, t),
34
- quaternion: from.quaternion.clone().slerp(to.quaternion, t),
35
- fov: THREE.MathUtils.lerp(from.fov, to.fov, t),
36
- near: THREE.MathUtils.lerp(from.near, to.near, t),
37
- far: THREE.MathUtils.lerp(from.far, to.far, t),
38
- };
39
- }
40
- /**
41
- * Build a camera-ownership system bound to `clock`. See the module doc
42
- * comment for the full ownership-stack, cut/blend, and restore-policy
43
- * contract.
44
- */
45
- export function createCameraOwnershipSystem(options) {
46
- const { liveCamera, cameras, clock } = options;
47
- const defaultPolicy = options.defaultPolicy ?? 'restore';
48
- const phase = options.phase ?? 'render';
49
- const stack = [];
50
- let disposed = false;
51
- function requireNotDisposed(action) {
52
- if (disposed) {
53
- throw new CameraOwnershipError(`[camera-ownership] ${action}: system has been disposed`, '');
54
- }
55
- }
56
- function requireSourceCamera(cameraKey, action) {
57
- const camera = cameras[cameraKey];
58
- if (!camera) {
59
- throw new CameraOwnershipError(`[camera-ownership] ${action}: no registered camera for key "${cameraKey}"`, cameraKey);
60
- }
61
- return camera;
62
- }
63
- function requireTopOwner(ownerId, action) {
64
- const top = stack[stack.length - 1];
65
- if (!top) {
66
- throw new CameraOwnershipError(`[camera-ownership] ${action}: "${ownerId}" is not the current owner (ownership stack is empty)`, ownerId);
67
- }
68
- if (top.ownerId !== ownerId) {
69
- throw new CameraOwnershipError(`[camera-ownership] ${action}: "${ownerId}" is not the current owner (current owner is "${top.ownerId}")`, ownerId);
70
- }
71
- return top;
72
- }
73
- /**
74
- * Apply a frame's CURRENT state to `liveCamera` — a pure function of
75
- * `clock.time` and the fixed `FrameState` record (see the module doc's
76
- * "one unified transition model"). Never mutates `frame.state`.
77
- */
78
- function evaluateFrame(frame) {
79
- const state = frame.state;
80
- if (!state)
81
- return;
82
- const targetPose = capturePose(requireSourceCamera(state.targetKey, 'evaluate'));
83
- const t = state.durationSeconds <= 0
84
- ? 1
85
- : Math.min(Math.max((clock.time - state.startTime) / state.durationSeconds, 0), 1);
86
- applyPose(liveCamera, t >= 1 ? targetPose : lerpPose(state.fromPose, targetPose, t));
87
- }
88
- function beginTransition(ownerId, cameraKey, durationSeconds) {
89
- const frame = requireTopOwner(ownerId, 'cut/blend');
90
- requireSourceCamera(cameraKey, 'cut/blend'); // validate before mutating frame state
91
- frame.state = {
92
- targetKey: cameraKey,
93
- fromPose: capturePose(liveCamera),
94
- startTime: clock.time,
95
- durationSeconds,
96
- };
97
- // Apply immediately so direct (non-clock-crossing-sourced) calls are
98
- // visible right away; the per-crossing evaluator below re-applies the
99
- // same result on every subsequent crossing (idempotent when called
100
- // twice within the same crossing — e.g. once here, once from the D4
101
- // hook's own 'preRender'-phase call site, once more from this module's
102
- // later 'render'-phase evaluator).
103
- evaluateFrame(frame);
104
- }
105
- function releaseFrame(frame, completed) {
106
- const shouldRetain = frame.policy === 'retain' || (frame.policy === 'retain-if-completed' && completed);
107
- if (!shouldRetain) {
108
- applyPose(liveCamera, frame.restorePose);
109
- }
110
- }
111
- const handle = clock.subscribe(phase, () => {
112
- const top = stack[stack.length - 1];
113
- if (top)
114
- evaluateFrame(top);
115
- });
116
- return {
117
- take(ownerId, takeOptions = {}) {
118
- requireNotDisposed('take');
119
- if (stack.some((frame) => frame.ownerId === ownerId)) {
120
- throw new CameraOwnershipError(`[camera-ownership] take: "${ownerId}" is already on the ownership stack`, ownerId);
121
- }
122
- stack.push({
123
- ownerId,
124
- policy: takeOptions.policy ?? defaultPolicy,
125
- restorePose: capturePose(liveCamera),
126
- state: undefined,
127
- });
128
- },
129
- cut(ownerId, cameraKey) {
130
- requireNotDisposed('cut');
131
- beginTransition(ownerId, cameraKey, 0);
132
- },
133
- blend(ownerId, cameraKey, blendSeconds) {
134
- requireNotDisposed('blend');
135
- if (!Number.isFinite(blendSeconds) || blendSeconds < 0) {
136
- throw new CameraOwnershipError(`[camera-ownership] blend: blendSeconds must be a finite number >= 0, got ${blendSeconds}`, ownerId);
137
- }
138
- beginTransition(ownerId, cameraKey, blendSeconds);
139
- },
140
- applyDirectorEvent(ownerId, event) {
141
- requireNotDisposed('applyDirectorEvent');
142
- beginTransition(ownerId, event.cameraKey, event.blendSeconds);
143
- },
144
- release(ownerId, releaseOptions = {}) {
145
- requireNotDisposed('release');
146
- const top = requireTopOwner(ownerId, 'release');
147
- stack.pop();
148
- releaseFrame(top, releaseOptions.completed ?? false);
149
- },
150
- isOwner(ownerId) {
151
- const top = stack[stack.length - 1];
152
- return !!top && top.ownerId === ownerId;
153
- },
154
- get depth() {
155
- return stack.length;
156
- },
157
- dispose() {
158
- if (disposed)
159
- return;
160
- disposed = true;
161
- while (stack.length > 0) {
162
- const top = stack.pop();
163
- if (top)
164
- releaseFrame(top, false);
165
- }
166
- handle.dispose();
167
- },
168
- };
169
- }
@@ -1,200 +0,0 @@
1
- import type { SystemPhaseName } from '../core/types';
2
- import type { AnimationClock, ClockCrossing } from './animation-clock';
3
- /**
4
- * D5 — Cinematic Cues (spec §10 D5, §5.4, §3.2).
5
- *
6
- * `CinematicCue` is the deliberately small VGAI semantic for "gameplay
7
- * consequences of cinematic time" (spec §3.2: "Theatre carries
8
- * visual/directorial values; ordinary TypeScript cues carry gameplay
9
- * consequences"). Cues live ALONGSIDE Theatre (`theatre-clock-binding.ts`,
10
- * D2) — both are driven by the same canonical `AnimationClock`, but a cue
11
- * is ordinary TypeScript with a `run`/`reverse` function, never a second
12
- * property-animation format and never serialized executable code into
13
- * Theatre state (spec §5.4).
14
- *
15
- * ## Fire-once, built on the clock's half-open interval convention
16
- *
17
- * The clock documents (see `ClockInterval` in `animation-clock.ts`) that a
18
- * time `t` is CROSSED by a forward interval iff `t > from && t <= to`, and
19
- * by a reverse interval iff `t < from && t >= to`. This module uses exactly
20
- * that test (`crossesForward`/`crossesReverse` below) and nothing else to
21
- * decide "did this crossing sweep past cue.time" — never a naive comparison
22
- * of `previousTime`/`currentTime`, which is ambiguous across a loop wrap
23
- * (one `ClockCrossing` can carry 2+ intervals, one per lap segment; see the
24
- * clock's loop-wrap tests). Because a repeated `seek()` to the same time
25
- * re-asserts a ZERO-LENGTH interval (`from === to`), and the half-open test
26
- * never matches a zero-length interval, a cue naturally does not re-fire on
27
- * a repeated seek to the same `t` with no extra bookkeeping required.
28
- *
29
- * ## Sticky fire-once state + explicit re-arm ("resetsOnLoop"/"restart")
30
- *
31
- * Beyond that per-crossing test, each cue additionally tracks whether it
32
- * has EVER fired forward/reverse ("sticky" state, `CueState` below). Once
33
- * fired, a cue does not fire again from ordinary play/seek traffic — this
34
- * is what makes a one-shot story beat like `spawn-enemy` safe to scrub
35
- * across repeatedly in an editor without re-triggering. Two things
36
- * explicitly re-arm (clear) that sticky state:
37
- *
38
- * - a loop-wrapping crossing (`crossing.looped === true`, which — per the
39
- * clock's own contract — only `advance()` can ever produce; `seek()`
40
- * always reports `looped: false`) re-arms only cues with
41
- * `resetsOnLoop: true`, once per lap boundary actually swept (so a
42
- * single giant multi-lap `advance()` correctly re-fires a per-lap cue
43
- * once per lap, not just once for the whole call);
44
- * - `CueRunner.reset()` unconditionally re-arms EVERY cue — this is the
45
- * "restart" policy: the intended call when a cinematic explicitly
46
- * restarts from the top and cues should be able to replay.
47
- *
48
- * ## Seek vs. play ("firesDuringSeek")
49
- *
50
- * `AnimationClock.seek()` and `AnimationClock.advance()` both funnel
51
- * through the same `ClockCrossing` shape — the clock does not itself tag a
52
- * crossing with which method produced it (that distinction is deliberately
53
- * NOT added to the D1 clock; see the D1 follow-up note in
54
- * `animation-clock.ts`, which stays scoped to the epsilon-clamp fix only).
55
- * This module makes the distinction its own responsibility: drive the clock
56
- * through `CueRunner.seek(t)` / `CueRunner.advance(dt)` (not
57
- * `clock.seek`/`clock.advance` directly) and the runner tags the resulting
58
- * crossing with its true source before evaluating cues. A cue with
59
- * `firesDuringSeek` unset/false is skipped entirely (both directions, and
60
- * the auto-cleanup/compensation described below) on a seek-sourced
61
- * crossing — this is what keeps authoring-time scrubbing from spamming
62
- * `player.lockInput()`/`enemies.spawn()` side effects, matching the spirit
63
- * of the D4 director AC ("seeking ... without spuriously firing gameplay
64
- * cues"). Driving the clock directly (bypassing the runner's wrapper
65
- * methods) is still safe — the crossing is simply treated as `'advance'`
66
- * sourced by default — but loses seek-vs-play discrimination; this is a
67
- * documented, deliberate limitation, not a bug.
68
- *
69
- * ## Equal-timestamp tiebreak
70
- *
71
- * Cues are evaluated in ascending `time` order; cues with an EQUAL `time`
72
- * are evaluated in REGISTRATION order (the order they appear in the array
73
- * passed to `createCueRunner`) — the same tiebreak convention
74
- * `AnimationClock.subscribe` itself uses for same-phase evaluators
75
- * (`animation-clock.ts`'s `EvaluatorEntry.order`).
76
- *
77
- * ## Cleanup / compensation
78
- *
79
- * `run`/`reverse` may return a `CueCleanup` function. It is invoked (and
80
- * then discarded) at whichever of these happens first:
81
- *
82
- * - a reverse-direction crossing of the SAME cue (even if the cue has no
83
- * explicit `reverse` handler — this is the "compensation" half of the
84
- * contract: undo whatever `run` set up, symmetrically, when time moves
85
- * back past it), subject to the same `firesDuringSeek` gating as any
86
- * other reverse-direction reaction;
87
- * - the cue being re-armed by a loop wrap (`resetsOnLoop`) or by
88
- * `reset()` — any not-yet-compensated effect is cleaned up before the
89
- * cue is made eligible to fire again;
90
- * - `CueRunner.dispose()` — final teardown.
91
- *
92
- * `run`'s cleanup and `reverse`'s cleanup are tracked independently, so an
93
- * explicit `reverse` handler that ALSO returns a cleanup gets its own
94
- * compensation slot (invoked on re-arm/dispose, since there is no
95
- * "un-reverse" direction to compensate it from).
96
- *
97
- * ## Error isolation
98
- *
99
- * Every `run`/`reverse`/cleanup invocation is individually try/caught. A
100
- * throw is recorded as a `CueError` (`cueId` + `time` + which `phase`
101
- * threw) via `getErrors()`/the optional `onError` callback, and NEVER
102
- * re-thrown — one failing cue can neither block a sibling cue in the same
103
- * crossing nor corrupt the clock (the clock has already committed its new
104
- * position before any cue runs; a cue is a pure reaction to a completed
105
- * crossing, never a participant in producing one).
106
- */
107
- /** Optional compensation/cleanup a cue handler may return. */
108
- export type CueCleanup = () => void;
109
- /**
110
- * `void` (not `undefined`) is required here so an ordinary handler written
111
- * as `run: (ctx) => { ctx.player.lockInput(); }` (no explicit `return`,
112
- * which TS types as `void`) stays assignable — TS's special-cased "a
113
- * `void`-typed callback return position accepts any return value"
114
- * assignability rule does NOT apply to `undefined`; swapping this to
115
- * `undefined | CueCleanup` breaks every cue author whose handler doesn't
116
- * end in a bare `return;`.
117
- */
118
- export type CueHandlerResult = void | CueCleanup;
119
- /**
120
- * A single cinematic cue: a stable id, a time in seconds, and the gameplay
121
- * reaction(s) to crossing that time. See the module doc above and spec
122
- * §5.4 for the full contract.
123
- */
124
- export interface CinematicCue<TContext = unknown> {
125
- /** Stable identifier, unique within one `CueRunner`. */
126
- readonly id: string;
127
- /** Time in seconds, in the same domain as the driving `AnimationClock`. */
128
- readonly time: number;
129
- /** Forward-crossing behavior. May return a cleanup/compensation function. */
130
- run(ctx: TContext): CueHandlerResult;
131
- /** Optional reverse (backward-crossing) behavior. May return its own cleanup. */
132
- reverse?(ctx: TContext): CueHandlerResult;
133
- /**
134
- * Whether this cue reacts to a `CueRunner.seek()`-sourced crossing (in
135
- * either direction). Default `false` — explicit seeks (authoring-time
136
- * scrubbing, skip/jump) do not fire gameplay-consequential cues unless a
137
- * cue opts in.
138
- */
139
- readonly firesDuringSeek?: boolean;
140
- /**
141
- * Whether a loop-wrapping crossing re-arms this cue so it can fire again
142
- * next lap. Default `false` — the cue fires (at most) once for the
143
- * lifetime of the runner, until an explicit `reset()`.
144
- */
145
- readonly resetsOnLoop?: boolean;
146
- }
147
- export type CueErrorPhase = 'run' | 'reverse' | 'cleanup';
148
- /** A failed cue's identity + which phase threw, never a live Error re-throw. */
149
- export interface CueError {
150
- readonly cueId: string;
151
- readonly time: number;
152
- readonly phase: CueErrorPhase;
153
- readonly error: unknown;
154
- }
155
- /** Which `AnimationClock` method produced the crossing being evaluated. */
156
- export type CueCrossingSource = 'advance' | 'seek';
157
- export interface CueRunnerOptions<TContext> {
158
- /** The game context passed to every `run`/`reverse` call. */
159
- context: TContext;
160
- /**
161
- * Which `AnimationClock` phase to evaluate cues in. Default `'gameLogic'`
162
- * — gameplay consequences run before the `'animation'` phase Theatre
163
- * bindings use (`theatre-clock-binding.ts`), matching `PHASE_ORDER`.
164
- */
165
- phase?: SystemPhaseName;
166
- /** Called synchronously whenever a cue's run/reverse/cleanup throws. */
167
- onError?: (err: CueError) => void;
168
- }
169
- /**
170
- * The runner's public surface is intentionally context-agnostic (`TContext`
171
- * only shapes construction — the cue handlers it drives — not this object's
172
- * own methods), so it takes no type parameter.
173
- */
174
- export interface CueRunner {
175
- /**
176
- * Explicit seek, tagged as `'seek'`-sourced for `firesDuringSeek` gating.
177
- * Prefer this over calling the underlying clock's `seek()` directly.
178
- */
179
- seek(t: number): ClockCrossing;
180
- /**
181
- * Playback tick, tagged as `'advance'`-sourced. Prefer this over calling
182
- * the underlying clock's `advance()` directly. No-op (returns `null`)
183
- * under the same conditions `AnimationClock.advance` is a no-op.
184
- */
185
- advance(dt: number): ClockCrossing | null;
186
- /** Re-arms every cue (the "restart" policy) and runs any pending cleanups. */
187
- reset(): void;
188
- /** Every cue failure recorded so far, in the order they occurred. */
189
- getErrors(): readonly CueError[];
190
- /** Clears the recorded error log (does not affect cue armed state). */
191
- clearErrors(): void;
192
- /** Unsubscribes from the clock and runs any pending cleanups. */
193
- dispose(): void;
194
- }
195
- /**
196
- * Build a cue runner bound to `clock`, evaluating `cues` on every crossing.
197
- * See the module doc comment for the full policy contract.
198
- */
199
- export declare function createCueRunner<TContext>(clock: AnimationClock, cues: readonly CinematicCue<TContext>[], options: CueRunnerOptions<TContext>): CueRunner;
200
- //# sourceMappingURL=cinematic-cues.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cinematic-cues.d.ts","sourceRoot":"","sources":["../../src/animation/cinematic-cues.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EAGd,MAAM,mBAAmB,CAAC;AAE3B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuGG;AAEH,8DAA8D;AAC9D,MAAM,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC;AAEpC;;;;;;;;GAQG;AAEH,MAAM,MAAM,gBAAgB,GAAG,IAAI,GAAG,UAAU,CAAC;AAEjD;;;;GAIG;AACH,MAAM,WAAW,YAAY,CAAC,QAAQ,GAAG,OAAO;IAC9C,wDAAwD;IACxD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,2EAA2E;IAC3E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,6EAA6E;IAC7E,GAAG,CAAC,GAAG,EAAE,QAAQ,GAAG,gBAAgB,CAAC;IACrC,iFAAiF;IACjF,OAAO,CAAC,CAAC,GAAG,EAAE,QAAQ,GAAG,gBAAgB,CAAC;IAC1C;;;;;OAKG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;IACnC;;;;OAIG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,SAAS,GAAG,SAAS,CAAC;AAE1D,gFAAgF;AAChF,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAED,2EAA2E;AAC3E,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,MAAM,CAAC;AAEnD,MAAM,WAAW,gBAAgB,CAAC,QAAQ;IACxC,6DAA6D;IAC7D,OAAO,EAAE,QAAQ,CAAC;IAClB;;;;OAIG;IACH,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,wEAAwE;IACxE,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,KAAK,IAAI,CAAC;CACnC;AAED;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB;;;OAGG;IACH,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC;IAC/B;;;;OAIG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAAC;IAC1C,8EAA8E;IAC9E,KAAK,IAAI,IAAI,CAAC;IACd,qEAAqE;IACrE,SAAS,IAAI,SAAS,QAAQ,EAAE,CAAC;IACjC,uEAAuE;IACvE,WAAW,IAAI,IAAI,CAAC;IACpB,iEAAiE;IACjE,OAAO,IAAI,IAAI,CAAC;CACjB;AAsBD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EACtC,KAAK,EAAE,cAAc,EACrB,IAAI,EAAE,SAAS,YAAY,CAAC,QAAQ,CAAC,EAAE,EACvC,OAAO,EAAE,gBAAgB,CAAC,QAAQ,CAAC,GAClC,SAAS,CAoNX"}
@@ -1,213 +0,0 @@
1
- function crossesForward(interval, cueTime) {
2
- return interval.direction === 'forward' && cueTime > interval.from && cueTime <= interval.to;
3
- }
4
- function crossesReverse(interval, cueTime) {
5
- return interval.direction === 'reverse' && cueTime < interval.from && cueTime >= interval.to;
6
- }
7
- /**
8
- * Build a cue runner bound to `clock`, evaluating `cues` on every crossing.
9
- * See the module doc comment for the full policy contract.
10
- */
11
- export function createCueRunner(clock, cues, options) {
12
- const seen = new Set();
13
- for (const cue of cues) {
14
- if (seen.has(cue.id)) {
15
- throw new Error(`[CueRunner] duplicate cue id "${cue.id}" — ids must be unique`);
16
- }
17
- seen.add(cue.id);
18
- }
19
- const ordered = cues.map((cue, registrationOrder) => ({
20
- cue,
21
- registrationOrder,
22
- }));
23
- ordered.sort((a, b) => {
24
- if (a.cue.time !== b.cue.time)
25
- return a.cue.time - b.cue.time;
26
- return a.registrationOrder - b.registrationOrder;
27
- });
28
- const context = options.context;
29
- const phase = options.phase ?? 'gameLogic';
30
- const errors = [];
31
- const states = new Map();
32
- for (const { cue } of ordered) {
33
- states.set(cue.id, {
34
- firedForward: false,
35
- firedReverse: false,
36
- forwardCleanup: undefined,
37
- reverseCleanup: undefined,
38
- });
39
- }
40
- function stateOf(id) {
41
- const state = states.get(id);
42
- if (!state)
43
- throw new Error(`[CueRunner] unknown cue id "${id}"`); // unreachable — defensive
44
- return state;
45
- }
46
- function reportError(cueId, time, errPhase, error) {
47
- const cueError = { cueId, time, phase: errPhase, error };
48
- errors.push(cueError);
49
- options.onError?.(cueError);
50
- }
51
- function invokeHandler(cue, errPhase, handler) {
52
- try {
53
- const result = handler(context);
54
- return typeof result === 'function' ? result : undefined;
55
- }
56
- catch (error) {
57
- reportError(cue.id, cue.time, errPhase, error);
58
- return undefined;
59
- }
60
- }
61
- function invokeCleanup(cue, cleanup) {
62
- try {
63
- cleanup();
64
- }
65
- catch (error) {
66
- reportError(cue.id, cue.time, 'cleanup', error);
67
- }
68
- }
69
- // NOTE: no crossing-scoped "already fired this crossing" guard beyond the
70
- // per-cue `state.firedForward`/`state.firedReverse` flags below — those
71
- // flags are sufficient (each cue is visited at most once per interval,
72
- // and a fire sets the flag before the next interval is scanned) AND, in
73
- // the resetsOnLoop case, `rearmLoopCues` deliberately clears them mid
74
- // crossing so a cue CAN legitimately fire again in a later interval of
75
- // the same multi-lap crossing (once per lap boundary actually crossed).
76
- // A crossing-wide "fired once ever" set would silently defeat that.
77
- function processForwardInterval(interval, source) {
78
- for (const { cue } of ordered) {
79
- const state = stateOf(cue.id);
80
- if (state.firedForward)
81
- continue;
82
- if (!crossesForward(interval, cue.time))
83
- continue;
84
- if (source === 'seek' && !cue.firesDuringSeek)
85
- continue;
86
- state.firedForward = true;
87
- const cleanup = invokeHandler(cue, 'run', cue.run);
88
- if (cleanup)
89
- state.forwardCleanup = cleanup;
90
- }
91
- }
92
- // Split out of processReverseInterval to keep both functions under the
93
- // project's cognitive-complexity budget: this is the "what happens to ONE
94
- // cue on a reverse crossing" reaction — the explicit reverse() handler
95
- // (if any, fire-once) plus the automatic forward-cleanup compensation
96
- // (independent of whether reverse() exists) — see the module doc's
97
- // "Cleanup / compensation" section.
98
- function reactToReverseCrossing(cue, state) {
99
- if (cue.reverse && !state.firedReverse) {
100
- state.firedReverse = true;
101
- const cleanup = invokeHandler(cue, 'reverse', cue.reverse);
102
- if (cleanup)
103
- state.reverseCleanup = cleanup;
104
- }
105
- if (state.forwardCleanup) {
106
- const cleanup = state.forwardCleanup;
107
- state.forwardCleanup = undefined;
108
- invokeCleanup(cue, cleanup);
109
- }
110
- }
111
- function processReverseInterval(interval, source) {
112
- for (const { cue } of ordered) {
113
- if (!crossesReverse(interval, cue.time))
114
- continue;
115
- if (source === 'seek' && !cue.firesDuringSeek)
116
- continue;
117
- reactToReverseCrossing(cue, stateOf(cue.id));
118
- }
119
- }
120
- function rearmLoopCues() {
121
- for (const { cue } of ordered) {
122
- if (!cue.resetsOnLoop)
123
- continue;
124
- const state = stateOf(cue.id);
125
- if (!state.firedForward && !state.firedReverse)
126
- continue; // nothing to rearm
127
- if (state.forwardCleanup) {
128
- invokeCleanup(cue, state.forwardCleanup);
129
- state.forwardCleanup = undefined;
130
- }
131
- if (state.reverseCleanup) {
132
- invokeCleanup(cue, state.reverseCleanup);
133
- state.reverseCleanup = undefined;
134
- }
135
- state.firedForward = false;
136
- state.firedReverse = false;
137
- }
138
- }
139
- function handleCrossing(crossing, source) {
140
- for (const interval of crossing.intervals) {
141
- if (interval.direction === 'forward') {
142
- processForwardInterval(interval, source);
143
- }
144
- else {
145
- processReverseInterval(interval, source);
146
- }
147
- if (crossing.looped) {
148
- const completesLap = (interval.direction === 'forward' && interval.to === clock.range.end) ||
149
- (interval.direction === 'reverse' && interval.to === clock.range.start);
150
- if (completesLap)
151
- rearmLoopCues();
152
- }
153
- }
154
- }
155
- let pendingSource = 'advance';
156
- const handle = clock.subscribe(phase, (crossing) => {
157
- handleCrossing(crossing, pendingSource);
158
- });
159
- let disposed = false;
160
- return {
161
- seek(t) {
162
- pendingSource = 'seek';
163
- try {
164
- return clock.seek(t);
165
- }
166
- finally {
167
- pendingSource = 'advance';
168
- }
169
- },
170
- advance(dt) {
171
- pendingSource = 'advance';
172
- return clock.advance(dt);
173
- },
174
- reset() {
175
- for (const { cue } of ordered) {
176
- const state = stateOf(cue.id);
177
- if (state.forwardCleanup) {
178
- invokeCleanup(cue, state.forwardCleanup);
179
- state.forwardCleanup = undefined;
180
- }
181
- if (state.reverseCleanup) {
182
- invokeCleanup(cue, state.reverseCleanup);
183
- state.reverseCleanup = undefined;
184
- }
185
- state.firedForward = false;
186
- state.firedReverse = false;
187
- }
188
- },
189
- getErrors() {
190
- return errors;
191
- },
192
- clearErrors() {
193
- errors.length = 0;
194
- },
195
- dispose() {
196
- if (disposed)
197
- return;
198
- disposed = true;
199
- handle.dispose();
200
- for (const { cue } of ordered) {
201
- const state = stateOf(cue.id);
202
- if (state.forwardCleanup) {
203
- invokeCleanup(cue, state.forwardCleanup);
204
- state.forwardCleanup = undefined;
205
- }
206
- if (state.reverseCleanup) {
207
- invokeCleanup(cue, state.reverseCleanup);
208
- state.reverseCleanup = undefined;
209
- }
210
- }
211
- },
212
- };
213
- }
@@ -1,12 +0,0 @@
1
- import type * as THREE from 'three';
2
- /**
3
- * Build the clip lookup shared by runtime and editor.
4
- *
5
- * GLTF exporters disagree about case and may prefix animation names with an
6
- * armature (`Armature|Idle`). Keep the exact exported suffix while also
7
- * exposing a lowercase lookup, then apply aliases case-insensitively. This
8
- * lets authored graphs use either `Idle_Loop` or `idle_loop` without silently
9
- * falling back to the bind pose.
10
- */
11
- export declare function buildClipMap(animations: THREE.AnimationClip[], aliases?: Record<string, string>): Map<string, THREE.AnimationClip>;
12
- //# sourceMappingURL=clip-map.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"clip-map.d.ts","sourceRoot":"","sources":["../../src/animation/clip-map.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAQpC;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC1B,UAAU,EAAE,KAAK,CAAC,aAAa,EAAE,EACjC,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GACnC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,aAAa,CAAC,CAoBlC"}
@@ -1,37 +0,0 @@
1
- /** Common aliases used by many free humanoid packs. Scene-authored aliases override these. */
2
- const DEFAULT_CLIP_ALIASES = {
3
- walking: 'walk',
4
- running: 'run',
5
- };
6
- /**
7
- * Build the clip lookup shared by runtime and editor.
8
- *
9
- * GLTF exporters disagree about case and may prefix animation names with an
10
- * armature (`Armature|Idle`). Keep the exact exported suffix while also
11
- * exposing a lowercase lookup, then apply aliases case-insensitively. This
12
- * lets authored graphs use either `Idle_Loop` or `idle_loop` without silently
13
- * falling back to the bind pose.
14
- */
15
- export function buildClipMap(animations, aliases = {}) {
16
- const clips = new Map();
17
- const canonical = new Map();
18
- for (const clip of animations) {
19
- const raw = clip.name.split('|').pop()?.trim() || clip.name;
20
- canonical.set(raw.toLowerCase(), clip);
21
- if (!clips.has(raw))
22
- clips.set(raw, clip);
23
- if (!clips.has(raw.toLowerCase()))
24
- clips.set(raw.toLowerCase(), clip);
25
- }
26
- const mergedAliases = { ...DEFAULT_CLIP_ALIASES, ...aliases };
27
- for (const [source, alias] of Object.entries(mergedAliases)) {
28
- const clip = canonical.get(source.toLowerCase());
29
- if (!clip)
30
- continue;
31
- if (!clips.has(alias))
32
- clips.set(alias, clip);
33
- if (!clips.has(alias.toLowerCase()))
34
- clips.set(alias.toLowerCase(), clip);
35
- }
36
- return clips;
37
- }