@needle-tools/engine 4.7.2-alpha → 4.7.2-next.0e4e068

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 (1075) hide show
  1. package/CHANGELOG.md +3782 -3782
  2. package/LICENSE.md +10 -10
  3. package/README.md +64 -64
  4. package/components.needle.json +1 -1
  5. package/dist/generateMeshBVH.worker-BaNp_Xtp.js +25 -0
  6. package/dist/gltf-progressive-CNdBjvz6.js +1145 -0
  7. package/dist/gltf-progressive-C_oN6wCA.umd.cjs +8 -0
  8. package/dist/gltf-progressive-MgWOszRl.min.js +8 -0
  9. package/dist/{needle-engine.bundle-BhDF-YSv.min.js → needle-engine.bundle-B1OlKJHF.min.js} +108 -107
  10. package/dist/{needle-engine.bundle-gp00DTS4.js → needle-engine.bundle-Bwsx9VYm.js} +2077 -2061
  11. package/dist/{needle-engine.bundle-D2myV4E4.umd.cjs → needle-engine.bundle-Cd6HpRz5.umd.cjs} +99 -98
  12. package/dist/needle-engine.d.ts +130 -129
  13. package/dist/needle-engine.js +4 -4
  14. package/dist/needle-engine.min.js +1 -1
  15. package/dist/needle-engine.umd.cjs +1 -1
  16. package/dist/{postprocessing-8AQTeZsr.umd.cjs → postprocessing-CjW23fio.umd.cjs} +2 -2
  17. package/dist/{postprocessing-BkxN_08g.js → postprocessing-DYLNOL3W.js} +3 -3
  18. package/dist/{postprocessing-BDScN9yu.min.js → postprocessing-xYQWCHFu.min.js} +2 -2
  19. package/dist/{three-DMrv-4ar.umd.cjs → three-B_hneGZr.umd.cjs} +4 -4
  20. package/dist/{three-Bz6X1mrw.js → three-DrqIzZTH.js} +4198 -4198
  21. package/dist/{three-Boa-jOq-.min.js → three-DuDKwKB8.min.js} +33 -33
  22. package/dist/{three-examples-GggCDHv0.js → three-examples-B50TT3Iu.js} +5 -5
  23. package/dist/{three-examples-DuVhxqft.min.js → three-examples-DaDLBuy6.min.js} +14 -14
  24. package/dist/{three-examples-C7ryg8vN.umd.cjs → three-examples-X3OadjXB.umd.cjs} +3 -3
  25. package/dist/{three-mesh-ui-CY6Izc7C.min.js → three-mesh-ui-B3p3gyUz.min.js} +1 -1
  26. package/dist/{three-mesh-ui-CwlN0FUC.umd.cjs → three-mesh-ui-CQiIQIlA.umd.cjs} +1 -1
  27. package/dist/{three-mesh-ui-CLNOfsWn.js → three-mesh-ui-CxuWt7m-.js} +1 -1
  28. package/dist/{vendor-zxXa3Dmr.min.js → vendor-BlSxe9JJ.min.js} +3 -3
  29. package/dist/{vendor-BSD1RQIh.js → vendor-BmYIgaS1.js} +3 -3
  30. package/dist/{vendor-DHr4aqIZ.umd.cjs → vendor-Cavtu3CP.umd.cjs} +3 -3
  31. package/lib/asap/needle-asap.d.ts +1 -1
  32. package/lib/asap/needle-asap.js +95 -95
  33. package/lib/asap/sessiongranted.d.ts +3 -3
  34. package/lib/asap/sessiongranted.js +65 -65
  35. package/lib/asap/utils.d.ts +1 -1
  36. package/lib/asap/utils.js +3 -3
  37. package/lib/engine/analytics/index.d.ts +6 -6
  38. package/lib/engine/analytics/index.js +12 -12
  39. package/lib/engine/analytics/lcp.d.ts +3 -3
  40. package/lib/engine/analytics/lcp.js +34 -34
  41. package/lib/engine/api.d.ts +82 -82
  42. package/lib/engine/api.js +81 -81
  43. package/lib/engine/assets/index.d.ts +11 -11
  44. package/lib/engine/assets/index.js +47 -47
  45. package/lib/engine/assets/static.d.ts +1 -1
  46. package/lib/engine/assets/static.js +4 -4
  47. package/lib/engine/codegen/register_types.d.ts +1 -1
  48. package/lib/engine/codegen/register_types.js +300 -300
  49. package/lib/engine/debug/debug.d.ts +15 -15
  50. package/lib/engine/debug/debug.js +44 -44
  51. package/lib/engine/debug/debug_console.d.ts +2 -2
  52. package/lib/engine/debug/debug_console.js +307 -307
  53. package/lib/engine/debug/debug_overlay.d.ts +22 -22
  54. package/lib/engine/debug/debug_overlay.js +316 -316
  55. package/lib/engine/debug/debug_spatial_console.d.ts +2 -2
  56. package/lib/engine/debug/debug_spatial_console.js +390 -390
  57. package/lib/engine/debug/index.d.ts +2 -2
  58. package/lib/engine/debug/index.js +2 -2
  59. package/lib/engine/engine_addressables.d.ts +164 -164
  60. package/lib/engine/engine_addressables.js +601 -601
  61. package/lib/engine/engine_animation.d.ts +43 -43
  62. package/lib/engine/engine_animation.js +133 -133
  63. package/lib/engine/engine_application.d.ts +45 -45
  64. package/lib/engine/engine_application.js +104 -104
  65. package/lib/engine/engine_assetdatabase.d.ts +25 -25
  66. package/lib/engine/engine_assetdatabase.js +346 -346
  67. package/lib/engine/engine_audio.d.ts +4 -4
  68. package/lib/engine/engine_audio.js +23 -23
  69. package/lib/engine/engine_camera.d.ts +13 -13
  70. package/lib/engine/engine_camera.js +30 -30
  71. package/lib/engine/engine_components.d.ts +110 -110
  72. package/lib/engine/engine_components.js +374 -374
  73. package/lib/engine/engine_components_internal.d.ts +9 -9
  74. package/lib/engine/engine_components_internal.js +36 -36
  75. package/lib/engine/engine_constants.d.ts +10 -10
  76. package/lib/engine/engine_constants.js +41 -41
  77. package/lib/engine/engine_context.d.ts +475 -475
  78. package/lib/engine/engine_context.js +1672 -1673
  79. package/lib/engine/engine_context.js.map +1 -1
  80. package/lib/engine/engine_context_registry.d.ts +71 -71
  81. package/lib/engine/engine_context_registry.js +117 -117
  82. package/lib/engine/engine_coroutine.d.ts +35 -35
  83. package/lib/engine/engine_coroutine.js +52 -52
  84. package/lib/engine/engine_create_objects.d.ts +119 -119
  85. package/lib/engine/engine_create_objects.js +320 -320
  86. package/lib/engine/engine_default_parameters.d.ts +2 -2
  87. package/lib/engine/engine_default_parameters.js +3 -3
  88. package/lib/engine/engine_editor-sync.d.ts +21 -21
  89. package/lib/engine/engine_editor-sync.js +4 -4
  90. package/lib/engine/engine_fileloader.d.ts +2 -2
  91. package/lib/engine/engine_fileloader.js +8 -8
  92. package/lib/engine/engine_gameobject.d.ts +68 -68
  93. package/lib/engine/engine_gameobject.js +619 -619
  94. package/lib/engine/engine_generic_utils.d.ts +1 -1
  95. package/lib/engine/engine_generic_utils.js +13 -13
  96. package/lib/engine/engine_gizmos.d.ts +149 -149
  97. package/lib/engine/engine_gizmos.js +530 -530
  98. package/lib/engine/engine_gltf.d.ts +12 -12
  99. package/lib/engine/engine_gltf.js +15 -15
  100. package/lib/engine/engine_gltf_builtin_components.d.ts +11 -11
  101. package/lib/engine/engine_gltf_builtin_components.js +341 -341
  102. package/lib/engine/engine_hot_reload.d.ts +8 -8
  103. package/lib/engine/engine_hot_reload.js +197 -197
  104. package/lib/engine/engine_input.d.ts +362 -362
  105. package/lib/engine/engine_input.js +1294 -1294
  106. package/lib/engine/engine_input_utils.d.ts +2 -2
  107. package/lib/engine/engine_input_utils.js +22 -22
  108. package/lib/engine/engine_instancing.d.ts +19 -19
  109. package/lib/engine/engine_instancing.js +39 -39
  110. package/lib/engine/engine_license.d.ts +11 -11
  111. package/lib/engine/engine_license.js +369 -369
  112. package/lib/engine/engine_lifecycle_api.d.ts +83 -83
  113. package/lib/engine/engine_lifecycle_api.js +106 -106
  114. package/lib/engine/engine_lifecycle_functions_internal.d.ts +32 -32
  115. package/lib/engine/engine_lifecycle_functions_internal.js +146 -146
  116. package/lib/engine/engine_lightdata.d.ts +23 -23
  117. package/lib/engine/engine_lightdata.js +101 -101
  118. package/lib/engine/engine_loaders.callbacks.d.ts +97 -97
  119. package/lib/engine/engine_loaders.callbacks.js +86 -86
  120. package/lib/engine/engine_loaders.d.ts +48 -48
  121. package/lib/engine/engine_loaders.gltf.d.ts +13 -13
  122. package/lib/engine/engine_loaders.gltf.js +62 -62
  123. package/lib/engine/engine_loaders.js +337 -337
  124. package/lib/engine/engine_lods.d.ts +35 -35
  125. package/lib/engine/engine_lods.js +160 -160
  126. package/lib/engine/engine_lods.js.map +1 -1
  127. package/lib/engine/engine_mainloop_utils.d.ts +32 -32
  128. package/lib/engine/engine_mainloop_utils.js +466 -466
  129. package/lib/engine/engine_math.d.ts +114 -114
  130. package/lib/engine/engine_math.js +247 -247
  131. package/lib/engine/engine_modules.d.ts +36 -36
  132. package/lib/engine/engine_modules.js +85 -85
  133. package/lib/engine/engine_networking.d.ts +260 -260
  134. package/lib/engine/engine_networking.js +764 -764
  135. package/lib/engine/engine_networking_auto.d.ts +24 -24
  136. package/lib/engine/engine_networking_auto.js +310 -310
  137. package/lib/engine/engine_networking_blob.d.ts +48 -48
  138. package/lib/engine/engine_networking_blob.js +228 -228
  139. package/lib/engine/engine_networking_files.d.ts +35 -35
  140. package/lib/engine/engine_networking_files.js +172 -172
  141. package/lib/engine/engine_networking_files_default_components.d.ts +6 -6
  142. package/lib/engine/engine_networking_files_default_components.js +42 -42
  143. package/lib/engine/engine_networking_instantiate.d.ts +100 -100
  144. package/lib/engine/engine_networking_instantiate.js +345 -345
  145. package/lib/engine/engine_networking_peer.d.ts +15 -15
  146. package/lib/engine/engine_networking_peer.js +132 -132
  147. package/lib/engine/engine_networking_streams.d.ts +123 -123
  148. package/lib/engine/engine_networking_streams.js +645 -645
  149. package/lib/engine/engine_networking_types.d.ts +22 -22
  150. package/lib/engine/engine_networking_types.js +7 -7
  151. package/lib/engine/engine_networking_utils.d.ts +2 -2
  152. package/lib/engine/engine_networking_utils.js +20 -20
  153. package/lib/engine/engine_networking_websocket.d.ts +1 -1
  154. package/lib/engine/engine_networking_websocket.js +2 -2
  155. package/lib/engine/engine_patcher.d.ts +10 -10
  156. package/lib/engine/engine_patcher.js +142 -142
  157. package/lib/engine/engine_physics.d.ts +152 -152
  158. package/lib/engine/engine_physics.js +645 -645
  159. package/lib/engine/engine_physics.types.d.ts +40 -40
  160. package/lib/engine/engine_physics.types.js +33 -33
  161. package/lib/engine/engine_physics_rapier.d.ts +147 -147
  162. package/lib/engine/engine_physics_rapier.js +1433 -1433
  163. package/lib/engine/engine_playerview.d.ts +26 -26
  164. package/lib/engine/engine_playerview.js +64 -64
  165. package/lib/engine/engine_scenelighting.d.ts +71 -71
  166. package/lib/engine/engine_scenelighting.js +226 -226
  167. package/lib/engine/engine_serialization.d.ts +3 -3
  168. package/lib/engine/engine_serialization.js +3 -3
  169. package/lib/engine/engine_serialization_builtin_serializer.d.ts +72 -72
  170. package/lib/engine/engine_serialization_builtin_serializer.js +403 -403
  171. package/lib/engine/engine_serialization_core.d.ts +94 -94
  172. package/lib/engine/engine_serialization_core.js +607 -607
  173. package/lib/engine/engine_serialization_decorator.d.ts +23 -23
  174. package/lib/engine/engine_serialization_decorator.js +66 -66
  175. package/lib/engine/engine_setup.d.ts +1 -1
  176. package/lib/engine/engine_setup.js +2 -2
  177. package/lib/engine/engine_shaders.d.ts +53 -53
  178. package/lib/engine/engine_shaders.js +252 -252
  179. package/lib/engine/engine_shims.d.ts +4 -4
  180. package/lib/engine/engine_shims.js +24 -24
  181. package/lib/engine/engine_test_utils.d.ts +39 -39
  182. package/lib/engine/engine_test_utils.js +83 -83
  183. package/lib/engine/engine_texture.d.ts +28 -28
  184. package/lib/engine/engine_texture.js +64 -64
  185. package/lib/engine/engine_three_utils.d.ts +204 -204
  186. package/lib/engine/engine_three_utils.js +788 -788
  187. package/lib/engine/engine_time.d.ts +51 -51
  188. package/lib/engine/engine_time.js +82 -82
  189. package/lib/engine/engine_time_utils.d.ts +88 -88
  190. package/lib/engine/engine_time_utils.js +215 -215
  191. package/lib/engine/engine_tonemapping.d.ts +6 -6
  192. package/lib/engine/engine_tonemapping.js +198 -197
  193. package/lib/engine/engine_tonemapping.js.map +1 -1
  194. package/lib/engine/engine_types.d.ts +578 -578
  195. package/lib/engine/engine_types.js +95 -95
  196. package/lib/engine/engine_typestore.d.ts +28 -28
  197. package/lib/engine/engine_typestore.js +55 -55
  198. package/lib/engine/engine_util_decorator.d.ts +13 -13
  199. package/lib/engine/engine_util_decorator.js +116 -116
  200. package/lib/engine/engine_utils.d.ts +248 -248
  201. package/lib/engine/engine_utils.js +1012 -1012
  202. package/lib/engine/engine_utils_format.d.ts +24 -24
  203. package/lib/engine/engine_utils_format.js +239 -239
  204. package/lib/engine/engine_utils_screenshot.d.ts +159 -159
  205. package/lib/engine/engine_utils_screenshot.js +522 -522
  206. package/lib/engine/engine_utils_screenshot.xr.d.ts +5 -5
  207. package/lib/engine/engine_utils_screenshot.xr.js +90 -90
  208. package/lib/engine/engine_xr.d.ts +1 -1
  209. package/lib/engine/engine_xr.js +1 -1
  210. package/lib/engine/export/gltf/Writers.d.ts +19 -19
  211. package/lib/engine/export/gltf/Writers.js +24 -24
  212. package/lib/engine/export/gltf/index.d.ts +11 -11
  213. package/lib/engine/export/gltf/index.js +123 -123
  214. package/lib/engine/export/index.d.ts +2 -2
  215. package/lib/engine/export/index.js +2 -2
  216. package/lib/engine/export/state.d.ts +7 -7
  217. package/lib/engine/export/state.js +17 -17
  218. package/lib/engine/export/utils.d.ts +2 -2
  219. package/lib/engine/export/utils.js +7 -7
  220. package/lib/engine/extensions/EXT_texture_exr.d.ts +8 -8
  221. package/lib/engine/extensions/EXT_texture_exr.js +32 -32
  222. package/lib/engine/extensions/NEEDLE_animator_controller_model.d.ts +122 -122
  223. package/lib/engine/extensions/NEEDLE_animator_controller_model.js +95 -95
  224. package/lib/engine/extensions/NEEDLE_components.d.ts +35 -35
  225. package/lib/engine/extensions/NEEDLE_components.js +220 -220
  226. package/lib/engine/extensions/NEEDLE_gameobject_data.d.ts +10 -10
  227. package/lib/engine/extensions/NEEDLE_gameobject_data.js +57 -57
  228. package/lib/engine/extensions/NEEDLE_lighting_settings.d.ts +37 -37
  229. package/lib/engine/extensions/NEEDLE_lighting_settings.js +157 -157
  230. package/lib/engine/extensions/NEEDLE_lightmaps.d.ts +18 -18
  231. package/lib/engine/extensions/NEEDLE_lightmaps.js +99 -99
  232. package/lib/engine/extensions/NEEDLE_persistent_assets.d.ts +11 -11
  233. package/lib/engine/extensions/NEEDLE_persistent_assets.js +63 -63
  234. package/lib/engine/extensions/NEEDLE_progressive.d.ts +1 -1
  235. package/lib/engine/extensions/NEEDLE_progressive.js +1 -1
  236. package/lib/engine/extensions/NEEDLE_render_objects.d.ts +13 -13
  237. package/lib/engine/extensions/NEEDLE_render_objects.js +159 -159
  238. package/lib/engine/extensions/NEEDLE_techniques_webgl.d.ts +38 -38
  239. package/lib/engine/extensions/NEEDLE_techniques_webgl.js +564 -564
  240. package/lib/engine/extensions/extension_resolver.d.ts +4 -4
  241. package/lib/engine/extensions/extension_resolver.js +1 -1
  242. package/lib/engine/extensions/extension_utils.d.ts +12 -12
  243. package/lib/engine/extensions/extension_utils.js +152 -152
  244. package/lib/engine/extensions/extensions.d.ts +32 -32
  245. package/lib/engine/extensions/extensions.js +107 -107
  246. package/lib/engine/extensions/index.d.ts +6 -6
  247. package/lib/engine/extensions/index.js +6 -6
  248. package/lib/engine/extensions/usage_tracker.d.ts +13 -13
  249. package/lib/engine/extensions/usage_tracker.js +65 -65
  250. package/lib/engine/js-extensions/Camera.d.ts +1 -1
  251. package/lib/engine/js-extensions/Camera.js +39 -39
  252. package/lib/engine/js-extensions/ExtensionUtils.d.ts +9 -9
  253. package/lib/engine/js-extensions/ExtensionUtils.js +67 -67
  254. package/lib/engine/js-extensions/Layers.d.ts +6 -6
  255. package/lib/engine/js-extensions/Layers.js +22 -22
  256. package/lib/engine/js-extensions/Object3D.d.ts +120 -120
  257. package/lib/engine/js-extensions/Object3D.js +136 -136
  258. package/lib/engine/js-extensions/RGBAColor.d.ts +23 -23
  259. package/lib/engine/js-extensions/RGBAColor.js +111 -111
  260. package/lib/engine/js-extensions/Vector.d.ts +3 -3
  261. package/lib/engine/js-extensions/Vector.js +13 -13
  262. package/lib/engine/js-extensions/index.d.ts +5 -5
  263. package/lib/engine/js-extensions/index.js +5 -5
  264. package/lib/engine/physics/workers/mesh-bvh/GenerateMeshBVHWorker.d.ts +4 -4
  265. package/lib/engine/physics/workers/mesh-bvh/GenerateMeshBVHWorker.js +79 -79
  266. package/lib/engine/shaders/shaderData.d.ts +55 -55
  267. package/lib/engine/shaders/shaderData.js +58 -58
  268. package/lib/engine/tests/test_utils.d.ts +2 -2
  269. package/lib/engine/tests/test_utils.js +53 -53
  270. package/lib/engine/webcomponents/WebXRButtons.d.ts +56 -56
  271. package/lib/engine/webcomponents/WebXRButtons.js +230 -230
  272. package/lib/engine/webcomponents/api.d.ts +5 -5
  273. package/lib/engine/webcomponents/api.js +4 -4
  274. package/lib/engine/webcomponents/buttons.d.ts +51 -51
  275. package/lib/engine/webcomponents/buttons.js +264 -264
  276. package/lib/engine/webcomponents/fonts.d.ts +9 -9
  277. package/lib/engine/webcomponents/fonts.js +32 -32
  278. package/lib/engine/webcomponents/icons.d.ts +9 -9
  279. package/lib/engine/webcomponents/icons.js +52 -52
  280. package/lib/engine/webcomponents/index.d.ts +1 -1
  281. package/lib/engine/webcomponents/index.js +1 -1
  282. package/lib/engine/webcomponents/logo-element.d.ts +10 -10
  283. package/lib/engine/webcomponents/logo-element.js +67 -67
  284. package/lib/engine/webcomponents/needle menu/needle-menu-spatial.d.ts +37 -37
  285. package/lib/engine/webcomponents/needle menu/needle-menu-spatial.js +513 -513
  286. package/lib/engine/webcomponents/needle menu/needle-menu.d.ts +155 -155
  287. package/lib/engine/webcomponents/needle menu/needle-menu.js +1029 -1029
  288. package/lib/engine/webcomponents/needle-button.d.ts +34 -34
  289. package/lib/engine/webcomponents/needle-button.js +161 -161
  290. package/lib/engine/webcomponents/needle-engine.ar-overlay.d.ts +21 -21
  291. package/lib/engine/webcomponents/needle-engine.ar-overlay.js +166 -166
  292. package/lib/engine/webcomponents/needle-engine.attributes.d.ts +69 -69
  293. package/lib/engine/webcomponents/needle-engine.attributes.js +1 -1
  294. package/lib/engine/webcomponents/needle-engine.d.ts +115 -116
  295. package/lib/engine/webcomponents/needle-engine.extras.d.ts +6 -6
  296. package/lib/engine/webcomponents/needle-engine.extras.js +13 -13
  297. package/lib/engine/webcomponents/needle-engine.js +845 -821
  298. package/lib/engine/webcomponents/needle-engine.js.map +1 -1
  299. package/lib/engine/webcomponents/needle-engine.loading.d.ts +44 -44
  300. package/lib/engine/webcomponents/needle-engine.loading.js +341 -341
  301. package/lib/engine/xr/NeedleXRController.d.ts +313 -313
  302. package/lib/engine/xr/NeedleXRController.js +1007 -1007
  303. package/lib/engine/xr/NeedleXRSession.d.ts +340 -340
  304. package/lib/engine/xr/NeedleXRSession.js +1463 -1463
  305. package/lib/engine/xr/NeedleXRSync.d.ts +22 -22
  306. package/lib/engine/xr/NeedleXRSync.js +188 -188
  307. package/lib/engine/xr/SceneTransition.d.ts +18 -18
  308. package/lib/engine/xr/SceneTransition.js +69 -69
  309. package/lib/engine/xr/TempXRContext.d.ts +34 -34
  310. package/lib/engine/xr/TempXRContext.js +187 -187
  311. package/lib/engine/xr/XRRig.d.ts +7 -7
  312. package/lib/engine/xr/XRRig.js +1 -1
  313. package/lib/engine/xr/api.d.ts +6 -6
  314. package/lib/engine/xr/api.js +6 -6
  315. package/lib/engine/xr/events.d.ts +66 -66
  316. package/lib/engine/xr/events.js +93 -93
  317. package/lib/engine/xr/internal.d.ts +12 -12
  318. package/lib/engine/xr/internal.js +25 -25
  319. package/lib/engine/xr/usdz.d.ts +12 -12
  320. package/lib/engine/xr/usdz.js +29 -29
  321. package/lib/engine/xr/utils.d.ts +11 -11
  322. package/lib/engine/xr/utils.js +34 -34
  323. package/lib/engine-components/AlignmentConstraint.d.ts +10 -10
  324. package/lib/engine-components/AlignmentConstraint.js +39 -39
  325. package/lib/engine-components/Animation.d.ts +156 -156
  326. package/lib/engine-components/Animation.js +508 -508
  327. package/lib/engine-components/AnimationCurve.d.ts +40 -40
  328. package/lib/engine-components/AnimationCurve.js +159 -159
  329. package/lib/engine-components/AnimationUtils.d.ts +8 -8
  330. package/lib/engine-components/AnimationUtils.js +27 -27
  331. package/lib/engine-components/AnimationUtilsAutoplay.d.ts +1 -1
  332. package/lib/engine-components/AnimationUtilsAutoplay.js +39 -39
  333. package/lib/engine-components/Animator.d.ts +217 -217
  334. package/lib/engine-components/Animator.js +354 -354
  335. package/lib/engine-components/AnimatorController.d.ts +227 -227
  336. package/lib/engine-components/AnimatorController.js +1152 -1152
  337. package/lib/engine-components/AudioListener.d.ts +33 -33
  338. package/lib/engine-components/AudioListener.js +86 -86
  339. package/lib/engine-components/AudioSource.d.ts +217 -217
  340. package/lib/engine-components/AudioSource.js +635 -635
  341. package/lib/engine-components/AvatarLoader.d.ts +80 -80
  342. package/lib/engine-components/AvatarLoader.js +231 -231
  343. package/lib/engine-components/AxesHelper.d.ts +32 -32
  344. package/lib/engine-components/AxesHelper.js +67 -67
  345. package/lib/engine-components/BasicIKConstraint.d.ts +9 -9
  346. package/lib/engine-components/BasicIKConstraint.js +43 -43
  347. package/lib/engine-components/BoxCollider.d.ts +2 -2
  348. package/lib/engine-components/BoxCollider.js +2 -2
  349. package/lib/engine-components/BoxHelperComponent.d.ts +47 -47
  350. package/lib/engine-components/BoxHelperComponent.js +102 -102
  351. package/lib/engine-components/Camera.d.ts +231 -231
  352. package/lib/engine-components/Camera.js +700 -700
  353. package/lib/engine-components/CameraUtils.d.ts +1 -1
  354. package/lib/engine-components/CameraUtils.js +123 -123
  355. package/lib/engine-components/CharacterController.d.ts +55 -55
  356. package/lib/engine-components/CharacterController.js +236 -236
  357. package/lib/engine-components/Collider.d.ts +188 -188
  358. package/lib/engine-components/Collider.js +369 -369
  359. package/lib/engine-components/Component.d.ts +792 -792
  360. package/lib/engine-components/Component.js +920 -920
  361. package/lib/engine-components/ContactShadows.d.ts +94 -94
  362. package/lib/engine-components/ContactShadows.js +453 -453
  363. package/lib/engine-components/DeleteBox.d.ts +19 -19
  364. package/lib/engine-components/DeleteBox.js +58 -58
  365. package/lib/engine-components/DeviceFlag.d.ts +16 -16
  366. package/lib/engine-components/DeviceFlag.js +47 -47
  367. package/lib/engine-components/DragControls.d.ts +170 -170
  368. package/lib/engine-components/DragControls.js +1421 -1421
  369. package/lib/engine-components/DropListener.d.ts +215 -215
  370. package/lib/engine-components/DropListener.js +642 -642
  371. package/lib/engine-components/Duplicatable.d.ts +35 -35
  372. package/lib/engine-components/Duplicatable.js +202 -202
  373. package/lib/engine-components/EventList.d.ts +54 -54
  374. package/lib/engine-components/EventList.js +232 -232
  375. package/lib/engine-components/EventTrigger.d.ts +33 -33
  376. package/lib/engine-components/EventTrigger.js +75 -75
  377. package/lib/engine-components/EventType.d.ts +22 -22
  378. package/lib/engine-components/EventType.js +23 -23
  379. package/lib/engine-components/Fog.d.ts +22 -22
  380. package/lib/engine-components/Fog.js +61 -61
  381. package/lib/engine-components/Gizmos.d.ts +17 -17
  382. package/lib/engine-components/Gizmos.js +64 -64
  383. package/lib/engine-components/GridHelper.d.ts +20 -20
  384. package/lib/engine-components/GridHelper.js +54 -54
  385. package/lib/engine-components/GroundProjection.d.ts +67 -67
  386. package/lib/engine-components/GroundProjection.js +343 -343
  387. package/lib/engine-components/Interactable.d.ts +12 -12
  388. package/lib/engine-components/Interactable.js +12 -12
  389. package/lib/engine-components/Joints.d.ts +19 -19
  390. package/lib/engine-components/Joints.js +51 -51
  391. package/lib/engine-components/LODGroup.d.ts +35 -35
  392. package/lib/engine-components/LODGroup.js +152 -152
  393. package/lib/engine-components/Light.d.ts +180 -180
  394. package/lib/engine-components/Light.js +535 -535
  395. package/lib/engine-components/LookAtConstraint.d.ts +19 -19
  396. package/lib/engine-components/LookAtConstraint.js +35 -35
  397. package/lib/engine-components/NeedleMenu.d.ts +50 -50
  398. package/lib/engine-components/NeedleMenu.js +92 -92
  399. package/lib/engine-components/NestedGltf.d.ts +25 -25
  400. package/lib/engine-components/NestedGltf.js +88 -88
  401. package/lib/engine-components/Networking.d.ts +54 -54
  402. package/lib/engine-components/Networking.js +112 -112
  403. package/lib/engine-components/OffsetConstraint.d.ts +14 -14
  404. package/lib/engine-components/OffsetConstraint.js +65 -65
  405. package/lib/engine-components/OrbitControls.d.ts +268 -268
  406. package/lib/engine-components/OrbitControls.js +1015 -1015
  407. package/lib/engine-components/PlayerColor.d.ts +19 -19
  408. package/lib/engine-components/PlayerColor.js +94 -94
  409. package/lib/engine-components/ReflectionProbe.d.ts +28 -28
  410. package/lib/engine-components/ReflectionProbe.js +204 -204
  411. package/lib/engine-components/Renderer.d.ts +153 -153
  412. package/lib/engine-components/Renderer.js +834 -834
  413. package/lib/engine-components/RendererInstancing.d.ts +140 -140
  414. package/lib/engine-components/RendererInstancing.js +744 -744
  415. package/lib/engine-components/RendererLightmap.d.ts +24 -24
  416. package/lib/engine-components/RendererLightmap.js +182 -182
  417. package/lib/engine-components/RigidBody.d.ts +155 -155
  418. package/lib/engine-components/RigidBody.js +517 -517
  419. package/lib/engine-components/SceneSwitcher.d.ts +263 -263
  420. package/lib/engine-components/SceneSwitcher.js +971 -971
  421. package/lib/engine-components/ScreenCapture.d.ts +144 -144
  422. package/lib/engine-components/ScreenCapture.js +547 -547
  423. package/lib/engine-components/ShadowCatcher.d.ts +33 -33
  424. package/lib/engine-components/ShadowCatcher.js +166 -166
  425. package/lib/engine-components/Skybox.d.ts +88 -88
  426. package/lib/engine-components/Skybox.js +469 -469
  427. package/lib/engine-components/SmoothFollow.d.ts +34 -34
  428. package/lib/engine-components/SmoothFollow.js +82 -82
  429. package/lib/engine-components/SpatialTrigger.d.ts +102 -102
  430. package/lib/engine-components/SpatialTrigger.js +225 -225
  431. package/lib/engine-components/SpectatorCamera.d.ts +111 -111
  432. package/lib/engine-components/SpectatorCamera.js +715 -715
  433. package/lib/engine-components/SphereCollider.d.ts +2 -2
  434. package/lib/engine-components/SphereCollider.js +2 -2
  435. package/lib/engine-components/SpriteRenderer.d.ts +132 -132
  436. package/lib/engine-components/SpriteRenderer.js +472 -472
  437. package/lib/engine-components/SyncedCamera.d.ts +41 -41
  438. package/lib/engine-components/SyncedCamera.js +199 -199
  439. package/lib/engine-components/SyncedRoom.d.ts +106 -106
  440. package/lib/engine-components/SyncedRoom.js +371 -371
  441. package/lib/engine-components/SyncedTransform.d.ts +94 -94
  442. package/lib/engine-components/SyncedTransform.js +331 -331
  443. package/lib/engine-components/TestRunner.d.ts +16 -16
  444. package/lib/engine-components/TestRunner.js +102 -102
  445. package/lib/engine-components/TransformGizmo.d.ts +75 -75
  446. package/lib/engine-components/TransformGizmo.js +209 -209
  447. package/lib/engine-components/VideoPlayer.d.ts +184 -184
  448. package/lib/engine-components/VideoPlayer.js +978 -978
  449. package/lib/engine-components/Voip.d.ts +67 -67
  450. package/lib/engine-components/Voip.js +360 -360
  451. package/lib/engine-components/api.d.ts +51 -51
  452. package/lib/engine-components/api.js +50 -50
  453. package/lib/engine-components/avatar/AvatarBlink_Simple.d.ts +11 -11
  454. package/lib/engine-components/avatar/AvatarBlink_Simple.js +76 -76
  455. package/lib/engine-components/avatar/AvatarEyeLook_Rotation.d.ts +14 -14
  456. package/lib/engine-components/avatar/AvatarEyeLook_Rotation.js +68 -68
  457. package/lib/engine-components/avatar/Avatar_Brain_LookAt.d.ts +29 -29
  458. package/lib/engine-components/avatar/Avatar_Brain_LookAt.js +121 -121
  459. package/lib/engine-components/avatar/Avatar_MouthShapes.d.ts +15 -15
  460. package/lib/engine-components/avatar/Avatar_MouthShapes.js +79 -79
  461. package/lib/engine-components/avatar/Avatar_MustacheShake.d.ts +9 -9
  462. package/lib/engine-components/avatar/Avatar_MustacheShake.js +29 -29
  463. package/lib/engine-components/codegen/components.d.ts +216 -216
  464. package/lib/engine-components/codegen/components.js +218 -218
  465. package/lib/engine-components/debug/LogStats.d.ts +5 -5
  466. package/lib/engine-components/debug/LogStats.js +18 -18
  467. package/lib/engine-components/export/gltf/GltfExport.d.ts +30 -30
  468. package/lib/engine-components/export/gltf/GltfExport.js +246 -246
  469. package/lib/engine-components/export/gltf/index.d.ts +1 -1
  470. package/lib/engine-components/export/gltf/index.js +1 -1
  471. package/lib/engine-components/export/index.d.ts +1 -1
  472. package/lib/engine-components/export/index.js +1 -1
  473. package/lib/engine-components/export/usdz/Extension.d.ts +22 -22
  474. package/lib/engine-components/export/usdz/Extension.js +1 -1
  475. package/lib/engine-components/export/usdz/ThreeUSDZExporter.d.ts +162 -162
  476. package/lib/engine-components/export/usdz/ThreeUSDZExporter.js +1789 -1789
  477. package/lib/engine-components/export/usdz/USDZExporter.d.ts +130 -130
  478. package/lib/engine-components/export/usdz/USDZExporter.js +663 -663
  479. package/lib/engine-components/export/usdz/extensions/Animation.d.ts +106 -106
  480. package/lib/engine-components/export/usdz/extensions/Animation.js +1071 -1071
  481. package/lib/engine-components/export/usdz/extensions/DocumentExtension.d.ts +5 -5
  482. package/lib/engine-components/export/usdz/extensions/DocumentExtension.js +6 -6
  483. package/lib/engine-components/export/usdz/extensions/NodeMaterialConverter.d.ts +10 -10
  484. package/lib/engine-components/export/usdz/extensions/NodeMaterialConverter.js +451 -451
  485. package/lib/engine-components/export/usdz/extensions/USDZText.d.ts +54 -54
  486. package/lib/engine-components/export/usdz/extensions/USDZText.js +203 -203
  487. package/lib/engine-components/export/usdz/extensions/USDZUI.d.ts +8 -8
  488. package/lib/engine-components/export/usdz/extensions/USDZUI.js +158 -158
  489. package/lib/engine-components/export/usdz/extensions/behavior/Actions.d.ts +30 -30
  490. package/lib/engine-components/export/usdz/extensions/behavior/Actions.js +88 -88
  491. package/lib/engine-components/export/usdz/extensions/behavior/AudioExtension.d.ts +10 -10
  492. package/lib/engine-components/export/usdz/extensions/behavior/AudioExtension.js +86 -86
  493. package/lib/engine-components/export/usdz/extensions/behavior/Behaviour.d.ts +28 -28
  494. package/lib/engine-components/export/usdz/extensions/behavior/Behaviour.js +290 -290
  495. package/lib/engine-components/export/usdz/extensions/behavior/BehaviourComponents.d.ts +190 -190
  496. package/lib/engine-components/export/usdz/extensions/behavior/BehaviourComponents.js +1060 -1060
  497. package/lib/engine-components/export/usdz/extensions/behavior/BehavioursBuilder.d.ts +135 -135
  498. package/lib/engine-components/export/usdz/extensions/behavior/BehavioursBuilder.js +548 -548
  499. package/lib/engine-components/export/usdz/extensions/behavior/PhysicsExtension.d.ts +7 -7
  500. package/lib/engine-components/export/usdz/extensions/behavior/PhysicsExtension.js +115 -115
  501. package/lib/engine-components/export/usdz/index.d.ts +3 -3
  502. package/lib/engine-components/export/usdz/index.js +2 -2
  503. package/lib/engine-components/export/usdz/utils/animationutils.d.ts +7 -7
  504. package/lib/engine-components/export/usdz/utils/animationutils.js +163 -163
  505. package/lib/engine-components/export/usdz/utils/quicklook.d.ts +2 -2
  506. package/lib/engine-components/export/usdz/utils/quicklook.js +43 -43
  507. package/lib/engine-components/particlesystem/ParticleSystem.d.ts +177 -177
  508. package/lib/engine-components/particlesystem/ParticleSystem.js +1176 -1176
  509. package/lib/engine-components/particlesystem/ParticleSystemModules.d.ts +526 -526
  510. package/lib/engine-components/particlesystem/ParticleSystemModules.js +1930 -1930
  511. package/lib/engine-components/particlesystem/ParticleSystemSubEmitter.d.ts +25 -25
  512. package/lib/engine-components/particlesystem/ParticleSystemSubEmitter.js +87 -87
  513. package/lib/engine-components/particlesystem/api.d.ts +2 -2
  514. package/lib/engine-components/particlesystem/api.js +2 -2
  515. package/lib/engine-components/postprocessing/Effects/Antialiasing.d.ts +17 -17
  516. package/lib/engine-components/postprocessing/Effects/Antialiasing.js +59 -59
  517. package/lib/engine-components/postprocessing/Effects/BloomEffect.d.ts +46 -46
  518. package/lib/engine-components/postprocessing/Effects/BloomEffect.js +113 -113
  519. package/lib/engine-components/postprocessing/Effects/ChromaticAberration.d.ts +11 -11
  520. package/lib/engine-components/postprocessing/Effects/ChromaticAberration.js +39 -39
  521. package/lib/engine-components/postprocessing/Effects/ColorAdjustments.d.ts +23 -23
  522. package/lib/engine-components/postprocessing/Effects/ColorAdjustments.js +111 -111
  523. package/lib/engine-components/postprocessing/Effects/DepthOfField.d.ts +25 -25
  524. package/lib/engine-components/postprocessing/Effects/DepthOfField.js +104 -104
  525. package/lib/engine-components/postprocessing/Effects/EffectWrapper.d.ts +12 -12
  526. package/lib/engine-components/postprocessing/Effects/EffectWrapper.js +18 -18
  527. package/lib/engine-components/postprocessing/Effects/Pixelation.d.ts +11 -11
  528. package/lib/engine-components/postprocessing/Effects/Pixelation.js +32 -32
  529. package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusion.d.ts +18 -18
  530. package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusion.js +91 -91
  531. package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.d.ts +70 -70
  532. package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.js +176 -176
  533. package/lib/engine-components/postprocessing/Effects/Sharpening.d.ts +18 -18
  534. package/lib/engine-components/postprocessing/Effects/Sharpening.js +127 -127
  535. package/lib/engine-components/postprocessing/Effects/TiltShiftEffect.d.ts +17 -17
  536. package/lib/engine-components/postprocessing/Effects/TiltShiftEffect.js +70 -70
  537. package/lib/engine-components/postprocessing/Effects/Tonemapping.d.ts +19 -19
  538. package/lib/engine-components/postprocessing/Effects/Tonemapping.js +94 -94
  539. package/lib/engine-components/postprocessing/Effects/Tonemapping.js.map +1 -1
  540. package/lib/engine-components/postprocessing/Effects/Tonemapping.utils.d.ts +13 -13
  541. package/lib/engine-components/postprocessing/Effects/Tonemapping.utils.js +51 -51
  542. package/lib/engine-components/postprocessing/Effects/Vignette.d.ts +15 -15
  543. package/lib/engine-components/postprocessing/Effects/Vignette.js +60 -60
  544. package/lib/engine-components/postprocessing/PostProcessingEffect.d.ts +90 -90
  545. package/lib/engine-components/postprocessing/PostProcessingEffect.js +168 -168
  546. package/lib/engine-components/postprocessing/PostProcessingHandler.d.ts +42 -42
  547. package/lib/engine-components/postprocessing/PostProcessingHandler.js +494 -494
  548. package/lib/engine-components/postprocessing/Volume.d.ts +90 -90
  549. package/lib/engine-components/postprocessing/Volume.js +385 -385
  550. package/lib/engine-components/postprocessing/VolumeParameter.d.ts +26 -26
  551. package/lib/engine-components/postprocessing/VolumeParameter.js +136 -136
  552. package/lib/engine-components/postprocessing/VolumeProfile.d.ts +15 -15
  553. package/lib/engine-components/postprocessing/VolumeProfile.js +60 -60
  554. package/lib/engine-components/postprocessing/index.d.ts +6 -6
  555. package/lib/engine-components/postprocessing/index.js +6 -6
  556. package/lib/engine-components/postprocessing/utils.d.ts +55 -55
  557. package/lib/engine-components/postprocessing/utils.js +119 -119
  558. package/lib/engine-components/timeline/PlayableDirector.d.ts +163 -163
  559. package/lib/engine-components/timeline/PlayableDirector.js +686 -686
  560. package/lib/engine-components/timeline/SignalAsset.d.ts +24 -24
  561. package/lib/engine-components/timeline/SignalAsset.js +130 -130
  562. package/lib/engine-components/timeline/TimelineModels.d.ts +89 -89
  563. package/lib/engine-components/timeline/TimelineModels.js +22 -22
  564. package/lib/engine-components/timeline/TimelineTracks.d.ts +110 -110
  565. package/lib/engine-components/timeline/TimelineTracks.js +879 -879
  566. package/lib/engine-components/timeline/index.d.ts +4 -4
  567. package/lib/engine-components/timeline/index.js +3 -3
  568. package/lib/engine-components/ui/BaseUIComponent.d.ts +48 -48
  569. package/lib/engine-components/ui/BaseUIComponent.js +170 -170
  570. package/lib/engine-components/ui/Button.d.ts +64 -64
  571. package/lib/engine-components/ui/Button.js +315 -315
  572. package/lib/engine-components/ui/Canvas.d.ts +74 -74
  573. package/lib/engine-components/ui/Canvas.js +407 -407
  574. package/lib/engine-components/ui/CanvasGroup.d.ts +19 -19
  575. package/lib/engine-components/ui/CanvasGroup.js +58 -58
  576. package/lib/engine-components/ui/EventSystem.d.ts +125 -125
  577. package/lib/engine-components/ui/EventSystem.js +765 -765
  578. package/lib/engine-components/ui/Graphic.d.ts +55 -55
  579. package/lib/engine-components/ui/Graphic.js +255 -255
  580. package/lib/engine-components/ui/Image.d.ts +35 -35
  581. package/lib/engine-components/ui/Image.js +116 -116
  582. package/lib/engine-components/ui/InputField.d.ts +42 -42
  583. package/lib/engine-components/ui/InputField.js +268 -268
  584. package/lib/engine-components/ui/Interfaces.d.ts +38 -38
  585. package/lib/engine-components/ui/Interfaces.js +12 -12
  586. package/lib/engine-components/ui/Layout.d.ts +84 -84
  587. package/lib/engine-components/ui/Layout.js +330 -330
  588. package/lib/engine-components/ui/Outline.d.ts +7 -7
  589. package/lib/engine-components/ui/Outline.js +20 -20
  590. package/lib/engine-components/ui/PointerEvents.d.ts +115 -115
  591. package/lib/engine-components/ui/PointerEvents.js +145 -145
  592. package/lib/engine-components/ui/RaycastUtils.d.ts +11 -11
  593. package/lib/engine-components/ui/RaycastUtils.js +67 -67
  594. package/lib/engine-components/ui/Raycaster.d.ts +30 -30
  595. package/lib/engine-components/ui/Raycaster.js +95 -95
  596. package/lib/engine-components/ui/RectTransform.d.ts +61 -61
  597. package/lib/engine-components/ui/RectTransform.js +356 -356
  598. package/lib/engine-components/ui/SpatialHtml.d.ts +8 -8
  599. package/lib/engine-components/ui/SpatialHtml.js +79 -79
  600. package/lib/engine-components/ui/Symbols.d.ts +1 -1
  601. package/lib/engine-components/ui/Symbols.js +1 -1
  602. package/lib/engine-components/ui/Text.d.ts +78 -78
  603. package/lib/engine-components/ui/Text.js +539 -539
  604. package/lib/engine-components/ui/Utils.d.ts +24 -24
  605. package/lib/engine-components/ui/Utils.js +90 -90
  606. package/lib/engine-components/ui/index.d.ts +1 -1
  607. package/lib/engine-components/ui/index.js +1 -1
  608. package/lib/engine-components/utils/EnvironmentScene.d.ts +5 -5
  609. package/lib/engine-components/utils/EnvironmentScene.js +205 -205
  610. package/lib/engine-components/utils/LookAt.d.ts +31 -31
  611. package/lib/engine-components/utils/LookAt.js +82 -82
  612. package/lib/engine-components/utils/OpenURL.d.ts +42 -42
  613. package/lib/engine-components/utils/OpenURL.js +119 -119
  614. package/lib/engine-components/webxr/Avatar.d.ts +25 -25
  615. package/lib/engine-components/webxr/Avatar.js +255 -255
  616. package/lib/engine-components/webxr/TeleportTarget.d.ts +7 -7
  617. package/lib/engine-components/webxr/TeleportTarget.js +7 -7
  618. package/lib/engine-components/webxr/WebARCameraBackground.d.ts +30 -30
  619. package/lib/engine-components/webxr/WebARCameraBackground.js +155 -155
  620. package/lib/engine-components/webxr/WebARSessionRoot.d.ts +98 -98
  621. package/lib/engine-components/webxr/WebARSessionRoot.js +770 -770
  622. package/lib/engine-components/webxr/WebXR.d.ts +232 -232
  623. package/lib/engine-components/webxr/WebXR.js +561 -561
  624. package/lib/engine-components/webxr/WebXRAvatar.d.ts +27 -27
  625. package/lib/engine-components/webxr/WebXRAvatar.js +44 -44
  626. package/lib/engine-components/webxr/WebXRImageTracking.d.ts +86 -86
  627. package/lib/engine-components/webxr/WebXRImageTracking.js +471 -471
  628. package/lib/engine-components/webxr/WebXRPlaneTracking.d.ts +92 -92
  629. package/lib/engine-components/webxr/WebXRPlaneTracking.js +500 -500
  630. package/lib/engine-components/webxr/WebXRRig.d.ts +32 -32
  631. package/lib/engine-components/webxr/WebXRRig.js +72 -72
  632. package/lib/engine-components/webxr/XRFlag.d.ts +38 -38
  633. package/lib/engine-components/webxr/XRFlag.js +139 -139
  634. package/lib/engine-components/webxr/controllers/XRControllerFollow.d.ts +47 -47
  635. package/lib/engine-components/webxr/controllers/XRControllerFollow.js +120 -120
  636. package/lib/engine-components/webxr/controllers/XRControllerModel.d.ts +43 -43
  637. package/lib/engine-components/webxr/controllers/XRControllerModel.js +352 -352
  638. package/lib/engine-components/webxr/controllers/XRControllerMovement.d.ts +78 -78
  639. package/lib/engine-components/webxr/controllers/XRControllerMovement.js +506 -506
  640. package/lib/engine-components/webxr/index.d.ts +3 -3
  641. package/lib/engine-components/webxr/index.js +3 -3
  642. package/lib/engine-components/webxr/types.d.ts +3 -3
  643. package/lib/engine-components/webxr/types.js +1 -1
  644. package/lib/engine-components-experimental/Presentation.d.ts +6 -6
  645. package/lib/engine-components-experimental/Presentation.js +9 -9
  646. package/lib/engine-components-experimental/api.d.ts +4 -4
  647. package/lib/engine-components-experimental/api.js +4 -4
  648. package/lib/engine-components-experimental/networking/PlayerSync.d.ts +156 -156
  649. package/lib/engine-components-experimental/networking/PlayerSync.js +377 -377
  650. package/lib/engine-schemes/api.d.ts +12 -12
  651. package/lib/engine-schemes/api.js +12 -12
  652. package/lib/engine-schemes/schemes.d.ts +7 -7
  653. package/lib/engine-schemes/schemes.js +19 -19
  654. package/lib/engine-schemes/synced-camera-model.d.ts +25 -25
  655. package/lib/engine-schemes/synced-camera-model.js +67 -67
  656. package/lib/engine-schemes/synced-transform-model.d.ts +31 -31
  657. package/lib/engine-schemes/synced-transform-model.js +66 -66
  658. package/lib/engine-schemes/transform.d.ts +12 -12
  659. package/lib/engine-schemes/transform.js +39 -39
  660. package/lib/engine-schemes/vec2.d.ts +10 -10
  661. package/lib/engine-schemes/vec2.js +25 -25
  662. package/lib/engine-schemes/vec3.d.ts +11 -11
  663. package/lib/engine-schemes/vec3.js +29 -29
  664. package/lib/engine-schemes/vec4.d.ts +12 -12
  665. package/lib/engine-schemes/vec4.js +33 -33
  666. package/lib/engine-schemes/vr-user-state-buffer.d.ts +37 -37
  667. package/lib/engine-schemes/vr-user-state-buffer.js +110 -110
  668. package/lib/include/three/EXT_mesh_gpu_instancing_exporter.d.ts +6 -6
  669. package/lib/include/three/EXT_mesh_gpu_instancing_exporter.js +45 -45
  670. package/lib/needle-engine.d.ts +7 -7
  671. package/lib/needle-engine.js +64 -64
  672. package/package.json +3 -3
  673. package/plugins/common/buildinfo.js +64 -64
  674. package/plugins/common/cloud.js +1 -1
  675. package/plugins/common/config.cjs +31 -31
  676. package/plugins/common/config.js +35 -35
  677. package/plugins/common/files.js +31 -31
  678. package/plugins/common/generator.js +10 -10
  679. package/plugins/common/license.js +452 -452
  680. package/plugins/common/logger.js +327 -327
  681. package/plugins/common/npm.js +15 -15
  682. package/plugins/common/timers.js +7 -7
  683. package/plugins/common/version.js +37 -37
  684. package/plugins/gltf-packer.mjs +1 -1
  685. package/plugins/next/alias.cjs +39 -39
  686. package/plugins/next/license.cjs +24 -24
  687. package/plugins/next/meshbvhworker.cjs +18 -18
  688. package/plugins/next/next.js +141 -141
  689. package/plugins/types/index.d.ts +2 -2
  690. package/plugins/types/license.d.ts +24 -24
  691. package/plugins/types/needleConfig.d.ts +27 -27
  692. package/plugins/types/next.d.ts +2 -2
  693. package/plugins/types/userconfig.d.ts +124 -124
  694. package/plugins/types/vite.d.ts +13 -13
  695. package/plugins/types/webmanifest.d.ts +32 -32
  696. package/plugins/vite/alias.js +189 -189
  697. package/plugins/vite/asap.js +251 -251
  698. package/plugins/vite/build-pipeline.js +371 -371
  699. package/plugins/vite/build.js +19 -19
  700. package/plugins/vite/buildinfo.js +41 -41
  701. package/plugins/vite/config.js +106 -106
  702. package/plugins/vite/copyfiles.js +138 -138
  703. package/plugins/vite/defines.js +70 -70
  704. package/plugins/vite/dependencies.js +232 -232
  705. package/plugins/vite/dependency-watcher.js +237 -237
  706. package/plugins/vite/drop-client.js +76 -76
  707. package/plugins/vite/drop.js +87 -87
  708. package/plugins/vite/editor-connection.js +124 -124
  709. package/plugins/vite/facebook-instant-games.js +102 -102
  710. package/plugins/vite/gzip.js +5 -5
  711. package/plugins/vite/imports-logger.js +143 -143
  712. package/plugins/vite/index.js +147 -147
  713. package/plugins/vite/license.js +56 -56
  714. package/plugins/vite/local-files.js +440 -440
  715. package/plugins/vite/logger.client.js +272 -272
  716. package/plugins/vite/logger.js +100 -100
  717. package/plugins/vite/materialx.js +31 -31
  718. package/plugins/vite/meta.js +163 -163
  719. package/plugins/vite/npm.js +7 -7
  720. package/plugins/vite/peer.js +29 -29
  721. package/plugins/vite/poster-client.js +73 -73
  722. package/plugins/vite/poster.js +79 -79
  723. package/plugins/vite/pwa.js +604 -604
  724. package/plugins/vite/reload-client.js +15 -15
  725. package/plugins/vite/reload.js +351 -351
  726. package/plugins/vite/server.js +66 -66
  727. package/plugins/vite/transform-codegen.js +55 -55
  728. package/plugins/vite/transform.js +32 -32
  729. package/plugins/vite/vite-4.4-hack.js +31 -31
  730. package/src/asap/needle-asap.ts +111 -111
  731. package/src/asap/sessiongranted.ts +75 -75
  732. package/src/asap/utils.ts +4 -4
  733. package/src/engine/analytics/index.ts +10 -10
  734. package/src/engine/analytics/lcp.ts +35 -35
  735. package/src/engine/api.ts +82 -82
  736. package/src/engine/assets/index.ts +59 -59
  737. package/src/engine/assets/static.js +5 -5
  738. package/src/engine/codegen/register_types.ts +300 -300
  739. package/src/engine/debug/debug.ts +51 -51
  740. package/src/engine/debug/debug_console.ts +333 -333
  741. package/src/engine/debug/debug_overlay.ts +332 -332
  742. package/src/engine/debug/debug_spatial_console.ts +429 -429
  743. package/src/engine/debug/index.ts +1 -1
  744. package/src/engine/engine_addressables.ts +671 -671
  745. package/src/engine/engine_animation.ts +145 -145
  746. package/src/engine/engine_application.ts +113 -113
  747. package/src/engine/engine_assetdatabase.ts +389 -389
  748. package/src/engine/engine_audio.ts +24 -24
  749. package/src/engine/engine_camera.ts +39 -39
  750. package/src/engine/engine_components.ts +366 -366
  751. package/src/engine/engine_components_internal.ts +40 -40
  752. package/src/engine/engine_constants.ts +52 -52
  753. package/src/engine/engine_context.ts +1822 -1824
  754. package/src/engine/engine_context_registry.ts +129 -129
  755. package/src/engine/engine_coroutine.ts +54 -54
  756. package/src/engine/engine_create_objects.ts +411 -411
  757. package/src/engine/engine_default_parameters.ts +3 -3
  758. package/src/engine/engine_editor-sync.ts +28 -28
  759. package/src/engine/engine_fileloader.js +9 -9
  760. package/src/engine/engine_gameobject.ts +712 -712
  761. package/src/engine/engine_generic_utils.js +13 -13
  762. package/src/engine/engine_gizmos.ts +577 -577
  763. package/src/engine/engine_gltf.ts +29 -29
  764. package/src/engine/engine_gltf_builtin_components.ts +403 -403
  765. package/src/engine/engine_hot_reload.ts +210 -210
  766. package/src/engine/engine_input.ts +1500 -1500
  767. package/src/engine/engine_input_utils.ts +23 -23
  768. package/src/engine/engine_instancing.ts +45 -45
  769. package/src/engine/engine_license.ts +386 -386
  770. package/src/engine/engine_lifecycle_api.ts +113 -113
  771. package/src/engine/engine_lifecycle_functions_internal.ts +193 -193
  772. package/src/engine/engine_lightdata.ts +125 -125
  773. package/src/engine/engine_loaders.callbacks.ts +136 -136
  774. package/src/engine/engine_loaders.gltf.ts +82 -82
  775. package/src/engine/engine_loaders.ts +378 -378
  776. package/src/engine/engine_lods.ts +185 -186
  777. package/src/engine/engine_mainloop_utils.ts +472 -472
  778. package/src/engine/engine_math.ts +282 -282
  779. package/src/engine/engine_modules.ts +83 -83
  780. package/src/engine/engine_networking.ts +862 -862
  781. package/src/engine/engine_networking_auto.ts +352 -352
  782. package/src/engine/engine_networking_blob.ts +275 -275
  783. package/src/engine/engine_networking_files.ts +217 -217
  784. package/src/engine/engine_networking_files_default_components.ts +58 -58
  785. package/src/engine/engine_networking_instantiate.ts +419 -419
  786. package/src/engine/engine_networking_peer.ts +159 -159
  787. package/src/engine/engine_networking_streams.ts +713 -713
  788. package/src/engine/engine_networking_types.ts +24 -24
  789. package/src/engine/engine_networking_utils.ts +23 -23
  790. package/src/engine/engine_networking_websocket.ts +2 -2
  791. package/src/engine/engine_patcher.ts +199 -199
  792. package/src/engine/engine_physics.ts +783 -783
  793. package/src/engine/engine_physics.types.ts +46 -46
  794. package/src/engine/engine_physics_rapier.ts +1577 -1577
  795. package/src/engine/engine_playerview.ts +80 -80
  796. package/src/engine/engine_scenelighting.ts +294 -294
  797. package/src/engine/engine_serialization.ts +2 -2
  798. package/src/engine/engine_serialization_builtin_serializer.ts +473 -473
  799. package/src/engine/engine_serialization_core.ts +720 -720
  800. package/src/engine/engine_serialization_decorator.ts +80 -80
  801. package/src/engine/engine_setup.ts +1 -1
  802. package/src/engine/engine_shaders.ts +267 -267
  803. package/src/engine/engine_shims.ts +32 -32
  804. package/src/engine/engine_test_utils.ts +109 -109
  805. package/src/engine/engine_texture.ts +82 -82
  806. package/src/engine/engine_three_utils.ts +928 -928
  807. package/src/engine/engine_time.ts +94 -94
  808. package/src/engine/engine_time_utils.ts +237 -237
  809. package/src/engine/engine_tonemapping.ts +209 -208
  810. package/src/engine/engine_types.ts +730 -730
  811. package/src/engine/engine_typestore.ts +63 -63
  812. package/src/engine/engine_util_decorator.ts +136 -136
  813. package/src/engine/engine_utils.ts +1115 -1115
  814. package/src/engine/engine_utils_format.ts +273 -273
  815. package/src/engine/engine_utils_screenshot.ts +708 -708
  816. package/src/engine/engine_utils_screenshot.xr.ts +103 -103
  817. package/src/engine/export/gltf/Writers.ts +34 -34
  818. package/src/engine/export/gltf/index.ts +158 -158
  819. package/src/engine/export/index.ts +2 -2
  820. package/src/engine/export/state.ts +19 -19
  821. package/src/engine/export/utils.ts +9 -9
  822. package/src/engine/extensions/EXT_texture_exr.ts +50 -50
  823. package/src/engine/extensions/NEEDLE_animator_controller_model.ts +195 -195
  824. package/src/engine/extensions/NEEDLE_components.ts +268 -268
  825. package/src/engine/extensions/NEEDLE_gameobject_data.ts +81 -81
  826. package/src/engine/extensions/NEEDLE_lighting_settings.ts +185 -185
  827. package/src/engine/extensions/NEEDLE_lightmaps.ts +119 -119
  828. package/src/engine/extensions/NEEDLE_persistent_assets.ts +76 -76
  829. package/src/engine/extensions/NEEDLE_render_objects.ts +209 -209
  830. package/src/engine/extensions/NEEDLE_techniques_webgl.ts +640 -640
  831. package/src/engine/extensions/extension_resolver.ts +4 -4
  832. package/src/engine/extensions/extension_utils.ts +166 -166
  833. package/src/engine/extensions/extensions.ts +140 -140
  834. package/src/engine/extensions/index.ts +5 -5
  835. package/src/engine/extensions/usage_tracker.ts +100 -100
  836. package/src/engine/js-extensions/Camera.ts +37 -37
  837. package/src/engine/js-extensions/ExtensionUtils.ts +85 -85
  838. package/src/engine/js-extensions/Layers.ts +23 -23
  839. package/src/engine/js-extensions/Object3D.ts +296 -296
  840. package/src/engine/js-extensions/RGBAColor.ts +126 -126
  841. package/src/engine/js-extensions/Vector.ts +18 -18
  842. package/src/engine/js-extensions/index.ts +4 -4
  843. package/src/engine/physics/workers/mesh-bvh/GenerateMeshBVHWorker.js +125 -125
  844. package/src/engine/shaders/shaderData.ts +67 -67
  845. package/src/engine/tests/test_utils.ts +63 -63
  846. package/src/engine/webcomponents/WebXRButtons.ts +260 -260
  847. package/src/engine/webcomponents/api.ts +6 -6
  848. package/src/engine/webcomponents/buttons.ts +292 -292
  849. package/src/engine/webcomponents/fonts.ts +41 -41
  850. package/src/engine/webcomponents/icons.ts +57 -57
  851. package/src/engine/webcomponents/index.ts +1 -1
  852. package/src/engine/webcomponents/logo-element.ts +78 -78
  853. package/src/engine/webcomponents/needle menu/needle-menu-spatial.ts +573 -573
  854. package/src/engine/webcomponents/needle menu/needle-menu.ts +1118 -1118
  855. package/src/engine/webcomponents/needle-button.ts +181 -181
  856. package/src/engine/webcomponents/needle-engine.ar-overlay.ts +186 -186
  857. package/src/engine/webcomponents/needle-engine.attributes.ts +82 -82
  858. package/src/engine/webcomponents/needle-engine.extras.ts +16 -16
  859. package/src/engine/webcomponents/needle-engine.loading.ts +373 -373
  860. package/src/engine/webcomponents/needle-engine.ts +890 -860
  861. package/src/engine/xr/NeedleXRController.ts +1125 -1125
  862. package/src/engine/xr/NeedleXRSession.ts +1624 -1624
  863. package/src/engine/xr/NeedleXRSync.ts +220 -220
  864. package/src/engine/xr/SceneTransition.ts +78 -78
  865. package/src/engine/xr/TempXRContext.ts +216 -216
  866. package/src/engine/xr/XRRig.ts +9 -9
  867. package/src/engine/xr/api.ts +5 -5
  868. package/src/engine/xr/events.ts +102 -102
  869. package/src/engine/xr/internal.ts +34 -34
  870. package/src/engine/xr/usdz.ts +30 -30
  871. package/src/engine/xr/utils.ts +39 -39
  872. package/src/engine-components/AlignmentConstraint.ts +36 -36
  873. package/src/engine-components/Animation.ts +557 -557
  874. package/src/engine-components/AnimationCurve.ts +150 -150
  875. package/src/engine-components/AnimationUtils.ts +28 -28
  876. package/src/engine-components/AnimationUtilsAutoplay.ts +43 -43
  877. package/src/engine-components/Animator.ts +397 -397
  878. package/src/engine-components/AnimatorController.ts +1293 -1293
  879. package/src/engine-components/AudioListener.ts +92 -92
  880. package/src/engine-components/AudioSource.ts +644 -644
  881. package/src/engine-components/AvatarLoader.ts +263 -263
  882. package/src/engine-components/AxesHelper.ts +59 -59
  883. package/src/engine-components/BasicIKConstraint.ts +54 -54
  884. package/src/engine-components/BoxCollider.ts +1 -1
  885. package/src/engine-components/BoxHelperComponent.ts +114 -114
  886. package/src/engine-components/Camera.ts +719 -719
  887. package/src/engine-components/CameraUtils.ts +138 -138
  888. package/src/engine-components/CharacterController.ts +253 -253
  889. package/src/engine-components/Collider.ts +374 -374
  890. package/src/engine-components/Component.ts +1297 -1297
  891. package/src/engine-components/ContactShadows.ts +506 -506
  892. package/src/engine-components/DeleteBox.ts +62 -62
  893. package/src/engine-components/DeviceFlag.ts +46 -46
  894. package/src/engine-components/DragControls.ts +1623 -1623
  895. package/src/engine-components/DropListener.ts +713 -713
  896. package/src/engine-components/Duplicatable.ts +198 -198
  897. package/src/engine-components/EventList.ts +266 -266
  898. package/src/engine-components/EventTrigger.ts +74 -74
  899. package/src/engine-components/EventType.ts +22 -22
  900. package/src/engine-components/Fog.ts +60 -60
  901. package/src/engine-components/Gizmos.ts +56 -56
  902. package/src/engine-components/GridHelper.ts +48 -48
  903. package/src/engine-components/GroundProjection.ts +356 -356
  904. package/src/engine-components/Interactable.ts +14 -14
  905. package/src/engine-components/Joints.ts +52 -52
  906. package/src/engine-components/LODGroup.ts +153 -153
  907. package/src/engine-components/Light.ts +558 -558
  908. package/src/engine-components/LookAtConstraint.ts +25 -25
  909. package/src/engine-components/NeedleMenu.ts +84 -84
  910. package/src/engine-components/NestedGltf.ts +86 -86
  911. package/src/engine-components/Networking.ts +114 -114
  912. package/src/engine-components/OffsetConstraint.ts +60 -60
  913. package/src/engine-components/OrbitControls.ts +1074 -1074
  914. package/src/engine-components/PlayerColor.ts +103 -103
  915. package/src/engine-components/ReflectionProbe.ts +220 -220
  916. package/src/engine-components/Renderer.ts +903 -903
  917. package/src/engine-components/RendererInstancing.ts +855 -855
  918. package/src/engine-components/RendererLightmap.ts +198 -198
  919. package/src/engine-components/RigidBody.ts +526 -526
  920. package/src/engine-components/SceneSwitcher.ts +1030 -1030
  921. package/src/engine-components/ScreenCapture.ts +592 -592
  922. package/src/engine-components/ShadowCatcher.ts +172 -172
  923. package/src/engine-components/Skybox.ts +475 -475
  924. package/src/engine-components/SmoothFollow.ts +76 -76
  925. package/src/engine-components/SpatialTrigger.ts +229 -229
  926. package/src/engine-components/SpectatorCamera.ts +787 -787
  927. package/src/engine-components/SphereCollider.ts +1 -1
  928. package/src/engine-components/SpriteRenderer.ts +468 -468
  929. package/src/engine-components/SyncedCamera.ts +220 -220
  930. package/src/engine-components/SyncedRoom.ts +380 -380
  931. package/src/engine-components/SyncedTransform.ts +383 -383
  932. package/src/engine-components/TestRunner.ts +118 -118
  933. package/src/engine-components/TransformGizmo.ts +219 -219
  934. package/src/engine-components/VideoPlayer.ts +1025 -1025
  935. package/src/engine-components/Voip.ts +363 -363
  936. package/src/engine-components/api.ts +60 -60
  937. package/src/engine-components/avatar/AvatarBlink_Simple.ts +69 -69
  938. package/src/engine-components/avatar/AvatarEyeLook_Rotation.ts +63 -63
  939. package/src/engine-components/avatar/Avatar_Brain_LookAt.ts +139 -139
  940. package/src/engine-components/avatar/Avatar_MouthShapes.ts +83 -83
  941. package/src/engine-components/avatar/Avatar_MustacheShake.ts +31 -31
  942. package/src/engine-components/codegen/components.ts +217 -217
  943. package/src/engine-components/debug/LogStats.ts +21 -21
  944. package/src/engine-components/export/gltf/GltfExport.ts +265 -265
  945. package/src/engine-components/export/usdz/Extension.ts +24 -24
  946. package/src/engine-components/export/usdz/ThreeUSDZExporter.ts +2426 -2426
  947. package/src/engine-components/export/usdz/USDZExporter.ts +705 -705
  948. package/src/engine-components/export/usdz/extensions/Animation.ts +1204 -1204
  949. package/src/engine-components/export/usdz/extensions/DocumentExtension.ts +9 -9
  950. package/src/engine-components/export/usdz/extensions/NodeMaterialConverter.ts +532 -532
  951. package/src/engine-components/export/usdz/extensions/USDZText.ts +240 -240
  952. package/src/engine-components/export/usdz/extensions/USDZUI.ts +189 -189
  953. package/src/engine-components/export/usdz/extensions/behavior/Actions.ts +99 -99
  954. package/src/engine-components/export/usdz/extensions/behavior/AudioExtension.ts +102 -102
  955. package/src/engine-components/export/usdz/extensions/behavior/Behaviour.ts +320 -320
  956. package/src/engine-components/export/usdz/extensions/behavior/BehaviourComponents.ts +1225 -1225
  957. package/src/engine-components/export/usdz/extensions/behavior/BehavioursBuilder.ts +646 -646
  958. package/src/engine-components/export/usdz/extensions/behavior/PhysicsExtension.ts +132 -132
  959. package/src/engine-components/export/usdz/index.ts +2 -2
  960. package/src/engine-components/export/usdz/utils/animationutils.ts +191 -191
  961. package/src/engine-components/export/usdz/utils/quicklook.ts +50 -50
  962. package/src/engine-components/particlesystem/ParticleSystem.ts +1287 -1287
  963. package/src/engine-components/particlesystem/ParticleSystemModules.ts +1765 -1765
  964. package/src/engine-components/particlesystem/ParticleSystemSubEmitter.ts +111 -111
  965. package/src/engine-components/particlesystem/api.ts +1 -1
  966. package/src/engine-components/postprocessing/Effects/Antialiasing.ts +64 -64
  967. package/src/engine-components/postprocessing/Effects/BloomEffect.ts +116 -116
  968. package/src/engine-components/postprocessing/Effects/ChromaticAberration.ts +37 -37
  969. package/src/engine-components/postprocessing/Effects/ColorAdjustments.ts +106 -106
  970. package/src/engine-components/postprocessing/Effects/DepthOfField.ts +103 -103
  971. package/src/engine-components/postprocessing/Effects/EffectWrapper.ts +25 -25
  972. package/src/engine-components/postprocessing/Effects/Pixelation.ts +32 -32
  973. package/src/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusion.ts +90 -90
  974. package/src/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.ts +192 -192
  975. package/src/engine-components/postprocessing/Effects/Sharpening.ts +143 -143
  976. package/src/engine-components/postprocessing/Effects/TiltShiftEffect.ts +61 -61
  977. package/src/engine-components/postprocessing/Effects/Tonemapping.ts +103 -103
  978. package/src/engine-components/postprocessing/Effects/Tonemapping.utils.ts +60 -60
  979. package/src/engine-components/postprocessing/Effects/Vignette.ts +59 -59
  980. package/src/engine-components/postprocessing/PostProcessingEffect.ts +192 -192
  981. package/src/engine-components/postprocessing/PostProcessingHandler.ts +572 -572
  982. package/src/engine-components/postprocessing/Volume.ts +426 -426
  983. package/src/engine-components/postprocessing/VolumeParameter.ts +158 -158
  984. package/src/engine-components/postprocessing/VolumeProfile.ts +61 -61
  985. package/src/engine-components/postprocessing/index.ts +5 -5
  986. package/src/engine-components/postprocessing/utils.ts +154 -154
  987. package/src/engine-components/timeline/PlayableDirector.ts +722 -722
  988. package/src/engine-components/timeline/SignalAsset.ts +144 -144
  989. package/src/engine-components/timeline/TimelineModels.ts +92 -92
  990. package/src/engine-components/timeline/TimelineTracks.ts +967 -967
  991. package/src/engine-components/timeline/index.ts +3 -3
  992. package/src/engine-components/ui/BaseUIComponent.ts +203 -203
  993. package/src/engine-components/ui/Button.ts +307 -307
  994. package/src/engine-components/ui/Canvas.ts +419 -419
  995. package/src/engine-components/ui/CanvasGroup.ts +54 -54
  996. package/src/engine-components/ui/EventSystem.ts +854 -854
  997. package/src/engine-components/ui/Graphic.ts +275 -275
  998. package/src/engine-components/ui/Image.ts +112 -112
  999. package/src/engine-components/ui/InputField.ts +321 -321
  1000. package/src/engine-components/ui/Interfaces.ts +57 -57
  1001. package/src/engine-components/ui/Layout.ts +334 -334
  1002. package/src/engine-components/ui/Outline.ts +13 -13
  1003. package/src/engine-components/ui/PointerEvents.ts +206 -206
  1004. package/src/engine-components/ui/RaycastUtils.ts +69 -69
  1005. package/src/engine-components/ui/Raycaster.ts +102 -102
  1006. package/src/engine-components/ui/RectTransform.ts +375 -375
  1007. package/src/engine-components/ui/SpatialHtml.ts +79 -79
  1008. package/src/engine-components/ui/Symbols.ts +1 -1
  1009. package/src/engine-components/ui/Text.ts +578 -578
  1010. package/src/engine-components/ui/Utils.ts +113 -113
  1011. package/src/engine-components/utils/EnvironmentScene.ts +245 -245
  1012. package/src/engine-components/utils/LookAt.ts +88 -88
  1013. package/src/engine-components/utils/OpenURL.ts +114 -114
  1014. package/src/engine-components/webxr/Avatar.ts +265 -265
  1015. package/src/engine-components/webxr/TeleportTarget.ts +9 -9
  1016. package/src/engine-components/webxr/WebARCameraBackground.ts +175 -175
  1017. package/src/engine-components/webxr/WebARSessionRoot.ts +880 -880
  1018. package/src/engine-components/webxr/WebXR.ts +585 -585
  1019. package/src/engine-components/webxr/WebXRAvatar.ts +66 -66
  1020. package/src/engine-components/webxr/WebXRImageTracking.ts +519 -519
  1021. package/src/engine-components/webxr/WebXRPlaneTracking.ts +570 -570
  1022. package/src/engine-components/webxr/WebXRRig.ts +77 -77
  1023. package/src/engine-components/webxr/XRFlag.ts +147 -147
  1024. package/src/engine-components/webxr/controllers/XRControllerFollow.ts +118 -118
  1025. package/src/engine-components/webxr/controllers/XRControllerModel.ts +373 -373
  1026. package/src/engine-components/webxr/controllers/XRControllerMovement.ts +550 -550
  1027. package/src/engine-components/webxr/index.ts +2 -2
  1028. package/src/engine-components/webxr/types.ts +3 -3
  1029. package/src/engine-components-experimental/Presentation.ts +12 -12
  1030. package/src/engine-components-experimental/api.ts +4 -4
  1031. package/src/engine-components-experimental/networking/PlayerSync.ts +401 -401
  1032. package/src/engine-schemes/COMPILE_SCHEMES.bat +3 -3
  1033. package/src/engine-schemes/COMPILE_TS.bat +11 -11
  1034. package/src/engine-schemes/README.md +1 -1
  1035. package/src/engine-schemes/api.ts +12 -12
  1036. package/src/engine-schemes/schemes.ts +28 -28
  1037. package/src/engine-schemes/synced-camera-model.ts +92 -92
  1038. package/src/engine-schemes/synced-transform-model.ts +90 -90
  1039. package/src/engine-schemes/syncedCamera.fbs +10 -10
  1040. package/src/engine-schemes/transform.ts +50 -50
  1041. package/src/engine-schemes/transforms.fbs +25 -25
  1042. package/src/engine-schemes/vec.fbs +19 -19
  1043. package/src/engine-schemes/vec2.ts +33 -33
  1044. package/src/engine-schemes/vec3.ts +38 -38
  1045. package/src/engine-schemes/vec4.ts +43 -43
  1046. package/src/engine-schemes/vr-user-state-buffer.ts +145 -145
  1047. package/src/engine-schemes/vrUserStateBuffer.fbs +17 -17
  1048. package/src/include/draco/draco_decoder.js +34 -34
  1049. package/src/include/ktx2/basis_transcoder.js +21 -21
  1050. package/src/include/needle/arial-msdf.json +1471 -1471
  1051. package/src/include/three/DragControls.js +231 -231
  1052. package/src/include/three/EXT_mesh_gpu_instancing_exporter.js +66 -66
  1053. package/src/needle-engine.ts +70 -70
  1054. package/dist/generateMeshBVH.worker-Cdfpaq5W.js +0 -25
  1055. package/dist/gltf-progressive-YjtQYFa9.js +0 -1052
  1056. package/dist/gltf-progressive-yOP1mp5W.min.js +0 -8
  1057. package/dist/gltf-progressive-zdhlW609.umd.cjs +0 -8
  1058. package/src/engine-schemes/dist/api.js +0 -17
  1059. package/src/engine-schemes/dist/api.js.meta +0 -7
  1060. package/src/engine-schemes/dist/schemes.js +0 -25
  1061. package/src/engine-schemes/dist/schemes.js.meta +0 -7
  1062. package/src/engine-schemes/dist/synced-camera-model.js +0 -74
  1063. package/src/engine-schemes/dist/synced-camera-model.js.meta +0 -7
  1064. package/src/engine-schemes/dist/synced-transform-model.js +0 -73
  1065. package/src/engine-schemes/dist/synced-transform-model.js.meta +0 -7
  1066. package/src/engine-schemes/dist/transform.js +0 -46
  1067. package/src/engine-schemes/dist/transform.js.meta +0 -7
  1068. package/src/engine-schemes/dist/vec2.js +0 -32
  1069. package/src/engine-schemes/dist/vec2.js.meta +0 -7
  1070. package/src/engine-schemes/dist/vec3.js +0 -36
  1071. package/src/engine-schemes/dist/vec3.js.meta +0 -7
  1072. package/src/engine-schemes/dist/vec4.js +0 -40
  1073. package/src/engine-schemes/dist/vec4.js.meta +0 -7
  1074. package/src/engine-schemes/dist/vr-user-state-buffer.js +0 -110
  1075. package/src/engine-schemes/dist/vr-user-state-buffer.js.meta +0 -7
