@vgai/engine 0.5.0-canary.20260719.1 → 0.5.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 (523) hide show
  1. package/dist/adapter/adapter-surface.d.ts +30 -0
  2. package/dist/adapter/adapter-surface.d.ts.map +1 -0
  3. package/dist/adapter/adapter-surface.js +18 -0
  4. package/dist/adapter/authoring.d.ts +461 -0
  5. package/dist/adapter/authoring.d.ts.map +1 -0
  6. package/dist/adapter/authoring.js +22 -0
  7. package/dist/adapter/colyseus-networking-adapter.d.ts +43 -0
  8. package/dist/adapter/colyseus-networking-adapter.d.ts.map +1 -0
  9. package/dist/adapter/colyseus-networking-adapter.js +38 -0
  10. package/dist/adapter/first-party-systems.d.ts +38 -0
  11. package/dist/adapter/first-party-systems.d.ts.map +1 -0
  12. package/dist/adapter/first-party-systems.js +77 -0
  13. package/dist/adapter/game-adapter.d.ts +133 -0
  14. package/dist/adapter/game-adapter.d.ts.map +1 -0
  15. package/dist/adapter/game-adapter.js +10 -0
  16. package/dist/adapter/host-context.d.ts +71 -0
  17. package/dist/adapter/host-context.d.ts.map +1 -0
  18. package/dist/adapter/host-context.js +16 -0
  19. package/dist/adapter/index.d.ts +22 -0
  20. package/dist/adapter/index.d.ts.map +1 -0
  21. package/dist/adapter/index.js +15 -0
  22. package/dist/adapter/ingest/game-contract.d.ts +53 -0
  23. package/dist/adapter/ingest/game-contract.d.ts.map +1 -0
  24. package/dist/adapter/ingest/game-contract.js +30 -0
  25. package/dist/adapter/ingest/overlay-applier.d.ts +118 -0
  26. package/dist/adapter/ingest/overlay-applier.d.ts.map +1 -0
  27. package/dist/adapter/ingest/overlay-applier.js +132 -0
  28. package/dist/adapter/ingest/overlay-apply.d.ts +60 -0
  29. package/dist/adapter/ingest/overlay-apply.d.ts.map +1 -0
  30. package/dist/adapter/ingest/overlay-apply.js +101 -0
  31. package/dist/adapter/ingest/overlay-file.d.ts +79 -0
  32. package/dist/adapter/ingest/overlay-file.d.ts.map +1 -0
  33. package/dist/adapter/ingest/overlay-file.js +66 -0
  34. package/dist/adapter/ingest/overlay-report.d.ts +113 -0
  35. package/dist/adapter/ingest/overlay-report.d.ts.map +1 -0
  36. package/dist/adapter/ingest/overlay-report.js +103 -0
  37. package/dist/adapter/ingest/scene-capture.d.ts +97 -0
  38. package/dist/adapter/ingest/scene-capture.d.ts.map +1 -0
  39. package/dist/adapter/ingest/scene-capture.js +248 -0
  40. package/dist/adapter/ingest/upstream-pin.d.ts +47 -0
  41. package/dist/adapter/ingest/upstream-pin.d.ts.map +1 -0
  42. package/dist/adapter/ingest/upstream-pin.js +50 -0
  43. package/dist/adapter/loop-gate-report.d.ts +34 -0
  44. package/dist/adapter/loop-gate-report.d.ts.map +1 -0
  45. package/dist/adapter/loop-gate-report.js +37 -0
  46. package/dist/adapter/rapier-physics-adapter.d.ts +12 -0
  47. package/dist/adapter/rapier-physics-adapter.d.ts.map +1 -0
  48. package/dist/adapter/rapier-physics-adapter.js +46 -0
  49. package/dist/adapter/system-adapter.d.ts +206 -0
  50. package/dist/adapter/system-adapter.d.ts.map +1 -0
  51. package/dist/adapter/system-adapter.js +13 -0
  52. package/dist/adapter/transform.d.ts +18 -0
  53. package/dist/adapter/transform.d.ts.map +1 -0
  54. package/dist/adapter/transform.js +1 -0
  55. package/dist/adapter/vgai-scene-game-adapter.d.ts +108 -0
  56. package/dist/adapter/vgai-scene-game-adapter.d.ts.map +1 -0
  57. package/dist/adapter/vgai-scene-game-adapter.js +762 -0
  58. package/dist/ai/navigation.d.ts +64 -0
  59. package/dist/ai/navigation.d.ts.map +1 -0
  60. package/dist/ai/navigation.js +133 -0
  61. package/dist/animation/anim-graph-types.d.ts +25 -0
  62. package/dist/animation/anim-graph-types.d.ts.map +1 -0
  63. package/dist/animation/anim-graph-types.js +1 -0
  64. package/dist/animation/animation-clock.d.ts +213 -0
  65. package/dist/animation/animation-clock.d.ts.map +1 -0
  66. package/dist/animation/animation-clock.js +301 -0
  67. package/dist/animation/blend-node.d.ts +22 -0
  68. package/dist/animation/blend-node.d.ts.map +1 -0
  69. package/dist/animation/blend-node.js +97 -0
  70. package/dist/animation/camera-ownership.d.ts +250 -0
  71. package/dist/animation/camera-ownership.d.ts.map +1 -0
  72. package/dist/animation/camera-ownership.js +169 -0
  73. package/dist/animation/cinematic-cues.d.ts +200 -0
  74. package/dist/animation/cinematic-cues.d.ts.map +1 -0
  75. package/dist/animation/cinematic-cues.js +213 -0
  76. package/dist/animation/clip-map.d.ts +12 -0
  77. package/dist/animation/clip-map.d.ts.map +1 -0
  78. package/dist/animation/clip-map.js +37 -0
  79. package/dist/animation/gsap-registration.d.ts +119 -0
  80. package/dist/animation/gsap-registration.d.ts.map +1 -0
  81. package/dist/animation/gsap-registration.js +92 -0
  82. package/dist/animation/theatre-clock-binding.d.ts +89 -0
  83. package/dist/animation/theatre-clock-binding.d.ts.map +1 -0
  84. package/dist/animation/theatre-clock-binding.js +29 -0
  85. package/dist/animation/theatre-director.d.ts +242 -0
  86. package/dist/animation/theatre-director.d.ts.map +1 -0
  87. package/dist/animation/theatre-director.js +235 -0
  88. package/dist/animation/theatre-object-binding.d.ts +305 -0
  89. package/dist/animation/theatre-object-binding.d.ts.map +1 -0
  90. package/dist/animation/theatre-object-binding.js +351 -0
  91. package/dist/animation/xstate-animation-binding.d.ts +56 -0
  92. package/dist/animation/xstate-animation-binding.d.ts.map +1 -0
  93. package/dist/animation/xstate-animation-binding.js +331 -0
  94. package/dist/animation/xstate-animation-meta.d.ts +266 -0
  95. package/dist/animation/xstate-animation-meta.d.ts.map +1 -0
  96. package/dist/animation/xstate-animation-meta.js +252 -0
  97. package/dist/assets.d.ts +26 -0
  98. package/dist/assets.d.ts.map +1 -0
  99. package/dist/assets.js +55 -0
  100. package/dist/audio/index.d.ts +4 -0
  101. package/dist/audio/index.d.ts.map +1 -0
  102. package/dist/audio/index.js +24 -0
  103. package/dist/audio/tone-clock-binding.d.ts +75 -0
  104. package/dist/audio/tone-clock-binding.d.ts.map +1 -0
  105. package/dist/audio/tone-clock-binding.js +29 -0
  106. package/dist/audio/tone-context.d.ts +114 -0
  107. package/dist/audio/tone-context.d.ts.map +1 -0
  108. package/dist/audio/tone-context.js +39 -0
  109. package/dist/audio/tone-offline-render.d.ts +90 -0
  110. package/dist/audio/tone-offline-render.d.ts.map +1 -0
  111. package/dist/audio/tone-offline-render.js +56 -0
  112. package/dist/audio/wav-encode.d.ts +38 -0
  113. package/dist/audio/wav-encode.d.ts.map +1 -0
  114. package/dist/audio/wav-encode.js +97 -0
  115. package/dist/character/cloth-sim.d.ts +179 -0
  116. package/dist/character/cloth-sim.d.ts.map +1 -0
  117. package/dist/character/cloth-sim.js +334 -0
  118. package/dist/character/spring-chain.d.ts +135 -0
  119. package/dist/character/spring-chain.d.ts.map +1 -0
  120. package/dist/character/spring-chain.js +165 -0
  121. package/dist/core/game-loop.d.ts +42 -0
  122. package/dist/core/game-loop.d.ts.map +1 -0
  123. package/dist/core/game-loop.js +167 -0
  124. package/dist/core/seeded-random.d.ts +69 -0
  125. package/dist/core/seeded-random.d.ts.map +1 -0
  126. package/dist/core/seeded-random.js +121 -0
  127. package/dist/core/system-runner.d.ts +120 -0
  128. package/dist/core/system-runner.d.ts.map +1 -0
  129. package/dist/core/system-runner.js +297 -0
  130. package/dist/core/types.d.ts +92 -0
  131. package/dist/core/types.d.ts.map +1 -0
  132. package/dist/core/types.js +25 -0
  133. package/dist/data/data-asset.d.ts +101 -0
  134. package/dist/data/data-asset.d.ts.map +1 -0
  135. package/dist/data/data-asset.js +122 -0
  136. package/dist/data/data-check-core.d.ts +110 -0
  137. package/dist/data/data-check-core.d.ts.map +1 -0
  138. package/dist/data/data-check-core.js +178 -0
  139. package/dist/data/data-ref.d.ts +79 -0
  140. package/dist/data/data-ref.d.ts.map +1 -0
  141. package/dist/data/data-ref.js +130 -0
  142. package/dist/data/vite-plugin-data.d.ts +79 -0
  143. package/dist/data/vite-plugin-data.d.ts.map +1 -0
  144. package/dist/data/vite-plugin-data.js +217 -0
  145. package/dist/dev/console-bridge.d.ts +22 -0
  146. package/dist/dev/console-bridge.d.ts.map +1 -0
  147. package/dist/dev/console-bridge.js +71 -0
  148. package/dist/dev/debug-draw.d.ts +24 -0
  149. package/dist/dev/debug-draw.d.ts.map +1 -0
  150. package/dist/dev/debug-draw.js +73 -0
  151. package/dist/dev/logger.d.ts +30 -0
  152. package/dist/dev/logger.d.ts.map +1 -0
  153. package/dist/dev/logger.js +90 -0
  154. package/dist/dev/performance-profiler.d.ts +60 -0
  155. package/dist/dev/performance-profiler.d.ts.map +1 -0
  156. package/dist/dev/performance-profiler.js +181 -0
  157. package/dist/dev/webgl-gpu-timer.d.ts +8 -0
  158. package/dist/dev/webgl-gpu-timer.d.ts.map +1 -0
  159. package/dist/dev/webgl-gpu-timer.js +52 -0
  160. package/dist/ecs/component-manager.d.ts +205 -0
  161. package/dist/ecs/component-manager.d.ts.map +1 -0
  162. package/dist/ecs/component-manager.js +706 -0
  163. package/dist/ecs/game-component.d.ts +146 -0
  164. package/dist/ecs/game-component.d.ts.map +1 -0
  165. package/dist/ecs/game-component.js +141 -0
  166. package/dist/ecs/hmr-swap-report.d.ts +53 -0
  167. package/dist/ecs/hmr-swap-report.d.ts.map +1 -0
  168. package/dist/ecs/hmr-swap-report.js +55 -0
  169. package/dist/humanoid/bake.operation.d.ts +119 -0
  170. package/dist/humanoid/bake.operation.d.ts.map +1 -0
  171. package/dist/humanoid/bake.operation.js +228 -0
  172. package/dist/humanoid/body.d.ts +101 -0
  173. package/dist/humanoid/body.d.ts.map +1 -0
  174. package/dist/humanoid/body.js +530 -0
  175. package/dist/humanoid/clips.d.ts +62 -0
  176. package/dist/humanoid/clips.d.ts.map +1 -0
  177. package/dist/humanoid/clips.js +121 -0
  178. package/dist/humanoid/compose.d.ts +75 -0
  179. package/dist/humanoid/compose.d.ts.map +1 -0
  180. package/dist/humanoid/compose.js +176 -0
  181. package/dist/humanoid/generate.d.ts +92 -0
  182. package/dist/humanoid/generate.d.ts.map +1 -0
  183. package/dist/humanoid/generate.js +124 -0
  184. package/dist/humanoid/index.d.ts +24 -0
  185. package/dist/humanoid/index.d.ts.map +1 -0
  186. package/dist/humanoid/index.js +18 -0
  187. package/dist/humanoid/schema.d.ts +35 -0
  188. package/dist/humanoid/schema.d.ts.map +1 -0
  189. package/dist/humanoid/schema.js +87 -0
  190. package/dist/humanoid/skeleton.d.ts +103 -0
  191. package/dist/humanoid/skeleton.d.ts.map +1 -0
  192. package/dist/humanoid/skeleton.js +289 -0
  193. package/dist/index.d.ts +37 -0
  194. package/dist/index.d.ts.map +1 -0
  195. package/dist/index.js +30 -0
  196. package/dist/input/input-manager.d.ts +945 -0
  197. package/dist/input/input-manager.d.ts.map +1 -0
  198. package/dist/input/input-manager.js +2207 -0
  199. package/dist/input/input-types.d.ts +174 -0
  200. package/dist/input/input-types.d.ts.map +1 -0
  201. package/dist/input/input-types.js +1 -0
  202. package/dist/input/prompt-labels.d.ts +21 -0
  203. package/dist/input/prompt-labels.d.ts.map +1 -0
  204. package/dist/input/prompt-labels.js +121 -0
  205. package/dist/input/rebind-controller.d.ts +59 -0
  206. package/dist/input/rebind-controller.d.ts.map +1 -0
  207. package/dist/input/rebind-controller.js +85 -0
  208. package/dist/input/schema.d.ts +16 -0
  209. package/dist/input/schema.d.ts.map +1 -0
  210. package/dist/input/schema.js +228 -0
  211. package/dist/loader.d.ts +43 -0
  212. package/dist/loader.d.ts.map +1 -0
  213. package/dist/loader.js +59 -0
  214. package/dist/manifest/index.d.ts +5 -0
  215. package/dist/manifest/index.d.ts.map +1 -0
  216. package/dist/manifest/index.js +8 -0
  217. package/dist/manifest/load-file.d.ts +4 -0
  218. package/dist/manifest/load-file.d.ts.map +1 -0
  219. package/dist/manifest/load-file.js +14 -0
  220. package/dist/manifest/load.d.ts +144 -0
  221. package/dist/manifest/load.d.ts.map +1 -0
  222. package/dist/manifest/load.js +273 -0
  223. package/dist/manifest/schema.d.ts +230 -0
  224. package/dist/manifest/schema.d.ts.map +1 -0
  225. package/dist/manifest/schema.js +394 -0
  226. package/dist/physics/collision-system.d.ts +41 -0
  227. package/dist/physics/collision-system.d.ts.map +1 -0
  228. package/dist/physics/collision-system.js +64 -0
  229. package/dist/physics/physics-registry.d.ts +45 -0
  230. package/dist/physics/physics-registry.d.ts.map +1 -0
  231. package/dist/physics/physics-registry.js +65 -0
  232. package/dist/physics/transform-writer.d.ts +16 -0
  233. package/dist/physics/transform-writer.d.ts.map +1 -0
  234. package/dist/physics/transform-writer.js +38 -0
  235. package/dist/physics/trigger-dispatch.d.ts +24 -0
  236. package/dist/physics/trigger-dispatch.d.ts.map +1 -0
  237. package/dist/physics/trigger-dispatch.js +80 -0
  238. package/dist/react/game-state.d.ts +156 -0
  239. package/dist/react/game-state.d.ts.map +1 -0
  240. package/dist/react/game-state.js +222 -0
  241. package/dist/react/root-adapter.d.ts +11 -0
  242. package/dist/react/root-adapter.d.ts.map +1 -0
  243. package/dist/react/root-adapter.js +41 -0
  244. package/dist/react/unmanaged-root-detector.d.ts +12 -0
  245. package/dist/react/unmanaged-root-detector.d.ts.map +1 -0
  246. package/dist/react/unmanaged-root-detector.js +45 -0
  247. package/dist/react/use-data.d.ts +60 -0
  248. package/dist/react/use-data.d.ts.map +1 -0
  249. package/dist/react/use-data.js +101 -0
  250. package/dist/react/use-selection.d.ts +75 -0
  251. package/dist/react/use-selection.d.ts.map +1 -0
  252. package/dist/react/use-selection.js +90 -0
  253. package/dist/render/auto-batcher.d.ts +34 -0
  254. package/dist/render/auto-batcher.d.ts.map +1 -0
  255. package/dist/render/auto-batcher.js +140 -0
  256. package/dist/render/render-batch-system.d.ts +33 -0
  257. package/dist/render/render-batch-system.d.ts.map +1 -0
  258. package/dist/render/render-batch-system.js +230 -0
  259. package/dist/render/render-features.d.ts +47 -0
  260. package/dist/render/render-features.d.ts.map +1 -0
  261. package/dist/render/render-features.js +105 -0
  262. package/dist/render/render-settings.d.ts +36 -0
  263. package/dist/render/render-settings.d.ts.map +1 -0
  264. package/dist/render/render-settings.js +51 -0
  265. package/dist/runtime/create-runtime.d.ts +249 -0
  266. package/dist/runtime/create-runtime.d.ts.map +1 -0
  267. package/dist/runtime/create-runtime.js +641 -0
  268. package/dist/runtime/debug-bridge.d.ts +257 -0
  269. package/dist/runtime/debug-bridge.d.ts.map +1 -0
  270. package/dist/runtime/debug-bridge.js +224 -0
  271. package/dist/runtime/debug-registry.d.ts +288 -0
  272. package/dist/runtime/debug-registry.d.ts.map +1 -0
  273. package/dist/runtime/debug-registry.js +513 -0
  274. package/dist/runtime/frame-selector-cache.d.ts +41 -0
  275. package/dist/runtime/frame-selector-cache.d.ts.map +1 -0
  276. package/dist/runtime/frame-selector-cache.js +65 -0
  277. package/dist/runtime/game.d.ts +496 -0
  278. package/dist/runtime/game.d.ts.map +1 -0
  279. package/dist/runtime/game.js +741 -0
  280. package/dist/runtime/gameplay-rng-trap.d.ts +48 -0
  281. package/dist/runtime/gameplay-rng-trap.d.ts.map +1 -0
  282. package/dist/runtime/gameplay-rng-trap.js +96 -0
  283. package/dist/runtime/input-router.d.ts +78 -0
  284. package/dist/runtime/input-router.d.ts.map +1 -0
  285. package/dist/runtime/input-router.js +171 -0
  286. package/dist/runtime/mount-game.d.ts +129 -0
  287. package/dist/runtime/mount-game.d.ts.map +1 -0
  288. package/dist/runtime/mount-game.js +152 -0
  289. package/dist/runtime/mount-manifest.d.ts +173 -0
  290. package/dist/runtime/mount-manifest.d.ts.map +1 -0
  291. package/dist/runtime/mount-manifest.js +297 -0
  292. package/dist/runtime/render-audio-control.d.ts +110 -0
  293. package/dist/runtime/render-audio-control.d.ts.map +1 -0
  294. package/dist/runtime/render-audio-control.js +111 -0
  295. package/dist/runtime/render-control.d.ts +291 -0
  296. package/dist/runtime/render-control.d.ts.map +1 -0
  297. package/dist/runtime/render-control.js +264 -0
  298. package/dist/runtime/render-seed.d.ts +57 -0
  299. package/dist/runtime/render-seed.d.ts.map +1 -0
  300. package/dist/runtime/render-seed.js +74 -0
  301. package/dist/runtime/state-bridge.d.ts +61 -0
  302. package/dist/runtime/state-bridge.d.ts.map +1 -0
  303. package/dist/runtime/state-bridge.js +63 -0
  304. package/dist/runtime/types.d.ts +253 -0
  305. package/dist/runtime/types.d.ts.map +1 -0
  306. package/dist/runtime/types.js +1 -0
  307. package/dist/scene/asset-loaders.d.ts +79 -0
  308. package/dist/scene/asset-loaders.d.ts.map +1 -0
  309. package/dist/scene/asset-loaders.js +141 -0
  310. package/dist/scene/asset-paths.d.ts +11 -0
  311. package/dist/scene/asset-paths.d.ts.map +1 -0
  312. package/dist/scene/asset-paths.js +108 -0
  313. package/dist/scene/asset-ref-check.d.ts +88 -0
  314. package/dist/scene/asset-ref-check.d.ts.map +1 -0
  315. package/dist/scene/asset-ref-check.js +214 -0
  316. package/dist/scene/asset-registry.d.ts +38 -0
  317. package/dist/scene/asset-registry.d.ts.map +1 -0
  318. package/dist/scene/asset-registry.js +66 -0
  319. package/dist/scene/collider-dimensions.d.ts +63 -0
  320. package/dist/scene/collider-dimensions.d.ts.map +1 -0
  321. package/dist/scene/collider-dimensions.js +98 -0
  322. package/dist/scene/component-registry.d.ts +22 -0
  323. package/dist/scene/component-registry.d.ts.map +1 -0
  324. package/dist/scene/component-registry.js +37 -0
  325. package/dist/scene/defaults.d.ts +252 -0
  326. package/dist/scene/defaults.d.ts.map +1 -0
  327. package/dist/scene/defaults.js +151 -0
  328. package/dist/scene/geometries/index.d.ts +8 -0
  329. package/dist/scene/geometries/index.d.ts.map +1 -0
  330. package/dist/scene/geometries/index.js +7 -0
  331. package/dist/scene/geometries/terrain.d.ts +2 -0
  332. package/dist/scene/geometries/terrain.d.ts.map +1 -0
  333. package/dist/scene/geometries/terrain.js +37 -0
  334. package/dist/scene/geometry-registry.d.ts +24 -0
  335. package/dist/scene/geometry-registry.d.ts.map +1 -0
  336. package/dist/scene/geometry-registry.js +20 -0
  337. package/dist/scene/instance-registry.d.ts +36 -0
  338. package/dist/scene/instance-registry.d.ts.map +1 -0
  339. package/dist/scene/instance-registry.js +55 -0
  340. package/dist/scene/instancers/grid.d.ts +2 -0
  341. package/dist/scene/instancers/grid.d.ts.map +1 -0
  342. package/dist/scene/instancers/grid.js +36 -0
  343. package/dist/scene/instancers/index.d.ts +8 -0
  344. package/dist/scene/instancers/index.d.ts.map +1 -0
  345. package/dist/scene/instancers/index.js +7 -0
  346. package/dist/scene/light-camera-factory.d.ts +23 -0
  347. package/dist/scene/light-camera-factory.d.ts.map +1 -0
  348. package/dist/scene/light-camera-factory.js +68 -0
  349. package/dist/scene/material-factory.d.ts +17 -0
  350. package/dist/scene/material-factory.d.ts.map +1 -0
  351. package/dist/scene/material-factory.js +197 -0
  352. package/dist/scene/material-registry.d.ts +40 -0
  353. package/dist/scene/material-registry.d.ts.map +1 -0
  354. package/dist/scene/material-registry.js +44 -0
  355. package/dist/scene/materials/index.d.ts +8 -0
  356. package/dist/scene/materials/index.d.ts.map +1 -0
  357. package/dist/scene/materials/index.js +7 -0
  358. package/dist/scene/materials/water.d.ts +2 -0
  359. package/dist/scene/materials/water.d.ts.map +1 -0
  360. package/dist/scene/materials/water.js +54 -0
  361. package/dist/scene/parse.d.ts +23 -0
  362. package/dist/scene/parse.d.ts.map +1 -0
  363. package/dist/scene/parse.js +179 -0
  364. package/dist/scene/particles-factory.d.ts +33 -0
  365. package/dist/scene/particles-factory.d.ts.map +1 -0
  366. package/dist/scene/particles-factory.js +282 -0
  367. package/dist/scene/scene-apply.d.ts +109 -0
  368. package/dist/scene/scene-apply.d.ts.map +1 -0
  369. package/dist/scene/scene-apply.js +370 -0
  370. package/dist/scene/scene-diff-schema.d.ts +285 -0
  371. package/dist/scene/scene-diff-schema.d.ts.map +1 -0
  372. package/dist/scene/scene-diff-schema.js +92 -0
  373. package/dist/scene/scene-diff-types.d.ts +40 -0
  374. package/dist/scene/scene-diff-types.d.ts.map +1 -0
  375. package/dist/scene/scene-diff-types.js +14 -0
  376. package/dist/scene/scene-loader.d.ts +167 -0
  377. package/dist/scene/scene-loader.d.ts.map +1 -0
  378. package/dist/scene/scene-loader.js +1211 -0
  379. package/dist/scene/scene-query.d.ts +11 -0
  380. package/dist/scene/scene-query.d.ts.map +1 -0
  381. package/dist/scene/scene-query.js +63 -0
  382. package/dist/scene/scene-types.d.ts +10 -0
  383. package/dist/scene/scene-types.d.ts.map +1 -0
  384. package/dist/scene/scene-types.js +8 -0
  385. package/dist/scene/scene-version.d.ts +26 -0
  386. package/dist/scene/scene-version.d.ts.map +1 -0
  387. package/dist/scene/scene-version.js +34 -0
  388. package/dist/scene/schema/animation.d.ts +8 -0
  389. package/dist/scene/schema/animation.d.ts.map +1 -0
  390. package/dist/scene/schema/animation.js +42 -0
  391. package/dist/scene/schema/audio.d.ts +13 -0
  392. package/dist/scene/schema/audio.d.ts.map +1 -0
  393. package/dist/scene/schema/audio.js +22 -0
  394. package/dist/scene/schema/camera.d.ts +28 -0
  395. package/dist/scene/schema/camera.d.ts.map +1 -0
  396. package/dist/scene/schema/camera.js +17 -0
  397. package/dist/scene/schema/collider.d.ts +40 -0
  398. package/dist/scene/schema/collider.d.ts.map +1 -0
  399. package/dist/scene/schema/collider.js +55 -0
  400. package/dist/scene/schema/entity-ref.d.ts +31 -0
  401. package/dist/scene/schema/entity-ref.d.ts.map +1 -0
  402. package/dist/scene/schema/entity-ref.js +61 -0
  403. package/dist/scene/schema/entity.d.ts +1036 -0
  404. package/dist/scene/schema/entity.d.ts.map +1 -0
  405. package/dist/scene/schema/entity.js +153 -0
  406. package/dist/scene/schema/environment.d.ts +425 -0
  407. package/dist/scene/schema/environment.d.ts.map +1 -0
  408. package/dist/scene/schema/environment.js +357 -0
  409. package/dist/scene/schema/index.d.ts +37 -0
  410. package/dist/scene/schema/index.d.ts.map +1 -0
  411. package/dist/scene/schema/index.js +19 -0
  412. package/dist/scene/schema/instances.d.ts +14 -0
  413. package/dist/scene/schema/instances.d.ts.map +1 -0
  414. package/dist/scene/schema/instances.js +28 -0
  415. package/dist/scene/schema/joint.d.ts +23 -0
  416. package/dist/scene/schema/joint.d.ts.map +1 -0
  417. package/dist/scene/schema/joint.js +23 -0
  418. package/dist/scene/schema/light.d.ts +38 -0
  419. package/dist/scene/schema/light.d.ts.map +1 -0
  420. package/dist/scene/schema/light.js +26 -0
  421. package/dist/scene/schema/material.d.ts +199 -0
  422. package/dist/scene/schema/material.d.ts.map +1 -0
  423. package/dist/scene/schema/material.js +103 -0
  424. package/dist/scene/schema/mesh.d.ts +48 -0
  425. package/dist/scene/schema/mesh.d.ts.map +1 -0
  426. package/dist/scene/schema/mesh.js +82 -0
  427. package/dist/scene/schema/particles.d.ts +2178 -0
  428. package/dist/scene/schema/particles.d.ts.map +1 -0
  429. package/dist/scene/schema/particles.js +321 -0
  430. package/dist/scene/schema/physics.d.ts +56 -0
  431. package/dist/scene/schema/physics.d.ts.map +1 -0
  432. package/dist/scene/schema/physics.js +37 -0
  433. package/dist/scene/schema/scene-file.d.ts +303 -0
  434. package/dist/scene/schema/scene-file.d.ts.map +1 -0
  435. package/dist/scene/schema/scene-file.js +256 -0
  436. package/dist/scene/schema/shadow.d.ts +28 -0
  437. package/dist/scene/schema/shadow.d.ts.map +1 -0
  438. package/dist/scene/schema/shadow.js +20 -0
  439. package/dist/scene/schema/spline.d.ts +25 -0
  440. package/dist/scene/schema/spline.d.ts.map +1 -0
  441. package/dist/scene/schema/spline.js +15 -0
  442. package/dist/scene/schema/tuples.d.ts +12 -0
  443. package/dist/scene/schema/tuples.d.ts.map +1 -0
  444. package/dist/scene/schema/tuples.js +14 -0
  445. package/dist/scene/user-data.d.ts +185 -0
  446. package/dist/scene/user-data.d.ts.map +1 -0
  447. package/dist/scene/user-data.js +144 -0
  448. package/dist/setup/setup-audio.d.ts +20 -0
  449. package/dist/setup/setup-audio.d.ts.map +1 -0
  450. package/dist/setup/setup-audio.js +41 -0
  451. package/dist/setup/setup-particles.d.ts +17 -0
  452. package/dist/setup/setup-particles.d.ts.map +1 -0
  453. package/dist/setup/setup-particles.js +16 -0
  454. package/dist/setup/setup-physics.d.ts +25 -0
  455. package/dist/setup/setup-physics.d.ts.map +1 -0
  456. package/dist/setup/setup-physics.js +51 -0
  457. package/dist/setup/setup-renderer.d.ts +69 -0
  458. package/dist/setup/setup-renderer.d.ts.map +1 -0
  459. package/dist/setup/setup-renderer.js +363 -0
  460. package/dist/tools/define-tool.d.ts +130 -0
  461. package/dist/tools/define-tool.d.ts.map +1 -0
  462. package/dist/tools/define-tool.js +96 -0
  463. package/dist/world2d/authoring-2d.d.ts +80 -0
  464. package/dist/world2d/authoring-2d.d.ts.map +1 -0
  465. package/dist/world2d/authoring-2d.js +195 -0
  466. package/dist/world2d/capture-to-scene2d.d.ts +5 -0
  467. package/dist/world2d/capture-to-scene2d.d.ts.map +1 -0
  468. package/dist/world2d/capture-to-scene2d.js +49 -0
  469. package/dist/world2d/collision-2d.d.ts +52 -0
  470. package/dist/world2d/collision-2d.d.ts.map +1 -0
  471. package/dist/world2d/collision-2d.js +70 -0
  472. package/dist/world2d/components-2d.d.ts +47 -0
  473. package/dist/world2d/components-2d.d.ts.map +1 -0
  474. package/dist/world2d/components-2d.js +77 -0
  475. package/dist/world2d/index.d.ts +34 -0
  476. package/dist/world2d/index.d.ts.map +1 -0
  477. package/dist/world2d/index.js +32 -0
  478. package/dist/world2d/ingest-iframe-2d.d.ts +82 -0
  479. package/dist/world2d/ingest-iframe-2d.d.ts.map +1 -0
  480. package/dist/world2d/ingest-iframe-2d.js +166 -0
  481. package/dist/world2d/ingest2d.d.ts +97 -0
  482. package/dist/world2d/ingest2d.d.ts.map +1 -0
  483. package/dist/world2d/ingest2d.js +40 -0
  484. package/dist/world2d/physics2d-registry.d.ts +24 -0
  485. package/dist/world2d/physics2d-registry.d.ts.map +1 -0
  486. package/dist/world2d/physics2d-registry.js +38 -0
  487. package/dist/world2d/pixi-game-adapter.d.ts +107 -0
  488. package/dist/world2d/pixi-game-adapter.d.ts.map +1 -0
  489. package/dist/world2d/pixi-game-adapter.js +210 -0
  490. package/dist/world2d/pixi-surface.d.ts +39 -0
  491. package/dist/world2d/pixi-surface.d.ts.map +1 -0
  492. package/dist/world2d/pixi-surface.js +47 -0
  493. package/dist/world2d/scene-capture-2d.d.ts +43 -0
  494. package/dist/world2d/scene-capture-2d.d.ts.map +1 -0
  495. package/dist/world2d/scene-capture-2d.js +92 -0
  496. package/dist/world2d/scene2d-loader.d.ts +27 -0
  497. package/dist/world2d/scene2d-loader.d.ts.map +1 -0
  498. package/dist/world2d/scene2d-loader.js +275 -0
  499. package/dist/world2d/schema/entity2d.d.ts +102 -0
  500. package/dist/world2d/schema/entity2d.d.ts.map +1 -0
  501. package/dist/world2d/schema/entity2d.js +119 -0
  502. package/dist/world2d/schema/physics2d.d.ts +46 -0
  503. package/dist/world2d/schema/physics2d.d.ts.map +1 -0
  504. package/dist/world2d/schema/physics2d.js +45 -0
  505. package/dist/world2d/schema/sprite.d.ts +42 -0
  506. package/dist/world2d/schema/sprite.d.ts.map +1 -0
  507. package/dist/world2d/schema/sprite.js +63 -0
  508. package/dist/world2d/schema/tilemap.d.ts +15 -0
  509. package/dist/world2d/schema/tilemap.d.ts.map +1 -0
  510. package/dist/world2d/schema/tilemap.js +19 -0
  511. package/dist/world2d/schema/tuples2d.d.ts +20 -0
  512. package/dist/world2d/schema/tuples2d.d.ts.map +1 -0
  513. package/dist/world2d/schema/tuples2d.js +19 -0
  514. package/dist/world2d/system-adapters-2d.d.ts +16 -0
  515. package/dist/world2d/system-adapters-2d.d.ts.map +1 -0
  516. package/dist/world2d/system-adapters-2d.js +37 -0
  517. package/dist/world2d/transform-writer-2d.d.ts +16 -0
  518. package/dist/world2d/transform-writer-2d.d.ts.map +1 -0
  519. package/dist/world2d/transform-writer-2d.js +22 -0
  520. package/dist/world2d/types.d.ts +59 -0
  521. package/dist/world2d/types.d.ts.map +1 -0
  522. package/dist/world2d/types.js +1 -0
  523. package/package.json +1 -1
