@needle-tools/engine 3.28.6-beta → 3.28.7-beta.1
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 +2259 -2253
- package/LICENSE.md +10 -10
- package/README.md +52 -52
- package/dist/needle-engine.js +7 -10
- package/dist/needle-engine.light.js +7 -10
- package/dist/needle-engine.light.min.js +7 -10
- package/dist/needle-engine.light.umd.cjs +7 -10
- package/dist/needle-engine.min.js +7 -10
- package/dist/needle-engine.umd.cjs +7 -10
- package/lib/engine/api.d.ts +52 -52
- package/lib/engine/api.js +51 -51
- package/lib/engine/assets/index.d.ts +1 -1
- package/lib/engine/assets/index.js +4 -4
- package/lib/engine/codegen/register_types.d.ts +1 -1
- package/lib/engine/codegen/register_types.js +439 -439
- package/lib/engine/debug/debug.d.ts +12 -12
- package/lib/engine/debug/debug.js +26 -26
- package/lib/engine/debug/debug_console.d.ts +2 -2
- package/lib/engine/debug/debug_console.js +204 -204
- package/lib/engine/debug/debug_overlay.d.ts +10 -10
- package/lib/engine/debug/debug_overlay.js +277 -277
- package/lib/engine/debug/index.d.ts +1 -1
- package/lib/engine/debug/index.js +1 -1
- package/lib/engine/engine_addressables.d.ts +75 -75
- package/lib/engine/engine_addressables.js +441 -441
- package/lib/engine/engine_application.d.ts +19 -19
- package/lib/engine/engine_application.js +45 -45
- package/lib/engine/engine_assetdatabase.d.ts +25 -25
- package/lib/engine/engine_assetdatabase.js +341 -341
- package/lib/engine/engine_camera.d.ts +6 -6
- package/lib/engine/engine_camera.js +23 -23
- package/lib/engine/engine_components.d.ts +17 -17
- package/lib/engine/engine_components.js +273 -273
- package/lib/engine/engine_components_internal.d.ts +11 -11
- package/lib/engine/engine_components_internal.js +41 -41
- package/lib/engine/engine_constants.d.ts +5 -5
- package/lib/engine/engine_constants.js +32 -32
- package/lib/engine/engine_context.d.ts +269 -269
- package/lib/engine/engine_context.js +1242 -1242
- package/lib/engine/engine_context_registry.d.ts +50 -50
- package/lib/engine/engine_context_registry.js +89 -89
- package/lib/engine/engine_coroutine.d.ts +4 -4
- package/lib/engine/engine_coroutine.js +21 -21
- package/lib/engine/engine_create_objects.d.ts +13 -13
- package/lib/engine/engine_create_objects.js +33 -33
- 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 +17 -17
- package/lib/engine/engine_editor-sync.js +7 -7
- package/lib/engine/engine_element.d.ts +55 -55
- package/lib/engine/engine_element.js +559 -559
- package/lib/engine/engine_element_attributes.d.ts +49 -49
- package/lib/engine/engine_element_attributes.js +1 -1
- package/lib/engine/engine_element_extras.d.ts +6 -6
- package/lib/engine/engine_element_extras.js +13 -13
- package/lib/engine/engine_element_loading.d.ts +40 -40
- package/lib/engine/engine_element_loading.js +312 -312
- package/lib/engine/engine_element_overlay.d.ts +19 -19
- package/lib/engine/engine_element_overlay.js +143 -143
- package/lib/engine/engine_fileloader.d.ts +3 -3
- package/lib/engine/engine_fileloader.js +7 -7
- package/lib/engine/engine_gameobject.d.ts +39 -39
- package/lib/engine/engine_gameobject.js +559 -559
- 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 +26 -26
- package/lib/engine/engine_gizmos.js +282 -282
- package/lib/engine/engine_gltf.d.ts +13 -13
- package/lib/engine/engine_gltf.js +15 -15
- package/lib/engine/engine_gltf_builtin_components.d.ts +7 -7
- package/lib/engine/engine_gltf_builtin_components.js +298 -298
- package/lib/engine/engine_hot_reload.d.ts +5 -5
- package/lib/engine/engine_hot_reload.js +182 -182
- package/lib/engine/engine_input.d.ts +129 -129
- package/lib/engine/engine_input.js +799 -799
- 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 +16 -16
- package/lib/engine/engine_instancing.js +36 -36
- package/lib/engine/engine_license.d.ts +4 -4
- package/lib/engine/engine_license.js +398 -398
- package/lib/engine/engine_lifecycle_api.d.ts +14 -14
- package/lib/engine/engine_lifecycle_api.js +24 -24
- package/lib/engine/engine_lifecycle_functions_internal.d.ts +6 -6
- package/lib/engine/engine_lifecycle_functions_internal.js +28 -28
- package/lib/engine/engine_lightdata.d.ts +23 -23
- package/lib/engine/engine_lightdata.js +86 -86
- package/lib/engine/engine_loaders.d.ts +7 -7
- package/lib/engine/engine_loaders.js +69 -69
- package/lib/engine/engine_mainloop_utils.d.ts +13 -13
- package/lib/engine/engine_mainloop_utils.js +426 -426
- package/lib/engine/engine_math.d.ts +43 -43
- package/lib/engine/engine_math.js +147 -147
- package/lib/engine/engine_networking.d.ts +176 -176
- package/lib/engine/engine_networking.js +649 -649
- package/lib/engine/engine_networking_auto.d.ts +24 -24
- package/lib/engine/engine_networking_auto.js +324 -324
- package/lib/engine/engine_networking_files.d.ts +23 -23
- package/lib/engine/engine_networking_files.js +176 -176
- package/lib/engine/engine_networking_files_default_components.d.ts +3 -3
- package/lib/engine/engine_networking_files_default_components.js +39 -39
- package/lib/engine/engine_networking_instantiate.d.ts +39 -39
- package/lib/engine/engine_networking_instantiate.js +302 -302
- 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 +90 -90
- package/lib/engine/engine_networking_streams.js +428 -428
- package/lib/engine/engine_networking_types.d.ts +14 -14
- 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_patcher.d.ts +10 -10
- package/lib/engine/engine_patcher.js +142 -142
- package/lib/engine/engine_physics.d.ts +115 -115
- package/lib/engine/engine_physics.js +228 -228
- package/lib/engine/engine_physics.types.d.ts +37 -37
- package/lib/engine/engine_physics.types.js +33 -33
- package/lib/engine/engine_physics_rapier.d.ts +112 -112
- package/lib/engine/engine_physics_rapier.js +1266 -1266
- package/lib/engine/engine_playerview.d.ts +26 -26
- package/lib/engine/engine_playerview.js +64 -64
- package/lib/engine/engine_scenelighting.d.ts +74 -74
- package/lib/engine/engine_scenelighting.js +285 -285
- package/lib/engine/engine_scenetools.d.ts +35 -35
- package/lib/engine/engine_scenetools.js +212 -212
- package/lib/engine/engine_serialization.d.ts +4 -4
- package/lib/engine/engine_serialization.js +4 -4
- package/lib/engine/engine_serialization_builtin_serializer.d.ts +62 -62
- package/lib/engine/engine_serialization_builtin_serializer.js +369 -369
- package/lib/engine/engine_serialization_core.d.ts +84 -84
- package/lib/engine/engine_serialization_core.js +576 -576
- package/lib/engine/engine_serialization_decorator.d.ts +15 -15
- package/lib/engine/engine_serialization_decorator.js +54 -54
- package/lib/engine/engine_setup.d.ts +1 -1
- package/lib/engine/engine_setup.js +2 -2
- package/lib/engine/engine_shaders.d.ts +31 -31
- package/lib/engine/engine_shaders.js +229 -229
- package/lib/engine/engine_shims.d.ts +3 -3
- package/lib/engine/engine_shims.js +22 -22
- package/lib/engine/engine_texture.d.ts +20 -20
- package/lib/engine/engine_texture.js +57 -57
- package/lib/engine/engine_three_utils.d.ts +51 -51
- package/lib/engine/engine_three_utils.js +342 -342
- package/lib/engine/engine_time.d.ts +19 -19
- package/lib/engine/engine_time.js +47 -47
- package/lib/engine/engine_types.d.ts +358 -358
- package/lib/engine/engine_types.js +72 -72
- package/lib/engine/engine_typestore.d.ts +16 -16
- package/lib/engine/engine_typestore.js +35 -35
- package/lib/engine/engine_util_decorator.d.ts +12 -12
- package/lib/engine/engine_util_decorator.js +115 -115
- package/lib/engine/engine_utils.d.ts +104 -104
- package/lib/engine/engine_utils.js +518 -518
- package/lib/engine/engine_utils_screenshot.d.ts +10 -10
- package/lib/engine/engine_utils_screenshot.js +70 -70
- package/lib/engine/engine_web_api.d.ts +12 -12
- package/lib/engine/engine_web_api.js +112 -112
- 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 +116 -116
- package/lib/engine/extensions/NEEDLE_animator_controller_model.js +91 -91
- package/lib/engine/extensions/NEEDLE_components.d.ts +33 -33
- package/lib/engine/extensions/NEEDLE_components.js +206 -206
- 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 +38 -38
- package/lib/engine/extensions/NEEDLE_lighting_settings.js +183 -183
- package/lib/engine/extensions/NEEDLE_lightmaps.d.ts +18 -18
- package/lib/engine/extensions/NEEDLE_lightmaps.js +108 -108
- 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 +41 -41
- package/lib/engine/extensions/NEEDLE_progressive.js +366 -366
- 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 +39 -39
- package/lib/engine/extensions/NEEDLE_techniques_webgl.js +544 -544
- 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 +2 -2
- package/lib/engine/extensions/extension_utils.js +140 -140
- package/lib/engine/extensions/extensions.d.ts +21 -21
- package/lib/engine/extensions/extensions.js +94 -94
- package/lib/engine/extensions/index.d.ts +5 -5
- package/lib/engine/extensions/index.js +5 -5
- package/lib/engine/extensions/usage_tracker.d.ts +13 -13
- package/lib/engine/extensions/usage_tracker.js +61 -61
- package/lib/engine/js-extensions/Camera.d.ts +1 -1
- package/lib/engine/js-extensions/Camera.js +36 -36
- package/lib/engine/js-extensions/Layers.d.ts +3 -3
- package/lib/engine/js-extensions/Layers.js +19 -19
- package/lib/engine/js-extensions/index.d.ts +2 -2
- package/lib/engine/js-extensions/index.js +2 -2
- 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-components/AlignmentConstraint.d.ts +10 -10
- package/lib/engine-components/AlignmentConstraint.js +39 -39
- package/lib/engine-components/Animation.d.ts +53 -53
- package/lib/engine-components/Animation.js +333 -333
- package/lib/engine-components/AnimationCurve.d.ts +16 -16
- package/lib/engine-components/AnimationCurve.js +97 -97
- package/lib/engine-components/AnimationUtils.d.ts +8 -8
- package/lib/engine-components/AnimationUtils.js +110 -110
- package/lib/engine-components/Animator.d.ts +81 -81
- package/lib/engine-components/Animator.js +229 -229
- package/lib/engine-components/AnimatorController.d.ts +57 -57
- package/lib/engine-components/AnimatorController.js +887 -887
- package/lib/engine-components/AudioListener.d.ts +7 -7
- package/lib/engine-components/AudioListener.js +30 -30
- package/lib/engine-components/AudioSource.d.ts +61 -61
- package/lib/engine-components/AudioSource.js +422 -422
- package/lib/engine-components/AvatarLoader.d.ts +19 -19
- package/lib/engine-components/AvatarLoader.js +173 -173
- package/lib/engine-components/AxesHelper.d.ts +9 -9
- package/lib/engine-components/AxesHelper.js +44 -44
- package/lib/engine-components/BasicIKConstraint.d.ts +9 -9
- package/lib/engine-components/BasicIKConstraint.js +43 -43
- package/lib/engine-components/BoxHelperComponent.d.ts +16 -16
- package/lib/engine-components/BoxHelperComponent.js +89 -89
- package/lib/engine-components/Camera.d.ts +70 -70
- package/lib/engine-components/Camera.js +450 -450
- package/lib/engine-components/CameraUtils.d.ts +1 -1
- package/lib/engine-components/CameraUtils.js +77 -77
- package/lib/engine-components/CharacterController.d.ts +46 -46
- package/lib/engine-components/CharacterController.js +227 -227
- package/lib/engine-components/Collider.d.ts +46 -46
- package/lib/engine-components/Collider.js +153 -153
- package/lib/engine-components/Component.d.ts +228 -228
- package/lib/engine-components/Component.js +541 -541
- package/lib/engine-components/ContactShadows.d.ts +23 -23
- package/lib/engine-components/ContactShadows.js +233 -233
- package/lib/engine-components/DeleteBox.d.ts +9 -9
- package/lib/engine-components/DeleteBox.js +30 -30
- package/lib/engine-components/DeviceFlag.d.ts +12 -12
- package/lib/engine-components/DeviceFlag.js +43 -43
- package/lib/engine-components/DragControls.d.ts +51 -51
- package/lib/engine-components/DragControls.js +516 -516
- package/lib/engine-components/DropListener.d.ts +15 -15
- package/lib/engine-components/DropListener.js +120 -120
- package/lib/engine-components/Duplicatable.d.ts +16 -16
- package/lib/engine-components/Duplicatable.js +150 -150
- package/lib/engine-components/EventList.d.ts +28 -28
- package/lib/engine-components/EventList.js +105 -105
- package/lib/engine-components/EventTrigger.d.ts +12 -12
- package/lib/engine-components/EventTrigger.js +50 -50
- package/lib/engine-components/EventType.d.ts +19 -19
- package/lib/engine-components/EventType.js +71 -71
- package/lib/engine-components/FlyControls.d.ts +7 -7
- package/lib/engine-components/FlyControls.js +25 -25
- package/lib/engine-components/Fog.d.ts +20 -20
- package/lib/engine-components/Fog.js +60 -60
- package/lib/engine-components/Gizmos.d.ts +12 -12
- package/lib/engine-components/Gizmos.js +60 -60
- package/lib/engine-components/GridHelper.d.ts +12 -12
- package/lib/engine-components/GridHelper.js +47 -47
- package/lib/engine-components/GroundProjection.d.ts +21 -21
- package/lib/engine-components/GroundProjection.js +97 -97
- package/lib/engine-components/Interactable.d.ts +10 -10
- package/lib/engine-components/Interactable.js +11 -11
- package/lib/engine-components/Joints.d.ts +19 -19
- package/lib/engine-components/Joints.js +51 -51
- package/lib/engine-components/LODGroup.d.ts +30 -30
- package/lib/engine-components/LODGroup.js +145 -145
- package/lib/engine-components/Light.d.ts +75 -75
- package/lib/engine-components/Light.js +475 -475
- package/lib/engine-components/LookAtConstraint.d.ts +7 -7
- package/lib/engine-components/LookAtConstraint.js +17 -17
- package/lib/engine-components/NestedGltf.d.ts +11 -11
- package/lib/engine-components/NestedGltf.js +74 -74
- package/lib/engine-components/Networking.d.ts +11 -11
- package/lib/engine-components/Networking.js +70 -70
- package/lib/engine-components/OffsetConstraint.d.ts +14 -14
- package/lib/engine-components/OffsetConstraint.js +65 -65
- package/lib/engine-components/OrbitControls.d.ts +111 -111
- package/lib/engine-components/OrbitControls.js +646 -646
- package/lib/engine-components/ParticleSystem.d.ts +145 -145
- package/lib/engine-components/ParticleSystem.js +1077 -1077
- package/lib/engine-components/ParticleSystemModules.d.ts +489 -489
- package/lib/engine-components/ParticleSystemModules.js +1667 -1667
- package/lib/engine-components/ParticleSystemSubEmitter.d.ts +25 -25
- package/lib/engine-components/ParticleSystemSubEmitter.js +86 -86
- package/lib/engine-components/PlayerColor.d.ts +13 -13
- package/lib/engine-components/PlayerColor.js +83 -83
- package/lib/engine-components/ReflectionProbe.d.ts +22 -22
- package/lib/engine-components/ReflectionProbe.js +181 -181
- package/lib/engine-components/Renderer.d.ts +112 -112
- package/lib/engine-components/Renderer.js +1029 -1029
- package/lib/engine-components/RendererLightmap.d.ts +19 -19
- package/lib/engine-components/RendererLightmap.js +127 -127
- package/lib/engine-components/RigidBody.d.ts +120 -120
- package/lib/engine-components/RigidBody.js +452 -452
- package/lib/engine-components/SceneSwitcher.d.ts +72 -72
- package/lib/engine-components/SceneSwitcher.js +583 -583
- package/lib/engine-components/ScreenCapture.d.ts +64 -64
- package/lib/engine-components/ScreenCapture.js +405 -405
- package/lib/engine-components/ShadowCatcher.d.ts +18 -18
- package/lib/engine-components/ShadowCatcher.js +144 -144
- package/lib/engine-components/Skybox.d.ts +23 -23
- package/lib/engine-components/Skybox.js +287 -287
- package/lib/engine-components/SmoothFollow.d.ts +14 -14
- package/lib/engine-components/SmoothFollow.js +63 -63
- package/lib/engine-components/SpatialTrigger.d.ts +27 -27
- package/lib/engine-components/SpatialTrigger.js +144 -144
- package/lib/engine-components/SpectatorCamera.d.ts +45 -45
- package/lib/engine-components/SpectatorCamera.js +593 -593
- package/lib/engine-components/SpriteRenderer.d.ts +48 -48
- package/lib/engine-components/SpriteRenderer.js +257 -257
- package/lib/engine-components/SyncedCamera.d.ts +27 -27
- package/lib/engine-components/SyncedCamera.js +187 -187
- package/lib/engine-components/SyncedRoom.d.ts +24 -24
- package/lib/engine-components/SyncedRoom.js +162 -162
- package/lib/engine-components/SyncedTransform.d.ts +35 -35
- package/lib/engine-components/SyncedTransform.js +265 -265
- package/lib/engine-components/TestRunner.d.ts +13 -13
- package/lib/engine-components/TestRunner.js +99 -99
- package/lib/engine-components/TransformGizmo.d.ts +16 -16
- package/lib/engine-components/TransformGizmo.js +148 -148
- package/lib/engine-components/VideoPlayer.d.ts +86 -86
- package/lib/engine-components/VideoPlayer.js +792 -792
- package/lib/engine-components/Voip.d.ts +29 -29
- package/lib/engine-components/Voip.js +203 -203
- package/lib/engine-components/XRFlag.d.ts +33 -33
- package/lib/engine-components/XRFlag.js +128 -128
- package/lib/engine-components/api.d.ts +15 -15
- package/lib/engine-components/api.js +15 -15
- package/lib/engine-components/avatar/AvatarBlink_Simple.d.ts +10 -10
- package/lib/engine-components/avatar/AvatarBlink_Simple.js +75 -75
- package/lib/engine-components/avatar/AvatarEyeLook_Rotation.d.ts +13 -13
- package/lib/engine-components/avatar/AvatarEyeLook_Rotation.js +74 -74
- package/lib/engine-components/avatar/Avatar_Brain_LookAt.d.ts +27 -27
- package/lib/engine-components/avatar/Avatar_Brain_LookAt.js +119 -119
- package/lib/engine-components/avatar/Avatar_MouthShapes.d.ts +13 -13
- package/lib/engine-components/avatar/Avatar_MouthShapes.js +78 -78
- package/lib/engine-components/avatar/Avatar_MustacheShake.d.ts +8 -8
- package/lib/engine-components/avatar/Avatar_MustacheShake.js +28 -28
- package/lib/engine-components/codegen/components.d.ts +216 -216
- package/lib/engine-components/codegen/components.js +217 -217
- 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 +25 -25
- package/lib/engine-components/export/gltf/GltfExport.js +215 -215
- 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 +10 -10
- package/lib/engine-components/export/usdz/Extension.js +1 -1
- package/lib/engine-components/export/usdz/ThreeUSDZExporter.d.ts +114 -114
- package/lib/engine-components/export/usdz/ThreeUSDZExporter.js +1211 -1211
- package/lib/engine-components/export/usdz/USDZExporter.d.ts +59 -59
- package/lib/engine-components/export/usdz/USDZExporter.js +450 -450
- package/lib/engine-components/export/usdz/extensions/Animation.d.ts +69 -69
- package/lib/engine-components/export/usdz/extensions/Animation.js +650 -650
- 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/USDZText.d.ts +55 -55
- package/lib/engine-components/export/usdz/extensions/USDZText.js +246 -246
- package/lib/engine-components/export/usdz/extensions/USDZUI.d.ts +8 -8
- package/lib/engine-components/export/usdz/extensions/USDZUI.js +100 -100
- 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 +9 -9
- package/lib/engine-components/export/usdz/extensions/behavior/AudioExtension.js +52 -52
- package/lib/engine-components/export/usdz/extensions/behavior/Behaviour.d.ts +22 -22
- package/lib/engine-components/export/usdz/extensions/behavior/Behaviour.js +134 -134
- package/lib/engine-components/export/usdz/extensions/behavior/BehaviourComponents.d.ts +126 -126
- package/lib/engine-components/export/usdz/extensions/behavior/BehaviourComponents.js +824 -824
- package/lib/engine-components/export/usdz/extensions/behavior/BehavioursBuilder.d.ts +133 -133
- package/lib/engine-components/export/usdz/extensions/behavior/BehavioursBuilder.js +464 -464
- 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 +3 -3
- package/lib/engine-components/export/usdz/utils/animationutils.js +85 -85
- package/lib/engine-components/export/usdz/utils/quicklook.d.ts +2 -2
- package/lib/engine-components/export/usdz/utils/quicklook.js +35 -35
- package/lib/engine-components/export/usdz/utils/timeutils.d.ts +1 -1
- package/lib/engine-components/export/usdz/utils/timeutils.js +14 -14
- package/lib/engine-components/js-extensions/ExtensionUtils.d.ts +6 -6
- package/lib/engine-components/js-extensions/ExtensionUtils.js +65 -65
- package/lib/engine-components/js-extensions/Object3D.d.ts +2 -2
- package/lib/engine-components/js-extensions/Object3D.js +140 -140
- package/lib/engine-components/js-extensions/RGBAColor.d.ts +14 -14
- package/lib/engine-components/js-extensions/RGBAColor.js +49 -49
- package/lib/engine-components/js-extensions/index.d.ts +3 -3
- package/lib/engine-components/js-extensions/index.js +3 -3
- package/lib/engine-components/postprocessing/Effects/Antialiasing.d.ts +13 -13
- package/lib/engine-components/postprocessing/Effects/Antialiasing.js +45 -45
- package/lib/engine-components/postprocessing/Effects/Bloom.d.ts +12 -12
- package/lib/engine-components/postprocessing/Effects/Bloom.js +77 -77
- package/lib/engine-components/postprocessing/Effects/ChromaticAberration.d.ts +8 -8
- package/lib/engine-components/postprocessing/Effects/ChromaticAberration.js +38 -38
- package/lib/engine-components/postprocessing/Effects/ColorAdjustments.d.ts +12 -12
- package/lib/engine-components/postprocessing/Effects/ColorAdjustments.js +81 -81
- package/lib/engine-components/postprocessing/Effects/DepthOfField.d.ts +21 -21
- package/lib/engine-components/postprocessing/Effects/DepthOfField.js +97 -97
- package/lib/engine-components/postprocessing/Effects/Pixelation.d.ts +7 -7
- package/lib/engine-components/postprocessing/Effects/Pixelation.js +28 -28
- package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusion.d.ts +13 -13
- package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusion.js +86 -86
- package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.d.ts +24 -24
- package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.js +94 -94
- package/lib/engine-components/postprocessing/Effects/TiltShiftEffect.d.ts +13 -13
- package/lib/engine-components/postprocessing/Effects/TiltShiftEffect.js +62 -62
- package/lib/engine-components/postprocessing/Effects/Tonemapping.d.ts +16 -16
- package/lib/engine-components/postprocessing/Effects/Tonemapping.js +51 -51
- package/lib/engine-components/postprocessing/Effects/Vignette.d.ts +11 -11
- package/lib/engine-components/postprocessing/Effects/Vignette.js +56 -56
- package/lib/engine-components/postprocessing/PostProcessingEffect.d.ts +33 -33
- package/lib/engine-components/postprocessing/PostProcessingEffect.js +126 -126
- package/lib/engine-components/postprocessing/PostProcessingHandler.d.ts +22 -22
- package/lib/engine-components/postprocessing/PostProcessingHandler.js +201 -201
- package/lib/engine-components/postprocessing/Volume.d.ts +25 -25
- package/lib/engine-components/postprocessing/Volume.js +193 -193
- package/lib/engine-components/postprocessing/VolumeParameter.d.ts +22 -22
- package/lib/engine-components/postprocessing/VolumeParameter.js +80 -80
- package/lib/engine-components/postprocessing/VolumeProfile.d.ts +7 -7
- package/lib/engine-components/postprocessing/VolumeProfile.js +41 -41
- package/lib/engine-components/postprocessing/index.d.ts +4 -4
- package/lib/engine-components/postprocessing/index.js +4 -4
- package/lib/engine-components/timeline/PlayableDirector.d.ts +107 -107
- package/lib/engine-components/timeline/PlayableDirector.js +624 -624
- package/lib/engine-components/timeline/SignalAsset.d.ts +18 -18
- package/lib/engine-components/timeline/SignalAsset.js +124 -124
- package/lib/engine-components/timeline/TimelineModels.d.ts +88 -88
- package/lib/engine-components/timeline/TimelineModels.js +22 -22
- package/lib/engine-components/timeline/TimelineTracks.d.ts +90 -90
- package/lib/engine-components/timeline/TimelineTracks.js +825 -825
- 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 +31 -31
- package/lib/engine-components/ui/BaseUIComponent.js +161 -161
- package/lib/engine-components/ui/Button.d.ts +56 -56
- package/lib/engine-components/ui/Button.js +282 -282
- package/lib/engine-components/ui/Canvas.d.ts +67 -67
- package/lib/engine-components/ui/Canvas.js +382 -382
- package/lib/engine-components/ui/CanvasGroup.d.ts +15 -15
- package/lib/engine-components/ui/CanvasGroup.js +53 -53
- package/lib/engine-components/ui/EventSystem.d.ts +102 -102
- package/lib/engine-components/ui/EventSystem.js +641 -641
- package/lib/engine-components/ui/Graphic.d.ts +45 -45
- package/lib/engine-components/ui/Graphic.js +236 -236
- package/lib/engine-components/ui/Image.d.ts +27 -27
- package/lib/engine-components/ui/Image.js +107 -107
- package/lib/engine-components/ui/InputField.d.ts +34 -34
- package/lib/engine-components/ui/InputField.js +234 -234
- 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 +72 -72
- package/lib/engine-components/ui/Layout.js +318 -318
- 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 +64 -64
- package/lib/engine-components/ui/PointerEvents.js +68 -68
- 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 +18 -18
- package/lib/engine-components/ui/Raycaster.js +69 -69
- package/lib/engine-components/ui/RectTransform.d.ts +61 -61
- package/lib/engine-components/ui/RectTransform.js +343 -343
- package/lib/engine-components/ui/SpatialHtml.d.ts +6 -6
- package/lib/engine-components/ui/SpatialHtml.js +57 -57
- package/lib/engine-components/ui/Text.d.ts +74 -74
- package/lib/engine-components/ui/Text.js +534 -534
- package/lib/engine-components/ui/Utils.d.ts +23 -23
- 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/LookAt.d.ts +13 -13
- package/lib/engine-components/utils/LookAt.js +59 -59
- package/lib/engine-components/utils/OpenURL.d.ts +21 -21
- package/lib/engine-components/utils/OpenURL.js +124 -124
- package/lib/engine-components/webxr/WebARCameraBackground.d.ts +19 -19
- package/lib/engine-components/webxr/WebARCameraBackground.js +193 -193
- package/lib/engine-components/webxr/WebARSessionRoot.d.ts +38 -38
- package/lib/engine-components/webxr/WebARSessionRoot.js +407 -407
- package/lib/engine-components/webxr/WebXR.d.ts +110 -110
- package/lib/engine-components/webxr/WebXR.js +672 -672
- package/lib/engine-components/webxr/WebXRAvatar.d.ts +61 -61
- package/lib/engine-components/webxr/WebXRAvatar.js +289 -289
- package/lib/engine-components/webxr/WebXRController.d.ts +154 -154
- package/lib/engine-components/webxr/WebXRController.js +1028 -1028
- package/lib/engine-components/webxr/WebXRGrabRendering.d.ts +42 -42
- package/lib/engine-components/webxr/WebXRGrabRendering.js +137 -137
- package/lib/engine-components/webxr/WebXRImageTracking.d.ts +49 -49
- package/lib/engine-components/webxr/WebXRImageTracking.js +336 -336
- package/lib/engine-components/webxr/WebXRPlaneTracking.d.ts +49 -49
- package/lib/engine-components/webxr/WebXRPlaneTracking.js +372 -372
- package/lib/engine-components/webxr/WebXRRig.d.ts +4 -4
- package/lib/engine-components/webxr/WebXRRig.js +19 -19
- package/lib/engine-components/webxr/WebXRSync.d.ts +54 -54
- package/lib/engine-components/webxr/WebXRSync.js +410 -410
- package/lib/engine-components/webxr/index.d.ts +4 -4
- package/lib/engine-components/webxr/index.js +4 -4
- 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 +1 -1
- package/lib/engine-components-experimental/api.js +1 -1
- package/lib/engine-components-experimental/networking/PlayerSync.d.ts +50 -50
- package/lib/engine-components-experimental/networking/PlayerSync.js +200 -200
- package/lib/engine-schemes/api.d.ts +1 -1
- package/lib/engine-schemes/api.js +1 -1
- 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/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 +36 -36
- package/lib/engine-schemes/vr-user-state-buffer.js +103 -103
- package/lib/include/three/ARButton.d.ts +3 -3
- package/lib/include/three/ARButton.js +151 -151
- 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/include/three/VRButton.d.ts +5 -5
- package/lib/include/three/VRButton.js +118 -118
- package/lib/needle-engine.d.ts +6 -6
- package/lib/needle-engine.js +49 -49
- package/package.json +1 -1
- package/plugins/common/config.cjs +14 -14
- package/plugins/common/config.js +19 -19
- package/plugins/common/generator.js +10 -10
- package/plugins/common/license.cjs +30 -30
- package/plugins/common/version.js +11 -11
- package/plugins/next/license.cjs +4 -4
- package/plugins/next/next.js +70 -70
- package/plugins/types/index.d.ts +1 -1
- package/plugins/types/needleConfig.d.ts +21 -21
- package/plugins/types/userconfig.d.ts +42 -42
- package/plugins/vite/alias.js +70 -70
- package/plugins/vite/build.js +19 -19
- package/plugins/vite/config.js +73 -73
- package/plugins/vite/copyfiles.js +134 -134
- package/plugins/vite/defines.js +45 -45
- package/plugins/vite/dependency-watcher.js +224 -224
- package/plugins/vite/drop-client.js +76 -76
- package/plugins/vite/drop.js +82 -82
- package/plugins/vite/editor-connection.js +121 -121
- package/plugins/vite/facebook-instant-games.js +99 -99
- package/plugins/vite/gzip.js +5 -5
- package/plugins/vite/imports-logger.js +143 -143
- package/plugins/vite/index.js +81 -81
- package/plugins/vite/license.js +42 -42
- package/plugins/vite/meta.js +149 -149
- package/plugins/vite/peer.js +31 -31
- package/plugins/vite/poster-client.js +59 -59
- package/plugins/vite/poster.js +73 -73
- package/plugins/vite/reload-client.js +15 -15
- package/plugins/vite/reload.js +363 -363
- package/plugins/vite/transform-codegen.js +55 -55
- package/plugins/vite/vite-4.4-hack.js +31 -31
- package/src/engine/api.ts +54 -54
- package/src/engine/assets/index.ts +4 -4
- package/src/engine/codegen/register_types.ts +441 -441
- package/src/engine/debug/debug.ts +29 -29
- package/src/engine/debug/debug_console.ts +213 -213
- package/src/engine/debug/debug_overlay.ts +283 -283
- package/src/engine/engine.ts +13 -13
- package/src/engine/engine_addressables.ts +494 -494
- package/src/engine/engine_application.ts +53 -53
- package/src/engine/engine_assetdatabase.ts +383 -383
- package/src/engine/engine_camera.ts +32 -32
- package/src/engine/engine_components.ts +266 -266
- package/src/engine/engine_components_internal.ts +42 -42
- package/src/engine/engine_constants.ts +42 -42
- package/src/engine/engine_context.ts +1386 -1386
- package/src/engine/engine_context_registry.ts +103 -103
- package/src/engine/engine_coroutine.ts +24 -24
- package/src/engine/engine_create_objects.ts +39 -39
- package/src/engine/engine_default_parameters.ts +3 -3
- package/src/engine/engine_editor-sync.ts +29 -29
- package/src/engine/engine_element.ts +592 -592
- package/src/engine/engine_element_attributes.ts +61 -61
- package/src/engine/engine_element_extras.ts +16 -16
- package/src/engine/engine_element_loading.ts +341 -341
- package/src/engine/engine_element_overlay.ts +160 -160
- package/src/engine/engine_fileloader.js +8 -8
- package/src/engine/engine_gameobject.ts +621 -621
- package/src/engine/engine_generic_utils.js +13 -13
- package/src/engine/engine_gizmos.ts +321 -321
- package/src/engine/engine_gltf.ts +30 -30
- package/src/engine/engine_gltf_builtin_components.ts +350 -350
- package/src/engine/engine_hot_reload.ts +196 -196
- package/src/engine/engine_input.ts +879 -879
- package/src/engine/engine_input_utils.ts +23 -23
- package/src/engine/engine_instancing.ts +42 -42
- package/src/engine/engine_license.ts +413 -413
- package/src/engine/engine_lifecycle_api.ts +29 -29
- package/src/engine/engine_lifecycle_functions_internal.ts +36 -36
- package/src/engine/engine_lightdata.ts +113 -113
- package/src/engine/engine_loaders.ts +77 -77
- package/src/engine/engine_mainloop_utils.ts +431 -431
- package/src/engine/engine_math.ts +174 -174
- package/src/engine/engine_networking.ts +742 -742
- package/src/engine/engine_networking_auto.ts +373 -373
- package/src/engine/engine_networking_files.ts +206 -206
- package/src/engine/engine_networking_files_default_components.ts +54 -54
- package/src/engine/engine_networking_instantiate.ts +362 -362
- package/src/engine/engine_networking_peer.ts +158 -158
- package/src/engine/engine_networking_streams.ts +489 -489
- package/src/engine/engine_networking_types.ts +18 -18
- 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 +287 -287
- package/src/engine/engine_physics.types.ts +43 -43
- package/src/engine/engine_physics_rapier.ts +1385 -1385
- package/src/engine/engine_playerview.ts +79 -79
- package/src/engine/engine_scenelighting.ts +313 -313
- package/src/engine/engine_scenetools.ts +242 -242
- package/src/engine/engine_serialization.ts +6 -6
- package/src/engine/engine_serialization_builtin_serializer.ts +415 -415
- package/src/engine/engine_serialization_core.ts +680 -680
- package/src/engine/engine_serialization_decorator.ts +68 -68
- package/src/engine/engine_setup.ts +1 -1
- package/src/engine/engine_shaders.ts +242 -242
- package/src/engine/engine_shims.ts +28 -28
- package/src/engine/engine_texture.ts +70 -70
- package/src/engine/engine_three_utils.ts +382 -382
- package/src/engine/engine_time.ts +55 -55
- package/src/engine/engine_types.ts +489 -489
- package/src/engine/engine_typestore.ts +41 -41
- package/src/engine/engine_util_decorator.ts +134 -134
- package/src/engine/engine_utils.ts +605 -605
- package/src/engine/engine_utils_screenshot.ts +84 -84
- package/src/engine/engine_web_api.ts +119 -119
- package/src/engine/extensions/EXT_texture_exr.ts +49 -49
- package/src/engine/extensions/NEEDLE_animator_controller_model.ts +193 -193
- package/src/engine/extensions/NEEDLE_components.ts +250 -250
- package/src/engine/extensions/NEEDLE_gameobject_data.ts +82 -82
- package/src/engine/extensions/NEEDLE_lighting_settings.ts +210 -210
- package/src/engine/extensions/NEEDLE_lightmaps.ts +130 -130
- package/src/engine/extensions/NEEDLE_persistent_assets.ts +75 -75
- package/src/engine/extensions/NEEDLE_progressive.ts +412 -412
- package/src/engine/extensions/NEEDLE_render_objects.ts +209 -209
- package/src/engine/extensions/NEEDLE_techniques_webgl.ts +618 -618
- package/src/engine/extensions/extension_resolver.ts +4 -4
- package/src/engine/extensions/extension_utils.ts +149 -149
- package/src/engine/extensions/extensions.ts +118 -118
- package/src/engine/extensions/index.ts +4 -4
- package/src/engine/extensions/usage_tracker.ts +95 -95
- package/src/engine/js-extensions/Camera.ts +34 -34
- package/src/engine/js-extensions/Layers.ts +19 -19
- package/src/engine/js-extensions/index.ts +1 -1
- package/src/engine/shaders/shaderData.ts +67 -67
- package/src/engine/tests/test_utils.ts +63 -63
- package/src/engine-components/AlignmentConstraint.ts +35 -35
- package/src/engine-components/Animation.ts +345 -345
- package/src/engine-components/AnimationCurve.ts +83 -83
- package/src/engine-components/AnimationUtils.ts +117 -117
- package/src/engine-components/Animator.ts +243 -243
- package/src/engine-components/AnimatorController.ts +1020 -1020
- package/src/engine-components/AudioListener.ts +32 -32
- package/src/engine-components/AudioSource.ts +419 -419
- package/src/engine-components/AvatarLoader.ts +204 -204
- package/src/engine-components/AxesHelper.ts +33 -33
- package/src/engine-components/BasicIKConstraint.ts +53 -53
- package/src/engine-components/BoxCollider.ts +1 -1
- package/src/engine-components/BoxHelperComponent.ts +100 -100
- package/src/engine-components/Camera.ts +454 -454
- package/src/engine-components/CameraUtils.ts +89 -89
- package/src/engine-components/CharacterController.ts +243 -243
- package/src/engine-components/Collider.ts +160 -160
- package/src/engine-components/Component.ts +670 -670
- package/src/engine-components/ContactShadows.ts +265 -265
- package/src/engine-components/DeleteBox.ts +35 -35
- package/src/engine-components/DeviceFlag.ts +42 -42
- package/src/engine-components/DragControls.ts +574 -574
- package/src/engine-components/DropListener.ts +112 -112
- package/src/engine-components/Duplicatable.ts +146 -146
- package/src/engine-components/EventList.ts +125 -125
- package/src/engine-components/EventTrigger.ts +47 -47
- package/src/engine-components/EventType.ts +87 -87
- package/src/engine-components/FlyControls.ts +31 -31
- package/src/engine-components/Fog.ts +59 -59
- package/src/engine-components/Gizmos.ts +52 -52
- package/src/engine-components/GridHelper.ts +40 -40
- package/src/engine-components/GroundProjection.ts +97 -97
- package/src/engine-components/Interactable.ts +18 -18
- package/src/engine-components/Joints.ts +51 -51
- package/src/engine-components/LODGroup.ts +145 -145
- package/src/engine-components/Light.ts +493 -493
- package/src/engine-components/LookAtConstraint.ts +11 -11
- package/src/engine-components/NestedGltf.ts +70 -70
- package/src/engine-components/Networking.ts +72 -72
- package/src/engine-components/OffsetConstraint.ts +59 -59
- package/src/engine-components/OrbitControls.ts +653 -653
- package/src/engine-components/ParticleSystem.ts +1192 -1192
- package/src/engine-components/ParticleSystemModules.ts +1481 -1481
- package/src/engine-components/ParticleSystemSubEmitter.ts +110 -110
- package/src/engine-components/PlayerColor.ts +93 -93
- package/src/engine-components/ReflectionProbe.ts +192 -192
- package/src/engine-components/Renderer.ts +1125 -1125
- package/src/engine-components/RendererLightmap.ts +145 -145
- package/src/engine-components/RigidBody.ts +453 -453
- package/src/engine-components/SceneSwitcher.ts +594 -594
- package/src/engine-components/ScreenCapture.ts +437 -437
- package/src/engine-components/ShadowCatcher.ts +149 -149
- package/src/engine-components/Skybox.ts +281 -281
- package/src/engine-components/SmoothFollow.ts +57 -57
- package/src/engine-components/SpatialTrigger.ts +142 -142
- package/src/engine-components/SpectatorCamera.ts +675 -675
- package/src/engine-components/SphereCollider.ts +1 -1
- package/src/engine-components/SpriteRenderer.ts +244 -244
- package/src/engine-components/SyncedCamera.ts +208 -208
- package/src/engine-components/SyncedRoom.ts +166 -166
- package/src/engine-components/SyncedTransform.ts +336 -336
- package/src/engine-components/TestRunner.ts +114 -114
- package/src/engine-components/TransformGizmo.ts +157 -157
- package/src/engine-components/VideoPlayer.ts +831 -831
- package/src/engine-components/Voip.ts +214 -214
- package/src/engine-components/XRFlag.ts +138 -138
- package/src/engine-components/api.ts +22 -22
- package/src/engine-components/avatar/AvatarBlink_Simple.ts +67 -67
- package/src/engine-components/avatar/AvatarEyeLook_Rotation.ts +68 -68
- package/src/engine-components/avatar/Avatar_Brain_LookAt.ts +136 -136
- package/src/engine-components/avatar/Avatar_MouthShapes.ts +81 -81
- package/src/engine-components/avatar/Avatar_MustacheShake.ts +28 -28
- package/src/engine-components/codegen/components.ts +216 -216
- package/src/engine-components/debug/LogStats.ts +21 -21
- package/src/engine-components/export/gltf/GltfExport.ts +231 -231
- package/src/engine-components/export/usdz/Extension.ts +11 -11
- package/src/engine-components/export/usdz/ThreeUSDZExporter.ts +1773 -1773
- package/src/engine-components/export/usdz/USDZExporter.ts +477 -477
- package/src/engine-components/export/usdz/extensions/Animation.ts +774 -774
- package/src/engine-components/export/usdz/extensions/DocumentExtension.ts +9 -9
- package/src/engine-components/export/usdz/extensions/USDZText.ts +287 -287
- package/src/engine-components/export/usdz/extensions/USDZUI.ts +119 -119
- package/src/engine-components/export/usdz/extensions/behavior/Actions.ts +98 -98
- package/src/engine-components/export/usdz/extensions/behavior/AudioExtension.ts +67 -67
- package/src/engine-components/export/usdz/extensions/behavior/Behaviour.ts +202 -202
- package/src/engine-components/export/usdz/extensions/behavior/BehaviourComponents.ts +963 -963
- package/src/engine-components/export/usdz/extensions/behavior/BehavioursBuilder.ts +517 -517
- package/src/engine-components/export/usdz/index.ts +2 -2
- package/src/engine-components/export/usdz/utils/animationutils.ts +100 -100
- package/src/engine-components/export/usdz/utils/quicklook.ts +42 -42
- package/src/engine-components/export/usdz/utils/timeutils.ts +19 -19
- package/src/engine-components/js-extensions/ExtensionUtils.ts +81 -81
- package/src/engine-components/js-extensions/Object3D.ts +181 -181
- package/src/engine-components/js-extensions/RGBAColor.ts +54 -54
- package/src/engine-components/js-extensions/Vector.ts +16 -16
- package/src/engine-components/js-extensions/index.ts +2 -2
- package/src/engine-components/postprocessing/Effects/Antialiasing.ts +51 -51
- package/src/engine-components/postprocessing/Effects/Bloom.ts +76 -76
- package/src/engine-components/postprocessing/Effects/ChromaticAberration.ts +35 -35
- package/src/engine-components/postprocessing/Effects/ColorAdjustments.ts +96 -96
- package/src/engine-components/postprocessing/Effects/DepthOfField.ts +93 -93
- package/src/engine-components/postprocessing/Effects/Pixelation.ts +26 -26
- package/src/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusion.ts +84 -84
- package/src/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.ts +98 -98
- package/src/engine-components/postprocessing/Effects/TiltShiftEffect.ts +55 -55
- package/src/engine-components/postprocessing/Effects/Tonemapping.ts +54 -54
- package/src/engine-components/postprocessing/Effects/Vignette.ts +54 -54
- package/src/engine-components/postprocessing/PostProcessingEffect.ts +148 -148
- package/src/engine-components/postprocessing/PostProcessingHandler.ts +232 -232
- package/src/engine-components/postprocessing/Volume.ts +216 -216
- package/src/engine-components/postprocessing/VolumeParameter.ts +92 -92
- package/src/engine-components/postprocessing/VolumeProfile.ts +40 -40
- package/src/engine-components/postprocessing/index.ts +3 -3
- package/src/engine-components/timeline/PlayableDirector.ts +666 -666
- package/src/engine-components/timeline/SignalAsset.ts +138 -138
- package/src/engine-components/timeline/TimelineModels.ts +93 -93
- package/src/engine-components/timeline/TimelineTracks.ts +906 -906
- package/src/engine-components/timeline/index.ts +3 -3
- package/src/engine-components/ui/BaseUIComponent.ts +195 -195
- package/src/engine-components/ui/Button.ts +283 -283
- package/src/engine-components/ui/Canvas.ts +390 -390
- package/src/engine-components/ui/CanvasGroup.ts +49 -49
- package/src/engine-components/ui/EventSystem.ts +736 -736
- package/src/engine-components/ui/Graphic.ts +255 -255
- package/src/engine-components/ui/Image.ts +102 -102
- package/src/engine-components/ui/InputField.ts +290 -290
- package/src/engine-components/ui/Interfaces.ts +57 -57
- package/src/engine-components/ui/Layout.ts +322 -322
- package/src/engine-components/ui/Outline.ts +12 -12
- package/src/engine-components/ui/PointerEvents.ts +118 -118
- package/src/engine-components/ui/RaycastUtils.ts +68 -68
- package/src/engine-components/ui/Raycaster.ts +73 -73
- package/src/engine-components/ui/RectTransform.ts +364 -364
- package/src/engine-components/ui/SpatialHtml.ts +63 -63
- package/src/engine-components/ui/Text.ts +572 -572
- package/src/engine-components/ui/Utils.ts +110 -110
- package/src/engine-components/utils/LookAt.ts +65 -65
- package/src/engine-components/utils/OpenURL.ts +118 -118
- package/src/engine-components/webxr/WebARCameraBackground.ts +224 -224
- package/src/engine-components/webxr/WebARSessionRoot.ts +446 -446
- package/src/engine-components/webxr/WebXR.ts +761 -761
- package/src/engine-components/webxr/WebXRAvatar.ts +356 -356
- package/src/engine-components/webxr/WebXRController.ts +1168 -1168
- package/src/engine-components/webxr/WebXRGrabRendering.ts +150 -150
- package/src/engine-components/webxr/WebXRImageTracking.ts +371 -371
- package/src/engine-components/webxr/WebXRPlaneTracking.ts +429 -429
- package/src/engine-components/webxr/WebXRRig.ts +21 -21
- package/src/engine-components/webxr/WebXRSync.ts +463 -463
- package/src/engine-components/webxr/index.ts +3 -3
- package/src/engine-components-experimental/Presentation.ts +12 -12
- package/src/engine-components-experimental/networking/PlayerSync.ts +217 -217
- package/src/engine-schemes/COMPILE_SCHEMES.bat +3 -3
- package/src/engine-schemes/COMPILE_TS.bat +11 -11
- package/src/engine-schemes/schemes.ts +27 -27
- 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 +138 -138
- package/src/engine-schemes/vrUserStateBuffer.fbs +16 -16
- package/src/include/draco/draco_decoder.js +34 -34
- package/src/include/draco/draco_wasm_wrapper.js +117 -117
- package/src/include/ktx2/basis_transcoder.js +21 -21
- package/src/include/needle/arial-msdf.json +1471 -1471
- package/src/include/three/ARButton.js +231 -231
- package/src/include/three/DragControls.js +231 -231
- package/src/include/three/EXT_mesh_gpu_instancing_exporter.js +66 -66
- package/src/include/three/VRButton.js +194 -194
- package/src/needle-engine.ts +55 -55
- package/src/engine/dist/api.js +0 -73
- package/src/engine/dist/api.js.meta +0 -7
- package/src/engine/dist/engine_networking_streams.js +0 -474
- package/src/engine/dist/engine_networking_streams.js.meta +0 -7
- 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
- package/src/engine-schemes/flatc.exe +0 -0
|
@@ -1,642 +1,642 @@
|
|
|
1
|
-
import { RaycastOptions } from "../../engine/engine_physics.js";
|
|
2
|
-
import { Behaviour, GameObject } from "../Component.js";
|
|
3
|
-
import { ControllerEvents, WebXRController } from "../webxr/WebXRController.js";
|
|
4
|
-
import { Context } from "../../engine/engine_setup.js";
|
|
5
|
-
import { PointerEventData, hasPointerEventComponent } from "./PointerEvents.js";
|
|
6
|
-
import { ObjectRaycaster, Raycaster } from "./Raycaster.js";
|
|
7
|
-
import { InputEvents, PointerType } from "../../engine/engine_input.js";
|
|
8
|
-
import { Object3D } from "three";
|
|
9
|
-
import { getParam } from "../../engine/engine_utils.js";
|
|
10
|
-
import { UIRaycastUtils } from "./RaycastUtils.js";
|
|
11
|
-
import { $shadowDomOwner } from "./BaseUIComponent.js";
|
|
12
|
-
import { isDevEnvironment, showBalloonMessage } from "../../engine/debug/index.js";
|
|
13
|
-
import { Mathf } from "../../engine/engine_math.js";
|
|
14
|
-
import { isUIObject } from "./Utils.js";
|
|
15
|
-
const debug = getParam("debugeventsystem");
|
|
16
|
-
export var EventSystemEvents;
|
|
17
|
-
(function (EventSystemEvents) {
|
|
18
|
-
EventSystemEvents["BeforeHandleInput"] = "BeforeHandleInput";
|
|
19
|
-
EventSystemEvents["AfterHandleInput"] = "AfterHandleInput";
|
|
20
|
-
})(EventSystemEvents || (EventSystemEvents = {}));
|
|
21
|
-
export class EventSystem extends Behaviour {
|
|
22
|
-
static _eventSystemMap = new Map();
|
|
23
|
-
static didSearchEventSystem = false;
|
|
24
|
-
static createIfNoneExists(context) {
|
|
25
|
-
if (!this.didSearchEventSystem) {
|
|
26
|
-
this.didSearchEventSystem = true;
|
|
27
|
-
if (EventSystem.systems.length <= 0) {
|
|
28
|
-
EventSystem.systems.push(...GameObject.findObjectsOfType(EventSystem, context));
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
for (const sys of EventSystem.systems) {
|
|
32
|
-
if (sys.context === context)
|
|
33
|
-
return; // exists
|
|
34
|
-
}
|
|
35
|
-
const go = new Object3D();
|
|
36
|
-
GameObject.addNewComponent(go, EventSystem);
|
|
37
|
-
context.scene.add(go);
|
|
38
|
-
}
|
|
39
|
-
static get systems() {
|
|
40
|
-
const context = Context.Current;
|
|
41
|
-
if (!this._eventSystemMap.has(context)) {
|
|
42
|
-
this._eventSystemMap.set(context, []);
|
|
43
|
-
}
|
|
44
|
-
return this._eventSystemMap.get(context);
|
|
45
|
-
}
|
|
46
|
-
static get(ctx) {
|
|
47
|
-
const systems = this._eventSystemMap.get(ctx);
|
|
48
|
-
if (systems && systems.length > 0)
|
|
49
|
-
return systems[0];
|
|
50
|
-
return null;
|
|
51
|
-
}
|
|
52
|
-
static get instance() {
|
|
53
|
-
return this.systems[0];
|
|
54
|
-
}
|
|
55
|
-
//@ts-ignore
|
|
56
|
-
static ensureUpdateMeshUI(instance, context, force = false) {
|
|
57
|
-
MeshUIHelper.update(instance, context, force);
|
|
58
|
-
}
|
|
59
|
-
static markUIDirty(_context) {
|
|
60
|
-
MeshUIHelper.markDirty();
|
|
61
|
-
}
|
|
62
|
-
raycaster = [];
|
|
63
|
-
constructor() {
|
|
64
|
-
super();
|
|
65
|
-
EventSystem.systems.push(this);
|
|
66
|
-
}
|
|
67
|
-
get hasActiveUI() { return this.currentActiveMeshUIComponents.length > 0; }
|
|
68
|
-
get isHoveringObjects() { return this.hoveredByID.size > 0; }
|
|
69
|
-
onDestroy() {
|
|
70
|
-
EventSystem.systems.splice(EventSystem.systems.indexOf(this), 1);
|
|
71
|
-
}
|
|
72
|
-
start() {
|
|
73
|
-
if (this.raycaster.length <= 0) {
|
|
74
|
-
const res = GameObject.findObjectOfType(Raycaster, this.context);
|
|
75
|
-
if (!res) {
|
|
76
|
-
const rc = GameObject.addNewComponent(this.context.scene, ObjectRaycaster);
|
|
77
|
-
rc.ignoreSkinnedMeshes = true;
|
|
78
|
-
this.raycaster.push(rc);
|
|
79
|
-
if (isDevEnvironment() || debug)
|
|
80
|
-
console.warn("Added an ObjectRaycaster to the scene because no raycaster was found. Skinnedmeshes will be ignored for better performance");
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
register(rc) {
|
|
85
|
-
if (rc && this.raycaster && !this.raycaster.includes(rc))
|
|
86
|
-
this.raycaster?.push(rc);
|
|
87
|
-
}
|
|
88
|
-
unregister(rc) {
|
|
89
|
-
const i = this.raycaster?.indexOf(rc);
|
|
90
|
-
if (i !== undefined && i !== -1) {
|
|
91
|
-
this.raycaster?.splice(i, 1);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
_selectStartFn;
|
|
95
|
-
_selectEndFn;
|
|
96
|
-
_selectUpdateFn;
|
|
97
|
-
_handleEventCycleFn;
|
|
98
|
-
_handleInputFn;
|
|
99
|
-
onEnable() {
|
|
100
|
-
const grabbed = new Map();
|
|
101
|
-
this._selectStartFn ??= (ctrl, args) => {
|
|
102
|
-
if (!args.grab)
|
|
103
|
-
return;
|
|
104
|
-
MeshUIHelper.resetLastSelected();
|
|
105
|
-
const opts = new PointerEventData(this.context.input);
|
|
106
|
-
opts.inputSource = ctrl;
|
|
107
|
-
opts.pointerId = 0;
|
|
108
|
-
opts.isDown = ctrl.selectionDown;
|
|
109
|
-
opts.isUp = ctrl.selectionUp;
|
|
110
|
-
opts.isPressed = ctrl.selectionPressed;
|
|
111
|
-
opts.isClicked = false;
|
|
112
|
-
grabbed.set(ctrl, args.grab);
|
|
113
|
-
if (args.grab && !this.handleEventOnObject(args.grab, opts)) {
|
|
114
|
-
args.grab = null;
|
|
115
|
-
}
|
|
116
|
-
;
|
|
117
|
-
};
|
|
118
|
-
this._selectEndFn ??= (ctrl, args) => {
|
|
119
|
-
if (!args.grab)
|
|
120
|
-
return;
|
|
121
|
-
const opts = new PointerEventData(this.context.input);
|
|
122
|
-
opts.inputSource = ctrl;
|
|
123
|
-
opts.pointerId = 0;
|
|
124
|
-
opts.isDown = ctrl.selectionDown;
|
|
125
|
-
opts.isUp = ctrl.selectionUp;
|
|
126
|
-
opts.isPressed = ctrl.selectionPressed;
|
|
127
|
-
opts.isClicked = ctrl.selectionClick;
|
|
128
|
-
this.handleEventOnObject(args.grab, opts);
|
|
129
|
-
const prevGrabbed = grabbed.get(ctrl);
|
|
130
|
-
grabbed.set(ctrl, null);
|
|
131
|
-
if (prevGrabbed) {
|
|
132
|
-
for (const key of this.pressedByID.keys()) {
|
|
133
|
-
const e = this.pressedByID[key];
|
|
134
|
-
if (e && e.obj === prevGrabbed && e.handler) {
|
|
135
|
-
e.handler.onPointerUp?.call(e.handler, opts);
|
|
136
|
-
this.pressedByID.delete(key);
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
};
|
|
141
|
-
const controllerRcOpts = new RaycastOptions();
|
|
142
|
-
this._selectUpdateFn ??= (_ctrl) => {
|
|
143
|
-
controllerRcOpts.ray = _ctrl.getRay();
|
|
144
|
-
const rc = this.performRaycast(controllerRcOpts) ?? [];
|
|
145
|
-
const opts = new PointerEventData(this.context.input);
|
|
146
|
-
opts.inputSource = _ctrl;
|
|
147
|
-
opts.pointerId = _ctrl.input?.handedness === "right" ? 0 : 1;
|
|
148
|
-
opts.isDown = _ctrl.selectionDown;
|
|
149
|
-
opts.isUp = _ctrl.selectionUp;
|
|
150
|
-
opts.isPressed = _ctrl.selectionPressed;
|
|
151
|
-
opts.isClicked = false;
|
|
152
|
-
this.handleIntersections(opts.pointerId, rc, opts);
|
|
153
|
-
};
|
|
154
|
-
WebXRController.addEventListener(ControllerEvents.SelectStart, this._selectStartFn);
|
|
155
|
-
WebXRController.addEventListener(ControllerEvents.SelectEnd, this._selectEndFn);
|
|
156
|
-
WebXRController.addEventListener(ControllerEvents.Update, this._selectUpdateFn);
|
|
157
|
-
this._handleInputFn = this.onPointerEvent.bind(this);
|
|
158
|
-
this.context.input.addEventListener(InputEvents.PointerDown, this._handleInputFn);
|
|
159
|
-
this.context.input.addEventListener(InputEvents.PointerUp, this._handleInputFn);
|
|
160
|
-
this.context.input.addEventListener(InputEvents.PointerMove, this._handleInputFn);
|
|
161
|
-
}
|
|
162
|
-
onDisable() {
|
|
163
|
-
WebXRController.removeEventListener(ControllerEvents.SelectStart, this._selectStartFn);
|
|
164
|
-
WebXRController.removeEventListener(ControllerEvents.SelectEnd, this._selectEndFn);
|
|
165
|
-
WebXRController.removeEventListener(ControllerEvents.Update, this._selectUpdateFn);
|
|
166
|
-
this.context.input.removeEventListener(InputEvents.PointerDown, this._handleInputFn);
|
|
167
|
-
this.context.input.removeEventListener(InputEvents.PointerUp, this._handleInputFn);
|
|
168
|
-
this.context.input.removeEventListener(InputEvents.PointerMove, this._handleInputFn);
|
|
169
|
-
}
|
|
170
|
-
/**
|
|
171
|
-
* all pointers that have pressed something
|
|
172
|
-
*
|
|
173
|
-
* key: pointerId
|
|
174
|
-
* value: object that was pressed, data of the pointer event, handlers that are releavant to the event
|
|
175
|
-
*/
|
|
176
|
-
pressedByID = new Map();
|
|
177
|
-
/**
|
|
178
|
-
* all hovered objects
|
|
179
|
-
*
|
|
180
|
-
* key: pointerId
|
|
181
|
-
* value: object that is hovered, data of the pointer event
|
|
182
|
-
*/
|
|
183
|
-
hoveredByID = new Map();
|
|
184
|
-
onBeforeRender() {
|
|
185
|
-
this.resetMeshUIStates();
|
|
186
|
-
}
|
|
187
|
-
/**
|
|
188
|
-
* Handle an pointer event from the input system
|
|
189
|
-
*/
|
|
190
|
-
onPointerEvent(pointerEvent) {
|
|
191
|
-
if (pointerEvent === undefined)
|
|
192
|
-
return;
|
|
193
|
-
// On mouse input has to be always 0 regardless of the button user pressed
|
|
194
|
-
// because otherwise it would be taken as 3 unique pointers and create OnEnter and OnExit events which is not expected
|
|
195
|
-
const id = pointerEvent.pointerType == PointerType.Touch ? pointerEvent.button : 0;
|
|
196
|
-
const data = new PointerEventData(this.context.input, pointerEvent);
|
|
197
|
-
data.inputSource = this.context.input;
|
|
198
|
-
data.pointerId = pointerEvent.button;
|
|
199
|
-
data.isClicked = pointerEvent.type == InputEvents.PointerUp && this.context.input.getPointerClicked(pointerEvent.button);
|
|
200
|
-
// using the input type directly instead of input API -> otherwise onMove events can sometimes be getPointerUp() == true
|
|
201
|
-
data.isDown = pointerEvent.type == InputEvents.PointerDown;
|
|
202
|
-
data.isUp = pointerEvent.type == InputEvents.PointerUp;
|
|
203
|
-
data.isPressed = this.context.input.getPointerPressed(pointerEvent.button);
|
|
204
|
-
if (debug && data.isClicked)
|
|
205
|
-
console.log("CLICK", data.pointerId);
|
|
206
|
-
// raycast
|
|
207
|
-
const options = new RaycastOptions();
|
|
208
|
-
options.screenPoint = this.context.input.getPointerPositionRC(id);
|
|
209
|
-
const hits = this.performRaycast(options);
|
|
210
|
-
if (!hits)
|
|
211
|
-
return;
|
|
212
|
-
if (debug && data.isClicked) {
|
|
213
|
-
showBalloonMessage("EventSystem: " + data.pointerId + " - " + this.context.time.frame + " - Up:" + data.isUp + ", Down:" + data.isDown);
|
|
214
|
-
}
|
|
215
|
-
const evt = {
|
|
216
|
-
sender: this,
|
|
217
|
-
args: data,
|
|
218
|
-
hasActiveUI: this.currentActiveMeshUIComponents.length > 0,
|
|
219
|
-
};
|
|
220
|
-
this.dispatchEvent(new CustomEvent(EventSystemEvents.BeforeHandleInput, { detail: evt }));
|
|
221
|
-
// handle hit objects
|
|
222
|
-
this.handleIntersections(id, hits, data);
|
|
223
|
-
this.dispatchEvent(new CustomEvent(EventSystemEvents.AfterHandleInput, { detail: evt }));
|
|
224
|
-
}
|
|
225
|
-
_sortedHits = [];
|
|
226
|
-
/**
|
|
227
|
-
* cache for objects that we want to raycast against. It's cleared before each call to performRaycast invoking raycasters
|
|
228
|
-
*/
|
|
229
|
-
_testObjectsCache = new Map();
|
|
230
|
-
/**
|
|
231
|
-
* Checks if an object that we encounter has an event component and if it does, we add it to our objects cache
|
|
232
|
-
* If it doesnt we tell our raycasting system to ignore it and continue in the child hierarchy
|
|
233
|
-
* We do this to avoid raycasts against objects that are not going to be used by the event system
|
|
234
|
-
* Because there's no component callback to be invoked anyways.
|
|
235
|
-
* This is especially important to avoid expensive raycasts against SkinnedMeshes
|
|
236
|
-
*
|
|
237
|
-
* Further optimizations would be to check what type of event we're dealing with
|
|
238
|
-
* For example if an event component has only an onPointerClick method we don't need to raycast during movement events
|
|
239
|
-
* */
|
|
240
|
-
shouldRaycastObject = (obj) => {
|
|
241
|
-
// check if this object is actually a UI shadow hierarchy object
|
|
242
|
-
let shadowComponent = null;
|
|
243
|
-
const isUI = isUIObject(obj);
|
|
244
|
-
// if yes we want to grab the actual object that is the owner of the shadow dom
|
|
245
|
-
// and check that object for the event component
|
|
246
|
-
if (isUI) {
|
|
247
|
-
shadowComponent = obj[$shadowDomOwner]?.gameObject;
|
|
248
|
-
}
|
|
249
|
-
// check if the object was seen previously
|
|
250
|
-
if (this._testObjectsCache.has(obj) || (shadowComponent && this._testObjectsCache.has(shadowComponent))) {
|
|
251
|
-
// if yes we check if it was previously stored as "YES WE NEED TO RAYCAST THIS"
|
|
252
|
-
const prev = this._testObjectsCache.get(obj);
|
|
253
|
-
if (prev === false)
|
|
254
|
-
return "continue in children";
|
|
255
|
-
return true;
|
|
256
|
-
}
|
|
257
|
-
else {
|
|
258
|
-
// the object was not yet seen so we test if it has an event component
|
|
259
|
-
let hasEventComponent = hasPointerEventComponent(obj);
|
|
260
|
-
if (!hasEventComponent && shadowComponent)
|
|
261
|
-
hasEventComponent = hasPointerEventComponent(shadowComponent);
|
|
262
|
-
if (hasEventComponent) {
|
|
263
|
-
// it has an event component: we add it and all its children to the cache
|
|
264
|
-
// we don't need to do the same for the shadow component hierarchy
|
|
265
|
-
// because the next object that will be detecting that the shadow owner was already seen
|
|
266
|
-
this._testObjectsCache.set(obj, true);
|
|
267
|
-
obj.traverse((o) => {
|
|
268
|
-
this._testObjectsCache.set(o, true);
|
|
269
|
-
});
|
|
270
|
-
return true;
|
|
271
|
-
}
|
|
272
|
-
this._testObjectsCache.set(obj, false);
|
|
273
|
-
return "continue in children";
|
|
274
|
-
}
|
|
275
|
-
};
|
|
276
|
-
/** the raycast filter is always overriden */
|
|
277
|
-
performRaycast(opts) {
|
|
278
|
-
if (!this.raycaster)
|
|
279
|
-
return null;
|
|
280
|
-
this._sortedHits.length = 0;
|
|
281
|
-
if (!opts)
|
|
282
|
-
opts = new RaycastOptions();
|
|
283
|
-
// we clear the cache of previously seen objects
|
|
284
|
-
this._testObjectsCache.clear();
|
|
285
|
-
opts.testObject = this.shouldRaycastObject;
|
|
286
|
-
for (const rc of this.raycaster) {
|
|
287
|
-
if (!rc.activeAndEnabled)
|
|
288
|
-
continue;
|
|
289
|
-
const res = rc.performRaycast(opts);
|
|
290
|
-
if (res && res.length > 0) {
|
|
291
|
-
// console.log(res.length, res.map(r => r.object.name));
|
|
292
|
-
this._sortedHits.push(...res);
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
this._sortedHits.sort((a, b) => {
|
|
296
|
-
return a.distance - b.distance;
|
|
297
|
-
});
|
|
298
|
-
return this._sortedHits;
|
|
299
|
-
}
|
|
300
|
-
handleIntersections(id, hits, args) {
|
|
301
|
-
if (hits?.length) {
|
|
302
|
-
hits = this.sortCandidates(hits);
|
|
303
|
-
for (const hit of hits) {
|
|
304
|
-
const { object } = hit;
|
|
305
|
-
args.point = hit.point;
|
|
306
|
-
args.normal = hit.normal;
|
|
307
|
-
args.face = hit.face;
|
|
308
|
-
args.distance = hit.distance;
|
|
309
|
-
args.instanceId = hit.instanceId;
|
|
310
|
-
if (this.handleEventOnObject(object, args)) {
|
|
311
|
-
return true;
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
// pointer has not hit any object to handle
|
|
316
|
-
// thus is not hovering over anything
|
|
317
|
-
const hoveredData = this.hoveredByID.get(id);
|
|
318
|
-
if (hoveredData) {
|
|
319
|
-
this.triggerOnExit(hoveredData.obj, hoveredData.data);
|
|
320
|
-
}
|
|
321
|
-
this.hoveredByID.delete(id);
|
|
322
|
-
// if it was up, it means it doesn't should notify things that it down on before
|
|
323
|
-
if (args.isUp) {
|
|
324
|
-
const pressedData = this.pressedByID.get(id);
|
|
325
|
-
pressedData?.handlers.forEach(h => h.onPointerUp?.call(h, args));
|
|
326
|
-
this.pressedByID.delete(id);
|
|
327
|
-
}
|
|
328
|
-
return false;
|
|
329
|
-
}
|
|
330
|
-
_sortingBuffer = [];
|
|
331
|
-
_noDepthTestingResults = [];
|
|
332
|
-
sortCandidates(hits) {
|
|
333
|
-
// iterate over all hits and filter for nodepth objects and normal hit objects
|
|
334
|
-
// the no-depth objects will be handled first starting from the closest
|
|
335
|
-
// assuming the hits array is sorted by distance (closest > furthest)
|
|
336
|
-
this._sortingBuffer.length = 0;
|
|
337
|
-
this._noDepthTestingResults.length = 0;
|
|
338
|
-
for (let i = 0; i < hits.length; i++) {
|
|
339
|
-
const hit = hits[i];
|
|
340
|
-
const object = hit.object;
|
|
341
|
-
if (object.material) {
|
|
342
|
-
if (object.material["depthTest"] === false) {
|
|
343
|
-
this._noDepthTestingResults.push(hit);
|
|
344
|
-
continue;
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
this._sortingBuffer.push(hit);
|
|
348
|
-
}
|
|
349
|
-
for (const obj of this._sortingBuffer) {
|
|
350
|
-
this._noDepthTestingResults.push(obj);
|
|
351
|
-
}
|
|
352
|
-
return this._noDepthTestingResults;
|
|
353
|
-
}
|
|
354
|
-
out = {};
|
|
355
|
-
/**
|
|
356
|
-
* Handle hit result by preparing all needed information before propagation.
|
|
357
|
-
* Then calling propagate.
|
|
358
|
-
*/
|
|
359
|
-
handleEventOnObject(object, args) {
|
|
360
|
-
// ensures that invisible objects are ignored
|
|
361
|
-
if (!this.testIsVisible(object)) {
|
|
362
|
-
if (args.isClicked && debug)
|
|
363
|
-
console.log("not allowed", object);
|
|
364
|
-
return false;
|
|
365
|
-
}
|
|
366
|
-
// Event without pointer can't be handled
|
|
367
|
-
if (args.pointerId === undefined) {
|
|
368
|
-
if (debug)
|
|
369
|
-
console.warn("Event without pointer can't be handled", args);
|
|
370
|
-
return false;
|
|
371
|
-
}
|
|
372
|
-
// We want to call all event methods even if the event was used
|
|
373
|
-
// Used event can't be handled
|
|
374
|
-
// if (args.used) return false;
|
|
375
|
-
// Correct the handled object to match the relevant object in shadow dom (?)
|
|
376
|
-
const originalObject = object;
|
|
377
|
-
args.object = object;
|
|
378
|
-
const parent = object.parent;
|
|
379
|
-
let isShadow = false;
|
|
380
|
-
const clicked = args.isClicked ?? false;
|
|
381
|
-
let canvasGroup = null;
|
|
382
|
-
// handle potential shadow dom built from three mesh ui
|
|
383
|
-
if (parent && parent.isUI) {
|
|
384
|
-
const pressedOrClicked = (args.isPressed || args.isClicked) ?? false;
|
|
385
|
-
if (parent[$shadowDomOwner]) {
|
|
386
|
-
const actualGo = parent[$shadowDomOwner].gameObject;
|
|
387
|
-
if (actualGo) {
|
|
388
|
-
const res = UIRaycastUtils.isInteractable(actualGo, this.out);
|
|
389
|
-
if (!res)
|
|
390
|
-
return false;
|
|
391
|
-
canvasGroup = this.out.canvasGroup ?? null;
|
|
392
|
-
const handled = this.handleMeshUIIntersection(object, pressedOrClicked);
|
|
393
|
-
if (!clicked && handled) {
|
|
394
|
-
// return true;
|
|
395
|
-
}
|
|
396
|
-
object = actualGo;
|
|
397
|
-
isShadow = true;
|
|
398
|
-
}
|
|
399
|
-
}
|
|
400
|
-
if (!isShadow) {
|
|
401
|
-
const obj = this.handleMeshUiObjectWithoutShadowDom(parent, pressedOrClicked);
|
|
402
|
-
if (obj)
|
|
403
|
-
return true;
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
if (clicked && debug)
|
|
407
|
-
console.log(this.context.time.frame, object);
|
|
408
|
-
// Handle OnPointerExit -> in case when we are about to hover something new
|
|
409
|
-
// 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)
|
|
410
|
-
const hovering = this.hoveredByID.get(args.pointerId);
|
|
411
|
-
const isNewlyHovering = hovering?.obj !== object;
|
|
412
|
-
// trigger onPointerExit
|
|
413
|
-
if (isNewlyHovering && hovering?.obj) {
|
|
414
|
-
this.triggerOnExit(hovering.obj, hovering.data);
|
|
415
|
-
}
|
|
416
|
-
// save hovered object
|
|
417
|
-
const entry = this.hoveredByID.get(args.pointerId);
|
|
418
|
-
if (!entry)
|
|
419
|
-
this.hoveredByID.set(args.pointerId, { obj: object, data: args });
|
|
420
|
-
else {
|
|
421
|
-
entry.obj = object;
|
|
422
|
-
entry.data = args;
|
|
423
|
-
}
|
|
424
|
-
// create / update pressed entry
|
|
425
|
-
if (args.isDown) {
|
|
426
|
-
const data = this.pressedByID.get(args.pointerId);
|
|
427
|
-
if (!data)
|
|
428
|
-
this.pressedByID.set(args.pointerId, { obj: object, data: args, handlers: new Set() });
|
|
429
|
-
else {
|
|
430
|
-
data.obj = object;
|
|
431
|
-
data.data = args;
|
|
432
|
-
}
|
|
433
|
-
}
|
|
434
|
-
if (canvasGroup === null || canvasGroup.interactable) {
|
|
435
|
-
this.handleMainInteraction(object, args, isNewlyHovering);
|
|
436
|
-
}
|
|
437
|
-
return true;
|
|
438
|
-
}
|
|
439
|
-
/**
|
|
440
|
-
* Propagate up in hiearchy and call the callback for each component that is possibly a handler
|
|
441
|
-
*/
|
|
442
|
-
propagate(object, _args, onComponent) {
|
|
443
|
-
while (true) {
|
|
444
|
-
// Propagate up the hierarchy
|
|
445
|
-
if (_args.used)
|
|
446
|
-
return;
|
|
447
|
-
GameObject.foreachComponent(object, comp => {
|
|
448
|
-
// TODO: implement Stop Immediate Propagation
|
|
449
|
-
onComponent(comp);
|
|
450
|
-
// return undefined to continue iterating
|
|
451
|
-
return undefined;
|
|
452
|
-
}, false);
|
|
453
|
-
if (!object.parent)
|
|
454
|
-
break;
|
|
455
|
-
// walk up
|
|
456
|
-
object = object.parent;
|
|
457
|
-
}
|
|
458
|
-
}
|
|
459
|
-
/**
|
|
460
|
-
* Propagate up in hiearchy and call handlers based on the pointer event data
|
|
461
|
-
*/
|
|
462
|
-
handleMainInteraction(object, args, isNewlyHovering) {
|
|
463
|
-
if (args.pointerId === undefined)
|
|
464
|
-
return;
|
|
465
|
-
const pressedEvent = this.pressedByID.get(args.pointerId);
|
|
466
|
-
this.propagate(object, args, (behaviour) => {
|
|
467
|
-
const comp = behaviour;
|
|
468
|
-
if (comp.interactable === false)
|
|
469
|
-
return;
|
|
470
|
-
if (comp.onPointerEnter) {
|
|
471
|
-
if (isNewlyHovering) {
|
|
472
|
-
comp.onPointerEnter(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
|
-
}
|
|
483
|
-
}
|
|
484
|
-
const posLastFrame = this.context.input.getPointerPositionLastFrame(args.pointerId);
|
|
485
|
-
const posThisFrame = this.context.input.getPointerPosition(args.pointerId);
|
|
486
|
-
const isMoving = posLastFrame && !Mathf.approximately(posLastFrame, posThisFrame);
|
|
487
|
-
if (isMoving && comp.onPointerMove) {
|
|
488
|
-
comp.onPointerMove(args);
|
|
489
|
-
}
|
|
490
|
-
if (args.isUp) {
|
|
491
|
-
if (comp.onPointerUp) {
|
|
492
|
-
comp.onPointerUp(args);
|
|
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 onExit on touchUp
|
|
500
|
-
// onExit on mouse is handled when we hover over something else / on nothing
|
|
501
|
-
if (comp.onPointerExit && args.event?.pointerType === PointerType.Touch) {
|
|
502
|
-
comp.onPointerExit(args);
|
|
503
|
-
this.hoveredByID.delete(args.pointerId);
|
|
504
|
-
}
|
|
505
|
-
}
|
|
506
|
-
if (args.isClicked) {
|
|
507
|
-
if (comp.onPointerClick) {
|
|
508
|
-
comp.onPointerClick(args);
|
|
509
|
-
}
|
|
510
|
-
}
|
|
511
|
-
});
|
|
512
|
-
// after the propagation end, call UP on any objects that were DOWNED and didn't recieve an UP while propagating
|
|
513
|
-
// If user drags away from the object, then it doesn't get the UP event
|
|
514
|
-
if (args.isUp) {
|
|
515
|
-
pressedEvent?.handlers.forEach((handler) => {
|
|
516
|
-
if (handler.onPointerUp) {
|
|
517
|
-
handler.onPointerUp(args);
|
|
518
|
-
}
|
|
519
|
-
});
|
|
520
|
-
this.pressedByID.delete(args.pointerId);
|
|
521
|
-
}
|
|
522
|
-
}
|
|
523
|
-
/**
|
|
524
|
-
* Propagate up in hiearchy and call OnExit regardless of the pointer event data
|
|
525
|
-
*/
|
|
526
|
-
triggerOnExit(object, args) {
|
|
527
|
-
args.used = false;
|
|
528
|
-
this.propagate(object, args, (behaviour) => {
|
|
529
|
-
if (!behaviour.gameObject || behaviour.destroyed)
|
|
530
|
-
return;
|
|
531
|
-
const inst = behaviour;
|
|
532
|
-
if (inst.onPointerExit) {
|
|
533
|
-
inst.onPointerExit(args);
|
|
534
|
-
}
|
|
535
|
-
});
|
|
536
|
-
}
|
|
537
|
-
handleMeshUiObjectWithoutShadowDom(obj, pressed) {
|
|
538
|
-
if (!obj || !obj.isUI)
|
|
539
|
-
return true;
|
|
540
|
-
const hit = this.handleMeshUIIntersection(obj, pressed);
|
|
541
|
-
return hit;
|
|
542
|
-
}
|
|
543
|
-
currentActiveMeshUIComponents = [];
|
|
544
|
-
handleMeshUIIntersection(meshUiObject, pressed) {
|
|
545
|
-
const res = MeshUIHelper.updateState(meshUiObject, pressed);
|
|
546
|
-
if (res) {
|
|
547
|
-
this.currentActiveMeshUIComponents.push(res);
|
|
548
|
-
}
|
|
549
|
-
return res !== null;
|
|
550
|
-
}
|
|
551
|
-
resetMeshUIStates() {
|
|
552
|
-
if (this.context.input.getPointerPressedCount() > 0) {
|
|
553
|
-
MeshUIHelper.resetLastSelected();
|
|
554
|
-
}
|
|
555
|
-
if (!this.currentActiveMeshUIComponents || this.currentActiveMeshUIComponents.length <= 0)
|
|
556
|
-
return;
|
|
557
|
-
for (let i = 0; i < this.currentActiveMeshUIComponents.length; i++) {
|
|
558
|
-
const comp = this.currentActiveMeshUIComponents[i];
|
|
559
|
-
MeshUIHelper.resetState(comp);
|
|
560
|
-
}
|
|
561
|
-
this.currentActiveMeshUIComponents.length = 0;
|
|
562
|
-
}
|
|
563
|
-
testIsVisible(obj) {
|
|
564
|
-
if (!obj)
|
|
565
|
-
return true;
|
|
566
|
-
if (!GameObject.isActiveSelf(obj))
|
|
567
|
-
return false;
|
|
568
|
-
return this.testIsVisible(obj.parent);
|
|
569
|
-
}
|
|
570
|
-
}
|
|
571
|
-
class MeshUIHelper {
|
|
572
|
-
static lastSelected = null;
|
|
573
|
-
static lastUpdateFrame = [];
|
|
574
|
-
static needsUpdate = false;
|
|
575
|
-
static markDirty() {
|
|
576
|
-
this.needsUpdate = true;
|
|
577
|
-
}
|
|
578
|
-
static update(threeMeshUI, context, force = false) {
|
|
579
|
-
if (force) {
|
|
580
|
-
threeMeshUI.update();
|
|
581
|
-
return;
|
|
582
|
-
}
|
|
583
|
-
const currentFrame = context.time.frameCount;
|
|
584
|
-
for (const lu of this.lastUpdateFrame) {
|
|
585
|
-
if (lu.context === context) {
|
|
586
|
-
if (currentFrame === lu.frame)
|
|
587
|
-
return;
|
|
588
|
-
lu.frame = currentFrame;
|
|
589
|
-
let shouldUpdate = this.needsUpdate || currentFrame < 1;
|
|
590
|
-
if (lu.nextUpdate === context.time.frameCount)
|
|
591
|
-
shouldUpdate = true;
|
|
592
|
-
// if (this.needsUpdate) lu.nextUpdate = currentFrame + 3;
|
|
593
|
-
if (shouldUpdate) {
|
|
594
|
-
if (debug)
|
|
595
|
-
console.log("Update threemeshui");
|
|
596
|
-
this.needsUpdate = false;
|
|
597
|
-
threeMeshUI.update();
|
|
598
|
-
}
|
|
599
|
-
return;
|
|
600
|
-
}
|
|
601
|
-
}
|
|
602
|
-
this.lastUpdateFrame = [{ context, frame: currentFrame, nextUpdate: currentFrame }];
|
|
603
|
-
threeMeshUI.update();
|
|
604
|
-
}
|
|
605
|
-
static updateState(intersect, _selectState) {
|
|
606
|
-
let foundBlock = null;
|
|
607
|
-
if (intersect) {
|
|
608
|
-
foundBlock = this.findBlockInParent(intersect);
|
|
609
|
-
// console.log(intersect, "-- found block:", foundBlock)
|
|
610
|
-
if (foundBlock && foundBlock !== this.lastSelected) {
|
|
611
|
-
const interactable = foundBlock["interactable"];
|
|
612
|
-
if (interactable === false)
|
|
613
|
-
return null;
|
|
614
|
-
this.needsUpdate = true;
|
|
615
|
-
}
|
|
616
|
-
}
|
|
617
|
-
return foundBlock;
|
|
618
|
-
}
|
|
619
|
-
static resetLastSelected() {
|
|
620
|
-
const last = this.lastSelected;
|
|
621
|
-
if (!last)
|
|
622
|
-
return;
|
|
623
|
-
this.lastSelected = null;
|
|
624
|
-
this.resetState(last);
|
|
625
|
-
}
|
|
626
|
-
static resetState(obj) {
|
|
627
|
-
if (!obj)
|
|
628
|
-
return;
|
|
629
|
-
this.needsUpdate = true;
|
|
630
|
-
}
|
|
631
|
-
static findBlockInParent(elem) {
|
|
632
|
-
if (!elem)
|
|
633
|
-
return null;
|
|
634
|
-
if (elem.isBlock) {
|
|
635
|
-
// @TODO : Replace states managements
|
|
636
|
-
// if (Object.keys(elem.states).length > 0)
|
|
637
|
-
return elem;
|
|
638
|
-
}
|
|
639
|
-
return this.findBlockInParent(elem.parent);
|
|
640
|
-
}
|
|
641
|
-
}
|
|
1
|
+
import { RaycastOptions } from "../../engine/engine_physics.js";
|
|
2
|
+
import { Behaviour, GameObject } from "../Component.js";
|
|
3
|
+
import { ControllerEvents, WebXRController } from "../webxr/WebXRController.js";
|
|
4
|
+
import { Context } from "../../engine/engine_setup.js";
|
|
5
|
+
import { PointerEventData, hasPointerEventComponent } from "./PointerEvents.js";
|
|
6
|
+
import { ObjectRaycaster, Raycaster } from "./Raycaster.js";
|
|
7
|
+
import { InputEvents, PointerType } from "../../engine/engine_input.js";
|
|
8
|
+
import { Object3D } from "three";
|
|
9
|
+
import { getParam } from "../../engine/engine_utils.js";
|
|
10
|
+
import { UIRaycastUtils } from "./RaycastUtils.js";
|
|
11
|
+
import { $shadowDomOwner } from "./BaseUIComponent.js";
|
|
12
|
+
import { isDevEnvironment, showBalloonMessage } from "../../engine/debug/index.js";
|
|
13
|
+
import { Mathf } from "../../engine/engine_math.js";
|
|
14
|
+
import { isUIObject } from "./Utils.js";
|
|
15
|
+
const debug = getParam("debugeventsystem");
|
|
16
|
+
export var EventSystemEvents;
|
|
17
|
+
(function (EventSystemEvents) {
|
|
18
|
+
EventSystemEvents["BeforeHandleInput"] = "BeforeHandleInput";
|
|
19
|
+
EventSystemEvents["AfterHandleInput"] = "AfterHandleInput";
|
|
20
|
+
})(EventSystemEvents || (EventSystemEvents = {}));
|
|
21
|
+
export class EventSystem extends Behaviour {
|
|
22
|
+
static _eventSystemMap = new Map();
|
|
23
|
+
static didSearchEventSystem = false;
|
|
24
|
+
static createIfNoneExists(context) {
|
|
25
|
+
if (!this.didSearchEventSystem) {
|
|
26
|
+
this.didSearchEventSystem = true;
|
|
27
|
+
if (EventSystem.systems.length <= 0) {
|
|
28
|
+
EventSystem.systems.push(...GameObject.findObjectsOfType(EventSystem, context));
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
for (const sys of EventSystem.systems) {
|
|
32
|
+
if (sys.context === context)
|
|
33
|
+
return; // exists
|
|
34
|
+
}
|
|
35
|
+
const go = new Object3D();
|
|
36
|
+
GameObject.addNewComponent(go, EventSystem);
|
|
37
|
+
context.scene.add(go);
|
|
38
|
+
}
|
|
39
|
+
static get systems() {
|
|
40
|
+
const context = Context.Current;
|
|
41
|
+
if (!this._eventSystemMap.has(context)) {
|
|
42
|
+
this._eventSystemMap.set(context, []);
|
|
43
|
+
}
|
|
44
|
+
return this._eventSystemMap.get(context);
|
|
45
|
+
}
|
|
46
|
+
static get(ctx) {
|
|
47
|
+
const systems = this._eventSystemMap.get(ctx);
|
|
48
|
+
if (systems && systems.length > 0)
|
|
49
|
+
return systems[0];
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
static get instance() {
|
|
53
|
+
return this.systems[0];
|
|
54
|
+
}
|
|
55
|
+
//@ts-ignore
|
|
56
|
+
static ensureUpdateMeshUI(instance, context, force = false) {
|
|
57
|
+
MeshUIHelper.update(instance, context, force);
|
|
58
|
+
}
|
|
59
|
+
static markUIDirty(_context) {
|
|
60
|
+
MeshUIHelper.markDirty();
|
|
61
|
+
}
|
|
62
|
+
raycaster = [];
|
|
63
|
+
constructor() {
|
|
64
|
+
super();
|
|
65
|
+
EventSystem.systems.push(this);
|
|
66
|
+
}
|
|
67
|
+
get hasActiveUI() { return this.currentActiveMeshUIComponents.length > 0; }
|
|
68
|
+
get isHoveringObjects() { return this.hoveredByID.size > 0; }
|
|
69
|
+
onDestroy() {
|
|
70
|
+
EventSystem.systems.splice(EventSystem.systems.indexOf(this), 1);
|
|
71
|
+
}
|
|
72
|
+
start() {
|
|
73
|
+
if (this.raycaster.length <= 0) {
|
|
74
|
+
const res = GameObject.findObjectOfType(Raycaster, this.context);
|
|
75
|
+
if (!res) {
|
|
76
|
+
const rc = GameObject.addNewComponent(this.context.scene, ObjectRaycaster);
|
|
77
|
+
rc.ignoreSkinnedMeshes = true;
|
|
78
|
+
this.raycaster.push(rc);
|
|
79
|
+
if (isDevEnvironment() || debug)
|
|
80
|
+
console.warn("Added an ObjectRaycaster to the scene because no raycaster was found. Skinnedmeshes will be ignored for better performance");
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
register(rc) {
|
|
85
|
+
if (rc && this.raycaster && !this.raycaster.includes(rc))
|
|
86
|
+
this.raycaster?.push(rc);
|
|
87
|
+
}
|
|
88
|
+
unregister(rc) {
|
|
89
|
+
const i = this.raycaster?.indexOf(rc);
|
|
90
|
+
if (i !== undefined && i !== -1) {
|
|
91
|
+
this.raycaster?.splice(i, 1);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
_selectStartFn;
|
|
95
|
+
_selectEndFn;
|
|
96
|
+
_selectUpdateFn;
|
|
97
|
+
_handleEventCycleFn;
|
|
98
|
+
_handleInputFn;
|
|
99
|
+
onEnable() {
|
|
100
|
+
const grabbed = new Map();
|
|
101
|
+
this._selectStartFn ??= (ctrl, args) => {
|
|
102
|
+
if (!args.grab)
|
|
103
|
+
return;
|
|
104
|
+
MeshUIHelper.resetLastSelected();
|
|
105
|
+
const opts = new PointerEventData(this.context.input);
|
|
106
|
+
opts.inputSource = ctrl;
|
|
107
|
+
opts.pointerId = 0;
|
|
108
|
+
opts.isDown = ctrl.selectionDown;
|
|
109
|
+
opts.isUp = ctrl.selectionUp;
|
|
110
|
+
opts.isPressed = ctrl.selectionPressed;
|
|
111
|
+
opts.isClicked = false;
|
|
112
|
+
grabbed.set(ctrl, args.grab);
|
|
113
|
+
if (args.grab && !this.handleEventOnObject(args.grab, opts)) {
|
|
114
|
+
args.grab = null;
|
|
115
|
+
}
|
|
116
|
+
;
|
|
117
|
+
};
|
|
118
|
+
this._selectEndFn ??= (ctrl, args) => {
|
|
119
|
+
if (!args.grab)
|
|
120
|
+
return;
|
|
121
|
+
const opts = new PointerEventData(this.context.input);
|
|
122
|
+
opts.inputSource = ctrl;
|
|
123
|
+
opts.pointerId = 0;
|
|
124
|
+
opts.isDown = ctrl.selectionDown;
|
|
125
|
+
opts.isUp = ctrl.selectionUp;
|
|
126
|
+
opts.isPressed = ctrl.selectionPressed;
|
|
127
|
+
opts.isClicked = ctrl.selectionClick;
|
|
128
|
+
this.handleEventOnObject(args.grab, opts);
|
|
129
|
+
const prevGrabbed = grabbed.get(ctrl);
|
|
130
|
+
grabbed.set(ctrl, null);
|
|
131
|
+
if (prevGrabbed) {
|
|
132
|
+
for (const key of this.pressedByID.keys()) {
|
|
133
|
+
const e = this.pressedByID[key];
|
|
134
|
+
if (e && e.obj === prevGrabbed && e.handler) {
|
|
135
|
+
e.handler.onPointerUp?.call(e.handler, opts);
|
|
136
|
+
this.pressedByID.delete(key);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
const controllerRcOpts = new RaycastOptions();
|
|
142
|
+
this._selectUpdateFn ??= (_ctrl) => {
|
|
143
|
+
controllerRcOpts.ray = _ctrl.getRay();
|
|
144
|
+
const rc = this.performRaycast(controllerRcOpts) ?? [];
|
|
145
|
+
const opts = new PointerEventData(this.context.input);
|
|
146
|
+
opts.inputSource = _ctrl;
|
|
147
|
+
opts.pointerId = _ctrl.input?.handedness === "right" ? 0 : 1;
|
|
148
|
+
opts.isDown = _ctrl.selectionDown;
|
|
149
|
+
opts.isUp = _ctrl.selectionUp;
|
|
150
|
+
opts.isPressed = _ctrl.selectionPressed;
|
|
151
|
+
opts.isClicked = false;
|
|
152
|
+
this.handleIntersections(opts.pointerId, rc, opts);
|
|
153
|
+
};
|
|
154
|
+
WebXRController.addEventListener(ControllerEvents.SelectStart, this._selectStartFn);
|
|
155
|
+
WebXRController.addEventListener(ControllerEvents.SelectEnd, this._selectEndFn);
|
|
156
|
+
WebXRController.addEventListener(ControllerEvents.Update, this._selectUpdateFn);
|
|
157
|
+
this._handleInputFn = this.onPointerEvent.bind(this);
|
|
158
|
+
this.context.input.addEventListener(InputEvents.PointerDown, this._handleInputFn);
|
|
159
|
+
this.context.input.addEventListener(InputEvents.PointerUp, this._handleInputFn);
|
|
160
|
+
this.context.input.addEventListener(InputEvents.PointerMove, this._handleInputFn);
|
|
161
|
+
}
|
|
162
|
+
onDisable() {
|
|
163
|
+
WebXRController.removeEventListener(ControllerEvents.SelectStart, this._selectStartFn);
|
|
164
|
+
WebXRController.removeEventListener(ControllerEvents.SelectEnd, this._selectEndFn);
|
|
165
|
+
WebXRController.removeEventListener(ControllerEvents.Update, this._selectUpdateFn);
|
|
166
|
+
this.context.input.removeEventListener(InputEvents.PointerDown, this._handleInputFn);
|
|
167
|
+
this.context.input.removeEventListener(InputEvents.PointerUp, this._handleInputFn);
|
|
168
|
+
this.context.input.removeEventListener(InputEvents.PointerMove, this._handleInputFn);
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* all pointers that have pressed something
|
|
172
|
+
*
|
|
173
|
+
* key: pointerId
|
|
174
|
+
* value: object that was pressed, data of the pointer event, handlers that are releavant to the event
|
|
175
|
+
*/
|
|
176
|
+
pressedByID = new Map();
|
|
177
|
+
/**
|
|
178
|
+
* all hovered objects
|
|
179
|
+
*
|
|
180
|
+
* key: pointerId
|
|
181
|
+
* value: object that is hovered, data of the pointer event
|
|
182
|
+
*/
|
|
183
|
+
hoveredByID = new Map();
|
|
184
|
+
onBeforeRender() {
|
|
185
|
+
this.resetMeshUIStates();
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Handle an pointer event from the input system
|
|
189
|
+
*/
|
|
190
|
+
onPointerEvent(pointerEvent) {
|
|
191
|
+
if (pointerEvent === undefined)
|
|
192
|
+
return;
|
|
193
|
+
// On mouse input has to be always 0 regardless of the button user pressed
|
|
194
|
+
// because otherwise it would be taken as 3 unique pointers and create OnEnter and OnExit events which is not expected
|
|
195
|
+
const id = pointerEvent.pointerType == PointerType.Touch ? pointerEvent.button : 0;
|
|
196
|
+
const data = new PointerEventData(this.context.input, pointerEvent);
|
|
197
|
+
data.inputSource = this.context.input;
|
|
198
|
+
data.pointerId = pointerEvent.button;
|
|
199
|
+
data.isClicked = pointerEvent.type == InputEvents.PointerUp && this.context.input.getPointerClicked(pointerEvent.button);
|
|
200
|
+
// using the input type directly instead of input API -> otherwise onMove events can sometimes be getPointerUp() == true
|
|
201
|
+
data.isDown = pointerEvent.type == InputEvents.PointerDown;
|
|
202
|
+
data.isUp = pointerEvent.type == InputEvents.PointerUp;
|
|
203
|
+
data.isPressed = this.context.input.getPointerPressed(pointerEvent.button);
|
|
204
|
+
if (debug && data.isClicked)
|
|
205
|
+
console.log("CLICK", data.pointerId);
|
|
206
|
+
// raycast
|
|
207
|
+
const options = new RaycastOptions();
|
|
208
|
+
options.screenPoint = this.context.input.getPointerPositionRC(id);
|
|
209
|
+
const hits = this.performRaycast(options);
|
|
210
|
+
if (!hits)
|
|
211
|
+
return;
|
|
212
|
+
if (debug && data.isClicked) {
|
|
213
|
+
showBalloonMessage("EventSystem: " + data.pointerId + " - " + this.context.time.frame + " - Up:" + data.isUp + ", Down:" + data.isDown);
|
|
214
|
+
}
|
|
215
|
+
const evt = {
|
|
216
|
+
sender: this,
|
|
217
|
+
args: data,
|
|
218
|
+
hasActiveUI: this.currentActiveMeshUIComponents.length > 0,
|
|
219
|
+
};
|
|
220
|
+
this.dispatchEvent(new CustomEvent(EventSystemEvents.BeforeHandleInput, { detail: evt }));
|
|
221
|
+
// handle hit objects
|
|
222
|
+
this.handleIntersections(id, hits, data);
|
|
223
|
+
this.dispatchEvent(new CustomEvent(EventSystemEvents.AfterHandleInput, { detail: evt }));
|
|
224
|
+
}
|
|
225
|
+
_sortedHits = [];
|
|
226
|
+
/**
|
|
227
|
+
* cache for objects that we want to raycast against. It's cleared before each call to performRaycast invoking raycasters
|
|
228
|
+
*/
|
|
229
|
+
_testObjectsCache = new Map();
|
|
230
|
+
/**
|
|
231
|
+
* Checks if an object that we encounter has an event component and if it does, we add it to our objects cache
|
|
232
|
+
* If it doesnt we tell our raycasting system to ignore it and continue in the child hierarchy
|
|
233
|
+
* We do this to avoid raycasts against objects that are not going to be used by the event system
|
|
234
|
+
* Because there's no component callback to be invoked anyways.
|
|
235
|
+
* This is especially important to avoid expensive raycasts against SkinnedMeshes
|
|
236
|
+
*
|
|
237
|
+
* Further optimizations would be to check what type of event we're dealing with
|
|
238
|
+
* For example if an event component has only an onPointerClick method we don't need to raycast during movement events
|
|
239
|
+
* */
|
|
240
|
+
shouldRaycastObject = (obj) => {
|
|
241
|
+
// check if this object is actually a UI shadow hierarchy object
|
|
242
|
+
let shadowComponent = null;
|
|
243
|
+
const isUI = isUIObject(obj);
|
|
244
|
+
// if yes we want to grab the actual object that is the owner of the shadow dom
|
|
245
|
+
// and check that object for the event component
|
|
246
|
+
if (isUI) {
|
|
247
|
+
shadowComponent = obj[$shadowDomOwner]?.gameObject;
|
|
248
|
+
}
|
|
249
|
+
// check if the object was seen previously
|
|
250
|
+
if (this._testObjectsCache.has(obj) || (shadowComponent && this._testObjectsCache.has(shadowComponent))) {
|
|
251
|
+
// if yes we check if it was previously stored as "YES WE NEED TO RAYCAST THIS"
|
|
252
|
+
const prev = this._testObjectsCache.get(obj);
|
|
253
|
+
if (prev === false)
|
|
254
|
+
return "continue in children";
|
|
255
|
+
return true;
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
// the object was not yet seen so we test if it has an event component
|
|
259
|
+
let hasEventComponent = hasPointerEventComponent(obj);
|
|
260
|
+
if (!hasEventComponent && shadowComponent)
|
|
261
|
+
hasEventComponent = hasPointerEventComponent(shadowComponent);
|
|
262
|
+
if (hasEventComponent) {
|
|
263
|
+
// it has an event component: we add it and all its children to the cache
|
|
264
|
+
// we don't need to do the same for the shadow component hierarchy
|
|
265
|
+
// because the next object that will be detecting that the shadow owner was already seen
|
|
266
|
+
this._testObjectsCache.set(obj, true);
|
|
267
|
+
obj.traverse((o) => {
|
|
268
|
+
this._testObjectsCache.set(o, true);
|
|
269
|
+
});
|
|
270
|
+
return true;
|
|
271
|
+
}
|
|
272
|
+
this._testObjectsCache.set(obj, false);
|
|
273
|
+
return "continue in children";
|
|
274
|
+
}
|
|
275
|
+
};
|
|
276
|
+
/** the raycast filter is always overriden */
|
|
277
|
+
performRaycast(opts) {
|
|
278
|
+
if (!this.raycaster)
|
|
279
|
+
return null;
|
|
280
|
+
this._sortedHits.length = 0;
|
|
281
|
+
if (!opts)
|
|
282
|
+
opts = new RaycastOptions();
|
|
283
|
+
// we clear the cache of previously seen objects
|
|
284
|
+
this._testObjectsCache.clear();
|
|
285
|
+
opts.testObject = this.shouldRaycastObject;
|
|
286
|
+
for (const rc of this.raycaster) {
|
|
287
|
+
if (!rc.activeAndEnabled)
|
|
288
|
+
continue;
|
|
289
|
+
const res = rc.performRaycast(opts);
|
|
290
|
+
if (res && res.length > 0) {
|
|
291
|
+
// console.log(res.length, res.map(r => r.object.name));
|
|
292
|
+
this._sortedHits.push(...res);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
this._sortedHits.sort((a, b) => {
|
|
296
|
+
return a.distance - b.distance;
|
|
297
|
+
});
|
|
298
|
+
return this._sortedHits;
|
|
299
|
+
}
|
|
300
|
+
handleIntersections(id, hits, args) {
|
|
301
|
+
if (hits?.length) {
|
|
302
|
+
hits = this.sortCandidates(hits);
|
|
303
|
+
for (const hit of hits) {
|
|
304
|
+
const { object } = hit;
|
|
305
|
+
args.point = hit.point;
|
|
306
|
+
args.normal = hit.normal;
|
|
307
|
+
args.face = hit.face;
|
|
308
|
+
args.distance = hit.distance;
|
|
309
|
+
args.instanceId = hit.instanceId;
|
|
310
|
+
if (this.handleEventOnObject(object, args)) {
|
|
311
|
+
return true;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
// pointer has not hit any object to handle
|
|
316
|
+
// thus is not hovering over anything
|
|
317
|
+
const hoveredData = this.hoveredByID.get(id);
|
|
318
|
+
if (hoveredData) {
|
|
319
|
+
this.triggerOnExit(hoveredData.obj, hoveredData.data);
|
|
320
|
+
}
|
|
321
|
+
this.hoveredByID.delete(id);
|
|
322
|
+
// if it was up, it means it doesn't should notify things that it down on before
|
|
323
|
+
if (args.isUp) {
|
|
324
|
+
const pressedData = this.pressedByID.get(id);
|
|
325
|
+
pressedData?.handlers.forEach(h => h.onPointerUp?.call(h, args));
|
|
326
|
+
this.pressedByID.delete(id);
|
|
327
|
+
}
|
|
328
|
+
return false;
|
|
329
|
+
}
|
|
330
|
+
_sortingBuffer = [];
|
|
331
|
+
_noDepthTestingResults = [];
|
|
332
|
+
sortCandidates(hits) {
|
|
333
|
+
// iterate over all hits and filter for nodepth objects and normal hit objects
|
|
334
|
+
// the no-depth objects will be handled first starting from the closest
|
|
335
|
+
// assuming the hits array is sorted by distance (closest > furthest)
|
|
336
|
+
this._sortingBuffer.length = 0;
|
|
337
|
+
this._noDepthTestingResults.length = 0;
|
|
338
|
+
for (let i = 0; i < hits.length; i++) {
|
|
339
|
+
const hit = hits[i];
|
|
340
|
+
const object = hit.object;
|
|
341
|
+
if (object.material) {
|
|
342
|
+
if (object.material["depthTest"] === false) {
|
|
343
|
+
this._noDepthTestingResults.push(hit);
|
|
344
|
+
continue;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
this._sortingBuffer.push(hit);
|
|
348
|
+
}
|
|
349
|
+
for (const obj of this._sortingBuffer) {
|
|
350
|
+
this._noDepthTestingResults.push(obj);
|
|
351
|
+
}
|
|
352
|
+
return this._noDepthTestingResults;
|
|
353
|
+
}
|
|
354
|
+
out = {};
|
|
355
|
+
/**
|
|
356
|
+
* Handle hit result by preparing all needed information before propagation.
|
|
357
|
+
* Then calling propagate.
|
|
358
|
+
*/
|
|
359
|
+
handleEventOnObject(object, args) {
|
|
360
|
+
// ensures that invisible objects are ignored
|
|
361
|
+
if (!this.testIsVisible(object)) {
|
|
362
|
+
if (args.isClicked && debug)
|
|
363
|
+
console.log("not allowed", object);
|
|
364
|
+
return false;
|
|
365
|
+
}
|
|
366
|
+
// Event without pointer can't be handled
|
|
367
|
+
if (args.pointerId === undefined) {
|
|
368
|
+
if (debug)
|
|
369
|
+
console.warn("Event without pointer can't be handled", args);
|
|
370
|
+
return false;
|
|
371
|
+
}
|
|
372
|
+
// We want to call all event methods even if the event was used
|
|
373
|
+
// Used event can't be handled
|
|
374
|
+
// if (args.used) return false;
|
|
375
|
+
// Correct the handled object to match the relevant object in shadow dom (?)
|
|
376
|
+
const originalObject = object;
|
|
377
|
+
args.object = object;
|
|
378
|
+
const parent = object.parent;
|
|
379
|
+
let isShadow = false;
|
|
380
|
+
const clicked = args.isClicked ?? false;
|
|
381
|
+
let canvasGroup = null;
|
|
382
|
+
// handle potential shadow dom built from three mesh ui
|
|
383
|
+
if (parent && parent.isUI) {
|
|
384
|
+
const pressedOrClicked = (args.isPressed || args.isClicked) ?? false;
|
|
385
|
+
if (parent[$shadowDomOwner]) {
|
|
386
|
+
const actualGo = parent[$shadowDomOwner].gameObject;
|
|
387
|
+
if (actualGo) {
|
|
388
|
+
const res = UIRaycastUtils.isInteractable(actualGo, this.out);
|
|
389
|
+
if (!res)
|
|
390
|
+
return false;
|
|
391
|
+
canvasGroup = this.out.canvasGroup ?? null;
|
|
392
|
+
const handled = this.handleMeshUIIntersection(object, pressedOrClicked);
|
|
393
|
+
if (!clicked && handled) {
|
|
394
|
+
// return true;
|
|
395
|
+
}
|
|
396
|
+
object = actualGo;
|
|
397
|
+
isShadow = true;
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
if (!isShadow) {
|
|
401
|
+
const obj = this.handleMeshUiObjectWithoutShadowDom(parent, pressedOrClicked);
|
|
402
|
+
if (obj)
|
|
403
|
+
return true;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
if (clicked && debug)
|
|
407
|
+
console.log(this.context.time.frame, object);
|
|
408
|
+
// Handle OnPointerExit -> in case when we are about to hover something new
|
|
409
|
+
// 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)
|
|
410
|
+
const hovering = this.hoveredByID.get(args.pointerId);
|
|
411
|
+
const isNewlyHovering = hovering?.obj !== object;
|
|
412
|
+
// trigger onPointerExit
|
|
413
|
+
if (isNewlyHovering && hovering?.obj) {
|
|
414
|
+
this.triggerOnExit(hovering.obj, hovering.data);
|
|
415
|
+
}
|
|
416
|
+
// save hovered object
|
|
417
|
+
const entry = this.hoveredByID.get(args.pointerId);
|
|
418
|
+
if (!entry)
|
|
419
|
+
this.hoveredByID.set(args.pointerId, { obj: object, data: args });
|
|
420
|
+
else {
|
|
421
|
+
entry.obj = object;
|
|
422
|
+
entry.data = args;
|
|
423
|
+
}
|
|
424
|
+
// create / update pressed entry
|
|
425
|
+
if (args.isDown) {
|
|
426
|
+
const data = this.pressedByID.get(args.pointerId);
|
|
427
|
+
if (!data)
|
|
428
|
+
this.pressedByID.set(args.pointerId, { obj: object, data: args, handlers: new Set() });
|
|
429
|
+
else {
|
|
430
|
+
data.obj = object;
|
|
431
|
+
data.data = args;
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
if (canvasGroup === null || canvasGroup.interactable) {
|
|
435
|
+
this.handleMainInteraction(object, args, isNewlyHovering);
|
|
436
|
+
}
|
|
437
|
+
return true;
|
|
438
|
+
}
|
|
439
|
+
/**
|
|
440
|
+
* Propagate up in hiearchy and call the callback for each component that is possibly a handler
|
|
441
|
+
*/
|
|
442
|
+
propagate(object, _args, onComponent) {
|
|
443
|
+
while (true) {
|
|
444
|
+
// Propagate up the hierarchy
|
|
445
|
+
if (_args.used)
|
|
446
|
+
return;
|
|
447
|
+
GameObject.foreachComponent(object, comp => {
|
|
448
|
+
// TODO: implement Stop Immediate Propagation
|
|
449
|
+
onComponent(comp);
|
|
450
|
+
// return undefined to continue iterating
|
|
451
|
+
return undefined;
|
|
452
|
+
}, false);
|
|
453
|
+
if (!object.parent)
|
|
454
|
+
break;
|
|
455
|
+
// walk up
|
|
456
|
+
object = object.parent;
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* Propagate up in hiearchy and call handlers based on the pointer event data
|
|
461
|
+
*/
|
|
462
|
+
handleMainInteraction(object, args, isNewlyHovering) {
|
|
463
|
+
if (args.pointerId === undefined)
|
|
464
|
+
return;
|
|
465
|
+
const pressedEvent = this.pressedByID.get(args.pointerId);
|
|
466
|
+
this.propagate(object, args, (behaviour) => {
|
|
467
|
+
const comp = behaviour;
|
|
468
|
+
if (comp.interactable === false)
|
|
469
|
+
return;
|
|
470
|
+
if (comp.onPointerEnter) {
|
|
471
|
+
if (isNewlyHovering) {
|
|
472
|
+
comp.onPointerEnter(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
|
+
}
|
|
483
|
+
}
|
|
484
|
+
const posLastFrame = this.context.input.getPointerPositionLastFrame(args.pointerId);
|
|
485
|
+
const posThisFrame = this.context.input.getPointerPosition(args.pointerId);
|
|
486
|
+
const isMoving = posLastFrame && !Mathf.approximately(posLastFrame, posThisFrame);
|
|
487
|
+
if (isMoving && comp.onPointerMove) {
|
|
488
|
+
comp.onPointerMove(args);
|
|
489
|
+
}
|
|
490
|
+
if (args.isUp) {
|
|
491
|
+
if (comp.onPointerUp) {
|
|
492
|
+
comp.onPointerUp(args);
|
|
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 onExit on touchUp
|
|
500
|
+
// onExit on mouse is handled when we hover over something else / on nothing
|
|
501
|
+
if (comp.onPointerExit && args.event?.pointerType === PointerType.Touch) {
|
|
502
|
+
comp.onPointerExit(args);
|
|
503
|
+
this.hoveredByID.delete(args.pointerId);
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
if (args.isClicked) {
|
|
507
|
+
if (comp.onPointerClick) {
|
|
508
|
+
comp.onPointerClick(args);
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
});
|
|
512
|
+
// after the propagation end, call UP on any objects that were DOWNED and didn't recieve an UP while propagating
|
|
513
|
+
// If user drags away from the object, then it doesn't get the UP event
|
|
514
|
+
if (args.isUp) {
|
|
515
|
+
pressedEvent?.handlers.forEach((handler) => {
|
|
516
|
+
if (handler.onPointerUp) {
|
|
517
|
+
handler.onPointerUp(args);
|
|
518
|
+
}
|
|
519
|
+
});
|
|
520
|
+
this.pressedByID.delete(args.pointerId);
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
/**
|
|
524
|
+
* Propagate up in hiearchy and call OnExit regardless of the pointer event data
|
|
525
|
+
*/
|
|
526
|
+
triggerOnExit(object, args) {
|
|
527
|
+
args.used = false;
|
|
528
|
+
this.propagate(object, args, (behaviour) => {
|
|
529
|
+
if (!behaviour.gameObject || behaviour.destroyed)
|
|
530
|
+
return;
|
|
531
|
+
const inst = behaviour;
|
|
532
|
+
if (inst.onPointerExit) {
|
|
533
|
+
inst.onPointerExit(args);
|
|
534
|
+
}
|
|
535
|
+
});
|
|
536
|
+
}
|
|
537
|
+
handleMeshUiObjectWithoutShadowDom(obj, pressed) {
|
|
538
|
+
if (!obj || !obj.isUI)
|
|
539
|
+
return true;
|
|
540
|
+
const hit = this.handleMeshUIIntersection(obj, pressed);
|
|
541
|
+
return hit;
|
|
542
|
+
}
|
|
543
|
+
currentActiveMeshUIComponents = [];
|
|
544
|
+
handleMeshUIIntersection(meshUiObject, pressed) {
|
|
545
|
+
const res = MeshUIHelper.updateState(meshUiObject, pressed);
|
|
546
|
+
if (res) {
|
|
547
|
+
this.currentActiveMeshUIComponents.push(res);
|
|
548
|
+
}
|
|
549
|
+
return res !== null;
|
|
550
|
+
}
|
|
551
|
+
resetMeshUIStates() {
|
|
552
|
+
if (this.context.input.getPointerPressedCount() > 0) {
|
|
553
|
+
MeshUIHelper.resetLastSelected();
|
|
554
|
+
}
|
|
555
|
+
if (!this.currentActiveMeshUIComponents || this.currentActiveMeshUIComponents.length <= 0)
|
|
556
|
+
return;
|
|
557
|
+
for (let i = 0; i < this.currentActiveMeshUIComponents.length; i++) {
|
|
558
|
+
const comp = this.currentActiveMeshUIComponents[i];
|
|
559
|
+
MeshUIHelper.resetState(comp);
|
|
560
|
+
}
|
|
561
|
+
this.currentActiveMeshUIComponents.length = 0;
|
|
562
|
+
}
|
|
563
|
+
testIsVisible(obj) {
|
|
564
|
+
if (!obj)
|
|
565
|
+
return true;
|
|
566
|
+
if (!GameObject.isActiveSelf(obj))
|
|
567
|
+
return false;
|
|
568
|
+
return this.testIsVisible(obj.parent);
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
class MeshUIHelper {
|
|
572
|
+
static lastSelected = null;
|
|
573
|
+
static lastUpdateFrame = [];
|
|
574
|
+
static needsUpdate = false;
|
|
575
|
+
static markDirty() {
|
|
576
|
+
this.needsUpdate = true;
|
|
577
|
+
}
|
|
578
|
+
static update(threeMeshUI, context, force = false) {
|
|
579
|
+
if (force) {
|
|
580
|
+
threeMeshUI.update();
|
|
581
|
+
return;
|
|
582
|
+
}
|
|
583
|
+
const currentFrame = context.time.frameCount;
|
|
584
|
+
for (const lu of this.lastUpdateFrame) {
|
|
585
|
+
if (lu.context === context) {
|
|
586
|
+
if (currentFrame === lu.frame)
|
|
587
|
+
return;
|
|
588
|
+
lu.frame = currentFrame;
|
|
589
|
+
let shouldUpdate = this.needsUpdate || currentFrame < 1;
|
|
590
|
+
if (lu.nextUpdate === context.time.frameCount)
|
|
591
|
+
shouldUpdate = true;
|
|
592
|
+
// if (this.needsUpdate) lu.nextUpdate = currentFrame + 3;
|
|
593
|
+
if (shouldUpdate) {
|
|
594
|
+
if (debug)
|
|
595
|
+
console.log("Update threemeshui");
|
|
596
|
+
this.needsUpdate = false;
|
|
597
|
+
threeMeshUI.update();
|
|
598
|
+
}
|
|
599
|
+
return;
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
this.lastUpdateFrame = [{ context, frame: currentFrame, nextUpdate: currentFrame }];
|
|
603
|
+
threeMeshUI.update();
|
|
604
|
+
}
|
|
605
|
+
static updateState(intersect, _selectState) {
|
|
606
|
+
let foundBlock = null;
|
|
607
|
+
if (intersect) {
|
|
608
|
+
foundBlock = this.findBlockInParent(intersect);
|
|
609
|
+
// console.log(intersect, "-- found block:", foundBlock)
|
|
610
|
+
if (foundBlock && foundBlock !== this.lastSelected) {
|
|
611
|
+
const interactable = foundBlock["interactable"];
|
|
612
|
+
if (interactable === false)
|
|
613
|
+
return null;
|
|
614
|
+
this.needsUpdate = true;
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
return foundBlock;
|
|
618
|
+
}
|
|
619
|
+
static resetLastSelected() {
|
|
620
|
+
const last = this.lastSelected;
|
|
621
|
+
if (!last)
|
|
622
|
+
return;
|
|
623
|
+
this.lastSelected = null;
|
|
624
|
+
this.resetState(last);
|
|
625
|
+
}
|
|
626
|
+
static resetState(obj) {
|
|
627
|
+
if (!obj)
|
|
628
|
+
return;
|
|
629
|
+
this.needsUpdate = true;
|
|
630
|
+
}
|
|
631
|
+
static findBlockInParent(elem) {
|
|
632
|
+
if (!elem)
|
|
633
|
+
return null;
|
|
634
|
+
if (elem.isBlock) {
|
|
635
|
+
// @TODO : Replace states managements
|
|
636
|
+
// if (Object.keys(elem.states).length > 0)
|
|
637
|
+
return elem;
|
|
638
|
+
}
|
|
639
|
+
return this.findBlockInParent(elem.parent);
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
642
|
//# sourceMappingURL=EventSystem.js.map
|