@needle-tools/engine 4.7.2-alpha → 4.7.2-next.0e4e068
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-CNdBjvz6.js +1145 -0
- package/dist/gltf-progressive-C_oN6wCA.umd.cjs +8 -0
- package/dist/gltf-progressive-MgWOszRl.min.js +8 -0
- package/dist/{needle-engine.bundle-BhDF-YSv.min.js → needle-engine.bundle-B1OlKJHF.min.js} +108 -107
- package/dist/{needle-engine.bundle-gp00DTS4.js → needle-engine.bundle-Bwsx9VYm.js} +2077 -2061
- package/dist/{needle-engine.bundle-D2myV4E4.umd.cjs → needle-engine.bundle-Cd6HpRz5.umd.cjs} +99 -98
- 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 +1672 -1673
- package/lib/engine/engine_context.js.map +1 -1
- 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_lods.js.map +1 -1
- 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 +198 -197
- package/lib/engine/engine_tonemapping.js.map +1 -1
- 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 +115 -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 +845 -821
- package/lib/engine/webcomponents/needle-engine.js.map +1 -1
- 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.js.map +1 -1
- 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 +1822 -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 +185 -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 +209 -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 +890 -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/dist/gltf-progressive-YjtQYFa9.js +0 -1052
- package/dist/gltf-progressive-yOP1mp5W.min.js +0 -8
- package/dist/gltf-progressive-zdhlW609.umd.cjs +0 -8
- 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,592 +1,592 @@
|
|
|
1
|
-
import { isDevEnvironment, showBalloonWarning } from "../engine/debug/index.js";
|
|
2
|
-
import { RoomEvents } from "../engine/engine_networking.js";
|
|
3
|
-
import { disposeStream, NetworkedStreamEvents, NetworkedStreams, PeerHandle, StreamEndedEvent, StreamReceivedEvent } from "../engine/engine_networking_streams.js";
|
|
4
|
-
import { serializable } from "../engine/engine_serialization.js";
|
|
5
|
-
import { delay, getParam } from "../engine/engine_utils.js";
|
|
6
|
-
import { AudioSource } from "./AudioSource.js";
|
|
7
|
-
import { Behaviour, GameObject } from "./Component.js";
|
|
8
|
-
import type { IPointerClickHandler, PointerEventData } from "./ui/PointerEvents.js";
|
|
9
|
-
import { AspectMode, VideoPlayer } from "./VideoPlayer.js";
|
|
10
|
-
|
|
11
|
-
const debug = getParam("debugscreensharing");
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* ScreenCapture component allows you to share your screen, camera or microphone with other users in the networked room.
|
|
15
|
-
*/
|
|
16
|
-
export enum ScreenCaptureDevice {
|
|
17
|
-
/**
|
|
18
|
-
* Capture the screen of the user.
|
|
19
|
-
*/
|
|
20
|
-
Screen = 0,
|
|
21
|
-
/**
|
|
22
|
-
* Capture the camera of the user.
|
|
23
|
-
*/
|
|
24
|
-
Camera = 1,
|
|
25
|
-
/** Please note that canvas streaming might not work reliably on chrome: https://bugs.chromium.org/p/chromium/issues/detail?id=1156408 */
|
|
26
|
-
Canvas = 2,
|
|
27
|
-
/** When using Microphone only the voice will be send */
|
|
28
|
-
Microphone = 3
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* {@link ScreenCapture} allows you to share your screen, camera or microphone with other users in the networked room.
|
|
33
|
-
*/
|
|
34
|
-
declare type ScreenCaptureDeviceTypes = keyof typeof ScreenCaptureDevice;
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* The current mode of the {@link ScreenCapture} component.
|
|
38
|
-
*/
|
|
39
|
-
export enum ScreenCaptureMode {
|
|
40
|
-
Idle = 0,
|
|
41
|
-
Sending = 1,
|
|
42
|
-
Receiving = 2
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Options for the {@link ScreenCapture} component when starting to share a stream by calling the {@link ScreenCapture.share}.
|
|
47
|
-
*/
|
|
48
|
-
export declare type ScreenCaptureOptions = {
|
|
49
|
-
/**
|
|
50
|
-
* You can specify the device type to capture (e.g. Screen, Camera, Microphone)
|
|
51
|
-
*/
|
|
52
|
-
device?: ScreenCaptureDeviceTypes,
|
|
53
|
-
/**
|
|
54
|
-
* Constraints for the media stream like resolution, frame rate, etc.
|
|
55
|
-
* @see https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamConstraints
|
|
56
|
-
*/
|
|
57
|
-
constraints?: MediaTrackConstraints,
|
|
58
|
-
/** Filter video device by id. Alternatively pass in a deviceFilter callback to manually filter available devices */
|
|
59
|
-
deviceId?: string,
|
|
60
|
-
/** Return false to skip the available device */
|
|
61
|
-
deviceFilter?: (device: MediaDeviceInfo) => boolean,
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* The ScreenCapture component allows you to share your screen, camera or microphone with other users in the networked room.
|
|
66
|
-
* When the stream is active the video will be displayed on the VideoPlayer component attached to the same GameObject.
|
|
67
|
-
*
|
|
68
|
-
* Note: For debugging append `?debugscreensharing` to the URL to see more information in the console.
|
|
69
|
-
*
|
|
70
|
-
* By default the component will start sharing the screen when the user clicks on the object this component is attached to. You can set {@link device} This behaviour can be disabled by setting `allowStartOnClick` to false.
|
|
71
|
-
* It is also possible to start the stream manually from your code by calling the {@link share} method.
|
|
72
|
-
*
|
|
73
|
-
* @category Networking
|
|
74
|
-
* @group Components
|
|
75
|
-
*/
|
|
76
|
-
export class ScreenCapture extends Behaviour implements IPointerClickHandler {
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* When enabled the stream will start when the user clicks on the object this component is attached to
|
|
80
|
-
* It is also possible to start the stream manually from your code by calling the {@link share} method
|
|
81
|
-
* To modify what type of device is shared you can set the {@link device} property.
|
|
82
|
-
* @default true
|
|
83
|
-
*/
|
|
84
|
-
@serializable()
|
|
85
|
-
allowStartOnClick: boolean = true;
|
|
86
|
-
|
|
87
|
-
/** @internal */
|
|
88
|
-
onPointerEnter() {
|
|
89
|
-
if (this.context.connection.allowEditing == false) return;
|
|
90
|
-
if (!this.allowStartOnClick) return;
|
|
91
|
-
this.context.input.setCursor("pointer");
|
|
92
|
-
}
|
|
93
|
-
/** @internal */
|
|
94
|
-
onPointerExit() {
|
|
95
|
-
if (this.context.connection.allowEditing == false) return;
|
|
96
|
-
if (!this.allowStartOnClick) return;
|
|
97
|
-
this.context.input.unsetCursor("pointer");
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
/** @internal */
|
|
101
|
-
onPointerClick(evt: PointerEventData) {
|
|
102
|
-
if (this.context.connection.allowEditing == false) return;
|
|
103
|
-
if (!this.allowStartOnClick) return;
|
|
104
|
-
if (evt && evt.pointerId !== 0) return;
|
|
105
|
-
if (this.isReceiving && this.videoPlayer?.isPlaying) {
|
|
106
|
-
if (this.videoPlayer)
|
|
107
|
-
this.videoPlayer.screenspace = !this.videoPlayer.screenspace;
|
|
108
|
-
return;
|
|
109
|
-
|
|
110
|
-
}
|
|
111
|
-
if (this.isSending) {
|
|
112
|
-
this.close();
|
|
113
|
-
return;
|
|
114
|
-
}
|
|
115
|
-
this.share();
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
/** When enabled the stream will start when this component becomes active (enabled in the scene) */
|
|
120
|
-
@serializable()
|
|
121
|
-
autoConnect: boolean = false;
|
|
122
|
-
|
|
123
|
-
/**
|
|
124
|
-
* If a VideoPlayer component is assigned to this property the video will be displayed on the VideoPlayer component.
|
|
125
|
-
*/
|
|
126
|
-
@serializable(VideoPlayer)
|
|
127
|
-
set videoPlayer(val: VideoPlayer | undefined) {
|
|
128
|
-
if (this._videoPlayer && (this.isSending || this.isReceiving)) {
|
|
129
|
-
this._videoPlayer.stop();
|
|
130
|
-
}
|
|
131
|
-
this._videoPlayer = val;
|
|
132
|
-
if (this._videoPlayer && this._currentStream && (this.isSending || this.isReceiving)) {
|
|
133
|
-
this._videoPlayer.setVideo(this._currentStream);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
get videoPlayer() { return this._videoPlayer; }
|
|
137
|
-
private _videoPlayer?: VideoPlayer;
|
|
138
|
-
private _audioSource?: AudioSource;
|
|
139
|
-
|
|
140
|
-
/**
|
|
141
|
-
* When enabled the video will be displayed in the screenspace of the VideoPlayer component.
|
|
142
|
-
*/
|
|
143
|
-
get screenspace() { return this.videoPlayer?.screenspace ?? false; }
|
|
144
|
-
set screenspace(v: boolean) { if (this.videoPlayer) this.videoPlayer.screenspace = v; }
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
* Which streaming device type should be used when starting to share (if {@link share} is called without a device option). Options are Screen, Camera, Microphone.
|
|
148
|
-
* This is e.g. used if `allowStartOnClick` is enabled and the user clicks on the object.
|
|
149
|
-
* @default Screen
|
|
150
|
-
*/
|
|
151
|
-
@serializable()
|
|
152
|
-
device: ScreenCaptureDeviceTypes = "Screen";
|
|
153
|
-
|
|
154
|
-
/**
|
|
155
|
-
* If assigned the device the device will be selected by this id or label when starting to share.
|
|
156
|
-
* Note: This is only supported for `Camera` devices
|
|
157
|
-
*/
|
|
158
|
-
@serializable()
|
|
159
|
-
deviceName?: string;
|
|
160
|
-
|
|
161
|
-
/**
|
|
162
|
-
* Filter which device should be chosen for sharing by id or label.
|
|
163
|
-
* Assign a method to this property to manually filter the available devices.
|
|
164
|
-
*/
|
|
165
|
-
deviceFilter?: (device: MediaDeviceInfo) => boolean;
|
|
166
|
-
|
|
167
|
-
/**
|
|
168
|
-
* the current stream that is being shared or received
|
|
169
|
-
* @link https://developer.mozilla.org/en-US/docs/Web/API/MediaStream
|
|
170
|
-
*/
|
|
171
|
-
get currentScream(): MediaStream | null {
|
|
172
|
-
return this._currentStream;
|
|
173
|
-
}
|
|
174
|
-
get currentMode(): ScreenCaptureMode {
|
|
175
|
-
return this._currentMode;
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
/**
|
|
179
|
-
* @returns true if the component is currently sending a stream
|
|
180
|
-
*/
|
|
181
|
-
get isSending() {
|
|
182
|
-
return this._currentStream?.active && this._currentMode === ScreenCaptureMode.Sending;
|
|
183
|
-
}
|
|
184
|
-
/**
|
|
185
|
-
* @returns true if the component is currently receiving a stream
|
|
186
|
-
*/
|
|
187
|
-
get isReceiving() {
|
|
188
|
-
if (this._currentMode === ScreenCaptureMode.Receiving) {
|
|
189
|
-
if (!this._currentStream || this._currentStream.active === false) return false;
|
|
190
|
-
// if any track is still live consider it active
|
|
191
|
-
const tracks = this._currentStream.getTracks();
|
|
192
|
-
for (const track of tracks) {
|
|
193
|
-
if (track.readyState === "live") return true;
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
return false;
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
private get requiresVideoPlayer() {
|
|
200
|
-
return this.device !== "Microphone";
|
|
201
|
-
}
|
|
202
|
-
private _net?: NetworkedStreams;
|
|
203
|
-
private _requestOpen: boolean = false;
|
|
204
|
-
private _currentStream: MediaStream | null = null;
|
|
205
|
-
private _currentMode: ScreenCaptureMode = ScreenCaptureMode.Idle;
|
|
206
|
-
|
|
207
|
-
/** @internal */
|
|
208
|
-
awake() {
|
|
209
|
-
// Resolve the device type if it is a number
|
|
210
|
-
if (typeof this.device === "number") {
|
|
211
|
-
this.device = ScreenCaptureDevice[this.device] as ScreenCaptureDeviceTypes;
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
if (debug)
|
|
215
|
-
console.log("Screensharing", this.name, this);
|
|
216
|
-
AudioSource.registerWaitForAllowAudio(() => {
|
|
217
|
-
if (this._videoPlayer && this._currentStream && this._currentMode === ScreenCaptureMode.Receiving) {
|
|
218
|
-
this._videoPlayer.playInBackground = true;
|
|
219
|
-
this._videoPlayer.setVideo(this._currentStream);
|
|
220
|
-
}
|
|
221
|
-
});
|
|
222
|
-
this._net = new NetworkedStreams(this);
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
/** @internal */
|
|
226
|
-
onEnable(): void {
|
|
227
|
-
this._net?.enable();
|
|
228
|
-
//@ts-ignore
|
|
229
|
-
this._net?.addEventListener(NetworkedStreamEvents.StreamReceived, this.onReceiveStream);
|
|
230
|
-
//@ts-ignore
|
|
231
|
-
this._net?.addEventListener(NetworkedStreamEvents.StreamEnded, this.onCallEnded);
|
|
232
|
-
this.context.connection.beginListen(RoomEvents.JoinedRoom, this.onJoinedRoom);
|
|
233
|
-
if (this.autoConnect) {
|
|
234
|
-
delay(1000).then(() => {
|
|
235
|
-
if (this.enabled && this.autoConnect && !this.isReceiving && !this.isSending && this.context.connection.isInRoom)
|
|
236
|
-
this.share()
|
|
237
|
-
return 0;
|
|
238
|
-
});
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
/** @internal */
|
|
243
|
-
onDisable(): void {
|
|
244
|
-
//@ts-ignore
|
|
245
|
-
this._net?.removeEventListener(NetworkedStreamEvents.StreamReceived, this.onReceiveStream);
|
|
246
|
-
//@ts-ignore
|
|
247
|
-
this._net?.removeEventListener(NetworkedStreamEvents.StreamEnded, this.onCallEnded);
|
|
248
|
-
this.context.connection.stopListen(RoomEvents.JoinedRoom, this.onJoinedRoom);
|
|
249
|
-
this._net?.disable();
|
|
250
|
-
this.close();
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
private onJoinedRoom = async () => {
|
|
254
|
-
await delay(1000);
|
|
255
|
-
if (this.autoConnect && !this.isSending && !this.isReceiving && this.context.connection.isInRoom) {
|
|
256
|
-
this.share();
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
private _ensureVideoPlayer() {
|
|
261
|
-
const vp = new VideoPlayer();
|
|
262
|
-
vp.aspectMode = AspectMode.AdjustWidth;
|
|
263
|
-
GameObject.addComponent(this.gameObject, vp);
|
|
264
|
-
this._videoPlayer = vp;
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
private _activeShareRequest: Promise<void> | null = null;
|
|
268
|
-
|
|
269
|
-
/** Call to begin screensharing */
|
|
270
|
-
async share(opts?: ScreenCaptureOptions) {
|
|
271
|
-
if (this._activeShareRequest) return this._activeShareRequest;
|
|
272
|
-
this._activeShareRequest = this.internalShare(opts);
|
|
273
|
-
return this._activeShareRequest.then(() => {
|
|
274
|
-
return this._activeShareRequest = null;
|
|
275
|
-
})
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
private async internalShare(opts?: ScreenCaptureOptions) {
|
|
279
|
-
if (this.context.connection.isInRoom === false) {
|
|
280
|
-
console.warn("Can not start screensharing: requires network connection");
|
|
281
|
-
if (isDevEnvironment()) showBalloonWarning("Can not start screensharing: requires network connection. Add a SyncedRoom component or join a room first.");
|
|
282
|
-
return;
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
if (opts?.device)
|
|
286
|
-
this.device = opts.device;
|
|
287
|
-
|
|
288
|
-
if (!this.videoPlayer && this.requiresVideoPlayer) {
|
|
289
|
-
if (!this._videoPlayer) {
|
|
290
|
-
this._videoPlayer = GameObject.getComponent(this.gameObject, VideoPlayer) ?? undefined;
|
|
291
|
-
}
|
|
292
|
-
if (!this.videoPlayer) {
|
|
293
|
-
this._ensureVideoPlayer();
|
|
294
|
-
}
|
|
295
|
-
if (!this.videoPlayer) {
|
|
296
|
-
console.warn("Can not share video without a videoPlayer assigned");
|
|
297
|
-
return;
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
this._requestOpen = true;
|
|
302
|
-
try {
|
|
303
|
-
|
|
304
|
-
const settings: MediaTrackConstraints = opts?.constraints ?? {
|
|
305
|
-
echoCancellation: true,
|
|
306
|
-
autoGainControl: false,
|
|
307
|
-
};
|
|
308
|
-
const displayMediaOptions: MediaStreamConstraints = {
|
|
309
|
-
video: settings,
|
|
310
|
-
audio: settings,
|
|
311
|
-
};
|
|
312
|
-
const videoOptions = displayMediaOptions.video;
|
|
313
|
-
if (videoOptions !== undefined && typeof videoOptions !== "boolean") {
|
|
314
|
-
// Set default video settings
|
|
315
|
-
if (!videoOptions.width)
|
|
316
|
-
videoOptions.width = { max: 1920 };
|
|
317
|
-
if (!videoOptions.height)
|
|
318
|
-
videoOptions.height = { max: 1920 };
|
|
319
|
-
if (!videoOptions.aspectRatio)
|
|
320
|
-
videoOptions.aspectRatio = { ideal: 1.7777777778 };
|
|
321
|
-
if (!videoOptions.frameRate)
|
|
322
|
-
videoOptions.frameRate = { ideal: 24 };
|
|
323
|
-
if (!videoOptions.facingMode)
|
|
324
|
-
videoOptions.facingMode = { ideal: "user" };
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
switch (this.device) {
|
|
328
|
-
// Capture a connected camera
|
|
329
|
-
case "Camera":
|
|
330
|
-
this.tryShareUserCamera(displayMediaOptions, opts);
|
|
331
|
-
break;
|
|
332
|
-
|
|
333
|
-
// capture any screen, will show a popup
|
|
334
|
-
case "Screen":
|
|
335
|
-
{
|
|
336
|
-
if (!navigator.mediaDevices.getDisplayMedia) {
|
|
337
|
-
console.error("No getDisplayMedia support");
|
|
338
|
-
return;
|
|
339
|
-
}
|
|
340
|
-
const myVideo = await navigator.mediaDevices.getDisplayMedia(displayMediaOptions);
|
|
341
|
-
if (this._requestOpen) {
|
|
342
|
-
this.setStream(myVideo, ScreenCaptureMode.Sending);
|
|
343
|
-
}
|
|
344
|
-
else disposeStream(myVideo);
|
|
345
|
-
}
|
|
346
|
-
break;
|
|
347
|
-
|
|
348
|
-
// capture the canvas meaning the threejs view
|
|
349
|
-
case "Canvas":
|
|
350
|
-
// looks like this doesnt work reliably on chrome https://stackoverflow.com/a/66848674
|
|
351
|
-
// firefox updates fine
|
|
352
|
-
// https://bugs.chromium.org/p/chromium/issues/detail?id=1156408
|
|
353
|
-
const fps = 0;
|
|
354
|
-
const stream = this.context.renderer.domElement.captureStream(fps);
|
|
355
|
-
this.setStream(stream, ScreenCaptureMode.Sending);
|
|
356
|
-
break;
|
|
357
|
-
|
|
358
|
-
case "Microphone":
|
|
359
|
-
{
|
|
360
|
-
if (!navigator.mediaDevices.getUserMedia) {
|
|
361
|
-
console.error("No getDisplayMedia support");
|
|
362
|
-
return;
|
|
363
|
-
}
|
|
364
|
-
displayMediaOptions.video = false;
|
|
365
|
-
const myStream = await navigator.mediaDevices.getUserMedia(displayMediaOptions);
|
|
366
|
-
if (this._requestOpen) {
|
|
367
|
-
this.setStream(myStream, ScreenCaptureMode.Sending);
|
|
368
|
-
}
|
|
369
|
-
else disposeStream(myStream);
|
|
370
|
-
}
|
|
371
|
-
break
|
|
372
|
-
|
|
373
|
-
default:
|
|
374
|
-
console.error("Can not start screen sharing: Unknown device type", this.device);
|
|
375
|
-
|
|
376
|
-
}
|
|
377
|
-
} catch (err: any) {
|
|
378
|
-
if (err.name === "NotAllowedError") {
|
|
379
|
-
// user cancelled stream selection
|
|
380
|
-
console.log("Selection cancelled");
|
|
381
|
-
this._requestOpen = false;
|
|
382
|
-
return;
|
|
383
|
-
}
|
|
384
|
-
console.error("Error opening video", err);
|
|
385
|
-
}
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
close() {
|
|
389
|
-
this._requestOpen = false;
|
|
390
|
-
if (this._currentStream) {
|
|
391
|
-
if (debug)
|
|
392
|
-
console.warn("Close current stream / disposing resources, stream was active?", this._currentStream.active);
|
|
393
|
-
this._net?.stopSendingStream(this._currentStream);
|
|
394
|
-
disposeStream(this._currentStream);
|
|
395
|
-
this._currentMode = ScreenCaptureMode.Idle;
|
|
396
|
-
this._currentStream = null;
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
|
|
400
|
-
private setStream(stream: MediaStream, mode: ScreenCaptureMode) {
|
|
401
|
-
|
|
402
|
-
if (stream === this._currentStream) return;
|
|
403
|
-
|
|
404
|
-
this.close();
|
|
405
|
-
if (!stream) return;
|
|
406
|
-
|
|
407
|
-
this._currentStream = stream;
|
|
408
|
-
this._requestOpen = true;
|
|
409
|
-
this._currentMode = mode;
|
|
410
|
-
|
|
411
|
-
const isVideoStream = this.device !== "Microphone";
|
|
412
|
-
const isSending = mode === ScreenCaptureMode.Sending;
|
|
413
|
-
|
|
414
|
-
if (isVideoStream) {
|
|
415
|
-
if (!this._videoPlayer)
|
|
416
|
-
this._ensureVideoPlayer();
|
|
417
|
-
if (this._videoPlayer)
|
|
418
|
-
this._videoPlayer.setVideo(stream);
|
|
419
|
-
else console.error("No video player assigned for video stream");
|
|
420
|
-
}
|
|
421
|
-
else {
|
|
422
|
-
if (!this._audioSource) {
|
|
423
|
-
this._audioSource = new AudioSource();
|
|
424
|
-
this._audioSource.spatialBlend = 0;
|
|
425
|
-
this._audioSource.volume = 1;
|
|
426
|
-
this.gameObject.addComponent(this._audioSource);
|
|
427
|
-
}
|
|
428
|
-
if (!isSending) {
|
|
429
|
-
if (debug) console.log("PLAY", stream.getAudioTracks())
|
|
430
|
-
this._audioSource.volume = 1;
|
|
431
|
-
this._audioSource?.play(stream);
|
|
432
|
-
}
|
|
433
|
-
}
|
|
434
|
-
|
|
435
|
-
if (isSending) {
|
|
436
|
-
this._net?.startSendingStream(stream);
|
|
437
|
-
}
|
|
438
|
-
|
|
439
|
-
// Mute audio for the video we are sending
|
|
440
|
-
if (isSending) {
|
|
441
|
-
if (this._videoPlayer)
|
|
442
|
-
this._videoPlayer.muted = true;
|
|
443
|
-
this._audioSource?.stop();
|
|
444
|
-
}
|
|
445
|
-
|
|
446
|
-
for (const track of stream.getTracks()) {
|
|
447
|
-
track.addEventListener("ended", () => {
|
|
448
|
-
if (debug) console.log("Track ended", track);
|
|
449
|
-
this.close();
|
|
450
|
-
});
|
|
451
|
-
|
|
452
|
-
if (debug) {
|
|
453
|
-
if (track.kind === "video") {
|
|
454
|
-
if (isSending)
|
|
455
|
-
console.log("Video →", track.getSettings());
|
|
456
|
-
else
|
|
457
|
-
console.log("Video ←", track.getSettings());
|
|
458
|
-
}
|
|
459
|
-
}
|
|
460
|
-
}
|
|
461
|
-
|
|
462
|
-
}
|
|
463
|
-
|
|
464
|
-
private onReceiveStream = (evt: StreamReceivedEvent) => {
|
|
465
|
-
if (evt.stream?.active !== true) return;
|
|
466
|
-
this.setStream(evt.stream, ScreenCaptureMode.Receiving);
|
|
467
|
-
}
|
|
468
|
-
private onCallEnded = (_evt: StreamEndedEvent) => {
|
|
469
|
-
if (debug) console.log("CALL ENDED", this.isReceiving, this?.screenspace)
|
|
470
|
-
if (this.isReceiving) this.screenspace = false;
|
|
471
|
-
}
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
private async tryShareUserCamera(constraints: MediaStreamConstraints, options?: ScreenCaptureOptions) {
|
|
476
|
-
|
|
477
|
-
// let newWindow = open('', 'example', 'width=300,height=300');
|
|
478
|
-
// if (window) {
|
|
479
|
-
// newWindow!.document.body.innerHTML = "Please allow access to your camera and microphone";
|
|
480
|
-
// }
|
|
481
|
-
|
|
482
|
-
// TODO: allow user to select device
|
|
483
|
-
const devices = (await navigator.mediaDevices.enumerateDevices()).filter(d => d.kind === "videoinput");
|
|
484
|
-
if (debug)
|
|
485
|
-
console.log("Request camera. These are your kind:videoinput devices:\n", devices);
|
|
486
|
-
|
|
487
|
-
let foundDevice = false;
|
|
488
|
-
|
|
489
|
-
for (const dev of devices) {
|
|
490
|
-
try {
|
|
491
|
-
if (!this._requestOpen) {
|
|
492
|
-
if (debug) console.log("Camera selection cancelled");
|
|
493
|
-
break;
|
|
494
|
-
}
|
|
495
|
-
|
|
496
|
-
if (dev.kind !== "videoinput") {
|
|
497
|
-
if (debug) console.log("Skipping non-video device", dev);
|
|
498
|
-
continue;
|
|
499
|
-
}
|
|
500
|
-
|
|
501
|
-
const id = dev.deviceId;
|
|
502
|
-
|
|
503
|
-
// If the share method is called with filter options then those should be used
|
|
504
|
-
const hasOptionsFilter = options?.deviceId != undefined || options?.deviceFilter != undefined;
|
|
505
|
-
if (hasOptionsFilter) {
|
|
506
|
-
if (options?.deviceId !== undefined) {
|
|
507
|
-
if (id !== options.deviceId) {
|
|
508
|
-
if (debug) console.log("Skipping device due to options.deviceId: " + dev.label + "; " + dev.deviceId);
|
|
509
|
-
continue;
|
|
510
|
-
}
|
|
511
|
-
}
|
|
512
|
-
if (options?.deviceFilter) {
|
|
513
|
-
const useDevice = options.deviceFilter(dev);
|
|
514
|
-
if (useDevice === false) {
|
|
515
|
-
if (debug) console.log("Skipping device due to options.deviceFilter: " + dev.label + "; " + dev.deviceId);
|
|
516
|
-
continue;
|
|
517
|
-
}
|
|
518
|
-
}
|
|
519
|
-
}
|
|
520
|
-
// If the share method was called without filter options then the component filter should be used
|
|
521
|
-
else if (this.deviceFilter) {
|
|
522
|
-
const useDevice = this.deviceFilter(dev);
|
|
523
|
-
if (useDevice === false) {
|
|
524
|
-
if (debug) console.log("Skipping device due to ScreenShare.deviceFilter: " + dev.label + "; " + dev.deviceId);
|
|
525
|
-
continue;
|
|
526
|
-
}
|
|
527
|
-
else if(debug)
|
|
528
|
-
console.log("Selected device by filter", dev);
|
|
529
|
-
}
|
|
530
|
-
else if (this.deviceName) {
|
|
531
|
-
const lowercaseLabel = dev.label.toLowerCase();
|
|
532
|
-
const lowercaseName = this.deviceName.toLowerCase();
|
|
533
|
-
const labelMatches = lowercaseLabel.includes(lowercaseName);
|
|
534
|
-
const idMatches = dev.deviceId === this.deviceName;
|
|
535
|
-
if (!labelMatches && !idMatches) {
|
|
536
|
-
if (debug) console.log("Skipping device due to ScreenShare.deviceName: " + dev.label + "; " + dev.deviceId);
|
|
537
|
-
continue;
|
|
538
|
-
}
|
|
539
|
-
else if(debug) console.log("Selected device by name", dev);
|
|
540
|
-
}
|
|
541
|
-
|
|
542
|
-
if (constraints.video !== false) {
|
|
543
|
-
if (typeof constraints.video === "undefined" || typeof constraints.video === "boolean") {
|
|
544
|
-
constraints.video = {};
|
|
545
|
-
}
|
|
546
|
-
constraints.video.deviceId = id;
|
|
547
|
-
}
|
|
548
|
-
|
|
549
|
-
foundDevice = true;
|
|
550
|
-
const userMedia = await navigator.mediaDevices.getUserMedia(constraints).catch(err => {
|
|
551
|
-
console.error("Failed to get user media", err);
|
|
552
|
-
return null;
|
|
553
|
-
})
|
|
554
|
-
if (userMedia === null) {
|
|
555
|
-
continue;
|
|
556
|
-
}
|
|
557
|
-
else if (this._requestOpen) {
|
|
558
|
-
this.setStream(userMedia, ScreenCaptureMode.Sending);
|
|
559
|
-
if (debug)
|
|
560
|
-
console.log("Selected camera", dev);
|
|
561
|
-
}
|
|
562
|
-
else {
|
|
563
|
-
disposeStream(userMedia);
|
|
564
|
-
if (debug)
|
|
565
|
-
console.log("Camera selection cancelled");
|
|
566
|
-
}
|
|
567
|
-
break;
|
|
568
|
-
}
|
|
569
|
-
catch (err: any) {
|
|
570
|
-
// First message is firefox, second is chrome when the video source is already in use by another app
|
|
571
|
-
if (err.message === "Failed to allocate videosource" || err.message === "Could not start video source") {
|
|
572
|
-
showBalloonWarning("Failed to start video: Try another camera (Code " + err.code + ")");
|
|
573
|
-
console.warn(err);
|
|
574
|
-
continue;
|
|
575
|
-
}
|
|
576
|
-
else {
|
|
577
|
-
console.error("Failed to get user media", err.message, err.code, err);
|
|
578
|
-
}
|
|
579
|
-
}
|
|
580
|
-
}
|
|
581
|
-
|
|
582
|
-
if(!foundDevice && isDevEnvironment()){
|
|
583
|
-
showBalloonWarning("No camera found for sharing. Please connect a camera (see console for more information)");
|
|
584
|
-
console.warn("No camera found for sharing. Please connect a camera", devices, this.deviceName, "Using deviceFilter? " + this.deviceFilter != undefined, "Using options? " + options != undefined, "Using deviceName? " + this.deviceName != undefined, "Using options.deviceId? " + options?.deviceId != undefined, "Using options.deviceFilter? " + options?.deviceFilter != undefined);
|
|
585
|
-
}
|
|
586
|
-
}
|
|
587
|
-
// private _cameraSelectionWindow : Window | null = null;
|
|
588
|
-
// private openWindowToSelectCamera(){
|
|
589
|
-
|
|
590
|
-
// }
|
|
591
|
-
}
|
|
592
|
-
|
|
1
|
+
import { isDevEnvironment, showBalloonWarning } from "../engine/debug/index.js";
|
|
2
|
+
import { RoomEvents } from "../engine/engine_networking.js";
|
|
3
|
+
import { disposeStream, NetworkedStreamEvents, NetworkedStreams, PeerHandle, StreamEndedEvent, StreamReceivedEvent } from "../engine/engine_networking_streams.js";
|
|
4
|
+
import { serializable } from "../engine/engine_serialization.js";
|
|
5
|
+
import { delay, getParam } from "../engine/engine_utils.js";
|
|
6
|
+
import { AudioSource } from "./AudioSource.js";
|
|
7
|
+
import { Behaviour, GameObject } from "./Component.js";
|
|
8
|
+
import type { IPointerClickHandler, PointerEventData } from "./ui/PointerEvents.js";
|
|
9
|
+
import { AspectMode, VideoPlayer } from "./VideoPlayer.js";
|
|
10
|
+
|
|
11
|
+
const debug = getParam("debugscreensharing");
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* ScreenCapture component allows you to share your screen, camera or microphone with other users in the networked room.
|
|
15
|
+
*/
|
|
16
|
+
export enum ScreenCaptureDevice {
|
|
17
|
+
/**
|
|
18
|
+
* Capture the screen of the user.
|
|
19
|
+
*/
|
|
20
|
+
Screen = 0,
|
|
21
|
+
/**
|
|
22
|
+
* Capture the camera of the user.
|
|
23
|
+
*/
|
|
24
|
+
Camera = 1,
|
|
25
|
+
/** Please note that canvas streaming might not work reliably on chrome: https://bugs.chromium.org/p/chromium/issues/detail?id=1156408 */
|
|
26
|
+
Canvas = 2,
|
|
27
|
+
/** When using Microphone only the voice will be send */
|
|
28
|
+
Microphone = 3
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* {@link ScreenCapture} allows you to share your screen, camera or microphone with other users in the networked room.
|
|
33
|
+
*/
|
|
34
|
+
declare type ScreenCaptureDeviceTypes = keyof typeof ScreenCaptureDevice;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* The current mode of the {@link ScreenCapture} component.
|
|
38
|
+
*/
|
|
39
|
+
export enum ScreenCaptureMode {
|
|
40
|
+
Idle = 0,
|
|
41
|
+
Sending = 1,
|
|
42
|
+
Receiving = 2
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Options for the {@link ScreenCapture} component when starting to share a stream by calling the {@link ScreenCapture.share}.
|
|
47
|
+
*/
|
|
48
|
+
export declare type ScreenCaptureOptions = {
|
|
49
|
+
/**
|
|
50
|
+
* You can specify the device type to capture (e.g. Screen, Camera, Microphone)
|
|
51
|
+
*/
|
|
52
|
+
device?: ScreenCaptureDeviceTypes,
|
|
53
|
+
/**
|
|
54
|
+
* Constraints for the media stream like resolution, frame rate, etc.
|
|
55
|
+
* @see https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamConstraints
|
|
56
|
+
*/
|
|
57
|
+
constraints?: MediaTrackConstraints,
|
|
58
|
+
/** Filter video device by id. Alternatively pass in a deviceFilter callback to manually filter available devices */
|
|
59
|
+
deviceId?: string,
|
|
60
|
+
/** Return false to skip the available device */
|
|
61
|
+
deviceFilter?: (device: MediaDeviceInfo) => boolean,
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* The ScreenCapture component allows you to share your screen, camera or microphone with other users in the networked room.
|
|
66
|
+
* When the stream is active the video will be displayed on the VideoPlayer component attached to the same GameObject.
|
|
67
|
+
*
|
|
68
|
+
* Note: For debugging append `?debugscreensharing` to the URL to see more information in the console.
|
|
69
|
+
*
|
|
70
|
+
* By default the component will start sharing the screen when the user clicks on the object this component is attached to. You can set {@link device} This behaviour can be disabled by setting `allowStartOnClick` to false.
|
|
71
|
+
* It is also possible to start the stream manually from your code by calling the {@link share} method.
|
|
72
|
+
*
|
|
73
|
+
* @category Networking
|
|
74
|
+
* @group Components
|
|
75
|
+
*/
|
|
76
|
+
export class ScreenCapture extends Behaviour implements IPointerClickHandler {
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* When enabled the stream will start when the user clicks on the object this component is attached to
|
|
80
|
+
* It is also possible to start the stream manually from your code by calling the {@link share} method
|
|
81
|
+
* To modify what type of device is shared you can set the {@link device} property.
|
|
82
|
+
* @default true
|
|
83
|
+
*/
|
|
84
|
+
@serializable()
|
|
85
|
+
allowStartOnClick: boolean = true;
|
|
86
|
+
|
|
87
|
+
/** @internal */
|
|
88
|
+
onPointerEnter() {
|
|
89
|
+
if (this.context.connection.allowEditing == false) return;
|
|
90
|
+
if (!this.allowStartOnClick) return;
|
|
91
|
+
this.context.input.setCursor("pointer");
|
|
92
|
+
}
|
|
93
|
+
/** @internal */
|
|
94
|
+
onPointerExit() {
|
|
95
|
+
if (this.context.connection.allowEditing == false) return;
|
|
96
|
+
if (!this.allowStartOnClick) return;
|
|
97
|
+
this.context.input.unsetCursor("pointer");
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/** @internal */
|
|
101
|
+
onPointerClick(evt: PointerEventData) {
|
|
102
|
+
if (this.context.connection.allowEditing == false) return;
|
|
103
|
+
if (!this.allowStartOnClick) return;
|
|
104
|
+
if (evt && evt.pointerId !== 0) return;
|
|
105
|
+
if (this.isReceiving && this.videoPlayer?.isPlaying) {
|
|
106
|
+
if (this.videoPlayer)
|
|
107
|
+
this.videoPlayer.screenspace = !this.videoPlayer.screenspace;
|
|
108
|
+
return;
|
|
109
|
+
|
|
110
|
+
}
|
|
111
|
+
if (this.isSending) {
|
|
112
|
+
this.close();
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
this.share();
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
/** When enabled the stream will start when this component becomes active (enabled in the scene) */
|
|
120
|
+
@serializable()
|
|
121
|
+
autoConnect: boolean = false;
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* If a VideoPlayer component is assigned to this property the video will be displayed on the VideoPlayer component.
|
|
125
|
+
*/
|
|
126
|
+
@serializable(VideoPlayer)
|
|
127
|
+
set videoPlayer(val: VideoPlayer | undefined) {
|
|
128
|
+
if (this._videoPlayer && (this.isSending || this.isReceiving)) {
|
|
129
|
+
this._videoPlayer.stop();
|
|
130
|
+
}
|
|
131
|
+
this._videoPlayer = val;
|
|
132
|
+
if (this._videoPlayer && this._currentStream && (this.isSending || this.isReceiving)) {
|
|
133
|
+
this._videoPlayer.setVideo(this._currentStream);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
get videoPlayer() { return this._videoPlayer; }
|
|
137
|
+
private _videoPlayer?: VideoPlayer;
|
|
138
|
+
private _audioSource?: AudioSource;
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* When enabled the video will be displayed in the screenspace of the VideoPlayer component.
|
|
142
|
+
*/
|
|
143
|
+
get screenspace() { return this.videoPlayer?.screenspace ?? false; }
|
|
144
|
+
set screenspace(v: boolean) { if (this.videoPlayer) this.videoPlayer.screenspace = v; }
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Which streaming device type should be used when starting to share (if {@link share} is called without a device option). Options are Screen, Camera, Microphone.
|
|
148
|
+
* This is e.g. used if `allowStartOnClick` is enabled and the user clicks on the object.
|
|
149
|
+
* @default Screen
|
|
150
|
+
*/
|
|
151
|
+
@serializable()
|
|
152
|
+
device: ScreenCaptureDeviceTypes = "Screen";
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* If assigned the device the device will be selected by this id or label when starting to share.
|
|
156
|
+
* Note: This is only supported for `Camera` devices
|
|
157
|
+
*/
|
|
158
|
+
@serializable()
|
|
159
|
+
deviceName?: string;
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Filter which device should be chosen for sharing by id or label.
|
|
163
|
+
* Assign a method to this property to manually filter the available devices.
|
|
164
|
+
*/
|
|
165
|
+
deviceFilter?: (device: MediaDeviceInfo) => boolean;
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* the current stream that is being shared or received
|
|
169
|
+
* @link https://developer.mozilla.org/en-US/docs/Web/API/MediaStream
|
|
170
|
+
*/
|
|
171
|
+
get currentScream(): MediaStream | null {
|
|
172
|
+
return this._currentStream;
|
|
173
|
+
}
|
|
174
|
+
get currentMode(): ScreenCaptureMode {
|
|
175
|
+
return this._currentMode;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* @returns true if the component is currently sending a stream
|
|
180
|
+
*/
|
|
181
|
+
get isSending() {
|
|
182
|
+
return this._currentStream?.active && this._currentMode === ScreenCaptureMode.Sending;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* @returns true if the component is currently receiving a stream
|
|
186
|
+
*/
|
|
187
|
+
get isReceiving() {
|
|
188
|
+
if (this._currentMode === ScreenCaptureMode.Receiving) {
|
|
189
|
+
if (!this._currentStream || this._currentStream.active === false) return false;
|
|
190
|
+
// if any track is still live consider it active
|
|
191
|
+
const tracks = this._currentStream.getTracks();
|
|
192
|
+
for (const track of tracks) {
|
|
193
|
+
if (track.readyState === "live") return true;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return false;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
private get requiresVideoPlayer() {
|
|
200
|
+
return this.device !== "Microphone";
|
|
201
|
+
}
|
|
202
|
+
private _net?: NetworkedStreams;
|
|
203
|
+
private _requestOpen: boolean = false;
|
|
204
|
+
private _currentStream: MediaStream | null = null;
|
|
205
|
+
private _currentMode: ScreenCaptureMode = ScreenCaptureMode.Idle;
|
|
206
|
+
|
|
207
|
+
/** @internal */
|
|
208
|
+
awake() {
|
|
209
|
+
// Resolve the device type if it is a number
|
|
210
|
+
if (typeof this.device === "number") {
|
|
211
|
+
this.device = ScreenCaptureDevice[this.device] as ScreenCaptureDeviceTypes;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
if (debug)
|
|
215
|
+
console.log("Screensharing", this.name, this);
|
|
216
|
+
AudioSource.registerWaitForAllowAudio(() => {
|
|
217
|
+
if (this._videoPlayer && this._currentStream && this._currentMode === ScreenCaptureMode.Receiving) {
|
|
218
|
+
this._videoPlayer.playInBackground = true;
|
|
219
|
+
this._videoPlayer.setVideo(this._currentStream);
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
this._net = new NetworkedStreams(this);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/** @internal */
|
|
226
|
+
onEnable(): void {
|
|
227
|
+
this._net?.enable();
|
|
228
|
+
//@ts-ignore
|
|
229
|
+
this._net?.addEventListener(NetworkedStreamEvents.StreamReceived, this.onReceiveStream);
|
|
230
|
+
//@ts-ignore
|
|
231
|
+
this._net?.addEventListener(NetworkedStreamEvents.StreamEnded, this.onCallEnded);
|
|
232
|
+
this.context.connection.beginListen(RoomEvents.JoinedRoom, this.onJoinedRoom);
|
|
233
|
+
if (this.autoConnect) {
|
|
234
|
+
delay(1000).then(() => {
|
|
235
|
+
if (this.enabled && this.autoConnect && !this.isReceiving && !this.isSending && this.context.connection.isInRoom)
|
|
236
|
+
this.share()
|
|
237
|
+
return 0;
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/** @internal */
|
|
243
|
+
onDisable(): void {
|
|
244
|
+
//@ts-ignore
|
|
245
|
+
this._net?.removeEventListener(NetworkedStreamEvents.StreamReceived, this.onReceiveStream);
|
|
246
|
+
//@ts-ignore
|
|
247
|
+
this._net?.removeEventListener(NetworkedStreamEvents.StreamEnded, this.onCallEnded);
|
|
248
|
+
this.context.connection.stopListen(RoomEvents.JoinedRoom, this.onJoinedRoom);
|
|
249
|
+
this._net?.disable();
|
|
250
|
+
this.close();
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
private onJoinedRoom = async () => {
|
|
254
|
+
await delay(1000);
|
|
255
|
+
if (this.autoConnect && !this.isSending && !this.isReceiving && this.context.connection.isInRoom) {
|
|
256
|
+
this.share();
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
private _ensureVideoPlayer() {
|
|
261
|
+
const vp = new VideoPlayer();
|
|
262
|
+
vp.aspectMode = AspectMode.AdjustWidth;
|
|
263
|
+
GameObject.addComponent(this.gameObject, vp);
|
|
264
|
+
this._videoPlayer = vp;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
private _activeShareRequest: Promise<void> | null = null;
|
|
268
|
+
|
|
269
|
+
/** Call to begin screensharing */
|
|
270
|
+
async share(opts?: ScreenCaptureOptions) {
|
|
271
|
+
if (this._activeShareRequest) return this._activeShareRequest;
|
|
272
|
+
this._activeShareRequest = this.internalShare(opts);
|
|
273
|
+
return this._activeShareRequest.then(() => {
|
|
274
|
+
return this._activeShareRequest = null;
|
|
275
|
+
})
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
private async internalShare(opts?: ScreenCaptureOptions) {
|
|
279
|
+
if (this.context.connection.isInRoom === false) {
|
|
280
|
+
console.warn("Can not start screensharing: requires network connection");
|
|
281
|
+
if (isDevEnvironment()) showBalloonWarning("Can not start screensharing: requires network connection. Add a SyncedRoom component or join a room first.");
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
if (opts?.device)
|
|
286
|
+
this.device = opts.device;
|
|
287
|
+
|
|
288
|
+
if (!this.videoPlayer && this.requiresVideoPlayer) {
|
|
289
|
+
if (!this._videoPlayer) {
|
|
290
|
+
this._videoPlayer = GameObject.getComponent(this.gameObject, VideoPlayer) ?? undefined;
|
|
291
|
+
}
|
|
292
|
+
if (!this.videoPlayer) {
|
|
293
|
+
this._ensureVideoPlayer();
|
|
294
|
+
}
|
|
295
|
+
if (!this.videoPlayer) {
|
|
296
|
+
console.warn("Can not share video without a videoPlayer assigned");
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
this._requestOpen = true;
|
|
302
|
+
try {
|
|
303
|
+
|
|
304
|
+
const settings: MediaTrackConstraints = opts?.constraints ?? {
|
|
305
|
+
echoCancellation: true,
|
|
306
|
+
autoGainControl: false,
|
|
307
|
+
};
|
|
308
|
+
const displayMediaOptions: MediaStreamConstraints = {
|
|
309
|
+
video: settings,
|
|
310
|
+
audio: settings,
|
|
311
|
+
};
|
|
312
|
+
const videoOptions = displayMediaOptions.video;
|
|
313
|
+
if (videoOptions !== undefined && typeof videoOptions !== "boolean") {
|
|
314
|
+
// Set default video settings
|
|
315
|
+
if (!videoOptions.width)
|
|
316
|
+
videoOptions.width = { max: 1920 };
|
|
317
|
+
if (!videoOptions.height)
|
|
318
|
+
videoOptions.height = { max: 1920 };
|
|
319
|
+
if (!videoOptions.aspectRatio)
|
|
320
|
+
videoOptions.aspectRatio = { ideal: 1.7777777778 };
|
|
321
|
+
if (!videoOptions.frameRate)
|
|
322
|
+
videoOptions.frameRate = { ideal: 24 };
|
|
323
|
+
if (!videoOptions.facingMode)
|
|
324
|
+
videoOptions.facingMode = { ideal: "user" };
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
switch (this.device) {
|
|
328
|
+
// Capture a connected camera
|
|
329
|
+
case "Camera":
|
|
330
|
+
this.tryShareUserCamera(displayMediaOptions, opts);
|
|
331
|
+
break;
|
|
332
|
+
|
|
333
|
+
// capture any screen, will show a popup
|
|
334
|
+
case "Screen":
|
|
335
|
+
{
|
|
336
|
+
if (!navigator.mediaDevices.getDisplayMedia) {
|
|
337
|
+
console.error("No getDisplayMedia support");
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
340
|
+
const myVideo = await navigator.mediaDevices.getDisplayMedia(displayMediaOptions);
|
|
341
|
+
if (this._requestOpen) {
|
|
342
|
+
this.setStream(myVideo, ScreenCaptureMode.Sending);
|
|
343
|
+
}
|
|
344
|
+
else disposeStream(myVideo);
|
|
345
|
+
}
|
|
346
|
+
break;
|
|
347
|
+
|
|
348
|
+
// capture the canvas meaning the threejs view
|
|
349
|
+
case "Canvas":
|
|
350
|
+
// looks like this doesnt work reliably on chrome https://stackoverflow.com/a/66848674
|
|
351
|
+
// firefox updates fine
|
|
352
|
+
// https://bugs.chromium.org/p/chromium/issues/detail?id=1156408
|
|
353
|
+
const fps = 0;
|
|
354
|
+
const stream = this.context.renderer.domElement.captureStream(fps);
|
|
355
|
+
this.setStream(stream, ScreenCaptureMode.Sending);
|
|
356
|
+
break;
|
|
357
|
+
|
|
358
|
+
case "Microphone":
|
|
359
|
+
{
|
|
360
|
+
if (!navigator.mediaDevices.getUserMedia) {
|
|
361
|
+
console.error("No getDisplayMedia support");
|
|
362
|
+
return;
|
|
363
|
+
}
|
|
364
|
+
displayMediaOptions.video = false;
|
|
365
|
+
const myStream = await navigator.mediaDevices.getUserMedia(displayMediaOptions);
|
|
366
|
+
if (this._requestOpen) {
|
|
367
|
+
this.setStream(myStream, ScreenCaptureMode.Sending);
|
|
368
|
+
}
|
|
369
|
+
else disposeStream(myStream);
|
|
370
|
+
}
|
|
371
|
+
break
|
|
372
|
+
|
|
373
|
+
default:
|
|
374
|
+
console.error("Can not start screen sharing: Unknown device type", this.device);
|
|
375
|
+
|
|
376
|
+
}
|
|
377
|
+
} catch (err: any) {
|
|
378
|
+
if (err.name === "NotAllowedError") {
|
|
379
|
+
// user cancelled stream selection
|
|
380
|
+
console.log("Selection cancelled");
|
|
381
|
+
this._requestOpen = false;
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
console.error("Error opening video", err);
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
close() {
|
|
389
|
+
this._requestOpen = false;
|
|
390
|
+
if (this._currentStream) {
|
|
391
|
+
if (debug)
|
|
392
|
+
console.warn("Close current stream / disposing resources, stream was active?", this._currentStream.active);
|
|
393
|
+
this._net?.stopSendingStream(this._currentStream);
|
|
394
|
+
disposeStream(this._currentStream);
|
|
395
|
+
this._currentMode = ScreenCaptureMode.Idle;
|
|
396
|
+
this._currentStream = null;
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
private setStream(stream: MediaStream, mode: ScreenCaptureMode) {
|
|
401
|
+
|
|
402
|
+
if (stream === this._currentStream) return;
|
|
403
|
+
|
|
404
|
+
this.close();
|
|
405
|
+
if (!stream) return;
|
|
406
|
+
|
|
407
|
+
this._currentStream = stream;
|
|
408
|
+
this._requestOpen = true;
|
|
409
|
+
this._currentMode = mode;
|
|
410
|
+
|
|
411
|
+
const isVideoStream = this.device !== "Microphone";
|
|
412
|
+
const isSending = mode === ScreenCaptureMode.Sending;
|
|
413
|
+
|
|
414
|
+
if (isVideoStream) {
|
|
415
|
+
if (!this._videoPlayer)
|
|
416
|
+
this._ensureVideoPlayer();
|
|
417
|
+
if (this._videoPlayer)
|
|
418
|
+
this._videoPlayer.setVideo(stream);
|
|
419
|
+
else console.error("No video player assigned for video stream");
|
|
420
|
+
}
|
|
421
|
+
else {
|
|
422
|
+
if (!this._audioSource) {
|
|
423
|
+
this._audioSource = new AudioSource();
|
|
424
|
+
this._audioSource.spatialBlend = 0;
|
|
425
|
+
this._audioSource.volume = 1;
|
|
426
|
+
this.gameObject.addComponent(this._audioSource);
|
|
427
|
+
}
|
|
428
|
+
if (!isSending) {
|
|
429
|
+
if (debug) console.log("PLAY", stream.getAudioTracks())
|
|
430
|
+
this._audioSource.volume = 1;
|
|
431
|
+
this._audioSource?.play(stream);
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
if (isSending) {
|
|
436
|
+
this._net?.startSendingStream(stream);
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
// Mute audio for the video we are sending
|
|
440
|
+
if (isSending) {
|
|
441
|
+
if (this._videoPlayer)
|
|
442
|
+
this._videoPlayer.muted = true;
|
|
443
|
+
this._audioSource?.stop();
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
for (const track of stream.getTracks()) {
|
|
447
|
+
track.addEventListener("ended", () => {
|
|
448
|
+
if (debug) console.log("Track ended", track);
|
|
449
|
+
this.close();
|
|
450
|
+
});
|
|
451
|
+
|
|
452
|
+
if (debug) {
|
|
453
|
+
if (track.kind === "video") {
|
|
454
|
+
if (isSending)
|
|
455
|
+
console.log("Video →", track.getSettings());
|
|
456
|
+
else
|
|
457
|
+
console.log("Video ←", track.getSettings());
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
private onReceiveStream = (evt: StreamReceivedEvent) => {
|
|
465
|
+
if (evt.stream?.active !== true) return;
|
|
466
|
+
this.setStream(evt.stream, ScreenCaptureMode.Receiving);
|
|
467
|
+
}
|
|
468
|
+
private onCallEnded = (_evt: StreamEndedEvent) => {
|
|
469
|
+
if (debug) console.log("CALL ENDED", this.isReceiving, this?.screenspace)
|
|
470
|
+
if (this.isReceiving) this.screenspace = false;
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
|
|
474
|
+
|
|
475
|
+
private async tryShareUserCamera(constraints: MediaStreamConstraints, options?: ScreenCaptureOptions) {
|
|
476
|
+
|
|
477
|
+
// let newWindow = open('', 'example', 'width=300,height=300');
|
|
478
|
+
// if (window) {
|
|
479
|
+
// newWindow!.document.body.innerHTML = "Please allow access to your camera and microphone";
|
|
480
|
+
// }
|
|
481
|
+
|
|
482
|
+
// TODO: allow user to select device
|
|
483
|
+
const devices = (await navigator.mediaDevices.enumerateDevices()).filter(d => d.kind === "videoinput");
|
|
484
|
+
if (debug)
|
|
485
|
+
console.log("Request camera. These are your kind:videoinput devices:\n", devices);
|
|
486
|
+
|
|
487
|
+
let foundDevice = false;
|
|
488
|
+
|
|
489
|
+
for (const dev of devices) {
|
|
490
|
+
try {
|
|
491
|
+
if (!this._requestOpen) {
|
|
492
|
+
if (debug) console.log("Camera selection cancelled");
|
|
493
|
+
break;
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
if (dev.kind !== "videoinput") {
|
|
497
|
+
if (debug) console.log("Skipping non-video device", dev);
|
|
498
|
+
continue;
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
const id = dev.deviceId;
|
|
502
|
+
|
|
503
|
+
// If the share method is called with filter options then those should be used
|
|
504
|
+
const hasOptionsFilter = options?.deviceId != undefined || options?.deviceFilter != undefined;
|
|
505
|
+
if (hasOptionsFilter) {
|
|
506
|
+
if (options?.deviceId !== undefined) {
|
|
507
|
+
if (id !== options.deviceId) {
|
|
508
|
+
if (debug) console.log("Skipping device due to options.deviceId: " + dev.label + "; " + dev.deviceId);
|
|
509
|
+
continue;
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
if (options?.deviceFilter) {
|
|
513
|
+
const useDevice = options.deviceFilter(dev);
|
|
514
|
+
if (useDevice === false) {
|
|
515
|
+
if (debug) console.log("Skipping device due to options.deviceFilter: " + dev.label + "; " + dev.deviceId);
|
|
516
|
+
continue;
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
// If the share method was called without filter options then the component filter should be used
|
|
521
|
+
else if (this.deviceFilter) {
|
|
522
|
+
const useDevice = this.deviceFilter(dev);
|
|
523
|
+
if (useDevice === false) {
|
|
524
|
+
if (debug) console.log("Skipping device due to ScreenShare.deviceFilter: " + dev.label + "; " + dev.deviceId);
|
|
525
|
+
continue;
|
|
526
|
+
}
|
|
527
|
+
else if(debug)
|
|
528
|
+
console.log("Selected device by filter", dev);
|
|
529
|
+
}
|
|
530
|
+
else if (this.deviceName) {
|
|
531
|
+
const lowercaseLabel = dev.label.toLowerCase();
|
|
532
|
+
const lowercaseName = this.deviceName.toLowerCase();
|
|
533
|
+
const labelMatches = lowercaseLabel.includes(lowercaseName);
|
|
534
|
+
const idMatches = dev.deviceId === this.deviceName;
|
|
535
|
+
if (!labelMatches && !idMatches) {
|
|
536
|
+
if (debug) console.log("Skipping device due to ScreenShare.deviceName: " + dev.label + "; " + dev.deviceId);
|
|
537
|
+
continue;
|
|
538
|
+
}
|
|
539
|
+
else if(debug) console.log("Selected device by name", dev);
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
if (constraints.video !== false) {
|
|
543
|
+
if (typeof constraints.video === "undefined" || typeof constraints.video === "boolean") {
|
|
544
|
+
constraints.video = {};
|
|
545
|
+
}
|
|
546
|
+
constraints.video.deviceId = id;
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
foundDevice = true;
|
|
550
|
+
const userMedia = await navigator.mediaDevices.getUserMedia(constraints).catch(err => {
|
|
551
|
+
console.error("Failed to get user media", err);
|
|
552
|
+
return null;
|
|
553
|
+
})
|
|
554
|
+
if (userMedia === null) {
|
|
555
|
+
continue;
|
|
556
|
+
}
|
|
557
|
+
else if (this._requestOpen) {
|
|
558
|
+
this.setStream(userMedia, ScreenCaptureMode.Sending);
|
|
559
|
+
if (debug)
|
|
560
|
+
console.log("Selected camera", dev);
|
|
561
|
+
}
|
|
562
|
+
else {
|
|
563
|
+
disposeStream(userMedia);
|
|
564
|
+
if (debug)
|
|
565
|
+
console.log("Camera selection cancelled");
|
|
566
|
+
}
|
|
567
|
+
break;
|
|
568
|
+
}
|
|
569
|
+
catch (err: any) {
|
|
570
|
+
// First message is firefox, second is chrome when the video source is already in use by another app
|
|
571
|
+
if (err.message === "Failed to allocate videosource" || err.message === "Could not start video source") {
|
|
572
|
+
showBalloonWarning("Failed to start video: Try another camera (Code " + err.code + ")");
|
|
573
|
+
console.warn(err);
|
|
574
|
+
continue;
|
|
575
|
+
}
|
|
576
|
+
else {
|
|
577
|
+
console.error("Failed to get user media", err.message, err.code, err);
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
if(!foundDevice && isDevEnvironment()){
|
|
583
|
+
showBalloonWarning("No camera found for sharing. Please connect a camera (see console for more information)");
|
|
584
|
+
console.warn("No camera found for sharing. Please connect a camera", devices, this.deviceName, "Using deviceFilter? " + this.deviceFilter != undefined, "Using options? " + options != undefined, "Using deviceName? " + this.deviceName != undefined, "Using options.deviceId? " + options?.deviceId != undefined, "Using options.deviceFilter? " + options?.deviceFilter != undefined);
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
// private _cameraSelectionWindow : Window | null = null;
|
|
588
|
+
// private openWindowToSelectCamera(){
|
|
589
|
+
|
|
590
|
+
// }
|
|
591
|
+
}
|
|
592
|
+
|