@zephyr3d/scene 0.9.27 → 0.10.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 (502) hide show
  1. package/README.md +60 -27
  2. package/dist/animation/animation_bank.js +634 -0
  3. package/dist/animation/animation_bank.js.map +1 -0
  4. package/dist/animation/animation_bank_gpu.js +256 -0
  5. package/dist/animation/animation_bank_gpu.js.map +1 -0
  6. package/dist/animation/animationset.js +54 -0
  7. package/dist/animation/animationset.js.map +1 -1
  8. package/dist/animation/cloth/gpu_cloth_component.js +406 -0
  9. package/dist/animation/cloth/gpu_cloth_component.js.map +1 -0
  10. package/dist/animation/cloth/gpu_cloth_system.js +332 -202
  11. package/dist/animation/cloth/gpu_cloth_system.js.map +1 -1
  12. package/dist/animation/gpu_animation_driver.js +289 -0
  13. package/dist/animation/gpu_animation_driver.js.map +1 -0
  14. package/dist/animation/joint_dynamics/collision.js +112 -1
  15. package/dist/animation/joint_dynamics/collision.js.map +1 -1
  16. package/dist/animation/joint_dynamics/controller.js +6 -0
  17. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  18. package/dist/animation/joint_dynamics/joint_dynamics_system.js +11 -0
  19. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
  20. package/dist/animation/joint_dynamics/solver.js +50 -12
  21. package/dist/animation/joint_dynamics/solver.js.map +1 -1
  22. package/dist/animation/joint_dynamics/types.js.map +1 -1
  23. package/dist/animation/skeleton.js +279 -55
  24. package/dist/animation/skeleton.js.map +1 -1
  25. package/dist/animation/skin_palette_atlas.js +252 -0
  26. package/dist/animation/skin_palette_atlas.js.map +1 -0
  27. package/dist/animation/spring/multi_chain_spring_system.js +298 -38
  28. package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
  29. package/dist/animation/spring/spring_chain.js +2 -0
  30. package/dist/animation/spring/spring_chain.js.map +1 -1
  31. package/dist/animation/spring/spring_collider.js +159 -21
  32. package/dist/animation/spring/spring_collider.js.map +1 -1
  33. package/dist/animation/spring/spring_particle.js +1 -0
  34. package/dist/animation/spring/spring_particle.js.map +1 -1
  35. package/dist/animation/spring/spring_solver.js +173 -0
  36. package/dist/animation/spring/spring_solver.js.map +1 -0
  37. package/dist/animation/spring/spring_system.js +249 -24
  38. package/dist/animation/spring/spring_system.js.map +1 -1
  39. package/dist/animation/spring_modifier.js +32 -1
  40. package/dist/animation/spring_modifier.js.map +1 -1
  41. package/dist/app/app.js +26 -0
  42. package/dist/app/app.js.map +1 -1
  43. package/dist/app/engine.js +86 -15
  44. package/dist/app/engine.js.map +1 -1
  45. package/dist/app/gamepad.js +191 -0
  46. package/dist/app/gamepad.js.map +1 -0
  47. package/dist/app/inputactions.js +271 -0
  48. package/dist/app/inputactions.js.map +1 -0
  49. package/dist/app/inputmgr.js +331 -22
  50. package/dist/app/inputmgr.js.map +1 -1
  51. package/dist/app/loading.js +138 -0
  52. package/dist/app/loading.js.map +1 -0
  53. package/dist/app/pipelinecache.js +209 -0
  54. package/dist/app/pipelinecache.js.map +1 -0
  55. package/dist/app/runtimescript.js +25 -0
  56. package/dist/app/runtimescript.js.map +1 -1
  57. package/dist/app/scriptingsystem.js +54 -0
  58. package/dist/app/scriptingsystem.js.map +1 -1
  59. package/dist/app/scriptregistry.js +7 -2
  60. package/dist/app/scriptregistry.js.map +1 -1
  61. package/dist/asset/asset_manifest.js +59 -0
  62. package/dist/asset/asset_manifest.js.map +1 -0
  63. package/dist/asset/asset_preload.js +258 -0
  64. package/dist/asset/asset_preload.js.map +1 -0
  65. package/dist/asset/assetmanager.js +117 -65
  66. package/dist/asset/assetmanager.js.map +1 -1
  67. package/dist/asset/loaders/ktx2/basis/LICENSE +201 -0
  68. package/dist/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  69. package/dist/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  70. package/dist/asset/loaders/ktx2/basis_location.js +17 -0
  71. package/dist/asset/loaders/ktx2/basis_location.js.map +1 -0
  72. package/dist/asset/loaders/ktx2/ktx2_loader.js +88 -0
  73. package/dist/asset/loaders/ktx2/ktx2_loader.js.map +1 -0
  74. package/dist/asset/loaders/ktx2/ktx2_targets.js +118 -0
  75. package/dist/asset/loaders/ktx2/ktx2_targets.js.map +1 -0
  76. package/dist/asset/loaders/ktx2/transcoder_pool.js +259 -0
  77. package/dist/asset/loaders/ktx2/transcoder_pool.js.map +1 -0
  78. package/dist/asset/mesh_lod_builder.js +104 -0
  79. package/dist/asset/mesh_lod_builder.js.map +1 -0
  80. package/dist/asset/mesh_settings.js +111 -0
  81. package/dist/asset/mesh_settings.js.map +1 -0
  82. package/dist/asset/meshopt_decoder.js +18 -0
  83. package/dist/asset/meshopt_decoder.js.map +1 -0
  84. package/dist/asset/meshopt_simplifier.js +26 -0
  85. package/dist/asset/meshopt_simplifier.js.map +1 -0
  86. package/dist/asset/model.js +171 -1
  87. package/dist/asset/model.js.map +1 -1
  88. package/dist/asset/texture_settings.js +231 -0
  89. package/dist/asset/texture_settings.js.map +1 -0
  90. package/dist/asset/zmsh_binary.js +131 -0
  91. package/dist/asset/zmsh_binary.js.map +1 -0
  92. package/dist/asset/zsdf_binary.js +111 -0
  93. package/dist/asset/zsdf_binary.js.map +1 -0
  94. package/dist/blitter/bilateralblur.js +1 -2
  95. package/dist/blitter/bilateralblur.js.map +1 -1
  96. package/dist/blitter/gaussianblur.js +1 -6
  97. package/dist/blitter/gaussianblur.js.map +1 -1
  98. package/dist/camera/base.js +31 -10
  99. package/dist/camera/base.js.map +1 -1
  100. package/dist/camera/camera.js +104 -178
  101. package/dist/camera/camera.js.map +1 -1
  102. package/dist/camera/follow.js +342 -0
  103. package/dist/camera/follow.js.map +1 -0
  104. package/dist/camera/fps.js +9 -7
  105. package/dist/camera/fps.js.map +1 -1
  106. package/dist/camera/orbit.js +46 -19
  107. package/dist/camera/orbit.js.map +1 -1
  108. package/dist/index.d.ts +25436 -15990
  109. package/dist/index.js +65 -11
  110. package/dist/index.js.map +1 -1
  111. package/dist/material/blinn.js +3 -0
  112. package/dist/material/blinn.js.map +1 -1
  113. package/dist/material/eye.js +1 -1
  114. package/dist/material/eye.js.map +1 -1
  115. package/dist/material/hair.js +2 -3
  116. package/dist/material/hair.js.map +1 -1
  117. package/dist/material/lambert.js +4 -1
  118. package/dist/material/lambert.js.map +1 -1
  119. package/dist/material/material.js +66 -4
  120. package/dist/material/material.js.map +1 -1
  121. package/dist/material/meshmaterial.js +118 -45
  122. package/dist/material/meshmaterial.js.map +1 -1
  123. package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
  124. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  125. package/dist/material/mixins/lightmodel/lambert.js +1 -1
  126. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  127. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +34 -61
  128. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  129. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +16 -2
  130. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  131. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +2 -1
  132. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  133. package/dist/material/mixins/lit.js +191 -83
  134. package/dist/material/mixins/lit.js.map +1 -1
  135. package/dist/material/mixins/pbr/common.js +31 -206
  136. package/dist/material/mixins/pbr/common.js.map +1 -1
  137. package/dist/material/mtoon.js +1 -1
  138. package/dist/material/mtoon.js.map +1 -1
  139. package/dist/material/pbrmr.js +3 -0
  140. package/dist/material/pbrmr.js.map +1 -1
  141. package/dist/material/pbrsg.js +3 -0
  142. package/dist/material/pbrsg.js.map +1 -1
  143. package/dist/material/sdf_debug.js +78 -0
  144. package/dist/material/sdf_debug.js.map +1 -0
  145. package/dist/material/shader/helper.js +333 -191
  146. package/dist/material/shader/helper.js.map +1 -1
  147. package/dist/material/shader/terrain_blend.js +204 -43
  148. package/dist/material/shader/terrain_blend.js.map +1 -1
  149. package/dist/material/skin.js +331 -297
  150. package/dist/material/skin.js.map +1 -1
  151. package/dist/material/skinprofile.js +1058 -0
  152. package/dist/material/skinprofile.js.map +1 -0
  153. package/dist/material/sss.js +353 -0
  154. package/dist/material/sss.js.map +1 -0
  155. package/dist/material/sss_kernel.js +265 -0
  156. package/dist/material/sss_kernel.js.map +1 -0
  157. package/dist/material/sssprofile.js +879 -0
  158. package/dist/material/sssprofile.js.map +1 -0
  159. package/dist/material/subsurfaceprofile.js +4 -8
  160. package/dist/material/subsurfaceprofile.js.map +1 -1
  161. package/dist/material/terrain-cm.js +464 -188
  162. package/dist/material/terrain-cm.js.map +1 -1
  163. package/dist/material/unlit.js +3 -0
  164. package/dist/material/unlit.js.map +1 -1
  165. package/dist/material/water.js +1261 -1438
  166. package/dist/material/water.js.map +1 -1
  167. package/dist/node_modules/meshoptimizer/LICENSE +21 -0
  168. package/dist/node_modules/meshoptimizer/meshopt_decoder.js +197 -0
  169. package/dist/node_modules/meshoptimizer/meshopt_decoder.js.map +1 -0
  170. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js +677 -0
  171. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js.map +1 -0
  172. package/dist/physics/character.js +226 -0
  173. package/dist/physics/character.js.map +1 -0
  174. package/dist/physics/collider.js +209 -0
  175. package/dist/physics/collider.js.map +1 -0
  176. package/dist/physics/events.js +79 -0
  177. package/dist/physics/events.js.map +1 -0
  178. package/dist/physics/joint.js +272 -0
  179. package/dist/physics/joint.js.map +1 -0
  180. package/dist/physics/node_physics.js +234 -0
  181. package/dist/physics/node_physics.js.map +1 -0
  182. package/dist/physics/part.js +91 -0
  183. package/dist/physics/part.js.map +1 -0
  184. package/dist/physics/rigid_body.js +379 -0
  185. package/dist/physics/rigid_body.js.map +1 -0
  186. package/dist/physics/vehicle.js +335 -0
  187. package/dist/physics/vehicle.js.map +1 -0
  188. package/dist/physics/world.js +25 -0
  189. package/dist/physics/world.js.map +1 -0
  190. package/dist/posteffect/bloom.js +49 -14
  191. package/dist/posteffect/bloom.js.map +1 -1
  192. package/dist/posteffect/motionblur.js +106 -106
  193. package/dist/posteffect/motionblur.js.map +1 -1
  194. package/dist/posteffect/postsss.js +572 -0
  195. package/dist/posteffect/postsss.js.map +1 -0
  196. package/dist/posteffect/sao.js +2 -6
  197. package/dist/posteffect/sao.js.map +1 -1
  198. package/dist/posteffect/skinsss.js +605 -355
  199. package/dist/posteffect/skinsss.js.map +1 -1
  200. package/dist/posteffect/ssgi.js +91 -162
  201. package/dist/posteffect/ssgi.js.map +1 -1
  202. package/dist/posteffect/ssr.js +3 -11
  203. package/dist/posteffect/ssr.js.map +1 -1
  204. package/dist/posteffect/sss.js +4 -13
  205. package/dist/posteffect/sss.js.map +1 -1
  206. package/dist/posteffect/taa.js +1 -0
  207. package/dist/posteffect/taa.js.map +1 -1
  208. package/dist/render/abuffer_oit.js +3 -2
  209. package/dist/render/abuffer_oit.js.map +1 -1
  210. package/dist/render/clipmap.js +179 -64
  211. package/dist/render/clipmap.js.map +1 -1
  212. package/dist/render/cluster_light.js +958 -224
  213. package/dist/render/cluster_light.js.map +1 -1
  214. package/dist/render/cull_visitor.js +25 -5
  215. package/dist/render/cull_visitor.js.map +1 -1
  216. package/dist/render/debug_views.js +37 -0
  217. package/dist/render/debug_views.js.map +1 -0
  218. package/dist/render/depthpass.js +5 -1
  219. package/dist/render/depthpass.js.map +1 -1
  220. package/dist/render/drawable_mixin.js +53 -6
  221. package/dist/render/drawable_mixin.js.map +1 -1
  222. package/dist/render/dualdepthpeeling_oit.js +5 -5
  223. package/dist/render/dualdepthpeeling_oit.js.map +1 -1
  224. package/dist/render/envlight.js +196 -113
  225. package/dist/render/envlight.js.map +1 -1
  226. package/dist/render/fbm_wavegenerator.js +5 -10
  227. package/dist/render/fbm_wavegenerator.js.map +1 -1
  228. package/dist/render/fft_wavegenerator.js +247 -157
  229. package/dist/render/fft_wavegenerator.js.map +1 -1
  230. package/dist/render/gerstner_wavegenerator.js +16 -38
  231. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  232. package/dist/render/gi/probe_volume.js +1334 -0
  233. package/dist/render/gi/probe_volume.js.map +1 -0
  234. package/dist/render/gi/scene_gi.js +282 -0
  235. package/dist/render/gi/scene_gi.js.map +1 -0
  236. package/dist/render/gi/voxel_atlas.js +198 -0
  237. package/dist/render/gi/voxel_atlas.js.map +1 -0
  238. package/dist/render/gi/voxel_lighting.js +652 -0
  239. package/dist/render/gi/voxel_lighting.js.map +1 -0
  240. package/dist/render/gi/voxel_scene.js +642 -0
  241. package/dist/render/gi/voxel_scene.js.map +1 -0
  242. package/dist/render/gi/voxelize_pass.js +223 -0
  243. package/dist/render/gi/voxelize_pass.js.map +1 -0
  244. package/dist/render/globalbindgroup_allocator.js +3 -2
  245. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  246. package/dist/render/gpu_picking.js +9 -36
  247. package/dist/render/gpu_picking.js.map +1 -1
  248. package/dist/render/instance_culling.js +499 -0
  249. package/dist/render/instance_culling.js.map +1 -0
  250. package/dist/render/lightpass.js +19 -8
  251. package/dist/render/lightpass.js.map +1 -1
  252. package/dist/render/lod.js +46 -0
  253. package/dist/render/lod.js.map +1 -0
  254. package/dist/render/primitive.js +301 -9
  255. package/dist/render/primitive.js.map +1 -1
  256. package/dist/render/primitive_readback.js +209 -0
  257. package/dist/render/primitive_readback.js.map +1 -0
  258. package/dist/render/render_queue.js +162 -11
  259. package/dist/render/render_queue.js.map +1 -1
  260. package/dist/render/renderer.js +10 -7
  261. package/dist/render/renderer.js.map +1 -1
  262. package/dist/render/rendergraph/blackboard.js +14 -1
  263. package/dist/render/rendergraph/blackboard.js.map +1 -1
  264. package/dist/render/rendergraph/executor.js +136 -0
  265. package/dist/render/rendergraph/executor.js.map +1 -1
  266. package/dist/render/rendergraph/forward_plus_builder.js +272 -55
  267. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  268. package/dist/render/rendergraph/frame_graph_context.js +41 -0
  269. package/dist/render/rendergraph/frame_graph_context.js.map +1 -0
  270. package/dist/render/rendergraph/scene_render_context.js +31 -2
  271. package/dist/render/rendergraph/scene_render_context.js.map +1 -1
  272. package/dist/render/rendergraph/types.js.map +1 -1
  273. package/dist/render/renderpass.js +28 -5
  274. package/dist/render/renderpass.js.map +1 -1
  275. package/dist/render/sdf/box_allocator.js +98 -0
  276. package/dist/render/sdf/box_allocator.js.map +1 -0
  277. package/dist/render/sdf/global_sdf.js +865 -0
  278. package/dist/render/sdf/global_sdf.js.map +1 -0
  279. package/dist/render/sdf/scene_sdf.js +562 -0
  280. package/dist/render/sdf/scene_sdf.js.map +1 -0
  281. package/dist/render/sdf/sdf_atlas.js +227 -0
  282. package/dist/render/sdf/sdf_atlas.js.map +1 -0
  283. package/dist/render/sdf/sdf_programs.js +42 -0
  284. package/dist/render/sdf/sdf_programs.js.map +1 -0
  285. package/dist/render/sdf/sdf_view.js +199 -0
  286. package/dist/render/sdf/sdf_view.js.map +1 -0
  287. package/dist/render/sdf/waterline.js +610 -0
  288. package/dist/render/sdf/waterline.js.map +1 -0
  289. package/dist/render/shadow_mask_pass.js +142 -25
  290. package/dist/render/shadow_mask_pass.js.map +1 -1
  291. package/dist/render/shore_wave_generator.js +1193 -0
  292. package/dist/render/shore_wave_generator.js.map +1 -0
  293. package/dist/render/sky.js +516 -86
  294. package/dist/render/sky.js.map +1 -1
  295. package/dist/render/transmission_thickness_pass.js +477 -0
  296. package/dist/render/transmission_thickness_pass.js.map +1 -0
  297. package/dist/render/underwater.js +58 -158
  298. package/dist/render/underwater.js.map +1 -1
  299. package/dist/render/virtualtexture/virtual_texture.js +1214 -0
  300. package/dist/render/virtualtexture/virtual_texture.js.map +1 -0
  301. package/dist/render/volumetric_cloud/cloud_common.js +472 -0
  302. package/dist/render/volumetric_cloud/cloud_common.js.map +1 -0
  303. package/dist/render/volumetric_cloud/cloud_noise.js +189 -0
  304. package/dist/render/volumetric_cloud/cloud_noise.js.map +1 -0
  305. package/dist/render/volumetric_cloud/debug_view.js +131 -0
  306. package/dist/render/volumetric_cloud/debug_view.js.map +1 -0
  307. package/dist/render/volumetric_cloud/resources.js +380 -0
  308. package/dist/render/volumetric_cloud/resources.js.map +1 -0
  309. package/dist/render/volumetric_cloud/sky_cache.js +380 -0
  310. package/dist/render/volumetric_cloud/sky_cache.js.map +1 -0
  311. package/dist/render/volumetric_cloud/volumetric_cloud.js +318 -0
  312. package/dist/render/volumetric_cloud/volumetric_cloud.js.map +1 -0
  313. package/dist/render/water_caustics.js +134 -319
  314. package/dist/render/water_caustics.js.map +1 -1
  315. package/dist/render/water_foam.js +627 -0
  316. package/dist/render/water_foam.js.map +1 -0
  317. package/dist/render/water_interaction.js +1795 -0
  318. package/dist/render/water_interaction.js.map +1 -0
  319. package/dist/render/weightedblended_oit.js +3 -3
  320. package/dist/render/weightedblended_oit.js.map +1 -1
  321. package/dist/scene/basesprite.js +9 -4
  322. package/dist/scene/basesprite.js.map +1 -1
  323. package/dist/scene/batchgroup.js +108 -12
  324. package/dist/scene/batchgroup.js.map +1 -1
  325. package/dist/scene/environment.js +28 -7
  326. package/dist/scene/environment.js.map +1 -1
  327. package/dist/scene/foliage.js +1020 -0
  328. package/dist/scene/foliage.js.map +1 -0
  329. package/dist/scene/foliage_buckets.js +147 -0
  330. package/dist/scene/foliage_buckets.js.map +1 -0
  331. package/dist/scene/foliage_mask.js +358 -0
  332. package/dist/scene/foliage_mask.js.map +1 -0
  333. package/dist/scene/hair.js +15 -4
  334. package/dist/scene/hair.js.map +1 -1
  335. package/dist/scene/light.js +179 -13
  336. package/dist/scene/light.js.map +1 -1
  337. package/dist/scene/mesh.js +327 -45
  338. package/dist/scene/mesh.js.map +1 -1
  339. package/dist/scene/meshdrawable.js +6 -0
  340. package/dist/scene/meshdrawable.js.map +1 -1
  341. package/dist/scene/msdftext.js +9 -3
  342. package/dist/scene/msdftext.js.map +1 -1
  343. package/dist/scene/msdftextsprite.js +9 -3
  344. package/dist/scene/msdftextsprite.js.map +1 -1
  345. package/dist/scene/particlesys.js +8 -2
  346. package/dist/scene/particlesys.js.map +1 -1
  347. package/dist/scene/physics_settings.js +157 -0
  348. package/dist/scene/physics_settings.js.map +1 -0
  349. package/dist/scene/scene.js +190 -44
  350. package/dist/scene/scene.js.map +1 -1
  351. package/dist/scene/scene_node.js +147 -6
  352. package/dist/scene/scene_node.js.map +1 -1
  353. package/dist/scene/terrain-cm/bladegrassmaterial.js +735 -0
  354. package/dist/scene/terrain-cm/bladegrassmaterial.js.map +1 -0
  355. package/dist/scene/terrain-cm/grass.js +881 -42
  356. package/dist/scene/terrain-cm/grass.js.map +1 -1
  357. package/dist/scene/terrain-cm/grass_gpu.js +929 -0
  358. package/dist/scene/terrain-cm/grass_gpu.js.map +1 -0
  359. package/dist/scene/terrain-cm/grassmaterial.js +180 -9
  360. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  361. package/dist/scene/terrain-cm/terrain-cm.js +465 -36
  362. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  363. package/dist/scene/terrain-cm/terrain_gi_albedo.js +257 -0
  364. package/dist/scene/terrain-cm/terrain_gi_albedo.js.map +1 -0
  365. package/dist/scene/terrain-cm/terrain_rvt.js +395 -0
  366. package/dist/scene/terrain-cm/terrain_rvt.js.map +1 -0
  367. package/dist/scene/update_queue.js +54 -0
  368. package/dist/scene/update_queue.js.map +1 -0
  369. package/dist/scene/water.js +633 -268
  370. package/dist/scene/water.js.map +1 -1
  371. package/dist/scene/water_surface_sampler.js +324 -0
  372. package/dist/scene/water_surface_sampler.js.map +1 -0
  373. package/dist/scene/wind.js +317 -0
  374. package/dist/scene/wind.js.map +1 -0
  375. package/dist/shaders/atmosphere.js +388 -166
  376. package/dist/shaders/atmosphere.js.map +1 -1
  377. package/dist/shaders/fog.js +100 -32
  378. package/dist/shaders/fog.js.map +1 -1
  379. package/dist/shaders/gi.js +365 -0
  380. package/dist/shaders/gi.js.map +1 -0
  381. package/dist/shaders/ltc_rect.js +202 -0
  382. package/dist/shaders/ltc_rect.js.map +1 -0
  383. package/dist/shaders/misc.js +1 -10
  384. package/dist/shaders/misc.js.map +1 -1
  385. package/dist/shaders/noise.js +5 -1
  386. package/dist/shaders/noise.js.map +1 -1
  387. package/dist/shaders/probes.js +309 -0
  388. package/dist/shaders/probes.js.map +1 -0
  389. package/dist/shaders/sdf.js +537 -0
  390. package/dist/shaders/sdf.js.map +1 -0
  391. package/dist/shaders/shadow.js +104 -70
  392. package/dist/shaders/shadow.js.map +1 -1
  393. package/dist/shaders/skin_brdf.js +243 -0
  394. package/dist/shaders/skin_brdf.js.map +1 -0
  395. package/dist/shaders/ssgi.js +63 -0
  396. package/dist/shaders/ssgi.js.map +1 -0
  397. package/dist/shaders/ssgi_reprojection.js +118 -0
  398. package/dist/shaders/ssgi_reprojection.js.map +1 -0
  399. package/dist/shaders/ssr.js +6 -159
  400. package/dist/shaders/ssr.js.map +1 -1
  401. package/dist/shaders/temporal.js +38 -27
  402. package/dist/shaders/temporal.js.map +1 -1
  403. package/dist/shaders/water.js +32 -82
  404. package/dist/shaders/water.js.map +1 -1
  405. package/dist/shaders/water_medium.js +7 -21
  406. package/dist/shaders/water_medium.js.map +1 -1
  407. package/dist/shadow/dom.js +110 -19
  408. package/dist/shadow/dom.js.map +1 -1
  409. package/dist/shadow/esm.js +3 -3
  410. package/dist/shadow/esm.js.map +1 -1
  411. package/dist/shadow/pcf_opt.js +15 -48
  412. package/dist/shadow/pcf_opt.js.map +1 -1
  413. package/dist/shadow/pcf_pd.js +15 -53
  414. package/dist/shadow/pcf_pd.js.map +1 -1
  415. package/dist/shadow/pcss.js +34 -9
  416. package/dist/shadow/pcss.js.map +1 -1
  417. package/dist/shadow/shadow_impl.js +3 -8
  418. package/dist/shadow/shadow_impl.js.map +1 -1
  419. package/dist/shadow/shadow_region.js +40 -2
  420. package/dist/shadow/shadow_region.js.map +1 -1
  421. package/dist/shadow/shadowmapper.js +93 -53
  422. package/dist/shadow/shadowmapper.js.map +1 -1
  423. package/dist/shadow/ssm.js +18 -72
  424. package/dist/shadow/ssm.js.map +1 -1
  425. package/dist/shadow/vsm.js +3 -3
  426. package/dist/shadow/vsm.js.map +1 -1
  427. package/dist/shapes/shape.js +44 -1
  428. package/dist/shapes/shape.js.map +1 -1
  429. package/dist/utility/buoyancy.js +287 -0
  430. package/dist/utility/buoyancy.js.map +1 -0
  431. package/dist/utility/physical.js +10 -1
  432. package/dist/utility/physical.js.map +1 -1
  433. package/dist/utility/pmrem.js +17 -43
  434. package/dist/utility/pmrem.js.map +1 -1
  435. package/dist/utility/sdf/bake.js +435 -0
  436. package/dist/utility/sdf/bake.js.map +1 -0
  437. package/dist/utility/sdf/bvh.js +576 -0
  438. package/dist/utility/sdf/bvh.js.map +1 -0
  439. package/dist/utility/serialization/manager.js +34 -6
  440. package/dist/utility/serialization/manager.js.map +1 -1
  441. package/dist/utility/serialization/scene/animation.js +46 -5
  442. package/dist/utility/serialization/scene/animation.js.map +1 -1
  443. package/dist/utility/serialization/scene/batch.js +11 -4
  444. package/dist/utility/serialization/scene/batch.js.map +1 -1
  445. package/dist/utility/serialization/scene/camera.js +87 -254
  446. package/dist/utility/serialization/scene/camera.js.map +1 -1
  447. package/dist/utility/serialization/scene/cloth.js +25 -0
  448. package/dist/utility/serialization/scene/cloth.js.map +1 -0
  449. package/dist/utility/serialization/scene/common.js +14 -6
  450. package/dist/utility/serialization/scene/common.js.map +1 -1
  451. package/dist/utility/serialization/scene/foliage.js +821 -0
  452. package/dist/utility/serialization/scene/foliage.js.map +1 -0
  453. package/dist/utility/serialization/scene/hair.js +11 -4
  454. package/dist/utility/serialization/scene/hair.js.map +1 -1
  455. package/dist/utility/serialization/scene/light.js +115 -7
  456. package/dist/utility/serialization/scene/light.js.map +1 -1
  457. package/dist/utility/serialization/scene/material.js +388 -220
  458. package/dist/utility/serialization/scene/material.js.map +1 -1
  459. package/dist/utility/serialization/scene/mesh.js +69 -4
  460. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  461. package/dist/utility/serialization/scene/node.js +140 -5
  462. package/dist/utility/serialization/scene/node.js.map +1 -1
  463. package/dist/utility/serialization/scene/node_physics.js +1318 -0
  464. package/dist/utility/serialization/scene/node_physics.js.map +1 -0
  465. package/dist/utility/serialization/scene/particle.js +11 -4
  466. package/dist/utility/serialization/scene/particle.js.map +1 -1
  467. package/dist/utility/serialization/scene/physics.js +120 -0
  468. package/dist/utility/serialization/scene/physics.js.map +1 -0
  469. package/dist/utility/serialization/scene/primitive.js +124 -10
  470. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  471. package/dist/utility/serialization/scene/scene.js +1687 -51
  472. package/dist/utility/serialization/scene/scene.js.map +1 -1
  473. package/dist/utility/serialization/scene/sprite.js +11 -4
  474. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  475. package/dist/utility/serialization/scene/terrain.js +163 -33
  476. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  477. package/dist/utility/serialization/scene/text.js +11 -4
  478. package/dist/utility/serialization/scene/text.js.map +1 -1
  479. package/dist/utility/serialization/scene/water.js +1543 -264
  480. package/dist/utility/serialization/scene/water.js.map +1 -1
  481. package/dist/utility/serialization/types.js.map +1 -1
  482. package/dist/utility/shprojector.js +10 -22
  483. package/dist/utility/shprojector.js.map +1 -1
  484. package/dist/utility/textures/foam.js +170 -0
  485. package/dist/utility/textures/foam.js.map +1 -0
  486. package/dist/utility/textures/ggxlut.js +17 -43
  487. package/dist/utility/textures/ggxlut.js.map +1 -1
  488. package/dist/utility/textures/ltcdata.js +4 -4
  489. package/dist/utility/textures/ltcdata.js.map +1 -1
  490. package/dist/utility/textures/ltclut.js +16 -6
  491. package/dist/utility/textures/ltclut.js.map +1 -1
  492. package/dist/utility/unsupported.js +24 -0
  493. package/dist/utility/unsupported.js.map +1 -0
  494. package/dist/values.js +13 -1
  495. package/dist/values.js.map +1 -1
  496. package/package.json +25 -12
  497. package/src/asset/loaders/ktx2/basis/LICENSE +201 -0
  498. package/src/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  499. package/src/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  500. package/src/asset/meshoptimizer/LICENSE +21 -0
  501. package/dist/animation/joint_dynamics/convex_collider.js +0 -320
  502. package/dist/animation/joint_dynamics/convex_collider.js.map +0 -1
