@needle-tools/engine 3.28.7-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 -2256
- package/LICENSE.md +10 -10
- package/README.md +52 -52
- package/dist/needle-engine.js +9 -12
- package/dist/needle-engine.light.js +9 -12
- package/dist/needle-engine.light.min.js +8 -11
- package/dist/needle-engine.light.umd.cjs +8 -11
- package/dist/needle-engine.min.js +8 -11
- package/dist/needle-engine.umd.cjs +8 -11
- 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/AnimatorController.js.map +1 -1
- 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,653 +1,653 @@
|
|
|
1
|
-
import { Behaviour, GameObject } from "./Component.js";
|
|
2
|
-
import { Camera } from "./Camera.js";
|
|
3
|
-
import { LookAtConstraint } from "./LookAtConstraint.js";
|
|
4
|
-
import { getWorldDirection, getWorldPosition, getWorldRotation, setWorldPosition, setWorldRotation, slerp } from "../engine/engine_three_utils.js";
|
|
5
|
-
import { RaycastOptions } from "../engine/engine_physics.js";
|
|
6
|
-
import { serializable } from "../engine/engine_serialization_decorator.js";
|
|
7
|
-
import { getParam, isMobileDevice } from "../engine/engine_utils.js";
|
|
8
|
-
|
|
9
|
-
import { Camera as ThreeCamera, Box3, Object3D, PerspectiveCamera, Vector2, Vector3, Box3Helper, GridHelper, Mesh, ShadowMaterial, RGBA_ASTC_10x10_Format, Ray } from "three";
|
|
10
|
-
import { OrbitControls as ThreeOrbitControls } from "three/examples/jsm/controls/OrbitControls.js";
|
|
11
|
-
import { type AfterHandleInputEvent, EventSystem, EventSystemEvents } from "./ui/EventSystem.js";
|
|
12
|
-
import type { ICameraController } from "../engine/engine_types.js";
|
|
13
|
-
import { setCameraController, useForAutoFit } from "../engine/engine_camera.js";
|
|
14
|
-
import { SyncedTransform } from "./SyncedTransform.js";
|
|
15
|
-
import { tryGetUIComponent } from "./ui/Utils.js";
|
|
16
|
-
import { GroundProjectedSkybox } from "three/examples/jsm/objects/GroundProjectedSkybox.js";
|
|
17
|
-
import { Mathf } from "../engine/engine_math.js";
|
|
18
|
-
|
|
19
|
-
const freeCam = getParam("freecam");
|
|
20
|
-
const debugCameraFit = getParam("debugcamerafit");
|
|
21
|
-
const smoothcam = getParam("smoothcam");
|
|
22
|
-
|
|
23
|
-
const disabledKeys = { LEFT: "", UP: "", RIGHT: "", BOTTOM: "" };
|
|
24
|
-
let defaultKeys: any = undefined;
|
|
25
|
-
|
|
26
|
-
export enum OrbitControlsEventsType {
|
|
27
|
-
/** Invoked with a CameraTargetReachedEvent */
|
|
28
|
-
CameraTargetReached = "target-reached",
|
|
29
|
-
}
|
|
30
|
-
export class CameraTargetReachedEvent extends CustomEvent<{ controls: OrbitControls, type: "camera" | "lookat" }> {
|
|
31
|
-
constructor(ctrls: OrbitControls, type: "camera" | "lookat") {
|
|
32
|
-
super(OrbitControlsEventsType.CameraTargetReached, {
|
|
33
|
-
detail: {
|
|
34
|
-
controls: ctrls,
|
|
35
|
-
type: type,
|
|
36
|
-
}
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export class OrbitControls extends Behaviour implements ICameraController {
|
|
42
|
-
|
|
43
|
-
get isCameraController(): boolean {
|
|
44
|
-
return true;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/** The underlying three.js OrbitControls */
|
|
48
|
-
public get controls() {
|
|
49
|
-
return this._controls;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/** The object being controlled by the OrbitControls (usually the camera) */
|
|
53
|
-
public get controllerObject(): Object3D | null {
|
|
54
|
-
return this._cameraObject;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/** Register callback when user starts interacting with the orbit controls */
|
|
58
|
-
public onStartInteraction(callback: Function) {
|
|
59
|
-
this.controls?.addEventListener("start", callback as any);
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
/** When enabled the scene will be automatically fitted into the camera view in onEnable */
|
|
63
|
-
@serializable()
|
|
64
|
-
autoFit: boolean = false;
|
|
65
|
-
@serializable()
|
|
66
|
-
enableRotate: boolean = true;
|
|
67
|
-
@serializable()
|
|
68
|
-
autoRotate: boolean = false;
|
|
69
|
-
@serializable()
|
|
70
|
-
autoRotateSpeed: number = 1.0;
|
|
71
|
-
@serializable()
|
|
72
|
-
enableKeys: boolean = true;
|
|
73
|
-
@serializable()
|
|
74
|
-
enableDamping: boolean = true;
|
|
75
|
-
@serializable()
|
|
76
|
-
dampingFactor: number = 0.1;
|
|
77
|
-
@serializable()
|
|
78
|
-
enableZoom: boolean = true;
|
|
79
|
-
@serializable()
|
|
80
|
-
minZoom: number = 0;
|
|
81
|
-
@serializable()
|
|
82
|
-
maxZoom: number = Infinity;
|
|
83
|
-
@serializable()
|
|
84
|
-
enablePan: boolean = true;
|
|
85
|
-
@serializable(LookAtConstraint)
|
|
86
|
-
lookAtConstraint: LookAtConstraint | null = null;
|
|
87
|
-
@serializable()
|
|
88
|
-
lookAtConstraint01: number = 1;
|
|
89
|
-
|
|
90
|
-
/** If true user input interrupts the camera from animating to a target */
|
|
91
|
-
@serializable()
|
|
92
|
-
allowInterrupt: boolean = true;
|
|
93
|
-
@serializable()
|
|
94
|
-
middleClickToFocus: boolean = true;
|
|
95
|
-
@serializable()
|
|
96
|
-
doubleClickToFocus: boolean = true;
|
|
97
|
-
// @serializable()
|
|
98
|
-
// zoomToCursor: boolean = false;
|
|
99
|
-
|
|
100
|
-
// remove once slerp works correctly
|
|
101
|
-
useSlerp: boolean = true;
|
|
102
|
-
|
|
103
|
-
debugLog: boolean = false;
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
* @deprecated use `targetLerpDuration` instead
|
|
107
|
-
* ~~The speed at which the camera target and the camera will be lerping to their destinations (if set via script or user input)~~
|
|
108
|
-
* */
|
|
109
|
-
get targetLerpSpeed() { return 5 }
|
|
110
|
-
set targetLerpSpeed(v) { this.targetLerpDuration = 1 / v; }
|
|
111
|
-
|
|
112
|
-
/** The duration in seconds it takes for the camera look ad and position lerp to reach their destination (when set via `setCameraTargetPosition` and `setLookTargetPosition`) */
|
|
113
|
-
@serializable()
|
|
114
|
-
targetLerpDuration = 1;
|
|
115
|
-
|
|
116
|
-
/** When enabled OrbitControls will automatically raycast find a look at target in start */
|
|
117
|
-
autoTarget: boolean = true;
|
|
118
|
-
|
|
119
|
-
private _controls: ThreeOrbitControls | null = null;
|
|
120
|
-
private _cameraObject: Object3D | null = null;
|
|
121
|
-
|
|
122
|
-
private _lookTargetLerpActive: boolean = false;
|
|
123
|
-
private _lookTargetStartPosition: Vector3 = new Vector3();
|
|
124
|
-
private _lookTargetEndPosition: Vector3 = new Vector3();
|
|
125
|
-
private _lookTargetLerp01: number = 0;
|
|
126
|
-
private _lookTargetLerpDuration: number = 0;
|
|
127
|
-
|
|
128
|
-
private _cameraLerpActive: boolean = false;
|
|
129
|
-
private _cameraStartPosition: Vector3 = new Vector3();
|
|
130
|
-
private _cameraEndPosition: Vector3 = new Vector3();
|
|
131
|
-
private _cameraLerp01: number = 0;
|
|
132
|
-
private _cameraLerpDuration: number = 0;
|
|
133
|
-
|
|
134
|
-
private _inputs: number = 0;
|
|
135
|
-
private _enableTime: number = 0; // use to disable double click when double clicking on UI
|
|
136
|
-
private _startedListeningToKeyEvents: boolean = false;
|
|
137
|
-
|
|
138
|
-
private _eventSystem?: EventSystem;
|
|
139
|
-
private _afterHandleInputFn?: any;
|
|
140
|
-
private _camera: Camera | null = null;
|
|
141
|
-
private _syncedTransform?: SyncedTransform;
|
|
142
|
-
private _didStart = false;
|
|
143
|
-
|
|
144
|
-
targetElement: HTMLElement | null = null;
|
|
145
|
-
|
|
146
|
-
awake(): void {
|
|
147
|
-
this._didStart = false;
|
|
148
|
-
this._startedListeningToKeyEvents = false;
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
start() {
|
|
152
|
-
this._didStart = true;
|
|
153
|
-
if (this.autoTarget) {
|
|
154
|
-
if (this._controls) {
|
|
155
|
-
const camGo = GameObject.getComponent(this.gameObject, Camera);
|
|
156
|
-
if (camGo && !this.setLookTargetFromConstraint()) {
|
|
157
|
-
if (this.debugLog)
|
|
158
|
-
console.log("NO TARGET");
|
|
159
|
-
const worldPosition = getWorldPosition(camGo.cam);
|
|
160
|
-
const distanceToCenter = worldPosition.length();
|
|
161
|
-
const forward = new Vector3(0, 0, -distanceToCenter).applyMatrix4(camGo.cam.matrixWorld);
|
|
162
|
-
this.setLookTargetPosition(forward, true);
|
|
163
|
-
}
|
|
164
|
-
if (this.autoTarget && !this.setLookTargetFromConstraint()) {
|
|
165
|
-
const opts = new RaycastOptions();
|
|
166
|
-
// center of the screen:
|
|
167
|
-
opts.screenPoint = new Vector2(0, 0);
|
|
168
|
-
opts.lineThreshold = 0.1;
|
|
169
|
-
const hits = this.context.physics.raycast(opts);
|
|
170
|
-
if (hits.length > 0) {
|
|
171
|
-
this.setLookTargetPosition(hits[0].point, true);
|
|
172
|
-
}
|
|
173
|
-
if (debugCameraFit)
|
|
174
|
-
console.log("OrbitControls hits", ...hits);
|
|
175
|
-
}
|
|
176
|
-
if (this.autoFit) this.fitCamera()
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
this._eventSystem = EventSystem.get(this.context) ?? undefined;
|
|
181
|
-
if (this._eventSystem) {
|
|
182
|
-
this._afterHandleInputFn = this.afterHandleInput.bind(this);
|
|
183
|
-
this._eventSystem.addEventListener(EventSystemEvents.AfterHandleInput, this._afterHandleInputFn!);
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
onDestroy() {
|
|
188
|
-
this._controls?.dispose();
|
|
189
|
-
this._eventSystem?.removeEventListener(EventSystemEvents.AfterHandleInput, this._afterHandleInputFn!);
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
onEnable() {
|
|
193
|
-
this._enableTime = this.context.time.time;
|
|
194
|
-
const cameraComponent = GameObject.getComponent(this.gameObject, Camera);
|
|
195
|
-
this._camera = cameraComponent;
|
|
196
|
-
const cam = cameraComponent?.cam;
|
|
197
|
-
if (cam) setCameraController(cam, this, true);
|
|
198
|
-
if (!this._controls) {
|
|
199
|
-
if (!cam) {
|
|
200
|
-
console.warn("OrbitControls: Requires a Camera component on the same object as this component.");
|
|
201
|
-
return;
|
|
202
|
-
}
|
|
203
|
-
if (cam)
|
|
204
|
-
this._cameraObject = cam;
|
|
205
|
-
// Using the parent if possible to make it possible to disable input on the canvas
|
|
206
|
-
// for having HTML content behind it and still receive input
|
|
207
|
-
const element = this.targetElement ?? this.context.renderer.domElement;
|
|
208
|
-
// HACK: workaround for three orbit controls forcing an update when being created....
|
|
209
|
-
const mat = cam?.quaternion.clone();
|
|
210
|
-
this._controls = new ThreeOrbitControls(cam!, element);
|
|
211
|
-
cam?.quaternion.copy(mat!)
|
|
212
|
-
if (defaultKeys === undefined) defaultKeys = { ...this._controls.keys };
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
if (this._controls) {
|
|
216
|
-
if (freeCam) {
|
|
217
|
-
this.enablePan = true;
|
|
218
|
-
this.enableZoom = true;
|
|
219
|
-
this.middleClickToFocus = true;
|
|
220
|
-
if (isMobileDevice()) this.doubleClickToFocus = true;
|
|
221
|
-
}
|
|
222
|
-
this._controls.addEventListener("start", this.onControlsChangeStarted);
|
|
223
|
-
if (cam?.type === "PerspectiveCamera") {
|
|
224
|
-
if (freeCam) {
|
|
225
|
-
// dont set limits
|
|
226
|
-
}
|
|
227
|
-
else {
|
|
228
|
-
this._controls.minDistance = this.minZoom;
|
|
229
|
-
this._controls.maxDistance = this.maxZoom;
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
else {
|
|
233
|
-
if (freeCam) {
|
|
234
|
-
// dont set limits
|
|
235
|
-
}
|
|
236
|
-
else {
|
|
237
|
-
this._controls.minZoom = this.minZoom;
|
|
238
|
-
this._controls.maxZoom = this.maxZoom;
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
if (!this._startedListeningToKeyEvents) {
|
|
243
|
-
this._startedListeningToKeyEvents = true;
|
|
244
|
-
this._controls.listenToKeyEvents(window.document.body);
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
this._syncedTransform = GameObject.getComponent(this.gameObject, SyncedTransform) ?? undefined;
|
|
248
|
-
// if we autofit in onEnable then DragControls will trigger fitting every time (because they disable OrbitControls)
|
|
249
|
-
// that's confusing and not what we want
|
|
250
|
-
// if (this._didStart) {
|
|
251
|
-
// if (this.autoFit) this.fitCamera()
|
|
252
|
-
// }
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
onDisable() {
|
|
256
|
-
if (this._camera?.cam) {
|
|
257
|
-
setCameraController(this._camera.cam, this, false);
|
|
258
|
-
}
|
|
259
|
-
if (this._controls) {
|
|
260
|
-
this._controls.enabled = false;
|
|
261
|
-
this._controls.autoRotate = false;
|
|
262
|
-
this._controls.removeEventListener("start", this.onControlsChangeStarted);
|
|
263
|
-
// this._controls.reset();
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
private onControlsChangeStarted = () => {
|
|
268
|
-
if (this._syncedTransform) {
|
|
269
|
-
this._syncedTransform.requestOwnership();
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
private _shouldDisable: boolean = false;
|
|
274
|
-
private afterHandleInput(evt: CustomEvent<AfterHandleInputEvent>) {
|
|
275
|
-
if (evt.detail.args.pointerId === 0) {
|
|
276
|
-
if (evt.detail.args.isDown) {
|
|
277
|
-
if (this._controls && this._eventSystem) {
|
|
278
|
-
this._shouldDisable = this._eventSystem.hasActiveUI;
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
else if (!evt.detail.args.isPressed || evt.detail.args.isUp) {
|
|
282
|
-
this._shouldDisable = false;
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
onBeforeRender() {
|
|
289
|
-
if (!this._controls) return;
|
|
290
|
-
if (this._cameraObject !== this.context.mainCamera) return;
|
|
291
|
-
|
|
292
|
-
if (this.context.input.getPointerDown(1) || this.context.input.getPointerDown(2) || this.context.input.mouseWheelChanged || (this.context.input.getPointerPressed(0) && this.context.input.getPointerPositionDelta(0)?.length() || 0 > .1)) {
|
|
293
|
-
this._inputs += 1;
|
|
294
|
-
}
|
|
295
|
-
if (this._inputs > 0 && this.allowInterrupt) {
|
|
296
|
-
// if a user has disabled rotation but enabled auto rotate we don't want to change it when we receive input
|
|
297
|
-
if (this.enableRotate) {
|
|
298
|
-
this.autoRotate = false;
|
|
299
|
-
}
|
|
300
|
-
this._cameraLerpActive = false;
|
|
301
|
-
this._lookTargetLerpActive = false;
|
|
302
|
-
}
|
|
303
|
-
this._inputs = 0;
|
|
304
|
-
|
|
305
|
-
let focusAtPointer = (this.middleClickToFocus && this.context.input.getPointerClicked(1));
|
|
306
|
-
focusAtPointer ||= (this.doubleClickToFocus && this.context.input.getPointerDoubleClicked(0) && this.context.time.time - this._enableTime > .3);
|
|
307
|
-
if (focusAtPointer) {
|
|
308
|
-
this.setTargetFromRaycast();
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
if (this._lookTargetLerpActive || this._cameraLerpActive) {
|
|
312
|
-
|
|
313
|
-
// lerp the camera
|
|
314
|
-
if (this._cameraLerpActive && this._cameraObject) {
|
|
315
|
-
this._cameraLerp01 += this.context.time.deltaTime / this._cameraLerpDuration;
|
|
316
|
-
if (this._cameraLerp01 >= 1) {
|
|
317
|
-
this._cameraObject.position.copy(this._cameraEndPosition);
|
|
318
|
-
this._cameraLerpActive = false;
|
|
319
|
-
this.dispatchEvent(new CameraTargetReachedEvent(this, "camera"));
|
|
320
|
-
}
|
|
321
|
-
else {
|
|
322
|
-
const t = Mathf.easeInOutCubic(this._cameraLerp01);
|
|
323
|
-
this._cameraObject.position.lerpVectors(this._cameraStartPosition, this._cameraEndPosition, t);
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
// lerp the look target
|
|
328
|
-
if (this._lookTargetLerpActive) {
|
|
329
|
-
this._lookTargetLerp01 += this.context.time.deltaTime / this._lookTargetLerpDuration;
|
|
330
|
-
if (this._lookTargetLerp01 >= 1) {
|
|
331
|
-
this._controls.target.copy(this._lookTargetEndPosition);
|
|
332
|
-
this._lookTargetLerpActive = false;
|
|
333
|
-
this.dispatchEvent(new CameraTargetReachedEvent(this, "lookat"));
|
|
334
|
-
} else {
|
|
335
|
-
const t = Mathf.easeInOutCubic(this._lookTargetLerp01);
|
|
336
|
-
this._controls.target.lerpVectors(this._lookTargetStartPosition, this._lookTargetEndPosition, t);
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
if (this._controls) {
|
|
343
|
-
if (this.debugLog)
|
|
344
|
-
this._controls.domElement = this.context.renderer.domElement;
|
|
345
|
-
this._controls.enabled = !this._shouldDisable && this._camera === this.context.mainCameraComponent && !this.context.isInXR;
|
|
346
|
-
this._controls.keys = this.enableKeys ? defaultKeys : disabledKeys;
|
|
347
|
-
this._controls.autoRotate = this.autoRotate;
|
|
348
|
-
this._controls.autoRotateSpeed = this.autoRotateSpeed;
|
|
349
|
-
this._controls.enableZoom = this.enableZoom;
|
|
350
|
-
this._controls.enableDamping = this.enableDamping;
|
|
351
|
-
this._controls.dampingFactor = this.dampingFactor;
|
|
352
|
-
this._controls.enablePan = this.enablePan;
|
|
353
|
-
this._controls.enableRotate = this.enableRotate;
|
|
354
|
-
|
|
355
|
-
if (typeof smoothcam === "number" || smoothcam === true) {
|
|
356
|
-
this._controls.enableDamping = true;
|
|
357
|
-
const factor = typeof smoothcam === "number" ? smoothcam : .99;
|
|
358
|
-
this._controls.dampingFactor = Math.max(.001, 1 - Math.min(1, factor));
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
if (!this.allowInterrupt) {
|
|
362
|
-
if (this._lookTargetLerpActive) {
|
|
363
|
-
this._controls.enablePan = false;
|
|
364
|
-
}
|
|
365
|
-
if (this._cameraLerpActive) {
|
|
366
|
-
this._controls.enableRotate = false;
|
|
367
|
-
this._controls.autoRotate = false;
|
|
368
|
-
}
|
|
369
|
-
if (this._lookTargetLerpActive || this._cameraLerpActive) {
|
|
370
|
-
this._controls.enableZoom = false;
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
//@ts-ignore
|
|
374
|
-
// this._controls.zoomToCursor = this.zoomToCursor;
|
|
375
|
-
if (!this.context.isInXR) {
|
|
376
|
-
if (!freeCam && this.lookAtConstraint?.locked) this.setLookTargetFromConstraint(0, this.lookAtConstraint01);
|
|
377
|
-
this._controls.update();
|
|
378
|
-
}
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
}
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
/**
|
|
385
|
-
* Sets camera target position and look direction. Does perform a raycast in the forward direction of the passed in object to find an orbit point
|
|
386
|
-
*/
|
|
387
|
-
public setCameraAndLookTarget(target: Object3D) {
|
|
388
|
-
if (!target || !(target instanceof Object3D)) return;
|
|
389
|
-
const worldPosition = getWorldPosition(target);
|
|
390
|
-
const forward = getWorldDirection(target);
|
|
391
|
-
this.setTargetFromRaycast(new Ray(worldPosition, forward));
|
|
392
|
-
this.setCameraTargetPosition(worldPosition);
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
/** Moves the camera to position smoothly.
|
|
396
|
-
* @param position The position in local space of the controllerObject to move the camera to. If null the camera will stop lerping to the target.
|
|
397
|
-
*/
|
|
398
|
-
public setCameraTargetPosition(position?: Object3D | Vector3 | null, immediateOrDuration: boolean | number = false) {
|
|
399
|
-
if (!position) return;
|
|
400
|
-
if (position instanceof Object3D) {
|
|
401
|
-
position = getWorldPosition(position) as Vector3;
|
|
402
|
-
}
|
|
403
|
-
if (!this._cameraEndPosition) this._cameraEndPosition = new Vector3();
|
|
404
|
-
this._cameraEndPosition.copy(position);
|
|
405
|
-
if (immediateOrDuration === true) {
|
|
406
|
-
this._cameraLerpActive = false;
|
|
407
|
-
this.controllerObject?.position.copy(this._cameraEndPosition);
|
|
408
|
-
}
|
|
409
|
-
else if (this._cameraObject) {
|
|
410
|
-
this._cameraLerpActive = true;
|
|
411
|
-
this._cameraLerp01 = 0;
|
|
412
|
-
this._cameraStartPosition.copy(this._cameraObject?.position);
|
|
413
|
-
if (typeof immediateOrDuration === "number") {
|
|
414
|
-
this._cameraLerpDuration = immediateOrDuration;
|
|
415
|
-
}
|
|
416
|
-
else this._cameraLerpDuration = this.targetLerpDuration;
|
|
417
|
-
}
|
|
418
|
-
}
|
|
419
|
-
/** True while the camera position is being lerped */
|
|
420
|
-
get cameraLerpActive() { return this._cameraLerpActive; }
|
|
421
|
-
/** Call to stop camera position lerping */
|
|
422
|
-
public stopCameraLerp() {
|
|
423
|
-
this._cameraLerpActive = false;
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
/** Moves the camera look-at target to a position smoothly. */
|
|
427
|
-
public setLookTargetPosition(position: Object3D | Vector3 | null = null, immediateOrDuration: boolean = false) {
|
|
428
|
-
if (!this._controls) return;
|
|
429
|
-
if (!position) return
|
|
430
|
-
if (position instanceof Object3D) {
|
|
431
|
-
position = getWorldPosition(position) as Vector3;
|
|
432
|
-
}
|
|
433
|
-
this._lookTargetEndPosition.copy(position);
|
|
434
|
-
|
|
435
|
-
if (immediateOrDuration === true) {
|
|
436
|
-
this._controls.target.copy(this._lookTargetEndPosition);
|
|
437
|
-
}
|
|
438
|
-
else {
|
|
439
|
-
this._lookTargetLerpActive = true;
|
|
440
|
-
this._lookTargetLerp01 = 0;
|
|
441
|
-
this._lookTargetStartPosition.copy(this._controls.target);
|
|
442
|
-
if (typeof immediateOrDuration === "number") {
|
|
443
|
-
this._lookTargetLerpDuration = immediateOrDuration;
|
|
444
|
-
}
|
|
445
|
-
else this._lookTargetLerpDuration = this.targetLerpDuration;
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
/** True while the camera look target is being lerped */
|
|
449
|
-
get lookTargetLerpActive() { return this._lookTargetLerpActive; }
|
|
450
|
-
/** Call to stop camera look target lerping */
|
|
451
|
-
public stopLookTargetLerp() {
|
|
452
|
-
this._lookTargetLerpActive = false;
|
|
453
|
-
}
|
|
454
|
-
|
|
455
|
-
/** Sets the look at target from an assigned lookAtConstraint source by index */
|
|
456
|
-
private setLookTargetFromConstraint(index: number = 0, t: number = 1): boolean {
|
|
457
|
-
if (!this._controls) return false;
|
|
458
|
-
const sources = this.lookAtConstraint?.sources;
|
|
459
|
-
if (sources && sources.length > 0) {
|
|
460
|
-
const target = sources[index];
|
|
461
|
-
if (target) {
|
|
462
|
-
target.getWorldPosition(this._lookTargetEndPosition);
|
|
463
|
-
this.lerpLookTarget(this._lookTargetEndPosition, t);
|
|
464
|
-
return true;
|
|
465
|
-
}
|
|
466
|
-
}
|
|
467
|
-
return false;
|
|
468
|
-
}
|
|
469
|
-
|
|
470
|
-
/** @deprecated use `controls.target.lerp(position, delta)` */
|
|
471
|
-
public lerpTarget(position: Vector3, delta: number) { return this.lerpLookTarget(position, delta); }
|
|
472
|
-
|
|
473
|
-
private lerpLookTarget(position: Vector3, delta: number) {
|
|
474
|
-
if (!this._controls) return;
|
|
475
|
-
if (delta >= 1) this._controls.target.copy(position);
|
|
476
|
-
else this._controls.target.lerp(position, delta);
|
|
477
|
-
}
|
|
478
|
-
|
|
479
|
-
private setTargetFromRaycast(ray?: Ray) {
|
|
480
|
-
if (!this.controls) return;
|
|
481
|
-
const rc = ray ? this.context.physics.raycastFromRay(ray) : this.context.physics.raycast();
|
|
482
|
-
for (const hit of rc) {
|
|
483
|
-
if (hit.distance > 0 && GameObject.isActiveInHierarchy(hit.object)) {
|
|
484
|
-
|
|
485
|
-
const uiComponent = tryGetUIComponent(hit.object);
|
|
486
|
-
if (uiComponent) {
|
|
487
|
-
const canvas = uiComponent.canvas;
|
|
488
|
-
if (canvas?.screenspace) {
|
|
489
|
-
break;
|
|
490
|
-
}
|
|
491
|
-
}
|
|
492
|
-
|
|
493
|
-
this.setLookTargetPosition(hit.point);
|
|
494
|
-
|
|
495
|
-
if (this.context.mainCamera) {
|
|
496
|
-
const pos = getWorldPosition(this.context.mainCamera);
|
|
497
|
-
const cameraTarget = pos.clone().sub(this.controls.target).add(this._lookTargetEndPosition);
|
|
498
|
-
this._cameraObject?.parent?.worldToLocal(cameraTarget);
|
|
499
|
-
this.setCameraTargetPosition(cameraTarget);
|
|
500
|
-
}
|
|
501
|
-
break;
|
|
502
|
-
}
|
|
503
|
-
}
|
|
504
|
-
}
|
|
505
|
-
|
|
506
|
-
// Adapted from https://discourse.threejs.org/t/camera-zoom-to-fit-object/936/24
|
|
507
|
-
// Slower but better implementation that takes bones and exact vertex positions into account: https://github.com/google/model-viewer/blob/04e900c5027de8c5306fe1fe9627707f42811b05/packages/model-viewer/src/three-components/ModelScene.ts#L321
|
|
508
|
-
/** Fits the camera to show the objects provided (defaults to the scene if no objects are passed in) */
|
|
509
|
-
fitCamera(objects?: Array<Object3D>, fitOffset: number = 1.1, immediate: boolean = true) {
|
|
510
|
-
const camera = this._cameraObject as PerspectiveCamera;
|
|
511
|
-
const controls = this._controls as ThreeOrbitControls | null;
|
|
512
|
-
if (!objects?.length) objects = this.context.scene.children;
|
|
513
|
-
if (objects.length <= 0) return;
|
|
514
|
-
|
|
515
|
-
if (!camera || !controls) return;
|
|
516
|
-
|
|
517
|
-
const size = new Vector3();
|
|
518
|
-
const center = new Vector3();
|
|
519
|
-
const box = new Box3();
|
|
520
|
-
|
|
521
|
-
// TODO would be much better to calculate the bounds in camera space instead of world space -
|
|
522
|
-
// we would get proper view-dependant fit.
|
|
523
|
-
// Right now it's independent from where the camera is actually looking from,
|
|
524
|
-
// and thus we're just getting some maximum that will work for sure.
|
|
525
|
-
|
|
526
|
-
box.makeEmpty();
|
|
527
|
-
const emptyChildren = [];
|
|
528
|
-
function expandByObjectRecursive(obj: Object3D) {
|
|
529
|
-
let allowExpanding = true;
|
|
530
|
-
// we dont want to check invisible objects
|
|
531
|
-
if (!obj.visible) return;
|
|
532
|
-
if (useForAutoFit(obj) === false) return;
|
|
533
|
-
if(obj.type === "TransformControlsGizmo" || obj.type === "TransformControlsPlane") return;
|
|
534
|
-
// ignore Box3Helpers
|
|
535
|
-
if (obj instanceof Box3Helper) allowExpanding = false;
|
|
536
|
-
if (obj instanceof GridHelper) allowExpanding = false;
|
|
537
|
-
// ignore GroundProjectedEnv
|
|
538
|
-
if (obj instanceof GroundProjectedSkybox) allowExpanding = false;
|
|
539
|
-
// // Ignore shadow catcher geometry
|
|
540
|
-
if ((obj as Mesh).material instanceof ShadowMaterial) allowExpanding = false;
|
|
541
|
-
// ONLY fit meshes
|
|
542
|
-
if (!(obj instanceof Mesh)) allowExpanding = false;
|
|
543
|
-
// Ignore things parented to the camera + ignore the camera
|
|
544
|
-
if (obj === camera) return;
|
|
545
|
-
// We don't want to fit UI objects
|
|
546
|
-
if (obj["isUI"] === true) return;
|
|
547
|
-
// If we encountered some geometry that should be ignored
|
|
548
|
-
// Then we don't want to use that for expanding the view
|
|
549
|
-
if (allowExpanding) {
|
|
550
|
-
if (debugCameraFit)
|
|
551
|
-
console.log(obj.name, obj.type, obj);
|
|
552
|
-
// Temporary override children
|
|
553
|
-
const children_length = obj.children;
|
|
554
|
-
obj.children = emptyChildren;
|
|
555
|
-
// TODO: validate that object doesn't contain NaN values
|
|
556
|
-
const pos = obj.position;
|
|
557
|
-
const scale = obj.scale;
|
|
558
|
-
if (Number.isNaN(pos.x) || Number.isNaN(pos.y) || Number.isNaN(pos.z)) {
|
|
559
|
-
console.warn(`Object \"${obj.name}\" has NaN values in position or scale.... will ignore it`, pos, scale);
|
|
560
|
-
return;
|
|
561
|
-
}
|
|
562
|
-
box.expandByObject(obj, true);
|
|
563
|
-
obj.children = children_length;
|
|
564
|
-
}
|
|
565
|
-
for (const child of obj.children) {
|
|
566
|
-
expandByObjectRecursive(child);
|
|
567
|
-
}
|
|
568
|
-
}
|
|
569
|
-
for (const object of objects) {
|
|
570
|
-
object.updateMatrixWorld();
|
|
571
|
-
expandByObjectRecursive(object);
|
|
572
|
-
}
|
|
573
|
-
|
|
574
|
-
camera.updateMatrixWorld();
|
|
575
|
-
camera.updateProjectionMatrix();
|
|
576
|
-
box.getCenter(center);
|
|
577
|
-
|
|
578
|
-
// project this box into camera space
|
|
579
|
-
box.applyMatrix4(camera.matrixWorldInverse);
|
|
580
|
-
|
|
581
|
-
box.getSize(size);
|
|
582
|
-
box.setFromCenterAndSize(center, size);
|
|
583
|
-
if( Number.isNaN(size.x) || Number.isNaN(size.y) || Number.isNaN(size.z)){
|
|
584
|
-
console.warn("Camera fit size resultet in NaN", camera, box, [...objects]);
|
|
585
|
-
return;
|
|
586
|
-
}
|
|
587
|
-
if (size.length() <= 0.0000000001) {
|
|
588
|
-
if (debugCameraFit) console.warn("Camera fit size is zero", box, [...objects]);
|
|
589
|
-
return;
|
|
590
|
-
}
|
|
591
|
-
|
|
592
|
-
const verticalFov = camera.fov;
|
|
593
|
-
const horizontalFov = 2 * Math.atan(Math.tan(verticalFov * Math.PI / 360 / 2) * camera.aspect) / Math.PI * 360;
|
|
594
|
-
const fitHeightDistance = size.y / (2 * Math.atan(Math.PI * verticalFov / 360));
|
|
595
|
-
const fitWidthDistance = size.x / (2 * Math.atan(Math.PI * horizontalFov / 360));
|
|
596
|
-
|
|
597
|
-
const distance = fitOffset * Math.max(fitHeightDistance, fitWidthDistance) + size.z / 2;
|
|
598
|
-
|
|
599
|
-
if (debugCameraFit) {
|
|
600
|
-
console.log("Fit camera to objects", fitHeightDistance, fitWidthDistance, "distance", distance);
|
|
601
|
-
}
|
|
602
|
-
|
|
603
|
-
const cameraWp = getWorldPosition(camera);
|
|
604
|
-
const direction = controls.target.clone()
|
|
605
|
-
.sub(cameraWp)
|
|
606
|
-
.normalize()
|
|
607
|
-
.multiplyScalar(distance);
|
|
608
|
-
|
|
609
|
-
controls.maxDistance = distance * 10;
|
|
610
|
-
controls.minDistance = distance * 0.01;
|
|
611
|
-
|
|
612
|
-
this.setLookTargetPosition(center, immediate);
|
|
613
|
-
this.autoTarget = false;
|
|
614
|
-
|
|
615
|
-
// TODO: this doesnt take the Camera component nearClipPlane into account
|
|
616
|
-
camera.near = distance / 100;
|
|
617
|
-
camera.far = distance * 100;
|
|
618
|
-
|
|
619
|
-
camera.updateMatrixWorld();
|
|
620
|
-
camera.updateProjectionMatrix();
|
|
621
|
-
|
|
622
|
-
if (camera.parent) {
|
|
623
|
-
const cameraLocalPosition = camera.parent!.worldToLocal(controls.target.clone().sub(direction));
|
|
624
|
-
this.setCameraTargetPosition(cameraLocalPosition, immediate);
|
|
625
|
-
}
|
|
626
|
-
else console.error(`Can not fit camera ${camera.name} because it has no parent`)
|
|
627
|
-
|
|
628
|
-
// setWorldPosition(camera, controls.target.clone().sub(direction));
|
|
629
|
-
|
|
630
|
-
if (debugCameraFit) {
|
|
631
|
-
const helper = new Box3Helper(box);
|
|
632
|
-
this.context.scene.add(helper);
|
|
633
|
-
setWorldRotation(helper, getWorldRotation(camera));
|
|
634
|
-
|
|
635
|
-
if (!this._haveAttachedKeyboardEvents) {
|
|
636
|
-
this._haveAttachedKeyboardEvents = true;
|
|
637
|
-
document.body.addEventListener("keydown", (e) => {
|
|
638
|
-
if (e.code === "KeyF") {
|
|
639
|
-
this.fitCamera(objects);
|
|
640
|
-
}
|
|
641
|
-
});
|
|
642
|
-
}
|
|
643
|
-
}
|
|
644
|
-
|
|
645
|
-
controls.update();
|
|
646
|
-
}
|
|
647
|
-
|
|
648
|
-
private _haveAttachedKeyboardEvents: boolean = false;
|
|
649
|
-
|
|
650
|
-
// private onPositionDrag(){
|
|
651
|
-
|
|
652
|
-
// }
|
|
653
|
-
}
|
|
1
|
+
import { Behaviour, GameObject } from "./Component.js";
|
|
2
|
+
import { Camera } from "./Camera.js";
|
|
3
|
+
import { LookAtConstraint } from "./LookAtConstraint.js";
|
|
4
|
+
import { getWorldDirection, getWorldPosition, getWorldRotation, setWorldPosition, setWorldRotation, slerp } from "../engine/engine_three_utils.js";
|
|
5
|
+
import { RaycastOptions } from "../engine/engine_physics.js";
|
|
6
|
+
import { serializable } from "../engine/engine_serialization_decorator.js";
|
|
7
|
+
import { getParam, isMobileDevice } from "../engine/engine_utils.js";
|
|
8
|
+
|
|
9
|
+
import { Camera as ThreeCamera, Box3, Object3D, PerspectiveCamera, Vector2, Vector3, Box3Helper, GridHelper, Mesh, ShadowMaterial, RGBA_ASTC_10x10_Format, Ray } from "three";
|
|
10
|
+
import { OrbitControls as ThreeOrbitControls } from "three/examples/jsm/controls/OrbitControls.js";
|
|
11
|
+
import { type AfterHandleInputEvent, EventSystem, EventSystemEvents } from "./ui/EventSystem.js";
|
|
12
|
+
import type { ICameraController } from "../engine/engine_types.js";
|
|
13
|
+
import { setCameraController, useForAutoFit } from "../engine/engine_camera.js";
|
|
14
|
+
import { SyncedTransform } from "./SyncedTransform.js";
|
|
15
|
+
import { tryGetUIComponent } from "./ui/Utils.js";
|
|
16
|
+
import { GroundProjectedSkybox } from "three/examples/jsm/objects/GroundProjectedSkybox.js";
|
|
17
|
+
import { Mathf } from "../engine/engine_math.js";
|
|
18
|
+
|
|
19
|
+
const freeCam = getParam("freecam");
|
|
20
|
+
const debugCameraFit = getParam("debugcamerafit");
|
|
21
|
+
const smoothcam = getParam("smoothcam");
|
|
22
|
+
|
|
23
|
+
const disabledKeys = { LEFT: "", UP: "", RIGHT: "", BOTTOM: "" };
|
|
24
|
+
let defaultKeys: any = undefined;
|
|
25
|
+
|
|
26
|
+
export enum OrbitControlsEventsType {
|
|
27
|
+
/** Invoked with a CameraTargetReachedEvent */
|
|
28
|
+
CameraTargetReached = "target-reached",
|
|
29
|
+
}
|
|
30
|
+
export class CameraTargetReachedEvent extends CustomEvent<{ controls: OrbitControls, type: "camera" | "lookat" }> {
|
|
31
|
+
constructor(ctrls: OrbitControls, type: "camera" | "lookat") {
|
|
32
|
+
super(OrbitControlsEventsType.CameraTargetReached, {
|
|
33
|
+
detail: {
|
|
34
|
+
controls: ctrls,
|
|
35
|
+
type: type,
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export class OrbitControls extends Behaviour implements ICameraController {
|
|
42
|
+
|
|
43
|
+
get isCameraController(): boolean {
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** The underlying three.js OrbitControls */
|
|
48
|
+
public get controls() {
|
|
49
|
+
return this._controls;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** The object being controlled by the OrbitControls (usually the camera) */
|
|
53
|
+
public get controllerObject(): Object3D | null {
|
|
54
|
+
return this._cameraObject;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** Register callback when user starts interacting with the orbit controls */
|
|
58
|
+
public onStartInteraction(callback: Function) {
|
|
59
|
+
this.controls?.addEventListener("start", callback as any);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** When enabled the scene will be automatically fitted into the camera view in onEnable */
|
|
63
|
+
@serializable()
|
|
64
|
+
autoFit: boolean = false;
|
|
65
|
+
@serializable()
|
|
66
|
+
enableRotate: boolean = true;
|
|
67
|
+
@serializable()
|
|
68
|
+
autoRotate: boolean = false;
|
|
69
|
+
@serializable()
|
|
70
|
+
autoRotateSpeed: number = 1.0;
|
|
71
|
+
@serializable()
|
|
72
|
+
enableKeys: boolean = true;
|
|
73
|
+
@serializable()
|
|
74
|
+
enableDamping: boolean = true;
|
|
75
|
+
@serializable()
|
|
76
|
+
dampingFactor: number = 0.1;
|
|
77
|
+
@serializable()
|
|
78
|
+
enableZoom: boolean = true;
|
|
79
|
+
@serializable()
|
|
80
|
+
minZoom: number = 0;
|
|
81
|
+
@serializable()
|
|
82
|
+
maxZoom: number = Infinity;
|
|
83
|
+
@serializable()
|
|
84
|
+
enablePan: boolean = true;
|
|
85
|
+
@serializable(LookAtConstraint)
|
|
86
|
+
lookAtConstraint: LookAtConstraint | null = null;
|
|
87
|
+
@serializable()
|
|
88
|
+
lookAtConstraint01: number = 1;
|
|
89
|
+
|
|
90
|
+
/** If true user input interrupts the camera from animating to a target */
|
|
91
|
+
@serializable()
|
|
92
|
+
allowInterrupt: boolean = true;
|
|
93
|
+
@serializable()
|
|
94
|
+
middleClickToFocus: boolean = true;
|
|
95
|
+
@serializable()
|
|
96
|
+
doubleClickToFocus: boolean = true;
|
|
97
|
+
// @serializable()
|
|
98
|
+
// zoomToCursor: boolean = false;
|
|
99
|
+
|
|
100
|
+
// remove once slerp works correctly
|
|
101
|
+
useSlerp: boolean = true;
|
|
102
|
+
|
|
103
|
+
debugLog: boolean = false;
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* @deprecated use `targetLerpDuration` instead
|
|
107
|
+
* ~~The speed at which the camera target and the camera will be lerping to their destinations (if set via script or user input)~~
|
|
108
|
+
* */
|
|
109
|
+
get targetLerpSpeed() { return 5 }
|
|
110
|
+
set targetLerpSpeed(v) { this.targetLerpDuration = 1 / v; }
|
|
111
|
+
|
|
112
|
+
/** The duration in seconds it takes for the camera look ad and position lerp to reach their destination (when set via `setCameraTargetPosition` and `setLookTargetPosition`) */
|
|
113
|
+
@serializable()
|
|
114
|
+
targetLerpDuration = 1;
|
|
115
|
+
|
|
116
|
+
/** When enabled OrbitControls will automatically raycast find a look at target in start */
|
|
117
|
+
autoTarget: boolean = true;
|
|
118
|
+
|
|
119
|
+
private _controls: ThreeOrbitControls | null = null;
|
|
120
|
+
private _cameraObject: Object3D | null = null;
|
|
121
|
+
|
|
122
|
+
private _lookTargetLerpActive: boolean = false;
|
|
123
|
+
private _lookTargetStartPosition: Vector3 = new Vector3();
|
|
124
|
+
private _lookTargetEndPosition: Vector3 = new Vector3();
|
|
125
|
+
private _lookTargetLerp01: number = 0;
|
|
126
|
+
private _lookTargetLerpDuration: number = 0;
|
|
127
|
+
|
|
128
|
+
private _cameraLerpActive: boolean = false;
|
|
129
|
+
private _cameraStartPosition: Vector3 = new Vector3();
|
|
130
|
+
private _cameraEndPosition: Vector3 = new Vector3();
|
|
131
|
+
private _cameraLerp01: number = 0;
|
|
132
|
+
private _cameraLerpDuration: number = 0;
|
|
133
|
+
|
|
134
|
+
private _inputs: number = 0;
|
|
135
|
+
private _enableTime: number = 0; // use to disable double click when double clicking on UI
|
|
136
|
+
private _startedListeningToKeyEvents: boolean = false;
|
|
137
|
+
|
|
138
|
+
private _eventSystem?: EventSystem;
|
|
139
|
+
private _afterHandleInputFn?: any;
|
|
140
|
+
private _camera: Camera | null = null;
|
|
141
|
+
private _syncedTransform?: SyncedTransform;
|
|
142
|
+
private _didStart = false;
|
|
143
|
+
|
|
144
|
+
targetElement: HTMLElement | null = null;
|
|
145
|
+
|
|
146
|
+
awake(): void {
|
|
147
|
+
this._didStart = false;
|
|
148
|
+
this._startedListeningToKeyEvents = false;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
start() {
|
|
152
|
+
this._didStart = true;
|
|
153
|
+
if (this.autoTarget) {
|
|
154
|
+
if (this._controls) {
|
|
155
|
+
const camGo = GameObject.getComponent(this.gameObject, Camera);
|
|
156
|
+
if (camGo && !this.setLookTargetFromConstraint()) {
|
|
157
|
+
if (this.debugLog)
|
|
158
|
+
console.log("NO TARGET");
|
|
159
|
+
const worldPosition = getWorldPosition(camGo.cam);
|
|
160
|
+
const distanceToCenter = worldPosition.length();
|
|
161
|
+
const forward = new Vector3(0, 0, -distanceToCenter).applyMatrix4(camGo.cam.matrixWorld);
|
|
162
|
+
this.setLookTargetPosition(forward, true);
|
|
163
|
+
}
|
|
164
|
+
if (this.autoTarget && !this.setLookTargetFromConstraint()) {
|
|
165
|
+
const opts = new RaycastOptions();
|
|
166
|
+
// center of the screen:
|
|
167
|
+
opts.screenPoint = new Vector2(0, 0);
|
|
168
|
+
opts.lineThreshold = 0.1;
|
|
169
|
+
const hits = this.context.physics.raycast(opts);
|
|
170
|
+
if (hits.length > 0) {
|
|
171
|
+
this.setLookTargetPosition(hits[0].point, true);
|
|
172
|
+
}
|
|
173
|
+
if (debugCameraFit)
|
|
174
|
+
console.log("OrbitControls hits", ...hits);
|
|
175
|
+
}
|
|
176
|
+
if (this.autoFit) this.fitCamera()
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
this._eventSystem = EventSystem.get(this.context) ?? undefined;
|
|
181
|
+
if (this._eventSystem) {
|
|
182
|
+
this._afterHandleInputFn = this.afterHandleInput.bind(this);
|
|
183
|
+
this._eventSystem.addEventListener(EventSystemEvents.AfterHandleInput, this._afterHandleInputFn!);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
onDestroy() {
|
|
188
|
+
this._controls?.dispose();
|
|
189
|
+
this._eventSystem?.removeEventListener(EventSystemEvents.AfterHandleInput, this._afterHandleInputFn!);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
onEnable() {
|
|
193
|
+
this._enableTime = this.context.time.time;
|
|
194
|
+
const cameraComponent = GameObject.getComponent(this.gameObject, Camera);
|
|
195
|
+
this._camera = cameraComponent;
|
|
196
|
+
const cam = cameraComponent?.cam;
|
|
197
|
+
if (cam) setCameraController(cam, this, true);
|
|
198
|
+
if (!this._controls) {
|
|
199
|
+
if (!cam) {
|
|
200
|
+
console.warn("OrbitControls: Requires a Camera component on the same object as this component.");
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
if (cam)
|
|
204
|
+
this._cameraObject = cam;
|
|
205
|
+
// Using the parent if possible to make it possible to disable input on the canvas
|
|
206
|
+
// for having HTML content behind it and still receive input
|
|
207
|
+
const element = this.targetElement ?? this.context.renderer.domElement;
|
|
208
|
+
// HACK: workaround for three orbit controls forcing an update when being created....
|
|
209
|
+
const mat = cam?.quaternion.clone();
|
|
210
|
+
this._controls = new ThreeOrbitControls(cam!, element);
|
|
211
|
+
cam?.quaternion.copy(mat!)
|
|
212
|
+
if (defaultKeys === undefined) defaultKeys = { ...this._controls.keys };
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
if (this._controls) {
|
|
216
|
+
if (freeCam) {
|
|
217
|
+
this.enablePan = true;
|
|
218
|
+
this.enableZoom = true;
|
|
219
|
+
this.middleClickToFocus = true;
|
|
220
|
+
if (isMobileDevice()) this.doubleClickToFocus = true;
|
|
221
|
+
}
|
|
222
|
+
this._controls.addEventListener("start", this.onControlsChangeStarted);
|
|
223
|
+
if (cam?.type === "PerspectiveCamera") {
|
|
224
|
+
if (freeCam) {
|
|
225
|
+
// dont set limits
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
this._controls.minDistance = this.minZoom;
|
|
229
|
+
this._controls.maxDistance = this.maxZoom;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
if (freeCam) {
|
|
234
|
+
// dont set limits
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
this._controls.minZoom = this.minZoom;
|
|
238
|
+
this._controls.maxZoom = this.maxZoom;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
if (!this._startedListeningToKeyEvents) {
|
|
243
|
+
this._startedListeningToKeyEvents = true;
|
|
244
|
+
this._controls.listenToKeyEvents(window.document.body);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
this._syncedTransform = GameObject.getComponent(this.gameObject, SyncedTransform) ?? undefined;
|
|
248
|
+
// if we autofit in onEnable then DragControls will trigger fitting every time (because they disable OrbitControls)
|
|
249
|
+
// that's confusing and not what we want
|
|
250
|
+
// if (this._didStart) {
|
|
251
|
+
// if (this.autoFit) this.fitCamera()
|
|
252
|
+
// }
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
onDisable() {
|
|
256
|
+
if (this._camera?.cam) {
|
|
257
|
+
setCameraController(this._camera.cam, this, false);
|
|
258
|
+
}
|
|
259
|
+
if (this._controls) {
|
|
260
|
+
this._controls.enabled = false;
|
|
261
|
+
this._controls.autoRotate = false;
|
|
262
|
+
this._controls.removeEventListener("start", this.onControlsChangeStarted);
|
|
263
|
+
// this._controls.reset();
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
private onControlsChangeStarted = () => {
|
|
268
|
+
if (this._syncedTransform) {
|
|
269
|
+
this._syncedTransform.requestOwnership();
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
private _shouldDisable: boolean = false;
|
|
274
|
+
private afterHandleInput(evt: CustomEvent<AfterHandleInputEvent>) {
|
|
275
|
+
if (evt.detail.args.pointerId === 0) {
|
|
276
|
+
if (evt.detail.args.isDown) {
|
|
277
|
+
if (this._controls && this._eventSystem) {
|
|
278
|
+
this._shouldDisable = this._eventSystem.hasActiveUI;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
else if (!evt.detail.args.isPressed || evt.detail.args.isUp) {
|
|
282
|
+
this._shouldDisable = false;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
onBeforeRender() {
|
|
289
|
+
if (!this._controls) return;
|
|
290
|
+
if (this._cameraObject !== this.context.mainCamera) return;
|
|
291
|
+
|
|
292
|
+
if (this.context.input.getPointerDown(1) || this.context.input.getPointerDown(2) || this.context.input.mouseWheelChanged || (this.context.input.getPointerPressed(0) && this.context.input.getPointerPositionDelta(0)?.length() || 0 > .1)) {
|
|
293
|
+
this._inputs += 1;
|
|
294
|
+
}
|
|
295
|
+
if (this._inputs > 0 && this.allowInterrupt) {
|
|
296
|
+
// if a user has disabled rotation but enabled auto rotate we don't want to change it when we receive input
|
|
297
|
+
if (this.enableRotate) {
|
|
298
|
+
this.autoRotate = false;
|
|
299
|
+
}
|
|
300
|
+
this._cameraLerpActive = false;
|
|
301
|
+
this._lookTargetLerpActive = false;
|
|
302
|
+
}
|
|
303
|
+
this._inputs = 0;
|
|
304
|
+
|
|
305
|
+
let focusAtPointer = (this.middleClickToFocus && this.context.input.getPointerClicked(1));
|
|
306
|
+
focusAtPointer ||= (this.doubleClickToFocus && this.context.input.getPointerDoubleClicked(0) && this.context.time.time - this._enableTime > .3);
|
|
307
|
+
if (focusAtPointer) {
|
|
308
|
+
this.setTargetFromRaycast();
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
if (this._lookTargetLerpActive || this._cameraLerpActive) {
|
|
312
|
+
|
|
313
|
+
// lerp the camera
|
|
314
|
+
if (this._cameraLerpActive && this._cameraObject) {
|
|
315
|
+
this._cameraLerp01 += this.context.time.deltaTime / this._cameraLerpDuration;
|
|
316
|
+
if (this._cameraLerp01 >= 1) {
|
|
317
|
+
this._cameraObject.position.copy(this._cameraEndPosition);
|
|
318
|
+
this._cameraLerpActive = false;
|
|
319
|
+
this.dispatchEvent(new CameraTargetReachedEvent(this, "camera"));
|
|
320
|
+
}
|
|
321
|
+
else {
|
|
322
|
+
const t = Mathf.easeInOutCubic(this._cameraLerp01);
|
|
323
|
+
this._cameraObject.position.lerpVectors(this._cameraStartPosition, this._cameraEndPosition, t);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
// lerp the look target
|
|
328
|
+
if (this._lookTargetLerpActive) {
|
|
329
|
+
this._lookTargetLerp01 += this.context.time.deltaTime / this._lookTargetLerpDuration;
|
|
330
|
+
if (this._lookTargetLerp01 >= 1) {
|
|
331
|
+
this._controls.target.copy(this._lookTargetEndPosition);
|
|
332
|
+
this._lookTargetLerpActive = false;
|
|
333
|
+
this.dispatchEvent(new CameraTargetReachedEvent(this, "lookat"));
|
|
334
|
+
} else {
|
|
335
|
+
const t = Mathf.easeInOutCubic(this._lookTargetLerp01);
|
|
336
|
+
this._controls.target.lerpVectors(this._lookTargetStartPosition, this._lookTargetEndPosition, t);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
|
|
342
|
+
if (this._controls) {
|
|
343
|
+
if (this.debugLog)
|
|
344
|
+
this._controls.domElement = this.context.renderer.domElement;
|
|
345
|
+
this._controls.enabled = !this._shouldDisable && this._camera === this.context.mainCameraComponent && !this.context.isInXR;
|
|
346
|
+
this._controls.keys = this.enableKeys ? defaultKeys : disabledKeys;
|
|
347
|
+
this._controls.autoRotate = this.autoRotate;
|
|
348
|
+
this._controls.autoRotateSpeed = this.autoRotateSpeed;
|
|
349
|
+
this._controls.enableZoom = this.enableZoom;
|
|
350
|
+
this._controls.enableDamping = this.enableDamping;
|
|
351
|
+
this._controls.dampingFactor = this.dampingFactor;
|
|
352
|
+
this._controls.enablePan = this.enablePan;
|
|
353
|
+
this._controls.enableRotate = this.enableRotate;
|
|
354
|
+
|
|
355
|
+
if (typeof smoothcam === "number" || smoothcam === true) {
|
|
356
|
+
this._controls.enableDamping = true;
|
|
357
|
+
const factor = typeof smoothcam === "number" ? smoothcam : .99;
|
|
358
|
+
this._controls.dampingFactor = Math.max(.001, 1 - Math.min(1, factor));
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
if (!this.allowInterrupt) {
|
|
362
|
+
if (this._lookTargetLerpActive) {
|
|
363
|
+
this._controls.enablePan = false;
|
|
364
|
+
}
|
|
365
|
+
if (this._cameraLerpActive) {
|
|
366
|
+
this._controls.enableRotate = false;
|
|
367
|
+
this._controls.autoRotate = false;
|
|
368
|
+
}
|
|
369
|
+
if (this._lookTargetLerpActive || this._cameraLerpActive) {
|
|
370
|
+
this._controls.enableZoom = false;
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
//@ts-ignore
|
|
374
|
+
// this._controls.zoomToCursor = this.zoomToCursor;
|
|
375
|
+
if (!this.context.isInXR) {
|
|
376
|
+
if (!freeCam && this.lookAtConstraint?.locked) this.setLookTargetFromConstraint(0, this.lookAtConstraint01);
|
|
377
|
+
this._controls.update();
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
|
|
384
|
+
/**
|
|
385
|
+
* Sets camera target position and look direction. Does perform a raycast in the forward direction of the passed in object to find an orbit point
|
|
386
|
+
*/
|
|
387
|
+
public setCameraAndLookTarget(target: Object3D) {
|
|
388
|
+
if (!target || !(target instanceof Object3D)) return;
|
|
389
|
+
const worldPosition = getWorldPosition(target);
|
|
390
|
+
const forward = getWorldDirection(target);
|
|
391
|
+
this.setTargetFromRaycast(new Ray(worldPosition, forward));
|
|
392
|
+
this.setCameraTargetPosition(worldPosition);
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
/** Moves the camera to position smoothly.
|
|
396
|
+
* @param position The position in local space of the controllerObject to move the camera to. If null the camera will stop lerping to the target.
|
|
397
|
+
*/
|
|
398
|
+
public setCameraTargetPosition(position?: Object3D | Vector3 | null, immediateOrDuration: boolean | number = false) {
|
|
399
|
+
if (!position) return;
|
|
400
|
+
if (position instanceof Object3D) {
|
|
401
|
+
position = getWorldPosition(position) as Vector3;
|
|
402
|
+
}
|
|
403
|
+
if (!this._cameraEndPosition) this._cameraEndPosition = new Vector3();
|
|
404
|
+
this._cameraEndPosition.copy(position);
|
|
405
|
+
if (immediateOrDuration === true) {
|
|
406
|
+
this._cameraLerpActive = false;
|
|
407
|
+
this.controllerObject?.position.copy(this._cameraEndPosition);
|
|
408
|
+
}
|
|
409
|
+
else if (this._cameraObject) {
|
|
410
|
+
this._cameraLerpActive = true;
|
|
411
|
+
this._cameraLerp01 = 0;
|
|
412
|
+
this._cameraStartPosition.copy(this._cameraObject?.position);
|
|
413
|
+
if (typeof immediateOrDuration === "number") {
|
|
414
|
+
this._cameraLerpDuration = immediateOrDuration;
|
|
415
|
+
}
|
|
416
|
+
else this._cameraLerpDuration = this.targetLerpDuration;
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
/** True while the camera position is being lerped */
|
|
420
|
+
get cameraLerpActive() { return this._cameraLerpActive; }
|
|
421
|
+
/** Call to stop camera position lerping */
|
|
422
|
+
public stopCameraLerp() {
|
|
423
|
+
this._cameraLerpActive = false;
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
/** Moves the camera look-at target to a position smoothly. */
|
|
427
|
+
public setLookTargetPosition(position: Object3D | Vector3 | null = null, immediateOrDuration: boolean = false) {
|
|
428
|
+
if (!this._controls) return;
|
|
429
|
+
if (!position) return
|
|
430
|
+
if (position instanceof Object3D) {
|
|
431
|
+
position = getWorldPosition(position) as Vector3;
|
|
432
|
+
}
|
|
433
|
+
this._lookTargetEndPosition.copy(position);
|
|
434
|
+
|
|
435
|
+
if (immediateOrDuration === true) {
|
|
436
|
+
this._controls.target.copy(this._lookTargetEndPosition);
|
|
437
|
+
}
|
|
438
|
+
else {
|
|
439
|
+
this._lookTargetLerpActive = true;
|
|
440
|
+
this._lookTargetLerp01 = 0;
|
|
441
|
+
this._lookTargetStartPosition.copy(this._controls.target);
|
|
442
|
+
if (typeof immediateOrDuration === "number") {
|
|
443
|
+
this._lookTargetLerpDuration = immediateOrDuration;
|
|
444
|
+
}
|
|
445
|
+
else this._lookTargetLerpDuration = this.targetLerpDuration;
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
/** True while the camera look target is being lerped */
|
|
449
|
+
get lookTargetLerpActive() { return this._lookTargetLerpActive; }
|
|
450
|
+
/** Call to stop camera look target lerping */
|
|
451
|
+
public stopLookTargetLerp() {
|
|
452
|
+
this._lookTargetLerpActive = false;
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
/** Sets the look at target from an assigned lookAtConstraint source by index */
|
|
456
|
+
private setLookTargetFromConstraint(index: number = 0, t: number = 1): boolean {
|
|
457
|
+
if (!this._controls) return false;
|
|
458
|
+
const sources = this.lookAtConstraint?.sources;
|
|
459
|
+
if (sources && sources.length > 0) {
|
|
460
|
+
const target = sources[index];
|
|
461
|
+
if (target) {
|
|
462
|
+
target.getWorldPosition(this._lookTargetEndPosition);
|
|
463
|
+
this.lerpLookTarget(this._lookTargetEndPosition, t);
|
|
464
|
+
return true;
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
return false;
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
/** @deprecated use `controls.target.lerp(position, delta)` */
|
|
471
|
+
public lerpTarget(position: Vector3, delta: number) { return this.lerpLookTarget(position, delta); }
|
|
472
|
+
|
|
473
|
+
private lerpLookTarget(position: Vector3, delta: number) {
|
|
474
|
+
if (!this._controls) return;
|
|
475
|
+
if (delta >= 1) this._controls.target.copy(position);
|
|
476
|
+
else this._controls.target.lerp(position, delta);
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
private setTargetFromRaycast(ray?: Ray) {
|
|
480
|
+
if (!this.controls) return;
|
|
481
|
+
const rc = ray ? this.context.physics.raycastFromRay(ray) : this.context.physics.raycast();
|
|
482
|
+
for (const hit of rc) {
|
|
483
|
+
if (hit.distance > 0 && GameObject.isActiveInHierarchy(hit.object)) {
|
|
484
|
+
|
|
485
|
+
const uiComponent = tryGetUIComponent(hit.object);
|
|
486
|
+
if (uiComponent) {
|
|
487
|
+
const canvas = uiComponent.canvas;
|
|
488
|
+
if (canvas?.screenspace) {
|
|
489
|
+
break;
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
this.setLookTargetPosition(hit.point);
|
|
494
|
+
|
|
495
|
+
if (this.context.mainCamera) {
|
|
496
|
+
const pos = getWorldPosition(this.context.mainCamera);
|
|
497
|
+
const cameraTarget = pos.clone().sub(this.controls.target).add(this._lookTargetEndPosition);
|
|
498
|
+
this._cameraObject?.parent?.worldToLocal(cameraTarget);
|
|
499
|
+
this.setCameraTargetPosition(cameraTarget);
|
|
500
|
+
}
|
|
501
|
+
break;
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
// Adapted from https://discourse.threejs.org/t/camera-zoom-to-fit-object/936/24
|
|
507
|
+
// Slower but better implementation that takes bones and exact vertex positions into account: https://github.com/google/model-viewer/blob/04e900c5027de8c5306fe1fe9627707f42811b05/packages/model-viewer/src/three-components/ModelScene.ts#L321
|
|
508
|
+
/** Fits the camera to show the objects provided (defaults to the scene if no objects are passed in) */
|
|
509
|
+
fitCamera(objects?: Array<Object3D>, fitOffset: number = 1.1, immediate: boolean = true) {
|
|
510
|
+
const camera = this._cameraObject as PerspectiveCamera;
|
|
511
|
+
const controls = this._controls as ThreeOrbitControls | null;
|
|
512
|
+
if (!objects?.length) objects = this.context.scene.children;
|
|
513
|
+
if (objects.length <= 0) return;
|
|
514
|
+
|
|
515
|
+
if (!camera || !controls) return;
|
|
516
|
+
|
|
517
|
+
const size = new Vector3();
|
|
518
|
+
const center = new Vector3();
|
|
519
|
+
const box = new Box3();
|
|
520
|
+
|
|
521
|
+
// TODO would be much better to calculate the bounds in camera space instead of world space -
|
|
522
|
+
// we would get proper view-dependant fit.
|
|
523
|
+
// Right now it's independent from where the camera is actually looking from,
|
|
524
|
+
// and thus we're just getting some maximum that will work for sure.
|
|
525
|
+
|
|
526
|
+
box.makeEmpty();
|
|
527
|
+
const emptyChildren = [];
|
|
528
|
+
function expandByObjectRecursive(obj: Object3D) {
|
|
529
|
+
let allowExpanding = true;
|
|
530
|
+
// we dont want to check invisible objects
|
|
531
|
+
if (!obj.visible) return;
|
|
532
|
+
if (useForAutoFit(obj) === false) return;
|
|
533
|
+
if(obj.type === "TransformControlsGizmo" || obj.type === "TransformControlsPlane") return;
|
|
534
|
+
// ignore Box3Helpers
|
|
535
|
+
if (obj instanceof Box3Helper) allowExpanding = false;
|
|
536
|
+
if (obj instanceof GridHelper) allowExpanding = false;
|
|
537
|
+
// ignore GroundProjectedEnv
|
|
538
|
+
if (obj instanceof GroundProjectedSkybox) allowExpanding = false;
|
|
539
|
+
// // Ignore shadow catcher geometry
|
|
540
|
+
if ((obj as Mesh).material instanceof ShadowMaterial) allowExpanding = false;
|
|
541
|
+
// ONLY fit meshes
|
|
542
|
+
if (!(obj instanceof Mesh)) allowExpanding = false;
|
|
543
|
+
// Ignore things parented to the camera + ignore the camera
|
|
544
|
+
if (obj === camera) return;
|
|
545
|
+
// We don't want to fit UI objects
|
|
546
|
+
if (obj["isUI"] === true) return;
|
|
547
|
+
// If we encountered some geometry that should be ignored
|
|
548
|
+
// Then we don't want to use that for expanding the view
|
|
549
|
+
if (allowExpanding) {
|
|
550
|
+
if (debugCameraFit)
|
|
551
|
+
console.log(obj.name, obj.type, obj);
|
|
552
|
+
// Temporary override children
|
|
553
|
+
const children_length = obj.children;
|
|
554
|
+
obj.children = emptyChildren;
|
|
555
|
+
// TODO: validate that object doesn't contain NaN values
|
|
556
|
+
const pos = obj.position;
|
|
557
|
+
const scale = obj.scale;
|
|
558
|
+
if (Number.isNaN(pos.x) || Number.isNaN(pos.y) || Number.isNaN(pos.z)) {
|
|
559
|
+
console.warn(`Object \"${obj.name}\" has NaN values in position or scale.... will ignore it`, pos, scale);
|
|
560
|
+
return;
|
|
561
|
+
}
|
|
562
|
+
box.expandByObject(obj, true);
|
|
563
|
+
obj.children = children_length;
|
|
564
|
+
}
|
|
565
|
+
for (const child of obj.children) {
|
|
566
|
+
expandByObjectRecursive(child);
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
for (const object of objects) {
|
|
570
|
+
object.updateMatrixWorld();
|
|
571
|
+
expandByObjectRecursive(object);
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
camera.updateMatrixWorld();
|
|
575
|
+
camera.updateProjectionMatrix();
|
|
576
|
+
box.getCenter(center);
|
|
577
|
+
|
|
578
|
+
// project this box into camera space
|
|
579
|
+
box.applyMatrix4(camera.matrixWorldInverse);
|
|
580
|
+
|
|
581
|
+
box.getSize(size);
|
|
582
|
+
box.setFromCenterAndSize(center, size);
|
|
583
|
+
if( Number.isNaN(size.x) || Number.isNaN(size.y) || Number.isNaN(size.z)){
|
|
584
|
+
console.warn("Camera fit size resultet in NaN", camera, box, [...objects]);
|
|
585
|
+
return;
|
|
586
|
+
}
|
|
587
|
+
if (size.length() <= 0.0000000001) {
|
|
588
|
+
if (debugCameraFit) console.warn("Camera fit size is zero", box, [...objects]);
|
|
589
|
+
return;
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
const verticalFov = camera.fov;
|
|
593
|
+
const horizontalFov = 2 * Math.atan(Math.tan(verticalFov * Math.PI / 360 / 2) * camera.aspect) / Math.PI * 360;
|
|
594
|
+
const fitHeightDistance = size.y / (2 * Math.atan(Math.PI * verticalFov / 360));
|
|
595
|
+
const fitWidthDistance = size.x / (2 * Math.atan(Math.PI * horizontalFov / 360));
|
|
596
|
+
|
|
597
|
+
const distance = fitOffset * Math.max(fitHeightDistance, fitWidthDistance) + size.z / 2;
|
|
598
|
+
|
|
599
|
+
if (debugCameraFit) {
|
|
600
|
+
console.log("Fit camera to objects", fitHeightDistance, fitWidthDistance, "distance", distance);
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
const cameraWp = getWorldPosition(camera);
|
|
604
|
+
const direction = controls.target.clone()
|
|
605
|
+
.sub(cameraWp)
|
|
606
|
+
.normalize()
|
|
607
|
+
.multiplyScalar(distance);
|
|
608
|
+
|
|
609
|
+
controls.maxDistance = distance * 10;
|
|
610
|
+
controls.minDistance = distance * 0.01;
|
|
611
|
+
|
|
612
|
+
this.setLookTargetPosition(center, immediate);
|
|
613
|
+
this.autoTarget = false;
|
|
614
|
+
|
|
615
|
+
// TODO: this doesnt take the Camera component nearClipPlane into account
|
|
616
|
+
camera.near = distance / 100;
|
|
617
|
+
camera.far = distance * 100;
|
|
618
|
+
|
|
619
|
+
camera.updateMatrixWorld();
|
|
620
|
+
camera.updateProjectionMatrix();
|
|
621
|
+
|
|
622
|
+
if (camera.parent) {
|
|
623
|
+
const cameraLocalPosition = camera.parent!.worldToLocal(controls.target.clone().sub(direction));
|
|
624
|
+
this.setCameraTargetPosition(cameraLocalPosition, immediate);
|
|
625
|
+
}
|
|
626
|
+
else console.error(`Can not fit camera ${camera.name} because it has no parent`)
|
|
627
|
+
|
|
628
|
+
// setWorldPosition(camera, controls.target.clone().sub(direction));
|
|
629
|
+
|
|
630
|
+
if (debugCameraFit) {
|
|
631
|
+
const helper = new Box3Helper(box);
|
|
632
|
+
this.context.scene.add(helper);
|
|
633
|
+
setWorldRotation(helper, getWorldRotation(camera));
|
|
634
|
+
|
|
635
|
+
if (!this._haveAttachedKeyboardEvents) {
|
|
636
|
+
this._haveAttachedKeyboardEvents = true;
|
|
637
|
+
document.body.addEventListener("keydown", (e) => {
|
|
638
|
+
if (e.code === "KeyF") {
|
|
639
|
+
this.fitCamera(objects);
|
|
640
|
+
}
|
|
641
|
+
});
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
controls.update();
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
private _haveAttachedKeyboardEvents: boolean = false;
|
|
649
|
+
|
|
650
|
+
// private onPositionDrag(){
|
|
651
|
+
|
|
652
|
+
// }
|
|
653
|
+
}
|