@needle-tools/engine 4.4.0-beta.7 → 4.4.0-beta.9

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 (1043) hide show
  1. package/CHANGELOG.md +3618 -3616
  2. package/LICENSE.md +10 -10
  3. package/README.md +64 -64
  4. package/components.needle.json +1 -1
  5. package/dist/needle-engine.bundle.js +5029 -4950
  6. package/dist/needle-engine.bundle.light.js +5030 -4951
  7. package/dist/needle-engine.bundle.light.min.js +146 -116
  8. package/dist/needle-engine.bundle.light.umd.cjs +148 -118
  9. package/dist/needle-engine.bundle.min.js +146 -116
  10. package/dist/needle-engine.bundle.umd.cjs +148 -118
  11. package/dist/needle-engine.d.ts +129 -130
  12. package/dist/needle-engine.light.d.ts +129 -130
  13. package/lib/asap/needle-asap.d.ts +1 -1
  14. package/lib/asap/needle-asap.js +95 -95
  15. package/lib/asap/sessiongranted.d.ts +3 -3
  16. package/lib/asap/sessiongranted.js +65 -65
  17. package/lib/asap/utils.d.ts +1 -1
  18. package/lib/asap/utils.js +3 -3
  19. package/lib/engine/analytics/index.d.ts +6 -6
  20. package/lib/engine/analytics/index.js +12 -12
  21. package/lib/engine/analytics/lcp.d.ts +3 -3
  22. package/lib/engine/analytics/lcp.js +34 -34
  23. package/lib/engine/api.d.ts +81 -81
  24. package/lib/engine/api.js +80 -80
  25. package/lib/engine/assets/index.d.ts +11 -11
  26. package/lib/engine/assets/index.js +47 -47
  27. package/lib/engine/assets/static.d.ts +1 -1
  28. package/lib/engine/assets/static.js +4 -4
  29. package/lib/engine/codegen/register_types.d.ts +1 -1
  30. package/lib/engine/codegen/register_types.js +300 -300
  31. package/lib/engine/debug/debug.d.ts +15 -15
  32. package/lib/engine/debug/debug.js +44 -44
  33. package/lib/engine/debug/debug_console.d.ts +2 -2
  34. package/lib/engine/debug/debug_console.js +307 -307
  35. package/lib/engine/debug/debug_overlay.d.ts +22 -22
  36. package/lib/engine/debug/debug_overlay.js +316 -316
  37. package/lib/engine/debug/debug_spatial_console.d.ts +2 -2
  38. package/lib/engine/debug/debug_spatial_console.js +390 -390
  39. package/lib/engine/debug/index.d.ts +2 -2
  40. package/lib/engine/debug/index.js +2 -2
  41. package/lib/engine/engine.d.ts +4 -0
  42. package/lib/engine/engine.js +12 -0
  43. package/lib/engine/engine.js.map +1 -0
  44. package/lib/engine/engine_addressables.d.ts +166 -166
  45. package/lib/engine/engine_addressables.js +608 -608
  46. package/lib/engine/engine_animation.d.ts +43 -43
  47. package/lib/engine/engine_animation.js +133 -133
  48. package/lib/engine/engine_application.d.ts +40 -40
  49. package/lib/engine/engine_application.js +104 -104
  50. package/lib/engine/engine_assetdatabase.d.ts +25 -25
  51. package/lib/engine/engine_assetdatabase.js +344 -344
  52. package/lib/engine/engine_audio.d.ts +4 -4
  53. package/lib/engine/engine_audio.js +23 -23
  54. package/lib/engine/engine_camera.d.ts +13 -13
  55. package/lib/engine/engine_camera.js +30 -30
  56. package/lib/engine/engine_components.d.ts +110 -110
  57. package/lib/engine/engine_components.js +382 -382
  58. package/lib/engine/engine_components_internal.d.ts +9 -9
  59. package/lib/engine/engine_components_internal.js +36 -36
  60. package/lib/engine/engine_constants.d.ts +10 -10
  61. package/lib/engine/engine_constants.js +41 -41
  62. package/lib/engine/engine_context.d.ts +354 -354
  63. package/lib/engine/engine_context.js +1536 -1536
  64. package/lib/engine/engine_context_registry.d.ts +71 -71
  65. package/lib/engine/engine_context_registry.js +117 -117
  66. package/lib/engine/engine_coroutine.d.ts +35 -35
  67. package/lib/engine/engine_coroutine.js +52 -52
  68. package/lib/engine/engine_create_objects.d.ts +118 -118
  69. package/lib/engine/engine_create_objects.js +308 -308
  70. package/lib/engine/engine_default_parameters.d.ts +2 -2
  71. package/lib/engine/engine_default_parameters.js +3 -3
  72. package/lib/engine/engine_editor-sync.d.ts +21 -21
  73. package/lib/engine/engine_editor-sync.js +4 -4
  74. package/lib/engine/engine_element.d.ts +113 -113
  75. package/lib/engine/engine_element.js +832 -829
  76. package/lib/engine/engine_element.js.map +1 -1
  77. package/lib/engine/engine_element_attributes.d.ts +72 -72
  78. package/lib/engine/engine_element_attributes.js +1 -1
  79. package/lib/engine/engine_element_extras.d.ts +6 -6
  80. package/lib/engine/engine_element_extras.js +13 -13
  81. package/lib/engine/engine_element_loading.d.ts +44 -44
  82. package/lib/engine/engine_element_loading.js +349 -349
  83. package/lib/engine/engine_element_overlay.d.ts +21 -21
  84. package/lib/engine/engine_element_overlay.js +166 -166
  85. package/lib/engine/engine_fileloader.d.ts +2 -2
  86. package/lib/engine/engine_fileloader.js +8 -8
  87. package/lib/engine/engine_gameobject.d.ts +68 -68
  88. package/lib/engine/engine_gameobject.js +591 -591
  89. package/lib/engine/engine_generic_utils.d.ts +1 -1
  90. package/lib/engine/engine_generic_utils.js +13 -13
  91. package/lib/engine/engine_gizmos.d.ts +149 -149
  92. package/lib/engine/engine_gizmos.js +530 -530
  93. package/lib/engine/engine_gltf.d.ts +12 -12
  94. package/lib/engine/engine_gltf.js +15 -15
  95. package/lib/engine/engine_gltf_builtin_components.d.ts +7 -7
  96. package/lib/engine/engine_gltf_builtin_components.js +341 -341
  97. package/lib/engine/engine_hot_reload.d.ts +7 -7
  98. package/lib/engine/engine_hot_reload.js +184 -184
  99. package/lib/engine/engine_input.d.ts +352 -352
  100. package/lib/engine/engine_input.js +1265 -1265
  101. package/lib/engine/engine_input_utils.d.ts +2 -2
  102. package/lib/engine/engine_input_utils.js +22 -22
  103. package/lib/engine/engine_instancing.d.ts +19 -19
  104. package/lib/engine/engine_instancing.js +39 -39
  105. package/lib/engine/engine_license.d.ts +11 -9
  106. package/lib/engine/engine_license.js +361 -320
  107. package/lib/engine/engine_license.js.map +1 -1
  108. package/lib/engine/engine_lifecycle_api.d.ts +76 -76
  109. package/lib/engine/engine_lifecycle_api.js +99 -99
  110. package/lib/engine/engine_lifecycle_functions_internal.d.ts +32 -32
  111. package/lib/engine/engine_lifecycle_functions_internal.js +146 -146
  112. package/lib/engine/engine_lightdata.d.ts +23 -23
  113. package/lib/engine/engine_lightdata.js +91 -91
  114. package/lib/engine/engine_loaders.d.ts +13 -13
  115. package/lib/engine/engine_loaders.js +62 -62
  116. package/lib/engine/engine_lods.d.ts +31 -31
  117. package/lib/engine/engine_lods.js +146 -146
  118. package/lib/engine/engine_mainloop_utils.d.ts +32 -32
  119. package/lib/engine/engine_mainloop_utils.js +466 -466
  120. package/lib/engine/engine_math.d.ts +114 -114
  121. package/lib/engine/engine_math.js +247 -247
  122. package/lib/engine/engine_modules.d.ts +36 -36
  123. package/lib/engine/engine_modules.js +85 -85
  124. package/lib/engine/engine_networking.d.ts +252 -252
  125. package/lib/engine/engine_networking.js +743 -743
  126. package/lib/engine/engine_networking_auto.d.ts +24 -24
  127. package/lib/engine/engine_networking_auto.js +310 -310
  128. package/lib/engine/engine_networking_blob.d.ts +48 -48
  129. package/lib/engine/engine_networking_blob.js +212 -212
  130. package/lib/engine/engine_networking_files.d.ts +35 -35
  131. package/lib/engine/engine_networking_files.js +172 -172
  132. package/lib/engine/engine_networking_files_default_components.d.ts +6 -6
  133. package/lib/engine/engine_networking_files_default_components.js +42 -42
  134. package/lib/engine/engine_networking_instantiate.d.ts +100 -100
  135. package/lib/engine/engine_networking_instantiate.js +345 -345
  136. package/lib/engine/engine_networking_peer.d.ts +15 -15
  137. package/lib/engine/engine_networking_peer.js +132 -132
  138. package/lib/engine/engine_networking_streams.d.ts +123 -123
  139. package/lib/engine/engine_networking_streams.js +645 -645
  140. package/lib/engine/engine_networking_types.d.ts +22 -22
  141. package/lib/engine/engine_networking_types.js +7 -7
  142. package/lib/engine/engine_networking_utils.d.ts +2 -2
  143. package/lib/engine/engine_networking_utils.js +20 -20
  144. package/lib/engine/engine_networking_websocket.d.ts +1 -1
  145. package/lib/engine/engine_networking_websocket.js +2 -2
  146. package/lib/engine/engine_patcher.d.ts +10 -10
  147. package/lib/engine/engine_patcher.js +142 -142
  148. package/lib/engine/engine_physics.d.ts +152 -152
  149. package/lib/engine/engine_physics.js +645 -645
  150. package/lib/engine/engine_physics.types.d.ts +40 -40
  151. package/lib/engine/engine_physics.types.js +33 -33
  152. package/lib/engine/engine_physics_rapier.d.ts +147 -147
  153. package/lib/engine/engine_physics_rapier.js +1432 -1432
  154. package/lib/engine/engine_playerview.d.ts +26 -26
  155. package/lib/engine/engine_playerview.js +64 -64
  156. package/lib/engine/engine_scenelighting.d.ts +71 -71
  157. package/lib/engine/engine_scenelighting.js +226 -226
  158. package/lib/engine/engine_scenetools.d.ts +50 -50
  159. package/lib/engine/engine_scenetools.js +321 -321
  160. package/lib/engine/engine_serialization.d.ts +3 -3
  161. package/lib/engine/engine_serialization.js +3 -3
  162. package/lib/engine/engine_serialization_builtin_serializer.d.ts +72 -72
  163. package/lib/engine/engine_serialization_builtin_serializer.js +403 -403
  164. package/lib/engine/engine_serialization_core.d.ts +85 -85
  165. package/lib/engine/engine_serialization_core.js +602 -602
  166. package/lib/engine/engine_serialization_decorator.d.ts +23 -23
  167. package/lib/engine/engine_serialization_decorator.js +66 -66
  168. package/lib/engine/engine_setup.d.ts +1 -1
  169. package/lib/engine/engine_setup.js +2 -2
  170. package/lib/engine/engine_shaders.d.ts +53 -53
  171. package/lib/engine/engine_shaders.js +252 -252
  172. package/lib/engine/engine_shims.d.ts +4 -4
  173. package/lib/engine/engine_shims.js +24 -24
  174. package/lib/engine/engine_test_utils.d.ts +39 -39
  175. package/lib/engine/engine_test_utils.js +83 -83
  176. package/lib/engine/engine_texture.d.ts +28 -28
  177. package/lib/engine/engine_texture.js +64 -64
  178. package/lib/engine/engine_three_utils.d.ts +201 -201
  179. package/lib/engine/engine_three_utils.js +731 -731
  180. package/lib/engine/engine_time.d.ts +51 -51
  181. package/lib/engine/engine_time.js +82 -82
  182. package/lib/engine/engine_time_utils.d.ts +88 -88
  183. package/lib/engine/engine_time_utils.js +215 -215
  184. package/lib/engine/engine_tonemapping.d.ts +2 -2
  185. package/lib/engine/engine_tonemapping.js +194 -194
  186. package/lib/engine/engine_types.d.ts +572 -572
  187. package/lib/engine/engine_types.js +88 -88
  188. package/lib/engine/engine_typestore.d.ts +28 -28
  189. package/lib/engine/engine_typestore.js +55 -55
  190. package/lib/engine/engine_util_decorator.d.ts +13 -13
  191. package/lib/engine/engine_util_decorator.js +116 -116
  192. package/lib/engine/engine_utils.d.ts +266 -266
  193. package/lib/engine/engine_utils.js +878 -878
  194. package/lib/engine/engine_utils_format.d.ts +21 -21
  195. package/lib/engine/engine_utils_format.js +193 -193
  196. package/lib/engine/engine_utils_screenshot.d.ts +159 -159
  197. package/lib/engine/engine_utils_screenshot.js +513 -513
  198. package/lib/engine/engine_utils_screenshot.xr.d.ts +5 -5
  199. package/lib/engine/engine_utils_screenshot.xr.js +90 -90
  200. package/lib/engine/engine_web_api.d.ts +12 -0
  201. package/lib/engine/engine_web_api.js +113 -0
  202. package/lib/engine/engine_web_api.js.map +1 -0
  203. package/lib/engine/engine_xr.d.ts +1 -1
  204. package/lib/engine/engine_xr.js +1 -1
  205. package/lib/engine/export/gltf/Writers.d.ts +19 -19
  206. package/lib/engine/export/gltf/Writers.js +24 -24
  207. package/lib/engine/export/gltf/index.d.ts +11 -11
  208. package/lib/engine/export/gltf/index.js +123 -123
  209. package/lib/engine/export/index.d.ts +2 -2
  210. package/lib/engine/export/index.js +2 -2
  211. package/lib/engine/export/state.d.ts +7 -7
  212. package/lib/engine/export/state.js +17 -17
  213. package/lib/engine/export/utils.d.ts +2 -2
  214. package/lib/engine/export/utils.js +7 -7
  215. package/lib/engine/extensions/EXT_texture_exr.d.ts +8 -8
  216. package/lib/engine/extensions/EXT_texture_exr.js +32 -32
  217. package/lib/engine/extensions/NEEDLE_animator_controller_model.d.ts +122 -122
  218. package/lib/engine/extensions/NEEDLE_animator_controller_model.js +95 -95
  219. package/lib/engine/extensions/NEEDLE_components.d.ts +35 -35
  220. package/lib/engine/extensions/NEEDLE_components.js +220 -220
  221. package/lib/engine/extensions/NEEDLE_gameobject_data.d.ts +10 -10
  222. package/lib/engine/extensions/NEEDLE_gameobject_data.js +57 -57
  223. package/lib/engine/extensions/NEEDLE_lighting_settings.d.ts +37 -37
  224. package/lib/engine/extensions/NEEDLE_lighting_settings.js +157 -157
  225. package/lib/engine/extensions/NEEDLE_lightmaps.d.ts +18 -18
  226. package/lib/engine/extensions/NEEDLE_lightmaps.js +99 -99
  227. package/lib/engine/extensions/NEEDLE_persistent_assets.d.ts +11 -11
  228. package/lib/engine/extensions/NEEDLE_persistent_assets.js +63 -63
  229. package/lib/engine/extensions/NEEDLE_progressive.d.ts +1 -1
  230. package/lib/engine/extensions/NEEDLE_progressive.js +1 -1
  231. package/lib/engine/extensions/NEEDLE_render_objects.d.ts +13 -13
  232. package/lib/engine/extensions/NEEDLE_render_objects.js +159 -159
  233. package/lib/engine/extensions/NEEDLE_techniques_webgl.d.ts +38 -38
  234. package/lib/engine/extensions/NEEDLE_techniques_webgl.js +564 -564
  235. package/lib/engine/extensions/extension_resolver.d.ts +4 -4
  236. package/lib/engine/extensions/extension_resolver.js +1 -1
  237. package/lib/engine/extensions/extension_utils.d.ts +12 -12
  238. package/lib/engine/extensions/extension_utils.js +152 -152
  239. package/lib/engine/extensions/extensions.d.ts +31 -31
  240. package/lib/engine/extensions/extensions.js +103 -103
  241. package/lib/engine/extensions/index.d.ts +6 -6
  242. package/lib/engine/extensions/index.js +6 -6
  243. package/lib/engine/extensions/usage_tracker.d.ts +13 -13
  244. package/lib/engine/extensions/usage_tracker.js +65 -65
  245. package/lib/engine/js-extensions/Camera.d.ts +1 -1
  246. package/lib/engine/js-extensions/Camera.js +39 -39
  247. package/lib/engine/js-extensions/ExtensionUtils.d.ts +9 -9
  248. package/lib/engine/js-extensions/ExtensionUtils.js +67 -67
  249. package/lib/engine/js-extensions/Layers.d.ts +6 -6
  250. package/lib/engine/js-extensions/Layers.js +22 -22
  251. package/lib/engine/js-extensions/Object3D.d.ts +120 -120
  252. package/lib/engine/js-extensions/Object3D.js +136 -136
  253. package/lib/engine/js-extensions/RGBAColor.d.ts +23 -23
  254. package/lib/engine/js-extensions/RGBAColor.js +110 -110
  255. package/lib/engine/js-extensions/Vector.d.ts +3 -3
  256. package/lib/engine/js-extensions/Vector.js +13 -13
  257. package/lib/engine/js-extensions/index.d.ts +5 -5
  258. package/lib/engine/js-extensions/index.js +5 -5
  259. package/lib/engine/physics/workers/mesh-bvh/GenerateMeshBVHWorker.d.ts +4 -4
  260. package/lib/engine/physics/workers/mesh-bvh/GenerateMeshBVHWorker.js +76 -76
  261. package/lib/engine/shaders/shaderData.d.ts +55 -55
  262. package/lib/engine/shaders/shaderData.js +58 -58
  263. package/lib/engine/tests/test_utils.d.ts +2 -2
  264. package/lib/engine/tests/test_utils.js +53 -53
  265. package/lib/engine/webcomponents/WebXRButtons.d.ts +56 -56
  266. package/lib/engine/webcomponents/WebXRButtons.js +230 -230
  267. package/lib/engine/webcomponents/api.d.ts +5 -5
  268. package/lib/engine/webcomponents/api.js +4 -4
  269. package/lib/engine/webcomponents/buttons.d.ts +39 -39
  270. package/lib/engine/webcomponents/buttons.js +237 -237
  271. package/lib/engine/webcomponents/fonts.d.ts +9 -9
  272. package/lib/engine/webcomponents/fonts.js +32 -32
  273. package/lib/engine/webcomponents/icons.d.ts +9 -9
  274. package/lib/engine/webcomponents/icons.js +52 -52
  275. package/lib/engine/webcomponents/index.d.ts +1 -1
  276. package/lib/engine/webcomponents/index.js +1 -1
  277. package/lib/engine/webcomponents/logo-element.d.ts +10 -10
  278. package/lib/engine/webcomponents/logo-element.js +67 -67
  279. package/lib/engine/webcomponents/needle menu/needle-menu-spatial.d.ts +37 -37
  280. package/lib/engine/webcomponents/needle menu/needle-menu-spatial.js +513 -513
  281. package/lib/engine/webcomponents/needle menu/needle-menu.d.ts +155 -151
  282. package/lib/engine/webcomponents/needle menu/needle-menu.js +1029 -1018
  283. package/lib/engine/webcomponents/needle menu/needle-menu.js.map +1 -1
  284. package/lib/engine/webcomponents/needle-button.d.ts +34 -34
  285. package/lib/engine/webcomponents/needle-button.js +161 -161
  286. package/lib/engine/xr/NeedleXRController.d.ts +313 -313
  287. package/lib/engine/xr/NeedleXRController.js +1007 -1007
  288. package/lib/engine/xr/NeedleXRSession.d.ts +339 -339
  289. package/lib/engine/xr/NeedleXRSession.js +1427 -1427
  290. package/lib/engine/xr/NeedleXRSync.d.ts +22 -22
  291. package/lib/engine/xr/NeedleXRSync.js +188 -188
  292. package/lib/engine/xr/SceneTransition.d.ts +18 -18
  293. package/lib/engine/xr/SceneTransition.js +69 -69
  294. package/lib/engine/xr/TempXRContext.d.ts +34 -34
  295. package/lib/engine/xr/TempXRContext.js +187 -187
  296. package/lib/engine/xr/XRRig.d.ts +7 -7
  297. package/lib/engine/xr/XRRig.js +1 -1
  298. package/lib/engine/xr/api.d.ts +6 -6
  299. package/lib/engine/xr/api.js +6 -6
  300. package/lib/engine/xr/events.d.ts +66 -66
  301. package/lib/engine/xr/events.js +93 -93
  302. package/lib/engine/xr/internal.d.ts +12 -12
  303. package/lib/engine/xr/internal.js +25 -25
  304. package/lib/engine/xr/usdz.d.ts +12 -12
  305. package/lib/engine/xr/usdz.js +29 -29
  306. package/lib/engine/xr/utils.d.ts +11 -11
  307. package/lib/engine/xr/utils.js +34 -34
  308. package/lib/engine-components/AlignmentConstraint.d.ts +10 -10
  309. package/lib/engine-components/AlignmentConstraint.js +39 -39
  310. package/lib/engine-components/Animation.d.ts +156 -156
  311. package/lib/engine-components/Animation.js +508 -508
  312. package/lib/engine-components/AnimationCurve.d.ts +40 -40
  313. package/lib/engine-components/AnimationCurve.js +159 -159
  314. package/lib/engine-components/AnimationUtils.d.ts +8 -8
  315. package/lib/engine-components/AnimationUtils.js +27 -27
  316. package/lib/engine-components/AnimationUtilsAutoplay.d.ts +1 -1
  317. package/lib/engine-components/AnimationUtilsAutoplay.js +39 -39
  318. package/lib/engine-components/Animator.d.ts +217 -217
  319. package/lib/engine-components/Animator.js +354 -354
  320. package/lib/engine-components/AnimatorController.d.ts +227 -227
  321. package/lib/engine-components/AnimatorController.js +1152 -1152
  322. package/lib/engine-components/AudioListener.d.ts +33 -33
  323. package/lib/engine-components/AudioListener.js +86 -86
  324. package/lib/engine-components/AudioSource.d.ts +217 -217
  325. package/lib/engine-components/AudioSource.js +627 -627
  326. package/lib/engine-components/AvatarLoader.d.ts +80 -80
  327. package/lib/engine-components/AvatarLoader.js +231 -231
  328. package/lib/engine-components/AxesHelper.d.ts +32 -32
  329. package/lib/engine-components/AxesHelper.js +67 -67
  330. package/lib/engine-components/BasicIKConstraint.d.ts +9 -9
  331. package/lib/engine-components/BasicIKConstraint.js +43 -43
  332. package/lib/engine-components/BoxCollider.d.ts +2 -2
  333. package/lib/engine-components/BoxCollider.js +2 -2
  334. package/lib/engine-components/BoxHelperComponent.d.ts +47 -47
  335. package/lib/engine-components/BoxHelperComponent.js +102 -102
  336. package/lib/engine-components/Camera.d.ts +231 -231
  337. package/lib/engine-components/Camera.js +700 -700
  338. package/lib/engine-components/CameraUtils.d.ts +1 -1
  339. package/lib/engine-components/CameraUtils.js +121 -121
  340. package/lib/engine-components/CharacterController.d.ts +55 -55
  341. package/lib/engine-components/CharacterController.js +236 -236
  342. package/lib/engine-components/Collider.d.ts +188 -188
  343. package/lib/engine-components/Collider.js +369 -369
  344. package/lib/engine-components/Component.d.ts +792 -792
  345. package/lib/engine-components/Component.js +915 -915
  346. package/lib/engine-components/ContactShadows.d.ts +82 -82
  347. package/lib/engine-components/ContactShadows.js +430 -430
  348. package/lib/engine-components/DeleteBox.d.ts +19 -19
  349. package/lib/engine-components/DeleteBox.js +58 -58
  350. package/lib/engine-components/DeviceFlag.d.ts +16 -16
  351. package/lib/engine-components/DeviceFlag.js +47 -47
  352. package/lib/engine-components/DragControls.d.ts +170 -170
  353. package/lib/engine-components/DragControls.js +1421 -1421
  354. package/lib/engine-components/DropListener.d.ts +215 -215
  355. package/lib/engine-components/DropListener.js +630 -630
  356. package/lib/engine-components/Duplicatable.d.ts +35 -35
  357. package/lib/engine-components/Duplicatable.js +202 -202
  358. package/lib/engine-components/EventList.d.ts +54 -54
  359. package/lib/engine-components/EventList.js +232 -232
  360. package/lib/engine-components/EventTrigger.d.ts +33 -33
  361. package/lib/engine-components/EventTrigger.js +75 -75
  362. package/lib/engine-components/EventType.d.ts +22 -22
  363. package/lib/engine-components/EventType.js +23 -23
  364. package/lib/engine-components/FlyControls.d.ts +10 -0
  365. package/lib/engine-components/FlyControls.js +29 -0
  366. package/lib/engine-components/FlyControls.js.map +1 -0
  367. package/lib/engine-components/Fog.d.ts +22 -22
  368. package/lib/engine-components/Fog.js +61 -61
  369. package/lib/engine-components/Gizmos.d.ts +17 -17
  370. package/lib/engine-components/Gizmos.js +64 -64
  371. package/lib/engine-components/GridHelper.d.ts +20 -20
  372. package/lib/engine-components/GridHelper.js +54 -54
  373. package/lib/engine-components/GroundProjection.d.ts +67 -67
  374. package/lib/engine-components/GroundProjection.js +343 -343
  375. package/lib/engine-components/Interactable.d.ts +12 -12
  376. package/lib/engine-components/Interactable.js +12 -12
  377. package/lib/engine-components/Joints.d.ts +19 -19
  378. package/lib/engine-components/Joints.js +51 -51
  379. package/lib/engine-components/LODGroup.d.ts +35 -35
  380. package/lib/engine-components/LODGroup.js +152 -152
  381. package/lib/engine-components/Light.d.ts +180 -180
  382. package/lib/engine-components/Light.js +535 -535
  383. package/lib/engine-components/LookAtConstraint.d.ts +19 -19
  384. package/lib/engine-components/LookAtConstraint.js +35 -35
  385. package/lib/engine-components/NeedleMenu.d.ts +50 -50
  386. package/lib/engine-components/NeedleMenu.js +92 -92
  387. package/lib/engine-components/NeedleMenu.js.map +1 -1
  388. package/lib/engine-components/NestedGltf.d.ts +25 -25
  389. package/lib/engine-components/NestedGltf.js +88 -88
  390. package/lib/engine-components/Networking.d.ts +54 -54
  391. package/lib/engine-components/Networking.js +112 -112
  392. package/lib/engine-components/OffsetConstraint.d.ts +14 -14
  393. package/lib/engine-components/OffsetConstraint.js +65 -65
  394. package/lib/engine-components/OrbitControls.d.ts +266 -266
  395. package/lib/engine-components/OrbitControls.js +1009 -1009
  396. package/lib/engine-components/PlayerColor.d.ts +19 -19
  397. package/lib/engine-components/PlayerColor.js +94 -94
  398. package/lib/engine-components/ReflectionProbe.d.ts +27 -27
  399. package/lib/engine-components/ReflectionProbe.js +201 -201
  400. package/lib/engine-components/ReflectionProbe.js.map +1 -1
  401. package/lib/engine-components/Renderer.d.ts +153 -153
  402. package/lib/engine-components/Renderer.js +830 -830
  403. package/lib/engine-components/RendererInstancing.d.ts +140 -140
  404. package/lib/engine-components/RendererInstancing.js +744 -744
  405. package/lib/engine-components/RendererLightmap.d.ts +24 -24
  406. package/lib/engine-components/RendererLightmap.js +182 -182
  407. package/lib/engine-components/RigidBody.d.ts +155 -155
  408. package/lib/engine-components/RigidBody.js +517 -517
  409. package/lib/engine-components/SceneSwitcher.d.ts +263 -263
  410. package/lib/engine-components/SceneSwitcher.js +951 -951
  411. package/lib/engine-components/ScreenCapture.d.ts +144 -144
  412. package/lib/engine-components/ScreenCapture.js +547 -547
  413. package/lib/engine-components/ShadowCatcher.d.ts +33 -33
  414. package/lib/engine-components/ShadowCatcher.js +166 -166
  415. package/lib/engine-components/Skybox.d.ts +82 -82
  416. package/lib/engine-components/Skybox.js +448 -448
  417. package/lib/engine-components/SmoothFollow.d.ts +34 -34
  418. package/lib/engine-components/SmoothFollow.js +82 -82
  419. package/lib/engine-components/SpatialTrigger.d.ts +102 -102
  420. package/lib/engine-components/SpatialTrigger.js +225 -225
  421. package/lib/engine-components/SpectatorCamera.d.ts +111 -111
  422. package/lib/engine-components/SpectatorCamera.js +715 -715
  423. package/lib/engine-components/SphereCollider.d.ts +2 -2
  424. package/lib/engine-components/SphereCollider.js +2 -2
  425. package/lib/engine-components/SpriteRenderer.d.ts +132 -132
  426. package/lib/engine-components/SpriteRenderer.js +472 -472
  427. package/lib/engine-components/SyncedCamera.d.ts +41 -41
  428. package/lib/engine-components/SyncedCamera.js +199 -199
  429. package/lib/engine-components/SyncedRoom.d.ts +106 -106
  430. package/lib/engine-components/SyncedRoom.js +371 -371
  431. package/lib/engine-components/SyncedTransform.d.ts +94 -94
  432. package/lib/engine-components/SyncedTransform.js +331 -331
  433. package/lib/engine-components/TestRunner.d.ts +16 -16
  434. package/lib/engine-components/TestRunner.js +102 -102
  435. package/lib/engine-components/TransformGizmo.d.ts +75 -75
  436. package/lib/engine-components/TransformGizmo.js +209 -209
  437. package/lib/engine-components/VideoPlayer.d.ts +184 -184
  438. package/lib/engine-components/VideoPlayer.js +978 -978
  439. package/lib/engine-components/Voip.d.ts +67 -67
  440. package/lib/engine-components/Voip.js +360 -360
  441. package/lib/engine-components/api.d.ts +51 -51
  442. package/lib/engine-components/api.js +50 -50
  443. package/lib/engine-components/avatar/AvatarBlink_Simple.d.ts +11 -11
  444. package/lib/engine-components/avatar/AvatarBlink_Simple.js +76 -76
  445. package/lib/engine-components/avatar/AvatarEyeLook_Rotation.d.ts +14 -14
  446. package/lib/engine-components/avatar/AvatarEyeLook_Rotation.js +68 -68
  447. package/lib/engine-components/avatar/Avatar_Brain_LookAt.d.ts +29 -29
  448. package/lib/engine-components/avatar/Avatar_Brain_LookAt.js +121 -121
  449. package/lib/engine-components/avatar/Avatar_MouthShapes.d.ts +15 -15
  450. package/lib/engine-components/avatar/Avatar_MouthShapes.js +79 -79
  451. package/lib/engine-components/avatar/Avatar_MustacheShake.d.ts +9 -9
  452. package/lib/engine-components/avatar/Avatar_MustacheShake.js +29 -29
  453. package/lib/engine-components/codegen/components.d.ts +216 -216
  454. package/lib/engine-components/codegen/components.js +218 -218
  455. package/lib/engine-components/debug/LogStats.d.ts +5 -5
  456. package/lib/engine-components/debug/LogStats.js +18 -18
  457. package/lib/engine-components/export/gltf/GltfExport.d.ts +30 -30
  458. package/lib/engine-components/export/gltf/GltfExport.js +246 -246
  459. package/lib/engine-components/export/gltf/index.d.ts +1 -1
  460. package/lib/engine-components/export/gltf/index.js +1 -1
  461. package/lib/engine-components/export/index.d.ts +1 -1
  462. package/lib/engine-components/export/index.js +1 -1
  463. package/lib/engine-components/export/usdz/Extension.d.ts +22 -22
  464. package/lib/engine-components/export/usdz/Extension.js +1 -1
  465. package/lib/engine-components/export/usdz/ThreeUSDZExporter.d.ts +160 -160
  466. package/lib/engine-components/export/usdz/ThreeUSDZExporter.js +1782 -1782
  467. package/lib/engine-components/export/usdz/USDZExporter.d.ts +130 -130
  468. package/lib/engine-components/export/usdz/USDZExporter.js +663 -663
  469. package/lib/engine-components/export/usdz/extensions/Animation.d.ts +106 -106
  470. package/lib/engine-components/export/usdz/extensions/Animation.js +1071 -1071
  471. package/lib/engine-components/export/usdz/extensions/DocumentExtension.d.ts +5 -5
  472. package/lib/engine-components/export/usdz/extensions/DocumentExtension.js +6 -6
  473. package/lib/engine-components/export/usdz/extensions/USDZText.d.ts +54 -54
  474. package/lib/engine-components/export/usdz/extensions/USDZText.js +203 -203
  475. package/lib/engine-components/export/usdz/extensions/USDZUI.d.ts +8 -8
  476. package/lib/engine-components/export/usdz/extensions/USDZUI.js +157 -157
  477. package/lib/engine-components/export/usdz/extensions/behavior/Actions.d.ts +30 -30
  478. package/lib/engine-components/export/usdz/extensions/behavior/Actions.js +88 -88
  479. package/lib/engine-components/export/usdz/extensions/behavior/AudioExtension.d.ts +10 -10
  480. package/lib/engine-components/export/usdz/extensions/behavior/AudioExtension.js +86 -86
  481. package/lib/engine-components/export/usdz/extensions/behavior/Behaviour.d.ts +28 -28
  482. package/lib/engine-components/export/usdz/extensions/behavior/Behaviour.js +290 -290
  483. package/lib/engine-components/export/usdz/extensions/behavior/BehaviourComponents.d.ts +190 -190
  484. package/lib/engine-components/export/usdz/extensions/behavior/BehaviourComponents.js +1060 -1060
  485. package/lib/engine-components/export/usdz/extensions/behavior/BehavioursBuilder.d.ts +135 -135
  486. package/lib/engine-components/export/usdz/extensions/behavior/BehavioursBuilder.js +548 -548
  487. package/lib/engine-components/export/usdz/extensions/behavior/PhysicsExtension.d.ts +7 -7
  488. package/lib/engine-components/export/usdz/extensions/behavior/PhysicsExtension.js +115 -115
  489. package/lib/engine-components/export/usdz/index.d.ts +3 -3
  490. package/lib/engine-components/export/usdz/index.js +2 -2
  491. package/lib/engine-components/export/usdz/utils/animationutils.d.ts +7 -7
  492. package/lib/engine-components/export/usdz/utils/animationutils.js +163 -163
  493. package/lib/engine-components/export/usdz/utils/quicklook.d.ts +2 -2
  494. package/lib/engine-components/export/usdz/utils/quicklook.js +43 -43
  495. package/lib/engine-components/particlesystem/ParticleSystem.d.ts +177 -177
  496. package/lib/engine-components/particlesystem/ParticleSystem.js +1176 -1176
  497. package/lib/engine-components/particlesystem/ParticleSystemModules.d.ts +526 -526
  498. package/lib/engine-components/particlesystem/ParticleSystemModules.js +1930 -1930
  499. package/lib/engine-components/particlesystem/ParticleSystemSubEmitter.d.ts +25 -25
  500. package/lib/engine-components/particlesystem/ParticleSystemSubEmitter.js +87 -87
  501. package/lib/engine-components/particlesystem/api.d.ts +2 -2
  502. package/lib/engine-components/particlesystem/api.js +2 -2
  503. package/lib/engine-components/postprocessing/Effects/Antialiasing.d.ts +17 -17
  504. package/lib/engine-components/postprocessing/Effects/Antialiasing.js +50 -50
  505. package/lib/engine-components/postprocessing/Effects/BloomEffect.d.ts +46 -46
  506. package/lib/engine-components/postprocessing/Effects/BloomEffect.js +113 -113
  507. package/lib/engine-components/postprocessing/Effects/ChromaticAberration.d.ts +11 -11
  508. package/lib/engine-components/postprocessing/Effects/ChromaticAberration.js +39 -39
  509. package/lib/engine-components/postprocessing/Effects/ColorAdjustments.d.ts +15 -15
  510. package/lib/engine-components/postprocessing/Effects/ColorAdjustments.js +92 -92
  511. package/lib/engine-components/postprocessing/Effects/DepthOfField.d.ts +25 -25
  512. package/lib/engine-components/postprocessing/Effects/DepthOfField.js +104 -104
  513. package/lib/engine-components/postprocessing/Effects/EffectWrapper.d.ts +12 -12
  514. package/lib/engine-components/postprocessing/Effects/EffectWrapper.js +18 -18
  515. package/lib/engine-components/postprocessing/Effects/Pixelation.d.ts +11 -11
  516. package/lib/engine-components/postprocessing/Effects/Pixelation.js +32 -32
  517. package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusion.d.ts +18 -18
  518. package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusion.js +91 -91
  519. package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.d.ts +70 -70
  520. package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.js +175 -175
  521. package/lib/engine-components/postprocessing/Effects/Sharpening.d.ts +17 -17
  522. package/lib/engine-components/postprocessing/Effects/Sharpening.js +123 -123
  523. package/lib/engine-components/postprocessing/Effects/TiltShiftEffect.d.ts +17 -17
  524. package/lib/engine-components/postprocessing/Effects/TiltShiftEffect.js +70 -70
  525. package/lib/engine-components/postprocessing/Effects/Tonemapping.d.ts +26 -26
  526. package/lib/engine-components/postprocessing/Effects/Tonemapping.js +138 -138
  527. package/lib/engine-components/postprocessing/Effects/Vignette.d.ts +15 -15
  528. package/lib/engine-components/postprocessing/Effects/Vignette.js +60 -60
  529. package/lib/engine-components/postprocessing/PostProcessingEffect.d.ts +72 -72
  530. package/lib/engine-components/postprocessing/PostProcessingEffect.js +149 -149
  531. package/lib/engine-components/postprocessing/PostProcessingHandler.d.ts +25 -25
  532. package/lib/engine-components/postprocessing/PostProcessingHandler.js +350 -350
  533. package/lib/engine-components/postprocessing/Volume.d.ts +89 -89
  534. package/lib/engine-components/postprocessing/Volume.js +367 -367
  535. package/lib/engine-components/postprocessing/VolumeParameter.d.ts +26 -26
  536. package/lib/engine-components/postprocessing/VolumeParameter.js +136 -136
  537. package/lib/engine-components/postprocessing/VolumeProfile.d.ts +15 -15
  538. package/lib/engine-components/postprocessing/VolumeProfile.js +60 -60
  539. package/lib/engine-components/postprocessing/index.d.ts +5 -5
  540. package/lib/engine-components/postprocessing/index.js +5 -5
  541. package/lib/engine-components/postprocessing/utils.d.ts +11 -11
  542. package/lib/engine-components/postprocessing/utils.js +37 -37
  543. package/lib/engine-components/timeline/PlayableDirector.d.ts +163 -163
  544. package/lib/engine-components/timeline/PlayableDirector.js +686 -686
  545. package/lib/engine-components/timeline/SignalAsset.d.ts +24 -24
  546. package/lib/engine-components/timeline/SignalAsset.js +130 -130
  547. package/lib/engine-components/timeline/TimelineModels.d.ts +89 -89
  548. package/lib/engine-components/timeline/TimelineModels.js +22 -22
  549. package/lib/engine-components/timeline/TimelineTracks.d.ts +110 -110
  550. package/lib/engine-components/timeline/TimelineTracks.js +879 -879
  551. package/lib/engine-components/timeline/index.d.ts +4 -4
  552. package/lib/engine-components/timeline/index.js +3 -3
  553. package/lib/engine-components/ui/BaseUIComponent.d.ts +49 -49
  554. package/lib/engine-components/ui/BaseUIComponent.js +170 -170
  555. package/lib/engine-components/ui/Button.d.ts +64 -64
  556. package/lib/engine-components/ui/Button.js +315 -315
  557. package/lib/engine-components/ui/Canvas.d.ts +74 -74
  558. package/lib/engine-components/ui/Canvas.js +407 -407
  559. package/lib/engine-components/ui/CanvasGroup.d.ts +19 -19
  560. package/lib/engine-components/ui/CanvasGroup.js +58 -58
  561. package/lib/engine-components/ui/EventSystem.d.ts +125 -125
  562. package/lib/engine-components/ui/EventSystem.js +764 -764
  563. package/lib/engine-components/ui/Graphic.d.ts +55 -55
  564. package/lib/engine-components/ui/Graphic.js +254 -254
  565. package/lib/engine-components/ui/Image.d.ts +35 -35
  566. package/lib/engine-components/ui/Image.js +116 -116
  567. package/lib/engine-components/ui/InputField.d.ts +42 -42
  568. package/lib/engine-components/ui/InputField.js +268 -268
  569. package/lib/engine-components/ui/Interfaces.d.ts +38 -38
  570. package/lib/engine-components/ui/Interfaces.js +12 -12
  571. package/lib/engine-components/ui/Layout.d.ts +84 -84
  572. package/lib/engine-components/ui/Layout.js +330 -330
  573. package/lib/engine-components/ui/Outline.d.ts +7 -7
  574. package/lib/engine-components/ui/Outline.js +20 -20
  575. package/lib/engine-components/ui/PointerEvents.d.ts +115 -115
  576. package/lib/engine-components/ui/PointerEvents.js +145 -145
  577. package/lib/engine-components/ui/RaycastUtils.d.ts +11 -11
  578. package/lib/engine-components/ui/RaycastUtils.js +67 -67
  579. package/lib/engine-components/ui/Raycaster.d.ts +30 -30
  580. package/lib/engine-components/ui/Raycaster.js +95 -95
  581. package/lib/engine-components/ui/RectTransform.d.ts +61 -61
  582. package/lib/engine-components/ui/RectTransform.js +353 -353
  583. package/lib/engine-components/ui/SpatialHtml.d.ts +8 -8
  584. package/lib/engine-components/ui/SpatialHtml.js +79 -79
  585. package/lib/engine-components/ui/Text.d.ts +78 -78
  586. package/lib/engine-components/ui/Text.js +539 -539
  587. package/lib/engine-components/ui/Utils.d.ts +24 -24
  588. package/lib/engine-components/ui/Utils.js +90 -90
  589. package/lib/engine-components/ui/index.d.ts +1 -1
  590. package/lib/engine-components/ui/index.js +1 -1
  591. package/lib/engine-components/utils/EnvironmentScene.d.ts +5 -5
  592. package/lib/engine-components/utils/EnvironmentScene.js +205 -205
  593. package/lib/engine-components/utils/LookAt.d.ts +31 -31
  594. package/lib/engine-components/utils/LookAt.js +82 -82
  595. package/lib/engine-components/utils/OpenURL.d.ts +42 -42
  596. package/lib/engine-components/utils/OpenURL.js +119 -119
  597. package/lib/engine-components/webxr/Avatar.d.ts +25 -25
  598. package/lib/engine-components/webxr/Avatar.js +255 -255
  599. package/lib/engine-components/webxr/TeleportTarget.d.ts +7 -7
  600. package/lib/engine-components/webxr/TeleportTarget.js +7 -7
  601. package/lib/engine-components/webxr/WebARCameraBackground.d.ts +30 -30
  602. package/lib/engine-components/webxr/WebARCameraBackground.js +155 -155
  603. package/lib/engine-components/webxr/WebARSessionRoot.d.ts +98 -98
  604. package/lib/engine-components/webxr/WebARSessionRoot.js +770 -770
  605. package/lib/engine-components/webxr/WebXR.d.ts +232 -232
  606. package/lib/engine-components/webxr/WebXR.js +561 -561
  607. package/lib/engine-components/webxr/WebXRAvatar.d.ts +27 -27
  608. package/lib/engine-components/webxr/WebXRAvatar.js +44 -44
  609. package/lib/engine-components/webxr/WebXRImageTracking.d.ts +86 -86
  610. package/lib/engine-components/webxr/WebXRImageTracking.js +470 -470
  611. package/lib/engine-components/webxr/WebXRPlaneTracking.d.ts +92 -92
  612. package/lib/engine-components/webxr/WebXRPlaneTracking.js +500 -500
  613. package/lib/engine-components/webxr/WebXRRig.d.ts +32 -32
  614. package/lib/engine-components/webxr/WebXRRig.js +72 -72
  615. package/lib/engine-components/webxr/XRFlag.d.ts +38 -38
  616. package/lib/engine-components/webxr/XRFlag.js +139 -139
  617. package/lib/engine-components/webxr/controllers/XRControllerFollow.d.ts +47 -47
  618. package/lib/engine-components/webxr/controllers/XRControllerFollow.js +120 -120
  619. package/lib/engine-components/webxr/controllers/XRControllerModel.d.ts +43 -43
  620. package/lib/engine-components/webxr/controllers/XRControllerModel.js +351 -351
  621. package/lib/engine-components/webxr/controllers/XRControllerMovement.d.ts +78 -78
  622. package/lib/engine-components/webxr/controllers/XRControllerMovement.js +506 -506
  623. package/lib/engine-components/webxr/index.d.ts +3 -3
  624. package/lib/engine-components/webxr/index.js +3 -3
  625. package/lib/engine-components/webxr/types.d.ts +3 -3
  626. package/lib/engine-components/webxr/types.js +1 -1
  627. package/lib/engine-components-experimental/Presentation.d.ts +6 -6
  628. package/lib/engine-components-experimental/Presentation.js +9 -9
  629. package/lib/engine-components-experimental/api.d.ts +4 -4
  630. package/lib/engine-components-experimental/api.js +4 -4
  631. package/lib/engine-components-experimental/networking/PlayerSync.d.ts +156 -156
  632. package/lib/engine-components-experimental/networking/PlayerSync.js +377 -377
  633. package/lib/engine-schemes/api.d.ts +12 -12
  634. package/lib/engine-schemes/api.js +12 -12
  635. package/lib/engine-schemes/schemes.d.ts +7 -7
  636. package/lib/engine-schemes/schemes.js +19 -19
  637. package/lib/engine-schemes/synced-camera-model.d.ts +25 -25
  638. package/lib/engine-schemes/synced-camera-model.js +67 -67
  639. package/lib/engine-schemes/synced-transform-model.d.ts +31 -31
  640. package/lib/engine-schemes/synced-transform-model.js +66 -66
  641. package/lib/engine-schemes/transform.d.ts +12 -12
  642. package/lib/engine-schemes/transform.js +39 -39
  643. package/lib/engine-schemes/vec2.d.ts +10 -10
  644. package/lib/engine-schemes/vec2.js +25 -25
  645. package/lib/engine-schemes/vec3.d.ts +11 -11
  646. package/lib/engine-schemes/vec3.js +29 -29
  647. package/lib/engine-schemes/vec4.d.ts +12 -12
  648. package/lib/engine-schemes/vec4.js +33 -33
  649. package/lib/engine-schemes/vr-user-state-buffer.d.ts +37 -37
  650. package/lib/engine-schemes/vr-user-state-buffer.js +110 -110
  651. package/lib/include/three/EXT_mesh_gpu_instancing_exporter.d.ts +6 -6
  652. package/lib/include/three/EXT_mesh_gpu_instancing_exporter.js +45 -45
  653. package/lib/needle-engine.d.ts +7 -7
  654. package/lib/needle-engine.js +64 -64
  655. package/package.json +2 -2
  656. package/plugins/common/buildinfo.js +64 -64
  657. package/plugins/common/cloud.js +1 -1
  658. package/plugins/common/config.cjs +31 -31
  659. package/plugins/common/config.js +35 -35
  660. package/plugins/common/files.js +31 -31
  661. package/plugins/common/generator.js +10 -10
  662. package/plugins/common/license.js +355 -341
  663. package/plugins/common/npm.js +15 -15
  664. package/plugins/common/timers.js +7 -7
  665. package/plugins/common/version.js +37 -37
  666. package/plugins/gltf-packer.mjs +1 -1
  667. package/plugins/next/alias.cjs +39 -39
  668. package/plugins/next/license.cjs +18 -18
  669. package/plugins/next/meshbvhworker.cjs +18 -18
  670. package/plugins/next/next.js +128 -128
  671. package/plugins/types/index.d.ts +2 -2
  672. package/plugins/types/license.d.ts +24 -24
  673. package/plugins/types/needleConfig.d.ts +27 -27
  674. package/plugins/types/userconfig.d.ts +108 -108
  675. package/plugins/types/webmanifest.d.ts +32 -32
  676. package/plugins/vite/alias.js +174 -174
  677. package/plugins/vite/asap.js +245 -245
  678. package/plugins/vite/build-pipeline.js +355 -355
  679. package/plugins/vite/build.js +19 -19
  680. package/plugins/vite/buildinfo.js +41 -41
  681. package/plugins/vite/config.js +106 -106
  682. package/plugins/vite/copyfiles.js +138 -138
  683. package/plugins/vite/defines.js +66 -66
  684. package/plugins/vite/dependencies.js +223 -223
  685. package/plugins/vite/dependency-watcher.js +231 -231
  686. package/plugins/vite/drop-client.js +76 -76
  687. package/plugins/vite/drop.js +87 -87
  688. package/plugins/vite/editor-connection.js +124 -124
  689. package/plugins/vite/facebook-instant-games.js +99 -99
  690. package/plugins/vite/gzip.js +5 -5
  691. package/plugins/vite/imports-logger.js +143 -143
  692. package/plugins/vite/index.js +139 -139
  693. package/plugins/vite/license.js +55 -55
  694. package/plugins/vite/meta.js +163 -163
  695. package/plugins/vite/npm.js +7 -7
  696. package/plugins/vite/peer.js +29 -29
  697. package/plugins/vite/poster-client.js +73 -73
  698. package/plugins/vite/poster.js +79 -79
  699. package/plugins/vite/pwa.js +604 -604
  700. package/plugins/vite/reload-client.js +15 -15
  701. package/plugins/vite/reload.js +363 -363
  702. package/plugins/vite/server.js +66 -66
  703. package/plugins/vite/transform-codegen.js +55 -55
  704. package/plugins/vite/transform.js +31 -31
  705. package/plugins/vite/vite-4.4-hack.js +31 -31
  706. package/src/asap/needle-asap.ts +111 -111
  707. package/src/asap/sessiongranted.ts +75 -75
  708. package/src/asap/utils.ts +4 -4
  709. package/src/engine/analytics/index.ts +10 -10
  710. package/src/engine/analytics/lcp.ts +35 -35
  711. package/src/engine/api.ts +81 -81
  712. package/src/engine/assets/index.ts +59 -59
  713. package/src/engine/assets/static.js +5 -5
  714. package/src/engine/codegen/register_types.ts +300 -300
  715. package/src/engine/debug/debug.ts +51 -51
  716. package/src/engine/debug/debug_console.ts +333 -333
  717. package/src/engine/debug/debug_overlay.ts +332 -332
  718. package/src/engine/debug/debug_spatial_console.ts +429 -429
  719. package/src/engine/debug/index.ts +1 -1
  720. package/src/engine/engine_addressables.ts +679 -679
  721. package/src/engine/engine_animation.ts +145 -145
  722. package/src/engine/engine_application.ts +113 -113
  723. package/src/engine/engine_assetdatabase.ts +387 -387
  724. package/src/engine/engine_audio.ts +24 -24
  725. package/src/engine/engine_camera.ts +39 -39
  726. package/src/engine/engine_components.ts +374 -374
  727. package/src/engine/engine_components_internal.ts +40 -40
  728. package/src/engine/engine_constants.ts +52 -52
  729. package/src/engine/engine_context.ts +1686 -1686
  730. package/src/engine/engine_context_registry.ts +129 -129
  731. package/src/engine/engine_coroutine.ts +54 -54
  732. package/src/engine/engine_create_objects.ts +398 -398
  733. package/src/engine/engine_default_parameters.ts +3 -3
  734. package/src/engine/engine_editor-sync.ts +28 -28
  735. package/src/engine/engine_element.ts +872 -869
  736. package/src/engine/engine_element_attributes.ts +85 -85
  737. package/src/engine/engine_element_extras.ts +16 -16
  738. package/src/engine/engine_element_loading.ts +381 -381
  739. package/src/engine/engine_element_overlay.ts +186 -186
  740. package/src/engine/engine_fileloader.js +9 -9
  741. package/src/engine/engine_gameobject.ts +684 -684
  742. package/src/engine/engine_generic_utils.js +13 -13
  743. package/src/engine/engine_gizmos.ts +577 -577
  744. package/src/engine/engine_gltf.ts +29 -29
  745. package/src/engine/engine_gltf_builtin_components.ts +403 -403
  746. package/src/engine/engine_hot_reload.ts +198 -198
  747. package/src/engine/engine_input.ts +1460 -1460
  748. package/src/engine/engine_input_utils.ts +23 -23
  749. package/src/engine/engine_instancing.ts +45 -45
  750. package/src/engine/engine_license.ts +378 -329
  751. package/src/engine/engine_lifecycle_api.ts +106 -106
  752. package/src/engine/engine_lifecycle_functions_internal.ts +193 -193
  753. package/src/engine/engine_lightdata.ts +117 -117
  754. package/src/engine/engine_loaders.ts +82 -82
  755. package/src/engine/engine_lods.ts +168 -168
  756. package/src/engine/engine_mainloop_utils.ts +472 -472
  757. package/src/engine/engine_math.ts +282 -282
  758. package/src/engine/engine_modules.ts +83 -83
  759. package/src/engine/engine_networking.ts +841 -841
  760. package/src/engine/engine_networking_auto.ts +352 -352
  761. package/src/engine/engine_networking_blob.ts +254 -254
  762. package/src/engine/engine_networking_files.ts +217 -217
  763. package/src/engine/engine_networking_files_default_components.ts +58 -58
  764. package/src/engine/engine_networking_instantiate.ts +419 -419
  765. package/src/engine/engine_networking_peer.ts +159 -159
  766. package/src/engine/engine_networking_streams.ts +713 -713
  767. package/src/engine/engine_networking_types.ts +24 -24
  768. package/src/engine/engine_networking_utils.ts +23 -23
  769. package/src/engine/engine_networking_websocket.ts +2 -2
  770. package/src/engine/engine_patcher.ts +199 -199
  771. package/src/engine/engine_physics.ts +783 -783
  772. package/src/engine/engine_physics.types.ts +46 -46
  773. package/src/engine/engine_physics_rapier.ts +1579 -1579
  774. package/src/engine/engine_playerview.ts +80 -80
  775. package/src/engine/engine_scenelighting.ts +294 -294
  776. package/src/engine/engine_scenetools.ts +365 -365
  777. package/src/engine/engine_serialization.ts +2 -2
  778. package/src/engine/engine_serialization_builtin_serializer.ts +473 -473
  779. package/src/engine/engine_serialization_core.ts +705 -705
  780. package/src/engine/engine_serialization_decorator.ts +80 -80
  781. package/src/engine/engine_setup.ts +1 -1
  782. package/src/engine/engine_shaders.ts +267 -267
  783. package/src/engine/engine_shims.ts +32 -32
  784. package/src/engine/engine_test_utils.ts +109 -109
  785. package/src/engine/engine_texture.ts +82 -82
  786. package/src/engine/engine_three_utils.ts +849 -849
  787. package/src/engine/engine_time.ts +94 -94
  788. package/src/engine/engine_time_utils.ts +237 -237
  789. package/src/engine/engine_tonemapping.ts +210 -210
  790. package/src/engine/engine_types.ts +714 -714
  791. package/src/engine/engine_typestore.ts +63 -63
  792. package/src/engine/engine_util_decorator.ts +136 -136
  793. package/src/engine/engine_utils.ts +972 -972
  794. package/src/engine/engine_utils_format.ts +212 -212
  795. package/src/engine/engine_utils_screenshot.ts +698 -698
  796. package/src/engine/engine_utils_screenshot.xr.ts +103 -103
  797. package/src/engine/export/gltf/Writers.ts +34 -34
  798. package/src/engine/export/gltf/index.ts +158 -158
  799. package/src/engine/export/index.ts +2 -2
  800. package/src/engine/export/state.ts +19 -19
  801. package/src/engine/export/utils.ts +9 -9
  802. package/src/engine/extensions/EXT_texture_exr.ts +50 -50
  803. package/src/engine/extensions/NEEDLE_animator_controller_model.ts +195 -195
  804. package/src/engine/extensions/NEEDLE_components.ts +268 -268
  805. package/src/engine/extensions/NEEDLE_gameobject_data.ts +81 -81
  806. package/src/engine/extensions/NEEDLE_lighting_settings.ts +185 -185
  807. package/src/engine/extensions/NEEDLE_lightmaps.ts +119 -119
  808. package/src/engine/extensions/NEEDLE_persistent_assets.ts +76 -76
  809. package/src/engine/extensions/NEEDLE_render_objects.ts +209 -209
  810. package/src/engine/extensions/NEEDLE_techniques_webgl.ts +640 -640
  811. package/src/engine/extensions/extension_resolver.ts +4 -4
  812. package/src/engine/extensions/extension_utils.ts +166 -166
  813. package/src/engine/extensions/extensions.ts +135 -135
  814. package/src/engine/extensions/index.ts +5 -5
  815. package/src/engine/extensions/usage_tracker.ts +100 -100
  816. package/src/engine/js-extensions/Camera.ts +37 -37
  817. package/src/engine/js-extensions/ExtensionUtils.ts +85 -85
  818. package/src/engine/js-extensions/Layers.ts +23 -23
  819. package/src/engine/js-extensions/Object3D.ts +296 -296
  820. package/src/engine/js-extensions/RGBAColor.ts +125 -125
  821. package/src/engine/js-extensions/Vector.ts +18 -18
  822. package/src/engine/js-extensions/index.ts +4 -4
  823. package/src/engine/physics/workers/mesh-bvh/GenerateMeshBVHWorker.js +122 -122
  824. package/src/engine/shaders/shaderData.ts +67 -67
  825. package/src/engine/tests/test_utils.ts +63 -63
  826. package/src/engine/webcomponents/WebXRButtons.ts +260 -260
  827. package/src/engine/webcomponents/api.ts +6 -6
  828. package/src/engine/webcomponents/buttons.ts +262 -262
  829. package/src/engine/webcomponents/fonts.ts +41 -41
  830. package/src/engine/webcomponents/icons.ts +57 -57
  831. package/src/engine/webcomponents/index.ts +1 -1
  832. package/src/engine/webcomponents/logo-element.ts +78 -78
  833. package/src/engine/webcomponents/needle menu/needle-menu-spatial.ts +573 -573
  834. package/src/engine/webcomponents/needle menu/needle-menu.ts +1118 -1107
  835. package/src/engine/webcomponents/needle-button.ts +181 -181
  836. package/src/engine/xr/NeedleXRController.ts +1125 -1125
  837. package/src/engine/xr/NeedleXRSession.ts +1585 -1585
  838. package/src/engine/xr/NeedleXRSync.ts +220 -220
  839. package/src/engine/xr/SceneTransition.ts +78 -78
  840. package/src/engine/xr/TempXRContext.ts +216 -216
  841. package/src/engine/xr/XRRig.ts +9 -9
  842. package/src/engine/xr/api.ts +5 -5
  843. package/src/engine/xr/events.ts +102 -102
  844. package/src/engine/xr/internal.ts +34 -34
  845. package/src/engine/xr/usdz.ts +30 -30
  846. package/src/engine/xr/utils.ts +39 -39
  847. package/src/engine-components/AlignmentConstraint.ts +36 -36
  848. package/src/engine-components/Animation.ts +557 -557
  849. package/src/engine-components/AnimationCurve.ts +150 -150
  850. package/src/engine-components/AnimationUtils.ts +28 -28
  851. package/src/engine-components/AnimationUtilsAutoplay.ts +43 -43
  852. package/src/engine-components/Animator.ts +397 -397
  853. package/src/engine-components/AnimatorController.ts +1293 -1293
  854. package/src/engine-components/AudioListener.ts +92 -92
  855. package/src/engine-components/AudioSource.ts +639 -639
  856. package/src/engine-components/AvatarLoader.ts +263 -263
  857. package/src/engine-components/AxesHelper.ts +59 -59
  858. package/src/engine-components/BasicIKConstraint.ts +54 -54
  859. package/src/engine-components/BoxCollider.ts +1 -1
  860. package/src/engine-components/BoxHelperComponent.ts +114 -114
  861. package/src/engine-components/Camera.ts +719 -719
  862. package/src/engine-components/CameraUtils.ts +136 -136
  863. package/src/engine-components/CharacterController.ts +253 -253
  864. package/src/engine-components/Collider.ts +374 -374
  865. package/src/engine-components/Component.ts +1294 -1294
  866. package/src/engine-components/ContactShadows.ts +482 -482
  867. package/src/engine-components/DeleteBox.ts +62 -62
  868. package/src/engine-components/DeviceFlag.ts +46 -46
  869. package/src/engine-components/DragControls.ts +1623 -1623
  870. package/src/engine-components/DropListener.ts +698 -698
  871. package/src/engine-components/Duplicatable.ts +198 -198
  872. package/src/engine-components/EventList.ts +266 -266
  873. package/src/engine-components/EventTrigger.ts +74 -74
  874. package/src/engine-components/EventType.ts +22 -22
  875. package/src/engine-components/Fog.ts +60 -60
  876. package/src/engine-components/Gizmos.ts +56 -56
  877. package/src/engine-components/GridHelper.ts +48 -48
  878. package/src/engine-components/GroundProjection.ts +356 -356
  879. package/src/engine-components/Interactable.ts +14 -14
  880. package/src/engine-components/Joints.ts +52 -52
  881. package/src/engine-components/LODGroup.ts +153 -153
  882. package/src/engine-components/Light.ts +558 -558
  883. package/src/engine-components/LookAtConstraint.ts +25 -25
  884. package/src/engine-components/NeedleMenu.ts +84 -84
  885. package/src/engine-components/NestedGltf.ts +86 -86
  886. package/src/engine-components/Networking.ts +114 -114
  887. package/src/engine-components/OffsetConstraint.ts +60 -60
  888. package/src/engine-components/OrbitControls.ts +1068 -1068
  889. package/src/engine-components/PlayerColor.ts +103 -103
  890. package/src/engine-components/ReflectionProbe.ts +216 -216
  891. package/src/engine-components/Renderer.ts +900 -900
  892. package/src/engine-components/RendererInstancing.ts +855 -855
  893. package/src/engine-components/RendererLightmap.ts +198 -198
  894. package/src/engine-components/RigidBody.ts +526 -526
  895. package/src/engine-components/SceneSwitcher.ts +1013 -1013
  896. package/src/engine-components/ScreenCapture.ts +592 -592
  897. package/src/engine-components/ShadowCatcher.ts +172 -172
  898. package/src/engine-components/Skybox.ts +455 -455
  899. package/src/engine-components/SmoothFollow.ts +76 -76
  900. package/src/engine-components/SpatialTrigger.ts +229 -229
  901. package/src/engine-components/SpectatorCamera.ts +787 -787
  902. package/src/engine-components/SphereCollider.ts +1 -1
  903. package/src/engine-components/SpriteRenderer.ts +468 -468
  904. package/src/engine-components/SyncedCamera.ts +220 -220
  905. package/src/engine-components/SyncedRoom.ts +380 -380
  906. package/src/engine-components/SyncedTransform.ts +383 -383
  907. package/src/engine-components/TestRunner.ts +118 -118
  908. package/src/engine-components/TransformGizmo.ts +219 -219
  909. package/src/engine-components/VideoPlayer.ts +1025 -1025
  910. package/src/engine-components/Voip.ts +363 -363
  911. package/src/engine-components/api.ts +60 -60
  912. package/src/engine-components/avatar/AvatarBlink_Simple.ts +69 -69
  913. package/src/engine-components/avatar/AvatarEyeLook_Rotation.ts +63 -63
  914. package/src/engine-components/avatar/Avatar_Brain_LookAt.ts +139 -139
  915. package/src/engine-components/avatar/Avatar_MouthShapes.ts +83 -83
  916. package/src/engine-components/avatar/Avatar_MustacheShake.ts +31 -31
  917. package/src/engine-components/codegen/components.ts +217 -217
  918. package/src/engine-components/debug/LogStats.ts +21 -21
  919. package/src/engine-components/export/gltf/GltfExport.ts +265 -265
  920. package/src/engine-components/export/usdz/Extension.ts +24 -24
  921. package/src/engine-components/export/usdz/ThreeUSDZExporter.ts +2413 -2413
  922. package/src/engine-components/export/usdz/USDZExporter.ts +705 -705
  923. package/src/engine-components/export/usdz/extensions/Animation.ts +1204 -1204
  924. package/src/engine-components/export/usdz/extensions/DocumentExtension.ts +9 -9
  925. package/src/engine-components/export/usdz/extensions/USDZText.ts +240 -240
  926. package/src/engine-components/export/usdz/extensions/USDZUI.ts +189 -189
  927. package/src/engine-components/export/usdz/extensions/behavior/Actions.ts +99 -99
  928. package/src/engine-components/export/usdz/extensions/behavior/AudioExtension.ts +102 -102
  929. package/src/engine-components/export/usdz/extensions/behavior/Behaviour.ts +320 -320
  930. package/src/engine-components/export/usdz/extensions/behavior/BehaviourComponents.ts +1225 -1225
  931. package/src/engine-components/export/usdz/extensions/behavior/BehavioursBuilder.ts +646 -646
  932. package/src/engine-components/export/usdz/extensions/behavior/PhysicsExtension.ts +132 -132
  933. package/src/engine-components/export/usdz/index.ts +2 -2
  934. package/src/engine-components/export/usdz/utils/animationutils.ts +191 -191
  935. package/src/engine-components/export/usdz/utils/quicklook.ts +50 -50
  936. package/src/engine-components/particlesystem/ParticleSystem.ts +1287 -1287
  937. package/src/engine-components/particlesystem/ParticleSystemModules.ts +1765 -1765
  938. package/src/engine-components/particlesystem/ParticleSystemSubEmitter.ts +111 -111
  939. package/src/engine-components/particlesystem/api.ts +1 -1
  940. package/src/engine-components/postprocessing/Effects/Antialiasing.ts +55 -55
  941. package/src/engine-components/postprocessing/Effects/BloomEffect.ts +116 -116
  942. package/src/engine-components/postprocessing/Effects/ChromaticAberration.ts +37 -37
  943. package/src/engine-components/postprocessing/Effects/ColorAdjustments.ts +95 -95
  944. package/src/engine-components/postprocessing/Effects/DepthOfField.ts +103 -103
  945. package/src/engine-components/postprocessing/Effects/EffectWrapper.ts +25 -25
  946. package/src/engine-components/postprocessing/Effects/Pixelation.ts +32 -32
  947. package/src/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusion.ts +90 -90
  948. package/src/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.ts +191 -191
  949. package/src/engine-components/postprocessing/Effects/Sharpening.ts +138 -138
  950. package/src/engine-components/postprocessing/Effects/TiltShiftEffect.ts +61 -61
  951. package/src/engine-components/postprocessing/Effects/Tonemapping.ts +155 -155
  952. package/src/engine-components/postprocessing/Effects/Vignette.ts +59 -59
  953. package/src/engine-components/postprocessing/PostProcessingEffect.ts +172 -172
  954. package/src/engine-components/postprocessing/PostProcessingHandler.ts +398 -398
  955. package/src/engine-components/postprocessing/Volume.ts +410 -410
  956. package/src/engine-components/postprocessing/VolumeParameter.ts +158 -158
  957. package/src/engine-components/postprocessing/VolumeProfile.ts +61 -61
  958. package/src/engine-components/postprocessing/index.ts +5 -5
  959. package/src/engine-components/postprocessing/utils.ts +52 -52
  960. package/src/engine-components/timeline/PlayableDirector.ts +722 -722
  961. package/src/engine-components/timeline/SignalAsset.ts +144 -144
  962. package/src/engine-components/timeline/TimelineModels.ts +92 -92
  963. package/src/engine-components/timeline/TimelineTracks.ts +967 -967
  964. package/src/engine-components/timeline/index.ts +3 -3
  965. package/src/engine-components/ui/BaseUIComponent.ts +203 -203
  966. package/src/engine-components/ui/Button.ts +307 -307
  967. package/src/engine-components/ui/Canvas.ts +419 -419
  968. package/src/engine-components/ui/CanvasGroup.ts +54 -54
  969. package/src/engine-components/ui/EventSystem.ts +853 -853
  970. package/src/engine-components/ui/Graphic.ts +275 -275
  971. package/src/engine-components/ui/Image.ts +112 -112
  972. package/src/engine-components/ui/InputField.ts +321 -321
  973. package/src/engine-components/ui/Interfaces.ts +57 -57
  974. package/src/engine-components/ui/Layout.ts +334 -334
  975. package/src/engine-components/ui/Outline.ts +13 -13
  976. package/src/engine-components/ui/PointerEvents.ts +206 -206
  977. package/src/engine-components/ui/RaycastUtils.ts +69 -69
  978. package/src/engine-components/ui/Raycaster.ts +102 -102
  979. package/src/engine-components/ui/RectTransform.ts +372 -372
  980. package/src/engine-components/ui/SpatialHtml.ts +79 -79
  981. package/src/engine-components/ui/Text.ts +578 -578
  982. package/src/engine-components/ui/Utils.ts +112 -112
  983. package/src/engine-components/utils/EnvironmentScene.ts +245 -245
  984. package/src/engine-components/utils/LookAt.ts +88 -88
  985. package/src/engine-components/utils/OpenURL.ts +114 -114
  986. package/src/engine-components/webxr/Avatar.ts +265 -265
  987. package/src/engine-components/webxr/TeleportTarget.ts +9 -9
  988. package/src/engine-components/webxr/WebARCameraBackground.ts +175 -175
  989. package/src/engine-components/webxr/WebARSessionRoot.ts +880 -880
  990. package/src/engine-components/webxr/WebXR.ts +585 -585
  991. package/src/engine-components/webxr/WebXRAvatar.ts +66 -66
  992. package/src/engine-components/webxr/WebXRImageTracking.ts +518 -518
  993. package/src/engine-components/webxr/WebXRPlaneTracking.ts +570 -570
  994. package/src/engine-components/webxr/WebXRRig.ts +77 -77
  995. package/src/engine-components/webxr/XRFlag.ts +147 -147
  996. package/src/engine-components/webxr/controllers/XRControllerFollow.ts +118 -118
  997. package/src/engine-components/webxr/controllers/XRControllerModel.ts +374 -374
  998. package/src/engine-components/webxr/controllers/XRControllerMovement.ts +550 -550
  999. package/src/engine-components/webxr/index.ts +2 -2
  1000. package/src/engine-components/webxr/types.ts +3 -3
  1001. package/src/engine-components-experimental/Presentation.ts +12 -12
  1002. package/src/engine-components-experimental/api.ts +4 -4
  1003. package/src/engine-components-experimental/networking/PlayerSync.ts +401 -401
  1004. package/src/engine-schemes/COMPILE_SCHEMES.bat +3 -3
  1005. package/src/engine-schemes/COMPILE_TS.bat +11 -11
  1006. package/src/engine-schemes/README.md +1 -1
  1007. package/src/engine-schemes/api.ts +12 -12
  1008. package/src/engine-schemes/dist/api.js +17 -0
  1009. package/src/engine-schemes/dist/api.js.meta +7 -0
  1010. package/src/engine-schemes/dist/schemes.js +25 -0
  1011. package/src/engine-schemes/dist/schemes.js.meta +7 -0
  1012. package/src/engine-schemes/dist/synced-camera-model.js +74 -0
  1013. package/src/engine-schemes/dist/synced-camera-model.js.meta +7 -0
  1014. package/src/engine-schemes/dist/synced-transform-model.js +73 -0
  1015. package/src/engine-schemes/dist/synced-transform-model.js.meta +7 -0
  1016. package/src/engine-schemes/dist/transform.js +46 -0
  1017. package/src/engine-schemes/dist/transform.js.meta +7 -0
  1018. package/src/engine-schemes/dist/vec2.js +32 -0
  1019. package/src/engine-schemes/dist/vec2.js.meta +7 -0
  1020. package/src/engine-schemes/dist/vec3.js +36 -0
  1021. package/src/engine-schemes/dist/vec3.js.meta +7 -0
  1022. package/src/engine-schemes/dist/vec4.js +40 -0
  1023. package/src/engine-schemes/dist/vec4.js.meta +7 -0
  1024. package/src/engine-schemes/dist/vr-user-state-buffer.js +110 -0
  1025. package/src/engine-schemes/dist/vr-user-state-buffer.js.meta +7 -0
  1026. package/src/engine-schemes/schemes.ts +28 -28
  1027. package/src/engine-schemes/synced-camera-model.ts +92 -92
  1028. package/src/engine-schemes/synced-transform-model.ts +90 -90
  1029. package/src/engine-schemes/syncedCamera.fbs +10 -10
  1030. package/src/engine-schemes/transform.ts +50 -50
  1031. package/src/engine-schemes/transforms.fbs +25 -25
  1032. package/src/engine-schemes/vec.fbs +19 -19
  1033. package/src/engine-schemes/vec2.ts +33 -33
  1034. package/src/engine-schemes/vec3.ts +38 -38
  1035. package/src/engine-schemes/vec4.ts +43 -43
  1036. package/src/engine-schemes/vr-user-state-buffer.ts +145 -145
  1037. package/src/engine-schemes/vrUserStateBuffer.fbs +17 -17
  1038. package/src/include/draco/draco_decoder.js +34 -34
  1039. package/src/include/ktx2/basis_transcoder.js +21 -21
  1040. package/src/include/needle/arial-msdf.json +1471 -1471
  1041. package/src/include/three/DragControls.js +231 -231
  1042. package/src/include/three/EXT_mesh_gpu_instancing_exporter.js +66 -66
  1043. package/src/needle-engine.ts +70 -70
