@needle-tools/engine 4.7.0-alpha → 4.7.0-next.da47826
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 +3768 -3768
- 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-Bm9eEfgu.min.js → gltf-progressive-Bl4okF1b.min.js} +1 -1
- package/dist/{gltf-progressive-GjIqwSG3.js → gltf-progressive-DSpdn0QT.js} +2 -2
- package/dist/{gltf-progressive-Dn6o99rH.umd.cjs → gltf-progressive-P8b8a0qY.umd.cjs} +1 -1
- package/dist/{needle-engine.bundle-CK8cQ3FX.umd.cjs → needle-engine.bundle-Bu88IoKB.umd.cjs} +57 -57
- package/dist/{needle-engine.bundle-CXtflnL6.js → needle-engine.bundle-CO1Ub9sm.js} +638 -638
- package/dist/{needle-engine.bundle-BEUFTdl6.min.js → needle-engine.bundle-D95XN5pP.min.js} +62 -62
- 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 +166 -166
- package/lib/engine/engine_addressables.js +608 -608
- 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 -1672
- 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 +91 -91
- 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 +31 -31
- package/lib/engine/engine_lods.js +146 -146
- 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 +784 -784
- package/lib/engine/engine_time.d.ts +51 -51
- package/lib/engine/engine_time.js +82 -82
- package/lib/engine/engine_time_utils.d.ts +88 -88
- package/lib/engine/engine_time_utils.js +215 -215
- package/lib/engine/engine_tonemapping.d.ts +6 -6
- package/lib/engine/engine_tonemapping.js +197 -197
- package/lib/engine/engine_types.d.ts +578 -578
- package/lib/engine/engine_types.js +95 -95
- package/lib/engine/engine_typestore.d.ts +28 -28
- package/lib/engine/engine_typestore.js +55 -55
- package/lib/engine/engine_util_decorator.d.ts +13 -13
- package/lib/engine/engine_util_decorator.js +116 -116
- package/lib/engine/engine_utils.d.ts +248 -248
- package/lib/engine/engine_utils.js +1012 -1012
- package/lib/engine/engine_utils_format.d.ts +24 -24
- package/lib/engine/engine_utils_format.js +239 -239
- package/lib/engine/engine_utils_screenshot.d.ts +159 -159
- package/lib/engine/engine_utils_screenshot.js +522 -522
- package/lib/engine/engine_utils_screenshot.xr.d.ts +5 -5
- package/lib/engine/engine_utils_screenshot.xr.js +90 -90
- package/lib/engine/engine_xr.d.ts +1 -1
- package/lib/engine/engine_xr.js +1 -1
- package/lib/engine/export/gltf/Writers.d.ts +19 -19
- package/lib/engine/export/gltf/Writers.js +24 -24
- package/lib/engine/export/gltf/index.d.ts +11 -11
- package/lib/engine/export/gltf/index.js +123 -123
- package/lib/engine/export/index.d.ts +2 -2
- package/lib/engine/export/index.js +2 -2
- package/lib/engine/export/state.d.ts +7 -7
- package/lib/engine/export/state.js +17 -17
- package/lib/engine/export/utils.d.ts +2 -2
- package/lib/engine/export/utils.js +7 -7
- package/lib/engine/extensions/EXT_texture_exr.d.ts +8 -8
- package/lib/engine/extensions/EXT_texture_exr.js +32 -32
- package/lib/engine/extensions/NEEDLE_animator_controller_model.d.ts +122 -122
- package/lib/engine/extensions/NEEDLE_animator_controller_model.js +95 -95
- package/lib/engine/extensions/NEEDLE_components.d.ts +35 -35
- package/lib/engine/extensions/NEEDLE_components.js +220 -220
- package/lib/engine/extensions/NEEDLE_gameobject_data.d.ts +10 -10
- package/lib/engine/extensions/NEEDLE_gameobject_data.js +57 -57
- package/lib/engine/extensions/NEEDLE_lighting_settings.d.ts +37 -37
- package/lib/engine/extensions/NEEDLE_lighting_settings.js +157 -157
- package/lib/engine/extensions/NEEDLE_lightmaps.d.ts +18 -18
- package/lib/engine/extensions/NEEDLE_lightmaps.js +99 -99
- package/lib/engine/extensions/NEEDLE_persistent_assets.d.ts +11 -11
- package/lib/engine/extensions/NEEDLE_persistent_assets.js +63 -63
- package/lib/engine/extensions/NEEDLE_progressive.d.ts +1 -1
- package/lib/engine/extensions/NEEDLE_progressive.js +1 -1
- package/lib/engine/extensions/NEEDLE_render_objects.d.ts +13 -13
- package/lib/engine/extensions/NEEDLE_render_objects.js +159 -159
- package/lib/engine/extensions/NEEDLE_techniques_webgl.d.ts +38 -38
- package/lib/engine/extensions/NEEDLE_techniques_webgl.js +564 -564
- package/lib/engine/extensions/extension_resolver.d.ts +4 -4
- package/lib/engine/extensions/extension_resolver.js +1 -1
- package/lib/engine/extensions/extension_utils.d.ts +12 -12
- package/lib/engine/extensions/extension_utils.js +152 -152
- package/lib/engine/extensions/extensions.d.ts +32 -32
- package/lib/engine/extensions/extensions.js +107 -107
- package/lib/engine/extensions/index.d.ts +6 -6
- package/lib/engine/extensions/index.js +6 -6
- package/lib/engine/extensions/usage_tracker.d.ts +13 -13
- package/lib/engine/extensions/usage_tracker.js +65 -65
- package/lib/engine/js-extensions/Camera.d.ts +1 -1
- package/lib/engine/js-extensions/Camera.js +39 -39
- package/lib/engine/js-extensions/ExtensionUtils.d.ts +9 -9
- package/lib/engine/js-extensions/ExtensionUtils.js +67 -67
- package/lib/engine/js-extensions/Layers.d.ts +6 -6
- package/lib/engine/js-extensions/Layers.js +22 -22
- package/lib/engine/js-extensions/Object3D.d.ts +120 -120
- package/lib/engine/js-extensions/Object3D.js +136 -136
- package/lib/engine/js-extensions/RGBAColor.d.ts +23 -23
- package/lib/engine/js-extensions/RGBAColor.js +111 -111
- package/lib/engine/js-extensions/Vector.d.ts +3 -3
- package/lib/engine/js-extensions/Vector.js +13 -13
- package/lib/engine/js-extensions/index.d.ts +5 -5
- package/lib/engine/js-extensions/index.js +5 -5
- package/lib/engine/physics/workers/mesh-bvh/GenerateMeshBVHWorker.d.ts +4 -4
- package/lib/engine/physics/workers/mesh-bvh/GenerateMeshBVHWorker.js +79 -79
- package/lib/engine/shaders/shaderData.d.ts +55 -55
- package/lib/engine/shaders/shaderData.js +58 -58
- package/lib/engine/tests/test_utils.d.ts +2 -2
- package/lib/engine/tests/test_utils.js +53 -53
- package/lib/engine/webcomponents/WebXRButtons.d.ts +56 -56
- package/lib/engine/webcomponents/WebXRButtons.js +230 -230
- package/lib/engine/webcomponents/api.d.ts +5 -5
- package/lib/engine/webcomponents/api.js +4 -4
- package/lib/engine/webcomponents/buttons.d.ts +51 -51
- package/lib/engine/webcomponents/buttons.js +264 -264
- package/lib/engine/webcomponents/fonts.d.ts +9 -9
- package/lib/engine/webcomponents/fonts.js +32 -32
- package/lib/engine/webcomponents/icons.d.ts +9 -9
- package/lib/engine/webcomponents/icons.js +52 -52
- package/lib/engine/webcomponents/index.d.ts +1 -1
- package/lib/engine/webcomponents/index.js +1 -1
- package/lib/engine/webcomponents/logo-element.d.ts +10 -10
- package/lib/engine/webcomponents/logo-element.js +67 -67
- package/lib/engine/webcomponents/needle menu/needle-menu-spatial.d.ts +37 -37
- package/lib/engine/webcomponents/needle menu/needle-menu-spatial.js +513 -513
- package/lib/engine/webcomponents/needle menu/needle-menu.d.ts +155 -155
- package/lib/engine/webcomponents/needle menu/needle-menu.js +1029 -1029
- package/lib/engine/webcomponents/needle-button.d.ts +34 -34
- package/lib/engine/webcomponents/needle-button.js +161 -161
- package/lib/engine/webcomponents/needle-engine.ar-overlay.d.ts +21 -21
- package/lib/engine/webcomponents/needle-engine.ar-overlay.js +166 -166
- package/lib/engine/webcomponents/needle-engine.attributes.d.ts +69 -69
- package/lib/engine/webcomponents/needle-engine.attributes.js +1 -1
- package/lib/engine/webcomponents/needle-engine.d.ts +116 -116
- package/lib/engine/webcomponents/needle-engine.extras.d.ts +6 -6
- package/lib/engine/webcomponents/needle-engine.extras.js +13 -13
- package/lib/engine/webcomponents/needle-engine.js +821 -821
- package/lib/engine/webcomponents/needle-engine.loading.d.ts +44 -44
- package/lib/engine/webcomponents/needle-engine.loading.js +341 -341
- package/lib/engine/xr/NeedleXRController.d.ts +313 -313
- package/lib/engine/xr/NeedleXRController.js +1007 -1007
- package/lib/engine/xr/NeedleXRSession.d.ts +340 -340
- package/lib/engine/xr/NeedleXRSession.js +1463 -1463
- package/lib/engine/xr/NeedleXRSync.d.ts +22 -22
- package/lib/engine/xr/NeedleXRSync.js +188 -188
- package/lib/engine/xr/SceneTransition.d.ts +18 -18
- package/lib/engine/xr/SceneTransition.js +69 -69
- package/lib/engine/xr/TempXRContext.d.ts +34 -34
- package/lib/engine/xr/TempXRContext.js +187 -187
- package/lib/engine/xr/XRRig.d.ts +7 -7
- package/lib/engine/xr/XRRig.js +1 -1
- package/lib/engine/xr/api.d.ts +6 -6
- package/lib/engine/xr/api.js +6 -6
- package/lib/engine/xr/events.d.ts +66 -66
- package/lib/engine/xr/events.js +93 -93
- package/lib/engine/xr/internal.d.ts +12 -12
- package/lib/engine/xr/internal.js +25 -25
- package/lib/engine/xr/usdz.d.ts +12 -12
- package/lib/engine/xr/usdz.js +29 -29
- package/lib/engine/xr/utils.d.ts +11 -11
- package/lib/engine/xr/utils.js +34 -34
- package/lib/engine-components/AlignmentConstraint.d.ts +10 -10
- package/lib/engine-components/AlignmentConstraint.js +39 -39
- package/lib/engine-components/Animation.d.ts +156 -156
- package/lib/engine-components/Animation.js +508 -508
- package/lib/engine-components/AnimationCurve.d.ts +40 -40
- package/lib/engine-components/AnimationCurve.js +159 -159
- package/lib/engine-components/AnimationUtils.d.ts +8 -8
- package/lib/engine-components/AnimationUtils.js +27 -27
- package/lib/engine-components/AnimationUtilsAutoplay.d.ts +1 -1
- package/lib/engine-components/AnimationUtilsAutoplay.js +39 -39
- package/lib/engine-components/Animator.d.ts +217 -217
- package/lib/engine-components/Animator.js +354 -354
- package/lib/engine-components/AnimatorController.d.ts +227 -227
- package/lib/engine-components/AnimatorController.js +1152 -1152
- package/lib/engine-components/AudioListener.d.ts +33 -33
- package/lib/engine-components/AudioListener.js +86 -86
- package/lib/engine-components/AudioSource.d.ts +217 -217
- package/lib/engine-components/AudioSource.js +635 -635
- package/lib/engine-components/AvatarLoader.d.ts +80 -80
- package/lib/engine-components/AvatarLoader.js +231 -231
- package/lib/engine-components/AxesHelper.d.ts +32 -32
- package/lib/engine-components/AxesHelper.js +67 -67
- package/lib/engine-components/BasicIKConstraint.d.ts +9 -9
- package/lib/engine-components/BasicIKConstraint.js +43 -43
- package/lib/engine-components/BoxCollider.d.ts +2 -2
- package/lib/engine-components/BoxCollider.js +2 -2
- package/lib/engine-components/BoxHelperComponent.d.ts +47 -47
- package/lib/engine-components/BoxHelperComponent.js +102 -102
- package/lib/engine-components/Camera.d.ts +231 -231
- package/lib/engine-components/Camera.js +700 -700
- package/lib/engine-components/CameraUtils.d.ts +1 -1
- package/lib/engine-components/CameraUtils.js +121 -121
- 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 +52 -52
- package/lib/engine-components/postprocessing/Effects/BloomEffect.d.ts +46 -46
- package/lib/engine-components/postprocessing/Effects/BloomEffect.js +113 -113
- package/lib/engine-components/postprocessing/Effects/ChromaticAberration.d.ts +11 -11
- package/lib/engine-components/postprocessing/Effects/ChromaticAberration.js +39 -39
- package/lib/engine-components/postprocessing/Effects/ColorAdjustments.d.ts +23 -23
- package/lib/engine-components/postprocessing/Effects/ColorAdjustments.js +111 -111
- package/lib/engine-components/postprocessing/Effects/DepthOfField.d.ts +25 -25
- package/lib/engine-components/postprocessing/Effects/DepthOfField.js +104 -104
- package/lib/engine-components/postprocessing/Effects/EffectWrapper.d.ts +12 -12
- package/lib/engine-components/postprocessing/Effects/EffectWrapper.js +18 -18
- package/lib/engine-components/postprocessing/Effects/Pixelation.d.ts +11 -11
- package/lib/engine-components/postprocessing/Effects/Pixelation.js +32 -32
- package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusion.d.ts +18 -18
- package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusion.js +91 -91
- package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.d.ts +70 -70
- package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.js +176 -176
- package/lib/engine-components/postprocessing/Effects/Sharpening.d.ts +18 -18
- package/lib/engine-components/postprocessing/Effects/Sharpening.js +127 -127
- package/lib/engine-components/postprocessing/Effects/TiltShiftEffect.d.ts +17 -17
- package/lib/engine-components/postprocessing/Effects/TiltShiftEffect.js +70 -70
- package/lib/engine-components/postprocessing/Effects/Tonemapping.d.ts +19 -19
- package/lib/engine-components/postprocessing/Effects/Tonemapping.js +94 -94
- package/lib/engine-components/postprocessing/Effects/Tonemapping.utils.d.ts +13 -13
- package/lib/engine-components/postprocessing/Effects/Tonemapping.utils.js +51 -51
- package/lib/engine-components/postprocessing/Effects/Vignette.d.ts +15 -15
- package/lib/engine-components/postprocessing/Effects/Vignette.js +60 -60
- package/lib/engine-components/postprocessing/PostProcessingEffect.d.ts +90 -90
- package/lib/engine-components/postprocessing/PostProcessingEffect.js +168 -168
- package/lib/engine-components/postprocessing/PostProcessingHandler.d.ts +42 -42
- package/lib/engine-components/postprocessing/PostProcessingHandler.js +480 -480
- 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 +2 -2
- 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/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 +120 -120
- package/plugins/types/vite.d.ts +13 -13
- package/plugins/types/webmanifest.d.ts +32 -32
- package/plugins/vite/alias.js +174 -174
- 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 +143 -143
- package/plugins/vite/license.js +56 -56
- package/plugins/vite/local-files.js +440 -440
- 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 +31 -31
- 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 +680 -680
- 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 +1823 -1823
- 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 +117 -117
- 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 +168 -168
- 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 +925 -925
- package/src/engine/engine_time.ts +94 -94
- package/src/engine/engine_time_utils.ts +237 -237
- package/src/engine/engine_tonemapping.ts +208 -208
- package/src/engine/engine_types.ts +730 -730
- package/src/engine/engine_typestore.ts +63 -63
- package/src/engine/engine_util_decorator.ts +136 -136
- package/src/engine/engine_utils.ts +1115 -1115
- package/src/engine/engine_utils_format.ts +273 -273
- package/src/engine/engine_utils_screenshot.ts +708 -708
- package/src/engine/engine_utils_screenshot.xr.ts +103 -103
- package/src/engine/export/gltf/Writers.ts +34 -34
- package/src/engine/export/gltf/index.ts +158 -158
- package/src/engine/export/index.ts +2 -2
- package/src/engine/export/state.ts +19 -19
- package/src/engine/export/utils.ts +9 -9
- package/src/engine/extensions/EXT_texture_exr.ts +50 -50
- package/src/engine/extensions/NEEDLE_animator_controller_model.ts +195 -195
- package/src/engine/extensions/NEEDLE_components.ts +268 -268
- package/src/engine/extensions/NEEDLE_gameobject_data.ts +81 -81
- package/src/engine/extensions/NEEDLE_lighting_settings.ts +185 -185
- package/src/engine/extensions/NEEDLE_lightmaps.ts +119 -119
- package/src/engine/extensions/NEEDLE_persistent_assets.ts +76 -76
- package/src/engine/extensions/NEEDLE_render_objects.ts +209 -209
- package/src/engine/extensions/NEEDLE_techniques_webgl.ts +640 -640
- package/src/engine/extensions/extension_resolver.ts +4 -4
- package/src/engine/extensions/extension_utils.ts +166 -166
- package/src/engine/extensions/extensions.ts +140 -140
- package/src/engine/extensions/index.ts +5 -5
- package/src/engine/extensions/usage_tracker.ts +100 -100
- package/src/engine/js-extensions/Camera.ts +37 -37
- package/src/engine/js-extensions/ExtensionUtils.ts +85 -85
- package/src/engine/js-extensions/Layers.ts +23 -23
- package/src/engine/js-extensions/Object3D.ts +296 -296
- package/src/engine/js-extensions/RGBAColor.ts +126 -126
- package/src/engine/js-extensions/Vector.ts +18 -18
- package/src/engine/js-extensions/index.ts +4 -4
- package/src/engine/physics/workers/mesh-bvh/GenerateMeshBVHWorker.js +125 -125
- package/src/engine/shaders/shaderData.ts +67 -67
- package/src/engine/tests/test_utils.ts +63 -63
- package/src/engine/webcomponents/WebXRButtons.ts +260 -260
- package/src/engine/webcomponents/api.ts +6 -6
- package/src/engine/webcomponents/buttons.ts +292 -292
- package/src/engine/webcomponents/fonts.ts +41 -41
- package/src/engine/webcomponents/icons.ts +57 -57
- package/src/engine/webcomponents/index.ts +1 -1
- package/src/engine/webcomponents/logo-element.ts +78 -78
- package/src/engine/webcomponents/needle menu/needle-menu-spatial.ts +573 -573
- package/src/engine/webcomponents/needle menu/needle-menu.ts +1118 -1118
- package/src/engine/webcomponents/needle-button.ts +181 -181
- package/src/engine/webcomponents/needle-engine.ar-overlay.ts +186 -186
- package/src/engine/webcomponents/needle-engine.attributes.ts +82 -82
- package/src/engine/webcomponents/needle-engine.extras.ts +16 -16
- package/src/engine/webcomponents/needle-engine.loading.ts +373 -373
- package/src/engine/webcomponents/needle-engine.ts +860 -860
- package/src/engine/xr/NeedleXRController.ts +1125 -1125
- package/src/engine/xr/NeedleXRSession.ts +1624 -1624
- package/src/engine/xr/NeedleXRSync.ts +220 -220
- package/src/engine/xr/SceneTransition.ts +78 -78
- package/src/engine/xr/TempXRContext.ts +216 -216
- package/src/engine/xr/XRRig.ts +9 -9
- package/src/engine/xr/api.ts +5 -5
- package/src/engine/xr/events.ts +102 -102
- package/src/engine/xr/internal.ts +34 -34
- package/src/engine/xr/usdz.ts +30 -30
- package/src/engine/xr/utils.ts +39 -39
- package/src/engine-components/AlignmentConstraint.ts +36 -36
- package/src/engine-components/Animation.ts +557 -557
- package/src/engine-components/AnimationCurve.ts +150 -150
- package/src/engine-components/AnimationUtils.ts +28 -28
- package/src/engine-components/AnimationUtilsAutoplay.ts +43 -43
- package/src/engine-components/Animator.ts +397 -397
- package/src/engine-components/AnimatorController.ts +1293 -1293
- package/src/engine-components/AudioListener.ts +92 -92
- package/src/engine-components/AudioSource.ts +644 -644
- package/src/engine-components/AvatarLoader.ts +263 -263
- package/src/engine-components/AxesHelper.ts +59 -59
- package/src/engine-components/BasicIKConstraint.ts +54 -54
- package/src/engine-components/BoxCollider.ts +1 -1
- package/src/engine-components/BoxHelperComponent.ts +114 -114
- package/src/engine-components/Camera.ts +719 -719
- package/src/engine-components/CameraUtils.ts +136 -136
- 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 +57 -57
- 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 +560 -560
- package/src/engine-components/postprocessing/Volume.ts +426 -426
- package/src/engine-components/postprocessing/VolumeParameter.ts +158 -158
- package/src/engine-components/postprocessing/VolumeProfile.ts +61 -61
- package/src/engine-components/postprocessing/index.ts +5 -5
- package/src/engine-components/postprocessing/utils.ts +154 -154
- package/src/engine-components/timeline/PlayableDirector.ts +722 -722
- package/src/engine-components/timeline/SignalAsset.ts +144 -144
- package/src/engine-components/timeline/TimelineModels.ts +92 -92
- package/src/engine-components/timeline/TimelineTracks.ts +967 -967
- package/src/engine-components/timeline/index.ts +3 -3
- package/src/engine-components/ui/BaseUIComponent.ts +203 -203
- package/src/engine-components/ui/Button.ts +307 -307
- package/src/engine-components/ui/Canvas.ts +419 -419
- package/src/engine-components/ui/CanvasGroup.ts +54 -54
- package/src/engine-components/ui/EventSystem.ts +854 -854
- package/src/engine-components/ui/Graphic.ts +275 -275
- package/src/engine-components/ui/Image.ts +112 -112
- package/src/engine-components/ui/InputField.ts +321 -321
- package/src/engine-components/ui/Interfaces.ts +57 -57
- package/src/engine-components/ui/Layout.ts +334 -334
- package/src/engine-components/ui/Outline.ts +13 -13
- package/src/engine-components/ui/PointerEvents.ts +206 -206
- package/src/engine-components/ui/RaycastUtils.ts +69 -69
- package/src/engine-components/ui/Raycaster.ts +102 -102
- package/src/engine-components/ui/RectTransform.ts +375 -375
- package/src/engine-components/ui/SpatialHtml.ts +79 -79
- package/src/engine-components/ui/Symbols.ts +1 -1
- package/src/engine-components/ui/Text.ts +578 -578
- package/src/engine-components/ui/Utils.ts +113 -113
- package/src/engine-components/utils/EnvironmentScene.ts +245 -245
- package/src/engine-components/utils/LookAt.ts +88 -88
- package/src/engine-components/utils/OpenURL.ts +114 -114
- package/src/engine-components/webxr/Avatar.ts +265 -265
- package/src/engine-components/webxr/TeleportTarget.ts +9 -9
- package/src/engine-components/webxr/WebARCameraBackground.ts +175 -175
- package/src/engine-components/webxr/WebARSessionRoot.ts +880 -880
- package/src/engine-components/webxr/WebXR.ts +585 -585
- package/src/engine-components/webxr/WebXRAvatar.ts +66 -66
- package/src/engine-components/webxr/WebXRImageTracking.ts +519 -519
- package/src/engine-components/webxr/WebXRPlaneTracking.ts +570 -570
- package/src/engine-components/webxr/WebXRRig.ts +77 -77
- package/src/engine-components/webxr/XRFlag.ts +147 -147
- package/src/engine-components/webxr/controllers/XRControllerFollow.ts +118 -118
- package/src/engine-components/webxr/controllers/XRControllerModel.ts +373 -373
- package/src/engine-components/webxr/controllers/XRControllerMovement.ts +550 -550
- package/src/engine-components/webxr/index.ts +2 -2
- package/src/engine-components/webxr/types.ts +3 -3
- package/src/engine-components-experimental/Presentation.ts +12 -12
- package/src/engine-components-experimental/api.ts +4 -4
- package/src/engine-components-experimental/networking/PlayerSync.ts +401 -401
- package/src/engine-schemes/COMPILE_SCHEMES.bat +3 -3
- package/src/engine-schemes/COMPILE_TS.bat +11 -11
- package/src/engine-schemes/README.md +1 -1
- package/src/engine-schemes/api.ts +12 -12
- package/src/engine-schemes/schemes.ts +28 -28
- package/src/engine-schemes/synced-camera-model.ts +92 -92
- package/src/engine-schemes/synced-transform-model.ts +90 -90
- package/src/engine-schemes/syncedCamera.fbs +10 -10
- package/src/engine-schemes/transform.ts +50 -50
- package/src/engine-schemes/transforms.fbs +25 -25
- package/src/engine-schemes/vec.fbs +19 -19
- package/src/engine-schemes/vec2.ts +33 -33
- package/src/engine-schemes/vec3.ts +38 -38
- package/src/engine-schemes/vec4.ts +43 -43
- package/src/engine-schemes/vr-user-state-buffer.ts +145 -145
- package/src/engine-schemes/vrUserStateBuffer.fbs +17 -17
- package/src/include/draco/draco_decoder.js +34 -34
- package/src/include/ktx2/basis_transcoder.js +21 -21
- package/src/include/needle/arial-msdf.json +1471 -1471
- package/src/include/three/DragControls.js +231 -231
- package/src/include/three/EXT_mesh_gpu_instancing_exporter.js +66 -66
- package/src/needle-engine.ts +70 -70
- package/dist/generateMeshBVH.worker-Cdfpaq5W.js +0 -25
- package/src/engine-schemes/dist/api.js +0 -17
- package/src/engine-schemes/dist/api.js.meta +0 -7
- package/src/engine-schemes/dist/schemes.js +0 -25
- package/src/engine-schemes/dist/schemes.js.meta +0 -7
- package/src/engine-schemes/dist/synced-camera-model.js +0 -74
- package/src/engine-schemes/dist/synced-camera-model.js.meta +0 -7
- package/src/engine-schemes/dist/synced-transform-model.js +0 -73
- package/src/engine-schemes/dist/synced-transform-model.js.meta +0 -7
- package/src/engine-schemes/dist/transform.js +0 -46
- package/src/engine-schemes/dist/transform.js.meta +0 -7
- package/src/engine-schemes/dist/vec2.js +0 -32
- package/src/engine-schemes/dist/vec2.js.meta +0 -7
- package/src/engine-schemes/dist/vec3.js +0 -36
- package/src/engine-schemes/dist/vec3.js.meta +0 -7
- package/src/engine-schemes/dist/vec4.js +0 -40
- package/src/engine-schemes/dist/vec4.js.meta +0 -7
- package/src/engine-schemes/dist/vr-user-state-buffer.js +0 -110
- package/src/engine-schemes/dist/vr-user-state-buffer.js.meta +0 -7
|
@@ -1,708 +1,708 @@
|
|
|
1
|
-
import { Camera, Color, ColorRepresentation, FrontSide, Mesh, MirroredRepeatWrapping, PerspectiveCamera, PlaneGeometry, Scene, ShaderLib, ShaderMaterial, SRGBColorSpace, Texture, UniformsUtils, WebGLRenderer, WebGLRenderTarget } from "three";
|
|
2
|
-
|
|
3
|
-
import { GameObject } from "../engine-components/Component.js";
|
|
4
|
-
import { Renderer } from "../engine-components/Renderer.js";
|
|
5
|
-
import { WebARCameraBackground } from "../engine-components/webxr/WebARCameraBackground.js";
|
|
6
|
-
import { setAutoFitEnabled } from "./engine_camera.js";
|
|
7
|
-
import { getComponentsInChildren } from "./engine_components.js";
|
|
8
|
-
import { ContextRegistry } from "./engine_context_registry.js";
|
|
9
|
-
import { onAfterRender } from "./engine_lifecycle_api.js";
|
|
10
|
-
import { registerFrameEventCallback } from "./engine_lifecycle_functions_internal.js";
|
|
11
|
-
import { Context, FrameEvent } from "./engine_setup.js";
|
|
12
|
-
import { ICamera } from "./engine_types.js";
|
|
13
|
-
import { DeviceUtilities } from "./engine_utils.js";
|
|
14
|
-
import { updateTextureFromXRFrame } from "./engine_utils_screenshot.xr.js";
|
|
15
|
-
import { RGBAColor } from "./js-extensions/index.js";
|
|
16
|
-
import { setCustomVisibility } from "./js-extensions/Layers.js";
|
|
17
|
-
|
|
18
|
-
declare type ScreenshotImageMimeType = "image/webp" | "image/png" | "image/jpeg";
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Take a screenshot from the current scene.
|
|
22
|
-
* **NOTE**: Use {@link screenshot2} for more options.
|
|
23
|
-
*
|
|
24
|
-
* @param context The context to take the screenshot from
|
|
25
|
-
* @param width The width of the screenshot
|
|
26
|
-
* @param height The height of the screenshot
|
|
27
|
-
* @param mimeType The mime type of the image
|
|
28
|
-
* @param camera The camera to use for the screenshot
|
|
29
|
-
* @returns The data url of the screenshot. Returns null if the screenshot could not be taken.
|
|
30
|
-
* @example
|
|
31
|
-
* ```ts
|
|
32
|
-
* const dataUrl = screenshot();
|
|
33
|
-
* saveImage(dataUrl, "screenshot.png");
|
|
34
|
-
* ```
|
|
35
|
-
*/
|
|
36
|
-
export function screenshot(context?: Context, width?: number, height?: number, mimeType: ScreenshotImageMimeType = "image/webp", camera?: Camera | null): string | null {
|
|
37
|
-
return screenshot2({ context, width, height, mimeType, camera });
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Options for the {@link screenshot2} function.
|
|
43
|
-
*/
|
|
44
|
-
export declare type ScreenshotOptions = {
|
|
45
|
-
/**
|
|
46
|
-
* The context to take the screenshot from. If not provided, the current context will be used.
|
|
47
|
-
*/
|
|
48
|
-
context?: Pick<Context, "scene" | "renderer" | "mainCamera" | "renderNow" | "updateAspect" | "updateSize" | "currentFrameEvent" | "devicePixelRatio">,
|
|
49
|
-
/**
|
|
50
|
-
* The width of the screenshot - if not provided, the width of the current renderer will be used.
|
|
51
|
-
*/
|
|
52
|
-
width?: number,
|
|
53
|
-
/**
|
|
54
|
-
* The height of the screenshot - if not provided, the height of the current renderer will be used.
|
|
55
|
-
*/
|
|
56
|
-
height?: number,
|
|
57
|
-
/**
|
|
58
|
-
* The mime type of the image
|
|
59
|
-
*/
|
|
60
|
-
mimeType?: ScreenshotImageMimeType,
|
|
61
|
-
/**
|
|
62
|
-
* The camera to use for the screenshot. If not provided, the main camera of the context will be used.
|
|
63
|
-
*/
|
|
64
|
-
camera?: Camera | ICamera | null,
|
|
65
|
-
/**
|
|
66
|
-
* If true, the background will be transparent.
|
|
67
|
-
*/
|
|
68
|
-
transparent?: boolean,
|
|
69
|
-
/**
|
|
70
|
-
* If true, the image will be trimmed to the non-transparent area. Has no effect if `transparent` is false.
|
|
71
|
-
*/
|
|
72
|
-
trim?: boolean,
|
|
73
|
-
/**
|
|
74
|
-
* The background of the screenshot. If not provided, the currently set background of the renderer/scene will be used
|
|
75
|
-
*/
|
|
76
|
-
background?: Color | RGBAColor | ColorRepresentation,
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* If true onBeforeRender and onAfterRender will be invoked on all renderers in the scene.
|
|
80
|
-
* @default true
|
|
81
|
-
*/
|
|
82
|
-
render_events?: boolean,
|
|
83
|
-
};
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
export declare type ScreenshotOptionsDataUrl = ScreenshotOptions & {
|
|
87
|
-
/**
|
|
88
|
-
* If set the screenshot will be downloaded using the provided filename.
|
|
89
|
-
* NOTE: if you need more control you can manually download the returned image using {@link saveImage}
|
|
90
|
-
* @default undefined
|
|
91
|
-
*/
|
|
92
|
-
download_filename?: string,
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
export declare type ScreenshotOptionsTexture = ScreenshotOptions & {
|
|
96
|
-
type: "texture",
|
|
97
|
-
/**
|
|
98
|
-
* If set the screenshot will be saved to the provided texture.
|
|
99
|
-
* @default undefined
|
|
100
|
-
*/
|
|
101
|
-
target?: Texture,
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
export declare type ScreenshotOptionsBlob = ScreenshotOptions & {
|
|
105
|
-
type: "blob",
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
export declare type ScreenshotOptionsShare = ScreenshotOptions & {
|
|
109
|
-
type: "share",
|
|
110
|
-
filename?: string,
|
|
111
|
-
file_type?: ScreenshotImageMimeType,
|
|
112
|
-
|
|
113
|
-
title?: string,
|
|
114
|
-
text?: string,
|
|
115
|
-
url?: string,
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
declare type ScreenshotOptionsShareReturnType = {
|
|
119
|
-
blob: Blob | null,
|
|
120
|
-
shared: boolean,
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
/**
|
|
124
|
-
* Take a screenshot from the current scene and return a {@link Texture}. This can applied to a surface in 3D space.
|
|
125
|
-
* @param opts Provide `{ type: "texture" }` to get a texture instead of a data url.
|
|
126
|
-
* @returns The texture of the screenshot. Returns null if the screenshot could not be taken.
|
|
127
|
-
*/
|
|
128
|
-
export function screenshot2(opts: ScreenshotOptionsTexture): Texture | null;
|
|
129
|
-
/**
|
|
130
|
-
* Take a screenshot from the current scene.
|
|
131
|
-
* @param opts
|
|
132
|
-
* @returns The data url of the screenshot. Returns null if the screenshot could not be taken.
|
|
133
|
-
* ```ts
|
|
134
|
-
* const res = screenshot2({
|
|
135
|
-
* width: 1024,
|
|
136
|
-
* height: 1024,
|
|
137
|
-
* mimeType: "image/webp",
|
|
138
|
-
* transparent: true,
|
|
139
|
-
* })
|
|
140
|
-
* // use saveImage to download the image
|
|
141
|
-
* saveImage(res, "screenshot.webp");
|
|
142
|
-
* ```
|
|
143
|
-
*/
|
|
144
|
-
export function screenshot2(opts: ScreenshotOptionsDataUrl): string | null;
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
* Take a screenshot asynchronously from the current scene.
|
|
148
|
-
* @returns A promise that resolves with the blob of the screenshot. Returns null if the screenshot could not be taken.
|
|
149
|
-
* @param {ScreenshotOptionsBlob} opts Set `{ type: "blob" }` to get a blob instead of a data url.
|
|
150
|
-
*/
|
|
151
|
-
export function screenshot2(opts: ScreenshotOptionsBlob): Promise<Blob | null>;
|
|
152
|
-
export function screenshot2(opts: ScreenshotOptionsShare): Promise<ScreenshotOptionsShareReturnType>;
|
|
153
|
-
export function screenshot2(opts: ScreenshotOptionsDataUrl | ScreenshotOptionsTexture | ScreenshotOptionsBlob | ScreenshotOptionsShare)
|
|
154
|
-
: Texture | string | null | Promise<Blob | null> | Promise<ScreenshotOptionsShareReturnType> {
|
|
155
|
-
|
|
156
|
-
if (!opts) opts = {};
|
|
157
|
-
|
|
158
|
-
const { transparent = false } = opts;
|
|
159
|
-
let { mimeType, context, width, height, camera } = opts;
|
|
160
|
-
|
|
161
|
-
if (!context) {
|
|
162
|
-
context = ContextRegistry.Current as Context;
|
|
163
|
-
if (!context) {
|
|
164
|
-
console.error("Can not save screenshot: No needle-engine context found or provided.");
|
|
165
|
-
return null;
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
if (!camera) {
|
|
170
|
-
camera = context.mainCamera;
|
|
171
|
-
if (!camera) {
|
|
172
|
-
console.error("No camera found");
|
|
173
|
-
return null;
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
const renderer = context.renderer;
|
|
178
|
-
const isXRScreenshot = renderer.xr.enabled && renderer.xr.isPresenting;
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
// Perform XR screenshot in onBeforeRender (after the screenshot we want to render the original camera view)
|
|
182
|
-
// If we do it in onAfterRender we will see one frame of a wrong image which is not what we want
|
|
183
|
-
if (isXRScreenshot && context.currentFrameEvent != FrameEvent.EarlyUpdate) {
|
|
184
|
-
console.warn("Screenshot: defer to access XR frame")
|
|
185
|
-
const ret = new Promise(resolve => {
|
|
186
|
-
registerFrameEventCallback(_ => {
|
|
187
|
-
// TODO: why is the return type not correct?
|
|
188
|
-
const screenshotResult = screenshot2(opts);
|
|
189
|
-
resolve(screenshotResult);
|
|
190
|
-
}, FrameEvent.EarlyUpdate, { once: true });
|
|
191
|
-
});
|
|
192
|
-
/** @ts-expect-error */
|
|
193
|
-
return ret;
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
const domElement = renderer.domElement;
|
|
198
|
-
|
|
199
|
-
const prevWidth = domElement.width;
|
|
200
|
-
const prevHeight = domElement.height;
|
|
201
|
-
|
|
202
|
-
if (!width) width = prevWidth;
|
|
203
|
-
if (!height) height = prevHeight;
|
|
204
|
-
|
|
205
|
-
const renderWidth = width;
|
|
206
|
-
const renderHeight = height;
|
|
207
|
-
|
|
208
|
-
// Apply page zoom
|
|
209
|
-
let zoomLevel = (window.devicePixelRatio || 1);
|
|
210
|
-
let contextZoomLevel = 1;
|
|
211
|
-
// Apply context zoom level
|
|
212
|
-
if (context.devicePixelRatio === 'auto' || context.devicePixelRatio === 'manual')
|
|
213
|
-
contextZoomLevel = 1;
|
|
214
|
-
else
|
|
215
|
-
contextZoomLevel = context.devicePixelRatio / window.devicePixelRatio;
|
|
216
|
-
zoomLevel *= contextZoomLevel;
|
|
217
|
-
width /= zoomLevel;
|
|
218
|
-
height /= zoomLevel;
|
|
219
|
-
|
|
220
|
-
width = Math.floor(width);
|
|
221
|
-
height = Math.floor(height);
|
|
222
|
-
|
|
223
|
-
// save XR state and reset it for screenshot
|
|
224
|
-
const xrframe = renderer.xr.isPresenting && renderer.xr.getFrame();
|
|
225
|
-
const previousXRState = renderer.xr.enabled;
|
|
226
|
-
renderer.xr.enabled = false;
|
|
227
|
-
renderer.xr.isPresenting = false;
|
|
228
|
-
|
|
229
|
-
// reset style during screenshot
|
|
230
|
-
domElement.style.width = `${width}px`;
|
|
231
|
-
domElement.style.height = `${height}px`;
|
|
232
|
-
|
|
233
|
-
const prevRenderTarget = renderer.getRenderTarget();
|
|
234
|
-
const previousClearColor = renderer.getClearColor(new Color());
|
|
235
|
-
const previousClearAlpha = renderer.getClearAlpha();
|
|
236
|
-
const previousBackground = context.scene.background;
|
|
237
|
-
const previousAspect: number | null = "aspect" in camera ? camera.aspect : null;
|
|
238
|
-
|
|
239
|
-
try {
|
|
240
|
-
// Calling onBeforeRender to update objects with reflection probes. https://linear.app/needle/issue/NE-5112
|
|
241
|
-
const callRenderEvents = opts.render_events !== false;
|
|
242
|
-
const renderers = new Array<Renderer>();
|
|
243
|
-
if (callRenderEvents) {
|
|
244
|
-
getComponentsInChildren(context.scene, Renderer, renderers);
|
|
245
|
-
renderers.forEach(r => {
|
|
246
|
-
r?.onBeforeRender();
|
|
247
|
-
if (r.isInstancingActive && r.instances) {
|
|
248
|
-
for (let i = 0; i < r.instances?.length; i++) {
|
|
249
|
-
const handle = r.instances[i];
|
|
250
|
-
setCustomVisibility(handle.object, true);
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
});
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
if (transparent) {
|
|
257
|
-
context.scene.background = null;
|
|
258
|
-
renderer.setClearColor(0x000000, 0);
|
|
259
|
-
}
|
|
260
|
-
if (opts.background) {
|
|
261
|
-
context.scene.background = null;
|
|
262
|
-
renderer.setClearColor(opts.background);
|
|
263
|
-
if (opts.background instanceof RGBAColor) {
|
|
264
|
-
renderer.setClearAlpha(opts.background.a);
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
if (transparent) {
|
|
268
|
-
renderer.setClearAlpha(0);
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
// set the desired output size
|
|
272
|
-
renderer.setSize(width, height, false);
|
|
273
|
-
|
|
274
|
-
// If a camera component was provided
|
|
275
|
-
if ("cam" in camera) {
|
|
276
|
-
camera = camera.threeCamera;
|
|
277
|
-
}
|
|
278
|
-
// update the camera aspect and matrix
|
|
279
|
-
if (camera instanceof PerspectiveCamera) {
|
|
280
|
-
camera.aspect = width / height;
|
|
281
|
-
camera.updateProjectionMatrix();
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
const textureOutput = "type" in opts && opts.type === "texture";
|
|
285
|
-
let targetTexture: WebGLRenderTarget | null = null;
|
|
286
|
-
|
|
287
|
-
if (textureOutput) {
|
|
288
|
-
targetTexture = new WebGLRenderTarget(width, height, {
|
|
289
|
-
wrapS: MirroredRepeatWrapping,
|
|
290
|
-
wrapT: MirroredRepeatWrapping,
|
|
291
|
-
format: 1023,
|
|
292
|
-
});
|
|
293
|
-
renderer.setRenderTarget(targetTexture);
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
let outputCanvas = domElement;
|
|
297
|
-
|
|
298
|
-
if (isXRScreenshot) {
|
|
299
|
-
// Special rendering path since in XR rendering doesn't go into the domElement
|
|
300
|
-
// and we also want to composite the camera-access image if available.
|
|
301
|
-
if (targetTexture) {
|
|
302
|
-
console.error('Taking XR screenshots with { type: "texture" } is currently not supported.');
|
|
303
|
-
}
|
|
304
|
-
// Note: this method must be invoked during the render loop when we get the XR frame
|
|
305
|
-
outputCanvas = InternalScreenshotUtils.compositeWithCameraImage({
|
|
306
|
-
width: renderWidth,
|
|
307
|
-
height: renderHeight,
|
|
308
|
-
scene: context.scene,
|
|
309
|
-
camera: camera,
|
|
310
|
-
renderer: renderer,
|
|
311
|
-
});
|
|
312
|
-
}
|
|
313
|
-
else {
|
|
314
|
-
// Render normally, as we can just use the domElement for rendering
|
|
315
|
-
context.renderNow(camera || null);
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
// restore
|
|
319
|
-
if (camera instanceof PerspectiveCamera && previousAspect != null) {
|
|
320
|
-
camera.aspect = previousAspect;
|
|
321
|
-
camera.updateProjectionMatrix();
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
if (callRenderEvents)
|
|
325
|
-
renderers.forEach(r => r.onAfterRender());
|
|
326
|
-
|
|
327
|
-
if (!mimeType) {
|
|
328
|
-
if ("download_filename" in opts && opts.download_filename) {
|
|
329
|
-
const ext = opts.download_filename.split(".").pop()?.toLowerCase();
|
|
330
|
-
switch (ext) {
|
|
331
|
-
case "png":
|
|
332
|
-
mimeType = "image/png";
|
|
333
|
-
break;
|
|
334
|
-
case "jpg":
|
|
335
|
-
case "jpeg":
|
|
336
|
-
mimeType = "image/jpeg";
|
|
337
|
-
break;
|
|
338
|
-
case "webp":
|
|
339
|
-
mimeType = "image/webp";
|
|
340
|
-
break;
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
if (transparent && opts.trim === true) {
|
|
346
|
-
const trimmed = trimCanvas(outputCanvas);
|
|
347
|
-
if (trimmed) outputCanvas = trimmed;
|
|
348
|
-
}
|
|
349
|
-
|
|
350
|
-
if ("type" in opts) {
|
|
351
|
-
if (opts.type === "texture") {
|
|
352
|
-
if (!targetTexture) {
|
|
353
|
-
console.error("No target texture found");
|
|
354
|
-
return null;
|
|
355
|
-
}
|
|
356
|
-
if (opts.target) {
|
|
357
|
-
opts.target.image = targetTexture?.texture.image;
|
|
358
|
-
opts.target.needsUpdate = true;
|
|
359
|
-
}
|
|
360
|
-
targetTexture.texture.offset.set(0, -1);
|
|
361
|
-
targetTexture.texture.needsUpdate = true;
|
|
362
|
-
return targetTexture.texture;
|
|
363
|
-
}
|
|
364
|
-
else if (opts.type === "blob") {
|
|
365
|
-
const promise = new Promise<Blob | null>((resolve, _) => {
|
|
366
|
-
outputCanvas.toBlob(blob => {
|
|
367
|
-
resolve(blob);
|
|
368
|
-
}, mimeType);
|
|
369
|
-
});
|
|
370
|
-
return promise;
|
|
371
|
-
}
|
|
372
|
-
else if (opts.type === "share") {
|
|
373
|
-
const promise = new Promise<ScreenshotOptionsShareReturnType>((resolve, _) => {
|
|
374
|
-
outputCanvas.toBlob(blob => {
|
|
375
|
-
if (blob && "share" in navigator) {
|
|
376
|
-
let mimetype = "file_type" in opts ? opts.file_type || mimeType : mimeType;
|
|
377
|
-
if (!mimeType) {
|
|
378
|
-
mimetype = "image/png";
|
|
379
|
-
}
|
|
380
|
-
const ext = mimetype?.split("/")[1] || "png";
|
|
381
|
-
const file = new File([blob], "filename" in opts ? opts.filename || `screenshot.${ext}` : `screenshot.${ext}`, { type: mimetype });
|
|
382
|
-
return navigator.share({
|
|
383
|
-
title: "title" in opts ? opts.title : undefined,
|
|
384
|
-
text: "text" in opts ? opts.text : undefined,
|
|
385
|
-
url: "url" in opts ? opts.url : undefined,
|
|
386
|
-
files: [file],
|
|
387
|
-
})
|
|
388
|
-
.catch(err => {
|
|
389
|
-
console.warn("User cancelled share", err.message);
|
|
390
|
-
})
|
|
391
|
-
.finally(() => {
|
|
392
|
-
resolve({ blob, shared: true });
|
|
393
|
-
});
|
|
394
|
-
}
|
|
395
|
-
return {
|
|
396
|
-
blob: blob,
|
|
397
|
-
shared: false
|
|
398
|
-
}
|
|
399
|
-
}, mimeType);
|
|
400
|
-
});
|
|
401
|
-
return promise;
|
|
402
|
-
}
|
|
403
|
-
}
|
|
404
|
-
|
|
405
|
-
const dataUrl = outputCanvas.toDataURL(mimeType);
|
|
406
|
-
|
|
407
|
-
if ("download_filename" in opts && opts.download_filename) {
|
|
408
|
-
let download_name = opts.download_filename;
|
|
409
|
-
// On mobile we don't want to see the dialogue for every screenshot
|
|
410
|
-
if (DeviceUtilities.isMobileDevice() && typeof window !== "undefined") {
|
|
411
|
-
const key = download_name + "_screenshots";
|
|
412
|
-
const parts = download_name.split(".");
|
|
413
|
-
const ext = parts.pop()?.toLowerCase();
|
|
414
|
-
let count = 0;
|
|
415
|
-
if (localStorage.getItem(key)) {
|
|
416
|
-
count = parseInt(sessionStorage.getItem(key) || "0");
|
|
417
|
-
}
|
|
418
|
-
if (count > 0) {
|
|
419
|
-
// const timestamp = new Date().toLocaleString();
|
|
420
|
-
download_name = `${parts.join()}-${count}.${ext}`;
|
|
421
|
-
}
|
|
422
|
-
count += 1;
|
|
423
|
-
sessionStorage.setItem(key, count.toString());
|
|
424
|
-
}
|
|
425
|
-
saveImage(dataUrl, download_name);
|
|
426
|
-
}
|
|
427
|
-
return dataUrl;
|
|
428
|
-
}
|
|
429
|
-
finally {
|
|
430
|
-
renderer.setRenderTarget(prevRenderTarget);
|
|
431
|
-
context.scene.background = previousBackground;
|
|
432
|
-
renderer.setSize(prevWidth, prevHeight, false);
|
|
433
|
-
renderer.setClearColor(previousClearColor, previousClearAlpha);
|
|
434
|
-
// Make sure to reset the aspect ratio. This is crucial if the main camera is not the currently active rendering camera
|
|
435
|
-
// For example if we did a screenshot from a different camera that has a different aspect ratio / fov
|
|
436
|
-
if (previousAspect != null && camera instanceof PerspectiveCamera) {
|
|
437
|
-
camera.aspect = previousAspect;
|
|
438
|
-
camera.updateProjectionMatrix();
|
|
439
|
-
}
|
|
440
|
-
renderer.xr.enabled = previousXRState;
|
|
441
|
-
renderer.xr.isPresenting = isXRScreenshot;
|
|
442
|
-
if (!isXRScreenshot)
|
|
443
|
-
context.updateSize(true);
|
|
444
|
-
}
|
|
445
|
-
|
|
446
|
-
return null;
|
|
447
|
-
}
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
// trim to transparent pixels
|
|
453
|
-
function trimCanvas(originalCanvas: HTMLCanvasElement): HTMLCanvasElement | null {
|
|
454
|
-
if (!("document" in globalThis)) return null;
|
|
455
|
-
// Copy the original canvas to a new canvas
|
|
456
|
-
const canvas = document.createElement('canvas');
|
|
457
|
-
canvas.width = originalCanvas.width;
|
|
458
|
-
canvas.height = originalCanvas.height;
|
|
459
|
-
const ctx = canvas.getContext('2d');
|
|
460
|
-
if (!ctx) return null;
|
|
461
|
-
ctx.drawImage(originalCanvas, 0, 0);
|
|
462
|
-
|
|
463
|
-
const width = canvas.width;
|
|
464
|
-
const height = canvas.height;
|
|
465
|
-
const imageData = ctx.getImageData(0, 0, width, height);
|
|
466
|
-
const data = imageData.data;
|
|
467
|
-
|
|
468
|
-
// Calculate the bounding box of non-transparent pixels
|
|
469
|
-
let top = height, left = width, bottom = 0, right = 0;
|
|
470
|
-
|
|
471
|
-
for (let y = 0; y < height; y++) {
|
|
472
|
-
for (let x = 0; x < width; x++) {
|
|
473
|
-
const index = (y * width + x) * 4;
|
|
474
|
-
const alpha = data[index + 3];
|
|
475
|
-
|
|
476
|
-
if (alpha !== 0) {
|
|
477
|
-
if (x < left) left = x;
|
|
478
|
-
if (x > right) right = x;
|
|
479
|
-
if (y < top) top = y;
|
|
480
|
-
if (y > bottom) bottom = y;
|
|
481
|
-
}
|
|
482
|
-
}
|
|
483
|
-
}
|
|
484
|
-
|
|
485
|
-
// Create new canvas with trimmed dimensions
|
|
486
|
-
const trimmedWidth = right - left + 1;
|
|
487
|
-
const trimmedHeight = bottom - top + 1;
|
|
488
|
-
const trimmedCanvas = document.createElement('canvas');
|
|
489
|
-
const trimmedCtx = trimmedCanvas.getContext('2d');
|
|
490
|
-
if (!trimmedCtx) return null;
|
|
491
|
-
trimmedCanvas.width = trimmedWidth;
|
|
492
|
-
trimmedCanvas.height = trimmedHeight;
|
|
493
|
-
|
|
494
|
-
// Draw the trimmed area onto the new canvas
|
|
495
|
-
trimmedCtx.drawImage(canvas, left, top, trimmedWidth, trimmedHeight, 0, 0, trimmedWidth, trimmedHeight);
|
|
496
|
-
|
|
497
|
-
return trimmedCanvas;
|
|
498
|
-
}
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
let saveImageElement: HTMLAnchorElement | null = null;
|
|
503
|
-
|
|
504
|
-
/** Download a image (must be a data url).
|
|
505
|
-
* @param dataUrl The data url of the image
|
|
506
|
-
* @param filename The filename of the image
|
|
507
|
-
* @example
|
|
508
|
-
* ```ts
|
|
509
|
-
* const dataUrl = screenshot();
|
|
510
|
-
* saveImage(dataUrl, "screenshot.png");
|
|
511
|
-
* ```
|
|
512
|
-
*/
|
|
513
|
-
export function saveImage(dataUrl: string | null, filename: string) {
|
|
514
|
-
if (!dataUrl) {
|
|
515
|
-
return;
|
|
516
|
-
}
|
|
517
|
-
if (!dataUrl.startsWith("data:image")) {
|
|
518
|
-
console.error("Can not save image: Data url is not an image", dataUrl);
|
|
519
|
-
return;
|
|
520
|
-
}
|
|
521
|
-
if (!saveImageElement) {
|
|
522
|
-
saveImageElement = document.createElement("a");
|
|
523
|
-
}
|
|
524
|
-
saveImageElement.href = dataUrl;
|
|
525
|
-
saveImageElement.download = filename;
|
|
526
|
-
saveImageElement.click();
|
|
527
|
-
}
|
|
528
|
-
|
|
529
|
-
export namespace InternalScreenshotUtils {
|
|
530
|
-
|
|
531
|
-
let backgroundPlane: FullscreenPlane | null = null;
|
|
532
|
-
let otherPlaneMesh: FullscreenPlane | null = null;
|
|
533
|
-
let rtTexture: WebGLRenderTarget | null = null;
|
|
534
|
-
let threeTexture: Texture | null = null;
|
|
535
|
-
let customCanvas: HTMLCanvasElement | null = null;
|
|
536
|
-
|
|
537
|
-
/**
|
|
538
|
-
* Screenshot rendering for AR
|
|
539
|
-
* @param args
|
|
540
|
-
* @returns The canvas with the screenshot
|
|
541
|
-
*/
|
|
542
|
-
export function compositeWithCameraImage(args: { scene: Scene, camera: Camera, renderer: WebGLRenderer, width: number, height: number }) {
|
|
543
|
-
|
|
544
|
-
const { renderer, width, height } = args;
|
|
545
|
-
|
|
546
|
-
const prevXREnabled = renderer.xr.enabled;
|
|
547
|
-
const prevRT = renderer.getRenderTarget();
|
|
548
|
-
const prevAutoClear = renderer.autoClear;
|
|
549
|
-
|
|
550
|
-
// Initialize the render target and canvas. Width and height should already take DPI into account
|
|
551
|
-
const expectedWidth = width;
|
|
552
|
-
const expectedHeight = height;
|
|
553
|
-
const aspect = width / height;
|
|
554
|
-
|
|
555
|
-
if (!rtTexture || rtTexture.width !== expectedWidth || rtTexture.height !== expectedHeight) {
|
|
556
|
-
rtTexture ??= new WebGLRenderTarget(expectedWidth, expectedHeight, { colorSpace: SRGBColorSpace });
|
|
557
|
-
rtTexture.width = expectedWidth;
|
|
558
|
-
rtTexture.height = expectedHeight;
|
|
559
|
-
rtTexture.samples = 4;
|
|
560
|
-
// necessary to match texture orientation from the exported meshes it seems
|
|
561
|
-
rtTexture.texture.repeat.y = -1;
|
|
562
|
-
rtTexture.texture.offset.y = 1;
|
|
563
|
-
}
|
|
564
|
-
|
|
565
|
-
if (!customCanvas || customCanvas.width !== expectedWidth || customCanvas.height !== expectedHeight) {
|
|
566
|
-
customCanvas = document.createElement('canvas');
|
|
567
|
-
customCanvas.width = expectedWidth;
|
|
568
|
-
customCanvas.height = expectedHeight;
|
|
569
|
-
|
|
570
|
-
customCanvas.style.position = "fixed";
|
|
571
|
-
customCanvas.style.top = "0px";
|
|
572
|
-
customCanvas.style.right = "0px";
|
|
573
|
-
customCanvas.style.width = "300px";
|
|
574
|
-
customCanvas.style.height = `${300 / aspect}px`;
|
|
575
|
-
customCanvas.style.zIndex = "1000";
|
|
576
|
-
customCanvas.style.pointerEvents = "none";
|
|
577
|
-
customCanvas.style.opacity = "1.0";
|
|
578
|
-
customCanvas.style.willChange = "contents";
|
|
579
|
-
}
|
|
580
|
-
|
|
581
|
-
if (!backgroundPlane) {
|
|
582
|
-
backgroundPlane = makeFullscreenPlane({
|
|
583
|
-
defines: {
|
|
584
|
-
DECODE_VIDEO_TEXTURE: true
|
|
585
|
-
},
|
|
586
|
-
});
|
|
587
|
-
}
|
|
588
|
-
|
|
589
|
-
if (!otherPlaneMesh) {
|
|
590
|
-
otherPlaneMesh = makeFullscreenPlane();
|
|
591
|
-
}
|
|
592
|
-
|
|
593
|
-
if (!threeTexture) {
|
|
594
|
-
threeTexture = new Texture();
|
|
595
|
-
}
|
|
596
|
-
|
|
597
|
-
const manager = renderer.xr;
|
|
598
|
-
manager.updateCamera(args.camera as PerspectiveCamera);
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
// adjust aspect on currentCamera
|
|
602
|
-
// doesn't seem to be necessary since updateCamera
|
|
603
|
-
// if (args.camera.type === "PerspectiveCamera") {
|
|
604
|
-
// const cam = args.camera as PerspectiveCamera;
|
|
605
|
-
// cam.aspect = aspect;
|
|
606
|
-
// cam.updateProjectionMatrix();
|
|
607
|
-
// }
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
renderer.xr.enabled = false;
|
|
611
|
-
renderer.autoClear = false;
|
|
612
|
-
renderer.clear();
|
|
613
|
-
renderer.setSize(expectedWidth, expectedHeight);
|
|
614
|
-
renderer.setRenderTarget(rtTexture);
|
|
615
|
-
|
|
616
|
-
// First we update the render texture which will hold the camera image
|
|
617
|
-
if (!updateTextureFromXRFrame(args.renderer, threeTexture)) {
|
|
618
|
-
console.error("Could not update texture from XR frame");
|
|
619
|
-
}
|
|
620
|
-
|
|
621
|
-
const camBg = GameObject.findObjectOfType(WebARCameraBackground);
|
|
622
|
-
if (camBg) {
|
|
623
|
-
// the scene uses WebARCameraBackground, so we make sure it has the latest camera-access texture
|
|
624
|
-
camBg.setTexture(threeTexture);
|
|
625
|
-
}
|
|
626
|
-
else {
|
|
627
|
-
// the scene doesn't use WebARCameraBackground, so we render the camera feed fullscreen
|
|
628
|
-
backgroundPlane.setTexture(threeTexture);
|
|
629
|
-
renderer.render(backgroundPlane, args.camera);
|
|
630
|
-
}
|
|
631
|
-
|
|
632
|
-
renderer.clearDepth();
|
|
633
|
-
renderer.setSize(expectedWidth, expectedHeight);
|
|
634
|
-
renderer.render(args.scene, args.camera);
|
|
635
|
-
|
|
636
|
-
// Blit the render texture first into our renderer on the GPU,
|
|
637
|
-
// then into a canvas so we can process it further on the CPU
|
|
638
|
-
renderer.setRenderTarget(null);
|
|
639
|
-
otherPlaneMesh.setTexture(rtTexture.texture);
|
|
640
|
-
renderer.render(otherPlaneMesh, args.camera);
|
|
641
|
-
const _context = customCanvas.getContext('2d', { alpha: false })!;
|
|
642
|
-
_context.drawImage(renderer.domElement, 0, 0, customCanvas.width, customCanvas.height);
|
|
643
|
-
|
|
644
|
-
renderer.setRenderTarget(prevRT);
|
|
645
|
-
renderer.xr.enabled = prevXREnabled;
|
|
646
|
-
renderer.autoClear = prevAutoClear;
|
|
647
|
-
|
|
648
|
-
return customCanvas;
|
|
649
|
-
}
|
|
650
|
-
|
|
651
|
-
const backgroundFragment: string = /* glsl */`
|
|
652
|
-
uniform sampler2D t2D;
|
|
653
|
-
varying vec2 vUv;
|
|
654
|
-
|
|
655
|
-
void main() {
|
|
656
|
-
|
|
657
|
-
vec4 texColor = texture2D( t2D, vUv );
|
|
658
|
-
|
|
659
|
-
#ifdef DECODE_VIDEO_TEXTURE
|
|
660
|
-
|
|
661
|
-
// inline sRGB decode (TODO: Remove this code when https://crbug.com/1256340 is solved)
|
|
662
|
-
texColor = vec4( mix( pow( texColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), texColor.rgb * 0.0773993808, vec3( lessThanEqual( texColor.rgb, vec3( 0.04045 ) ) ) ), texColor.w );
|
|
663
|
-
|
|
664
|
-
#endif
|
|
665
|
-
|
|
666
|
-
gl_FragColor = texColor;
|
|
667
|
-
#include <tonemapping_fragment>
|
|
668
|
-
#include <colorspace_fragment>
|
|
669
|
-
}
|
|
670
|
-
`;
|
|
671
|
-
|
|
672
|
-
declare type FullscreenPlane = Mesh & { setTexture: (texture: Texture) => void };
|
|
673
|
-
|
|
674
|
-
export function makeFullscreenPlane(options?: {
|
|
675
|
-
material?: ShaderMaterial,
|
|
676
|
-
defines?: { [key: string]: boolean | number },
|
|
677
|
-
}): FullscreenPlane {
|
|
678
|
-
const planeMaterial = options?.material || new ShaderMaterial({
|
|
679
|
-
name: 'BackgroundMaterial',
|
|
680
|
-
uniforms: UniformsUtils.clone(ShaderLib.background.uniforms),
|
|
681
|
-
vertexShader: ShaderLib.background.vertexShader,
|
|
682
|
-
fragmentShader: backgroundFragment,
|
|
683
|
-
defines: options?.defines,
|
|
684
|
-
side: FrontSide,
|
|
685
|
-
depthTest: false,
|
|
686
|
-
depthWrite: false,
|
|
687
|
-
fog: false
|
|
688
|
-
});
|
|
689
|
-
// add "map" material property so the renderer can evaluate it like for built-in materials
|
|
690
|
-
Object.defineProperty(planeMaterial, 'map', {
|
|
691
|
-
get: function () {
|
|
692
|
-
return this.threeTexture;
|
|
693
|
-
}
|
|
694
|
-
});
|
|
695
|
-
|
|
696
|
-
const planeMesh = new Mesh(new PlaneGeometry(2, 2), planeMaterial,) as unknown as FullscreenPlane;
|
|
697
|
-
setAutoFitEnabled(planeMesh, false);
|
|
698
|
-
planeMesh.geometry.deleteAttribute('normal');
|
|
699
|
-
// Option 1: add the planeMesh to our scene for rendering.
|
|
700
|
-
// This is useful for applying custom shader effects on the background (instead of using the system composite)
|
|
701
|
-
planeMesh.renderOrder = -1000000; // render first
|
|
702
|
-
// should be a class, for now lets just define a method for the weird way the texture needs to be set
|
|
703
|
-
planeMesh.setTexture = function (texture) {
|
|
704
|
-
planeMaterial.uniforms.t2D.value = texture;
|
|
705
|
-
}
|
|
706
|
-
return planeMesh;
|
|
707
|
-
}
|
|
708
|
-
}
|
|
1
|
+
import { Camera, Color, ColorRepresentation, FrontSide, Mesh, MirroredRepeatWrapping, PerspectiveCamera, PlaneGeometry, Scene, ShaderLib, ShaderMaterial, SRGBColorSpace, Texture, UniformsUtils, WebGLRenderer, WebGLRenderTarget } from "three";
|
|
2
|
+
|
|
3
|
+
import { GameObject } from "../engine-components/Component.js";
|
|
4
|
+
import { Renderer } from "../engine-components/Renderer.js";
|
|
5
|
+
import { WebARCameraBackground } from "../engine-components/webxr/WebARCameraBackground.js";
|
|
6
|
+
import { setAutoFitEnabled } from "./engine_camera.js";
|
|
7
|
+
import { getComponentsInChildren } from "./engine_components.js";
|
|
8
|
+
import { ContextRegistry } from "./engine_context_registry.js";
|
|
9
|
+
import { onAfterRender } from "./engine_lifecycle_api.js";
|
|
10
|
+
import { registerFrameEventCallback } from "./engine_lifecycle_functions_internal.js";
|
|
11
|
+
import { Context, FrameEvent } from "./engine_setup.js";
|
|
12
|
+
import { ICamera } from "./engine_types.js";
|
|
13
|
+
import { DeviceUtilities } from "./engine_utils.js";
|
|
14
|
+
import { updateTextureFromXRFrame } from "./engine_utils_screenshot.xr.js";
|
|
15
|
+
import { RGBAColor } from "./js-extensions/index.js";
|
|
16
|
+
import { setCustomVisibility } from "./js-extensions/Layers.js";
|
|
17
|
+
|
|
18
|
+
declare type ScreenshotImageMimeType = "image/webp" | "image/png" | "image/jpeg";
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Take a screenshot from the current scene.
|
|
22
|
+
* **NOTE**: Use {@link screenshot2} for more options.
|
|
23
|
+
*
|
|
24
|
+
* @param context The context to take the screenshot from
|
|
25
|
+
* @param width The width of the screenshot
|
|
26
|
+
* @param height The height of the screenshot
|
|
27
|
+
* @param mimeType The mime type of the image
|
|
28
|
+
* @param camera The camera to use for the screenshot
|
|
29
|
+
* @returns The data url of the screenshot. Returns null if the screenshot could not be taken.
|
|
30
|
+
* @example
|
|
31
|
+
* ```ts
|
|
32
|
+
* const dataUrl = screenshot();
|
|
33
|
+
* saveImage(dataUrl, "screenshot.png");
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export function screenshot(context?: Context, width?: number, height?: number, mimeType: ScreenshotImageMimeType = "image/webp", camera?: Camera | null): string | null {
|
|
37
|
+
return screenshot2({ context, width, height, mimeType, camera });
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Options for the {@link screenshot2} function.
|
|
43
|
+
*/
|
|
44
|
+
export declare type ScreenshotOptions = {
|
|
45
|
+
/**
|
|
46
|
+
* The context to take the screenshot from. If not provided, the current context will be used.
|
|
47
|
+
*/
|
|
48
|
+
context?: Pick<Context, "scene" | "renderer" | "mainCamera" | "renderNow" | "updateAspect" | "updateSize" | "currentFrameEvent" | "devicePixelRatio">,
|
|
49
|
+
/**
|
|
50
|
+
* The width of the screenshot - if not provided, the width of the current renderer will be used.
|
|
51
|
+
*/
|
|
52
|
+
width?: number,
|
|
53
|
+
/**
|
|
54
|
+
* The height of the screenshot - if not provided, the height of the current renderer will be used.
|
|
55
|
+
*/
|
|
56
|
+
height?: number,
|
|
57
|
+
/**
|
|
58
|
+
* The mime type of the image
|
|
59
|
+
*/
|
|
60
|
+
mimeType?: ScreenshotImageMimeType,
|
|
61
|
+
/**
|
|
62
|
+
* The camera to use for the screenshot. If not provided, the main camera of the context will be used.
|
|
63
|
+
*/
|
|
64
|
+
camera?: Camera | ICamera | null,
|
|
65
|
+
/**
|
|
66
|
+
* If true, the background will be transparent.
|
|
67
|
+
*/
|
|
68
|
+
transparent?: boolean,
|
|
69
|
+
/**
|
|
70
|
+
* If true, the image will be trimmed to the non-transparent area. Has no effect if `transparent` is false.
|
|
71
|
+
*/
|
|
72
|
+
trim?: boolean,
|
|
73
|
+
/**
|
|
74
|
+
* The background of the screenshot. If not provided, the currently set background of the renderer/scene will be used
|
|
75
|
+
*/
|
|
76
|
+
background?: Color | RGBAColor | ColorRepresentation,
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* If true onBeforeRender and onAfterRender will be invoked on all renderers in the scene.
|
|
80
|
+
* @default true
|
|
81
|
+
*/
|
|
82
|
+
render_events?: boolean,
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
export declare type ScreenshotOptionsDataUrl = ScreenshotOptions & {
|
|
87
|
+
/**
|
|
88
|
+
* If set the screenshot will be downloaded using the provided filename.
|
|
89
|
+
* NOTE: if you need more control you can manually download the returned image using {@link saveImage}
|
|
90
|
+
* @default undefined
|
|
91
|
+
*/
|
|
92
|
+
download_filename?: string,
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export declare type ScreenshotOptionsTexture = ScreenshotOptions & {
|
|
96
|
+
type: "texture",
|
|
97
|
+
/**
|
|
98
|
+
* If set the screenshot will be saved to the provided texture.
|
|
99
|
+
* @default undefined
|
|
100
|
+
*/
|
|
101
|
+
target?: Texture,
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export declare type ScreenshotOptionsBlob = ScreenshotOptions & {
|
|
105
|
+
type: "blob",
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export declare type ScreenshotOptionsShare = ScreenshotOptions & {
|
|
109
|
+
type: "share",
|
|
110
|
+
filename?: string,
|
|
111
|
+
file_type?: ScreenshotImageMimeType,
|
|
112
|
+
|
|
113
|
+
title?: string,
|
|
114
|
+
text?: string,
|
|
115
|
+
url?: string,
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
declare type ScreenshotOptionsShareReturnType = {
|
|
119
|
+
blob: Blob | null,
|
|
120
|
+
shared: boolean,
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Take a screenshot from the current scene and return a {@link Texture}. This can applied to a surface in 3D space.
|
|
125
|
+
* @param opts Provide `{ type: "texture" }` to get a texture instead of a data url.
|
|
126
|
+
* @returns The texture of the screenshot. Returns null if the screenshot could not be taken.
|
|
127
|
+
*/
|
|
128
|
+
export function screenshot2(opts: ScreenshotOptionsTexture): Texture | null;
|
|
129
|
+
/**
|
|
130
|
+
* Take a screenshot from the current scene.
|
|
131
|
+
* @param opts
|
|
132
|
+
* @returns The data url of the screenshot. Returns null if the screenshot could not be taken.
|
|
133
|
+
* ```ts
|
|
134
|
+
* const res = screenshot2({
|
|
135
|
+
* width: 1024,
|
|
136
|
+
* height: 1024,
|
|
137
|
+
* mimeType: "image/webp",
|
|
138
|
+
* transparent: true,
|
|
139
|
+
* })
|
|
140
|
+
* // use saveImage to download the image
|
|
141
|
+
* saveImage(res, "screenshot.webp");
|
|
142
|
+
* ```
|
|
143
|
+
*/
|
|
144
|
+
export function screenshot2(opts: ScreenshotOptionsDataUrl): string | null;
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Take a screenshot asynchronously from the current scene.
|
|
148
|
+
* @returns A promise that resolves with the blob of the screenshot. Returns null if the screenshot could not be taken.
|
|
149
|
+
* @param {ScreenshotOptionsBlob} opts Set `{ type: "blob" }` to get a blob instead of a data url.
|
|
150
|
+
*/
|
|
151
|
+
export function screenshot2(opts: ScreenshotOptionsBlob): Promise<Blob | null>;
|
|
152
|
+
export function screenshot2(opts: ScreenshotOptionsShare): Promise<ScreenshotOptionsShareReturnType>;
|
|
153
|
+
export function screenshot2(opts: ScreenshotOptionsDataUrl | ScreenshotOptionsTexture | ScreenshotOptionsBlob | ScreenshotOptionsShare)
|
|
154
|
+
: Texture | string | null | Promise<Blob | null> | Promise<ScreenshotOptionsShareReturnType> {
|
|
155
|
+
|
|
156
|
+
if (!opts) opts = {};
|
|
157
|
+
|
|
158
|
+
const { transparent = false } = opts;
|
|
159
|
+
let { mimeType, context, width, height, camera } = opts;
|
|
160
|
+
|
|
161
|
+
if (!context) {
|
|
162
|
+
context = ContextRegistry.Current as Context;
|
|
163
|
+
if (!context) {
|
|
164
|
+
console.error("Can not save screenshot: No needle-engine context found or provided.");
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
if (!camera) {
|
|
170
|
+
camera = context.mainCamera;
|
|
171
|
+
if (!camera) {
|
|
172
|
+
console.error("No camera found");
|
|
173
|
+
return null;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
const renderer = context.renderer;
|
|
178
|
+
const isXRScreenshot = renderer.xr.enabled && renderer.xr.isPresenting;
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
// Perform XR screenshot in onBeforeRender (after the screenshot we want to render the original camera view)
|
|
182
|
+
// If we do it in onAfterRender we will see one frame of a wrong image which is not what we want
|
|
183
|
+
if (isXRScreenshot && context.currentFrameEvent != FrameEvent.EarlyUpdate) {
|
|
184
|
+
console.warn("Screenshot: defer to access XR frame")
|
|
185
|
+
const ret = new Promise(resolve => {
|
|
186
|
+
registerFrameEventCallback(_ => {
|
|
187
|
+
// TODO: why is the return type not correct?
|
|
188
|
+
const screenshotResult = screenshot2(opts);
|
|
189
|
+
resolve(screenshotResult);
|
|
190
|
+
}, FrameEvent.EarlyUpdate, { once: true });
|
|
191
|
+
});
|
|
192
|
+
/** @ts-expect-error */
|
|
193
|
+
return ret;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
const domElement = renderer.domElement;
|
|
198
|
+
|
|
199
|
+
const prevWidth = domElement.width;
|
|
200
|
+
const prevHeight = domElement.height;
|
|
201
|
+
|
|
202
|
+
if (!width) width = prevWidth;
|
|
203
|
+
if (!height) height = prevHeight;
|
|
204
|
+
|
|
205
|
+
const renderWidth = width;
|
|
206
|
+
const renderHeight = height;
|
|
207
|
+
|
|
208
|
+
// Apply page zoom
|
|
209
|
+
let zoomLevel = (window.devicePixelRatio || 1);
|
|
210
|
+
let contextZoomLevel = 1;
|
|
211
|
+
// Apply context zoom level
|
|
212
|
+
if (context.devicePixelRatio === 'auto' || context.devicePixelRatio === 'manual')
|
|
213
|
+
contextZoomLevel = 1;
|
|
214
|
+
else
|
|
215
|
+
contextZoomLevel = context.devicePixelRatio / window.devicePixelRatio;
|
|
216
|
+
zoomLevel *= contextZoomLevel;
|
|
217
|
+
width /= zoomLevel;
|
|
218
|
+
height /= zoomLevel;
|
|
219
|
+
|
|
220
|
+
width = Math.floor(width);
|
|
221
|
+
height = Math.floor(height);
|
|
222
|
+
|
|
223
|
+
// save XR state and reset it for screenshot
|
|
224
|
+
const xrframe = renderer.xr.isPresenting && renderer.xr.getFrame();
|
|
225
|
+
const previousXRState = renderer.xr.enabled;
|
|
226
|
+
renderer.xr.enabled = false;
|
|
227
|
+
renderer.xr.isPresenting = false;
|
|
228
|
+
|
|
229
|
+
// reset style during screenshot
|
|
230
|
+
domElement.style.width = `${width}px`;
|
|
231
|
+
domElement.style.height = `${height}px`;
|
|
232
|
+
|
|
233
|
+
const prevRenderTarget = renderer.getRenderTarget();
|
|
234
|
+
const previousClearColor = renderer.getClearColor(new Color());
|
|
235
|
+
const previousClearAlpha = renderer.getClearAlpha();
|
|
236
|
+
const previousBackground = context.scene.background;
|
|
237
|
+
const previousAspect: number | null = "aspect" in camera ? camera.aspect : null;
|
|
238
|
+
|
|
239
|
+
try {
|
|
240
|
+
// Calling onBeforeRender to update objects with reflection probes. https://linear.app/needle/issue/NE-5112
|
|
241
|
+
const callRenderEvents = opts.render_events !== false;
|
|
242
|
+
const renderers = new Array<Renderer>();
|
|
243
|
+
if (callRenderEvents) {
|
|
244
|
+
getComponentsInChildren(context.scene, Renderer, renderers);
|
|
245
|
+
renderers.forEach(r => {
|
|
246
|
+
r?.onBeforeRender();
|
|
247
|
+
if (r.isInstancingActive && r.instances) {
|
|
248
|
+
for (let i = 0; i < r.instances?.length; i++) {
|
|
249
|
+
const handle = r.instances[i];
|
|
250
|
+
setCustomVisibility(handle.object, true);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
if (transparent) {
|
|
257
|
+
context.scene.background = null;
|
|
258
|
+
renderer.setClearColor(0x000000, 0);
|
|
259
|
+
}
|
|
260
|
+
if (opts.background) {
|
|
261
|
+
context.scene.background = null;
|
|
262
|
+
renderer.setClearColor(opts.background);
|
|
263
|
+
if (opts.background instanceof RGBAColor) {
|
|
264
|
+
renderer.setClearAlpha(opts.background.a);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
if (transparent) {
|
|
268
|
+
renderer.setClearAlpha(0);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// set the desired output size
|
|
272
|
+
renderer.setSize(width, height, false);
|
|
273
|
+
|
|
274
|
+
// If a camera component was provided
|
|
275
|
+
if ("cam" in camera) {
|
|
276
|
+
camera = camera.threeCamera;
|
|
277
|
+
}
|
|
278
|
+
// update the camera aspect and matrix
|
|
279
|
+
if (camera instanceof PerspectiveCamera) {
|
|
280
|
+
camera.aspect = width / height;
|
|
281
|
+
camera.updateProjectionMatrix();
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
const textureOutput = "type" in opts && opts.type === "texture";
|
|
285
|
+
let targetTexture: WebGLRenderTarget | null = null;
|
|
286
|
+
|
|
287
|
+
if (textureOutput) {
|
|
288
|
+
targetTexture = new WebGLRenderTarget(width, height, {
|
|
289
|
+
wrapS: MirroredRepeatWrapping,
|
|
290
|
+
wrapT: MirroredRepeatWrapping,
|
|
291
|
+
format: 1023,
|
|
292
|
+
});
|
|
293
|
+
renderer.setRenderTarget(targetTexture);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
let outputCanvas = domElement;
|
|
297
|
+
|
|
298
|
+
if (isXRScreenshot) {
|
|
299
|
+
// Special rendering path since in XR rendering doesn't go into the domElement
|
|
300
|
+
// and we also want to composite the camera-access image if available.
|
|
301
|
+
if (targetTexture) {
|
|
302
|
+
console.error('Taking XR screenshots with { type: "texture" } is currently not supported.');
|
|
303
|
+
}
|
|
304
|
+
// Note: this method must be invoked during the render loop when we get the XR frame
|
|
305
|
+
outputCanvas = InternalScreenshotUtils.compositeWithCameraImage({
|
|
306
|
+
width: renderWidth,
|
|
307
|
+
height: renderHeight,
|
|
308
|
+
scene: context.scene,
|
|
309
|
+
camera: camera,
|
|
310
|
+
renderer: renderer,
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
else {
|
|
314
|
+
// Render normally, as we can just use the domElement for rendering
|
|
315
|
+
context.renderNow(camera || null);
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
// restore
|
|
319
|
+
if (camera instanceof PerspectiveCamera && previousAspect != null) {
|
|
320
|
+
camera.aspect = previousAspect;
|
|
321
|
+
camera.updateProjectionMatrix();
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
if (callRenderEvents)
|
|
325
|
+
renderers.forEach(r => r.onAfterRender());
|
|
326
|
+
|
|
327
|
+
if (!mimeType) {
|
|
328
|
+
if ("download_filename" in opts && opts.download_filename) {
|
|
329
|
+
const ext = opts.download_filename.split(".").pop()?.toLowerCase();
|
|
330
|
+
switch (ext) {
|
|
331
|
+
case "png":
|
|
332
|
+
mimeType = "image/png";
|
|
333
|
+
break;
|
|
334
|
+
case "jpg":
|
|
335
|
+
case "jpeg":
|
|
336
|
+
mimeType = "image/jpeg";
|
|
337
|
+
break;
|
|
338
|
+
case "webp":
|
|
339
|
+
mimeType = "image/webp";
|
|
340
|
+
break;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
if (transparent && opts.trim === true) {
|
|
346
|
+
const trimmed = trimCanvas(outputCanvas);
|
|
347
|
+
if (trimmed) outputCanvas = trimmed;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
if ("type" in opts) {
|
|
351
|
+
if (opts.type === "texture") {
|
|
352
|
+
if (!targetTexture) {
|
|
353
|
+
console.error("No target texture found");
|
|
354
|
+
return null;
|
|
355
|
+
}
|
|
356
|
+
if (opts.target) {
|
|
357
|
+
opts.target.image = targetTexture?.texture.image;
|
|
358
|
+
opts.target.needsUpdate = true;
|
|
359
|
+
}
|
|
360
|
+
targetTexture.texture.offset.set(0, -1);
|
|
361
|
+
targetTexture.texture.needsUpdate = true;
|
|
362
|
+
return targetTexture.texture;
|
|
363
|
+
}
|
|
364
|
+
else if (opts.type === "blob") {
|
|
365
|
+
const promise = new Promise<Blob | null>((resolve, _) => {
|
|
366
|
+
outputCanvas.toBlob(blob => {
|
|
367
|
+
resolve(blob);
|
|
368
|
+
}, mimeType);
|
|
369
|
+
});
|
|
370
|
+
return promise;
|
|
371
|
+
}
|
|
372
|
+
else if (opts.type === "share") {
|
|
373
|
+
const promise = new Promise<ScreenshotOptionsShareReturnType>((resolve, _) => {
|
|
374
|
+
outputCanvas.toBlob(blob => {
|
|
375
|
+
if (blob && "share" in navigator) {
|
|
376
|
+
let mimetype = "file_type" in opts ? opts.file_type || mimeType : mimeType;
|
|
377
|
+
if (!mimeType) {
|
|
378
|
+
mimetype = "image/png";
|
|
379
|
+
}
|
|
380
|
+
const ext = mimetype?.split("/")[1] || "png";
|
|
381
|
+
const file = new File([blob], "filename" in opts ? opts.filename || `screenshot.${ext}` : `screenshot.${ext}`, { type: mimetype });
|
|
382
|
+
return navigator.share({
|
|
383
|
+
title: "title" in opts ? opts.title : undefined,
|
|
384
|
+
text: "text" in opts ? opts.text : undefined,
|
|
385
|
+
url: "url" in opts ? opts.url : undefined,
|
|
386
|
+
files: [file],
|
|
387
|
+
})
|
|
388
|
+
.catch(err => {
|
|
389
|
+
console.warn("User cancelled share", err.message);
|
|
390
|
+
})
|
|
391
|
+
.finally(() => {
|
|
392
|
+
resolve({ blob, shared: true });
|
|
393
|
+
});
|
|
394
|
+
}
|
|
395
|
+
return {
|
|
396
|
+
blob: blob,
|
|
397
|
+
shared: false
|
|
398
|
+
}
|
|
399
|
+
}, mimeType);
|
|
400
|
+
});
|
|
401
|
+
return promise;
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
const dataUrl = outputCanvas.toDataURL(mimeType);
|
|
406
|
+
|
|
407
|
+
if ("download_filename" in opts && opts.download_filename) {
|
|
408
|
+
let download_name = opts.download_filename;
|
|
409
|
+
// On mobile we don't want to see the dialogue for every screenshot
|
|
410
|
+
if (DeviceUtilities.isMobileDevice() && typeof window !== "undefined") {
|
|
411
|
+
const key = download_name + "_screenshots";
|
|
412
|
+
const parts = download_name.split(".");
|
|
413
|
+
const ext = parts.pop()?.toLowerCase();
|
|
414
|
+
let count = 0;
|
|
415
|
+
if (localStorage.getItem(key)) {
|
|
416
|
+
count = parseInt(sessionStorage.getItem(key) || "0");
|
|
417
|
+
}
|
|
418
|
+
if (count > 0) {
|
|
419
|
+
// const timestamp = new Date().toLocaleString();
|
|
420
|
+
download_name = `${parts.join()}-${count}.${ext}`;
|
|
421
|
+
}
|
|
422
|
+
count += 1;
|
|
423
|
+
sessionStorage.setItem(key, count.toString());
|
|
424
|
+
}
|
|
425
|
+
saveImage(dataUrl, download_name);
|
|
426
|
+
}
|
|
427
|
+
return dataUrl;
|
|
428
|
+
}
|
|
429
|
+
finally {
|
|
430
|
+
renderer.setRenderTarget(prevRenderTarget);
|
|
431
|
+
context.scene.background = previousBackground;
|
|
432
|
+
renderer.setSize(prevWidth, prevHeight, false);
|
|
433
|
+
renderer.setClearColor(previousClearColor, previousClearAlpha);
|
|
434
|
+
// Make sure to reset the aspect ratio. This is crucial if the main camera is not the currently active rendering camera
|
|
435
|
+
// For example if we did a screenshot from a different camera that has a different aspect ratio / fov
|
|
436
|
+
if (previousAspect != null && camera instanceof PerspectiveCamera) {
|
|
437
|
+
camera.aspect = previousAspect;
|
|
438
|
+
camera.updateProjectionMatrix();
|
|
439
|
+
}
|
|
440
|
+
renderer.xr.enabled = previousXRState;
|
|
441
|
+
renderer.xr.isPresenting = isXRScreenshot;
|
|
442
|
+
if (!isXRScreenshot)
|
|
443
|
+
context.updateSize(true);
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
return null;
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
|
|
450
|
+
|
|
451
|
+
|
|
452
|
+
// trim to transparent pixels
|
|
453
|
+
function trimCanvas(originalCanvas: HTMLCanvasElement): HTMLCanvasElement | null {
|
|
454
|
+
if (!("document" in globalThis)) return null;
|
|
455
|
+
// Copy the original canvas to a new canvas
|
|
456
|
+
const canvas = document.createElement('canvas');
|
|
457
|
+
canvas.width = originalCanvas.width;
|
|
458
|
+
canvas.height = originalCanvas.height;
|
|
459
|
+
const ctx = canvas.getContext('2d');
|
|
460
|
+
if (!ctx) return null;
|
|
461
|
+
ctx.drawImage(originalCanvas, 0, 0);
|
|
462
|
+
|
|
463
|
+
const width = canvas.width;
|
|
464
|
+
const height = canvas.height;
|
|
465
|
+
const imageData = ctx.getImageData(0, 0, width, height);
|
|
466
|
+
const data = imageData.data;
|
|
467
|
+
|
|
468
|
+
// Calculate the bounding box of non-transparent pixels
|
|
469
|
+
let top = height, left = width, bottom = 0, right = 0;
|
|
470
|
+
|
|
471
|
+
for (let y = 0; y < height; y++) {
|
|
472
|
+
for (let x = 0; x < width; x++) {
|
|
473
|
+
const index = (y * width + x) * 4;
|
|
474
|
+
const alpha = data[index + 3];
|
|
475
|
+
|
|
476
|
+
if (alpha !== 0) {
|
|
477
|
+
if (x < left) left = x;
|
|
478
|
+
if (x > right) right = x;
|
|
479
|
+
if (y < top) top = y;
|
|
480
|
+
if (y > bottom) bottom = y;
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
// Create new canvas with trimmed dimensions
|
|
486
|
+
const trimmedWidth = right - left + 1;
|
|
487
|
+
const trimmedHeight = bottom - top + 1;
|
|
488
|
+
const trimmedCanvas = document.createElement('canvas');
|
|
489
|
+
const trimmedCtx = trimmedCanvas.getContext('2d');
|
|
490
|
+
if (!trimmedCtx) return null;
|
|
491
|
+
trimmedCanvas.width = trimmedWidth;
|
|
492
|
+
trimmedCanvas.height = trimmedHeight;
|
|
493
|
+
|
|
494
|
+
// Draw the trimmed area onto the new canvas
|
|
495
|
+
trimmedCtx.drawImage(canvas, left, top, trimmedWidth, trimmedHeight, 0, 0, trimmedWidth, trimmedHeight);
|
|
496
|
+
|
|
497
|
+
return trimmedCanvas;
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
|
|
501
|
+
|
|
502
|
+
let saveImageElement: HTMLAnchorElement | null = null;
|
|
503
|
+
|
|
504
|
+
/** Download a image (must be a data url).
|
|
505
|
+
* @param dataUrl The data url of the image
|
|
506
|
+
* @param filename The filename of the image
|
|
507
|
+
* @example
|
|
508
|
+
* ```ts
|
|
509
|
+
* const dataUrl = screenshot();
|
|
510
|
+
* saveImage(dataUrl, "screenshot.png");
|
|
511
|
+
* ```
|
|
512
|
+
*/
|
|
513
|
+
export function saveImage(dataUrl: string | null, filename: string) {
|
|
514
|
+
if (!dataUrl) {
|
|
515
|
+
return;
|
|
516
|
+
}
|
|
517
|
+
if (!dataUrl.startsWith("data:image")) {
|
|
518
|
+
console.error("Can not save image: Data url is not an image", dataUrl);
|
|
519
|
+
return;
|
|
520
|
+
}
|
|
521
|
+
if (!saveImageElement) {
|
|
522
|
+
saveImageElement = document.createElement("a");
|
|
523
|
+
}
|
|
524
|
+
saveImageElement.href = dataUrl;
|
|
525
|
+
saveImageElement.download = filename;
|
|
526
|
+
saveImageElement.click();
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
export namespace InternalScreenshotUtils {
|
|
530
|
+
|
|
531
|
+
let backgroundPlane: FullscreenPlane | null = null;
|
|
532
|
+
let otherPlaneMesh: FullscreenPlane | null = null;
|
|
533
|
+
let rtTexture: WebGLRenderTarget | null = null;
|
|
534
|
+
let threeTexture: Texture | null = null;
|
|
535
|
+
let customCanvas: HTMLCanvasElement | null = null;
|
|
536
|
+
|
|
537
|
+
/**
|
|
538
|
+
* Screenshot rendering for AR
|
|
539
|
+
* @param args
|
|
540
|
+
* @returns The canvas with the screenshot
|
|
541
|
+
*/
|
|
542
|
+
export function compositeWithCameraImage(args: { scene: Scene, camera: Camera, renderer: WebGLRenderer, width: number, height: number }) {
|
|
543
|
+
|
|
544
|
+
const { renderer, width, height } = args;
|
|
545
|
+
|
|
546
|
+
const prevXREnabled = renderer.xr.enabled;
|
|
547
|
+
const prevRT = renderer.getRenderTarget();
|
|
548
|
+
const prevAutoClear = renderer.autoClear;
|
|
549
|
+
|
|
550
|
+
// Initialize the render target and canvas. Width and height should already take DPI into account
|
|
551
|
+
const expectedWidth = width;
|
|
552
|
+
const expectedHeight = height;
|
|
553
|
+
const aspect = width / height;
|
|
554
|
+
|
|
555
|
+
if (!rtTexture || rtTexture.width !== expectedWidth || rtTexture.height !== expectedHeight) {
|
|
556
|
+
rtTexture ??= new WebGLRenderTarget(expectedWidth, expectedHeight, { colorSpace: SRGBColorSpace });
|
|
557
|
+
rtTexture.width = expectedWidth;
|
|
558
|
+
rtTexture.height = expectedHeight;
|
|
559
|
+
rtTexture.samples = 4;
|
|
560
|
+
// necessary to match texture orientation from the exported meshes it seems
|
|
561
|
+
rtTexture.texture.repeat.y = -1;
|
|
562
|
+
rtTexture.texture.offset.y = 1;
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
if (!customCanvas || customCanvas.width !== expectedWidth || customCanvas.height !== expectedHeight) {
|
|
566
|
+
customCanvas = document.createElement('canvas');
|
|
567
|
+
customCanvas.width = expectedWidth;
|
|
568
|
+
customCanvas.height = expectedHeight;
|
|
569
|
+
|
|
570
|
+
customCanvas.style.position = "fixed";
|
|
571
|
+
customCanvas.style.top = "0px";
|
|
572
|
+
customCanvas.style.right = "0px";
|
|
573
|
+
customCanvas.style.width = "300px";
|
|
574
|
+
customCanvas.style.height = `${300 / aspect}px`;
|
|
575
|
+
customCanvas.style.zIndex = "1000";
|
|
576
|
+
customCanvas.style.pointerEvents = "none";
|
|
577
|
+
customCanvas.style.opacity = "1.0";
|
|
578
|
+
customCanvas.style.willChange = "contents";
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
if (!backgroundPlane) {
|
|
582
|
+
backgroundPlane = makeFullscreenPlane({
|
|
583
|
+
defines: {
|
|
584
|
+
DECODE_VIDEO_TEXTURE: true
|
|
585
|
+
},
|
|
586
|
+
});
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
if (!otherPlaneMesh) {
|
|
590
|
+
otherPlaneMesh = makeFullscreenPlane();
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
if (!threeTexture) {
|
|
594
|
+
threeTexture = new Texture();
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
const manager = renderer.xr;
|
|
598
|
+
manager.updateCamera(args.camera as PerspectiveCamera);
|
|
599
|
+
|
|
600
|
+
|
|
601
|
+
// adjust aspect on currentCamera
|
|
602
|
+
// doesn't seem to be necessary since updateCamera
|
|
603
|
+
// if (args.camera.type === "PerspectiveCamera") {
|
|
604
|
+
// const cam = args.camera as PerspectiveCamera;
|
|
605
|
+
// cam.aspect = aspect;
|
|
606
|
+
// cam.updateProjectionMatrix();
|
|
607
|
+
// }
|
|
608
|
+
|
|
609
|
+
|
|
610
|
+
renderer.xr.enabled = false;
|
|
611
|
+
renderer.autoClear = false;
|
|
612
|
+
renderer.clear();
|
|
613
|
+
renderer.setSize(expectedWidth, expectedHeight);
|
|
614
|
+
renderer.setRenderTarget(rtTexture);
|
|
615
|
+
|
|
616
|
+
// First we update the render texture which will hold the camera image
|
|
617
|
+
if (!updateTextureFromXRFrame(args.renderer, threeTexture)) {
|
|
618
|
+
console.error("Could not update texture from XR frame");
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
const camBg = GameObject.findObjectOfType(WebARCameraBackground);
|
|
622
|
+
if (camBg) {
|
|
623
|
+
// the scene uses WebARCameraBackground, so we make sure it has the latest camera-access texture
|
|
624
|
+
camBg.setTexture(threeTexture);
|
|
625
|
+
}
|
|
626
|
+
else {
|
|
627
|
+
// the scene doesn't use WebARCameraBackground, so we render the camera feed fullscreen
|
|
628
|
+
backgroundPlane.setTexture(threeTexture);
|
|
629
|
+
renderer.render(backgroundPlane, args.camera);
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
renderer.clearDepth();
|
|
633
|
+
renderer.setSize(expectedWidth, expectedHeight);
|
|
634
|
+
renderer.render(args.scene, args.camera);
|
|
635
|
+
|
|
636
|
+
// Blit the render texture first into our renderer on the GPU,
|
|
637
|
+
// then into a canvas so we can process it further on the CPU
|
|
638
|
+
renderer.setRenderTarget(null);
|
|
639
|
+
otherPlaneMesh.setTexture(rtTexture.texture);
|
|
640
|
+
renderer.render(otherPlaneMesh, args.camera);
|
|
641
|
+
const _context = customCanvas.getContext('2d', { alpha: false })!;
|
|
642
|
+
_context.drawImage(renderer.domElement, 0, 0, customCanvas.width, customCanvas.height);
|
|
643
|
+
|
|
644
|
+
renderer.setRenderTarget(prevRT);
|
|
645
|
+
renderer.xr.enabled = prevXREnabled;
|
|
646
|
+
renderer.autoClear = prevAutoClear;
|
|
647
|
+
|
|
648
|
+
return customCanvas;
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
const backgroundFragment: string = /* glsl */`
|
|
652
|
+
uniform sampler2D t2D;
|
|
653
|
+
varying vec2 vUv;
|
|
654
|
+
|
|
655
|
+
void main() {
|
|
656
|
+
|
|
657
|
+
vec4 texColor = texture2D( t2D, vUv );
|
|
658
|
+
|
|
659
|
+
#ifdef DECODE_VIDEO_TEXTURE
|
|
660
|
+
|
|
661
|
+
// inline sRGB decode (TODO: Remove this code when https://crbug.com/1256340 is solved)
|
|
662
|
+
texColor = vec4( mix( pow( texColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), texColor.rgb * 0.0773993808, vec3( lessThanEqual( texColor.rgb, vec3( 0.04045 ) ) ) ), texColor.w );
|
|
663
|
+
|
|
664
|
+
#endif
|
|
665
|
+
|
|
666
|
+
gl_FragColor = texColor;
|
|
667
|
+
#include <tonemapping_fragment>
|
|
668
|
+
#include <colorspace_fragment>
|
|
669
|
+
}
|
|
670
|
+
`;
|
|
671
|
+
|
|
672
|
+
declare type FullscreenPlane = Mesh & { setTexture: (texture: Texture) => void };
|
|
673
|
+
|
|
674
|
+
export function makeFullscreenPlane(options?: {
|
|
675
|
+
material?: ShaderMaterial,
|
|
676
|
+
defines?: { [key: string]: boolean | number },
|
|
677
|
+
}): FullscreenPlane {
|
|
678
|
+
const planeMaterial = options?.material || new ShaderMaterial({
|
|
679
|
+
name: 'BackgroundMaterial',
|
|
680
|
+
uniforms: UniformsUtils.clone(ShaderLib.background.uniforms),
|
|
681
|
+
vertexShader: ShaderLib.background.vertexShader,
|
|
682
|
+
fragmentShader: backgroundFragment,
|
|
683
|
+
defines: options?.defines,
|
|
684
|
+
side: FrontSide,
|
|
685
|
+
depthTest: false,
|
|
686
|
+
depthWrite: false,
|
|
687
|
+
fog: false
|
|
688
|
+
});
|
|
689
|
+
// add "map" material property so the renderer can evaluate it like for built-in materials
|
|
690
|
+
Object.defineProperty(planeMaterial, 'map', {
|
|
691
|
+
get: function () {
|
|
692
|
+
return this.threeTexture;
|
|
693
|
+
}
|
|
694
|
+
});
|
|
695
|
+
|
|
696
|
+
const planeMesh = new Mesh(new PlaneGeometry(2, 2), planeMaterial,) as unknown as FullscreenPlane;
|
|
697
|
+
setAutoFitEnabled(planeMesh, false);
|
|
698
|
+
planeMesh.geometry.deleteAttribute('normal');
|
|
699
|
+
// Option 1: add the planeMesh to our scene for rendering.
|
|
700
|
+
// This is useful for applying custom shader effects on the background (instead of using the system composite)
|
|
701
|
+
planeMesh.renderOrder = -1000000; // render first
|
|
702
|
+
// should be a class, for now lets just define a method for the weird way the texture needs to be set
|
|
703
|
+
planeMesh.setTexture = function (texture) {
|
|
704
|
+
planeMaterial.uniforms.t2D.value = texture;
|
|
705
|
+
}
|
|
706
|
+
return planeMesh;
|
|
707
|
+
}
|
|
708
|
+
}
|