@needle-tools/engine 4.7.2-alpha → 4.7.2-next.6f2cd71
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.
- package/CHANGELOG.md +3782 -3782
- package/LICENSE.md +10 -10
- package/README.md +64 -64
- package/components.needle.json +1 -1
- package/dist/generateMeshBVH.worker-BaNp_Xtp.js +25 -0
- package/dist/{gltf-progressive-zdhlW609.umd.cjs → gltf-progressive-B9o1T8Vr.umd.cjs} +1 -1
- package/dist/{gltf-progressive-YjtQYFa9.js → gltf-progressive-DO0SisAM.js} +2 -2
- package/dist/{gltf-progressive-yOP1mp5W.min.js → gltf-progressive-DQF10PJE.min.js} +1 -1
- package/dist/{needle-engine.bundle-BhDF-YSv.min.js → needle-engine.bundle-B-NoV0t_.min.js} +64 -64
- package/dist/{needle-engine.bundle-D2myV4E4.umd.cjs → needle-engine.bundle-BMnlxDfi.umd.cjs} +59 -59
- package/dist/{needle-engine.bundle-gp00DTS4.js → needle-engine.bundle-CFi0ugBx.js} +638 -638
- package/dist/needle-engine.d.ts +130 -129
- package/dist/needle-engine.js +4 -4
- package/dist/needle-engine.min.js +1 -1
- package/dist/needle-engine.umd.cjs +1 -1
- package/dist/{postprocessing-8AQTeZsr.umd.cjs → postprocessing-CjW23fio.umd.cjs} +2 -2
- package/dist/{postprocessing-BkxN_08g.js → postprocessing-DYLNOL3W.js} +3 -3
- package/dist/{postprocessing-BDScN9yu.min.js → postprocessing-xYQWCHFu.min.js} +2 -2
- package/dist/{three-DMrv-4ar.umd.cjs → three-B_hneGZr.umd.cjs} +4 -4
- package/dist/{three-Bz6X1mrw.js → three-DrqIzZTH.js} +4198 -4198
- package/dist/{three-Boa-jOq-.min.js → three-DuDKwKB8.min.js} +33 -33
- package/dist/{three-examples-GggCDHv0.js → three-examples-B50TT3Iu.js} +5 -5
- package/dist/{three-examples-DuVhxqft.min.js → three-examples-DaDLBuy6.min.js} +14 -14
- package/dist/{three-examples-C7ryg8vN.umd.cjs → three-examples-X3OadjXB.umd.cjs} +3 -3
- package/dist/{three-mesh-ui-CY6Izc7C.min.js → three-mesh-ui-B3p3gyUz.min.js} +1 -1
- package/dist/{three-mesh-ui-CwlN0FUC.umd.cjs → three-mesh-ui-CQiIQIlA.umd.cjs} +1 -1
- package/dist/{three-mesh-ui-CLNOfsWn.js → three-mesh-ui-CxuWt7m-.js} +1 -1
- package/dist/{vendor-zxXa3Dmr.min.js → vendor-BlSxe9JJ.min.js} +3 -3
- package/dist/{vendor-BSD1RQIh.js → vendor-BmYIgaS1.js} +3 -3
- package/dist/{vendor-DHr4aqIZ.umd.cjs → vendor-Cavtu3CP.umd.cjs} +3 -3
- package/lib/asap/needle-asap.d.ts +1 -1
- package/lib/asap/needle-asap.js +95 -95
- package/lib/asap/sessiongranted.d.ts +3 -3
- package/lib/asap/sessiongranted.js +65 -65
- package/lib/asap/utils.d.ts +1 -1
- package/lib/asap/utils.js +3 -3
- package/lib/engine/analytics/index.d.ts +6 -6
- package/lib/engine/analytics/index.js +12 -12
- package/lib/engine/analytics/lcp.d.ts +3 -3
- package/lib/engine/analytics/lcp.js +34 -34
- package/lib/engine/api.d.ts +82 -82
- package/lib/engine/api.js +81 -81
- package/lib/engine/assets/index.d.ts +11 -11
- package/lib/engine/assets/index.js +47 -47
- package/lib/engine/assets/static.d.ts +1 -1
- package/lib/engine/assets/static.js +4 -4
- package/lib/engine/codegen/register_types.d.ts +1 -1
- package/lib/engine/codegen/register_types.js +300 -300
- package/lib/engine/debug/debug.d.ts +15 -15
- package/lib/engine/debug/debug.js +44 -44
- package/lib/engine/debug/debug_console.d.ts +2 -2
- package/lib/engine/debug/debug_console.js +307 -307
- package/lib/engine/debug/debug_overlay.d.ts +22 -22
- package/lib/engine/debug/debug_overlay.js +316 -316
- package/lib/engine/debug/debug_spatial_console.d.ts +2 -2
- package/lib/engine/debug/debug_spatial_console.js +390 -390
- package/lib/engine/debug/index.d.ts +2 -2
- package/lib/engine/debug/index.js +2 -2
- package/lib/engine/engine_addressables.d.ts +164 -164
- package/lib/engine/engine_addressables.js +601 -601
- package/lib/engine/engine_animation.d.ts +43 -43
- package/lib/engine/engine_animation.js +133 -133
- package/lib/engine/engine_application.d.ts +45 -45
- package/lib/engine/engine_application.js +104 -104
- package/lib/engine/engine_assetdatabase.d.ts +25 -25
- package/lib/engine/engine_assetdatabase.js +346 -346
- package/lib/engine/engine_audio.d.ts +4 -4
- package/lib/engine/engine_audio.js +23 -23
- package/lib/engine/engine_camera.d.ts +13 -13
- package/lib/engine/engine_camera.js +30 -30
- package/lib/engine/engine_components.d.ts +110 -110
- package/lib/engine/engine_components.js +374 -374
- package/lib/engine/engine_components_internal.d.ts +9 -9
- package/lib/engine/engine_components_internal.js +36 -36
- package/lib/engine/engine_constants.d.ts +10 -10
- package/lib/engine/engine_constants.js +41 -41
- package/lib/engine/engine_context.d.ts +475 -475
- package/lib/engine/engine_context.js +1673 -1673
- package/lib/engine/engine_context_registry.d.ts +71 -71
- package/lib/engine/engine_context_registry.js +117 -117
- package/lib/engine/engine_coroutine.d.ts +35 -35
- package/lib/engine/engine_coroutine.js +52 -52
- package/lib/engine/engine_create_objects.d.ts +119 -119
- package/lib/engine/engine_create_objects.js +320 -320
- package/lib/engine/engine_default_parameters.d.ts +2 -2
- package/lib/engine/engine_default_parameters.js +3 -3
- package/lib/engine/engine_editor-sync.d.ts +21 -21
- package/lib/engine/engine_editor-sync.js +4 -4
- package/lib/engine/engine_fileloader.d.ts +2 -2
- package/lib/engine/engine_fileloader.js +8 -8
- package/lib/engine/engine_gameobject.d.ts +68 -68
- package/lib/engine/engine_gameobject.js +619 -619
- package/lib/engine/engine_generic_utils.d.ts +1 -1
- package/lib/engine/engine_generic_utils.js +13 -13
- package/lib/engine/engine_gizmos.d.ts +149 -149
- package/lib/engine/engine_gizmos.js +530 -530
- package/lib/engine/engine_gltf.d.ts +12 -12
- package/lib/engine/engine_gltf.js +15 -15
- package/lib/engine/engine_gltf_builtin_components.d.ts +11 -11
- package/lib/engine/engine_gltf_builtin_components.js +341 -341
- package/lib/engine/engine_hot_reload.d.ts +8 -8
- package/lib/engine/engine_hot_reload.js +197 -197
- package/lib/engine/engine_input.d.ts +362 -362
- package/lib/engine/engine_input.js +1294 -1294
- package/lib/engine/engine_input_utils.d.ts +2 -2
- package/lib/engine/engine_input_utils.js +22 -22
- package/lib/engine/engine_instancing.d.ts +19 -19
- package/lib/engine/engine_instancing.js +39 -39
- package/lib/engine/engine_license.d.ts +11 -11
- package/lib/engine/engine_license.js +369 -369
- package/lib/engine/engine_lifecycle_api.d.ts +83 -83
- package/lib/engine/engine_lifecycle_api.js +106 -106
- package/lib/engine/engine_lifecycle_functions_internal.d.ts +32 -32
- package/lib/engine/engine_lifecycle_functions_internal.js +146 -146
- package/lib/engine/engine_lightdata.d.ts +23 -23
- package/lib/engine/engine_lightdata.js +101 -101
- package/lib/engine/engine_loaders.callbacks.d.ts +97 -97
- package/lib/engine/engine_loaders.callbacks.js +86 -86
- package/lib/engine/engine_loaders.d.ts +48 -48
- package/lib/engine/engine_loaders.gltf.d.ts +13 -13
- package/lib/engine/engine_loaders.gltf.js +62 -62
- package/lib/engine/engine_loaders.js +337 -337
- package/lib/engine/engine_lods.d.ts +35 -35
- package/lib/engine/engine_lods.js +160 -160
- package/lib/engine/engine_mainloop_utils.d.ts +32 -32
- package/lib/engine/engine_mainloop_utils.js +466 -466
- package/lib/engine/engine_math.d.ts +114 -114
- package/lib/engine/engine_math.js +247 -247
- package/lib/engine/engine_modules.d.ts +36 -36
- package/lib/engine/engine_modules.js +85 -85
- package/lib/engine/engine_networking.d.ts +260 -260
- package/lib/engine/engine_networking.js +764 -764
- package/lib/engine/engine_networking_auto.d.ts +24 -24
- package/lib/engine/engine_networking_auto.js +310 -310
- package/lib/engine/engine_networking_blob.d.ts +48 -48
- package/lib/engine/engine_networking_blob.js +228 -228
- package/lib/engine/engine_networking_files.d.ts +35 -35
- package/lib/engine/engine_networking_files.js +172 -172
- package/lib/engine/engine_networking_files_default_components.d.ts +6 -6
- package/lib/engine/engine_networking_files_default_components.js +42 -42
- package/lib/engine/engine_networking_instantiate.d.ts +100 -100
- package/lib/engine/engine_networking_instantiate.js +345 -345
- package/lib/engine/engine_networking_peer.d.ts +15 -15
- package/lib/engine/engine_networking_peer.js +132 -132
- package/lib/engine/engine_networking_streams.d.ts +123 -123
- package/lib/engine/engine_networking_streams.js +645 -645
- package/lib/engine/engine_networking_types.d.ts +22 -22
- package/lib/engine/engine_networking_types.js +7 -7
- package/lib/engine/engine_networking_utils.d.ts +2 -2
- package/lib/engine/engine_networking_utils.js +20 -20
- package/lib/engine/engine_networking_websocket.d.ts +1 -1
- package/lib/engine/engine_networking_websocket.js +2 -2
- package/lib/engine/engine_patcher.d.ts +10 -10
- package/lib/engine/engine_patcher.js +142 -142
- package/lib/engine/engine_physics.d.ts +152 -152
- package/lib/engine/engine_physics.js +645 -645
- package/lib/engine/engine_physics.types.d.ts +40 -40
- package/lib/engine/engine_physics.types.js +33 -33
- package/lib/engine/engine_physics_rapier.d.ts +147 -147
- package/lib/engine/engine_physics_rapier.js +1433 -1433
- package/lib/engine/engine_playerview.d.ts +26 -26
- package/lib/engine/engine_playerview.js +64 -64
- package/lib/engine/engine_scenelighting.d.ts +71 -71
- package/lib/engine/engine_scenelighting.js +226 -226
- package/lib/engine/engine_serialization.d.ts +3 -3
- package/lib/engine/engine_serialization.js +3 -3
- package/lib/engine/engine_serialization_builtin_serializer.d.ts +72 -72
- package/lib/engine/engine_serialization_builtin_serializer.js +403 -403
- package/lib/engine/engine_serialization_core.d.ts +94 -94
- package/lib/engine/engine_serialization_core.js +607 -607
- package/lib/engine/engine_serialization_decorator.d.ts +23 -23
- package/lib/engine/engine_serialization_decorator.js +66 -66
- package/lib/engine/engine_setup.d.ts +1 -1
- package/lib/engine/engine_setup.js +2 -2
- package/lib/engine/engine_shaders.d.ts +53 -53
- package/lib/engine/engine_shaders.js +252 -252
- package/lib/engine/engine_shims.d.ts +4 -4
- package/lib/engine/engine_shims.js +24 -24
- package/lib/engine/engine_test_utils.d.ts +39 -39
- package/lib/engine/engine_test_utils.js +83 -83
- package/lib/engine/engine_texture.d.ts +28 -28
- package/lib/engine/engine_texture.js +64 -64
- package/lib/engine/engine_three_utils.d.ts +204 -204
- package/lib/engine/engine_three_utils.js +788 -788
- package/lib/engine/engine_time.d.ts +51 -51
- package/lib/engine/engine_time.js +82 -82
- package/lib/engine/engine_time_utils.d.ts +88 -88
- package/lib/engine/engine_time_utils.js +215 -215
- package/lib/engine/engine_tonemapping.d.ts +6 -6
- package/lib/engine/engine_tonemapping.js +197 -197
- package/lib/engine/engine_types.d.ts +578 -578
- package/lib/engine/engine_types.js +95 -95
- package/lib/engine/engine_typestore.d.ts +28 -28
- package/lib/engine/engine_typestore.js +55 -55
- package/lib/engine/engine_util_decorator.d.ts +13 -13
- package/lib/engine/engine_util_decorator.js +116 -116
- package/lib/engine/engine_utils.d.ts +248 -248
- package/lib/engine/engine_utils.js +1012 -1012
- package/lib/engine/engine_utils_format.d.ts +24 -24
- package/lib/engine/engine_utils_format.js +239 -239
- package/lib/engine/engine_utils_screenshot.d.ts +159 -159
- package/lib/engine/engine_utils_screenshot.js +522 -522
- package/lib/engine/engine_utils_screenshot.xr.d.ts +5 -5
- package/lib/engine/engine_utils_screenshot.xr.js +90 -90
- package/lib/engine/engine_xr.d.ts +1 -1
- package/lib/engine/engine_xr.js +1 -1
- package/lib/engine/export/gltf/Writers.d.ts +19 -19
- package/lib/engine/export/gltf/Writers.js +24 -24
- package/lib/engine/export/gltf/index.d.ts +11 -11
- package/lib/engine/export/gltf/index.js +123 -123
- package/lib/engine/export/index.d.ts +2 -2
- package/lib/engine/export/index.js +2 -2
- package/lib/engine/export/state.d.ts +7 -7
- package/lib/engine/export/state.js +17 -17
- package/lib/engine/export/utils.d.ts +2 -2
- package/lib/engine/export/utils.js +7 -7
- package/lib/engine/extensions/EXT_texture_exr.d.ts +8 -8
- package/lib/engine/extensions/EXT_texture_exr.js +32 -32
- package/lib/engine/extensions/NEEDLE_animator_controller_model.d.ts +122 -122
- package/lib/engine/extensions/NEEDLE_animator_controller_model.js +95 -95
- package/lib/engine/extensions/NEEDLE_components.d.ts +35 -35
- package/lib/engine/extensions/NEEDLE_components.js +220 -220
- package/lib/engine/extensions/NEEDLE_gameobject_data.d.ts +10 -10
- package/lib/engine/extensions/NEEDLE_gameobject_data.js +57 -57
- package/lib/engine/extensions/NEEDLE_lighting_settings.d.ts +37 -37
- package/lib/engine/extensions/NEEDLE_lighting_settings.js +157 -157
- package/lib/engine/extensions/NEEDLE_lightmaps.d.ts +18 -18
- package/lib/engine/extensions/NEEDLE_lightmaps.js +99 -99
- package/lib/engine/extensions/NEEDLE_persistent_assets.d.ts +11 -11
- package/lib/engine/extensions/NEEDLE_persistent_assets.js +63 -63
- package/lib/engine/extensions/NEEDLE_progressive.d.ts +1 -1
- package/lib/engine/extensions/NEEDLE_progressive.js +1 -1
- package/lib/engine/extensions/NEEDLE_render_objects.d.ts +13 -13
- package/lib/engine/extensions/NEEDLE_render_objects.js +159 -159
- package/lib/engine/extensions/NEEDLE_techniques_webgl.d.ts +38 -38
- package/lib/engine/extensions/NEEDLE_techniques_webgl.js +564 -564
- package/lib/engine/extensions/extension_resolver.d.ts +4 -4
- package/lib/engine/extensions/extension_resolver.js +1 -1
- package/lib/engine/extensions/extension_utils.d.ts +12 -12
- package/lib/engine/extensions/extension_utils.js +152 -152
- package/lib/engine/extensions/extensions.d.ts +32 -32
- package/lib/engine/extensions/extensions.js +107 -107
- package/lib/engine/extensions/index.d.ts +6 -6
- package/lib/engine/extensions/index.js +6 -6
- package/lib/engine/extensions/usage_tracker.d.ts +13 -13
- package/lib/engine/extensions/usage_tracker.js +65 -65
- package/lib/engine/js-extensions/Camera.d.ts +1 -1
- package/lib/engine/js-extensions/Camera.js +39 -39
- package/lib/engine/js-extensions/ExtensionUtils.d.ts +9 -9
- package/lib/engine/js-extensions/ExtensionUtils.js +67 -67
- package/lib/engine/js-extensions/Layers.d.ts +6 -6
- package/lib/engine/js-extensions/Layers.js +22 -22
- package/lib/engine/js-extensions/Object3D.d.ts +120 -120
- package/lib/engine/js-extensions/Object3D.js +136 -136
- package/lib/engine/js-extensions/RGBAColor.d.ts +23 -23
- package/lib/engine/js-extensions/RGBAColor.js +111 -111
- package/lib/engine/js-extensions/Vector.d.ts +3 -3
- package/lib/engine/js-extensions/Vector.js +13 -13
- package/lib/engine/js-extensions/index.d.ts +5 -5
- package/lib/engine/js-extensions/index.js +5 -5
- package/lib/engine/physics/workers/mesh-bvh/GenerateMeshBVHWorker.d.ts +4 -4
- package/lib/engine/physics/workers/mesh-bvh/GenerateMeshBVHWorker.js +79 -79
- package/lib/engine/shaders/shaderData.d.ts +55 -55
- package/lib/engine/shaders/shaderData.js +58 -58
- package/lib/engine/tests/test_utils.d.ts +2 -2
- package/lib/engine/tests/test_utils.js +53 -53
- package/lib/engine/webcomponents/WebXRButtons.d.ts +56 -56
- package/lib/engine/webcomponents/WebXRButtons.js +230 -230
- package/lib/engine/webcomponents/api.d.ts +5 -5
- package/lib/engine/webcomponents/api.js +4 -4
- package/lib/engine/webcomponents/buttons.d.ts +51 -51
- package/lib/engine/webcomponents/buttons.js +264 -264
- package/lib/engine/webcomponents/fonts.d.ts +9 -9
- package/lib/engine/webcomponents/fonts.js +32 -32
- package/lib/engine/webcomponents/icons.d.ts +9 -9
- package/lib/engine/webcomponents/icons.js +52 -52
- package/lib/engine/webcomponents/index.d.ts +1 -1
- package/lib/engine/webcomponents/index.js +1 -1
- package/lib/engine/webcomponents/logo-element.d.ts +10 -10
- package/lib/engine/webcomponents/logo-element.js +67 -67
- package/lib/engine/webcomponents/needle menu/needle-menu-spatial.d.ts +37 -37
- package/lib/engine/webcomponents/needle menu/needle-menu-spatial.js +513 -513
- package/lib/engine/webcomponents/needle menu/needle-menu.d.ts +155 -155
- package/lib/engine/webcomponents/needle menu/needle-menu.js +1029 -1029
- package/lib/engine/webcomponents/needle-button.d.ts +34 -34
- package/lib/engine/webcomponents/needle-button.js +161 -161
- package/lib/engine/webcomponents/needle-engine.ar-overlay.d.ts +21 -21
- package/lib/engine/webcomponents/needle-engine.ar-overlay.js +166 -166
- package/lib/engine/webcomponents/needle-engine.attributes.d.ts +69 -69
- package/lib/engine/webcomponents/needle-engine.attributes.js +1 -1
- package/lib/engine/webcomponents/needle-engine.d.ts +116 -116
- package/lib/engine/webcomponents/needle-engine.extras.d.ts +6 -6
- package/lib/engine/webcomponents/needle-engine.extras.js +13 -13
- package/lib/engine/webcomponents/needle-engine.js +821 -821
- package/lib/engine/webcomponents/needle-engine.loading.d.ts +44 -44
- package/lib/engine/webcomponents/needle-engine.loading.js +341 -341
- package/lib/engine/xr/NeedleXRController.d.ts +313 -313
- package/lib/engine/xr/NeedleXRController.js +1007 -1007
- package/lib/engine/xr/NeedleXRSession.d.ts +340 -340
- package/lib/engine/xr/NeedleXRSession.js +1463 -1463
- package/lib/engine/xr/NeedleXRSync.d.ts +22 -22
- package/lib/engine/xr/NeedleXRSync.js +188 -188
- package/lib/engine/xr/SceneTransition.d.ts +18 -18
- package/lib/engine/xr/SceneTransition.js +69 -69
- package/lib/engine/xr/TempXRContext.d.ts +34 -34
- package/lib/engine/xr/TempXRContext.js +187 -187
- package/lib/engine/xr/XRRig.d.ts +7 -7
- package/lib/engine/xr/XRRig.js +1 -1
- package/lib/engine/xr/api.d.ts +6 -6
- package/lib/engine/xr/api.js +6 -6
- package/lib/engine/xr/events.d.ts +66 -66
- package/lib/engine/xr/events.js +93 -93
- package/lib/engine/xr/internal.d.ts +12 -12
- package/lib/engine/xr/internal.js +25 -25
- package/lib/engine/xr/usdz.d.ts +12 -12
- package/lib/engine/xr/usdz.js +29 -29
- package/lib/engine/xr/utils.d.ts +11 -11
- package/lib/engine/xr/utils.js +34 -34
- package/lib/engine-components/AlignmentConstraint.d.ts +10 -10
- package/lib/engine-components/AlignmentConstraint.js +39 -39
- package/lib/engine-components/Animation.d.ts +156 -156
- package/lib/engine-components/Animation.js +508 -508
- package/lib/engine-components/AnimationCurve.d.ts +40 -40
- package/lib/engine-components/AnimationCurve.js +159 -159
- package/lib/engine-components/AnimationUtils.d.ts +8 -8
- package/lib/engine-components/AnimationUtils.js +27 -27
- package/lib/engine-components/AnimationUtilsAutoplay.d.ts +1 -1
- package/lib/engine-components/AnimationUtilsAutoplay.js +39 -39
- package/lib/engine-components/Animator.d.ts +217 -217
- package/lib/engine-components/Animator.js +354 -354
- package/lib/engine-components/AnimatorController.d.ts +227 -227
- package/lib/engine-components/AnimatorController.js +1152 -1152
- package/lib/engine-components/AudioListener.d.ts +33 -33
- package/lib/engine-components/AudioListener.js +86 -86
- package/lib/engine-components/AudioSource.d.ts +217 -217
- package/lib/engine-components/AudioSource.js +635 -635
- package/lib/engine-components/AvatarLoader.d.ts +80 -80
- package/lib/engine-components/AvatarLoader.js +231 -231
- package/lib/engine-components/AxesHelper.d.ts +32 -32
- package/lib/engine-components/AxesHelper.js +67 -67
- package/lib/engine-components/BasicIKConstraint.d.ts +9 -9
- package/lib/engine-components/BasicIKConstraint.js +43 -43
- package/lib/engine-components/BoxCollider.d.ts +2 -2
- package/lib/engine-components/BoxCollider.js +2 -2
- package/lib/engine-components/BoxHelperComponent.d.ts +47 -47
- package/lib/engine-components/BoxHelperComponent.js +102 -102
- package/lib/engine-components/Camera.d.ts +231 -231
- package/lib/engine-components/Camera.js +700 -700
- package/lib/engine-components/CameraUtils.d.ts +1 -1
- package/lib/engine-components/CameraUtils.js +123 -123
- package/lib/engine-components/CharacterController.d.ts +55 -55
- package/lib/engine-components/CharacterController.js +236 -236
- package/lib/engine-components/Collider.d.ts +188 -188
- package/lib/engine-components/Collider.js +369 -369
- package/lib/engine-components/Component.d.ts +792 -792
- package/lib/engine-components/Component.js +920 -920
- package/lib/engine-components/ContactShadows.d.ts +94 -94
- package/lib/engine-components/ContactShadows.js +453 -453
- package/lib/engine-components/DeleteBox.d.ts +19 -19
- package/lib/engine-components/DeleteBox.js +58 -58
- package/lib/engine-components/DeviceFlag.d.ts +16 -16
- package/lib/engine-components/DeviceFlag.js +47 -47
- package/lib/engine-components/DragControls.d.ts +170 -170
- package/lib/engine-components/DragControls.js +1421 -1421
- package/lib/engine-components/DropListener.d.ts +215 -215
- package/lib/engine-components/DropListener.js +642 -642
- package/lib/engine-components/Duplicatable.d.ts +35 -35
- package/lib/engine-components/Duplicatable.js +202 -202
- package/lib/engine-components/EventList.d.ts +54 -54
- package/lib/engine-components/EventList.js +232 -232
- package/lib/engine-components/EventTrigger.d.ts +33 -33
- package/lib/engine-components/EventTrigger.js +75 -75
- package/lib/engine-components/EventType.d.ts +22 -22
- package/lib/engine-components/EventType.js +23 -23
- package/lib/engine-components/Fog.d.ts +22 -22
- package/lib/engine-components/Fog.js +61 -61
- package/lib/engine-components/Gizmos.d.ts +17 -17
- package/lib/engine-components/Gizmos.js +64 -64
- package/lib/engine-components/GridHelper.d.ts +20 -20
- package/lib/engine-components/GridHelper.js +54 -54
- package/lib/engine-components/GroundProjection.d.ts +67 -67
- package/lib/engine-components/GroundProjection.js +343 -343
- package/lib/engine-components/Interactable.d.ts +12 -12
- package/lib/engine-components/Interactable.js +12 -12
- package/lib/engine-components/Joints.d.ts +19 -19
- package/lib/engine-components/Joints.js +51 -51
- package/lib/engine-components/LODGroup.d.ts +35 -35
- package/lib/engine-components/LODGroup.js +152 -152
- package/lib/engine-components/Light.d.ts +180 -180
- package/lib/engine-components/Light.js +535 -535
- package/lib/engine-components/LookAtConstraint.d.ts +19 -19
- package/lib/engine-components/LookAtConstraint.js +35 -35
- package/lib/engine-components/NeedleMenu.d.ts +50 -50
- package/lib/engine-components/NeedleMenu.js +92 -92
- package/lib/engine-components/NestedGltf.d.ts +25 -25
- package/lib/engine-components/NestedGltf.js +88 -88
- package/lib/engine-components/Networking.d.ts +54 -54
- package/lib/engine-components/Networking.js +112 -112
- package/lib/engine-components/OffsetConstraint.d.ts +14 -14
- package/lib/engine-components/OffsetConstraint.js +65 -65
- package/lib/engine-components/OrbitControls.d.ts +268 -268
- package/lib/engine-components/OrbitControls.js +1015 -1015
- package/lib/engine-components/PlayerColor.d.ts +19 -19
- package/lib/engine-components/PlayerColor.js +94 -94
- package/lib/engine-components/ReflectionProbe.d.ts +28 -28
- package/lib/engine-components/ReflectionProbe.js +204 -204
- package/lib/engine-components/Renderer.d.ts +153 -153
- package/lib/engine-components/Renderer.js +834 -834
- package/lib/engine-components/RendererInstancing.d.ts +140 -140
- package/lib/engine-components/RendererInstancing.js +744 -744
- package/lib/engine-components/RendererLightmap.d.ts +24 -24
- package/lib/engine-components/RendererLightmap.js +182 -182
- package/lib/engine-components/RigidBody.d.ts +155 -155
- package/lib/engine-components/RigidBody.js +517 -517
- package/lib/engine-components/SceneSwitcher.d.ts +263 -263
- package/lib/engine-components/SceneSwitcher.js +971 -971
- package/lib/engine-components/ScreenCapture.d.ts +144 -144
- package/lib/engine-components/ScreenCapture.js +547 -547
- package/lib/engine-components/ShadowCatcher.d.ts +33 -33
- package/lib/engine-components/ShadowCatcher.js +166 -166
- package/lib/engine-components/Skybox.d.ts +88 -88
- package/lib/engine-components/Skybox.js +469 -469
- package/lib/engine-components/SmoothFollow.d.ts +34 -34
- package/lib/engine-components/SmoothFollow.js +82 -82
- package/lib/engine-components/SpatialTrigger.d.ts +102 -102
- package/lib/engine-components/SpatialTrigger.js +225 -225
- package/lib/engine-components/SpectatorCamera.d.ts +111 -111
- package/lib/engine-components/SpectatorCamera.js +715 -715
- package/lib/engine-components/SphereCollider.d.ts +2 -2
- package/lib/engine-components/SphereCollider.js +2 -2
- package/lib/engine-components/SpriteRenderer.d.ts +132 -132
- package/lib/engine-components/SpriteRenderer.js +472 -472
- package/lib/engine-components/SyncedCamera.d.ts +41 -41
- package/lib/engine-components/SyncedCamera.js +199 -199
- package/lib/engine-components/SyncedRoom.d.ts +106 -106
- package/lib/engine-components/SyncedRoom.js +371 -371
- package/lib/engine-components/SyncedTransform.d.ts +94 -94
- package/lib/engine-components/SyncedTransform.js +331 -331
- package/lib/engine-components/TestRunner.d.ts +16 -16
- package/lib/engine-components/TestRunner.js +102 -102
- package/lib/engine-components/TransformGizmo.d.ts +75 -75
- package/lib/engine-components/TransformGizmo.js +209 -209
- package/lib/engine-components/VideoPlayer.d.ts +184 -184
- package/lib/engine-components/VideoPlayer.js +978 -978
- package/lib/engine-components/Voip.d.ts +67 -67
- package/lib/engine-components/Voip.js +360 -360
- package/lib/engine-components/api.d.ts +51 -51
- package/lib/engine-components/api.js +50 -50
- package/lib/engine-components/avatar/AvatarBlink_Simple.d.ts +11 -11
- package/lib/engine-components/avatar/AvatarBlink_Simple.js +76 -76
- package/lib/engine-components/avatar/AvatarEyeLook_Rotation.d.ts +14 -14
- package/lib/engine-components/avatar/AvatarEyeLook_Rotation.js +68 -68
- package/lib/engine-components/avatar/Avatar_Brain_LookAt.d.ts +29 -29
- package/lib/engine-components/avatar/Avatar_Brain_LookAt.js +121 -121
- package/lib/engine-components/avatar/Avatar_MouthShapes.d.ts +15 -15
- package/lib/engine-components/avatar/Avatar_MouthShapes.js +79 -79
- package/lib/engine-components/avatar/Avatar_MustacheShake.d.ts +9 -9
- package/lib/engine-components/avatar/Avatar_MustacheShake.js +29 -29
- package/lib/engine-components/codegen/components.d.ts +216 -216
- package/lib/engine-components/codegen/components.js +218 -218
- package/lib/engine-components/debug/LogStats.d.ts +5 -5
- package/lib/engine-components/debug/LogStats.js +18 -18
- package/lib/engine-components/export/gltf/GltfExport.d.ts +30 -30
- package/lib/engine-components/export/gltf/GltfExport.js +246 -246
- package/lib/engine-components/export/gltf/index.d.ts +1 -1
- package/lib/engine-components/export/gltf/index.js +1 -1
- package/lib/engine-components/export/index.d.ts +1 -1
- package/lib/engine-components/export/index.js +1 -1
- package/lib/engine-components/export/usdz/Extension.d.ts +22 -22
- package/lib/engine-components/export/usdz/Extension.js +1 -1
- package/lib/engine-components/export/usdz/ThreeUSDZExporter.d.ts +162 -162
- package/lib/engine-components/export/usdz/ThreeUSDZExporter.js +1789 -1789
- package/lib/engine-components/export/usdz/USDZExporter.d.ts +130 -130
- package/lib/engine-components/export/usdz/USDZExporter.js +663 -663
- package/lib/engine-components/export/usdz/extensions/Animation.d.ts +106 -106
- package/lib/engine-components/export/usdz/extensions/Animation.js +1071 -1071
- package/lib/engine-components/export/usdz/extensions/DocumentExtension.d.ts +5 -5
- package/lib/engine-components/export/usdz/extensions/DocumentExtension.js +6 -6
- package/lib/engine-components/export/usdz/extensions/NodeMaterialConverter.d.ts +10 -10
- package/lib/engine-components/export/usdz/extensions/NodeMaterialConverter.js +451 -451
- package/lib/engine-components/export/usdz/extensions/USDZText.d.ts +54 -54
- package/lib/engine-components/export/usdz/extensions/USDZText.js +203 -203
- package/lib/engine-components/export/usdz/extensions/USDZUI.d.ts +8 -8
- package/lib/engine-components/export/usdz/extensions/USDZUI.js +158 -158
- package/lib/engine-components/export/usdz/extensions/behavior/Actions.d.ts +30 -30
- package/lib/engine-components/export/usdz/extensions/behavior/Actions.js +88 -88
- package/lib/engine-components/export/usdz/extensions/behavior/AudioExtension.d.ts +10 -10
- package/lib/engine-components/export/usdz/extensions/behavior/AudioExtension.js +86 -86
- package/lib/engine-components/export/usdz/extensions/behavior/Behaviour.d.ts +28 -28
- package/lib/engine-components/export/usdz/extensions/behavior/Behaviour.js +290 -290
- package/lib/engine-components/export/usdz/extensions/behavior/BehaviourComponents.d.ts +190 -190
- package/lib/engine-components/export/usdz/extensions/behavior/BehaviourComponents.js +1060 -1060
- package/lib/engine-components/export/usdz/extensions/behavior/BehavioursBuilder.d.ts +135 -135
- package/lib/engine-components/export/usdz/extensions/behavior/BehavioursBuilder.js +548 -548
- package/lib/engine-components/export/usdz/extensions/behavior/PhysicsExtension.d.ts +7 -7
- package/lib/engine-components/export/usdz/extensions/behavior/PhysicsExtension.js +115 -115
- package/lib/engine-components/export/usdz/index.d.ts +3 -3
- package/lib/engine-components/export/usdz/index.js +2 -2
- package/lib/engine-components/export/usdz/utils/animationutils.d.ts +7 -7
- package/lib/engine-components/export/usdz/utils/animationutils.js +163 -163
- package/lib/engine-components/export/usdz/utils/quicklook.d.ts +2 -2
- package/lib/engine-components/export/usdz/utils/quicklook.js +43 -43
- package/lib/engine-components/particlesystem/ParticleSystem.d.ts +177 -177
- package/lib/engine-components/particlesystem/ParticleSystem.js +1176 -1176
- package/lib/engine-components/particlesystem/ParticleSystemModules.d.ts +526 -526
- package/lib/engine-components/particlesystem/ParticleSystemModules.js +1930 -1930
- package/lib/engine-components/particlesystem/ParticleSystemSubEmitter.d.ts +25 -25
- package/lib/engine-components/particlesystem/ParticleSystemSubEmitter.js +87 -87
- package/lib/engine-components/particlesystem/api.d.ts +2 -2
- package/lib/engine-components/particlesystem/api.js +2 -2
- package/lib/engine-components/postprocessing/Effects/Antialiasing.d.ts +17 -17
- package/lib/engine-components/postprocessing/Effects/Antialiasing.js +59 -59
- package/lib/engine-components/postprocessing/Effects/BloomEffect.d.ts +46 -46
- package/lib/engine-components/postprocessing/Effects/BloomEffect.js +113 -113
- package/lib/engine-components/postprocessing/Effects/ChromaticAberration.d.ts +11 -11
- package/lib/engine-components/postprocessing/Effects/ChromaticAberration.js +39 -39
- package/lib/engine-components/postprocessing/Effects/ColorAdjustments.d.ts +23 -23
- package/lib/engine-components/postprocessing/Effects/ColorAdjustments.js +111 -111
- package/lib/engine-components/postprocessing/Effects/DepthOfField.d.ts +25 -25
- package/lib/engine-components/postprocessing/Effects/DepthOfField.js +104 -104
- package/lib/engine-components/postprocessing/Effects/EffectWrapper.d.ts +12 -12
- package/lib/engine-components/postprocessing/Effects/EffectWrapper.js +18 -18
- package/lib/engine-components/postprocessing/Effects/Pixelation.d.ts +11 -11
- package/lib/engine-components/postprocessing/Effects/Pixelation.js +32 -32
- package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusion.d.ts +18 -18
- package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusion.js +91 -91
- package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.d.ts +70 -70
- package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.js +176 -176
- package/lib/engine-components/postprocessing/Effects/Sharpening.d.ts +18 -18
- package/lib/engine-components/postprocessing/Effects/Sharpening.js +127 -127
- package/lib/engine-components/postprocessing/Effects/TiltShiftEffect.d.ts +17 -17
- package/lib/engine-components/postprocessing/Effects/TiltShiftEffect.js +70 -70
- package/lib/engine-components/postprocessing/Effects/Tonemapping.d.ts +19 -19
- package/lib/engine-components/postprocessing/Effects/Tonemapping.js +94 -94
- package/lib/engine-components/postprocessing/Effects/Tonemapping.utils.d.ts +13 -13
- package/lib/engine-components/postprocessing/Effects/Tonemapping.utils.js +51 -51
- package/lib/engine-components/postprocessing/Effects/Vignette.d.ts +15 -15
- package/lib/engine-components/postprocessing/Effects/Vignette.js +60 -60
- package/lib/engine-components/postprocessing/PostProcessingEffect.d.ts +90 -90
- package/lib/engine-components/postprocessing/PostProcessingEffect.js +168 -168
- package/lib/engine-components/postprocessing/PostProcessingHandler.d.ts +42 -42
- package/lib/engine-components/postprocessing/PostProcessingHandler.js +494 -494
- package/lib/engine-components/postprocessing/Volume.d.ts +90 -90
- package/lib/engine-components/postprocessing/Volume.js +385 -385
- package/lib/engine-components/postprocessing/VolumeParameter.d.ts +26 -26
- package/lib/engine-components/postprocessing/VolumeParameter.js +136 -136
- package/lib/engine-components/postprocessing/VolumeProfile.d.ts +15 -15
- package/lib/engine-components/postprocessing/VolumeProfile.js +60 -60
- package/lib/engine-components/postprocessing/index.d.ts +6 -6
- package/lib/engine-components/postprocessing/index.js +6 -6
- package/lib/engine-components/postprocessing/utils.d.ts +55 -55
- package/lib/engine-components/postprocessing/utils.js +119 -119
- package/lib/engine-components/timeline/PlayableDirector.d.ts +163 -163
- package/lib/engine-components/timeline/PlayableDirector.js +686 -686
- package/lib/engine-components/timeline/SignalAsset.d.ts +24 -24
- package/lib/engine-components/timeline/SignalAsset.js +130 -130
- package/lib/engine-components/timeline/TimelineModels.d.ts +89 -89
- package/lib/engine-components/timeline/TimelineModels.js +22 -22
- package/lib/engine-components/timeline/TimelineTracks.d.ts +110 -110
- package/lib/engine-components/timeline/TimelineTracks.js +879 -879
- package/lib/engine-components/timeline/index.d.ts +4 -4
- package/lib/engine-components/timeline/index.js +3 -3
- package/lib/engine-components/ui/BaseUIComponent.d.ts +48 -48
- package/lib/engine-components/ui/BaseUIComponent.js +170 -170
- package/lib/engine-components/ui/Button.d.ts +64 -64
- package/lib/engine-components/ui/Button.js +315 -315
- package/lib/engine-components/ui/Canvas.d.ts +74 -74
- package/lib/engine-components/ui/Canvas.js +407 -407
- package/lib/engine-components/ui/CanvasGroup.d.ts +19 -19
- package/lib/engine-components/ui/CanvasGroup.js +58 -58
- package/lib/engine-components/ui/EventSystem.d.ts +125 -125
- package/lib/engine-components/ui/EventSystem.js +765 -765
- package/lib/engine-components/ui/Graphic.d.ts +55 -55
- package/lib/engine-components/ui/Graphic.js +255 -255
- package/lib/engine-components/ui/Image.d.ts +35 -35
- package/lib/engine-components/ui/Image.js +116 -116
- package/lib/engine-components/ui/InputField.d.ts +42 -42
- package/lib/engine-components/ui/InputField.js +268 -268
- package/lib/engine-components/ui/Interfaces.d.ts +38 -38
- package/lib/engine-components/ui/Interfaces.js +12 -12
- package/lib/engine-components/ui/Layout.d.ts +84 -84
- package/lib/engine-components/ui/Layout.js +330 -330
- package/lib/engine-components/ui/Outline.d.ts +7 -7
- package/lib/engine-components/ui/Outline.js +20 -20
- package/lib/engine-components/ui/PointerEvents.d.ts +115 -115
- package/lib/engine-components/ui/PointerEvents.js +145 -145
- package/lib/engine-components/ui/RaycastUtils.d.ts +11 -11
- package/lib/engine-components/ui/RaycastUtils.js +67 -67
- package/lib/engine-components/ui/Raycaster.d.ts +30 -30
- package/lib/engine-components/ui/Raycaster.js +95 -95
- package/lib/engine-components/ui/RectTransform.d.ts +61 -61
- package/lib/engine-components/ui/RectTransform.js +356 -356
- package/lib/engine-components/ui/SpatialHtml.d.ts +8 -8
- package/lib/engine-components/ui/SpatialHtml.js +79 -79
- package/lib/engine-components/ui/Symbols.d.ts +1 -1
- package/lib/engine-components/ui/Symbols.js +1 -1
- package/lib/engine-components/ui/Text.d.ts +78 -78
- package/lib/engine-components/ui/Text.js +539 -539
- package/lib/engine-components/ui/Utils.d.ts +24 -24
- package/lib/engine-components/ui/Utils.js +90 -90
- package/lib/engine-components/ui/index.d.ts +1 -1
- package/lib/engine-components/ui/index.js +1 -1
- package/lib/engine-components/utils/EnvironmentScene.d.ts +5 -5
- package/lib/engine-components/utils/EnvironmentScene.js +205 -205
- package/lib/engine-components/utils/LookAt.d.ts +31 -31
- package/lib/engine-components/utils/LookAt.js +82 -82
- package/lib/engine-components/utils/OpenURL.d.ts +42 -42
- package/lib/engine-components/utils/OpenURL.js +119 -119
- package/lib/engine-components/webxr/Avatar.d.ts +25 -25
- package/lib/engine-components/webxr/Avatar.js +255 -255
- package/lib/engine-components/webxr/TeleportTarget.d.ts +7 -7
- package/lib/engine-components/webxr/TeleportTarget.js +7 -7
- package/lib/engine-components/webxr/WebARCameraBackground.d.ts +30 -30
- package/lib/engine-components/webxr/WebARCameraBackground.js +155 -155
- package/lib/engine-components/webxr/WebARSessionRoot.d.ts +98 -98
- package/lib/engine-components/webxr/WebARSessionRoot.js +770 -770
- package/lib/engine-components/webxr/WebXR.d.ts +232 -232
- package/lib/engine-components/webxr/WebXR.js +561 -561
- package/lib/engine-components/webxr/WebXRAvatar.d.ts +27 -27
- package/lib/engine-components/webxr/WebXRAvatar.js +44 -44
- package/lib/engine-components/webxr/WebXRImageTracking.d.ts +86 -86
- package/lib/engine-components/webxr/WebXRImageTracking.js +471 -471
- package/lib/engine-components/webxr/WebXRPlaneTracking.d.ts +92 -92
- package/lib/engine-components/webxr/WebXRPlaneTracking.js +500 -500
- package/lib/engine-components/webxr/WebXRRig.d.ts +32 -32
- package/lib/engine-components/webxr/WebXRRig.js +72 -72
- package/lib/engine-components/webxr/XRFlag.d.ts +38 -38
- package/lib/engine-components/webxr/XRFlag.js +139 -139
- package/lib/engine-components/webxr/controllers/XRControllerFollow.d.ts +47 -47
- package/lib/engine-components/webxr/controllers/XRControllerFollow.js +120 -120
- package/lib/engine-components/webxr/controllers/XRControllerModel.d.ts +43 -43
- package/lib/engine-components/webxr/controllers/XRControllerModel.js +352 -352
- package/lib/engine-components/webxr/controllers/XRControllerMovement.d.ts +78 -78
- package/lib/engine-components/webxr/controllers/XRControllerMovement.js +506 -506
- package/lib/engine-components/webxr/index.d.ts +3 -3
- package/lib/engine-components/webxr/index.js +3 -3
- package/lib/engine-components/webxr/types.d.ts +3 -3
- package/lib/engine-components/webxr/types.js +1 -1
- package/lib/engine-components-experimental/Presentation.d.ts +6 -6
- package/lib/engine-components-experimental/Presentation.js +9 -9
- package/lib/engine-components-experimental/api.d.ts +4 -4
- package/lib/engine-components-experimental/api.js +4 -4
- package/lib/engine-components-experimental/networking/PlayerSync.d.ts +156 -156
- package/lib/engine-components-experimental/networking/PlayerSync.js +377 -377
- package/lib/engine-schemes/api.d.ts +12 -12
- package/lib/engine-schemes/api.js +12 -12
- package/lib/engine-schemes/schemes.d.ts +7 -7
- package/lib/engine-schemes/schemes.js +19 -19
- package/lib/engine-schemes/synced-camera-model.d.ts +25 -25
- package/lib/engine-schemes/synced-camera-model.js +67 -67
- package/lib/engine-schemes/synced-transform-model.d.ts +31 -31
- package/lib/engine-schemes/synced-transform-model.js +66 -66
- package/lib/engine-schemes/transform.d.ts +12 -12
- package/lib/engine-schemes/transform.js +39 -39
- package/lib/engine-schemes/vec2.d.ts +10 -10
- package/lib/engine-schemes/vec2.js +25 -25
- package/lib/engine-schemes/vec3.d.ts +11 -11
- package/lib/engine-schemes/vec3.js +29 -29
- package/lib/engine-schemes/vec4.d.ts +12 -12
- package/lib/engine-schemes/vec4.js +33 -33
- package/lib/engine-schemes/vr-user-state-buffer.d.ts +37 -37
- package/lib/engine-schemes/vr-user-state-buffer.js +110 -110
- package/lib/include/three/EXT_mesh_gpu_instancing_exporter.d.ts +6 -6
- package/lib/include/three/EXT_mesh_gpu_instancing_exporter.js +45 -45
- package/lib/needle-engine.d.ts +7 -7
- package/lib/needle-engine.js +64 -64
- package/package.json +3 -3
- package/plugins/common/buildinfo.js +64 -64
- package/plugins/common/cloud.js +1 -1
- package/plugins/common/config.cjs +31 -31
- package/plugins/common/config.js +35 -35
- package/plugins/common/files.js +31 -31
- package/plugins/common/generator.js +10 -10
- package/plugins/common/license.js +452 -452
- package/plugins/common/logger.js +327 -327
- package/plugins/common/npm.js +15 -15
- package/plugins/common/timers.js +7 -7
- package/plugins/common/version.js +37 -37
- package/plugins/gltf-packer.mjs +1 -1
- package/plugins/next/alias.cjs +39 -39
- package/plugins/next/license.cjs +24 -24
- package/plugins/next/meshbvhworker.cjs +18 -18
- package/plugins/next/next.js +141 -141
- package/plugins/types/index.d.ts +2 -2
- package/plugins/types/license.d.ts +24 -24
- package/plugins/types/needleConfig.d.ts +27 -27
- package/plugins/types/next.d.ts +2 -2
- package/plugins/types/userconfig.d.ts +124 -124
- package/plugins/types/vite.d.ts +13 -13
- package/plugins/types/webmanifest.d.ts +32 -32
- package/plugins/vite/alias.js +189 -189
- package/plugins/vite/asap.js +251 -251
- package/plugins/vite/build-pipeline.js +371 -371
- package/plugins/vite/build.js +19 -19
- package/plugins/vite/buildinfo.js +41 -41
- package/plugins/vite/config.js +106 -106
- package/plugins/vite/copyfiles.js +138 -138
- package/plugins/vite/defines.js +70 -70
- package/plugins/vite/dependencies.js +232 -232
- package/plugins/vite/dependency-watcher.js +237 -237
- package/plugins/vite/drop-client.js +76 -76
- package/plugins/vite/drop.js +87 -87
- package/plugins/vite/editor-connection.js +124 -124
- package/plugins/vite/facebook-instant-games.js +102 -102
- package/plugins/vite/gzip.js +5 -5
- package/plugins/vite/imports-logger.js +143 -143
- package/plugins/vite/index.js +147 -147
- package/plugins/vite/license.js +56 -56
- package/plugins/vite/local-files.js +440 -440
- package/plugins/vite/logger.client.js +272 -272
- package/plugins/vite/logger.js +100 -100
- package/plugins/vite/materialx.js +31 -31
- package/plugins/vite/meta.js +163 -163
- package/plugins/vite/npm.js +7 -7
- package/plugins/vite/peer.js +29 -29
- package/plugins/vite/poster-client.js +73 -73
- package/plugins/vite/poster.js +79 -79
- package/plugins/vite/pwa.js +604 -604
- package/plugins/vite/reload-client.js +15 -15
- package/plugins/vite/reload.js +351 -351
- package/plugins/vite/server.js +66 -66
- package/plugins/vite/transform-codegen.js +55 -55
- package/plugins/vite/transform.js +32 -32
- package/plugins/vite/vite-4.4-hack.js +31 -31
- package/src/asap/needle-asap.ts +111 -111
- package/src/asap/sessiongranted.ts +75 -75
- package/src/asap/utils.ts +4 -4
- package/src/engine/analytics/index.ts +10 -10
- package/src/engine/analytics/lcp.ts +35 -35
- package/src/engine/api.ts +82 -82
- package/src/engine/assets/index.ts +59 -59
- package/src/engine/assets/static.js +5 -5
- package/src/engine/codegen/register_types.ts +300 -300
- package/src/engine/debug/debug.ts +51 -51
- package/src/engine/debug/debug_console.ts +333 -333
- package/src/engine/debug/debug_overlay.ts +332 -332
- package/src/engine/debug/debug_spatial_console.ts +429 -429
- package/src/engine/debug/index.ts +1 -1
- package/src/engine/engine_addressables.ts +671 -671
- package/src/engine/engine_animation.ts +145 -145
- package/src/engine/engine_application.ts +113 -113
- package/src/engine/engine_assetdatabase.ts +389 -389
- package/src/engine/engine_audio.ts +24 -24
- package/src/engine/engine_camera.ts +39 -39
- package/src/engine/engine_components.ts +366 -366
- package/src/engine/engine_components_internal.ts +40 -40
- package/src/engine/engine_constants.ts +52 -52
- package/src/engine/engine_context.ts +1824 -1824
- package/src/engine/engine_context_registry.ts +129 -129
- package/src/engine/engine_coroutine.ts +54 -54
- package/src/engine/engine_create_objects.ts +411 -411
- package/src/engine/engine_default_parameters.ts +3 -3
- package/src/engine/engine_editor-sync.ts +28 -28
- package/src/engine/engine_fileloader.js +9 -9
- package/src/engine/engine_gameobject.ts +712 -712
- package/src/engine/engine_generic_utils.js +13 -13
- package/src/engine/engine_gizmos.ts +577 -577
- package/src/engine/engine_gltf.ts +29 -29
- package/src/engine/engine_gltf_builtin_components.ts +403 -403
- package/src/engine/engine_hot_reload.ts +210 -210
- package/src/engine/engine_input.ts +1500 -1500
- package/src/engine/engine_input_utils.ts +23 -23
- package/src/engine/engine_instancing.ts +45 -45
- package/src/engine/engine_license.ts +386 -386
- package/src/engine/engine_lifecycle_api.ts +113 -113
- package/src/engine/engine_lifecycle_functions_internal.ts +193 -193
- package/src/engine/engine_lightdata.ts +125 -125
- package/src/engine/engine_loaders.callbacks.ts +136 -136
- package/src/engine/engine_loaders.gltf.ts +82 -82
- package/src/engine/engine_loaders.ts +378 -378
- package/src/engine/engine_lods.ts +186 -186
- package/src/engine/engine_mainloop_utils.ts +472 -472
- package/src/engine/engine_math.ts +282 -282
- package/src/engine/engine_modules.ts +83 -83
- package/src/engine/engine_networking.ts +862 -862
- package/src/engine/engine_networking_auto.ts +352 -352
- package/src/engine/engine_networking_blob.ts +275 -275
- package/src/engine/engine_networking_files.ts +217 -217
- package/src/engine/engine_networking_files_default_components.ts +58 -58
- package/src/engine/engine_networking_instantiate.ts +419 -419
- package/src/engine/engine_networking_peer.ts +159 -159
- package/src/engine/engine_networking_streams.ts +713 -713
- package/src/engine/engine_networking_types.ts +24 -24
- package/src/engine/engine_networking_utils.ts +23 -23
- package/src/engine/engine_networking_websocket.ts +2 -2
- package/src/engine/engine_patcher.ts +199 -199
- package/src/engine/engine_physics.ts +783 -783
- package/src/engine/engine_physics.types.ts +46 -46
- package/src/engine/engine_physics_rapier.ts +1577 -1577
- package/src/engine/engine_playerview.ts +80 -80
- package/src/engine/engine_scenelighting.ts +294 -294
- package/src/engine/engine_serialization.ts +2 -2
- package/src/engine/engine_serialization_builtin_serializer.ts +473 -473
- package/src/engine/engine_serialization_core.ts +720 -720
- package/src/engine/engine_serialization_decorator.ts +80 -80
- package/src/engine/engine_setup.ts +1 -1
- package/src/engine/engine_shaders.ts +267 -267
- package/src/engine/engine_shims.ts +32 -32
- package/src/engine/engine_test_utils.ts +109 -109
- package/src/engine/engine_texture.ts +82 -82
- package/src/engine/engine_three_utils.ts +928 -928
- package/src/engine/engine_time.ts +94 -94
- package/src/engine/engine_time_utils.ts +237 -237
- package/src/engine/engine_tonemapping.ts +208 -208
- package/src/engine/engine_types.ts +730 -730
- package/src/engine/engine_typestore.ts +63 -63
- package/src/engine/engine_util_decorator.ts +136 -136
- package/src/engine/engine_utils.ts +1115 -1115
- package/src/engine/engine_utils_format.ts +273 -273
- package/src/engine/engine_utils_screenshot.ts +708 -708
- package/src/engine/engine_utils_screenshot.xr.ts +103 -103
- package/src/engine/export/gltf/Writers.ts +34 -34
- package/src/engine/export/gltf/index.ts +158 -158
- package/src/engine/export/index.ts +2 -2
- package/src/engine/export/state.ts +19 -19
- package/src/engine/export/utils.ts +9 -9
- package/src/engine/extensions/EXT_texture_exr.ts +50 -50
- package/src/engine/extensions/NEEDLE_animator_controller_model.ts +195 -195
- package/src/engine/extensions/NEEDLE_components.ts +268 -268
- package/src/engine/extensions/NEEDLE_gameobject_data.ts +81 -81
- package/src/engine/extensions/NEEDLE_lighting_settings.ts +185 -185
- package/src/engine/extensions/NEEDLE_lightmaps.ts +119 -119
- package/src/engine/extensions/NEEDLE_persistent_assets.ts +76 -76
- package/src/engine/extensions/NEEDLE_render_objects.ts +209 -209
- package/src/engine/extensions/NEEDLE_techniques_webgl.ts +640 -640
- package/src/engine/extensions/extension_resolver.ts +4 -4
- package/src/engine/extensions/extension_utils.ts +166 -166
- package/src/engine/extensions/extensions.ts +140 -140
- package/src/engine/extensions/index.ts +5 -5
- package/src/engine/extensions/usage_tracker.ts +100 -100
- package/src/engine/js-extensions/Camera.ts +37 -37
- package/src/engine/js-extensions/ExtensionUtils.ts +85 -85
- package/src/engine/js-extensions/Layers.ts +23 -23
- package/src/engine/js-extensions/Object3D.ts +296 -296
- package/src/engine/js-extensions/RGBAColor.ts +126 -126
- package/src/engine/js-extensions/Vector.ts +18 -18
- package/src/engine/js-extensions/index.ts +4 -4
- package/src/engine/physics/workers/mesh-bvh/GenerateMeshBVHWorker.js +125 -125
- package/src/engine/shaders/shaderData.ts +67 -67
- package/src/engine/tests/test_utils.ts +63 -63
- package/src/engine/webcomponents/WebXRButtons.ts +260 -260
- package/src/engine/webcomponents/api.ts +6 -6
- package/src/engine/webcomponents/buttons.ts +292 -292
- package/src/engine/webcomponents/fonts.ts +41 -41
- package/src/engine/webcomponents/icons.ts +57 -57
- package/src/engine/webcomponents/index.ts +1 -1
- package/src/engine/webcomponents/logo-element.ts +78 -78
- package/src/engine/webcomponents/needle menu/needle-menu-spatial.ts +573 -573
- package/src/engine/webcomponents/needle menu/needle-menu.ts +1118 -1118
- package/src/engine/webcomponents/needle-button.ts +181 -181
- package/src/engine/webcomponents/needle-engine.ar-overlay.ts +186 -186
- package/src/engine/webcomponents/needle-engine.attributes.ts +82 -82
- package/src/engine/webcomponents/needle-engine.extras.ts +16 -16
- package/src/engine/webcomponents/needle-engine.loading.ts +373 -373
- package/src/engine/webcomponents/needle-engine.ts +860 -860
- package/src/engine/xr/NeedleXRController.ts +1125 -1125
- package/src/engine/xr/NeedleXRSession.ts +1624 -1624
- package/src/engine/xr/NeedleXRSync.ts +220 -220
- package/src/engine/xr/SceneTransition.ts +78 -78
- package/src/engine/xr/TempXRContext.ts +216 -216
- package/src/engine/xr/XRRig.ts +9 -9
- package/src/engine/xr/api.ts +5 -5
- package/src/engine/xr/events.ts +102 -102
- package/src/engine/xr/internal.ts +34 -34
- package/src/engine/xr/usdz.ts +30 -30
- package/src/engine/xr/utils.ts +39 -39
- package/src/engine-components/AlignmentConstraint.ts +36 -36
- package/src/engine-components/Animation.ts +557 -557
- package/src/engine-components/AnimationCurve.ts +150 -150
- package/src/engine-components/AnimationUtils.ts +28 -28
- package/src/engine-components/AnimationUtilsAutoplay.ts +43 -43
- package/src/engine-components/Animator.ts +397 -397
- package/src/engine-components/AnimatorController.ts +1293 -1293
- package/src/engine-components/AudioListener.ts +92 -92
- package/src/engine-components/AudioSource.ts +644 -644
- package/src/engine-components/AvatarLoader.ts +263 -263
- package/src/engine-components/AxesHelper.ts +59 -59
- package/src/engine-components/BasicIKConstraint.ts +54 -54
- package/src/engine-components/BoxCollider.ts +1 -1
- package/src/engine-components/BoxHelperComponent.ts +114 -114
- package/src/engine-components/Camera.ts +719 -719
- package/src/engine-components/CameraUtils.ts +138 -138
- package/src/engine-components/CharacterController.ts +253 -253
- package/src/engine-components/Collider.ts +374 -374
- package/src/engine-components/Component.ts +1297 -1297
- package/src/engine-components/ContactShadows.ts +506 -506
- package/src/engine-components/DeleteBox.ts +62 -62
- package/src/engine-components/DeviceFlag.ts +46 -46
- package/src/engine-components/DragControls.ts +1623 -1623
- package/src/engine-components/DropListener.ts +713 -713
- package/src/engine-components/Duplicatable.ts +198 -198
- package/src/engine-components/EventList.ts +266 -266
- package/src/engine-components/EventTrigger.ts +74 -74
- package/src/engine-components/EventType.ts +22 -22
- package/src/engine-components/Fog.ts +60 -60
- package/src/engine-components/Gizmos.ts +56 -56
- package/src/engine-components/GridHelper.ts +48 -48
- package/src/engine-components/GroundProjection.ts +356 -356
- package/src/engine-components/Interactable.ts +14 -14
- package/src/engine-components/Joints.ts +52 -52
- package/src/engine-components/LODGroup.ts +153 -153
- package/src/engine-components/Light.ts +558 -558
- package/src/engine-components/LookAtConstraint.ts +25 -25
- package/src/engine-components/NeedleMenu.ts +84 -84
- package/src/engine-components/NestedGltf.ts +86 -86
- package/src/engine-components/Networking.ts +114 -114
- package/src/engine-components/OffsetConstraint.ts +60 -60
- package/src/engine-components/OrbitControls.ts +1074 -1074
- package/src/engine-components/PlayerColor.ts +103 -103
- package/src/engine-components/ReflectionProbe.ts +220 -220
- package/src/engine-components/Renderer.ts +903 -903
- package/src/engine-components/RendererInstancing.ts +855 -855
- package/src/engine-components/RendererLightmap.ts +198 -198
- package/src/engine-components/RigidBody.ts +526 -526
- package/src/engine-components/SceneSwitcher.ts +1030 -1030
- package/src/engine-components/ScreenCapture.ts +592 -592
- package/src/engine-components/ShadowCatcher.ts +172 -172
- package/src/engine-components/Skybox.ts +475 -475
- package/src/engine-components/SmoothFollow.ts +76 -76
- package/src/engine-components/SpatialTrigger.ts +229 -229
- package/src/engine-components/SpectatorCamera.ts +787 -787
- package/src/engine-components/SphereCollider.ts +1 -1
- package/src/engine-components/SpriteRenderer.ts +468 -468
- package/src/engine-components/SyncedCamera.ts +220 -220
- package/src/engine-components/SyncedRoom.ts +380 -380
- package/src/engine-components/SyncedTransform.ts +383 -383
- package/src/engine-components/TestRunner.ts +118 -118
- package/src/engine-components/TransformGizmo.ts +219 -219
- package/src/engine-components/VideoPlayer.ts +1025 -1025
- package/src/engine-components/Voip.ts +363 -363
- package/src/engine-components/api.ts +60 -60
- package/src/engine-components/avatar/AvatarBlink_Simple.ts +69 -69
- package/src/engine-components/avatar/AvatarEyeLook_Rotation.ts +63 -63
- package/src/engine-components/avatar/Avatar_Brain_LookAt.ts +139 -139
- package/src/engine-components/avatar/Avatar_MouthShapes.ts +83 -83
- package/src/engine-components/avatar/Avatar_MustacheShake.ts +31 -31
- package/src/engine-components/codegen/components.ts +217 -217
- package/src/engine-components/debug/LogStats.ts +21 -21
- package/src/engine-components/export/gltf/GltfExport.ts +265 -265
- package/src/engine-components/export/usdz/Extension.ts +24 -24
- package/src/engine-components/export/usdz/ThreeUSDZExporter.ts +2426 -2426
- package/src/engine-components/export/usdz/USDZExporter.ts +705 -705
- package/src/engine-components/export/usdz/extensions/Animation.ts +1204 -1204
- package/src/engine-components/export/usdz/extensions/DocumentExtension.ts +9 -9
- package/src/engine-components/export/usdz/extensions/NodeMaterialConverter.ts +532 -532
- package/src/engine-components/export/usdz/extensions/USDZText.ts +240 -240
- package/src/engine-components/export/usdz/extensions/USDZUI.ts +189 -189
- package/src/engine-components/export/usdz/extensions/behavior/Actions.ts +99 -99
- package/src/engine-components/export/usdz/extensions/behavior/AudioExtension.ts +102 -102
- package/src/engine-components/export/usdz/extensions/behavior/Behaviour.ts +320 -320
- package/src/engine-components/export/usdz/extensions/behavior/BehaviourComponents.ts +1225 -1225
- package/src/engine-components/export/usdz/extensions/behavior/BehavioursBuilder.ts +646 -646
- package/src/engine-components/export/usdz/extensions/behavior/PhysicsExtension.ts +132 -132
- package/src/engine-components/export/usdz/index.ts +2 -2
- package/src/engine-components/export/usdz/utils/animationutils.ts +191 -191
- package/src/engine-components/export/usdz/utils/quicklook.ts +50 -50
- package/src/engine-components/particlesystem/ParticleSystem.ts +1287 -1287
- package/src/engine-components/particlesystem/ParticleSystemModules.ts +1765 -1765
- package/src/engine-components/particlesystem/ParticleSystemSubEmitter.ts +111 -111
- package/src/engine-components/particlesystem/api.ts +1 -1
- package/src/engine-components/postprocessing/Effects/Antialiasing.ts +64 -64
- package/src/engine-components/postprocessing/Effects/BloomEffect.ts +116 -116
- package/src/engine-components/postprocessing/Effects/ChromaticAberration.ts +37 -37
- package/src/engine-components/postprocessing/Effects/ColorAdjustments.ts +106 -106
- package/src/engine-components/postprocessing/Effects/DepthOfField.ts +103 -103
- package/src/engine-components/postprocessing/Effects/EffectWrapper.ts +25 -25
- package/src/engine-components/postprocessing/Effects/Pixelation.ts +32 -32
- package/src/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusion.ts +90 -90
- package/src/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.ts +192 -192
- package/src/engine-components/postprocessing/Effects/Sharpening.ts +143 -143
- package/src/engine-components/postprocessing/Effects/TiltShiftEffect.ts +61 -61
- package/src/engine-components/postprocessing/Effects/Tonemapping.ts +103 -103
- package/src/engine-components/postprocessing/Effects/Tonemapping.utils.ts +60 -60
- package/src/engine-components/postprocessing/Effects/Vignette.ts +59 -59
- package/src/engine-components/postprocessing/PostProcessingEffect.ts +192 -192
- package/src/engine-components/postprocessing/PostProcessingHandler.ts +572 -572
- package/src/engine-components/postprocessing/Volume.ts +426 -426
- package/src/engine-components/postprocessing/VolumeParameter.ts +158 -158
- package/src/engine-components/postprocessing/VolumeProfile.ts +61 -61
- package/src/engine-components/postprocessing/index.ts +5 -5
- package/src/engine-components/postprocessing/utils.ts +154 -154
- package/src/engine-components/timeline/PlayableDirector.ts +722 -722
- package/src/engine-components/timeline/SignalAsset.ts +144 -144
- package/src/engine-components/timeline/TimelineModels.ts +92 -92
- package/src/engine-components/timeline/TimelineTracks.ts +967 -967
- package/src/engine-components/timeline/index.ts +3 -3
- package/src/engine-components/ui/BaseUIComponent.ts +203 -203
- package/src/engine-components/ui/Button.ts +307 -307
- package/src/engine-components/ui/Canvas.ts +419 -419
- package/src/engine-components/ui/CanvasGroup.ts +54 -54
- package/src/engine-components/ui/EventSystem.ts +854 -854
- package/src/engine-components/ui/Graphic.ts +275 -275
- package/src/engine-components/ui/Image.ts +112 -112
- package/src/engine-components/ui/InputField.ts +321 -321
- package/src/engine-components/ui/Interfaces.ts +57 -57
- package/src/engine-components/ui/Layout.ts +334 -334
- package/src/engine-components/ui/Outline.ts +13 -13
- package/src/engine-components/ui/PointerEvents.ts +206 -206
- package/src/engine-components/ui/RaycastUtils.ts +69 -69
- package/src/engine-components/ui/Raycaster.ts +102 -102
- package/src/engine-components/ui/RectTransform.ts +375 -375
- package/src/engine-components/ui/SpatialHtml.ts +79 -79
- package/src/engine-components/ui/Symbols.ts +1 -1
- package/src/engine-components/ui/Text.ts +578 -578
- package/src/engine-components/ui/Utils.ts +113 -113
- package/src/engine-components/utils/EnvironmentScene.ts +245 -245
- package/src/engine-components/utils/LookAt.ts +88 -88
- package/src/engine-components/utils/OpenURL.ts +114 -114
- package/src/engine-components/webxr/Avatar.ts +265 -265
- package/src/engine-components/webxr/TeleportTarget.ts +9 -9
- package/src/engine-components/webxr/WebARCameraBackground.ts +175 -175
- package/src/engine-components/webxr/WebARSessionRoot.ts +880 -880
- package/src/engine-components/webxr/WebXR.ts +585 -585
- package/src/engine-components/webxr/WebXRAvatar.ts +66 -66
- package/src/engine-components/webxr/WebXRImageTracking.ts +519 -519
- package/src/engine-components/webxr/WebXRPlaneTracking.ts +570 -570
- package/src/engine-components/webxr/WebXRRig.ts +77 -77
- package/src/engine-components/webxr/XRFlag.ts +147 -147
- package/src/engine-components/webxr/controllers/XRControllerFollow.ts +118 -118
- package/src/engine-components/webxr/controllers/XRControllerModel.ts +373 -373
- package/src/engine-components/webxr/controllers/XRControllerMovement.ts +550 -550
- package/src/engine-components/webxr/index.ts +2 -2
- package/src/engine-components/webxr/types.ts +3 -3
- package/src/engine-components-experimental/Presentation.ts +12 -12
- package/src/engine-components-experimental/api.ts +4 -4
- package/src/engine-components-experimental/networking/PlayerSync.ts +401 -401
- package/src/engine-schemes/COMPILE_SCHEMES.bat +3 -3
- package/src/engine-schemes/COMPILE_TS.bat +11 -11
- package/src/engine-schemes/README.md +1 -1
- package/src/engine-schemes/api.ts +12 -12
- package/src/engine-schemes/schemes.ts +28 -28
- package/src/engine-schemes/synced-camera-model.ts +92 -92
- package/src/engine-schemes/synced-transform-model.ts +90 -90
- package/src/engine-schemes/syncedCamera.fbs +10 -10
- package/src/engine-schemes/transform.ts +50 -50
- package/src/engine-schemes/transforms.fbs +25 -25
- package/src/engine-schemes/vec.fbs +19 -19
- package/src/engine-schemes/vec2.ts +33 -33
- package/src/engine-schemes/vec3.ts +38 -38
- package/src/engine-schemes/vec4.ts +43 -43
- package/src/engine-schemes/vr-user-state-buffer.ts +145 -145
- package/src/engine-schemes/vrUserStateBuffer.fbs +17 -17
- package/src/include/draco/draco_decoder.js +34 -34
- package/src/include/ktx2/basis_transcoder.js +21 -21
- package/src/include/needle/arial-msdf.json +1471 -1471
- package/src/include/three/DragControls.js +231 -231
- package/src/include/three/EXT_mesh_gpu_instancing_exporter.js +66 -66
- package/src/needle-engine.ts +70 -70
- package/dist/generateMeshBVH.worker-Cdfpaq5W.js +0 -25
- package/src/engine-schemes/dist/api.js +0 -17
- package/src/engine-schemes/dist/api.js.meta +0 -7
- package/src/engine-schemes/dist/schemes.js +0 -25
- package/src/engine-schemes/dist/schemes.js.meta +0 -7
- package/src/engine-schemes/dist/synced-camera-model.js +0 -74
- package/src/engine-schemes/dist/synced-camera-model.js.meta +0 -7
- package/src/engine-schemes/dist/synced-transform-model.js +0 -73
- package/src/engine-schemes/dist/synced-transform-model.js.meta +0 -7
- package/src/engine-schemes/dist/transform.js +0 -46
- package/src/engine-schemes/dist/transform.js.meta +0 -7
- package/src/engine-schemes/dist/vec2.js +0 -32
- package/src/engine-schemes/dist/vec2.js.meta +0 -7
- package/src/engine-schemes/dist/vec3.js +0 -36
- package/src/engine-schemes/dist/vec3.js.meta +0 -7
- package/src/engine-schemes/dist/vec4.js +0 -40
- package/src/engine-schemes/dist/vec4.js.meta +0 -7
- package/src/engine-schemes/dist/vr-user-state-buffer.js +0 -110
- package/src/engine-schemes/dist/vr-user-state-buffer.js.meta +0 -7
|
@@ -1,766 +1,766 @@
|
|
|
1
|
-
import { isDevEnvironment, showBalloonMessage } from "../../engine/debug/index.js";
|
|
2
|
-
import { InputEvents, PointerType } from "../../engine/engine_input.js";
|
|
3
|
-
import { onInitialized } from "../../engine/engine_lifecycle_api.js";
|
|
4
|
-
import { Mathf } from "../../engine/engine_math.js";
|
|
5
|
-
import { RaycastOptions } from "../../engine/engine_physics.js";
|
|
6
|
-
import { Context } from "../../engine/engine_setup.js";
|
|
7
|
-
import { getParam } from "../../engine/engine_utils.js";
|
|
8
|
-
import { Behaviour, GameObject } from "../Component.js";
|
|
9
|
-
import { hasPointerEventComponent, PointerEventData } from "./PointerEvents.js";
|
|
10
|
-
import { ObjectRaycaster, Raycaster } from "./Raycaster.js";
|
|
11
|
-
import { UIRaycastUtils } from "./RaycastUtils.js";
|
|
12
|
-
import { $shadowDomOwner } from "./Symbols.js";
|
|
13
|
-
import { isUIObject } from "./Utils.js";
|
|
14
|
-
const debug = getParam("debugeventsystem");
|
|
15
|
-
export var EventSystemEvents;
|
|
16
|
-
(function (EventSystemEvents) {
|
|
17
|
-
EventSystemEvents["BeforeHandleInput"] = "BeforeHandleInput";
|
|
18
|
-
EventSystemEvents["AfterHandleInput"] = "AfterHandleInput";
|
|
19
|
-
})(EventSystemEvents || (EventSystemEvents = {}));
|
|
20
|
-
onInitialized((ctx) => {
|
|
21
|
-
EventSystem.createIfNoneExists(ctx);
|
|
22
|
-
});
|
|
23
|
-
/**
|
|
24
|
-
* @category User Interface
|
|
25
|
-
* @group Components
|
|
26
|
-
*/
|
|
27
|
-
export class EventSystem extends Behaviour {
|
|
28
|
-
//@ts-ignore
|
|
29
|
-
static ensureUpdateMeshUI(instance, context, force = false) {
|
|
30
|
-
MeshUIHelper.update(instance, context, force);
|
|
31
|
-
}
|
|
32
|
-
static markUIDirty(_context) {
|
|
33
|
-
MeshUIHelper.markDirty();
|
|
34
|
-
}
|
|
35
|
-
static createIfNoneExists(context) {
|
|
36
|
-
if (!context.scene.getComponent(EventSystem)) {
|
|
37
|
-
context.scene.addComponent(EventSystem);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
static get(ctx) {
|
|
41
|
-
this.createIfNoneExists(ctx);
|
|
42
|
-
return ctx.scene.getComponent(EventSystem);
|
|
43
|
-
}
|
|
44
|
-
/** Get the currently active event system */
|
|
45
|
-
static get instance() {
|
|
46
|
-
return this.get(Context.Current);
|
|
47
|
-
}
|
|
48
|
-
raycaster = [];
|
|
49
|
-
register(rc) {
|
|
50
|
-
if (rc && this.raycaster && !this.raycaster.includes(rc))
|
|
51
|
-
this.raycaster?.push(rc);
|
|
52
|
-
}
|
|
53
|
-
unregister(rc) {
|
|
54
|
-
const i = this.raycaster?.indexOf(rc);
|
|
55
|
-
if (i !== undefined && i !== -1) {
|
|
56
|
-
this.raycaster?.splice(i, 1);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
get hasActiveUI() {
|
|
60
|
-
return this.currentActiveMeshUIComponents.length > 0;
|
|
61
|
-
}
|
|
62
|
-
get isHoveringObjects() { return this.hoveredByID.size > 0; }
|
|
63
|
-
awake() {
|
|
64
|
-
// We only want ONE eventsystem on the root scene
|
|
65
|
-
// as long as this component is not implemented in core we need to check this here
|
|
66
|
-
if (this.gameObject !== this.context.scene) {
|
|
67
|
-
console.debug(`[Needle Engine] EventSystem is only allowed on the scene root. Disabling EventSystem on '${this.gameObject.name}'`);
|
|
68
|
-
this.enabled = false;
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
start() {
|
|
72
|
-
if (!this.context.scene.getComponent(Raycaster)) {
|
|
73
|
-
this.context.scene.addComponent(ObjectRaycaster);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
onEnable() {
|
|
77
|
-
this.context.input.addEventListener(InputEvents.PointerDown, this.onPointerEvent);
|
|
78
|
-
this.context.input.addEventListener(InputEvents.PointerUp, this.onPointerEvent);
|
|
79
|
-
this.context.input.addEventListener(InputEvents.PointerMove, this.onPointerEvent);
|
|
80
|
-
}
|
|
81
|
-
onDisable() {
|
|
82
|
-
this.context.input.removeEventListener(InputEvents.PointerDown, this.onPointerEvent);
|
|
83
|
-
this.context.input.removeEventListener(InputEvents.PointerUp, this.onPointerEvent);
|
|
84
|
-
this.context.input.removeEventListener(InputEvents.PointerMove, this.onPointerEvent);
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* all pointers that have pressed something
|
|
88
|
-
*
|
|
89
|
-
* key: pointerId
|
|
90
|
-
* value: object that was pressed, data of the pointer event, handlers that are releavant to the event
|
|
91
|
-
*/
|
|
92
|
-
pressedByID = new Map();
|
|
93
|
-
/**
|
|
94
|
-
* all hovered objects
|
|
95
|
-
*
|
|
96
|
-
* key: pointerId
|
|
97
|
-
* value: object that is hovered, data of the pointer event
|
|
98
|
-
*/
|
|
99
|
-
hoveredByID = new Map();
|
|
100
|
-
onBeforeRender() {
|
|
101
|
-
this.resetMeshUIStates();
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* Handle an pointer event from the input system
|
|
105
|
-
*/
|
|
106
|
-
onPointerEvent = (pointerEvent) => {
|
|
107
|
-
if (pointerEvent === undefined)
|
|
108
|
-
return;
|
|
109
|
-
if (pointerEvent.propagationStopped)
|
|
110
|
-
return;
|
|
111
|
-
if (pointerEvent.defaultPrevented)
|
|
112
|
-
return;
|
|
113
|
-
if (pointerEvent.used)
|
|
114
|
-
return;
|
|
115
|
-
// Use the pointerID, this is the touch id or the mouse (always 0, could be index of the mouse DEVICE) or the index of the XRInputSource
|
|
116
|
-
const data = new PointerEventData(this.context.input, pointerEvent);
|
|
117
|
-
this._currentPointerEventName = pointerEvent.type;
|
|
118
|
-
data.inputSource = this.context.input;
|
|
119
|
-
data.isClick = pointerEvent.isClick;
|
|
120
|
-
data.isDoubleClick = pointerEvent.isDoubleClick;
|
|
121
|
-
// using the input type directly instead of input API -> otherwise onMove events can sometimes be getPointerUp() == true
|
|
122
|
-
data.isDown = pointerEvent.type == InputEvents.PointerDown;
|
|
123
|
-
data.isUp = pointerEvent.type == InputEvents.PointerUp;
|
|
124
|
-
data.isPressed = this.context.input.getPointerPressed(pointerEvent.pointerId);
|
|
125
|
-
if (debug) {
|
|
126
|
-
if (data.isDown)
|
|
127
|
-
console.log("DOWN", data.pointerId);
|
|
128
|
-
else if (data.isUp)
|
|
129
|
-
console.log("UP", data.pointerId);
|
|
130
|
-
if (data.isClick)
|
|
131
|
-
console.log("CLICK", data.pointerId);
|
|
132
|
-
}
|
|
133
|
-
// raycast
|
|
134
|
-
const options = new RaycastOptions();
|
|
135
|
-
if (pointerEvent.hasRay) {
|
|
136
|
-
options.ray = pointerEvent.ray;
|
|
137
|
-
}
|
|
138
|
-
else {
|
|
139
|
-
options.screenPoint = this.context.input.getPointerPositionRC(pointerEvent.pointerId);
|
|
140
|
-
}
|
|
141
|
-
const hits = this.performRaycast(options);
|
|
142
|
-
if (hits) {
|
|
143
|
-
for (const hit of hits) {
|
|
144
|
-
hit.event = pointerEvent;
|
|
145
|
-
pointerEvent.intersections.push(hit);
|
|
146
|
-
}
|
|
147
|
-
if (pointerEvent.origin.onPointerHits) {
|
|
148
|
-
pointerEvent.origin.onPointerHits({
|
|
149
|
-
sender: this,
|
|
150
|
-
event: pointerEvent,
|
|
151
|
-
hits
|
|
152
|
-
});
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
if (debug && data.isClick) {
|
|
156
|
-
showBalloonMessage("EventSystem: " + data.pointerId + " - " + this.context.time.frame + " - Up:" + data.isUp + ", Down:" + data.isDown);
|
|
157
|
-
}
|
|
158
|
-
const evt = {
|
|
159
|
-
sender: this,
|
|
160
|
-
args: data,
|
|
161
|
-
hasActiveUI: this.currentActiveMeshUIComponents.length > 0,
|
|
162
|
-
};
|
|
163
|
-
this.dispatchEvent(new CustomEvent(EventSystemEvents.BeforeHandleInput, { detail: evt }));
|
|
164
|
-
// then handle the intersections and call the callbacks on the regular objects
|
|
165
|
-
this.handleIntersections(hits, data);
|
|
166
|
-
this.dispatchEvent(new CustomEvent(EventSystemEvents.AfterHandleInput, { detail: evt }));
|
|
167
|
-
};
|
|
168
|
-
_sortedHits = [];
|
|
169
|
-
/**
|
|
170
|
-
* cache for objects that we want to raycast against. It's cleared before each call to performRaycast invoking raycasters
|
|
171
|
-
*/
|
|
172
|
-
_testObjectsCache = new Map();
|
|
173
|
-
/** that's the raycaster that is CURRENTLY being used for raycasting (the shouldRaycastObject method uses this) */
|
|
174
|
-
_currentlyActiveRaycaster = null;
|
|
175
|
-
_currentPointerEventName = null;
|
|
176
|
-
/**
|
|
177
|
-
* Checks if an object that we encounter has an event component and if it does, we add it to our objects cache
|
|
178
|
-
* If it doesnt we tell our raycasting system to ignore it and continue in the child hierarchy
|
|
179
|
-
* We do this to avoid raycasts against objects that are not going to be used by the event system
|
|
180
|
-
* Because there's no component callback to be invoked anyways.
|
|
181
|
-
* This is especially important to avoid expensive raycasts against SkinnedMeshes
|
|
182
|
-
*
|
|
183
|
-
* Further optimizations would be to check what type of event we're dealing with
|
|
184
|
-
* For example if an event component has only an onPointerClick method we don't need to raycast during movement events
|
|
185
|
-
* */
|
|
186
|
-
shouldRaycastObject = (obj) => {
|
|
187
|
-
// TODO: this implementation below should be removed and we should regularly raycast objects in the scene unless marked as "do not raycast"
|
|
188
|
-
// with the introduction of the mesh-bvh based raycasting the performance impact should be greatly reduced. But this needs further testing
|
|
189
|
-
const raycasterOnObject = obj && "getComponent" in obj ? obj.getComponent(Raycaster) : null;
|
|
190
|
-
if (raycasterOnObject && raycasterOnObject != this._currentlyActiveRaycaster) {
|
|
191
|
-
return false;
|
|
192
|
-
}
|
|
193
|
-
// if (this._currentPointerEventName == "pointermove") {
|
|
194
|
-
// console.log(this.context.time.frame, obj.name, obj.type, obj.guid)
|
|
195
|
-
// }
|
|
196
|
-
// check if this object is actually a UI shadow hierarchy object
|
|
197
|
-
let uiOwner = null;
|
|
198
|
-
const isUI = isUIObject(obj);
|
|
199
|
-
// if yes we want to grab the actual object that is the owner of the shadow dom
|
|
200
|
-
// and check that object for the event component
|
|
201
|
-
if (isUI) {
|
|
202
|
-
uiOwner = obj[$shadowDomOwner]?.gameObject;
|
|
203
|
-
}
|
|
204
|
-
// check if the object was seen previously
|
|
205
|
-
if (this._testObjectsCache.has(obj) || (uiOwner && this._testObjectsCache.has(uiOwner))) {
|
|
206
|
-
// if yes we check if it was previously stored as "YES WE NEED TO RAYCAST THIS"
|
|
207
|
-
const prev = this._testObjectsCache.get(obj);
|
|
208
|
-
if (prev === false)
|
|
209
|
-
return "continue in children";
|
|
210
|
-
return true;
|
|
211
|
-
}
|
|
212
|
-
else {
|
|
213
|
-
// if the object has another raycaster component than the one that is currently raycasting, we ignore this here
|
|
214
|
-
// because then this other raycaster is responsible for raycasting this object
|
|
215
|
-
// const rc = GameObject.getComponent(obj, Raycaster);
|
|
216
|
-
// if (rc?.activeAndEnabled && rc !== this._currentlyActiveRaycaster) return false;
|
|
217
|
-
// the object was not yet seen so we test if it has an event component
|
|
218
|
-
let hasEventComponent = hasPointerEventComponent(obj, this._currentPointerEventName);
|
|
219
|
-
if (!hasEventComponent && uiOwner)
|
|
220
|
-
hasEventComponent = hasPointerEventComponent(uiOwner, this._currentPointerEventName);
|
|
221
|
-
if (hasEventComponent) {
|
|
222
|
-
// it has an event component: we add it and all its children to the cache
|
|
223
|
-
// we don't need to do the same for the shadow component hierarchy
|
|
224
|
-
// because the next object that will be detecting that the shadow owner was already seen
|
|
225
|
-
this._testObjectsCache.set(obj, true);
|
|
226
|
-
for (const ch of obj.children)
|
|
227
|
-
this.shouldRaycastObject_AddToYesCache(ch);
|
|
228
|
-
return true;
|
|
229
|
-
}
|
|
230
|
-
this._testObjectsCache.set(obj, false);
|
|
231
|
-
return "continue in children";
|
|
232
|
-
}
|
|
233
|
-
};
|
|
234
|
-
shouldRaycastObject_AddToYesCache(obj) {
|
|
235
|
-
// if the object has another raycaster component than the one that is currently raycasting, we ignore this here
|
|
236
|
-
// because then this other raycaster is responsible for raycasting this object
|
|
237
|
-
// const rc = GameObject.getComponent(obj, Raycaster);
|
|
238
|
-
// if (rc?.activeAndEnabled && rc !== this._currentlyActiveRaycaster) return;
|
|
239
|
-
this._testObjectsCache.set(obj, true);
|
|
240
|
-
for (const ch of obj.children) {
|
|
241
|
-
this.shouldRaycastObject_AddToYesCache(ch);
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
/** the raycast filter is always overriden */
|
|
245
|
-
performRaycast(opts) {
|
|
246
|
-
if (!this.raycaster)
|
|
247
|
-
return null;
|
|
248
|
-
// we clear the cache of previously seen objects
|
|
249
|
-
this._testObjectsCache.clear();
|
|
250
|
-
this._sortedHits.length = 0;
|
|
251
|
-
if (!opts)
|
|
252
|
-
opts = new RaycastOptions();
|
|
253
|
-
opts.testObject = this.shouldRaycastObject;
|
|
254
|
-
for (const rc of this.raycaster) {
|
|
255
|
-
if (!rc.activeAndEnabled)
|
|
256
|
-
continue;
|
|
257
|
-
this._currentlyActiveRaycaster = rc;
|
|
258
|
-
const res = rc.performRaycast(opts);
|
|
259
|
-
this._currentlyActiveRaycaster = null;
|
|
260
|
-
if (res && res.length > 0) {
|
|
261
|
-
// console.log(res.length, res.map(r => r.object.name));
|
|
262
|
-
this._sortedHits.push(...res);
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
this._sortedHits.sort((a, b) => {
|
|
266
|
-
return a.distance - b.distance;
|
|
267
|
-
});
|
|
268
|
-
return this._sortedHits;
|
|
269
|
-
}
|
|
270
|
-
assignHitInformation(args, hit) {
|
|
271
|
-
if (!hit) {
|
|
272
|
-
args.intersection = undefined;
|
|
273
|
-
args.point = undefined;
|
|
274
|
-
args.normal = undefined;
|
|
275
|
-
args.face = undefined;
|
|
276
|
-
args.distance = undefined;
|
|
277
|
-
args.instanceId = undefined;
|
|
278
|
-
}
|
|
279
|
-
else {
|
|
280
|
-
args.intersection = hit;
|
|
281
|
-
args.point = hit.point;
|
|
282
|
-
args.normal = hit.normal;
|
|
283
|
-
args.face = hit.face;
|
|
284
|
-
args.distance = hit.distance;
|
|
285
|
-
args.instanceId = hit.instanceId;
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
handleIntersections(hits, args) {
|
|
289
|
-
if (hits?.length) {
|
|
290
|
-
hits = this.sortCandidates(hits);
|
|
291
|
-
for (const hit of hits) {
|
|
292
|
-
if (args.event.immediatePropagationStopped) {
|
|
293
|
-
return false;
|
|
294
|
-
}
|
|
295
|
-
this.assignHitInformation(args, hit);
|
|
296
|
-
if (this.handleEventOnObject(hit.object, args)) {
|
|
297
|
-
return true;
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
// first invoke captured pointers
|
|
302
|
-
this.assignHitInformation(args, hits?.[0]);
|
|
303
|
-
this.invokePointerCapture(args);
|
|
304
|
-
// pointer has not hit any object to handle
|
|
305
|
-
// thus is not hovering over anything
|
|
306
|
-
const hoveredData = this.hoveredByID.get(args.pointerId);
|
|
307
|
-
if (hoveredData) {
|
|
308
|
-
this.propagatePointerExit(hoveredData.obj, hoveredData.data, null);
|
|
309
|
-
}
|
|
310
|
-
this.hoveredByID.delete(args.pointerId);
|
|
311
|
-
// if it was up, it means it should notify things that it down on before
|
|
312
|
-
if (args.isUp) {
|
|
313
|
-
this.pressedByID.get(args.pointerId)?.handlers.forEach(h => this.invokeOnPointerUp(args, h));
|
|
314
|
-
this.pressedByID.delete(args.pointerId);
|
|
315
|
-
}
|
|
316
|
-
return false;
|
|
317
|
-
}
|
|
318
|
-
_sortingBuffer = [];
|
|
319
|
-
_noDepthTestingResults = [];
|
|
320
|
-
sortCandidates(hits) {
|
|
321
|
-
// iterate over all hits and filter for nodepth objects and normal hit objects
|
|
322
|
-
// the no-depth objects will be handled first starting from the closest
|
|
323
|
-
// assuming the hits array is sorted by distance (closest > furthest)
|
|
324
|
-
this._sortingBuffer.length = 0;
|
|
325
|
-
this._noDepthTestingResults.length = 0;
|
|
326
|
-
for (let i = 0; i < hits.length; i++) {
|
|
327
|
-
const hit = hits[i];
|
|
328
|
-
const object = hit.object;
|
|
329
|
-
if (object.material) {
|
|
330
|
-
if (object.material["depthTest"] === false) {
|
|
331
|
-
this._noDepthTestingResults.push(hit);
|
|
332
|
-
continue;
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
this._sortingBuffer.push(hit);
|
|
336
|
-
}
|
|
337
|
-
for (const obj of this._sortingBuffer) {
|
|
338
|
-
this._noDepthTestingResults.push(obj);
|
|
339
|
-
}
|
|
340
|
-
return this._noDepthTestingResults;
|
|
341
|
-
}
|
|
342
|
-
out = {};
|
|
343
|
-
/**
|
|
344
|
-
* Handle hit result by preparing all needed information before propagation.
|
|
345
|
-
* Then calling propagate.
|
|
346
|
-
*/
|
|
347
|
-
handleEventOnObject(object, args) {
|
|
348
|
-
// ensures that invisible objects are ignored
|
|
349
|
-
if (!this.testIsVisible(object)) {
|
|
350
|
-
if (args.isClick && debug)
|
|
351
|
-
console.log("not allowed", object);
|
|
352
|
-
return false;
|
|
353
|
-
}
|
|
354
|
-
// Event without pointer can't be handled
|
|
355
|
-
if (args.pointerId === undefined) {
|
|
356
|
-
if (debug)
|
|
357
|
-
console.error("Event without pointer can't be handled", args);
|
|
358
|
-
return false;
|
|
359
|
-
}
|
|
360
|
-
// Correct the handled object to match the relevant object in shadow dom (?)
|
|
361
|
-
args.object = object;
|
|
362
|
-
const parent = object.parent;
|
|
363
|
-
let isShadow = false;
|
|
364
|
-
const clicked = args.isClick ?? false;
|
|
365
|
-
let canvasGroup = null;
|
|
366
|
-
// handle potential shadow dom built from three mesh ui
|
|
367
|
-
if (parent && parent.isUI) {
|
|
368
|
-
const pressedOrClicked = (args.isPressed || args.isClick) ?? false;
|
|
369
|
-
if (parent[$shadowDomOwner]) {
|
|
370
|
-
const actualGo = parent[$shadowDomOwner].gameObject;
|
|
371
|
-
if (actualGo) {
|
|
372
|
-
const res = UIRaycastUtils.isInteractable(actualGo, this.out);
|
|
373
|
-
if (!res)
|
|
374
|
-
return false;
|
|
375
|
-
canvasGroup = this.out.canvasGroup ?? null;
|
|
376
|
-
const handled = this.handleMeshUIIntersection(object, pressedOrClicked);
|
|
377
|
-
if (!clicked && handled) {
|
|
378
|
-
// return true;
|
|
379
|
-
}
|
|
380
|
-
object = actualGo;
|
|
381
|
-
isShadow = true;
|
|
382
|
-
}
|
|
383
|
-
}
|
|
384
|
-
// adding this to have a way for allowing to receive events on TMUI elements without shadow hierarchy
|
|
385
|
-
// if(parent["needle:use_eventsystem"] == true){
|
|
386
|
-
// // if use_eventsystem is true, we want to handle the event
|
|
387
|
-
// }
|
|
388
|
-
// else if (!isShadow) {
|
|
389
|
-
// const obj = this.handleMeshUiObjectWithoutShadowDom(parent, pressedOrClicked);
|
|
390
|
-
// if (obj) return true;
|
|
391
|
-
// }
|
|
392
|
-
}
|
|
393
|
-
if (clicked && debug)
|
|
394
|
-
console.log(this.context.time.frame, object);
|
|
395
|
-
// Handle OnPointerExit -> in case when we are about to hover something new
|
|
396
|
-
// TODO: we need to keep track of the components that already received a PointerEnterEvent -> we can have a hierarchy where the hovered object changes but the component is on the parent and should not receive a PointerExit event because it's still hovered (just another child object)
|
|
397
|
-
const hovering = this.hoveredByID.get(args.pointerId);
|
|
398
|
-
const prevHovering = hovering?.obj;
|
|
399
|
-
const isNewlyHovering = prevHovering !== object;
|
|
400
|
-
// trigger onPointerExit
|
|
401
|
-
if (isNewlyHovering && prevHovering) {
|
|
402
|
-
this.propagatePointerExit(prevHovering, hovering.data, object);
|
|
403
|
-
}
|
|
404
|
-
// save hovered object
|
|
405
|
-
const entry = this.hoveredByID.get(args.pointerId);
|
|
406
|
-
if (!entry)
|
|
407
|
-
this.hoveredByID.set(args.pointerId, { obj: object, data: args });
|
|
408
|
-
else {
|
|
409
|
-
entry.obj = object;
|
|
410
|
-
entry.data = args;
|
|
411
|
-
}
|
|
412
|
-
// create / update pressed entry
|
|
413
|
-
if (args.isDown) {
|
|
414
|
-
const data = this.pressedByID.get(args.pointerId);
|
|
415
|
-
if (!data)
|
|
416
|
-
this.pressedByID.set(args.pointerId, { obj: object, data: args, handlers: new Set() });
|
|
417
|
-
else {
|
|
418
|
-
data.obj = object;
|
|
419
|
-
data.data = args;
|
|
420
|
-
}
|
|
421
|
-
}
|
|
422
|
-
if (canvasGroup === null || canvasGroup.interactable) {
|
|
423
|
-
this.handleMainInteraction(object, args, prevHovering ?? null);
|
|
424
|
-
}
|
|
425
|
-
return true;
|
|
426
|
-
}
|
|
427
|
-
/**
|
|
428
|
-
* Propagate up in hiearchy and call the callback for each component that is possibly a handler
|
|
429
|
-
*/
|
|
430
|
-
propagate(object, onComponent) {
|
|
431
|
-
while (true) {
|
|
432
|
-
if (!object)
|
|
433
|
-
break;
|
|
434
|
-
GameObject.foreachComponent(object, comp => {
|
|
435
|
-
// TODO: implement Stop Immediate Propagation
|
|
436
|
-
onComponent(comp);
|
|
437
|
-
}, false);
|
|
438
|
-
// walk up
|
|
439
|
-
object = object.parent;
|
|
440
|
-
}
|
|
441
|
-
}
|
|
442
|
-
/**
|
|
443
|
-
* Propagate up in hierarchy and call handlers based on the pointer event data
|
|
444
|
-
*/
|
|
445
|
-
handleMainInteraction(object, args, prevHovering) {
|
|
446
|
-
const pressedEvent = this.pressedByID.get(args.pointerId);
|
|
447
|
-
const hoveredObjectChanged = prevHovering !== object;
|
|
448
|
-
// TODO: should we not move this check up before we even raycast for "pointerMove" events? We dont need to do any processing if the pointer didnt move
|
|
449
|
-
let isMoving = true;
|
|
450
|
-
switch (args.event.pointerType) {
|
|
451
|
-
case "mouse":
|
|
452
|
-
case "touch":
|
|
453
|
-
const posLastFrame = this.context.input.getPointerPositionLastFrame(args.pointerId);
|
|
454
|
-
const posThisFrame = this.context.input.getPointerPosition(args.pointerId);
|
|
455
|
-
isMoving = posLastFrame && !Mathf.approximately(posLastFrame, posThisFrame);
|
|
456
|
-
break;
|
|
457
|
-
case "controller":
|
|
458
|
-
case "hand":
|
|
459
|
-
// for hands and controller we assume they are never totally still (except for simulated environments)
|
|
460
|
-
// we might want to add a threshold here (e.g. if a user holds their hand very still or controller)
|
|
461
|
-
// so maybe check the angle every frame?
|
|
462
|
-
break;
|
|
463
|
-
}
|
|
464
|
-
this.propagate(object, (behaviour) => {
|
|
465
|
-
const comp = behaviour;
|
|
466
|
-
if (comp.interactable === false)
|
|
467
|
-
return;
|
|
468
|
-
if (!comp.activeAndEnabled || !comp.enabled)
|
|
469
|
-
return;
|
|
470
|
-
if (comp.onPointerEnter) {
|
|
471
|
-
if (hoveredObjectChanged) {
|
|
472
|
-
this.handlePointerEnter(comp, args);
|
|
473
|
-
}
|
|
474
|
-
}
|
|
475
|
-
if (args.isDown) {
|
|
476
|
-
if (comp.onPointerDown) {
|
|
477
|
-
comp.onPointerDown(args);
|
|
478
|
-
// Set the handler that we called the down event on
|
|
479
|
-
// So we can call the up event on the same handler
|
|
480
|
-
// In a scenario where we Down on one object and Up on another
|
|
481
|
-
pressedEvent?.handlers.add(comp);
|
|
482
|
-
this.handlePointerCapture(args, comp);
|
|
483
|
-
}
|
|
484
|
-
}
|
|
485
|
-
if (comp.onPointerMove) {
|
|
486
|
-
if (isMoving)
|
|
487
|
-
comp.onPointerMove(args);
|
|
488
|
-
this.handlePointerCapture(args, comp);
|
|
489
|
-
}
|
|
490
|
-
if (args.isUp) {
|
|
491
|
-
if (comp.onPointerUp) {
|
|
492
|
-
this.invokeOnPointerUp(args, comp);
|
|
493
|
-
// We don't want to call Up twice if we Down and Up on the same object
|
|
494
|
-
// But if we Down on one and Up on another we want to call Up on the first one as well
|
|
495
|
-
// For example if the object was cloned by the Duplicatable
|
|
496
|
-
// The original component that received the down event SHOULD also receive the up event
|
|
497
|
-
pressedEvent?.handlers.delete(comp);
|
|
498
|
-
}
|
|
499
|
-
// handle touch onExit (touchUp) since the pointer stops existing
|
|
500
|
-
// mouse onExit (mouseUp) is handled when we hover over something else / on nothing
|
|
501
|
-
// Mouse 0 is always persistent
|
|
502
|
-
if (comp.onPointerExit && args.event?.pointerType === PointerType.Touch) {
|
|
503
|
-
this.handlePointerExit(comp, args);
|
|
504
|
-
this.hoveredByID.delete(args.pointerId);
|
|
505
|
-
}
|
|
506
|
-
}
|
|
507
|
-
if (args.isClick) {
|
|
508
|
-
if (comp.onPointerClick) {
|
|
509
|
-
comp.onPointerClick(args);
|
|
510
|
-
}
|
|
511
|
-
}
|
|
512
|
-
});
|
|
513
|
-
// after the propagation end, call UP on any objects that were DOWNED and didn't recieve an UP while propagating
|
|
514
|
-
// If user drags away from the object, then it doesn't get the UP event
|
|
515
|
-
if (args.isUp) {
|
|
516
|
-
pressedEvent?.handlers.forEach((handler) => {
|
|
517
|
-
this.invokeOnPointerUp(args, handler);
|
|
518
|
-
});
|
|
519
|
-
this.pressedByID.delete(args.pointerId);
|
|
520
|
-
}
|
|
521
|
-
}
|
|
522
|
-
/** Propagate up in hierarchy and call onPointerExit */
|
|
523
|
-
propagatePointerExit(object, args, newObject) {
|
|
524
|
-
this.propagate(object, (behaviour) => {
|
|
525
|
-
if (!behaviour.gameObject || behaviour.destroyed)
|
|
526
|
-
return;
|
|
527
|
-
const inst = behaviour;
|
|
528
|
-
if (inst.onPointerExit || inst.onPointerEnter) {
|
|
529
|
-
// if the newly hovered object is a child of the current object, we don't want to call onPointerExit
|
|
530
|
-
if (newObject && this.isChild(newObject, behaviour.gameObject)) {
|
|
531
|
-
return;
|
|
532
|
-
}
|
|
533
|
-
this.handlePointerExit(inst, args);
|
|
534
|
-
}
|
|
535
|
-
});
|
|
536
|
-
}
|
|
537
|
-
/** handles onPointerUp - this will also release the pointerCapture */
|
|
538
|
-
invokeOnPointerUp(evt, handler) {
|
|
539
|
-
handler.onPointerUp?.call(handler, evt);
|
|
540
|
-
this.releasePointerCapture(evt, handler);
|
|
541
|
-
}
|
|
542
|
-
/** Responsible for invoking onPointerEnter (and updating onPointerExit). We invoke onPointerEnter once per active pointerId */
|
|
543
|
-
handlePointerEnter(comp, args) {
|
|
544
|
-
if (comp.onPointerEnter) {
|
|
545
|
-
if (this.updatePointerState(comp, args.pointerId, this.pointerEnterSymbol, true)) {
|
|
546
|
-
comp.onPointerEnter(args);
|
|
547
|
-
}
|
|
548
|
-
}
|
|
549
|
-
this.updatePointerState(comp, args.pointerId, this.pointerExitSymbol, false);
|
|
550
|
-
}
|
|
551
|
-
/** Responsible for invoking onPointerExit (and updating onPointerEnter). We invoke onPointerExit once per active pointerId */
|
|
552
|
-
handlePointerExit(comp, evt) {
|
|
553
|
-
if (comp.onPointerExit) {
|
|
554
|
-
if (this.updatePointerState(comp, evt.pointerId, this.pointerExitSymbol, true)) {
|
|
555
|
-
comp.onPointerExit(evt);
|
|
556
|
-
}
|
|
557
|
-
}
|
|
558
|
-
this.updatePointerState(comp, evt.pointerId, this.pointerEnterSymbol, false);
|
|
559
|
-
}
|
|
560
|
-
/** updates the pointer state list for a component
|
|
561
|
-
* @param comp the component to update
|
|
562
|
-
* @param pointerId the pointerId to update
|
|
563
|
-
* @param symbol the symbol to use for the state
|
|
564
|
-
* @param add if true, the pointerId is added to the state list, if false the pointerId will be removed
|
|
565
|
-
*/
|
|
566
|
-
updatePointerState(comp, pointerId, symbol, add) {
|
|
567
|
-
let state = comp[symbol];
|
|
568
|
-
if (add) {
|
|
569
|
-
// the pointer is already in the state list
|
|
570
|
-
if (state && state.includes(pointerId))
|
|
571
|
-
return false;
|
|
572
|
-
state = state || [];
|
|
573
|
-
state.push(pointerId);
|
|
574
|
-
comp[symbol] = state;
|
|
575
|
-
return true;
|
|
576
|
-
}
|
|
577
|
-
else {
|
|
578
|
-
if (!state || !state.includes(pointerId))
|
|
579
|
-
return false;
|
|
580
|
-
const i = state.indexOf(pointerId);
|
|
581
|
-
if (i !== -1) {
|
|
582
|
-
state.splice(i, 1);
|
|
583
|
-
}
|
|
584
|
-
return true;
|
|
585
|
-
}
|
|
586
|
-
}
|
|
587
|
-
/** the list of component handlers that requested pointerCapture for a specific pointerId */
|
|
588
|
-
_capturedPointer = {};
|
|
589
|
-
/** check if the event was marked to be captured: if yes add the current component to the captured list */
|
|
590
|
-
handlePointerCapture(evt, comp) {
|
|
591
|
-
if (evt.z__pointer_ctured) {
|
|
592
|
-
evt.z__pointer_ctured = false;
|
|
593
|
-
const id = evt.pointerId;
|
|
594
|
-
// only the onPointerMove event is called with captured pointers so we don't need to add it to our list if it doesnt implement onPointerMove
|
|
595
|
-
if (comp.onPointerMove) {
|
|
596
|
-
const list = this._capturedPointer[id] || [];
|
|
597
|
-
list.push(comp);
|
|
598
|
-
this._capturedPointer[id] = list;
|
|
599
|
-
}
|
|
600
|
-
else {
|
|
601
|
-
if (isDevEnvironment() && !comp["z__warned_no_pointermove"]) {
|
|
602
|
-
comp["z__warned_no_pointermove"] = true;
|
|
603
|
-
console.warn("PointerCapture was requested but the component doesn't implement onPointerMove. It will not receive any pointer events");
|
|
604
|
-
}
|
|
605
|
-
}
|
|
606
|
-
}
|
|
607
|
-
else if (evt.z__pointer_cture_rleased) {
|
|
608
|
-
evt.z__pointer_cture_rleased = false;
|
|
609
|
-
this.releasePointerCapture(evt, comp);
|
|
610
|
-
}
|
|
611
|
-
}
|
|
612
|
-
/** removes the component from the pointer capture list */
|
|
613
|
-
releasePointerCapture(evt, component) {
|
|
614
|
-
const id = evt.pointerId;
|
|
615
|
-
if (this._capturedPointer[id]) {
|
|
616
|
-
const i = this._capturedPointer[id].indexOf(component);
|
|
617
|
-
if (i !== -1) {
|
|
618
|
-
this._capturedPointer[id].splice(i, 1);
|
|
619
|
-
if (debug)
|
|
620
|
-
console.log("released pointer capture", id, component, this._capturedPointer);
|
|
621
|
-
}
|
|
622
|
-
}
|
|
623
|
-
}
|
|
624
|
-
/** invoke the pointerMove event on all captured handlers */
|
|
625
|
-
invokePointerCapture(evt) {
|
|
626
|
-
if (evt.event.type === InputEvents.PointerMove) {
|
|
627
|
-
const id = evt.pointerId;
|
|
628
|
-
const captured = this._capturedPointer[id];
|
|
629
|
-
if (captured) {
|
|
630
|
-
if (debug)
|
|
631
|
-
console.log("Captured", id, captured);
|
|
632
|
-
for (let i = 0; i < captured.length; i++) {
|
|
633
|
-
const handler = captured[i];
|
|
634
|
-
// check if it was destroyed
|
|
635
|
-
const comp = handler;
|
|
636
|
-
if (comp.destroyed) {
|
|
637
|
-
captured.splice(i, 1);
|
|
638
|
-
i--;
|
|
639
|
-
continue;
|
|
640
|
-
}
|
|
641
|
-
// invoke pointer move
|
|
642
|
-
handler.onPointerMove?.call(handler, evt);
|
|
643
|
-
}
|
|
644
|
-
}
|
|
645
|
-
}
|
|
646
|
-
}
|
|
647
|
-
pointerEnterSymbol = Symbol("pointerEnter");
|
|
648
|
-
pointerExitSymbol = Symbol("pointerExit");
|
|
649
|
-
isChild(obj, possibleChild) {
|
|
650
|
-
if (!obj || !possibleChild)
|
|
651
|
-
return false;
|
|
652
|
-
if (obj === possibleChild)
|
|
653
|
-
return true;
|
|
654
|
-
if (!obj.parent)
|
|
655
|
-
return false;
|
|
656
|
-
return this.isChild(obj.parent, possibleChild);
|
|
657
|
-
}
|
|
658
|
-
handleMeshUiObjectWithoutShadowDom(obj, pressed) {
|
|
659
|
-
if (!obj || !obj.isUI)
|
|
660
|
-
return true;
|
|
661
|
-
const hit = this.handleMeshUIIntersection(obj, pressed);
|
|
662
|
-
return hit;
|
|
663
|
-
}
|
|
664
|
-
currentActiveMeshUIComponents = [];
|
|
665
|
-
handleMeshUIIntersection(meshUiObject, pressed) {
|
|
666
|
-
const res = MeshUIHelper.updateState(meshUiObject, pressed);
|
|
667
|
-
if (res) {
|
|
668
|
-
this.currentActiveMeshUIComponents.push(res);
|
|
669
|
-
}
|
|
670
|
-
return res !== null;
|
|
671
|
-
}
|
|
672
|
-
resetMeshUIStates() {
|
|
673
|
-
if (this.context.input.getPointerPressedCount() > 0) {
|
|
674
|
-
MeshUIHelper.resetLastSelected();
|
|
675
|
-
}
|
|
676
|
-
if (!this.currentActiveMeshUIComponents || this.currentActiveMeshUIComponents.length <= 0)
|
|
677
|
-
return;
|
|
678
|
-
for (let i = 0; i < this.currentActiveMeshUIComponents.length; i++) {
|
|
679
|
-
const comp = this.currentActiveMeshUIComponents[i];
|
|
680
|
-
MeshUIHelper.resetState(comp);
|
|
681
|
-
}
|
|
682
|
-
this.currentActiveMeshUIComponents.length = 0;
|
|
683
|
-
}
|
|
684
|
-
testIsVisible(obj) {
|
|
685
|
-
if (!obj)
|
|
686
|
-
return true;
|
|
687
|
-
if (!GameObject.isActiveSelf(obj))
|
|
688
|
-
return false;
|
|
689
|
-
return this.testIsVisible(obj.parent);
|
|
690
|
-
}
|
|
691
|
-
}
|
|
692
|
-
class MeshUIHelper {
|
|
693
|
-
static lastSelected = null;
|
|
694
|
-
static lastUpdateFrame = [];
|
|
695
|
-
static needsUpdate = false;
|
|
696
|
-
static markDirty() {
|
|
697
|
-
this.needsUpdate = true;
|
|
698
|
-
}
|
|
699
|
-
static update(threeMeshUI, context, force = false) {
|
|
700
|
-
if (force) {
|
|
701
|
-
threeMeshUI.update();
|
|
702
|
-
return;
|
|
703
|
-
}
|
|
704
|
-
const currentFrame = context.time.frameCount;
|
|
705
|
-
for (const lu of this.lastUpdateFrame) {
|
|
706
|
-
if (lu.context === context) {
|
|
707
|
-
if (currentFrame === lu.frame)
|
|
708
|
-
return;
|
|
709
|
-
lu.frame = currentFrame;
|
|
710
|
-
let shouldUpdate = this.needsUpdate || currentFrame < 1;
|
|
711
|
-
if (lu.nextUpdate <= currentFrame)
|
|
712
|
-
shouldUpdate = true;
|
|
713
|
-
// if (this.needsUpdate) lu.nextUpdate = currentFrame + 3;
|
|
714
|
-
if (shouldUpdate) {
|
|
715
|
-
// console.warn(currentFrame, lu.nextUpdate, this.needsUpdate)
|
|
716
|
-
if (debug)
|
|
717
|
-
console.log("Update threemeshui");
|
|
718
|
-
this.needsUpdate = false;
|
|
719
|
-
lu.nextUpdate = currentFrame + 60;
|
|
720
|
-
threeMeshUI.update();
|
|
721
|
-
}
|
|
722
|
-
return;
|
|
723
|
-
}
|
|
724
|
-
}
|
|
725
|
-
this.lastUpdateFrame = [{ context, frame: currentFrame, nextUpdate: currentFrame + 60 }];
|
|
726
|
-
threeMeshUI.update();
|
|
727
|
-
this.needsUpdate = false;
|
|
728
|
-
}
|
|
729
|
-
static updateState(intersect, _selectState) {
|
|
730
|
-
let foundBlock = null;
|
|
731
|
-
if (intersect) {
|
|
732
|
-
foundBlock = this.findBlockOrTextInParent(intersect);
|
|
733
|
-
// console.log(intersect, "-- found block:", foundBlock)
|
|
734
|
-
if (foundBlock && foundBlock !== this.lastSelected) {
|
|
735
|
-
const interactable = foundBlock["interactable"];
|
|
736
|
-
if (interactable === false)
|
|
737
|
-
return null;
|
|
738
|
-
this.needsUpdate = true;
|
|
739
|
-
}
|
|
740
|
-
}
|
|
741
|
-
return foundBlock;
|
|
742
|
-
}
|
|
743
|
-
static resetLastSelected() {
|
|
744
|
-
const last = this.lastSelected;
|
|
745
|
-
if (!last)
|
|
746
|
-
return;
|
|
747
|
-
this.lastSelected = null;
|
|
748
|
-
this.resetState(last);
|
|
749
|
-
}
|
|
750
|
-
static resetState(obj) {
|
|
751
|
-
if (!obj)
|
|
752
|
-
return;
|
|
753
|
-
this.needsUpdate = true;
|
|
754
|
-
}
|
|
755
|
-
static findBlockOrTextInParent(elem) {
|
|
756
|
-
if (!elem)
|
|
757
|
-
return null;
|
|
758
|
-
if (elem.isBlock || (elem.isText)) {
|
|
759
|
-
// @TODO : Replace states managements
|
|
760
|
-
// if (Object.keys(elem.states).length > 0)
|
|
761
|
-
return elem;
|
|
762
|
-
}
|
|
763
|
-
return this.findBlockOrTextInParent(elem.parent);
|
|
764
|
-
}
|
|
765
|
-
}
|
|
1
|
+
import { isDevEnvironment, showBalloonMessage } from "../../engine/debug/index.js";
|
|
2
|
+
import { InputEvents, PointerType } from "../../engine/engine_input.js";
|
|
3
|
+
import { onInitialized } from "../../engine/engine_lifecycle_api.js";
|
|
4
|
+
import { Mathf } from "../../engine/engine_math.js";
|
|
5
|
+
import { RaycastOptions } from "../../engine/engine_physics.js";
|
|
6
|
+
import { Context } from "../../engine/engine_setup.js";
|
|
7
|
+
import { getParam } from "../../engine/engine_utils.js";
|
|
8
|
+
import { Behaviour, GameObject } from "../Component.js";
|
|
9
|
+
import { hasPointerEventComponent, PointerEventData } from "./PointerEvents.js";
|
|
10
|
+
import { ObjectRaycaster, Raycaster } from "./Raycaster.js";
|
|
11
|
+
import { UIRaycastUtils } from "./RaycastUtils.js";
|
|
12
|
+
import { $shadowDomOwner } from "./Symbols.js";
|
|
13
|
+
import { isUIObject } from "./Utils.js";
|
|
14
|
+
const debug = getParam("debugeventsystem");
|
|
15
|
+
export var EventSystemEvents;
|
|
16
|
+
(function (EventSystemEvents) {
|
|
17
|
+
EventSystemEvents["BeforeHandleInput"] = "BeforeHandleInput";
|
|
18
|
+
EventSystemEvents["AfterHandleInput"] = "AfterHandleInput";
|
|
19
|
+
})(EventSystemEvents || (EventSystemEvents = {}));
|
|
20
|
+
onInitialized((ctx) => {
|
|
21
|
+
EventSystem.createIfNoneExists(ctx);
|
|
22
|
+
});
|
|
23
|
+
/**
|
|
24
|
+
* @category User Interface
|
|
25
|
+
* @group Components
|
|
26
|
+
*/
|
|
27
|
+
export class EventSystem extends Behaviour {
|
|
28
|
+
//@ts-ignore
|
|
29
|
+
static ensureUpdateMeshUI(instance, context, force = false) {
|
|
30
|
+
MeshUIHelper.update(instance, context, force);
|
|
31
|
+
}
|
|
32
|
+
static markUIDirty(_context) {
|
|
33
|
+
MeshUIHelper.markDirty();
|
|
34
|
+
}
|
|
35
|
+
static createIfNoneExists(context) {
|
|
36
|
+
if (!context.scene.getComponent(EventSystem)) {
|
|
37
|
+
context.scene.addComponent(EventSystem);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
static get(ctx) {
|
|
41
|
+
this.createIfNoneExists(ctx);
|
|
42
|
+
return ctx.scene.getComponent(EventSystem);
|
|
43
|
+
}
|
|
44
|
+
/** Get the currently active event system */
|
|
45
|
+
static get instance() {
|
|
46
|
+
return this.get(Context.Current);
|
|
47
|
+
}
|
|
48
|
+
raycaster = [];
|
|
49
|
+
register(rc) {
|
|
50
|
+
if (rc && this.raycaster && !this.raycaster.includes(rc))
|
|
51
|
+
this.raycaster?.push(rc);
|
|
52
|
+
}
|
|
53
|
+
unregister(rc) {
|
|
54
|
+
const i = this.raycaster?.indexOf(rc);
|
|
55
|
+
if (i !== undefined && i !== -1) {
|
|
56
|
+
this.raycaster?.splice(i, 1);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
get hasActiveUI() {
|
|
60
|
+
return this.currentActiveMeshUIComponents.length > 0;
|
|
61
|
+
}
|
|
62
|
+
get isHoveringObjects() { return this.hoveredByID.size > 0; }
|
|
63
|
+
awake() {
|
|
64
|
+
// We only want ONE eventsystem on the root scene
|
|
65
|
+
// as long as this component is not implemented in core we need to check this here
|
|
66
|
+
if (this.gameObject !== this.context.scene) {
|
|
67
|
+
console.debug(`[Needle Engine] EventSystem is only allowed on the scene root. Disabling EventSystem on '${this.gameObject.name}'`);
|
|
68
|
+
this.enabled = false;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
start() {
|
|
72
|
+
if (!this.context.scene.getComponent(Raycaster)) {
|
|
73
|
+
this.context.scene.addComponent(ObjectRaycaster);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
onEnable() {
|
|
77
|
+
this.context.input.addEventListener(InputEvents.PointerDown, this.onPointerEvent);
|
|
78
|
+
this.context.input.addEventListener(InputEvents.PointerUp, this.onPointerEvent);
|
|
79
|
+
this.context.input.addEventListener(InputEvents.PointerMove, this.onPointerEvent);
|
|
80
|
+
}
|
|
81
|
+
onDisable() {
|
|
82
|
+
this.context.input.removeEventListener(InputEvents.PointerDown, this.onPointerEvent);
|
|
83
|
+
this.context.input.removeEventListener(InputEvents.PointerUp, this.onPointerEvent);
|
|
84
|
+
this.context.input.removeEventListener(InputEvents.PointerMove, this.onPointerEvent);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* all pointers that have pressed something
|
|
88
|
+
*
|
|
89
|
+
* key: pointerId
|
|
90
|
+
* value: object that was pressed, data of the pointer event, handlers that are releavant to the event
|
|
91
|
+
*/
|
|
92
|
+
pressedByID = new Map();
|
|
93
|
+
/**
|
|
94
|
+
* all hovered objects
|
|
95
|
+
*
|
|
96
|
+
* key: pointerId
|
|
97
|
+
* value: object that is hovered, data of the pointer event
|
|
98
|
+
*/
|
|
99
|
+
hoveredByID = new Map();
|
|
100
|
+
onBeforeRender() {
|
|
101
|
+
this.resetMeshUIStates();
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Handle an pointer event from the input system
|
|
105
|
+
*/
|
|
106
|
+
onPointerEvent = (pointerEvent) => {
|
|
107
|
+
if (pointerEvent === undefined)
|
|
108
|
+
return;
|
|
109
|
+
if (pointerEvent.propagationStopped)
|
|
110
|
+
return;
|
|
111
|
+
if (pointerEvent.defaultPrevented)
|
|
112
|
+
return;
|
|
113
|
+
if (pointerEvent.used)
|
|
114
|
+
return;
|
|
115
|
+
// Use the pointerID, this is the touch id or the mouse (always 0, could be index of the mouse DEVICE) or the index of the XRInputSource
|
|
116
|
+
const data = new PointerEventData(this.context.input, pointerEvent);
|
|
117
|
+
this._currentPointerEventName = pointerEvent.type;
|
|
118
|
+
data.inputSource = this.context.input;
|
|
119
|
+
data.isClick = pointerEvent.isClick;
|
|
120
|
+
data.isDoubleClick = pointerEvent.isDoubleClick;
|
|
121
|
+
// using the input type directly instead of input API -> otherwise onMove events can sometimes be getPointerUp() == true
|
|
122
|
+
data.isDown = pointerEvent.type == InputEvents.PointerDown;
|
|
123
|
+
data.isUp = pointerEvent.type == InputEvents.PointerUp;
|
|
124
|
+
data.isPressed = this.context.input.getPointerPressed(pointerEvent.pointerId);
|
|
125
|
+
if (debug) {
|
|
126
|
+
if (data.isDown)
|
|
127
|
+
console.log("DOWN", data.pointerId);
|
|
128
|
+
else if (data.isUp)
|
|
129
|
+
console.log("UP", data.pointerId);
|
|
130
|
+
if (data.isClick)
|
|
131
|
+
console.log("CLICK", data.pointerId);
|
|
132
|
+
}
|
|
133
|
+
// raycast
|
|
134
|
+
const options = new RaycastOptions();
|
|
135
|
+
if (pointerEvent.hasRay) {
|
|
136
|
+
options.ray = pointerEvent.ray;
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
options.screenPoint = this.context.input.getPointerPositionRC(pointerEvent.pointerId);
|
|
140
|
+
}
|
|
141
|
+
const hits = this.performRaycast(options);
|
|
142
|
+
if (hits) {
|
|
143
|
+
for (const hit of hits) {
|
|
144
|
+
hit.event = pointerEvent;
|
|
145
|
+
pointerEvent.intersections.push(hit);
|
|
146
|
+
}
|
|
147
|
+
if (pointerEvent.origin.onPointerHits) {
|
|
148
|
+
pointerEvent.origin.onPointerHits({
|
|
149
|
+
sender: this,
|
|
150
|
+
event: pointerEvent,
|
|
151
|
+
hits
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
if (debug && data.isClick) {
|
|
156
|
+
showBalloonMessage("EventSystem: " + data.pointerId + " - " + this.context.time.frame + " - Up:" + data.isUp + ", Down:" + data.isDown);
|
|
157
|
+
}
|
|
158
|
+
const evt = {
|
|
159
|
+
sender: this,
|
|
160
|
+
args: data,
|
|
161
|
+
hasActiveUI: this.currentActiveMeshUIComponents.length > 0,
|
|
162
|
+
};
|
|
163
|
+
this.dispatchEvent(new CustomEvent(EventSystemEvents.BeforeHandleInput, { detail: evt }));
|
|
164
|
+
// then handle the intersections and call the callbacks on the regular objects
|
|
165
|
+
this.handleIntersections(hits, data);
|
|
166
|
+
this.dispatchEvent(new CustomEvent(EventSystemEvents.AfterHandleInput, { detail: evt }));
|
|
167
|
+
};
|
|
168
|
+
_sortedHits = [];
|
|
169
|
+
/**
|
|
170
|
+
* cache for objects that we want to raycast against. It's cleared before each call to performRaycast invoking raycasters
|
|
171
|
+
*/
|
|
172
|
+
_testObjectsCache = new Map();
|
|
173
|
+
/** that's the raycaster that is CURRENTLY being used for raycasting (the shouldRaycastObject method uses this) */
|
|
174
|
+
_currentlyActiveRaycaster = null;
|
|
175
|
+
_currentPointerEventName = null;
|
|
176
|
+
/**
|
|
177
|
+
* Checks if an object that we encounter has an event component and if it does, we add it to our objects cache
|
|
178
|
+
* If it doesnt we tell our raycasting system to ignore it and continue in the child hierarchy
|
|
179
|
+
* We do this to avoid raycasts against objects that are not going to be used by the event system
|
|
180
|
+
* Because there's no component callback to be invoked anyways.
|
|
181
|
+
* This is especially important to avoid expensive raycasts against SkinnedMeshes
|
|
182
|
+
*
|
|
183
|
+
* Further optimizations would be to check what type of event we're dealing with
|
|
184
|
+
* For example if an event component has only an onPointerClick method we don't need to raycast during movement events
|
|
185
|
+
* */
|
|
186
|
+
shouldRaycastObject = (obj) => {
|
|
187
|
+
// TODO: this implementation below should be removed and we should regularly raycast objects in the scene unless marked as "do not raycast"
|
|
188
|
+
// with the introduction of the mesh-bvh based raycasting the performance impact should be greatly reduced. But this needs further testing
|
|
189
|
+
const raycasterOnObject = obj && "getComponent" in obj ? obj.getComponent(Raycaster) : null;
|
|
190
|
+
if (raycasterOnObject && raycasterOnObject != this._currentlyActiveRaycaster) {
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
193
|
+
// if (this._currentPointerEventName == "pointermove") {
|
|
194
|
+
// console.log(this.context.time.frame, obj.name, obj.type, obj.guid)
|
|
195
|
+
// }
|
|
196
|
+
// check if this object is actually a UI shadow hierarchy object
|
|
197
|
+
let uiOwner = null;
|
|
198
|
+
const isUI = isUIObject(obj);
|
|
199
|
+
// if yes we want to grab the actual object that is the owner of the shadow dom
|
|
200
|
+
// and check that object for the event component
|
|
201
|
+
if (isUI) {
|
|
202
|
+
uiOwner = obj[$shadowDomOwner]?.gameObject;
|
|
203
|
+
}
|
|
204
|
+
// check if the object was seen previously
|
|
205
|
+
if (this._testObjectsCache.has(obj) || (uiOwner && this._testObjectsCache.has(uiOwner))) {
|
|
206
|
+
// if yes we check if it was previously stored as "YES WE NEED TO RAYCAST THIS"
|
|
207
|
+
const prev = this._testObjectsCache.get(obj);
|
|
208
|
+
if (prev === false)
|
|
209
|
+
return "continue in children";
|
|
210
|
+
return true;
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
// if the object has another raycaster component than the one that is currently raycasting, we ignore this here
|
|
214
|
+
// because then this other raycaster is responsible for raycasting this object
|
|
215
|
+
// const rc = GameObject.getComponent(obj, Raycaster);
|
|
216
|
+
// if (rc?.activeAndEnabled && rc !== this._currentlyActiveRaycaster) return false;
|
|
217
|
+
// the object was not yet seen so we test if it has an event component
|
|
218
|
+
let hasEventComponent = hasPointerEventComponent(obj, this._currentPointerEventName);
|
|
219
|
+
if (!hasEventComponent && uiOwner)
|
|
220
|
+
hasEventComponent = hasPointerEventComponent(uiOwner, this._currentPointerEventName);
|
|
221
|
+
if (hasEventComponent) {
|
|
222
|
+
// it has an event component: we add it and all its children to the cache
|
|
223
|
+
// we don't need to do the same for the shadow component hierarchy
|
|
224
|
+
// because the next object that will be detecting that the shadow owner was already seen
|
|
225
|
+
this._testObjectsCache.set(obj, true);
|
|
226
|
+
for (const ch of obj.children)
|
|
227
|
+
this.shouldRaycastObject_AddToYesCache(ch);
|
|
228
|
+
return true;
|
|
229
|
+
}
|
|
230
|
+
this._testObjectsCache.set(obj, false);
|
|
231
|
+
return "continue in children";
|
|
232
|
+
}
|
|
233
|
+
};
|
|
234
|
+
shouldRaycastObject_AddToYesCache(obj) {
|
|
235
|
+
// if the object has another raycaster component than the one that is currently raycasting, we ignore this here
|
|
236
|
+
// because then this other raycaster is responsible for raycasting this object
|
|
237
|
+
// const rc = GameObject.getComponent(obj, Raycaster);
|
|
238
|
+
// if (rc?.activeAndEnabled && rc !== this._currentlyActiveRaycaster) return;
|
|
239
|
+
this._testObjectsCache.set(obj, true);
|
|
240
|
+
for (const ch of obj.children) {
|
|
241
|
+
this.shouldRaycastObject_AddToYesCache(ch);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
/** the raycast filter is always overriden */
|
|
245
|
+
performRaycast(opts) {
|
|
246
|
+
if (!this.raycaster)
|
|
247
|
+
return null;
|
|
248
|
+
// we clear the cache of previously seen objects
|
|
249
|
+
this._testObjectsCache.clear();
|
|
250
|
+
this._sortedHits.length = 0;
|
|
251
|
+
if (!opts)
|
|
252
|
+
opts = new RaycastOptions();
|
|
253
|
+
opts.testObject = this.shouldRaycastObject;
|
|
254
|
+
for (const rc of this.raycaster) {
|
|
255
|
+
if (!rc.activeAndEnabled)
|
|
256
|
+
continue;
|
|
257
|
+
this._currentlyActiveRaycaster = rc;
|
|
258
|
+
const res = rc.performRaycast(opts);
|
|
259
|
+
this._currentlyActiveRaycaster = null;
|
|
260
|
+
if (res && res.length > 0) {
|
|
261
|
+
// console.log(res.length, res.map(r => r.object.name));
|
|
262
|
+
this._sortedHits.push(...res);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
this._sortedHits.sort((a, b) => {
|
|
266
|
+
return a.distance - b.distance;
|
|
267
|
+
});
|
|
268
|
+
return this._sortedHits;
|
|
269
|
+
}
|
|
270
|
+
assignHitInformation(args, hit) {
|
|
271
|
+
if (!hit) {
|
|
272
|
+
args.intersection = undefined;
|
|
273
|
+
args.point = undefined;
|
|
274
|
+
args.normal = undefined;
|
|
275
|
+
args.face = undefined;
|
|
276
|
+
args.distance = undefined;
|
|
277
|
+
args.instanceId = undefined;
|
|
278
|
+
}
|
|
279
|
+
else {
|
|
280
|
+
args.intersection = hit;
|
|
281
|
+
args.point = hit.point;
|
|
282
|
+
args.normal = hit.normal;
|
|
283
|
+
args.face = hit.face;
|
|
284
|
+
args.distance = hit.distance;
|
|
285
|
+
args.instanceId = hit.instanceId;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
handleIntersections(hits, args) {
|
|
289
|
+
if (hits?.length) {
|
|
290
|
+
hits = this.sortCandidates(hits);
|
|
291
|
+
for (const hit of hits) {
|
|
292
|
+
if (args.event.immediatePropagationStopped) {
|
|
293
|
+
return false;
|
|
294
|
+
}
|
|
295
|
+
this.assignHitInformation(args, hit);
|
|
296
|
+
if (this.handleEventOnObject(hit.object, args)) {
|
|
297
|
+
return true;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
// first invoke captured pointers
|
|
302
|
+
this.assignHitInformation(args, hits?.[0]);
|
|
303
|
+
this.invokePointerCapture(args);
|
|
304
|
+
// pointer has not hit any object to handle
|
|
305
|
+
// thus is not hovering over anything
|
|
306
|
+
const hoveredData = this.hoveredByID.get(args.pointerId);
|
|
307
|
+
if (hoveredData) {
|
|
308
|
+
this.propagatePointerExit(hoveredData.obj, hoveredData.data, null);
|
|
309
|
+
}
|
|
310
|
+
this.hoveredByID.delete(args.pointerId);
|
|
311
|
+
// if it was up, it means it should notify things that it down on before
|
|
312
|
+
if (args.isUp) {
|
|
313
|
+
this.pressedByID.get(args.pointerId)?.handlers.forEach(h => this.invokeOnPointerUp(args, h));
|
|
314
|
+
this.pressedByID.delete(args.pointerId);
|
|
315
|
+
}
|
|
316
|
+
return false;
|
|
317
|
+
}
|
|
318
|
+
_sortingBuffer = [];
|
|
319
|
+
_noDepthTestingResults = [];
|
|
320
|
+
sortCandidates(hits) {
|
|
321
|
+
// iterate over all hits and filter for nodepth objects and normal hit objects
|
|
322
|
+
// the no-depth objects will be handled first starting from the closest
|
|
323
|
+
// assuming the hits array is sorted by distance (closest > furthest)
|
|
324
|
+
this._sortingBuffer.length = 0;
|
|
325
|
+
this._noDepthTestingResults.length = 0;
|
|
326
|
+
for (let i = 0; i < hits.length; i++) {
|
|
327
|
+
const hit = hits[i];
|
|
328
|
+
const object = hit.object;
|
|
329
|
+
if (object.material) {
|
|
330
|
+
if (object.material["depthTest"] === false) {
|
|
331
|
+
this._noDepthTestingResults.push(hit);
|
|
332
|
+
continue;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
this._sortingBuffer.push(hit);
|
|
336
|
+
}
|
|
337
|
+
for (const obj of this._sortingBuffer) {
|
|
338
|
+
this._noDepthTestingResults.push(obj);
|
|
339
|
+
}
|
|
340
|
+
return this._noDepthTestingResults;
|
|
341
|
+
}
|
|
342
|
+
out = {};
|
|
343
|
+
/**
|
|
344
|
+
* Handle hit result by preparing all needed information before propagation.
|
|
345
|
+
* Then calling propagate.
|
|
346
|
+
*/
|
|
347
|
+
handleEventOnObject(object, args) {
|
|
348
|
+
// ensures that invisible objects are ignored
|
|
349
|
+
if (!this.testIsVisible(object)) {
|
|
350
|
+
if (args.isClick && debug)
|
|
351
|
+
console.log("not allowed", object);
|
|
352
|
+
return false;
|
|
353
|
+
}
|
|
354
|
+
// Event without pointer can't be handled
|
|
355
|
+
if (args.pointerId === undefined) {
|
|
356
|
+
if (debug)
|
|
357
|
+
console.error("Event without pointer can't be handled", args);
|
|
358
|
+
return false;
|
|
359
|
+
}
|
|
360
|
+
// Correct the handled object to match the relevant object in shadow dom (?)
|
|
361
|
+
args.object = object;
|
|
362
|
+
const parent = object.parent;
|
|
363
|
+
let isShadow = false;
|
|
364
|
+
const clicked = args.isClick ?? false;
|
|
365
|
+
let canvasGroup = null;
|
|
366
|
+
// handle potential shadow dom built from three mesh ui
|
|
367
|
+
if (parent && parent.isUI) {
|
|
368
|
+
const pressedOrClicked = (args.isPressed || args.isClick) ?? false;
|
|
369
|
+
if (parent[$shadowDomOwner]) {
|
|
370
|
+
const actualGo = parent[$shadowDomOwner].gameObject;
|
|
371
|
+
if (actualGo) {
|
|
372
|
+
const res = UIRaycastUtils.isInteractable(actualGo, this.out);
|
|
373
|
+
if (!res)
|
|
374
|
+
return false;
|
|
375
|
+
canvasGroup = this.out.canvasGroup ?? null;
|
|
376
|
+
const handled = this.handleMeshUIIntersection(object, pressedOrClicked);
|
|
377
|
+
if (!clicked && handled) {
|
|
378
|
+
// return true;
|
|
379
|
+
}
|
|
380
|
+
object = actualGo;
|
|
381
|
+
isShadow = true;
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
// adding this to have a way for allowing to receive events on TMUI elements without shadow hierarchy
|
|
385
|
+
// if(parent["needle:use_eventsystem"] == true){
|
|
386
|
+
// // if use_eventsystem is true, we want to handle the event
|
|
387
|
+
// }
|
|
388
|
+
// else if (!isShadow) {
|
|
389
|
+
// const obj = this.handleMeshUiObjectWithoutShadowDom(parent, pressedOrClicked);
|
|
390
|
+
// if (obj) return true;
|
|
391
|
+
// }
|
|
392
|
+
}
|
|
393
|
+
if (clicked && debug)
|
|
394
|
+
console.log(this.context.time.frame, object);
|
|
395
|
+
// Handle OnPointerExit -> in case when we are about to hover something new
|
|
396
|
+
// TODO: we need to keep track of the components that already received a PointerEnterEvent -> we can have a hierarchy where the hovered object changes but the component is on the parent and should not receive a PointerExit event because it's still hovered (just another child object)
|
|
397
|
+
const hovering = this.hoveredByID.get(args.pointerId);
|
|
398
|
+
const prevHovering = hovering?.obj;
|
|
399
|
+
const isNewlyHovering = prevHovering !== object;
|
|
400
|
+
// trigger onPointerExit
|
|
401
|
+
if (isNewlyHovering && prevHovering) {
|
|
402
|
+
this.propagatePointerExit(prevHovering, hovering.data, object);
|
|
403
|
+
}
|
|
404
|
+
// save hovered object
|
|
405
|
+
const entry = this.hoveredByID.get(args.pointerId);
|
|
406
|
+
if (!entry)
|
|
407
|
+
this.hoveredByID.set(args.pointerId, { obj: object, data: args });
|
|
408
|
+
else {
|
|
409
|
+
entry.obj = object;
|
|
410
|
+
entry.data = args;
|
|
411
|
+
}
|
|
412
|
+
// create / update pressed entry
|
|
413
|
+
if (args.isDown) {
|
|
414
|
+
const data = this.pressedByID.get(args.pointerId);
|
|
415
|
+
if (!data)
|
|
416
|
+
this.pressedByID.set(args.pointerId, { obj: object, data: args, handlers: new Set() });
|
|
417
|
+
else {
|
|
418
|
+
data.obj = object;
|
|
419
|
+
data.data = args;
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
if (canvasGroup === null || canvasGroup.interactable) {
|
|
423
|
+
this.handleMainInteraction(object, args, prevHovering ?? null);
|
|
424
|
+
}
|
|
425
|
+
return true;
|
|
426
|
+
}
|
|
427
|
+
/**
|
|
428
|
+
* Propagate up in hiearchy and call the callback for each component that is possibly a handler
|
|
429
|
+
*/
|
|
430
|
+
propagate(object, onComponent) {
|
|
431
|
+
while (true) {
|
|
432
|
+
if (!object)
|
|
433
|
+
break;
|
|
434
|
+
GameObject.foreachComponent(object, comp => {
|
|
435
|
+
// TODO: implement Stop Immediate Propagation
|
|
436
|
+
onComponent(comp);
|
|
437
|
+
}, false);
|
|
438
|
+
// walk up
|
|
439
|
+
object = object.parent;
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
/**
|
|
443
|
+
* Propagate up in hierarchy and call handlers based on the pointer event data
|
|
444
|
+
*/
|
|
445
|
+
handleMainInteraction(object, args, prevHovering) {
|
|
446
|
+
const pressedEvent = this.pressedByID.get(args.pointerId);
|
|
447
|
+
const hoveredObjectChanged = prevHovering !== object;
|
|
448
|
+
// TODO: should we not move this check up before we even raycast for "pointerMove" events? We dont need to do any processing if the pointer didnt move
|
|
449
|
+
let isMoving = true;
|
|
450
|
+
switch (args.event.pointerType) {
|
|
451
|
+
case "mouse":
|
|
452
|
+
case "touch":
|
|
453
|
+
const posLastFrame = this.context.input.getPointerPositionLastFrame(args.pointerId);
|
|
454
|
+
const posThisFrame = this.context.input.getPointerPosition(args.pointerId);
|
|
455
|
+
isMoving = posLastFrame && !Mathf.approximately(posLastFrame, posThisFrame);
|
|
456
|
+
break;
|
|
457
|
+
case "controller":
|
|
458
|
+
case "hand":
|
|
459
|
+
// for hands and controller we assume they are never totally still (except for simulated environments)
|
|
460
|
+
// we might want to add a threshold here (e.g. if a user holds their hand very still or controller)
|
|
461
|
+
// so maybe check the angle every frame?
|
|
462
|
+
break;
|
|
463
|
+
}
|
|
464
|
+
this.propagate(object, (behaviour) => {
|
|
465
|
+
const comp = behaviour;
|
|
466
|
+
if (comp.interactable === false)
|
|
467
|
+
return;
|
|
468
|
+
if (!comp.activeAndEnabled || !comp.enabled)
|
|
469
|
+
return;
|
|
470
|
+
if (comp.onPointerEnter) {
|
|
471
|
+
if (hoveredObjectChanged) {
|
|
472
|
+
this.handlePointerEnter(comp, args);
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
if (args.isDown) {
|
|
476
|
+
if (comp.onPointerDown) {
|
|
477
|
+
comp.onPointerDown(args);
|
|
478
|
+
// Set the handler that we called the down event on
|
|
479
|
+
// So we can call the up event on the same handler
|
|
480
|
+
// In a scenario where we Down on one object and Up on another
|
|
481
|
+
pressedEvent?.handlers.add(comp);
|
|
482
|
+
this.handlePointerCapture(args, comp);
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
if (comp.onPointerMove) {
|
|
486
|
+
if (isMoving)
|
|
487
|
+
comp.onPointerMove(args);
|
|
488
|
+
this.handlePointerCapture(args, comp);
|
|
489
|
+
}
|
|
490
|
+
if (args.isUp) {
|
|
491
|
+
if (comp.onPointerUp) {
|
|
492
|
+
this.invokeOnPointerUp(args, comp);
|
|
493
|
+
// We don't want to call Up twice if we Down and Up on the same object
|
|
494
|
+
// But if we Down on one and Up on another we want to call Up on the first one as well
|
|
495
|
+
// For example if the object was cloned by the Duplicatable
|
|
496
|
+
// The original component that received the down event SHOULD also receive the up event
|
|
497
|
+
pressedEvent?.handlers.delete(comp);
|
|
498
|
+
}
|
|
499
|
+
// handle touch onExit (touchUp) since the pointer stops existing
|
|
500
|
+
// mouse onExit (mouseUp) is handled when we hover over something else / on nothing
|
|
501
|
+
// Mouse 0 is always persistent
|
|
502
|
+
if (comp.onPointerExit && args.event?.pointerType === PointerType.Touch) {
|
|
503
|
+
this.handlePointerExit(comp, args);
|
|
504
|
+
this.hoveredByID.delete(args.pointerId);
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
if (args.isClick) {
|
|
508
|
+
if (comp.onPointerClick) {
|
|
509
|
+
comp.onPointerClick(args);
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
});
|
|
513
|
+
// after the propagation end, call UP on any objects that were DOWNED and didn't recieve an UP while propagating
|
|
514
|
+
// If user drags away from the object, then it doesn't get the UP event
|
|
515
|
+
if (args.isUp) {
|
|
516
|
+
pressedEvent?.handlers.forEach((handler) => {
|
|
517
|
+
this.invokeOnPointerUp(args, handler);
|
|
518
|
+
});
|
|
519
|
+
this.pressedByID.delete(args.pointerId);
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
/** Propagate up in hierarchy and call onPointerExit */
|
|
523
|
+
propagatePointerExit(object, args, newObject) {
|
|
524
|
+
this.propagate(object, (behaviour) => {
|
|
525
|
+
if (!behaviour.gameObject || behaviour.destroyed)
|
|
526
|
+
return;
|
|
527
|
+
const inst = behaviour;
|
|
528
|
+
if (inst.onPointerExit || inst.onPointerEnter) {
|
|
529
|
+
// if the newly hovered object is a child of the current object, we don't want to call onPointerExit
|
|
530
|
+
if (newObject && this.isChild(newObject, behaviour.gameObject)) {
|
|
531
|
+
return;
|
|
532
|
+
}
|
|
533
|
+
this.handlePointerExit(inst, args);
|
|
534
|
+
}
|
|
535
|
+
});
|
|
536
|
+
}
|
|
537
|
+
/** handles onPointerUp - this will also release the pointerCapture */
|
|
538
|
+
invokeOnPointerUp(evt, handler) {
|
|
539
|
+
handler.onPointerUp?.call(handler, evt);
|
|
540
|
+
this.releasePointerCapture(evt, handler);
|
|
541
|
+
}
|
|
542
|
+
/** Responsible for invoking onPointerEnter (and updating onPointerExit). We invoke onPointerEnter once per active pointerId */
|
|
543
|
+
handlePointerEnter(comp, args) {
|
|
544
|
+
if (comp.onPointerEnter) {
|
|
545
|
+
if (this.updatePointerState(comp, args.pointerId, this.pointerEnterSymbol, true)) {
|
|
546
|
+
comp.onPointerEnter(args);
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
this.updatePointerState(comp, args.pointerId, this.pointerExitSymbol, false);
|
|
550
|
+
}
|
|
551
|
+
/** Responsible for invoking onPointerExit (and updating onPointerEnter). We invoke onPointerExit once per active pointerId */
|
|
552
|
+
handlePointerExit(comp, evt) {
|
|
553
|
+
if (comp.onPointerExit) {
|
|
554
|
+
if (this.updatePointerState(comp, evt.pointerId, this.pointerExitSymbol, true)) {
|
|
555
|
+
comp.onPointerExit(evt);
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
this.updatePointerState(comp, evt.pointerId, this.pointerEnterSymbol, false);
|
|
559
|
+
}
|
|
560
|
+
/** updates the pointer state list for a component
|
|
561
|
+
* @param comp the component to update
|
|
562
|
+
* @param pointerId the pointerId to update
|
|
563
|
+
* @param symbol the symbol to use for the state
|
|
564
|
+
* @param add if true, the pointerId is added to the state list, if false the pointerId will be removed
|
|
565
|
+
*/
|
|
566
|
+
updatePointerState(comp, pointerId, symbol, add) {
|
|
567
|
+
let state = comp[symbol];
|
|
568
|
+
if (add) {
|
|
569
|
+
// the pointer is already in the state list
|
|
570
|
+
if (state && state.includes(pointerId))
|
|
571
|
+
return false;
|
|
572
|
+
state = state || [];
|
|
573
|
+
state.push(pointerId);
|
|
574
|
+
comp[symbol] = state;
|
|
575
|
+
return true;
|
|
576
|
+
}
|
|
577
|
+
else {
|
|
578
|
+
if (!state || !state.includes(pointerId))
|
|
579
|
+
return false;
|
|
580
|
+
const i = state.indexOf(pointerId);
|
|
581
|
+
if (i !== -1) {
|
|
582
|
+
state.splice(i, 1);
|
|
583
|
+
}
|
|
584
|
+
return true;
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
/** the list of component handlers that requested pointerCapture for a specific pointerId */
|
|
588
|
+
_capturedPointer = {};
|
|
589
|
+
/** check if the event was marked to be captured: if yes add the current component to the captured list */
|
|
590
|
+
handlePointerCapture(evt, comp) {
|
|
591
|
+
if (evt.z__pointer_ctured) {
|
|
592
|
+
evt.z__pointer_ctured = false;
|
|
593
|
+
const id = evt.pointerId;
|
|
594
|
+
// only the onPointerMove event is called with captured pointers so we don't need to add it to our list if it doesnt implement onPointerMove
|
|
595
|
+
if (comp.onPointerMove) {
|
|
596
|
+
const list = this._capturedPointer[id] || [];
|
|
597
|
+
list.push(comp);
|
|
598
|
+
this._capturedPointer[id] = list;
|
|
599
|
+
}
|
|
600
|
+
else {
|
|
601
|
+
if (isDevEnvironment() && !comp["z__warned_no_pointermove"]) {
|
|
602
|
+
comp["z__warned_no_pointermove"] = true;
|
|
603
|
+
console.warn("PointerCapture was requested but the component doesn't implement onPointerMove. It will not receive any pointer events");
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
else if (evt.z__pointer_cture_rleased) {
|
|
608
|
+
evt.z__pointer_cture_rleased = false;
|
|
609
|
+
this.releasePointerCapture(evt, comp);
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
/** removes the component from the pointer capture list */
|
|
613
|
+
releasePointerCapture(evt, component) {
|
|
614
|
+
const id = evt.pointerId;
|
|
615
|
+
if (this._capturedPointer[id]) {
|
|
616
|
+
const i = this._capturedPointer[id].indexOf(component);
|
|
617
|
+
if (i !== -1) {
|
|
618
|
+
this._capturedPointer[id].splice(i, 1);
|
|
619
|
+
if (debug)
|
|
620
|
+
console.log("released pointer capture", id, component, this._capturedPointer);
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
/** invoke the pointerMove event on all captured handlers */
|
|
625
|
+
invokePointerCapture(evt) {
|
|
626
|
+
if (evt.event.type === InputEvents.PointerMove) {
|
|
627
|
+
const id = evt.pointerId;
|
|
628
|
+
const captured = this._capturedPointer[id];
|
|
629
|
+
if (captured) {
|
|
630
|
+
if (debug)
|
|
631
|
+
console.log("Captured", id, captured);
|
|
632
|
+
for (let i = 0; i < captured.length; i++) {
|
|
633
|
+
const handler = captured[i];
|
|
634
|
+
// check if it was destroyed
|
|
635
|
+
const comp = handler;
|
|
636
|
+
if (comp.destroyed) {
|
|
637
|
+
captured.splice(i, 1);
|
|
638
|
+
i--;
|
|
639
|
+
continue;
|
|
640
|
+
}
|
|
641
|
+
// invoke pointer move
|
|
642
|
+
handler.onPointerMove?.call(handler, evt);
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
pointerEnterSymbol = Symbol("pointerEnter");
|
|
648
|
+
pointerExitSymbol = Symbol("pointerExit");
|
|
649
|
+
isChild(obj, possibleChild) {
|
|
650
|
+
if (!obj || !possibleChild)
|
|
651
|
+
return false;
|
|
652
|
+
if (obj === possibleChild)
|
|
653
|
+
return true;
|
|
654
|
+
if (!obj.parent)
|
|
655
|
+
return false;
|
|
656
|
+
return this.isChild(obj.parent, possibleChild);
|
|
657
|
+
}
|
|
658
|
+
handleMeshUiObjectWithoutShadowDom(obj, pressed) {
|
|
659
|
+
if (!obj || !obj.isUI)
|
|
660
|
+
return true;
|
|
661
|
+
const hit = this.handleMeshUIIntersection(obj, pressed);
|
|
662
|
+
return hit;
|
|
663
|
+
}
|
|
664
|
+
currentActiveMeshUIComponents = [];
|
|
665
|
+
handleMeshUIIntersection(meshUiObject, pressed) {
|
|
666
|
+
const res = MeshUIHelper.updateState(meshUiObject, pressed);
|
|
667
|
+
if (res) {
|
|
668
|
+
this.currentActiveMeshUIComponents.push(res);
|
|
669
|
+
}
|
|
670
|
+
return res !== null;
|
|
671
|
+
}
|
|
672
|
+
resetMeshUIStates() {
|
|
673
|
+
if (this.context.input.getPointerPressedCount() > 0) {
|
|
674
|
+
MeshUIHelper.resetLastSelected();
|
|
675
|
+
}
|
|
676
|
+
if (!this.currentActiveMeshUIComponents || this.currentActiveMeshUIComponents.length <= 0)
|
|
677
|
+
return;
|
|
678
|
+
for (let i = 0; i < this.currentActiveMeshUIComponents.length; i++) {
|
|
679
|
+
const comp = this.currentActiveMeshUIComponents[i];
|
|
680
|
+
MeshUIHelper.resetState(comp);
|
|
681
|
+
}
|
|
682
|
+
this.currentActiveMeshUIComponents.length = 0;
|
|
683
|
+
}
|
|
684
|
+
testIsVisible(obj) {
|
|
685
|
+
if (!obj)
|
|
686
|
+
return true;
|
|
687
|
+
if (!GameObject.isActiveSelf(obj))
|
|
688
|
+
return false;
|
|
689
|
+
return this.testIsVisible(obj.parent);
|
|
690
|
+
}
|
|
691
|
+
}
|
|
692
|
+
class MeshUIHelper {
|
|
693
|
+
static lastSelected = null;
|
|
694
|
+
static lastUpdateFrame = [];
|
|
695
|
+
static needsUpdate = false;
|
|
696
|
+
static markDirty() {
|
|
697
|
+
this.needsUpdate = true;
|
|
698
|
+
}
|
|
699
|
+
static update(threeMeshUI, context, force = false) {
|
|
700
|
+
if (force) {
|
|
701
|
+
threeMeshUI.update();
|
|
702
|
+
return;
|
|
703
|
+
}
|
|
704
|
+
const currentFrame = context.time.frameCount;
|
|
705
|
+
for (const lu of this.lastUpdateFrame) {
|
|
706
|
+
if (lu.context === context) {
|
|
707
|
+
if (currentFrame === lu.frame)
|
|
708
|
+
return;
|
|
709
|
+
lu.frame = currentFrame;
|
|
710
|
+
let shouldUpdate = this.needsUpdate || currentFrame < 1;
|
|
711
|
+
if (lu.nextUpdate <= currentFrame)
|
|
712
|
+
shouldUpdate = true;
|
|
713
|
+
// if (this.needsUpdate) lu.nextUpdate = currentFrame + 3;
|
|
714
|
+
if (shouldUpdate) {
|
|
715
|
+
// console.warn(currentFrame, lu.nextUpdate, this.needsUpdate)
|
|
716
|
+
if (debug)
|
|
717
|
+
console.log("Update threemeshui");
|
|
718
|
+
this.needsUpdate = false;
|
|
719
|
+
lu.nextUpdate = currentFrame + 60;
|
|
720
|
+
threeMeshUI.update();
|
|
721
|
+
}
|
|
722
|
+
return;
|
|
723
|
+
}
|
|
724
|
+
}
|
|
725
|
+
this.lastUpdateFrame = [{ context, frame: currentFrame, nextUpdate: currentFrame + 60 }];
|
|
726
|
+
threeMeshUI.update();
|
|
727
|
+
this.needsUpdate = false;
|
|
728
|
+
}
|
|
729
|
+
static updateState(intersect, _selectState) {
|
|
730
|
+
let foundBlock = null;
|
|
731
|
+
if (intersect) {
|
|
732
|
+
foundBlock = this.findBlockOrTextInParent(intersect);
|
|
733
|
+
// console.log(intersect, "-- found block:", foundBlock)
|
|
734
|
+
if (foundBlock && foundBlock !== this.lastSelected) {
|
|
735
|
+
const interactable = foundBlock["interactable"];
|
|
736
|
+
if (interactable === false)
|
|
737
|
+
return null;
|
|
738
|
+
this.needsUpdate = true;
|
|
739
|
+
}
|
|
740
|
+
}
|
|
741
|
+
return foundBlock;
|
|
742
|
+
}
|
|
743
|
+
static resetLastSelected() {
|
|
744
|
+
const last = this.lastSelected;
|
|
745
|
+
if (!last)
|
|
746
|
+
return;
|
|
747
|
+
this.lastSelected = null;
|
|
748
|
+
this.resetState(last);
|
|
749
|
+
}
|
|
750
|
+
static resetState(obj) {
|
|
751
|
+
if (!obj)
|
|
752
|
+
return;
|
|
753
|
+
this.needsUpdate = true;
|
|
754
|
+
}
|
|
755
|
+
static findBlockOrTextInParent(elem) {
|
|
756
|
+
if (!elem)
|
|
757
|
+
return null;
|
|
758
|
+
if (elem.isBlock || (elem.isText)) {
|
|
759
|
+
// @TODO : Replace states managements
|
|
760
|
+
// if (Object.keys(elem.states).length > 0)
|
|
761
|
+
return elem;
|
|
762
|
+
}
|
|
763
|
+
return this.findBlockOrTextInParent(elem.parent);
|
|
764
|
+
}
|
|
765
|
+
}
|
|
766
766
|
//# sourceMappingURL=EventSystem.js.map
|