@@ -1,1537 +1,1537 @@
1
- import 'three/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodes.js';
2
- import { Color, DepthTexture, NearestFilter, NoToneMapping, Object3D, PCFSoftShadowMap, PerspectiveCamera, RGBAFormat, Scene, SRGBColorSpace, Texture, WebGLRenderer, WebGLRenderTarget } from 'three';
3
- /** @ts-ignore (not yet in types?) */
4
- import { BasicNodeLibrary } from "three";
5
- import * as Stats from 'three/examples/jsm/libs/stats.module.js';
6
- import { nodeFrame } from "three/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js";
7
- import { isDevEnvironment, LogType, showBalloonError, showBalloonMessage } from './debug/index.js';
8
- import { Addressables } from './engine_addressables.js';
9
- import { AnimationsRegistry } from './engine_animation.js';
10
- import { Application } from './engine_application.js';
11
- import { AssetDatabase } from './engine_assetdatabase.js';
12
- import { VERSION } from './engine_constants.js';
13
- import { ContextEvent, ContextRegistry } from './engine_context_registry.js';
14
- import { WaitForPromise } from './engine_coroutine.js';
15
- import { ObjectUtils } from "./engine_create_objects.js";
16
- import { destroy, foreachComponent } from './engine_gameobject.js';
17
- import { getLoader } from './engine_gltf.js';
18
- import { Input } from './engine_input.js';
19
- import { invokeLifecycleFunctions } from './engine_lifecycle_functions_internal.js';
20
- import { LightDataRegistry } from './engine_lightdata.js';
21
- import { LODsManager } from "./engine_lods.js";
22
- import * as looputils from './engine_mainloop_utils.js';
23
- import { NetworkConnection } from './engine_networking.js';
24
- import { Physics } from './engine_physics.js';
25
- import { PlayerViewManager } from './engine_playerview.js';
26
- import { RendererData as SceneLighting } from './engine_scenelighting.js';
27
- import { logHierarchy } from './engine_three_utils.js';
28
- import { Time } from './engine_time.js';
29
- import { patchTonemapping } from './engine_tonemapping.js';
30
- import { deepClone, delay, DeviceUtilities, getParam } from './engine_utils.js';
31
- import { NeedleMenu } from './webcomponents/needle menu/needle-menu.js';
32
- const debug = getParam("debugcontext");
33
- const stats = getParam("stats");
34
- const debugActive = getParam("debugactive");
35
- const debugframerate = getParam("debugframerate");
36
- const debugCoroutine = getParam("debugcoroutine");
37
- // this is where functions that setup unity scenes will be pushed into
38
- // those will be accessed from our custom html element to load them into their context
39
- export const build_scene_functions = {};
40
- export class ContextArgs {
41
- name;
42
- /** for debugging only */
43
- alias;
44
- /** the hash is used as a seed when initially loading the scene files */
45
- hash;
46
- /** when true the context will not check if it's visible in the viewport and always update and render */
47
- runInBackground;
48
- /** the DOM element the context belongs to or is inside of (this does not have to be the canvas. use renderer.domElement if you want to access the dom canvas) */
49
- domElement;
50
- /** externally owned renderer */
51
- renderer;
52
- /** externally owned camera */
53
- camera;
54
- /** externally owned scene */
55
- scene;
56
- }
57
- export var FrameEvent;
58
- (function (FrameEvent) {
59
- FrameEvent[FrameEvent["Start"] = -1] = "Start";
60
- FrameEvent[FrameEvent["EarlyUpdate"] = 0] = "EarlyUpdate";
61
- FrameEvent[FrameEvent["Update"] = 1] = "Update";
62
- FrameEvent[FrameEvent["LateUpdate"] = 2] = "LateUpdate";
63
- FrameEvent[FrameEvent["OnBeforeRender"] = 3] = "OnBeforeRender";
64
- FrameEvent[FrameEvent["OnAfterRender"] = 4] = "OnAfterRender";
65
- FrameEvent[FrameEvent["PrePhysicsStep"] = 9] = "PrePhysicsStep";
66
- FrameEvent[FrameEvent["PostPhysicsStep"] = 10] = "PostPhysicsStep";
67
- FrameEvent[FrameEvent["Undefined"] = -1] = "Undefined";
68
- })(FrameEvent || (FrameEvent = {}));
69
- export function registerComponent(script, context) {
70
- if (!script)
71
- return;
72
- if (!script.isComponent) {
73
- if (isDevEnvironment() || debug)
74
- console.error("Registered script is not a Needle Engine component. \nThe script will be ignored. Please make sure your component extends \"Behaviour\" imported from \"@needle-tools/engine\"\n", script);
75
- return;
76
- }
77
- if (!context) {
78
- context = Context.Current;
79
- if (debug)
80
- console.warn("> Registering component without context");
81
- }
82
- const new_scripts = context?.new_scripts;
83
- if (!new_scripts.includes(script)) {
84
- new_scripts.push(script);
85
- }
86
- }
87
- /**
88
- * The context is the main object that holds all the data and state of the Needle Engine.
89
- * It can be used to access the scene, renderer, camera, input, physics, networking, and more.
90
- * @example
91
- * ```typescript
92
- * import { Behaviour } from "@needle-tools/engine";
93
- * import { Mesh, BoxGeometry, MeshBasicMaterial } from "three";
94
- * export class MyScript extends Behaviour {
95
- * start() {
96
- * console.log("Hello from MyScript");
97
- * this.context.scene.add(new Mesh(new BoxGeometry(), new MeshBasicMaterial()));
98
- * }
99
- * }
100
- * ```
101
- */
102
- export class Context {
103
- static _defaultTargetFramerate = { value: 90, toString() { return this.value; } };
104
- /** When a new context is created this is the framerate that will be used by default */
105
- static get DefaultTargetFrameRate() {
106
- return Context._defaultTargetFramerate.value;
107
- }
108
- /** When a new context is created this is the framerate that will be used by default */
109
- static set DefaultTargetFrameRate(val) {
110
- Context._defaultTargetFramerate.value = val;
111
- }
112
- static _defaultWebglRendererParameters = {
113
- antialias: true,
114
- alpha: false,
115
- // Note: this is due to a bug on OSX devices. See NE-5370
116
- powerPreference: (DeviceUtilities.isiOS() || DeviceUtilities.isMacOS()) ? "default" : "high-performance",
117
- stencil: true,
118
- // logarithmicDepthBuffer: true,
119
- // reverseDepthBuffer: true, // https://github.com/mrdoob/three.js/issues/29770
120
- };
121
- /** The default parameters that will be used when creating a new WebGLRenderer.
122
- * Modify in global context to change the default parameters for all new contexts.
123
- * @example
124
- * ```typescript
125
- * import { Context } from "@needle-tools/engine";
126
- * Context.DefaultWebGLRendererParameters.antialias = false;
127
- * ```
128
- */
129
- static get DefaultWebGLRendererParameters() {
130
- return Context._defaultWebglRendererParameters;
131
- }
132
- /** The needle engine version */
133
- get version() {
134
- return VERSION;
135
- }
136
- /** The currently active context. Only set during the update loops */
137
- static get Current() {
138
- return ContextRegistry.Current;
139
- }
140
- /** @internal this property should not be set by user code */
141
- static set Current(context) {
142
- ContextRegistry.Current = context;
143
- }
144
- static get All() {
145
- return ContextRegistry.All;
146
- }
147
- /** The name of the context */
148
- name;
149
- /** An alias for the context */
150
- alias;
151
- /** When the renderer or camera are managed by an external process (e.g. when running in r3f context).
152
- * When this is false you are responsible to call update(timestamp, xframe.
153
- * It is also currently assumed that rendering is handled performed by an external process
154
- * */
155
- isManagedExternally = false;
156
- /** set to true to pause the update loop. You can receive an event for it in your components.
157
- * Note that script updates will not be called when paused */
158
- isPaused = false;
159
- /** When enabled the application will run while not visible on the page */
160
- runInBackground = false;
161
- /**
162
- * Set to the target framerate you want your application to run in (you can use ?stats to check the fps)
163
- * Set to undefined if you want to run at the maximum framerate
164
- */
165
- targetFrameRate;
166
- /** Use a higher number for more accurate physics simulation.
167
- * When undefined physics steps will be 1 for mobile devices and 5 for desktop devices
168
- * Set to 0 to disable physics updates
169
- * TODO: changing physics steps is currently not supported because then forces that we get from the character controller and rigidbody et al are not correct anymore - this needs to be properly tested before making this configureable
170
- */
171
- physicsSteps = 1;
172
- /** used to append to loaded assets */
173
- hash;
174
- /** The `<needle-engine>` web component */
175
- domElement;
176
- appendHTMLElement(element) {
177
- if (this.domElement.shadowRoot)
178
- return this.domElement.shadowRoot.appendChild(element);
179
- else
180
- return this.domElement.appendChild(element);
181
- }
182
- get resolutionScaleFactor() { return this._resolutionScaleFactor; }
183
- /** use to scale the resolution up or down of the renderer. default is 1 */
184
- set resolutionScaleFactor(val) {
185
- if (val === this._resolutionScaleFactor)
186
- return;
187
- if (typeof val !== "number")
188
- return;
189
- if (val <= 0) {
190
- console.error("Invalid resolution scale factor", val);
191
- return;
192
- }
193
- this._resolutionScaleFactor = val;
194
- this.updateSize();
195
- }
196
- _resolutionScaleFactor = 1;
197
- // domElement.clientLeft etc doesnt return absolute position
198
- _boundingClientRectFrame = -1;
199
- _boundingClientRect = null;
200
- _domX;
201
- _domY;
202
- /** update bounding rects + domX, domY */
203
- calculateBoundingClientRect() {
204
- // workaround for mozilla webXR viewer
205
- if (this.xr) {
206
- this._domX = 0;
207
- this._domY = 0;
208
- return;
209
- }
210
- // TODO: cache this
211
- if (this._boundingClientRectFrame === this.time.frame)
212
- return;
213
- this._boundingClientRectFrame = this.time.frame;
214
- this._boundingClientRect = this.domElement.getBoundingClientRect();
215
- this._domX = this._boundingClientRect.x;
216
- this._domY = this._boundingClientRect.y;
217
- }
218
- /** The width of the `<needle-engine>` element on the website */
219
- get domWidth() {
220
- // for mozilla XR
221
- if (this.isInAR)
222
- return window.innerWidth;
223
- return this.domElement.clientWidth;
224
- }
225
- /** The height of the `<needle-engine>` element on the website */
226
- get domHeight() {
227
- // for mozilla XR
228
- if (this.isInAR)
229
- return window.innerHeight;
230
- return this.domElement.clientHeight;
231
- }
232
- /** the X position of the Needle Engine element on the website */
233
- get domX() {
234
- this.calculateBoundingClientRect();
235
- return this._domX;
236
- }
237
- /** the Y position of the Needlee Engine element on the website */
238
- get domY() {
239
- this.calculateBoundingClientRect();
240
- return this._domY;
241
- }
242
- get isInXR() { return this.renderer?.xr?.isPresenting || false; }
243
- /** shorthand for `NeedleXRSession.active`
244
- * Automatically set by NeedleXRSession when a XR session is active
245
- * @returns the active XR session or null if no session is active
246
- * */
247
- xr = null;
248
- get xrSessionMode() { return this.xr?.mode; }
249
- get isInVR() { return this.xrSessionMode === "immersive-vr"; }
250
- get isInAR() { return this.xrSessionMode === "immersive-ar"; }
251
- /** If a XR session is active and in pass through mode (immersive-ar on e.g. Quest) */
252
- get isInPassThrough() { return this.xr ? this.xr.isPassThrough : false; }
253
- /** access the raw `XRSession` object (shorthand for `context.renderer.xr.getSession()`). For more control use `NeedleXRSession.active` */
254
- get xrSession() { return this.renderer?.xr?.getSession(); }
255
- /** @returns the latest XRFrame (if a XRSession is currently active)
256
- * @link https://developer.mozilla.org/en-US/docs/Web/API/XRFrame
257
- */
258
- get xrFrame() { return this._xrFrame; }
259
- /** @returns the current WebXR camera while the WebXRManager is active (shorthand for `context.renderer.xr.getCamera()`) */
260
- get xrCamera() { return this.renderer.xr.isPresenting ? this.renderer?.xr?.getCamera() : undefined; }
261
- _xrFrame = null;
262
- get arOverlayElement() {
263
- const el = this.domElement;
264
- if (typeof el.getAROverlayContainer === "function")
265
- return el.getAROverlayContainer();
266
- return this.domElement;
267
- }
268
- /** Current event of the update cycle */
269
- get currentFrameEvent() {
270
- return this._currentFrameEvent;
271
- }
272
- _currentFrameEvent = FrameEvent.Undefined;
273
- scene;
274
- renderer;
275
- composer = null;
276
- // all scripts
277
- scripts = [];
278
- scripts_pausedChanged = [];
279
- // scripts with update event
280
- scripts_earlyUpdate = [];
281
- scripts_update = [];
282
- scripts_lateUpdate = [];
283
- scripts_onBeforeRender = [];
284
- scripts_onAfterRender = [];
285
- scripts_WithCorroutines = [];
286
- scripts_immersive_vr = [];
287
- scripts_immersive_ar = [];
288
- coroutines = {};
289
- /** callbacks called once after the context has been created */
290
- post_setup_callbacks = [];
291
- /** called every frame at the beginning of the frame (after component start events and before earlyUpdate) */
292
- pre_update_callbacks = [];
293
- /** called every frame before rendering (after all component events) */
294
- pre_render_callbacks = [];
295
- /** called every frame after rendering (after all component events) */
296
- post_render_callbacks = [];
297
- /** called every frame befroe update (this list is emptied every frame) */
298
- pre_update_oneshot_callbacks = [];
299
- new_scripts = [];
300
- new_script_start = [];
301
- new_scripts_pre_setup_callbacks = [];
302
- new_scripts_post_setup_callbacks = [];
303
- new_scripts_xr = [];
304
- /** The main camera component of the scene - this camera is used for rendering */
305
- mainCameraComponent = undefined;
306
- /** The main camera of the scene - this camera is used for rendering */
307
- get mainCamera() {
308
- if (this._mainCamera) {
309
- return this._mainCamera;
310
- }
311
- if (this.mainCameraComponent) {
312
- const cam = this.mainCameraComponent;
313
- if (!cam.threeCamera)
314
- cam.buildCamera();
315
- return cam.threeCamera;
316
- }
317
- if (!this._fallbackCamera) {
318
- this._fallbackCamera = new PerspectiveCamera(75, this.domWidth / this.domHeight, 0.1, 1000);
319
- }
320
- return this._fallbackCamera;
321
- }
322
- /** Set the main camera of the scene. If set to null the camera of the {@link mainCameraComponent} will be used - this camera is used for rendering */
323
- set mainCamera(cam) {
324
- this._mainCamera = cam;
325
- }
326
- _mainCamera = null;
327
- _fallbackCamera = null;
328
- application;
329
- /** access animation mixer used by components in the scene */
330
- animations;
331
- /** access timings (current frame number, deltaTime, timeScale, ...) */
332
- time;
333
- input;
334
- /** access physics related methods (e.g. raycasting). To access the phyiscs engine use `context.physics.engine` */
335
- physics;
336
- /** access networking methods (use it to send or listen to messages or join a networking backend) */
337
- connection;
338
- /**
339
- * @deprecated AssetDataBase is deprecated
340
- */
341
- assets;
342
- mainLight = null;
343
- /** @deprecated Use sceneLighting */
344
- get rendererData() { return this.sceneLighting; }
345
- sceneLighting;
346
- addressables;
347
- lightmaps;
348
- players;
349
- lodsManager;
350
- menu;
351
- get isCreated() { return this._isCreated; }
352
- _needsUpdateSize = false;
353
- _isCreated = false;
354
- _isCreating = false;
355
- _isVisible = false;
356
- _stats = stats ? new Stats.default() : null;
357
- constructor(args) {
358
- this.name = args?.name || "";
359
- this.alias = args?.alias;
360
- this.domElement = args?.domElement || document.body;
361
- this.hash = args?.hash;
362
- if (args?.renderer) {
363
- this.renderer = args.renderer;
364
- this.isManagedExternally = true;
365
- }
366
- if (args?.runInBackground !== undefined)
367
- this.runInBackground = args.runInBackground;
368
- if (args?.scene)
369
- this.scene = args.scene;
370
- else
371
- this.scene = new Scene();
372
- if (args?.camera)
373
- this._mainCamera = args.camera;
374
- this.application = new Application(this);
375
- this.time = new Time();
376
- this.input = new Input(this);
377
- this.physics = new Physics(this);
378
- this.connection = new NetworkConnection(this);
379
- // eslint-disable-next-line deprecation/deprecation
380
- this.assets = new AssetDatabase();
381
- this.sceneLighting = new SceneLighting(this);
382
- this.addressables = new Addressables(this);
383
- this.lightmaps = new LightDataRegistry(this);
384
- this.players = new PlayerViewManager(this);
385
- this.menu = new NeedleMenu(this);
386
- this.lodsManager = new LODsManager(this);
387
- this.animations = new AnimationsRegistry(this);
388
- const resizeCallback = () => this._needsUpdateSize = true;
389
- window.addEventListener('resize', resizeCallback);
390
- this._disposeCallbacks.push(() => window.removeEventListener('resize', resizeCallback));
391
- const resizeObserver = new ResizeObserver(_ => this._needsUpdateSize = true);
392
- resizeObserver.observe(this.domElement);
393
- this._disposeCallbacks.push(() => resizeObserver.disconnect());
394
- this._intersectionObserver = new IntersectionObserver(entries => {
395
- this._isVisible = entries[0].isIntersecting;
396
- });
397
- this._disposeCallbacks.push(() => this._intersectionObserver?.disconnect());
398
- ContextRegistry.register(this);
399
- }
400
- /** calling this function will dispose the current renderer and create a new one */
401
- createNewRenderer(params) {
402
- this.renderer?.dispose();
403
- params = { ...Context.DefaultWebGLRendererParameters, ...params };
404
- if (!params.canvas) {
405
- // get canvas already configured in the Needle Engine Web Component
406
- const canvas = this.domElement?.shadowRoot?.querySelector("canvas");
407
- if (canvas) {
408
- params.canvas = canvas;
409
- if (debug) {
410
- console.log("Using canvas from shadow root", canvas);
411
- }
412
- }
413
- }
414
- if (debug)
415
- console.log("Using Renderer Parameters:", params, this.domElement);
416
- this.renderer = new WebGLRenderer(params);
417
- this.renderer.debug.checkShaderErrors = isDevEnvironment() || getParam("checkshadererrors") === true;
418
- // some tonemapping other than "NONE" is required for adjusting exposure with EXR environments
419
- this.renderer.toneMappingExposure = 1; // range [0...inf] instead of the usual -15..15
420
- this.renderer.toneMapping = NoToneMapping; // could also set to LinearToneMapping, ACESFilmicToneMapping
421
- this.renderer.setClearColor(new Color('lightgrey'), 0);
422
- // // @ts-ignore
423
- // this.renderer.alpha = false;
424
- this.renderer.shadowMap.enabled = true;
425
- this.renderer.shadowMap.type = PCFSoftShadowMap;
426
- this.renderer.setSize(this.domWidth, this.domHeight);
427
- this.renderer.outputColorSpace = SRGBColorSpace;
428
- // Injecting the core nodes library here, like WebGPURenderer backends do
429
- //@ts-ignore
430
- this.renderer.nodes = {
431
- library: new BasicNodeLibrary(),
432
- modelViewMatrix: null,
433
- modelNormalViewMatrix: null,
434
- };
435
- // this.renderer.toneMapping = AgXToneMapping;
436
- this.lodsManager.setRenderer(this.renderer);
437
- this.input.bindEvents();
438
- }
439
- _intersectionObserver = null;
440
- internalOnUpdateVisible() {
441
- this._intersectionObserver?.disconnect();
442
- this._intersectionObserver?.observe(this.domElement);
443
- }
444
- _disposeCallbacks = [];
445
- /** will request a renderer size update the next render call (will call updateSize the next update) */
446
- requestSizeUpdate() { this._needsUpdateSize = true; }
447
- /** Clamps the renderer max resolution. If undefined the max resolution is not clamped. Default is undefined */
448
- maxRenderResolution;
449
- /** Control the renderer devicePixelRatio.
450
- * **Options**
451
- * - `auto` - Needle Engine automatically sets the pixel ratio to the current window.devicePixelRatio.
452
- * - `manual` - Needle Engine will not change the renderer pixel ratio. You can set it manually.
453
- * - `number` - Needle Engine will set the pixel ratio to the given number. The change will be applied to the renderer and the composer (if used) at the end of the current frame.
454
- */
455
- get devicePixelRatio() { return this._devicePixelRatio; }
456
- set devicePixelRatio(val) {
457
- if (val !== this._devicePixelRatio) {
458
- this._devicePixelRatio = val;
459
- this._needsUpdateSize = true;
460
- }
461
- }
462
- _devicePixelRatio = "auto";
463
- /** update the renderer and canvas size */
464
- updateSize(force = false) {
465
- if (force || (!this.isManagedExternally && this.renderer.xr?.isPresenting === false)) {
466
- this._needsUpdateSize = false;
467
- const scaleFactor = this.resolutionScaleFactor;
468
- let width = this.domWidth * scaleFactor;
469
- let height = this.domHeight * scaleFactor;
470
- if (this.maxRenderResolution) {
471
- this.maxRenderResolution.x = Math.max(1, this.maxRenderResolution.x);
472
- width = Math.min(this.maxRenderResolution.x, width);
473
- this.maxRenderResolution.y = Math.max(1, this.maxRenderResolution.y);
474
- height = Math.min(this.maxRenderResolution.y, height);
475
- }
476
- const camera = this.mainCamera;
477
- this.updateAspect(camera);
478
- this.renderer.setSize(width, height, true);
479
- // avoid setting pixel values here since this can cause pingpong updates
480
- // e.g. when system scale is set to 125%
481
- // https://github.com/needle-tools/needle-engine-support/issues/69
482
- this.renderer.domElement.style.width = "100%";
483
- this.renderer.domElement.style.height = "100%";
484
- const devicePixelRatio = typeof this.devicePixelRatio === "number"
485
- ? this.devicePixelRatio
486
- : this.devicePixelRatio === "auto"
487
- ? window.devicePixelRatio
488
- : undefined;
489
- if (devicePixelRatio !== undefined) {
490
- this.renderer.setPixelRatio(devicePixelRatio);
491
- }
492
- if (this.composer) {
493
- this.composer.setSize?.call(this.composer, width, height);
494
- if (devicePixelRatio !== undefined && "setPixelRatio" in this.composer && typeof this.composer.setPixelRatio === "function")
495
- this.composer.setPixelRatio?.call(this.composer, window.devicePixelRatio);
496
- }
497
- }
498
- }
499
- updateAspect(camera, width, height) {
500
- if (!camera)
501
- return;
502
- if (width === undefined)
503
- width = this.domWidth;
504
- if (height === undefined)
505
- height = this.domHeight;
506
- const aspectRatio = width / height;
507
- if (camera.isPerspectiveCamera) {
508
- const cam = camera;
509
- const pa = cam.aspect;
510
- cam.aspect = aspectRatio;
511
- if (pa !== cam.aspect)
512
- camera.updateProjectionMatrix();
513
- }
514
- else if (camera.isOrthographicCamera) {
515
- const cam = camera;
516
- // Maintain the camera's current vertical size (top - bottom)
517
- const verticalSize = cam.top - cam.bottom;
518
- // Calculate new horizontal size based on aspect ratio
519
- const horizontalSize = verticalSize * aspectRatio;
520
- // Update camera bounds while maintaining center position
521
- const halfWidth = horizontalSize / 2;
522
- const halfHeight = verticalSize / 2;
523
- if (cam.left != -halfWidth || cam.top != halfHeight) {
524
- cam.left = -halfWidth;
525
- cam.right = halfWidth;
526
- cam.top = halfHeight;
527
- cam.bottom = -halfHeight;
528
- camera.updateProjectionMatrix();
529
- }
530
- }
531
- }
532
- /** This will recreate the whole needle engine context and dispose the whole scene content
533
- * All content will be reloaded (loading times might be faster due to browser caches)
534
- * All scripts will be recreated */
535
- recreate() {
536
- this.clear();
537
- this.create(this._originalCreationArgs);
538
- }
539
- _originalCreationArgs;
540
- /** @deprecated use create. This method will be removed in a future version */
541
- async onCreate(opts) {
542
- return this.create(opts);
543
- }
544
- async create(opts) {
545
- try {
546
- this._isCreating = true;
547
- if (opts !== this._originalCreationArgs)
548
- this._originalCreationArgs = deepClone(opts);
549
- window.addEventListener("unhandledrejection", this.onUnhandledRejection);
550
- const res = await this.internalOnCreate(opts);
551
- this._isCreated = res;
552
- return res;
553
- }
554
- finally {
555
- window.removeEventListener("unhandledrejection", this.onUnhandledRejection);
556
- this._isCreating = false;
557
- }
558
- }
559
- onUnhandledRejection = (event) => {
560
- this.onError(event.reason);
561
- };
562
- /** Dispatches an error */
563
- onError(error) {
564
- this.domElement.dispatchEvent(new CustomEvent("error", { detail: error }));
565
- }
566
- /** Will destroy all scenes and objects in the scene
567
- */
568
- clear() {
569
- ContextRegistry.dispatchCallback(ContextEvent.ContextClearing, this);
570
- invokeLifecycleFunctions(this, ContextEvent.ContextClearing);
571
- // NOTE: this does dispose the environment/background image too
572
- // which is probably not desired if it is set via the skybox-image attribute
573
- destroy(this.scene, true, true);
574
- this.scene = new Scene();
575
- this.addressables?.dispose();
576
- this.lightmaps?.clear();
577
- this.physics?.engine?.clearCaches();
578
- this.lodsManager.disable();
579
- if (!this.isManagedExternally) {
580
- if (this.renderer) {
581
- this.renderer.renderLists.dispose();
582
- this.renderer.state.reset();
583
- this.renderer.resetState();
584
- }
585
- }
586
- // We do not want to clear the renderer here because when switching src we want to keep the last rendered frame in case the loading screen is not visible
587
- // if a user wants to see the background they can still call setClearAlpha(0) and clear manually
588
- ContextRegistry.dispatchCallback(ContextEvent.ContextCleared, this);
589
- }
590
- dispose() {
591
- this.internalOnDestroy();
592
- }
593
- /**@deprecated use dispose() */
594
- onDestroy() { this.internalOnDestroy(); }
595
- internalOnDestroy() {
596
- Context.Current = this;
597
- ContextRegistry.dispatchCallback(ContextEvent.ContextDestroying, this);
598
- invokeLifecycleFunctions(this, ContextEvent.ContextDestroying);
599
- this.clear();
600
- this.renderer?.setAnimationLoop(null);
601
- if (this.renderer) {
602
- this.renderer.setClearAlpha(0);
603
- this.renderer.clear();
604
- if (!this.isManagedExternally) {
605
- if (debug)
606
- console.log("Disposing renderer");
607
- this.renderer.dispose();
608
- }
609
- }
610
- this.scene = null;
611
- this.renderer = null;
612
- this.input.dispose();
613
- this.menu.onDestroy();
614
- this.animations.onDestroy();
615
- for (const cb of this._disposeCallbacks) {
616
- try {
617
- cb();
618
- }
619
- catch (e) {
620
- console.error("Error in on dispose callback:", e, cb);
621
- }
622
- }
623
- if (this.domElement?.parentElement) {
624
- this.domElement.parentElement.removeChild(this.domElement);
625
- }
626
- this._isCreated = false;
627
- ContextRegistry.dispatchCallback(ContextEvent.ContextDestroyed, this);
628
- invokeLifecycleFunctions(this, ContextEvent.ContextDestroyed);
629
- ContextRegistry.unregister(this);
630
- if (Context.Current === this) {
631
- //@ts-ignore
632
- Context.Current = null;
633
- }
634
- }
635
- registerCoroutineUpdate(script, coroutine, evt) {
636
- if (typeof coroutine?.next !== "function") {
637
- console.error("Registered invalid coroutine function from " + script.name + "\nCoroutine functions must be generators: \"*myCoroutine() {...}\"\nStart a coroutine from a component by calling \"this.startCoroutine(myCoroutine())\"");
638
- return coroutine;
639
- }
640
- if (!this.coroutines[evt])
641
- this.coroutines[evt] = [];
642
- this.coroutines[evt].push({ comp: script, main: coroutine });
643
- return coroutine;
644
- }
645
- unregisterCoroutineUpdate(coroutine, evt) {
646
- if (!this.coroutines[evt])
647
- return;
648
- const idx = this.coroutines[evt].findIndex(c => c.main === coroutine);
649
- if (idx >= 0)
650
- this.coroutines[evt].splice(idx, 1);
651
- }
652
- stopAllCoroutinesFrom(script) {
653
- for (const evt in this.coroutines) {
654
- const rout = this.coroutines[evt];
655
- for (let i = rout.length - 1; i >= 0; i--) {
656
- const r = rout[i];
657
- if (r.comp === script) {
658
- rout.splice(i, 1);
659
- }
660
- }
661
- }
662
- }
663
- _cameraStack = [];
664
- setCurrentCamera(cam) {
665
- if (!cam)
666
- return;
667
- if (!cam.threeCamera)
668
- cam.buildCamera(); // < to build camera
669
- if (!cam.threeCamera) {
670
- console.warn("Camera component is missing camera", cam);
671
- return;
672
- }
673
- const index = this._cameraStack.indexOf(cam);
674
- if (index >= 0)
675
- this._cameraStack.splice(index, 1);
676
- this._cameraStack.push(cam);
677
- this.mainCameraComponent = cam;
678
- const camera = cam.threeCamera;
679
- if (camera.isPerspectiveCamera)
680
- this.updateAspect(camera);
681
- this.mainCameraComponent?.applyClearFlagsIfIsActiveCamera();
682
- }
683
- removeCamera(cam) {
684
- if (!cam)
685
- return;
686
- const index = this._cameraStack.indexOf(cam);
687
- if (index >= 0)
688
- this._cameraStack.splice(index, 1);
689
- if (this.mainCameraComponent === cam) {
690
- this.mainCameraComponent = undefined;
691
- if (this._cameraStack.length > 0) {
692
- const last = this._cameraStack[this._cameraStack.length - 1];
693
- this.setCurrentCamera(last);
694
- }
695
- }
696
- }
697
- _onBeforeRenderListeners = new Map();
698
- _onAfterRenderListeners = new Map();
699
- /** use this to subscribe to onBeforeRender events on threejs objects */
700
- addBeforeRenderListener(target, callback) {
701
- if (!this._onBeforeRenderListeners.has(target.uuid)) {
702
- this._onBeforeRenderListeners.set(target.uuid, []);
703
- target.onBeforeRender = this._createRenderCallbackWrapper(target, this._onBeforeRenderListeners);
704
- }
705
- this._onBeforeRenderListeners.get(target.uuid).push(callback);
706
- }
707
- removeBeforeRenderListener(target, callback) {
708
- if (this._onBeforeRenderListeners.has(target.uuid)) {
709
- const arr = this._onBeforeRenderListeners.get(target.uuid);
710
- const idx = arr.indexOf(callback);
711
- if (idx >= 0)
712
- arr.splice(idx, 1);
713
- }
714
- }
715
- /** use this to subscribe to onAfterRender events on threejs objects */
716
- addAfterRenderListener(target, callback) {
717
- if (!this._onAfterRenderListeners.has(target.uuid)) {
718
- this._onAfterRenderListeners.set(target.uuid, []);
719
- target.onAfterRender = this._createRenderCallbackWrapper(target, this._onAfterRenderListeners);
720
- }
721
- this._onAfterRenderListeners.get(target.uuid)?.push(callback);
722
- }
723
- removeAfterRenderListener(target, callback) {
724
- if (this._onAfterRenderListeners.has(target.uuid)) {
725
- const arr = this._onAfterRenderListeners.get(target.uuid);
726
- const idx = arr.indexOf(callback);
727
- if (idx >= 0)
728
- arr.splice(idx, 1);
729
- }
730
- }
731
- _createRenderCallbackWrapper(target, array) {
732
- return (renderer, scene, camera, geometry, material, group) => {
733
- const arr = array.get(target.uuid);
734
- if (!arr)
735
- return;
736
- for (let i = 0; i < arr.length; i++) {
737
- const fn = arr[i];
738
- fn(renderer, scene, camera, geometry, material, group);
739
- }
740
- };
741
- }
742
- _requireDepthTexture = false;
743
- _requireColorTexture = false;
744
- _renderTarget;
745
- _isRendering = false;
746
- get isRendering() { return this._isRendering; }
747
- setRequireDepth(val) {
748
- this._requireDepthTexture = val;
749
- }
750
- setRequireColor(val) {
751
- this._requireColorTexture = val;
752
- }
753
- get depthTexture() {
754
- return this._renderTarget?.depthTexture || null;
755
- }
756
- get opaqueColorTexture() {
757
- return this._renderTarget?.texture || null;
758
- }
759
- /** returns true if the dom element is visible on screen */
760
- get isVisibleToUser() {
761
- if (this.isInXR)
762
- return true;
763
- if (!this._isVisible)
764
- return false;
765
- const style = getComputedStyle(this.domElement);
766
- return style.visibility !== "hidden" && style.display !== "none" && style.opacity !== "0";
767
- }
768
- _createId = 0;
769
- async internalOnCreate(opts) {
770
- const createId = ++this._createId;
771
- if (debug)
772
- console.log("Creating context", this.name, opts);
773
- // wait for async imported dependencies to be loaded
774
- // see https://linear.app/needle/issue/NE-4445
775
- const dependenciesReady = globalThis["needle:dependencies:ready"];
776
- if (dependenciesReady instanceof Promise) {
777
- if (debug)
778
- console.log("Waiting for dependencies to be ready");
779
- await dependenciesReady
780
- .catch(err => {
781
- if (debug || isDevEnvironment()) {
782
- showBalloonError("Needle Engine dependencies failed to load. Please check the console for more details");
783
- const printedError = false;
784
- if (err instanceof ReferenceError) {
785
- let offendingComponentName = "YourComponentName";
786
- const offendingComponentStartIndex = err.message.indexOf("'");
787
- if (offendingComponentStartIndex > 0) {
788
- const offendingComponentEndIndex = err.message.indexOf("'", offendingComponentStartIndex + 1);
789
- if (offendingComponentEndIndex > 0) {
790
- const name = err.message.substring(offendingComponentStartIndex + 1, offendingComponentEndIndex);
791
- if (name.length > 3)
792
- offendingComponentName = name;
793
- }
794
- }
795
- console.error(`Needle Engine dependencies failed to load:\n\n# Make sure you don't have circular imports in your scripts!\n\nPossible solutions: \n→ Replace @serializable(${offendingComponentName}) in your script with @serializable(Behaviour)\n→ If you only need type information try importing the type only, e.g: import { type ${offendingComponentName} }\n\n---`, err);
796
- return;
797
- }
798
- if (!printedError) {
799
- console.error("Needle Engine dependencies failed to load", err);
800
- }
801
- }
802
- })
803
- .then(() => {
804
- if (debug)
805
- console.log("Needle Engine dependencies are ready");
806
- });
807
- }
808
- this.clear();
809
- // stop the animation loop if its running during creation
810
- // since we do not want to start enabling scripts etc before they are deserialized
811
- if (this.isManagedExternally === false) {
812
- this.createNewRenderer();
813
- this.renderer?.setAnimationLoop(null);
814
- }
815
- await delay(1);
816
- Context.Current = this;
817
- await ContextRegistry.dispatchCallback(ContextEvent.ContextCreationStart, this);
818
- // load and create scene
819
- let prepare_succeeded = true;
820
- let loadedFiles;
821
- try {
822
- Context.Current = this;
823
- if (opts) {
824
- loadedFiles = await this.internalLoadInitialContent(createId, opts);
825
- }
826
- else
827
- loadedFiles = [];
828
- }
829
- catch (err) {
830
- console.error(err);
831
- prepare_succeeded = false;
832
- }
833
- if (!prepare_succeeded) {
834
- this.onError("Failed to load initial content");
835
- return false;
836
- }
837
- if (createId !== this._createId || opts?.abortSignal?.aborted) {
838
- return false;
839
- }
840
- this.internalOnUpdateVisible();
841
- if (!this.renderer) {
842
- if (debug)
843
- console.warn("Context has no renderer (perhaps it was disconnected?", this.domElement.isConnected);
844
- return false;
845
- }
846
- if (!this.isManagedExternally && !this.domElement.shadowRoot) {
847
- this.domElement.prepend(this.renderer.domElement);
848
- }
849
- Context.Current = this;
850
- // TODO: we could configure if we need physics
851
- // await this.physics.engine?.initialize();
852
- // Setup
853
- Context.Current = this;
854
- for (let i = 0; i < this.new_scripts.length; i++) {
855
- const script = this.new_scripts[i];
856
- if (script.gameObject !== undefined && script.gameObject !== null) {
857
- if (script.gameObject.userData === undefined)
858
- script.gameObject.userData = {};
859
- if (script.gameObject.userData.components === undefined)
860
- script.gameObject.userData.components = [];
861
- const arr = script.gameObject.userData.components;
862
- if (!arr.includes(script))
863
- arr.push(script);
864
- }
865
- // if (script.gameObject && !this.raycastTargets.includes(script.gameObject)) {
866
- // this.raycastTargets.push(script.gameObject);
867
- // }
868
- }
869
- // const context = new SerializationContext(this.scene);
870
- // for (let i = 0; i < this.new_scripts.length; i++) {
871
- // const script = this.new_scripts[i];
872
- // const ser = script as unknown as ISerializable;
873
- // if (ser.$serializedTypes === undefined) continue;
874
- // context.context = this;
875
- // context.object = script.gameObject;
876
- // deserializeObject(ser, script, context);
877
- // }
878
- // resolve post setup callbacks (things that rely on threejs objects having references to components)
879
- if (this.post_setup_callbacks) {
880
- for (let i = 0; i < this.post_setup_callbacks.length; i++) {
881
- Context.Current = this;
882
- await this.post_setup_callbacks[i](this);
883
- }
884
- }
885
- if (!this._mainCamera) {
886
- Context.Current = this;
887
- let camera = null;
888
- foreachComponent(this.scene, comp => {
889
- const cam = comp;
890
- if (cam?.isCamera) {
891
- looputils.updateActiveInHierarchyWithoutEventCall(cam.gameObject);
892
- if (!cam.activeAndEnabled)
893
- return undefined;
894
- if (cam.tag === "MainCamera") {
895
- camera = cam;
896
- return true;
897
- }
898
- else
899
- camera = cam;
900
- }
901
- return undefined;
902
- });
903
- if (camera) {
904
- this.setCurrentCamera(camera);
905
- }
906
- else {
907
- const res = ContextRegistry.dispatchCallback(ContextEvent.MissingCamera, this, { files: loadedFiles });
908
- if (!res && !this.mainCamera && !this.isManagedExternally)
909
- console.warn("Missing camera in main scene", this);
910
- }
911
- }
912
- this.input.bindEvents();
913
- Context.Current = this;
914
- looputils.processNewScripts(this);
915
- // We have to step once so that colliders that have been created in onEnable can be raycasted in start
916
- if (this.physics.engine) {
917
- this.physics.engine?.step(0);
918
- this.physics.engine?.postStep();
919
- }
920
- // const mainCam = this.mainCameraComponent as Camera;
921
- // if (mainCam) {
922
- // mainCam.applyClearFlagsIfIsActiveCamera();
923
- // }
924
- if (!this.isManagedExternally && this.composer && this.mainCamera) {
925
- // TODO: import postprocessing async
926
- // const renderPass = new RenderPass(this.scene, this.mainCamera);
927
- // this.renderer.setSize(this.domWidth, this.domHeight);
928
- // this.composer.addPass(renderPass);
929
- // this.composer.setSize(this.domWidth, this.domHeight);
930
- }
931
- this._needsUpdateSize = true;
932
- if (this._stats) {
933
- this._stats.showPanel(0);
934
- this._stats.dom.style.position = "absolute"; // (default is fixed)
935
- this.domElement.shadowRoot?.appendChild(this._stats.dom);
936
- }
937
- if (debug)
938
- logHierarchy(this.scene, true);
939
- // If no target framerate was set we use the default
940
- if (this.targetFrameRate === undefined) {
941
- if (debug)
942
- console.warn("No target framerate set, using default", Context.DefaultTargetFrameRate);
943
- // the _defaultTargetFramerate is intentionally an object so it can be changed at any time if not explictly set by the user
944
- this.targetFrameRate = Context._defaultTargetFramerate;
945
- }
946
- else if (debug)
947
- console.log("Target framerate set to", this.targetFrameRate);
948
- this._dispatchReadyAfterFrame = true;
949
- const res = ContextRegistry.dispatchCallback(ContextEvent.ContextCreated, this, { files: loadedFiles });
950
- if (res) {
951
- if ("internalSetLoadingMessage" in this.domElement && typeof this.domElement.internalSetLoadingMessage === "function")
952
- this.domElement?.internalSetLoadingMessage("finish loading");
953
- await res;
954
- }
955
- if (opts?.abortSignal?.aborted) {
956
- return false;
957
- }
958
- invokeLifecycleFunctions(this, ContextEvent.ContextCreated);
959
- if (debug)
960
- console.log("Context Created...", this.renderer, this.renderer.domElement);
961
- this._isCreating = false;
962
- if (!this.isManagedExternally && !opts?.abortSignal?.aborted)
963
- this.restartRenderLoop();
964
- return true;
965
- }
966
- async internalLoadInitialContent(createId, args) {
967
- const results = new Array();
968
- // early out if we dont have any files to load
969
- if (args.files.length === 0)
970
- return results;
971
- const files = [...args.files];
972
- const progressArg = {
973
- name: "",
974
- progress: null,
975
- index: 0,
976
- count: files.length
977
- };
978
- const loader = getLoader();
979
- // this hash should be constant since it is used to initialize the UIDProvider per initially loaded scene
980
- const loadingHash = 0;
981
- for (let i = 0; i < files.length; i++) {
982
- if (args.abortSignal?.aborted) {
983
- if (debug)
984
- console.log("Aborting loading because of abort signal");
985
- break;
986
- }
987
- // abort loading if the create id has changed
988
- if (createId !== this._createId) {
989
- if (debug)
990
- console.log("Aborting loading because create id changed", createId, this._createId);
991
- break;
992
- }
993
- const file = files[i];
994
- args?.onLoadingStart?.call(this, i, file);
995
- if (debug)
996
- console.log("Context Load " + file);
997
- const res = await loader.loadSync(this, file, file, loadingHash, prog => {
998
- if (args.abortSignal?.aborted)
999
- return;
1000
- progressArg.name = file;
1001
- progressArg.progress = prog;
1002
- progressArg.index = i;
1003
- progressArg.count = files.length;
1004
- args.onLoadingProgress?.call(this, progressArg);
1005
- });
1006
- args?.onLoadingFinished?.call(this, i, file, res ?? null);
1007
- if (res) {
1008
- results.push({
1009
- src: file,
1010
- file: res
1011
- });
1012
- }
1013
- else {
1014
- // a file could not be loaded
1015
- console.warn("Could not load file: " + file);
1016
- }
1017
- }
1018
- // if the id was changed while still loading
1019
- // then we want to cleanup/destroy previously loaded files
1020
- if (createId !== this._createId || args.abortSignal?.aborted) {
1021
- if (debug)
1022
- console.log("Aborting loading because create id changed or abort signal was set", createId, this._createId);
1023
- for (const res of results) {
1024
- if (res && res.file) {
1025
- for (const scene of res.file.scenes)
1026
- destroy(scene, true, true);
1027
- }
1028
- }
1029
- }
1030
- // otherwise we want to add the loaded files to the current scene
1031
- else {
1032
- let anyModelFound = false;
1033
- for (const res of results) {
1034
- if (res && res.file) {
1035
- // TODO: should we load all scenes in a glTF here?
1036
- if (res.file.scene) {
1037
- anyModelFound = true;
1038
- this.scene.add(res.file.scene);
1039
- }
1040
- else {
1041
- console.warn("No scene found in loaded file");
1042
- }
1043
- }
1044
- }
1045
- // If the loaded files do not contain ANY model
1046
- // We then attempt to create a mesh from each material in the loaded files to visualize it
1047
- // It's ok to do this at this point because we know the context has been cleared because the whole `src` attribute has been set
1048
- if (!anyModelFound) {
1049
- for (const res of results) {
1050
- if (res && res.file && "parser" in res.file) {
1051
- let y = 0;
1052
- if (!Array.isArray(res.file.parser.json.materials))
1053
- continue;
1054
- for (let i = 0; i < res.file.parser.json.materials.length; i++) {
1055
- const mat = await res.file.parser.getDependency("material", i);
1056
- const parent = new Object3D();
1057
- parent.position.x = i * 1.1;
1058
- parent.position.y = y;
1059
- this.scene.add(parent);
1060
- ObjectUtils.createPrimitive("ShaderBall", {
1061
- parent,
1062
- material: mat
1063
- });
1064
- }
1065
- y += 1;
1066
- }
1067
- }
1068
- }
1069
- }
1070
- return results;
1071
- }
1072
- /** Sets the animation loop.
1073
- * Can not be done while creating the context or when disposed
1074
- **/
1075
- restartRenderLoop() {
1076
- if (!this.renderer) {
1077
- console.error("Can not start render loop without renderer");
1078
- return false;
1079
- }
1080
- if (this._isCreating) {
1081
- console.warn("Can not start render loop while creating context");
1082
- return false;
1083
- }
1084
- this.renderer.setAnimationLoop((timestamp, frame) => {
1085
- if (this.isManagedExternally)
1086
- return;
1087
- this.update(timestamp, frame);
1088
- });
1089
- return true;
1090
- }
1091
- _renderlooperrors = 0;
1092
- /** Performs a full update step including script callbacks, rendering (unless isManagedExternally is set to false) and post render callbacks */
1093
- update(timestamp, frame) {
1094
- if (frame === undefined)
1095
- frame = null;
1096
- if (isDevEnvironment() || debug || looputils.hasNewScripts()) {
1097
- try {
1098
- //performance.mark('update.start');
1099
- this.internalStep(timestamp, frame);
1100
- this._renderlooperrors = 0;
1101
- //performance.mark('update.end');
1102
- //performance.measure('NE Frame', 'update.start', 'update.end');
1103
- }
1104
- catch (err) {
1105
- this._renderlooperrors += 1;
1106
- if ((isDevEnvironment() || debug) && (err instanceof Error || err instanceof TypeError))
1107
- showBalloonMessage(`Caught unhandled exception during render-loop - see console for details.`, LogType.Error);
1108
- console.error("Frame #" + this.time.frame + "\n", err);
1109
- if (this._renderlooperrors >= 3) {
1110
- console.warn("Stopping render loop due to error");
1111
- this.renderer.setAnimationLoop(null);
1112
- }
1113
- this.domElement.dispatchEvent(new CustomEvent("error", { detail: err }));
1114
- }
1115
- }
1116
- else {
1117
- this.internalStep(timestamp, frame);
1118
- }
1119
- }
1120
- /** Call to **manually** perform physics steps.
1121
- * By default the context uses the `physicsSteps` property to perform steps during the update loop
1122
- * If you just want to increase the accuracy of physics you can instead set the `physicsSteps` property to a higher value
1123
- * */
1124
- updatePhysics(steps) {
1125
- this.internalUpdatePhysics(steps);
1126
- }
1127
- _lastTimestamp = 0;
1128
- _accumulatedTime = 0;
1129
- _dispatchReadyAfterFrame = false;
1130
- // TODO: we need to skip after render callbacks if the render loop is managed externally. When changing this we also need to to update the r3f sample
1131
- internalStep(timestamp, frame) {
1132
- if (this.internalOnBeforeRender(timestamp, frame) === false)
1133
- return;
1134
- this.internalOnRender();
1135
- this.internalOnAfterRender();
1136
- }
1137
- internalOnBeforeRender(timestamp, frame) {
1138
- // If we don't auto reset we get wrong stats in WebXR. AutoReset was turned off to support custom blits and count them too
1139
- this.renderer.info.autoReset = true;
1140
- const sessionStarted = frame !== null && this._xrFrame === null;
1141
- this._xrFrame = frame;
1142
- if (sessionStarted) {
1143
- this.domElement.dispatchEvent(new CustomEvent("xr-session-started", { detail: { context: this, session: this.xrSession, frame: frame } }));
1144
- }
1145
- this._currentFrameEvent = FrameEvent.Undefined;
1146
- if (this.isManagedExternally === false && this.isInXR === false && this.targetFrameRate !== undefined) {
1147
- if (this._lastTimestamp === 0)
1148
- this._lastTimestamp = timestamp;
1149
- this._accumulatedTime += (timestamp - this._lastTimestamp) / 1000;
1150
- this._lastTimestamp = timestamp;
1151
- let targetFrameRate = this.targetFrameRate;
1152
- if (typeof targetFrameRate === "object")
1153
- targetFrameRate = targetFrameRate.value;
1154
- // if(debug) console.log(this._accumulatedTime, (1 / (targetFrameRate)))
1155
- if (this._accumulatedTime < (1 / (targetFrameRate + 1))) {
1156
- return false;
1157
- }
1158
- this._accumulatedTime = 0;
1159
- }
1160
- this._stats?.begin();
1161
- Context.Current = this;
1162
- if (this.onHandlePaused())
1163
- return false;
1164
- Context.Current = this;
1165
- this.time.update();
1166
- if (debugframerate)
1167
- console.log("FPS", (this.time.smoothedFps).toFixed(0));
1168
- looputils.processNewScripts(this);
1169
- looputils.updateIsActive(this.scene);
1170
- looputils.processStart(this);
1171
- invokeLifecycleFunctions(this, FrameEvent.Start);
1172
- while (this._cameraStack.length > 0 && (!this.mainCameraComponent || this.mainCameraComponent.destroyed)) {
1173
- this._cameraStack.splice(this._cameraStack.length - 1, 1);
1174
- const last = this._cameraStack[this._cameraStack.length - 1];
1175
- this.setCurrentCamera(last);
1176
- }
1177
- if (this.pre_update_oneshot_callbacks) {
1178
- for (const i in this.pre_update_oneshot_callbacks) {
1179
- this.pre_update_oneshot_callbacks[i]();
1180
- }
1181
- this.pre_update_oneshot_callbacks.length = 0;
1182
- }
1183
- if (this.pre_update_callbacks) {
1184
- for (const i in this.pre_update_callbacks) {
1185
- this.pre_update_callbacks[i]();
1186
- }
1187
- }
1188
- this._currentFrameEvent = FrameEvent.EarlyUpdate;
1189
- for (let i = 0; i < this.scripts_earlyUpdate.length; i++) {
1190
- const script = this.scripts_earlyUpdate[i];
1191
- if (!script.activeAndEnabled)
1192
- continue;
1193
- if (script.earlyUpdate !== undefined) {
1194
- Context.Current = this;
1195
- script.earlyUpdate();
1196
- }
1197
- }
1198
- this.executeCoroutines(FrameEvent.EarlyUpdate);
1199
- invokeLifecycleFunctions(this, FrameEvent.EarlyUpdate);
1200
- if (this.onHandlePaused())
1201
- return false;
1202
- this._currentFrameEvent = FrameEvent.Update;
1203
- for (let i = 0; i < this.scripts_update.length; i++) {
1204
- const script = this.scripts_update[i];
1205
- if (!script.activeAndEnabled)
1206
- continue;
1207
- if (script.update !== undefined) {
1208
- Context.Current = this;
1209
- script.update();
1210
- }
1211
- }
1212
- this.executeCoroutines(FrameEvent.Update);
1213
- invokeLifecycleFunctions(this, FrameEvent.Update);
1214
- if (this.onHandlePaused())
1215
- return false;
1216
- this._currentFrameEvent = FrameEvent.LateUpdate;
1217
- for (let i = 0; i < this.scripts_lateUpdate.length; i++) {
1218
- const script = this.scripts_lateUpdate[i];
1219
- if (!script.activeAndEnabled)
1220
- continue;
1221
- if (script.lateUpdate !== undefined) {
1222
- Context.Current = this;
1223
- script.lateUpdate();
1224
- }
1225
- }
1226
- // this.mainLight = null;
1227
- this.executeCoroutines(FrameEvent.LateUpdate);
1228
- invokeLifecycleFunctions(this, FrameEvent.LateUpdate);
1229
- if (this.onHandlePaused())
1230
- return false;
1231
- if (this.physicsSteps === undefined) {
1232
- this.physicsSteps = 1;
1233
- }
1234
- if (this.physics.engine && this.physicsSteps > 0) {
1235
- this.internalUpdatePhysics(this.physicsSteps);
1236
- }
1237
- if (this.onHandlePaused())
1238
- return false;
1239
- if (this.isVisibleToUser || this.runInBackground) {
1240
- this._currentFrameEvent = FrameEvent.OnBeforeRender;
1241
- // should we move these callbacks in the regular three onBeforeRender events?
1242
- for (let i = 0; i < this.scripts_onBeforeRender.length; i++) {
1243
- const script = this.scripts_onBeforeRender[i];
1244
- if (!script.activeAndEnabled)
1245
- continue;
1246
- // if(script.isActiveAndEnabled === false) continue;
1247
- if (script.onBeforeRender !== undefined) {
1248
- Context.Current = this;
1249
- script.onBeforeRender(frame);
1250
- }
1251
- }
1252
- this.executeCoroutines(FrameEvent.OnBeforeRender);
1253
- invokeLifecycleFunctions(this, FrameEvent.OnBeforeRender);
1254
- if (this._needsUpdateSize)
1255
- this.updateSize();
1256
- if (this.pre_render_callbacks) {
1257
- for (const i in this.pre_render_callbacks) {
1258
- this.pre_render_callbacks[i](frame);
1259
- }
1260
- }
1261
- }
1262
- return true;
1263
- }
1264
- internalUpdatePhysics(steps) {
1265
- if (!this.physics.engine)
1266
- return false;
1267
- const physicsSteps = steps;
1268
- const dt = this.time.deltaTime / physicsSteps;
1269
- for (let i = 0; i < physicsSteps; i++) {
1270
- this._currentFrameEvent = FrameEvent.PrePhysicsStep;
1271
- this.executeCoroutines(FrameEvent.PrePhysicsStep);
1272
- this.physics.engine.step(dt);
1273
- this._currentFrameEvent = FrameEvent.PostPhysicsStep;
1274
- this.executeCoroutines(FrameEvent.PostPhysicsStep);
1275
- }
1276
- this.physics.engine.postStep();
1277
- return true;
1278
- }
1279
- internalOnRender() {
1280
- if (!this.isManagedExternally) {
1281
- // when loading assets we compile them async after GLTFLoader is done
1282
- // but as a fallback we still register them (if e.g. there's no camera for compile async)
1283
- looputils.runPrewarm(this);
1284
- this._currentFrameEvent = FrameEvent.Undefined;
1285
- nodeFrame.update();
1286
- this.renderNow();
1287
- this._currentFrameEvent = FrameEvent.OnAfterRender;
1288
- }
1289
- }
1290
- internalOnAfterRender() {
1291
- if (this.isVisibleToUser || this.runInBackground) {
1292
- for (let i = 0; i < this.scripts_onAfterRender.length; i++) {
1293
- const script = this.scripts_onAfterRender[i];
1294
- if (!script.activeAndEnabled)
1295
- continue;
1296
- if (script.onAfterRender !== undefined) {
1297
- Context.Current = this;
1298
- script.onAfterRender();
1299
- }
1300
- }
1301
- this.executeCoroutines(FrameEvent.OnAfterRender);
1302
- invokeLifecycleFunctions(this, FrameEvent.OnAfterRender);
1303
- if (this.post_render_callbacks) {
1304
- for (const i in this.post_render_callbacks) {
1305
- this.post_render_callbacks[i]();
1306
- }
1307
- }
1308
- }
1309
- this._currentFrameEvent = -1;
1310
- this.connection.sendBufferedMessagesNow();
1311
- if (this._stats) {
1312
- this._stats.end();
1313
- if (this.time.frameCount % 150 === 0)
1314
- console.log(this.renderer.info.render.calls + " DrawCalls", "\nRender:", { ...this.renderer.info.render }, "\nMemory:", { ...this.renderer.info.memory }, "\nTarget Framerate: " + this.targetFrameRate);
1315
- }
1316
- if (this._dispatchReadyAfterFrame) {
1317
- this._dispatchReadyAfterFrame = false;
1318
- this.domElement.dispatchEvent(new CustomEvent("ready"));
1319
- ContextRegistry.dispatchCallback(ContextEvent.ContextFirstFrameRendered, this);
1320
- }
1321
- }
1322
- renderNow(camera) {
1323
- if (!camera) {
1324
- camera = this.mainCamera;
1325
- if (!camera)
1326
- return false;
1327
- }
1328
- this.handleRendererContextLost();
1329
- this._isRendering = true;
1330
- this.renderRequiredTextures();
1331
- if (this.renderer.toneMapping !== NoToneMapping)
1332
- patchTonemapping(this);
1333
- if (this.composer && !this.isInXR) {
1334
- // if a camera is passed in we need to check if we need to update the composer's camera
1335
- if (camera && "setMainCamera" in this.composer) {
1336
- const currentPassesCamera = this.composer.passes[0]?.mainCamera;
1337
- if (currentPassesCamera != camera)
1338
- this.composer.setMainCamera(camera);
1339
- }
1340
- this.composer.render(this.time.deltaTime);
1341
- }
1342
- else if (camera) {
1343
- // Workaround for issue on Vision Pro –
1344
- // depth buffer is not cleared between eye draws, despite the spec...
1345
- if (this.isInXR && DeviceUtilities.isMacOS())
1346
- this.renderer.clearDepth();
1347
- this.renderer.render(this.scene, camera);
1348
- }
1349
- this._isRendering = false;
1350
- return true;
1351
- }
1352
- _contextRestoreTries = 0;
1353
- handleRendererContextLost() {
1354
- // Try to restore the context every x frames
1355
- if (this.time.frame % 10 && this.renderer.getContext().isContextLost()) {
1356
- if (this._contextRestoreTries++ < 100) {
1357
- console.warn("Attempting to recover WebGL context...");
1358
- this.renderer.forceContextRestore();
1359
- }
1360
- }
1361
- }
1362
- /** returns true if we should return out of the frame loop */
1363
- _wasPaused = false;
1364
- onHandlePaused() {
1365
- const paused = this.evaluatePaused();
1366
- if (this._wasPaused !== paused) {
1367
- if (debugActive)
1368
- console.log("Paused?", paused, "context:" + this.alias);
1369
- for (let i = 0; i < this.scripts_pausedChanged.length; i++) {
1370
- const script = this.scripts_pausedChanged[i];
1371
- if (!script.activeAndEnabled)
1372
- continue;
1373
- if (script.onPausedChanged !== undefined) {
1374
- Context.Current = this;
1375
- script.onPausedChanged(paused, this._wasPaused);
1376
- }
1377
- }
1378
- }
1379
- this._wasPaused = paused;
1380
- return paused;
1381
- }
1382
- evaluatePaused() {
1383
- if (this.isInXR)
1384
- return false;
1385
- if (this.isPaused)
1386
- return true;
1387
- // if the element is not visible use the runInBackground flag to determine if we should continue
1388
- if (this.runInBackground) {
1389
- return false;
1390
- }
1391
- const paused = !this.isVisibleToUser;
1392
- return paused;
1393
- }
1394
- renderRequiredTextures() {
1395
- if (!this.mainCamera)
1396
- return;
1397
- if (!this._requireDepthTexture && !this._requireColorTexture)
1398
- return;
1399
- if (!this._renderTarget) {
1400
- this._renderTarget = new WebGLRenderTarget(this.domWidth, this.domHeight);
1401
- if (this._requireDepthTexture) {
1402
- const dt = new DepthTexture(this.domWidth, this.domHeight);
1403
- ;
1404
- this._renderTarget.depthTexture = dt;
1405
- }
1406
- if (this._requireColorTexture) {
1407
- this._renderTarget.texture = new Texture();
1408
- this._renderTarget.texture.generateMipmaps = false;
1409
- this._renderTarget.texture.minFilter = NearestFilter;
1410
- this._renderTarget.texture.magFilter = NearestFilter;
1411
- this._renderTarget.texture.format = RGBAFormat;
1412
- }
1413
- }
1414
- const rt = this._renderTarget;
1415
- if (rt.texture) {
1416
- rt.texture.colorSpace = this.renderer.outputColorSpace;
1417
- }
1418
- const prevTarget = this.renderer.getRenderTarget();
1419
- this.renderer.setRenderTarget(rt);
1420
- this.renderer.render(this.scene, this.mainCamera);
1421
- this.renderer.setRenderTarget(prevTarget);
1422
- }
1423
- executeCoroutines(evt) {
1424
- if (this.coroutines[evt]) {
1425
- const evts = this.coroutines[evt];
1426
- for (let i = 0; i < evts.length; i++) {
1427
- try {
1428
- const evt = evts[i];
1429
- // TODO we might want to keep coroutines playing even if the component is disabled or inactive
1430
- const remove = !evt.comp || evt.comp.destroyed || !evt.main || evt.comp["enabled"] === false;
1431
- if (remove) {
1432
- if (debugCoroutine)
1433
- console.log("Removing coroutine", evt.comp, evt.comp["enabled"]);
1434
- evts.splice(i, 1);
1435
- --i;
1436
- continue;
1437
- }
1438
- const iter = evt.chained;
1439
- if (iter && iter.length > 0) {
1440
- const last = iter[iter.length - 1];
1441
- const res = last.next();
1442
- if (res.done) {
1443
- iter.pop();
1444
- }
1445
- if (isGenerator(res)) {
1446
- if (!evt.chained)
1447
- evt.chained = [];
1448
- evt.chained.push(res.value);
1449
- }
1450
- if (!res.done)
1451
- continue;
1452
- }
1453
- const res = evt.main.next();
1454
- if (res.done === true) {
1455
- evts.splice(i, 1);
1456
- --i;
1457
- continue;
1458
- }
1459
- const val = res.value;
1460
- if (isGenerator(val)) {
1461
- // invoke once if its a generator
1462
- // this means e.g. WaitForFrame(1) works and will capture
1463
- // the frame it was created
1464
- const gen = val;
1465
- const res = gen.next();
1466
- if (res.done)
1467
- continue;
1468
- if (!evt.chained)
1469
- evt.chained = [];
1470
- evt.chained.push(val);
1471
- }
1472
- else if (val instanceof Promise) {
1473
- // If its a promise we want to wait for it to resolve
1474
- const prom = val;
1475
- if (!evt.chained)
1476
- evt.chained = [];
1477
- const nested = WaitForPromise(prom);
1478
- evt.chained?.push(nested);
1479
- continue;
1480
- }
1481
- }
1482
- catch (e) {
1483
- console.error(e);
1484
- }
1485
- }
1486
- }
1487
- function isGenerator(val) {
1488
- if (val) {
1489
- if (val.next && val.return) {
1490
- return true;
1491
- }
1492
- }
1493
- return false;
1494
- }
1495
- }
1496
- }
1497
- // const scene = new Scene();
1498
- // const useComposer = utils.getParam("postfx");
1499
- // const renderer = new WebGLRenderer({ antialias: true });
1500
- // const composer = useComposer ? new EffectComposer(renderer) : undefined;
1501
- // renderer.setClearColor(new Color('lightgrey'), 0)
1502
- // renderer.antialias = true;
1503
- // renderer.alpha = false;
1504
- // renderer.shadowMap.enabled = true;
1505
- // renderer.shadowMap.type = PCFSoftShadowMap;
1506
- // renderer.setSize(window.innerWidth, window.innerHeight);
1507
- // renderer.outputEncoding = sRGBEncoding;
1508
- // renderer.physicallyCorrectLights = true;
1509
- // document.body.appendChild(renderer.domElement);
1510
- // // generation pushes loading requests in this array
1511
- // const sceneData: {
1512
- // mainCamera: Camera | undefined
1513
- // } = {
1514
- // preparing: [],
1515
- // resolving: [],
1516
- // scripts: [],
1517
- // raycastTargets: [],
1518
- // mainCamera: undefined,
1519
- // mainCameraComponent: undefined,
1520
- // };
1521
- // // contains a list of functions to be called after loading is done
1522
- // const post_setup_callbacks = [];
1523
- // const pre_render_Callbacks = [];
1524
- // const post_render_callbacks = [];
1525
- // const new_scripts = [];
1526
- // const new_scripts_post_setup_callbacks = [];
1527
- // const new_scripts_pre_setup_callbacks = [];
1528
- // export {
1529
- // scene, renderer, composer,
1530
- // new_scripts,
1531
- // new_scripts_post_setup_callbacks, new_scripts_pre_setup_callbacks,
1532
- // sceneData,
1533
- // post_setup_callbacks,
1534
- // pre_render_Callbacks,
1535
- // post_render_callbacks
1536
- // }
1
+ import 'three/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodes.js';
2
+ import { Color, DepthTexture, NearestFilter, NoToneMapping, Object3D, PCFSoftShadowMap, PerspectiveCamera, RGBAFormat, Scene, SRGBColorSpace, Texture, WebGLRenderer, WebGLRenderTarget } from 'three';
3
+ /** @ts-ignore (not yet in types?) */
4
+ import { BasicNodeLibrary } from "three";
5
+ import * as Stats from 'three/examples/jsm/libs/stats.module.js';
6
+ import { nodeFrame } from "three/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js";
7
+ import { isDevEnvironment, LogType, showBalloonError, showBalloonMessage } from './debug/index.js';
8
+ import { Addressables } from './engine_addressables.js';
9
+ import { AnimationsRegistry } from './engine_animation.js';
10
+ import { Application } from './engine_application.js';
11
+ import { AssetDatabase } from './engine_assetdatabase.js';
12
+ import { VERSION } from './engine_constants.js';
13
+ import { ContextEvent, ContextRegistry } from './engine_context_registry.js';
14
+ import { WaitForPromise } from './engine_coroutine.js';
15
+ import { ObjectUtils } from "./engine_create_objects.js";
16
+ import { destroy, foreachComponent } from './engine_gameobject.js';
17
+ import { getLoader } from './engine_gltf.js';
18
+ import { Input } from './engine_input.js';
19
+ import { invokeLifecycleFunctions } from './engine_lifecycle_functions_internal.js';
20
+ import { LightDataRegistry } from './engine_lightdata.js';
21
+ import { LODsManager } from "./engine_lods.js";
22
+ import * as looputils from './engine_mainloop_utils.js';
23
+ import { NetworkConnection } from './engine_networking.js';
24
+ import { Physics } from './engine_physics.js';
25
+ import { PlayerViewManager } from './engine_playerview.js';
26
+ import { RendererData as SceneLighting } from './engine_scenelighting.js';
27
+ import { logHierarchy } from './engine_three_utils.js';
28
+ import { Time } from './engine_time.js';
29
+ import { patchTonemapping } from './engine_tonemapping.js';
30
+ import { deepClone, delay, DeviceUtilities, getParam } from './engine_utils.js';
31
+ import { NeedleMenu } from './webcomponents/needle menu/needle-menu.js';
32
+ const debug = getParam("debugcontext");
33
+ const stats = getParam("stats");
34
+ const debugActive = getParam("debugactive");
35
+ const debugframerate = getParam("debugframerate");
36
+ const debugCoroutine = getParam("debugcoroutine");
37
+ // this is where functions that setup unity scenes will be pushed into
38
+ // those will be accessed from our custom html element to load them into their context
39
+ export const build_scene_functions = {};
40
+ export class ContextArgs {
41
+ name;
42
+ /** for debugging only */
43
+ alias;
44
+ /** the hash is used as a seed when initially loading the scene files */
45
+ hash;
46
+ /** when true the context will not check if it's visible in the viewport and always update and render */
47
+ runInBackground;
48
+ /** the DOM element the context belongs to or is inside of (this does not have to be the canvas. use renderer.domElement if you want to access the dom canvas) */
49
+ domElement;
50
+ /** externally owned renderer */
51
+ renderer;
52
+ /** externally owned camera */
53
+ camera;
54
+ /** externally owned scene */
55
+ scene;
56
+ }
57
+ export var FrameEvent;
58
+ (function (FrameEvent) {
59
+ FrameEvent[FrameEvent["Start"] = -1] = "Start";
60
+ FrameEvent[FrameEvent["EarlyUpdate"] = 0] = "EarlyUpdate";
61
+ FrameEvent[FrameEvent["Update"] = 1] = "Update";
62
+ FrameEvent[FrameEvent["LateUpdate"] = 2] = "LateUpdate";
63
+ FrameEvent[FrameEvent["OnBeforeRender"] = 3] = "OnBeforeRender";
64
+ FrameEvent[FrameEvent["OnAfterRender"] = 4] = "OnAfterRender";
65
+ FrameEvent[FrameEvent["PrePhysicsStep"] = 9] = "PrePhysicsStep";
66
+ FrameEvent[FrameEvent["PostPhysicsStep"] = 10] = "PostPhysicsStep";
67
+ FrameEvent[FrameEvent["Undefined"] = -1] = "Undefined";
68
+ })(FrameEvent || (FrameEvent = {}));
69
+ export function registerComponent(script, context) {
70
+ if (!script)
71
+ return;
72
+ if (!script.isComponent) {
73
+ if (isDevEnvironment() || debug)
74
+ console.error("Registered script is not a Needle Engine component. \nThe script will be ignored. Please make sure your component extends \"Behaviour\" imported from \"@needle-tools/engine\"\n", script);
75
+ return;
76
+ }
77
+ if (!context) {
78
+ context = Context.Current;
79
+ if (debug)
80
+ console.warn("> Registering component without context");
81
+ }
82
+ const new_scripts = context?.new_scripts;
83
+ if (!new_scripts.includes(script)) {
84
+ new_scripts.push(script);
85
+ }
86
+ }
87
+ /**
88
+ * The context is the main object that holds all the data and state of the Needle Engine.
89
+ * It can be used to access the scene, renderer, camera, input, physics, networking, and more.
90
+ * @example
91
+ * ```typescript
92
+ * import { Behaviour } from "@needle-tools/engine";
93
+ * import { Mesh, BoxGeometry, MeshBasicMaterial } from "three";
94
+ * export class MyScript extends Behaviour {
95
+ * start() {
96
+ * console.log("Hello from MyScript");
97
+ * this.context.scene.add(new Mesh(new BoxGeometry(), new MeshBasicMaterial()));
98
+ * }
99
+ * }
100
+ * ```
101
+ */
102
+ export class Context {
103
+ static _defaultTargetFramerate = { value: 90, toString() { return this.value; } };
104
+ /** When a new context is created this is the framerate that will be used by default */
105
+ static get DefaultTargetFrameRate() {
106
+ return Context._defaultTargetFramerate.value;
107
+ }
108
+ /** When a new context is created this is the framerate that will be used by default */
109
+ static set DefaultTargetFrameRate(val) {
110
+ Context._defaultTargetFramerate.value = val;
111
+ }
112
+ static _defaultWebglRendererParameters = {
113
+ antialias: true,
114
+ alpha: false,
115
+ // Note: this is due to a bug on OSX devices. See NE-5370
116
+ powerPreference: (DeviceUtilities.isiOS() || DeviceUtilities.isMacOS()) ? "default" : "high-performance",
117
+ stencil: true,
118
+ // logarithmicDepthBuffer: true,
119
+ // reverseDepthBuffer: true, // https://github.com/mrdoob/three.js/issues/29770
120
+ };
121
+ /** The default parameters that will be used when creating a new WebGLRenderer.
122
+ * Modify in global context to change the default parameters for all new contexts.
123
+ * @example
124
+ * ```typescript
125
+ * import { Context } from "@needle-tools/engine";
126
+ * Context.DefaultWebGLRendererParameters.antialias = false;
127
+ * ```
128
+ */
129
+ static get DefaultWebGLRendererParameters() {
130
+ return Context._defaultWebglRendererParameters;
131
+ }
132
+ /** The needle engine version */
133
+ get version() {
134
+ return VERSION;
135
+ }
136
+ /** The currently active context. Only set during the update loops */
137
+ static get Current() {
138
+ return ContextRegistry.Current;
139
+ }
140
+ /** @internal this property should not be set by user code */
141
+ static set Current(context) {
142
+ ContextRegistry.Current = context;
143
+ }
144
+ static get All() {
145
+ return ContextRegistry.All;
146
+ }
147
+ /** The name of the context */
148
+ name;
149
+ /** An alias for the context */
150
+ alias;
151
+ /** When the renderer or camera are managed by an external process (e.g. when running in r3f context).
152
+ * When this is false you are responsible to call update(timestamp, xframe.
153
+ * It is also currently assumed that rendering is handled performed by an external process
154
+ * */
155
+ isManagedExternally = false;
156
+ /** set to true to pause the update loop. You can receive an event for it in your components.
157
+ * Note that script updates will not be called when paused */
158
+ isPaused = false;
159
+ /** When enabled the application will run while not visible on the page */
160
+ runInBackground = false;
161
+ /**
162
+ * Set to the target framerate you want your application to run in (you can use ?stats to check the fps)
163
+ * Set to undefined if you want to run at the maximum framerate
164
+ */
165
+ targetFrameRate;
166
+ /** Use a higher number for more accurate physics simulation.
167
+ * When undefined physics steps will be 1 for mobile devices and 5 for desktop devices
168
+ * Set to 0 to disable physics updates
169
+ * TODO: changing physics steps is currently not supported because then forces that we get from the character controller and rigidbody et al are not correct anymore - this needs to be properly tested before making this configureable
170
+ */
171
+ physicsSteps = 1;
172
+ /** used to append to loaded assets */
173
+ hash;
174
+ /** The `<needle-engine>` web component */
175
+ domElement;
176
+ appendHTMLElement(element) {
177
+ if (this.domElement.shadowRoot)
178
+ return this.domElement.shadowRoot.appendChild(element);
179
+ else
180
+ return this.domElement.appendChild(element);
181
+ }
182
+ get resolutionScaleFactor() { return this._resolutionScaleFactor; }
183
+ /** use to scale the resolution up or down of the renderer. default is 1 */
184
+ set resolutionScaleFactor(val) {
185
+ if (val === this._resolutionScaleFactor)
186
+ return;
187
+ if (typeof val !== "number")
188
+ return;
189
+ if (val <= 0) {
190
+ console.error("Invalid resolution scale factor", val);
191
+ return;
192
+ }
193
+ this._resolutionScaleFactor = val;
194
+ this.updateSize();
195
+ }
196
+ _resolutionScaleFactor = 1;
197
+ // domElement.clientLeft etc doesnt return absolute position
198
+ _boundingClientRectFrame = -1;
199
+ _boundingClientRect = null;
200
+ _domX;
201
+ _domY;
202
+ /** update bounding rects + domX, domY */
203
+ calculateBoundingClientRect() {
204
+ // workaround for mozilla webXR viewer
205
+ if (this.xr) {
206
+ this._domX = 0;
207
+ this._domY = 0;
208
+ return;
209
+ }
210
+ // TODO: cache this
211
+ if (this._boundingClientRectFrame === this.time.frame)
212
+ return;
213
+ this._boundingClientRectFrame = this.time.frame;
214
+ this._boundingClientRect = this.domElement.getBoundingClientRect();
215
+ this._domX = this._boundingClientRect.x;
216
+ this._domY = this._boundingClientRect.y;
217
+ }
218
+ /** The width of the `<needle-engine>` element on the website */
219
+ get domWidth() {
220
+ // for mozilla XR
221
+ if (this.isInAR)
222
+ return window.innerWidth;
223
+ return this.domElement.clientWidth;
224
+ }
225
+ /** The height of the `<needle-engine>` element on the website */
226
+ get domHeight() {
227
+ // for mozilla XR
228
+ if (this.isInAR)
229
+ return window.innerHeight;
230
+ return this.domElement.clientHeight;
231
+ }
232
+ /** the X position of the Needle Engine element on the website */
233
+ get domX() {
234
+ this.calculateBoundingClientRect();
235
+ return this._domX;
236
+ }
237
+ /** the Y position of the Needlee Engine element on the website */
238
+ get domY() {
239
+ this.calculateBoundingClientRect();
240
+ return this._domY;
241
+ }
242
+ get isInXR() { return this.renderer?.xr?.isPresenting || false; }
243
+ /** shorthand for `NeedleXRSession.active`
244
+ * Automatically set by NeedleXRSession when a XR session is active
245
+ * @returns the active XR session or null if no session is active
246
+ * */
247
+ xr = null;
248
+ get xrSessionMode() { return this.xr?.mode; }
249
+ get isInVR() { return this.xrSessionMode === "immersive-vr"; }
250
+ get isInAR() { return this.xrSessionMode === "immersive-ar"; }
251
+ /** If a XR session is active and in pass through mode (immersive-ar on e.g. Quest) */
252
+ get isInPassThrough() { return this.xr ? this.xr.isPassThrough : false; }
253
+ /** access the raw `XRSession` object (shorthand for `context.renderer.xr.getSession()`). For more control use `NeedleXRSession.active` */
254
+ get xrSession() { return this.renderer?.xr?.getSession(); }
255
+ /** @returns the latest XRFrame (if a XRSession is currently active)
256
+ * @link https://developer.mozilla.org/en-US/docs/Web/API/XRFrame
257
+ */
258
+ get xrFrame() { return this._xrFrame; }
259
+ /** @returns the current WebXR camera while the WebXRManager is active (shorthand for `context.renderer.xr.getCamera()`) */
260
+ get xrCamera() { return this.renderer.xr.isPresenting ? this.renderer?.xr?.getCamera() : undefined; }
261
+ _xrFrame = null;
262
+ get arOverlayElement() {
263
+ const el = this.domElement;
264
+ if (typeof el.getAROverlayContainer === "function")
265
+ return el.getAROverlayContainer();
266
+ return this.domElement;
267
+ }
268
+ /** Current event of the update cycle */
269
+ get currentFrameEvent() {
270
+ return this._currentFrameEvent;
271
+ }
272
+ _currentFrameEvent = FrameEvent.Undefined;
273
+ scene;
274
+ renderer;
275
+ composer = null;
276
+ // all scripts
277
+ scripts = [];
278
+ scripts_pausedChanged = [];
279
+ // scripts with update event
280
+ scripts_earlyUpdate = [];
281
+ scripts_update = [];
282
+ scripts_lateUpdate = [];
283
+ scripts_onBeforeRender = [];
284
+ scripts_onAfterRender = [];
285
+ scripts_WithCorroutines = [];
286
+ scripts_immersive_vr = [];
287
+ scripts_immersive_ar = [];
288
+ coroutines = {};
289
+ /** callbacks called once after the context has been created */
290
+ post_setup_callbacks = [];
291
+ /** called every frame at the beginning of the frame (after component start events and before earlyUpdate) */
292
+ pre_update_callbacks = [];
293
+ /** called every frame before rendering (after all component events) */
294
+ pre_render_callbacks = [];
295
+ /** called every frame after rendering (after all component events) */
296
+ post_render_callbacks = [];
297
+ /** called every frame befroe update (this list is emptied every frame) */
298
+ pre_update_oneshot_callbacks = [];
299
+ new_scripts = [];
300
+ new_script_start = [];
301
+ new_scripts_pre_setup_callbacks = [];
302
+ new_scripts_post_setup_callbacks = [];
303
+ new_scripts_xr = [];
304
+ /** The main camera component of the scene - this camera is used for rendering */
305
+ mainCameraComponent = undefined;
306
+ /** The main camera of the scene - this camera is used for rendering */
307
+ get mainCamera() {
308
+ if (this._mainCamera) {
309
+ return this._mainCamera;
310
+ }
311
+ if (this.mainCameraComponent) {
312
+ const cam = this.mainCameraComponent;
313
+ if (!cam.threeCamera)
314
+ cam.buildCamera();
315
+ return cam.threeCamera;
316
+ }
317
+ if (!this._fallbackCamera) {
318
+ this._fallbackCamera = new PerspectiveCamera(75, this.domWidth / this.domHeight, 0.1, 1000);
319
+ }
320
+ return this._fallbackCamera;
321
+ }
322
+ /** Set the main camera of the scene. If set to null the camera of the {@link mainCameraComponent} will be used - this camera is used for rendering */
323
+ set mainCamera(cam) {
324
+ this._mainCamera = cam;
325
+ }
326
+ _mainCamera = null;
327
+ _fallbackCamera = null;
328
+ application;
329
+ /** access animation mixer used by components in the scene */
330
+ animations;
331
+ /** access timings (current frame number, deltaTime, timeScale, ...) */
332
+ time;
333
+ input;
334
+ /** access physics related methods (e.g. raycasting). To access the phyiscs engine use `context.physics.engine` */
335
+ physics;
336
+ /** access networking methods (use it to send or listen to messages or join a networking backend) */
337
+ connection;
338
+ /**
339
+ * @deprecated AssetDataBase is deprecated
340
+ */
341
+ assets;
342
+ mainLight = null;
343
+ /** @deprecated Use sceneLighting */
344
+ get rendererData() { return this.sceneLighting; }
345
+ sceneLighting;
346
+ addressables;
347
+ lightmaps;
348
+ players;
349
+ lodsManager;
350
+ menu;
351
+ get isCreated() { return this._isCreated; }
352
+ _needsUpdateSize = false;
353
+ _isCreated = false;
354
+ _isCreating = false;
355
+ _isVisible = false;
356
+ _stats = stats ? new Stats.default() : null;
357
+ constructor(args) {
358
+ this.name = args?.name || "";
359
+ this.alias = args?.alias;
360
+ this.domElement = args?.domElement || document.body;
361
+ this.hash = args?.hash;
362
+ if (args?.renderer) {
363
+ this.renderer = args.renderer;
364
+ this.isManagedExternally = true;
365
+ }
366
+ if (args?.runInBackground !== undefined)
367
+ this.runInBackground = args.runInBackground;
368
+ if (args?.scene)
369
+ this.scene = args.scene;
370
+ else
371
+ this.scene = new Scene();
372
+ if (args?.camera)
373
+ this._mainCamera = args.camera;
374
+ this.application = new Application(this);
375
+ this.time = new Time();
376
+ this.input = new Input(this);
377
+ this.physics = new Physics(this);
378
+ this.connection = new NetworkConnection(this);
379
+ // eslint-disable-next-line deprecation/deprecation
380
+ this.assets = new AssetDatabase();
381
+ this.sceneLighting = new SceneLighting(this);
382
+ this.addressables = new Addressables(this);
383
+ this.lightmaps = new LightDataRegistry(this);
384
+ this.players = new PlayerViewManager(this);
385
+ this.menu = new NeedleMenu(this);
386
+ this.lodsManager = new LODsManager(this);
387
+ this.animations = new AnimationsRegistry(this);
388
+ const resizeCallback = () => this._needsUpdateSize = true;
389
+ window.addEventListener('resize', resizeCallback);
390
+ this._disposeCallbacks.push(() => window.removeEventListener('resize', resizeCallback));
391
+ const resizeObserver = new ResizeObserver(_ => this._needsUpdateSize = true);
392
+ resizeObserver.observe(this.domElement);
393
+ this._disposeCallbacks.push(() => resizeObserver.disconnect());
394
+ this._intersectionObserver = new IntersectionObserver(entries => {
395
+ this._isVisible = entries[0].isIntersecting;
396
+ });
397
+ this._disposeCallbacks.push(() => this._intersectionObserver?.disconnect());
398
+ ContextRegistry.register(this);
399
+ }
400
+ /** calling this function will dispose the current renderer and create a new one */
401
+ createNewRenderer(params) {
402
+ this.renderer?.dispose();
403
+ params = { ...Context.DefaultWebGLRendererParameters, ...params };
404
+ if (!params.canvas) {
405
+ // get canvas already configured in the Needle Engine Web Component
406
+ const canvas = this.domElement?.shadowRoot?.querySelector("canvas");
407
+ if (canvas) {
408
+ params.canvas = canvas;
409
+ if (debug) {
410
+ console.log("Using canvas from shadow root", canvas);
411
+ }
412
+ }
413
+ }
414
+ if (debug)
415
+ console.log("Using Renderer Parameters:", params, this.domElement);
416
+ this.renderer = new WebGLRenderer(params);
417
+ this.renderer.debug.checkShaderErrors = isDevEnvironment() || getParam("checkshadererrors") === true;
418
+ // some tonemapping other than "NONE" is required for adjusting exposure with EXR environments
419
+ this.renderer.toneMappingExposure = 1; // range [0...inf] instead of the usual -15..15
420
+ this.renderer.toneMapping = NoToneMapping; // could also set to LinearToneMapping, ACESFilmicToneMapping
421
+ this.renderer.setClearColor(new Color('lightgrey'), 0);
422
+ // // @ts-ignore
423
+ // this.renderer.alpha = false;
424
+ this.renderer.shadowMap.enabled = true;
425
+ this.renderer.shadowMap.type = PCFSoftShadowMap;
426
+ this.renderer.setSize(this.domWidth, this.domHeight);
427
+ this.renderer.outputColorSpace = SRGBColorSpace;
428
+ // Injecting the core nodes library here, like WebGPURenderer backends do
429
+ //@ts-ignore
430
+ this.renderer.nodes = {
431
+ library: new BasicNodeLibrary(),
432
+ modelViewMatrix: null,
433
+ modelNormalViewMatrix: null,
434
+ };
435
+ // this.renderer.toneMapping = AgXToneMapping;
436
+ this.lodsManager.setRenderer(this.renderer);
437
+ this.input.bindEvents();
438
+ }
439
+ _intersectionObserver = null;
440
+ internalOnUpdateVisible() {
441
+ this._intersectionObserver?.disconnect();
442
+ this._intersectionObserver?.observe(this.domElement);
443
+ }
444
+ _disposeCallbacks = [];
445
+ /** will request a renderer size update the next render call (will call updateSize the next update) */
446
+ requestSizeUpdate() { this._needsUpdateSize = true; }
447
+ /** Clamps the renderer max resolution. If undefined the max resolution is not clamped. Default is undefined */
448
+ maxRenderResolution;
449
+ /** Control the renderer devicePixelRatio.
450
+ * **Options**
451
+ * - `auto` - Needle Engine automatically sets the pixel ratio to the current window.devicePixelRatio.
452
+ * - `manual` - Needle Engine will not change the renderer pixel ratio. You can set it manually.
453
+ * - `number` - Needle Engine will set the pixel ratio to the given number. The change will be applied to the renderer and the composer (if used) at the end of the current frame.
454
+ */
455
+ get devicePixelRatio() { return this._devicePixelRatio; }
456
+ set devicePixelRatio(val) {
457
+ if (val !== this._devicePixelRatio) {
458
+ this._devicePixelRatio = val;
459
+ this._needsUpdateSize = true;
460
+ }
461
+ }
462
+ _devicePixelRatio = "auto";
463
+ /** update the renderer and canvas size */
464
+ updateSize(force = false) {
465
+ if (force || (!this.isManagedExternally && this.renderer.xr?.isPresenting === false)) {
466
+ this._needsUpdateSize = false;
467
+ const scaleFactor = this.resolutionScaleFactor;
468
+ let width = this.domWidth * scaleFactor;
469
+ let height = this.domHeight * scaleFactor;
470
+ if (this.maxRenderResolution) {
471
+ this.maxRenderResolution.x = Math.max(1, this.maxRenderResolution.x);
472
+ width = Math.min(this.maxRenderResolution.x, width);
473
+ this.maxRenderResolution.y = Math.max(1, this.maxRenderResolution.y);
474
+ height = Math.min(this.maxRenderResolution.y, height);
475
+ }
476
+ const camera = this.mainCamera;
477
+ this.updateAspect(camera);
478
+ this.renderer.setSize(width, height, true);
479
+ // avoid setting pixel values here since this can cause pingpong updates
480
+ // e.g. when system scale is set to 125%
481
+ // https://github.com/needle-tools/needle-engine-support/issues/69
482
+ this.renderer.domElement.style.width = "100%";
483
+ this.renderer.domElement.style.height = "100%";
484
+ const devicePixelRatio = typeof this.devicePixelRatio === "number"
485
+ ? this.devicePixelRatio
486
+ : this.devicePixelRatio === "auto"
487
+ ? window.devicePixelRatio
488
+ : undefined;
489
+ if (devicePixelRatio !== undefined) {
490
+ this.renderer.setPixelRatio(devicePixelRatio);
491
+ }
492
+ if (this.composer) {
493
+ this.composer.setSize?.call(this.composer, width, height);
494
+ if (devicePixelRatio !== undefined && "setPixelRatio" in this.composer && typeof this.composer.setPixelRatio === "function")
495
+ this.composer.setPixelRatio?.call(this.composer, window.devicePixelRatio);
496
+ }
497
+ }
498
+ }
499
+ updateAspect(camera, width, height) {
500
+ if (!camera)
501
+ return;
502
+ if (width === undefined)
503
+ width = this.domWidth;
504
+ if (height === undefined)
505
+ height = this.domHeight;
506
+ const aspectRatio = width / height;
507
+ if (camera.isPerspectiveCamera) {
508
+ const cam = camera;
509
+ const pa = cam.aspect;
510
+ cam.aspect = aspectRatio;
511
+ if (pa !== cam.aspect)
512
+ camera.updateProjectionMatrix();
513
+ }
514
+ else if (camera.isOrthographicCamera) {
515
+ const cam = camera;
516
+ // Maintain the camera's current vertical size (top - bottom)
517
+ const verticalSize = cam.top - cam.bottom;
518
+ // Calculate new horizontal size based on aspect ratio
519
+ const horizontalSize = verticalSize * aspectRatio;
520
+ // Update camera bounds while maintaining center position
521
+ const halfWidth = horizontalSize / 2;
522
+ const halfHeight = verticalSize / 2;
523
+ if (cam.left != -halfWidth || cam.top != halfHeight) {
524
+ cam.left = -halfWidth;
525
+ cam.right = halfWidth;
526
+ cam.top = halfHeight;
527
+ cam.bottom = -halfHeight;
528
+ camera.updateProjectionMatrix();
529
+ }
530
+ }
531
+ }
532
+ /** This will recreate the whole needle engine context and dispose the whole scene content
533
+ * All content will be reloaded (loading times might be faster due to browser caches)
534
+ * All scripts will be recreated */
535
+ recreate() {
536
+ this.clear();
537
+ this.create(this._originalCreationArgs);
538
+ }
539
+ _originalCreationArgs;
540
+ /** @deprecated use create. This method will be removed in a future version */
541
+ async onCreate(opts) {
542
+ return this.create(opts);
543
+ }
544
+ async create(opts) {
545
+ try {
546
+ this._isCreating = true;
547
+ if (opts !== this._originalCreationArgs)
548
+ this._originalCreationArgs = deepClone(opts);
549
+ window.addEventListener("unhandledrejection", this.onUnhandledRejection);
550
+ const res = await this.internalOnCreate(opts);
551
+ this._isCreated = res;
552
+ return res;
553
+ }
554
+ finally {
555
+ window.removeEventListener("unhandledrejection", this.onUnhandledRejection);
556
+ this._isCreating = false;
557
+ }
558
+ }
559
+ onUnhandledRejection = (event) => {
560
+ this.onError(event.reason);
561
+ };
562
+ /** Dispatches an error */
563
+ onError(error) {
564
+ this.domElement.dispatchEvent(new CustomEvent("error", { detail: error }));
565
+ }
566
+ /** Will destroy all scenes and objects in the scene
567
+ */
568
+ clear() {
569
+ ContextRegistry.dispatchCallback(ContextEvent.ContextClearing, this);
570
+ invokeLifecycleFunctions(this, ContextEvent.ContextClearing);
571
+ // NOTE: this does dispose the environment/background image too
572
+ // which is probably not desired if it is set via the skybox-image attribute
573
+ destroy(this.scene, true, true);
574
+ this.scene = new Scene();
575
+ this.addressables?.dispose();
576
+ this.lightmaps?.clear();
577
+ this.physics?.engine?.clearCaches();
578
+ this.lodsManager.disable();
579
+ if (!this.isManagedExternally) {
580
+ if (this.renderer) {
581
+ this.renderer.renderLists.dispose();
582
+ this.renderer.state.reset();
583
+ this.renderer.resetState();
584
+ }
585
+ }
586
+ // We do not want to clear the renderer here because when switching src we want to keep the last rendered frame in case the loading screen is not visible
587
+ // if a user wants to see the background they can still call setClearAlpha(0) and clear manually
588
+ ContextRegistry.dispatchCallback(ContextEvent.ContextCleared, this);
589
+ }
590
+ dispose() {
591
+ this.internalOnDestroy();
592
+ }
593
+ /**@deprecated use dispose() */
594
+ onDestroy() { this.internalOnDestroy(); }
595
+ internalOnDestroy() {
596
+ Context.Current = this;
597
+ ContextRegistry.dispatchCallback(ContextEvent.ContextDestroying, this);
598
+ invokeLifecycleFunctions(this, ContextEvent.ContextDestroying);
599
+ this.clear();
600
+ this.renderer?.setAnimationLoop(null);
601
+ if (this.renderer) {
602
+ this.renderer.setClearAlpha(0);
603
+ this.renderer.clear();
604
+ if (!this.isManagedExternally) {
605
+ if (debug)
606
+ console.log("Disposing renderer");
607
+ this.renderer.dispose();
608
+ }
609
+ }
610
+ this.scene = null;
611
+ this.renderer = null;
612
+ this.input.dispose();
613
+ this.menu.onDestroy();
614
+ this.animations.onDestroy();
615
+ for (const cb of this._disposeCallbacks) {
616
+ try {
617
+ cb();
618
+ }
619
+ catch (e) {
620
+ console.error("Error in on dispose callback:", e, cb);
621
+ }
622
+ }
623
+ if (this.domElement?.parentElement) {
624
+ this.domElement.parentElement.removeChild(this.domElement);
625
+ }
626
+ this._isCreated = false;
627
+ ContextRegistry.dispatchCallback(ContextEvent.ContextDestroyed, this);
628
+ invokeLifecycleFunctions(this, ContextEvent.ContextDestroyed);
629
+ ContextRegistry.unregister(this);
630
+ if (Context.Current === this) {
631
+ //@ts-ignore
632
+ Context.Current = null;
633
+ }
634
+ }
635
+ registerCoroutineUpdate(script, coroutine, evt) {
636
+ if (typeof coroutine?.next !== "function") {
637
+ console.error("Registered invalid coroutine function from " + script.name + "\nCoroutine functions must be generators: \"*myCoroutine() {...}\"\nStart a coroutine from a component by calling \"this.startCoroutine(myCoroutine())\"");
638
+ return coroutine;
639
+ }
640
+ if (!this.coroutines[evt])
641
+ this.coroutines[evt] = [];
642
+ this.coroutines[evt].push({ comp: script, main: coroutine });
643
+ return coroutine;
644
+ }
645
+ unregisterCoroutineUpdate(coroutine, evt) {
646
+ if (!this.coroutines[evt])
647
+ return;
648
+ const idx = this.coroutines[evt].findIndex(c => c.main === coroutine);
649
+ if (idx >= 0)
650
+ this.coroutines[evt].splice(idx, 1);
651
+ }
652
+ stopAllCoroutinesFrom(script) {
653
+ for (const evt in this.coroutines) {
654
+ const rout = this.coroutines[evt];
655
+ for (let i = rout.length - 1; i >= 0; i--) {
656
+ const r = rout[i];
657
+ if (r.comp === script) {
658
+ rout.splice(i, 1);
659
+ }
660
+ }
661
+ }
662
+ }
663
+ _cameraStack = [];
664
+ setCurrentCamera(cam) {
665
+ if (!cam)
666
+ return;
667
+ if (!cam.threeCamera)
668
+ cam.buildCamera(); // < to build camera
669
+ if (!cam.threeCamera) {
670
+ console.warn("Camera component is missing camera", cam);
671
+ return;
672
+ }
673
+ const index = this._cameraStack.indexOf(cam);
674
+ if (index >= 0)
675
+ this._cameraStack.splice(index, 1);
676
+ this._cameraStack.push(cam);
677
+ this.mainCameraComponent = cam;
678
+ const camera = cam.threeCamera;
679
+ if (camera.isPerspectiveCamera)
680
+ this.updateAspect(camera);
681
+ this.mainCameraComponent?.applyClearFlagsIfIsActiveCamera();
682
+ }
683
+ removeCamera(cam) {
684
+ if (!cam)
685
+ return;
686
+ const index = this._cameraStack.indexOf(cam);
687
+ if (index >= 0)
688
+ this._cameraStack.splice(index, 1);
689
+ if (this.mainCameraComponent === cam) {
690
+ this.mainCameraComponent = undefined;
691
+ if (this._cameraStack.length > 0) {
692
+ const last = this._cameraStack[this._cameraStack.length - 1];
693
+ this.setCurrentCamera(last);
694
+ }
695
+ }
696
+ }
697
+ _onBeforeRenderListeners = new Map();
698
+ _onAfterRenderListeners = new Map();
699
+ /** use this to subscribe to onBeforeRender events on threejs objects */
700
+ addBeforeRenderListener(target, callback) {
701
+ if (!this._onBeforeRenderListeners.has(target.uuid)) {
702
+ this._onBeforeRenderListeners.set(target.uuid, []);
703
+ target.onBeforeRender = this._createRenderCallbackWrapper(target, this._onBeforeRenderListeners);
704
+ }
705
+ this._onBeforeRenderListeners.get(target.uuid).push(callback);
706
+ }
707
+ removeBeforeRenderListener(target, callback) {
708
+ if (this._onBeforeRenderListeners.has(target.uuid)) {
709
+ const arr = this._onBeforeRenderListeners.get(target.uuid);
710
+ const idx = arr.indexOf(callback);
711
+ if (idx >= 0)
712
+ arr.splice(idx, 1);
713
+ }
714
+ }
715
+ /** use this to subscribe to onAfterRender events on threejs objects */
716
+ addAfterRenderListener(target, callback) {
717
+ if (!this._onAfterRenderListeners.has(target.uuid)) {
718
+ this._onAfterRenderListeners.set(target.uuid, []);
719
+ target.onAfterRender = this._createRenderCallbackWrapper(target, this._onAfterRenderListeners);
720
+ }
721
+ this._onAfterRenderListeners.get(target.uuid)?.push(callback);
722
+ }
723
+ removeAfterRenderListener(target, callback) {
724
+ if (this._onAfterRenderListeners.has(target.uuid)) {
725
+ const arr = this._onAfterRenderListeners.get(target.uuid);
726
+ const idx = arr.indexOf(callback);
727
+ if (idx >= 0)
728
+ arr.splice(idx, 1);
729
+ }
730
+ }
731
+ _createRenderCallbackWrapper(target, array) {
732
+ return (renderer, scene, camera, geometry, material, group) => {
733
+ const arr = array.get(target.uuid);
734
+ if (!arr)
735
+ return;
736
+ for (let i = 0; i < arr.length; i++) {
737
+ const fn = arr[i];
738
+ fn(renderer, scene, camera, geometry, material, group);
739
+ }
740
+ };
741
+ }
742
+ _requireDepthTexture = false;
743
+ _requireColorTexture = false;
744
+ _renderTarget;
745
+ _isRendering = false;
746
+ get isRendering() { return this._isRendering; }
747
+ setRequireDepth(val) {
748
+ this._requireDepthTexture = val;
749
+ }
750
+ setRequireColor(val) {
751
+ this._requireColorTexture = val;
752
+ }
753
+ get depthTexture() {
754
+ return this._renderTarget?.depthTexture || null;
755
+ }
756
+ get opaqueColorTexture() {
757
+ return this._renderTarget?.texture || null;
758
+ }
759
+ /** returns true if the dom element is visible on screen */
760
+ get isVisibleToUser() {
761
+ if (this.isInXR)
762
+ return true;
763
+ if (!this._isVisible)
764
+ return false;
765
+ const style = getComputedStyle(this.domElement);
766
+ return style.visibility !== "hidden" && style.display !== "none" && style.opacity !== "0";
767
+ }
768
+ _createId = 0;
769
+ async internalOnCreate(opts) {
770
+ const createId = ++this._createId;
771
+ if (debug)
772
+ console.log("Creating context", this.name, opts);
773
+ // wait for async imported dependencies to be loaded
774
+ // see https://linear.app/needle/issue/NE-4445
775
+ const dependenciesReady = globalThis["needle:dependencies:ready"];
776
+ if (dependenciesReady instanceof Promise) {
777
+ if (debug)
778
+ console.log("Waiting for dependencies to be ready");
779
+ await dependenciesReady
780
+ .catch(err => {
781
+ if (debug || isDevEnvironment()) {
782
+ showBalloonError("Needle Engine dependencies failed to load. Please check the console for more details");
783
+ const printedError = false;
784
+ if (err instanceof ReferenceError) {
785
+ let offendingComponentName = "YourComponentName";
786
+ const offendingComponentStartIndex = err.message.indexOf("'");
787
+ if (offendingComponentStartIndex > 0) {
788
+ const offendingComponentEndIndex = err.message.indexOf("'", offendingComponentStartIndex + 1);
789
+ if (offendingComponentEndIndex > 0) {
790
+ const name = err.message.substring(offendingComponentStartIndex + 1, offendingComponentEndIndex);
791
+ if (name.length > 3)
792
+ offendingComponentName = name;
793
+ }
794
+ }
795
+ console.error(`Needle Engine dependencies failed to load:\n\n# Make sure you don't have circular imports in your scripts!\n\nPossible solutions: \n→ Replace @serializable(${offendingComponentName}) in your script with @serializable(Behaviour)\n→ If you only need type information try importing the type only, e.g: import { type ${offendingComponentName} }\n\n---`, err);
796
+ return;
797
+ }
798
+ if (!printedError) {
799
+ console.error("Needle Engine dependencies failed to load", err);
800
+ }
801
+ }
802
+ })
803
+ .then(() => {
804
+ if (debug)
805
+ console.log("Needle Engine dependencies are ready");
806
+ });
807
+ }
808
+ this.clear();
809
+ // stop the animation loop if its running during creation
810
+ // since we do not want to start enabling scripts etc before they are deserialized
811
+ if (this.isManagedExternally === false) {
812
+ this.createNewRenderer();
813
+ this.renderer?.setAnimationLoop(null);
814
+ }
815
+ await delay(1);
816
+ Context.Current = this;
817
+ await ContextRegistry.dispatchCallback(ContextEvent.ContextCreationStart, this);
818
+ // load and create scene
819
+ let prepare_succeeded = true;
820
+ let loadedFiles;
821
+ try {
822
+ Context.Current = this;
823
+ if (opts) {
824
+ loadedFiles = await this.internalLoadInitialContent(createId, opts);
825
+ }
826
+ else
827
+ loadedFiles = [];
828
+ }
829
+ catch (err) {
830
+ console.error(err);
831
+ prepare_succeeded = false;
832
+ }
833
+ if (!prepare_succeeded) {
834
+ this.onError("Failed to load initial content");
835
+ return false;
836
+ }
837
+ if (createId !== this._createId || opts?.abortSignal?.aborted) {
838
+ return false;
839
+ }
840
+ this.internalOnUpdateVisible();
841
+ if (!this.renderer) {
842
+ if (debug)
843
+ console.warn("Context has no renderer (perhaps it was disconnected?", this.domElement.isConnected);
844
+ return false;
845
+ }
846
+ if (!this.isManagedExternally && !this.domElement.shadowRoot) {
847
+ this.domElement.prepend(this.renderer.domElement);
848
+ }
849
+ Context.Current = this;
850
+ // TODO: we could configure if we need physics
851
+ // await this.physics.engine?.initialize();
852
+ // Setup
853
+ Context.Current = this;
854
+ for (let i = 0; i < this.new_scripts.length; i++) {
855
+ const script = this.new_scripts[i];
856
+ if (script.gameObject !== undefined && script.gameObject !== null) {
857
+ if (script.gameObject.userData === undefined)
858
+ script.gameObject.userData = {};
859
+ if (script.gameObject.userData.components === undefined)
860
+ script.gameObject.userData.components = [];
861
+ const arr = script.gameObject.userData.components;
862
+ if (!arr.includes(script))
863
+ arr.push(script);
864
+ }
865
+ // if (script.gameObject && !this.raycastTargets.includes(script.gameObject)) {
866
+ // this.raycastTargets.push(script.gameObject);
867
+ // }
868
+ }
869
+ // const context = new SerializationContext(this.scene);
870
+ // for (let i = 0; i < this.new_scripts.length; i++) {
871
+ // const script = this.new_scripts[i];
872
+ // const ser = script as unknown as ISerializable;
873
+ // if (ser.$serializedTypes === undefined) continue;
874
+ // context.context = this;
875
+ // context.object = script.gameObject;
876
+ // deserializeObject(ser, script, context);
877
+ // }
878
+ // resolve post setup callbacks (things that rely on threejs objects having references to components)
879
+ if (this.post_setup_callbacks) {
880
+ for (let i = 0; i < this.post_setup_callbacks.length; i++) {
881
+ Context.Current = this;
882
+ await this.post_setup_callbacks[i](this);
883
+ }
884
+ }
885
+ if (!this._mainCamera) {
886
+ Context.Current = this;
887
+ let camera = null;
888
+ foreachComponent(this.scene, comp => {
889
+ const cam = comp;
890
+ if (cam?.isCamera) {
891
+ looputils.updateActiveInHierarchyWithoutEventCall(cam.gameObject);
892
+ if (!cam.activeAndEnabled)
893
+ return undefined;
894
+ if (cam.tag === "MainCamera") {
895
+ camera = cam;
896
+ return true;
897
+ }
898
+ else
899
+ camera = cam;
900
+ }
901
+ return undefined;
902
+ });
903
+ if (camera) {
904
+ this.setCurrentCamera(camera);
905
+ }
906
+ else {
907
+ const res = ContextRegistry.dispatchCallback(ContextEvent.MissingCamera, this, { files: loadedFiles });
908
+ if (!res && !this.mainCamera && !this.isManagedExternally)
909
+ console.warn("Missing camera in main scene", this);
910
+ }
911
+ }
912
+ this.input.bindEvents();
913
+ Context.Current = this;
914
+ looputils.processNewScripts(this);
915
+ // We have to step once so that colliders that have been created in onEnable can be raycasted in start
916
+ if (this.physics.engine) {
917
+ this.physics.engine?.step(0);
918
+ this.physics.engine?.postStep();
919
+ }
920
+ // const mainCam = this.mainCameraComponent as Camera;
921
+ // if (mainCam) {
922
+ // mainCam.applyClearFlagsIfIsActiveCamera();
923
+ // }
924
+ if (!this.isManagedExternally && this.composer && this.mainCamera) {
925
+ // TODO: import postprocessing async
926
+ // const renderPass = new RenderPass(this.scene, this.mainCamera);
927
+ // this.renderer.setSize(this.domWidth, this.domHeight);
928
+ // this.composer.addPass(renderPass);
929
+ // this.composer.setSize(this.domWidth, this.domHeight);
930
+ }
931
+ this._needsUpdateSize = true;
932
+ if (this._stats) {
933
+ this._stats.showPanel(0);
934
+ this._stats.dom.style.position = "absolute"; // (default is fixed)
935
+ this.domElement.shadowRoot?.appendChild(this._stats.dom);
936
+ }
937
+ if (debug)
938
+ logHierarchy(this.scene, true);
939
+ // If no target framerate was set we use the default
940
+ if (this.targetFrameRate === undefined) {
941
+ if (debug)
942
+ console.warn("No target framerate set, using default", Context.DefaultTargetFrameRate);
943
+ // the _defaultTargetFramerate is intentionally an object so it can be changed at any time if not explictly set by the user
944
+ this.targetFrameRate = Context._defaultTargetFramerate;
945
+ }
946
+ else if (debug)
947
+ console.log("Target framerate set to", this.targetFrameRate);
948
+ this._dispatchReadyAfterFrame = true;
949
+ const res = ContextRegistry.dispatchCallback(ContextEvent.ContextCreated, this, { files: loadedFiles });
950
+ if (res) {
951
+ if ("internalSetLoadingMessage" in this.domElement && typeof this.domElement.internalSetLoadingMessage === "function")
952
+ this.domElement?.internalSetLoadingMessage("finish loading");
953
+ await res;
954
+ }
955
+ if (opts?.abortSignal?.aborted) {
956
+ return false;
957
+ }
958
+ invokeLifecycleFunctions(this, ContextEvent.ContextCreated);
959
+ if (debug)
960
+ console.log("Context Created...", this.renderer, this.renderer.domElement);
961
+ this._isCreating = false;
962
+ if (!this.isManagedExternally && !opts?.abortSignal?.aborted)
963
+ this.restartRenderLoop();
964
+ return true;
965
+ }
966
+ async internalLoadInitialContent(createId, args) {
967
+ const results = new Array();
968
+ // early out if we dont have any files to load
969
+ if (args.files.length === 0)
970
+ return results;
971
+ const files = [...args.files];
972
+ const progressArg = {
973
+ name: "",
974
+ progress: null,
975
+ index: 0,
976
+ count: files.length
977
+ };
978
+ const loader = getLoader();
979
+ // this hash should be constant since it is used to initialize the UIDProvider per initially loaded scene
980
+ const loadingHash = 0;
981
+ for (let i = 0; i < files.length; i++) {
982
+ if (args.abortSignal?.aborted) {
983
+ if (debug)
984
+ console.log("Aborting loading because of abort signal");
985
+ break;
986
+ }
987
+ // abort loading if the create id has changed
988
+ if (createId !== this._createId) {
989
+ if (debug)
990
+ console.log("Aborting loading because create id changed", createId, this._createId);
991
+ break;
992
+ }
993
+ const file = files[i];
994
+ args?.onLoadingStart?.call(this, i, file);
995
+ if (debug)
996
+ console.log("Context Load " + file);
997
+ const res = await loader.loadSync(this, file, file, loadingHash, prog => {
998
+ if (args.abortSignal?.aborted)
999
+ return;
1000
+ progressArg.name = file;
1001
+ progressArg.progress = prog;
1002
+ progressArg.index = i;
1003
+ progressArg.count = files.length;
1004
+ args.onLoadingProgress?.call(this, progressArg);
1005
+ });
1006
+ args?.onLoadingFinished?.call(this, i, file, res ?? null);
1007
+ if (res) {
1008
+ results.push({
1009
+ src: file,
1010
+ file: res
1011
+ });
1012
+ }
1013
+ else {
1014
+ // a file could not be loaded
1015
+ console.warn("Could not load file: " + file);
1016
+ }
1017
+ }
1018
+ // if the id was changed while still loading
1019
+ // then we want to cleanup/destroy previously loaded files
1020
+ if (createId !== this._createId || args.abortSignal?.aborted) {
1021
+ if (debug)
1022
+ console.log("Aborting loading because create id changed or abort signal was set", createId, this._createId);
1023
+ for (const res of results) {
1024
+ if (res && res.file) {
1025
+ for (const scene of res.file.scenes)
1026
+ destroy(scene, true, true);
1027
+ }
1028
+ }
1029
+ }
1030
+ // otherwise we want to add the loaded files to the current scene
1031
+ else {
1032
+ let anyModelFound = false;
1033
+ for (const res of results) {
1034
+ if (res && res.file) {
1035
+ // TODO: should we load all scenes in a glTF here?
1036
+ if (res.file.scene) {
1037
+ anyModelFound = true;
1038
+ this.scene.add(res.file.scene);
1039
+ }
1040
+ else {
1041
+ console.warn("No scene found in loaded file");
1042
+ }
1043
+ }
1044
+ }
1045
+ // If the loaded files do not contain ANY model
1046
+ // We then attempt to create a mesh from each material in the loaded files to visualize it
1047
+ // It's ok to do this at this point because we know the context has been cleared because the whole `src` attribute has been set
1048
+ if (!anyModelFound) {
1049
+ for (const res of results) {
1050
+ if (res && res.file && "parser" in res.file) {
1051
+ let y = 0;
1052
+ if (!Array.isArray(res.file.parser.json.materials))
1053
+ continue;
1054
+ for (let i = 0; i < res.file.parser.json.materials.length; i++) {
1055
+ const mat = await res.file.parser.getDependency("material", i);
1056
+ const parent = new Object3D();
1057
+ parent.position.x = i * 1.1;
1058
+ parent.position.y = y;
1059
+ this.scene.add(parent);
1060
+ ObjectUtils.createPrimitive("ShaderBall", {
1061
+ parent,
1062
+ material: mat
1063
+ });
1064
+ }
1065
+ y += 1;
1066
+ }
1067
+ }
1068
+ }
1069
+ }
1070
+ return results;
1071
+ }
1072
+ /** Sets the animation loop.
1073
+ * Can not be done while creating the context or when disposed
1074
+ **/
1075
+ restartRenderLoop() {
1076
+ if (!this.renderer) {
1077
+ console.error("Can not start render loop without renderer");
1078
+ return false;
1079
+ }
1080
+ if (this._isCreating) {
1081
+ console.warn("Can not start render loop while creating context");
1082
+ return false;
1083
+ }
1084
+ this.renderer.setAnimationLoop((timestamp, frame) => {
1085
+ if (this.isManagedExternally)
1086
+ return;
1087
+ this.update(timestamp, frame);
1088
+ });
1089
+ return true;
1090
+ }
1091
+ _renderlooperrors = 0;
1092
+ /** Performs a full update step including script callbacks, rendering (unless isManagedExternally is set to false) and post render callbacks */
1093
+ update(timestamp, frame) {
1094
+ if (frame === undefined)
1095
+ frame = null;
1096
+ if (isDevEnvironment() || debug || looputils.hasNewScripts()) {
1097
+ try {
1098
+ //performance.mark('update.start');
1099
+ this.internalStep(timestamp, frame);
1100
+ this._renderlooperrors = 0;
1101
+ //performance.mark('update.end');
1102
+ //performance.measure('NE Frame', 'update.start', 'update.end');
1103
+ }
1104
+ catch (err) {
1105
+ this._renderlooperrors += 1;
1106
+ if ((isDevEnvironment() || debug) && (err instanceof Error || err instanceof TypeError))
1107
+ showBalloonMessage(`Caught unhandled exception during render-loop - see console for details.`, LogType.Error);
1108
+ console.error("Frame #" + this.time.frame + "\n", err);
1109
+ if (this._renderlooperrors >= 3) {
1110
+ console.warn("Stopping render loop due to error");
1111
+ this.renderer.setAnimationLoop(null);
1112
+ }
1113
+ this.domElement.dispatchEvent(new CustomEvent("error", { detail: err }));
1114
+ }
1115
+ }
1116
+ else {
1117
+ this.internalStep(timestamp, frame);
1118
+ }
1119
+ }
1120
+ /** Call to **manually** perform physics steps.
1121
+ * By default the context uses the `physicsSteps` property to perform steps during the update loop
1122
+ * If you just want to increase the accuracy of physics you can instead set the `physicsSteps` property to a higher value
1123
+ * */
1124
+ updatePhysics(steps) {
1125
+ this.internalUpdatePhysics(steps);
1126
+ }
1127
+ _lastTimestamp = 0;
1128
+ _accumulatedTime = 0;
1129
+ _dispatchReadyAfterFrame = false;
1130
+ // TODO: we need to skip after render callbacks if the render loop is managed externally. When changing this we also need to to update the r3f sample
1131
+ internalStep(timestamp, frame) {
1132
+ if (this.internalOnBeforeRender(timestamp, frame) === false)
1133
+ return;
1134
+ this.internalOnRender();
1135
+ this.internalOnAfterRender();
1136
+ }
1137
+ internalOnBeforeRender(timestamp, frame) {
1138
+ // If we don't auto reset we get wrong stats in WebXR. AutoReset was turned off to support custom blits and count them too
1139
+ this.renderer.info.autoReset = true;
1140
+ const sessionStarted = frame !== null && this._xrFrame === null;
1141
+ this._xrFrame = frame;
1142
+ if (sessionStarted) {
1143
+ this.domElement.dispatchEvent(new CustomEvent("xr-session-started", { detail: { context: this, session: this.xrSession, frame: frame } }));
1144
+ }
1145
+ this._currentFrameEvent = FrameEvent.Undefined;
1146
+ if (this.isManagedExternally === false && this.isInXR === false && this.targetFrameRate !== undefined) {
1147
+ if (this._lastTimestamp === 0)
1148
+ this._lastTimestamp = timestamp;
1149
+ this._accumulatedTime += (timestamp - this._lastTimestamp) / 1000;
1150
+ this._lastTimestamp = timestamp;
1151
+ let targetFrameRate = this.targetFrameRate;
1152
+ if (typeof targetFrameRate === "object")
1153
+ targetFrameRate = targetFrameRate.value;
1154
+ // if(debug) console.log(this._accumulatedTime, (1 / (targetFrameRate)))
1155
+ if (this._accumulatedTime < (1 / (targetFrameRate + 1))) {
1156
+ return false;
1157
+ }
1158
+ this._accumulatedTime = 0;
1159
+ }
1160
+ this._stats?.begin();
1161
+ Context.Current = this;
1162
+ if (this.onHandlePaused())
1163
+ return false;
1164
+ Context.Current = this;
1165
+ this.time.update();
1166
+ if (debugframerate)
1167
+ console.log("FPS", (this.time.smoothedFps).toFixed(0));
1168
+ looputils.processNewScripts(this);
1169
+ looputils.updateIsActive(this.scene);
1170
+ looputils.processStart(this);
1171
+ invokeLifecycleFunctions(this, FrameEvent.Start);
1172
+ while (this._cameraStack.length > 0 && (!this.mainCameraComponent || this.mainCameraComponent.destroyed)) {
1173
+ this._cameraStack.splice(this._cameraStack.length - 1, 1);
1174
+ const last = this._cameraStack[this._cameraStack.length - 1];
1175
+ this.setCurrentCamera(last);
1176
+ }
1177
+ if (this.pre_update_oneshot_callbacks) {
1178
+ for (const i in this.pre_update_oneshot_callbacks) {
1179
+ this.pre_update_oneshot_callbacks[i]();
1180
+ }
1181
+ this.pre_update_oneshot_callbacks.length = 0;
1182
+ }
1183
+ if (this.pre_update_callbacks) {
1184
+ for (const i in this.pre_update_callbacks) {
1185
+ this.pre_update_callbacks[i]();
1186
+ }
1187
+ }
1188
+ this._currentFrameEvent = FrameEvent.EarlyUpdate;
1189
+ for (let i = 0; i < this.scripts_earlyUpdate.length; i++) {
1190
+ const script = this.scripts_earlyUpdate[i];
1191
+ if (!script.activeAndEnabled)
1192
+ continue;
1193
+ if (script.earlyUpdate !== undefined) {
1194
+ Context.Current = this;
1195
+ script.earlyUpdate();
1196
+ }
1197
+ }
1198
+ this.executeCoroutines(FrameEvent.EarlyUpdate);
1199
+ invokeLifecycleFunctions(this, FrameEvent.EarlyUpdate);
1200
+ if (this.onHandlePaused())
1201
+ return false;
1202
+ this._currentFrameEvent = FrameEvent.Update;
1203
+ for (let i = 0; i < this.scripts_update.length; i++) {
1204
+ const script = this.scripts_update[i];
1205
+ if (!script.activeAndEnabled)
1206
+ continue;
1207
+ if (script.update !== undefined) {
1208
+ Context.Current = this;
1209
+ script.update();
1210
+ }
1211
+ }
1212
+ this.executeCoroutines(FrameEvent.Update);
1213
+ invokeLifecycleFunctions(this, FrameEvent.Update);
1214
+ if (this.onHandlePaused())
1215
+ return false;
1216
+ this._currentFrameEvent = FrameEvent.LateUpdate;
1217
+ for (let i = 0; i < this.scripts_lateUpdate.length; i++) {
1218
+ const script = this.scripts_lateUpdate[i];
1219
+ if (!script.activeAndEnabled)
1220
+ continue;
1221
+ if (script.lateUpdate !== undefined) {
1222
+ Context.Current = this;
1223
+ script.lateUpdate();
1224
+ }
1225
+ }
1226
+ // this.mainLight = null;
1227
+ this.executeCoroutines(FrameEvent.LateUpdate);
1228
+ invokeLifecycleFunctions(this, FrameEvent.LateUpdate);
1229
+ if (this.onHandlePaused())
1230
+ return false;
1231
+ if (this.physicsSteps === undefined) {
1232
+ this.physicsSteps = 1;
1233
+ }
1234
+ if (this.physics.engine && this.physicsSteps > 0) {
1235
+ this.internalUpdatePhysics(this.physicsSteps);
1236
+ }
1237
+ if (this.onHandlePaused())
1238
+ return false;
1239
+ if (this.isVisibleToUser || this.runInBackground) {
1240
+ this._currentFrameEvent = FrameEvent.OnBeforeRender;
1241
+ // should we move these callbacks in the regular three onBeforeRender events?
1242
+ for (let i = 0; i < this.scripts_onBeforeRender.length; i++) {
1243
+ const script = this.scripts_onBeforeRender[i];
1244
+ if (!script.activeAndEnabled)
1245
+ continue;
1246
+ // if(script.isActiveAndEnabled === false) continue;
1247
+ if (script.onBeforeRender !== undefined) {
1248
+ Context.Current = this;
1249
+ script.onBeforeRender(frame);
1250
+ }
1251
+ }
1252
+ this.executeCoroutines(FrameEvent.OnBeforeRender);
1253
+ invokeLifecycleFunctions(this, FrameEvent.OnBeforeRender);
1254
+ if (this._needsUpdateSize)
1255
+ this.updateSize();
1256
+ if (this.pre_render_callbacks) {
1257
+ for (const i in this.pre_render_callbacks) {
1258
+ this.pre_render_callbacks[i](frame);
1259
+ }
1260
+ }
1261
+ }
1262
+ return true;
1263
+ }
1264
+ internalUpdatePhysics(steps) {
1265
+ if (!this.physics.engine)
1266
+ return false;
1267
+ const physicsSteps = steps;
1268
+ const dt = this.time.deltaTime / physicsSteps;
1269
+ for (let i = 0; i < physicsSteps; i++) {
1270
+ this._currentFrameEvent = FrameEvent.PrePhysicsStep;
1271
+ this.executeCoroutines(FrameEvent.PrePhysicsStep);
1272
+ this.physics.engine.step(dt);
1273
+ this._currentFrameEvent = FrameEvent.PostPhysicsStep;
1274
+ this.executeCoroutines(FrameEvent.PostPhysicsStep);
1275
+ }
1276
+ this.physics.engine.postStep();
1277
+ return true;
1278
+ }
1279
+ internalOnRender() {
1280
+ if (!this.isManagedExternally) {
1281
+ // when loading assets we compile them async after GLTFLoader is done
1282
+ // but as a fallback we still register them (if e.g. there's no camera for compile async)
1283
+ looputils.runPrewarm(this);
1284
+ this._currentFrameEvent = FrameEvent.Undefined;
1285
+ nodeFrame.update();
1286
+ this.renderNow();
1287
+ this._currentFrameEvent = FrameEvent.OnAfterRender;
1288
+ }
1289
+ }
1290
+ internalOnAfterRender() {
1291
+ if (this.isVisibleToUser || this.runInBackground) {
1292
+ for (let i = 0; i < this.scripts_onAfterRender.length; i++) {
1293
+ const script = this.scripts_onAfterRender[i];
1294
+ if (!script.activeAndEnabled)
1295
+ continue;
1296
+ if (script.onAfterRender !== undefined) {
1297
+ Context.Current = this;
1298
+ script.onAfterRender();
1299
+ }
1300
+ }
1301
+ this.executeCoroutines(FrameEvent.OnAfterRender);
1302
+ invokeLifecycleFunctions(this, FrameEvent.OnAfterRender);
1303
+ if (this.post_render_callbacks) {
1304
+ for (const i in this.post_render_callbacks) {
1305
+ this.post_render_callbacks[i]();
1306
+ }
1307
+ }
1308
+ }
1309
+ this._currentFrameEvent = -1;
1310
+ this.connection.sendBufferedMessagesNow();
1311
+ if (this._stats) {
1312
+ this._stats.end();
1313
+ if (this.time.frameCount % 150 === 0)
1314
+ console.log(this.renderer.info.render.calls + " DrawCalls", "\nRender:", { ...this.renderer.info.render }, "\nMemory:", { ...this.renderer.info.memory }, "\nTarget Framerate: " + this.targetFrameRate);
1315
+ }
1316
+ if (this._dispatchReadyAfterFrame) {
1317
+ this._dispatchReadyAfterFrame = false;
1318
+ this.domElement.dispatchEvent(new CustomEvent("ready"));
1319
+ ContextRegistry.dispatchCallback(ContextEvent.ContextFirstFrameRendered, this);
1320
+ }
1321
+ }
1322
+ renderNow(camera) {
1323
+ if (!camera) {
1324
+ camera = this.mainCamera;
1325
+ if (!camera)
1326
+ return false;
1327
+ }
1328
+ this.handleRendererContextLost();
1329
+ this._isRendering = true;
1330
+ this.renderRequiredTextures();
1331
+ if (this.renderer.toneMapping !== NoToneMapping)
1332
+ patchTonemapping(this);
1333
+ if (this.composer && !this.isInXR) {
1334
+ // if a camera is passed in we need to check if we need to update the composer's camera
1335
+ if (camera && "setMainCamera" in this.composer) {
1336
+ const currentPassesCamera = this.composer.passes[0]?.mainCamera;
1337
+ if (currentPassesCamera != camera)
1338
+ this.composer.setMainCamera(camera);
1339
+ }
1340
+ this.composer.render(this.time.deltaTime);
1341
+ }
1342
+ else if (camera) {
1343
+ // Workaround for issue on Vision Pro –
1344
+ // depth buffer is not cleared between eye draws, despite the spec...
1345
+ if (this.isInXR && DeviceUtilities.isMacOS())
1346
+ this.renderer.clearDepth();
1347
+ this.renderer.render(this.scene, camera);
1348
+ }
1349
+ this._isRendering = false;
1350
+ return true;
1351
+ }
1352
+ _contextRestoreTries = 0;
1353
+ handleRendererContextLost() {
1354
+ // Try to restore the context every x frames
1355
+ if (this.time.frame % 10 && this.renderer.getContext().isContextLost()) {
1356
+ if (this._contextRestoreTries++ < 100) {
1357
+ console.warn("Attempting to recover WebGL context...");
1358
+ this.renderer.forceContextRestore();
1359
+ }
1360
+ }
1361
+ }
1362
+ /** returns true if we should return out of the frame loop */
1363
+ _wasPaused = false;
1364
+ onHandlePaused() {
1365
+ const paused = this.evaluatePaused();
1366
+ if (this._wasPaused !== paused) {
1367
+ if (debugActive)
1368
+ console.log("Paused?", paused, "context:" + this.alias);
1369
+ for (let i = 0; i < this.scripts_pausedChanged.length; i++) {
1370
+ const script = this.scripts_pausedChanged[i];
1371
+ if (!script.activeAndEnabled)
1372
+ continue;
1373
+ if (script.onPausedChanged !== undefined) {
1374
+ Context.Current = this;
1375
+ script.onPausedChanged(paused, this._wasPaused);
1376
+ }
1377
+ }
1378
+ }
1379
+ this._wasPaused = paused;
1380
+ return paused;
1381
+ }
1382
+ evaluatePaused() {
1383
+ if (this.isInXR)
1384
+ return false;
1385
+ if (this.isPaused)
1386
+ return true;
1387
+ // if the element is not visible use the runInBackground flag to determine if we should continue
1388
+ if (this.runInBackground) {
1389
+ return false;
1390
+ }
1391
+ const paused = !this.isVisibleToUser;
1392
+ return paused;
1393
+ }
1394
+ renderRequiredTextures() {
1395
+ if (!this.mainCamera)
1396
+ return;
1397
+ if (!this._requireDepthTexture && !this._requireColorTexture)
1398
+ return;
1399
+ if (!this._renderTarget) {
1400
+ this._renderTarget = new WebGLRenderTarget(this.domWidth, this.domHeight);
1401
+ if (this._requireDepthTexture) {
1402
+ const dt = new DepthTexture(this.domWidth, this.domHeight);
1403
+ ;
1404
+ this._renderTarget.depthTexture = dt;
1405
+ }
1406
+ if (this._requireColorTexture) {
1407
+ this._renderTarget.texture = new Texture();
1408
+ this._renderTarget.texture.generateMipmaps = false;
1409
+ this._renderTarget.texture.minFilter = NearestFilter;
1410
+ this._renderTarget.texture.magFilter = NearestFilter;
1411
+ this._renderTarget.texture.format = RGBAFormat;
1412
+ }
1413
+ }
1414
+ const rt = this._renderTarget;
1415
+ if (rt.texture) {
1416
+ rt.texture.colorSpace = this.renderer.outputColorSpace;
1417
+ }
1418
+ const prevTarget = this.renderer.getRenderTarget();
1419
+ this.renderer.setRenderTarget(rt);
1420
+ this.renderer.render(this.scene, this.mainCamera);
1421
+ this.renderer.setRenderTarget(prevTarget);
1422
+ }
1423
+ executeCoroutines(evt) {
1424
+ if (this.coroutines[evt]) {
1425
+ const evts = this.coroutines[evt];
1426
+ for (let i = 0; i < evts.length; i++) {
1427
+ try {
1428
+ const evt = evts[i];
1429
+ // TODO we might want to keep coroutines playing even if the component is disabled or inactive
1430
+ const remove = !evt.comp || evt.comp.destroyed || !evt.main || evt.comp["enabled"] === false;
1431
+ if (remove) {
1432
+ if (debugCoroutine)
1433
+ console.log("Removing coroutine", evt.comp, evt.comp["enabled"]);
1434
+ evts.splice(i, 1);
1435
+ --i;
1436
+ continue;
1437
+ }
1438
+ const iter = evt.chained;
1439
+ if (iter && iter.length > 0) {
1440
+ const last = iter[iter.length - 1];
1441
+ const res = last.next();
1442
+ if (res.done) {
1443
+ iter.pop();
1444
+ }
1445
+ if (isGenerator(res)) {
1446
+ if (!evt.chained)
1447
+ evt.chained = [];
1448
+ evt.chained.push(res.value);
1449
+ }
1450
+ if (!res.done)
1451
+ continue;
1452
+ }
1453
+ const res = evt.main.next();
1454
+ if (res.done === true) {
1455
+ evts.splice(i, 1);
1456
+ --i;
1457
+ continue;
1458
+ }
1459
+ const val = res.value;
1460
+ if (isGenerator(val)) {
1461
+ // invoke once if its a generator
1462
+ // this means e.g. WaitForFrame(1) works and will capture
1463
+ // the frame it was created
1464
+ const gen = val;
1465
+ const res = gen.next();
1466
+ if (res.done)
1467
+ continue;
1468
+ if (!evt.chained)
1469
+ evt.chained = [];
1470
+ evt.chained.push(val);
1471
+ }
1472
+ else if (val instanceof Promise) {
1473
+ // If its a promise we want to wait for it to resolve
1474
+ const prom = val;
1475
+ if (!evt.chained)
1476
+ evt.chained = [];
1477
+ const nested = WaitForPromise(prom);
1478
+ evt.chained?.push(nested);
1479
+ continue;
1480
+ }
1481
+ }
1482
+ catch (e) {
1483
+ console.error(e);
1484
+ }
1485
+ }
1486
+ }
1487
+ function isGenerator(val) {
1488
+ if (val) {
1489
+ if (val.next && val.return) {
1490
+ return true;
1491
+ }
1492
+ }
1493
+ return false;
1494
+ }
1495
+ }
1496
+ }
1497
+ // const scene = new Scene();
1498
+ // const useComposer = utils.getParam("postfx");
1499
+ // const renderer = new WebGLRenderer({ antialias: true });
1500
+ // const composer = useComposer ? new EffectComposer(renderer) : undefined;
1501
+ // renderer.setClearColor(new Color('lightgrey'), 0)
1502
+ // renderer.antialias = true;
1503
+ // renderer.alpha = false;
1504
+ // renderer.shadowMap.enabled = true;
1505
+ // renderer.shadowMap.type = PCFSoftShadowMap;
1506
+ // renderer.setSize(window.innerWidth, window.innerHeight);
1507
+ // renderer.outputEncoding = sRGBEncoding;
1508
+ // renderer.physicallyCorrectLights = true;
1509
+ // document.body.appendChild(renderer.domElement);
1510
+ // // generation pushes loading requests in this array
1511
+ // const sceneData: {
1512
+ // mainCamera: Camera | undefined
1513
+ // } = {
1514
+ // preparing: [],
1515
+ // resolving: [],
1516
+ // scripts: [],
1517
+ // raycastTargets: [],
1518
+ // mainCamera: undefined,
1519
+ // mainCameraComponent: undefined,
1520
+ // };
1521
+ // // contains a list of functions to be called after loading is done
1522
+ // const post_setup_callbacks = [];
1523
+ // const pre_render_Callbacks = [];
1524
+ // const post_render_callbacks = [];
1525
+ // const new_scripts = [];
1526
+ // const new_scripts_post_setup_callbacks = [];
1527
+ // const new_scripts_pre_setup_callbacks = [];
1528
+ // export {
1529
+ // scene, renderer, composer,
1530
+ // new_scripts,
1531
+ // new_scripts_post_setup_callbacks, new_scripts_pre_setup_callbacks,
1532
+ // sceneData,
1533
+ // post_setup_callbacks,
1534
+ // pre_render_Callbacks,
1535
+ // post_render_callbacks
1536
+ // }
1537
1537
  //# sourceMappingURL=engine_context.js.map