@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,661 @@
1
+ import type { ISheetObject, UnknownShorthandCompoundProps } from '@theatre/core';
2
+ // Type-only import — matches `world2d/types.ts`'s own rule (the engine core
3
+ // never VALUE-imports `pixi.js`; a caller supplies the constructed
4
+ // Container/Sprite, this module only types against it).
5
+ import type { Container } from 'pixi.js';
6
+ // Type-only import of the SAME `postprocessing` package the engine's own
7
+ // composer pipeline uses directly (`setup-renderer.ts`) — no wrapper.
8
+ import type { BloomEffect, VignetteEffect } from 'postprocessing';
9
+ import type * as THREE from 'three';
10
+ import type { SystemPhaseName } from '../core/types';
11
+ import type { AnimationClock, ClockEvaluatorHandle } from './animation-clock';
12
+
13
+ /**
14
+ * D3 — stable binding from a Theatre Sheet Object to a `THREE.Object3D`/
15
+ * camera (spec §10 D3, §5.3). This is the "thin integration code" the spec
16
+ * calls for: it reads a Theatre object's pull-based `.value` on every clock
17
+ * crossing and writes the (small, fixed) set of known sub-props straight
18
+ * onto the target's real Three.js properties. It is deliberately NOT a
19
+ * generic/arbitrary property-path evaluator — the only shapes understood are
20
+ * the ones declared below (`TransformProps`, `CameraLensProps`), matching
21
+ * "No arbitrary unsafe property-path evaluator is introduced" (D3 AC).
22
+ *
23
+ * Reads `sheetObject.value` rather than subscribing to Theatre's
24
+ * `onValuesChange` push channel — see `theatre-clock-binding.ts`'s module doc
25
+ * for why: `.value` is synchronously fresh immediately after
26
+ * `sequence.position` is set, while `onValuesChange` is batched on Theatre's
27
+ * own raf-driven ticker and is not delivered 1:1 with each synchronous clock
28
+ * seek (it may coalesce several writes into one notification, or — headless,
29
+ * no-raf — never fire at all).
30
+ *
31
+ * Object identity: a Theatre Sheet Object always carries both its stable,
32
+ * readable Theatre name (`sheetObject.address.objectKey`) and, since the
33
+ * caller supplies the bound `THREE.Object3D` directly, that object's own
34
+ * engine identity (`Object3D.uuid`/`.name`/`userData['entityId']`) — both are
35
+ * inspectable from the object references the binding already holds; nothing
36
+ * further to thread through.
37
+ *
38
+ * ## Remaining D3 channels: quaternion/material/light/post-processing/UI/Pixi
39
+ *
40
+ * The rest of the D3 AC's channel list (spec §10 D3: "Position,
41
+ * rotation/quaternion, scale, camera lens, material/light, post-processing,
42
+ * and selected UI properties have tested bindings") is implemented below,
43
+ * each as its own small, explicit, TYPED helper — never a generic
44
+ * property-path evaluator:
45
+ *
46
+ * - `bindObject3DQuaternion` — `Object3D.quaternion`, authored as a plain
47
+ * `{x,y,z,w}` compound (see `QuaternionProps`'s doc for the interpolation
48
+ * caveat and why the binding always normalizes).
49
+ * - `bindMaterialProperties` — `color`/`opacity`/`emissiveIntensity`/
50
+ * `roughness`/`metalness` on a real `THREE.Material`, feature-detecting
51
+ * which sub-props the concrete material subtype actually has.
52
+ * - `bindLightProperties` — `intensity`/`color` on a real `THREE.Light`.
53
+ * - `bindBloomEffect` / `bindVignetteEffect` — `intensity`/`opacity` and
54
+ * `offset`/`darkness` on real `postprocessing` `BloomEffect`/
55
+ * `VignetteEffect` instances (the SAME package `setup-renderer.ts` already
56
+ * wires into the engine's composer — no new post-processing stack).
57
+ * - `bindDomElementStyle` — `opacity`/`translateX`/`translateY` on a
58
+ * DOM-style-writable target (`DomStyleTarget`, a narrow structural
59
+ * interface a real `HTMLElement` satisfies with no adapter).
60
+ * - `bindPixiContainerTransform` — `x`/`y`/`rotation`/`scaleX`/`scaleY`/
61
+ * `alpha` on a real `PIXI.Container`/`PIXI.Sprite`.
62
+ *
63
+ * All of the above are proven against REAL target objects in
64
+ * `theatre-object-binding-d3.test.ts` — `BloomEffect`/`VignetteEffect`/
65
+ * `PIXI.Container`/`PIXI.Sprite` all construct and expose plain,
66
+ * synchronously-settable properties with no WebGL/canvas/renderer required,
67
+ * so nothing here is a mock of the underlying library. The one channel that
68
+ * genuinely cannot construct real headlessly in THIS repo's `environment:
69
+ * 'node'` vitest lane (`vitest.config.ts` — no DOM) is a real `HTMLElement`;
70
+ * `bindDomElementStyle` is typed against the narrow `DomStyleTarget`
71
+ * structural interface instead of full `HTMLElement`, and its test exercises
72
+ * a plain object literal shaped like one — the exact same binding code path
73
+ * a real `HTMLElement`/React-overlay ref runs through in a browser or a
74
+ * jsdom-backed test. Nothing here is deferred.
75
+ */
76
+
77
+ /** Thrown when a binding is constructed with a missing/falsy target. */
78
+ export class TheatreBindingError extends Error {
79
+ constructor(
80
+ message: string,
81
+ readonly objectKey: string,
82
+ ) {
83
+ super(message);
84
+ this.name = 'TheatreBindingError';
85
+ }
86
+ }
87
+
88
+ export interface Vector3Like {
89
+ x: number;
90
+ y: number;
91
+ z: number;
92
+ }
93
+
94
+ /**
95
+ * The fixed shape a Theatre object must expose (as a subset) to drive an
96
+ * `Object3D`'s transform. Author it with e.g.
97
+ * `sheet.object('Hero', { position: { x: 0, y: 0, z: 0 }, rotation: { x: 0, y: 0, z: 0 }, scale: { x: 1, y: 1, z: 1 } })`.
98
+ * `rotation` is Euler angles in radians, XYZ order (matches `THREE.Euler`'s default).
99
+ */
100
+ export interface TransformProps {
101
+ position?: Vector3Like;
102
+ rotation?: Vector3Like;
103
+ scale?: Vector3Like;
104
+ }
105
+
106
+ export interface TheatreObjectBindingOptions {
107
+ /**
108
+ * Which `AnimationClock` phase to apply values in. Defaults to
109
+ * `'preRender'` — the documented home for camera placement/material tick
110
+ * (`ARCHITECTURE.md`), and guaranteed by `PHASE_ORDER` to run after the
111
+ * `'animation'`-phase default of `bindClockToTheatreSequence`, so the
112
+ * sheet's sequence position is always current by the time this reads
113
+ * `sheetObject.value`, regardless of registration order.
114
+ */
115
+ phase?: SystemPhaseName;
116
+ }
117
+
118
+ export interface TheatreObjectBinding {
119
+ /** Removes the clock evaluator. The target keeps whatever value it last had. */
120
+ dispose(): void;
121
+ }
122
+
123
+ /**
124
+ * Shared disposer wiring for every binding below (same one-shot-dispose
125
+ * shape `bindObject3DTransform`/`bindCameraLens` each inline above) — pulled
126
+ * into one helper only because six more binding functions follow, to avoid
127
+ * repeating the identical five lines six more times. Behavior is identical
128
+ * to the inline version: idempotent `dispose()`, no further writes after.
129
+ */
130
+ function toBinding(handle: ClockEvaluatorHandle): TheatreObjectBinding {
131
+ let disposed = false;
132
+ return {
133
+ dispose(): void {
134
+ if (disposed) return;
135
+ disposed = true;
136
+ handle.dispose();
137
+ },
138
+ };
139
+ }
140
+
141
+ /**
142
+ * Bind a Theatre Sheet Object's `position`/`rotation`/`scale` sub-props (any
143
+ * subset) to a `THREE.Object3D`. Whichever of the three keys are present on
144
+ * `sheetObject.value` are applied; missing keys are left untouched on the
145
+ * target.
146
+ *
147
+ * @throws {TheatreBindingError} if `target` is null/undefined at bind time.
148
+ */
149
+ export function bindObject3DTransform<Props extends UnknownShorthandCompoundProps>(
150
+ clock: AnimationClock,
151
+ sheetObject: ISheetObject<Props>,
152
+ target: THREE.Object3D | null | undefined,
153
+ options: TheatreObjectBindingOptions = {},
154
+ ): TheatreObjectBinding {
155
+ if (!target) {
156
+ throw new TheatreBindingError(
157
+ `[bindObject3DTransform] missing target Object3D for Theatre object "${sheetObject.address.objectKey}"`,
158
+ sheetObject.address.objectKey,
159
+ );
160
+ }
161
+
162
+ const phase = options.phase ?? 'preRender';
163
+
164
+ const handle: ClockEvaluatorHandle = clock.subscribe(phase, () => {
165
+ const value = sheetObject.value as TransformProps;
166
+ if (value.position) {
167
+ target.position.set(value.position.x, value.position.y, value.position.z);
168
+ }
169
+ if (value.rotation) {
170
+ target.rotation.set(value.rotation.x, value.rotation.y, value.rotation.z);
171
+ }
172
+ if (value.scale) {
173
+ target.scale.set(value.scale.x, value.scale.y, value.scale.z);
174
+ }
175
+ });
176
+
177
+ let disposed = false;
178
+ return {
179
+ dispose(): void {
180
+ if (disposed) return;
181
+ disposed = true;
182
+ handle.dispose();
183
+ },
184
+ };
185
+ }
186
+
187
+ /**
188
+ * The fixed shape a Theatre object must expose (as a subset) to drive a
189
+ * `THREE.PerspectiveCamera`'s lens. Author it with e.g.
190
+ * `sheet.object('Lens', { fov: 50, near: 0.1, far: 1000 })`.
191
+ */
192
+ export interface CameraLensProps {
193
+ fov?: number;
194
+ near?: number;
195
+ far?: number;
196
+ }
197
+
198
+ /**
199
+ * Bind a Theatre Sheet Object's `fov`/`near`/`far` sub-props (any subset) to
200
+ * a `THREE.PerspectiveCamera`'s lens, calling `updateProjectionMatrix()`
201
+ * whenever any of them change.
202
+ *
203
+ * @throws {TheatreBindingError} if `camera` is null/undefined at bind time.
204
+ */
205
+ export function bindCameraLens<Props extends UnknownShorthandCompoundProps>(
206
+ clock: AnimationClock,
207
+ sheetObject: ISheetObject<Props>,
208
+ camera: THREE.PerspectiveCamera | null | undefined,
209
+ options: TheatreObjectBindingOptions = {},
210
+ ): TheatreObjectBinding {
211
+ if (!camera) {
212
+ throw new TheatreBindingError(
213
+ `[bindCameraLens] missing target PerspectiveCamera for Theatre object "${sheetObject.address.objectKey}"`,
214
+ sheetObject.address.objectKey,
215
+ );
216
+ }
217
+
218
+ const phase = options.phase ?? 'preRender';
219
+
220
+ const handle: ClockEvaluatorHandle = clock.subscribe(phase, () => {
221
+ const value = sheetObject.value as CameraLensProps;
222
+ let changed = false;
223
+ if (typeof value.fov === 'number' && camera.fov !== value.fov) {
224
+ camera.fov = value.fov;
225
+ changed = true;
226
+ }
227
+ if (typeof value.near === 'number' && camera.near !== value.near) {
228
+ camera.near = value.near;
229
+ changed = true;
230
+ }
231
+ if (typeof value.far === 'number' && camera.far !== value.far) {
232
+ camera.far = value.far;
233
+ changed = true;
234
+ }
235
+ if (changed) camera.updateProjectionMatrix();
236
+ });
237
+
238
+ let disposed = false;
239
+ return {
240
+ dispose(): void {
241
+ if (disposed) return;
242
+ disposed = true;
243
+ handle.dispose();
244
+ },
245
+ };
246
+ }
247
+
248
+ // ─────────────────────────────────────────────────────────────────────────
249
+ // Quaternion rotation
250
+ // ─────────────────────────────────────────────────────────────────────────
251
+
252
+ export interface QuaternionLike {
253
+ x: number;
254
+ y: number;
255
+ z: number;
256
+ w: number;
257
+ }
258
+
259
+ /**
260
+ * The fixed shape a Theatre object must expose to drive an `Object3D`'s
261
+ * rotation as a quaternion — an alternative to `TransformProps.rotation`'s
262
+ * Euler angles for cases that need to avoid gimbal lock or author a rotation
263
+ * that doesn't decompose cleanly into per-axis Euler angles. Author it with
264
+ * e.g. `sheet.object('Hero', { quaternion: { x: 0, y: 0, z: 0, w: 1 } })` —
265
+ * the authored shape is Theatre's plain shorthand-compound of the SAME four
266
+ * fields `THREE.Quaternion` itself exposes (`x`/`y`/`z`/`w`); there is no
267
+ * VGAI-invented quaternion encoding.
268
+ *
269
+ * Theatre has no native quaternion/slerp track type — it interpolates each
270
+ * of `x`/`y`/`z`/`w` LINEARLY and independently, so a value read strictly
271
+ * BETWEEN two authored keyframes is a component-wise lerp, not a slerp, and
272
+ * is not guaranteed to be exactly unit length. `bindObject3DQuaternion`
273
+ * always calls `.normalize()` immediately after `.set(...)`, so the applied
274
+ * rotation is never a scaled/denormalized quaternion even mid-interpolation
275
+ * — but normalizing a lerp is not the same curve a true slerp would trace.
276
+ * For continuous cinematic rotation, prefer authoring dense keyframes (exact
277
+ * at each keyframe, close between nearby ones), or use
278
+ * `TransformProps.rotation`'s Euler channel instead (also only lerped
279
+ * per-axis by Theatre, but with no unit-length concern at all).
280
+ */
281
+ export interface QuaternionProps {
282
+ quaternion?: QuaternionLike;
283
+ }
284
+
285
+ /**
286
+ * Bind a Theatre Sheet Object's `quaternion` sub-prop to a `THREE.Object3D`'s
287
+ * `.quaternion`. See `QuaternionProps`'s doc for the authored shape and its
288
+ * interpolation caveat.
289
+ *
290
+ * @throws {TheatreBindingError} if `target` is null/undefined at bind time.
291
+ */
292
+ export function bindObject3DQuaternion<Props extends UnknownShorthandCompoundProps>(
293
+ clock: AnimationClock,
294
+ sheetObject: ISheetObject<Props>,
295
+ target: THREE.Object3D | null | undefined,
296
+ options: TheatreObjectBindingOptions = {},
297
+ ): TheatreObjectBinding {
298
+ if (!target) {
299
+ throw new TheatreBindingError(
300
+ `[bindObject3DQuaternion] missing target Object3D for Theatre object "${sheetObject.address.objectKey}"`,
301
+ sheetObject.address.objectKey,
302
+ );
303
+ }
304
+
305
+ const phase = options.phase ?? 'preRender';
306
+
307
+ const handle: ClockEvaluatorHandle = clock.subscribe(phase, () => {
308
+ const value = sheetObject.value as QuaternionProps;
309
+ if (value.quaternion) {
310
+ const { x, y, z, w } = value.quaternion;
311
+ target.quaternion.set(x, y, z, w);
312
+ target.quaternion.normalize();
313
+ }
314
+ });
315
+
316
+ return toBinding(handle);
317
+ }
318
+
319
+ // ─────────────────────────────────────────────────────────────────────────
320
+ // Material properties
321
+ // ─────────────────────────────────────────────────────────────────────────
322
+
323
+ export interface ColorLike {
324
+ r: number;
325
+ g: number;
326
+ b: number;
327
+ }
328
+
329
+ /**
330
+ * A small, fixed, TYPED subset of `THREE.Material` properties — NOT an
331
+ * arbitrary property-path evaluator. `color` mirrors Theatre's own native
332
+ * `types.rgba(...)` value shape (`{r,g,b,a}`, 0-1 floats) minus alpha (use
333
+ * the separate `opacity` field, which is what `THREE.Material.opacity`
334
+ * itself already is). `emissiveIntensity`/`roughness`/`metalness` only exist
335
+ * on `THREE.MeshStandardMaterial`-family materials; `bindMaterialProperties`
336
+ * feature-detects each with an `in` check and silently skips any sub-prop
337
+ * the target material doesn't have (mirroring `bindObject3DTransform`'s
338
+ * "whichever subset is present" contract) rather than throwing.
339
+ */
340
+ export interface MaterialProps {
341
+ color?: ColorLike;
342
+ opacity?: number;
343
+ emissiveIntensity?: number;
344
+ roughness?: number;
345
+ metalness?: number;
346
+ }
347
+
348
+ type ExtendedMaterial = THREE.Material & {
349
+ color?: THREE.Color;
350
+ emissiveIntensity?: number;
351
+ roughness?: number;
352
+ metalness?: number;
353
+ };
354
+
355
+ /**
356
+ * Bind a Theatre Sheet Object's `color`/`opacity`/`emissiveIntensity`/
357
+ * `roughness`/`metalness` sub-props (any subset the target material
358
+ * supports) to a `THREE.Material`.
359
+ *
360
+ * @throws {TheatreBindingError} if `target` is null/undefined at bind time.
361
+ */
362
+ export function bindMaterialProperties<Props extends UnknownShorthandCompoundProps>(
363
+ clock: AnimationClock,
364
+ sheetObject: ISheetObject<Props>,
365
+ target: THREE.Material | null | undefined,
366
+ options: TheatreObjectBindingOptions = {},
367
+ ): TheatreObjectBinding {
368
+ if (!target) {
369
+ throw new TheatreBindingError(
370
+ `[bindMaterialProperties] missing target Material for Theatre object "${sheetObject.address.objectKey}"`,
371
+ sheetObject.address.objectKey,
372
+ );
373
+ }
374
+
375
+ const material = target as ExtendedMaterial;
376
+ const phase = options.phase ?? 'preRender';
377
+
378
+ const handle: ClockEvaluatorHandle = clock.subscribe(phase, () => {
379
+ const value = sheetObject.value as MaterialProps;
380
+ if (value.color && material.color) {
381
+ material.color.setRGB(value.color.r, value.color.g, value.color.b);
382
+ }
383
+ if (typeof value.opacity === 'number') {
384
+ material.opacity = value.opacity;
385
+ }
386
+ if (typeof value.emissiveIntensity === 'number' && 'emissiveIntensity' in material) {
387
+ material.emissiveIntensity = value.emissiveIntensity;
388
+ }
389
+ if (typeof value.roughness === 'number' && 'roughness' in material) {
390
+ material.roughness = value.roughness;
391
+ }
392
+ if (typeof value.metalness === 'number' && 'metalness' in material) {
393
+ material.metalness = value.metalness;
394
+ }
395
+ });
396
+
397
+ return toBinding(handle);
398
+ }
399
+
400
+ // ─────────────────────────────────────────────────────────────────────────
401
+ // Light properties
402
+ // ─────────────────────────────────────────────────────────────────────────
403
+
404
+ /** A small, fixed, TYPED subset of `THREE.Light` properties. */
405
+ export interface LightProps {
406
+ intensity?: number;
407
+ color?: ColorLike;
408
+ }
409
+
410
+ /**
411
+ * Bind a Theatre Sheet Object's `intensity`/`color` sub-props (any subset)
412
+ * to a `THREE.Light`.
413
+ *
414
+ * @throws {TheatreBindingError} if `target` is null/undefined at bind time.
415
+ */
416
+ export function bindLightProperties<Props extends UnknownShorthandCompoundProps>(
417
+ clock: AnimationClock,
418
+ sheetObject: ISheetObject<Props>,
419
+ target: THREE.Light | null | undefined,
420
+ options: TheatreObjectBindingOptions = {},
421
+ ): TheatreObjectBinding {
422
+ if (!target) {
423
+ throw new TheatreBindingError(
424
+ `[bindLightProperties] missing target Light for Theatre object "${sheetObject.address.objectKey}"`,
425
+ sheetObject.address.objectKey,
426
+ );
427
+ }
428
+
429
+ const phase = options.phase ?? 'preRender';
430
+
431
+ const handle: ClockEvaluatorHandle = clock.subscribe(phase, () => {
432
+ const value = sheetObject.value as LightProps;
433
+ if (typeof value.intensity === 'number') {
434
+ target.intensity = value.intensity;
435
+ }
436
+ if (value.color) {
437
+ target.color.setRGB(value.color.r, value.color.g, value.color.b);
438
+ }
439
+ });
440
+
441
+ return toBinding(handle);
442
+ }
443
+
444
+ // ─────────────────────────────────────────────────────────────────────────
445
+ // Post-processing (real `postprocessing` package effects — see module doc)
446
+ // ─────────────────────────────────────────────────────────────────────────
447
+
448
+ /** A small, fixed, TYPED subset of `postprocessing`'s `BloomEffect` properties. */
449
+ export interface BloomEffectProps {
450
+ intensity?: number;
451
+ /** Effect blend opacity (`BloomEffect.blendMode.opacity.value`), 0-1. */
452
+ opacity?: number;
453
+ }
454
+
455
+ /**
456
+ * Bind a Theatre Sheet Object's `intensity`/`opacity` sub-props (any subset)
457
+ * to a real `postprocessing` `BloomEffect` — the SAME `postprocessing` npm
458
+ * package the engine's own composer pipeline already uses directly
459
+ * (`setup-renderer.ts`), not a new post-processing stack.
460
+ *
461
+ * @throws {TheatreBindingError} if `effect` is null/undefined at bind time.
462
+ */
463
+ export function bindBloomEffect<Props extends UnknownShorthandCompoundProps>(
464
+ clock: AnimationClock,
465
+ sheetObject: ISheetObject<Props>,
466
+ effect: BloomEffect | null | undefined,
467
+ options: TheatreObjectBindingOptions = {},
468
+ ): TheatreObjectBinding {
469
+ if (!effect) {
470
+ throw new TheatreBindingError(
471
+ `[bindBloomEffect] missing target BloomEffect for Theatre object "${sheetObject.address.objectKey}"`,
472
+ sheetObject.address.objectKey,
473
+ );
474
+ }
475
+
476
+ const phase = options.phase ?? 'preRender';
477
+
478
+ const handle: ClockEvaluatorHandle = clock.subscribe(phase, () => {
479
+ const value = sheetObject.value as BloomEffectProps;
480
+ if (typeof value.intensity === 'number') {
481
+ effect.intensity = value.intensity;
482
+ }
483
+ if (typeof value.opacity === 'number') {
484
+ effect.blendMode.opacity.value = value.opacity;
485
+ }
486
+ });
487
+
488
+ return toBinding(handle);
489
+ }
490
+
491
+ /** A small, fixed, TYPED subset of `postprocessing`'s `VignetteEffect` properties. */
492
+ export interface VignetteEffectProps {
493
+ offset?: number;
494
+ darkness?: number;
495
+ }
496
+
497
+ /**
498
+ * Bind a Theatre Sheet Object's `offset`/`darkness` sub-props (any subset) to
499
+ * a real `postprocessing` `VignetteEffect` — same package/no-wrapper note as
500
+ * `bindBloomEffect` above.
501
+ *
502
+ * @throws {TheatreBindingError} if `effect` is null/undefined at bind time.
503
+ */
504
+ export function bindVignetteEffect<Props extends UnknownShorthandCompoundProps>(
505
+ clock: AnimationClock,
506
+ sheetObject: ISheetObject<Props>,
507
+ effect: VignetteEffect | null | undefined,
508
+ options: TheatreObjectBindingOptions = {},
509
+ ): TheatreObjectBinding {
510
+ if (!effect) {
511
+ throw new TheatreBindingError(
512
+ `[bindVignetteEffect] missing target VignetteEffect for Theatre object "${sheetObject.address.objectKey}"`,
513
+ sheetObject.address.objectKey,
514
+ );
515
+ }
516
+
517
+ const phase = options.phase ?? 'preRender';
518
+
519
+ const handle: ClockEvaluatorHandle = clock.subscribe(phase, () => {
520
+ const value = sheetObject.value as VignetteEffectProps;
521
+ if (typeof value.offset === 'number') {
522
+ effect.offset = value.offset;
523
+ }
524
+ if (typeof value.darkness === 'number') {
525
+ effect.darkness = value.darkness;
526
+ }
527
+ });
528
+
529
+ return toBinding(handle);
530
+ }
531
+
532
+ // ─────────────────────────────────────────────────────────────────────────
533
+ // Selected UI properties (DOM-style-writable target)
534
+ // ─────────────────────────────────────────────────────────────────────────
535
+
536
+ /**
537
+ * A minimal structural interface for a DOM-style-writable target — NOT the
538
+ * full `HTMLElement` API. A real `HTMLElement` (or a React ref's `.current`)
539
+ * satisfies this structurally with no adapter, since
540
+ * `CSSStyleDeclaration.opacity`/`.transform` are themselves plain strings.
541
+ * This repo's vitest lane runs `environment: 'node'` (`vitest.config.ts`,
542
+ * no DOM), so `theatre-object-binding-d3.test.ts` exercises
543
+ * `bindDomElementStyle` against a plain object literal shaped like `{
544
+ * style: { opacity: '', transform: '' } }` — the exact same binding code
545
+ * path a real `HTMLElement`/React-overlay ref runs through in a browser or a
546
+ * jsdom-backed test elsewhere in the stack.
547
+ */
548
+ export interface DomStyleTarget {
549
+ style: {
550
+ opacity: string;
551
+ transform: string;
552
+ };
553
+ }
554
+
555
+ /**
556
+ * A small, fixed, TYPED set of DOM/React-overlay-friendly style properties:
557
+ * opacity plus a 2D translate. The two translate axes are combined into one
558
+ * CSS `transform` string, remembering whichever value was last authored on
559
+ * each axis so authoring only one axis doesn't reset the other to 0.
560
+ */
561
+ export interface UIElementProps {
562
+ opacity?: number;
563
+ translateX?: number;
564
+ translateY?: number;
565
+ }
566
+
567
+ /**
568
+ * Bind a Theatre Sheet Object's `opacity`/`translateX`/`translateY`
569
+ * sub-props (any subset) to a DOM-style-writable target's inline style. See
570
+ * `DomStyleTarget`'s doc for how this is proven without a real browser DOM.
571
+ *
572
+ * @throws {TheatreBindingError} if `target` is null/undefined at bind time.
573
+ */
574
+ export function bindDomElementStyle<Props extends UnknownShorthandCompoundProps>(
575
+ clock: AnimationClock,
576
+ sheetObject: ISheetObject<Props>,
577
+ target: DomStyleTarget | null | undefined,
578
+ options: TheatreObjectBindingOptions = {},
579
+ ): TheatreObjectBinding {
580
+ if (!target) {
581
+ throw new TheatreBindingError(
582
+ `[bindDomElementStyle] missing target DOM element for Theatre object "${sheetObject.address.objectKey}"`,
583
+ sheetObject.address.objectKey,
584
+ );
585
+ }
586
+
587
+ const phase = options.phase ?? 'preRender';
588
+ let lastTranslateX = 0;
589
+ let lastTranslateY = 0;
590
+
591
+ const handle: ClockEvaluatorHandle = clock.subscribe(phase, () => {
592
+ const value = sheetObject.value as UIElementProps;
593
+ if (typeof value.opacity === 'number') {
594
+ target.style.opacity = String(value.opacity);
595
+ }
596
+ if (typeof value.translateX === 'number') lastTranslateX = value.translateX;
597
+ if (typeof value.translateY === 'number') lastTranslateY = value.translateY;
598
+ if (typeof value.translateX === 'number' || typeof value.translateY === 'number') {
599
+ target.style.transform = `translate(${lastTranslateX}px, ${lastTranslateY}px)`;
600
+ }
601
+ });
602
+
603
+ return toBinding(handle);
604
+ }
605
+
606
+ // ─────────────────────────────────────────────────────────────────────────
607
+ // Pixi binding helper
608
+ // ─────────────────────────────────────────────────────────────────────────
609
+
610
+ /**
611
+ * A small, fixed, TYPED subset of `PIXI.Container` (and, since `PIXI.Sprite
612
+ * extends Container`, `PIXI.Sprite` too) transform/alpha properties.
613
+ * `rotation` is in radians (matches `Container.rotation`'s own unit).
614
+ */
615
+ export interface PixiTransformProps {
616
+ x?: number;
617
+ y?: number;
618
+ rotation?: number;
619
+ scaleX?: number;
620
+ scaleY?: number;
621
+ alpha?: number;
622
+ }
623
+
624
+ /**
625
+ * Bind a Theatre Sheet Object's `x`/`y`/`rotation`/`scaleX`/`scaleY`/`alpha`
626
+ * sub-props (any subset) to a real `PIXI.Container`/`PIXI.Sprite` (reusing
627
+ * the world2d stack's own `pixi.js` dependency — see this module's
628
+ * type-only `pixi.js` import above and its doc note on why the engine core
629
+ * never value-imports it). Plain `Container`/`Sprite` construction needs no
630
+ * canvas/WebGL context, so this is proven against a REAL Pixi object in
631
+ * `theatre-object-binding-d3.test.ts`, not a stand-in.
632
+ *
633
+ * @throws {TheatreBindingError} if `target` is null/undefined at bind time.
634
+ */
635
+ export function bindPixiContainerTransform<Props extends UnknownShorthandCompoundProps>(
636
+ clock: AnimationClock,
637
+ sheetObject: ISheetObject<Props>,
638
+ target: Container | null | undefined,
639
+ options: TheatreObjectBindingOptions = {},
640
+ ): TheatreObjectBinding {
641
+ if (!target) {
642
+ throw new TheatreBindingError(
643
+ `[bindPixiContainerTransform] missing target PIXI.Container for Theatre object "${sheetObject.address.objectKey}"`,
644
+ sheetObject.address.objectKey,
645
+ );
646
+ }
647
+
648
+ const phase = options.phase ?? 'preRender';
649
+
650
+ const handle: ClockEvaluatorHandle = clock.subscribe(phase, () => {
651
+ const value = sheetObject.value as PixiTransformProps;
652
+ if (typeof value.x === 'number') target.x = value.x;
653
+ if (typeof value.y === 'number') target.y = value.y;
654
+ if (typeof value.rotation === 'number') target.rotation = value.rotation;
655
+ if (typeof value.scaleX === 'number') target.scale.x = value.scaleX;
656
+ if (typeof value.scaleY === 'number') target.scale.y = value.scaleY;
657
+ if (typeof value.alpha === 'number') target.alpha = value.alpha;
658
+ });
659
+
660
+ return toBinding(handle);
661
+ }