@needle-tools/engine 3.28.6-beta → 3.28.7-beta.1
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 +2259 -2253
- package/LICENSE.md +10 -10
- package/README.md +52 -52
- package/dist/needle-engine.js +7 -10
- package/dist/needle-engine.light.js +7 -10
- package/dist/needle-engine.light.min.js +7 -10
- package/dist/needle-engine.light.umd.cjs +7 -10
- package/dist/needle-engine.min.js +7 -10
- package/dist/needle-engine.umd.cjs +7 -10
- package/lib/engine/api.d.ts +52 -52
- package/lib/engine/api.js +51 -51
- package/lib/engine/assets/index.d.ts +1 -1
- package/lib/engine/assets/index.js +4 -4
- package/lib/engine/codegen/register_types.d.ts +1 -1
- package/lib/engine/codegen/register_types.js +439 -439
- package/lib/engine/debug/debug.d.ts +12 -12
- package/lib/engine/debug/debug.js +26 -26
- package/lib/engine/debug/debug_console.d.ts +2 -2
- package/lib/engine/debug/debug_console.js +204 -204
- package/lib/engine/debug/debug_overlay.d.ts +10 -10
- package/lib/engine/debug/debug_overlay.js +277 -277
- package/lib/engine/debug/index.d.ts +1 -1
- package/lib/engine/debug/index.js +1 -1
- package/lib/engine/engine_addressables.d.ts +75 -75
- package/lib/engine/engine_addressables.js +441 -441
- package/lib/engine/engine_application.d.ts +19 -19
- package/lib/engine/engine_application.js +45 -45
- package/lib/engine/engine_assetdatabase.d.ts +25 -25
- package/lib/engine/engine_assetdatabase.js +341 -341
- package/lib/engine/engine_camera.d.ts +6 -6
- package/lib/engine/engine_camera.js +23 -23
- package/lib/engine/engine_components.d.ts +17 -17
- package/lib/engine/engine_components.js +273 -273
- package/lib/engine/engine_components_internal.d.ts +11 -11
- package/lib/engine/engine_components_internal.js +41 -41
- package/lib/engine/engine_constants.d.ts +5 -5
- package/lib/engine/engine_constants.js +32 -32
- package/lib/engine/engine_context.d.ts +269 -269
- package/lib/engine/engine_context.js +1242 -1242
- package/lib/engine/engine_context_registry.d.ts +50 -50
- package/lib/engine/engine_context_registry.js +89 -89
- package/lib/engine/engine_coroutine.d.ts +4 -4
- package/lib/engine/engine_coroutine.js +21 -21
- package/lib/engine/engine_create_objects.d.ts +13 -13
- package/lib/engine/engine_create_objects.js +33 -33
- 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 +17 -17
- package/lib/engine/engine_editor-sync.js +7 -7
- package/lib/engine/engine_element.d.ts +55 -55
- package/lib/engine/engine_element.js +559 -559
- package/lib/engine/engine_element_attributes.d.ts +49 -49
- package/lib/engine/engine_element_attributes.js +1 -1
- package/lib/engine/engine_element_extras.d.ts +6 -6
- package/lib/engine/engine_element_extras.js +13 -13
- package/lib/engine/engine_element_loading.d.ts +40 -40
- package/lib/engine/engine_element_loading.js +312 -312
- package/lib/engine/engine_element_overlay.d.ts +19 -19
- package/lib/engine/engine_element_overlay.js +143 -143
- package/lib/engine/engine_fileloader.d.ts +3 -3
- package/lib/engine/engine_fileloader.js +7 -7
- package/lib/engine/engine_gameobject.d.ts +39 -39
- package/lib/engine/engine_gameobject.js +559 -559
- 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 +26 -26
- package/lib/engine/engine_gizmos.js +282 -282
- package/lib/engine/engine_gltf.d.ts +13 -13
- package/lib/engine/engine_gltf.js +15 -15
- package/lib/engine/engine_gltf_builtin_components.d.ts +7 -7
- package/lib/engine/engine_gltf_builtin_components.js +298 -298
- package/lib/engine/engine_hot_reload.d.ts +5 -5
- package/lib/engine/engine_hot_reload.js +182 -182
- package/lib/engine/engine_input.d.ts +129 -129
- package/lib/engine/engine_input.js +799 -799
- 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 +16 -16
- package/lib/engine/engine_instancing.js +36 -36
- package/lib/engine/engine_license.d.ts +4 -4
- package/lib/engine/engine_license.js +398 -398
- package/lib/engine/engine_lifecycle_api.d.ts +14 -14
- package/lib/engine/engine_lifecycle_api.js +24 -24
- package/lib/engine/engine_lifecycle_functions_internal.d.ts +6 -6
- package/lib/engine/engine_lifecycle_functions_internal.js +28 -28
- package/lib/engine/engine_lightdata.d.ts +23 -23
- package/lib/engine/engine_lightdata.js +86 -86
- package/lib/engine/engine_loaders.d.ts +7 -7
- package/lib/engine/engine_loaders.js +69 -69
- package/lib/engine/engine_mainloop_utils.d.ts +13 -13
- package/lib/engine/engine_mainloop_utils.js +426 -426
- package/lib/engine/engine_math.d.ts +43 -43
- package/lib/engine/engine_math.js +147 -147
- package/lib/engine/engine_networking.d.ts +176 -176
- package/lib/engine/engine_networking.js +649 -649
- package/lib/engine/engine_networking_auto.d.ts +24 -24
- package/lib/engine/engine_networking_auto.js +324 -324
- package/lib/engine/engine_networking_files.d.ts +23 -23
- package/lib/engine/engine_networking_files.js +176 -176
- package/lib/engine/engine_networking_files_default_components.d.ts +3 -3
- package/lib/engine/engine_networking_files_default_components.js +39 -39
- package/lib/engine/engine_networking_instantiate.d.ts +39 -39
- package/lib/engine/engine_networking_instantiate.js +302 -302
- 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 +90 -90
- package/lib/engine/engine_networking_streams.js +428 -428
- package/lib/engine/engine_networking_types.d.ts +14 -14
- 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_patcher.d.ts +10 -10
- package/lib/engine/engine_patcher.js +142 -142
- package/lib/engine/engine_physics.d.ts +115 -115
- package/lib/engine/engine_physics.js +228 -228
- package/lib/engine/engine_physics.types.d.ts +37 -37
- package/lib/engine/engine_physics.types.js +33 -33
- package/lib/engine/engine_physics_rapier.d.ts +112 -112
- package/lib/engine/engine_physics_rapier.js +1266 -1266
- package/lib/engine/engine_playerview.d.ts +26 -26
- package/lib/engine/engine_playerview.js +64 -64
- package/lib/engine/engine_scenelighting.d.ts +74 -74
- package/lib/engine/engine_scenelighting.js +285 -285
- package/lib/engine/engine_scenetools.d.ts +35 -35
- package/lib/engine/engine_scenetools.js +212 -212
- package/lib/engine/engine_serialization.d.ts +4 -4
- package/lib/engine/engine_serialization.js +4 -4
- package/lib/engine/engine_serialization_builtin_serializer.d.ts +62 -62
- package/lib/engine/engine_serialization_builtin_serializer.js +369 -369
- package/lib/engine/engine_serialization_core.d.ts +84 -84
- package/lib/engine/engine_serialization_core.js +576 -576
- package/lib/engine/engine_serialization_decorator.d.ts +15 -15
- package/lib/engine/engine_serialization_decorator.js +54 -54
- package/lib/engine/engine_setup.d.ts +1 -1
- package/lib/engine/engine_setup.js +2 -2
- package/lib/engine/engine_shaders.d.ts +31 -31
- package/lib/engine/engine_shaders.js +229 -229
- package/lib/engine/engine_shims.d.ts +3 -3
- package/lib/engine/engine_shims.js +22 -22
- package/lib/engine/engine_texture.d.ts +20 -20
- package/lib/engine/engine_texture.js +57 -57
- package/lib/engine/engine_three_utils.d.ts +51 -51
- package/lib/engine/engine_three_utils.js +342 -342
- package/lib/engine/engine_time.d.ts +19 -19
- package/lib/engine/engine_time.js +47 -47
- package/lib/engine/engine_types.d.ts +358 -358
- package/lib/engine/engine_types.js +72 -72
- package/lib/engine/engine_typestore.d.ts +16 -16
- package/lib/engine/engine_typestore.js +35 -35
- package/lib/engine/engine_util_decorator.d.ts +12 -12
- package/lib/engine/engine_util_decorator.js +115 -115
- package/lib/engine/engine_utils.d.ts +104 -104
- package/lib/engine/engine_utils.js +518 -518
- package/lib/engine/engine_utils_screenshot.d.ts +10 -10
- package/lib/engine/engine_utils_screenshot.js +70 -70
- package/lib/engine/engine_web_api.d.ts +12 -12
- package/lib/engine/engine_web_api.js +112 -112
- 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 +116 -116
- package/lib/engine/extensions/NEEDLE_animator_controller_model.js +91 -91
- package/lib/engine/extensions/NEEDLE_components.d.ts +33 -33
- package/lib/engine/extensions/NEEDLE_components.js +206 -206
- 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 +38 -38
- package/lib/engine/extensions/NEEDLE_lighting_settings.js +183 -183
- package/lib/engine/extensions/NEEDLE_lightmaps.d.ts +18 -18
- package/lib/engine/extensions/NEEDLE_lightmaps.js +108 -108
- 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 +41 -41
- package/lib/engine/extensions/NEEDLE_progressive.js +366 -366
- 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 +39 -39
- package/lib/engine/extensions/NEEDLE_techniques_webgl.js +544 -544
- 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 +2 -2
- package/lib/engine/extensions/extension_utils.js +140 -140
- package/lib/engine/extensions/extensions.d.ts +21 -21
- package/lib/engine/extensions/extensions.js +94 -94
- package/lib/engine/extensions/index.d.ts +5 -5
- package/lib/engine/extensions/index.js +5 -5
- package/lib/engine/extensions/usage_tracker.d.ts +13 -13
- package/lib/engine/extensions/usage_tracker.js +61 -61
- package/lib/engine/js-extensions/Camera.d.ts +1 -1
- package/lib/engine/js-extensions/Camera.js +36 -36
- package/lib/engine/js-extensions/Layers.d.ts +3 -3
- package/lib/engine/js-extensions/Layers.js +19 -19
- package/lib/engine/js-extensions/index.d.ts +2 -2
- package/lib/engine/js-extensions/index.js +2 -2
- 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-components/AlignmentConstraint.d.ts +10 -10
- package/lib/engine-components/AlignmentConstraint.js +39 -39
- package/lib/engine-components/Animation.d.ts +53 -53
- package/lib/engine-components/Animation.js +333 -333
- package/lib/engine-components/AnimationCurve.d.ts +16 -16
- package/lib/engine-components/AnimationCurve.js +97 -97
- package/lib/engine-components/AnimationUtils.d.ts +8 -8
- package/lib/engine-components/AnimationUtils.js +110 -110
- package/lib/engine-components/Animator.d.ts +81 -81
- package/lib/engine-components/Animator.js +229 -229
- package/lib/engine-components/AnimatorController.d.ts +57 -57
- package/lib/engine-components/AnimatorController.js +887 -887
- package/lib/engine-components/AudioListener.d.ts +7 -7
- package/lib/engine-components/AudioListener.js +30 -30
- package/lib/engine-components/AudioSource.d.ts +61 -61
- package/lib/engine-components/AudioSource.js +422 -422
- package/lib/engine-components/AvatarLoader.d.ts +19 -19
- package/lib/engine-components/AvatarLoader.js +173 -173
- package/lib/engine-components/AxesHelper.d.ts +9 -9
- package/lib/engine-components/AxesHelper.js +44 -44
- package/lib/engine-components/BasicIKConstraint.d.ts +9 -9
- package/lib/engine-components/BasicIKConstraint.js +43 -43
- package/lib/engine-components/BoxHelperComponent.d.ts +16 -16
- package/lib/engine-components/BoxHelperComponent.js +89 -89
- package/lib/engine-components/Camera.d.ts +70 -70
- package/lib/engine-components/Camera.js +450 -450
- package/lib/engine-components/CameraUtils.d.ts +1 -1
- package/lib/engine-components/CameraUtils.js +77 -77
- package/lib/engine-components/CharacterController.d.ts +46 -46
- package/lib/engine-components/CharacterController.js +227 -227
- package/lib/engine-components/Collider.d.ts +46 -46
- package/lib/engine-components/Collider.js +153 -153
- package/lib/engine-components/Component.d.ts +228 -228
- package/lib/engine-components/Component.js +541 -541
- package/lib/engine-components/ContactShadows.d.ts +23 -23
- package/lib/engine-components/ContactShadows.js +233 -233
- package/lib/engine-components/DeleteBox.d.ts +9 -9
- package/lib/engine-components/DeleteBox.js +30 -30
- package/lib/engine-components/DeviceFlag.d.ts +12 -12
- package/lib/engine-components/DeviceFlag.js +43 -43
- package/lib/engine-components/DragControls.d.ts +51 -51
- package/lib/engine-components/DragControls.js +516 -516
- package/lib/engine-components/DropListener.d.ts +15 -15
- package/lib/engine-components/DropListener.js +120 -120
- package/lib/engine-components/Duplicatable.d.ts +16 -16
- package/lib/engine-components/Duplicatable.js +150 -150
- package/lib/engine-components/EventList.d.ts +28 -28
- package/lib/engine-components/EventList.js +105 -105
- package/lib/engine-components/EventTrigger.d.ts +12 -12
- package/lib/engine-components/EventTrigger.js +50 -50
- package/lib/engine-components/EventType.d.ts +19 -19
- package/lib/engine-components/EventType.js +71 -71
- package/lib/engine-components/FlyControls.d.ts +7 -7
- package/lib/engine-components/FlyControls.js +25 -25
- package/lib/engine-components/Fog.d.ts +20 -20
- package/lib/engine-components/Fog.js +60 -60
- package/lib/engine-components/Gizmos.d.ts +12 -12
- package/lib/engine-components/Gizmos.js +60 -60
- package/lib/engine-components/GridHelper.d.ts +12 -12
- package/lib/engine-components/GridHelper.js +47 -47
- package/lib/engine-components/GroundProjection.d.ts +21 -21
- package/lib/engine-components/GroundProjection.js +97 -97
- package/lib/engine-components/Interactable.d.ts +10 -10
- package/lib/engine-components/Interactable.js +11 -11
- package/lib/engine-components/Joints.d.ts +19 -19
- package/lib/engine-components/Joints.js +51 -51
- package/lib/engine-components/LODGroup.d.ts +30 -30
- package/lib/engine-components/LODGroup.js +145 -145
- package/lib/engine-components/Light.d.ts +75 -75
- package/lib/engine-components/Light.js +475 -475
- package/lib/engine-components/LookAtConstraint.d.ts +7 -7
- package/lib/engine-components/LookAtConstraint.js +17 -17
- package/lib/engine-components/NestedGltf.d.ts +11 -11
- package/lib/engine-components/NestedGltf.js +74 -74
- package/lib/engine-components/Networking.d.ts +11 -11
- package/lib/engine-components/Networking.js +70 -70
- package/lib/engine-components/OffsetConstraint.d.ts +14 -14
- package/lib/engine-components/OffsetConstraint.js +65 -65
- package/lib/engine-components/OrbitControls.d.ts +111 -111
- package/lib/engine-components/OrbitControls.js +646 -646
- package/lib/engine-components/ParticleSystem.d.ts +145 -145
- package/lib/engine-components/ParticleSystem.js +1077 -1077
- package/lib/engine-components/ParticleSystemModules.d.ts +489 -489
- package/lib/engine-components/ParticleSystemModules.js +1667 -1667
- package/lib/engine-components/ParticleSystemSubEmitter.d.ts +25 -25
- package/lib/engine-components/ParticleSystemSubEmitter.js +86 -86
- package/lib/engine-components/PlayerColor.d.ts +13 -13
- package/lib/engine-components/PlayerColor.js +83 -83
- package/lib/engine-components/ReflectionProbe.d.ts +22 -22
- package/lib/engine-components/ReflectionProbe.js +181 -181
- package/lib/engine-components/Renderer.d.ts +112 -112
- package/lib/engine-components/Renderer.js +1029 -1029
- package/lib/engine-components/RendererLightmap.d.ts +19 -19
- package/lib/engine-components/RendererLightmap.js +127 -127
- package/lib/engine-components/RigidBody.d.ts +120 -120
- package/lib/engine-components/RigidBody.js +452 -452
- package/lib/engine-components/SceneSwitcher.d.ts +72 -72
- package/lib/engine-components/SceneSwitcher.js +583 -583
- package/lib/engine-components/ScreenCapture.d.ts +64 -64
- package/lib/engine-components/ScreenCapture.js +405 -405
- package/lib/engine-components/ShadowCatcher.d.ts +18 -18
- package/lib/engine-components/ShadowCatcher.js +144 -144
- package/lib/engine-components/Skybox.d.ts +23 -23
- package/lib/engine-components/Skybox.js +287 -287
- package/lib/engine-components/SmoothFollow.d.ts +14 -14
- package/lib/engine-components/SmoothFollow.js +63 -63
- package/lib/engine-components/SpatialTrigger.d.ts +27 -27
- package/lib/engine-components/SpatialTrigger.js +144 -144
- package/lib/engine-components/SpectatorCamera.d.ts +45 -45
- package/lib/engine-components/SpectatorCamera.js +593 -593
- package/lib/engine-components/SpriteRenderer.d.ts +48 -48
- package/lib/engine-components/SpriteRenderer.js +257 -257
- package/lib/engine-components/SyncedCamera.d.ts +27 -27
- package/lib/engine-components/SyncedCamera.js +187 -187
- package/lib/engine-components/SyncedRoom.d.ts +24 -24
- package/lib/engine-components/SyncedRoom.js +162 -162
- package/lib/engine-components/SyncedTransform.d.ts +35 -35
- package/lib/engine-components/SyncedTransform.js +265 -265
- package/lib/engine-components/TestRunner.d.ts +13 -13
- package/lib/engine-components/TestRunner.js +99 -99
- package/lib/engine-components/TransformGizmo.d.ts +16 -16
- package/lib/engine-components/TransformGizmo.js +148 -148
- package/lib/engine-components/VideoPlayer.d.ts +86 -86
- package/lib/engine-components/VideoPlayer.js +792 -792
- package/lib/engine-components/Voip.d.ts +29 -29
- package/lib/engine-components/Voip.js +203 -203
- package/lib/engine-components/XRFlag.d.ts +33 -33
- package/lib/engine-components/XRFlag.js +128 -128
- package/lib/engine-components/api.d.ts +15 -15
- package/lib/engine-components/api.js +15 -15
- package/lib/engine-components/avatar/AvatarBlink_Simple.d.ts +10 -10
- package/lib/engine-components/avatar/AvatarBlink_Simple.js +75 -75
- package/lib/engine-components/avatar/AvatarEyeLook_Rotation.d.ts +13 -13
- package/lib/engine-components/avatar/AvatarEyeLook_Rotation.js +74 -74
- package/lib/engine-components/avatar/Avatar_Brain_LookAt.d.ts +27 -27
- package/lib/engine-components/avatar/Avatar_Brain_LookAt.js +119 -119
- package/lib/engine-components/avatar/Avatar_MouthShapes.d.ts +13 -13
- package/lib/engine-components/avatar/Avatar_MouthShapes.js +78 -78
- package/lib/engine-components/avatar/Avatar_MustacheShake.d.ts +8 -8
- package/lib/engine-components/avatar/Avatar_MustacheShake.js +28 -28
- package/lib/engine-components/codegen/components.d.ts +216 -216
- package/lib/engine-components/codegen/components.js +217 -217
- 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 +25 -25
- package/lib/engine-components/export/gltf/GltfExport.js +215 -215
- 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 +10 -10
- package/lib/engine-components/export/usdz/Extension.js +1 -1
- package/lib/engine-components/export/usdz/ThreeUSDZExporter.d.ts +114 -114
- package/lib/engine-components/export/usdz/ThreeUSDZExporter.js +1211 -1211
- package/lib/engine-components/export/usdz/USDZExporter.d.ts +59 -59
- package/lib/engine-components/export/usdz/USDZExporter.js +450 -450
- package/lib/engine-components/export/usdz/extensions/Animation.d.ts +69 -69
- package/lib/engine-components/export/usdz/extensions/Animation.js +650 -650
- 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/USDZText.d.ts +55 -55
- package/lib/engine-components/export/usdz/extensions/USDZText.js +246 -246
- package/lib/engine-components/export/usdz/extensions/USDZUI.d.ts +8 -8
- package/lib/engine-components/export/usdz/extensions/USDZUI.js +100 -100
- 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 +9 -9
- package/lib/engine-components/export/usdz/extensions/behavior/AudioExtension.js +52 -52
- package/lib/engine-components/export/usdz/extensions/behavior/Behaviour.d.ts +22 -22
- package/lib/engine-components/export/usdz/extensions/behavior/Behaviour.js +134 -134
- package/lib/engine-components/export/usdz/extensions/behavior/BehaviourComponents.d.ts +126 -126
- package/lib/engine-components/export/usdz/extensions/behavior/BehaviourComponents.js +824 -824
- package/lib/engine-components/export/usdz/extensions/behavior/BehavioursBuilder.d.ts +133 -133
- package/lib/engine-components/export/usdz/extensions/behavior/BehavioursBuilder.js +464 -464
- 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 +3 -3
- package/lib/engine-components/export/usdz/utils/animationutils.js +85 -85
- package/lib/engine-components/export/usdz/utils/quicklook.d.ts +2 -2
- package/lib/engine-components/export/usdz/utils/quicklook.js +35 -35
- package/lib/engine-components/export/usdz/utils/timeutils.d.ts +1 -1
- package/lib/engine-components/export/usdz/utils/timeutils.js +14 -14
- package/lib/engine-components/js-extensions/ExtensionUtils.d.ts +6 -6
- package/lib/engine-components/js-extensions/ExtensionUtils.js +65 -65
- package/lib/engine-components/js-extensions/Object3D.d.ts +2 -2
- package/lib/engine-components/js-extensions/Object3D.js +140 -140
- package/lib/engine-components/js-extensions/RGBAColor.d.ts +14 -14
- package/lib/engine-components/js-extensions/RGBAColor.js +49 -49
- package/lib/engine-components/js-extensions/index.d.ts +3 -3
- package/lib/engine-components/js-extensions/index.js +3 -3
- package/lib/engine-components/postprocessing/Effects/Antialiasing.d.ts +13 -13
- package/lib/engine-components/postprocessing/Effects/Antialiasing.js +45 -45
- package/lib/engine-components/postprocessing/Effects/Bloom.d.ts +12 -12
- package/lib/engine-components/postprocessing/Effects/Bloom.js +77 -77
- package/lib/engine-components/postprocessing/Effects/ChromaticAberration.d.ts +8 -8
- package/lib/engine-components/postprocessing/Effects/ChromaticAberration.js +38 -38
- package/lib/engine-components/postprocessing/Effects/ColorAdjustments.d.ts +12 -12
- package/lib/engine-components/postprocessing/Effects/ColorAdjustments.js +81 -81
- package/lib/engine-components/postprocessing/Effects/DepthOfField.d.ts +21 -21
- package/lib/engine-components/postprocessing/Effects/DepthOfField.js +97 -97
- package/lib/engine-components/postprocessing/Effects/Pixelation.d.ts +7 -7
- package/lib/engine-components/postprocessing/Effects/Pixelation.js +28 -28
- package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusion.d.ts +13 -13
- package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusion.js +86 -86
- package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.d.ts +24 -24
- package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.js +94 -94
- package/lib/engine-components/postprocessing/Effects/TiltShiftEffect.d.ts +13 -13
- package/lib/engine-components/postprocessing/Effects/TiltShiftEffect.js +62 -62
- package/lib/engine-components/postprocessing/Effects/Tonemapping.d.ts +16 -16
- package/lib/engine-components/postprocessing/Effects/Tonemapping.js +51 -51
- package/lib/engine-components/postprocessing/Effects/Vignette.d.ts +11 -11
- package/lib/engine-components/postprocessing/Effects/Vignette.js +56 -56
- package/lib/engine-components/postprocessing/PostProcessingEffect.d.ts +33 -33
- package/lib/engine-components/postprocessing/PostProcessingEffect.js +126 -126
- package/lib/engine-components/postprocessing/PostProcessingHandler.d.ts +22 -22
- package/lib/engine-components/postprocessing/PostProcessingHandler.js +201 -201
- package/lib/engine-components/postprocessing/Volume.d.ts +25 -25
- package/lib/engine-components/postprocessing/Volume.js +193 -193
- package/lib/engine-components/postprocessing/VolumeParameter.d.ts +22 -22
- package/lib/engine-components/postprocessing/VolumeParameter.js +80 -80
- package/lib/engine-components/postprocessing/VolumeProfile.d.ts +7 -7
- package/lib/engine-components/postprocessing/VolumeProfile.js +41 -41
- package/lib/engine-components/postprocessing/index.d.ts +4 -4
- package/lib/engine-components/postprocessing/index.js +4 -4
- package/lib/engine-components/timeline/PlayableDirector.d.ts +107 -107
- package/lib/engine-components/timeline/PlayableDirector.js +624 -624
- package/lib/engine-components/timeline/SignalAsset.d.ts +18 -18
- package/lib/engine-components/timeline/SignalAsset.js +124 -124
- package/lib/engine-components/timeline/TimelineModels.d.ts +88 -88
- package/lib/engine-components/timeline/TimelineModels.js +22 -22
- package/lib/engine-components/timeline/TimelineTracks.d.ts +90 -90
- package/lib/engine-components/timeline/TimelineTracks.js +825 -825
- 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 +31 -31
- package/lib/engine-components/ui/BaseUIComponent.js +161 -161
- package/lib/engine-components/ui/Button.d.ts +56 -56
- package/lib/engine-components/ui/Button.js +282 -282
- package/lib/engine-components/ui/Canvas.d.ts +67 -67
- package/lib/engine-components/ui/Canvas.js +382 -382
- package/lib/engine-components/ui/CanvasGroup.d.ts +15 -15
- package/lib/engine-components/ui/CanvasGroup.js +53 -53
- package/lib/engine-components/ui/EventSystem.d.ts +102 -102
- package/lib/engine-components/ui/EventSystem.js +641 -641
- package/lib/engine-components/ui/Graphic.d.ts +45 -45
- package/lib/engine-components/ui/Graphic.js +236 -236
- package/lib/engine-components/ui/Image.d.ts +27 -27
- package/lib/engine-components/ui/Image.js +107 -107
- package/lib/engine-components/ui/InputField.d.ts +34 -34
- package/lib/engine-components/ui/InputField.js +234 -234
- 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 +72 -72
- package/lib/engine-components/ui/Layout.js +318 -318
- 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 +64 -64
- package/lib/engine-components/ui/PointerEvents.js +68 -68
- 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 +18 -18
- package/lib/engine-components/ui/Raycaster.js +69 -69
- package/lib/engine-components/ui/RectTransform.d.ts +61 -61
- package/lib/engine-components/ui/RectTransform.js +343 -343
- package/lib/engine-components/ui/SpatialHtml.d.ts +6 -6
- package/lib/engine-components/ui/SpatialHtml.js +57 -57
- package/lib/engine-components/ui/Text.d.ts +74 -74
- package/lib/engine-components/ui/Text.js +534 -534
- package/lib/engine-components/ui/Utils.d.ts +23 -23
- 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/LookAt.d.ts +13 -13
- package/lib/engine-components/utils/LookAt.js +59 -59
- package/lib/engine-components/utils/OpenURL.d.ts +21 -21
- package/lib/engine-components/utils/OpenURL.js +124 -124
- package/lib/engine-components/webxr/WebARCameraBackground.d.ts +19 -19
- package/lib/engine-components/webxr/WebARCameraBackground.js +193 -193
- package/lib/engine-components/webxr/WebARSessionRoot.d.ts +38 -38
- package/lib/engine-components/webxr/WebARSessionRoot.js +407 -407
- package/lib/engine-components/webxr/WebXR.d.ts +110 -110
- package/lib/engine-components/webxr/WebXR.js +672 -672
- package/lib/engine-components/webxr/WebXRAvatar.d.ts +61 -61
- package/lib/engine-components/webxr/WebXRAvatar.js +289 -289
- package/lib/engine-components/webxr/WebXRController.d.ts +154 -154
- package/lib/engine-components/webxr/WebXRController.js +1028 -1028
- package/lib/engine-components/webxr/WebXRGrabRendering.d.ts +42 -42
- package/lib/engine-components/webxr/WebXRGrabRendering.js +137 -137
- package/lib/engine-components/webxr/WebXRImageTracking.d.ts +49 -49
- package/lib/engine-components/webxr/WebXRImageTracking.js +336 -336
- package/lib/engine-components/webxr/WebXRPlaneTracking.d.ts +49 -49
- package/lib/engine-components/webxr/WebXRPlaneTracking.js +372 -372
- package/lib/engine-components/webxr/WebXRRig.d.ts +4 -4
- package/lib/engine-components/webxr/WebXRRig.js +19 -19
- package/lib/engine-components/webxr/WebXRSync.d.ts +54 -54
- package/lib/engine-components/webxr/WebXRSync.js +410 -410
- package/lib/engine-components/webxr/index.d.ts +4 -4
- package/lib/engine-components/webxr/index.js +4 -4
- 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 +1 -1
- package/lib/engine-components-experimental/api.js +1 -1
- package/lib/engine-components-experimental/networking/PlayerSync.d.ts +50 -50
- package/lib/engine-components-experimental/networking/PlayerSync.js +200 -200
- package/lib/engine-schemes/api.d.ts +1 -1
- package/lib/engine-schemes/api.js +1 -1
- 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/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 +36 -36
- package/lib/engine-schemes/vr-user-state-buffer.js +103 -103
- package/lib/include/three/ARButton.d.ts +3 -3
- package/lib/include/three/ARButton.js +151 -151
- 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/include/three/VRButton.d.ts +5 -5
- package/lib/include/three/VRButton.js +118 -118
- package/lib/needle-engine.d.ts +6 -6
- package/lib/needle-engine.js +49 -49
- package/package.json +1 -1
- package/plugins/common/config.cjs +14 -14
- package/plugins/common/config.js +19 -19
- package/plugins/common/generator.js +10 -10
- package/plugins/common/license.cjs +30 -30
- package/plugins/common/version.js +11 -11
- package/plugins/next/license.cjs +4 -4
- package/plugins/next/next.js +70 -70
- package/plugins/types/index.d.ts +1 -1
- package/plugins/types/needleConfig.d.ts +21 -21
- package/plugins/types/userconfig.d.ts +42 -42
- package/plugins/vite/alias.js +70 -70
- package/plugins/vite/build.js +19 -19
- package/plugins/vite/config.js +73 -73
- package/plugins/vite/copyfiles.js +134 -134
- package/plugins/vite/defines.js +45 -45
- package/plugins/vite/dependency-watcher.js +224 -224
- package/plugins/vite/drop-client.js +76 -76
- package/plugins/vite/drop.js +82 -82
- package/plugins/vite/editor-connection.js +121 -121
- package/plugins/vite/facebook-instant-games.js +99 -99
- package/plugins/vite/gzip.js +5 -5
- package/plugins/vite/imports-logger.js +143 -143
- package/plugins/vite/index.js +81 -81
- package/plugins/vite/license.js +42 -42
- package/plugins/vite/meta.js +149 -149
- package/plugins/vite/peer.js +31 -31
- package/plugins/vite/poster-client.js +59 -59
- package/plugins/vite/poster.js +73 -73
- package/plugins/vite/reload-client.js +15 -15
- package/plugins/vite/reload.js +363 -363
- package/plugins/vite/transform-codegen.js +55 -55
- package/plugins/vite/vite-4.4-hack.js +31 -31
- package/src/engine/api.ts +54 -54
- package/src/engine/assets/index.ts +4 -4
- package/src/engine/codegen/register_types.ts +441 -441
- package/src/engine/debug/debug.ts +29 -29
- package/src/engine/debug/debug_console.ts +213 -213
- package/src/engine/debug/debug_overlay.ts +283 -283
- package/src/engine/engine.ts +13 -13
- package/src/engine/engine_addressables.ts +494 -494
- package/src/engine/engine_application.ts +53 -53
- package/src/engine/engine_assetdatabase.ts +383 -383
- package/src/engine/engine_camera.ts +32 -32
- package/src/engine/engine_components.ts +266 -266
- package/src/engine/engine_components_internal.ts +42 -42
- package/src/engine/engine_constants.ts +42 -42
- package/src/engine/engine_context.ts +1386 -1386
- package/src/engine/engine_context_registry.ts +103 -103
- package/src/engine/engine_coroutine.ts +24 -24
- package/src/engine/engine_create_objects.ts +39 -39
- package/src/engine/engine_default_parameters.ts +3 -3
- package/src/engine/engine_editor-sync.ts +29 -29
- package/src/engine/engine_element.ts +592 -592
- package/src/engine/engine_element_attributes.ts +61 -61
- package/src/engine/engine_element_extras.ts +16 -16
- package/src/engine/engine_element_loading.ts +341 -341
- package/src/engine/engine_element_overlay.ts +160 -160
- package/src/engine/engine_fileloader.js +8 -8
- package/src/engine/engine_gameobject.ts +621 -621
- package/src/engine/engine_generic_utils.js +13 -13
- package/src/engine/engine_gizmos.ts +321 -321
- package/src/engine/engine_gltf.ts +30 -30
- package/src/engine/engine_gltf_builtin_components.ts +350 -350
- package/src/engine/engine_hot_reload.ts +196 -196
- package/src/engine/engine_input.ts +879 -879
- package/src/engine/engine_input_utils.ts +23 -23
- package/src/engine/engine_instancing.ts +42 -42
- package/src/engine/engine_license.ts +413 -413
- package/src/engine/engine_lifecycle_api.ts +29 -29
- package/src/engine/engine_lifecycle_functions_internal.ts +36 -36
- package/src/engine/engine_lightdata.ts +113 -113
- package/src/engine/engine_loaders.ts +77 -77
- package/src/engine/engine_mainloop_utils.ts +431 -431
- package/src/engine/engine_math.ts +174 -174
- package/src/engine/engine_networking.ts +742 -742
- package/src/engine/engine_networking_auto.ts +373 -373
- package/src/engine/engine_networking_files.ts +206 -206
- package/src/engine/engine_networking_files_default_components.ts +54 -54
- package/src/engine/engine_networking_instantiate.ts +362 -362
- package/src/engine/engine_networking_peer.ts +158 -158
- package/src/engine/engine_networking_streams.ts +489 -489
- package/src/engine/engine_networking_types.ts +18 -18
- 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 +287 -287
- package/src/engine/engine_physics.types.ts +43 -43
- package/src/engine/engine_physics_rapier.ts +1385 -1385
- package/src/engine/engine_playerview.ts +79 -79
- package/src/engine/engine_scenelighting.ts +313 -313
- package/src/engine/engine_scenetools.ts +242 -242
- package/src/engine/engine_serialization.ts +6 -6
- package/src/engine/engine_serialization_builtin_serializer.ts +415 -415
- package/src/engine/engine_serialization_core.ts +680 -680
- package/src/engine/engine_serialization_decorator.ts +68 -68
- package/src/engine/engine_setup.ts +1 -1
- package/src/engine/engine_shaders.ts +242 -242
- package/src/engine/engine_shims.ts +28 -28
- package/src/engine/engine_texture.ts +70 -70
- package/src/engine/engine_three_utils.ts +382 -382
- package/src/engine/engine_time.ts +55 -55
- package/src/engine/engine_types.ts +489 -489
- package/src/engine/engine_typestore.ts +41 -41
- package/src/engine/engine_util_decorator.ts +134 -134
- package/src/engine/engine_utils.ts +605 -605
- package/src/engine/engine_utils_screenshot.ts +84 -84
- package/src/engine/engine_web_api.ts +119 -119
- package/src/engine/extensions/EXT_texture_exr.ts +49 -49
- package/src/engine/extensions/NEEDLE_animator_controller_model.ts +193 -193
- package/src/engine/extensions/NEEDLE_components.ts +250 -250
- package/src/engine/extensions/NEEDLE_gameobject_data.ts +82 -82
- package/src/engine/extensions/NEEDLE_lighting_settings.ts +210 -210
- package/src/engine/extensions/NEEDLE_lightmaps.ts +130 -130
- package/src/engine/extensions/NEEDLE_persistent_assets.ts +75 -75
- package/src/engine/extensions/NEEDLE_progressive.ts +412 -412
- package/src/engine/extensions/NEEDLE_render_objects.ts +209 -209
- package/src/engine/extensions/NEEDLE_techniques_webgl.ts +618 -618
- package/src/engine/extensions/extension_resolver.ts +4 -4
- package/src/engine/extensions/extension_utils.ts +149 -149
- package/src/engine/extensions/extensions.ts +118 -118
- package/src/engine/extensions/index.ts +4 -4
- package/src/engine/extensions/usage_tracker.ts +95 -95
- package/src/engine/js-extensions/Camera.ts +34 -34
- package/src/engine/js-extensions/Layers.ts +19 -19
- package/src/engine/js-extensions/index.ts +1 -1
- package/src/engine/shaders/shaderData.ts +67 -67
- package/src/engine/tests/test_utils.ts +63 -63
- package/src/engine-components/AlignmentConstraint.ts +35 -35
- package/src/engine-components/Animation.ts +345 -345
- package/src/engine-components/AnimationCurve.ts +83 -83
- package/src/engine-components/AnimationUtils.ts +117 -117
- package/src/engine-components/Animator.ts +243 -243
- package/src/engine-components/AnimatorController.ts +1020 -1020
- package/src/engine-components/AudioListener.ts +32 -32
- package/src/engine-components/AudioSource.ts +419 -419
- package/src/engine-components/AvatarLoader.ts +204 -204
- package/src/engine-components/AxesHelper.ts +33 -33
- package/src/engine-components/BasicIKConstraint.ts +53 -53
- package/src/engine-components/BoxCollider.ts +1 -1
- package/src/engine-components/BoxHelperComponent.ts +100 -100
- package/src/engine-components/Camera.ts +454 -454
- package/src/engine-components/CameraUtils.ts +89 -89
- package/src/engine-components/CharacterController.ts +243 -243
- package/src/engine-components/Collider.ts +160 -160
- package/src/engine-components/Component.ts +670 -670
- package/src/engine-components/ContactShadows.ts +265 -265
- package/src/engine-components/DeleteBox.ts +35 -35
- package/src/engine-components/DeviceFlag.ts +42 -42
- package/src/engine-components/DragControls.ts +574 -574
- package/src/engine-components/DropListener.ts +112 -112
- package/src/engine-components/Duplicatable.ts +146 -146
- package/src/engine-components/EventList.ts +125 -125
- package/src/engine-components/EventTrigger.ts +47 -47
- package/src/engine-components/EventType.ts +87 -87
- package/src/engine-components/FlyControls.ts +31 -31
- package/src/engine-components/Fog.ts +59 -59
- package/src/engine-components/Gizmos.ts +52 -52
- package/src/engine-components/GridHelper.ts +40 -40
- package/src/engine-components/GroundProjection.ts +97 -97
- package/src/engine-components/Interactable.ts +18 -18
- package/src/engine-components/Joints.ts +51 -51
- package/src/engine-components/LODGroup.ts +145 -145
- package/src/engine-components/Light.ts +493 -493
- package/src/engine-components/LookAtConstraint.ts +11 -11
- package/src/engine-components/NestedGltf.ts +70 -70
- package/src/engine-components/Networking.ts +72 -72
- package/src/engine-components/OffsetConstraint.ts +59 -59
- package/src/engine-components/OrbitControls.ts +653 -653
- package/src/engine-components/ParticleSystem.ts +1192 -1192
- package/src/engine-components/ParticleSystemModules.ts +1481 -1481
- package/src/engine-components/ParticleSystemSubEmitter.ts +110 -110
- package/src/engine-components/PlayerColor.ts +93 -93
- package/src/engine-components/ReflectionProbe.ts +192 -192
- package/src/engine-components/Renderer.ts +1125 -1125
- package/src/engine-components/RendererLightmap.ts +145 -145
- package/src/engine-components/RigidBody.ts +453 -453
- package/src/engine-components/SceneSwitcher.ts +594 -594
- package/src/engine-components/ScreenCapture.ts +437 -437
- package/src/engine-components/ShadowCatcher.ts +149 -149
- package/src/engine-components/Skybox.ts +281 -281
- package/src/engine-components/SmoothFollow.ts +57 -57
- package/src/engine-components/SpatialTrigger.ts +142 -142
- package/src/engine-components/SpectatorCamera.ts +675 -675
- package/src/engine-components/SphereCollider.ts +1 -1
- package/src/engine-components/SpriteRenderer.ts +244 -244
- package/src/engine-components/SyncedCamera.ts +208 -208
- package/src/engine-components/SyncedRoom.ts +166 -166
- package/src/engine-components/SyncedTransform.ts +336 -336
- package/src/engine-components/TestRunner.ts +114 -114
- package/src/engine-components/TransformGizmo.ts +157 -157
- package/src/engine-components/VideoPlayer.ts +831 -831
- package/src/engine-components/Voip.ts +214 -214
- package/src/engine-components/XRFlag.ts +138 -138
- package/src/engine-components/api.ts +22 -22
- package/src/engine-components/avatar/AvatarBlink_Simple.ts +67 -67
- package/src/engine-components/avatar/AvatarEyeLook_Rotation.ts +68 -68
- package/src/engine-components/avatar/Avatar_Brain_LookAt.ts +136 -136
- package/src/engine-components/avatar/Avatar_MouthShapes.ts +81 -81
- package/src/engine-components/avatar/Avatar_MustacheShake.ts +28 -28
- package/src/engine-components/codegen/components.ts +216 -216
- package/src/engine-components/debug/LogStats.ts +21 -21
- package/src/engine-components/export/gltf/GltfExport.ts +231 -231
- package/src/engine-components/export/usdz/Extension.ts +11 -11
- package/src/engine-components/export/usdz/ThreeUSDZExporter.ts +1773 -1773
- package/src/engine-components/export/usdz/USDZExporter.ts +477 -477
- package/src/engine-components/export/usdz/extensions/Animation.ts +774 -774
- package/src/engine-components/export/usdz/extensions/DocumentExtension.ts +9 -9
- package/src/engine-components/export/usdz/extensions/USDZText.ts +287 -287
- package/src/engine-components/export/usdz/extensions/USDZUI.ts +119 -119
- package/src/engine-components/export/usdz/extensions/behavior/Actions.ts +98 -98
- package/src/engine-components/export/usdz/extensions/behavior/AudioExtension.ts +67 -67
- package/src/engine-components/export/usdz/extensions/behavior/Behaviour.ts +202 -202
- package/src/engine-components/export/usdz/extensions/behavior/BehaviourComponents.ts +963 -963
- package/src/engine-components/export/usdz/extensions/behavior/BehavioursBuilder.ts +517 -517
- package/src/engine-components/export/usdz/index.ts +2 -2
- package/src/engine-components/export/usdz/utils/animationutils.ts +100 -100
- package/src/engine-components/export/usdz/utils/quicklook.ts +42 -42
- package/src/engine-components/export/usdz/utils/timeutils.ts +19 -19
- package/src/engine-components/js-extensions/ExtensionUtils.ts +81 -81
- package/src/engine-components/js-extensions/Object3D.ts +181 -181
- package/src/engine-components/js-extensions/RGBAColor.ts +54 -54
- package/src/engine-components/js-extensions/Vector.ts +16 -16
- package/src/engine-components/js-extensions/index.ts +2 -2
- package/src/engine-components/postprocessing/Effects/Antialiasing.ts +51 -51
- package/src/engine-components/postprocessing/Effects/Bloom.ts +76 -76
- package/src/engine-components/postprocessing/Effects/ChromaticAberration.ts +35 -35
- package/src/engine-components/postprocessing/Effects/ColorAdjustments.ts +96 -96
- package/src/engine-components/postprocessing/Effects/DepthOfField.ts +93 -93
- package/src/engine-components/postprocessing/Effects/Pixelation.ts +26 -26
- package/src/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusion.ts +84 -84
- package/src/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.ts +98 -98
- package/src/engine-components/postprocessing/Effects/TiltShiftEffect.ts +55 -55
- package/src/engine-components/postprocessing/Effects/Tonemapping.ts +54 -54
- package/src/engine-components/postprocessing/Effects/Vignette.ts +54 -54
- package/src/engine-components/postprocessing/PostProcessingEffect.ts +148 -148
- package/src/engine-components/postprocessing/PostProcessingHandler.ts +232 -232
- package/src/engine-components/postprocessing/Volume.ts +216 -216
- package/src/engine-components/postprocessing/VolumeParameter.ts +92 -92
- package/src/engine-components/postprocessing/VolumeProfile.ts +40 -40
- package/src/engine-components/postprocessing/index.ts +3 -3
- package/src/engine-components/timeline/PlayableDirector.ts +666 -666
- package/src/engine-components/timeline/SignalAsset.ts +138 -138
- package/src/engine-components/timeline/TimelineModels.ts +93 -93
- package/src/engine-components/timeline/TimelineTracks.ts +906 -906
- package/src/engine-components/timeline/index.ts +3 -3
- package/src/engine-components/ui/BaseUIComponent.ts +195 -195
- package/src/engine-components/ui/Button.ts +283 -283
- package/src/engine-components/ui/Canvas.ts +390 -390
- package/src/engine-components/ui/CanvasGroup.ts +49 -49
- package/src/engine-components/ui/EventSystem.ts +736 -736
- package/src/engine-components/ui/Graphic.ts +255 -255
- package/src/engine-components/ui/Image.ts +102 -102
- package/src/engine-components/ui/InputField.ts +290 -290
- package/src/engine-components/ui/Interfaces.ts +57 -57
- package/src/engine-components/ui/Layout.ts +322 -322
- package/src/engine-components/ui/Outline.ts +12 -12
- package/src/engine-components/ui/PointerEvents.ts +118 -118
- package/src/engine-components/ui/RaycastUtils.ts +68 -68
- package/src/engine-components/ui/Raycaster.ts +73 -73
- package/src/engine-components/ui/RectTransform.ts +364 -364
- package/src/engine-components/ui/SpatialHtml.ts +63 -63
- package/src/engine-components/ui/Text.ts +572 -572
- package/src/engine-components/ui/Utils.ts +110 -110
- package/src/engine-components/utils/LookAt.ts +65 -65
- package/src/engine-components/utils/OpenURL.ts +118 -118
- package/src/engine-components/webxr/WebARCameraBackground.ts +224 -224
- package/src/engine-components/webxr/WebARSessionRoot.ts +446 -446
- package/src/engine-components/webxr/WebXR.ts +761 -761
- package/src/engine-components/webxr/WebXRAvatar.ts +356 -356
- package/src/engine-components/webxr/WebXRController.ts +1168 -1168
- package/src/engine-components/webxr/WebXRGrabRendering.ts +150 -150
- package/src/engine-components/webxr/WebXRImageTracking.ts +371 -371
- package/src/engine-components/webxr/WebXRPlaneTracking.ts +429 -429
- package/src/engine-components/webxr/WebXRRig.ts +21 -21
- package/src/engine-components/webxr/WebXRSync.ts +463 -463
- package/src/engine-components/webxr/index.ts +3 -3
- package/src/engine-components-experimental/Presentation.ts +12 -12
- package/src/engine-components-experimental/networking/PlayerSync.ts +217 -217
- package/src/engine-schemes/COMPILE_SCHEMES.bat +3 -3
- package/src/engine-schemes/COMPILE_TS.bat +11 -11
- package/src/engine-schemes/schemes.ts +27 -27
- 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 +138 -138
- package/src/engine-schemes/vrUserStateBuffer.fbs +16 -16
- package/src/include/draco/draco_decoder.js +34 -34
- package/src/include/draco/draco_wasm_wrapper.js +117 -117
- package/src/include/ktx2/basis_transcoder.js +21 -21
- package/src/include/needle/arial-msdf.json +1471 -1471
- package/src/include/three/ARButton.js +231 -231
- package/src/include/three/DragControls.js +231 -231
- package/src/include/three/EXT_mesh_gpu_instancing_exporter.js +66 -66
- package/src/include/three/VRButton.js +194 -194
- package/src/needle-engine.ts +55 -55
- package/src/engine/dist/api.js +0 -73
- package/src/engine/dist/api.js.meta +0 -7
- package/src/engine/dist/engine_networking_streams.js +0 -474
- package/src/engine/dist/engine_networking_streams.js.meta +0 -7
- package/src/engine-schemes/dist/api.js +0 -17
- package/src/engine-schemes/dist/api.js.meta +0 -7
- package/src/engine-schemes/dist/schemes.js +0 -25
- package/src/engine-schemes/dist/schemes.js.meta +0 -7
- package/src/engine-schemes/dist/synced-camera-model.js +0 -74
- package/src/engine-schemes/dist/synced-camera-model.js.meta +0 -7
- package/src/engine-schemes/dist/synced-transform-model.js +0 -73
- package/src/engine-schemes/dist/synced-transform-model.js.meta +0 -7
- package/src/engine-schemes/dist/transform.js +0 -46
- package/src/engine-schemes/dist/transform.js.meta +0 -7
- package/src/engine-schemes/dist/vec2.js +0 -32
- package/src/engine-schemes/dist/vec2.js.meta +0 -7
- package/src/engine-schemes/dist/vec3.js +0 -36
- package/src/engine-schemes/dist/vec3.js.meta +0 -7
- package/src/engine-schemes/dist/vec4.js +0 -40
- package/src/engine-schemes/dist/vec4.js.meta +0 -7
- package/src/engine-schemes/dist/vr-user-state-buffer.js +0 -110
- package/src/engine-schemes/dist/vr-user-state-buffer.js.meta +0 -7
- package/src/engine-schemes/flatc.exe +0 -0
|
@@ -1,594 +1,594 @@
|
|
|
1
|
-
import { AssetReference } from "../engine/engine_addressables.js";
|
|
2
|
-
import { InputEvents } from "../engine/engine_input.js";
|
|
3
|
-
import { isLocalNetwork } from "../engine/engine_networking_utils.js";
|
|
4
|
-
import { delay, getParam, setParamWithoutReload } from "../engine/engine_utils.js";
|
|
5
|
-
import { serializable } from "../engine/engine_serialization.js";
|
|
6
|
-
import { Behaviour, GameObject } from "./Component.js";
|
|
7
|
-
import { registerObservableAttribute } from "../engine/engine_element_extras.js";
|
|
8
|
-
import { Object3D } from "three";
|
|
9
|
-
|
|
10
|
-
const debug = getParam("debugsceneswitcher");
|
|
11
|
-
|
|
12
|
-
const ENGINE_ELEMENT_SCENE_ATTRIBUTE_NAME = "scene";
|
|
13
|
-
registerObservableAttribute(ENGINE_ELEMENT_SCENE_ATTRIBUTE_NAME);
|
|
14
|
-
|
|
15
|
-
// ContextRegistry.registerCallback(ContextEvent.ContextRegistered, async _ => {
|
|
16
|
-
// // We need to defer import to not get issues with circular dependencies
|
|
17
|
-
// import("../engine/engine_element").then(res => {
|
|
18
|
-
// const webcomponent = res.NeedleEngineHTMLElement;
|
|
19
|
-
// if (debug) console.log("SceneSwitcher: registering scene attribute", webcomponent.observedAttributes);
|
|
20
|
-
// if (!webcomponent.observedAttributes.includes(ENGINE_ELEMENT_SCENE_ATTRIBUTE_NAME))
|
|
21
|
-
// webcomponent.observedAttributes.push(ENGINE_ELEMENT_SCENE_ATTRIBUTE_NAME);
|
|
22
|
-
// });
|
|
23
|
-
// });
|
|
24
|
-
|
|
25
|
-
const couldNotLoadScenePromise = Promise.resolve(false);
|
|
26
|
-
|
|
27
|
-
export type LoadSceneEvent = {
|
|
28
|
-
switcher: SceneSwitcher;
|
|
29
|
-
scene: AssetReference;
|
|
30
|
-
index: number;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/** The ISceneEventListener is called by the SceneSwitcher when a scene is loaded or unloaded. It must be added to the root object of your scene */
|
|
34
|
-
export interface ISceneEventListener {
|
|
35
|
-
/** Called when the scene is loaded and added */
|
|
36
|
-
sceneOpened?(): Promise<void>
|
|
37
|
-
/** Called before the scene is being removed (due to another scene being loaded) */
|
|
38
|
-
sceneClosing?(): Promise<void>
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export class SceneSwitcher extends Behaviour {
|
|
42
|
-
|
|
43
|
-
@serializable(AssetReference)
|
|
44
|
-
scenes!: AssetReference[];
|
|
45
|
-
|
|
46
|
-
@serializable(AssetReference)
|
|
47
|
-
loadingScene!: AssetReference;
|
|
48
|
-
|
|
49
|
-
/** the url parameter that is set/used to store the currently loaded scene in, set to "" to disable */
|
|
50
|
-
@serializable()
|
|
51
|
-
queryParameterName: string = "scene";
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* when enabled the scene name will be used as the query parameter (otherwise the scene index will be used)
|
|
55
|
-
* Needs `queryParameterName` set
|
|
56
|
-
* */
|
|
57
|
-
@serializable()
|
|
58
|
-
useSceneName: boolean = true;
|
|
59
|
-
|
|
60
|
-
@serializable()
|
|
61
|
-
clamp: boolean = true;
|
|
62
|
-
|
|
63
|
-
/** when enabled the new scene is pushed to the browser navigation history, only works with a valid query parameter set */
|
|
64
|
-
@serializable()
|
|
65
|
-
useHistory: boolean = true;
|
|
66
|
-
|
|
67
|
-
/** when enabled you can switch between scenes using keyboard left, right, A and D or number keys */
|
|
68
|
-
@serializable()
|
|
69
|
-
useKeyboard: boolean = true;
|
|
70
|
-
|
|
71
|
-
/** when enabled you can switch between scenes using swipe (mobile only) */
|
|
72
|
-
@serializable()
|
|
73
|
-
useSwipe: boolean = true;
|
|
74
|
-
|
|
75
|
-
/** when enabled will automatically apply the environment scene lights */
|
|
76
|
-
@serializable()
|
|
77
|
-
useSceneLighting: boolean = true;
|
|
78
|
-
|
|
79
|
-
/** how many scenes after the currently active scene should be preloaded */
|
|
80
|
-
@serializable()
|
|
81
|
-
preloadNext: number = 1;
|
|
82
|
-
|
|
83
|
-
/** how many scenes before the currently active scene should be preloaded */
|
|
84
|
-
@serializable()
|
|
85
|
-
preloadPrevious: number = 1;
|
|
86
|
-
|
|
87
|
-
/** how many scenes can be loaded in parallel */
|
|
88
|
-
@serializable()
|
|
89
|
-
preloadConcurrent: number = 2;
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
get currentIndex(): number { return this._currentIndex; }
|
|
93
|
-
|
|
94
|
-
private _currentIndex: number = -1;
|
|
95
|
-
private _currentScene: AssetReference | undefined = undefined;
|
|
96
|
-
private _engineElementOverserver: MutationObserver | undefined = undefined;
|
|
97
|
-
|
|
98
|
-
private _preloadScheduler?: PreLoadScheduler;
|
|
99
|
-
|
|
100
|
-
awake(): void {
|
|
101
|
-
if (debug) console.log("SceneSwitcher", this);
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
async start() {
|
|
105
|
-
if (this._currentIndex === -1 && !await this.tryLoadFromQueryParam()) {
|
|
106
|
-
const value = this.context.domElement.getAttribute(ENGINE_ELEMENT_SCENE_ATTRIBUTE_NAME);
|
|
107
|
-
// let locked = this.lock;
|
|
108
|
-
try {
|
|
109
|
-
// this.lock = false;
|
|
110
|
-
if (value === null || !await this.trySelectSceneFromValue(value)) {
|
|
111
|
-
if (this._currentIndex === -1)
|
|
112
|
-
this.select(0);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
finally {
|
|
116
|
-
// this.lock = locked;
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
onEnable(): void {
|
|
122
|
-
globalThis.addEventListener("popstate", this.onPopState);
|
|
123
|
-
this.context.input.addEventListener(InputEvents.KeyDown, this.onKeyDown);
|
|
124
|
-
this.context.input.addEventListener(InputEvents.PointerMove, this.onPointerMove);
|
|
125
|
-
this.context.input.addEventListener(InputEvents.PointerUp, this.onPointerUp);
|
|
126
|
-
|
|
127
|
-
if (!this._engineElementOverserver) {
|
|
128
|
-
this._engineElementOverserver = new MutationObserver((mutations) => {
|
|
129
|
-
for (const mut of mutations) {
|
|
130
|
-
if (mut.type === "attributes" && mut.attributeName === ENGINE_ELEMENT_SCENE_ATTRIBUTE_NAME) {
|
|
131
|
-
const value = this.context.domElement.getAttribute(ENGINE_ELEMENT_SCENE_ATTRIBUTE_NAME);
|
|
132
|
-
if (value !== null) {
|
|
133
|
-
this.trySelectSceneFromValue(value);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
this._engineElementOverserver.observe(this.context.domElement, {
|
|
141
|
-
attributes: true
|
|
142
|
-
});
|
|
143
|
-
|
|
144
|
-
if (!this._preloadScheduler)
|
|
145
|
-
this._preloadScheduler = new PreLoadScheduler(this);
|
|
146
|
-
this._preloadScheduler.maxLoadAhead = this.preloadNext;
|
|
147
|
-
this._preloadScheduler.maxLoadBehind = this.preloadPrevious;
|
|
148
|
-
this._preloadScheduler.maxConcurrent = this.preloadConcurrent;
|
|
149
|
-
this._preloadScheduler.begin();
|
|
150
|
-
|
|
151
|
-
// Begin loading the loading scene
|
|
152
|
-
// if (this.loadingScene) this.loadingScene.loadAssetAsync();
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
onDisable(): void {
|
|
156
|
-
globalThis.removeEventListener("popstate", this.onPopState);
|
|
157
|
-
this.context.input.removeEventListener(InputEvents.KeyDown, this.onKeyDown);
|
|
158
|
-
this.context.input.removeEventListener(InputEvents.PointerMove, this.onPointerMove);
|
|
159
|
-
this.context.input.removeEventListener(InputEvents.PointerUp, this.onPointerUp);
|
|
160
|
-
this._preloadScheduler?.stop();
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
private onPopState = async (_state: PopStateEvent) => {
|
|
164
|
-
if (!this.useHistory) return;
|
|
165
|
-
const wasUsingHistory = this.useHistory;
|
|
166
|
-
try {
|
|
167
|
-
this.useHistory = false;
|
|
168
|
-
let didResolve = false;
|
|
169
|
-
if (this.queryParameterName)
|
|
170
|
-
didResolve = await this.tryLoadFromQueryParam();
|
|
171
|
-
if (!didResolve) {
|
|
172
|
-
const state = _state?.state;
|
|
173
|
-
if (state && state.startsWith(this.guid)) {
|
|
174
|
-
const value = state.substr(this.guid.length + 2);
|
|
175
|
-
if (debug) console.log("PopState", value);
|
|
176
|
-
await this.trySelectSceneFromValue(value);
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
finally {
|
|
181
|
-
this.useHistory = wasUsingHistory;
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
private normalizedSwipeThresholdX = 0.1;
|
|
186
|
-
private _didSwipe: boolean = false;
|
|
187
|
-
private onPointerMove = (e: any) => {
|
|
188
|
-
if (!this.useSwipe) return;
|
|
189
|
-
if (!this._didSwipe && e.button === 0 && e.pointerType === "touch" && this.context.input.getPointerPressedCount() === 1) {
|
|
190
|
-
const delta = this.context.input.getPointerPositionDelta(e.button);
|
|
191
|
-
if (delta) {
|
|
192
|
-
const normalizedX = delta.x / this.context.domWidth;
|
|
193
|
-
if (normalizedX >= this.normalizedSwipeThresholdX) {
|
|
194
|
-
this._didSwipe = true;
|
|
195
|
-
this.selectPrev();
|
|
196
|
-
}
|
|
197
|
-
else if (normalizedX <= -this.normalizedSwipeThresholdX) {
|
|
198
|
-
this._didSwipe = true;
|
|
199
|
-
this.selectNext();
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
private onPointerUp = (e: any) => {
|
|
206
|
-
if (e.button === 0) {
|
|
207
|
-
this._didSwipe = false;
|
|
208
|
-
}
|
|
209
|
-
};
|
|
210
|
-
|
|
211
|
-
private onKeyDown = (e: any) => {
|
|
212
|
-
if (!this.useKeyboard) return;
|
|
213
|
-
if (!this.scenes) return;
|
|
214
|
-
const key = e.key.toLowerCase();
|
|
215
|
-
if (!key) return;
|
|
216
|
-
const index = parseInt(key) - 1;
|
|
217
|
-
if (index >= 0) {
|
|
218
|
-
this.trySelectSceneFromValue(index);
|
|
219
|
-
return;
|
|
220
|
-
}
|
|
221
|
-
switch (key) {
|
|
222
|
-
case "arrowright":
|
|
223
|
-
case "d":
|
|
224
|
-
this.selectNext();
|
|
225
|
-
break;
|
|
226
|
-
case "arrowleft":
|
|
227
|
-
case "a":
|
|
228
|
-
this.selectPrev();
|
|
229
|
-
break;
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
selectNext(): Promise<boolean> {
|
|
234
|
-
return this.select(this._currentIndex + 1);
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
selectPrev(): Promise<boolean> {
|
|
238
|
-
return this.select(this._currentIndex - 1);
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
select(index: number | string): Promise<boolean> {
|
|
242
|
-
if (debug) console.log("select", index);
|
|
243
|
-
|
|
244
|
-
if (typeof index === "object") {
|
|
245
|
-
// If a user tries to reference a scene object in a UnityEvent and invoke select(obj)
|
|
246
|
-
// Then the object will be serialized as a object { guid : ... } or with the index json pointer
|
|
247
|
-
// This case is not supported right now. Object references in the editor must not be scene references
|
|
248
|
-
console.warn("Switching to \"" + index + "\" might not work. Please either use an index or a AssetReference (not a scene reference)");
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
if (typeof index === "string") {
|
|
252
|
-
// If the parameter is a string we try to resolve the scene by its uri
|
|
253
|
-
// it's either already known in the scenes array
|
|
254
|
-
// or we create/get a new AssetReference and try to switch to that
|
|
255
|
-
const scene = this.scenes?.find(s => s.uri === index);
|
|
256
|
-
if (!scene) {
|
|
257
|
-
// Ok the scene is unknown to the scene switcher
|
|
258
|
-
// we create a new asset reference (or get an existing one)
|
|
259
|
-
// And switch to that. With this we can not modify the history
|
|
260
|
-
// Until the scene switcher can store the uri in the history instead of the index
|
|
261
|
-
const reference = AssetReference.getOrCreate(this.sourceId ?? "", index, this.context);
|
|
262
|
-
return this.switchScene(reference);
|
|
263
|
-
}
|
|
264
|
-
if (scene) index = this.scenes?.indexOf(scene);
|
|
265
|
-
else return couldNotLoadScenePromise;
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
if (!this.scenes?.length) return couldNotLoadScenePromise;
|
|
269
|
-
if (index < 0) {
|
|
270
|
-
if (this.clamp) return couldNotLoadScenePromise;
|
|
271
|
-
index = this.scenes.length - 1;
|
|
272
|
-
}
|
|
273
|
-
else if (index >= this.scenes.length) {
|
|
274
|
-
if (this.clamp) return couldNotLoadScenePromise;
|
|
275
|
-
index = 0;
|
|
276
|
-
}
|
|
277
|
-
const scene = this.scenes[index];
|
|
278
|
-
return this.switchScene(scene);
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
// this is the scene that was requested last
|
|
283
|
-
private __lastSwitchScene?: AssetReference;
|
|
284
|
-
private __lastSwitchScenePromise?: Promise<boolean>;
|
|
285
|
-
|
|
286
|
-
async switchScene(scene: AssetReference): Promise<boolean> {
|
|
287
|
-
if (!(scene instanceof AssetReference)) {
|
|
288
|
-
const type = typeof scene;
|
|
289
|
-
if (type === "string") {
|
|
290
|
-
return this.select(scene);
|
|
291
|
-
}
|
|
292
|
-
else if (type === "number") {
|
|
293
|
-
return this.select(scene);
|
|
294
|
-
}
|
|
295
|
-
else {
|
|
296
|
-
console.warn("SceneSwitcher: Can't switch to scene", scene, "of type", type);
|
|
297
|
-
return false;
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
// ensure that we never run the same scene switch multiple times (at the same time) for the same requested scene
|
|
302
|
-
if (this.__lastSwitchScene === scene && this.__lastSwitchScenePromise) {
|
|
303
|
-
return this.__lastSwitchScenePromise;
|
|
304
|
-
}
|
|
305
|
-
this.__lastSwitchScene = scene;
|
|
306
|
-
this.__lastSwitchScenePromise = this.__internalSwitchScene(scene);
|
|
307
|
-
const res = await this.__lastSwitchScenePromise;
|
|
308
|
-
return res;
|
|
309
|
-
}
|
|
310
|
-
async __internalSwitchScene(scene: AssetReference): Promise<boolean> {
|
|
311
|
-
if (this._currentScene) {
|
|
312
|
-
if (debug) console.log("UNLOAD", scene.uri)
|
|
313
|
-
const sceneListener = this.tryGetSceneEventListener(this._currentScene.asset as any as Object3D);
|
|
314
|
-
if (sceneListener?.sceneClosing) {
|
|
315
|
-
const res = sceneListener.sceneClosing();
|
|
316
|
-
if (res instanceof Promise) await res;
|
|
317
|
-
}
|
|
318
|
-
this._currentScene.unload();
|
|
319
|
-
}
|
|
320
|
-
this._currentScene = undefined;
|
|
321
|
-
|
|
322
|
-
const index = this._currentIndex = this.scenes?.indexOf(scene) ?? -1;
|
|
323
|
-
try {
|
|
324
|
-
const loadStartEvt = new CustomEvent<LoadSceneEvent>("loadscene-start", { detail: { scene: scene, switcher: this, index: index } })
|
|
325
|
-
this.dispatchEvent(loadStartEvt);
|
|
326
|
-
await this.onStartLoading();
|
|
327
|
-
await scene.loadAssetAsync().catch(console.error);
|
|
328
|
-
await this.onEndLoading();
|
|
329
|
-
const finishedEvt = new CustomEvent<LoadSceneEvent>("loadscene-finished", { detail: { scene: scene, switcher: this, index: index } });
|
|
330
|
-
this.dispatchEvent(finishedEvt);
|
|
331
|
-
if (finishedEvt.defaultPrevented) {
|
|
332
|
-
if (debug) console.warn("Adding loaded scene prevented:", scene, finishedEvt);
|
|
333
|
-
return false;
|
|
334
|
-
}
|
|
335
|
-
if (!scene.asset) {
|
|
336
|
-
if (debug) console.warn("Failed loading scene:", scene);
|
|
337
|
-
return false;
|
|
338
|
-
}
|
|
339
|
-
if (this._currentIndex === index) {
|
|
340
|
-
if (debug) console.log("ADD", scene.uri)
|
|
341
|
-
this._currentScene = scene;
|
|
342
|
-
GameObject.add(scene.asset, this.gameObject);
|
|
343
|
-
if (this.useSceneLighting)
|
|
344
|
-
this.context.sceneLighting.enable(scene);
|
|
345
|
-
if (this.useHistory && index >= 0) {
|
|
346
|
-
// take the index as the query parameter value
|
|
347
|
-
let queryParameterValue = index.toString();
|
|
348
|
-
// unless the user defines that he wants to use the scene name
|
|
349
|
-
if (this.useSceneName) {
|
|
350
|
-
queryParameterValue = sceneUriToName(scene.uri);
|
|
351
|
-
}
|
|
352
|
-
// save the loaded scene as an url parameter
|
|
353
|
-
if (this.queryParameterName?.length)
|
|
354
|
-
setParamWithoutReload(this.queryParameterName, queryParameterValue, this.useHistory);
|
|
355
|
-
// or set the history state without updating the url parameter
|
|
356
|
-
else {
|
|
357
|
-
const lastState = history.state;
|
|
358
|
-
const stateName = this.guid + "::" + index;
|
|
359
|
-
if (lastState !== stateName)
|
|
360
|
-
history.pushState(stateName, "unused", location.href);
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
// Call SceneListener opened callback (if a SceneListener is in the scene)
|
|
364
|
-
const sceneListener = this.tryGetSceneEventListener(scene.asset as any as Object3D);
|
|
365
|
-
if (sceneListener?.sceneOpened) {
|
|
366
|
-
const res = sceneListener.sceneOpened();
|
|
367
|
-
if (res instanceof Promise) await res;
|
|
368
|
-
}
|
|
369
|
-
return true;
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
catch (err) {
|
|
373
|
-
console.error(err);
|
|
374
|
-
}
|
|
375
|
-
return false;
|
|
376
|
-
}
|
|
377
|
-
|
|
378
|
-
preload(index: number) {
|
|
379
|
-
if (index >= 0 && index < this.scenes.length) {
|
|
380
|
-
const scene = this.scenes[index];
|
|
381
|
-
if (scene instanceof AssetReference)
|
|
382
|
-
return scene.preload();
|
|
383
|
-
}
|
|
384
|
-
return couldNotLoadScenePromise;
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
private tryLoadFromQueryParam() {
|
|
388
|
-
if (!this.queryParameterName?.length) return couldNotLoadScenePromise;
|
|
389
|
-
// try restore the scene from the url
|
|
390
|
-
const value = getParam(this.queryParameterName);
|
|
391
|
-
if (typeof value === "boolean") return couldNotLoadScenePromise;
|
|
392
|
-
return this.trySelectSceneFromValue(value);
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
/** try to select a scene from a string or index */
|
|
396
|
-
private trySelectSceneFromValue(value: string | number) {
|
|
397
|
-
|
|
398
|
-
if (typeof value === "string") {
|
|
399
|
-
const index = parseInt(value as string);
|
|
400
|
-
if (index >= 0 && index < this.scenes.length) {
|
|
401
|
-
return this.select(index);;
|
|
402
|
-
}
|
|
403
|
-
else {
|
|
404
|
-
// Try to find a scene with a matching name
|
|
405
|
-
// we don't care about casing. e.g. Scene1 and scene1 should both match
|
|
406
|
-
const lowerCaseValue = value.toLowerCase();
|
|
407
|
-
for (let i = 0; i < this.scenes.length; i++) {
|
|
408
|
-
const scene = this.scenes[i];
|
|
409
|
-
if (!scene) continue;
|
|
410
|
-
if (sceneUriToName(scene.uri).toLowerCase().includes(lowerCaseValue)) {
|
|
411
|
-
return this.select(i);;
|
|
412
|
-
}
|
|
413
|
-
}
|
|
414
|
-
}
|
|
415
|
-
}
|
|
416
|
-
else if (typeof value === "number") {
|
|
417
|
-
if (value >= 0 && value < this.scenes.length) {
|
|
418
|
-
return this.select(value);;
|
|
419
|
-
}
|
|
420
|
-
}
|
|
421
|
-
|
|
422
|
-
if (isLocalNetwork()) console.warn("Can not find scene: \"" + value + "\"", this)
|
|
423
|
-
|
|
424
|
-
return couldNotLoadScenePromise;
|
|
425
|
-
}
|
|
426
|
-
|
|
427
|
-
private _lastLoadingScene: AssetReference | undefined = undefined;
|
|
428
|
-
private _loadingScenePromise: Promise<boolean> | undefined = undefined;
|
|
429
|
-
private _isCurrentlyLoading: boolean = false;
|
|
430
|
-
private async onStartLoading() {
|
|
431
|
-
this._isCurrentlyLoading = true;
|
|
432
|
-
if (this.loadingScene) {
|
|
433
|
-
// save the last loading scene reference so that it can be changed at runtime
|
|
434
|
-
// since we cache the loading promise here
|
|
435
|
-
if(this._lastLoadingScene !== this.loadingScene) {
|
|
436
|
-
this._loadingScenePromise = undefined;
|
|
437
|
-
}
|
|
438
|
-
this._lastLoadingScene = this.loadingScene;
|
|
439
|
-
if (!this._loadingScenePromise) {
|
|
440
|
-
this._loadingScenePromise = this.loadingScene?.loadAssetAsync();
|
|
441
|
-
}
|
|
442
|
-
await this._loadingScenePromise;
|
|
443
|
-
if (this._isCurrentlyLoading && this.loadingScene?.asset) {
|
|
444
|
-
if (debug) console.log("Add loading scene", this.loadingScene.uri, this.loadingScene.asset)
|
|
445
|
-
const obj = this.loadingScene.asset as any as Object3D;
|
|
446
|
-
GameObject.add(obj, this.gameObject);
|
|
447
|
-
const sceneListener = this.tryGetSceneEventListener(obj);
|
|
448
|
-
if (sceneListener?.sceneOpened) {
|
|
449
|
-
const res = sceneListener.sceneOpened();
|
|
450
|
-
if (res instanceof Promise) await res;
|
|
451
|
-
}
|
|
452
|
-
}
|
|
453
|
-
}
|
|
454
|
-
}
|
|
455
|
-
private async onEndLoading() {
|
|
456
|
-
this._isCurrentlyLoading = false;
|
|
457
|
-
if (this.loadingScene?.asset) {
|
|
458
|
-
if (debug) console.log("Remove loading scene", this.loadingScene.uri);
|
|
459
|
-
const obj = this.loadingScene.asset as any as Object3D;
|
|
460
|
-
// try to find an ISceneEventListener component
|
|
461
|
-
const sceneListener = this.tryGetSceneEventListener(obj);
|
|
462
|
-
if (typeof sceneListener?.sceneClosing === "function") {
|
|
463
|
-
const res = sceneListener.sceneClosing();
|
|
464
|
-
if (res instanceof Promise) await res;
|
|
465
|
-
}
|
|
466
|
-
GameObject.remove(obj);
|
|
467
|
-
}
|
|
468
|
-
}
|
|
469
|
-
|
|
470
|
-
private tryGetSceneEventListener(obj: Object3D, level: number = 0): ISceneEventListener | null {
|
|
471
|
-
const sceneListener = GameObject.foreachComponent(obj, c => (c as any as ISceneEventListener).sceneClosing ? c : undefined) as ISceneEventListener | undefined;
|
|
472
|
-
// if we didnt find any component with the listener on the root object
|
|
473
|
-
// we also check the first level of its children because a scene might be a group
|
|
474
|
-
if (level === 0 && !sceneListener && obj.children.length) {
|
|
475
|
-
for (const ch of obj.children) {
|
|
476
|
-
const res = this.tryGetSceneEventListener(ch, level + 1);
|
|
477
|
-
if (res) return res;
|
|
478
|
-
}
|
|
479
|
-
}
|
|
480
|
-
if (!sceneListener) return null;
|
|
481
|
-
return sceneListener;
|
|
482
|
-
}
|
|
483
|
-
}
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
function sceneUriToName(uri: string): string {
|
|
487
|
-
const name = uri.split("/").pop();
|
|
488
|
-
const value = name?.split(".").shift();
|
|
489
|
-
if (value?.length) return value;
|
|
490
|
-
return uri;
|
|
491
|
-
}
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
class PreLoadScheduler {
|
|
496
|
-
maxLoadAhead: number;
|
|
497
|
-
maxLoadBehind: number;
|
|
498
|
-
maxConcurrent: number;
|
|
499
|
-
|
|
500
|
-
private _isRunning: boolean = false;
|
|
501
|
-
private _switcher: SceneSwitcher;
|
|
502
|
-
private _loadTasks: LoadTask[] = [];
|
|
503
|
-
private _maxConcurrentLoads: number = 1;
|
|
504
|
-
|
|
505
|
-
constructor(rooms: SceneSwitcher, ahead: number = 1, behind: number = 1, maxConcurrent: number = 2) {
|
|
506
|
-
this._switcher = rooms;
|
|
507
|
-
this.maxLoadAhead = ahead;
|
|
508
|
-
this.maxLoadBehind = behind;
|
|
509
|
-
this.maxConcurrent = maxConcurrent;
|
|
510
|
-
}
|
|
511
|
-
|
|
512
|
-
begin() {
|
|
513
|
-
if (this._isRunning) return;
|
|
514
|
-
if (debug) console.log("Preload begin")
|
|
515
|
-
this._isRunning = true;
|
|
516
|
-
let lastRoom: number = -1;
|
|
517
|
-
let searchDistance: number;
|
|
518
|
-
let searchCall: number;
|
|
519
|
-
const array = this._switcher.scenes;
|
|
520
|
-
const interval = setInterval(() => {
|
|
521
|
-
if (this.allLoaded()) {
|
|
522
|
-
if (debug)
|
|
523
|
-
console.log("All scenes loaded");
|
|
524
|
-
this.stop();
|
|
525
|
-
}
|
|
526
|
-
if (!this._isRunning) {
|
|
527
|
-
clearInterval(interval);
|
|
528
|
-
return;
|
|
529
|
-
}
|
|
530
|
-
if (this.canLoadNewScene() === false) return;
|
|
531
|
-
if (lastRoom !== this._switcher.currentIndex) {
|
|
532
|
-
lastRoom = this._switcher.currentIndex;
|
|
533
|
-
searchCall = 0;
|
|
534
|
-
searchDistance = 0;
|
|
535
|
-
}
|
|
536
|
-
const searchForward = searchCall % 2 === 0;
|
|
537
|
-
if (searchForward) searchDistance += 1;
|
|
538
|
-
searchCall += 1;
|
|
539
|
-
const maxSearchDistance = searchForward ? this.maxLoadAhead : this.maxLoadBehind;
|
|
540
|
-
if (searchDistance > maxSearchDistance) return;
|
|
541
|
-
const roomIndex = searchForward ? lastRoom + searchDistance : lastRoom - searchDistance;
|
|
542
|
-
if (roomIndex < 0) return;
|
|
543
|
-
// if (roomIndex < 0) roomIndex = array.length + roomIndex;
|
|
544
|
-
if (roomIndex < 0 || roomIndex >= array.length) return;
|
|
545
|
-
const scene = array[roomIndex];
|
|
546
|
-
new LoadTask(roomIndex, scene, this._loadTasks);
|
|
547
|
-
}, 200);
|
|
548
|
-
}
|
|
549
|
-
|
|
550
|
-
stop() {
|
|
551
|
-
this._isRunning = false;
|
|
552
|
-
}
|
|
553
|
-
|
|
554
|
-
canLoadNewScene(): boolean {
|
|
555
|
-
return this._loadTasks.length < this._maxConcurrentLoads;
|
|
556
|
-
}
|
|
557
|
-
|
|
558
|
-
allLoaded(): boolean {
|
|
559
|
-
if (this._switcher.scenes) {
|
|
560
|
-
for (const scene of this._switcher.scenes) {
|
|
561
|
-
if (scene?.isLoaded() === false) return false;
|
|
562
|
-
}
|
|
563
|
-
}
|
|
564
|
-
return true;
|
|
565
|
-
}
|
|
566
|
-
}
|
|
567
|
-
|
|
568
|
-
class LoadTask {
|
|
569
|
-
|
|
570
|
-
index: number;
|
|
571
|
-
asset: AssetReference;
|
|
572
|
-
tasks: LoadTask[];
|
|
573
|
-
|
|
574
|
-
constructor(index: number, asset: AssetReference, tasks: LoadTask[]) {
|
|
575
|
-
this.index = index;
|
|
576
|
-
this.asset = asset;
|
|
577
|
-
this.tasks = tasks;
|
|
578
|
-
tasks.push(this);
|
|
579
|
-
this.awaitLoading();
|
|
580
|
-
}
|
|
581
|
-
|
|
582
|
-
private async awaitLoading() {
|
|
583
|
-
if (this.asset && !this.asset.isLoaded()) {
|
|
584
|
-
if (debug)
|
|
585
|
-
console.log("Preload start: " + this.asset.uri, this.index);
|
|
586
|
-
await this.asset.preload();
|
|
587
|
-
if (debug)
|
|
588
|
-
console.log("Preload finished: " + this.asset.uri, this.index);
|
|
589
|
-
}
|
|
590
|
-
|
|
591
|
-
const i = this.tasks.indexOf(this);
|
|
592
|
-
if (i >= 0) this.tasks.splice(i, 1);
|
|
593
|
-
}
|
|
594
|
-
}
|
|
1
|
+
import { AssetReference } from "../engine/engine_addressables.js";
|
|
2
|
+
import { InputEvents } from "../engine/engine_input.js";
|
|
3
|
+
import { isLocalNetwork } from "../engine/engine_networking_utils.js";
|
|
4
|
+
import { delay, getParam, setParamWithoutReload } from "../engine/engine_utils.js";
|
|
5
|
+
import { serializable } from "../engine/engine_serialization.js";
|
|
6
|
+
import { Behaviour, GameObject } from "./Component.js";
|
|
7
|
+
import { registerObservableAttribute } from "../engine/engine_element_extras.js";
|
|
8
|
+
import { Object3D } from "three";
|
|
9
|
+
|
|
10
|
+
const debug = getParam("debugsceneswitcher");
|
|
11
|
+
|
|
12
|
+
const ENGINE_ELEMENT_SCENE_ATTRIBUTE_NAME = "scene";
|
|
13
|
+
registerObservableAttribute(ENGINE_ELEMENT_SCENE_ATTRIBUTE_NAME);
|
|
14
|
+
|
|
15
|
+
// ContextRegistry.registerCallback(ContextEvent.ContextRegistered, async _ => {
|
|
16
|
+
// // We need to defer import to not get issues with circular dependencies
|
|
17
|
+
// import("../engine/engine_element").then(res => {
|
|
18
|
+
// const webcomponent = res.NeedleEngineHTMLElement;
|
|
19
|
+
// if (debug) console.log("SceneSwitcher: registering scene attribute", webcomponent.observedAttributes);
|
|
20
|
+
// if (!webcomponent.observedAttributes.includes(ENGINE_ELEMENT_SCENE_ATTRIBUTE_NAME))
|
|
21
|
+
// webcomponent.observedAttributes.push(ENGINE_ELEMENT_SCENE_ATTRIBUTE_NAME);
|
|
22
|
+
// });
|
|
23
|
+
// });
|
|
24
|
+
|
|
25
|
+
const couldNotLoadScenePromise = Promise.resolve(false);
|
|
26
|
+
|
|
27
|
+
export type LoadSceneEvent = {
|
|
28
|
+
switcher: SceneSwitcher;
|
|
29
|
+
scene: AssetReference;
|
|
30
|
+
index: number;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** The ISceneEventListener is called by the SceneSwitcher when a scene is loaded or unloaded. It must be added to the root object of your scene */
|
|
34
|
+
export interface ISceneEventListener {
|
|
35
|
+
/** Called when the scene is loaded and added */
|
|
36
|
+
sceneOpened?(): Promise<void>
|
|
37
|
+
/** Called before the scene is being removed (due to another scene being loaded) */
|
|
38
|
+
sceneClosing?(): Promise<void>
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export class SceneSwitcher extends Behaviour {
|
|
42
|
+
|
|
43
|
+
@serializable(AssetReference)
|
|
44
|
+
scenes!: AssetReference[];
|
|
45
|
+
|
|
46
|
+
@serializable(AssetReference)
|
|
47
|
+
loadingScene!: AssetReference;
|
|
48
|
+
|
|
49
|
+
/** the url parameter that is set/used to store the currently loaded scene in, set to "" to disable */
|
|
50
|
+
@serializable()
|
|
51
|
+
queryParameterName: string = "scene";
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* when enabled the scene name will be used as the query parameter (otherwise the scene index will be used)
|
|
55
|
+
* Needs `queryParameterName` set
|
|
56
|
+
* */
|
|
57
|
+
@serializable()
|
|
58
|
+
useSceneName: boolean = true;
|
|
59
|
+
|
|
60
|
+
@serializable()
|
|
61
|
+
clamp: boolean = true;
|
|
62
|
+
|
|
63
|
+
/** when enabled the new scene is pushed to the browser navigation history, only works with a valid query parameter set */
|
|
64
|
+
@serializable()
|
|
65
|
+
useHistory: boolean = true;
|
|
66
|
+
|
|
67
|
+
/** when enabled you can switch between scenes using keyboard left, right, A and D or number keys */
|
|
68
|
+
@serializable()
|
|
69
|
+
useKeyboard: boolean = true;
|
|
70
|
+
|
|
71
|
+
/** when enabled you can switch between scenes using swipe (mobile only) */
|
|
72
|
+
@serializable()
|
|
73
|
+
useSwipe: boolean = true;
|
|
74
|
+
|
|
75
|
+
/** when enabled will automatically apply the environment scene lights */
|
|
76
|
+
@serializable()
|
|
77
|
+
useSceneLighting: boolean = true;
|
|
78
|
+
|
|
79
|
+
/** how many scenes after the currently active scene should be preloaded */
|
|
80
|
+
@serializable()
|
|
81
|
+
preloadNext: number = 1;
|
|
82
|
+
|
|
83
|
+
/** how many scenes before the currently active scene should be preloaded */
|
|
84
|
+
@serializable()
|
|
85
|
+
preloadPrevious: number = 1;
|
|
86
|
+
|
|
87
|
+
/** how many scenes can be loaded in parallel */
|
|
88
|
+
@serializable()
|
|
89
|
+
preloadConcurrent: number = 2;
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
get currentIndex(): number { return this._currentIndex; }
|
|
93
|
+
|
|
94
|
+
private _currentIndex: number = -1;
|
|
95
|
+
private _currentScene: AssetReference | undefined = undefined;
|
|
96
|
+
private _engineElementOverserver: MutationObserver | undefined = undefined;
|
|
97
|
+
|
|
98
|
+
private _preloadScheduler?: PreLoadScheduler;
|
|
99
|
+
|
|
100
|
+
awake(): void {
|
|
101
|
+
if (debug) console.log("SceneSwitcher", this);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
async start() {
|
|
105
|
+
if (this._currentIndex === -1 && !await this.tryLoadFromQueryParam()) {
|
|
106
|
+
const value = this.context.domElement.getAttribute(ENGINE_ELEMENT_SCENE_ATTRIBUTE_NAME);
|
|
107
|
+
// let locked = this.lock;
|
|
108
|
+
try {
|
|
109
|
+
// this.lock = false;
|
|
110
|
+
if (value === null || !await this.trySelectSceneFromValue(value)) {
|
|
111
|
+
if (this._currentIndex === -1)
|
|
112
|
+
this.select(0);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
finally {
|
|
116
|
+
// this.lock = locked;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
onEnable(): void {
|
|
122
|
+
globalThis.addEventListener("popstate", this.onPopState);
|
|
123
|
+
this.context.input.addEventListener(InputEvents.KeyDown, this.onKeyDown);
|
|
124
|
+
this.context.input.addEventListener(InputEvents.PointerMove, this.onPointerMove);
|
|
125
|
+
this.context.input.addEventListener(InputEvents.PointerUp, this.onPointerUp);
|
|
126
|
+
|
|
127
|
+
if (!this._engineElementOverserver) {
|
|
128
|
+
this._engineElementOverserver = new MutationObserver((mutations) => {
|
|
129
|
+
for (const mut of mutations) {
|
|
130
|
+
if (mut.type === "attributes" && mut.attributeName === ENGINE_ELEMENT_SCENE_ATTRIBUTE_NAME) {
|
|
131
|
+
const value = this.context.domElement.getAttribute(ENGINE_ELEMENT_SCENE_ATTRIBUTE_NAME);
|
|
132
|
+
if (value !== null) {
|
|
133
|
+
this.trySelectSceneFromValue(value);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
this._engineElementOverserver.observe(this.context.domElement, {
|
|
141
|
+
attributes: true
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
if (!this._preloadScheduler)
|
|
145
|
+
this._preloadScheduler = new PreLoadScheduler(this);
|
|
146
|
+
this._preloadScheduler.maxLoadAhead = this.preloadNext;
|
|
147
|
+
this._preloadScheduler.maxLoadBehind = this.preloadPrevious;
|
|
148
|
+
this._preloadScheduler.maxConcurrent = this.preloadConcurrent;
|
|
149
|
+
this._preloadScheduler.begin();
|
|
150
|
+
|
|
151
|
+
// Begin loading the loading scene
|
|
152
|
+
// if (this.loadingScene) this.loadingScene.loadAssetAsync();
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
onDisable(): void {
|
|
156
|
+
globalThis.removeEventListener("popstate", this.onPopState);
|
|
157
|
+
this.context.input.removeEventListener(InputEvents.KeyDown, this.onKeyDown);
|
|
158
|
+
this.context.input.removeEventListener(InputEvents.PointerMove, this.onPointerMove);
|
|
159
|
+
this.context.input.removeEventListener(InputEvents.PointerUp, this.onPointerUp);
|
|
160
|
+
this._preloadScheduler?.stop();
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
private onPopState = async (_state: PopStateEvent) => {
|
|
164
|
+
if (!this.useHistory) return;
|
|
165
|
+
const wasUsingHistory = this.useHistory;
|
|
166
|
+
try {
|
|
167
|
+
this.useHistory = false;
|
|
168
|
+
let didResolve = false;
|
|
169
|
+
if (this.queryParameterName)
|
|
170
|
+
didResolve = await this.tryLoadFromQueryParam();
|
|
171
|
+
if (!didResolve) {
|
|
172
|
+
const state = _state?.state;
|
|
173
|
+
if (state && state.startsWith(this.guid)) {
|
|
174
|
+
const value = state.substr(this.guid.length + 2);
|
|
175
|
+
if (debug) console.log("PopState", value);
|
|
176
|
+
await this.trySelectSceneFromValue(value);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
finally {
|
|
181
|
+
this.useHistory = wasUsingHistory;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
private normalizedSwipeThresholdX = 0.1;
|
|
186
|
+
private _didSwipe: boolean = false;
|
|
187
|
+
private onPointerMove = (e: any) => {
|
|
188
|
+
if (!this.useSwipe) return;
|
|
189
|
+
if (!this._didSwipe && e.button === 0 && e.pointerType === "touch" && this.context.input.getPointerPressedCount() === 1) {
|
|
190
|
+
const delta = this.context.input.getPointerPositionDelta(e.button);
|
|
191
|
+
if (delta) {
|
|
192
|
+
const normalizedX = delta.x / this.context.domWidth;
|
|
193
|
+
if (normalizedX >= this.normalizedSwipeThresholdX) {
|
|
194
|
+
this._didSwipe = true;
|
|
195
|
+
this.selectPrev();
|
|
196
|
+
}
|
|
197
|
+
else if (normalizedX <= -this.normalizedSwipeThresholdX) {
|
|
198
|
+
this._didSwipe = true;
|
|
199
|
+
this.selectNext();
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
private onPointerUp = (e: any) => {
|
|
206
|
+
if (e.button === 0) {
|
|
207
|
+
this._didSwipe = false;
|
|
208
|
+
}
|
|
209
|
+
};
|
|
210
|
+
|
|
211
|
+
private onKeyDown = (e: any) => {
|
|
212
|
+
if (!this.useKeyboard) return;
|
|
213
|
+
if (!this.scenes) return;
|
|
214
|
+
const key = e.key.toLowerCase();
|
|
215
|
+
if (!key) return;
|
|
216
|
+
const index = parseInt(key) - 1;
|
|
217
|
+
if (index >= 0) {
|
|
218
|
+
this.trySelectSceneFromValue(index);
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
switch (key) {
|
|
222
|
+
case "arrowright":
|
|
223
|
+
case "d":
|
|
224
|
+
this.selectNext();
|
|
225
|
+
break;
|
|
226
|
+
case "arrowleft":
|
|
227
|
+
case "a":
|
|
228
|
+
this.selectPrev();
|
|
229
|
+
break;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
selectNext(): Promise<boolean> {
|
|
234
|
+
return this.select(this._currentIndex + 1);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
selectPrev(): Promise<boolean> {
|
|
238
|
+
return this.select(this._currentIndex - 1);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
select(index: number | string): Promise<boolean> {
|
|
242
|
+
if (debug) console.log("select", index);
|
|
243
|
+
|
|
244
|
+
if (typeof index === "object") {
|
|
245
|
+
// If a user tries to reference a scene object in a UnityEvent and invoke select(obj)
|
|
246
|
+
// Then the object will be serialized as a object { guid : ... } or with the index json pointer
|
|
247
|
+
// This case is not supported right now. Object references in the editor must not be scene references
|
|
248
|
+
console.warn("Switching to \"" + index + "\" might not work. Please either use an index or a AssetReference (not a scene reference)");
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
if (typeof index === "string") {
|
|
252
|
+
// If the parameter is a string we try to resolve the scene by its uri
|
|
253
|
+
// it's either already known in the scenes array
|
|
254
|
+
// or we create/get a new AssetReference and try to switch to that
|
|
255
|
+
const scene = this.scenes?.find(s => s.uri === index);
|
|
256
|
+
if (!scene) {
|
|
257
|
+
// Ok the scene is unknown to the scene switcher
|
|
258
|
+
// we create a new asset reference (or get an existing one)
|
|
259
|
+
// And switch to that. With this we can not modify the history
|
|
260
|
+
// Until the scene switcher can store the uri in the history instead of the index
|
|
261
|
+
const reference = AssetReference.getOrCreate(this.sourceId ?? "", index, this.context);
|
|
262
|
+
return this.switchScene(reference);
|
|
263
|
+
}
|
|
264
|
+
if (scene) index = this.scenes?.indexOf(scene);
|
|
265
|
+
else return couldNotLoadScenePromise;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
if (!this.scenes?.length) return couldNotLoadScenePromise;
|
|
269
|
+
if (index < 0) {
|
|
270
|
+
if (this.clamp) return couldNotLoadScenePromise;
|
|
271
|
+
index = this.scenes.length - 1;
|
|
272
|
+
}
|
|
273
|
+
else if (index >= this.scenes.length) {
|
|
274
|
+
if (this.clamp) return couldNotLoadScenePromise;
|
|
275
|
+
index = 0;
|
|
276
|
+
}
|
|
277
|
+
const scene = this.scenes[index];
|
|
278
|
+
return this.switchScene(scene);
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
// this is the scene that was requested last
|
|
283
|
+
private __lastSwitchScene?: AssetReference;
|
|
284
|
+
private __lastSwitchScenePromise?: Promise<boolean>;
|
|
285
|
+
|
|
286
|
+
async switchScene(scene: AssetReference): Promise<boolean> {
|
|
287
|
+
if (!(scene instanceof AssetReference)) {
|
|
288
|
+
const type = typeof scene;
|
|
289
|
+
if (type === "string") {
|
|
290
|
+
return this.select(scene);
|
|
291
|
+
}
|
|
292
|
+
else if (type === "number") {
|
|
293
|
+
return this.select(scene);
|
|
294
|
+
}
|
|
295
|
+
else {
|
|
296
|
+
console.warn("SceneSwitcher: Can't switch to scene", scene, "of type", type);
|
|
297
|
+
return false;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
// ensure that we never run the same scene switch multiple times (at the same time) for the same requested scene
|
|
302
|
+
if (this.__lastSwitchScene === scene && this.__lastSwitchScenePromise) {
|
|
303
|
+
return this.__lastSwitchScenePromise;
|
|
304
|
+
}
|
|
305
|
+
this.__lastSwitchScene = scene;
|
|
306
|
+
this.__lastSwitchScenePromise = this.__internalSwitchScene(scene);
|
|
307
|
+
const res = await this.__lastSwitchScenePromise;
|
|
308
|
+
return res;
|
|
309
|
+
}
|
|
310
|
+
async __internalSwitchScene(scene: AssetReference): Promise<boolean> {
|
|
311
|
+
if (this._currentScene) {
|
|
312
|
+
if (debug) console.log("UNLOAD", scene.uri)
|
|
313
|
+
const sceneListener = this.tryGetSceneEventListener(this._currentScene.asset as any as Object3D);
|
|
314
|
+
if (sceneListener?.sceneClosing) {
|
|
315
|
+
const res = sceneListener.sceneClosing();
|
|
316
|
+
if (res instanceof Promise) await res;
|
|
317
|
+
}
|
|
318
|
+
this._currentScene.unload();
|
|
319
|
+
}
|
|
320
|
+
this._currentScene = undefined;
|
|
321
|
+
|
|
322
|
+
const index = this._currentIndex = this.scenes?.indexOf(scene) ?? -1;
|
|
323
|
+
try {
|
|
324
|
+
const loadStartEvt = new CustomEvent<LoadSceneEvent>("loadscene-start", { detail: { scene: scene, switcher: this, index: index } })
|
|
325
|
+
this.dispatchEvent(loadStartEvt);
|
|
326
|
+
await this.onStartLoading();
|
|
327
|
+
await scene.loadAssetAsync().catch(console.error);
|
|
328
|
+
await this.onEndLoading();
|
|
329
|
+
const finishedEvt = new CustomEvent<LoadSceneEvent>("loadscene-finished", { detail: { scene: scene, switcher: this, index: index } });
|
|
330
|
+
this.dispatchEvent(finishedEvt);
|
|
331
|
+
if (finishedEvt.defaultPrevented) {
|
|
332
|
+
if (debug) console.warn("Adding loaded scene prevented:", scene, finishedEvt);
|
|
333
|
+
return false;
|
|
334
|
+
}
|
|
335
|
+
if (!scene.asset) {
|
|
336
|
+
if (debug) console.warn("Failed loading scene:", scene);
|
|
337
|
+
return false;
|
|
338
|
+
}
|
|
339
|
+
if (this._currentIndex === index) {
|
|
340
|
+
if (debug) console.log("ADD", scene.uri)
|
|
341
|
+
this._currentScene = scene;
|
|
342
|
+
GameObject.add(scene.asset, this.gameObject);
|
|
343
|
+
if (this.useSceneLighting)
|
|
344
|
+
this.context.sceneLighting.enable(scene);
|
|
345
|
+
if (this.useHistory && index >= 0) {
|
|
346
|
+
// take the index as the query parameter value
|
|
347
|
+
let queryParameterValue = index.toString();
|
|
348
|
+
// unless the user defines that he wants to use the scene name
|
|
349
|
+
if (this.useSceneName) {
|
|
350
|
+
queryParameterValue = sceneUriToName(scene.uri);
|
|
351
|
+
}
|
|
352
|
+
// save the loaded scene as an url parameter
|
|
353
|
+
if (this.queryParameterName?.length)
|
|
354
|
+
setParamWithoutReload(this.queryParameterName, queryParameterValue, this.useHistory);
|
|
355
|
+
// or set the history state without updating the url parameter
|
|
356
|
+
else {
|
|
357
|
+
const lastState = history.state;
|
|
358
|
+
const stateName = this.guid + "::" + index;
|
|
359
|
+
if (lastState !== stateName)
|
|
360
|
+
history.pushState(stateName, "unused", location.href);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
// Call SceneListener opened callback (if a SceneListener is in the scene)
|
|
364
|
+
const sceneListener = this.tryGetSceneEventListener(scene.asset as any as Object3D);
|
|
365
|
+
if (sceneListener?.sceneOpened) {
|
|
366
|
+
const res = sceneListener.sceneOpened();
|
|
367
|
+
if (res instanceof Promise) await res;
|
|
368
|
+
}
|
|
369
|
+
return true;
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
catch (err) {
|
|
373
|
+
console.error(err);
|
|
374
|
+
}
|
|
375
|
+
return false;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
preload(index: number) {
|
|
379
|
+
if (index >= 0 && index < this.scenes.length) {
|
|
380
|
+
const scene = this.scenes[index];
|
|
381
|
+
if (scene instanceof AssetReference)
|
|
382
|
+
return scene.preload();
|
|
383
|
+
}
|
|
384
|
+
return couldNotLoadScenePromise;
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
private tryLoadFromQueryParam() {
|
|
388
|
+
if (!this.queryParameterName?.length) return couldNotLoadScenePromise;
|
|
389
|
+
// try restore the scene from the url
|
|
390
|
+
const value = getParam(this.queryParameterName);
|
|
391
|
+
if (typeof value === "boolean") return couldNotLoadScenePromise;
|
|
392
|
+
return this.trySelectSceneFromValue(value);
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
/** try to select a scene from a string or index */
|
|
396
|
+
private trySelectSceneFromValue(value: string | number) {
|
|
397
|
+
|
|
398
|
+
if (typeof value === "string") {
|
|
399
|
+
const index = parseInt(value as string);
|
|
400
|
+
if (index >= 0 && index < this.scenes.length) {
|
|
401
|
+
return this.select(index);;
|
|
402
|
+
}
|
|
403
|
+
else {
|
|
404
|
+
// Try to find a scene with a matching name
|
|
405
|
+
// we don't care about casing. e.g. Scene1 and scene1 should both match
|
|
406
|
+
const lowerCaseValue = value.toLowerCase();
|
|
407
|
+
for (let i = 0; i < this.scenes.length; i++) {
|
|
408
|
+
const scene = this.scenes[i];
|
|
409
|
+
if (!scene) continue;
|
|
410
|
+
if (sceneUriToName(scene.uri).toLowerCase().includes(lowerCaseValue)) {
|
|
411
|
+
return this.select(i);;
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
else if (typeof value === "number") {
|
|
417
|
+
if (value >= 0 && value < this.scenes.length) {
|
|
418
|
+
return this.select(value);;
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
if (isLocalNetwork()) console.warn("Can not find scene: \"" + value + "\"", this)
|
|
423
|
+
|
|
424
|
+
return couldNotLoadScenePromise;
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
private _lastLoadingScene: AssetReference | undefined = undefined;
|
|
428
|
+
private _loadingScenePromise: Promise<boolean> | undefined = undefined;
|
|
429
|
+
private _isCurrentlyLoading: boolean = false;
|
|
430
|
+
private async onStartLoading() {
|
|
431
|
+
this._isCurrentlyLoading = true;
|
|
432
|
+
if (this.loadingScene) {
|
|
433
|
+
// save the last loading scene reference so that it can be changed at runtime
|
|
434
|
+
// since we cache the loading promise here
|
|
435
|
+
if(this._lastLoadingScene !== this.loadingScene) {
|
|
436
|
+
this._loadingScenePromise = undefined;
|
|
437
|
+
}
|
|
438
|
+
this._lastLoadingScene = this.loadingScene;
|
|
439
|
+
if (!this._loadingScenePromise) {
|
|
440
|
+
this._loadingScenePromise = this.loadingScene?.loadAssetAsync();
|
|
441
|
+
}
|
|
442
|
+
await this._loadingScenePromise;
|
|
443
|
+
if (this._isCurrentlyLoading && this.loadingScene?.asset) {
|
|
444
|
+
if (debug) console.log("Add loading scene", this.loadingScene.uri, this.loadingScene.asset)
|
|
445
|
+
const obj = this.loadingScene.asset as any as Object3D;
|
|
446
|
+
GameObject.add(obj, this.gameObject);
|
|
447
|
+
const sceneListener = this.tryGetSceneEventListener(obj);
|
|
448
|
+
if (sceneListener?.sceneOpened) {
|
|
449
|
+
const res = sceneListener.sceneOpened();
|
|
450
|
+
if (res instanceof Promise) await res;
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
private async onEndLoading() {
|
|
456
|
+
this._isCurrentlyLoading = false;
|
|
457
|
+
if (this.loadingScene?.asset) {
|
|
458
|
+
if (debug) console.log("Remove loading scene", this.loadingScene.uri);
|
|
459
|
+
const obj = this.loadingScene.asset as any as Object3D;
|
|
460
|
+
// try to find an ISceneEventListener component
|
|
461
|
+
const sceneListener = this.tryGetSceneEventListener(obj);
|
|
462
|
+
if (typeof sceneListener?.sceneClosing === "function") {
|
|
463
|
+
const res = sceneListener.sceneClosing();
|
|
464
|
+
if (res instanceof Promise) await res;
|
|
465
|
+
}
|
|
466
|
+
GameObject.remove(obj);
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
private tryGetSceneEventListener(obj: Object3D, level: number = 0): ISceneEventListener | null {
|
|
471
|
+
const sceneListener = GameObject.foreachComponent(obj, c => (c as any as ISceneEventListener).sceneClosing ? c : undefined) as ISceneEventListener | undefined;
|
|
472
|
+
// if we didnt find any component with the listener on the root object
|
|
473
|
+
// we also check the first level of its children because a scene might be a group
|
|
474
|
+
if (level === 0 && !sceneListener && obj.children.length) {
|
|
475
|
+
for (const ch of obj.children) {
|
|
476
|
+
const res = this.tryGetSceneEventListener(ch, level + 1);
|
|
477
|
+
if (res) return res;
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
if (!sceneListener) return null;
|
|
481
|
+
return sceneListener;
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
|
|
486
|
+
function sceneUriToName(uri: string): string {
|
|
487
|
+
const name = uri.split("/").pop();
|
|
488
|
+
const value = name?.split(".").shift();
|
|
489
|
+
if (value?.length) return value;
|
|
490
|
+
return uri;
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
|
|
494
|
+
|
|
495
|
+
class PreLoadScheduler {
|
|
496
|
+
maxLoadAhead: number;
|
|
497
|
+
maxLoadBehind: number;
|
|
498
|
+
maxConcurrent: number;
|
|
499
|
+
|
|
500
|
+
private _isRunning: boolean = false;
|
|
501
|
+
private _switcher: SceneSwitcher;
|
|
502
|
+
private _loadTasks: LoadTask[] = [];
|
|
503
|
+
private _maxConcurrentLoads: number = 1;
|
|
504
|
+
|
|
505
|
+
constructor(rooms: SceneSwitcher, ahead: number = 1, behind: number = 1, maxConcurrent: number = 2) {
|
|
506
|
+
this._switcher = rooms;
|
|
507
|
+
this.maxLoadAhead = ahead;
|
|
508
|
+
this.maxLoadBehind = behind;
|
|
509
|
+
this.maxConcurrent = maxConcurrent;
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
begin() {
|
|
513
|
+
if (this._isRunning) return;
|
|
514
|
+
if (debug) console.log("Preload begin")
|
|
515
|
+
this._isRunning = true;
|
|
516
|
+
let lastRoom: number = -1;
|
|
517
|
+
let searchDistance: number;
|
|
518
|
+
let searchCall: number;
|
|
519
|
+
const array = this._switcher.scenes;
|
|
520
|
+
const interval = setInterval(() => {
|
|
521
|
+
if (this.allLoaded()) {
|
|
522
|
+
if (debug)
|
|
523
|
+
console.log("All scenes loaded");
|
|
524
|
+
this.stop();
|
|
525
|
+
}
|
|
526
|
+
if (!this._isRunning) {
|
|
527
|
+
clearInterval(interval);
|
|
528
|
+
return;
|
|
529
|
+
}
|
|
530
|
+
if (this.canLoadNewScene() === false) return;
|
|
531
|
+
if (lastRoom !== this._switcher.currentIndex) {
|
|
532
|
+
lastRoom = this._switcher.currentIndex;
|
|
533
|
+
searchCall = 0;
|
|
534
|
+
searchDistance = 0;
|
|
535
|
+
}
|
|
536
|
+
const searchForward = searchCall % 2 === 0;
|
|
537
|
+
if (searchForward) searchDistance += 1;
|
|
538
|
+
searchCall += 1;
|
|
539
|
+
const maxSearchDistance = searchForward ? this.maxLoadAhead : this.maxLoadBehind;
|
|
540
|
+
if (searchDistance > maxSearchDistance) return;
|
|
541
|
+
const roomIndex = searchForward ? lastRoom + searchDistance : lastRoom - searchDistance;
|
|
542
|
+
if (roomIndex < 0) return;
|
|
543
|
+
// if (roomIndex < 0) roomIndex = array.length + roomIndex;
|
|
544
|
+
if (roomIndex < 0 || roomIndex >= array.length) return;
|
|
545
|
+
const scene = array[roomIndex];
|
|
546
|
+
new LoadTask(roomIndex, scene, this._loadTasks);
|
|
547
|
+
}, 200);
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
stop() {
|
|
551
|
+
this._isRunning = false;
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
canLoadNewScene(): boolean {
|
|
555
|
+
return this._loadTasks.length < this._maxConcurrentLoads;
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
allLoaded(): boolean {
|
|
559
|
+
if (this._switcher.scenes) {
|
|
560
|
+
for (const scene of this._switcher.scenes) {
|
|
561
|
+
if (scene?.isLoaded() === false) return false;
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
return true;
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
class LoadTask {
|
|
569
|
+
|
|
570
|
+
index: number;
|
|
571
|
+
asset: AssetReference;
|
|
572
|
+
tasks: LoadTask[];
|
|
573
|
+
|
|
574
|
+
constructor(index: number, asset: AssetReference, tasks: LoadTask[]) {
|
|
575
|
+
this.index = index;
|
|
576
|
+
this.asset = asset;
|
|
577
|
+
this.tasks = tasks;
|
|
578
|
+
tasks.push(this);
|
|
579
|
+
this.awaitLoading();
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
private async awaitLoading() {
|
|
583
|
+
if (this.asset && !this.asset.isLoaded()) {
|
|
584
|
+
if (debug)
|
|
585
|
+
console.log("Preload start: " + this.asset.uri, this.index);
|
|
586
|
+
await this.asset.preload();
|
|
587
|
+
if (debug)
|
|
588
|
+
console.log("Preload finished: " + this.asset.uri, this.index);
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
const i = this.tasks.indexOf(this);
|
|
592
|
+
if (i >= 0) this.tasks.splice(i, 1);
|
|
593
|
+
}
|
|
594
|
+
}
|