@needle-tools/engine 4.7.1 → 4.7.2-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 +3782 -3782
- 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-YjtQYFa9.js +1052 -0
- package/dist/gltf-progressive-yOP1mp5W.min.js +8 -0
- package/dist/gltf-progressive-zdhlW609.umd.cjs +8 -0
- package/dist/{needle-engine.bundle-CN9UC6Ju.min.js → needle-engine.bundle-BhDF-YSv.min.js} +65 -65
- package/dist/{needle-engine.bundle-B7M9iBIa.umd.cjs → needle-engine.bundle-D2myV4E4.umd.cjs} +61 -61
- package/dist/{needle-engine.bundle-BpCihhaP.js → needle-engine.bundle-gp00DTS4.js} +641 -641
- 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 +164 -164
- package/lib/engine/engine_addressables.js +601 -601
- package/lib/engine/engine_animation.d.ts +43 -43
- package/lib/engine/engine_animation.js +133 -133
- package/lib/engine/engine_application.d.ts +45 -45
- package/lib/engine/engine_application.js +104 -104
- package/lib/engine/engine_assetdatabase.d.ts +25 -25
- package/lib/engine/engine_assetdatabase.js +346 -346
- package/lib/engine/engine_audio.d.ts +4 -4
- package/lib/engine/engine_audio.js +23 -23
- package/lib/engine/engine_camera.d.ts +13 -13
- package/lib/engine/engine_camera.js +30 -30
- package/lib/engine/engine_components.d.ts +110 -110
- package/lib/engine/engine_components.js +374 -374
- package/lib/engine/engine_components_internal.d.ts +9 -9
- package/lib/engine/engine_components_internal.js +36 -36
- package/lib/engine/engine_constants.d.ts +10 -10
- package/lib/engine/engine_constants.js +41 -41
- package/lib/engine/engine_context.d.ts +475 -475
- package/lib/engine/engine_context.js +1673 -1673
- package/lib/engine/engine_context_registry.d.ts +71 -71
- package/lib/engine/engine_context_registry.js +117 -117
- package/lib/engine/engine_coroutine.d.ts +35 -35
- package/lib/engine/engine_coroutine.js +52 -52
- package/lib/engine/engine_create_objects.d.ts +119 -119
- package/lib/engine/engine_create_objects.js +320 -320
- package/lib/engine/engine_default_parameters.d.ts +2 -2
- package/lib/engine/engine_default_parameters.js +3 -3
- package/lib/engine/engine_editor-sync.d.ts +21 -21
- package/lib/engine/engine_editor-sync.js +4 -4
- package/lib/engine/engine_fileloader.d.ts +2 -2
- package/lib/engine/engine_fileloader.js +8 -8
- package/lib/engine/engine_gameobject.d.ts +68 -68
- package/lib/engine/engine_gameobject.js +619 -619
- package/lib/engine/engine_generic_utils.d.ts +1 -1
- package/lib/engine/engine_generic_utils.js +13 -13
- package/lib/engine/engine_gizmos.d.ts +149 -149
- package/lib/engine/engine_gizmos.js +530 -530
- package/lib/engine/engine_gltf.d.ts +12 -12
- package/lib/engine/engine_gltf.js +15 -15
- package/lib/engine/engine_gltf_builtin_components.d.ts +11 -11
- package/lib/engine/engine_gltf_builtin_components.js +341 -341
- package/lib/engine/engine_hot_reload.d.ts +8 -8
- package/lib/engine/engine_hot_reload.js +197 -197
- package/lib/engine/engine_input.d.ts +362 -362
- package/lib/engine/engine_input.js +1294 -1294
- package/lib/engine/engine_input_utils.d.ts +2 -2
- package/lib/engine/engine_input_utils.js +22 -22
- package/lib/engine/engine_instancing.d.ts +19 -19
- package/lib/engine/engine_instancing.js +39 -39
- package/lib/engine/engine_license.d.ts +11 -11
- package/lib/engine/engine_license.js +369 -369
- package/lib/engine/engine_lifecycle_api.d.ts +83 -83
- package/lib/engine/engine_lifecycle_api.js +106 -106
- package/lib/engine/engine_lifecycle_functions_internal.d.ts +32 -32
- package/lib/engine/engine_lifecycle_functions_internal.js +146 -146
- package/lib/engine/engine_lightdata.d.ts +23 -23
- package/lib/engine/engine_lightdata.js +101 -101
- package/lib/engine/engine_loaders.callbacks.d.ts +97 -97
- package/lib/engine/engine_loaders.callbacks.js +86 -86
- package/lib/engine/engine_loaders.d.ts +48 -48
- package/lib/engine/engine_loaders.gltf.d.ts +13 -13
- package/lib/engine/engine_loaders.gltf.js +62 -62
- package/lib/engine/engine_loaders.js +337 -337
- package/lib/engine/engine_lods.d.ts +35 -35
- package/lib/engine/engine_lods.js +160 -160
- package/lib/engine/engine_lods.js.map +1 -1
- package/lib/engine/engine_mainloop_utils.d.ts +32 -32
- package/lib/engine/engine_mainloop_utils.js +466 -466
- package/lib/engine/engine_math.d.ts +114 -114
- package/lib/engine/engine_math.js +247 -247
- package/lib/engine/engine_modules.d.ts +36 -36
- package/lib/engine/engine_modules.js +85 -85
- package/lib/engine/engine_networking.d.ts +260 -260
- package/lib/engine/engine_networking.js +764 -764
- package/lib/engine/engine_networking_auto.d.ts +24 -24
- package/lib/engine/engine_networking_auto.js +310 -310
- package/lib/engine/engine_networking_blob.d.ts +48 -48
- package/lib/engine/engine_networking_blob.js +228 -228
- package/lib/engine/engine_networking_files.d.ts +35 -35
- package/lib/engine/engine_networking_files.js +172 -172
- package/lib/engine/engine_networking_files_default_components.d.ts +6 -6
- package/lib/engine/engine_networking_files_default_components.js +42 -42
- package/lib/engine/engine_networking_instantiate.d.ts +100 -100
- package/lib/engine/engine_networking_instantiate.js +345 -345
- package/lib/engine/engine_networking_peer.d.ts +15 -15
- package/lib/engine/engine_networking_peer.js +132 -132
- package/lib/engine/engine_networking_streams.d.ts +123 -123
- package/lib/engine/engine_networking_streams.js +645 -645
- package/lib/engine/engine_networking_types.d.ts +22 -22
- package/lib/engine/engine_networking_types.js +7 -7
- package/lib/engine/engine_networking_utils.d.ts +2 -2
- package/lib/engine/engine_networking_utils.js +20 -20
- package/lib/engine/engine_networking_websocket.d.ts +1 -1
- package/lib/engine/engine_networking_websocket.js +2 -2
- package/lib/engine/engine_patcher.d.ts +10 -10
- package/lib/engine/engine_patcher.js +142 -142
- package/lib/engine/engine_physics.d.ts +152 -152
- package/lib/engine/engine_physics.js +645 -645
- package/lib/engine/engine_physics.types.d.ts +40 -40
- package/lib/engine/engine_physics.types.js +33 -33
- package/lib/engine/engine_physics_rapier.d.ts +147 -147
- package/lib/engine/engine_physics_rapier.js +1433 -1433
- package/lib/engine/engine_playerview.d.ts +26 -26
- package/lib/engine/engine_playerview.js +64 -64
- package/lib/engine/engine_scenelighting.d.ts +71 -71
- package/lib/engine/engine_scenelighting.js +226 -226
- package/lib/engine/engine_serialization.d.ts +3 -3
- package/lib/engine/engine_serialization.js +3 -3
- package/lib/engine/engine_serialization_builtin_serializer.d.ts +72 -72
- package/lib/engine/engine_serialization_builtin_serializer.js +403 -403
- package/lib/engine/engine_serialization_core.d.ts +94 -94
- package/lib/engine/engine_serialization_core.js +607 -607
- package/lib/engine/engine_serialization_decorator.d.ts +23 -23
- package/lib/engine/engine_serialization_decorator.js +66 -66
- package/lib/engine/engine_setup.d.ts +1 -1
- package/lib/engine/engine_setup.js +2 -2
- package/lib/engine/engine_shaders.d.ts +53 -53
- package/lib/engine/engine_shaders.js +252 -252
- package/lib/engine/engine_shims.d.ts +4 -4
- package/lib/engine/engine_shims.js +24 -24
- package/lib/engine/engine_test_utils.d.ts +39 -39
- package/lib/engine/engine_test_utils.js +83 -83
- package/lib/engine/engine_texture.d.ts +28 -28
- package/lib/engine/engine_texture.js +64 -64
- package/lib/engine/engine_three_utils.d.ts +204 -204
- package/lib/engine/engine_three_utils.js +788 -788
- package/lib/engine/engine_time.d.ts +51 -51
- package/lib/engine/engine_time.js +82 -82
- package/lib/engine/engine_time_utils.d.ts +88 -88
- package/lib/engine/engine_time_utils.js +215 -215
- package/lib/engine/engine_tonemapping.d.ts +6 -6
- package/lib/engine/engine_tonemapping.js +197 -197
- package/lib/engine/engine_types.d.ts +578 -578
- package/lib/engine/engine_types.js +95 -95
- package/lib/engine/engine_typestore.d.ts +28 -28
- package/lib/engine/engine_typestore.js +55 -55
- package/lib/engine/engine_util_decorator.d.ts +13 -13
- package/lib/engine/engine_util_decorator.js +116 -116
- package/lib/engine/engine_utils.d.ts +248 -248
- package/lib/engine/engine_utils.js +1012 -1012
- package/lib/engine/engine_utils_format.d.ts +24 -24
- package/lib/engine/engine_utils_format.js +239 -239
- package/lib/engine/engine_utils_screenshot.d.ts +159 -159
- package/lib/engine/engine_utils_screenshot.js +522 -522
- package/lib/engine/engine_utils_screenshot.xr.d.ts +5 -5
- package/lib/engine/engine_utils_screenshot.xr.js +90 -90
- package/lib/engine/engine_xr.d.ts +1 -1
- package/lib/engine/engine_xr.js +1 -1
- package/lib/engine/export/gltf/Writers.d.ts +19 -19
- package/lib/engine/export/gltf/Writers.js +24 -24
- package/lib/engine/export/gltf/index.d.ts +11 -11
- package/lib/engine/export/gltf/index.js +123 -123
- package/lib/engine/export/index.d.ts +2 -2
- package/lib/engine/export/index.js +2 -2
- package/lib/engine/export/state.d.ts +7 -7
- package/lib/engine/export/state.js +17 -17
- package/lib/engine/export/utils.d.ts +2 -2
- package/lib/engine/export/utils.js +7 -7
- package/lib/engine/extensions/EXT_texture_exr.d.ts +8 -8
- package/lib/engine/extensions/EXT_texture_exr.js +32 -32
- package/lib/engine/extensions/NEEDLE_animator_controller_model.d.ts +122 -122
- package/lib/engine/extensions/NEEDLE_animator_controller_model.js +95 -95
- package/lib/engine/extensions/NEEDLE_components.d.ts +35 -35
- package/lib/engine/extensions/NEEDLE_components.js +220 -220
- package/lib/engine/extensions/NEEDLE_gameobject_data.d.ts +10 -10
- package/lib/engine/extensions/NEEDLE_gameobject_data.js +57 -57
- package/lib/engine/extensions/NEEDLE_lighting_settings.d.ts +37 -37
- package/lib/engine/extensions/NEEDLE_lighting_settings.js +157 -157
- package/lib/engine/extensions/NEEDLE_lightmaps.d.ts +18 -18
- package/lib/engine/extensions/NEEDLE_lightmaps.js +99 -99
- package/lib/engine/extensions/NEEDLE_persistent_assets.d.ts +11 -11
- package/lib/engine/extensions/NEEDLE_persistent_assets.js +63 -63
- package/lib/engine/extensions/NEEDLE_progressive.d.ts +1 -1
- package/lib/engine/extensions/NEEDLE_progressive.js +1 -1
- package/lib/engine/extensions/NEEDLE_render_objects.d.ts +13 -13
- package/lib/engine/extensions/NEEDLE_render_objects.js +159 -159
- package/lib/engine/extensions/NEEDLE_techniques_webgl.d.ts +38 -38
- package/lib/engine/extensions/NEEDLE_techniques_webgl.js +564 -564
- package/lib/engine/extensions/extension_resolver.d.ts +4 -4
- package/lib/engine/extensions/extension_resolver.js +1 -1
- package/lib/engine/extensions/extension_utils.d.ts +12 -12
- package/lib/engine/extensions/extension_utils.js +152 -152
- package/lib/engine/extensions/extensions.d.ts +32 -32
- package/lib/engine/extensions/extensions.js +107 -107
- package/lib/engine/extensions/index.d.ts +6 -6
- package/lib/engine/extensions/index.js +6 -6
- package/lib/engine/extensions/usage_tracker.d.ts +13 -13
- package/lib/engine/extensions/usage_tracker.js +65 -65
- package/lib/engine/js-extensions/Camera.d.ts +1 -1
- package/lib/engine/js-extensions/Camera.js +39 -39
- package/lib/engine/js-extensions/ExtensionUtils.d.ts +9 -9
- package/lib/engine/js-extensions/ExtensionUtils.js +67 -67
- package/lib/engine/js-extensions/Layers.d.ts +6 -6
- package/lib/engine/js-extensions/Layers.js +22 -22
- package/lib/engine/js-extensions/Object3D.d.ts +120 -120
- package/lib/engine/js-extensions/Object3D.js +136 -136
- package/lib/engine/js-extensions/RGBAColor.d.ts +23 -23
- package/lib/engine/js-extensions/RGBAColor.js +111 -111
- package/lib/engine/js-extensions/Vector.d.ts +3 -3
- package/lib/engine/js-extensions/Vector.js +13 -13
- package/lib/engine/js-extensions/index.d.ts +5 -5
- package/lib/engine/js-extensions/index.js +5 -5
- package/lib/engine/physics/workers/mesh-bvh/GenerateMeshBVHWorker.d.ts +4 -4
- package/lib/engine/physics/workers/mesh-bvh/GenerateMeshBVHWorker.js +79 -79
- package/lib/engine/shaders/shaderData.d.ts +55 -55
- package/lib/engine/shaders/shaderData.js +58 -58
- package/lib/engine/tests/test_utils.d.ts +2 -2
- package/lib/engine/tests/test_utils.js +53 -53
- package/lib/engine/webcomponents/WebXRButtons.d.ts +56 -56
- package/lib/engine/webcomponents/WebXRButtons.js +230 -230
- package/lib/engine/webcomponents/api.d.ts +5 -5
- package/lib/engine/webcomponents/api.js +4 -4
- package/lib/engine/webcomponents/buttons.d.ts +51 -51
- package/lib/engine/webcomponents/buttons.js +264 -264
- package/lib/engine/webcomponents/fonts.d.ts +9 -9
- package/lib/engine/webcomponents/fonts.js +32 -32
- package/lib/engine/webcomponents/icons.d.ts +9 -9
- package/lib/engine/webcomponents/icons.js +52 -52
- package/lib/engine/webcomponents/index.d.ts +1 -1
- package/lib/engine/webcomponents/index.js +1 -1
- package/lib/engine/webcomponents/logo-element.d.ts +10 -10
- package/lib/engine/webcomponents/logo-element.js +67 -67
- package/lib/engine/webcomponents/needle menu/needle-menu-spatial.d.ts +37 -37
- package/lib/engine/webcomponents/needle menu/needle-menu-spatial.js +513 -513
- package/lib/engine/webcomponents/needle menu/needle-menu.d.ts +155 -155
- package/lib/engine/webcomponents/needle menu/needle-menu.js +1029 -1029
- package/lib/engine/webcomponents/needle-button.d.ts +34 -34
- package/lib/engine/webcomponents/needle-button.js +161 -161
- package/lib/engine/webcomponents/needle-engine.ar-overlay.d.ts +21 -21
- package/lib/engine/webcomponents/needle-engine.ar-overlay.js +166 -166
- package/lib/engine/webcomponents/needle-engine.attributes.d.ts +69 -69
- package/lib/engine/webcomponents/needle-engine.attributes.js +1 -1
- package/lib/engine/webcomponents/needle-engine.d.ts +116 -116
- package/lib/engine/webcomponents/needle-engine.extras.d.ts +6 -6
- package/lib/engine/webcomponents/needle-engine.extras.js +13 -13
- package/lib/engine/webcomponents/needle-engine.js +821 -821
- package/lib/engine/webcomponents/needle-engine.loading.d.ts +44 -44
- package/lib/engine/webcomponents/needle-engine.loading.js +341 -341
- package/lib/engine/xr/NeedleXRController.d.ts +313 -313
- package/lib/engine/xr/NeedleXRController.js +1007 -1007
- package/lib/engine/xr/NeedleXRSession.d.ts +340 -340
- package/lib/engine/xr/NeedleXRSession.js +1463 -1463
- package/lib/engine/xr/NeedleXRSync.d.ts +22 -22
- package/lib/engine/xr/NeedleXRSync.js +188 -188
- package/lib/engine/xr/SceneTransition.d.ts +18 -18
- package/lib/engine/xr/SceneTransition.js +69 -69
- package/lib/engine/xr/TempXRContext.d.ts +34 -34
- package/lib/engine/xr/TempXRContext.js +187 -187
- package/lib/engine/xr/XRRig.d.ts +7 -7
- package/lib/engine/xr/XRRig.js +1 -1
- package/lib/engine/xr/api.d.ts +6 -6
- package/lib/engine/xr/api.js +6 -6
- package/lib/engine/xr/events.d.ts +66 -66
- package/lib/engine/xr/events.js +93 -93
- package/lib/engine/xr/internal.d.ts +12 -12
- package/lib/engine/xr/internal.js +25 -25
- package/lib/engine/xr/usdz.d.ts +12 -12
- package/lib/engine/xr/usdz.js +29 -29
- package/lib/engine/xr/utils.d.ts +11 -11
- package/lib/engine/xr/utils.js +34 -34
- package/lib/engine-components/AlignmentConstraint.d.ts +10 -10
- package/lib/engine-components/AlignmentConstraint.js +39 -39
- package/lib/engine-components/Animation.d.ts +156 -156
- package/lib/engine-components/Animation.js +508 -508
- package/lib/engine-components/AnimationCurve.d.ts +40 -40
- package/lib/engine-components/AnimationCurve.js +159 -159
- package/lib/engine-components/AnimationUtils.d.ts +8 -8
- package/lib/engine-components/AnimationUtils.js +27 -27
- package/lib/engine-components/AnimationUtilsAutoplay.d.ts +1 -1
- package/lib/engine-components/AnimationUtilsAutoplay.js +39 -39
- package/lib/engine-components/Animator.d.ts +217 -217
- package/lib/engine-components/Animator.js +354 -354
- package/lib/engine-components/AnimatorController.d.ts +227 -227
- package/lib/engine-components/AnimatorController.js +1152 -1152
- package/lib/engine-components/AudioListener.d.ts +33 -33
- package/lib/engine-components/AudioListener.js +86 -86
- package/lib/engine-components/AudioSource.d.ts +217 -217
- package/lib/engine-components/AudioSource.js +635 -635
- package/lib/engine-components/AvatarLoader.d.ts +80 -80
- package/lib/engine-components/AvatarLoader.js +231 -231
- package/lib/engine-components/AxesHelper.d.ts +32 -32
- package/lib/engine-components/AxesHelper.js +67 -67
- package/lib/engine-components/BasicIKConstraint.d.ts +9 -9
- package/lib/engine-components/BasicIKConstraint.js +43 -43
- package/lib/engine-components/BoxCollider.d.ts +2 -2
- package/lib/engine-components/BoxCollider.js +2 -2
- package/lib/engine-components/BoxHelperComponent.d.ts +47 -47
- package/lib/engine-components/BoxHelperComponent.js +102 -102
- package/lib/engine-components/Camera.d.ts +231 -231
- package/lib/engine-components/Camera.js +700 -700
- package/lib/engine-components/CameraUtils.d.ts +1 -1
- package/lib/engine-components/CameraUtils.js +123 -123
- package/lib/engine-components/CharacterController.d.ts +55 -55
- package/lib/engine-components/CharacterController.js +236 -236
- package/lib/engine-components/Collider.d.ts +188 -188
- package/lib/engine-components/Collider.js +369 -369
- package/lib/engine-components/Component.d.ts +792 -792
- package/lib/engine-components/Component.js +920 -920
- package/lib/engine-components/ContactShadows.d.ts +94 -94
- package/lib/engine-components/ContactShadows.js +453 -453
- package/lib/engine-components/DeleteBox.d.ts +19 -19
- package/lib/engine-components/DeleteBox.js +58 -58
- package/lib/engine-components/DeviceFlag.d.ts +16 -16
- package/lib/engine-components/DeviceFlag.js +47 -47
- package/lib/engine-components/DragControls.d.ts +170 -170
- package/lib/engine-components/DragControls.js +1421 -1421
- package/lib/engine-components/DropListener.d.ts +215 -215
- package/lib/engine-components/DropListener.js +642 -642
- package/lib/engine-components/Duplicatable.d.ts +35 -35
- package/lib/engine-components/Duplicatable.js +202 -202
- package/lib/engine-components/EventList.d.ts +54 -54
- package/lib/engine-components/EventList.js +232 -232
- package/lib/engine-components/EventTrigger.d.ts +33 -33
- package/lib/engine-components/EventTrigger.js +75 -75
- package/lib/engine-components/EventType.d.ts +22 -22
- package/lib/engine-components/EventType.js +23 -23
- package/lib/engine-components/Fog.d.ts +22 -22
- package/lib/engine-components/Fog.js +61 -61
- package/lib/engine-components/Gizmos.d.ts +17 -17
- package/lib/engine-components/Gizmos.js +64 -64
- package/lib/engine-components/GridHelper.d.ts +20 -20
- package/lib/engine-components/GridHelper.js +54 -54
- package/lib/engine-components/GroundProjection.d.ts +67 -67
- package/lib/engine-components/GroundProjection.js +343 -343
- package/lib/engine-components/Interactable.d.ts +12 -12
- package/lib/engine-components/Interactable.js +12 -12
- package/lib/engine-components/Joints.d.ts +19 -19
- package/lib/engine-components/Joints.js +51 -51
- package/lib/engine-components/LODGroup.d.ts +35 -35
- package/lib/engine-components/LODGroup.js +152 -152
- package/lib/engine-components/Light.d.ts +180 -180
- package/lib/engine-components/Light.js +535 -535
- package/lib/engine-components/LookAtConstraint.d.ts +19 -19
- package/lib/engine-components/LookAtConstraint.js +35 -35
- package/lib/engine-components/NeedleMenu.d.ts +50 -50
- package/lib/engine-components/NeedleMenu.js +92 -92
- package/lib/engine-components/NestedGltf.d.ts +25 -25
- package/lib/engine-components/NestedGltf.js +88 -88
- package/lib/engine-components/Networking.d.ts +54 -54
- package/lib/engine-components/Networking.js +112 -112
- package/lib/engine-components/OffsetConstraint.d.ts +14 -14
- package/lib/engine-components/OffsetConstraint.js +65 -65
- package/lib/engine-components/OrbitControls.d.ts +268 -268
- package/lib/engine-components/OrbitControls.js +1015 -1015
- package/lib/engine-components/PlayerColor.d.ts +19 -19
- package/lib/engine-components/PlayerColor.js +94 -94
- package/lib/engine-components/ReflectionProbe.d.ts +28 -28
- package/lib/engine-components/ReflectionProbe.js +204 -204
- package/lib/engine-components/Renderer.d.ts +153 -153
- package/lib/engine-components/Renderer.js +834 -834
- package/lib/engine-components/RendererInstancing.d.ts +140 -140
- package/lib/engine-components/RendererInstancing.js +744 -744
- package/lib/engine-components/RendererInstancing.js.map +1 -1
- package/lib/engine-components/RendererLightmap.d.ts +24 -24
- package/lib/engine-components/RendererLightmap.js +182 -182
- package/lib/engine-components/RigidBody.d.ts +155 -155
- package/lib/engine-components/RigidBody.js +517 -517
- package/lib/engine-components/SceneSwitcher.d.ts +263 -263
- package/lib/engine-components/SceneSwitcher.js +971 -971
- package/lib/engine-components/ScreenCapture.d.ts +144 -144
- package/lib/engine-components/ScreenCapture.js +547 -547
- package/lib/engine-components/ShadowCatcher.d.ts +33 -33
- package/lib/engine-components/ShadowCatcher.js +166 -166
- package/lib/engine-components/Skybox.d.ts +88 -88
- package/lib/engine-components/Skybox.js +469 -469
- package/lib/engine-components/SmoothFollow.d.ts +34 -34
- package/lib/engine-components/SmoothFollow.js +82 -82
- package/lib/engine-components/SpatialTrigger.d.ts +102 -102
- package/lib/engine-components/SpatialTrigger.js +225 -225
- package/lib/engine-components/SpectatorCamera.d.ts +111 -111
- package/lib/engine-components/SpectatorCamera.js +715 -715
- package/lib/engine-components/SphereCollider.d.ts +2 -2
- package/lib/engine-components/SphereCollider.js +2 -2
- package/lib/engine-components/SpriteRenderer.d.ts +132 -132
- package/lib/engine-components/SpriteRenderer.js +472 -472
- package/lib/engine-components/SyncedCamera.d.ts +41 -41
- package/lib/engine-components/SyncedCamera.js +199 -199
- package/lib/engine-components/SyncedRoom.d.ts +106 -106
- package/lib/engine-components/SyncedRoom.js +371 -371
- package/lib/engine-components/SyncedTransform.d.ts +94 -94
- package/lib/engine-components/SyncedTransform.js +331 -331
- package/lib/engine-components/TestRunner.d.ts +16 -16
- package/lib/engine-components/TestRunner.js +102 -102
- package/lib/engine-components/TransformGizmo.d.ts +75 -75
- package/lib/engine-components/TransformGizmo.js +209 -209
- package/lib/engine-components/VideoPlayer.d.ts +184 -184
- package/lib/engine-components/VideoPlayer.js +978 -978
- package/lib/engine-components/Voip.d.ts +67 -67
- package/lib/engine-components/Voip.js +360 -360
- package/lib/engine-components/api.d.ts +51 -51
- package/lib/engine-components/api.js +50 -50
- package/lib/engine-components/avatar/AvatarBlink_Simple.d.ts +11 -11
- package/lib/engine-components/avatar/AvatarBlink_Simple.js +76 -76
- package/lib/engine-components/avatar/AvatarEyeLook_Rotation.d.ts +14 -14
- package/lib/engine-components/avatar/AvatarEyeLook_Rotation.js +68 -68
- package/lib/engine-components/avatar/Avatar_Brain_LookAt.d.ts +29 -29
- package/lib/engine-components/avatar/Avatar_Brain_LookAt.js +121 -121
- package/lib/engine-components/avatar/Avatar_MouthShapes.d.ts +15 -15
- package/lib/engine-components/avatar/Avatar_MouthShapes.js +79 -79
- package/lib/engine-components/avatar/Avatar_MustacheShake.d.ts +9 -9
- package/lib/engine-components/avatar/Avatar_MustacheShake.js +29 -29
- package/lib/engine-components/codegen/components.d.ts +216 -216
- package/lib/engine-components/codegen/components.js +218 -218
- package/lib/engine-components/debug/LogStats.d.ts +5 -5
- package/lib/engine-components/debug/LogStats.js +18 -18
- package/lib/engine-components/export/gltf/GltfExport.d.ts +30 -30
- package/lib/engine-components/export/gltf/GltfExport.js +246 -246
- package/lib/engine-components/export/gltf/index.d.ts +1 -1
- package/lib/engine-components/export/gltf/index.js +1 -1
- package/lib/engine-components/export/index.d.ts +1 -1
- package/lib/engine-components/export/index.js +1 -1
- package/lib/engine-components/export/usdz/Extension.d.ts +22 -22
- package/lib/engine-components/export/usdz/Extension.js +1 -1
- package/lib/engine-components/export/usdz/ThreeUSDZExporter.d.ts +162 -162
- package/lib/engine-components/export/usdz/ThreeUSDZExporter.js +1789 -1789
- package/lib/engine-components/export/usdz/USDZExporter.d.ts +130 -130
- package/lib/engine-components/export/usdz/USDZExporter.js +663 -663
- package/lib/engine-components/export/usdz/extensions/Animation.d.ts +106 -106
- package/lib/engine-components/export/usdz/extensions/Animation.js +1071 -1071
- package/lib/engine-components/export/usdz/extensions/DocumentExtension.d.ts +5 -5
- package/lib/engine-components/export/usdz/extensions/DocumentExtension.js +6 -6
- package/lib/engine-components/export/usdz/extensions/NodeMaterialConverter.d.ts +10 -10
- package/lib/engine-components/export/usdz/extensions/NodeMaterialConverter.js +451 -451
- package/lib/engine-components/export/usdz/extensions/USDZText.d.ts +54 -54
- package/lib/engine-components/export/usdz/extensions/USDZText.js +203 -203
- package/lib/engine-components/export/usdz/extensions/USDZUI.d.ts +8 -8
- package/lib/engine-components/export/usdz/extensions/USDZUI.js +158 -158
- package/lib/engine-components/export/usdz/extensions/behavior/Actions.d.ts +30 -30
- package/lib/engine-components/export/usdz/extensions/behavior/Actions.js +88 -88
- package/lib/engine-components/export/usdz/extensions/behavior/AudioExtension.d.ts +10 -10
- package/lib/engine-components/export/usdz/extensions/behavior/AudioExtension.js +86 -86
- package/lib/engine-components/export/usdz/extensions/behavior/Behaviour.d.ts +28 -28
- package/lib/engine-components/export/usdz/extensions/behavior/Behaviour.js +290 -290
- package/lib/engine-components/export/usdz/extensions/behavior/BehaviourComponents.d.ts +190 -190
- package/lib/engine-components/export/usdz/extensions/behavior/BehaviourComponents.js +1060 -1060
- package/lib/engine-components/export/usdz/extensions/behavior/BehavioursBuilder.d.ts +135 -135
- package/lib/engine-components/export/usdz/extensions/behavior/BehavioursBuilder.js +548 -548
- package/lib/engine-components/export/usdz/extensions/behavior/PhysicsExtension.d.ts +7 -7
- package/lib/engine-components/export/usdz/extensions/behavior/PhysicsExtension.js +115 -115
- package/lib/engine-components/export/usdz/index.d.ts +3 -3
- package/lib/engine-components/export/usdz/index.js +2 -2
- package/lib/engine-components/export/usdz/utils/animationutils.d.ts +7 -7
- package/lib/engine-components/export/usdz/utils/animationutils.js +163 -163
- package/lib/engine-components/export/usdz/utils/quicklook.d.ts +2 -2
- package/lib/engine-components/export/usdz/utils/quicklook.js +43 -43
- package/lib/engine-components/particlesystem/ParticleSystem.d.ts +177 -177
- package/lib/engine-components/particlesystem/ParticleSystem.js +1176 -1176
- package/lib/engine-components/particlesystem/ParticleSystemModules.d.ts +526 -526
- package/lib/engine-components/particlesystem/ParticleSystemModules.js +1930 -1930
- package/lib/engine-components/particlesystem/ParticleSystemSubEmitter.d.ts +25 -25
- package/lib/engine-components/particlesystem/ParticleSystemSubEmitter.js +87 -87
- package/lib/engine-components/particlesystem/api.d.ts +2 -2
- package/lib/engine-components/particlesystem/api.js +2 -2
- package/lib/engine-components/postprocessing/Effects/Antialiasing.d.ts +17 -17
- package/lib/engine-components/postprocessing/Effects/Antialiasing.js +59 -59
- package/lib/engine-components/postprocessing/Effects/BloomEffect.d.ts +46 -46
- package/lib/engine-components/postprocessing/Effects/BloomEffect.js +113 -113
- package/lib/engine-components/postprocessing/Effects/ChromaticAberration.d.ts +11 -11
- package/lib/engine-components/postprocessing/Effects/ChromaticAberration.js +39 -39
- package/lib/engine-components/postprocessing/Effects/ColorAdjustments.d.ts +23 -23
- package/lib/engine-components/postprocessing/Effects/ColorAdjustments.js +111 -111
- package/lib/engine-components/postprocessing/Effects/DepthOfField.d.ts +25 -25
- package/lib/engine-components/postprocessing/Effects/DepthOfField.js +104 -104
- package/lib/engine-components/postprocessing/Effects/EffectWrapper.d.ts +12 -12
- package/lib/engine-components/postprocessing/Effects/EffectWrapper.js +18 -18
- package/lib/engine-components/postprocessing/Effects/Pixelation.d.ts +11 -11
- package/lib/engine-components/postprocessing/Effects/Pixelation.js +32 -32
- package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusion.d.ts +18 -18
- package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusion.js +91 -91
- package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.d.ts +70 -70
- package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.js +176 -176
- package/lib/engine-components/postprocessing/Effects/Sharpening.d.ts +18 -18
- package/lib/engine-components/postprocessing/Effects/Sharpening.js +127 -127
- package/lib/engine-components/postprocessing/Effects/TiltShiftEffect.d.ts +17 -17
- package/lib/engine-components/postprocessing/Effects/TiltShiftEffect.js +70 -70
- package/lib/engine-components/postprocessing/Effects/Tonemapping.d.ts +19 -19
- package/lib/engine-components/postprocessing/Effects/Tonemapping.js +94 -94
- package/lib/engine-components/postprocessing/Effects/Tonemapping.utils.d.ts +13 -13
- package/lib/engine-components/postprocessing/Effects/Tonemapping.utils.js +51 -51
- package/lib/engine-components/postprocessing/Effects/Vignette.d.ts +15 -15
- package/lib/engine-components/postprocessing/Effects/Vignette.js +60 -60
- package/lib/engine-components/postprocessing/PostProcessingEffect.d.ts +90 -90
- package/lib/engine-components/postprocessing/PostProcessingEffect.js +168 -168
- package/lib/engine-components/postprocessing/PostProcessingHandler.d.ts +42 -42
- package/lib/engine-components/postprocessing/PostProcessingHandler.js +494 -494
- package/lib/engine-components/postprocessing/Volume.d.ts +90 -90
- package/lib/engine-components/postprocessing/Volume.js +385 -385
- package/lib/engine-components/postprocessing/VolumeParameter.d.ts +26 -26
- package/lib/engine-components/postprocessing/VolumeParameter.js +136 -136
- package/lib/engine-components/postprocessing/VolumeProfile.d.ts +15 -15
- package/lib/engine-components/postprocessing/VolumeProfile.js +60 -60
- package/lib/engine-components/postprocessing/index.d.ts +6 -6
- package/lib/engine-components/postprocessing/index.js +6 -6
- package/lib/engine-components/postprocessing/utils.d.ts +55 -55
- package/lib/engine-components/postprocessing/utils.js +119 -119
- package/lib/engine-components/timeline/PlayableDirector.d.ts +163 -163
- package/lib/engine-components/timeline/PlayableDirector.js +686 -686
- package/lib/engine-components/timeline/SignalAsset.d.ts +24 -24
- package/lib/engine-components/timeline/SignalAsset.js +130 -130
- package/lib/engine-components/timeline/TimelineModels.d.ts +89 -89
- package/lib/engine-components/timeline/TimelineModels.js +22 -22
- package/lib/engine-components/timeline/TimelineTracks.d.ts +110 -110
- package/lib/engine-components/timeline/TimelineTracks.js +879 -879
- package/lib/engine-components/timeline/index.d.ts +4 -4
- package/lib/engine-components/timeline/index.js +3 -3
- package/lib/engine-components/ui/BaseUIComponent.d.ts +48 -48
- package/lib/engine-components/ui/BaseUIComponent.js +170 -170
- package/lib/engine-components/ui/Button.d.ts +64 -64
- package/lib/engine-components/ui/Button.js +315 -315
- package/lib/engine-components/ui/Canvas.d.ts +74 -74
- package/lib/engine-components/ui/Canvas.js +407 -407
- package/lib/engine-components/ui/CanvasGroup.d.ts +19 -19
- package/lib/engine-components/ui/CanvasGroup.js +58 -58
- package/lib/engine-components/ui/EventSystem.d.ts +125 -125
- package/lib/engine-components/ui/EventSystem.js +765 -765
- package/lib/engine-components/ui/Graphic.d.ts +55 -55
- package/lib/engine-components/ui/Graphic.js +255 -255
- package/lib/engine-components/ui/Image.d.ts +35 -35
- package/lib/engine-components/ui/Image.js +116 -116
- package/lib/engine-components/ui/InputField.d.ts +42 -42
- package/lib/engine-components/ui/InputField.js +268 -268
- package/lib/engine-components/ui/Interfaces.d.ts +38 -38
- package/lib/engine-components/ui/Interfaces.js +12 -12
- package/lib/engine-components/ui/Layout.d.ts +84 -84
- package/lib/engine-components/ui/Layout.js +330 -330
- package/lib/engine-components/ui/Outline.d.ts +7 -7
- package/lib/engine-components/ui/Outline.js +20 -20
- package/lib/engine-components/ui/PointerEvents.d.ts +115 -115
- package/lib/engine-components/ui/PointerEvents.js +145 -145
- package/lib/engine-components/ui/RaycastUtils.d.ts +11 -11
- package/lib/engine-components/ui/RaycastUtils.js +67 -67
- package/lib/engine-components/ui/Raycaster.d.ts +30 -30
- package/lib/engine-components/ui/Raycaster.js +95 -95
- package/lib/engine-components/ui/RectTransform.d.ts +61 -61
- package/lib/engine-components/ui/RectTransform.js +356 -356
- package/lib/engine-components/ui/SpatialHtml.d.ts +8 -8
- package/lib/engine-components/ui/SpatialHtml.js +79 -79
- package/lib/engine-components/ui/Symbols.d.ts +1 -1
- package/lib/engine-components/ui/Symbols.js +1 -1
- package/lib/engine-components/ui/Text.d.ts +78 -78
- package/lib/engine-components/ui/Text.js +539 -539
- package/lib/engine-components/ui/Utils.d.ts +24 -24
- package/lib/engine-components/ui/Utils.js +90 -90
- package/lib/engine-components/ui/index.d.ts +1 -1
- package/lib/engine-components/ui/index.js +1 -1
- package/lib/engine-components/utils/EnvironmentScene.d.ts +5 -5
- package/lib/engine-components/utils/EnvironmentScene.js +205 -205
- package/lib/engine-components/utils/LookAt.d.ts +31 -31
- package/lib/engine-components/utils/LookAt.js +82 -82
- package/lib/engine-components/utils/OpenURL.d.ts +42 -42
- package/lib/engine-components/utils/OpenURL.js +119 -119
- package/lib/engine-components/webxr/Avatar.d.ts +25 -25
- package/lib/engine-components/webxr/Avatar.js +255 -255
- package/lib/engine-components/webxr/TeleportTarget.d.ts +7 -7
- package/lib/engine-components/webxr/TeleportTarget.js +7 -7
- package/lib/engine-components/webxr/WebARCameraBackground.d.ts +30 -30
- package/lib/engine-components/webxr/WebARCameraBackground.js +155 -155
- package/lib/engine-components/webxr/WebARSessionRoot.d.ts +98 -98
- package/lib/engine-components/webxr/WebARSessionRoot.js +770 -770
- package/lib/engine-components/webxr/WebXR.d.ts +232 -232
- package/lib/engine-components/webxr/WebXR.js +561 -561
- package/lib/engine-components/webxr/WebXRAvatar.d.ts +27 -27
- package/lib/engine-components/webxr/WebXRAvatar.js +44 -44
- package/lib/engine-components/webxr/WebXRImageTracking.d.ts +86 -86
- package/lib/engine-components/webxr/WebXRImageTracking.js +471 -471
- package/lib/engine-components/webxr/WebXRPlaneTracking.d.ts +92 -92
- package/lib/engine-components/webxr/WebXRPlaneTracking.js +500 -500
- package/lib/engine-components/webxr/WebXRRig.d.ts +32 -32
- package/lib/engine-components/webxr/WebXRRig.js +72 -72
- package/lib/engine-components/webxr/XRFlag.d.ts +38 -38
- package/lib/engine-components/webxr/XRFlag.js +139 -139
- package/lib/engine-components/webxr/controllers/XRControllerFollow.d.ts +47 -47
- package/lib/engine-components/webxr/controllers/XRControllerFollow.js +120 -120
- package/lib/engine-components/webxr/controllers/XRControllerModel.d.ts +43 -43
- package/lib/engine-components/webxr/controllers/XRControllerModel.js +352 -352
- package/lib/engine-components/webxr/controllers/XRControllerMovement.d.ts +78 -78
- package/lib/engine-components/webxr/controllers/XRControllerMovement.js +506 -506
- package/lib/engine-components/webxr/index.d.ts +3 -3
- package/lib/engine-components/webxr/index.js +3 -3
- package/lib/engine-components/webxr/types.d.ts +3 -3
- package/lib/engine-components/webxr/types.js +1 -1
- package/lib/engine-components-experimental/Presentation.d.ts +6 -6
- package/lib/engine-components-experimental/Presentation.js +9 -9
- package/lib/engine-components-experimental/api.d.ts +4 -4
- package/lib/engine-components-experimental/api.js +4 -4
- package/lib/engine-components-experimental/networking/PlayerSync.d.ts +156 -156
- package/lib/engine-components-experimental/networking/PlayerSync.js +377 -377
- package/lib/engine-schemes/api.d.ts +12 -12
- package/lib/engine-schemes/api.js +12 -12
- package/lib/engine-schemes/schemes.d.ts +7 -7
- package/lib/engine-schemes/schemes.js +19 -19
- package/lib/engine-schemes/synced-camera-model.d.ts +25 -25
- package/lib/engine-schemes/synced-camera-model.js +67 -67
- package/lib/engine-schemes/synced-transform-model.d.ts +31 -31
- package/lib/engine-schemes/synced-transform-model.js +66 -66
- package/lib/engine-schemes/transform.d.ts +12 -12
- package/lib/engine-schemes/transform.js +39 -39
- package/lib/engine-schemes/vec2.d.ts +10 -10
- package/lib/engine-schemes/vec2.js +25 -25
- package/lib/engine-schemes/vec3.d.ts +11 -11
- package/lib/engine-schemes/vec3.js +29 -29
- package/lib/engine-schemes/vec4.d.ts +12 -12
- package/lib/engine-schemes/vec4.js +33 -33
- package/lib/engine-schemes/vr-user-state-buffer.d.ts +37 -37
- package/lib/engine-schemes/vr-user-state-buffer.js +110 -110
- package/lib/include/three/EXT_mesh_gpu_instancing_exporter.d.ts +6 -6
- package/lib/include/three/EXT_mesh_gpu_instancing_exporter.js +45 -45
- package/lib/needle-engine.d.ts +7 -7
- package/lib/needle-engine.js +64 -64
- package/package.json +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/logger.js +327 -327
- package/plugins/common/npm.js +15 -15
- package/plugins/common/timers.js +7 -7
- package/plugins/common/version.js +37 -37
- package/plugins/gltf-packer.mjs +1 -1
- package/plugins/next/alias.cjs +39 -39
- package/plugins/next/license.cjs +24 -24
- package/plugins/next/meshbvhworker.cjs +18 -18
- package/plugins/next/next.js +141 -141
- package/plugins/types/index.d.ts +2 -2
- package/plugins/types/license.d.ts +24 -24
- package/plugins/types/needleConfig.d.ts +27 -27
- package/plugins/types/next.d.ts +2 -2
- package/plugins/types/userconfig.d.ts +124 -124
- package/plugins/types/vite.d.ts +13 -13
- package/plugins/types/webmanifest.d.ts +32 -32
- package/plugins/vite/alias.js +189 -189
- package/plugins/vite/asap.js +251 -251
- package/plugins/vite/build-pipeline.js +371 -371
- package/plugins/vite/build.js +19 -19
- package/plugins/vite/buildinfo.js +41 -41
- package/plugins/vite/config.js +106 -106
- package/plugins/vite/copyfiles.js +138 -138
- package/plugins/vite/defines.js +70 -70
- package/plugins/vite/dependencies.js +232 -232
- package/plugins/vite/dependency-watcher.js +237 -237
- package/plugins/vite/drop-client.js +76 -76
- package/plugins/vite/drop.js +87 -87
- package/plugins/vite/editor-connection.js +124 -124
- package/plugins/vite/facebook-instant-games.js +102 -102
- package/plugins/vite/gzip.js +5 -5
- package/plugins/vite/imports-logger.js +143 -143
- package/plugins/vite/index.js +147 -147
- package/plugins/vite/license.js +56 -56
- package/plugins/vite/local-files.js +440 -440
- package/plugins/vite/logger.client.js +272 -272
- package/plugins/vite/logger.js +100 -100
- package/plugins/vite/materialx.js +31 -31
- package/plugins/vite/meta.js +163 -163
- package/plugins/vite/npm.js +7 -7
- package/plugins/vite/peer.js +29 -29
- package/plugins/vite/poster-client.js +73 -73
- package/plugins/vite/poster.js +79 -79
- package/plugins/vite/pwa.js +604 -604
- package/plugins/vite/reload-client.js +15 -15
- package/plugins/vite/reload.js +351 -351
- package/plugins/vite/server.js +66 -66
- package/plugins/vite/transform-codegen.js +55 -55
- package/plugins/vite/transform.js +32 -32
- package/plugins/vite/vite-4.4-hack.js +31 -31
- package/src/asap/needle-asap.ts +111 -111
- package/src/asap/sessiongranted.ts +75 -75
- package/src/asap/utils.ts +4 -4
- package/src/engine/analytics/index.ts +10 -10
- package/src/engine/analytics/lcp.ts +35 -35
- package/src/engine/api.ts +82 -82
- package/src/engine/assets/index.ts +59 -59
- package/src/engine/assets/static.js +5 -5
- package/src/engine/codegen/register_types.ts +300 -300
- package/src/engine/debug/debug.ts +51 -51
- package/src/engine/debug/debug_console.ts +333 -333
- package/src/engine/debug/debug_overlay.ts +332 -332
- package/src/engine/debug/debug_spatial_console.ts +429 -429
- package/src/engine/debug/index.ts +1 -1
- package/src/engine/engine_addressables.ts +671 -671
- package/src/engine/engine_animation.ts +145 -145
- package/src/engine/engine_application.ts +113 -113
- package/src/engine/engine_assetdatabase.ts +389 -389
- package/src/engine/engine_audio.ts +24 -24
- package/src/engine/engine_camera.ts +39 -39
- package/src/engine/engine_components.ts +366 -366
- package/src/engine/engine_components_internal.ts +40 -40
- package/src/engine/engine_constants.ts +52 -52
- package/src/engine/engine_context.ts +1824 -1824
- package/src/engine/engine_context_registry.ts +129 -129
- package/src/engine/engine_coroutine.ts +54 -54
- package/src/engine/engine_create_objects.ts +411 -411
- package/src/engine/engine_default_parameters.ts +3 -3
- package/src/engine/engine_editor-sync.ts +28 -28
- package/src/engine/engine_fileloader.js +9 -9
- package/src/engine/engine_gameobject.ts +712 -712
- package/src/engine/engine_generic_utils.js +13 -13
- package/src/engine/engine_gizmos.ts +577 -577
- package/src/engine/engine_gltf.ts +29 -29
- package/src/engine/engine_gltf_builtin_components.ts +403 -403
- package/src/engine/engine_hot_reload.ts +210 -210
- package/src/engine/engine_input.ts +1500 -1500
- package/src/engine/engine_input_utils.ts +23 -23
- package/src/engine/engine_instancing.ts +45 -45
- package/src/engine/engine_license.ts +386 -386
- package/src/engine/engine_lifecycle_api.ts +113 -113
- package/src/engine/engine_lifecycle_functions_internal.ts +193 -193
- package/src/engine/engine_lightdata.ts +125 -125
- package/src/engine/engine_loaders.callbacks.ts +136 -136
- package/src/engine/engine_loaders.gltf.ts +82 -82
- package/src/engine/engine_loaders.ts +378 -378
- package/src/engine/engine_lods.ts +186 -186
- package/src/engine/engine_mainloop_utils.ts +472 -472
- package/src/engine/engine_math.ts +282 -282
- package/src/engine/engine_modules.ts +83 -83
- package/src/engine/engine_networking.ts +862 -862
- package/src/engine/engine_networking_auto.ts +352 -352
- package/src/engine/engine_networking_blob.ts +275 -275
- package/src/engine/engine_networking_files.ts +217 -217
- package/src/engine/engine_networking_files_default_components.ts +58 -58
- package/src/engine/engine_networking_instantiate.ts +419 -419
- package/src/engine/engine_networking_peer.ts +159 -159
- package/src/engine/engine_networking_streams.ts +713 -713
- package/src/engine/engine_networking_types.ts +24 -24
- package/src/engine/engine_networking_utils.ts +23 -23
- package/src/engine/engine_networking_websocket.ts +2 -2
- package/src/engine/engine_patcher.ts +199 -199
- package/src/engine/engine_physics.ts +783 -783
- package/src/engine/engine_physics.types.ts +46 -46
- package/src/engine/engine_physics_rapier.ts +1577 -1577
- package/src/engine/engine_playerview.ts +80 -80
- package/src/engine/engine_scenelighting.ts +294 -294
- package/src/engine/engine_serialization.ts +2 -2
- package/src/engine/engine_serialization_builtin_serializer.ts +473 -473
- package/src/engine/engine_serialization_core.ts +720 -720
- package/src/engine/engine_serialization_decorator.ts +80 -80
- package/src/engine/engine_setup.ts +1 -1
- package/src/engine/engine_shaders.ts +267 -267
- package/src/engine/engine_shims.ts +32 -32
- package/src/engine/engine_test_utils.ts +109 -109
- package/src/engine/engine_texture.ts +82 -82
- package/src/engine/engine_three_utils.ts +928 -928
- package/src/engine/engine_time.ts +94 -94
- package/src/engine/engine_time_utils.ts +237 -237
- package/src/engine/engine_tonemapping.ts +208 -208
- package/src/engine/engine_types.ts +730 -730
- package/src/engine/engine_typestore.ts +63 -63
- package/src/engine/engine_util_decorator.ts +136 -136
- package/src/engine/engine_utils.ts +1115 -1115
- package/src/engine/engine_utils_format.ts +273 -273
- package/src/engine/engine_utils_screenshot.ts +708 -708
- package/src/engine/engine_utils_screenshot.xr.ts +103 -103
- package/src/engine/export/gltf/Writers.ts +34 -34
- package/src/engine/export/gltf/index.ts +158 -158
- package/src/engine/export/index.ts +2 -2
- package/src/engine/export/state.ts +19 -19
- package/src/engine/export/utils.ts +9 -9
- package/src/engine/extensions/EXT_texture_exr.ts +50 -50
- package/src/engine/extensions/NEEDLE_animator_controller_model.ts +195 -195
- package/src/engine/extensions/NEEDLE_components.ts +268 -268
- package/src/engine/extensions/NEEDLE_gameobject_data.ts +81 -81
- package/src/engine/extensions/NEEDLE_lighting_settings.ts +185 -185
- package/src/engine/extensions/NEEDLE_lightmaps.ts +119 -119
- package/src/engine/extensions/NEEDLE_persistent_assets.ts +76 -76
- package/src/engine/extensions/NEEDLE_render_objects.ts +209 -209
- package/src/engine/extensions/NEEDLE_techniques_webgl.ts +640 -640
- package/src/engine/extensions/extension_resolver.ts +4 -4
- package/src/engine/extensions/extension_utils.ts +166 -166
- package/src/engine/extensions/extensions.ts +140 -140
- package/src/engine/extensions/index.ts +5 -5
- package/src/engine/extensions/usage_tracker.ts +100 -100
- package/src/engine/js-extensions/Camera.ts +37 -37
- package/src/engine/js-extensions/ExtensionUtils.ts +85 -85
- package/src/engine/js-extensions/Layers.ts +23 -23
- package/src/engine/js-extensions/Object3D.ts +296 -296
- package/src/engine/js-extensions/RGBAColor.ts +126 -126
- package/src/engine/js-extensions/Vector.ts +18 -18
- package/src/engine/js-extensions/index.ts +4 -4
- package/src/engine/physics/workers/mesh-bvh/GenerateMeshBVHWorker.js +125 -125
- package/src/engine/shaders/shaderData.ts +67 -67
- package/src/engine/tests/test_utils.ts +63 -63
- package/src/engine/webcomponents/WebXRButtons.ts +260 -260
- package/src/engine/webcomponents/api.ts +6 -6
- package/src/engine/webcomponents/buttons.ts +292 -292
- package/src/engine/webcomponents/fonts.ts +41 -41
- package/src/engine/webcomponents/icons.ts +57 -57
- package/src/engine/webcomponents/index.ts +1 -1
- package/src/engine/webcomponents/logo-element.ts +78 -78
- package/src/engine/webcomponents/needle menu/needle-menu-spatial.ts +573 -573
- package/src/engine/webcomponents/needle menu/needle-menu.ts +1118 -1118
- package/src/engine/webcomponents/needle-button.ts +181 -181
- package/src/engine/webcomponents/needle-engine.ar-overlay.ts +186 -186
- package/src/engine/webcomponents/needle-engine.attributes.ts +82 -82
- package/src/engine/webcomponents/needle-engine.extras.ts +16 -16
- package/src/engine/webcomponents/needle-engine.loading.ts +373 -373
- package/src/engine/webcomponents/needle-engine.ts +860 -860
- package/src/engine/xr/NeedleXRController.ts +1125 -1125
- package/src/engine/xr/NeedleXRSession.ts +1624 -1624
- package/src/engine/xr/NeedleXRSync.ts +220 -220
- package/src/engine/xr/SceneTransition.ts +78 -78
- package/src/engine/xr/TempXRContext.ts +216 -216
- package/src/engine/xr/XRRig.ts +9 -9
- package/src/engine/xr/api.ts +5 -5
- package/src/engine/xr/events.ts +102 -102
- package/src/engine/xr/internal.ts +34 -34
- package/src/engine/xr/usdz.ts +30 -30
- package/src/engine/xr/utils.ts +39 -39
- package/src/engine-components/AlignmentConstraint.ts +36 -36
- package/src/engine-components/Animation.ts +557 -557
- package/src/engine-components/AnimationCurve.ts +150 -150
- package/src/engine-components/AnimationUtils.ts +28 -28
- package/src/engine-components/AnimationUtilsAutoplay.ts +43 -43
- package/src/engine-components/Animator.ts +397 -397
- package/src/engine-components/AnimatorController.ts +1293 -1293
- package/src/engine-components/AudioListener.ts +92 -92
- package/src/engine-components/AudioSource.ts +644 -644
- package/src/engine-components/AvatarLoader.ts +263 -263
- package/src/engine-components/AxesHelper.ts +59 -59
- package/src/engine-components/BasicIKConstraint.ts +54 -54
- package/src/engine-components/BoxCollider.ts +1 -1
- package/src/engine-components/BoxHelperComponent.ts +114 -114
- package/src/engine-components/Camera.ts +719 -719
- package/src/engine-components/CameraUtils.ts +138 -138
- package/src/engine-components/CharacterController.ts +253 -253
- package/src/engine-components/Collider.ts +374 -374
- package/src/engine-components/Component.ts +1297 -1297
- package/src/engine-components/ContactShadows.ts +506 -506
- package/src/engine-components/DeleteBox.ts +62 -62
- package/src/engine-components/DeviceFlag.ts +46 -46
- package/src/engine-components/DragControls.ts +1623 -1623
- package/src/engine-components/DropListener.ts +713 -713
- package/src/engine-components/Duplicatable.ts +198 -198
- package/src/engine-components/EventList.ts +266 -266
- package/src/engine-components/EventTrigger.ts +74 -74
- package/src/engine-components/EventType.ts +22 -22
- package/src/engine-components/Fog.ts +60 -60
- package/src/engine-components/Gizmos.ts +56 -56
- package/src/engine-components/GridHelper.ts +48 -48
- package/src/engine-components/GroundProjection.ts +356 -356
- package/src/engine-components/Interactable.ts +14 -14
- package/src/engine-components/Joints.ts +52 -52
- package/src/engine-components/LODGroup.ts +153 -153
- package/src/engine-components/Light.ts +558 -558
- package/src/engine-components/LookAtConstraint.ts +25 -25
- package/src/engine-components/NeedleMenu.ts +84 -84
- package/src/engine-components/NestedGltf.ts +86 -86
- package/src/engine-components/Networking.ts +114 -114
- package/src/engine-components/OffsetConstraint.ts +60 -60
- package/src/engine-components/OrbitControls.ts +1074 -1074
- package/src/engine-components/PlayerColor.ts +103 -103
- package/src/engine-components/ReflectionProbe.ts +220 -220
- package/src/engine-components/Renderer.ts +903 -903
- package/src/engine-components/RendererInstancing.ts +855 -855
- package/src/engine-components/RendererLightmap.ts +198 -198
- package/src/engine-components/RigidBody.ts +526 -526
- package/src/engine-components/SceneSwitcher.ts +1030 -1030
- package/src/engine-components/ScreenCapture.ts +592 -592
- package/src/engine-components/ShadowCatcher.ts +172 -172
- package/src/engine-components/Skybox.ts +475 -475
- package/src/engine-components/SmoothFollow.ts +76 -76
- package/src/engine-components/SpatialTrigger.ts +229 -229
- package/src/engine-components/SpectatorCamera.ts +787 -787
- package/src/engine-components/SphereCollider.ts +1 -1
- package/src/engine-components/SpriteRenderer.ts +468 -468
- package/src/engine-components/SyncedCamera.ts +220 -220
- package/src/engine-components/SyncedRoom.ts +380 -380
- package/src/engine-components/SyncedTransform.ts +383 -383
- package/src/engine-components/TestRunner.ts +118 -118
- package/src/engine-components/TransformGizmo.ts +219 -219
- package/src/engine-components/VideoPlayer.ts +1025 -1025
- package/src/engine-components/Voip.ts +363 -363
- package/src/engine-components/api.ts +60 -60
- package/src/engine-components/avatar/AvatarBlink_Simple.ts +69 -69
- package/src/engine-components/avatar/AvatarEyeLook_Rotation.ts +63 -63
- package/src/engine-components/avatar/Avatar_Brain_LookAt.ts +139 -139
- package/src/engine-components/avatar/Avatar_MouthShapes.ts +83 -83
- package/src/engine-components/avatar/Avatar_MustacheShake.ts +31 -31
- package/src/engine-components/codegen/components.ts +217 -217
- package/src/engine-components/debug/LogStats.ts +21 -21
- package/src/engine-components/export/gltf/GltfExport.ts +265 -265
- package/src/engine-components/export/usdz/Extension.ts +24 -24
- package/src/engine-components/export/usdz/ThreeUSDZExporter.ts +2426 -2426
- package/src/engine-components/export/usdz/USDZExporter.ts +705 -705
- package/src/engine-components/export/usdz/extensions/Animation.ts +1204 -1204
- package/src/engine-components/export/usdz/extensions/DocumentExtension.ts +9 -9
- package/src/engine-components/export/usdz/extensions/NodeMaterialConverter.ts +532 -532
- package/src/engine-components/export/usdz/extensions/USDZText.ts +240 -240
- package/src/engine-components/export/usdz/extensions/USDZUI.ts +189 -189
- package/src/engine-components/export/usdz/extensions/behavior/Actions.ts +99 -99
- package/src/engine-components/export/usdz/extensions/behavior/AudioExtension.ts +102 -102
- package/src/engine-components/export/usdz/extensions/behavior/Behaviour.ts +320 -320
- package/src/engine-components/export/usdz/extensions/behavior/BehaviourComponents.ts +1225 -1225
- package/src/engine-components/export/usdz/extensions/behavior/BehavioursBuilder.ts +646 -646
- package/src/engine-components/export/usdz/extensions/behavior/PhysicsExtension.ts +132 -132
- package/src/engine-components/export/usdz/index.ts +2 -2
- package/src/engine-components/export/usdz/utils/animationutils.ts +191 -191
- package/src/engine-components/export/usdz/utils/quicklook.ts +50 -50
- package/src/engine-components/particlesystem/ParticleSystem.ts +1287 -1287
- package/src/engine-components/particlesystem/ParticleSystemModules.ts +1765 -1765
- package/src/engine-components/particlesystem/ParticleSystemSubEmitter.ts +111 -111
- package/src/engine-components/particlesystem/api.ts +1 -1
- package/src/engine-components/postprocessing/Effects/Antialiasing.ts +64 -64
- package/src/engine-components/postprocessing/Effects/BloomEffect.ts +116 -116
- package/src/engine-components/postprocessing/Effects/ChromaticAberration.ts +37 -37
- package/src/engine-components/postprocessing/Effects/ColorAdjustments.ts +106 -106
- package/src/engine-components/postprocessing/Effects/DepthOfField.ts +103 -103
- package/src/engine-components/postprocessing/Effects/EffectWrapper.ts +25 -25
- package/src/engine-components/postprocessing/Effects/Pixelation.ts +32 -32
- package/src/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusion.ts +90 -90
- package/src/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.ts +192 -192
- package/src/engine-components/postprocessing/Effects/Sharpening.ts +143 -143
- package/src/engine-components/postprocessing/Effects/TiltShiftEffect.ts +61 -61
- package/src/engine-components/postprocessing/Effects/Tonemapping.ts +103 -103
- package/src/engine-components/postprocessing/Effects/Tonemapping.utils.ts +60 -60
- package/src/engine-components/postprocessing/Effects/Vignette.ts +59 -59
- package/src/engine-components/postprocessing/PostProcessingEffect.ts +192 -192
- package/src/engine-components/postprocessing/PostProcessingHandler.ts +572 -572
- package/src/engine-components/postprocessing/Volume.ts +426 -426
- package/src/engine-components/postprocessing/VolumeParameter.ts +158 -158
- package/src/engine-components/postprocessing/VolumeProfile.ts +61 -61
- package/src/engine-components/postprocessing/index.ts +5 -5
- package/src/engine-components/postprocessing/utils.ts +154 -154
- package/src/engine-components/timeline/PlayableDirector.ts +722 -722
- package/src/engine-components/timeline/SignalAsset.ts +144 -144
- package/src/engine-components/timeline/TimelineModels.ts +92 -92
- package/src/engine-components/timeline/TimelineTracks.ts +967 -967
- package/src/engine-components/timeline/index.ts +3 -3
- package/src/engine-components/ui/BaseUIComponent.ts +203 -203
- package/src/engine-components/ui/Button.ts +307 -307
- package/src/engine-components/ui/Canvas.ts +419 -419
- package/src/engine-components/ui/CanvasGroup.ts +54 -54
- package/src/engine-components/ui/EventSystem.ts +854 -854
- package/src/engine-components/ui/Graphic.ts +275 -275
- package/src/engine-components/ui/Image.ts +112 -112
- package/src/engine-components/ui/InputField.ts +321 -321
- package/src/engine-components/ui/Interfaces.ts +57 -57
- package/src/engine-components/ui/Layout.ts +334 -334
- package/src/engine-components/ui/Outline.ts +13 -13
- package/src/engine-components/ui/PointerEvents.ts +206 -206
- package/src/engine-components/ui/RaycastUtils.ts +69 -69
- package/src/engine-components/ui/Raycaster.ts +102 -102
- package/src/engine-components/ui/RectTransform.ts +375 -375
- package/src/engine-components/ui/SpatialHtml.ts +79 -79
- package/src/engine-components/ui/Symbols.ts +1 -1
- package/src/engine-components/ui/Text.ts +578 -578
- package/src/engine-components/ui/Utils.ts +113 -113
- package/src/engine-components/utils/EnvironmentScene.ts +245 -245
- package/src/engine-components/utils/LookAt.ts +88 -88
- package/src/engine-components/utils/OpenURL.ts +114 -114
- package/src/engine-components/webxr/Avatar.ts +265 -265
- package/src/engine-components/webxr/TeleportTarget.ts +9 -9
- package/src/engine-components/webxr/WebARCameraBackground.ts +175 -175
- package/src/engine-components/webxr/WebARSessionRoot.ts +880 -880
- package/src/engine-components/webxr/WebXR.ts +585 -585
- package/src/engine-components/webxr/WebXRAvatar.ts +66 -66
- package/src/engine-components/webxr/WebXRImageTracking.ts +519 -519
- package/src/engine-components/webxr/WebXRPlaneTracking.ts +570 -570
- package/src/engine-components/webxr/WebXRRig.ts +77 -77
- package/src/engine-components/webxr/XRFlag.ts +147 -147
- package/src/engine-components/webxr/controllers/XRControllerFollow.ts +118 -118
- package/src/engine-components/webxr/controllers/XRControllerModel.ts +373 -373
- package/src/engine-components/webxr/controllers/XRControllerMovement.ts +550 -550
- package/src/engine-components/webxr/index.ts +2 -2
- package/src/engine-components/webxr/types.ts +3 -3
- package/src/engine-components-experimental/Presentation.ts +12 -12
- package/src/engine-components-experimental/api.ts +4 -4
- package/src/engine-components-experimental/networking/PlayerSync.ts +401 -401
- package/src/engine-schemes/COMPILE_SCHEMES.bat +3 -3
- package/src/engine-schemes/COMPILE_TS.bat +11 -11
- package/src/engine-schemes/README.md +1 -1
- package/src/engine-schemes/api.ts +12 -12
- package/src/engine-schemes/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/gltf-progressive-60Qk5ebF.min.js +0 -8
- package/dist/gltf-progressive-DM5ZiecW.js +0 -1060
- package/dist/gltf-progressive-wxtaVmio.umd.cjs +0 -8
|
@@ -1,861 +1,861 @@
|
|
|
1
|
-
import { isDevEnvironment, showBalloonWarning } from "../debug/index.js";
|
|
2
|
-
import { PUBLIC_KEY, VERSION } from "../engine_constants.js";
|
|
3
|
-
import { registerLoader } from "../engine_gltf.js";
|
|
4
|
-
import { hasCommercialLicense } from "../engine_license.js";
|
|
5
|
-
import { setDracoDecoderPath, setDracoDecoderType, setKtx2TranscoderPath } from "../engine_loaders.gltf.js";
|
|
6
|
-
import { NeedleLoader } from "../engine_loaders.js";
|
|
7
|
-
import { Context, ContextCreateArgs } from "../engine_setup.js";
|
|
8
|
-
import { nameToThreeTonemapping } from "../engine_tonemapping.js";
|
|
9
|
-
import { type INeedleEngineComponent, type LoadedModel } from "../engine_types.js";
|
|
10
|
-
import { getParam } from "../engine_utils.js";
|
|
11
|
-
import { RGBAColor } from "../js-extensions/RGBAColor.js";
|
|
12
|
-
import { ensureFonts } from "./fonts.js";
|
|
13
|
-
import { arContainerClassName, AROverlayHandler } from "./needle-engine.ar-overlay.js";
|
|
14
|
-
import { NeedleEngineAttributes, TonemappingAttributeOptions } from "./needle-engine.attributes.js";
|
|
15
|
-
import { calculateProgress01, EngineLoadingView, type ILoadingViewHandler } from "./needle-engine.loading.js";
|
|
16
|
-
|
|
17
|
-
// registering loader here too to make sure it's imported when using engine via vanilla js
|
|
18
|
-
registerLoader(NeedleLoader);
|
|
19
|
-
|
|
20
|
-
const debug = getParam("debugwebcomponent");
|
|
21
|
-
|
|
22
|
-
const htmlTagName = "needle-engine";
|
|
23
|
-
const vrContainerClassName = "vr";
|
|
24
|
-
const desktopContainerClassname = "desktop";
|
|
25
|
-
const knownClasses = [arContainerClassName, vrContainerClassName, desktopContainerClassname];
|
|
26
|
-
const arSessionActiveClassName = "ar-session-active";
|
|
27
|
-
const desktopSessionActiveClassName = "desktop-session-active";
|
|
28
|
-
|
|
29
|
-
const observedAttributes = [
|
|
30
|
-
"public-key",
|
|
31
|
-
"version",
|
|
32
|
-
|
|
33
|
-
"hash",
|
|
34
|
-
"src",
|
|
35
|
-
"camera-controls",
|
|
36
|
-
"loadstart",
|
|
37
|
-
"progress",
|
|
38
|
-
"loadfinished",
|
|
39
|
-
"dracoDecoderPath",
|
|
40
|
-
"dracoDecoderType",
|
|
41
|
-
"ktx2DecoderPath",
|
|
42
|
-
"tone-mapping",
|
|
43
|
-
"tone-mapping-exposure",
|
|
44
|
-
"background-blurriness",
|
|
45
|
-
"background-color",
|
|
46
|
-
]
|
|
47
|
-
|
|
48
|
-
// https://developers.google.com/web/fundamentals/web-components/customelements
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* <needle-engine> web component. See {@link NeedleEngineAttributes} attributes for supported attributes
|
|
52
|
-
* The needle engine web component creates and manages a needle engine context which is responsible for rendering a 3D scene using threejs.
|
|
53
|
-
* The needle engine context is created when the src attribute is set and disposed when the needle engine is removed from the document (you can prevent this by setting the keep-alive attribute to true).
|
|
54
|
-
* The needle engine context is accessible via the context property on the needle engine element (e.g. document.querySelector("needle-engine").context).
|
|
55
|
-
* @link https://engine.needle.tools/docs/reference/needle-engine-attributes
|
|
56
|
-
*
|
|
57
|
-
* @example
|
|
58
|
-
* <needle-engine src="https://example.com/scene.glb"></needle-engine>
|
|
59
|
-
* @example
|
|
60
|
-
* <needle-engine src="https://example.com/scene.glb" camera-controls="false"></needle-engine>
|
|
61
|
-
*/
|
|
62
|
-
export class NeedleEngineWebComponent extends HTMLElement implements INeedleEngineComponent {
|
|
63
|
-
|
|
64
|
-
static get observedAttributes() {
|
|
65
|
-
return observedAttributes
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
public get loadingProgress01(): number { return this._loadingProgress01; }
|
|
69
|
-
public get loadingFinished(): boolean { return this.loadingProgress01 > .999; }
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* If set to false the camera controls are disabled. Default is true.
|
|
73
|
-
* @type {boolean | null}
|
|
74
|
-
* @memberof NeedleEngineAttributes
|
|
75
|
-
* @example
|
|
76
|
-
* <needle-engine camera-controls="false"></needle-engine>
|
|
77
|
-
* @example
|
|
78
|
-
* <needle-engine camera-controls="true"></needle-engine>
|
|
79
|
-
* @example
|
|
80
|
-
* <needle-engine camera-controls></needle-engine>
|
|
81
|
-
* @example
|
|
82
|
-
* <needle-engine></needle-engine>
|
|
83
|
-
* @returns {boolean | null} if the attribute is not set it returns null
|
|
84
|
-
*/
|
|
85
|
-
public get cameraControls(): boolean | null {
|
|
86
|
-
const attr = this.getAttribute("camera-controls") as NeedleEngineAttributes["camera-controls"] | ({} & string)
|
|
87
|
-
if (attr == null) return null;
|
|
88
|
-
if (attr === null || attr === "False" || attr === "false" || attr === "0" || attr === "none") return false;
|
|
89
|
-
return true;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
/**
|
|
93
|
-
* Get the current context for this web component instance. The context is created when the src attribute is set and the loading has finished.
|
|
94
|
-
* The context is disposed when the needle engine is removed from the document (you can prevent this by setting the keep-alive attribute to true).
|
|
95
|
-
* @returns {Promise<Context>} a promise that resolves to the context when the loading has finished
|
|
96
|
-
*/
|
|
97
|
-
public getContext(): Promise<Context> {
|
|
98
|
-
return new Promise((res, _rej) => {
|
|
99
|
-
if (this._context && this.loadingFinished) {
|
|
100
|
-
res(this._context);
|
|
101
|
-
}
|
|
102
|
-
else {
|
|
103
|
-
const cb = () => {
|
|
104
|
-
this.removeEventListener("loadfinished", cb);
|
|
105
|
-
if (this._context && this.loadingFinished) {
|
|
106
|
-
res(this._context);
|
|
107
|
-
}
|
|
108
|
-
};
|
|
109
|
-
this.addEventListener("loadfinished", cb);
|
|
110
|
-
}
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
/**
|
|
115
|
-
* Get the context that is created when the src attribute is set and the loading has finished.
|
|
116
|
-
*/
|
|
117
|
-
public get context() { return this._context; }
|
|
118
|
-
|
|
119
|
-
private _context: Context;
|
|
120
|
-
private _overlay_ar: AROverlayHandler;
|
|
121
|
-
private _loadingProgress01: number = 0;
|
|
122
|
-
private _loadingView?: ILoadingViewHandler;
|
|
123
|
-
private _previousSrc: string | null | string[] = null;
|
|
124
|
-
/** set to true after <needle-engine> did load completely at least once. Set to false when <needle-engine> is removed from the document */
|
|
125
|
-
private _didFullyLoad: boolean = false;
|
|
126
|
-
|
|
127
|
-
constructor() {
|
|
128
|
-
super();
|
|
129
|
-
this._overlay_ar = new AROverlayHandler();
|
|
130
|
-
// TODO: do we want to rename this event?
|
|
131
|
-
this.addEventListener("ready", this.onReady);
|
|
132
|
-
|
|
133
|
-
ensureFonts();
|
|
134
|
-
|
|
135
|
-
this.attachShadow({ mode: 'open' });
|
|
136
|
-
const template = document.createElement('template');
|
|
137
|
-
template.innerHTML = `<style>
|
|
138
|
-
@import url('https://fonts.googleapis.com/css2?family=Roboto+Flex:opsz,wght@8..144,100..1000&display=swap');
|
|
139
|
-
|
|
140
|
-
:host {
|
|
141
|
-
position: absolute;
|
|
142
|
-
display: block;
|
|
143
|
-
width: max(600px, 100%);
|
|
144
|
-
height: max(300px, 100%);
|
|
145
|
-
touch-action: none;
|
|
146
|
-
|
|
147
|
-
-webkit-tap-highlight-color: transparent;
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
@media (max-width: 600px) {
|
|
151
|
-
:host {
|
|
152
|
-
width: 100%;
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
@media (max-height: 300px) {
|
|
156
|
-
:host {
|
|
157
|
-
height: 100%;
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
:host > div.canvas-wrapper {
|
|
162
|
-
width: 100%;
|
|
163
|
-
height: 100%;
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
:host canvas {
|
|
167
|
-
position: absolute;
|
|
168
|
-
user-select: none;
|
|
169
|
-
-webkit-user-select: none;
|
|
170
|
-
|
|
171
|
-
/** allow touch panning but no pinch zoom **/
|
|
172
|
-
/** but this doesnt work yet:
|
|
173
|
-
* touch-action: pan-x, pan-y;
|
|
174
|
-
**/
|
|
175
|
-
|
|
176
|
-
-webkit-touch-callout: none;
|
|
177
|
-
-webkit-user-drag: none;
|
|
178
|
-
-webkit-user-modify: none;
|
|
179
|
-
|
|
180
|
-
left: 0;
|
|
181
|
-
top: 0;
|
|
182
|
-
}
|
|
183
|
-
:host .content {
|
|
184
|
-
position: absolute;
|
|
185
|
-
top: 0;
|
|
186
|
-
width: 100%;
|
|
187
|
-
height: 100%;
|
|
188
|
-
visibility: visible;
|
|
189
|
-
z-index: 500; /* < must be less than the webxr buttons element */
|
|
190
|
-
pointer-events: none;
|
|
191
|
-
}
|
|
192
|
-
:host .overlay-content {
|
|
193
|
-
position: absolute;
|
|
194
|
-
user-select: auto;
|
|
195
|
-
pointer-events: all;
|
|
196
|
-
}
|
|
197
|
-
:host slot[name="quit-ar"]:hover {
|
|
198
|
-
cursor: pointer;
|
|
199
|
-
}
|
|
200
|
-
:host .quit-ar-button {
|
|
201
|
-
position: absolute;
|
|
202
|
-
// top: env(titlebar-area-y); /** this doesnt work **/
|
|
203
|
-
top: 60px; /** camera access needs a bit more space **/
|
|
204
|
-
right: 20px;
|
|
205
|
-
z-index: 9999;
|
|
206
|
-
}
|
|
207
|
-
</style>
|
|
208
|
-
<div class="canvas-wrapper"> <!-- this wrapper is necessary for WebXR https://github.com/meta-quest/immersive-web-emulator/issues/55 -->
|
|
209
|
-
<canvas></canvas>
|
|
210
|
-
</div>
|
|
211
|
-
<div class="content">
|
|
212
|
-
<slot class="overlay-content"></slot>
|
|
213
|
-
</div>
|
|
214
|
-
`;
|
|
215
|
-
|
|
216
|
-
if (this.shadowRoot)
|
|
217
|
-
this.shadowRoot.appendChild(template.content.cloneNode(true));
|
|
218
|
-
|
|
219
|
-
this._context = new Context({ domElement: this });
|
|
220
|
-
this.addEventListener("error", this.onError);
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
/**
|
|
225
|
-
* @internal
|
|
226
|
-
*/
|
|
227
|
-
async connectedCallback() {
|
|
228
|
-
if (debug) {
|
|
229
|
-
console.log("<needle-engine> connected");
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
this.setPublicKey();
|
|
233
|
-
this.setVersion();
|
|
234
|
-
|
|
235
|
-
this.addEventListener("xr-session-started", this.onXRSessionStarted);
|
|
236
|
-
this.onSetupDesktop();
|
|
237
|
-
|
|
238
|
-
if (!this.getAttribute("src")) {
|
|
239
|
-
const global = globalThis["needle:codegen_files"] as unknown as string;
|
|
240
|
-
if (debug) console.log("src is null, trying to load from globalThis[\"needle:codegen_files\"]", global);
|
|
241
|
-
if (global) {
|
|
242
|
-
if (debug) console.log("globalThis[\"needle:codegen_files\"]", global);
|
|
243
|
-
this.setAttribute("src", global);
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
if (debug) console.log("src", this.getAttribute("src"));
|
|
248
|
-
|
|
249
|
-
// we have to wait because codegen does set the src attribute when it's loaded
|
|
250
|
-
// which might happen after the element is connected
|
|
251
|
-
// if the `src` is then still null we want to initialize the default scene
|
|
252
|
-
const loadId = this._loadId;
|
|
253
|
-
setTimeout(() => {
|
|
254
|
-
if (this.isConnected === false) return;
|
|
255
|
-
if (loadId !== this._loadId) return;
|
|
256
|
-
this.onLoad();
|
|
257
|
-
}, 1);
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
/**
|
|
261
|
-
* @internal
|
|
262
|
-
*/
|
|
263
|
-
disconnectedCallback() {
|
|
264
|
-
this.removeEventListener("xr-session-started", this.onXRSessionStarted);
|
|
265
|
-
|
|
266
|
-
this._didFullyLoad = false;
|
|
267
|
-
const keepAlive = this.getAttribute("keep-alive");
|
|
268
|
-
const dispose = keepAlive == undefined || (keepAlive?.length > 0 && keepAlive !== "true" && keepAlive !== "1");
|
|
269
|
-
if (debug) console.warn("<needle-engine> disconnected, keep-alive: \"" + keepAlive + "\"", typeof keepAlive, "Dispose=", dispose);
|
|
270
|
-
if (dispose) {
|
|
271
|
-
if (debug)
|
|
272
|
-
console.warn("<needle-engine> dispose");
|
|
273
|
-
this._context?.dispose();
|
|
274
|
-
this._context = null!;
|
|
275
|
-
this._lastSourceFiles = null;
|
|
276
|
-
this._loadId += 1;
|
|
277
|
-
}
|
|
278
|
-
else {
|
|
279
|
-
if (debug) console.warn("<needle-engine> is not disposed because keep-alive is set");
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
/**
|
|
284
|
-
* @internal
|
|
285
|
-
*/
|
|
286
|
-
attributeChangedCallback(name: string, oldValue: string, newValue: string) {
|
|
287
|
-
if (debug) console.log("attributeChangedCallback", name, oldValue, newValue);
|
|
288
|
-
switch (name) {
|
|
289
|
-
case "src":
|
|
290
|
-
if (debug) console.warn("<needle-engine src>\nchanged from \"", oldValue, "\" to \"", newValue, "\"")
|
|
291
|
-
this.onLoad();
|
|
292
|
-
// this._watcher?.onSourceChanged(newValue);
|
|
293
|
-
break;
|
|
294
|
-
case "hash":
|
|
295
|
-
if (this._context) {
|
|
296
|
-
this._context.hash = newValue;
|
|
297
|
-
}
|
|
298
|
-
break;
|
|
299
|
-
case "loadstart":
|
|
300
|
-
case "progress":
|
|
301
|
-
case "loadfinished":
|
|
302
|
-
if (typeof newValue === "string" && newValue.length > 0) {
|
|
303
|
-
if (debug) console.log(name + " attribute changed", newValue);
|
|
304
|
-
this.registerEventFromAttribute(name, newValue);
|
|
305
|
-
}
|
|
306
|
-
break;
|
|
307
|
-
case "dracoDecoderPath":
|
|
308
|
-
if (debug) console.log("dracoDecoderPath", newValue);
|
|
309
|
-
setDracoDecoderPath(newValue);
|
|
310
|
-
break;
|
|
311
|
-
case "dracoDecoderType":
|
|
312
|
-
if (newValue === "wasm" || newValue === "js") {
|
|
313
|
-
if (debug) console.log("dracoDecoderType", newValue);
|
|
314
|
-
setDracoDecoderType(newValue);
|
|
315
|
-
}
|
|
316
|
-
else console.error("Invalid dracoDecoderType", newValue, "expected js or wasm");
|
|
317
|
-
break;
|
|
318
|
-
case "ktx2DecoderPath":
|
|
319
|
-
if (debug) console.log("ktx2DecoderPath", newValue);
|
|
320
|
-
setKtx2TranscoderPath(newValue);
|
|
321
|
-
break;
|
|
322
|
-
case "tone-mapping": {
|
|
323
|
-
this.applyAttributes();
|
|
324
|
-
break;
|
|
325
|
-
}
|
|
326
|
-
case "tone-mapping-exposure": {
|
|
327
|
-
this.applyAttributes();
|
|
328
|
-
break;
|
|
329
|
-
}
|
|
330
|
-
case "background-blurriness": {
|
|
331
|
-
const value = parseFloat(newValue);
|
|
332
|
-
if (value != undefined && this._context) {
|
|
333
|
-
this._context.scene.backgroundBlurriness = value;
|
|
334
|
-
}
|
|
335
|
-
break;
|
|
336
|
-
}
|
|
337
|
-
case "background-color": {
|
|
338
|
-
this.applyAttributes();
|
|
339
|
-
break;
|
|
340
|
-
}
|
|
341
|
-
case "public-key": {
|
|
342
|
-
if (newValue != PUBLIC_KEY)
|
|
343
|
-
this.setPublicKey();
|
|
344
|
-
break;
|
|
345
|
-
}
|
|
346
|
-
case "version": {
|
|
347
|
-
if (newValue != VERSION)
|
|
348
|
-
this.setVersion();
|
|
349
|
-
break;
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
/** The tonemapping setting configured as an attribute on the <needle-engine> component */
|
|
355
|
-
get toneMapping(): TonemappingAttributeOptions | null | undefined {
|
|
356
|
-
const attribute = (this.getAttribute("tonemapping") || this.getAttribute("tone-mapping")) as TonemappingAttributeOptions | null | undefined;
|
|
357
|
-
return attribute;
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
private _loadId: number = 0;
|
|
361
|
-
private _abortController: AbortController | null = null;
|
|
362
|
-
private _lastSourceFiles: Array<string> | null = null;
|
|
363
|
-
private _createContextPromise: Promise<boolean> | null = null;
|
|
364
|
-
|
|
365
|
-
private async onLoad() {
|
|
366
|
-
|
|
367
|
-
if (!this.isConnected) return;
|
|
368
|
-
if (!this._context) {
|
|
369
|
-
if (debug) console.warn("Create new context");
|
|
370
|
-
this._context = new Context({ domElement: this });
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
if (!this._context) {
|
|
374
|
-
console.error("Needle Engine: Context not initialized");
|
|
375
|
-
return;
|
|
376
|
-
}
|
|
377
|
-
|
|
378
|
-
const filesToLoad = this.getSourceFiles();
|
|
379
|
-
if (!this.checkIfSourceHasChanged(filesToLoad, this._lastSourceFiles)) {
|
|
380
|
-
return;
|
|
381
|
-
}
|
|
382
|
-
|
|
383
|
-
// Abort previous loading (if it's still running)
|
|
384
|
-
if (this._abortController) {
|
|
385
|
-
if (debug) console.warn("Abort previous loading process")
|
|
386
|
-
this._abortController.abort();
|
|
387
|
-
this._abortController = null;
|
|
388
|
-
}
|
|
389
|
-
this._lastSourceFiles = filesToLoad;
|
|
390
|
-
const loadId = ++this._loadId;
|
|
391
|
-
|
|
392
|
-
if (filesToLoad === null || filesToLoad === undefined || filesToLoad.length <= 0) {
|
|
393
|
-
if (debug) console.warn("Clear scene", filesToLoad);
|
|
394
|
-
this._context.clear();
|
|
395
|
-
if (loadId !== this._loadId) return;
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
const alias = this.getAttribute("alias");
|
|
399
|
-
this.classList.add("loading");
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
// Loading start events
|
|
404
|
-
const allowOverridingDefaultLoading = hasCommercialLicense();
|
|
405
|
-
// default loading can be overriden by calling preventDefault in the onload start event
|
|
406
|
-
this.ensureLoadStartIsRegistered();
|
|
407
|
-
let useDefaultLoading = this.dispatchEvent(new CustomEvent("loadstart", {
|
|
408
|
-
detail: {
|
|
409
|
-
context: this._context,
|
|
410
|
-
alias: alias
|
|
411
|
-
},
|
|
412
|
-
cancelable: true
|
|
413
|
-
}));
|
|
414
|
-
if (allowOverridingDefaultLoading) {
|
|
415
|
-
// Handle the <needle-engine hide-loading-overlay> attribute
|
|
416
|
-
const hideOverlay = this.getAttribute("hide-loading-overlay");
|
|
417
|
-
if (hideOverlay !== null && hideOverlay !== undefined && hideOverlay !== "0") {
|
|
418
|
-
useDefaultLoading = false;
|
|
419
|
-
}
|
|
420
|
-
}
|
|
421
|
-
// for local development we allow overriding the loading screen - but we notify the user that it won't work in a deployed environment
|
|
422
|
-
if (useDefaultLoading === false && !allowOverridingDefaultLoading) {
|
|
423
|
-
if (!isDevEnvironment())
|
|
424
|
-
useDefaultLoading = true;
|
|
425
|
-
console.warn("Needle Engine: You need a commercial license to override the default loading view. Visit https://needle.tools/pricing");
|
|
426
|
-
if (isDevEnvironment()) showBalloonWarning("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.");
|
|
427
|
-
}
|
|
428
|
-
// create the loading view idf necessary
|
|
429
|
-
if (!this._loadingView && useDefaultLoading)
|
|
430
|
-
this._loadingView = new EngineLoadingView(this);
|
|
431
|
-
if (useDefaultLoading) {
|
|
432
|
-
// Only show the loading screen immedialty if we haven't loaded anything before
|
|
433
|
-
if (this._didFullyLoad !== true)
|
|
434
|
-
this._loadingView?.onLoadingBegin("begin load");
|
|
435
|
-
else {
|
|
436
|
-
// If we have loaded a glb previously and are loading a new glb due to e.g. src change
|
|
437
|
-
// we don't want to show the loading screen immediately to avoid blinking if the glb to be loaded is tiny
|
|
438
|
-
// so we wait a bit and only show the loading screen if the loading takes longer than a short moment
|
|
439
|
-
setTimeout(() => {
|
|
440
|
-
// If the loading progress is already above ~ 70% we also don't need to show the loading screen anymore
|
|
441
|
-
if (this._loadingView && this._loadingProgress01 < 0.3 && this._loadId === loadId)
|
|
442
|
-
this._loadingView.onLoadingBegin("begin load");
|
|
443
|
-
}, 300)
|
|
444
|
-
}
|
|
445
|
-
}
|
|
446
|
-
if (debug) console.warn("--------------\nNeedle Engine: Begin loading " + loadId + "\n", filesToLoad);
|
|
447
|
-
this.onBeforeBeginLoading();
|
|
448
|
-
|
|
449
|
-
const loadedFiles: Array<LoadedModel> = [];
|
|
450
|
-
const progressEventDetail = {
|
|
451
|
-
context: this._context,
|
|
452
|
-
name: "",
|
|
453
|
-
progress: {} as ProgressEvent,
|
|
454
|
-
index: 0,
|
|
455
|
-
count: filesToLoad.length,
|
|
456
|
-
totalProgress01: this._loadingProgress01
|
|
457
|
-
};
|
|
458
|
-
const progressEvent = new CustomEvent("progress", { detail: progressEventDetail });
|
|
459
|
-
const displayNames = new Array<string>();
|
|
460
|
-
const controller = new AbortController();
|
|
461
|
-
this._abortController = controller;
|
|
462
|
-
const args: ContextCreateArgs = {
|
|
463
|
-
files: filesToLoad,
|
|
464
|
-
abortSignal: controller.signal,
|
|
465
|
-
onLoadingProgress: evt => {
|
|
466
|
-
if (debug) console.debug("Loading progress: ", evt);
|
|
467
|
-
if (controller.signal.aborted) return;
|
|
468
|
-
const index = evt.index;
|
|
469
|
-
if (!displayNames[index] && evt.name) {
|
|
470
|
-
displayNames[index] = getDisplayName(evt.name);
|
|
471
|
-
}
|
|
472
|
-
evt.name = displayNames[index];
|
|
473
|
-
if (useDefaultLoading) this._loadingView?.onLoadingUpdate(evt);
|
|
474
|
-
progressEventDetail.name = evt.name;
|
|
475
|
-
progressEventDetail.progress = evt.progress;
|
|
476
|
-
this._loadingProgress01 = calculateProgress01(evt);
|
|
477
|
-
progressEventDetail.totalProgress01 = this._loadingProgress01;
|
|
478
|
-
this.dispatchEvent(progressEvent);
|
|
479
|
-
},
|
|
480
|
-
onLoadingFinished: (_index, file, glTF) => {
|
|
481
|
-
if (debug) console.debug(`Finished loading \"${file}\" (aborted? ${controller.signal.aborted})`);
|
|
482
|
-
if (controller.signal.aborted) return;
|
|
483
|
-
if (glTF) {
|
|
484
|
-
loadedFiles.push({
|
|
485
|
-
src: file,
|
|
486
|
-
file: glTF
|
|
487
|
-
});
|
|
488
|
-
}
|
|
489
|
-
}
|
|
490
|
-
}
|
|
491
|
-
|
|
492
|
-
const currentHash = this.getAttribute("hash");
|
|
493
|
-
if (currentHash !== null && currentHash !== undefined)
|
|
494
|
-
this._context.hash = currentHash;
|
|
495
|
-
this._context.alias = alias;
|
|
496
|
-
this._createContextPromise = this._context.create(args);
|
|
497
|
-
const success = await this._createContextPromise;
|
|
498
|
-
this.applyAttributes();
|
|
499
|
-
|
|
500
|
-
if (debug) console.warn("--------------\nNeedle Engine: finished loading " + loadId + "\n", filesToLoad, `Aborted? ${controller.signal.aborted}`);
|
|
501
|
-
if (controller.signal.aborted) {
|
|
502
|
-
console.log("Loading finished but aborted...")
|
|
503
|
-
return;
|
|
504
|
-
}
|
|
505
|
-
if (this._loadId !== loadId) {
|
|
506
|
-
console.log("Load id changed during loading process")
|
|
507
|
-
return;
|
|
508
|
-
}
|
|
509
|
-
|
|
510
|
-
this._loadingProgress01 = 1;
|
|
511
|
-
if (useDefaultLoading && success) {
|
|
512
|
-
this._loadingView?.onLoadingUpdate(1, "creating scene");
|
|
513
|
-
}
|
|
514
|
-
this._didFullyLoad = true;
|
|
515
|
-
this.classList.remove("loading");
|
|
516
|
-
this.classList.add("loading-finished");
|
|
517
|
-
this.dispatchEvent(new CustomEvent("loadfinished", {
|
|
518
|
-
detail: {
|
|
519
|
-
context: this._context,
|
|
520
|
-
src: alias,
|
|
521
|
-
loadedFiles: loadedFiles,
|
|
522
|
-
}
|
|
523
|
-
}));
|
|
524
|
-
}
|
|
525
|
-
|
|
526
|
-
private applyAttributes() {
|
|
527
|
-
// set tonemapping if configured
|
|
528
|
-
if (this._context?.renderer) {
|
|
529
|
-
const threeTonemapping = nameToThreeTonemapping(this.toneMapping);
|
|
530
|
-
if (threeTonemapping !== undefined) {
|
|
531
|
-
this._context.renderer.toneMapping = threeTonemapping;
|
|
532
|
-
}
|
|
533
|
-
const exposure = this.getAttribute("tone-mapping-exposure");
|
|
534
|
-
if (exposure !== null && exposure !== undefined) {
|
|
535
|
-
const value = parseFloat(exposure);
|
|
536
|
-
if (!isNaN(value))
|
|
537
|
-
this._context.renderer.toneMappingExposure = value;
|
|
538
|
-
}
|
|
539
|
-
}
|
|
540
|
-
|
|
541
|
-
const backgroundBlurriness = this.getAttribute("background-blurriness");
|
|
542
|
-
if (backgroundBlurriness !== null && backgroundBlurriness !== undefined) {
|
|
543
|
-
const value = parseFloat(backgroundBlurriness);
|
|
544
|
-
if (value !== undefined && this._context) {
|
|
545
|
-
this._context.scene.backgroundBlurriness = value;
|
|
546
|
-
}
|
|
547
|
-
}
|
|
548
|
-
|
|
549
|
-
const backgroundColor = this.getAttribute("background-color");
|
|
550
|
-
if (this._context?.renderer) {
|
|
551
|
-
if (typeof backgroundColor === "string" && backgroundColor.length > 0) {
|
|
552
|
-
const rgbaColor = RGBAColor.fromColorRepresentation(backgroundColor);
|
|
553
|
-
if (debug) console.debug("<needle-engine> background-color changed, str:", backgroundColor, "→", rgbaColor)
|
|
554
|
-
this._context.renderer.setClearColor(rgbaColor, rgbaColor.alpha);
|
|
555
|
-
this.context.scene.background = null;
|
|
556
|
-
}
|
|
557
|
-
}
|
|
558
|
-
}
|
|
559
|
-
|
|
560
|
-
private onXRSessionStarted = () => {
|
|
561
|
-
const xrSessionMode = this.context.xrSessionMode;
|
|
562
|
-
if (xrSessionMode === "immersive-ar")
|
|
563
|
-
this.onEnterAR(this.context.xrSession!);
|
|
564
|
-
else if (xrSessionMode === "immersive-vr")
|
|
565
|
-
this.onEnterVR(this.context.xrSession!);
|
|
566
|
-
|
|
567
|
-
// handle session end:
|
|
568
|
-
this.context.xrSession?.addEventListener("end", () => {
|
|
569
|
-
this.dispatchEvent(new CustomEvent("xr-session-ended", { detail: { session: this.context.xrSession, context: this._context, sessionMode: xrSessionMode } }));
|
|
570
|
-
if (xrSessionMode === "immersive-ar")
|
|
571
|
-
this.onExitAR(this.context.xrSession!);
|
|
572
|
-
else if (xrSessionMode === "immersive-vr")
|
|
573
|
-
this.onExitVR(this.context.xrSession!);
|
|
574
|
-
});
|
|
575
|
-
};
|
|
576
|
-
|
|
577
|
-
/** called by the context when the first frame has been rendered */
|
|
578
|
-
private onReady = () => this._loadingView?.onLoadingFinished();
|
|
579
|
-
private onError = () => this._loadingView?.setMessage("Loading failed!");
|
|
580
|
-
|
|
581
|
-
private internalSetLoadingMessage(str: string) {
|
|
582
|
-
this._loadingView?.setMessage(str);
|
|
583
|
-
}
|
|
584
|
-
|
|
585
|
-
private getSourceFiles(): Array<string> {
|
|
586
|
-
const src: string | null | string[] = this.getAttribute("src");
|
|
587
|
-
if (!src) return [];
|
|
588
|
-
|
|
589
|
-
let filesToLoad: Array<string>;
|
|
590
|
-
// When using globalThis the src is an array already
|
|
591
|
-
if (Array.isArray(src)) {
|
|
592
|
-
filesToLoad = src;
|
|
593
|
-
}
|
|
594
|
-
// When assigned from codegen the src is a stringified array
|
|
595
|
-
else if (src.startsWith("[") && src.endsWith("]")) {
|
|
596
|
-
filesToLoad = JSON.parse(src);
|
|
597
|
-
}
|
|
598
|
-
// src.toString for an array produces a comma separated list
|
|
599
|
-
else if (src.includes(",")) {
|
|
600
|
-
filesToLoad = src.split(",");
|
|
601
|
-
}
|
|
602
|
-
else filesToLoad = [src];
|
|
603
|
-
|
|
604
|
-
// filter out invalid or empty strings
|
|
605
|
-
for (let i = filesToLoad.length - 1; i >= 0; i--) {
|
|
606
|
-
const file = filesToLoad[i];
|
|
607
|
-
if (file === "null" || file === "undefined" || file?.length <= 0)
|
|
608
|
-
filesToLoad.splice(i, 1);
|
|
609
|
-
}
|
|
610
|
-
|
|
611
|
-
return filesToLoad;
|
|
612
|
-
}
|
|
613
|
-
|
|
614
|
-
private checkIfSourceHasChanged(current: Array<string> | null, previous: Array<string> | null): boolean {
|
|
615
|
-
if (current?.length !== previous?.length) return true;
|
|
616
|
-
if (current == null && previous !== null) return true;
|
|
617
|
-
if (current !== null && previous == null) return true;
|
|
618
|
-
if (current !== null && previous !== null) {
|
|
619
|
-
for (let i = 0; i < current?.length; i++) {
|
|
620
|
-
if (current[i] !== previous[i]) return true;
|
|
621
|
-
}
|
|
622
|
-
}
|
|
623
|
-
return false;
|
|
624
|
-
}
|
|
625
|
-
|
|
626
|
-
private _previouslyRegisteredMap: Map<string, Function> = new Map();
|
|
627
|
-
private ensureLoadStartIsRegistered() {
|
|
628
|
-
const attributeValue = this.getAttribute("loadstart");
|
|
629
|
-
if (attributeValue)
|
|
630
|
-
this.registerEventFromAttribute("loadstart", attributeValue);
|
|
631
|
-
}
|
|
632
|
-
private registerEventFromAttribute(eventName: string, code: string) {
|
|
633
|
-
const prev = this._previouslyRegisteredMap.get(eventName);
|
|
634
|
-
if (prev) {
|
|
635
|
-
this._previouslyRegisteredMap.delete(eventName);
|
|
636
|
-
this.removeEventListener(eventName, prev as any);
|
|
637
|
-
}
|
|
638
|
-
if (typeof code === "string" && code.length > 0) {
|
|
639
|
-
try {
|
|
640
|
-
// indirect eval https://esbuild.github.io/content-types/#direct-eval
|
|
641
|
-
const fn = (0, eval)(code);
|
|
642
|
-
// const fn = new Function(newValue);
|
|
643
|
-
if (typeof fn === "function") {
|
|
644
|
-
this._previouslyRegisteredMap.set(eventName, fn);
|
|
645
|
-
this.addEventListener(eventName, evt => fn?.call(globalThis, this._context, evt));
|
|
646
|
-
}
|
|
647
|
-
}
|
|
648
|
-
catch (err) {
|
|
649
|
-
console.error("Error registering event " + eventName + "=\"" + code + "\" failed with the following error:\n", err);
|
|
650
|
-
}
|
|
651
|
-
}
|
|
652
|
-
}
|
|
653
|
-
|
|
654
|
-
private setPublicKey() {
|
|
655
|
-
if (PUBLIC_KEY && PUBLIC_KEY.length > 0)
|
|
656
|
-
this.setAttribute("public-key", PUBLIC_KEY);
|
|
657
|
-
}
|
|
658
|
-
private setVersion() {
|
|
659
|
-
if (VERSION && VERSION.length > 0) {
|
|
660
|
-
this.setAttribute("version", VERSION);
|
|
661
|
-
}
|
|
662
|
-
}
|
|
663
|
-
|
|
664
|
-
/**
|
|
665
|
-
* @internal
|
|
666
|
-
*/
|
|
667
|
-
getAROverlayContainer(): HTMLElement {
|
|
668
|
-
return this._overlay_ar.createOverlayContainer(this);
|
|
669
|
-
}
|
|
670
|
-
|
|
671
|
-
/**
|
|
672
|
-
* @internal
|
|
673
|
-
*/
|
|
674
|
-
getVROverlayContainer(): HTMLElement | null {
|
|
675
|
-
for (let i = 0; i < this.children.length; i++) {
|
|
676
|
-
const ch = this.children[i] as HTMLElement;
|
|
677
|
-
if (ch.classList.contains("vr"))
|
|
678
|
-
return ch;
|
|
679
|
-
}
|
|
680
|
-
return null;
|
|
681
|
-
}
|
|
682
|
-
|
|
683
|
-
/**
|
|
684
|
-
* @internal
|
|
685
|
-
*/
|
|
686
|
-
onEnterAR(session: XRSession) {
|
|
687
|
-
this.onSetupAR();
|
|
688
|
-
const overlayContainer = this.getAROverlayContainer();
|
|
689
|
-
this._overlay_ar.onBegin(this._context!, overlayContainer, session);
|
|
690
|
-
this.dispatchEvent(new CustomEvent("enter-ar", { detail: { session: session, context: this._context, htmlContainer: this._overlay_ar?.ARContainer } }));
|
|
691
|
-
}
|
|
692
|
-
|
|
693
|
-
/**
|
|
694
|
-
* @internal
|
|
695
|
-
*/
|
|
696
|
-
onExitAR(session: XRSession) {
|
|
697
|
-
this._overlay_ar.onEnd(this._context!);
|
|
698
|
-
this.onSetupDesktop();
|
|
699
|
-
this.dispatchEvent(new CustomEvent("exit-ar", { detail: { session: session, context: this._context, htmlContainer: this._overlay_ar?.ARContainer } }));
|
|
700
|
-
}
|
|
701
|
-
|
|
702
|
-
/**
|
|
703
|
-
* @internal
|
|
704
|
-
*/
|
|
705
|
-
onEnterVR(session: XRSession) {
|
|
706
|
-
this.onSetupVR();
|
|
707
|
-
this.dispatchEvent(new CustomEvent("enter-vr", { detail: { session: session, context: this._context } }));
|
|
708
|
-
}
|
|
709
|
-
|
|
710
|
-
/**
|
|
711
|
-
* @internal
|
|
712
|
-
*/
|
|
713
|
-
onExitVR(session: XRSession) {
|
|
714
|
-
this.onSetupDesktop();
|
|
715
|
-
this.dispatchEvent(new CustomEvent("exit-vr", { detail: { session: session, context: this._context } }));
|
|
716
|
-
}
|
|
717
|
-
|
|
718
|
-
private onSetupAR() {
|
|
719
|
-
this.classList.add(arSessionActiveClassName);
|
|
720
|
-
this.classList.remove(desktopSessionActiveClassName);
|
|
721
|
-
const arContainer = this.getAROverlayContainer();
|
|
722
|
-
if (debug) console.warn("onSetupAR:", arContainer)
|
|
723
|
-
if (arContainer) {
|
|
724
|
-
arContainer.classList.add(arSessionActiveClassName);
|
|
725
|
-
arContainer.classList.remove(desktopSessionActiveClassName);
|
|
726
|
-
}
|
|
727
|
-
this.foreachHtmlElement(ch => this.setupElementsForMode(ch, arContainerClassName));
|
|
728
|
-
}
|
|
729
|
-
|
|
730
|
-
private onSetupVR() {
|
|
731
|
-
this.classList.remove(arSessionActiveClassName);
|
|
732
|
-
this.classList.remove(desktopSessionActiveClassName);
|
|
733
|
-
this.foreachHtmlElement(ch => this.setupElementsForMode(ch, vrContainerClassName));
|
|
734
|
-
}
|
|
735
|
-
|
|
736
|
-
private onSetupDesktop() {
|
|
737
|
-
this.classList.remove(arSessionActiveClassName);
|
|
738
|
-
this.classList.add(desktopSessionActiveClassName);
|
|
739
|
-
const arContainer = this.getAROverlayContainer();
|
|
740
|
-
if (arContainer) {
|
|
741
|
-
arContainer.classList.remove(arSessionActiveClassName);
|
|
742
|
-
arContainer.classList.add(desktopSessionActiveClassName);
|
|
743
|
-
}
|
|
744
|
-
this.foreachHtmlElement(ch => this.setupElementsForMode(ch, desktopContainerClassname));
|
|
745
|
-
}
|
|
746
|
-
|
|
747
|
-
private setupElementsForMode(el: HTMLElement, currentSessionType: string, _session: XRSession | null = null) {
|
|
748
|
-
if (el === this._context?.renderer?.domElement) return;
|
|
749
|
-
if (el.id === "VRButton" || el.id === "ARButton") return;
|
|
750
|
-
|
|
751
|
-
const classList = el.classList;
|
|
752
|
-
if (classList.contains(currentSessionType)) {
|
|
753
|
-
el.style.visibility = "visible";
|
|
754
|
-
if (el.style.display === "none")
|
|
755
|
-
el.style.display = "block";
|
|
756
|
-
}
|
|
757
|
-
else {
|
|
758
|
-
// only modify style for elements that have a known class (e.g. marked as vr ar desktop)
|
|
759
|
-
for (const known of knownClasses) {
|
|
760
|
-
if (el.classList.contains(known)) {
|
|
761
|
-
el.style.visibility = "hidden";
|
|
762
|
-
el.style.display = "none";
|
|
763
|
-
}
|
|
764
|
-
}
|
|
765
|
-
}
|
|
766
|
-
}
|
|
767
|
-
|
|
768
|
-
private foreachHtmlElement(cb: (HTMLElement) => void) {
|
|
769
|
-
for (let i = 0; i < this.children.length; i++) {
|
|
770
|
-
const ch = this.children[i] as HTMLElement;
|
|
771
|
-
if (ch.style) cb(ch);
|
|
772
|
-
}
|
|
773
|
-
}
|
|
774
|
-
|
|
775
|
-
private onBeforeBeginLoading() {
|
|
776
|
-
const customDracoDecoderPath = this.getAttribute("dracoDecoderPath");
|
|
777
|
-
if (customDracoDecoderPath) {
|
|
778
|
-
if (debug) console.log("using custom draco decoder path", customDracoDecoderPath);
|
|
779
|
-
setDracoDecoderPath(customDracoDecoderPath);
|
|
780
|
-
}
|
|
781
|
-
const customDracoDecoderType = this.getAttribute("dracoDecoderType");
|
|
782
|
-
if (customDracoDecoderType) {
|
|
783
|
-
if (debug) console.log("using custom draco decoder type", customDracoDecoderType);
|
|
784
|
-
setDracoDecoderType(customDracoDecoderType);
|
|
785
|
-
}
|
|
786
|
-
const customKtx2DecoderPath = this.getAttribute("ktx2DecoderPath");
|
|
787
|
-
if (customKtx2DecoderPath) {
|
|
788
|
-
if (debug) console.log("using custom ktx2 decoder path", customKtx2DecoderPath);
|
|
789
|
-
setKtx2TranscoderPath(customKtx2DecoderPath);
|
|
790
|
-
}
|
|
791
|
-
}
|
|
792
|
-
}
|
|
793
|
-
|
|
794
|
-
if (typeof window !== "undefined" && !window.customElements.get(htmlTagName))
|
|
795
|
-
window.customElements.define(htmlTagName, NeedleEngineWebComponent);
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
function getDisplayName(str: string) {
|
|
803
|
-
if (str.startsWith("blob:")) {
|
|
804
|
-
return "blob";
|
|
805
|
-
}
|
|
806
|
-
const parts = str.split("/");
|
|
807
|
-
let name = parts[parts.length - 1];
|
|
808
|
-
// Remove params
|
|
809
|
-
const paramsIndex = name.indexOf("?")
|
|
810
|
-
if (paramsIndex > 0)
|
|
811
|
-
name = name.substring(0, paramsIndex);
|
|
812
|
-
|
|
813
|
-
const equalSign = name.indexOf("=");
|
|
814
|
-
if (equalSign > 0)
|
|
815
|
-
name = name.substring(equalSign);
|
|
816
|
-
|
|
817
|
-
const extension = name.split(".").pop();
|
|
818
|
-
const extensions = ["glb", "gltf", "usdz", "usd", "fbx", "obj", "mtl"];
|
|
819
|
-
const matchedIndex = !extension ? -1 : extensions.indexOf(extension.toLowerCase());
|
|
820
|
-
if (extension && matchedIndex >= 0) {
|
|
821
|
-
name = name.substring(0, name.length - extension.length - 1);
|
|
822
|
-
}
|
|
823
|
-
name = decodeURIComponent(name);
|
|
824
|
-
if (name.length > 3) {
|
|
825
|
-
let displayName = "";
|
|
826
|
-
let lastCharacterWasSpace = false;
|
|
827
|
-
const ignoredCharacters = ["(", ")", "[", "]", "{", "}", ":", ";", ",", ".", "!", "?"];
|
|
828
|
-
for (let i = 0; i < name.length; i++) {
|
|
829
|
-
let c = name[i];
|
|
830
|
-
if (c === "_" || c === "-") c = " ";
|
|
831
|
-
if (c === ' ' && displayName.length <= 0) continue;
|
|
832
|
-
const isIgnored = ignoredCharacters.includes(c);
|
|
833
|
-
if (isIgnored) continue;
|
|
834
|
-
const isFirstCharacter = displayName.length === 0;
|
|
835
|
-
|
|
836
|
-
if (isFirstCharacter) {
|
|
837
|
-
c = c.toUpperCase();
|
|
838
|
-
}
|
|
839
|
-
if (lastCharacterWasSpace && c === " ") {
|
|
840
|
-
continue;
|
|
841
|
-
}
|
|
842
|
-
if (lastCharacterWasSpace) {
|
|
843
|
-
c = c.toUpperCase();
|
|
844
|
-
}
|
|
845
|
-
|
|
846
|
-
lastCharacterWasSpace = false;
|
|
847
|
-
displayName += c;
|
|
848
|
-
|
|
849
|
-
if (c === " ") {
|
|
850
|
-
lastCharacterWasSpace = true;
|
|
851
|
-
}
|
|
852
|
-
}
|
|
853
|
-
|
|
854
|
-
if (isDevEnvironment() && name !== displayName)
|
|
855
|
-
console.debug("Generated display name: \"" + name + "\" → \"" + displayName + "\"");
|
|
856
|
-
return displayName.trim();
|
|
857
|
-
}
|
|
858
|
-
if (isDevEnvironment())
|
|
859
|
-
console.debug("Loading: use default name", name);
|
|
860
|
-
return name;
|
|
1
|
+
import { isDevEnvironment, showBalloonWarning } from "../debug/index.js";
|
|
2
|
+
import { PUBLIC_KEY, VERSION } from "../engine_constants.js";
|
|
3
|
+
import { registerLoader } from "../engine_gltf.js";
|
|
4
|
+
import { hasCommercialLicense } from "../engine_license.js";
|
|
5
|
+
import { setDracoDecoderPath, setDracoDecoderType, setKtx2TranscoderPath } from "../engine_loaders.gltf.js";
|
|
6
|
+
import { NeedleLoader } from "../engine_loaders.js";
|
|
7
|
+
import { Context, ContextCreateArgs } from "../engine_setup.js";
|
|
8
|
+
import { nameToThreeTonemapping } from "../engine_tonemapping.js";
|
|
9
|
+
import { type INeedleEngineComponent, type LoadedModel } from "../engine_types.js";
|
|
10
|
+
import { getParam } from "../engine_utils.js";
|
|
11
|
+
import { RGBAColor } from "../js-extensions/RGBAColor.js";
|
|
12
|
+
import { ensureFonts } from "./fonts.js";
|
|
13
|
+
import { arContainerClassName, AROverlayHandler } from "./needle-engine.ar-overlay.js";
|
|
14
|
+
import { NeedleEngineAttributes, TonemappingAttributeOptions } from "./needle-engine.attributes.js";
|
|
15
|
+
import { calculateProgress01, EngineLoadingView, type ILoadingViewHandler } from "./needle-engine.loading.js";
|
|
16
|
+
|
|
17
|
+
// registering loader here too to make sure it's imported when using engine via vanilla js
|
|
18
|
+
registerLoader(NeedleLoader);
|
|
19
|
+
|
|
20
|
+
const debug = getParam("debugwebcomponent");
|
|
21
|
+
|
|
22
|
+
const htmlTagName = "needle-engine";
|
|
23
|
+
const vrContainerClassName = "vr";
|
|
24
|
+
const desktopContainerClassname = "desktop";
|
|
25
|
+
const knownClasses = [arContainerClassName, vrContainerClassName, desktopContainerClassname];
|
|
26
|
+
const arSessionActiveClassName = "ar-session-active";
|
|
27
|
+
const desktopSessionActiveClassName = "desktop-session-active";
|
|
28
|
+
|
|
29
|
+
const observedAttributes = [
|
|
30
|
+
"public-key",
|
|
31
|
+
"version",
|
|
32
|
+
|
|
33
|
+
"hash",
|
|
34
|
+
"src",
|
|
35
|
+
"camera-controls",
|
|
36
|
+
"loadstart",
|
|
37
|
+
"progress",
|
|
38
|
+
"loadfinished",
|
|
39
|
+
"dracoDecoderPath",
|
|
40
|
+
"dracoDecoderType",
|
|
41
|
+
"ktx2DecoderPath",
|
|
42
|
+
"tone-mapping",
|
|
43
|
+
"tone-mapping-exposure",
|
|
44
|
+
"background-blurriness",
|
|
45
|
+
"background-color",
|
|
46
|
+
]
|
|
47
|
+
|
|
48
|
+
// https://developers.google.com/web/fundamentals/web-components/customelements
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* <needle-engine> web component. See {@link NeedleEngineAttributes} attributes for supported attributes
|
|
52
|
+
* The needle engine web component creates and manages a needle engine context which is responsible for rendering a 3D scene using threejs.
|
|
53
|
+
* The needle engine context is created when the src attribute is set and disposed when the needle engine is removed from the document (you can prevent this by setting the keep-alive attribute to true).
|
|
54
|
+
* The needle engine context is accessible via the context property on the needle engine element (e.g. document.querySelector("needle-engine").context).
|
|
55
|
+
* @link https://engine.needle.tools/docs/reference/needle-engine-attributes
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* <needle-engine src="https://example.com/scene.glb"></needle-engine>
|
|
59
|
+
* @example
|
|
60
|
+
* <needle-engine src="https://example.com/scene.glb" camera-controls="false"></needle-engine>
|
|
61
|
+
*/
|
|
62
|
+
export class NeedleEngineWebComponent extends HTMLElement implements INeedleEngineComponent {
|
|
63
|
+
|
|
64
|
+
static get observedAttributes() {
|
|
65
|
+
return observedAttributes
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
public get loadingProgress01(): number { return this._loadingProgress01; }
|
|
69
|
+
public get loadingFinished(): boolean { return this.loadingProgress01 > .999; }
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* If set to false the camera controls are disabled. Default is true.
|
|
73
|
+
* @type {boolean | null}
|
|
74
|
+
* @memberof NeedleEngineAttributes
|
|
75
|
+
* @example
|
|
76
|
+
* <needle-engine camera-controls="false"></needle-engine>
|
|
77
|
+
* @example
|
|
78
|
+
* <needle-engine camera-controls="true"></needle-engine>
|
|
79
|
+
* @example
|
|
80
|
+
* <needle-engine camera-controls></needle-engine>
|
|
81
|
+
* @example
|
|
82
|
+
* <needle-engine></needle-engine>
|
|
83
|
+
* @returns {boolean | null} if the attribute is not set it returns null
|
|
84
|
+
*/
|
|
85
|
+
public get cameraControls(): boolean | null {
|
|
86
|
+
const attr = this.getAttribute("camera-controls") as NeedleEngineAttributes["camera-controls"] | ({} & string)
|
|
87
|
+
if (attr == null) return null;
|
|
88
|
+
if (attr === null || attr === "False" || attr === "false" || attr === "0" || attr === "none") return false;
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Get the current context for this web component instance. The context is created when the src attribute is set and the loading has finished.
|
|
94
|
+
* The context is disposed when the needle engine is removed from the document (you can prevent this by setting the keep-alive attribute to true).
|
|
95
|
+
* @returns {Promise<Context>} a promise that resolves to the context when the loading has finished
|
|
96
|
+
*/
|
|
97
|
+
public getContext(): Promise<Context> {
|
|
98
|
+
return new Promise((res, _rej) => {
|
|
99
|
+
if (this._context && this.loadingFinished) {
|
|
100
|
+
res(this._context);
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
const cb = () => {
|
|
104
|
+
this.removeEventListener("loadfinished", cb);
|
|
105
|
+
if (this._context && this.loadingFinished) {
|
|
106
|
+
res(this._context);
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
this.addEventListener("loadfinished", cb);
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Get the context that is created when the src attribute is set and the loading has finished.
|
|
116
|
+
*/
|
|
117
|
+
public get context() { return this._context; }
|
|
118
|
+
|
|
119
|
+
private _context: Context;
|
|
120
|
+
private _overlay_ar: AROverlayHandler;
|
|
121
|
+
private _loadingProgress01: number = 0;
|
|
122
|
+
private _loadingView?: ILoadingViewHandler;
|
|
123
|
+
private _previousSrc: string | null | string[] = null;
|
|
124
|
+
/** set to true after <needle-engine> did load completely at least once. Set to false when <needle-engine> is removed from the document */
|
|
125
|
+
private _didFullyLoad: boolean = false;
|
|
126
|
+
|
|
127
|
+
constructor() {
|
|
128
|
+
super();
|
|
129
|
+
this._overlay_ar = new AROverlayHandler();
|
|
130
|
+
// TODO: do we want to rename this event?
|
|
131
|
+
this.addEventListener("ready", this.onReady);
|
|
132
|
+
|
|
133
|
+
ensureFonts();
|
|
134
|
+
|
|
135
|
+
this.attachShadow({ mode: 'open' });
|
|
136
|
+
const template = document.createElement('template');
|
|
137
|
+
template.innerHTML = `<style>
|
|
138
|
+
@import url('https://fonts.googleapis.com/css2?family=Roboto+Flex:opsz,wght@8..144,100..1000&display=swap');
|
|
139
|
+
|
|
140
|
+
:host {
|
|
141
|
+
position: absolute;
|
|
142
|
+
display: block;
|
|
143
|
+
width: max(600px, 100%);
|
|
144
|
+
height: max(300px, 100%);
|
|
145
|
+
touch-action: none;
|
|
146
|
+
|
|
147
|
+
-webkit-tap-highlight-color: transparent;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
@media (max-width: 600px) {
|
|
151
|
+
:host {
|
|
152
|
+
width: 100%;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
@media (max-height: 300px) {
|
|
156
|
+
:host {
|
|
157
|
+
height: 100%;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
:host > div.canvas-wrapper {
|
|
162
|
+
width: 100%;
|
|
163
|
+
height: 100%;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
:host canvas {
|
|
167
|
+
position: absolute;
|
|
168
|
+
user-select: none;
|
|
169
|
+
-webkit-user-select: none;
|
|
170
|
+
|
|
171
|
+
/** allow touch panning but no pinch zoom **/
|
|
172
|
+
/** but this doesnt work yet:
|
|
173
|
+
* touch-action: pan-x, pan-y;
|
|
174
|
+
**/
|
|
175
|
+
|
|
176
|
+
-webkit-touch-callout: none;
|
|
177
|
+
-webkit-user-drag: none;
|
|
178
|
+
-webkit-user-modify: none;
|
|
179
|
+
|
|
180
|
+
left: 0;
|
|
181
|
+
top: 0;
|
|
182
|
+
}
|
|
183
|
+
:host .content {
|
|
184
|
+
position: absolute;
|
|
185
|
+
top: 0;
|
|
186
|
+
width: 100%;
|
|
187
|
+
height: 100%;
|
|
188
|
+
visibility: visible;
|
|
189
|
+
z-index: 500; /* < must be less than the webxr buttons element */
|
|
190
|
+
pointer-events: none;
|
|
191
|
+
}
|
|
192
|
+
:host .overlay-content {
|
|
193
|
+
position: absolute;
|
|
194
|
+
user-select: auto;
|
|
195
|
+
pointer-events: all;
|
|
196
|
+
}
|
|
197
|
+
:host slot[name="quit-ar"]:hover {
|
|
198
|
+
cursor: pointer;
|
|
199
|
+
}
|
|
200
|
+
:host .quit-ar-button {
|
|
201
|
+
position: absolute;
|
|
202
|
+
// top: env(titlebar-area-y); /** this doesnt work **/
|
|
203
|
+
top: 60px; /** camera access needs a bit more space **/
|
|
204
|
+
right: 20px;
|
|
205
|
+
z-index: 9999;
|
|
206
|
+
}
|
|
207
|
+
</style>
|
|
208
|
+
<div class="canvas-wrapper"> <!-- this wrapper is necessary for WebXR https://github.com/meta-quest/immersive-web-emulator/issues/55 -->
|
|
209
|
+
<canvas></canvas>
|
|
210
|
+
</div>
|
|
211
|
+
<div class="content">
|
|
212
|
+
<slot class="overlay-content"></slot>
|
|
213
|
+
</div>
|
|
214
|
+
`;
|
|
215
|
+
|
|
216
|
+
if (this.shadowRoot)
|
|
217
|
+
this.shadowRoot.appendChild(template.content.cloneNode(true));
|
|
218
|
+
|
|
219
|
+
this._context = new Context({ domElement: this });
|
|
220
|
+
this.addEventListener("error", this.onError);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* @internal
|
|
226
|
+
*/
|
|
227
|
+
async connectedCallback() {
|
|
228
|
+
if (debug) {
|
|
229
|
+
console.log("<needle-engine> connected");
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
this.setPublicKey();
|
|
233
|
+
this.setVersion();
|
|
234
|
+
|
|
235
|
+
this.addEventListener("xr-session-started", this.onXRSessionStarted);
|
|
236
|
+
this.onSetupDesktop();
|
|
237
|
+
|
|
238
|
+
if (!this.getAttribute("src")) {
|
|
239
|
+
const global = globalThis["needle:codegen_files"] as unknown as string;
|
|
240
|
+
if (debug) console.log("src is null, trying to load from globalThis[\"needle:codegen_files\"]", global);
|
|
241
|
+
if (global) {
|
|
242
|
+
if (debug) console.log("globalThis[\"needle:codegen_files\"]", global);
|
|
243
|
+
this.setAttribute("src", global);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
if (debug) console.log("src", this.getAttribute("src"));
|
|
248
|
+
|
|
249
|
+
// we have to wait because codegen does set the src attribute when it's loaded
|
|
250
|
+
// which might happen after the element is connected
|
|
251
|
+
// if the `src` is then still null we want to initialize the default scene
|
|
252
|
+
const loadId = this._loadId;
|
|
253
|
+
setTimeout(() => {
|
|
254
|
+
if (this.isConnected === false) return;
|
|
255
|
+
if (loadId !== this._loadId) return;
|
|
256
|
+
this.onLoad();
|
|
257
|
+
}, 1);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* @internal
|
|
262
|
+
*/
|
|
263
|
+
disconnectedCallback() {
|
|
264
|
+
this.removeEventListener("xr-session-started", this.onXRSessionStarted);
|
|
265
|
+
|
|
266
|
+
this._didFullyLoad = false;
|
|
267
|
+
const keepAlive = this.getAttribute("keep-alive");
|
|
268
|
+
const dispose = keepAlive == undefined || (keepAlive?.length > 0 && keepAlive !== "true" && keepAlive !== "1");
|
|
269
|
+
if (debug) console.warn("<needle-engine> disconnected, keep-alive: \"" + keepAlive + "\"", typeof keepAlive, "Dispose=", dispose);
|
|
270
|
+
if (dispose) {
|
|
271
|
+
if (debug)
|
|
272
|
+
console.warn("<needle-engine> dispose");
|
|
273
|
+
this._context?.dispose();
|
|
274
|
+
this._context = null!;
|
|
275
|
+
this._lastSourceFiles = null;
|
|
276
|
+
this._loadId += 1;
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
if (debug) console.warn("<needle-engine> is not disposed because keep-alive is set");
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
/**
|
|
284
|
+
* @internal
|
|
285
|
+
*/
|
|
286
|
+
attributeChangedCallback(name: string, oldValue: string, newValue: string) {
|
|
287
|
+
if (debug) console.log("attributeChangedCallback", name, oldValue, newValue);
|
|
288
|
+
switch (name) {
|
|
289
|
+
case "src":
|
|
290
|
+
if (debug) console.warn("<needle-engine src>\nchanged from \"", oldValue, "\" to \"", newValue, "\"")
|
|
291
|
+
this.onLoad();
|
|
292
|
+
// this._watcher?.onSourceChanged(newValue);
|
|
293
|
+
break;
|
|
294
|
+
case "hash":
|
|
295
|
+
if (this._context) {
|
|
296
|
+
this._context.hash = newValue;
|
|
297
|
+
}
|
|
298
|
+
break;
|
|
299
|
+
case "loadstart":
|
|
300
|
+
case "progress":
|
|
301
|
+
case "loadfinished":
|
|
302
|
+
if (typeof newValue === "string" && newValue.length > 0) {
|
|
303
|
+
if (debug) console.log(name + " attribute changed", newValue);
|
|
304
|
+
this.registerEventFromAttribute(name, newValue);
|
|
305
|
+
}
|
|
306
|
+
break;
|
|
307
|
+
case "dracoDecoderPath":
|
|
308
|
+
if (debug) console.log("dracoDecoderPath", newValue);
|
|
309
|
+
setDracoDecoderPath(newValue);
|
|
310
|
+
break;
|
|
311
|
+
case "dracoDecoderType":
|
|
312
|
+
if (newValue === "wasm" || newValue === "js") {
|
|
313
|
+
if (debug) console.log("dracoDecoderType", newValue);
|
|
314
|
+
setDracoDecoderType(newValue);
|
|
315
|
+
}
|
|
316
|
+
else console.error("Invalid dracoDecoderType", newValue, "expected js or wasm");
|
|
317
|
+
break;
|
|
318
|
+
case "ktx2DecoderPath":
|
|
319
|
+
if (debug) console.log("ktx2DecoderPath", newValue);
|
|
320
|
+
setKtx2TranscoderPath(newValue);
|
|
321
|
+
break;
|
|
322
|
+
case "tone-mapping": {
|
|
323
|
+
this.applyAttributes();
|
|
324
|
+
break;
|
|
325
|
+
}
|
|
326
|
+
case "tone-mapping-exposure": {
|
|
327
|
+
this.applyAttributes();
|
|
328
|
+
break;
|
|
329
|
+
}
|
|
330
|
+
case "background-blurriness": {
|
|
331
|
+
const value = parseFloat(newValue);
|
|
332
|
+
if (value != undefined && this._context) {
|
|
333
|
+
this._context.scene.backgroundBlurriness = value;
|
|
334
|
+
}
|
|
335
|
+
break;
|
|
336
|
+
}
|
|
337
|
+
case "background-color": {
|
|
338
|
+
this.applyAttributes();
|
|
339
|
+
break;
|
|
340
|
+
}
|
|
341
|
+
case "public-key": {
|
|
342
|
+
if (newValue != PUBLIC_KEY)
|
|
343
|
+
this.setPublicKey();
|
|
344
|
+
break;
|
|
345
|
+
}
|
|
346
|
+
case "version": {
|
|
347
|
+
if (newValue != VERSION)
|
|
348
|
+
this.setVersion();
|
|
349
|
+
break;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
/** The tonemapping setting configured as an attribute on the <needle-engine> component */
|
|
355
|
+
get toneMapping(): TonemappingAttributeOptions | null | undefined {
|
|
356
|
+
const attribute = (this.getAttribute("tonemapping") || this.getAttribute("tone-mapping")) as TonemappingAttributeOptions | null | undefined;
|
|
357
|
+
return attribute;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
private _loadId: number = 0;
|
|
361
|
+
private _abortController: AbortController | null = null;
|
|
362
|
+
private _lastSourceFiles: Array<string> | null = null;
|
|
363
|
+
private _createContextPromise: Promise<boolean> | null = null;
|
|
364
|
+
|
|
365
|
+
private async onLoad() {
|
|
366
|
+
|
|
367
|
+
if (!this.isConnected) return;
|
|
368
|
+
if (!this._context) {
|
|
369
|
+
if (debug) console.warn("Create new context");
|
|
370
|
+
this._context = new Context({ domElement: this });
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
if (!this._context) {
|
|
374
|
+
console.error("Needle Engine: Context not initialized");
|
|
375
|
+
return;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
const filesToLoad = this.getSourceFiles();
|
|
379
|
+
if (!this.checkIfSourceHasChanged(filesToLoad, this._lastSourceFiles)) {
|
|
380
|
+
return;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
// Abort previous loading (if it's still running)
|
|
384
|
+
if (this._abortController) {
|
|
385
|
+
if (debug) console.warn("Abort previous loading process")
|
|
386
|
+
this._abortController.abort();
|
|
387
|
+
this._abortController = null;
|
|
388
|
+
}
|
|
389
|
+
this._lastSourceFiles = filesToLoad;
|
|
390
|
+
const loadId = ++this._loadId;
|
|
391
|
+
|
|
392
|
+
if (filesToLoad === null || filesToLoad === undefined || filesToLoad.length <= 0) {
|
|
393
|
+
if (debug) console.warn("Clear scene", filesToLoad);
|
|
394
|
+
this._context.clear();
|
|
395
|
+
if (loadId !== this._loadId) return;
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
const alias = this.getAttribute("alias");
|
|
399
|
+
this.classList.add("loading");
|
|
400
|
+
|
|
401
|
+
|
|
402
|
+
|
|
403
|
+
// Loading start events
|
|
404
|
+
const allowOverridingDefaultLoading = hasCommercialLicense();
|
|
405
|
+
// default loading can be overriden by calling preventDefault in the onload start event
|
|
406
|
+
this.ensureLoadStartIsRegistered();
|
|
407
|
+
let useDefaultLoading = this.dispatchEvent(new CustomEvent("loadstart", {
|
|
408
|
+
detail: {
|
|
409
|
+
context: this._context,
|
|
410
|
+
alias: alias
|
|
411
|
+
},
|
|
412
|
+
cancelable: true
|
|
413
|
+
}));
|
|
414
|
+
if (allowOverridingDefaultLoading) {
|
|
415
|
+
// Handle the <needle-engine hide-loading-overlay> attribute
|
|
416
|
+
const hideOverlay = this.getAttribute("hide-loading-overlay");
|
|
417
|
+
if (hideOverlay !== null && hideOverlay !== undefined && hideOverlay !== "0") {
|
|
418
|
+
useDefaultLoading = false;
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
// for local development we allow overriding the loading screen - but we notify the user that it won't work in a deployed environment
|
|
422
|
+
if (useDefaultLoading === false && !allowOverridingDefaultLoading) {
|
|
423
|
+
if (!isDevEnvironment())
|
|
424
|
+
useDefaultLoading = true;
|
|
425
|
+
console.warn("Needle Engine: You need a commercial license to override the default loading view. Visit https://needle.tools/pricing");
|
|
426
|
+
if (isDevEnvironment()) showBalloonWarning("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.");
|
|
427
|
+
}
|
|
428
|
+
// create the loading view idf necessary
|
|
429
|
+
if (!this._loadingView && useDefaultLoading)
|
|
430
|
+
this._loadingView = new EngineLoadingView(this);
|
|
431
|
+
if (useDefaultLoading) {
|
|
432
|
+
// Only show the loading screen immedialty if we haven't loaded anything before
|
|
433
|
+
if (this._didFullyLoad !== true)
|
|
434
|
+
this._loadingView?.onLoadingBegin("begin load");
|
|
435
|
+
else {
|
|
436
|
+
// If we have loaded a glb previously and are loading a new glb due to e.g. src change
|
|
437
|
+
// we don't want to show the loading screen immediately to avoid blinking if the glb to be loaded is tiny
|
|
438
|
+
// so we wait a bit and only show the loading screen if the loading takes longer than a short moment
|
|
439
|
+
setTimeout(() => {
|
|
440
|
+
// If the loading progress is already above ~ 70% we also don't need to show the loading screen anymore
|
|
441
|
+
if (this._loadingView && this._loadingProgress01 < 0.3 && this._loadId === loadId)
|
|
442
|
+
this._loadingView.onLoadingBegin("begin load");
|
|
443
|
+
}, 300)
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
if (debug) console.warn("--------------\nNeedle Engine: Begin loading " + loadId + "\n", filesToLoad);
|
|
447
|
+
this.onBeforeBeginLoading();
|
|
448
|
+
|
|
449
|
+
const loadedFiles: Array<LoadedModel> = [];
|
|
450
|
+
const progressEventDetail = {
|
|
451
|
+
context: this._context,
|
|
452
|
+
name: "",
|
|
453
|
+
progress: {} as ProgressEvent,
|
|
454
|
+
index: 0,
|
|
455
|
+
count: filesToLoad.length,
|
|
456
|
+
totalProgress01: this._loadingProgress01
|
|
457
|
+
};
|
|
458
|
+
const progressEvent = new CustomEvent("progress", { detail: progressEventDetail });
|
|
459
|
+
const displayNames = new Array<string>();
|
|
460
|
+
const controller = new AbortController();
|
|
461
|
+
this._abortController = controller;
|
|
462
|
+
const args: ContextCreateArgs = {
|
|
463
|
+
files: filesToLoad,
|
|
464
|
+
abortSignal: controller.signal,
|
|
465
|
+
onLoadingProgress: evt => {
|
|
466
|
+
if (debug) console.debug("Loading progress: ", evt);
|
|
467
|
+
if (controller.signal.aborted) return;
|
|
468
|
+
const index = evt.index;
|
|
469
|
+
if (!displayNames[index] && evt.name) {
|
|
470
|
+
displayNames[index] = getDisplayName(evt.name);
|
|
471
|
+
}
|
|
472
|
+
evt.name = displayNames[index];
|
|
473
|
+
if (useDefaultLoading) this._loadingView?.onLoadingUpdate(evt);
|
|
474
|
+
progressEventDetail.name = evt.name;
|
|
475
|
+
progressEventDetail.progress = evt.progress;
|
|
476
|
+
this._loadingProgress01 = calculateProgress01(evt);
|
|
477
|
+
progressEventDetail.totalProgress01 = this._loadingProgress01;
|
|
478
|
+
this.dispatchEvent(progressEvent);
|
|
479
|
+
},
|
|
480
|
+
onLoadingFinished: (_index, file, glTF) => {
|
|
481
|
+
if (debug) console.debug(`Finished loading \"${file}\" (aborted? ${controller.signal.aborted})`);
|
|
482
|
+
if (controller.signal.aborted) return;
|
|
483
|
+
if (glTF) {
|
|
484
|
+
loadedFiles.push({
|
|
485
|
+
src: file,
|
|
486
|
+
file: glTF
|
|
487
|
+
});
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
const currentHash = this.getAttribute("hash");
|
|
493
|
+
if (currentHash !== null && currentHash !== undefined)
|
|
494
|
+
this._context.hash = currentHash;
|
|
495
|
+
this._context.alias = alias;
|
|
496
|
+
this._createContextPromise = this._context.create(args);
|
|
497
|
+
const success = await this._createContextPromise;
|
|
498
|
+
this.applyAttributes();
|
|
499
|
+
|
|
500
|
+
if (debug) console.warn("--------------\nNeedle Engine: finished loading " + loadId + "\n", filesToLoad, `Aborted? ${controller.signal.aborted}`);
|
|
501
|
+
if (controller.signal.aborted) {
|
|
502
|
+
console.log("Loading finished but aborted...")
|
|
503
|
+
return;
|
|
504
|
+
}
|
|
505
|
+
if (this._loadId !== loadId) {
|
|
506
|
+
console.log("Load id changed during loading process")
|
|
507
|
+
return;
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
this._loadingProgress01 = 1;
|
|
511
|
+
if (useDefaultLoading && success) {
|
|
512
|
+
this._loadingView?.onLoadingUpdate(1, "creating scene");
|
|
513
|
+
}
|
|
514
|
+
this._didFullyLoad = true;
|
|
515
|
+
this.classList.remove("loading");
|
|
516
|
+
this.classList.add("loading-finished");
|
|
517
|
+
this.dispatchEvent(new CustomEvent("loadfinished", {
|
|
518
|
+
detail: {
|
|
519
|
+
context: this._context,
|
|
520
|
+
src: alias,
|
|
521
|
+
loadedFiles: loadedFiles,
|
|
522
|
+
}
|
|
523
|
+
}));
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
private applyAttributes() {
|
|
527
|
+
// set tonemapping if configured
|
|
528
|
+
if (this._context?.renderer) {
|
|
529
|
+
const threeTonemapping = nameToThreeTonemapping(this.toneMapping);
|
|
530
|
+
if (threeTonemapping !== undefined) {
|
|
531
|
+
this._context.renderer.toneMapping = threeTonemapping;
|
|
532
|
+
}
|
|
533
|
+
const exposure = this.getAttribute("tone-mapping-exposure");
|
|
534
|
+
if (exposure !== null && exposure !== undefined) {
|
|
535
|
+
const value = parseFloat(exposure);
|
|
536
|
+
if (!isNaN(value))
|
|
537
|
+
this._context.renderer.toneMappingExposure = value;
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
const backgroundBlurriness = this.getAttribute("background-blurriness");
|
|
542
|
+
if (backgroundBlurriness !== null && backgroundBlurriness !== undefined) {
|
|
543
|
+
const value = parseFloat(backgroundBlurriness);
|
|
544
|
+
if (value !== undefined && this._context) {
|
|
545
|
+
this._context.scene.backgroundBlurriness = value;
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
const backgroundColor = this.getAttribute("background-color");
|
|
550
|
+
if (this._context?.renderer) {
|
|
551
|
+
if (typeof backgroundColor === "string" && backgroundColor.length > 0) {
|
|
552
|
+
const rgbaColor = RGBAColor.fromColorRepresentation(backgroundColor);
|
|
553
|
+
if (debug) console.debug("<needle-engine> background-color changed, str:", backgroundColor, "→", rgbaColor)
|
|
554
|
+
this._context.renderer.setClearColor(rgbaColor, rgbaColor.alpha);
|
|
555
|
+
this.context.scene.background = null;
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
private onXRSessionStarted = () => {
|
|
561
|
+
const xrSessionMode = this.context.xrSessionMode;
|
|
562
|
+
if (xrSessionMode === "immersive-ar")
|
|
563
|
+
this.onEnterAR(this.context.xrSession!);
|
|
564
|
+
else if (xrSessionMode === "immersive-vr")
|
|
565
|
+
this.onEnterVR(this.context.xrSession!);
|
|
566
|
+
|
|
567
|
+
// handle session end:
|
|
568
|
+
this.context.xrSession?.addEventListener("end", () => {
|
|
569
|
+
this.dispatchEvent(new CustomEvent("xr-session-ended", { detail: { session: this.context.xrSession, context: this._context, sessionMode: xrSessionMode } }));
|
|
570
|
+
if (xrSessionMode === "immersive-ar")
|
|
571
|
+
this.onExitAR(this.context.xrSession!);
|
|
572
|
+
else if (xrSessionMode === "immersive-vr")
|
|
573
|
+
this.onExitVR(this.context.xrSession!);
|
|
574
|
+
});
|
|
575
|
+
};
|
|
576
|
+
|
|
577
|
+
/** called by the context when the first frame has been rendered */
|
|
578
|
+
private onReady = () => this._loadingView?.onLoadingFinished();
|
|
579
|
+
private onError = () => this._loadingView?.setMessage("Loading failed!");
|
|
580
|
+
|
|
581
|
+
private internalSetLoadingMessage(str: string) {
|
|
582
|
+
this._loadingView?.setMessage(str);
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
private getSourceFiles(): Array<string> {
|
|
586
|
+
const src: string | null | string[] = this.getAttribute("src");
|
|
587
|
+
if (!src) return [];
|
|
588
|
+
|
|
589
|
+
let filesToLoad: Array<string>;
|
|
590
|
+
// When using globalThis the src is an array already
|
|
591
|
+
if (Array.isArray(src)) {
|
|
592
|
+
filesToLoad = src;
|
|
593
|
+
}
|
|
594
|
+
// When assigned from codegen the src is a stringified array
|
|
595
|
+
else if (src.startsWith("[") && src.endsWith("]")) {
|
|
596
|
+
filesToLoad = JSON.parse(src);
|
|
597
|
+
}
|
|
598
|
+
// src.toString for an array produces a comma separated list
|
|
599
|
+
else if (src.includes(",")) {
|
|
600
|
+
filesToLoad = src.split(",");
|
|
601
|
+
}
|
|
602
|
+
else filesToLoad = [src];
|
|
603
|
+
|
|
604
|
+
// filter out invalid or empty strings
|
|
605
|
+
for (let i = filesToLoad.length - 1; i >= 0; i--) {
|
|
606
|
+
const file = filesToLoad[i];
|
|
607
|
+
if (file === "null" || file === "undefined" || file?.length <= 0)
|
|
608
|
+
filesToLoad.splice(i, 1);
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
return filesToLoad;
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
private checkIfSourceHasChanged(current: Array<string> | null, previous: Array<string> | null): boolean {
|
|
615
|
+
if (current?.length !== previous?.length) return true;
|
|
616
|
+
if (current == null && previous !== null) return true;
|
|
617
|
+
if (current !== null && previous == null) return true;
|
|
618
|
+
if (current !== null && previous !== null) {
|
|
619
|
+
for (let i = 0; i < current?.length; i++) {
|
|
620
|
+
if (current[i] !== previous[i]) return true;
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
return false;
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
private _previouslyRegisteredMap: Map<string, Function> = new Map();
|
|
627
|
+
private ensureLoadStartIsRegistered() {
|
|
628
|
+
const attributeValue = this.getAttribute("loadstart");
|
|
629
|
+
if (attributeValue)
|
|
630
|
+
this.registerEventFromAttribute("loadstart", attributeValue);
|
|
631
|
+
}
|
|
632
|
+
private registerEventFromAttribute(eventName: string, code: string) {
|
|
633
|
+
const prev = this._previouslyRegisteredMap.get(eventName);
|
|
634
|
+
if (prev) {
|
|
635
|
+
this._previouslyRegisteredMap.delete(eventName);
|
|
636
|
+
this.removeEventListener(eventName, prev as any);
|
|
637
|
+
}
|
|
638
|
+
if (typeof code === "string" && code.length > 0) {
|
|
639
|
+
try {
|
|
640
|
+
// indirect eval https://esbuild.github.io/content-types/#direct-eval
|
|
641
|
+
const fn = (0, eval)(code);
|
|
642
|
+
// const fn = new Function(newValue);
|
|
643
|
+
if (typeof fn === "function") {
|
|
644
|
+
this._previouslyRegisteredMap.set(eventName, fn);
|
|
645
|
+
this.addEventListener(eventName, evt => fn?.call(globalThis, this._context, evt));
|
|
646
|
+
}
|
|
647
|
+
}
|
|
648
|
+
catch (err) {
|
|
649
|
+
console.error("Error registering event " + eventName + "=\"" + code + "\" failed with the following error:\n", err);
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
private setPublicKey() {
|
|
655
|
+
if (PUBLIC_KEY && PUBLIC_KEY.length > 0)
|
|
656
|
+
this.setAttribute("public-key", PUBLIC_KEY);
|
|
657
|
+
}
|
|
658
|
+
private setVersion() {
|
|
659
|
+
if (VERSION && VERSION.length > 0) {
|
|
660
|
+
this.setAttribute("version", VERSION);
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
/**
|
|
665
|
+
* @internal
|
|
666
|
+
*/
|
|
667
|
+
getAROverlayContainer(): HTMLElement {
|
|
668
|
+
return this._overlay_ar.createOverlayContainer(this);
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
/**
|
|
672
|
+
* @internal
|
|
673
|
+
*/
|
|
674
|
+
getVROverlayContainer(): HTMLElement | null {
|
|
675
|
+
for (let i = 0; i < this.children.length; i++) {
|
|
676
|
+
const ch = this.children[i] as HTMLElement;
|
|
677
|
+
if (ch.classList.contains("vr"))
|
|
678
|
+
return ch;
|
|
679
|
+
}
|
|
680
|
+
return null;
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
/**
|
|
684
|
+
* @internal
|
|
685
|
+
*/
|
|
686
|
+
onEnterAR(session: XRSession) {
|
|
687
|
+
this.onSetupAR();
|
|
688
|
+
const overlayContainer = this.getAROverlayContainer();
|
|
689
|
+
this._overlay_ar.onBegin(this._context!, overlayContainer, session);
|
|
690
|
+
this.dispatchEvent(new CustomEvent("enter-ar", { detail: { session: session, context: this._context, htmlContainer: this._overlay_ar?.ARContainer } }));
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
/**
|
|
694
|
+
* @internal
|
|
695
|
+
*/
|
|
696
|
+
onExitAR(session: XRSession) {
|
|
697
|
+
this._overlay_ar.onEnd(this._context!);
|
|
698
|
+
this.onSetupDesktop();
|
|
699
|
+
this.dispatchEvent(new CustomEvent("exit-ar", { detail: { session: session, context: this._context, htmlContainer: this._overlay_ar?.ARContainer } }));
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
/**
|
|
703
|
+
* @internal
|
|
704
|
+
*/
|
|
705
|
+
onEnterVR(session: XRSession) {
|
|
706
|
+
this.onSetupVR();
|
|
707
|
+
this.dispatchEvent(new CustomEvent("enter-vr", { detail: { session: session, context: this._context } }));
|
|
708
|
+
}
|
|
709
|
+
|
|
710
|
+
/**
|
|
711
|
+
* @internal
|
|
712
|
+
*/
|
|
713
|
+
onExitVR(session: XRSession) {
|
|
714
|
+
this.onSetupDesktop();
|
|
715
|
+
this.dispatchEvent(new CustomEvent("exit-vr", { detail: { session: session, context: this._context } }));
|
|
716
|
+
}
|
|
717
|
+
|
|
718
|
+
private onSetupAR() {
|
|
719
|
+
this.classList.add(arSessionActiveClassName);
|
|
720
|
+
this.classList.remove(desktopSessionActiveClassName);
|
|
721
|
+
const arContainer = this.getAROverlayContainer();
|
|
722
|
+
if (debug) console.warn("onSetupAR:", arContainer)
|
|
723
|
+
if (arContainer) {
|
|
724
|
+
arContainer.classList.add(arSessionActiveClassName);
|
|
725
|
+
arContainer.classList.remove(desktopSessionActiveClassName);
|
|
726
|
+
}
|
|
727
|
+
this.foreachHtmlElement(ch => this.setupElementsForMode(ch, arContainerClassName));
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
private onSetupVR() {
|
|
731
|
+
this.classList.remove(arSessionActiveClassName);
|
|
732
|
+
this.classList.remove(desktopSessionActiveClassName);
|
|
733
|
+
this.foreachHtmlElement(ch => this.setupElementsForMode(ch, vrContainerClassName));
|
|
734
|
+
}
|
|
735
|
+
|
|
736
|
+
private onSetupDesktop() {
|
|
737
|
+
this.classList.remove(arSessionActiveClassName);
|
|
738
|
+
this.classList.add(desktopSessionActiveClassName);
|
|
739
|
+
const arContainer = this.getAROverlayContainer();
|
|
740
|
+
if (arContainer) {
|
|
741
|
+
arContainer.classList.remove(arSessionActiveClassName);
|
|
742
|
+
arContainer.classList.add(desktopSessionActiveClassName);
|
|
743
|
+
}
|
|
744
|
+
this.foreachHtmlElement(ch => this.setupElementsForMode(ch, desktopContainerClassname));
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
private setupElementsForMode(el: HTMLElement, currentSessionType: string, _session: XRSession | null = null) {
|
|
748
|
+
if (el === this._context?.renderer?.domElement) return;
|
|
749
|
+
if (el.id === "VRButton" || el.id === "ARButton") return;
|
|
750
|
+
|
|
751
|
+
const classList = el.classList;
|
|
752
|
+
if (classList.contains(currentSessionType)) {
|
|
753
|
+
el.style.visibility = "visible";
|
|
754
|
+
if (el.style.display === "none")
|
|
755
|
+
el.style.display = "block";
|
|
756
|
+
}
|
|
757
|
+
else {
|
|
758
|
+
// only modify style for elements that have a known class (e.g. marked as vr ar desktop)
|
|
759
|
+
for (const known of knownClasses) {
|
|
760
|
+
if (el.classList.contains(known)) {
|
|
761
|
+
el.style.visibility = "hidden";
|
|
762
|
+
el.style.display = "none";
|
|
763
|
+
}
|
|
764
|
+
}
|
|
765
|
+
}
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
private foreachHtmlElement(cb: (HTMLElement) => void) {
|
|
769
|
+
for (let i = 0; i < this.children.length; i++) {
|
|
770
|
+
const ch = this.children[i] as HTMLElement;
|
|
771
|
+
if (ch.style) cb(ch);
|
|
772
|
+
}
|
|
773
|
+
}
|
|
774
|
+
|
|
775
|
+
private onBeforeBeginLoading() {
|
|
776
|
+
const customDracoDecoderPath = this.getAttribute("dracoDecoderPath");
|
|
777
|
+
if (customDracoDecoderPath) {
|
|
778
|
+
if (debug) console.log("using custom draco decoder path", customDracoDecoderPath);
|
|
779
|
+
setDracoDecoderPath(customDracoDecoderPath);
|
|
780
|
+
}
|
|
781
|
+
const customDracoDecoderType = this.getAttribute("dracoDecoderType");
|
|
782
|
+
if (customDracoDecoderType) {
|
|
783
|
+
if (debug) console.log("using custom draco decoder type", customDracoDecoderType);
|
|
784
|
+
setDracoDecoderType(customDracoDecoderType);
|
|
785
|
+
}
|
|
786
|
+
const customKtx2DecoderPath = this.getAttribute("ktx2DecoderPath");
|
|
787
|
+
if (customKtx2DecoderPath) {
|
|
788
|
+
if (debug) console.log("using custom ktx2 decoder path", customKtx2DecoderPath);
|
|
789
|
+
setKtx2TranscoderPath(customKtx2DecoderPath);
|
|
790
|
+
}
|
|
791
|
+
}
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
if (typeof window !== "undefined" && !window.customElements.get(htmlTagName))
|
|
795
|
+
window.customElements.define(htmlTagName, NeedleEngineWebComponent);
|
|
796
|
+
|
|
797
|
+
|
|
798
|
+
|
|
799
|
+
|
|
800
|
+
|
|
801
|
+
|
|
802
|
+
function getDisplayName(str: string) {
|
|
803
|
+
if (str.startsWith("blob:")) {
|
|
804
|
+
return "blob";
|
|
805
|
+
}
|
|
806
|
+
const parts = str.split("/");
|
|
807
|
+
let name = parts[parts.length - 1];
|
|
808
|
+
// Remove params
|
|
809
|
+
const paramsIndex = name.indexOf("?")
|
|
810
|
+
if (paramsIndex > 0)
|
|
811
|
+
name = name.substring(0, paramsIndex);
|
|
812
|
+
|
|
813
|
+
const equalSign = name.indexOf("=");
|
|
814
|
+
if (equalSign > 0)
|
|
815
|
+
name = name.substring(equalSign);
|
|
816
|
+
|
|
817
|
+
const extension = name.split(".").pop();
|
|
818
|
+
const extensions = ["glb", "gltf", "usdz", "usd", "fbx", "obj", "mtl"];
|
|
819
|
+
const matchedIndex = !extension ? -1 : extensions.indexOf(extension.toLowerCase());
|
|
820
|
+
if (extension && matchedIndex >= 0) {
|
|
821
|
+
name = name.substring(0, name.length - extension.length - 1);
|
|
822
|
+
}
|
|
823
|
+
name = decodeURIComponent(name);
|
|
824
|
+
if (name.length > 3) {
|
|
825
|
+
let displayName = "";
|
|
826
|
+
let lastCharacterWasSpace = false;
|
|
827
|
+
const ignoredCharacters = ["(", ")", "[", "]", "{", "}", ":", ";", ",", ".", "!", "?"];
|
|
828
|
+
for (let i = 0; i < name.length; i++) {
|
|
829
|
+
let c = name[i];
|
|
830
|
+
if (c === "_" || c === "-") c = " ";
|
|
831
|
+
if (c === ' ' && displayName.length <= 0) continue;
|
|
832
|
+
const isIgnored = ignoredCharacters.includes(c);
|
|
833
|
+
if (isIgnored) continue;
|
|
834
|
+
const isFirstCharacter = displayName.length === 0;
|
|
835
|
+
|
|
836
|
+
if (isFirstCharacter) {
|
|
837
|
+
c = c.toUpperCase();
|
|
838
|
+
}
|
|
839
|
+
if (lastCharacterWasSpace && c === " ") {
|
|
840
|
+
continue;
|
|
841
|
+
}
|
|
842
|
+
if (lastCharacterWasSpace) {
|
|
843
|
+
c = c.toUpperCase();
|
|
844
|
+
}
|
|
845
|
+
|
|
846
|
+
lastCharacterWasSpace = false;
|
|
847
|
+
displayName += c;
|
|
848
|
+
|
|
849
|
+
if (c === " ") {
|
|
850
|
+
lastCharacterWasSpace = true;
|
|
851
|
+
}
|
|
852
|
+
}
|
|
853
|
+
|
|
854
|
+
if (isDevEnvironment() && name !== displayName)
|
|
855
|
+
console.debug("Generated display name: \"" + name + "\" → \"" + displayName + "\"");
|
|
856
|
+
return displayName.trim();
|
|
857
|
+
}
|
|
858
|
+
if (isDevEnvironment())
|
|
859
|
+
console.debug("Loading: use default name", name);
|
|
860
|
+
return name;
|
|
861
861
|
}
|