@@ -130,6 +130,9 @@ function getOwnRuntimeScriptProperties(ctor) {
130
130
  * before any host is attached.
131
131
  * - onAttached(host): Called each time this instance is attached to a host.
132
132
  * - onUpdate(deltaTime, elapsedTime): Called every frame/tick while attached.
133
+ * - onFixedUpdate(fixedDeltaTime): Called before each physics step, when a physics world runs.
134
+ * - onLateUpdate(deltaTime): Called once per frame after physics has stepped, before a
135
+ * `'late'` camera controller updates.
133
136
  * - onDetached(host): Called when detached from a host.
134
137
  * - onDestroy(): Called when the instance is no longer attached to any host
135
138
  * and is about to be discarded.
@@ -175,6 +178,28 @@ function getOwnRuntimeScriptProperties(ctor) {
175
178
  * @param _elapsedTime - Total elapsed time since start in seconds.
176
179
  */ onUpdate(_deltaTime, _elapsedTime) {}
177
180
  /**
181
+ * Called before each fixed-length physics step, while a physics world is
182
+ * simulating the host's scene.
183
+ *
184
+ * A frame may take several steps or none, so use this rather than `onUpdate`
185
+ * for logic that must run at the simulation's rate - a force applied here acts
186
+ * on this step only. Without a physics world it is never called.
187
+ *
188
+ * @param _fixedDeltaTime - Length of the step in seconds.
189
+ */ onFixedUpdate(_fixedDeltaTime) {}
190
+ /**
191
+ * Called once per frame after the host's scene has updated its nodes and its
192
+ * physics world has stepped and written poses back.
193
+ *
194
+ * Use this for logic that must see this frame's simulated poses, such as
195
+ * pointing a follow camera's target or placing effects on a moving body. It
196
+ * runs before a camera controller whose `updatePhase` is `'late'`. Unlike
197
+ * `onUpdate`, it is only called for scripts whose host is a scene being rendered,
198
+ * or a node in one.
199
+ *
200
+ * @param _deltaTime - Time since last frame in seconds.
201
+ */ onLateUpdate(_deltaTime) {}
202
+ /**
178
203
  * Called when the script is detached from a host.
179
204
  *
180
205
  * Use this to stop host-specific behaviors and release host-bound resources.
@@ -1 +1 @@
1
- {"version":3,"file":"runtimescript.js","sources":["../../src/app/runtimescript.ts"],"sourcesContent":["import type { GenericConstructor, IDisposable, Nullable } from '@zephyr3d/base';\r\n\r\n/**\r\n * Supported serialized field types for runtime script parameters.\r\n *\r\n * @public\r\n */\r\nexport type RuntimeScriptPropertyType =\r\n | 'bool'\r\n | 'int'\r\n | 'float'\r\n | 'int2'\r\n | 'int3'\r\n | 'int4'\r\n | 'vec2'\r\n | 'vec3'\r\n | 'vec4'\r\n | 'rgb'\r\n | 'rgba'\r\n | 'string'\r\n | 'asset'\r\n | 'node'\r\n | 'object_array';\r\n\r\n/**\r\n * Runtime script property types that can be used as a single value or array element.\r\n *\r\n * @public\r\n */\r\nexport type RuntimeScriptValueType = Exclude<RuntimeScriptPropertyType, 'object_array'>;\r\n\r\n/**\r\n * Additional editor hints for runtime script parameters.\r\n *\r\n * @public\r\n */\r\nexport type RuntimeScriptPropertyOptions = {\r\n label?: string;\r\n group?: string;\r\n hidden?: boolean;\r\n minValue?: number;\r\n maxValue?: number;\r\n speed?: number;\r\n mimeTypes?: string[];\r\n sceneNode?: {\r\n kind?: 'node' | 'mesh';\r\n };\r\n enum?: {\r\n labels: string[];\r\n values: unknown[];\r\n };\r\n};\r\n\r\n/**\r\n * Decorator configuration for a serialized runtime script parameter element.\r\n *\r\n * This shape is used for scalar values and for `object_array.element`.\r\n *\r\n * @public\r\n */\r\nexport type RuntimeScriptValueDeclaration = RuntimeScriptPropertyOptions & {\r\n type: RuntimeScriptValueType;\r\n default?: unknown;\r\n};\r\n\r\n/**\r\n * Decorator configuration for a named field inside a structured object-array element.\r\n *\r\n * @public\r\n */\r\nexport type RuntimeScriptObjectFieldDeclaration = RuntimeScriptValueDeclaration & {\r\n name: string;\r\n};\r\n\r\n/**\r\n * Decorator configuration for a structured object-array element.\r\n *\r\n * This is only valid as `object_array.element`.\r\n *\r\n * @public\r\n */\r\nexport type RuntimeScriptObjectDeclaration = {\r\n type: 'object';\r\n fields: RuntimeScriptObjectFieldDeclaration[];\r\n default?: Record<string, unknown>;\r\n};\r\n\r\n/**\r\n * Supported element declarations for `object_array`.\r\n *\r\n * @public\r\n */\r\nexport type RuntimeScriptArrayElementDeclaration =\r\n | RuntimeScriptValueDeclaration\r\n | RuntimeScriptObjectDeclaration;\r\n\r\n/**\r\n * Decorator configuration for an array-typed runtime script parameter.\r\n *\r\n * @public\r\n */\r\nexport type RuntimeScriptArrayDeclaration = RuntimeScriptPropertyOptions & {\r\n type: 'object_array';\r\n element: RuntimeScriptArrayElementDeclaration;\r\n default?: unknown[];\r\n};\r\n\r\n/**\r\n * Decorator configuration for a serialized runtime script parameter.\r\n *\r\n * @public\r\n */\r\nexport type RuntimeScriptPropertyDeclaration = RuntimeScriptValueDeclaration | RuntimeScriptArrayDeclaration;\r\n\r\n/**\r\n * Resolved runtime script parameter metadata.\r\n *\r\n * @public\r\n */\r\nexport type RuntimeScriptPropertyInfo = RuntimeScriptPropertyDeclaration & {\r\n name: string;\r\n};\r\n\r\n/**\r\n * Serialized runtime script configuration payload.\r\n *\r\n * @public\r\n */\r\nexport type RuntimeScriptConfig = Record<string, unknown>;\r\n\r\nconst runtimeScriptPropertiesKey = Symbol('zephyr3d.runtimeScriptProperties');\r\n\r\nfunction cloneRuntimeScriptValue<T>(value: T): T {\r\n if (Array.isArray(value)) {\r\n return value.map((item) => cloneRuntimeScriptValue(item)) as T;\r\n }\r\n if (value && typeof value === 'object') {\r\n const result: Record<string, unknown> = {};\r\n for (const [key, item] of Object.entries(value as Record<string, unknown>)) {\r\n result[key] = cloneRuntimeScriptValue(item);\r\n }\r\n return result as T;\r\n }\r\n return value;\r\n}\r\n\r\nfunction getOwnRuntimeScriptProperties(ctor: GenericConstructor) {\r\n return ((ctor as any)[runtimeScriptPropertiesKey] ?? []) as RuntimeScriptPropertyInfo[];\r\n}\r\n\r\n/**\r\n * Marks a runtime script field as configurable and serializable in editor/runtime tooling.\r\n *\r\n * @param options - Metadata describing how the field should be edited and serialized.\r\n * @returns A property decorator.\r\n *\r\n * @public\r\n */\r\nexport function scriptProp(options: RuntimeScriptPropertyDeclaration): PropertyDecorator {\r\n return (target, propertyKey) => {\r\n if (typeof propertyKey !== 'string') {\r\n throw new Error('Runtime script property name must be a string');\r\n }\r\n const ctor = target.constructor as GenericConstructor;\r\n const own = getOwnRuntimeScriptProperties(ctor).slice();\r\n const normalized: RuntimeScriptPropertyInfo =\r\n options.type === 'object_array'\r\n ? {\r\n ...options,\r\n default: (cloneRuntimeScriptValue(options.default) as unknown[]) ?? [],\r\n name: propertyKey\r\n }\r\n : {\r\n ...options,\r\n default: cloneRuntimeScriptValue(options.default),\r\n name: propertyKey\r\n };\r\n const index = own.findIndex((item) => item.name === propertyKey);\r\n if (index >= 0) {\r\n own[index] = normalized;\r\n } else {\r\n own.push(normalized);\r\n }\r\n Object.defineProperty(ctor, runtimeScriptPropertiesKey, {\r\n configurable: true,\r\n enumerable: false,\r\n writable: true,\r\n value: own\r\n });\r\n };\r\n}\r\n\r\n/**\r\n * Gets the serialized parameter metadata declared on a runtime script class.\r\n *\r\n * Inheritance is supported: base-class metadata is returned before derived-class metadata,\r\n * and derived declarations override base declarations with the same property name.\r\n *\r\n * @param ctor - Runtime script constructor.\r\n * @returns Declared parameter metadata.\r\n *\r\n * @public\r\n */\r\nexport function getRuntimeScriptProperties(ctor: GenericConstructor): RuntimeScriptPropertyInfo[] {\r\n const chain: GenericConstructor[] = [];\r\n let current: any = ctor;\r\n while (typeof current === 'function' && current !== RuntimeScript && current !== Function.prototype) {\r\n chain.unshift(current);\r\n current = Object.getPrototypeOf(current);\r\n }\r\n const merged = new Map<string, RuntimeScriptPropertyInfo>();\r\n for (const type of chain) {\r\n for (const prop of getOwnRuntimeScriptProperties(type)) {\r\n const normalized =\r\n prop.type === 'object_array'\r\n ? ({\r\n ...prop,\r\n default: (cloneRuntimeScriptValue(prop.default) as unknown[]) ?? []\r\n } satisfies RuntimeScriptPropertyInfo)\r\n : ({\r\n ...prop,\r\n default: cloneRuntimeScriptValue(prop.default)\r\n } satisfies RuntimeScriptPropertyInfo);\r\n merged.set(prop.name, normalized);\r\n }\r\n }\r\n return [...merged.values()];\r\n}\r\n\r\n/**\r\n * Merges user-provided script configuration with declared defaults.\r\n *\r\n * Only decorated fields are included in the result.\r\n *\r\n * @param ctor - Runtime script constructor.\r\n * @param config - Serialized configuration payload.\r\n * @returns Normalized configuration object.\r\n *\r\n * @public\r\n */\r\nexport function normalizeRuntimeScriptConfig(\r\n ctor: GenericConstructor,\r\n config?: Nullable<RuntimeScriptConfig>\r\n): RuntimeScriptConfig {\r\n const result: RuntimeScriptConfig = {};\r\n for (const prop of getRuntimeScriptProperties(ctor)) {\r\n if (config && Object.prototype.hasOwnProperty.call(config, prop.name)) {\r\n result[prop.name] = cloneRuntimeScriptValue(config[prop.name]);\r\n } else if (prop.default !== undefined) {\r\n result[prop.name] = cloneRuntimeScriptValue(prop.default);\r\n }\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * Applies normalized configuration values onto a runtime script instance.\r\n *\r\n * Values are assigned before lifecycle hooks such as `onCreated()` run.\r\n *\r\n * @param instance - Runtime script instance.\r\n * @param config - Serialized configuration payload.\r\n *\r\n * @public\r\n */\r\nexport function applyRuntimeScriptConfig<T extends RuntimeScript<any>>(\r\n instance: T,\r\n config?: Nullable<RuntimeScriptConfig>\r\n) {\r\n const normalized = normalizeRuntimeScriptConfig(instance.constructor as GenericConstructor, config);\r\n for (const [key, value] of Object.entries(normalized)) {\r\n (instance as Record<string, unknown>)[key] = cloneRuntimeScriptValue(value);\r\n }\r\n}\r\n\r\n/**\r\n * Base class for runtime scripts that can be attached to a host object.\r\n *\r\n * Lifecycle overview:\r\n * - onCreated(): Called once per script instance right after construction,\r\n * before any host is attached.\r\n * - onAttached(host): Called each time this instance is attached to a host.\r\n * - onUpdate(deltaTime, elapsedTime): Called every frame/tick while attached.\r\n * - onDetached(host): Called when detached from a host.\r\n * - onDestroy(): Called when the instance is no longer attached to any host\r\n * and is about to be discarded.\r\n *\r\n * Notes:\r\n * - Hooks may return a Promise to perform asynchronous work (e.g., asset loading).\r\n * - The generic host type `T` can be `IDisposable` or `null`. If `null`, the script\r\n * may operate without a concrete host.\r\n *\r\n * @typeParam T - The host type that this script attaches to. Typically implements `IDisposable`.\r\n * @public\r\n */\r\nexport class RuntimeScript<T extends IDisposable | null> {\r\n /**\r\n * Gets merged serialized property metadata for this runtime script class.\r\n *\r\n * @returns Declared parameter metadata for the current class.\r\n */\r\n static getScriptProperties(this: GenericConstructor) {\r\n return getRuntimeScriptProperties(this);\r\n }\r\n /**\r\n * Called once after construction, before the first attachment to a host.\r\n *\r\n * Use this to initialize internal state, allocate resources, or kick off\r\n * asynchronous loading needed by the script.\r\n *\r\n * @returns Optionally a Promise to await initialization.\r\n */\r\n onCreated(): void | Promise<void> {}\r\n /**\r\n * Called when the script is attached to a host.\r\n *\r\n * This may be called multiple times if the same instance attaches to different\r\n * hosts over its lifetime.\r\n *\r\n * @param _host - The host the script is being attached to.\r\n * @returns Optionally a Promise to await asynchronous setup.\r\n */\r\n onAttached(_host: Nullable<T>): void | Promise<void> {}\r\n /**\r\n * Called every update/tick while the script is active.\r\n *\r\n * Typical usage includes per-frame logic, animation, and input handling.\r\n *\r\n * @param _deltaTime - Time since last update in seconds.\r\n * @param _elapsedTime - Total elapsed time since start in seconds.\r\n */\r\n onUpdate(_deltaTime: number, _elapsedTime: number) {}\r\n /**\r\n * Called when the script is detached from a host.\r\n *\r\n * Use this to stop host-specific behaviors and release host-bound resources.\r\n *\r\n * @param _host - The host the script is being detached from.\r\n */\r\n onDetached(_host: T) {}\r\n /**\r\n * Called when the script has no remaining hosts and is about to be discarded.\r\n *\r\n * Use this to release global resources and finalize the script's lifecycle.\r\n * This is the terminal lifecycle hook for an instance.\r\n */\r\n onDestroy() {}\r\n}\r\n"],"names":["runtimeScriptPropertiesKey","Symbol","cloneRuntimeScriptValue","value","Array","isArray","map","item","result","key","Object","entries","getOwnRuntimeScriptProperties","ctor","scriptProp","options","target","propertyKey","Error","own","slice","normalized","type","default","name","index","findIndex","push","defineProperty","configurable","enumerable","writable","getRuntimeScriptProperties","chain","current","RuntimeScript","Function","prototype","unshift","getPrototypeOf","merged","Map","prop","set","values","normalizeRuntimeScriptConfig","config","hasOwnProperty","call","undefined","applyRuntimeScriptConfig","instance","getScriptProperties","onCreated","onAttached","_host","onUpdate","_deltaTime","_elapsedTime","onDetached","onDestroy"],"mappings":"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"}
1
+ {"version":3,"file":"runtimescript.js","sources":["../../src/app/runtimescript.ts"],"sourcesContent":["import type { GenericConstructor, IDisposable, Nullable } from '@zephyr3d/base';\r\n\r\n/**\r\n * Supported serialized field types for runtime script parameters.\r\n *\r\n * @public\r\n */\r\nexport type RuntimeScriptPropertyType =\r\n | 'bool'\r\n | 'int'\r\n | 'float'\r\n | 'int2'\r\n | 'int3'\r\n | 'int4'\r\n | 'vec2'\r\n | 'vec3'\r\n | 'vec4'\r\n | 'rgb'\r\n | 'rgba'\r\n | 'string'\r\n | 'asset'\r\n | 'node'\r\n | 'object_array';\r\n\r\n/**\r\n * Runtime script property types that can be used as a single value or array element.\r\n *\r\n * @public\r\n */\r\nexport type RuntimeScriptValueType = Exclude<RuntimeScriptPropertyType, 'object_array'>;\r\n\r\n/**\r\n * Additional editor hints for runtime script parameters.\r\n *\r\n * @public\r\n */\r\nexport type RuntimeScriptPropertyOptions = {\r\n label?: string;\r\n group?: string;\r\n hidden?: boolean;\r\n minValue?: number;\r\n maxValue?: number;\r\n speed?: number;\r\n mimeTypes?: string[];\r\n sceneNode?: {\r\n kind?: 'node' | 'mesh';\r\n };\r\n enum?: {\r\n labels: string[];\r\n values: unknown[];\r\n };\r\n};\r\n\r\n/**\r\n * Decorator configuration for a serialized runtime script parameter element.\r\n *\r\n * This shape is used for scalar values and for `object_array.element`.\r\n *\r\n * @public\r\n */\r\nexport type RuntimeScriptValueDeclaration = RuntimeScriptPropertyOptions & {\r\n type: RuntimeScriptValueType;\r\n default?: unknown;\r\n};\r\n\r\n/**\r\n * Decorator configuration for a named field inside a structured object-array element.\r\n *\r\n * @public\r\n */\r\nexport type RuntimeScriptObjectFieldDeclaration = RuntimeScriptValueDeclaration & {\r\n name: string;\r\n};\r\n\r\n/**\r\n * Decorator configuration for a structured object-array element.\r\n *\r\n * This is only valid as `object_array.element`.\r\n *\r\n * @public\r\n */\r\nexport type RuntimeScriptObjectDeclaration = {\r\n type: 'object';\r\n fields: RuntimeScriptObjectFieldDeclaration[];\r\n default?: Record<string, unknown>;\r\n};\r\n\r\n/**\r\n * Supported element declarations for `object_array`.\r\n *\r\n * @public\r\n */\r\nexport type RuntimeScriptArrayElementDeclaration =\r\n | RuntimeScriptValueDeclaration\r\n | RuntimeScriptObjectDeclaration;\r\n\r\n/**\r\n * Decorator configuration for an array-typed runtime script parameter.\r\n *\r\n * @public\r\n */\r\nexport type RuntimeScriptArrayDeclaration = RuntimeScriptPropertyOptions & {\r\n type: 'object_array';\r\n element: RuntimeScriptArrayElementDeclaration;\r\n default?: unknown[];\r\n};\r\n\r\n/**\r\n * Decorator configuration for a serialized runtime script parameter.\r\n *\r\n * @public\r\n */\r\nexport type RuntimeScriptPropertyDeclaration = RuntimeScriptValueDeclaration | RuntimeScriptArrayDeclaration;\r\n\r\n/**\r\n * Resolved runtime script parameter metadata.\r\n *\r\n * @public\r\n */\r\nexport type RuntimeScriptPropertyInfo = RuntimeScriptPropertyDeclaration & {\r\n name: string;\r\n};\r\n\r\n/**\r\n * Serialized runtime script configuration payload.\r\n *\r\n * @public\r\n */\r\nexport type RuntimeScriptConfig = Record<string, unknown>;\r\n\r\nconst runtimeScriptPropertiesKey = Symbol('zephyr3d.runtimeScriptProperties');\r\n\r\nfunction cloneRuntimeScriptValue<T>(value: T): T {\r\n if (Array.isArray(value)) {\r\n return value.map((item) => cloneRuntimeScriptValue(item)) as T;\r\n }\r\n if (value && typeof value === 'object') {\r\n const result: Record<string, unknown> = {};\r\n for (const [key, item] of Object.entries(value as Record<string, unknown>)) {\r\n result[key] = cloneRuntimeScriptValue(item);\r\n }\r\n return result as T;\r\n }\r\n return value;\r\n}\r\n\r\nfunction getOwnRuntimeScriptProperties(ctor: GenericConstructor) {\r\n return ((ctor as any)[runtimeScriptPropertiesKey] ?? []) as RuntimeScriptPropertyInfo[];\r\n}\r\n\r\n/**\r\n * Marks a runtime script field as configurable and serializable in editor/runtime tooling.\r\n *\r\n * @param options - Metadata describing how the field should be edited and serialized.\r\n * @returns A property decorator.\r\n *\r\n * @public\r\n */\r\nexport function scriptProp(options: RuntimeScriptPropertyDeclaration): PropertyDecorator {\r\n return (target, propertyKey) => {\r\n if (typeof propertyKey !== 'string') {\r\n throw new Error('Runtime script property name must be a string');\r\n }\r\n const ctor = target.constructor as GenericConstructor;\r\n const own = getOwnRuntimeScriptProperties(ctor).slice();\r\n const normalized: RuntimeScriptPropertyInfo =\r\n options.type === 'object_array'\r\n ? {\r\n ...options,\r\n default: (cloneRuntimeScriptValue(options.default) as unknown[]) ?? [],\r\n name: propertyKey\r\n }\r\n : {\r\n ...options,\r\n default: cloneRuntimeScriptValue(options.default),\r\n name: propertyKey\r\n };\r\n const index = own.findIndex((item) => item.name === propertyKey);\r\n if (index >= 0) {\r\n own[index] = normalized;\r\n } else {\r\n own.push(normalized);\r\n }\r\n Object.defineProperty(ctor, runtimeScriptPropertiesKey, {\r\n configurable: true,\r\n enumerable: false,\r\n writable: true,\r\n value: own\r\n });\r\n };\r\n}\r\n\r\n/**\r\n * Gets the serialized parameter metadata declared on a runtime script class.\r\n *\r\n * Inheritance is supported: base-class metadata is returned before derived-class metadata,\r\n * and derived declarations override base declarations with the same property name.\r\n *\r\n * @param ctor - Runtime script constructor.\r\n * @returns Declared parameter metadata.\r\n *\r\n * @public\r\n */\r\nexport function getRuntimeScriptProperties(ctor: GenericConstructor): RuntimeScriptPropertyInfo[] {\r\n const chain: GenericConstructor[] = [];\r\n let current: any = ctor;\r\n while (typeof current === 'function' && current !== RuntimeScript && current !== Function.prototype) {\r\n chain.unshift(current);\r\n current = Object.getPrototypeOf(current);\r\n }\r\n const merged = new Map<string, RuntimeScriptPropertyInfo>();\r\n for (const type of chain) {\r\n for (const prop of getOwnRuntimeScriptProperties(type)) {\r\n const normalized =\r\n prop.type === 'object_array'\r\n ? ({\r\n ...prop,\r\n default: (cloneRuntimeScriptValue(prop.default) as unknown[]) ?? []\r\n } satisfies RuntimeScriptPropertyInfo)\r\n : ({\r\n ...prop,\r\n default: cloneRuntimeScriptValue(prop.default)\r\n } satisfies RuntimeScriptPropertyInfo);\r\n merged.set(prop.name, normalized);\r\n }\r\n }\r\n return [...merged.values()];\r\n}\r\n\r\n/**\r\n * Merges user-provided script configuration with declared defaults.\r\n *\r\n * Only decorated fields are included in the result.\r\n *\r\n * @param ctor - Runtime script constructor.\r\n * @param config - Serialized configuration payload.\r\n * @returns Normalized configuration object.\r\n *\r\n * @public\r\n */\r\nexport function normalizeRuntimeScriptConfig(\r\n ctor: GenericConstructor,\r\n config?: Nullable<RuntimeScriptConfig>\r\n): RuntimeScriptConfig {\r\n const result: RuntimeScriptConfig = {};\r\n for (const prop of getRuntimeScriptProperties(ctor)) {\r\n if (config && Object.prototype.hasOwnProperty.call(config, prop.name)) {\r\n result[prop.name] = cloneRuntimeScriptValue(config[prop.name]);\r\n } else if (prop.default !== undefined) {\r\n result[prop.name] = cloneRuntimeScriptValue(prop.default);\r\n }\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * Applies normalized configuration values onto a runtime script instance.\r\n *\r\n * Values are assigned before lifecycle hooks such as `onCreated()` run.\r\n *\r\n * @param instance - Runtime script instance.\r\n * @param config - Serialized configuration payload.\r\n *\r\n * @public\r\n */\r\nexport function applyRuntimeScriptConfig<T extends RuntimeScript<any>>(\r\n instance: T,\r\n config?: Nullable<RuntimeScriptConfig>\r\n) {\r\n const normalized = normalizeRuntimeScriptConfig(instance.constructor as GenericConstructor, config);\r\n for (const [key, value] of Object.entries(normalized)) {\r\n (instance as Record<string, unknown>)[key] = cloneRuntimeScriptValue(value);\r\n }\r\n}\r\n\r\n/**\r\n * Base class for runtime scripts that can be attached to a host object.\r\n *\r\n * Lifecycle overview:\r\n * - onCreated(): Called once per script instance right after construction,\r\n * before any host is attached.\r\n * - onAttached(host): Called each time this instance is attached to a host.\r\n * - onUpdate(deltaTime, elapsedTime): Called every frame/tick while attached.\r\n * - onFixedUpdate(fixedDeltaTime): Called before each physics step, when a physics world runs.\r\n * - onLateUpdate(deltaTime): Called once per frame after physics has stepped, before a\r\n * `'late'` camera controller updates.\r\n * - onDetached(host): Called when detached from a host.\r\n * - onDestroy(): Called when the instance is no longer attached to any host\r\n * and is about to be discarded.\r\n *\r\n * Notes:\r\n * - Hooks may return a Promise to perform asynchronous work (e.g., asset loading).\r\n * - The generic host type `T` can be `IDisposable` or `null`. If `null`, the script\r\n * may operate without a concrete host.\r\n *\r\n * @typeParam T - The host type that this script attaches to. Typically implements `IDisposable`.\r\n * @public\r\n */\r\nexport class RuntimeScript<T extends IDisposable | null> {\r\n /**\r\n * Gets merged serialized property metadata for this runtime script class.\r\n *\r\n * @returns Declared parameter metadata for the current class.\r\n */\r\n static getScriptProperties(this: GenericConstructor) {\r\n return getRuntimeScriptProperties(this);\r\n }\r\n /**\r\n * Called once after construction, before the first attachment to a host.\r\n *\r\n * Use this to initialize internal state, allocate resources, or kick off\r\n * asynchronous loading needed by the script.\r\n *\r\n * @returns Optionally a Promise to await initialization.\r\n */\r\n onCreated(): void | Promise<void> {}\r\n /**\r\n * Called when the script is attached to a host.\r\n *\r\n * This may be called multiple times if the same instance attaches to different\r\n * hosts over its lifetime.\r\n *\r\n * @param _host - The host the script is being attached to.\r\n * @returns Optionally a Promise to await asynchronous setup.\r\n */\r\n onAttached(_host: Nullable<T>): void | Promise<void> {}\r\n /**\r\n * Called every update/tick while the script is active.\r\n *\r\n * Typical usage includes per-frame logic, animation, and input handling.\r\n *\r\n * @param _deltaTime - Time since last update in seconds.\r\n * @param _elapsedTime - Total elapsed time since start in seconds.\r\n */\r\n onUpdate(_deltaTime: number, _elapsedTime: number) {}\r\n /**\r\n * Called before each fixed-length physics step, while a physics world is\r\n * simulating the host's scene.\r\n *\r\n * A frame may take several steps or none, so use this rather than `onUpdate`\r\n * for logic that must run at the simulation's rate - a force applied here acts\r\n * on this step only. Without a physics world it is never called.\r\n *\r\n * @param _fixedDeltaTime - Length of the step in seconds.\r\n */\r\n onFixedUpdate(_fixedDeltaTime: number) {}\r\n /**\r\n * Called once per frame after the host's scene has updated its nodes and its\r\n * physics world has stepped and written poses back.\r\n *\r\n * Use this for logic that must see this frame's simulated poses, such as\r\n * pointing a follow camera's target or placing effects on a moving body. It\r\n * runs before a camera controller whose `updatePhase` is `'late'`. Unlike\r\n * `onUpdate`, it is only called for scripts whose host is a scene being rendered,\r\n * or a node in one.\r\n *\r\n * @param _deltaTime - Time since last frame in seconds.\r\n */\r\n onLateUpdate(_deltaTime: number) {}\r\n /**\r\n * Called when the script is detached from a host.\r\n *\r\n * Use this to stop host-specific behaviors and release host-bound resources.\r\n *\r\n * @param _host - The host the script is being detached from.\r\n */\r\n onDetached(_host: T) {}\r\n /**\r\n * Called when the script has no remaining hosts and is about to be discarded.\r\n *\r\n * Use this to release global resources and finalize the script's lifecycle.\r\n * This is the terminal lifecycle hook for an instance.\r\n */\r\n onDestroy() {}\r\n}\r\n"],"names":["runtimeScriptPropertiesKey","Symbol","cloneRuntimeScriptValue","value","Array","isArray","map","item","result","key","Object","entries","getOwnRuntimeScriptProperties","ctor","scriptProp","options","target","propertyKey","Error","own","slice","normalized","type","default","name","index","findIndex","push","defineProperty","configurable","enumerable","writable","getRuntimeScriptProperties","chain","current","RuntimeScript","Function","prototype","unshift","getPrototypeOf","merged","Map","prop","set","values","normalizeRuntimeScriptConfig","config","hasOwnProperty","call","undefined","applyRuntimeScriptConfig","instance","getScriptProperties","onCreated","onAttached","_host","onUpdate","_deltaTime","_elapsedTime","onFixedUpdate","_fixedDeltaTime","onLateUpdate","onDetached","onDestroy"],"mappings":"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"}
@@ -368,6 +368,60 @@ function createDeclarativeScriptKey(module, config, occurrence) {
368
368
  }
369
369
  }
370
370
  /**
371
+ * Calls `onFixedUpdate(fixedDeltaTime)` on attached script instances.
372
+ *
373
+ * Driven by a physics world before each of its fixed steps; the scripting
374
+ * system itself never calls it. Exceptions are caught and logged like in
375
+ * {@link ScriptingSystem.update}.
376
+ *
377
+ * @param fixedDeltaTime - Length of the step in seconds.
378
+ * @param filter - Only hosts for which this returns true are called, e.g. the
379
+ * hosts belonging to the scene being simulated.
380
+ */ fixedUpdate(fixedDeltaTime, filter) {
381
+ if (this._hostScripts.size === 0) {
382
+ return;
383
+ }
384
+ for (const [host, list] of this._hostScripts){
385
+ if (filter && !filter(host)) {
386
+ continue;
387
+ }
388
+ for (const s of list){
389
+ try {
390
+ s.instance.onFixedUpdate?.(fixedDeltaTime);
391
+ } catch (err) {
392
+ console.error(`Error occured at onFixedUpdate() of module '${s.id}': ${err}`);
393
+ }
394
+ }
395
+ }
396
+ }
397
+ /**
398
+ * Calls `onLateUpdate(deltaTime)` on attached script instances.
399
+ *
400
+ * Driven by a scene once per frame after its physics world has stepped; the
401
+ * scripting system itself never calls it. Exceptions are caught and logged like
402
+ * in {@link ScriptingSystem.update}.
403
+ *
404
+ * @param deltaTime - Time since last frame in seconds.
405
+ * @param filter - Only hosts for which this returns true are called, e.g. the
406
+ * hosts belonging to the scene being updated.
407
+ */ lateUpdate(deltaTime, filter) {
408
+ if (this._hostScripts.size === 0) {
409
+ return;
410
+ }
411
+ for (const [host, list] of this._hostScripts){
412
+ if (filter && !filter(host)) {
413
+ continue;
414
+ }
415
+ for (const s of list){
416
+ try {
417
+ s.instance.onLateUpdate?.(deltaTime);
418
+ } catch (err) {
419
+ console.error(`Error occured at onLateUpdate() of module '${s.id}': ${err}`);
420
+ }
421
+ }
422
+ }
423
+ }
424
+ /**
371
425
  * Detaches all scripts from all hosts.
372
426
  *
373
427
  * Iteratively calls {@link ScriptingSystem.detachScript} on each host until no attachments remain.
@@ -1 +1 @@
1
- {"version":3,"file":"scriptingsystem.js","sources":["../../src/app/scriptingsystem.ts"],"sourcesContent":["import type { GenericConstructor, IDisposable, Nullable, VFS } from '@zephyr3d/base';\r\nimport { HttpFS } from '@zephyr3d/base';\r\nimport { ScriptRegistry } from './scriptregistry';\r\nimport { applyRuntimeScriptConfig, RuntimeScript, type RuntimeScriptConfig } from './runtimescript';\r\n\r\nfunction resolveCreatedHook(instance: RuntimeScript<any>) {\r\n if (instance.onCreated !== RuntimeScript.prototype.onCreated) {\r\n return {\r\n legacy: false,\r\n hook: () => instance.onCreated()\r\n };\r\n }\r\n const legacyHook = (instance as RuntimeScript<any> & { onCreate?: () => void | Promise<void> }).onCreate;\r\n if (typeof legacyHook === 'function') {\r\n return {\r\n legacy: true,\r\n hook: () => legacyHook.call(instance)\r\n };\r\n }\r\n return {\r\n legacy: false,\r\n hook: () => instance.onCreated()\r\n };\r\n}\r\n\r\n/**\r\n * A host object that supports disposal.\r\n *\r\n * Hosts are objects to which scripts can be attached. They are expected to\r\n * emit a `'dispose'` event compatible with `IDisposable` so that scripts\r\n * can be automatically detached when the host is destroyed.\r\n *\r\n * @public\r\n */\r\nexport type Host = IDisposable;\r\n\r\n/**\r\n * Options for configuring a `ScriptingSystem`.\r\n *\r\n * @public\r\n */\r\nexport type ScriptingSystemOptions = {\r\n /** Virtual file system used by the script registry. Defaults to `new HttpFS('./')`. */\r\n VFS?: VFS;\r\n /** Root path for scripts within the VFS. Defaults to `/`. */\r\n scriptsRoot?: string;\r\n /**\r\n * Optional string appended to dynamic import URLs (e.g., for cache busting).\r\n * Example: `'?v=' + Date.now()`\r\n */\r\n importComment?: string;\r\n /**\r\n * Optional callback invoked when a module fails to load.\r\n * @param e - The error that occurred.\r\n * @param id - The module ID that failed to load.\r\n */\r\n onLoadError?: (e: unknown, id: string) => void;\r\n};\r\n\r\n/**\r\n * Information about a script attached to a host.\r\n *\r\n * @public\r\n */\r\nexport interface IAttachedScript {\r\n /** The logical module identifier used to resolve the script. */\r\n id: string;\r\n /** The resolved runtime URL used for dynamic import. */\r\n url: string;\r\n /** The instantiated runtime script. */\r\n instance: RuntimeScript<any>;\r\n}\r\n\r\nfunction stableSerializeScriptConfig(value: unknown): string {\r\n if (value === null || typeof value !== 'object') {\r\n return JSON.stringify(value) ?? String(value);\r\n }\r\n if (Array.isArray(value)) {\r\n return `[${value.map((item) => stableSerializeScriptConfig(item)).join(',')}]`;\r\n }\r\n return `{${Object.keys(value as Record<string, unknown>)\r\n .sort()\r\n .map(\r\n (key) =>\r\n `${JSON.stringify(key)}:${stableSerializeScriptConfig((value as Record<string, unknown>)[key])}`\r\n )\r\n .join(',')}}`;\r\n}\r\n\r\nfunction createDeclarativeScriptKey(\r\n module: string,\r\n config: Nullable<RuntimeScriptConfig>,\r\n occurrence: number\r\n) {\r\n return `${module}\\n${stableSerializeScriptConfig(config ?? null)}\\n${occurrence}`;\r\n}\r\n\r\n/** @internal */\r\nexport function createDeclarativeScriptSignature(module: string, config: Nullable<RuntimeScriptConfig>) {\r\n return `${module}\\n${stableSerializeScriptConfig(config ?? null)}`;\r\n}\r\n\r\n/**\r\n * Script system that resolves, loads, and manages lifecycle of runtime scripts.\r\n *\r\n * Responsibilities:\r\n * - Resolves module IDs to URLs via {@link ScriptRegistry}\r\n * - Dynamically imports modules and instantiates a `RuntimeScript` (default export)\r\n * - Tracks attachments between hosts and script instances\r\n * - Bridges script lifecycle hooks: `onCreated`, `onAttached`, `onDetached`, `onDestroy`, `onUpdate`\r\n * - Auto-detaches scripts when a host is disposed\r\n *\r\n * Notes:\r\n * - Multiple hosts can reference the same `RuntimeScript` instance; destruction\r\n * occurs when the last host detaches.\r\n * - Errors during load/attach/update are caught and logged; an optional\r\n * `onLoadError` callback can be provided.\r\n *\r\n * @public\r\n */\r\nexport class ScriptingSystem {\r\n private _registry: ScriptRegistry;\r\n private _hostScripts: Map<Nullable<Host>, IAttachedScript[]>;\r\n private _scriptHosts: Map<RuntimeScript<any>, Nullable<Host>[]>;\r\n private _declarativeScripts: Map<Nullable<Host>, Map<string, RuntimeScript<any>>>;\r\n private _pendingDeclarativeScripts: Map<Nullable<Host>, Map<string, Promise<Nullable<RuntimeScript<any>>>>>;\r\n private _activeDeclarativeKeys: Map<Nullable<Host>, ReadonlySet<string>>;\r\n private _onLoadError?: (e: unknown, id: string) => void;\r\n private _importComment?: string;\r\n\r\n /**\r\n * Constructs a new scripting system.\r\n *\r\n * @param opts - Optional configuration.\r\n */\r\n constructor(opts: ScriptingSystemOptions = {}) {\r\n this._registry = new ScriptRegistry(opts.VFS ?? new HttpFS('./'), opts.scriptsRoot ?? '/');\r\n this._hostScripts = new Map();\r\n this._scriptHosts = new Map();\r\n this._declarativeScripts = new Map();\r\n this._pendingDeclarativeScripts = new Map();\r\n this._activeDeclarativeKeys = new Map();\r\n this._importComment = opts.importComment;\r\n this._onLoadError = opts.onLoadError;\r\n }\r\n\r\n /**\r\n * Accessor for the underlying script registry used for module resolution.\r\n */\r\n get registry() {\r\n return this._registry;\r\n }\r\n /**\r\n * Loads a runtime script class from file\r\n * @param module - file path\r\n * @returns The runtime script class or null\r\n */\r\n async loadRuntimeScriptClass<T extends Host = Host>(\r\n module: string\r\n ): Promise<\r\n Nullable<{\r\n url: string;\r\n id: string;\r\n cls: GenericConstructor<RuntimeScript<T>>;\r\n }>\r\n > {\r\n let mod: any = null;\r\n const moduleName = module ? String(module).slice(0, 64) : '';\r\n let url = '';\r\n try {\r\n url = await this._registry.resolveRuntimeUrl(module);\r\n if (!url) {\r\n return null;\r\n }\r\n mod = await import(url + (this._importComment ?? ''));\r\n } catch (e) {\r\n console.error(`Load module '${moduleName}' failed: ${e}`);\r\n }\r\n if (mod && typeof mod.default === 'function') {\r\n return { url, id: module, cls: mod.default as GenericConstructor<RuntimeScript<T>> };\r\n } else {\r\n console.error(`No runtime class exported from '${moduleName}'`);\r\n return null;\r\n }\r\n }\r\n /**\r\n * Creates a script from a dynamic loaded class and attachs it to a host and returns the `RuntimeScript` instance.\r\n *\r\n * @typeParam T - Host type.\r\n * @param host - The host object to attach the script to.\r\n * @param classInfo - The dynamic loaded class information\r\n * @returns The instantiated `RuntimeScript<T>` or `null` on failure.\r\n */\r\n async attachScriptIndirect<T extends Host>(\r\n host: Nullable<T>,\r\n classInfo: {\r\n url: string;\r\n id: string;\r\n cls: GenericConstructor<RuntimeScript<T>>;\r\n },\r\n config?: Nullable<RuntimeScriptConfig>\r\n ): Promise<Nullable<RuntimeScript<T>>> {\r\n try {\r\n const { url, id, cls } = classInfo;\r\n let instance: Nullable<RuntimeScript<T>> = new cls();\r\n if (instance instanceof RuntimeScript) {\r\n applyRuntimeScriptConfig(instance, config);\r\n if (!this._scriptHosts.has(instance)) {\r\n const createdHook = resolveCreatedHook(instance);\r\n if (createdHook.legacy) {\r\n console.warn(`Script '${id}' uses deprecated onCreate(); rename it to onCreated().`);\r\n }\r\n const P = createdHook.hook();\r\n if (P instanceof Promise) {\r\n await P;\r\n }\r\n }\r\n } else {\r\n instance = null;\r\n }\r\n if (!instance) {\r\n console.warn(`Script '${url}' does not have RuntimeScript class exported as default`);\r\n return null;\r\n }\r\n\r\n let hostList = this._scriptHosts.get(instance);\r\n if (!hostList) {\r\n hostList = [];\r\n this._scriptHosts.set(instance, hostList);\r\n }\r\n if (hostList.includes(host)) {\r\n console.warn(`Script '${url}' already attached`);\r\n return instance;\r\n }\r\n hostList.push(host);\r\n\r\n const P = instance.onAttached(host);\r\n if (P instanceof Promise) {\r\n await P;\r\n }\r\n\r\n const attached: IAttachedScript = {\r\n id,\r\n url,\r\n instance\r\n };\r\n\r\n let list = this._hostScripts.get(host);\r\n if (!list) {\r\n list = [];\r\n this._hostScripts.set(host, list);\r\n if (host) {\r\n host.on('dispose', () => {\r\n this._activeDeclarativeKeys.set(host, new Set());\r\n this.detachScript(host);\r\n this.cleanupDeclarativeHost(host);\r\n });\r\n }\r\n }\r\n list.push(attached);\r\n\r\n return attached.instance;\r\n } catch (e) {\r\n const moduleName = classInfo.id ? String(classInfo.id).slice(0, 64) : '';\r\n console.error(`Load module '${moduleName}' failed: ${e}`);\r\n this._onLoadError?.(e, classInfo.id);\r\n return null;\r\n }\r\n }\r\n /**\r\n * Attaches a script to a host and returns the `RuntimeScript` instance.\r\n *\r\n * Process:\r\n * 1. Resolve module ID to a runtime URL via the registry.\r\n * 2. Dynamically import the module.\r\n * 3. Instantiate the default export if it is a constructor.\r\n * 4. If this is the first time the instance is seen, call `onCreated()`.\r\n * 5. Link the instance to the host, and call `onAttached(host)`.\r\n * 6. Subscribe to the host's `'dispose'` event to auto-detach.\r\n *\r\n * If the module cannot be resolved or does not export a default `RuntimeScript`\r\n * subclass, a warning is logged and `null` is returned.\r\n *\r\n * @typeParam T - Host type.\r\n * @param host - The host object to attach the script to.\r\n * @param module - Module identifier used by the registry (logical ID or path).\r\n * @returns The instantiated `RuntimeScript<T>` or `null` on failure.\r\n */\r\n async attachScript<T extends Host>(\r\n host: Nullable<T>,\r\n module: string,\r\n config?: Nullable<RuntimeScriptConfig>\r\n ): Promise<Nullable<RuntimeScript<T>>> {\r\n const info = await this.loadRuntimeScriptClass(module);\r\n return info ? await this.attachScriptIndirect(host, info, config) : null;\r\n }\r\n\r\n /**\r\n * Attaches a serialized script declaration once for a host.\r\n *\r\n * Repeated or concurrent calls with the same module, configuration and occurrence\r\n * return the existing instance. The occurrence distinguishes duplicate declarations\r\n * that intentionally appear more than once on the same host.\r\n *\r\n * @param host - Host object to attach the script to.\r\n * @param module - Logical script module identifier.\r\n * @param config - Serialized script configuration.\r\n * @param occurrence - Zero-based occurrence among equivalent declarations on the host.\r\n */\r\n async attachDeclarativeScript<T extends Host>(\r\n host: Nullable<T>,\r\n module: string,\r\n config?: Nullable<RuntimeScriptConfig>,\r\n occurrence = 0\r\n ): Promise<Nullable<RuntimeScript<T>>> {\r\n const key = createDeclarativeScriptKey(module, config ?? null, occurrence);\r\n const attached = this._declarativeScripts.get(host)?.get(key);\r\n if (attached) {\r\n return attached as RuntimeScript<T>;\r\n }\r\n const pending = this._pendingDeclarativeScripts.get(host)?.get(key);\r\n if (pending) {\r\n return (await pending) as Nullable<RuntimeScript<T>>;\r\n }\r\n\r\n let hostPending = this._pendingDeclarativeScripts.get(host);\r\n if (!hostPending) {\r\n hostPending = new Map();\r\n this._pendingDeclarativeScripts.set(host, hostPending);\r\n }\r\n const request = this.attachScript(host, module, config).then((instance) => {\r\n if (instance) {\r\n const activeKeys = this._activeDeclarativeKeys.get(host);\r\n if (activeKeys && !activeKeys.has(key)) {\r\n this.detachScript(host as T, instance);\r\n return null;\r\n }\r\n let hostAttached = this._declarativeScripts.get(host);\r\n if (!hostAttached) {\r\n hostAttached = new Map();\r\n this._declarativeScripts.set(host, hostAttached);\r\n }\r\n hostAttached.set(key, instance);\r\n }\r\n return instance;\r\n });\r\n hostPending.set(key, request);\r\n try {\r\n return await request;\r\n } finally {\r\n if (hostPending.get(key) === request) {\r\n hostPending.delete(key);\r\n }\r\n if (hostPending.size === 0) {\r\n this._pendingDeclarativeScripts.delete(host);\r\n this.cleanupDeclarativeHost(host);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Detaches declarative script instances whose keys are no longer present on a host.\r\n *\r\n * @param host - Host whose serialized declarations changed.\r\n * @param activeKeys - Complete set of declaration keys currently present on the host.\r\n */\r\n synchronizeDeclarativeScripts<T extends Host>(host: Nullable<T>, activeKeys: ReadonlySet<string>) {\r\n this._activeDeclarativeKeys.set(host, new Set(activeKeys));\r\n const declarative = this._declarativeScripts.get(host);\r\n if (!declarative) {\r\n return;\r\n }\r\n for (const [key, instance] of declarative) {\r\n if (!activeKeys.has(key)) {\r\n this.detachScript(host as T, instance as RuntimeScript<T>);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Detaches script(s) from a host.\r\n *\r\n * Behavior:\r\n * - If `idOrInstance` is omitted, detaches all scripts from the host.\r\n * - If a module ID is provided, detaches only the matching script.\r\n * - If a `RuntimeScript` instance is provided, detaches that instance.\r\n * - Invokes `onDetached(host)` on each detached instance.\r\n * - If the instance has no remaining hosts, invokes `onDestroy()` and disposes tracking.\r\n *\r\n * @typeParam T - Host type.\r\n * @param host - The host to detach from.\r\n * @param idOrInstance - Optional module ID or script instance to target.\r\n */\r\n detachScript<T extends Host>(host: Nullable<T>, idOrInstance?: string | RuntimeScript<T>) {\r\n const list = this._hostScripts.get(host);\r\n if (!list || list.length === 0) {\r\n return;\r\n }\r\n for (let i = list.length - 1; i >= 0; i--) {\r\n const it = list[i];\r\n const hit =\r\n !idOrInstance ||\r\n (typeof idOrInstance === 'string' ? it.id === idOrInstance : it.instance === idOrInstance);\r\n if (hit) {\r\n list.splice(i, 1);\r\n try {\r\n it.instance.onDetached(host as T);\r\n } catch (err) {\r\n console.error(`Error occured at onDetach() of module '${it.id}': ${err}`);\r\n }\r\n\r\n const hostList = this._scriptHosts.get(it.instance);\r\n if (hostList) {\r\n const index = hostList.indexOf(host);\r\n if (index >= 0) {\r\n hostList.splice(index, 1);\r\n }\r\n }\r\n if (!hostList || hostList.length === 0) {\r\n try {\r\n it.instance.onDestroy();\r\n } catch (err) {\r\n console.error(`Error occured at onDestroy() of module '${it.id}': ${err}`);\r\n } finally {\r\n this._scriptHosts.delete(it.instance);\r\n }\r\n }\r\n }\r\n }\r\n if (list.length === 0) {\r\n this._hostScripts.delete(host);\r\n }\r\n const declarative = this._declarativeScripts.get(host);\r\n if (declarative) {\r\n for (const [key, instance] of declarative) {\r\n if (!this._scriptHosts.get(instance)?.includes(host)) {\r\n declarative.delete(key);\r\n }\r\n }\r\n if (declarative.size === 0) {\r\n this._declarativeScripts.delete(host);\r\n }\r\n }\r\n this.cleanupDeclarativeHost(host);\r\n }\r\n\r\n /**\r\n * Get all script instances attached to a host.\r\n *\r\n * @typeParam T - Expected script type.\r\n * @param host - The host whose scripts to retrieve.\r\n * @returns Script instances attached to the host, or an empty array if none.\r\n */\r\n getScriptObjects<T extends RuntimeScript<any>>(host: unknown): T[] {\r\n return (this._hostScripts.get(host as Host) as unknown as T[]) || [];\r\n }\r\n\r\n /**\r\n * Ticks all attached script instances.\r\n *\r\n * Calls `onUpdate(deltaTime, elapsedTime)` on every attached script instance\r\n * across all hosts. Exceptions thrown by a script are caught and logged,\r\n * allowing other scripts to continue updating.\r\n *\r\n * @param deltaTime - Time in seconds since last update.\r\n * @param elapsedTime - Total time in seconds since start.\r\n */\r\n update(deltaTime: number, elapsedTime: number) {\r\n if (this._hostScripts.size === 0) {\r\n return;\r\n }\r\n for (const list of this._hostScripts.values()) {\r\n for (const s of list) {\r\n try {\r\n s.instance.onUpdate(deltaTime, elapsedTime);\r\n } catch (err) {\r\n console.error(`Error occured at onUpdate() of module '${s.id}': ${err}`);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Detaches all scripts from all hosts.\r\n *\r\n * Iteratively calls {@link ScriptingSystem.detachScript} on each host until no attachments remain.\r\n */\r\n detachAllScripts() {\r\n for (const host of this._activeDeclarativeKeys.keys()) {\r\n this._activeDeclarativeKeys.set(host, new Set());\r\n }\r\n while (this._hostScripts.size > 0) {\r\n for (const [host] of this._hostScripts) {\r\n this.detachScript(host);\r\n }\r\n }\r\n }\r\n\r\n private cleanupDeclarativeHost(host: Nullable<Host>) {\r\n if (\r\n !this._hostScripts.has(host) &&\r\n !this._declarativeScripts.has(host) &&\r\n !this._pendingDeclarativeScripts.has(host)\r\n ) {\r\n this._activeDeclarativeKeys.delete(host);\r\n }\r\n }\r\n}\r\n"],"names":["resolveCreatedHook","instance","onCreated","RuntimeScript","prototype","legacy","hook","legacyHook","onCreate","call","stableSerializeScriptConfig","value","JSON","stringify","String","Array","isArray","map","item","join","Object","keys","sort","key","createDeclarativeScriptKey","module","config","occurrence","createDeclarativeScriptSignature","ScriptingSystem","_registry","_hostScripts","_scriptHosts","_declarativeScripts","_pendingDeclarativeScripts","_activeDeclarativeKeys","_onLoadError","_importComment","opts","ScriptRegistry","VFS","HttpFS","scriptsRoot","Map","importComment","onLoadError","registry","loadRuntimeScriptClass","mod","moduleName","slice","url","resolveRuntimeUrl","e","console","error","default","id","cls","attachScriptIndirect","host","classInfo","applyRuntimeScriptConfig","has","createdHook","warn","P","Promise","hostList","get","set","includes","push","onAttached","attached","list","on","Set","detachScript","cleanupDeclarativeHost","attachScript","info","attachDeclarativeScript","pending","hostPending","request","then","activeKeys","hostAttached","delete","size","synchronizeDeclarativeScripts","declarative","idOrInstance","length","i","it","hit","splice","onDetached","err","index","indexOf","onDestroy","getScriptObjects","update","deltaTime","elapsedTime","values","s","onUpdate","detachAllScripts"],"mappings":"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"}
1
+ {"version":3,"file":"scriptingsystem.js","sources":["../../src/app/scriptingsystem.ts"],"sourcesContent":["import type { GenericConstructor, IDisposable, Nullable, VFS } from '@zephyr3d/base';\r\nimport { HttpFS } from '@zephyr3d/base';\r\nimport { ScriptRegistry } from './scriptregistry';\r\nimport { applyRuntimeScriptConfig, RuntimeScript, type RuntimeScriptConfig } from './runtimescript';\r\n\r\nfunction resolveCreatedHook(instance: RuntimeScript<any>) {\r\n if (instance.onCreated !== RuntimeScript.prototype.onCreated) {\r\n return {\r\n legacy: false,\r\n hook: () => instance.onCreated()\r\n };\r\n }\r\n const legacyHook = (instance as RuntimeScript<any> & { onCreate?: () => void | Promise<void> }).onCreate;\r\n if (typeof legacyHook === 'function') {\r\n return {\r\n legacy: true,\r\n hook: () => legacyHook.call(instance)\r\n };\r\n }\r\n return {\r\n legacy: false,\r\n hook: () => instance.onCreated()\r\n };\r\n}\r\n\r\n/**\r\n * A host object that supports disposal.\r\n *\r\n * Hosts are objects to which scripts can be attached. They are expected to\r\n * emit a `'dispose'` event compatible with `IDisposable` so that scripts\r\n * can be automatically detached when the host is destroyed.\r\n *\r\n * @public\r\n */\r\nexport type Host = IDisposable;\r\n\r\n/**\r\n * Options for configuring a `ScriptingSystem`.\r\n *\r\n * @public\r\n */\r\nexport type ScriptingSystemOptions = {\r\n /** Virtual file system used by the script registry. Defaults to `new HttpFS('./')`. */\r\n VFS?: VFS;\r\n /** Root path for scripts within the VFS. Defaults to `/`. */\r\n scriptsRoot?: string;\r\n /**\r\n * Optional string appended to dynamic import URLs (e.g., for cache busting).\r\n * Example: `'?v=' + Date.now()`\r\n */\r\n importComment?: string;\r\n /**\r\n * Optional callback invoked when a module fails to load.\r\n * @param e - The error that occurred.\r\n * @param id - The module ID that failed to load.\r\n */\r\n onLoadError?: (e: unknown, id: string) => void;\r\n};\r\n\r\n/**\r\n * Information about a script attached to a host.\r\n *\r\n * @public\r\n */\r\nexport interface IAttachedScript {\r\n /** The logical module identifier used to resolve the script. */\r\n id: string;\r\n /** The resolved runtime URL used for dynamic import. */\r\n url: string;\r\n /** The instantiated runtime script. */\r\n instance: RuntimeScript<any>;\r\n}\r\n\r\nfunction stableSerializeScriptConfig(value: unknown): string {\r\n if (value === null || typeof value !== 'object') {\r\n return JSON.stringify(value) ?? String(value);\r\n }\r\n if (Array.isArray(value)) {\r\n return `[${value.map((item) => stableSerializeScriptConfig(item)).join(',')}]`;\r\n }\r\n return `{${Object.keys(value as Record<string, unknown>)\r\n .sort()\r\n .map(\r\n (key) =>\r\n `${JSON.stringify(key)}:${stableSerializeScriptConfig((value as Record<string, unknown>)[key])}`\r\n )\r\n .join(',')}}`;\r\n}\r\n\r\nfunction createDeclarativeScriptKey(\r\n module: string,\r\n config: Nullable<RuntimeScriptConfig>,\r\n occurrence: number\r\n) {\r\n return `${module}\\n${stableSerializeScriptConfig(config ?? null)}\\n${occurrence}`;\r\n}\r\n\r\n/** @internal */\r\nexport function createDeclarativeScriptSignature(module: string, config: Nullable<RuntimeScriptConfig>) {\r\n return `${module}\\n${stableSerializeScriptConfig(config ?? null)}`;\r\n}\r\n\r\n/**\r\n * Script system that resolves, loads, and manages lifecycle of runtime scripts.\r\n *\r\n * Responsibilities:\r\n * - Resolves module IDs to URLs via {@link ScriptRegistry}\r\n * - Dynamically imports modules and instantiates a `RuntimeScript` (default export)\r\n * - Tracks attachments between hosts and script instances\r\n * - Bridges script lifecycle hooks: `onCreated`, `onAttached`, `onDetached`, `onDestroy`, `onUpdate`\r\n * - Auto-detaches scripts when a host is disposed\r\n *\r\n * Notes:\r\n * - Multiple hosts can reference the same `RuntimeScript` instance; destruction\r\n * occurs when the last host detaches.\r\n * - Errors during load/attach/update are caught and logged; an optional\r\n * `onLoadError` callback can be provided.\r\n *\r\n * @public\r\n */\r\nexport class ScriptingSystem {\r\n private _registry: ScriptRegistry;\r\n private _hostScripts: Map<Nullable<Host>, IAttachedScript[]>;\r\n private _scriptHosts: Map<RuntimeScript<any>, Nullable<Host>[]>;\r\n private _declarativeScripts: Map<Nullable<Host>, Map<string, RuntimeScript<any>>>;\r\n private _pendingDeclarativeScripts: Map<Nullable<Host>, Map<string, Promise<Nullable<RuntimeScript<any>>>>>;\r\n private _activeDeclarativeKeys: Map<Nullable<Host>, ReadonlySet<string>>;\r\n private _onLoadError?: (e: unknown, id: string) => void;\r\n private _importComment?: string;\r\n\r\n /**\r\n * Constructs a new scripting system.\r\n *\r\n * @param opts - Optional configuration.\r\n */\r\n constructor(opts: ScriptingSystemOptions = {}) {\r\n this._registry = new ScriptRegistry(opts.VFS ?? new HttpFS('./'), opts.scriptsRoot ?? '/');\r\n this._hostScripts = new Map();\r\n this._scriptHosts = new Map();\r\n this._declarativeScripts = new Map();\r\n this._pendingDeclarativeScripts = new Map();\r\n this._activeDeclarativeKeys = new Map();\r\n this._importComment = opts.importComment;\r\n this._onLoadError = opts.onLoadError;\r\n }\r\n\r\n /**\r\n * Accessor for the underlying script registry used for module resolution.\r\n */\r\n get registry() {\r\n return this._registry;\r\n }\r\n /**\r\n * Loads a runtime script class from file\r\n * @param module - file path\r\n * @returns The runtime script class or null\r\n */\r\n async loadRuntimeScriptClass<T extends Host = Host>(\r\n module: string\r\n ): Promise<\r\n Nullable<{\r\n url: string;\r\n id: string;\r\n cls: GenericConstructor<RuntimeScript<T>>;\r\n }>\r\n > {\r\n let mod: any = null;\r\n const moduleName = module ? String(module).slice(0, 64) : '';\r\n let url = '';\r\n try {\r\n url = await this._registry.resolveRuntimeUrl(module);\r\n if (!url) {\r\n return null;\r\n }\r\n mod = await import(url + (this._importComment ?? ''));\r\n } catch (e) {\r\n console.error(`Load module '${moduleName}' failed: ${e}`);\r\n }\r\n if (mod && typeof mod.default === 'function') {\r\n return { url, id: module, cls: mod.default as GenericConstructor<RuntimeScript<T>> };\r\n } else {\r\n console.error(`No runtime class exported from '${moduleName}'`);\r\n return null;\r\n }\r\n }\r\n /**\r\n * Creates a script from a dynamic loaded class and attachs it to a host and returns the `RuntimeScript` instance.\r\n *\r\n * @typeParam T - Host type.\r\n * @param host - The host object to attach the script to.\r\n * @param classInfo - The dynamic loaded class information\r\n * @returns The instantiated `RuntimeScript<T>` or `null` on failure.\r\n */\r\n async attachScriptIndirect<T extends Host>(\r\n host: Nullable<T>,\r\n classInfo: {\r\n url: string;\r\n id: string;\r\n cls: GenericConstructor<RuntimeScript<T>>;\r\n },\r\n config?: Nullable<RuntimeScriptConfig>\r\n ): Promise<Nullable<RuntimeScript<T>>> {\r\n try {\r\n const { url, id, cls } = classInfo;\r\n let instance: Nullable<RuntimeScript<T>> = new cls();\r\n if (instance instanceof RuntimeScript) {\r\n applyRuntimeScriptConfig(instance, config);\r\n if (!this._scriptHosts.has(instance)) {\r\n const createdHook = resolveCreatedHook(instance);\r\n if (createdHook.legacy) {\r\n console.warn(`Script '${id}' uses deprecated onCreate(); rename it to onCreated().`);\r\n }\r\n const P = createdHook.hook();\r\n if (P instanceof Promise) {\r\n await P;\r\n }\r\n }\r\n } else {\r\n instance = null;\r\n }\r\n if (!instance) {\r\n console.warn(`Script '${url}' does not have RuntimeScript class exported as default`);\r\n return null;\r\n }\r\n\r\n let hostList = this._scriptHosts.get(instance);\r\n if (!hostList) {\r\n hostList = [];\r\n this._scriptHosts.set(instance, hostList);\r\n }\r\n if (hostList.includes(host)) {\r\n console.warn(`Script '${url}' already attached`);\r\n return instance;\r\n }\r\n hostList.push(host);\r\n\r\n const P = instance.onAttached(host);\r\n if (P instanceof Promise) {\r\n await P;\r\n }\r\n\r\n const attached: IAttachedScript = {\r\n id,\r\n url,\r\n instance\r\n };\r\n\r\n let list = this._hostScripts.get(host);\r\n if (!list) {\r\n list = [];\r\n this._hostScripts.set(host, list);\r\n if (host) {\r\n host.on('dispose', () => {\r\n this._activeDeclarativeKeys.set(host, new Set());\r\n this.detachScript(host);\r\n this.cleanupDeclarativeHost(host);\r\n });\r\n }\r\n }\r\n list.push(attached);\r\n\r\n return attached.instance;\r\n } catch (e) {\r\n const moduleName = classInfo.id ? String(classInfo.id).slice(0, 64) : '';\r\n console.error(`Load module '${moduleName}' failed: ${e}`);\r\n this._onLoadError?.(e, classInfo.id);\r\n return null;\r\n }\r\n }\r\n /**\r\n * Attaches a script to a host and returns the `RuntimeScript` instance.\r\n *\r\n * Process:\r\n * 1. Resolve module ID to a runtime URL via the registry.\r\n * 2. Dynamically import the module.\r\n * 3. Instantiate the default export if it is a constructor.\r\n * 4. If this is the first time the instance is seen, call `onCreated()`.\r\n * 5. Link the instance to the host, and call `onAttached(host)`.\r\n * 6. Subscribe to the host's `'dispose'` event to auto-detach.\r\n *\r\n * If the module cannot be resolved or does not export a default `RuntimeScript`\r\n * subclass, a warning is logged and `null` is returned.\r\n *\r\n * @typeParam T - Host type.\r\n * @param host - The host object to attach the script to.\r\n * @param module - Module identifier used by the registry (logical ID or path).\r\n * @returns The instantiated `RuntimeScript<T>` or `null` on failure.\r\n */\r\n async attachScript<T extends Host>(\r\n host: Nullable<T>,\r\n module: string,\r\n config?: Nullable<RuntimeScriptConfig>\r\n ): Promise<Nullable<RuntimeScript<T>>> {\r\n const info = await this.loadRuntimeScriptClass(module);\r\n return info ? await this.attachScriptIndirect(host, info, config) : null;\r\n }\r\n\r\n /**\r\n * Attaches a serialized script declaration once for a host.\r\n *\r\n * Repeated or concurrent calls with the same module, configuration and occurrence\r\n * return the existing instance. The occurrence distinguishes duplicate declarations\r\n * that intentionally appear more than once on the same host.\r\n *\r\n * @param host - Host object to attach the script to.\r\n * @param module - Logical script module identifier.\r\n * @param config - Serialized script configuration.\r\n * @param occurrence - Zero-based occurrence among equivalent declarations on the host.\r\n */\r\n async attachDeclarativeScript<T extends Host>(\r\n host: Nullable<T>,\r\n module: string,\r\n config?: Nullable<RuntimeScriptConfig>,\r\n occurrence = 0\r\n ): Promise<Nullable<RuntimeScript<T>>> {\r\n const key = createDeclarativeScriptKey(module, config ?? null, occurrence);\r\n const attached = this._declarativeScripts.get(host)?.get(key);\r\n if (attached) {\r\n return attached as RuntimeScript<T>;\r\n }\r\n const pending = this._pendingDeclarativeScripts.get(host)?.get(key);\r\n if (pending) {\r\n return (await pending) as Nullable<RuntimeScript<T>>;\r\n }\r\n\r\n let hostPending = this._pendingDeclarativeScripts.get(host);\r\n if (!hostPending) {\r\n hostPending = new Map();\r\n this._pendingDeclarativeScripts.set(host, hostPending);\r\n }\r\n const request = this.attachScript(host, module, config).then((instance) => {\r\n if (instance) {\r\n const activeKeys = this._activeDeclarativeKeys.get(host);\r\n if (activeKeys && !activeKeys.has(key)) {\r\n this.detachScript(host as T, instance);\r\n return null;\r\n }\r\n let hostAttached = this._declarativeScripts.get(host);\r\n if (!hostAttached) {\r\n hostAttached = new Map();\r\n this._declarativeScripts.set(host, hostAttached);\r\n }\r\n hostAttached.set(key, instance);\r\n }\r\n return instance;\r\n });\r\n hostPending.set(key, request);\r\n try {\r\n return await request;\r\n } finally {\r\n if (hostPending.get(key) === request) {\r\n hostPending.delete(key);\r\n }\r\n if (hostPending.size === 0) {\r\n this._pendingDeclarativeScripts.delete(host);\r\n this.cleanupDeclarativeHost(host);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Detaches declarative script instances whose keys are no longer present on a host.\r\n *\r\n * @param host - Host whose serialized declarations changed.\r\n * @param activeKeys - Complete set of declaration keys currently present on the host.\r\n */\r\n synchronizeDeclarativeScripts<T extends Host>(host: Nullable<T>, activeKeys: ReadonlySet<string>) {\r\n this._activeDeclarativeKeys.set(host, new Set(activeKeys));\r\n const declarative = this._declarativeScripts.get(host);\r\n if (!declarative) {\r\n return;\r\n }\r\n for (const [key, instance] of declarative) {\r\n if (!activeKeys.has(key)) {\r\n this.detachScript(host as T, instance as RuntimeScript<T>);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Detaches script(s) from a host.\r\n *\r\n * Behavior:\r\n * - If `idOrInstance` is omitted, detaches all scripts from the host.\r\n * - If a module ID is provided, detaches only the matching script.\r\n * - If a `RuntimeScript` instance is provided, detaches that instance.\r\n * - Invokes `onDetached(host)` on each detached instance.\r\n * - If the instance has no remaining hosts, invokes `onDestroy()` and disposes tracking.\r\n *\r\n * @typeParam T - Host type.\r\n * @param host - The host to detach from.\r\n * @param idOrInstance - Optional module ID or script instance to target.\r\n */\r\n detachScript<T extends Host>(host: Nullable<T>, idOrInstance?: string | RuntimeScript<T>) {\r\n const list = this._hostScripts.get(host);\r\n if (!list || list.length === 0) {\r\n return;\r\n }\r\n for (let i = list.length - 1; i >= 0; i--) {\r\n const it = list[i];\r\n const hit =\r\n !idOrInstance ||\r\n (typeof idOrInstance === 'string' ? it.id === idOrInstance : it.instance === idOrInstance);\r\n if (hit) {\r\n list.splice(i, 1);\r\n try {\r\n it.instance.onDetached(host as T);\r\n } catch (err) {\r\n console.error(`Error occured at onDetach() of module '${it.id}': ${err}`);\r\n }\r\n\r\n const hostList = this._scriptHosts.get(it.instance);\r\n if (hostList) {\r\n const index = hostList.indexOf(host);\r\n if (index >= 0) {\r\n hostList.splice(index, 1);\r\n }\r\n }\r\n if (!hostList || hostList.length === 0) {\r\n try {\r\n it.instance.onDestroy();\r\n } catch (err) {\r\n console.error(`Error occured at onDestroy() of module '${it.id}': ${err}`);\r\n } finally {\r\n this._scriptHosts.delete(it.instance);\r\n }\r\n }\r\n }\r\n }\r\n if (list.length === 0) {\r\n this._hostScripts.delete(host);\r\n }\r\n const declarative = this._declarativeScripts.get(host);\r\n if (declarative) {\r\n for (const [key, instance] of declarative) {\r\n if (!this._scriptHosts.get(instance)?.includes(host)) {\r\n declarative.delete(key);\r\n }\r\n }\r\n if (declarative.size === 0) {\r\n this._declarativeScripts.delete(host);\r\n }\r\n }\r\n this.cleanupDeclarativeHost(host);\r\n }\r\n\r\n /**\r\n * Get all script instances attached to a host.\r\n *\r\n * @typeParam T - Expected script type.\r\n * @param host - The host whose scripts to retrieve.\r\n * @returns Script instances attached to the host, or an empty array if none.\r\n */\r\n getScriptObjects<T extends RuntimeScript<any>>(host: unknown): T[] {\r\n return (this._hostScripts.get(host as Host) as unknown as T[]) || [];\r\n }\r\n\r\n /**\r\n * Ticks all attached script instances.\r\n *\r\n * Calls `onUpdate(deltaTime, elapsedTime)` on every attached script instance\r\n * across all hosts. Exceptions thrown by a script are caught and logged,\r\n * allowing other scripts to continue updating.\r\n *\r\n * @param deltaTime - Time in seconds since last update.\r\n * @param elapsedTime - Total time in seconds since start.\r\n */\r\n update(deltaTime: number, elapsedTime: number) {\r\n if (this._hostScripts.size === 0) {\r\n return;\r\n }\r\n for (const list of this._hostScripts.values()) {\r\n for (const s of list) {\r\n try {\r\n s.instance.onUpdate(deltaTime, elapsedTime);\r\n } catch (err) {\r\n console.error(`Error occured at onUpdate() of module '${s.id}': ${err}`);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Calls `onFixedUpdate(fixedDeltaTime)` on attached script instances.\r\n *\r\n * Driven by a physics world before each of its fixed steps; the scripting\r\n * system itself never calls it. Exceptions are caught and logged like in\r\n * {@link ScriptingSystem.update}.\r\n *\r\n * @param fixedDeltaTime - Length of the step in seconds.\r\n * @param filter - Only hosts for which this returns true are called, e.g. the\r\n * hosts belonging to the scene being simulated.\r\n */\r\n fixedUpdate(fixedDeltaTime: number, filter?: (host: unknown) => boolean) {\r\n if (this._hostScripts.size === 0) {\r\n return;\r\n }\r\n for (const [host, list] of this._hostScripts) {\r\n if (filter && !filter(host)) {\r\n continue;\r\n }\r\n for (const s of list) {\r\n try {\r\n s.instance.onFixedUpdate?.(fixedDeltaTime);\r\n } catch (err) {\r\n console.error(`Error occured at onFixedUpdate() of module '${s.id}': ${err}`);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Calls `onLateUpdate(deltaTime)` on attached script instances.\r\n *\r\n * Driven by a scene once per frame after its physics world has stepped; the\r\n * scripting system itself never calls it. Exceptions are caught and logged like\r\n * in {@link ScriptingSystem.update}.\r\n *\r\n * @param deltaTime - Time since last frame in seconds.\r\n * @param filter - Only hosts for which this returns true are called, e.g. the\r\n * hosts belonging to the scene being updated.\r\n */\r\n lateUpdate(deltaTime: number, filter?: (host: unknown) => boolean) {\r\n if (this._hostScripts.size === 0) {\r\n return;\r\n }\r\n for (const [host, list] of this._hostScripts) {\r\n if (filter && !filter(host)) {\r\n continue;\r\n }\r\n for (const s of list) {\r\n try {\r\n s.instance.onLateUpdate?.(deltaTime);\r\n } catch (err) {\r\n console.error(`Error occured at onLateUpdate() of module '${s.id}': ${err}`);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Detaches all scripts from all hosts.\r\n *\r\n * Iteratively calls {@link ScriptingSystem.detachScript} on each host until no attachments remain.\r\n */\r\n detachAllScripts() {\r\n for (const host of this._activeDeclarativeKeys.keys()) {\r\n this._activeDeclarativeKeys.set(host, new Set());\r\n }\r\n while (this._hostScripts.size > 0) {\r\n for (const [host] of this._hostScripts) {\r\n this.detachScript(host);\r\n }\r\n }\r\n }\r\n\r\n private cleanupDeclarativeHost(host: Nullable<Host>) {\r\n if (\r\n !this._hostScripts.has(host) &&\r\n !this._declarativeScripts.has(host) &&\r\n !this._pendingDeclarativeScripts.has(host)\r\n ) {\r\n this._activeDeclarativeKeys.delete(host);\r\n }\r\n }\r\n}\r\n"],"names":["resolveCreatedHook","instance","onCreated","RuntimeScript","prototype","legacy","hook","legacyHook","onCreate","call","stableSerializeScriptConfig","value","JSON","stringify","String","Array","isArray","map","item","join","Object","keys","sort","key","createDeclarativeScriptKey","module","config","occurrence","createDeclarativeScriptSignature","ScriptingSystem","_registry","_hostScripts","_scriptHosts","_declarativeScripts","_pendingDeclarativeScripts","_activeDeclarativeKeys","_onLoadError","_importComment","opts","ScriptRegistry","VFS","HttpFS","scriptsRoot","Map","importComment","onLoadError","registry","loadRuntimeScriptClass","mod","moduleName","slice","url","resolveRuntimeUrl","e","console","error","default","id","cls","attachScriptIndirect","host","classInfo","applyRuntimeScriptConfig","has","createdHook","warn","P","Promise","hostList","get","set","includes","push","onAttached","attached","list","on","Set","detachScript","cleanupDeclarativeHost","attachScript","info","attachDeclarativeScript","pending","hostPending","request","then","activeKeys","hostAttached","delete","size","synchronizeDeclarativeScripts","declarative","idOrInstance","length","i","it","hit","splice","onDetached","err","index","indexOf","onDestroy","getScriptObjects","update","deltaTime","elapsedTime","values","s","onUpdate","fixedUpdate","fixedDeltaTime","filter","onFixedUpdate","lateUpdate","onLateUpdate","detachAllScripts"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { textToBase64 } from '@zephyr3d/base';
1
+ import { HttpFS, textToBase64 } from '@zephyr3d/base';
2
2
  import { init, parse } from '../node_modules/es-module-lexer/dist/lexer.js';
3
3
  import { getApp } from './api.js';
4
4
 
@@ -258,7 +258,12 @@ function nextScriptRegistryNamespace() {
258
258
  if (path.startsWith('/assets/@builtins/')) {
259
259
  return await this.build(String(id));
260
260
  }
261
- return getApp().editorMode !== 'none' ? await this.build(String(id)) : id.endsWith('.js') || id.endsWith('.mjs') ? `${id}${suffix}` : id.endsWith('.ts') ? `${id.slice(0, -3)}.js${suffix}` : `${id}.js${suffix}`;
261
+ if (getApp().editorMode !== 'none') {
262
+ return await this.build(String(id));
263
+ }
264
+ const file = id.endsWith('.js') || id.endsWith('.mjs') ? `${id}${suffix}` : id.endsWith('.ts') ? `${id.slice(0, -3)}.js${suffix}` : `${id}.js${suffix}`;
265
+ // Built scripts sit beside the assets, wherever the VFS fetches them from
266
+ return this._vfs instanceof HttpFS ? this._vfs.getURL(file) : file;
262
267
  }
263
268
  /**
264
269
  * Recursively gathers direct static and dynamic import dependencies for a module.