@@ -1,972 +1,972 @@
1
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
- return c > 3 && r && Object.defineProperty(target, key, r), r;
6
- };
7
- import { EquirectangularReflectionMapping, Object3D, Scene } from "three";
8
- import { AssetReference } from "../engine/engine_addressables.js";
9
- import { destroy } from "../engine/engine_gameobject.js";
10
- import { InputEvents } from "../engine/engine_input.js";
11
- import { isLocalNetwork } from "../engine/engine_networking_utils.js";
12
- import { serializable } from "../engine/engine_serialization.js";
13
- import { getParam, setParamWithoutReload } from "../engine/engine_utils.js";
14
- import { registerObservableAttribute } from "../engine/webcomponents/needle-engine.extras.js";
15
- import { Behaviour, GameObject } from "./Component.js";
16
- import { EventList } from "./EventList.js";
17
- const debug = getParam("debugsceneswitcher");
18
- const experimental_clearSceneOnLoad = getParam("sceneswitcher:clearscene");
19
- const ENGINE_ELEMENT_SCENE_ATTRIBUTE_NAME = "scene";
20
- registerObservableAttribute(ENGINE_ELEMENT_SCENE_ATTRIBUTE_NAME);
21
- // ContextRegistry.registerCallback(ContextEvent.ContextRegistered, async _ => {
22
- // // We need to defer import to not get issues with circular dependencies
23
- // import("../engine/engine_element").then(res => {
24
- // const webcomponent = res.NeedleEngineHTMLElement;
25
- // if (debug) console.log("SceneSwitcher: registering scene attribute", webcomponent.observedAttributes);
26
- // if (!webcomponent.observedAttributes.includes(ENGINE_ELEMENT_SCENE_ATTRIBUTE_NAME))
27
- // webcomponent.observedAttributes.push(ENGINE_ELEMENT_SCENE_ATTRIBUTE_NAME);
28
- // });
29
- // });
30
- const couldNotLoadScenePromise = Promise.resolve(false);
31
- /** The SceneSwitcher can be used to dynamically load and unload extra content
32
- * Available scenes are defined in the `scenes` array.
33
- * Loaded scenes will be added to the SceneSwitcher's GameObject as a child and removed when another scene is loaded by the same SceneSwitcher.
34
- * Live Examples
35
- * - [Multi Scenes Sample](https://engine.needle.tools/samples/multi-scenes-dynamic-loading) (source code available)
36
- * - [Needle Website](https://needle.tools)
37
- * - [Songs Of Cultures](https://app.songsofcultures.com)
38
- *
39
- * ### Interfaces
40
- * Use the {@link ISceneEventListener} interface to listen to scene open and closing events with the ability to modify transitions and stall the scene loading process.
41
- *
42
- * ### Events
43
- * - `loadscene-start`: Called when a scene starts loading
44
- * - `loadscene-finished`: Called when a scene finished loading
45
- * - `progress`: Called when a scene is loading and the progress changes
46
- * - `scene-opened`: Called when a scene is loaded and added to the SceneSwitcher's GameObject
47
- * @example
48
- * ```ts
49
- * sceneSwitcher.addEventListener("loadscene-start", (e) => {
50
- * console.log("Loading scene", e.detail.scene.url);
51
- * });
52
- * sceneSwitcher.addEventListener("loadscene-finished", (e) => {
53
- * console.log("Finished loading scene", e.detail.scene.url);
54
- * });
55
- * sceneSwitcher.addEventListener("progress", (e) => {
56
- * console.log("Loading progress", e.loaded, e.total);
57
- * });
58
- * sceneSwitcher.addEventListener("scene-opened", (e) => {
59
- * console.log("Scene opened", e.detail.scene.url);
60
- * });
61
- * ```
62
- *
63
- * @category Asset Management
64
- * @group Components
65
- */
66
- export class SceneSwitcher extends Behaviour {
67
- /** When enabled the first scene will be loaded when the SceneSwitcher becomes active
68
- * @default true
69
- */
70
- autoLoadFirstScene = true;
71
- /**
72
- * The scenes that can be loaded by the SceneSwitcher.
73
- * @default []
74
- */
75
- scenes = [];
76
- /**
77
- * The scene that is displayed while a scene is loading.
78
- * @default undefined
79
- */
80
- loadingScene;
81
- /** the url parameter that is set/used to store the currently loaded scene in, set to "" to disable
82
- * @default "scene"
83
- */
84
- queryParameterName = "scene";
85
- /**
86
- * when enabled the scene name will be used as the query parameter (otherwise the scene index will be used)
87
- * Needs `queryParameterName` set
88
- * @default true
89
- */
90
- useSceneName = true;
91
- /**
92
- * When enabled the current scene index will be clamped to the scenes array bounds.
93
- * For example when the last scene is loaded and `clamp` is true then trying to load the `next()` scene will not change the scene.
94
- * When `clamp` is false and the last scene is loaded then the first scene will be loaded instead.
95
- * @default true
96
- */
97
- clamp = true;
98
- /** when enabled the new scene is pushed to the browser navigation history, only works with a valid query parameter set
99
- * @default true
100
- */
101
- useHistory = true;
102
- /** when enabled you can switch between scenes using keyboard left, right, A and D or number keys
103
- * @default true
104
- */
105
- useKeyboard = true;
106
- /** when enabled you can switch between scenes using swipe (mobile only)
107
- * @default true
108
- */
109
- useSwipe = true;
110
- /** when enabled will automatically apply the environment scene lights
111
- * @default true
112
- */
113
- useSceneLighting = true;
114
- /** When enabled will automatically apply the skybox from the loaded scene
115
- * @default true
116
- */
117
- useSceneBackground = true;
118
- /** how many scenes after the currently active scene should be preloaded
119
- * @default 1
120
- */
121
- preloadNext = 1;
122
- /** how many scenes before the currently active scene should be preloaded
123
- * @default 1
124
- */
125
- preloadPrevious = 1;
126
- /** how many scenes can be loaded in parallel
127
- * @default 2
128
- */
129
- preloadConcurrent = 2;
130
- /**
131
- * When enabled will create a button for the Needle menu to switch to the next or previous scene
132
- * @default false
133
- */
134
- createMenuButtons = false;
135
- /** The index of the currently loaded and active scene */
136
- get currentIndex() { return this._currentIndex; }
137
- /** Get the progress of the currently loading scene. This is undefined if no scene is loading
138
- * You can also subscribe to the loading event by adding an event listener to the scene switcher.
139
- * For example like this `sceneSwitcher.addEventListeneer("progress", (e) => {...})`
140
- */
141
- get currentLoadingProgress() { return this._currentLoadingProgress; }
142
- /** The currently loading scene. This is undefined if no scene is loading. */
143
- get currentlyLoadingScene() { return this._currentlyLoadingScene; }
144
- /**
145
- * The currently loaded scene. This is undefined if no scene is loaded.
146
- */
147
- get currentlyLoadedScene() { return this._currentScene; }
148
- /**
149
- * Called when a scene starts loading
150
- */
151
- sceneLoadingStart = new EventList();
152
- sceneLoadingProgress = new EventList();
153
- /**
154
- * The sceneLoaded event is called when a scene/glTF is loaded and added to the scene
155
- */
156
- sceneLoaded = new EventList();
157
- _currentIndex = -1;
158
- _currentScene = undefined;
159
- _engineElementOverserver = undefined;
160
- _preloadScheduler;
161
- _menuButtons;
162
- /** @internal */
163
- awake() {
164
- if (this.scenes === undefined)
165
- this.scenes = [];
166
- // remove all scenes from the url that are in the scenes array at startup
167
- for (const scene of this.scenes) {
168
- if (scene && !scene.hasUrl && scene.asset instanceof Object3D) {
169
- GameObject.remove(scene.asset);
170
- }
171
- else if (scene instanceof Object3D) {
172
- GameObject.remove(scene);
173
- }
174
- }
175
- if (debug)
176
- console.log("SceneSwitcher", this);
177
- }
178
- /** @internal */
179
- async onEnable() {
180
- globalThis.addEventListener("popstate", this.onPopState);
181
- this.context.input.addEventListener(InputEvents.KeyDown, this.onInputKeyDown);
182
- this.context.input.addEventListener(InputEvents.PointerMove, this.onInputPointerMove);
183
- this.context.input.addEventListener(InputEvents.PointerUp, this.onInputPointerUp);
184
- if (!this._engineElementOverserver) {
185
- this._engineElementOverserver = new MutationObserver((mutations) => {
186
- for (const mut of mutations) {
187
- if (mut.type === "attributes" && mut.attributeName === ENGINE_ELEMENT_SCENE_ATTRIBUTE_NAME) {
188
- const value = this.context.domElement.getAttribute(ENGINE_ELEMENT_SCENE_ATTRIBUTE_NAME);
189
- if (value !== null) {
190
- this.trySelectSceneFromValue(value);
191
- }
192
- }
193
- }
194
- });
195
- }
196
- this._engineElementOverserver.observe(this.context.domElement, {
197
- attributes: true
198
- });
199
- if (!this._preloadScheduler)
200
- this._preloadScheduler = new PreLoadScheduler(this);
201
- this._preloadScheduler.maxLoadAhead = this.preloadNext;
202
- this._preloadScheduler.maxLoadBehind = this.preloadPrevious;
203
- this._preloadScheduler.maxConcurrent = this.preloadConcurrent;
204
- this._preloadScheduler.begin(2000);
205
- // Begin loading the loading scene
206
- if (this.autoLoadFirstScene && this._currentIndex === -1 && !await this.tryLoadFromQueryParam()) {
207
- const value = this.context.domElement.getAttribute(ENGINE_ELEMENT_SCENE_ATTRIBUTE_NAME);
208
- // let locked = this.lock;
209
- try {
210
- // this.lock = false;
211
- if (value === null || !await this.trySelectSceneFromValue(value)) {
212
- if (this._currentIndex === -1)
213
- this.select(0);
214
- }
215
- }
216
- finally {
217
- // this.lock = locked;
218
- }
219
- }
220
- // create the menu buttons
221
- if (this.createMenuButtons) {
222
- this._menuButtons ??= [];
223
- this._menuButtons.push(this.context.menu.appendChild({
224
- label: "Previous",
225
- icon: "arrow_back_ios",
226
- onClick: () => this.selectPrev(),
227
- priority: -1005,
228
- class: "row2"
229
- }));
230
- this._menuButtons.push(this.context.menu.appendChild({
231
- label: "Next",
232
- icon: "arrow_forward_ios",
233
- iconSide: "right",
234
- onClick: () => this.selectNext(),
235
- priority: -1000,
236
- class: "row2"
237
- }));
238
- }
239
- }
240
- /** @internal */
241
- onDisable() {
242
- globalThis.removeEventListener("popstate", this.onPopState);
243
- this.context.input.removeEventListener(InputEvents.KeyDown, this.onInputKeyDown);
244
- this.context.input.removeEventListener(InputEvents.PointerMove, this.onInputPointerMove);
245
- this.context.input.removeEventListener(InputEvents.PointerUp, this.onInputPointerUp);
246
- this._preloadScheduler?.stop();
247
- // remove the menu buttons
248
- if (this._menuButtons) {
249
- for (const button of this._menuButtons) {
250
- button.remove();
251
- }
252
- this._menuButtons = undefined;
253
- }
254
- }
255
- onPopState = async (_state) => {
256
- if (!this.useHistory)
257
- return;
258
- const wasUsingHistory = this.useHistory;
259
- try {
260
- this.useHistory = false;
261
- let didResolve = false;
262
- if (this.queryParameterName)
263
- didResolve = await this.tryLoadFromQueryParam();
264
- if (!didResolve) {
265
- const state = _state?.state;
266
- if (state && state.startsWith(this.guid)) {
267
- const value = state.substr(this.guid.length + 2);
268
- if (debug)
269
- console.log("PopState", value);
270
- await this.trySelectSceneFromValue(value);
271
- }
272
- }
273
- }
274
- finally {
275
- this.useHistory = wasUsingHistory;
276
- }
277
- };
278
- normalizedSwipeThresholdX = 0.1;
279
- _didSwipe = false;
280
- onInputPointerMove = (e) => {
281
- if (!this.useSwipe)
282
- return;
283
- if (!this._didSwipe && e.button === 0 && e.pointerType === "touch" && this.context.input.getPointerPressedCount() === 1) {
284
- const delta = this.context.input.getPointerPositionDelta(e.button);
285
- if (delta) {
286
- const normalizedX = delta.x / this.context.domWidth;
287
- if (normalizedX >= this.normalizedSwipeThresholdX) {
288
- this._didSwipe = true;
289
- this.selectPrev();
290
- }
291
- else if (normalizedX <= -this.normalizedSwipeThresholdX) {
292
- this._didSwipe = true;
293
- this.selectNext();
294
- }
295
- }
296
- }
297
- };
298
- onInputPointerUp = (e) => {
299
- if (e.button === 0) {
300
- this._didSwipe = false;
301
- }
302
- };
303
- onInputKeyDown = (e) => {
304
- if (!this.useKeyboard)
305
- return;
306
- if (!this.scenes)
307
- return;
308
- const key = e.key.toLowerCase();
309
- if (!key)
310
- return;
311
- const index = parseInt(key) - 1;
312
- if (index >= 0) {
313
- this.trySelectSceneFromValue(index);
314
- return;
315
- }
316
- switch (key) {
317
- case "arrowright":
318
- case "d":
319
- this.selectNext();
320
- break;
321
- case "arrowleft":
322
- case "a":
323
- this.selectPrev();
324
- break;
325
- }
326
- };
327
- /**
328
- * Add a scene to the SceneSwitcher.
329
- * If the scene is already added it will be added again.
330
- * @param urlOrAssetReference The url of the scene or an AssetReference to the scene
331
- * @returns The AssetReference of the scene that was added
332
- * @example
333
- * ```ts
334
- * // adding a scene:
335
- * sceneSwitcher.addScene("scene1.glb");
336
- * // add another scene and load it:
337
- * const scene2 = sceneSwitcher.addScene("scene2.glb");
338
- * sceneSwitcher.switchScene(scene2).then(res => { console.log("Scene loaded", res); });
339
- * ```
340
- */
341
- addScene(urlOrAssetReference) {
342
- if (typeof urlOrAssetReference === "string") {
343
- let assetReference = this.context.addressables.findAssetReference(urlOrAssetReference);
344
- if (!assetReference) {
345
- assetReference = new AssetReference(urlOrAssetReference);
346
- this.context.addressables.registerAssetReference(assetReference);
347
- }
348
- this.scenes.push(assetReference);
349
- return assetReference;
350
- }
351
- this.scenes.push(urlOrAssetReference);
352
- return urlOrAssetReference;
353
- }
354
- /**
355
- * Load the next scene in the scenes array ({@link this.currentIndex} + 1)
356
- * If the current scene is the last scene in the array and {@link this.clamp} is disabled then the first scene will be loaded.
357
- * @returns a promise that resolves to true if the scene was loaded successfully
358
- */
359
- selectNext() {
360
- return this.select(this._currentIndex + 1);
361
- }
362
- /**
363
- * Load the previous scene in the scenes array ({@link this.currentIndex} - 1)
364
- * If the current scene is the first scene in the array and {@link this.clamp} is disabled then the last scene will be loaded.
365
- * @returns a promise that resolves to true if the scene was loaded successfully
366
- */
367
- selectPrev() {
368
- return this.select(this._currentIndex - 1);
369
- }
370
- /**
371
- * Load a scene by its index in the scenes array.
372
- * @param index The index of the scene or a string that represents the scene uri (if the url is not known to the SceneSwitcher it will try to load the scene by its uri but it won't be added to the current scenes array. Use {@link addScene} to add a scene to the SceneSwitcher)
373
- * @returns a promise that resolves to true if the scene was loaded successfully
374
- */
375
- select(index) {
376
- if (debug)
377
- console.log("select", index);
378
- if (typeof index === "object") {
379
- // If a user tries to reference a scene object in a UnityEvent and invoke select(obj)
380
- // Then the object will be serialized as a object { guid : ... } or with the index json pointer
381
- // This case is not supported right now. Object references in the editor must not be scene references
382
- console.warn("Switching to \"" + index + "\" might not work. Please either use an index or a AssetReference (not a scene reference)");
383
- }
384
- if (typeof index === "string") {
385
- // If the parameter is a string we try to resolve the scene by its uri
386
- // it's either already known in the scenes array
387
- // or we create/get a new AssetReference and try to switch to that
388
- const scene = this.scenes?.find(s => s.url === index);
389
- if (!scene) {
390
- // Ok the scene is unknown to the scene switcher
391
- // we create a new asset reference (or get an existing one)
392
- // And switch to that. With this we can not modify the history
393
- // Until the scene switcher can store the uri in the history instead of the index
394
- const reference = AssetReference.getOrCreate(this.sourceId ?? "", index, this.context);
395
- return this.switchScene(reference);
396
- }
397
- if (scene)
398
- index = this.scenes?.indexOf(scene);
399
- else
400
- return couldNotLoadScenePromise;
401
- }
402
- if (!this.scenes?.length)
403
- return couldNotLoadScenePromise;
404
- if (index < 0) {
405
- if (this.clamp)
406
- return couldNotLoadScenePromise;
407
- index = this.scenes.length - 1;
408
- }
409
- else if (index >= this.scenes.length) {
410
- if (this.clamp)
411
- return couldNotLoadScenePromise;
412
- index = 0;
413
- }
414
- const scene = this.scenes[index];
415
- return this.switchScene(scene);
416
- }
417
- /**
418
- * Unload the currently loaded scene.
419
- */
420
- unload() {
421
- this.__lastSwitchScene = undefined;
422
- this.__lastSwitchScenePromise = undefined;
423
- return this.__unloadCurrentScene();
424
- }
425
- /**
426
- * Reload the last scene that was loaded
427
- * @returns a promise that resolves to true if the scene was loaded successfully
428
- */
429
- async reload() {
430
- if (this.__lastSwitchScene) {
431
- const scene = this.__lastSwitchScene;
432
- this.__lastSwitchScene = undefined;
433
- return this.switchScene(scene);
434
- }
435
- return false;
436
- }
437
- // this is the scene that was requested last
438
- __lastSwitchScene;
439
- __lastSwitchScenePromise;
440
- /**
441
- * Switch to a scene by its AssetReference.
442
- * If the scene is already loaded it will be unloaded and the new scene will be loaded.
443
- * If the scene is already loading it will wait for the scene to be loaded.
444
- * If the scene is already loaded and the same scene is requested again it will return the same promise that was returned the first time the scene was requested.
445
- * @param scene The AssetReference of the scene to switch to
446
- * @returns a promise that resolves to true if the scene was loaded successfully
447
- * @example
448
- * ```ts
449
- * const myAssetReference = new AssetReference("scene1.glb");
450
- * sceneSwitcher.switchScene(myAssetReference).then(res => { console.log("Scene loaded", res); });
451
- * ```
452
- */
453
- async switchScene(scene) {
454
- if (!(scene instanceof AssetReference)) {
455
- const type = typeof scene;
456
- if (type === "string") {
457
- return this.select(scene);
458
- }
459
- else if (type === "number") {
460
- return this.select(scene);
461
- }
462
- // If we're switching an Object3D
463
- else if (scene && scene instanceof Object3D) {
464
- const i = this.scenes?.indexOf(scene);
465
- scene = new AssetReference(scene.name, undefined, scene);
466
- if (i >= 0)
467
- this.scenes[i] = scene; // update the asset in the list to the new asset reference
468
- }
469
- else {
470
- console.warn(`[SceneSwitcher] Can't switch to scene of type ${type}`);
471
- return false;
472
- }
473
- }
474
- if (scene.url === this.sourceId) {
475
- console.warn("[SceneSwitcher] Can't load own scene - prevent recursive loading", this.sourceId);
476
- return false;
477
- }
478
- // ensure that we never run the same scene switch multiple times (at the same time) for the same requested scene
479
- if (this.__lastSwitchScene === scene && this.__lastSwitchScenePromise) {
480
- return this.__lastSwitchScenePromise;
481
- }
482
- this.__lastSwitchScene = scene;
483
- this.__lastSwitchScenePromise = this.__internalSwitchScene(scene);
484
- const res = await this.__lastSwitchScenePromise;
485
- return res;
486
- }
487
- async __unloadCurrentScene() {
488
- const current = this._currentScene;
489
- this._currentScene = undefined;
490
- if (current) {
491
- if (debug)
492
- console.log("UNLOAD", current.url, "HasURL?: " + current.hasUrl);
493
- const sceneListener = this.tryGetSceneEventListener(current.asset);
494
- if (sceneListener?.sceneClosing) {
495
- const res = sceneListener.sceneClosing();
496
- if (res instanceof Promise)
497
- await res;
498
- }
499
- // if the current scene has a URL (so it can be reloaded)
500
- // then we unload it
501
- if (current.hasUrl)
502
- current.unload();
503
- // otherwise if it's a regular Object3D we just remove it from the scene
504
- else if (current.asset instanceof Object3D) {
505
- GameObject.remove(current.asset);
506
- }
507
- }
508
- }
509
- _currentlyLoadingScene;
510
- /** @internal */
511
- async __internalSwitchScene(scene) {
512
- await this.__unloadCurrentScene();
513
- const index = this._currentIndex = this.scenes?.indexOf(scene) ?? -1;
514
- try {
515
- this._currentlyLoadingScene = scene;
516
- this._currentLoadingProgress = new ProgressEvent("progress", { loaded: 0, total: 1 });
517
- const loadStartEvt = new CustomEvent("loadscene-start", { detail: { scene: scene, switcher: this, index: index } });
518
- this.dispatchEvent(loadStartEvt);
519
- this.sceneLoadingStart?.invoke(loadStartEvt.detail);
520
- await this.onStartLoading();
521
- // start loading and wait for the scene to be loaded
522
- await scene.loadAssetAsync((_, prog) => {
523
- if (debug) {
524
- const t01 = prog.loaded / prog.total;
525
- const progressBarString = "[" + "=".repeat(Math.floor(t01 * 20)) + "-".repeat(20 - Math.floor(t01 * 20)) + "]";
526
- console.debug(`[SceneSwitcher] Download ${(t01 * 100).toFixed(1)} % ${progressBarString}`, scene.url);
527
- }
528
- this._currentLoadingProgress = prog;
529
- this.dispatchEvent(prog);
530
- this.sceneLoadingProgress?.invoke(prog);
531
- }).catch(console.error);
532
- await this.onEndLoading();
533
- const finishedEvt = new CustomEvent("loadscene-finished", { detail: { scene: scene, switcher: this, index: index } });
534
- this.dispatchEvent(finishedEvt);
535
- this._currentLoadingProgress = undefined;
536
- this._currentlyLoadingScene = undefined;
537
- if (finishedEvt.defaultPrevented) {
538
- if (debug)
539
- console.warn("Adding loaded scene prevented:", scene, finishedEvt);
540
- return false;
541
- }
542
- if (!scene.asset) {
543
- if (debug)
544
- console.warn("Failed loading scene:", scene);
545
- return false;
546
- }
547
- if (this._currentIndex === index) {
548
- if (debug)
549
- console.log("ADD", scene.url);
550
- this._currentScene = scene;
551
- // Experimental: replace the whole content of the scene
552
- if (experimental_clearSceneOnLoad) {
553
- const camera = this.context.mainCameraComponent?.gameObject || this.context.mainCamera;
554
- camera?.removeFromParent();
555
- const self = this.gameObject.removeFromParent();
556
- destroy(this.context.scene, true, true);
557
- this.context.scene = new Scene();
558
- this.context.scene.add(self);
559
- if (camera) {
560
- this.context.scene.add(camera);
561
- }
562
- }
563
- GameObject.add(scene.asset, this.gameObject);
564
- if (this.useSceneLighting)
565
- this.context.sceneLighting.enable(scene);
566
- // Set the background texture from the loaded scene
567
- if (this.useSceneBackground) {
568
- const skybox = this.context.lightmaps.tryGetSkybox(scene.url);
569
- if (skybox) {
570
- skybox.mapping = EquirectangularReflectionMapping;
571
- this.context.scene.background = skybox;
572
- }
573
- else if (debug) {
574
- console.warn("SceneSwitcher: Can't find skybox for scene " + scene.url);
575
- }
576
- }
577
- if (this.useHistory && index >= 0) {
578
- // take the index as the query parameter value
579
- let queryParameterValue = index.toString();
580
- // unless the user defines that he wants to use the scene name
581
- if (this.useSceneName) {
582
- if (scene instanceof Object3D)
583
- queryParameterValue = scene.name;
584
- else if (scene.url)
585
- queryParameterValue = sceneUriToName(scene.url);
586
- }
587
- // save the loaded scene as an url parameter
588
- if (this.queryParameterName?.length)
589
- setParamWithoutReload(this.queryParameterName, queryParameterValue, this.useHistory);
590
- // or set the history state without updating the url parameter
591
- else {
592
- const lastState = history.state;
593
- const stateName = this.guid + "::" + index;
594
- if (lastState !== stateName)
595
- history.pushState(stateName, "unused", location.href);
596
- }
597
- }
598
- // Call SceneListener opened callback (if a SceneListener is in the scene)
599
- const sceneListener = this.tryGetSceneEventListener(scene.asset);
600
- if (sceneListener?.sceneOpened) {
601
- const res = sceneListener.sceneOpened(this);
602
- if (res instanceof Promise)
603
- await res;
604
- }
605
- const openedEvt = new CustomEvent("scene-opened", { detail: { scene: scene, switcher: this, index: index } });
606
- this.dispatchEvent(openedEvt);
607
- this.sceneLoaded?.invoke(this);
608
- return true;
609
- }
610
- }
611
- catch (err) {
612
- console.error(err);
613
- }
614
- return false;
615
- }
616
- preload(index) {
617
- if (index >= 0 && index < this.scenes.length) {
618
- const scene = this.scenes[index];
619
- if (scene instanceof AssetReference)
620
- return scene.preload();
621
- }
622
- return couldNotLoadScenePromise;
623
- }
624
- tryLoadFromQueryParam() {
625
- if (!this.queryParameterName?.length)
626
- return couldNotLoadScenePromise;
627
- // try restore the scene from the url
628
- const value = getParam(this.queryParameterName);
629
- if (typeof value === "boolean")
630
- return couldNotLoadScenePromise;
631
- return this.trySelectSceneFromValue(value);
632
- }
633
- /** try to select a scene from a string or index */
634
- trySelectSceneFromValue(value) {
635
- if (typeof value === "string") {
636
- const index = parseInt(value);
637
- if (index >= 0 && index < this.scenes.length) {
638
- return this.select(index);
639
- ;
640
- }
641
- else {
642
- // Try to find a scene with a matching name
643
- // we don't care about casing. e.g. Scene1 and scene1 should both match
644
- const lowerCaseValue = value.toLowerCase();
645
- for (let i = 0; i < this.scenes.length; i++) {
646
- const scene = this.scenes[i];
647
- if (!scene)
648
- continue;
649
- const name = scene instanceof Object3D ? scene.name : sceneUriToName(scene.url);
650
- if (name.toLowerCase().includes(lowerCaseValue)) {
651
- return this.select(i);
652
- }
653
- }
654
- }
655
- }
656
- else if (typeof value === "number") {
657
- if (value >= 0 && value < this.scenes.length) {
658
- return this.select(value);
659
- ;
660
- }
661
- }
662
- if (isLocalNetwork())
663
- console.warn("Can not find scene: \"" + value + "\"", this);
664
- return couldNotLoadScenePromise;
665
- }
666
- _lastLoadingScene = undefined;
667
- _loadingScenePromise = undefined;
668
- _isCurrentlyLoading = false;
669
- _currentLoadingProgress = undefined;
670
- async onStartLoading() {
671
- this._isCurrentlyLoading = true;
672
- if (this.loadingScene) {
673
- // save the last loading scene reference so that it can be changed at runtime
674
- // since we cache the loading promise here
675
- if (this._lastLoadingScene !== this.loadingScene) {
676
- this._loadingScenePromise = undefined;
677
- }
678
- this._lastLoadingScene = this.loadingScene;
679
- if (!this._loadingScenePromise) {
680
- this._loadingScenePromise = this.loadingScene?.loadAssetAsync().then(res => res != null);
681
- }
682
- await this._loadingScenePromise;
683
- if (this._isCurrentlyLoading && this.loadingScene?.asset) {
684
- if (debug)
685
- console.log("Add loading scene", this.loadingScene.url, this.loadingScene.asset);
686
- const loadingScene = this.loadingScene.asset;
687
- GameObject.add(loadingScene, this.gameObject);
688
- const sceneListener = this.tryGetSceneEventListener(loadingScene);
689
- if (sceneListener?.sceneOpened) {
690
- const res = sceneListener.sceneOpened(this);
691
- if (res instanceof Promise)
692
- await res;
693
- }
694
- }
695
- }
696
- // Invoke the event on a loading listener on the same object as the scene switcher
697
- if (this._isCurrentlyLoading) {
698
- const listener = this.tryGetSceneEventListener(this.gameObject);
699
- if (listener) {
700
- if (listener.sceneOpened) {
701
- const res = listener.sceneOpened(this);
702
- if (res instanceof Promise)
703
- await res;
704
- }
705
- }
706
- }
707
- }
708
- async onEndLoading() {
709
- this._isCurrentlyLoading = false;
710
- if (this.loadingScene?.asset) {
711
- if (debug)
712
- console.log("Remove loading scene", this.loadingScene.url);
713
- const obj = this.loadingScene.asset;
714
- // try to find an ISceneEventListener component
715
- const sceneListener = this.tryGetSceneEventListener(obj);
716
- if (typeof sceneListener?.sceneClosing === "function") {
717
- const res = sceneListener.sceneClosing();
718
- if (res instanceof Promise)
719
- await res;
720
- }
721
- GameObject.remove(obj);
722
- }
723
- // Invoke the event on a loading listener on the same object as the scene switcher
724
- if (!this._isCurrentlyLoading) {
725
- const listener = this.tryGetSceneEventListener(this.gameObject);
726
- if (listener) {
727
- if (listener.sceneClosing) {
728
- const res = listener.sceneClosing();
729
- if (res instanceof Promise)
730
- await res;
731
- }
732
- }
733
- }
734
- }
735
- tryGetSceneEventListener(obj, level = 0) {
736
- if (!obj) {
737
- return null;
738
- }
739
- const sceneListener = GameObject.foreachComponent(obj, c => {
740
- const i = c;
741
- if (i.sceneClosing || i.sceneOpened)
742
- return i;
743
- else
744
- return undefined;
745
- });
746
- // if we didnt find any component with the listener on the root object
747
- // we also check the first level of its children because a scene might be a group
748
- if (level === 0 && !sceneListener && obj.children.length) {
749
- for (const ch of obj.children) {
750
- const res = this.tryGetSceneEventListener(ch, level + 1);
751
- if (res)
752
- return res;
753
- }
754
- }
755
- if (!sceneListener)
756
- return null;
757
- return sceneListener;
758
- }
759
- }
760
- __decorate([
761
- serializable()
762
- ], SceneSwitcher.prototype, "autoLoadFirstScene", void 0);
763
- __decorate([
764
- serializable(AssetReference)
765
- ], SceneSwitcher.prototype, "scenes", void 0);
766
- __decorate([
767
- serializable(AssetReference)
768
- ], SceneSwitcher.prototype, "loadingScene", void 0);
769
- __decorate([
770
- serializable()
771
- ], SceneSwitcher.prototype, "queryParameterName", void 0);
772
- __decorate([
773
- serializable()
774
- ], SceneSwitcher.prototype, "useSceneName", void 0);
775
- __decorate([
776
- serializable()
777
- ], SceneSwitcher.prototype, "clamp", void 0);
778
- __decorate([
779
- serializable()
780
- ], SceneSwitcher.prototype, "useHistory", void 0);
781
- __decorate([
782
- serializable()
783
- ], SceneSwitcher.prototype, "useKeyboard", void 0);
784
- __decorate([
785
- serializable()
786
- ], SceneSwitcher.prototype, "useSwipe", void 0);
787
- __decorate([
788
- serializable()
789
- ], SceneSwitcher.prototype, "useSceneLighting", void 0);
790
- __decorate([
791
- serializable()
792
- ], SceneSwitcher.prototype, "useSceneBackground", void 0);
793
- __decorate([
794
- serializable()
795
- ], SceneSwitcher.prototype, "preloadNext", void 0);
796
- __decorate([
797
- serializable()
798
- ], SceneSwitcher.prototype, "preloadPrevious", void 0);
799
- __decorate([
800
- serializable()
801
- ], SceneSwitcher.prototype, "preloadConcurrent", void 0);
802
- __decorate([
803
- serializable()
804
- ], SceneSwitcher.prototype, "createMenuButtons", void 0);
805
- __decorate([
806
- serializable(EventList)
807
- ], SceneSwitcher.prototype, "sceneLoadingStart", void 0);
808
- __decorate([
809
- serializable(EventList)
810
- ], SceneSwitcher.prototype, "sceneLoadingProgress", void 0);
811
- __decorate([
812
- serializable(EventList)
813
- ], SceneSwitcher.prototype, "sceneLoaded", void 0);
814
- function sceneUriToName(uri) {
815
- const name = uri.split("/").pop();
816
- const value = name?.split(".").shift();
817
- if (value?.length)
818
- return value;
819
- return uri;
820
- }
821
- /**
822
- * PreLoadScheduler is responsible for managing preloading of scenes.
823
- * It handles scheduling and limiting concurrent downloads of scenes based on specified parameters.
824
- */
825
- class PreLoadScheduler {
826
- /** Maximum number of scenes to preload ahead of the current scene */
827
- maxLoadAhead;
828
- /** Maximum number of scenes to preload behind the current scene */
829
- maxLoadBehind;
830
- /** Maximum number of scenes that can be preloaded concurrently */
831
- maxConcurrent;
832
- _isRunning = false;
833
- _switcher;
834
- _loadTasks = [];
835
- _maxConcurrentLoads = 1;
836
- /**
837
- * Creates a new PreLoadScheduler instance
838
- * @param rooms The SceneSwitcher that this scheduler belongs to
839
- * @param ahead Number of scenes to preload ahead of current scene
840
- * @param behind Number of scenes to preload behind current scene
841
- * @param maxConcurrent Maximum number of concurrent preloads allowed
842
- */
843
- constructor(rooms, ahead = 1, behind = 1, maxConcurrent = 2) {
844
- this._switcher = rooms;
845
- this.maxLoadAhead = ahead;
846
- this.maxLoadBehind = behind;
847
- this.maxConcurrent = maxConcurrent;
848
- }
849
- /**
850
- * Starts the preloading process after a specified delay
851
- * @param delay Time in milliseconds to wait before starting preload
852
- */
853
- begin(delay) {
854
- if (this._isRunning)
855
- return;
856
- if (debug)
857
- console.log("Preload begin", { delay });
858
- this._isRunning = true;
859
- let lastRoom = -10;
860
- let searchDistance;
861
- let searchCall;
862
- const array = this._switcher.scenes;
863
- const startTime = Date.now() + delay;
864
- const interval = setInterval(() => {
865
- if (this.allLoaded()) {
866
- if (debug)
867
- console.log("All scenes (pre-)loaded");
868
- this.stop();
869
- }
870
- if (!this._isRunning) {
871
- clearInterval(interval);
872
- return;
873
- }
874
- if (Date.now() < startTime)
875
- return;
876
- if (this.canLoadNewScene() === false)
877
- return;
878
- if (lastRoom === -10 || lastRoom !== this._switcher.currentIndex) {
879
- lastRoom = this._switcher.currentIndex;
880
- searchCall = 0;
881
- searchDistance = 0;
882
- }
883
- const searchForward = searchCall % 2 === 0;
884
- if (searchForward)
885
- searchDistance += 1;
886
- searchCall += 1;
887
- const maxSearchDistance = searchForward ? this.maxLoadAhead : this.maxLoadBehind;
888
- if (searchDistance > maxSearchDistance)
889
- return;
890
- const roomIndex = searchForward ? lastRoom + searchDistance : lastRoom - searchDistance;
891
- if (roomIndex < 0)
892
- return;
893
- // if (roomIndex < 0) roomIndex = array.length + roomIndex;
894
- if (roomIndex < 0 || roomIndex >= array.length)
895
- return;
896
- if (!this._loadTasks.some(t => t.index === roomIndex)) {
897
- const scene = array[roomIndex];
898
- if (debug)
899
- console.log("Preload scene", { roomIndex, searchForward, lastRoom, currentIndex: this._switcher.currentIndex, tasks: this._loadTasks.length }, scene?.url);
900
- new LoadTask(roomIndex, scene, this._loadTasks);
901
- }
902
- }, 200);
903
- }
904
- /**
905
- * Stops the preloading process
906
- */
907
- stop() {
908
- this._isRunning = false;
909
- }
910
- /**
911
- * Checks if a new scene can be loaded based on current load limits
912
- * @returns True if a new scene can be loaded, false otherwise
913
- */
914
- canLoadNewScene() {
915
- return this._loadTasks.length < this._maxConcurrentLoads;
916
- }
917
- /**
918
- * Checks if all scenes in the SceneSwitcher have been loaded
919
- * @returns True if all scenes are loaded, false otherwise
920
- */
921
- allLoaded() {
922
- if (this._switcher.scenes) {
923
- for (const scene of this._switcher.scenes) {
924
- if (!scene?.isLoaded)
925
- continue;
926
- if (scene.isLoaded() === false)
927
- return false;
928
- }
929
- }
930
- return true;
931
- }
932
- }
933
- /**
934
- * Represents a single preloading task for a scene
935
- */
936
- class LoadTask {
937
- /** The index of the scene in the scenes array */
938
- index;
939
- /** The AssetReference to be loaded */
940
- asset;
941
- /** The collection of active load tasks this task belongs to */
942
- tasks;
943
- /**
944
- * Creates a new LoadTask and begins loading immediately
945
- * @param index The index of the scene in the scenes array
946
- * @param asset The AssetReference to preload
947
- * @param tasks The collection of active load tasks
948
- */
949
- constructor(index, asset, tasks) {
950
- this.index = index;
951
- this.asset = asset;
952
- this.tasks = tasks;
953
- tasks.push(this);
954
- this.awaitLoading();
955
- }
956
- /**
957
- * Asynchronously loads the asset and removes this task from the active tasks list when complete
958
- */
959
- async awaitLoading() {
960
- if (this.asset && !this.asset.isLoaded()) {
961
- if (debug)
962
- console.log("Preload start: " + this.asset.url, this.index);
963
- await this.asset.preload();
964
- if (debug)
965
- console.log("Preload finished: " + this.asset.url, this.index);
966
- }
967
- const i = this.tasks.indexOf(this);
968
- if (i >= 0)
969
- this.tasks.splice(i, 1);
970
- }
971
- }
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { EquirectangularReflectionMapping, Object3D, Scene } from "three";
8
+ import { AssetReference } from "../engine/engine_addressables.js";
9
+ import { destroy } from "../engine/engine_gameobject.js";
10
+ import { InputEvents } from "../engine/engine_input.js";
11
+ import { isLocalNetwork } from "../engine/engine_networking_utils.js";
12
+ import { serializable } from "../engine/engine_serialization.js";
13
+ import { getParam, setParamWithoutReload } from "../engine/engine_utils.js";
14
+ import { registerObservableAttribute } from "../engine/webcomponents/needle-engine.extras.js";
15
+ import { Behaviour, GameObject } from "./Component.js";
16
+ import { EventList } from "./EventList.js";
17
+ const debug = getParam("debugsceneswitcher");
18
+ const experimental_clearSceneOnLoad = getParam("sceneswitcher:clearscene");
19
+ const ENGINE_ELEMENT_SCENE_ATTRIBUTE_NAME = "scene";
20
+ registerObservableAttribute(ENGINE_ELEMENT_SCENE_ATTRIBUTE_NAME);
21
+ // ContextRegistry.registerCallback(ContextEvent.ContextRegistered, async _ => {
22
+ // // We need to defer import to not get issues with circular dependencies
23
+ // import("../engine/engine_element").then(res => {
24
+ // const webcomponent = res.NeedleEngineHTMLElement;
25
+ // if (debug) console.log("SceneSwitcher: registering scene attribute", webcomponent.observedAttributes);
26
+ // if (!webcomponent.observedAttributes.includes(ENGINE_ELEMENT_SCENE_ATTRIBUTE_NAME))
27
+ // webcomponent.observedAttributes.push(ENGINE_ELEMENT_SCENE_ATTRIBUTE_NAME);
28
+ // });
29
+ // });
30
+ const couldNotLoadScenePromise = Promise.resolve(false);
31
+ /** The SceneSwitcher can be used to dynamically load and unload extra content
32
+ * Available scenes are defined in the `scenes` array.
33
+ * Loaded scenes will be added to the SceneSwitcher's GameObject as a child and removed when another scene is loaded by the same SceneSwitcher.
34
+ * Live Examples
35
+ * - [Multi Scenes Sample](https://engine.needle.tools/samples/multi-scenes-dynamic-loading) (source code available)
36
+ * - [Needle Website](https://needle.tools)
37
+ * - [Songs Of Cultures](https://app.songsofcultures.com)
38
+ *
39
+ * ### Interfaces
40
+ * Use the {@link ISceneEventListener} interface to listen to scene open and closing events with the ability to modify transitions and stall the scene loading process.
41
+ *
42
+ * ### Events
43
+ * - `loadscene-start`: Called when a scene starts loading
44
+ * - `loadscene-finished`: Called when a scene finished loading
45
+ * - `progress`: Called when a scene is loading and the progress changes
46
+ * - `scene-opened`: Called when a scene is loaded and added to the SceneSwitcher's GameObject
47
+ * @example
48
+ * ```ts
49
+ * sceneSwitcher.addEventListener("loadscene-start", (e) => {
50
+ * console.log("Loading scene", e.detail.scene.url);
51
+ * });
52
+ * sceneSwitcher.addEventListener("loadscene-finished", (e) => {
53
+ * console.log("Finished loading scene", e.detail.scene.url);
54
+ * });
55
+ * sceneSwitcher.addEventListener("progress", (e) => {
56
+ * console.log("Loading progress", e.loaded, e.total);
57
+ * });
58
+ * sceneSwitcher.addEventListener("scene-opened", (e) => {
59
+ * console.log("Scene opened", e.detail.scene.url);
60
+ * });
61
+ * ```
62
+ *
63
+ * @category Asset Management
64
+ * @group Components
65
+ */
66
+ export class SceneSwitcher extends Behaviour {
67
+ /** When enabled the first scene will be loaded when the SceneSwitcher becomes active
68
+ * @default true
69
+ */
70
+ autoLoadFirstScene = true;
71
+ /**
72
+ * The scenes that can be loaded by the SceneSwitcher.
73
+ * @default []
74
+ */
75
+ scenes = [];
76
+ /**
77
+ * The scene that is displayed while a scene is loading.
78
+ * @default undefined
79
+ */
80
+ loadingScene;
81
+ /** the url parameter that is set/used to store the currently loaded scene in, set to "" to disable
82
+ * @default "scene"
83
+ */
84
+ queryParameterName = "scene";
85
+ /**
86
+ * when enabled the scene name will be used as the query parameter (otherwise the scene index will be used)
87
+ * Needs `queryParameterName` set
88
+ * @default true
89
+ */
90
+ useSceneName = true;
91
+ /**
92
+ * When enabled the current scene index will be clamped to the scenes array bounds.
93
+ * For example when the last scene is loaded and `clamp` is true then trying to load the `next()` scene will not change the scene.
94
+ * When `clamp` is false and the last scene is loaded then the first scene will be loaded instead.
95
+ * @default true
96
+ */
97
+ clamp = true;
98
+ /** when enabled the new scene is pushed to the browser navigation history, only works with a valid query parameter set
99
+ * @default true
100
+ */
101
+ useHistory = true;
102
+ /** when enabled you can switch between scenes using keyboard left, right, A and D or number keys
103
+ * @default true
104
+ */
105
+ useKeyboard = true;
106
+ /** when enabled you can switch between scenes using swipe (mobile only)
107
+ * @default true
108
+ */
109
+ useSwipe = true;
110
+ /** when enabled will automatically apply the environment scene lights
111
+ * @default true
112
+ */
113
+ useSceneLighting = true;
114
+ /** When enabled will automatically apply the skybox from the loaded scene
115
+ * @default true
116
+ */
117
+ useSceneBackground = true;
118
+ /** how many scenes after the currently active scene should be preloaded
119
+ * @default 1
120
+ */
121
+ preloadNext = 1;
122
+ /** how many scenes before the currently active scene should be preloaded
123
+ * @default 1
124
+ */
125
+ preloadPrevious = 1;
126
+ /** how many scenes can be loaded in parallel
127
+ * @default 2
128
+ */
129
+ preloadConcurrent = 2;
130
+ /**
131
+ * When enabled will create a button for the Needle menu to switch to the next or previous scene
132
+ * @default false
133
+ */
134
+ createMenuButtons = false;
135
+ /** The index of the currently loaded and active scene */
136
+ get currentIndex() { return this._currentIndex; }
137
+ /** Get the progress of the currently loading scene. This is undefined if no scene is loading
138
+ * You can also subscribe to the loading event by adding an event listener to the scene switcher.
139
+ * For example like this `sceneSwitcher.addEventListeneer("progress", (e) => {...})`
140
+ */
141
+ get currentLoadingProgress() { return this._currentLoadingProgress; }
142
+ /** The currently loading scene. This is undefined if no scene is loading. */
143
+ get currentlyLoadingScene() { return this._currentlyLoadingScene; }
144
+ /**
145
+ * The currently loaded scene. This is undefined if no scene is loaded.
146
+ */
147
+ get currentlyLoadedScene() { return this._currentScene; }
148
+ /**
149
+ * Called when a scene starts loading
150
+ */
151
+ sceneLoadingStart = new EventList();
152
+ sceneLoadingProgress = new EventList();
153
+ /**
154
+ * The sceneLoaded event is called when a scene/glTF is loaded and added to the scene
155
+ */
156
+ sceneLoaded = new EventList();
157
+ _currentIndex = -1;
158
+ _currentScene = undefined;
159
+ _engineElementOverserver = undefined;
160
+ _preloadScheduler;
161
+ _menuButtons;
162
+ /** @internal */
163
+ awake() {
164
+ if (this.scenes === undefined)
165
+ this.scenes = [];
166
+ // remove all scenes from the url that are in the scenes array at startup
167
+ for (const scene of this.scenes) {
168
+ if (scene && !scene.hasUrl && scene.asset instanceof Object3D) {
169
+ GameObject.remove(scene.asset);
170
+ }
171
+ else if (scene instanceof Object3D) {
172
+ GameObject.remove(scene);
173
+ }
174
+ }
175
+ if (debug)
176
+ console.log("SceneSwitcher", this);
177
+ }
178
+ /** @internal */
179
+ async onEnable() {
180
+ globalThis.addEventListener("popstate", this.onPopState);
181
+ this.context.input.addEventListener(InputEvents.KeyDown, this.onInputKeyDown);
182
+ this.context.input.addEventListener(InputEvents.PointerMove, this.onInputPointerMove);
183
+ this.context.input.addEventListener(InputEvents.PointerUp, this.onInputPointerUp);
184
+ if (!this._engineElementOverserver) {
185
+ this._engineElementOverserver = new MutationObserver((mutations) => {
186
+ for (const mut of mutations) {
187
+ if (mut.type === "attributes" && mut.attributeName === ENGINE_ELEMENT_SCENE_ATTRIBUTE_NAME) {
188
+ const value = this.context.domElement.getAttribute(ENGINE_ELEMENT_SCENE_ATTRIBUTE_NAME);
189
+ if (value !== null) {
190
+ this.trySelectSceneFromValue(value);
191
+ }
192
+ }
193
+ }
194
+ });
195
+ }
196
+ this._engineElementOverserver.observe(this.context.domElement, {
197
+ attributes: true
198
+ });
199
+ if (!this._preloadScheduler)
200
+ this._preloadScheduler = new PreLoadScheduler(this);
201
+ this._preloadScheduler.maxLoadAhead = this.preloadNext;
202
+ this._preloadScheduler.maxLoadBehind = this.preloadPrevious;
203
+ this._preloadScheduler.maxConcurrent = this.preloadConcurrent;
204
+ this._preloadScheduler.begin(2000);
205
+ // Begin loading the loading scene
206
+ if (this.autoLoadFirstScene && this._currentIndex === -1 && !await this.tryLoadFromQueryParam()) {
207
+ const value = this.context.domElement.getAttribute(ENGINE_ELEMENT_SCENE_ATTRIBUTE_NAME);
208
+ // let locked = this.lock;
209
+ try {
210
+ // this.lock = false;
211
+ if (value === null || !await this.trySelectSceneFromValue(value)) {
212
+ if (this._currentIndex === -1)
213
+ this.select(0);
214
+ }
215
+ }
216
+ finally {
217
+ // this.lock = locked;
218
+ }
219
+ }
220
+ // create the menu buttons
221
+ if (this.createMenuButtons) {
222
+ this._menuButtons ??= [];
223
+ this._menuButtons.push(this.context.menu.appendChild({
224
+ label: "Previous",
225
+ icon: "arrow_back_ios",
226
+ onClick: () => this.selectPrev(),
227
+ priority: -1005,
228
+ class: "row2"
229
+ }));
230
+ this._menuButtons.push(this.context.menu.appendChild({
231
+ label: "Next",
232
+ icon: "arrow_forward_ios",
233
+ iconSide: "right",
234
+ onClick: () => this.selectNext(),
235
+ priority: -1000,
236
+ class: "row2"
237
+ }));
238
+ }
239
+ }
240
+ /** @internal */
241
+ onDisable() {
242
+ globalThis.removeEventListener("popstate", this.onPopState);
243
+ this.context.input.removeEventListener(InputEvents.KeyDown, this.onInputKeyDown);
244
+ this.context.input.removeEventListener(InputEvents.PointerMove, this.onInputPointerMove);
245
+ this.context.input.removeEventListener(InputEvents.PointerUp, this.onInputPointerUp);
246
+ this._preloadScheduler?.stop();
247
+ // remove the menu buttons
248
+ if (this._menuButtons) {
249
+ for (const button of this._menuButtons) {
250
+ button.remove();
251
+ }
252
+ this._menuButtons = undefined;
253
+ }
254
+ }
255
+ onPopState = async (_state) => {
256
+ if (!this.useHistory)
257
+ return;
258
+ const wasUsingHistory = this.useHistory;
259
+ try {
260
+ this.useHistory = false;
261
+ let didResolve = false;
262
+ if (this.queryParameterName)
263
+ didResolve = await this.tryLoadFromQueryParam();
264
+ if (!didResolve) {
265
+ const state = _state?.state;
266
+ if (state && state.startsWith(this.guid)) {
267
+ const value = state.substr(this.guid.length + 2);
268
+ if (debug)
269
+ console.log("PopState", value);
270
+ await this.trySelectSceneFromValue(value);
271
+ }
272
+ }
273
+ }
274
+ finally {
275
+ this.useHistory = wasUsingHistory;
276
+ }
277
+ };
278
+ normalizedSwipeThresholdX = 0.1;
279
+ _didSwipe = false;
280
+ onInputPointerMove = (e) => {
281
+ if (!this.useSwipe)
282
+ return;
283
+ if (!this._didSwipe && e.button === 0 && e.pointerType === "touch" && this.context.input.getPointerPressedCount() === 1) {
284
+ const delta = this.context.input.getPointerPositionDelta(e.button);
285
+ if (delta) {
286
+ const normalizedX = delta.x / this.context.domWidth;
287
+ if (normalizedX >= this.normalizedSwipeThresholdX) {
288
+ this._didSwipe = true;
289
+ this.selectPrev();
290
+ }
291
+ else if (normalizedX <= -this.normalizedSwipeThresholdX) {
292
+ this._didSwipe = true;
293
+ this.selectNext();
294
+ }
295
+ }
296
+ }
297
+ };
298
+ onInputPointerUp = (e) => {
299
+ if (e.button === 0) {
300
+ this._didSwipe = false;
301
+ }
302
+ };
303
+ onInputKeyDown = (e) => {
304
+ if (!this.useKeyboard)
305
+ return;
306
+ if (!this.scenes)
307
+ return;
308
+ const key = e.key.toLowerCase();
309
+ if (!key)
310
+ return;
311
+ const index = parseInt(key) - 1;
312
+ if (index >= 0) {
313
+ this.trySelectSceneFromValue(index);
314
+ return;
315
+ }
316
+ switch (key) {
317
+ case "arrowright":
318
+ case "d":
319
+ this.selectNext();
320
+ break;
321
+ case "arrowleft":
322
+ case "a":
323
+ this.selectPrev();
324
+ break;
325
+ }
326
+ };
327
+ /**
328
+ * Add a scene to the SceneSwitcher.
329
+ * If the scene is already added it will be added again.
330
+ * @param urlOrAssetReference The url of the scene or an AssetReference to the scene
331
+ * @returns The AssetReference of the scene that was added
332
+ * @example
333
+ * ```ts
334
+ * // adding a scene:
335
+ * sceneSwitcher.addScene("scene1.glb");
336
+ * // add another scene and load it:
337
+ * const scene2 = sceneSwitcher.addScene("scene2.glb");
338
+ * sceneSwitcher.switchScene(scene2).then(res => { console.log("Scene loaded", res); });
339
+ * ```
340
+ */
341
+ addScene(urlOrAssetReference) {
342
+ if (typeof urlOrAssetReference === "string") {
343
+ let assetReference = this.context.addressables.findAssetReference(urlOrAssetReference);
344
+ if (!assetReference) {
345
+ assetReference = new AssetReference(urlOrAssetReference);
346
+ this.context.addressables.registerAssetReference(assetReference);
347
+ }
348
+ this.scenes.push(assetReference);
349
+ return assetReference;
350
+ }
351
+ this.scenes.push(urlOrAssetReference);
352
+ return urlOrAssetReference;
353
+ }
354
+ /**
355
+ * Load the next scene in the scenes array ({@link this.currentIndex} + 1)
356
+ * If the current scene is the last scene in the array and {@link this.clamp} is disabled then the first scene will be loaded.
357
+ * @returns a promise that resolves to true if the scene was loaded successfully
358
+ */
359
+ selectNext() {
360
+ return this.select(this._currentIndex + 1);
361
+ }
362
+ /**
363
+ * Load the previous scene in the scenes array ({@link this.currentIndex} - 1)
364
+ * If the current scene is the first scene in the array and {@link this.clamp} is disabled then the last scene will be loaded.
365
+ * @returns a promise that resolves to true if the scene was loaded successfully
366
+ */
367
+ selectPrev() {
368
+ return this.select(this._currentIndex - 1);
369
+ }
370
+ /**
371
+ * Load a scene by its index in the scenes array.
372
+ * @param index The index of the scene or a string that represents the scene uri (if the url is not known to the SceneSwitcher it will try to load the scene by its uri but it won't be added to the current scenes array. Use {@link addScene} to add a scene to the SceneSwitcher)
373
+ * @returns a promise that resolves to true if the scene was loaded successfully
374
+ */
375
+ select(index) {
376
+ if (debug)
377
+ console.log("select", index);
378
+ if (typeof index === "object") {
379
+ // If a user tries to reference a scene object in a UnityEvent and invoke select(obj)
380
+ // Then the object will be serialized as a object { guid : ... } or with the index json pointer
381
+ // This case is not supported right now. Object references in the editor must not be scene references
382
+ console.warn("Switching to \"" + index + "\" might not work. Please either use an index or a AssetReference (not a scene reference)");
383
+ }
384
+ if (typeof index === "string") {
385
+ // If the parameter is a string we try to resolve the scene by its uri
386
+ // it's either already known in the scenes array
387
+ // or we create/get a new AssetReference and try to switch to that
388
+ const scene = this.scenes?.find(s => s.url === index);
389
+ if (!scene) {
390
+ // Ok the scene is unknown to the scene switcher
391
+ // we create a new asset reference (or get an existing one)
392
+ // And switch to that. With this we can not modify the history
393
+ // Until the scene switcher can store the uri in the history instead of the index
394
+ const reference = AssetReference.getOrCreate(this.sourceId ?? "", index, this.context);
395
+ return this.switchScene(reference);
396
+ }
397
+ if (scene)
398
+ index = this.scenes?.indexOf(scene);
399
+ else
400
+ return couldNotLoadScenePromise;
401
+ }
402
+ if (!this.scenes?.length)
403
+ return couldNotLoadScenePromise;
404
+ if (index < 0) {
405
+ if (this.clamp)
406
+ return couldNotLoadScenePromise;
407
+ index = this.scenes.length - 1;
408
+ }
409
+ else if (index >= this.scenes.length) {
410
+ if (this.clamp)
411
+ return couldNotLoadScenePromise;
412
+ index = 0;
413
+ }
414
+ const scene = this.scenes[index];
415
+ return this.switchScene(scene);
416
+ }
417
+ /**
418
+ * Unload the currently loaded scene.
419
+ */
420
+ unload() {
421
+ this.__lastSwitchScene = undefined;
422
+ this.__lastSwitchScenePromise = undefined;
423
+ return this.__unloadCurrentScene();
424
+ }
425
+ /**
426
+ * Reload the last scene that was loaded
427
+ * @returns a promise that resolves to true if the scene was loaded successfully
428
+ */
429
+ async reload() {
430
+ if (this.__lastSwitchScene) {
431
+ const scene = this.__lastSwitchScene;
432
+ this.__lastSwitchScene = undefined;
433
+ return this.switchScene(scene);
434
+ }
435
+ return false;
436
+ }
437
+ // this is the scene that was requested last
438
+ __lastSwitchScene;
439
+ __lastSwitchScenePromise;
440
+ /**
441
+ * Switch to a scene by its AssetReference.
442
+ * If the scene is already loaded it will be unloaded and the new scene will be loaded.
443
+ * If the scene is already loading it will wait for the scene to be loaded.
444
+ * If the scene is already loaded and the same scene is requested again it will return the same promise that was returned the first time the scene was requested.
445
+ * @param scene The AssetReference of the scene to switch to
446
+ * @returns a promise that resolves to true if the scene was loaded successfully
447
+ * @example
448
+ * ```ts
449
+ * const myAssetReference = new AssetReference("scene1.glb");
450
+ * sceneSwitcher.switchScene(myAssetReference).then(res => { console.log("Scene loaded", res); });
451
+ * ```
452
+ */
453
+ async switchScene(scene) {
454
+ if (!(scene instanceof AssetReference)) {
455
+ const type = typeof scene;
456
+ if (type === "string") {
457
+ return this.select(scene);
458
+ }
459
+ else if (type === "number") {
460
+ return this.select(scene);
461
+ }
462
+ // If we're switching an Object3D
463
+ else if (scene && scene instanceof Object3D) {
464
+ const i = this.scenes?.indexOf(scene);
465
+ scene = new AssetReference(scene.name, undefined, scene);
466
+ if (i >= 0)
467
+ this.scenes[i] = scene; // update the asset in the list to the new asset reference
468
+ }
469
+ else {
470
+ console.warn(`[SceneSwitcher] Can't switch to scene of type ${type}`);
471
+ return false;
472
+ }
473
+ }
474
+ if (scene.url === this.sourceId) {
475
+ console.warn("[SceneSwitcher] Can't load own scene - prevent recursive loading", this.sourceId);
476
+ return false;
477
+ }
478
+ // ensure that we never run the same scene switch multiple times (at the same time) for the same requested scene
479
+ if (this.__lastSwitchScene === scene && this.__lastSwitchScenePromise) {
480
+ return this.__lastSwitchScenePromise;
481
+ }
482
+ this.__lastSwitchScene = scene;
483
+ this.__lastSwitchScenePromise = this.__internalSwitchScene(scene);
484
+ const res = await this.__lastSwitchScenePromise;
485
+ return res;
486
+ }
487
+ async __unloadCurrentScene() {
488
+ const current = this._currentScene;
489
+ this._currentScene = undefined;
490
+ if (current) {
491
+ if (debug)
492
+ console.log("UNLOAD", current.url, "HasURL?: " + current.hasUrl);
493
+ const sceneListener = this.tryGetSceneEventListener(current.asset);
494
+ if (sceneListener?.sceneClosing) {
495
+ const res = sceneListener.sceneClosing();
496
+ if (res instanceof Promise)
497
+ await res;
498
+ }
499
+ // if the current scene has a URL (so it can be reloaded)
500
+ // then we unload it
501
+ if (current.hasUrl)
502
+ current.unload();
503
+ // otherwise if it's a regular Object3D we just remove it from the scene
504
+ else if (current.asset instanceof Object3D) {
505
+ GameObject.remove(current.asset);
506
+ }
507
+ }
508
+ }
509
+ _currentlyLoadingScene;
510
+ /** @internal */
511
+ async __internalSwitchScene(scene) {
512
+ await this.__unloadCurrentScene();
513
+ const index = this._currentIndex = this.scenes?.indexOf(scene) ?? -1;
514
+ try {
515
+ this._currentlyLoadingScene = scene;
516
+ this._currentLoadingProgress = new ProgressEvent("progress", { loaded: 0, total: 1 });
517
+ const loadStartEvt = new CustomEvent("loadscene-start", { detail: { scene: scene, switcher: this, index: index } });
518
+ this.dispatchEvent(loadStartEvt);
519
+ this.sceneLoadingStart?.invoke(loadStartEvt.detail);
520
+ await this.onStartLoading();
521
+ // start loading and wait for the scene to be loaded
522
+ await scene.loadAssetAsync((_, prog) => {
523
+ if (debug) {
524
+ const t01 = prog.loaded / prog.total;
525
+ const progressBarString = "[" + "=".repeat(Math.floor(t01 * 20)) + "-".repeat(20 - Math.floor(t01 * 20)) + "]";
526
+ console.debug(`[SceneSwitcher] Download ${(t01 * 100).toFixed(1)} % ${progressBarString}`, scene.url);
527
+ }
528
+ this._currentLoadingProgress = prog;
529
+ this.dispatchEvent(prog);
530
+ this.sceneLoadingProgress?.invoke(prog);
531
+ }).catch(console.error);
532
+ await this.onEndLoading();
533
+ const finishedEvt = new CustomEvent("loadscene-finished", { detail: { scene: scene, switcher: this, index: index } });
534
+ this.dispatchEvent(finishedEvt);
535
+ this._currentLoadingProgress = undefined;
536
+ this._currentlyLoadingScene = undefined;
537
+ if (finishedEvt.defaultPrevented) {
538
+ if (debug)
539
+ console.warn("Adding loaded scene prevented:", scene, finishedEvt);
540
+ return false;
541
+ }
542
+ if (!scene.asset) {
543
+ if (debug)
544
+ console.warn("Failed loading scene:", scene);
545
+ return false;
546
+ }
547
+ if (this._currentIndex === index) {
548
+ if (debug)
549
+ console.log("ADD", scene.url);
550
+ this._currentScene = scene;
551
+ // Experimental: replace the whole content of the scene
552
+ if (experimental_clearSceneOnLoad) {
553
+ const camera = this.context.mainCameraComponent?.gameObject || this.context.mainCamera;
554
+ camera?.removeFromParent();
555
+ const self = this.gameObject.removeFromParent();
556
+ destroy(this.context.scene, true, true);
557
+ this.context.scene = new Scene();
558
+ this.context.scene.add(self);
559
+ if (camera) {
560
+ this.context.scene.add(camera);
561
+ }
562
+ }
563
+ GameObject.add(scene.asset, this.gameObject);
564
+ if (this.useSceneLighting)
565
+ this.context.sceneLighting.enable(scene);
566
+ // Set the background texture from the loaded scene
567
+ if (this.useSceneBackground) {
568
+ const skybox = this.context.lightmaps.tryGetSkybox(scene.url);
569
+ if (skybox) {
570
+ skybox.mapping = EquirectangularReflectionMapping;
571
+ this.context.scene.background = skybox;
572
+ }
573
+ else if (debug) {
574
+ console.warn("SceneSwitcher: Can't find skybox for scene " + scene.url);
575
+ }
576
+ }
577
+ if (this.useHistory && index >= 0) {
578
+ // take the index as the query parameter value
579
+ let queryParameterValue = index.toString();
580
+ // unless the user defines that he wants to use the scene name
581
+ if (this.useSceneName) {
582
+ if (scene instanceof Object3D)
583
+ queryParameterValue = scene.name;
584
+ else if (scene.url)
585
+ queryParameterValue = sceneUriToName(scene.url);
586
+ }
587
+ // save the loaded scene as an url parameter
588
+ if (this.queryParameterName?.length)
589
+ setParamWithoutReload(this.queryParameterName, queryParameterValue, this.useHistory);
590
+ // or set the history state without updating the url parameter
591
+ else {
592
+ const lastState = history.state;
593
+ const stateName = this.guid + "::" + index;
594
+ if (lastState !== stateName)
595
+ history.pushState(stateName, "unused", location.href);
596
+ }
597
+ }
598
+ // Call SceneListener opened callback (if a SceneListener is in the scene)
599
+ const sceneListener = this.tryGetSceneEventListener(scene.asset);
600
+ if (sceneListener?.sceneOpened) {
601
+ const res = sceneListener.sceneOpened(this);
602
+ if (res instanceof Promise)
603
+ await res;
604
+ }
605
+ const openedEvt = new CustomEvent("scene-opened", { detail: { scene: scene, switcher: this, index: index } });
606
+ this.dispatchEvent(openedEvt);
607
+ this.sceneLoaded?.invoke(this);
608
+ return true;
609
+ }
610
+ }
611
+ catch (err) {
612
+ console.error(err);
613
+ }
614
+ return false;
615
+ }
616
+ preload(index) {
617
+ if (index >= 0 && index < this.scenes.length) {
618
+ const scene = this.scenes[index];
619
+ if (scene instanceof AssetReference)
620
+ return scene.preload();
621
+ }
622
+ return couldNotLoadScenePromise;
623
+ }
624
+ tryLoadFromQueryParam() {
625
+ if (!this.queryParameterName?.length)
626
+ return couldNotLoadScenePromise;
627
+ // try restore the scene from the url
628
+ const value = getParam(this.queryParameterName);
629
+ if (typeof value === "boolean")
630
+ return couldNotLoadScenePromise;
631
+ return this.trySelectSceneFromValue(value);
632
+ }
633
+ /** try to select a scene from a string or index */
634
+ trySelectSceneFromValue(value) {
635
+ if (typeof value === "string") {
636
+ const index = parseInt(value);
637
+ if (index >= 0 && index < this.scenes.length) {
638
+ return this.select(index);
639
+ ;
640
+ }
641
+ else {
642
+ // Try to find a scene with a matching name
643
+ // we don't care about casing. e.g. Scene1 and scene1 should both match
644
+ const lowerCaseValue = value.toLowerCase();
645
+ for (let i = 0; i < this.scenes.length; i++) {
646
+ const scene = this.scenes[i];
647
+ if (!scene)
648
+ continue;
649
+ const name = scene instanceof Object3D ? scene.name : sceneUriToName(scene.url);
650
+ if (name.toLowerCase().includes(lowerCaseValue)) {
651
+ return this.select(i);
652
+ }
653
+ }
654
+ }
655
+ }
656
+ else if (typeof value === "number") {
657
+ if (value >= 0 && value < this.scenes.length) {
658
+ return this.select(value);
659
+ ;
660
+ }
661
+ }
662
+ if (isLocalNetwork())
663
+ console.warn("Can not find scene: \"" + value + "\"", this);
664
+ return couldNotLoadScenePromise;
665
+ }
666
+ _lastLoadingScene = undefined;
667
+ _loadingScenePromise = undefined;
668
+ _isCurrentlyLoading = false;
669
+ _currentLoadingProgress = undefined;
670
+ async onStartLoading() {
671
+ this._isCurrentlyLoading = true;
672
+ if (this.loadingScene) {
673
+ // save the last loading scene reference so that it can be changed at runtime
674
+ // since we cache the loading promise here
675
+ if (this._lastLoadingScene !== this.loadingScene) {
676
+ this._loadingScenePromise = undefined;
677
+ }
678
+ this._lastLoadingScene = this.loadingScene;
679
+ if (!this._loadingScenePromise) {
680
+ this._loadingScenePromise = this.loadingScene?.loadAssetAsync().then(res => res != null);
681
+ }
682
+ await this._loadingScenePromise;
683
+ if (this._isCurrentlyLoading && this.loadingScene?.asset) {
684
+ if (debug)
685
+ console.log("Add loading scene", this.loadingScene.url, this.loadingScene.asset);
686
+ const loadingScene = this.loadingScene.asset;
687
+ GameObject.add(loadingScene, this.gameObject);
688
+ const sceneListener = this.tryGetSceneEventListener(loadingScene);
689
+ if (sceneListener?.sceneOpened) {
690
+ const res = sceneListener.sceneOpened(this);
691
+ if (res instanceof Promise)
692
+ await res;
693
+ }
694
+ }
695
+ }
696
+ // Invoke the event on a loading listener on the same object as the scene switcher
697
+ if (this._isCurrentlyLoading) {
698
+ const listener = this.tryGetSceneEventListener(this.gameObject);
699
+ if (listener) {
700
+ if (listener.sceneOpened) {
701
+ const res = listener.sceneOpened(this);
702
+ if (res instanceof Promise)
703
+ await res;
704
+ }
705
+ }
706
+ }
707
+ }
708
+ async onEndLoading() {
709
+ this._isCurrentlyLoading = false;
710
+ if (this.loadingScene?.asset) {
711
+ if (debug)
712
+ console.log("Remove loading scene", this.loadingScene.url);
713
+ const obj = this.loadingScene.asset;
714
+ // try to find an ISceneEventListener component
715
+ const sceneListener = this.tryGetSceneEventListener(obj);
716
+ if (typeof sceneListener?.sceneClosing === "function") {
717
+ const res = sceneListener.sceneClosing();
718
+ if (res instanceof Promise)
719
+ await res;
720
+ }
721
+ GameObject.remove(obj);
722
+ }
723
+ // Invoke the event on a loading listener on the same object as the scene switcher
724
+ if (!this._isCurrentlyLoading) {
725
+ const listener = this.tryGetSceneEventListener(this.gameObject);
726
+ if (listener) {
727
+ if (listener.sceneClosing) {
728
+ const res = listener.sceneClosing();
729
+ if (res instanceof Promise)
730
+ await res;
731
+ }
732
+ }
733
+ }
734
+ }
735
+ tryGetSceneEventListener(obj, level = 0) {
736
+ if (!obj) {
737
+ return null;
738
+ }
739
+ const sceneListener = GameObject.foreachComponent(obj, c => {
740
+ const i = c;
741
+ if (i.sceneClosing || i.sceneOpened)
742
+ return i;
743
+ else
744
+ return undefined;
745
+ });
746
+ // if we didnt find any component with the listener on the root object
747
+ // we also check the first level of its children because a scene might be a group
748
+ if (level === 0 && !sceneListener && obj.children.length) {
749
+ for (const ch of obj.children) {
750
+ const res = this.tryGetSceneEventListener(ch, level + 1);
751
+ if (res)
752
+ return res;
753
+ }
754
+ }
755
+ if (!sceneListener)
756
+ return null;
757
+ return sceneListener;
758
+ }
759
+ }
760
+ __decorate([
761
+ serializable()
762
+ ], SceneSwitcher.prototype, "autoLoadFirstScene", void 0);
763
+ __decorate([
764
+ serializable(AssetReference)
765
+ ], SceneSwitcher.prototype, "scenes", void 0);
766
+ __decorate([
767
+ serializable(AssetReference)
768
+ ], SceneSwitcher.prototype, "loadingScene", void 0);
769
+ __decorate([
770
+ serializable()
771
+ ], SceneSwitcher.prototype, "queryParameterName", void 0);
772
+ __decorate([
773
+ serializable()
774
+ ], SceneSwitcher.prototype, "useSceneName", void 0);
775
+ __decorate([
776
+ serializable()
777
+ ], SceneSwitcher.prototype, "clamp", void 0);
778
+ __decorate([
779
+ serializable()
780
+ ], SceneSwitcher.prototype, "useHistory", void 0);
781
+ __decorate([
782
+ serializable()
783
+ ], SceneSwitcher.prototype, "useKeyboard", void 0);
784
+ __decorate([
785
+ serializable()
786
+ ], SceneSwitcher.prototype, "useSwipe", void 0);
787
+ __decorate([
788
+ serializable()
789
+ ], SceneSwitcher.prototype, "useSceneLighting", void 0);
790
+ __decorate([
791
+ serializable()
792
+ ], SceneSwitcher.prototype, "useSceneBackground", void 0);
793
+ __decorate([
794
+ serializable()
795
+ ], SceneSwitcher.prototype, "preloadNext", void 0);
796
+ __decorate([
797
+ serializable()
798
+ ], SceneSwitcher.prototype, "preloadPrevious", void 0);
799
+ __decorate([
800
+ serializable()
801
+ ], SceneSwitcher.prototype, "preloadConcurrent", void 0);
802
+ __decorate([
803
+ serializable()
804
+ ], SceneSwitcher.prototype, "createMenuButtons", void 0);
805
+ __decorate([
806
+ serializable(EventList)
807
+ ], SceneSwitcher.prototype, "sceneLoadingStart", void 0);
808
+ __decorate([
809
+ serializable(EventList)
810
+ ], SceneSwitcher.prototype, "sceneLoadingProgress", void 0);
811
+ __decorate([
812
+ serializable(EventList)
813
+ ], SceneSwitcher.prototype, "sceneLoaded", void 0);
814
+ function sceneUriToName(uri) {
815
+ const name = uri.split("/").pop();
816
+ const value = name?.split(".").shift();
817
+ if (value?.length)
818
+ return value;
819
+ return uri;
820
+ }
821
+ /**
822
+ * PreLoadScheduler is responsible for managing preloading of scenes.
823
+ * It handles scheduling and limiting concurrent downloads of scenes based on specified parameters.
824
+ */
825
+ class PreLoadScheduler {
826
+ /** Maximum number of scenes to preload ahead of the current scene */
827
+ maxLoadAhead;
828
+ /** Maximum number of scenes to preload behind the current scene */
829
+ maxLoadBehind;
830
+ /** Maximum number of scenes that can be preloaded concurrently */
831
+ maxConcurrent;
832
+ _isRunning = false;
833
+ _switcher;
834
+ _loadTasks = [];
835
+ _maxConcurrentLoads = 1;
836
+ /**
837
+ * Creates a new PreLoadScheduler instance
838
+ * @param rooms The SceneSwitcher that this scheduler belongs to
839
+ * @param ahead Number of scenes to preload ahead of current scene
840
+ * @param behind Number of scenes to preload behind current scene
841
+ * @param maxConcurrent Maximum number of concurrent preloads allowed
842
+ */
843
+ constructor(rooms, ahead = 1, behind = 1, maxConcurrent = 2) {
844
+ this._switcher = rooms;
845
+ this.maxLoadAhead = ahead;
846
+ this.maxLoadBehind = behind;
847
+ this.maxConcurrent = maxConcurrent;
848
+ }
849
+ /**
850
+ * Starts the preloading process after a specified delay
851
+ * @param delay Time in milliseconds to wait before starting preload
852
+ */
853
+ begin(delay) {
854
+ if (this._isRunning)
855
+ return;
856
+ if (debug)
857
+ console.log("Preload begin", { delay });
858
+ this._isRunning = true;
859
+ let lastRoom = -10;
860
+ let searchDistance;
861
+ let searchCall;
862
+ const array = this._switcher.scenes;
863
+ const startTime = Date.now() + delay;
864
+ const interval = setInterval(() => {
865
+ if (this.allLoaded()) {
866
+ if (debug)
867
+ console.log("All scenes (pre-)loaded");
868
+ this.stop();
869
+ }
870
+ if (!this._isRunning) {
871
+ clearInterval(interval);
872
+ return;
873
+ }
874
+ if (Date.now() < startTime)
875
+ return;
876
+ if (this.canLoadNewScene() === false)
877
+ return;
878
+ if (lastRoom === -10 || lastRoom !== this._switcher.currentIndex) {
879
+ lastRoom = this._switcher.currentIndex;
880
+ searchCall = 0;
881
+ searchDistance = 0;
882
+ }
883
+ const searchForward = searchCall % 2 === 0;
884
+ if (searchForward)
885
+ searchDistance += 1;
886
+ searchCall += 1;
887
+ const maxSearchDistance = searchForward ? this.maxLoadAhead : this.maxLoadBehind;
888
+ if (searchDistance > maxSearchDistance)
889
+ return;
890
+ const roomIndex = searchForward ? lastRoom + searchDistance : lastRoom - searchDistance;
891
+ if (roomIndex < 0)
892
+ return;
893
+ // if (roomIndex < 0) roomIndex = array.length + roomIndex;
894
+ if (roomIndex < 0 || roomIndex >= array.length)
895
+ return;
896
+ if (!this._loadTasks.some(t => t.index === roomIndex)) {
897
+ const scene = array[roomIndex];
898
+ if (debug)
899
+ console.log("Preload scene", { roomIndex, searchForward, lastRoom, currentIndex: this._switcher.currentIndex, tasks: this._loadTasks.length }, scene?.url);
900
+ new LoadTask(roomIndex, scene, this._loadTasks);
901
+ }
902
+ }, 200);
903
+ }
904
+ /**
905
+ * Stops the preloading process
906
+ */
907
+ stop() {
908
+ this._isRunning = false;
909
+ }
910
+ /**
911
+ * Checks if a new scene can be loaded based on current load limits
912
+ * @returns True if a new scene can be loaded, false otherwise
913
+ */
914
+ canLoadNewScene() {
915
+ return this._loadTasks.length < this._maxConcurrentLoads;
916
+ }
917
+ /**
918
+ * Checks if all scenes in the SceneSwitcher have been loaded
919
+ * @returns True if all scenes are loaded, false otherwise
920
+ */
921
+ allLoaded() {
922
+ if (this._switcher.scenes) {
923
+ for (const scene of this._switcher.scenes) {
924
+ if (!scene?.isLoaded)
925
+ continue;
926
+ if (scene.isLoaded() === false)
927
+ return false;
928
+ }
929
+ }
930
+ return true;
931
+ }
932
+ }
933
+ /**
934
+ * Represents a single preloading task for a scene
935
+ */
936
+ class LoadTask {
937
+ /** The index of the scene in the scenes array */
938
+ index;
939
+ /** The AssetReference to be loaded */
940
+ asset;
941
+ /** The collection of active load tasks this task belongs to */
942
+ tasks;
943
+ /**
944
+ * Creates a new LoadTask and begins loading immediately
945
+ * @param index The index of the scene in the scenes array
946
+ * @param asset The AssetReference to preload
947
+ * @param tasks The collection of active load tasks
948
+ */
949
+ constructor(index, asset, tasks) {
950
+ this.index = index;
951
+ this.asset = asset;
952
+ this.tasks = tasks;
953
+ tasks.push(this);
954
+ this.awaitLoading();
955
+ }
956
+ /**
957
+ * Asynchronously loads the asset and removes this task from the active tasks list when complete
958
+ */
959
+ async awaitLoading() {
960
+ if (this.asset && !this.asset.isLoaded()) {
961
+ if (debug)
962
+ console.log("Preload start: " + this.asset.url, this.index);
963
+ await this.asset.preload();
964
+ if (debug)
965
+ console.log("Preload finished: " + this.asset.url, this.index);
966
+ }
967
+ const i = this.tasks.indexOf(this);
968
+ if (i >= 0)
969
+ this.tasks.splice(i, 1);
970
+ }
971
+ }
972
972
  //# sourceMappingURL=SceneSwitcher.js.map