@@ -0,0 +1,179 @@
1
+ import { checkSceneVersionInRange } from './scene-version';
2
+ import { InstancesFileSchema, MaterialFileSchema, PrefabFileSchema, SceneFileSchema, } from './schema';
3
+ export class SceneParseError extends Error {
4
+ issues;
5
+ /** The offending file's path/URL, when the caller knows it (T4.6). */
6
+ filePath;
7
+ constructor(issues, filePath) {
8
+ const msg = issues.map((i) => ` ${i.path.join('.')}: ${i.message}`).join('\n');
9
+ const header = filePath ? `Scene validation failed (${filePath}):` : 'Scene validation failed:';
10
+ super(`${header}\n${msg}`);
11
+ this.name = 'SceneParseError';
12
+ this.issues = issues;
13
+ this.filePath = filePath;
14
+ }
15
+ }
16
+ // ---------------------------------------------------------------------------
17
+ // D8 — removed-format migration guard: declarative property tracks
18
+ // (`animation.tracks`) were deleted (spec §3.2/§10 D8; Theatre — `@theatre/core`
19
+ // — is the sole authored continuous-animation source now). `SceneAnimationSchema`
20
+ // no longer declares a `tracks` field at all (so the generated JSON schema stays
21
+ // clean), which means Zod's default object mode would otherwise silently STRIP
22
+ // an authored `animation.tracks` rather than reporting it — violating Global AC
23
+ // §6 ("Removed formats fail with a concise migration/removal error rather than
24
+ // being partially read"). This walks the RAW pre-Zod JSON (Zod would already
25
+ // have stripped `tracks` by the time any schema-level check could see it) and
26
+ // throws a `SceneParseError` before Zod ever parses the data. Matches on the
27
+ // literal key `animation` (singular, an object) carrying a `tracks` property —
28
+ // this is deliberately narrower than Scene UI's unrelated, RETAINED
29
+ // `ui[].animations[].tracks` (plural `animations`), which this guard must not
30
+ // trip on.
31
+ // ---------------------------------------------------------------------------
32
+ /** True when `value` is a plain object (not an array) carrying a `tracks` property — the shape
33
+ * `SceneAnimationSchema` used to declare before D8 deleted it. */
34
+ function isRemovedTracksAnimation(value) {
35
+ return !!value && typeof value === 'object' && !Array.isArray(value) && 'tracks' in value;
36
+ }
37
+ function findRemovedPropertyTrackPathInArray(node, path) {
38
+ for (let i = 0; i < node.length; i++) {
39
+ const hit = findRemovedPropertyTrackPath(node[i], `${path}[${i}]`);
40
+ if (hit)
41
+ return hit;
42
+ }
43
+ return undefined;
44
+ }
45
+ function findRemovedPropertyTrackPathInObject(obj, path) {
46
+ if (isRemovedTracksAnimation(obj['animation'])) {
47
+ return `${path ? `${path}.` : ''}animation.tracks`;
48
+ }
49
+ for (const [key, value] of Object.entries(obj)) {
50
+ const hit = findRemovedPropertyTrackPath(value, path ? `${path}.${key}` : key);
51
+ if (hit)
52
+ return hit;
53
+ }
54
+ return undefined;
55
+ }
56
+ function findRemovedPropertyTrackPath(node, path) {
57
+ if (Array.isArray(node))
58
+ return findRemovedPropertyTrackPathInArray(node, path);
59
+ if (node && typeof node === 'object') {
60
+ return findRemovedPropertyTrackPathInObject(node, path);
61
+ }
62
+ return undefined;
63
+ }
64
+ function assertNoRemovedPropertyTracks(json, filePath) {
65
+ const hit = findRemovedPropertyTrackPath(json, '');
66
+ if (!hit)
67
+ return;
68
+ const issue = {
69
+ code: 'custom',
70
+ message: 'property tracks were removed; author continuous animation with Theatre (@theatre/core) ' +
71
+ 'instead — see docs/AI-NATIVE-AUTHORING-IMPLEMENTATION-SPEC.md §3.2/§10 D8.',
72
+ path: hit.split('.'),
73
+ };
74
+ throw new SceneParseError([issue], filePath);
75
+ }
76
+ // ---------------------------------------------------------------------------
77
+ // E5 — removed-format migration guard: the AnimGraph state-machine runtime,
78
+ // `.animgraph.json` format, and `SceneAnimationSchema.animGraph` field were
79
+ // deleted (spec §3.3/§11 E5; XState + native Three `AnimationMixer` — see
80
+ // `xstate-animation-binding.ts` — replace it). `SceneAnimationSchema` no
81
+ // longer declares an `animGraph` field at all (so it carries zero trace in
82
+ // the generated JSON schema), which means Zod's default object mode would
83
+ // otherwise silently STRIP an authored `animation.animGraph` rather than
84
+ // reporting it — violating Global AC §6. Mirrors
85
+ // `assertNoRemovedPropertyTracks` above exactly: walks the RAW pre-Zod JSON
86
+ // and throws a `SceneParseError` before Zod ever parses the data.
87
+ // ---------------------------------------------------------------------------
88
+ /** True when `value` is a plain object (not an array) carrying an `animGraph` property — the
89
+ * shape `SceneAnimationSchema` used to declare before E5 deleted it. */
90
+ function isRemovedAnimGraphAnimation(value) {
91
+ return !!value && typeof value === 'object' && !Array.isArray(value) && 'animGraph' in value;
92
+ }
93
+ function findRemovedAnimGraphPathInArray(node, path) {
94
+ for (let i = 0; i < node.length; i++) {
95
+ const hit = findRemovedAnimGraphPath(node[i], `${path}[${i}]`);
96
+ if (hit)
97
+ return hit;
98
+ }
99
+ return undefined;
100
+ }
101
+ function findRemovedAnimGraphPathInObject(obj, path) {
102
+ if (isRemovedAnimGraphAnimation(obj['animation'])) {
103
+ return `${path ? `${path}.` : ''}animation.animGraph`;
104
+ }
105
+ for (const [key, value] of Object.entries(obj)) {
106
+ const hit = findRemovedAnimGraphPath(value, path ? `${path}.${key}` : key);
107
+ if (hit)
108
+ return hit;
109
+ }
110
+ return undefined;
111
+ }
112
+ function findRemovedAnimGraphPath(node, path) {
113
+ if (Array.isArray(node))
114
+ return findRemovedAnimGraphPathInArray(node, path);
115
+ if (node && typeof node === 'object') {
116
+ return findRemovedAnimGraphPathInObject(node, path);
117
+ }
118
+ return undefined;
119
+ }
120
+ function assertNoRemovedAnimGraph(json, filePath) {
121
+ const hit = findRemovedAnimGraphPath(json, '');
122
+ if (!hit)
123
+ return;
124
+ const issue = {
125
+ code: 'custom',
126
+ message: 'AnimGraph was removed; drive character animation with an XState animation machine instead ' +
127
+ '— see docs/AI-NATIVE-AUTHORING-IMPLEMENTATION-SPEC.md §3.3/§5.6/§11 E5 and ' +
128
+ 'packages/engine/src/animation/xstate-animation-binding.ts.',
129
+ path: hit.split('.'),
130
+ };
131
+ throw new SceneParseError([issue], filePath);
132
+ }
133
+ export function parseSceneFile(json, filePath) {
134
+ assertNoRemovedPropertyTracks(json, filePath);
135
+ assertNoRemovedAnimGraph(json, filePath);
136
+ const result = SceneFileSchema.safeParse(json);
137
+ if (!result.success) {
138
+ throw new SceneParseError(result.error.issues, filePath);
139
+ }
140
+ // Post-Zod-parse range check (T2.3/D3 §1.E) — the Zod shape stays a bare
141
+ // `z.number()`; this is where the file-format `version` axis is actually
142
+ // read/enforced.
143
+ checkSceneVersionInRange(result.data.version, 'scene');
144
+ return result.data;
145
+ }
146
+ export function parsePrefabFile(json, filePath) {
147
+ assertNoRemovedPropertyTracks(json, filePath);
148
+ assertNoRemovedAnimGraph(json, filePath);
149
+ const result = PrefabFileSchema.safeParse(json);
150
+ if (!result.success) {
151
+ throw new SceneParseError(result.error.issues, filePath);
152
+ }
153
+ checkSceneVersionInRange(result.data.version, 'prefab');
154
+ return result.data;
155
+ }
156
+ /**
157
+ * Parse a `.mat.json` shared material asset (T4.6). Unlike scene/prefab files,
158
+ * there is no version-range gate yet for this format — `MaterialFileSchema`'s
159
+ * `version` field is RESERVED (see `schema-consumption-map.ts`).
160
+ */
161
+ export function parseMaterialFile(json, filePath) {
162
+ const result = MaterialFileSchema.safeParse(json);
163
+ if (!result.success) {
164
+ throw new SceneParseError(result.error.issues, filePath);
165
+ }
166
+ return result.data;
167
+ }
168
+ /**
169
+ * Parse a `.instances.json` instance-transform asset (F3,
170
+ * docs/VSCN-STRUCTURAL-GAPS-DESIGN.md). Mirrors `parseMaterialFile` exactly —
171
+ * no version-range gate (the format is a bare tuple array, no `version` field).
172
+ */
173
+ export function parseInstancesFile(json, filePath) {
174
+ const result = InstancesFileSchema.safeParse(json);
175
+ if (!result.success) {
176
+ throw new SceneParseError(result.error.issues, filePath);
177
+ }
178
+ return result.data;
179
+ }
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Converts SceneParticles JSON → three.quarks ParticleSystem.
3
+ *
4
+ * Shared between the editor entity-factory and the runtime scene-loader.
5
+ * The schema mirrors quarks' native JSON format, so most fields pass through
6
+ * directly to quarks' fromJSON or constructor methods.
7
+ */
8
+ import * as THREE from 'three';
9
+ import { type BatchedRenderer, ParticleSystem } from 'three.quarks';
10
+ import type { SceneParticles } from './scene-types';
11
+ export interface ParticleSystemResult {
12
+ /** The emitter Object3D (add to scene for transform) */
13
+ emitter: THREE.Object3D;
14
+ /** The ParticleSystem instance (register with BatchedRenderer) */
15
+ system: ParticleSystem;
16
+ }
17
+ /**
18
+ * Create a three.quarks ParticleSystem from SceneParticles JSON data.
19
+ */
20
+ export declare function createParticleSystemFromData(data: SceneParticles): ParticleSystemResult;
21
+ /**
22
+ * Register a particle system with a BatchedRenderer.
23
+ */
24
+ export declare function registerParticleSystem(batchedRenderer: BatchedRenderer, system: ParticleSystem): void;
25
+ /**
26
+ * Unregister a particle system from a BatchedRenderer.
27
+ */
28
+ export declare function unregisterParticleSystem(batchedRenderer: BatchedRenderer, system: ParticleSystem): void;
29
+ /**
30
+ * Default particle data for creating a new particle emitter via AddSectionMenu.
31
+ */
32
+ export declare function defaultParticlesData(): SceneParticles;
33
+ //# sourceMappingURL=particles-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"particles-factory.d.ts","sourceRoot":"","sources":["../../src/scene/particles-factory.ts"],"names":[],"mappings":"AACA;;;;;;GAMG;AA6BH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,KAAK,eAAe,EAAE,cAAc,EAAc,MAAM,cAAc,CAAC;AAChF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AA+NpD,MAAM,WAAW,oBAAoB;IACnC,wDAAwD;IACxD,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC;IACxB,kEAAkE;IAClE,MAAM,EAAE,cAAc,CAAC;CACxB;AAED;;GAEG;AAEH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,cAAc,GAAG,oBAAoB,CAwDvF;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,eAAe,EAAE,eAAe,EAChC,MAAM,EAAE,cAAc,GACrB,IAAI,CAEN;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,eAAe,EAAE,eAAe,EAChC,MAAM,EAAE,cAAc,GACrB,IAAI,CAEN;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,cAAc,CA6BrD"}
@@ -0,0 +1,282 @@
1
+ // biome-ignore-all lint/suspicious/noExplicitAny: quarks' API uses untyped FunctionJSON internally; our Zod types are structurally compatible but TS can't unify them
2
+ /**
3
+ * Converts SceneParticles JSON → three.quarks ParticleSystem.
4
+ *
5
+ * Shared between the editor entity-factory and the runtime scene-loader.
6
+ * The schema mirrors quarks' native JSON format, so most fields pass through
7
+ * directly to quarks' fromJSON or constructor methods.
8
+ */
9
+ import { ApplyForce, ChangeEmitDirection, CircleEmitter, ColorGeneratorFromJSON, ColorOverLife, ConeEmitter, DonutEmitter, ForceOverLife, FrameOverLife, GravityForce, GridEmitter, HemisphereEmitter, LimitSpeedOverLife, Noise, OrbitOverLife, PointEmitter, Vector3 as QVector3, RectangleEmitter, RotationOverLife, SizeOverLife, SpeedOverLife, SphereEmitter, TurbulenceField, ValueGeneratorFromJSON, WidthOverLength, } from 'quarks.core';
10
+ import * as THREE from 'three';
11
+ import { ParticleSystem, RenderMode } from 'three.quarks';
12
+ // --- Render mode mapping ---
13
+ const RENDER_MODE_MAP = {
14
+ billboard: RenderMode.BillBoard,
15
+ stretchedBillboard: RenderMode.StretchedBillBoard,
16
+ mesh: RenderMode.Mesh,
17
+ trail: RenderMode.Trail,
18
+ horizontalBillboard: RenderMode.HorizontalBillBoard,
19
+ verticalBillboard: RenderMode.VerticalBillBoard,
20
+ };
21
+ // --- Texture loader (shared cache) ---
22
+ import { textureLoader } from '../loader';
23
+ const particleTexCache = new Map();
24
+ function loadParticleTexture(url) {
25
+ const cached = particleTexCache.get(url);
26
+ if (cached)
27
+ return cached;
28
+ const tex = textureLoader.load(url);
29
+ particleTexCache.set(url, tex);
30
+ return tex;
31
+ }
32
+ // --- Helpers ---
33
+ /** Strip keys with undefined values so exactOptionalPropertyTypes is satisfied. */
34
+ function defined(obj) {
35
+ const result = {};
36
+ for (const [k, v] of Object.entries(obj)) {
37
+ if (v !== undefined)
38
+ result[k] = v;
39
+ }
40
+ return result;
41
+ }
42
+ // --- Emitter shape ---
43
+ function createEmitterShape(json) {
44
+ switch (json.type) {
45
+ case 'point':
46
+ return new PointEmitter();
47
+ case 'sphere':
48
+ return new SphereEmitter(defined({ radius: json.radius, arc: json.arc, thickness: json.thickness }));
49
+ case 'hemisphere':
50
+ return new HemisphereEmitter(defined({ radius: json.radius, arc: json.arc, thickness: json.thickness }));
51
+ case 'cone':
52
+ return new ConeEmitter(defined({
53
+ radius: json.radius,
54
+ arc: json.arc,
55
+ thickness: json.thickness,
56
+ angle: json.angle,
57
+ }));
58
+ case 'circle':
59
+ return new CircleEmitter(defined({ radius: json.radius, arc: json.arc, thickness: json.thickness }));
60
+ case 'donut':
61
+ return new DonutEmitter(defined({
62
+ radius: json.radius,
63
+ arc: json.arc,
64
+ thickness: json.thickness,
65
+ donutRadius: json.donutRadius,
66
+ }));
67
+ case 'rectangle':
68
+ return new RectangleEmitter(defined({ width: json.width, height: json.height, thickness: json.thickness }));
69
+ case 'grid':
70
+ return new GridEmitter(defined({ width: json.width, height: json.height, column: json.column, row: json.row }));
71
+ }
72
+ }
73
+ // --- Value / Color generators ---
74
+ // Our Zod-inferred types are structurally identical to quarks' FunctionJSON
75
+ // but TypeScript can't unify them, so we cast through the untyped bridge.
76
+ function valueGen(json) {
77
+ return ValueGeneratorFromJSON(json);
78
+ }
79
+ function colorGen(json) {
80
+ return ColorGeneratorFromJSON(json);
81
+ }
82
+ // --- Behaviors ---
83
+ function createBehavior(json) {
84
+ switch (json.type) {
85
+ case 'ApplyForce':
86
+ return new ApplyForce(new QVector3(json.direction[0], json.direction[1], json.direction[2]), valueGen(json.magnitude));
87
+ case 'ColorOverLife':
88
+ return new ColorOverLife(colorGen(json.color));
89
+ case 'SizeOverLife':
90
+ return new SizeOverLife(valueGen(json.size));
91
+ case 'SpeedOverLife':
92
+ return new SpeedOverLife(valueGen(json.speed));
93
+ case 'RotationOverLife':
94
+ return new RotationOverLife(valueGen(json.angularVelocity));
95
+ case 'ForceOverLife':
96
+ return new ForceOverLife(valueGen(json.x), valueGen(json.y), valueGen(json.z));
97
+ case 'OrbitOverLife':
98
+ return new OrbitOverLife(valueGen(json.orbitSpeed), json.axis ? new QVector3(json.axis[0], json.axis[1], json.axis[2]) : undefined);
99
+ case 'Noise':
100
+ return new Noise(valueGen(json.frequency), valueGen(json.power), json.positionAmount ? valueGen(json.positionAmount) : undefined, json.rotationAmount ? valueGen(json.rotationAmount) : undefined);
101
+ case 'TurbulenceField':
102
+ return new TurbulenceField(new QVector3(json.scale[0], json.scale[1], json.scale[2]), json.octaves, new QVector3(json.velocityMultiplier[0], json.velocityMultiplier[1], json.velocityMultiplier[2]), new QVector3(json.timeScale[0], json.timeScale[1], json.timeScale[2]));
103
+ case 'FrameOverLife':
104
+ return new FrameOverLife(valueGen(json.frame));
105
+ case 'LimitSpeedOverLife':
106
+ return new LimitSpeedOverLife(valueGen(json.speed), json.dampen);
107
+ case 'ChangeEmitDirection':
108
+ return new ChangeEmitDirection(valueGen(json.angle));
109
+ case 'GravityForce':
110
+ return new GravityForce(new QVector3(json.center[0], json.center[1], json.center[2]), json.magnitude);
111
+ case 'WidthOverLength':
112
+ return new WidthOverLength(valueGen(json.width));
113
+ }
114
+ }
115
+ // --- Material ---
116
+ function createParticleMaterial(mat) {
117
+ const textures = {};
118
+ if (mat.map)
119
+ textures['map'] = loadParticleTexture(mat.map);
120
+ const blending = mat.blending === 'normal' ? THREE.NormalBlending : THREE.AdditiveBlending;
121
+ const transparent = mat.transparent !== false;
122
+ const depthWrite = mat.depthWrite ?? false;
123
+ const side = mat.side === 'back'
124
+ ? THREE.BackSide
125
+ : mat.side === 'double'
126
+ ? THREE.DoubleSide
127
+ : THREE.FrontSide;
128
+ if (mat.type === 'standard') {
129
+ return new THREE.MeshStandardMaterial({
130
+ color: mat.color ?? '#ffffff',
131
+ ...textures,
132
+ blending,
133
+ transparent,
134
+ depthWrite,
135
+ side,
136
+ });
137
+ }
138
+ return new THREE.MeshBasicMaterial({
139
+ color: mat.color ?? '#ffffff',
140
+ ...textures,
141
+ blending,
142
+ transparent,
143
+ depthWrite,
144
+ side,
145
+ });
146
+ }
147
+ // --- Default sprite texture (soft radial gradient) ---
148
+ let _defaultSpriteTex = null;
149
+ function getDefaultSpriteTex() {
150
+ if (_defaultSpriteTex)
151
+ return _defaultSpriteTex;
152
+ const canvas = document.createElement('canvas');
153
+ canvas.width = 16;
154
+ canvas.height = 16;
155
+ const c2d = canvas.getContext('2d');
156
+ const grad = c2d.createRadialGradient(8, 8, 0, 8, 8, 8);
157
+ grad.addColorStop(0, 'rgba(255,255,255,1)');
158
+ grad.addColorStop(1, 'rgba(255,255,255,0)');
159
+ c2d.fillStyle = grad;
160
+ c2d.fillRect(0, 0, 16, 16);
161
+ _defaultSpriteTex = new THREE.CanvasTexture(canvas);
162
+ return _defaultSpriteTex;
163
+ }
164
+ /**
165
+ * Create a three.quarks ParticleSystem from SceneParticles JSON data.
166
+ */
167
+ // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: straightforward field-by-field mapping
168
+ export function createParticleSystemFromData(data) {
169
+ const material = createParticleMaterial(data.material);
170
+ // Apply default sprite if no texture specified
171
+ if (!data.material.map && 'map' in material) {
172
+ material.map = getDefaultSpriteTex();
173
+ }
174
+ // Build params, strip undefined keys for exactOptionalPropertyTypes compat
175
+ const params = { material };
176
+ if (data.autoDestroy != null)
177
+ params['autoDestroy'] = data.autoDestroy;
178
+ if (data.looping != null)
179
+ params['looping'] = data.looping;
180
+ if (data.prewarm != null)
181
+ params['prewarm'] = data.prewarm;
182
+ if (data.duration != null)
183
+ params['duration'] = data.duration;
184
+ if (data.shape)
185
+ params['shape'] = createEmitterShape(data.shape);
186
+ if (data.startLife)
187
+ params['startLife'] = valueGen(data.startLife);
188
+ if (data.startSpeed)
189
+ params['startSpeed'] = valueGen(data.startSpeed);
190
+ if (data.startSize)
191
+ params['startSize'] = valueGen(data.startSize);
192
+ if (data.startRotation)
193
+ params['startRotation'] = valueGen(data.startRotation);
194
+ if (data.startColor)
195
+ params['startColor'] = colorGen(data.startColor);
196
+ if (data.startTileIndex)
197
+ params['startTileIndex'] = valueGen(data.startTileIndex);
198
+ // Trail mode requires startLength inside rendererEmitterSettings, not as a top-level param
199
+ if (data.renderMode === 'trail' && data.startLength) {
200
+ params['rendererEmitterSettings'] = { startLength: valueGen(data.startLength) };
201
+ }
202
+ if (data.emissionOverTime)
203
+ params['emissionOverTime'] = valueGen(data.emissionOverTime);
204
+ if (data.emissionOverDistance)
205
+ params['emissionOverDistance'] = valueGen(data.emissionOverDistance);
206
+ if (data.emissionBursts) {
207
+ params['emissionBursts'] = data.emissionBursts.map((b) => ({
208
+ time: b.time,
209
+ count: valueGen(b.count),
210
+ cycle: b.cycle ?? 1,
211
+ interval: b.interval ?? 0,
212
+ probability: b.probability ?? 1,
213
+ }));
214
+ }
215
+ if (data.behaviors)
216
+ params['behaviors'] = data.behaviors.map(createBehavior);
217
+ if (data.renderMode != null)
218
+ params['renderMode'] = RENDER_MODE_MAP[data.renderMode];
219
+ if (data.worldSpace != null)
220
+ params['worldSpace'] = data.worldSpace;
221
+ if (data.renderOrder != null)
222
+ params['renderOrder'] = data.renderOrder;
223
+ if (data.uTileCount != null)
224
+ params['uTileCount'] = data.uTileCount;
225
+ if (data.vTileCount != null)
226
+ params['vTileCount'] = data.vTileCount;
227
+ if (data.blendTiles != null)
228
+ params['blendTiles'] = data.blendTiles;
229
+ if (data.softParticles != null)
230
+ params['softParticles'] = data.softParticles;
231
+ if (data.softFarFade != null)
232
+ params['softFarFade'] = data.softFarFade;
233
+ if (data.softNearFade != null)
234
+ params['softNearFade'] = data.softNearFade;
235
+ const ps = new ParticleSystem(params);
236
+ return { emitter: ps.emitter, system: ps };
237
+ }
238
+ /**
239
+ * Register a particle system with a BatchedRenderer.
240
+ */
241
+ export function registerParticleSystem(batchedRenderer, system) {
242
+ batchedRenderer.addSystem(system);
243
+ }
244
+ /**
245
+ * Unregister a particle system from a BatchedRenderer.
246
+ */
247
+ export function unregisterParticleSystem(batchedRenderer, system) {
248
+ batchedRenderer.deleteSystem(system);
249
+ }
250
+ /**
251
+ * Default particle data for creating a new particle emitter via AddSectionMenu.
252
+ */
253
+ export function defaultParticlesData() {
254
+ return {
255
+ looping: true,
256
+ duration: 2,
257
+ shape: { type: 'cone', radius: 0.1, angle: 0.3 },
258
+ startLife: { type: 'IntervalValue', a: 0.5, b: 1.5 },
259
+ startSpeed: { type: 'IntervalValue', a: 1, b: 3 },
260
+ startSize: { type: 'IntervalValue', a: 0.05, b: 0.15 },
261
+ startColor: {
262
+ type: 'ConstantColor',
263
+ color: { r: 1, g: 0.8, b: 0.2, a: 1 },
264
+ },
265
+ emissionOverTime: { type: 'ConstantValue', value: 30 },
266
+ behaviors: [
267
+ {
268
+ type: 'SizeOverLife',
269
+ size: {
270
+ type: 'PiecewiseBezier',
271
+ functions: [{ function: { p0: 1, p1: 0.67, p2: 0.33, p3: 0 }, start: 0 }],
272
+ },
273
+ },
274
+ ],
275
+ material: {
276
+ type: 'basic',
277
+ blending: 'additive',
278
+ transparent: true,
279
+ depthWrite: false,
280
+ },
281
+ };
282
+ }
@@ -0,0 +1,109 @@
1
+ /**
2
+ * `applyDiff` — the exact inverse of `diffScene` (T4.5, `vgai apply-diff`).
3
+ *
4
+ * `diffScene` (packages/editor/src/scene-diff.ts) computes a `SceneDiff` from
5
+ * two `SceneFile`s. This module does the other direction: given ONE
6
+ * `SceneFile` and a `SceneDiff`, produce the `SceneFile` the diff describes —
7
+ * a pure function, no editor/live-scene state involved.
8
+ *
9
+ * DEPENDENCY-DIRECTION NOTE (why this lives in the engine, not next to
10
+ * `diffScene`): the natural home for `applyDiff` is beside `diffScene` in
11
+ * `packages/editor/src/`. But the CLI (`packages/vgai-cli`) is the caller —
12
+ * `vgai apply-diff <scene> <patch>` — and `packages/vgai-cli/package.json`
13
+ * does not depend on `@vgai/editor` today (it depends on `@vgai/editor-sdk`,
14
+ * a thin RPC client for a *running* editor server, and `create-vgai-project`
15
+ * — neither pulls in editor source). Adding a cli→editor edge purely to reach
16
+ * one pure function would be a real, new dependency inversion (the T3.7 row
17
+ * for `deploy.ts` recorded the opposite call deliberately staying out for the
18
+ * same reason). `@vgai/engine`, by contrast, is already a dependency of
19
+ * `@vgai/editor` (one-directional: editor → engine) and is trivially addable
20
+ * to vgai-cli (mirroring `packages/editor/template/validate-scenes.ts`, which
21
+ * already imports `@vgai/engine/scene/parse` by its real published subpath).
22
+ * So: `DiffOp`/`SceneDiff` (the shared TYPES) and `applyDiff`/`SceneDiffSchema`
23
+ * (the new CODE) live in the engine; `scene-diff.ts` keeps its `diffScene`
24
+ * implementation where it is and re-exports the two type names, so no editor
25
+ * call site changes. Net edge added: vgai-cli → @vgai/engine (already the
26
+ * direction every other package depends on engine). Zero new editor edges.
27
+ *
28
+ * ROUND-TRIP LAW: for any two scenes A, B — `applyDiff(A, diffScene(A, B))`
29
+ * is deep-equal to B, WITH ONE NORMALIZATION: an entity whose `children`
30
+ * becomes empty is left with `children` omitted (not `children: []`) —
31
+ * matching the convention `cleanDocument`/`serializeScene`
32
+ * (packages/editor/src/scene-serializer.ts) already use for saved scene
33
+ * files. If B's own file happened to spell "no children" as a literal
34
+ * `children: []` rather than omitting the key, a byte-level diff would show
35
+ * that one field; every other field, and the full entity tree/order, matches
36
+ * exactly. This holds because `diffScene` emits an explicit `move` op for
37
+ * ANY entity whose absolute sibling index changes for ANY reason — not just
38
+ * reparenting, but also a sibling being added/removed/reordered earlier in
39
+ * the same array — so `applyDiff` never has to guess whether an untouched
40
+ * entity's position shifted; every position-relevant entity carries an
41
+ * explicit target index in the FINAL array.
42
+ *
43
+ * OP-ORDERING RULE (why applying `diff.ops` in array order would be wrong,
44
+ * and what this function does instead):
45
+ *
46
+ * 1. Detach every `move` target from wherever it currently sits — BEFORE
47
+ * processing any `remove`. Proof this matters: consider "remove parent
48
+ * with moved-out child" — parent P is deleted in the new doc, but one
49
+ * of P's old children, C, survives (reparented elsewhere). `diffScene`
50
+ * necessarily emits BOTH `{ remove: P }` and `{ move: C, parentId: ... }`
51
+ * (C's parentId can't still be P, since P doesn't exist in the new doc,
52
+ * so a parentId change — hence a move op — is guaranteed). If `remove P`
53
+ * ran first, it would delete P's whole subtree, including C, before C's
54
+ * `move` op ever got to detach it. Detaching every mover first means C
55
+ * is already pulled out of P's subtree by the time `remove P` runs, so
56
+ * only what's genuinely being deleted is deleted.
57
+ * 2. Process `remove` ops. A remove target that's already gone (not found)
58
+ * is NOT an error IF it was swept away as a descendant of an earlier
59
+ * remove in the SAME diff — `diffScene` lists every removed id
60
+ * independently (both a removed parent AND its removed descendants each
61
+ * get their own `remove` op, since `flattenEntities` flattens every
62
+ * level regardless of ancestor state). A remove target not found and
63
+ * not swept is a genuine error (bad id).
64
+ * 3. Build a complete id → node resolution map covering EVERY entity that
65
+ * will exist in the output: the stationary survivors (walked fresh from
66
+ * what's left of the tree), then a freshly-created node object for each
67
+ * `add` (children stripped — see below), then the already-detached node
68
+ * for each `move`. Because this map is built in full before any
69
+ * placement happens, a node object exists (and is resolvable as a
70
+ * parent) from the moment it's created, independent of whether it has
71
+ * itself been spliced into ITS OWN parent's array yet. This is what
72
+ * makes "add-under-added-parent" (a newly-added parent with newly-added
73
+ * children in the same diff) work with no dependency/topological-sort
74
+ * logic: a child's `add`/`move` op resolves its `parentId` against this
75
+ * map regardless of which op appears first in `diff.ops`.
76
+ * 4. Placement: group `add` + `move` ops by target parentId, sort each
77
+ * group ascending by `index`, then splice one at a time into the target
78
+ * array in that order. Inserting in ascending order of FINAL target
79
+ * index into an array that already holds every untouched sibling in
80
+ * their final relative order (untouched siblings never move — any
81
+ * absolute-index change gets its own `move` op, per the round-trip-law
82
+ * note above) reconstructs the exact final array: by induction, every
83
+ * element with a smaller final index than the one being inserted is
84
+ * already in the array, so splicing at `index` places it correctly
85
+ * relative to all of them, whether the array started empty (a brand
86
+ * new parent) or partially populated (survivors of an existing parent).
87
+ * 5. `update` ops last (order relative to placement doesn't matter — they
88
+ * mutate an object by reference, found via the same id map, regardless
89
+ * of where in the tree that reference currently lives).
90
+ *
91
+ * Every thrown error is an `ApplyDiffError` naming the 0-based index into
92
+ * `diff.ops`, the op's `type`, and the entity id involved — enough for an
93
+ * agent to locate and fix the offending op from the message alone.
94
+ */
95
+ import type { DiffOp, SceneDiff } from './scene-diff-types';
96
+ import type { SceneFile } from './scene-types';
97
+ export declare class ApplyDiffError extends Error {
98
+ readonly opIndex: number;
99
+ readonly opType: DiffOp['type'];
100
+ readonly entityId: string;
101
+ constructor(message: string, opIndex: number, opType: DiffOp['type'], entityId: string);
102
+ }
103
+ /**
104
+ * Apply a `SceneDiff` to a `SceneFile`, returning a NEW `SceneFile` (input is
105
+ * not mutated). See the module jsdoc above for the round-trip law and the
106
+ * op-ordering rule/proof.
107
+ */
108
+ export declare function applyDiff(scene: SceneFile, diff: SceneDiff): SceneFile;
109
+ //# sourceMappingURL=scene-apply.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scene-apply.d.ts","sourceRoot":"","sources":["../../src/scene/scene-apply.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6FG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAe,SAAS,EAAE,MAAM,eAAe,CAAC;AAE5D,qBAAa,cAAe,SAAQ,KAAK;IACvC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAEd,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,MAAM;CAOvF;AA8FD;;;;GAIG;AAEH,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,GAAG,SAAS,CAoMtE"}