@needle-tools/engine 4.7.2-alpha → 4.7.2-next.6f2cd71
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +3782 -3782
- package/LICENSE.md +10 -10
- package/README.md +64 -64
- package/components.needle.json +1 -1
- package/dist/generateMeshBVH.worker-BaNp_Xtp.js +25 -0
- package/dist/{gltf-progressive-zdhlW609.umd.cjs → gltf-progressive-B9o1T8Vr.umd.cjs} +1 -1
- package/dist/{gltf-progressive-YjtQYFa9.js → gltf-progressive-DO0SisAM.js} +2 -2
- package/dist/{gltf-progressive-yOP1mp5W.min.js → gltf-progressive-DQF10PJE.min.js} +1 -1
- package/dist/{needle-engine.bundle-BhDF-YSv.min.js → needle-engine.bundle-B-NoV0t_.min.js} +64 -64
- package/dist/{needle-engine.bundle-D2myV4E4.umd.cjs → needle-engine.bundle-BMnlxDfi.umd.cjs} +59 -59
- package/dist/{needle-engine.bundle-gp00DTS4.js → needle-engine.bundle-CFi0ugBx.js} +638 -638
- package/dist/needle-engine.d.ts +130 -129
- package/dist/needle-engine.js +4 -4
- package/dist/needle-engine.min.js +1 -1
- package/dist/needle-engine.umd.cjs +1 -1
- package/dist/{postprocessing-8AQTeZsr.umd.cjs → postprocessing-CjW23fio.umd.cjs} +2 -2
- package/dist/{postprocessing-BkxN_08g.js → postprocessing-DYLNOL3W.js} +3 -3
- package/dist/{postprocessing-BDScN9yu.min.js → postprocessing-xYQWCHFu.min.js} +2 -2
- package/dist/{three-DMrv-4ar.umd.cjs → three-B_hneGZr.umd.cjs} +4 -4
- package/dist/{three-Bz6X1mrw.js → three-DrqIzZTH.js} +4198 -4198
- package/dist/{three-Boa-jOq-.min.js → three-DuDKwKB8.min.js} +33 -33
- package/dist/{three-examples-GggCDHv0.js → three-examples-B50TT3Iu.js} +5 -5
- package/dist/{three-examples-DuVhxqft.min.js → three-examples-DaDLBuy6.min.js} +14 -14
- package/dist/{three-examples-C7ryg8vN.umd.cjs → three-examples-X3OadjXB.umd.cjs} +3 -3
- package/dist/{three-mesh-ui-CY6Izc7C.min.js → three-mesh-ui-B3p3gyUz.min.js} +1 -1
- package/dist/{three-mesh-ui-CwlN0FUC.umd.cjs → three-mesh-ui-CQiIQIlA.umd.cjs} +1 -1
- package/dist/{three-mesh-ui-CLNOfsWn.js → three-mesh-ui-CxuWt7m-.js} +1 -1
- package/dist/{vendor-zxXa3Dmr.min.js → vendor-BlSxe9JJ.min.js} +3 -3
- package/dist/{vendor-BSD1RQIh.js → vendor-BmYIgaS1.js} +3 -3
- package/dist/{vendor-DHr4aqIZ.umd.cjs → vendor-Cavtu3CP.umd.cjs} +3 -3
- package/lib/asap/needle-asap.d.ts +1 -1
- package/lib/asap/needle-asap.js +95 -95
- package/lib/asap/sessiongranted.d.ts +3 -3
- package/lib/asap/sessiongranted.js +65 -65
- package/lib/asap/utils.d.ts +1 -1
- package/lib/asap/utils.js +3 -3
- package/lib/engine/analytics/index.d.ts +6 -6
- package/lib/engine/analytics/index.js +12 -12
- package/lib/engine/analytics/lcp.d.ts +3 -3
- package/lib/engine/analytics/lcp.js +34 -34
- package/lib/engine/api.d.ts +82 -82
- package/lib/engine/api.js +81 -81
- package/lib/engine/assets/index.d.ts +11 -11
- package/lib/engine/assets/index.js +47 -47
- package/lib/engine/assets/static.d.ts +1 -1
- package/lib/engine/assets/static.js +4 -4
- package/lib/engine/codegen/register_types.d.ts +1 -1
- package/lib/engine/codegen/register_types.js +300 -300
- package/lib/engine/debug/debug.d.ts +15 -15
- package/lib/engine/debug/debug.js +44 -44
- package/lib/engine/debug/debug_console.d.ts +2 -2
- package/lib/engine/debug/debug_console.js +307 -307
- package/lib/engine/debug/debug_overlay.d.ts +22 -22
- package/lib/engine/debug/debug_overlay.js +316 -316
- package/lib/engine/debug/debug_spatial_console.d.ts +2 -2
- package/lib/engine/debug/debug_spatial_console.js +390 -390
- package/lib/engine/debug/index.d.ts +2 -2
- package/lib/engine/debug/index.js +2 -2
- package/lib/engine/engine_addressables.d.ts +164 -164
- package/lib/engine/engine_addressables.js +601 -601
- package/lib/engine/engine_animation.d.ts +43 -43
- package/lib/engine/engine_animation.js +133 -133
- package/lib/engine/engine_application.d.ts +45 -45
- package/lib/engine/engine_application.js +104 -104
- package/lib/engine/engine_assetdatabase.d.ts +25 -25
- package/lib/engine/engine_assetdatabase.js +346 -346
- package/lib/engine/engine_audio.d.ts +4 -4
- package/lib/engine/engine_audio.js +23 -23
- package/lib/engine/engine_camera.d.ts +13 -13
- package/lib/engine/engine_camera.js +30 -30
- package/lib/engine/engine_components.d.ts +110 -110
- package/lib/engine/engine_components.js +374 -374
- package/lib/engine/engine_components_internal.d.ts +9 -9
- package/lib/engine/engine_components_internal.js +36 -36
- package/lib/engine/engine_constants.d.ts +10 -10
- package/lib/engine/engine_constants.js +41 -41
- package/lib/engine/engine_context.d.ts +475 -475
- package/lib/engine/engine_context.js +1673 -1673
- package/lib/engine/engine_context_registry.d.ts +71 -71
- package/lib/engine/engine_context_registry.js +117 -117
- package/lib/engine/engine_coroutine.d.ts +35 -35
- package/lib/engine/engine_coroutine.js +52 -52
- package/lib/engine/engine_create_objects.d.ts +119 -119
- package/lib/engine/engine_create_objects.js +320 -320
- package/lib/engine/engine_default_parameters.d.ts +2 -2
- package/lib/engine/engine_default_parameters.js +3 -3
- package/lib/engine/engine_editor-sync.d.ts +21 -21
- package/lib/engine/engine_editor-sync.js +4 -4
- package/lib/engine/engine_fileloader.d.ts +2 -2
- package/lib/engine/engine_fileloader.js +8 -8
- package/lib/engine/engine_gameobject.d.ts +68 -68
- package/lib/engine/engine_gameobject.js +619 -619
- package/lib/engine/engine_generic_utils.d.ts +1 -1
- package/lib/engine/engine_generic_utils.js +13 -13
- package/lib/engine/engine_gizmos.d.ts +149 -149
- package/lib/engine/engine_gizmos.js +530 -530
- package/lib/engine/engine_gltf.d.ts +12 -12
- package/lib/engine/engine_gltf.js +15 -15
- package/lib/engine/engine_gltf_builtin_components.d.ts +11 -11
- package/lib/engine/engine_gltf_builtin_components.js +341 -341
- package/lib/engine/engine_hot_reload.d.ts +8 -8
- package/lib/engine/engine_hot_reload.js +197 -197
- package/lib/engine/engine_input.d.ts +362 -362
- package/lib/engine/engine_input.js +1294 -1294
- package/lib/engine/engine_input_utils.d.ts +2 -2
- package/lib/engine/engine_input_utils.js +22 -22
- package/lib/engine/engine_instancing.d.ts +19 -19
- package/lib/engine/engine_instancing.js +39 -39
- package/lib/engine/engine_license.d.ts +11 -11
- package/lib/engine/engine_license.js +369 -369
- package/lib/engine/engine_lifecycle_api.d.ts +83 -83
- package/lib/engine/engine_lifecycle_api.js +106 -106
- package/lib/engine/engine_lifecycle_functions_internal.d.ts +32 -32
- package/lib/engine/engine_lifecycle_functions_internal.js +146 -146
- package/lib/engine/engine_lightdata.d.ts +23 -23
- package/lib/engine/engine_lightdata.js +101 -101
- package/lib/engine/engine_loaders.callbacks.d.ts +97 -97
- package/lib/engine/engine_loaders.callbacks.js +86 -86
- package/lib/engine/engine_loaders.d.ts +48 -48
- package/lib/engine/engine_loaders.gltf.d.ts +13 -13
- package/lib/engine/engine_loaders.gltf.js +62 -62
- package/lib/engine/engine_loaders.js +337 -337
- package/lib/engine/engine_lods.d.ts +35 -35
- package/lib/engine/engine_lods.js +160 -160
- package/lib/engine/engine_mainloop_utils.d.ts +32 -32
- package/lib/engine/engine_mainloop_utils.js +466 -466
- package/lib/engine/engine_math.d.ts +114 -114
- package/lib/engine/engine_math.js +247 -247
- package/lib/engine/engine_modules.d.ts +36 -36
- package/lib/engine/engine_modules.js +85 -85
- package/lib/engine/engine_networking.d.ts +260 -260
- package/lib/engine/engine_networking.js +764 -764
- package/lib/engine/engine_networking_auto.d.ts +24 -24
- package/lib/engine/engine_networking_auto.js +310 -310
- package/lib/engine/engine_networking_blob.d.ts +48 -48
- package/lib/engine/engine_networking_blob.js +228 -228
- package/lib/engine/engine_networking_files.d.ts +35 -35
- package/lib/engine/engine_networking_files.js +172 -172
- package/lib/engine/engine_networking_files_default_components.d.ts +6 -6
- package/lib/engine/engine_networking_files_default_components.js +42 -42
- package/lib/engine/engine_networking_instantiate.d.ts +100 -100
- package/lib/engine/engine_networking_instantiate.js +345 -345
- package/lib/engine/engine_networking_peer.d.ts +15 -15
- package/lib/engine/engine_networking_peer.js +132 -132
- package/lib/engine/engine_networking_streams.d.ts +123 -123
- package/lib/engine/engine_networking_streams.js +645 -645
- package/lib/engine/engine_networking_types.d.ts +22 -22
- package/lib/engine/engine_networking_types.js +7 -7
- package/lib/engine/engine_networking_utils.d.ts +2 -2
- package/lib/engine/engine_networking_utils.js +20 -20
- package/lib/engine/engine_networking_websocket.d.ts +1 -1
- package/lib/engine/engine_networking_websocket.js +2 -2
- package/lib/engine/engine_patcher.d.ts +10 -10
- package/lib/engine/engine_patcher.js +142 -142
- package/lib/engine/engine_physics.d.ts +152 -152
- package/lib/engine/engine_physics.js +645 -645
- package/lib/engine/engine_physics.types.d.ts +40 -40
- package/lib/engine/engine_physics.types.js +33 -33
- package/lib/engine/engine_physics_rapier.d.ts +147 -147
- package/lib/engine/engine_physics_rapier.js +1433 -1433
- package/lib/engine/engine_playerview.d.ts +26 -26
- package/lib/engine/engine_playerview.js +64 -64
- package/lib/engine/engine_scenelighting.d.ts +71 -71
- package/lib/engine/engine_scenelighting.js +226 -226
- package/lib/engine/engine_serialization.d.ts +3 -3
- package/lib/engine/engine_serialization.js +3 -3
- package/lib/engine/engine_serialization_builtin_serializer.d.ts +72 -72
- package/lib/engine/engine_serialization_builtin_serializer.js +403 -403
- package/lib/engine/engine_serialization_core.d.ts +94 -94
- package/lib/engine/engine_serialization_core.js +607 -607
- package/lib/engine/engine_serialization_decorator.d.ts +23 -23
- package/lib/engine/engine_serialization_decorator.js +66 -66
- package/lib/engine/engine_setup.d.ts +1 -1
- package/lib/engine/engine_setup.js +2 -2
- package/lib/engine/engine_shaders.d.ts +53 -53
- package/lib/engine/engine_shaders.js +252 -252
- package/lib/engine/engine_shims.d.ts +4 -4
- package/lib/engine/engine_shims.js +24 -24
- package/lib/engine/engine_test_utils.d.ts +39 -39
- package/lib/engine/engine_test_utils.js +83 -83
- package/lib/engine/engine_texture.d.ts +28 -28
- package/lib/engine/engine_texture.js +64 -64
- package/lib/engine/engine_three_utils.d.ts +204 -204
- package/lib/engine/engine_three_utils.js +788 -788
- package/lib/engine/engine_time.d.ts +51 -51
- package/lib/engine/engine_time.js +82 -82
- package/lib/engine/engine_time_utils.d.ts +88 -88
- package/lib/engine/engine_time_utils.js +215 -215
- package/lib/engine/engine_tonemapping.d.ts +6 -6
- package/lib/engine/engine_tonemapping.js +197 -197
- package/lib/engine/engine_types.d.ts +578 -578
- package/lib/engine/engine_types.js +95 -95
- package/lib/engine/engine_typestore.d.ts +28 -28
- package/lib/engine/engine_typestore.js +55 -55
- package/lib/engine/engine_util_decorator.d.ts +13 -13
- package/lib/engine/engine_util_decorator.js +116 -116
- package/lib/engine/engine_utils.d.ts +248 -248
- package/lib/engine/engine_utils.js +1012 -1012
- package/lib/engine/engine_utils_format.d.ts +24 -24
- package/lib/engine/engine_utils_format.js +239 -239
- package/lib/engine/engine_utils_screenshot.d.ts +159 -159
- package/lib/engine/engine_utils_screenshot.js +522 -522
- package/lib/engine/engine_utils_screenshot.xr.d.ts +5 -5
- package/lib/engine/engine_utils_screenshot.xr.js +90 -90
- package/lib/engine/engine_xr.d.ts +1 -1
- package/lib/engine/engine_xr.js +1 -1
- package/lib/engine/export/gltf/Writers.d.ts +19 -19
- package/lib/engine/export/gltf/Writers.js +24 -24
- package/lib/engine/export/gltf/index.d.ts +11 -11
- package/lib/engine/export/gltf/index.js +123 -123
- package/lib/engine/export/index.d.ts +2 -2
- package/lib/engine/export/index.js +2 -2
- package/lib/engine/export/state.d.ts +7 -7
- package/lib/engine/export/state.js +17 -17
- package/lib/engine/export/utils.d.ts +2 -2
- package/lib/engine/export/utils.js +7 -7
- package/lib/engine/extensions/EXT_texture_exr.d.ts +8 -8
- package/lib/engine/extensions/EXT_texture_exr.js +32 -32
- package/lib/engine/extensions/NEEDLE_animator_controller_model.d.ts +122 -122
- package/lib/engine/extensions/NEEDLE_animator_controller_model.js +95 -95
- package/lib/engine/extensions/NEEDLE_components.d.ts +35 -35
- package/lib/engine/extensions/NEEDLE_components.js +220 -220
- package/lib/engine/extensions/NEEDLE_gameobject_data.d.ts +10 -10
- package/lib/engine/extensions/NEEDLE_gameobject_data.js +57 -57
- package/lib/engine/extensions/NEEDLE_lighting_settings.d.ts +37 -37
- package/lib/engine/extensions/NEEDLE_lighting_settings.js +157 -157
- package/lib/engine/extensions/NEEDLE_lightmaps.d.ts +18 -18
- package/lib/engine/extensions/NEEDLE_lightmaps.js +99 -99
- package/lib/engine/extensions/NEEDLE_persistent_assets.d.ts +11 -11
- package/lib/engine/extensions/NEEDLE_persistent_assets.js +63 -63
- package/lib/engine/extensions/NEEDLE_progressive.d.ts +1 -1
- package/lib/engine/extensions/NEEDLE_progressive.js +1 -1
- package/lib/engine/extensions/NEEDLE_render_objects.d.ts +13 -13
- package/lib/engine/extensions/NEEDLE_render_objects.js +159 -159
- package/lib/engine/extensions/NEEDLE_techniques_webgl.d.ts +38 -38
- package/lib/engine/extensions/NEEDLE_techniques_webgl.js +564 -564
- package/lib/engine/extensions/extension_resolver.d.ts +4 -4
- package/lib/engine/extensions/extension_resolver.js +1 -1
- package/lib/engine/extensions/extension_utils.d.ts +12 -12
- package/lib/engine/extensions/extension_utils.js +152 -152
- package/lib/engine/extensions/extensions.d.ts +32 -32
- package/lib/engine/extensions/extensions.js +107 -107
- package/lib/engine/extensions/index.d.ts +6 -6
- package/lib/engine/extensions/index.js +6 -6
- package/lib/engine/extensions/usage_tracker.d.ts +13 -13
- package/lib/engine/extensions/usage_tracker.js +65 -65
- package/lib/engine/js-extensions/Camera.d.ts +1 -1
- package/lib/engine/js-extensions/Camera.js +39 -39
- package/lib/engine/js-extensions/ExtensionUtils.d.ts +9 -9
- package/lib/engine/js-extensions/ExtensionUtils.js +67 -67
- package/lib/engine/js-extensions/Layers.d.ts +6 -6
- package/lib/engine/js-extensions/Layers.js +22 -22
- package/lib/engine/js-extensions/Object3D.d.ts +120 -120
- package/lib/engine/js-extensions/Object3D.js +136 -136
- package/lib/engine/js-extensions/RGBAColor.d.ts +23 -23
- package/lib/engine/js-extensions/RGBAColor.js +111 -111
- package/lib/engine/js-extensions/Vector.d.ts +3 -3
- package/lib/engine/js-extensions/Vector.js +13 -13
- package/lib/engine/js-extensions/index.d.ts +5 -5
- package/lib/engine/js-extensions/index.js +5 -5
- package/lib/engine/physics/workers/mesh-bvh/GenerateMeshBVHWorker.d.ts +4 -4
- package/lib/engine/physics/workers/mesh-bvh/GenerateMeshBVHWorker.js +79 -79
- package/lib/engine/shaders/shaderData.d.ts +55 -55
- package/lib/engine/shaders/shaderData.js +58 -58
- package/lib/engine/tests/test_utils.d.ts +2 -2
- package/lib/engine/tests/test_utils.js +53 -53
- package/lib/engine/webcomponents/WebXRButtons.d.ts +56 -56
- package/lib/engine/webcomponents/WebXRButtons.js +230 -230
- package/lib/engine/webcomponents/api.d.ts +5 -5
- package/lib/engine/webcomponents/api.js +4 -4
- package/lib/engine/webcomponents/buttons.d.ts +51 -51
- package/lib/engine/webcomponents/buttons.js +264 -264
- package/lib/engine/webcomponents/fonts.d.ts +9 -9
- package/lib/engine/webcomponents/fonts.js +32 -32
- package/lib/engine/webcomponents/icons.d.ts +9 -9
- package/lib/engine/webcomponents/icons.js +52 -52
- package/lib/engine/webcomponents/index.d.ts +1 -1
- package/lib/engine/webcomponents/index.js +1 -1
- package/lib/engine/webcomponents/logo-element.d.ts +10 -10
- package/lib/engine/webcomponents/logo-element.js +67 -67
- package/lib/engine/webcomponents/needle menu/needle-menu-spatial.d.ts +37 -37
- package/lib/engine/webcomponents/needle menu/needle-menu-spatial.js +513 -513
- package/lib/engine/webcomponents/needle menu/needle-menu.d.ts +155 -155
- package/lib/engine/webcomponents/needle menu/needle-menu.js +1029 -1029
- package/lib/engine/webcomponents/needle-button.d.ts +34 -34
- package/lib/engine/webcomponents/needle-button.js +161 -161
- package/lib/engine/webcomponents/needle-engine.ar-overlay.d.ts +21 -21
- package/lib/engine/webcomponents/needle-engine.ar-overlay.js +166 -166
- package/lib/engine/webcomponents/needle-engine.attributes.d.ts +69 -69
- package/lib/engine/webcomponents/needle-engine.attributes.js +1 -1
- package/lib/engine/webcomponents/needle-engine.d.ts +116 -116
- package/lib/engine/webcomponents/needle-engine.extras.d.ts +6 -6
- package/lib/engine/webcomponents/needle-engine.extras.js +13 -13
- package/lib/engine/webcomponents/needle-engine.js +821 -821
- package/lib/engine/webcomponents/needle-engine.loading.d.ts +44 -44
- package/lib/engine/webcomponents/needle-engine.loading.js +341 -341
- package/lib/engine/xr/NeedleXRController.d.ts +313 -313
- package/lib/engine/xr/NeedleXRController.js +1007 -1007
- package/lib/engine/xr/NeedleXRSession.d.ts +340 -340
- package/lib/engine/xr/NeedleXRSession.js +1463 -1463
- package/lib/engine/xr/NeedleXRSync.d.ts +22 -22
- package/lib/engine/xr/NeedleXRSync.js +188 -188
- package/lib/engine/xr/SceneTransition.d.ts +18 -18
- package/lib/engine/xr/SceneTransition.js +69 -69
- package/lib/engine/xr/TempXRContext.d.ts +34 -34
- package/lib/engine/xr/TempXRContext.js +187 -187
- package/lib/engine/xr/XRRig.d.ts +7 -7
- package/lib/engine/xr/XRRig.js +1 -1
- package/lib/engine/xr/api.d.ts +6 -6
- package/lib/engine/xr/api.js +6 -6
- package/lib/engine/xr/events.d.ts +66 -66
- package/lib/engine/xr/events.js +93 -93
- package/lib/engine/xr/internal.d.ts +12 -12
- package/lib/engine/xr/internal.js +25 -25
- package/lib/engine/xr/usdz.d.ts +12 -12
- package/lib/engine/xr/usdz.js +29 -29
- package/lib/engine/xr/utils.d.ts +11 -11
- package/lib/engine/xr/utils.js +34 -34
- package/lib/engine-components/AlignmentConstraint.d.ts +10 -10
- package/lib/engine-components/AlignmentConstraint.js +39 -39
- package/lib/engine-components/Animation.d.ts +156 -156
- package/lib/engine-components/Animation.js +508 -508
- package/lib/engine-components/AnimationCurve.d.ts +40 -40
- package/lib/engine-components/AnimationCurve.js +159 -159
- package/lib/engine-components/AnimationUtils.d.ts +8 -8
- package/lib/engine-components/AnimationUtils.js +27 -27
- package/lib/engine-components/AnimationUtilsAutoplay.d.ts +1 -1
- package/lib/engine-components/AnimationUtilsAutoplay.js +39 -39
- package/lib/engine-components/Animator.d.ts +217 -217
- package/lib/engine-components/Animator.js +354 -354
- package/lib/engine-components/AnimatorController.d.ts +227 -227
- package/lib/engine-components/AnimatorController.js +1152 -1152
- package/lib/engine-components/AudioListener.d.ts +33 -33
- package/lib/engine-components/AudioListener.js +86 -86
- package/lib/engine-components/AudioSource.d.ts +217 -217
- package/lib/engine-components/AudioSource.js +635 -635
- package/lib/engine-components/AvatarLoader.d.ts +80 -80
- package/lib/engine-components/AvatarLoader.js +231 -231
- package/lib/engine-components/AxesHelper.d.ts +32 -32
- package/lib/engine-components/AxesHelper.js +67 -67
- package/lib/engine-components/BasicIKConstraint.d.ts +9 -9
- package/lib/engine-components/BasicIKConstraint.js +43 -43
- package/lib/engine-components/BoxCollider.d.ts +2 -2
- package/lib/engine-components/BoxCollider.js +2 -2
- package/lib/engine-components/BoxHelperComponent.d.ts +47 -47
- package/lib/engine-components/BoxHelperComponent.js +102 -102
- package/lib/engine-components/Camera.d.ts +231 -231
- package/lib/engine-components/Camera.js +700 -700
- package/lib/engine-components/CameraUtils.d.ts +1 -1
- package/lib/engine-components/CameraUtils.js +123 -123
- package/lib/engine-components/CharacterController.d.ts +55 -55
- package/lib/engine-components/CharacterController.js +236 -236
- package/lib/engine-components/Collider.d.ts +188 -188
- package/lib/engine-components/Collider.js +369 -369
- package/lib/engine-components/Component.d.ts +792 -792
- package/lib/engine-components/Component.js +920 -920
- package/lib/engine-components/ContactShadows.d.ts +94 -94
- package/lib/engine-components/ContactShadows.js +453 -453
- package/lib/engine-components/DeleteBox.d.ts +19 -19
- package/lib/engine-components/DeleteBox.js +58 -58
- package/lib/engine-components/DeviceFlag.d.ts +16 -16
- package/lib/engine-components/DeviceFlag.js +47 -47
- package/lib/engine-components/DragControls.d.ts +170 -170
- package/lib/engine-components/DragControls.js +1421 -1421
- package/lib/engine-components/DropListener.d.ts +215 -215
- package/lib/engine-components/DropListener.js +642 -642
- package/lib/engine-components/Duplicatable.d.ts +35 -35
- package/lib/engine-components/Duplicatable.js +202 -202
- package/lib/engine-components/EventList.d.ts +54 -54
- package/lib/engine-components/EventList.js +232 -232
- package/lib/engine-components/EventTrigger.d.ts +33 -33
- package/lib/engine-components/EventTrigger.js +75 -75
- package/lib/engine-components/EventType.d.ts +22 -22
- package/lib/engine-components/EventType.js +23 -23
- package/lib/engine-components/Fog.d.ts +22 -22
- package/lib/engine-components/Fog.js +61 -61
- package/lib/engine-components/Gizmos.d.ts +17 -17
- package/lib/engine-components/Gizmos.js +64 -64
- package/lib/engine-components/GridHelper.d.ts +20 -20
- package/lib/engine-components/GridHelper.js +54 -54
- package/lib/engine-components/GroundProjection.d.ts +67 -67
- package/lib/engine-components/GroundProjection.js +343 -343
- package/lib/engine-components/Interactable.d.ts +12 -12
- package/lib/engine-components/Interactable.js +12 -12
- package/lib/engine-components/Joints.d.ts +19 -19
- package/lib/engine-components/Joints.js +51 -51
- package/lib/engine-components/LODGroup.d.ts +35 -35
- package/lib/engine-components/LODGroup.js +152 -152
- package/lib/engine-components/Light.d.ts +180 -180
- package/lib/engine-components/Light.js +535 -535
- package/lib/engine-components/LookAtConstraint.d.ts +19 -19
- package/lib/engine-components/LookAtConstraint.js +35 -35
- package/lib/engine-components/NeedleMenu.d.ts +50 -50
- package/lib/engine-components/NeedleMenu.js +92 -92
- package/lib/engine-components/NestedGltf.d.ts +25 -25
- package/lib/engine-components/NestedGltf.js +88 -88
- package/lib/engine-components/Networking.d.ts +54 -54
- package/lib/engine-components/Networking.js +112 -112
- package/lib/engine-components/OffsetConstraint.d.ts +14 -14
- package/lib/engine-components/OffsetConstraint.js +65 -65
- package/lib/engine-components/OrbitControls.d.ts +268 -268
- package/lib/engine-components/OrbitControls.js +1015 -1015
- package/lib/engine-components/PlayerColor.d.ts +19 -19
- package/lib/engine-components/PlayerColor.js +94 -94
- package/lib/engine-components/ReflectionProbe.d.ts +28 -28
- package/lib/engine-components/ReflectionProbe.js +204 -204
- package/lib/engine-components/Renderer.d.ts +153 -153
- package/lib/engine-components/Renderer.js +834 -834
- package/lib/engine-components/RendererInstancing.d.ts +140 -140
- package/lib/engine-components/RendererInstancing.js +744 -744
- package/lib/engine-components/RendererLightmap.d.ts +24 -24
- package/lib/engine-components/RendererLightmap.js +182 -182
- package/lib/engine-components/RigidBody.d.ts +155 -155
- package/lib/engine-components/RigidBody.js +517 -517
- package/lib/engine-components/SceneSwitcher.d.ts +263 -263
- package/lib/engine-components/SceneSwitcher.js +971 -971
- package/lib/engine-components/ScreenCapture.d.ts +144 -144
- package/lib/engine-components/ScreenCapture.js +547 -547
- package/lib/engine-components/ShadowCatcher.d.ts +33 -33
- package/lib/engine-components/ShadowCatcher.js +166 -166
- package/lib/engine-components/Skybox.d.ts +88 -88
- package/lib/engine-components/Skybox.js +469 -469
- package/lib/engine-components/SmoothFollow.d.ts +34 -34
- package/lib/engine-components/SmoothFollow.js +82 -82
- package/lib/engine-components/SpatialTrigger.d.ts +102 -102
- package/lib/engine-components/SpatialTrigger.js +225 -225
- package/lib/engine-components/SpectatorCamera.d.ts +111 -111
- package/lib/engine-components/SpectatorCamera.js +715 -715
- package/lib/engine-components/SphereCollider.d.ts +2 -2
- package/lib/engine-components/SphereCollider.js +2 -2
- package/lib/engine-components/SpriteRenderer.d.ts +132 -132
- package/lib/engine-components/SpriteRenderer.js +472 -472
- package/lib/engine-components/SyncedCamera.d.ts +41 -41
- package/lib/engine-components/SyncedCamera.js +199 -199
- package/lib/engine-components/SyncedRoom.d.ts +106 -106
- package/lib/engine-components/SyncedRoom.js +371 -371
- package/lib/engine-components/SyncedTransform.d.ts +94 -94
- package/lib/engine-components/SyncedTransform.js +331 -331
- package/lib/engine-components/TestRunner.d.ts +16 -16
- package/lib/engine-components/TestRunner.js +102 -102
- package/lib/engine-components/TransformGizmo.d.ts +75 -75
- package/lib/engine-components/TransformGizmo.js +209 -209
- package/lib/engine-components/VideoPlayer.d.ts +184 -184
- package/lib/engine-components/VideoPlayer.js +978 -978
- package/lib/engine-components/Voip.d.ts +67 -67
- package/lib/engine-components/Voip.js +360 -360
- package/lib/engine-components/api.d.ts +51 -51
- package/lib/engine-components/api.js +50 -50
- package/lib/engine-components/avatar/AvatarBlink_Simple.d.ts +11 -11
- package/lib/engine-components/avatar/AvatarBlink_Simple.js +76 -76
- package/lib/engine-components/avatar/AvatarEyeLook_Rotation.d.ts +14 -14
- package/lib/engine-components/avatar/AvatarEyeLook_Rotation.js +68 -68
- package/lib/engine-components/avatar/Avatar_Brain_LookAt.d.ts +29 -29
- package/lib/engine-components/avatar/Avatar_Brain_LookAt.js +121 -121
- package/lib/engine-components/avatar/Avatar_MouthShapes.d.ts +15 -15
- package/lib/engine-components/avatar/Avatar_MouthShapes.js +79 -79
- package/lib/engine-components/avatar/Avatar_MustacheShake.d.ts +9 -9
- package/lib/engine-components/avatar/Avatar_MustacheShake.js +29 -29
- package/lib/engine-components/codegen/components.d.ts +216 -216
- package/lib/engine-components/codegen/components.js +218 -218
- package/lib/engine-components/debug/LogStats.d.ts +5 -5
- package/lib/engine-components/debug/LogStats.js +18 -18
- package/lib/engine-components/export/gltf/GltfExport.d.ts +30 -30
- package/lib/engine-components/export/gltf/GltfExport.js +246 -246
- package/lib/engine-components/export/gltf/index.d.ts +1 -1
- package/lib/engine-components/export/gltf/index.js +1 -1
- package/lib/engine-components/export/index.d.ts +1 -1
- package/lib/engine-components/export/index.js +1 -1
- package/lib/engine-components/export/usdz/Extension.d.ts +22 -22
- package/lib/engine-components/export/usdz/Extension.js +1 -1
- package/lib/engine-components/export/usdz/ThreeUSDZExporter.d.ts +162 -162
- package/lib/engine-components/export/usdz/ThreeUSDZExporter.js +1789 -1789
- package/lib/engine-components/export/usdz/USDZExporter.d.ts +130 -130
- package/lib/engine-components/export/usdz/USDZExporter.js +663 -663
- package/lib/engine-components/export/usdz/extensions/Animation.d.ts +106 -106
- package/lib/engine-components/export/usdz/extensions/Animation.js +1071 -1071
- package/lib/engine-components/export/usdz/extensions/DocumentExtension.d.ts +5 -5
- package/lib/engine-components/export/usdz/extensions/DocumentExtension.js +6 -6
- package/lib/engine-components/export/usdz/extensions/NodeMaterialConverter.d.ts +10 -10
- package/lib/engine-components/export/usdz/extensions/NodeMaterialConverter.js +451 -451
- package/lib/engine-components/export/usdz/extensions/USDZText.d.ts +54 -54
- package/lib/engine-components/export/usdz/extensions/USDZText.js +203 -203
- package/lib/engine-components/export/usdz/extensions/USDZUI.d.ts +8 -8
- package/lib/engine-components/export/usdz/extensions/USDZUI.js +158 -158
- package/lib/engine-components/export/usdz/extensions/behavior/Actions.d.ts +30 -30
- package/lib/engine-components/export/usdz/extensions/behavior/Actions.js +88 -88
- package/lib/engine-components/export/usdz/extensions/behavior/AudioExtension.d.ts +10 -10
- package/lib/engine-components/export/usdz/extensions/behavior/AudioExtension.js +86 -86
- package/lib/engine-components/export/usdz/extensions/behavior/Behaviour.d.ts +28 -28
- package/lib/engine-components/export/usdz/extensions/behavior/Behaviour.js +290 -290
- package/lib/engine-components/export/usdz/extensions/behavior/BehaviourComponents.d.ts +190 -190
- package/lib/engine-components/export/usdz/extensions/behavior/BehaviourComponents.js +1060 -1060
- package/lib/engine-components/export/usdz/extensions/behavior/BehavioursBuilder.d.ts +135 -135
- package/lib/engine-components/export/usdz/extensions/behavior/BehavioursBuilder.js +548 -548
- package/lib/engine-components/export/usdz/extensions/behavior/PhysicsExtension.d.ts +7 -7
- package/lib/engine-components/export/usdz/extensions/behavior/PhysicsExtension.js +115 -115
- package/lib/engine-components/export/usdz/index.d.ts +3 -3
- package/lib/engine-components/export/usdz/index.js +2 -2
- package/lib/engine-components/export/usdz/utils/animationutils.d.ts +7 -7
- package/lib/engine-components/export/usdz/utils/animationutils.js +163 -163
- package/lib/engine-components/export/usdz/utils/quicklook.d.ts +2 -2
- package/lib/engine-components/export/usdz/utils/quicklook.js +43 -43
- package/lib/engine-components/particlesystem/ParticleSystem.d.ts +177 -177
- package/lib/engine-components/particlesystem/ParticleSystem.js +1176 -1176
- package/lib/engine-components/particlesystem/ParticleSystemModules.d.ts +526 -526
- package/lib/engine-components/particlesystem/ParticleSystemModules.js +1930 -1930
- package/lib/engine-components/particlesystem/ParticleSystemSubEmitter.d.ts +25 -25
- package/lib/engine-components/particlesystem/ParticleSystemSubEmitter.js +87 -87
- package/lib/engine-components/particlesystem/api.d.ts +2 -2
- package/lib/engine-components/particlesystem/api.js +2 -2
- package/lib/engine-components/postprocessing/Effects/Antialiasing.d.ts +17 -17
- package/lib/engine-components/postprocessing/Effects/Antialiasing.js +59 -59
- package/lib/engine-components/postprocessing/Effects/BloomEffect.d.ts +46 -46
- package/lib/engine-components/postprocessing/Effects/BloomEffect.js +113 -113
- package/lib/engine-components/postprocessing/Effects/ChromaticAberration.d.ts +11 -11
- package/lib/engine-components/postprocessing/Effects/ChromaticAberration.js +39 -39
- package/lib/engine-components/postprocessing/Effects/ColorAdjustments.d.ts +23 -23
- package/lib/engine-components/postprocessing/Effects/ColorAdjustments.js +111 -111
- package/lib/engine-components/postprocessing/Effects/DepthOfField.d.ts +25 -25
- package/lib/engine-components/postprocessing/Effects/DepthOfField.js +104 -104
- package/lib/engine-components/postprocessing/Effects/EffectWrapper.d.ts +12 -12
- package/lib/engine-components/postprocessing/Effects/EffectWrapper.js +18 -18
- package/lib/engine-components/postprocessing/Effects/Pixelation.d.ts +11 -11
- package/lib/engine-components/postprocessing/Effects/Pixelation.js +32 -32
- package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusion.d.ts +18 -18
- package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusion.js +91 -91
- package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.d.ts +70 -70
- package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.js +176 -176
- package/lib/engine-components/postprocessing/Effects/Sharpening.d.ts +18 -18
- package/lib/engine-components/postprocessing/Effects/Sharpening.js +127 -127
- package/lib/engine-components/postprocessing/Effects/TiltShiftEffect.d.ts +17 -17
- package/lib/engine-components/postprocessing/Effects/TiltShiftEffect.js +70 -70
- package/lib/engine-components/postprocessing/Effects/Tonemapping.d.ts +19 -19
- package/lib/engine-components/postprocessing/Effects/Tonemapping.js +94 -94
- package/lib/engine-components/postprocessing/Effects/Tonemapping.utils.d.ts +13 -13
- package/lib/engine-components/postprocessing/Effects/Tonemapping.utils.js +51 -51
- package/lib/engine-components/postprocessing/Effects/Vignette.d.ts +15 -15
- package/lib/engine-components/postprocessing/Effects/Vignette.js +60 -60
- package/lib/engine-components/postprocessing/PostProcessingEffect.d.ts +90 -90
- package/lib/engine-components/postprocessing/PostProcessingEffect.js +168 -168
- package/lib/engine-components/postprocessing/PostProcessingHandler.d.ts +42 -42
- package/lib/engine-components/postprocessing/PostProcessingHandler.js +494 -494
- package/lib/engine-components/postprocessing/Volume.d.ts +90 -90
- package/lib/engine-components/postprocessing/Volume.js +385 -385
- package/lib/engine-components/postprocessing/VolumeParameter.d.ts +26 -26
- package/lib/engine-components/postprocessing/VolumeParameter.js +136 -136
- package/lib/engine-components/postprocessing/VolumeProfile.d.ts +15 -15
- package/lib/engine-components/postprocessing/VolumeProfile.js +60 -60
- package/lib/engine-components/postprocessing/index.d.ts +6 -6
- package/lib/engine-components/postprocessing/index.js +6 -6
- package/lib/engine-components/postprocessing/utils.d.ts +55 -55
- package/lib/engine-components/postprocessing/utils.js +119 -119
- package/lib/engine-components/timeline/PlayableDirector.d.ts +163 -163
- package/lib/engine-components/timeline/PlayableDirector.js +686 -686
- package/lib/engine-components/timeline/SignalAsset.d.ts +24 -24
- package/lib/engine-components/timeline/SignalAsset.js +130 -130
- package/lib/engine-components/timeline/TimelineModels.d.ts +89 -89
- package/lib/engine-components/timeline/TimelineModels.js +22 -22
- package/lib/engine-components/timeline/TimelineTracks.d.ts +110 -110
- package/lib/engine-components/timeline/TimelineTracks.js +879 -879
- package/lib/engine-components/timeline/index.d.ts +4 -4
- package/lib/engine-components/timeline/index.js +3 -3
- package/lib/engine-components/ui/BaseUIComponent.d.ts +48 -48
- package/lib/engine-components/ui/BaseUIComponent.js +170 -170
- package/lib/engine-components/ui/Button.d.ts +64 -64
- package/lib/engine-components/ui/Button.js +315 -315
- package/lib/engine-components/ui/Canvas.d.ts +74 -74
- package/lib/engine-components/ui/Canvas.js +407 -407
- package/lib/engine-components/ui/CanvasGroup.d.ts +19 -19
- package/lib/engine-components/ui/CanvasGroup.js +58 -58
- package/lib/engine-components/ui/EventSystem.d.ts +125 -125
- package/lib/engine-components/ui/EventSystem.js +765 -765
- package/lib/engine-components/ui/Graphic.d.ts +55 -55
- package/lib/engine-components/ui/Graphic.js +255 -255
- package/lib/engine-components/ui/Image.d.ts +35 -35
- package/lib/engine-components/ui/Image.js +116 -116
- package/lib/engine-components/ui/InputField.d.ts +42 -42
- package/lib/engine-components/ui/InputField.js +268 -268
- package/lib/engine-components/ui/Interfaces.d.ts +38 -38
- package/lib/engine-components/ui/Interfaces.js +12 -12
- package/lib/engine-components/ui/Layout.d.ts +84 -84
- package/lib/engine-components/ui/Layout.js +330 -330
- package/lib/engine-components/ui/Outline.d.ts +7 -7
- package/lib/engine-components/ui/Outline.js +20 -20
- package/lib/engine-components/ui/PointerEvents.d.ts +115 -115
- package/lib/engine-components/ui/PointerEvents.js +145 -145
- package/lib/engine-components/ui/RaycastUtils.d.ts +11 -11
- package/lib/engine-components/ui/RaycastUtils.js +67 -67
- package/lib/engine-components/ui/Raycaster.d.ts +30 -30
- package/lib/engine-components/ui/Raycaster.js +95 -95
- package/lib/engine-components/ui/RectTransform.d.ts +61 -61
- package/lib/engine-components/ui/RectTransform.js +356 -356
- package/lib/engine-components/ui/SpatialHtml.d.ts +8 -8
- package/lib/engine-components/ui/SpatialHtml.js +79 -79
- package/lib/engine-components/ui/Symbols.d.ts +1 -1
- package/lib/engine-components/ui/Symbols.js +1 -1
- package/lib/engine-components/ui/Text.d.ts +78 -78
- package/lib/engine-components/ui/Text.js +539 -539
- package/lib/engine-components/ui/Utils.d.ts +24 -24
- package/lib/engine-components/ui/Utils.js +90 -90
- package/lib/engine-components/ui/index.d.ts +1 -1
- package/lib/engine-components/ui/index.js +1 -1
- package/lib/engine-components/utils/EnvironmentScene.d.ts +5 -5
- package/lib/engine-components/utils/EnvironmentScene.js +205 -205
- package/lib/engine-components/utils/LookAt.d.ts +31 -31
- package/lib/engine-components/utils/LookAt.js +82 -82
- package/lib/engine-components/utils/OpenURL.d.ts +42 -42
- package/lib/engine-components/utils/OpenURL.js +119 -119
- package/lib/engine-components/webxr/Avatar.d.ts +25 -25
- package/lib/engine-components/webxr/Avatar.js +255 -255
- package/lib/engine-components/webxr/TeleportTarget.d.ts +7 -7
- package/lib/engine-components/webxr/TeleportTarget.js +7 -7
- package/lib/engine-components/webxr/WebARCameraBackground.d.ts +30 -30
- package/lib/engine-components/webxr/WebARCameraBackground.js +155 -155
- package/lib/engine-components/webxr/WebARSessionRoot.d.ts +98 -98
- package/lib/engine-components/webxr/WebARSessionRoot.js +770 -770
- package/lib/engine-components/webxr/WebXR.d.ts +232 -232
- package/lib/engine-components/webxr/WebXR.js +561 -561
- package/lib/engine-components/webxr/WebXRAvatar.d.ts +27 -27
- package/lib/engine-components/webxr/WebXRAvatar.js +44 -44
- package/lib/engine-components/webxr/WebXRImageTracking.d.ts +86 -86
- package/lib/engine-components/webxr/WebXRImageTracking.js +471 -471
- package/lib/engine-components/webxr/WebXRPlaneTracking.d.ts +92 -92
- package/lib/engine-components/webxr/WebXRPlaneTracking.js +500 -500
- package/lib/engine-components/webxr/WebXRRig.d.ts +32 -32
- package/lib/engine-components/webxr/WebXRRig.js +72 -72
- package/lib/engine-components/webxr/XRFlag.d.ts +38 -38
- package/lib/engine-components/webxr/XRFlag.js +139 -139
- package/lib/engine-components/webxr/controllers/XRControllerFollow.d.ts +47 -47
- package/lib/engine-components/webxr/controllers/XRControllerFollow.js +120 -120
- package/lib/engine-components/webxr/controllers/XRControllerModel.d.ts +43 -43
- package/lib/engine-components/webxr/controllers/XRControllerModel.js +352 -352
- package/lib/engine-components/webxr/controllers/XRControllerMovement.d.ts +78 -78
- package/lib/engine-components/webxr/controllers/XRControllerMovement.js +506 -506
- package/lib/engine-components/webxr/index.d.ts +3 -3
- package/lib/engine-components/webxr/index.js +3 -3
- package/lib/engine-components/webxr/types.d.ts +3 -3
- package/lib/engine-components/webxr/types.js +1 -1
- package/lib/engine-components-experimental/Presentation.d.ts +6 -6
- package/lib/engine-components-experimental/Presentation.js +9 -9
- package/lib/engine-components-experimental/api.d.ts +4 -4
- package/lib/engine-components-experimental/api.js +4 -4
- package/lib/engine-components-experimental/networking/PlayerSync.d.ts +156 -156
- package/lib/engine-components-experimental/networking/PlayerSync.js +377 -377
- package/lib/engine-schemes/api.d.ts +12 -12
- package/lib/engine-schemes/api.js +12 -12
- package/lib/engine-schemes/schemes.d.ts +7 -7
- package/lib/engine-schemes/schemes.js +19 -19
- package/lib/engine-schemes/synced-camera-model.d.ts +25 -25
- package/lib/engine-schemes/synced-camera-model.js +67 -67
- package/lib/engine-schemes/synced-transform-model.d.ts +31 -31
- package/lib/engine-schemes/synced-transform-model.js +66 -66
- package/lib/engine-schemes/transform.d.ts +12 -12
- package/lib/engine-schemes/transform.js +39 -39
- package/lib/engine-schemes/vec2.d.ts +10 -10
- package/lib/engine-schemes/vec2.js +25 -25
- package/lib/engine-schemes/vec3.d.ts +11 -11
- package/lib/engine-schemes/vec3.js +29 -29
- package/lib/engine-schemes/vec4.d.ts +12 -12
- package/lib/engine-schemes/vec4.js +33 -33
- package/lib/engine-schemes/vr-user-state-buffer.d.ts +37 -37
- package/lib/engine-schemes/vr-user-state-buffer.js +110 -110
- package/lib/include/three/EXT_mesh_gpu_instancing_exporter.d.ts +6 -6
- package/lib/include/three/EXT_mesh_gpu_instancing_exporter.js +45 -45
- package/lib/needle-engine.d.ts +7 -7
- package/lib/needle-engine.js +64 -64
- package/package.json +3 -3
- package/plugins/common/buildinfo.js +64 -64
- package/plugins/common/cloud.js +1 -1
- package/plugins/common/config.cjs +31 -31
- package/plugins/common/config.js +35 -35
- package/plugins/common/files.js +31 -31
- package/plugins/common/generator.js +10 -10
- package/plugins/common/license.js +452 -452
- package/plugins/common/logger.js +327 -327
- package/plugins/common/npm.js +15 -15
- package/plugins/common/timers.js +7 -7
- package/plugins/common/version.js +37 -37
- package/plugins/gltf-packer.mjs +1 -1
- package/plugins/next/alias.cjs +39 -39
- package/plugins/next/license.cjs +24 -24
- package/plugins/next/meshbvhworker.cjs +18 -18
- package/plugins/next/next.js +141 -141
- package/plugins/types/index.d.ts +2 -2
- package/plugins/types/license.d.ts +24 -24
- package/plugins/types/needleConfig.d.ts +27 -27
- package/plugins/types/next.d.ts +2 -2
- package/plugins/types/userconfig.d.ts +124 -124
- package/plugins/types/vite.d.ts +13 -13
- package/plugins/types/webmanifest.d.ts +32 -32
- package/plugins/vite/alias.js +189 -189
- package/plugins/vite/asap.js +251 -251
- package/plugins/vite/build-pipeline.js +371 -371
- package/plugins/vite/build.js +19 -19
- package/plugins/vite/buildinfo.js +41 -41
- package/plugins/vite/config.js +106 -106
- package/plugins/vite/copyfiles.js +138 -138
- package/plugins/vite/defines.js +70 -70
- package/plugins/vite/dependencies.js +232 -232
- package/plugins/vite/dependency-watcher.js +237 -237
- package/plugins/vite/drop-client.js +76 -76
- package/plugins/vite/drop.js +87 -87
- package/plugins/vite/editor-connection.js +124 -124
- package/plugins/vite/facebook-instant-games.js +102 -102
- package/plugins/vite/gzip.js +5 -5
- package/plugins/vite/imports-logger.js +143 -143
- package/plugins/vite/index.js +147 -147
- package/plugins/vite/license.js +56 -56
- package/plugins/vite/local-files.js +440 -440
- package/plugins/vite/logger.client.js +272 -272
- package/plugins/vite/logger.js +100 -100
- package/plugins/vite/materialx.js +31 -31
- package/plugins/vite/meta.js +163 -163
- package/plugins/vite/npm.js +7 -7
- package/plugins/vite/peer.js +29 -29
- package/plugins/vite/poster-client.js +73 -73
- package/plugins/vite/poster.js +79 -79
- package/plugins/vite/pwa.js +604 -604
- package/plugins/vite/reload-client.js +15 -15
- package/plugins/vite/reload.js +351 -351
- package/plugins/vite/server.js +66 -66
- package/plugins/vite/transform-codegen.js +55 -55
- package/plugins/vite/transform.js +32 -32
- package/plugins/vite/vite-4.4-hack.js +31 -31
- package/src/asap/needle-asap.ts +111 -111
- package/src/asap/sessiongranted.ts +75 -75
- package/src/asap/utils.ts +4 -4
- package/src/engine/analytics/index.ts +10 -10
- package/src/engine/analytics/lcp.ts +35 -35
- package/src/engine/api.ts +82 -82
- package/src/engine/assets/index.ts +59 -59
- package/src/engine/assets/static.js +5 -5
- package/src/engine/codegen/register_types.ts +300 -300
- package/src/engine/debug/debug.ts +51 -51
- package/src/engine/debug/debug_console.ts +333 -333
- package/src/engine/debug/debug_overlay.ts +332 -332
- package/src/engine/debug/debug_spatial_console.ts +429 -429
- package/src/engine/debug/index.ts +1 -1
- package/src/engine/engine_addressables.ts +671 -671
- package/src/engine/engine_animation.ts +145 -145
- package/src/engine/engine_application.ts +113 -113
- package/src/engine/engine_assetdatabase.ts +389 -389
- package/src/engine/engine_audio.ts +24 -24
- package/src/engine/engine_camera.ts +39 -39
- package/src/engine/engine_components.ts +366 -366
- package/src/engine/engine_components_internal.ts +40 -40
- package/src/engine/engine_constants.ts +52 -52
- package/src/engine/engine_context.ts +1824 -1824
- package/src/engine/engine_context_registry.ts +129 -129
- package/src/engine/engine_coroutine.ts +54 -54
- package/src/engine/engine_create_objects.ts +411 -411
- package/src/engine/engine_default_parameters.ts +3 -3
- package/src/engine/engine_editor-sync.ts +28 -28
- package/src/engine/engine_fileloader.js +9 -9
- package/src/engine/engine_gameobject.ts +712 -712
- package/src/engine/engine_generic_utils.js +13 -13
- package/src/engine/engine_gizmos.ts +577 -577
- package/src/engine/engine_gltf.ts +29 -29
- package/src/engine/engine_gltf_builtin_components.ts +403 -403
- package/src/engine/engine_hot_reload.ts +210 -210
- package/src/engine/engine_input.ts +1500 -1500
- package/src/engine/engine_input_utils.ts +23 -23
- package/src/engine/engine_instancing.ts +45 -45
- package/src/engine/engine_license.ts +386 -386
- package/src/engine/engine_lifecycle_api.ts +113 -113
- package/src/engine/engine_lifecycle_functions_internal.ts +193 -193
- package/src/engine/engine_lightdata.ts +125 -125
- package/src/engine/engine_loaders.callbacks.ts +136 -136
- package/src/engine/engine_loaders.gltf.ts +82 -82
- package/src/engine/engine_loaders.ts +378 -378
- package/src/engine/engine_lods.ts +186 -186
- package/src/engine/engine_mainloop_utils.ts +472 -472
- package/src/engine/engine_math.ts +282 -282
- package/src/engine/engine_modules.ts +83 -83
- package/src/engine/engine_networking.ts +862 -862
- package/src/engine/engine_networking_auto.ts +352 -352
- package/src/engine/engine_networking_blob.ts +275 -275
- package/src/engine/engine_networking_files.ts +217 -217
- package/src/engine/engine_networking_files_default_components.ts +58 -58
- package/src/engine/engine_networking_instantiate.ts +419 -419
- package/src/engine/engine_networking_peer.ts +159 -159
- package/src/engine/engine_networking_streams.ts +713 -713
- package/src/engine/engine_networking_types.ts +24 -24
- package/src/engine/engine_networking_utils.ts +23 -23
- package/src/engine/engine_networking_websocket.ts +2 -2
- package/src/engine/engine_patcher.ts +199 -199
- package/src/engine/engine_physics.ts +783 -783
- package/src/engine/engine_physics.types.ts +46 -46
- package/src/engine/engine_physics_rapier.ts +1577 -1577
- package/src/engine/engine_playerview.ts +80 -80
- package/src/engine/engine_scenelighting.ts +294 -294
- package/src/engine/engine_serialization.ts +2 -2
- package/src/engine/engine_serialization_builtin_serializer.ts +473 -473
- package/src/engine/engine_serialization_core.ts +720 -720
- package/src/engine/engine_serialization_decorator.ts +80 -80
- package/src/engine/engine_setup.ts +1 -1
- package/src/engine/engine_shaders.ts +267 -267
- package/src/engine/engine_shims.ts +32 -32
- package/src/engine/engine_test_utils.ts +109 -109
- package/src/engine/engine_texture.ts +82 -82
- package/src/engine/engine_three_utils.ts +928 -928
- package/src/engine/engine_time.ts +94 -94
- package/src/engine/engine_time_utils.ts +237 -237
- package/src/engine/engine_tonemapping.ts +208 -208
- package/src/engine/engine_types.ts +730 -730
- package/src/engine/engine_typestore.ts +63 -63
- package/src/engine/engine_util_decorator.ts +136 -136
- package/src/engine/engine_utils.ts +1115 -1115
- package/src/engine/engine_utils_format.ts +273 -273
- package/src/engine/engine_utils_screenshot.ts +708 -708
- package/src/engine/engine_utils_screenshot.xr.ts +103 -103
- package/src/engine/export/gltf/Writers.ts +34 -34
- package/src/engine/export/gltf/index.ts +158 -158
- package/src/engine/export/index.ts +2 -2
- package/src/engine/export/state.ts +19 -19
- package/src/engine/export/utils.ts +9 -9
- package/src/engine/extensions/EXT_texture_exr.ts +50 -50
- package/src/engine/extensions/NEEDLE_animator_controller_model.ts +195 -195
- package/src/engine/extensions/NEEDLE_components.ts +268 -268
- package/src/engine/extensions/NEEDLE_gameobject_data.ts +81 -81
- package/src/engine/extensions/NEEDLE_lighting_settings.ts +185 -185
- package/src/engine/extensions/NEEDLE_lightmaps.ts +119 -119
- package/src/engine/extensions/NEEDLE_persistent_assets.ts +76 -76
- package/src/engine/extensions/NEEDLE_render_objects.ts +209 -209
- package/src/engine/extensions/NEEDLE_techniques_webgl.ts +640 -640
- package/src/engine/extensions/extension_resolver.ts +4 -4
- package/src/engine/extensions/extension_utils.ts +166 -166
- package/src/engine/extensions/extensions.ts +140 -140
- package/src/engine/extensions/index.ts +5 -5
- package/src/engine/extensions/usage_tracker.ts +100 -100
- package/src/engine/js-extensions/Camera.ts +37 -37
- package/src/engine/js-extensions/ExtensionUtils.ts +85 -85
- package/src/engine/js-extensions/Layers.ts +23 -23
- package/src/engine/js-extensions/Object3D.ts +296 -296
- package/src/engine/js-extensions/RGBAColor.ts +126 -126
- package/src/engine/js-extensions/Vector.ts +18 -18
- package/src/engine/js-extensions/index.ts +4 -4
- package/src/engine/physics/workers/mesh-bvh/GenerateMeshBVHWorker.js +125 -125
- package/src/engine/shaders/shaderData.ts +67 -67
- package/src/engine/tests/test_utils.ts +63 -63
- package/src/engine/webcomponents/WebXRButtons.ts +260 -260
- package/src/engine/webcomponents/api.ts +6 -6
- package/src/engine/webcomponents/buttons.ts +292 -292
- package/src/engine/webcomponents/fonts.ts +41 -41
- package/src/engine/webcomponents/icons.ts +57 -57
- package/src/engine/webcomponents/index.ts +1 -1
- package/src/engine/webcomponents/logo-element.ts +78 -78
- package/src/engine/webcomponents/needle menu/needle-menu-spatial.ts +573 -573
- package/src/engine/webcomponents/needle menu/needle-menu.ts +1118 -1118
- package/src/engine/webcomponents/needle-button.ts +181 -181
- package/src/engine/webcomponents/needle-engine.ar-overlay.ts +186 -186
- package/src/engine/webcomponents/needle-engine.attributes.ts +82 -82
- package/src/engine/webcomponents/needle-engine.extras.ts +16 -16
- package/src/engine/webcomponents/needle-engine.loading.ts +373 -373
- package/src/engine/webcomponents/needle-engine.ts +860 -860
- package/src/engine/xr/NeedleXRController.ts +1125 -1125
- package/src/engine/xr/NeedleXRSession.ts +1624 -1624
- package/src/engine/xr/NeedleXRSync.ts +220 -220
- package/src/engine/xr/SceneTransition.ts +78 -78
- package/src/engine/xr/TempXRContext.ts +216 -216
- package/src/engine/xr/XRRig.ts +9 -9
- package/src/engine/xr/api.ts +5 -5
- package/src/engine/xr/events.ts +102 -102
- package/src/engine/xr/internal.ts +34 -34
- package/src/engine/xr/usdz.ts +30 -30
- package/src/engine/xr/utils.ts +39 -39
- package/src/engine-components/AlignmentConstraint.ts +36 -36
- package/src/engine-components/Animation.ts +557 -557
- package/src/engine-components/AnimationCurve.ts +150 -150
- package/src/engine-components/AnimationUtils.ts +28 -28
- package/src/engine-components/AnimationUtilsAutoplay.ts +43 -43
- package/src/engine-components/Animator.ts +397 -397
- package/src/engine-components/AnimatorController.ts +1293 -1293
- package/src/engine-components/AudioListener.ts +92 -92
- package/src/engine-components/AudioSource.ts +644 -644
- package/src/engine-components/AvatarLoader.ts +263 -263
- package/src/engine-components/AxesHelper.ts +59 -59
- package/src/engine-components/BasicIKConstraint.ts +54 -54
- package/src/engine-components/BoxCollider.ts +1 -1
- package/src/engine-components/BoxHelperComponent.ts +114 -114
- package/src/engine-components/Camera.ts +719 -719
- package/src/engine-components/CameraUtils.ts +138 -138
- package/src/engine-components/CharacterController.ts +253 -253
- package/src/engine-components/Collider.ts +374 -374
- package/src/engine-components/Component.ts +1297 -1297
- package/src/engine-components/ContactShadows.ts +506 -506
- package/src/engine-components/DeleteBox.ts +62 -62
- package/src/engine-components/DeviceFlag.ts +46 -46
- package/src/engine-components/DragControls.ts +1623 -1623
- package/src/engine-components/DropListener.ts +713 -713
- package/src/engine-components/Duplicatable.ts +198 -198
- package/src/engine-components/EventList.ts +266 -266
- package/src/engine-components/EventTrigger.ts +74 -74
- package/src/engine-components/EventType.ts +22 -22
- package/src/engine-components/Fog.ts +60 -60
- package/src/engine-components/Gizmos.ts +56 -56
- package/src/engine-components/GridHelper.ts +48 -48
- package/src/engine-components/GroundProjection.ts +356 -356
- package/src/engine-components/Interactable.ts +14 -14
- package/src/engine-components/Joints.ts +52 -52
- package/src/engine-components/LODGroup.ts +153 -153
- package/src/engine-components/Light.ts +558 -558
- package/src/engine-components/LookAtConstraint.ts +25 -25
- package/src/engine-components/NeedleMenu.ts +84 -84
- package/src/engine-components/NestedGltf.ts +86 -86
- package/src/engine-components/Networking.ts +114 -114
- package/src/engine-components/OffsetConstraint.ts +60 -60
- package/src/engine-components/OrbitControls.ts +1074 -1074
- package/src/engine-components/PlayerColor.ts +103 -103
- package/src/engine-components/ReflectionProbe.ts +220 -220
- package/src/engine-components/Renderer.ts +903 -903
- package/src/engine-components/RendererInstancing.ts +855 -855
- package/src/engine-components/RendererLightmap.ts +198 -198
- package/src/engine-components/RigidBody.ts +526 -526
- package/src/engine-components/SceneSwitcher.ts +1030 -1030
- package/src/engine-components/ScreenCapture.ts +592 -592
- package/src/engine-components/ShadowCatcher.ts +172 -172
- package/src/engine-components/Skybox.ts +475 -475
- package/src/engine-components/SmoothFollow.ts +76 -76
- package/src/engine-components/SpatialTrigger.ts +229 -229
- package/src/engine-components/SpectatorCamera.ts +787 -787
- package/src/engine-components/SphereCollider.ts +1 -1
- package/src/engine-components/SpriteRenderer.ts +468 -468
- package/src/engine-components/SyncedCamera.ts +220 -220
- package/src/engine-components/SyncedRoom.ts +380 -380
- package/src/engine-components/SyncedTransform.ts +383 -383
- package/src/engine-components/TestRunner.ts +118 -118
- package/src/engine-components/TransformGizmo.ts +219 -219
- package/src/engine-components/VideoPlayer.ts +1025 -1025
- package/src/engine-components/Voip.ts +363 -363
- package/src/engine-components/api.ts +60 -60
- package/src/engine-components/avatar/AvatarBlink_Simple.ts +69 -69
- package/src/engine-components/avatar/AvatarEyeLook_Rotation.ts +63 -63
- package/src/engine-components/avatar/Avatar_Brain_LookAt.ts +139 -139
- package/src/engine-components/avatar/Avatar_MouthShapes.ts +83 -83
- package/src/engine-components/avatar/Avatar_MustacheShake.ts +31 -31
- package/src/engine-components/codegen/components.ts +217 -217
- package/src/engine-components/debug/LogStats.ts +21 -21
- package/src/engine-components/export/gltf/GltfExport.ts +265 -265
- package/src/engine-components/export/usdz/Extension.ts +24 -24
- package/src/engine-components/export/usdz/ThreeUSDZExporter.ts +2426 -2426
- package/src/engine-components/export/usdz/USDZExporter.ts +705 -705
- package/src/engine-components/export/usdz/extensions/Animation.ts +1204 -1204
- package/src/engine-components/export/usdz/extensions/DocumentExtension.ts +9 -9
- package/src/engine-components/export/usdz/extensions/NodeMaterialConverter.ts +532 -532
- package/src/engine-components/export/usdz/extensions/USDZText.ts +240 -240
- package/src/engine-components/export/usdz/extensions/USDZUI.ts +189 -189
- package/src/engine-components/export/usdz/extensions/behavior/Actions.ts +99 -99
- package/src/engine-components/export/usdz/extensions/behavior/AudioExtension.ts +102 -102
- package/src/engine-components/export/usdz/extensions/behavior/Behaviour.ts +320 -320
- package/src/engine-components/export/usdz/extensions/behavior/BehaviourComponents.ts +1225 -1225
- package/src/engine-components/export/usdz/extensions/behavior/BehavioursBuilder.ts +646 -646
- package/src/engine-components/export/usdz/extensions/behavior/PhysicsExtension.ts +132 -132
- package/src/engine-components/export/usdz/index.ts +2 -2
- package/src/engine-components/export/usdz/utils/animationutils.ts +191 -191
- package/src/engine-components/export/usdz/utils/quicklook.ts +50 -50
- package/src/engine-components/particlesystem/ParticleSystem.ts +1287 -1287
- package/src/engine-components/particlesystem/ParticleSystemModules.ts +1765 -1765
- package/src/engine-components/particlesystem/ParticleSystemSubEmitter.ts +111 -111
- package/src/engine-components/particlesystem/api.ts +1 -1
- package/src/engine-components/postprocessing/Effects/Antialiasing.ts +64 -64
- package/src/engine-components/postprocessing/Effects/BloomEffect.ts +116 -116
- package/src/engine-components/postprocessing/Effects/ChromaticAberration.ts +37 -37
- package/src/engine-components/postprocessing/Effects/ColorAdjustments.ts +106 -106
- package/src/engine-components/postprocessing/Effects/DepthOfField.ts +103 -103
- package/src/engine-components/postprocessing/Effects/EffectWrapper.ts +25 -25
- package/src/engine-components/postprocessing/Effects/Pixelation.ts +32 -32
- package/src/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusion.ts +90 -90
- package/src/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.ts +192 -192
- package/src/engine-components/postprocessing/Effects/Sharpening.ts +143 -143
- package/src/engine-components/postprocessing/Effects/TiltShiftEffect.ts +61 -61
- package/src/engine-components/postprocessing/Effects/Tonemapping.ts +103 -103
- package/src/engine-components/postprocessing/Effects/Tonemapping.utils.ts +60 -60
- package/src/engine-components/postprocessing/Effects/Vignette.ts +59 -59
- package/src/engine-components/postprocessing/PostProcessingEffect.ts +192 -192
- package/src/engine-components/postprocessing/PostProcessingHandler.ts +572 -572
- package/src/engine-components/postprocessing/Volume.ts +426 -426
- package/src/engine-components/postprocessing/VolumeParameter.ts +158 -158
- package/src/engine-components/postprocessing/VolumeProfile.ts +61 -61
- package/src/engine-components/postprocessing/index.ts +5 -5
- package/src/engine-components/postprocessing/utils.ts +154 -154
- package/src/engine-components/timeline/PlayableDirector.ts +722 -722
- package/src/engine-components/timeline/SignalAsset.ts +144 -144
- package/src/engine-components/timeline/TimelineModels.ts +92 -92
- package/src/engine-components/timeline/TimelineTracks.ts +967 -967
- package/src/engine-components/timeline/index.ts +3 -3
- package/src/engine-components/ui/BaseUIComponent.ts +203 -203
- package/src/engine-components/ui/Button.ts +307 -307
- package/src/engine-components/ui/Canvas.ts +419 -419
- package/src/engine-components/ui/CanvasGroup.ts +54 -54
- package/src/engine-components/ui/EventSystem.ts +854 -854
- package/src/engine-components/ui/Graphic.ts +275 -275
- package/src/engine-components/ui/Image.ts +112 -112
- package/src/engine-components/ui/InputField.ts +321 -321
- package/src/engine-components/ui/Interfaces.ts +57 -57
- package/src/engine-components/ui/Layout.ts +334 -334
- package/src/engine-components/ui/Outline.ts +13 -13
- package/src/engine-components/ui/PointerEvents.ts +206 -206
- package/src/engine-components/ui/RaycastUtils.ts +69 -69
- package/src/engine-components/ui/Raycaster.ts +102 -102
- package/src/engine-components/ui/RectTransform.ts +375 -375
- package/src/engine-components/ui/SpatialHtml.ts +79 -79
- package/src/engine-components/ui/Symbols.ts +1 -1
- package/src/engine-components/ui/Text.ts +578 -578
- package/src/engine-components/ui/Utils.ts +113 -113
- package/src/engine-components/utils/EnvironmentScene.ts +245 -245
- package/src/engine-components/utils/LookAt.ts +88 -88
- package/src/engine-components/utils/OpenURL.ts +114 -114
- package/src/engine-components/webxr/Avatar.ts +265 -265
- package/src/engine-components/webxr/TeleportTarget.ts +9 -9
- package/src/engine-components/webxr/WebARCameraBackground.ts +175 -175
- package/src/engine-components/webxr/WebARSessionRoot.ts +880 -880
- package/src/engine-components/webxr/WebXR.ts +585 -585
- package/src/engine-components/webxr/WebXRAvatar.ts +66 -66
- package/src/engine-components/webxr/WebXRImageTracking.ts +519 -519
- package/src/engine-components/webxr/WebXRPlaneTracking.ts +570 -570
- package/src/engine-components/webxr/WebXRRig.ts +77 -77
- package/src/engine-components/webxr/XRFlag.ts +147 -147
- package/src/engine-components/webxr/controllers/XRControllerFollow.ts +118 -118
- package/src/engine-components/webxr/controllers/XRControllerModel.ts +373 -373
- package/src/engine-components/webxr/controllers/XRControllerMovement.ts +550 -550
- package/src/engine-components/webxr/index.ts +2 -2
- package/src/engine-components/webxr/types.ts +3 -3
- package/src/engine-components-experimental/Presentation.ts +12 -12
- package/src/engine-components-experimental/api.ts +4 -4
- package/src/engine-components-experimental/networking/PlayerSync.ts +401 -401
- package/src/engine-schemes/COMPILE_SCHEMES.bat +3 -3
- package/src/engine-schemes/COMPILE_TS.bat +11 -11
- package/src/engine-schemes/README.md +1 -1
- package/src/engine-schemes/api.ts +12 -12
- package/src/engine-schemes/schemes.ts +28 -28
- package/src/engine-schemes/synced-camera-model.ts +92 -92
- package/src/engine-schemes/synced-transform-model.ts +90 -90
- package/src/engine-schemes/syncedCamera.fbs +10 -10
- package/src/engine-schemes/transform.ts +50 -50
- package/src/engine-schemes/transforms.fbs +25 -25
- package/src/engine-schemes/vec.fbs +19 -19
- package/src/engine-schemes/vec2.ts +33 -33
- package/src/engine-schemes/vec3.ts +38 -38
- package/src/engine-schemes/vec4.ts +43 -43
- package/src/engine-schemes/vr-user-state-buffer.ts +145 -145
- package/src/engine-schemes/vrUserStateBuffer.fbs +17 -17
- package/src/include/draco/draco_decoder.js +34 -34
- package/src/include/ktx2/basis_transcoder.js +21 -21
- package/src/include/needle/arial-msdf.json +1471 -1471
- package/src/include/three/DragControls.js +231 -231
- package/src/include/three/EXT_mesh_gpu_instancing_exporter.js +66 -66
- package/src/needle-engine.ts +70 -70
- package/dist/generateMeshBVH.worker-Cdfpaq5W.js +0 -25
- package/src/engine-schemes/dist/api.js +0 -17
- package/src/engine-schemes/dist/api.js.meta +0 -7
- package/src/engine-schemes/dist/schemes.js +0 -25
- package/src/engine-schemes/dist/schemes.js.meta +0 -7
- package/src/engine-schemes/dist/synced-camera-model.js +0 -74
- package/src/engine-schemes/dist/synced-camera-model.js.meta +0 -7
- package/src/engine-schemes/dist/synced-transform-model.js +0 -73
- package/src/engine-schemes/dist/synced-transform-model.js.meta +0 -7
- package/src/engine-schemes/dist/transform.js +0 -46
- package/src/engine-schemes/dist/transform.js.meta +0 -7
- package/src/engine-schemes/dist/vec2.js +0 -32
- package/src/engine-schemes/dist/vec2.js.meta +0 -7
- package/src/engine-schemes/dist/vec3.js +0 -36
- package/src/engine-schemes/dist/vec3.js.meta +0 -7
- package/src/engine-schemes/dist/vec4.js +0 -40
- package/src/engine-schemes/dist/vec4.js.meta +0 -7
- package/src/engine-schemes/dist/vr-user-state-buffer.js +0 -110
- package/src/engine-schemes/dist/vr-user-state-buffer.js.meta +0 -7
|
@@ -1,716 +1,716 @@
|
|
|
1
|
-
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
-
};
|
|
7
|
-
import { Color, Object3D, Quaternion, Vector3 } from "three";
|
|
8
|
-
import { InputEvents } from "../engine/engine_input.js";
|
|
9
|
-
import { RoomEvents } from "../engine/engine_networking.js";
|
|
10
|
-
import { RaycastOptions } from "../engine/engine_physics.js";
|
|
11
|
-
import { ViewDevice } from "../engine/engine_playerview.js";
|
|
12
|
-
import { serializable } from "../engine/engine_serialization.js";
|
|
13
|
-
import { getParam } from "../engine/engine_utils.js";
|
|
14
|
-
import { Camera } from "./Camera.js";
|
|
15
|
-
import { Behaviour, GameObject } from "./Component.js";
|
|
16
|
-
import { OrbitControls } from "./OrbitControls.js";
|
|
17
|
-
import { SmoothFollow } from "./SmoothFollow.js";
|
|
18
|
-
import { AvatarMarker } from "./webxr/WebXRAvatar.js";
|
|
19
|
-
import { XRStateFlag } from "./webxr/XRFlag.js";
|
|
20
|
-
/**
|
|
21
|
-
* Defines the viewing perspective in spectator mode
|
|
22
|
-
*/
|
|
23
|
-
export var SpectatorMode;
|
|
24
|
-
(function (SpectatorMode) {
|
|
25
|
-
/** View from the perspective of the followed player */
|
|
26
|
-
SpectatorMode[SpectatorMode["FirstPerson"] = 0] = "FirstPerson";
|
|
27
|
-
/** Freely view from a third-person perspective */
|
|
28
|
-
SpectatorMode[SpectatorMode["ThirdPerson"] = 1] = "ThirdPerson";
|
|
29
|
-
})(SpectatorMode || (SpectatorMode = {}));
|
|
30
|
-
const debug = getParam("debugspectator");
|
|
31
|
-
/**
|
|
32
|
-
* Provides functionality to follow and spectate other users in a networked environment.
|
|
33
|
-
* Handles camera switching, following behavior, and network synchronization for spectator mode.
|
|
34
|
-
*
|
|
35
|
-
* Debug mode can be enabled with the URL parameter `?debugspectator`, which provides additional console output.
|
|
36
|
-
*
|
|
37
|
-
* @category Networking
|
|
38
|
-
* @group Components
|
|
39
|
-
*/
|
|
40
|
-
export class SpectatorCamera extends Behaviour {
|
|
41
|
-
/** Reference to the Camera component on this GameObject */
|
|
42
|
-
cam = null;
|
|
43
|
-
/**
|
|
44
|
-
* When enabled, pressing F will send a request to all connected users to follow the local player.
|
|
45
|
-
* Pressing ESC will stop spectating.
|
|
46
|
-
*/
|
|
47
|
-
useKeys = true;
|
|
48
|
-
_mode = SpectatorMode.FirstPerson;
|
|
49
|
-
/** Gets the current spectator perspective mode */
|
|
50
|
-
get mode() { return this._mode; }
|
|
51
|
-
/** Sets the current spectator perspective mode */
|
|
52
|
-
set mode(val) {
|
|
53
|
-
this._mode = val;
|
|
54
|
-
}
|
|
55
|
-
/** Returns whether this user is currently spectating another user */
|
|
56
|
-
get isSpectating() {
|
|
57
|
-
return this._handler?.currentTarget !== undefined;
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Checks if this instance is spectating the user with the given ID
|
|
61
|
-
* @param userId The user ID to check
|
|
62
|
-
* @returns True if spectating the specified user, false otherwise
|
|
63
|
-
*/
|
|
64
|
-
isSpectatingUser(userId) {
|
|
65
|
-
return this.target?.userId === userId;
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Checks if the user with the specified ID is following this user
|
|
69
|
-
* @param userId The user ID to check
|
|
70
|
-
* @returns True if the specified user is following this user, false otherwise
|
|
71
|
-
*/
|
|
72
|
-
isFollowedBy(userId) {
|
|
73
|
-
return this.followers?.includes(userId);
|
|
74
|
-
}
|
|
75
|
-
/** List of user IDs that are currently following the user */
|
|
76
|
-
get followers() {
|
|
77
|
-
return this._networking.followers;
|
|
78
|
-
}
|
|
79
|
-
/** Stops the current spectating session */
|
|
80
|
-
stopSpectating() {
|
|
81
|
-
if (this.context.isInXR) {
|
|
82
|
-
this.followSelf();
|
|
83
|
-
return;
|
|
84
|
-
}
|
|
85
|
-
this.target = undefined;
|
|
86
|
-
}
|
|
87
|
-
/** Gets the local player's connection ID */
|
|
88
|
-
get localId() {
|
|
89
|
-
return this.context.connection.connectionId ?? "local";
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* Sets the player view to follow
|
|
93
|
-
* @param target The PlayerView to follow, or undefined to stop spectating
|
|
94
|
-
*/
|
|
95
|
-
set target(target) {
|
|
96
|
-
if (this._handler) {
|
|
97
|
-
// if (this.target?.userId) {
|
|
98
|
-
// const isFollowedByThisUser = this.followers.includes(this.target.userId);
|
|
99
|
-
// if (isFollowedByThisUser) {
|
|
100
|
-
// console.warn("Can not follow follower");
|
|
101
|
-
// target = undefined;
|
|
102
|
-
// }
|
|
103
|
-
// }
|
|
104
|
-
const prev = this._handler.currentTarget?.userId;
|
|
105
|
-
const self = this.context.players.getPlayerView(this.localId);
|
|
106
|
-
// if user is in XR and sets target to self disable it
|
|
107
|
-
if (target === undefined || (this.context.isInXR === false && self?.currentObject === target.currentObject)) {
|
|
108
|
-
if (this._handler.currentTarget !== undefined) {
|
|
109
|
-
this._handler.disable();
|
|
110
|
-
GameObject.setActive(this.gameObject, false);
|
|
111
|
-
if (this.orbit)
|
|
112
|
-
this.orbit.enabled = true;
|
|
113
|
-
this._networking.onSpectatedObjectChanged(target, prev);
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
else if (this._handler.currentTarget !== target) {
|
|
117
|
-
this._handler.set(target);
|
|
118
|
-
GameObject.setActive(this.gameObject, true);
|
|
119
|
-
if (this.orbit)
|
|
120
|
-
this.orbit.enabled = false;
|
|
121
|
-
this._networking.onSpectatedObjectChanged(target, prev);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
/** Gets the currently followed player view */
|
|
126
|
-
get target() {
|
|
127
|
-
return this._handler?.currentTarget;
|
|
128
|
-
}
|
|
129
|
-
/** Sends a network request for all users to follow this player */
|
|
130
|
-
requestAllFollowMe() {
|
|
131
|
-
this._networking.onRequestFollowMe();
|
|
132
|
-
}
|
|
133
|
-
/** Determines if the camera is spectating the local player */
|
|
134
|
-
get isSpectatingSelf() {
|
|
135
|
-
return this.isSpectating && this.target?.currentObject === this.context.players.getPlayerView(this.localId)?.currentObject;
|
|
136
|
-
}
|
|
137
|
-
// private currentViewport : Vector4 = new Vector4();
|
|
138
|
-
// private currentScissor : Vector4 = new Vector4();
|
|
139
|
-
// private currentScissorTest : boolean = false;
|
|
140
|
-
orbit = null;
|
|
141
|
-
_handler;
|
|
142
|
-
eventSub_WebXRRequestStartEvent = null;
|
|
143
|
-
eventSub_WebXRStartEvent = null;
|
|
144
|
-
eventSub_WebXREndEvent = null;
|
|
145
|
-
_debug;
|
|
146
|
-
_networking;
|
|
147
|
-
awake() {
|
|
148
|
-
this._debug = new SpectatorSelectionController(this.context, this);
|
|
149
|
-
this._networking = new SpectatorCamNetworking(this.context, this);
|
|
150
|
-
this._networking.awake();
|
|
151
|
-
GameObject.setActive(this.gameObject, false);
|
|
152
|
-
this.cam = GameObject.getComponent(this.gameObject, Camera);
|
|
153
|
-
if (!this.cam) {
|
|
154
|
-
console.warn("SpectatorCamera: Spectator camera needs camera component on the same object.", this);
|
|
155
|
-
return;
|
|
156
|
-
}
|
|
157
|
-
if (!this._handler && this.cam)
|
|
158
|
-
this._handler = new SpectatorHandler(this.context, this.cam, this);
|
|
159
|
-
this.orbit = GameObject.getComponent(this.context.mainCamera, OrbitControls);
|
|
160
|
-
}
|
|
161
|
-
onDestroy() {
|
|
162
|
-
this.stopSpectating();
|
|
163
|
-
this._handler?.destroy();
|
|
164
|
-
this._networking?.destroy();
|
|
165
|
-
}
|
|
166
|
-
/**
|
|
167
|
-
* Checks if the current platform supports spectator mode
|
|
168
|
-
* @returns True if the platform is supported, false otherwise
|
|
169
|
-
*/
|
|
170
|
-
isSupportedPlatform() {
|
|
171
|
-
const ua = window.navigator.userAgent;
|
|
172
|
-
const standalone = /Windows|MacOS/.test(ua);
|
|
173
|
-
const isHololens = /Windows NT/.test(ua) && /Edg/.test(ua) && !/Win64/.test(ua);
|
|
174
|
-
return standalone && !isHololens;
|
|
175
|
-
}
|
|
176
|
-
/**
|
|
177
|
-
* Called before entering WebXR mode
|
|
178
|
-
* @param _evt The WebXR event
|
|
179
|
-
*/
|
|
180
|
-
onBeforeXR(_evt) {
|
|
181
|
-
if (!this.isSupportedPlatform())
|
|
182
|
-
return;
|
|
183
|
-
GameObject.setActive(this.gameObject, true);
|
|
184
|
-
}
|
|
185
|
-
/**
|
|
186
|
-
* Called when entering WebXR mode
|
|
187
|
-
* @param _evt The WebXR event
|
|
188
|
-
*/
|
|
189
|
-
onEnterXR(_evt) {
|
|
190
|
-
if (!this.isSupportedPlatform())
|
|
191
|
-
return;
|
|
192
|
-
if (debug)
|
|
193
|
-
console.log(this.context.mainCamera);
|
|
194
|
-
if (this.context.mainCamera) {
|
|
195
|
-
this.followSelf();
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
/**
|
|
199
|
-
* Called when exiting WebXR mode
|
|
200
|
-
* @param _evt The WebXR event
|
|
201
|
-
*/
|
|
202
|
-
onLeaveXR(_evt) {
|
|
203
|
-
this.context.removeCamera(this.cam);
|
|
204
|
-
GameObject.setActive(this.gameObject, false);
|
|
205
|
-
if (this.orbit)
|
|
206
|
-
this.orbit.enabled = true;
|
|
207
|
-
this._handler?.set(undefined);
|
|
208
|
-
this._handler?.disable();
|
|
209
|
-
if (this.isSpectatingSelf)
|
|
210
|
-
this.stopSpectating();
|
|
211
|
-
}
|
|
212
|
-
/**
|
|
213
|
-
* Sets the target to follow the local player
|
|
214
|
-
*/
|
|
215
|
-
followSelf() {
|
|
216
|
-
this.target = this.context.players.getPlayerView(this.context.connection.connectionId);
|
|
217
|
-
if (!this.target) {
|
|
218
|
-
this.context.players.setPlayerView(this.localId, this.context.mainCamera, ViewDevice.Headset);
|
|
219
|
-
this.target = this.context.players.getPlayerView(this.localId);
|
|
220
|
-
}
|
|
221
|
-
if (debug)
|
|
222
|
-
console.log("Follow self", this.target);
|
|
223
|
-
}
|
|
224
|
-
// TODO: only show Spectator cam for DesktopVR;
|
|
225
|
-
// don't show for AR, don't show on Quest
|
|
226
|
-
// TODO: properly align cameras on enter/exit VR, seems currently spectator cam breaks alignment
|
|
227
|
-
/**
|
|
228
|
-
* Called after the main rendering pass to render the spectator view
|
|
229
|
-
*/
|
|
230
|
-
onAfterRender() {
|
|
231
|
-
if (!this.cam)
|
|
232
|
-
return;
|
|
233
|
-
const renderer = this.context.renderer;
|
|
234
|
-
const xrWasEnabled = renderer.xr.enabled;
|
|
235
|
-
if (!renderer.xr.isPresenting && !this._handler?.currentTarget)
|
|
236
|
-
return;
|
|
237
|
-
this._handler?.update(this._mode);
|
|
238
|
-
// remember XR render target so we can restore later
|
|
239
|
-
const previousRenderTarget = renderer.getRenderTarget();
|
|
240
|
-
let oldFramebuffer = null;
|
|
241
|
-
const webglState = renderer.state;
|
|
242
|
-
// seems that in some cases, renderer.getRenderTarget returns null
|
|
243
|
-
// even when we're rendering to a headset.
|
|
244
|
-
if (!previousRenderTarget) {
|
|
245
|
-
if (!renderer.state.bindFramebuffer || !webglState.bindXRFramebuffer)
|
|
246
|
-
return;
|
|
247
|
-
oldFramebuffer = renderer["_framebuffer"];
|
|
248
|
-
webglState.bindXRFramebuffer(null);
|
|
249
|
-
}
|
|
250
|
-
this.setAvatarFlagsBeforeRender();
|
|
251
|
-
const mainCam = this.context.mainCameraComponent;
|
|
252
|
-
// these should not be needed if we don't override viewport/scissor
|
|
253
|
-
// renderer.getViewport(this.currentViewport);
|
|
254
|
-
// renderer.getScissor(this.currentScissor);
|
|
255
|
-
// this.currentScissorTest = renderer.getScissorTest();
|
|
256
|
-
// for scissor rendering (e.g. just a part of the screen / viewport, multiplayer split view)
|
|
257
|
-
// let left = 0;
|
|
258
|
-
// let bottom = 100;
|
|
259
|
-
// let width = 300;
|
|
260
|
-
// let height = 300;
|
|
261
|
-
// renderer.setViewport(left, bottom, width, height);
|
|
262
|
-
// renderer.setScissor(left, bottom, width, height);
|
|
263
|
-
// renderer.setScissorTest(true);
|
|
264
|
-
if (mainCam) {
|
|
265
|
-
const backgroundColor = mainCam.backgroundColor;
|
|
266
|
-
if (backgroundColor)
|
|
267
|
-
renderer.setClearColor(backgroundColor, backgroundColor.alpha);
|
|
268
|
-
this.cam.backgroundColor = backgroundColor;
|
|
269
|
-
this.cam.clearFlags = mainCam.clearFlags;
|
|
270
|
-
this.cam.nearClipPlane = mainCam.nearClipPlane;
|
|
271
|
-
this.cam.farClipPlane = mainCam.farClipPlane;
|
|
272
|
-
}
|
|
273
|
-
else
|
|
274
|
-
renderer.setClearColor(new Color(1, 1, 1));
|
|
275
|
-
renderer.setRenderTarget(null); // null: direct to Canvas
|
|
276
|
-
renderer.xr.enabled = false;
|
|
277
|
-
const cam = this.cam?.threeCamera;
|
|
278
|
-
this.context.updateAspect(cam);
|
|
279
|
-
const wasPresenting = renderer.xr.isPresenting;
|
|
280
|
-
renderer.xr.isPresenting = false;
|
|
281
|
-
renderer.setSize(this.context.domWidth, this.context.domHeight);
|
|
282
|
-
renderer.render(this.context.scene, cam);
|
|
283
|
-
renderer.xr.isPresenting = wasPresenting;
|
|
284
|
-
// restore previous settings so we can continue to render XR
|
|
285
|
-
renderer.xr.enabled = xrWasEnabled;
|
|
286
|
-
//renderer.setViewport(this.currentViewport);
|
|
287
|
-
//renderer.setScissor(this.currentScissor);
|
|
288
|
-
//renderer.setScissorTest(this.currentScissorTest);
|
|
289
|
-
if (previousRenderTarget)
|
|
290
|
-
renderer.setRenderTarget(previousRenderTarget);
|
|
291
|
-
else if (webglState.bindXRFramebuffer)
|
|
292
|
-
webglState.bindXRFramebuffer(oldFramebuffer);
|
|
293
|
-
this.resetAvatarFlags();
|
|
294
|
-
}
|
|
295
|
-
/**
|
|
296
|
-
* Updates avatar visibility flags for rendering in spectator mode
|
|
297
|
-
*/
|
|
298
|
-
setAvatarFlagsBeforeRender() {
|
|
299
|
-
const isFirstPersonMode = this._mode === SpectatorMode.FirstPerson;
|
|
300
|
-
for (const av of AvatarMarker.instances) {
|
|
301
|
-
if (av.avatar && "isLocalAvatar" in av.avatar && "flags" in av.avatar) {
|
|
302
|
-
let mask = XRStateFlag.All;
|
|
303
|
-
if (this.isSpectatingSelf)
|
|
304
|
-
mask = isFirstPersonMode && av.avatar.isLocalAvatar ? XRStateFlag.FirstPerson : XRStateFlag.ThirdPerson;
|
|
305
|
-
const flags = av.avatar.flags;
|
|
306
|
-
if (!flags)
|
|
307
|
-
continue;
|
|
308
|
-
for (const flag of flags) {
|
|
309
|
-
flag.UpdateVisible(mask);
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
/**
|
|
315
|
-
* Restores avatar visibility flags after spectator rendering
|
|
316
|
-
*/
|
|
317
|
-
resetAvatarFlags() {
|
|
318
|
-
for (const av of AvatarMarker.instances) {
|
|
319
|
-
if (av.avatar && "flags" in av.avatar) {
|
|
320
|
-
const flags = av.avatar.flags;
|
|
321
|
-
if (!flags)
|
|
322
|
-
continue;
|
|
323
|
-
for (const flag of flags) {
|
|
324
|
-
if ("isLocalAvatar" in av.avatar && av.avatar?.isLocalAvatar) {
|
|
325
|
-
flag.UpdateVisible(XRStateFlag.FirstPerson);
|
|
326
|
-
}
|
|
327
|
-
else {
|
|
328
|
-
flag.UpdateVisible(XRStateFlag.ThirdPerson);
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
__decorate([
|
|
336
|
-
serializable()
|
|
337
|
-
], SpectatorCamera.prototype, "useKeys", void 0);
|
|
338
|
-
/**
|
|
339
|
-
* Handles the smooth following behavior for the spectator camera
|
|
340
|
-
*/
|
|
341
|
-
class SpectatorHandler {
|
|
342
|
-
context;
|
|
343
|
-
cam;
|
|
344
|
-
spectator;
|
|
345
|
-
follow;
|
|
346
|
-
target;
|
|
347
|
-
view;
|
|
348
|
-
currentObject;
|
|
349
|
-
/** Gets the currently targeted player view */
|
|
350
|
-
get currentTarget() {
|
|
351
|
-
return this.view;
|
|
352
|
-
}
|
|
353
|
-
constructor(context, cam, spectator) {
|
|
354
|
-
this.context = context;
|
|
355
|
-
this.cam = cam;
|
|
356
|
-
this.spectator = spectator;
|
|
357
|
-
}
|
|
358
|
-
/**
|
|
359
|
-
* Sets the target player view to follow
|
|
360
|
-
* @param view The PlayerView to follow
|
|
361
|
-
*/
|
|
362
|
-
set(view) {
|
|
363
|
-
const followObject = view?.currentObject;
|
|
364
|
-
if (!followObject) {
|
|
365
|
-
this.spectator.stopSpectating();
|
|
366
|
-
return;
|
|
367
|
-
}
|
|
368
|
-
if (followObject === this.currentObject)
|
|
369
|
-
return;
|
|
370
|
-
this.currentObject = followObject;
|
|
371
|
-
this.view = view;
|
|
372
|
-
if (!this.follow)
|
|
373
|
-
this.follow = GameObject.addComponent(this.cam.gameObject, SmoothFollow);
|
|
374
|
-
if (!this.target)
|
|
375
|
-
this.target = new Object3D();
|
|
376
|
-
followObject.add(this.target);
|
|
377
|
-
this.follow.enabled = true;
|
|
378
|
-
this.follow.target = this.target;
|
|
379
|
-
// this.context.setCurrentCamera(this.cam);
|
|
380
|
-
if (debug)
|
|
381
|
-
console.log("FOLLOW", followObject);
|
|
382
|
-
if (!this.context.isInXR) {
|
|
383
|
-
this.context.setCurrentCamera(this.cam);
|
|
384
|
-
}
|
|
385
|
-
else
|
|
386
|
-
this.context.removeCamera(this.cam);
|
|
387
|
-
}
|
|
388
|
-
/** Disables the spectator following behavior */
|
|
389
|
-
disable() {
|
|
390
|
-
if (debug)
|
|
391
|
-
console.log("STOP FOLLOW", this.currentObject);
|
|
392
|
-
this.view = undefined;
|
|
393
|
-
this.currentObject = undefined;
|
|
394
|
-
this.context.removeCamera(this.cam);
|
|
395
|
-
if (this.follow)
|
|
396
|
-
this.follow.enabled = false;
|
|
397
|
-
}
|
|
398
|
-
/** Cleans up resources used by the handler */
|
|
399
|
-
destroy() {
|
|
400
|
-
this.target?.removeFromParent();
|
|
401
|
-
if (this.follow)
|
|
402
|
-
GameObject.destroy(this.follow);
|
|
403
|
-
}
|
|
404
|
-
/**
|
|
405
|
-
* Updates the camera position and orientation based on the spectator mode
|
|
406
|
-
* @param mode The current spectator mode (first or third person)
|
|
407
|
-
*/
|
|
408
|
-
update(mode) {
|
|
409
|
-
if (this.currentTarget?.isConnected === false || this.currentTarget?.removed === true) {
|
|
410
|
-
if (debug)
|
|
411
|
-
console.log("Target disconnected or timeout", this.currentTarget);
|
|
412
|
-
this.spectator.stopSpectating();
|
|
413
|
-
return;
|
|
414
|
-
}
|
|
415
|
-
if (this.currentTarget && this.currentTarget?.currentObject !== this.currentObject) {
|
|
416
|
-
if (debug)
|
|
417
|
-
console.log("Target changed", this.currentObject, "to", this.currentTarget.currentObject);
|
|
418
|
-
this.set(this.currentTarget);
|
|
419
|
-
}
|
|
420
|
-
const perspectiveCamera = this.context.mainCamera;
|
|
421
|
-
if (perspectiveCamera) {
|
|
422
|
-
const cam = this.cam.threeCamera;
|
|
423
|
-
if (cam.near !== perspectiveCamera.near || cam.far !== perspectiveCamera.far) {
|
|
424
|
-
cam.near = perspectiveCamera.near;
|
|
425
|
-
cam.far = perspectiveCamera.far;
|
|
426
|
-
cam.updateProjectionMatrix();
|
|
427
|
-
}
|
|
428
|
-
}
|
|
429
|
-
const target = this.follow?.target;
|
|
430
|
-
if (!target || !this.follow)
|
|
431
|
-
return;
|
|
432
|
-
switch (mode) {
|
|
433
|
-
case SpectatorMode.FirstPerson:
|
|
434
|
-
if (this.view?.viewDevice !== ViewDevice.Browser) {
|
|
435
|
-
// soft follow for AR and VR
|
|
436
|
-
this.follow.followFactor = 5;
|
|
437
|
-
this.follow.rotateFactor = 5;
|
|
438
|
-
}
|
|
439
|
-
else {
|
|
440
|
-
// snappy follow for desktop
|
|
441
|
-
this.follow.followFactor = 50;
|
|
442
|
-
this.follow.rotateFactor = 50;
|
|
443
|
-
}
|
|
444
|
-
target.position.set(0, 0, 0);
|
|
445
|
-
break;
|
|
446
|
-
case SpectatorMode.ThirdPerson:
|
|
447
|
-
this.follow.followFactor = 3;
|
|
448
|
-
this.follow.rotateFactor = 2;
|
|
449
|
-
target.position.set(0, .5, 1.5);
|
|
450
|
-
break;
|
|
451
|
-
}
|
|
452
|
-
this.follow.flipForward = false;
|
|
453
|
-
// console.log(this.view);
|
|
454
|
-
if (this.view?.viewDevice !== ViewDevice.Browser)
|
|
455
|
-
target.quaternion.copy(_inverseYQuat);
|
|
456
|
-
else
|
|
457
|
-
target.quaternion.identity();
|
|
458
|
-
}
|
|
459
|
-
}
|
|
460
|
-
const _inverseYQuat = new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), Math.PI);
|
|
461
|
-
/**
|
|
462
|
-
* Handles user input for selecting targets to spectate
|
|
463
|
-
*/
|
|
464
|
-
class SpectatorSelectionController {
|
|
465
|
-
context;
|
|
466
|
-
spectator;
|
|
467
|
-
constructor(context, spectator) {
|
|
468
|
-
this.context = context;
|
|
469
|
-
this.spectator = spectator;
|
|
470
|
-
console.log("[Spectator Camera] Click other avatars or cameras to follow them. Press ESC to exit spectator mode.");
|
|
471
|
-
this.context.domElement.addEventListener("keydown", (evt) => {
|
|
472
|
-
if (!this.spectator.useKeys)
|
|
473
|
-
return;
|
|
474
|
-
const key = evt.key;
|
|
475
|
-
if (key === "Escape") {
|
|
476
|
-
this.spectator.stopSpectating();
|
|
477
|
-
}
|
|
478
|
-
});
|
|
479
|
-
let downTime = 0;
|
|
480
|
-
this.context.input.addEventListener(InputEvents.PointerDown, _ => {
|
|
481
|
-
downTime = this.context.time.time;
|
|
482
|
-
});
|
|
483
|
-
this.context.input.addEventListener(InputEvents.PointerUp, _ => {
|
|
484
|
-
const dt = this.context.time.time - downTime;
|
|
485
|
-
if (dt > 1) {
|
|
486
|
-
this.spectator.stopSpectating();
|
|
487
|
-
}
|
|
488
|
-
else if (this.context.input.getPointerClicked(0) && dt < .3)
|
|
489
|
-
this.trySelectObject();
|
|
490
|
-
});
|
|
491
|
-
}
|
|
492
|
-
/**
|
|
493
|
-
* Attempts to select an avatar to spectate through raycasting
|
|
494
|
-
*/
|
|
495
|
-
trySelectObject() {
|
|
496
|
-
const opts = new RaycastOptions();
|
|
497
|
-
opts.setMask(0xffffff);
|
|
498
|
-
// opts.cam = this.spectator.cam?.cam;
|
|
499
|
-
const hits = this.context.physics.raycast(opts);
|
|
500
|
-
if (debug)
|
|
501
|
-
console.log(...hits);
|
|
502
|
-
if (hits?.length) {
|
|
503
|
-
for (const hit of hits) {
|
|
504
|
-
if (hit.distance < .2)
|
|
505
|
-
continue;
|
|
506
|
-
const obj = hit.object;
|
|
507
|
-
const avatar = GameObject.getComponentInParent(obj, AvatarMarker);
|
|
508
|
-
const id = avatar?.connectionId;
|
|
509
|
-
if (id) {
|
|
510
|
-
const view = this.context.players.getPlayerView(id);
|
|
511
|
-
this.spectator.target = view;
|
|
512
|
-
if (debug)
|
|
513
|
-
console.log("spectate", id, avatar);
|
|
514
|
-
break;
|
|
515
|
-
}
|
|
516
|
-
}
|
|
517
|
-
}
|
|
518
|
-
}
|
|
519
|
-
}
|
|
520
|
-
/**
|
|
521
|
-
* Network model for communicating follower changes
|
|
522
|
-
*/
|
|
523
|
-
class SpectatorFollowerChangedEventModel {
|
|
524
|
-
/** The user ID that is following */
|
|
525
|
-
guid;
|
|
526
|
-
dontSave = true;
|
|
527
|
-
/** The user ID being followed */
|
|
528
|
-
targetUserId;
|
|
529
|
-
/** Indicates if the user stopped following */
|
|
530
|
-
stoppedFollowing;
|
|
531
|
-
constructor(connectionId, userId, stoppedFollowing) {
|
|
532
|
-
this.guid = connectionId;
|
|
533
|
-
this.targetUserId = userId;
|
|
534
|
-
this.stoppedFollowing = stoppedFollowing;
|
|
535
|
-
}
|
|
536
|
-
}
|
|
537
|
-
/**
|
|
538
|
-
* Network model for requesting users to follow a specific player
|
|
539
|
-
*/
|
|
540
|
-
class SpectatorFollowEventModel {
|
|
541
|
-
guid;
|
|
542
|
-
userId;
|
|
543
|
-
constructor(comp, userId) {
|
|
544
|
-
this.guid = comp.guid;
|
|
545
|
-
this.userId = userId;
|
|
546
|
-
}
|
|
547
|
-
}
|
|
548
|
-
/**
|
|
549
|
-
* Handles network communication for spectator functionality
|
|
550
|
-
*/
|
|
551
|
-
class SpectatorCamNetworking {
|
|
552
|
-
/** List of user IDs currently following this player */
|
|
553
|
-
followers = [];
|
|
554
|
-
context;
|
|
555
|
-
spectator;
|
|
556
|
-
_followerEventMethod;
|
|
557
|
-
_requestFollowMethod;
|
|
558
|
-
_joinedRoomMethod;
|
|
559
|
-
constructor(context, spectator) {
|
|
560
|
-
this.context = context;
|
|
561
|
-
this.spectator = spectator;
|
|
562
|
-
this._followerEventMethod = this.onFollowerEvent.bind(this);
|
|
563
|
-
this._requestFollowMethod = this.onRequestFollowEvent.bind(this);
|
|
564
|
-
this._joinedRoomMethod = this.onUserJoinedRoom.bind(this);
|
|
565
|
-
}
|
|
566
|
-
/**
|
|
567
|
-
* Initializes network event listeners
|
|
568
|
-
*/
|
|
569
|
-
awake() {
|
|
570
|
-
this.context.connection.beginListen("spectator-follower-changed", this._followerEventMethod);
|
|
571
|
-
this.context.connection.beginListen("spectator-request-follow", this._requestFollowMethod);
|
|
572
|
-
this.context.connection.beginListen(RoomEvents.JoinedRoom, this._joinedRoomMethod);
|
|
573
|
-
this.context.domElement.addEventListener("keydown", evt => {
|
|
574
|
-
if (!this.spectator.useKeys)
|
|
575
|
-
return;
|
|
576
|
-
if (evt.key === "f") {
|
|
577
|
-
this.onRequestFollowMe();
|
|
578
|
-
}
|
|
579
|
-
else if (evt.key === "Escape") {
|
|
580
|
-
this.onRequestFollowMe(true);
|
|
581
|
-
}
|
|
582
|
-
});
|
|
583
|
-
}
|
|
584
|
-
/**
|
|
585
|
-
* Removes network event listeners
|
|
586
|
-
*/
|
|
587
|
-
destroy() {
|
|
588
|
-
this.context.connection.stopListen("spectator-follower-changed", this._followerEventMethod);
|
|
589
|
-
this.context.connection.stopListen("spectator-request-follow", this._requestFollowMethod);
|
|
590
|
-
this.context.connection.stopListen(RoomEvents.JoinedRoom, this._joinedRoomMethod);
|
|
591
|
-
}
|
|
592
|
-
/**
|
|
593
|
-
* Notifies other users about spectating target changes
|
|
594
|
-
* @param target The new target being spectated
|
|
595
|
-
* @param _prevId The previous target's user ID
|
|
596
|
-
*/
|
|
597
|
-
onSpectatedObjectChanged(target, _prevId) {
|
|
598
|
-
if (debug)
|
|
599
|
-
console.log(this.context.connection.connectionId, "onSpectatedObjectChanged", target, _prevId);
|
|
600
|
-
if (this.context.connection.connectionId) {
|
|
601
|
-
const stopped = target?.userId === undefined;
|
|
602
|
-
const userId = stopped ? _prevId : target?.userId;
|
|
603
|
-
const evt = new SpectatorFollowerChangedEventModel(this.context.connection.connectionId, userId, stopped);
|
|
604
|
-
this.context.connection.send("spectator-follower-changed", evt);
|
|
605
|
-
}
|
|
606
|
-
}
|
|
607
|
-
/**
|
|
608
|
-
* Requests other users to follow this player or stop following
|
|
609
|
-
* @param stop Whether to request users to stop following
|
|
610
|
-
*/
|
|
611
|
-
onRequestFollowMe(stop = false) {
|
|
612
|
-
if (debug)
|
|
613
|
-
console.log("Request follow", this.context.connection.connectionId);
|
|
614
|
-
if (this.context.connection.connectionId) {
|
|
615
|
-
this.spectator.stopSpectating();
|
|
616
|
-
const id = stop ? undefined : this.context.connection.connectionId;
|
|
617
|
-
const model = new SpectatorFollowEventModel(this.spectator, id);
|
|
618
|
-
this.context.connection.send("spectator-request-follow", model);
|
|
619
|
-
}
|
|
620
|
-
}
|
|
621
|
-
/**
|
|
622
|
-
* Handles room join events
|
|
623
|
-
*/
|
|
624
|
-
onUserJoinedRoom() {
|
|
625
|
-
if (getParam("followme")) {
|
|
626
|
-
this.onRequestFollowMe();
|
|
627
|
-
}
|
|
628
|
-
}
|
|
629
|
-
/**
|
|
630
|
-
* Processes follower status change events from the network
|
|
631
|
-
* @param evt The follower change event data
|
|
632
|
-
*/
|
|
633
|
-
onFollowerEvent(evt) {
|
|
634
|
-
const userBeingFollowed = evt.targetUserId;
|
|
635
|
-
const userThatIsFollowing = evt.guid;
|
|
636
|
-
if (debug)
|
|
637
|
-
console.log(evt);
|
|
638
|
-
if (userBeingFollowed === this.context.connection.connectionId) {
|
|
639
|
-
if (evt.stoppedFollowing) {
|
|
640
|
-
const index = this.followers.indexOf(userThatIsFollowing);
|
|
641
|
-
if (index !== -1) {
|
|
642
|
-
this.followers.splice(index, 1);
|
|
643
|
-
this.removeDisconnectedFollowers();
|
|
644
|
-
console.log(userThatIsFollowing, "unfollows you", this.followers.length);
|
|
645
|
-
}
|
|
646
|
-
}
|
|
647
|
-
else {
|
|
648
|
-
if (!this.followers.includes(userThatIsFollowing)) {
|
|
649
|
-
this.followers.push(userThatIsFollowing);
|
|
650
|
-
this.removeDisconnectedFollowers();
|
|
651
|
-
console.log(userThatIsFollowing, "follows you", this.followers.length);
|
|
652
|
-
}
|
|
653
|
-
}
|
|
654
|
-
}
|
|
655
|
-
}
|
|
656
|
-
/**
|
|
657
|
-
* Removes followers that are no longer connected to the room
|
|
658
|
-
*/
|
|
659
|
-
removeDisconnectedFollowers() {
|
|
660
|
-
for (let i = this.followers.length - 1; i >= 0; i--) {
|
|
661
|
-
const id = this.followers[i];
|
|
662
|
-
if (this.context.connection.userIsInRoom(id) === false) {
|
|
663
|
-
this.followers.splice(i, 1);
|
|
664
|
-
}
|
|
665
|
-
}
|
|
666
|
-
}
|
|
667
|
-
_lastRequestFollowUser;
|
|
668
|
-
/**
|
|
669
|
-
* Handles follow requests from other users
|
|
670
|
-
* @param evt The follow request event
|
|
671
|
-
* @returns True if the request was handled successfully
|
|
672
|
-
*/
|
|
673
|
-
onRequestFollowEvent(evt) {
|
|
674
|
-
this._lastRequestFollowUser = evt;
|
|
675
|
-
if (evt.userId === this.context.connection.connectionId) {
|
|
676
|
-
this.spectator.stopSpectating();
|
|
677
|
-
}
|
|
678
|
-
else if (evt.userId === undefined) {
|
|
679
|
-
// this will currently also stop spectating if the user is not following you
|
|
680
|
-
this.spectator.stopSpectating();
|
|
681
|
-
}
|
|
682
|
-
else {
|
|
683
|
-
const view = this.context.players.getPlayerView(evt.userId);
|
|
684
|
-
if (view) {
|
|
685
|
-
this.spectator.target = view;
|
|
686
|
-
}
|
|
687
|
-
else {
|
|
688
|
-
if (debug)
|
|
689
|
-
console.warn("Could not find view", evt.userId);
|
|
690
|
-
this.enforceFollow();
|
|
691
|
-
return false;
|
|
692
|
-
}
|
|
693
|
-
}
|
|
694
|
-
return true;
|
|
695
|
-
}
|
|
696
|
-
_enforceFollowInterval;
|
|
697
|
-
/**
|
|
698
|
-
* Periodically retries following a user if the initial attempt failed
|
|
699
|
-
*/
|
|
700
|
-
enforceFollow() {
|
|
701
|
-
if (this._enforceFollowInterval)
|
|
702
|
-
return;
|
|
703
|
-
this._enforceFollowInterval = setInterval(() => {
|
|
704
|
-
if (this._lastRequestFollowUser === undefined || this._lastRequestFollowUser.userId && this.spectator.isFollowedBy(this._lastRequestFollowUser.userId)) {
|
|
705
|
-
clearInterval(this._enforceFollowInterval);
|
|
706
|
-
this._enforceFollowInterval = undefined;
|
|
707
|
-
}
|
|
708
|
-
else {
|
|
709
|
-
if (debug)
|
|
710
|
-
console.log("REQUEST FOLLOW AGAIN", this._lastRequestFollowUser.userId);
|
|
711
|
-
this.onRequestFollowEvent(this._lastRequestFollowUser);
|
|
712
|
-
}
|
|
713
|
-
}, 1000);
|
|
714
|
-
}
|
|
715
|
-
}
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { Color, Object3D, Quaternion, Vector3 } from "three";
|
|
8
|
+
import { InputEvents } from "../engine/engine_input.js";
|
|
9
|
+
import { RoomEvents } from "../engine/engine_networking.js";
|
|
10
|
+
import { RaycastOptions } from "../engine/engine_physics.js";
|
|
11
|
+
import { ViewDevice } from "../engine/engine_playerview.js";
|
|
12
|
+
import { serializable } from "../engine/engine_serialization.js";
|
|
13
|
+
import { getParam } from "../engine/engine_utils.js";
|
|
14
|
+
import { Camera } from "./Camera.js";
|
|
15
|
+
import { Behaviour, GameObject } from "./Component.js";
|
|
16
|
+
import { OrbitControls } from "./OrbitControls.js";
|
|
17
|
+
import { SmoothFollow } from "./SmoothFollow.js";
|
|
18
|
+
import { AvatarMarker } from "./webxr/WebXRAvatar.js";
|
|
19
|
+
import { XRStateFlag } from "./webxr/XRFlag.js";
|
|
20
|
+
/**
|
|
21
|
+
* Defines the viewing perspective in spectator mode
|
|
22
|
+
*/
|
|
23
|
+
export var SpectatorMode;
|
|
24
|
+
(function (SpectatorMode) {
|
|
25
|
+
/** View from the perspective of the followed player */
|
|
26
|
+
SpectatorMode[SpectatorMode["FirstPerson"] = 0] = "FirstPerson";
|
|
27
|
+
/** Freely view from a third-person perspective */
|
|
28
|
+
SpectatorMode[SpectatorMode["ThirdPerson"] = 1] = "ThirdPerson";
|
|
29
|
+
})(SpectatorMode || (SpectatorMode = {}));
|
|
30
|
+
const debug = getParam("debugspectator");
|
|
31
|
+
/**
|
|
32
|
+
* Provides functionality to follow and spectate other users in a networked environment.
|
|
33
|
+
* Handles camera switching, following behavior, and network synchronization for spectator mode.
|
|
34
|
+
*
|
|
35
|
+
* Debug mode can be enabled with the URL parameter `?debugspectator`, which provides additional console output.
|
|
36
|
+
*
|
|
37
|
+
* @category Networking
|
|
38
|
+
* @group Components
|
|
39
|
+
*/
|
|
40
|
+
export class SpectatorCamera extends Behaviour {
|
|
41
|
+
/** Reference to the Camera component on this GameObject */
|
|
42
|
+
cam = null;
|
|
43
|
+
/**
|
|
44
|
+
* When enabled, pressing F will send a request to all connected users to follow the local player.
|
|
45
|
+
* Pressing ESC will stop spectating.
|
|
46
|
+
*/
|
|
47
|
+
useKeys = true;
|
|
48
|
+
_mode = SpectatorMode.FirstPerson;
|
|
49
|
+
/** Gets the current spectator perspective mode */
|
|
50
|
+
get mode() { return this._mode; }
|
|
51
|
+
/** Sets the current spectator perspective mode */
|
|
52
|
+
set mode(val) {
|
|
53
|
+
this._mode = val;
|
|
54
|
+
}
|
|
55
|
+
/** Returns whether this user is currently spectating another user */
|
|
56
|
+
get isSpectating() {
|
|
57
|
+
return this._handler?.currentTarget !== undefined;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Checks if this instance is spectating the user with the given ID
|
|
61
|
+
* @param userId The user ID to check
|
|
62
|
+
* @returns True if spectating the specified user, false otherwise
|
|
63
|
+
*/
|
|
64
|
+
isSpectatingUser(userId) {
|
|
65
|
+
return this.target?.userId === userId;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Checks if the user with the specified ID is following this user
|
|
69
|
+
* @param userId The user ID to check
|
|
70
|
+
* @returns True if the specified user is following this user, false otherwise
|
|
71
|
+
*/
|
|
72
|
+
isFollowedBy(userId) {
|
|
73
|
+
return this.followers?.includes(userId);
|
|
74
|
+
}
|
|
75
|
+
/** List of user IDs that are currently following the user */
|
|
76
|
+
get followers() {
|
|
77
|
+
return this._networking.followers;
|
|
78
|
+
}
|
|
79
|
+
/** Stops the current spectating session */
|
|
80
|
+
stopSpectating() {
|
|
81
|
+
if (this.context.isInXR) {
|
|
82
|
+
this.followSelf();
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
this.target = undefined;
|
|
86
|
+
}
|
|
87
|
+
/** Gets the local player's connection ID */
|
|
88
|
+
get localId() {
|
|
89
|
+
return this.context.connection.connectionId ?? "local";
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Sets the player view to follow
|
|
93
|
+
* @param target The PlayerView to follow, or undefined to stop spectating
|
|
94
|
+
*/
|
|
95
|
+
set target(target) {
|
|
96
|
+
if (this._handler) {
|
|
97
|
+
// if (this.target?.userId) {
|
|
98
|
+
// const isFollowedByThisUser = this.followers.includes(this.target.userId);
|
|
99
|
+
// if (isFollowedByThisUser) {
|
|
100
|
+
// console.warn("Can not follow follower");
|
|
101
|
+
// target = undefined;
|
|
102
|
+
// }
|
|
103
|
+
// }
|
|
104
|
+
const prev = this._handler.currentTarget?.userId;
|
|
105
|
+
const self = this.context.players.getPlayerView(this.localId);
|
|
106
|
+
// if user is in XR and sets target to self disable it
|
|
107
|
+
if (target === undefined || (this.context.isInXR === false && self?.currentObject === target.currentObject)) {
|
|
108
|
+
if (this._handler.currentTarget !== undefined) {
|
|
109
|
+
this._handler.disable();
|
|
110
|
+
GameObject.setActive(this.gameObject, false);
|
|
111
|
+
if (this.orbit)
|
|
112
|
+
this.orbit.enabled = true;
|
|
113
|
+
this._networking.onSpectatedObjectChanged(target, prev);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
else if (this._handler.currentTarget !== target) {
|
|
117
|
+
this._handler.set(target);
|
|
118
|
+
GameObject.setActive(this.gameObject, true);
|
|
119
|
+
if (this.orbit)
|
|
120
|
+
this.orbit.enabled = false;
|
|
121
|
+
this._networking.onSpectatedObjectChanged(target, prev);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/** Gets the currently followed player view */
|
|
126
|
+
get target() {
|
|
127
|
+
return this._handler?.currentTarget;
|
|
128
|
+
}
|
|
129
|
+
/** Sends a network request for all users to follow this player */
|
|
130
|
+
requestAllFollowMe() {
|
|
131
|
+
this._networking.onRequestFollowMe();
|
|
132
|
+
}
|
|
133
|
+
/** Determines if the camera is spectating the local player */
|
|
134
|
+
get isSpectatingSelf() {
|
|
135
|
+
return this.isSpectating && this.target?.currentObject === this.context.players.getPlayerView(this.localId)?.currentObject;
|
|
136
|
+
}
|
|
137
|
+
// private currentViewport : Vector4 = new Vector4();
|
|
138
|
+
// private currentScissor : Vector4 = new Vector4();
|
|
139
|
+
// private currentScissorTest : boolean = false;
|
|
140
|
+
orbit = null;
|
|
141
|
+
_handler;
|
|
142
|
+
eventSub_WebXRRequestStartEvent = null;
|
|
143
|
+
eventSub_WebXRStartEvent = null;
|
|
144
|
+
eventSub_WebXREndEvent = null;
|
|
145
|
+
_debug;
|
|
146
|
+
_networking;
|
|
147
|
+
awake() {
|
|
148
|
+
this._debug = new SpectatorSelectionController(this.context, this);
|
|
149
|
+
this._networking = new SpectatorCamNetworking(this.context, this);
|
|
150
|
+
this._networking.awake();
|
|
151
|
+
GameObject.setActive(this.gameObject, false);
|
|
152
|
+
this.cam = GameObject.getComponent(this.gameObject, Camera);
|
|
153
|
+
if (!this.cam) {
|
|
154
|
+
console.warn("SpectatorCamera: Spectator camera needs camera component on the same object.", this);
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
if (!this._handler && this.cam)
|
|
158
|
+
this._handler = new SpectatorHandler(this.context, this.cam, this);
|
|
159
|
+
this.orbit = GameObject.getComponent(this.context.mainCamera, OrbitControls);
|
|
160
|
+
}
|
|
161
|
+
onDestroy() {
|
|
162
|
+
this.stopSpectating();
|
|
163
|
+
this._handler?.destroy();
|
|
164
|
+
this._networking?.destroy();
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Checks if the current platform supports spectator mode
|
|
168
|
+
* @returns True if the platform is supported, false otherwise
|
|
169
|
+
*/
|
|
170
|
+
isSupportedPlatform() {
|
|
171
|
+
const ua = window.navigator.userAgent;
|
|
172
|
+
const standalone = /Windows|MacOS/.test(ua);
|
|
173
|
+
const isHololens = /Windows NT/.test(ua) && /Edg/.test(ua) && !/Win64/.test(ua);
|
|
174
|
+
return standalone && !isHololens;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Called before entering WebXR mode
|
|
178
|
+
* @param _evt The WebXR event
|
|
179
|
+
*/
|
|
180
|
+
onBeforeXR(_evt) {
|
|
181
|
+
if (!this.isSupportedPlatform())
|
|
182
|
+
return;
|
|
183
|
+
GameObject.setActive(this.gameObject, true);
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Called when entering WebXR mode
|
|
187
|
+
* @param _evt The WebXR event
|
|
188
|
+
*/
|
|
189
|
+
onEnterXR(_evt) {
|
|
190
|
+
if (!this.isSupportedPlatform())
|
|
191
|
+
return;
|
|
192
|
+
if (debug)
|
|
193
|
+
console.log(this.context.mainCamera);
|
|
194
|
+
if (this.context.mainCamera) {
|
|
195
|
+
this.followSelf();
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Called when exiting WebXR mode
|
|
200
|
+
* @param _evt The WebXR event
|
|
201
|
+
*/
|
|
202
|
+
onLeaveXR(_evt) {
|
|
203
|
+
this.context.removeCamera(this.cam);
|
|
204
|
+
GameObject.setActive(this.gameObject, false);
|
|
205
|
+
if (this.orbit)
|
|
206
|
+
this.orbit.enabled = true;
|
|
207
|
+
this._handler?.set(undefined);
|
|
208
|
+
this._handler?.disable();
|
|
209
|
+
if (this.isSpectatingSelf)
|
|
210
|
+
this.stopSpectating();
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Sets the target to follow the local player
|
|
214
|
+
*/
|
|
215
|
+
followSelf() {
|
|
216
|
+
this.target = this.context.players.getPlayerView(this.context.connection.connectionId);
|
|
217
|
+
if (!this.target) {
|
|
218
|
+
this.context.players.setPlayerView(this.localId, this.context.mainCamera, ViewDevice.Headset);
|
|
219
|
+
this.target = this.context.players.getPlayerView(this.localId);
|
|
220
|
+
}
|
|
221
|
+
if (debug)
|
|
222
|
+
console.log("Follow self", this.target);
|
|
223
|
+
}
|
|
224
|
+
// TODO: only show Spectator cam for DesktopVR;
|
|
225
|
+
// don't show for AR, don't show on Quest
|
|
226
|
+
// TODO: properly align cameras on enter/exit VR, seems currently spectator cam breaks alignment
|
|
227
|
+
/**
|
|
228
|
+
* Called after the main rendering pass to render the spectator view
|
|
229
|
+
*/
|
|
230
|
+
onAfterRender() {
|
|
231
|
+
if (!this.cam)
|
|
232
|
+
return;
|
|
233
|
+
const renderer = this.context.renderer;
|
|
234
|
+
const xrWasEnabled = renderer.xr.enabled;
|
|
235
|
+
if (!renderer.xr.isPresenting && !this._handler?.currentTarget)
|
|
236
|
+
return;
|
|
237
|
+
this._handler?.update(this._mode);
|
|
238
|
+
// remember XR render target so we can restore later
|
|
239
|
+
const previousRenderTarget = renderer.getRenderTarget();
|
|
240
|
+
let oldFramebuffer = null;
|
|
241
|
+
const webglState = renderer.state;
|
|
242
|
+
// seems that in some cases, renderer.getRenderTarget returns null
|
|
243
|
+
// even when we're rendering to a headset.
|
|
244
|
+
if (!previousRenderTarget) {
|
|
245
|
+
if (!renderer.state.bindFramebuffer || !webglState.bindXRFramebuffer)
|
|
246
|
+
return;
|
|
247
|
+
oldFramebuffer = renderer["_framebuffer"];
|
|
248
|
+
webglState.bindXRFramebuffer(null);
|
|
249
|
+
}
|
|
250
|
+
this.setAvatarFlagsBeforeRender();
|
|
251
|
+
const mainCam = this.context.mainCameraComponent;
|
|
252
|
+
// these should not be needed if we don't override viewport/scissor
|
|
253
|
+
// renderer.getViewport(this.currentViewport);
|
|
254
|
+
// renderer.getScissor(this.currentScissor);
|
|
255
|
+
// this.currentScissorTest = renderer.getScissorTest();
|
|
256
|
+
// for scissor rendering (e.g. just a part of the screen / viewport, multiplayer split view)
|
|
257
|
+
// let left = 0;
|
|
258
|
+
// let bottom = 100;
|
|
259
|
+
// let width = 300;
|
|
260
|
+
// let height = 300;
|
|
261
|
+
// renderer.setViewport(left, bottom, width, height);
|
|
262
|
+
// renderer.setScissor(left, bottom, width, height);
|
|
263
|
+
// renderer.setScissorTest(true);
|
|
264
|
+
if (mainCam) {
|
|
265
|
+
const backgroundColor = mainCam.backgroundColor;
|
|
266
|
+
if (backgroundColor)
|
|
267
|
+
renderer.setClearColor(backgroundColor, backgroundColor.alpha);
|
|
268
|
+
this.cam.backgroundColor = backgroundColor;
|
|
269
|
+
this.cam.clearFlags = mainCam.clearFlags;
|
|
270
|
+
this.cam.nearClipPlane = mainCam.nearClipPlane;
|
|
271
|
+
this.cam.farClipPlane = mainCam.farClipPlane;
|
|
272
|
+
}
|
|
273
|
+
else
|
|
274
|
+
renderer.setClearColor(new Color(1, 1, 1));
|
|
275
|
+
renderer.setRenderTarget(null); // null: direct to Canvas
|
|
276
|
+
renderer.xr.enabled = false;
|
|
277
|
+
const cam = this.cam?.threeCamera;
|
|
278
|
+
this.context.updateAspect(cam);
|
|
279
|
+
const wasPresenting = renderer.xr.isPresenting;
|
|
280
|
+
renderer.xr.isPresenting = false;
|
|
281
|
+
renderer.setSize(this.context.domWidth, this.context.domHeight);
|
|
282
|
+
renderer.render(this.context.scene, cam);
|
|
283
|
+
renderer.xr.isPresenting = wasPresenting;
|
|
284
|
+
// restore previous settings so we can continue to render XR
|
|
285
|
+
renderer.xr.enabled = xrWasEnabled;
|
|
286
|
+
//renderer.setViewport(this.currentViewport);
|
|
287
|
+
//renderer.setScissor(this.currentScissor);
|
|
288
|
+
//renderer.setScissorTest(this.currentScissorTest);
|
|
289
|
+
if (previousRenderTarget)
|
|
290
|
+
renderer.setRenderTarget(previousRenderTarget);
|
|
291
|
+
else if (webglState.bindXRFramebuffer)
|
|
292
|
+
webglState.bindXRFramebuffer(oldFramebuffer);
|
|
293
|
+
this.resetAvatarFlags();
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Updates avatar visibility flags for rendering in spectator mode
|
|
297
|
+
*/
|
|
298
|
+
setAvatarFlagsBeforeRender() {
|
|
299
|
+
const isFirstPersonMode = this._mode === SpectatorMode.FirstPerson;
|
|
300
|
+
for (const av of AvatarMarker.instances) {
|
|
301
|
+
if (av.avatar && "isLocalAvatar" in av.avatar && "flags" in av.avatar) {
|
|
302
|
+
let mask = XRStateFlag.All;
|
|
303
|
+
if (this.isSpectatingSelf)
|
|
304
|
+
mask = isFirstPersonMode && av.avatar.isLocalAvatar ? XRStateFlag.FirstPerson : XRStateFlag.ThirdPerson;
|
|
305
|
+
const flags = av.avatar.flags;
|
|
306
|
+
if (!flags)
|
|
307
|
+
continue;
|
|
308
|
+
for (const flag of flags) {
|
|
309
|
+
flag.UpdateVisible(mask);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Restores avatar visibility flags after spectator rendering
|
|
316
|
+
*/
|
|
317
|
+
resetAvatarFlags() {
|
|
318
|
+
for (const av of AvatarMarker.instances) {
|
|
319
|
+
if (av.avatar && "flags" in av.avatar) {
|
|
320
|
+
const flags = av.avatar.flags;
|
|
321
|
+
if (!flags)
|
|
322
|
+
continue;
|
|
323
|
+
for (const flag of flags) {
|
|
324
|
+
if ("isLocalAvatar" in av.avatar && av.avatar?.isLocalAvatar) {
|
|
325
|
+
flag.UpdateVisible(XRStateFlag.FirstPerson);
|
|
326
|
+
}
|
|
327
|
+
else {
|
|
328
|
+
flag.UpdateVisible(XRStateFlag.ThirdPerson);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
__decorate([
|
|
336
|
+
serializable()
|
|
337
|
+
], SpectatorCamera.prototype, "useKeys", void 0);
|
|
338
|
+
/**
|
|
339
|
+
* Handles the smooth following behavior for the spectator camera
|
|
340
|
+
*/
|
|
341
|
+
class SpectatorHandler {
|
|
342
|
+
context;
|
|
343
|
+
cam;
|
|
344
|
+
spectator;
|
|
345
|
+
follow;
|
|
346
|
+
target;
|
|
347
|
+
view;
|
|
348
|
+
currentObject;
|
|
349
|
+
/** Gets the currently targeted player view */
|
|
350
|
+
get currentTarget() {
|
|
351
|
+
return this.view;
|
|
352
|
+
}
|
|
353
|
+
constructor(context, cam, spectator) {
|
|
354
|
+
this.context = context;
|
|
355
|
+
this.cam = cam;
|
|
356
|
+
this.spectator = spectator;
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Sets the target player view to follow
|
|
360
|
+
* @param view The PlayerView to follow
|
|
361
|
+
*/
|
|
362
|
+
set(view) {
|
|
363
|
+
const followObject = view?.currentObject;
|
|
364
|
+
if (!followObject) {
|
|
365
|
+
this.spectator.stopSpectating();
|
|
366
|
+
return;
|
|
367
|
+
}
|
|
368
|
+
if (followObject === this.currentObject)
|
|
369
|
+
return;
|
|
370
|
+
this.currentObject = followObject;
|
|
371
|
+
this.view = view;
|
|
372
|
+
if (!this.follow)
|
|
373
|
+
this.follow = GameObject.addComponent(this.cam.gameObject, SmoothFollow);
|
|
374
|
+
if (!this.target)
|
|
375
|
+
this.target = new Object3D();
|
|
376
|
+
followObject.add(this.target);
|
|
377
|
+
this.follow.enabled = true;
|
|
378
|
+
this.follow.target = this.target;
|
|
379
|
+
// this.context.setCurrentCamera(this.cam);
|
|
380
|
+
if (debug)
|
|
381
|
+
console.log("FOLLOW", followObject);
|
|
382
|
+
if (!this.context.isInXR) {
|
|
383
|
+
this.context.setCurrentCamera(this.cam);
|
|
384
|
+
}
|
|
385
|
+
else
|
|
386
|
+
this.context.removeCamera(this.cam);
|
|
387
|
+
}
|
|
388
|
+
/** Disables the spectator following behavior */
|
|
389
|
+
disable() {
|
|
390
|
+
if (debug)
|
|
391
|
+
console.log("STOP FOLLOW", this.currentObject);
|
|
392
|
+
this.view = undefined;
|
|
393
|
+
this.currentObject = undefined;
|
|
394
|
+
this.context.removeCamera(this.cam);
|
|
395
|
+
if (this.follow)
|
|
396
|
+
this.follow.enabled = false;
|
|
397
|
+
}
|
|
398
|
+
/** Cleans up resources used by the handler */
|
|
399
|
+
destroy() {
|
|
400
|
+
this.target?.removeFromParent();
|
|
401
|
+
if (this.follow)
|
|
402
|
+
GameObject.destroy(this.follow);
|
|
403
|
+
}
|
|
404
|
+
/**
|
|
405
|
+
* Updates the camera position and orientation based on the spectator mode
|
|
406
|
+
* @param mode The current spectator mode (first or third person)
|
|
407
|
+
*/
|
|
408
|
+
update(mode) {
|
|
409
|
+
if (this.currentTarget?.isConnected === false || this.currentTarget?.removed === true) {
|
|
410
|
+
if (debug)
|
|
411
|
+
console.log("Target disconnected or timeout", this.currentTarget);
|
|
412
|
+
this.spectator.stopSpectating();
|
|
413
|
+
return;
|
|
414
|
+
}
|
|
415
|
+
if (this.currentTarget && this.currentTarget?.currentObject !== this.currentObject) {
|
|
416
|
+
if (debug)
|
|
417
|
+
console.log("Target changed", this.currentObject, "to", this.currentTarget.currentObject);
|
|
418
|
+
this.set(this.currentTarget);
|
|
419
|
+
}
|
|
420
|
+
const perspectiveCamera = this.context.mainCamera;
|
|
421
|
+
if (perspectiveCamera) {
|
|
422
|
+
const cam = this.cam.threeCamera;
|
|
423
|
+
if (cam.near !== perspectiveCamera.near || cam.far !== perspectiveCamera.far) {
|
|
424
|
+
cam.near = perspectiveCamera.near;
|
|
425
|
+
cam.far = perspectiveCamera.far;
|
|
426
|
+
cam.updateProjectionMatrix();
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
const target = this.follow?.target;
|
|
430
|
+
if (!target || !this.follow)
|
|
431
|
+
return;
|
|
432
|
+
switch (mode) {
|
|
433
|
+
case SpectatorMode.FirstPerson:
|
|
434
|
+
if (this.view?.viewDevice !== ViewDevice.Browser) {
|
|
435
|
+
// soft follow for AR and VR
|
|
436
|
+
this.follow.followFactor = 5;
|
|
437
|
+
this.follow.rotateFactor = 5;
|
|
438
|
+
}
|
|
439
|
+
else {
|
|
440
|
+
// snappy follow for desktop
|
|
441
|
+
this.follow.followFactor = 50;
|
|
442
|
+
this.follow.rotateFactor = 50;
|
|
443
|
+
}
|
|
444
|
+
target.position.set(0, 0, 0);
|
|
445
|
+
break;
|
|
446
|
+
case SpectatorMode.ThirdPerson:
|
|
447
|
+
this.follow.followFactor = 3;
|
|
448
|
+
this.follow.rotateFactor = 2;
|
|
449
|
+
target.position.set(0, .5, 1.5);
|
|
450
|
+
break;
|
|
451
|
+
}
|
|
452
|
+
this.follow.flipForward = false;
|
|
453
|
+
// console.log(this.view);
|
|
454
|
+
if (this.view?.viewDevice !== ViewDevice.Browser)
|
|
455
|
+
target.quaternion.copy(_inverseYQuat);
|
|
456
|
+
else
|
|
457
|
+
target.quaternion.identity();
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
const _inverseYQuat = new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), Math.PI);
|
|
461
|
+
/**
|
|
462
|
+
* Handles user input for selecting targets to spectate
|
|
463
|
+
*/
|
|
464
|
+
class SpectatorSelectionController {
|
|
465
|
+
context;
|
|
466
|
+
spectator;
|
|
467
|
+
constructor(context, spectator) {
|
|
468
|
+
this.context = context;
|
|
469
|
+
this.spectator = spectator;
|
|
470
|
+
console.log("[Spectator Camera] Click other avatars or cameras to follow them. Press ESC to exit spectator mode.");
|
|
471
|
+
this.context.domElement.addEventListener("keydown", (evt) => {
|
|
472
|
+
if (!this.spectator.useKeys)
|
|
473
|
+
return;
|
|
474
|
+
const key = evt.key;
|
|
475
|
+
if (key === "Escape") {
|
|
476
|
+
this.spectator.stopSpectating();
|
|
477
|
+
}
|
|
478
|
+
});
|
|
479
|
+
let downTime = 0;
|
|
480
|
+
this.context.input.addEventListener(InputEvents.PointerDown, _ => {
|
|
481
|
+
downTime = this.context.time.time;
|
|
482
|
+
});
|
|
483
|
+
this.context.input.addEventListener(InputEvents.PointerUp, _ => {
|
|
484
|
+
const dt = this.context.time.time - downTime;
|
|
485
|
+
if (dt > 1) {
|
|
486
|
+
this.spectator.stopSpectating();
|
|
487
|
+
}
|
|
488
|
+
else if (this.context.input.getPointerClicked(0) && dt < .3)
|
|
489
|
+
this.trySelectObject();
|
|
490
|
+
});
|
|
491
|
+
}
|
|
492
|
+
/**
|
|
493
|
+
* Attempts to select an avatar to spectate through raycasting
|
|
494
|
+
*/
|
|
495
|
+
trySelectObject() {
|
|
496
|
+
const opts = new RaycastOptions();
|
|
497
|
+
opts.setMask(0xffffff);
|
|
498
|
+
// opts.cam = this.spectator.cam?.cam;
|
|
499
|
+
const hits = this.context.physics.raycast(opts);
|
|
500
|
+
if (debug)
|
|
501
|
+
console.log(...hits);
|
|
502
|
+
if (hits?.length) {
|
|
503
|
+
for (const hit of hits) {
|
|
504
|
+
if (hit.distance < .2)
|
|
505
|
+
continue;
|
|
506
|
+
const obj = hit.object;
|
|
507
|
+
const avatar = GameObject.getComponentInParent(obj, AvatarMarker);
|
|
508
|
+
const id = avatar?.connectionId;
|
|
509
|
+
if (id) {
|
|
510
|
+
const view = this.context.players.getPlayerView(id);
|
|
511
|
+
this.spectator.target = view;
|
|
512
|
+
if (debug)
|
|
513
|
+
console.log("spectate", id, avatar);
|
|
514
|
+
break;
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
/**
|
|
521
|
+
* Network model for communicating follower changes
|
|
522
|
+
*/
|
|
523
|
+
class SpectatorFollowerChangedEventModel {
|
|
524
|
+
/** The user ID that is following */
|
|
525
|
+
guid;
|
|
526
|
+
dontSave = true;
|
|
527
|
+
/** The user ID being followed */
|
|
528
|
+
targetUserId;
|
|
529
|
+
/** Indicates if the user stopped following */
|
|
530
|
+
stoppedFollowing;
|
|
531
|
+
constructor(connectionId, userId, stoppedFollowing) {
|
|
532
|
+
this.guid = connectionId;
|
|
533
|
+
this.targetUserId = userId;
|
|
534
|
+
this.stoppedFollowing = stoppedFollowing;
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
/**
|
|
538
|
+
* Network model for requesting users to follow a specific player
|
|
539
|
+
*/
|
|
540
|
+
class SpectatorFollowEventModel {
|
|
541
|
+
guid;
|
|
542
|
+
userId;
|
|
543
|
+
constructor(comp, userId) {
|
|
544
|
+
this.guid = comp.guid;
|
|
545
|
+
this.userId = userId;
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
/**
|
|
549
|
+
* Handles network communication for spectator functionality
|
|
550
|
+
*/
|
|
551
|
+
class SpectatorCamNetworking {
|
|
552
|
+
/** List of user IDs currently following this player */
|
|
553
|
+
followers = [];
|
|
554
|
+
context;
|
|
555
|
+
spectator;
|
|
556
|
+
_followerEventMethod;
|
|
557
|
+
_requestFollowMethod;
|
|
558
|
+
_joinedRoomMethod;
|
|
559
|
+
constructor(context, spectator) {
|
|
560
|
+
this.context = context;
|
|
561
|
+
this.spectator = spectator;
|
|
562
|
+
this._followerEventMethod = this.onFollowerEvent.bind(this);
|
|
563
|
+
this._requestFollowMethod = this.onRequestFollowEvent.bind(this);
|
|
564
|
+
this._joinedRoomMethod = this.onUserJoinedRoom.bind(this);
|
|
565
|
+
}
|
|
566
|
+
/**
|
|
567
|
+
* Initializes network event listeners
|
|
568
|
+
*/
|
|
569
|
+
awake() {
|
|
570
|
+
this.context.connection.beginListen("spectator-follower-changed", this._followerEventMethod);
|
|
571
|
+
this.context.connection.beginListen("spectator-request-follow", this._requestFollowMethod);
|
|
572
|
+
this.context.connection.beginListen(RoomEvents.JoinedRoom, this._joinedRoomMethod);
|
|
573
|
+
this.context.domElement.addEventListener("keydown", evt => {
|
|
574
|
+
if (!this.spectator.useKeys)
|
|
575
|
+
return;
|
|
576
|
+
if (evt.key === "f") {
|
|
577
|
+
this.onRequestFollowMe();
|
|
578
|
+
}
|
|
579
|
+
else if (evt.key === "Escape") {
|
|
580
|
+
this.onRequestFollowMe(true);
|
|
581
|
+
}
|
|
582
|
+
});
|
|
583
|
+
}
|
|
584
|
+
/**
|
|
585
|
+
* Removes network event listeners
|
|
586
|
+
*/
|
|
587
|
+
destroy() {
|
|
588
|
+
this.context.connection.stopListen("spectator-follower-changed", this._followerEventMethod);
|
|
589
|
+
this.context.connection.stopListen("spectator-request-follow", this._requestFollowMethod);
|
|
590
|
+
this.context.connection.stopListen(RoomEvents.JoinedRoom, this._joinedRoomMethod);
|
|
591
|
+
}
|
|
592
|
+
/**
|
|
593
|
+
* Notifies other users about spectating target changes
|
|
594
|
+
* @param target The new target being spectated
|
|
595
|
+
* @param _prevId The previous target's user ID
|
|
596
|
+
*/
|
|
597
|
+
onSpectatedObjectChanged(target, _prevId) {
|
|
598
|
+
if (debug)
|
|
599
|
+
console.log(this.context.connection.connectionId, "onSpectatedObjectChanged", target, _prevId);
|
|
600
|
+
if (this.context.connection.connectionId) {
|
|
601
|
+
const stopped = target?.userId === undefined;
|
|
602
|
+
const userId = stopped ? _prevId : target?.userId;
|
|
603
|
+
const evt = new SpectatorFollowerChangedEventModel(this.context.connection.connectionId, userId, stopped);
|
|
604
|
+
this.context.connection.send("spectator-follower-changed", evt);
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
/**
|
|
608
|
+
* Requests other users to follow this player or stop following
|
|
609
|
+
* @param stop Whether to request users to stop following
|
|
610
|
+
*/
|
|
611
|
+
onRequestFollowMe(stop = false) {
|
|
612
|
+
if (debug)
|
|
613
|
+
console.log("Request follow", this.context.connection.connectionId);
|
|
614
|
+
if (this.context.connection.connectionId) {
|
|
615
|
+
this.spectator.stopSpectating();
|
|
616
|
+
const id = stop ? undefined : this.context.connection.connectionId;
|
|
617
|
+
const model = new SpectatorFollowEventModel(this.spectator, id);
|
|
618
|
+
this.context.connection.send("spectator-request-follow", model);
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
/**
|
|
622
|
+
* Handles room join events
|
|
623
|
+
*/
|
|
624
|
+
onUserJoinedRoom() {
|
|
625
|
+
if (getParam("followme")) {
|
|
626
|
+
this.onRequestFollowMe();
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
/**
|
|
630
|
+
* Processes follower status change events from the network
|
|
631
|
+
* @param evt The follower change event data
|
|
632
|
+
*/
|
|
633
|
+
onFollowerEvent(evt) {
|
|
634
|
+
const userBeingFollowed = evt.targetUserId;
|
|
635
|
+
const userThatIsFollowing = evt.guid;
|
|
636
|
+
if (debug)
|
|
637
|
+
console.log(evt);
|
|
638
|
+
if (userBeingFollowed === this.context.connection.connectionId) {
|
|
639
|
+
if (evt.stoppedFollowing) {
|
|
640
|
+
const index = this.followers.indexOf(userThatIsFollowing);
|
|
641
|
+
if (index !== -1) {
|
|
642
|
+
this.followers.splice(index, 1);
|
|
643
|
+
this.removeDisconnectedFollowers();
|
|
644
|
+
console.log(userThatIsFollowing, "unfollows you", this.followers.length);
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
else {
|
|
648
|
+
if (!this.followers.includes(userThatIsFollowing)) {
|
|
649
|
+
this.followers.push(userThatIsFollowing);
|
|
650
|
+
this.removeDisconnectedFollowers();
|
|
651
|
+
console.log(userThatIsFollowing, "follows you", this.followers.length);
|
|
652
|
+
}
|
|
653
|
+
}
|
|
654
|
+
}
|
|
655
|
+
}
|
|
656
|
+
/**
|
|
657
|
+
* Removes followers that are no longer connected to the room
|
|
658
|
+
*/
|
|
659
|
+
removeDisconnectedFollowers() {
|
|
660
|
+
for (let i = this.followers.length - 1; i >= 0; i--) {
|
|
661
|
+
const id = this.followers[i];
|
|
662
|
+
if (this.context.connection.userIsInRoom(id) === false) {
|
|
663
|
+
this.followers.splice(i, 1);
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
_lastRequestFollowUser;
|
|
668
|
+
/**
|
|
669
|
+
* Handles follow requests from other users
|
|
670
|
+
* @param evt The follow request event
|
|
671
|
+
* @returns True if the request was handled successfully
|
|
672
|
+
*/
|
|
673
|
+
onRequestFollowEvent(evt) {
|
|
674
|
+
this._lastRequestFollowUser = evt;
|
|
675
|
+
if (evt.userId === this.context.connection.connectionId) {
|
|
676
|
+
this.spectator.stopSpectating();
|
|
677
|
+
}
|
|
678
|
+
else if (evt.userId === undefined) {
|
|
679
|
+
// this will currently also stop spectating if the user is not following you
|
|
680
|
+
this.spectator.stopSpectating();
|
|
681
|
+
}
|
|
682
|
+
else {
|
|
683
|
+
const view = this.context.players.getPlayerView(evt.userId);
|
|
684
|
+
if (view) {
|
|
685
|
+
this.spectator.target = view;
|
|
686
|
+
}
|
|
687
|
+
else {
|
|
688
|
+
if (debug)
|
|
689
|
+
console.warn("Could not find view", evt.userId);
|
|
690
|
+
this.enforceFollow();
|
|
691
|
+
return false;
|
|
692
|
+
}
|
|
693
|
+
}
|
|
694
|
+
return true;
|
|
695
|
+
}
|
|
696
|
+
_enforceFollowInterval;
|
|
697
|
+
/**
|
|
698
|
+
* Periodically retries following a user if the initial attempt failed
|
|
699
|
+
*/
|
|
700
|
+
enforceFollow() {
|
|
701
|
+
if (this._enforceFollowInterval)
|
|
702
|
+
return;
|
|
703
|
+
this._enforceFollowInterval = setInterval(() => {
|
|
704
|
+
if (this._lastRequestFollowUser === undefined || this._lastRequestFollowUser.userId && this.spectator.isFollowedBy(this._lastRequestFollowUser.userId)) {
|
|
705
|
+
clearInterval(this._enforceFollowInterval);
|
|
706
|
+
this._enforceFollowInterval = undefined;
|
|
707
|
+
}
|
|
708
|
+
else {
|
|
709
|
+
if (debug)
|
|
710
|
+
console.log("REQUEST FOLLOW AGAIN", this._lastRequestFollowUser.userId);
|
|
711
|
+
this.onRequestFollowEvent(this._lastRequestFollowUser);
|
|
712
|
+
}
|
|
713
|
+
}, 1000);
|
|
714
|
+
}
|
|
715
|
+
}
|
|
716
716
|
//# sourceMappingURL=SpectatorCamera.js.map
|