@needle-tools/engine 4.6.2-next.fb486b2 → 4.7.0-alpha
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-Cdfpaq5W.js +25 -0
- package/dist/{gltf-progressive-Bl4okF1b.min.js → gltf-progressive-Bm9eEfgu.min.js} +1 -1
- package/dist/{gltf-progressive-P8b8a0qY.umd.cjs → gltf-progressive-Dn6o99rH.umd.cjs} +1 -1
- package/dist/{gltf-progressive-DSpdn0QT.js → gltf-progressive-GjIqwSG3.js} +2 -2
- package/dist/needle-engine.bundle-BEUFTdl6.min.js +1603 -0
- package/dist/{needle-engine.bundle-CdAK5p8o.umd.cjs → needle-engine.bundle-CK8cQ3FX.umd.cjs} +211 -183
- package/dist/{needle-engine.bundle-CQzZighj.js → needle-engine.bundle-CXtflnL6.js} +8686 -8431
- package/dist/needle-engine.d.ts +129 -130
- 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-CjW23fio.umd.cjs → postprocessing-8AQTeZsr.umd.cjs} +2 -2
- package/dist/{postprocessing-xYQWCHFu.min.js → postprocessing-BDScN9yu.min.js} +2 -2
- package/dist/{postprocessing-DYLNOL3W.js → postprocessing-BkxN_08g.js} +3 -3
- package/dist/{three-DuDKwKB8.min.js → three-Boa-jOq-.min.js} +33 -33
- package/dist/{three-DrqIzZTH.js → three-Bz6X1mrw.js} +4198 -4198
- package/dist/{three-B_hneGZr.umd.cjs → three-DMrv-4ar.umd.cjs} +4 -4
- package/dist/{three-examples-X3OadjXB.umd.cjs → three-examples-C7ryg8vN.umd.cjs} +3 -3
- package/dist/{three-examples-DaDLBuy6.min.js → three-examples-DuVhxqft.min.js} +14 -14
- package/dist/{three-examples-B50TT3Iu.js → three-examples-GggCDHv0.js} +5 -5
- package/dist/{three-mesh-ui-CxuWt7m-.js → three-mesh-ui-CLNOfsWn.js} +1 -1
- package/dist/{three-mesh-ui-B3p3gyUz.min.js → three-mesh-ui-CY6Izc7C.min.js} +1 -1
- package/dist/{three-mesh-ui-CQiIQIlA.umd.cjs → three-mesh-ui-CwlN0FUC.umd.cjs} +1 -1
- package/dist/{vendor-BmYIgaS1.js → vendor-BSD1RQIh.js} +3 -3
- package/dist/{vendor-Cavtu3CP.umd.cjs → vendor-DHr4aqIZ.umd.cjs} +3 -3
- package/dist/{vendor-BlSxe9JJ.min.js → vendor-zxXa3Dmr.min.js} +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 -160
- package/lib/engine-components/export/usdz/ThreeUSDZExporter.js +1789 -1782
- package/lib/engine-components/export/usdz/ThreeUSDZExporter.js.map +1 -1
- 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 -0
- package/lib/engine-components/export/usdz/extensions/NodeMaterialConverter.js +452 -0
- package/lib/engine-components/export/usdz/extensions/NodeMaterialConverter.js.map +1 -0
- 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 -2413
- 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 -0
- 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/dist/api.js +17 -0
- package/src/engine-schemes/dist/api.js.meta +7 -0
- package/src/engine-schemes/dist/schemes.js +25 -0
- package/src/engine-schemes/dist/schemes.js.meta +7 -0
- package/src/engine-schemes/dist/synced-camera-model.js +74 -0
- package/src/engine-schemes/dist/synced-camera-model.js.meta +7 -0
- package/src/engine-schemes/dist/synced-transform-model.js +73 -0
- package/src/engine-schemes/dist/synced-transform-model.js.meta +7 -0
- package/src/engine-schemes/dist/transform.js +46 -0
- package/src/engine-schemes/dist/transform.js.meta +7 -0
- package/src/engine-schemes/dist/vec2.js +32 -0
- package/src/engine-schemes/dist/vec2.js.meta +7 -0
- package/src/engine-schemes/dist/vec3.js +36 -0
- package/src/engine-schemes/dist/vec3.js.meta +7 -0
- package/src/engine-schemes/dist/vec4.js +40 -0
- package/src/engine-schemes/dist/vec4.js.meta +7 -0
- package/src/engine-schemes/dist/vr-user-state-buffer.js +110 -0
- package/src/engine-schemes/dist/vr-user-state-buffer.js.meta +7 -0
- 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-BaNp_Xtp.js +0 -25
- package/dist/needle-engine.bundle-CJ4jhuta.min.js +0 -1575
|
@@ -0,0 +1,1603 @@
|
|
|
1
|
+
var RC=Object.defineProperty,Ov=n=>{throw TypeError(n)},TC=(n,e,t)=>e in n?RC(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t,a=(n,e,t)=>TC(n,typeof e!="symbol"?e+"":e,t),km=(n,e,t)=>e.has(n)||Ov("Cannot "+t),ge=(n,e,t)=>(km(n,e,"read from private field"),t?t.call(n):e.get(n)),Us=(n,e,t)=>e.has(n)?Ov("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(n):e.set(n,t),zs=(n,e,t,s)=>(km(n,e,"write to private field"),s?s.call(n,t):e.set(n,t),t),dd=(n,e,t)=>(km(n,e,"access private method"),t);import{Vector2 as re,Vector3 as S,Vector4 as fe,Quaternion as V,PlaneGeometry as Ns,WebGLRenderer as fr,PerspectiveCamera as we,OrthographicCamera as ud,Scene as xi,Mesh as G,Texture as je,Uniform$1 as Qi,Color as oe,ShaderMaterial as Ws,Box3 as Si,ShadowMaterial as kv,Euler as Dt,MeshStandardMaterial as bt,Box3Helper as EC,GridHelper as Mm,Object3D as E,Material as Pe,Matrix3 as Mv,Matrix4 as se,Layers as uo,Ray as po,MathUtils as Cn,AxesHelper as Ci,MeshBasicMaterial as Me,DoubleSide as Pi,BufferGeometry as Vs,Group as mo,CylinderGeometry as Rv,SphereGeometry as pd,BoxGeometry as xa,SpriteMaterial as AC,Sprite as IC,Shape as LC,ExtrudeGeometry as jC,Fog as Tv,DirectionalLight as Rm,PointLight as Tm,EdgesGeometry as DC,LineSegments as Ev,LineBasicMaterial as Av,Line as Vl,BufferAttribute as _t,Raycaster as md,Sphere as gd,ArrayCamera as BC,Plane as yr,SkinnedMesh as Pn,InterleavedBufferAttribute as Iv,Skeleton as FC,Bone as UC,Source as zC,WebGLCubeRenderTarget as NC,CubeCamera as WC,AnimationClip as go,FileLoader as Em,TextureLoader as Sa,PropertyBinding as Ca,LinearSRGBColorSpace as On,ShaderChunk as qt,UniformsLib as VC,DataTexture as Am,RGBAFormat as fd,EquirectangularReflectionMapping as kn,SRGBColorSpace as Mn,Clock as $C,NeutralToneMapping as Pa,AgXToneMapping as yd,ACESFilmicToneMapping as vd,NoToneMapping as bd,PCFSoftShadowMap$1 as HC,BasicNodeLibrary as GC,WebGLRenderTarget as $s,DepthTexture as Lv,NearestFilter as _d,LoopRepeat as qC,LoopOnce as Im,AnimationMixer as Lm,CompressedTexture as XC,FrontSide as fo,Camera as QC,Frustum as jv,AudioListener as YC,PositionalAudio as KC,AudioLoader as jm,EventDispatcher as Dm,BackSide as wd,MeshDepthMaterial as ZC,CustomBlending as JC,MaxEquation as eP,AmbientLight as tP,HemisphereLight as iP,AlwaysStencilFunc as sP,GreaterEqualStencilFunc as nP,NotEqualStencilFunc as oP,GreaterStencilFunc as rP,LessEqualStencilFunc as aP,EqualStencilFunc as lP,LessStencilFunc as cP,NeverStencilFunc as Dv,InvertStencilOp as hP,DecrementWrapStencilOp as dP,IncrementWrapStencilOp as uP,DecrementStencilOp as pP,IncrementStencilOp as mP,ReplaceStencilOp as gP,ZeroStencilOp as fP,KeepStencilOp as yP,RawShaderMaterial as Bv,GLSL3 as vP,AlwaysDepth as bP,GreaterEqualDepth as _P,GreaterDepth as wP,LessEqualDepth as xP,LessDepth as SP,NotEqualDepth as CP,EqualDepth as PP,BatchedMesh as Fv,MeshPhysicalMaterial as Bm,LinearFilter as xd,UnsignedByteType as OP,RingGeometry as kP,Line3 as MP,AdditiveBlending as Uv,BoxHelper as RP,SpotLight as TP,DirectionalLightHelper as EP,CameraHelper as AP,LOD as IP,Triangle as LP,NormalBlending as jP,ReinhardToneMapping as Fm,LinearToneMapping as Um,HalfFloatType as zm,VideoTexture as DP,CubeTexture as BP,CompressedCubeTexture as FP,EquirectangularRefractionMapping as UP,VectorKeyframeTrack as zP,QuaternionKeyframeTrack as NP,Audio as WP,ShaderLib as Sd,UniformsUtils as zv,MirroredRepeatWrapping as Nv,MeshNormalMaterial as VP,AudioContext as $P,PMREMGenerator$1 as HP}from"./three-Boa-jOq-.min.js";import{createLoaders as Nm,getRaycastMesh as Wv,LODsManager as Oa,NEEDLE_progressive as Xe,addDracoAndKTX2Loaders as GP,configureLoader as qP,setKTX2TranscoderLocation as XP,setDracoDecoderLocation as QP}from"./gltf-progressive-Bm9eEfgu.min.js";import{GroundedSkybox as ka,Font as YP,TextGeometry as KP,FontLoader as ZP,GLTFLoader as Rn,TransformControlsGizmo as Vv,EXRLoader as Cd,RGBELoader as Wm,Stats as JP,nodeFrame as eO,OrbitControls as $v,PositionalAudioHelper as tO,HorizontalBlurShader as iO,VerticalBlurShader as sO,GLTFExporter as Hv,strToU8 as Gv,zipSync as nO,XRControllerModelFactory as oO,XRHandMeshModel as rO,Line2 as aO,LineGeometry as lO,LineMaterial as cO,KTX2Loader as hO,TransformControls as dO,InteractiveGroup as uO,HTMLMesh as pO,VertexNormalsHelper as mO,OBJLoader as Vm,FBXLoader as qv,mergeVertices as gO}from"./three-examples-DuVhxqft.min.js";import{fetchProfile as fO,MotionController as yO,$70d766613f57b014$export$2e2bcd8739ae039 as Xv,ByteBuffer as vO,v5 as Qv,md5 as Yv,SIZE_PREFIX_LENGTH as Kv,Builder as $m,createNoise4D as bO,Matrix4 as Hm,BatchedParticleRenderer as _O,ParticleSystem as wO,RenderMode as Tn,ConstantColor as xO,Vector4 as SO,ConstantValue as CO,TrailParticle as Zv,WorkerBase as PO,MeshBVH as OO}from"./vendor-zxXa3Dmr.min.js";import{__webpack_exports__default as Re,__webpack_exports__Text as Jv,__webpack_exports__Block as eb,__webpack_exports__update as kO,SimpleStateBehavior as MO,__webpack_exports__Inline as Gm,__webpack_exports__FontLibrary as tb,ThreeMeshUI as ib}from"./three-mesh-ui-CY6Izc7C.min.js";import{EffectAttribute as RO}from"./postprocessing-BDScN9yu.min.js";const qm=new Map;function Xt(n=(e=>(e=globalThis.location)==null?void 0:e.hostname)()){if(qm.has(n))return qm.get(n);const e=/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})|localhost/.test(n);return qm.set(n,e),e===!0}function sb(){return window.location.hostname.includes("glitch.me")}const TO='<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 160 187.74"><defs><linearGradient id="a" x1="89.64" y1="184.81" x2="90.48" y2="21.85" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#62d399"/><stop offset=".51" stop-color="#acd842"/><stop offset=".9" stop-color="#d7db0a"/></linearGradient><linearGradient id="b" x1="69.68" y1="178.9" x2="68.08" y2="16.77" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#0ba398"/><stop offset=".5" stop-color="#4ca352"/><stop offset="1" stop-color="#76a30a"/></linearGradient><linearGradient id="c" x1="36.6" y1="152.17" x2="34.7" y2="84.19" gradientUnits="userSpaceOnUse"><stop offset=".19" stop-color="#36a382"/><stop offset=".54" stop-color="#49a459"/><stop offset="1" stop-color="#76a30b"/></linearGradient><linearGradient id="d" x1="15.82" y1="153.24" x2="18" y2="90.86" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#267880"/><stop offset=".51" stop-color="#457a5c"/><stop offset="1" stop-color="#717516"/></linearGradient><linearGradient id="e" x1="135.08" y1="135.43" x2="148.93" y2="63.47" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#b0d939"/><stop offset="1" stop-color="#eadb04"/></linearGradient><linearGradient id="f" x1="-4163.25" y1="2285.12" x2="-4160.81" y2="2215.34" gradientTransform="rotate(20 4088.49 13316.712)" gradientUnits="userSpaceOnUse"><stop offset=".17" stop-color="#74af52"/><stop offset=".48" stop-color="#99be32"/><stop offset="1" stop-color="#c0c40a"/></linearGradient><symbol id="g" viewBox="0 0 160 187.74"><path style="fill:url(#a)" d="M79.32 36.98v150.76L95 174.54l6.59-156.31-22.27 18.75z"/><path style="fill:url(#b)" d="M79.32 36.98 57.05 18.23l6.59 156.31 15.68 13.2V36.98z"/><path style="fill:url(#c)" d="m25.19 104.83 8.63 49.04 12.5-14.95-2.46-56.42-18.67 22.33z"/><path style="fill:url(#d)" d="M25.19 104.83 0 90.24l16.97 53.86 16.85 9.77-8.63-49.04z"/><path style="fill:#9c3" d="M43.86 82.5 18.69 67.98 0 90.24l25.18 14.59L43.86 82.5z"/><path style="fill:url(#e)" d="m134.82 78.69-9.97 56.5 15.58-9.04L160 64.1l-25.18 14.59z"/><path style="fill:url(#f)" d="m134.82 78.69-18.68-22.33-2.86 65 11.57 13.83 9.97-56.5z"/><path style="fill:#ffe113" d="m160 64.1-18.69-22.26-25.17 14.52 18.67 22.33L160 64.1z"/><path style="fill:#f3e600" d="M101.59 18.23 79.32 0 57.05 18.23l22.27 18.75 22.27-18.75z"/></symbol></defs><use width="160" height="187.74" xlink:href="#g"/></svg>',EO=btoa(TO),AO="data:image/svg+xml;base64,"+EO,nb=AO,IO=`<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'> <svg clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="2" version="1.1" viewBox="0 0 1014 282" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"> <g transform="matrix(1.008 0 0 1.008 -2.239 .61874)"> <path d="m665.95 132.73v44.88l-10.56-8.4c-0.8-0.64-1.2-1.44-1.2-2.4v-32.4c0-6.48-4.12-9.72-12.36-9.72-2.16 0-4.18 0.4-6.06 1.2s-3.54 1.8-4.98 3-2.56 2.5-3.36 3.9-1.2 2.7-1.2 3.9v40.92l-10.68-8.4c-0.72-0.64-1.08-1.44-1.08-2.4v-53.76l10.92 8.52c0.32 0.24 0.56 0.44 0.72 0.6s0.36 0.32 0.6 0.48c0.96-1.2 2.14-2.28 3.54-3.24s2.92-1.76 4.56-2.4 3.34-1.14 5.1-1.5 3.44-0.54 5.04-0.54c1.44 0 2.92 0.04 4.44 0.12s2.84 0.28 3.96 0.6c4.56 1.12 7.8 3.12 9.72 6s2.88 6.56 2.88 11.04z" fill-rule="nonzero"/> </g> <g transform="matrix(1.008 0 0 1.008 -2.239 .61874)"> <path d="m732.38 146.05c0 0.88 0.02 1.5 0.06 1.86s-0.02 0.98-0.18 1.86h-7.08c-2.08 0-4.44-0.02-7.08-0.06s-5.36-0.06-8.16-0.06h-22.08c0 2.88 0.56 5.36 1.68 7.44s2.6 3.8 4.44 5.16 3.94 2.36 6.3 3 4.74 0.96 7.14 0.96c3.04 0 5.9-0.76 8.58-2.28s4.94-3.52 6.78-6c0.64 0.56 1.54 1.48 2.7 2.76s2.94 3.2 5.34 5.76c-2.8 3.36-6.22 6.02-10.26 7.98s-8.42 2.94-13.14 2.94-8.92-0.64-12.84-1.92-7.32-3.24-10.2-5.88-5.12-5.98-6.72-10.02-2.4-8.82-2.4-14.34c0-4.96 0.66-9.42 1.98-13.38s3.22-7.32 5.7-10.08 5.44-4.9 8.88-6.42 7.32-2.28 11.64-2.28c5.76 0 10.52 0.88 14.28 2.64s6.72 4.16 8.88 7.2 3.66 6.54 4.5 10.5 1.26 8.18 1.26 12.66zm-29.4-22.8c-2.16 0.16-4.16 0.72-6 1.68s-3.42 2.2-4.74 3.72-2.36 3.28-3.12 5.28-1.14 4.12-1.14 6.36h33.12c0-2-0.22-4.06-0.66-6.18s-1.3-4.02-2.58-5.7-3.1-3.02-5.46-4.02-5.5-1.38-9.42-1.14z" fill-rule="nonzero"/> </g> <g transform="matrix(1.008 0 0 1.008 -2.239 .61874)"> <path d="m795.93 146.05c0 0.88 0.02 1.5 0.06 1.86s-0.02 0.98-0.18 1.86h-7.08c-2.08 0-4.44-0.02-7.08-0.06s-5.36-0.06-8.16-0.06h-22.08c0 2.88 0.56 5.36 1.68 7.44s2.6 3.8 4.44 5.16 3.94 2.36 6.3 3 4.74 0.96 7.14 0.96c3.04 0 5.9-0.76 8.58-2.28s4.94-3.52 6.78-6c0.64 0.56 1.54 1.48 2.7 2.76s2.94 3.2 5.34 5.76c-2.8 3.36-6.22 6.02-10.26 7.98s-8.42 2.94-13.14 2.94-8.92-0.64-12.84-1.92-7.32-3.24-10.2-5.88-5.12-5.98-6.72-10.02-2.4-8.82-2.4-14.34c0-4.96 0.66-9.42 1.98-13.38s3.22-7.32 5.7-10.08 5.44-4.9 8.88-6.42 7.32-2.28 11.64-2.28c5.76 0 10.52 0.88 14.28 2.64s6.72 4.16 8.88 7.2 3.66 6.54 4.5 10.5 1.26 8.18 1.26 12.66zm-29.4-22.8c-2.16 0.16-4.16 0.72-6 1.68s-3.42 2.2-4.74 3.72-2.36 3.28-3.12 5.28-1.14 4.12-1.14 6.36h33.12c0-2-0.22-4.06-0.66-6.18s-1.3-4.02-2.58-5.7-3.1-3.02-5.46-4.02-5.5-1.38-9.42-1.14z" fill-rule="nonzero"/> </g> <g transform="matrix(1.008 0 0 1.008 -2.239 .61874)"> <path d="m858.57 97.21c0.64 0.48 0.96 1.16 0.96 2.04v74.88c-0.08 1.04-0.12 2.12-0.12 3.24-1.84-1.52-3.56-2.92-5.16-4.2-1.36-1.12-2.66-2.18-3.9-3.18s-2.06-1.66-2.46-1.98c-1.76 2.48-4.26 4.44-7.5 5.88s-7.02 2.16-11.34 2.16c-3.84 0-7.4-0.7-10.68-2.1s-6.14-3.44-8.58-6.12-4.34-5.94-5.7-9.78-2.04-8.16-2.04-12.96c0-4.32 0.78-8.34 2.34-12.06s3.6-6.92 6.12-9.6 5.38-4.78 8.58-6.3 6.48-2.28 9.84-2.28c2.56 0 4.82 0.22 6.78 0.66s3.68 1.06 5.16 1.86 2.78 1.74 3.9 2.82 2.16 2.22 3.12 3.42v-35.04l10.68 8.64zm-27.96 67.92c3.6 0 6.52-0.68 8.76-2.04s3.98-3.06 5.22-5.1 2.1-4.22 2.58-6.54 0.72-4.44 0.72-6.36v-1.2c0-1.12-0.22-2.7-0.66-4.74s-1.28-4.06-2.52-6.06-3-3.7-5.28-5.1-5.22-2.02-8.82-1.86c-3.44 0-6.26 0.74-8.46 2.22s-3.96 3.26-5.28 5.34-2.24 4.2-2.76 6.36-0.78 3.92-0.78 5.28c0 1.84 0.24 3.92 0.72 6.24s1.36 4.48 2.64 6.48 3.04 3.68 5.28 5.04 5.12 2.04 8.64 2.04z" fill-rule="nonzero"/> </g> <g transform="matrix(1.008 0 0 1.008 -2.239 .61874)"> <path d="m882.81 97.09c0.64 0.48 0.96 1.12 0.96 1.92l-0.12 41.04v37.08l-10.56-8.4c-0.72-0.64-1.08-1.44-1.08-2.4v-77.88l10.8 8.64z" fill-rule="nonzero"/> </g> <g transform="matrix(1.008 0 0 1.008 -2.239 .61874)"> <path d="m950.36 146.05c0 0.88 0.02 1.5 0.06 1.86s-0.02 0.98-0.18 1.86h-7.08c-2.08 0-4.44-0.02-7.08-0.06s-5.36-0.06-8.16-0.06h-22.08c0 2.88 0.56 5.36 1.68 7.44s2.6 3.8 4.44 5.16 3.94 2.36 6.3 3 4.74 0.96 7.14 0.96c3.04 0 5.9-0.76 8.58-2.28s4.94-3.52 6.78-6c0.64 0.56 1.54 1.48 2.7 2.76s2.94 3.2 5.34 5.76c-2.8 3.36-6.22 6.02-10.26 7.98s-8.42 2.94-13.14 2.94-8.92-0.64-12.84-1.92-7.32-3.24-10.2-5.88-5.12-5.98-6.72-10.02-2.4-8.82-2.4-14.34c0-4.96 0.66-9.42 1.98-13.38s3.22-7.32 5.7-10.08 5.44-4.9 8.88-6.42 7.32-2.28 11.64-2.28c5.76 0 10.52 0.88 14.28 2.64s6.72 4.16 8.88 7.2 3.66 6.54 4.5 10.5 1.26 8.18 1.26 12.66zm-29.4-22.8c-2.16 0.16-4.16 0.72-6 1.68s-3.42 2.2-4.74 3.72-2.36 3.28-3.12 5.28-1.14 4.12-1.14 6.36h33.12c0-2-0.22-4.06-0.66-6.18s-1.3-4.02-2.58-5.7-3.1-3.02-5.46-4.02-5.5-1.38-9.42-1.14z" fill-rule="nonzero"/> </g> <g transform="matrix(1.8559 0 0 .7642 45.348 36.475)"> <g transform="translate(2.7114)"> <path d="m3.935 173.02c-0.331 0-0.497-0.402-0.497-1.207v-51.002c0-0.738 0.138-1.107 0.414-1.107h1.781c0.277 0 0.415 0.335 0.415 1.006v5.935c0 0.336 0.027 0.553 0.083 0.654 0.055 0.101 0.151-0.017 0.289-0.352 0.912-1.744 1.754-3.236 2.527-4.477 0.773-1.24 1.554-2.179 2.341-2.816s1.65-0.956 2.588-0.956c1.685 0 3.011 0.922 3.977 2.766 0.967 1.845 1.602 3.84 1.905 5.986 0.056 0.268 0.139 0.369 0.249 0.302s0.221-0.235 0.331-0.503c0.939-1.811 1.802-3.353 2.589-4.628 0.787-1.274 1.581-2.246 2.382-2.917s1.671-1.006 2.61-1.006c2.016 0 3.569 1.392 4.66 4.175 1.09 2.783 1.636 6.421 1.636 10.915v37.925c0 0.871-0.18 1.307-0.539 1.307h-1.739c-0.138 0-0.249-0.1-0.332-0.301-0.083-0.202-0.124-0.503-0.124-0.906v-36.315c0-3.555-0.338-6.321-1.015-8.3-0.676-1.978-1.76-2.967-3.251-2.967-0.884 0-1.726 0.386-2.527 1.157s-1.519 1.727-2.154 2.867-1.201 2.213-1.699 3.219c-0.248 0.469-0.421 0.905-0.517 1.308-0.097 0.402-0.145 0.972-0.145 1.71v37.221c0 0.871-0.166 1.307-0.497 1.307h-1.74c-0.166 0-0.29-0.1-0.373-0.301-0.083-0.202-0.124-0.503-0.124-0.906v-36.315c0-3.555-0.332-6.321-0.994-8.3-0.663-1.978-1.754-2.967-3.273-2.967-1.242 0-2.375 0.704-3.396 2.112-1.022 1.409-2.223 3.555-3.604 6.439v39.031c0 0.805-0.18 1.207-0.539 1.207h-1.698z" fill-rule="nonzero" stroke="#000" stroke-width=".7px"/> </g> <g transform="translate(2.7114)"> <path d="m53.642 166.28c-1.077 2.549-2.237 4.477-3.479 5.785-1.243 1.307-2.61 1.961-4.101 1.961-2.154 0-3.853-1.324-5.095-3.973-1.243-2.649-1.864-6.187-1.864-10.613 0-3.488 0.4-6.489 1.201-9.004s1.988-4.51 3.562-5.985c1.574-1.476 3.521-2.414 5.841-2.817l3.686-0.704c0.221-0.067 0.394-0.218 0.518-0.453 0.124-0.234 0.187-0.587 0.187-1.056v-2.917c0-3.89-0.504-6.975-1.512-9.255s-2.354-3.42-4.039-3.42c-1.298 0-2.472 0.72-3.521 2.162s-2.002 3.572-2.858 6.388c-0.083 0.268-0.159 0.453-0.228 0.554-0.069 0.1-0.172 0.083-0.311-0.051l-1.698-1.71c-0.083-0.134-0.138-0.285-0.166-0.453-0.027-0.167 0.014-0.452 0.125-0.855 0.856-3.353 2.009-6.052 3.459-8.098 1.449-2.045 3.224-3.068 5.322-3.068 1.74 0 3.211 0.687 4.412 2.062s2.112 3.37 2.734 5.986c0.621 2.615 0.932 5.7 0.932 9.255v35.712c0 0.536-0.035 0.888-0.104 1.056s-0.2 0.251-0.393 0.251h-1.533c-0.166 0-0.29-0.117-0.373-0.352-0.083-0.234-0.124-0.553-0.124-0.955l-0.083-5.231c-0.055-0.939-0.221-1.006-0.497-0.202zm0.456-19.314c0-1.14-0.194-1.643-0.58-1.509l-3.107 0.603c-1.436 0.202-2.686 0.638-3.749 1.308-1.063 0.671-1.953 1.543-2.671 2.616s-1.257 2.33-1.616 3.772-0.538 3.102-0.538 4.98c0 3.152 0.455 5.616 1.367 7.393 0.911 1.778 2.14 2.666 3.686 2.666 0.939 0 1.85-0.419 2.734-1.257s1.671-1.895 2.361-3.169c0.663-1.408 1.181-2.85 1.553-4.326 0.373-1.475 0.56-2.883 0.56-4.225v-8.852z" fill-rule="nonzero" stroke="#000" stroke-width=".7px"/> </g> <g transform="translate(2.7114)"> <path d="m79.034 173.02c-0.166 0-0.297-0.117-0.394-0.352-0.096-0.234-0.145-0.553-0.145-0.955v-4.628c0-0.536-0.041-0.838-0.124-0.905s-0.207 0.1-0.373 0.503c-0.276 0.67-0.69 1.593-1.242 2.766-0.553 1.174-1.271 2.23-2.154 3.169-0.884 0.939-1.961 1.408-3.231 1.408-1.74 0-3.314-0.989-4.722-2.967-1.409-1.979-2.534-4.963-3.376-8.953-0.843-3.991-1.264-8.937-1.264-14.838 0-5.701 0.415-10.68 1.243-14.939s1.988-7.595 3.479-10.009c1.492-2.415 3.204-3.622 5.137-3.622 1.436 0 2.616 0.57 3.541 1.71 0.926 1.14 1.719 2.381 2.382 3.722 0.249 0.47 0.414 0.637 0.497 0.503s0.125-0.536 0.125-1.207v-23.841c0-0.805 0.151-1.208 0.455-1.208h1.864c0.276 0 0.414 0.369 0.414 1.107v72.128c0 0.537-0.041 0.905-0.124 1.107-0.083 0.201-0.235 0.301-0.455 0.301h-1.533zm-0.621-42.049c-0.939-2.213-1.885-3.94-2.838-5.181s-2.009-1.861-3.169-1.861c-1.463 0-2.768 0.889-3.914 2.666s-2.044 4.376-2.693 7.796-0.973 7.578-0.973 12.474c0 5.097 0.338 9.272 1.015 12.524 0.676 3.253 1.567 5.651 2.672 7.193 1.104 1.543 2.305 2.314 3.603 2.314 1.188 0 2.258-0.704 3.211-2.113 0.952-1.408 1.705-3.118 2.257-5.13s0.829-3.957 0.829-5.835v-24.847z" fill-rule="nonzero" stroke="#000" stroke-width=".7px"/> </g> <g transform="translate(2.7114)"> <path d="m89.514 149.38c0 3.42 0.345 6.606 1.035 9.557 0.691 2.951 1.609 5.315 2.755 7.092s2.437 2.666 3.873 2.666c1.519 0 2.837-0.738 3.956-2.213 1.118-1.476 2.064-3.655 2.837-6.539 0.083-0.336 0.166-0.52 0.249-0.554 0.083-0.033 0.179 0.017 0.29 0.151l1.408 1.912c0.221 0.268 0.235 0.67 0.041 1.207-0.69 2.548-1.47 4.661-2.34 6.337-0.87 1.677-1.857 2.935-2.962 3.773-1.104 0.838-2.319 1.257-3.645 1.257-2.043 0-3.838-1.14-5.385-3.42-1.546-2.28-2.761-5.482-3.645-9.607-0.884-4.124-1.325-8.836-1.325-14.134 0-5.901 0.455-10.931 1.367-15.089 0.911-4.158 2.14-7.377 3.686-9.658 1.547-2.28 3.3-3.42 5.261-3.42 1.988 0 3.714 1.073 5.178 3.219 1.463 2.146 2.595 5.231 3.396 9.255s1.201 8.886 1.201 14.587c0 0.469-0.02 0.939-0.062 1.408-0.041 0.469-0.214 0.704-0.517 0.704h-16.362c-0.083 0-0.152 0.151-0.207 0.453-0.056 0.302-0.083 0.654-0.083 1.056zm13.752-6.237c0.304 0 0.497-0.1 0.58-0.302 0.083-0.201 0.124-0.57 0.124-1.106 0-3.219-0.283-6.187-0.849-8.903s-1.367-4.896-2.402-6.539c-1.036-1.643-2.272-2.464-3.708-2.464-1.629 0-2.996 0.955-4.101 2.867-1.104 1.911-1.94 4.342-2.506 7.293s-0.849 6.002-0.849 9.154h13.711z" fill-rule="nonzero" stroke="#000" stroke-width=".7px"/> </g> <g transform="translate(2.7114)"> <path d="m148.54 119.7c0.165 0 0.283 0.117 0.352 0.352s0.076 0.52 0.02 0.855l-6.254 50.902c-0.028 0.47-0.104 0.788-0.228 0.956s-0.297 0.251-0.518 0.251h-1.615c-0.442 0-0.718-0.402-0.829-1.207l-5.26-40.138c-0.111-0.604-0.201-0.905-0.27-0.905s-0.131 0.301-0.186 0.905l-5.012 40.138c-0.028 0.47-0.097 0.788-0.207 0.956-0.111 0.168-0.277 0.251-0.497 0.251h-1.74c-0.442 0-0.718-0.402-0.829-1.207l-6.503-50.801c-0.055-0.403-0.048-0.721 0.021-0.956s0.2-0.352 0.393-0.352h1.823c0.166 0 0.297 0.067 0.393 0.201 0.097 0.134 0.159 0.403 0.187 0.805l5.302 41.848c0.083 0.671 0.179 0.989 0.29 0.956 0.11-0.034 0.207-0.386 0.29-1.056l5.219-41.949c0.055-0.268 0.124-0.47 0.207-0.604s0.193-0.201 0.331-0.201h1.533c0.138 0 0.262 0.067 0.373 0.201 0.11 0.134 0.179 0.403 0.207 0.805l5.468 41.848c0.083 0.671 0.179 0.989 0.29 0.956 0.11-0.034 0.207-0.386 0.29-1.056l5.053-41.849c0.055-0.335 0.138-0.57 0.249-0.704 0.11-0.134 0.234-0.201 0.373-0.201h1.284z" fill-rule="nonzero" stroke="#000" stroke-width=".7px"/> </g> <g transform="translate(2.7114)"> <path d="m156.49 171.51c0 0.604-0.042 1.006-0.125 1.208-0.082 0.201-0.262 0.301-0.538 0.301h-1.533c-0.221 0-0.366-0.083-0.435-0.251s-0.103-0.486-0.103-0.956v-50.902c0-0.805 0.152-1.207 0.456-1.207h1.822c0.304 0 0.456 0.402 0.456 1.207v50.6zm0.165-63.979c0 1.207-0.207 1.811-0.621 1.811h-1.905c-0.221 0-0.366-0.135-0.435-0.403s-0.104-0.67-0.104-1.207v-7.847c0-1.006 0.18-1.509 0.539-1.509h1.988c0.359 0 0.538 0.47 0.538 1.409v7.746z" fill-rule="nonzero" stroke="#000" stroke-width=".7px"/> </g> <g transform="translate(2.7114)"> <path d="m168.3 124.83c-0.221 0-0.331 0.269-0.331 0.805v33.801c0 3.42 0.221 5.667 0.663 6.74 0.441 1.073 1.09 1.609 1.946 1.609h3.024c0.138 0 0.242 0.084 0.311 0.252 0.069 0.167 0.103 0.419 0.103 0.754v2.716c0 0.537-0.138 0.906-0.414 1.107-0.248 0.067-0.614 0.134-1.098 0.201-0.483 0.067-0.959 0.118-1.429 0.151-0.469 0.034-0.828 0.05-1.077 0.05-1.712 0-2.934-0.955-3.665-2.867-0.732-1.911-1.098-5.013-1.098-9.305v-35.108c0-0.604-0.124-0.906-0.373-0.906h-3.521c-0.248 0-0.373-0.268-0.373-0.804v-3.521c0-0.537 0.111-0.805 0.332-0.805h3.686c0.166 0 0.263-0.268 0.29-0.805l0.415-16.095c0-0.805 0.124-1.207 0.372-1.207h1.492c0.303 0 0.455 0.436 0.455 1.307v15.995c0 0.537 0.097 0.805 0.29 0.805h5.468c0.221 0 0.331 0.268 0.331 0.805v3.521c0 0.536-0.124 0.804-0.373 0.804h-5.426z" fill-rule="nonzero" stroke="#000" stroke-width=".7px"/> </g> <g transform="translate(2.7114)"> <path d="m179.4 173.02c-0.331 0-0.497-0.402-0.497-1.207v-72.329c0-0.738 0.138-1.107 0.414-1.107h1.782c0.276 0 0.414 0.336 0.414 1.006v27.162c0 0.335 0.034 0.536 0.103 0.603s0.159-0.033 0.27-0.302c0.994-1.81 1.898-3.319 2.713-4.526 0.814-1.208 1.629-2.113 2.444-2.717 0.814-0.603 1.691-0.905 2.63-0.905 2.182 0 3.839 1.375 4.971 4.125 1.132 2.749 1.698 6.404 1.698 10.965v37.925c0 0.871-0.166 1.307-0.497 1.307h-1.74c-0.165 0-0.29-0.1-0.373-0.301-0.082-0.202-0.124-0.503-0.124-0.906v-36.315c0-3.555-0.366-6.321-1.097-8.3-0.732-1.978-1.899-2.967-3.501-2.967-0.883 0-1.705 0.318-2.464 0.956-0.76 0.637-1.526 1.576-2.299 2.816-0.773 1.241-1.643 2.834-2.61 4.779v39.031c0 0.805-0.179 1.207-0.538 1.207h-1.699z" fill-rule="nonzero" stroke="#000" stroke-width=".7px"/> </g> </g> <g transform="matrix(.80638 0 0 .80638 452.53 65.421)" fill-rule="nonzero"> <path d="m79.32 36.98v150.76l15.68-13.2 6.59-156.31-22.27 18.75z" fill="url(#f)"/> <path d="m79.32 36.98-22.27-18.75 6.59 156.31 15.68 13.2v-150.76z" fill="url(#e)"/> <path d="m25.19 104.83 8.63 49.04 12.5-14.95-2.46-56.42-18.67 22.33z" fill="url(#d)"/> <path d="m25.19 104.83-25.19-14.59 16.97 53.86 16.85 9.77-8.63-49.04z" fill="url(#c)"/> <path d="M43.86,82.5L18.69,67.98L0,90.24L25.18,104.83L43.86,82.5Z" fill="#9c3"/> <path d="m134.82 78.69-9.97 56.5 15.58-9.04 19.57-62.05-25.18 14.59z" fill="url(#b)"/> <path d="m134.82 78.69-18.68-22.33-2.86 65 11.57 13.83 9.97-56.5z" fill="url(#a)"/> <path d="m160 64.1-18.69-22.26-25.17 14.52 18.67 22.33 25.19-14.59z" fill="#ffe113"/> <path d="M101.59,18.23L79.32,0L57.05,18.23L79.32,36.98L101.59,18.23Z" fill="#f3e600"/> </g> <defs> <linearGradient id="f" x2="1" gradientTransform="matrix(.84 -162.96 162.96 .84 89.64 184.81)" gradientUnits="userSpaceOnUse"><stop stop-color="#62d399" offset="0"/><stop stop-color="#acd842" offset=".51"/><stop stop-color="#d7db0a" offset=".9"/><stop stop-color="#d7db0a" offset="1"/></linearGradient> <linearGradient id="e" x2="1" gradientTransform="matrix(-1.6,-162.13,162.13,-1.6,69.68,178.9)" gradientUnits="userSpaceOnUse"><stop stop-color="#0ba398" offset="0"/><stop stop-color="#4ca352" offset=".5"/><stop stop-color="#76a30a" offset="1"/></linearGradient> <linearGradient id="d" x2="1" gradientTransform="matrix(-1.9,-67.98,67.98,-1.9,36.6,152.17)" gradientUnits="userSpaceOnUse"><stop stop-color="#36a382" offset="0"/><stop stop-color="#36a382" offset=".19"/><stop stop-color="#49a459" offset=".54"/><stop stop-color="#76a30b" offset="1"/></linearGradient> <linearGradient id="c" x2="1" gradientTransform="matrix(2.18,-62.38,62.38,2.18,15.82,153.24)" gradientUnits="userSpaceOnUse"><stop stop-color="#267880" offset="0"/><stop stop-color="#457a5c" offset=".51"/><stop stop-color="#717516" offset="1"/></linearGradient> <linearGradient id="b" x2="1" gradientTransform="matrix(13.85,-71.96,71.96,13.85,135.08,135.43)" gradientUnits="userSpaceOnUse"><stop stop-color="#b0d939" offset="0"/><stop stop-color="#eadb04" offset="1"/></linearGradient> <linearGradient id="a" x2="1" gradientTransform="matrix(26.159 -64.737 64.737 26.159 107.42 128.14)" gradientUnits="userSpaceOnUse"><stop stop-color="#74af52" offset="0"/><stop stop-color="#74af52" offset=".17"/><stop stop-color="#99be32" offset=".48"/><stop stop-color="#c0c40a" offset="1"/></linearGradient> </defs> </svg>`;btoa(IO);const LO='<svg viewBox="0 0 509 154" xmlns="http://www.w3.org/2000/svg" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2"><path d="M665.95 132.73v44.88l-10.56-8.4c-.8-.64-1.2-1.44-1.2-2.4v-32.4c0-6.48-4.12-9.72-12.36-9.72-2.16 0-4.18.4-6.06 1.2-1.88.8-3.54 1.8-4.98 3-1.44 1.2-2.56 2.5-3.36 3.9-.8 1.4-1.2 2.7-1.2 3.9v40.92l-10.68-8.4c-.72-.64-1.08-1.44-1.08-2.4v-53.76l10.92 8.52c.32.24.56.44.72.6.16.16.36.32.6.48.96-1.2 2.14-2.28 3.54-3.24 1.4-.96 2.92-1.76 4.56-2.4 1.64-.64 3.34-1.14 5.1-1.5 1.76-.36 3.44-.54 5.04-.54 1.44 0 2.92.04 4.44.12 1.52.08 2.84.28 3.96.6 4.56 1.12 7.8 3.12 9.72 6 1.92 2.88 2.88 6.56 2.88 11.04ZM732.38 146.05c0 .88.02 1.5.06 1.86.04.36-.02.98-.18 1.86h-7.08c-2.08 0-4.44-.02-7.08-.06-2.64-.04-5.36-.06-8.16-.06h-22.08c0 2.88.56 5.36 1.68 7.44 1.12 2.08 2.6 3.8 4.44 5.16 1.84 1.36 3.94 2.36 6.3 3 2.36.64 4.74.96 7.14.96 3.04 0 5.9-.76 8.58-2.28 2.68-1.52 4.94-3.52 6.78-6 .64.56 1.54 1.48 2.7 2.76 1.16 1.28 2.94 3.2 5.34 5.76-2.8 3.36-6.22 6.02-10.26 7.98-4.04 1.96-8.42 2.94-13.14 2.94-4.72 0-8.92-.64-12.84-1.92-3.92-1.28-7.32-3.24-10.2-5.88-2.88-2.64-5.12-5.98-6.72-10.02-1.6-4.04-2.4-8.82-2.4-14.34 0-4.96.66-9.42 1.98-13.38 1.32-3.96 3.22-7.32 5.7-10.08s5.44-4.9 8.88-6.42c3.44-1.52 7.32-2.28 11.64-2.28 5.76 0 10.52.88 14.28 2.64 3.76 1.76 6.72 4.16 8.88 7.2 2.16 3.04 3.66 6.54 4.5 10.5.84 3.96 1.26 8.18 1.26 12.66Zm-29.4-22.8c-2.16.16-4.16.72-6 1.68-1.84.96-3.42 2.2-4.74 3.72-1.32 1.52-2.36 3.28-3.12 5.28-.76 2-1.14 4.12-1.14 6.36h33.12c0-2-.22-4.06-.66-6.18-.44-2.12-1.3-4.02-2.58-5.7-1.28-1.68-3.1-3.02-5.46-4.02-2.36-1-5.5-1.38-9.42-1.14ZM795.93 146.05c0 .88.02 1.5.06 1.86.04.36-.02.98-.18 1.86h-7.08c-2.08 0-4.44-.02-7.08-.06-2.64-.04-5.36-.06-8.16-.06h-22.08c0 2.88.56 5.36 1.68 7.44 1.12 2.08 2.6 3.8 4.44 5.16 1.84 1.36 3.94 2.36 6.3 3 2.36.64 4.74.96 7.14.96 3.04 0 5.9-.76 8.58-2.28 2.68-1.52 4.94-3.52 6.78-6 .64.56 1.54 1.48 2.7 2.76 1.16 1.28 2.94 3.2 5.34 5.76-2.8 3.36-6.22 6.02-10.26 7.98-4.04 1.96-8.42 2.94-13.14 2.94-4.72 0-8.92-.64-12.84-1.92-3.92-1.28-7.32-3.24-10.2-5.88-2.88-2.64-5.12-5.98-6.72-10.02-1.6-4.04-2.4-8.82-2.4-14.34 0-4.96.66-9.42 1.98-13.38 1.32-3.96 3.22-7.32 5.7-10.08s5.44-4.9 8.88-6.42c3.44-1.52 7.32-2.28 11.64-2.28 5.76 0 10.52.88 14.28 2.64 3.76 1.76 6.72 4.16 8.88 7.2 2.16 3.04 3.66 6.54 4.5 10.5.84 3.96 1.26 8.18 1.26 12.66Zm-29.4-22.8c-2.16.16-4.16.72-6 1.68-1.84.96-3.42 2.2-4.74 3.72-1.32 1.52-2.36 3.28-3.12 5.28-.76 2-1.14 4.12-1.14 6.36h33.12c0-2-.22-4.06-.66-6.18-.44-2.12-1.3-4.02-2.58-5.7-1.28-1.68-3.1-3.02-5.46-4.02-2.36-1-5.5-1.38-9.42-1.14ZM858.57 97.21c.64.48.96 1.16.96 2.04v74.88c-.08 1.04-.12 2.12-.12 3.24-1.84-1.52-3.56-2.92-5.16-4.2-1.36-1.12-2.66-2.18-3.9-3.18-1.24-1-2.06-1.66-2.46-1.98-1.76 2.48-4.26 4.44-7.5 5.88-3.24 1.44-7.02 2.16-11.34 2.16-3.84 0-7.4-.7-10.68-2.1-3.28-1.4-6.14-3.44-8.58-6.12-2.44-2.68-4.34-5.94-5.7-9.78-1.36-3.84-2.04-8.16-2.04-12.96 0-4.32.78-8.34 2.34-12.06 1.56-3.72 3.6-6.92 6.12-9.6 2.52-2.68 5.38-4.78 8.58-6.3 3.2-1.52 6.48-2.28 9.84-2.28 2.56 0 4.82.22 6.78.66 1.96.44 3.68 1.06 5.16 1.86s2.78 1.74 3.9 2.82a35.92 35.92 0 0 1 3.12 3.42V88.57l10.68 8.64Zm-27.96 67.92c3.6 0 6.52-.68 8.76-2.04 2.24-1.36 3.98-3.06 5.22-5.1a20.5 20.5 0 0 0 2.58-6.54c.48-2.32.72-4.44.72-6.36v-1.2c0-1.12-.22-2.7-.66-4.74-.44-2.04-1.28-4.06-2.52-6.06s-3-3.7-5.28-5.1c-2.28-1.4-5.22-2.02-8.82-1.86-3.44 0-6.26.74-8.46 2.22-2.2 1.48-3.96 3.26-5.28 5.34-1.32 2.08-2.24 4.2-2.76 6.36-.52 2.16-.78 3.92-.78 5.28 0 1.84.24 3.92.72 6.24.48 2.32 1.36 4.48 2.64 6.48s3.04 3.68 5.28 5.04c2.24 1.36 5.12 2.04 8.64 2.04ZM882.81 97.09c.64.48.96 1.12.96 1.92l-.12 41.04v37.08l-10.56-8.4c-.72-.64-1.08-1.44-1.08-2.4V88.45l10.8 8.64ZM950.36 146.05c0 .88.02 1.5.06 1.86.04.36-.02.98-.18 1.86h-7.08c-2.08 0-4.44-.02-7.08-.06-2.64-.04-5.36-.06-8.16-.06h-22.08c0 2.88.56 5.36 1.68 7.44 1.12 2.08 2.6 3.8 4.44 5.16 1.84 1.36 3.94 2.36 6.3 3 2.36.64 4.74.96 7.14.96 3.04 0 5.9-.76 8.58-2.28 2.68-1.52 4.94-3.52 6.78-6 .64.56 1.54 1.48 2.7 2.76 1.16 1.28 2.94 3.2 5.34 5.76-2.8 3.36-6.22 6.02-10.26 7.98-4.04 1.96-8.42 2.94-13.14 2.94-4.72 0-8.92-.64-12.84-1.92-3.92-1.28-7.32-3.24-10.2-5.88-2.88-2.64-5.12-5.98-6.72-10.02-1.6-4.04-2.4-8.82-2.4-14.34 0-4.96.66-9.42 1.98-13.38 1.32-3.96 3.22-7.32 5.7-10.08s5.44-4.9 8.88-6.42c3.44-1.52 7.32-2.28 11.64-2.28 5.76 0 10.52.88 14.28 2.64 3.76 1.76 6.72 4.16 8.88 7.2 2.16 3.04 3.66 6.54 4.5 10.5.84 3.96 1.26 8.18 1.26 12.66Zm-29.4-22.8c-2.16.16-4.16.72-6 1.68-1.84.96-3.42 2.2-4.74 3.72-1.32 1.52-2.36 3.28-3.12 5.28-.76 2-1.14 4.12-1.14 6.36h33.12c0-2-.22-4.06-.66-6.18-.44-2.12-1.3-4.02-2.58-5.7-1.28-1.68-3.1-3.02-5.46-4.02-2.36-1-5.5-1.38-9.42-1.14Z" style="fill-rule:nonzero" transform="translate(-452.406 -63.709) scale(1.00797)"/><path d="M79.32 36.98v150.76L95 174.54l6.59-156.31-22.27 18.75Z" style="fill:url(#a);fill-rule:nonzero" transform="matrix(.80638 0 0 .80638 2.361 1.094)"/><path d="M79.32 36.98 57.05 18.23l6.59 156.31 15.68 13.2V36.98Z" style="fill:url(#b);fill-rule:nonzero" transform="matrix(.80638 0 0 .80638 2.361 1.094)"/><path d="m25.19 104.83 8.63 49.04 12.5-14.95-2.46-56.42-18.67 22.33Z" style="fill:url(#c);fill-rule:nonzero" transform="matrix(.80638 0 0 .80638 2.361 1.094)"/><path d="M25.19 104.83 0 90.24l16.97 53.86 16.85 9.77-8.63-49.04Z" style="fill:url(#d);fill-rule:nonzero" transform="matrix(.80638 0 0 .80638 2.361 1.094)"/><path d="M43.86 82.5 18.69 67.98 0 90.24l25.18 14.59L43.86 82.5Z" style="fill:#9c3;fill-rule:nonzero" transform="matrix(.80638 0 0 .80638 2.361 1.094)"/><path d="m134.82 78.69-9.97 56.5 15.58-9.04L160 64.1l-25.18 14.59Z" style="fill:url(#e);fill-rule:nonzero" transform="matrix(.80638 0 0 .80638 2.361 1.094)"/><path d="m134.82 78.69-18.68-22.33-2.86 65 11.57 13.83 9.97-56.5Z" style="fill:url(#f);fill-rule:nonzero" transform="matrix(.80638 0 0 .80638 2.361 1.094)"/><path d="m160 64.1-18.69-22.26-25.17 14.52 18.67 22.33L160 64.1Z" style="fill:#ffe113;fill-rule:nonzero" transform="matrix(.80638 0 0 .80638 2.361 1.094)"/><path d="M101.59 18.23 79.32 0 57.05 18.23l22.27 18.75 22.27-18.75Z" style="fill:#f3e600;fill-rule:nonzero" transform="matrix(.80638 0 0 .80638 2.361 1.094)"/><defs><linearGradient id="a" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(.84 -162.96 162.96 .84 89.64 184.81)"><stop offset="0" style="stop-color:#62d399;stop-opacity:1"/><stop offset=".51" style="stop-color:#acd842;stop-opacity:1"/><stop offset=".9" style="stop-color:#d7db0a;stop-opacity:1"/><stop offset="1" style="stop-color:#d7db0a;stop-opacity:1"/></linearGradient><linearGradient id="b" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="rotate(-90.565 123.412 54.953) scale(162.14)"><stop offset="0" style="stop-color:#0ba398;stop-opacity:1"/><stop offset=".5" style="stop-color:#4ca352;stop-opacity:1"/><stop offset="1" style="stop-color:#76a30a;stop-opacity:1"/></linearGradient><linearGradient id="c" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="scale(-68) rotate(88.4 .881 -1.396)"><stop offset="0" style="stop-color:#36a382;stop-opacity:1"/><stop offset=".19" style="stop-color:#36a382;stop-opacity:1"/><stop offset=".54" style="stop-color:#49a459;stop-opacity:1"/><stop offset="1" style="stop-color:#76a30b;stop-opacity:1"/></linearGradient><linearGradient id="d" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="rotate(-88 87.255 68.431) scale(62.42)"><stop offset="0" style="stop-color:#267880;stop-opacity:1"/><stop offset=".51" style="stop-color:#457a5c;stop-opacity:1"/><stop offset="1" style="stop-color:#717516;stop-opacity:1"/></linearGradient><linearGradient id="e" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="rotate(-79.1 149.53 -14.065) scale(73.28)"><stop offset="0" style="stop-color:#b0d939;stop-opacity:1"/><stop offset="1" style="stop-color:#eadb04;stop-opacity:1"/></linearGradient><linearGradient id="f" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="rotate(-67.997 148.705 -15.558) scale(69.8226)"><stop offset="0" style="stop-color:#74af52;stop-opacity:1"/><stop offset=".17" style="stop-color:#74af52;stop-opacity:1"/><stop offset=".48" style="stop-color:#99be32;stop-opacity:1"/><stop offset="1" style="stop-color:#c0c40a;stop-opacity:1"/></linearGradient></defs></svg>',jO=btoa(LO),DO="data:image/svg+xml;charset=utf-8;base64,"+jO,BO=DO,ob=typeof window!==void 0?window.location.search.includes("debugcontext"):!1;var me=(n=>(n.ContextRegistered="ContextRegistered",n.ContextCreationStart="ContextCreationStart",n.ContextCreated="ContextCreated",n.ContextFirstFrameRendered="ContextFirstFrameRendered",n.ContextDestroying="ContextDestroying",n.ContextDestroyed="ContextDestroyed",n.MissingCamera="MissingCamera",n.ContextClearing="ContextClearing",n.ContextCleared="ContextCleared",n))(me||{});class pe{static get Current(){return globalThis["NeedleEngine.Context.Current"]}static set Current(e){globalThis["NeedleEngine.Context.Current"]=e}static get All(){return this.Registered}static register(e){this.Registered.indexOf(e)===-1&&(ob&&console.warn("Registering context"),this.Registered.push(e),this.dispatchCallback("ContextRegistered",e))}static unregister(e){const t=this.Registered.indexOf(e);t!==-1&&(ob&&console.warn("Unregistering context"),this.Registered.splice(t,1))}static registerCallback(e,t){this._callbacks[e]||(this._callbacks[e]=[]),this._callbacks[e].push(t)}static unregisterCallback(e,t){if(!this._callbacks[e])return;const s=this._callbacks[e].indexOf(t);s!==-1&&this._callbacks[e].splice(s,1)}static dispatchCallback(e,t,s){if(!this._callbacks[e])return!0;const o={event:e,context:t};if(s)for(const l in s)o[l]=s[l];const r=new Array;return this._callbacks[e].forEach(l=>{const c=l(o);c instanceof Promise&&r.push(c)}),Promise.all(r)}static addContextCreatedCallback(e){this.registerCallback("ContextCreated",e)}static addContextDestroyedCallback(e){this.registerCallback("ContextDestroyed",e)}}a(pe,"Registered",[]),a(pe,"_callbacks",{});const rb=()=>n=>n;function FO(n){return rb()(n)}function UO(){return!!C("debug")}class Oi{constructor(e,t){a(this,"_factory"),a(this,"_cache",[]),a(this,"_maxSize"),a(this,"_index",0),this._factory=e,this._maxSize=t}get(){const e=this._index%this._maxSize;return this._index++,this._cache.length<=e&&(this._cache[e]=this._factory()),this._cache[e]}}let vr=!1;const Xm=new Array;typeof window<"u"&&setTimeout(()=>{if(vr){const n={},e=new URL(window.location.href),t=new URL(e);t.searchParams.append("console","");const s=t.toString().replace(/=$|=(?=&)/g,"");for(const r of Xm){const l=new URL(e);l.searchParams.append(r,""),n[r]=l.toString().replace(/=$|=(?=&)/g,"")}console.log(`\u{1F335} ?help: Debug Options for Needle Engine.
|
|
2
|
+
Append any of these parameters to the URL to enable specific debug options.
|
|
3
|
+
Example: ${s} will show an onscreen console window.`);const o=vr===!0?"":` (containing "${vr}")`;console.group("Available URL parameters:"+o);for(const r of Object.keys(n).sort())typeof vr=="string"&&!r.toLowerCase().includes(vr.toLowerCase())||(console.groupCollapsed(r),console.log("Reload with this flag enabled:"),console.log(n[r]),console.groupEnd());console.groupEnd()}},100);function $l(){var n;return new URLSearchParams((n=globalThis.location)==null?void 0:n.search)}function C(n){vr&&!Xm.includes(n)&&Xm.push(n);const e=$l();if(e.has(n)){const t=e.get(n);if(t){const s=Number(t);return isNaN(s)?t:s}else return!0}return!1}vr=C("help");function zO(n,e){const t=$l();t.has(n)?t.set(n,e):t.append(n,e),document.location.search=t.toString()}function Hl(n,e,t=!0){const s=$l();s.has(n)?e===null?s.delete(n):s.set(n,e):e!==null&&s.append(n,e),t?ab(n,s):Ym(n,s)}function Qm(n,e,t){n.has(e)?n.set(e,t.toString()):n.append(e,t.toString())}function ab(n,e,t){window.history.pushState(t,n,"?"+e.toString())}function Ym(n,e,t){window.history.replaceState(t,n,"?"+e.toString())}function NO(n){for(var e="",t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",s=t.length,o=0;o<n;o++)e+=t.charAt(Math.floor(Math.random()*s));return e}function WO(n,e){return Math.floor(Math.random()*(e-n+1))+n}const lb=["smol","tiny","giant","interesting","smart","bright","dull","extreme","beautiful","pretty","dark","epic","salty","silly","funny","lame","lazy","loud","lucky","mad","mean","mighty","mysterious","nasty","odd","old","powerful","quiet","rapid","scary","shiny","shy","silly","smooth","sour","spicy","stupid","sweet","tasty","terrible","ugly","unusual","vast","wet","wild","witty","wrong","zany","zealous","zippy","zombie","zorro"],cb=["cat","dog","mouse","pig","cow","horse","sheep","chicken","duck","goat","panda","tiger","lion","elephant","monkey","bird","fish","snake","frog","turtle","hamster","penguin","kangaroo","whale","dolphin","crocodile","snail","ant","bee","beetle","butterfly","dragon","eagle","fish","giraffe","lizard","panda","penguin","rabbit","snake","spider","tiger","zebra"];function hb(){const n=lb[Math.floor(Math.random()*lb.length)],e=cb[Math.floor(Math.random()*cb.length)];return n+"_"+e}function db(n){return n=n.replace(/[^a-z0-9áéíóúñü \.,_-]/gim,""),n.trim()}function Ma(n,e,t=!0,s=!1){var o;if(e==null)return null;if(e.userData&&e.userData.guid===n||e.guid==n)return e;if(s&&(o=e.userData)!=null&&o.components){for(const r of e.userData.components)if(r.guid===n)return r}if(t){if(e.scenes)for(const r in e.scenes){const l=e.scenes[r],c=Ma(n,l,t,s);if(c)return c}if(e.children)for(const r in e.children){const l=e.children[r],c=Ma(n,l,t,s);if(c)return c}}}function Gl(n,e){if(n!=null&&typeof n=="object"){let t;Array.isArray(n)?t=[]:(t=Object.create(n),Object.assign(t,n));for(const s of Object.keys(n)){const o=n[s];e&&!e(n,s,o)?t[s]=o:o?.clone!==void 0&&typeof o.clone=="function"?t[s]=o.clone():t[s]=Gl(o,e)}return t}return n}function vs(n){return new Promise((e,t)=>{setTimeout(e,n)})}function ql(n,e){if(n<=0)return Promise.resolve();if(e||(e=pe.Current),!e)return Promise.reject("No context");const t=e.time.frameCount+n;return new Promise((s,o)=>{if(!e)return o("No context");const r=()=>{e.time.frameCount>=t&&(e.pre_update_callbacks.splice(e.pre_update_callbacks.indexOf(r),1),s())};e.pre_update_callbacks.push(r)})}const Pd=C("debugresolveurl"),ub="rel:";function VO(n,e){return yo(n,e)}function yo(n,e){if(e===void 0)return Pd&&console.warn("getPath: uri is undefined, returning uri",e),e;if(e.startsWith("./"))return e;if(e.startsWith("http"))return Pd&&console.warn("getPath: uri is absolute, returning uri",e),e;if(n===void 0)return Pd&&console.warn("getPath: source is undefined, returning uri",e),e;e.startsWith(ub)&&(e=e.substring(4));const t=n.lastIndexOf("/");if(t>=0){const s=n.substring(0,t+1);for(;s.endsWith("/")&&e.startsWith("/");)e=e.substring(1);const o=s+e;return Pd&&console.log("source:",n,`changed uri
|
|
4
|
+
from`,e,`
|
|
5
|
+
to `,o,`
|
|
6
|
+
basePath: `+s),o}return e}class $O{constructor(e,t){a(this,"writeCallbacks",[]),a(this,"_applied",!1),a(this,"_object"),a(this,"_prop"),a(this,"_wrapperProp"),this._object=e,this._prop=t,this._wrapperProp=Symbol("$"+t),this.apply()}subscribeWrite(e){this.writeCallbacks.push(e)}unsubscribeWrite(e){const t=this.writeCallbacks.indexOf(e);t!==-1&&this.writeCallbacks.splice(t,1)}apply(){if(this._applied||!this._object)return;const e=this._object,t=this._prop;if(e[t]===void 0)return;this._applied=!0,e[this._wrapperProp]!==void 0&&console.warn("Watcher is being applied to an object that already has a wrapper property. This is not (yet) supported");const s=e[t];e[this._wrapperProp]=s,Object.defineProperty(e,t,{get:()=>e[this._wrapperProp],set:o=>{e[this._wrapperProp]=o;for(const r of this.writeCallbacks)r(o,this._prop)}})}revoke(){if(!this._applied||!this._object)return;this._applied=!1;const e=this._object,t=this._prop;Reflect.deleteProperty(e,t);const s=e[this._wrapperProp];e[t]=s,Reflect.deleteProperty(e,this._wrapperProp)}dispose(){this.revoke(),this.writeCallbacks.length=0,this._object=null}}class lo{constructor(e,t){if(a(this,"_watches",[]),Array.isArray(t))for(const s of t)this._watches.push(new lo(e,s));else this._watches.push(new $O(e,t))}subscribeWrite(e){for(const t of this._watches)t.subscribeWrite(e)}unsubscribeWrite(e){for(const t of this._watches)t.unsubscribeWrite(e)}apply(){for(const e of this._watches)e.apply()}revoke(){for(const e of this._watches)e.revoke()}dispose(){for(const e of this._watches)e.dispose();this._watches.length=0}}const Ra=Symbol("needle:watches");function Od(n,e){if(!n[Ra])if(n instanceof re)n[Ra]=new lo(n,["x","y"]);else if(n instanceof S)n[Ra]=new lo(n,["x","y","z"]);else if(n instanceof fe||n instanceof V)n[Ra]=new lo(n,["x","y","z","w"]);else return!1;return n[Ra].subscribeWrite(e),!0}function Km(n,e){if(!n)return;const t=n[Ra];t&&t.unsubscribeWrite(e)}var X;(n=>{let e;function t(){if(e!==void 0)return e;const B=window.navigator.userAgent,Q=/Windows|MacOS|Mac OS/.test(B),te=/Windows NT/.test(B)&&/Edg/.test(B)&&!/Win64/.test(B);return e=Q&&!te&&!w()}n.isDesktop=t;let s;function o(){return s!==void 0?s:typeof window.orientation<"u"||navigator.userAgent.indexOf("IEMobile")!==-1?s=!0:s=/iPhone|iPad|iPod|Android|IEMobile/i.test(navigator.userAgent)}n.isMobileDevice=o;function r(){return c()}n.isIPad=r;let l;function c(){return l!==void 0?l:l=/iPad/.test(navigator.userAgent)}n.isiPad=c;let h;function d(){return h!==void 0?h:h=/Android/.test(navigator.userAgent)}n.isAndroidDevice=d;let u;function p(){return u!==void 0?u:u=/WebXRViewer\//i.test(navigator.userAgent)}n.isMozillaXR=p;let g;function f(){if(g!==void 0)return g;if(navigator.userAgentData)return g=navigator.userAgentData.platform==="macOS";{const B=navigator.userAgent.toLowerCase();return g=B.includes("mac os x")||B.includes("macintosh")}}n.isMacOS=f;let y;function v(){return y!==void 0?y:y=f()&&"xr"in navigator}n.isVisionOS=v;let b;const _=["iPad Simulator","iPhone Simulator","iPod Simulator","iPad","iPhone","iPod"];function w(){return b!==void 0?b:b=_.includes(navigator.platform)||navigator.userAgent.includes("Mac")&&"ontouchend"in document}n.isiOS=w;let x;function k(){return x!==void 0||(x=/^((?!chrome|android).)*safari/i.test(navigator.userAgent)),x}n.isSafari=k;let M;function T(){return M!==void 0?M:M=navigator.userAgent.includes("OculusBrowser")}n.isQuest=T;let L;function D(){return L!==void 0||(L=document.createElement("a").relList.supports("ar")),L}n.supportsQuickLookAR=D;async function z(){try{return(await navigator.permissions.query({name:"microphone"})).state!=="denied"}catch(B){return console.error("Error querying `microphone` permissions.",B),!1}}n.microphonePermissionsGranted=z;let j;function H(){if(j!==void 0)return j;const B=navigator.userAgent.match(/iPhone OS (\d+_\d+)/);if(B&&(j=B[1].replace("_",".")),!j){const Q=navigator.userAgent.match(/(?:\(Macintosh;|iPhone;|iPad;).*Version\/(\d+\.\d+)/);Q&&(j=Q[1])}return j||(j=null),j}n.getiOSVersion=H;let K;function U(){if(K!==void 0)return K;const B=navigator.userAgent.match(/(?:CriOS|Chrome)\/(\d+\.\d+\.\d+\.\d+)/);return B?K=B[1].replace("_","."):K=null,K}n.getChromeVersion=U})(X||(X={}));function HO(){return X.isDesktop()}function GO(){return X.isMobileDevice()}function qO(){return X.isiPad()}function XO(){return X.isiPad()}function QO(){return X.isAndroidDevice()}function YO(){return X.isMozillaXR()}function KO(){return X.isMacOS()}function ZO(){return X.isiOS()}function JO(){return X.isSafari()}function ek(){return X.isQuest()}async function tk(){return X.microphonePermissionsGranted()}const vo=new WeakMap;function pb(n,e,t){if(!vo.get(n)){const o=new MutationObserver(r=>{ik(n,r)});vo.set(n,{observer:o,attributeChangedListeners:new Map}),o.observe(n,{attributes:!0})}const s=vo.get(n).attributeChangedListeners;s.has(e)||s.set(e,[]),s.get(e).push(t)}function mb(n,e,t){if(!vo.get(n))return;const s=vo.get(n).attributeChangedListeners;if(!s.has(e))return;const o=s.get(e),r=o.indexOf(t);if(r!==-1&&(o.splice(r,1),o.length<=0)){s.delete(e);const l=vo.get(n);l?.observer.disconnect(),vo.delete(n)}}function ik(n,e){const t=vo.get(n).attributeChangedListeners;for(const s of e)if(s.type==="attributes"){const o=s.attributeName,r=n.getAttribute(o);if(t.has(o))for(const l of t.get(o))l(r)}}class Zm{constructor(e){a(this,"reason"),this.reason=e}}async function Jm(n){const e=await Promise.allSettled(n).catch(o=>[new Zm(o.message)]);let t=!1;const s=e.map(o=>"value"in o?o.value:(t=!0,new Zm(o.reason)));return{anyFailed:t,results:s}}async function gb(n){var e;if(!globalThis.QRCode){const d="https://cdn.jsdelivr.net/gh/davidshimjs/qrcodejs@gh-pages/qrcode.min.js";let u=document.head.querySelector(`script[src="${d}"]`);u||(u=document.createElement("script"),u.src=d,document.head.appendChild(u)),await new Promise((p,g)=>{u.addEventListener("load",()=>{p(!0)})})}const t=globalThis.QRCode,s=n.domElement??document.createElement("div"),o=new t(s,{width:n.width??256,height:n.height??256,colorDark:"#000000",colorLight:"#ffffff",correctLevel:n.showLogo?t.CorrectionLevel.H:t.CorrectLevel.M,...n}),r=o?._oQRCode.moduleCount||0,l=(e=o?._oDrawing)==null?void 0:e._elCanvas;let c=.25;r<40?c=Math.floor(r/4)/r:c=Math.floor(r/6)/r;const h=Math.floor(r/20)/r;try{const d=await sk(l,{showLogo:n.showLogo,logoSize:c,logoPadding:h}).catch(u=>{});d&&(s.innerHTML="",s.append(d))}catch{}if(n.showUrl!==!1&&n.text){const d=s.querySelector(".qr-code-link-label");let u=n.text.replace(/^(https?:\/\/)?(www\.)?/,"").replace(/\/+$/,"").replace(/\?+$/,"");if(u="Scan to visit "+u,d)d.textContent=u;else{const p=document.createElement("div");p.classList.add("qr-code-link-label"),n.text=u,p.textContent=n.text,p.addEventListener("click",g=>{g.stopImmediatePropagation()}),p.style.textAlign="center",p.style.fontSize="0.8em",p.style.marginTop="0.1em",p.style.color="#000000",p.style.fontFamily="'Roboto Flex', sans-serif",p.style.opacity="0.5",p.style.wordBreak="break-all",p.style.wordWrap="break-word",p.style.marginBottom="0.3em",s.style.width="calc(210px + 20px)",s.appendChild(p)}}return s}async function sk(n,e){if(!n)return;const t=8,s=20,o=e.logoPadding||1/32,r="transparent",l=0,c=new Image,h=document.querySelector("needle-engine"),d=h?.getAttribute("loading-logo-src")||nb;if(!d)return;let u=!1;e.showLogo!==!1&&(c.src=d,u=await new Promise((w,x)=>{c.onload=()=>w(!0),c.onerror=k=>{console.error("Error loading favicon image for QR code",k),w(!1)}}));const p=document.createElement("canvas");p.width=n.width+t,p.height=n.height+t;const g=p.getContext("2d");if(!g)return;g.fillStyle="#ffffff",g.fillRect(0,0,p.width,p.height),g.drawImage(n,t/2,t/2),g.imageSmoothingEnabled=!0,g.imageSmoothingQuality="high",g.mozImageSmoothingEnabled=!0,g.webkitImageSmoothingEnabled=!0,g.globalCompositeOperation="lighten";const f=g.createLinearGradient(0,0,0,p.height);f.addColorStop(0,"rgb(45, 45, 45)"),f.addColorStop(1,"rgb(45, 45, 45)"),g.fillStyle=f,g.fillRect(0,0,p.width,p.height),g.globalCompositeOperation="source-over";let y=Math.min(n.width,n.height)*(e.logoSize||.25),v=y;if(u){const w=c.width/c.height;w>1?v=y/w:y=v*w;const x=o*n.width,k=Math.max(y,v),M=Math.round(k+x),T=Math.round(k+x),L=(p.width-k)/2,D=(p.height-k)/2;g.shadowColor=r,g.shadowBlur=s;const z=l,j=Math.round(L-x/2),H=Math.round(D-x/2);g.beginPath(),g.moveTo(j+z,H),g.lineTo(j+M-z,H),g.quadraticCurveTo(j+M,H,j+M,H+z),g.lineTo(j+M,H+T-z),g.quadraticCurveTo(j+M,H+T,j+M-z,H+T),g.lineTo(j+z,H+T),g.quadraticCurveTo(j,H+T,j,H+T-z),g.lineTo(j,H+z),g.quadraticCurveTo(j,H,j+z,H),g.fillStyle="#ffffff",g.closePath(),g.fill(),g.clip(),g.shadowColor="transparent";const K=(p.width-y)/2,U=(p.height-v)/2;g.drawImage(c,K,U,y,v)}const b=p.toDataURL("image/png"),_=document.createElement("img");return _.src=b,_.style.width="100%",_.style.height="auto",_}const fb=C("debugdebug");let Xl=!1;(C("noerrors")||C("nooverlaymessages"))&&(Xl=!0);const eg="needle_engine_global_error_container";var ki=(n=>(n[n.Log=0]="Log",n[n.Warn=1]="Warn",n[n.Error=2]="Error",n))(ki||{});function tg(){return _b}const ig=new Array;function nk(n){ig.push(n)}let sg=!1;function ok(...n){if(!sg){sg=!0;try{for(let e=0;e<ig.length;e++)ig[e](...n)}catch(e){console.error(e)}sg=!1}}const yb=console.error,vb=function(...n){yb.apply(console,n),lk(n),Hs(2,n),ng(...n)};function bb(n){Xl=!n,n?console.error=vb:console.error=yb}function rk(n){return bb(n)}function ak(){Xl||(fb&&console.warn("Patch console",window.location.hostname),console.error=vb,window.addEventListener("error",n=>{if(!n)return;const e=n.error;if(e===void 0){Xt()&&console.warn("Received unknown error",n,n.target);return}Hs(2,e,n.filename,n.lineno),ng(n)},!0),window.addEventListener("unhandledrejection",n=>{Xl||n&&(n.reason?Hs(2,n.reason.message,n.reason.stack):Hs(2,"unhandled rejection"),ng(n))}))}let _b=0;function ng(...n){_b+=1,ok(...n)}function lk(n){if(Array.isArray(n))for(let e=0;e<n.length;e++){const t=n[e];typeof t=="string"&&t.startsWith("THREE.PropertyBinding: Trying to update node for track:")&&(n[e]="Some animated objects couldn't be found: see console for details")}}function Hs(n,e,t,s){if(Xl)return;const o=pe.Current,r=o?.domElement??document.querySelector("needle-engine");if(r){if(Array.isArray(e)){let l="";for(let c=0;c<e.length;c++){let h=e[c];h instanceof Error&&(h=h.message),typeof h!="object"&&(c>0&&(l+=" "),l+=h)}e=l}!e||e.length<=0||ck(n,r,e)}}const Ql=new Map;function ck(n,e,t){if(t==null)return;const s=uk(e);if(s.childElementCount>=20){const c=s.lastElementChild;xb(c)}t.length>400&&(t=t.substring(0,400)+"...");const o=t;if(Ql.has(o))return;const r=pk(n,t);s.prepend(r);const l=()=>{Ql.delete(o),xb(r)};Ql.set(o,l),setTimeout(l,1e4)}function hk(){fb&&console.log("Clearing messages");for(const n of Ql.values())n?.call(n);Ql.clear()}const dk=`
|
|
7
|
+
|
|
8
|
+
@import url('https://fonts.googleapis.com/css2?family=Roboto+Flex:opsz,wght@8..144,100..1000&display=swap');
|
|
9
|
+
|
|
10
|
+
div[data-needle_engine_debug_overlay] {
|
|
11
|
+
font-family: 'Roboto Flex', sans-serif;
|
|
12
|
+
font-weight: 400;
|
|
13
|
+
font-size: 16px;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
div[data-needle_engine_debug_overlay] strong {
|
|
17
|
+
font-weight: 700;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
div[data-needle_engine_debug_overlay] a {
|
|
21
|
+
color: white;
|
|
22
|
+
text-decoration: none;
|
|
23
|
+
border-bottom: 1px solid rgba(255, 255, 255, 0.3);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
div[data-needle_engine_debug_overlay] a:hover {
|
|
27
|
+
text-decoration: none;
|
|
28
|
+
border: none;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
div[data-needle_engine_debug_overlay] .log strong {
|
|
32
|
+
color: rgba(200,200,200,.9);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
div[data-needle_engine_debug_overlay] .warn strong {
|
|
36
|
+
color: rgba(255,255,230, 1);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
div[data-needle_engine_debug_overlay] .error strong {
|
|
40
|
+
color: rgba(255,100,120, 1);
|
|
41
|
+
}
|
|
42
|
+
`;function uk(n){globalThis[eg]||(globalThis[eg]=new Map);const e=globalThis[eg];if(e.has(n))return e.get(n);{const t=document.createElement("div");e.set(n,t),t.setAttribute("data-needle_engine_debug_overlay",""),t.classList.add("debug-container"),t.style.cssText=`
|
|
43
|
+
position: absolute;
|
|
44
|
+
top: 0;
|
|
45
|
+
right: 5px;
|
|
46
|
+
padding-top: 0px;
|
|
47
|
+
max-width: 70%;
|
|
48
|
+
max-height: calc(100% - 5px);
|
|
49
|
+
z-index: 9999999999;
|
|
50
|
+
pointer-events: scroll;
|
|
51
|
+
display: flex;
|
|
52
|
+
align-items: end;
|
|
53
|
+
flex-direction: column;
|
|
54
|
+
color: white;
|
|
55
|
+
overflow: auto;
|
|
56
|
+
word-break: break-word;
|
|
57
|
+
`,n.shadowRoot?n.shadowRoot.appendChild(t):n.appendChild(t);const s=document.createElement("style");return s.innerHTML=dk,t.appendChild(s),t}}const wb=Symbol("logtype"),kd=new Map;function xb(n){n.remove();const e=n[wb],t=kd.get(e)??[];t.push(n),kd.set(e,t)}function pk(n,e){if(kd.has(n)){const s=kd.get(n);if(s.length>0){const o=s.pop();return o.innerHTML=e,o}}const t=document.createElement("div");switch(t.setAttribute("data-id","__needle_engine_debug_overlay"),t.style.marginRight="5px",t.style.padding=".5em",t.style.backgroundColor="rgba(0,0,0,.9)",t.style.marginTop="5px",t.style.marginBottom="3px",t.style.borderRadius="8px",t.style.pointerEvents="all",t.style.userSelect="text",t.style.maxWidth="250px",t.style.whiteSpace="pre-wrap",t.style["backdrop-filter"]="blur(10px)",t.style["-webkit-backdrop-filter"]="blur(10px)",t.style.backgroundColor="rgba(20,20,20,.8)",t.style.boxShadow="inset 0 0 80px rgba(0,0,0,.2), 0 0 5px rgba(0,0,0,.2)",t.style.border="1px solid rgba(160,160,160,.2)",t[wb]=n,n){case 0:t.classList.add("log"),t.style.color="rgba(200,200,200,.7)",t.style.backgroundColor="rgba(40,40,40,.7)";break;case 1:t.classList.add("warn"),t.style.color="rgb(255, 255, 150)",t.style.backgroundColor="rgba(50,50,20,.8)";break;case 2:t.classList.add("error"),t.style.color="rgb(255, 50, 50",t.style.backgroundColor="rgba(50,20,20,.8)";break}return t.title="Open the browser console (F12) for more information",t.innerHTML=e,t}class mk{constructor(){a(this,"Rad2Deg",180/Math.PI),a(this,"Deg2Rad",Math.PI/180),a(this,"Epsilon",1e-5)}random(e,t){return Array.isArray(e)?e.length<=0?null:e[Math.floor(Math.random()*e.length)]:e!==void 0&&t!==void 0?Math.random()*(t-e)+e:Math.random()}randomVector3(e,t=0,s=1){e.x=this.random(t,s),e.y=this.random(t,s),e.z=this.random(t,s)}clamp(e,t,s){return e<t?t:e>s?s:e}clamp01(e){return this.clamp(e,0,1)}lerp(e,t,s){return s=s<0?0:s,s=s>1?1:s,e+(t-e)*s}inverseLerp(e,t,s){return(s-e)/(t-e)}remap(e,t,s,o,r){return o+(r-o)*(e-t)/(s-t)}moveTowards(e,t,s){return e+=s,(s<0&&e<t||s>0&&e>t)&&(e=t),e}toDegrees(e){return e*180/Math.PI}toRadians(e){return e*Math.PI/180}tan(e){return Math.tan(e)}gammaToLinear(e){return Math.pow(e,2.2)}linearToGamma(e){return Math.pow(e,1/2.2)}approximately(e,t,s=Number.EPSILON){for(const o of gk){const r=e[o],l=t[o];if(r===void 0||l===void 0)break;if(Math.abs(r-l)>s)return!1}return!0}easeInOutCubic(e){return e<.5?4*e*e*e:1-Math.pow(-2*e+2,3)/2}}const gk=["x","y","z","w"],W=new mk;class Sb{constructor(e){a(this,"y"),a(this,"s"),a(this,"alpha",0),this.setAlpha(e),this.y=null,this.s=null}setAlpha(e){if(e<=0||e>1)throw new Error;this.alpha=e}filter(e,t){t&&this.setAlpha(t);let s;return this.y?s=this.alpha*e+(1-this.alpha)*this.s:s=e,this.y=e,this.s=s,s}lastValue(){return this.y}reset(e){this.y=e,this.s=e}}class Md{constructor(e,t=1,s=0,o=1){if(a(this,"freq"),a(this,"minCutOff"),a(this,"beta"),a(this,"dCutOff"),a(this,"x"),a(this,"dx"),a(this,"lasttime"),e<=0||t<=0||o<=0)throw new Error;this.freq=e,this.minCutOff=t,this.beta=s,this.dCutOff=o,this.x=new Sb(this.alpha(this.minCutOff)),this.dx=new Sb(this.alpha(this.dCutOff)),this.lasttime=null}alpha(e){const t=1/this.freq;return 1/(1+1/(2*Math.PI*e)/t)}filter(e,t=null){this.lasttime&&t&&(this.freq=1/(t-this.lasttime)),this.lasttime=t;const s=this.x.lastValue(),o=s?(e-s)*this.freq:0,r=this.dx.filter(o,this.alpha(this.dCutOff)),l=this.minCutOff+this.beta*Math.abs(r);return this.x.filter(e,this.alpha(l))}reset(e){e!=null&&this.x.reset(e),this.x.alpha=this.alpha(this.minCutOff),this.dx.alpha=this.alpha(this.dCutOff),this.lasttime=null}}class og{constructor(e,t=1,s=0,o=1){a(this,"x"),a(this,"y"),a(this,"z"),this.x=new Md(e,t,s,o),this.y=new Md(e,t,s,o),this.z=new Md(e,t,s,o)}filter(e,t,s=null){t.x=this.x.filter(e.x,s),t.y=this.y.filter(e.y,s),t.z=this.z.filter(e.z,s)}reset(e){this.x.reset(e?.x),this.y.reset(e?.y),this.z.reset(e?.z)}}const Rd="needle:cameraController";function Cb(n){return n[Rd]}function rg(n,e,t){t?n[Rd]=e:n[Rd]===e&&(n[Rd]=null)}const ag="needle:autofit";function Pb(n){return n[ag]===void 0?!0:n[ag]!==!1}function Td(n,e){n[ag]=e}function fk(n,e,t){const s=n.length(),o=e.length(),r=W.lerp(s,o,t);return n.lerp(e,t).normalize().multiplyScalar(r)}const lg=new V,Ob=new V().setFromAxisAngle(new S(0,1,0),Math.PI);function yk(n,e){n.lookAt(e),n.quaternion.multiply(Ob)}function Yl(n,e,t=!0,s=!1){if(n===e)return;lg.copy(n.quaternion);const o=ee(e),r=ee(n);if(s){if(Yi(n,Se(e)),t){const l=r.y,c=r.sub(Eb(n));c.y=l,n.lookAt(c),n.quaternion.multiply(Ob)}Number.isNaN(n.quaternion.x)&&n.quaternion.copy(lg);return}t&&(o.y=r.y),n.lookAt(o),Number.isNaN(n.quaternion.x)&&n.quaternion.copy(lg)}function vk(n,e,t,s=1){if(t){const o=q(0,0,0),r=e.x/window.innerWidth*2-1,l=-(e.y/window.innerHeight)*2+1;o.set(r,l,0),o.unproject(t);const c=t.worldPosition,h=n.worldPosition.distanceTo(c),d=o.sub(c);d.multiplyScalar(s*3.6*h);const u=t.worldPosition.add(d);return n.lookAt(u),u}return null}const bk=new Oi(()=>new S,100);function q(n,e,t){const s=bk.get();return s.set(0,0,0),n instanceof S?s.copy(n):Array.isArray(n)?s.set(n[0],n[1],n[2]):n instanceof DOMPointReadOnly?s.set(n.x,n.y,n.z):typeof n=="number"?(s.x=n,s.y=e!==void 0?e:s.x,s.z=t!==void 0?t:s.x):typeof n=="object"&&(s.x=n.x,s.y=n.y,s.z=n.z),s}const _k=new Oi(()=>new oe,30);function kb(n){const e=_k.get();return n?e.copy(n):e.set(0,0,0),e}const wk=new Oi(()=>new V,100);function bs(n){const e=wk.get();return e.identity(),n instanceof V?e.copy(n):n instanceof DOMPointReadOnly&&e.set(n.x,n.y,n.z,n.w),e}const cg=new Oi(()=>new S,100),Mb=Symbol("lastMatrixWorldUpdateKey");function ee(n,e=null,t=!0){const s=e??cg.get();return n?n.parent?(t&&n.updateWorldMatrix(!0,!1),n.matrixWorldNeedsUpdate&&n[Mb]!==Date.now()&&(n[Mb]=Date.now(),n.updateMatrixWorld()),s.setFromMatrixPosition(n.matrixWorld),s):s.copy(n.position):s.set(0,0,0)}function lt(n,e){if(!n)return n;const t=cg.get();return e!==t&&t.copy(e),(n?.parent??n).worldToLocal(t),n.position.set(t.x,t.y,t.z),n}function br(n,e,t,s){const o=cg.get();return o.set(e,t,s),lt(n,o),n}const Ed=new Oi(()=>new V,100),_r=new V,hg=new V;function Se(n,e=null){if(!n)return Ed.get().identity();const t=e??Ed.get();return n.parent?(n.getWorldQuaternion(t),t):t.copy(n.quaternion)}function Yi(n,e){if(!n)return;e!==_r&&_r.copy(e);const t=_r,s=n?.parent;s?.getWorldQuaternion(hg),hg.invert();const o=hg.multiply(t);n.quaternion.set(o.x,o.y,o.z,o.w)}function dg(n,e,t,s,o){_r.set(e,t,s,o),Yi(n,_r)}const xk=new Oi(()=>new S,100),Sk=new S;function Ge(n,e=null){return e||(e=xk.get()),n?n.parent?(n.getWorldScale(e),e):e.copy(n.scale):e.set(0,0,0)}function Ta(n,e){if(!n)return;if(!n.parent){n.scale.copy(e);return}const t=Sk;n.parent.getWorldScale(t),n.scale.copy(e),n.scale.divide(t)}const Ck=new S,Rb=new V;function Pk(n){return Se(n,Rb),Ck.set(0,0,1).applyQuaternion(Rb)}const Ok=new Oi(()=>new S,100),Tb=new V;function Eb(n,e){return e||(e=Ok.get().set(0,0,1)),Se(n,Tb),e.applyQuaternion(Tb)}const Ab=new Dt,Ib=new Dt,kk=new S;function ug(n){const e=Ed.get();return n.getWorldQuaternion(e),Ib.setFromQuaternion(e),Ib}function pg(n,e){const t=Ed.get();Yi(n,t.setFromEuler(e))}function Ad(n){const e=ug(n),t=kk;return t.set(e.x,e.y,e.z),t.x=W.toDegrees(t.x),t.y=W.toDegrees(t.y),t.z=W.toDegrees(t.z),t}function Lb(n,e){Kl(n,e.x,e.y,e.z,!0)}function Kl(n,e,t,s,o=!0){o&&(e=W.toRadians(e),t=W.toRadians(t),s=W.toRadians(s)),Ab.set(e,t,s),_r.setFromEuler(Ab),Yi(n,_r)}function Id(n,e=!0){n&&(e?function t(s){console.groupCollapsed((s.name?s.name:"(no name : "+s.type+")")+" %o",s),s.children.forEach(t),console.groupEnd()}(n):n.traverse(function(t){for(var s="|___",o=t;o.parent!==null;)s=" "+s,o=o.parent;console.log(s+t.name+" <"+t.type+">")}))}function Mk(n){let e=n?.name||"";if(!n)return e;let t=n.parent;for(;t;)e=t.name+"/"+e,t=t.parent;return e}function jb(n){if(n){const e=n;return e.blendMode!==void 0&&e.clampWhenFinished!==void 0&&e.enabled!==void 0&&e.fadeIn!==void 0&&e.getClip!==void 0}return!1}const Db=class mC extends Ws{constructor(){super({vertexShader:mC.vertex,uniforms:{map:new Qi(null),flipY:new Qi(!0),writeDepth:new Qi(!1),depthTexture:new Qi(null)},fragmentShader:`
|
|
58
|
+
uniform sampler2D map;
|
|
59
|
+
uniform bool flipY;
|
|
60
|
+
uniform bool writeDepth;
|
|
61
|
+
uniform sampler2D depthTexture;
|
|
62
|
+
|
|
63
|
+
varying vec2 vUv;
|
|
64
|
+
|
|
65
|
+
void main(){
|
|
66
|
+
vec2 uv = vUv;
|
|
67
|
+
if (flipY) uv.y = 1.0 - uv.y;
|
|
68
|
+
gl_FragColor = texture2D(map, uv);
|
|
69
|
+
|
|
70
|
+
if (writeDepth) {
|
|
71
|
+
float depth = texture2D(depthTexture, uv).r;
|
|
72
|
+
gl_FragDepth = depth;
|
|
73
|
+
|
|
74
|
+
// float linearDepth = (depth - 0.99) * 100.0; // Enhance near 1.0 values
|
|
75
|
+
// gl_FragColor = vec4(linearDepth, linearDepth, linearDepth, 1.0);
|
|
76
|
+
}
|
|
77
|
+
}`})}reset(){this.uniforms.map.value=null,this.uniforms.flipY.value=!0,this.uniforms.writeDepth.value=!1,this.uniforms.depthTexture.value=null,this.needsUpdate=!0,this.uniformsNeedUpdate=!0}};a(Db,"vertex",`
|
|
78
|
+
varying vec2 vUv;
|
|
79
|
+
void main(){
|
|
80
|
+
vUv = uv;
|
|
81
|
+
gl_Position = vec4(position.xy, 0., 1.0);
|
|
82
|
+
}`);let Bb=Db;const Gs=class{static copyTexture(e,t){t||(t=this.blitMaterial),this.blitMaterial.reset();const s=t||this.blitMaterial;s.uniforms.map.value=e,s.needsUpdate=!0,s.uniformsNeedUpdate=!0;const o=s.vertexShader;s.vertexShader=Bb.vertex;const r=this.mesh;r.material=s,r.frustumCulled=!1,this.scene.children.length=0,this.scene.add(r),this.renderer.setSize(e.image.width,e.image.height),this.renderer.clear(),this.renderer.render(this.scene,this.perspectiveCam);const l=new je(this.renderer.domElement);return l.name="Copy",l.needsUpdate=!0,s.vertexShader=o,l}static blit(e,t,s){const{renderer:o=this.renderer,blitMaterial:r=this.blitMaterial,flipY:l=!1,depthTexture:c=null,depthTest:h=!0,depthWrite:d=!0}=s||{};this.blitMaterial.reset(),r.uniforms.map&&(r.uniforms.map.value=e),r.uniforms.flipY&&(r.uniforms.flipY.value=l),c?(r.uniforms.writeDepth=new Qi(!0),r.uniforms.depthTexture.value=c):(r.uniforms.writeDepth=new Qi(!1),r.uniforms.depthTexture.value=null),r.needsUpdate=!0,r.uniformsNeedUpdate=!0;const u=this.mesh;u.material=r,u.frustumCulled=!1,this.scene.children.length=0,this.scene.add(u);const p=o.getRenderTarget(),g=o.getContext(),f=g.getParameter(g.DEPTH_TEST),y=g.getParameter(g.DEPTH_WRITEMASK),v=g.getParameter(g.DEPTH_FUNC);h?o.getContext().enable(o.getContext().DEPTH_TEST):o.getContext().disable(o.getContext().DEPTH_TEST),o.state.buffers.depth.setMask(d),o.setClearColor(new oe(0,0,0),0),o.setPixelRatio(window.devicePixelRatio),o.setRenderTarget(t),o.clear(),o.render(this.scene,this.perspectiveCam),o.setRenderTarget(p);const b=o.state.buffers.depth;b.setTest(f),b.setMask(y),b.setFunc(v)}static textureToCanvas(e,t=!1){if(!e)return null;(t===!0||e.isCompressedTexture===!0)&&(e=Fb(e));const s=e.image;if(Tk(s)){const o=document.createElement("canvas");o.width=s.width,o.height=s.height;const r=o.getContext("2d");return r?(r.drawImage(s,0,0,s.width,s.height,0,0,o.width,o.height),o):(console.error("Failed getting canvas 2d context"),null)}return null}};a(Gs,"planeGeometry",new Ns(2,2,1,1)),a(Gs,"renderer",new fr({antialias:!1,alpha:!0})),a(Gs,"perspectiveCam",new we),a(Gs,"orthographicCam",new ud),a(Gs,"scene",new xi),a(Gs,"blitMaterial",new Bb),a(Gs,"mesh",new G(Gs.planeGeometry,Gs.blitMaterial));let Zl=Gs;function Fb(n){return Zl.copyTexture(n)}function Rk(n,e=!1){return Zl.textureToCanvas(n,e)}function Tk(n){return typeof HTMLImageElement<"u"&&n instanceof HTMLImageElement||typeof HTMLCanvasElement<"u"&&n instanceof HTMLCanvasElement||typeof OffscreenCanvas<"u"&&n instanceof OffscreenCanvas||typeof ImageBitmap<"u"&&n instanceof ImageBitmap}function Ek(n){const e=n.type;return e==="Mesh"||e==="SkinnedMesh"}function mg(n,e){e?n["needle:rendercustomshadow"]=!0:n["needle:rendercustomshadow"]=!1}function Ub(n){return!!(n&&(n["needle:rendercustomshadow"]===!0||n["needle:rendercustomshadow"]==null))}function si(n,e=void 0,t=void 0,s=void 0){const o=s||new Si;o.makeEmpty();const r=[];function l(h){let d=!0;if(h.visible&&Pb(h)!==!1&&!(h.type==="TransformControlsGizmo"||h.type==="TransformControlsPlane")){if(h instanceof EC&&(d=!1),h instanceof Mm&&(d=!1),h instanceof ka&&(d=!1),h.isGizmo===!0&&(d=!1),h.material instanceof kv&&(d=!1),Ek(h)||(d=!1),t&&h.layers.test(t)===!1&&(d=!1),d&&(e&&Array.isArray(e)&&e!=null&&e.includes(h)||typeof e=="function"&&e(h)===!0))return;if(h.isUI!==!0){if(d){const u=h.children;h.children=r;const p=h.position,g=h.scale;if(Number.isNaN(p.x)||Number.isNaN(p.y)||Number.isNaN(p.z)){console.warn(`Object "${h.name}" has NaN values in position or scale.... will ignore it`,p,g);return}o.expandByObject(h,!0),h.children=u}for(const u of h.children)l(u)}}}let c=!1;Array.isArray(n)||(n=[n]);for(const h of n)h&&(c=!0,h.updateMatrixWorld(),l(h));return c||console.warn("No objects to fit camera to..."),o}function zb(n,e,t){const s=si([n],t?.ignore),o=new S;s.getSize(o);const r=new S;s.getCenter(r);const l=new S;e.getSize(l);const c=new S;e.getCenter(c);const h=new S;h.set(l.x/o.x,l.y/o.y,l.z/o.z);const d=Math.min(h.x,h.y,h.z),u=t?.scale!==!1;if(u&&Ta(n,Ge(n).multiplyScalar(d)),t?.position!==!1){const p=new S;s.getCenter(p),p.y=s.min.y;const g=new S;e.getCenter(g),g.y=e.min.y;const f=g.clone().sub(p);u&&f.multiplyScalar(d),lt(n,ee(n).add(f))}return{boundsBefore:s,scale:h}}function Nb(n,e){const t=si([n]),s=new S;t.getCenter(s),s.y=t.min.y;const o=e.clone().sub(s),r=ee(n);return lt(n,r.add(o)),{offset:o,bounds:t}}function gg(n,e,t,s){if(Array.isArray(e)){let l=!0;for(let c=0;c<e.length;c++)gg(n,e[c],c,e)||(l=!1);return l}if(e.type==="MeshStandardMaterial"||e.type==="MeshBasicMaterial")return!1;if(e["material:fbx"]!=null)return!0;const o=new bt;o["material:fbx"]=e;const r=e;return r&&(r.map?o.color.set(1,1,1):o.color.copyLinearToSRGB(r.color),o.emissive.copyLinearToSRGB(r.emissive),o.emissiveIntensity=r.emissiveIntensity,o.opacity=r.opacity,o.displacementScale=r.displacementScale,o.transparent=r.transparent,o.bumpMap=r.bumpMap,o.aoMap=r.aoMap,o.map=r.map,o.displacementMap=r.displacementMap,o.emissiveMap=r.emissiveMap,o.normalMap=r.normalMap,o.envMap=r.envMap,o.alphaMap=r.alphaMap,o.metalness=r.reflectivity,o.vertexColors=r.vertexColors,r.shininess&&(o.roughness=1-Math.sqrt(r.shininess)/10),o.needsUpdate=!0),t===void 0?n.material=o:s[t]=o,!0}let Ld=!1;nk((...n)=>{var e;F()&&(e=pe.Current)!=null&&e.isInXR&&(wr(!0),Wb("error",...n))});function wr(n){if(n){if(Ld)return;Ld=!0,Ik()}else{if(!Ld)return;Ld=!1,Lk()}}const Jl={log:void 0,warn:void 0,error:void 0};class Ak{constructor(){a(this,"familyName","needle-xr"),a(this,"root",null),a(this,"context",null),a(this,"defaultFontSize",.06),a(this,"targetObject",new E),a(this,"userForwardViewPoint",new S),a(this,"oneEuroFilter",new og(90,.8)),a(this,"_lastElementRemoveTime",0),a(this,"onBeforeRender",()=>{var e,t;const s=(e=this.context)==null?void 0:e.mainCamera;if(this.context&&s instanceof we){const o=this.getRoot();Number.isNaN(o.position.x)&&o.position.set(0,0,0),Number.isNaN(o.quaternion.x)&&o.quaternion.set(0,0,0,1),this.context.scene.add(this.targetObject);const r=((t=this.context.xr)==null?void 0:t.rigScale)??1,l=3.5*r,c=s.worldForward;c.y=0,c.normalize().multiplyScalar(l),this.userForwardViewPoint.copy(s.worldPosition).sub(c),this.targetObject.position.distanceTo(this.userForwardViewPoint)>2*r&&(this.targetObject.position.copy(this.userForwardViewPoint),Yl(this.targetObject,s,!0,!0),this.targetObject.rotateY(Math.PI)),this.oneEuroFilter.filter(this.targetObject.position,o.position,this.context.time.time);const h=this.context.time.deltaTime;if(o.quaternion.slerp(this.targetObject.quaternion,h*5),o.scale.setScalar(r),this.targetObject.removeFromParent(),this.context.scene.add(o),this.context.time.time-this._lastElementRemoveTime>.1){this._lastElementRemoveTime=this.context.time.time;const d=Date.now();for(let u=0;u<this._activeTexts.length;u++){const p=this._activeTexts[u];if(p instanceof Re.Text&&d-p._activatedTime>2e4){p.removeFromParent(),this._textBuffer.push(p),this._activeTexts.splice(u,1);break}}}}}),a(this,"textOptions",{fontSize:this.defaultFontSize,fontFamily:this.familyName,padding:.03,margin:.005,color:0,backgroundColor:16777215,backgroundOpacity:.4,borderRadius:.03,offset:.025}),a(this,"_textBuffer",[]),a(this,"_activeTexts",[]),this.ensureFont()}onEnable(){this.context=pe.Current||pe.All[0],this.context.pre_render_callbacks.push(this.onBeforeRender)}onDisable(){var e,t,s;(t=this.context)==null||t.pre_render_callbacks.splice((e=this.context)==null?void 0:e.pre_render_callbacks.indexOf(this.onBeforeRender),1),(s=this.root)==null||s.removeFromParent()}addLog(e,t){const s=this.getRoot(),o=this.getText();let r=16777215,l=0;switch(e){case"log":r=16777215,l=0;break;case"warn":r=16772761,l=4465152;break;case"error":r=16755370,l=7798784;break}t.length>1e3&&(t=t.substring(0,1e3)+"...");const c=new Date().toISOString().split("T")[1].split(".")[0];o.textContent="["+c+"] "+t,o.visible=!0,o._activatedTime=Date.now(),s.add(o),this._activeTexts.push(o),this.context&&this.context.scene.add(s),o.set({backgroundColor:r,color:l}),Re.update()}ensureFont(){let e=Re.FontLibrary.getFontFamily(this.familyName);if(!e){e=Re.FontLibrary.addFontFamily(this.familyName);const t=e.addVariant("normal","normal","./include/needle/arial-msdf.json","./include/needle/arial.png");t?.addEventListener("ready",()=>{Re.update()})}}getText(){const e=this.getRoot();if(this._textBuffer.length>0){const s=this._textBuffer.pop();return s.visible=!0,setTimeout(()=>this.disableDepthTestRecursive(s),100),s}if(e.children.length>20&&this._activeTexts.length>0)return this._activeTexts.shift();const t=new Re.Text(this.textOptions);return setTimeout(()=>this.disableDepthTestRecursive(t),500),setTimeout(()=>this.disableDepthTestRecursive(t),1500),t}disableDepthTestRecursive(e,t=0){for(let o=0;o<e.children.length;o++){const r=e.children[o];r instanceof E&&this.disableDepthTestRecursive(r,t+1)}e.renderOrder=10*t,e.layers.set(2);const s=e.material;s&&(s.depthWrite=!1,s.depthTest=!1,s.transparent=!0),t===0&&Re.update()}getRoot(){if(this.root)return this.root;const e=this.defaultFontSize,t={boxSizing:"border-box",fontFamily:this.familyName,width:"2.6",fontSize:e,color:0,lineHeight:1,backgroundColor:16777215,backgroundOpacity:0,whiteSpace:"pre-wrap",flexDirection:"column-reverse"};return this.root=new Re.Block(t),this.root}}let _s=null;function Ik(){_s||(_s=new Ak),_s.onEnable();for(const n in Jl){Jl[n]=console[n];let e=!1;console[n]=function(){var t;if((t=Jl[n])==null||t.apply(console,arguments),!e)try{e=!0,Wb(n,...arguments)}finally{e=!1}}}}function Lk(){_s?.onDisable();for(const n in Jl)console[n]=Jl[n]}const ec=new Map;function Wb(n,...e){try{switch(ec.clear(),n){case"log":_s?.addLog("log",t());break;case"warn":_s?.addLog("warn",t());break;case"error":_s?.addLog("error",t());break}}catch(r){console.error("Error in spatial console",r)}finally{ec.clear()}function t(){let r="";for(let l=0;l<e.length;l++){const c=e[l];r+=s(c),l<e.length-1&&(r+=", ")}return r}function s(r,l=0){if(typeof r=="string")return'"'+r+'"';if(typeof r=="number"){if(r%1!==0){const c=r.toFixed(5),h=c.indexOf(".");let d=c.length-1;for(;d>h&&c[d]==="0";)d--;return c.substring(0,d+1)}return r.toString()}else if(Array.isArray(r)){let c="[";for(let h=0;h<r.length;h++){const d=r[h];c+=s(d,l+1),h<r.length-1&&(c+=", ")}return c+="]",c}else{if(r===null)return"null";if(r===void 0)return"undefined";if(typeof r=="function")return r.name+"()"}if(r instanceof re)return`(${s(r.x)}, ${s(r.y)})`;if(r instanceof S)return`(${s(r.x)}, ${s(r.y)}, ${s(r.z)})`;if(r instanceof fe)return`(${s(r.x)}, ${s(r.y)}, ${s(r.z)}, ${s(r.w)})`;if(r instanceof V)return`(${s(r.x)}, ${s(r.y)}, ${s(r.z)}, ${s(r.w)})`;if(r instanceof Pe||r instanceof je)return r.name;if(r instanceof Mv)return`[${r.elements.join(", ")}]`;if(r instanceof se)return`[${r.elements.join(", ")}]`;if(r instanceof uo)return r.mask.toString();if(typeof r=="object"){if(ec.has(r))return"*";let c=`{
|
|
83
|
+
`;c+=o(l);const h=Object.keys(r);let d="";for(let u=0;u<h.length;u++){const p=h[u],g=r[p];if(ec.has(g)){d+="";continue}ec.set(g,!0),d+=p+":"+s(g,l+1),u<h.length-1&&(d+=", "),d.length>=60&&(d+=`
|
|
84
|
+
`,d+=o(l),c+=d,d="")}return c+=d,c+=`
|
|
85
|
+
}`,c}return r}function o(r){let l="";for(let c=0;c<r;c++)l+=" ";return l}}const jk=C("nodevlogs");function De(n,e=ki.Log){Hs(e,n)}function be(n){De(n,ki.Warn)}function tc(n){De(n,ki.Error)}let fg,yg;function F(){if(jk)return!1;if(fg!==void 0)return fg;if(yg!==void 0)return yg;let n=Xt();return n||(n=window.location.hostname.endsWith(".local-credentialless.webcontainer.io")),yg=n,n}function Dk(n){fg=n}let ni,Ki=null,qs=null,ic=!1,Vb=null;const $b="terminal",sc=C("console"),Bk=C("noerrors")||C("noconsole")||window.crossOriginIsolated;if(sc&&bg(),!Bk&&(sc||Xt())){if(Xt()&&!sc){const e=new URL(window.location.href);e.searchParams.set("console","1"),console.log('\u{1F335} Tip: You can add the "?console" query parameter to the url to show the debug console (on mobile it will automatically open in the bottom right corner when your get errors during development. In VR a spatial console will appear.)',`
|
|
86
|
+
Open this page to get the console: `+e.toString())}const n=X.isMobileDevice()||X.isQuest()&&F();if((n||sc)&&(ak(),Gb(),Xb(!0),n)){const e=document.querySelector("needle-engine");e?.addEventListener("enter-ar",()=>{(sc||ni||tg()>0)&&C("noerrors")}),e?.addEventListener("exit-ar",()=>{Nk()})}}const vg=Symbol("consoleParent");function bg(){if(ni){ni.showSwitch();return}Xb()}function Hb(){ni&&(ni.hide(),ni.hideSwitch())}function Gb(){Vb||(Vb=setInterval(Fk,500))}let qb=0;function Fk(){const n=tg(),e=n!==qb;qb=n,e&&Uk()}function Uk(){bg(),qs&&(qs.setAttribute("error","true"),qs.innerText="\u{1F92C}")}function zk(){qs&&(qs.removeAttribute("error"),qs.innerText=$b)}function Nk(){Ki&&Ki[vg]&&Ki[vg].appendChild(Ki)}function Xb(n=!1){if(ni!==void 0||ic)return;ic=!0;const e=document.createElement("script");e.onload=()=>{if(!globalThis.VConsole){console.warn("\u{1F335} Debug console failed to load."),ic=!1,ni=null;return}ic=!1,Gb(),ni=new VConsole({pluginOrder:["default","needle-console"]});const t=globalThis["needle:codegen_files"];if(t&&t.length>0&&ni.addPlugin(Wk()),Ki=$k(),Ki&&(Ki[vg]=Ki.parentElement,Ki.style.position="absolute",Ki.style.zIndex=Number.MAX_SAFE_INTEGER.toString()),ni.setSwitchPosition(20,30),qs=Vk(),qs){qs.innerText=$b,qs.addEventListener("click",zk);const s=document.createElement("style"),o=40;s.innerHTML=`
|
|
87
|
+
#__vconsole .vc-switch {
|
|
88
|
+
border: 1px solid rgba(255, 255, 255, .1);
|
|
89
|
+
border-radius: 50%;
|
|
90
|
+
width: ${o}px;
|
|
91
|
+
height: ${o}px;
|
|
92
|
+
padding: 0;
|
|
93
|
+
line-height: ${o}px;
|
|
94
|
+
font-size: ${o*.4}px;
|
|
95
|
+
text-align: center;
|
|
96
|
+
background: #ffffff5c;
|
|
97
|
+
backdrop-filter: blur(16px);
|
|
98
|
+
-webkit-backdrop-filter: blur(16px);
|
|
99
|
+
user-select: none;
|
|
100
|
+
pointer-events: auto;
|
|
101
|
+
transition: transform .2s ease-in-out;
|
|
102
|
+
box-shadow: 0px 7px 0.5rem 0px rgb(0 0 0 / 6%), inset 0px 0px 1.3rem rgba(0,0,0,.05);
|
|
103
|
+
|
|
104
|
+
font-family: 'Material Symbols Outlined';
|
|
105
|
+
color: black;
|
|
106
|
+
font-size: 2.3em;
|
|
107
|
+
font-weight: 100;
|
|
108
|
+
}
|
|
109
|
+
#__vconsole .vc-switch:hover {
|
|
110
|
+
cursor: pointer;
|
|
111
|
+
transform: scale(1.1);
|
|
112
|
+
transition: transform .1s ease-in-out, background .1s linear;
|
|
113
|
+
background: rgba(245, 245, 245, .8);
|
|
114
|
+
outline: rgba(0, 0, 0, .05) 1px solid;
|
|
115
|
+
}
|
|
116
|
+
#__vconsole .vc-switch[error] {
|
|
117
|
+
background: rgba(255,0,0,.2);
|
|
118
|
+
animation: vconsole-notify 1s ease-in-out;
|
|
119
|
+
line-height: 35px;
|
|
120
|
+
}
|
|
121
|
+
@keyframes vconsole-notify {
|
|
122
|
+
from {
|
|
123
|
+
transform: scale(1, 1);
|
|
124
|
+
}
|
|
125
|
+
10% {
|
|
126
|
+
transform: scale(1.3, 1.3);
|
|
127
|
+
}
|
|
128
|
+
70% {
|
|
129
|
+
transform: scale(1.4, 1.4);
|
|
130
|
+
}
|
|
131
|
+
to {
|
|
132
|
+
transform: scale(1, 1);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
#__vconsole .vc-panel {
|
|
136
|
+
font-family: monospace;
|
|
137
|
+
font-size: 11px;
|
|
138
|
+
}
|
|
139
|
+
#__vconsole .vc-plugin-box.vc-actived {
|
|
140
|
+
height: 100%;
|
|
141
|
+
}
|
|
142
|
+
#__vconsole .vc-mask {
|
|
143
|
+
overflow: hidden;
|
|
144
|
+
}
|
|
145
|
+
`,Ki?.prepend(s),n===!0&&tg()<=0&&Hb(),console.log("\u{1F335} Debug console has loaded")}},e.onerror=()=>{console.warn("\u{1F335} Debug console failed to load."+(window.crossOriginIsolated?"This page is using cross-origin isolation, so external scripts can't be loaded.":"")),ic=!1,ni=null},e.src="https://cdn.jsdelivr.net/npm/vconsole@3.9.1/dist/vconsole.min.js",document.body.appendChild(e)}function Wk(){if(!globalThis.VConsole)return;const n=new VConsole.VConsolePlugin("needle-console","\u{1F335} Inspect glTF"),e=()=>document.querySelector("#__vc_plug_"+n._id+" iframe");return n.on("renderTab",function(t){const s=globalThis["needle:codegen_files"];if(!s||s.length===0)return;let o=globalThis["needle:codegen_files"][0];const r=o.indexOf("?");r>-1&&(o=o.substring(0,r));const l=location.protocol+"//"+location.host+location.pathname+"/"+o,c=encodeURIComponent(l);n.fullUrl="https://viewer.needle.tools?inspect&file="+c;var h='<iframe src="" style="width: 100%; height: 99%; border: none;"></iframe>';t(h)}),n.on("show",function(){const t=e();t&&t.src!==n.fullUrl&&(t.src=n.fullUrl)}),n.on("hide",function(){const t=e();t&&(t.src="")}),n.on("addTopBar",function(t){var s=new Array;s.push({name:"Open in new window \u2197",onClick:function(o){window.open(n.fullUrl,"_blank"),ni?.hide()}}),s.push({name:"Reload",onClick:function(o){const r=e();r&&(r.src=n.fullUrl)}}),s.push({name:"Fullscreen",onClick:function(o){const r=e();r.requestFullscreen?r.requestFullscreen():r.webkitRequestFullscreen instanceof Function&&r.webkitRequestFullscreen()}}),t(s)}),n}function Vk(){return document.querySelector("#__vconsole .vc-switch")||null}function $k(){return document.querySelector("#__vconsole")||null}const Qb=C("debugdefines");bo('if(!globalThis["NEEDLE_ENGINE_VERSION"]) globalThis["NEEDLE_ENGINE_VERSION"] = "0.0.0";'),bo('if(!globalThis["NEEDLE_ENGINE_GENERATOR"]) globalThis["NEEDLE_ENGINE_GENERATOR"] = "unknown";'),bo('if(!globalThis["NEEDLE_PROJECT_BUILD_TIME"]) globalThis["NEEDLE_PROJECT_BUILD_TIME"] = "unknown";'),bo('if(!globalThis["NEEDLE_PUBLIC_KEY"]) globalThis["NEEDLE_PUBLIC_KEY"] = "unknown";'),bo('globalThis["__NEEDLE_ENGINE_VERSION__"] = "4.7.0-alpha";'),bo('globalThis["__NEEDLE_ENGINE_GENERATOR__"] = "undefined";'),bo('globalThis["__NEEDLE_PROJECT_BUILD_TIME__"] = "Wed Jul 23 2025 15:46:31 GMT+0200 (Central European Summer Time)";'),bo('globalThis["__NEEDLE_PUBLIC_KEY__"] = "npk_74222a9fbd1b42572cdd3bf7f639eeb17a07d07f40a6185fac5f722e8fd34df9";');const ws="4.7.0-alpha",jd="undefined",_g="Wed Jul 23 2025 15:46:31 GMT+0200 (Central European Summer Time)";Qb&&console.log(`Engine version: ${ws} (generator: ${jd})
|
|
146
|
+
Project built at ${_g}`);const nc="npk_74222a9fbd1b42572cdd3bf7f639eeb17a07d07f40a6185fac5f722e8fd34df9",En="needle_isActiveInHierarchy",xr="builtin_components",oc="needle_editor_guid";function bo(n){try{(0,eval)(n)}catch(e){Qb&&console.error(e)}}let Yb,Kb=null;function xs(){return Yb}function wg(n){if(n==null){console.warn("Oh no: someone tried registering a non-existend gltf-loader. When you see this log it might mean that needle-engine is being imported multiple times. Please check your project setup.");return}Kb!==n&&(Kb=n,Yb=new n)}const Mi=Symbol("shadowDomOwner"),Hk=C("debugpatch");function Dd(n,e,t,s){const o=Hk===e;if(!t&&!s)return;const r=e+"___needle";qk(n,e,t,s);const l=Object.getOwnPropertyDescriptor(n,e),c=n[e];o&&console.log("Patch",n.constructor.name,e,l,c),l?(o&&console.log("Apply patch with existing descriptor",n.constructor.name,e,l),typeof l.value=="function"&&(n[e]=Jb(l.value,n,e))):(o&&console.log("Create patch with new property",n.constructor.name,e,l),Object.defineProperty(n,e,{set:function(h){if(typeof h=="function")this[r]=Jb(h,n,e);else{const d=this[r];e_(n,e,this,d,h),this[r]=h,t_(n,e,this,d,h)}},get:function(){const h=this[r];return typeof h=="function"&&h[r]?h[r]:h}}))}function Gk(n,e,t){const s=Sg(n,e);if(s)for(let o=s.length-1;o>=0;o--){const r=s[o];r.prefix===t&&(r.prefix=null),r.postfix===t&&(r.postfix=null),!r.prefix&&!r.postfix&&s.splice(o,1)}}const Zb=Symbol("Needle:Patches:WrappedFunction");function Jb(n,e,t){if(n[Zb])return n;const s=function(...o){e_(e,t,this,...o);const r=n.apply(this,o);return t_(e,t,this,r,...o),r};return s[Zb]=!0,s}const Bd="Needle:Patches";function xg(){return globalThis[Bd]||(globalThis[Bd]=new WeakMap),globalThis[Bd]}function Sg(n,e){const t=xg().get(n);return t?t.get(e):null}function qk(n,e,t,s){let o=xg().get(n);o||(o=new Map,xg().set(n,o));let r=o.get(e);r||(r=[],o.set(e,r)),r.push({prefix:t,postfix:s})}function e_(n,e,t,...s){var o;if(!t)return;const r=Sg(n,e);if(r)for(const l of r)(o=l.prefix)==null||o.call(t,...s)}function t_(n,e,t,s,...o){var r;if(!t)return;const l=Sg(n,e);if(l)for(const c of l)(r=c.postfix)==null||r.call(t,s,...o)}const Ea=[];function Fd(n){Ea.indexOf(n)===-1&&Ea.push(n)}function Xk(n){const e=Ea.indexOf(n);e!==-1&&Ea.splice(e,1)}const Aa=[];function Cg(n){Aa.indexOf(n)===-1&&Aa.push(n)}function Qk(n){const e=Aa.indexOf(n);e!==-1&&Aa.splice(e,1)}function i_(n){globalThis.dispatchEvent(new CustomEvent("needle-xrsession-start",{detail:n}));for(let e=0;e<Ea.length;e++)Ea[e](n)}function s_(n){globalThis.dispatchEvent(new CustomEvent("needle-xrsession-end",{detail:n}));for(let e=0;e<Aa.length;e++)Aa[e](n)}const ct=C("debuginput");var Ud=(n=>(n.Mouse="mouse",n.Touch="touch",n.Controller="controller",n.Hand="hand",n))(Ud||{}),Be=(n=>(n.PointerDown="pointerdown",n.PointerUp="pointerup",n.PointerMove="pointermove",n.KeyDown="keydown",n.KeyUp="keyup",n.KeyPressed="keypress",n))(Be||{});class An extends PointerEvent{constructor(e,t,s){super(e,s),a(this,"clientZ"),a(this,"deviceIndex"),a(this,"origin"),a(this,"source"),a(this,"mode"),a(this,"_ray"),a(this,"space"),a(this,"isClick",!1),a(this,"isDoubleClick",!1),a(this,"_used",!1),a(this,"_pointerid"),a(this,"_pointerType"),a(this,"_type"),a(this,"metadata",{}),a(this,"intersections",new Array),a(this,"_immediatePropagationStopped",!1),a(this,"_propagationStopped",!1),this.clientZ=s.clientZ,this._pointerid=s.pointerId,this._pointerType=s.pointerType,this._type=e,this.deviceIndex=s.deviceIndex,this.origin=s.origin,this.source=t,this.mode=s.mode,this._ray=s.ray,this.space=s.device}get isSpatial(){return this.mode!="screen"}get ray(){return this._ray||(this._ray=new po(this.space.worldPosition.clone(),this.space.worldForward.clone())),this._ray}set ray(e){this._ray=e}get hasRay(){return this._ray!==void 0}get used(){return this._used}use(){this._used=!0}get pointerId(){return this._pointerid}get pointerType(){return this._pointerType}get type(){return this._type}get immediatePropagationStopped(){return this._immediatePropagationStopped}get propagationStopped(){return this._immediatePropagationStopped||this._propagationStopped}stopImmediatePropagation(){var e;this._immediatePropagationStopped=!0,super.stopImmediatePropagation(),(e=this.source)==null||e.stopImmediatePropagation()}stopPropagation(){var e;this._propagationStopped=!0,super.stopPropagation(),(e=this.source)==null||e.stopPropagation(),ct&&console.warn("Stop propagation...",this.pointerId,this.pointerType)}}class rc extends KeyboardEvent{constructor(e,t,s){super(e,s),a(this,"source"),this.source=t}stopImmediatePropagation(){var e;super.stopImmediatePropagation(),(e=this.source)==null||e.stopImmediatePropagation()}}class Yk{constructor(e){a(this,"key"),a(this,"keyType"),a(this,"source"),this.key=e.key,this.keyType=e.type,this.source=e}}var oi=(n=>(n[n.Early=-100]="Early",n[n.Default=0]="Default",n[n.Late=100]="Late",n))(oi||{});class n_{constructor(e){a(this,"_eventListeners",{}),a(this,"_doubleClickTimeThreshold",.2),a(this,"_longPressTimeThreshold",1),a(this,"_setCursorTypes",[]),a(this,"context"),a(this,"_pointerDown",[!1]),a(this,"_pointerUp",[!1]),a(this,"_pointerClick",[!1]),a(this,"_pointerDoubleClick",[!1]),a(this,"_pointerPressed",[!1]),a(this,"_pointerPositions",[new re]),a(this,"_pointerPositionsLastFrame",[new re]),a(this,"_pointerPositionsDelta",[new re]),a(this,"_pointerPositionsRC",[new re]),a(this,"_pointerPositionDown",[new S]),a(this,"_pointerDownTime",[]),a(this,"_pointerUpTime",[]),a(this,"_pointerUpTimestamp",[]),a(this,"_pointerIds",[]),a(this,"_pointerTypes",[""]),a(this,"_mouseWheelChanged",[!1]),a(this,"_mouseWheelDeltaY",[0]),a(this,"_pointerEvent",[]),a(this,"_pointerEventsPressed",[]),a(this,"_pointerSpace",[]),a(this,"_pressedStack",new Map),a(this,"_htmlEventSource"),a(this,"onLostFocus",()=>{for(const t in this.keysPressed)this.keysPressed[t].pressed=!1}),a(this,"_receivedPointerMoveEventsThisFrame",new Array),a(this,"onEndOfFrame",()=>{this._receivedPointerMoveEventsThisFrame.length=0;for(let t=0;t<this._pointerUp.length;t++)this._pointerUp[t]=!1;for(let t=0;t<this._pointerDown.length;t++)this._pointerDown[t]=!1;for(let t=0;t<this._pointerClick.length;t++)this._pointerClick[t]=!1;for(let t=0;t<this._pointerDoubleClick.length;t++)this._pointerDoubleClick[t]=!1;for(const t of this._pointerPositionsDelta)t.set(0,0);for(let t=0;t<this._mouseWheelChanged.length;t++)this._mouseWheelChanged[t]=!1;for(let t=0;t<this._mouseWheelDeltaY.length;t++)this._mouseWheelDeltaY[t]=0}),a(this,"onContextMenu",t=>{this.canReceiveInput(t)!==!1&&t instanceof PointerEvent&&t.pointerType}),a(this,"keysPressed",{}),a(this,"onKeyDown",t=>{if(ct&&console.log(`key down ${t.code}, ${this.context.application.hasFocus}`,t),!this.context.application.hasFocus)return;const s=this.keysPressed[t.code];if(s&&s.pressed)return;this.keysPressed[t.code]={pressed:!0,frame:this.context.time.frameCount+1,startFrame:this.context.time.frameCount+1,key:t.key,code:t.code};const o=new rc("keydown",t,t);this.onDispatchEvent(o)}),a(this,"onKeyPressed",t=>{if(!this.context.application.hasFocus)return;const s=this.keysPressed[t.code];if(!s)return;s.pressed=!0,s.frame=this.context.time.frameCount+1;const o=new rc("keypress",t,t);this.onDispatchEvent(o)}),a(this,"onKeyUp",t=>{if(!this.context.application.hasFocus)return;const s=this.keysPressed[t.code];if(!s)return;s.pressed=!1,s.frame=this.context.time.frameCount+1;const o=new rc("keyup",t,t);this.onDispatchEvent(o)}),a(this,"onWheelWindow",t=>{document.pointerLockElement&&this.onMouseWheel(t)}),a(this,"onMouseWheel",t=>{if(this.canReceiveInput(t)===!1)return;this._mouseWheelDeltaY.length<=0&&this._mouseWheelDeltaY.push(0),this._mouseWheelChanged.length<=0&&this._mouseWheelChanged.push(!1),this._mouseWheelChanged[0]=!0;const s=this._mouseWheelDeltaY[0];this._mouseWheelDeltaY[0]=s+t.deltaY}),a(this,"onPointerDown",t=>{if(this.context.isInAR||this.canReceiveInput(t)===!1)return;t.target instanceof HTMLElement&&t.target.setPointerCapture(t.pointerId);const s=this.getPointerId(t);ct&&De(`pointer down #${s}, identifier:${t.pointerId}`);const o=this.getAndUpdateSpatialObjectForScreenPosition(s,t.clientX,t.clientY),r=new An("pointerdown",t,{origin:this,mode:"screen",deviceIndex:0,pointerId:s,button:t.button,clientX:t.clientX,clientY:t.clientY,pointerType:t.pointerType,buttonName:this.getButtonName(t),device:o,pressure:t.pressure});this.onDown(r)}),a(this,"onPointerMove",t=>{if(this.context.isInAR||this._receivedPointerMoveEventsThisFrame.includes(t.pointerId))return;this._receivedPointerMoveEventsThisFrame.push(t.pointerId);let s=t.button;t.pointerType==="mouse"&&(s=this.getFirstPressedButtonForPointer(0)??0);const o=this.getPointerId(t,s);s===-1&&(s=o);const r=this.getAndUpdateSpatialObjectForScreenPosition(o,t.clientX,t.clientY),l=new An("pointermove",t,{origin:this,mode:"screen",deviceIndex:0,pointerId:o,button:s,clientX:t.clientX,clientY:t.clientY,pointerType:t.pointerType,buttonName:this.getButtonName(t),device:r,pressure:t.pressure});this.onMove(l)}),a(this,"onPointerCancel",t=>{this.context.isInAR||(ct&&console.log("Pointer cancel",t),this.onPointerUp(t))}),a(this,"onPointerUp",t=>{if(this.context.isInAR)return;t.target instanceof HTMLElement&&t.target.releasePointerCapture(t.pointerId);const s=this.getPointerId(t),o=new An("pointerup",t,{origin:this,mode:"screen",deviceIndex:0,pointerId:s,button:t.button,clientX:t.clientX,clientY:t.clientY,pointerType:t.pointerType,buttonName:this.getButtonName(t),device:this.getAndUpdateSpatialObjectForScreenPosition(s,t.clientX,t.clientY),pressure:t.pressure});this.onUp(o),this._pointerIds[s]=-1,ct&&console.log("ID="+s,"PointerId="+t.pointerId,"ALL:",[...this._pointerIds])}),a(this,"onTouchStart",t=>{if(this.context.isInAR)for(let s=0;s<t.changedTouches.length;s++){const o=t.changedTouches[s],r=this.getPointerIndex(o.identifier),l=this.getAndUpdateSpatialObjectForScreenPosition(r,o.clientX,o.clientY),c=new An("pointerdown",t,{origin:this,mode:"screen",deviceIndex:0,pointerId:r,button:0,clientX:o.clientX,clientY:o.clientY,pointerType:"touch",buttonName:"unknown",device:l,pressure:o.force});this.onDown(c)}}),a(this,"onTouchMove",t=>{if(this.context.isInAR)for(let s=0;s<t.changedTouches.length;s++){const o=t.changedTouches[s],r=this.getPointerIndex(o.identifier),l=this.getAndUpdateSpatialObjectForScreenPosition(r,o.clientX,o.clientY),c=new An("pointermove",t,{origin:this,mode:"screen",deviceIndex:0,pointerId:r,button:0,clientX:o.clientX,clientY:o.clientY,pointerType:"touch",buttonName:"unknown",device:l,pressure:o.force});this.onMove(c)}}),a(this,"onTouchEnd",t=>{if(this.context.isInAR)for(let s=0;s<t.changedTouches.length;s++){const o=t.changedTouches[s],r=this.getPointerIndex(o.identifier),l=new An("pointerup",t,{origin:this,mode:"screen",deviceIndex:0,pointerId:r,button:0,clientX:o.clientX,clientY:o.clientY,pointerType:"touch",buttonName:"unknown",device:this.getAndUpdateSpatialObjectForScreenPosition(r,o.clientX,o.clientY),pressure:o.force});this.onUp(l),this._pointerIds[r]=-1}}),a(this,"tempNearPlaneVector",new S),a(this,"tempFarPlaneVector",new S),a(this,"tempLookMatrix",new se),this.context=e,this.context.post_render_callbacks.push(this.onEndOfFrame)}addEventListener(e,t,s){if(this._eventListeners[e]||(this._eventListeners[e]=[]),!t||typeof t!="function"){console.error("Invalid call to addEventListener: callback is required and must be a function!");return}s?s={...s}:s={};let o=0;s?.queue!=null&&(o=s.queue);const r=this._eventListeners[e],l=r.find(c=>c.priority===o);l?l.listeners.push({callback:t,options:s}):(r.push({priority:o,listeners:[{callback:t,options:s}]}),r.sort((c,h)=>c.priority-h.priority))}removeEventListener(e,t,s){if(!this._eventListeners[e]||!t)return;const o=this._eventListeners[e];if(s?.queue!=null){const r=o.find(c=>c.priority===s.queue);if(!r)return;const l=r.listeners.findIndex(c=>c.callback===t);l>=0&&r.listeners.splice(l,1)}else for(const r of o){const l=r.listeners.findIndex(c=>c.callback===t);l>=0&&r.listeners.splice(l,1)}}dispatchEvent(e){var t,s,o,r;let l=!1;if(e instanceof rc){const c=this._eventListeners[e.type];if(c)for(const h of c)for(let d=0;d<h.listeners.length;d++){const u=h.listeners[d];if((s=(t=u.options)==null?void 0:t.signal)!=null&&s.aborted){h.listeners.splice(d,1),d--;continue}u.options.once&&(h.listeners.splice(d,1),d--),u.callback(e)}}if(e instanceof An){const c=this._eventListeners[e.type];if(c)for(const h of c){if(l)break;for(let d=0;d<h.listeners.length;d++){const u=h.listeners[d];if((r=(o=u.options)==null?void 0:o.signal)!=null&&r.aborted){h.listeners.splice(d,1),d--;continue}if(e.immediatePropagationStopped){l=!0,ct&&console.log("immediatePropagationStopped",e.type);break}else e.propagationStopped&&(l=!0,ct&&console.log("propagationStopped",e.type));u.options.once&&(h.listeners.splice(d,1),d--),u.callback(e)}}}}get mousePosition(){return this._pointerPositions[0]}get mousePositionRC(){return this._pointerPositionsRC[0]}get mouseDown(){return this._pointerDown[0]}get mouseUp(){return this._pointerUp[0]}get mouseClick(){return this._pointerClick[0]}get mouseDoubleClick(){return this._pointerDoubleClick[0]}get mousePressed(){return this._pointerPressed[0]}get mouseWheelChanged(){return this.getMouseWheelChanged(0)}get click(){return this._pointerClick[0]}get doubleClick(){return this._pointerDoubleClick[0]}getGamepad(e=0){return typeof navigator<"u"&&"getGamepads"in navigator&&navigator.getGamepads()[e]||null}setCursorPointer(){this.setCursor("pointer")}setCursorNormal(){this.unsetCursor("pointer")}setCursor(e){this._setCursorTypes.push(e),this._setCursorTypes.length>10&&this._setCursorTypes.shift(),this.updateCursor()}unsetCursor(e){for(let t=this._setCursorTypes.length-1;t>=0;t--)if(this._setCursorTypes[t]===e){this._setCursorTypes.splice(t,1),this.updateCursor();break}}updateCursor(){var e;((e=this._setCursorTypes)==null?void 0:e.length)==0?this.context.domElement.style.cursor="default":this.context.domElement.style.cursor=this._setCursorTypes[this._setCursorTypes.length-1]}getIsPointerIdInUse(e){for(const t of this._pointerEventsPressed)if(t.pointerId===e&&t.used)return!0;return!1}getPointerPressedCount(){let e=0;for(let t=0;t<this._pointerPressed.length;t++)this._pointerPressed[t]&&e++;return e}getPointerPosition(e){return e>=this._pointerPositions.length?null:this._pointerPositions[e]}getPointerPositionLastFrame(e){return e>=this._pointerPositionsLastFrame.length?null:this._pointerPositionsLastFrame[e]}getPointerPositionDelta(e){return e>=this._pointerPositionsDelta.length?null:this._pointerPositionsDelta[e]}getPointerPositionRC(e){return e>=this._pointerPositionsRC.length?null:this._pointerPositionsRC[e]}getPointerDown(e){return e>=this._pointerDown.length?!1:this._pointerDown[e]}getPointerUp(e){return e>=this._pointerUp.length?!1:this._pointerUp[e]}getPointerPressed(e){return e>=this._pointerPressed.length?!1:this._pointerPressed[e]}getPointerClicked(e){return e>=this._pointerClick.length?!1:this._pointerClick[e]}getPointerDoubleClicked(e){return e>=this._pointerDoubleClick.length?!1:this._pointerDoubleClick[e]}getPointerDownTime(e){return e>=this._pointerDownTime.length?-1:this._pointerDownTime[e]}getPointerUpTime(e){return e>=this._pointerUpTime.length?-1:this._pointerUpTime[e]}getPointerLongPress(e){return e>=this._pointerDownTime.length?!1:this.getPointerPressed(e)&&this.context.time.time-this._pointerDownTime[e]>this._longPressTimeThreshold}getIsMouse(e){return e<0||e>=this._pointerTypes.length?!1:this._pointerTypes[e]==="mouse"}getIsTouch(e){return e<0||e>=this._pointerTypes.length?!1:this._pointerTypes[e]==="touch"}getTouchesPressedCount(){let e=0;for(let t=0;t<this._pointerPressed.length;t++)this._pointerPressed[t]&&this.getIsTouch(t)&&e++;return e}getMouseWheelChanged(e=0){return e>=this._mouseWheelChanged.length?!1:this._mouseWheelChanged[e]}getMouseWheelDeltaY(e=0){return e>=this._mouseWheelDeltaY.length?0:this._mouseWheelDeltaY[e]}getPointerEvent(e){if(!(e>=this._pointerEvent.length))return this._pointerEvent[e]??void 0}*foreachPointerId(e){for(let t=0;t<this._pointerTypes.length;t++)if(this._pointerIsActive(t)){if(e!==void 0){const s=this._pointerTypes[t];if(Array.isArray(e)){let o=!1;for(const r of e)if(s===r){o=!0;break}if(!o)continue}else if(e!==s)continue}yield t}}*foreachTouchId(){for(let e=0;e<this._pointerTypes.length;e++)this._pointerTypes[e]==="touch"&&this._pointerIsActive[e]&&(yield e)}_pointerIsActive(e){return e<0?!1:this._pointerPressed[e]||this._pointerDown[e]||this._pointerUp[e]}onDownButton(e,t){let s=this._pressedStack.get(e);s||(s=[],this._pressedStack.set(e,s)),s.push(t)}onReleaseButton(e,t){const s=this._pressedStack.get(e);if(!s)return;const o=s.indexOf(t);o>=0&&s.splice(o,1)}getFirstPressedButtonForPointer(e){const t=this._pressedStack.get(e);if(t)return t[0]}getLatestPressedButtonForPointer(e){const t=this._pressedStack.get(e);if(t)return t[t.length-1]}getKeyDown(e){if(e!==void 0)return this.isKeyDown(e);for(const t in this.keysPressed){const s=this.keysPressed[t];if(s.startFrame===this.context.time.frameCount)return s.key}return null}getKeyPressed(e){if(e!==void 0)return this.isKeyPressed(e);for(const t in this.keysPressed){const s=this.keysPressed[t];if(s.pressed)return s.key}return null}getKeyUp(e){if(e!==void 0)return this.isKeyUp(e);for(const t in this.keysPressed){const s=this.keysPressed[t];return s.pressed===!1&&s.frame===this.context.time.frameCount}return null}isKeyDown(e){if(!this.context.application.isVisible||!this.context.application.hasFocus)return!1;const t=this.getCodeForCommonKeyName(e);if(t!==null){for(const o of t)if(this.isKeyDown(o))return!0;return!1}const s=this.keysPressed[e];return s?s.startFrame===this.context.time.frameCount&&s.pressed:!1}isKeyUp(e){if(!this.context.application.isVisible||!this.context.application.hasFocus)return!1;const t=this.getCodeForCommonKeyName(e);if(t!==null){for(const o of t)if(this.isKeyUp(o))return!0;return!1}const s=this.keysPressed[e];return s?s.frame===this.context.time.frameCount&&s.pressed===!1:!1}isKeyPressed(e){if(!this.context.application.isVisible||!this.context.application.hasFocus)return!1;const t=this.getCodeForCommonKeyName(e);if(t!==null){for(const o of t)if(this.isKeyPressed(o))return!0;return!1}const s=this.keysPressed[e];return s&&s.pressed||!1}getCodeForCommonKeyName(e){if(e.length===1){if(e>="0"&&e<="9")return["Digit"+e];if(e>="a"&&e<="z")return["Key"+e.toUpperCase()];if(e==" ")return["Space"]}switch(e){case"shift":case"Shift":return["ShiftLeft","ShiftRight"];case"control":case"Control":return["ControlLeft","ControlRight"];case"alt":case"Alt":return["AltLeft","AltRight"]}return null}createInputEvent(e){switch(e.type){case"pointerdown":ct&&De("Create Pointer down"),this.onDownButton(e.deviceIndex,e.button),this.onDown(e);break;case"pointermove":ct&&De("Create Pointer move"),this.onMove(e);break;case"pointerup":ct&&De("Create Pointer up"),this.onUp(e),this.onReleaseButton(e.deviceIndex,e.button);break}}convertScreenspaceToRaycastSpace(e){return e.x=(e.x-this.context.domX)/this.context.domWidth*2-1,e.y=-((e.y-this.context.domY)/this.context.domHeight)*2+1,e}bindEvents(){this.unbindEvents(),this._htmlEventSource=this.context.renderer.domElement,window.addEventListener("contextmenu",this.onContextMenu),this._htmlEventSource.addEventListener("pointerdown",this.onPointerDown,{passive:!0}),window.addEventListener("pointermove",this.onPointerMove,{passive:!0,capture:!0}),window.addEventListener("pointerup",this.onPointerUp,{passive:!0}),window.addEventListener("pointercancel",this.onPointerCancel,{passive:!0}),window.addEventListener("touchstart",this.onTouchStart,{passive:!0}),window.addEventListener("touchmove",this.onTouchMove,{passive:!0}),window.addEventListener("touchend",this.onTouchEnd,{passive:!0}),this._htmlEventSource.addEventListener("wheel",this.onMouseWheel,{passive:!0}),window.addEventListener("wheel",this.onWheelWindow,{passive:!0}),window.addEventListener("keydown",this.onKeyDown,!1),window.addEventListener("keypress",this.onKeyPressed,!1),window.addEventListener("keyup",this.onKeyUp,!1),window.addEventListener("blur",this.onLostFocus)}unbindEvents(){var e,t;window.removeEventListener("contextmenu",this.onContextMenu),(e=this._htmlEventSource)==null||e.removeEventListener("pointerdown",this.onPointerDown),window.removeEventListener("pointermove",this.onPointerMove),window.removeEventListener("pointerup",this.onPointerUp),window.removeEventListener("pointercancel",this.onPointerCancel),window.removeEventListener("touchstart",this.onTouchStart),window.removeEventListener("touchmove",this.onTouchMove),window.removeEventListener("touchend",this.onTouchEnd),(t=this._htmlEventSource)==null||t.removeEventListener("wheel",this.onMouseWheel,!1),window.removeEventListener("wheel",this.onWheelWindow,!1),window.removeEventListener("keydown",this.onKeyDown,!1),window.removeEventListener("keypress",this.onKeyPressed,!1),window.removeEventListener("keyup",this.onKeyUp,!1),window.removeEventListener("blur",this.onLostFocus)}dispose(){const e=this.context.post_render_callbacks.indexOf(this.onEndOfFrame);e>=0&&this.context.post_render_callbacks.splice(e,1),this.unbindEvents()}canReceiveInput(e){var t;return e.target===((t=this.context.renderer)==null?void 0:t.domElement)||e.target===this.context.domElement||this.context.isInAR||this.context.isInAR&&e.target===document.body&&X.isMozillaXR()?!0:(ct&&console.warn("CanReceiveInput:False for",e.target),!1)}getPointerId(e,t){return e.pointerType==="mouse"?0+(t??e.button):this.getPointerIndex(e.pointerId)}getButtonName(e){const t=e.button;if(e.pointerType==="mouse")switch(t){case 0:return"left";case 1:return"middle";case 2:return"right"}return"unknown"}getAndUpdateSpatialObjectForScreenPosition(e,t,s){let o=this._pointerSpace[e];o||(o=new E,this._pointerSpace[e]=o),this._pointerSpace[e]=o;const r=this.context.mainCamera;if(r){const l=this.tempNearPlaneVector.set(t,s,-1);this.convertScreenspaceToRaycastSpace(l);const c=this.tempFarPlaneVector.set(l.x,l.y,1);l.unproject(r),c.unproject(r);const h=r.worldUp||q(0,1,0).applyQuaternion(Se(r));this.tempLookMatrix.lookAt(c,l,h),o.position.set(l.x,l.y,l.z),o.quaternion.setFromRotationMatrix(this.tempLookMatrix)}return o}isInRect(e){if(this.context.isInXR)return!0;const t=this.context.domElement.getBoundingClientRect(),s=e.clientX,o=e.clientY,r=s>=t.x&&s<=t.right&&o>=t.y&&o<=t.bottom;return ct&&!r&&console.log("Not in rect",t,s,o),r}onDown(e){const t=e.pointerId;if(this.getPointerPressed(t)&&console.warn(`Received pointerDown for pointerId that is already pressed: ${t}`,ct?e:""),ct&&console.log(e.pointerType,"DOWN",t),!!this.isInRect(e)){for(this.setPointerState(t,this._pointerPressed,!0),this.setPointerState(t,this._pointerDown,!0),this.setPointerStateT(t,this._pointerEvent,e.source);t>=this._pointerTypes.length;)this._pointerTypes.push(e.pointerType);for(this._pointerTypes[t]=e.pointerType;t>=this._pointerPositionDown.length;)this._pointerPositionDown.push(new S);for(this._pointerPositionDown[t].set(e.clientX,e.clientY,e.clientZ??0);t>=this._pointerPositions.length;)this._pointerPositions.push(new re);this._pointerPositions[t].set(e.clientX,e.clientY),t>=this._pointerDownTime.length&&this._pointerDownTime.push(0),this._pointerDownTime[t]=this.context.time.realtimeSinceStartup,this.updatePointerPosition(e),this._pointerEventsPressed.push(e),this.onDispatchEvent(e)}}onMove(e){const t=e.pointerId,s=this.getPointerPressed(t);s===!1&&!this.isInRect(e)||e.pointerType==="touch"&&!s||(this.updatePointerPosition(e),this.setPointerStateT(t,this._pointerEvent,e.source),this.onDispatchEvent(e))}onUp(e){const t=e.pointerId;if(!this.getPointerPressed(t)){ct&&console.log(e.pointerType,"UP",t,"was not down");return}ct&&console.log(e.pointerType,"UP",t),this.setPointerState(t,this._pointerPressed,!1),this.setPointerStateT(t,this._pointerEvent,e.source),this.setPointerState(t,this._pointerUp,!0),this.updatePointerPosition(e);for(let c=this._pointerEventsPressed.length-1;c>=0;c--)if(this._pointerEventsPressed[c].pointerId===t){this._pointerEventsPressed.splice(c,1);break}if(!this._pointerPositionDown[t]){ct&&be("Received pointer up event without matching down event for button: "+t),console.warn("Received pointer up event without matching down event for button: "+t);return}const s=this._pointerUpTime[t],o=this._pointerDownTime[t],r=this.context.time.realtimeSinceStartup,l=r-o;if(t>=this._pointerUpTime.length&&this._pointerUpTime.push(-99),this._pointerUpTime[t]=r,l<1){let c=e.clientX-this._pointerPositionDown[t].x,h=e.clientY-this._pointerPositionDown[t].y,d=0;if(e.isSpatial&&e.clientZ!=null&&(d=e.clientZ-this._pointerPositionDown[t].z,c*=200,h*=200,d*=200),Math.abs(c)<5&&Math.abs(h)<5&&Math.abs(d)<5){this.setPointerState(t,this._pointerClick,!0),e.isClick=!0;const u=r-s;ct&&console.log("CLICK",t,c,h,d,u),u<this._doubleClickTimeThreshold&&u>0&&(this.setPointerState(t,this._pointerDoubleClick,!0),e.isDoubleClick=!0)}}this.onDispatchEvent(e)}updatePointerPosition(e){const t=e.pointerId;for(;t>=this._pointerPositions.length;)this._pointerPositions.push(new re);for(;t>=this._pointerPositionsLastFrame.length;)this._pointerPositionsLastFrame.push(new re);for(;t>=this._pointerPositionsDelta.length;)this._pointerPositionsDelta.push(new re);const s=this._pointerPositionsLastFrame[t];s.copy(this._pointerPositions[t]);const o=this._pointerPositionsDelta[t];let r=e.clientX-s.x,l=e.clientY-s.y;if(e.source instanceof MouseEvent||e.source instanceof TouchEvent){const u=e.source;r===0&&u.movementX!==0&&(r=u.movementX||0),l===0&&u.movementY!==0&&(l=u.movementY||0)}o.x+=r,o.y+=l,this._pointerPositions[t].x=e.clientX,this._pointerPositions[t].y=e.clientY;const c=e.clientX,h=e.clientY;for(;t>=this._pointerPositionsRC.length;)this._pointerPositionsRC.push(new re);const d=this._pointerPositionsRC[t];d.set(c,h),this.convertScreenspaceToRaycastSpace(d)}getPointerIndex(e){let t=-1;for(let s=0;s<this._pointerIds.length;s++){if(this._pointerIds[s]===e)return s;t===-1&&this._pointerIds[s]===-1&&(t=s)}return t!==-1?(this._pointerIds[t]=e,t):(ct&&console.log("PUSH pointerId:",e),this._pointerIds.push(e),this._pointerIds.length-1)}setPointerState(e,t,s){t[e]=s}setPointerStateT(e,t,s){return t[e]=s,s}onDispatchEvent(e){const t=J.Current;try{J.Current=this.context,this.dispatchEvent(e)}finally{J.Current=t}}}const Ia=new se().makeRotationY(Math.PI),Zi=new V().setFromAxisAngle(new S(0,1,0),Math.PI),Kk=C("debugwebxr");class Zk{constructor(){if(a(this,"priority",-1e5),a(this,"gameObject"),this.gameObject=new E,this.gameObject.name="Implicit XR Rig",Kk){const e=Vg(16733661);e.position.y+=.5,this.gameObject.add(e)}}isXRRig(){return!0}get isActive(){return this.gameObject.visible}}const In=C("debugwebxr"),zd=C("debugcustomgesture"),Jk="https://cdn.jsdelivr.net/npm/@webxr-input-profiles/assets@1.0/dist/profiles",eM="generic-trigger",tM=new V().setFromEuler(new Dt(Cn.degToRad(0),Cn.degToRad(-90),Cn.degToRad(-90))),iM=new S(.04,-.04,0);class Pg{constructor(e,t,s){a(this,"xr"),a(this,"inputSource"),a(this,"index",0),a(this,"emitEvents",!0),a(this,"_connected",!0),a(this,"_isTracking",!1),a(this,"__gamepad"),a(this,"__hand"),a(this,"__side"),a(this,"_hitTestSource"),a(this,"_hasSelectEvent",!1),a(this,"_isMxInk",!1),a(this,"_isMetaQuestTouchController",!1),a(this,"_handJointPoses",new Map),a(this,"_gripMatrix",new se),a(this,"_gripPosition",new S),a(this,"_gripQuaternion",new V),a(this,"_linearVelocity",new S),a(this,"_rayPositionRaw",new S),a(this,"_rayRotationRaw",new V),a(this,"_rayMatrix",new se),a(this,"_rayPosition",new S),a(this,"_rayQuaternion",new V),a(this,"_gripWorldPosition",new S),a(this,"_gripWorldQuaternion",new V),a(this,"_rayWorldPosition",new S),a(this,"_rayWorldQuaternion",new V),a(this,"_pinchPosition",new S),a(this,"_ray"),a(this,"_hand_wristDotUp"),a(this,"_object"),a(this,"_gripSpaceObject"),a(this,"_raySpaceObject"),a(this,"model",null),a(this,"_debugAxesHelper",new Ci(.15)),a(this,"_debugGripAxesHelper",new Ci(.07)),a(this,"_debugRayAxesHelper",new Ci(.07)),a(this,"_hitTestSourcePromise",null),a(this,"onPointerHits",o=>{}),a(this,"_needleGamepadButtons",{}),a(this,"_buttonMap",new Map),a(this,"_motioncontroller"),a(this,"_layout"),a(this,"getMotionController"),a(this,"emitPointerDownEvent",!0),a(this,"emitPointerUpEvent",!0),a(this,"emitPointerMoveEvent",!0),a(this,"pointerMoveDistanceThreshold",.03),a(this,"pointerMoveAngleThreshold",.05),a(this,"_selectButtonIndex"),a(this,"_squeezeButtonIndex"),a(this,"onSelectStart",o=>{var r,l,c,h;if(!this.emitPointerDownEvent||this.inputSource!==o.inputSource)return;this.onUpdateFrame(o.frame),this._hasSelectEvent=!0;const d=(r=this._layout)==null?void 0:r.selectComponentId,u=(h=(c=(l=this._layout)==null?void 0:l.components[d])==null?void 0:c.gamepadIndices)==null?void 0:h.button;u!==void 0&&(this._selectButtonIndex=u),!zd&&(In&&$.DrawDirection(this.rayWorldPosition,q(0,.01,1).applyQuaternion(this.rayWorldQuaternion),16711680,10),this.emitPointerEvent(Be.PointerDown,this._selectButtonIndex||0,"xr-standard-trigger",!0,o))}),a(this,"onSelectEnd",o=>{this.emitPointerUpEvent&&(zd||this.inputSource===o.inputSource&&this.emitPointerEvent(Be.PointerUp,this._selectButtonIndex||0,"xr-standard-trigger",!0,o))}),a(this,"onSequeezeStart",o=>{var r,l,c;this.emitPointerDownEvent&&this.inputSource===o.inputSource&&(this._squeezeButtonIndex=(c=(l=(r=this._layout)==null?void 0:r.components["xr-standard-squeeze"])==null?void 0:l.gamepadIndices)==null?void 0:c.button,this._squeezeButtonIndex!==void 0&&(In&&$.DrawDirection(this.rayWorldPosition,q(0,.01,1).applyQuaternion(this.rayWorldQuaternion),255,10),this.emitPointerEvent(Be.PointerDown,this._squeezeButtonIndex||0,"xr-standard-squeeze",!0,o)))}),a(this,"onSequeezeEnd",o=>{this.emitPointerUpEvent&&this.inputSource===o.inputSource&&this._squeezeButtonIndex!==void 0&&this.emitPointerEvent(Be.PointerUp,this._squeezeButtonIndex||0,"xr-standard-squeeze",!0,o)}),a(this,"states",{}),a(this,"_didMoveLastFrame",!1),a(this,"_lastPointerMovePosition",new S),a(this,"_lastPointerMoveQuaternion",new V),a(this,"pointerInit"),this.xr=e,this.inputSource=t,this.index=s,this._object=new E,this._object.name=`NeedleXRController_${s}`,In&&(this._object.add(this._debugAxesHelper),this._gripSpaceObject=new E,this._raySpaceObject=new E,this._gripSpaceObject.name=`NeedleXRController_${s}_gripSpace`,this._raySpaceObject.name=`NeedleXRController_${s}_raySpace`,this._gripSpaceObject.add(this._debugGripAxesHelper),this._raySpaceObject.add(this._debugRayAxesHelper),this.xr.context.scene.add(this._gripSpaceObject),this.xr.context.scene.add(this._raySpaceObject)),this.xr.context.scene.add(this._object),this._ray=new po,this.pointerInit={origin:this,pointerType:this.hand?"hand":"controller",deviceIndex:this.index,pointerId:-1,mode:this.inputSource.targetRayMode,ray:this._ray,device:this._object,buttonName:"none"},this.initialize(),this.subscribeEvents()}get context(){return this.xr.context}get connected(){return this._connected}get isTracking(){return this._isTracking}get gamepad(){return this.__gamepad??(this.__gamepad=this.inputSource.gamepad)}get isHand(){return this.hand!=null}get hand(){return this.__hand??(this.__hand=this.inputSource.hand)}get handObject(){return this.context.renderer.xr.getHand(this.index)}get profiles(){return this.inputSource.profiles}get layout(){return this._layout}get targetRayMode(){return this.inputSource.targetRayMode}get targetRaySpace(){return this.inputSource.targetRaySpace}get gripSpace(){return this.inputSource.gripSpace}get side(){return this.__side??(this.__side=this.inputSource.handedness)}get isRight(){return this.side==="right"}get isLeft(){return this.side==="left"}get isStylus(){return this._isMxInk}getHitTestSource(){return this._hitTestSource||this._requestHitTestSource(),this._hitTestSource}get hasHitTestSource(){return this._hitTestSource}cancelHitTestSource(){this._hitTestSource&&(this._hitTestSource.cancel(),this._hitTestSource=void 0)}get hasSelectEvent(){return this._hasSelectEvent}getHitTest(){return this.xr.getHitTest(this)}getHandJointPose(e,t){var s;if(t=t||this.xr.frame,!this.hand||!(t!=null&&t.getJointPose)||!this.xr.referenceSpace)return null;let o=(s=this._handJointPoses)==null?void 0:s.get(e);return o||(o=t.getJointPose(e,this.xr.referenceSpace),o&&this._handJointPoses.set(e,o),o)}get gripPosition(){return q(this._gripPosition)}get gripQuaternion(){return bs(this._gripQuaternion)}get gripMatrix(){return this._gripMatrix}get gripLinearVelocity(){return q(this._linearVelocity).applyQuaternion(Zi)}get rayPosition(){return q(this._rayPosition)}get rayQuaternion(){return bs(this._rayQuaternion)}get gripWorldPosition(){return q(this._gripWorldPosition)}get gripWorldQuaternion(){return bs(this._gripWorldQuaternion)}get rayWorldPosition(){return q(this._rayWorldPosition)}updateRayWorldPosition(){var e;const t=(e=this.xr.context.mainCamera)==null?void 0:e.parent;this._rayWorldPosition.copy(this._rayPositionRaw),t&&this._rayWorldPosition.applyMatrix4(t.matrixWorld)}get rayWorldQuaternion(){return bs(this._rayWorldQuaternion)}get pinchPosition(){return q(this._pinchPosition)}updateRayWorldQuaternion(){var e;const t=(e=this.xr.context.mainCamera)==null?void 0:e.parent,s=t?Se(t):void 0;this._rayWorldQuaternion.copy(this._rayRotationRaw).multiply(Zi),s&&this._rayWorldQuaternion.premultiply(s)}get ray(){return this._ray.origin.copy(this.rayWorldPosition),this._ray.direction.copy(q(0,0,1).applyQuaternion(this.rayWorldQuaternion)),this._ray}get handWristDotUp(){var e;if(this._hand_wristDotUp!==void 0)return this._hand_wristDotUp;const t=(e=this.handObject)==null?void 0:e.joints.wrist;if(t){const s=q(0,1,0).applyQuaternion(t.quaternion),o=q(0,1,0).dot(s);return this._hand_wristDotUp=o}}get isHandUpsideDown(){return this.handWristDotUp!==void 0?this.handWristDotUp<-.7:!1}get isTeleportGesture(){var e;return this.isHandUpsideDown&&((e=this.getGesture("pinch"))==null?void 0:e.isDown)}get object(){return this._object}async getModelUrl(){var e;return(e=this.getMotionController)==null?void 0:e.then(t=>t?.assetUrl||null)}_requestHitTestSource(){var e;return this._hitTestSourcePromise?this._hitTestSourcePromise:this.xr.mode==="immersive-ar"&&this.inputSource.targetRayMode==="tracked-pointer"&&this.xr.session.requestHitTestSourceForTransientInput?this._hitTestSourcePromise=((e=this.xr.session.requestHitTestSourceForTransientInput({profile:this.inputSource.profiles[0],offsetRay:new XRRay}))==null?void 0:e.then(t=>(this._hitTestSourcePromise=null,this.connected?this._hitTestSource=t:(t.cancel(),null))))??null:null}onUpdate(e){this.onUpdateFrame(e),this.updateInputEvents(),this.onUpdateMove()}onRenderDebug(){var e;$.DrawSphere(this.rayWorldPosition,.003),$.DrawDirection(this.rayWorldPosition,q(0,0,10).applyQuaternion(this.rayWorldQuaternion));const t=(this.inputSource.gripSpace?this.gripWorldPosition:this.object.worldPosition).sub(this.object.worldForward.multiplyScalar(.1)),s=this.inputSource.profiles.join(`
|
|
147
|
+
`);let o=`Controller[${this.index}] (${this.inputSource.targetRayMode}, ${this.side})
|
|
148
|
+
C:${this.connected?"x":"-"} T:${this.isTracking?"x":"-"} Hand:${this.inputSource.hand?"x":"-"} Pen: ${this._isMxInk?"x":"-"}`;if(this.inputSource.hand&&(o+=`
|
|
149
|
+
Pinch: ${(e=this.getGesture("pinch"))==null?void 0:e.value.toFixed(3)}`),o+=`
|
|
150
|
+
`+s,o+=`
|
|
151
|
+
`+(this.inputSource.targetRaySpace?"Ray: x":"Ray: -")+(this.inputSource.gripSpace?" Grip: x":" Grip: -")+(this.inputSource.gamepad?` Gamepad: ${this.inputSource.gamepad.mapping}`:" Gamepad: -"),this.inputSource.gamepad){const r=this.inputSource.gamepad;let l="[btns "+r.buttons.length+"]: "+r.buttons.map(c=>c.value.toPrecision(1)).join(",");l+=`
|
|
152
|
+
[axes `+r.axes.length+"]: "+r.axes.map(c=>c.toPrecision(1)).join(","),o+=`
|
|
153
|
+
`+l}$.DrawLabel(t,o,.006)}onUpdateFrame(e){var t,s,o,r,l,c,h,d,u,p,g;if(this._handJointPoses.clear(),this._hand_wristDotUp=void 0,!this.xr.referenceSpace){this._isTracking=!1;return}const f=e.getPose(this.inputSource.targetRaySpace,this.xr.referenceSpace);this._isTracking=f!=null;let y=null,v=null,b=null,_=null;if(f){const M=f.transform;this._rayMatrix.fromArray(M.matrix).premultiply(Ia),this._rayMatrix.decompose(this._rayPosition,this._rayQuaternion,q(1,1,1)),b=q(M.position),_=bs(M.orientation),this._rayPositionRaw.copy(b),this._rayRotationRaw.copy(_)}if(this.inputSource.gripSpace){const M=e.getPose(this.inputSource.gripSpace,this.xr.referenceSpace);if(M){const T=M.transform;if(y=q(T.position),v=bs(T.orientation),this._gripMatrix.fromArray(T.matrix).premultiply(Ia),this._gripMatrix.decompose(this._gripPosition,this._gripQuaternion,q(1,1,1)),"linearVelocity"in M&&M.linearVelocity){const L=M.linearVelocity;this._linearVelocity.set(L.x,L.y,L.z)}}}(t=this.xr.context.mainCamera)!=null&&t.parent&&(this._object.parent!==((s=this.xr.context.mainCamera)==null?void 0:s.parent)&&this.xr.context.mainCamera.parent.add(this._object),this._gripSpaceObject!==void 0&&((o=this._gripSpaceObject)==null?void 0:o.parent)!==((r=this.xr.context.mainCamera)==null?void 0:r.parent)&&this.xr.context.mainCamera.parent.add(this._gripSpaceObject),this._raySpaceObject!==void 0&&((l=this._raySpaceObject)==null?void 0:l.parent)!==((c=this.xr.context.mainCamera)==null?void 0:c.parent)&&this.xr.context.mainCamera.parent.add(this._raySpaceObject));const w=this.hand;if(w){let M=!1;const T=w.get("wrist"),L=T&&this.getHandJointPose(T,e);if(L){M=!0;const j=L.transform.position,H=L.transform.orientation;this._object.position.set(j.x,j.y,j.z),this._object.quaternion.set(H.x,H.y,H.z,H.w).multiply(Zi)}M||(this._object.position.copy(this._rayPosition),this._object.quaternion.copy(this._rayQuaternion).multiply(Zi));const D=w.get("middle-finger-metacarpal"),z=D&&this.getHandJointPose(D,e);z&&(this._gripMatrix.fromArray(z.transform.matrix).premultiply(Ia),this._gripMatrix.decompose(this._gripPosition,this._gripQuaternion,q(1,1,1)),y=q().copy(z.transform.position),v=bs().copy(z.transform.orientation),v.multiply(tM),y.add(q(iM).applyQuaternion(v)))}else this.inputSource.gripSpace&&this.targetRayMode==="transient-pointer"&&y&&v?(this._object.position.copy(y),this._object.quaternion.copy(v).multiply(Zi)):b&&_&&(this._object.position.copy(b),this._object.quaternion.copy(_).multiply(Zi));In&&(b&&_&&((h=this._raySpaceObject)==null||h.position.copy(b),(d=this._raySpaceObject)==null||d.quaternion.copy(_).multiply(Zi)),y&&v&&((u=this._gripSpaceObject)==null||u.position.copy(y),(p=this._gripSpaceObject)==null||p.quaternion.copy(v).multiply(Zi)));const x=(g=this.xr.context.mainCamera)==null?void 0:g.parent,k=x?Se(x):void 0;y&&v&&(this._gripWorldPosition.copy(y),x&&this._gripWorldPosition.applyMatrix4(x.matrixWorld),this._gripWorldQuaternion.copy(v),this._gripWorldQuaternion.multiply(Zi),k&&this._gripWorldQuaternion.premultiply(k)),this.updateRayWorldPosition(),this.updateRayWorldQuaternion()}onDisconnected(){var e,t,s,o,r,l;this._connected=!1,In&&console.warn("Controller disconnected",this.index);for(const c of this._object.children)this.xr.context.scene.attach(c);(e=this._object)==null||e.removeFromParent(),(t=this._debugAxesHelper)==null||t.removeFromParent(),(s=this._debugGripAxesHelper)==null||s.removeFromParent(),(o=this._debugRayAxesHelper)==null||o.removeFromParent(),(r=this._gripSpaceObject)==null||r.removeFromParent(),(l=this._raySpaceObject)==null||l.removeFromParent(),this.unsubscribeEvents(),this._hitTestSource&&(this._hitTestSource.cancel(),this._hitTestSource=void 0)}getButton(e){var t;if(!this._layout)return;switch(e){case"primary-button":if(this.isLeft)e="x-button";else if(this.isRight)e="a-button";else return;break;case"primary":return this.hand?this.getGesture("pinch"):this.toNeedleGamepadButton(0,e)}if(this._buttonMap.has(e))return this.toNeedleGamepadButton(this._buttonMap.get(e),e);const s=(t=this._layout)==null?void 0:t.components[e];if(s!=null&&s.gamepadIndices)switch(s.type){case"button":case"squeeze":if(this.inputSource.gamepad){const o=s.gamepadIndices.button;return this._buttonMap.set(e,o),this.toNeedleGamepadButton(o,e)}break;default:console.warn("Unsupported component type",s.type);break}this._buttonMap.set(e,void 0)}getGesture(e){const t=this.states[e];if(!t)return null;this.states[e]=t;const s=this._needleGamepadButtons[e]||new r_(void 0,e);return s.pressed=t.pressed,s.value=t.value,s.isDown=t.isDown,s.isUp=t.isUp,this._needleGamepadButtons[e]=s,s}getPointerId(e){if((e==="primary"||e==="pinch")&&(e=0),typeof e!="number"){const t=this._buttonMap.get(e);if(t===void 0)return;e=t}return this.index*10+e}toNeedleGamepadButton(e,t){var s,o;if(!((s=this.inputSource.gamepad)!=null&&s.buttons))return;const r=(o=this.inputSource.gamepad)==null?void 0:o.buttons[e],l=this.states[e],c=this._needleGamepadButtons[e]||new r_(e,t);return r&&(c.pressed=r.pressed,c.value=r.value,c.touched=r.touched),l&&(c.isDown=l.isDown,c.isUp=l.isUp),this._needleGamepadButtons[e]=c,c}getStick(e){var t,s,o,r,l,c,h,d,u;if(!this._layout)return{x:0,y:0,z:0};if(e==="primary"){const g=((t=this.inputSource.gamepad)==null?void 0:t.axes[0])||0,f=((s=this.inputSource.gamepad)==null?void 0:s.axes[1])||0,y=((r=(o=this.inputSource.gamepad)==null?void 0:o.buttons[3])==null?void 0:r.value)||0;return{x:g,y:f,z:y}}const p=(l=this._layout)==null?void 0:l.components[e];if(p!=null&&p.gamepadIndices)switch(p.type){case"thumbstick":if(this.inputSource.gamepad){const g=p.gamepadIndices.xAxis,f=p.gamepadIndices.yAxis;let y=(c=this.inputSource.gamepad)==null?void 0:c.axes[g],v=(h=this.inputSource.gamepad)==null?void 0:h.axes[f];y*=-1,v*=-1;const b=p.gamepadIndices.button,_=(u=(d=this.inputSource.gamepad)==null?void 0:d.buttons[b])==null?void 0:u.value;return{x:y,y:v,z:_}}}return{x:0,y:0,z:0}}initialize(){if(this._hasSelectEvent=this.profiles.includes("generic-hand-select")||this.profiles.some(e=>e.startsWith("generic-trigger")),this._isMetaQuestTouchController=this.profiles.includes("meta-quest-touch-plus")||this.profiles.includes("oculus-touch-v3"),this._isMxInk=this.profiles.includes("logitech-mx-ink"),!this._layout){if(this.inputSource.targetRayMode==="transient-pointer")return;const e=fO(this.inputSource,Jk,eM);this.getMotionController=e.then(t=>{var s;if(!this.connected)return null;this._motioncontroller=new yO(this.inputSource,t.profile,t.assetPath||"");const o=t.profile.layouts[this.inputSource.handedness];if(this._layout=o,this._layout&&!((s=this._layout.gamepad)!=null&&s.length)){this._layout.gamepad=[];for(const r in this._layout.components){const l=this._layout.components[r];this._layout.gamepad[l.gamepadIndices.button]=r}}return this._motioncontroller}).catch(t=>(this.inputSource&&console.warn("Couldn't initialize motion controller profile for ",this.inputSource,t),null))}}subscribeEvents(){this.xr.session.addEventListener("selectstart",this.onSelectStart),this.xr.session.addEventListener("selectend",this.onSelectEnd),this.xr.session.addEventListener("squeezestart",this.onSequeezeStart),this.xr.session.addEventListener("squeezeend",this.onSequeezeEnd)}unsubscribeEvents(){this.xr.session.removeEventListener("selectstart",this.onSelectStart),this.xr.session.removeEventListener("selectend",this.onSelectEnd),this.xr.session.removeEventListener("squeezestart",this.onSequeezeStart),this.xr.session.removeEventListener("squeezeend",this.onSequeezeEnd)}updateInputEvents(){var e,t,s;if((e=this.gamepad)!=null&&e.buttons){for(let o=0;o<this.gamepad.buttons.length;o++){const r=this.gamepad.buttons[o],l=this.states[o]||new o_;let c=null;this._isMxInk&&(o===4||o===5)?(r.value>0&&!l.pressed?(c="pointerdown",l.isDown=!0,l.isUp=!1):r.value===0&&l.pressed?(c="pointerup",l.isDown=!1,l.isUp=!0):l.pressed&&(c="pointermove",l.isDown=!1,l.isUp=!1),l.pressed=r.value>0,l.value=r.value):(r.pressed&&!l.pressed?(c="pointerdown",l.isDown=!0,l.isUp=!1):!r.pressed&&l.pressed?(c="pointerup",l.isDown=!1,l.isUp=!0):(l.isDown=!1,l.isUp=!1),l.pressed=r.pressed,l.value=r.value),this.states[o]=l;const h=o!==this._selectButtonIndex&&o!==this._squeezeButtonIndex;if(c!=null&&h){let d=(t=this._layout)==null?void 0:t.gamepad[o];this._isMxInk&&o===4&&(d="stylus-touch"),this._isMxInk&&o===5&&(d="stylus-tip"),(In||zd)&&console.log("Emitting pointer event",c,o,d,r.value,this.gamepad,this._layout),this.emitPointerEvent(c,o,d??"none",!1,null,r.value)}}if(this._isMetaQuestTouchController){const o=this.gamepad.buttons.length-1,r=this.states[o];if(r&&r.isDown){const l=this.context.menu;l.spatialMenuIsVisible?l.setSpatialMenuVisible(!1):this.context.menu.setSpatialMenuVisible(!0)}}}if(this.hand){const o=this.handObject;if(o){const r=o.joints["index-finger-tip"],l=o.joints["thumb-tip"];if(r&&l){const c=r.position.distanceTo(l.position);this._pinchPosition.lerpVectors(r.position,l.position,.5);const h=(s=this.xr.context.mainCamera)==null?void 0:s.parent;if(h&&this._pinchPosition.applyMatrix4(h.matrixWorld),c!==0){const d=this.states.pinch||new o_,u=(.02+.01)*1.5;d.value=1-(c-.02)/u;const p=c<.02-.01,g=c>.02+.01;p&&!d.pressed?(zd&&console.log("pinch start",c),d.isDown=!0,d.isUp=!1,d.pressed=!0):g&&d.pressed?(d.isDown=!1,d.isUp=!0,d.pressed=!1):(d.isDown=!1,d.isUp=!1),this.states.pinch=d}}}}}onUpdateMove(){var e,t;if(!this.emitPointerMoveEvent)return;let s=!1;if(this._lastPointerMovePosition.distanceTo(this.gripWorldPosition)>this.pointerMoveDistanceThreshold*this.xr.rigScale&&(s=!0),s||this._lastPointerMoveQuaternion.angleTo(this.gripWorldQuaternion)>this.pointerMoveAngleThreshold&&(s=!0),s){this._didMoveLastFrame=!0,this._lastPointerMovePosition.copy(this.gripWorldPosition),this._lastPointerMoveQuaternion.copy(this.gripWorldQuaternion),In&&$.DrawLabel(this.rayWorldPosition.add(this.object.worldForward.multiplyScalar(.1)),"move",.01);let o=this.xr.context.input.getFirstPressedButtonForPointer(this.index);o===void 0&&(o=0);const r=(t=(e=this.gamepad)==null?void 0:e.buttons[o])==null?void 0:t.value;this.emitPointerEvent("pointermove",o,"none",!1,null,r)}else this._didMoveLastFrame=!1}emitPointerEvent(e,t,s,o,r=null,l){if(!this.emitEvents){In&&e!==Be.PointerMove&&console.warn("Pointer events are disabled for this controller",this.index,e,t);return}if(this.xr.mode==="immersive-vr"||this.xr.isPassThrough){this.pointerInit.origin=this,this.pointerInit.pointerId=this.getPointerId(t),this.pointerInit.pointerType=this.hand?"hand":"controller",this.pointerInit.button=t,this.pointerInit.buttonName=s,this.pointerInit.isPrimary=o,this.pointerInit.mode=this.inputSource.targetRayMode,this.pointerInit.ray=this.ray,this.pointerInit.device=this.object,this.pointerInit.pressure=l,this.pointerInit.clientX=this._rayPosition.x/this.xr.rigScale,this.pointerInit.clientY=this._rayPosition.y/this.xr.rigScale,this.pointerInit.clientZ=this._rayPosition.z/this.xr.rigScale;const c=J.Current;J.Current=this.xr.context,In&&e!=="pointermove"&&console.warn("Pointer event",e,t,s,{...this.pointerInit}),this.xr.context.input.createInputEvent(new An(e,r,this.pointerInit)),J.Current=c}}}class o_{constructor(){a(this,"isDown",!1),a(this,"isUp",!1),a(this,"pressed",!1),a(this,"value",0)}}class r_{constructor(e,t){a(this,"index"),a(this,"name"),a(this,"touched",!1),a(this,"pressed",!1),a(this,"value",0),a(this,"isDown",!1),a(this,"isUp",!1),this.index=e,this.name=t}}var Og=(n=>(n.Visible="application-visible",n.Hidden="application-hidden",n.MuteChanged="application-mutechanged",n))(Og||{});let Nd=!1;const La=[];function Sr(){if(Nd)return;F()&&console.debug("User interaction registered: audio can now be played"),Nd=!0;const n=[...La];La.length=0,n.forEach(e=>e())}document.addEventListener("mousedown",Sr),document.addEventListener("pointerup",Sr),document.addEventListener("click",Sr),document.addEventListener("dragstart",Sr),document.addEventListener("touchend",Sr),document.addEventListener("keydown",Sr);const kg=class extends EventTarget{constructor(e){super(),a(this,"_mute",!1),a(this,"context"),a(this,"_isVisible",!0),this.context=e,window.addEventListener("visibilitychange",this.onVisiblityChanged.bind(this),!1)}static get userInteractionRegistered(){return Nd}static registerWaitForInteraction(e){if(e!==null){if(Nd){e();return}La.indexOf(e)===-1&&La.push(e)}}static unregisterWaitForInteraction(e){const t=La.indexOf(e);t!==-1&&La.splice(t,1)}get muted(){return this._mute}set muted(e){e!==this._mute&&(this._mute=e,this.dispatchEvent(new Event("application-mutechanged")))}get hasFocus(){return document.hasFocus()}get isVisible(){return this._isVisible}onVisiblityChanged(e){switch(e.target.visibilityState){case"hidden":this._isVisible=!1,this.dispatchEvent(new Event("application-hidden"));break;case"visible":this._isVisible=!0,this.dispatchEvent(new Event("application-visible"));break}}};a(kg,"registerWaitForAllowAudio",kg.registerWaitForInteraction);let Ln=kg;const ja=new Map,Da=new Map;let a_=0;function jn(n,e,t){if(ja.has(e)||ja.set(e,new Array),ja.get(e).push({method:n,options:{once:!1,...t}}),a_<30){const s=Da.get(e);s&&s?.length>100&&(a_+=1,console.warn(`You have ${s.length} methods registered for Event ${e}.
|
|
154
|
+
|
|
155
|
+
This might be a performance issue!
|
|
156
|
+
Consider unregistering the methods when they are not needed anymore!
|
|
157
|
+
|
|
158
|
+
To unregister you can call the function returned by your event hook (e.g.const unregister = onStart(...))
|
|
159
|
+
|
|
160
|
+
or by using the once option like onStart(()=>{}, { once:true }).
|
|
161
|
+
|
|
162
|
+
See https://engine.needle.tools/docs/scripting.html#special-lifecycle-hooks for more information.`))}}function _o(n,e){const t=Da.get(e);if(t){for(let o=0;o<t.length;o++)if(t[o].method===n){t.splice(o,1);return}}const s=ja.get(e);if(s){for(let o=0;o<s.length;o++)if(s[o].method===n){s.splice(o,1);return}}}function Xs(n,e){e===me.ContextCreated&&Mg.delete(n),l_(n,e)}function l_(n,e){e===Oe.Start&&ja.get(me.ContextCreated)&&l_(n,me.ContextCreated);const t=e===Oe.Start||e===me.ContextCreated,s=Da.get(e);s&&s.length>0&&h_(n,s,t);const o=ja.get(e);if(o&&o.length>0){const r=[...o];o.length=0,h_(n,r,t),r.length>0&&(Da.has(e)||Da.set(e,new Array),Da.get(e).push(...r))}}const Wd=new Array,c_={context:null};function h_(n,e,t){var s,o;Wd.length=0;for(let l=0;l<e.length;l++)Wd.push(e[l]);let r=Mg.get(n);for(let l=0;l<Wd.length;l++){const c=Wd[l];let h=!0;if(r&&r.has(c)&&(h=!1),h)try{c_.context=n,(s=c.method)==null||s.call(c_,n)}catch(d){console.error("Error in lifecycle method",d)}if((o=c.options)!=null&&o.once){for(let d=0;d<e.length;d++)if(e[d]===c){e.splice(d,1);break}}else t&&(r||(r=new Set,Mg.set(n,r)),r.add(c))}}const Mg=new WeakMap,Rg={};function Tg(n,e){Rg[n]=e}function d_(n){const e=n.getBufferIdentifier(),t=Rg[e];return t(n)}function u_(n){return typeof n.guid=="function"?n.guid():null}let Eg;function sM(){return Eg}function nM(n){Eg=n}function p_(n,e){return e||(e={}),e={...Eg,...e},n?new Xv(n,e):new Xv(e)}async function m_(){const n=await import("./vendor-zxXa3Dmr.min.js").then(e=>e.bundler);return console.log(n),n.default===void 0?n:n.default}class g_{constructor(){a(this,"_host"),a(this,"_client"),a(this,"_clientData"),this.onEnable()}get isHost(){return this._host!==void 0}onEnable(){this.trySetupHost("HOST-5980e65c-8438-453e-8b35-f13c736dcd81")}async trySetupHost(e){const t=await m_(),s=new t(e);s.on("error",o=>{console.error(o),this._host=void 0,this.trySetupClient(e)}),s.on("open",o=>{this._host=new rM(s)})}async trySetupClient(e){const t=await m_();this._client=new t,this._client.on("error",s=>{console.error("Client error",s)}),this._client.on("open",s=>{console.log("client connected",s),this._clientData=this._client.connect(e,{metadata:{id:s}}),this._clientData.on("open",()=>{console.log("Connected to host")}),this._clientData.on("data",o=>{console.log("<<",o)})})}}class oM{constructor(e){a(this,"_peer"),this._peer=e}}class rM extends oM{constructor(e){var t;super(e),a(this,"_connections",[]),console.log("I AM THE HOST"),(t=this._peer)==null||t.on("connection",this.onConnection.bind(this)),this._peer.on("close",()=>{this.broadcast("BYE")}),setInterval(()=>{this.broadcast("HELLO")},2e3)}get isHost(){return!0}onConnection(e){console.log("host connection",e),e.on("open",()=>{this._connections.push(e),this.broadcastConnection(e)})}broadcastConnection(e){const t=this._connections.map(s=>{var o;return(o=s.metadata)==null?void 0:o.id}).filter(s=>s!==void 0);this.broadcast({type:"connection-list",connections:t})}broadcast(e){if(e!=null){console.log(">>",e);for(const t in this._peer.connections){const s=this._peer.connections[t];if(s)if(Array.isArray(s))for(const o of s)o&&o.send(e);else console.warn(s)}}}}var Ss=(n=>(n[n.OnConnection=0]="OnConnection",n[n.OnRoomJoin=1]="OnRoomJoin",n[n.Queued=2]="Queued",n[n.Immediate=3]="Immediate",n))(Ss||{});const f_="https://urls.needle.tools/default-networking-backend/index";let Ri="wss://networking.needle.tools/socket";const ri=!!C("debugnet"),ac=!!(ri||C("debugowner")),Vd=C("debugnetbin");var y_=(n=>(n.ConnectionInfo="connection-start-info",n))(y_||{}),ie=(n=>(n.Join="join-room",n.Leave="leave-room",n.JoinedRoom="joined-room",n.LeftRoom="left-room",n.UserJoinedRoom="user-joined-room",n.UserLeftRoom="user-left-room",n.RoomStateSent="room-state-sent",n))(ie||{});class aM{constructor(){a(this,"room"),a(this,"viewId"),a(this,"allowEditing"),a(this,"inRoom")}}class lM{constructor(){a(this,"room")}}class cM{constructor(){a(this,"userId")}}var v_=(n=>(n.RequestHasOwner="request-has-owner",n.ResponseHasOwner="response-has-owner",n.RequestIsOwner="request-is-owner",n.ResponseIsOwner="response-is-owner",n.RequestOwnership="request-ownership",n.GainedOwnership="gained-ownership",n.RemoveOwnership="remove-ownership",n.LostOwnership="lost-ownership",n.GainedOwnershipBroadcast="gained-ownership-broadcast",n.LostOwnershipBroadcast="lost-ownership-broadcast",n))(v_||{});class Ag{constructor(e,t){a(this,"guid"),a(this,"connection"),a(this,"_hasOwnership",!1),a(this,"_isOwned"),a(this,"_gainSubscription"),a(this,"_lostSubscription"),a(this,"_hasOwnerResponse"),a(this,"_isWaitingForOwnershipResponseCallback",null),this.connection=e,this.guid=t,this._gainSubscription=this.onGainedOwnership.bind(this),this._lostSubscription=this.onLostOwnership.bind(this),e.beginListen("lost-ownership",this._lostSubscription),e.beginListen("gained-ownership-broadcast",this._gainSubscription),this._hasOwnerResponse=this.onHasOwnerResponse.bind(this),e.beginListen("response-has-owner",this._hasOwnerResponse)}get hasOwnership(){return this._hasOwnership}get isOwned(){return this._isOwned}get isConnected(){return this.connection.isConnected}updateIsOwned(){this.connection.send("request-has-owner",{guid:this.guid})}onHasOwnerResponse(e){e.guid===this.guid&&(this._isOwned=e.value)}requestOwnershipIfNotOwned(){return this._isWaitingForOwnershipResponseCallback!==null?this:(this._isWaitingForOwnershipResponseCallback=this.waitForHasOwnershipRequestResponse.bind(this),this.connection.beginListen("response-has-owner",this._isWaitingForOwnershipResponseCallback),this.connection.send("request-has-owner",{guid:this.guid}),this)}waitForHasOwnershipRequestResponse(e){e.guid===this.guid&&(this._isWaitingForOwnershipResponseCallback&&(this.connection.stopListen("response-has-owner",this._isWaitingForOwnershipResponseCallback),this._isWaitingForOwnershipResponseCallback=null),this._isOwned=e.value,e.value||(ac&&console.log("request ownership",this.guid),this.requestOwnership()))}requestOwnershipAsync(){return new Promise((e,t)=>{this.requestOwnership();let s=0;const o=()=>{if(s++>10)return t("Timeout");setTimeout(()=>{this.hasOwnership?e(this):o()},100)};o()})}requestOwnership(){return ac&&console.log("Request ownership",this.guid),this.connection.send("request-ownership",{guid:this.guid}),this}freeOwnership(){return this.connection.send("remove-ownership",{guid:this.guid}),this._isWaitingForOwnershipResponseCallback&&(this.connection.stopListen("response-has-owner",this._isWaitingForOwnershipResponseCallback),this._isWaitingForOwnershipResponseCallback=null),this}destroy(){this.connection.stopListen("gained-ownership",this._gainSubscription),this.connection.stopListen("lost-ownership",this._lostSubscription),this.connection.stopListen("response-has-owner",this._hasOwnerResponse),this._isWaitingForOwnershipResponseCallback&&(this.connection.stopListen("response-has-owner",this._isWaitingForOwnershipResponseCallback),this._isWaitingForOwnershipResponseCallback=null)}onGainedOwnership(e){e.guid===this.guid&&(this._isOwned=!0,this.connection.connectionId===e.owner?(ac&&console.log("GAINED OWNERSHIP",this.guid),this._hasOwnership=!0):this._hasOwnership=!1)}onLostOwnership(e){e===this.guid&&(ac&&console.log("LOST OWNERSHIP",this.guid),this._hasOwnership=!1,this._isOwned=!1)}}class b_{constructor(e){a(this,"context"),a(this,"_peer",null),a(this,"_usersInRoomCopy",[]),a(this,"_defaultMessagesBuffer",[]),a(this,"_defaultMessagesBufferArray",[]),a(this,"netWebSocketUrlProvider"),a(this,"_listeners",{}),a(this,"_listenersBinary",{}),a(this,"connected",!1),a(this,"channelId"),a(this,"_connectionId",null),a(this,"_ws"),a(this,"_waitingForSocket",{}),a(this,"_isInRoom",!1),a(this,"_currentRoomName",null),a(this,"_currentRoomViewId",null),a(this,"_currentRoomAllowEditing",!0),a(this,"_currentInRoom",[]),a(this,"_state",{}),a(this,"_currentDelay",-1),a(this,"_connectingToWebsocketPromise",null),this.context=e}get peer(){return this._peer||(this._peer=new g_),this._peer}tryGetState(e){return e==="invalid"?null:this._state[e]}get connectionId(){return this._connectionId}get isDebugEnabled(){return ri}get isConnected(){return this.connected}get currentRoomName(){return this._currentRoomName}get allowEditing(){return this._currentRoomAllowEditing}get currentRoomViewId(){return this._currentRoomViewId}getViewOnlyUrl(){if(this.currentRoomViewId===null)return null;const e=new URL(window.location.href);return e.searchParams.set("view",this.currentRoomViewId),e.href}get isInRoom(){return this._isInRoom}get currentLatency(){return this._currentDelay}get currentServerUrl(){var e;return((e=this._ws)==null?void 0:e.url)??null}sendPing(){this.send("ping",{time:this.context.time.time})}userIsInRoom(e){return this._currentInRoom.indexOf(e)!==-1}usersInRoom(e=null){e||(e=this._usersInRoomCopy),e.length=0;for(const t of this._currentInRoom)e.push(t);return e}joinRoom(e,t=!1){return e?e.length>1024?(console.error('Room name too long, can not join: "'+e+'". Max length is 1024 characters.'),!1):(this.isInRoom&&this.currentRoomName!==e&&console.warn("Needle Engine is already connected to a networking room. Connecting to multiple rooms is not supported"),this.connect(),ri&&console.log("join: "+e),this.send("join-room",{room:e,viewOnly:t},Ss.OnConnection),!0):(console.error('Missing room name, can not join: "'+e+'"'),!1)}leaveRoom(e=null){return e||(e=this.currentRoomName),e?(this.send("leave-room",{room:e}),!0):(console.error('Missing room name, can not join: "'+e+'"'),!1)}send(e,t=null,s=Ss.Queued){if(t===null&&(t={}),s===Ss.Queued){this._defaultMessagesBuffer.push({key:e,value:t});return}return this.sendWithWebsocket(e,t,s)}sendDeleteRemoteState(e){this.send("delete-state",{guid:e,dontSave:!0}),delete this._state[e]}sendDeleteRemoteStateAll(){this.send("delete-all-state"),this._state={}}sendBinary(e){var t;Vd&&console.log("<< send binary",this.context.time.frame,e.length/1024+" KB"),(t=this._ws)==null||t.send(e)}sendBufferedMessagesNow(){var e;if(!this._ws)return;this._defaultMessagesBufferArray.length=0;const t=Object.keys(this._defaultMessagesBuffer).length;for(const o in this._defaultMessagesBuffer){const r=this._defaultMessagesBuffer[o];if(t<=1){this.sendWithWebsocket(r.key,r.value,Ss.Immediate);break}const l=this.toMessage(r.key,r.value);this._defaultMessagesBufferArray.push(l)}if(this._defaultMessagesBuffer.length=0,this._defaultMessagesBufferArray.length>0&&ri&&console.log("SEND BUFFERED",this._defaultMessagesBufferArray.length),this._defaultMessagesBufferArray.length<=0)return;const s=JSON.stringify(this._defaultMessagesBufferArray);(e=this._ws)==null||e.send(s)}beginListen(e,t){return this._listeners[e]||(this._listeners[e]=[]),this._listeners[e].push(t),t}stopListening(e,t){return this.stopListen(e,t)}stopListen(e,t){if(!t||!this._listeners[e])return;const s=this._listeners[e].indexOf(t);s>=0&&this._listeners[e].splice(s,1)}beginListenBinary(e,t){return this._listenersBinary[e]||(this._listenersBinary[e]=[]),this._listenersBinary[e].push(t),t}stopListenBinary(e,t){if(!this._listenersBinary[e])return;const s=this._listenersBinary[e].indexOf(t);s>=0&&this._listenersBinary[e].splice(s,1)}registerProvider(e){this.netWebSocketUrlProvider=e}async connect(e){var t;if(this.connected&&e&&e!==Ri)return Promise.reject("Can not connect to different server url. Please disconnect first.");if(this.connected)return Promise.resolve(!0);e&&console.debug("Connecting to user provided url "+e);const s=e||((t=this.netWebSocketUrlProvider)==null?void 0:t.getWebsocketUrl());return s?Ri=s:sb()&&(Ri="wss://"+window.location.host+"/socket"),this.connectWebsocket()}disconnect(){var e;(e=this._ws)==null||e.close(),this._ws=void 0,Ri=void 0,this._currentRoomAllowEditing=!0,this._currentRoomName=null,this._currentRoomViewId=null,this._isInRoom=!1,this._currentInRoom.length=0,this._state={},this._currentDelay=-1}connectWebsocket(){return this._connectingToWebsocketPromise?this._connectingToWebsocketPromise:this._connectingToWebsocketPromise=new Promise(async(e,t)=>{var s,o;let r=!1;const l=p=>{r||(r=!0,e(p))};if(Ri===void 0&&(console.log("Fetch default backend url: "+f_),Ri=await(await fetch(f_)).text()),Ri===void 0){l(!1);return}console.debug(`\u22A1 Connecting to networking backend on
|
|
163
|
+
`+Ri);const c=await import("./vendor-zxXa3Dmr.min.js").then(p=>p.index),h=((s=c.default)==null?void 0:s.WebsocketBuilder)??c.WebsocketBuilder,d=((o=c.default)==null?void 0:o.ExponentialBackoff)??c.ExponentialBackoff,u=new h(Ri).withMaxRetries(10).withBackoff(new d(2e3,4)).onOpen(()=>{this._connectingToWebsocketPromise=null,this._ws=u,this.connected=!0,F()||ri?console.log(`\u229E Connected to networking backend
|
|
164
|
+
`+Ri):console.debug("\u229E Connected to networking backend",Ri),l(!0),this.onSendQueued(Ss.OnConnection)}).onClose(p=>{this._connectingToWebsocketPromise=null,this.connected=!1,this._isInRoom=!1,l(!1);let g="Websocket connection closed...";Ri!=null&&Ri.includes("/socket")||(g+=' Do you perhaps mean to connect to "/socket"?'),console.error(g)}).onError(p=>{console.error("\u22A0 Websocket connection failed..."),l(!1)}).onRetry(()=>{console.log("\u2192 Retry connecting to networking websocket")}).build();u.addEventListener(c.WebsocketEvent.message,(p,g)=>{this.onMessage(p,g)})})}onMessage(e,t){const s=t.data;try{if(typeof s!="string"){s.size&&this.handleIncomingBinaryMessage(s);return}const o=JSON.parse(s);if(Array.isArray(o))for(const r of o)this.handleIncomingStringMessage(r);else this.handleIncomingStringMessage(o);return}catch(o){ri&&s==="pong"?console.log("<<",s):F()&&console.error("Failed to parse message",o)}}async handleIncomingBinaryMessage(e){Vd&&console.log("<< bin",this.context.time.frame);const t=await e.arrayBuffer();var s=new Uint8Array(t);const o=new vO(s),r=o.getBufferIdentifier(),l=this._listenersBinary[r],c=d_(o),h=u_(c);if(h&&typeof h=="string"&&(this._state[h]=c),!l)return;const d=c??o;for(const u of l)u(d)}handleIncomingStringMessage(e){var t,s;if(ri&&console.log("<<",e.key??e),e.key)switch(e.key){case"connection-start-info":if(e.data){const h=e.data;h&&(console.assert(h.id!==void 0&&h.id!==null&&h.id.length>0,"server did not send connection id",h.id),console.debug("Your id is: "+h.id,this.context.alias??""),this._connectionId=h.id)}else console.warn("Expected connection id in "+e.key);break;case"joined-room":if(ri&&console.log(e),e){this._isInRoom=!0;const h=e;this._currentRoomName=h.room,this._currentRoomViewId=h.viewId,this._currentRoomAllowEditing=h.allowEditing??!0,this._currentInRoom.length=0,this._currentInRoom.push(...h.inRoom),(Vd||F())&&console.debug("Joined Needle Engine Room: "+h.room);const d=new URL(window.location.href);d.searchParams.has("room")&&d.searchParams.delete("room"),d.searchParams.set("view",this._currentRoomViewId),console.debug(`Room view id: ${this._currentRoomViewId}
|
|
165
|
+
${d.href}`)}this.onSendQueued(Ss.OnRoomJoin);break;case"left-room":const l=e;l.room===this.currentRoomName&&(this._isInRoom=!1,this._currentRoomName=null,this._currentRoomAllowEditing=!0,this._currentInRoom.length=0,(Vd||F())&&console.debug("Left Needle Engine Room: "+l.room));break;case"user-joined-room":if(e.data){const h=e.data;this._currentInRoom.push(h.userId),ri&&console.log(h.userId+" joined","now in room:",this._currentInRoom)}break;case"user-left-room":if(e.data){const h=e.data,d=this._currentInRoom.indexOf(h.userId);d>=0&&(ri&&console.log(h.userId+" left","now in room:",this._currentInRoom),this._currentInRoom.splice(d,1)),h.userId===this.connectionId&&console.log("you left the room")}break;case"all-room-state-deleted":ri&&console.log("RECEIVED all-room-state-deleted"),this._state={};break;case"ping":case"pong":const c=(t=e.data)==null?void 0:t.time;c&&(this._currentDelay=this.context.time.time-c),ri&&console.log(`Current latency: ${(this._currentDelay*1e3).toFixed()} ms`,"Clients in room: "+((s=this._currentInRoom)==null?void 0:s.length));break}const o=e.data;o&&(this._state[o.guid]=o);let r=this._listeners[e.key];if(r){r=[...r];for(const l of r)try{l(e.data)}catch(c){console.error('Error invoking callback for "'+e.key+'"',c)}}}toMessage(e,t){return{key:e,data:t}}sendWithWebsocket(e,t,s=Ss.OnRoomJoin){if(!this._ws){const r=this._waitingForSocket[s]||[];r.push(()=>this.sendWithWebsocket(e,t,s)),this._waitingForSocket[s]=r;return}const o=JSON.stringify(this.toMessage(e,t));ri&&console.log(">>",e),this._ws.send(o)}onSendQueued(e){const t=this._waitingForSocket[e];if(t){for(const s of t)s();t.length=0}}}const lc=C("debugwebxr");class Ig{constructor(e,t){a(this,"controllerStates",[]),a(this,"userId"),a(this,"context"),a(this,"userStateEvtName"),a(this,"onReceivedControllerState",s=>{lc&&console.log(`XRSync: Received change for ${this.userId}: ${s.type} ${s.handedness}; tracked=${s.isTracking}`);let o=!1;for(let r=0;r<this.controllerStates.length;r++)if(this.controllerStates[r].index===s.index){this.controllerStates[r]=s,o=!0;break}o||this.controllerStates.push(s)}),this.userId=e,this.context=t,this.userStateEvtName="xr-sync-user-state-"+e,this.context.connection.beginListen(this.userStateEvtName,this.onReceivedControllerState)}dispose(){this.context.connection.stopListen(this.userStateEvtName,this.onReceivedControllerState)}update(e){if(this.context.connection.isConnected!=!1){for(let t=this.controllerStates.length-1;t>=0;t--){const s=this.controllerStates[t];let o=!1;for(let r=0;r<e.controllers.length;r++)e.controllers[r].index===s.index&&(o=!0);o||(lc&&console.log(`XRSync: ${s.type} ${s.handedness} removed`,s.index),this.controllerStates.splice(t,1),this.sendControllerRemoved(s))}for(const t of e.controllers)this.updateControllerStates(t)}}onExitXR(e){for(const t of this.controllerStates)this.sendControllerRemoved(t);this.controllerStates.length=0}sendControllerRemoved(e){e.isTracking=!1,e.guid="",this.context.connection.send(this.userStateEvtName,e),this.context.connection.sendDeleteRemoteState(e.guid)}updateControllerStates(e){const t=this.controllerStates.find(s=>s.index===e.index);if(t){let s=!1;s||(s=t.isTracking!=e.isTracking),s&&(t.isTracking=e.isTracking,this.context.connection.send(this.userStateEvtName,t))}else{const s={guid:this.userId+"-"+e.index,isTracking:e.isTracking,handedness:e.side,index:e.index,type:e.hand?"hand":"controller"};this.controllerStates.push(s),this.context.connection.send(this.userStateEvtName,s),lc&&console.log(`XRSync: ${s.type} ${s.handedness} added`,s.index)}}}class __{constructor(e){a(this,"context"),a(this,"onJoinedRoom",()=>{if(this.context.connection.connectionId){this._states.has(this.context.connection.connectionId)||(lc&&console.log("XRSync: Local user joined room",this.context.connection.connectionId),this._states.set(this.context.connection.connectionId,new Ig(this.context.connection.connectionId,this.context)));for(const t of this.context.connection.usersInRoom())this._states.has(t)||this._states.set(t,new Ig(t,this.context))}}),a(this,"onLeftRoom",()=>{if(this.context.connection.connectionId&&!this._states.has(this.context.connection.connectionId)){const t=this._states.get(this.context.connection.connectionId);t?.dispose(),this._states.delete(this.context.connection.connectionId)}}),a(this,"onOtherUserJoinedRoom",t=>{const s=t.userId;this._states.has(s)||(lc&&console.log("XRSync: Remote user joined room",s),this._states.set(s,new Ig(s,this.context)))}),a(this,"onOtherUserLeftRoom",t=>{const s=t.userId;if(!this._states.has(s)){const o=this._states.get(s);o?.dispose(),this._states.delete(s)}}),a(this,"_states",new Map),this.context=e,this.context.connection.beginListen(ie.JoinedRoom,this.onJoinedRoom),this.context.connection.beginListen(ie.LeftRoom,this.onLeftRoom),this.context.connection.beginListen(ie.UserJoinedRoom,this.onOtherUserJoinedRoom),this.context.connection.beginListen(ie.UserLeftRoom,this.onOtherUserLeftRoom)}hasState(e){return e?this._states.has(e):!1}isTracking(e,t){if(!e)return;const s=this._states.get(e);if(!s)return;const o=s.controllerStates.find(r=>r.handedness===t);return o?.isTracking||!1}getDeviceType(e,t){if(!e)return;const s=this._states.get(e);if(!s)return;const o=s.controllerStates.find(r=>r.handedness===t);return o?.type||"unknown"}destroy(){this.context.connection.stopListen(ie.JoinedRoom,this.onJoinedRoom),this.context.connection.stopListen(ie.LeftRoom,this.onLeftRoom),this.context.connection.stopListen(ie.UserJoinedRoom,this.onOtherUserJoinedRoom),this.context.connection.stopListen(ie.UserLeftRoom,this.onOtherUserLeftRoom)}onUpdate(e){if(this.context.connection.isConnected&&this.context.connection.connectionId){const t=this._states.get(this.context.connection.connectionId);t?.update(e)}}onExitXR(e){if(this.context.connection.isConnected&&this.context.connection.connectionId){const t=this._states.get(this.context.connection.connectionId);t?.onExitXR(e)}}}class w_{constructor(){a(this,"_fadeToColorQuad"),a(this,"_fadeToColorMaterial"),a(this,"_requestedFadeValue",0),a(this,"_transitionPromise",null),a(this,"_transitionResolve",null),this._fadeToColorMaterial=new Me({color:0,transparent:!0,depthTest:!1,fog:!1,side:Pi}),this._fadeToColorQuad=new G(new Ns(10,10),this._fadeToColorMaterial)}dispose(){this._fadeToColorQuad.geometry.dispose(),this._fadeToColorMaterial.dispose()}update(e,t){const s=this._fadeToColorQuad,o=this._fadeToColorMaterial;s.parent!==e&&o.opacity>0?e.add(s):o.opacity===0&&s.removeFromParent(),s.layers.set(2),s.material=this._fadeToColorMaterial,s.position.z=-1,s.renderOrder=1/0;const r=this._requestedFadeValue;o.opacity=W.lerp(o.opacity,r,t/.03),Math.abs(o.opacity-r)<=.01&&this._transitionResolve&&(this._transitionResolve(),this._transitionResolve=null,this._transitionPromise=null,this._requestedFadeValue=0)}remove(){this._fadeToColorQuad.removeFromParent()}fadeTransition(){if(this._transitionPromise)return this._transitionPromise;this._requestedFadeValue=1;const e=new Promise(t=>{this._transitionResolve=t});return this._transitionPromise=e,e}}var Cr=(n=>(n[n.Quad=0]="Quad",n[n.Cube=1]="Cube",n[n.Sphere=2]="Sphere",n[n.Cylinder=3]="Cylinder",n[n.RoundedCube=10]="RoundedCube",n))(Cr||{}),$d,Lg;class wo{static createText(e,t){let s=null;const o=t?.font||dM(t?.familyFamily||null);o instanceof YP?s=dd(this,$d,Lg).call(this,e,o,t):s==null&&(s=new Vs);const r=t?.color||16777215,l=new G(s,t?.material??new bt({color:r}));return this.applyDefaultObjectOptions(l,t),o instanceof Promise?o.then(c=>{l.geometry=dd(this,$d,Lg).call(this,e,c,t),t!=null&&t.onGeometry&&t.onGeometry(l)}):t!=null&&t.onGeometry&&t.onGeometry(l),l}static createOccluder(e){const t=new Me({colorWrite:!1,depthWrite:!0,side:Pi});return this.createPrimitive(e,{material:t})}static createPrimitive(e,t){let s;const o=t?.color||16777215;switch(e){case"Quad":case 0:{const r=new Ns(1,1,1,1),l=t?.material??new bt({color:o});t!=null&&t.texture&&"map"in l&&(l.map=t.texture),s=new G(r,l),s.name="Quad"}break;case"Cube":case 1:{const r=new xa(1,1,1),l=t?.material??new bt({color:o});t!=null&&t.texture&&"map"in l&&(l.map=t.texture),s=new G(r,l),s.name="Cube"}break;case 10:case"RoundedCube":{const r=hM(1,1,1,.1,2),l=t?.material??new bt({color:o});t!=null&&t.texture&&"map"in l&&(l.map=t.texture),s=new G(r,l),s.name="RoundedCube"}break;case"Sphere":case 2:{const r=new pd(.5,16,16),l=t?.material??new bt({color:o});t!=null&&t.texture&&"map"in l&&(l.map=t.texture),s=new G(r,l),s.name="Sphere"}break;case"Cylinder":case 3:{const r=new Rv(.5,.5,1,32),l=t?.material??new bt({color:o});t!=null&&t.texture&&"map"in l&&(l.map=t.texture),s=new G(r,l),s.name="Cylinder"}break;case"ShaderBall":s=new mo,s.name="ShaderBall",uM(s,t);break}return this.applyDefaultObjectOptions(s,t),s}static createSprite(e){const t=new AC({color:16777215});e!=null&&e.texture&&"map"in t&&(t.map=e.texture);const s=new IC(t);return this.applyDefaultObjectOptions(s,e),s}static applyDefaultObjectOptions(e,t){e.receiveShadow=!0,e.castShadow=!0,t!=null&&t.name&&(e.name=t.name),t!=null&&t.position&&(Array.isArray(t.position)?e.position.set(t.position[0],t.position[1],t.position[2]):e.position.set(t.position.x,t.position.y,t.position.z)),t!=null&&t.rotation&&(Array.isArray(t.rotation)?e.rotation.set(t.rotation[0],t.rotation[1],t.rotation[2]):e.rotation.set(t.rotation.x,t.rotation.y,t.rotation.z)),t!=null&&t.scale&&(typeof t.scale=="number"?e.scale.set(t.scale,t.scale,t.scale):Array.isArray(t.scale)?e.scale.set(t.scale[0],t.scale[1],t.scale[2]):e.scale.set(t.scale.x,t.scale.y,t.scale.z)),t?.receiveShadow!=null&&(e.receiveShadow=t.receiveShadow),t?.castShadow!=null&&(e.castShadow=t.castShadow),t!=null&&t.parent&&t.parent.add(e)}}$d=new WeakSet,Lg=function(n,e,t){const s=t?.depth||.1;return new KP(n,{font:e,size:1,depth:s,height:s,bevelEnabled:t?.bevel||!1,bevelThickness:.01,bevelOffset:.01,bevelSize:.01})},Us(wo,$d);function hM(n,e,t,s,o){const r=new LC,l=1e-5,c=s-l;r.absarc(l,l,l,-Math.PI/2,-Math.PI,!0),r.absarc(l,e-c*2,l,Math.PI,Math.PI/2,!0),r.absarc(n-c*2,e-c*2,l,Math.PI/2,0,!0),r.absarc(n-c*2,l,l,0,-Math.PI/2,!0);const h=new jC(r,{bevelEnabled:!0,bevelSegments:o*2,steps:1,bevelSize:c,bevelThickness:s,curveSegments:o});return h.scale(1,1,1-s),h.center(),h.computeVertexNormals(),h}const Hd=new Map;function dM(n){let e="";switch(n){default:case"OpenSans":e="https://cdn.needle.tools/static/fonts/facetype/Open Sans_Regular_ascii.json";break;case"Helvetiker":e="https://raw.githubusercontent.com/mrdoob/three.js/master/examples/fonts/helvetiker_regular.typeface.json";break}if(Hd.has(e)){const o=Hd.get(e);if(o)return o}const t=new ZP,s=new Promise((o,r)=>{t.load(e,l=>{Hd.set(e,l),o(l)},void 0,r)});return Hd.set(e,s),s}let jg=!1,Dg=null;function uM(n,e){if(Dg===null){const t="https://cdn.needle.tools/static/models/shaderball.glb",s=new Rn,o=Nm(null);s.setDRACOLoader(o.dracoLoader),s.setKTX2Loader(o.ktx2Loader),jg=!0,Dg=s.loadAsync(t).then(r=>{const l=r.scene;return l.position.y-=.5,l}).catch(r=>(console.warn("Failed to load shaderball mesh: "+r.message),S_())).finally(()=>{jg=!1})}if(jg){const t=S_();t.name="ShaderBall-Placeholder";const s=t.children[0];s?.type==="Mesh"&&x_(s,e),n.add(t)}Dg.then(t=>{n.children.forEach(r=>{r.name==="ShaderBall-Placeholder"&&n.remove(r)});const s=t.clone(),o=s.children[0];o?.type==="Mesh"&&x_(o,e),n.add(s)})}function x_(n,e){var t;if(e?.color||e?.material||e?.texture){const s=e?.material??((t=n.material)==null?void 0:t.clone())??new bt;e.color&&"color"in s&&s.color instanceof oe&&s.color.set(e.color),e!=null&&e.texture&&"map"in s&&(s.map=e.texture),n.material=s}}function S_(){return new mo().add(wo.createPrimitive("Sphere",{material:new Me({transparent:!0,opacity:.1})}))}const Bg=class gC{constructor(e,t,s){a(this,"_session"),a(this,"_mode"),a(this,"_init"),a(this,"_renderer"),a(this,"_camera"),a(this,"_scene"),a(this,"onEnd",()=>{var o;(o=this._session)==null||o.removeEventListener("end",this.onEnd),this._renderer.setAnimationLoop(null),this._renderer.dispose(),this._scene.clear()}),a(this,"_lastTime",0),a(this,"onFrame",(o,r)=>{const l=o-this._lastTime;this.update(o,l),this._camera.parent!==this._scene&&this._scene.add(this._camera),this._renderer.render(this._scene,this._camera)}),a(this,"_objects",[]),this._mode=e,this._init=t,this._session=s,this._session.addEventListener("end",this.onEnd),this._renderer=new fr({alpha:!0}),this._renderer.setAnimationLoop(this.onFrame),this._renderer.xr.setSession(s),this._renderer.xr.enabled=!0,this._camera=new we,this._scene=new xi,this._scene.fog=new Tv(4473924,10,250),this._scene.add(this._camera),this.setupScene()}static get active(){return this._active}static async start(e,t){if(this._active)return console.error("Cannot start a new XR session while one is already active"),null;if(this._requestInFlight)return console.error("Cannot start a new XR session while a request is already in flight"),null;if("xr"in navigator&&navigator.xr){if(!t)return console.error("XRSessionInit must be provided"),null;this._requestInFlight=!0;const s=await navigator.xr.requestSession(e,t);return s.addEventListener("end",()=>{this._active=null}),this._requestInFlight?(this._requestInFlight=!1,this._active=new gC(e,t,s),this._active):(s.end(),null)}return null}static async handoff(){return this._active?this._active.handoff():null}static async stop(){this._requestInFlight=!1,this._active&&(await this._active.end(),await vs(100)),this._active=null}get isAR(){return this._mode==="immersive-ar"}end(){return this._session?this._session.end():Promise.resolve()}async handoff(){if(!this._session)throw new Error("Cannot handoff a session that has already ended");const e={session:this._session,mode:this._mode,init:this._init};return await this.onBeforeHandoff(),this.onEnd(),this._session=null,e}async onBeforeHandoff(){await vs(1e3),this._scene.clear()}setupScene(){this._scene.background=new oe(0),this._scene.add(new Mm(5,10,1118481,1118481));const e=new Rm(16777215,1);e.position.set(0,20,0),e.castShadow=!1,this._scene.add(e);const t=new Rm(16777215,1);t.position.set(0,-1,0),t.castShadow=!1,this._scene.add(t);const s=new Tm(16777215,1,100,1);s.position.set(0,2,0),s.castShadow=!1,s.distance=200,this._scene.add(s);const o=50;for(let r=0;r<100;r++){const l=new bt({color:2236962,metalness:1,roughness:.8});this.isAR&&(l.emissive=new oe(Math.random(),Math.random(),Math.random()),l.emissiveIntensity=Math.random());const c=W.random(0,1)>.5?Cr.Sphere:Cr.Cube,h=wo.createPrimitive(c,{material:l});h.position.x=W.random(-o,o),h.position.y=W.random(-2,o),h.position.z=W.random(-o,o),h.rotation.x=W.random(0,Math.PI*2),h.rotation.y=W.random(0,Math.PI*2),h.rotation.z=W.random(0,Math.PI*2),h.scale.multiplyScalar(.5+Math.random()*10);const d=h.position.distanceTo(this._camera.position)-h.scale.x;d<1&&h.position.multiplyScalar(1+1/d),this._objects.push(h),this._scene.add(h)}}update(e,t){const s=e*4e-4;for(let o=0;o<this._objects.length;o++){const r=this._objects[o];r.position.y+=Math.sin(s+o*.5)*.005,r.rotateY(.002)}}};a(Bg,"_active",null),a(Bg,"_requestInFlight",!1);let Gd=Bg;var cc;(n=>{const e=[];function t(){if(!(e!=null&&e.length))return!1;for(const r of e)r.exportAndOpen();return!0}n.exportAndOpen=t;function s(r){e.push(r)}n.registerExporter=s;function o(r){if(!e)return;const l=e.indexOf(r);l>=0&&e.splice(l,1)}n.unregisterExporter=o})(cc||(cc={}));const Je=C("debugwebxr"),C_=C("stats");let Fg=0;function pM(n){let e=null;const t=n;return t.getAROverlayContainer?e=t.getAROverlayContainer():e=n,e}mM();async function mM(){var n;if(C("debugasap")){let e=globalThis["needle:XRSession"];if(e instanceof Promise){delete globalThis["needle:XRSession"],pe.addContextCreatedCallback(async t=>{if(!e)return;wr(!0);const s=await e;if(s){const o=ne.getDefaultSessionInit("immersive-vr");ne.setSession("immersive-vr",s,o,t.context)}else console.error("NeedleXRSession: ASAP session was rejected");e=void 0});return}}if("xr"in navigator){if(/WebXRViewer\//i.test(navigator.userAgent)){console.warn("WebXRViewer does not support addEventListener");return}(n=navigator.xr)==null||n.addEventListener("sessiongranted",async()=>{wr(!0),console.log("Received Session Granted..."),await vs(100);const e=sessionStorage.getItem("needle_xr_session_mode"),t=sessionStorage.getItem("needle_xr_session_init")??null,s=t?JSON.parse(t):null;let o=null;if(P_()&&(await Gd.start(e||"immersive-vr",s||ne.getDefaultSessionInit("immersive-vr")),await yM(),o=await Gd.handoff()),o)ne.setSession(o.mode,o.session,o.init,J.Current);else if(e&&t){console.log("Session Granted: Restore last session");const r=JSON.parse(t);ne.start(e,r).catch(l=>console.warn(l))}else ne.start("immersive-vr").catch(r=>console.warn("Session Granted failed:",r))},{once:!0})}}function gM(n,e){sessionStorage.setItem("needle_xr_session_mode",n),sessionStorage.setItem("needle_xr_session_init",JSON.stringify(e))}function fM(){sessionStorage.removeItem("needle_xr_session_mode"),sessionStorage.removeItem("needle_xr_session_init")}const Ug=new Set;pe.registerCallback(me.ContextCreationStart,async n=>{Ug.add(n.context)}),pe.registerCallback(me.ContextCreated,async n=>{var e;Ug.delete(n.context);const t=((e=n.context)==null?void 0:e.domElement.getAttribute("autostart"))||null;vM(t)});function P_(){return Ug.size>0}function yM(){return new Promise(n=>{const e=Date.now(),t=setInterval(()=>{(!P_()||Date.now()-e>6e4)&&(clearInterval(t),n())},100)})}X.isDesktop()&&F()&&window.addEventListener("keydown",n=>{(n.key==="x"||n.key==="Escape")&&ne.active&&ne.stop()});function vM(n){if(n)switch(n?.toLowerCase()){case"ar":Ln.registerWaitForInteraction(()=>{ne.start("ar")});break}}const ai=class ba{constructor(e,t,s,o){a(this,"context"),a(this,"session"),a(this,"mode"),a(this,"controllers",[]),a(this,"_rigScale",1),a(this,"_lastRigScaleUpdate",-1),a(this,"_rigs",[]),a(this,"_viewerHitTestSource",null),a(this,"_defaultRig"),a(this,"_xr_scripts"),a(this,"_xr_update_scripts",[]),a(this,"_inactive_scripts",[]),a(this,"_controllerAdded"),a(this,"_controllerRemoved"),a(this,"_originalCameraWorldPosition"),a(this,"_originalCameraWorldRotation"),a(this,"_originalCameraWorldScale"),a(this,"_originalCameraParent"),a(this,"_mainCamera",null),a(this,"onRendererSessionSet",()=>{var c;this.running&&(this.context.renderer.xr.enabled=!0,this.context.renderer.xr.updateCamera(this.context.mainCamera),(c=this.context.mainCameraComponent)==null||c.applyClearFlags())}),a(this,"onInputSourceAdded",c=>{if(c.targetRayMode==="screen")return;let h=0;for(let u=0;u<this.session.inputSources.length;u++)if(this.session.inputSources[u]===c){h=u;break}if(this.controllers.find(u=>u.inputSource===c)){console.debug("Controller already exists for input source",h);return}else if(this._newControllers.find(u=>u.inputSource===c)){console.debug("Controller already registered for input source",h);return}const d=new Pg(this,c,h);this._newControllers.push(d)}),a(this,"_ended",!1),a(this,"_newControllers",[]),a(this,"onEnd",c=>{var h,d,u;if(this._ended)return;this._ended=!0,console.debug("XR Session ended"),fM(),this.onAfterRender(),this.revertCustomForward(),this._didStart=!1,this._previousCameraParent=null,_o(this.onBefore,Oe.LateUpdate);const p=this.context.pre_render_callbacks.indexOf(this.onBeforeRender);p>=0&&this.context.pre_render_callbacks.splice(p,1);const g=this.context.post_render_callbacks.indexOf(this.onAfterRender);g>=0&&this.context.post_render_callbacks.splice(g,1),this.context.xr=null,this.context.renderer.xr.enabled=!1,this.context.pre_update_oneshot_callbacks.push(()=>{var y,v;(y=this.context.mainCameraComponent)==null||y.applyClearFlags(),(v=this.context.mainCameraComponent)==null||v.applyClippingPlane()}),s_({session:this});for(const y of ba._xrEndListeners)y({xr:this});const f=[...this.controllers];for(let y=0;y<f.length;y++)this.disconnectInputSource(f[y].inputSource);this._newControllers.length=0,this.controllers.length=0;for(const y of this._xr_scripts)(h=y?.onLeaveXR)==null||h.call(y,{xr:this});(d=this.sync)==null||d.onExitXR(this),this.context.mainCamera&&((u=this._originalCameraParent)==null||u.add(this.context.mainCamera),this._originalCameraWorldPosition&<(this.context.mainCamera,this._originalCameraWorldPosition),this._originalCameraWorldRotation&&Yi(this.context.mainCamera,this._originalCameraWorldRotation),this._originalCameraWorldScale&&Ta(this.context.mainCamera,this._originalCameraWorldScale)),this.context.requestSizeUpdate(),this._defaultRig.gameObject.removeFromParent(),wr(!1)}),a(this,"_didStart",!1),a(this,"onBefore",c=>{var h,d,u,p,g,f,y,v;const b=c.xrFrame;if(!b)return;this.context.xr=this,this.context.mainCameraComponent&&this.context.mainCameraComponent!==this._mainCamera&&(this._mainCamera=this.context.mainCameraComponent),((h=this.rig)==null?void 0:h.isActive)==!1&&(Je&&console.warn("Latest rig is not active - trying to activate a different rig",this.rig),this.updateActiveXRRig()),this.rig&&(d=this._mainCamera)!=null&&d.gameObject&&((p=(u=this._mainCamera)==null?void 0:u.gameObject)==null?void 0:p.parent)!==this.rig.gameObject&&this.rig.gameObject.add((g=this._mainCamera)==null?void 0:g.gameObject),this.internalUpdateState(),this.applyCustomForward();const _={xr:this};if(this._didStart){if(this.context.new_scripts_xr.length>0){const w=[...this.context.new_scripts_xr];for(let x=0;x<w.length;x++){const k=this.context.new_scripts_xr[x];if(!k||k.destroyed||((f=k.supportsXR)==null?void 0:f.call(k,this.mode))==!1){this.context.new_scripts_xr.splice(x,1);continue}if(!k.activeAndEnabled){this.context.new_scripts_xr.splice(x,1),this.markInactive(k);continue}if(this.addScript(k)){this.invokeCallback_EnterXR(k);for(const M of this.controllers)this.invokeCallback_ControllerAdded(k,M)}}}}else{if(this._didStart=!0,this.mode==="immersive-vr"){const x=si(this.context.scene.children);if(x){const k=x.getSize(q());if(k.length()>0){const M=this._defaultRig.gameObject;M.position.set(x.min.x+k.x*.5,x.min.y,x.max.z+k.z*.5+1.5);const T=x.getCenter(q());T.y=M.position.y,M.lookAt(T)}}}i_({session:this}),Sr();for(const x of ba._xrStartListeners)x(_);const w=[...this._xr_scripts];Je&&console.log("NeedleXRSession start, handle scripts:",w);for(const x of w){if(x.destroyed){this._script_to_remove.push(x);continue}if(!x.activeAndEnabled){this.markInactive(x);continue}this.invokeCallback_EnterXR(x);for(const k of this.controllers)this.invokeCallback_ControllerAdded(x,k)}}this.syncCameraCullingMask();for(const w of this.controllers)w.onUpdate(b);if(this._newControllers.length>0){const w=[...this._newControllers];this._newControllers.length=0;for(const x of w){if(!x.connected){console.warn("New controller is not connected",x);continue}this.controllers.push(x);for(const k of this._xr_scripts){if(k.destroyed){this._script_to_remove.push(k);continue}k.activeAndEnabled!==!1&&this.invokeCallback_ControllerAdded(k,x)}}this.controllers.sort((x,k)=>x.index-k.index)}Je&&this.context.time.frame%30===0&&this.controllers.length<=0&&this.session.inputSources.length>0&&(wr(!0),console.error("XRControllers are not added but inputSources are present"));for(const w of this._xr_update_scripts){if(w.destroyed===!0){this._script_to_remove.push(w);continue}if(w.activeAndEnabled===!1){this.markInactive(w);continue}w.onUpdateXR&&w.onUpdateXR(_)}if(this.handleInactiveScripts(),this._script_to_remove.length>0){const w=[...new Set(this._script_to_remove)];this._script_to_remove.length=0;for(const x of w)!x.destroyed&&this.running&&((y=x.onLeaveXR)==null||y.call(x,_)),this.removeScript(x)}(v=this.sync)==null||v.onUpdate(this),this.onRenderDebug()}),a(this,"onBeforeRender",()=>{this.context.mainCamera&&this.updateFade(this.context.mainCamera)}),a(this,"onAfterRender",()=>{if(this.onUpdateFade_PostRender(),X.isDesktop()||!this._renderOnceOnDevice){const c=this.context.renderer;if(c.xr.isPresenting&&this.context.mainCamera){this._renderOnceOnDevice=!0;const h=c.xr.enabled,d=c.getRenderTarget(),u=this.context.scene.background;c.xr.enabled=!1,c.setRenderTarget(null),this.isPassThrough&&(this.context.scene.background=null),this.context.composer?this.context.composer.render(this.context.time.deltaTime):c.render(this.context.scene,this.context.mainCamera),c.xr.enabled=h,c.setRenderTarget(d),this.context.scene.background=u}}}),a(this,"_script_to_remove",[]),a(this,"_camera"),a(this,"_cameraRenderParent",new E().rotateY(Math.PI)),a(this,"_previousCameraParent"),a(this,"_customforward",!0),a(this,"originalCameraNearPlane"),a(this,"_viewerPose"),a(this,"_transformOrientation",new V),a(this,"_transformPosition",new S),a(this,"_transition");var r,l;gM(e,o.init),this.session=t,this.mode=e,this.context=s,(Je||C("console"))&&wr(!0),this._xr_scripts=[...o.scripts],this._xr_update_scripts=this._xr_scripts.filter(c=>typeof c.onUpdateXR=="function"),this._controllerAdded=o.controller_added,this._controllerRemoved=o.controller_removed,jn(this.onBefore,Oe.LateUpdate),this.context.pre_render_callbacks.push(this.onBeforeRender),this.context.post_render_callbacks.push(this.onAfterRender),((r=o.init.optionalFeatures)!=null&&r.includes("hit-test")||(l=o.init.requiredFeatures)!=null&&l.includes("hit-test"))&&t.requestReferenceSpace("viewer").then(c=>{var h,d;return(d=(h=t.requestHitTestSource)==null?void 0:h.call(t,{space:c}))==null?void 0:d.then(u=>this._viewerHitTestSource=u).catch(u=>console.error(u))}).catch(c=>console.error(c)),this.context.mainCamera&&(this._originalCameraWorldPosition=ee(this.context.mainCamera,new S),this._originalCameraWorldRotation=Se(this.context.mainCamera,new V),this._originalCameraWorldScale=Ge(this.context.mainCamera,new S),this._originalCameraParent=this.context.mainCamera.parent),this._defaultRig=new Zk,this.context.scene.add(this._defaultRig.gameObject),this.addRig(this._defaultRig);for(let c=0;c<t.inputSources.length;c++){const h=t.inputSources[c];if(!h.handedness){console.warn("Input source in xr session has no handedness - ignoring",c);continue}this.onInputSourceAdded(h)}this.session.addEventListener("end",this.onEnd),this.session.addEventListener("inputsourceschange",c=>{for(const h of c.removed)this.disconnectInputSource(h);for(const h of c.added)this.onInputSourceAdded(h)}),this.context.xr=this,this.context.renderer.xr.setSession(this.session).then(this.onRendererSessionSet),"controllerAutoUpdate"in this.context.renderer.xr?(console.debug("Disabling three.js controllerAutoUpdate"),this.context.renderer.xr.controllerAutoUpdate=!1):Je&&console.warn("controllerAutoUpdate is not available in three.js - cannot disable it")}static getXRSync(e){return this._sync||(this._sync=new __(e)),this._sync}static get currentSessionRequest(){return this._currentSessionRequestMode}static get active(){return this._activeSession}static get activeMode(){var e;return((e=this._activeSession)==null?void 0:e.mode)??null}static get xrSystem(){return"xr"in navigator?navigator.xr:void 0}static isXRSupported(){return Promise.all([this.isVRSupported(),this.isARSupported()]).then(e=>e.some(t=>t)).catch(()=>!1)}static isVRSupported(){return this.isSessionSupported("immersive-vr")}static isARSupported(){return this.isSessionSupported("immersive-ar")}static isSessionSupported(e){var t;return((t=this.xrSystem)==null?void 0:t.isSessionSupported(e).catch(s=>(Je&&console.error(s),!1)))??Promise.resolve(!1)}static onSessionRequestStart(e){this._sessionRequestStartListeners.push(e)}static offSessionRequestStart(e){const t=this._sessionRequestStartListeners.indexOf(e);t>=0&&this._sessionRequestStartListeners.splice(t,1)}static onSessionRequestEnd(e){this._sessionRequestEndListeners.push(e)}static offSessionRequestEnd(e){const t=this._sessionRequestEndListeners.indexOf(e);t>=0&&this._sessionRequestEndListeners.splice(t,1)}static onXRSessionStart(e){this._xrStartListeners.push(e)}static offXRSessionStart(e){const t=this._xrStartListeners.indexOf(e);t>=0&&this._xrStartListeners.splice(t,1)}static onXRSessionEnd(e){this._xrEndListeners.push(e)}static offXRSessionEnd(e){const t=this._xrEndListeners.indexOf(e);t>=0&&this._xrEndListeners.splice(t,1)}static onControllerAdded(e){this._controllerAddedListeners.push(e)}static offControllerAdded(e){const t=this._controllerAddedListeners.indexOf(e);t>=0&&this._controllerAddedListeners.splice(t,1)}static onControllerRemoved(e){this._controllerRemovedListeners.push(e)}static offControllerRemoved(e){const t=this._controllerRemovedListeners.indexOf(e);t>=0&&this._controllerRemovedListeners.splice(t,1)}static offerSession(e,t,s){return"xr"in navigator&&navigator.xr&&"offerSession"in navigator.xr?(typeof navigator.xr.offerSession=="function"&&(console.log("WebXR offerSession is available - requesting mode: "+e),t=="default"&&(t=this.getDefaultSessionInit(e)),navigator.xr.offerSession(e,{...t}).then(o=>ba.setSession(e,o,t,s)).catch(o=>{console.log("XRSession offer rejected (perhaps because another call to offerSession was made or a call to requestSession was made)")})),!0):!1}static getDefaultSessionInit(e){switch(e){case"immersive-ar":const t=["anchors","local-floor","layers","dom-overlay","hit-test","unbounded"];return X.isVisionOS()||t.push("hand-tracking"),{optionalFeatures:t};case"immersive-vr":const s=["local-floor","bounded-floor","high-fixed-foveation-level","layers"];return X.isVisionOS()||s.push("hand-tracking"),{optionalFeatures:s};default:return console.warn("No default session init for mode",e),{}}}static async start(e,t,s){var o,r,l,c;if(X.isiOS()){if(e==="ar")if(await this.isARSupported())e="immersive-ar";else return cc.exportAndOpen(),null}else e=="ar"&&(e="immersive-ar");if(F()&&C("debugxrpreroom"))return console.warn("Debug: Starting temporary XR session"),await Gd.start(e,t||ba.getDefaultSessionInit(e)),null;if(this._currentSessionRequest)return console.warn("A XRSession is already being requested"),(Je||F())&&be("A XRSession is already being requested"),this._currentSessionRequest.then(()=>this._activeSession);if(this._activeSession)return console.error("A XRSession is already running"),this._activeSession;if(s||(s=J.Current),s||(s=pe.All[0]),!s)throw new Error("No Needle Engine Context found");switch(t||(t={}),e){case"immersive-ar":{if(await((o=this.xrSystem)==null?void 0:o.isSessionSupported("immersive-ar"))!==!0)return console.error(e+" is not supported by this browser."),null;const u=this.getDefaultSessionInit(e),p=pM(s.domElement);p&&!X.isQuest()&&(u.domOverlay={root:p},u.optionalFeatures.push("dom-overlay")),t={...u,...t}}break;case"immersive-vr":{if(await((r=this.xrSystem)==null?void 0:r.isSessionSupported("immersive-vr"))!==!0)return console.error(e+" is not supported by this browser."),null;t={...this.getDefaultSessionInit(e),...t}}break;default:console.warn("No default session init for mode",e);break}t.optionalFeatures??(t.optionalFeatures=[]),t.requiredFeatures??(t.requiredFeatures=[]),await Gd.stop();const h=e=="immersive-ar"?s.scripts_immersive_ar:s.scripts_immersive_vr;Je?console.log(`%cRequesting ${e} session`,"font-weight:bold;",t,h):console.log(`%cRequesting ${e} session`,"font-weight:bold;");for(const u of h)u.onBeforeXR&&u.onBeforeXR(e,t);for(const u of this._sessionRequestStartListeners)u({mode:e,init:t});Je&&De("Requesting "+e+" session ("+Date.now()+")"),this._currentSessionRequest=(l=navigator.xr)==null?void 0:l.requestSession(e,t),this._currentSessionRequestMode=e;const d=await((c=this._currentSessionRequest)==null?void 0:c.catch(u=>{console.error(u,"Code: "+u.code),u.code===9&&be("Make sure your device has the required permissions (e.g. camera access)"),console.log("If the specified XR configuration is not supported (e.g. entering AR doesnt work) - make sure you access the website on a secure connection (HTTPS) and your device has the required permissions (e.g. camera access)"),location.protocol==="http:"&&be("XR requires a secure connection (HTTPS)")}));this._currentSessionRequest=void 0,this._currentSessionRequestMode=null;for(const u of this._sessionRequestEndListeners)u({mode:e,init:t,newSession:d||null});return d?this.setSession(e,d,t,s):(console.warn("XR Session request was rejected"),null)}static setSession(e,t,s,o){if(this._activeSession)return console.error("A XRSession is already running"),this._activeSession;const r=e=="immersive-ar"?o.scripts_immersive_ar:o.scripts_immersive_vr;return this._activeSession=new ba(e,t,o,{scripts:r,controller_added:this._controllerAddedListeners,controller_removed:this._controllerRemovedListeners,init:s}),t.addEventListener("end",this.onEnd),Je?console.log(`%cStarted ${e} session`,"font-weight:bold;",r):console.log(`%cStarted ${e} session`,"font-weight:bold;"),this._activeSession}static stop(){const e=this._activeSession;e&&(e[this.$_stop_request]===void 0?(Je&&console.log("[NeedleXRSession] Stopping XR Session... (new)"),e[this.$_stop_request]=setTimeout(()=>{e.end()})):Je&&console.warn("[NeedleXRSession] XR Session stop already requested"))}get sync(){return ba._sync}get running(){return!this._ended&&this.session!=null}get interactionMode(){return this.session.interactionMode}get visibilityState(){return this.session.visibilityState}get isVisibleBlurred(){return this.session.visibilityState==="visible-blurred"}get isSystemKeyboardSupported(){return this.session.isSystemKeyboardSupported}get environmentBlendMode(){return this.session.environmentBlendMode}get frame(){return this.context.xrFrame}get leftController(){return this.controllers.find(e=>e.side==="left")}get rightController(){return this.controllers.find(e=>e.side==="right")}getController(e){return typeof e=="number"?this.controllers[e]||null:this.controllers.find(t=>t.side===e)||null}get isPassThrough(){return!!(this.environmentBlendMode!=="opaque"&&this.interactionMode==="world-space"||this.mode==="immersive-ar"&&this.environmentBlendMode!=="opaque"&&this.controllers.some(e=>e.inputSource.targetRayMode==="tracked-pointer")||F()&&X.isDesktop()&&this.mode==="immersive-ar")}get isAR(){return this.mode==="immersive-ar"}get isVR(){return this.mode==="immersive-vr"}get isScreenBasedAR(){return this.isAR&&!this.isPassThrough}get posePosition(){return this._transformPosition}get poseOrientation(){return this._transformOrientation}get referenceSpace(){return this.context.renderer.xr.getReferenceSpace()}get viewerPose(){return this._viewerPose}get isTrackingImages(){if(this.frame&&"getImageTrackingResults"in this.frame&&typeof this.frame.getImageTrackingResults=="function")try{const e=this.frame.getImageTrackingResults();for(const t of e)if(t.trackingState==="tracked")return!0}catch{return!1}return!1}get rig(){const e=this._rigs[0]??null;return e!=null&&e.gameObject&&Er(e.gameObject)||e?.isActive===!1?(this.updateActiveXRRig(),this._rigs[0]??null):e}get rigScale(){return this._rigs[0]?(this._lastRigScaleUpdate!==this.context.time.frame&&(this._lastRigScaleUpdate=this.context.time.frame,this._rigScale=this._rigs[0].gameObject.worldScale.x),this._rigScale):1}addRig(e){this._rigs.indexOf(e)>=0||(e.priority===void 0&&(e.priority=0),this._rigs.push(e),this.updateActiveXRRig())}removeRig(e){const t=this._rigs.indexOf(e);t!==-1&&(this._rigs.splice(t,1),this.updateActiveXRRig())}setRigActive(e){const t=this._rigs.indexOf(e),s=this._rigs[0];this._rigs.splice(t,1),this._rigs.unshift(e),e.priority=s?.priority??0,this.updateActiveXRRig()}getUserOffsetInRig(){var e;const t=(e=this.context.mainCamera)==null?void 0:e.position;if(!t||!this.rig)return q(0,0,0);const s=q(t);return s.x*=-1,s.z*=-1,s.applyQuaternion(bs(this.rig.gameObject.quaternion)),s}updateActiveXRRig(){const e=this._rigs[0]??null;this._defaultRig.gameObject.parent!==this.context.scene&&this.context.scene.add(this._defaultRig.gameObject),this._defaultRig.gameObject.visible=!0,this._rigs.includes(this._defaultRig)||this._rigs.push(this._defaultRig);let t=this._rigs[0];t&&t.priority===void 0&&(t.priority=0);for(let s=1;s<this._rigs.length;s++){const o=this._rigs[s];if(o.isActive){if(Er(o.gameObject)){this._rigs.splice(s,1),s--;continue}(!t||t.isActive===!1||o.priority!==void 0&&o.priority>t.priority)&&(t=o)}}if(e!==t){const s=this._rigs.indexOf(t);s>=0&&this._rigs.splice(s,1),this._rigs.unshift(t)}Je&&(e===t?console.log("Updated Active XR Rig:",t,"prev:",e):console.log("Updated Active XRRig:",t," (the same as before)"))}getHitTest(e){if(e)return this.getControllerHitTest(e);if(!this._viewerHitTestSource)return null;const t=this._viewerHitTestSource,s=this.frame.getHitTestResults(t);if(s.length>0){const o=s[0];return this.convertHitTestResult(o)}return null}getControllerHitTest(e){const t=e.getHitTestSource();if(!t)return null;const s=this.frame.getHitTestResultsForTransientInput(t);for(const o of s)if(o.inputSource===e.inputSource)for(const r of o.results)return this.convertHitTestResult(r);return null}convertHitTestResult(e){const t=this.context.renderer.xr.getReferenceSpace(),s=t&&e.getPose(t);if(s){const o=q(s.transform.position),r=bs(s.transform.orientation),l=this.context.mainCamera;if(l?.parent!==this._cameraRenderParent&&o.applyMatrix4(Ia),l!=null&&l.parent){o.applyMatrix4(l.parent.matrixWorld),r.multiply(Zi);const c=Se(l.parent);c.premultiply(Zi),r.premultiply(c)}return{hit:e,position:o,quaternion:r}}return null}convertSpace(e){const t=q(e.position);t.applyMatrix4(Ia);const s=bs(e.orientation);return s.premultiply(Zi),{position:t,quaternion:s}}disconnectInputSource(e){const t=(s,o,r)=>{if(s.inputSource===e){Je&&console.log("Disconnecting controller",s.index),this.controllers.splice(r,1),this.invokeControllerEvent(s,this._controllerRemoved,"removed");const l={xr:this,controller:s,change:"removed"};for(const c of this._xr_scripts)c.onXRControllerRemoved&&c.onXRControllerRemoved(l);s.onDisconnected()}};for(let s=this.controllers.length-1;s>=0;s--){const o=this.controllers[s];t(o,this.controllers,s)}for(let s=this._newControllers.length-1;s>=0;s--){const o=this._newControllers[s];t(o,this._newControllers,s)}}end(){this._ended||this.session.end().catch(e=>console.warn(e))}onRenderDebug(){if(Je)for(const e of this.controllers)e.onRenderDebug();if((Je||C_)&&this.rig&&(Fg++,Fg>=20)){const e=this.rig.gameObject.worldPosition,t=this.rig.gameObject.worldForward;e.add(t.multiplyScalar(1.5));const s=this.rig.gameObject.worldUp;e.add(s.multiplyScalar(2.5));let o="";if(o+=`${this.context.time.smoothedFps.toFixed(0)} FPS`,o+=`, calls: ${this.context.renderer.info.render.calls}, tris: ${this.context.renderer.info.render.triangles.toLocaleString()}`,Je||C_)for(const r of this.controllers)o+=`
|
|
166
|
+
${r.hand?"hand":"ctrl"} ${r.inputSource.handedness}[${r.index}] con:${r.connected} tr:${r.isTracking} hts:${r.hasHitTestSource?"yes":"no"}`;Fg=0,$.DrawLabel(e,o,void 0,1/60*20)}}addScript(e){return this._xr_scripts.includes(e)?!1:(Je&&console.log("Register new XRScript",e),this._xr_scripts.push(e),typeof e.onUpdateXR=="function"&&this._xr_update_scripts.push(e),!0)}markInactive(e){if(!(this._inactive_scripts.indexOf(e)>=0)){this.removeScript(e,!1),this._inactive_scripts.push(e);for(const t of this.controllers)this.invokeCallback_ControllerRemoved(e,t);this.invokeCallback_LeaveXR(e)}}handleInactiveScripts(){if(this._inactive_scripts.length>0)for(let e=this._inactive_scripts.length-1;e>=0;e--){const t=this._inactive_scripts[e];if(t.activeAndEnabled){this._inactive_scripts.splice(e,1),this.addScript(t),this.invokeCallback_EnterXR(t);for(const s of this.controllers)this.invokeCallback_ControllerAdded(t,s)}}}removeScript(e,t=!0){Je&&console.log("Remove XRScript",e);const s=this._xr_scripts.indexOf(e);s>=0&&this._xr_scripts.splice(s,1);const o=this._xr_update_scripts.indexOf(e);if(o>=0&&this._xr_update_scripts.splice(o,1),t){const r=this._inactive_scripts.indexOf(e);r>=0&&this._inactive_scripts.splice(r,1)}}invokeCallback_EnterXR(e){e.onEnterXR&&e.onEnterXR({xr:this})}invokeCallback_ControllerAdded(e,t){e.onXRControllerAdded&&e.onXRControllerAdded({xr:this,controller:t,change:"added"})}invokeCallback_ControllerRemoved(e,t){e.onXRControllerRemoved&&e.onXRControllerRemoved({xr:this,controller:t,change:"removed"})}invokeCallback_LeaveXR(e){e.onLeaveXR&&!e.destroyed&&e.onLeaveXR({xr:this})}syncCameraCullingMask(){var e;const t=this.context.xrCamera,s=(e=this.context.mainCameraComponent)==null?void 0:e.cullingMask;if(t&&s!==void 0){for(const o of t.cameras)o.layers.mask=s;t.layers.mask=s}else if(t){for(const o of t.cameras)o.layers.enableAll();t.layers.enableAll()}}invokeControllerEvent(e,t,s){for(let o=t.length-1;o>=0;o--){const r=t[o];if(r)try{r({xr:this,controller:e,change:s})}catch(l){console.error(l)}}}applyCustomForward(){var e;if(this.context.mainCamera&&this._customforward){this._camera=this.context.mainCamera,this._camera.parent!==this._cameraRenderParent&&(this._previousCameraParent=this._camera.parent,(e=this._previousCameraParent)==null||e.add(this._cameraRenderParent)),this._cameraRenderParent.name="XR Camera Render Parent",this._cameraRenderParent.add(this._camera);let t=.02;if(this.rig){const s=Ge(this.rig.gameObject);t*=s.x}this._camera instanceof we&&this._camera.near>t&&(this.originalCameraNearPlane=this._camera.near,this._camera.near=t)}}revertCustomForward(){this._camera&&this._previousCameraParent&&this._previousCameraParent.add(this._camera),this._previousCameraParent=null,this._camera instanceof we&&this.originalCameraNearPlane!=null&&(this._camera.near=this.originalCameraNearPlane)}internalUpdateState(){const e=this.context.renderer.xr.getReferenceSpace();if(!e){this._viewerPose=void 0;return}if(this._viewerPose=this.frame.getViewerPose(e),this._viewerPose){const t=this._viewerPose.transform;this._transformPosition.set(t.position.x,t.position.y,t.position.z),this._transformOrientation.set(t.orientation.x,t.orientation.y,t.orientation.z,t.orientation.w)}}get transition(){return this._transition||(this._transition=new w_),this._transition}fadeTransition(){return this._transition||(this._transition=new w_),this._transition.fadeTransition()}updateFade(e){this._transition&&e instanceof we&&this._transition.update(e,this.context.time.deltaTime)}onUpdateFade_PostRender(){var e;(e=this._transition)==null||e.remove()}};a(ai,"_sync",null),a(ai,"_currentSessionRequestMode",null),a(ai,"_currentSessionRequest"),a(ai,"_activeSession"),a(ai,"_sessionRequestStartListeners",[]),a(ai,"_sessionRequestEndListeners",[]),a(ai,"_xrStartListeners",[]),a(ai,"_xrEndListeners",[]),a(ai,"_controllerAddedListeners",[]),a(ai,"_controllerRemovedListeners",[]),a(ai,"$_stop_request",Symbol()),a(ai,"onEnd",()=>{Je&&console.log("XR Session ended"),ai._activeSession=null});let ne=ai;const zg=C("debugwebxr");class O_{static tryFindAvatarObjects(e,t,s){if(s.head&&s.leftHand&&s.rightHand)return;const o=e.name.toLocaleLowerCase();!s.head&&o.includes("head")&&(zg&&console.log("FOUND AVATAR HEAD",e.name),s.head=new ce("",t,e)),o.includes("hand")&&(!s.leftHand&&o.includes("left")&&(zg&&console.log("FOUND AVATAR LEFT HAND",e.name),s.leftHand=new ce("",t,e)),!s.rightHand&&o.includes("right")&&(zg&&console.log("FOUND AVATAR RIGHT HAND",e.name),s.rightHand=new ce("",t,e)));for(let r=0;r<e.children.length;r++){if(s.head&&s.leftHand&&s.rightHand)return;const l=e.children[r];this.tryFindAvatarObjects(l,t,s)}}}const Bt=new S,k_=new S,M_=new V,bM=C("debuggizmos"),Cs=8947848,Ng=32,Wg=class Bs{constructor(){}static isGizmo(e){return e[$g]!==void 0}static setVisible(e){for(const t of Ee.timedObjectsBuffer)t.visible=e}static DrawLabel(e,t,s=.05,o=0,r,l,c){var h;if(!Bs.enabled)return null;r||(r=Cs);const d=((h=ne.active)==null?void 0:h.rigScale)??1,u=Ee.getTextLabel(o,t,s*d,r,l);return c instanceof E&&c.add(u),u.position.x=e.x,u.position.y=e.y,u.position.z=e.z,u}static DrawRay(e,t,s=Cs,o=0,r=!0){if(!Bs.enabled)return;const l=Ee.getLine(o),c=l.geometry.getAttribute("position");c.setXYZ(0,e.x,e.y,e.z),Bt.set(t.x,t.y,t.z).multiplyScalar(999999999),c.setXYZ(1,e.x+Bt.x,e.y+Bt.y,e.z+Bt.z),c.needsUpdate=!0,l.material.color.set(s),l.material.depthTest=r,l.material.depthWrite=!1}static DrawDirection(e,t,s=Cs,o=0,r=!0,l=1){if(!Bs.enabled)return;const c=Ee.getLine(o),h=c.geometry.getAttribute("position");h.setXYZ(0,e.x,e.y,e.z),t.w!==void 0?(Bt.set(0,0,-l),M_.set(t.x,t.y,t.z,t.w),Bt.applyQuaternion(M_)):(Bt.set(t.x,t.y,t.z),Bt.multiplyScalar(l)),h.setXYZ(1,e.x+Bt.x,e.y+Bt.y,e.z+Bt.z),h.needsUpdate=!0,c.material.color.set(s),c.material.depthTest=r,c.material.depthWrite=!1}static DrawLine(e,t,s=Cs,o=0,r=!0){if(!Bs.enabled)return;const l=Ee.getLine(o),c=l.geometry.getAttribute("position");c.setXYZ(0,e.x,e.y,e.z),c.setXYZ(1,t.x,t.y,t.z),c.needsUpdate=!0,l.material.color.set(s),l.material.depthTest=r,l.material.depthWrite=!1,l.material.fog=!1}static DrawCircle(e,t,s,o=Cs,r=0,l=!0){if(!Bs.enabled)return;const c=Ee.getCircle(r);c.position.set(e.x,e.y,e.z),c.scale.set(s,s,s),c.quaternion.setFromUnitVectors(this._up,Bt.set(t.x,t.y,t.z).normalize()),c.material.color.set(o),c.material.depthTest=l,c.material.depthWrite=!1,c.material.fog=!1}static DrawWireSphere(e,t,s=Cs,o=0,r=!0){if(!Bs.enabled)return;const l=Ee.getSphere(t,o,!0);br(l,e.x,e.y,e.z),l.material.color.set(s),l.material.depthTest=r,l.material.depthWrite=!1,l.material.fog=!1}static DrawSphere(e,t,s=Cs,o=0,r=!0){if(!Bs.enabled)return;const l=Ee.getSphere(t,o,!1);br(l,e.x,e.y,e.z),l.material.color.set(s),l.material.depthTest=r,l.material.depthWrite=!1}static DrawWireBox(e,t,s=Cs,o=0,r=!0){if(!Bs.enabled)return;const l=Ee.getBox(o);l.position.set(e.x,e.y,e.z),l.scale.set(t.x,t.y,t.z),l.material.color.set(s),l.material.depthTest=r,l.material.wireframe=!0,l.material.depthWrite=!1,l.material.fog=!1}static DrawWireBox3(e,t=Cs,s=0,o=!0){if(!Bs.enabled)return;const r=Ee.getBox(s);r.position.copy(e.getCenter(Bt)),r.scale.copy(e.getSize(Bt)),r.material.color.set(t),r.material.depthTest=o,r.material.wireframe=!0,r.material.depthWrite=!1,r.material.fog=!1}static DrawArrow(e,t,s=Cs,o=0,r=!0,l=!1){if(!Bs.enabled)return;const c=Ee.getArrowHead(o);c.position.set(t.x,t.y,t.z),c.quaternion.setFromUnitVectors(this._up.set(0,1,0),Bt.set(t.x,t.y,t.z).sub(k_.set(e.x,e.y,e.z)).normalize());const h=Bt.set(t.x,t.y,t.z).sub(k_.set(e.x,e.y,e.z)).length()*.1;c.scale.set(h,h,h),c.material.color.set(s),c.material.depthTest=r,c.material.wireframe=l,this.DrawLine(e,t,s,o,r)}static DrawWireMesh(e){const t=Ee.getMesh(e.duration??0);"mesh"in e?(t.geometry=e.mesh.geometry,t.matrix.copy(e.mesh.matrixWorld)):(t.geometry=e.geometry,t.matrix.copy(e.matrix)),t.matrixAutoUpdate=!1,t.matrixWorldAutoUpdate=!1,t.material.color.set(e.color??Cs),t.material.depthTest=e.depthTest??!0,t.material.wireframe=!0}};a(Wg,"enabled",!0),a(Wg,"_up",new S(0,1,0));let $=Wg;const _M=new xa(1,1,1);function Vg(n=null){const e=new oe(n??14540253),t=new DC(_M);return new Ev(t,new Av({color:e}))}const $g=Symbol("GizmoCache");class Ee{static ensureFont(){let e=Re.FontLibrary.getFontFamily(this.familyName);if(!e){e=Re.FontLibrary.addFontFamily(this.familyName);const t=e.addVariant("normal","normal","https://uploads.needle.tools/include/font-msdf.json","https://uploads.needle.tools/include/font.png");t?.addEventListener("ready",()=>{Re.update()})}}static getTextLabel(e,t,s,o,r){this.ensureFont();let l=this.textLabelCache.pop(),c=1;r&&typeof r=="string"&&r?.length>=8&&r.startsWith("#")?(c=parseInt(r.substring(7),16)/255,r=r.substring(0,7),bM&&console.log(r,c)):typeof r=="object"&&r.a!==void 0&&(c=r.a);const h={boxSizing:"border-box",fontFamily:this.familyName,width:"auto",fontSize:s,color:o,lineHeight:1,backgroundColor:r??void 0,backgroundOpacity:c,textContent:t,borderRadius:.5*s,padding:.8*s,whiteSpace:"pre",offset:.05*s};if(l)l.set(h);else{l=new Jv(h);const d=this,u=l;u.setText=function(p){this.set({textContent:p}),d.tmuiNeedsUpdate=!0}}return this.tmuiNeedsUpdate=!0,this.registerTimedObject(J.Current,l,e,this.textLabelCache),l}static getBox(e){let t=this.boxesCache.pop();if(!t){const s=new xa(1,1,1);t=new G(s)}return this.registerTimedObject(J.Current,t,e,this.boxesCache),t}static getLine(e){let t=this.linesCache.pop();if(!t){t=new Vl;let s=t.geometry.getAttribute("position");s||(s=new _t(new Float32Array(2*3),3),t.geometry.setAttribute("position",s))}return t.frustumCulled=!1,this.registerTimedObject(J.Current,t,e,this.linesCache),t}static getCircle(e){let t=this.circlesCache.pop();if(!t){t=new Vl;let s=t.geometry.getAttribute("position");if(!s){s=new _t(new Float32Array(Ng*3),3),t.geometry.setAttribute("position",s);const o=q(0,1,0),r=q(0,0,1),l=q(r);l.cross(o).normalize();const c=q(l),h=Math.PI*2/(Ng-1);for(let d=0;d<Ng+1;d++){const u=h*d;o.copy(c).multiplyScalar(Math.cos(u)*1),l.copy(r).multiplyScalar(Math.sin(u)*1);const p=o.add(l);s.setXYZ(d,p.x,p.y,p.z)}}}return t.frustumCulled=!1,this.registerTimedObject(J.Current,t,e,this.circlesCache),t}static getSphere(e,t,s){let o=this.spheresCache.pop();return o||(o=new G(new pd(1,8,8))),o.scale.set(e,e,e),o.material.wireframe=s,this.registerTimedObject(J.Current,o,t,this.spheresCache),o}static getArrowHead(e){let t=this.arrowHeadsCache.pop();return t||(t=new G(new Rv(0,.5,1,8))),this.registerTimedObject(J.Current,t,e,this.arrowHeadsCache),t}static getMesh(e){let t=this.mesh.pop();return t||(t=new G,t.material=new Me),this.registerTimedObject(J.Current,t,e,this.mesh),t}static registerTimedObject(e,t,s,o){if(!e){console.error("No Needle Engine context available. Did you call a Gizmos function in global scope?");return}const r=this.contextBeforeRenderCallbacks.get(e),l=this.contextPostRenderCallbacks.get(e);if(r){if(e.pre_render_callbacks[e.pre_render_callbacks.length-1]!==r){const c=e.pre_render_callbacks.indexOf(r);c>=0&&e.pre_render_callbacks.splice(c,1),e.pre_render_callbacks.push(r)}}else{const c=()=>{this.onBeforeRender(e,this.timedObjectsBuffer)};this.contextBeforeRenderCallbacks.set(e,c),e.pre_render_callbacks.push(c)}if(l){if(e.post_render_callbacks[e.post_render_callbacks.length-1]!==l){const c=e.post_render_callbacks.indexOf(l);c>=0&&e.post_render_callbacks.splice(c,1),e.post_render_callbacks.push(l)}}else{const c=()=>{this.onPostRender(e,this.timedObjectsBuffer,this.timesBuffer)};this.contextPostRenderCallbacks.set(e,c),e.post_render_callbacks.push(c)}t.traverse(c=>{c.layers.disableAll(),c.layers.enable(2)}),t.renderOrder=999999,t[$g]=o,t.castShadow=!1,t.receiveShadow=!1,t.isGizmo=!0,this.timedObjectsBuffer.push(t),this.timesBuffer.push(J.Current.time.realtimeSinceStartup+s),e.scene.add(t)}static onBeforeRender(e,t){this.tmuiNeedsUpdate&&(this.tmuiNeedsUpdate=!1,Re.update());for(let s=0;s<t.length;s++){const o=t[s];if(e.mainCamera&&o instanceof Re.MeshUIBaseElement){if(Er(o))continue;const r=e.isInVR,l=!1,c=!r;Yl(o,e.mainCamera,l,c)}}}static onPostRender(e,t,s){const o=e.time.realtimeSinceStartup;for(let r=t.length-1;r>=0;r--){const l=t[r];o>=s[r]-1e-6&&(t.splice(r,1),s.splice(r,1),l.removeFromParent(),Er(l)!=!0&&l[$g].push(l))}}}a(Ee,"familyName","needle-gizmos"),a(Ee,"linesCache",[]),a(Ee,"circlesCache",[]),a(Ee,"spheresCache",[]),a(Ee,"boxesCache",[]),a(Ee,"arrowHeadsCache",[]),a(Ee,"mesh",[]),a(Ee,"textLabelCache",[]),a(Ee,"timedObjectsBuffer",new Array),a(Ee,"timesBuffer",new Array),a(Ee,"contextPostRenderCallbacks",new Map),a(Ee,"contextBeforeRenderCallbacks",new Map),a(Ee,"tmuiNeedsUpdate",!1);const Ti=C("debugphysics"),R_=new uo;class Qs{constructor(){a(this,"ray"),a(this,"cam"),a(this,"screenPoint"),a(this,"raycaster"),a(this,"results"),a(this,"targets"),a(this,"recursive",!0),a(this,"minDistance"),a(this,"maxDistance"),a(this,"lineThreshold"),a(this,"layerMask"),a(this,"ignore"),a(this,"testObject"),a(this,"useAcceleratedRaycast")}screenPointFromOffset(e,t){this.screenPoint===void 0&&(this.screenPoint=new re),this.screenPoint.x=e/window.innerWidth*2-1,this.screenPoint.y=-(t/window.innerHeight)*2+1}setLayer(e){R_.set(e),this.layerMask=R_}setMask(e){this.layerMask||(this.layerMask=new uo);const t=this.layerMask;t?t.mask=e:this.layerMask=e}}a(Qs,"AllLayers",4294967295);class Hg{constructor(e,t,s){a(this,"distance"),a(this,"point"),a(this,"object"),this.object=e,this.distance=t,this.point=s}}const T_=class yv{constructor(e){a(this,"context"),a(this,"engine"),a(this,"raycaster",new md),a(this,"defaultRaycastOptions",new Qs),a(this,"targetBuffer",new Array(1)),a(this,"defaultThresholds",{Mesh:{},Line:{threshold:-1},LOD:{},Points:{threshold:0},Sprite:{}}),a(this,"sphereResults",new Array),a(this,"sphereMask",new uo),a(this,"sphere",new gd),a(this,"tempBoundingBox",new Si),this.context=e}static get raycasting(){return this._raycasting>0}raycastPhysicsFast(e,t=void 0,s=1/0,o=!0){var r;return((r=this.context.physics.engine)==null?void 0:r.raycast(e,t,{maxDistance:s,solid:o}))??null}raycastPhysicsFastAndGetNormal(e,t=void 0,s=1/0,o=!0){var r;return((r=this.context.physics.engine)==null?void 0:r.raycastAndGetNormal(e,t,{maxDistance:s,solid:o}))??null}sphereOverlapPhysics(e,t){var s;return((s=this.context.physics.engine)==null?void 0:s.sphereOverlap(e,t))??null}sphereOverlap(e,t,s=!0,o=!1,r=null){if(this.sphereResults.length=0,!this.context.scene)return this.sphereResults;const l=this.sphereMask;l.enableAll(),l.disable(2);for(const c of this.context.scene.children)this.intersectSphere(c,e,t,l,this.sphereResults,s,o,r);return this.sphereResults.sort((c,h)=>c.distance-h.distance)}raycastFromRay(e,t=null){const s=t??this.defaultRaycastOptions;s.ray=e;const o=this.raycast(s);return s===this.defaultRaycastOptions&&(s.ray=void 0),o}raycast(e=null){Ti&&performance.mark("raycast.start"),e||(e=this.defaultRaycastOptions);const t=e.screenPoint??this.context.input.mousePositionRC,s=e.raycaster??this.raycaster;if(s.near=e.minDistance??0,s.far=e.maxDistance??1/0,s.params=this.defaultThresholds,e.lineThreshold===void 0&&(e.lineThreshold=-1),s.params.Line={threshold:e.lineThreshold},e.ray)s.ray.copy(e.ray);else{const c=e.cam??this.context.mainCamera;if(!c)return Ti&&console.error("Can not perform raycast - no main camera found"),this.defaultRaycastOptions.results&&(this.defaultRaycastOptions.results.length=0),this.defaultRaycastOptions.results??[];const h=this.context.xrCamera;this.context.isInXR&&h instanceof BC&&h.cameras.length>0?s.setFromCamera(t,h.cameras[0]):s.setFromCamera(t,c)}let o=e.targets;o||(o=this.targetBuffer,o.length=1,o[0]=this.context.scene);let r=e.results;this.defaultRaycastOptions.results&&(this.defaultRaycastOptions.results.length=0),r||(this.defaultRaycastOptions.results||(this.defaultRaycastOptions.results=new Array),r=this.defaultRaycastOptions.results),e.layerMask!==void 0?e.layerMask instanceof uo?s.layers.mask=e.layerMask.mask:s.layers.mask=e.layerMask:(s.layers.enableAll(),s.layers.disable(2)),Ti&&console.time("raycast"),r.length=0,yv._raycasting++,this.intersect(this.raycaster,o,r,e),r.sort((c,h)=>c.distance-h.distance);const l=e.ignore;return l!==void 0&&l.length>0&&(r=r.filter(c=>!l.includes(c.object))),yv._raycasting--,Ti&&(console.timeEnd("raycast"),console.warn("#"+this.context.time.frame+", hits:",r!=null&&r.length?[...r]:"nothing"),performance.mark("raycast.end"),performance.measure("raycast","raycast.start","raycast.end")),r}intersect(e,t,s,o){var r,l,c;for(const h of t){if(!h||h.visible===!1||$.isGizmo(h)||o.lineThreshold!==void 0&&o.lineThreshold<0&&h instanceof Vl)continue;let d=!0;const u=h,p=u.geometry;if(o.testObject){const g=(r=o.testObject)==null?void 0:r.call(o,h);if(g===!1)continue;g==="continue in children"&&(d=!1)}if(d&&(p&&E_(p)||(d=!1)),d){const g=Wv(h);g&&(u.geometry=g);const f=s.length;let y=!0;if(o.precise===!1&&(y=!1),y||(y=((c=(l=p.getAttribute("position"))==null?void 0:l.array)==null?void 0:c.length)<64),u instanceof ka&&(y=!1),!y&&xM(u,e,s)||(o.useAcceleratedRaycast!==!1?Xd.runMeshBVHRaycast(e,u,s,this.context):e.intersectObject(u,!1,s)),Ti&&s.length!=f){const v=s[s.length-1],b=g?8969557:7798784;$.DrawWireSphere(v.point,.1,b,1,!1),$.DrawWireMesh({mesh:h,depthTest:!1,duration:.2,color:b})}u.geometry=p}o.recursive!==!1&&this.intersect(e,h.children,s,o)}return s}intersectSphere(e,t,s,o,r,l,c,h){let d=e&&e.isMesh&&e.layers.test(o)&&!$.isGizmo(e);d&&(d=e.visible),d&&(d=!(e instanceof Vl)),d&&(d=!(e instanceof ka));const u=e,p=u.geometry;if(d&&h){const g=h(e);if(g===!1)return;g==="continue in children"&&(d=!1)}if(p&&E_(p)||(d=!1),d){if(c){const g=this.sphere;g.center.copy(t),g.radius=s;const f=r.length;if(Xd.runMeshBVHRaycast(this.sphere,u,r,this.context),f!=r.length&&!l)return}else if(p.boundingBox||p.computeBoundingBox(),p.boundingBox){u.matrixWorldNeedsUpdate&&u.updateWorldMatrix(!1,!1);const g=this.tempBoundingBox.copy(p.boundingBox).applyMatrix4(u.matrixWorld),f=this.sphere;if(f.center.copy(t),f.radius=s,f.intersectsBox(g)){const y=ee(e),v=y.distanceTo(f.center),b=new Hg(e,v,y);if(r.push(b),!l)return}}}if(e.children)for(const g of e.children){const f=r.length;if(this.intersectSphere(g,t,s,o,r,l,c,h),f!=r.length&&!l)return}}};a(T_,"_raycasting",0);let Gg=T_;function E_(n){return!(n.index&&n.index.array.length<3)}const Pr=new gd,qd=new yr,wM=new Mv;function xM(n,e,t){const s=n._computeIntersections;if(!s)return!1;let o=n["_computeIntersections:Needle"];return o||(o=n["_computeIntersections:Needle"]=function(r,l,c){const h=this,d=h.geometry.boundingSphere;if(d){if(h instanceof ka){qd.setFromNormalAndCoplanarPoint(q(0,1,0),q(0,-h.position.y,0)),qd.applyMatrix4(h.matrixWorld,wM);const p=r.ray.intersectPlane(qd,q());if(p){Pr.copy(d),Pr.applyMatrix4(h.matrixWorld);const g=q(p).sub(r.ray.origin).length(),f=Pr.radius*.5;g<f&&l.push({distance:g,point:p,object:h,normal:qd.normal.clone()})}return}Pr.copy(d),Pr.applyMatrix4(h.matrixWorld);const u=r.ray.intersectSphere(Pr,q());if(u){const p=q(u).sub(r.ray.origin),g=p.length();if(g>Pr.radius){const f=p.clone().normalize();l.push({distance:g,point:u,object:h,normal:f})}}}}),n._computeIntersections=o,e.intersectObject(n,!1,t),n._computeIntersections=s,!0}var Xd;(n=>{function e(_,w,x,k){var M,T,L;if(!w.geometry||!w.geometry.hasAttribute("position"))return!1;const D=w.geometry;if(w!=null&&w.isSkinnedMesh){const z=w,j=z.bvhNeedsUpdate;if(!z.staticGenerator)c(),r&&(z.staticGenerator=new r(w),z.staticGenerator.applyWorldTransforms=!1,z.staticGeometry=z.staticGenerator.generate(),D.boundsTree=l?.call(z.staticGeometry),z.staticGeometryLastUpdate=performance.now()+Math.random()*200,z.autoUpdateMeshBVH===void 0&&(z.autoUpdateMeshBVH=!1));else if(D.boundsTree&&(z.autoUpdateMeshBVH===!0||j===!0)){const H=performance.now(),K=H-z.staticGeometryLastUpdate;(j||K>100)&&(z.bvhNeedsUpdate=!1,z.staticGeometryLastUpdate=H,(M=z.staticGenerator)==null||M.generate(z.staticGeometry),D.boundsTree.refit())}}else if(!D.boundsTree){d||b();let z=!0;if((k.xr||D[f]===!1||(T=D.getAttribute("position"))!=null&&T.isInterleavedBufferAttribute||D.index&&(L=D.index)!=null&&L.isInterleavedBufferAttribute)&&(z=!1),z&&p){if(D[g]===void 0){let j=null;if(v.length>0){const H=v.shift();H&&!H.running&&(j=H)}if(!j&&y.length<3&&(j=new p,y.push(j)),j!=null&&!j.running){const H=w.name;Ti&&console.log("<<<< worker start",H,j),D[g]="queued",performance.mark("bvh.create.start");const K=D.clone();try{j.generate(K).then(U=>{D[g]="done",D.boundsTree=U}).catch(U=>{D[g]="failed - "+U?.message,D[f]=!1,Ti&&console.error("Failed to generate mesh bvh on worker",U)}).finally(()=>{Ti&&console.log(">>>>> worker done",H,{hasBoundsTre:D.boundsTree!=null}),v.push(j),K.dispose(),performance.mark("bvh.create.end"),performance.measure("bvh.create (worker)","bvh.create.start","bvh.create.end")})}catch(U){console.error("Failed to generate mesh bvh on worker",U)}}else Ti&&console.warn("No worker available")}}else(!u||!z)&&(c(),o&&(performance.mark("bvh.create.start"),D.boundsTree=new o(D),performance.mark("bvh.create.end"),performance.measure("bvh.create","bvh.create.start","bvh.create.end")))}if(_ instanceof md){const z=_,j=w.raycast;D.boundsTree?(c(),s&&(w.acceleratedRaycast||(w.acceleratedRaycast=s.bind(w),Ti&&console.debug(`Physics: bind acceleratedRaycast fn to "${w.name}"`)),w.raycast=w.acceleratedRaycast)):Ti&&console.warn("No bounds tree found for mesh",w.name,{workerTask:D[g],hasAcceleratedRaycast:s!=null});const H=z.firstHitOnly;return z.firstHitOnly=!1,z.intersectObject(w,!1,x),z.firstHitOnly=H,w.raycast=j,!0}else if(_ instanceof gd){const z=D.boundsTree;if(z){const j=_;if(h.copy(w.matrixWorld).invert(),j.applyMatrix4(h),z.intersectsSphere(j)){const H=ee(w),K=H.distanceTo(j.center),U=new Hg(w,K,H);x.push(U)}}return!0}return!1}n.runMeshBVHRaycast=e;let t=!1,s=null,o=null,r=null,l=null;function c(){t||(t=!0,import("./vendor-zxXa3Dmr.min.js").then(_=>_.index$1).then(_=>{s=_.acceleratedRaycast,o=_.MeshBVH,r=_.StaticGeometryGenerator,l=_.computeBoundsTree}).catch(_=>{(Ti||F())&&console.error("Failed to load BVH library...",_.message)}))}const h=new se;let d=!1,u=!1,p=null;const g=Symbol("Needle:MeshBVH-Worker"),f=Symbol("Needle:MeshBVH-CanUseWorker"),y=[],v=[];function b(){d=!0,u=!0,Promise.resolve().then(()=>XL).then(_=>{p=_.GenerateMeshBVHWorker}).catch(_=>{(Ti||F())&&console.warn("Failed to setup mesh bvh worker")}).finally(()=>{u=!1})}})(Xd||(Xd={}));const A_=Symbol("gltf-loader-internal-usage-tracker"),SM=C("debugusers"),I_=class fm{constructor(e){a(this,"parser"),a(this,"_getDependency"),a(this,"_loadingId"),a(this,"_loadedObjects",new Set),this.parser=e,this._getDependency=this.parser.getDependency,this._loadingId=Date.now().toString()}get name(){return"NEEDLE_internal_usage_tracker"}static isLoading(e){return fm._loadingProcesses>0}beforeRoot(){fm._loadingProcesses++;const e=this,t=this._getDependency;return this.parser.getDependency=function(s,o){const r=t.call(this,s,o);return r.then(l=>(l&&(e._loadedObjects.add(l),l[A_]=e._loadingId),l)),r},null}afterRoot(e){fm._loadingProcesses--,this.parser.getDependency=this._getDependency;for(const t of this._loadedObjects)delete t[A_],t instanceof E&&(t.parent||t instanceof G&&setTimeout(()=>{SM&&console.warn("> GLTF LOADER: Mesh not used in scene!",t),t.material=null,t.geometry=null},1e3));return null}};a(I_,"_loadingProcesses",0);let L_=I_;class j_{constructor(){window.addEventListener("unhandledrejection",e=>{var t;if(e.defaultPrevented)return;const s=(t=e?.reason)==null?void 0:t.path;if(s){const o=s[0];o&&o.tagName==="IMG"&&(console.warn(`Could not load image:
|
|
167
|
+
`+o.src),e.preventDefault())}})}}const Qd=C("trackresources");function D_(){return Qd==="dispose"}let Or=!0;Qd===0&&(Or=!1);function CM(n){Or=n}function B_(){return Or}const F_=Symbol("disposable");function qg(n,e){n&&(n[F_]=e,kr&&console.warn("Set disposable",e,n))}const U_=Symbol("disposed");function PM(n){return n[U_]===!0}function Te(n){var e;if(n){if(n[F_]===!1){kr&&console.warn("Object is marked as not disposable",n);return}if(typeof n=="object"&&(n[U_]=!0),n instanceof xi)Te(n.environment),Te(n.background),Te(n.customDepthMaterial),Te(n.customDistanceMaterial);else if(n instanceof Pn)Te(n.geometry),Te(n.material),Te(n.skeleton),Te(n.bindMatrix),Te(n.bindMatrixInverse),Te(n.customDepthMaterial),Te(n.customDistanceMaterial),n.geometry=null,n.material=null,n.visible=!1;else if(n instanceof G)Te(n.geometry),Te(n.material),Te(n.customDepthMaterial),Te(n.customDistanceMaterial),n.geometry=null,n.material=null,n.visible=!1;else if(n instanceof Vs){Ba(n);for(const t of Object.keys(n.attributes)){const s=n.attributes[t];Te(s)}}else if(n instanceof _t||n instanceof Iv)kr&&console.warn("BufferAttribute dispose not supported",n.count);else if(n instanceof Array)for(const t of n)t instanceof Pe&&Te(t);else if(n instanceof Pe){Ba(n);for(const s of Object.keys(n)){const o=n[s];o instanceof je&&(Te(o),n[s]=null)}const t=n.uniforms;if(t)for(const s of Object.keys(t)){const o=t[s];o instanceof je?(Te(o),t[s]=null):o instanceof Qi&&(Te(o.value),o.value=null)}}else n instanceof je?(Ba(n),Ba(n.source),((e=n.source)==null?void 0:e.data)instanceof ImageBitmap&&Ba(n.source.data)):n instanceof FC?(Ba(n.boneTexture),n.boneTexture=null):n instanceof UC||!(n instanceof E)&&kr&&console.warn("Unknown object type",n)}}function Ba(n){n&&((kr||D_()||Qd)&&console.warn("\u{1F9E8} FREE",n),n instanceof ImageBitmap?n.close():n instanceof zC?n.data=null:n.dispose())}function z_(n){(n instanceof G||n instanceof Pn)&&(n.material=null,n.geometry=null)}const OM=new Set;function Xg(n,e,t=null,s){if(s||(s=OM,s.clear()),!n)return s;const o=n[hc];if(o)for(const r of o)s.has(r)||t?.call(null,r)!==!1&&(s.add(r),e&&Xg(r,!0,t,s));return s}function kM(n){return n[dc]}const kr=C("debugresourceusers")||C("debugmemory"),hc=Symbol("needle-resource-users"),dc=Symbol("needle-resource-users-count");function Qt(n,e){Dd(n,e,function(t,s){Or&&!Gg.raycasting&&(Yd(hc,this,t,!1),Yd(hc,this,s,!0))})}Or&&(Qt(G.prototype,"material"),Qt(G.prototype,"geometry"),Qt(Pe.prototype,"map"),Qt(Pe.prototype,"bumpMap"),Qt(Pe.prototype,"alphaMap"),Qt(Pe.prototype,"normalMap"),Qt(Pe.prototype,"displacementMap"),Qt(Pe.prototype,"roughnessMap"),Qt(Pe.prototype,"metalnessMap"),Qt(Pe.prototype,"emissiveMap"),Qt(Pe.prototype,"specularMap"),Qt(Pe.prototype,"envMap"),Qt(Pe.prototype,"lightMap"),Qt(Pe.prototype,"aoMap"),Qt(Pe.prototype,"gradientMap"));function MM(n){if(Or===!1)return;const e=n[hc];if(e)for(const t of e)Yd(hc,t,n,!1)}Or&&Dd(Pe.prototype,"dispose",function(){MM(this)});let Qg=0;function Yd(n,e,t,s){if(Qg>0)return;if(Array.isArray(t)){for(const r of t)Yd(n,e,r,s);return}if(!t)return;let o=t[n];if(o||(o=new Set),s){if(e&&!o.has(e)){o.add(e);let r=t[dc]||0;r+=1,t[dc]=r,kr&&console.warn(`\u{1F7E2} Added user of "${t.type}"`,e,t,r,"users:",o)}}else if(e&&o.has(e)){o.delete(e);let r=t[dc]||0;r>0&&(r-=1,t[dc]=r),kr&&console.warn(`\u{1F534} Removed user of "${t.type}"`,e,t,r,"users:",o),r<=0&&(L_.isLoading(t)||(Qd&&console.warn(`\u{1F534} Removed all user of "${t.type}"`,t),D_()&&Te(t)))}t[n]=o}try{Dd(fr.prototype,"render",function(){Qg++},function(){Qg--})}catch(n){console.warn("Could not wrap WebGLRenderer.render",n)}const N_=C("debugcomponentevents");class uc{static addComponentLifecylceEventListener(e,t){this.eventListeners.has(e)&&this.eventListeners.set(e,[]);let s=this.eventListeners.get(e);s||(s=[]),s.push(t),this.eventListeners.set(e,s),N_&&console.log("Added event listener for "+e,this.eventListeners)}static removeComponentLifecylceEventListener(e,t){const s=this.eventListeners.get(e);if(!s)return;const o=s.indexOf(t);o<0||s.splice(o,1)}static dispatchComponentLifecycleEvent(e,t){const s=this.eventListeners.get(e);if(N_&&console.log("Dispatching event "+e,s),!!s)for(const o of s)o(t)}}a(uc,"eventListeners",new Map);const pc=Symbol("NEEDLE_NEED_UPDATE_INSTANCE"),W_=Symbol("isUsingInstancing"),V_=Symbol("instancingRenderer"),mc=Symbol("instancingAutoUpdateBounds");class ms{static isUsingInstancing(e){return e[W_]===!0}static getRenderer(e){return e[V_]||null}setAutoUpdateBounds(e,t){const s=ms.getRenderer(e);s&&(s[mc]=t)}static markDirty(e,t=!0){if(e&&(this.isUsingInstancing(e)&&(e[pc]=!0,e.matrixWorldNeedsUpdate=!0),t))for(const s of e.children)ms.markDirty(s,!0)}}function Fa(n,e){try{e||n()}catch(t){return console.error(t),!1}return!0}const Yg=C("debugnewscripts"),RM=C("debughierarchy"),Fe=[];function TM(){return Fe.length>0}function Kd(n){if(Yg&&console.log("Register new components",n.new_scripts.length,[...n.new_scripts],n.alias?"element: "+n.alias:n.hash,n),n.new_scripts_pre_setup_callbacks.length>0){for(const e of n.new_scripts_pre_setup_callbacks)e&&e();n.new_scripts_pre_setup_callbacks.length=0}if(!(n.new_scripts.length<=0)){Fe.length=0,n.new_scripts.length>0&&Fe.push(...n.new_scripts),n.new_scripts.length=0;for(let e=0;e<Fe.length;e++)try{const t=Fe[e];if(t.isComponent!==!0){(F()||Yg)&&console.error(`Registered script is not a Needle Engine component.
|
|
168
|
+
The script will be ignored. Please make sure your component extends "Behaviour" imported from "@needle-tools/engine"
|
|
169
|
+
`,t),Fe.splice(e,1),e--;continue}if(t.destroyed)continue;if(!t.gameObject){console.warn(`Component can not be initialized: no GameObject assigned.
|
|
170
|
+
Did you add and remove a component in the same frame?`),Fe.splice(e,1),e--;continue}t.context=n,gc(t.gameObject),Kg(t,n)}catch(t){console.error(t),Dn(Fe[e],n),Fe.splice(e,1),e--}for(let e=0;e<Fe.length;e++)try{const t=Fe[e];if(t.destroyed){Dn(Fe[e],n),Fe.splice(e,1),e--;continue}if(t.registering)try{t.registering()}catch(s){console.error(s)}t.__internalAwake!==void 0&&(t.gameObject||console.error("Calling awake for a component without a GameObject",t,t.gameObject),gc(t.gameObject),t.activeAndEnabled&&Fa(t.__internalAwake.bind(t)))}catch(t){console.error(t),Dn(Fe[e],n),Fe.splice(e,1),e--}for(let e=0;e<Fe.length;e++)try{const t=Fe[e];if(t.destroyed||t.enabled===!1||(gc(t.gameObject),t.activeAndEnabled===!1))continue;t.__internalEnable!==void 0&&(t.enabled=!0,Fa(t.__internalEnable.bind(t)))}catch(t){console.error(t),Dn(Fe[e],n),Fe.splice(e,1),e--}for(let e=0;e<Fe.length;e++)try{const t=Fe[e];if(t.destroyed||!t.gameObject)continue;n.new_script_start.push(t)}catch(t){console.error(t),Dn(Fe[e],n),Fe.splice(e,1),e--}Fe.length=0;for(const e of n.new_scripts_post_setup_callbacks)e&&e();n.new_scripts_post_setup_callbacks.length=0}}function EM(n){n&&(n.__internalDisable(!0),Dn(n,n.context))}function $_(n,e){for(let t=0;t<n.new_script_start.length;t++)try{const s=n.new_script_start[t];if(e!==void 0&&s.gameObject!==e||s.destroyed||s.activeAndEnabled===!1)continue;Fa(s.__internalAwake.bind(s)),s.enabled&&(Fa(s.__internalEnable.bind(s)),Fa(s.__internalStart.bind(s)),n.new_script_start.splice(t,1),t--)}catch(s){console.error(s),Dn(n.new_script_start[t],n),n.new_script_start.splice(t,1),t--}}function Kg(n,e){e.scripts.indexOf(n)===-1&&(e.scripts.push(n),n.earlyUpdate&&e.scripts_earlyUpdate.push(n),n.update&&e.scripts_update.push(n),n.lateUpdate&&e.scripts_lateUpdate.push(n),n.onBeforeRender&&e.scripts_onBeforeRender.push(n),n.onAfterRender&&e.scripts_onAfterRender.push(n),n.onPausedChanged&&e.scripts_pausedChanged.push(n),Zg(n,null)&&e.new_scripts_xr.push(n),Zg(n,"immersive-vr")&&e.scripts_immersive_vr.push(n),Zg(n,"immersive-ar")&&e.scripts_immersive_ar.push(n))}function Dn(n,e){Ji(n,e.new_scripts),Ji(n,e.new_script_start),Ji(n,e.scripts),Ji(n,e.scripts_earlyUpdate),Ji(n,e.scripts_update),Ji(n,e.scripts_lateUpdate),Ji(n,e.scripts_onBeforeRender),Ji(n,e.scripts_onAfterRender),Ji(n,e.scripts_pausedChanged),Ji(n,e.new_scripts_xr),Ji(n,e.scripts_immersive_vr),Ji(n,e.scripts_immersive_ar),e.stopAllCoroutinesFrom(n)}function Ji(n,e){const t=e.indexOf(n);t>=0&&e.splice(t,1)}function Zg(n,e){var t;if(n){const s=n;if(s.onBeforeXR||s.onEnterXR||s.onUpdateXR||s.onLeaveXR||s.onXRControllerAdded||s.onXRControllerRemoved)return!(e!=null&&((t=s.supportsXR)==null?void 0:t.call(s,e))===!1)}return!1}function Zd(n){if(n||(n=pe.Current.scene),!n){console.trace("Invalid call - no current context.");return}const e=Wa(n);H_(n,e,!0)||(Yg||F()?console.error(`Error updating hierarchy
|
|
171
|
+
Do you have circular references in your project? <a target="_blank" href="https://docs.needle.tools/circular-reference"> Click here for more information.`,n):console.error('Failed to update active state in hierarchy of "'+n.name+'"',n),console.warn(" \u2191 this error might be caused by circular references. Please make sure you don't have files with circular references (e.g. one GLB 1 is loading GLB 2 which is then loading GLB 1 again)."))}function H_(n,e,t,s=0){if(s>1e3)return console.warn("Hierarchy is too deep (> 1000 level) - will abort updating active state"),!1;const o=Wa(n);if(e&&(e=o,e&&n.parent)){const c=n.parent;e=c[En],e===void 0&&(c instanceof xi||(e=!0))}const r=n[En]!==e;n[En]=e,r&&(RM&&console.warn("ACTIVE CHANGE",n.name,o,n.visible,e,"changed?"+r,n),AM(n,c=>{e?c.enabled&&(Fa(c.__internalAwake.bind(c)),c.enabled&&c.__internalEnable()):c.__didAwake&&c.enabled&&(c.__didEnable=!1,c.onDisable())}));let l=!0;if(n.children)for(const c of n.children)H_(c,e,t,s+1)===!1&&(l=!1);return l}function gc(n){let e=!0,t=n,s=!1;for(;t&&t;){if(t.type==="Scene"&&(s=!0),!Wa(t)){e=!1;break}t=t.parent}if(!n){console.error("GO is null");return}n[En]=e&&s}function AM(n,e){var t;if((t=n.userData)!=null&&t.components)for(const s of n.userData.components)e(s)}const Jd=new Map,G_=Symbol("prewarmFlag"),Jg=Symbol("waitingForPrewarm"),ef=C("debugprewarm");function IM(n,e){!n||n[G_]===!0||n[Jg]===!0||(Jd.has(e)||Jd.set(e,[]),n[Jg]=!0,Jd.get(e).push(n),ef&&console.debug("register prewarm",n.name))}let tf=null,sf=null;function LM(n){if(!n)return;const e=Jd.get(n);if(!(e!=null&&e.length))return;const t=n.mainCamera;if(t){ef&&console.log("prewarm",e.length,"objects",[...e]);const s=n.renderer;if(s.compile){const o=n.scene;s.compile(o,t),tf??(tf=new NC(64)),sf??(sf=new WC(.001,9999999,tf)),sf.update(s,o);for(const r of e)r[G_]=!0,r[Jg]=!1;e.length=0,ef&&console.log("prewarm done")}}}pe.registerCallback(me.ContextCreated,n=>{const e=n.context;Z_(e),Q_(e)});const eu=C("debugcomponents"),q_="eff8ba80-635d-11ec-90d6-0242ac120003";class jt{constructor(e){a(this,"_originalSeed"),a(this,"_seed"),typeof e=="string"&&(e=jt.hash(e)),this._originalSeed=e,this._seed=e}get seed(){return this._seed}set seed(e){this._seed=e}reset(){this._seed=this._originalSeed}generateUUID(e){if(typeof e=="string")return Qv(e,q_);const t=this._seed;return this._seed-=1,Qv(t.toString(),q_)}initialize(e){typeof e=="string"?this._seed=jt.hash(e):this._seed=e}static createFromString(e){return new jt(this.hash(e))}static hash(e){let t=0;for(let s=0;s<e.length;s++)t=e.charCodeAt(s)+((t<<5)-t);return t}}var X_=(n=>(n.NewInstanceCreated="new-instance-created",n.InstanceDestroyed="instance-destroyed",n))(X_||{});class jM{constructor(e){a(this,"guid"),a(this,"dontSave"),this.guid=e}}function fc(n,e,t=!0,s){if(!n)return;const o=n;if(Ai(n,t),!e){console.warn("Can not send destroy: No networking connection provided",n.guid);return}if(!e.isConnected){F()&&console.debug("Can not send destroy: not connected",n.guid);return}let r=n.guid;if(!r&&o.uuid&&(r=o.uuid),!r){console.warn("Can not send destroy: failed to find guid",n);return}nf(r,e,s)}function nf(n,e,t){const s=new jM(n);t?.saveInRoom===!1&&(s.dontSave=!0),e.send("instance-destroyed",s,Ss.Queued)}function Q_(n){n.connection.beginListen("instance-destroyed",e=>{eu&&console.log("[Remote] Destroyed",n.scene,e);const t=gf(e.guid,n.scene);t&&Ai(t)})}class DM{constructor(e,t,s){a(this,"filename"),a(this,"hash"),a(this,"size"),this.filename=e,this.hash=t,this.size=s}}class Y_{constructor(e,t){a(this,"guid"),a(this,"originalGuid"),a(this,"seed"),a(this,"visible"),a(this,"hostData"),a(this,"dontSave"),a(this,"parent"),a(this,"position"),a(this,"rotation"),a(this,"scale"),a(this,"preventCreation"),a(this,"deleteStateOnDisconnect"),this.originalGuid=e,this.guid=t}}function of(n,e,t,s){var o,r;const l=n;if(!l.guid)return console.warn("Can not instantiate: No guid",l),null;if(e.context||(e.context=J.Current),!e.context)return console.error("Missing network instantiate options / reference to network connection in sync instantiate"),null;const c=e?{...e}:null,{instance:h,seed:d}=BM(l,e);if(h){const u=h;if(u.guid){eu&&console.log("[Local] new instance","gameobject:",h?.guid);const p=new Y_(l.guid,u.guid);p.seed=d,e.deleteOnDisconnect===!0&&(p.deleteStateOnDisconnect=!0),c&&(c.position&&(p.position={x:c.position.x,y:c.position.y,z:c.position.z}),c.rotation&&(p.rotation={x:c.rotation.x,y:c.rotation.y,z:c.rotation.z,w:c.rotation.w}),c.scale&&(p.scale={x:c.scale.x,y:c.scale.y,z:c.scale.z})),p.position||(p.position={x:u.position.x,y:u.position.y,z:u.position.z}),p.rotation||(p.rotation={x:u.quaternion.x,y:u.quaternion.y,z:u.quaternion.z,w:u.quaternion.w}),p.scale||(p.scale={x:u.scale.x,y:u.scale.y,z:u.scale.z}),p.visible=l.visible,c!=null&&c.parent&&(typeof c.parent=="string"?p.parent=c.parent:p.parent=c.parent.guid),p.hostData=t,s===!1&&(p.dontSave=!0),!((o=e?.context)!=null&&o.connection)&&F()&&console.debug("Object will be instantiated but it will not be synced: not connected",l.guid),e.context.connection.isInRoom&&Ua.push(new WeakRef(u)),(r=e?.context)==null||r.connection.send("new-instance-created",p)}else console.warn("Missing guid, can not send new instance event",u)}return h}function K_(){return Math.random()*9999999}const Ua=new Array;function Z_(n){n.connection.beginListen("new-instance-created",async e=>{const t=await FM(e.originalGuid,n.scene);if(e.preventCreation===!0)return;if(!t){console.warn("could not find object that was instantiated: "+e.guid);return}const s=new Fs;e.position&&(s.position=new S(e.position.x,e.position.y,e.position.z)),e.rotation&&(s.rotation=new V(e.rotation.x,e.rotation.y,e.rotation.z,e.rotation.w)),e.scale&&(s.scale=new S(e.scale.x,e.scale.y,e.scale.z)),s.parent=e.parent,e.seed&&(s.idProvider=new jt(e.seed)),s.visible=e.visible,s.context=n,eu&&n.alias&&console.log("[Remote] instantiate in: "+n.alias);const o=$a(t,s);Ua.push(new WeakRef(o)),o&&(e.parent==="scene"&&n.scene.add(o),eu&&console.log("[Remote] new instance","gameobject:",o?.guid,t))}),n.connection.beginListen("left-room",()=>{Ua.length>0&&console.debug(`Left networking room, cleaning up ${Ua.length} instantiated objects`);for(const e of Ua){const t=e.deref();t&&t.destroy()}Ua.length=0})}function BM(n,e){const t=K_(),s=e??new Fs;s.idProvider=new jt(t);const o=$a(n,s);return{seed:t,instance:o}}const J_={};function ew(n,e){J_[n]=e}async function FM(n,e){const t=J_[n];if(t!=null){const s=await t(n);if(s)return s}return tw(n,e)}function tw(n,e){if(e===null||!n)return null;if(e.guid===n)return e;if(e.children)for(const t of e.children){const s=tw(n,t);if(s)return s}return null}const yc=C("gizmos"),wt=C("debugextension"),rf=C("debugtypes");class UM{constructor(){a(this,"_types",new Map),rf&&console.warn("TypeStore: Created",this)}add(e,t){rf&&console.warn("ADD TYPE",e);const s=this._types.get(e);s?rf&&s!==t&&console.warn("Type name exists multiple times in your project and may lead to runtime errors:",e):this._types.set(e,t)}get(e){return this._types.get(e)||null}getKey(e){for(const[t,s]of this._types)if(s===e)return t;return null}}const zM=Symbol("BuiltInType"),R=new UM,NM=function(n){R.get(n.name)||R.add(n.name,n)},af=C("debugresolvedependencies"),WM=["/extensions/","extensions/"],VM=[{prefix:"/nodes/",dependencyName:"node"},{prefix:"/meshes/",dependencyName:"mesh"},{prefix:"/materials/",dependencyName:"material"},{prefix:"/textures/",dependencyName:"texture"},{prefix:"/animations/",dependencyName:"animation"},{prefix:"nodes/",dependencyName:"node"},{prefix:"meshes/",dependencyName:"mesh"},{prefix:"materials/",dependencyName:"material"},{prefix:"textures/",dependencyName:"texture"},{prefix:"animations/",dependencyName:"animation"}];async function lf(n,e){af&&console.log(n,e);const t=[];cf(VM,n,e,t);const s=await Promise.all(t);return typeof e=="string"&&s.length===1?s[0]:s}function iw(n,e){return!n||!e?!1:n["needle:identifier"]!=null&&e["needle:identifier"]!=null?n["needle:identifier"]===e["needle:identifier"]:!1}function $M(n,e){n["needle:identifier"]=e}function cf(n,e,t,s){if(typeof t=="object"&&t!==void 0&&t!==null)for(const o of Object.keys(t)){const r=t[o];if(typeof r=="string"){const l=sw(e,r);if(l!=null)typeof l.then=="function"?s.push(l.then(c=>t[o]=c)):t[o]=l;else{const c=nw(n,e,r);if(c){s.push(c.then(h=>(t[o]=h,h)));continue}}}else if(Array.isArray(r))for(let l=0;l<r.length;l++){const c=r[l],h=sw(e,c);if(h!==null){typeof h.then=="function"?s.push(h.then(d=>r[l]=d)):r[l]=h;continue}for(const d of n){const u=ow(d.prefix,c);if(u>=0){af&&console.log(d,u,d.dependencyName),s.push(e.getDependency(d.dependencyName,u).then(p=>r[l]=p));break}}typeof c=="object"&&cf(n,e,c,s)}else typeof r=="object"&&cf(n,e,r,s)}else if(typeof t=="string"){const o=nw(n,e,t);o&&s.push(o)}}function sw(n,e){if(n&&n.plugins&&typeof e=="string"){for(const t of WM)if(e.startsWith(t)){let s=e.substring(t.length);const o=s.indexOf("/");o>=0&&(s=s.substring(0,o));const r=n.plugins[s];if(wt&&console.log(s,r),typeof r?.resolve=="function"){const l=e.substring(t.length+s.length+1);return r.resolve(n,l)}break}}return null}function nw(n,e,t){for(const s of n){const o=ow(s.prefix,t);if(o>=0)return af&&console.warn("GET DEPENDENCY",s,o,s.dependencyName),e.getDependency(s.dependencyName,o)}return null}function ow(n,e){if(typeof e=="string"&&e.startsWith(n)){const t=e.substring(n.length),s=Number.parseInt(t);if(s>=0)return s}return-1}const hf="NEEDLE_persistent_assets";function HM(n){return n?.___persistentAsset===!0}class GM{constructor(e){a(this,"parser"),this.parser=e}get name(){return hf}async afterRoot(e){var t,s;if(!((s=(t=this.parser)==null?void 0:t.json)!=null&&s.extensions))return;const o=this.parser.json.extensions[hf];if(!o)return;wt&&console.log(o);const r=new Array;for(const l of o?.assets){const c=lf(this.parser,l);c&&r.push(c)}await Promise.all(r)}resolve(e,t){const s=Number.parseInt(t);if(s>=0){wt&&console.log(t);const o=e.json.extensions[hf];if(o){const r=o?.assets[s];if(r&&typeof r=="object"){r.___persistentAsset=!0;const l=r.__type;l&&R.get(l)}return r}}return null}}const Ys=C("debugserializer");class qM{constructor(){a(this,"typeMap",new Map)}register(e,t){if(this.typeMap.has(e)){const s=this.typeMap.get(e);if(s===t)return;Ys&&console.warn("Type: "+e+" is already registered",t,s)}Ys&&console.log("Register type serializer",t.name,t,e),this.typeMap.set(e,t)}getSerializer(e){if(e)return this.typeMap.get(e)}getSerializerForConstructor(e,t=0){if(t>20)return;if(!e||!e.constructor){Ys&&console.log("invalid type");return}const s=e.name,o=this.getSerializer(e);if(o!==void 0)return Ys&&console.log("FOUND SERIALIZER",o?.name,e.name,e.constructor.name,"for type: "+s,o,e,this.typeMap),o;const r=Object.getPrototypeOf(e);if(r&&r!==e){const l=this.getSerializerForConstructor(r,++t);if(l){const c=r.constructor||r.prototype;Ys&&console.log("FOUND SERIALIZER(in constructor) "+c.constructor.name,c.name,c,l),this.register(c,l)}return l}Ys&&console.warn("No serializer found for "+s,e,e.name,e.constructor.name)}}const tu=new qM;class es{constructor(e,t){if(a(this,"name"),this.name=t,Array.isArray(e))for(const s of e)tu.register(s,this);else tu.register(e,this)}}class XM{constructor(){a(this,"isDevMode",Xt()),a(this,"cache",{})}registerDefinedKeys(e,t){if(this.isDevMode&&this.cache[e]===void 0){this.cache[e]=Object.keys(t);const s=t;s.$serializedTypes&&Object.keys(s.$serializedTypes)&&this.cache[e].push(...Object.keys(s.$serializedTypes)),Ys&&console.log("registerDefinedKeys for "+e,this.cache[e],t)}}getDefinedKey(e,t){return this.cache[e]===void 0?!1:this.cache[e].includes(t)}}class df{constructor(e){a(this,"root"),a(this,"gltf"),a(this,"gltfId"),a(this,"object"),a(this,"target"),a(this,"nodeId"),a(this,"nodeToObject"),a(this,"objectToNode"),a(this,"context"),a(this,"path"),a(this,"type"),a(this,"serializable"),a(this,"implementationInformation"),this.root=e}}function rw(n,e){const t=n.$serializedTypes;if(t===void 0)return null;const s={};for(const r in t){const l=n[r];if(l!=null&&typeof l=="object"){const c=tu.getSerializerForConstructor(l);if(c){s[r]=c.onSerialize(l,e);continue}}s[r]=l}function o(r){const l=R._types;for(const[c,h]of l)if(h===n.constructor)return c;return r.__name||r.constructor.name}return s.name=o(n),typeof n.guid=="string"&&(s.guid=n.guid),s}const iu=[];function aw(n,e){if(!n)return e;typeof n.$serializedTypes=="object"&&(e||(e={}),Object.assign(e,n.$serializedTypes));const t=Object.getPrototypeOf(n);return aw(t,e)}function su(n,e,t){if(!n)return!1;if(t.target=n,n.onBeforeDeserialize!==void 0){const o=n.onBeforeDeserialize(e,t);if(typeof o=="boolean")return o}const s=aw(n);if(e){if(typeof e.guid=="string"&&(n.guid=e.guid),s)for(const o in s){let r=function(h){const d=h.type;return d?uf(c,d,t,void 0,n[o]):uf(c,h,t,void 0,n[o])};const l=s[o],c=e[o];if(Ys&&console.log(o,c,n,l),!(n[o]!==void 0&&c===void 0)&&(t.type=void 0,t.path=o,t.serializable=l,!(n.onBeforeDeserializeMember!==void 0&&n.onBeforeDeserializeMember(o,c,t)===!0))){if(l===null)n[o]=c;else{if(Array.isArray(l))for(let h=0;h<l.length;h++){const d=l[h],u=r(d);if(u!==void 0||h===l.length-1){n[o]=u;break}}else n[o]=r(l);iu.length=0}n.onAfterDeserializeMember!==void 0&&n.onAfterDeserializeMember(o,c,t)}}KM(n,e)}return YM(n,e,t.implementationInformation),n.onAfterDeserialize!==void 0&&n.onAfterDeserialize(e,t),!0}const QM=C("noerrors");function YM(n,e,t){var s,o;if(QM||!e||!Xt()||!n||n.constructor&&n.constructor[zM]===!0)return;const r=(s=n.constructor)==null?void 0:s.name,l=Object.getOwnPropertyNames(e);for(const c of l){if(c==="sourceId")continue;const h=n[c];if(h==null)continue;const d=e[c];if(t?.getDefinedKey(r,c)===!1){const u=c.charAt(0).toUpperCase()+c.slice(1);t.getDefinedKey(r,u)&&(Hs(ki.Warn,'<strong>Please rename</strong> "'+u+'" to "'+c+'" in '+r),console.warn('Please use lowercase for field: "'+u+'" in '+r,d,n));continue}if(d!=null){if(typeof d=="object"&&(h===void 0||!h.isObject3D)){if(typeof d.node=="number"||typeof d.guid=="string"){if(d.could_not_resolve)continue;if(!(h!==void 0&&Object.keys(h).length>1)){Hs(ki.Warn,`<strong>Missing serialization for object reference!</strong>
|
|
172
|
+
|
|
173
|
+
Please change to:
|
|
174
|
+
@serializable(Object3D)
|
|
175
|
+
${c}? : Object3D;
|
|
176
|
+
|
|
177
|
+
in ${r}.ts
|
|
178
|
+
<a href="https://docs.needle.tools/serializable" target="_blank">See documentation</a>`),console.warn(r,c,n[c],n);continue}}else if(!Array.isArray(h)){const u=(o=h.constructor)==null?void 0:o.name;if(u==="Object"&&!h.constructor["did_warn:missing_serializable"]){h.constructor["did_warn:missing_serializable"]=!0;const p='You might be missing a @serializable(Type) decorator for field "'+c+'" in '+r+".ts";console.warn(p+`
|
|
179
|
+
${c}:`,d,u),Hs(ki.Warn,"Dev Warning: Are you missing a type in @serializable? Please check the browser console for details")}}}if(typeof h=="string"&&typeof d=="string"&&(d.endsWith(".gltf")||d.endsWith(".glb"))){Hs(ki.Warn,`<strong>Missing serialization for object reference!</strong>
|
|
180
|
+
|
|
181
|
+
Please change to:
|
|
182
|
+
@serializable(AssetReference)
|
|
183
|
+
${c}? : AssetReference;
|
|
184
|
+
|
|
185
|
+
in script ${r}.ts
|
|
186
|
+
<a href="https://docs.needle.tools/serializable" target="_blank">documentation</a>`),console.warn(r,c,n[c],n);continue}}}}function KM(n,e){for(const t of Object.keys(e)){const s=e[t];if(typeof s=="object"&&s!==null&&s!==void 0){const o=n[t];if(!o){Ys&&console.log(t,"is undefined on",n);continue}for(const r of Object.keys(s))if(o[r]===void 0&&lw(s[r])&&!lw(o)){const l=ZM(o,r);if(l&&(l?.writable===void 0||l?.writable===!1)&&l.set===void 0){Ys&&console.warn('Property is not writable "'+r+'"',o,l,s[r],o[r]);continue}o[r]=s[r]}}}}function ZM(n,e){for(;n;){const t=Object.getOwnPropertyDescriptor(n,e);if(t)return t;n=Object.getPrototypeOf(n)}}function lw(n){switch(typeof n){case"number":case"string":case"boolean":return!0}return!1}function uf(n,e,t,s,o){let r=typeof e=="function"&&e.prototype===void 0,l=e;if(r)try{if(l=e?.call(e,o),r=!1,l==null)return}catch(u){console.error("Error in callback",u,n)}if(t.type=l,!r&&o&&(o instanceof Pe||o instanceof G||o instanceof Vs||o instanceof go))return o;if(s||(s={serializer:tu.getSerializerForConstructor(l)}),o&&typeof o=="object"&&HM(o)){if(o.__concreteInstance)return o.__concreteInstance;const u=o;if(!u.$serializedTypes&&l.prototype.$serializedTypes&&(u.$serializedTypes=l.prototype.$serializedTypes),u.$serializedTypes&&su(u,n,t),o&&l!==void 0)try{let p=null;s.serializer&&(p=s.serializer.onDeserialize(n,t)),p||(p=new l,wt&&console.log("Create concrete instance for persistent asset",o,"instance:",p),za(p,o)),o.__concreteInstance=p,o=p}catch(p){console.error("Error creating instance or creating values on instance",p,o,l)}return o}if(Array.isArray(n)){const u=[];for(let p=0;p<n.length;p++){const g=n[p],f=uf(g,e,t,s,g);u.push(f)}return u}const c=s?.serializer;if(c)return c.onDeserialize(n,t);if(o instanceof je)return o;let h;if(n&&(n.isMaterial||n.isTexture||n.isObject3D||n instanceof go))h=n;else{if(n===void 0)return;if(n===null&&(l===Pe||l===je||l===G||l===go))return null;try{h=new l(...JM(n))}catch(u){console.error("Error creating "+t.path,t.target,u);return}}const d=h;return d.$serializedTypes&&su(d,n,t),h}function JM(n){if(iu.length=0,typeof n=="object"&&n!==null&&n!==void 0)for(const e of Object.keys(n))iu.push(n[e]);return iu}const pf=Symbol("assigned component properties");function za(n,e,t,s){var o;if(e==null||n==null)return;n[pf]=!0;const r=((o=n.constructor)==null?void 0:o.name)??"unknown";t?.registerDefinedKeys(r,n);for(const l of Object.keys(e)){const c=eR(n,l);if(typeof c?.value!="function"){if(!c||c.writable===!0){const h=s!=null&&s.onAssign?s.onAssign(e,l,e[l]):e[l];n[l]=h}else if(c?.set!==void 0){const h=s!=null&&s.onAssign?s.onAssign(e,l,e[l]):e[l];n[l]=h}}}delete n[pf]}function eR(n,e){let t;do t=Object.getOwnPropertyDescriptor(n,e);while(!t&&(n=Object.getPrototypeOf(n)));return t}const cw=Symbol("customVisibilityFlag");function Bn(n,e){n.layers[cw]=e}const hw=Symbol("DidPatchLayers");function tR(){const n=uo.prototype;if(n[hw])return;n[hw]=!0;const e=n.test;n.test=function(t){return this[cw]===!1?!1:e.call(this,t)}}tR(),Object.defineProperty(we.prototype,"fov",{get:function(){return this._fov},set:function(n){const e=n!==this._fov;this._fov=n,e&&this.view!==void 0&&this.updateProjectionMatrix()},configurable:!0}),Object.defineProperty(we.prototype,"near",{get:function(){return this._near},set:function(n){const e=n!==this._near;this._near=n,e&&this.view!==void 0&&this.updateProjectionMatrix()},configurable:!0}),Object.defineProperty(we.prototype,"far",{get:function(){return this._far},set:function(n){const e=n!==this._far;this._far=n,e&&this.view!==void 0&&this.updateProjectionMatrix()},configurable:!0});const dw=new Map;function uw(n,e){if(!n)return;if(!e){console.warn("No prototype found",n,n.prototype,n.constructor);return}const t=dw.get(e);t&&t.apply(n)}function pw(n){const e=iR(n.prototype);dw.set(n,e)}function iR(n){return new sR(n)}class sR{constructor(e){a(this,"$symbol"),a(this,"extensions"),a(this,"descriptors"),this.$symbol=Symbol("prototype-extension"),this.extensions=Object.keys(e),this.descriptors=new Array;for(let t=0;t<this.extensions.length;t++){const s=this.extensions[t],o=Object.getOwnPropertyDescriptor(e,s);o&&this.descriptors.push(o)}}apply(e){if(!e[this.$symbol]){e[this.$symbol]=!0;for(let t=0;t<this.extensions.length;t++){const s=this.extensions[t],o=this.descriptors[t];o&&Object.defineProperty(e,s,o)}}}}const nR=C("debuggetcomponent"),mw=()=>nR||globalThis.NEEDLE_DEBUG_GETCOMPONENT===!0;function oR(n){return n==null||n.isObject3D?n:n.object&&n.object.isObject3D?n.object:n}function mf(n,e){if(!n||!n.userData.components)return e;const t=n.userData.components.indexOf(e);return t<0||(uc.dispatchComponentLifecycleEvent("removing-component",e),e.gameObject=null,n.userData.components.splice(t,1)),e}function vc(n,e,t){return Rr(n,e)||Ei(n,e,t)}const gw=new jt("addComponentIdProvider");function Mr(n,e,t=!0){n.userData||(n.userData={}),n.userData.components||(n.userData.components=[]),n.userData.components.push(e),e.gameObject=n,(e.guid===void 0||e.guid==="invalid")&&(e.guid=gw.generateUUID()),ou(n),bu(e,e.context);try{t&&e.__internalAwake&&(gc(n),e.activeAndEnabled&&e.__internalAwake()),uc.dispatchComponentLifecycleEvent("component-added",e)}catch(s){console.error(s)}return e}function Ei(n,e,t,s){var o;if(typeof e=="function"){const r=new e;t&&r.__internalNewInstanceCreated(t);let l=!0;return s?.callAwake!=null&&(l=s.callAwake),Mr(n,r,l)}if(e.destroyed)return console.warn("Can not move/add a destroyed component",e),e;if(e.gameObject===n)return e;if(e.gameObject&&(o=e.gameObject.userData)!=null&&o.components){const r=e.gameObject.userData.components.indexOf(e);e.gameObject.userData.components.splice(r,1)}if(n.userData||(n.userData={}),!n.userData.components)n.userData.components=[];else if(n.userData.components.includes(e))return e;return n.userData.components.push(e),e.gameObject=n,(e.guid===void 0||e.guid==="invalid")&&(e.guid=gw.generateUUID()),t&&e._internalInit(t),bu(e,e.context),e}function fw(n){if(n.gameObject&&n.gameObject.userData.components){const e=n.gameObject.userData.components.indexOf(n);n.gameObject.userData.components.splice(e,1)}n.__internalDisable&&n.__internalDisable(),Dn(n,n.context??J.Current),n.destroy(),n.gameObject=null}let yw=!1;function vw(n,e,t){var s;if(n==null)return null;if(!n.isObject3D)return console.error("Object is not object3D"),null;if(!((s=n?.userData)!=null&&s.components)||(typeof e=="string"&&(yw||(yw=!0,console.warn(`Accessing components by name is not supported.
|
|
187
|
+
Please use the component type instead. This may keep working in local development but it will fail when bundling your application.
|
|
188
|
+
|
|
189
|
+
You can import other modules your main module to get access to types
|
|
190
|
+
or if you use npmdefs you can make types available globally using globalThis:
|
|
191
|
+
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/globalThis`,e))),mw()&&console.log("[onGetComponent] FIND",e),e==null))return null;for(let o=0;o<n.userData.components.length;o++){const r=n.userData.components[o];let l=Object.getPrototypeOf(r);for(;l;){if(l===e.prototype)if(mw()&&console.log("[onGetComponent] MATCH BY PROTOYPE",l),t)t.push(r);else return r;l=Object.getPrototypeOf(l)}}return t||null}function Rr(n,e){const t=vw(n,e);return t?Array.isArray(t)?t[0]:t:null}function bc(n,e,t,s=!0){return t||(t=[]),s&&(t.length=0),vw(n,e,t),t}function _c(n,e,t){var s;if(t===!1&&n[En]===!1)return null;const o=Rr(n,e);if(t===!1&&o?.enabled===!1)return null;if(o)return o;for(let r=0;r<((s=n?.children)==null?void 0:s.length);r++){const l=_c(n.children[r],e);if(l)return l}return null}function Na(n,e,t,s=!0){var o;t||(t=[]),s&&(t.length=0),bc(n,e,t,!1);for(let r=0;r<((o=n?.children)==null?void 0:o.length);r++)Na(n.children[r],e,t,!1);return t}function wc(n,e){if(!n)return null;if(Array.isArray(n)){for(let s=0;s<n.length;s++){const o=oR(n[s]),r=wc(o,e);if(r)return r}return null}return Rr(n,e)||(n.parent?wc(n.parent,e):null)}function nu(n,e,t,s=!0){return t||(t=[]),s&&(t.length=0),n?(bc(n,e,t,!1),n.parent?nu(n.parent,e,t,!1):t):t}function xc(n,e=void 0,t=!0){if(!n)return null;if(!e&&(e=J.Current,!e))return console.error("Can not search object without any needle context or scene!!!"),null;let s=e;return s.isScene||(s=e?.scene),s&&_c(s,n,t)||null}function bw(n,e,t=void 0){if(!n)return e??[];if(e||(e=[]),e.length=0,!t&&(t=J.Current,!t))return console.error("Can not search object without any needle context or scene!!!"),e;"scene"in t&&(t=t.scene);const s=t;return s&&Na(s,n,e,!1),e}function ou(n){n&&n.isObject3D===!0&&uw(n,E)}E.prototype.SetActive=function(n){this.visible=n},E.prototype.setActive=function(n){this.visible=n},E.prototype.destroy=function(){Ai(this)},E.prototype.addComponent=function(n,e){return Ei(this,n,e)},E.prototype.addNewComponent=function(n,e){return Ei(this,n,e)},E.prototype.removeComponent=function(n){return mf(this,n)},E.prototype.getOrAddComponent=function(n,e){return vc(this,n,e)},E.prototype.getComponent=function(n){return Rr(this,n)},E.prototype.getComponents=function(n,e){return bc(this,n,e)},E.prototype.getComponentInChildren=function(n){return _c(this,n)},E.prototype.getComponentsInChildren=function(n,e){return Na(this,n,e)},E.prototype.getComponentInParent=function(n){return wc(this,n)},E.prototype.getComponentsInParent=function(n,e){return nu(this,n,e)},Object.getOwnPropertyDescriptor(E.prototype,"activeSelf")||Object.defineProperty(E.prototype,"activeSelf",{get:function(){return Wa(this)},set:function(n){Sc(this,n)}}),Object.getOwnPropertyDescriptor(E.prototype,"worldPosition")||Object.defineProperty(E.prototype,"worldPosition",{get:function(){return this instanceof Vv?ee(this.object):ee(this)},set:function(n){lt(this,n)}}),Object.getOwnPropertyDescriptor(E.prototype,"worldQuaternion")||Object.defineProperty(E.prototype,"worldQuaternion",{get:function(){return this instanceof Vv?Se(this.object):Se(this)},set:function(n){Yi(this,n)}}),Object.getOwnPropertyDescriptor(E.prototype,"worldRotation")||Object.defineProperty(E.prototype,"worldRotation",{get:function(){return Ad(this)},set:function(n){Lb(this,n)}}),Object.getOwnPropertyDescriptor(E.prototype,"worldScale")||Object.defineProperty(E.prototype,"worldScale",{get:function(){return Ge(this)},set:function(n){Ta(this,n)}}),Object.getOwnPropertyDescriptor(E.prototype,"worldForward")||Object.defineProperty(E.prototype,"worldForward",{get:function(){return q().set(0,0,1).applyQuaternion(Se(this))}}),Object.getOwnPropertyDescriptor(E.prototype,"worldRight")||Object.defineProperty(E.prototype,"worldRight",{get:function(){return q().set(1,0,0).applyQuaternion(Se(this))}}),Object.getOwnPropertyDescriptor(E.prototype,"worldUp")||Object.defineProperty(E.prototype,"worldUp",{get:function(){return q().set(0,1,0).applyQuaternion(Se(this))}}),pw(E);class he extends oe{constructor(e,t,s,o){super(),a(this,"alpha",1),typeof e=="number"&&typeof t=="number"&&typeof s=="number"?(this.set(e,t,s),this.alpha=typeof o=="number"?o:1):e!==void 0&&(this.set(e),this.alpha=1)}get isRGBAColor(){return!0}set a(e){this.alpha=e}get a(){return this.alpha}clone(){const e=super.clone();return e.alpha=this.alpha,e}copy(e){return this.r=e.r,this.g=e.g,this.b=e.b,"alpha"in e&&typeof e.alpha=="number"?this.alpha=e.alpha:typeof e.a=="number"&&(this.alpha=e.a),this}lerp(e,t){const s=e;return s.alpha!=null&&(this.alpha=W.lerp(this.alpha,s.alpha,t)),super.lerp(e,t)}lerpColors(e,t,s){const o=e,r=t;return o.alpha!=null&&r.alpha!=null&&(this.alpha=W.lerp(o.alpha,r.alpha,s)),super.lerpColors(e,t,s)}multiply(e){const t=e;return t.alpha!=null&&(this.alpha=this.alpha*t.alpha),super.multiply(e)}fromArray(e,t=0){return this.alpha=e[t+3],super.fromArray(e,t)}static fromColorRepresentation(e){if(typeof e=="string"){if(e.trim()==="transparent")return new he(0,0,0,0);if(e.startsWith("#")&&e.length===9){const t=parseInt(e.slice(1,9),16),s=t>>24&255,o=t>>16&255,r=t>>8&255,l=t>>0&255;return new he(s/255,o/255,r/255,l/255)}else if(e.startsWith("#")){const t=parseInt(e.slice(1),16),s=t>>16&255,o=t>>8&255,r=t>>0&255;return new he(s/255,o/255,r/255,1)}else if(e.startsWith("rgba")){const t=e.slice(5,-1).split(",").map(Number);return new he(t[0]/255,t[1]/255,t[2]/255,t[3])}else if(e.startsWith("rgb")){const t=e.slice(4,-1).split(",").map(Number);return new he(t[0]/255,t[1]/255,t[2]/255,1)}}else if(Array.isArray(e)){if(e.length===4)return new he(e[0],e[1],e[2],e[3]);if(e.length===3)return new he(e[0],e[1],e[2],1);console.error("Invalid color array length. Expected 3 or 4, got "+e.length)}return new he(e)}}const ru=C("debuggetcomponent"),Tr=C("debuginstantiate");class Fs{constructor(){a(this,"idProvider"),a(this,"parent"),a(this,"keepWorldPosition"),a(this,"position"),a(this,"rotation"),a(this,"scale"),a(this,"visible"),a(this,"context"),a(this,"components")}clone(){var e,t,s;const o=new Fs;return o.idProvider=this.idProvider,o.parent=this.parent,o.keepWorldPosition=this.keepWorldPosition,o.position=(e=this.position)==null?void 0:e.clone(),o.rotation=(t=this.rotation)==null?void 0:t.clone(),o.scale=(s=this.scale)==null?void 0:s.clone(),o.visible=this.visible,o.context=this.context,o.components=this.components,o}cloneAssign(e){var t,s,o;this.idProvider=e.idProvider,this.parent=e.parent,this.keepWorldPosition=e.keepWorldPosition,this.position=(t=e.position)==null?void 0:t.clone(),this.rotation=(s=e.rotation)==null?void 0:s.clone(),this.scale=(o=e.scale)==null?void 0:o.clone(),this.visible=e.visible,this.context=e.context,this.components=e.components}}function Wa(n){return n.visible}function Sc(n,e){return typeof e=="number"&&(e=e>.5),n.visible=e,n.visible}function _w(n){return n[En]||au(n)}function ww(n,e){n[W_]=e}function au(n){return ms.isUsingInstancing(n)}function gf(n,e){return Ma(n,e,!0,!0)}const xw=Symbol("isDestroyed");function Er(n){return n[xw]}function Sw(n,e){n[xw]=e}const ff=Symbol("isDontDestroy");function Va(n,e=!0){n[ff]=e}const lu=[],cu=[];function Ai(n,e=!0,t=!1){lu.length=0,cu.length=0,yf(n,e,!0);for(const s of lu)s.gameObject=null,s.context=null;for(const s of cu)Sw(s,!0),t&&Te(s),z_(s);cu.length=0,lu.length=0}function yf(n,e=!0,t=!0){var s;if(n==null)return;const o=n;if(o.isComponent){if(o[ff])return;lu.push(o);const c=o.gameObject;o.__internalDisable(),o.__internalDestroy(),o.gameObject=c;return}if(n[ff])return;const r=n;ru&&console.log(r),cu.push(r);const l=(s=r.userData)==null?void 0:s.components;if(l!=null&&Array.isArray(l)){let c=l.length;for(let h=0;h<l.length;h++){const d=l[h];yf(d,e,!1),l.length<c&&(c=l.length,h--)}}if(e&&r.children)for(const c of r.children)yf(c,e,!1);t&&r.removeFromParent()}function Ar(n,e,t=!0){return Cw(n,e,t)}function*hu(n,e,t=!1,s=999,o=0){if(n!=null&&n.userData.components&&!(o>s)){for(const r of n.userData.components)e&&r?.isComponent===!0&&r instanceof e?yield r:yield r;if(t===!0)for(const r of n.children)yield*hu(r,e,!0,s,o+1)}}function Cw(n,e,t,s=0){var o;if(n){if(n.isObject3D,s>1e3){console.warn("Failed to iterate components: too many levels");return}if((o=n.userData)!=null&&o.components)for(let r=0;r<n.userData.components.length;r++){const l=n.userData.components[r];if(l?.isComponent===!0){const c=e(l);if(c!==void 0)return c}}if(t&&n.children){const r=s+1;for(let l=0;l<n.children.length;l++){const c=n.children[l];if(!c)continue;const h=Cw(c,e,t,r);if(h!==void 0)return h}}}}function $a(n,e){if("isAssetReference"in n)return n.instantiate(e??void 0);let t=null;e!=null&&(e.x!==void 0?(t=new Fs,t.position=e):t=e);let s=J.Current;t!=null&&t.context&&(s=t.context),ru&&s.alias&&console.log("context",s.alias),t&&!t.idProvider&&(t.idProvider=new jt(Date.now()));const o=[],r={},l={},c=Pw(s,n,t,o,r,l);c&&(aR(r),rR(l,r)),ru&&(Id(n,!0),Id(c,!0));const h={};if(t?.components!==!1){for(const d in o){const u=o[d],p=u.guid;t&&t.idProvider&&(u.guid=t.idProvider.generateUUID(),h[p]=u.guid,ru&&console.log(u.name,u.guid)),bu(u,s),u.__internalNewInstanceCreated&&u.__internalNewInstanceCreated()}for(const d in o){const u=o[d];u.resolveGuids&&u.resolveGuids(h),u.enabled!==!1&&(u.enabled=!0)}Kd(s)}return c}function Pw(n,e,t,s,o,r){var l;if(!e||e[Mi])return null;const c=e.userData;e.userData={};const h=e.children;e.children=[];const d=e.clone(!1);if(ou(d),e.userData=c,e.children=h,o[e.uuid]={original:e,clone:d},Tr&&console.log("ADD",e,d),e.type==="SkinnedMesh"&&(r[e.uuid]={original:e,clone:d}),t?.visible!==void 0&&(d.visible=t.visible),t!=null&&t.idProvider){d.uuid=t.idProvider.generateUUID();const p=d;p&&(p.guid=d.uuid)}e.animations&&e.animations.length>0&&(d.animations=[...e.animations]);const u=e.parent;if(u&&u.add(d),t!=null&&t.position?lt(d,t.position):d.position.copy(e.position),t!=null&&t.rotation?Yi(d,t.rotation):d.quaternion.copy(e.quaternion),t!=null&&t.scale?d.scale.copy(t.scale):d.scale.copy(e.scale),t!=null&&t.parent&&t.parent!=="scene"){let p=null;if(typeof t.parent=="string"?p=Ma(t.parent,n.scene,!0):p=t.parent,p){const g=t.keepWorldPosition===!0?p.attach:p.add;g?g.call(p,d):console.error("Invalid parent object",p,"received when instantiating:",e)}else console.warn("could not find parent:",t.parent)}for(const[p,g]of Object.entries(e.userData))p!=="components"&&(d.userData[p]=g);if((l=e.userData)!=null&&l.components){const p=e.userData.components,g=[];d.userData.components=g;for(let f=0;f<p.length;f++){const y=p[f],v=new y.constructor;za(v,y,void 0,{}),y[oc]!==void 0&&(v[oc]=y[oc]),g.push(v),v.gameObject=d,s.push(v),o[y.guid]={original:y,clone:v},uc.dispatchComponentLifecycleEvent("component-added",v)}}t&&(t.position=void 0,t.rotation=void 0,t.scale=void 0,t.parent=void 0,t.visible=void 0);for(const p in e.children){const g=e.children[p],f=Pw(n,g,t,s,o,r);f&&(o[f.uuid]={original:g,clone:f},d.add(f))}return d}function rR(n,e){for(const t in n){const s=n[t],o=s.original,r=o.skeleton,l=s.clone;if(!r){console.warn("Skinned mesh has no skeleton?",s);continue}const c=r.bones,h=l.skeleton.clone();l.skeleton=h,l.bindMatrix.clone().copy(o.bindMatrix),l.bindMatrixInverse.copy(o.bindMatrixInverse);const d=[];h.bones=d;for(let u=0;u<c.length;u++){const p=c[u],g=e[p.uuid].clone;d.push(g)}}for(const t in n){const s=n[t].clone;s.skeleton.update(),s.bind(s.skeleton,s.bindMatrix),s.updateMatrixWorld(!0)}}function aR(n){var e;for(const t in n){const s=n[t].clone;if(s!=null&&s.isObject3D&&(e=s?.userData)!=null&&e.components)for(let o=0;o<s.userData.components.length;o++){const r=s.userData.components[o],l=Object.entries(r);for(const[c,h]of l)if(Array.isArray(h)){const d=[];r[c]=d;for(let u=0;u<h.length;u++){const p=h[u];if(typeof p!="object"){d.push(p);continue}const g=Ow(r,c,p,n);g!==void 0?(Tr&&console.log("Found new instance for",c,p,"->",g),d.push(g)):(Tr&&console.warn("Could not find new instance for",c,p),d.push(p))}}else if(typeof h=="object"){const d=Ow(r,c,h,n);d!==void 0?r[c]=d:Tr&&console.warn("Could not find new instance for",c,h)}}}}function Ow(n,e,t,s){var o,r;if(t!=null)if(t.isComponent===!0){const l=t.gameObject;if(l){const c=l.uuid,h=(o=s[c])==null?void 0:o.clone;if(!h){Tr&&console.log("reference did not change",e,n,t);return}const d=l.userData.components.indexOf(t);if(d>=0&&h.isObject3D)return Tr&&console.log(e,c),h.userData.components[d];console.warn("could not find component",e,t)}}else if(t.isObject3D===!0){if(e==="gameObject")return;const l=t;if(l){const c=l.uuid,h=(r=s[c])==null?void 0:r.clone;if(h)return Tr&&console.log(e,"old",t,"new",h),h}}else{if(t.isVector4||t.isVector3||t.isVector2||t.isQuaternion||t.isEuler||t.isColor===!0)return t.clone();if(t.isEventList===!0)return t.__internalOnInstantiate(s)}}var Ir;(n=>{n.baseUrl="https://networking.needle.tools";function e(h){return Yv(new Uint8Array(h))}n.hashMD5=e;function t(h){const d=Yv(new Uint8Array(h),{encoding:"binary",asBytes:!0});return btoa(String.fromCharCode(...d))}n.hashMD5_Base64=t;function s(h){const d=new Uint8Array(h);return crypto.subtle.digest("SHA-256",d).then(u=>btoa(String.fromCharCode(...new Uint8Array(u))))}n.hashSha256=s;function o(h){const d=h.filesize/1024/1024;return Js()?d<50:d<5}n.canUpload=o;async function r(h,d){var u;const p=n.baseUrl;if(p){if(!h.name)return console.error("Upload: file name is missing"),null}else return console.error("Blob storage base url is not set"),null;let g=null;h instanceof File?g=await h.arrayBuffer():g=h.data;const f=g.byteLength,y=f/1024/1024;if(y>50)return d?.silent!==!0&&be(`File (${y.toFixed(1)}MB) is too large for uploading (see console for details)`),console.warn(`Your file is too large for uploading (${y.toFixed(1)}MB). Max allowed size is 50MB`),null;if(!Js()&&y>5)return d?.silent!==!0&&be('File is too large for uploading. Please get a <a href="https://needle.tools/pricing" target="_blank">commercial license</a> to upload files larger than 5MB'),console.warn(`Your file is too large for uploading (${y.toFixed(1)}MB). Max size is 5MB for non-commercial users. Please get a commercial license at https://needle.tools/pricing for larger files (up to 50MB)`),null;if(f<1)return console.warn(`Your file is too small for uploading (${y.toFixed(1)}MB). Min size is 1 byte`),null;const v=t(g),b={filename:h.name,"Content-Md5":v,"Content-Type":h.type||"application/octet-stream",FileSize:f.toString(),"Content-Disposition":`attachment; filename="${h.name}"`,"x-amz-server-side-encryption":"AES256"},_=await fetch(p+"/api/needle/blob",{method:"POST",headers:b,signal:d?.abort}).then(w=>w.json()).catch(w=>(console.error(w),null));if(_==null)return console.warn("Upload failed..."),null;if("error"in _)return console.error(_.error),null;if("upload"in _&&_.upload){let w=function(M){var T;return(T=d?.onProgress)==null||T.call(null,{progress01:0,state:"inprogress"}),fetch(M,{method:"PUT",headers:b,body:g,signal:d?.abort}).then(L=>{var D;return(D=d?.onProgress)==null||D.call(null,{progress01:1,state:"finished"}),L}).catch(L=>L)};console.debug("Uploading file",_.upload);let x=!1,k=null;for(let M=0;M<3;M++)try{if(x)break;if((u=d?.abort)!=null&&u.aborted)return console.debug("Aborted upload"),null;const T=await w(_.upload);T instanceof Error?(k=T,await vs(1e3*M)):T.ok&&(console.debug("File uploaded successfully"),x=!0)}catch(T){console.error(T)}if(!x)return console.error(k?.message||"Failed to upload file"),null}if("download"in _){const w=p+_.download;return console.debug("File found in blob storage",w),{key:_.key,success:!0,download_url:w}}return null}n.upload=r;function l(h){return`${n.baseUrl}/api/needle/blob/${h}`}n.getBlobUrlForKey=l;async function c(h,d){const u=new Em;u.setResponseType("arraybuffer");const p=await u.loadAsync(h,g=>{d&&d.call(null,g)});return p instanceof ArrayBuffer?new Uint8Array(p):(console.error("Download failed, no arraybuffer returned"),null)}n.download=c})(Ir||(Ir={}));const xo=C("debugaddressables");class kw{constructor(e){a(this,"_context"),a(this,"_assetReferences",{}),a(this,"preUpdate",()=>{}),this._context=e,this._context.pre_update_callbacks.push(this.preUpdate)}dispose(){const e=this._context.pre_update_callbacks.indexOf(this.preUpdate);e>=0&&this._context.pre_update_callbacks.splice(e,1);for(const t in this._assetReferences){const s=this._assetReferences[t];s?.unload()}this._assetReferences={}}findAssetReference(e){return this._assetReferences[e]||null}registerAssetReference(e){return e.url&&(this._assetReferences[e.url]?console.warn("Asset reference already registered",e):this._assetReferences[e.url]=e),e}unregisterAssetReference(e){e.url&&delete this._assetReferences[e.url]}}const vf=Symbol("assetReference"),Mw=class Dl{constructor(e,t,s=null){a(this,"_loading"),a(this,"_asset"),a(this,"_glbRoot"),a(this,"_url"),a(this,"_urlName"),a(this,"_progressListeners",[]),a(this,"_hash"),a(this,"_hashedUri"),a(this,"_isLoadingRawBinary",!1),a(this,"_rawBinary"),this._url=e;const o=e.lastIndexOf("/");if(o>=0){this._urlName=e.substring(o+1);const r=this._urlName.lastIndexOf(".");r>=0&&(this._urlName=this._urlName.substring(0,r))}else this._urlName=e;this._hash=t,e.includes("?v=")?this._hashedUri=e:this._hashedUri=t?e+"?v="+t:e,s!==null&&(this.asset=s),ew(this._url,this.onResolvePrefab.bind(this))}static getOrCreateFromUrl(e,t){if(!t&&(t=J.Current,!t))throw new Error('Context is required when sourceId is a string. When you call this method from a component you can call it with "getOrCreate(this, url)" where "this" is the component.');const s=t.addressables,o=s.findAssetReference(e);if(o)return o;const r=new Dl(e,t.hash);return s.registerAssetReference(r),r}static getOrCreate(e,t,s){if(typeof e=="string"){if(!s&&(s=J.Current,!s))throw new Error('Context is required when sourceId is a string. When you call this method from a component you can call it with "getOrCreate(this, url)" where "this" is the component.')}else s=e.context,e=e.sourceId;const o=yo(e,t);xo&&console.log("GetOrCreate Addressable from",e,t,"FinalPath=",o);const r=s.addressables,l=r.findAssetReference(o);if(l)return l;const c=new Dl(o,s.hash);return r.registerAssetReference(c),c}get isAssetReference(){return!0}get asset(){return this._glbRoot??this._asset}set asset(e){this._asset=e}get uri(){return this._url}get url(){return this._url}get urlName(){return this._urlName}get hasUrl(){return this._url!==void 0&&(this._url.startsWith("http")||this._url.startsWith("blob:")||this._url.startsWith("www.")||this._url.includes("/"))}get rawAsset(){return this._asset}async onResolvePrefab(e){return e===this.url&&(this.mustLoad&&await this.loadAssetAsync(),this.asset)?this.asset:null}get mustLoad(){return!this.asset||this.asset.__destroyed===!0||Er(this.asset)===!0}isLoaded(){return this._rawBinary||this.asset!==void 0}unload(){this.asset&&(xo&&console.log("Unload",this.asset),"scene"in this.asset&&this.asset.scene&&Ai(this.asset.scene,!0,!0),Ai(this.asset,!0,!0)),this.asset=null,this._rawBinary=void 0,this._glbRoot=null,this._loading=void 0,J.Current&&J.Current.addressables.unregisterAssetReference(this)}async preload(){if(!this.mustLoad||this._isLoadingRawBinary)return null;if(this._rawBinary!==void 0)return this._rawBinary;this._isLoadingRawBinary=!0,xo&&console.log("Preload",this._hashedUri);const e=await Ir.download(this._hashedUri,t=>{this.raiseProgressEvent(t)});return this._rawBinary=e?.buffer??null,this._isLoadingRawBinary=!1,this._rawBinary}async loadAssetAsync(e){if(xo&&console.log("loadAssetAsync",this.url),!this.mustLoad)return this.asset;if(e&&this._progressListeners.push(e),this._loading!==void 0)return this._loading.then(o=>this.asset);const t=J.Current;if(this._rawBinary){if(!(this._rawBinary instanceof ArrayBuffer))return console.error("Invalid raw binary data",this._rawBinary),null;this._loading=xs().parseSync(t,this._rawBinary,this.url,null),this.raiseProgressEvent(new ProgressEvent("progress",{loaded:this._rawBinary.byteLength,total:this._rawBinary.byteLength}))}else xo&&console.log("Load async",this.url),this._loading=xs().loadSync(t,this._hashedUri,this.url,null,o=>{this.raiseProgressEvent(o)});const s=await this._loading;return this._progressListeners.length=0,this._glbRoot=this.tryGetActualGameObjectRoot(s),this._loading=void 0,s?(s[vf]=this,this._glbRoot&&(this._glbRoot[vf]=this),this.asset&&(this.asset[vf]=this),Kd(t),s.scene!==void 0&&(this.asset=s),this.asset):null}instantiate(e){return this.onInstantiate(e,!1)}instantiateSynced(e,t=!0){return this.onInstantiate(e,!0,t)}beginListenDownload(e){this._progressListeners.indexOf(e)<0&&this._progressListeners.push(e)}endListenDownload(e){const t=this._progressListeners.indexOf(e);t>=0&&this._progressListeners.splice(t,1)}raiseProgressEvent(e){for(const t of this._progressListeners)t(this,e)}async onInstantiate(e,t=!1,s){const o=J.Current,r=new Fs;if(e instanceof E?r.parent=e:e&&(Object.assign(r,e),r.cloneAssign(e)),r.parent===void 0&&(r.parent=o.scene),this.mustLoad&&await this.loadAssetAsync(),xo&&console.log("Instantiate",this.url,"parent:",e),this.asset){xo&&console.log("Add to scene",this.asset);let l=Dl.currentlyInstantiating.get(this.url);if(l!==void 0&&l>=1e4)return console.error("Recursive or too many instantiations of "+this.url+" in the same frame ("+l+")"),null;try{if(l===void 0&&(l=0),l+=1,Dl.currentlyInstantiating.set(this.url,l),t){r.context=o;const c=this.asset;c.guid=this.url;const h=of(c,r,void 0,s);if(h)return h}else{const c=$a(this.asset,r);if(c)return c}}finally{o.post_render_callbacks.push(()=>{l===void 0||l<0?l=0:l-=1,Dl.currentlyInstantiating.set(this.url,l)})}}else xo&&console.warn("Failed to load asset",this.url);return null}tryGetActualGameObjectRoot(e){if(e&&e.scene){const t=e.scene;return t.isGroup&&t.children.length===1&&t.children[0].name+"glb"===t.name?t.children[0]:t}return null}};a(Mw,"currentlyInstantiating",new Map);let ce=Mw;class lR extends es{constructor(){super([ce],"AssetReferenceSerializer")}onSerialize(e,t){if(e&&e.uri!==void 0&&typeof e.uri=="string")return e.uri}onDeserialize(e,t){if(typeof e=="string")return t.context?t.gltfId?ce.getOrCreate(t.gltfId,e,t.context):(console.error("Missing source id"),null):(console.error("Missing context"),null);if(e instanceof E){if(!t.context)return console.error("Missing context"),null;if(!t.gltfId)return console.error("Missing source id"),null;const s=e,o=t.context,r=s.guid??s.uuid,l=o.addressables.findAssetReference(r);if(l)return l;const c=new ce(r,void 0,s);return o.addressables.registerAssetReference(c),c}return null}}new lR;const cR=Promise.resolve(null),Rw=class ym{constructor(e){a(this,"url"),a(this,"_bitmap"),a(this,"_bitmapObject"),a(this,"loader",null),this.url=e}static getOrCreate(e){let t=ym.imageReferences.get(e);return t||(t=new ym(e),ym.imageReferences.set(e,t)),t}dispose(){this._bitmapObject&&this._bitmapObject.close(),this._bitmap=void 0}createHTMLImage(){const e=new Image;return e.src=this.url,e}createTexture(){return this.url?(this.loader||(this.loader=new Sa),this.loader.setCrossOrigin("anonymous"),this.loader.loadAsync(this.url).then(e=>{var t;return e&&!((t=e.name)!=null&&t.length)&&(e.name=this.url.split("/").pop()??this.url),e})):(console.error("Can not load texture without url"),cR)}getBitmap(){return this._bitmap?this._bitmap:(this._bitmap=new Promise((e,t)=>{const s=document.createElement("img");s.addEventListener("load",()=>{this._bitmap=createImageBitmap(s).then(o=>(this._bitmapObject=o,e(o),o))}),s.addEventListener("error",o=>{console.error("Failed to load image:"+this.url,o),e(null)}),s.src=this.url}),this._bitmap)}};a(Rw,"imageReferences",new Map);let bf=Rw;class Tw extends es{constructor(){super([bf],"ImageReferenceSerializer")}onSerialize(e,t){return null}onDeserialize(e,t){if(typeof e=="string"){const s=yo(t.gltfId,e);return bf.getOrCreate(s)}}}new Tw;const Ew=class vm{constructor(e){a(this,"url"),a(this,"res"),this.url=e}static getOrCreate(e){let t=vm.cache.get(e);return t||(t=new vm(e),vm.cache.set(e,t)),t}async loadRaw(){return this.res||(this.res=fetch(this.url)),this.res.then(e=>e.blob())}async loadText(){return this.res||(this.res=fetch(this.url)),this.res.then(e=>e.text())}};a(Ew,"cache",new Map);let _f=Ew;class Aw extends es{constructor(){super([_f],"FileReferenceSerializer")}onSerialize(e,t){return null}onDeserialize(e,t){if(typeof e=="string"){const s=yo(t.gltfId,e);return _f.getOrCreate(s)}}}new Aw;class hR{constructor(e){a(this,"context"),a(this,"mixers",[]),this.context=e}onDestroy(){this.mixers.forEach(e=>e.stopAllAction()),this.mixers.length=0}registerAnimationMixer(e){if(!e){console.warn("AnimationsRegistry.registerAnimationMixer called with null or undefined mixer");return}this.mixers.includes(e)||this.mixers.push(e)}unregisterAnimationMixer(e){if(!e){console.warn("AnimationsRegistry.unregisterAnimationMixer called with null or undefined mixer");return}const t=this.mixers.indexOf(e);t!==-1&&this.mixers.splice(t,1)}}class Ha{static tryGetActionsFromMixer(e){return e._actions||null}static tryGetAnimationClipsFromObjectHierarchy(e,t){if(t||(t=new Array),e)e.animations&&t.push(...e.animations);else return t;if(e.children)for(const s of e.children)this.tryGetAnimationClipsFromObjectHierarchy(s,t);return t}static assignAnimationsFromFile(e,t){if(!e||!e.animations){console.debug("No animations found in file");return}for(let o=0;o<e.animations.length;o++){const r=e.animations[o];if(!r.tracks||r.tracks.length<=0){console.warn("Animation has no tracks");continue}for(const l in r.tracks){const c=r.tracks[l],h=Ca.parseTrackName(c.name);let d=Ca.findNode(e.scene,h.nodeName);if(!d){const p=c.__objectName??c.name.substring(0,c.name.indexOf("."));if(d=e.scene.getObjectByProperty("uuid",p),!d)continue}let u=s(d);if(!u){if(!(t!=null&&t.createAnimationComponent)){console.warn("No AnimationComponent found in parent hierarchy of object and no 'createAnimationComponent' callback was provided in options.");continue}u=t.createAnimationComponent(e.scene,r)}u.addClip&&u.addClip(r)}}function s(o){var r;if(!o)return null;const l=(r=o.userData)==null?void 0:r.components;if(l&&l.length>0){for(let c=0;c<l.length;c++)if(l[c].isAnimationComponent===!0)return o}return s(o.parent)}}}function*wf(n,e=null){const t=e?e.time:J.Current.time,s=t.time;for(;t.time-s<n;)yield}function*dR(n){for(let e=0;e<n;e++)yield}function*Iw(n){let e=!0;for(n.then(()=>e=!1),n.catch(()=>e=!1);e;)yield}const Lw="NEEDLE_lightmaps",Cc=C("debuglightmapsextension")||C("debuglightmaps");var So=(n=>(n[n.Lightmap=0]="Lightmap",n[n.Skybox=1]="Skybox",n[n.Reflection=2]="Reflection",n))(So||{});class uR{constructor(e,t,s){a(this,"parser"),a(this,"registry"),a(this,"source"),this.parser=e,this.registry=t,this.source=s}get name(){return Lw}afterRoot(e){const t=this.parser.json.extensions;if(t){const s=t[Lw];if(s){const o=s.textures;return o!=null&&o.length?(Cc&&console.log(s),new Promise(async(r,l)=>{const c=[];for(const d of o)if(d.pointer){Cc&&console.log(d);let u=null;if(d.pointer.startsWith("/textures/"))Cc&&console.log("Load texture from gltf",d.pointer),u=lf(this.parser,d.pointer).then(p=>this.resolveTexture(d,p));else if(typeof d.pointer=="string"){Cc&&console.log("Load texture from path",d.pointer);const p=yo(this.source,d.pointer);let g;p.endsWith(".exr")?g=new Cd(this.parser.options.manager):p.endsWith(".hdr")?g=new Wm(this.parser.options.manager):g=new Sa(this.parser.options.manager),u=g.loadAsync(p,void 0).then(f=>this.resolveTexture(d,f))}else d.pointer;u&&c.push(u)}const h=await Jm(c);h!=null&&h.anyFailed&&F()&&console.error("Failed to load lightmap extension",h),r()})):null}}return null}resolveTexture(e,t){const s=t;Cc&&console.log("Lightmap loaded:",s),s!=null&&s.isTexture&&(this.registry?(s.colorSpace=On,this.registry.registerTexture(this.source,e.type,s,e.index)):console.log(So[e.type],e.pointer,s))}}const jw=!!C("debuglightmaps");class pR{constructor(e){a(this,"_context"),a(this,"_lightmaps",new Map),this._context=e}clear(){this._lightmaps.clear()}registerTexture(e,t,s,o){jw&&console.log("Registering ",So[t]+' "'+e+'"',s),this._lightmaps.has(e)||this._lightmaps.set(e,new Map);const r=this._lightmaps.get(e),l=r?.get(t)??[];l.length<o&&(l.length=o+1),l[o]=s,r?.set(t,l)}tryGetLightmap(e,t=0){return this.tryGet(e,So.Lightmap,t)}tryGetSkybox(e){return this.tryGet(e,So.Skybox,0)}tryGetReflection(e){return this.tryGet(e,So.Reflection,0)}tryGet(e,t,s){if(!e)return jw&&console.warn("Missing source id"),null;const o=this._lightmaps.get(e);if(!o)return null;const r=o.get(t);return r===void 0||!(r!=null&&r.length)||r.length<=s?null:r[s]}}qt.lights_fragment_maps=qt.lights_fragment_maps.replace("vec4 lightMapTexel = texture2D( lightMap, vLightMapUv );",`
|
|
192
|
+
vec2 lUv = vLightMapUv.xy * lightmapScaleOffset.xy + vec2(lightmapScaleOffset.z, (1. - (lightmapScaleOffset.y + lightmapScaleOffset.w)));
|
|
193
|
+
vec4 lightMapTexel = texture2D( lightMap, lUv);
|
|
194
|
+
// The range of RGBM lightmaps goes from 0 to 34.49 (5^2.2) in linear space, and from 0 to 5 in gamma space.
|
|
195
|
+
lightMapTexel.rgb *= lightMapTexel.a * 8.; // no idea where that "8" comes from... heuristically derived
|
|
196
|
+
lightMapTexel.a = 1.;
|
|
197
|
+
lightMapTexel = conv_sRGBToLinear(lightMapTexel);
|
|
198
|
+
`),qt.lightmap_pars_fragment=`
|
|
199
|
+
#ifdef USE_LIGHTMAP
|
|
200
|
+
uniform sampler2D lightMap;
|
|
201
|
+
uniform float lightMapIntensity;
|
|
202
|
+
uniform vec4 lightmapScaleOffset;
|
|
203
|
+
|
|
204
|
+
// took from threejs 05fc79cd52b79e8c3e8dec1e7dca72c5c39983a4
|
|
205
|
+
vec4 conv_sRGBToLinear( in vec4 value ) {
|
|
206
|
+
return vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );
|
|
207
|
+
}
|
|
208
|
+
#endif
|
|
209
|
+
`,qt.lights_fragment_begin=qt.lights_fragment_begin.replace("irradiance += getLightProbeIrradiance( lightProbe, geometry.normal );",`
|
|
210
|
+
#if defined(USE_LIGHTMAP)
|
|
211
|
+
irradiance += 0.;
|
|
212
|
+
#else
|
|
213
|
+
irradiance += getLightProbeIrradiance( lightProbe, geometry.normal );
|
|
214
|
+
#endif`),VC.lightmap.lightmapScaleOffset={value:new fe(1,1,0,0)};const xf=C("debugprogressive"),du=new Si,uu=new gd;class mR{constructor(e){a(this,"context"),a(this,"_lodsManager"),this.context=e}get manager(){return this._lodsManager}get targetTriangleDensity(){var e;return((e=this._lodsManager)==null?void 0:e.targetTriangleDensity)??-1}set targetTriangleDensity(e){this._lodsManager&&(this._lodsManager.targetTriangleDensity=e)}setRenderer(e){var t;(t=this._lodsManager)==null||t.disable(),Oa.removePlugin(this),Oa.addPlugin(this),Oa.debugDrawLine=$.DrawLine,this._lodsManager=Oa.get(e),this._lodsManager.enable()}disable(){var e;(e=this._lodsManager)==null||e.disable(),Oa.removePlugin(this)}onAfterUpdatedLOD(e,t,s,o,r){xf&&this.onRenderDebug(s,o,r)}onRenderDebug(e,t,s){var o,r,l;if(!t.geometry||!Xe.hasLODLevelAvailable(t.geometry)&&!Xe.hasLODLevelAvailable(t.material))return;const c=Oa.getObjectLODState(t);if(!c)return;let h=s.mesh_lod;const d=s.mesh_lod!=c.lastLodLevel_Mesh||s.texture_lod!=c.lastLodLevel_Texture;if(xf&&t.geometry.boundingSphere){const u=t.geometry.boundingSphere;uu.copy(u),uu.applyMatrix4(t.matrixWorld);const p=uu.center,g=uu.radius,f=["#76c43e","#bcc43e","#c4ac3e","#c4673e","#ff3e3e"];if(d)$.DrawWireSphere(p,g,f[h],.1);else{const y=((o=t.geometry.index)==null?void 0:o.count)??0,v=(r=Xe.getMeshLODInformation(t.geometry))==null?void 0:r.lods;h=v?Math.min(v?.length-1,h):0;let b="";if(v&&c.lastScreenCoverage>0)for(let x=0;x<v.length;x++){const k=v[x].density,M=x==v.length-1;b+=k.toFixed(0)+">"+(k/c.lastScreenCoverage).toFixed(0)+(M?"":",")}const _=v?(l=v[h])==null?void 0:l.density:-1;let w="LOD "+s.mesh_lod+`
|
|
215
|
+
TEX `+s.texture_lod;if(xf=="density"&&(w+=`
|
|
216
|
+
`+y+` tris
|
|
217
|
+
`+(_/c.lastScreenCoverage).toFixed(0)+` dens
|
|
218
|
+
`+(c.lastScreenCoverage*100).toFixed(1)+`% cov
|
|
219
|
+
`+(c.lastCentrality*100).toFixed(1)+`% centr
|
|
220
|
+
`+(du.min.x.toFixed(2)+"-"+du.max.x.toFixed(2)+"x"+du.min.y.toFixed(2)+"-"+du.max.y.toFixed(2))+" scr"),c.lastScreenCoverage>.1){const x=e,k=x.worldForward,M=x.worldPosition,T=q(k).multiplyScalar(g*.7).add(p),L=T.distanceTo(M),D=f[Math.min(f.length-1,Math.max(0,h))]+"88",z=this.context.domHeight>0?screen.height/this.context.domHeight:1,j=e.isPerspectiveCamera?Math.tan(e.fov*Math.PI/180/2):1;$.DrawLabel(T,w,L*.012*z*j,void 0,16777215,D)}}}}}const gR=C("debugplayerview");var Co=(n=>(n.Browser="browser",n.Headset="headset",n.Handheld="handheld",n))(Co||{});class Dw{constructor(e,t){a(this,"userId"),a(this,"context"),a(this,"viewDevice","browser"),a(this,"removed",!1),a(this,"_object"),this.userId=e,this.context=t}get currentObject(){return this._object}set currentObject(e){this._object=e}get isConnected(){return this.context.connection.userIsInRoom(this.userId)}}class Bw{constructor(e){a(this,"context"),a(this,"playerViews",new Map),this.context=e}setPlayerView(e,t,s){let o=this.playerViews.get(e);o||(o=new Dw(e,this.context),this.playerViews.set(e,o)),o.viewDevice=s,o.currentObject=t,o.removed=!1}getPlayerView(e){if(!!e){if(!this.context.connection.userIsInRoom(e)){this.playerViews.delete(e);return}return this.playerViews.get(e)}}removePlayerView(e,t){const s=this.playerViews.get(e);s?.viewDevice===t&&(gR&&console.log("REMOVE",e),s.removed=!0,this.playerViews.delete(e))}}new Em;const Pc=new Uint8Array(4);Pc[0]=255,Pc[1]=255,Pc[2]=255,Pc[3]=255;const fR=new Am(Pc,1,1,fd);function Sf(n,e=1){const t="alpha"in n,s=e*e,o=new Uint8Array(4*s),r=Math.floor(n.r*255),l=Math.floor(n.g*255),c=Math.floor(n.b*255);for(let d=0;d<s;d++){const u=d*4;o[u+0]=r,o[u+1]=l,o[u+2]=c,t?o[u+3]=Math.floor(n.alpha*255):o[u+3]=255}const h=new Am(o,e,e);return h.needsUpdate=!0,h}function yR(n,e,t,s=1,o=3){const r=s*o,l=[n,e,t],c=l.length,h=new Uint8Array(4*c*r),d=new oe;for(let p=0;p<o;p++){const g=Math.floor(p/o*c),f=W.clamp(g+1,0,c-1),y=l[g],v=l[f],b=p/o*c%1;d.lerpColors(y,v,b);const _=Math.floor(d.r*255),w=Math.floor(d.g*255),x=Math.floor(d.b*255);for(let k=0;k<s;k++){const M=(p*s+k)*4;h[M+0]=_,h[M+1]=w,h[M+2]=x,h[M+3]=255}}const u=new Am(h,s,o);return u.needsUpdate=!0,u}function pu(n,e){const t=n.elements;e||(e=[]),e.length=0;for(let s=0;s<16;s+=4){const o=t[s],r=t[s+1],l=t[s+2],c=t[s+3],h=new fe(o,r,l,c);e.push(h)}return e}const Cf=[],Fw=[];function vR(n,e){if(Cf.length===0)for(let t=0;t<27;t++)Cf.push(0);e||(e=Cf);for(let t=0;t<27;t++)Fw[t]=e[t];e=Fw,n.unity_SHAr={value:new fe(e[9],e[3],e[6],e[0])},n.unity_SHBr={value:new fe(e[12],e[15],e[18],e[21])},n.unity_SHAg={value:new fe(e[10],e[4],e[7],e[1])},n.unity_SHBg={value:new fe(e[13],e[16],e[19],e[22])},n.unity_SHAb={value:new fe(e[11],e[5],e[8],e[2])},n.unity_SHBb={value:new fe(e[14],e[17],e[20],e[23])},n.unity_SHC={value:new fe(e[24],e[25],e[26],1)}}class bR{constructor(e,t,s){a(this,"vertexShader"),a(this,"fragmentShader"),a(this,"technique"),this.vertexShader=e,this.fragmentShader=t,this.technique=s}}async function _R(n,e){if(!n)return console.error("Can not find technique: no shader data"),null;const t=n.programs[e],s=t.vertexShader,o=t.fragmentShader;if(s!==void 0&&o!==void 0){const r=n.shaders[s],l=n.shaders[o];if(r.uri&&l.uri||r.code&&l.code){if(!r.code&&r.uri&&await Uw(r),!l.code&&l.uri&&await Uw(l),!r.code||!l.code)return null;const c=n.techniques[e];return new bR(r.code,l.code,c)}}return console.error("Shader technique not found",e),null}async function Uw(n){const e=n.uri;if(e)if(e.endsWith(".glsl")){const t=await new Em().loadAsync(e);n.code=t.toString()}else n.code=wR(n.uri)}function wR(n){return decodeURIComponent(Array.prototype.map.call(atob(n),function(e){return"%"+("00"+e.charCodeAt(0).toString(16)).slice(-2)}).join(""))}const Ps=C("debugenvlight");var Ga=(n=>(n[n.Skybox=0]="Skybox",n[n.Trilight=1]="Trilight",n[n.Flat=3]="Flat",n[n.Custom=4]="Custom",n))(Ga||{}),mu=(n=>(n[n.Skybox=0]="Skybox",n[n.Custom=1]="Custom",n))(mu||{});class zw{constructor(e){a(this,"context"),a(this,"_currentLightSettingsId"),a(this,"_sceneLightSettings"),a(this,"_timevec4",new fe),a(this,"__currentReflectionId",null),a(this,"_lighting",{}),this.context=e,this.context.pre_update_callbacks.push(this.preUpdate.bind(this))}preUpdate(){const e=this.context.time;this._timevec4.x=e.time,this._timevec4.y=Math.sin(e.time),this._timevec4.z=Math.cos(e.time),this._timevec4.w=e.deltaTime}get timeVec4(){return this._timevec4}get environmentIntensity(){if(!this._sceneLightSettings||!this._currentLightSettingsId)return 1;const e=this._sceneLightSettings.get(this._currentLightSettingsId);return e?e.ambientIntensity:1}get sceneLightSettings(){var e;return(e=this._sceneLightSettings)==null?void 0:e.values()}enable(e){var t;e instanceof ce&&(e=e.url);const s=(t=this._sceneLightSettings)==null?void 0:t.get(e);return s?(Ps&&console.log("Enable scene light settings",e,s),e!==this._currentLightSettingsId&&this._currentLightSettingsId&&this.disable(this._currentLightSettingsId),this._currentLightSettingsId=e,s.enabled=!0,!0):(Ps&&console.warn("No light settings found for",e),!1)}disable(e){var t;if(e instanceof ce&&(e=e.url),e==null)return!1;const s=(t=this._sceneLightSettings)==null?void 0:t.get(e);return s?(Ps&&console.log("Disable scene light settings",e,s),s.enabled=!1,!0):!1}disableCurrent(){if(this._currentLightSettingsId){const e=this._currentLightSettingsId;return this.disable(this._currentLightSettingsId),e}return null}internalRegisterSceneLightSettings(e){const t=e.sourceId;if(!t){console.error("Missing source id for scene light settings, can not register:",e);return}Ps&&console.log("Register "+e?.sourceId+" lighting",e),this._sceneLightSettings||(this._sceneLightSettings=new Map),this._sceneLightSettings.set(t,e)}internalUnregisterSceneLightSettings(e){const t=e.sourceId;if(!t){console.error("Missing source id for scene light settings, can not unregister:",e);return}Ps&&console.log("Unregister "+e?.sourceId+" lighting",e),this._sceneLightSettings&&this._sceneLightSettings.delete(t)}internalRegisterReflection(e,t){Ps&&console.log("Register reflection",e,t);const s=new Nw(this.context,t,1);this._lighting[e]=s}internalGetReflection(e){return this._lighting[e]}internalEnableReflection(e){var t;this.__currentReflectionId=e;const s=(t=this._sceneLightSettings)==null?void 0:t.get(e);switch(Ps&&console.log("Enable reflection",e,s?Ga[s.ambientMode]:"Unknown ambient mode",s),s?.ambientMode){case 0:case 4:const o=this.internalGetReflection(e);if(o&&o.Source){Ps&&console.log("Setting environment reflection",o);const r=this.context.scene,l=o.Source;l.mapping=kn,r.environment=l;return}else Ps&&console.warn("Could not find reflection for source",e);break}if(s?.environmentReflectionSource===1)switch(s?.ambientMode){case 1:if(s.ambientTrilight){const o=s.ambientTrilight,r=yR(o[0],o[1],o[2],64,64);r.colorSpace=Mn,r.mapping=kn,this.context.scene.environment=r}else console.error("Missing ambient trilight",s.sourceId);return;case 3:if(s.ambientLight){const o=Sf(s.ambientLight,64);o.colorSpace=Mn,o.mapping=kn,this.context.scene.environment=o}else console.error("Missing ambientlight",s.sourceId);return;default:return}}internalDisableReflection(e){if(e&&e!==this.__currentReflectionId){Ps&&console.log("Not disabling reflection for",e,"because it is not the current light settings id",this.__currentReflectionId);return}Ps&&console.log("Disable reflection",e);const t=this.context.scene;t.environment=null}}class Nw{constructor(e,t,s=1){a(this,"_source"),this._source=t,t.mapping=kn}get Source(){return this._source}}const Ww=C("timescale");let Pf=1;typeof Ww=="number"&&(Pf=Ww);class Vw{constructor(){a(this,"_time",0),a(this,"_deltaTime",0),a(this,"_deltaTimeUnscaled",0),a(this,"timeScale",1),a(this,"_frame",0),a(this,"clock",new $C),a(this,"_smoothedFps",0),a(this,"_smoothedDeltaTime",0),a(this,"_fpsSamples",[]),a(this,"_fpsSampleIndex",0),typeof Pf=="number"&&(this.timeScale=Pf)}get time(){return this._time}set time(e){this._time=e}get deltaTime(){return this._deltaTime}set deltaTime(e){this._deltaTime=e}get deltaTimeUnscaled(){return this._deltaTimeUnscaled}get frame(){return this._frame}set frame(e){this._frame=e}get frameCount(){return this.frame}get realtimeSinceStartup(){return this.clock.elapsedTime}get fps(){return 1/this.deltaTime}get smoothedFps(){return this._smoothedFps}get smoothedDeltaTime(){return 1/this._smoothedFps}update(){this.deltaTime=this.clock.getDelta(),this.deltaTime=Math.min(.1,this.deltaTime),this._deltaTimeUnscaled=this.deltaTime,this.deltaTime<=0&&(this.deltaTime=1e-12),this.deltaTime*=this.timeScale,this.frame+=1,this.time+=this.deltaTime,this._fpsSamples.length<60?this._fpsSamples.push(this.deltaTime):this._fpsSamples[this._fpsSampleIndex++%60]=this.deltaTime;let e=0;for(let t=0;t<this._fpsSamples.length;t++)e+=this._fpsSamples[t];this._smoothedDeltaTime=e/this._fpsSamples.length,this._smoothedFps=1/this._smoothedDeltaTime}}let $w=!1;function Hw(n){$w||($w=!0,xR(),SR())}Hw();function xR(){const n=`
|
|
221
|
+
float startCompression = 0.8;
|
|
222
|
+
float desaturation = 0.5;
|
|
223
|
+
// Patched tonemapping function
|
|
224
|
+
vec3 NeutralToneMapping( vec3 color ) {
|
|
225
|
+
color *= toneMappingExposure;
|
|
226
|
+
|
|
227
|
+
float d = 1. - startCompression;
|
|
228
|
+
// float peak = dot(color, vec3(0.299, 0.587, 0.114));
|
|
229
|
+
float peak = max(color.r, max(color.g, color.b));
|
|
230
|
+
if (peak < startCompression) return color;
|
|
231
|
+
float newPeak = 1. - d * d / (peak + d - startCompression);
|
|
232
|
+
float invPeak = 1. / peak;
|
|
233
|
+
|
|
234
|
+
float extraBrightness = dot(color * (1. - startCompression * invPeak), vec3(1, 1, 1));
|
|
235
|
+
|
|
236
|
+
color *= newPeak * invPeak;
|
|
237
|
+
float g = 1. - 3. / (desaturation * extraBrightness + 3.);
|
|
238
|
+
return mix(color, vec3(1, 1, 1), g);
|
|
239
|
+
}
|
|
240
|
+
`,e="vec3 NeutralToneMapping( vec3 color ) {",t=`return mix( color, vec3( newPeak ), g );
|
|
241
|
+
}`,s=qt.tonemapping_pars_fragment.indexOf(e),o=qt.tonemapping_pars_fragment.indexOf(t,s);if(s>=0&&o>=0){const r=qt.tonemapping_pars_fragment.substring(s,o+t.length);qt.tonemapping_pars_fragment=qt.tonemapping_pars_fragment.replace(r,n)}else F()&&console.error("Couldn't find NeutralToneMapping in ShaderChunk.tonemapping_pars_fragment")}function SR(){const n=`
|
|
242
|
+
// 0: Default, 1: Golden, 2: Punchy
|
|
243
|
+
#define AGX_LOOK 0
|
|
244
|
+
|
|
245
|
+
vec3 userSlope = vec3(1.0);
|
|
246
|
+
vec3 userOffset = vec3(0.0);
|
|
247
|
+
vec3 userPower = vec3(1.0);
|
|
248
|
+
float userSaturation = 1.0;
|
|
249
|
+
|
|
250
|
+
// Mean error^2: 3.6705141e-06
|
|
251
|
+
vec3 _agxDefaultContrastApprox(vec3 x) {
|
|
252
|
+
vec3 x2 = x * x;
|
|
253
|
+
vec3 x4 = x2 * x2;
|
|
254
|
+
|
|
255
|
+
return + 15.5 * x4 * x2
|
|
256
|
+
- 40.14 * x4 * x
|
|
257
|
+
+ 31.96 * x4
|
|
258
|
+
- 6.868 * x2 * x
|
|
259
|
+
+ 0.4298 * x2
|
|
260
|
+
+ 0.1191 * x
|
|
261
|
+
- 0.00232;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
vec3 _agx(vec3 val) {
|
|
265
|
+
const mat3 agx_mat = mat3(
|
|
266
|
+
0.842479062253094, 0.0423282422610123, 0.0423756549057051,
|
|
267
|
+
0.0784335999999992, 0.878468636469772, 0.0784336,
|
|
268
|
+
0.0792237451477643, 0.0791661274605434, 0.879142973793104);
|
|
269
|
+
|
|
270
|
+
const float min_ev = -12.47393;
|
|
271
|
+
const float max_ev = 4.026069;
|
|
272
|
+
|
|
273
|
+
// val = pow(val, vec3(2.2));
|
|
274
|
+
|
|
275
|
+
// Input transform (inset)
|
|
276
|
+
val = agx_mat * val;
|
|
277
|
+
|
|
278
|
+
// Log2 space encoding
|
|
279
|
+
val = clamp(log2(val), min_ev, max_ev);
|
|
280
|
+
val = (val - min_ev) / (max_ev - min_ev);
|
|
281
|
+
|
|
282
|
+
// Apply sigmoid function approximation
|
|
283
|
+
val = _agxDefaultContrastApprox(val);
|
|
284
|
+
|
|
285
|
+
return val;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
vec3 _agxEotf(vec3 val) {
|
|
289
|
+
const mat3 agx_mat_inv = mat3(
|
|
290
|
+
1.19687900512017, -0.0528968517574562, -0.0529716355144438,
|
|
291
|
+
-0.0980208811401368, 1.15190312990417, -0.0980434501171241,
|
|
292
|
+
-0.0990297440797205, -0.0989611768448433, 1.15107367264116);
|
|
293
|
+
|
|
294
|
+
// Inverse input transform (outset)
|
|
295
|
+
val = agx_mat_inv * val;
|
|
296
|
+
|
|
297
|
+
// sRGB IEC 61966-2-1 2.2 Exponent Reference EOTF Display
|
|
298
|
+
// NOTE: We're linearizing the output here. Comment/adjust when
|
|
299
|
+
// *not* using a sRGB render target
|
|
300
|
+
val = pow(val, vec3(2.2));
|
|
301
|
+
|
|
302
|
+
return val;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
vec3 _agxLook(vec3 val) {
|
|
306
|
+
const vec3 lw = vec3(0.2126, 0.7152, 0.0722);
|
|
307
|
+
float luma = dot(val, lw);
|
|
308
|
+
|
|
309
|
+
// Default
|
|
310
|
+
vec3 offset = vec3(0.0);
|
|
311
|
+
vec3 slope = vec3(1.0);
|
|
312
|
+
vec3 power = vec3(1.0);
|
|
313
|
+
float sat = 1.0;
|
|
314
|
+
|
|
315
|
+
#if AGX_LOOK == 1
|
|
316
|
+
// Golden
|
|
317
|
+
slope = vec3(1.0, 0.9, 0.5);
|
|
318
|
+
power = vec3(0.8);
|
|
319
|
+
sat = 0.8;
|
|
320
|
+
#elif AGX_LOOK == 2
|
|
321
|
+
// Punchy
|
|
322
|
+
slope = vec3(1.0);
|
|
323
|
+
power = vec3(1.35, 1.35, 1.35);
|
|
324
|
+
sat = 1.4;
|
|
325
|
+
#endif
|
|
326
|
+
|
|
327
|
+
// Needle
|
|
328
|
+
slope = vec3(1.05);
|
|
329
|
+
power = vec3(1.10, 1.10, 1.10);
|
|
330
|
+
sat = 1.15;
|
|
331
|
+
|
|
332
|
+
// User
|
|
333
|
+
// slope = userSlope;
|
|
334
|
+
// offset = userOffset;
|
|
335
|
+
// power = userPower;
|
|
336
|
+
// sat = userSaturation;
|
|
337
|
+
|
|
338
|
+
// ASC CDL
|
|
339
|
+
val = pow(val * slope + offset, power);
|
|
340
|
+
return luma + sat * (val - luma);
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
|
|
344
|
+
vec3 AgXToneMapping( vec3 color ) {
|
|
345
|
+
// apply AGX
|
|
346
|
+
color *= toneMappingExposure;
|
|
347
|
+
color = _agx(color);
|
|
348
|
+
color = _agxLook(color); // Optional
|
|
349
|
+
color = _agxEotf(color);
|
|
350
|
+
return color;
|
|
351
|
+
`,e="vec3 AgXToneMapping( vec3 color ) {",t="return color;",s=qt.tonemapping_pars_fragment.indexOf(e),o=qt.tonemapping_pars_fragment.indexOf(t,s);if(s>=0&&o>=0){const r=qt.tonemapping_pars_fragment.substring(s,o+t.length);qt.tonemapping_pars_fragment=qt.tonemapping_pars_fragment.replace(r,n)}else F()&&console.error("Couldn't find AgXToneMapping in ShaderChunk.tonemapping_pars_fragment")}function Gw(n){if(typeof n=="string")switch(n=n.toLowerCase(),n){case"none":return bd;case"neutral":return Pa;case"aces":return vd;case"agx":return yd;case"khronos_neutral":return Pa;default:console.warn("[PostProcessing] Unknown tone mapping mode",n);return}}function Mt(n){const e=document.createElement("span");return e.style.maxWidth="48px",e.style.maxHeight="48px",e.style.overflow="hidden",e.classList.add("material-symbols-outlined","notranslate"),e.setAttribute("translate","no"),e.innerText=n,e}function qw(n){var e;return((e=n.classList)==null?void 0:e.contains("material-symbols-outlined"))||!1}const gu=new Map;async function Of(n){const e="Material Symbols Outlined";if(document.fonts.check(`1em '${e}'`)||(console.log("Font not loaded yet"),await document.fonts.ready),gu.has(n))return gu.get(n);const t=document.createElement("canvas"),s=48;t.width=s,t.height=s;const o=t.getContext("2d");if(o){o.font=`${s}px '${e}'`,o.fillStyle="black",o.fillText(n,0,s);const r=t.toDataURL(),l=new je;return l.name=n+" icon",l.image=new Image,l.image.src=r,l.needsUpdate=!0,gu.set(n,l),l}return gu.set(n,null),null}const Xw=class vv{constructor(){a(this,"_fullscreenButton"),a(this,"_muteButton"),a(this,"_qrButton"),a(this,"_customQRButtonUrl")}static get instance(){return this.getOrCreate()}static getOrCreate(){return this._instance||(this._instance=new vv),this._instance}static create(){return new vv}get fullscreenButton(){return this._fullscreenButton}createFullscreenButton(e){if(this._fullscreenButton)return this._fullscreenButton;if(!document.fullscreenEnabled)return F()&&console.warn("NeedleMenu: Fullscreen button could not be created, device doesn't support the Fullscreen API"),null;const t=document.createElement("button");this._fullscreenButton=t,t.classList.add("fullscreen-button"),t.title="Click to enter fullscreen mode";const s=Mt("fullscreen"),o=Mt("fullscreen_exit");return t.appendChild(s),t.onclick=()=>{document.fullscreenElement?document.exitFullscreen():"webkitRequestFullscreen"in e.domElement&&typeof e.domElement.webkitRequestFullscreen=="function"?e.domElement.webkitRequestFullscreen():"requestFullscreen"in e.domElement&&e.domElement.requestFullscreen()},document.addEventListener("fullscreenchange",()=>{document.fullscreenElement?(s.remove(),t.appendChild(o),t.title="Click to enter fullscreen mode"):(o.remove(),t.appendChild(s),t.title="Click to exit fullscreen mode")}),globalThis.addEventListener("needle-xrsession-start",()=>{t.style.display="none"}),globalThis.addEventListener("needle-xrsession-end",()=>{t.style.display=""}),t}get muteButton(){return this._muteButton}createMuteButton(e){if(this._muteButton)return this._muteButton;const t=document.createElement("button");this._muteButton=t,t.classList.add("mute-button"),t.title="Click to mute/unmute";const s=Mt("volume_off"),o=Mt("volume_up");return e.application.muted?t.appendChild(s):t.appendChild(o),t.onclick=()=>{e.application.muted?(s.remove(),t.appendChild(o),e.application.muted=!1):(o.remove(),t.appendChild(s),e.application.muted=!0)},t}get qrButton(){return this._qrButton}set qrButtonUrl(e){try{new URL(e),this._customQRButtonUrl=e}catch{console.warn(`[Needle] QR code button URL is not a valid URL '${e}'`)}}get qrButtonUrl(){return this._customQRButtonUrl||window.location.href}createQRCode(){if(this._qrButton)return this._qrButton;const e=this,t=document.createElement("button");this._qrButton=t,t.innerText="QR Code",t.prepend(Mt("qr_code")),t.title="Scan this QR code with your phone to open this page",this.hideElementDuringXRSession(t);const s=document.createElement("div");s.style.cssText=`
|
|
352
|
+
position: fixed;
|
|
353
|
+
display: inline-block;
|
|
354
|
+
padding: 0.5rem;
|
|
355
|
+
background-color: white;
|
|
356
|
+
border-radius: 0.4rem;
|
|
357
|
+
cursor: pointer;
|
|
358
|
+
z-index: 1000;
|
|
359
|
+
box-shadow: 0 0 12px rgba(0, 0, 0, 0.2);
|
|
360
|
+
`;const o=document.createElement("div");o.classList.add("qr-code-container"),s.appendChild(o),t.addEventListener("click",()=>{if(s.parentNode)return l();F()&&window.location.href.includes("://localhost")&&be("To access your website from another device in the same local network you have to use the IP address instead of localhost. The IP address is logged in your development server console when you start the server."),r()});async function r(){await c(),document.body.appendChild(s);const h=o.getBoundingClientRect(),d=t.getBoundingClientRect();s.style.left=d.left+d.width*.5-h.width*.5+"px";const u=d.top<h.height,p="1.3rem";u?s.style.top=`calc(${d.bottom}px + ${s.style.padding} + 0.0rem)`:s.style.top=`calc(${d.top-h.height}px - ${s.style.padding} - ${p})`,s.style.opacity="0",s.style.pointerEvents="all",s.style.transition="opacity 0.2s ease-in-out",setTimeout(()=>{s.style.opacity="1",window.addEventListener("click",l,{once:!0})}),window.addEventListener("resize",l),window.addEventListener("scroll",l),document.fullscreenElement?document.fullscreenElement.appendChild(s):document.body.appendChild(s)}function l(){s.style.pointerEvents="none",s.style.transition="opacity 0.2s",s.style.opacity="0",setTimeout(()=>{var h;return(h=s.parentNode)==null?void 0:h.removeChild(s)},500),window.removeEventListener("click",l),window.removeEventListener("resize",l),window.removeEventListener("scroll",l)}async function c(){const h=await gb({text:e.qrButtonUrl,width:200,height:200});o.innerHTML="",o.appendChild(h)}return t.addEventListener("pointerenter",()=>{c()},{once:!0}),t}hideElementDuringXRSession(e){Fd(t=>{e["previous-display"]=e.style.display,e.style.display="none"}),Cg(t=>{e["previous-display"]!=null&&(e.style.display=e["previous-display"])})}};a(Xw,"_instance");let Po=Xw;function fu(n,e){const t=e?.element||document.head,s=Array.from(t.querySelectorAll(`link[rel=stylesheet][href*='${n}']`));if(s.length<=0){const o=document.createElement("link");o.href=n,o.rel="stylesheet",t.appendChild(o),s.push(o)}if(e!=null&&e.loadedCallback)for(let o=0;o<s.length;o++)e!=null&&e.loadedCallback&&s[o].addEventListener("load",e.loadedCallback)}function Qw(){fu("https://fonts.googleapis.com/css2?family=Roboto+Flex:opsz,wght@8..144,100..1000&display=swap")}const kf="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0&display=block",yu="needle-logo-element";class Yw extends HTMLElement{constructor(){super(),a(this,"_root"),a(this,"wrapper"),a(this,"logoElement",document.createElement("img")),a(this,"textElement",document.createElement("span")),this._root=this.attachShadow({mode:"closed"});const e=document.createElement("template");e.innerHTML=`<style>
|
|
361
|
+
:host {
|
|
362
|
+
position: relative;
|
|
363
|
+
min-width: fit-content;
|
|
364
|
+
/* height: 100%; can not have height 100% because of align-items: stretch; in the parent */
|
|
365
|
+
display: flex;
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
.wrapper {
|
|
369
|
+
position: relative;
|
|
370
|
+
display: grid;
|
|
371
|
+
grid-template-columns: auto auto;
|
|
372
|
+
padding: .1rem;
|
|
373
|
+
}
|
|
374
|
+
.wrapper:hover {
|
|
375
|
+
cursor: pointer;
|
|
376
|
+
}
|
|
377
|
+
img {
|
|
378
|
+
width: 95px;
|
|
379
|
+
height: 100%;
|
|
380
|
+
align-self: end;
|
|
381
|
+
margin-left: 0.6rem;
|
|
382
|
+
}
|
|
383
|
+
span {
|
|
384
|
+
font-size: 1rem;
|
|
385
|
+
white-space: nowrap;
|
|
386
|
+
}
|
|
387
|
+
</style>
|
|
388
|
+
<div class="wrapper">
|
|
389
|
+
<img class="logo" src=${BO} />
|
|
390
|
+
</div>
|
|
391
|
+
`,this._root.appendChild(e.content.cloneNode(!0)),this.wrapper=this._root.querySelector(".wrapper"),this._root.appendChild(this.wrapper),this.addEventListener("click",()=>{globalThis.open("https://needle.tools","_blank")}),this.wrapper.setAttribute("title","Made with Needle Engine")}static get elementName(){return yu}static create(){return document.createElement(yu)}setLogoVisible(e){this.logoElement.style.display=e?"block":"none"}}customElements.get(yu)||customElements.define(yu,Yw);const Mf=C("debugspatialmenu");class CR{constructor(e,t){a(this,"_context"),a(this,"needleMenu"),a(this,"htmlButtonsMap",new Map),a(this,"enabled",!0),a(this,"userRequestedMenu",!1),a(this,"uiisDirty",!1),a(this,"_showNeedleLogo"),a(this,"_wasInXR",!1),a(this,"preRender",()=>{var r;if(!this.enabled){(r=this.menu)==null||r.removeFromParent();return}Mf&&X.isDesktop()&&this.updateMenu();const l=this._context.xr;if(!(l!=null&&l.running)){this._wasInXR&&(this._wasInXR=!1,this.onExitXR());return}this._wasInXR||(this._wasInXR=!0,this.onEnterXR()),this.updateMenu()}),a(this,"_menuTarget",new E),a(this,"positionFilter",new og(90,.5)),a(this,"familyName","Needle Spatial Menu"),a(this,"menu"),a(this,"_poweredByNeedleElement");var s;this._context=e,this._context.pre_render_callbacks.push(this.preRender),this.needleMenu=t;const o=(s=this.needleMenu.shadowRoot)==null?void 0:s.querySelector(".options");o?new MutationObserver(r=>{if(this.enabled&&!(this._context.isInXR==!1&&!Mf))for(const l of r)l.type==="childList"&&(l.addedNodes.forEach(c=>{this.createButtonFromHTMLNode(c)}),l.removedNodes.forEach(c=>{const h=c,d=this.htmlButtonsMap.get(h);d&&(this.htmlButtonsMap.delete(h),d.remove(),Re.update())}))}).observe(o,{childList:!0}):console.error("Could not find options container in needle menu")}setEnabled(e){var t;this.enabled=e,e||(t=this.menu)==null||t.removeFromParent()}setDisplay(e){return this.enabled?(this.userRequestedMenu=e,!0):!1}onDestroy(){const e=this._context.pre_render_callbacks.indexOf(this.preRender);e>-1&&this._context.pre_render_callbacks.splice(e,1)}markDirty(){this.uiisDirty=!0}showNeedleLogo(e){this._showNeedleLogo=e}onEnterXR(){var e;const t=(e=this.needleMenu.shadowRoot)==null?void 0:e.querySelector(".options");t&&t.childNodes.forEach(s=>{this.createButtonFromHTMLNode(s)})}onExitXR(){var e;(e=this.menu)==null||e.removeFromParent()}createButtonFromHTMLNode(e){const t=this.getMenu(),s=this.htmlButtonsMap.get(e);if(s){s.add();return}if(e instanceof HTMLButtonElement){const o=this.createButton(t,e);this.htmlButtonsMap.set(e,o),o.add()}else e instanceof HTMLSlotElement&&e.assignedNodes().forEach(o=>{this.createButtonFromHTMLNode(o)})}updateMenu(){var e,t;const s=this.getMenu();this.handleNeedleWatermark(),this._context.scene.add(s);const o=this._context.mainCamera,r=this._context.xr,l=r?.rigScale||1;if(o){const c=o.worldPosition,h=o.worldForward.multiplyScalar(-1),d=h.y>.6,u=h.y>.4,p=(s.visible?u:d)||this.userRequestedMenu,g=!s.visible&&p;s.visible=p||X.isDesktop()&&Mf,h.multiplyScalar(3*l),c.add(h),g&&(s.position.copy(this._menuTarget.position),s.position.y+=.25,this._menuTarget.position.copy(s.position),this.positionFilter.reset(s.position),s.quaternion.copy(this._menuTarget.quaternion),this.markDirty());const f=this._menuTarget.position.distanceTo(c);(g||f>1.5*l)&&(this.ensureRenderOnTop(this.menu),this._menuTarget.position.copy(c),this._context.scene.add(this._menuTarget),Yl(this._menuTarget,this._context.mainCamera,!0,!0),this._menuTarget.removeFromParent()),this.positionFilter.filter(this._menuTarget.position,s.position,this._context.time.time),(e=this.menu)==null||e.quaternion.slerp(this._menuTarget.quaternion,this._context.time.deltaTime*5),(t=this.menu)==null||t.scale.setScalar(l)}this.uiisDirty&&(this.uiisDirty=!1,Re.update())}ensureRenderOnTop(e,t=0){e instanceof G&&(e.material.depthTest=!1,e.material.depthWrite=!1),e.renderOrder=1e3+t*2;for(const s of e.children)this.ensureRenderOnTop(s,t+1)}get isVisible(){var e;return(e=this.menu)==null?void 0:e.visible}getMenu(){if(this.menu)return this.menu;this.ensureFont(),this.menu=new Re.Block({boxSizing:"border-box",fontFamily:this.familyName,height:"auto",fontSize:.1,color:0,lineHeight:1,backgroundColor:16777215,backgroundOpacity:.55,borderRadius:1,whiteSpace:"pre-wrap",flexDirection:"row",alignItems:"center",padding:new fe(0,.05,0,.05),borderColor:0,borderOpacity:.05,borderWidth:.005});const e=R.get("ObjectRaycaster");return e&&Mr(this.menu,new e),this.menu}handleNeedleWatermark(){var e;if(!this._poweredByNeedleElement){this._poweredByNeedleElement=new Re.Block({width:"auto",height:"auto",fontSize:.05,whiteSpace:"pre-wrap",flexDirection:"row",flexWrap:"wrap",justifyContent:"center",margin:.02,borderRadius:.02,padding:.02,backgroundColor:16777215,backgroundOpacity:1}),this._poweredByNeedleElement["needle:use_eventsystem"]=!0;const t=new Kw(this._context,()=>globalThis.open("https://needle.tools","_self"));Mr(this._poweredByNeedleElement,t);const s=new Re.Text({textContent:"Powered by",width:"auto",height:"auto"}),o=new Re.Text({textContent:"needle",width:"auto",height:"auto",fontSize:.07,margin:new fe(0,0,0,.02)});this._poweredByNeedleElement.add(s),this._poweredByNeedleElement.add(o),(e=this.menu)==null||e.add(this._poweredByNeedleElement),this.markDirty(),new Sa().load("./include/needle/poweredbyneedle.webp",r=>{var l;t.allowModifyUI=!1,s.removeFromParent(),o.removeFromParent();const c=r.image.width/r.image.height;(l=this._poweredByNeedleElement)==null||l.set({backgroundImage:r,backgroundOpacity:1,width:.1*c,height:.1}),this.markDirty()})}if(this.menu){const t=this.menu.children.indexOf(this._poweredByNeedleElement);if(!this._showNeedleLogo&&Zs())t>=0&&(this._poweredByNeedleElement.removeFromParent(),this.markDirty());else{this._poweredByNeedleElement.visible=!0,this.menu.add(this._poweredByNeedleElement);const s=this.menu.children.indexOf(this._poweredByNeedleElement);t!==s&&this.markDirty()}}}ensureFont(){let e=Re.FontLibrary.getFontFamily(this.familyName);if(!e){e=Re.FontLibrary.addFontFamily(this.familyName);const t=e.addVariant("normal","normal","./include/needle/arial-msdf.json","./include/needle/arial.png");t?.addEventListener("ready",()=>{this.markDirty()})}}createButton(e,t){const s=new Re.Block({width:"auto",height:"auto",whiteSpace:"pre-wrap",flexDirection:"row",flexWrap:"wrap",justifyContent:"center",backgroundColor:16777215,backgroundOpacity:0,padding:.02,margin:.01,borderRadius:.02,cursor:"pointer",fontSize:.05}),o=new Re.Text({textContent:"",width:"auto",justifyContent:"center",alignItems:"center",backgroundOpacity:0,backgroundColor:16777215,fontFamily:this.familyName,color:0,borderRadius:.02,padding:.01});s.add(o),s["needle:use_eventsystem"]=!0;const r=new Kw(this._context,()=>t.click());return Mr(s,r),new PR(this,e,t,s,o)}}class PR{constructor(e,t,s,o,r){a(this,"menu"),a(this,"root"),a(this,"htmlbutton"),a(this,"spatialContainer"),a(this,"spatialText"),a(this,"spatialIcon"),a(this,"_lastText",""),a(this,"_lastTexture"),this.menu=e,this.root=t,this.htmlbutton=s,this.spatialContainer=o,this.spatialText=r,new MutationObserver(l=>{for(const c of l)c.type==="attributes"?c.attributeName==="style"&&this.updateVisible():c.type==="childList"&&this.updateText()}).observe(s,{attributes:!0,childList:!0}),this.updateText()}add(){this.spatialContainer.parent!=this.root&&(this.root.add(this.spatialContainer),this.menu.markDirty(),this.updateVisible(),this.updateText())}remove(){this.spatialContainer.parent&&(this.spatialContainer.removeFromParent(),this.menu.markDirty())}updateVisible(){const e=this.spatialContainer.visible;this.spatialContainer.visible=this.htmlbutton.style.display!=="none",e!==this.spatialContainer.visible&&this.menu.markDirty()}updateText(){let e="",t="";this.htmlbutton.childNodes.forEach(s=>{s.nodeType===Node.TEXT_NODE?e+=s.textContent:s instanceof HTMLElement&&qw(s)&&s.textContent&&(t=s.textContent)}),this._lastText!==e&&(this._lastText=e,this.spatialText.name=e,this.spatialText.set({textContent:e}),this.menu.markDirty()),e.length<=0?this.spatialText.parent&&(this.spatialText.removeFromParent(),this.menu.markDirty()):this.spatialText.parent||(this.spatialContainer.add(this.spatialText),this.menu.markDirty()),t&&this.createIcon(t)}async createIcon(e){var t;if(!this.spatialIcon){const o=await Of(e);if(o&&!this.spatialIcon){const r=new Re.Block({width:.08,height:.08,backgroundColor:16777215,backgroundImage:o,backgroundOpacity:1,margin:new fe(0,.005,0,0)});this.spatialIcon=r,this.spatialContainer.add(r),this.menu.markDirty()}}if(e!=this._lastTexture){this._lastTexture=e;const o=await Of(e);o&&((t=this.spatialIcon)==null||t.set({backgroundImage:o}),this.menu.markDirty())}const s=this.spatialContainer.children.indexOf(this.spatialIcon);s>0&&(this.spatialContainer.children.splice(s,1),this.spatialContainer.children.unshift(this.spatialIcon),this.menu.markDirty())}}class Kw{constructor(e,t){a(this,"isComponent",!0),a(this,"enabled",!0),a(this,"gameObject"),a(this,"allowModifyUI",!0),a(this,"context"),a(this,"onclick"),this.context=e,this.onclick=t}get activeAndEnabled(){return!0}__internalAwake(){}__internalEnable(){}__internalDisable(){}__internalStart(){}onEnable(){}onDisable(){}get element(){return this.gameObject}onPointerEnter(){this.context.input.setCursor("pointer"),this.allowModifyUI&&(this.element.set({backgroundOpacity:1}),Re.update())}onPointerExit(){this.context.input.unsetCursor("pointer"),this.allowModifyUI&&(this.element.set({backgroundOpacity:0}),Re.update())}onPointerDown(e){e.use()}onPointerUp(e){e.use()}onPointerClick(e){e.use(),this.onclick()}}const Lr="needle-menu",Oc=C("debugmenu"),Zw=C("debugnoncommercial");let OR=class{constructor(n){a(this,"_context"),a(this,"_menu"),a(this,"_spatialMenu"),a(this,"onPostMessage",e=>{if(e.origin===globalThis.location.origin&&typeof e.data=="object"){const t=e.data,s=t.type;if(s==="needle:menu"){const o=t.button;if(o){if(!o.label)return console.error("NeedleMenu: buttoninfo.label is required");if(!o.onclick)return console.error("NeedleMenu: buttoninfo.onclick is required");const r=document.createElement("button");if(r.textContent=o.label,o.icon){const l=Mt(o.icon);r.prepend(l)}o.priority&&r.setAttribute("priority",o.priority.toString()),r.onclick=()=>{if(o.onclick){const l=o.onclick.startsWith("http")||o.onclick.startsWith("www."),c=o.target||"_blank";l?globalThis.open(o.onclick,c):console.error("NeedleMenu: onclick is not a valid link",o.onclick)}},this._menu.appendChild(r)}else Oc&&console.error("NeedleMenu: unknown postMessage event",t)}else Oc&&console.warn("NeedleMenu: unknown postMessage type",s,t)}}),a(this,"onStartXR",e=>{e.session.isScreenBasedAR&&(this._menu.previousParent=this._menu.parentNode,this._context.arOverlayElement.appendChild(this._menu),e.session.session.addEventListener("end",this.onExitXR),this._menu.closeFoldout())}),a(this,"onExitXR",()=>{this._menu.previousParent&&(this._menu.previousParent.appendChild(this._menu),delete this._menu.previousParent)}),a(this,"_muteButton"),a(this,"_fullscreenButton"),this._menu=Jw.getOrCreate(n.domElement,n),this._context=n,this._spatialMenu=new CR(n,this._menu),window.addEventListener("message",this.onPostMessage),Fd(this.onStartXR)}onDestroy(){window.removeEventListener("message",this.onPostMessage),this._menu.remove(),this._spatialMenu.onDestroy()}setPosition(n){this._menu.setPosition(n)}setVisible(n){this._menu.setVisible(n)}showNeedleLogo(n){var e;this._menu.showNeedleLogo(n),(e=this._spatialMenu)==null||e.showNeedleLogo(n)}get logoIsVisible(){return this._menu.logoIsVisible}showSpatialMenu(n){this._spatialMenu.setEnabled(n)}setSpatialMenuVisible(n){this._spatialMenu.setDisplay(n)}get spatialMenuIsVisible(){return this._spatialMenu.isVisible}showQRCodeButton(n){if(n==="desktop-only"&&(n=!X.isMobileDevice()),n){const e=Po.getOrCreate().createQRCode();return e.style.display="",this._menu.appendChild(e),e}else{const e=Po.getOrCreate().qrButton;return e&&(e.style.display="none"),e??null}}showAudioPlaybackOption(n){var e;if(!n){(e=this._muteButton)==null||e.remove();return}this._muteButton=Po.getOrCreate().createMuteButton(this._context),this._muteButton.setAttribute("priority","100"),this._menu.appendChild(this._muteButton)}showFullscreenOption(n){var e;if(!n){(e=this._fullscreenButton)==null||e.remove();return}this._fullscreenButton=Po.getOrCreate().createFullscreenButton(this._context),this._fullscreenButton&&(this._fullscreenButton.setAttribute("priority","150"),this._menu.appendChild(this._fullscreenButton))}appendChild(n){return this._menu.appendChild(n)}};var vu;const kR=class fC extends HTMLElement{constructor(){var e,t,s,o,r,l;super(),a(this,"_domElement",null),a(this,"_context",null),a(this,"_sizeChangeInterval"),Us(this,vu,v=>{if(!v.defaultPrevented&&v.target==this._domElement&&v instanceof PointerEvent&&v.button===0&&this.root.classList.contains("open")){const b=this.foldout.getBoundingClientRect(),_=v;_.clientX>b.left&&_.clientX<b.right&&_.clientY>b.top&&_.clientY<b.bottom||this.root.classList.toggle("open",!1)}}),a(this,"_userRequestedLogoVisible"),a(this,"_userRequestedMenuVisible"),a(this,"root"),a(this,"wrapper"),a(this,"options"),a(this,"logoContainer"),a(this,"compactMenuButton"),a(this,"foldout"),a(this,"_isHandlingChange",!1),a(this,"_didSort",new Map),a(this,"_lastAvailableWidthChange",0),a(this,"_timeoutHandle",0),a(this,"handleSizeChange",(v,b)=>{if(!this._domElement)return;const _=this._domElement.clientWidth;if(_<100){clearTimeout(this._timeoutHandle),this.root.classList.add("compact"),this.foldout.classList.add("floating-panel-style");return}const w=20*2,x=_-w;if(!b&&Math.abs(x-this._lastAvailableWidthChange)<1)return;this._lastAvailableWidthChange=x,clearTimeout(this._timeoutHandle),this._timeoutHandle=setTimeout(()=>{const T=M();T<0?(this.root.classList.add("compact"),this.foldout.classList.add("floating-panel-style")):T>0&&(this.root.classList.remove("compact"),this.foldout.classList.remove("floating-panel-style"),M()<0&&(this.root.classList.add("compact"),this.foldout.classList.add("floating-panel-style")))},5);const k=()=>this.options.clientWidth+this.logoContainer.clientWidth,M=()=>x-k()});const c=document.createElement("template");c.innerHTML=`<style>
|
|
392
|
+
|
|
393
|
+
#root {
|
|
394
|
+
position: absolute;
|
|
395
|
+
width: auto;
|
|
396
|
+
max-width: 95%;
|
|
397
|
+
left: 50%;
|
|
398
|
+
transform: translateX(-50%);
|
|
399
|
+
top: min(20px, 10vh);
|
|
400
|
+
padding: 0.3rem;
|
|
401
|
+
display: flex;
|
|
402
|
+
visibility: visible;
|
|
403
|
+
flex-direction: row-reverse; /* if we overflow this should be right aligned so the logo is always visible */
|
|
404
|
+
pointer-events: all;
|
|
405
|
+
z-index: 1000;
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
/** hide the menu if it's empty **/
|
|
409
|
+
#root.has-no-options.logo-hidden {
|
|
410
|
+
display: none;
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
/** using a div here because then we can change the class for placement **/
|
|
414
|
+
#root.bottom {
|
|
415
|
+
top: auto;
|
|
416
|
+
bottom: min(30px, 10vh);
|
|
417
|
+
}
|
|
418
|
+
#root.top {
|
|
419
|
+
top: calc(.7rem + env(safe-area-inset-top));
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
.wrapper {
|
|
423
|
+
position: relative;
|
|
424
|
+
display: flex;
|
|
425
|
+
flex-direction: row;
|
|
426
|
+
justify-content: center;
|
|
427
|
+
align-items: stretch;
|
|
428
|
+
gap: 0px;
|
|
429
|
+
padding: 0 0rem;
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
.wrapper > *, .options > button, .options > select, ::slotted(*) {
|
|
433
|
+
position: relative;
|
|
434
|
+
border: none;
|
|
435
|
+
border-radius: 0;
|
|
436
|
+
outline: 1px solid rgba(0,0,0,0);
|
|
437
|
+
display: flex;
|
|
438
|
+
justify-content: center;
|
|
439
|
+
align-items: center;
|
|
440
|
+
max-height: 2.3rem;
|
|
441
|
+
max-width: 100%;
|
|
442
|
+
|
|
443
|
+
/** basic font settings for all entries **/
|
|
444
|
+
font-size: 1rem;
|
|
445
|
+
font-family: 'Roboto Flex', sans-serif;
|
|
446
|
+
font-optical-sizing: auto;
|
|
447
|
+
font-weight: 500;
|
|
448
|
+
font-weight: 200;
|
|
449
|
+
font-variation-settings: "wdth" 100;
|
|
450
|
+
color: rgb(20,20,20);
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
.options > select[multiple]:hover {
|
|
454
|
+
max-height: 300px;
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
.floating-panel-style {
|
|
458
|
+
background: rgba(255, 255, 255, .4);
|
|
459
|
+
outline: rgb(0 0 0 / 5%) 1px solid;
|
|
460
|
+
border: 1px solid rgba(255, 255, 255, .1);
|
|
461
|
+
box-shadow: 0px 7px 0.5rem 0px rgb(0 0 0 / 6%), inset 0px 0px 1.3rem rgba(0,0,0,.05);
|
|
462
|
+
border-radius: 1.5rem;
|
|
463
|
+
/**
|
|
464
|
+
* to make nested background filter work
|
|
465
|
+
* https://stackoverflow.com/questions/60997948/backdrop-filter-not-working-for-nested-elements-in-chrome
|
|
466
|
+
**/
|
|
467
|
+
&::before {
|
|
468
|
+
content: '';
|
|
469
|
+
position: absolute;
|
|
470
|
+
width: 100%;
|
|
471
|
+
height: 100%;
|
|
472
|
+
top: 0;
|
|
473
|
+
left: 0;
|
|
474
|
+
z-index: -1;
|
|
475
|
+
border-radius: 1.5rem;
|
|
476
|
+
-webkit-backdrop-filter: blur(8px);
|
|
477
|
+
backdrop-filter: blur(8px);
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
a {
|
|
482
|
+
color: inherit;
|
|
483
|
+
text-decoration: none;
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
.options {
|
|
487
|
+
display: flex;
|
|
488
|
+
flex-direction: row;
|
|
489
|
+
align-items: center;
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
.options > *, ::slotted(*) {
|
|
493
|
+
max-height: 2.25rem;
|
|
494
|
+
padding: .4rem .5rem;
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
:host .options > *, ::slotted(*) {
|
|
498
|
+
background: transparent;
|
|
499
|
+
border: none;
|
|
500
|
+
white-space: nowrap;
|
|
501
|
+
transition: all 0.1s linear .02s;
|
|
502
|
+
border-radius: 1.5rem;
|
|
503
|
+
user-select: none;
|
|
504
|
+
}
|
|
505
|
+
:host .options > *:hover, ::slotted(*:hover) {
|
|
506
|
+
cursor: pointer;
|
|
507
|
+
color: black;
|
|
508
|
+
background: rgba(245, 245, 245, .8);
|
|
509
|
+
box-shadow: inset 0 0 1rem rgba(0,0,30,.2);
|
|
510
|
+
outline: rgba(0,0,0,.1) 1px solid;
|
|
511
|
+
}
|
|
512
|
+
:host .options > *:active, ::slotted(*:active) {
|
|
513
|
+
background: rgba(255, 255, 255, .8);
|
|
514
|
+
box-shadow: inset 0px 1px 1px rgba(255,255,255,.5), inset 0 0 2rem rgba(0,0,30,.2), inset 0px 2px 4px rgba(0,0,20,.5);
|
|
515
|
+
transition: all 0.05s linear;
|
|
516
|
+
}
|
|
517
|
+
:host .options > *:focus, ::slotted(*:focus) {
|
|
518
|
+
outline: rgba(255,255,255,.5) 1px solid;
|
|
519
|
+
}
|
|
520
|
+
:host .options > *:focus-visible, ::slotted(*:focus-visible) {
|
|
521
|
+
outline: rgba(0,0,0,.5) 1px solid;
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
:host .options > *:disabled, ::slotted(*:disabled) {
|
|
525
|
+
background: rgba(0,0,0,.05);
|
|
526
|
+
color: rgba(60,60,60,.7);
|
|
527
|
+
pointer-events: none;
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
button, ::slotted(button) {
|
|
531
|
+
gap: 0.3rem;
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
/** XR button animation **/
|
|
535
|
+
:host button.this-mode-is-requested {
|
|
536
|
+
background: repeating-linear-gradient(to right, #fff 0%, #fff 40%, #aaffff 55%, #fff 80%);
|
|
537
|
+
background-size: 200% auto;
|
|
538
|
+
background-position: 0 100%;
|
|
539
|
+
animation: AnimationName .7s ease infinite forwards;
|
|
540
|
+
}
|
|
541
|
+
:host button.other-mode-is-requested {
|
|
542
|
+
opacity: .5;
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
@keyframes AnimationName {
|
|
546
|
+
0% { background-position: 0% 0 }
|
|
547
|
+
100% { background-position: -200% 0 }
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
|
|
551
|
+
|
|
552
|
+
|
|
553
|
+
.logo {
|
|
554
|
+
cursor: pointer;
|
|
555
|
+
padding-left: 0.6rem;
|
|
556
|
+
padding-bottom: .02rem;
|
|
557
|
+
margin-right: 0.5rem;
|
|
558
|
+
}
|
|
559
|
+
.logo-hidden {
|
|
560
|
+
.logo {
|
|
561
|
+
display: none;
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
:host .has-options .logo {
|
|
565
|
+
border-left: 1px solid rgba(40,40,40,.4);
|
|
566
|
+
margin-left: 0.3rem;
|
|
567
|
+
margin-right: 0.5rem;
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
.logo > span {
|
|
571
|
+
white-space: nowrap;
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
|
|
575
|
+
|
|
576
|
+
/** COMPACT */
|
|
577
|
+
|
|
578
|
+
/** Hide the menu button normally **/
|
|
579
|
+
.compact-menu-button { display: none; }
|
|
580
|
+
/** And show it when we're in compact mode **/
|
|
581
|
+
.compact .compact-menu-button {
|
|
582
|
+
position: relative;
|
|
583
|
+
display: block;
|
|
584
|
+
background: none;
|
|
585
|
+
border: none;
|
|
586
|
+
border-radius: 2rem;
|
|
587
|
+
|
|
588
|
+
margin: 0;
|
|
589
|
+
padding: 0 .3rem;
|
|
590
|
+
padding-top: .2rem;
|
|
591
|
+
|
|
592
|
+
z-index: 100;
|
|
593
|
+
|
|
594
|
+
color: #000;
|
|
595
|
+
|
|
596
|
+
&:hover {
|
|
597
|
+
background: rgba(255,255,255,.2);
|
|
598
|
+
cursor: pointer;
|
|
599
|
+
}
|
|
600
|
+
&:focus {
|
|
601
|
+
outline: 1px solid rgba(255,255,255,.5);
|
|
602
|
+
}
|
|
603
|
+
&:focus-visible {
|
|
604
|
+
outline: 1px solid rgba(0,0,0,.5);
|
|
605
|
+
}
|
|
606
|
+
& .expanded-click-area {
|
|
607
|
+
position: absolute;
|
|
608
|
+
left: 0;
|
|
609
|
+
right: 0;
|
|
610
|
+
top: 10%;
|
|
611
|
+
bottom: 10%;
|
|
612
|
+
transform: scale(1.8);
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
.has-no-options .compact-menu-button {
|
|
616
|
+
display: none;
|
|
617
|
+
}
|
|
618
|
+
.open .compact-menu-button {
|
|
619
|
+
background: rgba(255,255,255,.2);
|
|
620
|
+
}
|
|
621
|
+
.logo-visible .compact-menu-button {
|
|
622
|
+
margin-left: .2rem;
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
/** Open and hide menu **/
|
|
626
|
+
.compact .foldout {
|
|
627
|
+
display: none;
|
|
628
|
+
}
|
|
629
|
+
.open .options, .open .foldout {
|
|
630
|
+
display: flex;
|
|
631
|
+
justify-content: center;
|
|
632
|
+
}
|
|
633
|
+
.compact .wrapper {
|
|
634
|
+
padding: 0;
|
|
635
|
+
}
|
|
636
|
+
.compact .wrapper, .compact .options {
|
|
637
|
+
height: auto;
|
|
638
|
+
max-height: initial;
|
|
639
|
+
flex-direction: row;
|
|
640
|
+
gap: .12rem;
|
|
641
|
+
}
|
|
642
|
+
.compact .options {
|
|
643
|
+
flex-wrap: wrap;
|
|
644
|
+
gap: .3rem;
|
|
645
|
+
}
|
|
646
|
+
.compact .top .options {
|
|
647
|
+
height: auto;
|
|
648
|
+
flex-direction: row;
|
|
649
|
+
}
|
|
650
|
+
.compact .bottom .wrapper {
|
|
651
|
+
height: auto;
|
|
652
|
+
flex-direction: column;
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
.compact .foldout {
|
|
656
|
+
max-height: min(100ch, calc(100vh - 100px));
|
|
657
|
+
overflow: auto;
|
|
658
|
+
overflow-x: hidden;
|
|
659
|
+
align-items: center;
|
|
660
|
+
|
|
661
|
+
position: fixed;
|
|
662
|
+
bottom: calc(100% + 5px);
|
|
663
|
+
z-index: 100;
|
|
664
|
+
width: auto;
|
|
665
|
+
left: .2rem;
|
|
666
|
+
right: .2rem;
|
|
667
|
+
padding: .2rem;
|
|
668
|
+
|
|
669
|
+
}
|
|
670
|
+
.compact.logo-hidden .foldout {
|
|
671
|
+
/** for when there's no logo we want to center the foldout **/
|
|
672
|
+
min-width: 24ch;
|
|
673
|
+
margin-left: 50%;
|
|
674
|
+
transform: translateX(calc(-50% - .2rem));
|
|
675
|
+
}
|
|
676
|
+
|
|
677
|
+
.compact.top .foldout {
|
|
678
|
+
top: calc(100% + 5px);
|
|
679
|
+
bottom: auto;
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
::-webkit-scrollbar {
|
|
683
|
+
max-width: 7px;
|
|
684
|
+
background: rgba(100,100,100,.2);
|
|
685
|
+
border-radius: .2rem;
|
|
686
|
+
}
|
|
687
|
+
::-webkit-scrollbar-thumb {
|
|
688
|
+
background: rgba(255, 255, 255, .3);
|
|
689
|
+
border-radius: .2rem;
|
|
690
|
+
}
|
|
691
|
+
::-webkit-scrollbar-thumb:hover {
|
|
692
|
+
background: rgb(150,150,150);
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
.compact .options > *, .compact .options > ::slotted(*) {
|
|
696
|
+
font-size: 1.2rem;
|
|
697
|
+
padding: .6rem .5rem;
|
|
698
|
+
width: 100%;
|
|
699
|
+
}
|
|
700
|
+
.compact.has-options .logo {
|
|
701
|
+
border: none;
|
|
702
|
+
padding-left: 0;
|
|
703
|
+
margin-left: 1rem;
|
|
704
|
+
margin-bottom: .02rem;
|
|
705
|
+
}
|
|
706
|
+
.compact .options {
|
|
707
|
+
/** e.g. if we have a very wide menu item like a select with long option names we don't want to overflow **/
|
|
708
|
+
max-width: 100%;
|
|
709
|
+
|
|
710
|
+
& > button, & > select {
|
|
711
|
+
display: flex;
|
|
712
|
+
flex-basis: 100%;
|
|
713
|
+
min-height: 3rem;
|
|
714
|
+
}
|
|
715
|
+
& > button.row2 {
|
|
716
|
+
//border: 1px solid red !important;
|
|
717
|
+
display: flex;
|
|
718
|
+
flex: 1;
|
|
719
|
+
flex-basis: 30%;
|
|
720
|
+
}
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
/** If there's really not enough space then just hide all options **/
|
|
724
|
+
@media (max-width: 100px) or (max-height: 100px){
|
|
725
|
+
.foldout {
|
|
726
|
+
display: none !important;
|
|
727
|
+
}
|
|
728
|
+
.compact-menu-button {
|
|
729
|
+
display: none !important;
|
|
730
|
+
}
|
|
731
|
+
}
|
|
732
|
+
|
|
733
|
+
/* dark mode */
|
|
734
|
+
/*
|
|
735
|
+
@media (prefers-color-scheme: dark) {
|
|
736
|
+
:host {
|
|
737
|
+
background: rgba(0,0,0, .6);
|
|
738
|
+
}
|
|
739
|
+
:host button {
|
|
740
|
+
color: rgba(200,200,200);
|
|
741
|
+
}
|
|
742
|
+
:host button:hover {
|
|
743
|
+
background: rgba(100,100,100, .8);
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
*/
|
|
747
|
+
|
|
748
|
+
</style>
|
|
749
|
+
|
|
750
|
+
<div id="root" class="logo-hidden floating-panel-style bottom">
|
|
751
|
+
<div class="wrapper">
|
|
752
|
+
<div class="foldout">
|
|
753
|
+
<div class="options" part="options">
|
|
754
|
+
<slot></slot>
|
|
755
|
+
</div>
|
|
756
|
+
<div class="options" part="options">
|
|
757
|
+
<slot name="end"></slot>
|
|
758
|
+
</div>
|
|
759
|
+
</div>
|
|
760
|
+
<div style="user-select:none" class="logo">
|
|
761
|
+
<span class="madewith notranslate">powered by</span>
|
|
762
|
+
</div>
|
|
763
|
+
</div>
|
|
764
|
+
<button class="compact-menu-button">
|
|
765
|
+
<div class="expanded-click-area"></div>
|
|
766
|
+
</button>
|
|
767
|
+
</div>
|
|
768
|
+
`;const h=this.attachShadow({mode:"open"});Qw(),fu(kf,{loadedCallback:()=>{this.handleSizeChange()}}),fu(kf,{element:h});const d=c.content.cloneNode(!0);h?.appendChild(d),this.root=h.querySelector("#root"),this.wrapper=(e=this.root)==null?void 0:e.querySelector(".wrapper"),this.options=(t=this.root)==null?void 0:t.querySelector(".options"),this.logoContainer=(s=this.root)==null?void 0:s.querySelector(".logo"),this.compactMenuButton=(o=this.root)==null?void 0:o.querySelector(".compact-menu-button"),this.compactMenuButton.append(Mt("more_vert")),this.foldout=(r=this.root)==null?void 0:r.querySelector(".foldout"),(l=this.root)==null||l.appendChild(this.wrapper),this.wrapper.classList.add("wrapper");const u=Yw.create();u.style.minHeight="1rem",this.logoContainer.append(u),this.logoContainer.addEventListener("click",()=>{globalThis.open("https://needle.tools","_blank")});try{window.requestAnimationFrame(()=>LR(v=>{if(v==!0&&Js()&&!Zw){let b=this._userRequestedLogoVisible;b===void 0&&(b=!1),this.___onSetLogoVisible(b)}else this.___onSetLogoVisible(!0)}))}catch(v){console.error("[Needle Menu] License check failed.",v)}this.compactMenuButton.addEventListener("click",v=>{v.preventDefault(),this.root.classList.toggle("open")});let p=this._context;setTimeout(()=>p=this._context);let g=0;const f=(v,b)=>{var _,w,x;Oc&&console.log("Set menu visible",b),p!=null&&p.isInAR&&p.arOverlayElement?v!=p.arOverlayElement&&p.arOverlayElement.appendChild(this):this.parentNode!=((_=this._domElement)==null?void 0:_.shadowRoot)&&((x=(w=this._domElement)==null?void 0:w.shadowRoot)==null||x.appendChild(this)),this.style.display=b?"flex":"none",this.style.visibility="visible",this.style.opacity="1"};let y=!1;new MutationObserver(v=>{var b;if(!y)try{y=!0,this.onChangeDetected(v);const _=this==null?void 0:this.parentNode;if((this.style.display!="flex"||this.style.visibility!="visible"||this.style.opacity!="1"||_!=((b=this._domElement)==null?void 0:b.shadowRoot))&&!Js()){const w=g++;Xt()&&this._userRequestedMenuVisible===!1?(w===0&&f(_,this._userRequestedMenuVisible),w===1&&console.warn("Needle Menu Warning: You need a PRO license to hide the Needle Engine menu \u2192 The menu will be visible in your deployed website if you don't have a PRO license. See https://needle.tools/pricing for details.")):w===0?f(_,!0):setTimeout(()=>f(_,!0),5)}}finally{y=!1}}).observe(this.root,{childList:!0,subtree:!0,attributes:!0}),Oc&&this.___insertDebugOptions()}static create(){return document.createElement(Lr,{is:Lr})}static getOrCreate(e,t){let s=e.querySelector(Lr);return!s&&e.shadowRoot&&(s=e.shadowRoot.querySelector(Lr)),s||(s=window.document.body.querySelector(Lr)),s||(s=fC.create(),e.shadowRoot?e.shadowRoot.appendChild(s):e.appendChild(s)),s._domElement=e,s._context=t,s}connectedCallback(){window.addEventListener("resize",this.handleSizeChange),this.handleMenuVisible(),this._sizeChangeInterval=setInterval(()=>this.handleSizeChange(void 0,!0),5e3),setTimeout(()=>{var e,t;(e=this._domElement)==null||e.addEventListener("resize",this.handleSizeChange),(t=this._domElement)==null||t.addEventListener("click",ge(this,vu))},1)}disconnectedCallback(){var e,t;window.removeEventListener("resize",this.handleSizeChange),clearInterval(this._sizeChangeInterval),(e=this._domElement)==null||e.removeEventListener("resize",this.handleSizeChange),(t=this._context)==null||t.domElement.removeEventListener("click",ge(this,vu))}showNeedleLogo(e){this._userRequestedLogoVisible=e,!(!e&&(!Js()||Zw)&&(console.warn("[Needle Engine] You need a PRO license to hide the Needle Engine logo in production."),!Xt()))&&this.___onSetLogoVisible(e)}get logoIsVisible(){return!this.root.classList.contains("logo-hidden")}___onSetLogoVisible(e){this.logoContainer.style.display="",this.logoContainer.style.opacity="1",this.logoContainer.style.visibility="visible",e?(this.root.classList.remove("logo-hidden"),this.root.classList.add("logo-visible")):(this.root.classList.remove("logo-visible"),this.root.classList.add("logo-hidden"))}setPosition(e){if(e!=="top"&&e!=="bottom")return console.error("NeedleMenu.setPosition: invalid position",e);this.root.classList.remove("top","bottom"),this.root.classList.add(e)}setVisible(e){this._userRequestedMenuVisible=e,this.style.display=e?"flex":"none"}closeFoldout(){this.root.classList.remove("open")}append(...e){for(const t of e)if(typeof t=="string"){const s=document.createTextNode(t);this.options.appendChild(s)}else this.options.appendChild(t)}appendChild(e){var t;if(!(e instanceof Node)){const s=document.createElement("button");if(s.textContent=e.label,s.onclick=e.onClick,s.setAttribute("priority",((t=e.priority)==null?void 0:t.toString())??"0"),e.title&&(s.title=e.title),e.icon){const o=Mt(e.icon);e.iconSide==="right"?s.appendChild(o):s.prepend(o)}e.class&&s.classList.add(e.class),e=s}return this.options.appendChild(e)}prepend(...e){for(const t of e)if(typeof t=="string"){const s=document.createTextNode(t);this.options.prepend(s)}else this.options.prepend(t)}onChangeDetected(e){if(!this._isHandlingChange){this._isHandlingChange=!0;try{this.handleMenuVisible();for(const t of e)t.target==this.options&&this.onOptionsChildrenChanged(t)}finally{this._isHandlingChange=!1}}}onOptionsChildrenChanged(e){if(this.root.classList.toggle("has-options",this.hasAnyVisibleOptions),this.root.classList.toggle("has-no-options",!this.hasAnyVisibleOptions),this.handleSizeChange(void 0,!0),e.type==="childList"&&e.addedNodes.length>0){const t=Array.from(this.options.children);t.sort((o,r)=>{const l=parseInt(o.getAttribute("priority")||"0"),c=parseInt(r.getAttribute("priority")||"0");return l-c});let s=!1;for(let o=0;o<t.length;o++){const r=this.options.children[o],l=t[o];if(r!==l){s=!0;break}}if(s)for(const o of t)this.options.appendChild(o)}}handleMenuVisible(){Oc&&console.log("Update VisibleState: Any Content?",this.hasAnyContent),this.hasAnyContent?this.root.style.display="":this.root.style.display="none",this.root.classList.toggle("has-options",this.hasAnyVisibleOptions),this.root.classList.toggle("has-no-options",!this.hasAnyVisibleOptions)}get hasAnyContent(){return!!(this.logoContainer.style.display!="none"||this.hasAnyVisibleOptions)}get hasAnyVisibleOptions(){for(let e=0;e<this.options.children.length;e++){const t=this.options.children[e];if(t.tagName==="SLOT"){const s=t.assignedNodes();for(const o of s)if(o instanceof HTMLElement&&o.style.display!="none")return!0}else if(t.style.display!="none")return!0}return!1}___insertDebugOptions(){window.addEventListener("keydown",s=>{s.key==="p"&&this.setPosition(this.root.classList.contains("top")?"bottom":"top")});const e=document.createElement("button");e.textContent="Hide Buttons",e.onclick=()=>{const s=new Array(this.options.children.length);for(let o=0;o<this.options.children.length;o++)s[o]=this.options.children[o];for(const o of s)this.options.removeChild(o);setTimeout(()=>{for(const o of s)this.options.appendChild(o)},1e3)},this.appendChild(e);const t=document.createElement("button");t.textContent="Toggle Logo",t.addEventListener("click",()=>{this.logoContainer.style.display=this.logoContainer.style.display==="none"?"":"none"}),this.appendChild(t)}};vu=new WeakMap;let Jw=kR;customElements.get(Lr)||customElements.define(Lr,Jw);const et=C("debugcontext"),MR=C("stats"),RR=C("debugactive"),TR=C("debugframerate"),ER=C("debugcoroutine"),AR={};class IR{constructor(){a(this,"name"),a(this,"alias"),a(this,"hash"),a(this,"runInBackground"),a(this,"domElement"),a(this,"renderer"),a(this,"camera"),a(this,"scene")}}var Oe=(n=>(n[n.Start=-1]="Start",n[n.EarlyUpdate=0]="EarlyUpdate",n[n.Update=1]="Update",n[n.LateUpdate=2]="LateUpdate",n[n.OnBeforeRender=3]="OnBeforeRender",n[n.OnAfterRender=4]="OnAfterRender",n[n.PrePhysicsStep=9]="PrePhysicsStep",n[n.PostPhysicsStep=10]="PostPhysicsStep",n[n.Undefined=-1]="Undefined",n))(Oe||{});function bu(n,e){if(!n)return;if(!n.isComponent){(F()||et)&&console.error(`Registered script is not a Needle Engine component.
|
|
769
|
+
The script will be ignored. Please make sure your component extends "Behaviour" imported from "@needle-tools/engine"
|
|
770
|
+
`,n);return}e||(e=J.Current,et&&console.warn("> Registering component without context"));const t=e?.new_scripts;t.includes(n)||t.push(n)}const Rf=class Le{constructor(e){a(this,"name"),a(this,"alias"),a(this,"isManagedExternally",!1),a(this,"isPaused",!1),a(this,"runInBackground",!1),a(this,"targetFrameRate"),a(this,"physicsSteps",1),a(this,"hash"),a(this,"domElement"),a(this,"_resolutionScaleFactor",1),a(this,"_boundingClientRectFrame",-1),a(this,"_boundingClientRect",null),a(this,"_domX"),a(this,"_domY"),a(this,"xr",null),a(this,"_xrFrame",null),a(this,"_currentFrameEvent",-1),a(this,"scene"),a(this,"renderer"),a(this,"composer",null),a(this,"scripts",[]),a(this,"scripts_pausedChanged",[]),a(this,"scripts_earlyUpdate",[]),a(this,"scripts_update",[]),a(this,"scripts_lateUpdate",[]),a(this,"scripts_onBeforeRender",[]),a(this,"scripts_onAfterRender",[]),a(this,"scripts_WithCorroutines",[]),a(this,"scripts_immersive_vr",[]),a(this,"scripts_immersive_ar",[]),a(this,"coroutines",{}),a(this,"post_setup_callbacks",[]),a(this,"pre_update_callbacks",[]),a(this,"pre_render_callbacks",[]),a(this,"post_render_callbacks",[]),a(this,"pre_update_oneshot_callbacks",[]),a(this,"new_scripts",[]),a(this,"new_script_start",[]),a(this,"new_scripts_pre_setup_callbacks",[]),a(this,"new_scripts_post_setup_callbacks",[]),a(this,"new_scripts_xr",[]),a(this,"mainCameraComponent"),a(this,"_mainCamera",null),a(this,"_fallbackCamera",null),a(this,"application"),a(this,"animations"),a(this,"time"),a(this,"input"),a(this,"physics"),a(this,"connection"),a(this,"assets"),a(this,"mainLight",null),a(this,"sceneLighting"),a(this,"addressables"),a(this,"lightmaps"),a(this,"players"),a(this,"lodsManager"),a(this,"menu"),a(this,"_needsUpdateSize",!1),a(this,"_isCreated",!1),a(this,"_isCreating",!1),a(this,"_isVisible",!1),a(this,"_stats",MR?new JP:null),a(this,"_intersectionObserver",null),a(this,"_disposeCallbacks",[]),a(this,"maxRenderResolution"),a(this,"_devicePixelRatio","auto"),a(this,"_originalCreationArgs"),a(this,"onUnhandledRejection",o=>{this.onError(o.reason)}),a(this,"_cameraStack",[]),a(this,"_onBeforeRenderListeners",new Map),a(this,"_onAfterRenderListeners",new Map),a(this,"_requireDepthTexture",!1),a(this,"_requireColorTexture",!1),a(this,"_renderTarget"),a(this,"_isRendering",!1),a(this,"_createId",0),a(this,"_renderlooperrors",0),a(this,"_lastTimestamp",0),a(this,"_accumulatedTime",0),a(this,"_dispatchReadyAfterFrame",!1),a(this,"_tempClearColor",new oe),a(this,"_tempClearColor2",new oe),a(this,"_contextRestoreTries",0),a(this,"_wasPaused",!1),this.name=e?.name||"",this.alias=e?.alias,this.domElement=e?.domElement||document.body,this.hash=e?.hash,e!=null&&e.renderer&&(this.renderer=e.renderer,this.isManagedExternally=!0),e?.runInBackground!==void 0&&(this.runInBackground=e.runInBackground),e!=null&&e.scene?this.scene=e.scene:this.scene=new xi,e!=null&&e.camera&&(this._mainCamera=e.camera),this.application=new Ln(this),this.time=new Vw,this.input=new n_(this),this.physics=new Gg(this),this.connection=new b_(this),this.assets=new j_,this.sceneLighting=new zw(this),this.addressables=new kw(this),this.lightmaps=new pR(this),this.players=new Bw(this),this.menu=new OR(this),this.lodsManager=new mR(this),this.animations=new hR(this);const t=()=>this._needsUpdateSize=!0;window.addEventListener("resize",t),this._disposeCallbacks.push(()=>window.removeEventListener("resize",t));const s=new ResizeObserver(o=>this._needsUpdateSize=!0);s.observe(this.domElement),this._disposeCallbacks.push(()=>s.disconnect()),this._intersectionObserver=new IntersectionObserver(o=>{this._isVisible=o[0].isIntersecting}),this._disposeCallbacks.push(()=>{var o;return(o=this._intersectionObserver)==null?void 0:o.disconnect()}),pe.register(this)}static get DefaultTargetFrameRate(){return Le._defaultTargetFramerate.value}static set DefaultTargetFrameRate(e){Le._defaultTargetFramerate.value=e}static get DefaultWebGLRendererParameters(){return Le._defaultWebglRendererParameters}get version(){return ws}static get Current(){return pe.Current}static set Current(e){pe.Current=e}static get All(){return pe.All}appendHTMLElement(e){return this.domElement.shadowRoot?this.domElement.shadowRoot.appendChild(e):this.domElement.appendChild(e)}get resolutionScaleFactor(){return this._resolutionScaleFactor}set resolutionScaleFactor(e){if(e!==this._resolutionScaleFactor&&typeof e=="number"){if(e<=0){console.error("Invalid resolution scale factor",e);return}this._resolutionScaleFactor=e,this.updateSize()}}calculateBoundingClientRect(){if(this.xr){this._domX=0,this._domY=0;return}this._boundingClientRectFrame!==this.time.frame&&(this._boundingClientRectFrame=this.time.frame,this._boundingClientRect=this.domElement.getBoundingClientRect(),this._domX=this._boundingClientRect.x,this._domY=this._boundingClientRect.y)}get domWidth(){return this.isInAR?window.innerWidth:this.domElement.clientWidth}get domHeight(){return this.isInAR?window.innerHeight:this.domElement.clientHeight}get domX(){return this.calculateBoundingClientRect(),this._domX}get domY(){return this.calculateBoundingClientRect(),this._domY}get isInXR(){var e,t;return((t=(e=this.renderer)==null?void 0:e.xr)==null?void 0:t.isPresenting)||!1}get xrSessionMode(){var e;return(e=this.xr)==null?void 0:e.mode}get isInVR(){return this.xrSessionMode==="immersive-vr"}get isInAR(){return this.xrSessionMode==="immersive-ar"}get isInPassThrough(){return this.xr?this.xr.isPassThrough:!1}get xrSession(){var e,t;return(t=(e=this.renderer)==null?void 0:e.xr)==null?void 0:t.getSession()}get xrFrame(){return this._xrFrame}get xrCamera(){var e,t;return this.renderer.xr.isPresenting?(t=(e=this.renderer)==null?void 0:e.xr)==null?void 0:t.getCamera():void 0}get arOverlayElement(){const e=this.domElement;return typeof e.getAROverlayContainer=="function"?e.getAROverlayContainer():this.domElement}get currentFrameEvent(){return this._currentFrameEvent}get mainCamera(){if(this._mainCamera)return this._mainCamera;if(this.mainCameraComponent){const e=this.mainCameraComponent;return e.threeCamera||e.buildCamera(),e.threeCamera}return this._fallbackCamera||(this._fallbackCamera=new we(75,this.domWidth/this.domHeight,.1,1e3)),this._fallbackCamera}set mainCamera(e){this._mainCamera=e}get rendererData(){return this.sceneLighting}get isCreated(){return this._isCreated}createNewRenderer(e){var t,s,o;if((t=this.renderer)==null||t.dispose(),e={...Le.DefaultWebGLRendererParameters,...e},!e.canvas){const r=(o=(s=this.domElement)==null?void 0:s.shadowRoot)==null?void 0:o.querySelector("canvas");r&&(e.canvas=r,et&&console.log("Using canvas from shadow root",r))}return et&&console.log("Using Renderer Parameters:",e,this.domElement),this.renderer=new fr(e),this.renderer.debug.checkShaderErrors=F()||C("checkshadererrors")===!0,this.renderer.toneMappingExposure=1,this.renderer.toneMapping=bd,this.renderer.setClearColor(new oe("lightgrey"),0),this.renderer.shadowMap.enabled=!0,this.renderer.shadowMap.type=HC,this.renderer.setSize(this.domWidth,this.domHeight),this.renderer.outputColorSpace=Mn,this.renderer.nodes={library:new GC,modelViewMatrix:null,modelNormalViewMatrix:null},this.lodsManager.setRenderer(this.renderer),this.input.bindEvents(),this.renderer}internalOnUpdateVisible(){var e,t;(e=this._intersectionObserver)==null||e.disconnect(),(t=this._intersectionObserver)==null||t.observe(this.domElement)}requestSizeUpdate(){this._needsUpdateSize=!0}get devicePixelRatio(){return this._devicePixelRatio}set devicePixelRatio(e){e!==this._devicePixelRatio&&(this._devicePixelRatio=e,this._needsUpdateSize=!0)}updateSize(e=!1){var t,s,o;if(e||!this.isManagedExternally&&((t=this.renderer.xr)==null?void 0:t.isPresenting)===!1){this._needsUpdateSize=!1;const r=this.resolutionScaleFactor;let l=this.domWidth*r,c=this.domHeight*r;this.maxRenderResolution&&(this.maxRenderResolution.x=Math.max(1,this.maxRenderResolution.x),l=Math.min(this.maxRenderResolution.x,l),this.maxRenderResolution.y=Math.max(1,this.maxRenderResolution.y),c=Math.min(this.maxRenderResolution.y,c));const h=this.mainCamera;this.updateAspect(h),this.renderer.setSize(l,c,!0),this.renderer.domElement.style.width="100%",this.renderer.domElement.style.height="100%";const d=typeof this.devicePixelRatio=="number"?this.devicePixelRatio:this.devicePixelRatio==="auto"?window.devicePixelRatio:void 0;d!==void 0&&this.renderer.setPixelRatio(d),this.composer&&((s=this.composer.setSize)==null||s.call(this.composer,l,c),d!==void 0&&"setPixelRatio"in this.composer&&typeof this.composer.setPixelRatio=="function"&&((o=this.composer.setPixelRatio)==null||o.call(this.composer,window.devicePixelRatio)))}}updateAspect(e,t,s){if(!e)return;t===void 0&&(t=this.domWidth),s===void 0&&(s=this.domHeight);const o=t/s;if(e.isPerspectiveCamera){const r=e,l=r.aspect;r.aspect=o,l!==r.aspect&&e.updateProjectionMatrix()}else if(e.isOrthographicCamera){const r=e,l=r.top-r.bottom,c=l*o/2,h=l/2;(r.left!=-c||r.top!=h)&&(r.left=-c,r.right=c,r.top=h,r.bottom=-h,e.updateProjectionMatrix())}}recreate(){this.clear(),this.create(this._originalCreationArgs)}async onCreate(e){return this.create(e)}async create(e){try{this._isCreating=!0,e!==this._originalCreationArgs&&(this._originalCreationArgs=Gl(e)),window.addEventListener("unhandledrejection",this.onUnhandledRejection);const t=await this.internalOnCreate(e);return this._isCreated=t,t}finally{window.removeEventListener("unhandledrejection",this.onUnhandledRejection),this._isCreating=!1}}onError(e){this.domElement.dispatchEvent(new CustomEvent("error",{detail:e}))}clear(){var e,t,s,o;pe.dispatchCallback(me.ContextClearing,this),Xs(this,me.ContextClearing),Ai(this.scene,!0,!0),this.scene=new xi,(e=this.addressables)==null||e.dispose(),(t=this.lightmaps)==null||t.clear(),(o=(s=this.physics)==null?void 0:s.engine)==null||o.clearCaches(),this.lodsManager.disable(),this._onBeforeRenderListeners.clear(),this._onAfterRenderListeners.clear(),this.isManagedExternally||this.renderer&&(this.renderer.renderLists.dispose(),this.renderer.state.reset(),this.renderer.resetState()),pe.dispatchCallback(me.ContextCleared,this)}dispose(){this.internalOnDestroy()}onDestroy(){this.internalOnDestroy()}internalOnDestroy(){var e,t;Le.Current=this,pe.dispatchCallback(me.ContextDestroying,this),Xs(this,me.ContextDestroying),this.clear(),(e=this.renderer)==null||e.setAnimationLoop(null),this.renderer&&(this.renderer.setClearAlpha(0),this.renderer.clear(),this.isManagedExternally||(et&&console.log("Disposing renderer"),this.renderer.dispose())),this.scene=null,this.renderer=null,this.input.dispose(),this.menu.onDestroy(),this.animations.onDestroy();for(const s of this._disposeCallbacks)try{s()}catch(o){console.error("Error in on dispose callback:",o,s)}(t=this.domElement)!=null&&t.parentElement&&this.domElement.parentElement.removeChild(this.domElement),this._isCreated=!1,pe.dispatchCallback(me.ContextDestroyed,this),Xs(this,me.ContextDestroyed),pe.unregister(this),Le.Current===this&&(Le.Current=null)}registerCoroutineUpdate(e,t,s){return typeof t?.next!="function"?(console.error("Registered invalid coroutine function from "+e.name+`
|
|
771
|
+
Coroutine functions must be generators: "*myCoroutine() {...}"
|
|
772
|
+
Start a coroutine from a component by calling "this.startCoroutine(myCoroutine())"`),t):(this.coroutines[s]||(this.coroutines[s]=[]),this.coroutines[s].push({comp:e,main:t}),t)}unregisterCoroutineUpdate(e,t){if(!this.coroutines[t])return;const s=this.coroutines[t].findIndex(o=>o.main===e);s>=0&&this.coroutines[t].splice(s,1)}stopAllCoroutinesFrom(e){for(const t in this.coroutines){const s=this.coroutines[t];for(let o=s.length-1;o>=0;o--)s[o].comp===e&&s.splice(o,1)}}setCurrentCamera(e){var t;if(!e)return;if(e.threeCamera||e.buildCamera(),!e.threeCamera){console.warn("Camera component is missing camera",e);return}const s=this._cameraStack.indexOf(e);s>=0&&this._cameraStack.splice(s,1),this._cameraStack.push(e),this.mainCameraComponent=e;const o=e.threeCamera;o.isPerspectiveCamera&&this.updateAspect(o),(t=this.mainCameraComponent)==null||t.applyClearFlagsIfIsActiveCamera()}removeCamera(e){if(!e)return;const t=this._cameraStack.indexOf(e);if(t>=0&&this._cameraStack.splice(t,1),this.mainCameraComponent===e&&(this.mainCameraComponent=void 0,this._cameraStack.length>0)){const s=this._cameraStack[this._cameraStack.length-1];this.setCurrentCamera(s)}}addBeforeRenderListener(e,t){if(!this._onBeforeRenderListeners.has(e.uuid)){const s=[];this._onBeforeRenderListeners.set(e.uuid,s),e.onBeforeRender=this._createRenderCallbackWrapper(s)}this._onBeforeRenderListeners.get(e.uuid).push(t)}removeBeforeRenderListener(e,t){if(this._onBeforeRenderListeners.has(e.uuid)){const s=this._onBeforeRenderListeners.get(e.uuid),o=s.indexOf(t);o>=0&&s.splice(o,1)}}addAfterRenderListener(e,t){var s;if(!this._onAfterRenderListeners.has(e.uuid)){const o=[];this._onAfterRenderListeners.set(e.uuid,o),e.onAfterRender=this._createRenderCallbackWrapper(o)}(s=this._onAfterRenderListeners.get(e.uuid))==null||s.push(t)}removeAfterRenderListener(e,t){if(this._onAfterRenderListeners.has(e.uuid)){const s=this._onAfterRenderListeners.get(e.uuid),o=s.indexOf(t);o>=0&&s.splice(o,1)}}_createRenderCallbackWrapper(e){return(t,s,o,r,l,c)=>{for(let h=0;h<e.length;h++){const d=e[h];d(t,s,o,r,l,c)}}}get isRendering(){return this._isRendering}setRequireDepth(e){this._requireDepthTexture=e}setRequireColor(e){this._requireColorTexture=e}get depthTexture(){var e;return((e=this._renderTarget)==null?void 0:e.depthTexture)||null}get opaqueColorTexture(){var e;return((e=this._renderTarget)==null?void 0:e.texture)||null}get isVisibleToUser(){if(this.isInXR)return!0;if(!this._isVisible)return!1;const e=getComputedStyle(this.domElement);return e.visibility!=="hidden"&&e.display!=="none"&&e.opacity!=="0"}async internalOnCreate(e){var t,s,o,r,l,c,h;const d=++this._createId;et&&console.log("Creating context",this.name,e);const u=globalThis["needle:dependencies:ready"];u instanceof Promise&&(et&&console.log("Waiting for dependencies to be ready"),await u.catch(b=>{if(et||F()){if(tc("Needle Engine dependencies failed to load. Please check the console for more details"),b instanceof ReferenceError){let _="YourComponentName";const w=b.message.indexOf("'");if(w>0){const x=b.message.indexOf("'",w+1);if(x>0){const k=b.message.substring(w+1,x);k.length>3&&(_=k)}}console.error(`Needle Engine dependencies failed to load:
|
|
773
|
+
|
|
774
|
+
# Make sure you don't have circular imports in your scripts!
|
|
775
|
+
|
|
776
|
+
Possible solutions:
|
|
777
|
+
\u2192 Replace @serializable(${_}) in your script with @serializable(Behaviour)
|
|
778
|
+
\u2192 If you only need type information try importing the type only, e.g: import { type ${_} }
|
|
779
|
+
|
|
780
|
+
---`,b);return}console.error("Needle Engine dependencies failed to load",b)}}).then(()=>{et&&console.log("Needle Engine dependencies are ready")})),this.clear();const p=this.renderer,g=!p||p.isDisposed===!0;this.isManagedExternally===!1&&g?this.createNewRenderer():this.lodsManager.setRenderer(this.renderer),(t=this.renderer)==null||t.setAnimationLoop(null),await vs(1),Le.Current=this,await pe.dispatchCallback(me.ContextCreationStart,this);let f=!0,y;try{Le.Current=this,e?y=await this.internalLoadInitialContent(d,e):y=[]}catch(b){console.error(b),f=!1}if(!f)return this.onError("Failed to load initial content"),!1;if(d!==this._createId||(s=e?.abortSignal)!=null&&s.aborted)return!1;if(this.internalOnUpdateVisible(),!this.renderer)return et&&console.warn("Context has no renderer (perhaps it was disconnected?",this.domElement.isConnected),!1;!this.isManagedExternally&&!this.domElement.shadowRoot&&this.domElement.prepend(this.renderer.domElement),Le.Current=this,Le.Current=this;for(let b=0;b<this.new_scripts.length;b++){const _=this.new_scripts[b];if(_.gameObject!==void 0&&_.gameObject!==null){_.gameObject.userData===void 0&&(_.gameObject.userData={}),_.gameObject.userData.components===void 0&&(_.gameObject.userData.components=[]);const w=_.gameObject.userData.components;w.includes(_)||w.push(_)}}if(this.post_setup_callbacks)for(let b=0;b<this.post_setup_callbacks.length;b++)Le.Current=this,await this.post_setup_callbacks[b](this);if(!this._mainCamera){Le.Current=this;let b=null;Ar(this.scene,_=>{const w=_;if(w!=null&&w.isCamera){if(gc(w.gameObject),!w.activeAndEnabled)return;if(w.tag==="MainCamera")return b=w,!0;b=w}}),b?this.setCurrentCamera(b):!pe.dispatchCallback(me.MissingCamera,this,{files:y})&&!this.mainCamera&&!this.isManagedExternally&&console.warn("Missing camera in main scene",this)}this.input.bindEvents(),Le.Current=this,Kd(this),this.physics.engine&&((o=this.physics.engine)==null||o.step(0),(r=this.physics.engine)==null||r.postStep()),!this.isManagedExternally&&this.composer&&this.mainCamera,this._needsUpdateSize=!0,this._stats&&(this._stats.showPanel(0),this._stats.dom.style.position="absolute",(l=this.domElement.shadowRoot)==null||l.appendChild(this._stats.dom)),et&&Id(this.scene,!0),this.targetFrameRate===void 0?(et&&console.warn("No target framerate set, using default",Le.DefaultTargetFrameRate),this.targetFrameRate=Le._defaultTargetFramerate):et&&console.log("Target framerate set to",this.targetFrameRate),this._dispatchReadyAfterFrame=!0;const v=pe.dispatchCallback(me.ContextCreated,this,{files:y});if(v){const b=this.domElement;"internalSetLoadingMessage"in b&&typeof b.internalSetLoadingMessage=="function"&&b?.internalSetLoadingMessage("finish loading"),await v}return(c=e?.abortSignal)!=null&&c.aborted?!1:(Xs(this,me.ContextCreated),et&&console.log("Context Created...",this.renderer,this.renderer.domElement),this._isCreating=!1,!this.isManagedExternally&&!((h=e?.abortSignal)!=null&&h.aborted)&&this.restartRenderLoop(),!0)}async internalLoadInitialContent(e,t){var s,o,r,l;const c=new Array;if(t.files.length===0)return c;const h=[...t.files],d={name:"",progress:null,index:0,count:h.length},u=xs(),p=0;for(let g=0;g<h.length;g++){if((s=t.abortSignal)!=null&&s.aborted){et&&console.log("Aborting loading because of abort signal");break}if(e!==this._createId){et&&console.log("Aborting loading because create id changed",e,this._createId);break}const f=h[g];(o=t?.onLoadingStart)==null||o.call(this,g,f),et&&console.log("Context Load "+f);const y=await u.loadSync(this,f,f,p,v=>{var b,_;(b=t.abortSignal)!=null&&b.aborted||(d.name=f,d.progress=v,d.index=g,d.count=h.length,(_=t.onLoadingProgress)==null||_.call(this,d))});(r=t?.onLoadingFinished)==null||r.call(this,g,f,y??null),y?c.push({src:f,file:y}):console.warn("Could not load file: "+f)}if(e!==this._createId||(l=t.abortSignal)!=null&&l.aborted){et&&console.log("Aborting loading because create id changed or abort signal was set",e,this._createId);for(const g of c)if(g&&g.file)for(const f of g.file.scenes)Ai(f,!0,!0)}else{let g=!1;for(const f of c)f&&f.file&&(f.file.scene?(g=!0,this.scene.add(f.file.scene)):console.warn("No scene found in loaded file"));if(!g){for(const f of c)if(f&&f.file&&"parser"in f.file){let y=0;if(!Array.isArray(f.file.parser.json.materials))continue;for(let v=0;v<f.file.parser.json.materials.length;v++){const b=await f.file.parser.getDependency("material",v),_=new E;_.position.x=v*1.1,_.position.y=y,this.scene.add(_),wo.createPrimitive("ShaderBall",{parent:_,material:b})}y+=1}}}return c}restartRenderLoop(){return this.renderer?this._isCreating?(console.warn("Can not start render loop while creating context"),!1):(this.renderer.setAnimationLoop((e,t)=>{this.isManagedExternally||this.update(e,t)}),!0):(console.error("Can not start render loop without renderer"),!1)}update(e,t){if(t===void 0&&(t=null),F()||et||TM())try{this.internalStep(e,t),this._renderlooperrors=0}catch(s){this._renderlooperrors+=1,(F()||et)&&(s instanceof Error||s instanceof TypeError)&&De("Caught unhandled exception during render-loop - see console for details.",ki.Error),console.error("Frame #"+this.time.frame+`
|
|
781
|
+
`,s),this._renderlooperrors>=3&&(console.warn("Stopping render loop due to error"),this.renderer.setAnimationLoop(null)),this.domElement.dispatchEvent(new CustomEvent("error",{detail:s}))}else this.internalStep(e,t)}updatePhysics(e){this.internalUpdatePhysics(e)}internalStep(e,t){this.internalOnBeforeRender(e,t)!==!1&&(this.internalOnRender(),this.internalOnAfterRender())}internalOnBeforeRender(e,t){var s;this.renderer.info.autoReset=!!t,this.renderer.info.autoReset===!1&&this.renderer.info.reset();const o=t!==null&&this._xrFrame===null;if(this._xrFrame=t,o&&this.domElement.dispatchEvent(new CustomEvent("xr-session-started",{detail:{context:this,session:this.xrSession,frame:t}})),this._currentFrameEvent=-1,this.isManagedExternally===!1&&this.isInXR===!1&&this.targetFrameRate!==void 0){this._lastTimestamp===0&&(this._lastTimestamp=e),this._accumulatedTime+=(e-this._lastTimestamp)/1e3,this._lastTimestamp=e;let r=this.targetFrameRate;if(typeof r=="object"&&(r=r.value),this._accumulatedTime<1/(r+1))return!1;this._accumulatedTime=0}if((s=this._stats)==null||s.begin(),Le.Current=this,this.onHandlePaused())return!1;for(Le.Current=this,this.time.update(),TR&&console.log("FPS",this.time.smoothedFps.toFixed(0)),Kd(this),Zd(this.scene),$_(this),Xs(this,-1);this._cameraStack.length>0&&(!this.mainCameraComponent||this.mainCameraComponent.destroyed);){this._cameraStack.splice(this._cameraStack.length-1,1);const r=this._cameraStack[this._cameraStack.length-1];this.setCurrentCamera(r)}if(this.pre_update_oneshot_callbacks){for(const r in this.pre_update_oneshot_callbacks)this.pre_update_oneshot_callbacks[r]();this.pre_update_oneshot_callbacks.length=0}if(this.pre_update_callbacks)for(const r in this.pre_update_callbacks)this.pre_update_callbacks[r]();this._currentFrameEvent=0;for(let r=0;r<this.scripts_earlyUpdate.length;r++){const l=this.scripts_earlyUpdate[r];l.activeAndEnabled&&l.earlyUpdate!==void 0&&(Le.Current=this,l.earlyUpdate())}if(this.executeCoroutines(0),Xs(this,0),this.onHandlePaused())return!1;this._currentFrameEvent=1;for(let r=0;r<this.scripts_update.length;r++){const l=this.scripts_update[r];l.activeAndEnabled&&l.update!==void 0&&(Le.Current=this,l.update())}if(this.executeCoroutines(1),Xs(this,1),this.onHandlePaused())return!1;this._currentFrameEvent=2;for(let r=0;r<this.scripts_lateUpdate.length;r++){const l=this.scripts_lateUpdate[r];l.activeAndEnabled&&l.lateUpdate!==void 0&&(Le.Current=this,l.lateUpdate())}if(this.executeCoroutines(2),Xs(this,2),this.onHandlePaused()||(this.physicsSteps===void 0&&(this.physicsSteps=1),this.physics.engine&&this.physicsSteps>0&&this.internalUpdatePhysics(this.physicsSteps),this.onHandlePaused()))return!1;if(this.isVisibleToUser||this.runInBackground){this._currentFrameEvent=3;for(let r=0;r<this.scripts_onBeforeRender.length;r++){const l=this.scripts_onBeforeRender[r];l.activeAndEnabled&&l.onBeforeRender!==void 0&&(Le.Current=this,l.onBeforeRender(t))}if(this.executeCoroutines(3),Xs(this,3),this._needsUpdateSize&&this.updateSize(),this.pre_render_callbacks)for(const r in this.pre_render_callbacks)this.pre_render_callbacks[r](t)}return!0}internalUpdatePhysics(e){if(!this.physics.engine)return!1;const t=e,s=this.time.deltaTime/t;for(let o=0;o<t;o++)this._currentFrameEvent=9,this.executeCoroutines(9),this.physics.engine.step(s),this._currentFrameEvent=10,this.executeCoroutines(10);return this.physics.engine.postStep(),!0}internalOnRender(){this.isManagedExternally||(LM(this),this._currentFrameEvent=-1,eO.update(),this.renderNow(),this._currentFrameEvent=4)}internalOnAfterRender(){if(this.isVisibleToUser||this.runInBackground){for(let e=0;e<this.scripts_onAfterRender.length;e++){const t=this.scripts_onAfterRender[e];t.activeAndEnabled&&t.onAfterRender!==void 0&&(Le.Current=this,t.onAfterRender())}if(this.executeCoroutines(4),Xs(this,4),this.post_render_callbacks)for(const e in this.post_render_callbacks)this.post_render_callbacks[e]()}this._currentFrameEvent=-1,this.connection.sendBufferedMessagesNow(),this._stats&&(this._stats.end(),this.time.frameCount%150===0&&console.log(this.renderer.info.render.calls+" DrawCalls",`
|
|
782
|
+
Render:`,{...this.renderer.info.render},`
|
|
783
|
+
Memory:`,{...this.renderer.info.memory},`
|
|
784
|
+
Target Framerate: `+this.targetFrameRate)),this._dispatchReadyAfterFrame&&(this._dispatchReadyAfterFrame=!1,this.domElement.dispatchEvent(new CustomEvent("ready")),pe.dispatchCallback(me.ContextFirstFrameRendered,this))}renderNow(e){var t;if(!e&&(e=this.mainCamera,!e))return!1;if(this.handleRendererContextLost(),this._isRendering=!0,this.renderRequiredTextures(),this.renderer.toneMapping!==bd&&Hw(),this.composer&&!this.isInXR){e&&"setMainCamera"in this.composer&&((t=this.composer.passes[0])==null?void 0:t.mainCamera)!=e&&this.composer.setMainCamera(e);const s=this.renderer.getClearColor(this._tempClearColor);this._tempClearColor2.copy(s),this.renderer.setClearColor(s.convertSRGBToLinear()),this.composer.render(this.time.deltaTime),this.renderer.setClearColor(this._tempClearColor2)}else e&&(this.isInXR&&X.isMacOS()&&this.renderer.clearDepth(),this.renderer.render(this.scene,e));return this._isRendering=!1,!0}handleRendererContextLost(){this.time.frame%10&&this.renderer.getContext().isContextLost()&&this._contextRestoreTries++<100&&(console.warn("Attempting to recover WebGL context..."),this.renderer.forceContextRestore())}onHandlePaused(){const e=this.evaluatePaused();if(this._wasPaused!==e){RR&&console.log("Paused?",e,"context:"+this.alias);for(let t=0;t<this.scripts_pausedChanged.length;t++){const s=this.scripts_pausedChanged[t];s.activeAndEnabled&&s.onPausedChanged!==void 0&&(Le.Current=this,s.onPausedChanged(e,this._wasPaused))}}return this._wasPaused=e,e}evaluatePaused(){return this.isInXR?!1:this.isPaused?!0:this.runInBackground?!1:!this.isVisibleToUser}renderRequiredTextures(){if(!this.mainCamera||!this._requireDepthTexture&&!this._requireColorTexture)return;if(!this._renderTarget){if(this._renderTarget=new $s(this.domWidth,this.domHeight),this._requireDepthTexture){const s=new Lv(this.domWidth,this.domHeight);this._renderTarget.depthTexture=s}this._requireColorTexture&&(this._renderTarget.texture=new je,this._renderTarget.texture.generateMipmaps=!1,this._renderTarget.texture.minFilter=_d,this._renderTarget.texture.magFilter=_d,this._renderTarget.texture.format=fd)}const e=this._renderTarget;e.texture&&(e.texture.colorSpace=this.renderer.outputColorSpace);const t=this.renderer.getRenderTarget();this.renderer.setRenderTarget(e),this.renderer.render(this.scene,this.mainCamera),this.renderer.setRenderTarget(t)}executeCoroutines(e){var t;if(this.coroutines[e]){const o=this.coroutines[e];for(let r=0;r<o.length;r++)try{const l=o[r];if(!l.comp||l.comp.destroyed||!l.main||l.comp.enabled===!1){ER&&console.log("Removing coroutine",l.comp,l.comp.enabled),o.splice(r,1),--r;continue}const c=l.chained;if(c&&c.length>0){const u=c[c.length-1].next();if(u.done&&c.pop(),s(u)&&(l.chained||(l.chained=[]),l.chained.push(u.value)),!u.done)continue}const h=l.main.next();if(h.done===!0){o.splice(r,1),--r;continue}const d=h.value;if(s(d)){if(d.next().done)continue;l.chained||(l.chained=[]),l.chained.push(d)}else if(d instanceof Promise){const u=d;l.chained||(l.chained=[]);const p=Iw(u);(t=l.chained)==null||t.push(p);continue}}catch(l){console.error(l)}}function s(o){return!!(o&&o.next&&o.return)}}};a(Rf,"_defaultTargetFramerate",{value:90,toString(){return this.value}}),a(Rf,"_defaultWebglRendererParameters",{antialias:!0,alpha:!1,powerPreference:X.isiOS()||X.isMacOS()?"default":"high-performance",stencil:!0});let J=Rf;const Ii=C("debuglicense"),ex=[];let Ks="basic";Ii&&console.log("License Type: "+Ks);function Zs(){switch(Ks){case"pro":case"enterprise":return!0}return!1}function kc(){switch(Ks){case"indie":return!0}return!1}function Tf(){switch(Ks){case"edu":return!0}return!1}function Js(){return Zs()||kc()||Tf()}function LR(n){if(Zs()||kc()||Tf())return n(!0);ex.push(n)}function _u(n){for(const e of ex)try{e(n)}catch{}}pe.registerCallback(me.ContextRegistered,n=>{BR(n.context),DR(n.context),setTimeout(()=>UR(n.context),2e3)});let jr,Ef=!1,wu="";async function jR(){if(jr)return jr;if(Ks==="basic")try{const n="https://engine.needle.tools/licensing/check?location="+encodeURIComponent(window.location.href)+"&version="+ws+"&generator="+encodeURIComponent(jd),e=await fetch(n,{method:"GET"}).catch(t=>{Ii&&console.error("License check failed",t)});e?.status===200?(Ef=!1,Ii&&console.log("License check succeeded"),Ks="pro",_u(!0)):e?.status===403?(_u(!1),Ef=!0,wu=await e.text()):(_u(!1),Ii&&console.log("License check failed with status "+e?.status))}catch(n){_u(!1),Ii&&console.error("License check failed",n)}else Ii&&console.log('Runtime license check is skipped because license is already applied as "'+Ks+'"')}jr=jR();async function DR(n){function e(){const o=document.createElement("div");o.className="needle-forbidden",o.style.cssText=`
|
|
785
|
+
position: fixed;
|
|
786
|
+
top: 0;
|
|
787
|
+
left: 0;
|
|
788
|
+
width: 100%;
|
|
789
|
+
height: 100%;
|
|
790
|
+
pointer-events: all;
|
|
791
|
+
zIndex: 2147483647;
|
|
792
|
+
line-height: 1.5;
|
|
793
|
+
backdrop-filter: blur(15px);
|
|
794
|
+
-webkit-backdrop-filter: blur(15px);
|
|
795
|
+
`;const r=o.style.cssText,l=document.createElement("div");o.appendChild(l),l.style.cssText=`
|
|
796
|
+
position: absolute;
|
|
797
|
+
left: 0;
|
|
798
|
+
right: 0;
|
|
799
|
+
top:0;
|
|
800
|
+
bottom: 0;
|
|
801
|
+
padding: 10%;
|
|
802
|
+
color: white;
|
|
803
|
+
font-size: 20px;
|
|
804
|
+
font-family: sans-serif;
|
|
805
|
+
text-align: center;
|
|
806
|
+
pointer-events: all;
|
|
807
|
+
display: flex;
|
|
808
|
+
justify-content: center;
|
|
809
|
+
align-items: center;
|
|
810
|
+
background-color: rgba(0,0,0,.3);
|
|
811
|
+
text-shadow: 0 0 2px black;
|
|
812
|
+
`;const c=l.style.cssText,h=wu?.length>1?wu:"This web application has been paused.<br/>You might be in violation of the Needle Engine terms of use.<br/>Please contact the Needle support if you think this is a mistake.";return l.innerHTML=h,setInterval(()=>{l.innerHTML!==h&&(l.innerHTML=h),l.parentNode!==o&&o.appendChild(l),o.style.cssText!==r&&(o.style.cssText=r),l.style.cssText!==c&&(l.style.cssText=c)},500),o}let t=e();const s=t.style.cssText;setInterval(()=>{var o;Ef===!0&&(t.style.cssText!==s&&(t=e()),n.domElement.shadowRoot?t.parentNode!==n.domElement.shadowRoot&&((o=n.domElement.shadowRoot)==null||o.appendChild(t)):t.parentNode!=document.body&&document.body.appendChild(t))},500)}async function BR(n){try{if(!Zs()&&!kc())return Af(n)}catch(e){return Ii&&console.log("License check failed",e),Af(n)}Ii&&Af(n)}async function Af(n){let e=!1;n.domElement.addEventListener("ready",()=>e=!0),await jr?.catch(()=>{}),!(Zs()||kc())&&(Js()===!1&&FR(),e?If(n):n.domElement.addEventListener("ready",()=>{If(n)}))}function If(n){var e;const t=`
|
|
813
|
+
position: relative;
|
|
814
|
+
display: block;
|
|
815
|
+
background-size: 20px;
|
|
816
|
+
background-position: 10px 5px;
|
|
817
|
+
background-repeat:no-repeat;
|
|
818
|
+
background-image:url('${tx}');
|
|
819
|
+
background-max-size: 40px;
|
|
820
|
+
padding: 10px;
|
|
821
|
+
padding-left: 30px;
|
|
822
|
+
`;if(Ks==="edu")console.log("%c This project is supported by Needle for Education \u2013 https://needle.tools",t);else return;const s=document.createElement("div");s.className="needle-non-commercial-use",s.innerHTML="Made with Needle for Education",(e=n.domElement.shadowRoot)==null||e.appendChild(s);let o=`
|
|
823
|
+
position: absolute;
|
|
824
|
+
font-family: system-ui, Avenir, Helvetica, Arial, sans-serif;
|
|
825
|
+
font-size: 12px;
|
|
826
|
+
color: rgb(100, 100, 100);
|
|
827
|
+
/*mix-blend-mode: difference;*/
|
|
828
|
+
background-color: transparent;
|
|
829
|
+
z-index: 10000;
|
|
830
|
+
|
|
831
|
+
cursor: pointer;
|
|
832
|
+
user-select: none;
|
|
833
|
+
opacity: 0;
|
|
834
|
+
|
|
835
|
+
bottom: 6px;
|
|
836
|
+
right: 12px;
|
|
837
|
+
transform: translateY(0px);
|
|
838
|
+
transition: all .5s ease-in-out 1s;
|
|
839
|
+
`;s.style.cssText=o,s.addEventListener("click",()=>{window.open("https://needle.tools","_blank")});let r=s.style.cssText;setTimeout(()=>{o=o.replace("opacity: 0","opacity: 1"),o=o.replace("transform: translateY(10px)","transform: translateY(0)"),s.style.cssText=o,r=s.style.cssText},100);const l=setInterval(()=>{const c=n.domElement.shadowRoot||n.domElement;s.parentNode!==c&&c.appendChild(s),r!=s.style.cssText&&(s.style.cssText=o,r=s.style.cssText)},1e3);Tf()&&setTimeout(()=>{clearInterval(l),s?.remove(),setTimeout(()=>{n.domElement.parentNode&&If(n)},1e3*60*5)},2e4)}const tx="data:image/webp;base64,UklGRrABAABXRUJQVlA4WAoAAAAQAAAAHwAAHwAAQUxQSKEAAAARN6CmbSM4WR7vdARON11EBDq3fLiNbVtVzpMCPlKAEzsx0Y/x+Ovuv4dn0EFE/ydAvz6YggXzgh5sVgXM/zOC/4sii7qgGvB5N7hmuQYwkvazWAu1JPW41FXSHq6pnaQWvqYH18Fc0j1hO/BFTtIeSBlJi5w6qIIO7IOrwhFsB2Yxukif0FTRLpXswHR8MxbslKe9VZsn/Ub5C7YFOpqSTABWUDgg6AAAAFAGAJ0BKiAAIAA+7VyoTqmkpCI3+qgBMB2JbACdMt69DwMIQBLhkTO6XwY00UEDK6cNIDnuNibPf0EgAP7Y1myuiQHLDsF/0h5unrGh6WAbv7aegg2ZMd3uRKfT/3SJztcaujYfTvMXspfCTmYcoO6a+vhC3ss4M8uM58t4siiu59I4aOl59e9Sr6xoxYlHf2v+NnBNpJYeJf8jABQAId/PXuBkLEFkiCucgSGEcfhvajql/j3reCGl0M5/9gQWy7ayNPs+wlvIxFnNfSlfuND4CZOCyxOHhRqOmHN4ULHo3tCSrUNvgAA=";let ix=0;async function FR(n){var e;const t=Date.now();if(t-ix<2e3)return;ix=t;const s=`
|
|
840
|
+
position: relative;
|
|
841
|
+
display: block;
|
|
842
|
+
font-size: 18px;
|
|
843
|
+
background-size: 20px;
|
|
844
|
+
background-position: 10px 5px;
|
|
845
|
+
background-repeat:no-repeat;
|
|
846
|
+
background-image:url('${tx}');
|
|
847
|
+
background-max-size: 40px;
|
|
848
|
+
margin-bottom: 5px;
|
|
849
|
+
margin-top: .3em;
|
|
850
|
+
margin-bottom: .5em;
|
|
851
|
+
padding: .2em;
|
|
852
|
+
padding-left: 25px;
|
|
853
|
+
border-radius: .5em;
|
|
854
|
+
border: 2px solid rgba(160,160,160,.3);
|
|
855
|
+
`,o=`Needle Engine \u2014 No license active, commercial use is not allowed. Visit https://needle.tools/pricing for more information and licensing options! v${ws}`;(e=J.Current)!=null&&e.xr?console.log(o):console.log("%c "+o,s)}async function UR(n){var e,t;if(!window.crossOriginIsolated){if(Ks==="pro"){const s=(e=n?.domElement)==null?void 0:e.getAttribute("no-telemetry");if(s===""||s==="true"||s==="1"){Ii&&console.debug("Telemetry is disabled");return}Ii&&console.debug("Telemetry attribute: "+s)}try{const s="https://needle-engine-analytics-v2-r26roub2hq-lz.a.run.app";if(s){const o=window.location.href.split("?")[0];let r="api/v2/new/request";s.endsWith("/")||(r="/"+r);const l=Ks,c=`${s}${r}`;Ii&&console.debug("Sending beacon");const h={license:l,url:o,hostname:window.location.hostname,pathname:window.location.pathname,version:ws,generator:jd,build_time:_g,public_key:nc},d=(t=navigator.sendBeacon)==null?void 0:t.call(navigator,c,JSON.stringify(h));Ii&&console.debug("Sent beacon: "+d)}}catch(s){Ii&&console.log("Failed to send non-commercial usage message to analytics backend",s)}}}const zR=C("debugdecoders");let Lf=null;function sx(){if(!Lf){const n=Nm(null);Lf={dracoLoader:n.dracoLoader,ktx2Loader:n.ktx2Loader,meshoptDecoder:n.meshoptDecoder}}return Lf}function nx(n){n!==void 0&&typeof n=="string"&&QP(n)}function ox(n){if(n!==void 0&&typeof n=="string"&&n!=="js"){const e=sx();zR&&console.log("Setting draco decoder type to",n),e.dracoLoader.setDecoderConfig({type:n})}}function rx(n){n!==void 0&&typeof n=="string"&&XP(n)}function jf(n,e){const t=sx();return e.renderer?t.ktx2Loader.detectSupport(e.renderer):console.warn("No renderer provided to detect ktx2 support - loading KTX2 textures will probably fail"),GP(n),n.dracoLoader||n.setDRACOLoader(t.dracoLoader),n.ktx2Loader||n.setKTX2Loader(t.ktx2Loader),n.meshoptDecoder||n.setMeshoptDecoder(t.meshoptDecoder),qP(n,{progressive:!0}),n}const Dr=function(n){return m(n)},m=function(n){if(n===void 0&&(n=null),!Array.isArray(n))n=ax(n);else for(let e=0;e<n.length;e++){const t=n[e];n[e]=ax(t)}return function(e,t){if(!e){console.error("Found @serializable decorator without a target");return}typeof t!="string"&&(t=t.name),Object.getOwnPropertyDescriptor(e,"$serializedTypes")||(e.$serializedTypes={});const s=e.$serializedTypes=e.$serializedTypes||{};s[t]=n}};function ax(n){var e,t;switch((t=(e=n?.prototype)==null?void 0:e.constructor)==null?void 0:t.name){case"Number":case"String":case"Boolean":return null}return n}const Oo=C("debughotreload");let Mc=!1;const Rc=new Map;function NR(){return Mc}function Df(){return globalThis.NEEDLE_HOT_RELOAD_ENABLED===!0}function lx(n){var e;if(Mc){Oo&&console.warn("[Needle Engine] Hot reloading is in progress, not registering instance",n);return}Oo&&console.log("[Needle Engine] Registering hot reload instance",n);const t=n.constructor.name;Rc.has(t)?(e=Rc.get(t))==null||e.push(n):Rc.set(t,[n])}function cx(n){if(Mc){Oo&&console.warn("[Needle Engine] Hot reloading is in progress, not unregistering instance",n);return}Oo&&console.log("[Needle Engine] Unregistering hot reload instance",n);const e=n.constructor.name,t=Rc.get(e);if(!t)return;const s=t.indexOf(n);s!==-1&&t.splice(s,1)}let hx=!1;function WR(){if(Oo||hx)return;hx=!0;const n=console.error;console.error=(...e)=>{if(e.length){const t=e[0];if(typeof t=="string"&&t.includes("[hmr] Failed to reload ")){console.log("[Needle Engine] Hot reloading failed"),window.location.reload();return}}n.apply(console,e)}}function VR(n){Oo&&console.log("[HMR] Apply changes",n,Object.keys(n)),WR();for(const e of Object.keys(n))try{Mc=!0;const t=R.get(e);if(!t){Oo&&console.log("[HMR] Type not found: "+e);continue}const s=n[e],o=Rc.get(s.name);let r="[Needle Engine] Updating type: "+e;const l=o?.length??-1;l>0?r+=" x"+l:r+=" (No instances registered)",console.log(r);const c=Object.getOwnPropertyNames(t.prototype),h=Object.getOwnPropertyDescriptors(s.prototype);for(const d in h)h[d].writable&&(t.prototype[d]=n[e].prototype[d]);for(const d of c)h[d]||delete t.prototype[d];if(o){const d=new s,u=Object.getOwnPropertyDescriptors(d);for(const p of o){const g=p,f=g.isComponent===!0,y=f?g.activeAndEnabled:!0,v=f?g.context:void 0;try{if(f&&v&&Dn(g,v),f&&y&&(g.enabled=!1),p.onBeforeHotReloadFields&&p.onBeforeHotReloadFields()===!1)continue;for(const b in u)if(u[b].writable){if(p[b]===void 0)p[b]=d[b];else if(typeof p[b]=="function"&&!p[b].prototype){const _=p[b],w=_.name,x="bound ";if(w===x)continue;const k=_.name.substring(x.length),M=s.prototype[k];M&&(p[b]=M.bind(p))}}p.onAfterHotReloadFields&&p.onAfterHotReloadFields()}finally{f&&v&&Kg(g,v),f&&y&&(g.enabled=!0)}}}}catch(t){if(Oo)console.error(t);else return!1}finally{Mc=!1,Hs(ki.Log,"Script changes applied (HMR)")}return!0}class P extends E{constructor(){super(...arguments),a(this,"guid")}static isDestroyed(e){return Er(e)}static setActive(e,t,s=!0){e&&(Sc(e,t),Zd(e),t&&s&&$_(J.Current,e))}static isActiveSelf(e){return Wa(e)}static isActiveInHierarchy(e){return _w(e)}static markAsInstancedRendered(e,t){ww(e,t)}static isUsingInstancing(e){return au(e)}static foreachComponent(e,t,s=!0){return Ar(e,t,s)}static instantiateSynced(e,t){return e?of(e,t):null}static instantiate(e,t=null){return"isAssetReference"in e,$a(e,t)}static destroySynced(e,t,s=!0){if(!e)return;const o=e;t=t??J.Current,fc(o,t.connection,s)}static destroy(e,t=!0){return Ai(e,t)}static add(e,t,s){if(!(!e||!t)){if(e===t){console.warn("Can not add object to self",e);return}s||(s=J.Current),t.add(e),Sc(e,!0),Zd(e),s?P.foreachComponent(e,o=>{Kg(o,s),!o.__internalDidAwakeAndStart&&s.new_script_start.includes(o)===!1&&s.new_script_start.push(o)},!0):console.warn("Missing context")}}static remove(e){var t;e&&((t=e.parent)==null||t.remove(e),Sc(e,!1),Zd(e),P.foreachComponent(e,s=>{EM(s)},!0))}static invokeOnChildren(e,t,...s){this.invoke(e,t,!0,s)}static invoke(e,t,s=!1,...o){e&&this.foreachComponent(e,r=>{const l=r[t];l&&typeof l=="function"&&l?.call(r,...o)},s)}static addNewComponent(e,t,s,o=!0){return Ei(e,t,s,{callAwake:o})}static addComponent(e,t,s,o){return Ei(e,t,s,o)}static moveComponent(e,t){return Ei(e,t)}static removeComponent(e){return mf(e.gameObject,e),e}static getOrAddComponent(e,t){return vc(e,t)}static getComponent(e,t){return e===null?null:Rr(e,t)}static getComponents(e,t,s=null){return e===null?s??[]:bc(e,t,s)}static findByGuid(e,t){return gf(e,t)}static findObjectOfType(e,t,s=!0){return xc(e,t??J.Current,s)}static findObjectsOfType(e,t){const s=[];return bw(e,s,t),s}static getComponentInChildren(e,t){return _c(e,t)}static getComponentsInChildren(e,t,s=null){return Na(e,t,s??void 0)}static getComponentInParent(e,t){return wc(e,t)}static getComponentsInParent(e,t,s=null){return nu(e,t,s)}static getAllComponents(e){var t;const s=(t=e.userData)==null?void 0:t.components;return s?[...s]:[]}static*iterateComponents(e){var t;const s=(t=e?.userData)==null?void 0:t.components;if(s&&Array.isArray(s))for(let o=0;o<s.length;o++)yield s[o]}}const xu=class bm{constructor(e){a(this,"__context"),a(this,"__name"),a(this,"gameObject"),a(this,"guid","invalid"),a(this,"sourceId"),a(this,"__didAwake",!1),a(this,"__didStart",!1),a(this,"__didEnable",!1),a(this,"__isEnabled"),a(this,"__destroyed",!1),a(this,"_eventListeners",new Map),this.__didAwake=!1,this.__didStart=!1,this.__didEnable=!1,this.__isEnabled=void 0,this.__destroyed=!1,this._internalInit(e),Df()&&lx(this)}get isComponent(){return!0}get context(){return this.__context??J.Current}set context(e){this.__context=e}get scene(){return this.context.scene}get layer(){var e,t;return(t=(e=this.gameObject)==null?void 0:e.userData)==null?void 0:t.layer}get name(){var e,t;return(e=this.gameObject)!=null&&e.name?this.gameObject.name:(t=this.gameObject)==null?void 0:t.userData.name}set name(e){this.gameObject?(this.gameObject.userData||(this.gameObject.userData={}),this.gameObject.userData.name=e,this.__name=e):this.__name=e}get tag(){var e;return(e=this.gameObject)==null?void 0:e.userData.tag}set tag(e){this.gameObject&&(this.gameObject.userData||(this.gameObject.userData={}),this.gameObject.userData.tag=e)}get static(){var e;return(e=this.gameObject)==null?void 0:e.userData.static}set static(e){this.gameObject&&(this.gameObject.userData||(this.gameObject.userData={}),this.gameObject.userData.static=e)}get activeAndEnabled(){return!(this.destroyed||this.__isEnabled===!1||!this.__isActiveInHierarchy)}get __isActive(){return this.gameObject.visible}get __isActiveInHierarchy(){if(!this.gameObject)return!1;const e=this.gameObject[En];return e===void 0?!0:e}set __isActiveInHierarchy(e){this.gameObject&&(this.gameObject[En]=e)}awake(){}onEnable(){}onDisable(){}onDestroy(){this.__destroyed=!0}startCoroutine(e,t=Oe.Update){return this.context.registerCoroutineUpdate(this,e,t)}stopCoroutine(e,t=Oe.Update){this.context.unregisterCoroutineUpdate(e,t)}get destroyed(){return this.__destroyed}destroy(){this.__destroyed||this.__internalDestroy()}get __internalDidAwakeAndStart(){return this.__didAwake&&this.__didStart}__internalNewInstanceCreated(e){return this.__didAwake=!1,this.__didStart=!1,this.__didEnable=!1,this.__isEnabled=void 0,this.__destroyed=!1,this._internalInit(e),this}_internalInit(e){if(typeof e=="object")for(const t of Object.keys(e)){const s=e[t];typeof s!="function"&&(this[t]=s)}}__internalAwake(){this.__didAwake||(this.__didAwake=!0,this.awake())}__internalStart(){this.__didStart||(this.__didStart=!0,this.start&&this.start())}__internalEnable(e){return this.__destroyed?(F()&&console.warn("[Needle Engine Dev] Trying to enable destroyed component"),!1):this.__didAwake?this.__didEnable?(e!==!0&&(this.__isEnabled=!0),!1):(this.__didEnable=!0,this.__isEnabled=!0,this.onEnable(),!0):!1}__internalDisable(e){if(this.__didAwake){if(!this.__didEnable){e!==!0&&(this.__isEnabled=!1);return}this.__didEnable=!1,this.__isEnabled=!1,this.onDisable()}}__internalDestroy(){var e;this.__destroyed||(this.__destroyed=!0,this.__didAwake&&((e=this.onDestroy)==null||e.call(this),this.dispatchEvent(new CustomEvent("destroyed",{detail:this}))),fw(this),Df()&&cx(this))}get enabled(){return typeof this.__isEnabled=="boolean"?this.__isEnabled:!0}set enabled(e){if(this.__destroyed){F()&&console.warn(`[Needle Engine Dev] Trying to ${e?"enable":"disable"} destroyed component`);return}if(typeof e=="number"&&(e>=.5?e=!0:e=!1),!this.__didAwake){this.__isEnabled=e;return}e?this.__internalEnable():this.__internalDisable()}get worldPosition(){return ee(this.gameObject)}set worldPosition(e){lt(this.gameObject,e)}setWorldPosition(e,t,s){br(this.gameObject,e,t,s)}get worldQuaternion(){return Se(this.gameObject)}set worldQuaternion(e){Yi(this.gameObject,e)}setWorldQuaternion(e,t,s,o){dg(this.gameObject,e,t,s,o)}get worldEuler(){return ug(this.gameObject)}set worldEuler(e){pg(this.gameObject,e)}get worldRotation(){return this.gameObject.worldRotation}set worldRotation(e){this.setWorldRotation(e.x,e.y,e.z,!0)}setWorldRotation(e,t,s,o=!0){Kl(this.gameObject,e,t,s,o)}get forward(){return bm._forward.set(0,0,-1).applyQuaternion(this.worldQuaternion)}get right(){return bm._right.set(1,0,0).applyQuaternion(this.worldQuaternion)}get up(){return bm._up.set(0,1,0).applyQuaternion(this.worldQuaternion)}addEventListener(e,t){this._eventListeners[e]=this._eventListeners[e]||[],this._eventListeners[e].push(t)}removeEventListener(e,t){if(!this._eventListeners[e])return;const s=this._eventListeners[e].indexOf(t);s>=0&&this._eventListeners[e].splice(s,1)}dispatchEvent(e){if(!e||!this._eventListeners[e.type])return!1;const t=this._eventListeners[e.type];for(let s=0;s<t.length;s++)t[s](e);return!1}};a(xu,"_forward",new S),a(xu,"_right",new S),a(xu,"_up",new S);let I=xu;const $R=Object.freeze(Object.defineProperty({__proto__:null,Behaviour:I,Component:I,GameObject:P},Symbol.toStringTag,{value:"Module"}));var HR=Object.defineProperty,dx=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&HR(e,t,o),o};class Tc extends I{constructor(){super(...arguments),a(this,"from"),a(this,"to"),a(this,"width",0),a(this,"centered",!0),a(this,"_centerPos")}awake(){this._centerPos=new S}update(){if(!this.from||!this.to)return;const e=ee(this.from).clone(),t=ee(this.to).clone(),s=e.distanceTo(t);this._centerPos.copy(e),this._centerPos.add(t),this._centerPos.multiplyScalar(.5),lt(this.gameObject,this.centered?this._centerPos:e),this.gameObject.lookAt(ee(this.to).clone()),this.gameObject.scale.set(this.width,this.width,s)}}dx([m(P)],Tc.prototype,"from"),dx([m(P)],Tc.prototype,"to");var GR=Object.defineProperty,qR=Object.getOwnPropertyDescriptor,Br=(n,e,t,s)=>{for(var o=s>1?void 0:s?qR(e,t):e,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=(s?l(e,t,o):l(o))||o);return s&&o&&GR(e,t,o),o};const ko=C("debuganimation");let ux=class{constructor(){a(this,"x"),a(this,"y")}};class Ft extends I{constructor(){super(...arguments),a(this,"playAutomatically",!0),a(this,"randomStartTime",!0),a(this,"minMaxSpeed"),a(this,"minMaxOffsetNormalized"),a(this,"loop",!0),a(this,"clampWhenFinished",!1),a(this,"_tempAnimationClipBeforeGameObjectExisted",null),a(this,"_tempAnimationsArray"),a(this,"mixer"),a(this,"_actions"),a(this,"_handles")}get isAnimationComponent(){return!0}addClip(e){this.animations||(this.animations=[]),this.animations.push(e)}get time(){if(this.actions){for(const e of this.actions)if(e.isRunning())return e.time}return 0}set time(e){if(this.actions)for(const t of this.actions)t.time=e}get clip(){var e;return(e=this.animations)!=null&&e.length?this.animations[0]:null}set clip(e){if(!this.__didAwake){ko&&console.warn("Assign clip during serialization",e),this._tempAnimationClipBeforeGameObjectExisted=e;return}e&&(this.gameObject.animations||(this.gameObject.animations=[]),!this.animations.includes(e)&&(this.animations.length>0?this.animations.splice(0,0,e):this.animations.push(e)))}set clips(e){this.animations=e}set animations(e){e==null||!Array.isArray(e)||(this.gameObject?this.gameObject.animations=e:this._tempAnimationsArray=e)}get animations(){return this.gameObject.animations||this._tempAnimationsArray||[]}get actions(){return this._actions}set actions(e){this._actions=e}awake(){this.mixer=void 0,ko&&console.log("Animation Awake",this.name,this),this._tempAnimationsArray&&(this.animations=this._tempAnimationsArray,this._tempAnimationsArray=void 0),this._tempAnimationClipBeforeGameObjectExisted&&(this.clip=this._tempAnimationClipBeforeGameObjectExisted,this._tempAnimationClipBeforeGameObjectExisted=null),this.actions=[],this._handles=[]}onEnable(){var e;if(this.playAutomatically&&((e=this.animations)==null?void 0:e.length)>0){const t=Math.floor(Math.random()*this.animations.length),s=this.animations[t];this.play(t,{exclusive:!0,fadeDuration:0,startTime:this.randomStartTime?Math.random()*s.duration:0,loop:this.loop,clampWhenFinished:this.clampWhenFinished})}}update(){this.mixer&&(this.mixer.update(this.context.time.deltaTime),this._handles.forEach(e=>e.update()))}onDisable(){this.mixer&&this.mixer.stopAllAction()}onDestroy(){this.context.animations.unregisterAnimationMixer(this.mixer)}getAction(e){var t;return((t=this.actions)==null?void 0:t.find(s=>s.getClip().name===e))||null}get isPlaying(){if(this.actions){for(let e=0;e<this.actions.length;e++)if(this.actions[e].isRunning())return!0}return!1}stopAll(e){if(this.actions)for(const t of this.actions)e!=null&&e.fadeDuration?t.fadeOut(e.fadeDuration):t.stop()}stop(e,t){if(e===void 0){this.stopAll();return}else if(typeof e=="number"){if(e>=this.animations.length){ko&&console.log("No animation at index",e);return}e=this.animations[e]}else typeof e=="string"&&(e=this.animations.find(o=>o.name===e));if(!e){console.error("Could not find clip",e);return}const s=this.actions.find(o=>o.getClip()===e);if(!s){console.error("Could not find action",e);return}t!=null&&t.fadeDuration?s.fadeOut(t.fadeDuration):s.stop()}pause(e,t=!1){if(e===void 0){for(const o of this.actions)o.paused=!t;return}else if(typeof e=="number"){if(e>=this.animations.length){ko&&console.log("No animation at index",e);return}e=this.animations[e]}else typeof e=="string"&&(e=this.animations.find(o=>o.name===e));if(!e){console.error("Could not find clip",e);return}const s=this.actions.find(o=>o.getClip()===e);if(!s){console.error("Could not find action",e);return}s.paused=!t}resume(){for(const e of this.actions)e.paused=!1}play(e=0,t){if(ko&&console.log("PLAY",e),this.ensureMixer(),!this.mixer){ko&&console.warn("Missing mixer",this);return}e===void 0&&(e=0);let s=e;if(typeof e=="number"){if(e>=this.animations.length){ko&&console.log("No animation at index",e);return}s=this.animations[e]}else typeof e=="string"&&(s=this.animations.find(r=>r.name===e));if(!s){console.error("Could not find clip",e);return}t||(t={});for(const r of this.actions)if(r.getClip()===s)return this.internalOnPlay(r,t);if(!s.tracks){console.warn("Clip is no AnimationClip",s);return}const o=this.mixer.clipAction(s);return this.actions.push(o),this.internalOnPlay(o,t)}internalOnPlay(e,t){var s=this.actions.find(r=>r===e);if(s===e&&s.isRunning()&&s.time<s.getClip().duration){const r=this.tryFindHandle(e);if(s.paused&&(s.paused=!1),r)return r.waitForFinish()}if(t.loop===void 0&&(t.loop=this.loop),t.clampWhenFinished===void 0&&(t.clampWhenFinished=this.clampWhenFinished),t.minMaxOffsetNormalized===void 0&&this.randomStartTime&&(t.minMaxOffsetNormalized=this.minMaxOffsetNormalized),t.minMaxSpeed===void 0&&(t.minMaxSpeed=this.minMaxSpeed),t?.exclusive??!0)for(const r of this.actions)r!=s&&(t.fadeDuration?r.fadeOut(t.fadeDuration):r.stop());if(t!=null&&t.fadeDuration&&e.fadeIn(t.fadeDuration),e.enabled=!0,t?.startTime!=null)e.time=t.startTime;else if(t!=null&&t.minMaxOffsetNormalized&&t.minMaxOffsetNormalized.x!=0&&t.minMaxOffsetNormalized.y!=0){const r=e.getClip();e.time=W.lerp(t.minMaxOffsetNormalized.x,t.minMaxOffsetNormalized.y,Math.random())*r.duration}else e.time>=e.getClip().duration&&(e.time=0);t!=null&&t.minMaxSpeed?e.timeScale=W.lerp(t.minMaxSpeed.x,t.minMaxSpeed.y,Math.random()):e.timeScale=t?.speed??1,t?.loop!=null?e.loop=t.loop?qC:Im:e.loop=Im,t!=null&&t.clampWhenFinished&&(e.clampWhenFinished=!0),e.paused=!1,e.play(),ko&&console.log("PLAY",e.getClip().name,e);const o=new XR(e,this.mixer,t,r=>{this._handles.splice(this._handles.indexOf(o),1)});return this._handles.push(o),o.waitForFinish()}tryFindHandle(e){for(const t of this._handles)if(t.action===e)return t}ensureMixer(){if(!this.mixer){const e="animationMixer";this.gameObject[e]&&(this.mixer=this.gameObject[e]),(!this.mixer||!this.mixer.clipAction)&&(this.mixer=new Lm(this.gameObject),this.gameObject[e]=this.mixer)}this.context.animations.registerAnimationMixer(this.mixer)}}Br([m()],Ft.prototype,"playAutomatically",2),Br([m()],Ft.prototype,"randomStartTime",2),Br([m(ux)],Ft.prototype,"minMaxSpeed",2),Br([m(ux)],Ft.prototype,"minMaxOffsetNormalized",2),Br([m()],Ft.prototype,"loop",2),Br([m()],Ft.prototype,"clampWhenFinished",2),Br([m(go)],Ft.prototype,"clips",1);class XR{constructor(e,t,s,o){a(this,"mixer"),a(this,"action"),a(this,"promise",null),a(this,"_options"),a(this,"_resolveCallback",null),a(this,"_resolvedOrRejectedCallback"),a(this,"onFinished",r=>{r.action===this.action&&this.onResolve()}),this.action=e,this.mixer=t,this._resolvedOrRejectedCallback=o,this._options=s}waitForFinish(){return this.promise?this.promise:(this.promise=new Promise(e=>{this._resolveCallback=e}),this.mixer.addEventListener("finished",this.onFinished),this.promise)}update(){this._options&&this._options.endTime!==void 0&&this.action.time>this._options.endTime&&(this._options.loop===!0?this.action.time=this._options.startTime??0:(this.action.time=this._options.endTime,this.action.timeScale=0,this.onResolve()))}onResolve(){var e,t;this.dispose(),(e=this._resolvedOrRejectedCallback)==null||e.call(this,this),(t=this._resolveCallback)==null||t.call(this,this.action)}dispose(){this.mixer.removeEventListener("finished",this.onFinished)}}const Su=Symbol("objectIsAnimatedData");function px(n,e,t){if(!n)return;if(n[Su]===void 0){if(!t)return;n[Su]=new Set}const s=n[Su];t?s.add(e):s.has(e)&&s.delete(e)}function QR(n){if(!n)return!1;const e=n[Su];return e!==void 0&&e.size>0}class YR{constructor(){a(this,"_context")}get context(){return this._context??J.Current}get isStateMachineBehaviour(){return!0}}class Ec{constructor(e,t,s,o){a(this,"name"),a(this,"nameHash"),a(this,"normalizedTime"),a(this,"length"),a(this,"speed"),a(this,"action"),a(this,"hasTransitions");var r;this.name=e.name,this.nameHash=e.hash,this.normalizedTime=t,this.length=s,this.speed=o,this.action=e.motion.action||null,this.hasTransitions=((r=e.transitions)==null?void 0:r.length)>0||!1}}function mx(n,e){return{name:"Empty",isLooping:!1,guid:e?.generateUUID()??Cn.generateUUID(),index:-1,clip:new go(n,0,[])}}var Mo=(n=>(n[n.If=1]="If",n[n.IfNot=2]="IfNot",n[n.Greater=3]="Greater",n[n.Less=4]="Less",n[n.Equals=6]="Equals",n[n.NotEqual=7]="NotEqual",n))(Mo||{}),Bf=(n=>(n[n.Float=1]="Float",n[n.Int=3]="Int",n[n.Bool=4]="Bool",n[n.Trigger=9]="Trigger",n))(Bf||{});const ht=C("debuganimatorcontroller"),Cu=C("debugrootmotion");class gs{constructor(e){a(this,"_speed",1),a(this,"normalizedStartOffset",0),a(this,"animator"),a(this,"model"),a(this,"_mixer"),a(this,"_activeState"),a(this,"_activeStates",[]),a(this,"_heldActions",[]),a(this,"rootMotionHandler"),this.model=e,ht&&console.log(this)}static createFromClips(e,t={looping:!1,autoTransition:!0,transitionDuration:0}){const s=[];for(let r=0;r<e.length;r++){const l=e[r],c=[];if(t.autoTransition!==!1){const d=t.transitionDuration??0,u=d/l.duration;let p=r;(t.autoTransition===void 0||t.autoTransition===!0)&&(p=(r+1)%e.length),c.push({exitTime:1-u,offset:0,duration:d,hasExitTime:!0,destinationState:p,conditions:[]})}const h={name:l.name,hash:r,motion:{name:l.name,clip:l,isLooping:t?.looping??!1},transitions:c,behaviours:[]};s.push(h)}const o={name:"AnimatorController",guid:new jt(Date.now()).generateUUID(),parameters:[],layers:[{name:"Base Layer",stateMachine:{defaultState:0,states:s}}]};return new gs(o)}play(e,t=-1,s=Number.NEGATIVE_INFINITY,o=0){if(t<0)t=0;else if(t>=this.model.layers.length){console.warn("invalid layer");return}const r=this.model.layers[t].stateMachine;for(const l of r.states)if(l.name===e||l.hash===e){ht&&console.log("transition to ",l),this.transitionTo(l,o,s);return}console.warn("Could not find "+e+" to play")}reset(){this.setStartTransition()}setBool(e,t){var s,o;const r=typeof e=="string"?"name":"hash";return(o=(s=this.model)==null?void 0:s.parameters)==null?void 0:o.filter(l=>l[r]===e).forEach(l=>l.value=t)}getBool(e){var t,s,o;const r=typeof e=="string"?"name":"hash";return((o=(s=(t=this.model)==null?void 0:t.parameters)==null?void 0:s.find(l=>l[r]===e))==null?void 0:o.value)??!1}setFloat(e,t){var s,o;const r=typeof e=="string"?"name":"hash",l=(o=(s=this.model)==null?void 0:s.parameters)==null?void 0:o.filter(c=>c[r]===e);return l.forEach(c=>c.value=t),l?.length>0}getFloat(e){var t,s,o;const r=typeof e=="string"?"name":"hash";return((o=(s=(t=this.model)==null?void 0:t.parameters)==null?void 0:s.find(l=>l[r]===e))==null?void 0:o.value)??0}setInteger(e,t){var s,o;const r=typeof e=="string"?"name":"hash";return(o=(s=this.model)==null?void 0:s.parameters)==null?void 0:o.filter(l=>l[r]===e).forEach(l=>l.value=t)}getInteger(e){var t,s,o;const r=typeof e=="string"?"name":"hash";return((o=(s=(t=this.model)==null?void 0:t.parameters)==null?void 0:s.find(l=>l[r]===e))==null?void 0:o.value)??0}setTrigger(e){var t,s;ht&&console.log("SET TRIGGER",e);const o=typeof e=="string"?"name":"hash";return(s=(t=this.model)==null?void 0:t.parameters)==null?void 0:s.filter(r=>r[o]===e).forEach(r=>r.value=!0)}resetTrigger(e){var t,s;const o=typeof e=="string"?"name":"hash";return(s=(t=this.model)==null?void 0:t.parameters)==null?void 0:s.filter(r=>r[o]===e).forEach(r=>r.value=!1)}getTrigger(e){var t,s,o;const r=typeof e=="string"?"name":"hash";return((o=(s=(t=this.model)==null?void 0:t.parameters)==null?void 0:s.find(l=>l[r]===e))==null?void 0:o.value)??!1}isInTransition(){return this._activeStates.length>1}setSpeed(e){this._speed=e}FindState(e){return this.findState(e)}findState(e){if(!e)return null;if(Array.isArray(this.model.layers)){for(const t of this.model.layers)for(const s of t.stateMachine.states)if(s.name===e||s.hash==e)return s}return null}getCurrentStateInfo(){if(!this._activeState)return null;const e=this._activeState.motion.action;if(!e)return null;const t=this._activeState.motion.clip.duration,s=t<=0?0:Math.abs(e.time/t);return new Ec(this._activeState,s,t,this._speed)}get currentAction(){return this._activeState&&this._activeState.motion.action||null}get context(){var e;return(e=this.animator)==null?void 0:e.context}get mixer(){return this._mixer}dispose(){var e;if(this._mixer.stopAllAction(),this.animator){this._mixer.uncacheRoot(this.animator.gameObject);for(const t of this._activeStates)t.motion.clip&&this.mixer.uncacheAction(t.motion.clip,this.animator.gameObject)}(e=this.context)==null||e.animations.unregisterAnimationMixer(this._mixer)}bind(e){var t,s;e?this.animator!==e&&(this._mixer&&(this._mixer.stopAllAction(),(t=this.context)==null||t.animations.unregisterAnimationMixer(this._mixer)),this.animator=e,this._mixer=new Lm(this.animator.gameObject),(s=this.context)==null||s.animations.registerAnimationMixer(this._mixer),this.createActions(this.animator)):console.error("AnimatorController.bind: animator is null")}clone(){if(typeof this.model=="string")return console.warn("AnimatorController has not been resolved, can not create model from string",this.model),null;ht&&console.warn("AnimatorController clone()",this.model);const e=Gl(this.model,(t,s,o)=>o==null?!0:!(o.type==="Object3D"||o.isObject3D===!0||jb(o)||o.tracks!==void 0||o instanceof gs));return console.assert(e!==this.model),new gs(e)}update(e){var t,s;if(!this.animator)return;this.evaluateTransitions(),this.updateActiveStates(e);const o=this.animator.context.time.deltaTime;this.animator.applyRootMotion&&((t=this.rootMotionHandler)==null||t.onBeforeUpdate(e)),this._mixer.update(o),this.animator.applyRootMotion&&((s=this.rootMotionHandler)==null||s.onAfterUpdate(e))}get activeState(){return this._activeState}updateActiveStates(e){for(let t=0;t<this._activeStates.length;t++){const s=this._activeStates[t],o=s.motion;if(!o.action)this._activeStates.splice(t,1),t--;else{const r=o.action;r.weight=e,r.getEffectiveWeight()<=0&&!r.isRunning()&&(ht&&console.debug("REMOVE",s.name,r.getEffectiveWeight(),r.isRunning(),r.isScheduled()),this._activeStates.splice(t,1),t--)}}}setStartTransition(){var e;this.model.layers.length>1&&(ht||F())&&console.warn("Multiple layers are not supported yet "+((e=this.animator)==null?void 0:e.name));for(const t of this.model.layers){const s=t.stateMachine;s.defaultState===void 0&&(ht&&console.warn("AnimatorController default state is undefined, will assign state 0 as default",t),s.defaultState=0);const o=s.states[s.defaultState];this.transitionTo(o,0,this.normalizedStartOffset);break}}evaluateTransitions(){var e;let t=!1;if(!this._activeState){if(this.setStartTransition(),!this._activeState)return;t=!0}const s=this._activeState,o=s.motion.action;for(const l of s.transitions){if(!l.hasExitTime&&l.conditions.length<=0)continue;let c=!0;for(const h of l.conditions)if(!this.evaluateCondition(h)){c=!1;break}if(c)if(o){const h=s.motion.clip.duration,d=h<=0?1:Math.abs(o.time/h);let u=l.exitTime;o.timeScale<0&&(u=1-u);let p=!1;if(l.hasExitTime?o.timeScale>0?p=d>=l.exitTime:o.timeScale<0&&(p=1-d>=l.exitTime):p=!0,p){for(const g of l.conditions){const f=this.model.parameters.find(y=>y.name===g.parameter);f?.type===Bf.Trigger&&f.value&&(f.value=!1)}if(o.clampWhenFinished=!0,ht){const g=this.getState(l.destinationState,0);console.log(`Transition to ${l.destinationState} / ${g?.name}`,l,`
|
|
856
|
+
Timescale: `+o.timeScale,`
|
|
857
|
+
Normalized time: `+d.toFixed(3),`
|
|
858
|
+
Exit Time: `+u,l.hasExitTime)}this.transitionTo(l.destinationState,l.duration,l.offset);return}}else{this.transitionTo(l.destinationState,l.duration,l.offset);return}}o&&this.setTimescale(o,s);let r=!1;if(s.motion.isLooping&&o&&(o.time>=o.getClip().duration?(r=!0,o.reset(),o.time=0,o.play()):o.time<=0&&o.timeScale<0&&(r=!0,o.reset(),o.time=o.getClip().duration,o.play())),!r&&s&&!t&&o&&this.animator&&s.behaviours){const l=o?.getClip().duration,c=o.time/l,h=new Ec(this._activeState,c,l,this._speed);for(const d of s.behaviours)d.instance&&((e=d.instance.onStateUpdate)==null||e.call(d.instance,this.animator,h,0))}}setTimescale(e,t){let s=t.speed??1;t.speedParameter&&(s*=this.getFloat(t.speedParameter)),s!==void 0&&(e.timeScale=s*this._speed)}getState(e,t){return typeof e=="number"&&(e==-1&&(e=this.model.layers[t].stateMachine.defaultState,e===void 0&&(ht&&console.warn("AnimatorController default state is undefined: ",this.model,"Layer: "+t),e=0)),e=this.model.layers[t].stateMachine.states[e]),e}releaseHeldActions(e){for(const t of this._heldActions)t.fadeOut(e);this._heldActions.length=0}transitionTo(e,t,s){var o,r,l,c,h,d,u,p;if(!this.animator)return;const g=0;if(e=this.getState(e,g),!(e!=null&&e.motion)||!e.motion.clip||!(e.motion.clip instanceof go))return;const f=this._activeState===e;if(f){const w=e.motion;if(!w.action_loopback&&w.clip){const x=this.rootMotionHandler?this.animator.gameObject.matrix.clone():null;this._mixer.uncacheAction(w.clip,this.animator.gameObject),x&&x.decompose(this.animator.gameObject.position,this.animator.gameObject.quaternion,this.animator.gameObject.scale),w.action_loopback=this.createAction(w.clip)}}if((o=this._activeState)!=null&&o.behaviours&&this._activeState.motion.action){const w=(r=this._activeState)==null?void 0:r.motion.clip.duration,x=this._activeState.motion.action.time/w,k=new Ec(this._activeState,x,w,this._speed);for(const M of this._activeState.behaviours)(c=(l=M.instance)==null?void 0:l.onStateExit)==null||c.call(M.instance,this.animator,k,g)}const y=(h=this._activeState)==null?void 0:h.motion.action;f&&(e.motion.action=e.motion.action_loopback,e.motion.action_loopback=y);const v=this._activeState;this._activeState=e;const b=(d=e.motion)==null?void 0:d.action,_=e.motion.clip;if(_?.duration<=0&&_.tracks.length<=0?y&&this._heldActions.push(y):y&&(y.fadeOut(t),this.releaseHeldActions(t)),b){if(s=Math.max(0,Math.min(1,s)),e.cycleOffsetParameter){let x=this.getFloat(e.cycleOffsetParameter);typeof x=="number"?(x<0&&(x+=1),s+=x,s%=1):ht&&console.warn("AnimatorController cycle offset parameter is not a number",e.cycleOffsetParameter)}else typeof e.cycleOffset=="number"&&(s+=e.cycleOffset,s%=1);b.isRunning()&&b.stop(),b.reset(),b.enabled=!0,this.setTimescale(b,e);const w=e.motion.clip.duration;if(b.time=f?0:s*w,b.timeScale<0&&(b.time=w-b.time),b.clampWhenFinished=!0,b.setLoop(Im,0),t>0?b.fadeIn(t):b.weight=1,b.play(),this.rootMotionHandler&&this.rootMotionHandler.onStart(b),this._activeStates.includes(e)||this._activeStates.push(e),this._activeState.behaviours){const x=new Ec(e,s,w,this._speed);for(const k of this._activeState.behaviours)(p=(u=k.instance)==null?void 0:u.onStateEnter)==null||p.call(k.instance,this.animator,x,g)}}else ht&&(e.__warned_no_motion||(e.__warned_no_motion=!0,console.warn("No action",e.motion,this)));ht&&console.log("TRANSITION FROM "+v?.name+" TO "+e.name,t,y,b,b?.getEffectiveTimeScale(),b?.getEffectiveWeight(),b?.isRunning(),b?.isScheduled(),b?.paused)}createAction(e){var t,s;if(this._mixer.existingAction(e)&&this._mixer.uncacheAction(e,(t=this.animator)==null?void 0:t.gameObject),(s=this.animator)!=null&&s.applyRootMotion){this.rootMotionHandler||(this.rootMotionHandler=new ZR(this));const o=this.animator.gameObject;return this.rootMotionHandler.createClip(this._mixer,o,e)}else return this._mixer.clipAction(e)}evaluateCondition(e){const t=this.model.parameters.find(s=>s.name===e.parameter);if(!t)return!1;switch(e.mode){case Mo.If:return t.value===!0;case Mo.IfNot:return t.value===!1;case Mo.Greater:return t.value>e.threshold;case Mo.Less:return t.value<e.threshold;case Mo.Equals:return t.value===e.threshold;case Mo.NotEqual:return t.value!==e.threshold}return!1}createActions(e){var t,s,o,r;ht&&console.log("AnimatorController createActions",this.model);for(const l of this.model.layers){const c=l.stateMachine;for(let h=0;h<c.states.length;h++){const d=c.states[h];d.transitions||(d.transitions=[]);for(const u of d.transitions)u.conditions||(u.conditions=[]);if(d.motion||(ht&&console.warn("No motion",d),d.motion=mx(d.name)),this.animator&&d.motion.clips){const u=(t=d.motion.clips)==null?void 0:t.find(p=>{var g,f;return p.node.name===((f=(g=this.animator)==null?void 0:g.gameObject)==null?void 0:f.name)});u?d.motion.clip=u.clip:(ht||F())&&console.warn('Could not find clip for animator "'+((o=(s=this.animator)==null?void 0:s.gameObject)==null?void 0:o.name)+'"',d.motion.clips.map(p=>p.node.name))}if(!d.motion.clip){ht&&console.warn("No clip assigned to state",d);const u=new go(void 0,void 0,[]);d.motion.clip=u}if((r=d.motion)!=null&&r.clip){const u=d.motion.clip;if(u instanceof go){const p=this.createAction(u);d.motion.action=p}else(ht||F())&&console.warn("No valid animationclip assigned",d)}if(d.behaviours&&Array.isArray(d.behaviours))for(const u of d.behaviours){if(!(u!=null&&u.typeName))continue;const p=R.get(u.typeName);if(p){const g=new p;g.isStateMachineBehaviour&&(g._context=this.context??void 0,za(g,u.properties),u.instance=g),ht&&console.log("Created animator controller behaviour",d.name,u.typeName,u.properties,g)}else(ht||F())&&console.warn("Could not find AnimatorBehaviour type: "+u.typeName)}}}}*enumerateActions(){if(this.model.layers)for(const e of this.model.layers){const t=e.stateMachine;for(let s=0;s<t.states.length;s++){const o=t.states[s];o!=null&&o.motion&&(o.motion.action&&(yield o.motion.action),o.motion.action_loopback&&(yield o.motion.action_loopback))}}}}class gx{constructor(e,t){a(this,"track"),a(this,"createdInterpolant"),a(this,"originalEvaluate"),a(this,"customEvaluate"),this.track=e;const s=e,o=s.createInterpolant.bind(e);s.createInterpolant=()=>(s.createInterpolant=o,this.createdInterpolant=o(),this.originalEvaluate=this.createdInterpolant.evaluate.bind(this.createdInterpolant),this.customEvaluate=r=>{if(!this.originalEvaluate)return;const l=this.originalEvaluate(r);return t(r,l)},this.createdInterpolant.evaluate=this.customEvaluate,this.createdInterpolant)}dispose(){this.createdInterpolant&&this.originalEvaluate&&(this.createdInterpolant.evaluate=this.originalEvaluate),this.track=void 0,this.createdInterpolant=null,this.originalEvaluate=void 0,this.customEvaluate=void 0}}const Ro=class kt{constructor(e,t,s,o,r){if(a(this,"_action"),a(this,"root"),a(this,"clip"),a(this,"positionWrapper",null),a(this,"rotationWrapper",null),a(this,"context"),a(this,"positionChange",new S),a(this,"rotationChange",new V),a(this,"_prevTime",0),this.context=e,this.root=t,this.clip=s,kt.firstKeyframeRotation[this.cacheId]||(kt.firstKeyframeRotation[this.cacheId]=new V),r){const l=r.values;kt.firstKeyframeRotation[this.cacheId].set(l[0],l[1],l[2],l[3])}kt.spaceRotation[this.cacheId]||(kt.spaceRotation[this.cacheId]=new V),kt.effectiveSpaceRotation[this.cacheId]||(kt.effectiveSpaceRotation[this.cacheId]=new V),kt.clipOffsetRotation[this.cacheId]=new V,r&&kt.clipOffsetRotation[this.cacheId].set(r.values[0],r.values[1],r.values[2],r.values[3]).invert(),this.handlePosition(s,o),this.handleRotation(s,r)}set action(e){this._action=e}get action(){return this._action}get cacheId(){return this.root.uuid}onStart(e){if(e.getClip()!==this.clip)return;kt.lastObjRotation[this.cacheId]||(kt.lastObjRotation[this.cacheId]=this.root.quaternion.clone());const t=kt.lastObjRotation[this.cacheId];if(kt.spaceRotation[this.cacheId].copy(t),Cu){const s=new Dt().setFromQuaternion(t);console.log("START",this.clip.name,W.toDegrees(s.y),this.root.position.z)}}getClipRotationOffset(){return kt.clipOffsetRotation[this.cacheId]}handlePosition(e,t){if(t){const s=this.root;Cu&&s.add(new Ci),kt.lastObjPosition[this.cacheId]||(kt.lastObjPosition[this.cacheId]=this.root.position.clone());const o=new S,r=new S;this.positionWrapper=new gx(t,(l,c)=>{const h=this.action.getEffectiveWeight();return Cu&&s.position.length()>8&&s.position.set(0,s.position.y,0),l>this._prevTime&&(o.set(c[0],c[1],c[2]),o.sub(r),o.multiplyScalar(h),o.applyQuaternion(this.getClipRotationOffset()),o.applyQuaternion(s.quaternion),this.positionChange.copy(o)),r.fromArray(c),this._prevTime=l,c[0]=0,c[1]=0,c[2]=0,c})}}handleRotation(e,t){if(t){if(Cu){const l=t.values,c=new Dt().setFromQuaternion(new V(l[0],l[1],l[2],l[3]));console.log(e.name,t.name,"FIRST ROTATION IN TRACK",W.toDegrees(c.y));const h=t.values.length-4,d=new V().set(l[h],l[h+1],l[h+2],l[h+3]),u=new Dt().setFromQuaternion(d);console.log(e.name,t.name,"LAST ROTATION IN TRACK",W.toDegrees(u.y))}let s=0;const o=new V,r=new V;this.rotationWrapper=new gx(t,(l,c)=>(l>s&&(r.set(c[0],c[1],c[2],c[3]),o.invert(),r.multiply(o),this.rotationChange.copy(r)),o.fromArray(c),s=l,c[0]=0,c[1]=0,c[2]=0,c[3]=1,c))}}onBeforeUpdate(e){this.positionChange.set(0,0,0),this.rotationChange.set(0,0,0,1)}onAfterUpdate(e){return!this.action||(e*=this.action.getEffectiveWeight(),e<=0)?!1:(this.positionChange.multiplyScalar(e),this.rotationChange.slerp(kt.identityQuaternion,1-e),!0)}};a(Ro,"lastObjPosition",{}),a(Ro,"lastObjRotation",{}),a(Ro,"firstKeyframeRotation",{}),a(Ro,"spaceRotation",{}),a(Ro,"effectiveSpaceRotation",{}),a(Ro,"clipOffsetRotation",{}),a(Ro,"identityQuaternion",new V);let KR=Ro;class ZR{constructor(e){a(this,"controller"),a(this,"handler",[]),a(this,"root"),a(this,"basePosition",new S),a(this,"baseQuaternion",new V),a(this,"baseRotation",new Dt),a(this,"summedPosition",new S),a(this,"summedRotation",new V),this.controller=e}createClip(e,t,s){this.root=t,t&&"name"in t&&t.name;const o=this.findRootTrack(s,".position"),r=this.findRootTrack(s,".quaternion"),l=new KR(this.controller.context,t,s,o,r);this.handler.push(l);const c=e.clipAction(s);return l.action=c,c}onStart(e){for(const t of this.handler)t.onStart(e)}onBeforeUpdate(e){this.basePosition.copy(this.root.position),this.baseQuaternion.copy(this.root.quaternion);for(const t of this.handler)t.onBeforeUpdate(e)}onAfterUpdate(e){if(!(e<=0)){this.root.position.copy(this.basePosition),this.root.quaternion.copy(this.baseQuaternion),this.summedPosition.set(0,0,0),this.summedRotation.set(0,0,0,1);for(const t of this.handler)t.onAfterUpdate(e)&&(this.summedPosition.add(t.positionChange),this.summedRotation.multiply(t.rotationChange));this.root.position.add(this.summedPosition),this.root.quaternion.multiply(this.summedRotation)}}findRootTrack(e,t){const s=e.tracks;if(!s)return null;for(const o of s)if(o.name.endsWith(t))return o;return null}}class JR extends es{onSerialize(e,t){}onDeserialize(e,t){if(t.type===gs&&e?.__type==="AnimatorController")return new gs(e)}}new JR(gs);var eT=Object.defineProperty,tT=Object.getOwnPropertyDescriptor,Pu=(n,e,t,s)=>{for(var o=s>1?void 0:s?tT(e,t):e,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=(s?l(e,t,o):l(o))||o);return s&&o&&eT(e,t,o),o};const ts=C("debuganimator");class Rt extends I{constructor(){super(...arguments),a(this,"applyRootMotion",!1),a(this,"hasRootMotion",!1),a(this,"keepAnimatorControllerStateOnDisable",!1),a(this,"_parametersAreDirty",!1),a(this,"_isDirty",!1),a(this,"_speed",1),a(this,"_normalizedStartOffset",0),a(this,"_animatorController",null),a(this,"_initializeWithRuntimeAnimatorController")}get isAnimationComponent(){return!0}set runtimeAnimatorController(e){var t;this._animatorController&&this._animatorController.model===e||(e?e instanceof gs?(e.animator&&e.animator!==this&&(console.warn("AnimatorController can not be bound to multiple animators",(t=e.model)==null?void 0:t.name),e.model||console.error("AnimatorController has no model"),e=new gs(e.model)),this._animatorController=e,this._animatorController.bind(this)):(ts&&console.log("Assign animator controller",e,this),this._animatorController=new gs(e),this.__didAwake&&this._animatorController.bind(this)):this._animatorController=null)}get runtimeAnimatorController(){return this._animatorController}getCurrentStateInfo(){var e;return(e=this.runtimeAnimatorController)==null?void 0:e.getCurrentStateInfo()}get currentAction(){var e;return((e=this.runtimeAnimatorController)==null?void 0:e.currentAction)||null}get parametersAreDirty(){return this._parametersAreDirty}get isDirty(){return this._isDirty}Play(e,t=-1,s=Number.NEGATIVE_INFINITY,o=0){this.play(e,t,s,o)}play(e,t=-1,s=Number.NEGATIVE_INFINITY,o=0){var r;(r=this.runtimeAnimatorController)==null||r.play(e,t,s,o),this._isDirty=!0}Reset(){this.reset()}reset(){var e;(e=this._animatorController)==null||e.reset(),this._isDirty=!0}SetBool(e,t){this.setBool(e,t)}setBool(e,t){var s,o;ts&&console.log("setBool",e,t),((s=this.runtimeAnimatorController)==null?void 0:s.getBool(e))!==t&&(this._parametersAreDirty=!0),(o=this.runtimeAnimatorController)==null||o.setBool(e,t)}GetBool(e){return this.getBool(e)}getBool(e){var t;const s=((t=this.runtimeAnimatorController)==null?void 0:t.getBool(e))??!1;return ts&&console.log("getBool",e,s),s}toggleBool(e){this.setBool(e,!this.getBool(e))}SetFloat(e,t){this.setFloat(e,t)}setFloat(e,t){var s,o;((s=this.runtimeAnimatorController)==null?void 0:s.getFloat(e))!==t&&(this._parametersAreDirty=!0),ts&&console.log("setFloat",e,t),(o=this.runtimeAnimatorController)==null||o.setFloat(e,t)}GetFloat(e){return this.getFloat(e)}getFloat(e){var t;const s=((t=this.runtimeAnimatorController)==null?void 0:t.getFloat(e))??-1;return ts&&console.log("getFloat",e,s),s}SetInteger(e,t){this.setInteger(e,t)}setInteger(e,t){var s,o;((s=this.runtimeAnimatorController)==null?void 0:s.getInteger(e))!==t&&(this._parametersAreDirty=!0),ts&&console.log("setInteger",e,t),(o=this.runtimeAnimatorController)==null||o.setInteger(e,t)}GetInteger(e){return this.getInteger(e)}getInteger(e){var t;const s=((t=this.runtimeAnimatorController)==null?void 0:t.getInteger(e))??-1;return ts&&console.log("getInteger",e,s),s}SetTrigger(e){this.setTrigger(e)}setTrigger(e){var t;this._parametersAreDirty=!0,ts&&console.log("setTrigger",e),(t=this.runtimeAnimatorController)==null||t.setTrigger(e)}ResetTrigger(e){this.resetTrigger(e)}resetTrigger(e){var t;this._parametersAreDirty=!0,ts&&console.log("resetTrigger",e),(t=this.runtimeAnimatorController)==null||t.resetTrigger(e)}GetTrigger(e){this.getTrigger(e)}getTrigger(e){var t;const s=(t=this.runtimeAnimatorController)==null?void 0:t.getTrigger(e);return ts&&console.log("getTrigger",e,s),s}IsInTransition(){return this.isInTransition()}isInTransition(){var e;return((e=this.runtimeAnimatorController)==null?void 0:e.isInTransition())??!1}SetSpeed(e){return this.setSpeed(e)}setSpeed(e){var t;e!==this._speed&&(ts&&console.log("setSpeed",e),this._speed=e,((t=this._animatorController)==null?void 0:t.animator)==this&&this._animatorController.setSpeed(e))}set minMaxSpeed(e){var t;this._speed=W.lerp(e.x,e.y,Math.random()),((t=this._animatorController)==null?void 0:t.animator)==this&&this._animatorController.setSpeed(this._speed)}set minMaxOffsetNormalized(e){var t;this._normalizedStartOffset=W.lerp(e.x,e.y,Math.random()),((t=this.runtimeAnimatorController)==null?void 0:t.animator)==this&&(this.runtimeAnimatorController.normalizedStartOffset=this._normalizedStartOffset)}awake(){ts&&console.log("ANIMATOR",this.name,this),this.gameObject&&this.initializeRuntimeAnimatorController()}initializeRuntimeAnimatorController(e=!1){const t=e||this.runtimeAnimatorController!==this._initializeWithRuntimeAnimatorController;if(this.runtimeAnimatorController&&t){const s=this.runtimeAnimatorController.clone();this._initializeWithRuntimeAnimatorController=s,s?(console.assert(this.runtimeAnimatorController!==s),this.runtimeAnimatorController=s,console.assert(this.runtimeAnimatorController===s),this.runtimeAnimatorController.bind(this),this.runtimeAnimatorController.setSpeed(this._speed),this.runtimeAnimatorController.normalizedStartOffset=this._normalizedStartOffset):console.warn("Could not clone animator controller",this.runtimeAnimatorController)}}onDisable(){var e;this.keepAnimatorControllerStateOnDisable||(e=this._animatorController)==null||e.reset()}onBeforeRender(){this._isDirty=!1,this._parametersAreDirty=!1,!QR(this.gameObject)&&this._animatorController&&this._animatorController.update(1)}}Pu([m()],Rt.prototype,"applyRootMotion",2),Pu([m()],Rt.prototype,"hasRootMotion",2),Pu([m()],Rt.prototype,"keepAnimatorControllerStateOnDisable",2),Pu([m()],Rt.prototype,"runtimeAnimatorController",1);const fx=Symbol("previous-visibility"),yx=class sd extends $s{render(e,t,s){if("addPass"in s)this._unsupported_effectcomposer_warning||(console.warn("RenderTexture.render() does not yet support EffectComposer"),this._unsupported_effectcomposer_warning=!0);else if(s instanceof fr){this.onBeforeRender();const o=s.getRenderTarget(),r=s.xr.enabled;s.xr.enabled=!1,s.setRenderTarget(this),s.clear(!0,!0,!0),s.render(e,t),s.setRenderTarget(o),s.xr.enabled=r,this.onAfterRender()}}onBeforeRender(){sd._userSet.clear();const e=Xg(this.texture,!0,null,sd._userSet);for(const t of e)t instanceof G&&(t[fx]=t.visible,t.visible=!1)}onAfterRender(){for(const e of sd._userSet)e instanceof G&&(e.visible=e[fx]);sd._userSet.clear()}};a(yx,"_userSet",new Set);let Ac=yx;var iT=Object.defineProperty,sT=Object.getOwnPropertyDescriptor,Ic=(n,e,t,s)=>{for(var o=s>1?void 0:s?sT(e,t):e,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=(s?l(e,t,o):l(o))||o);return s&&o&&iT(e,t,o),o};const Ou=C("debuggroundprojection");class en extends I{constructor(){super(...arguments),a(this,"applyOnAwake",!1),a(this,"autoFit",!0),a(this,"_radius",50),a(this,"_height",3),a(this,"_arblending",0),a(this,"_lastBackground"),a(this,"_lastRadius"),a(this,"_lastHeight"),a(this,"_projection"),a(this,"_watcher"),a(this,"_needsTextureUpdate",!1),a(this,"_blurrynessShader",null),a(this,"_lastBlurriness",-1)}set radius(e){this._radius=e,this._projection&&this.updateProjection()}get radius(){return this._radius}set height(e){this._height=e,this._projection&&this.updateProjection()}get height(){return this._height}set arBlending(e){this._arblending=e,this._needsTextureUpdate=!0}get arBlending(){return this._arblending}awake(){this.applyOnAwake&&this.updateAndCreate()}onEnable(){this.context.time.frameCount>0&&this.applyOnAwake&&this.updateAndCreate(),this._watcher||(this._watcher=new lo(this.context.scene,"background"),this._watcher.subscribeWrite(e=>{Ou&&console.log("Background changed",this.context.scene.background),this._needsTextureUpdate=!0}))}onDisable(){var e,t;(e=this._watcher)==null||e.revoke(),(t=this._projection)==null||t.removeFromParent()}onEnterXR(){this.activeAndEnabled&&(this._needsTextureUpdate=!0,this.updateProjection())}async onLeaveXR(){this.activeAndEnabled&&(await ql(1),this.updateProjection())}onBeforeRender(){this._projection&&this.scene.backgroundRotation&&this._projection.rotation.copy(this.scene.backgroundRotation),this.context.scene.backgroundBlurriness!==void 0&&this._lastBlurriness!=this.context.scene.backgroundBlurriness&&this.context.scene.backgroundBlurriness>.001?this.updateProjection():this._needsTextureUpdate&&this.context.scene.background instanceof je&&this.updateBlurriness(this.context.scene.background,this.context.scene.backgroundBlurriness)}updateAndCreate(){var e;this.updateProjection(),(e=this._watcher)==null||e.apply()}updateProjection(){var e,t,s,o,r,l;if(!this.context.scene.background){(e=this._projection)==null||e.removeFromParent();return}const c=this.context.scene.background;if(!(c instanceof je)){(t=this._projection)==null||t.removeFromParent();return}if(((s=this.context.xr)!=null&&s.isPassThrough||(o=this.context.xr)!=null&&o.isAR)&&this.arBlending===0){(r=this._projection)==null||r.removeFromParent();return}if(!this.gameObject||this.destroyed)return;let h=!0;const d=0,u=c!==this._lastBackground||this._height!==this._lastHeight||this._radius!==this._lastRadius;if(!this._projection||u){Ou&&console.log("Create/Update Ground Projection",c.name),(l=this._projection)==null||l.removeFromParent();try{this._projection=new ka(c,this._height,this._radius,64)}catch(p){console.error("Error creating three GroundProjection",p);return}this._projection.position.y=this._height-d,this._projection.name="GroundProjection",mg(this._projection,!1)}else h=!1;if(this._projection.parent||this.gameObject.add(this._projection),this.autoFit&&h){this._projection.updateWorldMatrix(!0,!0);const p=si(this.context.scene.children,[this._projection]),g=p.min.y;if(g<1/0){const f=q();f.x=p.min.x+(p.max.x-p.min.x)*.5;const y=Ge(this.gameObject).x;f.y=g+this._height*y-d,f.z=p.min.z+(p.max.z-p.min.z)*.5,lt(this._projection,f)}Ou&&$.DrawWireBox3(p,65280,5)}this.context.scene.backgroundBlurriness>.001&&this._needsTextureUpdate&&this.updateBlurriness(c,this.context.scene.backgroundBlurriness),this._lastBackground=c,this._lastHeight=this._height,this._lastRadius=this._radius,this._needsTextureUpdate=!1}updateBlurriness(e,t){var s;if(this._projection){if(!e)return}else return;this._needsTextureUpdate=!1,Ou&&console.log("Update Blurriness",t),this._blurrynessShader??(this._blurrynessShader=new Ws({name:"GroundProjectionBlurriness",uniforms:{map:{value:e},blurriness:{value:t},blending:{value:0},alphaFactor:{value:1}},vertexShader:nT,fragmentShader:oT})),this._blurrynessShader.depthWrite=!1,this._blurrynessShader.uniforms.map.value=e,this._blurrynessShader.uniforms.blurriness.value=t,this._lastBlurriness=t,e.needsUpdate=!0;const o=this._projection.material.transparent;this._projection.material.transparent=(((s=this.context.xr)==null?void 0:s.isAR)===!0&&this.arBlending>1e-6)??!1,this._projection.material.transparent?this._blurrynessShader.uniforms.blending.value=this.arBlending:this._blurrynessShader.uniforms.blending.value=0,this.context.isInPassThrough?this._blurrynessShader.uniforms.alphaFactor.value=.95:this._blurrynessShader.uniforms.alphaFactor.value=1,o!==this._projection.material.transparent&&(this._projection.material.needsUpdate=!0),this._projection.material.map=Zl.copyTexture(e,this._blurrynessShader),this._projection.material.depthTest=!0,this._projection.material.depthWrite=!1}}Ic([m()],en.prototype,"applyOnAwake",2),Ic([m()],en.prototype,"autoFit",2),Ic([m()],en.prototype,"radius",1),Ic([m()],en.prototype,"height",1),Ic([m()],en.prototype,"arBlending",1);const nT=`
|
|
859
|
+
varying vec2 vUv;
|
|
860
|
+
|
|
861
|
+
void main() {
|
|
862
|
+
vUv = uv;
|
|
863
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
|
|
864
|
+
}
|
|
865
|
+
`,oT=`
|
|
866
|
+
uniform sampler2D map;
|
|
867
|
+
uniform float blurriness;
|
|
868
|
+
uniform float alphaFactor;
|
|
869
|
+
uniform float blending;
|
|
870
|
+
varying vec2 vUv;
|
|
871
|
+
|
|
872
|
+
const float PI = 3.14159265359;
|
|
873
|
+
|
|
874
|
+
// Gaussian function
|
|
875
|
+
float gaussian(float x, float sigma) {
|
|
876
|
+
return exp(-(x * x) / (2.0 * sigma * sigma)) / (sqrt(2.0 * PI) * sigma);
|
|
877
|
+
}
|
|
878
|
+
|
|
879
|
+
// Custom smoothstep function for desired falloff
|
|
880
|
+
float customSmoothstep(float edge0, float edge1, float x) {
|
|
881
|
+
float t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);
|
|
882
|
+
return t * t * (3.0 - 2.0 * t);
|
|
883
|
+
}
|
|
884
|
+
|
|
885
|
+
void main() {
|
|
886
|
+
vec2 center = vec2(0.0, 0.0);
|
|
887
|
+
vec2 pos = vUv;
|
|
888
|
+
pos.x = 0.0; // Only consider vertical distance
|
|
889
|
+
float distance = length(pos - center);
|
|
890
|
+
|
|
891
|
+
// Calculate blur amount based on custom falloff
|
|
892
|
+
float blurAmount = customSmoothstep(0.5, 1.0, distance * 2.0);
|
|
893
|
+
blurAmount = clamp(blurAmount, 0.0, 1.0); // Ensure blur amount is within valid range
|
|
894
|
+
|
|
895
|
+
// Gaussian blur
|
|
896
|
+
vec2 pixelSize = 1.0 / vec2(textureSize(map, 0));
|
|
897
|
+
vec4 color = vec4(0.0);
|
|
898
|
+
float totalWeight = 0.0;
|
|
899
|
+
int blurSize = int(60.0 * min(1.0, blurriness) * blurAmount); // Adjust blur size based on distance and blurriness
|
|
900
|
+
float lodLevel = log2(float(blurSize)) * 0.5; // Compute LOD level
|
|
901
|
+
|
|
902
|
+
for (int x = -blurSize; x <= blurSize; x++) {
|
|
903
|
+
for (int y = -blurSize; y <= blurSize; y++) {
|
|
904
|
+
vec2 offset = vec2(float(x), float(y)) * pixelSize * blurAmount;
|
|
905
|
+
float weight = gaussian(length(vec2(float(x), float(y))), 1000.0 * blurAmount); // Use a fixed sigma value
|
|
906
|
+
color += textureLod(map, vUv + offset, lodLevel) * weight;
|
|
907
|
+
totalWeight += weight;
|
|
908
|
+
}
|
|
909
|
+
}
|
|
910
|
+
|
|
911
|
+
color = totalWeight > 0.0 ? color / totalWeight : texture2D(map, vUv);
|
|
912
|
+
|
|
913
|
+
gl_FragColor = color;
|
|
914
|
+
|
|
915
|
+
float brightness = dot(gl_FragColor.rgb, vec3(0.299, 0.587, 0.114));
|
|
916
|
+
float stepFactor = blending - brightness * .1;
|
|
917
|
+
gl_FragColor.a = pow(1.0 - blending * customSmoothstep(0.35 * stepFactor, 0.45 * stepFactor, distance), 5.);
|
|
918
|
+
gl_FragColor.a *= alphaFactor;
|
|
919
|
+
// gl_FragColor.rgb = vec3(1.0);
|
|
920
|
+
|
|
921
|
+
// #include <tonemapping_fragment>
|
|
922
|
+
// #include <colorspace_fragment>
|
|
923
|
+
|
|
924
|
+
// Uncomment to visualize blur amount
|
|
925
|
+
// gl_FragColor = vec4(blurAmount, 0.0, 0.0, 1.0);
|
|
926
|
+
}
|
|
927
|
+
`;var rT=Object.defineProperty,Ff=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&rT(e,t,o),o};class Fr extends I{constructor(){super(...arguments),a(this,"constraintActive",!0),a(this,"locked",!1),a(this,"sources",[])}}Ff([m()],Fr.prototype,"constraintActive"),Ff([m()],Fr.prototype,"locked"),Ff([m(E)],Fr.prototype,"sources");function vx(n,e){return jn(n,me.ContextCreated,e),()=>_o(n,me.ContextCreated)}function aT(n,e){return jn(n,me.ContextClearing,e),()=>_o(n,me.ContextClearing)}function lT(n,e){return jn(n,me.ContextDestroying,e),()=>_o(n,me.ContextDestroying)}function bx(n,e){return jn(n,Oe.Start,e),()=>_o(n,Oe.Start)}function _x(n,e){return jn(n,Oe.Update,e),()=>_o(n,Oe.Update)}function cT(n,e){return jn(n,Oe.OnBeforeRender,e),()=>_o(n,Oe.OnBeforeRender)}function hT(n,e){return jn(n,Oe.OnAfterRender,e),()=>_o(n,Oe.OnAfterRender)}let Ur=class{constructor(){a(this,"bb",null),a(this,"bb_pos",0)}__init(n,e){return this.bb_pos=n,this.bb=e,this}x(){return this.bb.readFloat32(this.bb_pos)}y(){return this.bb.readFloat32(this.bb_pos+4)}z(){return this.bb.readFloat32(this.bb_pos+8)}static sizeOf(){return 12}static createVec3(n,e,t,s){return n.prep(4,12),n.writeFloat32(s),n.writeFloat32(t),n.writeFloat32(e),n.offset()}};class wx{constructor(){a(this,"bb",null),a(this,"bb_pos",0)}__init(e,t){return this.bb_pos=e,this.bb=t,this}position(e){return(e||new Ur).__init(this.bb_pos,this.bb)}rotation(e){return(e||new Ur).__init(this.bb_pos+12,this.bb)}scale(e){return(e||new Ur).__init(this.bb_pos+24,this.bb)}static sizeOf(){return 36}static createTransform(e,t,s,o,r,l,c,h,d,u){return e.prep(4,36),e.prep(4,12),e.writeFloat32(u),e.writeFloat32(d),e.writeFloat32(h),e.prep(4,12),e.writeFloat32(c),e.writeFloat32(l),e.writeFloat32(r),e.prep(4,12),e.writeFloat32(o),e.writeFloat32(s),e.writeFloat32(t),e.offset()}}class co{constructor(){a(this,"bb",null),a(this,"bb_pos",0)}__init(e,t){return this.bb_pos=e,this.bb=t,this}static getRootAsSyncedTransformModel(e,t){return(t||new co).__init(e.readInt32(e.position())+e.position(),e)}static getSizePrefixedRootAsSyncedTransformModel(e,t){return e.setPosition(e.position()+Kv),(t||new co).__init(e.readInt32(e.position())+e.position(),e)}guid(e){const t=this.bb.__offset(this.bb_pos,4);return t?this.bb.__string(this.bb_pos+t,e):null}fast(){const e=this.bb.__offset(this.bb_pos,6);return e?!!this.bb.readInt8(this.bb_pos+e):!1}transform(e){const t=this.bb.__offset(this.bb_pos,8);return t?(e||new wx).__init(this.bb_pos+t,this.bb):null}dontSave(){const e=this.bb.__offset(this.bb_pos,10);return e?!!this.bb.readInt8(this.bb_pos+e):!1}static startSyncedTransformModel(e){e.startObject(4)}static addGuid(e,t){e.addFieldOffset(0,t,0)}static addFast(e,t){e.addFieldInt8(1,+t,0)}static addTransform(e,t){e.addFieldStruct(2,t,0)}static addDontSave(e,t){e.addFieldInt8(3,+t,0)}static endSyncedTransformModel(e){return e.endObject()}static finishSyncedTransformModelBuffer(e,t){e.finish(t)}static finishSizePrefixedSyncedTransformModelBuffer(e,t){e.finish(t,void 0,!0)}}var A;(n=>{(e=>{e.MAYBEMODULE=null;const t=[];function s(){return e.MODULE?Promise.resolve(e.MODULE):new Promise(r=>{t.push(r)})}e.ready=s;async function o(){if(e.MODULE)return e.MODULE;const r=await import("./rapier-CyWhltHY.min.js");return e.MODULE=r,e.MAYBEMODULE=r,t.forEach(l=>l(r)),t.length=0,r}e.load=o})(n.RAPIER_PHYSICS||(n.RAPIER_PHYSICS={})),(e=>{e.MAYBEMODULE=null;const t=[];function s(){return e.MODULE?Promise.resolve(e.MODULE):new Promise(r=>{t.push(r)})}e.ready=s;async function o(){if(e.MODULE)return e.MODULE;const r=await import("./postprocessing-BDScN9yu.min.js").then(l=>l.index);return e.MODULE=r,e.MAYBEMODULE=r,t.forEach(l=>l(r)),t.length=0,r}e.load=o})(n.POSTPROCESSING||(n.POSTPROCESSING={})),(e=>{e.MAYBEMODULE=null;const t=[];function s(){return e.MODULE?Promise.resolve(e.MODULE):new Promise(r=>{t.push(r)})}e.ready=s;async function o(){if(e.MODULE)return e.MODULE;const r=await import("./postprocessing-BDScN9yu.min.js").then(l=>l.N8AO);return e.MODULE=r,e.MAYBEMODULE=r,t.forEach(l=>l(r)),t.length=0,r}e.load=o})(n.POSTPROCESSING_AO||(n.POSTPROCESSING_AO={}))})(A||(A={}));var xt=(n=>(n[n.Average=0]="Average",n[n.Multiply=1]="Multiply",n[n.Minimum=2]="Minimum",n[n.Maximum=3]="Maximum",n))(xt||{}),ku=(n=>(n[n.Discrete=0]="Discrete",n[n.Continuous=1]="Continuous",n))(ku||{}),Qe=(n=>(n[n.None=0]="None",n[n.FreezePositionX=2]="FreezePositionX",n[n.FreezePositionY=4]="FreezePositionY",n[n.FreezePositionZ=8]="FreezePositionZ",n[n.FreezePosition=14]="FreezePosition",n[n.FreezeRotationX=16]="FreezeRotationX",n[n.FreezeRotationY=32]="FreezeRotationY",n[n.FreezeRotationZ=64]="FreezeRotationZ",n[n.FreezeRotation=112]="FreezeRotation",n[n.FreezeAll=126]="FreezeAll",n))(Qe||{}),qa=(n=>(n[n.None=0]="None",n[n.X=2]="X",n[n.Y=4]="Y",n[n.Z=8]="Z",n[n.All=-1]="All",n))(qa||{});const Tt=function(n,e){return function(t,s,o){dT(t,s,o,n,e)}};function dT(n,e,t,s,o){if(!o&&!s&&!n.onValidate)return;if(t!==void 0){console.error("Invalid usage of validate decorator. Only fields can be validated.",n,e,t),De("Invalid usage of validate decorator. Only fields can be validated. Property: "+e,ki.Error);return}let r="";if(typeof e=="string"?r=e:r=e.name,n.__internalAwake){const l=Symbol(r),c=n.__internalAwake;n.__internalAwake=function(){var h;if(!this.onValidate){F()&&console.warn('Usage of @validate decorate detected but there is no onValidate method in your class: "'+((h=n.constructor)==null?void 0:h.name)+'"');return}if(this[l]===void 0){this[l]=this[r];const d=this[r];if(d instanceof re||d instanceof S||d instanceof fe||d instanceof V){const u=this[r];Od(u,()=>{this.onValidate(r)})}Object.defineProperty(this,r,{set:function(u){var p;if(this[pf]===!0)this[l]=u;else{s?.call(this,u);const g=this[l];this[l]=u,(p=this.onValidate)==null||p.call(this,r,g)}},get:function(){return o?.call(this),this[l]}})}c.call(this)}}}const uT=function(n){return function(e,t,s){let o="";typeof t=="string"?o=t:o=t.name;const r=n.prototype,l=Object.getOwnPropertyDescriptor(r,o);if(!(l!=null&&l.value)){console.warn("Can not apply prefix: type does not have method named",t,n);return}const c=l.value,h=e[o];Object.defineProperty(r,o,{value:function(...d){const u=h?.call(this,...d);if(u instanceof Promise){u.then(p=>{if(p!==!1)return c.call(this,...d)});return}if(u!==!1)return c.call(this,...d)}})}};var pT=Object.defineProperty,mT=Object.getOwnPropertyDescriptor,Li=(n,e,t,s)=>{for(var o=s>1?void 0:s?mT(e,t):e,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=(s?l(e,t,o):l(o))||o);return s&&o&&pT(e,t,o),o};class gT{constructor(e,t){a(this,"positionChanged",!1),a(this,"rotationChanged",!1),a(this,"position"),a(this,"quaternion"),a(this,"_positionKeys",["x","y","z"]),a(this,"_quaternionKeys",["_x","_y","_z","_w"]),a(this,"mute",!1),a(this,"context"),a(this,"obj"),a(this,"_positionWatch"),a(this,"_rotationWatch"),this.context=t,this.obj=e}get isDirty(){return this.positionChanged||this.rotationChanged}reset(e=!1){if(this.positionChanged=!1,this.rotationChanged=!1,this.mute=!1,e){if(this.position)for(const t of this._positionKeys)delete this.position[t];if(this.quaternion)for(const t of this._quaternionKeys)delete this.quaternion[t]}}syncValues(){for(const e of this._positionKeys)this.position[e]=this.obj.position[e];for(const e of this._quaternionKeys)this.quaternion[e]=this.obj.quaternion[e]}applyValues(){if(this.positionChanged&&this.position)for(const e of this._positionKeys){const t=this.position[e];t!==void 0&&(this.obj.position[e]=t)}if(this.rotationChanged&&this.quaternion)for(const e of this._quaternionKeys){const t=this.quaternion[e];t!==void 0&&(this.obj.quaternion[e]=t)}}start(e,t){this.reset(),e&&(this._positionWatch||(this._positionWatch=new lo(this.obj.position,["x","y","z"])),this._positionWatch.apply(),this.position={},this._positionWatch.subscribeWrite((r,l)=>{var c;if((c=this.context.physics.engine)!=null&&c.isUpdating||this.mute)return;const h=this.position[l];Math.abs(h-r)<1e-5||(this.position[l]=r,this.positionChanged=!0)})),t&&(this._rotationWatch||(this._rotationWatch=new lo(this.obj.quaternion,["_x","_y","_z","_w"])),this._rotationWatch.apply(),this.quaternion={},this._rotationWatch.subscribeWrite((r,l)=>{var c;if((c=this.context.physics.engine)!=null&&c.isUpdating||this.mute)return;const h=this.quaternion[l];Math.abs(h-r)<1e-5||(this.quaternion[l]=r,this.rotationChanged=!0)}));const s=this.obj.matrixWorld.multiplyMatrices.bind(this.obj.matrixWorld),o=new se;this.obj.matrixWorld.multiplyMatrices=(r,l)=>{var c;return(c=this.context.physics.engine)!=null&&c.isUpdating||this.mute||o.equals(r)||(this.positionChanged=!0,this.rotationChanged=!0,o.copy(r)),s(r,l)}}stop(){var e,t;(e=this._positionWatch)==null||e.revoke(),(t=this._rotationWatch)==null||t.revoke()}}var Xa;const li=(Xa=class extends I{constructor(){super(...arguments),a(this,"autoMass",!0),a(this,"_mass",0),a(this,"useGravity",!0),a(this,"centerOfMass",new S(0,0,0)),a(this,"constraints",Qe.None),a(this,"isKinematic",!1),a(this,"drag",0),a(this,"angularDrag",1),a(this,"detectCollisions",!0),a(this,"sleepThreshold",.01),a(this,"collisionDetectionMode",ku.Discrete),a(this,"_gravityScale",1),a(this,"dominanceGroup",0),a(this,"_propertiesChanged",!1),a(this,"_currentVelocity",new S),a(this,"_smoothedVelocity",new S),a(this,"_smoothedVelocityGetter",new S),a(this,"_lastPosition",new S),a(this,"_watch")}get isRigidbody(){return!0}set mass(n){n!==this._mass&&(this._mass=n,this._propertiesChanged=!0,this.__didAwake&&(this.autoMass=!1))}get mass(){var n,e;return this.autoMass?((e=(n=this.context.physics.engine)==null?void 0:n.getBody(this))==null?void 0:e.mass())??-1:this._mass}get lockPositionX(){return(this.constraints&Qe.FreezePositionX)!==0}get lockPositionY(){return(this.constraints&Qe.FreezePositionY)!==0}get lockPositionZ(){return(this.constraints&Qe.FreezePositionZ)!==0}get lockRotationX(){return(this.constraints&Qe.FreezeRotationX)!==0}get lockRotationY(){return(this.constraints&Qe.FreezeRotationY)!==0}get lockRotationZ(){return(this.constraints&Qe.FreezeRotationZ)!==0}set lockPositionX(n){n?this.constraints|=Qe.FreezePositionX:this.constraints&=~Qe.FreezePositionX}set lockPositionY(n){n?this.constraints|=Qe.FreezePositionY:this.constraints&=~Qe.FreezePositionY}set lockPositionZ(n){n?this.constraints|=Qe.FreezePositionZ:this.constraints&=~Qe.FreezePositionZ}set lockRotationX(n){n?this.constraints|=Qe.FreezeRotationX:this.constraints&=~Qe.FreezeRotationX}set lockRotationY(n){n?this.constraints|=Qe.FreezeRotationY:this.constraints&=~Qe.FreezeRotationY}set lockRotationZ(n){n?this.constraints|=Qe.FreezeRotationZ:this.constraints&=~Qe.FreezeRotationZ}set gravityScale(n){this._gravityScale=n}get gravityScale(){return this._gravityScale}awake(){this._watch=void 0,this._propertiesChanged=!1}onEnable(){this._watch||(this._watch=new gT(this.gameObject,this.context)),this._watch.start(!0,!0),this.startCoroutine(this.beforePhysics(),Oe.LateUpdate),F()&&(globalThis.NEEDLE_USE_RAPIER?A.RAPIER_PHYSICS.ready().then(async()=>{var n;await ql(3),(n=this.context.physics.engine)!=null&&n.getBody(this)||console.warn(`Rigidbody could not be created. Ensure "${this.name}" has a Collider component.`)}):console.warn("Rigidbody could not be created: Rapier physics are explicitly disabled."))}onDisable(){var n,e;(n=this._watch)==null||n.stop(),(e=this.context.physics.engine)==null||e.removeBody(this)}onDestroy(){var n;(n=this.context.physics.engine)==null||n.removeBody(this)}onValidate(){this._propertiesChanged=!0}*beforePhysics(){for(var n,e,t,s;;)this._propertiesChanged&&(this._propertiesChanged=!1,(n=this.context.physics.engine)==null||n.updateProperties(this)),(e=this._watch)!=null&&e.isDirty?(this._watch.mute=!0,this._watch.applyValues(),(t=this.context.physics.engine)==null||t.updateBody(this,this._watch.positionChanged,this._watch.rotationChanged),this._watch.reset()):(s=this._watch)==null||s.syncValues(),this.captureVelocity(),yield}teleport(n,e=!0){var t;(t=this._watch)==null||t.reset(!0),e?this.gameObject.position.set(n.x,n.y,n.z):this.setWorldPosition(n.x,n.y,n.z),this.resetForcesAndTorques(),this.resetVelocities()}resetForces(n=!0){var e;(e=this.context.physics.engine)==null||e.resetForces(this,n)}resetTorques(n=!0){var e;(e=this.context.physics.engine)==null||e.resetTorques(this,n)}resetVelocities(){this.setVelocity(0,0,0),this.setAngularVelocity(0,0,0)}resetForcesAndTorques(){this.resetForces(),this.resetTorques()}wakeUp(){var n;(n=this.context.physics.engine)==null||n.wakeup(this)}get isSleeping(){var n;return(n=this.context.physics.engine)==null?void 0:n.isSleeping(this)}updateProperties(){var n;return this._propertiesChanged=!1,(n=this.context.physics.engine)==null?void 0:n.updateProperties(this)}applyForce(n,e,t=!0){var s;this._propertiesChanged&&this.updateProperties(),(s=this.context.physics.engine)==null||s.addForce(this,n,t)}applyImpulse(n,e=!0){var t;this._propertiesChanged&&this.updateProperties(),(t=this.context.physics.engine)==null||t.applyImpulse(this,n,e)}setForce(n,e,t,s=!0){var o,r,l;(o=this.context.physics.engine)==null||o.resetForces(this,s),typeof n=="number"?(e??(e=0),t??(t=0),(r=this.context.physics.engine)==null||r.addForce(this,{x:n,y:e,z:t},s)):(l=this.context.physics.engine)==null||l.addForce(this,n,s)}getVelocity(){var n;const e=(n=this.context.physics.engine)==null?void 0:n.getLinearVelocity(this);return e?(this._currentVelocity.x=e.x,this._currentVelocity.y=e.y,this._currentVelocity.z=e.z,this._currentVelocity):this._currentVelocity.set(0,0,0)}setVelocity(n,e,t,s=!0){var o,r;if(n instanceof S){const l=n;(o=this.context.physics.engine)==null||o.setLinearVelocity(this,l,s);return}e===void 0||t===void 0||(r=this.context.physics.engine)==null||r.setLinearVelocity(this,{x:n,y:e,z:t},s)}getAngularVelocity(){var n;const e=(n=this.context.physics.engine)==null?void 0:n.getAngularVelocity(this);return e?(this._currentVelocity.x=e.x,this._currentVelocity.y=e.y,this._currentVelocity.z=e.z,this._currentVelocity):this._currentVelocity.set(0,0,0)}setAngularVelocity(n,e,t,s=!0){var o,r;if(typeof n=="object"){const l=n;(o=this.context.physics.engine)==null||o.setAngularVelocity(this,l,s);return}if(e===void 0||t===void 0||typeof e=="boolean"){console.warn("setAngularVelocity expects either a Vec3 or 3 numbers");return}(r=this.context.physics.engine)==null||r.setAngularVelocity(this,{x:n,y:e,z:t},s)}setTorque(n,e,t){typeof n=="number"?this.setAngularVelocity(n,e,t):this.setAngularVelocity(n)}get smoothedVelocity(){return this._smoothedVelocityGetter.copy(this._smoothedVelocity),this._smoothedVelocityGetter.multiplyScalar(1/this.context.time.deltaTime)}setBodyFromGameObject(n=null){}captureVelocity(){const n=this.gameObject.matrixWorld;Xa.tempPosition.setFromMatrixPosition(n);const e=Xa.tempPosition.sub(this._lastPosition);this._lastPosition.copy(Xa.tempPosition),this._smoothedVelocity.lerp(e,this.context.time.deltaTime/.1)}},a(Xa,"tempPosition",new S),Xa);Li([Tt()],li.prototype,"autoMass",2),Li([m()],li.prototype,"mass",1),Li([Tt(),m()],li.prototype,"useGravity",2),Li([m(S)],li.prototype,"centerOfMass",2),Li([Tt(),m()],li.prototype,"constraints",2),Li([Tt(),m()],li.prototype,"isKinematic",2),Li([Tt(),m()],li.prototype,"drag",2),Li([Tt(),m()],li.prototype,"angularDrag",2),Li([Tt(),m()],li.prototype,"detectCollisions",2),Li([Tt(),m()],li.prototype,"sleepThreshold",2),Li([Tt(),m()],li.prototype,"collisionDetectionMode",2),Li([Tt()],li.prototype,"_gravityScale",2),Li([Tt()],li.prototype,"dominanceGroup",2);let dt=li;new S,new S;const To=C("debugsync"),Lc="STRS";Tg(Lc,co.getRootAsSyncedTransformModel);const tn=new $m;function xx(n,e,t=!0){tn.clear();const s=tn.createString(n);co.startSyncedTransformModel(tn),co.addGuid(tn,s),co.addFast(tn,t);const o=e.worldPosition,r=e.worldEuler,l=e.gameObject.scale;co.addTransform(tn,wx.createTransform(tn,o.x,o.y,o.z,r.x,r.y,r.z,l.x,l.y,l.z));const c=co.endSyncedTransformModel(tn);return tn.finish(c,Lc),tn.asUint8Array()}let Uf=0,jc=0;_x(n=>{var e;const t=(e=n.connection.currentServerUrl)!=null&&e.includes("glitch")?10:40;jc=Math.floor(Uf/t),Uf=0,To&&jc>0&&console.log("Sync Transform Fast Interval",jc)});class sn extends I{constructor(){super(...arguments),a(this,"overridePhysics",!0),a(this,"interpolatePosition",!0),a(this,"interpolateRotation",!0),a(this,"fastMode",!1),a(this,"syncDestroy",!1),a(this,"_model",null),a(this,"_needsUpdate",!0),a(this,"rb",null),a(this,"_wasKinematic",!1),a(this,"_receivedDataBefore",!1),a(this,"_targetPosition"),a(this,"_targetRotation"),a(this,"_receivedFastUpdate",!1),a(this,"_shouldRequestOwnership",!1),a(this,"joinedRoomCallback",null),a(this,"receivedDataCallback",null),a(this,"tempEuler",new Dt),a(this,"receivedUpdate",!1),a(this,"lastPosition"),a(this,"lastRotation"),a(this,"lastScale")}requestOwnership(){To&&console.log("Request ownership"),this._model?this._model.requestOwnership():(this._shouldRequestOwnership=!0,this._needsUpdate=!0)}freeOwnership(){var e;(e=this._model)==null||e.freeOwnership()}hasOwnership(){var e;return((e=this._model)==null?void 0:e.hasOwnership)??void 0}isOwned(){var e;return(e=this._model)==null?void 0:e.isOwned}awake(){To&&console.log("new instance",this.guid,this),this._receivedDataBefore=!1,this._targetPosition=new S,this._targetRotation=new V,this.lastPosition=new S,this.lastRotation=new V,this.lastScale=new S,this.rb=P.getComponentInChildren(this.gameObject,dt),this.rb&&(this._wasKinematic=this.rb.isKinematic),this.receivedUpdate=!0,this._model=new Ag(this.context.connection,this.guid),this.context.connection.isConnected&&this.tryGetLastState(),this.joinedRoomCallback=this.tryGetLastState.bind(this),this.context.connection.beginListen(ie.JoinedRoom,this.joinedRoomCallback),this.receivedDataCallback=this.onReceivedData.bind(this),this.context.connection.beginListenBinary(Lc,this.receivedDataCallback)}onDestroy(){this.syncDestroy&&nf(this.guid,this.context.connection),this._model=null,this.context.connection.stopListen(ie.JoinedRoom,this.joinedRoomCallback),this.context.connection.stopListenBinary(Lc,this.receivedDataCallback)}tryGetLastState(){const e=this.context.connection.tryGetState(this.guid);e&&this.onReceivedData(e)}onReceivedData(e){var t;if(!this.destroyed&&typeof e.guid=="function"&&e.guid()===this.guid){To&&console.log("new data",this.context.connection.connectionId,this.context.time.frameCount,this.guid,e),this.receivedUpdate=!0,this._receivedFastUpdate=e.fast();const s=e.transform();if(s){ms.markDirty(this.gameObject,!0);const o=s.position();o&&(this.interpolatePosition&&((t=this._targetPosition)==null||t.set(o.x(),o.y(),o.z())),(!this.interpolatePosition||!this._receivedDataBefore)&&this.setWorldPosition(o.x(),o.y(),o.z()));const r=s.rotation();r&&(this.tempEuler.set(r.x(),r.y(),r.z()),this.interpolateRotation&&this._targetRotation.setFromEuler(this.tempEuler),(!this.interpolateRotation||!this._receivedDataBefore)&&pg(this.gameObject,this.tempEuler));const l=s.scale();l&&this.gameObject.scale.set(l.x(),l.y(),l.z())}this._receivedDataBefore=!0}}onEnable(){this.lastPosition.copy(this.worldPosition),this.lastRotation.copy(this.worldQuaternion),this.lastScale.copy(this.gameObject.scale),this._needsUpdate=!0,this._model&&this._model.updateIsOwned()}onDisable(){this._model&&this._model.freeOwnership()}onBeforeRender(){if(!this.activeAndEnabled||!this.context.connection.isConnected)return;if(!this.context.connection.isInRoom||!this._model){To&&console.log("no model or room",this.name,this.guid,this.context.connection.isInRoom);return}this._shouldRequestOwnership&&(this._shouldRequestOwnership=!1,this._model.requestOwnership());const e=this.worldPosition,t=this.worldQuaternion,s=this.gameObject.scale;if(this._model.isOwned&&!this.receivedUpdate){const l=this._model.hasOwnership||this.fastMode?1e-4:.001;(e.distanceTo(this.lastPosition)>l||t.angleTo(this.lastRotation)>l||s.distanceTo(this.lastScale)>l)&&(this._model.hasOwnership?this._needsUpdate=!0:(To&&console.log(this.guid,"reset because not owned but",this.gameObject.name,this.lastPosition),this.worldPosition=this.lastPosition,e.copy(this.lastPosition),this.worldQuaternion=this.lastRotation,t.copy(this.lastRotation),this.gameObject.scale.copy(this.lastScale),ms.markDirty(this.gameObject,!0),this._needsUpdate=!1))}if(this._model&&!this._model.hasOwnership&&this._model.isOwned&&this._receivedDataBefore){const l=this._receivedFastUpdate||this.fastMode?.5:.3;let c=!1;if(this.interpolatePosition&&this._targetPosition){const h=this.worldPosition;h.lerp(this._targetPosition,l),this.worldPosition=h,c=!0}if(this.interpolateRotation&&this._targetRotation){const h=this.worldQuaternion;h.slerp(this._targetRotation,l),this.worldQuaternion=h,c=!0}c&&ms.markDirty(this.gameObject,!0)}if(this.receivedUpdate=!1,this.lastPosition.copy(e),this.lastRotation.copy(t),this.lastScale.copy(s),!this._model||!this._model||this._model.hasOwnership===void 0||!this._model.hasOwnership)return;this.rb&&this.overridePhysics&&this._wasKinematic!==void 0&&(To&&console.log("reset kinematic",this.rb.name,this._wasKinematic),this.rb.isKinematic=this._wasKinematic);const o=10,r=this.rb||this.fastMode;if(this._needsUpdate&&(this.context.time.frameCount%o===0||r)){if(Uf++,r&&jc>0&&this.context.time.frameCount%jc!==0)return;To&&console.debug("[SyncedTransform] Send update",this.context.connection.connectionId,this.guid,this.gameObject.name,this.gameObject.guid),this._needsUpdate=!1;const l=xx(this.guid,this,!!r);this.context.connection.sendBinary(l)}}}class cd{constructor(e,t){a(this,"event"),a(this,"button"),a(this,"buttonName"),a(this,"_used",!1),a(this,"_propagationStopped",!1),a(this,"z__pointer_ctured",!1),a(this,"z__pointer_cture_rleased",!1),a(this,"inputSource"),a(this,"object"),a(this,"point"),a(this,"normal"),a(this,"face"),a(this,"distance"),a(this,"instanceId"),a(this,"intersection"),a(this,"isDown"),a(this,"isUp"),a(this,"isPressed"),a(this,"isClick"),a(this,"isDoubleClick"),a(this,"input"),this.event=t,this.input=e,this.button=t.button}get deviceIndex(){return this.event.deviceIndex}get pointerId(){return this.event.pointerId}get pressure(){return this.event.pressure}get used(){return this._used}use(){this._used||(this._used=!0,this.event.use())}get propagationStopped(){return this._propagationStopped}stopPropagation(){this._propagationStopped=!0,this.event.stopImmediatePropagation()}stopImmediatePropagation(){this._propagationStopped=!0,this.event.stopImmediatePropagation()}setPointerCapture(){this.z__pointer_ctured=!0}releasePointerCapture(){this.z__pointer_cture_rleased=!0}get mode(){return this.event.mode}clone(){const e=new cd(this.input,this.event);return Object.assign(e,this),e}Use(){this.use()}StopPropagation(){this.event.stopImmediatePropagation()}}function Mu(n,e){return P.foreachComponent(n,t=>{if(!t.enabled)return;const s=t;if(e)switch(e){case"pointerdown":if(s.onPointerDown)return!0;break;case"pointerup":if(s.onPointerUp||s.onPointerClick)return!0;break;case"pointermove":if(s.onPointerEnter||s.onPointerExit||s.onPointerMove)return!0;break}else if(s.onPointerDown||s.onPointerUp||s.onPointerEnter||s.onPointerExit||s.onPointerClick)return!0},!1)===!0}const Fn=new Array;class Un{constructor(e,t,s,o){a(this,"enabled",!0),a(this,"target"),a(this,"methodName"),a(this,"arguments"),this.target=e,this.methodName=t||null,this.arguments=s,o!=null&&(this.enabled=o)}get canClone(){return this.target instanceof Object}invoke(...e){if(this.enabled!==!1){if(typeof this.target=="function")this.arguments?(Fn.length=0,e!==void 0&&e.length>0&&Fn.push(...e),Fn.push(...this.arguments),this.target(...this.arguments),Fn.length=0):this.target(...e);else if(this.methodName!=null){const t=this.target[this.methodName];typeof t=="function"?this.arguments?(Fn.length=0,e!==void 0&&e.length>0&&Fn.push(...e),Fn.push(...this.arguments),t.call(this.target,...Fn),Fn.length=0):t.call(this.target,...e):this.arguments?this.target[this.methodName]=this.arguments[0]||e[0]:this.target[this.methodName]=e[0]}}}}const fT=n=>/^[A-Z]*$/.test(n);class Ru extends Event{constructor(){super(...arguments),a(this,"args")}}class xe{constructor(e){if(a(this,"isEventList",!0),a(this,"target"),a(this,"key"),a(this,"_isInvoking",!1),a(this,"methods",[]),a(this,"_methodsCopy",[]),this.methods=[],Array.isArray(e))for(const t of e)t instanceof Un?this.methods.push(t):typeof t=="function"&&this.methods.push(new Un(t));else typeof e=="function"&&this.methods.push(new Un(e))}__internalOnInstantiate(e){var t;const s=new Array;for(let o=0;o<this.methods.length;o++){const r=this.methods[o];if(!(r.target instanceof Function)){const l=r.target;let c=l?.uuid;if(l&&(c=l.guid),c){const h=e[c];if(h){const d=(t=r.arguments)==null?void 0:t.map(u=>u instanceof Object&&u.uuid?e[u.uuid]:u!=null&&u.isComponent?e[u.guid]:u);s.push(new Un(h.clone,r.methodName,d,r.enabled))}else F()&&console.warn("Could not find target for event listener")}}}return new xe(s)}setEventTarget(e,t){if(this.key=e,this.target=t,this.key!==void 0){let s="",o=!1;for(const r of this.key)o&&fT(r)&&(s+="-"),o=!0,s+=r.toLowerCase();this.key=s}}get listenerCount(){var e;return((e=this.methods)==null?void 0:e.length)??0}get isInvoking(){return this._isInvoking}static from(...e){return new xe(e)}invoke(...e){var t;if(this._isInvoking)return console.warn("Circular event invocation detected. Please check your event listeners for circular references.",this),!1;if(((t=this.methods)==null?void 0:t.length)<=0)return!1;this._isInvoking=!0;try{this._methodsCopy.length=0,this._methodsCopy.push(...this.methods);for(const s of this._methodsCopy)s.invoke(...e);if(typeof this.target=="object"&&typeof this.key=="string"){const s=this.target.dispatchEvent;if(typeof s=="function"){const o=new Ru(this.key);o.args=e,s.call(this.target,o)}}}finally{this._isInvoking=!1,this._methodsCopy.length=0}return!0}addEventListener(e){return this.methods.push(new Un(e)),e}removeEventListener(e){if(e)for(let t=this.methods.length-1;t>=0;t--)this.methods[t].target===e&&(this.methods[t].enabled=!1,this.methods.splice(t,1))}removeAllEventListeners(){this.methods.length=0}}class yT extends es{constructor(){super([oe,he],"ColorSerializer")}onDeserialize(e){if(e!=null)return e.a!==void 0?new he(e.r,e.g,e.b,e.a):e.alpha!==void 0?new he(e.r,e.g,e.b,e.alpha):new oe(e.r,e.g,e.b)}onSerialize(e){if(e!=null)return e.a!==void 0?{r:e.r,g:e.g,b:e.b,a:e.a}:{r:e.r,g:e.g,b:e.b}}}const vT=new yT;class bT extends es{constructor(){super([Dt],"EulerSerializer")}onDeserialize(e,t){if(e!=null){if(e.order)return new Dt(e.x,e.y,e.z,e.order);if(e.x!=null)return new Dt(e.x,e.y,e.z)}}onSerialize(e,t){return{x:e.x,y:e.y,z:e.z,order:e.order}}}const _T=new bT;class wT extends es{constructor(){super(E,"ObjectSerializer")}onSerialize(e,t){if(t.objectToNode!==void 0&&e.uuid){const s=t.objectToNode[e.uuid];return wt&&console.log(s,e.name,e.uuid),{node:s}}}onDeserialize(e,t){var s,o,r;if(typeof e=="string"){if(e.endsWith(".glb")||e.endsWith(".gltf")){if(t.serializable instanceof Array&&t.serializable.includes(ce))return;F()&&be("Detected wrong usage of @serializable with Object3D or GameObject. Instead you should use AssetReference here! Please see the console for details.");const l=(o=(s=t.target)==null?void 0:s.constructor)==null?void 0:o.name;console.warn(`Wrong usage of @serializable detected in your script "${l}"
|
|
928
|
+
|
|
929
|
+
It looks like you used @serializable(Object3D) or @serializable(GameObject) for a prefab or scene reference which is exported to a separate glTF file.
|
|
930
|
+
|
|
931
|
+
To fix this please change your code to:
|
|
932
|
+
|
|
933
|
+
@serializable(AssetReference)
|
|
934
|
+
${t.path}! : AssetReference;
|
|
935
|
+
\0`)}return}if(e){if(e.node!==void 0&&t.nodeToObject){const l=t.nodeToObject[e.node];return wt&&console.log("Deserialized object reference?",e,l,t?.nodeToObject),l||console.warn("Did not find node: "+e.node,t.nodeToObject,t.object),l}else if(e.guid){if(!t.context){console.error("Missing context");return}let l;const c=(r=t.gltf)==null?void 0:r.scene;return c&&(l=P.findByGuid(e.guid,c)),l||(l=P.findByGuid(e.guid,t.context.scene)),l?(l&&l.isComponent===!0&&(wt&&console.warn("Deserialized object reference is a component"),l=l.gameObject),wt&&console.log("Deserialized object reference?",e,l,t?.nodeToObject)):((F()||wt)&&console.warn("Could not resolve object reference",t.path,e,t.target,t.context.scene),e.could_not_resolve=!0),l}}}}const Sx=new wT;class xT extends es{constructor(){super([I,I],"ComponentSerializer")}onSerialize(e,t){if(e!=null&&e.guid)return{guid:e.guid}}onDeserialize(e,t){var s;if(e!=null&&e.guid){if(e.___persistentAsset){wt&&console.log("Skipping component deserialization because it's a persistent asset",e);return}const o=t.path;wt&&console.log(e.guid,t.root,t.object,t.target);let r=this.findObjectForGuid(e.guid,t.root);if(r||t.context&&(r=this.findObjectForGuid(e.guid,(s=t.context)==null?void 0:s.scene),r))return r;(F()||wt)&&console.warn('Could not resolve component reference: "'+o+'" using guid '+e.guid,t.target),e.could_not_resolve=!0;return}}findObjectForGuid(e,t){if(t.guid===e)return t;const s=P.foreachComponent(t,o=>{if(o.guid===e)return o},!1);if(s!==void 0)return s;for(let o=0;o<t.children.length;o++){const r=t.children[o],l=this.findObjectForGuid(e,r);if(l)return l}}}const Tu=new xT;class ST extends es{constructor(){super([xe])}onSerialize(e,t){console.log("TODO: SERIALIZE EVENT")}onDeserialize(e,t){var s,o,r;if(typeof e=="function")return new xe([new Un(e,null,[],!0)]);if(e&&e.type==="EventList"){wt&&console.log("DESERIALIZE EVENT",e);const l=new Array;if(e.calls&&Array.isArray(e.calls))for(const d of e.calls){let u=function(f){if(typeof f=="object"){let y=Sx.onDeserialize(f,t);if(y||(y=Tu.onDeserialize(f,t)),y)return y}return f};wt&&console.log(d);let p=Tu.findObjectForGuid(d.target,t.root);!p&&(s=t.context)!=null&&s.scene&&(p=Tu.findObjectForGuid(d.target,(o=t.context)==null?void 0:o.scene));const g=((r=d.method)==null?void 0:r.length)>0;if(p&&g){const f=()=>{const y=d.method[0].toUpperCase()+d.method.slice(1);if(typeof p[y]=="function"){console.warn(`EventList method:
|
|
936
|
+
Could not find method ${d.method} on object ${p.name}. Please rename ${d.method} to ${y}?
|
|
937
|
+
`,p[y],`
|
|
938
|
+
in script: `,p),be("EventList methods must start with lowercase letter, see console for details");return}else console.warn(`EventList method:
|
|
939
|
+
Could not find method ${d.method} on object ${p.name}`,p,typeof p[d.method])};if(typeof p[d.method]!="function"){let y=!1,v=p;for(;v;){const b=Object.getOwnPropertyDescriptor(v,d.method);if(b&&(b.writable===!0||b.set)){y=!0;break}v=Object.getPrototypeOf(v)}!y&&(F()||wt)&&f()}}if(p){let f=d.argument;if(f!==void 0?f=u(f):d.arguments!==void 0&&(f=d.arguments.map(u)),!p[d.method])console.warn(`EventList method not found: "${d.method}" on ${p?.name}`);else{f!==void 0&&!Array.isArray(f)&&(f=[f]);const y=new Un(p,d.method,f,d.enabled);l.push(y)}}else F()&&console.warn("[Debug] EventList: Could not find event listener in scene",d,t.object,e)}const c=new xe(l);wt&&console.log(c);const h=t.target;return h!==void 0&&t.path!==void 0&&c.setEventTarget(t.path,h),c}}}const CT=new ST,Eu=new WeakMap,PT=je.prototype.clone;je.prototype.clone=function(){const n=PT.call(this);return Eu.has(n)||Eu.set(n,this),n};class Cx extends es{constructor(){super([Ac,$s])}onSerialize(e,t){}onDeserialize(e,t){if(e instanceof je&&t.type===Ac){let s=e;Eu.has(s)&&(s=Eu.get(s)),s.isRenderTargetTexture=!0,s.flipY=!0,s.offset.y=1,s.repeat.y=-1,s.needsUpdate=!0,s.mipmaps=[],s instanceof XC&&(s.isCompressedTexture=!1,s.format=fd);const o=new Ac(s.image.width,s.image.height,{colorSpace:On});return o.texture=s,o}}}new Cx;class Px extends es{constructor(){super([URL])}onSerialize(e,t){return null}onDeserialize(e,t){if(typeof e=="string"&&e.length>0)return yo(t.gltfId,e)}}new Px;var OT=Object.defineProperty,kT=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&OT(e,t,o),o};class Qa extends I{awake(){ii.createIfNoneExists(this.context)}onEnable(){var e;(e=ii.get(this.context))==null||e.register(this)}onDisable(){var e;(e=ii.get(this.context))==null||e.unregister(this)}}class ji extends Qa{constructor(){super(...arguments),a(this,"targets",null),a(this,"raycastHits",[]),a(this,"ignoreSkinnedMeshes",!1)}start(){this.targets=[this.gameObject]}performRaycast(e=null){if(!this.targets)return null;e??(e=new Qs),e.targets=this.targets,e.results=this.raycastHits,e.useAcceleratedRaycast=!0;const t=e.testObject;this.ignoreSkinnedMeshes&&(e.testObject=o=>o instanceof Pn?"continue in children":t?t(o):!0);const s=this.context.physics.raycast(e);return e.testObject=t,s}}kT([m()],ji.prototype,"ignoreSkinnedMeshes");class Au extends ji{constructor(){super(),this.ignoreSkinnedMeshes=!0}}const Ox=class yC extends Qa{performRaycast(e){if(!ne.active||!yC.allow||!(e!=null&&e.ray))return null;const t=e.ray.origin;return this.context.physics.sphereOverlap(t,.015,!1,!0)}};a(Ox,"allow",!0);let Dc=Ox;class zf{static getObject(e){const t=e[Mi];return t&&(t.isComponent===!0?e=t.gameObject:e=t),e}static isInteractable(e,t){if(t&&(t.canvasGroup=void 0,t.graphic=void 0),e==null||!e.visible||(e=this.getObject(e),!e.visible))return!1;const s=this.tryFindCanvasGroup(e);if(s?.isCanvasGroup===!0&&(t&&(t.canvasGroup=s),s.blocksRaycasts===!1||s.interactable===!1))return!1;const o=Ar(e,r=>{if(r.isGraphic===!0)return r},!1);return t&&o?.isGraphic===!0&&(t.graphic=o),!(o?.raycastTarget===!1||o?.layer===2)}static tryFindCanvasGroup(e){if(!e)return null;const t=Ar(e,s=>{const o=s;if(o.blocksRaycasts!==void 0&&o.interactable!==void 0)return o},!1);return t!==void 0?t:this.tryFindCanvasGroup(e.parent)}}function Nf(n){return n[Mi]||(n.parent?Nf(n.parent):null)}function MT(n){return n.isUI===!0||typeof n[Mi]=="object"}function Iu(n,e){if(!n)return;const t=n.material;if(t?.isMaterial===!0){const s=n.parent;s&&s.isText,t.side=e.doubleSided??!0?Pi:fo,t.shadowSide=e.doubleSided?Pi:fo,n.castShadow=e.castShadows?e.castShadows:!1,n.receiveShadow=e.receiveShadows?e.receiveShadows:!1}for(const s of n.children)Iu(s,e)}function Ya(n,e,t){n[e]===void 0&&console.warn("Field",e,"is undefined on",n);const s=Proxy.revocable(n[e],{set(l,c,h,d){const u=l[c],p=Reflect.set(l,c,h,d);return t(h,u),p}}),o=s.revoke,r=n[e];return s.revoke=()=>{n[e]=r,o()},n[e]=s.proxy,s}const kx=Symbol("Scheduled action");function RT(n,e,t=Oe.OnBeforeRender){let s=n[kx];s||(s=n[kx]={});const o=e.name;s[t]||(s[t]={});const r=s[t];if(r[o])return;function*l(){e?.call(n),r[o]=null}const c=n.startCoroutine(l(),t);r[o]=c}const Eo=C("debugeventsystem");var Wf=(n=>(n.BeforeHandleInput="BeforeHandleInput",n.AfterHandleInput="AfterHandleInput",n))(Wf||{});vx(n=>{ii.createIfNoneExists(n)});class ii extends I{constructor(){super(...arguments),a(this,"raycaster",[]),a(this,"pressedByID",new Map),a(this,"hoveredByID",new Map),a(this,"onPointerEvent",e=>{if(e===void 0||e.propagationStopped||e.defaultPrevented||e.used)return;const t=new cd(this.context.input,e);this._currentPointerEventName=e.type,t.inputSource=this.context.input,t.isClick=e.isClick,t.isDoubleClick=e.isDoubleClick,t.isDown=e.type==Be.PointerDown,t.isUp=e.type==Be.PointerUp,t.isPressed=this.context.input.getPointerPressed(e.pointerId),Eo&&(t.isDown?console.log("DOWN",t.pointerId):t.isUp&&console.log("UP",t.pointerId),t.isClick&&console.log("CLICK",t.pointerId));const s=new Qs;e.hasRay?s.ray=e.ray:s.screenPoint=this.context.input.getPointerPositionRC(e.pointerId);const o=this.performRaycast(s);if(o){for(const l of o)l.event=e,e.intersections.push(l);e.origin.onPointerHits&&e.origin.onPointerHits({sender:this,event:e,hits:o})}Eo&&t.isClick&&De("EventSystem: "+t.pointerId+" - "+this.context.time.frame+" - Up:"+t.isUp+", Down:"+t.isDown);const r={sender:this,args:t,hasActiveUI:this.currentActiveMeshUIComponents.length>0};this.dispatchEvent(new CustomEvent("BeforeHandleInput",{detail:r})),this.handleIntersections(o,t),this.dispatchEvent(new CustomEvent("AfterHandleInput",{detail:r}))}),a(this,"_sortedHits",[]),a(this,"_testObjectsCache",new Map),a(this,"_currentlyActiveRaycaster",null),a(this,"_currentPointerEventName",null),a(this,"shouldRaycastObject",e=>{var t;const s=e&&"getComponent"in e?e.getComponent(Qa):null;if(s&&s!=this._currentlyActiveRaycaster)return!1;let o=null;if(MT(e)&&(o=(t=e[Mi])==null?void 0:t.gameObject),this._testObjectsCache.has(e)||o&&this._testObjectsCache.has(o))return this._testObjectsCache.get(e)===!1?"continue in children":!0;{let r=Mu(e,this._currentPointerEventName);if(!r&&o&&(r=Mu(o,this._currentPointerEventName)),r){this._testObjectsCache.set(e,!0);for(const l of e.children)this.shouldRaycastObject_AddToYesCache(l);return!0}return this._testObjectsCache.set(e,!1),"continue in children"}}),a(this,"_sortingBuffer",[]),a(this,"_noDepthTestingResults",[]),a(this,"out",{}),a(this,"_capturedPointer",{}),a(this,"pointerEnterSymbol",Symbol("pointerEnter")),a(this,"pointerExitSymbol",Symbol("pointerExit")),a(this,"currentActiveMeshUIComponents",[])}static ensureUpdateMeshUI(e,t,s=!1){Ao.update(e,t,s)}static markUIDirty(e){Ao.markDirty()}static createIfNoneExists(e){e.scene.getComponent(ii)||e.scene.addComponent(ii)}static get(e){return this.createIfNoneExists(e),e.scene.getComponent(ii)}static get instance(){return this.get(J.Current)}register(e){var t;e&&this.raycaster&&!this.raycaster.includes(e)&&((t=this.raycaster)==null||t.push(e))}unregister(e){var t,s;const o=(t=this.raycaster)==null?void 0:t.indexOf(e);o!==void 0&&o!==-1&&((s=this.raycaster)==null||s.splice(o,1))}get hasActiveUI(){return this.currentActiveMeshUIComponents.length>0}get isHoveringObjects(){return this.hoveredByID.size>0}awake(){this.gameObject!==this.context.scene&&(console.debug(`[Needle Engine] EventSystem is only allowed on the scene root. Disabling EventSystem on '${this.gameObject.name}'`),this.enabled=!1)}start(){this.context.scene.getComponent(Qa)||this.context.scene.addComponent(ji)}onEnable(){this.context.input.addEventListener(Be.PointerDown,this.onPointerEvent),this.context.input.addEventListener(Be.PointerUp,this.onPointerEvent),this.context.input.addEventListener(Be.PointerMove,this.onPointerEvent)}onDisable(){this.context.input.removeEventListener(Be.PointerDown,this.onPointerEvent),this.context.input.removeEventListener(Be.PointerUp,this.onPointerEvent),this.context.input.removeEventListener(Be.PointerMove,this.onPointerEvent)}onBeforeRender(){this.resetMeshUIStates()}shouldRaycastObject_AddToYesCache(e){this._testObjectsCache.set(e,!0);for(const t of e.children)this.shouldRaycastObject_AddToYesCache(t)}performRaycast(e){if(!this.raycaster)return null;this._testObjectsCache.clear(),this._sortedHits.length=0,e||(e=new Qs),e.testObject=this.shouldRaycastObject;for(const t of this.raycaster){if(!t.activeAndEnabled)continue;this._currentlyActiveRaycaster=t;const s=t.performRaycast(e);this._currentlyActiveRaycaster=null,s&&s.length>0&&this._sortedHits.push(...s)}return this._sortedHits.sort((t,s)=>t.distance-s.distance),this._sortedHits}assignHitInformation(e,t){t?(e.intersection=t,e.point=t.point,e.normal=t.normal,e.face=t.face,e.distance=t.distance,e.instanceId=t.instanceId):(e.intersection=void 0,e.point=void 0,e.normal=void 0,e.face=void 0,e.distance=void 0,e.instanceId=void 0)}handleIntersections(e,t){var s;if(e!=null&&e.length){e=this.sortCandidates(e);for(const r of e){if(t.event.immediatePropagationStopped)return!1;if(this.assignHitInformation(t,r),this.handleEventOnObject(r.object,t))return!0}}this.assignHitInformation(t,e?.[0]),this.invokePointerCapture(t);const o=this.hoveredByID.get(t.pointerId);return o&&this.propagatePointerExit(o.obj,o.data,null),this.hoveredByID.delete(t.pointerId),t.isUp&&((s=this.pressedByID.get(t.pointerId))==null||s.handlers.forEach(r=>this.invokeOnPointerUp(t,r)),this.pressedByID.delete(t.pointerId)),!1}sortCandidates(e){this._sortingBuffer.length=0,this._noDepthTestingResults.length=0;for(let t=0;t<e.length;t++){const s=e[t],o=s.object;if(o.material&&o.material.depthTest===!1){this._noDepthTestingResults.push(s);continue}this._sortingBuffer.push(s)}for(const t of this._sortingBuffer)this._noDepthTestingResults.push(t);return this._noDepthTestingResults}handleEventOnObject(e,t){if(!this.testIsVisible(e))return t.isClick&&Eo&&console.log("not allowed",e),!1;if(t.pointerId===void 0)return Eo&&console.error("Event without pointer can't be handled",t),!1;t.object=e;const s=e.parent,o=t.isClick??!1;let r=null;if(s&&s.isUI){const d=(t.isPressed||t.isClick)??!1;if(s[Mi]){const u=s[Mi].gameObject;if(u){if(!zf.isInteractable(u,this.out))return!1;r=this.out.canvasGroup??null,this.handleMeshUIIntersection(e,d),e=u}}}o&&Eo&&console.log(this.context.time.frame,e);const l=this.hoveredByID.get(t.pointerId),c=l?.obj;c!==e&&c&&this.propagatePointerExit(c,l.data,e);const h=this.hoveredByID.get(t.pointerId);if(h?(h.obj=e,h.data=t):this.hoveredByID.set(t.pointerId,{obj:e,data:t}),t.isDown){const d=this.pressedByID.get(t.pointerId);d?(d.obj=e,d.data=t):this.pressedByID.set(t.pointerId,{obj:e,data:t,handlers:new Set})}return(r===null||r.interactable)&&this.handleMainInteraction(e,t,c??null),!0}propagate(e,t){for(;e;)P.foreachComponent(e,s=>{t(s)},!1),e=e.parent}handleMainInteraction(e,t,s){const o=this.pressedByID.get(t.pointerId),r=s!==e;let l=!0;switch(t.event.pointerType){case"mouse":case"touch":const c=this.context.input.getPointerPositionLastFrame(t.pointerId),h=this.context.input.getPointerPosition(t.pointerId);l=c&&!W.approximately(c,h);break}this.propagate(e,c=>{var h;const d=c;d.interactable!==!1&&(!d.activeAndEnabled||!d.enabled||(d.onPointerEnter&&r&&this.handlePointerEnter(d,t),t.isDown&&d.onPointerDown&&(d.onPointerDown(t),o?.handlers.add(d),this.handlePointerCapture(t,d)),d.onPointerMove&&(l&&d.onPointerMove(t),this.handlePointerCapture(t,d)),t.isUp&&(d.onPointerUp&&(this.invokeOnPointerUp(t,d),o?.handlers.delete(d)),d.onPointerExit&&((h=t.event)==null?void 0:h.pointerType)===Ud.Touch&&(this.handlePointerExit(d,t),this.hoveredByID.delete(t.pointerId))),t.isClick&&d.onPointerClick&&d.onPointerClick(t)))}),t.isUp&&(o?.handlers.forEach(c=>{this.invokeOnPointerUp(t,c)}),this.pressedByID.delete(t.pointerId))}propagatePointerExit(e,t,s){this.propagate(e,o=>{if(!o.gameObject||o.destroyed)return;const r=o;if(r.onPointerExit||r.onPointerEnter){if(s&&this.isChild(s,o.gameObject))return;this.handlePointerExit(r,t)}})}invokeOnPointerUp(e,t){var s;(s=t.onPointerUp)==null||s.call(t,e),this.releasePointerCapture(e,t)}handlePointerEnter(e,t){e.onPointerEnter&&this.updatePointerState(e,t.pointerId,this.pointerEnterSymbol,!0)&&e.onPointerEnter(t),this.updatePointerState(e,t.pointerId,this.pointerExitSymbol,!1)}handlePointerExit(e,t){e.onPointerExit&&this.updatePointerState(e,t.pointerId,this.pointerExitSymbol,!0)&&e.onPointerExit(t),this.updatePointerState(e,t.pointerId,this.pointerEnterSymbol,!1)}updatePointerState(e,t,s,o){let r=e[s];if(o)return r&&r.includes(t)?!1:(r=r||[],r.push(t),e[s]=r,!0);{if(!r||!r.includes(t))return!1;const l=r.indexOf(t);return l!==-1&&r.splice(l,1),!0}}handlePointerCapture(e,t){if(e.z__pointer_ctured){e.z__pointer_ctured=!1;const s=e.pointerId;if(t.onPointerMove){const o=this._capturedPointer[s]||[];o.push(t),this._capturedPointer[s]=o}else F()&&!t.z__warned_no_pointermove&&(t.z__warned_no_pointermove=!0,console.warn("PointerCapture was requested but the component doesn't implement onPointerMove. It will not receive any pointer events"))}else e.z__pointer_cture_rleased&&(e.z__pointer_cture_rleased=!1,this.releasePointerCapture(e,t))}releasePointerCapture(e,t){const s=e.pointerId;if(this._capturedPointer[s]){const o=this._capturedPointer[s].indexOf(t);o!==-1&&(this._capturedPointer[s].splice(o,1),Eo&&console.log("released pointer capture",s,t,this._capturedPointer))}}invokePointerCapture(e){var t;if(e.event.type===Be.PointerMove){const s=e.pointerId,o=this._capturedPointer[s];if(o){Eo&&console.log("Captured",s,o);for(let r=0;r<o.length;r++){const l=o[r];if(l.destroyed){o.splice(r,1),r--;continue}(t=l.onPointerMove)==null||t.call(l,e)}}}}isChild(e,t){return!e||!t?!1:e===t?!0:e.parent?this.isChild(e.parent,t):!1}handleMeshUiObjectWithoutShadowDom(e,t){return!e||!e.isUI?!0:this.handleMeshUIIntersection(e,t)}handleMeshUIIntersection(e,t){const s=Ao.updateState(e,t);return s&&this.currentActiveMeshUIComponents.push(s),s!==null}resetMeshUIStates(){if(this.context.input.getPointerPressedCount()>0&&Ao.resetLastSelected(),!(!this.currentActiveMeshUIComponents||this.currentActiveMeshUIComponents.length<=0)){for(let e=0;e<this.currentActiveMeshUIComponents.length;e++){const t=this.currentActiveMeshUIComponents[e];Ao.resetState(t)}this.currentActiveMeshUIComponents.length=0}}testIsVisible(e){return e?P.isActiveSelf(e)?this.testIsVisible(e.parent):!1:!0}}class Ao{static markDirty(){this.needsUpdate=!0}static update(e,t,s=!1){if(s){e.update();return}const o=t.time.frameCount;for(const r of this.lastUpdateFrame)if(r.context===t){if(o===r.frame)return;r.frame=o;let l=this.needsUpdate||o<1;r.nextUpdate<=o&&(l=!0),l&&(Eo&&console.log("Update threemeshui"),this.needsUpdate=!1,r.nextUpdate=o+60,e.update());return}this.lastUpdateFrame=[{context:t,frame:o,nextUpdate:o+60}],e.update(),this.needsUpdate=!1}static updateState(e,t){let s=null;if(e&&(s=this.findBlockOrTextInParent(e),s&&s!==this.lastSelected)){if(s.interactable===!1)return null;this.needsUpdate=!0}return s}static resetLastSelected(){const e=this.lastSelected;e&&(this.lastSelected=null,this.resetState(e))}static resetState(e){e&&(this.needsUpdate=!0)}static findBlockOrTextInParent(e){return e?e.isBlock||e.isText?e:this.findBlockOrTextInParent(e.parent):null}}a(Ao,"lastSelected",null),a(Ao,"lastUpdateFrame",[]),a(Ao,"needsUpdate",!1);var TT=Object.defineProperty,Ue=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&TT(e,t,o),o};const is=C("debugorbit"),Vf=C("freecam"),Bc=C("debugcamerafit"),Lu=C("smoothcam"),ET={LEFT:"",UP:"",RIGHT:"",BOTTOM:""};let $f;class Fc extends CustomEvent{constructor(e,t){super("target-reached",{detail:{controls:e,type:t}})}}class _e extends I{constructor(){super(...arguments),a(this,"autoTarget",!0),a(this,"autoFit",!1),a(this,"enableRotate",!0),a(this,"autoRotate",!1),a(this,"autoRotateSpeed",1),a(this,"minAzimuthAngle",1/0),a(this,"maxAzimuthAngle",1/0),a(this,"minPolarAngle",0),a(this,"maxPolarAngle",Math.PI),a(this,"enableKeys",!1),a(this,"enableDamping",!0),a(this,"dampingFactor",.1),a(this,"enableZoom",!0),a(this,"minZoom",0),a(this,"maxZoom",1/0),a(this,"zoomSpeed",1),a(this,"zoomToCursor",!1),a(this,"enablePan",!0),a(this,"lookAtConstraint",null),a(this,"lookAtConstraint01",1),a(this,"allowInterrupt",!0),a(this,"middleClickToFocus",!0),a(this,"doubleClickToFocus",!0),a(this,"clickBackgroundToFitScene",2),a(this,"debugLog",!1),a(this,"targetLerpDuration",1),a(this,"_controls",null),a(this,"_cameraObject",null),a(this,"_lookTargetLerpActive",!1),a(this,"_lookTargetStartPosition",new S),a(this,"_lookTargetEndPosition",new S),a(this,"_lookTargetLerp01",0),a(this,"_lookTargetLerpDuration",0),a(this,"_cameraLerpActive",!1),a(this,"_cameraStartPosition",new S),a(this,"_cameraEndPosition",new S),a(this,"_cameraLerp01",0),a(this,"_cameraLerpDuration",0),a(this,"_fovLerpActive",!1),a(this,"_fovLerpStartValue",0),a(this,"_fovLerpEndValue",0),a(this,"_fovLerp01",0),a(this,"_fovLerpDuration",0),a(this,"_inputs",0),a(this,"_enableTime",0),a(this,"_startedListeningToKeyEvents",!1),a(this,"_eventSystem"),a(this,"_afterHandleInputFn"),a(this,"_camera",null),a(this,"_syncedTransform"),a(this,"_didSetTarget",0),a(this,"targetElement",null),a(this,"_activePointerEvents"),a(this,"_lastTimeClickOnBackground",-1),a(this,"_clickOnBackgroundCount",0),a(this,"_onPointerDown",e=>{this._activePointerEvents.push(e)}),a(this,"_onPointerDownLate",e=>{e.used&&this._controls&&(this._controls.enabled=!1)}),a(this,"_onPointerUp",e=>{for(let t=this._activePointerEvents.length-1;t>=0;t--){const s=this._activePointerEvents[t];if(s.pointerId===e.pointerId&&s.button===e.button){this._activePointerEvents.splice(t,1);break}}if(this.clickBackgroundToFitScene>0&&e.isClick&&e.button===0){if(e.hasRay||e.intersections.push(...this.context.physics.raycast()),e.intersections.length<=0){const t=this.context.time.time-this._lastTimeClickOnBackground;this._lastTimeClickOnBackground=this.context.time.time,this.clickBackgroundToFitScene<=1||t<this.clickBackgroundToFitScene*.15?(this._clickOnBackgroundCount+=1,this._clickOnBackgroundCount>=this.clickBackgroundToFitScene-1&&this.fitCamera(this.context.scene.children,{immediate:!1})):this._clickOnBackgroundCount=0}is&&console.log(this.clickBackgroundToFitScene,e.intersections.length,this._clickOnBackgroundCount)}}),a(this,"_onPointerUpLate",e=>{this.doubleClickToFocus&&e.isDoubleClick&&!e.used&&this.setTargetFromRaycast()}),a(this,"_orbitStartAngle",0),a(this,"onControlsChangeStarted",()=>{this._controls&&(this._orbitStartAngle=this._controls.getAzimuthalAngle()+this._controls.getPolarAngle()),this._syncedTransform&&this._syncedTransform.requestOwnership()}),a(this,"onControlsChangeEnded",()=>{if(this._controls&&this.autoTarget){const e=this._controls.getAzimuthalAngle()+this._controls.getPolarAngle()-this._orbitStartAngle;Math.abs(e)<.01?(is&&console.debug("OrbitControls: No movement detected, updating target now"),this.updateTargetNow()):is&&console.debug("OrbitControls: Movement detected",e)}}),a(this,"_shouldDisable",!1),a(this,"__onPreRender",()=>{const e=this.context.pre_render_callbacks.indexOf(this.__onPreRender);e>=0&&this.context.pre_render_callbacks.splice(e,1),this.autoFit&&(this.autoFit=!1,this.fitCamera({centerCamera:"y",immediate:!0,objects:this.scene.children}))}),a(this,"_haveAttachedKeyboardEvents",!1)}get isCameraController(){return!0}get controls(){return this._controls}get controllerObject(){return this._cameraObject}onStartInteraction(e){var t;(t=this.controls)==null||t.addEventListener("start",e)}get targetLerpSpeed(){return 5}set targetLerpSpeed(e){this.targetLerpDuration=1/e}awake(){is&&console.debug("OrbitControls",this),this._didSetTarget=0,this._startedListeningToKeyEvents=!1}start(){this._eventSystem=ii.get(this.context)??void 0,this._eventSystem&&(this._afterHandleInputFn=this.afterHandleInput.bind(this),this._eventSystem.addEventListener(Wf.AfterHandleInput,this._afterHandleInputFn))}onDestroy(){var e,t;(e=this._controls)==null||e.dispose(),(t=this._eventSystem)==null||t.removeEventListener(Wf.AfterHandleInput,this._afterHandleInputFn)}onEnable(){this._didSetTarget=0,this._enableTime=this.context.time.time;const e=P.getComponent(this.gameObject,ci);this._camera=e;let t=e?.threeCamera;if(!t&&this.gameObject instanceof we&&(t=this.gameObject),t&&rg(t,this,!0),!this._controls&&t instanceof E){this._cameraObject=t;const s=this.targetElement??this.context.renderer.domElement,o=t?.quaternion.clone();this._controls=new $v(t,s),t?.quaternion.copy(o),$f===void 0&&($f={...this._controls.keys});const r=ee(t),l=this.gameObject.worldForward,c=r.clone().sub(l.multiplyScalar(2.5));this._controls.target.copy(c)}if(this._controls)if(Vf&&(this.enablePan=!0,this.enableZoom=!0,this.middleClickToFocus=!0,X.isMobileDevice()&&(this.doubleClickToFocus=!0)),this._controls.addEventListener("start",this.onControlsChangeStarted),this._controls.addEventListener("end",this.onControlsChangeEnded),!this._startedListeningToKeyEvents&&this.enableKeys)this._startedListeningToKeyEvents=!0,this._controls.listenToKeyEvents(this.context.domElement);else try{this._controls.stopListenToKeyEvents()}catch{}this._syncedTransform=P.getComponent(this.gameObject,sn)??void 0,this.context.pre_render_callbacks.push(this.__onPreRender),this._activePointerEvents=[],this.context.input.addEventListener("pointerdown",this._onPointerDown,{queue:oi.Early}),this.context.input.addEventListener("pointerdown",this._onPointerDownLate,{queue:oi.Late}),this.context.input.addEventListener("pointerup",this._onPointerUp,{queue:oi.Early}),this.context.input.addEventListener("pointerup",this._onPointerUpLate,{queue:oi.Late})}onDisable(){var e;if((e=this._camera)!=null&&e.threeCamera&&rg(this._camera.threeCamera,this,!1),this._controls){this._controls.enabled=!1,this._controls.autoRotate=!1,this._controls.removeEventListener("start",this.onControlsChangeStarted),this._controls.removeEventListener("end",this.onControlsChangeEnded);try{this._controls.stopListenToKeyEvents()}catch{}this._startedListeningToKeyEvents=!1}this._activePointerEvents.length=0,this.context.input.removeEventListener("pointerdown",this._onPointerDown),this.context.input.removeEventListener("pointerdown",this._onPointerDownLate),this.context.input.removeEventListener("pointerup",this._onPointerUp),this.context.input.removeEventListener("pointerup",this._onPointerUpLate)}updateTargetNow(){var e,t,s;const o=new po((e=this._cameraObject)==null?void 0:e.worldPosition,(t=this._cameraObject)==null?void 0:t.worldForward.multiplyScalar(-1)),r=this.context.physics.raycastFromRay(o),l=r.length>0?r[0]:void 0;l&&l.distance>this.minZoom&&l.distance<this.maxZoom&&(is&&$.DrawWireSphere(l.point,.1,16711680,2),(s=this._controls)==null||s.target.copy(r[0].point))}afterHandleInput(e){e.detail.args.pointerId===0&&(e.detail.args.isDown?this._controls&&this._eventSystem&&(this._shouldDisable=this._eventSystem.hasActiveUI):(!e.detail.args.isPressed||e.detail.args.isUp)&&(this._shouldDisable=!1))}onBeforeRender(){var e,t,s,o;if(!!this._controls){if(this._cameraObject!==this.context.mainCamera){this._controls.enabled=!1;return}if(this._controls.enabled=!0,(this.context.input.getPointerDown(1)||this.context.input.getPointerDown(2)||this.context.input.mouseWheelChanged||this.context.input.getPointerPressed(0)&&(e=this.context.input.getPointerPositionDelta(0))!=null&&e.length())&&(this._inputs+=1),this._inputs>0&&this.allowInterrupt&&(this.enableRotate&&(this.autoRotate=!1),this._cameraLerpActive=!1,this._lookTargetLerpActive=!1),this._inputs=0,this.autoTarget&&this._didSetTarget++===0){const r=P.getComponent(this.gameObject,ci);if(r&&!this.setLookTargetFromConstraint()){this.debugLog&&console.log("NO TARGET");const l=ee(r.threeCamera),c=Math.max(.01,l.length()),h=new S(0,0,-c).applyMatrix4(r.threeCamera.matrixWorld);is&&$.DrawLine(l,h,5592575,10),this.setLookTargetPosition(h,!0)}if(!this.setLookTargetFromConstraint()){const l=new Qs;l.screenPoint=new re(0,0),l.lineThreshold=.1;const c=this.context.physics.raycast(l);c.length>0&&this.setLookTargetPosition(c[0].point,!0),Bc&&console.log("OrbitControls hits",...c)}}if(this.middleClickToFocus&&this.context.input.getPointerClicked(1)&&this.setTargetFromRaycast(),this._lookTargetLerpActive||this._cameraLerpActive||this._fovLerpActive){if(this._cameraLerpActive&&this._cameraObject)if(this._cameraLerp01+=this.context.time.deltaTime/this._cameraLerpDuration,this._cameraLerp01>=1)this._cameraObject.position.copy(this._cameraEndPosition),this._cameraLerpActive=!1,this.dispatchEvent(new Fc(this,"camera"));else{const r=W.easeInOutCubic(this._cameraLerp01);this._cameraObject.position.lerpVectors(this._cameraStartPosition,this._cameraEndPosition,r)}if(this._lookTargetLerpActive)if(this._lookTargetLerp01+=this.context.time.deltaTime/this._lookTargetLerpDuration,this._lookTargetLerp01>=1)this._controls.target.copy(this._lookTargetEndPosition),this._lookTargetLerpActive=!1,this.dispatchEvent(new Fc(this,"lookat"));else{const r=W.easeInOutCubic(this._lookTargetLerp01);this._controls.target.lerpVectors(this._lookTargetStartPosition,this._lookTargetEndPosition,r)}if(this._fovLerpActive&&this._cameraObject){const r=this._cameraObject;if(this._fovLerp01+=this.context.time.deltaTime/this._fovLerpDuration,this._fovLerp01>=1)r.fov=this._fovLerpEndValue,this._fovLerpActive=!1;else{const l=W.easeInOutCubic(this._fovLerp01);r.fov=W.lerp(this._fovLerpStartValue,this._fovLerpEndValue,l)}r.updateProjectionMatrix()}}if(this._controls){if(this.debugLog&&(this._controls.domElement=this.context.renderer.domElement),this._controls.enabled=!this._shouldDisable&&this._camera===this.context.mainCameraComponent&&!this.context.isInXR&&!this._activePointerEvents.some(r=>r.used),this._controls.keys=this.enableKeys?$f:ET,this._controls.autoRotate=this.autoRotate,this._controls.autoRotateSpeed=this.autoRotateSpeed,this._controls.enableZoom=this.enableZoom,this._controls.zoomSpeed=this.zoomSpeed,this._controls.zoomToCursor=this.zoomToCursor,this._controls.enableDamping=this.enableDamping,this._controls.dampingFactor=this.dampingFactor,this._controls.enablePan=this.enablePan,this._controls.enableRotate=this.enableRotate,this._controls.minAzimuthAngle=this.minAzimuthAngle,this._controls.maxAzimuthAngle=this.maxAzimuthAngle,this._controls.minPolarAngle=this.minPolarAngle,this._controls.maxPolarAngle=this.maxPolarAngle,Vf||(((s=(t=this._camera)==null?void 0:t.threeCamera)==null?void 0:s.type)==="PerspectiveCamera"?(this._controls.minDistance=this.minZoom,this._controls.maxDistance=this.maxZoom,this._controls.minZoom=0,this._controls.maxZoom=1/0):(this._controls.minDistance=0,this._controls.maxDistance=1/0,this._controls.minZoom=this.minZoom,this._controls.maxZoom=this.maxZoom)),typeof Lu=="number"||Lu===!0){this._controls.enableDamping=!0;const r=typeof Lu=="number"?Lu:.99;this._controls.dampingFactor=Math.max(.001,1-Math.min(1,r))}this.allowInterrupt||(this._lookTargetLerpActive&&(this._controls.enablePan=!1),this._cameraLerpActive&&(this._controls.enableRotate=!1,this._controls.autoRotate=!1),(this._lookTargetLerpActive||this._cameraLerpActive)&&(this._controls.enableZoom=!1)),this.context.isInXR||(!Vf&&(o=this.lookAtConstraint)!=null&&o.locked&&this.setLookTargetFromConstraint(0,this.lookAtConstraint01),this._controls.update(this.context.time.deltaTime),is&&$.DrawWireSphere(this._controls.target,.1,65280))}}}setCameraAndLookTarget(e,t=!1){if(!e)return(F()||is)&&console.warn("[OrbitControls] setCameraAndLookTarget target is null"),!1;if(!(e instanceof E)&&!(e instanceof ci))return(F()||is)&&console.warn("[OrbitControls] setCameraAndLookTarget target is not an Object3D or Camera"),!1;e instanceof ci&&(e=e.gameObject);const s=e.worldPosition,o=e.worldForward;e instanceof QC&&(is&&console.debug("[OrbitControls] setCameraAndLookTarget flip forward direction for camera"),o.multiplyScalar(-1));const r=new po(s,o);return is&&$.DrawRay(r.origin,r.direction,16711680,10),this.setTargetFromRaycast(r,t)||this.setLookTargetPosition(r.at(2,q()),t),this.setCameraTargetPosition(s,t),!0}setCameraTargetPosition(e,t=!1){var s;e&&(e instanceof E&&(e=ee(e)),this._cameraEndPosition||(this._cameraEndPosition=new S),this._cameraEndPosition.copy(e),t===!0?(this._cameraLerpActive=!1,this._cameraObject&&this._cameraObject.position.copy(this._cameraEndPosition)):this._cameraObject&&(this._cameraLerpActive=!0,this._cameraLerp01=0,this._cameraStartPosition.copy((s=this._cameraObject)==null?void 0:s.position),typeof t=="number"?this._cameraLerpDuration=t:this._cameraLerpDuration=this.targetLerpDuration))}get cameraLerpActive(){return this._cameraLerpActive}stopCameraLerp(){this._cameraLerpActive=!1}setFieldOfView(e,t=!1){var s;if(!this._controls||typeof e!="number")return;const o=(s=this._camera)==null?void 0:s.threeCamera;o&&(t===!0?o.fov=e:(this._fovLerpActive=!0,this._fovLerp01=0,this._fovLerpStartValue=o.fov,this._fovLerpEndValue=e,typeof t=="number"?this._fovLerpDuration=t:this._fovLerpDuration=this.targetLerpDuration))}setLookTargetPosition(e=null,t=!1){this._controls&&e&&(e instanceof E&&(e=ee(e)),this._lookTargetEndPosition.copy(e),this._didSetTarget++,is&&(console.warn("OrbitControls: setLookTargetPosition",e,t),$.DrawWireSphere(this._lookTargetEndPosition,.2,16711680,2)),t===!0?this._controls.target.copy(this._lookTargetEndPosition):(this._lookTargetLerpActive=!0,this._lookTargetLerp01=0,this._lookTargetStartPosition.copy(this._controls.target),typeof t=="number"?this._lookTargetLerpDuration=t:this._lookTargetLerpDuration=this.targetLerpDuration))}get lookTargetLerpActive(){return this._lookTargetLerpActive}stopLookTargetLerp(){this._lookTargetLerpActive=!1}setLookTargetFromConstraint(e=0,t=1){var s,o;if(!this._controls||((s=this.lookAtConstraint)==null?void 0:s.enabled)===!1)return!1;const r=(o=this.lookAtConstraint)==null?void 0:o.sources;if(r&&r.length>0){const l=r[e];if(l)return l.getWorldPosition(this._lookTargetEndPosition),this.lerpLookTarget(this._lookTargetEndPosition,t),!0}return!1}lerpTarget(e,t){return this.lerpLookTarget(e,t)}lerpLookTarget(e,t){this._controls&&(t>=1?this._controls.target.copy(e):this._controls.target.lerp(e,t))}setTargetFromRaycast(e,t=!1){if(!this.controls)return!1;const s=e?this.context.physics.raycastFromRay(e):this.context.physics.raycast();for(const o of s)if(o.distance>0&&P.isActiveInHierarchy(o.object)){const r=Nf(o.object);if(r){const l=r.canvas;if(l!=null&&l.screenspace)break}return this.setLookTargetPosition(o.point,t),!0}return!1}fitCamera(e,t){var s,o;if(this.context.isInXR)return;let r;if(Array.isArray(e)?r=e:e&&"type"in e?r=e.children:e&&typeof e=="object"&&!(e instanceof E)&&!Array.isArray(e)&&(t=e,r=t.objects),r&&!Array.isArray(r)&&(r=r.children),(!Array.isArray(r)||r&&r.length<=0)&&(r=this.context.scene.children),!Array.isArray(r)||r.length<=0){console.warn("No objects to fit camera to...");return}const l=this._cameraObject,c=this._controls;if(!l||!c){console.warn("No camera or controls found to fit camera to objects...");return}t||(t={});const{immediate:h=!1,centerCamera:d="y",cameraNearFar:u="auto",fitOffset:p=1.1,fov:g=l?.fov}=t,f=new S,y=new S,v=si(r,void 0,(o=(s=this._camera)==null?void 0:s.threeCamera)==null?void 0:o.layers),b=v.clone();l.updateMatrixWorld(),l.updateProjectionMatrix(),v.getCenter(y);const _=new S;if(v.getSize(_),v.applyMatrix4(l.matrixWorldInverse),v.getSize(f),v.setFromCenterAndSize(y,f),Number.isNaN(f.x)||Number.isNaN(f.y)||Number.isNaN(f.z)){console.warn("Camera fit size resultet in NaN",l,v,[...r]);return}if(f.length()<=1e-10){Bc&&console.warn("Camera fit size is zero",v,[...r]);return}const w=t.fov||l.fov,x=2*Math.atan(Math.tan(w*Math.PI/360/2)*l.aspect)/Math.PI*360,k=f.y/(2*Math.atan(Math.PI*w/360)),M=f.x/(2*Math.atan(Math.PI*x/360)),T=p*Math.max(k,M)+f.z/2;Bc&&console.log("Fit camera to objects",{fitHeightDistance:k,fitWidthDistance:M,distance:T,verticalFov:w,horizontalFov:x}),this.maxZoom=T*10,this.minZoom=T*.01;const L=.05,D=y.clone();if(D.y-=f.y*L,this.setLookTargetPosition(D,h),this.setFieldOfView(t.fov,h),u==null||u=="auto"){const U=P.findObjectOfType(en),B=U?U.radius:0,Q=Math.max(_.x,_.y,_.z,B);l.near=T/100,l.far=Q+T*10,U&&(this.maxZoom=Math.max(Math.min(this.maxZoom,B*.5),T))}const z=c.getDistance();z<this.minZoom&&(this.minZoom=z*.9),z>this.maxZoom&&(this.maxZoom=z*1.1),l.updateMatrixWorld(),l.updateProjectionMatrix();const j=ee(l),H=y.clone();H.sub(j),d==="y"&&(H.y=0),H.normalize(),H.multiplyScalar(T),d==="y"&&(H.y+=-L*4*T);let K=y.clone().sub(H);l.parent&&(K=l.parent.worldToLocal(K)),this.setCameraTargetPosition(K,h),(Bc||t.debug)&&($.DrawWireBox3(v,16777011,10),$.DrawWireBox3(b,65280,10),!this._haveAttachedKeyboardEvents&&Bc&&(this._haveAttachedKeyboardEvents=!0,document.body.addEventListener("keydown",U=>{if(U.code==="KeyF"){let B;this._cameraObject instanceof we&&(B=Math.random()*Math.random()*170+10),this.fitCamera({objects:r,fitOffset:p,immediate:!1,fov:B})}U.code==="KeyV"&&this._cameraObject instanceof we&&(this._cameraObject.fov=60)}))),this.onBeforeRender()}}Ue([m()],_e.prototype,"autoTarget"),Ue([m()],_e.prototype,"autoFit"),Ue([m()],_e.prototype,"enableRotate"),Ue([m()],_e.prototype,"autoRotate"),Ue([m()],_e.prototype,"autoRotateSpeed"),Ue([m()],_e.prototype,"minAzimuthAngle"),Ue([m()],_e.prototype,"maxAzimuthAngle"),Ue([m()],_e.prototype,"minPolarAngle"),Ue([m()],_e.prototype,"maxPolarAngle"),Ue([m()],_e.prototype,"enableKeys"),Ue([m()],_e.prototype,"enableDamping"),Ue([m()],_e.prototype,"dampingFactor"),Ue([m()],_e.prototype,"enableZoom"),Ue([m()],_e.prototype,"minZoom"),Ue([m()],_e.prototype,"maxZoom"),Ue([m()],_e.prototype,"zoomSpeed"),Ue([m()],_e.prototype,"enablePan"),Ue([m(Fr)],_e.prototype,"lookAtConstraint"),Ue([m()],_e.prototype,"lookAtConstraint01"),Ue([m()],_e.prototype,"allowInterrupt"),Ue([m()],_e.prototype,"middleClickToFocus"),Ue([m()],_e.prototype,"doubleClickToFocus"),Ue([m()],_e.prototype,"clickBackgroundToFitScene"),Ue([m()],_e.prototype,"targetLerpDuration");var AT=Object.defineProperty,IT=Object.getOwnPropertyDescriptor,Yt=(n,e,t,s)=>{for(var o=s>1?void 0:s?IT(e,t):e,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=(s?l(e,t,o):l(o))||o);return s&&o&&AT(e,t,o),o},Io=(n=>(n[n.None=0]="None",n[n.Skybox=1]="Skybox",n[n.SolidColor=2]="SolidColor",n[n.Uninitialized=4]="Uninitialized",n))(Io||{});const Lo=C("debugcam"),Mx=C("debugscreenpointtoray");var jo;const Ut=(jo=class extends I{constructor(){super(...arguments),a(this,"_nearClipPlane",.1),a(this,"_farClipPlane",1e3),a(this,"orthographic",!1),a(this,"orthographicSize",5),a(this,"ARBackgroundAlpha",0),a(this,"_cullingMask",4294967295),a(this,"_backgroundBlurriness"),a(this,"_backgroundIntensity"),a(this,"_backgroundRotation"),a(this,"_environmentIntensity"),a(this,"_targetTexture",null),a(this,"_backgroundColor"),a(this,"_fov"),a(this,"_cam",null),a(this,"_clearFlags",2),a(this,"_skybox"),a(this,"_frustum"),a(this,"_projScreenMatrix",new se)}get isCamera(){return!0}get aspect(){return this._cam instanceof we?this._cam.aspect:this.context.domWidth/this.context.domHeight}set aspect(n){this._cam instanceof we&&this._cam.aspect!==n&&(this._cam.aspect=n,this._cam.updateProjectionMatrix())}get fieldOfView(){return this._cam instanceof we?this._cam.fov:this._fov}set fieldOfView(n){const e=this.fieldOfView!=n;if(this._fov=n,e&&this._cam&&this._cam instanceof we){if(this._fov===void 0){console.warn("Can not set undefined fov on PerspectiveCamera");return}this._cam.fov=this._fov,this._cam.updateProjectionMatrix()}}get nearClipPlane(){return this._nearClipPlane}set nearClipPlane(n){const e=this._nearClipPlane!=n;this._nearClipPlane=n,this._cam&&(e||this._cam.near!=n)&&(this._cam.near=n,this._cam.updateProjectionMatrix())}get farClipPlane(){return this._farClipPlane}set farClipPlane(n){const e=this._farClipPlane!=n;this._farClipPlane=n,this._cam&&(e||this._cam.far!=n)&&(this._cam.far=n,this._cam.updateProjectionMatrix())}applyClippingPlane(){this._cam&&(this._cam.near=this._nearClipPlane,this._cam.far=this._farClipPlane,this._cam.updateProjectionMatrix())}get clearFlags(){return this._clearFlags}set clearFlags(n){if(typeof n=="string")switch(n){case"skybox":n=1;break;case"solidcolor":n=2;break;default:n=0;break}n!==this._clearFlags&&(this._clearFlags=n,this.applyClearFlagsIfIsActiveCamera())}set cullingMask(n){this._cullingMask=n,this._cam&&(this._cam.layers.mask=n)}get cullingMask(){return this._cam?this._cam.layers.mask:this._cullingMask}set cullingLayer(n){this.cullingMask=(1<<n|0)>>>0}set backgroundBlurriness(n){n!==this._backgroundBlurriness&&(n===void 0?this._backgroundBlurriness=void 0:this._backgroundBlurriness=Math.min(Math.max(n,0),1),this.applyClearFlagsIfIsActiveCamera())}get backgroundBlurriness(){return this._backgroundBlurriness}set backgroundIntensity(n){n!==this._backgroundIntensity&&(n===void 0?this._backgroundIntensity=void 0:this._backgroundIntensity=Math.min(Math.max(n,0),10),this.applyClearFlagsIfIsActiveCamera())}get backgroundIntensity(){return this._backgroundIntensity}set backgroundRotation(n){n!==this._backgroundRotation&&(n===void 0?this._backgroundRotation=void 0:this._backgroundRotation=n,this.applyClearFlagsIfIsActiveCamera())}get backgroundRotation(){return this._backgroundRotation}set environmentIntensity(n){this._environmentIntensity=n}get environmentIntensity(){return this._environmentIntensity}get backgroundColor(){return this._backgroundColor??null}set backgroundColor(n){n&&(this._backgroundColor||(this._backgroundColor=new he(1,1,1,1)),this._backgroundColor.copy(n),(!("alpha"in n)||n.alpha===void 0)&&(this._backgroundColor.alpha=1),this.applyClearFlagsIfIsActiveCamera())}set targetTexture(n){this._targetTexture=n}get targetTexture(){return this._targetTexture}get cam(){return this.threeCamera}get threeCamera(){return this.activeAndEnabled&&this.buildCamera(),this._cam}screenPointToRay(n,e,t){const s=this.threeCamera,o=jo._origin;o.set(n,e,-1),this.context.input.convertScreenspaceToRaycastSpace(o),Mx&&console.log("screenPointToRay",n.toFixed(2),e.toFixed(2),"now:",o.x.toFixed(2),o.y.toFixed(2),"isInXR:"+this.context.isInXR),o.z=-1,o.unproject(s);const r=jo._direction.set(o.x,o.y,o.z),l=ee(s);return r.sub(l),r.normalize(),t?(t.set(l,r),t):new po(l.clone(),r.clone())}getFrustum(){return this._frustum||(this._frustum=new jv,this.updateFrustum()),this._frustum}updateFrustum(){this._frustum||(this._frustum=new jv),this._frustum.setFromProjectionMatrix(this.getProjectionScreenMatrix(this._projScreenMatrix,!0),this.context.renderer.coordinateSystem)}getProjectionScreenMatrix(n,e){return e&&this._projScreenMatrix.multiplyMatrices(this.threeCamera.projectionMatrix,this.threeCamera.matrixWorldInverse),n===this._projScreenMatrix?n:n.copy(this._projScreenMatrix)}awake(){Mx&&window.addEventListener("pointerdown",n=>{const e=n.clientX,t=n.clientY;console.log("touch",e.toFixed(2),t.toFixed(2));const s=this.screenPointToRay(e,t),o="#"+Math.floor(Math.random()*16777215).toString(16);$.DrawRay(s.origin,s.direction,o,10)})}onEnable(){Lo&&console.log(`Camera enabled: "${this.name}". ClearFlags=${Io[this._clearFlags]}`,this),this.buildCamera(),(this.tag=="MainCamera"||!this.context.mainCameraComponent)&&(this.context.setCurrentCamera(this),jT(this)),this.applyClearFlagsIfIsActiveCamera({applySkybox:!0})}onDisable(){this.context.removeCamera(this)}onBeforeRender(){if(this._cam&&(this._frustum&&this.updateFrustum(),this._clearFlags===2&&this.applyClearFlagsIfIsActiveCamera(),this._targetTexture)){this.context.isManagedExternally&&(this._warnedAboutExternalRenderer||(this._warnedAboutExternalRenderer=!0,console.warn("Rendering with external renderer is not supported yet. This may not work or throw errors. Please remove the the target texture from your camera: "+this.name,this.targetTexture))),this.context.composer;const n=this.context.renderer;if(n){const e=this.context.mainCameraComponent;this.applyClearFlags(),this._targetTexture.render(this.context.scene,this._cam,n),e?.applyClearFlags()}}}buildCamera(){if(this._cam)return;const n=this.gameObject.isCamera;let e=null;if(n?(e=this.gameObject,e?.layers.enableAll(),e instanceof we&&(this._fov=e.fov)):e=this.gameObject.children[0],e&&e.isCamera)e instanceof we&&(this._fov&&(e.fov=this._fov),e.near=this._nearClipPlane,e.far=this._farClipPlane,e.updateProjectionMatrix());else if(!this.orthographic)e=new we(this.fieldOfView,window.innerWidth/window.innerHeight,this._nearClipPlane,this._farClipPlane),this.fieldOfView&&(e.fov=this.fieldOfView),this.gameObject.add(e);else{const t=this.orthographicSize*100;e=new ud(window.innerWidth/-t,window.innerWidth/t,window.innerHeight/t,window.innerHeight/-t,this._nearClipPlane,this._farClipPlane),this.gameObject.add(e)}this._cam=e,this._cam.layers.mask=this._cullingMask,this.tag=="MainCamera"&&this.context.setCurrentCamera(this)}applyClearFlagsIfIsActiveCamera(n){this.context.mainCameraComponent===this&&this.applyClearFlags(n)}applyClearFlags(n){var e;if(!this._cam){Lo&&console.log("Camera does not exist (apply clear flags)");return}if(this.fieldOfView=this._fov,Lo){const s=`[Camera] Apply ClearFlags: ${Io[this._clearFlags]} - "${this.name}"`;console.debug(s)}const t=this.context.domElement.getAttribute("background-image")||this.context.domElement.getAttribute("background-color")||this.context.domElement.getAttribute("skybox-image");switch(this._clearFlags){case 0:return;case 1:if(jo.backgroundShouldBeTransparent(this.context)&&(!this.ARBackgroundAlpha||this.ARBackgroundAlpha<.001)){this.context.scene.background=null,this.context.renderer.setClearColor(0,0);return}(!this.scene.background||!this._skybox||n?.applySkybox===!0)&&this.applySceneSkybox(),this._backgroundBlurriness!==void 0&&!this.context.domElement.getAttribute("background-blurriness")?this.context.scene.backgroundBlurriness=this._backgroundBlurriness:Lo&&console.warn(`Camera "${this.name}" has no background blurriness`),this._backgroundIntensity!==void 0&&!this.context.domElement.getAttribute("background-intensity")&&(this.context.scene.backgroundIntensity=this._backgroundIntensity),this._backgroundRotation!==void 0&&!this.context.domElement.getAttribute("background-rotation")?this.context.scene.backgroundRotation=this._backgroundRotation:Lo&&console.warn(`Camera "${this.name}" has no background intensity`);break;case 2:if(this._backgroundColor&&!t){let s=this._backgroundColor.alpha;jo.backgroundShouldBeTransparent(this.context)&&(s=this.ARBackgroundAlpha??0),this.context.scene.background=null,(e=this.context.xr)!=null&&e.isVR?this.context.renderer.setClearColor(kb(this._backgroundColor).convertLinearToSRGB()):this.context.renderer.setClearColor(this._backgroundColor,s)}else this._backgroundColor||Lo&&console.warn(`[Camera] has no background color "${this.name}" `);break;case 4:t||(this.context.scene.background=null,this.context.renderer.setClearColor(0,0));break}}applySceneSkybox(){this._skybox||(this._skybox=new LT(this)),this._skybox.apply()}static backgroundShouldBeTransparent(n){var e,t,s,o;const r=(e=n.renderer.xr)==null?void 0:e.getSession();if(!r)return!1;if(typeof r._transparent=="boolean")return r._transparent;const l=r.environmentBlendMode;Lo&&De("Environment blend mode: "+l+" on "+navigator.userAgent);let c=l==="additive"||l==="alpha-blend";return n.isInAR&&l==="opaque"&&((t=navigator.userAgent)!=null&&t.includes("OculusBrowser")||(s=navigator.userAgent)!=null&&s.includes("Mozilla")&&(o=navigator.userAgent)!=null&&o.includes("Mobile WebXRViewer/v2"))&&(c=!0),r._transparent=c,c}},a(jo,"_origin",new S),a(jo,"_direction",new S),jo);Yt([m()],Ut.prototype,"aspect",1),Yt([m()],Ut.prototype,"fieldOfView",1),Yt([m()],Ut.prototype,"nearClipPlane",1),Yt([m()],Ut.prototype,"farClipPlane",1),Yt([m()],Ut.prototype,"clearFlags",1),Yt([m()],Ut.prototype,"orthographic",2),Yt([m()],Ut.prototype,"orthographicSize",2),Yt([m()],Ut.prototype,"ARBackgroundAlpha",2),Yt([m()],Ut.prototype,"cullingMask",1),Yt([m()],Ut.prototype,"backgroundBlurriness",1),Yt([m()],Ut.prototype,"backgroundIntensity",1),Yt([m(Dt)],Ut.prototype,"backgroundRotation",1),Yt([m()],Ut.prototype,"environmentIntensity",1),Yt([m(he)],Ut.prototype,"backgroundColor",1),Yt([m(Ac)],Ut.prototype,"targetTexture",1);let ci=Ut;class LT{constructor(e){a(this,"_camera"),a(this,"_skybox"),this._camera=e}get context(){var e;return(e=this._camera)==null?void 0:e.context}apply(){var e;if(this._skybox=this.context.lightmaps.tryGetSkybox(this._camera.sourceId),!this._skybox)this._did_log_failed_to_find_skybox||(this._did_log_failed_to_find_skybox=!0,console.warn(`Camera "${this._camera.name}" has no skybox texture. ${this._camera.sourceId}`));else if(this.context.scene.background!==this._skybox){const t=this.context.domElement.getAttribute("background-image")||this.context.domElement.getAttribute("background-color")||this.context.domElement.getAttribute("skybox-image");Lo&&console.debug(`[Camera] Apply Skybox ${(e=this._skybox)==null?void 0:e.name} ${t} - "${this._camera.name}"`),t!=null&&t.length||(this._skybox.mapping=kn,this.context.scene.background=this._skybox)}}}function jT(n){C("freecam")&&n.context.mainCameraComponent===n&&P.getOrAddComponent(n.gameObject,_e)}class zn extends I{constructor(){super(...arguments),a(this,"_listener",null),a(this,"onInteraction",()=>{this.destroyed||this.listener==null||this.addListenerIfItExists()})}get listener(){return this._listener==null&&(this._listener=new YC),this._listener}onEnable(){Ln.registerWaitForInteraction(this.onInteraction),this.addListenerIfItExists()}onDisable(){Ln.unregisterWaitForInteraction(this.onInteraction),this.removeListenerIfItExists()}addListenerIfItExists(){const e=this._listener;if(!e||e!=null&&e.parent)return;const t=this.context.mainCameraComponent||P.getComponentInParent(this.gameObject,ci);t!=null&&t.threeCamera?t.threeCamera.add(e):this.gameObject.add(e),e.filter?(e.gain.connect(e.filter),e.filter.connect(e.context.destination)):e.gain.connect(e.context.destination)}removeListenerIfItExists(){const e=this._listener;e&&(e.removeFromParent(),e.filter&&e.filter.disconnect(),e.gain&&e.gain.disconnect())}}var DT=Object.defineProperty,BT=Object.getOwnPropertyDescriptor,Os=(n,e,t,s)=>{for(var o=s>1?void 0:s?BT(e,t):e,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=(s?l(e,t,o):l(o))||o);return s&&o&&DT(e,t,o),o};const Et=C("debugaudio"),ss=class ur extends I{constructor(){super(...arguments),a(this,"clip",""),a(this,"playOnAwake",!1),a(this,"preload",!0),a(this,"playInBackground",!0),a(this,"_spatialBlend",0),a(this,"_minDistance",1),a(this,"_maxDistance",100),a(this,"_volume",1),a(this,"rollOffMode",0),a(this,"_loop",!1),a(this,"sound",null),a(this,"helper",null),a(this,"wasPlaying",!1),a(this,"audioLoader",null),a(this,"shouldPlay",!1),a(this,"_lastClipStartedLoading",null),a(this,"_audioElement",null),a(this,"onVisibilityChanged",()=>{switch(document.visibilityState){case"hidden":(this.playInBackground===!1||X.isMobileDevice())&&(this.wasPlaying=this.isPlaying,this.isPlaying&&this.pause());break;case"visible":Et&&console.log("visible",this.enabled,this.playOnAwake,!this.isPlaying,ur.userInteractionRegistered,this.wasPlaying),this.enabled&&this.playOnAwake&&!this.isPlaying&&ur.userInteractionRegistered&&this.wasPlaying&&this.play();break}}),a(this,"onApplicationMuteChanged",()=>{var e,t;this.context.application.muted?(e=this.sound)==null||e.setVolume(0):(t=this.sound)==null||t.setVolume(this.volume)}),a(this,"createAudio",e=>{if(this.destroyed){Et&&console.warn("AudioSource destroyed, not creating audio",this.name);return}Et&&console.log("AudioBuffer finished loading",e);const t=this.Sound;if(!t){Et&&console.warn("Failed getting sound?",this.name);return}t.isPlaying&&t.stop(),e&&t.setBuffer(e),t.loop=this._loop,this.context.application.muted?t.setVolume(0):t.setVolume(this.volume),t.autoplay=this.shouldPlay&&ur.userInteractionRegistered,this.applySpatialDistanceSettings(),t.isPlaying&&t.stop(),ur.registerWaitForAllowAudio(this.__onAllowAudioCallback)}),a(this,"__onAllowAudioCallback",()=>{this.shouldPlay&&this.play()}),a(this,"_lastContextTime",0),a(this,"_hasEnded",!0),a(this,"_needUpdateSpatialDistanceSettings",!1)}static get userInteractionRegistered(){return Ln.userInteractionRegistered}static registerWaitForAllowAudio(e){Ln.registerWaitForInteraction(e)}get isPlaying(){var e;return((e=this.sound)==null?void 0:e.isPlaying)??!1}get duration(){var e,t;return(t=(e=this.sound)==null?void 0:e.buffer)==null?void 0:t.duration}get time01(){var e;const t=this.duration;return t&&this.sound?((e=this.sound)==null?void 0:e.context.currentTime)/t:0}set time01(e){const t=this.duration;t&&this.sound&&(this.time=e*t)}get time(){var e,t;return(e=this.sound)!=null&&e.source?((t=this.sound.source)==null?void 0:t.context.currentTime)-this._lastContextTime+this.sound.offset:0}set time(e){if(this.sound){if(e===this.sound.offset)return;const t=this.isPlaying;this.stop(),this.sound.offset=e,t&&this.play()}}get loop(){return this.sound&&(this._loop=this.sound.getLoop()),this._loop}set loop(e){this._loop=e,this.sound&&this.sound.setLoop(e)}get spatialBlend(){return this._spatialBlend}set spatialBlend(e){e!==this._spatialBlend&&(this._spatialBlend=e,this._needUpdateSpatialDistanceSettings=!0)}get minDistance(){return this._minDistance}set minDistance(e){this._minDistance!==e&&(this._minDistance=e,this._needUpdateSpatialDistanceSettings=!0)}get maxDistance(){return this._maxDistance}set maxDistance(e){this._maxDistance!==e&&(this._maxDistance=e,this._needUpdateSpatialDistanceSettings=!0)}get volume(){return this._volume}set volume(e){this._volume=e,this.sound&&!this.context.application.muted&&(Et&&console.log(this.name,"audio set volume",e),this.sound.setVolume(e))}set pitch(e){this.sound&&this.sound.setPlaybackRate(e)}get pitch(){return this.sound?this.sound.getPlaybackRate():1}get Sound(){var e;if(!this.sound&&ur.userInteractionRegistered){let t=this.gameObject.getComponent(zn)??this.context.mainCamera.getComponent(zn)??xc(zn,this.context,!1);!t&&this.context.mainCamera&&(t=this.context.mainCamera.addComponent(zn)),t!=null&&t.listener?(this.sound=new KC(t.listener),(e=this.gameObject)==null||e.add(this.sound)):Et&&console.warn("No audio listener found in scene - can not play audio")}return this.sound}get ShouldPlay(){return this.shouldPlay}get audioContext(){var e;return(e=this.sound)==null?void 0:e.context}awake(){Et&&console.log("[AudioSource]",this),this.audioLoader=new jm,this.playOnAwake&&(this.shouldPlay=!0),this.preload&&typeof this.clip=="string"&&this.audioLoader.load(this.clip,this.createAudio,()=>{},console.error)}onEnable(){this.sound&&this.gameObject.add(this.sound),ur.userInteractionRegistered?this.playOnAwake&&this.context.application.isVisible&&this.play():ur.registerWaitForAllowAudio(()=>{this.enabled&&!this.destroyed&&this.shouldPlay&&this.onNewClip(this.clip)}),globalThis.addEventListener("visibilitychange",this.onVisibilityChanged),this.context.application.addEventListener(Og.MuteChanged,this.onApplicationMuteChanged)}onDisable(){globalThis.removeEventListener("visibilitychange",this.onVisibilityChanged),this.context.application.removeEventListener(Og.MuteChanged,this.onApplicationMuteChanged),this.pause()}applySpatialDistanceSettings(){const e=this.sound;if(!e)return;this._needUpdateSpatialDistanceSettings=!1;const t=W.lerp(10*this._maxDistance/Math.max(1e-4,this.spatialBlend),this._minDistance,this.spatialBlend);switch(Et&&console.log(this.name,this._minDistance,this._maxDistance,this.spatialBlend,"Ref distance="+t),e.setRefDistance(t),e.setMaxDistance(Math.max(.01,this._maxDistance)),this.rollOffMode){case 0:e.setDistanceModel("exponential");break;case 1:e.setDistanceModel("linear");break;case 2:console.warn("Custom rolloff for AudioSource is not supported: "+this.name);break}this.spatialBlend>0?Et&&!this.helper&&(this.helper=new tO(e,e.getRefDistance()),e.add(this.helper)):this.helper&&this.helper.parent&&this.helper.removeFromParent()}async onNewClip(e){if(e&&(this.clip=e),typeof e=="string")if(Et&&console.log(e),e.endsWith(".mp3")||e.endsWith(".wav")){if(this.audioLoader||(this.audioLoader=new jm),this.shouldPlay=!0,this._lastClipStartedLoading===e){Et&&console.log("Is currently loading:",this._lastClipStartedLoading,this);return}this._lastClipStartedLoading=e,Et&&console.log("load audio",e);const t=await this.audioLoader.loadAsync(e).catch(console.error);if(this.destroyed)return;this._lastClipStartedLoading===e&&(this._lastClipStartedLoading=null),t&&this.createAudio(t)}else console.warn("Unsupported audio clip type",e);else this.shouldPlay=!0,this.createAudio()}play(e=void 0){var t,s,o;!e&&this.clip&&(e=this.clip),e!==void 0&&typeof e!="string"&&!(e instanceof MediaStream)&&(F()&&console.warn("Called play on AudioSource with unknown argument type:",e+`
|
|
940
|
+
Using the assigned clip instead:`,this.clip),e=this.clip);let r=!this.sound||e&&e!==this.clip;if(typeof e=="string"&&!this.audioLoader&&(r=!0),(e instanceof MediaStream||typeof e=="string")&&(this.clip=e),r){this.shouldPlay=!0,this.onNewClip(e);return}if(this.shouldPlay=!0,this._hasEnded=!1,Et&&console.log("play",(t=this.sound)==null?void 0:t.getVolume(),this.sound),this.sound&&!this.sound.isPlaying){const l=this.context.application.muted;l&&this.sound.setVolume(0),(s=this.gameObject)==null||s.add(this.sound),this.clip instanceof MediaStream?(this.sound.setMediaStreamSource(this.clip),this._audioElement||(this._audioElement=document.createElement("audio"),this._audioElement.style.display="none"),this._audioElement.parentNode||(o=this.context.domElement.shadowRoot)==null||o.append(this._audioElement),this._audioElement.srcObject=this.clip,this._audioElement.autoplay=!1):(this._audioElement&&this._audioElement.remove(),this.sound.play(l?.1:0))}}pause(){var e,t;Et&&console.log("Pause",this),this._hasEnded=!0,this.shouldPlay=!1,this.sound&&this.sound.isPlaying&&this.sound.source&&(this._lastContextTime=(e=this.sound)==null?void 0:e.context.currentTime,this.sound.pause()),(t=this._audioElement)==null||t.remove()}stop(){var e,t;Et&&console.log("Pause",this),this._hasEnded=!0,this.shouldPlay=!1,this.sound&&this.sound.source&&(this._lastContextTime=(e=this.sound)==null?void 0:e.context.currentTime,Et&&console.log(this._lastContextTime),this.sound.stop()),(t=this._audioElement)==null||t.remove()}update(){this.helper&&(this.isPlaying&&this.helper.update(),this.helper.visible=this.isPlaying),this._needUpdateSpatialDistanceSettings&&this.applySpatialDistanceSettings(),this.sound&&!this.sound.isPlaying&&this.shouldPlay&&!this._hasEnded&&(this._hasEnded=!0,Et&&console.log("Audio clip ended",this.clip),this.dispatchEvent(new CustomEvent("ended",{detail:this})))}};Os([m(URL)],ss.prototype,"clip",2),Os([m()],ss.prototype,"playOnAwake",2),Os([m()],ss.prototype,"preload",2),Os([m()],ss.prototype,"playInBackground",2),Os([m()],ss.prototype,"loop",1),Os([m()],ss.prototype,"spatialBlend",1),Os([m()],ss.prototype,"minDistance",1),Os([m()],ss.prototype,"maxDistance",1),Os([m()],ss.prototype,"volume",1),Os([m()],ss.prototype,"pitch",1),Os([m()],ss.prototype,"rollOffMode",2);let ns=ss;const FT=C("debugavatar"),ju=class wn extends I{constructor(){super(...arguments),a(this,"connectionId"),a(this,"avatar")}static getAvatar(e){return e>=0&&e<wn.instances.length?wn.instances[e]:null}static onAvatarMarkerCreated(e){return wn._onNewAvatarMarkerAdded.push(e),e}static onAvatarMarkerDestroyed(e){return wn._onAvatarMarkerDestroyed.push(e),e}awake(){wn.instances.push(this),FT&&console.log(this);for(const e of wn._onNewAvatarMarkerAdded)e({avatarMarker:this,gameObject:this.gameObject})}onDestroy(){wn.instances.splice(wn.instances.indexOf(this),1);for(const e of wn._onAvatarMarkerDestroyed)e({avatarMarker:this,gameObject:this.gameObject})}isLocalAvatar(){return this.connectionId===this.context.connection.connectionId}};a(ju,"instances",[]),a(ju,"_onNewAvatarMarkerAdded",[]),a(ju,"_onAvatarMarkerDestroyed",[]);let hi=ju;class Nn{static Add(e,t,s=null){if(t){for(const o of this.Pois)if(o.obj===t)return;this.Pois.push({obj:t,avatar:s}),this.LastChangeTime=e.time.time}}static Remove(e,t){var s;if(t){for(const o of this.Pois)if(o.obj===t){this.Pois.splice(this.Pois.indexOf(o),1),this.LastChangeTime=e?.time.time??((s=J.Current)==null?void 0:s.time.time);return}}}}a(Nn,"Pois",[]),a(Nn,"LastChangeTime",0);class UT{constructor(){a(this,"guid"),a(this,"position",new S)}}class Uc extends I{constructor(){super(...arguments),a(this,"target",null),a(this,"avatar",null),a(this,"_model",null),a(this,"_targetModel",new UT),a(this,"_currentTargetObject",null),a(this,"_lastUpdateTime",0),a(this,"_lookDuration",0),a(this,"_lastPoiChangedTime",0)}set controlledTarget(e){this.target=e;const t=R.get("MoveRandom");if(t&&this.target){const s=P.getComponent(this.target,t);s&&s.destroy()}}awake(){if(this.avatar=P.getComponentInParent(this.gameObject,hi),this.avatar){const e=P.getComponentInParent(this.gameObject,hi);this._model=new Ag(this.context.connection,this.guid),e!=null&&e.isLocalAvatar&&this._model.requestOwnership()}this.context.connection.beginListen("avatar-look-target-changed",e=>{var t;this.target&&e&&e.guid===((t=this.avatar)==null?void 0:t.guid)&<(this.target,e.position)})}update(){var e;if((!this.context.connection.isConnected||(e=this._model)!=null&&e.hasOwnership)&&(Nn.LastChangeTime!==this._lastPoiChangedTime&&(this._lastPoiChangedTime=Nn.LastChangeTime,this._lookDuration=0),this.selectTarget(),this._currentTargetObject&&this.context.time.frameCount%10===0&&this.target)){const t=ee(this._currentTargetObject);lt(this.target,t),this.context.connection.isConnected&&this.avatar&&(this.context.connection.send("avatar-look-target-changed",this._targetModel),this._targetModel.guid=this.avatar.guid,this._targetModel.position.copy(t))}}selectTarget(){if(this.context.time.time-this._lastUpdateTime>this._lookDuration){this._lastUpdateTime=this.context.time.time,this._lookDuration=Math.random()*.5+.2;const e=Nn.Pois;if(e.length>0){const t=e[Math.floor(Math.random()*e.length)];if(t&&t.obj){if(t.avatar&&t.avatar===this.avatar)return;this._currentTargetObject=t.obj}}}}}function Rx(n){const e=n;return!!(e.parser&&e.parser.json)}var Du=(n=>(n[n.None=0]="None",n[n.DontExport=1]="DontExport",n))(Du||{});function Tx(n){return n&&n.isComponent}const zT=Symbol("object"),Hf=new Oi(()=>new S,20);class Ex{constructor(e,t,s,o,r,l){a(this,"_point"),a(this,"_normal"),a(this,"_tangentVelocity"),a(this,"distance"),a(this,"impulse"),a(this,"friction"),this._point=e,this.distance=t,this._normal=s,this.impulse=o,this.friction=r,this._tangentVelocity=l}get point(){return Hf.get().set(this._point.x,this._point.y,this._point.z)}get normal(){return Hf.get().set(this._normal.x,this._normal.y,this._normal.z)}get tangentVelocity(){return Hf.get().set(this._tangentVelocity.x,this._tangentVelocity.y,this._tangentVelocity.z)}}class Ax{constructor(e,t,s){a(this,"contacts"),a(this,"me"),a(this,"_collider"),a(this,"_gameObject"),this.me=e,this._collider=t,this._gameObject=t.gameObject,this.contacts=s}get collider(){return this._collider}get gameObject(){return this._gameObject}get rigidBody(){var e;return(e=this.collider)==null?void 0:e.attachedRigidbody}}class Ix{constructor(e,t){a(this,"object"),a(this,"collider"),this.object=e,this.collider=t}}const Ye=C("debugnetworkingstreams");var nn=(n=>(n.Connected="peer-user-connected",n.StreamReceived="receive-stream",n.StreamEnded="call-ended",n.Disconnected="peer-user-disconnected",n.UserJoined="user-joined",n))(nn||{});class Gf{constructor(e,t){a(this,"type","call-ended"),a(this,"userId"),a(this,"direction"),this.userId=e,this.direction=t}}class Lx{constructor(e,t,s){a(this,"type","receive-stream"),a(this,"userId"),a(this,"stream"),a(this,"target"),this.userId=e,this.stream=t,this.target=s}}class NT{constructor(e,t){a(this,"guid"),a(this,"peerId"),a(this,"dontSave",!0),this.guid=e.id,this.peerId=t}}var jx=(n=>(n.Incoming="incoming",n.Outgoing="outgoing",n))(jx||{});class WT extends Dm{constructor(e,t,s,o=null){super(),a(this,"peerId"),a(this,"userId"),a(this,"direction"),a(this,"call"),a(this,"_stream",null),a(this,"_isDisposed",!1),this.peerId=t.peer,this.userId=e,this.call=t,this.direction=s,this._stream=o,t.on("stream",r=>{if(Ye&&console.log("Receive stream",`
|
|
941
|
+
Audio:`,r.getAudioTracks(),`
|
|
942
|
+
Video:`,r.getVideoTracks()),this._stream=r,s==="incoming"){const l=new Lx(e,r,this);this.dispatchEvent(l)}}),t.on("close",()=>{this.dispatchEvent(new Gf(e,s))})}get stream(){return this._stream}close(){this._isDisposed||(this._isDisposed=!0,this.call.close(),on(this._stream))}get isOpen(){var e;return((e=this.call.peerConnection)==null?void 0:e.connectionState)==="connected"}get isOpening(){var e;return((e=this.call.peerConnection)==null?void 0:e.connectionState)==="connecting"}get isClosed(){return!this.isOpen||this._isDisposed}}function Dx(n){return n=n.replace("a=fmtp:111 minptime=10;useinbandfec=1","a=fmtp:111 ptime=5;useinbandfec=1;stereo=1;maxplaybackrate=48000;maxaveragebitrat=128000;sprop-stereo=1"),n}const Bx=class nd extends Dm{constructor(e,t){super(),a(this,"updateCalls",()=>{var s;for(let o=this._incomingCalls.length-1;o>=0;o--){const r=this._incomingCalls[o];r.isClosed&&!r.isOpening&&this._incomingCalls.splice(o,1)}for(let o=this._outgoingCalls.length-1;o>=0;o--){const r=this._outgoingCalls[o];let l=!1;r.isClosed&&!r.isOpening&&((s=r.stream)!=null&&s.active?Ye&&console.warn("!!! Stream is still active, don't remove call",r.userId,"Your id: "+this.context.connection.connectionId):(Ye&&console.warn("!!! Remove closed call",r.userId),l=!0)),this.context.connection.userIsInRoom(r.userId)===!1&&(Ye&&console.warn("!!! User is not in room anymore, remove call",r.userId),l=!0),l&&(r.close(),this._outgoingCalls.splice(o,1))}}),a(this,"id"),a(this,"context"),a(this,"_incomingCalls",[]),a(this,"_outgoingCalls",[]),a(this,"_peer"),a(this,"_enabled",!1),a(this,"_enabledPeer",!1),a(this,"onConnectRoomFn",this.onConnectRoom.bind(this)),a(this,"onPeerConnect",s=>{if(Ye&&console.log("PEER opened as",s),s===null){console.error("Peer connection failed",s);return}this.context.connection.send("peer-user-connected",new NT(this,s))}),a(this,"onPeerClose",()=>{Ye&&console.log("PEER closed"),this.updateCalls()}),a(this,"onPeerDisconnected",()=>{Ye&&console.log("PEER disconnected"),this.updateCalls()}),a(this,"onPeerError",s=>{Ye&&console.error("PEER error",s)}),a(this,"onPeerReceivingCall",s=>{s.answer(void 0,{sdpTransform:o=>Dx(o)}),this.registerCall(s,"incoming",null)}),this.context=e,this.id=t,this.setupPeer(),navigator.getUserMedia=navigator.getUserMedia||navigator.webkitGetUserMedia||navigator.mozGetUserMedia||navigator.msGetUserMedia}static getOrCreate(e,t){if(nd.instances.has(t))return nd.instances.get(t);const s=new nd(e,t);return nd.instances.set(t,s),s}getMyPeerId(){if(this.context.connection.connectionId)return this.getPeerIdFromUserId(this.context.connection.connectionId)}getPeerIdFromUserId(e){return this.id+"-"+e}getUserIdFromPeerId(e){return e.substring(this.id.length+1)}makeCall(e,t){var s;if(!(t!=null&&t.id)){Ye?console.warn("Can not make a call: mediastream has no id or is undefined"):console.debug("Can not make a call: mediastream has no id or is undefined");return}const o={metadata:{userId:this.context.connection.connectionId,streamId:t.id},sdpTransform:l=>Dx(l)},r=(s=this._peer)==null?void 0:s.call(e,t,o);if(r){const l=this.registerCall(r,"outgoing",t);return Ye&&console.warn(`\u{1F4DE} CALL ${e}`,`
|
|
943
|
+
Outgoing:`,this._outgoingCalls,`
|
|
944
|
+
Incoming:`,this._incomingCalls),l}else Ye&&console.error("Failed to make call",e,t,this._peer)}closeAll(){for(const e of this._incomingCalls)e.close();for(const e of this._outgoingCalls)e.close();this.updateCalls()}get peer(){return this._peer}get incomingCalls(){return this._incomingCalls}enable(){this._enabled||(this._enabled=!0,this.context.connection.beginListen(ie.JoinedRoom,this.onConnectRoomFn),this.subscribePeerEvents())}disable(){this._enabled&&(this._enabled=!1,this.context.connection.stopListen(ie.JoinedRoom,this.onConnectRoomFn),this.unsubscribePeerEvents())}onConnectRoom(){this.setupPeer()}setupPeer(){if(this.context.connection.connectionId&&!this._enabledPeer){if(this._enabledPeer=!0,!this._peer){const e=this.getMyPeerId();e?this._peer=p_(e):console.error("Failed to setup peerjs because we dont have a connection id",this.context.connection.connectionId)}this._enabled&&this.subscribePeerEvents()}}subscribePeerEvents(){this._peer&&(this._peer.on("open",this.onPeerConnect),this._peer.on("close",this.onPeerClose),this._peer.on("call",this.onPeerReceivingCall),this._peer.on("disconnected",this.onPeerDisconnected),this._peer.on("error",this.onPeerError))}unsubscribePeerEvents(){this._peer&&(this._peer.off("open",this.onPeerConnect),this._peer.off("close",this.onPeerClose),this._peer.off("call",this.onPeerReceivingCall),this._peer.off("disconnected",this.onPeerDisconnected),this._peer.off("error",this.onPeerError))}registerCall(e,t,s){const o=e.metadata;(!o||!o.userId)&&console.error("Missing call metadata",e);const r=o.userId;t==="incoming"&&Ye?console.warn("\u2190 Receive call from",e.metadata,e.connectionId):Ye&&console.warn("\u2192 Make call to",e.metadata);const l=t==="incoming"?this._incomingCalls:this._outgoingCalls,c=new WT(r,e,t,s);return l.push(c),e.on("error",h=>{console.error("Call error",h)}),e.on("close",()=>{Ye&&console.log("Call ended",e.metadata);const h=l.indexOf(c);h!==-1&&l.splice(h,1),c.close(),this.dispatchEvent(new Gf(r,t))}),c.addEventListener("call-ended",h=>{this.dispatchEvent(h)}),t==="incoming"&&(c.addEventListener("receive-stream",h=>{this.dispatchEvent(h)}),e.on("stream",()=>{Ye&&console.log("Received stream for call",e.metadata);let h=0;const d=setInterval(()=>{const u=h===0;!c.isOpen&&u&&(Ye&&console.warn("Close call because stream is not active",e.metadata),h+=1,clearInterval(d),c.close())},2e3)})),c}};a(Bx,"instances",new Map);let Bu=Bx;class hd extends Dm{constructor(e,t){if(super(),a(this,"context"),a(this,"peer"),a(this,"_sendingStreams",new Map),a(this,"debug",!1),a(this,"_enabled",!1),a(this,"_tickIntervalId"),a(this,"tick",()=>{this.updateSendingCalls()}),a(this,"onJoinedRoom",s=>{this._sendingStreams.size>0&&(this.debug&&console.warn(`${s!=null&&s.userId?`User ${s.userId}`:"You"} joined room`,s,this._sendingStreams.size),this.updateSendingCalls())}),a(this,"onLeftRoom",s=>{this.debug&&console.warn(`${s?.userId||"You"} left room`,s),this.stopCallsToUsersThatAreNotInTheRoomAnymore(),this.peer.closeAll()}),a(this,"onCallStreamReceived",s=>{this.debug&&console.log("Call with "+s.userId+" started"),this.dispatchEvent({type:"receive-stream",target:this,stream:s.stream,userId:s.userId}),this.debug&&this.debugLogCurrentState()}),a(this,"onCallEnded",s=>{this.debug&&console.log("Call with "+s.userId+" ended"),this.dispatchEvent(s),this.debug&&this.debugLogCurrentState()}),a(this,"onUserConnected",s=>{if(this.peer.id===s.guid){this.debug&&console.log("PEER USER CONNECTED",s.guid,s,this._sendingStreams.size);const o=this._sendingStreams.keys().next().value;this.peer.makeCall(s.peerId,o)}else Ye&&console.log("Unknown user connected",s.guid,s.peerId)}),a(this,"onUserLeft",s=>{this.debug&&console.log("User left room: "+s.userId),this.stopCallsToUsersThatAreNotInTheRoomAnymore()}),Tx(e)){const s=e;e=s.context,t=Bu.getOrCreate(s.context,s.guid)}else typeof t=="string"&&(t=Bu.getOrCreate(e,t));if(e){if(!(e instanceof J))throw new Error("Failed to create NetworkedStreams because context is not an instance of Context")}else throw new Error("Failed to create NetworkedStreams because context is undefined");if(!t)throw new Error("Failed to create NetworkedStreams because peer is undefined");this.context=e,this.peer=t,Ye&&(this.debug=!0)}static create(e,t){const s=Bu.getOrCreate(e.context,t||e.context.connection.connectionId||e.guid);return new hd(e.context,s)}startSendingStream(e){this._sendingStreams.has(e)?console.warn("Received start sending stream with stream that is already being sent"):(this._sendingStreams.set(e,[]),this.updateSendingCalls())}stopSendingStream(e){if(e){const t=this._sendingStreams.get(e);if(t){for(const s of t)s.close();t.length=0}this._sendingStreams.delete(e),t&&this.debug&&this.debugLogCurrentState()}this.updateSendingCalls()}get enabled(){return this._enabled}enable(){this._enabled||(this._enabled=!0,this.peer.enable(),this.peer.addEventListener("receive-stream",this.onCallStreamReceived),this.peer.addEventListener("call-ended",this.onCallEnded),this.context.connection.beginListen("peer-user-connected",this.onUserConnected),this.context.connection.beginListen(ie.JoinedRoom,this.onJoinedRoom),this.context.connection.beginListen(ie.UserJoinedRoom,this.onJoinedRoom),this.context.connection.beginListen(ie.UserLeftRoom,this.onUserLeft),this.context.connection.beginListen(ie.LeftRoom,this.onLeftRoom),this._tickIntervalId=setInterval(this.tick,5e3))}disable(){this._enabled&&(this._enabled=!1,this.peer.disable(),this.peer.removeEventListener("receive-stream",this.onCallStreamReceived),this.peer.removeEventListener("call-ended",this.onCallEnded),this.context.connection.stopListen("peer-user-connected",this.onUserConnected),this.context.connection.stopListen(ie.JoinedRoom,this.onJoinedRoom),this.context.connection.stopListen(ie.UserJoinedRoom,this.onJoinedRoom),this.context.connection.stopListen(ie.UserLeftRoom,this.onUserLeft),this.context.connection.stopListen(ie.LeftRoom,this.onLeftRoom),this._tickIntervalId!=null&&(clearInterval(this._tickIntervalId),this._tickIntervalId=void 0))}updateSendingCalls(){const e=this.context.connection.connectionId;for(const t of this._sendingStreams.keys()){const s=this._sendingStreams.get(t)||[];for(const o of this.context.connection.usersInRoom()){if(o===e)continue;const r=this.peer.getPeerIdFromUserId(o);if(s.find(l=>{var c;return l.peerId===r&&l.direction==="outgoing"&&!l.isClosed&&((c=l.stream)==null?void 0:c.active)}))Ye&&console.debug("Already have a call with user "+o+" / peer "+r);else{const l=this.peer.makeCall(r,t);l&&s.push(l)}}this._sendingStreams.set(t,s)}this.stopCallsToUsersThatAreNotInTheRoomAnymore()}stopCallsToUsersThatAreNotInTheRoomAnymore(){for(const e of this._sendingStreams.keys()){const t=this._sendingStreams.get(e);if(t)for(let s=t.length-1;s>=0;s--){const o=t[s];this.context.connection.userIsInRoom(o.userId)?Ye&&(this.context.connection.connectionId===o.userId?console.warn(`You are still in the room [${s}] ${o.userId}`):console.log(`User is still in room [${s}] ${o.userId}`)):(Ye&&console.log(`Remove call ${[s]} to user that is not in room anymore ${o.userId}`),o.close(),t.splice(s,1))}}this.peer.updateCalls(),this.debug&&this.debugLogCurrentState()}debugLogCurrentState(){console.warn(`You (${this.context.connection.connectionId}) are currently sending ${this._sendingStreams.size} and receiving ${this.peer.incomingCalls.length} calls (${this.peer.incomingCalls.map(e=>e.userId).join(", ")})`,this.peer.incomingCalls)}}function on(n){if(n&&n instanceof MediaStream)for(const e of n.getTracks())e.stop()}var VT=Object.defineProperty,qf=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&VT(e,t,o),o};const $T="noVoip",HT=C("debugvoip");class Do extends I{constructor(){super(...arguments),a(this,"autoConnect",!0),a(this,"runInBackground",!0),a(this,"createMenuButton",!0),a(this,"debug",!1),a(this,"_net"),a(this,"_menubutton"),a(this,"_allowSending",!0),a(this,"_outputStream",null),a(this,"onJoinedRoom",async()=>{this.debug&&console.log("VOIP: Joined room"),await vs(300),this.autoConnect&&!this.isSending&&this._allowSending&&this.connect()}),a(this,"onLeftRoom",()=>{this.debug&&console.log("VOIP: Left room"),this.disconnect();for(const e of this._incomingStreams.values())on(e.srcObject);this._incomingStreams.clear()}),a(this,"_incomingStreams",new Map),a(this,"onReceiveStream",e=>{const t=e.target.userId,s=e.stream;let o=this._incomingStreams.get(t);o||(o=new Audio,this._incomingStreams.set(t,o)),o.srcObject=s,o.setAttribute("autoplay","true"),Ln.registerWaitForInteraction(()=>{o?.play().catch(r=>{console.error("VOIP: Failed to play audio",r)})})}),a(this,"onStreamEnded",e=>{const t=this._incomingStreams.get(e.userId);on(t?.srcObject),this._incomingStreams.delete(e.userId)}),a(this,"onEnabledChanged",()=>{for(const e of this._incomingStreams){const t=e[1];t.muted=!this.enabled}}),a(this,"onVisibilityChanged",()=>{if(this.runInBackground)return;const e=document.visibilityState!=="visible";this.setMuted(e);for(const t of this._incomingStreams){const s=t[1];s.muted=e}})}awake(){HT&&(this.debug=!0),this.debug&&(console.log("VOIP debugging: press 'v' to toggle mute or 'c' to toggle connect/disconnect"),window.addEventListener("keydown",async e=>{switch(e.key.toLowerCase()){case"v":console.log("MUTE?",!this.isMuted),this.setMuted(!this.isMuted);break;case"c":this.isSending?this.disconnect():this.connect();break}}),window.addEventListener("blur",()=>{console.log("VOIP: MUTE ON BLUR"),this.setMuted(!0)}),window.addEventListener("focus",()=>{console.log("VOIP: UNMUTE ON FOCUS"),this.setMuted(!1)}))}onEnable(){this._net||(this._net=hd.create(this)),this.debug&&(this._net.debug=!0),this._net.addEventListener(nn.StreamReceived,this.onReceiveStream),this._net.addEventListener(nn.StreamEnded,this.onStreamEnded),this._net.enable(),this.autoConnect&&this.context.connection.isConnected&&this.connect(),this.context.connection.beginListen(ie.JoinedRoom,this.onJoinedRoom),this.context.connection.beginListen(ie.LeftRoom,this.onLeftRoom),this.onEnabledChanged(),this.updateButton(),window.addEventListener("visibilitychange",this.onVisibilityChanged)}onDisable(){var e;this._net&&(this._net.stopSendingStream(this._outputStream),this._net.removeEventListener(nn.StreamReceived,this.onReceiveStream),this._net.removeEventListener(nn.StreamEnded,this.onStreamEnded),(e=this._net)==null||e.disable()),this.context.connection.stopListen(ie.JoinedRoom,this.onJoinedRoom),this.context.connection.stopListen(ie.LeftRoom,this.onLeftRoom),this.onEnabledChanged(),this.updateButton(),window.removeEventListener("visibilitychange",this.onVisibilityChanged)}onDestroy(){var e;(e=this._menubutton)==null||e.remove(),this._menubutton=void 0}get isSending(){return this._outputStream!=null&&this._outputStream.active}async connect(e){var t,s;if(!this._net)return console.error("Cannot connect to voice chat - NetworkedStreams not initialized. Make sure the component is enabled before calling this method."),!1;if(this.context.connection.isConnected){if(!await X.microphonePermissionsGranted())return console.error("Cannot connect to voice chat - microphone permissions not granted"),this.updateButton(),!1}else return console.error("Cannot connect to voice chat - not connected to server"),this.updateButton(),!1;return this._allowSending=!0,(t=this._net)==null||t.stopSendingStream(this._outputStream),on(this._outputStream),this._outputStream=await this.getAudioStream(e),this._outputStream?(this.debug&&console.log("VOIP: Got audio stream"),(s=this._net)==null||s.startSendingStream(this._outputStream),this.updateButton(),!0):(this.updateButton(),await X.microphonePermissionsGranted()?console.error("VOIP: Could not get audio stream - please make sure to connect an audio device and grant microphone permissions"):tc("Microphone permissions not granted: Please grant microphone permissions to use voice chat"),(this.debug||F())&&console.log("VOIP: Failed to get audio stream"),!1)}disconnect(e){var t;e!=null&&e.remember&&(this._allowSending=!1),(t=this._net)==null||t.stopSendingStream(this._outputStream),on(this._outputStream),this._outputStream=null,this.updateButton()}setMuted(e){var t;const s=(t=this._outputStream)==null?void 0:t.getAudioTracks();if(s)for(const o of s)o.enabled=!e}get isMuted(){var e;if(this._outputStream===null)return!1;const t=(e=this._outputStream)==null?void 0:e.getAudioTracks();if(t){for(const s of t)if(!s.enabled)return!0}return!1}async updateButton(){var e;if(this.createMenuButton){if(this._menubutton||(this._menubutton=document.createElement("button"),this._menubutton.addEventListener("click",()=>{this.isSending?this.disconnect({remember:!0}):this.connect(),X.microphonePermissionsGranted().then(t=>{t||be("<strong>Microphone permissions not granted</strong>. Please allow your browser to use the microphone to be able to talk. Click on the button on the left side of your browser's address bar to allow microphone permissions.")})})),this._menubutton){this.context.menu.appendChild(this._menubutton),this.activeAndEnabled?this._menubutton.style.display="":this._menubutton.style.display="none",this._menubutton.title=this.isSending?"Click to disable your microphone":"Click to enable your microphone";let t=(this.isSending,""),s=this.isSending?"mic":"mic_off";await X.microphonePermissionsGranted()||(t="No Permission",s="mic_off",this._menubutton.title="Microphone permissions not granted. Please allow your browser to use the microphone to be able to talk. This can usually be done in the addressbar of the webpage."),this._menubutton.innerText=t,this._menubutton.prepend(Mt(s)),this.context.connection.isConnected==!1?this._menubutton.setAttribute("disabled",""):this._menubutton.removeAttribute("disabled")}}else this.activeAndEnabled||(e=this._menubutton)==null||e.remove()}getFrequency(e){return this.unsupported_getfrequency||(this.unsupported_getfrequency=!0,F()&&be("VOIP: getFrequency is currently not supported"),console.warn("VOIP: getFrequency is currently not supported")),null}async getAudioStream(e){if(!navigator.mediaDevices.getUserMedia)return console.error("No getDisplayMedia support"),null;const t=async o=>await navigator.mediaDevices.getUserMedia({audio:o??!0,video:!1}).catch(r=>(console.warn("VOIP failed getting audio stream",r),null)),s=await t(e);if(!s)return null;if(X.isiOS()&&e?.deviceId===void 0){const o=(await navigator.mediaDevices.enumerateDevices()).find(r=>(r.kind==="audioinput"||r.kind==="audiooutput")&&!r.label.includes("iPhone"));if(o){const r=Object.assign({},e);return r.deviceId=o.deviceId,await t(r)}}return s}}qf([m()],Do.prototype,"autoConnect"),qf([m()],Do.prototype,"runInBackground"),qf([m()],Do.prototype,"createMenuButton");var GT=Object.defineProperty,Fx=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&>(e,t,o),o};const qT=C("debugmouth");class zc extends I{constructor(){super(...arguments),a(this,"idle",[]),a(this,"talking",[]),a(this,"marker",null),a(this,"voip",null),a(this,"lastMouthChangeTime",0),a(this,"mouthChangeLength",0)}awake(){setTimeout(()=>{this.voip=P.findObjectOfType(Do,this.context),this.marker||(this.marker=P.getComponentInParent(this.gameObject,hi))},3e3)}update(){var e;if(!this.voip||this.context.time.frameCount%10!==0)return;let t=((e=this.marker)==null?void 0:e.connectionId)??null;if(!t){qT&&(t=null);return}const s=this.voip.getFrequency(t)??0;this.updateLips(s)}updateLips(e){if(this.context.time.time-this.lastMouthChangeTime>this.mouthChangeLength){if(this.mouthChangeLength=.05+Math.random()*.1,this.talking&&this.talking.length>0&&e>30){this.lastMouthChangeTime=this.context.time.time;const t=Math.floor(Math.random()*this.talking.length);this.setMouthShapeActive(this.talking,t)}else if(this.idle.length>0&&this.context.time.time-this.lastMouthChangeTime>.5){this.lastMouthChangeTime=this.context.time.time;const t=Math.floor(Math.random()*this.idle.length);this.setMouthShapeActive(this.idle,t)}}}setMouthShapeActive(e,t){if(e){e!=this.idle?this.idle.map(s=>s.visible=!1):this.talking.map(s=>s.visible=!1);for(let s=0;s<e.length;s++){const o=e[s];o&&(o.visible=s===t)}}}}Fx([m(E)],zc.prototype,"idle"),Fx([m(E)],zc.prototype,"talking");class Xf extends I{constructor(){super(...arguments),a(this,"voip",null),a(this,"marker",null),a(this,"_startPosition",null)}awake(){this.voip=P.findObjectOfType(Do,this.context),this.marker=P.getComponentInParent(this.gameObject,hi)}update(){if(!this.voip||!this.marker||this.context.time.frameCount%10!==0)return;const e=this.marker.connectionId,t=this.voip.getFrequency(e);if(t==null)return;this._startPosition||(this._startPosition=this.gameObject.position.clone());const s=t/100;this.gameObject.position.y=this._startPosition.y+s*.07}}var XT=Object.defineProperty,QT=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&XT(e,t,o),o};const Ka=C("debugxrflags"),Ux=C("disablexrflags");Ux&&console.warn("XRFlags are disabled");var rn=(n=>(n[n.Never=0]="Never",n[n.Browser=1]="Browser",n[n.AR=2]="AR",n[n.VR=4]="VR",n[n.FirstPerson=8]="FirstPerson",n[n.ThirdPerson=16]="ThirdPerson",n[n.All=4294967295]="All",n))(rn||{});const Qf=class{constructor(){a(this,"Mask",17)}Has(e){return(this.Mask&e)!==0}Set(e){Ka&&console.warn("Set XR flag state to",e),this.Mask=e,os.Apply()}Enable(e){this.Mask|=e,os.Apply()}Disable(e){this.Mask&=~e,os.Apply()}Toggle(e){this.Mask^=e,os.Apply()}EnableAll(){this.Mask=-1,os.Apply()}DisableAll(){this.Mask=0,os.Apply()}};a(Qf,"Global",new Qf);let Di=Qf;var Bi;const zx=(Bi=class extends I{constructor(){super(...arguments),a(this,"visibleIn")}static Apply(){for(const n of this.registry)n.UpdateVisible(Di.Global)}awake(){Bi.registry.push(this)}onEnable(){Bi.firstApply?this.UpdateVisible(Di.Global):(Bi.firstApply=!0,Bi.Apply())}onDestroy(){const n=Bi.registry.indexOf(this);n>=0&&Bi.registry.splice(n,1)}get isOn(){return this.gameObject.visible}UpdateVisible(n=null){if(Ux)return;let e;const t=n;if(t&&typeof t=="number"&&(console.assert(typeof t=="number","XRFlag.UpdateVisible: state must be a number",t),Ka&&console.log(t),Bi.buffer.Mask=t,n=Bi.buffer),n instanceof Di?(Ka&&console.warn(this.name,"use passed in mask",n.Mask,this.visibleIn),e=n.Has(this.visibleIn)):(Ka&&console.log(this.name,"use global mask"),Di.Global.Has(this.visibleIn)),e!==void 0)if(e)Ka&&console.log(this.name,"is visible",this.gameObject.uuid),P.setActive(this.gameObject,!0);else{if(Ka&&console.log(this.name,"is not visible",this.gameObject.uuid),!this.gameObject.visible)return;this.gameObject.visible=!1}}},a(Bi,"registry",[]),a(Bi,"firstApply"),a(Bi,"buffer",new Di),Bi);QT([m()],zx.prototype,"visibleIn");let os=zx;var YT=Object.defineProperty,Fu=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&YT(e,t,o),o};class zr extends I{constructor(){super(...arguments),a(this,"eyes",[]),a(this,"lastBlinkTime",0),a(this,"blinkLength",0),a(this,"eyesOpen",!0),a(this,"state",null)}awake(){this.state=P.getComponentInParent(this.gameObject,os)}update(){if(!(!this.gameObject||!this.gameObject.visible||!this.eyes||!Array.isArray(this.eyes)||this.eyes.length===0)&&this.context.time.time-this.lastBlinkTime>this.blinkLength){if(this.lastBlinkTime=this.context.time.time,this.state&&!this.state.isOn||!this.activeAndEnabled)return;if(this.eyesOpen=!this.eyesOpen,this.blinkLength=Math.random(),this.eyesOpen?(this.blinkLength*=3,this.blinkLength+=.5,Math.random()<.1&&(this.blinkLength=.1+Math.random()*.2)):(this.blinkLength*=Math.random()*.2,this.blinkLength+=.1),Math.random()<.1&&(this.blinkLength*=3),this.blinkLength=Math.max(.2,this.blinkLength),this.blinkLength=Math.min(3,this.blinkLength),this.eyes)for(const e of this.eyes)e&&(e.visible=this.eyesOpen)}}}Fu([m(E)],zr.prototype,"eyes"),Fu([m()],zr.prototype,"lastBlinkTime"),Fu([m()],zr.prototype,"blinkLength"),Fu([m()],zr.prototype,"eyesOpen");var KT=Object.defineProperty,Yf=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&KT(e,t,o),o},Uu;const zu=(Uu=class extends I{constructor(){super(...arguments),a(this,"head",null),a(this,"eyes",null),a(this,"target",null),a(this,"brain",null),a(this,"vec",new S),a(this,"currentTargetPoint",new S)}awake(){this.brain||(this.brain=P.getComponentInParent(this.gameObject,Uc)),this.brain||(this.brain=P.addComponent(this.gameObject,Uc)),this.brain&&this.target&&(this.brain.controlledTarget=this.target)}update(){const n=this.target;if(n&&this.head){const e=this.eyes;if(e){const t=ee(n);this.currentTargetPoint.lerp(t,this.context.time.deltaTime/.1);const s=ee(this.head),o=this.vec.copy(this.currentTargetPoint).sub(s).normalize();if(o.length()<.1)return;const r=Uu.forward;if(r.set(0,0,1),r.applyQuaternion(Se(this.head)),r.dot(o)>.45)for(let l=0;l<e.length;l++)e[l].lookAt(this.currentTargetPoint)}}}},a(Uu,"forward",new S(0,0,1)),Uu);Yf([m(E)],zu.prototype,"head"),Yf([m(E)],zu.prototype,"eyes"),Yf([m(E)],zu.prototype,"target");let Kf=zu;var ZT=Object.defineProperty,Zf=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&ZT(e,t,o),o};class Za extends I{constructor(){super(...arguments),a(this,"length",1),a(this,"depthTest",!0),a(this,"isGizmo",!1),a(this,"_axes",null)}onEnable(){if(this.isGizmo&&!yc)return;this._axes||(this._axes=new Ci(this.length)),this._axes.layers.disableAll(),this._axes.layers.set(this.layer),this.gameObject.add(this._axes);const e=this._axes.material;e&&e.depthTest!==void 0&&(e.depthTest=this.depthTest)}onDisable(){this._axes&&this.gameObject.remove(this._axes)}}Zf([m()],Za.prototype,"length"),Zf([m()],Za.prototype,"depthTest"),Zf([m()],Za.prototype,"isGizmo");class Jf extends I{constructor(){super(...arguments),a(this,"from"),a(this,"to"),a(this,"hint"),a(this,"desiredDistance",1)}onEnable(){}update(){if(!this.from||!this.to||!this.hint)return;const e=ee(this.to).clone(),t=ee(this.from).clone(),s=e.distanceTo(t),o=e.clone();o.sub(t);const r=t.clone();r.add(e),r.multiplyScalar(.5);const l=ee(this.hint).clone();l.sub(r);const c=new S;c.crossVectors(l,o),c.crossVectors(o,c),c.normalize();const h=s*.5,d=Math.max(this.desiredDistance,h),u=Math.sqrt(d*d-h*h),p=c.clone();p.multiplyScalar(u),p.add(r),lt(this.gameObject,p);const g=r.clone();g.sub(c),this.gameObject.lookAt(g)}}const JT=C("gizmos"),eE=C("debugboxhelper"),Nc=class xn extends I{constructor(){super(...arguments),a(this,"box",null),a(this,"_lastMatrixUpdateFrame",-1),a(this,"_helper",null),a(this,"_color",null)}isInBox(e){var t;if(!e)return;if(this.box||(this.box=new Si),si([e],void 0,void 0,xn.testBox),xn.testBox.isEmpty()){const o=ee(e,xn._position);xn.testBox.setFromCenterAndSize(o,xn._emptyObjectSize)}this.updateBox();const s=(t=this.box)==null?void 0:t.intersectsBox(xn.testBox);return s&&eE&&$.DrawWireBox3(xn.testBox,16711680,5),s}intersects(e){return e?this.updateBox(!1).intersectsBox(e):!1}updateBox(e=!1){if(this.box||(this.box=new Si),e||this.context.time.frameCount!=this._lastMatrixUpdateFrame){const t=this._lastMatrixUpdateFrame<0;this._lastMatrixUpdateFrame=this.context.time.frameCount;const s=t,o=ee(this.gameObject,xn._position,s),r=Ge(this.gameObject,xn._size);this.box.setFromCenterAndSize(o,r)}return this.box}awake(){this._helper=null,this._color=null,this.box=null}showHelper(e=null,t=!1){var s;if(!(!JT&&!t)){if(this._helper){e&&((s=this._color)==null||s.set(e)),this.gameObject.add(this._helper);return}this._helper=Vg(e),this.gameObject.add(this._helper)}}};a(Nc,"testBox",new Si),a(Nc,"_position",new S),a(Nc,"_size",new S(.01,.01,.01)),a(Nc,"_emptyObjectSize",new S(.01,.01,.01));let Bo=Nc;var tE=Object.defineProperty,di=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&tE(e,t,o),o};class ui extends I{constructor(){super(...arguments),a(this,"attachedRigidbody",null),a(this,"isTrigger",!1),a(this,"sharedMaterial"),a(this,"membership",[0]),a(this,"filter"),a(this,"updateProperties",()=>{var e;(e=this.context.physics.engine)==null||e.updateProperties(this)})}get isCollider(){return!0}awake(){super.awake(),this.attachedRigidbody||(this.attachedRigidbody=this.gameObject.getComponentInParent(dt))}start(){this.attachedRigidbody||(this.attachedRigidbody=this.gameObject.getComponentInParent(dt))}onEnable(){this.attachedRigidbody||(this.attachedRigidbody=this.gameObject.getComponentInParent(dt))}onDisable(){var e;(e=this.context.physics.engine)==null||e.removeBody(this)}get body(){var e;return(e=this.context.physics.engine)==null?void 0:e.getBody(this)}updatePhysicsMaterial(){var e;(e=this.context.physics.engine)==null||e.updatePhysicsMaterial(this)}}di([m(dt)],ui.prototype,"attachedRigidbody"),di([m()],ui.prototype,"isTrigger"),di([m()],ui.prototype,"sharedMaterial"),di([m()],ui.prototype,"membership"),di([m()],ui.prototype,"filter");class Ja extends ui{constructor(){super(...arguments),a(this,"radius",.5),a(this,"center",new S(0,0,0))}onEnable(){var e;super.onEnable(),(e=this.context.physics.engine)==null||e.addSphereCollider(this),Od(this.gameObject.scale,this.updateProperties)}onDisable(){super.onDisable(),Km(this.gameObject.scale,this.updateProperties)}onValidate(){this.updateProperties()}}di([Tt(),m()],Ja.prototype,"radius"),di([m(S)],Ja.prototype,"center");const e0=class vC extends ui{constructor(){super(...arguments),a(this,"size",new S(1,1,1)),a(this,"center",new S(0,0,0))}static add(e,t){const s=Ei(e,vC);return s.autoFit(),t?.rigidbody===!0&&Ei(e,dt,{isKinematic:!1}),s}onEnable(){var e;super.onEnable(),(e=this.context.physics.engine)==null||e.addBoxCollider(this,this.size),Od(this.gameObject.scale,this.updateProperties)}onDisable(){super.onDisable(),Km(this.gameObject.scale,this.updateProperties)}onValidate(){this.updateProperties()}autoFit(e){const t=this.gameObject,s=t.position.clone(),o=t.quaternion.clone(),r=t.scale.clone(),l=t.parent;t.position.set(0,0,0),t.quaternion.set(0,0,0,1),t.scale.set(1,1,1),t.parent=null,t.updateMatrix();const c=si([t]);t.position.copy(s),t.quaternion.copy(o),t.scale.copy(r),t.parent=l,e?.debug===!0&&$.DrawWireBox3(c,16768256,20),this.size=c.getSize(new S)||new S(1,1,1),this.center=c.getCenter(new S)||new S(0,0,0),this.size.length()<=0&&this.size.set(.01,.01,.01)}};di([Tt(),m(S)],e0.prototype,"size"),di([m(S)],e0.prototype,"center");let Nu=e0;class Fo extends ui{constructor(){super(...arguments),a(this,"sharedMesh"),a(this,"convex",!1)}onEnable(){var e,t,s;if(super.onEnable(),!this.context.physics.engine)return;(e=this.sharedMesh)!=null&&e.isMesh||(this.gameObject instanceof G||this.gameObject instanceof mo)&&(this.sharedMesh=this.gameObject);const o=0;if((t=this.sharedMesh)!=null&&t.isMesh)this.context.physics.engine.addMeshCollider(this,this.sharedMesh,this.convex),Xe.assignMeshLOD(this.sharedMesh,o).then(r=>{r&&this.activeAndEnabled&&this.context.physics.engine&&this.sharedMesh&&(this.context.physics.engine.removeBody(this),this.sharedMesh.geometry=r,this.context.physics.engine.addMeshCollider(this,this.sharedMesh,this.convex))});else{const r=this.sharedMesh;if(r!=null&&r.isGroup){console.warn(`MeshCollider mesh is a group "${((s=this.sharedMesh)==null?void 0:s.name)||this.gameObject.name}", adding all children as colliders. This is currently not fully supported (colliders can not be removed from world again)`,this);const l=new Array;for(const c in r.children){const h=r.children[c];h.isMesh&&(this.context.physics.engine.addMeshCollider(this,h,this.convex),l.push(Xe.assignMeshLOD(h,o)))}Promise.all(l).then(c=>{var h,d;if(c.some(p=>p)==!1)return;(h=this.context.physics.engine)==null||h.removeBody(this);const u=new G;for(const p of c)p&&this.activeAndEnabled&&(u.geometry=p,(d=this.context.physics.engine)==null||d.addMeshCollider(this,u,this.convex))})}else(F()||C("showcolliders"))&&console.warn(`[MeshCollider] A MeshCollider mesh is assigned to an unknown object on "${this.gameObject.name}", but it's neither a Mesh nor a Group. Please double check that you attached the collider component to the right object and report a bug otherwise!`,this)}}}di([m(G)],Fo.prototype,"sharedMesh"),di([m()],Fo.prototype,"convex");class Wn extends ui{constructor(){super(...arguments),a(this,"center",new S(0,0,0)),a(this,"radius",.5),a(this,"height",2)}onEnable(){var e;super.onEnable(),(e=this.context.physics.engine)==null||e.addCapsuleCollider(this,this.height,this.radius)}}di([m(S)],Wn.prototype,"center"),di([m()],Wn.prototype,"radius"),di([m()],Wn.prototype,"height");var iE=Object.defineProperty,Vn=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&iE(e,t,o),o};const Nx=C("debugcharactercontroller");class Nr extends I{constructor(){super(...arguments),a(this,"center",new S(0,0,0)),a(this,"radius",.5),a(this,"height",2),a(this,"_rigidbody",null),a(this,"_activeGroundCollisions"),a(this,"_contactVelocity",new S)}get rigidbody(){return this._rigidbody?this._rigidbody:(this._rigidbody=this.gameObject.getComponent(dt),this._rigidbody||(this._rigidbody=this.gameObject.addComponent(dt)),this.rigidbody)}awake(){this._activeGroundCollisions=new Set}onEnable(){const e=this.rigidbody;let t=this.gameObject.getComponent(Wn);t||(t=this.gameObject.addComponent(Wn)),t.center.copy(this.center),t.radius=this.radius,t.height=this.height;const s=new S(0,0,1),o=new S(1,0,0),r=new S(0,1,0),l=this.gameObject.getWorldDirection(new S);l.y=0;const c=o.dot(l)<0?-1:1,h=s.angleTo(l)*c;this.gameObject.setRotationFromAxisAngle(r,h),e.lockRotationX=!0,e.lockRotationY=!0,e.lockRotationZ=!0}move(e){this.gameObject.position.add(e)}onCollisionEnter(e){(e.contacts.length==0||e.contacts.some(t=>t.normal.y>.2))&&(this._activeGroundCollisions.add(e),Nx&&console.log(`Collision(${this._activeGroundCollisions.size}): ${e.contacts.map(t=>t.normal.y.toFixed(2)).join(", ")} - ${this.isGrounded}`))}onCollisionExit(e){this._activeGroundCollisions.delete(e),Nx&&console.log(`Collision(${this._activeGroundCollisions.size}) - ${this.isGrounded}`)}get isGrounded(){return this._activeGroundCollisions.size>0}get contactVelocity(){var e;this._contactVelocity.set(0,0,0);for(const t of this._activeGroundCollisions){const s=(e=this.context.physics.engine)==null?void 0:e.getLinearVelocity(t.collider);s&&(this._contactVelocity.x+=s.x,this._contactVelocity.y+=s.y,this._contactVelocity.z+=s.z)}return this._contactVelocity}}Vn([m(S)],Nr.prototype,"center"),Vn([m()],Nr.prototype,"radius"),Vn([m()],Nr.prototype,"height");class $n extends I{constructor(){super(...arguments),a(this,"controller"),a(this,"movementSpeed",2),a(this,"rotationSpeed",2),a(this,"jumpForce",1),a(this,"doubleJumpForce",2),a(this,"animator"),a(this,"lookForward",!0),a(this,"lookInput",new re(0,0)),a(this,"moveInput",new re(0,0)),a(this,"jumpInput",!1),a(this,"_currentSpeed",new S(0,0,0)),a(this,"_currentAngularSpeed",new S(0,0,0)),a(this,"_temp",new S(0,0,0)),a(this,"_jumpCount",0),a(this,"_currentRotation"),a(this,"_raycastOptions",new Qs)}awake(){this._currentRotation=new V}update(){const e=this.context.input;e.isKeyPressed("KeyW")?this.moveInput.y+=1:e.isKeyPressed("KeyS")&&(this.moveInput.y-=1),e.isKeyPressed("KeyD")?this.lookInput.x+=1:e.isKeyPressed("KeyA")&&(this.lookInput.x-=1),this.jumpInput||(this.jumpInput=e.isKeyDown("Space"))}move(e){this.moveInput.add(e)}look(e){this.lookInput.add(e)}jump(){this.jumpInput=!0}onBeforeRender(){this.handleInput(this.moveInput,this.lookInput,this.jumpInput),this.lookInput.set(0,0),this.moveInput.set(0,0),this.jumpInput=!1}handleInput(e,t,s){var o,r,l,c,h,d,u,p,g,f,y;if((o=this.controller)!=null&&o.isGrounded&&(this._jumpCount=0,this.doubleJumpForce>0&&((r=this.animator)==null||r.setBool("doubleJump",!1))),this._currentSpeed.z+=e.y*this.movementSpeed*this.context.time.deltaTime,(l=this.animator)==null||l.setBool("running",e.length()>.01),(h=this.animator)==null||h.setBool("jumping",((c=this.controller)==null?void 0:c.isGrounded)===!0&&s),this._temp.copy(this._currentSpeed),this._temp.applyQuaternion(this.gameObject.quaternion),this.controller?this.controller.move(this._temp):this.gameObject.position.add(this._temp),this._currentAngularSpeed.y+=W.toRadians(-t.x*this.rotationSpeed)*this.context.time.deltaTime,this.lookForward&&Math.abs(this._currentAngularSpeed.y)<.01){const v=this.context.mainCameraComponent.forward;v.y=0,v.normalize(),this._currentRotation.setFromUnitVectors(new S(0,0,1),v),this.gameObject.quaternion.slerp(this._currentRotation,this.context.time.deltaTime*10)}if(this.gameObject.rotateY(this._currentAngularSpeed.y),this._currentSpeed.multiplyScalar(1-this.context.time.deltaTime*10),this._currentAngularSpeed.y*=1-this.context.time.deltaTime*10,this.controller&&s&&this.jumpForce>0){let v=(d=this.controller)==null?void 0:d.isGrounded;if(this.doubleJumpForce>0&&!((u=this.controller)!=null&&u.isGrounded)&&this._jumpCount===1&&(v=!0,(p=this.animator)==null||p.setBool("doubleJump",!0)),v){this._jumpCount+=1;const b=this.controller.rigidbody,_=this._jumpCount===2?this.doubleJumpForce:this.jumpForce;b.applyImpulse(new S(0,1,0).multiplyScalar(_))}}if(this.controller){const v=(g=this.controller)==null?void 0:g.rigidbody.getVelocity().y;if(v<-1){this._raycastOptions.ray||(this._raycastOptions.ray=new po),this._raycastOptions.ray.origin.copy(ee(this.gameObject)),this._raycastOptions.ray.direction.set(0,-1,0);const b=this.layer;this.gameObject.layers.disableAll(),this.gameObject.layers.set(2);const _=this.context.physics.raycast(this._raycastOptions);this.gameObject.layers.set(b),(_.length&&_[0].distance>2||v<-10)&&((f=this.animator)==null||f.setBool("falling",!0))}else(y=this.animator)==null||y.setBool("falling",!1)}}}Vn([m(Nr)],$n.prototype,"controller"),Vn([m()],$n.prototype,"movementSpeed"),Vn([m()],$n.prototype,"rotationSpeed"),Vn([m()],$n.prototype,"jumpForce"),Vn([m()],$n.prototype,"doubleJumpForce"),Vn([m(Rt)],$n.prototype,"animator");var sE=Object.defineProperty,el=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&sE(e,t,o),o};const Wc=C("debugcontactshadows");bx(n=>{const e=n.domElement.getAttribute("contactshadows")||n.domElement.getAttribute("contact-shadows");if(e!=null&&e!="0"&&e!="false"){console.debug("Auto-creating ContactShadows because of `contactshadows` attribute");const t=Vc.auto(n),s=parseFloat(e);isNaN(s)||(t.opacity=s,t.darkness=s)}});var Wr;const Vr=(Wr=class extends I{constructor(){super(...arguments),a(this,"autoFit",!1),a(this,"darkness",.5),a(this,"opacity",.5),a(this,"blur",4),a(this,"occludeBelowGround",!1),a(this,"backfaceShadows",!0),a(this,"minSize"),a(this,"manualUpdate",!1),a(this,"_needsUpdate",!1),a(this,"shadowsRoot",new E),a(this,"shadowCamera"),a(this,"shadowGroup",new mo),a(this,"renderTarget"),a(this,"renderTargetBlur"),a(this,"plane"),a(this,"occluderMesh"),a(this,"blurPlane"),a(this,"depthMaterial"),a(this,"horizontalBlurMaterial"),a(this,"verticalBlurMaterial"),a(this,"textureSize",512)}static auto(n){if(n||(n=J.Current),!n)throw new Error("No context provided and no current context set.");let e=this._instances.get(n);if(!e||e.destroyed){const t=new E;e=Ei(t,Wr,{autoFit:!1,occludeBelowGround:!1}),this._instances.set(n,e)}return n.scene.add(e.gameObject),e.fitShadows(),e}set needsUpdate(n){this._needsUpdate=n}get needsUpdate(){return this._needsUpdate}fitShadows(){Wc&&console.warn("Fitting shadows to scene"),Td(this.shadowsRoot,!1);const n=si(this.context.scene.children,[this.shadowsRoot]),e=Math.max(1,this.blur/32),t=n.max.x-n.min.x,s=n.max.z-n.min.z;n.expandByVector(new S(e*t,0,e*s)),Wc&&$.DrawWireBox3(n,16776960,60),this.gameObject.parent&&n.applyMatrix4(this.gameObject.parent.matrixWorld.clone().invert());const o=n.min,r=Math.max(1e-5,(n.max.y-o.y)*.002);n.max.y+=r,this.shadowsRoot.position.set((o.x+n.max.x)/2,o.y-r,(o.z+n.max.z)/2),this.shadowsRoot.scale.set(n.max.x-o.x,n.max.y-o.y,n.max.z-o.z),this.applyMinSize(),this.shadowsRoot.matrixWorldNeedsUpdate=!0,Wc&&console.log("Fitted shadows to scene",this.shadowsRoot.scale.clone())}awake(){Wr._instances.set(this.context,this),this.shadowsRoot.hideFlags=Du.DontExport,Td(this.shadowsRoot,!1)}start(){Wc&&console.log("Create ContactShadows on "+this.gameObject.name,this),this.gameObject.add(this.shadowsRoot),this.shadowsRoot.add(this.shadowGroup),this.renderTarget=new $s(this.textureSize,this.textureSize),this.renderTarget.texture.generateMipmaps=!1,this.renderTargetBlur=new $s(this.textureSize,this.textureSize),this.renderTargetBlur.texture.generateMipmaps=!1;const n=new Ns(1,1).rotateX(Math.PI/2);this.gameObject instanceof G&&(console.warn("ContactShadows can not be added to a Mesh. Please add it to a Group or an empty Object"),Bn(this.gameObject,!1));const e=new Me({map:this.renderTarget.texture,opacity:this.opacity,color:0,transparent:!0,depthWrite:!1,side:fo});this.plane=new G(n,e),this.plane.scale.y=-1,this.plane.layers.set(2),this.shadowsRoot.add(this.plane),this.plane&&(this.plane.renderOrder=1),this.occluderMesh=new G(this.plane.geometry,new Me({depthWrite:!0,stencilWrite:!0,colorWrite:!1,side:wd})).translateY(-1e-4),this.occluderMesh.renderOrder=-100,this.occluderMesh.layers.set(2),this.shadowsRoot.add(this.occluderMesh),this.blurPlane=new G(n),this.blurPlane.visible=!1,this.shadowGroup.add(this.blurPlane);const t=0,s=1;this.shadowCamera=new ud(-1/2,1/2,1/2,-1/2,t,s),this.shadowCamera.layers.enableAll(),this.shadowCamera.rotation.x=Math.PI/2,this.shadowGroup.add(this.shadowCamera),this.depthMaterial=new ZC,this.depthMaterial.userData.darkness={value:this.darkness},this.depthMaterial.blending=JC,this.depthMaterial.blendEquation=eP,this.depthMaterial.onBeforeCompile=o=>{this.depthMaterial&&(o.uniforms.darkness=this.depthMaterial.userData.darkness,o.fragmentShader=`
|
|
945
|
+
uniform float darkness;
|
|
946
|
+
${o.fragmentShader.replace("gl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );","gl_FragColor = vec4( vec3( 1.0 ), ( 1.0 - fragCoordZ ) * darkness * opacity * (gl_FrontFacing ? 1.0 : 0.66) );")}
|
|
947
|
+
`)},this.depthMaterial.depthTest=!1,this.depthMaterial.depthWrite=!1,this.horizontalBlurMaterial=new Ws(iO),this.horizontalBlurMaterial.depthTest=!1,this.verticalBlurMaterial=new Ws(sO),this.verticalBlurMaterial.depthTest=!1,this.shadowGroup.visible=!1,this.autoFit?this.fitShadows():this.applyMinSize()}onEnable(){this._needsUpdate=!0}onDestroy(){var n,e,t,s,o,r,l,c;Wr._instances.get(this.context)===this&&Wr._instances.delete(this.context),(n=this.renderTarget)==null||n.dispose(),(e=this.renderTargetBlur)==null||e.dispose(),(t=this.depthMaterial)==null||t.dispose(),(s=this.horizontalBlurMaterial)==null||s.dispose(),(o=this.verticalBlurMaterial)==null||o.dispose(),(r=this.blurPlane)==null||r.geometry.dispose(),(l=this.plane)==null||l.geometry.dispose(),(c=this.occluderMesh)==null||c.geometry.dispose()}onBeforeRender(n){if(this.manualUpdate&&!this._needsUpdate)return;if(this._needsUpdate=!1,!this.renderTarget||!this.renderTargetBlur||!this.depthMaterial||!this.shadowCamera||!this.blurPlane||!this.shadowGroup||!this.plane||!this.horizontalBlurMaterial||!this.verticalBlurMaterial){Wc&&console.error("ContactShadows: not initialized yet");return}const e=this.context.scene,t=this.context.renderer,s=t.getRenderTarget();this.shadowGroup.visible=!0,this.occluderMesh&&(this.occluderMesh.visible=!1);const o=this.plane.visible;this.plane.visible=!1,this.gameObject instanceof G&&Bn(this.gameObject,!1);const r=e.background;e.background=null,e.overrideMaterial=this.depthMaterial,this.backfaceShadows?this.depthMaterial.side=Pi:this.depthMaterial.side=fo;const l=t.getClearAlpha();t.setClearAlpha(0);const c=t.xr.enabled;t.xr.enabled=!1;const h=this.context.scene.matrixWorldAutoUpdate;this.context.scene.matrixWorldAutoUpdate=!1;const d=t.renderLists.get(e,0),u=d.transparent;Wx.length=0,d.transparent=Wx,t0.length=0;for(const g of d.opaque){if(!g.object.visible)continue;const f=g.material;let y=g.material.colorWrite==!1||f.wireframe===!0||Ub(g.object)===!1;!y&&g.material.isLineMaterial&&(y=!0),!y&&g.material.isPointsMaterial&&(y=!0),y&&(t0.push(g.object),g.object["needle:visible"]=g.object.visible,g.object.visible=!1)}t.setRenderTarget(this.renderTarget),t.clear(),t.render(e,this.shadowCamera),d.transparent=u;for(const g of t0)g["needle:visible"]!=null&&(g.visible=g["needle:visible"]);e.overrideMaterial=null;const p=Math.max(this.blur,.05);this.blurShadow(p*2),this.blurShadow(p*.5),this.shadowGroup.visible=!1,this.occluderMesh&&(this.occluderMesh.visible=this.occludeBelowGround),this.plane.visible=o,t.setRenderTarget(s),t.setClearAlpha(l),e.background=r,t.xr.enabled=c,this.context.scene.matrixWorldAutoUpdate=h}blurShadow(n){if(!this.blurPlane||!this.shadowCamera||!this.renderTarget||!this.renderTargetBlur||!this.horizontalBlurMaterial||!this.verticalBlurMaterial)return;this.blurPlane.visible=!0;const e=this.shadowsRoot.worldScale,t=(e.x+e.z)/2,s=e.z/t,o=e.x/t;this.blurPlane.material=this.horizontalBlurMaterial,this.blurPlane.material.uniforms.tDiffuse.value=this.renderTarget.texture,this.horizontalBlurMaterial.uniforms.h.value=n*1/this.textureSize*s;const r=this.context.renderer,l=r.getRenderTarget();r.setRenderTarget(this.renderTargetBlur),r.render(this.blurPlane,this.shadowCamera),this.blurPlane.material=this.verticalBlurMaterial,this.blurPlane.material.uniforms.tDiffuse.value=this.renderTargetBlur.texture,this.verticalBlurMaterial.uniforms.v.value=n*1/this.textureSize*o,r.setRenderTarget(this.renderTarget),r.render(this.blurPlane,this.shadowCamera),this.blurPlane.visible=!1,r.setRenderTarget(l)}applyMinSize(){this.minSize&&this.shadowsRoot.scale.set(Math.max(this.minSize.x||0,this.shadowsRoot.scale.x),Math.max(this.minSize.y||0,this.shadowsRoot.scale.y),Math.max(this.minSize.z||0,this.shadowsRoot.scale.z))}},a(Wr,"_instances",new Map),Wr);el([m()],Vr.prototype,"autoFit"),el([m()],Vr.prototype,"darkness"),el([m()],Vr.prototype,"opacity"),el([m()],Vr.prototype,"blur"),el([m()],Vr.prototype,"occludeBelowGround"),el([m()],Vr.prototype,"backfaceShadows");let Vc=Vr;const Wx=[],t0=new Array,nE=C("logstats");class i0 extends I{onEnable(){console.log(this),nE&&this.startCoroutine(this.run(),Oe.OnAfterRender)}*run(){for(;this.enabled;){const e=this.context.renderer.info;console.log(e.memory,e.render,e.programs),yield}}}class $c extends I{constructor(){super(...arguments),a(this,"isUsed",!0),a(this,"usedBy",null)}}class s0 extends I{}const Vx=C("debugdeletable"),$x=class _m extends Bo{onEnable(){_m._instances.push(this)}onDisable(){const e=_m._instances.indexOf(this);e>=0&&_m._instances.splice(e,1)}};a($x,"_instances",[]);let Wu=$x;class n0 extends I{update(){for(const e of Wu._instances){const t=this.gameObject;if(e.isInBox(t)===!0){const s=P.getComponentInParent(this.gameObject,$c);if(s)Vx&&console.warn("DeleteBox: Not deleting object with usage marker",this.guid,s);else{if(Vx)try{if(e.box){const o=e.box,r=Bo.testBox;$.DrawWireBox3(o,16711680,5),$.DrawWireBox3(r,255,5),console.log("DeleteBox: Destroying",this.gameObject,{deleteBoxArea:o,deletedObjectArea:r})}else console.log("DeleteBox: Destroying",this.gameObject)}catch{}fc(this.gameObject,this.context.connection)}}}}}var oE=Object.defineProperty,rE=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&oE(e,t,o),o};class Vu extends I{constructor(){super(...arguments),a(this,"visibleOn")}onEnable(){this.apply()}apply(){this.test()||P.setActive(this.gameObject,!1)}test(){return this.visibleOn<0?!0:X.isMobileDevice()?(this.visibleOn&2)!==0:(this.visibleOn&1)!==0}}rE([m()],Vu.prototype,"visibleOn");var aE=Object.defineProperty,$r=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&aE(e,t,o),o};const an=C("debugdrag"),o0=[];var r0=(n=>(n[n.XZPlane=0]="XZPlane",n[n.Attached=1]="Attached",n[n.HitNormal=2]="HitNormal",n[n.DynamicViewAngle=3]="DynamicViewAngle",n[n.SnapToSurfaces=4]="SnapToSurfaces",n[n.None=5]="None",n))(r0||{}),zt;const Uo=(zt=class extends I{constructor(){super(...arguments),a(this,"dragMode",3),a(this,"snapGridResolution",0),a(this,"keepRotation",!0),a(this,"xrDragMode",1),a(this,"xrKeepRotation",!1),a(this,"xrDistanceDragFactor",1),a(this,"showGizmo",!1),a(this,"_rigidbody",null),a(this,"_targetObject",null),a(this,"_dragHelper",null),a(this,"_draggingRigidbodies",[]),a(this,"_potentialDragStartEvt",null),a(this,"_dragHandlers",new Map),a(this,"_totalMovement",new S),a(this,"_marker",null),a(this,"_isDragging",!1),a(this,"_didDrag",!1)}static get HasAnySelected(){return this._active>0}static get CurrentlySelected(){o0.length=0;for(const n of this._instances)n._isDragging&&o0.push(n);return o0}get draggedObject(){return this._targetObject}setTargetObject(n){var e,t;this._targetObject=n;for(const o of this._dragHandlers.values())o.setTargetObject(n);const s="_rigidbody-was-kinematic";((e=this._rigidbody)==null?void 0:e[s])===!1&&(this._rigidbody.isKinematic=!1,this._rigidbody[s]=void 0),this._rigidbody=null,n&&(this._rigidbody=P.getComponentInChildren(n,dt),((t=this._rigidbody)==null?void 0:t.isKinematic)===!1&&(this._rigidbody.isKinematic=!0,this._rigidbody[s]=!1))}awake(){this._potentialDragStartEvt=null,this._dragHandlers=new Map,this._totalMovement=new S,this._marker=null,this._isDragging=!1,this._didDrag=!1,this._dragHelper=null,this._draggingRigidbodies=[]}start(){this.gameObject.getComponentInParent(ji)||this.gameObject.addComponent(ji)}onEnable(){zt._instances.push(this)}onDisable(){zt._instances=zt._instances.filter(n=>n!==this)}allowEdit(n=null){return this.context.connection.allowEditing}onPointerEnter(n){if(!this.allowEdit(this.gameObject)||n.mode!=="screen"||(n.event.mode==="tracked-pointer"||n.event.mode==="transient-pointer"?this.xrDragMode:this.dragMode)===5)return;const e=P.getComponentInParent(n.object,zt);!e||e!==this||(zt.lastHovered=n.object,this.context.domElement.style.cursor="pointer")}onPointerMove(n){(this._isDragging||this._potentialDragStartEvt!==null)&&n.use()}onPointerExit(n){this.allowEdit(this.gameObject)&&n.mode==="screen"&&zt.lastHovered===n.object&&(this.context.domElement.style.cursor="auto")}onPointerDown(n){if(!(!this.allowEdit(this.gameObject)||n.used||(n.mode==="tracked-pointer"||n.mode==="transient-pointer"?this.xrDragMode:this.dragMode)===5)&&(zt.lastHovered=n.object,n.button===0)){this._dragHandlers.size===0&&(this._didDrag=!1,this._totalMovement.set(0,0,0),this._potentialDragStartEvt=n),this._targetObject||this.setTargetObject(this.gameObject),zt._active+=1;const e=new a0(this,this._targetObject);if(this._dragHandlers.set(n.event.space,e),e.onDragStart(n),this._dragHandlers.size===2){const t=this._dragHandlers.values(),s=t.next().value,o=t.next().value;if(s instanceof a0&&o instanceof a0){const r=new lE(this,this._targetObject,s,o);this._dragHandlers.set(this.gameObject,r),r.onDragStart(n)}else console.error("Attempting to construct a MultiTouchDragHandler with invalid DragPointerHandlers. This is likely a bug.",{a:s,b:o})}n.use()}}onPointerUp(n){if(an&&$.DrawLabel(n.point??this.gameObject.worldPosition,"POINTERUP:"+n.pointerId+", "+n.button,.03,3),!this.allowEdit(this.gameObject)||n.button!==0)return;this._potentialDragStartEvt=null;const e=this._dragHandlers.get(n.event.space),t=this._dragHandlers.get(this.gameObject);t&&(t.handlerA===e||t.handlerB===e)&&(this._dragHandlers.delete(this.gameObject),t.onDragEnd(n)),e&&(zt._active>0&&(zt._active-=1),this.setTargetObject(null),e.onDragEnd&&e.onDragEnd(n),this._dragHandlers.delete(n.event.space),this._dragHandlers.size===0&&this.onLastDragEnd(n),n.use())}update(){for(const n of this._dragHandlers.values())n.collectMovementInfo&&n.collectMovementInfo(),n.getTotalMovement&&this._totalMovement.add(n.getTotalMovement());if(this._potentialDragStartEvt){if(!this._didDrag)if(this._totalMovement.length()>3e-4)this._didDrag=!0;else return;const n=this._potentialDragStartEvt;this._potentialDragStartEvt=null,this.onFirstDragStart(n)}for(const n of this._dragHandlers.values())n.onDragUpdate&&n.onDragUpdate(this._dragHandlers.size);this._dragHelper&&this._dragHelper.hasSelected&&this.onAnyDragUpdate()}onFirstDragStart(n){if(!n||!n.object)return;const e=P.getComponentInParent(n.object,zt);if(!e||e!==this&&e._isDragging)return;const t=this._targetObject||this.gameObject;if(!t)return;this._isDragging=!0;const s=P.getComponentInChildren(t,sn);an&&console.log("DRAG START",s,t),s&&(s.fastMode=!0,s?.requestOwnership()),this._marker=P.addComponent(t,$c),this._draggingRigidbodies.length=0;const o=P.getComponentsInChildren(t,dt);o&&this._draggingRigidbodies.push(...o)}onAnyDragUpdate(){if(!this._dragHelper)return;this._dragHelper.showGizmo=this.showGizmo,this._dragHelper.onUpdate(this.context);for(const e of this._draggingRigidbodies)e.wakeUp(),e.resetVelocities(),e.resetForcesAndTorques();const n=this._targetObject||this.gameObject;ms.markDirty(n)}onLastDragEnd(n){if(!this||!this._isDragging)return;this._isDragging=!1;for(const t of this._draggingRigidbodies)t.setVelocity(t.smoothedVelocity);if(this._draggingRigidbodies.length=0,this._targetObject=null,n!=null&&n.object){const t=P.getComponentInChildren(n.object,sn);t&&(t.fastMode=!1)}if(this._marker&&this._marker.destroy(),!this._dragHelper)return;const e=this._dragHelper.selected;an&&console.log("DRAG END",e,e?.visible),this._dragHelper.setSelected(null,this.context)}},a(zt,"_active",0),a(zt,"_instances",[]),a(zt,"lastHovered"),zt);$r([m()],Uo.prototype,"dragMode"),$r([m()],Uo.prototype,"snapGridResolution"),$r([m()],Uo.prototype,"keepRotation"),$r([m()],Uo.prototype,"xrDragMode"),$r([m()],Uo.prototype,"xrKeepRotation"),$r([m()],Uo.prototype,"xrDistanceDragFactor"),$r([m()],Uo.prototype,"showGizmo");let Hr=Uo;class lE{constructor(e,t,s,o){a(this,"handlerA"),a(this,"handlerB"),a(this,"context"),a(this,"settings"),a(this,"gameObject"),a(this,"_handlerAAttachmentPoint",new S),a(this,"_handlerBAttachmentPoint",new S),a(this,"_followObject"),a(this,"_manipulatorObject"),a(this,"_deviceMode"),a(this,"_followObjectStartWorldQuaternion",new V),a(this,"_manipulatorPosOffset",new S),a(this,"_manipulatorRotOffset",new V),a(this,"_manipulatorScaleOffset",new S),a(this,"_tempVec1",new S),a(this,"_tempVec2",new S),a(this,"_tempVec3",new S),a(this,"tempLookMatrix",new se),a(this,"_initialScale",new S),a(this,"_initialDistance",0);var r,l;this.context=e.context,this.settings=e,this.gameObject=t,this.handlerA=s,this.handlerB=o,this._followObject=new E,this._manipulatorObject=new E,this.context.scene.add(this._manipulatorObject);const c=(l=(r=ne.active)==null?void 0:r.rig)==null?void 0:l.gameObject;if(!this.handlerA||!this.handlerB||!this.handlerA.hitPointInLocalSpace||!this.handlerB.hitPointInLocalSpace){console.error("Invalid: MultiTouchDragHandler needs two valid DragPointerHandlers with hitPointInLocalSpace set.");return}if(this._tempVec1.copy(this.handlerA.hitPointInLocalSpace),this._tempVec2.copy(this.handlerB.hitPointInLocalSpace),this.gameObject.localToWorld(this._tempVec1),this.gameObject.localToWorld(this._tempVec2),c&&(c.worldToLocal(this._tempVec1),c.worldToLocal(this._tempVec2)),this._initialDistance=this._tempVec1.distanceTo(this._tempVec2),this._initialDistance<.02?(an&&console.log("Finding alternative drag attachment points since initial distance is too low: "+this._initialDistance.toFixed(2)),this.handlerA.followObject.parent.getWorldPosition(this._tempVec1),this.handlerB.followObject.parent.getWorldPosition(this._tempVec2),this._handlerAAttachmentPoint.copy(this._tempVec1),this._handlerBAttachmentPoint.copy(this._tempVec2),this.gameObject.worldToLocal(this._handlerAAttachmentPoint),this.gameObject.worldToLocal(this._handlerBAttachmentPoint),this._initialDistance=this._tempVec1.distanceTo(this._tempVec2),this._initialDistance<.001&&(console.warn("Not supported right now \u2013 controller drag points for multitouch are too close!"),this._initialDistance=1)):(this._handlerAAttachmentPoint.copy(this.handlerA.hitPointInLocalSpace),this._handlerBAttachmentPoint.copy(this.handlerB.hitPointInLocalSpace)),this._tempVec3.lerpVectors(this._tempVec1,this._tempVec2,.5),this._initialScale.copy(t.scale),an){this._followObject.add(new Ci(2)),this._manipulatorObject.add(new Ci(5));const h=d=>`${d.x.toFixed(2)}, ${d.y.toFixed(2)}, ${d.z.toFixed(2)}`;$.DrawLine(this._tempVec1,this._tempVec2,65535,0,!1),$.DrawLabel(this._tempVec3,"A:B "+this._initialDistance.toFixed(2)+`
|
|
948
|
+
`+h(this._tempVec1)+`
|
|
949
|
+
`+h(this._tempVec2),.03,5)}}onDragStart(e){this.gameObject.add(this._followObject),this._followObject.matrixAutoUpdate=!1,this._followObject.matrix.identity(),this._deviceMode=e.mode,this._followObjectStartWorldQuaternion.copy(this._followObject.worldQuaternion),this.alignManipulator(),this._manipulatorObject.attach(this._followObject),this._manipulatorPosOffset.copy(this._followObject.position),this._manipulatorRotOffset.copy(this._followObject.quaternion),this._manipulatorScaleOffset.copy(this._followObject.scale)}onDragEnd(e){if(!this.handlerA||!this.handlerB){console.error("onDragEnd called on MultiTouchDragHandler without valid handlers. This is likely a bug.");return}this.handlerA.recenter(),this.handlerB.recenter(),this._manipulatorObject.removeFromParent(),this._followObject.removeFromParent(),this._manipulatorObject.destroy(),this._followObject.destroy()}alignManipulator(){if(!this.handlerA||!this.handlerB){console.error("alignManipulator called on MultiTouchDragHandler without valid handlers. This is likely a bug.",this);return}if(!this.handlerA.followObject||!this.handlerB.followObject){console.error("alignManipulator called on MultiTouchDragHandler without valid follow objects. This is likely a bug.",this.handlerA,this.handlerB);return}this._tempVec1.copy(this._handlerAAttachmentPoint),this._tempVec2.copy(this._handlerBAttachmentPoint),this.handlerA.followObject.localToWorld(this._tempVec1),this.handlerB.followObject.localToWorld(this._tempVec2),this._tempVec3.lerpVectors(this._tempVec1,this._tempVec2,.5),this._manipulatorObject.position.copy(this._tempVec3);const e=this.context.mainCamera;this.tempLookMatrix.lookAt(this._tempVec3,this._tempVec2,e.worldUp),this._manipulatorObject.quaternion.setFromRotationMatrix(this.tempLookMatrix);const t=this._tempVec1.distanceTo(this._tempVec2);this._manipulatorObject.scale.copy(this._initialScale).multiplyScalar(t/this._initialDistance),this._manipulatorObject.updateMatrix(),this._manipulatorObject.updateMatrixWorld(!0),an&&($.DrawLabel(this._tempVec3.clone().add(new S(0,.2,0)),"A:B "+t.toFixed(2),.03),$.DrawLine(this._tempVec1,this._tempVec2,65280,0,!1))}onDragUpdate(){this.alignManipulator();const e=30,t=1;this._followObject.position.copy(this._manipulatorPosOffset),this._followObject.quaternion.copy(this._manipulatorRotOffset),this._followObject.scale.copy(this._manipulatorScaleOffset);const s=this.gameObject,o=this._followObject;if(!s){console.error("MultiTouchDragHandler has no dragged object. This is likely a bug.");return}o.updateMatrix(),o.updateMatrixWorld(!0);const r=this._deviceMode==="tracked-pointer"||this._deviceMode==="transient-pointer"?this.settings.xrKeepRotation:this.settings.keepRotation;if(this.settings.snapGridResolution>0){const u=this._followObject.worldPosition,p=this.settings.snapGridResolution;u.x=Math.round(u.x/p)*p,u.y=Math.round(u.y/p)*p,u.z=Math.round(u.z/p)*p,this._followObject.worldPosition=u,this._followObject.updateMatrix()}r&&(this._followObject.worldQuaternion=this._followObjectStartWorldQuaternion,this._followObject.updateMatrix());const l=W.clamp01(this.context.time.deltaTime*e*t),c=s.worldPosition;c.lerp(o.worldPosition,l),s.worldPosition=c;const h=s.worldQuaternion;h.slerp(o.worldQuaternion,l),s.worldQuaternion=h;const d=s.worldScale;d.lerp(o.worldScale,l),s.worldScale=d}setTargetObject(e){this.gameObject=e}}class a0{constructor(e,t){a(this,"context"),a(this,"gameObject"),a(this,"settings"),a(this,"_lastRig"),a(this,"_followObject"),a(this,"_totalMovement",new S),a(this,"_totalMovementAlongRayDirection",0),a(this,"_grabStartDistance",0),a(this,"_deviceMode"),a(this,"_followObjectStartPosition",new S),a(this,"_followObjectStartQuaternion",new V),a(this,"_followObjectStartWorldQuaternion",new V),a(this,"_lastDragPosRigSpace"),a(this,"_tempVec",new S),a(this,"_tempMat",new se),a(this,"_hitPointInLocalSpace",new S),a(this,"_hitNormalInLocalSpace",new S),a(this,"_bottomCenter",new S),a(this,"_backCenter",new S),a(this,"_backBottomCenter",new S),a(this,"_bounds",new Si),a(this,"_dragPlane",new yr(new S(0,1,0))),a(this,"_draggedOverObject",null),a(this,"_draggedOverObjectLastSetUp",null),a(this,"_draggedOverObjectLastNormal",new S),a(this,"_draggedOverObjectDuration",0),a(this,"_hasLastSurfaceHitPoint",!1),a(this,"_lastSurfaceHitPoint",new S),this.settings=e,this.context=e.context,this.gameObject=t,this._followObject=new E}getTotalMovement(){return this._totalMovement}get followObject(){return this._followObject}get hitPointInLocalSpace(){return this._hitPointInLocalSpace}setTargetObject(e){this.gameObject=e}recenter(){var e,t;if(!this._followObject.parent){console.warn("Error: space follow object doesn't have parent but recenter() is called. This is likely a bug");return}if(!this.gameObject){console.warn("Error: space follow object doesn't have a gameObject");return}const s=this._followObject.parent;this.gameObject.add(this._followObject),this._followObject.matrixAutoUpdate=!1,this._followObject.position.set(0,0,0),this._followObject.quaternion.set(0,0,0,1),this._followObject.scale.set(1,1,1),this._followObject.updateMatrix(),this._followObject.updateMatrixWorld(!0),s.attach(this._followObject),this._followObjectStartPosition.copy(this._followObject.position),this._followObjectStartQuaternion.copy(this._followObject.quaternion),this._followObjectStartWorldQuaternion.copy(this._followObject.worldQuaternion),this._followObject.updateMatrix(),this._followObject.updateMatrixWorld(!0);const o=this._hitPointInLocalSpace.clone();this.gameObject.localToWorld(o),this._grabStartDistance=o.distanceTo(s.worldPosition);const r=(t=(e=ne.active)==null?void 0:e.rig)==null?void 0:t.gameObject,l=r?.worldScale.x||1;this._grabStartDistance/=l,this._totalMovementAlongRayDirection=0,this._lastDragPosRigSpace=void 0,an&&($.DrawLine(o,s.worldPosition,65280,.5,!1),$.DrawLabel(s.worldPosition.add(new S(0,.1,0)),this._grabStartDistance.toFixed(2),.03,.5))}onDragStart(e){if(!this.gameObject){console.warn("Error: space follow object doesn't have a gameObject");return}if(e.event.space.add(this._followObject),this._lastDragPosRigSpace=void 0,e.point&&e.normal)this._hitPointInLocalSpace.copy(e.point),this.gameObject.worldToLocal(this._hitPointInLocalSpace),this._hitNormalInLocalSpace.copy(e.normal);else if(e){const f=e.event.space,y=f.worldPosition;this.gameObject.worldToLocal(y),this._hitPointInLocalSpace.copy(y);const v=f.worldUp;this._tempMat.copy(this.gameObject.matrixWorld).invert(),v.transformDirection(this._tempMat),this._hitNormalInLocalSpace.copy(v)}this.recenter(),this._totalMovement.set(0,0,0),this._deviceMode=e.mode;const t=this._followObject.parent.worldForward,s=this._deviceMode==="tracked-pointer"||this._deviceMode==="transient-pointer"?this.settings.xrDragMode:this.settings.dragMode,o=this._hitPointInLocalSpace.clone();switch(this.gameObject.localToWorld(o),s){case 0:const f=new S(0,1,0);this.gameObject.parent&&f.transformDirection(this.gameObject.parent.matrixWorld.clone().invert()),this._dragPlane.setFromNormalAndCoplanarPoint(f,o);break;case 2:const y=this._hitNormalInLocalSpace.clone();y.transformDirection(this.gameObject.matrixWorld),this._dragPlane.setFromNormalAndCoplanarPoint(y,o);break;case 1:this._dragPlane.setFromNormalAndCoplanarPoint(t,o);break;case 3:this.setPlaneViewAligned(o,!0);break;case 4:this.setPlaneViewAligned(o,!1);break}const r=this.gameObject.parent,l=this.gameObject.position.clone(),c=this.gameObject.quaternion.clone(),h=this.gameObject.scale.clone(),d=this.gameObject.matrixWorld.clone();r&&r.remove(this.gameObject),this.gameObject.position.set(0,0,0),this.gameObject.quaternion.set(0,0,0,1),this.gameObject.scale.set(1,1,1);const u=si([this.gameObject]);u.expandByPoint(this.gameObject.worldPosition);const p=new S;u.getCenter(p);const g=new S;u.getSize(g),this._bottomCenter.copy(p.clone().add(new S(0,-g.y/2,0))),this._backCenter.copy(p.clone().add(new S(0,0,g.z/2))),this._backBottomCenter.copy(p.clone().add(new S(0,-g.y/2,g.z/2))),this._bounds.copy(u),r&&r.add(this.gameObject),this.gameObject.position.copy(l),this.gameObject.quaternion.copy(c),this.gameObject.scale.copy(h),this.gameObject.matrixWorld.copy(d),this._draggedOverObject=null,this._draggedOverObjectLastSetUp=null,this._draggedOverObjectLastNormal.set(0,1,0),this._draggedOverObjectDuration=0}collectMovementInfo(){var e,t;if(!this._followObject.parent)return;const s=this._followObject.parent;this._followObject.updateMatrix();const o=s.worldPosition,r=(t=(e=ne.active)==null?void 0:e.rig)==null?void 0:t.gameObject;r&&r.worldToLocal(o),(this._lastDragPosRigSpace===void 0||r!=this._lastRig)&&(this._lastDragPosRigSpace=o.clone(),this._lastRig=r),this._tempVec.copy(o).sub(this._lastDragPosRigSpace);const l=s.worldForward;if(r&&(this._tempMat.copy(r.matrixWorld).invert(),l.transformDirection(this._tempMat)),this._totalMovementAlongRayDirection+=l.dot(this._tempVec),this._tempVec.x=Math.abs(this._tempVec.x),this._tempVec.y=Math.abs(this._tempVec.y),this._tempVec.z=Math.abs(this._tempVec.z),this._totalMovement.add(this._tempVec),this._lastDragPosRigSpace.copy(o),an){let c=o;r&&(c=c.clone(),c.transformDirection(r.matrixWorld)),$.DrawRay(c,l,255)}}onDragUpdate(e){if(e>1)return;const t=this.gameObject;if(!t||!this._followObject){console.warn("Warning: DragPointerHandler doesn't have a dragged object. This is likely a bug.");return}const s=this._followObject.parent;if(!s){console.warn("Warning: DragPointerHandler doesn't have a drag source. This is likely a bug.");return}this._followObject.updateMatrix();const o=s.worldPosition,r=s.worldForward,l=this._deviceMode==="tracked-pointer"||this._deviceMode==="transient-pointer",c=l?this.settings.xrKeepRotation:this.settings.keepRotation,h=l?this.settings.xrDragMode:this.settings.dragMode;if(h===5)return;const d=10;c&&(this._followObject.worldQuaternion=this._followObjectStartWorldQuaternion),this._followObject.updateMatrix(),this._followObject.updateMatrixWorld(!0);let u=1,p=2;if(l&&this._grabStartDistance>.5){const w=1+this._totalMovementAlongRayDirection*(2*this.settings.xrDistanceDragFactor);u=Math.max(0,w),u=u*u*u}else this._grabStartDistance<=.5&&(p=3);this._followObject.position.copy(this._followObjectStartPosition),c||this._followObject.quaternion.copy(this._followObjectStartQuaternion),this._followObject.position.multiplyScalar(u),this._followObject.updateMatrix();const g=this._hasLastSurfaceHitPoint;this._hasLastSurfaceHitPoint=!1;const f=new po(o,r);if(h==4){const w=this.context.physics.raycastFromRay(f,{testObject:x=>x!==this.followObject&&x!==s&&x!==t});if(w.length>0){const x=w[0];if(this._draggedOverObject===x.object?this._draggedOverObjectDuration+=this.context.time.deltaTime:(this._draggedOverObject=x.object,this._draggedOverObjectDuration=0),x.face){this._hasLastSurfaceHitPoint=!0,this._lastSurfaceHitPoint.copy(x.point);const k=this._draggedOverObjectDuration>=.15,M=this._totalMovement.length()>=.001,T=q(x.normal||x.face.normal).applyQuaternion(x.object.worldQuaternion);if((k||M)&&(this._draggedOverObjectLastSetUp!==this._draggedOverObject||this._draggedOverObjectLastNormal.dot(T)<.999999||this.context.time.frame%60===0)){this._draggedOverObjectLastSetUp=this._draggedOverObject,this._draggedOverObjectLastNormal.copy(x.face.normal);const L=q(),D=q();this._bounds.getCenter(L),this._bounds.getSize(D),L.sub(D.multiplyScalar(.5).multiply(T)),this._hitPointInLocalSpace.copy(L),this._hitNormalInLocalSpace.copy(x.face.normal),this._bounds.getCenter(L),this._bounds.getSize(D),L.add(D.multiplyScalar(.5).multiply(x.face.normal));const z=q(this._hitPointInLocalSpace).add(L);this._followObject.localToWorld(z);const j=x.point;this._dragPlane.setFromNormalAndCoplanarPoint(T,j)}else if(!(k||M))return}}else g&&this.gameObject&&this.setPlaneViewAligned(this.gameObject.worldPosition,!1)}if(h!==1&&f.intersectPlane(this._dragPlane,this._tempVec)){this._followObject.worldPosition=this._tempVec,this._followObject.updateMatrix(),this._followObject.updateMatrixWorld(!0);const w=q(this._hitPointInLocalSpace);this._followObject.localToWorld(w),an&&$.DrawLine(w,this._tempVec,65535,0,!1),this._followObject.worldPosition=this._tempVec.multiplyScalar(2).sub(w),this._followObject.updateMatrix(),this._followObject.updateMatrix()}if(this.settings.snapGridResolution>0){const w=this._followObject.worldPosition,x=this.settings.snapGridResolution;w.x=Math.round(w.x/x)*x,w.y=Math.round(w.y/x)*x,w.z=Math.round(w.z/x)*x,this._followObject.worldPosition=w,this._followObject.updateMatrix()}c&&(this._followObject.worldQuaternion=this._followObjectStartWorldQuaternion,this._followObject.updateMatrix());const y=W.clamp01(this.context.time.deltaTime*d*p),v=W.clamp01(this.context.time.deltaTime*d*.5*p),b=t.worldPosition;b.lerp(this._followObject.worldPosition,y),t.worldPosition=b;const _=t.worldQuaternion;if(_.slerp(this._followObject.worldQuaternion,v),t.worldQuaternion=_,an){const w=this._hitPointInLocalSpace.clone();t.localToWorld(w),$.DrawSphere(w,.02,16711680);const x=this._hitNormalInLocalSpace.clone();x.applyQuaternion(_),$.DrawRay(w,x,16711680),$.DrawLabel(b.add(new S(0,.25,0)),`Distance: ${this._totalMovement.length().toFixed(2)}
|
|
950
|
+
|
|
951
|
+
Along Ray: ${this._totalMovementAlongRayDirection.toFixed(2)}
|
|
952
|
+
|
|
953
|
+
Session: ${!!ne.active}
|
|
954
|
+
|
|
955
|
+
Device: ${this._deviceMode}
|
|
956
|
+
|
|
957
|
+
`,.03);const k=this._bottomCenter.clone(),M=this._backCenter.clone(),T=this._backBottomCenter.clone();t.localToWorld(k),t.localToWorld(M),t.localToWorld(T),$.DrawSphere(k,.01,65280,0,!1),$.DrawSphere(M,.01,255,0,!1),$.DrawSphere(T,.01,16711935,0,!1),$.DrawLine(k,T,65535,0,!1),$.DrawLine(T,M,65535,0,!1)}}onDragEnd(e){console.assert(this._followObject.parent===e.event.space,"Drag end: _followObject is not parented to the space object"),this._followObject.removeFromParent(),this._followObject.destroy(),this._lastDragPosRigSpace=void 0}setPlaneViewAligned(e,t){if(!this._followObject.parent)return!1;const s=this._followObject.parent.worldForward,o=q(0,1,0),r=s,l=o.angleTo(r),c=.5;return t&&(l>Math.PI/2+c||l<Math.PI/2-c)?this._dragPlane.setFromNormalAndCoplanarPoint(o,e):this._dragPlane.setFromNormalAndCoplanarPoint(s,e),!0}}const Hx=class bC{constructor(e){a(this,"showGizmo",!0),a(this,"useViewAngle",!0),a(this,"_selected",null),a(this,"_context",null),a(this,"_camera"),a(this,"_cameraPlane",new yr),a(this,"_hasGroundPlane",!1),a(this,"_groundPlane",new yr),a(this,"_groundOffset",new S),a(this,"_groundOffsetFactor",0),a(this,"_groundDistance",0),a(this,"_groundPlanePoint",new S),a(this,"_raycaster",new md),a(this,"_cameraPlaneOffset",new S),a(this,"_intersection",new S),a(this,"_worldPosition",new S),a(this,"_inverseMatrix",new se),a(this,"_rbs",[]),a(this,"_groundLine"),a(this,"_groundMarker"),a(this,"_groundOffsetVector",new S(0,1,0)),a(this,"_requireUpdateGroundPlane",!0),a(this,"_didDragOnGroundPlaneLastFrame",!1),this._camera=e;const t=new Vl(bC.geometry),s=t.material;s.color=new oe(.4,.4,.4),t.layers.set(2),t.name="line",t.scale.y=1,this._groundLine=t;const o=new pd(.5,22,22),r=new Me({color:s.color}),l=new G(o,r);l.visible=!1,l.layers.set(2),this._groundMarker=l}get hasSelected(){return this._selected!==null&&this._selected!==void 0}get selected(){return this._selected}setSelected(e,t){if(this._selected&&t)for(const s of this._rbs)s.wakeUp(),s.setVelocity(0,0,0);if(this._selected&&Nn.Remove(t,this._selected),this._selected=e,this._context=t,this._rbs.length=0,e?(t.scene.add(this._groundLine),t.scene.add(this._groundMarker)):(this._groundLine.removeFromParent(),this._groundMarker.removeFromParent()),this._selected){if(!t){console.error("DragHelper: no context");return}Nn.Add(t,this._selected,null),this._groundOffsetFactor=0,this._hasGroundPlane=!0,this._groundOffset.set(0,0,0),this._requireUpdateGroundPlane=!0,this.onUpdateScreenSpacePlane()}}onUpdate(e){this._selected}onUpdateWorldPosition(e,t,s){if(this._selected){if(s){const o=ee(this._selected);o.y=e.y,e=o}if(lt(this._selected,e),lt(this._groundLine,e),this._hasGroundPlane?this._groundLine.scale.y=this._groundDistance:this._groundLine.scale.y=1e3,this._groundLine.visible=this.showGizmo,this._groundMarker.visible=t!==null&&this.showGizmo,t){const o=ee(this._camera).distanceTo(t)*.01;this._groundMarker.scale.set(o,o,o),lt(this._groundMarker,t)}}}onUpdateScreenSpacePlane(){if(!this._selected||!this._context)return;const e=this._context.input.getPointerPositionRC(0);e&&(this._raycaster.setFromCamera(e,this._camera),this._cameraPlane.setFromNormalAndCoplanarPoint(this._camera.getWorldDirection(this._cameraPlane.normal),this._worldPosition.setFromMatrixPosition(this._selected.matrixWorld)),this._raycaster.ray.intersectPlane(this._cameraPlane,this._intersection)&&this._selected.parent&&(this._inverseMatrix.copy(this._selected.parent.matrixWorld).invert(),this._cameraPlaneOffset.copy(this._intersection).sub(this._worldPosition.setFromMatrixPosition(this._selected.matrixWorld))))}onUpdateGroundPlane(){if(!this._selected||!this._context)return;const e=ee(this._selected),t=new po(q(0,.1,0).add(e),q(0,-1,0)),s=new Qs;s.testObject=r=>r!==this._selected;const o=this._context.physics.raycastFromRay(t,s);for(let r=0;r<o.length;r++){const l=o[r];if(!l.face||this.contains(this._selected,l.object))continue;const c=q(0,1,0);this._groundPlane.setFromNormalAndCoplanarPoint(c,l.point);break}this._hasGroundPlane=!0,this._groundPlane.setFromNormalAndCoplanarPoint(t.direction.multiplyScalar(-1),t.origin),this._raycaster.ray.intersectPlane(this._groundPlane,this._intersection),this._groundDistance=this._intersection.distanceTo(e),this._groundOffset.copy(this._intersection).sub(e)}contains(e,t){if(e===t)return!0;if(e.children){for(const s of e.children)if(this.contains(s,t))return!0}return!1}};a(Hx,"geometry",new Vs().setFromPoints([new S(0,0,0),new S(0,-1,0)]));let nj=Hx;var Gx=(n=>(n.File_Spawned="file-spawned",n))(Gx||{});class cE{constructor(e,t,s,o,r,l,c,h,d){a(this,"guid"),a(this,"file_name"),a(this,"file_hash"),a(this,"file_size"),a(this,"position"),a(this,"scale"),a(this,"seed"),a(this,"sender"),a(this,"downloadUrl"),a(this,"parentGuid"),a(this,"boundsSize"),this.seed=t,this.guid=s,this.file_name=o,this.file_hash=r,this.file_size=l,this.position=c,this.scale=h,this.sender=e,this.downloadUrl=d}}var zo;(n=>{const e=new Map;function t(o){var r;e.has(o.guid)&&s(o.guid);const l=new E;e.set(o.guid,l);const c=new E;c.position.y=-.5,l.add(c);const h=new G(new xa(1,1,1,1,1,1),new Me({color:14540253,wireframe:!0,transparent:!0,opacity:.3}));h.position.y=.5,c.add(h);const d=new E;c.add(d);const u=new G(new xa(1,1,1,1,1,1),new Me({color:12307660,transparent:!0,opacity:.4}));u.position.y=.5,d.scale.y=.01,d.add(u);const p=new G(new Ns(1,1,1,1),new Me({color:34,transparent:!0,opacity:.05,depthTest:!1}));return p.rotateX(-Math.PI/2),p.position.y=.51,u.add(p),o.parent.add(l),l.rotateY(Math.PI/2),o.position&&((r=l.position)==null||r.copy(o.position)),o.size&&(l.worldScale=new S().copy(o.size)),l.position.y=l.scale.y/2,{object:l,onProgress:g=>{d instanceof E&&d.scale.set(1,g,1)}}}n.addPreview=t;function s(o){const r=e.get(o);r&&(e.delete(o),r.removeFromParent())}n.removePreview=s})(zo||(zo={}));const tl=[],$u=[];var l0;(n=>{function e(s,o){const r={name:o?.name,priority:o?.priority??0,callback:s};return tl.push(r),tl.sort((l,c)=>l.priority===c.priority?0:l.priority>c.priority?-1:1),()=>{const l=tl.indexOf(r);l>=0&&tl.splice(l,1)}}n.onCreateCustomModelLoader=e;function t(s){return $u.push(s),()=>{const o=$u.indexOf(s);o>=0&&$u.splice(o,1)}}n.onDetermineModelMimetype=t})(l0||(l0={}));const Hc=C("debugfileformat");function qx(n){switch((n.split(".").pop()||n).toUpperCase()){case"GLTF":return"model/gltf+json";case"VRM":return"model/vrm";case"GLB":return"model/gltf-binary";case"FBX":return"model/fbx";case"USD":return"model/vnd.usd+zip";case"USDA":return"model/vnd.usda+zip";case"USDZ":return"model/vnd.usdz+zip";case"OBJ":return"model/obj";default:return null}}async function Xx(n,e){var t;const{useExtension:s=!0}=e;if(s){const l=n,c=new URL(l,globalThis.location.href);let h=null;const d=c.searchParams.get("filetype");switch(d&&(h=d.toUpperCase()),h!=null&&h.length||(h=(t=c.pathname.split(".").pop())==null?void 0:t.toUpperCase()),Hc&&console.warn(`[Needle Engine] Try to use file extension to determine type: '${h}'`),h){case"GLTF":return"model/gltf+json";case"VRM":return"model/vrm";case"GLB":return"model/gltf-binary";case"FBX":return"model/fbx";case"USD":return"model/vnd.usd+zip";case"USDA":return"model/vnd.usda+zip";case"USDZ":return"model/vnd.usdz+zip";case"OBJ":return"model/obj"}}const o=n;if(!n.startsWith("blob:")){const l=new URL(n,globalThis.location.href);l.searchParams.append("range","true"),n=l.toString()}const r=await fetch(n,{method:"GET",headers:{range:"bytes=0-32"}}).catch(l=>null);if(r!=null&&r.ok){const l=await r.arrayBuffer(),c=Qx(o,l,r);return Hc&&console.log("[Needle Engine] Determined file type from header: "+c),c}return"unknown"}function Qx(n,e,t){if(e.byteLength<4)return"unknown";const s=new Uint8Array(e);if(Hc&&console.warn(`[Needle Engine] Trying to determine file type from binary data
|
|
958
|
+
`,'"'+new TextDecoder().decode(e)+`"
|
|
959
|
+
`,s),s[0]==103&&s[1]==108&&s[2]==84&&s[3]==70&&(s[4]==10||s[4]===2))return console.debug("GLTF detected"),"model/gltf+json";if(s[0]==103&&s[1]==108&&s[2]==84&&s[3]==70&&s[4]==98)return console.debug("GLB detected"),"model/gltf-binary";if(s[0]==80&&s[1]==75&&s[2]==3&&s[3]==4)return console.debug("USDZ detected"),"model/vnd.usdz+zip";if(s[0]==80&&s[1]==88&&s[2]==82&&s[3]==45&&s[4]==85&&s[5]==83&&s[6]==68&&s[7]==67)return console.debug("Binary USD detected"),"model/vnd.usd";if(s[0]==35&&s[1]==117&&s[2]==115&&s[3]==100&&s[4]==97)return console.debug("ASCII USD detected"),"model/vnd.usda";if(s[0]==75&&s[1]==97&&s[2]==121&&s[3]==100&&s[4]==97&&s[5]==114&&s[6]==97&&s[7]==32)return console.debug("Binary FBX detected"),"model/fbx";if(s[0]==59&&s[1]==32&&s[2]==70&&s[3]==66&&s[4]==88&&s[5]==32)return console.debug("ASCII FBX detected"),"model/fbx";if(s[0]==35&&s[1]==32&&s[2]==66&&s[3]==108&&s[4]==101&&s[5]==110&&s[6]==100&&s[7]==101&&s[8]==114&&s[9]==32||s[0]==35&&s[1]==32&&s[2]==65&&s[3]==108&&s[4]==105&&s[5]==97&&s[6]==115&&s[7]==32&&s[8]==79&&s[9]==66&&s[10]==74)return console.debug("OBJ detected"),"model/obj";if(t.headers.has("content-type")){const o=t.headers.get("content-type");if(o!=null&&o.startsWith("image/"))return console.debug("Image detected, not a model file"),"unsupported";switch(console.debug("Content-Type: "+o),o){case"model/gltf+json":case"model/gltf-binary":case"model/vrm":case"model/vnd.usdz+zip":case"model/vnd.usd+zip":case"model/vnd.usd":case"model/vnd.usda+zip":case"model/vnd.usda":case"model/vnd.usdc":case"model/fbx":case"model/vnd.autodesk.fbx":case"model/obj":return o}}if(s[0]==118&&s[1]==32||s[0]==102&&s[1]==32)return console.debug("OBJ detected (the file has no header and starts with vertex or face)"),"obj";if(s[0]==35&&s[1]==32&&s[2]==70&&s[3]==105&&s[4]==108&&s[5]==101&&s[6]==32&&s[7]==101&&s[8]==120&&s[9]==112&&s[10]==111&&s[11]==114&&s[12]==116&&s[13]==101&&s[14]==100&&s[15]==32&&s[16]==98&&s[17]==121&&s[18]==32&&s[19]==90&&s[20]==66&&s[21]==114&&s[22]==117&&s[23]==115&&s[24]==104)return console.debug("OBJ detected (exported by ZBrush)"),"obj";if(s[0]==109&&s[1]==116&&s[2]==108&&s[3]==108&&s[4]==105&&s[5]==98)return console.debug("OBJ detected (mtllib)"),"obj";for(const o of $u){const r=o({url:n,response:t,contentType:t.headers.get("content-type"),bytes:s});if(r)return Hc&&console.debug(`Mimetype callback returned: ${r}`),r}if(F()||Hc){const o=new TextDecoder().decode(e.slice(0,Math.min(e.byteLength,32)));console.warn(`Could not determine file type.
|
|
960
|
+
|
|
961
|
+
Consider registering a custom loader via the 'onCreateCustomModelLoader' callback: 'NeedleEngineModelLoader.onCreateCustomModelLoader(args => { })'
|
|
962
|
+
|
|
963
|
+
Content-Type: "${t.headers.get("content-type")}
|
|
964
|
+
"Text: "${o}"
|
|
965
|
+
Binary:`,s)}else console.debug("Could not determine file type from binary data");return"unknown"}var hE=Object.defineProperty,il=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&hE(e,t,o),o};const Fi=C("debugdroplistener");class dE extends CustomEvent{constructor(e){super("object-added",{detail:e})}}const uE="blob";class Hn extends I{constructor(){super(...arguments),a(this,"useNetworking",!0),a(this,"dropArea"),a(this,"fitIntoVolume",!1),a(this,"fitVolumeSize",new S(1,1,1)),a(this,"placeAtHitPosition",!0),a(this,"onDropped",new xe),a(this,"onNetworkEvent",e=>{var t;if(!this.useNetworking){Fi&&console.debug("[DropListener] Ignoring networked event because networking is disabled",e);return}if((t=e.guid)!=null&&t.startsWith(this.guid)){const s=e.url;if(console.debug("[DropListener] Received networked event",e),s)if(Array.isArray(s))for(const o of s)this.addFromUrl(o,{screenposition:new re,point:e.point,size:e.size},!0);else this.addFromUrl(s,{screenposition:new re,point:e.point,size:e.size},!0)}}),a(this,"handlePaste",e=>{this.context.connection.allowEditing===!1||e.defaultPrevented||navigator.clipboard.readText().then(t=>{if(t&&(t.startsWith("http")||t.startsWith("https")||t.startsWith("blob"))){const s={screenposition:new re(this.context.input.mousePosition.x,this.context.input.mousePosition.y)};this.testIfIsInDropArea(s)&&this.addFromUrl(t,s,!1)}}).catch(console.warn)}),a(this,"onDrag",e=>{this.context.connection.allowEditing!==!1&&e.preventDefault()}),a(this,"onDrop",async e=>{if(this.context.connection.allowEditing===!1||(Fi&&console.log(e),!(e!=null&&e.dataTransfer))||e["droplistener:handled"])return;e.preventDefault();const t={screenposition:new re(e.offsetX,e.offsetY)};if(this.dropArea&&this.testIfIsInDropArea(t)===!1)return;e["droplistener:handled"]=!0;const s=e.dataTransfer.items;if(!s)return;const o=[];for(const r in s){const l=s[r];if(l.kind==="file"){const c=l.getAsFile();if(!c)continue;o.push(c)}else l.kind==="string"&&l.type=="text/plain"&&l.getAsString(c=>{this.addFromUrl(c,t,!1)})}o.length>0&&await this.addDroppedFiles(o,t)}),a(this,"_abort",null),a(this,"_addedObjects",new Array),a(this,"_addedModels",new Array)}onEnable(){this.context.renderer.domElement.addEventListener("dragover",this.onDrag),this.context.renderer.domElement.addEventListener("drop",this.onDrop),window.addEventListener("paste",this.handlePaste),this.context.connection.beginListen("droplistener",this.onNetworkEvent)}onDisable(){this.context.renderer.domElement.removeEventListener("dragover",this.onDrag),this.context.renderer.domElement.removeEventListener("drop",this.onDrop),window.removeEventListener("paste",this.handlePaste),this.context.connection.stopListen("droplistener",this.onNetworkEvent)}loadFromURL(e,t){this.addFromUrl(e,{screenposition:new re,point:t?.point,size:t?.size},!0)}forgetObjects(){this.removePreviouslyAddedObjects(!1)}async addFromUrl(e,t,s){Fi&&console.log("dropped url",e);try{if(e.startsWith("https://github.com/")){const l=e.split("/"),c=l[3],h=l[4],d=l[6],u=l.slice(7).join("/");e=`https://raw.githubusercontent.com/${c}/${h}/${d}/${u}`}else e.startsWith("https://polyhaven.com/a")&&(e=pE(e));if(!e)return null;const o=e.toLowerCase();if(o.endsWith(".hdr")||o.endsWith(".hdri")||o.endsWith(".exr")||o.endsWith(".png")||o.endsWith(".jpg")||o.endsWith(".jpeg"))return null;this.removePreviouslyAddedObjects();const r=await Hu.loadFileFromURL(new URL(e),{guid:this.guid,context:this.context,parent:this.gameObject,point:t.point,size:t.size});if(r&&this._addedObjects.length<=0)return t.url=e,this.addObject(r,t,s)}catch{console.warn("String is not a valid URL",e)}return null}async addDroppedFiles(e,t){var s,o;if(Fi&&console.log("Add files",e),!!Array.isArray(e)&&e.length){this.deleteDropEvent(),this.removePreviouslyAddedObjects(),Hl(uE,null),(s=this._abort)==null||s.abort("New files dropped"),this._abort=new AbortController;for(const r of e){if(!r)continue;if(r.type.startsWith("image/")){Fi&&console.warn("Ignoring dropped image file",r.name,r.type);continue}else if(r.name.endsWith(".bin")){Fi&&console.warn("Ignoring dropped binary file",r.name,r.type);continue}console.debug("Load file "+r.name+" + "+r.type);const l=await Hu.loadFile(r,this.context,{guid:this.guid});if(l){this.dispatchEvent(new CustomEvent("file-dropped",{detail:r})),t.file=r;const c=this.addObject(l,t,!1);c&&this.context.connection.isConnected&&this.useNetworking&&(console.debug("Uploading dropped file to blob storage"),Ir.upload(r,{abort:(o=this._abort)==null?void 0:o.signal}).then(h=>{h!=null&&h.download_url&&this._addedObjects.includes(c)&&this.sendDropEvent(h.download_url,c,l.contentMD5)}).catch(console.warn));break}}}}removePreviouslyAddedObjects(e=!0){if(e)for(const t of this._addedObjects)t.parent===this.gameObject&&Ai(t,!0,!0);this._addedObjects.length=0,this._addedModels.length=0}addObject(e,t,s){var o,r;const{model:l,contentMD5:c}=e;if(Fi&&console.log(`Dropped ${this.gameObject.name}`,l),!(l!=null&&l.scene))return console.warn("No object specified to add to scene",l),null;this.removePreviouslyAddedObjects();const h=l.scene;this.gameObject.attach(h),h.position.set(0,0,0),h.quaternion.identity(),this._addedObjects.push(h),this._addedModels.push(l);const d=new Si().setFromCenterAndSize(new S(0,this.fitVolumeSize.y*.5,0).add(this.gameObject.worldPosition),this.fitVolumeSize);if(Fi&&$.DrawWireBox3(d,255,5),this.fitIntoVolume&&zb(h,d,{position:!this.placeAtHitPosition}),this.placeAtHitPosition&&t&&t.screenposition){h.visible=!1;const p=this.context.physics.raycast({screenPoint:this.context.input.convertScreenspaceToRaycastSpace(t.screenposition.clone())});if(h.visible=!0,p&&p.length>0)for(const g of p){const f=g.point.clone();Fi&&console.log("Place object at hit",g),Nb(h,f);break}}Ha.assignAnimationsFromFile(l,{createAnimationComponent:p=>Ei(p,Ft)});const u=new dE({sender:this,gltf:l,model:l,object:h,contentMD5:c,dropped:t.file||(t.url?new URL(t.url):void 0)});return this.dispatchEvent(u),(o=this.onDropped)==null||o.invoke(u.detail),!s&&(r=t.url)!=null&&r.startsWith("http")&&this.context.connection.isConnected&&h&&this.sendDropEvent(t.url,h,c),h}async sendDropEvent(e,t,s){if(!this.useNetworking){Fi&&console.debug("[DropListener] Ignoring networked event because networking is disabled",e);return}if(this.context.connection.isConnected){console.debug('Sending drop event "'+t.name+'"',e);const o=si([t]),r={name:t.name,guid:this.guid,url:e,point:t.worldPosition.clone(),size:o.getSize(new S),contentMD5:s};this.context.connection.send("droplistener",r)}}deleteDropEvent(){this.context.connection.sendDeleteRemoteState(this.guid)}testIfIsInDropArea(e){if(this.dropArea){const t=this.context.input.convertScreenspaceToRaycastSpace(e.screenposition.clone());if(!this.context.physics.raycast({targets:[this.dropArea],screenPoint:t,recursive:!0,testObject:s=>!this._addedObjects.includes(s)}).length)return F()&&console.log(`Dropped outside of drop area for DropListener "${this.name}".`),!1}return!0}}il([m()],Hn.prototype,"useNetworking"),il([m(E)],Hn.prototype,"dropArea"),il([m()],Hn.prototype,"fitIntoVolume"),il([m(S)],Hn.prototype,"fitVolumeSize"),il([m()],Hn.prototype,"placeAtHitPosition"),il([m(xe)],Hn.prototype,"onDropped");function pE(n){if(!n.startsWith("https://polyhaven.com/"))return n;const e="https://dl.polyhaven.org/file/ph-assets/Models/gltf/4k/",t=new URL(n).pathname.split("/").pop(),s=`${e}${t}/${t}_4k.gltf`;return console.log("Resolved polyhaven asset url",n,"\u2192",s),s}var Hu;(n=>{async function e(s,o,r){const l=r.guid,c=new jt(l),h=new Blob([s],{type:s.type||qx(s.name)||void 0}),d=URL.createObjectURL(h),u=await xs().loadSync(o,d,s.name,c).catch(p=>(console.error(`Failed to load file "${s.name}" (${s.type}):`,p),null));return URL.revokeObjectURL(d),u?new Promise((p,g)=>{const f=new FileReader;f.readAsArrayBuffer(s),f.onloadend=async y=>{const v=f.result,b=Ir.hashMD5(v);return p({model:u,contentMD5:b})}}):(console.warn(`Failed to load "${s.name}" (${s.type})`),null)}n.loadFile=e;async function t(s,o){return new Promise(async(r,l)=>{const c=new jt(o.guid),h=s.toString();Fi&&$.DrawWireSphere(o.point,.1,16711680,3);const d=zo.addPreview({guid:o.guid,parent:o.parent,position:o?.point,size:o?.size}),u=await xs().loadSync(o.context,h,h,c,p=>{d.onProgress(p.loaded/p.total)}).catch(console.warn);if(u){const p=await fetch(h).then(f=>f.arrayBuffer()),g=Ir.hashMD5(p);Fi?setTimeout(()=>zo.removePreview(o.guid),3e3):zo.removePreview(o.guid),r({model:u,contentMD5:g})}else Fi?setTimeout(()=>zo.removePreview(o.guid),3e3):zo.removePreview(o.guid),console.warn("Unsupported file type: "+s.toString())})}n.loadFileFromURL=t})(Hu||(Hu={}));var mE=Object.defineProperty,c0=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&mE(e,t,o),o};const Gu=class _C extends I{constructor(){super(...arguments),a(this,"parent",null),a(this,"object",null),a(this,"limitCount",60),a(this,"_currentCount",0),a(this,"_startPosition",null),a(this,"_startQuaternion",null),a(this,"_forwardPointerEvents",new Map)}start(){var e,t;if(this._currentCount=0,this._startPosition=null,this._startQuaternion=null,this.object||(this.object=this.gameObject),this.object){if(this.object===this.gameObject){const o=new jt(this.guid);this.object=P.instantiate(this.object,{idProvider:o,keepWorldPosition:!1});const r=P.getComponent(this.object,_C);r?.destroy();let l=this.object.getComponentInChildren(Hr);l||(l=this.object.addComponent(Hr,{dragMode:r0.SnapToSurfaces}),l.guid=o.generateUUID());let c=P.getComponent(l.gameObject,sn);c||(c=l.gameObject.addComponent(sn),c.guid=o.generateUUID())}this.object.visible=!1;const s=this.gameObject.getComponent(Hr);s&&(s.enabled=!1),this._startPosition=((e=this.object.position)==null?void 0:e.clone())??new S(0,0,0),this._startQuaternion=((t=this.object.quaternion)==null?void 0:t.clone())??new V(0,0,0,1)}this.gameObject.getComponentInParent(ji)||this.gameObject.addComponent(ji)}onEnable(){this.startCoroutine(this.cloneLimitIntervalFn())}onPointerEnter(e){e.used||this.object&&this.context.connection.allowEditing&&e.button===0&&this.context.input.setCursor("pointer")}onPointerExit(e){e.used||this.object&&this.context.connection.allowEditing&&e.button===0&&this.context.input.unsetCursor("pointer")}onPointerDown(e){if(e.used||!this.object||!this.context.connection.allowEditing||e.button!==0)return;const t=this.handleDuplication();if(t){const s=P.getComponent(t,Hr);s?(s.onPointerDown(e),this._forwardPointerEvents.set(e.event.space,s)):console.warn("Duplicated object does not have DragControls",t)}else this._currentCount>=this.limitCount?console.warn(`[Duplicatable] Limit of ${this.limitCount} objects created within a few seconds reached. Please wait a moment before creating more objects.`):console.warn("[Duplicatable] Could not duplicate object.")}onPointerUp(e){if(e.used)return;const t=this._forwardPointerEvents.get(e.event.space);t&&(t.onPointerUp(e),this._forwardPointerEvents.delete(e.event.space))}*cloneLimitIntervalFn(){for(;this.activeAndEnabled&&!this.destroyed;)this._currentCount>0?this._currentCount-=1:this._currentCount<0&&(this._currentCount=0),yield wf(1)}handleDuplication(){var e;if(!this.object||this.limitCount>0&&this._currentCount>=this.limitCount||this.object===this.gameObject)return null;if(P.isDestroyed(this.object))return this.object=null,null;this.object.visible=!0,this._startPosition&&this.object.position.copy(this._startPosition),this._startQuaternion&&this.object.quaternion.copy(this._startQuaternion);const t=new Fs;this.parent||(this.parent=this.gameObject.parent),this.parent&&(t.parent=this.parent.guid??((e=this.parent.userData)==null?void 0:e.guid),t.keepWorldPosition=!0),t.position=this.worldPosition,t.rotation=this.worldQuaternion,t.context=this.context,this._currentCount+=1;const s=P.instantiateSynced(this.object,t);return console.assert(s!==this.object,"Duplicated object is original"),this.object.visible=!1,this._startPosition&&this.object.position.clone().copy(this._startPosition),this._startQuaternion&&this.object.quaternion.clone().copy(this._startQuaternion),s}};c0([m(E)],Gu.prototype,"parent"),c0([m(E)],Gu.prototype,"object"),c0([m()],Gu.prototype,"limitCount");let h0=Gu;var Gn=(n=>(n[n.PointerEnter=0]="PointerEnter",n[n.PointerExit=1]="PointerExit",n[n.PointerDown=2]="PointerDown",n[n.PointerUp=3]="PointerUp",n[n.PointerClick=4]="PointerClick",n[n.Drag=5]="Drag",n[n.Drop=6]="Drop",n[n.Scroll=7]="Scroll",n[n.UpdateSelected=8]="UpdateSelected",n[n.Select=9]="Select",n[n.Deselect=10]="Deselect",n[n.Move=11]="Move",n[n.InitializePotentialDrag=12]="InitializePotentialDrag",n[n.BeginDrag=13]="BeginDrag",n[n.EndDrag=14]="EndDrag",n[n.Submit=15]="Submit",n[n.Cancel=16]="Cancel",n))(Gn||{}),gE=Object.defineProperty,d0=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&gE(e,t,o),o};class u0{constructor(){a(this,"eventID"),a(this,"callback",new xe)}}d0([m()],u0.prototype,"eventID"),d0([m(xe)],u0.prototype,"callback");class qu extends I{constructor(){super(...arguments),a(this,"triggers",[])}invoke(e){var t;if(this.triggers)for(const s of this.triggers)s.eventID===e&&((t=s.callback)==null||t.invoke())}hasTrigger(e){var t;return((t=this.triggers)==null?void 0:t.some(s=>s.eventID===e))??!1}shouldChangeCursor(){return this.hasTrigger(Gn.PointerClick)||this.hasTrigger(Gn.PointerDown)||this.hasTrigger(Gn.PointerUp)}onPointerClick(e){this.invoke(Gn.PointerClick)}onPointerEnter(e){this.shouldChangeCursor()&&this.context.input.setCursor("pointer"),this.invoke(Gn.PointerEnter)}onPointerExit(e){this.shouldChangeCursor()&&this.context.input.unsetCursor("pointer"),this.invoke(Gn.PointerExit)}onPointerDown(e){this.invoke(Gn.PointerDown)}onPointerUp(e){this.invoke(Gn.PointerUp)}}d0([m(u0)],qu.prototype,"triggers");class Yx{constructor(e){a(this,"writer"),this.writer=e}writeNode(e){}}class fE extends Yx{beforeWriteNode(e,t){$.isGizmo(e)&&(t.keep=!1)}}class Kx extends Yx{beforeWriteTexture(e,t){e.isRenderTargetTexture&&(t.newTexture=Sf(new he(1,1,1,0)))}}function p0(n){const e=Du.DontExport;return!(n.hideFlags&e)}const m0=C("debugexr");class yE{constructor(e){a(this,"parser"),this.parser=e,m0&&console.log(e)}get name(){return"EXT_texture_exr"}loadTexture(e){const t=this.name,s=this.parser,o=s.json.textures[e];if(m0&&console.log("EXT_texture_exr.loadTexture",e,o),!o.extensions||!o.extensions[t])return null;const r=o.extensions[t],l=new Cd(s.options.manager);return m0&&console.log("EXT_texture_exr.loadTexture",r),s.loadTextureImage(e,r.source,l)}}typeof window<"u"&&window.addEventListener("unhandledrejection",n=>{});const qn=wt,Xu="$___Export_Components",vE="NEEDLE_components";var Zx;Zx=xr;class bE{constructor(){a(this,Zx)}}class _E{constructor(e,t,s){a(this,"node"),a(this,"nodeIndex"),a(this,"nodeDef"),this.node=e,this.nodeIndex=t,this.nodeDef=s}}class Jx{constructor(){a(this,"parser"),a(this,"nodeToObjectMap",{}),a(this,"gltf",null),a(this,"exportContext"),a(this,"objectToNodeMap",{}),a(this,"context"),a(this,"writer")}get name(){return vE}registerExport(e){e.register(t=>{if("serializeUserData"in t){const s=t.serializeUserData.bind(t);this.writer=t,t.serializeUserData=(o,r)=>{try{this.serializeUserData(o,r)&&(t.extensionsUsed[this.name]=!0),s(o,r)}finally{this.afterSerializeUserData(o,r)}}}return this})}beforeParse(){this.exportContext={},this.objectToNodeMap={}}serializeUserData(e,t){var s;const o=(s=e.userData)==null?void 0:s.components;return!o||o.length<=0?!1:(delete e.userData.components,e[Xu]=o,!0)}afterSerializeUserData(e,t){if(e.type==="Scene"&&qn&&console.log("DONE",JSON.stringify(t)),e[Xu]===void 0)return;const s=e[Xu];delete e[Xu],s!==null&&(e.userData.components=s)}writeNode(e,t){const s=this.writer.json.nodes.length;qn&&console.log(e.name,s,e.uuid);const o=new _E(e,s,t);this.exportContext[s]=o,this.objectToNodeMap[e.uuid]=s}afterParse(e){var t;qn&&console.log("AFTER",e);for(const s in this.exportContext){const o=this.exportContext[s],r=o.node,l=o.nodeDef,c=o.nodeIndex,h=(t=r.userData)==null?void 0:t.components;if(!h||h.length<=0)continue;const d=new bE;l.extensions=l.extensions||{},l.extensions[this.name]=d,this.context.object=r,this.context.nodeId=c,this.context.objectToNode=this.objectToNodeMap;const u=[];for(const p of h){this.context.target=p;const g=xs().writeBuiltinComponentData(p,this.context);g!==null&&u.push(g)}u.length>0&&(d[xr]=u,qn&&console.log("DID WRITE",r,"nodeIndex",c,u))}}beforeRoot(){return qn&&console.log("BEGIN LOAD"),this.nodeToObjectMap={},null}async afterRoot(e){this.gltf=e;const t=e.parser,s=t?.extensions;if(!s)return;const o=s[this.name];qn&&console.log("After root",e,this.parser,s);const r=[];if(o===!0){const l=t.json.nodes;if(l){for(let c=0;c<l.length;c++){const h=await t.getDependency("node",c);this.nodeToObjectMap[c]=h}for(let c=0;c<l.length;c++){const h=l[c],d=c,u=h.extensions;if(!u)continue;const p=u[this.name];if(!p)continue;qn&&console.log("NODE",h);const g=this.nodeToObjectMap[d];if(!g){console.error("Could not find object for node index: "+d,h,t);continue}ou(g),r.push(this.createComponents(g,p))}}}await Promise.all(r);for(const l of t.associations.keys()){const c=t.associations.get(l);if(c?.materials!=null){const h="/materials/"+c.materials;$M(l,h)}}}async createComponents(e,t){if(!t)return;const s=t[xr];if(s){const o=new Array;qn&&console.log(e.name,s);for(const r in s){const l=s[r];qn&&console.log("Serialized data",JSON.parse(JSON.stringify(l))),l&&this.parser&&o.push(lf(this.parser,l).catch(c=>console.error(`Error while resolving references (see console for details)
|
|
966
|
+
`,c,e,l))),e.userData=e.userData||{},e.userData[xr]=e.userData[xr]||[],e.userData[xr].push(l)}await Promise.all(o).catch(r=>{console.error("Error while loading components",r)})}}}const e1="NEEDLE_gameobject_data";class wE{constructor(e){a(this,"parser"),this.parser=e}get name(){return e1}afterRoot(e){var t;const s=[];for(let o=0;o<((t=this.parser.json.nodes)==null?void 0:t.length);o++){const r=this.parser.json.nodes[o];if(r&&r.extensions){const l=r.extensions[e1];if(l){const c=this.findAndApplyExtensionData(o,l);s.push(c)}}}return Promise.all(s).then(()=>null)}async findAndApplyExtensionData(e,t){const s=await this.parser.getDependency("node",e);s&&this.applyExtensionData(s,t)}applyExtensionData(e,t){t.layers===void 0&&(t.layers=0),e.userData.layer=t.layers,e.layers.disableAll(),e.layers.set(t.layers),e.userData.tag=t.tag??"none",e.hideFlags=0,e.userData.static=t.static??!1,e.visible=t.activeSelf??!0,e.guid=t.guid}}const t1="NEEDLE_lighting_settings",sl=C("debugenvlight");class xE{constructor(e,t,s){a(this,"parser"),a(this,"sourceId"),a(this,"context"),this.parser=e,this.sourceId=t,this.context=s}get name(){return t1}afterRoot(e){const t=this.parser.json.extensions;if(t){const s=t[t1];if(s){sl&&console.log('Loaded "'+this.name+'", src: "'+this.sourceId+'"',s);let o;if(e.scene.children.length===1){const r=e.scene.children[0];o=P.addComponent(r,Qu,{},{callAwake:!1})}else{const r=new E;r.name="LightSettings "+this.sourceId,e.scene.add(r),o=P.addComponent(r,Qu,{},{callAwake:!1})}o.sourceId=this.sourceId,o.ambientIntensity=s.ambientIntensity,o.ambientLight=new oe().fromArray(s.ambientLight),Array.isArray(s.ambientTrilight)&&(o.ambientTrilight=s.ambientTrilight.map(r=>new oe().fromArray(r))),o.ambientMode=s.ambientMode,o.environmentReflectionSource=s.environmentReflectionSource}}return null}}pe.registerCallback(me.ContextCreated,n=>{const e=n.context,t=P.findObjectOfType(Qu,e);t!=null&&t.sourceId&&(t.enabled=!0)});class Qu extends I{constructor(){super(...arguments),a(this,"ambientMode",Ga.Skybox),a(this,"ambientLight"),a(this,"ambientTrilight"),a(this,"ambientIntensity",1),a(this,"environmentReflectionSource",mu.Skybox),a(this,"_hasReflection",!1),a(this,"_ambientLightObj"),a(this,"_hemisphereLightObj")}awake(){var e;if(this.sourceId){const s=this.environmentReflectionSource===mu.Skybox?So.Skybox:So.Reflection,o=this.context.lightmaps.tryGet(this.sourceId,s,0);this._hasReflection=o!=null,o&&this.context.sceneLighting.internalRegisterReflection(this.sourceId,o)}this.enabled=!1,this.context.sceneLighting.internalRegisterSceneLightSettings(this),sl&&window.addEventListener("keydown",s=>{if(!this.destroyed)switch(s.key){case"l":this.enabled=!this.enabled;break}});const t=(e=this.gameObject.userData)==null?void 0:e.components;if(t){const s=t.indexOf(this);t.splice(s,1),t.push(this)}}onDestroy(){this.context.sceneLighting.internalUnregisterSceneLightSettings(this)}calculateIntensityFactor(e){const t=Math.max(e.r,e.g,e.b);return 2.2*W.lerp(0,1.33,t)}onEnable(){if(sl&&console.warn("\u{1F4A1}\u{1F7E1} >>> Enable lighting",this.sourceId,this.enabled,this),this.ambientMode==Ga.Flat){if(this.ambientLight&&!this._ambientLightObj){const e=this.calculateIntensityFactor(this.ambientLight);this._ambientLightObj=new tP(this.ambientLight,this.ambientIntensity*e),sl&&console.log("Created ambient light",this.sourceId,this._ambientLightObj,this.ambientIntensity,e)}this._ambientLightObj&&this.gameObject.add(this._ambientLightObj)}else if(this.ambientMode===Ga.Trilight){if(this.ambientTrilight){const e=this.ambientTrilight[0],t=this.ambientTrilight[this.ambientTrilight.length-1],s=this.calculateIntensityFactor(t);this._hemisphereLightObj=new iP(t,e,this.ambientIntensity*s),this.gameObject.add(this._hemisphereLightObj),sl&&console.log("Created hemisphere ambient light",this.sourceId,this._hemisphereLightObj,this.ambientIntensity,s)}}else this._ambientLightObj&&this._ambientLightObj.removeFromParent(),this._hemisphereLightObj&&this._hemisphereLightObj.removeFromParent();this.sourceId&&this.context.sceneLighting.internalEnableReflection(this.sourceId)}onDisable(){sl&&console.warn("\u{1F4A1}\u26AB <<< Disable lighting:",this.sourceId,this),this._ambientLightObj&&this._ambientLightObj.removeFromParent(),this._hemisphereLightObj&&this._hemisphereLightObj.removeFromParent(),this.sourceId&&this.context.sceneLighting.internalDisableReflection(this.sourceId)}}const g0=C("debugstencil");function SE(n,e){return(n&1<<e.layer)!=0}const CE=Symbol("stencils"),i1=class Bl{constructor(e,t){a(this,"parser"),a(this,"source"),this.parser=e,this.source=t}get name(){return"NEEDLE_render_objects"}static applyStencil(e){if(!e)return;const t=e.sourceId;if(g0&&console.log(t,Bl.stencils),!t)return;const s=Bl.stencils[t];if(s)for(let o=s.length-1;o>=0;o--){const r=s[o];if(SE(r.layer,e)){g0&&console.log(r),setTimeout(()=>{Xt()&&au(e.gameObject)&&(be("Stencil not supported on instanced objects"),console.warn("Stencil not supported on instanced objects",e))},500);for(let l=0;l<e.sharedMaterials.length;l++){let c=e.sharedMaterials[l];c&&(c=c.clone(),c[CE]=!0,c.stencilWrite=!0,c.stencilWriteMask=255,c.stencilFuncMask=255,c.stencilRef=r.value,c.stencilFunc=r.compareFunc,c.stencilZPass=r.passOp,c.stencilFail=r.failOp,c.stencilZFail=r.zFailOp,e.sharedMaterials[l]=c)}e.gameObject.renderOrder=r.event*1e3+r.index*50;break}}}afterRoot(e){const t=this.parser.json.extensions;if(t){const s=t[OE];if(s){g0&&console.log(s);const o=s.stencil;if(o&&Array.isArray(o))for(const r of o){const l={...r};l.compareFunc=PE(l.compareFunc),l.passOp=f0(l.passOp),l.failOp=f0(l.failOp),l.zFailOp=f0(l.zFailOp),Bl.stencils[this.source]||(Bl.stencils[this.source]=[]),Bl.stencils[this.source].push(l)}}}return null}};a(i1,"stencils",{});let s1=i1;function f0(n){switch(n){case 0:return yP;case 1:return fP;case 2:return gP;case 3:return mP;case 4:return pP;case 6:return uP;case 7:return dP;case 5:return hP}return 0}function PE(n){switch(n){case 1:return Dv;case 2:return cP;case 3:return lP;case 4:return aP;case 5:return rP;case 6:return oP;case 7:return nP;case 8:return sP}return Dv}const OE="NEEDLE_render_objects";var n1=(n=>(n[n.INT=5124]="INT",n[n.FLOAT=5126]="FLOAT",n[n.FLOAT_VEC2=35664]="FLOAT_VEC2",n[n.FLOAT_VEC3=35665]="FLOAT_VEC3",n[n.FLOAT_VEC4=35666]="FLOAT_VEC4",n[n.INT_VEC2=35667]="INT_VEC2",n[n.INT_VEC3=35668]="INT_VEC3",n[n.INT_VEC4=35669]="INT_VEC4",n[n.BOOL=35670]="BOOL",n[n.BOOL_VEC2=35671]="BOOL_VEC2",n[n.BOOL_VEC3=35672]="BOOL_VEC3",n[n.BOOL_VEC4=35673]="BOOL_VEC4",n[n.FLOAT_MAT2=35674]="FLOAT_MAT2",n[n.FLOAT_MAT3=35675]="FLOAT_MAT3",n[n.FLOAT_MAT4=35676]="FLOAT_MAT4",n[n.SAMPLER_2D=35678]="SAMPLER_2D",n[n.SAMPLER_3D=35680]="SAMPLER_3D",n[n.SAMPLER_CUBE=35681]="SAMPLER_CUBE",n[n.UNKNOWN=0]="UNKNOWN",n))(n1||{});const ln=C("debugcustomshader"),nl="NEEDLE_techniques_webgl";class kE{constructor(){a(this,"objectToWorldMatrix",new se),a(this,"worldToObjectMatrix",new se),a(this,"objectToWorld",new Array),a(this,"worldToObject",new Array)}updateFrom(e){this.objectToWorldMatrix.copy(e.matrixWorld),pu(this.objectToWorldMatrix,this.objectToWorld),this.worldToObjectMatrix.copy(e.matrixWorld).invert(),pu(this.worldToObjectMatrix,this.worldToObject)}}const cn=class $e extends Bv{constructor(e,...t){super(...t),a(this,"identifier"),a(this,"onBeforeRenderSceneCallback",this.onBeforeRenderScene.bind(this)),a(this,"_sphericalHarmonicsName","unity_SpecCube0"),a(this,"_objToWorldName","hlslcc_mtx4x4unity_ObjectToWorld"),a(this,"_worldToObjectName","hlslcc_mtx4x4unity_WorldToObject"),a(this,"_viewProjectionName","hlslcc_mtx4x4unity_MatrixVP"),a(this,"_viewMatrixName","hlslcc_mtx4x4unity_MatrixV"),a(this,"_rendererData",new kE),this.identifier=e,ln&&console.log(this),this.type="NEEDLE_CUSTOM_SHADER",this.uniforms[this._objToWorldName]||(this.uniforms[this._objToWorldName]={value:[]}),this.uniforms[this._worldToObjectName]||(this.uniforms[this._worldToObjectName]={value:[]}),this.uniforms[this._viewProjectionName]||(this.uniforms[this._viewProjectionName]={value:[]}),this.uniforms[this._sphericalHarmonicsName],(this.depthTextureUniform||this.opaqueTextureUniform)&&J.Current.pre_render_callbacks.push(this.onBeforeRenderSceneCallback)}clone(){const e=super.clone();return r1(e),e}dispose(){super.dispose();const e=J.Current.pre_render_callbacks.indexOf(this.onBeforeRenderSceneCallback);e>=0&&J.Current.pre_render_callbacks.splice(e,1)}get depthTextureUniform(){if(this.uniforms)return this.uniforms._CameraDepthTexture}get opaqueTextureUniform(){if(this.uniforms)return this.uniforms._CameraOpaqueTexture}onBeforeRenderScene(){this.opaqueTextureUniform&&J.Current.setRequireColor(!0),this.depthTextureUniform&&J.Current.setRequireDepth(!0)}onBeforeRender(e,t,s,o,r,l){o.attributes.tangent||o.computeTangents(),this.onUpdateUniforms(s,r)}onUpdateUniforms(e,t){const s=J.Current;if(e&&($e.viewProjection&&this.uniforms[this._viewProjectionName]&&($e.viewProjection.copy(e.projectionMatrix).multiply(e.matrixWorldInverse),pu($e.viewProjection,$e._viewProjectionValues)),$e.viewMatrix&&this.uniforms[this._viewMatrixName]&&($e.viewMatrix.copy(e.matrixWorldInverse),pu($e.viewMatrix,$e._viewMatrixValues)),this.uniforms[$e._worldSpaceCameraPosName]&&$e._worldSpaceCameraPos.setFromMatrixPosition(e.matrixWorld)),this.uniforms._TimeParameters&&(this.uniforms._TimeParameters.value=s.sceneLighting.timeVec4),this.uniforms._Time){const c=this.uniforms._Time.value;c.x=s.sceneLighting.timeVec4.x/20,c.y=s.sceneLighting.timeVec4.x,c.z=s.sceneLighting.timeVec4.x*2,c.w=s.sceneLighting.timeVec4.x*3}if(this.uniforms._SinTime){const c=this.uniforms._SinTime.value;c.x=Math.sin(s.sceneLighting.timeVec4.x/8),c.y=Math.sin(s.sceneLighting.timeVec4.x/4),c.z=Math.sin(s.sceneLighting.timeVec4.x/2),c.w=Math.sin(s.sceneLighting.timeVec4.x)}if(this.uniforms._CosTime){const c=this.uniforms._CosTime.value;c.x=Math.cos(s.sceneLighting.timeVec4.x/8),c.y=Math.cos(s.sceneLighting.timeVec4.x/4),c.z=Math.cos(s.sceneLighting.timeVec4.x/2),c.w=Math.cos(s.sceneLighting.timeVec4.x)}if(this.uniforms.unity_DeltaTime){const c=this.uniforms.unity_DeltaTime.value;c.x=s.time.deltaTime,c.y=1/s.time.deltaTime,c.z=s.time.smoothedDeltaTime,c.w=1/s.time.smoothedDeltaTime}const o=s.mainLight;if(o){const c=ee(o.gameObject,$e._mainLightPosition);this.uniforms._MainLightPosition={value:c.normalize()},$e._mainLightColor.set(o.color.r,o.color.g,o.color.b,0),this.uniforms._MainLightColor={value:$e._mainLightColor};const h=o.intensity;$e._lightData.z=h,this.uniforms.unity_LightData={value:$e._lightData}}if(e&&($e.viewProjection&&this.uniforms[this._viewProjectionName]&&(this.uniforms[this._viewProjectionName].value=$e._viewProjectionValues),$e.viewMatrix&&this.uniforms[this._viewMatrixName]&&(this.uniforms[this._viewMatrixName].value=$e._viewMatrixValues),this.uniforms[$e._worldSpaceCameraPosName]&&(this.uniforms[$e._worldSpaceCameraPosName]={value:$e._worldSpaceCameraPos}),s.mainCameraComponent)){if(this.uniforms._ProjectionParams){const c=this.uniforms._ProjectionParams.value;c.x=1,c.y=s.mainCameraComponent.nearClipPlane,c.z=s.mainCameraComponent.farClipPlane,c.w=1/c.z,this.uniforms._ProjectionParams.value=c}if(this.uniforms._ZBufferParams){const c=this.uniforms._ZBufferParams.value,h=s.mainCameraComponent;c.x=1-h.farClipPlane/h.nearClipPlane,c.y=h.farClipPlane/h.nearClipPlane,c.z=c.x/h.farClipPlane,c.w=c.y/h.farClipPlane,this.uniforms._ZBufferParams.value=c}if(this.uniforms._ScreenParams){const c=this.uniforms._ScreenParams.value;c.x=s.domWidth,c.y=s.domHeight,c.z=1+1/c.x,c.w=1+1/c.y,this.uniforms._ScreenParams.value=c}if(this.uniforms._ScaledScreenParams){const c=this.uniforms._ScaledScreenParams.value;c.x=s.domWidth,c.y=s.domHeight,c.z=1+1/c.x,c.w=1+1/c.y,this.uniforms._ScaledScreenParams.value=c}}const r=this.depthTextureUniform;r&&(r.value=s.depthTexture);const l=this.opaqueTextureUniform;if(l&&(l.value=s.opaqueColorTexture),t){const c=this._rendererData;c.updateFrom(t),this.uniforms[this._worldToObjectName].value=c.worldToObject,this.uniforms[this._objToWorldName].value=c.objectToWorld}this.uniformsNeedUpdate=!0}};a(cn,"viewProjection",new se),a(cn,"_viewProjectionValues",[]),a(cn,"viewMatrix",new se),a(cn,"_viewMatrixValues",[]),a(cn,"_worldSpaceCameraPosName","_WorldSpaceCameraPos"),a(cn,"_worldSpaceCameraPos",new S),a(cn,"_mainLightColor",new fe),a(cn,"_mainLightPosition",new S),a(cn,"_lightData",new fe);let o1=cn;class ME{constructor(e,t){a(this,"parser"),a(this,"identifier"),this.parser=e,this.identifier=t}get name(){return nl}loadMaterial(e){const t=this.parser.json.materials[e];if(!t)return ln&&console.log(e,this.parser.json.materials),null;if(!t.extensions||!t.extensions[nl])return ln&&console.log(`Material ${e} does not use NEEDLE_techniques_webgl`),null;ln&&console.log(`Material ${e} uses NEEDLE_techniques_webgl`,t);const s=t.extensions[nl].technique;if(s<0)return console.debug(`Material ${e} does not have a valid technique index`),null;const o=this.parser.json.extensions[nl];if(!o)return ln?console.error("Missing shader data",this.parser.json.extensions):console.debug("Missing custom shader data in parser.json.extensions"),null;ln&&console.log(o);const r=o.techniques[s];return r?new Promise(async(l,c)=>{var h,d,u;const p=await _R(o,r.program),g=p?.fragmentShader,f=p?.vertexShader;if(!g||!f)return c();ln&&console.log("loadMaterial",t,p);const y={},v=r.uniforms;(f.includes("_Time")||g.includes("_Time"))&&(y._Time={value:new fe(0,0,0,0)}),(f.includes("_SinTime")||g.includes("_SinTime"))&&(y._SinTime={value:new fe(0,0,0,0)}),(f.includes("_CosTime")||g.includes("_CosTime"))&&(y._CosTime={value:new fe(0,0,0,0)}),(f.includes("unity_DeltaTime")||g.includes("unity_DeltaTime"))&&(y.unity_DeltaTime={value:new fe(0,0,0,0)});for(const w in v){const x=w;switch(x){case"_TimeParameters":const k=new fe;y[x]={value:k};break;case"hlslcc_mtx4x4unity_MatrixV":case"hlslcc_mtx4x4unity_MatrixVP":y[x]={value:[]};break;case"_MainLightPosition":case"_MainLightColor":case"_WorldSpaceCameraPos":y[x]={value:[0,0,0,1]};break;case"unity_OrthoParams":break;case"unity_SpecCube0":y[x]={value:null};break;default:case"_ScreenParams":case"_ZBufferParams":case"_ProjectionParams":y[x]={value:[0,0,0,0]};break;case"_CameraOpaqueTexture":case"_CameraDepthTexture":y[x]={value:null};break}}let b=!1;if(t.extensions&&t.extensions[nl]){const w=t.extensions[nl];if(w.technique===s){ln&&console.log(t.name,"Material Properties",w);for(const x in w.values){const k=w.values[x];if(typeof k=="string"){if(k.startsWith("/textures/")){const M=k.substring(10),T=Number.parseInt(M);if(T>=0){const L=await this.parser.getDependency("texture",T);L instanceof je&&(L.colorSpace=On,L.needsUpdate=!0),y[x]={value:L};continue}}switch(x){case"alphaMode":k==="BLEND"&&(b=!0);continue}}if(Array.isArray(k)&&k.length===4){y[x]={value:new fe(k[0],k[1],k[2],k[3])};continue}y[x]={value:k}}}}const _=new o1(this.identifier,{name:t.name??"",uniforms:y,vertexShader:f,fragmentShader:g,lights:!1});switch(_.glslVersion=vP,_.vertexShader=_.vertexShader.replace("#version 300 es",""),_.fragmentShader=_.fragmentShader.replace("#version 300 es",""),(h=y._Cull)==null?void 0:h.value){case 0:_.side=Pi;break;case 1:_.side=wd;break;case 2:_.side=fo;break;default:_.side=fo;break}switch((d=y._ZTest)==null?void 0:d.value){case 3:_.depthTest=!0,_.depthFunc=PP;break;case 6:_.depthTest=!0,_.depthFunc=CP;break;case 2:_.depthTest=!0,_.depthFunc=SP;break;case 4:_.depthTest=!0,_.depthFunc=xP;break;case 5:_.depthTest=!0,_.depthFunc=wP;break;case 7:_.depthTest=!0,_.depthFunc=_P;break;case 8:_.depthTest=!1,_.depthFunc=bP;break}_.transparent=b,b&&(_.depthWrite=!1),vR(y),_.onUpdateUniforms();for(const w in v){const x=w,k=v[w].type;if(((u=y[x])==null?void 0:u.value)===void 0)switch(k){case n1.SAMPLER_2D:y[x]={value:fR},console.warn("Missing/unassigned texture, fallback to white: "+x);break;default:x==="unity_OrthoParams"||console.warn("TODO: EXPECTED UNIFORM / fallback NOT SET: "+x,v[w]);break}}ln&&console.log(_.uuid,y),r1(_),l(_)}):null}}function r1(n){if(n.uniforms){ln&&console.log("Uniforms:",n.uniforms);for(const t in n.uniforms)switch(e(t,t),t){case"_Color":e("color",t);break}}function e(t,s){Object.getOwnPropertyDescriptor(n,t)||Object.defineProperty(n,t,{get:()=>n.uniforms[s].value,set:o=>{n.uniforms[s].value=o,n.needsUpdate=!0}})}}const RE=C("debugextensions");let Yu;const TE=import("./three-examples-DuVhxqft.min.js").then(n=>n.GLTFLoaderAnimationPointer).then(async n=>(Yu=n.GLTFAnimationPointerExtension,Yu)).catch(n=>{console.warn("Failed to import GLTFLoaderAnimationPointer. Please use @needle-tools/three for full KHR_animation support",n)}),Gr=new Array;function EE(n){Gr.includes(n)||Gr.push(n)}function AE(n){const e=Gr.indexOf(n);e>=0&&Gr.splice(e,1)}function y0(n){if(n instanceof Rn){const e=new Jx;return n.register(t=>(e.parser=t,e)),e}return null}class IE{resolvePath(e){return e.includes("/extensions/builtin_components/")?e.replace("/extensions/builtin_components/","/userData/components/"):e.includes("extensions/builtin_components/")?e.replace("extensions/builtin_components/","/userData/components/"):e}}async function Ku(n,e,t){const s=t.indexOf("?");s>=0&&(t=t.substring(0,s)),n.register(o=>new wE(o)),n.register(o=>new GM(o)),n.register(o=>new uR(o,e.lightmaps,t)),n.register(o=>new xE(o,t,e)),n.register(o=>new ME(o,t)),n.register(o=>new s1(o,t)),n.register(o=>new Xe(o,t)),n.register(o=>new yE(o)),B_()&&n.register(o=>new L_(o)),await TE.catch(o=>{}),n.register(o=>{if(Yu){const r=new Yu(o);return r.setAnimationPointerResolver.bind(r)(new IE),r}else return(RE||F())&&console.error("Missing KHR_animation_pointer extension..."),{name:"KHR_animation_pointer_NOT_AVAILABLE"}});for(const o of Gr)o.onImport&&o.onImport(n,t,e)}function v0(n,e){for(const t of Gr)t.onExport&&t.onExport(n,e)}function a1(n,e,t){for(const s of Gr)s.onLoaded&&s.onLoaded(n,e,t)}class l1{constructor(e){this.writer=e,this.name="EXT_mesh_gpu_instancing"}writeNode(e,t){if(e.constructor.name!=="InstancedMesh")return;const s=this.writer,o=s.extensionsUsed,r={};t.extensions=t.extensions||{},t.extensions[this.name]=r;let l=new se;const c=new Array,h=new Array,d=new Array;for(let f=0;f<e.count;f++){e.getMatrixAt(f,l);let y=new S,v=new V,b=new S;l.decompose(y,v,b),c.push(y.x,y.y,y.z),h.push(v.x,v.y,v.z,v.w),d.push(b.x,b.y,b.z)}const u=new Float32Array(c),p=new Float32Array(h),g=new Float32Array(d);r.attributes={TRANSLATION:s.processAccessor(new _t(u,3)),ROTATION:s.processAccessor(new _t(p,4)),SCALE:s.processAccessor(new _t(g,3))},o[this.name]=!0}}var LE=Object.defineProperty,c1=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&LE(e,t,o),o};const Gc=C("debugreflectionprobe"),h1=C("noreflectionprobe"),b0=Symbol("reflectionProbeKey"),d1=Symbol("original material");var rs;const _0=(rs=class extends I{constructor(){var n;super(),a(this,"_texture"),a(this,"center"),a(this,"size"),a(this,"_boxHelper"),rs._probes.has(this.context)||rs._probes.set(this.context,[]),(n=rs._probes.get(this.context))==null||n.push(this)}static isUsingReflectionProbe(n){var e;return!!(n[b0]||(e=n[d1])!=null&&e[b0])}static get(n,e,t,s){if(!n||n.isObject3D!==!0||h1)return null;const o=rs._probes.get(e);if(o){for(const r of o)if(r.__didAwake||r.__internalAwake(),r.activeAndEnabled){if(s){if(r.gameObject===s)return r}else if(r.isInBox(n))return Gc&&console.log("Found reflection probe",n.name,r.name),r}}return Gc&&console.debug("Did not find reflection probe",n.name,t,n),null}set texture(n){if(n&&!(n instanceof je)){console.error("ReflectionProbe.texture must be a Texture",n);return}this._texture=n,n&&(n.mapping=kn,n.colorSpace=On,n.needsUpdate=!0)}get texture(){return this._texture}isInBox(n){var e;return(e=this._boxHelper)==null?void 0:e.isInBox(n)}awake(){this._boxHelper=this.gameObject.addComponent(Bo),this._boxHelper.updateBox(!0),Gc&&this._boxHelper.showHelper(5592320,!0),this._texture&&(this._texture.mapping=kn,this._texture.colorSpace=On,this._texture.needsUpdate=!0)}start(){!this._texture&&F()&&(console.warn(`[ReflectionProbe] Missing texture. Please assign a custom cubemap texture. To use reflection probes assign them to your renderer's "anchor" property.`),be("ReflectionProbe configuration hint: See browser console for details"))}onDestroy(){const n=rs._probes.get(this.context);if(n){const e=n.indexOf(this);e>=0&&n.splice(e,1)}}onSet(n){var e;if(h1||!this.enabled||((e=n.sharedMaterials)==null?void 0:e.length)<=0||!this.texture)return;let t=rs._rendererMaterialsCache.get(n);t||(t=[],rs._rendererMaterialsCache.set(n,t));for(let s=0;s<n.sharedMaterials.length;s++){const o=n.sharedMaterials[s];if(!o||o.envMap===void 0||o instanceof Me)continue;let r=t[s];const l=o===r?.copy,c=!r||r.material.uuid!==o.uuid||r.copy.version!==o.version;if(!l&&c){if(Gc){let u="";r?r.material!==o?u="reference changed; cached instance?: "+l:r.copy.version!==o.version&&(u="version changed"):u="not cached",console.warn("Cloning material",o.name,o.version,"Reason:",u,`
|
|
967
|
+
`,o.uuid,`
|
|
968
|
+
`,r?.copy.uuid,`
|
|
969
|
+
`,n.name)}const d=o.clone();d.version=o.version,r?(r.copy=d,r.material=o):(r={material:o,copy:d},t.push(r)),d[b0]=this,d[d1]=o,Gc&&console.log("Set reflection",n.name,n.guid)}r&&r.copy&&(r.copy.onBeforeCompile=o.onBeforeCompile);const h=r?.copy;h.envMap=this.texture,n.sharedMaterials[s]=h}}onUnset(n){const e=rs._rendererMaterialsCache.get(n);if(e)for(let t=0;t<e.length;t++){const s=e[t];n.sharedMaterials[t]=s.material}}},a(rs,"_probes",new Map),a(rs,"_rendererMaterialsCache",new Map),rs);c1([m(S)],_0.prototype,"center"),c1([m(S)],_0.prototype,"size");let qc=_0;const pi=C("debuginstancing"),Zu=class wC{constructor(){a(this,"objs",[])}setup(e,t,s,o,r,l=0){e.applySettings(t);const c=this.tryCreateOrAddInstance(t,s,r);if(c){o===null&&(o=[]),o.push(c),Xe.assignTextureLOD(c.renderer.material,0);for(let h=0;h<e.sharedMeshes.length;h++){const d=e.sharedMeshes[h],u=d.geometry;Xe.assignMeshLOD(d,0).then(p=>{p&&e.activeAndEnabled&&u!=p&&c.setGeometry(p)})}}else if(l<=0&&t.type!=="Mesh"){const h=l+1;for(const d of t.children)o=this.setup(e,d,s,o,r,h)}return l===0&&r.useMatrixWorldAutoUpdate&&o&&o.length>=0&&this.autoUpdateInstanceMatrix(t),o}tryCreateOrAddInstance(e,t,s){if(e.type==="Mesh"){const o=s.foundMeshes;if(s.foundMeshes+=1,!s.rend.enableInstancing)return null;if(s.rend.enableInstancing!==!0){if(o>=s.rend.enableInstancing.length)return pi&&console.error("Something is wrong with instance setup",e,s.rend.enableInstancing,o),null;if(!s.rend.enableInstancing[o])return null}const r=e,l=r.material;for(const u of this.objs)if(!!u.canAdd(r.geometry,l))return u.addInstance(r);let c=wC.getStartInstanceCount(e);(!c||c<0)&&(c=4);let h=e.name;h!=null&&h.length||(h=hb());const d=new p1(h,r.geometry,l,c,t);return this.objs.push(d),d.addInstance(r)}return null}autoUpdateInstanceMatrix(e){const t=e.matrixWorld.multiplyMatrices.bind(e.matrixWorld),s=e.matrixWorld.clone(),o=(r,l)=>{const c=t(r,l);return(e[pc]||s.equals(c)===!1)&&(s.copy(c),e[pc]=!0),c};e.matrixWorld.multiplyMatrices=o}};a(Zu,"instance",new Zu),a(Zu,"getStartInstanceCount",n=>4);let Ju=Zu;const u1=class wm{constructor(e,t){a(this,"object"),a(this,"renderer"),a(this,"__instanceIndex",-1),a(this,"__reservedVertexRange",0),a(this,"__reservedIndexRange",0),a(this,"__geometryIndex",-1),a(this,"meshInformation"),this.__instanceIndex=-1,this.object=e,this.renderer=t,e[V_]=t,this.meshInformation=qr(e.geometry),wm.all.push(this)}get name(){return this.object.name}get isActive(){return this.__instanceIndex>=0}get vertexCount(){return this.object.geometry.attributes.position.count}get maxVertexCount(){return Math.max(this.meshInformation.vertexCount,this.vertexCount)}get reservedVertexCount(){return this.__reservedVertexRange}get indexCount(){return this.object.geometry.index?this.object.geometry.index.count:0}get maxIndexCount(){return Math.max(this.meshInformation.indexCount,this.indexCount)}get reservedIndexCount(){return this.__reservedIndexRange}updateMeshInformation(){const e=qr(this.object.geometry),t=this.meshInformation.vertexCount,s=this.meshInformation.indexCount;return Object.assign(this.meshInformation,e),t!==this.meshInformation.vertexCount||s!==this.meshInformation.indexCount}updateInstanceMatrix(e=!1,t=!0){this.__instanceIndex<0||(t&&this.object.updateWorldMatrix(!0,e),this.renderer.updateInstance(this.object.matrixWorld,this.__instanceIndex))}setMatrix(e){this.__instanceIndex<0||this.renderer.updateInstance(e,this.__instanceIndex)}setGeometry(e){if(this.__geometryIndex<0)return!1;const t=this;if(this.vertexCount>this.__reservedVertexRange)return s(`Instancing: Can not update geometry (${this.name}), reserved vertex range is too small: ${this.__reservedVertexRange.toLocaleString()} < ${this.vertexCount.toLocaleString()} vertices for ${this.name}`);if(this.indexCount>this.__reservedIndexRange)return s(`Instancing: Can not update geometry (${this.name}), reserved index range is too small: ${this.__reservedIndexRange.toLocaleString()} < ${this.indexCount.toLocaleString()} indices for ${this.name}`);return this.renderer.updateGeometry(e,this.__geometryIndex);function s(o){return t.updateMeshInformation()&&(t.renderer.remove(t,!0),t.renderer.add(t))?!0:((F()||pi)&&console.error(o),!1)}}add(){this.__instanceIndex>=0||(this.renderer.add(this),P.markAsInstancedRendered(this.object,!0))}remove(e){if(!(this.__instanceIndex<0)&&(this.renderer.remove(this,e),P.markAsInstancedRendered(this.object,!1),e)){const t=wm.all.indexOf(this);t>=0&&wm.all.splice(t,1)}}};a(u1,"all",[]);let w0=u1;class p1{constructor(e,t,s,o,r){a(this,"allowResize",!0),a(this,"name",""),a(this,"geometry"),a(this,"material"),a(this,"_context"),a(this,"_batchedMesh"),a(this,"_handles",[]),a(this,"_geometryIds",new Map),a(this,"_maxInstanceCount"),a(this,"_currentInstanceCount",0),a(this,"_currentVertexCount",0),a(this,"_currentIndexCount",0),a(this,"_maxVertexCount"),a(this,"_maxIndexCount"),a(this,"_needUpdateBounds",!1),a(this,"_debugMaterial",null),a(this,"onBeforeRender",()=>{this._batchedMesh.layers.enableAll(),this._needUpdateBounds&&this._batchedMesh[mc]===!0&&(pi==="verbose"&&console.log("Update instancing bounds",this.name,this._batchedMesh.matrixWorldNeedsUpdate),this.updateBounds())}),a(this,"onAfterRender",()=>{this._batchedMesh.layers.disableAll()}),this.name=e,this.geometry=t,this.material=s,this._context=r,this._maxInstanceCount=Math.max(2,o),pi&&(this._debugMaterial=m1());const l=this.tryEstimateVertexCountSize(this._maxInstanceCount,[t],o);this._maxVertexCount=l.vertexCount,this._maxIndexCount=l.indexCount,this._batchedMesh=new Fv(this._maxInstanceCount,this._maxVertexCount,this._maxIndexCount,this._debugMaterial??this.material),this._batchedMesh[mc]=!0,this._batchedMesh.visible=!0,this._context.scene.add(this._batchedMesh),s instanceof Bv&&(s.defines.USE_INSTANCING=!0,s.needsUpdate=!0),r.pre_render_callbacks.push(this.onBeforeRender),r.post_render_callbacks.push(this.onAfterRender),pi&&console.log(`Instanced renderer created with ${this._maxInstanceCount} instances, ${this._maxVertexCount} max vertices and ${this._maxIndexCount} max indices for "${e}"`)}get batchedMesh(){return this._batchedMesh}get visible(){return this._batchedMesh.visible}set visible(e){this._batchedMesh.visible=e}get castShadow(){return this._batchedMesh.castShadow}set castShadow(e){this._batchedMesh.castShadow=e}set receiveShadow(e){this._batchedMesh.receiveShadow=e}get count(){return this._currentInstanceCount}updateBounds(e=!0,t=!0){if(this._needUpdateBounds=!1,e&&this._batchedMesh.computeBoundingBox(),t&&this._batchedMesh.computeBoundingSphere(),pi&&this._batchedMesh.boundingSphere){const s=this._batchedMesh.boundingSphere;$.DrawWireSphere(s.center,s.radius,65280)}}canAdd(e,t){return this._maxVertexCount>1e7||t!==this.material||!this.validateGeometry(e)?!1:!!(!this.mustGrow(e)||this.allowResize)}dispose(){pi&&console.warn("Dispose instanced renderer",this.name),this._context.scene.remove(this._batchedMesh),this._batchedMesh.dispose(),this._batchedMesh=null,this._handles=[]}addInstance(e){const t=new w0(e,this);e.castShadow===!0&&this._batchedMesh.castShadow===!1&&(this._batchedMesh.castShadow=!0),e.receiveShadow===!0&&this._batchedMesh.receiveShadow===!1&&(this._batchedMesh.receiveShadow=!0);try{this.add(t)}catch(s){if(console.error(`Failed adding mesh to instancing (object name: "${e.name}", instances: ${this._currentInstanceCount.toLocaleString()}/${this._maxInstanceCount.toLocaleString()}, vertices: ${this._currentVertexCount.toLocaleString()}/${this._maxVertexCount.toLocaleString()}, indices: ${this._currentIndexCount.toLocaleString()}/${this._maxIndexCount.toLocaleString()})
|
|
970
|
+
`,s),F()){tc("Failed instancing mesh. See the browser console for details.");debugger}return null}return t}add(e){const t=e.object.geometry;if(!t||!t.attributes)return console.error("Cannot add object to instancing without geometry",e.name),!1;if(this.mustGrow(t))if(this.allowResize)this.grow(t);else return console.error("Cannot add instance, max count reached",this.name,this.count,this._maxInstanceCount),!1;return e.object.updateWorldMatrix(!0,!0),this.addGeometry(e),this._handles[e.__instanceIndex]=e,this._currentInstanceCount+=1,this.markNeedsUpdate(),this._currentInstanceCount>0&&(this._batchedMesh.visible=!0),!0}remove(e,t){e&&(e.__instanceIndex<0||this._handles[e.__instanceIndex]!=e||this._currentInstanceCount<=0||(this.removeGeometry(e,t),this._handles[e.__instanceIndex]=null,e.__instanceIndex=-1,this._currentInstanceCount>0&&(this._currentInstanceCount-=1),this._currentInstanceCount<=0&&(this._batchedMesh.visible=!1),this.markNeedsUpdate()))}updateInstance(e,t){this._batchedMesh.setMatrixAt(t,e),this.markNeedsUpdate()}updateGeometry(e,t){return this.validateGeometry(e)?(this.mustGrow()&&this.grow(e),pi&&console.debug("[Instancing] UPDATE GEOMETRY at "+t,this._batchedMesh._geometryCount,e.name,qr(e),e.attributes.position.count,e.index?e.index.count:0),this._batchedMesh.setGeometryAt(t,e),this._geometryIds.set(e,t),this.markNeedsUpdate(),!0):!1}validateGeometry(e){const t=this.geometry;for(const s in t.attributes)if(s!=="batchId"&&!e.hasAttribute(s))return F()&&console.warn(`BatchedMesh: Added geometry missing "${s}". All geometries must have consistent attributes.`),!1;return!0}markNeedsUpdate(){pi==="verbose"&&console.warn("Marking instanced mesh dirty",this.name),this._needUpdateBounds=!0}mustGrow(e){if(this.count>=this._maxInstanceCount)return!0;if(!e||!e.attributes)return!1;const t=qr(e),s=t.vertexCount,o=t.indexCount;return this._currentVertexCount+s>this._maxVertexCount||this._currentIndexCount+o>this._maxIndexCount}grow(e){var t,s;const o=Math.ceil(this._maxInstanceCount*2),r=this.tryEstimateVertexCountSize(o,[e]),l=Math.max(this._maxVertexCount,r.vertexCount),c=Math.max(this._maxIndexCount,r.indexCount,Math.ceil(this._maxVertexCount*2));if(pi){const u=qr(e);console.warn(`[Instancing] Growing Buffer
|
|
971
|
+
Mesh: "${this.name}${(t=e.name)!=null&&t.length?"/"+e.name:""}"
|
|
972
|
+
${u.vertexCount} vertices, ${u.indexCount} indices
|
|
973
|
+
Max count ${this._maxInstanceCount} \u2192 ${o}
|
|
974
|
+
Max vertex count ${this._maxVertexCount} -> ${l}
|
|
975
|
+
Max index count ${this._maxIndexCount} -> ${c}`),this._debugMaterial=m1()}else F()&&console.debug(`[Instancing] Growing Buffer
|
|
976
|
+
Mesh: "${this.name}${(s=e.name)!=null&&s.length?"/"+e.name:""}"
|
|
977
|
+
Max count ${this._maxInstanceCount} \u2192 ${o}
|
|
978
|
+
Max vertex count ${this._maxVertexCount} -> ${l}
|
|
979
|
+
Max index count ${this._maxIndexCount} -> ${c}`);this._maxVertexCount=l,this._maxIndexCount=c;const h=new Fv(o,this._maxVertexCount,this._maxIndexCount,this._debugMaterial??this.material);h.layers=this._batchedMesh.layers,h.castShadow=this._batchedMesh.castShadow,h.receiveShadow=this._batchedMesh.receiveShadow,h.visible=this._batchedMesh.visible,h[mc]=this._batchedMesh[mc],h.matrixAutoUpdate=this._batchedMesh.matrixAutoUpdate,h.matrixWorldNeedsUpdate=this._batchedMesh.matrixWorldNeedsUpdate,h.matrixAutoUpdate=this._batchedMesh.matrixAutoUpdate,h.matrixWorld.copy(this._batchedMesh.matrixWorld),h.matrix.copy(this._batchedMesh.matrix),this._batchedMesh.dispose(),this._batchedMesh.removeFromParent(),this._geometryIds.clear(),this._batchedMesh=h,this._maxInstanceCount=o;const d=[...this._handles];this._handles=[];for(const u of d)u&&u.__instanceIndex>=0&&(this.addGeometry(u),this._handles[u.__instanceIndex]=u);this._context.scene.add(h)}tryEstimateVertexCountSize(e,t,s=1){const o=new Map;for(const d of this._handles)if(d&&d.__instanceIndex>=0&&d.object.geometry)if(o.has(d.object.geometry)){const u=o.get(d.object.geometry);u.count+=1}else{const u={count:1,...qr(d.object.geometry)};o.set(d.object.geometry,u)}let r=0,l=0;for(const[d,u]of o)r+=u.vertexCount*u.count,l+=u.indexCount*u.count;let c=Math.ceil(r/Math.max(1,this._currentInstanceCount))*e,h=Math.ceil(l/Math.max(1,this._currentInstanceCount))*e*2;if(t)for(const d of t){const u=qr(d);u!=null&&(c+=u.vertexCount*s,h+=u.indexCount*s)}return{vertexCount:c,indexCount:h}}addGeometry(e){const t=e.object.geometry;if(!t)return;let s=this._geometryIds.get(t);s==null?(pi&&console.debug(`[Instancing] > ADD NEW GEOMETRY "${e.name} (${t.name}; ${t.uuid})"
|
|
980
|
+
${this._currentInstanceCount} instances, ${e.maxVertexCount} max vertices, ${e.maxIndexCount} max indices`),s=this._batchedMesh.addGeometry(t,e.maxVertexCount,e.maxIndexCount),this._geometryIds.set(t,s)):pi==="verbose"&&console.log(`[Instancing] > ADD INSTANCE "${e.name}"
|
|
981
|
+
GEOMETRY_ID=${s}
|
|
982
|
+
${this._currentInstanceCount} instances`),this._currentVertexCount+=e.maxVertexCount,this._currentIndexCount+=e.maxIndexCount;const o=this._batchedMesh.addInstance(s);e.__geometryIndex=s,e.__instanceIndex=o,e.__reservedVertexRange=e.maxVertexCount,e.__reservedIndexRange=e.maxIndexCount,this._batchedMesh.setMatrixAt(o,e.object.matrixWorld),pi&&console.debug(`[Instancing] > ADDED INSTANCE "${e.name}"
|
|
983
|
+
GEOMETRY_ID=${s}
|
|
984
|
+
${this._currentInstanceCount} instances
|
|
985
|
+
Index: ${e.__instanceIndex}`)}removeGeometry(e,t){if(e.__instanceIndex<0){console.warn("Cannot remove geometry, instance index is invalid",e.name);return}pi&&console.debug(`[Instancing] < REMOVE INSTANCE "${e.name}" at [${e.__instanceIndex}]
|
|
986
|
+
GEOMETRY_ID=${e.__geometryIndex}
|
|
987
|
+
${this._currentInstanceCount} instances
|
|
988
|
+
Index: ${e.__instanceIndex}`),this._batchedMesh.deleteInstance(e.__instanceIndex)}}a(p1,"nullMatrix",new se);function qr(n){var e,t;if(!n)return F()&&console.error("Cannot get mesh information from null geometry"),{vertexCount:0,indexCount:0};let s=((t=(e=n.attributes)==null?void 0:e.position)==null?void 0:t.count)||0,o=n.index?n.index.count:0;const r=Xe.getMeshLODInformation(n);if(r){const l=r.lods[0];let c=l.vertexCount,h=l.indexCount;const d=Math.min(200,Math.ceil(c*.05));c+=d,h+=20,s=Math.max(s,c),o=Math.max(o,h)}return s=Math.ceil(s),o=Math.ceil(o),{vertexCount:s,indexCount:o}}function m1(){const n=new bt({color:new oe(Math.random(),Math.random(),Math.random())});return n.emissive=n.color,n.emissiveIntensity=.3,C("wireframe")&&(n.wireframe=!0),n}const ol=C("debuglightmaps");class ep{constructor(e,t){a(this,"lightmapIndex",-1),a(this,"lightmapScaleOffset",new fe(1,1,0,0)),a(this,"context"),a(this,"gameObject"),a(this,"lightmapTexture",null),a(this,"lightmapScaleOffsetUniform",{value:new fe(1,1,0,0)}),a(this,"lightmapUniform",{value:null}),a(this,"onBeforeCompile",(s,o)=>{ol&&console.log(`Lightmaps, before compile
|
|
989
|
+
`,s),this.lightmapScaleOffsetUniform.value=this.lightmapScaleOffset,this.lightmapUniform.value=this.lightmapTexture,s.uniforms.lightmapScaleOffset=this.lightmapScaleOffsetUniform}),this.gameObject=e,this.context=t}get lightmap(){return this.lightmapTexture}set lightmap(e){e!==this.lightmapTexture&&(this.lightmapTexture=e,this.applyLightmap(),this.lightmapTexture&&Xe.assignTextureLOD(this.lightmapTexture,0).then(t=>{t!=null&&t.isTexture&&(this.lightmapTexture=t)}))}init(e,t,s){console.assert(this.gameObject!==void 0&&this.gameObject!==null,"Missing gameobject",this),this.lightmapIndex=e,!(this.lightmapIndex<0)&&(this.lightmapScaleOffset=t,this.lightmapTexture=s,Xe.assignTextureLOD(s,0).then(o=>{o!=null&&o.isTexture&&(this.lightmapTexture=o)}),ol=="show"?(console.log("Lightmap:",this.gameObject.name,e,`
|
|
990
|
+
ScaleOffset:`,t,`
|
|
991
|
+
Texture:`,s),this.setLightmapDebugMaterial()):ol&&console.log("Use debuglightmaps=show to render lightmaps only in the scene."),this.applyLightmap())}updateLightmapUniforms(e){const t=e.uniforms;t&&t.lightmap&&(this.lightmapScaleOffsetUniform.value=this.lightmapScaleOffset,t.lightmapScaleOffset=this.lightmapScaleOffsetUniform)}applyLightmap(){if(this.gameObject.type==="Object3D"){ol&&console.warn("Can not add lightmap. Is this object missing a renderer?",this.gameObject.name);return}if(this.gameObject.type==="Group"){this.gameObject["Needle:Multimaterial-LightmapWarning"]===void 0&&(this.gameObject["Needle:Multimaterial-LightmapWarning"]=!0,console.warn("Lightmap on multimaterial object is not supported yet... please open a feature request on https://github.com/needle-tools/needle-engine-support if your project requires it"));return}console.assert(this.gameObject.type==="Mesh","Lightmap only works on meshes",this);const e=this.gameObject;if(e.geometry.getAttribute("uv1")||e.geometry.setAttribute("uv1",e.geometry.getAttribute("uv")),Array.isArray(this.gameObject.material)){const t=this.gameObject.material;for(let s=0;s<t.length;s++)t[s]=this.ensureLightmapMaterial(t[s])}else this.gameObject.material=this.ensureLightmapMaterial(this.gameObject.material);if(this.lightmapIndex>=0&&this.lightmapTexture){this.lightmapTexture.channel=1;const t=this.gameObject.material;if(Array.isArray(t))for(const s of t)this.assignLightmapTexture(s);else t&&this.assignLightmapTexture(t)}}ensureLightmapMaterial(e){return e.userData||(e.userData={}),e["NEEDLE:lightmap-material-version"]!=e.version&&e["NEEDLE:lightmap-material-version"]==null&&(ol&&console.warn("Cloning material for lightmap "+e.name),e=e.clone(),e.onBeforeCompile=this.onBeforeCompile),e}assignLightmapTexture(e){!e||e instanceof Bm&&e.transmission>0||!(e.lightMap!==this.lightmapTexture||e["NEEDLE:lightmap-material-version"]!==e.version)||(ol&&console.log("Assigning lightmap",e.name,e.version),e.lightMap=this.lightmapTexture,e["NEEDLE:lightmap-material-version"]=e.version)}setLightmapDebugMaterial(){this.gameObject.material=new Ws({vertexShader:`
|
|
992
|
+
varying vec2 vUv1;
|
|
993
|
+
void main()
|
|
994
|
+
{
|
|
995
|
+
vUv1 = uv1;
|
|
996
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
|
|
997
|
+
}
|
|
998
|
+
`,fragmentShader:`
|
|
999
|
+
uniform sampler2D lightMap;
|
|
1000
|
+
uniform float lightMapIntensity;
|
|
1001
|
+
uniform vec4 lightmapScaleOffset;
|
|
1002
|
+
varying vec2 vUv1;
|
|
1003
|
+
|
|
1004
|
+
// took from threejs 05fc79cd52b79e8c3e8dec1e7dca72c5c39983a4
|
|
1005
|
+
vec4 conv_sRGBToLinear( in vec4 value ) {
|
|
1006
|
+
return vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );
|
|
1007
|
+
}
|
|
1008
|
+
|
|
1009
|
+
void main() {
|
|
1010
|
+
vec2 lUv = vUv1.xy * lightmapScaleOffset.xy + vec2(lightmapScaleOffset.z, (1. - (lightmapScaleOffset.y + lightmapScaleOffset.w)));
|
|
1011
|
+
|
|
1012
|
+
vec4 lightMapTexel = texture2D( lightMap, lUv);
|
|
1013
|
+
gl_FragColor = lightMapTexel;
|
|
1014
|
+
gl_FragColor.a = 1.;
|
|
1015
|
+
}
|
|
1016
|
+
`,defines:{USE_LIGHTMAP:""}})}}var jE=Object.defineProperty,Xn=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&jE(e,t,o),o};const Xc=C("debugrenderer"),g1=C("debugskinnedmesh"),f1=C("noinstancing"),DE=C("wireframe");class y1{constructor(){a(this,"path",null),a(this,"asset",null),a(this,"default")}}class BE{constructor(e,t){a(this,"_renderer"),a(this,"_targets",[]),a(this,"_indexMapMaxIndex"),a(this,"_indexMap"),a(this,"_changed",!1),this._renderer=e;const s=this.setMaterial.bind(this),o=this.getMaterial.bind(this),r=e.gameObject;if(this._targets=[],r)switch(r.type){case"Group":this._targets=[...r.children];break;case"SkinnedMesh":case"Mesh":this._targets.push(r);break}let l=!1,c,h=0;for(let d=0;d<this._targets.length;d++){const u=this._targets[d];if(!u)continue;const p=u.material;if(p){p.shadowSide=p.side;for(let g=0;g<t.length;g++){const f=t[g];if(!f){l=!0;continue}if(p.name===f.name){c===void 0&&(c=new Map),c.set(g,d),h=Math.max(h,g);break}}}}if(l){this._indexMapMaxIndex=h,this._indexMap=c;const d=`Renderer ${e.name} was initialized with missing materials - this may lead to unexpected behaviour when trying to access sharedMaterials by index.`;console.warn(d),Xt()&&be("Found renderer with missing materials: please check the console for details.")}return new Proxy(this,{get(d,u){if(typeof u=="string"){const p=parseInt(u);if(!isNaN(p))return o(p)}return d[u]},set(d,u,p){return typeof u=="string"&&s(p,Number.parseInt(u)),Reflect.set(d,u,p)?(p instanceof Pe&&(d.changed=!0),!0):!1}})}get changed(){return this._changed}set changed(e){e===!0&&Xc&&console.warn("SharedMaterials have changed: "+this._renderer.name,this),this._changed=e}is(e){return this._renderer===e}get length(){return this._indexMapMaxIndex!==void 0?this._indexMapMaxIndex+1:this._targets.length}*[Symbol.iterator](){for(let e=0;e<this.length;e++)yield this.getMaterial(e)}resolveIndex(e){const t=this._indexMap;return t&&t.has(e)?t.get(e):e}setMaterial(e,t){if(t=this.resolveIndex(t),t<0||t>=this._targets.length)return;const s=this._targets[t];!s||s.material===void 0||(s.material=e,this.changed=!0)}getMaterial(e){if(e=this.resolveIndex(e),e<0)return null;const t=this._targets;if(e>=t.length)return null;const s=t[e];return s?s.material:null}}const hn=class xm extends I{constructor(){super(...arguments),a(this,"receiveShadows",!1),a(this,"shadowCastingMode",0),a(this,"lightmapIndex",-1),a(this,"lightmapScaleOffset",new fe(1,1,0,0)),a(this,"enableInstancing"),a(this,"renderOrder"),a(this,"allowOcclusionWhenDynamic",!0),a(this,"probeAnchor"),a(this,"reflectionProbeUsage",0),a(this,"_lightmaps"),a(this,"_sharedMeshes",[]),a(this,"_sharedMaterials"),a(this,"_originalMaterials"),a(this,"_probeAnchorLastFrame"),a(this,"_lightmapTextureOverride"),a(this,"allowProgressiveLoading",!0),a(this,"_firstFrame",-1),a(this,"_isInstancingEnabled",!1),a(this,"_handles"),a(this,"_handlesTempArray",[]),a(this,"onBeforeRenderThree",(e,t,s,o,r,l)=>{var c;if(r.envMapIntensity!==void 0){const h=this.hasLightmap?Math.PI:1,d=((c=this.context.mainCameraComponent)==null?void 0:c.environmentIntensity)??1;r.envMapIntensity=Math.max(0,d*this.context.sceneLighting.environmentIntensity/h)}if(this._lightmaps)for(const h of this._lightmaps)h.updateLightmapUniforms(r),h.applyLightmap()}),a(this,"_reflectionProbe",null)}static setInstanced(e,t){const s=vc(e,xm);return s.setInstancingEnabled(t),s}static isInstanced(e){const t=Rr(e,xm);return t?t.isInstancingActive:ms.isUsingInstancing(e)}static setVisible(e,t){Bn(e,t)}get sharedMesh(){if(this.gameObject.type==="Mesh")return this.gameObject;if(this.gameObject.type==="SkinnesMesh")return this.gameObject;if(this.gameObject.type==="Group")return this.gameObject.children[0]}get sharedMeshes(){if(this.destroyed||!this.gameObject)return this._sharedMeshes;if(this._sharedMeshes.length=0,this.gameObject.type==="Group")for(const e of this.gameObject.children)(e.type==="Mesh"||e.type==="SkinnedMesh")&&this._sharedMeshes.push(e);else(this.gameObject.type==="Mesh"||this.gameObject.type==="SkinnedMesh")&&this._sharedMeshes.push(this.gameObject);return this._sharedMeshes}get sharedMaterial(){return this.sharedMaterials[0]}set sharedMaterial(e){this.sharedMaterials[0]!==e&&(this.sharedMaterials[0]=e,this.applyLightmapping())}get material(){return this.sharedMaterials[0]}set material(e){this.sharedMaterial=e}set sharedMaterials(e){if(!this._originalMaterials)this._originalMaterials=e;else if(e){let t=!1;for(let s=0;s<this._sharedMaterials.length;s++){const o=s<e.length?e[s]:null;o&&o instanceof Pe?this.sharedMaterials[s]=o:t||(t=!0,console.warn("Can not assign null as material: "+this.name,o))}}}get sharedMaterials(){return(!this._sharedMaterials||!this._sharedMaterials.is(this))&&(this._originalMaterials||(this._originalMaterials=[]),this._sharedMaterials=new BE(this,this._originalMaterials)),this._sharedMaterials}static get shouldSuppressInstancing(){return f1}get lightmap(){var e;return(e=this._lightmaps)!=null&&e.length?this._lightmaps[0].lightmap:null}set lightmap(e){var t;if(this._lightmapTextureOverride=e,e===void 0&&(e=this.context.lightmaps.tryGetLightmap(this.sourceId,this.lightmapIndex)),(t=this._lightmaps)!=null&&t.length)for(const s of this._lightmaps)s.lightmap=e}get hasLightmap(){return this.lightmap!=null}registering(){this.enabled||this.setVisibility(!1)}awake(){if(this._firstFrame=this.context.time.frame,Xc&&console.log("Renderer ",this.name,this),this.clearInstancingState(),this.probeAnchor&&Xc&&this.probeAnchor.add(new Ci(.2)),this._reflectionProbe=null,this.isMultiMaterialObject(this.gameObject)){for(const e of this.gameObject.children)this.context.addBeforeRenderListener(e,this.onBeforeRenderThree),e.layers.mask=this.gameObject.layers.mask;if(this.renderOrder!==void 0){let e=0;for(let t=0;t<this.gameObject.children.length;t++){const s=this.gameObject.children[t];if(!(!this.isMeshOrSkinnedMesh(s)||P.getComponent(s,xm))){if(this.renderOrder.length<=e){console.warn("Incorrect renderOrder element count",this,this.renderOrder.length+" but expected "+this.gameObject.children.length,"Index: "+e,"ChildElement:",s);continue}s.renderOrder=this.renderOrder[e],e+=1}}}}else this.isMeshOrSkinnedMesh(this.gameObject)?(this.context.addBeforeRenderListener(this.gameObject,this.onBeforeRenderThree),this.renderOrder!==void 0&&this.renderOrder.length>0&&(this.gameObject.renderOrder=this.renderOrder[0])):this.context.addBeforeRenderListener(this.gameObject,this.onBeforeRenderThree);if(this.applyLightmapping(),DE)for(let e=0;e<this.sharedMaterials.length;e++){const t=this.sharedMaterials[e];t&&(t.wireframe=!0)}}applyLightmapping(){var e;if(this.lightmapIndex>=0){const t=this.gameObject.type,s=this._lightmapTextureOverride!==void 0?this._lightmapTextureOverride:this.context.lightmaps.tryGetLightmap(this.sourceId,this.lightmapIndex);if(s){if(this._lightmaps||(this._lightmaps=[]),t==="Mesh"){const o=this.gameObject.material;if(o!=null&&o.isMeshBasicMaterial)o&&console.warn("Lightmapping is not supported on MeshBasicMaterial",o.name);else{if(this._lightmaps.length<=0){const r=new ep(this.gameObject,this.context);this._lightmaps.push(r)}this._lightmaps[0].init(this.lightmapIndex,this.lightmapScaleOffset,s)}}else if(this.isMultiMaterialObject(this.gameObject)&&this.sharedMaterials.length>0)for(let o=0;o<this.gameObject.children.length;o++){const r=this.gameObject.children[o];if(!((e=r.material)!=null&&e.isMeshBasicMaterial)){let l;o>=this._lightmaps.length?(l=new ep(r,this.context),this._lightmaps.push(l)):l=this._lightmaps[o],l.init(this.lightmapIndex,this.lightmapScaleOffset,s)}}}else Xc&&console.warn("Lightmap not found",this.sourceId,this.lightmapIndex)}}get isInstancingActive(){return this._handles!=null&&this._handles.length>0&&this._isInstancingEnabled}get instances(){if(!this._handles||this._handles.length<=0)return null;if(this._handlesTempArray.length=0,this._handles)for(const e of this._handles)this._handlesTempArray.push(e);return this._handlesTempArray}setInstancingEnabled(e){if(this._isInstancingEnabled===e)return e&&(this._handles===void 0||this._handles!=null&&this._handles.length>0);if(this._isInstancingEnabled=e,e){if(this.enableInstancing===void 0&&(this.enableInstancing=!0),this._handles===void 0){if(this._handles=Ju.instance.setup(this,this.gameObject,this.context,null,{rend:this,foundMeshes:0,useMatrixWorldAutoUpdate:this.useInstanceMatrixWorldAutoUpdate()}),this._handles)return P.markAsInstancedRendered(this.gameObject,!0),!0}else if(this._handles!==null){for(const t of this._handles)t.updateInstanceMatrix(!0),t.add();return P.markAsInstancedRendered(this.gameObject,!0),!0}}else{if(this._handles)for(const t of this._handles)t.remove(this.destroyed);return!0}return!1}clearInstancingState(){this._isInstancingEnabled=!1,this._handles=void 0}useInstanceMatrixWorldAutoUpdate(){return!0}start(){if(this.enableInstancing&&!f1&&(this.setInstancingEnabled(!0),ms.markDirty(this.gameObject)),this.gameObject.frustumCulled=this.allowOcclusionWhenDynamic,this.isMultiMaterialObject(this.gameObject))for(let e=0;e<this.gameObject.children.length;e++){const t=this.gameObject.children[e];t.frustumCulled=this.allowOcclusionWhenDynamic}}onEnable(){this.sharedMeshes,this.setVisibility(!0),this._isInstancingEnabled||this.enableInstancing==!0||Array.isArray(this.enableInstancing)&&this.enableInstancing.some(e=>e)?this.__internalDidAwakeAndStart&&this.setInstancingEnabled(!0):this.enabled&&this.applyStencil(),this.updateReflectionProbe()}onDisable(){this.setVisibility(!1),this._handles&&this._handles.length>0&&this.setInstancingEnabled(!1)}onDestroy(){if(this._handles=null,this.isMultiMaterialObject(this.gameObject))for(const e of this.gameObject.children)this.context.removeBeforeRenderListener(e,this.onBeforeRenderThree);else this.context.removeBeforeRenderListener(this.gameObject,this.onBeforeRenderThree)}onBeforeRender(){var e,t,s;if(this.gameObject){if(this._probeAnchorLastFrame!==this.probeAnchor&&((e=this._reflectionProbe)==null||e.onUnset(this),this.updateReflectionProbe()),Xc==this.name&&this.gameObject instanceof G){this.gameObject.geometry.computeBoundingSphere();const o=q(this.gameObject.geometry.boundingSphere.center).applyMatrix4(this.gameObject.matrixWorld);$.DrawWireSphere(o,this.gameObject.geometry.boundingSphere.radius,56831)}if(this.isMultiMaterialObject(this.gameObject)&&((t=this.gameObject.children)==null?void 0:t.length)>0)for(const o of this.gameObject.children)this.applySettings(o);else this.applySettings(this.gameObject);if(this.sharedMaterials.changed&&(this.sharedMaterials.changed=!1,this.applyLightmapping()),(s=this._handles)!=null&&s.length&&this.gameObject[pc]===!0){this.gameObject[pc]=!1;for(let o=this._handles.length-1;o>=0;o--)this._handles[o].updateInstanceMatrix();this.gameObject.matrixWorldNeedsUpdate=!1}if(this._handles&&this._handles.length<=0&&P.markAsInstancedRendered(this.gameObject,!1),this._isInstancingEnabled&&this._handles)for(let o=0;o<this._handles.length;o++){const r=this._handles[o];Bn(r.object,!1)}this.reflectionProbeUsage!==0&&this._reflectionProbe&&this._reflectionProbe.onSet(this);for(const o of this._sharedMaterials)o&&"envMap"in o&&"envMapIntensity"in o&&!qc.isUsingReflectionProbe(o)&&(o.envMap=this.context.scene.environment)}}onAfterRender(){if(this._isInstancingEnabled&&this._handles)for(let e=0;e<this._handles.length;e++){const t=this._handles[e];Bn(t.object,!0)}this.reflectionProbeUsage!==0&&this._reflectionProbe&&this._reflectionProbe.onUnset(this),this.static&&this.gameObject.matrixAutoUpdate&&(this.gameObject.matrixAutoUpdate=!1)}applyStencil(){s1.applyStencil(this)}applySettings(e){e.receiveShadow=this.receiveShadows,this.shadowCastingMode==1?e.castShadow=!0:e.castShadow=!1}updateReflectionProbe(){this._reflectionProbe=null,this.reflectionProbeUsage!==0&&(this.startCoroutine(this._updateReflectionProbe(),Oe.LateUpdate),this._probeAnchorLastFrame=this.probeAnchor)}*_updateReflectionProbe(){const e=this.probeAnchor||this.gameObject,t=!!this.probeAnchor;this._reflectionProbe=qc.get(e,this.context,t,this.probeAnchor)}setVisibility(e){if(!this.isMultiMaterialObject(this.gameObject))Bn(this.gameObject,e);else for(const t of this.gameObject.children)this.isMeshOrSkinnedMesh(t)&&Bn(t,e)}isMultiMaterialObject(e){return e.type==="Group"}isMeshOrSkinnedMesh(e){return e.type==="Mesh"||e.type==="SkinnedMesh"}};Xn([m()],hn.prototype,"receiveShadows"),Xn([m()],hn.prototype,"shadowCastingMode"),Xn([m()],hn.prototype,"lightmapIndex"),Xn([m(fe)],hn.prototype,"lightmapScaleOffset"),Xn([m()],hn.prototype,"enableInstancing"),Xn([m()],hn.prototype,"renderOrder"),Xn([m()],hn.prototype,"allowOcclusionWhenDynamic"),Xn([m(E)],hn.prototype,"probeAnchor"),Xn([m()],hn.prototype,"reflectionProbeUsage");let Ui=hn;class Qc extends Ui{}class x0 extends Qc{constructor(){super(...arguments),a(this,"_needUpdateBoundingSphere",!1)}awake(){var e;super.awake(),g1&&console.log('SkinnedMeshRenderer for "'+this.name+'"',this),this.allowOcclusionWhenDynamic=!1;for(const t of this.sharedMeshes)(e=t.parent)==null||e.updateWorldMatrix(!1,!0),this.markBoundsDirty()}onAfterRender(){if(super.onAfterRender(),this._needUpdateBoundingSphere){for(const e of this.sharedMeshes)if(e instanceof Pn){this._needUpdateBoundingSphere=!1;try{const t=e.geometry,s=Wv(e);s&&(e.geometry=s),e.computeBoundingSphere(),e.geometry=t}catch(t){console.error(`Error updating bounding sphere for ${e.name}`,t)}}}if(g1){for(const e of this.sharedMeshes)if(e instanceof Pn&&e.boundingSphere){const t=q(e.boundingSphere.center).applyMatrix4(e.matrixWorld);$.DrawWireSphere(t,e.boundingSphere.radius,"red")}}}markBoundsDirty(){this._needUpdateBoundingSphere=!0}}var FE=Object.defineProperty,v1=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&FE(e,t,o),o};const tp=C("debuggltfexport");class S0 extends Bo{constructor(){super(...arguments),a(this,"sceneRoot")}}const C0=class Fl extends I{constructor(){super(...arguments),a(this,"binary",!0),a(this,"objects",[]),a(this,"ext")}async exportNow(e,t){tp&&console.log("Exporting objects as glTF",this.objects),e||(e="scene"),(!this.objects||this.objects.length<=0)&&(this.objects=[this.context.scene]);const s={binary:this.binary,pivot:Fl.calculateCenter(this.objects),...t},o=await this.export(this.objects,s).catch(r=>(console.error(r),!1));return o===!1?!1:(this.binary?e.endsWith(".glb")||(e+=".glb"):e.endsWith(".gltf")||(e+=".gltf"),this.binary?Fl.saveArrayBuffer(o,e):Fl.saveJson(o,e),!0)}async export(e,t){if(!e||e.length<=0){console.warn("No objects set to export");return}const s=new Hv;s.register(d=>new l1(d)),s.register(d=>new Kx(d)),v0(s,this.context),Fl.filterTopmostParent(e);const o={trs:!1,onlyVisible:!0,truncateDrawRange:!1,binary:!0,maxTextureSize:1/0,embedImages:!0,includeCustomExtensions:!0,animations:t?.animations||Fl.collectAnimations(e),...t},r=new Array,l=new E;t!=null&&t.pivot&&l.position.sub(t.pivot),tp&&console.log("EXPORT",e),e.forEach(d=>{d&&p0(d)&&(l.children.push(d),d.matrixAutoUpdate=!1,d.matrix.copy(d.matrixWorld),P.getComponentsInChildren(d,Ui).forEach(u=>{P.isActiveInHierarchy(u.gameObject)&&u.setInstancingEnabled(!1)}),d.traverse(u=>{if(!p0(u)){const p=u.parent;u.removeFromParent(),r.push(()=>{p&&p.add(u)})}}))});const c=new df(l);return t!=null&&t.needleComponents&&(this.ext=new Jx),this.ext&&(this.ext.registerExport(s),this.ext.context=c),new Promise((d,u)=>{tp&&console.log("Starting glTF export.");try{s?.parse(l,p=>{h(),d(p)},p=>{h(),u(p)},o)}catch(p){console.error(p),u(p)}finally{r.forEach(p=>p()),tp&&console.log("Finished glTF export.")}});function h(){e.forEach(d=>{d&&(d.matrixAutoUpdate=!0,P.getComponentsInChildren(d,Ui).forEach(u=>{P.isActiveInHierarchy(u.gameObject)&&u.setInstancingEnabled(!1)}))})}}static saveArrayBuffer(e,t){this.save(new Blob([e],{type:"application/octet-stream"}),t)}static saveJson(e,t){this.save("data: text/json;charset=utf-8,"+encodeURIComponent(JSON.stringify(e)),t)}static save(e,t){const s=document.createElement("a");s.style.display="none",document.body.appendChild(s),typeof e=="string"?s.href=e:s.href=URL.createObjectURL(e),s.download=t,s.click(),s.remove()}static collectAnimations(e,t){t=t||[];for(const s of e)s&&s.traverseVisible(o=>{o.animations&&o.animations.length>0&&t.push(...o.animations)});return t}static calculateCenter(e,t){const s=t||new S;return s.set(0,0,0),e.forEach(o=>{s.add(ee(o))}),s.divideScalar(e.length),s}static filterTopmostParent(e){if(!(e.length<=0))for(let t=0;t<e.length;t++){let s=e[t];if(!s){e.splice(t,1),t--;continue}for(;s.parent;){if(e.includes(s.parent)){e.splice(t,1),t--;break}s=s.parent}}}};v1([m()],C0.prototype,"binary"),v1([m(E)],C0.prototype,"objects");let P0=C0;typeof globalThis!==void 0&&!("OffscreenCanvas"in globalThis)&&(globalThis.OffscreenCanvas=class{constructor(n,e){return a(this,"canvas"),this.canvas=document.createElement("canvas"),this.canvas.width=n,this.canvas.height=e,this.canvas.convertToBlob=(t,s)=>new Promise(o=>{this.canvas.toBlob(o,t,s)}),this.canvas}});const UE=C("debugprogress");function b1(n){n=n||new Date;const e=n.getMonth()+1,t=n.getDate(),s=n.getHours(),o=n.getMinutes(),r=n.getSeconds(),l=(e<10?"0":"")+e,c=(t<10?"0":"")+t,h=(s<10?"0":"")+s,d=(o<10?"0":"")+o,u=(r<10?"0":"")+r;return n.getFullYear()+l+c+"-"+h+d+u}class de{static start(e,t){typeof t=="string"&&(t={parentScope:t});const s=new zE(e,t);Yc.set(e,s)}static report(e,t){const s=Yc.get(e);if(!s){console.warn("Reporting progress for non-existing scope",e);return}typeof t=="string"&&(t={message:t,autoStep:!0}),s.report(t)}static end(e){const t=Yc.get(e);t&&(t.end(),Yc.delete(e))}}const Yc=new Map;class zE{constructor(e,t){a(this,"scopeLabel"),a(this,"parentScope"),a(this,"childScopes",[]),a(this,"parentDepth",0),a(this,"lastStep",0),a(this,"lastAutoStepWeight",1),a(this,"lastTotalSteps",0),a(this,"onProgress"),a(this,"showLogs",!1),a(this,"selfProgress",0),a(this,"totalProgress",0),a(this,"selfReports",0),a(this,"totalReports",0),this.parentScope=t!=null&&t.parentScope?Yc.get(t.parentScope):void 0,this.parentScope&&(this.parentScope.childScopes.push(this),this.parentDepth=this.parentScope.parentDepth+1),this.scopeLabel=" ".repeat(this.parentDepth*2)+e,this.showLogs=t?.logTimings??!!UE,this.showLogs&&console.time(this.scopeLabel),this.onProgress=t?.onProgress}report(e,t=!1){if(e){if(e.totalSteps!==void 0&&(this.lastTotalSteps=e.totalSteps),e.currentStep!==void 0&&(this.lastStep=e.currentStep),e.autoStep!==void 0){if(e.currentStep===void 0){this.lastStep===void 0&&(this.lastStep=0);const o=typeof e.autoStep=="number"?e.autoStep:1;this.lastStep+=this.lastAutoStepWeight,this.lastAutoStepWeight=o,e.currentStep=this.lastStep}e.totalSteps=this.lastTotalSteps}e.progress!==void 0?this.selfProgress=e.progress:e.currentStep!==void 0&&e.totalSteps!==void 0&&(this.selfProgress=e.currentStep/e.totalSteps)}if(this.childScopes.length>0){let o=0,r=0;for(const c of this.childScopes)o+=c.selfProgress,r+=1;r>0&&(o/=r);const l=this.lastAutoStepWeight/(this.lastTotalSteps??1);this.totalProgress=this.selfProgress+o*l}else this.totalProgress=this.selfProgress;this.selfProgress=Math.min(1,this.selfProgress),this.totalProgress=Math.min(1,this.totalProgress);let s=(this.totalProgress*100).toFixed(3)+"%";this.childScopes.length>0&&(s+=" ("+(this.selfProgress*100).toFixed(3)+"% self)"),e!=null&&e.message&&(s=e.message+" \u2013 "+s),this.lastStep!==void 0&&this.lastTotalSteps!==void 0&&(s="Step "+(this.lastStep+(this.lastAutoStepWeight!=1?"\u2013"+(this.lastStep+this.lastAutoStepWeight):"")+"/"+this.lastTotalSteps)+" "+s),t?this.totalReports++:(this.selfReports++,this.totalReports++),this.showLogs&&console.timeLog(this.scopeLabel,s),this.onProgress&&this.onProgress(this.totalProgress),this.parentScope&&this.parentScope.report(void 0,!0)}end(){this.report({progress:1,autoStep:!0},!0),this.showLogs&&(console.timeLog(this.scopeLabel,"Total reports: "+this.totalReports,"Self reports: "+this.selfReports),console.timeEnd(this.scopeLabel));let e=!1;for(const t of this.childScopes)if(!(t.selfProgress>=1)){e=!0;break}e&&console.warn("Progress end with child scopes that are still running",this),this.onProgress=void 0}}const ze="</StageRoot/Materials";function NE(n,e,t){const s=new Map,o=v=>{const b=v.type___needle,_=s.get(b)||new Map;if(s.set(b,_),!_.has(v)){const w=`${b}${_.size?`_${_.size}`:""}`;_.set(v,w)}return _.get(v)},r=n.colorNode?ip(n.colorNode):[],l=n.colorNode?`color3f inputs:diffuseColor.connect = ${ze}/${e}/${o(r.values().next().value)}.outputs:out>`:"",c=n.roughnessNode?ip(n.roughnessNode):[],h=n.roughnessNode?`float inputs:roughness.connect = ${ze}/${e}/${o(c.values().next().value)}.outputs:out>`:"",d=n.normalNode?ip(n.normalNode):[],u=n.normalNode?`float3 inputs:normal.connect = ${ze}/${e}/${o(d.values().next().value)}.outputs:out>`:"",p=n.metalnessNode?ip(n.metalnessNode):[],g=n.metalnessNode?`float inputs:metallic.connect = ${ze}/${e}/${o(p.values().next().value)}.outputs:out>`:"",f=new Set([...r,...c,...d,...p]),y=$E(f,e,t,o);return console.debug(y),`
|
|
1017
|
+
|
|
1018
|
+
def Material "${e}" ${n.name?`(
|
|
1019
|
+
displayName = "${n.name}"
|
|
1020
|
+
)`:""}
|
|
1021
|
+
{
|
|
1022
|
+
token outputs:mtlx:surface.connect = ${ze}/${e}/N_mtlxsurface.outputs:surface>
|
|
1023
|
+
|
|
1024
|
+
def Shader "N_mtlxsurface"
|
|
1025
|
+
{
|
|
1026
|
+
uniform token info:id = "ND_UsdPreviewSurface_surfaceshader"
|
|
1027
|
+
${l}
|
|
1028
|
+
${h}
|
|
1029
|
+
${u}
|
|
1030
|
+
${g}
|
|
1031
|
+
token outputs:surface
|
|
1032
|
+
}
|
|
1033
|
+
|
|
1034
|
+
${y}
|
|
1035
|
+
|
|
1036
|
+
}`}function ip(n){const e=v=>{if(v.nodeType)return v.nodeType;switch(v.type){case"TimerNode":return"float";case"TextureNode":return;case"ConvertNode":return v.convertTo;default:return}},t=v=>{const b=new Set,_=w=>{var x;if(!(!w.isNode||b.has(w))){w.nodeType___needle||(w.nodeType___needle=e(w)),w.shaderNode?(w.type___needle="ShaderCallNodeInternal",w.shaderNodeLayoutName___needle=w.shaderNode.layout.name.slice(3)):w.type___needle=w.type,b.add(w);for(const k in w)(x=w[k])!=null&&x.isNode&&(_(w[k]),w.nodeType___needle||(w.nodeType___needle=w[k].nodeType___needle)),Array.isArray(w[k])&&w[k].forEach(M=>{M.isNode&&(_(M),w.nodeType___needle||(w.nodeType___needle=M.nodeType___needle))})}};return _(v),b},s=v=>{if(v.type==="ConvertNode"){if(v.convertTo===v.node.nodeType___needle)return!0;if(v.node.type==="ConstNode"){if(v.convertTo==="vec4"&&v.node.value.isVector4||v.convertTo==="vec3"&&v.node.value.isVector3||v.convertTo==="vec2"&&v.node.value.isVector2||v.convertTo==="color"&&v.node.value.isColor||v.convertTo==="float"&&typeof v.node.value=="number")return!0}else if(v.node.type=="SplitNode"&&v.convertTo=="float"&&v.node.components.length===1)return!0}return!1},o=v=>{for(;r(v);)!v.node&&v.shaderNode?v=v.inputNodes[0]:v=v.node??v.aNode??v.bNode??v.cNode;return v},r=v=>{const b=["UniformNode","UniformGroupNode","ShaderNodeInternal"];return!v||s(v)||b.includes(v.type___needle)||v.type___needle===void 0},l=(v,b)=>{var _;for(const w of b)for(const x in w){if((_=w[x])!=null&&_.isNode&&w[x]===v)return{parent:w,label:x};if(Array.isArray(w[x])&&w[x].find(k=>k.isNode&&k===v))return{parent:w,label:x}}return null},c=(v,b)=>{if(v.shaderNode)v.inputNodes[0]=o(v.inputNodes[0]);else if(Array.isArray(v.nodes))for(let _=0;_<v.nodes.length;_++)v.nodes[_]&&r(v.nodes[_])&&(v.nodes[_]=o(v.nodes[_]));else b.forEach(_=>{v[_]&&r(v[_])&&(v[_]=o(v[_]))})},h=v=>{v.type==="MathNode"&&v.method==="mix"&&(v.cNode.nodeType___needle="float",v.cNode.type==="ConvertNode"&&(v.cNode.convertTo="float"))},d=(v,b)=>{b.label==="cNode"&&b.parent.type==="MathNode"&&b.parent.method==="mix"||(b.parent.type==="JoinNode"?v.nodeType___needle="float":v.nodeType___needle=b.parent.nodeType___needle)},u=v=>v?.type==="ConvertNode"&&v.nodeType___needle==="color"&&v.node.nodeType___needle==="vec4",p=(v,b)=>{v.convertTo="vec3",v.nodeType___needle="vec3";const _={type:"ConvertNode",convertTo:"color",node:v,isNode:!0,nodeType___needle:"color",type___needle:"ConvertNode"},w=l(v,b);return w!=null&&w.parent&&(w.parent[w.label]=_),_},g=v=>v?.type==="ConvertNode"&&v.node.type==="TextureNode"&&v.nodeType___needle!==v.node.nodeType___needle,f=v=>{const b=new Set;for(let _ of v)if(!r(_)){if(h(_),_.type=="SplitNode"){const w=l(_,v);if(_.components.length===1)_.nodeType___needle="float";else if(w)_.nodeType___needle=w.parent.nodeType___needle;else throw new Error("SplitNode without parent found, this should not happen")}if(c(_,["node","aNode","bNode","cNode"]),_.type=="ConstNode"&&_.nodeType==null&&d(_,l(_,v)),u(_)&&b.add(p(_,v)),g(_)){_.node.nodeType___needle=_.convertTo;const w=l(_,v);w!=null&&w.parent&&(w.parent[w.label]=_.node),_=_.node}b.add(_)}return b},y=t(n);return f(y)}function WE(n,e){switch(e){case"float4":return n.isVector4?`(${n.x}, ${n.y}, ${n.z}, ${n.w})`:`(${n}, ${n}, ${n}, ${n})`;case"float3":return n.isVector3?`(${n.x}, ${n.y}, ${n.z})`:`(${n}, ${n}, ${n})`;case"float2":return n.isVector2?`(${n.x}, ${n.y})`:`(${n}, ${n})`;case"color3f":return n.isColor?`(${n.r}, ${n.g}, ${n.b})`:`(${n}, ${n}, ${n})`;default:return n.isVector4||n.isVector3||n.isVector2?`${n.x}`:n.isColor?`${n.r}`:`${n}`}}function VE(n,e,t,s){const o=" ",r=f=>({float:"float",vec2:"vector2",vec3:"vector3",vec4:"vector4",color:"color3"})[f]||"float",l=f=>({float:"float",vec2:"float2",vec3:"float3",vec4:"float4",color:"color3f"})[f]||"float",c=n.type___needle,h=n.nodeType___needle,d=r(h);let u=l(h),p="";const g=new Array;switch(c){case"UniformGroupNode":case"UniformNode":return"";case"TimerNode":p="time_float";break;case"ConstNode":p="constant_"+d,g.push(`${u} inputs:value = ${WE(n.value,u)}`);break;case"JoinNode":p="combine"+n.nodes.length+"_"+d;let f=1;for(const w of n.nodes)g.push(`float inputs:in${f++}.connect = ${ze}/${e}/${t(w)}.outputs:out>`);break;case"ConvertNode":p="convert_"+r(n.node.nodeType___needle)+"_"+d,n.node&&g.push(`${l(n.node.nodeType___needle)} inputs:in.connect = ${ze}/${e}/${t(n.node)}.outputs:out>`);break;case"MathNode":p=n.method+"_"+d,n.aNode&&!n.bNode&&g.push(`${l(n.aNode.nodeType___needle)} inputs:in.connect = ${ze}/${e}/${t(n.aNode)}.outputs:out>`),n.aNode&&n.bNode&&!n.cNode&&(g.push(`${l(n.aNode.nodeType___needle)} inputs:in1.connect = ${ze}/${e}/${t(n.aNode)}.outputs:out>`),g.push(`${l(n.bNode.nodeType___needle)} inputs:in2.connect = ${ze}/${e}/${t(n.bNode)}.outputs:out>`)),n.aNode&&n.bNode&&n.cNode&&n.method=="clamp"&&(g.push(`${l(n.aNode.nodeType___needle)} inputs:in.connect = ${ze}/${e}/${t(n.aNode)}.outputs:out>`),g.push(`${l(n.bNode.nodeType___needle)} inputs:low.connect = ${ze}/${e}/${t(n.bNode)}.outputs:out>`),g.push(`${l(n.cNode.nodeType___needle)} inputs:high.connect = ${ze}/${e}/${t(n.cNode)}.outputs:out>`)),n.aNode&&n.bNode&&n.cNode&&n.method=="mix"&&(g.push(`${l(n.aNode.nodeType___needle)} inputs:fg.connect = ${ze}/${e}/${t(n.bNode)}.outputs:out>`),g.push(`${l(n.bNode.nodeType___needle)} inputs:bg.connect = ${ze}/${e}/${t(n.aNode)}.outputs:out>`),g.push(`float inputs:mix.connect = ${ze}/${e}/${t(n.cNode)}.outputs:out>`));break;case"OperatorNode":let y="";switch(n.op){case"*":y="multiply";break;case"/":y="divide";break;case"+":y="add";break;case"-":y="subtract";break}if(p=y+"_"+d,n.aNode&&!n.bNode&&g.push(`${l(n.aNode.nodeType___needle)} inputs:in.connect = ${ze}/${e}/${t(n.aNode)}.outputs:out>`),n.aNode&&n.bNode){const w=l(n.aNode.nodeType___needle),x=l(n.bNode.nodeType___needle);(w==="color3f"&&x==="float"||x==="float"&&x==="color3f")&&(p=y+"_color3FA"),g.push(`${w} inputs:in1.connect = ${ze}/${e}/${t(n.aNode)}.outputs:out>`),g.push(`${x} inputs:in2.connect = ${ze}/${e}/${t(n.bNode)}.outputs:out>`)}break;case"TextureNode":n.uvNode?(p="tiledimage_"+d,g.push(`float2 inputs:texcoord.connect = ${ze}/${e}/${t(n.uvNode)}.outputs:out>`)):p="image_"+d;const v=n._value,b=I0.includes(v.format),_=HE(v);g.push(`asset inputs:file = @textures/${_}.${b?"png":"jpg"}@`),s[_]={texture:v,scale:void 0};break;case"NormalMapNode":u="float3",p="normalmap",g.push(`${u} inputs:in.connect = ${ze}/${e}/${t(n.node)}.outputs:out>`);break;case"AttributeNode":p="geompropvalue_"+d,g.push('string inputs:geomprop = "st"');break;case"ShaderCallNodeInternal":p=n.shaderNodeLayoutName___needle+"_"+d,g.push(`${u} inputs:in.connect = ${ze}/${e}/${t(n.inputNodes[0])}.outputs:out>`);break;case"SplitNode":p="swizzle_"+r(n.node.nodeType___needle)+"_"+d,g.push(`${l(n.node.nodeType___needle)} inputs:in.connect = ${ze}/${e}/${t(n.node)}.outputs:out>`),g.push(`string inputs:channels = "${n.components}"`);break}return`
|
|
1037
|
+
${o}def Shader "${t(n)}"
|
|
1038
|
+
${o}{
|
|
1039
|
+
${o}uniform token info:id = "ND_${p}"
|
|
1040
|
+
${o}${u} outputs:out
|
|
1041
|
+
${o}${g.length>0?g.join(`
|
|
1042
|
+
`):""}
|
|
1043
|
+
${o}}
|
|
1044
|
+
`}function $E(n,e,t,s){let o="";for(const r of n)o+=VE(r,e,s,t);return o}function HE(n){var e;return as(n.name)+"_"+(((e=n.source)==null?void 0:e.id)??n.id)}function as(n){return n=n.replace(/[^a-zA-Z0-9_]/g,""),n.match(/^[a-zA-Z_]/)||(n="_"+n),n}function _1(n){return n=n.replace('"','\\"'),n}function w1(n){if(n.length===0)return null;const e=n.map(t=>{const s=new Array;for(;t.parent;)s.unshift(t.parent),t=t.parent;return s});return e[0].findLast(t=>e.every(s=>s.includes(t)))||null}function x1(n){const e=w1(n),t=new Set;for(const s of n){let o=s.parent;for(;o&&o!==e;)n.includes(o)||t.add(o),o=o.parent}return t}const GE=new S,qE=new V,XE=new S(1,1,1),S1=class Ul{constructor(e,t,s=null,o=null,r=null,l=null,c=null,h=null){a(this,"uuid"),a(this,"name"),a(this,"type"),a(this,"extraSchemas",[]),a(this,"displayName"),a(this,"visibility"),a(this,"transform",null),a(this,"_isDynamic"),a(this,"geometry"),a(this,"material"),a(this,"camera"),a(this,"parent"),a(this,"skinnedMesh"),a(this,"children",[]),a(this,"animations"),a(this,"_eventListeners"),a(this,"needsTranslate",!1),a(this,"needsOrient",!1),a(this,"needsScale",!1);var d,u,p;this.uuid=e,this.name=as(t),this.displayName=t,s?this.transform={position:((d=s.position)==null?void 0:d.clone())||null,quaternion:((u=s.quaternion)==null?void 0:u.clone())||null,scale:((p=s.scale)==null?void 0:p.clone())||null}:this.transform=null,this.geometry=o,this.material=r,this.camera=l,this.parent=null,this.children=[],this._eventListeners={},this._isDynamic=!1,this.skinnedMesh=c,this.animations=h}getMatrix(){if(!this.transform)return new se;const{position:e,quaternion:t,scale:s}=this.transform,o=new se;return o.compose(e||GE,t||qE,s||XE),o}setMatrix(e){if(!e||!(e instanceof se)){this.transform=null;return}const t=new S,s=new V,o=new S;e.decompose(t,s,o),this.transform={position:t,quaternion:s,scale:o}}get matrix(){return this.getMatrix()}set matrix(e){this.setMatrix(e)}get isDynamic(){return this._isDynamic}set isDynamic(e){this._isDynamic=e}static createEmptyParent(e){const t=new Ul(Cn.generateUUID(),e.name+"_empty_"+Ul.USDObject_export_id++,e.transform),s=e.parent;return s&&s.add(t),t.add(e),t.isDynamic=!0,e.transform=null,t}static createEmpty(){const e=new Ul(Cn.generateUUID(),"Empty_"+Ul.USDObject_export_id++);return e.isDynamic=!0,e}is(e){return e?this.uuid===e.uuid:!1}isEmpty(){return!this.geometry}clone(){const e=new Ul(Cn.generateUUID(),this.name,this.transform,this.geometry,this.material);return e.isDynamic=this.isDynamic,e}deepClone(){const e=this.clone();for(const t of this.children)t&&e.add(t.deepClone());return e}getPath(){let e=this.parent,t=this.name;for(;e;)t=(e.parent?e.name:e.name+"/Scenes/Scene")+"/"+t,e=e.parent;return"</"+t+">"}add(e){e.parent&&e.parent.remove(e),e.parent=this,this.children.push(e)}remove(e){const t=this.children.indexOf(e);t>=0&&(e.parent===this&&(e.parent=null),this.children.splice(t,1))}addEventListener(e,t){this._eventListeners[e]||(this._eventListeners[e]=[]),this._eventListeners[e].push(t)}removeEventListener(e,t){if(!this._eventListeners[e])return;const s=this._eventListeners[e].indexOf(t);s>=0&&this._eventListeners[e].splice(s,1)}onSerialize(e,t){const s=this._eventListeners.serialize;s&&s.forEach(o=>o(e,t))}};a(S1,"USDObject_export_id",0);let mi=S1;class O0 extends mi{constructor(){super(void 0,"StageRoot",null,null,null,null),a(this,"stageLength"),this.children=[],this.stageLength=200}get isDocumentRoot(){return!0}get isDynamic(){return!1}add(e){e.parent=this,this.children.push(e)}remove(e){const t=this.children.indexOf(e);t>=0&&(e.parent===this&&(e.parent=null),this.children.splice(t,1))}traverse(e,t=null){if(t!==null?e(t):t=this,t.children)for(const s of t.children)this.traverse(e,s)}findById(e){let t=!1;function s(o){if(!t){if(o.uuid===e)return t=!0,o;if(o.children)for(const r of o.children){if(!r)continue;const l=s(r);if(l)return l}}}return s(this)}buildHeader(e){var t,s,o;const r=(t=e.extensions)==null?void 0:t.find(f=>f?.extensionName==="animation"),l=(s=e.extensions)==null?void 0:s.find(f=>f?.extensionName==="Behaviour"),c=(o=e.extensions)==null?void 0:o.find(f=>f?.extensionName==="Physics"),h=r?.getStartTimeCode()??0,d=r?.getEndTimeCode()??0;let u="";const p=r?.registeredClips;if(p)for(const f of p)u+=` # Animation: ${f.name}, start=${r.getStartTimeByClip(f)*60}, length=${f.duration*60}
|
|
1045
|
+
`;const g=u;return`#usda 1.0
|
|
1046
|
+
(
|
|
1047
|
+
customLayerData = {
|
|
1048
|
+
string creator = "Needle Engine ${ws}"
|
|
1049
|
+
dictionary Needle = {
|
|
1050
|
+
bool animations = ${r?1:0}
|
|
1051
|
+
bool interactive = ${l?1:0}
|
|
1052
|
+
bool physics = ${c?1:0}
|
|
1053
|
+
bool quickLookCompatible = ${e.quickLookCompatible?1:0}
|
|
1054
|
+
}
|
|
1055
|
+
}
|
|
1056
|
+
defaultPrim = "${as(this.name)}"
|
|
1057
|
+
metersPerUnit = 1
|
|
1058
|
+
upAxis = "Y"
|
|
1059
|
+
startTimeCode = ${h}
|
|
1060
|
+
endTimeCode = ${d}
|
|
1061
|
+
timeCodesPerSecond = 60
|
|
1062
|
+
framesPerSecond = 60
|
|
1063
|
+
doc = """Generated by Needle Engine USDZ Exporter ${ws}"""
|
|
1064
|
+
${g}
|
|
1065
|
+
)
|
|
1066
|
+
`}}const rl=`
|
|
1067
|
+
`,Kt="</StageRoot/Materials";class C1{constructor(){a(this,"str"),a(this,"indent"),this.str="",this.indent=0}clear(){this.str="",this.indent=0}beginBlock(e=void 0,t="{",s=!0){e!==void 0?(e=this.applyIndent(e),this.str+=e,s?(this.str+=rl,this.str+=this.applyIndent(t)):this.str+=" "+t):this.str+=this.applyIndent(t),this.str+=rl,this.indent+=1}closeBlock(e="}"){this.indent-=1,this.str+=this.applyIndent(e)+rl}beginArray(e){e=this.applyIndent(e+" = ["),this.str+=e,this.str+=rl,this.indent+=1}closeArray(){this.indent-=1,this.str+=this.applyIndent("]")+rl}appendLine(e=""){e=this.applyIndent(e),this.str+=e,this.str+=rl}toString(){return this.str}applyIndent(e){let t="";for(let s=0;s<this.indent;s++)t+=" ";return t+e}}class QE{constructor(e,t,s){a(this,"root"),a(this,"exporter"),a(this,"extensions",[]),a(this,"quickLookCompatible"),a(this,"exportInvisible"),a(this,"materials"),a(this,"textures"),a(this,"files"),a(this,"document"),a(this,"output"),a(this,"animations"),this.root=e,this.exporter=t,this.quickLookCompatible=s.quickLookCompatible,this.exportInvisible=s.exportInvisible,s.extensions&&(this.extensions=s.extensions),this.materials=new Map,this.textures={},this.files={},this.document=new O0,this.output="",this.animations=[]}}class k0{constructor(){a(this,"ar",{anchoring:{type:"plane"},planeAnchoring:{alignment:"horizontal"}}),a(this,"quickLookCompatible",!1),a(this,"extensions",[]),a(this,"maxTextureSize",4096),a(this,"exportInvisible",!1)}}let P1=class{constructor(){a(this,"debug"),a(this,"pruneUnusedNodes"),a(this,"sceneAnchoringOptions",new k0),a(this,"extensions",[]),a(this,"keepObject"),a(this,"beforeWritingDocument"),this.debug=!1,this.pruneUnusedNodes=!0}async parse(n,e=new k0){var t,s;e=Object.assign(new k0,e),this.sceneAnchoringOptions=e;const o=new QE(n,this,e);this.extensions=o.extensions;const r=o.files,l="model.usda";r[l]=null;const c=o.materials,h=o.textures;de.report("export-usdz","Invoking onBeforeBuildDocument"),await sp(o,"onBeforeBuildDocument"),de.report("export-usdz","Done onBeforeBuildDocument"),de.report("export-usdz","Reparent bones to common ancestor");const d=[],u=new Set;n?.traverse(w=>{if(!(!e.exportInvisible&&!w.visible)&&w instanceof Pn){const x=w.skeleton.bones,k=w1(x);if(k){const M={object:w,originalParent:w.parent,newParent:k};d.push(M),u.add(M.object.uuid),M.newParent&&u.add(M.newParent.uuid),M.originalParent&&u.add(M.originalParent.uuid)}}});for(const w of d){const{object:x,originalParent:k,newParent:M}=w;M.add(x)}de.report("export-usdz","Traversing hierarchy"),n&&O1(n,o.document,o,this.keepObject),de.report("export-usdz","Invoking onAfterBuildDocument"),await sp(o,"onAfterBuildDocument");const p=o.extensions.find(w=>w.extensionName==="Behaviour"),g=p?.getAllTargetUuids()??new Set;if(this.pruneUnusedNodes){const w={allBehaviorTargets:g,debug:!1,boneReparentings:u,quickLookCompatible:o.quickLookCompatible};this.debug&&k1(o.document,"Hierarchy BEFORE pruning",w),M1(o.document,w),this.debug&&k1(o.document,"Hierarchy AFTER pruning")}else this.debug&&console.log("Pruning of empty nodes is disabled. This may result in a larger USDZ file.");de.report("export-usdz",{message:"Parsing document",autoStep:10}),await YE(o,()=>(de.report("export-usdz","Building materials"),nA(c,h,e.quickLookCompatible))),de.report("export-usdz","Invoking onAfterSerialize"),await sp(o,"onAfterSerialize");for(const w of d){const{object:x,originalParent:k,newParent:M}=w;k&&k.add(x)}(s=(t=o.exporter)==null?void 0:t.beforeWritingDocument)==null||s.call(t);const f=o.document.buildHeader(o)+`
|
|
1068
|
+
`+o.output;this.debug&&console.log(f),r[l]=Gv(f),o.output="",de.report("export-usdz",{message:"Exporting textures",autoStep:10}),de.start("export-usdz-textures",{parentScope:"export-usdz",logTimings:!1});const y=new fr({antialias:!1,alpha:!0,premultipliedAlpha:!1,preserveDrawingBuffer:!0}),v=Object.keys(h).length;de.report("export-usdz-textures",{totalSteps:v*3,currentStep:0});const b=async w=>{const x=h[w],k=x.texture,M=I0.includes(k.format);let T={imageData:k.image};de.report("export-usdz-textures",{message:"read back texture",autoStep:!0});const L=x.scale!==void 0&&x.scale.x!==1&&x.scale.y!==1&&x.scale.z!==1&&x.scale.w!==1;(k.isCompressedTexture||k.isRenderTargetTexture||L)&&(T=await T1(k,e.maxTextureSize,y,x.scale)),de.report("export-usdz-textures",{message:"convert texture to canvas",autoStep:!0});const D=await ZE(T.imageBitmap||T.imageData,e.maxTextureSize).catch(z=>{console.error("Error converting texture to canvas",k,z)});if(D){de.report("export-usdz-textures",{message:"convert canvas to blob",autoStep:!0});const z=await D.convertToBlob({type:M?"image/png":"image/jpeg",quality:.95});r[`textures/${w}.${M?"png":"jpg"}`]=new Uint8Array(await z.arrayBuffer())}else console.warn("Can`t export texture: ",k)};for(const w in h)await b(w);y.dispose(),de.end("export-usdz-textures");let _=0;for(const w in r){const x=r[w],k=34+w.length;_+=k;const M=_&63;if(M!==4){const T=64-M,L=new Uint8Array(T);r[w]=[x,{extra:{12345:L}}]}_=x.length}return de.report("export-usdz","zip archive"),nO(r,{level:0})}};function O1(n,e,t,s){var o;if(!t.exportInvisible&&!n.visible)return;let r,l,c;const h={position:n.position,quaternion:n.quaternion,scale:n.scale};if(n.position.x===0&&n.position.y===0&&n.position.z===0&&(h.position=null),n.quaternion.x===0&&n.quaternion.y===0&&n.quaternion.z===0&&n.quaternion.w===1&&(h.quaternion=null),n.scale.x===1&&n.scale.y===1&&n.scale.z===1&&(h.scale=null),(n instanceof G||n instanceof Pn)&&(l=n.geometry,c=n.material),s&&!s(n)&&(l=void 0,c=void 0),(n instanceof G||n instanceof Pn)&&c&&typeof c=="object"&&(c instanceof bt||c instanceof Me||c.isMeshPhysicalNodeMaterial||c instanceof Pe&&c.type==="MeshLineMaterial")){const d=rp(n),u=n instanceof Pn?n:null;r=new mi(n.uuid,d,h,l,c,void 0,u,n.animations)}else if(n instanceof we||n instanceof ud){const d=rp(n);r=new mi(n.uuid,d,h,void 0,void 0,n)}else{const d=rp(n);r=new mi(n.uuid,d,h,void 0,void 0,void 0,void 0,n.animations)}if(r){if(r.displayName=((o=n.userData)==null?void 0:o.name)||n.name,r.visibility=n.visible?void 0:"invisible",e&&e.add(r),e=r,t.extensions)for(const d of t.extensions)d.onExportObject&&d.onExportObject.call(d,n,r,t)}else{const d=rp(n),u=new mi(n.uuid,d,{position:n.position,quaternion:n.quaternion,scale:n.scale});e&&e.add(u),e=u}for(const d of n.children)O1(d,e,t,s)}function k1(n,e,...t){const s={};let o=0;function r(l,c){o++;let h=l.displayName||l.name;h+=" ("+l.uuid+")",(l.geometry||l.material||l.camera||l.skinnedMesh)&&(h+=" ("+(l.geometry?"geo, ":"")+(l.material?"mat, ":"")+(l.camera?"cam, ":"")+(l.skinnedMesh?"skin, ":"")+")"),c[h]={};const d={object:l};l.material&&(d.mat=!0),l.geometry&&(d.geo=!0),l.camera&&(d.cam=!0),l.skinnedMesh&&(d.skin=!0),c[h]._self=d;for(const u of l.children)u&&r(u,c[h])}r(n,s),console.log(e+" ("+o+" nodes)",s,...t)}function M1(n,e){var t;let s=!0;const o=new Array,r=new Array;if(n.children.length===0)s=!0;else{const u=[...n.children];for(const p of u)if(p){const g=M1(p,e);e.debug&&(g?o.push(p):r.push(p)),s=s&&g}}const l=e.allBehaviorTargets.has(n.uuid),c=n.geometry||n.material||n.camera&&!e.quickLookCompatible||n.skinnedMesh||!1,h=e.boneReparentings.has(n.uuid),d=s&&!l&&!c&&!h;return d?(e.debug&&console.log("Pruned object:",(n.displayName||n.name)+" ("+n.uuid+")",{isVisible:c,isBehaviorSourceOrTarget:l,allChildsWerePruned:s,isBoneReparenting:h,object:n,prunedChilds:o,keptChilds:r}),(t=n.parent)==null||t.remove(n)):e.debug&&console.log("Kept object:",(n.displayName||n.name)+" ("+n.uuid+")",{isVisible:c,isBehaviorSourceOrTarget:l,allChildsWerePruned:s,isBoneReparenting:h,object:n,prunedChilds:o,keptChilds:r}),d}async function YE(n,e){de.start("export-usdz-resources","export-usdz");const t=[];for(const h of n.document.children)R1(h,n,t);const s=t.length;for(let h=0;h<s;h++)de.report("export-usdz-resources",{totalSteps:s,currentStep:h}),await new Promise((d,u)=>{t[h](),d()});de.end("export-usdz-resources");const o=new C1,r=n.exporter.sceneAnchoringOptions.ar;o.beginBlock(`def Xform "${n.document.name}"`),o.beginBlock(`def Scope "Scenes" (
|
|
1069
|
+
kind = "sceneLibrary"
|
|
1070
|
+
)`),o.beginBlock('def Xform "Scene"',"(",!1),o.appendLine('apiSchemas = ["Preliminary_AnchoringAPI"]'),o.appendLine("customData = {"),o.appendLine(" bool preliminary_collidesWithEnvironment = 0"),o.appendLine(' string sceneName = "Scene"'),o.appendLine("}"),o.appendLine('sceneName = "Scene"'),o.closeBlock(")"),o.beginBlock(),o.appendLine(`token preliminary:anchoring:type = "${r.anchoring.type}"`),r.anchoring.type==="plane"&&o.appendLine(`token preliminary:planeAnchoring:alignment = "${r.planeAnchoring.alignment}"`),r.anchoring.type==="image"&&o.appendLine(`rel preliminary:imageAnchoring:referenceImage = </${n.document.name}/Scenes/Scene/AnchoringReferenceImage>`),o.appendLine();const l=h=>{if(!h)return 0;let d=1;for(const u of h.children)d+=l(u);return d},c=l(n.document);de.start("export-usdz-xforms","export-usdz"),de.report("export-usdz-xforms",{totalSteps:c,currentStep:1});for(const h of n.document.children)I1(h,o,n);de.end("export-usdz-xforms"),de.report("export-usdz","invoke onAfterHierarchy"),sp(n,"onAfterHierarchy",o),o.closeBlock(),o.closeBlock(),o.appendLine(e()),o.closeBlock(),de.report("export-usdz","write to string"),n.output+=o.toString()}function R1(n,e,t){if(!n)return;const s=n.geometry,o=n.material;if(s)if(o&&("isMeshStandardMaterial"in o&&o.isMeshStandardMaterial||"isMeshBasicMaterial"in o&&o.isMeshBasicMaterial||o.type==="MeshLineMaterial")){const r="geometries/"+R0(s,n.name)+".usda";if(!(r in e.files)){const l=()=>{var c,h;const d=tA(s,(h=(c=n.skinnedMesh)==null?void 0:c.skeleton)==null?void 0:h.bones,e.quickLookCompatible);e.files[r]=eA(d)};t.push(l)}}else console.warn("NeedleUSDZExporter: Unsupported material type (USDZ only supports MeshStandardMaterial)",o?.name);o&&(o.uuid in e.materials||(e.materials[o.uuid]=o));for(const r of n.children)R1(r,e,t)}async function sp(n,e,t=null){if(n.extensions){for(const s of n.extensions)if(s&&typeof s[e]=="function"){const o=s[e].call(s,n,t);o instanceof Promise&&await o}}}let np=null,Zt=null,M0,al,op;async function T1(n,e=1/0,t=null,s=void 0){M0||(M0=new Ns(2,2,1,1)),al||(al=new Ws({uniforms:{blitTexture:new Qi(n),flipY:new Qi(!1),scale:new Qi(new fe(1,1,1,1))},vertexShader:`
|
|
1071
|
+
varying vec2 vUv;
|
|
1072
|
+
uniform bool flipY;
|
|
1073
|
+
void main(){
|
|
1074
|
+
vUv = uv;
|
|
1075
|
+
if (flipY)
|
|
1076
|
+
vUv.y = 1. - vUv.y;
|
|
1077
|
+
gl_Position = vec4(position.xy * 1.0,0.,.999999);
|
|
1078
|
+
}`,fragmentShader:`
|
|
1079
|
+
uniform sampler2D blitTexture;
|
|
1080
|
+
uniform vec4 scale;
|
|
1081
|
+
varying vec2 vUv;
|
|
1082
|
+
|
|
1083
|
+
void main(){
|
|
1084
|
+
gl_FragColor = vec4(vUv.xy, 0, 1);
|
|
1085
|
+
|
|
1086
|
+
#ifdef IS_SRGB
|
|
1087
|
+
gl_FragColor = sRGBTransferOETF( texture2D( blitTexture, vUv) );
|
|
1088
|
+
#else
|
|
1089
|
+
gl_FragColor = texture2D( blitTexture, vUv);
|
|
1090
|
+
#endif
|
|
1091
|
+
|
|
1092
|
+
gl_FragColor.rgba *= scale.rgba;
|
|
1093
|
+
}`}));const o=al.uniforms;o.blitTexture.value=n,o.flipY.value=!1,o.scale.value=new fe(1,1,1,1),s!==void 0&&o.scale.value.copy(s),al.defines.IS_SRGB=n.colorSpace==Mn,al.needsUpdate=!0,op||(op=new G(M0,al),op.frustumCulled=!1);const r=new we,l=new xi;l.add(op),t||(t=np=new fr({antialias:!1,alpha:!0,premultipliedAlpha:!1,preserveDrawingBuffer:!0}));const c=Math.min(n.image.width,e),h=Math.min(n.image.height,e);Zt&&(Zt.width!==c||Zt.height!==h)&&(Zt.dispose(),Zt=null),Zt||(Zt=new $s(c,h,{format:fd,type:OP,minFilter:xd,magFilter:xd})),t.setRenderTarget(Zt),t.setSize(c,h),t.clear(),t.render(l,r),np&&(np.dispose(),np=null);const d=new Uint8ClampedArray(Zt.width*Zt.height*4);t.readRenderTargetPixels(Zt,0,0,Zt.width,Zt.height,d);const u=new ImageData(d,Zt.width,Zt.height,void 0),p=await createImageBitmap(u,{premultiplyAlpha:"none"});return{imageData:u,imageBitmap:p}}function KE(n){return typeof HTMLImageElement<"u"&&n instanceof HTMLImageElement||typeof HTMLCanvasElement<"u"&&n instanceof HTMLCanvasElement||typeof OffscreenCanvas<"u"&&n instanceof OffscreenCanvas||typeof ImageBitmap<"u"&&n instanceof ImageBitmap}async function ZE(n,e=4096){const t=e/Math.max(n.width,n.height),s=n.width*Math.min(1,t),o=n.height*Math.min(1,t),r=new OffscreenCanvas(s,o),l={premultiplyAlpha:"none"};n.width!==s&&(l.resizeWidth=s),n.height!==o&&(l.resizeHeight=o);const c=await createImageBitmap(n,l),h=r.getContext("bitmaprenderer");return h&&h.transferFromImageBitmap(c),r}async function E1(n,e=void 0,t=!1,s=4096){if(KE(n)){const o=s/Math.max(n.width,n.height),r=new OffscreenCanvas(n.width*Math.min(1,o),n.height*Math.min(1,o)),l=r.getContext("2d",{alpha:!0,premultipliedAlpha:!1});if(!l)throw new Error("Could not get canvas 2D context");if(t===!0&&(l.translate(0,r.height),l.scale(1,-1)),l.drawImage(n,0,0,r.width,r.height),e!==void 0){const c=e.x,h=e.y,d=e.z,u=e.w,p=l.getImageData(0,0,r.width,r.height),g=p.data;for(let f=0;f<g.length;f+=4)g[f+0]=g[f+0]*c,g[f+1]=g[f+1]*h,g[f+2]=g[f+2]*d,g[f+3]=g[f+3]*u;l.putImageData(p,0,0)}return r}else throw new Error("NeedleUSDZExporter: No valid image data found. Unable to process texture.")}const Ae=7;function JE(){return`#usda 1.0
|
|
1094
|
+
(
|
|
1095
|
+
customLayerData = {
|
|
1096
|
+
string creator = "Needle Engine USDZExporter"
|
|
1097
|
+
}
|
|
1098
|
+
metersPerUnit = 1
|
|
1099
|
+
upAxis = "Y"
|
|
1100
|
+
)
|
|
1101
|
+
`}function eA(n,e){let t=JE();return t+=n,Gv(t)}function rp(n){return n.name.replace(/[-<>\(\)\[\]§$%&\/\\\=\?\,\;]/g,"")+"_"+n.id}function A1(n){return as(n.name||"bone_"+n.uuid)}function R0(n,e){return as(n.name||"Geometry")+"_"+n.id}function ap(n){return as(n.name||"Material")+"_"+n.id}function ll(n,e){let t=A1(n),s=n.parent;for(;s&&s!==e;)t=A1(s)+"/"+t,s=s.parent;return t}function I1(n,e,t){var s;if(n==null)return;de.report("export-usdz-xforms",{message:"buildXform "+n.displayName||n.name,autoStep:!0});const o=n.transform,r=n.geometry,l=n.material,c=n.camera,h=n.name;if(n.animations)for(const y of n.animations)t.animations.push(y);const d=r&&r.isBufferGeometry&&r.attributes.skinIndex!==void 0&&r.attributes.skinIndex.count>0,u=d?"SkelRoot":"Xform",p=new Array,g=l&&l instanceof Me&&l.color&&l.color.r===1&&l.color.g===1&&l.color.b===1&&!l.map&&l.opacity===1&&r?.attributes.color;if(r!=null&&r.attributes.color&&!g&&console.warn("NeedleUSDZExporter: Geometry has vertex colors. Vertex colors will only be shown in QuickLook for unlit materials with white color and no texture. Otherwise, they will be ignored.",n.displayName),e.appendLine(),r?(e.beginBlock(`def ${u} "${h}"`,"(",!1),t.quickLookCompatible&&l&&l.side===Pi&&!d?e.appendLine(`prepend references = @./geometries/${R0(r)}.usda@</Geometry_doubleSided>`):e.appendLine(`prepend references = @./geometries/${R0(r)}.usda@</Geometry>`),g||p.push("MaterialBindingAPI"),d&&p.push("SkelBindingAPI")):c&&!t.quickLookCompatible?e.beginBlock(`def Camera "${h}"`,"(",!1):n.type!==void 0?e.beginBlock(`def ${n.type} "${h}"`):e.beginBlock(`def Xform "${h}"`,"(",!1),n.type===void 0&&((s=n.extraSchemas)!=null&&s.length&&p.push(...n.extraSchemas),p.length&&e.appendLine(`prepend apiSchemas = [${p.map(y=>`"${y}"`).join(", ")}]`)),n.displayName&&e.appendLine(`displayName = "${_1(n.displayName)}"`),(c||n.type===void 0)&&(e.closeBlock(")"),e.beginBlock()),r&&l){if(!g){const y=ap(l);e.appendLine(`rel material:binding = </StageRoot/Materials/${y}>`)}!t.quickLookCompatible&&l.side===Pi&&(e.beginBlock('over "Geometry" '),e.appendLine("uniform bool doubleSided = 1"),e.closeBlock())}let f=!1;if(d?(e.appendLine("rel skel:skeleton = <Rig>"),e.appendLine("rel skel:animationSource = <Rig/_anim>"),f=!1):n.type===void 0&&o&&(f=f||o.position!==null||o.quaternion!==null||o.scale!==null,o.position&&(n.needsTranslate=!0,e.appendLine(`double3 xformOp:translate = (${ue(o.position.x)}, ${ue(o.position.y)}, ${ue(o.position.z)})`)),o.quaternion&&(n.needsOrient=!0,e.appendLine(`quatf xformOp:orient = (${ue(o.quaternion.w)}, ${ue(o.quaternion.x)}, ${ue(o.quaternion.y)}, ${ue(o.quaternion.z)})`)),o.scale&&(n.needsScale=!0,e.appendLine(`double3 xformOp:scale = (${ue(o.scale.x)}, ${ue(o.scale.y)}, ${ue(o.scale.z)})`))),n.visibility!==void 0&&e.appendLine(`token visibility = "${n.visibility}"`),c&&!t.quickLookCompatible&&("isOrthographicCamera"in c&&c.isOrthographicCamera?(e.appendLine(`float2 clippingRange = (${c.near}, ${c.far})`),e.appendLine(`float horizontalAperture = ${((Math.abs(c.left)+Math.abs(c.right))*10).toPrecision(Ae)}`),e.appendLine(`float verticalAperture = ${((Math.abs(c.top)+Math.abs(c.bottom))*10).toPrecision(Ae)}`),e.appendLine('token projection = "orthographic"')):"isPerspectiveCamera"in c&&c.isPerspectiveCamera&&(e.appendLine(`float2 clippingRange = (${c.near.toPrecision(Ae)}, ${c.far.toPrecision(Ae)})`),e.appendLine(`float focalLength = ${c.getFocalLength().toPrecision(Ae)}`),e.appendLine(`float focusDistance = ${c.focus.toPrecision(Ae)}`),e.appendLine(`float horizontalAperture = ${c.getFilmWidth().toPrecision(Ae)}`),e.appendLine('token projection = "perspective"'),e.appendLine(`float verticalAperture = ${c.getFilmHeight().toPrecision(Ae)}`))),n.onSerialize&&n.onSerialize(e,t),n.type===void 0){const y=new Array;n.needsTranslate&&y.push('"xformOp:translate"'),n.needsOrient&&y.push('"xformOp:orient"'),n.needsScale&&y.push('"xformOp:scale"'),y.length&&e.appendLine(`uniform token[] xformOpOrder = [${y.join(", ")}]`)}if(n.children){e.appendLine();for(const y of n.children)I1(y,e,t)}e.closeBlock()}function ue(n){return Number.isInteger(n)?n.toString():n.toFixed(10)}function L1(n){const e=n.elements;return`( ${lp(e,0)}, ${lp(e,4)}, ${lp(e,8)}, ${lp(e,12)} )`}function lp(n,e){return`(${ue(n[e+0])}, ${ue(n[e+1])}, ${ue(n[e+2])}, ${ue(n[e+3])})`}function tA(n,e=[],t=!0){return`
|
|
1102
|
+
def "Geometry"
|
|
1103
|
+
${iA(n,e,t)}
|
|
1104
|
+
`}function iA(n,e=[],t=!0){const s="Geometry",o=n.attributes,r=o.position.count,l=e&&e.length>0,c=[],h=[];let d=new Array,u=o.skinIndex;if(l){const g=[];for(const b of e)c.push({bone:b,index:e.indexOf(b)}),g.push(b.uuid);let f=1e4;for(;g.length<e.length&&f-- >0;)for(const b of c){const _=b.bone.children;for(const w of _)g.indexOf(w.uuid)===-1&&e.indexOf(w)!==-1&&(c.push({bone:w,index:e.indexOf(w)}),g.push(w.uuid))}f<=0&&console.error("Failed to sort bones in skinned mesh",c,e,g);for(const b of x1(e))c.push({bone:b,index:c.length});const y=c[0].bone.parent;c.sort((b,_)=>ll(b.bone,y)>ll(_.bone,y)?1:-1),c.map(b=>'"'+ll(b.bone,y)+'"').join(", ");for(const b in c)h[c[b].index]=parseInt(b);const v=o.skinIndex;d=new Array;for(let b=0;b<v.count;b++){const _=v.getX(b),w=v.getY(b),x=v.getZ(b),k=v.getW(b);d.push(h[_],h[w],h[x],h[k])}u=new _t(new Uint16Array(d),4)}const p=o.skinWeight&&o.skinIndex;return`
|
|
1105
|
+
{
|
|
1106
|
+
def Mesh "${s}" ${p?`(
|
|
1107
|
+
prepend apiSchemas = ["SkelBindingAPI"]
|
|
1108
|
+
)`:""}
|
|
1109
|
+
{
|
|
1110
|
+
int[] faceVertexCounts = [${T0(n)}]
|
|
1111
|
+
int[] faceVertexIndices = [${E0(n)}]
|
|
1112
|
+
${o.normal||t?`normal3f[] normals = [${cp(o.normal,r)}] (
|
|
1113
|
+
interpolation = "vertex"
|
|
1114
|
+
)`:""}
|
|
1115
|
+
point3f[] points = [${cp(o.position,r)}]
|
|
1116
|
+
${o.uv?`texCoord2f[] primvars:st = [${D1(o.uv,r,!0)}] (
|
|
1117
|
+
interpolation = "vertex"
|
|
1118
|
+
)`:""}
|
|
1119
|
+
${o.uv1?A0("st1",o.uv1):""}
|
|
1120
|
+
${o.uv2?A0("st2",o.uv2):""}
|
|
1121
|
+
${o.uv3?A0("st3",o.uv3):""}
|
|
1122
|
+
${p?`matrix4d primvars:skel:geomBindTransform = ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ) (
|
|
1123
|
+
elementSize = 1
|
|
1124
|
+
interpolation = "constant"
|
|
1125
|
+
)`:""}
|
|
1126
|
+
${o.skinIndex?`int[] primvars:skel:jointIndices = [${j1(u,!0)}] (
|
|
1127
|
+
elementSize = 4
|
|
1128
|
+
interpolation = "vertex"
|
|
1129
|
+
)`:""}
|
|
1130
|
+
${o.skinWeight?`float[] primvars:skel:jointWeights = [${j1(o.skinWeight)}] (
|
|
1131
|
+
elementSize = 4
|
|
1132
|
+
interpolation = "vertex"
|
|
1133
|
+
)`:""}
|
|
1134
|
+
${o.color?`color3f[] primvars:displayColor = [${cp(o.color,r)}] (
|
|
1135
|
+
interpolation = "vertex"
|
|
1136
|
+
)`:""}
|
|
1137
|
+
uniform token subdivisionScheme = "none"
|
|
1138
|
+
}
|
|
1139
|
+
}
|
|
1140
|
+
${t?`
|
|
1141
|
+
# This is a workaround for QuickLook/RealityKit not supporting the doubleSided attribute. We're adding a second
|
|
1142
|
+
# geometry definition here, that uses the same mesh data but appends extra faces with reversed winding order.
|
|
1143
|
+
def "${s}_doubleSided" (
|
|
1144
|
+
prepend references = </Geometry>
|
|
1145
|
+
)
|
|
1146
|
+
{
|
|
1147
|
+
over "Geometry"
|
|
1148
|
+
{
|
|
1149
|
+
int[] faceVertexCounts = [${T0(n)+", "+T0(n)}]
|
|
1150
|
+
int[] faceVertexIndices = [${E0(n)+", "+E0(n,!0)}]
|
|
1151
|
+
}
|
|
1152
|
+
}
|
|
1153
|
+
`:""}
|
|
1154
|
+
`}function T0(n){const e=n.index!==null?n.index.count:n.attributes.position.count;return Array(Math.floor(e/3)).fill(3).join(", ")}function E0(n,e=!1){const t=n.index,s=[];if(t!==null)for(let o=0;o<t.count;o++){let r=o;e&&(r=o%3===0?o+2:o%3===2?o-2:o),s.push(t.getX(r))}else{const o=n.attributes.position.count;for(let r=0;r<o;r++){let l=r;e&&(l=r%3===0?r+2:r%3===2?r-2:r),s.push(l)}}return s.join(", ")}function A0(n,e){const t=e.itemSize;switch(t){case 2:return`texCoord2f[] primvars:${n} = [${D1(e,t,!0)}] (
|
|
1155
|
+
interpolation = "vertex"
|
|
1156
|
+
)`;case 3:return`texCoord3f[] primvars:${n} = [${cp(e,t)}] (
|
|
1157
|
+
interpolation = "vertex"
|
|
1158
|
+
)`;case 4:return`double4[] primvars:${n} = [${sA(e,t)}] (
|
|
1159
|
+
interpolation = "vertex"
|
|
1160
|
+
)`;default:return console.warn("USDZExporter: Attribute with "+t+" components are currently not supported. Results may be undefined for "+n+"."),""}}function cp(n,e){if(n===void 0)return console.warn("USDZExporter: A mesh attribute is missing and will be set with placeholder data. The result may look incorrect."),Array(e).fill("(0, 0, 1)").join(", ");const t=[];for(let s=0;s<n.count;s++){const o=n.getX(s),r=n.getY(s),l=n.getZ(s);t.push(`(${o.toPrecision(Ae)}, ${r.toPrecision(Ae)}, ${l.toPrecision(Ae)})`)}return t.join(", ")}function sA(n,e){if(n===void 0)return console.warn("USDZExporter: Attribute is missing. Results may be undefined."),Array(e).fill("(0, 0, 0, 0)").join(", ");const t=[];for(let s=0;s<n.count;s++){const o=n.getX(s),r=n.getY(s),l=n.getZ(s)||0,c=n.getW(s)||0;t.push(`(${o.toPrecision(Ae)}, ${r.toPrecision(Ae)}, ${l.toPrecision(Ae)}, ${c.toPrecision(Ae)})`)}return t.join(", ")}function j1(n,e=!1){const t=[];for(let s=0;s<n.count;s++){const o=n.getX(s),r=n.getY(s),l=n.getZ(s),c=n.getW(s);t.push(`${e?o:o.toPrecision(Ae)}`),t.push(`${e?r:r.toPrecision(Ae)}`),t.push(`${e?l:l.toPrecision(Ae)}`),t.push(`${e?c:c.toPrecision(Ae)}`)}return t.join(", ")}function D1(n,e,t=!1){if(n===void 0)return console.warn("USDZExporter: UVs missing."),Array(e).fill("(0, 0)").join(", ");const s=[];for(let o=0;o<n.count;o++){const r=n.getX(o);let l=n.getY(o);t&&(l=1-l),s.push(`(${r.toPrecision(Ae)}, ${l.toPrecision(Ae)})`)}return s.join(", ")}function nA(n,e,t=!1){const s=[];for(const o in n){const r=n[o];s.push(oA(r,e,t))}return`
|
|
1161
|
+
def "Materials"
|
|
1162
|
+
{
|
|
1163
|
+
${s.join("")}
|
|
1164
|
+
}`}function ls(n){var e;return as(n.name)+"_"+(((e=n.source)==null?void 0:e.id)??n.id)}function No(n,e,t,s,o,r,l=void 0,c=void 0){const h=ls(n),d=h+(c!==void 0&&c!==1?"_"+c:""),u=t&&c!==void 0&&c!==1,p=u?new fe(1,1,1,c):void 0;c===void 0&&(c=1),u&&(c=1),p&&p.w<=.05&&(p.w=.05),s[d]={texture:n,scale:p};const g=n.channel>0?"st"+n.channel:"st";r.add(n.channel);const f=I0.includes(n.format),y={1e3:"repeat",1001:"clamp",1002:"mirror"},v=n.repeat.clone(),b=n.offset.clone(),_=n.rotation,w=Math.sin(_),x=Math.cos(_);b.y=1-b.y-v.y,t?(v.x===0&&(v.x=1e-4),v.y===0&&(v.y=1e-4),b.x=b.x/v.x,b.y=b.y/v.y,b.x+=w/v.x,b.y+=x-1):(b.x+=w*v.x,b.y+=(1-x)*v.y);const k=ap(o),M=v.x!=1||v.y!=1||b.x!=0||b.y!=0||_!=0,T=`${Kt}/${k}/${"uvReader_"+g}.outputs:result>`,L=`${Kt}/${k}/Transform2d_${e}.outputs:result>`,D=e!=="normal"&&l&&(l.r!==1||l.g!==1||l.b!==1||c!==1)||!1,z=e==="normal",j=o instanceof bt&&o.normalScale?o.normalScale.x*2:2,H=j.toFixed(Ae),K=(-1*(j/2)).toFixed(Ae),U=(1-j).toFixed(Ae);return`
|
|
1165
|
+
${M?`def Shader "Transform2d_${e}" (
|
|
1166
|
+
sdrMetadata = {
|
|
1167
|
+
string role = "math"
|
|
1168
|
+
}
|
|
1169
|
+
)
|
|
1170
|
+
{
|
|
1171
|
+
uniform token info:id = "UsdTransform2d"
|
|
1172
|
+
float2 inputs:in.connect = ${T}
|
|
1173
|
+
float2 inputs:scale = ${F1(v)}
|
|
1174
|
+
float2 inputs:translation = ${F1(b)}
|
|
1175
|
+
float inputs:rotation = ${(_/Math.PI*180).toFixed(Ae)}
|
|
1176
|
+
float2 outputs:result
|
|
1177
|
+
}
|
|
1178
|
+
`:""}
|
|
1179
|
+
def Shader "${h}_${e}"
|
|
1180
|
+
{
|
|
1181
|
+
uniform token info:id = "UsdUVTexture"
|
|
1182
|
+
asset inputs:file = @textures/${d}.${f?"png":"jpg"}@
|
|
1183
|
+
token inputs:sourceColorSpace = "${n.colorSpace==="srgb"?"sRGB":"raw"}"
|
|
1184
|
+
float2 inputs:st.connect = ${M?L:T}
|
|
1185
|
+
${D?`
|
|
1186
|
+
float4 inputs:scale = (${l?l.r+", "+l.g+", "+l.b:"1, 1, 1"}, ${c})
|
|
1187
|
+
`:""}
|
|
1188
|
+
${z?`
|
|
1189
|
+
float4 inputs:scale = (${H}, ${H}, ${H}, 1)
|
|
1190
|
+
float4 inputs:bias = (${K}, ${K}, ${U}, 0)
|
|
1191
|
+
`:""}
|
|
1192
|
+
token inputs:wrapS = "${y[n.wrapS]}"
|
|
1193
|
+
token inputs:wrapT = "${y[n.wrapT]}"
|
|
1194
|
+
float outputs:r
|
|
1195
|
+
float outputs:g
|
|
1196
|
+
float outputs:b
|
|
1197
|
+
float3 outputs:rgb
|
|
1198
|
+
${o.transparent||o.alphaTest>0?"float outputs:a":""}
|
|
1199
|
+
}`}function oA(n,e,t=!1){var s,o,r;const l=ap(n);if(n.colorWrite===!1||((s=n.userData)==null?void 0:s.isShadowCatcherMaterial)||((o=n.userData)==null?void 0:o.isLightBlendMaterial)){const y=n.userData.isLightBlendMaterial||n.userData.isShadowCatcherMaterial?"ND_realitykit_shadowreceiver_surfaceshader":"ND_realitykit_occlusion_surfaceshader";return`
|
|
1200
|
+
|
|
1201
|
+
def Material "${l}" ${n.name?`(
|
|
1202
|
+
displayName = "${n.name}"
|
|
1203
|
+
)`:""}
|
|
1204
|
+
{
|
|
1205
|
+
token outputs:mtlx:surface.connect = ${Kt}/${l}/Occlusion.outputs:out>
|
|
1206
|
+
|
|
1207
|
+
def Shader "Occlusion"
|
|
1208
|
+
{
|
|
1209
|
+
uniform token info:id = "${y}"
|
|
1210
|
+
token outputs:out
|
|
1211
|
+
}
|
|
1212
|
+
}`}const c=" ",h=[],d=[],u=new Set;if(n.isMeshPhysicalNodeMaterial===!0)return NE(n,l,e);let p=n.transparent||n.alphaTest?n.opacity:1,g=!1,f=!1;if(n instanceof Bm&&n.transmission!==void 0&&(p*=1-n.transmission*(1-n.roughness*.5)),n.map?(h.push(`${c}color3f inputs:diffuseColor.connect = ${Kt}/${l}/${ls(n.map)}_diffuse.outputs:rgb>`),n instanceof Me&&n.transparent&&n.alphaTest==0&&t?(h.push(`${c}float inputs:opacity.connect = ${Kt}/${l}/${ls(n.map)}_diffuse.outputs:a>`),g=!0,h.push(`${c}float inputs:opacityThreshold = ${1e-10}`),f=!0):n.transparent?(h.push(`${c}float inputs:opacity.connect = ${Kt}/${l}/${ls(n.map)}_diffuse.outputs:a>`),g=!0):n.alphaTest>0&&(h.push(`${c}float inputs:opacity.connect = ${Kt}/${l}/${ls(n.map)}_diffuse.outputs:a>`),g=!0,h.push(`${c}float inputs:opacityThreshold = ${n.alphaTest}`),f=!0),d.push(No(n.map,"diffuse",t,e,n,u,n.color,p))):h.push(`${c}color3f inputs:diffuseColor = ${B1(n.color)}`),n.alphaHash&&t&&(f?console.warn("Opacity threshold for "+n.name+" was already connected. Skipping alphaHash opacity threshold."):(h.push(`${c}float inputs:opacityThreshold = 0.0000000001`),f=!0)),n.aoMap&&(h.push(`${c}float inputs:occlusion.connect = ${Kt}/${l}/${ls(n.aoMap)}_occlusion.outputs:r>`),d.push(No(n.aoMap,"occlusion",t,e,n,u))),n.alphaMap?(h.push(`${c}float inputs:opacity.connect = ${Kt}/${l}/${ls(n.alphaMap)}_opacity.outputs:r>`),h.push(`${c}float inputs:opacityThreshold = 0.0000000001`),g=!0,f=!0,d.push(No(n.alphaMap,"opacity",t,e,n,u,new oe(1,1,1),p))):(g?console.warn("Opacity for "+n.name+" was already connected. Skipping default opacity."):(h.push(`${c}float inputs:opacity = ${p}`),g=!0),n.alphaTest>0&&(f?console.warn("Opacity threshold for "+n.name+" was already connected. Skipping default opacity threshold."):(h.push(`${c}float inputs:opacityThreshold = ${n.alphaTest}`),f=!0))),n instanceof bt){if(n.emissiveMap){h.push(`${c}color3f inputs:emissiveColor.connect = ${Kt}/${l}/${ls(n.emissiveMap)}_emissive.outputs:rgb>`);const y=n.emissive.clone();y.multiplyScalar(n.emissiveIntensity),d.push(No(n.emissiveMap,"emissive",t,e,n,u,y))}else if(((r=n.emissive)==null?void 0:r.getHex())>0){const y=n.emissive.clone();y.multiplyScalar(n.emissiveIntensity),h.push(`${c}color3f inputs:emissiveColor = ${B1(y)}`)}n.normalMap&&(h.push(`${c}normal3f inputs:normal.connect = ${Kt}/${l}/${ls(n.normalMap)}_normal.outputs:rgb>`),d.push(No(n.normalMap,"normal",t,e,n,u))),n.roughnessMap&&n.roughness===1?(h.push(`${c}float inputs:roughness.connect = ${Kt}/${l}/${ls(n.roughnessMap)}_roughness.outputs:g>`),d.push(No(n.roughnessMap,"roughness",t,e,n,u))):h.push(`${c}float inputs:roughness = ${n.roughness!==void 0?n.roughness:1}`),n.metalnessMap&&n.metalness===1?(h.push(`${c}float inputs:metallic.connect = ${Kt}/${l}/${ls(n.metalnessMap)}_metallic.outputs:b>`),d.push(No(n.metalnessMap,"metallic",t,e,n,u))):h.push(`${c}float inputs:metallic = ${n.metalness!==void 0?n.metalness:0}`)}return n instanceof Bm&&(h.push(`${c}float inputs:clearcoat = ${n.clearcoat}`),h.push(`${c}float inputs:clearcoatRoughness = ${n.clearcoatRoughness}`),h.push(`${c}float inputs:ior = ${n.ior}`),!n.transparent&&!(n.alphaTest>0)&&n.transmissionMap&&(h.push(`${c}float inputs:opacity.connect = ${Kt}/${l}/${ls(n.transmissionMap)}_transmission.outputs:r>`),d.push(No(n.transmissionMap,"transmission",t,e,n,u)))),u.size>2?console.warn("USDZExporter: Material "+n.name+" uses more than 2 UV channels. Currently, only UV0 and UV1 are supported."):u.size===2&&(!u.has(0)||!u.has(1))&&console.warn("USDZExporter: Material "+n.name+" uses UV channels other than 0 and 1. Currently, only UV0 and UV1 are supported."),`
|
|
1213
|
+
|
|
1214
|
+
def Material "${l}" ${n.name?`(
|
|
1215
|
+
displayName = "${_1(n.name)}"
|
|
1216
|
+
)`:""}
|
|
1217
|
+
{
|
|
1218
|
+
token outputs:surface.connect = ${Kt}/${l}/PreviewSurface.outputs:surface>
|
|
1219
|
+
|
|
1220
|
+
def Shader "PreviewSurface"
|
|
1221
|
+
{
|
|
1222
|
+
uniform token info:id = "UsdPreviewSurface"
|
|
1223
|
+
${h.join(`
|
|
1224
|
+
`)}
|
|
1225
|
+
int inputs:useSpecularWorkflow = ${n instanceof Me?"1":"0"}
|
|
1226
|
+
token outputs:surface
|
|
1227
|
+
}
|
|
1228
|
+
${d.length>0?`
|
|
1229
|
+
${u.has(0)?`
|
|
1230
|
+
def Shader "uvReader_st"
|
|
1231
|
+
{
|
|
1232
|
+
uniform token info:id = "UsdPrimvarReader_float2"
|
|
1233
|
+
token inputs:varname = "st"
|
|
1234
|
+
float2 inputs:fallback = (0.0, 0.0)
|
|
1235
|
+
float2 outputs:result
|
|
1236
|
+
}
|
|
1237
|
+
`:""}
|
|
1238
|
+
${u.has(1)?`
|
|
1239
|
+
def Shader "uvReader_st1"
|
|
1240
|
+
{
|
|
1241
|
+
uniform token info:id = "UsdPrimvarReader_float2"
|
|
1242
|
+
token inputs:varname = "st1"
|
|
1243
|
+
float2 inputs:fallback = (0.0, 0.0)
|
|
1244
|
+
float2 outputs:result
|
|
1245
|
+
}
|
|
1246
|
+
`:""}
|
|
1247
|
+
${d.join(`
|
|
1248
|
+
`)}`:""}
|
|
1249
|
+
}`}function B1(n){return`(${n.r}, ${n.g}, ${n.b})`}function F1(n){return`(${n.x}, ${n.y})`}const I0=[1023,33777,33778,33779,35842,35843,37496,37808,37809,37810,37811,37812,37813,37814,37815,37816,37817,37818,37819,37820,37821,36492];C("debugusdz");const U1=class xC{constructor(e,t,s){a(this,"id"),a(this,"trigger"),a(this,"action"),a(this,"exclusive",!1),this.id="Behavior_"+as(e)+"_"+xC.global_id++,this.trigger=t,this.action=s}makeExclusive(e){return this.exclusive=e,this}writeTo(e,t,s){if(!this.trigger||!this.action)return;s.beginBlock(`def Preliminary_Behavior "${this.id}"`);let o="";if(Array.isArray(this.trigger)){o="[";for(let r=0;r<this.trigger.length;r++){const l=this.trigger[r];o+="<"+l.id+">",r+1<this.trigger.length&&(o+=", ")}o+="]"}else o=`<${this.trigger.id}>`;if(s.appendLine(`rel triggers = ${o}`),s.appendLine(`rel actions = <${this.action.id}>`),s.appendLine(`uniform bool exclusive = ${this.exclusive?1:0}`),s.appendLine(),Array.isArray(this.trigger))for(const r of this.trigger)r.writeTo(t,s),s.appendLine();else this.trigger.writeTo(t,s);s.appendLine(),this.action.writeTo(t,s),s.closeBlock()}};a(U1,"global_id",0);let Jt=U1;const cl=new Set;function L0(n,e){var t,s;let o="";if(Array.isArray(n)){cl.clear();let r="[ ";for(let l=0;l<n.length;l++){let c=n[l];if(!c){console.warn("Invalid target object in behavior",n+". Is the object exported?");continue}if(typeof c=="string"){if(cl.has(c))continue;r+=c,cl.add(c)}else if(typeof c=="object"){if(c.isObject3D&&(c=e.findById(c.uuid),!c)){console.warn("Invalid target object in behavior",n+". Is the object exported?");continue}const h=(t=c.getPath)==null?void 0:t.call(c);if(cl.has(h))continue;r+=h,cl.add(h)}l+1<n.length&&(r+=", ")}r+=" ]",o=r,cl.clear()}else if(typeof n=="object"){const r=n;if(r.isObject3D&&(n=e.findById(r.uuid)),!n)throw console.error("Invalid target object in behavior, the target object is likely missing from USDZ export. Is the object exported?",r),new Error(`Invalid target object in behavior, the target object is likely missing from USDZ export. Please report a bug. uuid: ${r.uuid}.`);o=(s=n.getPath)==null?void 0:s.call(n)}return o}const z1=class SC{constructor(e,t){a(this,"id"),a(this,"targetId"),a(this,"tokenId"),a(this,"type"),a(this,"distance"),e&&(this.targetId=e),t?this.id=t:this.id="Trigger_"+SC.global_id++}writeTo(e,t){t.beginBlock(`def Preliminary_Trigger "${this.id}"`),this.targetId&&(typeof this.targetId!="string"&&(this.targetId=L0(this.targetId,e)),t.appendLine("rel affectedObjects = "+this.targetId)),this.tokenId&&t.appendLine(`token info:id = "${this.tokenId}"`),this.type&&t.appendLine(`token type = "${this.type}"`),typeof this.distance=="number"&&t.appendLine(`double distance = ${this.distance}`),t.closeBlock()}};a(z1,"global_id",0);let hl=z1;function N1(n,e={direct:!0,indirect:!0}){const t=mi.createEmpty();t.name="InputTarget_"+t.name,t.displayName=void 0,t.type="RealityKitComponent",t.onSerialize=s=>{s.appendLine("bool allowsDirectInput = "+(e.direct?1:0)),s.appendLine("bool allowsIndirectInput = "+(e.indirect?1:0)),s.appendLine('uniform token info:id = "RealityKit.InputTarget"')},n.add(t)}class At{static sceneStartTrigger(){if(this.__sceneStartTrigger!==void 0)return this.__sceneStartTrigger;const e=new hl(void 0,"SceneStart");return e.tokenId="SceneTransition",e.type="enter",this.__sceneStartTrigger=e,e}static tapTrigger(e,t={direct:!0,indirect:!0}){const s=new hl(e);if(Array.isArray(e)&&e.length>1)for(const o of e)o instanceof mi&&N1(o,t);else e instanceof mi&&N1(e,t);return s.tokenId="TapGesture",s}static isTapTrigger(e){return e?.tokenId==="TapGesture"}static proximityToCameraTrigger(e,t){const s=new hl(e);return s.tokenId="ProximityToCamera",s.distance=t,s}}a(At,"__sceneStartTrigger");class Wo{constructor(e,t){a(this,"id"),a(this,"actions"),a(this,"loops",0),a(this,"performCount",1),a(this,"type","serial"),a(this,"multiplePerformOperation"),this.id=e,this.actions=t}static getId(){return this.global_id++}addAction(e){return this.actions.push(e),this}makeParallel(){return this.type="parallel",this}makeSequence(){return this.type="serial",this}makeLooping(){return this.loops=1,this.performCount=0,this}makeRepeat(e){return this.performCount=e,this}writeTo(e,t){t.beginBlock(`def Preliminary_Action "${this.id}"`),t.beginArray("rel actions");for(const s of this.actions){if(!s)continue;const o=s===this.actions[this.actions.length-1];t.appendLine("<"+s.id+">"+(o?"":", "))}t.closeArray(),t.appendLine(),t.appendLine('token info:id = "Group"'),t.appendLine(`bool loops = ${this.loops}`),t.appendLine(`int performCount = ${this.loops>0?0:Math.max(0,this.performCount)}`),t.appendLine(`token type = "${this.type}"`),typeof this.multiplePerformOperation=="string"&&t.appendLine(`token multiplePerformOperation = "${this.multiplePerformOperation}"`),t.appendLine();for(const s of this.actions)s&&(s.writeTo(e,t),t.appendLine());t.closeBlock()}}a(Wo,"global_id",0);const W1=class bv{constructor(e,t){a(this,"id"),a(this,"tokenId"),a(this,"affectedObjects"),a(this,"easeType"),a(this,"motionType"),a(this,"duration"),a(this,"moveDistance"),a(this,"style"),a(this,"type"),a(this,"front"),a(this,"up"),a(this,"start"),a(this,"animationSpeed"),a(this,"reversed"),a(this,"pingPong"),a(this,"xFormTarget"),a(this,"audio"),a(this,"gain"),a(this,"auralMode"),a(this,"multiplePerformOperation"),a(this,"velocity"),a(this,"comment"),a(this,"animationName"),e&&(this.affectedObjects=e),t?this.id=t:this.id="Action",this.id+="_"+bv.global_id++}clone(){const e=new bv,t=e.id;return Object.assign(e,this),e.id=t,e}writeTo(e,t){t.beginBlock(`def Preliminary_Action "${this.id}"`),this.comment&&t.appendLine(`# ${this.comment}`),this.affectedObjects&&(typeof this.affectedObjects!="string"&&(this.affectedObjects=L0(this.affectedObjects,e)),t.appendLine("rel affectedObjects = "+this.affectedObjects)),typeof this.duration=="number"&&(typeof this.animationSpeed=="number"&&this.animationSpeed!==1?t.appendLine(`double duration = ${this.duration/this.animationSpeed} `):t.appendLine(`double duration = ${this.duration} `)),this.easeType&&t.appendLine(`token easeType = "${this.easeType}"`),this.tokenId&&t.appendLine(`token info:id = "${this.tokenId}"`),this.tokenId==="ChangeScene"&&t.appendLine("rel scene = </StageRoot/Scenes/Scene>"),this.motionType!==void 0&&t.appendLine(`token motionType = "${this.motionType}"`),typeof this.moveDistance=="number"&&t.appendLine(`double moveDistance = ${this.moveDistance} `),this.style&&t.appendLine(`token style = "${this.style}"`),this.type&&t.appendLine(`token type = "${this.type}"`),this.front&&t.appendLine(`vector3d front = (${this.front.x}, ${this.front.y}, ${this.front.z})`),this.up&&t.appendLine(`vector3d upVector = (${this.up.x}, ${this.up.y}, ${this.up.z})`),typeof this.start=="number"&&t.appendLine(`double start = ${this.start} `),typeof this.animationSpeed=="number"&&t.appendLine(`double animationSpeed = ${this.animationSpeed.toFixed(2)} `),typeof this.reversed=="boolean"&&t.appendLine(`bool reversed = ${this.reversed}`),typeof this.pingPong=="boolean"&&t.appendLine(`bool reverses = ${this.pingPong}`),this.xFormTarget&&(typeof this.xFormTarget!="string"&&(this.xFormTarget=L0(this.xFormTarget,e)),t.appendLine(`rel xformTarget = ${this.xFormTarget}`)),typeof this.audio=="string"&&t.appendLine(`asset audio = @${this.audio}@`),typeof this.gain=="number"&&t.appendLine(`double gain = ${this.gain}`),typeof this.auralMode=="string"&&t.appendLine(`token auralMode = "${this.auralMode}"`),typeof this.multiplePerformOperation=="string"&&t.appendLine(`token multiplePerformOperation = "${this.multiplePerformOperation}"`),typeof this.velocity=="object"&&t.appendLine(`vector3d velocity = (${this.velocity.x}, ${this.velocity.y}, ${this.velocity.z})`),t.closeBlock()}};a(W1,"global_id",0);let ks=W1;class fs{constructor(e,t,s){a(this,"x",0),a(this,"y",0),a(this,"z",0),this.x=e,this.y=t,this.z=s}static get up(){return new fs(0,1,0)}static get right(){return new fs(1,0,0)}static get forward(){return new fs(0,0,1)}static get back(){return new fs(0,0,-1)}static get zero(){return new fs(0,0,0)}}class ve{static sequence(...e){return new Wo("Group_"+Wo.getId(),e).makeSequence()}static parallel(...e){return new Wo("Group_"+Wo.getId(),e).makeParallel()}static fadeAction(e,t,s){const o=new ks(e);return o.tokenId="Visibility",o.type=s?"show":"hide",o.duration=t,o.style="basic",o.motionType="none",o.moveDistance=0,o.easeType="none",o}static startAnimationAction(e,t,s=!1,o=!1){const r=new ks(e);r.tokenId="StartAnimation";const l=t.start,c=t.duration,h=t.speed,d=t.clipName;if(r.comment=`Animation: ${d}, start=${l*60}, length=${c*60}, end=${(l+c)*60}`,r.animationName=d,r.start=l,r.duration=c,r.animationSpeed=h,r.reversed=s,r.pingPong=o,r.multiplePerformOperation="allow",s&&(r.start-=c),o){r.pingPong=!1;const u=r.clone();return u.reversed=!s,u.start=r.start,u.reversed&&(u.start-=c),ve.sequence(r,u)}return r}static waitAction(e){const t=new ks;return t.tokenId="Wait",t.duration=e,t.motionType=void 0,t}static lookAtCameraAction(e,t,s,o){const r=new ks(e);return r.tokenId="LookAtCamera",r.duration=t===void 0?9999999999999:t,r.front=s??fs.forward,r.up=o??fs.up,r}static emphasize(e,t,s="bounce",o=1,r="basic"){const l=new ks(e);return l.tokenId="Emphasize",l.duration=t,l.style=r??"basic",l.motionType=s,l.moveDistance=o,l}static transformAction(e,t,s,o,r="inout"){const l=new ks(e);return l.tokenId="Transform",l.duration=s,l.duration=Math.max(1e-6,s),l.type=o,l.easeType=s>0?r:"none",Array.isArray(t)&&console.error("Transform target must not be an array",t),l.xFormTarget=t,l}static playAudioAction(e,t,s="play",o=1,r="spatial"){const l=new ks(e);return l.tokenId="Audio",l.type=s,l.audio=t,l.gain=o,l.auralMode=r,l.multiplePerformOperation="allow",l}static impulseAction(e,t){const s=new ks(e);return s.tokenId="Impulse",s.velocity=t,s}}class rA{constructor(e){a(this,"object"),a(this,"model"),this.object=e}get id(){return this.object.uuid}apply(e){if(!this.model&&(this.model=e.findById(this.object.uuid),!this.model)){console.error("could not find model with id "+this.object.uuid);return}this.onApply(e)}}class j0 extends rA{constructor(e,t,s,o){super(e),a(this,"matrix"),a(this,"material"),a(this,"geometry"),a(this,"_enableAction"),a(this,"_disableAction"),this.matrix=t,this.material=s,this.geometry=o}onApply(e){var t,s;const o=this.model;if(!o)return;(t=o.parent)!=null&&t.isDynamic||mi.createEmptyParent(o);const r=o.clone();this.matrix&&r.setMatrix(this.matrix),this.material&&(r.material=this.material),this.geometry&&(r.geometry=this.geometry),(s=o.parent)==null||s.add(r)}enable(){return this._enableAction?this._enableAction:(this._enableAction=ve.fadeAction(this.object,0,!0),this._enableAction)}disable(){return this._disableAction?this._disableAction:(this._disableAction=ve.fadeAction(this.object,0,!1),this._disableAction)}}class V1{constructor(e){a(this,"actions"),a(this,"sortedActions"),this.actions=[...e]}organize(){this.sortedActions={};for(const e of this.actions){const t=e.id;this.sortedActions[t]||(this.sortedActions[t]=[]),this.sortedActions[t].push(e)}}getActions(e){return this.sortedActions||this.organize(),this.sortedActions[e.uuid]}}const dn=C("debugusdzanimation"),D0=C("debugusdzanimationserialization");class mr{constructor(e,t,s){a(this,"_start"),a(this,"ext"),a(this,"root"),a(this,"_nearestAnimatedRoot"),a(this,"clip"),a(this,"speed"),this.ext=e,this.root=t,this.clip=s,this._nearestAnimatedRoot=this.getNearestAnimatedRoot()}get start(){return this._start===void 0&&(this._start=this.ext.getStartTimeByClip(this.clip)),this._start}get duration(){var e;return((e=this.clip)==null?void 0:e.duration)??ut.restPoseClipDuration}get nearestAnimatedRoot(){return this._nearestAnimatedRoot}get clipName(){var e;return((e=this.clip)==null?void 0:e.name)??"rest"}static isDescendantOf(e,t){let s=t;if(!s||!e)return!1;for(;s;){if(!s)return!1;if(s===e)return!0;s=s.parent}return!1}getNearestAnimatedRoot(){var e;let t;try{for(const s of((e=this.clip)==null?void 0:e.tracks)??[]){const o=Ca.parseTrackName(s.name);let r=Ca.findNode(this.root,o.nodeName);if(r)if(!t)t=r;else{if(r===t||mr.isDescendantOf(t,r))continue;if(!mr.isDescendantOf(r,t)){for(;!mr.isDescendantOf(r,t)&&r.parent;)r=r.parent;mr.isDescendantOf(r,t)||console.error("USDZExporter: Animation clip targets multiple roots that are not parent/child. Please report a bug",this.root,this.clip,t,r)}t=r}}}catch(s){console.error("USDZExporter: Exception when trying to find nearest animated root. Please report a bug",s),t=void 0}return t}}const hp=class Sm{constructor(e,t,s){if(a(this,"clip"),a(this,"pos"),a(this,"rot"),a(this,"scale"),a(this,"root"),a(this,"target"),a(this,"duration",0),a(this,"useRootMotion",!1),this.root=e,this.target=t,this.clip=s,s?this.duration=s.duration:this.duration=Sm.restPoseClipDuration,s&&s.tracks){const r=Math.max(...s.tracks.map(l=>l.times[l.times.length-1]));r!==this.duration&&(console.warn("USDZExporter: Animation clip duration does not match the maximum time value in the tracks.",s,r,this.duration),this.duration=r)}const o=P.getComponent(e,Rt);o&&(this.useRootMotion=o.applyRootMotion)}addTrack(e){var t,s;if(!this.clip){console.error("This is a rest clip but you're trying to add tracks to it \u2013 this is likely a bug");return}e.name.endsWith("position")?this.pos=e:e.name.endsWith("quaternion")?this.rot=e:e.name.endsWith("scale")?this.scale=e:(e.name.endsWith("activeSelf")?console.warn("[USDZ] Animation of enabled/disabled state is not supported for USDZ export and will NOT be exported: "+e.name+" on "+(((t=this.root)==null?void 0:t.name)??this.target.name)+". Animate scale 0/1 instead."):console.warn("[USDZ] Animation track type not supported for USDZ export and will NOT be exported: "+e.name+" on "+(((s=this.root)==null?void 0:s.name)??this.target.name)+". Only .position, .rotation, .scale are supported."),F()&&be("[USDZ] Some animations can't be exported. See console for details."))}getFrames(){var e,t,s,o,r,l;return this.clip?Math.max(((t=(e=this.pos)==null?void 0:e.times)==null?void 0:t.length)??0,((o=(s=this.rot)==null?void 0:s.times)==null?void 0:o.length)??0,((l=(r=this.scale)==null?void 0:r.times)==null?void 0:l.length)??0):2}getDuration(){return this.duration}getSortedTimesArray(e=!0,t=!0,s=!0){var o,r,l;if(!this.clip)return[0,this.duration];const c=(o=this.pos)==null?void 0:o.times,h=(r=this.rot)==null?void 0:r.times,d=(l=this.scale)==null?void 0:l.times,u=[];if(e&&c)for(const p of c)u.push(p);if(t&&h)for(const p of h)u.push(p);if(s&&d)for(const p of d)u.push(p);return u.includes(0)||u.push(0),u.sort((p,g)=>p-g),[...new Set(u)]}*getValues(e,t=!0,s=!0,o=!0){var r,l,c;const h=new S,d=new V,u=new S(1,1,1),p=this.target,g=t?(r=this.pos)==null?void 0:r.createInterpolant():void 0,f=s?(l=this.rot)==null?void 0:l.createInterpolant():void 0,y=o?(c=this.scale)==null?void 0:c.createInterpolant():void 0;g||h.set(p.position.x,p.position.y,p.position.z),f||d.set(p.quaternion.x,p.quaternion.y,p.quaternion.z,p.quaternion.w),y||u.set(p.scale.x,p.scale.y,p.scale.z),g&&g.valueSize!==3&&(g.valueSize=3),f&&f.valueSize!==4&&(f.valueSize=4),y&&y.valueSize!==3&&(y.valueSize=3);const v=0;for(let b=0-v;b<e.length+v;b++){let _=0,w=0;if(b<0?(_=e[0],w=_-Sm.animationDurationPadding/2+1/60):b>=e.length?(_=e[e.length-1],w=_+Sm.animationDurationPadding/2-1/60):(_=e[b],w=_),g){const x=g.evaluate(_);h.set(x[0],x[1],x[2])}if(f){const x=f.evaluate(_);d.set(x[0],x[1],x[2],x[3])}if(y){const x=y.evaluate(_);u.set(x[0],x[1],x[2])}if(this.useRootMotion&&p===this.root){const x=new se;x.compose(h,d,u),x.multiply(p.matrix),x.decompose(h,d,u)}yield{time:w,translation:h,rotation:d,scale:u,index:b}}}};a(hp,"frameRate",60),a(hp,"animationDurationPadding",6/60),a(hp,"restPoseClipDuration",6/60);let ut=hp;class dp{constructor(e){a(this,"dict",new Map),a(this,"rootTargetMap",new Map),a(this,"rootAndClipToRegisteredAnimationMap",new Map),a(this,"rootToRegisteredClip",new Map),a(this,"lastClipEndTime",0),a(this,"clipToStartTime",new Map),a(this,"clipToHoldClip",new Map),a(this,"serializers",[]),a(this,"injectRestPoses",!1),a(this,"injectImplicitBehaviours",!1),this.injectRestPoses=e,this.injectImplicitBehaviours=e}get extensionName(){return"animation"}get animationData(){return this.dict}get registeredClips(){return this.clipToStartTime.keys()}get animatedRoots(){return this.rootTargetMap.keys()}get holdClipMap(){return this.clipToHoldClip}getStartTimeCode(){return!this.injectRestPoses||this.rootAndClipToRegisteredAnimationMap.size===0?0:(ut.restPoseClipDuration+ut.animationDurationPadding)*60}getEndTimeCode(){let e=0;for(const[t,s]of this.rootAndClipToRegisteredAnimationMap){const o=s.start+s.duration;o>e&&(e=o)}return e*60}getClipCount(e){var t;return((t=this.rootToRegisteredClip.get(e))==null?void 0:t.length)??0??0}getStartTimeByClip(e){return e?this.clipToStartTime.has(e)?this.clipToStartTime.get(e):(console.error("USDZExporter: Missing start time for clip \u2013 please report a bug.",e),0):0}registerAnimation(e,t){var s;if(!e)return null;this.rootTargetMap.has(e)||this.rootTargetMap.set(e,[]);const o=e.uuid+(t?.uuid??"-rest");if(this.rootAndClipToRegisteredAnimationMap.has(o))return this.rootAndClipToRegisteredAnimationMap.get(o);dn&&console.log("registerAnimation",e,t);const r=this.injectRestPoses?1:0,l=(((s=this.rootToRegisteredClip.get(e))==null?void 0:s.length)??0)+r,c=this.rootTargetMap.get(e),h=new Set(c);if(t&&t.tracks)for(const u of t.tracks){const p=Ca.parseTrackName(u.name),g=Ca.findNode(e,p.nodeName);if(!g){console.warn("no object found for track",u.name,"using "+e.name+" instead");continue}this.dict.has(g)||this.dict.set(g,[]);const f=this.dict.get(g);if(!f){console.warn("no transform data found for target ",g,"at slot "+l+", this is likely a bug");continue}h.delete(g),this.injectRestPoses&&!f[0]&&(console.log("Injecting rest pose",g,t,"at slot",l),f[0]=new ut(null,g,null));let y=f[l];y||(y=new ut(e,g,t),f[l]=y),y.addTrack(u),c!=null&&c.includes(g)||c==null||c.push(g)}dn&&console.log("Unregistered nodes for this clip",h,"clip",t,"at slot",l,"for root",e,"targets",c);for(const u of h){const p=this.dict.get(u);if(!p)continue;if(this.injectRestPoses&&!p[0]){console.warn("Adding rest pose for ",u,t,"at slot",l,"This is likely a bug, should have been added earlier.");const f=new ut(null,u,null);p[0]=f}let g=p[l];g||(dn&&console.log("Adding padding clip for ",u,t,"at slot",l),g=new ut(e,u,t),p[l]=g)}const d=new mr(this,e,t);if(this.rootAndClipToRegisteredAnimationMap.set(o,d),dn&&console.log({root:e,clip:t,info:d}),t){const u=this.rootToRegisteredClip.get(e);if(u?u.push(t):this.rootToRegisteredClip.set(e,[t]),!this.clipToStartTime.get(t)){this.lastClipEndTime==null&&(this.lastClipEndTime=ut.restPoseClipDuration);let p=this.lastClipEndTime+ut.animationDurationPadding,g=p+t.duration;const f=Math.round(p*60)/60,y=Math.round(g*60)/60;Math.abs(f-p)<.01&&(p=f),Math.abs(y-g)<.01&&(g=y),p=Math.ceil(p),g=p+t.duration,this.clipToStartTime.set(t,p),this.lastClipEndTime=g}}return d}onAfterHierarchy(e){dn&&console.log("Animation clips per animation target node",this.dict)}onAfterBuildDocument(e){var t,s;dn&&console.log("Animation data",{dict:this.dict,rootTargetMap:this.rootTargetMap,rootToRegisteredClip:this.rootToRegisteredClip});for(const o of this.rootTargetMap.keys()){const r=this.rootTargetMap.get(o);if(!r)continue;let l;const c=[];for(const h of r){const d=this.dict.get(h);if(!d){console.error("No data found for target on USDZ export \u2013 please report a bug!",h);continue}l===void 0&&(l=d?.length),l!==d?.length&&console.error("Different array lengths for targets \u2013 please report a bug!",d);for(let u=0;u<d.length;u++){let p=d[u];if(!p){const f=u-(this.injectRestPoses?1:0);d[u]=new ut(null,h,this.rootToRegisteredClip.get(o)[f]),p=d[u]}const g=p.getDuration();if(c[u]===void 0)c[u]=g;else if(c[u]!==g){console.error("Error during UDSZ export: Encountered different animation durations for animated targets. Please report a bug!",{datas:d,target:h}),c[u]=g;continue}}}}for(const o of this.serializers){const r=(t=o.model)==null?void 0:t.parent,l=r?.isDynamic===!0;D0&&console.log(l,(s=o.model)==null?void 0:s.parent),l&&o.registerCallback(r)}}onExportObject(e,t,s){P.foreachComponent(e,r=>{const l=r;typeof l.createAnimation=="function"&&l.createAnimation(this,t,s)},!1);const o=new aA(e,this);this.serializers.push(o),o.registerCallback(t)}}class aA{constructor(e,t){a(this,"model"),a(this,"object"),a(this,"animationData"),a(this,"ext"),a(this,"callback"),this.object=e,this.animationData=t.animationData,this.ext=t}registerCallback(e){this.model&&this.callback&&this.model.removeEventListener("serialize",this.callback),this.callback||(this.callback=this.onSerialize.bind(this)),D0&&console.log("REPARENT",e),this.model=e,this.callback&&this.model.addEventListener("serialize",this.callback)}skinnedMeshExport(e,t,s){var o;const r=this.model,l=this.animationData;if(r&&r.skinnedMesh){let c=function(U){const B=[];for(const[Q,te]of U){let ae=`${Q} : [`;const le=[];for(const ye of te)le.push(`(${ue(ye.x)}, ${ue(ye.y)}, ${ue(ye.z)})`);ae=ae.concat(le.join(", ")),ae=ae.concat("],"),B.push(ae)}return B},h=function(U){const B=[];for(const[Q,te]of U){let ae=`${Q} : [`;const le=[];for(const ye of te)le.push(`(${ue(ye.w)}, ${ue(ye.x)}, ${ue(ye.y)}, ${ue(ye.z)})`);ae=ae.concat(le.join(", ")),ae=ae.concat("],"),B.push(ae)}return B},d=function(U){let B,Q=!0;const te=new Map;for(const[le,ye]of U){B===void 0&&(B=ye.length),B!==ye.length&&(Q=!1);let He=0;for(const vt of ye)He++,vt||(te.has(le)||te.set(le,[]),te.get(le).push(He))}dn&&console.log("Bone count: ",U.size,"TransformData entries per bone: ",B,"Undefined bone entries: ",te),console.assert(Q,"All bones should have the same number of TransformData entries",U),console.assert(te.size===0,"All TransformData entries should be set",te);const ae=[];for(const[le,ye]of U)for(let He=0;He<ye.length;He++){const vt=ye[He],gr=s.getStartTimeByClip(vt.clip);ae.length<=He&&ae.push({pos:[],rot:[],scale:[],timeOffset:gr});const ho=ae[He];ho.pos.push(...vt.getSortedTimesArray(!0,!1,!1)),ho.rot.push(...vt.getSortedTimesArray(!1,!0,!1)),ho.scale.push(...vt.getSortedTimesArray(!1,!1,!0))}for(const le of ae)le.pos.sort((ye,He)=>ye-He),le.rot.sort((ye,He)=>ye-He),le.scale.sort((ye,He)=>ye-He),le.pos=[...new Set(le.pos)],le.rot=[...new Set(le.rot)],le.scale=[...new Set(le.scale)];return ae},u=function(U,B,Q){const te=new Map,ae=new Map,le=new Map,ye=B.length;for(const He of Q){const vt=U.get(He);let gr;vt?console.assert(vt.length===ye,"We should have the same number of TransformData entries for each bone",vt,B):gr=new ut(null,He,null);for(let ho=0;ho<ye;ho++){const Om=vt?vt[ho]:gr,wa=B[ho];for(const{time:Nl,translation:Wl}of Om.getValues(wa.pos,!0,!1,!1)){const ys=(Nl+wa.timeOffset)*60;te.has(ys)||te.set(ys,new Array),te.get(ys).push(Wl.clone())}for(const{time:Nl,rotation:Wl}of Om.getValues(wa.rot,!1,!0,!1)){const ys=(Nl+wa.timeOffset)*60;ae.has(ys)||ae.set(ys,new Array),ae.get(ys).push(Wl.clone())}for(const{time:Nl,scale:Wl}of Om.getValues(wa.scale,!1,!1,!0)){const ys=(Nl+wa.timeOffset)*60;le.has(ys)||le.set(ys,new Array),le.get(ys).push(Wl.clone())}}}return{position:te.size==0?void 0:te,quaternion:ae.size==0?void 0:ae,scale:le.size==0?void 0:le}},p=function(U){const B=[];for(const Q of U)B.push(`(${ue(Q.x)}, ${ue(Q.y)}, ${ue(Q.z)})`);return B.join(", ")},g=function(U){const B=[];for(const Q of U)B.push(`(${ue(Q.w)}, ${ue(Q.x)}, ${ue(Q.y)}, ${ue(Q.z)})`);return B.join(", ")},f=function(U){const B=new Map;if(dn){const Q=new Array;for(const[te,ae]of l)Q.push(te.uuid+": "+ae.length+" "+ae.map(le=>{var ye;return(ye=le.clip)==null?void 0:ye.uuid.substring(0,6)}).join(" "));console.log(`getPerBoneTransformData
|
|
1250
|
+
`+Q.join(`
|
|
1251
|
+
`))}for(const Q of U){const te=l.get(Q);te&&B.set(Q,te)}return B},y=function(U){const B=f(U),Q=d(B);return u(B,Q,U)};const v=r.skinnedMesh.skeleton,b=new Array,_=[],w=[];for(const U of v.bones){_.push(U),w.push(U.uuid);const B=v.boneInverses[v.bones.indexOf(U)];b.push({bone:U,inverse:B})}let x=1e4;for(;w.length<v.bones.length&&x-- >0;)for(const U of _){const B=U.children;for(const Q of B)if(w.indexOf(Q.uuid)===-1&&v.bones.indexOf(Q)!==-1){_.push(Q),w.push(Q.uuid);const te=v.boneInverses[v.bones.indexOf(Q)];b.push({bone:Q,inverse:te})}}x<=0&&console.error("Failed to sort bones in skinned mesh",r.skinnedMesh,v.bones,w);for(const U of x1(v.bones))b.push({bone:U,inverse:U.matrixWorld.clone().invert()});const k=b[0].bone.parent;k||console.error("No bone parent found for skinned mesh during USDZ export",r.skinnedMesh),b.sort((U,B)=>ll(U.bone,k)>ll(B.bone,k)?1:-1);const M=t.quickLookCompatible,T=[],L=[],D=[],z=[];for(const{bone:U}of b){if(M){const B=U.scale;B.x==0&&(B.x=1e-5),B.y==0&&(B.y=1e-5),B.z==0&&(B.z=1e-5),T.push(new se().compose(U.position,U.quaternion,U.scale))}else T.push(U.matrix.clone());L.push(U.position),D.push(U.quaternion),z.push(U.scale)}const j=b.map(U=>'"'+ll(U.bone,k)+'"').join(", "),H=b.map(U=>L1(U.inverse.clone().invert())).join(", ");e.beginBlock('def Skeleton "Rig"'),e.appendLine(`uniform matrix4d[] bindTransforms = [${H}]`),e.appendLine(`uniform token[] joints = [${j}]`),e.appendLine('uniform token purpose = "guide"'),e.appendLine(`uniform matrix4d[] restTransforms = [${T.map(U=>L1(U)).join(", ")}]`);const K=y(b.map(U=>U.bone));if(dn){let U=1e7,B=0;for(const Q of((o=K.position)==null?void 0:o.keys())??[])U=Math.min(U,Q),B=Math.max(B,Q);console.log("Time samples",U,B,K)}if(e.beginBlock('def SkelAnimation "_anim"'),e.appendLine(`uniform token[] joints = [${j}]`),e.appendLine(`quatf[] rotations = [${g(D)}]`),K&&K.quaternion){e.beginBlock("quatf[] rotations.timeSamples = {","");const U=h(K.quaternion);for(const B of U)e.appendLine(B);e.closeBlock()}if(e.appendLine(`half3[] scales = [${p(z)}]`),K&&K.scale){e.beginBlock("half3[] scales.timeSamples = {","");const U=c(K.scale);for(const B of U)e.appendLine(B);e.closeBlock()}if(e.appendLine(`float3[] translations = [${p(L)}]`),K&&K.position){e.beginBlock("float3[] translations.timeSamples = {","");const U=c(K.position);for(const B of U)e.appendLine(B);e.closeBlock()}e.closeBlock(),e.closeBlock()}}onSerialize(e,t){if(!this.model)return;const s=this.animationData.get(this.object);if(s)for(let u=0;u<s.length;u++)s[u]===void 0&&(s[u]=new ut(null,this.object,null));const o=this.ext;this.skinnedMeshExport(e,t,o);const r=this.object,l=this.model,c=this.animationData.get(r);if(!c||r.isSkinnedMesh)return;D0&&console.log("SERIALIZE",this.model.name,this.object.type,c);const h=Intl.NumberFormat("en-US",{maximumFractionDigits:3,minimumFractionDigits:0,useGrouping:!1});function d(u,p){var g;if(u.some(f=>f&&{position:f.pos,rotation:f.rot,scale:f.scale}[p])){switch(p){case"position":l.needsTranslate=!0,e.beginBlock("double3 xformOp:translate.timeSamples = {","");break;case"rotation":l.needsOrient=!0,e.beginBlock("quatf xformOp:orient.timeSamples = {","");break;case"scale":l.needsScale=!0,e.beginBlock("double3 xformOp:scale.timeSamples = {","");break}for(let f=0;f<u.length;f++){const y=u[f];if(!y)continue;const v=o.getStartTimeByClip(y.clip),b=y.getSortedTimesArray(p==="position",p==="rotation",p==="scale");if(!b||b.length===0){console.error("got an animated object but no time values?",r,y);continue}const _=!y.clip,w=p==="position"&&(y.pos||_),x=p==="rotation"&&(y.rot||_),k=p==="scale"&&(y.scale||_);if(w||x||k){const M=((g=y.clip)==null?void 0:g.name)??"rest",T=y.getDuration();dn&&console.log("Write .timeSamples:",M,v,T,u),e.appendLine("# "+M+": start="+h.format(v*ut.frameRate)+", length="+h.format(T*ut.frameRate)+", frames="+y.getFrames())}if(w)for(const{time:M,translation:T}of y.getValues(b,!0,!1,!1)){const L=`${h.format((v+M)*ut.frameRate)}: (${ue(T.x)}, ${ue(T.y)}, ${ue(T.z)}),`;e.appendLine(L)}if(x)for(const{time:M,rotation:T}of y.getValues(b,!1,!0,!1)){const L=`${h.format((v+M)*ut.frameRate)}: (${ue(T.w)}, ${ue(T.x)}, ${ue(T.y)}, ${ue(T.z)}),`;e.appendLine(L)}if(k)for(const{time:M,scale:T}of y.getValues(b,!1,!1,!0)){const L=`${h.format((v+M)*ut.frameRate)}: (${ue(T.x)}, ${ue(T.y)}, ${ue(T.z)}),`;e.appendLine(L)}}e.closeBlock()}}d(c,"position"),d(c,"rotation"),d(c,"scale")}}const lA=C("debugusdz");class _a{constructor(){a(this,"files",new Array)}static getName(e){var t;const s=e.split(".").pop();let o=(t=e.split(".").slice(0,-1).join(".").split("/").pop())==null?void 0:t.replace(".","_");return o||(o="Audio_"+Math.random().toString(36).substring(2,15)),as(o)+"."+s}get extensionName(){return"Audio"}onExportObject(e,t,s){const o=P.getComponents(e,ns);if(o.length)for(const r of o){if(!r.clip||typeof r.clip!="string"||!r.playOnAwake)continue;const l=r.clip.split("/").pop()||"Audio",c=_a.getName(r.clip),h=as(c);if(!this.files.some(d=>d.path===r.clip)){this.files.push({path:r.clip,name:c});const d=c.toLowerCase();s.quickLookCompatible&&!d.endsWith(".mp3")&&!d.endsWith(".wav")&&!d.endsWith(".m4a")&&console.error("Audio file "+r.clip+" from "+r.name+" is not an MP3 or WAV file. QuickLook may not support playing it.")}s.quickLookCompatible||t.addEventListener("serialize",(d,u)=>{d.appendLine(),d.beginBlock(`def SpatialAudio "${h}"`,"(",!1),d.appendLine(`displayName = "${l}"`),d.closeBlock(")"),d.beginBlock(),d.appendLine(`uniform asset filePath = @audio/${c}@`),d.appendLine(`uniform token auralMode = "${r.spatialBlend>0?"spatial":"nonSpatial"}"`),d.appendLine(`uniform token playbackMode = "${r.loop?"loopFromStage":"onceFromStart"}"`),d.appendLine(`uniform float gain = ${r.volume}`),d.closeBlock()})}}async onAfterSerialize(e){for(const t of this.files){const s="audio/"+t.name;if(e.files[s]){lA&&console.warn("Audio file with name "+s+" already exists in the context. Skipping.");continue}const o=await(await(await fetch(t.path)).blob()).arrayBuffer(),r=new Uint8Array(o);e.files[s]=r}}}var cA=Object.defineProperty,Ne=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&cA(e,t,o),o};const $1=C("debugusdzbehaviours");function Kc(n){n&&(n.getComponentInParent(Qa)||(F()&&console.debug('Raycaster on "'+n.name+'" was automatically added, because no raycaster was found in the parent hierarchy.'),n.addComponent(ji)))}class Xr extends I{constructor(){super(...arguments),a(this,"object"),a(this,"target"),a(this,"duration",1),a(this,"relativeMotion",!1),a(this,"coroutine",null),a(this,"targetPos",new S),a(this,"targetRot",new V),a(this,"targetScale",new S)}start(){Kc(this.gameObject)}onPointerClick(e){e.use(),this.coroutine&&this.stopCoroutine(this.coroutine),this.relativeMotion?this.coroutine=this.startCoroutine(this.moveRelative()):this.coroutine=this.startCoroutine(this.moveToTarget())}*moveToTarget(){if(!this.target||!this.object)return;const e=ee(this.object).clone(),t=ee(this.target).clone(),s=Se(this.object).clone(),o=Se(this.target).clone(),r=Ge(this.object).clone(),l=Ge(this.target).clone(),c=e.distanceTo(t),h=s.angleTo(o),d=r.distanceTo(l);if(c<.01&&h<.01&&d<.01){lt(this.object,t),Yi(this.object,o),Ta(this.object,l),this.coroutine=null;return}let u=0,p=0;for(;u<1;)u+=this.context.time.deltaTime/this.duration,u>1&&(u=1),p=u<.5?4*u*u*u:1-Math.pow(-2*u+2,3)/2,this.targetPos.lerpVectors(e,t,p),this.targetRot.slerpQuaternions(s,o,p),this.targetScale.lerpVectors(r,l,p),lt(this.object,this.targetPos),Yi(this.object,this.targetRot),Ta(this.object,this.targetScale),yield;this.coroutine=null}*moveRelative(){if(!this.target||!this.object)return;const e=this.object.position.clone(),t=this.object.quaternion.clone(),s=this.object.scale.clone(),o=this.target.position.clone(),r=this.target.quaternion.clone(),l=this.target.scale.clone();o.applyQuaternion(this.object.quaternion),this.targetPos.copy(this.object.position).add(o),this.targetRot.copy(this.object.quaternion).multiply(r),this.targetScale.copy(this.object.scale).multiply(l);let c=0,h=0;for(;c<1;)c+=this.context.time.deltaTime/this.duration,c>1&&(c=1),h=c<.5?4*c*c*c:1-Math.pow(-2*c+2,3)/2,this.object.position.lerpVectors(e,this.targetPos,h),this.object.quaternion.slerpQuaternions(t,this.targetRot,h),this.object.scale.lerpVectors(s,this.targetScale,h),yield;this.coroutine=null}beforeCreateDocument(e){var t;if(this.target&&this.object&&this.gameObject){const s=new Jt("Move to "+((t=this.target)==null?void 0:t.name),At.tapTrigger(this.gameObject),ve.transformAction(this.object,this.target,this.duration,this.relativeMotion?"relative":"absolute"));e.addBehavior(s)}}}Ne([m(E)],Xr.prototype,"object"),Ne([m(E)],Xr.prototype,"target"),Ne([m()],Xr.prototype,"duration"),Ne([m()],Xr.prototype,"relativeMotion");var tt;const up=(tt=class extends I{constructor(){super(...arguments),a(this,"materialToSwitch"),a(this,"variantMaterial"),a(this,"fadeDuration",0),a(this,"_objectsWithThisMaterial",null),a(this,"selfModel"),a(this,"targetModels")}start(){var n;this._objectsWithThisMaterial=this.objectsWithThisMaterial,Kc(this.gameObject),F()&&this._objectsWithThisMaterial.length<=0&&console.warn('ChangeMaterialOnClick: No objects found with material "'+((n=this.materialToSwitch)==null?void 0:n.name)+'"')}onPointerEnter(n){this.context.input.setCursor("pointer")}onPointerExit(n){this.context.input.unsetCursor("pointer")}onPointerClick(n){if(n.use(),!!this.variantMaterial)for(let e=0;e<this.objectsWithThisMaterial.length;e++){const t=this.objectsWithThisMaterial[e];t.material=this.variantMaterial}}get objectsWithThisMaterial(){return this._objectsWithThisMaterial!=null?this._objectsWithThisMaterial:(this._objectsWithThisMaterial=[],this.variantMaterial&&this.materialToSwitch&&this.context.scene.traverse(n=>{if(n instanceof G)if(Array.isArray(n.material)){for(const e of n.material)if(e===this.materialToSwitch){this.objectsWithThisMaterial.push(n);break}}else n.material===this.materialToSwitch?this.objectsWithThisMaterial.push(n):iw(n.material,this.materialToSwitch)&&this.objectsWithThisMaterial.push(n)}),this._objectsWithThisMaterial)}async beforeCreateDocument(n,e){this.targetModels=[],tt._materialTriggersPerId={},tt.variantSwitchIndex=0,this.materialToSwitch&&await Xe.assignTextureLOD(this.materialToSwitch,0),this.variantMaterial&&await Xe.assignTextureLOD(this.variantMaterial,0)}createBehaviours(n,e,t){this.objectsWithThisMaterial.find(s=>s.uuid===e.uuid)&&this.targetModels.push(e),this.gameObject.uuid===e.uuid&&(this.selfModel=e,this.materialToSwitch&&(tt._materialTriggersPerId[this.materialToSwitch.uuid]||(tt._materialTriggersPerId[this.materialToSwitch.uuid]=[]),tt._materialTriggersPerId[this.materialToSwitch.uuid].push(this)))}afterCreateDocument(n,e){if(!this.materialToSwitch)return;const t=tt._materialTriggersPerId[this.materialToSwitch.uuid];if(t){const s={};for(const o of t){const r=o.createVariants();r&&r.length>0&&(s[o.selfModel.uuid]=r)}for(const o of t){const r=[];for(const l in s)l!==o.selfModel.uuid&&r.push(...s[l]);o.createAndAttachBehaviors(n,s[o.selfModel.uuid],r)}}delete tt._materialTriggersPerId[this.materialToSwitch.uuid]}createAndAttachBehaviors(n,e,t){const s=[],o=Math.max(0,this.fadeDuration);s.push(ve.fadeAction([...this.targetModels,...t],o,!1)),s.push(ve.fadeAction(e,o,!0)),n.addBehavior(new Jt("Select_"+this.selfModel.name,At.tapTrigger(this.selfModel),ve.parallel(...s))),tt._parallelStartHiddenActions.push(...e),tt._startHiddenBehaviour||(tt._startHiddenBehaviour=new Jt("StartHidden_"+this.selfModel.name,At.sceneStartTrigger(),ve.fadeAction(tt._parallelStartHiddenActions,o,!1)),n.addBehavior(tt._startHiddenBehaviour))}static getMaterialName(n){return as(n.name||"Material")+"_"+n.id}createVariants(){if(!this.variantMaterial)return null;const n=[];for(const e of this.targetModels){const t=e.clone();t.name+="_Variant_"+tt.variantSwitchIndex+++"_"+tt.getMaterialName(this.variantMaterial),t.displayName=t.displayName+": Variant with material "+this.variantMaterial.name,t.material=this.variantMaterial,t.geometry=e.geometry,t.transform=e.transform,(!e.parent||!e.parent.isEmpty())&&mi.createEmptyParent(e),e.parent&&e.parent.add(t),n.push(t)}return n}},a(tt,"_materialTriggersPerId",{}),a(tt,"_startHiddenBehaviour",null),a(tt,"_parallelStartHiddenActions",[]),a(tt,"variantSwitchIndex",0),tt);Ne([m(Pe)],up.prototype,"materialToSwitch"),Ne([m(Pe)],up.prototype,"variantMaterial"),Ne([m()],up.prototype,"fadeDuration");let B0=up;var ke;const Zc=(ke=class extends I{constructor(){super(...arguments),a(this,"target"),a(this,"toggleOnClick",!1),a(this,"targetState",!0),a(this,"hideSelf",!0),a(this,"selfModel"),a(this,"selfModelClone"),a(this,"targetModel"),a(this,"toggleModel"),a(this,"stateBeforeCreatingDocument",!1),a(this,"targetStateBeforeCreatingDocument",!1)}start(){Kc(this.gameObject)}onPointerClick(n){n.use(),!this.toggleOnClick&&this.hideSelf&&(this.gameObject.visible=!1),this.target&&(this.target.visible=this.toggleOnClick?!this.target.visible:this.targetState)}createBehaviours(n,e,t){e.uuid===this.gameObject.uuid&&(this.selfModel=e,this.selfModelClone=e.clone())}beforeCreateDocument(){this.target&&(this.gameObject[ke.wasVisible]===void 0&&(this.gameObject[ke.wasVisible]=this.gameObject.activeSelf),this.target[ke.wasVisible]===void 0&&(this.target[ke.wasVisible]=this.target.activeSelf),this.stateBeforeCreatingDocument=this.gameObject[ke.wasVisible],this.targetStateBeforeCreatingDocument=this.target[ke.wasVisible],this.gameObject.visible=!0,this.target.visible=!0)}afterCreateDocument(n,e){if(!this.target)return;this.targetModel=e.document.findById(this.target.uuid);const t=this.selfModel;if(this.selfModel&&this.targetModel){let s=this.selfModel,o=this.targetState;if(this.toggleOnClick)if(o=!this.targetStateBeforeCreatingDocument,!this.selfModelClone.geometry)(!this.selfModel.parent||this.selfModel.parent.isEmpty())&&O0.createEmptyParent(this.selfModel),this.toggleModel=this.selfModel.deepClone(),this.toggleModel.name+="_toggle",this.selfModel.parent.add(this.toggleModel);else{if(!this.gameObject[ke.toggleClone]){const c=this.selfModelClone.clone();c.setMatrix(new se),c.name+="_toggle"+ke.clonedToggleIndex++,t.add(c),this.gameObject[ke.toggleClone]=c,console.warn("USDZExport: Toggle "+this.gameObject.name+" doesn't have geometry. It will be deep cloned and nested behaviours will likely not work.")}const l=this.gameObject[ke.toggleClone];if(!this.gameObject[ke.reverseToggleClone]){const c=this.selfModelClone.clone();c.setMatrix(new se),c.name+="_toggleReverse"+ke.clonedToggleIndex++,t.add(c),this.gameObject[ke.reverseToggleClone]=c}this.toggleModel=this.gameObject[ke.reverseToggleClone],(!this.toggleModel.geometry||!l.geometry)&&console.error("triggers without childs and without geometry won't work!",this,t.geometry),s=l,t.geometry=null,t.material=null}if(this.toggleModel){if(this.toggleOnClick){const l=[];l.push(ve.fadeAction(s,0,!1)),l.push(ve.fadeAction(this.toggleModel,0,!0)),l.push(ve.fadeAction(this.targetModel,0,o)),n.addBehavior(new Jt("Toggle_"+s.name+"_ToggleTo"+(o?"On":"Off"),At.tapTrigger(s),ve.parallel(...l)));const c=[];c.push(ve.fadeAction(this.toggleModel,0,!1)),c.push(ve.fadeAction(s,0,!0)),c.push(ve.fadeAction(this.targetModel,0,!o)),n.addBehavior(new Jt("Toggle_"+s.name+"_ToggleTo"+(o?"Off":"On"),At.tapTrigger(this.toggleModel),ve.parallel(...c)))}}else{const l=[];this.hideSelf&&l.push(ve.fadeAction(s,0,!1)),l.push(ve.fadeAction(this.targetModel,0,o)),n.addBehavior(new Jt("Toggle_"+s.name+"_ToggleTo"+(o?"On":"Off"),At.tapTrigger(s),l.length>1?ve.parallel(...l):l[0]))}const r=new Array;this.targetStateBeforeCreatingDocument||r.push(this.targetModel),this.stateBeforeCreatingDocument||r.push(t),this.toggleModel&&r.push(this.toggleModel),pp.add(r,n)}}afterSerialize(n,e){this.gameObject[ke.wasVisible]!==void 0&&(this.gameObject.visible=this.gameObject[ke.wasVisible],delete this.gameObject[ke.wasVisible]),this.target&&this.target[ke.wasVisible]!==void 0&&(this.target.visible=this.target[ke.wasVisible],delete this.target[ke.wasVisible]),delete this.gameObject[ke.toggleClone],delete this.gameObject[ke.reverseToggleClone]}},a(ke,"clonedToggleIndex",0),a(ke,"wasVisible",Symbol("usdz_SetActiveOnClick_wasVisible")),a(ke,"toggleClone",Symbol("clone for toggling")),a(ke,"reverseToggleClone",Symbol("clone for reverse toggling")),ke);Ne([m(E)],Zc.prototype,"target"),Ne([m()],Zc.prototype,"toggleOnClick"),Ne([m()],Zc.prototype,"targetState"),Ne([m()],Zc.prototype,"hideSelf");let F0=Zc;const U0=class pr extends I{constructor(){super(...arguments),a(this,"wasVisible",!1)}static add(e,t){const s=Array.isArray(e)?e:[e];for(const o of s)pr._fadeObjects.includes(o)||(console.log("adding hide on start",o),pr._fadeObjects.push(o));pr._fadeBehaviour===void 0&&(pr._fadeBehaviour=new Jt("HideOnStart",At.sceneStartTrigger(),ve.fadeAction(pr._fadeObjects,0,!1)),t.addBehavior(pr._fadeBehaviour))}start(){P.setActive(this.gameObject,!1)}createBehaviours(e,t,s){t.uuid===this.gameObject.uuid&&(this.wasVisible||pr.add(t,e))}beforeCreateDocument(){this.wasVisible=P.isActiveSelf(this.gameObject)}};a(U0,"_fadeBehaviour"),a(U0,"_fadeObjects",[]);let pp=U0;class dl extends I{constructor(){super(...arguments),a(this,"target"),a(this,"duration",.5),a(this,"motionType","bounce")}beforeCreateDocument(){}createBehaviours(e,t,s){if(this.target&&t.uuid===this.gameObject.uuid){const o=new Jt("emphasize "+this.name,At.tapTrigger(this.gameObject),ve.emphasize(this.target,this.duration,this.motionType,void 0,"basic"));e.addBehavior(o)}}afterCreateDocument(e,t){}}Ne([m()],dl.prototype,"target"),Ne([m()],dl.prototype,"duration"),Ne([m()],dl.prototype,"motionType");class Vo extends I{constructor(){super(...arguments),a(this,"target"),a(this,"clip",""),a(this,"toggleOnClick",!1),a(this,"trigger","tap")}start(){Kc(this.gameObject)}ensureAudioSource(){if(!this.target){const e=this.gameObject.addComponent(ns);e&&(this.target=e,e.spatialBlend=1,e.volume=1,e.loop=!1,e.preload=!0)}}onPointerClick(e){var t;e.use(),!(!((t=this.target)!=null&&t.clip)&&!this.clip)&&(this.ensureAudioSource(),this.target&&(this.target.isPlaying&&this.toggleOnClick?this.target.stop():(!this.toggleOnClick&&this.target.isPlaying&&this.target.stop(),this.clip?this.target.play(this.clip):this.target.play())))}createBehaviours(e,t,s){if(!(!this.target&&!this.clip)&&t.uuid===this.gameObject.uuid){const o=this.clip?this.clip:this.target?this.target.clip:void 0;if(!o||typeof o!="string")return;const r=this.target?this.target.gameObject:this.gameObject;_a.getName(o);const l=this.target?this.target.volume:1,c=this.target&&this.target.spatialBlend==0?"nonSpatial":"spatial";let h=!1;this.gameObject.traverse(g=>{g instanceof G&&g.visible&&(h=!0)}),h=!0;const d=e.addAudioClip(o);let u=ve.playAudioAction(r,d,"play",l,c);this.target&&this.target.loop&&(u=ve.sequence(u).makeLooping());const p=this.name?"_"+this.name:"";if(h&&this.trigger==="tap"){this.toggleOnClick&&(u.multiplePerformOperation="stop");const g=new Jt("playAudio"+p,At.tapTrigger(t),u);e.addBehavior(g)}if(this.target&&this.target.playOnAwake&&this.target.enabled)if(h&&this.trigger==="tap")console.warn("USDZExport: Audio sources that are played on tap can't also auto-play at scene start due to a QuickLook bug.");else{const g=new Jt("playAudioOnStart"+p,At.sceneStartTrigger(),u);e.addBehavior(g)}}}}Ne([m(ns)],Vo.prototype,"target"),Ne([m(URL)],Vo.prototype,"clip"),Ne([m()],Vo.prototype,"toggleOnClick");var zi;const z0=(zi=class extends I{constructor(){super(...arguments),a(this,"animator"),a(this,"stateName"),a(this,"trigger","tap"),a(this,"animation"),a(this,"selfModel"),a(this,"stateAnimationModel"),a(this,"animationSequence",new Array),a(this,"animationLoopAfterSequence",new Array),a(this,"randomOffsetNormalized",0)}get target(){var n,e;return((n=this.animator)==null?void 0:n.gameObject)||((e=this.animation)==null?void 0:e.gameObject)}start(){Kc(this.gameObject)}onPointerClick(n){var e;n.use(),this.target&&this.stateName&&((e=this.animator)==null||e.play(this.stateName,0,0,.1))}createBehaviours(n,e,t){e.uuid===this.gameObject.uuid&&(this.selfModel=e)}afterSerialize(){if(zi.rootsWithExclusivePlayback.size>1){const n='Multiple root objects targeted by more than one animation. To work around QuickLook bug FB13410767, animations will be set as "exclusive" and activating them will stop other animations being marked as exclusive.';F()&&be(n),console.warn(n,...zi.rootsWithExclusivePlayback)}zi.animationActions=[],zi.rootsWithExclusivePlayback=new Set}afterCreateDocument(n,e){if(this.animationSequence===void 0&&this.animationLoopAfterSequence===void 0||!this.stateAnimationModel||!this.target)return;const t=e.document,s=e.extensions.find(l=>l instanceof dp);if(!s)return;const o=s.getClipCount(this.target)>1;o&&(F()&&console.warn("Setting exclusive playback for "+this.target.name+"@"+this.stateName+" because it has "+s.getClipCount(this.target)+" animations. This works around QuickLook bug FB13410767."),zi.rootsWithExclusivePlayback.add(this.target));const r=this.name?this.name:"";t.traverse(l=>{var c,h;if(l.uuid===((c=this.target)==null?void 0:c.uuid)){const d=zi.getActionForSequences(t,l,this.animationSequence,this.animationLoopAfterSequence,this.randomOffsetNormalized),u=new Jt(this.trigger+"_"+r+"_toPlayAnimation_"+this.stateName+"_on_"+((h=this.target)==null?void 0:h.name),this.trigger=="tap"?At.tapTrigger(this.selfModel):At.sceneStartTrigger(),d);o&&u.makeExclusive(!0),n.addBehavior(u)}})}static getActionForSequences(n,e,t,s,o){const r=(c,h)=>{let d=zi.animationActions.find(u=>u.affectedObjects==c&&u.start==h.start&&u.duration==h.duration&&u.animationSpeed==h.speed);return d||(d=ve.startAnimationAction(c,h),zi.animationActions.push(d)),d},l=ve.sequence();if(t&&t.length>0)for(const c of t)l.addAction(r(e,c));if(s&&s.length>0){const c=l.actions.length==0?l:ve.sequence();for(const h of s)c.addAction(r(e,h));c.makeLooping(),l!==c&&l.addAction(c)}return o&&o>0&&l.actions.unshift(ve.waitAction(o)),l}static getAndRegisterAnimationSequences(n,e,t){var s,o,r,l,c,h,d,u;if(!e)return;const p=e.getComponent(Rt),g=e.getComponent(Ft);if(!p&&!g)return;if(p&&!t)throw new Error("PlayAnimationOnClick: No stateName specified for animator "+p.name+" on "+e.name);let f=[],y=[];if(g){const M=n.registerAnimation(e,g.clip);M&&(g.loop?y.push(M):f.push(M));let T=0;if(g.minMaxOffsetNormalized){const L=g.minMaxOffsetNormalized.x,D=g.minMaxOffsetNormalized.y;T=(((s=g.clip)==null?void 0:s.duration)||1)*(L+Math.random()*(D-L))}return{animationSequence:f,animationLoopAfterSequence:y,randomTimeOffset:T}}const v=p?.runtimeAnimatorController;let b=v?.findState(t),_=[],w=[];if(v&&b){const M=new Array;M.push(b);let T=!1;for(;M.length<100;){if(!b||b===null||!b.transitions||b.transitions.length===0){(o=b.motion)!=null&&o.isLooping&&(T=!0);break}const L=b.transitions.find(z=>z.conditions.length===0),D=L?v.getState(L.destinationState,0):null;if(D&&M.includes(D)){b=D,T=!0;break}else if(L){if(b=D,!b)break;M.push(b)}else{T=((r=b.motion)==null?void 0:r.isLooping)??!1;break}}if(T&&b){const L=M.indexOf(b);_=M.slice(0,L),w=M.slice(L),$1&&console.log("found loop from "+t,"states until loop",_,"states looping",w)}else _=M,w=[],$1&&console.log("found no loop from "+t,"states",_);if(!w.length){const L=_[_.length-1],D=(l=L.motion)==null?void 0:l.clip;if(D){let z;if(n.holdClipMap.has(D))z=n.holdClipMap.get(D);else{const j=L.name+"_hold";z=D.clone(),z.duration=1,z.name=j;const H=D.duration;z.tracks=D.tracks.map(K=>{const U=K.clone();U.times=new Float32Array([0,H]);const B=K.values.length,Q=K.getValueSize(),te=K.values.slice(B-Q,B);return U.values=new Float32Array(2*Q),U.values.set(te,0),U.values.set(te,Q),U}),z.name=j,n.holdClipMap.set(D,z)}if(z){const j={name:z.name,motion:{clip:z,isLooping:!1,name:z.name},speed:1,transitions:[],behaviours:[],hash:L.hash+1};w.push(j)}}}}if(_.length===1&&(!((c=_[0].motion)!=null&&c.clip)||((d=(h=_[0].motion)==null?void 0:h.clip.tracks)==null?void 0:d.length)===0)){f=new Array;const M=n.registerAnimation(e,null);M&&f.push(M);return}if(_=_.filter(M=>{var T,L,D;return((T=M.motion)==null?void 0:T.clip)&&((D=(L=M.motion)==null?void 0:L.clip.tracks)==null?void 0:D.length)>0}),w=w.filter(M=>{var T,L,D;return((T=M.motion)==null?void 0:T.clip)&&((D=(L=M.motion)==null?void 0:L.clip.tracks)==null?void 0:D.length)>0}),_.length===0&&w.length===0){console.warn("No clips found for state "+t+" on "+p?.name+", can't export animation data");return}const x=(M,T)=>{if(!e)return;const L=n.registerAnimation(e,M.motion.clip??null);L?(L.speed=M.speed,T.push(L)):console.warn("Couldn't register animation for state "+M.name+" on "+p?.name)};if(_.length>0){f=new Array;for(const M of _)x(M,f)}if(w.length>0){y=new Array;for(const M of w)x(M,y)}let k=0;if(p&&v&&p.minMaxOffsetNormalized){const M=p.minMaxOffsetNormalized.x,T=p.minMaxOffsetNormalized.y,L=_.length?_[0]:w.length?w[0]:null;k=(((u=L?.motion.clip)==null?void 0:u.duration)||1)*(M+Math.random()*(T-M))}return{animationSequence:f,animationLoopAfterSequence:y,randomTimeOffset:k}}createAnimation(n,e,t){if(!this.target||!this.animator&&!this.animation)return;const s=zi.getAndRegisterAnimationSequences(n,this.target,this.stateName);s&&(this.animationSequence=s.animationSequence,this.animationLoopAfterSequence=s.animationLoopAfterSequence,this.randomOffsetNormalized=s.randomTimeOffset,this.stateAnimationModel=e)}},a(zi,"animationActions",[]),a(zi,"rootsWithExclusivePlayback",new Set),zi);Ne([m(Rt)],z0.prototype,"animator"),Ne([m()],z0.prototype,"stateName");let Jc=z0;class ul extends I{constructor(){super(...arguments),a(this,"target")}getType(){}getDuration(){}}Ne([m(E)],ul.prototype,"target");class eh extends I{constructor(){super(...arguments),a(this,"target")}}Ne([m(ul)],eh.prototype,"target");class th extends ul{constructor(){super(...arguments),a(this,"type",1),a(this,"duration",1)}getType(){switch(this.type){case 1:return"hide";case 0:return"show"}}getDuration(){return this.duration}}Ne([m()],th.prototype,"type"),Ne([m()],th.prototype,"duration");class N0 extends eh{}const H1=class CC{constructor(){a(this,"_quicklookButton"),a(this,"_arButton"),a(this,"_vrButton"),a(this,"_sendToQuestButton")}static create(){return new CC}static getOrCreate(){return this._instance||(this._instance=this.create()),this._instance}get isSecureConnection(){return window.location.protocol==="https:"}get quicklookButton(){return this._quicklookButton}get arButton(){return this._arButton}get vrButton(){return this._vrButton}get sendToQuestButton(){return this._sendToQuestButton}get qrButton(){return Po.getOrCreate().createQRCode()}createQuicklookButton(){if(this._quicklookButton)return this._quicklookButton;const e=document.createElement("button");this._quicklookButton=e,e.dataset.needle="quicklook-button";const t=X.supportsQuickLookAR();e.innerText="View in AR",e.prepend(Mt("view_in_ar"));let s=!1,o=null;return e.addEventListener("click",()=>{o=xc(gn),o||(s=!0,o=new gn),s&&(o.objectToExport=J.Current.scene),o?(e.classList.add("this-mode-is-requested"),o.exportAndOpen().then(()=>{e.classList.remove("this-mode-is-requested")}).catch(r=>{e.classList.remove("this-mode-is-requested"),console.error(r)})):console.warn("No USDZExporter component found in the scene")}),this.hideElementDuringXRSession(e),e}createARButton(e){var t;if(this._arButton)return this._arButton;const s="immersive-ar",o=document.createElement("button");return this._arButton=o,o.classList.add("webxr-button"),o.dataset.needle="webxr-ar-button",o.innerText="Enter AR",o.prepend(Mt("view_in_ar")),o.title="Click to start an AR session",o.addEventListener("click",()=>ne.start(s,e)),this.updateSessionSupported(o,s),this.listenToXRSessionState(o,s),this.hideElementDuringXRSession(o),this.isSecureConnection||(o.disabled=!0,o.title="WebXR requires a secure connection (HTTPS)"),X.isMozillaXR()||(t=navigator.xr)==null||t.addEventListener("devicechange",()=>this.updateSessionSupported(o,s)),o}createVRButton(e){var t;if(this._vrButton)return this._vrButton;const s="immersive-vr",o=document.createElement("button");return this._vrButton=o,o.classList.add("webxr-button"),o.dataset.needle="webxr-vr-button",o.innerText="Enter VR",o.prepend(Mt("panorama_photosphere")),o.title="Click to start a VR session",o.addEventListener("click",()=>ne.start(s,e)),this.updateSessionSupported(o,s),this.listenToXRSessionState(o,s),this.hideElementDuringXRSession(o),this.isSecureConnection||(o.disabled=!0,o.title="WebXR requires a secure connection (HTTPS)"),X.isMozillaXR()||(t=navigator.xr)==null||t.addEventListener("devicechange",()=>this.updateSessionSupported(o,s)),o}createSendToQuestButton(){var e;if(this._sendToQuestButton)return this._sendToQuestButton;const t="https://oculus.com/open_url/?url=",s=document.createElement("button");return this._sendToQuestButton=s,s.dataset.needle="webxr-sendtoquest-button",s.innerText="Open on Quest",s.prepend(Mt("share_windows")),s.title="Click to send this page to the Oculus Browser on your Quest",s.addEventListener("click",()=>{const o=encodeURIComponent(window.location.href),r=t+o;window.open(r)==null&&De("This page doesn't allow popups. Please paste "+r+" into your browser.")}),this.listenToXRSessionState(s),this.hideElementDuringXRSession(s),X.isMozillaXR()||(e=navigator.xr)==null||e.addEventListener("devicechange",()=>{var o;(o=navigator.xr)!=null&&o.isSessionSupported("immersive-vr")?s.style.display="none":s.style.display=""}),s}createQRCode(){return Po.getOrCreate().createQRCode()}updateSessionSupported(e,t){if(!("xr"in navigator)){e.style.display="none";return}ne.isSessionSupported(t).then(s=>{e.style.display=s?"":"none",F()&&!s&&console.log('[WebXR] "'+t+'" is not supported on this device \u2013 make sure your server runs using HTTPS and you have a device connected that supports '+t)})}hideElementDuringXRSession(e){Fd(t=>{e["previous-display"]=e.style.display,e.style.display="none"}),Cg(t=>{e["previous-display"]!=null&&(e.style.display=e["previous-display"])})}listenToXRSessionState(e,t){t&&(ne.onSessionRequestStart(s=>{s.mode===t?e.classList.add("this-mode-is-requested"):(e["was-disabled"]=e.disabled,e.disabled=!0,e.classList.add("other-mode-is-requested"))}),ne.onSessionRequestEnd(s=>{e.classList.remove("this-mode-is-requested"),e.classList.remove("other-mode-is-requested"),e.disabled=e["was-disabled"]}))}};a(H1,"_instance");let pl=H1;var hA=Object.defineProperty,dA=Object.getOwnPropertyDescriptor,St=(n,e,t,s)=>{for(var o=s>1?void 0:s?dA(e,t):e,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=(s?l(e,t,o):l(o))||o);return s&&o&&hA(e,t,o),o};const mp=C("debugspriterenderer"),uA=C("wireframe"),G1=class _v{static getOrCreateGeometry(e){if(e.__cached_geometry)return e.__cached_geometry;if(e.guid&&_v.cache[e.guid])return mp&&console.log("Take cached geometry for sprite",e.guid),_v.cache[e.guid];const t=new Vs;e.__cached_geometry=t;const s=new Float32Array(e.triangles.length*3),o=new Float32Array(e.triangles.length*2);for(let r=0;r<e.triangles.length;r+=1){const l=e.triangles[r];s[r*3]=-e.vertices[l].x,s[r*3+1]=e.vertices[l].y,s[r*3+2]=0;const c=e.uv[l];o[r*2]=c.x,o[r*2+1]=1-c.y}return t.setAttribute("position",new _t(s,3)),t.setAttribute("uv",new _t(o,2)),e.guid&&(this.cache[e.guid]=t),mp&&console.log("Built sprite geometry",e,t),t}};a(G1,"cache",{});let gp=G1;class pA{constructor(){a(this,"x"),a(this,"y")}}function q1(n){n&&(n.colorSpace!=Mn&&(n.colorSpace=Mn,n.needsUpdate=!0),n.minFilter==_d&&n.magFilter==_d&&(n.anisotropy=1,n.needsUpdate=!0))}let Qn=class{constructor(n){a(this,"guid"),a(this,"texture"),a(this,"triangles"),a(this,"uv"),a(this,"vertices"),a(this,"__cached_geometry"),a(this,"_mesh"),a(this,"_material"),n&&(this.texture=n,this.triangles=[0,1,2,0,2,3],this.uv=[{x:0,y:0},{x:1,y:0},{x:1,y:1},{x:0,y:1}],this.vertices=[{x:-.5,y:-.5},{x:.5,y:-.5},{x:.5,y:.5},{x:-.5,y:.5}])}get mesh(){return this._mesh||(this._mesh=new G(gp.getOrCreateGeometry(this),this.material)),this._mesh}get material(){return this._material||(this.texture&&q1(this.texture),this._material=new Me({map:this.texture,color:16777215,side:Pi,transparent:!0})),this._material}getGeometry(){return gp.getOrCreateGeometry(this)}};St([m()],Qn.prototype,"guid",2),St([m(je)],Qn.prototype,"texture",2),St([Dr()],Qn.prototype,"triangles",2),St([Dr()],Qn.prototype,"uv",2),St([Dr()],Qn.prototype,"vertices",2);const W0=Symbol("spriteOwner");class ml{constructor(){a(this,"sprites"),this.sprites=[]}}St([m(Qn)],ml.prototype,"sprites",2);const V0=class wv{constructor(){a(this,"spriteSheet"),a(this,"index",0)}static create(){const e=new wv;return e.spriteSheet=new ml,e}clone(){const e=new wv;return e.index=this.index,e.spriteSheet=this.spriteSheet,e}set sprite(e){e&&(this.spriteSheet?((this.index===null||this.index===void 0)&&(this.index=0),this.spriteSheet.sprites[this.index]=e):(this.spriteSheet=new ml,this.spriteSheet.sprites=[e],this.index=0))}get sprite(){if(this.spriteSheet)return this.spriteSheet.sprites[this.index]}update(e){if(!this.spriteSheet)return;const t=this.index;if(t<0||t>=this.spriteSheet.sprites.length)return;const s=this.spriteSheet.sprites[t],o=s?.texture;if(o&&(q1(o),!s.__hasLoadedProgressive)){s.__hasLoadedProgressive=!0;const r=o;Xe.assignTextureLOD(o,0).then(l=>{l instanceof je&&(s.texture=l,e?.map===r&&(e.map=l,e.needsUpdate=!0))})}}};St([m(ml)],V0.prototype,"spriteSheet",2),St([m()],V0.prototype,"index",2);let gl=V0;class gi extends I{constructor(){super(...arguments),a(this,"drawMode",0),a(this,"size",{x:1,y:1}),a(this,"color"),a(this,"sharedMaterial"),a(this,"transparent",!0),a(this,"cutoutThreshold",0),a(this,"castShadows",!1),a(this,"renderOrder",0),a(this,"toneMapped",!0),a(this,"_spriteSheet"),a(this,"_currentSprite")}set texture(e){var t;if(!this._spriteSheet)return;const s=(t=this._spriteSheet.spriteSheet)==null?void 0:t.sprites[this.spriteIndex];s&&(s.texture=e,this.updateSprite())}addSprite(e,t=!1){var s,o;if(this._spriteSheet||(this._spriteSheet=gl.create()),!this._spriteSheet.spriteSheet)return-1;(s=this._spriteSheet.spriteSheet)==null||s.sprites.push(e);const r=((o=this._spriteSheet.spriteSheet)==null?void 0:o.sprites.length)-1;return t&&(this.spriteIndex=r),r}get sprite(){return this._spriteSheet}set sprite(e){if(e!==this._spriteSheet)if(typeof e=="number"){const t=Math.floor(e);this.spriteIndex=t}else e instanceof Qn?(this._spriteSheet||(this._spriteSheet=gl.create()),this._spriteSheet.sprite!=e&&(this._spriteSheet.sprite=e),this.updateSprite()):e!=this._spriteSheet&&(this._spriteSheet=e,this.updateSprite())}set spriteIndex(e){this._spriteSheet&&(this._spriteSheet.index=e,this.updateSprite())}get spriteIndex(){var e;return((e=this._spriteSheet)==null?void 0:e.index)??0}get spriteFrames(){var e,t;return((t=(e=this._spriteSheet)==null?void 0:e.spriteSheet)==null?void 0:t.sprites.length)??0}awake(){this._currentSprite=void 0,this._spriteSheet?this._spriteSheet=this._spriteSheet.clone():this._spriteSheet=gl.create(),mp&&console.log("Awake",this.name,this,this.sprite)}start(){this._currentSprite?this.gameObject&&this.gameObject.add(this._currentSprite):this.updateSprite()}updateSprite(e=!1){var t;if(!this.__didAwake&&!e)return!1;const s=this._spriteSheet;if(!((t=s?.spriteSheet)!=null&&t.sprites))return console.warn("SpriteRenderer has no data or spritesheet assigned..."),!1;const o=s.spriteSheet.sprites[this.spriteIndex];if(!o)return mp&&console.warn("Sprite not found",this.spriteIndex,s.spriteSheet.sprites),!1;if(this._currentSprite)this._currentSprite.geometry=gp.getOrCreateGeometry(o),this._currentSprite.material.map=o.texture;else{const r=new Me({color:16777215,side:Pi});if(uA&&(r.wireframe=!0),this.color&&(r.color||(r.color=new oe),r.color.copy(this.color),r.opacity=this.color.alpha),r.transparent=!0,r.toneMapped=this.toneMapped,r.depthWrite=!1,o.texture&&!r.wireframe){let l=o.texture;l[W0]!==void 0&&l[W0]!==this&&this.spriteFrames>1&&(l=o.texture=l.clone()),l[W0]=this,r.map=l}this.sharedMaterial=r,this._currentSprite=new G(gp.getOrCreateGeometry(o),r),this._currentSprite.renderOrder=Math.round(this.renderOrder),Xe.assignTextureLOD(r,0)}return this._currentSprite.parent!==this.gameObject&&(this.drawMode===2&&this._currentSprite.scale.set(this.size.x,this.size.y,1),this.gameObject&&this.gameObject.add(this._currentSprite)),this._currentSprite&&this._currentSprite.layers.set(this.layer),this.sharedMaterial&&(this.sharedMaterial.alphaTest=this.cutoutThreshold,this.sharedMaterial.transparent=this.transparent),this._currentSprite.castShadow=this.castShadows,s?.update(this.sharedMaterial),!0}}St([m()],gi.prototype,"drawMode",2),St([m(pA)],gi.prototype,"size",2),St([m(he)],gi.prototype,"color",2),St([m(Pe)],gi.prototype,"sharedMaterial",2),St([m()],gi.prototype,"transparent",2),St([m()],gi.prototype,"cutoutThreshold",2),St([m()],gi.prototype,"castShadows",2),St([m()],gi.prototype,"renderOrder",2),St([m()],gi.prototype,"toneMapped",2),St([m(gl)],gi.prototype,"sprite",1);const X1=C("debugwebxr"),mA=new se().makeRotationY(Math.PI),$0=class od extends I{constructor(){super(...arguments),a(this,"_arScale",1),a(this,"invertForward",!1),a(this,"customReticle"),a(this,"arTouchTransform",!0),a(this,"autoPlace",!1),a(this,"autoCenter",!1),a(this,"useXRAnchor",!1),a(this,"_isPlacing",!0),a(this,"_startOffset",new se),a(this,"_createdPlacementObject",null),a(this,"_reparentedComponents",[]),a(this,"_placementScene",new xi),a(this,"_reticle",[]),a(this,"_hits",[]),a(this,"_placementStartTime",-1),a(this,"_rigPlacementMatrix"),a(this,"_anchor",null),a(this,"userInput"),a(this,"onPlaceScene",e=>{var t;if(this._isPlacing==!1||e!=null&&e.used)return;let s=this._reticle[0];if(!s){console.warn("No reticle to place...");return}if(!s.visible&&!this.autoPlace){console.warn("Reticle is not visible (can not place)");return}if((t=ne.active)!=null&&t.isTrackingImages){console.warn("Scene Placement is disabled while images are being tracked");return}let o=this._hits[0];if(e&&e.origin instanceof Pg){const r=this._reticle[e.origin.index];r&&(s=r,o=this._hits[e.origin.index])}if(e&&(e.stopImmediatePropagation(),e.stopPropagation(),e.use()),this._isPlacing=!1,this.context.input.removeEventListener("pointerup",this.onPlaceScene),this.onRevertSceneChanges(),s.position.copy(s.lastPos),s.quaternion.copy(s.lastQuat),this.onApplyPose(s),od._hasPlaced=!0,this.useXRAnchor&&this.onCreateAnchor(ne.active,o),this.context.xr)for(const r of this.context.xr.controllers)r.cancelHitTestSource()}),a(this,"upVec",new S(0,1,0)),a(this,"lookPoint",new S),a(this,"worldUpVec",new S(0,1,0))}static onPlaced(e){const t="placed";return this._eventListeners[t]||(this._eventListeners[t]=[]),this._eventListeners[t].push(e),()=>{const s=this._eventListeners[t].indexOf(e);s>=0&&this._eventListeners[t].splice(s,1)}}static get hasPlaced(){return this._hasPlaced}get arScale(){return this._arScale}set arScale(e){this._arScale=Math.max(1e-6,e),this.onSetScale()}onEnable(){var e;(e=this.customReticle)==null||e.preload()}supportsXR(e){return e==="immersive-ar"}onEnterXR(e){X1&&console.log("ENTER WEBXR: SessionRoot start..."),this._anchor=null,od._hasPlaced=!1,this.gameObject.updateMatrixWorld(),this._startOffset.copy(this.gameObject.matrixWorld);const t=new E;this._createdPlacementObject=t,t.name="AR Session Root",this._placementScene.name="AR Placement Scene",this._placementScene.children.length=0;for(let s=this.context.scene.children.length-1;s>=0;s--){const o=this.context.scene.children[s];this._placementScene.add(o)}if(this.context.scene.add(t),this.autoCenter){const s=si(this._placementScene.children),o=s.getCenter(new S),r=s.getSize(new S),l=new se;l.makeTranslation(o.x,o.y-r.y*.5,o.z),this._startOffset.multiply(l)}this._reparentedComponents.length=0,this._reparentedComponents.push({comp:this,originalObject:this.gameObject}),P.addComponent(t,this);for(const s of this._reticle)Ai(s);this._reticle.length=0,this._isPlacing=!0,this.context.input.addEventListener("pointerup",this.onPlaceScene,{queue:oi.Early})}onLeaveXR(){this.context.input.removeEventListener("pointerup",this.onPlaceScene,{queue:oi.Early}),this.onRevertSceneChanges(),this._anchor=null,od._hasPlaced=!1,this._rigPlacementMatrix=void 0}onUpdateXR(e){var t,s,o,r;if(e.xr.isTrackingImages){for(const l of this._reticle)l.visible=!1;return}if(this._isPlacing){const l=(t=e.xr.rig)==null?void 0:t.gameObject;l&&l.parent!==this.context.scene&&this.context.scene.add(l);let c=!1;if(e.xr.isPassThrough&&e.xr.controllers.length>0&&!this.autoPlace)for(const h of e.xr.controllers){const d=h.getHitTest();d&&(c=!0,this.updateReticleAndHits(e.xr,h.index,d,e.xr.rigScale))}if(!c){const h=e.xr.getHitTest();h&&this.updateReticleAndHits(e.xr,0,h,e.xr.rigScale)}}else{if(this._anchor&&e.xr.referenceSpace){const l=e.xr.frame.getPose(this._anchor.anchorSpace,e.xr.referenceSpace);if(l&&this.context.time.frame%20===0){const c=e.xr.convertSpace(l.transform),h=this._reticle[0];h&&(h.position.copy(c.position),h.quaternion.copy(c.quaternion),this.onApplyPose(h))}}if(this.arTouchTransform?(this.userInput||(this.userInput=new gA(this.context)),(s=this.userInput)==null||s.enable()):(o=this.userInput)==null||o.disable(),this.arTouchTransform&&(r=this.userInput)!=null&&r.hasChanged){if(e.xr.rig){const l=e.xr.rig.gameObject;this.userInput.applyMatrixTo(l.matrix,!0),l.matrix.decompose(l.position,l.quaternion,l.scale),this.userInput.factor=l.scale.x}this.userInput.reset()}}}updateReticleAndHits(e,t,s,o){this._hits[t]=s.hit;let r=this._reticle[t];if(!r){if(this.customReticle)if(this.customReticle.asset)r=$a(this.customReticle.asset);else{this.customReticle.loadAssetAsync();return}else r=new G(new kP(.07,.09,32).rotateX(-Math.PI/2),new Me({side:Pi,depthTest:!1,depthWrite:!1,transparent:!0,opacity:1,color:15658734})),r.name="AR Placement Reticle";if(X1){const l=new Ci(1);l.position.y+=.01,r.add(l)}this._reticle[t]=r,r.matrixAutoUpdate=!1,r.visible=!1}if(r.lastPos=r.lastPos||s.position.clone(),r.lastQuat=r.lastQuat||s.quaternion.clone(),r.position.copy(r.lastPos.lerp(s.position,this.context.time.deltaTime/.1)),r.lastPos.copy(r.position),r.quaternion.copy(r.lastQuat.slerp(s.quaternion,this.context.time.deltaTime/.05)),r.lastQuat.copy(r.quaternion),r.scale.set(o,o,o),this.customReticle&&this.applyViewBasedTransform(r),r.updateMatrix(),r.visible=!0,r.parent!==this.context.scene&&this.context.scene.add(r),this._placementStartTime<0&&(this._placementStartTime=this.context.time.realtimeSinceStartup),this.autoPlace)if(this.upVec.set(0,1,0).applyQuaternion(r.quaternion),this.upVec.dot(q(0,1,0))>.9){let l=r["autoplace:timer"]||0;l>=1?(r.visible=!1,this.onPlaceScene(null)):(l+=this.context.time.deltaTime,r["autoplace:timer"]=l)}else r["autoplace:timer"]=0}onSetScale(){var e,t,s;if(!od._hasPlaced)return;const o=(t=(e=ne.active)==null?void 0:e.rig)==null?void 0:t.gameObject;if(o){const r=((s=ne.active)==null?void 0:s.rigScale)||1,l=1/this._arScale*r,c=new se().makeScale(l,l,l).invert();o.matrix.premultiply(c),o.matrix.decompose(o.position,o.quaternion,o.scale)}}onRevertSceneChanges(){var e;for(const t of this._reticle)t&&(t.visible=!1,t?.removeFromParent());this._reticle.length=0;for(let t=this._placementScene.children.length-1;t>=0;t--){const s=this._placementScene.children[t];this.context.scene.add(s)}(e=this._createdPlacementObject)==null||e.removeFromParent();for(const t of this._reparentedComponents)P.addComponent(t.originalObject,t.comp)}async onCreateAnchor(e,t){if(t.createAnchor===void 0){console.warn("Hit does not support creating an anchor",t),F()&&be("Hit does not support creating an anchor");return}else{const s=await t.createAnchor(e.viewerPose.transform);e.running&&s&&(this._anchor=s)}}applyViewBasedTransform(e){const t=this.context.mainCamera,s=e,o=t.worldPosition,r=s.worldPosition;this.upVec.set(0,1,0).applyQuaternion(e.quaternion);const l=t.worldPosition;l&&e.position.clone().sub(l).angleTo(this.upVec)<Math.PI/2&&this.upVec.negate();const c=this.upVec.angleTo(this.worldUpVec)*180/Math.PI,h=30;c>h&&c<180-h||c<-h&&c>-180+h?(this.lookPoint.copy(e.position).add(this.upVec),this.lookPoint.y=e.position.y,e.lookAt(this.lookPoint)):(o.y=r.y,e.lookAt(o))}onApplyPose(e){var t,s,o;const r=(s=(t=ne.active)==null?void 0:t.rig)==null?void 0:s.gameObject;if(!r){console.warn("No rig object to place");return}const l=r.parent||this.context.scene;this._rigPlacementMatrix?(o=this._rigPlacementMatrix)==null||o.decompose(r.position,r.quaternion,r.scale):this._rigPlacementMatrix=r.matrix.clone(),this.applyViewBasedTransform(e),e.updateMatrix(),this.context.scene.add(e),e.attach(r),e.removeFromParent(),r.scale.set(this.arScale,this.arScale,this.arScale),r.position.multiplyScalar(this.arScale),r.updateMatrix(),this.invertForward&&r.matrix.premultiply(mA),r.matrix.premultiply(this._startOffset),r.matrix.decompose(r.position,r.quaternion,r.scale),l.add(r)}};a($0,"_eventListeners",{}),a($0,"_hasPlaced",!1);let $o=$0;const fp=class xv{constructor(e){a(this,"oneFingerDrag",!0),a(this,"twoFingerRotate",!0),a(this,"twoFingerScale",!0),a(this,"factor",1),a(this,"context"),a(this,"offset"),a(this,"plane"),a(this,"_scale",1),a(this,"_hasChanged",!1),a(this,"_enabled",!1),a(this,"currentlyUsedPointerIds",new Set),a(this,"currentlyUnusedPointerIds",new Set),a(this,"onPointerDownEarly",t=>{this.isActive&&t.stopPropagation()}),a(this,"onPointerDownLate",t=>{t.used?this.currentlyUsedPointerIds.add(t.pointerId):this.currentlyUsedPointerIds.size<=0&&this.currentlyUnusedPointerIds.add(t.pointerId)}),a(this,"onPointerUpEarly",t=>{this.currentlyUsedPointerIds.delete(t.pointerId),this.currentlyUnusedPointerIds.delete(t.pointerId)}),a(this,"prev",new Map),a(this,"_didMultitouch",!1),a(this,"touchStart",t=>{if(!t.defaultPrevented)for(let s=0;s<t.changedTouches.length;s++){const o=t.changedTouches[s],r=X.isAndroidDevice()&&o.clientY<window.innerHeight*.1;this.prev.has(o.identifier)||this.prev.set(o.identifier,{ignore:r,x:0,z:0,screenx:0,screeny:0});const l=this.prev.get(o.identifier);if(l){const c=this.getPositionOnPlane(o.clientX,o.clientY);l.x=c.x,l.z=c.z,l.screenx=o.clientX,l.screeny=o.clientY}}}),a(this,"touchEnd",t=>{t.touches.length<=0&&(this._didMultitouch=!1);for(let s=0;s<t.changedTouches.length;s++){const o=t.changedTouches[s];this.prev.delete(o.identifier)}}),a(this,"touchMove",t=>{if(!t.defaultPrevented&&this.isActive){if(t.touches.length===1){if(this._didMultitouch)return;const s=t.touches[0],o=this.prev.get(s.identifier);if(!o||o.ignore)return;const r=this.getPositionOnPlane(s.clientX,s.clientY),l=r.x-o.x,c=r.z-o.z;if(l===0&&c===0)return;this.oneFingerDrag&&this.addMovement(l,c),o.x=r.x,o.z=r.z,o.screenx=s.clientX,o.screeny=s.clientY;return}else if(t.touches.length===2){this._didMultitouch=!0;const s=t.touches[0],o=t.touches[1],r=this.prev.get(s.identifier),l=this.prev.get(o.identifier);if(!r||!l)return;if(this.twoFingerRotate){const c=Math.atan2(s.clientY-o.clientY,s.clientX-o.clientX),h=Math.atan2(r.screeny-l.screeny,r.screenx-l.screenx),d=c-h;Math.abs(d)>.001&&this.addRotation(d)}if(this.twoFingerScale){const c=s.clientX-o.clientX,h=s.clientY-o.clientY,d=Math.sqrt(c*c+h*h),u=r.screenx-l.screenx,p=r.screeny-l.screeny,g=Math.sqrt(u*u+p*p),f=d-g;Math.abs(f)>2&&this.addScale(f)}r.screenx=s.clientX,r.screeny=s.clientY,l.screenx=o.clientX,l.screeny=o.clientY}}}),a(this,"_raycaster",new md),a(this,"_intersection",new S),a(this,"_screenPos",new S),a(this,"_tempMatrix",new se),this.context=e,this.offset=new se,this.plane=new yr,this.plane.setFromNormalAndCoplanarPoint(xv.up,xv.zero)}get scale(){return this._scale}reset(){this._scale=1,this.offset.identity(),this._hasChanged=!0}get hasChanged(){return this._hasChanged}applyMatrixTo(e,t){this._hasChanged=!1,t?(this.offset.invert(),e.premultiply(this.offset)):e.multiply(this.offset)}get isActive(){return this.currentlyUsedPointerIds.size<=0&&this.currentlyUnusedPointerIds.size>0}enable(){this._enabled||(this._enabled=!0,this.context.input.addEventListener("pointerdown",this.onPointerDownEarly,{queue:oi.Early}),this.context.input.addEventListener("pointerdown",this.onPointerDownLate,{queue:oi.Late}),this.context.input.addEventListener("pointerup",this.onPointerUpEarly,{queue:oi.Early}),window.addEventListener("touchstart",this.touchStart,{passive:!1}),window.addEventListener("touchmove",this.touchMove,{passive:!1}),window.addEventListener("touchend",this.touchEnd,{passive:!1}))}disable(){this._enabled&&(this._enabled=!1,this.context.input.removeEventListener("pointerdown",this.onPointerDownEarly,{queue:oi.Early}),this.context.input.removeEventListener("pointerdown",this.onPointerDownLate,{queue:oi.Late}),this.context.input.removeEventListener("pointerup",this.onPointerUpEarly,{queue:oi.Early}),window.removeEventListener("touchstart",this.touchStart),window.removeEventListener("touchmove",this.touchMove),window.removeEventListener("touchend",this.touchEnd))}getPositionOnPlane(e,t){const s=this.context.mainCamera;return this._screenPos.x=e/window.innerWidth*2-1,this._screenPos.y=-(t/window.innerHeight)*2+1,this._screenPos.z=1,this._screenPos.unproject(s),this._raycaster.set(s.position,this._screenPos.sub(s.position)),this._raycaster.ray.intersectPlane(this.plane,this._intersection),this._intersection}addMovement(e,t){e/=this._scale,t/=this._scale,e*=this.factor,t*=this.factor,this.offset.elements[12]+=e,this.offset.elements[14]+=t,(e!==0||t!==0)&&(this._hasChanged=!0)}addScale(e){e/=window.innerWidth,e*=-1,this._scale*=1+e,this._tempMatrix.makeScale(1-e,1-e,1-e),this.offset.premultiply(this._tempMatrix),e!==0&&(this._hasChanged=!0)}addRotation(e){e*=-1,this._tempMatrix.makeRotationY(e),this.offset.premultiply(this._tempMatrix),e!==0&&(this._hasChanged=!0)}};a(fp,"up",new S(0,1,0)),a(fp,"zero",new S(0,0,0)),a(fp,"one",new S(1,1,1));let gA=fp;const Ho=C("debugautosync"),H0=Symbol("syncerId");class fA{constructor(){a(this,"_syncers",{})}getOrCreateSyncer(e){if(!e.guid)return null;if(this._syncers[e.guid])return this._syncers[e.guid];const t=new yA(e);return t[H0]=e.guid,this._syncers[t[H0]]=t,t}removeSyncer(e){delete this._syncers[e[H0]]}}const G0=new fA;class yA{constructor(e){a(this,"comp"),a(this,"hasChanges",!1),a(this,"changedProperties",{}),a(this,"_isReceiving",!1),a(this,"_isInit",!1),a(this,"onHandleSending",()=>{if(!this.hasChanges)return;this.hasChanges=!1;const t=this.comp.context.connection;if(!t||!t.isConnected||!t.isInRoom){for(const s in this.changedProperties)delete this.changedProperties[s];return}for(const s in this.changedProperties){const o=this.changedProperties[s];Ho&&console.log("SEND",this.comp.guid,this.networkingKey),t.send(this.networkingKey,{guid:this.comp.guid,property:s,data:o},Ss.Queued),delete this.changedProperties[s]}}),a(this,"onHandleReceiving",t=>{if(Ho&&console.log("SYNCFIELD RECEIVE",this.comp.name,this.comp.guid,t),!!this._isInit&&this.comp&&t.guid===this.comp.guid)try{this._isReceiving=!0,this.comp[t.property]=t.data}catch(s){console.error(s)}finally{this._isReceiving=!1}}),this.comp=e}get networkingKey(){return this.comp.guid}init(e){if(this._isInit)return;this._isInit=!0,this.comp=e,this.comp.context.post_render_callbacks.push(this.onHandleSending),this.comp.context.connection.beginListen(this.networkingKey,this.onHandleReceiving);const t=this.comp.context.connection.tryGetState(this.comp.guid);t&&this.onHandleReceiving(t)}destroy(){this._isInit&&(this.comp.context.post_render_callbacks.splice(this.comp.context.post_render_callbacks.indexOf(this.onHandleSending),1),this.comp.context.connection.stopListen(this.networkingKey,this.onHandleReceiving),this.comp=null,this._isInit=!1)}notifyChanged(e,t){this._isReceiving||(Ho&&console.log("Property changed: "+e,t),this.hasChanges=!0,this.changedProperties[e]=t)}}function vA(n,e){let t=e!==n;return!t&&n&&e&&(Array.isArray(n)&&Array.isArray(e)||typeof n=="object"&&typeof e=="object")&&(t=!0),t}const ih=Symbol("AutoSyncHandler");function bA(n){if(n[ih])return n[ih];const e=G0.getOrCreateSyncer(n);return e?.init(n),n[ih]=e,e}function _A(n){const e=n[ih];e&&(G0.removeSyncer(e),e.destroy(),delete n[ih])}const q0=function(n=null){return function(e,t){var s;let o="";typeof t=="string"?o=t:o=t.name;let r=null,l;typeof n=="string"?l=e[n]:typeof n=="function"&&(l=n),l==null&&(F()||Ho)&&n!=null&&console.warn('syncField: no callback function found for property "'+o+'"','"'+n+'"');const c=e,h=c.__internalAwake;if(typeof h!="function"){(Ho||F())&&console.error('@syncField can currently only used on Needle Engine Components, custom object of type "'+((s=e?.constructor)==null?void 0:s.name)+'" is not supported',e);return}Ho&&console.log(o);const d=Symbol(o);c.__internalAwake=function(){if(this[d]!==void 0)return;this[d]=this[o],r=G0.getOrCreateSyncer(this);const p=Object.getOwnPropertyDescriptor(this,o);if(p?.set===void 0){let g=!1;Object.defineProperty(this,o,{set:function(f){var y;const v=this[d];if(this[d]=f,g){(F()||Ho)&&console.warn("Recursive call detected",o);return}g=!0;try{const b=vA(f,v);Ho&&console.log("SyncField assignment",o,"changed?",b,f,l),b&&l?.call(this,f,v)!==!1&&((y=bA(this))==null||y.notifyChanged(o,f))}finally{g=!1}},get:function(){return this[d]},configurable:!0,enumerable:!0})}r?.init(this),h.call(this)};const u=c.__internalDestroy;c.__internalDestroy=function(){_A(this),u.call(this)}}};var wA=Object.defineProperty,yp=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&wA(e,t,o),o};const ei=C("debugplayersync"),vp=class PC extends I{constructor(){super(...arguments),a(this,"autoSync",!0),a(this,"asset"),a(this,"onPlayerSpawned"),a(this,"_localInstance"),a(this,"onJoinedRoom",()=>{ei&&console.log("PlayerSync.joinedRoom. autoSync is set to "+this.autoSync),this.autoSync&&this.getInstance()}),a(this,"destroyInstance",()=>{var e;(e=this._localInstance)==null||e.then(t=>{ei&&console.log("PlayerSync.destroyInstance",t),fc(t,this.context.connection,!0,{saveInRoom:!1})}),this._localInstance=void 0})}static async setupFrom(e,t){const s=ce.getOrCreateFromUrl(e);if(!s.asset){const l=await s.loadAssetAsync();l&&P.getOrAddComponent(l,Ms)}const o=new PC;o._internalInit(t),o.asset=s;const r=new E;return r.guid=e,P.addComponent(r,o),o}awake(){this.watchTabVisible(),this.onPlayerSpawned||(this.onPlayerSpawned=new xe)}onEnable(){this.context.connection.beginListen(ie.RoomStateSent,this.onJoinedRoom),this.context.connection.beginListen(ie.JoinedRoom,this.onJoinedRoom),this.context.connection.beginListen(ie.LeftRoom,this.destroyInstance),this.context.connection.isInRoom&&this.onJoinedRoom()}onDisable(){this.context.connection.stopListen(ie.RoomStateSent,this.onJoinedRoom),this.context.connection.stopListen(ie.JoinedRoom,this.onJoinedRoom),this.context.connection.stopListen(ie.LeftRoom,this.destroyInstance)}async getInstance(){var e,t,s,o,r,l;if(this._localInstance)return this._localInstance;if(ei&&console.log("PlayerSync.createInstance",(e=this.asset)==null?void 0:e.url),!((t=this.asset)!=null&&t.asset)&&!((s=this.asset)!=null&&s.url))return console.error('PlayerSync: can not create an instance because "asset" is not set and or has no URL!'),null;this.gameObject.guid||console.warn("PlayerSync: gameObject has no guid! This might cause issues with syncing the player state."),this._localInstance=(o=this.asset)==null?void 0:o.instantiateSynced({parent:this.gameObject,deleteOnDisconnect:!0},!0);const c=await this._localInstance;if(c){const h=P.getComponentsInChildren(c,Ms);if(ei&&console.log(`PlayerSync.createInstance: found ${h?.length} PlayerState components. Owner: ${this.context.connection.connectionId}`),h!=null&&h.length){for(const d of h)d.owner=this.context.connection.connectionId;(r=this.onPlayerSpawned)==null||r.invoke(c)}else this._localInstance=void 0,console.error("<strong>Failed finding PlayerState on "+((l=this.asset)==null?void 0:l.url)+"</strong>: please make sure the asset has a PlayerState component!"),P.destroySynced(c)}else this._localInstance=void 0,console.warn("PlayerSync: failed instantiating asset!");return this._localInstance}watchTabVisible(){window.addEventListener("visibilitychange",e=>{if(document.visibilityState==="visible")for(let t=Ms.all.length-1;t>=0;t--){const s=Ms.all[t];(!s.owner||!this.context.connection.userIsInRoom(s.owner))&&s.doDestroy()}})}};yp([m()],vp.prototype,"autoSync"),yp([m(ce)],vp.prototype,"asset"),yp([m(xe)],vp.prototype,"onPlayerSpawned");let X0=vp;var Q1=(n=>(n.OwnerChanged="ownerChanged",n))(Q1||{}),Ke;const Q0=(Ke=class extends I{constructor(){super(...arguments),a(this,"onOwnerChangeEvent",new xe),a(this,"onFirstOwnerChangeEvent",new xe),a(this,"hasOwner",!1),a(this,"owner"),a(this,"dontDestroy",!1),a(this,"onUserLeftRoom",n=>{if(n.userId===this.owner){ei&&console.log("PLAYERSYNC LEFT",this.owner),this.doDestroy();return}})}static get all(){return Ke._all}static get local(){return Ke._local}static getFor(n){if(n instanceof E)return P.getComponentInParent(n,Ke);if(n instanceof I)return P.getComponentInParent(n.gameObject,Ke)}static isLocalPlayer(n){const e=Ke.getFor(n);return e?.isLocalPlayer??!1}static addEventListener(n,e){return this._callbacks[n]||(this._callbacks[n]=[]),this._callbacks[n].push(e),e}static removeEventListener(n,e){if(!this._callbacks[n])return;const t=this._callbacks[n].indexOf(e);t>=0&&this._callbacks[n].splice(t,1)}static dispatchEvent(n,e){if(this._callbacks[n])for(const t of this._callbacks[n])t(e)}get isLocalPlayer(){return this.owner===this.context.connection.connectionId}onOwnerChange(n,e){var t,s;ei&&console.log(`PlayerSync.onOwnerChange: ${e} \u2192 ${n} (me: ${this.context.connection.connectionId})`);const o=Ke._local.indexOf(this);o>=0&&Ke._local.splice(o,1);const r={playerState:this,oldValue:e,newValue:n};if(this.hasOwner||(this.hasOwner=!0,(t=this.onFirstOwnerChangeEvent)==null||t.invoke(r)),(s=this.onOwnerChangeEvent)==null||s.invoke(r),this.owner===this.context.connection.connectionId){Ke._local.push(this);const c=new CustomEvent("local-owner-changed",{detail:r});this.dispatchEvent(c)}const l=new CustomEvent("owner-changed",{detail:r});this.dispatchEvent(l),Ke.dispatchEvent("ownerChanged",l)}awake(){Ke.all.push(this),ei&&console.log("Registered new PlayerState",this.guid,Ke.all.length-1,Ke.all),this.context.connection.beginListen(ie.UserLeftRoom,this.onUserLeftRoom)}async start(){ei&&console.log("PLAYERSTATE.START, owner: "+this.owner,this.context.connection.usersInRoom([])),this.owner?(this.context.connection.isInRoom||await vs(300),this.context.connection.userIsInRoom(this.owner)==!1&&(ei&&console.log(`PlayerSync.start \u2192 doDestroy "${this.name}" because user "${this.owner}" is not in room anymore...`,"Currently in room:",...this.context.connection.usersInRoom()),this.doDestroy())):this.owner||(ei&&console.warn("PlayerState.start \u2192 owner is undefined!",this.name),setTimeout(()=>{!this.destroyed&&!this.owner?this.dontDestroy?ei&&console.warn("PlayerState.start \u2192 owner is still undefined but dontDestroy is set to true",this.name):(ei&&console.warn(`PlayerState.start \u2192 owner is still undefined: destroying "${this.name}" instance now`),this.doDestroy()):ei&&console.log("PlayerState.start \u2192 owner is assigned",this.owner)},2e3))}doDestroy(){ei&&console.log("PlayerSync.doDestroy \u2192 syncDestroy",this.name),fc(this.gameObject,this.context.connection,!0,{saveInRoom:!1})}onDestroy(){if(ei&&console.warn("PlayerState.onDestroy",this.owner),this.context.connection.stopListen(ie.UserLeftRoom,this.onUserLeftRoom),Ke.all.splice(Ke.all.indexOf(this),1),this.isLocalPlayer){const n=Ke._local.indexOf(this);n>=0&&Ke._local.splice(n,1)}}},a(Ke,"_all",[]),a(Ke,"_local",[]),a(Ke,"_callbacks",{}),Ke);yp([q0(Q0.prototype.onOwnerChange)],Q0.prototype,"owner");let Ms=Q0;var xA=Object.defineProperty,fl=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&xA(e,t,o),o};class un extends I{constructor(){super(...arguments),a(this,"position","bottom"),a(this,"showNeedleLogo",!1),a(this,"showSpatialMenu"),a(this,"createFullscreenButton"),a(this,"createMuteButton"),a(this,"createQRCodeButton")}onEnable(){this.applyOptions()}applyOptions(){this.context.menu.setPosition(this.position),this.context.menu.showNeedleLogo(this.showNeedleLogo),this.createFullscreenButton===!0&&this.context.menu.showFullscreenOption(!0),this.createMuteButton===!0&&this.context.menu.showAudioPlaybackOption(!0),this.showSpatialMenu===!0&&this.context.menu.showSpatialMenu(this.showSpatialMenu),this.createQRCodeButton===!0&&(X.isMobileDevice()||this.context.menu.showQRCodeButton(!0))}}fl([m()],un.prototype,"position"),fl([m()],un.prototype,"showNeedleLogo"),fl([m()],un.prototype,"showSpatialMenu"),fl([m()],un.prototype,"createFullscreenButton"),fl([m()],un.prototype,"createMuteButton"),fl([m()],un.prototype,"createQRCodeButton");var SA=Object.defineProperty,Y0=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&SA(e,t,o),o};const sh=C("debugwebxr"),Y1=new V().setFromAxisAngle(new S(0,1,0),Math.PI);class Go extends I{constructor(){super(...arguments),a(this,"head"),a(this,"leftHand"),a(this,"rightHand"),a(this,"_leftHandMeshes"),a(this,"_rightHandMeshes"),a(this,"_syncTransforms")}async onEnterXR(e){if(!this.activeAndEnabled)return;sh&&console.warn("AVATAR ENTER XR",this.guid,this.sourceId,this,this.activeAndEnabled),this._syncTransforms&&(this._syncTransforms.length=0),await this.prepareAvatar();const t=Ms.getFor(this);if(t!=null&&t.owner){const s=this.gameObject.addComponent(hi);s.avatar=this.gameObject,s.connectionId=t.owner}else this.context.connection.isConnected?console.error("No player state found for avatar",this):t&&!this.context.connection.isConnected&&(t.dontDestroy=!0)}onLeaveXR(e){const t=this.gameObject.getComponent(hi);t&&t.destroy()}onUpdateXR(e){var t,s;if(!this.activeAndEnabled)return;const o=Ms.isLocalPlayer(this);if(!o)return;const r=e.xr;if(r.rig&&r.rig.gameObject!==this.gameObject.parent&&(this.gameObject.position.set(0,0,0),this.gameObject.rotation.set(0,0,0),this.gameObject.scale.set(1,1,1),r.rig.gameObject.add(this.gameObject)),this._syncTransforms&&o)for(const u of this._syncTransforms)u.fastMode=!0,u.isOwned()||u.requestOwnership();if(this.head&&this.context.mainCamera){const u=this.head.asset;if(u.position.copy(this.context.mainCamera.position),u.position.x*=-1,u.position.z*=-1,u.quaternion.copy(this.context.mainCamera.quaternion),u.quaternion.x*=-1,this.context.time.frameCount%10===0&&this.head.asset){const p=P.getComponentsInChildren(this.head.asset,os);for(const g of p)g.enabled=!1,g.gameObject.visible=!1}}const l=e.xr.leftController,c=(t=this.leftHand)==null?void 0:t.asset;l&&c?(c.position.copy(l.gripPosition),c.quaternion.copy(l.gripQuaternion),c.quaternion.multiply(Y1),c.visible=l.isTracking,this.updateHandVisibility(l,c,this._leftHandMeshes)):c&&c.visible&&(c.visible=!1);const h=e.xr.rightController,d=(s=this.rightHand)==null?void 0:s.asset;h&&d?(d.position.copy(h.gripPosition),d.quaternion.copy(h.gripQuaternion),d.quaternion.multiply(Y1),d.visible=h.isTracking,this.updateHandVisibility(h,d,this._rightHandMeshes)):d&&d.visible&&(d.visible=!1)}onBeforeRender(){this.context.xr&&this.context.time.frame%10===0&&this.updateRemoteAvatarVisibility()}updateHandVisibility(e,t,s){if(s){const o=e.model&&e.model.visible&&e.model!==t;s.forEach(r=>{Bn(r,!o)})}}updateRemoteAvatarVisibility(){var e,t,s;if(this.context.connection.isConnected){const o=Ms.getFor(this);if(o&&o.isLocalPlayer==!1){const r=ne.getXRSync(this.context);if(r&&r.hasState(o.owner)){this.tryFindAvatarObjectsIfMissing();const l=(e=this.leftHand)==null?void 0:e.asset;l&&(l.visible=r?.isTracking(o.owner,"left")??!1);const c=(t=this.rightHand)==null?void 0:t.asset;c&&(c.visible=r?.isTracking(o.owner,"right")??!1)}if((s=this.head)!=null&&s.asset){const l=P.getComponentsInChildren(this.head.asset,os);for(const c of l)c.enabled=!1,c.gameObject.visible=!0}}}}tryFindAvatarObjectsIfMissing(){if(!this.head||!this.leftHand||!this.rightHand){const e={head:this.head,leftHand:this.leftHand,rightHand:this.rightHand};O_.tryFindAvatarObjects(this.gameObject,this.sourceId||"",e),e.head&&(this.head=e.head),e.leftHand&&(this.leftHand=e.leftHand),e.rightHand&&(this.rightHand=e.rightHand)}}async prepareAvatar(){var e,t;if(this.tryFindAvatarObjectsIfMissing(),this.head)this.head instanceof E&&(this.head=new ce("",this.sourceId,this.head));else{const s=new E;s.name="Head";const o=wo.createPrimitive(Cr.Cube);s.add(o),this.gameObject.add(s),this.head=new ce("",this.sourceId,s),sh&&console.log("Create head",s)}if(this.rightHand)this.rightHand instanceof E&&(this.rightHand=new ce("",this.sourceId,this.rightHand));else{const s=new E;s.name="Right Hand",this.gameObject.add(s),this.rightHand=new ce("",this.sourceId,s),sh&&console.log("Create right hand",s)}if(this.leftHand)this.leftHand instanceof E&&(this.leftHand=new ce("",this.sourceId,this.leftHand));else{const s=new E;s.name="Left Hand",this.gameObject.add(s),this.leftHand=new ce("",this.sourceId,s),sh&&console.log("Create left hand",s)}await this.loadAvatarObjects(this.head,this.leftHand,this.rightHand),this._leftHandMeshes=[],(e=this.leftHand.asset)==null||e.traverse(s=>{s!=null&&s.isMesh&&this._leftHandMeshes.push(s)}),this._rightHandMeshes=[],(t=this.rightHand.asset)==null||t.traverse(s=>{s!=null&&s.isMesh&&this._rightHandMeshes.push(s)}),Ms.isLocalPlayer(this.gameObject)&&(this._syncTransforms=P.getComponentsInChildren(this.gameObject,sn))}async loadAvatarObjects(e,t,s){const o=e.loadAssetAsync(),r=t.loadAssetAsync(),l=s.loadAssetAsync(),c=new Array;o&&c.push(o),r&&c.push(r),l&&c.push(l);const h=await Jm(c);sh&&console.log("Avatar loaded results:",h)}}Y0([m(ce)],Go.prototype,"head"),Y0([m(ce)],Go.prototype,"leftHand"),Y0([m(ce)],Go.prototype,"rightHand");var CA=Object.defineProperty,bp=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&CA(e,t,o),o};const Yn=C("debugwebxr"),qo=new Array;class pn extends I{constructor(){super(...arguments),a(this,"createControllerModel",!0),a(this,"createHandModel",!0),a(this,"customLeftHand"),a(this,"customRightHand"),a(this,"_models",new Array)}supportsXR(e){return e==="immersive-vr"||e==="immersive-ar"}async onXRControllerAdded(e){var t;if(!(e.xr.isVR||e.xr.isPassThrough))return;const{controller:s}=e;if(Yn&&console.warn("Add Controller Model for",s.side,s.index),this.createControllerModel||this.createHandModel){if(s.hand){if(this.createHandModel){const o=await this.loadHandModel(this,s);if(!o||!s.connected||!s.isHand){o!=null&&o.handObject&&Va(o.handObject,!1),(t=o?.handObject)==null||t.destroy();return}this._models.push({controller:s,model:o.handObject,handmesh:o.handmesh}),this._models.sort((r,l)=>r.controller.index-l.controller.index),this.scene.add(o.handObject),s.model=o.handObject}}else if(this.createControllerModel){const o=await s.getModelUrl();if(o){const r=await this.loadModel(s,o);if(!r||!s.connected||s.isHand)return;this._models.push({controller:s,model:r}),this._models.sort((l,c)=>l.controller.index-c.controller.index),this.scene.add(r),r.traverse(l=>{l.layers.set(2),l.matrixAutoUpdate=!1,l.updateMatrix()}),s.model=r}else s.targetRayMode!=="transient-pointer"&&console.warn("XRControllerModel: no model found for "+s.side)}}}onXRControllerRemoved(e){console.debug("XR Controller Removed",e.controller.side,e.controller.index);const t=this._models.findIndex(o=>o.controller===e.controller),s=this._models[t];s&&(this._models.splice(t,1),s.model&&(Va(s.model,!1),s.model.destroy(),s.model=void 0))}onBeforeXR(e,t){this.createHandModel&&(this.customLeftHand||this.customRightHand)&&(t.optionalFeatures=t.optionalFeatures||[],t.optionalFeatures.includes("hand-tracking")||t.optionalFeatures.push("hand-tracking"))}onLeaveXR(e){for(const t of this._models)t&&(t.model&&(Va(t.model,!1),t.model.destroy(),t.model=void 0),t.controller.model===t.model&&(t.controller.model=null));this._models.length=0}onBeforeRender(){if(ne.active&&(Yn&&(qo[0]=Date.now()),this.updateRendering(ne.active),Yn)){const e=Date.now()-qo[0];qo.push(e),qo.length>=30&&(qo[0]=0,qo.reduce((t,s)=>t+s,0)/qo.length,qo.length=0)}}updateRendering(e){var t,s,o,r,l;for(let c=0;c<this._models.length;c++){const h=this._models[c];if(!h)continue;const d=h.controller;if(!d.connected){Yn&&console.warn("XRControllerModel.onUpdateXR: controller is not connected anymore",d.side,d.hand);continue}if(h.model&&!h.handmesh)h.model.matrixAutoUpdate=!1,h.model.matrix.copy(d.gripMatrix),h.model.visible=d.isTracking,(t=e.rig)==null||t.gameObject.add(h.model);else if(d.inputSource.hand&&h.handmesh){const u=e.referenceSpace,p=this.context.renderer.xr.getHand(d.index);if(u&&e.frame.getJointPose){for(const g of d.inputSource.hand.values()){const f=p.joints[g.jointName];if(f){const y=d.getHandJointPose(g);if(y){const v=y.transform.position,b=y.transform.orientation;f.position.copy(v),f.quaternion.copy(b),f.matrixAutoUpdate=!1}f.visible=y!=null}}h.model&&(h.model.visible=d.isTracking,h.model.visible&&h.model.parent!==((s=e.rig)==null?void 0:s.gameObject)&&((o=e.rig)==null||o.gameObject.add(h.model))),(r=h.model)!=null&&r.visible&&((l=h.handmesh)==null||l.updateMesh(),h.model.matrixAutoUpdate=!1,h.model.matrix.identity(),h.model.applyMatrix4(Ia))}}}}async loadModel(e,t){var s;if(!e.connected)return console.warn("XRControllerModel.onXRControllerAdded: controller is not connected anymore",e.side),null;const o=await ce.getOrCreate("",t).instantiate();return Va(o),(s=ne.active)!=null&&s.isPassThrough&&o.traverseVisible(r=>{this.makeOccluder(r)}),o}async loadHandModel(e,t){const s=this.context,o=s.renderer.xr.getHand(t.index);o||(Yn?$.DrawLabel(t.rayWorldPosition,"No hand found for index "+t.index,.05,5):console.warn("No hand found for index "+t.index));const r=new Rn;jf(r,s),await Ku(r,s,this.sourceId??"");const l=y0(r);let c="";const h=t.side==="left"?this.customLeftHand:this.customRightHand;h?(c=h.url.split(".").slice(0,-1).join("."),r.setPath("")):(c=t.inputSource.handedness==="left"?"left":"right",r.setPath("https://cdn.jsdelivr.net/npm/@webxr-input-profiles/assets@1.0/dist/profiles/generic-hand/"));const d=new E;Va(d);const u=new rO(d,o,r.path,c,r,p=>{var g;const f=l?.gltf;((g=f?.scene.children)==null?void 0:g.length)===0&&(f.scene.children[0]=p),l!=null&&l.gltf&&xs().createBuiltinComponents(e.context,e.sourceId||c,l.gltf,null,l),p.traverse(y=>{var v;y.layers.set(2),(v=ne.active)!=null&&v.isPassThrough&&!h&&this.makeOccluder(y),y instanceof G&&Xe.assignMeshLOD(y,0)}),t.connected||(Yn&&$.DrawLabel(t.rayWorldPosition,"Hand is loaded but not connected anymore",.05,5),p.removeFromParent())});if(Yn&&d.add(new Ci(.5)),t.inputSource.hand){Yn&&console.log(t.inputSource.hand);for(const p of t.inputSource.hand.values())if(o.joints[p.jointName]===void 0){const g=new mo;g.matrixAutoUpdate=!1,g.visible=!0,o.joints[p.jointName]=g,o.add(g)}}else Yn&&$.DrawLabel(t.rayWorldPosition,"No inputSource.hand found for index "+t.index,.05,5);return{handObject:d,handmesh:u}}makeOccluder(e){if(e instanceof G){let t=e.material;t instanceof Pe&&(t=e.material=t.clone(),t.depthWrite=!0,t.depthTest=!0,t.colorWrite=!1,e.receiveShadow=!1,e.renderOrder=-100)}}}a(pn,"factory",new oO),bp([m()],pn.prototype,"createControllerModel"),bp([m()],pn.prototype,"createHandModel"),bp([m(ce)],pn.prototype,"customLeftHand"),bp([m(ce)],pn.prototype,"customRightHand");class _p extends I{}var PA=Object.defineProperty,Xo=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&PA(e,t,o),o};const K0=C("debugwebxr");class Ni extends I{constructor(){super(...arguments),a(this,"movementSpeed",1.5),a(this,"rotationStep",30),a(this,"useTeleport",!0),a(this,"usePinchToTeleport",!0),a(this,"useTeleportTarget",!1),a(this,"useTeleportFade",!1),a(this,"showRays",!0),a(this,"showHits",!0),a(this,"isXRMovementHandler",!0),a(this,"xrSessionMode","immersive-vr"),a(this,"_didApplyRotation",!1),a(this,"_didTeleport",!1),a(this,"_teleportBuffer",new Array),a(this,"_plane",null),a(this,"_lines",[]),a(this,"_hitDiscs",[]),a(this,"_hitDistances",[]),a(this,"_lastHitDistances",[]),a(this,"hitPointRaycastFilter",e=>e.type==="SkinnedMesh"?"continue in children":!0)}onUpdateXR(e){const t=e.xr.rig;if(!(t!=null&&t.gameObject)||e.xr.isPassThrough)return;const s=e.xr.leftController,o=e.xr.rightController;s&&this.onHandleMovement(s,t.gameObject),o&&(this.onHandleRotation(o,t.gameObject),this.useTeleport&&this.onHandleTeleport(o,t.gameObject))}onLeaveXR(e){for(const t of this._lines)t.removeFromParent();for(const t of this._hitDiscs)t?.removeFromParent()}onBeforeRender(){var e;(e=this.context.xr)!=null&&e.running&&(this.showRays&&this.renderRays(this.context.xr),this.showHits&&this.renderHits(this.context.xr))}onHandleMovement(e,t){const s=e.getStick("xr-standard-thumbstick");if(s.x!=0||s.y!=0){const o=q(s.x,0,s.y);o.multiplyScalar(this.context.time.deltaTimeUnscaled*this.movementSpeed);const r=Ge(t);o.multiplyScalar(r.x),o.applyQuaternion(e.xr.poseOrientation),o.y=0,o.applyQuaternion(t.worldQuaternion),t.position.add(o),t.updateWorldMatrix(!1,!1);for(const l of t.children)l.updateWorldMatrix(!1,!1)}}onHandleRotation(e,t){if(e._isMxInk)return;const s=e.getStick("xr-standard-thumbstick").x;if(this._didApplyRotation)Math.abs(s)<.3&&(this._didApplyRotation=!1);else if(Math.abs(s)>.5){this._didApplyRotation=!0;const o=s>0?1:-1,r=ee(this.context.mainCamera).clone();t.rotateY(o*W.toRadians(this.rotationStep));const l=ee(this.context.mainCamera).clone().sub(r);l.y=0,t.position.sub(l)}}onHandleTeleport(e,t){var s,o,r,l,c;let h=0;if(e.hand&&this.usePinchToTeleport&&e.isTeleportGesture){const d=e.getPointerId("primary");if(d!=null&&this.context.input.getIsPointerIdInUse(d))return;const u=e.getGesture("pinch");u&&(h=u.value)}else h=(s=e.getStick("xr-standard-thumbstick"))==null?void 0:s.y;if(this._didTeleport)h>=0&&h<.4?this._didTeleport=!1:h<0&&h>-.4&&(this._didTeleport=!1);else if(h>.8){this._didTeleport=!0;const d=this.context.physics.raycastFromRay(e.ray)[0];if(d&&d.object instanceof ka){const p=(o=d.normal)==null?void 0:o.dot(q(0,1,0));if(p!==void 0&&p<.4)return}let u=d?.point;if(!u&&!this.useTeleportTarget){this._plane||(this._plane=new yr(new S(0,1,0),0));const p=t.worldPosition;this._plane.setFromNormalAndCoplanarPoint(new S(0,1,0),p);const g=e.ray;u=p.clone(),this._plane.intersectLine(new MP(g.origin,q(g.direction).multiplyScalar(1e4).add(g.origin)),u),u.distanceTo(p)>t.scale.x*10&&(u=null)}if(u){if(this.useTeleportTarget&&!P.getComponentInParent(d.object,_p))return;const p=u.clone();if(K0&&$.DrawSphere(u,.025,16711680,5),(r=this.context.mainCamera)==null?void 0:r.position){const g=(l=this.context.xr)==null?void 0:l.getUserOffsetInRig();g&&(g.y=0,p.sub(g),K0&&$.DrawWireSphere(g.add(p),.025,65280,5))}this._teleportBuffer.push(t.matrix.clone()),this._teleportBuffer.length>10&&this._teleportBuffer.shift(),this.useTeleportFade?(c=e.xr.fadeTransition())==null||c.then(()=>{t.worldPosition=p}):t.worldPosition=p}}else if(h<-.8&&(this._didTeleport=!0,this._teleportBuffer.length>0)){const d=this._teleportBuffer.pop();d&&d.decompose(t.position,t.quaternion,t.scale)}}renderRays(e){var t;for(let s=0;s<this._lines.length;s++){const o=this._lines[s];o&&(o.visible=!1)}for(let s=0;s<e.controllers.length;s++){const o=e.controllers[s];let r=this._lines[s];if(!o.connected||!o.isTracking||!o.ray||o.targetRayMode==="transient-pointer"||!o.hasSelectEvent){r&&(r.visible=!1);continue}r||(r=this.createRayLineObject(),r.scale.z=.5,this._lines[s]=r),o.updateRayWorldPosition(),o.updateRayWorldQuaternion();const l=o.rayWorldPosition,c=o.rayWorldQuaternion;r.position.copy(l),r.quaternion.copy(c);const h=e.rigScale,d=this.usePinchToTeleport&&o.isTeleportGesture,u=this._lastHitDistances[s],p=this._hitDistances[s]!=null,g=u??h;r.scale.set(h,h,g),r.visible=!0,r.layers.disableAll(),r.layers.enable(2);let f=r.material.opacity;d?f=1:this.showHits&&g<e.rigScale*.5?f=0:(t=o.getButton("primary"))!=null&&t.pressed?f=.5:f=p?.2:.1,r.material.opacity=W.lerp(r.material.opacity,f,this.context.time.deltaTimeUnscaled/.1),r.parent!==this.context.scene&&this.context.scene.add(r)}}renderHits(e){var t;for(const s of this._hitDiscs){if(!s)continue;const o=s.controller;if(!o||!o.connected||!o.isTracking){s.visible=!1;continue}}for(let s=0;s<e.controllers.length;s++){const o=e.controllers[s];if(!o.connected||!o.isTracking||!o.ray||!o.hasSelectEvent)continue;let r=this._hitDiscs[s],l=!0;const c=o.getPointerId("primary");c!=null&&this.context.input.getIsPointerIdInUse(c)&&(r&&(r.visible=!1),this._hitDistances[s]=null,this._lastHitDistances[s]=0,l=!1);const h=this.context.time.smoothedFps>=59?1:10;if((this.context.time.frame+o.index)%h!==0&&(l=!1),!l){const p=this._hitDiscs[s];p&&p.visible&&p.hit&&this.updateHitPointerPosition(o,p,p.hit.distance);continue}const d=this.context.physics.raycastFromRay(o.ray,{testObject:this.hitPointRaycastFilter,precise:!1});let u=d.find(p=>this.usePinchToTeleport&&o.isTeleportGesture?!0:this.isObjectWithInteractiveComponent(p.object));if(u||(u=d[0]),r&&(r.controller=o,r.hit=u),this._hitDistances[s]=u?.distance||null,u){this._lastHitDistances[s]=u.distance;const p=e.rigScale??1;K0&&($.DrawWireSphere(u.point,.025*p,16711680),$.DrawLabel(q(0,.2,0).add(u.point),u.object.name,.02,0)),r||(r=this.createHitPointObject(),this._hitDiscs[s]=r),r.hit=u,r.visible=u.distance>p*.05;let g=.01*(p+u.distance);const f=(t=o.getButton("primary"))==null?void 0:t.pressed;f&&(g*=1.1),r.scale.set(g,g,g),r.layers.set(2);let y=r.material.opacity;if(f?y=1:y=u.distance<.15*p?.2:.6,r.material.opacity=W.lerp(r.material.opacity,y,this.context.time.deltaTimeUnscaled/.1),r.visible){if(u.normal){this.updateHitPointerPosition(o,r,u.distance);const v=u.normal.applyQuaternion(Se(u.object));r.quaternion.setFromUnitVectors(OA,v)}else this.updateHitPointerPosition(o,r,u.distance);r.parent!==this.context.scene&&this.context.scene.add(r)}}else this._hitDiscs[s]&&(this._hitDiscs[s].visible=!1)}}isObjectWithInteractiveComponent(e,t=0){return Mu(e)||e.isUI===!0?!0:e.isScene?!1:e.parent?this.isObjectWithInteractiveComponent(e.parent,t+1):!1}updateHitPointerPosition(e,t,s){const o=q(e.rayWorldPosition);o.add(q(0,0,s-.01).applyQuaternion(e.rayWorldQuaternion)),t.position.lerp(o,this.context.time.deltaTimeUnscaled/.05)}createHitPointObject(){const e=new G(new pd(.3,6,6),new Me({color:15658734,opacity:.7,transparent:!0,depthTest:!1,depthWrite:!1,side:Pi}));return e.layers.disableAll(),e.layers.enable(2),e}createRayLineObject(){const e=new aO;e.layers.disableAll(),e.layers.enable(2);const t=new lO;e.geometry=t;const s=new Float32Array(9);s.set([0,0,.02,0,0,.4,0,0,1]),t.setPositions(s);const o=new Float32Array(9);o.set([1,1,1,.1,.1,.1,0,0,0]),t.setColors(o);const r=new cO({color:16777215,vertexColors:!0,worldUnits:!0,linewidth:.004,transparent:!0,depthWrite:!1,blending:Uv,dashed:!1});return e.material=r,e}}Xo([m()],Ni.prototype,"movementSpeed"),Xo([m()],Ni.prototype,"rotationStep"),Xo([m()],Ni.prototype,"useTeleport"),Xo([m()],Ni.prototype,"usePinchToTeleport"),Xo([m()],Ni.prototype,"useTeleportTarget"),Xo([m()],Ni.prototype,"useTeleportFade"),Xo([m()],Ni.prototype,"showRays"),Xo([m()],Ni.prototype,"showHits");const OA=new S(0,1,0);var kA=Object.defineProperty,Ct=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&kA(e,t,o),o};const nh=C("debugwebxr"),MA=C("debugusdz");var Qo;const pt=(Qo=class extends I{constructor(){super(...arguments),a(this,"createVRButton",!0),a(this,"createARButton",!0),a(this,"createSendToQuestButton",!0),a(this,"createQRCode",!0),a(this,"useDefaultControls",!0),a(this,"showControllerModels",!0),a(this,"showHandModels",!0),a(this,"usePlacementReticle",!0),a(this,"customARPlacementReticle"),a(this,"usePlacementAdjustment",!0),a(this,"arScale",1),a(this,"useXRAnchor",!1),a(this,"autoPlace",!1),a(this,"autoCenter",!1),a(this,"useQuicklookExport",!1),a(this,"useDepthSensing",!1),a(this,"useSpatialGrab",!0),a(this,"defaultAvatar"),a(this,"_playerSync"),a(this,"_createdComponentsInSession",[]),a(this,"_usdzExporter"),a(this,"_exitXRMenuButton"),a(this,"_previousXRState",0),a(this,"_spatialGrabRaycaster"),a(this,"_activeWebARSessionRoot",null),a(this,"onAvatarSpawned",n=>{nh&&console.log("WebXR.onAvatarSpawned",n),P.getComponentInChildren(n,Go)??(i=P.addComponent(n,Go))}),a(this,"_buttonFactory"),a(this,"_buttons",[])}awake(){ne.getXRSync(this.context)}onEnable(){var n,e;window.location.protocol!=="https:"&&be('<a href="https://developer.mozilla.org/en-US/docs/Web/API/WebXR_Device_API" target="_blank">WebXR</a> only works on secure connections (https).'),this.useQuicklookExport&&(P.findObjectOfType(gn)||(nh&&console.log("WebXR: Adding USDZExporter"),this._usdzExporter=P.addComponent(this.gameObject,gn),this._usdzExporter.objectToExport=this.context.scene,this._usdzExporter.autoExportAnimations=!0,this._usdzExporter.autoExportAudioSources=!0)),this.handleCreatingHTML(),this.handleOfferSession(),this.defaultAvatar===!0&&(nh&&console.warn("WebXR: No default avatar set, using static default avatar"),this.defaultAvatar=new ce("https://cdn.needle.tools/static/avatars/DefaultAvatar.glb")),this.defaultAvatar&&(this._playerSync=this.gameObject.getOrAddComponent(X0),this._playerSync.autoSync=!1),this._playerSync&&typeof this.defaultAvatar!="boolean"&&(this._playerSync.asset=this.defaultAvatar,(n=this._playerSync.onPlayerSpawned)==null||n.removeEventListener(this.onAvatarSpawned),(e=this._playerSync.onPlayerSpawned)==null||e.addEventListener(this.onAvatarSpawned))}onDisable(){var n;(n=this._usdzExporter)==null||n.destroy(),this.removeButtons()}async handleOfferSession(){return this.createVRButton&&await ne.isVRSupported()&&this.createVRButton?ne.offerSession("immersive-vr","default",this.context):this.createARButton&&await ne.isARSupported()&&this.createARButton?ne.offerSession("immersive-ar","default",this.context):!1}get session(){return ne.active??null}get sessionMode(){return ne.activeMode??null}get arSessionRoot(){return this._activeWebARSessionRoot}async enterVR(n){return ne.start("immersive-vr",n,this.context)}async enterAR(n){return ne.start("immersive-ar",n,this.context)}exitXR(){ne.stop()}get isActiveWebXR(){return!Qo.activeWebXRComponent||Qo.activeWebXRComponent===this}onBeforeXR(n,e){var t;if(!this.isActiveWebXR){console.warn(`WebXR: another WebXR component is already active (${(t=Qo.activeWebXRComponent)==null?void 0:t.name}). This is ignored: ${this.name}`);return}Qo.activeWebXRComponent=this,n=="immersive-ar"&&this.useDepthSensing&&(e.optionalFeatures=e.optionalFeatures||[],e.optionalFeatures.push("depth-sensing"))}async onEnterXR(n){if(!this.isActiveWebXR)return;nh&&console.log("WebXR onEnterXR"),this._previousXRState=Di.Global.Mask;const e=n.xr.isVR;if(Di.Global.Set(e?rn.VR:rn.AR),n.xr.isAR){let t=P.findObjectOfType($o);if(!t)if(this.usePlacementReticle){const s=new E;for(const o of this.context.scene.children)s.add(o);this.context.scene.add(s),t=P.addComponent(s,$o),this._createdComponentsInSession.push(t)}else(nh||F())&&console.warn("WebXR: No WebARSessionRoot found in scene and usePlacementReticle is disabled in WebXR component.");this._activeWebARSessionRoot=t,t&&(t.customReticle=this.customARPlacementReticle,t.arScale=this.arScale,t.arTouchTransform=this.usePlacementAdjustment,t.autoPlace=this.autoPlace,t.autoCenter=this.autoCenter,t.useXRAnchor=this.useXRAnchor)}this.useDefaultControls&&this.setDefaultMovementEnabled(!0),(this.showControllerModels||this.showHandModels)&&this.setDefaultControllerRenderingEnabled(!0),this.useSpatialGrab&&(this._spatialGrabRaycaster=P.findObjectOfType(Dc)??void 0,this._spatialGrabRaycaster||(this._spatialGrabRaycaster=this.gameObject.addComponent(Dc))),this.createLocalAvatar(n.xr),n.xr.isScreenBasedAR||(this._exitXRMenuButton=this.context.menu.appendChild({label:"Quit XR",onClick:()=>this.exitXR(),icon:"exit_to_app",priority:2e4}))}onUpdateXR(n){this.isActiveWebXR&&this._spatialGrabRaycaster&&(this._spatialGrabRaycaster.enabled=this.useSpatialGrab)}onLeaveXR(n){var e,t;if((e=this._exitXRMenuButton)==null||e.remove(),!!this.isActiveWebXR){Di.Global.Set(this._previousXRState),(t=this._playerSync)==null||t.destroyInstance();for(const s of this._createdComponentsInSession)s.destroy();this._createdComponentsInSession.length=0,this._activeWebARSessionRoot=null,this.handleOfferSession(),ql(1).then(()=>Qo.activeWebXRComponent=null)}}setDefaultMovementEnabled(n){let e=this.gameObject.getComponent(Ni);return!e&&n&&(e=this.gameObject.addComponent(Ni),this._createdComponentsInSession.push(e)),e&&(e.enabled=n),e}setDefaultControllerRenderingEnabled(n){let e=this.gameObject.getComponent(pn);return!e&&n&&(e=this.gameObject.addComponent(pn),this._createdComponentsInSession.push(e),e.createControllerModel=this.showControllerModels,e.createHandModel==this.showHandModels),e&&(e.enabled=n),e}async createLocalAvatar(n){this._playerSync&&n.running&&typeof this.defaultAvatar!="boolean"&&(this._playerSync.asset=this.defaultAvatar,await this._playerSync.getInstance())}getButtonsContainer(){return this.getButtonsFactory()}getButtonsFactory(){return this._buttonFactory||(this._buttonFactory=pl.getOrCreate()),this._buttonFactory}handleCreatingHTML(){if(this.createARButton||this.createVRButton||this.useQuicklookExport){if((X.isiOS()&&X.isSafari()||MA)&&this.useQuicklookExport){const n=P.findObjectOfType(gn);if(!n||n&&n.allowCreateQuicklookButton){const e=this.getButtonsFactory().createQuicklookButton();this.addButton(e,50)}}if(this.createARButton){const n=this.getButtonsFactory().createARButton();this.addButton(n,50)}if(this.createVRButton){const n=this.getButtonsFactory().createVRButton();this.addButton(n,50)}}if(this.createSendToQuestButton&&!X.isQuest()&&ne.isVRSupported().then(n=>{if(!n){const e=this.getButtonsFactory().createSendToQuestButton();this.addButton(e,50)}}),this.createQRCode){const n=xc(un);if(n&&n.createQRCodeButton===!1)F()&&console.warn("WebXR: QRCode button is disabled in the Needle Menu component");else if(!X.isMobileDevice()){const e=Po.getOrCreate().createQRCode();this.addButton(e,50)}}}addButton(n,e){this._buttons.push(n),n.setAttribute("priority",e.toString()),this.context.menu.appendChild(n)}removeButtons(){for(const n of this._buttons)n.remove();this._buttons.length=0}},a(Qo,"activeWebXRComponent",null),Qo);Ct([m()],pt.prototype,"createVRButton"),Ct([m()],pt.prototype,"createARButton"),Ct([m()],pt.prototype,"createSendToQuestButton"),Ct([m()],pt.prototype,"createQRCode"),Ct([m()],pt.prototype,"useDefaultControls"),Ct([m()],pt.prototype,"showControllerModels"),Ct([m()],pt.prototype,"showHandModels"),Ct([m()],pt.prototype,"usePlacementReticle"),Ct([m(ce)],pt.prototype,"customARPlacementReticle"),Ct([m()],pt.prototype,"usePlacementAdjustment"),Ct([m()],pt.prototype,"arScale"),Ct([m()],pt.prototype,"useXRAnchor"),Ct([m()],pt.prototype,"autoPlace"),Ct([m()],pt.prototype,"autoCenter"),Ct([m()],pt.prototype,"useQuicklookExport"),Ct([m()],pt.prototype,"useDepthSensing"),Ct([m()],pt.prototype,"useSpatialGrab"),Ct([m(ce)],pt.prototype,"defaultAvatar");let wp=pt;const xp=C("debugusdzbehaviours");class Z0{constructor(){a(this,"behaviours",[]),a(this,"behaviourComponents",[]),a(this,"behaviourComponentsCopy",[]),a(this,"audioClips",[]),a(this,"audioClipsCopy",[]),a(this,"targetUuids",new Set)}get extensionName(){return"Behaviour"}addBehavior(e){this.behaviours.push(e)}addAudioClip(e){if(!e||typeof e!="string")return"";const t="audio/"+_a.getName(e);return this.audioClips.push({clipUrl:e,filesKey:t}),t}getAllTargetUuids(){return this.targetUuids}onBeforeBuildDocument(e){if(!e.root)return Promise.resolve();const t=[];return e.root.traverse(s=>{P.foreachComponent(s,o=>{var r;const l=o;if(typeof l.createBehaviours=="function"||typeof l.beforeCreateDocument=="function"||typeof l.afterCreateDocument=="function"||typeof l.afterSerialize=="function"){this.behaviourComponents.push(l);const c=(r=l.beforeCreateDocument)==null?void 0:r.call(l,this,e);c instanceof Promise&&t.push(c)}},!1)}),xp&&console.log("onBeforeBuildDocument: all components",this.behaviourComponents),Promise.all(t)}onExportObject(e,t,s){var o;for(const r of this.behaviourComponents)(o=r.createBehaviours)==null||o.call(r,this,t,s)}onAfterBuildDocument(e){for(const p of this.behaviourComponents)typeof p.afterCreateDocument=="function"&&p.afterCreateDocument(this,e);this.behaviourComponentsCopy=this.behaviourComponents.slice(),this.behaviourComponents.length=0,this.audioClipsCopy=this.audioClips.slice(),this.audioClips.length=0;const t=new Set,s=new Set,o=new Set,r=new Set,l=xp;let c=`graph LR
|
|
1252
|
+
`,h="";function d(p){if(p instanceof Wo){l&&(c+=`subgraph Group_${p.id}
|
|
1253
|
+
`);for(const g of p.actions)l&&(c+=`${p.id}[${p.id}] -- ${p.type},loops:${p.loops} --> ${g.id}[${g.id}]
|
|
1254
|
+
`),d(g);l&&(c+=`end
|
|
1255
|
+
`)}else if(p instanceof ks){p.tokenId==="StartAnimation"&&r.add(p);let g=p.tokenId;p.type!==void 0&&(g+=":"+p.type);const f=p.affectedObjects;if(f)if(Array.isArray(f))for(const v of f)s.add(v),l&&(h+=`${p.id}[${p.id}
|
|
1256
|
+
${g}] -- ${g} --> ${v.uuid}(("${v.displayName||v.name||v.uuid}"))
|
|
1257
|
+
`);else typeof f=="object"?(s.add(f),l&&(h+=`${p.id}[${p.id}
|
|
1258
|
+
${g}] -- ${g} --> ${f.uuid}(("${f.displayName||f.name||f.uuid}"))
|
|
1259
|
+
`)):typeof f=="string"&&s.add({uuid:f});const y=p.xFormTarget;y&&(typeof y=="object"?(s.add(y),l&&(h+=`${p.id}[${p.id}
|
|
1260
|
+
${g}] -- ${g} --> ${y.uuid}(("${y.displayName||y.name||y.uuid}"))
|
|
1261
|
+
`)):typeof y=="string"&&s.add({uuid:y}))}}function u(p,g){if(Array.isArray(p))for(const f of p)u(f,g);else if(p instanceof hl){let f=p.tokenId;p.type!==void 0&&(f+=":"+p.type),typeof p.targetId=="object"&&(t.add(p.targetId),l&&(h+=`${p.targetId.uuid}(("${p.targetId.displayName}")) --> ${p.id}[${p.id}
|
|
1262
|
+
${f}]
|
|
1263
|
+
`)),l&&(c+=`${p.id}((${p.id})) -- ${f} --> ${g.id}[${g.tokenId||g.id}]
|
|
1264
|
+
`)}}for(const p of this.behaviours)l&&(c+=`subgraph ${p.id}
|
|
1265
|
+
`),d(p.action),u(p.trigger,p.action),l&&(c+=`end
|
|
1266
|
+
`);l&&(c+=`
|
|
1267
|
+
`+h),l&&(console.log("All USDZ behaviours",this.behaviours),this.behaviours.length&&(console.warn("The Mermaid graph can be pasted into https://massive-mermaid.glitch.me/ or https://mermaid.live/edit. It should be in your clipboard already!"),console.log(c),navigator.clipboard.writeText(c)));{let p=`gantt
|
|
1268
|
+
title Animations
|
|
1269
|
+
dateFormat X
|
|
1270
|
+
axisFormat %s
|
|
1271
|
+
`;const g=Array.from(r),f=new Set;for(const _ of g)if(_.affectedObjects&&typeof _.affectedObjects!="string"){if(Array.isArray(_.affectedObjects))for(const w of _.affectedObjects)f.add(w);else f.add(_.affectedObjects);l&&(p+=`section ${_.animationName} (${_.id})
|
|
1272
|
+
`,p+=`${_.id} : ${_.start}, ${_.duration}s
|
|
1273
|
+
`)}l&&r.size&&console.log(p);const y=new Set;for(const _ of f){_.getPath||console.error("USDZExporter: Animation target object has no getPath method. This is likely a bug",_);let w=_.getPath();w.startsWith("<")&&(w=w.substring(1)),w.endsWith(">")&&(w=w.substring(0,w.length-1)),y.add({path:w,obj:_})}const v=Array.from(y).sort((_,w)=>_.path.length-w.path.length),b=new Array;for(let _=0;_<v.length;_++)for(let w=_+1;w<v.length;w++)if(v[w].path.startsWith(v[_].path)){const x=v[w],k=v[_];b.push({child:x.obj.displayName+" ("+x.path+")",parent:k.obj.displayName+" ("+k.path+")"})}b.length&&console.warn("USDZExporter: There are overlapping PlayAnimation actions. This can lead to undefined runtime behaviour when playing multiple animations. Please restructure the hierarchy so that animations don't overlap.",{overlappingTargets:b,playAnimationActions:r})}for(const p of new Set([...t,...s]))if(Array.isArray(p))for(const g of p)o.add(g.uuid);else o.add(p.uuid);xp&&console.log("All Behavior trigger sources and action targets",t,s,o),this.targetUuids=new Set(o)}onAfterHierarchy(e,t){var s;if((s=this.behaviours)!=null&&s.length){t.beginBlock('def Scope "Behaviors"');for(const o of this.behaviours)o.writeTo(this,e.document,t);t.closeBlock()}}async onAfterSerialize(e){xp&&console.log("onAfterSerialize behaviours",this.behaviourComponentsCopy);for(const t of this.behaviourComponentsCopy)typeof t.afterSerialize=="function"&&(t.afterSerialize.constructor.name==="AsyncFunction"?await t.afterSerialize(this,e):t.afterSerialize(this,e));for(const{clipUrl:t,filesKey:s}of this.audioClipsCopy){if(e.files[s])return;const o=await(await(await fetch(t)).blob()).arrayBuffer(),r=new Uint8Array(o);e.files[s]=r}this.behaviourComponentsCopy.length=0,this.audioClipsCopy.length=0}}class J0{get extensionName(){return"Physics"}onExportObject(e,t,s){const o=P.getComponents(e,dt).filter(h=>h.enabled),r=P.getComponents(e,ui).filter(h=>h.enabled&&!h.isTrigger);let l=o.length>0?o[0]:null;const c=r.length>0?r[0]:null;c&&!l&&(l=new dt,l.isKinematic=!0),l&&t.addEventListener("serialize",(h,d)=>{var u,p,g;if(l){if(h.appendLine(),h.beginBlock('def RealityKitComponent "RigidBody"',"{",!0),l.useGravity||h.appendLine("bool gravityEnabled = 0"),h.appendLine('uniform token info:id = "RealityKit.RigidBody"'),l.isKinematic&&h.appendLine('token motionType = "Kinematic"'),h.beginBlock('def RealityKitStruct "massFrame"',"{",!0),h.appendLine(`float m_mass = ${l.mass}`),h.beginBlock('def RealityKitStruct "m_pose"',"{",!0),h.appendLine(`float3 position = (${l.centerOfMass.x}, ${l.centerOfMass.y}, ${l.centerOfMass.z})`),h.closeBlock("}"),h.closeBlock("}"),r.length>0){const f=r[0];h.beginBlock('def RealityKitStruct "material"',"{",!0);const y=f.sharedMaterial;y&&y.dynamicFriction!==void 0&&h.appendLine(`double dynamicFriction = ${(u=f.sharedMaterial)==null?void 0:u.dynamicFriction}`),y&&y.bounciness!==void 0&&h.appendLine(`double restitution = ${(p=f.sharedMaterial)==null?void 0:p.bounciness}`),y&&y.staticFriction!==void 0&&h.appendLine(`double staticFriction = ${(g=f.sharedMaterial)==null?void 0:g.staticFriction}`),h.closeBlock("}")}h.closeBlock("}")}}),c&&(t.addEventListener("serialize",(h,d)=>{var u;h.beginBlock('def RealityKitComponent "Collider"',"{",!0),h.appendLine("uint group = 1"),h.appendLine('uniform token info:id = "RealityKit.Collider"'),h.appendLine("uint mask = 4294967295");const p=c.isTrigger?"Trigger":"Default";if(h.appendLine(`token type = "${p}"`),h.beginBlock('def RealityKitStruct "Shape"',"{",!0),c instanceof Ja){const g=c;h.appendLine('token shapeType = "Sphere"'),h.appendLine(`float radius = ${g.radius}`)}else if(c instanceof Nu){const g=c;h.appendLine('token shapeType = "Box"'),h.appendLine(`float3 extent = (${g.size.x}, ${g.size.y}, ${g.size.z})`)}else if(c instanceof Wn){const g=c;h.appendLine('token shapeType = "Capsule"'),h.appendLine(`float radius = ${g.radius}`),h.appendLine(`float height = ${g.height}`)}else if(c instanceof Fo&&(u=c.sharedMesh)!=null&&u.geometry){const g=c.sharedMesh.geometry;g.boundingBox||g.computeBoundingBox();const f=c.sharedMesh.geometry.boundingBox;f&&(h.appendLine('token shapeType = "Box"'),h.appendLine(`float3 extent = (${f.max.x-f.min.x}, ${f.max.y-f.min.y}, ${f.max.z-f.min.z})`),console.log("[USDZ] Only Box, Sphere, and Capsule colliders are supported in visionOS/iOS. MeshCollider will be exported as Box",c))}else console.warn("[USDZ] Only Box, Sphere, and Capsule colliders are supported in visionOS/iOS. Ignoring collider:",c);h.beginBlock('def RealityKitStruct "pose"',"{",!0),h.closeBlock("}"),h.closeBlock("}"),h.closeBlock("}")}),r.length>1&&console.log("WARNING: Multiple colliders detected. visionOS / iOS can only support objects with a single collider, only exporting the first collider: ",c))}}const RA=C("debugshadowcomponents");eb.prototype.interactable={get(){return this.interactive},set(n){this.interactable=n}};class ps extends I{constructor(){super(...arguments),a(this,"_shadowComponent",null),a(this,"_controlsChildLayout",!0),a(this,"_root"),a(this,"_parentComponent")}isRoot(){var e;return((e=this.Root)==null?void 0:e.gameObject)===this.gameObject}get canvas(){const e=this.Root;return e!=null&&e.isCanvas?e:null}get Canvas(){return this.canvas}markDirty(){ii.markUIDirty(this.context)}get shadowComponent(){return this._shadowComponent}set shadowComponent(e){this._shadowComponent=e}get controlsChildLayout(){return this._controlsChildLayout}set controlsChildLayout(e){this._controlsChildLayout=e,this.shadowComponent&&(this.shadowComponent.autoLayout=e)}get Root(){return this._root===void 0&&(this._root=P.getComponentInParent(this.gameObject,oh)),this._root}__internalNewInstanceCreated(e){return super.__internalNewInstanceCreated(e),this.shadowComponent=null,this._root=void 0,this._parentComponent=void 0,this}onEnable(){super.onEnable()}addShadowComponent(e,t){var s;if(!e)return;this.removeShadowComponent();const o=this.isRoot()?this.gameObject:this.gameObject.parent;if(this._parentComponent=P.getComponentInParent(o,ps),!this._parentComponent){console.warn(`Component "${this.name}" doesn't have a UI parent anywhere. Do you have an UI element outside a Canvas? UI components must be a child of a Canvas component`,this);return}e.name=this.name+" ("+(this.constructor.name??"UI")+")",e.autoLayout=this._parentComponent.controlsChildLayout,e[Mi]=this,this.setShadowComponentOwner(e);let r=!1;if(((s=this.Root)==null?void 0:s.gameObject)===this.gameObject)this.gameObject.add(e);else{const l=this._parentComponent.shadowComponent;l&&(l?.add(e),r=!0)}this.shadowComponent=e,t&&t.shadowComponent&&this.shadowComponent&&t.shadowComponent.add(this.shadowComponent),yc&&e.add(new Ci(.5)),this.onAfterAddedToScene(),r&&kO(),RA&&console.warn("Added shadow component",this.shadowComponent)}setShadowComponentOwner(e){if(e&&(e[Mi]===void 0||e[Mi]===this)&&(e[Mi]=this,e.children))for(const t of e.children)this.setShadowComponentOwner(t)}traverseOwnedShadowComponents(e,t,s){if(e&&e[Mi]===t){s(e);for(const o of e.children)this.traverseOwnedShadowComponents(o,t,s)}}removeShadowComponent(){this.shadowComponent&&this.shadowComponent.removeFromParent()}onAfterAddedToScene(){}setInteractable(e){this.shadowComponent&&(this.shadowComponent.interactable=e)}}class oh extends ps{awake(){super.awake()}}var TA=Object.defineProperty,EA=Object.getOwnPropertyDescriptor,rh=(n,e,t,s)=>{for(var o=s>1?void 0:s?EA(e,t):e,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=(s?l(e,t,o):l(o))||o);return s&&o&&TA(e,t,o),o};const ey=C("debugui"),ty=C("debuguilayout");class K1{constructor(){a(this,"width"),a(this,"height")}}class Z1{constructor(){a(this,"x"),a(this,"y"),a(this,"width"),a(this,"height")}}const Rs=new S,ah=new se,Sp=new V,yl=class OC extends ps{constructor(){super(...arguments),a(this,"_anchoredPosition"),a(this,"sizeDelta",new re(100,100)),a(this,"pivot",new re(.5,.5)),a(this,"anchorMin",new re(0,0)),a(this,"anchorMax",new re(1,1)),a(this,"minWidth"),a(this,"minHeight"),a(this,"lastMatrix"),a(this,"rectBlock"),a(this,"_transformNeedsUpdate",!1),a(this,"_initialPosition"),a(this,"_parentRectTransform"),a(this,"_lastUpdateFrame",-1),a(this,"_lastAnchoring"),a(this,"_createdBlocks",[]),a(this,"_createdTextBlocks",[])}get parent(){return this._parentRectTransform}get translation(){return this.gameObject.position}get rotation(){return this.gameObject.quaternion}get scale(){return this.gameObject.scale}get anchoredPosition(){return this._anchoredPosition||(this._anchoredPosition=new re),this._anchoredPosition}set anchoredPosition(e){this._anchoredPosition=e}get width(){let e=this.sizeDelta.x;if(this.anchorMin.x!==this.anchorMax.x&&this._parentRectTransform){const t=this._parentRectTransform.width,s=this.anchorMax.x-this.anchorMin.x;e=t*s,e+=this.sizeDelta.x}return this.minWidth!==void 0&&e<this.minWidth?this.minWidth:e}get height(){let e=this.sizeDelta.y;if(this.anchorMin.y!==this.anchorMax.y&&this._parentRectTransform){const t=this._parentRectTransform.height,s=this.anchorMax.y-this.anchorMin.y;e=t*s,e+=this.sizeDelta.y}return this.minHeight!==void 0&&e<this.minHeight?this.minHeight:e}awake(){super.awake(),this._lastUpdateFrame=-1,this._parentRectTransform=void 0,this.rectBlock=new E,this.rectBlock.name=this.name,this.lastMatrix=new se,this._lastAnchoring=null,this._initialPosition=this.gameObject.position.clone(),this._initialPosition.z=0,this._anchoredPosition||(this._anchoredPosition=new re),Ya(this,"_anchoredPosition",()=>{this.markDirty()}),Ya(this,"sizeDelta",()=>{this.markDirty()}),Ya(this,"pivot",()=>{this.markDirty()}),Ya(this,"anchorMin",()=>{this.markDirty()}),Ya(this,"anchorMax",()=>{this.markDirty()})}onEnable(){var e;super.onEnable(),this.rectBlock||(this.rectBlock=new E),this.lastMatrix||(this.lastMatrix=new se),this._lastAnchoring||(this._lastAnchoring=new re),this._initialPosition||(this._initialPosition=new S),this._anchoredPosition||(this._anchoredPosition=new re),this.addShadowComponent(this.rectBlock),this._transformNeedsUpdate=!0,(e=this.canvas)==null||e.registerTransform(this)}onDisable(){var e;super.onDisable(),this.removeShadowComponent(),(e=this.canvas)==null||e.unregisterTransform(this)}onParentRectTransformChanged(e){this._transformNeedsUpdate||this.onApplyTransform(ty?`${e.name} changed`:void 0)}get isDirty(){return this._transformNeedsUpdate||(this._transformNeedsUpdate=!this.lastMatrix.equals(this.gameObject.matrix)),this._transformNeedsUpdate}markDirty(){this._transformNeedsUpdate||(ty&&console.warn("RectTransform markDirty()",this.name),this._transformNeedsUpdate=!0,this._lastUpdateFrame=-1)}updateTransform(){(this._transformNeedsUpdate||!this.lastMatrix.equals(this.gameObject.matrix))&&this.canUpdate()&&this.onApplyTransform(this._transformNeedsUpdate?"Marked dirty":"Matrix changed")}canUpdate(){return this._transformNeedsUpdate&&this.activeAndEnabled&&this._lastUpdateFrame!==this.context.time.frame}onApplyTransform(e){var t;if(this.context.time.frameCount===this._lastUpdateFrame)return;this._lastUpdateFrame=this.context.time.frameCount;const s=this.shadowComponent;if(!s)return;this.gameObject.parent?this._parentRectTransform=P.getComponentInParent(this.gameObject.parent,OC):this._parentRectTransform=void 0,this._transformNeedsUpdate=!1,ty&&console.warn("RectTransform \u2192 ApplyTransform",this.name+" because "+e),this.isRoot()?this.Root.screenspace||(s.rotation.y=Math.PI):(s.matrix.identity(),s.matrixAutoUpdate=!1,Rs.set(0,0,0),this.applyPivot(Rs),s.matrix.setPosition(Rs.x,Rs.y,0),(this.gameObject.quaternion.x||this.gameObject.quaternion.y||this.gameObject.quaternion.z)&&(Sp.copy(this.gameObject.quaternion),Sp.x*=-1,Sp.z*=-1,ah.makeRotationFromQuaternion(Sp),s.matrix.premultiply(ah)),Rs.set(0,0,0),this.applyAnchoring(Rs),(t=this.canvas)!=null&&t.screenspace?Rs.z+=.1:Rs.z+=.01,ah.identity(),ah.setPosition(Rs.x,Rs.y,Rs.z),s.matrix.premultiply(ah),s.matrix.scale(this.gameObject.scale)),this.lastMatrix.copy(this.gameObject.matrix);const o=!0;for(const r of hu(this.gameObject,ps,o,1)){if(r===this||!r.activeAndEnabled)continue;const l=r;l.onParentRectTransformChanged&&l.onParentRectTransformChanged(this)}}applyAnchoring(e){this._lastAnchoring||(this._lastAnchoring=new re);const t=this._lastAnchoring.sub(this._anchoredPosition);this.gameObject.position.x+=t.x,this.gameObject.position.y+=t.y,this._lastAnchoring.copy(this._anchoredPosition),e.x+=this._initialPosition.x-this.gameObject.position.x,e.y+=this._initialPosition.y-this.gameObject.position.y,e.z+=this._initialPosition.z-this.gameObject.position.z;const s=this._parentRectTransform;if(s){let o=0;const r=1-this.anchorMax.y-this.anchorMin.y;o-=s.height*.5*r,e.y+=o;let l=0;const c=1-this.anchorMax.x-this.anchorMin.x;l-=s.width*.5*c,e.x+=l}}applyPivot(e){if(this.pivot&&!this.isRoot()){const t=this.pivot.x-.5;e.x-=t*this.sizeDelta.x*this.gameObject.scale.x;const s=this.pivot.y-.5;e.y-=s*this.sizeDelta.y*this.gameObject.scale.y}}getBasicOptions(){const e={width:this.sizeDelta.x,height:this.sizeDelta.y,offset:0,backgroundOpacity:0,borderWidth:0,borderRadius:0,borderOpacity:0,letterSpacing:-.03};return this.ensureValidSize(e),e}ensureValidSize(e,t=1e-4){return e.width<=0&&(e.width=t),e.height<=0&&(e.height=1e-4),e}createNewBlock(e){e={...this.getBasicOptions(),...e},ey&&console.log(this.name,e);const t=new eb(e);return this._createdBlocks.push(t),t}createNewText(e){ey&&console.log(e),e={...this.getBasicOptions(),...e},ey&&console.log(this.name,e);const t=new Jv(e);return this._createdTextBlocks.push(t),t}};rh([m(re)],yl.prototype,"anchoredPosition",1),rh([m(re)],yl.prototype,"sizeDelta",2),rh([m(re)],yl.prototype,"pivot",2),rh([m(re)],yl.prototype,"anchorMin",2),rh([m(re)],yl.prototype,"anchorMax",2);let Ts=yl;var AA=Object.defineProperty,J1=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&AA(e,t,o),o};class vl extends I{constructor(){super(...arguments),a(this,"effectColor"),a(this,"effectDistance")}}J1([m(he)],vl.prototype,"effectColor"),J1([m(re)],vl.prototype,"effectDistance");var IA=Object.defineProperty,LA=Object.getOwnPropertyDescriptor,eS=(n,e,t,s)=>{for(var o=s>1?void 0:s?LA(e,t):e,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=(s?l(e,t,o):l(o))||o);return s&&o&&IA(e,t,o),o};const Cp={backgroundColor:new oe(1,1,1),backgroundOpacity:1,borderColor:new oe(1,1,1),borderOpacity:1};var Qr;const iy=(Qr=class extends ps{constructor(){super(...arguments),a(this,"_alphaFactor",1),a(this,"sRGBColor",new oe(1,0,1)),a(this,"raycastTarget",!0),a(this,"uiObject",null),a(this,"_color",null),a(this,"_rect",null),a(this,"_stateManager",null),a(this,"_currentlyCreatingPanel",!1)}get isGraphic(){return!0}get color(){return this._color||(this._color=new he(1,1,1,1)),this._color}set color(n){(!this._color||this._color.r!==n.r||this._color.g!==n.g||this._color.b!==n.b||this._color.alpha!==n.alpha)&&(this._color||(this._color=new he(1,1,1,1)),this._color.copy(n),this.onColorChanged())}setAlphaFactor(n){this._alphaFactor=n,this.onColorChanged()}get alphaFactor(){return this._alphaFactor}onColorChanged(){this.uiObject&&(this.sRGBColor.copy(this._color),this.sRGBColor.convertLinearToSRGB(),Cp.backgroundColor=this.sRGBColor,Cp.backgroundOpacity=this._color.alpha*this._alphaFactor,this.applyEffects(Cp,this._alphaFactor),this.uiObject.set(Cp),this.markDirty())}get m_Color(){return this._color}get rectTransform(){if(this._rect||(this._rect=P.getComponent(this.gameObject,Ts)),!this._rect)throw new Error("Not Supported: Make sure to add a RectTransform component before adding a UI Graphic component.");return this._rect}onParentRectTransformChanged(){var n;(n=this.uiObject)==null||n.set({width:this.rectTransform.width,height:this.rectTransform.height}),this.markDirty()}__internalNewInstanceCreated(n){return super.__internalNewInstanceCreated(n),this._rect=null,this.uiObject=null,this._stateManager=null,this._color&&(this._color=this._color.clone()),this}setState(n){this.makePanel(),this.uiObject&&(this.uiObject.setState(n),this==null||this.markDirty())}setupState(n){this.makePanel(),this.uiObject&&(this._stateManager||(this._stateManager=new MO(this.uiObject)),this.uiObject.setupState(n.state,n.attributes))}setOptions(n){this.makePanel(),this.uiObject&&this.uiObject.set(n)}awake(){super.awake(),this.makePanel(),Ya(this,"_color",()=>RT(this,this.onColorChanged))}onEnable(){var n;super.onEnable(),this.uiObject&&((n=this.rectTransform.shadowComponent)==null||n.add(this.uiObject),this.addShadowComponent(this.uiObject,this.rectTransform))}onDisable(){super.onDisable(),this.uiObject&&this.removeShadowComponent()}makePanel(){if(this.uiObject||this._currentlyCreatingPanel)return;this._currentlyCreatingPanel=!0;const n={backgroundColor:this.color,backgroundOpacity:this.color.alpha,offset:.015};this.onBeforeCreate(n),this.applyEffects(n),this.onCreate(n),this.controlsChildLayout=!1,this._currentlyCreatingPanel=!1,this.onAfterCreated(),this.onColorChanged()}onBeforeCreate(n){}onCreate(n){this.uiObject=this.rectTransform.createNewBlock(n),this.uiObject.name=this.name}onAfterCreated(){}applyEffects(n,e=1){var t;const s=(t=this.gameObject)==null?void 0:t.getComponent(vl);s&&(s.effectDistance&&(n.borderWidth=Math.max(Math.abs(s.effectDistance.x),Math.abs(s.effectDistance.y))),s.effectColor&&(n.borderColor=s.effectColor,n.borderOpacity=s.effectColor.alpha*e))}async setTexture(n){if(this.setOptions({backgroundOpacity:0}),n){if(Qr.textureCache.has(n))n=Qr.textureCache.get(n);else if(!n.isRenderTargetTexture){const e=n.clone();e.colorSpace=On,Qr.textureCache.set(n,e),n=e}this.setOptions({backgroundImage:n,borderRadius:0,backgroundOpacity:this.color.alpha,backgroundSize:"stretch"}),Xe.assignTextureLOD(n,0).then(e=>{e instanceof je&&(n&&Qr.textureCache.set(n,e),this.setOptions({backgroundImage:e}),this.markDirty())})}else this.setOptions({backgroundImage:void 0,borderRadius:0,backgroundOpacity:this.color.alpha});this.markDirty()}onAfterAddedToScene(){super.onAfterAddedToScene(),this.shadowComponent&&(this.shadowComponent.offset=this.shadowComponent.position.z)}},a(Qr,"textureCache",new Map),Qr);eS([m(he)],iy.prototype,"color",1),eS([m()],iy.prototype,"raycastTarget",2);let lh=iy;class ch extends lh{constructor(){super(...arguments),a(this,"_flippedObject",!1)}onAfterCreated(){this.uiObject&&!this._flippedObject&&(this._flippedObject=!0,this.uiObject.scale.y*=-1)}}var jA=Object.defineProperty,DA=Object.getOwnPropertyDescriptor,Kn=(n,e,t,s)=>{for(var o=s>1?void 0:s?DA(e,t):e,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=(s?l(e,t,o):l(o))||o);return s&&o&&jA(e,t,o),o};const Yr=C("debugtext");var mt=(n=>(n[n.UpperLeft=0]="UpperLeft",n[n.UpperCenter=1]="UpperCenter",n[n.UpperRight=2]="UpperRight",n[n.MiddleLeft=3]="MiddleLeft",n[n.MiddleCenter=4]="MiddleCenter",n[n.MiddleRight=5]="MiddleRight",n[n.LowerLeft=6]="LowerLeft",n[n.LowerCenter=7]="LowerCenter",n[n.LowerRight=8]="LowerRight",n))(mt||{}),tS=(n=>(n[n.Normal=0]="Normal",n[n.Bold=1]="Bold",n[n.Italic=2]="Italic",n[n.BoldAndItalic=3]="BoldAndItalic",n))(tS||{});class Nt extends lh{constructor(){super(...arguments),a(this,"alignment",0),a(this,"verticalOverflow",0),a(this,"horizontalOverflow",0),a(this,"lineSpacing",1),a(this,"supportRichText",!1),a(this,"font"),a(this,"fontStyle",0),a(this,"sRGBTextColor",new oe(1,0,1)),a(this,"_text",""),a(this,"_fontSize",12),a(this,"_textMeshUi",null),a(this,"_didHandleTextRenderOnTop",!1)}setAlphaFactor(e){var t;super.setAlphaFactor(e),(t=this.uiObject)==null||t.set({fontOpacity:this.color.alpha*this.alphaFactor}),this.markDirty()}get text(){return this._text}set text(e){e!==this._text&&(this._text=e,this.feedText(this.text,this.supportRichText),this.markDirty())}set_text(e){this.text=e}get fontSize(){return this._fontSize}set fontSize(e){var t;this._fontSize=e,(t=this.uiObject)==null||t.set({fontSize:e})}onColorChanged(){var e;this.sRGBTextColor.copy(this.color),this.sRGBTextColor.convertLinearToSRGB(),(e=this.uiObject)==null||e.set({color:this.sRGBTextColor,fontOpacity:this.color.alpha})}onParentRectTransformChanged(){super.onParentRectTransformChanged(),this.uiObject&&this.updateOverflow()}onBeforeCanvasRender(e){this.updateOverflow()}updateOverflow(){var e;const t=(e=this.uiObject)==null?void 0:e._overflow;t&&(t._needsUpdate=!0)}onCreate(e){Yr&&console.log(this),this.horizontalOverflow==1&&(e.whiteSpace="pre"),this.verticalOverflow==0&&(this.context.renderer.localClippingEnabled=!0,e.overflow="hidden"),this.horizontalOverflow==1&&this.verticalOverflow==0,e.lineHeight=this.lineSpacing,delete e.backgroundOpacity,delete e.backgroundColor,Yr&&(e.backgroundColor=16750848,e.backgroundOpacity=.5);const t=this.rectTransform;e={...e,...this.getTextOpts()},this.getAlignment(e),Yr&&(e.backgroundColor=Math.random()*16777215,e.backgroundOpacity=.1),this.uiObject=t.createNewText(e),this.feedText(this.text,this.supportRichText)}onAfterAddedToScene(){super.onAfterAddedToScene(),this.handleTextRenderOnTop()}getTextOpts(){const e=this.fontSize,t={color:this.color,fontOpacity:this.color.alpha,fontSize:e,fontKerning:"normal"};return this.setFont(t,this.fontStyle),t}onEnable(){var e;super.onEnable(),this._didHandleTextRenderOnTop=!1,this.uiObject&&this.uiObject.addAfterUpdate(()=>{this.setShadowComponentOwner(this.uiObject),this.markDirty()}),setTimeout(()=>this.markDirty(),10),(e=this.canvas)==null||e.registerEventReceiver(this)}onDisable(){var e;super.onDisable(),(e=this.canvas)==null||e.unregisterEventReceiver(this)}getAlignment(e){switch(e.flexDirection="column",this.alignment){case 0:case 3:case 6:e.textAlign="left";break;case 1:case 4:case 7:e.textAlign="center";break;case 2:case 5:case 8:e.textAlign="right";break}switch(this.alignment){default:case 0:case 1:case 2:e.alignItems="start";break;case 3:case 4:case 5:e.alignItems="center";break;case 6:case 7:case 8:e.alignItems="end";break}return e}feedText(e,t){var s,o,r;if(Yr&&console.log("feedText",this.uiObject,e,t),!!this.uiObject)if(this._textMeshUi||(this._textMeshUi=[]),this.uiObject.children.length=0,!t||e.length===0)this.uiObject.textContent=e;else{let l=this.getNextTag(e);if(l){if(l.startIndex>0){for(let d=this.uiObject.children.length-1;d>=0;d--){const u=this.uiObject.children[d];u.isUI&&(this.uiObject.remove(u),u.clear())}const h=new Gm({textContent:e.substring(0,l.startIndex),color:"inherit"});this.uiObject.add(h)}}else{this.uiObject.textContent="",this.setOptions({textContent:e});return}const c=[];for(;l;){const h=this.getNextTag(e,l.endIndex),d={fontFamily:(s=this.uiObject)==null?void 0:s.get("fontFamily"),color:"inherit",textContent:""};if(h){d.textContent=this.getText(e,l,h),this.handleTag(l,d,c);const u=new Gm(d);(o=this.uiObject)==null||o.add(u)}else{d.textContent=e.substring(l.endIndex),this.handleTag(l,d,c);const u=new Gm(d);(r=this.uiObject)==null||r.add(u)}l=h}}}handleTextRenderOnTop(){this._didHandleTextRenderOnTop||(this._didHandleTextRenderOnTop=!0,this.startCoroutine(this.renderOnTopCoroutine()))}*renderOnTopCoroutine(){if(!this.canvas)return;const e=[],t=this.canvas,s={renderOnTop:t.renderOnTop,depthWrite:t.depthWrite,doubleSided:t.doubleSided};for(;;){let o=!1;if(this._textMeshUi)for(let r=0;r<this._textMeshUi.length;r++){if(e[r]===!0)continue;o=!0;const l=this._textMeshUi[r];l.textContent&&(Iu(l,s),e[r]=!0)}if(!o)break;yield}}handleTag(e,t,s){if(!e.isEndTag){if(e.type.includes("color")){const o=new sy(e,{color:t.color});if(s.push(o),e.type.length>6){const r=parseInt("0x"+e.type.substring(7));t.color=r}else t.color=new oe(1,1,1)}else if(e.type=="b"){this.setFont(t,1);const o=new sy(e,{fontWeight:700});s.push(o)}else if(e.type=="i"){this.setFont(t,2);const o=new sy(e,{fontStyle:"italic"});s.push(o)}}}getText(e,t,s){return e.substring(t.endIndex,s.startIndex)}getNextTag(e,t=0){const s=e.indexOf("<",t),o=e.indexOf(">",s);if(s>=0&&o>=0){const r=e.substring(s+1,o);return{type:r,startIndex:s,endIndex:o+1,isEndTag:r.startsWith("/")}}return null}setFont(e,t){if(!this.font)return;const s=this.font,o=this.getFamilyNameWithCorrectSuffix(s,t);Yr&&console.log("Selected font family:"+o);let r=tb.getFontFamily(o);switch(r||(r=tb.addFontFamily(o)),e.fontFamily=r,t){default:case 0:e.fontWeight=400,e.fontStyle="normal";break;case 1:e.fontWeight=700,e.fontStyle="normal";break;case 2:e.fontWeight=400,e.fontStyle="italic";break;case 3:e.fontStyle="italic",e.fontWeight=400}let l=r.getVariant(e.fontWeight,e.fontStyle);if(!l){let c=o;c!=null&&c.endsWith("-msdf.json")||(c+="-msdf.json");let h=o;h!=null&&h.endsWith(".png")||(h+=".png"),l=r.addVariant(e.fontWeight,e.fontStyle,c,h),l?.addEventListener("ready",()=>{this.markDirty()})}}getFamilyNameWithCorrectSuffix(e,t){var s;const o=e.lastIndexOf("-");if(o<0)return e;const r=(s=e.substring(o+1))==null?void 0:s.toLowerCase();if(BA.includes(r))return Yr&&console.warn("Unsupported font style: "+r),e;const l=e.lastIndexOf("/");let c=e;l>=0&&(c=c.substring(l+1));const h=c[0]===c[0].toUpperCase(),d=e.substring(0,o);switch(Yr&&console.log("Select font: ",e,tS[t],c,h,d),t){case 0:return h?d+"-Regular":d+"-regular";case 1:return h?d+"-Bold":d+"-bold";case 2:return h?d+"-Italic":d+"-italic";case 3:return h?d+"-BoldItalic":d+"-bolditalic";default:return e}}}Kn([m()],Nt.prototype,"alignment",2),Kn([m()],Nt.prototype,"verticalOverflow",2),Kn([m()],Nt.prototype,"horizontalOverflow",2),Kn([m()],Nt.prototype,"lineSpacing",2),Kn([m()],Nt.prototype,"supportRichText",2),Kn([m(URL)],Nt.prototype,"font",2),Kn([m()],Nt.prototype,"fontStyle",2),Kn([m()],Nt.prototype,"text",1),Kn([m()],Nt.prototype,"fontSize",1);class sy{constructor(e,t){a(this,"tag"),a(this,"previousValues"),this.tag=e,this.previousValues=t}}const BA=["medium","mediumitalic","black","blackitalic","thin","thinitalic","extrabold","light","lightitalic","semibold"];class Kr{constructor(e){a(this,"id"),a(this,"content",""),a(this,"font",[]),a(this,"pointSize",144),a(this,"width"),a(this,"height"),a(this,"depth"),a(this,"wrapMode"),a(this,"horizontalAlignment"),a(this,"verticalAlignment"),a(this,"material"),this.id=e}static getId(){return this.global_id++}setDepth(e){return this.depth=e,this}setPointSize(e){return this.pointSize=e,this}setHorizontalAlignment(e){return this.horizontalAlignment=e,this}setVerticalAlignment(e){return this.verticalAlignment=e,this}writeTo(e,t){var s;t.beginBlock(`def Preliminary_Text "${this.id}"`,"(",!1),t.appendLine('prepend apiSchemas = ["MaterialBindingAPI"]'),t.closeBlock(")"),t.beginBlock(),this.content&&t.appendLine(`string content = "${this.content}"`),(!this.font||this.font.length<=0)&&(this.font||(this.font=[]),(s=this.font)==null||s.push("sans-serif"));const o=this.font.map(r=>`"${r}"`).join(", ");t.appendLine(`string[] font = [ ${o} ]`),t.appendLine(`double pointSize = ${this.pointSize}`),typeof this.width=="number"&&t.appendLine(`double width = ${this.width}`),typeof this.height=="number"&&t.appendLine(`double height = ${this.height}`),typeof this.depth=="number"&&t.appendLine(`double depth = ${this.depth}`),this.wrapMode&&t.appendLine(`token wrapMode = "${this.wrapMode}"`),this.horizontalAlignment&&t.appendLine(`token horizontalAlignment = "${this.horizontalAlignment}"`),this.verticalAlignment&&t.appendLine(`token verticalAlignment = "${this.verticalAlignment}"`),this.material!==void 0&&t.appendLine(`rel material:binding = </StageRoot/Materials/${ap(this.material)}>`),t.closeBlock()}}a(Kr,"global_id",0);class ny{static singleLine(e,t,s){const o=new Kr("text_"+Kr.getId());return o.content=e,t&&(o.pointSize=t),s&&(o.depth=s),o}static multiLine(e,t,s,o,r,l){const c=new Kr("text_"+Kr.getId());return c.content=e,c.width=t,c.height=s,c.horizontalAlignment=o,c.verticalAlignment=r,l!==void 0&&(c.wrapMode=l),c}}const FA=new se().makeRotationY(Math.PI),UA=new se().makeScale(-1,1,-1);class Pp{get extensionName(){return"text"}exportText(e,t,s){const o=P.getComponent(e,Nt);if(!o)return;const r=P.getComponent(e,Ts);let l=100,c=100;r&&(l=r.width,c=r.height);const h=FA.clone();r&&h.premultiply(UA),t.setMatrix(h);const d=o.color.clone();t.material=new bt({color:d,emissive:d}),t.addEventListener("serialize",(u,p)=>{let g=o.text;g=g.replace(/\r/g,""),g=g.replace(/\n/g,"\\n");const f=ny.multiLine(g,l,c,"center","bottom","flowing");this.setTextAlignment(f,o.alignment),this.setOverflow(f,o),t.material&&(f.material=t.material),f.pointSize=this.convertToTextSize(o.fontSize),f.depth=.001,f.writeTo(void 0,u)})}convertToTextSize(e){return 1/.0502*144*e}setOverflow(e,t){t.horizontalOverflow?e.wrapMode="singleLine":e.wrapMode="flowing"}setTextAlignment(e,t){switch(t){case mt.LowerLeft:case mt.MiddleLeft:case mt.UpperLeft:e.horizontalAlignment="left";break;case mt.LowerCenter:case mt.MiddleCenter:case mt.UpperCenter:e.horizontalAlignment="center";break;case mt.LowerRight:case mt.MiddleRight:case mt.UpperRight:e.horizontalAlignment="right";break}switch(t){case mt.LowerLeft:case mt.LowerCenter:case mt.LowerRight:e.verticalAlignment="bottom";break;case mt.MiddleLeft:case mt.MiddleCenter:case mt.MiddleRight:e.verticalAlignment="middle";break;case mt.UpperLeft:case mt.UpperCenter:case mt.UpperRight:e.verticalAlignment="top";break}}}var zA=Object.defineProperty,it=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&zA(e,t,o),o};const iS=C("debuguilayout");class Zr{constructor(){a(this,"left",0),a(this,"right",0),a(this,"top",0),a(this,"bottom",0)}get vertical(){return this.top+this.bottom}get horizontal(){return this.left+this.right}}it([m()],Zr.prototype,"left"),it([m()],Zr.prototype,"right"),it([m()],Zr.prototype,"top"),it([m()],Zr.prototype,"bottom");class Wi extends I{constructor(){super(...arguments),a(this,"_rectTransform",null),a(this,"_needsUpdate",!1),a(this,"childAlignment",0),a(this,"reverseArrangement",!1),a(this,"spacing",0),a(this,"padding"),a(this,"minWidth",0),a(this,"minHeight",0),a(this,"flexibleHeight",0),a(this,"flexibleWidth",0),a(this,"preferredHeight",0),a(this,"preferredWidth",0)}get rectTransform(){return this._rectTransform}onParentRectTransformChanged(e){this._needsUpdate=!0}get isDirty(){return this._needsUpdate}get isLayoutGroup(){return!0}updateLayout(){this._rectTransform&&(iS&&console.warn("Layout Update",this.context.time.frame,this.name),this._needsUpdate=!1,this.onCalculateLayout(this._rectTransform))}start(){this._needsUpdate=!0}onEnable(){iS&&console.log(this.name,this),this._rectTransform=this.gameObject.getComponent(Ts);const e=this.gameObject.getComponentInParent(bl);e&&e.registerLayoutGroup(this),this._needsUpdate=!0}onDisable(){const e=this.gameObject.getComponentInParent(bl);e&&e.unregisterLayoutGroup(this)}set m_Spacing(e){e!==this.spacing&&(this._needsUpdate=!0,this.spacing=e)}get m_Spacing(){return this.spacing}}it([m()],Wi.prototype,"childAlignment"),it([m()],Wi.prototype,"reverseArrangement"),it([m()],Wi.prototype,"spacing"),it([m(Zr)],Wi.prototype,"padding"),it([m()],Wi.prototype,"minWidth"),it([m()],Wi.prototype,"minHeight"),it([m()],Wi.prototype,"flexibleHeight"),it([m()],Wi.prototype,"flexibleWidth"),it([m()],Wi.prototype,"preferredHeight"),it([m()],Wi.prototype,"preferredWidth");class Yo extends Wi{constructor(){super(...arguments),a(this,"childControlHeight",!0),a(this,"childControlWidth",!0),a(this,"childForceExpandHeight",!1),a(this,"childForceExpandWidth",!1),a(this,"childScaleHeight",!1),a(this,"childScaleWidth",!1)}onCalculateLayout(e){var t;const s=this.primaryAxis,o=e.width;let r=o;const l=e.height;let c=l;r-=this.padding.horizontal,c-=this.padding.vertical,s==="x"?this.padding.horizontal:this.padding.vertical;const h=s==="x",d=h?"y":"x",u=h?this.childControlWidth:this.childControlHeight,p=h?this.childControlHeight:this.childControlWidth,g=h?this.childForceExpandWidth:this.childForceExpandHeight,f=h?this.childForceExpandHeight:this.childForceExpandWidth,y=h?c:r,v=h?o:l,b=.5*(h?this.childAlignment%3:Math.floor(this.childAlignment/3));let _=0;h?_+=this.padding.left:_+=this.padding.top;let w=0,x=0;for(let D=0;D<this.gameObject.children.length;D++){const z=this.gameObject.children[D],j=P.getComponent(z,Ts);j!=null&&j.activeAndEnabled&&(x+=1,h?w+=j.width:w+=j.height)}let k=0;const M=this.spacing*(x-1);if(g||u){let D=0;h?D=r-=M:D=c-=M,x>0&&(k=D/x)}let T=0;T+=this.padding.left,T-=this.padding.right,b!==0&&(_=v-w,_*=b,_-=M*b,h?(_-=this.padding.right*b,_+=this.padding.left*(1-b),_<this.padding.left&&(_=this.padding.left)):(_-=this.padding.bottom*b,_+=this.padding.top*(1-b),_<this.padding.top&&(_=this.padding.top)));let L=1;for(let D=0;D<this.gameObject.children.length;D++){const z=this.gameObject.children[D],j=P.getComponent(z,Ts);if(j!=null&&j.activeAndEnabled){(t=j.pivot)==null||t.set(.5,.5),j.anchorMin.set(0,1),j.anchorMax.set(0,1);const H=o*.5+T*.5;j.anchoredPosition.x!==H&&(j.anchoredPosition.x=H);const K=l*-.5;j.anchoredPosition.y!==K&&(j.anchoredPosition.y=K),f&&p&&j.sizeDelta[d]!==y&&(j.sizeDelta[d]=y),g&&u&&j.sizeDelta[s]!==k&&(j.sizeDelta[s]=k);const U=h?j.width:j.height,B=U*.5;if(_+=B,g){const te=k*L-k*.5;te>_&&(_=te-k*.5+U+this.padding.left,_-=B)}let Q=_;s==="y"&&(Q=-Q),j.anchoredPosition[s]!==Q&&(j.anchoredPosition[s]=Q),_+=B,_+=this.spacing,L+=1}}}}it([m()],Yo.prototype,"childControlHeight"),it([m()],Yo.prototype,"childControlWidth"),it([m()],Yo.prototype,"childForceExpandHeight"),it([m()],Yo.prototype,"childForceExpandWidth"),it([m()],Yo.prototype,"childScaleHeight"),it([m()],Yo.prototype,"childScaleWidth");class oy extends Yo{get primaryAxis(){return"y"}}class ry extends Yo{get primaryAxis(){return"x"}}class ay extends Wi{onCalculateLayout(){}}var NA=Object.defineProperty,WA=Object.getOwnPropertyDescriptor,mn=(n,e,t,s)=>{for(var o=s>1?void 0:s?WA(e,t):e,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=(s?l(e,t,o):l(o))||o);return s&&o&&NA(e,t,o),o},sS=(n=>(n[n.ScreenSpaceOverlay=0]="ScreenSpaceOverlay",n[n.ScreenSpaceCamera=1]="ScreenSpaceCamera",n[n.WorldSpace=2]="WorldSpace",n[n.Undefined=-1]="Undefined",n))(sS||{});const ly=C("debuguilayout"),cs=class kC extends oh{constructor(){super(...arguments),a(this,"_renderOnTop"),a(this,"_depthWrite",!1),a(this,"_doubleSided",!0),a(this,"_castShadows",!1),a(this,"_receiveShadows",!1),a(this,"_renderMode",-1),a(this,"_rootCanvas"),a(this,"_scaleFactor",1),a(this,"worldCamera"),a(this,"planeDistance",-1),a(this,"_boundRenderSettingsChanged",this.onRenderSettingsChanged.bind(this)),a(this,"previousParent",null),a(this,"_lastMatrixWorld",null),a(this,"_rectTransforms",[]),a(this,"_layoutGroups",new Map),a(this,"_receivers",[]),a(this,"onBeforeRenderRoutine",()=>{var e,t,s,o;if(this.previousParent=this.gameObject.parent,((e=this.context.xr)!=null&&e.isVR||(t=this.context.xr)!=null&&t.isPassThrough)&&this.screenspace){this.gameObject.visible=!1,this.gameObject.removeFromParent();return}this.renderOnTop||this.screenspace?this.gameObject.removeFromParent():(this.onUpdateRenderMode(),this.handleLayoutUpdates(),(s=this.shadowComponent)==null||s.updateMatrixWorld(!0),(o=this.shadowComponent)==null||o.updateWorldMatrix(!0,!0),this.invokeBeforeRenderEvents(),ii.ensureUpdateMeshUI(ib,this.context))}),a(this,"onAfterRenderRoutine",()=>{var e,t,s,o,r;if(((e=this.context.xr)!=null&&e.isVR||(t=this.context.xr)!=null&&t.isPassThrough)&&this.screenspace){(s=this.previousParent)==null||s.add(this.gameObject);return}if((this.screenspace||this.renderOnTop)&&this.previousParent&&this.context.mainCamera){if(this.screenspace){const h=this.context.mainCamera;h?.add(this.gameObject)}else this.previousParent.add(this.gameObject);const l=this.context.renderer.autoClear,c=this.context.renderer.autoClearColor;this.context.renderer.autoClear=!1,this.context.renderer.autoClearColor=!1,this.context.renderer.clearDepth(),this.onUpdateRenderMode(!0),this.handleLayoutUpdates(),(o=this.shadowComponent)==null||o.updateMatrixWorld(!0),this.invokeBeforeRenderEvents(),ii.ensureUpdateMeshUI(ib,this.context,!0),this.context.renderer.render(this.gameObject,this.context.mainCamera),this.context.renderer.autoClear=l,this.context.renderer.autoClearColor=c,this.previousParent.add(this.gameObject)}(r=this._lastMatrixWorld)==null||r.copy(this.gameObject.matrixWorld)}),a(this,"_updateRenderSettingsRoutine"),a(this,"_activeRenderMode",-1),a(this,"_lastWidth",-1),a(this,"_lastHeight",-1)}get isCanvas(){return!0}get screenspace(){return this.renderMode!==2}set renderOnTop(e){e!==this._renderOnTop&&(this._renderOnTop=e,this.onRenderSettingsChanged())}get renderOnTop(){return this._renderOnTop!==void 0?this._renderOnTop:!!(this.screenspace&&this._renderMode===0)}set depthWrite(e){this._depthWrite!==e&&(this._depthWrite=e,this.onRenderSettingsChanged())}get depthWrite(){return this._depthWrite}set doubleSided(e){this._doubleSided!==e&&(this._doubleSided=e,this.onRenderSettingsChanged())}get doubleSided(){return this._doubleSided}set castShadows(e){this._castShadows!==e&&(this._castShadows=e,this.onRenderSettingsChanged())}get castShadows(){return this._castShadows}set receiveShadows(e){this._receiveShadows!==e&&(this._receiveShadows=e,this.onRenderSettingsChanged())}get receiveShadows(){return this._receiveShadows}get renderMode(){return this._renderMode}set renderMode(e){this._renderMode!==e&&(this._renderMode=e,this.onRenderSettingsChanged())}set rootCanvas(e){this._rootCanvas instanceof kC||(this._rootCanvas=e)}get rootCanvas(){return this._rootCanvas}get scaleFactor(){return this._scaleFactor}set scaleFactor(e){this._scaleFactor=e}awake(){var e;this.shadowComponent=this.gameObject,this.previousParent=this.gameObject.parent,ly&&console.log("Canvas.Awake()",((e=this.previousParent)==null?void 0:e.name)+"/"+this.gameObject.name),super.awake()}start(){this.applyRenderSettings()}onEnable(){super.onEnable(),this._updateRenderSettingsRoutine=void 0,this._lastMatrixWorld=new se,this.applyRenderSettings(),document.addEventListener("resize",this._boundRenderSettingsChanged),this.context.pre_render_callbacks.push(this.onBeforeRenderRoutine),this.context.post_render_callbacks.push(this.onAfterRenderRoutine)}onDisable(){super.onDisable(),document.removeEventListener("resize",this._boundRenderSettingsChanged);const e=this.context.pre_render_callbacks.indexOf(this.onBeforeRenderRoutine);e!==-1&&this.context.pre_render_callbacks.splice(e,1);const t=this.context.post_render_callbacks.indexOf(this.onAfterRenderRoutine);t!==-1&&this.context.post_render_callbacks.splice(t,1)}registerTransform(e){this._rectTransforms.push(e)}unregisterTransform(e){const t=this._rectTransforms.indexOf(e);t!==-1&&this._rectTransforms.splice(t,1)}registerLayoutGroup(e){const t=e.gameObject;this._layoutGroups.set(t,e)}unregisterLayoutGroup(e){const t=e.gameObject;this._layoutGroups.delete(t)}registerEventReceiver(e){this._receivers.push(e)}unregisterEventReceiver(e){const t=this._receivers.indexOf(e);t!==-1&&this._receivers.splice(t,1)}async onEnterXR(e){this.screenspace?(e.xr.isVR||e.xr.isPassThrough)&&(this.gameObject.visible=!1):(this.gameObject.visible=!1,await ql(1).then(()=>{this.gameObject.visible=!0}))}onLeaveXR(e){this.screenspace&&(e.xr.isVR||e.xr.isPassThrough)&&(this.gameObject.visible=!0)}invokeBeforeRenderEvents(){var e;for(const t of this._receivers)(e=t.onBeforeCanvasRender)==null||e.call(t,this)}handleLayoutUpdates(){this._lastMatrixWorld===null&&(this._lastMatrixWorld=new se);const e=!this._lastMatrixWorld.equals(this.gameObject.matrixWorld);ly&&e&&console.log("Canvas Layout changed",this.context.time.frameCount,this.name);for(const t of this._rectTransforms){e&&t.markDirty();let s=this._layoutGroups.get(t.gameObject);t.isDirty&&!s&&(s=t.gameObject.getComponentInParent(Wi)),(t.isDirty||s!=null&&s.isDirty)&&(ly&&console.log("CANVAS UPDATE ### "+t.name+" ##################################### "+this.context.time.frame),s?.updateLayout(),t.updateTransform())}}applyRenderSettings(){this.onRenderSettingsChanged()}onRenderSettingsChanged(){this._updateRenderSettingsRoutine||(this._updateRenderSettingsRoutine=this.startCoroutine(this._updateRenderSettingsDelayed(),Oe.OnBeforeRender))}*_updateRenderSettingsDelayed(){if(yield,this._updateRenderSettingsRoutine=void 0,this.shadowComponent){this.onUpdateRenderMode(),Iu(this.shadowComponent,this);for(const e of P.getComponentsInChildren(this.gameObject,ps))Iu(e.shadowComponent,this)}}onUpdateRenderMode(e=!1){if(!e&&this._renderMode===this._activeRenderMode&&this._lastWidth===this.context.domWidth&&this._lastHeight===this.context.domHeight)return;this._activeRenderMode=this._renderMode;let t=this.context.mainCameraComponent,s=10;switch(t&&t.nearClipPlane>0&&t.farClipPlane>0&&(s=W.lerp(t.nearClipPlane,t.farClipPlane,.01)),this._renderMode===1&&(this.worldCamera&&(t=this.worldCamera),this.planeDistance>0&&(s=this.planeDistance)),this._renderMode){case 0:case 1:if(this._lastWidth=this.context.domWidth,this._lastHeight=this.context.domHeight,!t)return;const o=s+.01;this.gameObject.position.x=0,this.gameObject.position.y=0,this.gameObject.position.z=-o,this.gameObject.quaternion.identity();const r=this.gameObject.getComponent(Ts);let l=!1;r.sizeDelta.x!==this.context.domWidth&&(l=!0),r.sizeDelta.y!==this.context.domHeight&&(l=!0);const c=t.fieldOfView*Math.PI/180,h=2*Math.tan(c/2)*Math.abs(o);this.gameObject.scale.x=h/this.context.domHeight,this.gameObject.scale.y=h/this.context.domHeight,this.gameObject.scale.z=.01,l&&(r.sizeDelta.x=this.context.domWidth,r.sizeDelta.y=this.context.domHeight,r?.markDirty());break;case 2:this._lastWidth=-1,this._lastHeight=-1;break}}};mn([m()],cs.prototype,"renderOnTop",1),mn([m()],cs.prototype,"depthWrite",1),mn([m()],cs.prototype,"doubleSided",1),mn([m()],cs.prototype,"castShadows",1),mn([m()],cs.prototype,"receiveShadows",1),mn([m()],cs.prototype,"renderMode",1),mn([m(cs)],cs.prototype,"rootCanvas",1),mn([m()],cs.prototype,"scaleFactor",1),mn([m(ci)],cs.prototype,"worldCamera",2),mn([m()],cs.prototype,"planeDistance",2);let bl=cs;var VA=Object.defineProperty,$A=Object.getOwnPropertyDescriptor,cy=(n,e,t,s)=>{for(var o=s>1?void 0:s?$A(e,t):e,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=(s?l(e,t,o):l(o))||o);return s&&o&&VA(e,t,o),o};class Ko extends I{constructor(){super(...arguments),a(this,"_alpha",1),a(this,"interactable",!0),a(this,"blocksRaycasts",!0),a(this,"_isDirty",!1),a(this,"_buffer",[])}get alpha(){return this._alpha}set alpha(e){e!==this._alpha&&(this._alpha=e,this.markDirty())}get isCanvasGroup(){return!0}markDirty(){this._isDirty||(this._isDirty=!0,this.startCoroutine(this.applyChangesDelayed(),Oe.OnBeforeRender))}*applyChangesDelayed(){this._isDirty=!1,this.applyChangesNow()}applyChangesNow(){this._buffer.length=0;for(const e of P.getComponentsInChildren(this.gameObject,ps,this._buffer)){const t=e;t.setAlphaFactor&&t.setAlphaFactor(this._alpha)}}}cy([m()],Ko.prototype,"alpha",1),cy([m()],Ko.prototype,"interactable",2),cy([m()],Ko.prototype,"blocksRaycasts",2);class hy{get extensionName(){return"tmui"}onExportObject(e,t,s){const o=P.getComponent(e,bl);if(o&&o.enabled&&o.renderMode===sS.WorldSpace){const r=new Pp,l=P.getComponent(e,Ts),c=P.getComponent(e,Ko),h=new Array;if(l){if(!P.isActiveSelf(e)){const p=P.isActiveSelf(e);P.setActive(e,!0),l.onEnable(),l.updateTransform(),h.push(()=>{l.onDisable(),P.setActive(e,p)})}e.traverse(p=>{if(!P.isActiveInHierarchy(p)){const g=P.isActiveSelf(p);P.setActive(p,!0);const f=P.getComponent(p,ps);f&&(f.onEnable(),h.push(()=>{f.onDisable()}));const y=P.getComponent(p,Ts);y&&(y.onEnable(),y.updateTransform(),y.onApplyTransform(),h.push(()=>{y.onDisable()}));const v=P.getComponent(p,Nt);v&&(v.onEnable(),h.push(()=>{v.onDisable()})),h.push(()=>{P.setActive(p,g)})}}),l.width,l.height;const d=mi.createEmpty(),u=l.shadowComponent;if(t.add(d),u){const p=u.matrix;d.setMatrix(p);const g=new Map,f=new Map;g.set(u,d),f.set(u,c?c.alpha:1),u.traverse(y=>{if(y===u)return;const v=mi.createEmpty();v.setMatrix(y.matrix);const b=y.parent,_=!!b&&typeof b.textContent=="string"&&b.textContent.length>0;let w=f.get(b)||1;const x=P.getComponent(y,Ko);if(x&&(w*=x.alpha),y instanceof G&&_){const M=y[Mi];M?r.exportText(M.gameObject,v,s):console.error("Error when exporting UI: shadow component owner not found. This is likely a bug.",y)}if(y instanceof G&&!_){const M=y.geometry.clone();M.scale(1,1,-1),this.flipWindingOrder(M),v.geometry=M;const T=new oe,L=y.material.opacity;T.copy(y.material.color),v.material=new Me({color:T,opacity:L*w,map:y.material.map,transparent:!0})}g.set(y,v),f.set(y,w);const k=g.get(b);if(!k){console.error("Error when exporting UI: shadow component parent not found!",y,y.parent);return}k.add(v)})}}for(const d of h)d()}}flipWindingOrder(e){const t=e.index.array;for(let s=0,o=t.length/3;s<o;s++){const r=t[s*3];t[s*3]=t[s*3+2],t[s*3+2]=r}e.index.needsUpdate=!0}}const hh=C("debugusdz");function HA(n,e){var t;const s=[],o=P.getComponentsInChildren(n,Rt),r=P.getComponentsInChildren(n,Ft),l=new Array,c=new Array;if(e.injectImplicitBehaviours)for(const h of o){if(!h||!h.runtimeAnimatorController||!h.enabled)continue;const d=h.runtimeAnimatorController.activeState;if(!d||!d.motion||!d.motion.clip||((t=d.motion.clip.tracks)==null?void 0:t.length)<1||l.includes(h))continue;const u=new Jc;u.animator=h,u.stateName=d.name,u.trigger="start",u.name="PlayAnimationOnClick_implicitAtStart_"+u.stateName;const p=new E;P.addComponent(p,u),c.push(p),l.push(h),n.add(p)}else for(const h of o){if(!h||!h.runtimeAnimatorController||!h.enabled)continue;hh&&console.log(h);const d=[];for(const u of h.runtimeAnimatorController.enumerateActions()){hh&&console.log(u);const p=u.getClip();d.includes(p)||d.push(p)}s.push({root:h.gameObject,clips:d})}if(e.injectImplicitBehaviours)for(const h of r){if(!h||!h.clip||!h.enabled||!h.playAutomatically||l.includes(h))continue;const d=new Jc;d.animation=h,d.stateName=h.clip.name,d.trigger="start",d.name="PlayAnimationOnClick_implicitAtStart_"+d.stateName;const u=new E;P.addComponent(u,d),c.push(u),l.push(h),n.add(u)}else for(const h of r){hh&&console.log(h);const d=[];for(const u of h.animations)d.includes(u)||d.push(u);s.push({root:h.gameObject,clips:d})}hh&&s?.length>0&&console.log("USDZ Animation Clips without behaviours",s);for(const h of s)for(const d of h.clips)e.registerAnimation(h.root,d);return c}function GA(n,e){const t=P.getComponentsInChildren(n,ns),s=P.getComponentsInChildren(n,Vo),o=new Array,r=new Array;hh&&console.log({audioSources:t,playAudioOnClicks:s});for(const l of s){if(!l.target)continue;const c=t.indexOf(l.target);c>-1&&t.splice(c,1)}for(const l of t){if(!l||!l.clip||l.volume<=0||o.includes(l))continue;const c=new Vo;c.target=l,c.name="PlayAudioOnClick_implicitAtStart_",c.trigger="start";const h=new E;P.addComponent(h,c),console.log("implicit PlayAudioOnStart",h,c),r.push(h),o.push(l),n.add(h)}return r}function qA(n){return new Jt("DisableAtStart",At.sceneStartTrigger(),ve.fadeAction(n,0,!1))}function nS(n,e){const t=n.domElement.shadowRoot.querySelector("link[rel='ar']");if(t)return t;const s=document.createElement("div");s.classList.add("menu"),s.classList.add("quicklook-menu"),s.style.display="none",s.style.visibility="hidden";const o=document.createElement("button");o.id="open-in-ar",e?(o.innerText="View in AR",o.title="View this scene in AR. The scene will be exported to USDZ and opened with Apple's QuickLook."):(o.innerText="View in AR",o.title="Download this scene for AR. Open the downloaded USDZ file to view it in AR using Apple's QuickLook."),s.appendChild(o);const r=document.createElement("a");r.id="needle-usdz-link",r.style.display="none",r.rel="ar",r.href="",r.target="_blank",s.appendChild(r);const l=document.createElement("img");return l.id="button",r.appendChild(l),n.domElement.shadowRoot.appendChild(s),r}var XA=Object.defineProperty,It=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&XA(e,t,o),o};const Vi=C("debugusdz"),QA=C("debugusdzpruning");class Jr{constructor(){a(this,"callToAction"),a(this,"checkoutTitle"),a(this,"checkoutSubtitle"),a(this,"callToActionURL")}}It([m()],Jr.prototype,"callToAction"),It([m()],Jr.prototype,"checkoutTitle"),It([m()],Jr.prototype,"checkoutSubtitle"),It([m()],Jr.prototype,"callToActionURL");var _l;const fi=(_l=class extends I{constructor(){super(...arguments),a(this,"objectToExport"),a(this,"autoExportAnimations",!0),a(this,"autoExportAudioSources",!0),a(this,"exportFileName"),a(this,"customUsdzFile"),a(this,"customBranding"),a(this,"anchoringType","plane"),a(this,"maxTextureSize",2048),a(this,"planeAnchoringAlignment","horizontal"),a(this,"interactive",!0),a(this,"physics",!0),a(this,"allowCreateQuicklookButton",!0),a(this,"quickLookCompatible",!0),a(this,"extensions",[]),a(this,"link"),a(this,"button"),a(this,"onClickedOpenInARElement",n=>{n.preventDefault(),this.exportAndOpen()}),a(this,"_currentExportTasks",new Map),a(this,"_previousTimeScale",1),a(this,"lastCallback"),a(this,"_rootSessionRootWasAppliedTo",null),a(this,"_rootPositionBeforeExport",new S),a(this,"_rootRotationBeforeExport",new V),a(this,"_rootScaleBeforeExport",new S)}start(){var n,e,t;Vi&&(console.log("USDZExporter",this),console.log("Debug USDZ Mode. Press 'T' to export"),window.addEventListener("keydown",s=>{switch(s.key){case"t":this.exportAndOpen();break}})),this.objectToExport||(this.objectToExport=this.gameObject),!((e=(n=this.objectToExport)==null?void 0:n.children)!=null&&e.length)&&!((t=this.objectToExport)!=null&&t.isMesh)&&(this.objectToExport=this.context.scene)}onEnable(){var n;const e=X.supportsQuickLookAR(),t=X.isiOS()||X.isiPad();!this.button&&(Vi||e||t)&&(this.allowCreateQuicklookButton&&(this.button=this.createQuicklookButton()),this.lastCallback=this.quicklookCallback.bind(this),this.link=nS(this.context,e),this.link.addEventListener("message",this.lastCallback)),Vi&&De("USDZ Exporter enabled: "+this.name),(n=document.getElementById("open-in-ar"))==null||n.addEventListener("click",this.onClickedOpenInARElement),cc.registerExporter(this)}onDisable(){var n,e,t;(n=this.button)==null||n.remove(),(e=this.link)==null||e.removeEventListener("message",this.lastCallback),Vi&&De("USDZ Exporter disabled: "+this.name),(t=document.getElementById("open-in-ar"))==null||t.removeEventListener("click",this.onClickedOpenInARElement),cc.unregisterExporter(this)}async exportAsync(){return this.exportAndOpen()}async exportAndOpen(){var n;let e=this.exportFileName??((n=this.objectToExport)==null?void 0:n.name)??this.name;if(e+="-"+b1(),Zs()||(e!==""&&(e+="-"),e+="MadeWithNeedle"),this.link||(this.link=nS(this.context,X.supportsQuickLookAR())),this.customUsdzFile)return Vi&&console.log("Exporting custom usdz",this.customUsdzFile),this.openInQuickLook(this.customUsdzFile,e),null;if(!this.objectToExport)return console.warn("No object to export",this),null;const t=await this.export(this.objectToExport);return t?(Vi&&console.log("USDZ generation done. Downloading as "+e),this.openInQuickLook(t,e),t):(console.error("USDZ generation failed. Please report a bug",this),null)}async export(n){if(!n)return console.warn("No object to export"),null;const e=this._currentExportTasks.get(n);if(e)return e;const t=this.internalExport(n);return t instanceof Promise?(this._currentExportTasks.set(n,t),t.then(s=>(this._currentExportTasks.delete(n),s)).catch(s=>(this._currentExportTasks.delete(n),console.error("Error during USDZ export \u2013 please report a bug!",s),null))):t}async internalExport(n){de.start("export-usdz",{onProgress:x=>{this.dispatchEvent(new CustomEvent("export-progress",{detail:{progress:x}}))}}),de.report("export-usdz",{message:"Starting export",totalSteps:40,currentStep:0}),de.report("export-usdz",{message:"Load progressive textures",autoStep:5}),de.start("export-usdz-textures","export-usdz");const e=P.getComponentsInChildren(n,gi);for(const x of e)x&&x.enabled&&x.updateSprite(!0);const t=P.getComponentsInChildren(n,Ui),s=new Array;let o=0;for(const x of t){for(const k of x.sharedMeshes)if(k){const M=Xe.assignMeshLOD(k,0);M instanceof Promise&&s.push(new Promise((T,L)=>{M.then(()=>{o++,de.report("export-usdz-textures",{message:"Loaded progressive mesh",currentStep:o,totalSteps:s.length}),T()}).catch(D=>L(D))}))}for(const k of x.sharedMaterials)if(k){const M=Xe.assignTextureLOD(k,0);M instanceof Promise&&s.push(new Promise((T,L)=>{M.then(()=>{o++,de.report("export-usdz-textures",{message:"Loaded progressive texture",currentStep:o,totalSteps:s.length}),T()}).catch(D=>L(D))}))}}Vi&&De("Progressive Loading: "+s.length),await Promise.all(s),Vi&&De("Progressive Loading: done"),de.end("export-usdz-textures");const r=Di.Global.Mask;Di.Global.Set(rn.AR);const l=new P1,c=new dp(this.quickLookCompatible);let h;const d=[];this.interactive&&(d.push(new Z0),d.push(new _a),globalThis.NEEDLE_USE_RAPIER&&P.getComponentsInChildren(n,dt).length>0&&(this.physics?(h=new J0,d.push(h)):F()&&console.warn("USDZExporter: Physics export is disabled, but there are active Rigidbody components in the scene. They will not be exported.")),d.push(new Pp),d.push(new hy));const u=[c,...d,...this.extensions],p={self:this,exporter:l,extensions:u,object:n};de.report("export-usdz","Invoking before-export"),this.dispatchEvent(new CustomEvent("before-export",{detail:p})),this.applyWebARSessionRoot(),this._previousTimeScale=this.context.time.timeScale,this.context.time.timeScale=0,de.report("export-usdz","auto export animations and audio sources");const g=new Array;this.autoExportAnimations&&g.push(...HA(n,c)),u.find(x=>x.extensionName==="Audio")&&this.autoExportAudioSources&&g.push(...GA(n)),l.debug=Vi,l.pruneUnusedNodes=!QA;const f=Ju.instance.objs.map(x=>x.batchedMesh);l.keepObject=x=>{let k=!0;const M=P.getComponent(x,Ui);return M&&!M.enabled&&(k=!1),k&&f.includes(x)&&(k=!1),k&&P.getComponentInParent(x,Vc)&&(k=!1),k&&P.getComponentInParent(x,en)&&(k=!1),Vi&&!k&&console.log("USDZExporter: Discarding object",x),k},l.beforeWritingDocument=()=>{if(F()&&c&&h){const x=c.animatedRoots;for(const k of x){const M=P.getComponentsInChildren(k,dt).filter(L=>L.enabled),T=P.getComponents(k,ui).filter(L=>L.enabled&&!L.isTrigger);(M.length>0||T.length>0)&&console.error("An animated object has physics components in its child hierarchy. This can lead to undefined behaviour due to a bug in Apple's QuickLook (FB15925487). Remove the physics components from child objects or verify that you get the expected results.",k)}}};const y=new Array;this.objectToExport&&this.quickLookCompatible&&this.interactive&&this.objectToExport.traverse(x=>{x.visible||y.push(x)});const v=u.find(x=>x.extensionName==="Behaviour");this.interactive&&v&&y.length>0&&v.addBehavior(qA(y));let b=!0;this.quickLookCompatible&&!this.interactive&&(b=!1),this.anchoringType!=="plane"&&this.anchoringType!=="none"&&this.anchoringType!=="image"&&this.anchoringType!=="face"&&(this.anchoringType="plane"),this.planeAnchoringAlignment!=="horizontal"&&this.planeAnchoringAlignment!=="vertical"&&this.planeAnchoringAlignment!=="any"&&(this.planeAnchoringAlignment="horizontal"),de.report("export-usdz","Invoking exporter.parse");const _=await l.parse(this.objectToExport,{ar:{anchoring:{type:this.anchoringType},planeAnchoring:{alignment:this.planeAnchoringAlignment}},extensions:u,quickLookCompatible:this.quickLookCompatible,maxTextureSize:this.maxTextureSize,exportInvisible:b}),w=new Blob([_],{type:"model/vnd.usdz+zip"});this.revertWebARSessionRoot(),this.context.time.timeScale=this._previousTimeScale,de.report("export-usdz","Invoking after-export"),this.dispatchEvent(new CustomEvent("after-export",{detail:p}));for(const x of g)P.destroy(x);return Di.Global.Set(r),de.end("export-usdz"),w}openInQuickLook(n,e){const t=n instanceof Blob?URL.createObjectURL(n):n,s=this.buildQuicklookOverlay();Vi&&console.log("QuickLook Overlay",s);const o=s.callToAction?encodeURIComponent(s.callToAction):"",r=s.checkoutTitle?encodeURIComponent(s.checkoutTitle):"",l=s.checkoutSubtitle?encodeURIComponent(s.checkoutSubtitle):"";this.link.href=t+`#callToAction=${o}&checkoutTitle=${r}&checkoutSubtitle=${l}&callToActionURL=${s.callToActionURL}`,this.lastCallback||(this.lastCallback=this.quicklookCallback.bind(this),this.link.addEventListener("message",this.lastCallback)),this.link.download=e+".usdz",this.link.click()}download(n,e){_l.save(n,e)}static save(n,e){const t=document.createElement("a");t.style.display="none",document.body.appendChild(t),typeof n=="string"?t.href=n:t.href=URL.createObjectURL(n),t.download=e,t.click(),t.remove()}quicklookCallback(n){if(n?.data=="_apple_ar_quicklook_button_tapped"){Vi&&be("Quicklook closed via call to action button");var e=new CustomEvent("quicklook-button-tapped",{detail:this});if(this.dispatchEvent(e),!e.defaultPrevented){const t=new URLSearchParams(this.link.href);if(t){const s=t.get("callToActionURL");Vi&&De("Quicklook url: "+s),s&&(Zs()?globalThis.open(s,"_blank"):console.warn("Quicklook closed: custom redirects require a Needle Engine Pro license: https://needle.tools/pricing",s))}}}}buildQuicklookOverlay(){var n,e,t,s,o,r;const l={};return this.customBranding&&Object.assign(l,this.customBranding),Zs()||(console.log("Custom Quicklook banner text requires pro license: https://needle.tools/pricing"),l.callToAction="Close",l.checkoutTitle="\u{1F335} Made with Needle",l.checkoutSubtitle="_"),(((n=l.callToAction)==null?void 0:n.length)||((e=l.checkoutTitle)==null?void 0:e.length)||((t=l.checkoutSubtitle)==null?void 0:t.length))&&((s=l.callToAction)!=null&&s.length||(l.callToAction="\0"),(o=l.checkoutTitle)!=null&&o.length||(l.checkoutTitle="\0"),(r=l.checkoutSubtitle)!=null&&r.length||(l.checkoutSubtitle="\0")),this.dispatchEvent(new CustomEvent("quicklook-overlay",{detail:l})),l}getARScaleAndTarget(){if(!this.objectToExport)return{scale:1,_invertForward:!1,target:this.gameObject,sessionRoot:null};const n=P.findObjectOfType(wp);let e=P.getComponentInParent(this.objectToExport,$o);e||(e=P.getComponentInChildren(this.objectToExport,$o));let t=1,s=!1;const o=this.objectToExport;return n?t=n.arScale:e&&(t=e.arScale,s=e.invertForward),{scale:1/t,_invertForward:s,target:o,sessionRoot:e?.gameObject??null}}applyWebARSessionRoot(){if(!this.objectToExport)return;const{scale:n,_invertForward:e,target:t,sessionRoot:s}=this.getARScaleAndTarget(),o=s?.matrixWorld.clone().invert();this._rootSessionRootWasAppliedTo=t,this._rootPositionBeforeExport.copy(t.position),this._rootRotationBeforeExport.copy(t.quaternion),this._rootScaleBeforeExport.copy(t.scale),t.scale.multiplyScalar(n),e&&t.quaternion.multiply(_l.invertForwardQuaternion),t.updateMatrix(),t.updateMatrixWorld(!0),s&&o&&t.matrix.premultiply(o)}revertWebARSessionRoot(){if(!this.objectToExport||!this._rootSessionRootWasAppliedTo)return;const n=this._rootSessionRootWasAppliedTo;n.position.copy(this._rootPositionBeforeExport),n.quaternion.copy(this._rootRotationBeforeExport),n.scale.copy(this._rootScaleBeforeExport),n.updateMatrix(),n.updateMatrixWorld(!0),this._rootSessionRootWasAppliedTo=null}createQuicklookButton(){const n=pl.getOrCreate().createQuicklookButton();return n.parentNode||this.context.menu.appendChild(n),n}},a(_l,"invertForwardMatrix",new se().makeRotationY(Math.PI)),a(_l,"invertForwardQuaternion",new V().setFromEuler(new Dt(0,Math.PI,0))),_l);It([m(E)],fi.prototype,"objectToExport"),It([m()],fi.prototype,"autoExportAnimations"),It([m()],fi.prototype,"autoExportAudioSources"),It([m()],fi.prototype,"exportFileName"),It([m(URL)],fi.prototype,"customUsdzFile"),It([m(Jr)],fi.prototype,"customBranding"),It([m()],fi.prototype,"anchoringType"),It([m()],fi.prototype,"maxTextureSize"),It([m()],fi.prototype,"planeAnchoringAlignment"),It([m()],fi.prototype,"interactive"),It([m()],fi.prototype,"physics"),It([m()],fi.prototype,"allowCreateQuicklookButton"),It([m()],fi.prototype,"quickLookCompatible");let gn=fi;var YA=Object.defineProperty,KA=Object.getOwnPropertyDescriptor,dy=(n,e,t,s)=>{for(var o=KA(e,t),r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&YA(e,t,o),o};class wl extends I{constructor(){super(...arguments),a(this,"_fog")}get fog(){return this._fog||(this._fog=new Tv(0,0,50)),this._fog}get mode(){return 1}set near(e){this.fog.near=e}get near(){return this.fog.near}set far(e){this.fog.far=e}get far(){return this.fog.far}set color(e){this.fog.color.copy(e)}get color(){return this.fog.color}onEnable(){this.scene.fog=this.fog}onDisable(){this.scene.fog===this._fog&&(this.scene.fog=null)}}dy([m()],wl.prototype,"near"),dy([m()],wl.prototype,"far"),dy([m(oe)],wl.prototype,"color");var ZA=Object.defineProperty,uy=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&ZA(e,t,o),o};class ea extends I{constructor(){super(...arguments),a(this,"objectBounds",!1),a(this,"color"),a(this,"isGizmo",!0),a(this,"_gizmoObject",null),a(this,"_boxHelper",null)}onEnable(){this.isGizmo&&!yc||(this._gizmoObject||(this.objectBounds?this._gizmoObject=new RP(this.gameObject,this.color??16776960):(this.objectBounds=!1,this._gizmoObject=Vg(this.color??16776960))),this.objectBounds?(this.scene.add(this._gizmoObject),this._boxHelper=this._gizmoObject,this.startCoroutine(this.syncObjectBounds(),Oe.OnBeforeRender)):this.gameObject.add(this._gizmoObject))}onDisable(){this._gizmoObject&&this.gameObject.remove(this._gizmoObject)}*syncObjectBounds(){for(var e;this._boxHelper;)(e=this._boxHelper)==null||e.update(),yield}}uy([m()],ea.prototype,"objectBounds"),uy([m(oe)],ea.prototype,"color"),uy([m()],ea.prototype,"isGizmo");var JA=Object.defineProperty,py=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&JA(e,t,o),o};class xl extends I{constructor(){super(...arguments),a(this,"isGizmo",!1),a(this,"color0"),a(this,"color1"),a(this,"gridHelper"),a(this,"size"),a(this,"divisions"),a(this,"offset")}onEnable(){if(this.isGizmo&&!yc)return;const e=this.size,t=this.divisions;this.gridHelper||(this.gridHelper=new Mm(e,t,this.color0??new oe(.4,.4,.4),this.color1??new oe(.6,.6,.6)),this.offset!==void 0&&(this.gridHelper.position.y+=this.offset)),this.gridHelper&&this.gameObject.add(this.gridHelper)}onDisable(){this.gridHelper&&(this.gameObject.remove(this.gridHelper),this.gridHelper=null)}}py([m()],xl.prototype,"isGizmo"),py([m(oe)],xl.prototype,"color0"),py([m(oe)],xl.prototype,"color1");var e2=Object.defineProperty,my=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&e2(e,t,o),o};class gy extends I{constructor(){super(...arguments),a(this,"connectedBody"),a(this,"_rigidBody",null)}get rigidBody(){return this._rigidBody}onEnable(){this._rigidBody||(this._rigidBody=this.gameObject.getComponent(dt)),this.rigidBody&&this.connectedBody&&this.startCoroutine(this.create())}*create(){yield,this.rigidBody&&this.connectedBody&&this.activeAndEnabled&&this.createJoint(this.rigidBody,this.connectedBody)}}my([m(dt)],gy.prototype,"connectedBody");class fy extends gy{createJoint(e,t){var s;(s=this.context.physics.engine)==null||s.addFixedJoint(e,t)}}class dh extends gy{constructor(){super(...arguments),a(this,"anchor"),a(this,"axis")}createJoint(e,t){var s;this.axis&&this.anchor&&((s=this.context.physics.engine)==null||s.addHingeJoint(e,t,this.anchor,this.axis))}}my([m(S)],dh.prototype,"anchor"),my([m(S)],dh.prototype,"axis");var t2=Object.defineProperty,i2=Object.getOwnPropertyDescriptor,fn=(n,e,t,s)=>{for(var o=s>1?void 0:s?i2(e,t):e,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=(s?l(e,t,o):l(o))||o);return s&&o&&t2(e,t,o),o};function yy(n){return n*Math.PI/180}const oS=300,Zo=C("debuglights");class yi extends I{constructor(){super(...arguments),a(this,"type",0),a(this,"range",1),a(this,"spotAngle",1),a(this,"innerSpotAngle",1),a(this,"_color",new oe(16777215)),a(this,"_shadowNearPlane",.1),a(this,"_shadowBias",0),a(this,"_shadowNormalBias",0),a(this,"_overrideShadowBiasSettings",!1),a(this,"_shadows",1),a(this,"lightmapBakeType",4),a(this,"_intensity",-1),a(this,"_shadowDistance"),a(this,"shadowWidth"),a(this,"shadowHeight"),a(this,"_shadowResolution"),a(this,"light"),a(this,"_webXRStartedListener"),a(this,"_webXREndedListener"),a(this,"_webARRoot")}set color(e){this._color=e,this.light!==void 0&&(this.light.color=e)}get color(){return this.light?this.light.color:this._color}set shadowNearPlane(e){var t,s;if(e!==this._shadowNearPlane&&(this._shadowNearPlane=e,((s=(t=this.light)==null?void 0:t.shadow)==null?void 0:s.camera)!==void 0)){const o=this.light.shadow.camera;o.near=e}}get shadowNearPlane(){return this._shadowNearPlane}set shadowBias(e){var t,s;e!==this._shadowBias&&(this._shadowBias=e,((s=(t=this.light)==null?void 0:t.shadow)==null?void 0:s.bias)!==void 0&&(this.light.shadow.bias=e,this.light.shadow.needsUpdate=!0))}get shadowBias(){return this._shadowBias}set shadowNormalBias(e){var t,s;e!==this._shadowNormalBias&&(this._shadowNormalBias=e,((s=(t=this.light)==null?void 0:t.shadow)==null?void 0:s.normalBias)!==void 0&&(this.light.shadow.normalBias=e,this.light.shadow.needsUpdate=!0))}get shadowNormalBias(){return this._shadowNormalBias}set shadows(e){this._shadows=e,this.light&&(this.light.castShadow=e!==0,this.updateShadowSoftHard())}get shadows(){return this._shadows}set intensity(e){var t;if(this._intensity=e,this.light){let s=1;if(this.context.isInXR&&this._webARRoot){const o=(t=this._webARRoot)==null?void 0:t.arScale;typeof o=="number"&&o>0&&(s/=o)}this.light.intensity=e*s}Zo&&console.log("Set light intensity to "+this._intensity,e,this)}get intensity(){return this._intensity}get shadowDistance(){const e=this.light;return e!=null&&e.shadow?e.shadow.camera.far:-1}set shadowDistance(e){this._shadowDistance=e;const t=this.light;if(t!=null&&t.shadow){const s=t.shadow.camera;s.far=e,s.updateProjectionMatrix()}}get shadowResolution(){const e=this.light;return e!=null&&e.shadow?e.shadow.mapSize.x:-1}set shadowResolution(e){if(e===this._shadowResolution)return;this._shadowResolution=e;const t=this.light;t!=null&&t.shadow&&(t.shadow.mapSize.set(e,e),t.shadow.needsUpdate=!0)}get isBaked(){return this.lightmapBakeType===2}get selfIsLight(){if(this.gameObject.isLight===!0)return!0;switch(this.gameObject.type){case"SpotLight":case"PointLight":case"DirectionalLight":return!0}return!1}getWorldPosition(e){return this.light?this.type===1?this.light.getWorldPosition(e).multiplyScalar(1):this.light.getWorldPosition(e):e}awake(){this.color=new oe(this.color??16777215),Zo&&console.log(this.name,this)}onEnable(){Zo&&console.log("ENABLE LIGHT",this.name),this.createLight(),!this.isBaked&&(this.light&&(this.light.visible=!0,this.light.intensity=this._intensity,Zo&&console.log("Set light intensity to "+this.light.intensity,this.name),this.selfIsLight||this.light.parent!==this.gameObject&&this.gameObject.add(this.light)),this.type===1&&this.startCoroutine(this.updateMainLightRoutine(),Oe.LateUpdate))}onDisable(){Zo&&console.log("DISABLE LIGHT",this.name),this.light&&(this.selfIsLight?this.light.intensity=0:this.light.visible=!1)}onEnterXR(e){this._webARRoot=P.getComponentInParent(this.gameObject,$o)??void 0}onLeaveXR(e){}createLight(){const e=this.selfIsLight;if(e&&!this.light)switch(this.light=this.gameObject,this.light.name=this.name,this._intensity=this.light.intensity,this.type){case 1:this.setDirectionalLight(this.light);break}else if(!this.light)switch(this.type){case 1:const t=new Rm(this.color,this.intensity*Math.PI);if(t.position.set(0,0,-oS*.5).applyQuaternion(this.gameObject.quaternion),this.gameObject.add(t.target),br(t.target,0,0,0),this.light=t,this.gameObject.position.set(0,0,0),this.gameObject.rotation.set(0,0,0),Zo){const l=new EP(this.light,.2,this.color);this.context.scene.add(l)}break;case 0:const s=new TP(this.color,this.intensity*Math.PI,this.range,yy(this.spotAngle/2),1-yy(this.innerSpotAngle/2)/yy(this.spotAngle/2),2);s.position.set(0,0,0),s.rotation.set(0,0,0),this.light=s;const o=s.target;s.add(o),o.position.set(0,0,this.range),o.rotation.set(0,0,0);break;case 2:const r=new Tm(this.color,this.intensity*Math.PI,this.range);this.light=r;break}if(this.light){if(this._intensity>=0?this.light.intensity=this._intensity:this._intensity=this.light.intensity,this.shadows!==0?this.light.castShadow=!0:this.light.castShadow=!1,this.light.shadow){this._shadowResolution!==void 0&&this._shadowResolution>4?(this.light.shadow.mapSize.width=this._shadowResolution,this.light.shadow.mapSize.height=this._shadowResolution):(this.light.shadow.mapSize.width=2048,this.light.shadow.mapSize.height=2048),Zo&&console.log("Override shadow bias?",this._overrideShadowBiasSettings,this.shadowBias,this.shadowNormalBias),this.light.shadow.bias=this.shadowBias,this.light.shadow.normalBias=this.shadowNormalBias,this.updateShadowSoftHard();const t=this.light.shadow.camera;if(t.near=this.shadowNearPlane,this._shadowDistance!==void 0&&typeof this._shadowDistance=="number"?t.far=this._shadowDistance:t.far=oS*Math.abs(this.gameObject.scale.z),this.gameObject.scale.set(1,1,1),this.shadowWidth!==void 0)t.left=-this.shadowWidth/2,t.right=this.shadowWidth/2;else{const s=this.gameObject.scale.x;t.left*=s,t.right*=s}if(this.shadowHeight!==void 0)t.top=this.shadowHeight/2,t.bottom=-this.shadowHeight/2;else{const s=this.gameObject.scale.y;t.top*=s,t.bottom*=s}this.light.shadow.needsUpdate=!0,Zo&&this.context.scene.add(new AP(t))}this.isBaked?this.light.removeFromParent():e||this.gameObject.add(this.light)}}*updateMainLightRoutine(){for(;;){this.type===1&&((!this.context.mainLight||this.intensity>this.context.mainLight.intensity)&&(this.context.mainLight=this),yield);break}}updateShadowSoftHard(){this.light&&this.light.shadow&&(this.shadows===2||(this.light.shadow.radius=1,this.light.shadow.blurSamples=1))}setDirectionalLight(e){e.add(e.target),e.target.position.set(0,0,-1)}}a(yi,"allowChangingRendererShadowMapType",!0),fn([m()],yi.prototype,"type",2),fn([m(oe)],yi.prototype,"color",1),fn([m()],yi.prototype,"shadowNearPlane",1),fn([m()],yi.prototype,"shadowBias",1),fn([m()],yi.prototype,"shadowNormalBias",1),fn([m()],yi.prototype,"shadows",1),fn([m()],yi.prototype,"lightmapBakeType",2),fn([m()],yi.prototype,"intensity",1),fn([m()],yi.prototype,"shadowDistance",1),fn([m()],yi.prototype,"shadowResolution",1),new S(0,0,0);var s2=Object.defineProperty,uh=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&s2(e,t,o),o};const vy=C("debuglods"),n2=C("nolods");class Sl{constructor(){a(this,"screenRelativeTransitionHeight"),a(this,"distance"),a(this,"renderers")}}uh([m()],Sl.prototype,"screenRelativeTransitionHeight"),uh([m()],Sl.prototype,"distance"),uh([m(Ui)],Sl.prototype,"renderers");class o2{constructor(e){a(this,"model"),this.model=e}get renderers(){return this.model.renderers}}class ph extends I{constructor(){super(...arguments),a(this,"fadeMode",0),a(this,"localReferencePoint"),a(this,"lodCount",0),a(this,"size",0),a(this,"animateCrossFading",!1),a(this,"lodModels"),a(this,"_lods",[]),a(this,"_settings",[]),a(this,"_lodsHandler"),a(this,"_distanceFactor",1)}start(){if(vy&&console.log("LODGROUP",this.name,this.lodModels,this),!n2&&!this._lodsHandler&&this.gameObject&&this.lodModels&&Array.isArray(this.lodModels)){const e=[];for(const s of this.lodModels){const o=new o2(s);this._lods.push(o);for(const r of o.renderers)e.includes(r)||e.push(r)}this._lodsHandler=new Array;for(let s=0;s<e.length;s++){const o=new IP;this._lodsHandler.push(o),this.gameObject.add(o)}const t=new E;t.name="Cull "+this.name;for(let s=0;s<e.length;s++){const o=e[s],r=this._lodsHandler[s],l=o.gameObject;vy&&console.log(s,l.name);for(const c of this._lods){const h=c.model.distance;let d=null;if(c.renderers.includes(o)?d=l:d=t,d.type==="Group"){console.warn(`LODGroup ${this.name}: Group or MultiMaterial object's are not supported as LOD object: ${d.name}`);continue}vy&&console.log("LEVEL",d.name,h),r.autoUpdate=!1,this.onAddLodLevel(r,d,c.model.distance)}}}}onAfterRender(){if(!this.gameObject||!this._lodsHandler)return;const e=this.context.mainCamera;if(e)for(const t of this._lodsHandler){t.update(e);const s=t.getCurrentLevel(),o=t.levels[s];t.layers.mask=o.object.layers.mask}}onAddLodLevel(e,t,s){if(t===this.gameObject){console.warn("LODGroup component must be on parent object and not mesh directly at the moment",t.name,t);return}e.addLevel(t,s*this._distanceFactor,.01);const o={lod:e,levelIndex:e.levels.length-1,distance:s};this._settings.push(o)}distanceFactor(e){if(e!==this._distanceFactor){this._distanceFactor=e;for(const t of this._settings){const s=t.lod.levels[t.levelIndex];s.distance=t.distance*e}}}}uh([m(S)],ph.prototype,"localReferencePoint"),uh([m(Sl)],ph.prototype,"lodModels");var r2=Object.defineProperty,a2=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&r2(e,t,o),o};const Op=C("debugnestedgltf");class kp extends I{constructor(){super(...arguments),a(this,"filePath"),a(this,"loadAssetInParent",!0),a(this,"_isLoadingOrDoneLoading",!1)}listenToProgress(e){var t;(t=this.filePath)==null||t.beginListenDownload(e)}preload(){var e;(e=this.filePath)==null||e.preload()}async start(){var e,t,s,o,r;if(this._isLoadingOrDoneLoading)return;Op&&console.log(this,this.guid);const l=this.gameObject.parent;if(l){this._isLoadingOrDoneLoading=!0;const c=new Fs;c.idProvider=new jt(this.hash(this.guid)),c.parent=this.loadAssetInParent!==!1?l:this.gameObject,this.gameObject.updateMatrix();const h=this.gameObject.matrix;Op&&console.log("Load nested:",((e=this.filePath)==null?void 0:e.url)??this.filePath,this.gameObject.position);const d=await((s=(t=this.filePath)==null?void 0:t.instantiate)==null?void 0:s.call(this.filePath,c));Op&&console.log("Nested loaded:",((o=this.filePath)==null?void 0:o.url)??this.filePath,d),d&&this.loadAssetInParent!==!1&&(d.matrixAutoUpdate=!1,d.matrix.identity(),d.applyMatrix4(h),d.matrixAutoUpdate=!0,d.layers.disableAll(),d.layers.set(this.layer),this.dispatchEvent(new CustomEvent("loaded",{detail:{instance:d,assetReference:this.filePath}}))),Op&&console.log("Nested loading done:",((r=this.filePath)==null?void 0:r.url)??this.filePath,d)}}onDestroy(){var e;(e=this.filePath)==null||e.unload()}hash(e){let t=0;for(let s=0;s<e.length;s++)t=e.charCodeAt(s)+((t<<5)-t);return t}}a2([m(ce)],kp.prototype,"filePath");var l2=Object.defineProperty,by=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&l2(e,t,o),o};const c2=C("debugnet"),Mp=class Sv extends I{constructor(){super(...arguments),a(this,"url",null),a(this,"urlParameterName",null),a(this,"localhost",null)}awake(){c2&&console.log(this),this.context.connection.registerProvider(this)}getWebsocketUrl(){let e=this.url?Sv.GetUrl(this.url,this.localhost):null;if(this.urlParameterName){const s=C(this.urlParameterName);s&&typeof s=="string"&&(e=s)}if(!e)return null;const t=new RegExp("(((https?)|(?<socket_prefix>wss?))://)?(www.)?(?<url>.+)","gm").exec(e);return t!=null&&t.groups?t?.groups.socket_prefix?e:"wss://"+t?.groups.url:null}static GetUrl(e,t){let s=e;const o=Sv.IsLocalNetwork()&&t;if(o&&(s=t),e!=null&&e.startsWith("/")){const r=o?s:window.location.origin;r!=null&&r.endsWith("/")&&e.startsWith("/")&&(e=e.substring(1)),s=r+e}return s}static IsLocalNetwork(e=window.location.hostname){return Xt(e)}};by([m()],Mp.prototype,"url"),by([m()],Mp.prototype,"urlParameterName"),by([m()],Mp.prototype,"localhost");let _y=Mp;var h2=Object.defineProperty,Rp=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&h2(e,t,o),o};class ta extends I{constructor(){super(...arguments),a(this,"referenceSpace"),a(this,"from"),a(this,"affectPosition",!1),a(this,"affectRotation",!1),a(this,"alignLookDirection",!1),a(this,"levelLookDirection",!1),a(this,"levelPosition",!1),a(this,"positionOffset",new S(0,0,0)),a(this,"rotationOffset",new S(0,0,0)),a(this,"offset",new S(0,0,0))}update(){if(!this.from)return;var e=ee(this.from),t=Se(this.from);this.offset.copy(this.positionOffset);const s=this.offset.length();if(this.referenceSpace&&this.offset.transformDirection(this.referenceSpace.matrixWorld).multiplyScalar(s),e.add(this.offset),this.levelPosition&&this.referenceSpace){const c=new yr(this.gameObject.up,0),h=ee(this.referenceSpace);c.setFromNormalAndCoplanarPoint(this.gameObject.up,h);const d=new S(0,0,0);c.projectPoint(e,d),e.copy(d)}this.affectPosition&<(this.gameObject,e);const o=new Dt(this.rotationOffset.x,this.rotationOffset.y,this.rotationOffset.z),r=new V().setFromEuler(o);this.affectRotation&&Yi(this.gameObject,t.multiply(r));const l=new S;this.from.getWorldDirection(l).multiplyScalar(50),this.levelLookDirection&&(l.y=0),this.alignLookDirection&&this.gameObject.lookAt(l)}}Rp([m(P)],ta.prototype,"referenceSpace"),Rp([m(P)],ta.prototype,"from"),Rp([m(S)],ta.prototype,"positionOffset"),Rp([m(S)],ta.prototype,"rotationOffset");var d2=Object.defineProperty,Jo=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&d2(e,t,o),o};class vi{constructor(e=0,t=0){a(this,"time",0),a(this,"value",0),a(this,"inTangent",1/0),a(this,"inWeight"),a(this,"outTangent",1/0),a(this,"outWeight"),a(this,"weightedMode"),this.time=e,this.value=t}}Jo([m()],vi.prototype,"time"),Jo([m()],vi.prototype,"value"),Jo([m()],vi.prototype,"inTangent"),Jo([m()],vi.prototype,"inWeight"),Jo([m()],vi.prototype,"outTangent"),Jo([m()],vi.prototype,"outWeight"),Jo([m()],vi.prototype,"weightedMode");const rS=class rd{constructor(){a(this,"keys",[])}static linearFromTo(e,t,s){const o=new rd,r=new vi;r.time=0,r.value=e;const l=new vi;return l.time=s,l.value=t,o.keys.push(r,l),o}static constant(e){const t=new rd,s=new vi;return s.time=0,s.value=e,t.keys.push(s),t}clone(){var e;const t=new rd;return t.keys=((e=this.keys)==null?void 0:e.map(s=>{const o=new vi;return o.time=s.time,o.value=s.value,o.inTangent=s.inTangent,o.inWeight=s.inWeight,o.outTangent=s.outTangent,o.outWeight=s.outWeight,o.weightedMode=s.weightedMode,o}))||[],t}get duration(){return!this.keys||this.keys.length==0?0:this.keys[this.keys.length-1].time}evaluate(e){if(!this.keys||this.keys.length==0)return 0;if(this.keys.length===1)return this.keys[0].value;if(this.keys[0].time>=e)return this.keys[0].value;for(let t=0;t<this.keys.length;t++){const s=this.keys[t];if(s.time<=e)if(t+1<this.keys.length){const o=this.keys[t+1];if(o.time<e)continue;return!isFinite(s.outTangent)||!isFinite(o.inTangent)?s.value:rd.interpolateValue(e,s,o)}else return s.value}return this.keys[this.keys.length-1].value}static interpolateValue(e,t,s){const o=t.time,r=t.value,l=t.outTangent,c=s.time,h=s.value,d=s.inTangent,u=c-o,p=u*u,g=p*u,f=((l+d)*u-2*(h-r))/g,y=(3*(h-r)-(d+2*l)*u)/p,v=l,b=r,_=e-o,w=_*_,x=w*_;return f*x+y*w+v*_+b}};Jo([m(vi)],rS.prototype,"keys");let mh=rS;var u2=Object.defineProperty,O=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&u2(e,t,o),o};const Tp=C("debugparticles");var Zn=(n=>(n[n.Billboard=0]="Billboard",n[n.Stretch=1]="Stretch",n[n.HorizontalBillboard=2]="HorizontalBillboard",n[n.VerticalBillboard=3]="VerticalBillboard",n[n.Mesh=4]="Mesh",n))(Zn||{});class ia{constructor(){a(this,"alphaKeys",[]),a(this,"colorKeys",[])}get duration(){return 1}evaluate(e,t){let s,o=0,r=null,l=0;for(let c=0;c<this.alphaKeys.length;c++){const h=this.alphaKeys[c];(h.time<e||!s)&&(s=h,o=c)}for(let c=0;c<this.colorKeys.length;c++){const h=this.colorKeys[c];(h.time<e||!r)&&(r=h,l=c)}if(r)if(l+1<this.colorKeys.length){const c=this.colorKeys[l+1],h=W.remap(e,r.time,c.time,0,1);t.r=W.lerp(r.color.r,c.color.r,h),t.g=W.lerp(r.color.g,c.color.g,h),t.b=W.lerp(r.color.b,c.color.b,h)}else t.r=r.color.r,t.g=r.color.g,t.b=r.color.b;if(s)if(o+1<this.alphaKeys.length){const c=this.alphaKeys[o+1],h=W.remap(e,s.time,c.time,0,1);t.alpha=W.lerp(s.alpha,c.alpha,h)}else t.alpha=s.alpha;return t}}O([m()],ia.prototype,"alphaKeys"),O([m()],ia.prototype,"colorKeys");var gh=(n=>(n[n.Local=0]="Local",n[n.World=1]="World",n[n.Custom=2]="Custom",n))(gh||{}),Ep=(n=>(n[n.Sphere=0]="Sphere",n[n.SphereShell=1]="SphereShell",n[n.Hemisphere=2]="Hemisphere",n[n.HemisphereShell=3]="HemisphereShell",n[n.Cone=4]="Cone",n[n.Box=5]="Box",n[n.Mesh=6]="Mesh",n[n.ConeShell=7]="ConeShell",n[n.ConeVolume=8]="ConeVolume",n[n.ConeVolumeShell=9]="ConeVolumeShell",n[n.Circle=10]="Circle",n[n.CircleEdge=11]="CircleEdge",n[n.SingleSidedEdge=12]="SingleSidedEdge",n[n.MeshRenderer=13]="MeshRenderer",n[n.SkinnedMeshRenderer=14]="SkinnedMeshRenderer",n[n.BoxShell=15]="BoxShell",n[n.BoxEdge=16]="BoxEdge",n[n.Donut=17]="Donut",n[n.Rectangle=18]="Rectangle",n[n.Sprite=19]="Sprite",n[n.SpriteRenderer=20]="SpriteRenderer",n))(Ep||{});const Jn=class ad{constructor(){a(this,"mode","Constant"),a(this,"constant"),a(this,"constantMin"),a(this,"constantMax"),a(this,"curve"),a(this,"curveMin"),a(this,"curveMax"),a(this,"curveMultiplier")}static constant(e){const t=new ad;return t.setConstant(e),t}static betweenTwoConstants(e,t){const s=new ad;return s.setMinMaxConstant(e,t),s}static curve(e,t=1){const s=new ad;return s.setCurve(e,t),s}setConstant(e){this.mode=0,this.constant=e}setMinMaxConstant(e,t){this.mode=3,this.constantMin=e,this.constantMax=t}setCurve(e,t=1){this.mode=1,this.curve=e,this.curveMultiplier=t}clone(){var e,t,s;const o=new ad;return o.mode=this.mode,o.constant=this.constant,o.constantMin=this.constantMin,o.constantMax=this.constantMax,o.curve=(e=this.curve)==null?void 0:e.clone(),o.curveMin=(t=this.curveMin)==null?void 0:t.clone(),o.curveMax=(s=this.curveMax)==null?void 0:s.clone(),o.curveMultiplier=this.curveMultiplier,o}evaluate(e,t){const s=t===void 0?Math.random():t;switch(this.mode){case 0:case"Constant":return this.constant;case 1:case"Curve":return e=W.clamp01(e),this.curve.evaluate(e)*this.curveMultiplier;case 2:case"TwoCurves":const o=e*this.curveMin.duration,r=e*this.curveMax.duration;return W.lerp(this.curveMin.evaluate(o),this.curveMax.evaluate(r),s%1)*this.curveMultiplier;case 3:case"TwoConstants":return W.lerp(this.constantMin,this.constantMax,s%1);default:this.curveMax.evaluate(e)*this.curveMultiplier;break}return 0}getMax(){switch(this.mode){case 0:case"Constant":return this.constant;case 1:case"Curve":return this.getMaxFromCurve(this.curve)*this.curveMultiplier;case 2:case"TwoCurves":return Math.max(this.getMaxFromCurve(this.curveMin),this.getMaxFromCurve(this.curveMax))*this.curveMultiplier;case 3:case"TwoConstants":return Math.max(this.constantMin,this.constantMax);default:return 0}}getMaxFromCurve(e){if(!e)return 0;let t=Number.MIN_VALUE;for(let s=0;s<e.keys.length;s++){const o=e.keys[s];o.value>t&&(t=o.value)}return t}};O([m()],Jn.prototype,"mode"),O([m()],Jn.prototype,"constant"),O([m()],Jn.prototype,"constantMin"),O([m()],Jn.prototype,"constantMax"),O([m(mh)],Jn.prototype,"curve"),O([m(mh)],Jn.prototype,"curveMin"),O([m(mh)],Jn.prototype,"curveMax"),O([m()],Jn.prototype,"curveMultiplier");let Z=Jn;var st;const er=(st=class{constructor(){a(this,"mode",0),a(this,"color"),a(this,"colorMin"),a(this,"colorMax"),a(this,"gradient"),a(this,"gradientMin"),a(this,"gradientMax")}static constant(n){const e=new st;return e.constant(n),e}static betweenTwoColors(n,e){const t=new st;return t.betweenTwoColors(n,e),t}constant(n){return this.mode=0,this.color=n,this}betweenTwoColors(n,e){return this.mode=2,this.colorMin=n,this.colorMax=e,this}evaluate(n,e){const t=e===void 0?Math.random():e;switch(this.mode){case 0:case"Color":return this.color;case 1:case"Gradient":return this.gradient.evaluate(n,st._temp),st._temp;case 2:case"TwoColors":return st._temp.lerpColors(this.colorMin,this.colorMax,t);case 3:case"TwoGradients":return this.gradientMin.evaluate(n,st._temp),this.gradientMax.evaluate(n,st._temp2),st._temp.lerp(st._temp2,t);case 4:case"RandomColor":const s=Math.random();return this.gradientMin.evaluate(n,st._temp),this.gradientMax.evaluate(n,st._temp2),st._temp.lerp(st._temp2,s)}return st._temp.set(16777215),st._temp.alpha=1,st._temp}},a(st,"_temp",new he(0,0,0,1)),a(st,"_temp2",new he(0,0,0,1)),st);O([m()],er.prototype,"mode"),O([m(he)],er.prototype,"color"),O([m(he)],er.prototype,"colorMin"),O([m(he)],er.prototype,"colorMax"),O([m(ia)],er.prototype,"gradient"),O([m(ia)],er.prototype,"gradientMin"),O([m(ia)],er.prototype,"gradientMax");let sa=er;var wy=(n=>(n[n.Hierarchy=0]="Hierarchy",n[n.Local=1]="Local",n[n.Shape=2]="Shape",n))(wy||{});class Wt{constructor(){a(this,"cullingMode"),a(this,"duration"),a(this,"emitterVelocityMode"),a(this,"flipRotation"),a(this,"gravityModifier"),a(this,"gravityModifierMultiplier"),a(this,"loop"),a(this,"maxParticles"),a(this,"playOnAwake"),a(this,"prewarm"),a(this,"ringBufferLoopRange"),a(this,"ringBufferMode"),a(this,"scalingMode"),a(this,"simulationSpace"),a(this,"simulationSpeed"),a(this,"startColor"),a(this,"startDelay"),a(this,"startDelayMultiplier"),a(this,"startLifetime"),a(this,"startLifetimeMultiplier"),a(this,"startRotation"),a(this,"startRotationMultiplier"),a(this,"startRotation3D"),a(this,"startRotationX"),a(this,"startRotationXMultiplier"),a(this,"startRotationY"),a(this,"startRotationYMultiplier"),a(this,"startRotationZ"),a(this,"startRotationZMultiplier"),a(this,"startSize"),a(this,"startSize3D"),a(this,"startSizeMultiplier"),a(this,"startSizeX"),a(this,"startSizeXMultiplier"),a(this,"startSizeY"),a(this,"startSizeYMultiplier"),a(this,"startSizeZ"),a(this,"startSizeZMultiplier"),a(this,"startSpeed"),a(this,"startSpeedMultiplier"),a(this,"stopAction"),a(this,"useUnscaledTime")}}O([m(Z)],Wt.prototype,"gravityModifier"),O([m(sa)],Wt.prototype,"startColor"),O([m(Z)],Wt.prototype,"startDelay"),O([m(Z)],Wt.prototype,"startLifetime"),O([m(Z)],Wt.prototype,"startRotation"),O([m(Z)],Wt.prototype,"startRotationX"),O([m(Z)],Wt.prototype,"startRotationY"),O([m(Z)],Wt.prototype,"startRotationZ"),O([m(Z)],Wt.prototype,"startSize"),O([m(Z)],Wt.prototype,"startSizeX"),O([m(Z)],Wt.prototype,"startSizeY"),O([m(Z)],Wt.prototype,"startSizeZ"),O([m(Z)],Wt.prototype,"startSpeed");class Ap{constructor(){a(this,"cycleCount"),a(this,"maxCount"),a(this,"minCount"),a(this,"probability"),a(this,"repeatInterval"),a(this,"time"),a(this,"count"),a(this,"_performed",0)}reset(){this._performed=0}run(e){if(e<=this.time)return 0;let t=0;if(this.cycleCount===0||this._performed<this.cycleCount){const s=this.time+this.repeatInterval*this._performed;if(e>=s&&(this._performed+=1,Math.random()<this.probability))switch(this.count.mode){case 0:t=this.count.constant;break;case 3:t=W.lerp(this.count.constantMin,this.count.constantMax,Math.random());break;case 1:t=this.count.curve.evaluate(Math.random());break;case 2:const o=Math.random();t=W.lerp(this.count.curveMin.evaluate(o),this.count.curveMax.evaluate(o),Math.random());break}}return t}}class eo{constructor(){a(this,"enabled"),a(this,"bursts"),a(this,"rateOverTime"),a(this,"rateOverTimeMultiplier"),a(this,"rateOverDistance"),a(this,"rateOverDistanceMultiplier"),a(this,"system")}get burstCount(){var e;return((e=this.bursts)==null?void 0:e.length)??0}reset(){var e;(e=this.bursts)==null||e.forEach(t=>t.reset())}getBurst(){let e=0;if(this.burstCount>0)for(let t=0;t<this.burstCount;t++){const s=this.bursts[t];this.system.main.loop&&s.time>=this.system.time&&s.reset(),e+=Math.round(s.run(this.system.time))}return e}}O([m()],eo.prototype,"enabled"),O([m()],eo.prototype,"bursts"),O([m(Z)],eo.prototype,"rateOverTime"),O([m()],eo.prototype,"rateOverTimeMultiplier"),O([m(Z)],eo.prototype,"rateOverDistance"),O([m()],eo.prototype,"rateOverDistanceMultiplier");class Ip{constructor(){a(this,"enabled"),a(this,"color")}}O([m(sa)],Ip.prototype,"color");class na{constructor(){a(this,"enabled"),a(this,"separateAxes"),a(this,"size"),a(this,"sizeMultiplier"),a(this,"x"),a(this,"xMultiplier"),a(this,"y"),a(this,"yMultiplier"),a(this,"z"),a(this,"zMultiplier"),a(this,"_time",0),a(this,"_temp",new S)}evaluate(e,t,s){if(t||(t=this._temp),!this.enabled)return t.x=t.y=t.z=1,t;if(this.separateAxes)t.x=this.x.evaluate(e,s)*this.xMultiplier,t.y=this.y.evaluate(e,s)*this.yMultiplier,t.z=this.z.evaluate(e,s)*this.zMultiplier;else{const o=this.size.evaluate(e,s)*this.sizeMultiplier;t.x=o}return t}}O([m(Z)],na.prototype,"size"),O([m(Z)],na.prototype,"x"),O([m(Z)],na.prototype,"y"),O([m(Z)],na.prototype,"z");var tr;const nt=(tr=class{constructor(){a(this,"shapeType",5),a(this,"enabled",!0),a(this,"alignToDirection",!1),a(this,"angle",0),a(this,"arc",360),a(this,"arcSpread"),a(this,"arcSpeedMultiplier"),a(this,"arcMode"),a(this,"boxThickness"),a(this,"position"),a(this,"rotation"),a(this,"_rotation",new Dt),a(this,"scale"),a(this,"radius"),a(this,"radiusThickness"),a(this,"sphericalDirectionAmount"),a(this,"randomDirectionAmount"),a(this,"randomPositionAmount"),a(this,"meshShapeType"),a(this,"meshRenderer"),a(this,"_meshObj"),a(this,"_meshGeometry"),a(this,"system"),a(this,"_space"),a(this,"_worldSpaceMatrix",new se),a(this,"_worldSpaceMatrixInverse",new se),a(this,"_vector",new S(0,0,0)),a(this,"_temp",new S(0,0,0)),a(this,"_triangle",new LP),a(this,"_dir",new S),a(this,"_loopTime",0),a(this,"_loopDirection",1),Tp&&console.log(this)}get type(){return Ep[this.shapeType]}initialize(n){this.onInitialize(n),n.position.x=this._vector.x,n.position.y=this._vector.y,n.position.z=this._vector.z}toJSON(){return this}clone(){return new tr}setMesh(n){this.meshRenderer=n,n?(this._meshObj=n.sharedMeshes[Math.floor(Math.random()*n.sharedMeshes.length)],this._meshGeometry=this._meshObj.geometry):(this._meshObj=void 0,this._meshGeometry=void 0)}update(n,e){}onUpdate(n,e,t,s){this.system=n,this._space=t,t===1&&(this._worldSpaceMatrix.copy(s.matrixWorld),this._worldSpaceMatrix.elements[0]=1,this._worldSpaceMatrix.elements[5]=1,this._worldSpaceMatrix.elements[10]=1,this._worldSpaceMatrixInverse.copy(this._worldSpaceMatrix).invert())}applyRotation(n){const e=this.rotation.x!==0||this.rotation.y!==0||this.rotation.z!==0;return e&&(this._rotation.x=W.toRadians(this.rotation.x),this._rotation.y=W.toRadians(this.rotation.y),this._rotation.z=W.toRadians(this.rotation.z),this._rotation.order="ZYX",n.applyEuler(this._rotation)),e}onInitialize(n){this._vector.set(0,0,0),n.mesh=void 0,n.mesh_geometry=void 0;const e=this._temp.copy(this.position),t=this._space===1;t&&e.applyQuaternion(this.system.worldQuaternion);let s=this.radius;if(t&&(s*=this.system.worldScale.x),this.enabled){switch(this.shapeType){case 5:Tp&&$.DrawWireBox(this.position,this.scale,14540253,1),this._vector.x=Math.random()*this.scale.x-this.scale.x/2,this._vector.y=Math.random()*this.scale.y-this.scale.y/2,this._vector.z=Math.random()*this.scale.z-this.scale.z/2,this._vector.add(e);break;case 4:this.randomConePoint(this.position,this.angle,s,this.radiusThickness,this.arc,this.arcMode,this._vector);break;case 0:this.randomSpherePoint(this.position,s,this.radiusThickness,this.arc,this._vector);break;case 10:this.randomCirclePoint(this.position,s,this.radiusThickness,this.arc,this._vector);break;case 13:const o=this.meshRenderer;o?.destroyed==!1&&this.setMesh(o);const r=n.mesh=this._meshObj,l=n.mesh_geometry=this._meshGeometry;if(r&&l)switch(this.meshShapeType){case 0:{const c=l.getAttribute("position"),h=Math.floor(Math.random()*c.count);this._vector.fromBufferAttribute(c,h),this._vector.applyMatrix4(r.matrixWorld),n.mesh_normal=h}break;case 1:break;case 2:{const c=l.index;if(c){let h=Math.random(),d=Math.random();h+d>1&&(h=1-h,d=1-d);const u=Math.floor(Math.random()*(c.count/3));let p=u*3,g=u*3+1,f=u*3+2;p=c.getX(p),g=c.getX(g),f=c.getX(f);const y=l.getAttribute("position");this._triangle.a.fromBufferAttribute(y,p),this._triangle.b.fromBufferAttribute(y,g),this._triangle.c.fromBufferAttribute(y,f),this._vector.set(0,0,0).addScaledVector(this._triangle.a,h).addScaledVector(this._triangle.b,d).addScaledVector(this._triangle.c,1-(h+d)),this._vector.applyMatrix4(r.matrixWorld),n.mesh_normal=u}}break}break;default:this._vector.set(0,0,0),F()&&!globalThis.__particlesystem_shapetype_unsupported&&(console.warn("ParticleSystem ShapeType is not supported:",Ep[this.shapeType]),globalThis.__particlesystem_shapetype_unsupported=!0);break}this.randomizePosition(this._vector,this.randomPositionAmount)}this.applyRotation(this._vector),t&&(this._vector.applyQuaternion(this.system.worldQuaternion),this._vector.add(this.system.worldPos)),Tp&&$.DrawSphere(this._vector,.03,16711680,.5,!0)}getDirection(n,e){var t;if(!this.enabled)return this._dir.set(0,0,1),this._dir;switch(this.shapeType){case 5:this._dir.set(0,0,1);break;case 4:this._dir.set(0,0,1);break;case 10:case 0:const s=e.x,o=e.y,r=e.z;this._dir.set(s,o,r),(t=this.system)!=null&&t.worldspace?this._dir.sub(this.system.worldPos):this._dir.sub(this.position);break;case 13:const l=n.mesh,c=n.mesh_geometry;if(l&&c)switch(this.meshShapeType){case 0:{const h=c.getAttribute("normal"),d=n.mesh_normal;this._dir.fromBufferAttribute(h,d)}break;case 1:break;case 2:{const h=c.index;if(h){const d=n.mesh_normal,u=h.getX(d*3),p=h.getX(d*3+1),g=h.getX(d*3+2),f=c.getAttribute("position"),y=q(),v=q(),b=q();y.fromBufferAttribute(f,u),v.fromBufferAttribute(f,p),b.fromBufferAttribute(f,g),y.sub(v),b.sub(v),y.cross(b),this._dir.copy(y).multiplyScalar(-1);const _=Se(l);this._dir.applyQuaternion(_)}}break}break;default:this._dir.set(0,0,1);break}return this._space===1&&this._dir.applyQuaternion(this.system.worldQuaternion),this.applyRotation(this._dir),this._dir.normalize(),this.spherizeDirection(this._dir,this.sphericalDirectionAmount),this.randomizeDirection(this._dir,this.randomDirectionAmount),Tp&&($.DrawSphere(e,.01,8925952,.5,!0),$.DrawDirection(e,this._dir,8925952,.5,!0)),this._dir}randomizePosition(n,e){if(e<=0)return;const t=tr._tempVec;t.set(Math.random()*2-1,Math.random()*2-1,Math.random()*2-1),t.x*=e*this.scale.x,t.y*=e*this.scale.y,t.z*=e*this.scale.z,n.add(t)}randomizeDirection(n,e){if(e===0)return;const t=tr._randomQuat,s=tr._tempVec;s.set(Math.random()-.5,Math.random()-.5,Math.random()-.5).normalize(),t.setFromAxisAngle(s,e*Math.random()*Math.PI),n.applyQuaternion(t)}spherizeDirection(n,e){if(e===0)return;const t=Math.random()*Math.PI*2,s=Math.acos(1-Math.random()*2),o=Math.sin(s)*Math.cos(t),r=Math.sin(s)*Math.sin(t),l=Math.cos(s),c=new S(o,r,l);n.lerp(c,e)}randomSpherePoint(n,e,t,s,o){const r=Math.random(),l=Math.random(),c=2*Math.PI*r*(s/360),h=Math.acos(2*l-1),d=W.lerp(1,1-Math.pow(1-Math.random(),Math.PI),t)*e,u=n.x+this.scale.x*(-d*Math.sin(h)*Math.cos(c)),p=n.y+this.scale.y*(d*Math.sin(h)*Math.sin(c)),g=n.z+this.scale.z*(d*Math.cos(h));o.x=u,o.y=p,o.z=g}randomCirclePoint(n,e,t,s,o){const r=Math.random(),l=2*Math.PI*r*(s/360),c=W.lerp(1,1-Math.pow(1-Math.random(),Math.PI),t)*e,h=n.x+this.scale.x*c*Math.cos(l),d=n.y+this.scale.y*c*Math.sin(l),u=n.z;o.x=h,o.y=d,o.z=u}randomConePoint(n,e,t,s,o,r,l){let c=0,h=0;switch(r){case 0:c=Math.random(),h=Math.random();break;case 2:this._loopTime>1&&(this._loopDirection=-1),this._loopTime<0&&(this._loopDirection=1);case 1:c=.5,h=Math.random(),this._loopTime+=this.system.deltaTime*this._loopDirection;break}let d=2*Math.PI*c*(o/360);switch(r){case 2:case 1:d+=Math.PI+.5,d+=this._loopTime*Math.PI*2,d%=W.toRadians(o);break}const u=Math.acos(2*h-1),p=W.lerp(1,1-Math.pow(1-Math.random(),Math.PI),s)*t,g=n.x+-p*Math.sin(u)*Math.cos(d),f=n.y+p*Math.sin(u)*Math.sin(d),y=n.z;l.x=g*this.scale.x,l.y=f*this.scale.y,l.z=y*this.scale.z}},a(tr,"_randomQuat",new V),a(tr,"_tempVec",new S),tr);O([m()],nt.prototype,"shapeType"),O([m()],nt.prototype,"enabled"),O([m()],nt.prototype,"alignToDirection"),O([m()],nt.prototype,"angle"),O([m()],nt.prototype,"arc"),O([m()],nt.prototype,"arcSpread"),O([m()],nt.prototype,"arcSpeedMultiplier"),O([m()],nt.prototype,"arcMode"),O([m(S)],nt.prototype,"boxThickness"),O([m(S)],nt.prototype,"position"),O([m(S)],nt.prototype,"rotation"),O([m(S)],nt.prototype,"scale"),O([m()],nt.prototype,"radius"),O([m()],nt.prototype,"radiusThickness"),O([m()],nt.prototype,"sphericalDirectionAmount"),O([m()],nt.prototype,"randomDirectionAmount"),O([m()],nt.prototype,"randomPositionAmount"),O([m()],nt.prototype,"meshShapeType"),O([m(Qc)],nt.prototype,"meshRenderer");let xy=nt;class Ce{constructor(){a(this,"damping"),a(this,"enabled"),a(this,"frequency"),a(this,"octaveCount"),a(this,"octaveMultiplier"),a(this,"octaveScale"),a(this,"positionAmount"),a(this,"quality"),a(this,"remap"),a(this,"remapEnabled"),a(this,"remapMultiplier"),a(this,"remapX"),a(this,"remapXMultiplier"),a(this,"remapY"),a(this,"remapYMultiplier"),a(this,"remapZ"),a(this,"remapZMultiplier"),a(this,"scrollSpeedMultiplier"),a(this,"separateAxes"),a(this,"strengthMultiplier"),a(this,"strengthX"),a(this,"strengthXMultiplier"),a(this,"strengthY"),a(this,"strengthYMultiplier"),a(this,"strengthZ"),a(this,"strengthZMultiplier"),a(this,"_noise"),a(this,"_time",0),a(this,"_temp",new S)}update(e){this._time+=e.time.deltaTime*this.scrollSpeedMultiplier}apply(e,t,s,o,r,l){if(!this.enabled)return;this._noise||(this._noise=bO(()=>0));const c=this._temp.set(t.x,t.y,t.z).multiplyScalar(this.frequency),h=this._noise(c.x,c.y,c.z,this._time),d=this._noise(c.x,c.y,c.z,this._time+1e3*this.frequency),u=this._noise(c.x,c.y,c.z,this._time+2e3*this.frequency);this._temp.set(h,d,u).normalize();const p=r/l;let g=this.positionAmount.evaluate(p);this.separateAxes?(this._temp.x*=g*this.strengthXMultiplier,this._temp.y*=g*this.strengthYMultiplier,this._temp.z*=g*this.strengthZMultiplier):(this.strengthX&&(g*=this.strengthX.evaluate(p)*1.5),this._temp.multiplyScalar(g)),s.x+=this._temp.x,s.y+=this._temp.y,s.z+=this._temp.z}}O([m()],Ce.prototype,"damping"),O([m()],Ce.prototype,"enabled"),O([m()],Ce.prototype,"frequency"),O([m()],Ce.prototype,"octaveCount"),O([m()],Ce.prototype,"octaveMultiplier"),O([m()],Ce.prototype,"octaveScale"),O([m(Z)],Ce.prototype,"positionAmount"),O([m()],Ce.prototype,"quality"),O([m(Z)],Ce.prototype,"remap"),O([m()],Ce.prototype,"remapEnabled"),O([m()],Ce.prototype,"remapMultiplier"),O([m(Z)],Ce.prototype,"remapX"),O([m()],Ce.prototype,"remapXMultiplier"),O([m(Z)],Ce.prototype,"remapY"),O([m()],Ce.prototype,"remapYMultiplier"),O([m(Z)],Ce.prototype,"remapZ"),O([m()],Ce.prototype,"remapZMultiplier"),O([m()],Ce.prototype,"scrollSpeedMultiplier"),O([m()],Ce.prototype,"separateAxes"),O([m()],Ce.prototype,"strengthMultiplier"),O([m(Z)],Ce.prototype,"strengthX"),O([m()],Ce.prototype,"strengthXMultiplier"),O([m(Z)],Ce.prototype,"strengthY"),O([m()],Ce.prototype,"strengthYMultiplier"),O([m(Z)],Ce.prototype,"strengthZ"),O([m()],Ce.prototype,"strengthZMultiplier");class We{constructor(){a(this,"enabled"),a(this,"attachRibbonToTransform",!1),a(this,"colorOverLifetime"),a(this,"colorOverTrail"),a(this,"dieWithParticles",!0),a(this,"inheritParticleColor",!0),a(this,"lifetime"),a(this,"lifetimeMultiplier"),a(this,"minVertexDistance",.2),a(this,"mode",0),a(this,"ratio",1),a(this,"ribbonCount",1),a(this,"shadowBias",0),a(this,"sizeAffectsLifetime",!1),a(this,"sizeAffectsWidth",!1),a(this,"splitSubEmitterRibbons",!1),a(this,"textureMode",0),a(this,"widthOverTrail"),a(this,"widthOverTrailMultiplier"),a(this,"worldSpace",!1)}getWidth(e,t,s,o){const r=this.widthOverTrail.evaluate(s,o);return e*=r,e}getColor(e,t,s){const o=this.colorOverTrail.evaluate(s),r=this.colorOverLifetime.evaluate(t);e.x*=o.r*r.r,e.y*=o.g*r.g,e.z*=o.b*r.b,"alpha"in o&&"alpha"in r&&(e.w*=o.alpha*r.alpha)}}O([m()],We.prototype,"enabled"),O([m()],We.prototype,"attachRibbonToTransform"),O([m(sa)],We.prototype,"colorOverLifetime"),O([m(sa)],We.prototype,"colorOverTrail"),O([m()],We.prototype,"dieWithParticles"),O([m()],We.prototype,"inheritParticleColor"),O([m(Z)],We.prototype,"lifetime"),O([m()],We.prototype,"lifetimeMultiplier"),O([m()],We.prototype,"minVertexDistance"),O([m()],We.prototype,"mode"),O([m()],We.prototype,"ratio"),O([m()],We.prototype,"ribbonCount"),O([m()],We.prototype,"shadowBias"),O([m()],We.prototype,"sizeAffectsLifetime"),O([m()],We.prototype,"sizeAffectsWidth"),O([m()],We.prototype,"splitSubEmitterRibbons"),O([m()],We.prototype,"textureMode"),O([m(Z)],We.prototype,"widthOverTrail"),O([m()],We.prototype,"widthOverTrailMultiplier"),O([m()],We.prototype,"worldSpace");class qe{constructor(){a(this,"enabled"),a(this,"space",0),a(this,"orbitalX"),a(this,"orbitalY"),a(this,"orbitalZ"),a(this,"orbitalXMultiplier"),a(this,"orbitalYMultiplier"),a(this,"orbitalZMultiplier"),a(this,"orbitalOffsetX"),a(this,"orbitalOffsetY"),a(this,"orbitalOffsetZ"),a(this,"speedModifier"),a(this,"speedModifierMultiplier"),a(this,"x"),a(this,"xMultiplier"),a(this,"y"),a(this,"yMultiplier"),a(this,"z"),a(this,"zMultiplier"),a(this,"_system"),a(this,"_temp",new S),a(this,"_temp2",new S),a(this,"_temp3",new S),a(this,"_hasOrbital",!1),a(this,"_index",0),a(this,"_orbitalMatrix",new se)}update(e){this._system=e}init(e){this._index==0&&(e.debug=!0),this._index+=1,e.orbitx=this.orbitalX.evaluate(Math.random()),e.orbity=this.orbitalY.evaluate(Math.random()),e.orbitz=this.orbitalZ.evaluate(Math.random()),this._hasOrbital=e.orbitx!=0||e.orbity!=0||e.orbitz!=0}apply(e,t,s,o,r,l,c){var h;if(!this.enabled)return;const d=l/c,u=this.speedModifier.evaluate(d)*this.speedModifierMultiplier,p=this.x.evaluate(d),g=this.y.evaluate(d),f=this.z.evaluate(d);if(this._temp.set(-p,g,f),this._system&&this._system.main.simulationSpace===1&&this._temp.applyQuaternion(this._system.worldQuaternion),this._hasOrbital&&((h=this._system)==null?void 0:h.worldPos)){const y=this._temp2.set(s.x,s.y,s.z),v=this.orbitalXMultiplier,b=this.orbitalYMultiplier,_=this.orbitalZMultiplier,w=u*Math.PI*2*10,x=Math.cos(w*v),k=Math.sin(w*v),M=Math.cos(w*b),T=Math.sin(w*b),L=Math.cos(w*_),D=Math.sin(w*_),z=y.x*(M*L)+y.y*(M*D)+y.z*-T,j=y.x*(k*T*L-x*D)+y.y*(k*T*D+x*L)+y.z*(k*M),H=y.x*(x*T*L+k*D)+y.y*(x*T*D-k*L)+y.z*(x*M),K=this._temp3.set(y.x-z,y.y-j,y.z-H);K.normalize(),K.multiplyScalar(.2/r*Math.max(this.orbitalXMultiplier,this.orbitalYMultiplier,this.orbitalZMultiplier)),o.x+=K.x,o.y+=K.y,o.z+=K.z}o.x+=this._temp.x,o.y+=this._temp.y,o.z+=this._temp.z,o.x*=u,o.y*=u,o.z*=u}}O([m()],qe.prototype,"enabled"),O([m()],qe.prototype,"space"),O([m(Z)],qe.prototype,"orbitalX"),O([m(Z)],qe.prototype,"orbitalY"),O([m(Z)],qe.prototype,"orbitalZ"),O([m()],qe.prototype,"orbitalXMultiplier"),O([m()],qe.prototype,"orbitalYMultiplier"),O([m()],qe.prototype,"orbitalZMultiplier"),O([m()],qe.prototype,"orbitalOffsetX"),O([m()],qe.prototype,"orbitalOffsetY"),O([m()],qe.prototype,"orbitalOffsetZ"),O([m(Z)],qe.prototype,"speedModifier"),O([m()],qe.prototype,"speedModifierMultiplier"),O([m(Z)],qe.prototype,"x"),O([m()],qe.prototype,"xMultiplier"),O([m(Z)],qe.prototype,"y"),O([m()],qe.prototype,"yMultiplier"),O([m(Z)],qe.prototype,"z"),O([m()],qe.prototype,"zMultiplier");class Vt{constructor(){a(this,"animation"),a(this,"enabled"),a(this,"cycleCount"),a(this,"frameOverTime"),a(this,"frameOverTimeMultiplier"),a(this,"numTilesX"),a(this,"numTilesY"),a(this,"startFrame"),a(this,"startFrameMultiplier"),a(this,"rowMode"),a(this,"rowIndex"),a(this,"spriteCount"),a(this,"timeMode")}sampleOnceAtStart(){if(this.timeMode===0)switch(this.frameOverTime.mode){case 0:case 3:case 2:case 1:return!0}return!1}getStartIndex(){return this.sampleOnceAtStart()?Math.random()*(this.numTilesX*this.numTilesY):0}evaluate(e){if(!this.sampleOnceAtStart())return this.getIndex(e)}getIndex(e){const t=this.numTilesX*this.numTilesY;e=e*this.cycleCount;let s=this.frameOverTime.evaluate(e%1);return s*=this.frameOverTimeMultiplier,s*=t,s=s%t,s=Math.floor(s),s}}O([m()],Vt.prototype,"animation"),O([m()],Vt.prototype,"enabled"),O([m()],Vt.prototype,"cycleCount"),O([m(Z)],Vt.prototype,"frameOverTime"),O([m()],Vt.prototype,"frameOverTimeMultiplier"),O([m()],Vt.prototype,"numTilesX"),O([m()],Vt.prototype,"numTilesY"),O([m(Z)],Vt.prototype,"startFrame"),O([m()],Vt.prototype,"startFrameMultiplier"),O([m()],Vt.prototype,"rowMode"),O([m()],Vt.prototype,"rowIndex"),O([m()],Vt.prototype,"spriteCount"),O([m()],Vt.prototype,"timeMode");class Es{constructor(){a(this,"enabled"),a(this,"separateAxes"),a(this,"x"),a(this,"xMultiplier"),a(this,"y"),a(this,"yMultiplier"),a(this,"z"),a(this,"zMultiplier")}evaluate(e,t){return this.enabled?this.separateAxes?0:this.z.evaluate(e,t)*-1:0}}O([m()],Es.prototype,"enabled"),O([m()],Es.prototype,"separateAxes"),O([m(Z)],Es.prototype,"x"),O([m()],Es.prototype,"xMultiplier"),O([m(Z)],Es.prototype,"y"),O([m()],Es.prototype,"yMultiplier"),O([m(Z)],Es.prototype,"z"),O([m()],Es.prototype,"zMultiplier");class hs{constructor(){a(this,"enabled"),a(this,"range"),a(this,"separateAxes"),a(this,"x"),a(this,"xMultiplier"),a(this,"y"),a(this,"yMultiplier"),a(this,"z"),a(this,"zMultiplier")}evaluate(e,t){if(!this.enabled)return 0;if(!this.separateAxes){const s=W.lerp(this.range.x,this.range.y,t);return this.z.evaluate(s)*-1}return 0}}O([m()],hs.prototype,"enabled"),O([m()],hs.prototype,"range"),O([m()],hs.prototype,"separateAxes"),O([m(Z)],hs.prototype,"x"),O([m()],hs.prototype,"xMultiplier"),O([m(Z)],hs.prototype,"y"),O([m()],hs.prototype,"yMultiplier"),O([m(Z)],hs.prototype,"z"),O([m()],hs.prototype,"zMultiplier");class gt{constructor(){a(this,"enabled"),a(this,"dampen"),a(this,"drag"),a(this,"dragMultiplier"),a(this,"limit"),a(this,"limitMultiplier"),a(this,"separateAxes"),a(this,"limitX"),a(this,"limitXMultiplier"),a(this,"limitY"),a(this,"limitYMultiplier"),a(this,"limitZ"),a(this,"limitZMultiplier"),a(this,"multiplyDragByParticleSize",!1),a(this,"multiplyDragByParticleVelocity",!1),a(this,"space"),a(this,"_temp",new S),a(this,"_temp2",new S)}apply(e,t,s,o,r,l,c){if(this.enabled){const h=this.limit.evaluate(r)*this.limitMultiplier;if(t.length()>h){this._temp.copy(t).normalize().multiplyScalar(h);const d=this.dampen*.5;t.x=W.lerp(t.x,this._temp.x,d),t.y=W.lerp(t.y,this._temp.y,d),t.z=W.lerp(t.z,this._temp.z,d),s.x=W.lerp(s.x,this._temp.x,d),s.y=W.lerp(s.y,this._temp.y,d),s.z=W.lerp(s.z,this._temp.z,d)}}}}O([m()],gt.prototype,"enabled"),O([m()],gt.prototype,"dampen"),O([m(Z)],gt.prototype,"drag"),O([m()],gt.prototype,"dragMultiplier"),O([m(Z)],gt.prototype,"limit"),O([m()],gt.prototype,"limitMultiplier"),O([m()],gt.prototype,"separateAxes"),O([m(Z)],gt.prototype,"limitX"),O([m()],gt.prototype,"limitXMultiplier"),O([m(Z)],gt.prototype,"limitY"),O([m()],gt.prototype,"limitYMultiplier"),O([m(Z)],gt.prototype,"limitZ"),O([m()],gt.prototype,"limitZMultiplier"),O([m()],gt.prototype,"multiplyDragByParticleSize"),O([m()],gt.prototype,"multiplyDragByParticleVelocity"),O([m()],gt.prototype,"space");const fh=class MC{constructor(){a(this,"enabled"),a(this,"curve"),a(this,"curveMultiplier"),a(this,"mode"),a(this,"system"),a(this,"_temp",new S),a(this,"_firstUpdate",!0),a(this,"_frames",0)}clone(){var e;const t=new MC;return t.enabled=this.enabled,t.curve=(e=this.curve)==null?void 0:e.clone(),t.curveMultiplier=this.curveMultiplier,t.mode=this.mode,t}get _lastWorldPosition(){return this.system._iv_lastWorldPosition||(this.system._iv_lastWorldPosition=new S),this.system._iv_lastWorldPosition}get _velocity(){return this.system._iv_velocity||(this.system._iv_velocity=new S),this.system._iv_velocity}awake(e){this.system=e,this.reset()}reset(){this._firstUpdate=!0}update(e){this.enabled&&this.system.worldspace!==!1&&(this._firstUpdate?(this._firstUpdate=!1,this._velocity.set(0,0,0),this._lastWorldPosition.copy(this.system.worldPos)):this._lastWorldPosition&&(this._velocity.copy(this.system.worldPos).sub(this._lastWorldPosition).multiplyScalar(1/this.system.deltaTime),this._lastWorldPosition.copy(this.system.worldPos)))}applyInitial(e){if(this.enabled&&this.system.worldspace!==!1&&this.mode===0){const t=this.curve.evaluate(Math.random(),Math.random());this._temp.copy(this._velocity).multiplyScalar(t),e.x+=this._temp.x,e.y+=this._temp.y,e.z+=this._temp.z}}applyCurrent(e,t,s){if(this.enabled&&this.system&&this.system.worldspace!==!1&&this.mode===1){const o=this.curve.evaluate(t,s);this._temp.copy(this._velocity).multiplyScalar(o),e.x+=this._temp.x,e.y+=this._temp.y,e.z+=this._temp.z}}};O([m()],fh.prototype,"enabled"),O([m(Z)],fh.prototype,"curve"),O([m()],fh.prototype,"curveMultiplier"),O([m()],fh.prototype,"mode");let Sy=fh;class bi{constructor(){a(this,"enabled"),a(this,"range"),a(this,"separateAxes"),a(this,"size"),a(this,"sizeMultiplier"),a(this,"x"),a(this,"xMultiplier"),a(this,"y"),a(this,"yMultiplier"),a(this,"z"),a(this,"zMultiplier")}evaluate(e,t,s,o){const r=e.length(),l=W.remap(r,this.range.x,this.range.y,0,1),c=this.size.evaluate(l,s);return o.x*=c,o.y*=c,o.z*=c,o}}O([m()],bi.prototype,"enabled"),O([m(re)],bi.prototype,"range"),O([m()],bi.prototype,"separateAxes"),O([m(Z)],bi.prototype,"size"),O([m()],bi.prototype,"sizeMultiplier"),O([m(Z)],bi.prototype,"x"),O([m()],bi.prototype,"xMultiplier"),O([m(Z)],bi.prototype,"y"),O([m()],bi.prototype,"yMultiplier"),O([m(Z)],bi.prototype,"z"),O([m()],bi.prototype,"zMultiplier");class Cl{constructor(){a(this,"enabled"),a(this,"range"),a(this,"color")}evaluate(e,t,s){const o=e.length(),r=W.remap(o,this.range.x,this.range.y,0,1),l=this.color.evaluate(r,t);s.x*=l.r,s.y*=l.g,s.z*=l.b,"alpha"in l&&(s.w*=l.alpha)}}O([m()],Cl.prototype,"enabled"),O([m(re)],Cl.prototype,"range"),O([m(sa)],Cl.prototype,"color"),new S(1,1,1),new S(0,0,1);class Cy{constructor(e,t,s,o){a(this,"type","NeedleParticleSubEmitter"),a(this,"emitterType"),a(this,"emitterProbability"),a(this,"q_",new V),a(this,"v_",new S),a(this,"v2_",new S),a(this,"_emitterMatrix",new Hm),a(this,"_circularBuffer"),this.system=e,this.particleSystem=t,this.subSystem=s,this.subParticleSystem=o,this.subParticleSystem&&this.subParticleSystem&&(this.subParticleSystem.onlyUsedByOther=!0);const r=1e3;this._circularBuffer=new Oi(()=>new Hm,r)}clone(){throw new Error("Method not implemented.")}initialize(e){e.emissionState={burstIndex:0,burstWaveIndex:0,time:0,waitEmiting:0},this._emitterMatrix.copy(this.subSystem.matrixWorld).invert().premultiply(this.system.matrixWorld),this._emitterMatrix.setPosition(0,0,0),this.emitterType===Py.Birth&&this.run(e)}update(e,t){this.run(e)}frameUpdate(e){}toJSON(){}reset(){}run(e){if(this.subSystem.currentParticles>=this.subSystem.main.maxParticles||!this.subParticleSystem||!e.emissionState||this.emitterProbability&&Math.random()>this.emitterProbability)return;const t=this.system.deltaTime;if(this.emitterType===Py.Death){let o=e.life;if(e[Pl]!==void 0&&(o=e[Pl]),!(e.age+t*1.2>=o))return;const r=this.subSystem.main.maxParticles-this.subSystem.currentParticles;e.emissionState.waitEmiting=r}const s=new Hm;s.set(1,0,0,e.position.x,0,1,0,e.position.y,0,0,1,e.position.z,0,0,0,1),this.particleSystem.worldSpace||s.multiplyMatrices(this._emitterMatrix,s),this.subParticleSystem.emit(t,e.emissionState,s)}}var p2=Object.defineProperty,Ve=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&p2(e,t,o),o};const ir=C("debugparticles"),m2=C("noprogressive"),g2=C("debugprogressive");var Py=(n=>(n[n.Birth=0]="Birth",n[n.Collision=1]="Collision",n[n.Death=2]="Death",n[n.Trigger=3]="Trigger",n[n.Manual=4]="Manual",n))(Py||{});class ds extends I{constructor(){super(...arguments),a(this,"renderMode"),a(this,"particleMaterial"),a(this,"trailMaterial"),a(this,"particleMesh"),a(this,"maxParticleSize"),a(this,"minParticleSize"),a(this,"velocityScale"),a(this,"cameraVelocityScale"),a(this,"lengthScale")}start(){if(this.maxParticleSize!==.5&&this.minParticleSize!==0&&F()){const e=`ParticleSystem "${this.name}" has non-default min/max particle size. This may not render correctly. Please set min size to 0 and the max size to 0.5 and use the "StartSize" setting instead`;console.warn(e)}}get transparent(){var e;return((e=this.particleMaterial)==null?void 0:e.transparent)??!1}getMaterial(e=!1){let t=e===!0&&this.trailMaterial?this.trailMaterial:this.particleMaterial;if(t){if(t.type==="MeshStandardMaterial"){ir&&console.debug("ParticleSystemRenderer.getMaterial: MeshStandardMaterial detected, converting to MeshBasicMaterial. See https://github.com/Alchemist0823/three.quarks/issues/101"),"map"in t&&t.map&&(t.map.colorSpace=On,t.map.premultiplyAlpha=!1);const s=new Me;s.copy(t),e?this.trailMaterial=s:this.particleMaterial=s}t.map&&(t.map.colorSpace=On,t.map.premultiplyAlpha=!1),e&&t.side===fo&&(t=t.clone(),t.side=wd,e?this.trailMaterial=t:this.particleMaterial=t)}return t&&!m2&&t._didRequestTextureLOD===void 0&&(t._didRequestTextureLOD=0,g2&&console.log("Load material LOD",t.name),Xe.assignTextureLOD(t,0)),t}getMesh(e){let t=null;if(!t&&(this.particleMesh instanceof G&&(t=this.particleMesh.geometry),t===null)){t=new Ns(1,1);const s=t.attributes.uv;for(let o=0;o<s.count;o++)s.setX(o,1-s.getX(o))}return new G(t,this.getMaterial())}}Ve([m()],ds.prototype,"renderMode"),Ve([m(Pe)],ds.prototype,"particleMaterial"),Ve([m(Pe)],ds.prototype,"trailMaterial"),Ve([m()],ds.prototype,"maxParticleSize"),Ve([m()],ds.prototype,"minParticleSize"),Ve([m()],ds.prototype,"velocityScale"),Ve([m()],ds.prototype,"cameraVelocityScale"),Ve([m()],ds.prototype,"lengthScale");class Lp{constructor(e,t=1){a(this,"_curve"),a(this,"_factor"),a(this,"type","function"),this._curve=e,this._factor=t}startGen(e){}genValue(e,t){return this._curve.evaluate(t,Math.random())*this._factor}toJSON(){throw new Error("Method not implemented.")}clone(){throw new Error("Method not implemented.")}}class Oy{constructor(e){a(this,"type","value"),a(this,"system"),this.system=e}toJSON(){throw new Error("Method not implemented.")}clone(){throw new Error("Method not implemented.")}startGen(e){}}class f2 extends Oy{genValue(){return this.system.textureSheetAnimation.getStartIndex()}}class y2 extends Oy{constructor(){super(...arguments),a(this,"_lastPosition",new S),a(this,"_lastDistance",0)}update(){const e=ee(this.system.gameObject);this._lastDistance=this._lastPosition.distanceTo(e),this._lastPosition.copy(e)}genValue(){if(!this.system.isPlaying||!this.system.emission.enabled||this.system.currentParticles>=this.system.maxParticles)return 0;let e=this.system.emission.rateOverTime.evaluate(this.system.time/this.system.duration,Math.random());if(this.system.deltaTime>0){const o=this.system.emission.rateOverDistance.evaluate(this.system.time/this.system.duration,Math.random());let r=this._lastDistance/this.system.deltaTime*o;Number.isFinite(r)||(r=0),e+=r}const t=this.system.emission.getBurst();t>0&&(e+=t/this.system.deltaTime);const s=this.system.maxParticles-this.system.currentParticles;return W.clamp(e,0,s/this.system.deltaTime)}}class v2 extends Oy{genValue(){return this.system.isPlaying,0}}class sr{constructor(e){a(this,"system"),a(this,"type"),this.type=Object.getPrototypeOf(this).constructor.name||"ParticleSystemBaseBehaviour",e&&(this.system=e)}get context(){return this.system.context}initialize(e){}update(e,t){}frameUpdate(e){}toJSON(){throw new Error("Method not implemented.")}clone(){throw new Error("Method not implemented.")}reset(){}}class b2 extends sr{constructor(){super(...arguments),a(this,"type","NeedleTextureSheet")}update(e,t){const s=this.system.textureSheetAnimation;if(s.enabled){const o=e.age/e.life,r=s.evaluate(o);r!==void 0&&(e.uvTile=r)}}}const aS=Symbol("particleRotation");class _2 extends sr{constructor(){super(...arguments),a(this,"type","NeedleRotation")}initialize(e){e[aS]=Math.random()}update(e,t){if(e.rotation===void 0)return;const s=e.age/e.life;if(typeof e.rotation=="number"&&(this.system.rotationOverLifetime.enabled?e.rotation+=this.system.rotationOverLifetime.evaluate(s,e[aS])*t:this.system.renderer.renderMode===Zn.Billboard&&(e.rotation=Math.PI),this.system.rotationBySpeed.enabled)){const o=e.velocity.length();e.rotation+=this.system.rotationBySpeed.evaluate(s,o)*t}}}const lS=Symbol("sizeLerpFactor"),w2=new S;class x2 extends sr{constructor(){super(...arguments),a(this,"type","NeedleSize"),a(this,"_minSize",0),a(this,"_maxSize",1)}initialize(e){e[lS]=Math.random(),this._minSize=this.system.renderer.minParticleSize,this._maxSize=this.system.renderer.maxParticleSize}update(e,t){const s=e.age/e.life;let o=1;this.system.sizeOverLifetime.enabled&&(o*=this.system.sizeOverLifetime.evaluate(s,void 0,e[lS]).x);let r=1;this.system.renderer.renderMode!==Zn.Mesh&&(r=this.system.worldScale.x/this.system.cameraScale);const l=q(e.startSize).multiplyScalar(o*r);if(e.size.set(l.x,l.y,l.z),this.system.localspace){const c=pS(this.system,w2);e.size.x*=c.x,e.size.y*=c.y,e.size.z*=c.z}}}const Pl=Symbol("particleLife"),ky=Symbol("trailLifetime"),cS=Symbol("trailStartLength"),My=Symbol("trailWidthRandom");class S2 extends sr{constructor(){super(...arguments),a(this,"type","NeedleTrail")}initialize(e){e instanceof Zv&&(e[Pl]=e.life,this.system.trails.enabled&&this.system.trails.dieWithParticles===!1&&(e[ky]=this.system.trails.lifetime.evaluate(Math.random(),Math.random()),e.life+=e[ky]),e[cS]=e.length,e[My]=Math.random())}update(e){var t;if((t=this.system.trails)!=null&&t.enabled&&e instanceof Zv){const s=e,o=e.age/e[Pl],r=e.previous.values(),l=e.previous.length;for(let c=0;c<l;c++){const h=r.next().value,d=1-c/(l-1),u=e.size;if(u.x<=0&&!this.system.trails.sizeAffectsWidth){const p=20*this.system.trails.widthOverTrail.evaluate(.5,s[My]);u.x=p,u.y=p,u.z=p}h.size=this.system.trails.getWidth(u.x,o,d,s[My]),h.color.copy(e.color),this.system.trails.getColor(h.color,o,d)}if(e.age>e[Pl]){e.velocity.set(0,0,0);const c=(e.age-e[Pl])/e[ky];s.length=W.lerp(e[cS],0,c)}}}}const jp=Symbol("startVelocity"),hS=Symbol("gravityModifier"),Ry=Symbol("gravitySpeed"),Dp=Symbol("velocity lerp factor"),Ty=new S;class C2 extends sr{constructor(){super(...arguments),a(this,"type","NeedleVelocity"),a(this,"_gravityDirection",new S)}initialize(e){var t,s;const o=this.system.main.simulationSpeed;e.startSpeed=this.system.main.startSpeed.evaluate(Math.random(),Math.random());const r=this.system.shape.getDirection(e,e.position);e.velocity.x=r.x*e.startSpeed,e.velocity.y=r.y*e.startSpeed,e.velocity.z=r.z*e.startSpeed,(t=this.system.inheritVelocity)!=null&&t.enabled&&this.system.inheritVelocity.applyInitial(e.velocity),e[jp]?e[jp].copy(e.velocity):e[jp]=e.velocity.clone();const l=this.system.main.gravityModifier.evaluate(Math.random(),Math.random());e[hS]=l*o,e[Ry]=l*o*.5,e[Dp]=Math.random(),(s=this.system.velocityOverLifetime)==null||s.init(e),this._gravityDirection.set(0,-1,0),this.system.main.simulationSpace===gh.Local&&this._gravityDirection.applyQuaternion(this.system.worldQuaternionInverted).normalize()}update(e,t){var s;const o=e[jp],r=e[hS];if(r!==0){const g=r*e[Ry];Ty.copy(this._gravityDirection).multiplyScalar(g),e[Ry]+=t*.05,o.add(Ty)}e.velocity.copy(o);const l=e.age/e.life;(s=this.system.inheritVelocity)!=null&&s.enabled&&this.system.inheritVelocity.applyCurrent(e.velocity,l,e[Dp]);const c=this.system.noise;c.enabled&&c.apply(0,e.position,e.velocity,t,e.age,e.life);const h=this.system.sizeBySpeed;h!=null&&h.enabled&&(e.size=h.evaluate(e.velocity,l,e[Dp],e.size));const d=this.system.colorBySpeed;d!=null&&d.enabled&&d.evaluate(e.velocity,e[Dp],e.color);const u=this.system.velocityOverLifetime;u.enabled&&u.apply(e,0,e.position,e.velocity,t,e.age,e.life);const p=this.system.limitVelocityOverLifetime;if(p.enabled&&p.apply(e.position,o,e.velocity,e.size,l,t,1),this.system.worldspace){const g=this.system.worldScale;e.velocity.x*=g.x,e.velocity.y*=g.y,e.velocity.z*=g.z}}}const dS=Symbol("colorLerpFactor"),uS=new he(1,1,1,1),oa=new he(1,1,1,1);class P2 extends sr{constructor(){super(...arguments),a(this,"type","NeedleColor")}initialize(e){}_init(e){const t=this.system.renderer.particleMaterial;oa.copy(this.system.main.startColor.evaluate(Math.random())),t!=null&&t.color&&(uS.copy(t.color),oa.multiply(uS)),oa.convertLinearToSRGB(),e.startColor.set(oa.r,oa.g,oa.b,oa.alpha),e.color.copy(e.startColor),e[dS]=Math.random()}update(e,t){if(e.age===0&&this._init(e),this.system.colorOverLifetime.enabled){const s=e.age/e.life,o=this.system.colorOverLifetime.color.evaluate(s,e[dS]);e.color.set(o.r,o.g,o.b,"alpha"in o?o.alpha:1).multiply(e.startColor)}else e.color.copy(e.startColor)}}class O2{constructor(e){a(this,"system"),a(this,"emission"),a(this,"autoDestroy"),a(this,"startLength"),a(this,"emissionBursts"),a(this,"onlyUsedByOther"),a(this,"behaviors",[]),a(this,"rendererEmitterSettings",{startLength:new CO(220),followLocalOrigin:!1}),a(this,"flatWhiteTexture"),a(this,"clonedTexture",{original:void 0,clone:void 0}),this.system=e,this.emission=new y2(this.system)}get anim(){return this.system.textureSheetAnimation}get prewarm(){return!1}get material(){return this.system.renderer.getMaterial(this.system.trails.enabled)}get layers(){return this.system.gameObject.layers}update(){this.emission.update()}get looping(){return this.system.main.loop}get duration(){return this.system.duration}get shape(){return this.system.shape}get startLife(){return new Lp(this.system.main.startLifetime)}get startSpeed(){return new Lp(this.system.main.startSpeed)}get startRotation(){return new Lp(this.system.main.startRotation)}get startSize(){return new Lp(this.system.main.startSize)}get startColor(){return new xO(new SO(1,1,1,1))}get emissionOverTime(){return this.emission}get emissionOverDistance(){return new v2(this.system)}get instancingGeometry(){return this.system.renderer.getMesh(this.system.renderer.renderMode).geometry}get renderMode(){if(this.system.trails.enabled===!0)return Tn.Trail;switch(this.system.renderer.renderMode){case Zn.Billboard:return Tn.BillBoard;case Zn.Stretch:return Tn.StretchedBillBoard;case Zn.HorizontalBillboard:return Tn.HorizontalBillBoard;case Zn.VerticalBillboard:return Tn.VerticalBillBoard;case Zn.Mesh:return Tn.Mesh}return Tn.BillBoard}get speedFactor(){var e;let t=this.system.main.simulationSpeed;return((e=this.system.renderer)==null?void 0:e.renderMode)===Zn.Stretch&&(t*=this.system.renderer.velocityScale??1),t}get texture(){const e=this.material;if(e&&e.map){const t=e.map;if(this.clonedTexture.original!==t||!this.clonedTexture.clone){const s=t.clone();s.premultiplyAlpha=!1,s.colorSpace=On,this.clonedTexture.original=t,this.clonedTexture.clone=s}return this.clonedTexture.clone}return this.flatWhiteTexture||(this.flatWhiteTexture=Sf(new he(1,1,1,1),1)),this.flatWhiteTexture}get startTileIndex(){return new f2(this.system)}get uTileCount(){var e;return this.anim.enabled?(e=this.anim)==null?void 0:e.numTilesX:void 0}get vTileCount(){var e;return this.anim.enabled?(e=this.anim)==null?void 0:e.numTilesY:void 0}get renderOrder(){return 1}get blending(){var e;return((e=this.system.renderer.particleMaterial)==null?void 0:e.blending)??jP}get transparent(){return this.system.renderer.transparent}get worldSpace(){return this.system.main.simulationSpace===gh.World}}class k2{constructor(){a(this,"burstParticleIndex",0),a(this,"burstParticleCount",0),a(this,"isBursting",!1),a(this,"travelDistance",0),a(this,"previousWorldPos"),a(this,"burstIndex",0),a(this,"burstWaveIndex",0),a(this,"time",0),a(this,"waitEmiting",0)}}const $t=class Cm extends I{constructor(){super(...arguments),a(this,"_state"),a(this,"colorOverLifetime"),a(this,"main"),a(this,"emission"),a(this,"sizeOverLifetime"),a(this,"shape"),a(this,"noise"),a(this,"trails"),a(this,"velocityOverLifetime"),a(this,"limitVelocityOverLifetime"),a(this,"inheritVelocity"),a(this,"colorBySpeed"),a(this,"textureSheetAnimation"),a(this,"rotationOverLifetime"),a(this,"rotationBySpeed"),a(this,"sizeBySpeed"),a(this,"_cameraScale",1),a(this,"__worldQuaternion",new V),a(this,"_worldQuaternionInverted",new V),a(this,"_worldScale",new S),a(this,"_worldPositionFrame",-1),a(this,"_worldPos",new S),a(this,"_renderer"),a(this,"_batchSystem"),a(this,"_particleSystem"),a(this,"_interface"),a(this,"_container"),a(this,"_time",0),a(this,"_isPlaying",!0),a(this,"_isUsedAsSubsystem",!1),a(this,"_didPreWarm",!1),a(this,"_bursts"),a(this,"_subEmitterSystems"),a(this,"_lastBatchesCount",-1)}play(e=!1){var t;e&&P.foreachComponent(this.gameObject,s=>{s instanceof Cm&&s!==this&&s.play(!1)},!0),this._isPlaying=!0,this._particleSystem&&(this._particleSystem.emissionState.time=0,this._particleSystem.emitEnded=!1),(t=this.emission)==null||t.reset()}pause(e=!0){e&&P.foreachComponent(this.gameObject,t=>{t instanceof Cm&&t!==this&&t.pause(!1)},!0),this._isPlaying=!1}stop(e=!0,t=!1){e&&P.foreachComponent(this.gameObject,s=>{s instanceof Cm&&s!==this&&s.stop(!1,t)},!0),this._isPlaying=!1,this._time=0,t&&this.reset()}reset(){var e;this._time=0,this._particleSystem&&(this._particleSystem.particleNum=0,this._particleSystem.emissionState.time=0,this._particleSystem.emitEnded=!1,(e=this.emission)==null||e.reset())}emit(e){if(this._particleSystem){this.onUpdate(),e=Math.min(e,this.maxParticles-this.currentParticles),this._state||(this._state=new k2),this._state.waitEmiting=e,this._state.time=0;const t=this._particleSystem.emitEnded;this._particleSystem.emitEnded=!1,this._particleSystem.emit(this.deltaTime,this._state,this._particleSystem.emitter.matrixWorld),this._particleSystem.emitEnded=t}}get playOnAwake(){return this.main.playOnAwake}set playOnAwake(e){this.main.playOnAwake=e}get renderer(){return this._renderer}get isPlaying(){return this._isPlaying}get currentParticles(){var e;return((e=this._particleSystem)==null?void 0:e.particleNum)??0}get maxParticles(){return this.main.maxParticles}get time(){return this._time}get duration(){return this.main.duration}get deltaTime(){return this.context.time.deltaTime*this.main.simulationSpeed}get scale(){return this.gameObject.scale.x}get cameraScale(){return this._cameraScale}get container(){return this._container}get worldspace(){return this.main.simulationSpace===gh.World}get localspace(){return this.main.simulationSpace===gh.Local}get worldQuaternion(){return this.__worldQuaternion}get worldQuaternionInverted(){return this._worldQuaternionInverted}get worldScale(){return this._worldScale}get worldPos(){return this._worldPositionFrame!==this.context.time.frame&&(this._worldPositionFrame=this.context.time.frame,ee(this.gameObject,this._worldPos)),this._worldPos}get matrixWorld(){return this._container.matrixWorld}get isSubsystem(){return this._isUsedAsSubsystem}addBehaviour(e){return this._particleSystem?(e instanceof sr&&(e.system=this),ir&&console.debug("Add custom ParticleSystem Behaviour",e),this._particleSystem.addBehavior(e),!0):!1}removeBehaviour(e){if(!this._particleSystem)return!1;const t=this._particleSystem.behaviors,s=t.indexOf(e);return s!==-1&&((F()||ir)&&console.debug("Remove custom ParticleSystem Behaviour",s,e),t.splice(s,1)),!0}removeAllBehaviours(){return this._particleSystem?(this._particleSystem.behaviors.length=0,!0):!1}get behaviours(){return this._particleSystem?this._particleSystem.behaviors:null}get particleSystem(){return this._particleSystem??null}set bursts(e){for(let t=0;t<e.length;t++){const s=e[t];if(!(s instanceof Ap)){const o=new Ap;za(o,s),e[t]=o}}this._bursts=e}set subEmitterSystems(e){for(let t=0;t<e.length;t++){const s=e[t];if(!(s instanceof Bp)){const o=new Bp;za(o,s),e[t]=o}}ir&&e.length>0&&console.log("SubEmitters: ",e,this),this._subEmitterSystems=e}onAfterDeserialize(e){if(this._subEmitterSystems&&Array.isArray(this._subEmitterSystems))for(const t of this._subEmitterSystems)t._deserialize(this.context,this.gameObject)}awake(){if(this._worldPositionFrame=-1,this._renderer=this.gameObject.getComponent(ds),!this.main)throw new Error("Not Supported: ParticleSystem needs a serialized MainModule. Creating new particle systems at runtime is currently not supported.");this._container=new E,this._container.matrixAutoUpdate=!1,this.context.scene.add(this._container),this._batchSystem=new _O,this._batchSystem.name=this.gameObject.name,this._container.add(this._batchSystem),this._interface=new O2(this),this._particleSystem=new wO(this._interface),this._particleSystem.addBehavior(new x2(this)),this._particleSystem.addBehavior(new P2(this)),this._particleSystem.addBehavior(new b2(this)),this._particleSystem.addBehavior(new _2(this)),this._particleSystem.addBehavior(new C2(this)),this._particleSystem.addBehavior(new S2(this)),this._batchSystem.addSystem(this._particleSystem);const e=this._particleSystem.emitter;this.context.scene.add(e),this.inheritVelocity.system&&this.inheritVelocity.system!==this&&(this.inheritVelocity=this.inheritVelocity.clone()),this.inheritVelocity.awake(this),ir&&(console.log(this),this.gameObject.add(new Ci(1)))}start(){this.addSubParticleSystems(),this.updateLayers(),this.renderer.particleMesh instanceof G&&this._interface.renderMode==Tn.Mesh&&Xe.assignMeshLOD(this.renderer.particleMesh,0).then(e=>{e&&this.particleSystem&&this._interface.renderMode==Tn.Mesh&&(this.particleSystem.instancingGeometry=e)})}onDestroy(){var e,t,s,o;(e=this._container)==null||e.removeFromParent(),(t=this._batchSystem)==null||t.removeFromParent(),(s=this._particleSystem)==null||s.emitter.removeFromParent(),(o=this._particleSystem)==null||o.dispose()}onEnable(){this.main&&(this.inheritVelocity&&(this.inheritVelocity.system=this),this._batchSystem&&(this._batchSystem.visible=!0),this.playOnAwake&&this.play(),this._isPlaying=this.playOnAwake)}onDisable(){this._batchSystem&&(this._batchSystem.visible=!1)}onBeforeRender(){var e;this.main&&(this._didPreWarm===!1&&((e=this.main)==null?void 0:e.prewarm)===!0&&(this._didPreWarm=!0,this.preWarm()),this.onUpdate(),this.onSimulate(this.deltaTime))}preWarm(){var e;if(!((e=this.emission)!=null&&e.enabled)||this.emission.rateOverTime.getMax()<=0)return;const t=1/60,s=this.main.duration,o=this.main.startLifetime.getMax(),r=Math.min(Math.max(s,o)/Math.max(.01,this.main.simulationSpeed),1e3),l=Math.ceil(r/t),c=Date.now();ir&&console.log(`Particles ${this.name} - Prewarm for ${l} frames (${r} sec). Duration: ${s}, Lifetime: ${o}`);for(let h=0;h<l&&!(this.currentParticles>=this.maxParticles);h++){const d=Date.now()-c;if(d>2e3){console.warn(`Particles ${this.name} - Prewarm took too long. Aborting: ${d}`);break}this.onUpdate(),this.onSimulate(t)}}onSimulate(e){if(this._batchSystem){let t=this.context.time.frameCount%60===0;this._lastBatchesCount!==this._batchSystem.batches.length&&(this._lastBatchesCount=this._batchSystem.batches.length,t=!0),t&&this.updateLayers(),this._batchSystem.update(e)}this._time+=e,this._time>this.duration&&(this._time=0)}updateLayers(){if(this._batchSystem)for(let e=0;e<this._batchSystem.batches.length;e++){const t=this._batchSystem.batches[e];t.layers.disableAll();const s=this.layer;t.layers.mask=1<<s}}onUpdate(){var e,t;if(this._bursts&&(this.emission.bursts=this._bursts,delete this._bursts),!this._isPlaying)return;const s=this.context.mainCamera;if(s){const l=Ge(s);this._cameraScale=l.x}const o=!this.worldspace,r=this.gameObject;if(Se(r,this.__worldQuaternion),this._worldQuaternionInverted.copy(this.__worldQuaternion).invert(),Ge(this.gameObject,this._worldScale),o&&this._container&&(e=this.gameObject)!=null&&e.parent){const l=pS(this,Ty);this._container.matrix.makeScale(l.x,l.y,l.z),this._container.matrix.makeRotationFromQuaternion(this.__worldQuaternion),this._container.matrix.setPosition(this.worldPos),this._container.matrix.scale(this.gameObject.scale)}this.emission.system=this,this._interface.update(),this.shape.onUpdate(this,this.context,this.main.simulationSpace,this.gameObject),this.noise.update(this.context),(t=this.inheritVelocity)==null||t.update(this.context),this.velocityOverLifetime.update(this)}addSubParticleSystems(){var e;if(this._subEmitterSystems&&this._particleSystem)for(const t of this._subEmitterSystems){t.particleSystem&&(t.particleSystem.__internalAwake?t.particleSystem.__internalAwake():F()&&console.warn("SubParticleSystem serialization issue(?)",t.particleSystem,t));const s=(e=t.particleSystem)==null?void 0:e._particleSystem;if(s){t.particleSystem._isUsedAsSubsystem=!0;const o=new Cy(this,this._particleSystem,t.particleSystem,s);o.emitterType=t.type,o.emitterProbability=t.emitProbability,this._particleSystem.addBehavior(o)}else ir&&console.warn("Could not add SubParticleSystem",t,this)}}};Ve([m(Ip)],$t.prototype,"colorOverLifetime"),Ve([m(Wt)],$t.prototype,"main"),Ve([m(eo)],$t.prototype,"emission"),Ve([m(na)],$t.prototype,"sizeOverLifetime"),Ve([m(xy)],$t.prototype,"shape"),Ve([m(Ce)],$t.prototype,"noise"),Ve([m(We)],$t.prototype,"trails"),Ve([m(qe)],$t.prototype,"velocityOverLifetime"),Ve([m(gt)],$t.prototype,"limitVelocityOverLifetime"),Ve([m(Sy)],$t.prototype,"inheritVelocity"),Ve([m(Cl)],$t.prototype,"colorBySpeed"),Ve([m(Vt)],$t.prototype,"textureSheetAnimation"),Ve([m(Es)],$t.prototype,"rotationOverLifetime"),Ve([m(hs)],$t.prototype,"rotationBySpeed"),Ve([m(bi)],$t.prototype,"sizeBySpeed");let yh=$t;class Bp{constructor(){a(this,"particleSystem"),a(this,"emitProbability",1),a(this,"properties"),a(this,"type")}_deserialize(e,t){const s=this.particleSystem;if(s instanceof yh)return;let o="";s&&typeof s.guid=="string"&&(o=s.guid,this.particleSystem=P.findByGuid(o,t)),ir&&!(this.particleSystem instanceof yh)&&console.warn("Could not find particle system for sub emitter",o,t,this)}}function pS(n,e){if(e.set(1,1,1),n.gameObject.parent&&n.localspace)switch(n.main.scalingMode){case wy.Local:e=Ge(n.gameObject.parent,e),e.x=1/e.x,e.y=1/e.y,e.z=1/e.z;break;default:if(!n.unsupported_scaling_mode){n.unsupported_scaling_mode=!0;const t="ParticleSystem scale mode "+wy[n.main.scalingMode]+" is not supported";F()&&be(t),console.warn(t,n.name,n)}e=Ge(n.gameObject,e);break}return e}class zl extends I{constructor(){super(...arguments),a(this,"_didAssignPlayerColor",!1),a(this,"tryAssignColor",()=>{const e=P.getComponentInParent(this.gameObject,Ms);if(e&&e.owner)return this._didAssignPlayerColor=!0,this.assignUserColor(e.owner),!0;const t=P.getComponentInParent(this.gameObject,hi);return t!=null&&t.connectionId?(this._didAssignPlayerColor=!0,this.assignUserColor(t.connectionId),!0):!1})}onEnable(){this.context.connection.beginListen(ie.JoinedRoom,this.tryAssignColor),this._didAssignPlayerColor||this.startCoroutine(this.waitForConnection())}onDisable(){this.context.connection.stopListen(ie.JoinedRoom,this.tryAssignColor)}*waitForConnection(){for(;!this.destroyed&&this.activeAndEnabled&&(yield wf(.2),!this.tryAssignColor()););}assignUserColor(e){const t=zl.hashCode(e),s=zl.colorFromHashCode(t);if(this.gameObject.type==="Mesh"){const o=this.gameObject;this.assignColor(s,e,o)}else if(this.gameObject.children)for(const o of this.gameObject.children){const r=o;r.material&&r.material.color&&this.assignColor(s,e,r)}}assignColor(e,t,s){let o=s.material;o&&(o._playerMaterial!==t&&(o=o.clone(),o._playerMaterial=t,s.material=o),o.color=e)}static hashCode(e){var t=0,s,o;if(e.length===0)return t;for(s=0;s<e.length;s++)o=e.charCodeAt(s),t=(t<<5)-t+o,t|=0;return t}static colorFromHashCode(e){const t=(e&16711680)>>16,s=(e&65280)>>8,o=e&255;return new oe(t/255,s/255,o/255)}}const vh=C("debugpost");let Ey=null;function M2(n){Ey=n}function mS(n){let e=n.gameObject;for(;e;){for(const t of hu(e))if(t.isPostProcessingManager===!0)return t;e=e.parent}return null}function R2(n){let e=mS(n);if(!e)if(Ey){vh&&console.warn("Adding postprocessing manager to the scene.");const t=n.scene;e=Ei(t,Ey)}else F()&&console.warn("No post processing manager found");return e}const ft={AT_START:-1e4,NormalPass:0,DepthDownsamplingPass:10,SSAO:20,SMAA:30,TiltShift:40,DepthOfField:50,ChromaticAberration:60,Bloom:70,Vignette:80,Pixelation:90,ToneMapping:100,HueSaturation:110,BrightnessContrast:120,Sharpening:130,AT_END:1e4};let ot=null;function T2(n){vh==="verbose"&&console.debug("Before ordering effects",[...n]),ot||(ot=new Map,ot.set(A.POSTPROCESSING.MODULE.NormalPass,ft.NormalPass),ot.set(A.POSTPROCESSING.MODULE.DepthDownsamplingPass,ft.DepthDownsamplingPass),ot.set(A.POSTPROCESSING.MODULE.SMAAEffect,ft.SMAA),ot.set(A.POSTPROCESSING.MODULE.SSAOEffect,ft.SSAO),ot.set(A.POSTPROCESSING_AO.MODULE.N8AOPostPass,ft.SSAO),ot.set(A.POSTPROCESSING_AO.MODULE.N8AOPass,ft.SSAO),ot.set(A.POSTPROCESSING.MODULE.TiltShiftEffect,ft.TiltShift),ot.set(A.POSTPROCESSING.MODULE.DepthOfFieldEffect,ft.DepthOfField),ot.set(A.POSTPROCESSING.MODULE.ChromaticAberrationEffect,ft.ChromaticAberration),ot.set(A.POSTPROCESSING.MODULE.BloomEffect,ft.Bloom),ot.set(A.POSTPROCESSING.MODULE.SelectiveBloomEffect,ft.Bloom),ot.set(A.POSTPROCESSING.MODULE.VignetteEffect,ft.Vignette),ot.set(A.POSTPROCESSING.MODULE.PixelationEffect,ft.Pixelation),ot.set(A.POSTPROCESSING.MODULE.ToneMappingEffect,ft.ToneMapping),ot.set(A.POSTPROCESSING.MODULE.HueSaturationEffect,ft.HueSaturation),ot.set(A.POSTPROCESSING.MODULE.BrightnessContrastEffect,ft.BrightnessContrast)),n.sort((e,t)=>{const s=typeof e.priority=="number"?e.priority:ot.get(e.effect.constructor)??Number.NEGATIVE_INFINITY,o=typeof t.priority=="number"?t.priority:ot.get(t.effect.constructor)??Number.NEGATIVE_INFINITY;return s===Number.NEGATIVE_INFINITY?(vh&&console.warn("Unknown effect found: ",e.constructor.name,e),1):o===Number.NEGATIVE_INFINITY?(vh&&console.warn("Unknown effect found: ",t.constructor.name,t),-1):s-o}),vh==="verbose"&&console.debug("After ordering effects",[...n])}var E2=Object.defineProperty,A2=Object.getOwnPropertyDescriptor,gS=(n,e,t,s)=>{for(var o=A2(e,t),r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&E2(e,t,o),o};const I2=C("debugpost");class N{constructor(e){a(this,"isVolumeParameter",!0),a(this,"_isInitialized",!1),a(this,"_active",!0),a(this,"_value"),a(this,"_valueRaw"),a(this,"_defaultValue"),a(this,"valueProcessor"),a(this,"onValueChanged"),e!==void 0&&this.initialize(e)}get isInitialized(){return this._isInitialized}initialize(e){e!==void 0&&(this._value=e,this._defaultValue=e,this._valueRaw=e,this._isInitialized=!0)}get overrideState(){return this._active}set overrideState(e){if(this._active===e)return;this._active=e;const t=e?this._valueRaw:this._defaultValue;this.processValue(t,!0)}get value(){return this._valueRaw}set value(e){this.isInitialized||this.initialize(e),this.processValue(e,!1)}set defaultValue(e){this._defaultValue=e}__init(){this.processValue(this._valueRaw,!0)}processValue(e,t){if(e==null||!t&&this.testIfValueChanged(e)===!1)return;const s=this._value;I2&&typeof s=="number"&&typeof e=="number"&&(s?.toFixed(4),e?.toFixed(4)),!this._active&&this._defaultValue!==void 0?(this._value=this._defaultValue,e=this._defaultValue,this._valueRaw=e):(this._valueRaw=e,this._active&&this.valueProcessor&&(e=this.valueProcessor(e)),this._value=e),this.onValueChanged&&this.onValueChanged(e,s,this)}testIfValueChanged(e){return this._valueRaw!==e}}gS([m()],N.prototype,"overrideState"),gS([m()],N.prototype,"value");class L2 extends es{constructor(){super([N])}onSerialize(e,t){}onDeserialize(e,t){const s=t.target,o=t.path;let r;if(s&&o&&(r=s[o]),(typeof r!="object"||typeof r=="object"&&r.isVolumeParameter!==!0)&&(r=new N),typeof e=="object"&&"value"in e){const l=e.value;r.initialize(l),r.overrideState=e.overrideState}else r.value=e;return r}}new L2;var j2=Object.defineProperty,D2=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&j2(e,t,o),o};const Ay=C("debugpost");class rt extends I{constructor(e=void 0){if(super(),a(this,"order"),a(this,"active",!0),a(this,"_manager",null),a(this,"_result"),a(this,"_postprocessingContext",null),e)for(const t of Object.keys(e)){const s=e[t],o=this[t];o instanceof N?o.initialize(s):o!==void 0&&(this[t]=s)}}get isPostProcessingEffect(){return!0}onEnable(){super.onEnable(),Ay&&console.warn("Enable",this.constructor.name+(this.__internalDidAwakeAndStart?"":" (awake)")),this.__internalDidAwakeAndStart&&(this.active=!0),this.onEffectEnabled()}onDisable(){var e;super.onDisable(),Ay&&console.warn("Disable",this.constructor.name),(e=this._manager)==null||e.removeEffect(this),this.active=!1}onEffectEnabled(e){e&&e.isPostProcessingManager===!0?this._manager=e:this._manager||(this._manager=R2(this)),this._manager.addEffect(this),this._manager.dirty=!0}init(){}get postprocessingContext(){return this._postprocessingContext}apply(e){var t;return this._postprocessingContext=e,this._result||(this.initParameters(),this._result=(t=this.onCreateEffect)==null?void 0:t.call(this)),this._result&&this.initParameters(),this._result}unapply(){}dispose(){Ay&&console.warn("DISPOSE",this),this._result&&(Array.isArray(this._result)?this._result.forEach(e=>e.dispose()):this._result.dispose()),this._result=void 0}initParameters(){const e=Object.keys(this);for(const t of e){const s=this[t];s instanceof N&&s.__init()}}onEditorModification(e){const t=e.propertyName;if(this[t]instanceof N){const s=e.value;return this[t].value=s,!0}}}D2([m()],rt.prototype,"active");var B2=Object.defineProperty,F2=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&B2(e,t,o),o};const U2=C("debugpost"),Iy={};function us(n,e){Iy[n]=e}function z2(n){return n.__type in Iy?Iy[n.__type]:(U2&&n.__type&&console.warn("Unknown postprocessing type",n.__type,n),rt)}class Fp{constructor(){a(this,"components",[])}__init(e){var t;(t=this.components)==null||t.forEach(s=>{s.gameObject===void 0&&e.gameObject.addComponent(s),s.init()})}addEffect(e){this.components.push(e)}removeEffect(e){const t=this.components.indexOf(e);t>=0&&this.components.splice(t,1)}}F2([Dr([n=>z2(n),rt])],Fp.prototype,"components");var N2=Object.defineProperty,W2=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&N2(e,t,o),o};class bh extends rt{constructor(){super(...arguments),a(this,"preset",new N(2))}get typeName(){return"Antialiasing"}onCreateEffect(){const e=new A.POSTPROCESSING.MODULE.SMAAEffect({preset:A.POSTPROCESSING.MODULE.SMAAPreset.HIGH,edgeDetectionMode:A.POSTPROCESSING.MODULE.EdgeDetectionMode.LUMA});return this.preset.onValueChanged=t=>{e.applyPreset(t)},e}}W2([m(N)],bh.prototype,"preset"),us("Antialiasing",bh);var V2=Object.defineProperty,Ly=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&V2(e,t,o),o},Up;const zp=(Up=class extends rt{constructor(){super(...arguments),a(this,"threshold",new N(.9)),a(this,"intensity",new N(1)),a(this,"scatter",new N(.7)),a(this,"selectiveBloom")}get typeName(){return"Bloom"}init(){this.threshold.valueProcessor=n=>n,this.intensity.valueProcessor=n=>n,this.scatter.valueProcessor=n=>n}onCreateEffect(){let n;if(this.selectiveBloom==null&&(this.selectiveBloom=Up.useSelectiveBloom),this.selectiveBloom){const e=n=new A.POSTPROCESSING.MODULE.SelectiveBloomEffect(this.context.scene,this.context.mainCamera,{blendFunction:A.POSTPROCESSING.MODULE.BlendFunction.ADD,mipmapBlur:!0,luminanceThreshold:this.threshold.value,luminanceSmoothing:this.scatter.value,radius:.85,intensity:this.intensity.value});e.inverted=!0}else n=new A.POSTPROCESSING.MODULE.BloomEffect({blendFunction:A.POSTPROCESSING.MODULE.BlendFunction.ADD,mipmapBlur:!0,luminanceThreshold:this.threshold.value,luminanceSmoothing:this.scatter.value,radius:.85,intensity:this.intensity.value});return this.intensity.onValueChanged=e=>{n.intensity=e},this.threshold.onValueChanged=e=>{n.luminanceMaterial.threshold=Math.pow(e,2.2)},this.scatter.onValueChanged=e=>{n.luminancePass.enabled=!0,n.luminanceMaterial.smoothing=e,n.mipmapBlurPass&&(n.mipmapBlurPass.radius=Cn.lerp(.1,.9,e))},n}},a(Up,"useSelectiveBloom",!1),Up);Ly([m(N)],zp.prototype,"threshold"),Ly([m(N)],zp.prototype,"intensity"),Ly([m(N)],zp.prototype,"scatter");let Np=zp;us("Bloom",Np);var $2=Object.defineProperty,H2=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&$2(e,t,o),o};class _h extends rt{constructor(){super(...arguments),a(this,"intensity",new N(0))}get typeName(){return"ChromaticAberration"}onCreateEffect(){const e=new A.POSTPROCESSING.MODULE.ChromaticAberrationEffect;return e.offset=new re(0,0),e.radialModulation=!0,e.modulationOffset=.15,this.intensity.valueProcessor=t=>t*.02,this.intensity.onValueChanged=t=>{e.offset.x=-t,e.offset.y=t},e}}H2([m(N)],_h.prototype,"intensity"),us("ChromaticAberration",_h);var wh=(n=>(n[n.None=0]="None",n[n.Neutral=1]="Neutral",n[n.ACES=2]="ACES",n[n.AgX=3]="AgX",n[n.KhronosNeutral=4]="KhronosNeutral",n))(wh||{});const fS=new Map;function jy(n){switch(n){case 0:return Um;case 1:return Fm;case 2:return vd;case 3:return yd;case 4:return Pa;default:return fS.has(n)||(fS.set(n,!0),console.warn("[Postprocessing] Unknown tone mapping mode",n)),Pa}}function G2(n){switch(n){case Um:return 0;case vd:return 2;case yd:return 3;case Pa:return 1;case Fm:return 1;default:return 0}}function Wp(n){switch(n){case Um:return A.POSTPROCESSING.MODULE.ToneMappingMode.LINEAR;case vd:return A.POSTPROCESSING.MODULE.ToneMappingMode.ACES_FILMIC;case yd:return A.POSTPROCESSING.MODULE.ToneMappingMode.AGX;case Pa:return A.POSTPROCESSING.MODULE.ToneMappingMode.NEUTRAL;case Fm:return A.POSTPROCESSING.MODULE.ToneMappingMode.REINHARD;default:return A.POSTPROCESSING.MODULE.ToneMappingMode.LINEAR}}var q2=Object.defineProperty,yS=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&q2(e,t,o),o};const Dy=C("debugpost");class nr extends rt{constructor(){super(...arguments),a(this,"mode",new N(void 0)),a(this,"exposure",new N(1)),a(this,"_tonemappingEffect",null)}get typeName(){return"ToneMapping"}setMode(e){const t=wh[e];return t===void 0?(console.error("[PostProcessing] Invalid ToneMapping mode",e),this):(this.mode.value=t,this)}get isToneMapping(){return!0}onEffectEnabled(){const e=mS(this);e&&super.onEffectEnabled(e)}onCreateEffect(){var e;if(this.mode.isInitialized==!1){const o=G2(this.context.renderer.toneMapping);Dy&&console.log("[PostProcessing] Initializing ToneMapping mode to renderer.toneMapping",this.context.renderer.toneMapping+" \u2192 "+o),this.mode.initialize(o)}(e=this._tonemappingEffect)==null||e.dispose();const t=jy(this.mode.value),s=this._tonemappingEffect=new A.POSTPROCESSING.MODULE.ToneMappingEffect({mode:Wp(t)});return this.mode.onValueChanged=o=>{if(typeof o=="string")o=Gw(o),s.mode=Wp(o);else{const r=jy(o);s.mode=Wp(r)}s.name="ToneMapping ("+wh[o]+")",Dy&&console.log("[PostProcessing] ToneMapping mode changed to",wh[o],t,s.mode)},Dy&&console.log("[PostProcessing] Use ToneMapping",wh[this.mode.value],t,s.mode,"renderer.tonemapping: "+this.context.renderer.toneMapping),s}onBeforeRender(){var e;if(this._tonemappingEffect&&(e=this.postprocessingContext)!=null&&e.handler.getEffectIsActive(this._tonemappingEffect)&&(this.mode.overrideState&&(this.context.renderer.toneMapping=jy(this.mode.value)),this.exposure.overrideState&&this.exposure.value!==void 0)){const t=Math.max(.01,this.exposure.value);this.context.renderer.toneMappingExposure=t}}}yS([m(N)],nr.prototype,"mode"),yS([m(N)],nr.prototype,"exposure"),us("Tonemapping",nr);var X2=Object.defineProperty,Vp=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&X2(e,t,o),o};class or extends rt{constructor(){super(...arguments),a(this,"remap",!0),a(this,"postExposure",new N(1)),a(this,"contrast",new N(0)),a(this,"hueShift",new N(0)),a(this,"saturation",new N(0))}get typeName(){return"ColorAdjustments"}init(){this.postExposure.valueProcessor=e=>(this.remap&&(e=Math.pow(2,e)),e),this.contrast.valueProcessor=e=>{if(!this.remap)return e;let t=1;return e>0?t=200:e<0&&(t=100),e/t},this.contrast.defaultValue=0,this.hueShift.valueProcessor=e=>this.remap?Math.PI*e/180:e,this.hueShift.defaultValue=0,this.saturation.valueProcessor=e=>this.remap?e<0?e/100:e/(100*Math.PI):e,this.saturation.defaultValue=0}onCreateEffect(){var e,t;const s=[];let o=(e=this.postprocessingContext)==null?void 0:e.components.find(c=>c instanceof nr);o||(o=new nr,(t=this.postprocessingContext)==null||t.components.push(o)),this.postExposure.onValueChanged=c=>{this.postExposure.overrideState&&o?o.exposure.value=c:console.warn("[PostProcessing] PostExposure is set to override but no ToneMappingEffect found in the postprocessing stack. Please add a ToneMappingEffect to your postprocessing stack to use PostExposure.")};const r=new A.POSTPROCESSING.MODULE.BrightnessContrastEffect;this.contrast.onValueChanged=c=>r.contrast=c;const l=new A.POSTPROCESSING.MODULE.HueSaturationEffect;return this.hueShift.onValueChanged=c=>l.hue=c,this.saturation.onValueChanged=c=>l.saturation=c,s.push(r),s.push(l),s}}Vp([m(N)],or.prototype,"postExposure"),Vp([m(N)],or.prototype,"contrast"),Vp([m(N)],or.prototype,"hueShift"),Vp([m(N)],or.prototype,"saturation"),us("ColorAdjustments",or);var Q2=Object.defineProperty,ra=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&Q2(e,t,o),o};const Y2=C("debugpost");class As extends rt{constructor(){super(...arguments),a(this,"mode"),a(this,"focusDistance",new N(1)),a(this,"focalLength",new N(.2)),a(this,"aperture",new N(20)),a(this,"gaussianMaxRadius",new N),a(this,"resolutionScale",new N(1*1/window.devicePixelRatio)),a(this,"bokehScale",new N)}get typeName(){return"DepthOfField"}init(){this.focalLength.valueProcessor=t=>{const s=t/300;return W.lerp(2,.01,s)};const e=20;this.aperture.valueProcessor=t=>{const s=1-t/32;return W.lerp(1,e,s)}}onCreateEffect(){if(this.mode===0){Y2&&console.warn("DepthOfField: Mode is set to Off");return}const e=new A.POSTPROCESSING.MODULE.DepthOfFieldEffect(this.context.mainCamera,{worldFocusRange:.2,focalLength:1,bokehScale:20,resolutionScale:this.resolutionScale.value});return this.focusDistance.onValueChanged=t=>{e.cocMaterial.worldFocusDistance=t},this.focalLength.onValueChanged=t=>e.cocMaterial.worldFocusRange=t,this.aperture.onValueChanged=t=>e.bokehScale=t,this.resolutionScale&&(this.resolutionScale.onValueChanged=t=>e.resolution.scale=t),[e]}unapply(){}}ra([m()],As.prototype,"mode"),ra([m(N)],As.prototype,"focusDistance"),ra([m(N)],As.prototype,"focalLength"),ra([m(N)],As.prototype,"aperture"),ra([m(N)],As.prototype,"gaussianMaxRadius"),ra([m(N)],As.prototype,"resolutionScale"),ra([m(N)],As.prototype,"bokehScale"),us("DepthOfField",As);class xh extends rt{constructor(e){super(),a(this,"effect"),this.effect=e}get typeName(){return this.effect.constructor.name}onCreateEffect(){return this.effect}}var K2=Object.defineProperty,Z2=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&K2(e,t,o),o};class Sh extends rt{constructor(){super(...arguments),a(this,"granularity",new N(10))}get typeName(){return"PixelationEffect"}onCreateEffect(){const e=new A.POSTPROCESSING.MODULE.PixelationEffect;return this.granularity.onValueChanged=t=>{e.granularity=t},e}}Z2([m(N)],Sh.prototype,"granularity"),us("PixelationEffect",Sh);var J2=Object.defineProperty,Ch=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&J2(e,t,o),o};class to extends rt{constructor(){super(...arguments),a(this,"intensity",new N(2)),a(this,"falloff",new N(1)),a(this,"samples",new N(9)),a(this,"color",new N(new oe(0,0,0))),a(this,"luminanceInfluence",new N(.7)),a(this,"_ssao")}get typeName(){return"ScreenSpaceAmbientOcclusion"}onBeforeRender(){if(this._ssao&&this.context.mainCamera instanceof we){const e=this.context.mainCamera.far-this.context.mainCamera.near;this._ssao.ssaoMaterial.worldDistanceFalloff=e*.01,this._ssao.ssaoMaterial.worldDistanceThreshold=this.context.mainCamera.far}}onCreateEffect(){const e=this.context.mainCamera,t=new A.POSTPROCESSING.MODULE.NormalPass(this.context.scene,e),s=new A.POSTPROCESSING.MODULE.DepthDownsamplingPass({normalBuffer:t.texture,resolutionScale:.5}),o=this._ssao=new A.POSTPROCESSING.MODULE.SSAOEffect(e,t.texture,{normalDepthBuffer:s.texture,worldDistanceThreshold:1,worldDistanceFalloff:1,worldProximityThreshold:.1,worldProximityFalloff:2,intensity:1,blendFunction:A.POSTPROCESSING.MODULE.BlendFunction.MULTIPLY,luminanceInfluence:.5});this.intensity.onValueChanged=l=>{o.intensity=l},this.falloff.onValueChanged=l=>{o.ssaoMaterial.radius=l*.1},this.samples.onValueChanged=l=>{o.ssaoMaterial.samples=l},this.color.onValueChanged=l=>{o.color||(o.color=new oe),o.color.copy(l)},this.luminanceInfluence.onValueChanged=l=>{o.luminanceInfluence=l};const r=new Array;return r.push(t),r.push(s),r.push(o),r}}Ch([m(N)],to.prototype,"intensity"),Ch([m(N)],to.prototype,"falloff"),Ch([m(N)],to.prototype,"samples"),Ch([m(N)],to.prototype,"color"),Ch([m(N)],to.prototype,"luminanceInfluence"),us("ScreenSpaceAmbientOcclusion",to);var eI=Object.defineProperty,aa=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&eI(e,t,o),o};const tI=C("debugN8AO");var By=(n=>(n[n.Performance=0]="Performance",n[n.Low=1]="Low",n[n.Medium=2]="Medium",n[n.High=3]="High",n[n.Ultra=4]="Ultra",n))(By||{});class Is extends rt{constructor(){super(...arguments),a(this,"gammaCorrection",!0),a(this,"aoRadius",new N(1)),a(this,"falloff",new N(1)),a(this,"intensity",new N(1)),a(this,"color",new N(new oe(0,0,0))),a(this,"screenspaceRadius",!1),a(this,"quality",2),a(this,"_ssao")}get typeName(){return"ScreenSpaceAmbientOcclusionN8"}get pass(){return this._ssao}onValidate(){this._ssao&&(this._ssao.setQualityMode(By[this.quality]),this._ssao.configuration.gammaCorrection=this.gammaCorrection,this._ssao.configuration.screenSpaceRadius=this.screenspaceRadius)}onCreateEffect(){const e=this.context.mainCamera,t=this.context.domWidth,s=this.context.domHeight,o=this._ssao=new A.POSTPROCESSING_AO.MODULE.N8AOPostPass(this.context.scene,e,t,s);o.name="SSAO N8";const r=By[this.quality];o.setQualityMode(r),o.configuration.transparencyAware=!1;const l=new $s(t,s);return o.configuration.beautyRenderTarget=l,o.configuration.autoRenderBeauty=!1,o.configuration.gammaCorrection=this.gammaCorrection,o.configuration.screenSpaceRadius=this.screenspaceRadius,tI&&(o.enableDebugMode(),console.log(o),setInterval(()=>{console.log("SSAO",o.lastTime)},1e3),setInterval(()=>{console.log("SSAO",o.enabled,{ssao:o,autoRenderBeauty:o.configuration.autoRenderBeauty})},4e3)),this.intensity.onValueChanged=c=>{o.configuration.intensity=c},this.falloff.onValueChanged=c=>{o.configuration.distanceFalloff=c},this.aoRadius.onValueChanged=c=>{o.configuration.aoRadius=c},this.color.onValueChanged=c=>{o.color||(o.color=new oe),o.configuration.color.copy(c)},o}}aa([Tt(),m()],Is.prototype,"gammaCorrection"),aa([m(N)],Is.prototype,"aoRadius"),aa([m(N)],Is.prototype,"falloff"),aa([m(N)],Is.prototype,"intensity"),aa([m(N)],Is.prototype,"color"),aa([Tt(),m()],Is.prototype,"screenspaceRadius"),aa([Tt(),m()],Is.prototype,"quality"),us("ScreenSpaceAmbientOcclusionN8",Is);var iI=Object.defineProperty,sI=Object.getOwnPropertyDescriptor,vS=(n,e,t,s)=>{for(var o=sI(e,t),r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&iI(e,t,o),o};class Ph extends rt{constructor(){super(...arguments),a(this,"order",ft.Sharpening),a(this,"_effect"),a(this,"_amount",1),a(this,"_radius",1)}get typeName(){return"Sharpening"}onCreateEffect(){return this._effect??(this._effect=new(nI())),this.effect}get effect(){return this._effect}set amount(e){this._amount=e,this._effect&&(this._effect.uniforms.get("amount").value=e)}get amount(){return this._effect?this._effect.uniforms.get("amount").value:this._amount}set radius(e){this._radius=e,this._effect&&(this._effect.uniforms.get("radius").value=e)}get radius(){return this._effect?this._effect.uniforms.get("radius").value:this._radius}}vS([m()],Ph.prototype,"amount"),vS([m()],Ph.prototype,"radius");function nI(){const n=`
|
|
1274
|
+
void mainSupport() {
|
|
1275
|
+
vUv = uv;
|
|
1276
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
|
|
1277
|
+
}
|
|
1278
|
+
`,e=`
|
|
1279
|
+
uniform sampler2D tDiffuse;
|
|
1280
|
+
uniform float amount;
|
|
1281
|
+
uniform float radius;
|
|
1282
|
+
|
|
1283
|
+
void mainImage(const in vec4 inputColor, const in vec2 uv, out vec4 outputColor) {
|
|
1284
|
+
float tx = 1.0 / resolution.x;
|
|
1285
|
+
float ty = 1.0 / resolution.y;
|
|
1286
|
+
vec2 texelSize = vec2(tx, ty);
|
|
1287
|
+
|
|
1288
|
+
vec4 blurred = vec4(0.0);
|
|
1289
|
+
float total = 0.0;
|
|
1290
|
+
|
|
1291
|
+
for (float x = -radius; x <= radius; x++) {
|
|
1292
|
+
for (float y = -radius; y <= radius; y++) {
|
|
1293
|
+
vec2 offset = vec2(x, y) * texelSize;
|
|
1294
|
+
vec4 diffuse = texture2D(tDiffuse, uv + offset);
|
|
1295
|
+
float weight = exp(-length(offset) * amount);
|
|
1296
|
+
blurred += diffuse * weight;
|
|
1297
|
+
total += weight;
|
|
1298
|
+
}
|
|
1299
|
+
}
|
|
1300
|
+
|
|
1301
|
+
if (total > 0.0) {
|
|
1302
|
+
blurred /= total;
|
|
1303
|
+
}
|
|
1304
|
+
|
|
1305
|
+
// Calculate the sharpened color using inputColor
|
|
1306
|
+
vec4 sharp = inputColor + clamp(inputColor - blurred, 0.0, 1.0) * amount;
|
|
1307
|
+
// Keep original alpha
|
|
1308
|
+
sharp.a = inputColor.a;
|
|
1309
|
+
|
|
1310
|
+
// Ensure the sharp color does not go below 0 or above 1
|
|
1311
|
+
// This means: sharpening must happen AFTER tonemapping.
|
|
1312
|
+
sharp = clamp(sharp, 0.0, 1.0);
|
|
1313
|
+
|
|
1314
|
+
outputColor = sharp;
|
|
1315
|
+
}
|
|
1316
|
+
|
|
1317
|
+
`;class t extends A.POSTPROCESSING.MODULE.Effect{constructor(){super("Sharpening",e,{vertexShader:n,blendFunction:A.POSTPROCESSING.MODULE.BlendFunction.NORMAL,uniforms:new Map([["amount",new Qi(1)],["radius",new Qi(1)]]),attributes:RO.CONVOLUTION})}}return t}var oI=Object.defineProperty,Ol=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&oI(e,t,o),o};class yn extends rt{constructor(){super(...arguments),a(this,"offset",new N(0)),a(this,"rotation",new N(0)),a(this,"focusArea",new N(.4)),a(this,"feather",new N(.3)),a(this,"kernelSize",new N(2)),a(this,"resolutionScale",new N(1/window.devicePixelRatio))}get typeName(){return"TiltShiftEffect"}init(){this.offset.defaultValue=0,this.rotation.defaultValue=0,this.focusArea.defaultValue=.4,this.feather.defaultValue=.3,this.kernelSize.defaultValue=A.POSTPROCESSING.MODULE.KernelSize.MEDIUM,this.resolutionScale.defaultValue=1/window.devicePixelRatio}onCreateEffect(){const e=new A.POSTPROCESSING.MODULE.TiltShiftEffect({kernelSize:A.POSTPROCESSING.MODULE.KernelSize.VERY_LARGE,offset:this.offset.value,rotation:this.rotation.value,focusArea:this.focusArea.value,feather:this.feather.value});return this.offset.onValueChanged=t=>e.offset=t,this.rotation.onValueChanged=t=>e.rotation=t,this.focusArea.onValueChanged=t=>e.focusArea=t,this.feather.onValueChanged=t=>e.feather=t,this.kernelSize.onValueChanged=t=>e.blurPass.kernelSize=t,this.resolutionScale.onValueChanged=t=>e.resolution.scale=t/window.devicePixelRatio,e}}Ol([m(N)],yn.prototype,"offset"),Ol([m(N)],yn.prototype,"rotation"),Ol([m(N)],yn.prototype,"focusArea"),Ol([m(N)],yn.prototype,"feather"),Ol([m(N)],yn.prototype,"kernelSize"),Ol([m(N)],yn.prototype,"resolutionScale"),us("TiltShiftEffect",yn);var rI=Object.defineProperty,Fy=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&rI(e,t,o),o};class la extends rt{constructor(){super(...arguments),a(this,"color",new N({r:0,g:0,b:0,a:1})),a(this,"intensity",new N(0)),a(this,"center",new N({x:.5,y:.5}))}get typeName(){return"Vignette"}init(){this.color.defaultValue={r:0,g:0,b:0,a:1},this.intensity.defaultValue=0,this.center.defaultValue={x:.5,y:.5}}onCreateEffect(){const e=new A.POSTPROCESSING.MODULE.VignetteEffect;return this.intensity.onValueChanged=t=>{e.offset=t,this.updateDarkness(e)},this.color.onValueChanged=t=>{this.updateDarkness(e)},e}updateDarkness(e){const t=this.intensity.value;e.darkness=t}}Fy([m(N)],la.prototype,"color"),Fy([m(N)],la.prototype,"intensity"),Fy([m(N)],la.prototype,"center"),us("Vignette",la),globalThis.NEEDLE_USE_POSTPROCESSING=globalThis.NEEDLE_USE_POSTPROCESSING!==void 0?globalThis.NEEDLE_USE_POSTPROCESSING:!0;const io=C("debugpost"),Uy=Symbol("needle:postprocessing-handler"),Oh=Symbol("needle:previous-autoclear-state"),kh=Symbol("needle:previous-tone-mapping");class zy{constructor(e){a(this,"_composer",null),a(this,"_lastVolumeComponents"),a(this,"_effects",[]),a(this,"_isActive",!1),a(this,"context"),a(this,"_anyPassHasDepth",!1),a(this,"_anyPassHasNormal",!1),a(this,"_hasSmaaEffect",!1),a(this,"_customInputBuffer",null),a(this,"_customInputBufferId",0),a(this,"_multisampling",0),a(this,"_menuEntry",null),a(this,"_passIndices",null),this.context=e}getEffectIsActive(e){return e?this._isActive&&this._effects.some(t=>t.effect===e):!1}get isActive(){return this._isActive}get composer(){return this._composer}apply(e){return this._isActive=!0,this.onApply(this.context,e)}unapply(e=!0){var t,s;if(io&&console.log("Unapplying postprocessing effects"),this._isActive=!1,this._lastVolumeComponents){for(const r of this._lastVolumeComponents)r.unapply();this._lastVolumeComponents.length=0}const o=this.context;o[Uy]===this&&(delete o[Uy],typeof o.renderer[Oh]=="boolean"&&(o.renderer.autoClear=o.renderer[Oh]),typeof o.renderer[kh]=="number"&&(o.renderer.toneMapping=o.renderer[kh])),(t=this._composer)==null||t.removeAllPasses(),e&&((s=this._composer)==null||s.dispose()),o.composer===this._composer&&(o.composer=null)}dispose(){this.unapply(!0);for(const e of this._effects)e.effect.dispose();this._effects.length=0,this._composer=null}async onApply(e,t){if(!t)return;await Promise.all([A.POSTPROCESSING.load(),A.POSTPROCESSING_AO.load()]),e[Uy]=this,io&&console.log("Apply Postprocessing Effects",t),this._lastVolumeComponents=[...t],this._effects.length=0;const s={handler:this,components:this._lastVolumeComponents};for(let o=0;o<this._lastVolumeComponents.length;o++){const r=this._lastVolumeComponents[o];if(r.context=e,r.apply){if(r.active){if(!e.mainCameraComponent){console.error("No camera in scene found or available yet - can not create postprocessing effects");return}const l=r.apply(s);if(!l)continue;if(Array.isArray(l))for(const c of l)this._effects.push({effect:c,typeName:r.typeName,priority:r.order});else this._effects.push({effect:l,typeName:r.typeName,priority:r.order})}}else r.active&&be("Volume component is not a VolumeComponent: "+r.__type)}this.applyEffects(e)}get anyPassHasDepth(){return this._anyPassHasDepth}get anyPassHasNormal(){return this._anyPassHasNormal}get hasSmaaEffect(){return this._hasSmaaEffect}set multisampling(e){this._multisampling=e}get multisampling(){return this._multisampling}applyEffects(e){var t;if(this._anyPassHasDepth=!1,this._anyPassHasNormal=!1,this._hasSmaaEffect=!1,this._effects.length<=0)return;const s=e.mainCameraComponent,o=e.renderer,r=e.scene,l=s.threeCamera;if(typeof o[Oh]=="boolean"&&(o.autoClear=o[Oh]),o[Oh]=o.autoClear,typeof o[kh]=="number"&&(o.toneMapping=o[kh]),o[kh]=o.toneMapping,o.toneMapping!=bd&&!this._effects.find(p=>p instanceof A.POSTPROCESSING.MODULE.ToneMappingEffect)){const p=new A.POSTPROCESSING.MODULE.ToneMappingEffect;p.name=`ToneMapping (${o.toneMapping})`,p.mode=Wp(o.toneMapping),this._effects.push({typeName:"ToneMapping",effect:p,priority:ft.ToneMapping})}this._composer||(this._composer=new A.POSTPROCESSING.MODULE.EffectComposer(o,{frameBufferType:zm,stencilBuffer:!0})),e.composer&&e.composer!==this._composer&&console.warn("There's already an active EffectComposer in your scene: replacing it with a new one. This might cause unexpected behaviour. Make sure to only use one PostprocessingManager/Volume in your scene."),e.composer=this._composer;const c=e.composer;c.setMainCamera(l),c.setRenderer(o),c.setMainScene(r),c.autoRenderToScreen=!0,c.multisampling=0;for(const p of c.passes)p.dispose();c.removeAllPasses();const h=new A.POSTPROCESSING.MODULE.RenderPass(r,l);h.name="RenderPass",h.mainScene=r,c.addPass(h);const d=h.render;(t=this._customInputBuffer)==null||t.dispose(),this._customInputBuffer=null,h.render=(p,g,f,y,v)=>{var b;g&&(g.samples=0,f&&(f.samples=0),(!this._customInputBuffer||this._customInputBuffer.width!==g.width||this._customInputBuffer.height!==g.height||this._customInputBuffer.samples!==this._multisampling||this._customInputBuffer.texture.format!==g.texture.format||this._customInputBuffer.texture.type!==zm)&&((b=this._customInputBuffer)==null||b.dispose(),this._customInputBuffer=new $s(g.width,g.height,{format:g.texture.format,type:zm,depthBuffer:g.depthBuffer,depthTexture:g.depthTexture?new Lv(g.width,g.height):void 0,stencilBuffer:g.stencilBuffer,samples:Math.max(0,this._multisampling),minFilter:g.texture.minFilter??xd,magFilter:g.texture.magFilter??xd,generateMipmaps:g.texture.generateMipmaps}),this._customInputBufferId++,this._customInputBuffer.texture.name=`CustomInputBuffer-${this._customInputBufferId}`,this._customInputBuffer.depthTexture&&g.depthTexture&&(this._customInputBuffer.depthTexture.format=g.depthTexture.format,this._customInputBuffer.depthTexture.type=g.depthTexture.type),this._customInputBuffer.samples>0&&(this._customInputBuffer.ignoreDepthForMultisampleCopy=!1),io&&console.warn(`[PostProcessing] Input buffer created with size ${this._customInputBuffer.width}x${this._customInputBuffer.height} and samples ${this._customInputBuffer.samples}`)),d.call(h,p,this._customInputBuffer,f,y,v),Zl.blit(this._customInputBuffer.texture,g,{renderer:p,depthTexture:this._customInputBuffer.depthTexture,depthWrite:!0,depthTest:!0}))};try{T2(this._effects);let p=!1,g=null;for(let v=this._effects.length-1;v>=0;v--){const b=this._effects[v].effect;if(b instanceof A.POSTPROCESSING.MODULE.ToneMappingEffect){if(p){io&&console.warn(`[PostProcessing] Found multiple tonemapping effects in the scene: ${b.name} and ${g?.name}. Only the last one added will be used.`),this._effects.splice(v,1);continue}g=b,p=!0}}const f=[];let y=!1;for(let v=0;v<this._effects.length;v++){const b=this._effects[v].effect;if(b instanceof A.POSTPROCESSING.MODULE.SMAAEffect?this._hasSmaaEffect=!0:b instanceof A.POSTPROCESSING.MODULE.NormalPass&&(this._anyPassHasNormal=!0),!(b instanceof A.POSTPROCESSING.MODULE.ToneMappingEffect&&g!==b))if(b instanceof A.POSTPROCESSING.MODULE.Effect){const _=b.getAttributes(),w=A.POSTPROCESSING.MODULE.EffectAttribute.CONVOLUTION;_&w&&(io&&console.log("[PostProcessing] Convolution effect: "+b.name),y&&(io&&console.log("[PostProcessing] Merging effects with convolution",f.map(x=>x.name).join(", ")),this.createPassForMergeableEffects(f,c,l,r)),y=!0),f.push(b)}else b instanceof A.POSTPROCESSING.MODULE.Pass?(y=!1,this.createPassForMergeableEffects(f,c,l,r),b.renderToScreen=!1,c.addPass(b)):(y=!1,this.createPassForMergeableEffects(f,c,l,r),c.addPass(b))}this.createPassForMergeableEffects(f,c,l,r)}catch(p){console.error("Error while applying postprocessing effects",p),c.passes.forEach(g=>g.dispose()),c.removeAllPasses()}let u=!1;for(let p=c.passes.length-1;p>=0;p--){const g=c.passes[p];let f=!1,y=!1;g.enabled&&(u||(f=!0,y=!0),u=!0),g.renderToScreen=y,g?.configuration!==void 0?g.configuration.gammaCorrection=f:"autosetGamma"in g&&(g.autosetGamma=f),this._anyPassHasDepth||(this._anyPassHasDepth=g.needsDepthTexture)}io&&console.log("[PostProcessing] Passes \u2192",[...c.passes],`
|
|
1318
|
+
---------------------------------
|
|
1319
|
+
\u2022 `+c.passes.map(p=>p.name).join(`
|
|
1320
|
+
\u2022 `)+`
|
|
1321
|
+
`),io&&this._onCreateEffectsDebug(this._composer,l)}createPassForMergeableEffects(e,t,s,o){if(e.length>0){const r=new A.POSTPROCESSING.MODULE.EffectPass(s,...e);r.name=e.map(l=>l.name).join(", "),r.mainScene=o,r.enabled=!0,r.renderToScreen=!1,t.addPass(r),e.length=0}}_onCreateEffectsDebug(e,t){if(io==="passes"){const s=new A.POSTPROCESSING.MODULE.DepthEffect({blendFunction:A.POSTPROCESSING.MODULE.BlendFunction.NORMAL,inverted:!0});s.name="Depth Effect";const o=new A.POSTPROCESSING.MODULE.EffectPass(t,s);if(o.name="Depth Effect Pass",o.enabled=!1,e.passes.push(o),this._passIndices!==null){const l=[e.passes[0]];this._passIndices.length>0&&l.push(...this._passIndices.filter(c=>c!==0).map(c=>e.passes[c]).filter(c=>c)),l.length>0&&console.log("[PostProcessing] Passes (selected) \u2192",l),e.passes.length=0;for(const c of l)c.enabled=!0,c.renderToScreen=!1,e.addPass(c)}const r=this.context.menu;if(r&&this._passIndices===null){this._menuEntry&&this._menuEntry.remove();const l=document.createElement("select");l.multiple=!0;const c=document.createElement("option");c.innerText="Final Output",c.value="-1",l.appendChild(c);for(const h of e.passes){const d=document.createElement("option");d.innerText=h.name,d.value=`${e.passes.indexOf(h)}`,d.title=h.name,l.appendChild(d)}r.appendChild(l),this._menuEntry=l,l.addEventListener("change",()=>{const h=Array.from(l.selectedOptions).map(d=>parseInt(d.value));h.length===1&&h[0]===-1?this._passIndices=null:this._passIndices=h,this.applyEffects(this.context)})}}}}var aI=Object.defineProperty,bS=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&aI(e,t,o),o};const ca=C("debugpost");class kl extends I{constructor(){super(...arguments),a(this,"sharedProfile"),a(this,"multisampling","auto"),a(this,"_postprocessing"),a(this,"_activeEffects",[]),a(this,"_effects",[]),a(this,"_componentEnabledTime",-1),a(this,"_multisampleAutoChangeTime",0),a(this,"_multisampleAutoDecreaseTime",0),a(this,"_lastApplyTime"),a(this,"_rapidApplyCount",0),a(this,"_isDirty",!1),a(this,"_modificationQueue"),a(this,"_recreateId",-1)}get isPostProcessingManager(){return!0}get effects(){return this._activeEffects}get dirty(){return this._isDirty}set dirty(e){this._isDirty=e}addEffect(e){let t=e;return t instanceof rt||(t=new xh(t)),t.gameObject===void 0&&this.gameObject.addComponent(t),this._effects.includes(t)||(this._effects.push(t),this._isDirty=!0),e}removeEffect(e){var t,s,o,r;let l=-1;if(e instanceof rt?l=this._effects.indexOf(e):l=this._effects.findIndex(c=>c instanceof xh&&c.effect===e),l!==-1)return this._effects.splice(l,1),this._isDirty=!0,e;if(e instanceof rt){const c=(s=(t=this.sharedProfile)==null?void 0:t.components)==null?void 0:s.indexOf(e);c!==void 0&&c!==-1&&(this._isDirty=!0,(r=(o=this.sharedProfile)==null?void 0:o.components)==null||r.splice(c,1))}return e}markDirty(){this._isDirty=!0}awake(){var e;ca&&(console.log("PostprocessingManager Awake",this),console.log("Press P to toggle post processing"),window.addEventListener("keydown",t=>{t.key==="p"&&(this.enabled=!this.enabled,De("Toggle PostProcessing "+this.name+": Enabled="+this.enabled),this.markDirty())})),(e=this.sharedProfile)==null||e.__init(this)}onEnable(){this._componentEnabledTime=this.context.time.realtimeSinceStartup,this._isDirty=!0}onDisable(){var e;(e=this._postprocessing)==null||e.unapply(),this._isDirty=!1}onBeforeRender(){if(!this.context.isInXR&&(this.context.mainCamera&&this._isDirty&&this.apply(),this.context.composer&&this._postprocessing&&this._postprocessing.composer===this.context.composer)){if(this.context.renderer.getContext().isContextLost()&&this.context.renderer.forceContextRestore(),this.context.composer.getRenderer()!==this.context.renderer&&this.context.composer.setRenderer(this.context.renderer),this.context.composer.setMainScene(this.context.scene),this.multisampling==="auto")if(this._postprocessing&&this._postprocessing.hasSmaaEffect)this._postprocessing.multisampling!==0&&(this._postprocessing.multisampling=0,(ca||F())&&console.warn("[PostProcessing] Disabling multisampling you're using SMAA and have set the 'multisampling: auto' on your PostprocessingManager/Volume component. If you need anti-aliasing, consider adding an Antialiasing component or SMAA effect to the PostprocessingManager."));else{const e=this.context.time.realtimeSinceStartup-this._multisampleAutoChangeTime;if(this.context.time.realtimeSinceStartup-this._componentEnabledTime>2&&e>.5){const t=this._postprocessing.multisampling;if(this._postprocessing.multisampling>0&&this.context.time.smoothedFps<=50){this._multisampleAutoChangeTime=this.context.time.realtimeSinceStartup,this._multisampleAutoDecreaseTime=this.context.time.realtimeSinceStartup;let s=this._postprocessing.multisampling*.5;s=Math.floor(s),s!=this._postprocessing.multisampling&&(this._postprocessing.multisampling=s),ca&&console.debug(`[PostProcessing] Reduced multisampling from ${t} to ${this._postprocessing.multisampling}`)}else if(e>1&&this.context.time.smoothedFps>=59&&this._postprocessing.multisampling<this.context.renderer.capabilities.maxSamples&&this.context.time.realtimeSinceStartup-this._multisampleAutoDecreaseTime>10){this._multisampleAutoChangeTime=this.context.time.realtimeSinceStartup;let s=this._postprocessing.multisampling<=0?1:this._postprocessing.multisampling*2;s=Math.floor(s),s!==this._postprocessing.multisampling&&(this._postprocessing.multisampling=s),ca&&console.debug(`[PostProcessing] Increased multisampling from ${t} to ${this._postprocessing.multisampling}`)}}}else{const e=Math.max(0,Math.min(this.multisampling,this.context.renderer.capabilities.maxSamples));e!==this._postprocessing.multisampling&&(this._postprocessing.multisampling=e)}if(this.context.mainCamera){const e=this.context.composer.passes;for(const t of e)if(t.mainCamera&&t.mainCamera!==this.context.mainCamera){this.context.composer.setMainCamera(this.context.mainCamera);break}}}}onDestroy(){var e;(e=this._postprocessing)==null||e.dispose()}apply(){var e,t,s;if(ca&&console.log(`Apply PostProcessing "${this.name||"unnamed"}"`),F()&&(this._lastApplyTime!==void 0&&Date.now()-this._lastApplyTime<100&&(this._rapidApplyCount++,this._rapidApplyCount===5&&console.warn("Detected rapid post processing modifications - this might be a bug",this)),this._lastApplyTime=Date.now()),this._isDirty=!1,this._activeEffects.length=0,(e=this.sharedProfile)!=null&&e.components){const o=this.sharedProfile.components;for(const r of o)r.active&&r.enabled&&!this._activeEffects.includes(r)&&this._activeEffects.push(r)}for(const o of this._effects)o.active&&o.enabled&&!this._activeEffects.includes(o)&&this._activeEffects.push(o);this._activeEffects.length>0?(this._postprocessing||(this._postprocessing=new zy(this.context)),(t=this._postprocessing.apply(this._activeEffects))==null||t.then(()=>{this.activeAndEnabled&&(this._applyPostQueue(),this._postprocessing?(this.multisampling==="auto"?this._postprocessing.multisampling=X.isMobileDevice()?2:4:this._postprocessing.multisampling=Math.max(0,Math.min(this.multisampling,this.context.renderer.capabilities.maxSamples)),ca&&console.debug(`[PostProcessing] Set multisampling to ${this._postprocessing.multisampling} (Is Mobile: ${X.isMobileDevice()})`)):ca&&console.warn("[PostProcessing] No composer found"))})):(s=this._postprocessing)==null||s.unapply(!1)}_applyPostQueue(){if(this._modificationQueue){for(const e of this._modificationQueue.values())this.onEditorModification(e);this._modificationQueue.clear()}}onEditorModification(e){var t,s;if(e.propertyName.startsWith("postprocessing.")){if(!this._postprocessing)return this._modificationQueue||(this._modificationQueue=new Map),this._modificationQueue.set(e.propertyName,e),!0;if(!((t=this._activeEffects)!=null&&t.length))return;const o=e.propertyName.split(".");if(o.length===3||o.length===4){const r=o[1],l=o[2];for(const c of this._activeEffects)if(((s=c.typeName)==null?void 0:s.toLowerCase())===r.toLowerCase()){if(l==="active"){c.active=e.value,this.scheduleRecreate();return}if(!$p.has(r)){const h=new Array;$p.set(r,h);const d=Object.keys(c);for(const u of d)c[u]instanceof N&&h.push(u)}if($p.has(r)){const h=l.toLowerCase(),d=$p.get(r);for(const u of d)if(u.toLowerCase()===h){const p=c[u];p instanceof N&&(o.length===4&&o[3]==="active"?(p.overrideState=e.value,this.scheduleRecreate()):p&&p.value!==void 0&&(p.value=e.value));return}}console.warn("Unknown modification",l);return}}return!0}return!1}scheduleRecreate(){const e=++this._recreateId;setTimeout(()=>{e===this._recreateId&&(this.onDisable(),this.onEnable())},200)}}bS([Dr(Fp)],kl.prototype,"sharedProfile"),bS([Dr()],kl.prototype,"multisampling");const $p=new Map;M2(kl);async function Ny(n){const{NeedleEngineWebComponent:e}=await Promise.resolve().then(()=>DL);e.observedAttributes.includes(n)||e.observedAttributes.push(n)}var lI=Object.defineProperty,Pt=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&lI(e,t,o),o};const Ht=C("debugsceneswitcher"),cI=C("sceneswitcher:clearscene"),Hp="scene";Ny(Hp);const rr=Promise.resolve(!1);class Ze extends I{constructor(){super(...arguments),a(this,"autoLoadFirstScene",!0),a(this,"scenes",[]),a(this,"loadingScene"),a(this,"queryParameterName","scene"),a(this,"useSceneName",!0),a(this,"clamp",!0),a(this,"useHistory",!0),a(this,"useKeyboard",!0),a(this,"useSwipe",!0),a(this,"useSceneLighting",!0),a(this,"useSceneBackground",!0),a(this,"preloadNext",1),a(this,"preloadPrevious",1),a(this,"preloadConcurrent",2),a(this,"createMenuButtons",!1),a(this,"sceneLoadingStart",new xe),a(this,"sceneLoadingProgress",new xe),a(this,"sceneLoaded",new xe),a(this,"_currentIndex",-1),a(this,"_currentScene"),a(this,"_engineElementOverserver"),a(this,"_preloadScheduler"),a(this,"_menuButtons"),a(this,"onPopState",async e=>{if(!this.useHistory)return;const t=this.useHistory;try{this.useHistory=!1;let s=!1;if(this.queryParameterName&&(s=await this.tryLoadFromQueryParam()),!s){const o=e?.state;if(o&&o.startsWith(this.guid)){const r=o.substr(this.guid.length+2);Ht&&console.log("PopState",r),await this.trySelectSceneFromValue(r)}}}finally{this.useHistory=t}}),a(this,"normalizedSwipeThresholdX",.1),a(this,"_didSwipe",!1),a(this,"onInputPointerMove",e=>{if(this.useSwipe&&!this._didSwipe&&e.button===0&&e.pointerType==="touch"&&this.context.input.getPointerPressedCount()===1){const t=this.context.input.getPointerPositionDelta(e.button);if(t){const s=t.x/this.context.domWidth;s>=this.normalizedSwipeThresholdX?(this._didSwipe=!0,this.selectPrev()):s<=-this.normalizedSwipeThresholdX&&(this._didSwipe=!0,this.selectNext())}}}),a(this,"onInputPointerUp",e=>{e.button===0&&(this._didSwipe=!1)}),a(this,"onInputKeyDown",e=>{if(!this.useKeyboard||!this.scenes)return;const t=e.key.toLowerCase();if(!t)return;const s=parseInt(t)-1;if(s>=0){this.trySelectSceneFromValue(s);return}switch(t){case"arrowright":case"d":this.selectNext();break;case"arrowleft":case"a":this.selectPrev();break}}),a(this,"__lastSwitchScene"),a(this,"__lastSwitchScenePromise"),a(this,"_currentlyLoadingScene"),a(this,"_lastLoadingScene"),a(this,"_loadingScenePromise"),a(this,"_isCurrentlyLoading",!1),a(this,"_currentLoadingProgress")}get currentIndex(){return this._currentIndex}get currentLoadingProgress(){return this._currentLoadingProgress}get currentlyLoadingScene(){return this._currentlyLoadingScene}get currentlyLoadedScene(){return this._currentScene}awake(){this.scenes===void 0&&(this.scenes=[]);for(const e of this.scenes)e&&!e.hasUrl&&e.asset instanceof E?P.remove(e.asset):e instanceof E&&P.remove(e);Ht&&console.log("SceneSwitcher",this)}async onEnable(){if(globalThis.addEventListener("popstate",this.onPopState),this.context.input.addEventListener(Be.KeyDown,this.onInputKeyDown),this.context.input.addEventListener(Be.PointerMove,this.onInputPointerMove),this.context.input.addEventListener(Be.PointerUp,this.onInputPointerUp),this._engineElementOverserver||(this._engineElementOverserver=new MutationObserver(e=>{for(const t of e)if(t.type==="attributes"&&t.attributeName===Hp){const s=this.context.domElement.getAttribute(Hp);s!==null&&this.trySelectSceneFromValue(s)}})),this._engineElementOverserver.observe(this.context.domElement,{attributes:!0}),this._preloadScheduler||(this._preloadScheduler=new hI(this)),this._preloadScheduler.maxLoadAhead=this.preloadNext,this._preloadScheduler.maxLoadBehind=this.preloadPrevious,this._preloadScheduler.maxConcurrent=this.preloadConcurrent,this._preloadScheduler.begin(2e3),this.autoLoadFirstScene&&this._currentIndex===-1&&!await this.tryLoadFromQueryParam()){const e=this.context.domElement.getAttribute(Hp);try{(e===null||!await this.trySelectSceneFromValue(e))&&this._currentIndex===-1&&this.select(0)}finally{}}this.createMenuButtons&&(this._menuButtons??(this._menuButtons=[]),this._menuButtons.push(this.context.menu.appendChild({label:"Previous",icon:"arrow_back_ios",onClick:()=>this.selectPrev(),priority:-1005,class:"row2"})),this._menuButtons.push(this.context.menu.appendChild({label:"Next",icon:"arrow_forward_ios",iconSide:"right",onClick:()=>this.selectNext(),priority:-1e3,class:"row2"})))}onDisable(){var e;if(globalThis.removeEventListener("popstate",this.onPopState),this.context.input.removeEventListener(Be.KeyDown,this.onInputKeyDown),this.context.input.removeEventListener(Be.PointerMove,this.onInputPointerMove),this.context.input.removeEventListener(Be.PointerUp,this.onInputPointerUp),(e=this._preloadScheduler)==null||e.stop(),this._menuButtons){for(const t of this._menuButtons)t.remove();this._menuButtons=void 0}}addScene(e){if(typeof e=="string"){let t=this.context.addressables.findAssetReference(e);return t||(t=new ce(e),this.context.addressables.registerAssetReference(t)),this.scenes.push(t),t}return this.scenes.push(e),e}selectNext(){return this.select(this._currentIndex+1)}selectPrev(){return this.select(this._currentIndex-1)}select(e){var t,s,o;if(Ht&&console.log("select",e),typeof e=="object"&&console.warn('Switching to "'+e+'" might not work. Please either use an index or a AssetReference (not a scene reference)'),typeof e=="string"){const l=(t=this.scenes)==null?void 0:t.find(c=>c.url===e);if(!l){const c=ce.getOrCreate(this.sourceId??"",e,this.context);return this.switchScene(c)}if(l)e=(s=this.scenes)==null?void 0:s.indexOf(l);else return rr}if(!((o=this.scenes)!=null&&o.length))return rr;if(e<0){if(this.clamp)return rr;e=this.scenes.length-1}else if(e>=this.scenes.length){if(this.clamp)return rr;e=0}const r=this.scenes[e];return this.switchScene(r)}unload(){return this.__lastSwitchScene=void 0,this.__lastSwitchScenePromise=void 0,this.__unloadCurrentScene()}async reload(){if(this.__lastSwitchScene){const e=this.__lastSwitchScene;return this.__lastSwitchScene=void 0,this.switchScene(e)}return!1}async switchScene(e){var t;if(!(e instanceof ce)){const s=typeof e;if(s==="string")return this.select(e);if(s==="number")return this.select(e);if(e&&e instanceof E){const o=(t=this.scenes)==null?void 0:t.indexOf(e);e=new ce(e.name,void 0,e),o>=0&&(this.scenes[o]=e)}else return console.warn(`[SceneSwitcher] Can't switch to scene of type ${s}`),!1}return e.url===this.sourceId?(console.warn("[SceneSwitcher] Can't load own scene - prevent recursive loading",this.sourceId),!1):this.__lastSwitchScene===e&&this.__lastSwitchScenePromise?this.__lastSwitchScenePromise:(this.__lastSwitchScene=e,this.__lastSwitchScenePromise=this.__internalSwitchScene(e),await this.__lastSwitchScenePromise)}async __unloadCurrentScene(){const e=this._currentScene;if(this._currentScene=void 0,e){Ht&&console.log("UNLOAD",e.url,"HasURL?: "+e.hasUrl);const t=this.tryGetSceneEventListener(e.asset);if(t!=null&&t.sceneClosing){const s=t.sceneClosing();s instanceof Promise&&await s}e.hasUrl?e.unload():e.asset instanceof E&&P.remove(e.asset)}}async __internalSwitchScene(e){var t,s,o,r,l;await this.__unloadCurrentScene();const c=this._currentIndex=((t=this.scenes)==null?void 0:t.indexOf(e))??-1;try{this._currentlyLoadingScene=e,this._currentLoadingProgress=new ProgressEvent("progress",{loaded:0,total:1});const h=new CustomEvent("loadscene-start",{detail:{scene:e,switcher:this,index:c}});this.dispatchEvent(h),(s=this.sceneLoadingStart)==null||s.invoke(h.detail),await this.onStartLoading(),await e.loadAssetAsync((u,p)=>{var g;if(Ht){const f=p.loaded/p.total,y="["+"=".repeat(Math.floor(f*20))+"-".repeat(20-Math.floor(f*20))+"]";console.debug(`[SceneSwitcher] Download ${(f*100).toFixed(1)} % ${y}`,e.url)}this._currentLoadingProgress=p,this.dispatchEvent(p),(g=this.sceneLoadingProgress)==null||g.invoke(p)}).catch(console.error),await this.onEndLoading();const d=new CustomEvent("loadscene-finished",{detail:{scene:e,switcher:this,index:c}});if(this.dispatchEvent(d),this._currentLoadingProgress=void 0,this._currentlyLoadingScene=void 0,d.defaultPrevented)return Ht&&console.warn("Adding loaded scene prevented:",e,d),!1;if(!e.asset)return Ht&&console.warn("Failed loading scene:",e),!1;if(this._currentIndex===c){if(Ht&&console.log("ADD",e.url),this._currentScene=e,cI){const g=((o=this.context.mainCameraComponent)==null?void 0:o.gameObject)||this.context.mainCamera;g?.removeFromParent();const f=this.gameObject.removeFromParent();Ai(this.context.scene,!0,!0),this.context.scene=new xi,this.context.scene.add(f),g&&this.context.scene.add(g)}if(P.add(e.asset,this.gameObject),this.useSceneLighting&&this.context.sceneLighting.enable(e),this.useSceneBackground){const g=this.context.lightmaps.tryGetSkybox(e.url);g?(g.mapping=kn,this.context.scene.background=g):Ht&&console.warn("SceneSwitcher: Can't find skybox for scene "+e.url)}if(this.useHistory&&c>=0){let g=c.toString();if(this.useSceneName&&(e instanceof E?g=e.name:e.url&&(g=_S(e.url))),(r=this.queryParameterName)!=null&&r.length)Hl(this.queryParameterName,g,this.useHistory);else{const f=history.state,y=this.guid+"::"+c;f!==y&&history.pushState(y,"unused",location.href)}}const u=this.tryGetSceneEventListener(e.asset);if(u!=null&&u.sceneOpened){const g=u.sceneOpened(this);g instanceof Promise&&await g}const p=new CustomEvent("scene-opened",{detail:{scene:e,switcher:this,index:c}});return this.dispatchEvent(p),(l=this.sceneLoaded)==null||l.invoke(this),!0}}catch(h){console.error(h)}return!1}preload(e){if(e>=0&&e<this.scenes.length){const t=this.scenes[e];if(t instanceof ce)return t.preload()}return rr}tryLoadFromQueryParam(){var e;if(!((e=this.queryParameterName)!=null&&e.length))return rr;const t=C(this.queryParameterName);return typeof t=="boolean"?rr:this.trySelectSceneFromValue(t)}trySelectSceneFromValue(e){if(typeof e=="string"){const t=parseInt(e);if(t>=0&&t<this.scenes.length)return this.select(t);{const s=e.toLowerCase();for(let o=0;o<this.scenes.length;o++){const r=this.scenes[o];if(!!r&&(r instanceof E?r.name:_S(r.url)).toLowerCase().includes(s))return this.select(o)}}}else if(typeof e=="number"&&e>=0&&e<this.scenes.length)return this.select(e);return Xt()&&console.warn('Can not find scene: "'+e+'"',this),rr}async onStartLoading(){var e,t;if(this._isCurrentlyLoading=!0,this.loadingScene&&(this._lastLoadingScene!==this.loadingScene&&(this._loadingScenePromise=void 0),this._lastLoadingScene=this.loadingScene,this._loadingScenePromise||(this._loadingScenePromise=(e=this.loadingScene)==null?void 0:e.loadAssetAsync().then(s=>s!=null)),await this._loadingScenePromise,this._isCurrentlyLoading&&(t=this.loadingScene)!=null&&t.asset)){Ht&&console.log("Add loading scene",this.loadingScene.url,this.loadingScene.asset);const s=this.loadingScene.asset;P.add(s,this.gameObject);const o=this.tryGetSceneEventListener(s);if(o!=null&&o.sceneOpened){const r=o.sceneOpened(this);r instanceof Promise&&await r}}if(this._isCurrentlyLoading){const s=this.tryGetSceneEventListener(this.gameObject);if(s&&s.sceneOpened){const o=s.sceneOpened(this);o instanceof Promise&&await o}}}async onEndLoading(){var e;if(this._isCurrentlyLoading=!1,(e=this.loadingScene)!=null&&e.asset){Ht&&console.log("Remove loading scene",this.loadingScene.url);const t=this.loadingScene.asset,s=this.tryGetSceneEventListener(t);if(typeof s?.sceneClosing=="function"){const o=s.sceneClosing();o instanceof Promise&&await o}P.remove(t)}if(!this._isCurrentlyLoading){const t=this.tryGetSceneEventListener(this.gameObject);if(t&&t.sceneClosing){const s=t.sceneClosing();s instanceof Promise&&await s}}}tryGetSceneEventListener(e,t=0){if(!e)return null;const s=P.foreachComponent(e,o=>{const r=o;if(r.sceneClosing||r.sceneOpened)return r});if(t===0&&!s&&e.children.length)for(const o of e.children){const r=this.tryGetSceneEventListener(o,t+1);if(r)return r}return s||null}}Pt([m()],Ze.prototype,"autoLoadFirstScene"),Pt([m(ce)],Ze.prototype,"scenes"),Pt([m(ce)],Ze.prototype,"loadingScene"),Pt([m()],Ze.prototype,"queryParameterName"),Pt([m()],Ze.prototype,"useSceneName"),Pt([m()],Ze.prototype,"clamp"),Pt([m()],Ze.prototype,"useHistory"),Pt([m()],Ze.prototype,"useKeyboard"),Pt([m()],Ze.prototype,"useSwipe"),Pt([m()],Ze.prototype,"useSceneLighting"),Pt([m()],Ze.prototype,"useSceneBackground"),Pt([m()],Ze.prototype,"preloadNext"),Pt([m()],Ze.prototype,"preloadPrevious"),Pt([m()],Ze.prototype,"preloadConcurrent"),Pt([m()],Ze.prototype,"createMenuButtons"),Pt([m(xe)],Ze.prototype,"sceneLoadingStart"),Pt([m(xe)],Ze.prototype,"sceneLoadingProgress"),Pt([m(xe)],Ze.prototype,"sceneLoaded");function _S(n){const e=n.split("/").pop(),t=e?.split(".").shift();return t!=null&&t.length?t:n}class hI{constructor(e,t=1,s=1,o=2){a(this,"maxLoadAhead"),a(this,"maxLoadBehind"),a(this,"maxConcurrent"),a(this,"_isRunning",!1),a(this,"_switcher"),a(this,"_loadTasks",[]),a(this,"_maxConcurrentLoads",1),this._switcher=e,this.maxLoadAhead=t,this.maxLoadBehind=s,this.maxConcurrent=o}begin(e){if(this._isRunning)return;Ht&&console.log("Preload begin",{delay:e}),this._isRunning=!0;let t=-10,s,o;const r=this._switcher.scenes,l=Date.now()+e,c=setInterval(()=>{if(this.allLoaded()&&(Ht&&console.log("All scenes (pre-)loaded"),this.stop()),!this._isRunning){clearInterval(c);return}if(Date.now()<l||this.canLoadNewScene()===!1)return;(t===-10||t!==this._switcher.currentIndex)&&(t=this._switcher.currentIndex,o=0,s=0);const h=o%2===0;h&&(s+=1),o+=1;const d=h?this.maxLoadAhead:this.maxLoadBehind;if(s>d)return;const u=h?t+s:t-s;if(!(u<0)&&!(u<0||u>=r.length)&&!this._loadTasks.some(p=>p.index===u)){const p=r[u];Ht&&console.log("Preload scene",{roomIndex:u,searchForward:h,lastRoom:t,currentIndex:this._switcher.currentIndex,tasks:this._loadTasks.length},p?.url),new dI(u,p,this._loadTasks)}},200)}stop(){this._isRunning=!1}canLoadNewScene(){return this._loadTasks.length<this._maxConcurrentLoads}allLoaded(){if(this._switcher.scenes){for(const e of this._switcher.scenes)if(e!=null&&e.isLoaded&&e.isLoaded()===!1)return!1}return!0}}class dI{constructor(e,t,s){a(this,"index"),a(this,"asset"),a(this,"tasks"),this.index=e,this.asset=t,this.tasks=s,s.push(this),this.awaitLoading()}async awaitLoading(){this.asset&&!this.asset.isLoaded()&&(Ht&&console.log("Preload start: "+this.asset.url,this.index),await this.asset.preload(),Ht&&console.log("Preload finished: "+this.asset.url,this.index));const e=this.tasks.indexOf(this);e>=0&&this.tasks.splice(e,1)}}function uI(){return new Promise((n,e)=>{const t=()=>{t!=null&&(document.removeEventListener("pointerdown",t),document.removeEventListener("click",t),document.removeEventListener("dragstart",t),document.removeEventListener("touchstart",t),n())};document.addEventListener("pointerdown",t),document.addEventListener("click",t),document.addEventListener("dragstart",t),document.addEventListener("touchstart",t)})}async function pI(n){await uI(),n()}var mI=Object.defineProperty,gI=Object.getOwnPropertyDescriptor,$i=(n,e,t,s)=>{for(var o=s>1?void 0:s?gI(e,t):e,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=(s?l(e,t,o):l(o))||o);return s&&o&&mI(e,t,o),o};const Ot=C("debugvideo");var wS=(n=>(n[n.None=0]="None",n[n.AdjustHeight=1]="AdjustHeight",n[n.AdjustWidth=2]="AdjustWidth",n))(wS||{}),xS=(n=>(n[n.VideoClip=0]="VideoClip",n[n.Url=1]="Url",n))(xS||{}),SS=(n=>(n[n.CameraFarPlane=0]="CameraFarPlane",n[n.CameraNearPlane=1]="CameraNearPlane",n[n.RenderTexture=2]="RenderTexture",n[n.MaterialOverride=3]="MaterialOverride",n))(SS||{});class yt extends I{constructor(){super(),a(this,"playOnAwake",!0),a(this,"aspectMode",0),a(this,"clip",null),a(this,"source",1),a(this,"_url",null),a(this,"renderMode"),a(this,"targetMaterialProperty"),a(this,"targetMaterialRenderer"),a(this,"targetTexture"),a(this,"time",0),a(this,"_playbackSpeed",1),a(this,"_isLooping",!1),a(this,"_muted",!1),a(this,"_audioOutputMode",2),a(this,"playInBackground",!0),a(this,"_crossOrigin","anonymous"),a(this,"_videoElement",null),a(this,"_videoTexture",null),a(this,"_videoMaterial",null),a(this,"_isPlaying",!1),a(this,"wasPlaying",!1),a(this,"visibilityChanged",e=>{switch(document.visibilityState){case"hidden":this.playInBackground||(this.wasPlaying=this._isPlaying,this.pause());break;case"visible":this.wasPlaying&&!this._isPlaying&&this.play();break}}),a(this,"_receivedInput",!1),a(this,"_overlay",null),a(this,"_targetObjects"),a(this,"_updateAspectRoutineId",-1),a(this,"_hls"),a(this,"onHlsAvailable",()=>{var e;Ot&&console.log("HLS: available",this.clip),!(!this.shouldUseM3U||!this.url)&&(this._hls||(this._hls=new Hls),this.videoElement.autoplay=!0,this._hls.loadSource(this.url),this._hls.attachMedia(this.videoElement),(e=this._videoElement)==null||e.play(),Ot&&console.log("HLS: loaded",this.clip))}),pI(()=>{this._receivedInput=!0,this.updateVideoElementSettings()}),this._targetObjects=[],C("videoscreenspace")&&window.addEventListener("keydown",e=>{e.key==="f"&&(this.screenspace=!this.screenspace)})}get url(){return this._url}set url(e){const t=this._url!==e;this.__didAwake?t&&this.setClipURL(e??""):this._url=e}get playbackSpeed(){var e;return((e=this._videoElement)==null?void 0:e.playbackRate)??this._playbackSpeed}set playbackSpeed(e){this._playbackSpeed=e,this._videoElement&&(this._videoElement.playbackRate=e)}get isLooping(){var e;return((e=this._videoElement)==null?void 0:e.loop)??this._isLooping}set isLooping(e){this._isLooping=e,this._videoElement&&(this._videoElement.loop=e)}get currentTime(){var e;return((e=this._videoElement)==null?void 0:e.currentTime)??this.time}set currentTime(e){this._videoElement?this._videoElement.currentTime=e:this.time=e}get isPlaying(){const e=this._videoElement;return!!(e&&(e.currentTime>0&&!e.paused&&!e.ended&&e.readyState>e.HAVE_CURRENT_DATA||e.srcObject&&e.srcObject.active))}get crossOrigin(){var e;return((e=this._videoElement)==null?void 0:e.crossOrigin)??this._crossOrigin}set crossOrigin(e){this._crossOrigin=e,this._videoElement&&(e!==null?this._videoElement.setAttribute("crossorigin",e):this._videoElement.removeAttribute("crossorigin"))}get videoMaterial(){return!this._videoMaterial&&!this.create(!1)?null:this._videoMaterial}get videoTexture(){return!this._videoTexture&&!this.create(!1)?null:this._videoTexture}get videoElement(){return!this._videoElement&&!this.create(!1)?null:this._videoElement}requestPictureInPicture(){return this._videoElement?this._videoElement.requestPictureInPicture():null}get muted(){var e;return((e=this._videoElement)==null?void 0:e.muted)??this._muted}set muted(e){this._muted=e,this._videoElement&&(this._videoElement.muted=e)}get currentVideo(){return this.clip}set audioOutputMode(e){e!==this._audioOutputMode&&(e===1&&F()&&console.warn("VideoAudioOutputMode.AudioSource is not yet implemented"),this._audioOutputMode=e,this.updateVideoElementSettings())}get audioOutputMode(){return this._audioOutputMode}preloadVideo(){Ot&&console.log("Video Preload: "+this.name,this.clip),this.create(!1)}preload(){this.preloadVideo()}setVideo(e){this.clip=e,this.source=0,this._videoElement?(this._videoElement.srcObject=e,this._isPlaying&&this.play(),this.updateAspect()):this.create(this.playOnAwake)}setClipURL(e){this._url!==e&&(this._url=e,this.source=1,Ot&&console.log("set url",e),this._videoElement?e.endsWith(".m3u8")||e.includes(".m3u")?this.ensureM3UCanBePlayed():(this._videoElement.src=e,this._isPlaying&&(this.stop(),this.play())):this.create(this.playOnAwake))}onEnable(){var e,t;Ot&&console.log("VideoPlayer.onEnable",xS[this.source],this.clip,this.url,this),window.addEventListener("visibilitychange",this.visibilityChanged),this.playOnAwake===!0?this.create(!0):this.preloadVideo(),this.screenspace?(e=this._overlay)==null||e.start():(t=this._overlay)==null||t.stop()}onDisable(){var e;window.removeEventListener("visibilitychange",this.visibilityChanged),(e=this._overlay)==null||e.stop(),this.pause()}onDestroy(){var e;this._videoElement&&((e=this.videoElement)==null||e.remove(),this._videoElement=null),this._videoTexture&&(this._videoTexture.dispose(),this._videoTexture=null)}play(){var e,t;if(this._videoElement||this.create(!1),!this._videoElement){Ot&&console.warn("Can not play: no video element found",this);return}if(!(this._isPlaying&&!((e=this._videoElement)!=null&&e.ended)&&!((t=this._videoElement)!=null&&t.paused))){if(this._isPlaying=!0,this._receivedInput||(this._videoElement.muted=!0),this.handleBeginPlaying(!1),this.shouldUseM3U){this.ensureM3UCanBePlayed();return}Ot&&console.log("Video Play()",this.clip,this._videoElement,this.time),this._videoElement.currentTime=this.time,this._videoElement.play().catch(s=>{var o;console.log(s),Ot&&console.error("Error playing video",s,"CODE="+s.code,(o=this.videoElement)==null?void 0:o.src,this),setTimeout(()=>{this._isPlaying&&!this.destroyed&&this.activeAndEnabled&&this.play()},1e3)}),Ot&&console.log("play",this._videoElement,this.time)}}stop(){this._isPlaying=!1,this.time=0,this._videoElement&&(this._videoElement.currentTime=0,this._videoElement.pause(),Ot&&console.log("STOP",this))}pause(){var e,t;this.time=((e=this._videoElement)==null?void 0:e.currentTime)??0,this._isPlaying=!1,(t=this._videoElement)==null||t.pause(),Ot&&console.log("PAUSE",this,this.currentTime)}create(e){let t;switch(this.source){case 0:t=this.clip;break;case 1:t=this.url,!(t!=null&&t.length)&&typeof this.clip=="string"&&(t=this.clip);break}return t?(this._videoElement||(Ot&&console.warn("Create VideoElement",this),this._videoElement=this.createVideoElement(),this.context.domElement.shadowRoot.prepend(this._videoElement),this.updateVideoElementStyles()),typeof t=="string"?(Ot&&console.log("Set Video src",t),this._videoElement.src=t):(Ot&&console.log("Set Video srcObject",t),this._videoElement.srcObject=t),this._videoTexture||(this._videoTexture=new DP(this._videoElement)),this._videoTexture.flipY=!1,this._videoTexture.colorSpace=Mn,e&&this.handleBeginPlaying(e),Ot&&console.log("Video: handle playing done...",t,e),!0):(Ot&&console.warn("No video source set",this),!1)}updateAspect(){this.aspectMode!==0&&this.startCoroutine(this.updateAspectImpl())}get screenspace(){var e;return((e=this._overlay)==null?void 0:e.enabled)??!1}set screenspace(e){var t;if(e){if(!this._videoTexture)return;this._overlay||(this._overlay=new fI(this.context)),this._overlay.add(this._videoTexture)}else(t=this._overlay)==null||t.remove(this._videoTexture);this._overlay&&(this._overlay.enabled=e)}createVideoElement(){const e=document.createElement("video");return this._crossOrigin&&e.setAttribute("crossorigin",this._crossOrigin),Ot&&console.log("created video element",e),e}handleBeginPlaying(e){var t,s;if(!this.activeAndEnabled||!this._videoElement)return;this._targetObjects.length=0;let o=this.gameObject;switch(this.renderMode){case 3:o=(t=this.targetMaterialRenderer)==null?void 0:t.gameObject,o||(o=(s=P.getComponent(this.gameObject,Ui))==null?void 0:s.gameObject);break;case 2:console.error("VideoPlayer renderTexture not implemented yet. Please use material override instead");return}if(!o){console.error("Missing target for video material renderer",this.name,SS[this.renderMode],this);return}const r=o.material;if(r){this._targetObjects.push(o),r!==this._videoMaterial&&(this._videoMaterial=r.clone(),o.material=this._videoMaterial);const l="map",c=this._videoMaterial;if(!this.targetMaterialProperty)c[l]=this._videoTexture;else switch(this.targetMaterialProperty){default:c[l]=this._videoTexture;break}}else{console.warn("Can not play video, no material found, this might be a multimaterial case which is not supported yet");return}this.updateVideoElementSettings(),this.updateVideoElementStyles(),e&&(this.shouldUseM3U&&this.ensureM3UCanBePlayed(),this.play())}updateVideoElementSettings(){if(!this._videoElement)return;this._videoElement.loop=this._isLooping,this._videoElement.currentTime=this.currentTime,this._videoElement.playbackRate=this._playbackSpeed,this._videoElement.playsInline=!0;let e=!this._receivedInput||this.audioOutputMode===0;!e&&this._muted&&(e=!0),this._videoElement.muted=e,this.playOnAwake&&(this._videoElement.autoplay=!0)}updateVideoElementStyles(){this._videoElement&&(this._videoElement.style.userSelect="none",this._videoElement.style.visibility="hidden",this._videoElement.style.display="none",this.updateAspect())}*updateAspectImpl(){const e=++this._updateAspectRoutineId,t=void 0,s=this.clip;for(;e===this._updateAspectRoutineId&&this.aspectMode!==0&&this.clip&&s===this.clip&&this._isPlaying;){if(!s||typeof s=="string")return;let o;for(const r of s.getVideoTracks()){const l=r.getSettings();if(l&&l.width&&l.height){o=l.width/l.height;break}else o=this.context.renderer.domElement.clientWidth/this.context.renderer.domElement.clientHeight}if(o===void 0){for(let r=0;r<10;r++)yield;if(!this.isPlaying)break;continue}if(t===o){yield;continue}for(const r of this._targetObjects){let l=1;if(r.parent){const c=Ge(r.parent);l=c.x/c.y}switch(this.aspectMode){case 1:r.scale.y=1/o*r.scale.x*l;break;case 2:r.scale.x=o*r.scale.y*l;break}}for(let r=0;r<3;r++)yield}}get shouldUseM3U(){return this.url!=null&&(this.url.endsWith(".m3u8")||this.url.endsWith(".m3u"))&&this.source===1}ensureM3UCanBePlayed(){if(!this.shouldUseM3U)return;let e=document.head.querySelector("script[data-hls_library]");e?globalThis.Hls?this.onHlsAvailable():e.addEventListener("load",this.onHlsAvailable):(Ot&&console.log("HLS: load script"),e=document.createElement("script"),e.dataset.hls_library="hls.js",e.src="https://cdn.jsdelivr.net/npm/hls.js@1",e.addEventListener("load",this.onHlsAvailable),document.head.append(e))}}$i([m()],yt.prototype,"playOnAwake",2),$i([m()],yt.prototype,"aspectMode",2),$i([m(URL)],yt.prototype,"clip",2),$i([m()],yt.prototype,"source",2),$i([m(URL)],yt.prototype,"url",1),$i([m()],yt.prototype,"renderMode",2),$i([m()],yt.prototype,"targetMaterialProperty",2),$i([m(Ui)],yt.prototype,"targetMaterialRenderer",2),$i([m(je)],yt.prototype,"targetTexture",2),$i([m()],yt.prototype,"time",2),$i([m()],yt.prototype,"playbackSpeed",1),$i([m()],yt.prototype,"isLooping",1),$i([m()],yt.prototype,"audioOutputMode",1);class fI{constructor(e){a(this,"context"),a(this,"_videos",[]),a(this,"_screenspaceModeQuad"),a(this,"_isInScreenspaceMode",!1),a(this,"_input"),this.context=e,this._input=new yI(this)}get enabled(){return this._isInScreenspaceMode}set enabled(e){e?this.start():this.stop()}add(e){this._videos.indexOf(e)===-1&&this._videos.push(e)}remove(e){if(!e)return;const t=this._videos.indexOf(e);t>=0&&this._videos.splice(t,1)}start(){var e;if(this._isInScreenspaceMode||this._videos.length<0)return;const t=this._videos[this._videos.length-1];if(!t)return;if(this._isInScreenspaceMode=!0,!this._screenspaceModeQuad){if(this._screenspaceModeQuad=wo.createPrimitive(Cr.Quad,{material:new vI(t)}),!this._screenspaceModeQuad)return;this._screenspaceModeQuad.geometry.scale(2,2,2)}const s=this._screenspaceModeQuad;this.context.scene.add(s),this.updateScreenspaceMaterialUniforms();const o=s.material;o?.reset(),(e=this._input)==null||e.enable(o)}stop(){var e;this._isInScreenspaceMode=!1,this._screenspaceModeQuad&&((e=this._input)==null||e.disable(),this._screenspaceModeQuad.removeFromParent())}updateScreenspaceMaterialUniforms(){var e;const t=(e=this._screenspaceModeQuad)==null?void 0:e.material;t&&(t.screenAspect=this.context.domElement.clientWidth/this.context.domElement.clientHeight)}}class yI{constructor(e){a(this,"_onResizeScreenFn"),a(this,"_onKeyUpFn"),a(this,"_onMouseWheelFn"),a(this,"context"),a(this,"overlay"),a(this,"_material"),a(this,"_isPinching",!1),a(this,"_lastPinch",0),this.overlay=e,this.context=e.context}enable(e){this._material=e,window.addEventListener("resize",this._onResizeScreenFn=()=>{this.overlay.updateScreenspaceMaterialUniforms()}),window.addEventListener("keyup",this._onKeyUpFn=o=>{o.key==="Escape"&&this.overlay.stop()}),window.addEventListener("wheel",this._onMouseWheelFn=o=>{this.overlay.enabled&&(e.zoom+=o.deltaY*5e-4,o.preventDefault())},{passive:!1});const t=new re;window.addEventListener("mousemove",o=>{if(this.overlay.enabled&&this.context.input.getPointerPressed(0)){const r=new re(o.movementX,o.movementY);r.x/=this.context.domElement.clientWidth,r.y/=this.context.domElement.clientHeight,t.set(r.x,r.y),t.multiplyScalar(e.zoom/-this.context.time.deltaTime*.01),e.offset=e.offset.add(t)}}),window.addEventListener("pointermove",o=>{this.overlay.enabled&&this.context.input.getPointerPressed(0)&&this.context.input.getTouchesPressedCount()===1&&(t.set(o.movementX,o.movementY),t.multiplyScalar(e.zoom*-this.context.time.deltaTime*.05),e.offset=e.offset.add(t))});let s=0;window.addEventListener("touchstart",o=>{if(o.touches.length<2){this.context.time.time-s<.3&&this.overlay.stop(),s=this.context.time.time;return}this._isPinching=!0,this._lastPinch=0}),window.addEventListener("touchmove",o=>{if(!this._isPinching||!this._material)return;const r=o.touches[0],l=o.touches[1],c=r.clientX-l.clientX,h=r.clientY-l.clientY,d=Math.sqrt(c*c+h*h);if(this._lastPinch!==0){const u=d-this._lastPinch;this._material.zoom-=u*.004}this._lastPinch=d}),window.addEventListener("touchend",()=>{this._isPinching=!1})}disable(){this._onResizeScreenFn&&(window.removeEventListener("resize",this._onResizeScreenFn),this._onResizeScreenFn=void 0),this._onKeyUpFn&&(window.removeEventListener("keyup",this._onKeyUpFn),this._onKeyUpFn=void 0),this._onMouseWheelFn&&(window.removeEventListener("wheel",this._onMouseWheelFn),this._onMouseWheelFn=void 0)}}class vI extends Ws{constructor(e){super(),a(this,"_offset",new re),this.uniforms={map:{value:e},screenAspect:{value:1},offsetScale:{value:new fe(0,0,1,1)}},this.vertexShader=`
|
|
1322
|
+
uniform sampler2D map;
|
|
1323
|
+
uniform float screenAspect;
|
|
1324
|
+
uniform vec4 offsetScale;
|
|
1325
|
+
varying vec2 vUv;
|
|
1326
|
+
|
|
1327
|
+
void main() {
|
|
1328
|
+
|
|
1329
|
+
gl_Position = vec4( position , 1.0 );
|
|
1330
|
+
vUv = uv;
|
|
1331
|
+
vUv.y = 1. - vUv.y;
|
|
1332
|
+
|
|
1333
|
+
// fit into screen
|
|
1334
|
+
ivec2 res = textureSize(map, 0);
|
|
1335
|
+
float videoAspect = float(res.x) / float(res.y);
|
|
1336
|
+
float aspect = videoAspect / screenAspect;
|
|
1337
|
+
if(aspect >= 1.0)
|
|
1338
|
+
{
|
|
1339
|
+
vUv.y = vUv.y * aspect;
|
|
1340
|
+
float offset = (1. - aspect) * .5;
|
|
1341
|
+
vUv.y = vUv.y + offset;
|
|
1342
|
+
}
|
|
1343
|
+
else
|
|
1344
|
+
{
|
|
1345
|
+
vUv.x = vUv.x / aspect;
|
|
1346
|
+
float offset = (1. - 1. / aspect) * .5;
|
|
1347
|
+
vUv.x = vUv.x + offset;
|
|
1348
|
+
}
|
|
1349
|
+
|
|
1350
|
+
vUv.x -= .5;
|
|
1351
|
+
vUv.y -= .5;
|
|
1352
|
+
|
|
1353
|
+
vUv.x *= offsetScale.z;
|
|
1354
|
+
vUv.y *= offsetScale.z;
|
|
1355
|
+
vUv.x += offsetScale.x;
|
|
1356
|
+
vUv.y += offsetScale.y;
|
|
1357
|
+
|
|
1358
|
+
vUv.x += .5;
|
|
1359
|
+
vUv.y += .5;
|
|
1360
|
+
}
|
|
1361
|
+
|
|
1362
|
+
`,this.fragmentShader=`
|
|
1363
|
+
uniform sampler2D map;
|
|
1364
|
+
varying vec2 vUv;
|
|
1365
|
+
void main() {
|
|
1366
|
+
if(vUv.x < 0. || vUv.x > 1. || vUv.y < 0. || vUv.y > 1.)
|
|
1367
|
+
gl_FragColor = vec4(0., 0., 0., 1.);
|
|
1368
|
+
else
|
|
1369
|
+
{
|
|
1370
|
+
vec4 texcolor = texture2D(map, vUv);
|
|
1371
|
+
gl_FragColor = texcolor;
|
|
1372
|
+
}
|
|
1373
|
+
}
|
|
1374
|
+
`}set screenAspect(e){this.uniforms.screenAspect.value=e,this.needsUpdate=!0}set offset(e){const t=this.uniforms.offsetScale.value;t.x=e.x,t.y=e.y,this.uniforms.offsetScale.value=t,this.needsUpdate=!0}get offset(){const e=this.uniforms.offsetScale.value;return this._offset.set(e.x,e.y),this._offset}set zoom(e){const t=this.uniforms.offsetScale.value;e<.001&&(e=.001),t.z=e,this.needsUpdate=!0}get zoom(){return this.uniforms.offsetScale.value.z}reset(){this.offset=this.offset.set(0,0),this.zoom=1,this.needsUpdate=!0}}var bI=Object.defineProperty,_I=Object.getOwnPropertyDescriptor,Mh=(n,e,t,s)=>{for(var o=s>1?void 0:s?_I(e,t):e,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=(s?l(e,t,o):l(o))||o);return s&&o&&bI(e,t,o),o};const Lt=C("debugscreensharing");var CS=(n=>(n[n.Screen=0]="Screen",n[n.Camera=1]="Camera",n[n.Canvas=2]="Canvas",n[n.Microphone=3]="Microphone",n))(CS||{});class ar extends I{constructor(){super(...arguments),a(this,"allowStartOnClick",!0),a(this,"autoConnect",!1),a(this,"_videoPlayer"),a(this,"_audioSource"),a(this,"device","Screen"),a(this,"deviceName"),a(this,"deviceFilter"),a(this,"_net"),a(this,"_requestOpen",!1),a(this,"_currentStream",null),a(this,"_currentMode",0),a(this,"onJoinedRoom",async()=>{await vs(1e3),this.autoConnect&&!this.isSending&&!this.isReceiving&&this.context.connection.isInRoom&&this.share()}),a(this,"_activeShareRequest",null),a(this,"onReceiveStream",e=>{var t;((t=e.stream)==null?void 0:t.active)===!0&&this.setStream(e.stream,2)}),a(this,"onCallEnded",e=>{Lt&&console.log("CALL ENDED",this.isReceiving,this==null?void 0:this.screenspace),this.isReceiving&&(this.screenspace=!1)})}onPointerEnter(){this.context.connection.allowEditing!=!1&&this.allowStartOnClick&&this.context.input.setCursor("pointer")}onPointerExit(){this.context.connection.allowEditing!=!1&&this.allowStartOnClick&&this.context.input.unsetCursor("pointer")}onPointerClick(e){var t;if(this.context.connection.allowEditing!=!1&&this.allowStartOnClick&&!(e&&e.pointerId!==0)){if(this.isReceiving&&(t=this.videoPlayer)!=null&&t.isPlaying){this.videoPlayer&&(this.videoPlayer.screenspace=!this.videoPlayer.screenspace);return}if(this.isSending){this.close();return}this.share()}}set videoPlayer(e){this._videoPlayer&&(this.isSending||this.isReceiving)&&this._videoPlayer.stop(),this._videoPlayer=e,this._videoPlayer&&this._currentStream&&(this.isSending||this.isReceiving)&&this._videoPlayer.setVideo(this._currentStream)}get videoPlayer(){return this._videoPlayer}get screenspace(){var e;return((e=this.videoPlayer)==null?void 0:e.screenspace)??!1}set screenspace(e){this.videoPlayer&&(this.videoPlayer.screenspace=e)}get currentScream(){return this._currentStream}get currentMode(){return this._currentMode}get isSending(){var e;return((e=this._currentStream)==null?void 0:e.active)&&this._currentMode===1}get isReceiving(){if(this._currentMode===2){if(!this._currentStream||this._currentStream.active===!1)return!1;const e=this._currentStream.getTracks();for(const t of e)if(t.readyState==="live")return!0}return!1}get requiresVideoPlayer(){return this.device!=="Microphone"}awake(){typeof this.device=="number"&&(this.device=CS[this.device]),Lt&&console.log("Screensharing",this.name,this),ns.registerWaitForAllowAudio(()=>{this._videoPlayer&&this._currentStream&&this._currentMode===2&&(this._videoPlayer.playInBackground=!0,this._videoPlayer.setVideo(this._currentStream))}),this._net=new hd(this)}onEnable(){var e,t,s;(e=this._net)==null||e.enable(),(t=this._net)==null||t.addEventListener(nn.StreamReceived,this.onReceiveStream),(s=this._net)==null||s.addEventListener(nn.StreamEnded,this.onCallEnded),this.context.connection.beginListen(ie.JoinedRoom,this.onJoinedRoom),this.autoConnect&&vs(1e3).then(()=>(this.enabled&&this.autoConnect&&!this.isReceiving&&!this.isSending&&this.context.connection.isInRoom&&this.share(),0))}onDisable(){var e,t,s;(e=this._net)==null||e.removeEventListener(nn.StreamReceived,this.onReceiveStream),(t=this._net)==null||t.removeEventListener(nn.StreamEnded,this.onCallEnded),this.context.connection.stopListen(ie.JoinedRoom,this.onJoinedRoom),(s=this._net)==null||s.disable(),this.close()}_ensureVideoPlayer(){const e=new yt;e.aspectMode=wS.AdjustWidth,P.addComponent(this.gameObject,e),this._videoPlayer=e}async share(e){return this._activeShareRequest?this._activeShareRequest:(this._activeShareRequest=this.internalShare(e),this._activeShareRequest.then(()=>this._activeShareRequest=null))}async internalShare(e){if(this.context.connection.isInRoom===!1){console.warn("Can not start screensharing: requires network connection"),F()&&be("Can not start screensharing: requires network connection. Add a SyncedRoom component or join a room first.");return}if(e!=null&&e.device&&(this.device=e.device),!this.videoPlayer&&this.requiresVideoPlayer&&(this._videoPlayer||(this._videoPlayer=P.getComponent(this.gameObject,yt)??void 0),this.videoPlayer||this._ensureVideoPlayer(),!this.videoPlayer)){console.warn("Can not share video without a videoPlayer assigned");return}this._requestOpen=!0;try{const t=e?.constraints??{echoCancellation:!0,autoGainControl:!1},s={video:t,audio:t},o=s.video;switch(o!==void 0&&typeof o!="boolean"&&(o.width||(o.width={max:1920}),o.height||(o.height={max:1920}),o.aspectRatio||(o.aspectRatio={ideal:1.7777777778}),o.frameRate||(o.frameRate={ideal:24}),o.facingMode||(o.facingMode={ideal:"user"})),this.device){case"Camera":this.tryShareUserCamera(s,e);break;case"Screen":{if(!navigator.mediaDevices.getDisplayMedia){console.error("No getDisplayMedia support");return}const l=await navigator.mediaDevices.getDisplayMedia(s);this._requestOpen?this.setStream(l,1):on(l)}break;case"Canvas":const r=this.context.renderer.domElement.captureStream(0);this.setStream(r,1);break;case"Microphone":{if(!navigator.mediaDevices.getUserMedia){console.error("No getDisplayMedia support");return}s.video=!1;const l=await navigator.mediaDevices.getUserMedia(s);this._requestOpen?this.setStream(l,1):on(l)}break;default:console.error("Can not start screen sharing: Unknown device type",this.device)}}catch(t){if(t.name==="NotAllowedError"){console.log("Selection cancelled"),this._requestOpen=!1;return}console.error("Error opening video",t)}}close(){var e;this._requestOpen=!1,this._currentStream&&(Lt&&console.warn("Close current stream / disposing resources, stream was active?",this._currentStream.active),(e=this._net)==null||e.stopSendingStream(this._currentStream),on(this._currentStream),this._currentMode=0,this._currentStream=null)}setStream(e,t){var s,o,r;if(e===this._currentStream||(this.close(),!e))return;this._currentStream=e,this._requestOpen=!0,this._currentMode=t;const l=this.device!=="Microphone",c=t===1;l?(this._videoPlayer||this._ensureVideoPlayer(),this._videoPlayer?this._videoPlayer.setVideo(e):console.error("No video player assigned for video stream")):(this._audioSource||(this._audioSource=new ns,this._audioSource.spatialBlend=0,this._audioSource.volume=1,this.gameObject.addComponent(this._audioSource)),c||(Lt&&console.log("PLAY",e.getAudioTracks()),this._audioSource.volume=1,(s=this._audioSource)==null||s.play(e))),c&&((o=this._net)==null||o.startSendingStream(e)),c&&(this._videoPlayer&&(this._videoPlayer.muted=!0),(r=this._audioSource)==null||r.stop());for(const h of e.getTracks())h.addEventListener("ended",()=>{Lt&&console.log("Track ended",h),this.close()}),Lt&&h.kind==="video"&&console.log(c?"Video \u2192":"Video \u2190",h.getSettings())}async tryShareUserCamera(e,t){const s=(await navigator.mediaDevices.enumerateDevices()).filter(r=>r.kind==="videoinput");Lt&&console.log(`Request camera. These are your kind:videoinput devices:
|
|
1375
|
+
`,s);let o=!1;for(const r of s)try{if(!this._requestOpen){Lt&&console.log("Camera selection cancelled");break}if(r.kind!=="videoinput"){Lt&&console.log("Skipping non-video device",r);continue}const l=r.deviceId;if(t?.deviceId!=null||t?.deviceFilter!=null){if(t?.deviceId!==void 0&&l!==t.deviceId){Lt&&console.log("Skipping device due to options.deviceId: "+r.label+"; "+r.deviceId);continue}if(t!=null&&t.deviceFilter&&t.deviceFilter(r)===!1){Lt&&console.log("Skipping device due to options.deviceFilter: "+r.label+"; "+r.deviceId);continue}}else if(this.deviceFilter)if(this.deviceFilter(r)===!1){Lt&&console.log("Skipping device due to ScreenShare.deviceFilter: "+r.label+"; "+r.deviceId);continue}else Lt&&console.log("Selected device by filter",r);else if(this.deviceName){const h=r.label.toLowerCase(),d=this.deviceName.toLowerCase(),u=h.includes(d),p=r.deviceId===this.deviceName;if(!u&&!p){Lt&&console.log("Skipping device due to ScreenShare.deviceName: "+r.label+"; "+r.deviceId);continue}else Lt&&console.log("Selected device by name",r)}e.video!==!1&&((typeof e.video>"u"||typeof e.video=="boolean")&&(e.video={}),e.video.deviceId=l),o=!0;const c=await navigator.mediaDevices.getUserMedia(e).catch(h=>(console.error("Failed to get user media",h),null));if(c===null)continue;this._requestOpen?(this.setStream(c,1),Lt&&console.log("Selected camera",r)):(on(c),Lt&&console.log("Camera selection cancelled"));break}catch(l){if(l.message==="Failed to allocate videosource"||l.message==="Could not start video source"){be("Failed to start video: Try another camera (Code "+l.code+")"),console.warn(l);continue}else console.error("Failed to get user media",l.message,l.code,l)}!o&&F()&&(be("No camera found for sharing. Please connect a camera (see console for more information)"),console.warn("No camera found for sharing. Please connect a camera",s,this.deviceName,"Using deviceFilter? "+this.deviceFilter!=null,"Using options? "+t!=null,"Using deviceName? "+this.deviceName!=null,"Using options.deviceId? "+t?.deviceId!=null,"Using options.deviceFilter? "+t?.deviceFilter!=null))}}Mh([m()],ar.prototype,"allowStartOnClick",2),Mh([m()],ar.prototype,"autoConnect",2),Mh([m(yt)],ar.prototype,"videoPlayer",1),Mh([m()],ar.prototype,"device",2),Mh([m()],ar.prototype,"deviceName",2);var wI=Object.defineProperty,PS=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&wI(e,t,o),o};class Rh extends I{constructor(){super(...arguments),a(this,"mode",0),a(this,"shadowColor",new he(0,0,0,1)),a(this,"targetMesh")}start(){if(this.gameObject instanceof G)this.gameObject instanceof G&&this.gameObject.material&&(this.gameObject.material=this.gameObject.material.clone(),this.targetMesh=this.gameObject,this.targetMesh.receiveShadow=!0);else{const e=wo.createPrimitive(Cr.Quad,{name:"ShadowCatcher",material:new bt({color:10066329,roughness:1,metalness:0,transparent:!0})});e.receiveShadow=!0,e.geometry.rotateX(-Math.PI/2),this.gameObject.add(e),this.targetMesh=e}if(!this.targetMesh){console.warn("ShadowCatcher: no mesh to apply shadow catching to. Groups are currently not supported.");return}switch(this.targetMesh.layers.set(2),this.mode){case 0:this.applyShadowMaterial();break;case 1:this.applyLightBlendMaterial();break;case 2:this.applyOccluderMaterial();break}}applyLightBlendMaterial(){if(!this.targetMesh)return;const e=this.targetMesh.material;e.blending=Uv,this.applyMaterialOptions(e),e.onBeforeCompile=t=>{t.fragmentShader=t.fragmentShader.replace("vec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;",`vec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;
|
|
1376
|
+
// diffuse-only lighting with overdrive to somewhat compensate
|
|
1377
|
+
// for the loss of indirect lighting and to make it more visible.
|
|
1378
|
+
vec3 direct = (reflectedLight.directDiffuse + reflectedLight.directSpecular) * 6.6;
|
|
1379
|
+
float max = max(direct.r, max(direct.g, direct.b));
|
|
1380
|
+
|
|
1381
|
+
// early out - we're simply returning direct lighting and some alpha based on it so it can
|
|
1382
|
+
// be blended onto the scene.
|
|
1383
|
+
gl_FragColor = vec4(direct, max);
|
|
1384
|
+
return;
|
|
1385
|
+
`)},e.userData.isLightBlendMaterial=!0}applyShadowMaterial(){if(this.targetMesh)if(this.targetMesh.material.type!=="ShadowMaterial"){const e=new kv;e.color=this.shadowColor,e.opacity=this.shadowColor.alpha,this.applyMaterialOptions(e),this.targetMesh.material=e,e.userData.isShadowCatcherMaterial=!0}else{const e=this.targetMesh.material;e.color=this.shadowColor,e.opacity=this.shadowColor.alpha,this.applyMaterialOptions(e),e.userData.isShadowCatcherMaterial=!0}}applyOccluderMaterial(){if(this.targetMesh){let e=this.targetMesh.material;if(!e){const t=new Me;this.targetMesh.material=t,e=t}e.depthWrite=!0,e.stencilWrite=!0,e.colorWrite=!1,this.gameObject.renderOrder=-100}}applyMaterialOptions(e){e&&(e.depthWrite=!1,e.stencilWrite=!1)}}PS([m()],Rh.prototype,"mode"),PS([m(he)],Rh.prototype,"shadowColor");var xI=Object.defineProperty,Th=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&xI(e,t,o),o};const Gt=C("debugskybox");Ny("skybox-image"),Ny("environment-image");function OS(n,e,t,s,o){const r=new qp;r.allowDrop=!1,r.allowNetworking=!1,r.background=t,r.environment=s,P.addComponent(n.scene,r);const l=c=>{typeof c=="string"&&(Gt&&console.log(o,"CHANGED TO",c),r.setSkybox(c))};return pb(n.domElement,o,l),r.addEventListener("destroy",()=>{Gt&&console.log("Destroyed attribute remote skybox",o),mb(n.domElement,o,l)}),r.setSkybox(e)}const Gp=new Array;pe.registerCallback(me.ContextCreationStart,n=>{var e;const t=n.context,s=t.domElement.getAttribute("skybox-image")||t.domElement.getAttribute("background-image"),o=t.domElement.getAttribute("environment-image");if(s){Gt&&console.log("Creating remote skybox to load "+s),((e=t.mainCameraComponent)==null?void 0:e.clearFlags)!==Io.Skybox&&console.warn('"skybox-image"/"background-image" attribute has no effect: camera clearflags are not set to "Skybox"');const r=OS(t,s,!0,!1,"skybox-image");Gp.push(r)}if(o){Gt&&console.log("Creating remote environment to load "+o);const r=OS(t,o,!1,!0,"environment-image");Gp.push(r)}}),pe.registerCallback(me.ContextCreationStart,()=>Promise.all(Gp).finally(()=>{Gp.length=0}));function kS(){return globalThis.NEEDLE_ENGINE_SKYBOX_TEXTURES||(globalThis.NEEDLE_ENGINE_SKYBOX_TEXTURES=new Array),globalThis.NEEDLE_ENGINE_SKYBOX_TEXTURES}function MS(n){const e=kS().find(t=>t.src===n);return e?(Gt&&console.log("Skybox: Found previously loaded texture for "+n),e.texture):null}async function SI(n){const e=await n;qg(e,!0),Te(e)}function CI(n,e){const t=kS();for(;t.length>5;){const s=t.shift();s&&SI(s.texture)}e.then(s=>qg(s,!1)),t.push({src:n,texture:e})}const ha=class extends I{constructor(){super(...arguments),a(this,"url"),a(this,"allowDrop",!0),a(this,"background",!0),a(this,"environment",!0),a(this,"allowNetworking",!0),a(this,"_loader"),a(this,"_prevUrl"),a(this,"_prevLoadedEnvironment"),a(this,"_prevEnvironment",null),a(this,"_prevBackground",null),a(this,"validTextureTypes",[".ktx2",".hdr",".exr",".jpg",".jpeg",".png"]),a(this,"onDragOverEvent",n=>{if(this.allowDrop&&n.dataTransfer)for(const e of n.dataTransfer.types)(e==="text/uri-list"||e==="Files")&&n.preventDefault()}),a(this,"onDrop",n=>{var e,t,s,o;if(this.allowDrop&&n.dataTransfer){for(const r of n.dataTransfer.types)if(Gt&&console.log(r),r==="text/uri-list"){const l=n.dataTransfer.getData(r);Gt&&console.log(r,l);let c=(t=(e=new RegExp(/polyhaven.com\/asset_img\/.+?\/(?<name>.+)\.png/).exec(l))==null?void 0:e.groups)==null?void 0:t.name;if(c||(c=(o=(s=new RegExp(/polyhaven\.com\/a\/(?<name>.+)/).exec(l))==null?void 0:s.groups)==null?void 0:o.name),Gt&&console.log(c),c){const h="https://dl.polyhaven.org/file/ph-assets/HDRIs/exr/1k/"+c+"_1k.exr";console.log(`[Remote Skybox] Setting skybox from url: ${h}`),n.preventDefault(),this.setSkybox(h);break}else if(this.isValidTextureType(l)){console.log("[Remote Skybox] Setting skybox from url: "+l),n.preventDefault(),this.setSkybox(l);break}else{console.warn(`[RemoteSkybox] Unknown url ${l}. If you want to load a skybox from a url, make sure it is a valid image url. Url must end with${this.validTextureTypes.join(", ")}.`);const h=new CustomEvent("dropped-unknown-url",{detail:{sender:this,event:n,url:l,apply:d=>{n.preventDefault(),this.setSkybox(d)}}});this.dispatchEvent(h)}}else if(r=="Files"){const l=n.dataTransfer.files.item(0);if(Gt&&console.log(r,l),!l)continue;if(!this.isValidTextureType(l.name)){console.warn(`[RemoteSkybox]: File "${l.name}" is not supported. Supported files are ${this.validTextureTypes.join(", ")}`);return}if(MS(l.name)===null){const c=new Blob([l]),h=URL.createObjectURL(c);n.preventDefault(),this.setSkybox(h,l.name)}else n.preventDefault(),this.setSkybox(l.name);break}}})}onEnable(){this.setSkybox(this.url),this.registerDropEvents()}onDisable(){var n;this.context.scene.environment===this._prevLoadedEnvironment&&(this.context.scene.environment=this._prevEnvironment,ci.backgroundShouldBeTransparent(this.context)||(this.context.scene.background=this._prevBackground),this._prevLoadedEnvironment=void 0),this.unregisterDropEvents(),(n=this.context.mainCameraComponent)==null||n.applyClearFlags()}urlChangedSyncField(){this.allowNetworking&&this.url&&(this.isRemoteTexture(this.url)?this.setSkybox(this.url):Gt&&console.warn(`RemoteSkybox: Not setting skybox: ${this.url} is not a remote texture. If you want to set a local texture, set allowNetworking to false.`))}async setSkybox(n,e){var t;if(!this.activeAndEnabled||(n=PI(n,this.environment,this.background),!n))return!1;if(e??(e=n),this.isValidTextureType(e)||console.warn("Potentially invalid skybox url",e,"on",this.name),Gt&&console.log("Set remote skybox url: "+n),this._prevUrl===n&&this._prevLoadedEnvironment)return this.apply(),!0;(t=this._prevLoadedEnvironment)==null||t.dispose(),this._prevLoadedEnvironment=void 0,this._prevUrl=n;const s=await this.loadTexture(n,e);if(!s)return Gt&&console.warn("RemoteSkybox: Failed to load texture from url",n),!1;if(!this.enabled)return Gt&&console.warn("RemoteSkybox: Component is not enabled, aborting setSkybox"),!1;if(this._prevUrl!==n)return Gt&&console.warn("RemoteSkybox: URL changed while loading texture, aborting setSkybox"),!1;this.url=n;const o=n.lastIndexOf("/");return s.name=n.substring(o>=0?o+1:0),this._loader instanceof Sa&&(s.colorSpace=Mn),this._prevLoadedEnvironment=s,this.apply(),!0}async loadTexture(n,e){var t,s,o,r,l;if(!n)return Promise.resolve(null);e??(e=n);const c=MS(e);if(c){const g=await c;if(((s=(t=g.source)==null?void 0:t.data)==null?void 0:s.length)>0||(l=(r=(o=g.source)==null?void 0:o.data)==null?void 0:r.data)!=null&&l.length)return g}const h=e.endsWith(".exr"),d=e.endsWith(".hdr"),u=e.endsWith(".ktx2");if(h)this._loader instanceof Cd||(this._loader=new Cd);else if(d)this._loader instanceof Wm||(this._loader=new Wm);else if(u){if(!(this._loader instanceof hO)){const{ktx2Loader:g}=Nm(this.context.renderer);this._loader=g}}else this._loader instanceof Sa||(this._loader=new Sa);Gt&&console.log("Loading skybox: "+n);const p=this._loader.loadAsync(n);return CI(e,p),await p}apply(){var n;const e=this._prevLoadedEnvironment;e&&(e instanceof BP||e instanceof FP||(e.mapping=UP,e.needsUpdate=!0),this.context.scene.background!==e&&(this._prevBackground=this.context.scene.background),this.context.scene.environment!==e&&(this._prevEnvironment=this.context.scene.environment),Gt&&console.log("Set remote skybox",this.url,!ci.backgroundShouldBeTransparent(this.context)),this.environment&&(this.context.scene.environment=e),this.background&&!ci.backgroundShouldBeTransparent(this.context)&&(this.context.scene.background=e),((n=this.context.mainCameraComponent)==null?void 0:n.backgroundBlurriness)!==void 0&&(this.context.scene.backgroundBlurriness=this.context.mainCameraComponent.backgroundBlurriness))}isRemoteTexture(n){return n.startsWith("http://")||n.startsWith("https://")}isValidTextureType(n){for(const e of this.validTextureTypes)if(n.endsWith(e))return!0;return!1}registerDropEvents(){this.unregisterDropEvents(),this.context.domElement.addEventListener("dragover",this.onDragOverEvent),this.context.domElement.addEventListener("drop",this.onDrop)}unregisterDropEvents(){this.context.domElement.removeEventListener("dragover",this.onDragOverEvent),this.context.domElement.removeEventListener("drop",this.onDrop)}};Th([q0(ha.prototype.urlChangedSyncField),m(URL)],ha.prototype,"url"),Th([m()],ha.prototype,"allowDrop"),Th([m()],ha.prototype,"background"),Th([m()],ha.prototype,"environment"),Th([m()],ha.prototype,"allowNetworking");let qp=ha;function PI(n,e,t){const s=e&&!t;switch(n?.toLowerCase()){case"studio":return s?"https://cdn.needle.tools/static/skybox/modelviewer-Neutral-small.hdr":"https://cdn.needle.tools/static/skybox/modelviewer-Neutral.hdr";case"blurred-skybox":return s?"https://cdn.needle.tools/static/skybox/blurred-skybox-small.exr":"https://cdn.needle.tools/static/skybox/blurred-skybox.exr";case"quicklook-ar":return s?"https://cdn.needle.tools/static/skybox/QuickLook-ARMode-small.exr":"https://cdn.needle.tools/static/skybox/QuickLook-ARMode.exr";case"quicklook":return s?"https://cdn.needle.tools/static/skybox/QuickLook-ObjectMode-small.exr":"https://cdn.needle.tools/static/skybox/QuickLook-ObjectMode.exr"}return n===void 0?null:n}var OI=Object.defineProperty,Xp=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&OI(e,t,o),o},Qp;const Eh=(Qp=class extends I{constructor(){super(...arguments),a(this,"target",null),a(this,"followFactor",.1),a(this,"rotateFactor",.1),a(this,"positionAxes",qa.All),a(this,"flipForward",!1),a(this,"_firstUpdate",!0)}onBeforeRender(){this.updateNow(!1)}updateNow(n){if(!(!this.target||this.target===this.gameObject)){if(this.followFactor>0){const e=ee(this.target),t=this._firstUpdate||n?1:W.clamp01(this.context.time.deltaTime*this.followFactor),s=this.worldPosition;this.positionAxes&qa.X&&(s.x=W.lerp(s.x,e.x,t)),this.positionAxes&qa.Y&&(s.y=W.lerp(s.y,e.y,t)),this.positionAxes&qa.Z&&(s.z=W.lerp(s.z,e.z,t)),this.worldPosition=s}if(this.rotateFactor>0){const e=Se(this.target);this.flipForward&&e.premultiply(Qp._invertForward);const t=this._firstUpdate||n?1:W.clamp01(this.context.time.deltaTime*this.rotateFactor);this.worldQuaternion=this.worldQuaternion.slerp(e,t)}this._firstUpdate=!1}}},a(Qp,"_invertForward",new V().setFromAxisAngle(new S(0,1,0),Math.PI)),Qp);Xp([m(E)],Eh.prototype,"target"),Xp([m()],Eh.prototype,"followFactor"),Xp([m()],Eh.prototype,"rotateFactor"),Xp([m()],Eh.prototype,"positionAxes");let Yp=Eh;var kI=Object.defineProperty,Ah=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&kI(e,t,o),o};const Ih=C("debugspatialtrigger"),RS=new uo,TS=new uo;function MI(n,e){return RS.mask=n,TS.mask=e,RS.test(TS)}class vn extends I{constructor(){super(...arguments),a(this,"triggerMask",0),a(this,"onEnter"),a(this,"onStay"),a(this,"onExit"),a(this,"currentIntersected",[]),a(this,"lastIntersected",[])}start(){Ih&&console.log(this.name,this.triggerMask,this)}update(){this.currentIntersected.length=0;for(const e of Kp.triggers)MI(e.triggerMask,this.triggerMask)&&e.test(this.gameObject)&&this.currentIntersected.push(e);for(let e=this.lastIntersected.length-1;e>=0;e--){const t=this.lastIntersected[e];this.currentIntersected.indexOf(t)<0&&(this.onExitTrigger(t),this.lastIntersected.splice(e,1))}for(const e of this.currentIntersected)this.lastIntersected.indexOf(e)<0&&this.onEnterTrigger(e),this.onStayTrigger(e);this.lastIntersected.length=0,this.lastIntersected.push(...this.currentIntersected)}onEnterTrigger(e){var t;Ih&&console.log("ENTER TRIGGER",this.name,e.name,this,e),e.raiseOnEnterEvent(this),(t=this.onEnter)==null||t.invoke()}onExitTrigger(e){var t;Ih&&console.log("EXIT TRIGGER",this.name,e.name),e.raiseOnExitEvent(this),(t=this.onExit)==null||t.invoke()}onStayTrigger(e){var t;e.raiseOnStayEvent(this),(t=this.onStay)==null||t.invoke()}}Ah([m()],vn.prototype,"triggerMask"),Ah([m(xe)],vn.prototype,"onEnter"),Ah([m(xe)],vn.prototype,"onStay"),Ah([m(xe)],vn.prototype,"onExit");var Ml;const ES=(Ml=class extends I{constructor(){super(...arguments),a(this,"triggerMask"),a(this,"boxHelper")}start(){Ih&&console.log(this.name,this.triggerMask,this)}onEnable(){var n;Ml.triggers.push(this),this.boxHelper||(this.boxHelper=P.addComponent(this.gameObject,Bo),(n=this.boxHelper)==null||n.showHelper(null,Ih))}onDisable(){Ml.triggers.splice(Ml.triggers.indexOf(this),1)}test(n){return this.boxHelper?this.boxHelper.isInBox(n)??!1:!1}raiseOnEnterEvent(n){P.foreachComponent(this.gameObject,e=>{e!==n&&e instanceof vn&&e.onEnterTrigger(this)},!1)}raiseOnStayEvent(n){P.foreachComponent(this.gameObject,e=>{e!==n&&e instanceof vn&&e.onStayTrigger(this)},!1)}raiseOnExitEvent(n){P.foreachComponent(this.gameObject,e=>{e!==n&&e instanceof vn&&e.onExitTrigger(this)},!1)}},a(Ml,"triggers",[]),Ml);Ah([m()],ES.prototype,"triggerMask");let Kp=ES;var RI=Object.defineProperty,TI=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&RI(e,t,o),o};const Hi=C("debugspectator");class Zp extends I{constructor(){super(...arguments),a(this,"cam",null),a(this,"useKeys",!0),a(this,"_mode",0),a(this,"orbit",null),a(this,"_handler"),a(this,"eventSub_WebXRRequestStartEvent",null),a(this,"eventSub_WebXRStartEvent",null),a(this,"eventSub_WebXREndEvent",null),a(this,"_debug"),a(this,"_networking")}get mode(){return this._mode}set mode(e){this._mode=e}get isSpectating(){var e;return((e=this._handler)==null?void 0:e.currentTarget)!==void 0}isSpectatingUser(e){var t;return((t=this.target)==null?void 0:t.userId)===e}isFollowedBy(e){var t;return(t=this.followers)==null?void 0:t.includes(e)}get followers(){return this._networking.followers}stopSpectating(){if(this.context.isInXR){this.followSelf();return}this.target=void 0}get localId(){return this.context.connection.connectionId??"local"}set target(e){var t;if(this._handler){const s=(t=this._handler.currentTarget)==null?void 0:t.userId,o=this.context.players.getPlayerView(this.localId);e===void 0||this.context.isInXR===!1&&o?.currentObject===e.currentObject?this._handler.currentTarget!==void 0&&(this._handler.disable(),P.setActive(this.gameObject,!1),this.orbit&&(this.orbit.enabled=!0),this._networking.onSpectatedObjectChanged(e,s)):this._handler.currentTarget!==e&&(this._handler.set(e),P.setActive(this.gameObject,!0),this.orbit&&(this.orbit.enabled=!1),this._networking.onSpectatedObjectChanged(e,s))}}get target(){var e;return(e=this._handler)==null?void 0:e.currentTarget}requestAllFollowMe(){this._networking.onRequestFollowMe()}get isSpectatingSelf(){var e,t;return this.isSpectating&&((e=this.target)==null?void 0:e.currentObject)===((t=this.context.players.getPlayerView(this.localId))==null?void 0:t.currentObject)}awake(){if(this._debug=new II(this.context,this),this._networking=new DI(this.context,this),this._networking.awake(),P.setActive(this.gameObject,!1),this.cam=P.getComponent(this.gameObject,ci),!this.cam){console.warn("SpectatorCamera: Spectator camera needs camera component on the same object.",this);return}!this._handler&&this.cam&&(this._handler=new EI(this.context,this.cam,this)),this.orbit=P.getComponent(this.context.mainCamera,_e)}onDestroy(){var e,t;this.stopSpectating(),(e=this._handler)==null||e.destroy(),(t=this._networking)==null||t.destroy()}isSupportedPlatform(){const e=window.navigator.userAgent,t=/Windows|MacOS/.test(e),s=/Windows NT/.test(e)&&/Edg/.test(e)&&!/Win64/.test(e);return t&&!s}onBeforeXR(e){this.isSupportedPlatform()&&P.setActive(this.gameObject,!0)}onEnterXR(e){this.isSupportedPlatform()&&(Hi&&console.log(this.context.mainCamera),this.context.mainCamera&&this.followSelf())}onLeaveXR(e){var t,s;this.context.removeCamera(this.cam),P.setActive(this.gameObject,!1),this.orbit&&(this.orbit.enabled=!0),(t=this._handler)==null||t.set(void 0),(s=this._handler)==null||s.disable(),this.isSpectatingSelf&&this.stopSpectating()}followSelf(){this.target=this.context.players.getPlayerView(this.context.connection.connectionId),this.target||(this.context.players.setPlayerView(this.localId,this.context.mainCamera,Co.Headset),this.target=this.context.players.getPlayerView(this.localId)),Hi&&console.log("Follow self",this.target)}onAfterRender(){var e,t,s;if(!this.cam)return;const o=this.context.renderer,r=o.xr.enabled;if(!o.xr.isPresenting&&!((e=this._handler)!=null&&e.currentTarget))return;(t=this._handler)==null||t.update(this._mode);const l=o.getRenderTarget();let c=null;const h=o.state;if(!l){if(!o.state.bindFramebuffer||!h.bindXRFramebuffer)return;c=o._framebuffer,h.bindXRFramebuffer(null)}this.setAvatarFlagsBeforeRender();const d=this.context.mainCameraComponent;if(d){const g=d.backgroundColor;g&&o.setClearColor(g,g.alpha),this.cam.backgroundColor=g,this.cam.clearFlags=d.clearFlags,this.cam.nearClipPlane=d.nearClipPlane,this.cam.farClipPlane=d.farClipPlane}else o.setClearColor(new oe(1,1,1));o.setRenderTarget(null),o.xr.enabled=!1;const u=(s=this.cam)==null?void 0:s.threeCamera;this.context.updateAspect(u);const p=o.xr.isPresenting;o.xr.isPresenting=!1,o.setSize(this.context.domWidth,this.context.domHeight),o.render(this.context.scene,u),o.xr.isPresenting=p,o.xr.enabled=r,l?o.setRenderTarget(l):h.bindXRFramebuffer&&h.bindXRFramebuffer(c),this.resetAvatarFlags()}setAvatarFlagsBeforeRender(){const e=this._mode===0;for(const t of hi.instances)if(t.avatar&&"isLocalAvatar"in t.avatar&&"flags"in t.avatar){let s=rn.All;this.isSpectatingSelf&&(s=e&&t.avatar.isLocalAvatar?rn.FirstPerson:rn.ThirdPerson);const o=t.avatar.flags;if(!o)continue;for(const r of o)r.UpdateVisible(s)}}resetAvatarFlags(){var e;for(const t of hi.instances)if(t.avatar&&"flags"in t.avatar){const s=t.avatar.flags;if(!s)continue;for(const o of s)"isLocalAvatar"in t.avatar&&(e=t.avatar)!=null&&e.isLocalAvatar?o.UpdateVisible(rn.FirstPerson):o.UpdateVisible(rn.ThirdPerson)}}}TI([m()],Zp.prototype,"useKeys");class EI{constructor(e,t,s){a(this,"context"),a(this,"cam"),a(this,"spectator"),a(this,"follow"),a(this,"target"),a(this,"view"),a(this,"currentObject"),this.context=e,this.cam=t,this.spectator=s}get currentTarget(){return this.view}set(e){const t=e?.currentObject;if(!t){this.spectator.stopSpectating();return}t!==this.currentObject&&(this.currentObject=t,this.view=e,this.follow||(this.follow=P.addComponent(this.cam.gameObject,Yp)),this.target||(this.target=new E),t.add(this.target),this.follow.enabled=!0,this.follow.target=this.target,Hi&&console.log("FOLLOW",t),this.context.isInXR?this.context.removeCamera(this.cam):this.context.setCurrentCamera(this.cam))}disable(){Hi&&console.log("STOP FOLLOW",this.currentObject),this.view=void 0,this.currentObject=void 0,this.context.removeCamera(this.cam),this.follow&&(this.follow.enabled=!1)}destroy(){var e;(e=this.target)==null||e.removeFromParent(),this.follow&&P.destroy(this.follow)}update(e){var t,s,o,r,l,c;if(((t=this.currentTarget)==null?void 0:t.isConnected)===!1||((s=this.currentTarget)==null?void 0:s.removed)===!0){Hi&&console.log("Target disconnected or timeout",this.currentTarget),this.spectator.stopSpectating();return}this.currentTarget&&((o=this.currentTarget)==null?void 0:o.currentObject)!==this.currentObject&&(Hi&&console.log("Target changed",this.currentObject,"to",this.currentTarget.currentObject),this.set(this.currentTarget));const h=this.context.mainCamera;if(h){const u=this.cam.threeCamera;(u.near!==h.near||u.far!==h.far)&&(u.near=h.near,u.far=h.far,u.updateProjectionMatrix())}const d=(r=this.follow)==null?void 0:r.target;if(!(!d||!this.follow)){switch(e){case 0:((l=this.view)==null?void 0:l.viewDevice)!==Co.Browser?(this.follow.followFactor=5,this.follow.rotateFactor=5):(this.follow.followFactor=50,this.follow.rotateFactor=50),d.position.set(0,0,0);break;case 1:this.follow.followFactor=3,this.follow.rotateFactor=2,d.position.set(0,.5,1.5);break}this.follow.flipForward=!1,((c=this.view)==null?void 0:c.viewDevice)!==Co.Browser?d.quaternion.copy(AI):d.quaternion.identity()}}}const AI=new V().setFromAxisAngle(new S(0,1,0),Math.PI);class II{constructor(e,t){a(this,"context"),a(this,"spectator"),this.context=e,this.spectator=t,console.log("[Spectator Camera] Click other avatars or cameras to follow them. Press ESC to exit spectator mode."),this.context.domElement.addEventListener("keydown",o=>{!this.spectator.useKeys||o.key==="Escape"&&this.spectator.stopSpectating()});let s=0;this.context.input.addEventListener(Be.PointerDown,o=>{s=this.context.time.time}),this.context.input.addEventListener(Be.PointerUp,o=>{const r=this.context.time.time-s;r>1?this.spectator.stopSpectating():this.context.input.getPointerClicked(0)&&r<.3&&this.trySelectObject()})}trySelectObject(){const e=new Qs;e.setMask(16777215);const t=this.context.physics.raycast(e);if(Hi&&console.log(...t),t!=null&&t.length)for(const s of t){if(s.distance<.2)continue;const o=s.object,r=P.getComponentInParent(o,hi),l=r?.connectionId;if(l){const c=this.context.players.getPlayerView(l);this.spectator.target=c,Hi&&console.log("spectate",l,r);break}}}}class LI{constructor(e,t,s){a(this,"guid"),a(this,"dontSave",!0),a(this,"targetUserId"),a(this,"stoppedFollowing"),this.guid=e,this.targetUserId=t,this.stoppedFollowing=s}}class jI{constructor(e,t){a(this,"guid"),a(this,"userId"),this.guid=e.guid,this.userId=t}}class DI{constructor(e,t){a(this,"followers",[]),a(this,"context"),a(this,"spectator"),a(this,"_followerEventMethod"),a(this,"_requestFollowMethod"),a(this,"_joinedRoomMethod"),a(this,"_lastRequestFollowUser"),a(this,"_enforceFollowInterval"),this.context=e,this.spectator=t,this._followerEventMethod=this.onFollowerEvent.bind(this),this._requestFollowMethod=this.onRequestFollowEvent.bind(this),this._joinedRoomMethod=this.onUserJoinedRoom.bind(this)}awake(){this.context.connection.beginListen("spectator-follower-changed",this._followerEventMethod),this.context.connection.beginListen("spectator-request-follow",this._requestFollowMethod),this.context.connection.beginListen(ie.JoinedRoom,this._joinedRoomMethod),this.context.domElement.addEventListener("keydown",e=>{this.spectator.useKeys&&(e.key==="f"?this.onRequestFollowMe():e.key==="Escape"&&this.onRequestFollowMe(!0))})}destroy(){this.context.connection.stopListen("spectator-follower-changed",this._followerEventMethod),this.context.connection.stopListen("spectator-request-follow",this._requestFollowMethod),this.context.connection.stopListen(ie.JoinedRoom,this._joinedRoomMethod)}onSpectatedObjectChanged(e,t){if(Hi&&console.log(this.context.connection.connectionId,"onSpectatedObjectChanged",e,t),this.context.connection.connectionId){const s=e?.userId===void 0,o=s?t:e?.userId,r=new LI(this.context.connection.connectionId,o,s);this.context.connection.send("spectator-follower-changed",r)}}onRequestFollowMe(e=!1){if(Hi&&console.log("Request follow",this.context.connection.connectionId),this.context.connection.connectionId){this.spectator.stopSpectating();const t=e?void 0:this.context.connection.connectionId,s=new jI(this.spectator,t);this.context.connection.send("spectator-request-follow",s)}}onUserJoinedRoom(){C("followme")&&this.onRequestFollowMe()}onFollowerEvent(e){const t=e.targetUserId,s=e.guid;if(Hi&&console.log(e),t===this.context.connection.connectionId)if(e.stoppedFollowing){const o=this.followers.indexOf(s);o!==-1&&(this.followers.splice(o,1),this.removeDisconnectedFollowers(),console.log(s,"unfollows you",this.followers.length))}else this.followers.includes(s)||(this.followers.push(s),this.removeDisconnectedFollowers(),console.log(s,"follows you",this.followers.length))}removeDisconnectedFollowers(){for(let e=this.followers.length-1;e>=0;e--){const t=this.followers[e];this.context.connection.userIsInRoom(t)===!1&&this.followers.splice(e,1)}}onRequestFollowEvent(e){if(this._lastRequestFollowUser=e,e.userId===this.context.connection.connectionId)this.spectator.stopSpectating();else if(e.userId===void 0)this.spectator.stopSpectating();else{const t=this.context.players.getPlayerView(e.userId);if(t)this.spectator.target=t;else return Hi&&console.warn("Could not find view",e.userId),this.enforceFollow(),!1}return!0}enforceFollow(){this._enforceFollowInterval||(this._enforceFollowInterval=setInterval(()=>{this._lastRequestFollowUser===void 0||this._lastRequestFollowUser.userId&&this.spectator.isFollowedBy(this._lastRequestFollowUser.userId)?(clearInterval(this._enforceFollowInterval),this._enforceFollowInterval=void 0):(Hi&&console.log("REQUEST FOLLOW AGAIN",this._lastRequestFollowUser.userId),this.onRequestFollowEvent(this._lastRequestFollowUser))},1e3))}}class Sn{constructor(){a(this,"bb",null),a(this,"bb_pos",0)}__init(e,t){return this.bb_pos=e,this.bb=t,this}static getRootAsSyncedCameraModel(e,t){return(t||new Sn).__init(e.readInt32(e.position())+e.position(),e)}static getSizePrefixedRootAsSyncedCameraModel(e,t){return e.setPosition(e.position()+Kv),(t||new Sn).__init(e.readInt32(e.position())+e.position(),e)}userId(e){const t=this.bb.__offset(this.bb_pos,4);return t?this.bb.__string(this.bb_pos+t,e):null}guid(e){const t=this.bb.__offset(this.bb_pos,6);return t?this.bb.__string(this.bb_pos+t,e):null}dontSave(){const e=this.bb.__offset(this.bb_pos,8);return e?!!this.bb.readInt8(this.bb_pos+e):!1}pos(e){const t=this.bb.__offset(this.bb_pos,10);return t?(e||new Ur).__init(this.bb_pos+t,this.bb):null}rot(e){const t=this.bb.__offset(this.bb_pos,12);return t?(e||new Ur).__init(this.bb_pos+t,this.bb):null}static startSyncedCameraModel(e){e.startObject(5)}static addUserId(e,t){e.addFieldOffset(0,t,0)}static addGuid(e,t){e.addFieldOffset(1,t,0)}static addDontSave(e,t){e.addFieldInt8(2,+t,0)}static addPos(e,t){e.addFieldStruct(3,t,0)}static addRot(e,t){e.addFieldStruct(4,t,0)}static endSyncedCameraModel(e){return e.endObject()}static finishSyncedCameraModelBuffer(e,t){e.finish(t)}static finishSizePrefixedSyncedCameraModelBuffer(e,t){e.finish(t,void 0,!0)}}var BI=Object.defineProperty,FI=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&BI(e,t,o),o};const Jp="SCAM";Tg(Jp,Sn.getRootAsSyncedCameraModel);const Gi=new $m;class UI{constructor(e,t){a(this,"userId"),a(this,"guid"),this.guid=t,this.userId=e}send(e,t){if(e){Gi.clear();const s=Gi.createString(this.guid),o=Gi.createString(this.userId);Sn.startSyncedCameraModel(Gi),Sn.addGuid(Gi,s),Sn.addUserId(Gi,o);const r=ee(e),l=Ad(e);Sn.addPos(Gi,Ur.createVec3(Gi,r.x,r.y,r.z)),Sn.addRot(Gi,Ur.createVec3(Gi,l.x,l.y,l.z));const c=Sn.endSyncedCameraModel(Gi);Gi.finish(c,Jp),t.sendBinary(Gi.asUint8Array())}}}var Lh;const AS=(Lh=class extends I{constructor(){super(...arguments),a(this,"cameraPrefab",null),a(this,"_lastWorldPosition"),a(this,"_lastWorldQuaternion"),a(this,"_model",null),a(this,"_needsUpdate",!0),a(this,"_lastUpdateTime",0),a(this,"remoteCams",{}),a(this,"userToCamMap",{}),a(this,"_camTimeoutInSeconds",10),a(this,"_receiveCallback",null)}getCameraObject(n){const e=this.userToCamMap[n];return e?this.remoteCams[e].obj:null}async awake(){this._lastWorldPosition=this.worldPosition.clone(),this._lastWorldQuaternion=this.worldQuaternion.clone(),this.cameraPrefab&&("uri"in this.cameraPrefab&&(this.cameraPrefab=await this.cameraPrefab.instantiate(this.gameObject)),this.cameraPrefab&&"isObject3D"in this.cameraPrefab&&(this.cameraPrefab.visible=!1))}onEnable(){this._receiveCallback=this.context.connection.beginListenBinary(Jp,this.onReceivedRemoteCameraInfoBin.bind(this))}onDisable(){this.context.connection.stopListenBinary(Jp,this._receiveCallback)}update(){for(const s in this.remoteCams){const o=this.remoteCams[s],r=this.context.time.realtimeSinceStartup-o.lastUpdate;if(!o||r>this._camTimeoutInSeconds){F()&&console.log("Remote cam timeout",s),o!=null&&o.obj&&P.destroy(o.obj),delete this.remoteCams[s],o&&delete this.userToCamMap[o.userId],Lh.instances.push(o),this.context.players.removePlayerView(o.userId,Co.Browser);continue}}if(this.context.isInXR)return;const n=this.context.mainCamera;if(n===null){this.enabled=!1;return}if(!this.context.connection.isConnected||this.context.connection.connectionId===null)return;this._model===null&&(this._model=new UI(this.context.connection.connectionId,this.context.connection.connectionId+"_camera"));const e=ee(n),t=Se(n);(e.distanceTo(this._lastWorldPosition)>.001||t.angleTo(this._lastWorldQuaternion)>.01)&&(this._needsUpdate=!0),this._lastWorldPosition.copy(e),this._lastWorldQuaternion.copy(t),!((!this._needsUpdate||this.context.time.frameCount%2!==0)&&!(this.context.time.realtimeSinceStartup-this._lastUpdateTime>this._camTimeoutInSeconds*.5))&&(this._lastUpdateTime=this.context.time.realtimeSinceStartup,this._needsUpdate=!1,this._model.send(n,this.context.connection),this.context.isInXR||this.context.players.setPlayerView(this.context.connection.connectionId,n,Co.Browser))}onReceivedRemoteCameraInfoBin(n){const e=n.guid();if(!e)return;const t=n.userId();if(!t||!this.context.connection.userIsInRoom(t)||!this.cameraPrefab)return;let s=this.remoteCams[e];if(!s)if("isObject3D"in this.cameraPrefab){const c=new Fs;c.context=this.context;const h=P.instantiate(this.cameraPrefab,c);s=this.remoteCams[e]={obj:h,lastUpdate:this.context.time.realtimeSinceStartup,userId:t},s.obj.visible=!0,this.gameObject.add(h),this.userToCamMap[t]=e,Lh.instances.push(s);const d=P.getOrAddComponent(h,hi);d.connectionId=t,d.avatar=h}else return;const o=s.obj;this.context.players.setPlayerView(t,o,Co.Browser),s.lastUpdate=this.context.time.realtimeSinceStartup,ms.markDirty(o);const r=n.pos();r&&br(o,r.x(),r.y(),r.z());const l=n.rot();l&&Kl(o,l.x(),l.y(),l.z())}},a(Lh,"instances",[]),Lh);FI([m([E,ce])],AS.prototype,"cameraPrefab");let Wy=AS;var zI=Object.defineProperty,NI=Object.getOwnPropertyDescriptor,lr=(n,e,t,s)=>{for(var o=s>1?void 0:s?NI(e,t):e,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=(s?l(e,t,o):l(o))||o);return s&&o&&zI(e,t,o),o};const Vy="view",$y=C("debugsyncedroom");class Ls extends I{constructor(){super(...arguments),a(this,"roomName",""),a(this,"urlParameterName","room"),a(this,"joinRandomRoom"),a(this,"requireRoomParameter",!1),a(this,"autoRejoin",!0),a(this,"createJoinButton",!0),a(this,"createViewOnlyButton",!1),a(this,"_lastJoinedRoom"),a(this,"_roomPrefix",""),a(this,"_lastPingTime",0),a(this,"_lastRoomTime",-1),a(this,"_userWantsToBeInARoom",!1),a(this,"_roomButton"),a(this,"_roomButtonIconJoin"),a(this,"_roomButtonIconLeave"),a(this,"updateRoomButtonState",()=>{var e,t;this._roomButton&&(this.context.connection.isInRoom?(this._roomButton.title="Leave the networked room",this._roomButton.textContent="Leave Room",(e=this._roomButtonIconJoin)==null||e.remove(),this._roomButton.prepend(this._roomButtonIconLeave)):(this._roomButton.title="Create or join a networked room",this._roomButton.textContent="Join Room",(t=this._roomButtonIconLeave)==null||t.remove(),this._roomButton.prepend(this._roomButtonIconJoin)))}),a(this,"_viewOnlyButton"),a(this,"onCreateViewOnlyButton",()=>{if(!this._viewOnlyButton){const e=document.createElement("button");this._viewOnlyButton=e,e.classList.add("view-only-button"),e.setAttribute("priority","90"),e.onclick=()=>{var t;const s=this.getViewOnlyUrl();s!=null&&s.length?navigator.canShare({url:s})?(t=navigator.share({url:s}))==null||t.catch(o=>{console.warn(o)}):(navigator.clipboard.writeText(s),De("View only URL copied to clipboard")):be("Could not create view only URL")},e.title="Copy the view only URL: A page accessed by the view only URL can not be modified by visiting users.",e.textContent="Share View URL",e.prepend(Mt("visibility"))}this.context.menu.appendChild(this._viewOnlyButton)})}get currentRoomName(){return C(Vy)||C(this.urlParameterName)}set roomPrefix(e){this._roomPrefix=e}get roomPrefix(){return this._roomPrefix}awake(){var e;this.joinRandomRoom===void 0&&((e=this.roomName)==null?void 0:e.length)<=0&&(this.joinRandomRoom=!0),$y&&console.log(`SyncedRoom roomName:${this.roomName}, urlParamName:${this.urlParameterName}, joinRandomRoom:${this.joinRandomRoom}`)}onEnable(){const e=C(Vy);if(e&&typeof e=="string"&&e.length>0){console.log("Join as viewer"),this.context.connection.joinRoom(e,!0);return}if(this.tryJoinRoom(),this.createJoinButton){const t=this.createRoomButton();this.context.menu.appendChild(t)}this.createViewOnlyButton&&this.onEnableViewOnlyButton()}onDisable(){var e;(e=this._roomButton)==null||e.remove(),this.onDisableViewOnlyButton(),this.roomName&&this.roomName.length>0&&this.context.connection.leaveRoom(this.roomName)}onDestroy(){this.destroyRoomButton()}tryJoinRandomRoom(){this.setRandomRoomUrlParameter(),this.tryJoinRoom()}tryJoinRoom(e=0){var t;e===void 0&&(e=0);let s=!1;if(((t=this.urlParameterName)==null?void 0:t.length)>0){const o=C(this.urlParameterName);if(o&&(typeof o=="string"||typeof o=="number")){s=!0;const r=db(o.toString());this.roomName=r}else if(this.joinRandomRoom&&(console.log("No room name found in url, generating random one"),this.setRandomRoomUrlParameter(),e<1))return this.tryJoinRoom(e+1)}else this.joinRandomRoom&&(this.roomName===null||this.roomName===void 0||this.roomName.length<=0)&&(this.roomName=this.generateRoomName());return this.requireRoomParameter&&!s?(($y||F())&&console.warn('[SyncedRoom] Missing required room parameter "'+this.urlParameterName+`" in url - will not connect.
|
|
1386
|
+
To allow joining a room without a query parameter you can set "requireRoomParameter" to false.`),!1):(this.context.connection.isConnected||this.context.connection.connect(),this._lastJoinedRoom=this.roomName,this._roomPrefix&&(this.roomName=this._roomPrefix+this.roomName),this.roomName.length<=0?(console.warn(`[SyncedRoom] Room name is not set so we can not join a networked room.
|
|
1387
|
+
Please choose one of the following options to fix this:
|
|
1388
|
+
A) Set a room name in the SyncedRoom component
|
|
1389
|
+
B) Set a room name in the URL parameter "?`+this.urlParameterName+`=my_room"
|
|
1390
|
+
C) Set "joinRandomRoom" to true`),!1):($y&&console.log("Join "+this.roomName),this._userWantsToBeInARoom=!0,this.context.connection.joinRoom(this.roomName),!0))}update(){this.context.connection.isConnected&&(this.context.time.time-this._lastPingTime>3&&(this._lastPingTime=this.context.time.time,this.context.connection.sendPing()),this.context.connection.isInRoom&&(this._lastRoomTime=this.context.time.time)),this._lastRoomTime>0&&this.context.time.time-this._lastRoomTime>.3&&(this._lastRoomTime=-1,this.autoRejoin?this._userWantsToBeInARoom&&(console.log("Disconnected from networking backend - attempt reconnecting now"),this.tryJoinRoom()):F()&&console.warn("You are not connected to a room anymore (possibly because the tab was inactive for too long and the server kicked you?)"))}getViewOnlyUrl(){if(this.context.connection.isConnected&&this.context.connection.currentRoomViewId){const e=window.location.search,t=new URLSearchParams(e);return t.has(this.urlParameterName)&&t.delete(this.urlParameterName),t.set(Vy,this.context.connection.currentRoomViewId),window.location.origin+window.location.pathname+"?"+t.toString()}return null}setRandomRoomUrlParameter(){const e=$l(),t=this.generateRoomName();C(this.urlParameterName)?e.set(this.urlParameterName,t):e.append(this.urlParameterName,t),Ym(t,e)}generateRoomName(){let e="";for(let t=0;t<6;t++)e+=Math.floor(Math.random()*10).toFixed(0);return e}createRoomButton(){if(this._roomButton)return this._roomButton;const e=document.createElement("button");return this._roomButton=e,e.classList.add("create-room-button"),e.setAttribute("priority","90"),e.onclick=()=>{if(this.context.connection.isInRoom)this.urlParameterName&&Hl(this.urlParameterName,null),this.context.connection.leaveRoom(),this._userWantsToBeInARoom=!1;else{if(this.urlParameterName){const t=C(this.urlParameterName);(!t||t===!0)&&(this._lastJoinedRoom?Hl(this.urlParameterName,this._lastJoinedRoom):this.setRandomRoomUrlParameter())}this.tryJoinRoom()}},this._roomButtonIconJoin=Mt("group"),this._roomButtonIconLeave=Mt("group_off"),this.updateRoomButtonState(),this.context.connection.beginListen(ie.JoinedRoom,this.updateRoomButtonState),this.context.connection.beginListen(ie.LeftRoom,this.updateRoomButtonState),e}destroyRoomButton(){this.context.connection.stopListen(ie.JoinedRoom,this.updateRoomButtonState),this.context.connection.stopListen(ie.LeftRoom,this.updateRoomButtonState)}onEnableViewOnlyButton(){this.context.connection.isConnected?this.onCreateViewOnlyButton():(this.context.connection.stopListen(ie.JoinedRoom,this.onCreateViewOnlyButton),this.context.connection.beginListen(ie.JoinedRoom,this.onCreateViewOnlyButton))}onDisableViewOnlyButton(){var e;this.context.connection.stopListen(ie.JoinedRoom,this.onCreateViewOnlyButton),(e=this._viewOnlyButton)==null||e.remove()}}lr([m()],Ls.prototype,"roomName",2),lr([m()],Ls.prototype,"urlParameterName",2),lr([m()],Ls.prototype,"joinRandomRoom",2),lr([m()],Ls.prototype,"requireRoomParameter",2),lr([m()],Ls.prototype,"autoRejoin",2),lr([m()],Ls.prototype,"createJoinButton",2),lr([m()],Ls.prototype,"createViewOnlyButton",2),lr([m()],Ls.prototype,"roomPrefix",1);function WI(){const n=C("testwindowcount")||0;n&&n>0&&VI(n)}function VI(n){if(C("testwindow"))return null;const e=new URL(window.location.href);Qm(e.searchParams,$T,1),Qm(e.searchParams,"testwindow",1);const t=e.toString(),s=[];window.onbeforeunload=()=>{for(const h of s)h.close()};const o=.05,r=128;let l=0,c=0;for(let h=0;h<n;h++){l*r+r*.01>=window.innerWidth&&(c+=1,l=0);const d=l*(r*(1+o))+window.screenLeft,u=c*(r*(1+o))+window.screenTop+90+60*c;l+=1;const p=window.open(t,"test window "+h,`popup=yes width=${r} height=${r} top=${u} left=${d}`);if(!p){console.warn("Failed to open window");continue}s.push(p),p.onload=()=>{p.onbeforeunload=()=>{for(let g=0;g<s.length;g++){const f=s[g];f!==p&&f.close()}s.length=0}}}return s}class Hy extends I{awake(){WI()}}class Gy extends I{constructor(){super(...arguments),a(this,"transformsPerFrame",10),a(this,"interval",0),a(this,"useFlatbuffers",!0),a(this,"builder",null),a(this,"models",null)}awake(){if(this.useFlatbuffers)this.context.connection.beginListenBinary(Lc,e=>{});else{this.models=[];for(let e=0;e<this.transformsPerFrame;e++)this.models.push(new IS(this.context.connection.connectionId+"_simulatedTransform_"+e,this))}}update(){if(this.context.connection.isConnected){if(this.useFlatbuffers){if(!this.context.connection.connectionId||this.context.time.frameCount%this.interval!==0)return;this.builder===null&&(this.builder=new $m(1024));const e=this.builder;for(let t=0;t<this.transformsPerFrame;t++){e.clear();const s=xx(this.context.connection.connectionId,this);this.context.connection.sendBinary(s)}}else if(this.models)for(let e=0;e<this.models.length;e++){const t=this.models[e];t.dontSave=!0,t.update(this,null),this.context.connection.send("TestSimulateUserData-"+e,t)}}}}class IS{constructor(e,t){a(this,"guid"),a(this,"fast",!1),a(this,"position"),a(this,"rotation"),a(this,"velocity"),a(this,"dontSave"),this.guid=e,this.position={x:0,y:0,z:0},this.rotation={x:0,y:0,z:0,w:0},this.update(t,null)}isValid(){return this.fast!==void 0||this.position!==void 0||this.rotation!==void 0||this.velocity!==void 0}update(e,t){const s=e.worldPosition;this.position.x=s.x,this.position.y=s.y,this.position.z=s.z;const o=e.worldQuaternion;if(this.rotation.x=o.x,this.rotation.y=o.y,this.rotation.z=o.z,this.rotation.w=o.w,this.fast=!1,t){const r=t.getVelocity();this.velocity===void 0&&(this.velocity={x:0,y:0,z:0}),this.velocity.x=r.x,this.velocity.y=r.y,this.velocity.z=r.z}}}a(IS,"temp",new S);var $I=Object.defineProperty,em=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&$I(e,t,o),o};const HI=C("debugsignals");class tm{constructor(){a(this,"guid")}}em([m()],tm.prototype,"guid");class jh{constructor(){a(this,"signal"),a(this,"reaction")}}em([m(tm)],jh.prototype,"signal"),em([m(xe)],jh.prototype,"reaction");var js;const LS=(js=class extends I{constructor(){super(...arguments),a(this,"events")}static invoke(n){if(js.receivers[n]){const e=js.receivers[n];if(!e)return;for(const t of e)t.invoke(n)}}awake(){HI&&console.log("SignalReceiver awake",this)}onEnable(){if(this.events)for(const n of this.events)js.receivers[n.signal.guid]||(js.receivers[n.signal.guid]=[]),js.receivers[n.signal.guid].push(this)}onDisable(){if(this.events){for(const n of this.events)if(js.receivers[n.signal.guid]){const e=js.receivers[n.signal.guid].indexOf(this);e>=0&&js.receivers[n.signal.guid].splice(e,1)}}}invoke(n){if(!this.events||!Array.isArray(this.events))return;const e=typeof n=="object"?n.guid:n;for(const t of this.events)if(t.signal.guid===e)try{if(t.reaction){if(!t.reaction.invoke){console.warn("Missing invoke - possibly a serialization error",t,this);continue}}else{console.warn("Missing reaction for signal",t,this);continue}t.reaction.invoke()}catch(s){console.error(s)}}},a(js,"receivers",{}),js);em([m(jh)],LS.prototype,"events");let Dh=LS;var qi=(n=>(n.Activation="ActivationTrack",n.Animation="AnimationTrack",n.Audio="AudioTrack",n.Control="ControlTrack",n.Marker="MarkerTrack",n.Signal="SignalTrack",n))(qi||{}),bn=(n=>(n[n.None=0]="None",n[n.Hold=1]="Hold",n[n.Loop=2]="Loop",n[n.PingPong=3]="PingPong",n[n.Continue=4]="Continue",n))(bn||{}),qy=(n=>(n.Signal="SignalEmitter",n))(qy||{});const _n=C("debugtimeline");class Bh{constructor(){a(this,"director"),a(this,"track")}get muted(){return this.track.muted}set muted(e){var t;e!==this.track.muted&&(this.track.muted=e,(t=this.onMuteChanged)==null||t.call(this))}*forEachClip(e=!1){var t;if((t=this.track)!=null&&t.clips)if(e)for(let s=this.track.clips.length-1;s>=0;s--)yield this.track.clips[s];else for(const s of this.track.clips)yield s}getClipTime(e,t){return t.clipIn+(e-t.start)*t.timeScale}getClipTimeNormalized(e,t){return(e-t.start)/t.duration}evaluateWeight(e,t,s,o=!0){if(t<0||t>=s.length)return 0;const r=s[t];if(o||e>=r.start&&e<=r.end){let l=1;if(r.easeInDuration>0){const c=Math.min((e-r.start)/r.easeInDuration,1);l*=c}if(r.easeOutDuration>0){const c=Math.min((r.end-e)/r.easeOutDuration,1);l*=c}return l}return 0}}class GI{constructor(e){a(this,"clip"),a(this,"rootPositionOffset"),a(this,"rootQuaternionOffset"),a(this,"rootStartPosition"),a(this,"rootEndPosition"),a(this,"rootStartQuaternion"),a(this,"rootEndQuaternion");const t=e.getClip();this.clip=t;const s=e.getRoot(),o=s.name+".position",r=s.name+".quaternion";_n&&console.log(t.name,t.tracks,o);for(const l of t.tracks)if(!(l.times.length<=0)){if(l.name.endsWith(o))this.rootStartPosition=new S().fromArray(l.values,0),this.rootEndPosition=new S().fromArray(l.values,l.values.length-3),this.rootPositionOffset=this.rootEndPosition.clone().sub(this.rootStartPosition),_n&&console.log(this.rootPositionOffset);else if(l.name.endsWith(r)&&(this.rootStartQuaternion=new V().fromArray(l.values,0),this.rootEndQuaternion=new V().fromArray(l.values,l.values.length-4),this.rootQuaternionOffset=this.rootEndQuaternion.clone().multiply(this.rootStartQuaternion),_n)){const c=new Dt().setFromQuaternion(this.rootQuaternionOffset);console.log("ROT",c)}}}get hasOffsets(){return this.rootPositionOffset!==void 0||this.rootQuaternionOffset!==void 0}}class im extends Bh{constructor(){super(...arguments),a(this,"models",[]),a(this,"trackOffset"),a(this,"target"),a(this,"mixer"),a(this,"clips",[]),a(this,"actions",[]),a(this,"weight",1),a(this,"_actionOffsets",[]),a(this,"_didBind",!1),a(this,"_animator",null),a(this,"_useclipOffsets",!0),a(this,"_totalOffsetPosition",new S),a(this,"_totalOffsetRotation",new V),a(this,"_totalOffsetPosition2",new S),a(this,"_totalOffsetRotation2",new V),a(this,"_summedPos",new S),a(this,"_tempPos",new S),a(this,"_summedRot",new V),a(this,"_tempRot",new V),a(this,"_clipRotQuat",new V)}onDisable(){var e;(e=this.mixer)==null||e.stopAllAction()}onDestroy(){this.director.context.animations.unregisterAnimationMixer(this.mixer)}onStateChanged(){this._animator&&px(this._animator.gameObject,this,this.director.isPlaying)}createHooks(e,t){var s,o;if(((s=t.tracks)==null?void 0:s.length)<=0){console.warn("No tracks in AnimationClip",t);return}const r=t.tracks[0].name.split("."),l=r[r.length-2],c=l+".position",h=l+".quaternion";let d=!1,u=!1;for(const p of t.tracks)p.name.endsWith(c)?(d=!0,this.createPositionInterpolant(t,e,p)):p.name.endsWith(h)&&(u=!0,this.createRotationInterpolant(t,e,p));if(!d||!u){const p=(o=this.mixer)==null?void 0:o.getRoot(),g=t.tracks[0],f=g.name.lastIndexOf("."),y=g.name.substring(0,f),v=y.substring(y.lastIndexOf(".")+1),b=p.getObjectByName(v);if(b)if(d){if(!u){const _=t.tracks[0].name.substring(0,f)+".quaternion";_n&&console.warn("Create quaternion track",v,b);const w=b.quaternion,x=new NP(_,[0,t.duration],[w.x,w.y,w.z,w.w,w.x,w.y,w.z,w.w]);t.tracks.push(x),this.createRotationInterpolant(t,e,x)}}else{const _=y+".position";_n&&console.warn("Create position track",v,b);const w=b.position,x=new zP(_,[0,t.duration],[w.x,w.y,w.z,w.x,w.y,w.z]);t.tracks.push(x),this.createPositionInterpolant(t,e,x)}}}bind(){if(!this._didBind){this._didBind=!0,_n&&console.log(this.models),this.mixer?this.target=this.mixer.getRoot():console.warn("No mixer was assigned to animation track");for(const e of this.actions){const t=new GI(e);this._actionOffsets.push(t)}this.target&&(this._animator=P.getComponent(this.target,Rt)??null,this._animator&&px(this._animator.gameObject,this,!0));for(const e of this.models){const t=e.asset,s=t.position,o=t.rotation;s&&s.x!==void 0&&(s.isVector3||(t.position=new S(s.x,s.y,s.z)),o.isQuaternion||(t.rotation=new V(o.x,o.y,o.z,o.w)))}this.ensureTrackOffsets()}}ensureTrackOffsets(){if(this.trackOffset){const e=this.trackOffset.position;e&&(e.isVector3||(this.trackOffset.position=new S(e.x,e.y,e.z)));const t=this.trackOffset.rotation;t&&(t.isQuaternion||(this.trackOffset.rotation=new V(t.x,t.y,t.z,t.w)))}}evaluate(e){var t,s,o,r,l,c,h;if(this.track.muted||!this.mixer)return;this.bind(),this._totalOffsetPosition.set(0,0,0),this._totalOffsetRotation.set(0,0,0,1),this._totalOffsetPosition2.set(0,0,0),this._totalOffsetRotation2.set(0,0,0,1);let d=0,u=0,p=!1,g=!1,f=0;for(let y=0;y<this.clips.length;y++){const v=this.models[y],b=this.actions[y],_=v.asset;b.weight=0;const w=e>=v.start&&e<=v.end,x=v.preExtrapolationMode,k=v.postExtrapolationMode,M=y<this.clips.length-1?this.models[y+1]:null;let T=w,L=!1;if(!T&&!p&&v.end<e&&k!==bn.None?(!M||M.start>e)&&(T=!0,p=!0):y==0&&!T&&!g&&v.start>e&&x!==bn.None&&(!M||M.start<e)&&(T=!0,L=!0,g=!0),T){let D=this.weight;D*=this.evaluateWeight(e,y,this.models,T),D*=this.director.weight;let z=w;if(L)switch(x){case bn.Hold:break;case bn.Loop:e+=v.start,z=!0;break;default:e+=v.start,z=!0;break}let j=this.getClipTime(e,v),H=0;const K=_.duration;if(L&&x===bn.Hold&&(j=0),z){if(_.loop)for(H+=Math.floor(j/(K+1e-6));j>K;)j-=K}else if(!w&&p)switch(k){case bn.Hold:j=this.getClipTime(v.end,v);break;case bn.Loop:j%=K;break;case bn.PingPong:const B=Math.floor(j/K)%2!==0;j%=K,B&&(j=K-j);break}v.reversed===!0?b.time=b.getClip().duration-j:b.time=j,b.timeScale=0;const U=Math.max(0,D);if(b.weight=U,f+=U,b.clampWhenFinished=!1,b.isRunning()||b.play(),this._useclipOffsets){const B=d==0?this._totalOffsetPosition:this._totalOffsetPosition2,Q=d==0?this._totalOffsetRotation:this._totalOffsetRotation2;d<1&&(u=1-D),d+=1;const te=this._summedPos.set(0,0,0),ae=this._tempPos.set(0,0,0),le=this._summedRot.identity(),ye=this._tempRot.identity(),He=_.rotation;He&&(this._clipRotQuat.identity(),this._clipRotQuat.slerp(He,D));const vt=this._actionOffsets[y];if(vt.hasOffsets)for(let gr=0;gr<H;gr++)vt.rootPositionOffset?ae.copy(vt.rootPositionOffset):ae.set(0,0,0),ae.applyQuaternion(le),this._clipRotQuat&&ae.applyQuaternion(this._clipRotQuat),vt.rootQuaternionOffset&&(ye.copy(vt.rootQuaternionOffset),le.multiply(ye)),te.add(ae);this._clipRotQuat&&Q.multiply(this._clipRotQuat),Q.multiply(le),_.position&&te.add(_.position),B.add(te)}}}if(this._useclipOffsets&&(this._totalOffsetPosition.lerp(this._totalOffsetPosition2,u),this._totalOffsetRotation.slerp(this._totalOffsetRotation2,u)),this.__mixerError===void 0&&(_n||F())&&(s=(t=this._animator)==null?void 0:t.runtimeAnimatorController)!=null&&s.mixer&&this.mixer!==((r=(o=this._animator)==null?void 0:o.runtimeAnimatorController)==null?void 0:r.mixer)&&(this.__mixerError=!0,console.error("AnimationTrack mixer is not shared with the animator controller - this might result in the timeline to not animate properly. Please report a bug to the Needle Engine team!",this)),(l=this._animator)!=null&&l.runtimeAnimatorController){const y=Math.max(0,1-f);(h=(c=this._animator)==null?void 0:c.runtimeAnimatorController)==null||h.update(y)}else this.mixer.update(e)}createRotationInterpolant(e,t,s){var o;const r=s.createInterpolant.bind(s),l=new V;this.ensureTrackOffsets();const c=(o=this.trackOffset)==null?void 0:o.rotation;s.createInterpolant=()=>{const h=r(),d=h.evaluate.bind(h);return h.evaluate=u=>{var p;const g=d(u);if(l.set(g[0],g[1],g[2],g[3]),l.premultiply(this._totalOffsetRotation),c&&l.premultiply(c),this.director.animationCallbackReceivers)for(const f of this.director.animationCallbackReceivers)(p=f?.onTimelineRotation)==null||p.call(f,this.director,this.target,u,l);return g[0]=l.x,g[1]=l.y,g[2]=l.z,g[3]=l.w,g},h}}createPositionInterpolant(e,t,s){var o,r;const l=s.createInterpolant.bind(s),c=new S;this.ensureTrackOffsets();const h=(o=this.trackOffset)==null?void 0:o.rotation,d=(r=this.trackOffset)==null?void 0:r.position;let u;s.createInterpolant=()=>{const p=l(),g=p.evaluate.bind(p);return p.evaluate=f=>{var y,v,b;const _=g(f);if(c.set(_[0],_[1],_[2]),t.removeStartOffset&&(u===void 0?(u=null,u=(v=(y=this._actionOffsets.find(w=>w.clip===e))==null?void 0:y.rootStartPosition)==null?void 0:v.clone()):u!=null&&u.isVector3&&c.sub(u)),c.applyQuaternion(this._totalOffsetRotation),c.add(this._totalOffsetPosition),h&&c.applyQuaternion(h),d&&(c.x-=d.x,c.y+=d.y,c.z+=d.z),this.director.animationCallbackReceivers)for(const w of this.director.animationCallbackReceivers)(b=w?.onTimelinePosition)==null||b.call(w,this.director,this.target,f,c);return _[0]=c.x,_[1]=c.y,_[2]=c.z,_},p}}}const qI=C("mutetimeline"),jS=class ld extends Bh{constructor(){super(...arguments),a(this,"models",[]),a(this,"listener"),a(this,"audio",[]),a(this,"audioContextTimeOffset",[]),a(this,"lastTime",0),a(this,"audioSource"),a(this,"_audioLoader",null),a(this,"_playableDirectorResumed",!1)}getAudioFilePath(e){const t=this.director.sourceId;return yo(t,e)}onAllowAudioChanged(e){for(let t=0;t<this.models.length;t++){const s=this.models[t];this.audio[t].setVolume(e?s.asset.volume:0)}}addModel(e){const t=new WP(this.listener);this.audio.push(t);const s=e;s._didTriggerPlay=!1,this.models.push(s)}onDisable(){for(const e of this.audio)e.isPlaying&&e.stop();for(const e of this.models)e._didTriggerPlay=!1}onDestroy(){for(const e of this.audio)e.source&&e?.disconnect();this.audio.length=0}onMuteChanged(){if(this.muted)for(let e=0;e<this.audio.length;e++){const t=this.audio[e];t!=null&&t.isPlaying&&t.stop()}}stop(){for(let e=0;e<this.audio.length;e++){const t=this.audio[e];t!=null&&t.isPlaying&&t.stop()}for(const e of this.models)e._didTriggerPlay=!1}onPauseChanged(){for(let e=0;e<this.audio.length;e++){const t=this.audio[e];t!=null&&t.isPlaying&&t.stop()}this._playableDirectorResumed=this.director.isPlaying}evaluate(e){if(qI||this.track.muted||this.director.speed<0)return;const t=this.director.context.application.muted,s=this._playableDirectorResumed;this._playableDirectorResumed=!1;const o=t?.1:0;for(let r=0;r<this.models.length;r++){const l=this.models[r],c=this.audio[r],h=l.asset;if((!c||!c.buffer)&&this.isInTimeRange(l,e-1,e+1)&&this.handleAudioLoading(l,c),ns.userInteractionRegistered!==!1&&!(c===null||!c.buffer))if(c.playbackRate=this.director.context.time.timeScale*this.director.speed,c.loop=h.loop,e>=l.start&&e<=l.end&&e<this.director.duration){if(!c.isPlaying||!this.director.isPlaying)(s||!l._didTriggerPlay&&this.lastTime<e)&&(l.duration*l.timeScale>.3?c.offset=l.clipIn+(e-l.start)*l.timeScale:c.offset=0,_n&&console.log("Timeline Audio ("+this.track.name+") play with offset "+c.offset+" - "+l.asset.clip),c.play(o),l._didTriggerPlay=!0);else{const u=l.clipIn+(e-l.start)*l.timeScale,p=c.context.currentTime-c._startedAt+c.offset;Math.abs(u-p)>.3&&(c.offset=u,c.stop(),c.play(o))}let d=h.volume;if(this.track.volume!==void 0&&(d*=this.track.volume),t&&(d=0),l.easeInDuration>0){const u=Math.min((e-l.start)/l.easeInDuration,1);d*=u}if(l.easeOutDuration>0){const u=Math.min((l.end-e)/l.easeOutDuration,1);d*=u}c.setVolume(d*this.director.weight)}else l._didTriggerPlay=!1,this.director.isPlaying&&c.isPlaying&&c.stop()}this.lastTime=e}loadAudio(e,t=0,s=0){let o=null;const r=e-s,l=e+t;for(const c of this.models)if(this.isInTimeRange(c,r,l)){const h=this.audio[this.models.indexOf(c)],d=this.handleAudioLoading(c,h);d!==null&&(o===null&&(o=[]),o.push(d))}return o!==null?Promise.all(o):null}isInTimeRange(e,t,s){return t<=e.start&&s>=e.end||t>=e.start&&t<=e.end||s>=e.start&&s<=e.end}static dispose(){ld._audioBuffers.clear()}handleAudioLoading(e,t){this._audioLoader||(this._audioLoader=new jm);const s=this.getAudioFilePath(e.asset.clip);if(ld._audioBuffers.get(s)){const r=ld._audioBuffers.get(s);return r.then(l=>{l&&t.setBuffer(l)}),r}_n&&console.warn("LOAD audio track",s,this.director.sourceId);const o=new Promise((r,l)=>{this._audioLoader.load(s,c=>{t.setBuffer(c),r(c)},void 0,c=>{console.error("Error loading audio",c),r(null)})});return ld._audioBuffers.set(s,o),o}};a(jS,"_audioBuffers",new Map);let sm=jS;class Fh extends Bh{constructor(){super(...arguments),a(this,"models",[]),a(this,"didTrigger",[]),a(this,"receivers",[])}evaluate(e){var t;if(this.track.muted)return;const s=this.director.context.time.deltaTime*1.5;for(let o=0;o<this.models.length;o++){const r=this.models[o],l=this.didTrigger[o],c=r.time-e;let h=!1;if(r.retroActive)h=c<=1e-6;else{const d=Math.abs(c);(d===0||d>=1e-5&&d<s)&&(h=!0)}if(h){if(!l)if(_n&&console.log("Trigger signal",e,r.time,r),this.didTrigger[o]=!0,((t=this.receivers)==null?void 0:t.length)<=0)Dh.invoke(r.asset);else for(const d of this.receivers)d&&d.invoke(r.asset)}else r.emitOnce||(this.didTrigger[o]=!1)}}}class nm extends Bh{constructor(){super(...arguments),a(this,"models",[]),a(this,"timelines",[]),a(this,"_previousActiveModel",null)}resolveSourceObjects(e){for(let t=this.models.length-1;t>=0;t--){const s=this.models[t].asset;if(!s.sourceObject||typeof s.sourceObject!="object"){console.log("no source object, removing model",t,s),this.models.splice(t,1);continue}else{const o=P.getComponent(s.sourceObject,Rl);this.timelines.push(o),o&&s.updateDirector&&(o.playOnAwake=!1)}}}evaluate(e){var t;this._previousActiveModel=null;for(let s=0;s<this.models.length;s++){const o=this.models[s],r=o.asset;if(e>=o.start&&e<=o.end){this._previousActiveModel=o;const l=this.getClipTime(e,o);if(r.controlActivation){const c=r.sourceObject;c.visible=!0}if(r.updateDirector){const c=this.timelines[s];c&&(c.isPlaying&&c.pause(),c.time=l,c.evaluate())}}else{const l=(t=this._previousActiveModel)==null?void 0:t.asset;if(r.controlActivation){const c=r.sourceObject;l?.sourceObject!==c&&(c.visible=!1)}}}}}var XI=Object.defineProperty,DS=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&XI(e,t,o),o};const so=C("debugtimeline");var Uh;const Xy=(Uh=class extends I{constructor(){super(...arguments),a(this,"playableAsset"),a(this,"playOnAwake"),a(this,"extrapolationMode",1),a(this,"waitForAudio",!0),a(this,"_visibilityChangeEvt"),a(this,"_clonedPlayableAsset",!1),a(this,"_speed",1),a(this,"_guidsMap"),a(this,"_isPlaying",!1),a(this,"_internalUpdateRoutine"),a(this,"_isPaused",!1),a(this,"_isStopping",!1),a(this,"_time",0),a(this,"_duration",0),a(this,"_weight",1),a(this,"_animationTracks",[]),a(this,"_audioTracks",[]),a(this,"_signalTracks",[]),a(this,"_controlTracks",[]),a(this,"_customTracks",[]),a(this,"_allTracks",[this._animationTracks,this._audioTracks,this._signalTracks,this._controlTracks,this._customTracks]),a(this,"animationCallbackReceivers",[])}static registerCreateTrack(n,e){this.createTrackFunctions[n]=e}get isPlaying(){return this._isPlaying}get isPaused(){return this._isPaused}get time(){return this._time}set time(n){typeof n=="number"&&!Number.isNaN(n)?this._time=n:(so||Xt())&&console.error("INVALID TIMELINE.TIME VALUE",n,this.name)}get duration(){return this._duration}set duration(n){this._duration=n}get weight(){return this._weight}set weight(n){this._weight=n}get speed(){return this._speed}set speed(n){this._speed=n}awake(){var n,e,t,s,o;so&&console.log(this,(n=this.playableAsset)==null?void 0:n.tracks),this.rebuildGraph(),!this.isValid()&&(so||F())&&(so?console.warn("PlayableDirector is not valid","Asset?",this.playableAsset,"Tracks:",(e=this.playableAsset)==null?void 0:e.tracks,"IsArray?",Array.isArray((t=this.playableAsset)==null?void 0:t.tracks),this):(o=(s=this.playableAsset)==null?void 0:s.tracks)!=null&&o.length?console.warn("PlayableDirector is not valid"):console.warn("PlayableDirector has no tracks"))}onEnable(){var n,e,t;for(const s of this._audioTracks)(n=s.onEnable)==null||n.call(s);for(const s of this._customTracks)(e=s.onEnable)==null||e.call(s);for(const s of this._animationTracks)(t=s.onEnable)==null||t.call(s);this.playOnAwake&&this.play(),this._visibilityChangeEvt||(this._visibilityChangeEvt=()=>{switch(document.visibilityState){case"hidden":this.setAudioTracksAllowPlaying(!1);break;case"visible":this.setAudioTracksAllowPlaying(!0);break}}),window.addEventListener("visibilitychange",this._visibilityChangeEvt)}onDisable(){var n,e,t;this.stop();for(const s of this._audioTracks)(n=s.onDisable)==null||n.call(s);for(const s of this._customTracks)(e=s.onDisable)==null||e.call(s);for(const s of this._animationTracks)(t=s.onDisable)==null||t.call(s);this._visibilityChangeEvt&&window.removeEventListener("visibilitychange",this._visibilityChangeEvt)}onDestroy(){var n;for(const e of this._allTracks)for(const t of e)(n=t.onDestroy)==null||n.call(t)}rebuildGraph(){this.isValid()&&(this.resolveBindings(),this.updateTimelineDuration(),this.setupAndCreateTrackHandlers())}async play(){if(!this.isValid())return;const n=this._isPaused==!0;if(this._isPaused=!1,!this._isPlaying){if(this._isPlaying=!0,n&&this.invokePauseChangedMethodsOnTracks(),this.waitForAudio){const e=[];for(const t of this._audioTracks){const s=t.loadAudio(this._time,1,0);s&&e.push(s)}if(e.length>0&&(await Promise.all(e),!this._isPlaying))return;for(;this._audioTracks.length>0&&this._isPlaying&&!ns.userInteractionRegistered&&this.waitForAudio;)await vs(200)}this.invokeStateChangedMethodsOnTracks(),this._internalUpdateRoutine=this.startCoroutine(this.internalUpdate(),Oe.LateUpdate)}}pause(){this.isValid()&&(this._isPlaying=!1,!this._isPaused&&(this._isPaused=!0,this.internalEvaluate(),this.invokePauseChangedMethodsOnTracks(),this.invokeStateChangedMethodsOnTracks()))}stop(){this._isStopping=!0;for(const t of this._audioTracks)t.stop();const n=this._isPaused==!0,e=this._isPlaying;this._isPlaying&&(this._time=0,this._isPlaying=!1,this._isPaused=!1,this.internalEvaluate(),n&&this.invokePauseChangedMethodsOnTracks()),this._isPlaying=!1,this._isPaused=!1,n&&!e&&this.invokePauseChangedMethodsOnTracks(),e&&this.invokeStateChangedMethodsOnTracks(),this._internalUpdateRoutine&&this.stopCoroutine(this._internalUpdateRoutine),this._internalUpdateRoutine=null,this._isStopping=!1}evaluate(){this.internalEvaluate(!0)}isValid(){return this.playableAsset&&this.playableAsset.tracks&&Array.isArray(this.playableAsset.tracks)}*forEachTrack(){for(const n of this._allTracks)for(const e of n)yield e}get animationTracks(){return this._animationTracks}get audioTracks(){return this._audioTracks}resolveGuids(n){this._guidsMap=n}invokePauseChangedMethodsOnTracks(){var n;for(const e of this.forEachTrack())(n=e.onPauseChanged)==null||n.call(e)}invokeStateChangedMethodsOnTracks(){var n;for(const e of this.forEachTrack())(n=e.onStateChanged)==null||n.call(e,this._isPlaying)}*internalUpdate(){for(;this._isPlaying&&this.activeAndEnabled;)!this._isPaused&&this._isPlaying&&(this._time+=this.context.time.deltaTime*this.speed,this.internalEvaluate()),yield}internalEvaluate(n=!1){if(!this.isValid())return;let e=this._time;switch(this.extrapolationMode){case 0:this._speed>0?e=Math.min(e,this._duration):this._speed<0&&(e=Math.max(e,0)),this._time=e;break;case 1:e%=this._duration,this._time=e;break;case 2:if(e>this._duration){this.stop();return}break}const t=this._time;for(const s of this.playableAsset.tracks)if(!s.muted)switch(s.type){case qi.Activation:if(!n&&!this._isPlaying)continue;for(let o=0;o<s.outputs.length;o++){const r=s.outputs[o];if(typeof r=="object"){let l=!1;if(s.clips)for(const h of s.clips)h.start<=t&&t<=h.end&&(l=!0);const c=r;c.visible!==void 0&&c.visible!==l&&(c.visible=l,so&&console.warn(this.name,"set ActivationTrack-"+o,c.name,l,t))}}break}if(!this._isStopping)for(const s of this._animationTracks)s.evaluate(t);for(const s of this._audioTracks)s.evaluate(t);for(const s of this._signalTracks)s.evaluate(t);for(const s of this._controlTracks)s.evaluate(t);for(const s of this._customTracks)s.evaluate(t)}resolveBindings(){if(this._clonedPlayableAsset||(this._clonedPlayableAsset=!0,this.playableAsset=Gl(this.playableAsset)),!this.playableAsset||!this.playableAsset.tracks)return;const n=this.findRoot(this.gameObject);for(const e of this.playableAsset.tracks){for(let t=e.outputs.length-1;t>=0;t--){let s=e.outputs[t];if(typeof s=="string"){this._guidsMap&&this._guidsMap[s]&&(s=this._guidsMap[s]);const o=P.findByGuid(s,n);o===null||typeof o!="object"?(e.outputs.splice(t,1),console.warn("Failed to resolve binding",s,e.name,e.type)):(so&&console.log("Resolved binding",s,"to",o),e.outputs[t]=o)}else if(s===null){if(e.outputs.splice(t,1),Uh.createTrackFunctions[e.type])continue;e.type!==qi.Audio&&e.type!==qi.Control&&e.type!==qi.Marker&&e.type!==qi.Signal&&console.warn("Missing binding",s,e.name,e.type,this.name,this.playableAsset.name)}}if(e.type===qi.Control&&e.clips)for(let t=0;t<e.clips.length;t++){const s=e.clips[t];let o=s.asset.sourceObject;if(typeof o=="string"){this._guidsMap&&this._guidsMap[o]&&(o=this._guidsMap[o]);const r=P.findByGuid(o,n);r===null||typeof r!="object"?console.warn("Failed to resolve sourceObject binding",o,e.name,s):(so&&console.log("Resolved binding",o,"to",r),s.asset.sourceObject=r)}}}}findRoot(n){return n.parent?this.findRoot(n.parent):n}updateTimelineDuration(){if(this._duration=0,!(!this.playableAsset||!this.playableAsset.tracks)){for(const n of this.playableAsset.tracks)if(n.muted!==!0){if(n.clips)for(const e of n.clips)e.end>this._duration&&(this._duration=e.end);if(n.markers)for(const e of n.markers)e.time>this._duration&&(this._duration=e.time+.001)}}}setupAndCreateTrackHandlers(){var n,e,t;if(this._animationTracks.length=0,this._audioTracks.length=0,this._signalTracks.length=0,!this.playableAsset)return;let s=P.findObjectOfType(zn,this.context);for(const o of this.playableAsset.tracks){const r=o.type,l=Uh.createTrackFunctions[r];if(l!=null){const c=l(this,o);if(typeof c.evaluate=="function"){c.director=this,c.track=o,this._customTracks.push(c);continue}}if(o.type===qi.Animation){if(!o.clips||o.clips.length<=0){so&&console.warn("Animation track has no clips",o);continue}for(let c=o.outputs.length-1;c>=0;c--){let h=o.outputs[c];if(h instanceof E){const u=P.getOrAddComponent(h,Rt);u&&(h=u)}const d=(n=h?.gameObject)==null?void 0:n.animations;if(d){const u=new im;u.trackOffset=o.trackOffset,u.director=this,u.track=o;for(let p=0;p<o.clips.length;p++){const g=o.clips[p],f=g.asset;if(!f){console.error(`Timeline ${this.name}: clip #${p} on track "${o.name}" has no animation data`);continue}const y=f.clip;let v=y;if((typeof v=="string"||typeof v=="number")&&(v=d.find(_=>_.name===y)),so&&console.log(f,y,"\u2192",v),!v){console.warn("Could not find animationClip for model",g,o.name,this.name,(e=this.playableAsset)==null?void 0:e.name,d,h);continue}h instanceof Rt&&h.runtimeAnimatorController&&(h.__internalDidAwakeAndStart||h.initializeRuntimeAnimatorController(),h.runtimeAnimatorController.mixer||h.runtimeAnimatorController.bind(h),u.mixer=h.runtimeAnimatorController.mixer),u.mixer||(u.mixer=new Lm(h.gameObject),this.context.animations.registerAnimationMixer(u.mixer)),u.clips.push(v),u.mixer.uncacheAction(v),u.createHooks(g.asset,v);const b=u.mixer.clipAction(v);u.actions.push(b),u.models.push(g)}this._animationTracks.push(u)}}}else if(o.type===qi.Audio){if(!o.clips||o.clips.length<=0)continue;const c=new sm;c.director=this,c.track=o,c.audioSource=o.outputs.find(h=>h instanceof ns),this._audioTracks.push(c),s||(s=(t=this.context.mainCameraComponent)==null?void 0:t.gameObject.addComponent(zn)),c.listener=s.listener;for(let h=0;h<o.clips.length;h++){const d=o.clips[h];c.addModel(d)}}else if(o.type===qi.Marker){const c=new Fh;if(c.director=this,c.track=o,o.markers)for(const h of o.markers)switch(h.type){case qy.Signal:c.models.push(h),c.didTrigger.push(!1);break}if(c!==null&&c.models.length>0){const h=P.getComponent(this.gameObject,Dh);h&&(c.receivers.push(h),this._signalTracks.push(c))}}else if(o.type===qi.Signal){const c=new Fh;if(c.director=this,c.track=o,o.markers)for(const h of o.markers)c.models.push(h),c.didTrigger.push(!1);for(const h of o.outputs)c.receivers.push(h);this._signalTracks.push(c)}else if(o.type===qi.Control){const c=new nm;if(c.director=this,c.track=o,o.clips)for(const h of o.clips)c.models.push(h);c.resolveSourceObjects(this.context),this._controlTracks.push(c)}}}setAudioTracksAllowPlaying(n){for(const e of this._audioTracks)e.onAllowAudioChanged(n)}registerAnimationCallback(n){this.animationCallbackReceivers.push(n)}unregisterAnimationCallback(n){const e=this.animationCallbackReceivers.indexOf(n);e!==-1&&this.animationCallbackReceivers.splice(e,1)}},a(Uh,"createTrackFunctions",{}),Uh);DS([m()],Xy.prototype,"playOnAwake"),DS([m()],Xy.prototype,"extrapolationMode");let Rl=Xy;var QI=Object.defineProperty,om=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&QI(e,t,o),o};class da extends I{constructor(){super(...arguments),a(this,"isGizmo",!1),a(this,"translationSnap",1),a(this,"rotationSnapAngle",15),a(this,"scaleSnap",.25),a(this,"_control"),a(this,"orbit"),a(this,"onControlChangedEvent",e=>{const t=this.orbit;if(t&&(t.enabled=!e.value),e.value){const s=P.getComponentInParent(this.gameObject,sn);s&&s.requestOwnership()}}),a(this,"windowKeyDownListener",e=>{if(this.enabled&&this._control)switch(e.keyCode){case 81:this._control.setSpace(this._control.space==="local"?"world":"local");break;case 16:this.enableSnapping();break;case 87:this._control.setMode("translate");break;case 69:this._control.setMode("rotate");break;case 82:this._control.setMode("scale");break;case 187:case 107:this._control.setSize(this._control.size+.1);break;case 189:case 109:this._control.setSize(Math.max(this._control.size-.1,.1));break;case 88:this._control.showX=!this._control.showX;break;case 89:this._control.showY=!this._control.showY;break;case 90:this._control.showZ=!this._control.showZ;break;case 32:this._control.enabled=!this._control.enabled;break}}),a(this,"windowKeyUpListener",e=>{if(this.enabled)switch(e.keyCode){case 16:this.disableSnapping();break}})}get control(){return this._control}onEnable(){var e;if(!(this.isGizmo&&!yc)&&this.context.mainCamera&&(this._control||(this._control=new dO(this.context.mainCamera,this.context.renderer.domElement),this._control.enabled=!0,this._control.getRaycaster().layers.set(2),this._control.size=1,("_root"in this._control?this._control._root:this._control).traverse(t=>{const s=t;if(s.layers.set(2),s){const o=s.material;o&&(o.opacity=.3)}}),this.orbit=P.getComponentInParent(this.context.mainCamera,_e)??void 0),this._control)){const t=this._control.getHelper();this.context.scene.add(t),this._control.attach(this.gameObject),(e=this._control)==null||e.addEventListener("dragging-changed",this.onControlChangedEvent),window.addEventListener("keydown",this.windowKeyDownListener),window.addEventListener("keyup",this.windowKeyUpListener)}}onDisable(){var e,t,s;(t=(e=this._control)==null?void 0:e.getHelper())==null||t.removeFromParent(),(s=this._control)==null||s.removeEventListener("dragging-changed",this.onControlChangedEvent),window.removeEventListener("keydown",this.windowKeyDownListener),window.removeEventListener("keyup",this.windowKeyUpListener)}enableSnapping(){this._control&&(this._control.setTranslationSnap(this.translationSnap),this._control.setRotationSnap(Cn.degToRad(this.rotationSnapAngle)),this._control.setScaleSnap(this.scaleSnap))}disableSnapping(){this._control&&(this._control.setTranslationSnap(null),this._control.setRotationSnap(null),this._control.setScaleSnap(null))}}om([m()],da.prototype,"isGizmo"),om([m()],da.prototype,"translationSnap"),om([m()],da.prototype,"rotationSnapAngle"),om([m()],da.prototype,"scaleSnap");var YI=Object.defineProperty,KI=Object.getOwnPropertyDescriptor,rm=(n,e,t,s)=>{for(var o=s>1?void 0:s?KI(e,t):e,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=(s?l(e,t,o):l(o))||o);return s&&o&&YI(e,t,o),o};class Qy{constructor(){a(this,"texture",null),a(this,"rect")}}rm([m(je)],Qy.prototype,"texture",2);let Tl=class extends ch{constructor(){super(...arguments),a(this,"_sprite"),a(this,"pixelsPerUnitMultiplier",1)}set image(n){this.sprite||(this.sprite=new Qy),this.sprite.texture=n,this.onAfterCreated()}get image(){return this.sprite?this.sprite.texture:null}get sprite(){return this._sprite}set sprite(n){this._sprite!==n&&(this._sprite=n,this.onAfterCreated())}isBuiltinSprite(){var n,e,t,s,o,r,l;const c=this.sprite;switch((n=c?.texture)==null?void 0:n.name){case"InputFieldBackground":case"UISprite":case"Background":case"Knob":return!0}return!((t=(e=c?.texture)==null?void 0:e.name)!=null&&t.length)&&((o=(s=c?.texture)==null?void 0:s.image)==null?void 0:o.width)===32&&((l=(r=c?.texture)==null?void 0:r.image)==null?void 0:l.height)===32}onBeforeCreate(n){var e,t;super.onBeforeCreate(n),this.isBuiltinSprite()&&(n.borderRadius=5/this.pixelsPerUnitMultiplier,((t=(e=this.sprite)==null?void 0:e.texture)==null?void 0:t.name)==="Knob"&&(n.borderRadius=999))}onAfterCreated(){var n;this.__didAwake&&(super.onAfterCreated(),!this.isBuiltinSprite()&&this.setTexture((n=this.sprite)==null?void 0:n.texture))}};rm([m(Qy)],Tl.prototype,"sprite",1),rm([m()],Tl.prototype,"pixelsPerUnitMultiplier",2);class am extends ch{constructor(){super(...arguments),a(this,"_mainTexture")}get mainTexture(){return this._mainTexture}set mainTexture(e){this._mainTexture!==e&&(this._mainTexture=e,this.onAfterCreated())}onAfterCreated(){this.__didAwake&&(super.onAfterCreated(),this.setTexture(this.mainTexture))}}rm([m(je)],am.prototype,"mainTexture",1);var ZI=Object.defineProperty,JI=Object.getOwnPropertyDescriptor,Xi=(n,e,t,s)=>{for(var o=s>1?void 0:s?JI(e,t):e,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=(s?l(e,t,o):l(o))||o);return s&&o&&ZI(e,t,o),o};const ua=C("debugbutton");class cr{constructor(){a(this,"colorMultiplier"),a(this,"disabledColor"),a(this,"fadeDuration"),a(this,"highlightedColor"),a(this,"normalColor"),a(this,"pressedColor"),a(this,"selectedColor")}}Xi([m()],cr.prototype,"colorMultiplier",2),Xi([m(he)],cr.prototype,"disabledColor",2),Xi([m()],cr.prototype,"fadeDuration",2),Xi([m(he)],cr.prototype,"highlightedColor",2),Xi([m(he)],cr.prototype,"normalColor",2),Xi([m(he)],cr.prototype,"pressedColor",2),Xi([m(he)],cr.prototype,"selectedColor",2);class eL{constructor(){a(this,"disabledTrigger"),a(this,"highlightedTrigger"),a(this,"normalTrigger"),a(this,"pressedTrigger"),a(this,"selectedTrigger")}}class no extends I{constructor(){super(...arguments),a(this,"onClick",new xe),a(this,"_isHovered",0),a(this,"colors"),a(this,"transition"),a(this,"animationTriggers"),a(this,"animator"),a(this,"_interactable",!0),a(this,"_requestedAnimatorTrigger"),a(this,"_isInit",!1),a(this,"_image")}click(){var e;(e=this.onClick)==null||e.invoke()}onPointerEnter(e){var t,s;const o=e.event.pointerType==="mouse"&&e.button===0;o&&(this._isHovered+=1),ua&&console.warn("Button Enter",o,this._isHovered,(t=this.animationTriggers)==null?void 0:t.highlightedTrigger,this.animator),this.interactable&&(this.transition==3&&this.animationTriggers&&this.animator?this.animator.setTrigger(this.animationTriggers.highlightedTrigger):this.transition===1&&this.colors&&((s=this._image)==null||s.setState("hovered")),o&&this.context.input.setCursor("pointer"))}onPointerExit(){var e,t;this._isHovered-=1,this._isHovered<0&&(this._isHovered=0),ua&&console.log("Button Exit",this._isHovered,(e=this.animationTriggers)==null?void 0:e.highlightedTrigger,this.animator),this.interactable&&(this._isHovered>0||(this._isHovered=0,this.transition==3&&this.animationTriggers&&this.animator?this.animator.setTrigger(this.animationTriggers.normalTrigger):this.transition===1&&this.colors&&((t=this._image)==null||t.setState("normal")),this.context.input.unsetCursor("pointer")))}onPointerDown(e){var t,s;ua&&console.log("Button Down",(t=this.animationTriggers)==null?void 0:t.highlightedTrigger,this.animator),this.interactable&&(this.transition==3&&this.animationTriggers&&this.animator?this.animator.setTrigger(this.animationTriggers.pressedTrigger):this.transition===1&&this.colors&&((s=this._image)==null||s.setState("pressed")))}onPointerUp(e){var t,s;ua&&console.warn("Button Up",(t=this.animationTriggers)==null?void 0:t.highlightedTrigger,this.animator,this._isHovered),this.interactable&&(this.transition==3&&this.animationTriggers&&this.animator?this.animator.setTrigger(this._isHovered?this.animationTriggers.highlightedTrigger:this.animationTriggers.normalTrigger):this.transition===1&&this.colors&&((s=this._image)==null||s.setState(this._isHovered?"hovered":"normal")))}onPointerClick(e){if(this.interactable&&!(e.button!==0&&e.event.pointerType===Ud.Mouse)&&(ua&&(console.warn("Button Click",this.onClick),De("CLICKED button "+this.name+" at "+this.context.time.frameCount)),this.onClick&&this.onClick.listenerCount>0&&(this.onClick.invoke(),e.use(),ua))){const t=this.gameObject.worldPosition;t.add(this.gameObject.worldUp.multiplyScalar(1+Math.random()*.5)),$.DrawLabel(t,"CLICK:"+Date.now(),.1,1+Math.random()*.5)}}set interactable(e){this._interactable=e,this._image&&(this._image.setInteractable(e),e?this._image.setState("normal"):this._image.setState("disabled"))}get interactable(){return this._interactable}set_interactable(e){this.interactable=e}awake(){super.awake(),ua&&console.log(this),this._isInit=!1,this.init()}start(){var e;(e=this._image)==null||e.setInteractable(this.interactable),this.gameObject.getComponentInParent(Qa)||this.gameObject.addComponent(Au)}onEnable(){super.onEnable()}onDestroy(){this._isHovered&&this.context.input.unsetCursor("pointer")}*setAnimatorTriggerAtEndOfFrame(e){var t;this._requestedAnimatorTrigger=e,yield,yield,this._requestedAnimatorTrigger==e&&((t=this.animator)==null||t.setTrigger(e))}init(){this._isInit||(this._isInit=!0,this._image=P.getComponent(this.gameObject,Tl),this._image&&(this.stateSetup(this._image),this.interactable?this._image.setState("normal"):this._image.setState("disabled")))}stateSetup(e){var t,s,o,r,l;e.setInteractable(this.interactable);const c=this.getFinalColor(e.color,(t=this.colors)==null?void 0:t.normalColor),h={state:"normal",attributes:{backgroundColor:c,backgroundOpacity:c.alpha}};e.setupState(h);const d=this.getFinalColor(e.color,(s=this.colors)==null?void 0:s.highlightedColor),u={state:"hovered",attributes:{backgroundColor:d,backgroundOpacity:d.alpha}};e.setupState(u);const p=this.getFinalColor(e.color,(o=this.colors)==null?void 0:o.pressedColor),g={state:"pressed",attributes:{backgroundColor:p,backgroundOpacity:p.alpha}};e.setupState(g);const f=this.getFinalColor(e.color,(r=this.colors)==null?void 0:r.selectedColor),y={state:"selected",attributes:{backgroundColor:f,backgroundOpacity:f.alpha}};e.setupState(y);const v=this.getFinalColor(e.color,(l=this.colors)==null?void 0:l.disabledColor),b={state:"disabled",attributes:{backgroundColor:v,backgroundOpacity:v.alpha}};e.setupState(b)}getFinalColor(e,t){return t?e.clone().multiply(t).convertLinearToSRGB():e.clone().convertLinearToSRGB()}}Xi([m(xe)],no.prototype,"onClick",2),Xi([m(cr)],no.prototype,"colors",2),Xi([m()],no.prototype,"transition",2),Xi([m(eL)],no.prototype,"animationTriggers",2),Xi([m(Rt)],no.prototype,"animator",2),Xi([m()],no.prototype,"interactable",1);var tL=Object.defineProperty,lm=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&tL(e,t,o),o};const hr=C("debuginputfield");var Y;const zh=(Y=class extends I{constructor(){super(...arguments),a(this,"textComponent"),a(this,"placeholder"),a(this,"onValueChanged"),a(this,"onEndEdit"),a(this,"inputEventFn"),a(this,"_iosEventFn")}get text(){var n;return((n=this.textComponent)==null?void 0:n.text)??""}set text(n){this.textComponent&&(this.textComponent.text=n,this.placeholder&&(n.length>0?this.placeholder.gameObject.visible=!1:this.placeholder.gameObject.visible=!0))}get isFocused(){return Y.active===this}start(){hr&&console.log(this.name,this)}onEnable(){var n;Y.htmlField||(Y.htmlField=document.createElement("input"),Y.htmlField.style.width="0px",Y.htmlField.style.height="0px",Y.htmlField.style.padding="0px",Y.htmlField.style.border="none",Y.htmlField.style.overflow="hidden",Y.htmlField.style.caretColor="transparent",Y.htmlField.style.outline="none",Y.htmlField.classList.add("ar"),Y.htmlField.onfocus=()=>Y.htmlFieldFocused=!0,Y.htmlField.onblur=()=>Y.htmlFieldFocused=!1,document.body.append(Y.htmlField)),this.inputEventFn||(this.inputEventFn=this.onInput.bind(this)),Y.htmlField.addEventListener("keyup",this.inputEventFn),this.placeholder&&(n=this.textComponent)!=null&&n.text.length&&P.setActive(this.placeholder.gameObject,!1),X.isiOS()&&(this._iosEventFn=this.processInputOniOS.bind(this),window.addEventListener("click",this._iosEventFn))}onDisable(){var n;(n=Y.htmlField)==null||n.removeEventListener("keyup",this.inputEventFn),this.onDeselected(),this._iosEventFn&&window.removeEventListener("click",this._iosEventFn)}clear(){Y.active===this&&Y.htmlField?(Y.htmlField.value="",this.setTextFromInputField()):(this.textComponent&&(this.textComponent.text=""),this.placeholder&&P.setActive(this.placeholder.gameObject,!0))}select(){this.onSelected()}deselect(){this.onDeselected()}onPointerEnter(n){n.event.pointerType==="mouse"&&n.button===0&&this.context.input.setCursor("text")}onPointerExit(n){this.context.input.unsetCursor("text")}onPointerClick(n){hr&&console.log("CLICK",n,Y.active),Y.activeTime=this.context.time.time,Y.active!==this&&this.startCoroutine(this.activeLoop(),Oe.LateUpdate),this.selectInputField()}*activeLoop(){for(this.onSelected();Y.active===this&&!(this.context.input.getPointerClicked(0)&&this.context.time.time-Y.activeTime>.2);)this.setTextFromInputField(),yield;this.onDeselected()}onSelected(){var n,e,t,s;if(Y.active!==this&&(hr&&console.log("Select",this.name,this,Y.htmlField,this.context.isInXR,this.context.arOverlayElement,(n=this.textComponent)==null?void 0:n.text,(e=Y.htmlField)==null?void 0:e.value),(t=Y.active)==null||t.onDeselected(),Y.active=this,this.placeholder&&P.setActive(this.placeholder.gameObject,!1),Y.htmlField)){if(Y.htmlField.value=((s=this.textComponent)==null?void 0:s.text)||"",hr&&console.log("set input field value",Y.htmlField.value),this.context.isInXR){const o=this.context.arOverlayElement;o&&o.append(Y.htmlField)}this.selectInputField()}}onDeselected(){var n;Y.active===this&&(Y.active=null,hr&&console.log("Deselect",this.name,this),Y.htmlField&&(Y.htmlField.blur(),document.body.append(Y.htmlField)),this.placeholder&&(!this.textComponent||this.textComponent.text.length<=0)&&P.setActive(this.placeholder.gameObject,!0),Y.htmlField&&((n=this.onEndEdit)==null||n.invoke(Y.htmlField.value)))}update(){var n;Y.active===this&&((n=this.textComponent)==null||n.markDirty())}onInput(n){var e,t;if(Y.active===this){if(hr&&console.log(n.code,n,(e=Y.htmlField)==null?void 0:e.value,(t=this.textComponent)==null?void 0:t.text),n.code==="Escape"||n.code==="Enter"){this.onDeselected();return}Y.htmlField&&(this.textComponent&&(this.setTextFromInputField(),this.placeholder&&P.setActive(this.placeholder.gameObject,this.textComponent.text.length<=0)),this.selectInputField())}}setTextFromInputField(){var n;if(this.textComponent&&Y.htmlField){const e=this.textComponent.text,t=Y.htmlField.value,s=this.textComponent.text!==Y.htmlField.value;this.textComponent.text=Y.htmlField.value,s&&(hr&&console.log("[InputField] value changed:",t,e),(n=this.onValueChanged)==null||n.invoke(t,e))}}selectInputField(){Y.htmlField&&(hr&&console.log("Focus Inputfield",Y.htmlFieldFocused),Y.htmlField.setSelectionRange(Y.htmlField.value.length,Y.htmlField.value.length),X.isiOS()?Y.htmlField.focus({preventScroll:!0}):setTimeout(()=>{var n;return(n=Y.htmlField)==null?void 0:n.focus()},1))}processInputOniOS(){const n=this.context.physics.raycast();if(!n.length)return;const e=n[0].object,t=Nf(e);(t?.gameObject===this.gameObject||t?.gameObject.parent===this.gameObject)&&this.selectInputField()}},a(Y,"active",null),a(Y,"activeTime",-1),a(Y,"htmlField",null),a(Y,"htmlFieldFocused",!1),Y);lm([m(Nt)],zh.prototype,"textComponent"),lm([m(Nt)],zh.prototype,"placeholder"),lm([m(xe)],zh.prototype,"onValueChanged"),lm([m(xe)],zh.prototype,"onEndEdit");let Yy=zh;var iL=Object.defineProperty,BS=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&iL(e,t,o),o};class Nh extends I{constructor(){super(...arguments),a(this,"id",null),a(this,"keepAspect",!1),a(this,"_object",null)}onEnable(){if(this._object){this.gameObject.add(this._object);return}if(!this.id||!this.context.mainCamera)return;const e=document.getElementById(this.id);if(!e){console.warn('Could not find element with id "'+this.id+'"');return}e.style.display="block",e.style.visibility="hidden";const t=new uO;t.listenToPointerEvents(this.context.renderer,this.context.mainCamera),this.gameObject.add(t);const s=new pO(e);t.add(s),s.visible=!1;const o=s.material;o.transparent=!0,setTimeout(()=>{s.visible=!0;const r=Ad(this.gameObject).clone();Kl(this.gameObject,0,0,0),this.gameObject.updateMatrixWorld();const l=new Si;l.setFromObject(t),this.setWorldRotation(r.x,r.y,r.z);const c=l.max.x-l.min.x,h=l.max.y-l.min.y;if(this.keepAspect){const u=c/h;c>h?s.scale.set(1/c,1/h/u,1):s.scale.set(1/c*u,1/h,1)}else s.scale.set(1/c,1/h,1);const d=this.gameObject.scale;s.scale.multiply(d)},1)}onDisable(){var e;(e=this._object)==null||e.removeFromParent()}}BS([m()],Nh.prototype,"id"),BS([m()],Nh.prototype,"keepAspect");/* @license
|
|
1391
|
+
* Copyright 2021 Google LLC. All Rights Reserved.
|
|
1392
|
+
* Licensed under the Apache License, Version 2.0 (the 'License');
|
|
1393
|
+
* you may not use this file except in compliance with the License.
|
|
1394
|
+
* You may obtain a copy of the License at
|
|
1395
|
+
*
|
|
1396
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
1397
|
+
*
|
|
1398
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
1399
|
+
* distributed under the License is distributed on an 'AS IS' BASIS,
|
|
1400
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
1401
|
+
* See the License for the specific language governing permissions and
|
|
1402
|
+
* limitations under the License.
|
|
1403
|
+
*/const sL={topLight:{intensity:500,position:[.418,16.199,.3]},room:{position:[-.757,13.219,.717],scale:[31.713,28.305,28.591]},boxes:[{position:[-10.906,2.009,1.846],rotation:-.195,scale:[2.328,7.905,4.651]},{position:[-5.607,-.754,-.758],rotation:.994,scale:[1.97,1.534,3.955]},{position:[6.167,.857,7.803],rotation:.561,scale:[3.927,6.285,3.687]},{position:[-2.017,.018,6.124],rotation:.333,scale:[2.002,4.566,2.064]},{position:[2.291,-.756,-2.621],rotation:-.286,scale:[1.546,1.552,1.496]},{position:[-2.193,-.369,-5.547],rotation:.516,scale:[3.875,3.487,2.986]}],lights:[{intensity:50,position:[-16.116,14.37,8.208],scale:[.1,2.428,2.739]},{intensity:50,position:[-16.109,18.021,-8.207],scale:[.1,2.425,2.751]},{intensity:17,position:[14.904,12.198,-1.832],scale:[.15,4.265,6.331]},{intensity:43,position:[-.462,8.89,14.52],scale:[4.38,5.441,.088]},{intensity:20,position:[3.235,11.486,-12.541],scale:[2.5,2,.1]},{intensity:100,position:[0,20,0],scale:[1,.1,1]}]},nL={topLight:{intensity:400,position:[.5,14,.5]},room:{position:[0,13.2,0],scale:[31.5,28.5,31.5]},boxes:[{position:[-10.906,-1,1.846],rotation:-.195,scale:[2.328,7.905,4.651]},{position:[-5.607,-.754,-.758],rotation:.994,scale:[1.97,1.534,3.955]},{position:[6.167,-.16,7.803],rotation:.561,scale:[3.927,6.285,3.687]},{position:[-2.017,.018,6.124],rotation:.333,scale:[2.002,4.566,2.064]},{position:[2.291,-.756,-2.621],rotation:-.286,scale:[1.546,1.552,1.496]},{position:[-2.193,-.369,-5.547],rotation:.516,scale:[3.875,3.487,2.986]}],lights:[{intensity:80,position:[-14,10,8],scale:[.1,2.5,2.5]},{intensity:80,position:[-14,14,-4],scale:[.1,2.5,2.5]},{intensity:23,position:[14,12,0],scale:[.1,5,5]},{intensity:16,position:[0,9,14],scale:[5,5,.1]},{intensity:80,position:[7,8,-14],scale:[2.5,2.5,.1]},{intensity:80,position:[-7,16,-14],scale:[2.5,2.5,.1]},{intensity:1,position:[0,20,0],scale:[.1,.1,.1]}]};class cm extends xi{constructor(e){super(),this.position.y=-3.5;const t=new xa;t.deleteAttribute("uv");const s=new bt({metalness:0,side:wd}),o=new bt({metalness:0}),r=e=="legacy"?sL:nL,l=new Tm(16777215,r.topLight.intensity,28,2);l.position.set(...r.topLight.position),this.add(l);const c=new G(t,s);c.position.set(...r.room.position),c.scale.set(...r.room.scale),this.add(c);for(const h of r.boxes){const d=new G(t,o);d.position.set(...h.position),d.rotation.set(0,h.rotation,0),d.scale.set(...h.scale),this.add(d)}for(const h of r.lights){const d=new G(t,this.createAreaLightMaterial(h.intensity));d.position.set(...h.position),d.scale.set(...h.scale),this.add(d)}}createAreaLightMaterial(e){const t=new Me;return t.color.setScalar(e),t}}var oL=Object.defineProperty,hm=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&oL(e,t,o),o},dm;const Wh=(dm=class extends I{constructor(){super(...arguments),a(this,"target"),a(this,"invertForward",!1),a(this,"keepUpDirection",!0),a(this,"copyTargetRotation",!1)}onBeforeRender(){let n=this.target;if(n||(n=this.context.mainCamera),!n)return;let e=this.copyTargetRotation;(this.context.isInVR||this.context.isInPassThrough)&&(e=!1),Yl(this.gameObject,n,this.keepUpDirection,e),this.invertForward&&this.gameObject.quaternion.multiply(dm.flipYQuat)}createBehaviours(n,e,t){if(e.uuid===this.gameObject.uuid){let s=e;if(this.keepUpDirection){const r=mi.createEmptyParent(e);s=r;const l=this.invertForward?-1:1;r.setMatrix(r.getMatrix().multiply(new se().makeRotationZ(Math.PI/2*l))),e.setMatrix(e.getMatrix().multiply(new se().makeRotationZ(-Math.PI/2*l)))}const o=new Jt("lookat "+this.name,At.sceneStartTrigger(),ve.lookAtCameraAction(s,void 0,this.invertForward?fs.back:fs.forward,this.keepUpDirection?fs.up:fs.zero));n.addBehavior(o)}}},a(dm,"flipYQuat",new V().setFromAxisAngle(new S(0,1,0),Math.PI)),dm);hm([m(E)],Wh.prototype,"target"),hm([m()],Wh.prototype,"invertForward"),hm([m()],Wh.prototype,"keepUpDirection"),hm([m()],Wh.prototype,"copyTargetRotation");let Ky=Wh;var rL=Object.defineProperty,Zy=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&rL(e,t,o),o};class El extends I{constructor(){super(...arguments),a(this,"url"),a(this,"mode",0),a(this,"clickable",!0)}async open(){if(!this.url){console.warn("OpenURL: URL is not set, can't open.",this);return}this._validateUrl();let e=this.url;switch(!e.startsWith("mailto:")&&e.includes("@")&&(e="mailto:"+e),F()&&De("Open URL: "+e),this.mode){case 0:X.isSafari(),globalThis.open(e,"_blank");break;case 1:X.isSafari()&&X.isiOS()?globalThis.open(e,"_top"):globalThis.open(e,"_self");break;case 2:X.isSafari()?globalThis.open(e,"_top"):globalThis.open(e,"_new");break}}start(){this.gameObject.getComponentInParent(ji)||this.gameObject.addComponent(ji)}onPointerEnter(e){!e.used&&this.clickable&&this.context.input.setCursor("pointer")}onPointerExit(){this.clickable&&this.context.input.unsetCursor("pointer")}onPointerClick(e){var t;this.clickable&&!e.used&&(t=this.url)!=null&&t.length&&this.open()}_validateUrl(){this.url&&this.url.startsWith("www.")&&(F()&&console.warn("URL is not valid, adding https:// to the start of the URL",this.url),this.url="https://"+this.url)}}Zy([m()],El.prototype,"url"),Zy([m()],El.prototype,"mode"),Zy([m()],El.prototype,"clickable");var aL=Object.defineProperty,Al=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&aL(e,t,o),o};class oo extends I{constructor(){super(...arguments),a(this,"side","none"),a(this,"controller",!0),a(this,"hands",!1),a(this,"controlVisibility",!0),a(this,"useGripSpace",!1),a(this,"resetTransformAfterXRSession",!0),a(this,"_startPosition",new S),a(this,"_startRotation",new V),a(this,"_startScale",new S)}get activeAndEnabled(){return!0}onEnterXR(e){this._startPosition.copy(this.gameObject.position),this._startRotation.copy(this.gameObject.quaternion),this._startScale.copy(this.gameObject.scale)}onUpdateXR(e){if(!this.enabled)return;const t=e.xr.getController(this.side);if(t){if(t.hand&&!this.hands){this.controlVisibility&&(this.gameObject.visible=!1);return}else if(!this.controller){this.controlVisibility&&(this.gameObject.visible=!1);return}this.controlVisibility&&(this.gameObject.visible=!0),this.useGripSpace||t.targetRayMode==="transient-pointer"?(this.gameObject.worldPosition=t.gripWorldPosition,this.gameObject.worldQuaternion=t.gripWorldQuaternion,this.gameObject.worldScale=q(t.xr.rigScale,t.xr.rigScale,t.xr.rigScale).multiply(this._startScale)):(this.gameObject.worldPosition=t.rayWorldPosition,this.gameObject.worldQuaternion=t.rayWorldQuaternion,this.gameObject.worldScale=q(t.xr.rigScale,t.xr.rigScale,t.xr.rigScale).multiply(this._startScale))}}onLeaveXR(e){this.resetTransformAfterXRSession&&(this.gameObject.position.copy(this._startPosition),this.gameObject.quaternion.copy(this._startRotation),this.gameObject.scale.copy(this._startScale))}}Al([m()],oo.prototype,"side"),Al([m()],oo.prototype,"controller"),Al([m()],oo.prototype,"hands"),Al([m()],oo.prototype,"controlVisibility"),Al([m()],oo.prototype,"useGripSpace"),Al([m()],oo.prototype,"resetTransformAfterXRSession");function FS(n,e){const t=n.xr.getFrame();if(!t)return console.warn("No XRFrame available"),!1;const s=t.session.enabledFeatures;if(s&&!s.some(r=>r==="camera-access"))return console.error(`No camera feed available - please request the 'camera-access' feature before starting WebXR or add the ARCameraBackground component to your scene.
|
|
1404
|
+
|
|
1405
|
+
Example to request camera-access in global scope:
|
|
1406
|
+
NeedleXRSession.onSessionRequestStart(evt => {
|
|
1407
|
+
evt.init.optionalFeatures = evt.init.optionalFeatures || [];
|
|
1408
|
+
evt.init.optionalFeatures.push('camera-access');
|
|
1409
|
+
});
|
|
1410
|
+
`),F()&&tc("No camera feed available - please request the 'camera-access' feature before starting WebXR or add the ARCameraBackground component to your scene"),!1;const o=t.getViewerPose(n.xr.getReferenceSpace());if(o)for(const r of o.views)if("camera"in r&&r.camera){let l=n.xr.getBinding();if(l||(l=new XRWebGLBinding(t.session,n.getContext())),l){let c=null;if("getCameraImage"in l){lL(n,e);const h=n.properties.get(e);if(h)return c=l.getCameraImage(r.camera),h.__webglTexture=c,!0;console.warn("No texture properties found for target texture")}}else console.error(r.camera,n.xr)}else console.error("NO CAMERA IN VIEW");else console.error(n.xr.getReferenceSpace(),t);return!1}const US=new WeakMap;function lL(n,e){const t=US.get(e)||new WeakSet;if(t.has(n))return;t.add(n),US.set(e,t),console.debug("Initialize texture for camera feed");const s=new Me,o=new Ns,r=new xi;r.add(new G(o,s));const l=new we;s.map=e,n.render(r,l)}function cL(n,e,t,s="image/webp",o){return Jy({context:n,width:e,height:t,mimeType:s,camera:o})}function Jy(n){var e,t;n||(n={});const{transparent:s=!1}=n;let{mimeType:o,context:r,width:l,height:c,camera:h}=n;if(!r&&(r=pe.Current,!r))return console.error("Can not save screenshot: No needle-engine context found or provided."),null;if(!h&&(h=r.mainCamera,!h))return console.error("No camera found"),null;const d=r.renderer,u=d.xr.enabled&&d.xr.isPresenting;if(u&&r.currentFrameEvent!=Oe.EarlyUpdate)return console.warn("Screenshot: defer to access XR frame"),new Promise(D=>{jn(z=>{const j=Jy(n);D(j)},Oe.EarlyUpdate,{once:!0})});const p=d.domElement,g=p.width,f=p.height;l||(l=g),c||(c=f);const y=l,v=c;let b=window.devicePixelRatio||1,_=1;r.devicePixelRatio==="auto"||r.devicePixelRatio==="manual"?_=1:_=r.devicePixelRatio/window.devicePixelRatio,b*=_,l/=b,c/=b,l=Math.floor(l),c=Math.floor(c),d.xr.isPresenting&&d.xr.getFrame();const w=d.xr.enabled;d.xr.enabled=!1,d.xr.isPresenting=!1,p.style.width=`${l}px`,p.style.height=`${c}px`;const x=d.getRenderTarget(),k=d.getClearColor(new oe),M=d.getClearAlpha(),T=r.scene.background,L="aspect"in h?h.aspect:null;try{const D=n.render_events!==!1,z=new Array;D&&(Na(r.scene,Ui,z),z.forEach(B=>{var Q;if(B?.onBeforeRender(),B.isInstancingActive&&B.instances)for(let te=0;te<((Q=B.instances)==null?void 0:Q.length);te++){const ae=B.instances[te];Bn(ae.object,!0)}})),s&&(r.scene.background=null,d.setClearColor(0,0)),n.background&&(r.scene.background=null,d.setClearColor(n.background),n.background instanceof he&&d.setClearAlpha(n.background.a)),s&&d.setClearAlpha(0),d.setSize(l,c,!1),"cam"in h&&(h=h.threeCamera),h instanceof we&&(h.aspect=l/c,h.updateProjectionMatrix());const j="type"in n&&n.type==="texture";let H=null;j&&(H=new $s(l,c,{wrapS:Nv,wrapT:Nv,format:1023}),d.setRenderTarget(H));let K=p;if(u?(H&&console.error('Taking XR screenshots with { type: "texture" } is currently not supported.'),K=$h.compositeWithCameraImage({width:y,height:v,scene:r.scene,camera:h,renderer:d})):r.renderNow(h||null),h instanceof we&&L!=null&&(h.aspect=L,h.updateProjectionMatrix()),D&&z.forEach(B=>B.onAfterRender()),!o&&"download_filename"in n&&n.download_filename)switch((e=n.download_filename.split(".").pop())==null?void 0:e.toLowerCase()){case"png":o="image/png";break;case"jpg":case"jpeg":o="image/jpeg";break;case"webp":o="image/webp";break}if(s&&n.trim===!0){const B=hL(K);B&&(K=B)}if("type"in n){if(n.type==="texture")return H?(n.target&&(n.target.image=H?.texture.image,n.target.needsUpdate=!0),H.texture.offset.set(0,-1),H.texture.needsUpdate=!0,H.texture):(console.error("No target texture found"),null);if(n.type==="blob")return new Promise((B,Q)=>{K.toBlob(te=>{B(te)},o)});if(n.type==="share")return new Promise((B,Q)=>{K.toBlob(te=>{if(te&&"share"in navigator){let ae="file_type"in n&&n.file_type||o;o||(ae="image/png");const le=ae?.split("/")[1]||"png",ye=new File([te],"filename"in n?n.filename||`screenshot.${le}`:`screenshot.${le}`,{type:ae});return navigator.share({title:"title"in n?n.title:void 0,text:"text"in n?n.text:void 0,url:"url"in n?n.url:void 0,files:[ye]}).catch(He=>{console.warn("User cancelled share",He.message)}).finally(()=>{B({blob:te,shared:!0})})}return{blob:te,shared:!1}},o)})}const U=K.toDataURL(o);if("download_filename"in n&&n.download_filename){let B=n.download_filename;if(X.isMobileDevice()&&typeof window<"u"){const Q=B+"_screenshots",te=B.split("."),ae=(t=te.pop())==null?void 0:t.toLowerCase();let le=0;localStorage.getItem(Q)&&(le=parseInt(sessionStorage.getItem(Q)||"0")),le>0&&(B=`${te.join()}-${le}.${ae}`),le+=1,sessionStorage.setItem(Q,le.toString())}zS(U,B)}return U}finally{d.setRenderTarget(x),r.scene.background=T,d.setSize(g,f,!1),d.setClearColor(k,M),L!=null&&h instanceof we&&(h.aspect=L,h.updateProjectionMatrix()),d.xr.enabled=w,d.xr.isPresenting=u,u||r.updateSize(!0)}return null}function hL(n){if(!("document"in globalThis))return null;const e=document.createElement("canvas");e.width=n.width,e.height=n.height;const t=e.getContext("2d");if(!t)return null;t.drawImage(n,0,0);const s=e.width,o=e.height,r=t.getImageData(0,0,s,o).data;let l=o,c=s,h=0,d=0;for(let y=0;y<o;y++)for(let v=0;v<s;v++){const b=(y*s+v)*4;r[b+3]!==0&&(v<c&&(c=v),v>d&&(d=v),y<l&&(l=y),y>h&&(h=y))}const u=d-c+1,p=h-l+1,g=document.createElement("canvas"),f=g.getContext("2d");return f?(g.width=u,g.height=p,f.drawImage(e,c,l,u,p,0,0,u,p),g):null}let Vh=null;function zS(n,e){if(n){if(!n.startsWith("data:image")){console.error("Can not save image: Data url is not an image",n);return}Vh||(Vh=document.createElement("a")),Vh.href=n,Vh.download=e,Vh.click()}}var $h;(n=>{let e=null,t=null,s=null,o=null,r=null;function l(d){const{renderer:u,width:p,height:g}=d,f=u.xr.enabled,y=u.getRenderTarget(),v=u.autoClear,b=p,_=g,w=p/g;(!s||s.width!==b||s.height!==_)&&(s??(s=new $s(b,_,{colorSpace:Mn})),s.width=b,s.height=_,s.samples=4,s.texture.repeat.y=-1,s.texture.offset.y=1),(!r||r.width!==b||r.height!==_)&&(r=document.createElement("canvas"),r.width=b,r.height=_,r.style.position="fixed",r.style.top="0px",r.style.right="0px",r.style.width="300px",r.style.height=`${300/w}px`,r.style.zIndex="1000",r.style.pointerEvents="none",r.style.opacity="1.0",r.style.willChange="contents"),e||(e=h({defines:{DECODE_VIDEO_TEXTURE:!0}})),t||(t=h()),o||(o=new je),u.xr.updateCamera(d.camera),u.xr.enabled=!1,u.autoClear=!1,u.clear(),u.setSize(b,_),u.setRenderTarget(s),FS(d.renderer,o)||console.error("Could not update texture from XR frame");const x=P.findObjectOfType(Hh);return x?x.setTexture(o):(e.setTexture(o),u.render(e,d.camera)),u.clearDepth(),u.setSize(b,_),u.render(d.scene,d.camera),u.setRenderTarget(null),t.setTexture(s.texture),u.render(t,d.camera),r.getContext("2d",{alpha:!1}).drawImage(u.domElement,0,0,r.width,r.height),u.setRenderTarget(y),u.xr.enabled=f,u.autoClear=v,r}n.compositeWithCameraImage=l;const c=`
|
|
1411
|
+
uniform sampler2D t2D;
|
|
1412
|
+
varying vec2 vUv;
|
|
1413
|
+
|
|
1414
|
+
void main() {
|
|
1415
|
+
|
|
1416
|
+
vec4 texColor = texture2D( t2D, vUv );
|
|
1417
|
+
|
|
1418
|
+
#ifdef DECODE_VIDEO_TEXTURE
|
|
1419
|
+
|
|
1420
|
+
// inline sRGB decode (TODO: Remove this code when https://crbug.com/1256340 is solved)
|
|
1421
|
+
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 );
|
|
1422
|
+
|
|
1423
|
+
#endif
|
|
1424
|
+
|
|
1425
|
+
gl_FragColor = texColor;
|
|
1426
|
+
#include <tonemapping_fragment>
|
|
1427
|
+
#include <colorspace_fragment>
|
|
1428
|
+
}
|
|
1429
|
+
`;function h(d){const u=d?.material||new Ws({name:"BackgroundMaterial",uniforms:zv.clone(Sd.background.uniforms),vertexShader:Sd.background.vertexShader,fragmentShader:c,defines:d?.defines,side:fo,depthTest:!1,depthWrite:!1,fog:!1});Object.defineProperty(u,"map",{get:function(){return this.threeTexture}});const p=new G(new Ns(2,2),u);return Td(p,!1),p.geometry.deleteAttribute("normal"),p.renderOrder=-1e6,p.setTexture=function(g){u.uniforms.t2D.value=g},p}n.makeFullscreenPlane=h})($h||($h={}));var dL=Object.defineProperty,uL=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&dL(e,t,o),o};const NS=C("debugarcamera");class Hh extends I{constructor(){super(...arguments),a(this,"backgroundTint",new he(1,1,1,1)),a(this,"backgroundPlane"),a(this,"threeTexture"),a(this,"forceTextureInitialization",function(){const e=new Me,t=new Ns,s=new xi;s.add(new G(t,e));const o=new we;return function(r,l){e.map=l,r.render(s,o),NS&&console.warn("Force texture initialization")}}()),a(this,"preRender",()=>{if(!(!this||!this.gameObject)&&this.context.renderer.xr.getFrame()){if(!this.threeTexture&&this.context.renderer&&(this.threeTexture=new je,this.forceTextureInitialization(this.context.renderer,this.threeTexture)),this.backgroundPlane===void 0){const e=this.backgroundTint;this.backgroundPlane=$h.makeFullscreenPlane({material:new Ws({name:"BackgroundMaterial",uniforms:{...zv.clone(Sd.background.uniforms),tint:{value:new fe(e.r,e.g,e.b,e.a)}},vertexShader:Sd.background.vertexShader,fragmentShader:pL,side:Pi,depthTest:!1,depthWrite:!1,fog:!1})})}this.backgroundPlane.parent!==this.scene&&this.scene.add(this.backgroundPlane),this.backgroundPlane.material instanceof Ws&&this.backgroundPlane.material.uniforms.tint.value.set(this.backgroundTint.r,this.backgroundTint.g,this.backgroundTint.b,this.backgroundTint.a),this.updateFromFrame()}})}onBeforeXR(e,t){e==="immersive-ar"&&(t.optionalFeatures=t.optionalFeatures||[],t.optionalFeatures.push("camera-access"),NS&&console.warn("Requesting camera-access"))}onEnterXR(e){e.xr.mode==="immersive-ar"&&(this.backgroundPlane&&(this.context.scene.add(this.backgroundPlane),this.backgroundPlane.visible=!1),this.backgroundPlane&&this.context.scene.add(this.backgroundPlane),this.context.pre_render_callbacks.push(this.preRender))}onLeaveXR(e){this.backgroundPlane&&this.backgroundPlane.removeFromParent();const t=this.context.pre_render_callbacks.indexOf(this.preRender);t>=0&&this.context.pre_render_callbacks.splice(t,1)}get background(){return this.backgroundPlane}onBeforeRender(e){this.updateFromFrame()}updateFromFrame(){var e;this.threeTexture&&((e=this.context.xr)==null?void 0:e.mode)==="immersive-ar"&&(FS(this.context.renderer,this.threeTexture),this.setTexture(this.threeTexture))}setTexture(e){this.backgroundPlane&&(this.threeTexture=e,this.backgroundPlane.setTexture(this.threeTexture),this.backgroundPlane.visible=!0)}}uL([m(he)],Hh.prototype,"backgroundTint");const pL=`
|
|
1430
|
+
uniform sampler2D t2D;
|
|
1431
|
+
uniform vec4 tint;
|
|
1432
|
+
|
|
1433
|
+
varying vec2 vUv;
|
|
1434
|
+
|
|
1435
|
+
void main() {
|
|
1436
|
+
|
|
1437
|
+
vec4 texColor = texture2D( t2D, vUv );
|
|
1438
|
+
texColor.w = 1.0;
|
|
1439
|
+
|
|
1440
|
+
// inline sRGB decode
|
|
1441
|
+
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 );
|
|
1442
|
+
|
|
1443
|
+
gl_FragColor = texColor * tint;
|
|
1444
|
+
|
|
1445
|
+
#include <tonemapping_fragment>
|
|
1446
|
+
#include <colorspace_fragment>
|
|
1447
|
+
}
|
|
1448
|
+
`;var mL=Object.defineProperty,dr=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&mL(e,t,o),o};const WS=C("debugimagetracking"),ev=class Cv{constructor(e,t,s,o,r,l){a(this,"measuredSize"),a(this,"state"),a(this,"_position"),a(this,"_rotation"),a(this,"_trackingComponent"),a(this,"_trackedImage"),a(this,"_bitmap"),a(this,"_pose"),this._trackingComponent=e,this._trackedImage=t,this._bitmap=s,this.measuredSize=o,this.state=r,this._pose=l}get url(){return this._trackedImage.image??""}get widthInMeters(){return this._trackedImage.widthInMeters??void 0}get bitmap(){return this._bitmap}get model(){return this._trackedImage}getPosition(e){return this.ensureTransformData(),e.copy(this._position),e}getQuaternion(e){return this.ensureTransformData(),e.copy(this._rotation),e}applyToObject(e,t=void 0){this.ensureTransformData();const s=e.position.distanceToSquared(this._position)/.05+e.quaternion.angleTo(this._rotation)/.05;t&&(t*=Math.max(1,s)),t===void 0||t>=1?(e.position.copy(this._position),e.quaternion.copy(this._rotation)):(t=Math.max(0,Math.min(1,t)),e.position.lerp(this._position,t),e.quaternion.slerp(this._rotation,t))}ensureTransformData(){if(!this._position){this._position=Cv._positionBuffer.get(),this._rotation=Cv._rotationBuffer.get();const e=this._pose.transform,t=ne.active.convertSpace(e);this._position.copy(t?.position),this._rotation.copy(t?.quaternion)}}};a(ev,"_positionBuffer",new Oi(()=>new S,20)),a(ev,"_rotationBuffer",new Oi(()=>new V,20));let tv=ev;class ro{constructor(){a(this,"image"),a(this,"widthInMeters",.25),a(this,"object"),a(this,"createObjectInstance",!1),a(this,"imageDoesNotMove",!1),a(this,"hideWhenTrackingIsLost",!0)}}dr([m(URL)],ro.prototype,"image"),dr([m()],ro.prototype,"widthInMeters"),dr([m(ce)],ro.prototype,"object"),dr([m()],ro.prototype,"createObjectInstance"),dr([m()],ro.prototype,"imageDoesNotMove"),dr([m()],ro.prototype,"hideWhenTrackingIsLost");class gL{constructor(e,t,s){a(this,"filename"),a(this,"widthInMeters"),a(this,"imageData"),this.filename=e,this.imageData=t,this.widthInMeters=s}get extensionName(){return"image-tracking"}onAfterHierarchy(e,t){const s=X.getiOSVersion(),o=(s?parseInt(s.split(".")[0]):18)>=18?1:100;t.beginBlock('def Preliminary_ReferenceImage "AnchoringReferenceImage"'),t.appendLine("uniform asset image = @image_tracking/"+this.filename+"@"),t.appendLine("uniform double physicalWidth = "+(this.widthInMeters*o).toFixed(8)),t.closeBlock()}onBeforeBuildDocument(e){const t=P.findObjectOfType(Gh);!t||!t.trackedImages||t.trackedImages.length>1&&(F()&&be("USDZ: Only one tracked image is supported."),console.warn("USDZ: Only one tracked image is supported."))}onAfterSerialize(e){e.files["image_tracking/"+this.filename]=this.imageData}onExportObject(e,t,s){var o;const r=P.findObjectOfType(Gh);if(!(!r||!r.trackedImages)){for(const l of r.trackedImages)if(((o=l.object)==null?void 0:o.asset)===e){const c=P.findObjectOfType(gn);if(!c)continue;const{scale:h,target:d}=c.getARScaleAndTarget();let u=e;const p=new se;if(e!==d)for(;u.parent&&u.parent!==d;)u=u.parent,p.premultiply(u.matrix);const g=p.clone().invert();t.setMatrix(g.scale(new S(h,h,h)));break}}}}var pa;const iv=(pa=class extends I{constructor(){super(...arguments),a(this,"trackedImages"),a(this,"smooth",!0),a(this,"trackedImageIndexMap",new Map),a(this,"_supported",!0),a(this,"imageToObjectMap",new Map),a(this,"currentImages",[]),a(this,"webXRIncubationsWarning",`Image tracking is currently not supported on this device. On Chrome for Android, you can enable the <a target="_blank" href="#" onclick="() => console.log('I')">chrome://flags/#webxr-incubations</a> flag.`),a(this,"onImageTrackingUpdate",n=>{const e=ne.active;if(e)for(const t of n){const s=t.model,o=t.state==="tracked";if(!s.object)continue;let r=this.imageToObjectMap.get(s);if(r===void 0)r={object:null,frames:0,lastTrackingTime:Date.now()},this.imageToObjectMap.set(s,r),s.object.loadAssetAsync().then(l=>{if(s.createObjectInstance&&l&&(l=P.instantiate(l)),l){r.object=l;for(const c of l.getComponentsInChildren(Ui))c.setInstancingEnabled(!1);e.rig?(e.rig.gameObject.add(l),t.applyToObject(l),l.activeSelf||P.setActive(l,!0)):console.warn("XRImageTracking: missing XRRig")}});else{if(r.frames++,o&&(r.lastTrackingTime=Date.now()),s.imageDoesNotMove&&r.frames>10||!r.object)continue;e.rig&&(e.rig.gameObject.add(r.object),t.applyToObject(r.object,this.smooth?this.context.time.deltaTimeUnscaled*3:void 0),r.object.activeSelf||P.setActive(r.object,!0))}}})}get supported(){return this._supported}awake(){if(WS&&console.log(this),!!this.trackedImages){for(const n of this.trackedImages)if(n.image&&!pa._imageElements.has(n.image)){const e=n.image;pa._imageElements.set(e,null);const t=document.createElement("img");t.src=e,t.addEventListener("load",async()=>{const s=await createImageBitmap(t);pa._imageElements.set(e,s);const o=await E1(s);if(o){const r=await(await o.convertToBlob({type:"image/png"})).arrayBuffer(),l=P.findObjectOfType(gn);l&&this.trackedImages&&(l.extensions.push(new gL("marker.png",new Uint8Array(r),this.trackedImages[0].widthInMeters)),l.anchoringType="image")}})}}}onBeforeXR(n,e){var t;if(this.trackedImages){e.optionalFeatures=e.optionalFeatures||[],e.optionalFeatures.includes("image-tracking")||e.optionalFeatures.push("image-tracking"),e.trackedImages=[];for(const s of this.trackedImages)if((t=s.image)!=null&&t.length&&s.widthInMeters>0){const o=pa._imageElements.get(s.image);o&&(this.trackedImageIndexMap.set(e.trackedImages.length,s),e.trackedImages.push({image:o,widthInMeters:s.widthInMeters}))}}}onEnterXR(n){var e;if(this.trackedImages){for(const t of this.trackedImages)if((e=t.object)!=null&&e.asset){const s=t.object.asset;s.userData||(s.userData={});const o={visible:s.visible,parent:s.parent,matrix:s.matrix.clone()};s.userData["image-tracking"]=o}}for(const t of this.imageToObjectMap.values())t.frames=0}onLeaveXR(n){var e,t;if(!this.supported&&X.isAndroidDevice()&&be(this.webXRIncubationsWarning),this.trackedImages){for(const s of this.trackedImages)if((e=s.object)!=null&&e.asset){const o=s.object.asset;if(o.userData){const r=o.userData["image-tracking"];r&&(o.visible=r.visible,(t=r.parent)==null||t.add(o),o.matrix.copy(r.matrix),o.matrix.decompose(o.position,o.quaternion,o.scale)),delete o.userData["image-tracking"]}}}}onUpdateXR(n){var e;this.currentImages.length=0;const t=n.xr.frame;if(!t)return;if("getImageTrackingResults"in t){if(((e=n.xr.session.enabledFeatures)==null?void 0:e.includes("image-tracking"))===!1)return;if(t.session&&typeof t.getImageTrackingResults=="function"){const o=t.getImageTrackingResults();if(o.length>0){const r=this.context.renderer.xr.getReferenceSpace();if(r){for(const l of o){const c=l.trackingState,h=l.index,d=this.trackedImageIndexMap.get(h);if(d){const u=t.getPose(l.imageSpace,r),p=new tv(this,d,l.image,l.measuredSize,c,u);this.currentImages.push(p)}else WS&&console.warn("No tracked image for index",h)}if(this.currentImages.length>0)try{this.dispatchEvent(new CustomEvent("image-tracking",{detail:this.currentImages})),this.onImageTrackingUpdate(this.currentImages)}catch(l){console.error(l)}}}}}else{this.didPrintWarning||(this.didPrintWarning=!0,console.log(this.webXRIncubationsWarning)),this._supported=!1,be(this.webXRIncubationsWarning);return}const s=1e3;for(const[o,r]of this.imageToObjectMap){if(!r.object||!o||o.hideWhenTrackingIsLost===!1)continue;let l=!1;for(const c of this.currentImages)if(c.model===o){const h=Date.now()-r.lastTrackingTime;if(o.imageDoesNotMove||c.state==="tracked"||h<=s){l=!0;break}}l||P.setActive(r.object,!1)}}},a(pa,"_imageElements",new Map),pa);dr([m(ro)],iv.prototype,"trackedImages"),dr([m()],iv.prototype,"smooth");let Gh=iv;var fL=Object.defineProperty,Il=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&fL(e,t,o),o};const ma=C("debugplanetracking");class ao extends I{constructor(){super(...arguments),a(this,"dataTemplate"),a(this,"occluder",!0),a(this,"initiateRoomCaptureIfNoData",!0),a(this,"usePlaneData",!0),a(this,"useMeshData",!0),a(this,"runInVR",!0),a(this,"bounds",new Si),a(this,"center",new S),a(this,"labelOffset",new S),a(this,"_dataId",1),a(this,"_allPlanes",new Map),a(this,"_allMeshes",new Map),a(this,"firstTimeNoPlanesDetected",-100),a(this,"makeOccluder",(e,t,s=!1)=>{if(t){if(t instanceof Array){for(const o of t)this.makeOccluder(e,o,s);return}!s&&!t.name.toLowerCase().includes("occlu")||(t.colorWrite=!1,t.depthTest=!0,t.depthWrite=!0,t.transparent=!1,t.polygonOffset=!0,t.polygonOffsetFactor=1,t.polygonOffsetUnits=.1,e.renderOrder=-1e3)}}),a(this,"_flipForwardMatrix",new se().makeRotationY(Math.PI)),a(this,"_verticesCache",new Map)}get trackedPlanes(){return this._allPlanes.values()}get trackedMeshes(){return this._allMeshes.values()}onBeforeXR(e,t){e==="immersive-vr"&&!this.runInVR||(t.optionalFeatures=t.optionalFeatures||[],this.usePlaneData&&!t.optionalFeatures.includes("plane-detection")&&t.optionalFeatures.push("plane-detection"),this.useMeshData&&!t.optionalFeatures.includes("mesh-detection")&&t.optionalFeatures.push("mesh-detection"))}onEnterXR(e){for(const t of this._allPlanes.keys())this.removeData(t,this._allPlanes);for(const t of this._allMeshes.keys())this.removeData(t,this._allMeshes)}onLeaveXR(e){for(const t of this._allPlanes.keys())this.removeData(t,this._allPlanes);for(const t of this._allMeshes.keys())this.removeData(t,this._allMeshes)}onUpdateXR(e){if(!this.runInVR&&e.xr.isVR)return;const t=e.xr.rig;if(!t){console.warn("No XR rig found, cannot parent tracked planes to it");return}const s=e.xr.frame;if(!this.context.renderer.xr.getReferenceSpace())return;const o=s.detectedPlanes,r=s.detectedMeshes,l=o!==void 0&&o.size>0,c=r!==void 0&&r.size>0;if(this.initiateRoomCaptureIfNoData&&(!l&&!c&&this.firstTimeNoPlanesDetected<-10&&(this.firstTimeNoPlanesDetected=Date.now()),(l||c)&&(this.firstTimeNoPlanesDetected=-1),this.firstTimeNoPlanesDetected>0&&Date.now()-this.firstTimeNoPlanesDetected>2500&&"initiateRoomCapture"in s.session&&(s.session.initiateRoomCapture(),this.firstTimeNoPlanesDetected=-1)),o!==void 0&&this.processFrameData(e.xr,t.gameObject,s,o,this._allPlanes),r!==void 0&&this.processFrameData(e.xr,t.gameObject,s,r,this._allMeshes),ma){const h=this.context.mainCameraComponent.gameObject.worldPosition;for(const d of this._allPlanes.values())!d.mesh||!d.mesh.visible||(this.bounds.makeEmpty(),d.mesh.traverse(u=>{u instanceof G&&this.bounds.expandByObject(u)}),this.bounds.getCenter(this.center),this.labelOffset.copy(h).sub(this.center).normalize().multiplyScalar(.1),$.DrawLabel(this.center.add(this.labelOffset),(d.xrData.semanticLabel||"plane").toUpperCase()+`
|
|
1449
|
+
`+d.xrData.lastChangedTime.toFixed(2),.02))}}removeData(e,t){const s=t.get(e);if(!s)return;t.delete(e),ma&&console.log("Plane no longer tracked, id="+s.id),s.mesh&&(s.mesh.removeFromParent(),s.mesh.traverse(r=>{const l=r.userData.normalsHelper;l?(l.dispose(),l.removeFromParent()):ma&&console.warn("No normals helper found for mesh",s.mesh)}),Ai(s.mesh,!0,!0));const o=new CustomEvent("plane-tracking",{detail:{type:"plane-removed",context:s}});this.dispatchEvent(o)}processFrameData(e,t,s,o,r){const l=this.context.renderer.xr.getReferenceSpace();if(l){for(const c of r.keys())o.has(c)||this.removeData(c,r);for(const c of o){const h="planeSpace"in c?c.planeSpace:"meshSpace"in c?c.meshSpace:void 0;if(!h)continue;const d=s.getPose(h,l);let u;if(r.has(c)){const p=r.get(c);if(u=p.mesh,p.timestamp<c.lastChangedTime){if(p.timestamp=c.lastChangedTime,p.mesh){const f=this.createGeometry(c);if(p.mesh instanceof G)p.mesh.geometry.dispose(),p.mesh.geometry=f,this.makeOccluder(p.mesh,p.mesh.material);else if(p.mesh instanceof mo)for(const y of p.mesh.children)y instanceof G&&(y.geometry.dispose(),y.geometry=f,this.makeOccluder(y,y.material));if(p.collider){const y=p.mesh;p.collider.sharedMesh=y,p.collider.convex=this.checkIfContextShouldBeConvex(y,p.xrData),p.collider.onDisable(),p.collider.onEnable()}ma&&(console.log("Plane updated, id="+p.id,p),p.mesh.traverse(y=>{if(!(y instanceof G))return;const v=y.userData.normalsHelper;v&&v.update()}))}const g=new CustomEvent("plane-tracking",{detail:{type:"plane-updated",context:p}});this.dispatchEvent(g)}}else{if(!this.dataTemplate){const p=new G;ma?p.material=new VP:this.occluder?(p.material=new Me,this.makeOccluder(p,p.material,!0)):p.material=new Me({wireframe:!0,opacity:.5,transparent:!0,color:3355443}),this.dataTemplate=new ce("","",p)}if(!this.dataTemplate.asset)this.dataTemplate.loadAssetAsync();else{const p=P.instantiate(this.dataTemplate.asset);if(p.name="xr-tracked-plane",u=p,mg(p,!1),p instanceof G)Te(p.geometry),p.geometry=this.createGeometry(c),this.makeOccluder(p,p.material,this.occluder&&!this.dataTemplate);else if(p instanceof mo)for(const y of p.children)y instanceof G&&(Te(y.geometry),y.geometry=this.createGeometry(c),this.makeOccluder(y,y.material,this.occluder&&!this.dataTemplate));const g=p.getComponent(Fo);if(g){const y=p;g.sharedMesh=y,g.convex=this.checkIfContextShouldBeConvex(y,c),g.onDisable(),g.onEnable()}p.matrixAutoUpdate=!1,p.matrixWorldNeedsUpdate=!0,t.add(p);const f={id:this._dataId++,xrData:c,timestamp:c.lastChangedTime,mesh:p,collider:g};r.set(c,f),ma&&console.log("New plane detected, id="+f.id,f,{hasCollider:!!g,isGroup:p instanceof mo});try{const y=new CustomEvent("plane-tracking",{detail:{type:"plane-added",context:f}});this.dispatchEvent(y)}catch(y){console.error(y)}}}u&&(d?(u.visible=!0,u.matrix.fromArray(d.transform.matrix),u.matrix.premultiply(this._flipForwardMatrix)):u.visible=!1,ma&&u.traverse(p=>{if(p instanceof G)if(p.userData.normalsHelper)p.userData.normalsHelper.update();else{const g=new mO(p,.05,255);g.layers.disableAll(),g.layers.set(2),this.context.scene.add(g),p.userData.normalsHelper=g}}))}}}checkIfContextShouldBeConvex(e,t){if(!e)return!0;if(e){const s=new Si;s.expandByObject(e);const o=new S;s.getSize(o);let r=!0;return o.x>2&&o.y>2&&o.z>1.5&&(r=!1),r&&"semanticLabel"in t&&t.semanticLabel==="wall"&&(r=!0),r}return!0}createGeometry(e){return"polygon"in e?this.createPlaneGeometry(e.polygon):"vertices"in e&&"indices"in e?this.createMeshGeometry(e.vertices,e.indices):new Vs}createMeshGeometry(e,t){const s=e.toString()+"_"+t.toString();if(this._verticesCache.has(s))return this._verticesCache.get(s);const o=new Vs;o.setIndex(new _t(t,1)),o.setAttribute("position",new _t(e,3));const r=Array();for(let l=0;l<e.length;l+=3)r.push(e[l],e[l+2]);return o.setAttribute("uv",new _t(e,3)),o.computeVertexNormals(),this._verticesCache.set(s,o),o}createPlaneGeometry(e){const t=new Vs,s=[],o=[];e.forEach(g=>{s.push(g.x,g.y,g.z),o.push(g.x,g.z)});const r=new S(s[0],s[1],s[2]),l=new S(s[3],s[4],s[5]),c=new S(s[6],s[7],s[8]),h=new S,d=new S;h.subVectors(l,r),d.subVectors(c,r),h.cross(d),h.normalize();const u=[];for(let g=0;g<s.length/3;g++)u.push(h.x,h.y,h.z);const p=[];for(let g=2;g<e.length;++g)p.push(0,g-1,g);return t.setAttribute("position",new _t(new Float32Array(s),3)),t.setAttribute("uv",new _t(new Float32Array(o),2)),t.setAttribute("normal",new _t(new Float32Array(u),3)),t.setIndex(p),t.computeBoundingBox(),t.computeBoundingSphere(),t}}Il([m(ce)],ao.prototype,"dataTemplate"),Il([m()],ao.prototype,"occluder"),Il([m()],ao.prototype,"initiateRoomCaptureIfNoData"),Il([m()],ao.prototype,"usePlaneData"),Il([m()],ao.prototype,"useMeshData"),Il([m()],ao.prototype,"runInVR");var yL=Object.defineProperty,vL=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&yL(e,t,o),o};const VS=C("debugwebxr");class um extends I{constructor(){super(...arguments),a(this,"priority",0),a(this,"_startScale")}get isActive(){return this.activeAndEnabled&&this.gameObject.visible}setAsActiveXRRig(){var e;(e=ne.active)==null||e.setRigActive(this)}setPriority(e){this.priority=e}awake(){if(VS){const e=new E;e.position.y+=.5,this.gameObject.add(e);const t=e.addNewComponent(ea);t&&(t.isGizmo=!1);const s=new Ci(.5);this.gameObject.add(s)}}isXRRig(){return!0}supportsXR(e){return!0}onEnterXR(e){this._startScale=this.gameObject.scale.clone(),e.xr.addRig(this),VS&&console.log("WebXR: add Rig",this.name,this.priority)}onLeaveXR(e){e.xr.removeRig(this),this._startScale&&this.gameObject&&this.gameObject.scale.copy(this._startScale)}}vL([m()],um.prototype,"priority");class bL extends I{constructor(){super(...arguments),a(this,"toggleKey","KeyP")}update(){this.context.input.isKeyDown(this.toggleKey)&&this.context.domElement.classList.toggle("presentation-mode")}}R.add("AlignmentConstraint",Tc),R.add("Animation",Ft),R.add("Animator",Rt),R.add("AudioListener",zn),R.add("AudioSource",ns),R.add("Avatar_Brain_LookAt",Uc),R.add("Avatar_MouthShapes",zc),R.add("Avatar_MustacheShake",Xf),R.add("AvatarBlink_Simple",zr),R.add("AvatarEyeLook_Rotation",Kf),R.add("AxesHelper",Za),R.add("BasicIKConstraint",Jf),R.add("BoxHelperComponent",Bo),R.add("Camera",ci),R.add("CharacterController",Nr),R.add("CharacterControllerInput",$n),R.add("Collider",ui),R.add("SphereCollider",Ja),R.add("BoxCollider",Nu),R.add("MeshCollider",Fo),R.add("CapsuleCollider",Wn),R.add("ContactShadows",Vc),R.add("LogStats",i0),R.add("DeleteBox",Wu),R.add("Deletable",n0),R.add("DeviceFlag",Vu),R.add("DragControls",Hr),R.add("DropListener",Hn),R.add("Duplicatable",h0),R.add("EventListEvent",Ru),R.add("EventTrigger",qu),R.add("GltfExportBox",S0),R.add("GltfExport",P0),R.add("VariantAction",j0),R.add("ChangeTransformOnClick",Xr),R.add("ChangeMaterialOnClick",B0),R.add("SetActiveOnClick",F0),R.add("HideOnStart",pp),R.add("EmphasizeOnClick",dl),R.add("PlayAudioOnClick",Vo),R.add("PlayAnimationOnClick",Jc),R.add("PreliminaryAction",ul),R.add("PreliminaryTrigger",eh),R.add("VisibilityAction",th),R.add("TapGestureTrigger",N0),R.add("USDZExporter",gn),R.add("Fog",wl),R.add("BoxGizmo",ea),R.add("GridHelper",xl),R.add("GroundProjectedEnv",en),R.add("UsageMarker",$c),R.add("Interactable",s0),R.add("FixedJoint",fy),R.add("HingeJoint",dh),R.add("Light",yi),R.add("LODGroup",ph),R.add("LookAtConstraint",Fr),R.add("NeedleMenu",un),R.add("NestedGltf",kp),R.add("Networking",_y),R.add("OffsetConstraint",ta),R.add("CameraTargetReachedEvent",Fc),R.add("OrbitControls",_e),R.add("ParticleSystemRenderer",ds),R.add("ParticleSystem",yh),R.add("PlayerColor",zl),R.add("Antialiasing",bh),R.add("BloomEffect",Np),R.add("ChromaticAberration",_h),R.add("ColorAdjustments",or),R.add("DepthOfField",As),R.add("EffectWrapper",xh),R.add("PixelationEffect",Sh),R.add("ScreenSpaceAmbientOcclusion",to),R.add("ScreenSpaceAmbientOcclusionN8",Is),R.add("SharpeningEffect",Ph),R.add("TiltShiftEffect",yn),R.add("ToneMappingEffect",nr),R.add("Vignette",la),R.add("Volume",kl),R.add("ReflectionProbe",qc),R.add("Renderer",Ui),R.add("MeshRenderer",Qc),R.add("SkinnedMeshRenderer",x0),R.add("Rigidbody",dt),R.add("SceneSwitcher",Ze),R.add("ScreenCapture",ar),R.add("ShadowCatcher",Rh),R.add("RemoteSkybox",qp),R.add("SmoothFollow",Yp),R.add("SpatialTriggerReceiver",vn),R.add("SpatialTrigger",Kp),R.add("SpectatorCamera",Zp),R.add("SpriteRenderer",gi),R.add("SyncedCamera",Wy),R.add("SyncedRoom",Ls),R.add("SyncedTransform",sn),R.add("TestRunner",Hy),R.add("TestSimulateUserData",Gy),R.add("PlayableDirector",Rl),R.add("SignalReceiver",Dh),R.add("AnimationTrackHandler",im),R.add("AudioTrackHandler",sm),R.add("SignalTrackHandler",Fh),R.add("ControlTrackHandler",nm),R.add("TransformGizmo",da),R.add("BaseUIComponent",ps),R.add("UIRootComponent",oh),R.add("Button",no),R.add("Canvas",bl),R.add("CanvasGroup",Ko),R.add("EventSystem",ii),R.add("Graphic",lh),R.add("MaskableGraphic",ch),R.add("Image",Tl),R.add("RawImage",am),R.add("InputField",Yy),R.add("VerticalLayoutGroup",oy),R.add("HorizontalLayoutGroup",ry),R.add("GridLayoutGroup",ay),R.add("Outline",vl),R.add("ObjectRaycaster",ji),R.add("GraphicRaycaster",Au),R.add("SpatialGrabRaycaster",Dc),R.add("RectTransform",Ts),R.add("SpatialHtml",Nh),R.add("Text",Nt),R.add("EnvironmentScene",cm),R.add("LookAt",Ky),R.add("OpenURL",El),R.add("VideoPlayer",yt),R.add("Voip",Do),R.add("Avatar",Go),R.add("XRControllerFollow",oo),R.add("XRControllerModel",pn),R.add("XRControllerMovement",Ni),R.add("TeleportTarget",_p),R.add("WebARCameraBackground",Hh),R.add("WebARSessionRoot",$o),R.add("WebXR",wp),R.add("AvatarMarker",hi),R.add("WebXRImageTracking",Gh),R.add("WebXRPlaneTracking",ao),R.add("XRRig",um),R.add("XRFlag",os),R.add("PlayerSync",X0),R.add("PlayerState",Ms),R.add("PresentationMode",bL);const qh=wt,_L=C("debugtypestore");_L&&console.log(R);function wL(n,e){const t=rw(n,e);return t!==void 0?t:null}const xL=new XM,sv=Symbol("deserialize-queue");async function SL(n,e,t,s=null,o){if(!t){console.debug("Can not create component instances: gltf is null");return}let r=s;typeof r=="number"&&(r=new jt(s));const l=e.indexOf("?");e=l===-1?e:e.substring(0,l);const c=new df(t.scene);c.gltfId=e,c.context=n,c.gltf=t,c.nodeToObject=o?.nodeToObjectMap,c.implementationInformation=xL;let h=n[sv];if(h||(h=n[sv]=[]),t.scenes)for(const d of t.scenes)await rv(c,d,h);if(t.children)for(const d of t.children)await rv(c,d,h);n.new_scripts_pre_setup_callbacks.push(()=>{const d=n[sv];if(d){for(const u of d)CL(u,c);d.length=0}if(r){const u={},p=[];ov(t,r,u,p);for(const g of t.scenes)ov(g,r,u,p);for(const g of p)g.resolveGuids(u)}})}const nv=Symbol("original-component-name"),Ll=new Map;function ov(n,e,t,s){if(e===null||!n)return;const o=n.guid,r=n.guid;r!=null&&r.length&&(Ll.has(r)||(qh&&console.log('Creating InstanceIdProvider with key "'+r+'" for object '+n.name),Ll.set(r,new jt(r))));const l=r&&Ll.get(r)||e;if(n.guid=l.generateUUID(),o&&o!=="invalid"&&(t[o]=n.guid),n&&n.userData&&n.userData.components)for(const c of n.userData.components){if(c===null)continue;const h=c.guid;h?Ll.has(h)||(qh&&console.log('Creating InstanceIdProvider with key "'+h+'" for component '+c[nv]),Ll.set(h,new jt(h))):qh&&console.warn("Can not create IdProvider: component "+c[nv]+" has no guid",c.guid);const d=Ll.get(h)||e,u=c.guid;c.guid=d.generateUUID(),u&&u!=="invalid"&&(t[u]=c.guid),c.resolveGuids&&s.push(c)}if(n.children)for(const c of n.children)ov(c,e,t,s)}const Xh=[];async function rv(n,e,t,s){var o,r,l,c,h;if(!e)return;const d=e.userData;if(d){const u=d.builtin_components;if(u&&u.length>0)for(const p of u)try{if(p===null)continue;const g=R.get(p.name);if(g!=null){const f=new g;f.sourceId=n.gltfId,za(f,p,n.implementationInformation),f.context=n.context,"guid"in p&&(f[oc]=p.guid),f[nv]=p.name,Mr(e,f,!1),t.push({instance:f,compData:p,obj:e}),f.isCamera&&n.context&&n.context.mainCamera===null&&f.tag==="MainCamera"&&n.context.setCurrentCamera(f),((l=(r=(o=n.context)==null?void 0:o.physics)==null?void 0:r.engine)==null?void 0:l.isInitialized)===!1&&(f.isCollider||f.isRigidbody)&&((h=(c=n.context)==null?void 0:c.physics.engine)==null||h.initialize())}else qh&&console.debug("unknown component: "+p.name),Xh.includes(p.name)||Xh.push(p.name)}catch(g){console.error(p.name+" - "+g.message,g)}if(Xh.length>0){const p=Xh.join(", ");console.warn("unknown components: "+p),Xh.length=0,Xt()&&De(`<strong>Unknown components in scene</strong>:
|
|
1450
|
+
|
|
1451
|
+
${p}
|
|
1452
|
+
|
|
1453
|
+
This could mean you forgot to add a npmdef to your ExportInfo
|
|
1454
|
+
<a href="https://engine.needle.tools/docs/project_structure.html#creating-and-installing-a-npmdef" target="_blank">documentation</a>`,ki.Warn)}}if(e.children)for(const u of e.children)await rv(n,u,t)}function CL(n,e){const{instance:t,compData:s,obj:o}=n;e.object=o,e.target=t,su(t,s,e),qh&&console.debug("add "+s.name,s,t)}class $S{createBuiltinComponents(e,t,s,o,r){return SL(e,t,s,o,r)}writeBuiltinComponentData(e,t){return wL(e,t)}parseSync(e,t,s,o){return qS(e,t,s,o)}loadSync(e,t,s,o,r){return av(e,t,s,o,r)}}wg($S);const HS=C("printGltf")||C("printgltf"),PL=C("debugfileformat");async function GS(n,e){const t=await Xx(n,{useExtension:!0})||"unknown";PL&&console.debug(`Determined file type: '${t}' for url '${n}'`,{registeredModelLoaderCallbacks:tl});for(const s of tl){const{callback:o}=s,r=o({context:e,url:n,mimetype:t});if(r instanceof Promise&&await r,r)return console.debug(`Using custom loader (${s.name||"unnamed"}) for ${t} at '${n}'`),r}switch(t){case"unsupported":return null;default:case"unknown":{console.warn(`Unknown file type (${t}). Needle Engine will fallback to the GLTFLoader - To support more model formats please create a Needle loader plugin.
|
|
1455
|
+
Use import { NeedleEngineModelLoader } from "@needle-tools/engine" namespace to register your loader.`,n);const s=new Rn;return await Ku(s,e,n),s}case"model/fbx":case"model/vnd.autodesk.fbx":return new qv;case"model/obj":return new Vm;case"model/vnd.usdz+zip":case"model/vnd.usd+zip":case"model/vnd.usda+zip":return console.warn(t.toUpperCase()+" files are not supported."),null;case"model/gltf+json":case"model/gltf-binary":case"model/vrm":{const s=new Rn;return await Ku(s,e,n),s}}}function OL(n,e){return av(e?.context||J.Current,n,n,e?.seed||null,e?.onprogress)}async function qS(n,e,t,s){typeof t!="string"&&(console.warn("Parse gltf binary without path, this might lead to errors in resolving extensions. Please provide the source path of the gltf/glb file",t,typeof t),t=""),HS&&console.log("Parse glTF",t);const o=await GS(t,n);if(!o)return;const{componentsExtension:r}=XS(o,n);if(o instanceof Vm){typeof e!="string"&&(e=new TextDecoder().decode(e));const l=o.parse(e);return await Qh(o,n,t,l,s,r)}if(!(o instanceof Rn)){if(o.parse===void 0){console.error("Loader does not support parse");return}const l=o.parse(e,t);return await Qh(o,n,t,l,s,r)}return new Promise((l,c)=>{try{let h=t.split("?")[0].trimEnd();const d=h.split("/");d.length>0&&d[d.length-1]!==""&&d.pop(),h=d.join("/"),h.endsWith("/")||(h+="/"),o.resourcePath=h,o.parse(e,"",async u=>{const p=await Qh(o,n,t,u,s,r);l(p)},u=>{console.error('Loading asset at "'+t+`" failed
|
|
1456
|
+
`,u),l(void 0)})}catch(h){console.error(h),c(h)}})}async function av(n,e,t,s,o){ML(e);const r=await GS(e,n);if(!r)return;const{componentsExtension:l}=XS(r,n);if(!(r instanceof Rn)){const c=await r.loadAsync(e,o);return await Qh(r,n,e,c,s,l)}return new Promise((c,h)=>{try{r.load(e,async d=>{const u=await Qh(r,n,t,d,s,l);c(u)},d=>{o?.call(r,d)},d=>{console.error('Loading asset at "'+e+`" failed
|
|
1457
|
+
`,d),c(void 0)})}catch(d){console.error(d),h(d)}})}function XS(n,e){const t=y0(n);return n instanceof Rn&&jf(n,e),{componentsExtension:t}}async function Qh(n,e,t,s,o,r){var l;if(HS&&console.warn("Loaded",t,s),s==null)return console.error(`Loaded model is null '${t}' - please make sure the loader is registered correctly`),{scene:new E,animations:[],scenes:[]};if(typeof s!="object")return console.error(`Loaded model is not an object '${t}' - please make sure the loader is registered correctly`),{scene:new E,animations:[],scenes:[]};if(s instanceof E)s={scene:s,animations:s.animations,scenes:[s]};else if(s instanceof Vs){const c=new bt({color:new oe(14540253)}),h=new G(s,c);s={scene:h,animations:[],scenes:[h]}}else Array.isArray(s.scenes)===!1&&console.error(`[Needle Engine] The loaded model object does not have a scenes property '${t}' - please make sure the loader is registered correctly and three.js is not imported multiple times.`);if(t.includes("?")&&(t=t.split("?")[0]),"scenes"in s)for(const c of s.scenes)c&&!((l=c.animations)!=null&&l.length)&&(c.animations=[...s.animations]);return RL(n,s),Rx(s)&&(a1(t,s,e),await xs().createBuiltinComponents(e,t,s,o,r||void 0)),await kL(s.scene,e,e.mainCamera),s}async function kL(n,e,t){t||(t=e.mainCamera);try{t?await e.renderer.compileAsync(n,t,e.scene).catch(s=>{console.warn(s.message)}):IM(n,e)}catch(s){console.warn(s?.message||s)}}function ML(n){if(new URL(n,window.location.href).href.startsWith("file://")){const e=`Hi - it looks like you are trying to load a local file which will not work. You need to use a webserver to serve your files.
|
|
1458
|
+
Please refer to the documentation on <a href="https://fwd.needle.tools/needle-engine/docs/local-server">https://docs.needle.tools</a> or ask for help in our <a href="https://discord.needle.tools">discord community</a>`;De(e),console.warn(e)}}function RL(n,e){if(n instanceof qv||n instanceof Vm){let t=e;t instanceof E||(t=e.scene),t.traverse(s=>{const o=s;o!=null&&o.isMesh&&gg(o,o.material)})}}const Yh=C("debugoverlay"),QS="ar",TL="quit-ar";class EL{constructor(){a(this,"arContainer",null),a(this,"currentSession",null),a(this,"_createdAROnlyElements",[]),a(this,"_reparentedObjects",[]),a(this,"contentElement",null),a(this,"originalDomOverlayParent",null),a(this,"requestEndAR",()=>{this.onRequestedEndAR()})}get ARContainer(){return this.arContainer}onBegin(e,t,s){var o;if(this.currentSession=s,this.arContainer=t,X.isMozillaXR()){const r=e.domElement.children;for(let l=0;l<r?.length;l++){const c=r[l];if(!c||c===this.arContainer)return;this._reparentedObjects.push({el:c,previousParent:c.parentElement}),(o=this.arContainer)==null||o.appendChild(c)}t?(this.originalDomOverlayParent=t.parentNode,this.originalDomOverlayParent&&(console.log("Reparent DOM Overlay to body",t,t.style.display),t.style.display="",t.style.visibility="",document.body.appendChild(t))):console.warn("WebXRViewer: No DOM Overlay found")}this.ensureQuitARButton(this.arContainer)}onEnd(e){var t;for(const s of this._createdAROnlyElements)s.remove&&s.remove();for(const s of this._reparentedObjects){const o=s.el;(t=s.previousParent)==null||t.appendChild(o)}this._reparentedObjects.length=0,X.isMozillaXR()&&setTimeout(()=>{var s;const o=e.renderer.domElement;o&&((s=e.domElement.shadowRoot)==null||s.prepend(o));const r=document.querySelectorAll("*");for(var l=0;l<r.length;l++){const c=r[l];c&&c._displayChanged!==void 0&&c._displayWas!==void 0&&(c.style.display=c._displayWas)}},10)}createOverlayContainer(e){if(this.contentElement)return this.contentElement;Yh&&console.log("Setup overlay container");const t=e.shadowRoot.querySelector(".content");this.contentElement=t;const s=e.shadowRoot.querySelector(".overlay-content");return s&&t.appendChild(s),Yh&&!X.isMobileDevice()&&this.ensureQuitARButton(t),t}onRequestedEndAR(){this.currentSession&&(this.currentSession.end(),this.currentSession=null)}ensureQuitARButton(e){const t=document.createElement("slot");t.setAttribute("name","quit-ar"),this.appendElement(t,e),this._createdAROnlyElements.push(t),t.style.pointerEvents="auto";const s=document.querySelector(`.${TL}`);if(s){s.addEventListener("click",this.requestEndAR),Yh&&s.addEventListener("click",()=>console.log("Clicked quit-ar button"));return}t.addEventListener("click",this.requestEndAR),Yh&&t.addEventListener("click",()=>console.log("Clicked fallback close button"));const o=document.createElement("div");o.style.cssText=`
|
|
1459
|
+
position: fixed;
|
|
1460
|
+
top: 0;
|
|
1461
|
+
right: 0;
|
|
1462
|
+
z-index: 600;
|
|
1463
|
+
pointer-events: all;
|
|
1464
|
+
`,this.appendElement(o,t);var r=document.createElementNS("http://www.w3.org/2000/svg","svg");r.classList.add("quit-ar-button"),r.setAttribute("width","40px"),r.setAttribute("height","40px"),r.style.cssText=`
|
|
1465
|
+
background: rgba(255, 255, 255, .4);
|
|
1466
|
+
-webkit-backdrop-filter: blur(8px);
|
|
1467
|
+
backdrop-filter: blur(8px);
|
|
1468
|
+
border-radius: 50%;
|
|
1469
|
+
box-shadow: 0 0 5px rgba(0,0,0,.3);
|
|
1470
|
+
outline: 1px solid rgba(255, 255, 255, .6);
|
|
1471
|
+
display: flex;
|
|
1472
|
+
justify-content: center;
|
|
1473
|
+
align-items: center;
|
|
1474
|
+
`,o.appendChild(r);var l=document.createElementNS("http://www.w3.org/2000/svg","path");l.setAttribute("d","M 12,12 L 28,28 M 28,12 12,28"),l.setAttribute("stroke","#000000"),l.setAttribute("stroke-width","2px"),l.style.cssText=`
|
|
1475
|
+
/**filter: drop-shadow(0 0px 1.2px rgba(0,0,0,.7));**/
|
|
1476
|
+
`,r.appendChild(l),Yh&&console.log("Created fallback close button",r,e)}appendElement(e,t){return t.shadowRoot?t.shadowRoot.appendChild(e):t.appendChild(e)}}const ga=C("debugloading"),Kh=C("debugloadingrendering"),YS=C("debuglicense");class AL{constructor(){a(this,"className"),a(this,"additionalClasses")}}let Zh=0,KS;function lv(n){ga&&console.log(n.progress.loaded.toFixed(0)+"/"+n.progress.total.toFixed(0),n);const e=n.count,t=n.progress.total;t===0||t===void 0?(KS!==n.name&&(Zh=0),KS=n.name,Zh+=(1-Zh)*.001,ga&&be("Loading "+n.name+" did not report total size")):Zh=n.progress.loaded/t;const s=n.index/e+Zh/e;return W.clamp01(s)}const ZS=class Pv{constructor(e,t){a(this,"loadingProgress",0),a(this,"_element"),a(this,"_progress",0),a(this,"_allowCustomLoadingElement",!0),a(this,"_loadingElement"),a(this,"_loadingTextContainer",null),a(this,"_loadingBar",null),a(this,"_messageContainer",null),a(this,"_loadingElementOptions"),a(this,"_progressLoop"),this._element=e,this._loadingElementOptions=t}async onLoadingBegin(e){const t=this._element.shadowRoot||this._element;if(ga&&console.warn("Begin Loading"),!this._loadingElement){for(let s=0;s<t.children.length;s++){const o=t.children[s];if(o.classList.contains(Pv.LoadingContainerClassName)){if(!this._allowCustomLoadingElement){ga&&console.warn("Remove custom loading container"),t.removeChild(o);continue}this._loadingElement=this.createLoadingElement(o)}}this._loadingElement||(this._loadingElement=this.createLoadingElement())}this._progress=0,this.loadingProgress=0,this._loadingElement.style.display="flex",t.appendChild(this._loadingElement),this.smoothProgressLoop(),this.setMessage(e??"")}onLoadingUpdate(e,t){var s;if(!((s=this._loadingElement)!=null&&s.parentNode))return;let o=0;typeof e=="number"?o=e:("index"in e&&(o=lv(e)),!t&&"name"in e&&this.setMessage("loading "+e.name)),this.loadingProgress=o,t&&this.setMessage(t),this.updateDisplay()}onLoadingFinished(){ga&&console.warn("Finished Loading"),Kh||(this.loadingProgress=1,this.onDoneLoading())}setMessage(e){this._messageContainer&&(this._messageContainer.innerText=e)}smoothProgressLoop(){if(this._progressLoop)return;let e=1/12;Kh&&(e=1/500,typeof Kh=="number"&&(e*=Kh)),this._progressLoop=setInterval(()=>{this.loadingProgress>=.95&&!Kh&&(e=.9),this._progress=W.lerp(this._progress,this.loadingProgress,e*this.loadingProgress),this.updateDisplay()},e)}onDoneLoading(){this._loadingElement&&(ga&&console.log("Hiding loading element"),this._loadingElement.style.display="none",this._loadingElement.remove()),this._progressLoop&&clearInterval(this._progressLoop),this._progressLoop=null}updateDisplay(){const e=this._progress,t=(e*100).toFixed(0)+"%";this._loadingBar&&(this._loadingBar.style.width=e*100+"%"),this._loadingTextContainer&&(this._loadingTextContainer.textContent=t)}createLoadingElement(e){var t,s;ga&&!e&&console.log("Creating loading element"),this._loadingElement=e||document.createElement("div");let o=this._element.getAttribute("loading-style");(!o||o==="auto")&&(window.matchMedia("(prefers-color-scheme: dark)").matches?o="dark":o="light");const r=Zs();if(!e){this._loadingElement.style.position="absolute",this._loadingElement.style.width="100%",this._loadingElement.style.height="100%",this._loadingElement.style.left="0",this._loadingElement.style.top="0";const y=this._element.getAttribute("loading-background");y?this._loadingElement.style.background=y:this._loadingElement.style.backgroundColor="transparent",this._loadingElement.style.display="flex",this._loadingElement.style.alignItems="center",this._loadingElement.style.justifyContent="center",this._loadingElement.style.zIndex=Number.MAX_SAFE_INTEGER.toString(),this._loadingElement.style.flexDirection="column",this._loadingElement.style.pointerEvents="none",this._loadingElement.style.color="white",this._loadingElement.style.fontFamily='system-ui, Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"',this._loadingElement.style.fontSize="1rem",o==="light"?this._loadingElement.style.color="rgba(0,0,0,.6)":this._loadingElement.style.color="rgba(255,255,255,.3)"}const l=((t=this._loadingElementOptions)==null?void 0:t.className)??Pv.LoadingContainerClassName;if(this._loadingElement.classList.add(l),(s=this._loadingElementOptions)!=null&&s.additionalClasses)for(const y of this._loadingElementOptions.additionalClasses)this._loadingElement.classList.add(y);const c=document.createElement("div");this._loadingElement.appendChild(c);const h=document.createElement("img"),d=120;if(h.style.width=`${d}px`,h.style.height=`${d}px`,h.style.paddingTop="20px",h.style.paddingBottom="10px",h.style.margin="0px",h.style.userSelect="none",h.style.objectFit="contain",h.style.transition="transform 1.5s ease-out, opacity .3s ease-in-out",h.style.transform="translateY(30px)",h.style.opacity="0.05",setTimeout(()=>{h.style.opacity="1",h.style.transform="translateY(0px)"},1),h.src=nb,r&&this._element){const y=this._element.getAttribute("loading-logo-src");y&&(h.src=y)}c.appendChild(h);const u=document.createElement("div");u.style.cssText=`
|
|
1477
|
+
display: flex;
|
|
1478
|
+
flex-direction: column;
|
|
1479
|
+
align-items: center;
|
|
1480
|
+
justify-content: center;
|
|
1481
|
+
width: 100%;
|
|
1482
|
+
opacity: 0;
|
|
1483
|
+
transition: opacity 1s ease-in-out 4s;
|
|
1484
|
+
`,setTimeout(()=>{u.style.opacity="1"},1),this._loadingElement.appendChild(u);const p=document.createElement("div"),g=100;p.style.display="flex",p.style.width=g+"%",p.style.height="3px",p.style.position="absolute",p.style.left="0",p.style.bottom="0px",p.style.opacity="0",p.style.transition="opacity 1s ease-in-out 2s",setTimeout(()=>{p.style.opacity="1"},1),o==="light"?p.style.backgroundColor="rgba(0,0,0,.2)":p.style.backgroundColor="rgba(255,255,255,.2)",this._loadingElement.appendChild(p),this._loadingBar=document.createElement("div"),p.appendChild(this._loadingBar);const f=function(y){return W.lerp(0,g,y)+"%"};if(this._loadingBar.style.background="#66A22F",this._loadingBar.style.backgroundAttachment="fixed",this._loadingBar.style.width="0%",this._loadingBar.style.height="100%",r&&this._element){const y=this._element.getAttribute("primary-color"),v=this._element.getAttribute("secondary-color");y&&v?this._loadingBar.style.background=`linear-gradient(90deg, ${y} ${f(0)}, ${v} ${f(1)})`:y?this._loadingBar.style.background=y:v&&(this._loadingBar.style.background=v)}return this.handleRuntimeLicense(this._loadingElement),this._loadingElement}async handleRuntimeLicense(e){let t=Js();if(t)return;YS&&console.log("Loading UI has commercial license?",t);const s=document.createElement("div");s.style.paddingTop=".6em",s.style.fontSize=".8em",s.style.textTransform="uppercase",s.innerText=`NEEDLE ENGINE NON COMMERCIAL VERSION
|
|
1485
|
+
CLICK HERE TO GET A LICENSE`,s.style.cursor="pointer",s.style.userSelect="none",s.style.textAlign="center",s.style.pointerEvents="all",s.addEventListener("click",()=>window.open("https://needle.tools/pricing","_self")),s.style.opacity="0",e.appendChild(s),!F()&&jr&&(YS&&console.log("Waiting for runtime license check"),await jr,t=Js()),!t&&(s.style.transition="opacity .5s ease-in-out",s.style.opacity="1")}};a(ZS,"LoadingContainerClassName","loading");let JS=ZS;wg($S);const Ie=C("debugwebcomponent"),eC="needle-engine",tC="vr",iC="desktop",IL=[QS,tC,iC],Jh="ar-session-active",ed="desktop-session-active",LL=["public-key","version","hash","src","camera-controls","loadstart","progress","loadfinished","dracoDecoderPath","dracoDecoderType","ktx2DecoderPath","tone-mapping","tone-mapping-exposure","background-blurriness","background-color"];class cv extends HTMLElement{constructor(){super(),a(this,"_context"),a(this,"_overlay_ar"),a(this,"_loadingProgress01",0),a(this,"_loadingView"),a(this,"_previousSrc",null),a(this,"_didFullyLoad",!1),a(this,"_loadId",0),a(this,"_abortController",null),a(this,"_lastSourceFiles",null),a(this,"_createContextPromise",null),a(this,"onXRSessionStarted",()=>{var t;const s=this.context.xrSessionMode;s==="immersive-ar"?this.onEnterAR(this.context.xrSession):s==="immersive-vr"&&this.onEnterVR(this.context.xrSession),(t=this.context.xrSession)==null||t.addEventListener("end",()=>{this.dispatchEvent(new CustomEvent("xr-session-ended",{detail:{session:this.context.xrSession,context:this._context,sessionMode:s}})),s==="immersive-ar"?this.onExitAR(this.context.xrSession):s==="immersive-vr"&&this.onExitVR(this.context.xrSession)})}),a(this,"onReady",()=>{var t;return(t=this._loadingView)==null?void 0:t.onLoadingFinished()}),a(this,"onError",()=>{var t;return(t=this._loadingView)==null?void 0:t.setMessage("Loading failed!")}),a(this,"_previouslyRegisteredMap",new Map),this._overlay_ar=new EL,this.addEventListener("ready",this.onReady),Qw(),this.attachShadow({mode:"open"});const e=document.createElement("template");e.innerHTML=`<style>
|
|
1486
|
+
@import url('https://fonts.googleapis.com/css2?family=Roboto+Flex:opsz,wght@8..144,100..1000&display=swap');
|
|
1487
|
+
|
|
1488
|
+
:host {
|
|
1489
|
+
position: absolute;
|
|
1490
|
+
display: block;
|
|
1491
|
+
width: max(600px, 100%);
|
|
1492
|
+
height: max(300px, 100%);
|
|
1493
|
+
touch-action: none;
|
|
1494
|
+
|
|
1495
|
+
-webkit-tap-highlight-color: transparent;
|
|
1496
|
+
}
|
|
1497
|
+
|
|
1498
|
+
@media (max-width: 600px) {
|
|
1499
|
+
:host {
|
|
1500
|
+
width: 100%;
|
|
1501
|
+
}
|
|
1502
|
+
}
|
|
1503
|
+
@media (max-height: 300px) {
|
|
1504
|
+
:host {
|
|
1505
|
+
height: 100%;
|
|
1506
|
+
}
|
|
1507
|
+
}
|
|
1508
|
+
|
|
1509
|
+
:host > div.canvas-wrapper {
|
|
1510
|
+
width: 100%;
|
|
1511
|
+
height: 100%;
|
|
1512
|
+
}
|
|
1513
|
+
|
|
1514
|
+
:host canvas {
|
|
1515
|
+
position: absolute;
|
|
1516
|
+
user-select: none;
|
|
1517
|
+
-webkit-user-select: none;
|
|
1518
|
+
|
|
1519
|
+
/** allow touch panning but no pinch zoom **/
|
|
1520
|
+
/** but this doesnt work yet:
|
|
1521
|
+
* touch-action: pan-x, pan-y;
|
|
1522
|
+
**/
|
|
1523
|
+
|
|
1524
|
+
-webkit-touch-callout: none;
|
|
1525
|
+
-webkit-user-drag: none;
|
|
1526
|
+
-webkit-user-modify: none;
|
|
1527
|
+
|
|
1528
|
+
left: 0;
|
|
1529
|
+
top: 0;
|
|
1530
|
+
}
|
|
1531
|
+
:host .content {
|
|
1532
|
+
position: absolute;
|
|
1533
|
+
top: 0;
|
|
1534
|
+
width: 100%;
|
|
1535
|
+
height: 100%;
|
|
1536
|
+
visibility: visible;
|
|
1537
|
+
z-index: 500; /* < must be less than the webxr buttons element */
|
|
1538
|
+
pointer-events: none;
|
|
1539
|
+
}
|
|
1540
|
+
:host .overlay-content {
|
|
1541
|
+
position: absolute;
|
|
1542
|
+
user-select: auto;
|
|
1543
|
+
pointer-events: all;
|
|
1544
|
+
}
|
|
1545
|
+
:host slot[name="quit-ar"]:hover {
|
|
1546
|
+
cursor: pointer;
|
|
1547
|
+
}
|
|
1548
|
+
:host .quit-ar-button {
|
|
1549
|
+
position: absolute;
|
|
1550
|
+
// top: env(titlebar-area-y); /** this doesnt work **/
|
|
1551
|
+
top: 60px; /** camera access needs a bit more space **/
|
|
1552
|
+
right: 20px;
|
|
1553
|
+
z-index: 9999;
|
|
1554
|
+
}
|
|
1555
|
+
</style>
|
|
1556
|
+
<div class="canvas-wrapper"> <!-- this wrapper is necessary for WebXR https://github.com/meta-quest/immersive-web-emulator/issues/55 -->
|
|
1557
|
+
<canvas></canvas>
|
|
1558
|
+
</div>
|
|
1559
|
+
<div class="content">
|
|
1560
|
+
<slot class="overlay-content"></slot>
|
|
1561
|
+
</div>
|
|
1562
|
+
`,this.shadowRoot&&this.shadowRoot.appendChild(e.content.cloneNode(!0)),this._context=new J({domElement:this}),this.addEventListener("error",this.onError)}static get observedAttributes(){return LL}get loadingProgress01(){return this._loadingProgress01}get loadingFinished(){return this.loadingProgress01>.999}get cameraControls(){const e=this.getAttribute("camera-controls");return e==null?null:!(e===null||e==="False"||e==="false"||e==="0"||e==="none")}getContext(){return new Promise((e,t)=>{if(this._context&&this.loadingFinished)e(this._context);else{const s=()=>{this.removeEventListener("loadfinished",s),this._context&&this.loadingFinished&&e(this._context)};this.addEventListener("loadfinished",s)}})}get context(){return this._context}async connectedCallback(){if(Ie&&console.log("<needle-engine> connected"),this.setPublicKey(),this.setVersion(),this.addEventListener("xr-session-started",this.onXRSessionStarted),this.onSetupDesktop(),!this.getAttribute("src")){const t=globalThis["needle:codegen_files"];Ie&&console.log('src is null, trying to load from globalThis["needle:codegen_files"]',t),t&&(Ie&&console.log('globalThis["needle:codegen_files"]',t),this.setAttribute("src",t))}Ie&&console.log("src",this.getAttribute("src"));const e=this._loadId;setTimeout(()=>{this.isConnected!==!1&&e===this._loadId&&this.onLoad()},1)}disconnectedCallback(){var e;this.removeEventListener("xr-session-started",this.onXRSessionStarted),this._didFullyLoad=!1;const t=this.getAttribute("keep-alive"),s=t==null||t?.length>0&&t!=="true"&&t!=="1";Ie&&console.warn('<needle-engine> disconnected, keep-alive: "'+t+'"',typeof t,"Dispose=",s),s?(Ie&&console.warn("<needle-engine> dispose"),(e=this._context)==null||e.dispose(),this._context=null,this._lastSourceFiles=null,this._loadId+=1):Ie&&console.warn("<needle-engine> is not disposed because keep-alive is set")}attributeChangedCallback(e,t,s){switch(Ie&&console.log("attributeChangedCallback",e,t,s),e){case"src":Ie&&console.warn(`<needle-engine src>
|
|
1563
|
+
changed from "`,t,'" to "',s,'"'),this.onLoad();break;case"hash":this._context&&(this._context.hash=s);break;case"loadstart":case"progress":case"loadfinished":typeof s=="string"&&s.length>0&&(Ie&&console.log(e+" attribute changed",s),this.registerEventFromAttribute(e,s));break;case"dracoDecoderPath":Ie&&console.log("dracoDecoderPath",s),nx(s);break;case"dracoDecoderType":s==="wasm"||s==="js"?(Ie&&console.log("dracoDecoderType",s),ox(s)):console.error("Invalid dracoDecoderType",s,"expected js or wasm");break;case"ktx2DecoderPath":Ie&&console.log("ktx2DecoderPath",s),rx(s);break;case"tone-mapping":{this.applyAttributes();break}case"tone-mapping-exposure":{this.applyAttributes();break}case"background-blurriness":{const o=parseFloat(s);o!=null&&this._context&&(this._context.scene.backgroundBlurriness=o);break}case"background-color":{this.applyAttributes();break}case"public-key":{s!=nc&&this.setPublicKey();break}case"version":{s!=ws&&this.setVersion();break}}}get toneMapping(){return this.getAttribute("tonemapping")||this.getAttribute("tone-mapping")}async onLoad(){var e,t;if(!this.isConnected)return;if(this._context||(Ie&&console.warn("Create new context"),this._context=new J({domElement:this})),!this._context){console.error("Needle Engine: Context not initialized");return}const s=this.getSourceFiles();if(!this.checkIfSourceHasChanged(s,this._lastSourceFiles))return;this._abortController&&(Ie&&console.warn("Abort previous loading process"),this._abortController.abort(),this._abortController=null),this._lastSourceFiles=s;const o=++this._loadId;if((s==null||s.length<=0)&&(Ie&&console.warn("Clear scene",s),this._context.clear(),o!==this._loadId))return;const r=this.getAttribute("alias");this.classList.add("loading");const l=Js();this.ensureLoadStartIsRegistered();let c=this.dispatchEvent(new CustomEvent("loadstart",{detail:{context:this._context,alias:r},cancelable:!0}));if(l){const b=this.getAttribute("hide-loading-overlay");b!=null&&b!=="0"&&(c=!1)}c===!1&&!l&&(F()||(c=!0),console.warn("Needle Engine: You need a commercial license to override the default loading view. Visit https://needle.tools/pricing"),F()&&be('You need a <a target="_blank" href="https://needle.tools/pricing">commercial license</a> to override the default loading view. This will not work in production.')),!this._loadingView&&c&&(this._loadingView=new JS(this)),c&&(this._didFullyLoad!==!0?(e=this._loadingView)==null||e.onLoadingBegin("begin load"):setTimeout(()=>{this._loadingView&&this._loadingProgress01<.3&&this._loadId===o&&this._loadingView.onLoadingBegin("begin load")},300)),Ie&&console.warn(`--------------
|
|
1564
|
+
Needle Engine: Begin loading `+o+`
|
|
1565
|
+
`,s),this.onBeforeBeginLoading();const h=[],d={context:this._context,name:"",progress:{},index:0,count:s.length,totalProgress01:this._loadingProgress01},u=new CustomEvent("progress",{detail:d}),p=new Array,g=new AbortController;this._abortController=g;const f={files:s,abortSignal:g.signal,onLoadingProgress:b=>{var _;if(Ie&&console.debug("Loading progress: ",b),g.signal.aborted)return;const w=b.index;!p[w]&&b.name&&(p[w]=jL(b.name)),b.name=p[w],c&&((_=this._loadingView)==null||_.onLoadingUpdate(b)),d.name=b.name,d.progress=b.progress,this._loadingProgress01=lv(b),d.totalProgress01=this._loadingProgress01,this.dispatchEvent(u)},onLoadingFinished:(b,_,w)=>{Ie&&console.debug(`Finished loading "${_}" (aborted? ${g.signal.aborted})`),!g.signal.aborted&&w&&h.push({src:_,file:w})}},y=this.getAttribute("hash");y!=null&&(this._context.hash=y),this._context.alias=r,this._createContextPromise=this._context.create(f);const v=await this._createContextPromise;if(this.applyAttributes(),Ie&&console.warn(`--------------
|
|
1566
|
+
Needle Engine: finished loading `+o+`
|
|
1567
|
+
`,s,`Aborted? ${g.signal.aborted}`),g.signal.aborted){console.log("Loading finished but aborted...");return}if(this._loadId!==o){console.log("Load id changed during loading process");return}this._loadingProgress01=1,c&&v&&((t=this._loadingView)==null||t.onLoadingUpdate(1,"creating scene")),this._didFullyLoad=!0,this.classList.remove("loading"),this.classList.add("loading-finished"),this.dispatchEvent(new CustomEvent("loadfinished",{detail:{context:this._context,src:r,loadedFiles:h}}))}applyAttributes(){var e,t;if((e=this._context)!=null&&e.renderer){const r=Gw(this.toneMapping);r!==void 0&&(this._context.renderer.toneMapping=r);const l=this.getAttribute("tone-mapping-exposure");if(l!=null){const c=parseFloat(l);isNaN(c)||(this._context.renderer.toneMappingExposure=c)}}const s=this.getAttribute("background-blurriness");if(s!=null){const r=parseFloat(s);r!==void 0&&this._context&&(this._context.scene.backgroundBlurriness=r)}const o=this.getAttribute("background-color");if((t=this._context)!=null&&t.renderer&&typeof o=="string"&&o.length>0){const r=he.fromColorRepresentation(o);Ie&&console.debug("<needle-engine> background-color changed, str:",o,"\u2192",r),this._context.renderer.setClearColor(r,r.alpha),this.context.scene.background=null}}internalSetLoadingMessage(e){var t;(t=this._loadingView)==null||t.setMessage(e)}getSourceFiles(){const e=this.getAttribute("src");if(!e)return[];let t;Array.isArray(e)?t=e:e.startsWith("[")&&e.endsWith("]")?t=JSON.parse(e):e.includes(",")?t=e.split(","):t=[e];for(let s=t.length-1;s>=0;s--){const o=t[s];(o==="null"||o==="undefined"||o?.length<=0)&&t.splice(s,1)}return t}checkIfSourceHasChanged(e,t){if(e?.length!==t?.length||e==null&&t!==null||e!==null&&t==null)return!0;if(e!==null&&t!==null){for(let s=0;s<e?.length;s++)if(e[s]!==t[s])return!0}return!1}ensureLoadStartIsRegistered(){const e=this.getAttribute("loadstart");e&&this.registerEventFromAttribute("loadstart",e)}registerEventFromAttribute(e,t){const s=this._previouslyRegisteredMap.get(e);if(s&&(this._previouslyRegisteredMap.delete(e),this.removeEventListener(e,s)),typeof t=="string"&&t.length>0)try{const o=(0,eval)(t);typeof o=="function"&&(this._previouslyRegisteredMap.set(e,o),this.addEventListener(e,r=>o?.call(globalThis,this._context,r)))}catch(o){console.error("Error registering event "+e+'="'+t+`" failed with the following error:
|
|
1568
|
+
`,o)}}setPublicKey(){nc.length>0&&this.setAttribute("public-key",nc)}setVersion(){ws.length>0&&this.setAttribute("version",ws)}getAROverlayContainer(){return this._overlay_ar.createOverlayContainer(this)}getVROverlayContainer(){for(let e=0;e<this.children.length;e++){const t=this.children[e];if(t.classList.contains("vr"))return t}return null}onEnterAR(e){var t;this.onSetupAR();const s=this.getAROverlayContainer();this._overlay_ar.onBegin(this._context,s,e),this.dispatchEvent(new CustomEvent("enter-ar",{detail:{session:e,context:this._context,htmlContainer:(t=this._overlay_ar)==null?void 0:t.ARContainer}}))}onExitAR(e){var t;this._overlay_ar.onEnd(this._context),this.onSetupDesktop(),this.dispatchEvent(new CustomEvent("exit-ar",{detail:{session:e,context:this._context,htmlContainer:(t=this._overlay_ar)==null?void 0:t.ARContainer}}))}onEnterVR(e){this.onSetupVR(),this.dispatchEvent(new CustomEvent("enter-vr",{detail:{session:e,context:this._context}}))}onExitVR(e){this.onSetupDesktop(),this.dispatchEvent(new CustomEvent("exit-vr",{detail:{session:e,context:this._context}}))}onSetupAR(){this.classList.add(Jh),this.classList.remove(ed);const e=this.getAROverlayContainer();Ie&&console.warn("onSetupAR:",e),e&&(e.classList.add(Jh),e.classList.remove(ed)),this.foreachHtmlElement(t=>this.setupElementsForMode(t,QS))}onSetupVR(){this.classList.remove(Jh),this.classList.remove(ed),this.foreachHtmlElement(e=>this.setupElementsForMode(e,tC))}onSetupDesktop(){this.classList.remove(Jh),this.classList.add(ed);const e=this.getAROverlayContainer();e&&(e.classList.remove(Jh),e.classList.add(ed)),this.foreachHtmlElement(t=>this.setupElementsForMode(t,iC))}setupElementsForMode(e,t,s=null){var o,r;if(!(e===((r=(o=this._context)==null?void 0:o.renderer)==null?void 0:r.domElement)||e.id==="VRButton"||e.id==="ARButton"))if(e.classList.contains(t))e.style.visibility="visible",e.style.display==="none"&&(e.style.display="block");else for(const l of IL)e.classList.contains(l)&&(e.style.visibility="hidden",e.style.display="none")}foreachHtmlElement(e){for(let t=0;t<this.children.length;t++){const s=this.children[t];s.style&&e(s)}}onBeforeBeginLoading(){const e=this.getAttribute("dracoDecoderPath");e&&(Ie&&console.log("using custom draco decoder path",e),nx(e));const t=this.getAttribute("dracoDecoderType");t&&(Ie&&console.log("using custom draco decoder type",t),ox(t));const s=this.getAttribute("ktx2DecoderPath");s&&(Ie&&console.log("using custom ktx2 decoder path",s),rx(s))}}typeof window<"u"&&!window.customElements.get(eC)&&window.customElements.define(eC,cv);function jL(n){if(n.startsWith("blob:"))return"blob";const e=n.split("/");let t=e[e.length-1];const s=t.indexOf("?");s>0&&(t=t.substring(0,s));const o=t.indexOf("=");o>0&&(t=t.substring(o));const r=t.split(".").pop(),l=r?["glb","gltf","usdz","usd","fbx","obj","mtl"].indexOf(r.toLowerCase()):-1;if(r&&l>=0&&(t=t.substring(0,t.length-r.length-1)),t=decodeURIComponent(t),t.length>3){let c="",h=!1;const d=["(",")","[","]","{","}",":",";",",",".","!","?"];for(let u=0;u<t.length;u++){let p=t[u];(p==="_"||p==="-")&&(p=" "),!(p===" "&&c.length<=0||d.includes(p)||(c.length===0&&(p=p.toUpperCase()),h&&p===" "))&&(h&&(p=p.toUpperCase()),h=!1,c+=p,p===" "&&(h=!0))}return F()&&t!==c&&console.debug('Generated display name: "'+t+'" \u2192 "'+c+'"'),c.trim()}return F()&&console.debug("Loading: use default name",t),t}const DL=Object.freeze(Object.defineProperty({__proto__:null,NeedleEngineWebComponent:cv},Symbol.toStringTag,{value:"Module"}));function BL(){Ln.registerWaitForInteraction(()=>{const n=$P.getContext();n.addEventListener("statechange",()=>{setTimeout(()=>{const e=n.state;(e==="suspended"||e==="interrupted")&&n.resume().then(()=>{console.log("AudioContext resumed successfully")}).catch(t=>{console.log("Failed to resume AudioContext: "+t)})},500)})})}setTimeout(BL,1e3);const at=C("debugphysics"),hv=C("debugcolliderplacement"),dv=C("debugcollisions"),FL=C("showcolliders"),uv=C("debugraycasts"),_i=Symbol("needle component"),ti=Symbol("physics body"),sC=Symbol("rigidbody");globalThis.NEEDLE_USE_RAPIER=globalThis.NEEDLE_USE_RAPIER!==void 0?globalThis.NEEDLE_USE_RAPIER:!0,at&&console.log("Use Rapier",!0,globalThis.NEEDLE_USE_RAPIER),pe.registerCallback(me.ContextCreationStart,n=>{at&&console.log("Register rapier physics backend"),n.context.physics.engine=new nC(n.context)});const td=class Pm{constructor(e){a(this,"debugRenderColliders",!1),a(this,"debugRenderRaycasts",!1),a(this,"context"),a(this,"_initializePromise"),a(this,"_isInitialized",!1),a(this,"rapierRay"),a(this,"raycastVectorsBuffer",new Oi(()=>new S,10)),a(this,"rapierSphere",null),a(this,"rapierColliderArray",[]),a(this,"rapierIdentityRotation",{x:0,y:0,z:0,w:1}),a(this,"rapierForwardVector",{x:0,y:0,z:1}),a(this,"enabled",!1),a(this,"_tempPosition",new S),a(this,"_tempQuaternion",new V),a(this,"_tempScale",new S),a(this,"_tempMatrix",new se),a(this,"_isUpdatingPhysicsWorld",!1),a(this,"_world"),a(this,"_hasCreatedWorld",!1),a(this,"eventQueue"),a(this,"collisionHandler"),a(this,"objects",[]),a(this,"bodies",[]),a(this,"_meshCache",new Map),a(this,"_gravity",{x:0,y:-9.81,z:0}),a(this,"lines"),a(this,"_tempCenterPos",new S),a(this,"_tempCenterVec",new S),a(this,"_tempCenterQuaternion",new V),this.context=e}removeBody(e){var t,s,o;if(!e)return;this.validate();const r=e[ti];if(e[ti]=null,r&&this.world){const l=this.objects.findIndex(c=>c===e);if(l>=0){const c=this.bodies[l];if(this.bodies.splice(l,1),this.objects.splice(l,1),c instanceof A.RAPIER_PHYSICS.MODULE.Collider){const h=c;(t=this.world)==null||t.removeCollider(h,!0);const d=h.parent();d&&d.numColliders()<=0&&(d[_i]||(s=this.world)==null||s.removeRigidBody(d))}else c instanceof A.RAPIER_PHYSICS.MODULE.RigidBody&&(c.numColliders()<=0?(o=this.world)==null||o.removeRigidBody(c):F()&&(c.did_log_removing||setTimeout(()=>{c.numColliders()>0&&(c.did_log_removing=!0,console.warn("RapierPhysics: removing rigidbody with colliders from the physics world is not possible right now, please remove the colliders first"))},1)))}}}updateBody(e,t,s){if(this.validate(),!!this.enabled&&!(e.destroyed||!e.gameObject)&&!(!t&&!s))if(e.isCollider===!0)console.warn("TODO: implement updating collider position");else{const o=e,r=o[ti];r&&this.syncPhysicsBody(o.gameObject,r,t,s)}}updateProperties(e){if(this.validate(),e.isCollider){const t=e,s=t[ti];s&&(this.internalUpdateColliderProperties(t,s),t.sharedMaterial&&this.updatePhysicsMaterial(t))}else{const t=e,s=this.internal_getRigidbody(t);s&&this.internalUpdateRigidbodyProperties(t,s)}}addForce(e,t,s){this.validate();const o=this.internal_getRigidbody(e);o?o.addForce(t,s):console.warn("Rigidbody doesn't exist: can not apply force (does your object with the Rigidbody have a collider?)")}addImpulse(e,t,s){this.validate();const o=this.internal_getRigidbody(e);o?o.applyImpulse(t,s):console.warn("Rigidbody doesn't exist: can not apply impulse (does your object with the Rigidbody have a collider?)")}getLinearVelocity(e){this.validate();const t=this.internal_getRigidbody(e);return t?t.linvel():null}getAngularVelocity(e){this.validate();const t=this.internal_getRigidbody(e);return t?t.angvel():null}resetForces(e,t){this.validate();const s=this.internal_getRigidbody(e);s?.resetForces(t)}resetTorques(e,t){this.validate();const s=this.internal_getRigidbody(e);s?.resetTorques(t)}applyImpulse(e,t,s){this.validate();const o=this.internal_getRigidbody(e);o?o.applyImpulse(t,s):console.warn("Rigidbody doesn't exist: can not apply impulse (does your object with the Rigidbody have a collider?)")}wakeup(e){this.validate();const t=this.internal_getRigidbody(e);t?t.wakeUp():console.warn("Rigidbody doesn't exist: can not wake up (does your object with the Rigidbody have a collider?)")}isSleeping(e){this.validate();const t=this.internal_getRigidbody(e);return t?.isSleeping()}setAngularVelocity(e,t,s){this.validate();const o=this.internal_getRigidbody(e);o?o.setAngvel(t,s):console.warn("Rigidbody doesn't exist: can not set angular velocity (does your object with the Rigidbody have a collider?)")}setLinearVelocity(e,t,s){this.validate();const o=this.internal_getRigidbody(e);o?o.setLinvel(t,s):console.warn("Rigidbody doesn't exist: can not set linear velocity (does your object with the Rigidbody have a collider?)")}get isInitialized(){return this._isInitialized}async initialize(){return this._initializePromise||(this._initializePromise=this.internalInitialization()),this._initializePromise}async internalInitialization(){return C("__nophysics")?(console.warn("Physics are disabled"),!1):(at&&console.log("Initialize rapier physics engine"),this._hasCreatedWorld?(console.error("Invalid call to create physics world: world is already created"),!0):(this._hasCreatedWorld=!0,A.RAPIER_PHYSICS.MAYBEMODULE==null&&(at&&console.trace("Loading rapier physics engine"),await(await A.RAPIER_PHYSICS.load()).init()),at&&console.log("Physics engine initialized, creating world..."),this._world=new A.RAPIER_PHYSICS.MODULE.World(this._gravity),this.rapierRay=new A.RAPIER_PHYSICS.MODULE.Ray({x:0,y:0,z:0},{x:0,y:0,z:1}),this.enabled=!0,this._isInitialized=!0,at&&console.log("Physics world created"),!0))}validate(){this._isInitialized||at&&(this._lastWarnTime=this._lastWarnTime??0,Date.now()-this._lastWarnTime>1e3&&(this._lastWarnTime=Date.now(),console.warn("Physics engine is not initialized")))}raycast(e,t,s){var o;if(!this._isInitialized)return console.log("Physics engine is not initialized"),null;let r=s?.maxDistance,l=s?.solid;r===void 0&&(r=1/0),l===void 0&&(l=!0);const c=this.getPhysicsRay(this.rapierRay,e,t);if(!c)return null;(this.debugRenderRaycasts||uv)&&$.DrawRay(c.origin,c.dir,255,1);const h=(o=this.world)==null?void 0:o.castRay(c,r,l,s?.queryFilterFlags,s?.filterGroups,void 0,void 0,d=>{const u=d[_i];return s!=null&&s.filterPredicate?s.filterPredicate(u):s?.useIgnoreRaycastLayer!==!1?!(u!=null&&u.gameObject.layers.isEnabled(2)):!0});if(h){const d=c.pointAt(h.timeOfImpact),u=this.raycastVectorsBuffer.get();return u.set(d.x,d.y,d.z),{point:u,collider:h.collider[_i]}}return null}raycastAndGetNormal(e,t,s){var o;if(!this._isInitialized)return null;let r=s?.maxDistance,l=s?.solid;r===void 0&&(r=1/0),l===void 0&&(l=!0);const c=this.getPhysicsRay(this.rapierRay,e,t);if(!c)return null;(this.debugRenderRaycasts||uv)&&$.DrawRay(c.origin,c.dir,255,1);const h=(o=this.world)==null?void 0:o.castRayAndGetNormal(c,r,l,s?.queryFilterFlags,s?.filterGroups,void 0,void 0,d=>{const u=d[_i];return s!=null&&s.filterPredicate?s.filterPredicate(u):s?.useIgnoreRaycastLayer!==!1?!(u!=null&&u.gameObject.layers.isEnabled(2)):!0});if(h){const d=c.pointAt(h.timeOfImpact),u=h.normal,p=this.raycastVectorsBuffer.get(),g=this.raycastVectorsBuffer.get();return p.set(d.x,d.y,d.z),g.set(u.x,u.y,u.z),{point:p,normal:g,collider:h.collider[_i]}}return null}getPhysicsRay(e,t,s){var o,r,l;const c=(o=this.context)==null?void 0:o.mainCamera;if(t===void 0){const u=(r=this.context)==null?void 0:r.input.getPointerPosition(0);if(u)t=u;else return null}if(t.z===void 0){if(!c)return console.error("Can not perform raycast from 2d point - no main camera found"),null;const u=this.raycastVectorsBuffer.get();u.x=t.x,u.y=t.y,u.z=0,(u.x>1||u.y>1||u.y<-1||u.x<-1)&&(at&&console.warn("Converting screenspace to raycast space",u),(l=this.context)==null||l.input.convertScreenspaceToRaycastSpace(u)),u.unproject(c),t=u}const h=t;e.origin.x=h.x,e.origin.y=h.y,e.origin.z=h.z;const d=this.raycastVectorsBuffer.get();if(s)d.set(s.x,s.y,s.z);else{if(!c)return console.error("Can not perform raycast - no camera found"),null;d.set(e.origin.x,e.origin.y,e.origin.z);const u=ee(c);d.sub(u)}return d.normalize(),e.dir.x=d.x,e.dir.y=d.y,e.dir.z=d.z,e}sphereOverlap(e,t){return this.rapierColliderArray.length=0,this._isInitialized?this.world?(this.rapierSphere??(this.rapierSphere=new A.RAPIER_PHYSICS.MODULE.Ball(t)),this.rapierSphere.radius=t,(this.debugRenderRaycasts||uv)&&$.DrawWireSphere(e,t,3359999,1),this.world.intersectionsWithShape(e,this.rapierIdentityRotation,this.rapierSphere,s=>{const o=s[_i],r=new Ix(o.gameObject,o);return this.rapierColliderArray.push(r),!0},void 0,void 0,void 0,void 0,s=>s.isSensor()?!1:s[_i].gameObject.layers.isEnabled(2)==!1),this.rapierColliderArray):this.rapierColliderArray:this.rapierColliderArray}get world(){return this._world}get isUpdating(){return this._isUpdatingPhysicsWorld}get gravity(){var e;return((e=this.world)==null?void 0:e.gravity)??this._gravity}set gravity(e){this.world?this.world.gravity=e:this._gravity=e}clearCaches(){var e,t,s,o;this._meshCache.clear(),(e=this.eventQueue)!=null&&e.raw&&((t=this.eventQueue)==null||t.free()),(s=this.world)!=null&&s.bodies&&((o=this.world)==null||o.free())}async addBoxCollider(e,t){if(this._isInitialized||await this.initialize(),!e.activeAndEnabled)return;if(!this.enabled){at&&console.warn("Physics are disabled");return}const s=e.gameObject,o=Ge(s,this._tempPosition).multiply(t);o.multiplyScalar(.5),o.x<0&&(o.x=Math.abs(o.x)),o.y<0&&(o.y=Math.abs(o.y)),o.z<0&&(o.z=Math.abs(o.z));const r=1e-7;o.x<r&&(o.x=r),o.y<r&&(o.y=r),o.z<r&&(o.z=r);const l=A.RAPIER_PHYSICS.MODULE.ColliderDesc.cuboid(o.x,o.y,o.z);this.createCollider(e,l)}async addSphereCollider(e){if(this._isInitialized||await this.initialize(),!e.activeAndEnabled)return;if(!this.enabled){at&&console.warn("Physics are disabled");return}const t=A.RAPIER_PHYSICS.MODULE.ColliderDesc.ball(.5);this.createCollider(e,t),this.updateProperties(e)}async addCapsuleCollider(e,t,s){if(this._isInitialized||await this.initialize(),!e.activeAndEnabled)return;if(!this.enabled){at&&console.warn("Physics are disabled");return}const o=e.gameObject,r=Ge(o,this._tempPosition);r.x=Math.abs(r.x),r.y=Math.abs(r.y);const l=s*r.x;t=Math.max(t,l*2);const c=W.clamp(t*.5*r.y-s*r.x,0,Number.MAX_SAFE_INTEGER),h=A.RAPIER_PHYSICS.MODULE.ColliderDesc.capsule(c,l);this.createCollider(e,h)}async addMeshCollider(e,t,s,o){var r,l,c;let h=t.geometry;if(!h){at&&console.warn("Missing mesh geometry",t.name);return}(l=(r=h.index)==null?void 0:r.array)!=null&&l.length||(console.warn(`Your MeshCollider is missing vertices or indices in the assined mesh "${t.name}". Consider providing an indexed geometry.`),h=gO(h));let d=null;const u=h.getAttribute("position");if(u instanceof Iv){const y=u.count;d=new Float32Array(y*3);for(let v=0;v<y;v++){const b=u.getX(v),_=u.getY(v),w=u.getZ(v);d[v*3]=b,d[v*3+1]=_,d[v*3+2]=w}}else d=u.array;if(await this.initialize(),!this.enabled){at&&console.warn("Physics are disabled");return}if(!e.activeAndEnabled)return;const p=(c=h.index)==null?void 0:c.array,g=e.gameObject.worldScale.clone();if(o&&g.multiply(o),Math.abs(g.x-1)>1e-4||Math.abs(g.y-1)>1e-4||Math.abs(g.z-1)>1e-4){const y=`${h.uuid}_${g.x}_${g.y}_${g.z}_${s}`;if(this._meshCache.has(y))at&&console.warn("Use cached mesh collider"),d=this._meshCache.get(y);else{(at||F())&&console.debug(`[Performance] Your MeshCollider "${e.name}" is scaled: consider applying the scale to the collider mesh instead (${g.x}, ${g.y}, ${g.z})`);const v=new Float32Array(d.length);for(let b=0;b<d.length;b+=3)v[b]=d[b]*g.x,v[b+1]=d[b+1]*g.y,v[b+2]=d[b+2]*g.z;d=v,this._meshCache.set(y,v)}}const f=s?A.RAPIER_PHYSICS.MODULE.ColliderDesc.convexHull(d):A.RAPIER_PHYSICS.MODULE.ColliderDesc.trimesh(d,p);f&&this.createCollider(e,f)}updatePhysicsMaterial(e){if(!e)return;const t=e.sharedMaterial,s=e[ti];if(s&&t){if(t.bounciness!==void 0&&s.setRestitution(t.bounciness),t.bounceCombine!==void 0)switch(t.bounceCombine){case xt.Average:s.setRestitutionCombineRule(A.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Average);break;case xt.Maximum:s.setRestitutionCombineRule(A.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Max);break;case xt.Minimum:s.setRestitutionCombineRule(A.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Min);break;case xt.Multiply:s.setRestitutionCombineRule(A.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Multiply);break}if(t.dynamicFriction!==void 0&&s.setFriction(t.dynamicFriction),t.frictionCombine!==void 0)switch(t.frictionCombine){case xt.Average:s.setFrictionCombineRule(A.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Average);break;case xt.Maximum:s.setFrictionCombineRule(A.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Max);break;case xt.Minimum:s.setFrictionCombineRule(A.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Min);break;case xt.Multiply:s.setFrictionCombineRule(A.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Multiply);break}}}getBody(e){return e?e[ti]:null}getComponent(e){return e?e[_i]:null}createCollider(e,t){var s;if(!this.world)throw new Error("Physics world not initialized");const o=this._tempMatrix;let r;e.attachedRigidbody?r=this.getRigidbody(e,this._tempMatrix):(at&&console.log("Create collider without rigidbody",e.name),o.makeRotationFromQuaternion(Se(e.gameObject)),o.setPosition(ee(e.gameObject))),o.decompose(this._tempPosition,this._tempQuaternion,this._tempScale),this.tryApplyCenter(e,this._tempPosition),t.setTranslation(this._tempPosition.x,this._tempPosition.y,this._tempPosition.z),t.setRotation(this._tempQuaternion),t.setSensor(e.isTrigger);const l=e.sharedMaterial;if(l){if(l.bounciness!==void 0&&t.setRestitution(l.bounciness),l.bounceCombine!==void 0)switch(l.bounceCombine){case xt.Average:t.setRestitutionCombineRule(A.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Average);break;case xt.Maximum:t.setRestitutionCombineRule(A.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Max);break;case xt.Minimum:t.setRestitutionCombineRule(A.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Min);break;case xt.Multiply:t.setRestitutionCombineRule(A.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Multiply);break}if(l.dynamicFriction!==void 0&&t.setFriction(l.dynamicFriction),l.frictionCombine!==void 0)switch(l.frictionCombine){case xt.Average:t.setFrictionCombineRule(A.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Average);break;case xt.Maximum:t.setFrictionCombineRule(A.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Max);break;case xt.Minimum:t.setFrictionCombineRule(A.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Min);break;case xt.Multiply:t.setFrictionCombineRule(A.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Multiply);break}}((s=e.attachedRigidbody)==null?void 0:s.autoMass)===!1&&(t.setDensity(1e-6),t.setMass(1e-6));try{const c=this.world.createCollider(t,r);return c[_i]=e,e[ti]=c,c.setActiveEvents(A.RAPIER_PHYSICS.MODULE.ActiveEvents.COLLISION_EVENTS),c.setActiveCollisionTypes(A.RAPIER_PHYSICS.MODULE.ActiveCollisionTypes.ALL),this.objects.push(e),this.bodies.push(c),this.updateColliderCollisionGroups(e),c}catch(c){return console.error('Error creating collider "'+e.name+`"
|
|
1569
|
+
Error:`,c),null}}updateColliderCollisionGroups(e){const t=e[ti],s=e.membership;let o=0;if(s==null)o=65535;else for(let c=0;c<s.length;c++){const h=s[c];h>31?console.error(`Rapier only supports 32 layers, layer ${h} is not supported`):o|=1<<Math.floor(h)}const r=e.filter;let l=0;if(r==null)l=65535;else for(let c=0;c<r.length;c++){const h=r[c];h>31?console.error(`Rapier only supports 32 layers, layer ${h} is not supported`):l|=1<<Math.floor(h)}t.setCollisionGroups(o<<16|l)}getRigidbody(e,t){if(!this.world)throw new Error("Physics world not initialized");let s=null;if(e.attachedRigidbody){const o=e.attachedRigidbody;if(s=o[ti],!s){const r=o.isKinematic&&!hv;at&&console.log("Create rigidbody",r);const l=r?A.RAPIER_PHYSICS.MODULE.RigidBodyDesc.kinematicPositionBased():A.RAPIER_PHYSICS.MODULE.RigidBodyDesc.dynamic(),c=ee(e.attachedRigidbody.gameObject);l.setTranslation(c.x,c.y,c.z),l.setRotation(Se(e.attachedRigidbody.gameObject)),l.centerOfMass=new A.RAPIER_PHYSICS.MODULE.Vector3(o.centerOfMass.x,o.centerOfMass.y,o.centerOfMass.z),s=this.world.createRigidBody(l),this.bodies.push(s),this.objects.push(o)}s[_i]=o,o[ti]=s,this.internalUpdateRigidbodyProperties(o,s),this.getRigidbodyRelativeMatrix(e.gameObject,o.gameObject,t),e[sC]=s}else{const o=A.RAPIER_PHYSICS.MODULE.RigidBodyDesc.kinematicPositionBased(),r=ee(e.gameObject);o.setTranslation(r.x,r.y,r.z),o.setRotation(Se(e.gameObject)),s=this.world.createRigidBody(o),t.identity(),s[_i]=null}return s}internal_getRigidbody(e){return e.isCollider===!0?e[sC]:e[ti]}internalUpdateColliderProperties(e,t){const s=t.shape;let o=!1;switch(s.type){case A.RAPIER_PHYSICS.MODULE.ShapeType.Ball:{const g=s,f=e,y=e.gameObject,v=Ge(y,this._tempPosition),b=Math.abs(f.radius*v.x);o=g.radius!==b,g.radius=b,o&&t.setShape(g);break}case A.RAPIER_PHYSICS.MODULE.ShapeType.Cuboid:const r=s,l=e,c=e.gameObject,h=Ge(c,this._tempPosition),d=Math.abs(l.size.x*.5*h.x),u=Math.abs(l.size.y*.5*h.y),p=Math.abs(l.size.z*.5*h.z);o=r.halfExtents.x!==d||r.halfExtents.y!==u||r.halfExtents.z!==p,r.halfExtents.x=d,r.halfExtents.y=u,r.halfExtents.z=p,o&&t.setShape(r);break}if(o){const r=e.attachedRigidbody;if(r!=null&&r.autoMass){const l=this.getBody(r);l?.recomputeMassPropertiesFromColliders()}}this.updateColliderCollisionGroups(e),e.isTrigger!==t.isSensor()&&t.setSensor(e.isTrigger)}internalUpdateRigidbodyProperties(e,t){if(t.enableCcd(e.collisionDetectionMode!==ku.Discrete),t.setLinearDamping(e.drag),t.setAngularDamping(e.angularDrag),t.setGravityScale(e.useGravity?e.gravityScale:0,!0),e.dominanceGroup<=127&&e.dominanceGroup>=-127?t.setDominanceGroup(Math.floor(e.dominanceGroup)):t.setDominanceGroup(0),e.autoMass){t.setAdditionalMass(0,!1);for(let s=0;s<t.numColliders();s++)t.collider(s).setDensity(1);t.recomputeMassPropertiesFromColliders()}else{t.setAdditionalMass(e.mass,!1);for(let s=0;s<t.numColliders();s++)t.collider(s).setDensity(1e-7);t.recomputeMassPropertiesFromColliders()}t.setEnabledRotations(!e.lockRotationX,!e.lockRotationY,!e.lockRotationZ,!1),t.setEnabledTranslations(!e.lockPositionX,!e.lockPositionY,!e.lockPositionZ,!1),e.isKinematic?t.setBodyType(A.RAPIER_PHYSICS.MODULE.RigidBodyType.KinematicPositionBased,!1):t.setBodyType(A.RAPIER_PHYSICS.MODULE.RigidBodyType.Dynamic,!1)}step(e){if(this.world&&this.enabled){if(this._isUpdatingPhysicsWorld=!0,this.eventQueue||(this.eventQueue=new A.RAPIER_PHYSICS.MODULE.EventQueue(!1)),e===void 0||e<=0){this._isUpdatingPhysicsWorld=!1;return}else e!==void 0&&(this.world.timestep=W.lerp(this.world.timestep,e,.8));try{this.world.step(this.eventQueue)}catch(t){console.warn("Error running physics step",t)}this._isUpdatingPhysicsWorld=!1}}postStep(){this.world&&this.enabled&&(this._isUpdatingPhysicsWorld=!0,this.syncObjects(),this._isUpdatingPhysicsWorld=!1,this.eventQueue&&!this.collisionHandler&&(this.collisionHandler=new UL(this.world,this.eventQueue)),this.collisionHandler&&(this.collisionHandler.handleCollisionEvents(),this.collisionHandler.update()),this.updateDebugRendering(this.world))}updateDebugRendering(e){var t,s,o,r;if(at||hv||FL||this.debugRenderColliders===!0){if(!this.lines){const c=new Av({color:7855479,fog:!1}),h=new Vs;this.lines=new Ev(h,c),this.lines.layers.disableAll(),this.lines.layers.enable(2)}this.lines.parent!==((t=this.context)==null?void 0:t.scene)&&((s=this.context)==null||s.scene.add(this.lines));const l=e.debugRender();this.lines.geometry.setAttribute("position",new _t(l.vertices,3)),this.lines.geometry.setAttribute("color",new _t(l.colors,4)),(this.context.time.frame%30===0||((o=this.lines.geometry.boundingSphere)==null?void 0:o.radius)===0)&&this.lines.geometry.computeBoundingSphere()}else this.lines&&((r=this.context)==null||r.scene.remove(this.lines))}syncObjects(){if(!hv)for(let e=0;e<this.bodies.length;e++){const t=this.objects[e],s=this.bodies[e],o=t;if(o?.isCollider===!0&&!o.attachedRigidbody){const h=s.parent();h?this.syncPhysicsBody(t.gameObject,h,!0,!0):this.syncPhysicsBody(t.gameObject,s,!0,!0);continue}const r=s.translation(),l=s.rotation();if(Number.isNaN(r.x)||Number.isNaN(l.x)){!o.__COLLIDER_NAN&&F()&&(console.warn("Collider has NaN values",o.name,o.gameObject,s),o.__COLLIDER_NAN=!0);continue}const c=t.center;if(c&&c.isVector3){this._tempQuaternion.set(l.x,l.y,l.z,l.w);const h=this._tempPosition.copy(c).applyQuaternion(this._tempQuaternion),d=Ge(t.gameObject);h.multiply(d),r.x-=h.x,r.y-=h.y,r.z-=h.z}br(t.gameObject,r.x,r.y,r.z),dg(t.gameObject,l.x,l.y,l.z,l.w)}}syncPhysicsBody(e,t,s,o){if(t instanceof A.RAPIER_PHYSICS.MODULE.RigidBody){const r=ee(e,this._tempPosition),l=Se(e,this._tempQuaternion);switch(t.bodyType()){case A.RAPIER_PHYSICS.MODULE.RigidBodyType.Fixed:case A.RAPIER_PHYSICS.MODULE.RigidBodyType.KinematicPositionBased:case A.RAPIER_PHYSICS.MODULE.RigidBodyType.KinematicVelocityBased:s&&t.setNextKinematicTranslation(r),o&&t.setNextKinematicRotation(l);break;default:s&&t.setTranslation(r,!1),o&&t.setRotation(l,!1);break}}else if(t instanceof A.RAPIER_PHYSICS.MODULE.Collider){e.matrixWorldNeedsUpdate&&e.updateWorldMatrix(!0,!1),e.matrixWorld.decompose(this._tempPosition,this._tempQuaternion,this._tempScale);const r=this._tempPosition,l=this._tempQuaternion,c=t[_i];if(this.tryApplyCenter(c,r),s){const h=t.translation();(h.x!==r.x||h.y!==r.y||h.z!==r.z)&&t.setTranslation(r)}if(o){const h=t.rotation();(h.x!==l.x||h.y!==l.y||h.z!==l.z||h.w!==l.w)&&t.setRotation(l)}}}tryApplyCenter(e,t){const s=e.center;s&&e.gameObject&&(s.x!==0||s.y!==0||s.z!==0)&&(this._tempCenterPos.x=s.x,this._tempCenterPos.y=s.y,this._tempCenterPos.z=s.z,Ge(e.gameObject,this._tempCenterVec),this._tempCenterPos.multiply(this._tempCenterVec),e.attachedRigidbody?this._tempCenterPos.applyQuaternion(e.gameObject.quaternion):(Se(e.gameObject,this._tempCenterQuaternion),this._tempCenterPos.applyQuaternion(this._tempCenterQuaternion)),t.x+=this._tempCenterPos.x,t.y+=this._tempCenterPos.y,t.z+=this._tempCenterPos.z)}getRigidbodyRelativeMatrix(e,t,s,o){if(o===void 0&&(o=Pm._matricesBuffer,o.length=0),e===t){const r=Ge(e,this._tempPosition);s.makeScale(r.x,r.y,r.z);for(let l=o.length-1;l>=0;l--)s.multiply(o[l]);return s}return o.push(e.matrix),e.parent&&this.getRigidbodyRelativeMatrix(e.parent,t,s,o),s}addFixedJoint(e,t){if(!this.world){console.error("Physics world not initialized");return}const s=e[ti],o=t[ti];this.calculateJointRelativeMatrices(e.gameObject,t.gameObject,this._tempMatrix),this._tempMatrix.decompose(this._tempPosition,this._tempQuaternion,this._tempScale);const r=A.RAPIER_PHYSICS.MODULE.JointData.fixed(Pm.centerConnectionPos,Pm.centerConnectionRot,this._tempPosition,this._tempQuaternion),l=this.world.createImpulseJoint(r,s,o,!0);at&&console.log("ADD FIXED JOINT",l)}addHingeJoint(e,t,s,o){if(!this.world){console.error("Physics world not initialized");return}const r=e[ti],l=t[ti];this.calculateJointRelativeMatrices(e.gameObject,t.gameObject,this._tempMatrix),this._tempMatrix.decompose(this._tempPosition,this._tempQuaternion,this._tempScale);const c=A.RAPIER_PHYSICS.MODULE.JointData.revolute(s,this._tempPosition,o),h=this.world.createImpulseJoint(c,r,l,!0);at&&console.log("ADD HINGE JOINT",h)}calculateJointRelativeMatrices(e,t,s){e.updateWorldMatrix(!0,!1),t.updateWorldMatrix(!0,!1);const o=e.matrixWorld,r=t.matrixWorld;o.elements[0]=1,o.elements[5]=1,o.elements[10]=1,r.elements[0]=1,r.elements[5]=1,r.elements[10]=1,s.copy(r).premultiply(o.invert()).invert()}};a(td,"_didLoadPhysicsEngine",!1),a(td,"_matricesBuffer",[]),a(td,"centerConnectionPos",{x:0,y:0,z:0}),a(td,"centerConnectionRot",{x:0,y:0,z:0,w:1});let nC=td;class UL{constructor(e,t){a(this,"world"),a(this,"eventQueue"),a(this,"activeCollisions",[]),a(this,"activeCollisionsStay",[]),a(this,"activeTriggers",[]),this.world=e,this.eventQueue=t}handleCollisionEvents(){this.eventQueue&&this.world&&this.eventQueue.drainCollisionEvents((e,t,s)=>{const o=this.world.getCollider(e),r=this.world.getCollider(t);if(!o||!r)return;const l=o[_i],c=r[_i];dv&&console.log("EVT",l.name,c.name,s,o,r),l&&c&&(s?(this.onCollisionStarted(l,o,c,r),this.onCollisionStarted(c,r,l,o)):(this.onCollisionEnded(l,c),this.onCollisionEnded(c,l)))})}update(){this.onHandleCollisionStay()}onCollisionStarted(e,t,s,o){let r=null;if(e.isTrigger||s.isTrigger)Ar(e.gameObject,l=>{l.onTriggerEnter&&!l.destroyed&&l.onTriggerEnter(s),this.activeTriggers.push({collider:e,component:l,otherCollider:s})});else{const l=e.gameObject;this.world.contactPair(t,o,(c,h)=>{Ar(l,d=>{var u;if(d.destroyed)return;const p=d.onCollisionEnter||d.onCollisionStay||d.onCollisionExit;if(p||dv){if(!r){const g=[],f=c.normal();s instanceof Fo&&s.convex&&(f.x=-f.x,f.y=-f.y,f.z=-f.z);for(let y=0;y<c.numSolverContacts();y++){const v=c.solverContactPoint(y),b=c.contactImpulse(y);if(v){const _=c.contactDist(y),w=c.solverContactFriction(y),x=c.solverContactTangentVelocity(y),k=new Ex(v,_,f,b,w,x);g.push(k),dv&&$.DrawDirection(v,f,16711680,3,!0)}}r=new Ax(l,s,g)}if(p){const g={collider:e,component:d,collision:r};this.activeCollisions.push(g),d.onCollisionStay&&this.activeCollisionsStay.push(g),(u=d.onCollisionEnter)==null||u.call(d,r)}}})})}}onHandleCollisionStay(){for(const e of this.activeCollisionsStay){const t=e.component;if(!t.destroyed&&t.activeAndEnabled&&t.onCollisionStay){if(e.collision.collider.destroyed)continue;const s=e.collision;t.onCollisionStay(s)}}for(const e of this.activeTriggers){const t=e.component;if(!t.destroyed&&t.activeAndEnabled&&t.onTriggerStay){const s=e.otherCollider;if(s.destroyed)continue;t.onTriggerStay(s)}}}onCollisionEnded(e,t){if(!(e.destroyed||t.destroyed)){for(let s=0;s<this.activeCollisions.length;s++){const o=this.activeCollisions[s],r=o.collider;if(r.destroyed||o.collision.collider.destroyed){this.activeCollisions.splice(s,1),s--;continue}if(r===e&&o.collision.collider===t){const l=o.component;if(this.activeCollisions.splice(s,1),s--,l.activeAndEnabled&&l.onCollisionExit){const c=o.collision;l.onCollisionExit(c)}}}for(let s=0;s<this.activeCollisionsStay.length;s++){const o=this.activeCollisionsStay[s],r=o.collider;if(r.destroyed||o.collision.collider.destroyed){this.activeCollisionsStay.splice(s,1),s--;continue}if(r===e&&o.collision.collider===t){const l=o.component;if(this.activeCollisionsStay.splice(s,1),s--,l.activeAndEnabled&&l.onCollisionExit){const c=o.collision;l.onCollisionExit(c)}}}for(let s=0;s<this.activeTriggers.length;s++){const o=this.activeTriggers[s],r=o.collider;if(r.destroyed||o.otherCollider.destroyed){this.activeTriggers.splice(s,1),s--;continue}if(r===e&&o.otherCollider===t){const l=o.component;if(this.activeTriggers.splice(s,1),s--,l.activeAndEnabled&&l.onTriggerExit){const c=o.otherCollider;l.onTriggerExit(c)}}}}}}class zL{static async createComparisonScene(e){const{files:t}=e,s=await Promise.all(t.map(y=>new ce(y).loadAssetAsync())),o=new xi;let r=0;for(const y of s)if(y instanceof E){y.position.y=r,o.add(y);const v=si([y]);r+=v.getSize(new S).y,r+=.1}const l=new we(20);o.add(l);const c=e.environment||"https://dl.polyhaven.org/file/ph-assets/HDRIs/exr/1k/studio_small_09_1k.exr";{let y=null;if(c.endsWith(".hdr")){const v=(await import("./three-examples-DuVhxqft.min.js").then(b=>b.RGBELoader$1)).RGBELoader;y=new v}else if(c.endsWith(".exr")){const v=(await import("./three-examples-DuVhxqft.min.js").then(b=>b.EXRLoader$1)).EXRLoader;y=new v}if(y){const v=await y.loadAsync(c).catch(b=>(console.error(b),null));v&&(v.mapping=kn,v.needsUpdate=!0,o.background=v,o.environment=v,o.backgroundBlurriness=.75)}else console.warn("Unsupported environment map format",c)}const h=si(o.children),d=h.getCenter(new S),u=h.getSize(new S),p=Math.max(u.x,u.y,u.z)/(2*Math.tan(Math.PI*l.fov/360));l.position.set(d.x,d.y,p),l.lookAt(d);const g=new $v(l,e.domElement||document.body);g.target=d,g.update();const f=(e.domElement||document.body).getBoundingClientRect();return l.aspect=f.width/f.height,l.updateProjectionMatrix(),{scene:o,camera:l}}}let pv=0;function oC(n){n?pv++:pv--}function NL(){return pv>0}const WL={binary:!0,animations:!0};async function VL(n){if(!n.context)throw new Error("No context provided to exportAsGLTF");n.scene||(n.scene=n.context.scene);const e={...WL,...n},{context:t}=e,s=new Hv;s.register(c=>new l1(c)),s.register(c=>new fE(c)),s.register(c=>new Kx(c)),v0(s,e.context);const o={binary:e.binary,animations:HL(t,e.scene,[])},r=new $L;console.debug("Exporting GLTF",o),r.onBeforeExport(e),oC(!0);const l=await s.parseAsync(e.scene,o).catch(c=>(console.error(c),null));if(oC(!1),r.onAfterExport(e),!l)throw new Error("Failed to export GLTF");if(e.downloadAs!=null){let c=null;if(l instanceof ArrayBuffer?c=new Blob([l],{type:"application/octet-stream"}):console.error("Can not download GLTF as a blob",l),c){const h=URL.createObjectURL(c),d=document.createElement("a");d.href=h;let u=e.downloadAs;!u.endsWith(".glb")&&!u.endsWith(".gltf")&&(u+=e.binary?".glb":".gltf"),d.download=u,d.click()}}return l}const rC=Symbol("needle:weight");class $L{constructor(){a(this,"_undo",[])}onBeforeExport(e){e.context.animations.mixers.forEach(t=>{const s=Ha.tryGetActionsFromMixer(t);if(s)for(let o=0;o<s.length;o++){const r=s[o];r[rC]=r.weight,r.weight=0,this._undo.push(()=>{r.weight=r[rC]})}t.update(0)}),e.context.scene.traverse(t=>{if(!p0(t)){const s=t.parent;s&&(t.removeFromParent(),this._undo.push(()=>s.add(t)))}})}onAfterExport(e){this._undo.forEach(t=>t()),this._undo.length=0}}function HL(n,e,t){n.animations.mixers.forEach(o=>{const r=Ha.tryGetActionsFromMixer(o);if(r)for(let l=0;l<r.length;l++){const c=r[l].getClip();t.push(c)}}),Array.isArray(e)||(e=[e]);for(const o of e)Ha.tryGetAnimationClipsFromObjectHierarchy(o,t);const s=new Set(t);return Array.from(s)}const aC="needle-button",mv=F();var fa,ya,va,wi,Ds,jl,pm,lC,cC,mm;class gv extends HTMLElement{constructor(){super(),Us(this,pm),Us(this,fa),Us(this,ya),Us(this,va),Us(this,wi),Us(this,Ds),Us(this,jl),Us(this,mm,e=>{mv&&console.log("Needle Button clicked"),!e.defaultPrevented&&ge(this,wi)&&ge(this,wi).click()}),this.removeEventListener("click",ge(this,mm)),this.addEventListener("click",ge(this,mm))}attributeChangedCallback(e,t,s){dd(this,pm,lC).call(this)}}fa=new WeakMap,ya=new WeakMap,va=new WeakMap,wi=new WeakMap,Ds=new WeakMap,jl=new WeakMap,pm=new WeakSet,lC=function(){var n,e;if((n=ge(this,wi))==null||n.remove(),this.getAttribute("ar")!=null)ge(this,Ds)??zs(this,Ds,new pl),zs(this,wi,ge(this,Ds).createARButton());else if(this.getAttribute("vr")!=null)ge(this,Ds)??zs(this,Ds,new pl),zs(this,wi,ge(this,Ds).createVRButton());else if(this.getAttribute("quicklook")!=null)ge(this,Ds)??zs(this,Ds,new pl),zs(this,wi,ge(this,Ds).createQuicklookButton());else{mv?console.warn("No button type specified for <needle-button>. Use either ar, vr or quicklook attribute."):console.debug("No button type specified for <needle-button>. Use either ar, vr or quicklook attribute.");return}ge(this,fa)??zs(this,fa,this.attachShadow({mode:"open"})),ge(this,ya)??zs(this,ya,document.createElement("slot")),ge(this,va)??zs(this,va,document.createElement("style")),ge(this,va).innerHTML=`
|
|
1570
|
+
button {
|
|
1571
|
+
all: initial;
|
|
1572
|
+
cursor: inherit;
|
|
1573
|
+
color: inherit;
|
|
1574
|
+
font-family: inherit;
|
|
1575
|
+
gap: inherit;
|
|
1576
|
+
white-space: nowrap;
|
|
1577
|
+
}
|
|
1578
|
+
`,this.getAttribute("unstyled")!=null||(ge(this,va).innerHTML+=`
|
|
1579
|
+
:host {
|
|
1580
|
+
display: inline-block;
|
|
1581
|
+
background: rgba(255, 255, 255, .8);
|
|
1582
|
+
backdrop-filter: blur(10px);
|
|
1583
|
+
width: fit-content;
|
|
1584
|
+
transition: background .2s;
|
|
1585
|
+
|
|
1586
|
+
cursor: pointer;
|
|
1587
|
+
padding: 0.4rem .5rem;
|
|
1588
|
+
border-radius: 0.8rem;
|
|
1589
|
+
color: black;
|
|
1590
|
+
background: rgba(245, 245, 245, .8);
|
|
1591
|
+
outline: rgba(0,0,0,.05) 1px solid;
|
|
1592
|
+
}
|
|
1593
|
+
:host(:hover) {
|
|
1594
|
+
background: rgba(255, 255, 255, 1);
|
|
1595
|
+
transition: background .2s;
|
|
1596
|
+
}
|
|
1597
|
+
slot {
|
|
1598
|
+
display: flex;
|
|
1599
|
+
align-items: center;
|
|
1600
|
+
justify-content: center;
|
|
1601
|
+
gap: .5rem;
|
|
1602
|
+
}
|
|
1603
|
+
`),ge(this,ya).innerHTML=ge(this,wi).innerHTML,ge(this,ya).style.cssText="display: flex; align-items: center; justify-content: center;",ge(this,wi).innerHTML=ge(this,ya).outerHTML,ge(this,fa).innerHTML=ge(this,wi).outerHTML,ge(this,fa).prepend(ge(this,va)),fu(kf,{element:ge(this,fa)}),(e=ge(this,jl))==null||e.disconnect(),ge(this,jl)??zs(this,jl,new MutationObserver(()=>dd(this,pm,cC).call(this))),ge(this,jl).observe(ge(this,wi),{attributes:!0}),mv&&console.log("Needle Button updated")},cC=function(){ge(this,wi)&&(ge(this,wi).style.display==="none"?this.style.display="none":this.style.display==="none"&&(this.style.display=""))},mm=new WeakMap,a(gv,"observedAttributes",["ar","vr","quicklook"]),typeof window<"u"&&!window.customElements.get(aC)&&window.customElements.define(aC,gv);const id=C("debugavatar");class fv{constructor(e,t,s,o){a(this,"root"),a(this,"head"),a(this,"leftHand"),a(this,"rigthHand");var r;this.root=e,this.head=t,this.leftHand=s,this.rigthHand=o,(r=this.root)==null||r.traverse(l=>l.layers.set(2))}get isValid(){return this.head!==null&&this.head!==void 0}}class hC{constructor(){a(this,"avatarRegistryUrl",null)}async getOrCreateNewAvatarInstance(e,t){if(!t)return console.error("Can not create avatar: failed to provide id or root object"),null;let s=null;if(typeof t=="string"){if(s=await this.loadAvatar(e,t),!s){const r=new Fs;s=P.instantiate(Ma(t,e.scene),r)}}else s=t;if(!s)return null;const o=this.findAvatar(s);return o.isValid?(id&&console.log("[Custom Avatar] valid config",t,id?o:""),o):(console.warn("[Custom Avatar] config isn't valid",t,id?o:""),null)}async loadAvatar(e,t){if(console.assert(t!=null&&typeof t=="string","Avatar id must not be null"),t.length<=0||!t)return null;if(id&&console.log("[Custom Avatar] "+t+", loading..."),t.endsWith(".glb")||(t+=".glb"),this.avatarRegistryUrl===null){const o=await fetch("./"+t);let r=null;if(o.ok){const c=await o.blob();c&&(r=await c.arrayBuffer())}if(!r)return null;const l=await xs().parseSync(e,r,null,0);return l?.scene??null}const s=new Rn;return jf(s,e),new Promise((o,r)=>{const l=this.avatarRegistryUrl+"/"+t;s.load(l,async c=>{await xs().createBuiltinComponents(e,l,c,null,void 0),o(c.scene)},c=>{id&&console.log("[Custom Avatar] "+c.loaded/c.total*100+"% loaded of "+c.total/1024+"kB")},c=>{console.error("[Custom Avatar] Error when loading: "+c),o(null)})})}cacheModel(e,t){}findAvatar(e){const t=e;let s=t;s.children.length==1&&(s=e.children[0]);let o=this.findAvatarPart(s,["head"]);const r=this.findAvatarPart(s,["left","hand"]),l=this.findAvatarPart(s,["right","hand"]);if(!o){o=t;const c=new S;new Si().setFromObject(o).getSize(c);const h=Math.max(c.x,c.y,c.z);console.warn("[Custom Avatar] Normalizing head scale, it's too big: "+h+" meters! Should be < 0.3m"),h>.3&&o.scale.multiplyScalar(1/h*.3)}return new fv(t,o,r,l)}findAvatarPart(e,t){const s=e.name.toLowerCase();let o=!0;for(const r of t){if(!o)break;s.indexOf(r)===-1&&(o=!1)}if(o)return e;if(e.children)for(const r of e.children){const l=this.findAvatarPart(r,t);if(l)return l}return null}handleCustomAvatarErrors(e){if(!e.ok)throw Error(e.statusText);return e}}class dC{get extensionName(){return"DocumentExtension"}onAfterBuildDocument(e){}}class uC{}const GL=Object.freeze(Object.defineProperty({__proto__:null,ActionBuilder:ve,ActionCollection:V1,ActionModel:ks,AlignmentConstraint:Tc,Animation:Ft,AnimationCurve:mh,AnimationExtension:dp,AnimationTrackHandler:im,Animator:Rt,AnimatorController:gs,Antialiasing:bh,AudioExtension:_a,AudioListener:zn,AudioSource:ns,AudioTrackHandler:sm,Avatar:Go,AvatarBlink_Simple:zr,AvatarEyeLook_Rotation:Kf,AvatarLoader:hC,AvatarMarker:hi,AvatarModel:fv,Avatar_Brain_LookAt:Uc,Avatar_MouthShapes:zc,Avatar_MustacheShake:Xf,Avatar_POI:Nn,AxesHelper:Za,BaseUIComponent:ps,BasicIKConstraint:Jf,BehaviorExtension:Z0,BehaviorModel:Jt,BloomEffect:Np,BoxCollider:Nu,BoxGizmo:ea,BoxHelperComponent:Bo,Button:no,CallInfo:Un,Camera:ci,CameraTargetReachedEvent:Fc,Canvas:bl,CanvasGroup:Ko,CapsuleCollider:Wn,ChangeMaterialOnClick:B0,ChangeTransformOnClick:Xr,CharacterController:Nr,CharacterControllerInput:$n,ChromaticAberration:_h,Collider:ui,ColorAdjustments:or,ColorBySpeedModule:Cl,ColorOverLifetimeModule:Ip,ContactShadows:Vc,ControlTrackHandler:nm,CustomBranding:Jr,Deletable:n0,DeleteBox:Wu,DepthOfField:As,DeviceFlag:Vu,DocumentExtension:dC,DragControls:Hr,DropListener:Hn,Duplicatable:h0,EffectWrapper:xh,EmissionModule:eo,EmphasizeOnClick:dl,EnvironmentScene:cm,EventList:xe,EventListEvent:Ru,EventSystem:ii,EventTrigger:qu,FieldWithDefault:y1,FixedJoint:fy,Fog:wl,GltfExport:P0,GltfExportBox:S0,Gradient:ia,Graphic:lh,GraphicRaycaster:Au,GridHelper:xl,GridLayoutGroup:ay,GroundProjectedEnv:en,GroupActionModel:Wo,HideOnStart:pp,HingeJoint:dh,HorizontalLayoutGroup:ry,Image:Tl,InheritVelocityModule:Sy,InputField:Yy,InstanceHandle:w0,InstancingHandler:Ju,Interactable:s0,Keyframe:vi,LODGroup:ph,LODModel:Sl,Light:yi,LimitVelocityOverLifetimeModule:gt,LogStats:i0,LookAt:Ky,LookAtConstraint:Fr,MainModule:Wt,MaskableGraphic:ch,MeshCollider:Fo,MeshRenderer:Qc,MinMaxCurve:Z,MinMaxGradient:sa,NeedleMenu:un,NestedGltf:kp,Networking:_y,NoiseModule:Ce,ObjectRaycaster:ji,OffsetConstraint:ta,OpenURL:El,OrbitControls:_e,Outline:vl,Padding:Zr,ParticleBurst:Ap,ParticleSubEmitter:Cy,ParticleSystem:yh,ParticleSystemRenderer:ds,PhysicsExtension:J0,PixelationEffect:Sh,PlayAnimationOnClick:Jc,PlayAudioOnClick:Vo,PlayableDirector:Rl,PlayerColor:zl,PointerEventData:cd,PostProcessingHandler:zy,PreliminaryAction:ul,PreliminaryTrigger:eh,RawImage:am,Rect:Z1,RectTransform:Ts,ReflectionProbe:qc,RegisteredAnimationInfo:mr,RemoteSkybox:qp,Renderer:Ui,RendererLightmap:ep,Rigidbody:dt,RotationBySpeedModule:hs,RotationOverLifetimeModule:Es,SceneSwitcher:Ze,ScreenCapture:ar,ScreenSpaceAmbientOcclusion:to,ScreenSpaceAmbientOcclusionN8:Is,SetActiveOnClick:F0,ShadowCatcher:Rh,ShapeModule:xy,SharpeningEffect:Ph,SignalAsset:tm,SignalReceiver:Dh,SignalReceiverEvent:jh,SignalTrackHandler:Fh,Size:K1,SizeBySpeedModule:bi,SizeOverLifetimeModule:na,SkinnedMeshRenderer:x0,SmoothFollow:Yp,SpatialGrabRaycaster:Dc,SpatialHtml:Nh,SpatialTrigger:Kp,SpatialTriggerReceiver:vn,SpectatorCamera:Zp,SphereCollider:Ja,Sprite:Qn,SpriteData:gl,SpriteRenderer:gi,SpriteSheet:ml,SubEmitterSystem:Bp,SyncedCamera:Wy,SyncedRoom:Ls,SyncedTransform:sn,TapGestureTrigger:N0,TeleportTarget:_p,TestRunner:Hy,TestSimulateUserData:Gy,Text:Nt,TextBuilder:ny,TextExtension:Pp,TextureSheetAnimationModule:Vt,TiltShiftEffect:yn,ToneMappingEffect:nr,TrailModule:We,TransformData:ut,TransformGizmo:da,TriggerBuilder:At,TriggerModel:hl,UIRaycastUtils:zf,UIRootComponent:oh,USDZExporter:gn,USDZText:Kr,USDZUIExtension:hy,UsageMarker:$c,VariantAction:j0,VelocityOverLifetimeModule:qe,VerticalLayoutGroup:oy,VideoPlayer:yt,Vignette:la,VisibilityAction:th,Voip:Do,Volume:kl,VolumeParameter:N,VolumeProfile:Fp,WebARCameraBackground:Hh,WebARSessionRoot:$o,WebXR:wp,WebXRImageTracking:Gh,WebXRImageTrackingModel:ro,WebXRPlaneTracking:ao,WebXRTrackedImage:tv,XRControllerFollow:oo,XRControllerModel:pn,XRControllerMovement:Ni,XRFlag:os,XRRig:um,XRState:Di,__Ignore:uC},Symbol.toStringTag,{value:"Module"})),gm=C("debugmissingcamera");pe.registerCallback(me.MissingCamera,n=>{var e,t,s,o;gm&&console.warn("Creating missing camera");const r=n.context.scene,l=new we;l.name="Default Fallback Camera",r.add(l);const c=new ci;if(c.sourceId=((t=(e=n.files)==null?void 0:e[0])==null?void 0:t.src)??"unknown",c.fieldOfView=35,n.context.domElement.getAttribute("transparent")!=null)c.clearFlags=Io.Uninitialized;else if((s=n.context.domElement.getAttribute("skybox-image"))!=null&&s.length||(o=n.context.domElement.getAttribute("background-image"))!=null&&o.length||n.context.lightmaps.tryGetSkybox(c.sourceId))c.clearFlags=Io.Skybox,c.backgroundBlurriness=.2;else{if(c.clearFlags=Io.SolidColor,!n.context.domElement.getAttribute("background-color")){let u="#efefef";typeof window!==void 0&&window.matchMedia("(prefers-color-scheme: dark)").matches&&(u="#1f1f1f"),r.background=new oe(u)}if(!r.environment){const u=new HP(n.context.renderer),p=new cm("neutral");r.environment=u.fromScene(p,.025).texture}}const h=Mr(l,c,!0);l.position.x=0,l.position.y=1,l.position.z=2;const d=n.context.domElement;return d?.cameraControls!=!1&&pC(n.context,h),h}),pe.registerCallback(me.ContextCreated,n=>{if(!n.context.mainCamera){gm&&console.log("Will not auto-fit because a default camera exists");return}const e=n.context.domElement;if(e?.cameraControls==!0){const t=Cb(n.context.mainCamera);if(t?.isCameraController==!0){gm&&console.log("Will not auto-fit because a camera controller exists");return}pC(n.context)}});function pC(n,e){e=e??n.mainCameraComponent;const t=e?.gameObject;if(gm&&console.log("Creating default camera controls",e?.name),t){const s=vc(t,_e);s.sourceId=e?.sourceId??"unknown";const o=n.domElement.getAttribute("auto-rotate");if(s.autoRotate=o!=null&&o!="0"&&o?.toLowerCase()!="false",s.autoRotateSpeed=.5,s.autoFit=!0,s.autoRotate&&o){const r=parseFloat(o);isNaN(r)||(s.autoRotateSpeed=r)}}else console.warn("Missing camera object, can not add orbit controls")}pe.registerCallback(me.ContextCreated,n=>{const e=n.context.domElement.getAttribute("autoplay");if(e!==void 0&&(e===""||e==="true"||e==="1")&&n.files)for(const t of n.files)P.foreachComponent(t.file.scene,s=>{if(s.enabled!==!1){if(s instanceof Ft&&s.playAutomatically||s instanceof Rt||s instanceof Rl&&s.playOnAwake===!0)return!0;if(s instanceof Ft)return s.playAutomatically=!0,!0;if(s instanceof Rl)return s.playOnAwake=!0,!0}},!0)!==!0&&Ha.assignAnimationsFromFile(t.file,{createAnimationComponent:(s,o)=>Ei(s,Ft)})});class qL extends PO{constructor(){super(new Worker(new URL("/generateMeshBVH.worker-Cdfpaq5W.js",import.meta.url),{type:"module"})),this.name="GenerateMeshBVHWorker"}runTask(e,t,s={}){return new Promise((o,r)=>{if(t.getAttribute("position").isInterleavedBufferAttribute||t.index&&t.index.isInterleavedBufferAttribute)throw new Error("GenerateMeshBVHWorker: InterleavedBufferAttribute are not supported for the geometry attributes.");e.onerror=d=>{r(new Error(`[GenerateMeshBVHWorker] ${d.message||"Unknown error. Please check the server console. If you're using vite try adding 'three-mesh-bvh' to 'optimizeDeps.exclude' in your vite.config.js"}`))},e.onmessage=d=>{const{data:u}=d;if(u.error)r(new Error(u.error)),e.onmessage=null;else if(u.serialized){const{serialized:p,position:g}=u,f=OO.deserialize(p,t,{setIndex:!1}),y=Object.assign({setBoundingBox:!0},s);if(t.attributes.position.array=g,p.index)if(t.index)t.index.array=p.index;else{const v=new _t(p.index,1,!1);t.setIndex(v)}y.setBoundingBox&&(t.boundingBox=f.getBoundingBox(new Si)),s.onProgress&&s.onProgress(u.progress),o(f),e.onmessage=null}else s.onProgress&&s.onProgress(u.progress)};const l=t.index?t.index.array:null,c=t.attributes.position.array,h=[c];l&&h.push(l),e.postMessage({index:l,position:c,options:{...s,onProgress:null,includedProgressCallback:!!s.onProgress,groups:[...t.groups]}},h.map(d=>d.buffer).filter(d=>typeof SharedArrayBuffer>"u"||!(d instanceof SharedArrayBuffer)))})}}const XL=Object.freeze(Object.defineProperty({__proto__:null,GenerateMeshBVHWorker:qL},Symbol.toStringTag,{value:"Module"}));export{zT as $physicsKey,ve as ActionBuilder,V1 as ActionCollection,ks as ActionModel,kw as Addressables,Tc as AlignmentConstraint,Ga as AmbientMode,Ft as Animation,mh as AnimationCurve,dp as AnimationExtension,im as AnimationTrackHandler,Ha as AnimationUtils,Rt as Animator,Mo as AnimatorConditionMode,gs as AnimatorController,Bf as AnimatorControllerParameterType,Ec as AnimatorStateInfo,bh as Antialiasing,Ln as Application,j_ as AssetDatabase,ce as AssetReference,_a as AudioExtension,zn as AudioListener,ns as AudioSource,sm as AudioTrackHandler,Go as Avatar,zr as AvatarBlink_Simple,Kf as AvatarEyeLook_Rotation,hC as AvatarLoader,hi as AvatarMarker,fv as AvatarModel,Uc as Avatar_Brain_LookAt,zc as Avatar_MouthShapes,Xf as Avatar_MustacheShake,Nn as Avatar_POI,qa as Axes,Za as AxesHelper,_g as BUILD_TIME,ps as BaseUIComponent,Jf as BasicIKConstraint,Z0 as BehaviorExtension,Jt as BehaviorModel,Ir as BlobStorage,Np as BloomEffect,Nu as BoxCollider,ea as BoxGizmo,Bo as BoxHelperComponent,no as Button,Po as ButtonsFactory,jx as CallDirection,Un as CallInfo,ci as Camera,Fc as CameraTargetReachedEvent,bl as Canvas,Ko as CanvasGroup,Wn as CapsuleCollider,B0 as ChangeMaterialOnClick,Xr as ChangeTransformOnClick,Nr as CharacterController,$n as CharacterControllerInput,_h as ChromaticAberration,Oi as CircularBuffer,Io as ClearFlags,bn as ClipExtrapolation,ui as Collider,Ax as Collision,ku as CollisionDetectionMode,or as ColorAdjustments,Cl as ColorBySpeedModule,Ip as ColorOverLifetimeModule,$R as Component,I as Component$1,uc as ComponentLifecycleEvents,GL as Components,y_ as ConnectionEvents,Ex as ContactPoint,Vc as ContactShadows,J as Context,IR as ContextArgs,me as ContextEvent,pe as ContextRegistry,nm as ControlTrackHandler,Jr as CustomBranding,o1 as CustomShader,mu as DefaultReflectionMode,n0 as Deletable,Wu as DeleteBox,As as DepthOfField,Vu as DeviceFlag,X as DeviceUtilities,dC as DocumentExtension,Hr as DragControls,r0 as DragMode,Hn as DropListener,h0 as Duplicatable,xh as EffectWrapper,eo as EmissionModule,dl as EmphasizeOnClick,JS as EngineLoadingView,cm as EnvironmentScene,xe as EventList,Ru as EventListEvent,ii as EventSystem,qu as EventTrigger,y1 as FieldWithDefault,_f as FileReference,Aw as FileReferenceSerializer,cE as FileSpawnModel,Gx as File_Event,fy as FixedJoint,wl as Fog,Oe as FrameEvent,jd as GENERATOR,P as GameObject,$ as Gizmos,P0 as GltfExport,S0 as GltfExportBox,ia as Gradient,lh as Graphic,Au as GraphicRaycaster,Zl as Graphics,xl as GridHelper,ay as GridLayoutGroup,en as GroundProjectedEnv,Wo as GroupActionModel,Du as HideFlags,pp as HideOnStart,dh as HingeJoint,ry as HorizontalLayoutGroup,DM as HostData,Tl as Image,bf as ImageReference,Tw as ImageReferenceSerializer,Sy as InheritVelocityModule,n_ as Input,oi as InputEventQueue,Be as InputEvents,Yy as InputField,w0 as InstanceHandle,Ju as InstancingHandler,ms as InstancingUtil,X_ as InstantiateEvent,jt as InstantiateIdProvider,Fs as InstantiateOptions,s0 as Interactable,$h as InternalScreenshotUtils,aM as JoinedRoomResponse,Yk as KeyEventArgs,vi as Keyframe,ph as LODGroup,Sl as LODModel,lM as LeftRoomResponse,yi as Light,Nw as LightData,gt as LimitVelocityOverLifetimeModule,AL as LoadingElementOptions,i0 as LogStats,ki as LogType,Ky as LookAt,Fr as LookAtConstraint,A as MODULES,Wt as MainModule,qy as MarkerType,ch as MaskableGraphic,W as Mathf,Fo as MeshCollider,Qc as MeshRenderer,Z as MinMaxCurve,sa as MinMaxGradient,rc as NEKeyboardEvent,An as NEPointerEvent,gv as NeedleButtonElement,l0 as NeedleEngineModelLoader,cv as NeedleEngineWebComponent,un as NeedleMenu,Bd as NeedlePatchesKey,Pg as NeedleXRController,ne as NeedleXRSession,__ as NeedleXRSync,O_ as NeedleXRUtils,kp as NestedGltf,b_ as NetworkConnection,nn as NetworkedStreamEvents,hd as NetworkedStreams,_y as Networking,Y_ as NewInstanceModel,Ce as NoiseModule,ji as ObjectRaycaster,wo as ObjectUtils,ta as OffsetConstraint,Md as OneEuroFilter,og as OneEuroFilterXYZ,El as OpenURL,_e as OrbitControls,vl as Outline,v_ as OwnershipEvent,Ag as OwnershipModel,nc as PUBLIC_KEY,Zr as Padding,Ap as ParticleBurst,Cy as ParticleSubEmitter,yh as ParticleSystem,sr as ParticleSystemBaseBehaviour,ds as ParticleSystemRenderer,Ep as ParticleSystemShapeType,Bu as PeerHandle,g_ as PeerNetworking,Gg as Physics,J0 as PhysicsExtension,xt as PhysicsMaterialCombine,Sh as PixelationEffect,Jc as PlayAnimationOnClick,Vo as PlayAudioOnClick,Rl as PlayableDirector,zl as PlayerColor,Ms as PlayerState,Q1 as PlayerStateEvent,X0 as PlayerSync,Dw as PlayerView,Bw as PlayerViewManager,cd as PointerEventData,Ud as PointerType,rt as PostProcessingEffect,ft as PostProcessingEffectOrder,zy as PostProcessingHandler,ul as PreliminaryAction,eh as PreliminaryTrigger,zo as PreviewHelper,Cr as PrimitiveType,de as Progress,Jm as PromiseAllWithErrors,Zm as PromiseErrorResult,he as RGBAColor,nC as RapierPhysics,am as RawImage,Qs as RaycastOptions,Z1 as Rect,Ts as RectTransform,qc as ReflectionProbe,mr as RegisteredAnimationInfo,qp as RemoteSkybox,Ac as RenderTexture,Cx as RenderTextureSerializer,Ui as Renderer,zw as RendererData,ep as RendererLightmap,dt as Rigidbody,Qe as RigidbodyConstraints,ie as RoomEvents,hs as RotationBySpeedModule,Es as RotationOverLifetimeModule,Qu as SceneLightSettings,Ze as SceneSwitcher,ar as ScreenCapture,to as ScreenSpaceAmbientOcclusion,Is as ScreenSpaceAmbientOcclusionN8,Ss as SendQueue,df as SerializationContext,F0 as SetActiveOnClick,Rh as ShadowCatcher,xy as ShapeModule,Ph as SharpeningEffect,tm as SignalAsset,Dh as SignalReceiver,jh as SignalReceiverEvent,Fh as SignalTrackHandler,K1 as Size,bi as SizeBySpeedModule,na as SizeOverLifetimeModule,x0 as SkinnedMeshRenderer,Yp as SmoothFollow,Dc as SpatialGrabRaycaster,Nh as SpatialHtml,Kp as SpatialTrigger,vn as SpatialTriggerReceiver,Zp as SpectatorCamera,Ja as SphereCollider,Hg as SphereIntersection,Ix as SphereOverlapResult,Qn as Sprite,gl as SpriteData,gi as SpriteRenderer,ml as SpriteSheet,YR as StateMachineBehaviour,Gf as StreamEndedEvent,Lx as StreamReceivedEvent,Bp as SubEmitterSystem,Wy as SyncedCamera,Ls as SyncedRoom,sn as SyncedTransform,N0 as TapGestureTrigger,_p as TeleportTarget,Hy as TestRunner,zL as TestSceneUtils,Gy as TestSimulateUserData,Nt as Text,ny as TextBuilder,Pp as TextExtension,Vt as TextureSheetAnimationModule,yn as TiltShiftEffect,Vw as Time,nr as ToneMappingEffect,Bh as TrackHandler,qi as TrackType,We as TrailModule,ut as TransformData,da as TransformGizmo,At as TriggerBuilder,hl as TriggerModel,R as TypeStore,zf as UIRaycastUtils,oh as UIRootComponent,O0 as USDDocument,mi as USDObject,C1 as USDWriter,gn as USDZExporter,P1 as USDZExporter$1,Kr as USDZText,hy as USDZUIExtension,Px as UriSerializer,$c as UsageMarker,cM as UserJoinedOrLeftRoomModel,ws as VERSION,j0 as VariantAction,qe as VelocityOverLifetimeModule,oy as VerticalLayoutGroup,yt as VideoPlayer,Co as ViewDevice,la as Vignette,th as VisibilityAction,Do as Voip,kl as Volume,N as VolumeParameter,Fp as VolumeProfile,dR as WaitForFrames,Iw as WaitForPromise,wf as WaitForSeconds,lo as Watch,Hh as WebARCameraBackground,$o as WebARSessionRoot,wp as WebXR,pl as WebXRButtonFactory,Gh as WebXRImageTracking,ro as WebXRImageTrackingModel,ao as WebXRPlaneTracking,tv as WebXRTrackedImage,oo as XRControllerFollow,pn as XRControllerModel,Ni as XRControllerMovement,os as XRFlag,um as XRRig,Di as XRState,rn as XRStateFlag,uC as __Ignore,z_ as __internalNotifyObjectDestroyed,En as activeInHierarchyFieldName,pb as addAttributeChangeCallback,Ei as addComponent,EE as addCustomExtensionPlugin,Mr as addNewComponent,Dd as addPatch,ou as apply,VR as applyHMRChanges,uw as applyPrototypeExtensions,Q_ as beginListenDestroy,Z_ as beginListenInstantiate,Rg as binaryIdentifierCasts,AR as build_scene_functions,xr as builtinComponentKeyName,lv as calculateProgress01,hk as clearMessages,vT as colorSerializer,iw as compareAssociation,Tu as componentSerializer,Fb as copyTexture,mx as createMotion,ri as debugNet,ac as debugOwner,T1 as decompressGpuTexture,Gl as deepClone,vs as delay,ql as delayForFrames,su as deserializeObject,Ai as destroy,fw as destroyComponentInstance,qx as determineMimeTypeFromExtension,Te as disposeObjectResources,on as disposeStream,oc as editorGuidKeyName,wr as enableSpatialConsole,_T as euler,CT as eventListSerializer,VL as exportAsGLTF,gf as findByGuid,xc as findObjectOfType,bw as findObjectsOfType,Xg as findResourceUsers,zb as fitObjectIntoVolume,Ar as foreachComponent,hu as foreachComponentEnumerator,Pk as forward,gb as generateQRCode,K_ as generateSeed,si as getBoundingBox,Cb as getCameraController,Rr as getComponent,_c as getComponentInChildren,wc as getComponentInParent,bc as getComponents,Na as getComponentsInChildren,nu as getComponentsInParent,b1 as getFormattedDate,Mt as getIconElement,Of as getIconTexture,xs as getLoader,vc as getOrAddComponent,C as getParam,Mk as getParentHierarchyPath,VO as getPath,sM as getPeerOptions,p_ as getPeerjsInstance,kM as getResourceUserCount,kb as getTempColor,bs as getTempQuaternion,q as getTempVector,$l as getUrlParams,Ub as getVisibleInCustomShadowRendering,Eb as getWorldDirection,ug as getWorldEuler,ee as getWorldPosition,Se as getWorldQuaternion,Ad as getWorldRotation,Ge as getWorldScale,Js as hasCommercialLicense,kc as hasIndieLicense,Mu as hasPointerEventComponent,Zs as hasProLicense,Hb as hideDebugConsole,E1 as imageToCanvas,$a as instantiate,a1 as invokeLoadedImportPluginHooks,s_ as invokeXRSessionEnd,i_ as invokeXRSessionStart,_w as isActiveInHierarchy,Wa as isActiveSelf,QO as isAndroidDevice,jb as isAnimationAction,Tx as isComponent,UO as isDebugMode,HO as isDesktop,Er as isDestroyed,F as isDevEnvironment,PM as isDisposed,NL as isExporting,Rx as isGLTFModel,sb as isHostedOnGlitch,Df as isHotReloadEnabled,NR as isHotReloading,qO as isIPad,qw as isIconElement,Xt as isLocalNetwork,KO as isMacOS,GO as isMobileDevice,YO as isMozillaXR,ek as isQuest,B_ as isResourceTrackingEnabled,JO as isSafari,au as isUsingInstancing,ZO as isiOS,XO as isiPad,OL as loadAsset,av as loadSync,Id as logHierarchy,yk as lookAtInverse,Yl as lookAtObject,vk as lookAtScreenPoint,NO as makeId,hb as makeIdFromRandomWords,as as makeNameSafe,ww as markAsInstancedRendered,tk as microphonePermissionsGranted,FO as nameof,rb as nameofFactory,Sx as objectSerializer,Qk as offXRSessionEnd,Xk as offXRSessionStart,hT as onAfterRender,cT as onBeforeRender,aT as onClear,lT as onDestroy,vx as onInitialized,bx as onStart,_x as onUpdate,Cg as onXRSessionEnd,Fd as onXRSessionStart,qS as parseSync,Nb as placeOnSurface,gg as postprocessFBXMaterials,uT as prefix,ab as pushState,WO as randomNumber,Tg as registerBinaryType,bu as registerComponent,y0 as registerComponentExtension,us as registerCustomEffectType,v0 as registerExportExtensions,Ku as registerExtensions,lx as registerHotReloadType,wg as registerLoader,ew as registerPrefabProvider,pw as registerPrototypeExtensions,NM as registerType,ub as relativePathPrefix,mb as removeAttributeChangeCallback,mf as removeComponent,AE as removeCustomImportExtensionType,Gk as removePatch,yo as resolveUrl,db as sanitizeString,zS as saveImage,cL as screenshot,Jy as screenshot2,nf as sendDestroyed,m as serializable,rw as serializeObject,Dr as serializeable,Sc as setActive,bb as setAllowBalloonMessages,rk as setAllowOverlayMessages,Td as setAutoFitEnabled,rg as setCameraController,Sw as setDestroyed,Dk as setDevEnvironment,qg as setDisposable,Va as setDontDestroy,Qm as setOrAddParamsToUrl,zO as setParam,Hl as setParamWithoutReload,nM as setPeerOptions,CM as setResourceTrackingEnabled,Ym as setState,mg as setVisibleInCustomShadowRendering,pg as setWorldEuler,lt as setWorldPosition,br as setWorldPositionXYZ,Yi as setWorldQuaternion,dg as setWorldQuaternionXYZW,Lb as setWorldRotation,Kl as setWorldRotationXYZ,Ta as setWorldScale,tc as showBalloonError,De as showBalloonMessage,be as showBalloonWarning,bg as showDebugConsole,fk as slerp,fc as syncDestroy,q0 as syncField,of as syncInstantiate,Rk as textureToCanvas,d_ as tryCastBinary,Qx as tryDetermineMimetypeFromBinary,Xx as tryDetermineMimetypeFromURL,Ma as tryFindObject,u_ as tryGetGuid,cx as unregisterHotReloadType,Km as unwatchWrite,Pb as useForAutoFit,Tt as validate,Od as watchWrite};
|