@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,519 +1,519 @@
|
|
|
1
|
-
// use for typesafe interface method calls
|
|
2
|
-
import { Quaternion, Vector2, Vector3, Vector4 } from "three";
|
|
3
|
-
// https://schneidenbach.gitbooks.io/typescript-cookbook/content/nameof-operator.html
|
|
4
|
-
export const nameofFactory = () => (name) => name;
|
|
5
|
-
export function nameof(name) {
|
|
6
|
-
return nameofFactory()(name);
|
|
7
|
-
}
|
|
8
|
-
export function isDebugMode() {
|
|
9
|
-
return getParam("debug") ? true : false;
|
|
10
|
-
}
|
|
11
|
-
export class CircularBuffer {
|
|
12
|
-
_factory;
|
|
13
|
-
_cache = [];
|
|
14
|
-
_maxSize;
|
|
15
|
-
_index = 0;
|
|
16
|
-
constructor(factory, maxSize) {
|
|
17
|
-
this._factory = factory;
|
|
18
|
-
this._maxSize = maxSize;
|
|
19
|
-
}
|
|
20
|
-
get() {
|
|
21
|
-
const i = this._index % this._maxSize;
|
|
22
|
-
this._index++;
|
|
23
|
-
if (this._cache.length <= i) {
|
|
24
|
-
this._cache[i] = this._factory();
|
|
25
|
-
}
|
|
26
|
-
return this._cache[i];
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
let saveParams = false;
|
|
30
|
-
const requestedParams = [];
|
|
31
|
-
setTimeout(() => {
|
|
32
|
-
if (saveParams) {
|
|
33
|
-
console.log(requestedParams.sort());
|
|
34
|
-
}
|
|
35
|
-
}, 100);
|
|
36
|
-
export function getUrlParams() {
|
|
37
|
-
// "window" may not exist in node.js
|
|
38
|
-
return new URLSearchParams(globalThis.location?.search);
|
|
39
|
-
}
|
|
40
|
-
/** Checks if a url parameter exists.
|
|
41
|
-
* Returns true if it exists but has no value (e.g. ?help)
|
|
42
|
-
* Returns false if it does not exist
|
|
43
|
-
* Returns false if it's set to 0 e.g. ?debug=0
|
|
44
|
-
* Returns the value if it exists e.g. ?message=hello
|
|
45
|
-
*/
|
|
46
|
-
export function getParam(paramName) {
|
|
47
|
-
if (saveParams && !requestedParams.includes(paramName))
|
|
48
|
-
requestedParams.push(paramName);
|
|
49
|
-
const urlParams = getUrlParams();
|
|
50
|
-
if (urlParams.has(paramName)) {
|
|
51
|
-
const val = urlParams.get(paramName);
|
|
52
|
-
if (val) {
|
|
53
|
-
const num = Number(val);
|
|
54
|
-
if (!isNaN(num))
|
|
55
|
-
return num;
|
|
56
|
-
return val;
|
|
57
|
-
}
|
|
58
|
-
else
|
|
59
|
-
return true;
|
|
60
|
-
}
|
|
61
|
-
return false;
|
|
62
|
-
}
|
|
63
|
-
saveParams = getParam("help") === true;
|
|
64
|
-
export function setParam(paramName, paramValue) {
|
|
65
|
-
const urlParams = getUrlParams();
|
|
66
|
-
if (urlParams.has(paramName)) {
|
|
67
|
-
urlParams.set(paramName, paramValue);
|
|
68
|
-
}
|
|
69
|
-
else
|
|
70
|
-
urlParams.append(paramName, paramValue);
|
|
71
|
-
document.location.search = urlParams.toString();
|
|
72
|
-
}
|
|
73
|
-
export function setParamWithoutReload(paramName, paramValue, appendHistory = true) {
|
|
74
|
-
const urlParams = getUrlParams();
|
|
75
|
-
if (urlParams.has(paramName)) {
|
|
76
|
-
if (paramValue === null)
|
|
77
|
-
urlParams.delete(paramName);
|
|
78
|
-
else
|
|
79
|
-
urlParams.set(paramName, paramValue);
|
|
80
|
-
}
|
|
81
|
-
else if (paramValue !== null)
|
|
82
|
-
urlParams.append(paramName, paramValue);
|
|
83
|
-
if (appendHistory)
|
|
84
|
-
pushState(paramName, urlParams);
|
|
85
|
-
else
|
|
86
|
-
setState(paramName, urlParams);
|
|
87
|
-
}
|
|
88
|
-
export function setOrAddParamsToUrl(url, paramName, paramValue) {
|
|
89
|
-
if (url.has(paramName)) {
|
|
90
|
-
url.set(paramName, paramValue.toString());
|
|
91
|
-
}
|
|
92
|
-
else
|
|
93
|
-
url.append(paramName, paramValue.toString());
|
|
94
|
-
}
|
|
95
|
-
export function pushState(title, urlParams, state) {
|
|
96
|
-
window.history.pushState(state, title, "?" + urlParams.toString());
|
|
97
|
-
}
|
|
98
|
-
export function setState(title, urlParams, state) {
|
|
99
|
-
window.history.replaceState(state, title, "?" + urlParams.toString());
|
|
100
|
-
}
|
|
101
|
-
// for room id
|
|
102
|
-
export function makeId(length) {
|
|
103
|
-
var result = '';
|
|
104
|
-
var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
|
105
|
-
var charactersLength = characters.length;
|
|
106
|
-
for (var i = 0; i < length; i++) {
|
|
107
|
-
result += characters.charAt(Math.floor(Math.random() *
|
|
108
|
-
charactersLength));
|
|
109
|
-
}
|
|
110
|
-
return result;
|
|
111
|
-
}
|
|
112
|
-
export function randomNumber(min, max) {
|
|
113
|
-
return Math.floor(Math.random() * (max - min + 1)) + min;
|
|
114
|
-
}
|
|
115
|
-
const adjectives = ["smol", "tiny", "giant", "interesting", "smart", "bright", "dull", "extreme", "beautiful", "pretty", "dark", "epic", "salty", "silly", "funny", "lame", "lazy", "loud", "lucky", "mad", "mean", "mighty", "mysterious", "nasty", "odd", "old", "powerful", "quiet", "rapid", "scary", "shiny", "shy", "silly", "smooth", "sour", "spicy", "stupid", "sweet", "tasty", "terrible", "ugly", "unusual", "vast", "wet", "wild", "witty", "wrong", "zany", "zealous", "zippy", "zombie", "zorro"];
|
|
116
|
-
const nouns = ["cat", "dog", "mouse", "pig", "cow", "horse", "sheep", "chicken", "duck", "goat", "panda", "tiger", "lion", "elephant", "monkey", "bird", "fish", "snake", "frog", "turtle", "hamster", "penguin", "kangaroo", "whale", "dolphin", "crocodile", "snail", "ant", "bee", "beetle", "butterfly", "dragon", "eagle", "fish", "giraffe", "lizard", "panda", "penguin", "rabbit", "snake", "spider", "tiger", "zebra"];
|
|
117
|
-
export function makeIdFromRandomWords() {
|
|
118
|
-
const randomAdjective = adjectives[Math.floor(Math.random() * adjectives.length)];
|
|
119
|
-
const randomNoun = nouns[Math.floor(Math.random() * nouns.length)];
|
|
120
|
-
return randomAdjective + "_" + randomNoun;
|
|
121
|
-
}
|
|
122
|
-
// for url parameters
|
|
123
|
-
export function sanitizeString(str) {
|
|
124
|
-
str = str.replace(/[^a-z0-9áéíóúñü \.,_-]/gim, "");
|
|
125
|
-
return str.trim();
|
|
126
|
-
}
|
|
127
|
-
// TODO: taken from scene utils
|
|
128
|
-
export function tryFindObject(globalObjectIdentifier, obj, recursive = true, searchComponents = false) {
|
|
129
|
-
if (obj === undefined || obj === null)
|
|
130
|
-
return null;
|
|
131
|
-
if (obj.userData && obj.userData.guid === globalObjectIdentifier)
|
|
132
|
-
return obj;
|
|
133
|
-
else if (obj.guid == globalObjectIdentifier)
|
|
134
|
-
return obj;
|
|
135
|
-
if (searchComponents) {
|
|
136
|
-
if (obj.userData?.components) {
|
|
137
|
-
for (const comp of obj.userData.components) {
|
|
138
|
-
if (comp.guid === globalObjectIdentifier)
|
|
139
|
-
return comp;
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
if (recursive) {
|
|
144
|
-
if (obj.scenes) {
|
|
145
|
-
for (const i in obj.scenes) {
|
|
146
|
-
const scene = obj.scenes[i];
|
|
147
|
-
const found = tryFindObject(globalObjectIdentifier, scene, recursive, searchComponents);
|
|
148
|
-
if (found)
|
|
149
|
-
return found;
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
if (obj.children) {
|
|
153
|
-
for (const i in obj.children) {
|
|
154
|
-
const child = obj.children[i];
|
|
155
|
-
const found = tryFindObject(globalObjectIdentifier, child, recursive, searchComponents);
|
|
156
|
-
if (found)
|
|
157
|
-
return found;
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
export function deepClone(obj, predicate) {
|
|
163
|
-
if (obj !== null && obj !== undefined && typeof obj === "object") {
|
|
164
|
-
let clone;
|
|
165
|
-
if (Array.isArray(obj))
|
|
166
|
-
clone = [];
|
|
167
|
-
else {
|
|
168
|
-
clone = Object.create(obj);
|
|
169
|
-
Object.assign(clone, obj);
|
|
170
|
-
}
|
|
171
|
-
for (const key of Object.keys(obj)) {
|
|
172
|
-
const val = obj[key];
|
|
173
|
-
if (predicate && !predicate(obj, key, val)) {
|
|
174
|
-
// console.log("SKIP", val);
|
|
175
|
-
clone[key] = val;
|
|
176
|
-
}
|
|
177
|
-
else if (val?.clone !== undefined && typeof val.clone === "function")
|
|
178
|
-
clone[key] = val.clone();
|
|
179
|
-
else
|
|
180
|
-
clone[key] = deepClone(val, predicate);
|
|
181
|
-
}
|
|
182
|
-
return clone;
|
|
183
|
-
}
|
|
184
|
-
return obj;
|
|
185
|
-
}
|
|
186
|
-
export function delay(milliseconds) {
|
|
187
|
-
return new Promise((res, _) => {
|
|
188
|
-
setTimeout(res, milliseconds);
|
|
189
|
-
});
|
|
190
|
-
}
|
|
191
|
-
// 1) if a timeline is exported via menu item the audio clip path is relative to the glb (same folder)
|
|
192
|
-
// we need to detect that here and build the new audio source path relative to the new glb location
|
|
193
|
-
// the same is/might be true for any file that is/will be exported via menu item
|
|
194
|
-
// 2) if the needle.config assetDirectory is modified (from e.g. /assets to /needle/assets) when building a distributable our vite transform and copy plugin will move the files to dist/assets hence we cannot use project-relative paths (because the path changes). What we do instead if make all paths serialized in a glb relative to the glb. The rel: prefix is used to detect urls that need to be resolved.
|
|
195
|
-
const debugGetPath = getParam("debugresolveurl");
|
|
196
|
-
export const relativePathPrefix = "rel:";
|
|
197
|
-
/** @deprecated use resolveUrl instead */
|
|
198
|
-
export function getPath(source, uri) {
|
|
199
|
-
return resolveUrl(source, uri);
|
|
200
|
-
}
|
|
201
|
-
/**
|
|
202
|
-
* Use to resolve a url serialized in a glTF file
|
|
203
|
-
* @param source The uri of the loading file
|
|
204
|
-
* @param uri The uri of the file to resolve, can be absolute or relative
|
|
205
|
-
* @returns The resolved uri
|
|
206
|
-
*/
|
|
207
|
-
export function resolveUrl(source, uri) {
|
|
208
|
-
if (uri === undefined) {
|
|
209
|
-
if (debugGetPath)
|
|
210
|
-
console.warn("getPath: uri is undefined, returning uri", uri);
|
|
211
|
-
return uri;
|
|
212
|
-
}
|
|
213
|
-
if (uri.startsWith("./")) {
|
|
214
|
-
return uri;
|
|
215
|
-
}
|
|
216
|
-
if (uri.startsWith("http")) {
|
|
217
|
-
if (debugGetPath)
|
|
218
|
-
console.warn("getPath: uri is absolute, returning uri", uri);
|
|
219
|
-
return uri;
|
|
220
|
-
}
|
|
221
|
-
if (source === undefined) {
|
|
222
|
-
if (debugGetPath)
|
|
223
|
-
console.warn("getPath: source is undefined, returning uri", uri);
|
|
224
|
-
return uri;
|
|
225
|
-
}
|
|
226
|
-
if (uri.startsWith(relativePathPrefix)) {
|
|
227
|
-
uri = uri.substring(4);
|
|
228
|
-
}
|
|
229
|
-
const pathIndex = source.lastIndexOf("/");
|
|
230
|
-
if (pathIndex >= 0) {
|
|
231
|
-
// Take the source uri as the base path
|
|
232
|
-
const basePath = source.substring(0, pathIndex + 1);
|
|
233
|
-
// Append the relative uri
|
|
234
|
-
const newUri = basePath + uri;
|
|
235
|
-
// newUri = new URL(newUri, globalThis.location.href).href;
|
|
236
|
-
if (debugGetPath)
|
|
237
|
-
console.log("source:", source, "- changed uri \nfrom", uri, "\n→ ", newUri, "\n" + basePath);
|
|
238
|
-
return newUri;
|
|
239
|
-
}
|
|
240
|
-
return uri;
|
|
241
|
-
}
|
|
242
|
-
// TODO: make it possible to add multiple watches to the same object property
|
|
243
|
-
class WatchImpl {
|
|
244
|
-
subscribeWrite(callback) {
|
|
245
|
-
this.writeCallbacks.push(callback);
|
|
246
|
-
}
|
|
247
|
-
unsubscribeWrite(callback) {
|
|
248
|
-
const i = this.writeCallbacks.indexOf(callback);
|
|
249
|
-
if (i === -1)
|
|
250
|
-
return;
|
|
251
|
-
this.writeCallbacks.splice(i, 1);
|
|
252
|
-
}
|
|
253
|
-
writeCallbacks = [];
|
|
254
|
-
constructor(object, prop) {
|
|
255
|
-
this._object = object;
|
|
256
|
-
this._prop = prop;
|
|
257
|
-
this._wrapperProp = Symbol("$" + prop);
|
|
258
|
-
this.apply();
|
|
259
|
-
}
|
|
260
|
-
_applied = false;
|
|
261
|
-
_object;
|
|
262
|
-
_prop;
|
|
263
|
-
_wrapperProp;
|
|
264
|
-
apply() {
|
|
265
|
-
if (this._applied)
|
|
266
|
-
return;
|
|
267
|
-
if (!this._object)
|
|
268
|
-
return;
|
|
269
|
-
const object = this._object;
|
|
270
|
-
const prop = this._prop;
|
|
271
|
-
if (object[prop] === undefined)
|
|
272
|
-
return;
|
|
273
|
-
this._applied = true;
|
|
274
|
-
if (object[this._wrapperProp] !== undefined) {
|
|
275
|
-
console.warn("Watcher is being applied to an object that already has a wrapper property. This is not (yet) supported");
|
|
276
|
-
}
|
|
277
|
-
// create a wrapper property
|
|
278
|
-
const current = object[prop];
|
|
279
|
-
object[this._wrapperProp] = current;
|
|
280
|
-
// create wrapper methods
|
|
281
|
-
const getter = () => {
|
|
282
|
-
return object[this._wrapperProp];
|
|
283
|
-
};
|
|
284
|
-
const setter = (value) => {
|
|
285
|
-
object[this._wrapperProp] = value;
|
|
286
|
-
for (const write of this.writeCallbacks) {
|
|
287
|
-
write(value, this._prop);
|
|
288
|
-
}
|
|
289
|
-
};
|
|
290
|
-
// add the wrapper to the object
|
|
291
|
-
Object.defineProperty(object, prop, {
|
|
292
|
-
get: getter,
|
|
293
|
-
set: setter
|
|
294
|
-
});
|
|
295
|
-
}
|
|
296
|
-
revoke() {
|
|
297
|
-
if (!this._applied)
|
|
298
|
-
return;
|
|
299
|
-
if (!this._object)
|
|
300
|
-
return;
|
|
301
|
-
this._applied = false;
|
|
302
|
-
const object = this._object;
|
|
303
|
-
const prop = this._prop;
|
|
304
|
-
Reflect.deleteProperty(object, prop);
|
|
305
|
-
const current = object[this._wrapperProp];
|
|
306
|
-
object[prop] = current;
|
|
307
|
-
Reflect.deleteProperty(object, this._wrapperProp);
|
|
308
|
-
}
|
|
309
|
-
dispose() {
|
|
310
|
-
this.revoke();
|
|
311
|
-
this.writeCallbacks.length = 0;
|
|
312
|
-
this._object = null;
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
export class Watch {
|
|
316
|
-
_watches = [];
|
|
317
|
-
constructor(object, str) {
|
|
318
|
-
if (Array.isArray(str)) {
|
|
319
|
-
for (const s of str) {
|
|
320
|
-
this._watches.push(new Watch(object, s));
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
else {
|
|
324
|
-
this._watches.push(new WatchImpl(object, str));
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
subscribeWrite(callback) {
|
|
328
|
-
for (const w of this._watches) {
|
|
329
|
-
w.subscribeWrite(callback);
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
unsubscribeWrite(callback) {
|
|
333
|
-
for (const w of this._watches) {
|
|
334
|
-
w.unsubscribeWrite(callback);
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
apply() {
|
|
338
|
-
for (const w of this._watches) {
|
|
339
|
-
w.apply();
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
revoke() {
|
|
343
|
-
for (const w of this._watches) {
|
|
344
|
-
w.revoke();
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
dispose() {
|
|
348
|
-
for (const w of this._watches) {
|
|
349
|
-
w.dispose();
|
|
350
|
-
}
|
|
351
|
-
this._watches.length = 0;
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
const watchesKey = Symbol("needle:watches");
|
|
355
|
-
/** Subscribe to an object being written to
|
|
356
|
-
* Currently supporting Vector3
|
|
357
|
-
*/
|
|
358
|
-
export function watchWrite(vec, cb) {
|
|
359
|
-
if (!vec[watchesKey]) {
|
|
360
|
-
if (vec instanceof Vector2) {
|
|
361
|
-
vec[watchesKey] = new Watch(vec, ["x", "y"]);
|
|
362
|
-
}
|
|
363
|
-
else if (vec instanceof Vector3) {
|
|
364
|
-
vec[watchesKey] = new Watch(vec, ["x", "y", "z"]);
|
|
365
|
-
}
|
|
366
|
-
else if (vec instanceof Vector4 || vec instanceof Quaternion) {
|
|
367
|
-
vec[watchesKey] = new Watch(vec, ["x", "y", "z", "w"]);
|
|
368
|
-
}
|
|
369
|
-
else {
|
|
370
|
-
return false;
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
vec[watchesKey].subscribeWrite(cb);
|
|
374
|
-
return true;
|
|
375
|
-
}
|
|
376
|
-
export function unwatchWrite(vec, cb) {
|
|
377
|
-
if (!vec)
|
|
378
|
-
return;
|
|
379
|
-
const watch = vec[watchesKey];
|
|
380
|
-
if (!watch)
|
|
381
|
-
return;
|
|
382
|
-
watch.unsubscribeWrite(cb);
|
|
383
|
-
}
|
|
384
|
-
;
|
|
385
|
-
export function isMobileDevice() {
|
|
386
|
-
return (typeof window.orientation !== "undefined") || (navigator.userAgent.indexOf('IEMobile') !== -1);
|
|
387
|
-
}
|
|
388
|
-
export function isMozillaXR() {
|
|
389
|
-
return /WebXRViewer\//i.test(navigator.userAgent);
|
|
390
|
-
}
|
|
391
|
-
const iosDevices = ['iPad Simulator', 'iPhone Simulator', 'iPod Simulator', 'iPad', 'iPhone', 'iPod'];
|
|
392
|
-
export function isiOS() {
|
|
393
|
-
return iosDevices.includes(navigator.platform)
|
|
394
|
-
// iPad on iOS 13 detection
|
|
395
|
-
|| (navigator.userAgent.includes("Mac") && "ontouchend" in document);
|
|
396
|
-
}
|
|
397
|
-
export function isSafari() {
|
|
398
|
-
return /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
|
|
399
|
-
}
|
|
400
|
-
export function isQuest() {
|
|
401
|
-
return navigator.userAgent.includes("OculusBrowser");
|
|
402
|
-
}
|
|
403
|
-
export async function microphonePermissionsGranted() {
|
|
404
|
-
try {
|
|
405
|
-
//@ts-ignore
|
|
406
|
-
const res = await navigator.permissions.query({ name: 'microphone' });
|
|
407
|
-
if (res.state === "denied") {
|
|
408
|
-
return false;
|
|
409
|
-
}
|
|
410
|
-
return true;
|
|
411
|
-
}
|
|
412
|
-
catch (err) {
|
|
413
|
-
console.error("Error querying `microphone` permissions.", err);
|
|
414
|
-
return false;
|
|
415
|
-
}
|
|
416
|
-
}
|
|
417
|
-
const cloudflareIPRegex = /ip=(?<ip>.+?)\n/s;
|
|
418
|
-
export async function getIpCloudflare() {
|
|
419
|
-
const data = await fetch('https://www.cloudflare.com/cdn-cgi/trace');
|
|
420
|
-
const body = await data.text();
|
|
421
|
-
// we are only interested in the ip= part:
|
|
422
|
-
const match = cloudflareIPRegex.exec(body);
|
|
423
|
-
if (match)
|
|
424
|
-
return match[1];
|
|
425
|
-
return null;
|
|
426
|
-
}
|
|
427
|
-
export async function getIp() {
|
|
428
|
-
const res = await fetch("https://api.db-ip.com/v2/free/self");
|
|
429
|
-
const json = await res.json();
|
|
430
|
-
return json.ipAddress;
|
|
431
|
-
}
|
|
432
|
-
export async function getIpAndLocation() {
|
|
433
|
-
const res = (await fetch("https://api.db-ip.com/v2/free/self").catch(() => null));
|
|
434
|
-
const json = await res.json();
|
|
435
|
-
return json;
|
|
436
|
-
}
|
|
437
|
-
const mutationObserverMap = new WeakMap();
|
|
438
|
-
/** Register a callback when a attribute changes */
|
|
439
|
-
export function addAttributeChangeCallback(domElement, name, callback) {
|
|
440
|
-
if (!mutationObserverMap.get(domElement)) {
|
|
441
|
-
const observer = new MutationObserver((mutations) => {
|
|
442
|
-
handleMutations(domElement, mutations);
|
|
443
|
-
});
|
|
444
|
-
mutationObserverMap.set(domElement, {
|
|
445
|
-
observer,
|
|
446
|
-
attributeChangedListeners: new Map(),
|
|
447
|
-
});
|
|
448
|
-
observer.observe(domElement, { attributes: true });
|
|
449
|
-
}
|
|
450
|
-
const listeners = mutationObserverMap.get(domElement).attributeChangedListeners;
|
|
451
|
-
if (!listeners.has(name)) {
|
|
452
|
-
listeners.set(name, []);
|
|
453
|
-
}
|
|
454
|
-
listeners.get(name).push(callback);
|
|
455
|
-
}
|
|
456
|
-
;
|
|
457
|
-
export function removeAttributeChangeCallback(domElement, name, callback) {
|
|
458
|
-
if (!mutationObserverMap.get(domElement))
|
|
459
|
-
return;
|
|
460
|
-
const listeners = mutationObserverMap.get(domElement).attributeChangedListeners;
|
|
461
|
-
if (!listeners.has(name))
|
|
462
|
-
return;
|
|
463
|
-
const arr = listeners.get(name);
|
|
464
|
-
const index = arr.indexOf(callback);
|
|
465
|
-
if (index === -1)
|
|
466
|
-
return;
|
|
467
|
-
arr.splice(index, 1);
|
|
468
|
-
if (arr.length <= 0) {
|
|
469
|
-
listeners.delete(name);
|
|
470
|
-
const entry = mutationObserverMap.get(domElement);
|
|
471
|
-
entry?.observer.disconnect();
|
|
472
|
-
mutationObserverMap.delete(domElement);
|
|
473
|
-
}
|
|
474
|
-
}
|
|
475
|
-
function handleMutations(domElement, mutations) {
|
|
476
|
-
const listeners = mutationObserverMap.get(domElement).attributeChangedListeners;
|
|
477
|
-
for (const mut of mutations) {
|
|
478
|
-
if (mut.type === "attributes") {
|
|
479
|
-
const name = mut.attributeName;
|
|
480
|
-
const value = domElement.getAttribute(name);
|
|
481
|
-
if (listeners.has(name)) {
|
|
482
|
-
for (const listener of listeners.get(name)) {
|
|
483
|
-
listener(value);
|
|
484
|
-
}
|
|
485
|
-
}
|
|
486
|
-
}
|
|
487
|
-
}
|
|
488
|
-
}
|
|
489
|
-
export class PromiseErrorResult {
|
|
490
|
-
reason;
|
|
491
|
-
constructor(reason) {
|
|
492
|
-
this.reason = reason;
|
|
493
|
-
}
|
|
494
|
-
}
|
|
495
|
-
/** Can be used to simplify Promise error handling and if errors are acceptable.
|
|
496
|
-
* Promise.all will just fail if any of the provided promises fails and not return or cancel pending promises or partial results
|
|
497
|
-
* Using Promise.allSettled (or this method) instead will return a result for each promise and not automatically fail if any of the promises fails.
|
|
498
|
-
* Instead it will return a promise containing information if any of the promises failed
|
|
499
|
-
* and the actual results will be available as `results` array
|
|
500
|
-
**/
|
|
501
|
-
export async function PromiseAllWithErrors(promise) {
|
|
502
|
-
const results = await Promise.allSettled(promise).catch(err => {
|
|
503
|
-
return [
|
|
504
|
-
new PromiseErrorResult(err.message)
|
|
505
|
-
];
|
|
506
|
-
});
|
|
507
|
-
let anyFailed = false;
|
|
508
|
-
const res = results.map(x => {
|
|
509
|
-
if ("value" in x)
|
|
510
|
-
return x.value;
|
|
511
|
-
anyFailed = true;
|
|
512
|
-
return new PromiseErrorResult(x.reason);
|
|
513
|
-
});
|
|
514
|
-
return {
|
|
515
|
-
anyFailed: anyFailed,
|
|
516
|
-
results: res,
|
|
517
|
-
};
|
|
518
|
-
}
|
|
1
|
+
// use for typesafe interface method calls
|
|
2
|
+
import { Quaternion, Vector2, Vector3, Vector4 } from "three";
|
|
3
|
+
// https://schneidenbach.gitbooks.io/typescript-cookbook/content/nameof-operator.html
|
|
4
|
+
export const nameofFactory = () => (name) => name;
|
|
5
|
+
export function nameof(name) {
|
|
6
|
+
return nameofFactory()(name);
|
|
7
|
+
}
|
|
8
|
+
export function isDebugMode() {
|
|
9
|
+
return getParam("debug") ? true : false;
|
|
10
|
+
}
|
|
11
|
+
export class CircularBuffer {
|
|
12
|
+
_factory;
|
|
13
|
+
_cache = [];
|
|
14
|
+
_maxSize;
|
|
15
|
+
_index = 0;
|
|
16
|
+
constructor(factory, maxSize) {
|
|
17
|
+
this._factory = factory;
|
|
18
|
+
this._maxSize = maxSize;
|
|
19
|
+
}
|
|
20
|
+
get() {
|
|
21
|
+
const i = this._index % this._maxSize;
|
|
22
|
+
this._index++;
|
|
23
|
+
if (this._cache.length <= i) {
|
|
24
|
+
this._cache[i] = this._factory();
|
|
25
|
+
}
|
|
26
|
+
return this._cache[i];
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
let saveParams = false;
|
|
30
|
+
const requestedParams = [];
|
|
31
|
+
setTimeout(() => {
|
|
32
|
+
if (saveParams) {
|
|
33
|
+
console.log(requestedParams.sort());
|
|
34
|
+
}
|
|
35
|
+
}, 100);
|
|
36
|
+
export function getUrlParams() {
|
|
37
|
+
// "window" may not exist in node.js
|
|
38
|
+
return new URLSearchParams(globalThis.location?.search);
|
|
39
|
+
}
|
|
40
|
+
/** Checks if a url parameter exists.
|
|
41
|
+
* Returns true if it exists but has no value (e.g. ?help)
|
|
42
|
+
* Returns false if it does not exist
|
|
43
|
+
* Returns false if it's set to 0 e.g. ?debug=0
|
|
44
|
+
* Returns the value if it exists e.g. ?message=hello
|
|
45
|
+
*/
|
|
46
|
+
export function getParam(paramName) {
|
|
47
|
+
if (saveParams && !requestedParams.includes(paramName))
|
|
48
|
+
requestedParams.push(paramName);
|
|
49
|
+
const urlParams = getUrlParams();
|
|
50
|
+
if (urlParams.has(paramName)) {
|
|
51
|
+
const val = urlParams.get(paramName);
|
|
52
|
+
if (val) {
|
|
53
|
+
const num = Number(val);
|
|
54
|
+
if (!isNaN(num))
|
|
55
|
+
return num;
|
|
56
|
+
return val;
|
|
57
|
+
}
|
|
58
|
+
else
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
saveParams = getParam("help") === true;
|
|
64
|
+
export function setParam(paramName, paramValue) {
|
|
65
|
+
const urlParams = getUrlParams();
|
|
66
|
+
if (urlParams.has(paramName)) {
|
|
67
|
+
urlParams.set(paramName, paramValue);
|
|
68
|
+
}
|
|
69
|
+
else
|
|
70
|
+
urlParams.append(paramName, paramValue);
|
|
71
|
+
document.location.search = urlParams.toString();
|
|
72
|
+
}
|
|
73
|
+
export function setParamWithoutReload(paramName, paramValue, appendHistory = true) {
|
|
74
|
+
const urlParams = getUrlParams();
|
|
75
|
+
if (urlParams.has(paramName)) {
|
|
76
|
+
if (paramValue === null)
|
|
77
|
+
urlParams.delete(paramName);
|
|
78
|
+
else
|
|
79
|
+
urlParams.set(paramName, paramValue);
|
|
80
|
+
}
|
|
81
|
+
else if (paramValue !== null)
|
|
82
|
+
urlParams.append(paramName, paramValue);
|
|
83
|
+
if (appendHistory)
|
|
84
|
+
pushState(paramName, urlParams);
|
|
85
|
+
else
|
|
86
|
+
setState(paramName, urlParams);
|
|
87
|
+
}
|
|
88
|
+
export function setOrAddParamsToUrl(url, paramName, paramValue) {
|
|
89
|
+
if (url.has(paramName)) {
|
|
90
|
+
url.set(paramName, paramValue.toString());
|
|
91
|
+
}
|
|
92
|
+
else
|
|
93
|
+
url.append(paramName, paramValue.toString());
|
|
94
|
+
}
|
|
95
|
+
export function pushState(title, urlParams, state) {
|
|
96
|
+
window.history.pushState(state, title, "?" + urlParams.toString());
|
|
97
|
+
}
|
|
98
|
+
export function setState(title, urlParams, state) {
|
|
99
|
+
window.history.replaceState(state, title, "?" + urlParams.toString());
|
|
100
|
+
}
|
|
101
|
+
// for room id
|
|
102
|
+
export function makeId(length) {
|
|
103
|
+
var result = '';
|
|
104
|
+
var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
|
105
|
+
var charactersLength = characters.length;
|
|
106
|
+
for (var i = 0; i < length; i++) {
|
|
107
|
+
result += characters.charAt(Math.floor(Math.random() *
|
|
108
|
+
charactersLength));
|
|
109
|
+
}
|
|
110
|
+
return result;
|
|
111
|
+
}
|
|
112
|
+
export function randomNumber(min, max) {
|
|
113
|
+
return Math.floor(Math.random() * (max - min + 1)) + min;
|
|
114
|
+
}
|
|
115
|
+
const adjectives = ["smol", "tiny", "giant", "interesting", "smart", "bright", "dull", "extreme", "beautiful", "pretty", "dark", "epic", "salty", "silly", "funny", "lame", "lazy", "loud", "lucky", "mad", "mean", "mighty", "mysterious", "nasty", "odd", "old", "powerful", "quiet", "rapid", "scary", "shiny", "shy", "silly", "smooth", "sour", "spicy", "stupid", "sweet", "tasty", "terrible", "ugly", "unusual", "vast", "wet", "wild", "witty", "wrong", "zany", "zealous", "zippy", "zombie", "zorro"];
|
|
116
|
+
const nouns = ["cat", "dog", "mouse", "pig", "cow", "horse", "sheep", "chicken", "duck", "goat", "panda", "tiger", "lion", "elephant", "monkey", "bird", "fish", "snake", "frog", "turtle", "hamster", "penguin", "kangaroo", "whale", "dolphin", "crocodile", "snail", "ant", "bee", "beetle", "butterfly", "dragon", "eagle", "fish", "giraffe", "lizard", "panda", "penguin", "rabbit", "snake", "spider", "tiger", "zebra"];
|
|
117
|
+
export function makeIdFromRandomWords() {
|
|
118
|
+
const randomAdjective = adjectives[Math.floor(Math.random() * adjectives.length)];
|
|
119
|
+
const randomNoun = nouns[Math.floor(Math.random() * nouns.length)];
|
|
120
|
+
return randomAdjective + "_" + randomNoun;
|
|
121
|
+
}
|
|
122
|
+
// for url parameters
|
|
123
|
+
export function sanitizeString(str) {
|
|
124
|
+
str = str.replace(/[^a-z0-9áéíóúñü \.,_-]/gim, "");
|
|
125
|
+
return str.trim();
|
|
126
|
+
}
|
|
127
|
+
// TODO: taken from scene utils
|
|
128
|
+
export function tryFindObject(globalObjectIdentifier, obj, recursive = true, searchComponents = false) {
|
|
129
|
+
if (obj === undefined || obj === null)
|
|
130
|
+
return null;
|
|
131
|
+
if (obj.userData && obj.userData.guid === globalObjectIdentifier)
|
|
132
|
+
return obj;
|
|
133
|
+
else if (obj.guid == globalObjectIdentifier)
|
|
134
|
+
return obj;
|
|
135
|
+
if (searchComponents) {
|
|
136
|
+
if (obj.userData?.components) {
|
|
137
|
+
for (const comp of obj.userData.components) {
|
|
138
|
+
if (comp.guid === globalObjectIdentifier)
|
|
139
|
+
return comp;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
if (recursive) {
|
|
144
|
+
if (obj.scenes) {
|
|
145
|
+
for (const i in obj.scenes) {
|
|
146
|
+
const scene = obj.scenes[i];
|
|
147
|
+
const found = tryFindObject(globalObjectIdentifier, scene, recursive, searchComponents);
|
|
148
|
+
if (found)
|
|
149
|
+
return found;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
if (obj.children) {
|
|
153
|
+
for (const i in obj.children) {
|
|
154
|
+
const child = obj.children[i];
|
|
155
|
+
const found = tryFindObject(globalObjectIdentifier, child, recursive, searchComponents);
|
|
156
|
+
if (found)
|
|
157
|
+
return found;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
export function deepClone(obj, predicate) {
|
|
163
|
+
if (obj !== null && obj !== undefined && typeof obj === "object") {
|
|
164
|
+
let clone;
|
|
165
|
+
if (Array.isArray(obj))
|
|
166
|
+
clone = [];
|
|
167
|
+
else {
|
|
168
|
+
clone = Object.create(obj);
|
|
169
|
+
Object.assign(clone, obj);
|
|
170
|
+
}
|
|
171
|
+
for (const key of Object.keys(obj)) {
|
|
172
|
+
const val = obj[key];
|
|
173
|
+
if (predicate && !predicate(obj, key, val)) {
|
|
174
|
+
// console.log("SKIP", val);
|
|
175
|
+
clone[key] = val;
|
|
176
|
+
}
|
|
177
|
+
else if (val?.clone !== undefined && typeof val.clone === "function")
|
|
178
|
+
clone[key] = val.clone();
|
|
179
|
+
else
|
|
180
|
+
clone[key] = deepClone(val, predicate);
|
|
181
|
+
}
|
|
182
|
+
return clone;
|
|
183
|
+
}
|
|
184
|
+
return obj;
|
|
185
|
+
}
|
|
186
|
+
export function delay(milliseconds) {
|
|
187
|
+
return new Promise((res, _) => {
|
|
188
|
+
setTimeout(res, milliseconds);
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
// 1) if a timeline is exported via menu item the audio clip path is relative to the glb (same folder)
|
|
192
|
+
// we need to detect that here and build the new audio source path relative to the new glb location
|
|
193
|
+
// the same is/might be true for any file that is/will be exported via menu item
|
|
194
|
+
// 2) if the needle.config assetDirectory is modified (from e.g. /assets to /needle/assets) when building a distributable our vite transform and copy plugin will move the files to dist/assets hence we cannot use project-relative paths (because the path changes). What we do instead if make all paths serialized in a glb relative to the glb. The rel: prefix is used to detect urls that need to be resolved.
|
|
195
|
+
const debugGetPath = getParam("debugresolveurl");
|
|
196
|
+
export const relativePathPrefix = "rel:";
|
|
197
|
+
/** @deprecated use resolveUrl instead */
|
|
198
|
+
export function getPath(source, uri) {
|
|
199
|
+
return resolveUrl(source, uri);
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Use to resolve a url serialized in a glTF file
|
|
203
|
+
* @param source The uri of the loading file
|
|
204
|
+
* @param uri The uri of the file to resolve, can be absolute or relative
|
|
205
|
+
* @returns The resolved uri
|
|
206
|
+
*/
|
|
207
|
+
export function resolveUrl(source, uri) {
|
|
208
|
+
if (uri === undefined) {
|
|
209
|
+
if (debugGetPath)
|
|
210
|
+
console.warn("getPath: uri is undefined, returning uri", uri);
|
|
211
|
+
return uri;
|
|
212
|
+
}
|
|
213
|
+
if (uri.startsWith("./")) {
|
|
214
|
+
return uri;
|
|
215
|
+
}
|
|
216
|
+
if (uri.startsWith("http")) {
|
|
217
|
+
if (debugGetPath)
|
|
218
|
+
console.warn("getPath: uri is absolute, returning uri", uri);
|
|
219
|
+
return uri;
|
|
220
|
+
}
|
|
221
|
+
if (source === undefined) {
|
|
222
|
+
if (debugGetPath)
|
|
223
|
+
console.warn("getPath: source is undefined, returning uri", uri);
|
|
224
|
+
return uri;
|
|
225
|
+
}
|
|
226
|
+
if (uri.startsWith(relativePathPrefix)) {
|
|
227
|
+
uri = uri.substring(4);
|
|
228
|
+
}
|
|
229
|
+
const pathIndex = source.lastIndexOf("/");
|
|
230
|
+
if (pathIndex >= 0) {
|
|
231
|
+
// Take the source uri as the base path
|
|
232
|
+
const basePath = source.substring(0, pathIndex + 1);
|
|
233
|
+
// Append the relative uri
|
|
234
|
+
const newUri = basePath + uri;
|
|
235
|
+
// newUri = new URL(newUri, globalThis.location.href).href;
|
|
236
|
+
if (debugGetPath)
|
|
237
|
+
console.log("source:", source, "- changed uri \nfrom", uri, "\n→ ", newUri, "\n" + basePath);
|
|
238
|
+
return newUri;
|
|
239
|
+
}
|
|
240
|
+
return uri;
|
|
241
|
+
}
|
|
242
|
+
// TODO: make it possible to add multiple watches to the same object property
|
|
243
|
+
class WatchImpl {
|
|
244
|
+
subscribeWrite(callback) {
|
|
245
|
+
this.writeCallbacks.push(callback);
|
|
246
|
+
}
|
|
247
|
+
unsubscribeWrite(callback) {
|
|
248
|
+
const i = this.writeCallbacks.indexOf(callback);
|
|
249
|
+
if (i === -1)
|
|
250
|
+
return;
|
|
251
|
+
this.writeCallbacks.splice(i, 1);
|
|
252
|
+
}
|
|
253
|
+
writeCallbacks = [];
|
|
254
|
+
constructor(object, prop) {
|
|
255
|
+
this._object = object;
|
|
256
|
+
this._prop = prop;
|
|
257
|
+
this._wrapperProp = Symbol("$" + prop);
|
|
258
|
+
this.apply();
|
|
259
|
+
}
|
|
260
|
+
_applied = false;
|
|
261
|
+
_object;
|
|
262
|
+
_prop;
|
|
263
|
+
_wrapperProp;
|
|
264
|
+
apply() {
|
|
265
|
+
if (this._applied)
|
|
266
|
+
return;
|
|
267
|
+
if (!this._object)
|
|
268
|
+
return;
|
|
269
|
+
const object = this._object;
|
|
270
|
+
const prop = this._prop;
|
|
271
|
+
if (object[prop] === undefined)
|
|
272
|
+
return;
|
|
273
|
+
this._applied = true;
|
|
274
|
+
if (object[this._wrapperProp] !== undefined) {
|
|
275
|
+
console.warn("Watcher is being applied to an object that already has a wrapper property. This is not (yet) supported");
|
|
276
|
+
}
|
|
277
|
+
// create a wrapper property
|
|
278
|
+
const current = object[prop];
|
|
279
|
+
object[this._wrapperProp] = current;
|
|
280
|
+
// create wrapper methods
|
|
281
|
+
const getter = () => {
|
|
282
|
+
return object[this._wrapperProp];
|
|
283
|
+
};
|
|
284
|
+
const setter = (value) => {
|
|
285
|
+
object[this._wrapperProp] = value;
|
|
286
|
+
for (const write of this.writeCallbacks) {
|
|
287
|
+
write(value, this._prop);
|
|
288
|
+
}
|
|
289
|
+
};
|
|
290
|
+
// add the wrapper to the object
|
|
291
|
+
Object.defineProperty(object, prop, {
|
|
292
|
+
get: getter,
|
|
293
|
+
set: setter
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
revoke() {
|
|
297
|
+
if (!this._applied)
|
|
298
|
+
return;
|
|
299
|
+
if (!this._object)
|
|
300
|
+
return;
|
|
301
|
+
this._applied = false;
|
|
302
|
+
const object = this._object;
|
|
303
|
+
const prop = this._prop;
|
|
304
|
+
Reflect.deleteProperty(object, prop);
|
|
305
|
+
const current = object[this._wrapperProp];
|
|
306
|
+
object[prop] = current;
|
|
307
|
+
Reflect.deleteProperty(object, this._wrapperProp);
|
|
308
|
+
}
|
|
309
|
+
dispose() {
|
|
310
|
+
this.revoke();
|
|
311
|
+
this.writeCallbacks.length = 0;
|
|
312
|
+
this._object = null;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
export class Watch {
|
|
316
|
+
_watches = [];
|
|
317
|
+
constructor(object, str) {
|
|
318
|
+
if (Array.isArray(str)) {
|
|
319
|
+
for (const s of str) {
|
|
320
|
+
this._watches.push(new Watch(object, s));
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
else {
|
|
324
|
+
this._watches.push(new WatchImpl(object, str));
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
subscribeWrite(callback) {
|
|
328
|
+
for (const w of this._watches) {
|
|
329
|
+
w.subscribeWrite(callback);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
unsubscribeWrite(callback) {
|
|
333
|
+
for (const w of this._watches) {
|
|
334
|
+
w.unsubscribeWrite(callback);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
apply() {
|
|
338
|
+
for (const w of this._watches) {
|
|
339
|
+
w.apply();
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
revoke() {
|
|
343
|
+
for (const w of this._watches) {
|
|
344
|
+
w.revoke();
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
dispose() {
|
|
348
|
+
for (const w of this._watches) {
|
|
349
|
+
w.dispose();
|
|
350
|
+
}
|
|
351
|
+
this._watches.length = 0;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
const watchesKey = Symbol("needle:watches");
|
|
355
|
+
/** Subscribe to an object being written to
|
|
356
|
+
* Currently supporting Vector3
|
|
357
|
+
*/
|
|
358
|
+
export function watchWrite(vec, cb) {
|
|
359
|
+
if (!vec[watchesKey]) {
|
|
360
|
+
if (vec instanceof Vector2) {
|
|
361
|
+
vec[watchesKey] = new Watch(vec, ["x", "y"]);
|
|
362
|
+
}
|
|
363
|
+
else if (vec instanceof Vector3) {
|
|
364
|
+
vec[watchesKey] = new Watch(vec, ["x", "y", "z"]);
|
|
365
|
+
}
|
|
366
|
+
else if (vec instanceof Vector4 || vec instanceof Quaternion) {
|
|
367
|
+
vec[watchesKey] = new Watch(vec, ["x", "y", "z", "w"]);
|
|
368
|
+
}
|
|
369
|
+
else {
|
|
370
|
+
return false;
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
vec[watchesKey].subscribeWrite(cb);
|
|
374
|
+
return true;
|
|
375
|
+
}
|
|
376
|
+
export function unwatchWrite(vec, cb) {
|
|
377
|
+
if (!vec)
|
|
378
|
+
return;
|
|
379
|
+
const watch = vec[watchesKey];
|
|
380
|
+
if (!watch)
|
|
381
|
+
return;
|
|
382
|
+
watch.unsubscribeWrite(cb);
|
|
383
|
+
}
|
|
384
|
+
;
|
|
385
|
+
export function isMobileDevice() {
|
|
386
|
+
return (typeof window.orientation !== "undefined") || (navigator.userAgent.indexOf('IEMobile') !== -1);
|
|
387
|
+
}
|
|
388
|
+
export function isMozillaXR() {
|
|
389
|
+
return /WebXRViewer\//i.test(navigator.userAgent);
|
|
390
|
+
}
|
|
391
|
+
const iosDevices = ['iPad Simulator', 'iPhone Simulator', 'iPod Simulator', 'iPad', 'iPhone', 'iPod'];
|
|
392
|
+
export function isiOS() {
|
|
393
|
+
return iosDevices.includes(navigator.platform)
|
|
394
|
+
// iPad on iOS 13 detection
|
|
395
|
+
|| (navigator.userAgent.includes("Mac") && "ontouchend" in document);
|
|
396
|
+
}
|
|
397
|
+
export function isSafari() {
|
|
398
|
+
return /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
|
|
399
|
+
}
|
|
400
|
+
export function isQuest() {
|
|
401
|
+
return navigator.userAgent.includes("OculusBrowser");
|
|
402
|
+
}
|
|
403
|
+
export async function microphonePermissionsGranted() {
|
|
404
|
+
try {
|
|
405
|
+
//@ts-ignore
|
|
406
|
+
const res = await navigator.permissions.query({ name: 'microphone' });
|
|
407
|
+
if (res.state === "denied") {
|
|
408
|
+
return false;
|
|
409
|
+
}
|
|
410
|
+
return true;
|
|
411
|
+
}
|
|
412
|
+
catch (err) {
|
|
413
|
+
console.error("Error querying `microphone` permissions.", err);
|
|
414
|
+
return false;
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
const cloudflareIPRegex = /ip=(?<ip>.+?)\n/s;
|
|
418
|
+
export async function getIpCloudflare() {
|
|
419
|
+
const data = await fetch('https://www.cloudflare.com/cdn-cgi/trace');
|
|
420
|
+
const body = await data.text();
|
|
421
|
+
// we are only interested in the ip= part:
|
|
422
|
+
const match = cloudflareIPRegex.exec(body);
|
|
423
|
+
if (match)
|
|
424
|
+
return match[1];
|
|
425
|
+
return null;
|
|
426
|
+
}
|
|
427
|
+
export async function getIp() {
|
|
428
|
+
const res = await fetch("https://api.db-ip.com/v2/free/self");
|
|
429
|
+
const json = await res.json();
|
|
430
|
+
return json.ipAddress;
|
|
431
|
+
}
|
|
432
|
+
export async function getIpAndLocation() {
|
|
433
|
+
const res = (await fetch("https://api.db-ip.com/v2/free/self").catch(() => null));
|
|
434
|
+
const json = await res.json();
|
|
435
|
+
return json;
|
|
436
|
+
}
|
|
437
|
+
const mutationObserverMap = new WeakMap();
|
|
438
|
+
/** Register a callback when a attribute changes */
|
|
439
|
+
export function addAttributeChangeCallback(domElement, name, callback) {
|
|
440
|
+
if (!mutationObserverMap.get(domElement)) {
|
|
441
|
+
const observer = new MutationObserver((mutations) => {
|
|
442
|
+
handleMutations(domElement, mutations);
|
|
443
|
+
});
|
|
444
|
+
mutationObserverMap.set(domElement, {
|
|
445
|
+
observer,
|
|
446
|
+
attributeChangedListeners: new Map(),
|
|
447
|
+
});
|
|
448
|
+
observer.observe(domElement, { attributes: true });
|
|
449
|
+
}
|
|
450
|
+
const listeners = mutationObserverMap.get(domElement).attributeChangedListeners;
|
|
451
|
+
if (!listeners.has(name)) {
|
|
452
|
+
listeners.set(name, []);
|
|
453
|
+
}
|
|
454
|
+
listeners.get(name).push(callback);
|
|
455
|
+
}
|
|
456
|
+
;
|
|
457
|
+
export function removeAttributeChangeCallback(domElement, name, callback) {
|
|
458
|
+
if (!mutationObserverMap.get(domElement))
|
|
459
|
+
return;
|
|
460
|
+
const listeners = mutationObserverMap.get(domElement).attributeChangedListeners;
|
|
461
|
+
if (!listeners.has(name))
|
|
462
|
+
return;
|
|
463
|
+
const arr = listeners.get(name);
|
|
464
|
+
const index = arr.indexOf(callback);
|
|
465
|
+
if (index === -1)
|
|
466
|
+
return;
|
|
467
|
+
arr.splice(index, 1);
|
|
468
|
+
if (arr.length <= 0) {
|
|
469
|
+
listeners.delete(name);
|
|
470
|
+
const entry = mutationObserverMap.get(domElement);
|
|
471
|
+
entry?.observer.disconnect();
|
|
472
|
+
mutationObserverMap.delete(domElement);
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
function handleMutations(domElement, mutations) {
|
|
476
|
+
const listeners = mutationObserverMap.get(domElement).attributeChangedListeners;
|
|
477
|
+
for (const mut of mutations) {
|
|
478
|
+
if (mut.type === "attributes") {
|
|
479
|
+
const name = mut.attributeName;
|
|
480
|
+
const value = domElement.getAttribute(name);
|
|
481
|
+
if (listeners.has(name)) {
|
|
482
|
+
for (const listener of listeners.get(name)) {
|
|
483
|
+
listener(value);
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
export class PromiseErrorResult {
|
|
490
|
+
reason;
|
|
491
|
+
constructor(reason) {
|
|
492
|
+
this.reason = reason;
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
/** Can be used to simplify Promise error handling and if errors are acceptable.
|
|
496
|
+
* Promise.all will just fail if any of the provided promises fails and not return or cancel pending promises or partial results
|
|
497
|
+
* Using Promise.allSettled (or this method) instead will return a result for each promise and not automatically fail if any of the promises fails.
|
|
498
|
+
* Instead it will return a promise containing information if any of the promises failed
|
|
499
|
+
* and the actual results will be available as `results` array
|
|
500
|
+
**/
|
|
501
|
+
export async function PromiseAllWithErrors(promise) {
|
|
502
|
+
const results = await Promise.allSettled(promise).catch(err => {
|
|
503
|
+
return [
|
|
504
|
+
new PromiseErrorResult(err.message)
|
|
505
|
+
];
|
|
506
|
+
});
|
|
507
|
+
let anyFailed = false;
|
|
508
|
+
const res = results.map(x => {
|
|
509
|
+
if ("value" in x)
|
|
510
|
+
return x.value;
|
|
511
|
+
anyFailed = true;
|
|
512
|
+
return new PromiseErrorResult(x.reason);
|
|
513
|
+
});
|
|
514
|
+
return {
|
|
515
|
+
anyFailed: anyFailed,
|
|
516
|
+
results: res,
|
|
517
|
+
};
|
|
518
|
+
}
|
|
519
519
|
//# sourceMappingURL=engine_utils.js.map
|