@needle-tools/engine 4.7.1 → 4.7.2-alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +3782 -3782
- package/LICENSE.md +10 -10
- package/README.md +64 -64
- package/components.needle.json +1 -1
- package/dist/generateMeshBVH.worker-Cdfpaq5W.js +25 -0
- package/dist/gltf-progressive-YjtQYFa9.js +1052 -0
- package/dist/gltf-progressive-yOP1mp5W.min.js +8 -0
- package/dist/gltf-progressive-zdhlW609.umd.cjs +8 -0
- package/dist/{needle-engine.bundle-CN9UC6Ju.min.js → needle-engine.bundle-BhDF-YSv.min.js} +65 -65
- package/dist/{needle-engine.bundle-B7M9iBIa.umd.cjs → needle-engine.bundle-D2myV4E4.umd.cjs} +61 -61
- package/dist/{needle-engine.bundle-BpCihhaP.js → needle-engine.bundle-gp00DTS4.js} +641 -641
- package/dist/needle-engine.d.ts +129 -130
- package/dist/needle-engine.js +4 -4
- package/dist/needle-engine.min.js +1 -1
- package/dist/needle-engine.umd.cjs +1 -1
- package/dist/{postprocessing-CjW23fio.umd.cjs → postprocessing-8AQTeZsr.umd.cjs} +2 -2
- package/dist/{postprocessing-xYQWCHFu.min.js → postprocessing-BDScN9yu.min.js} +2 -2
- package/dist/{postprocessing-DYLNOL3W.js → postprocessing-BkxN_08g.js} +3 -3
- package/dist/{three-DuDKwKB8.min.js → three-Boa-jOq-.min.js} +33 -33
- package/dist/{three-DrqIzZTH.js → three-Bz6X1mrw.js} +4198 -4198
- package/dist/{three-B_hneGZr.umd.cjs → three-DMrv-4ar.umd.cjs} +4 -4
- package/dist/{three-examples-X3OadjXB.umd.cjs → three-examples-C7ryg8vN.umd.cjs} +3 -3
- package/dist/{three-examples-DaDLBuy6.min.js → three-examples-DuVhxqft.min.js} +14 -14
- package/dist/{three-examples-B50TT3Iu.js → three-examples-GggCDHv0.js} +5 -5
- package/dist/{three-mesh-ui-CxuWt7m-.js → three-mesh-ui-CLNOfsWn.js} +1 -1
- package/dist/{three-mesh-ui-B3p3gyUz.min.js → three-mesh-ui-CY6Izc7C.min.js} +1 -1
- package/dist/{three-mesh-ui-CQiIQIlA.umd.cjs → three-mesh-ui-CwlN0FUC.umd.cjs} +1 -1
- package/dist/{vendor-BmYIgaS1.js → vendor-BSD1RQIh.js} +3 -3
- package/dist/{vendor-Cavtu3CP.umd.cjs → vendor-DHr4aqIZ.umd.cjs} +3 -3
- package/dist/{vendor-BlSxe9JJ.min.js → vendor-zxXa3Dmr.min.js} +3 -3
- package/lib/asap/needle-asap.d.ts +1 -1
- package/lib/asap/needle-asap.js +95 -95
- package/lib/asap/sessiongranted.d.ts +3 -3
- package/lib/asap/sessiongranted.js +65 -65
- package/lib/asap/utils.d.ts +1 -1
- package/lib/asap/utils.js +3 -3
- package/lib/engine/analytics/index.d.ts +6 -6
- package/lib/engine/analytics/index.js +12 -12
- package/lib/engine/analytics/lcp.d.ts +3 -3
- package/lib/engine/analytics/lcp.js +34 -34
- package/lib/engine/api.d.ts +82 -82
- package/lib/engine/api.js +81 -81
- package/lib/engine/assets/index.d.ts +11 -11
- package/lib/engine/assets/index.js +47 -47
- package/lib/engine/assets/static.d.ts +1 -1
- package/lib/engine/assets/static.js +4 -4
- package/lib/engine/codegen/register_types.d.ts +1 -1
- package/lib/engine/codegen/register_types.js +300 -300
- package/lib/engine/debug/debug.d.ts +15 -15
- package/lib/engine/debug/debug.js +44 -44
- package/lib/engine/debug/debug_console.d.ts +2 -2
- package/lib/engine/debug/debug_console.js +307 -307
- package/lib/engine/debug/debug_overlay.d.ts +22 -22
- package/lib/engine/debug/debug_overlay.js +316 -316
- package/lib/engine/debug/debug_spatial_console.d.ts +2 -2
- package/lib/engine/debug/debug_spatial_console.js +390 -390
- package/lib/engine/debug/index.d.ts +2 -2
- package/lib/engine/debug/index.js +2 -2
- package/lib/engine/engine_addressables.d.ts +164 -164
- package/lib/engine/engine_addressables.js +601 -601
- package/lib/engine/engine_animation.d.ts +43 -43
- package/lib/engine/engine_animation.js +133 -133
- package/lib/engine/engine_application.d.ts +45 -45
- package/lib/engine/engine_application.js +104 -104
- package/lib/engine/engine_assetdatabase.d.ts +25 -25
- package/lib/engine/engine_assetdatabase.js +346 -346
- package/lib/engine/engine_audio.d.ts +4 -4
- package/lib/engine/engine_audio.js +23 -23
- package/lib/engine/engine_camera.d.ts +13 -13
- package/lib/engine/engine_camera.js +30 -30
- package/lib/engine/engine_components.d.ts +110 -110
- package/lib/engine/engine_components.js +374 -374
- package/lib/engine/engine_components_internal.d.ts +9 -9
- package/lib/engine/engine_components_internal.js +36 -36
- package/lib/engine/engine_constants.d.ts +10 -10
- package/lib/engine/engine_constants.js +41 -41
- package/lib/engine/engine_context.d.ts +475 -475
- package/lib/engine/engine_context.js +1673 -1673
- package/lib/engine/engine_context_registry.d.ts +71 -71
- package/lib/engine/engine_context_registry.js +117 -117
- package/lib/engine/engine_coroutine.d.ts +35 -35
- package/lib/engine/engine_coroutine.js +52 -52
- package/lib/engine/engine_create_objects.d.ts +119 -119
- package/lib/engine/engine_create_objects.js +320 -320
- package/lib/engine/engine_default_parameters.d.ts +2 -2
- package/lib/engine/engine_default_parameters.js +3 -3
- package/lib/engine/engine_editor-sync.d.ts +21 -21
- package/lib/engine/engine_editor-sync.js +4 -4
- package/lib/engine/engine_fileloader.d.ts +2 -2
- package/lib/engine/engine_fileloader.js +8 -8
- package/lib/engine/engine_gameobject.d.ts +68 -68
- package/lib/engine/engine_gameobject.js +619 -619
- package/lib/engine/engine_generic_utils.d.ts +1 -1
- package/lib/engine/engine_generic_utils.js +13 -13
- package/lib/engine/engine_gizmos.d.ts +149 -149
- package/lib/engine/engine_gizmos.js +530 -530
- package/lib/engine/engine_gltf.d.ts +12 -12
- package/lib/engine/engine_gltf.js +15 -15
- package/lib/engine/engine_gltf_builtin_components.d.ts +11 -11
- package/lib/engine/engine_gltf_builtin_components.js +341 -341
- package/lib/engine/engine_hot_reload.d.ts +8 -8
- package/lib/engine/engine_hot_reload.js +197 -197
- package/lib/engine/engine_input.d.ts +362 -362
- package/lib/engine/engine_input.js +1294 -1294
- package/lib/engine/engine_input_utils.d.ts +2 -2
- package/lib/engine/engine_input_utils.js +22 -22
- package/lib/engine/engine_instancing.d.ts +19 -19
- package/lib/engine/engine_instancing.js +39 -39
- package/lib/engine/engine_license.d.ts +11 -11
- package/lib/engine/engine_license.js +369 -369
- package/lib/engine/engine_lifecycle_api.d.ts +83 -83
- package/lib/engine/engine_lifecycle_api.js +106 -106
- package/lib/engine/engine_lifecycle_functions_internal.d.ts +32 -32
- package/lib/engine/engine_lifecycle_functions_internal.js +146 -146
- package/lib/engine/engine_lightdata.d.ts +23 -23
- package/lib/engine/engine_lightdata.js +101 -101
- package/lib/engine/engine_loaders.callbacks.d.ts +97 -97
- package/lib/engine/engine_loaders.callbacks.js +86 -86
- package/lib/engine/engine_loaders.d.ts +48 -48
- package/lib/engine/engine_loaders.gltf.d.ts +13 -13
- package/lib/engine/engine_loaders.gltf.js +62 -62
- package/lib/engine/engine_loaders.js +337 -337
- package/lib/engine/engine_lods.d.ts +35 -35
- package/lib/engine/engine_lods.js +160 -160
- package/lib/engine/engine_lods.js.map +1 -1
- package/lib/engine/engine_mainloop_utils.d.ts +32 -32
- package/lib/engine/engine_mainloop_utils.js +466 -466
- package/lib/engine/engine_math.d.ts +114 -114
- package/lib/engine/engine_math.js +247 -247
- package/lib/engine/engine_modules.d.ts +36 -36
- package/lib/engine/engine_modules.js +85 -85
- package/lib/engine/engine_networking.d.ts +260 -260
- package/lib/engine/engine_networking.js +764 -764
- package/lib/engine/engine_networking_auto.d.ts +24 -24
- package/lib/engine/engine_networking_auto.js +310 -310
- package/lib/engine/engine_networking_blob.d.ts +48 -48
- package/lib/engine/engine_networking_blob.js +228 -228
- package/lib/engine/engine_networking_files.d.ts +35 -35
- package/lib/engine/engine_networking_files.js +172 -172
- package/lib/engine/engine_networking_files_default_components.d.ts +6 -6
- package/lib/engine/engine_networking_files_default_components.js +42 -42
- package/lib/engine/engine_networking_instantiate.d.ts +100 -100
- package/lib/engine/engine_networking_instantiate.js +345 -345
- package/lib/engine/engine_networking_peer.d.ts +15 -15
- package/lib/engine/engine_networking_peer.js +132 -132
- package/lib/engine/engine_networking_streams.d.ts +123 -123
- package/lib/engine/engine_networking_streams.js +645 -645
- package/lib/engine/engine_networking_types.d.ts +22 -22
- package/lib/engine/engine_networking_types.js +7 -7
- package/lib/engine/engine_networking_utils.d.ts +2 -2
- package/lib/engine/engine_networking_utils.js +20 -20
- package/lib/engine/engine_networking_websocket.d.ts +1 -1
- package/lib/engine/engine_networking_websocket.js +2 -2
- package/lib/engine/engine_patcher.d.ts +10 -10
- package/lib/engine/engine_patcher.js +142 -142
- package/lib/engine/engine_physics.d.ts +152 -152
- package/lib/engine/engine_physics.js +645 -645
- package/lib/engine/engine_physics.types.d.ts +40 -40
- package/lib/engine/engine_physics.types.js +33 -33
- package/lib/engine/engine_physics_rapier.d.ts +147 -147
- package/lib/engine/engine_physics_rapier.js +1433 -1433
- package/lib/engine/engine_playerview.d.ts +26 -26
- package/lib/engine/engine_playerview.js +64 -64
- package/lib/engine/engine_scenelighting.d.ts +71 -71
- package/lib/engine/engine_scenelighting.js +226 -226
- package/lib/engine/engine_serialization.d.ts +3 -3
- package/lib/engine/engine_serialization.js +3 -3
- package/lib/engine/engine_serialization_builtin_serializer.d.ts +72 -72
- package/lib/engine/engine_serialization_builtin_serializer.js +403 -403
- package/lib/engine/engine_serialization_core.d.ts +94 -94
- package/lib/engine/engine_serialization_core.js +607 -607
- package/lib/engine/engine_serialization_decorator.d.ts +23 -23
- package/lib/engine/engine_serialization_decorator.js +66 -66
- package/lib/engine/engine_setup.d.ts +1 -1
- package/lib/engine/engine_setup.js +2 -2
- package/lib/engine/engine_shaders.d.ts +53 -53
- package/lib/engine/engine_shaders.js +252 -252
- package/lib/engine/engine_shims.d.ts +4 -4
- package/lib/engine/engine_shims.js +24 -24
- package/lib/engine/engine_test_utils.d.ts +39 -39
- package/lib/engine/engine_test_utils.js +83 -83
- package/lib/engine/engine_texture.d.ts +28 -28
- package/lib/engine/engine_texture.js +64 -64
- package/lib/engine/engine_three_utils.d.ts +204 -204
- package/lib/engine/engine_three_utils.js +788 -788
- package/lib/engine/engine_time.d.ts +51 -51
- package/lib/engine/engine_time.js +82 -82
- package/lib/engine/engine_time_utils.d.ts +88 -88
- package/lib/engine/engine_time_utils.js +215 -215
- package/lib/engine/engine_tonemapping.d.ts +6 -6
- package/lib/engine/engine_tonemapping.js +197 -197
- package/lib/engine/engine_types.d.ts +578 -578
- package/lib/engine/engine_types.js +95 -95
- package/lib/engine/engine_typestore.d.ts +28 -28
- package/lib/engine/engine_typestore.js +55 -55
- package/lib/engine/engine_util_decorator.d.ts +13 -13
- package/lib/engine/engine_util_decorator.js +116 -116
- package/lib/engine/engine_utils.d.ts +248 -248
- package/lib/engine/engine_utils.js +1012 -1012
- package/lib/engine/engine_utils_format.d.ts +24 -24
- package/lib/engine/engine_utils_format.js +239 -239
- package/lib/engine/engine_utils_screenshot.d.ts +159 -159
- package/lib/engine/engine_utils_screenshot.js +522 -522
- package/lib/engine/engine_utils_screenshot.xr.d.ts +5 -5
- package/lib/engine/engine_utils_screenshot.xr.js +90 -90
- package/lib/engine/engine_xr.d.ts +1 -1
- package/lib/engine/engine_xr.js +1 -1
- package/lib/engine/export/gltf/Writers.d.ts +19 -19
- package/lib/engine/export/gltf/Writers.js +24 -24
- package/lib/engine/export/gltf/index.d.ts +11 -11
- package/lib/engine/export/gltf/index.js +123 -123
- package/lib/engine/export/index.d.ts +2 -2
- package/lib/engine/export/index.js +2 -2
- package/lib/engine/export/state.d.ts +7 -7
- package/lib/engine/export/state.js +17 -17
- package/lib/engine/export/utils.d.ts +2 -2
- package/lib/engine/export/utils.js +7 -7
- package/lib/engine/extensions/EXT_texture_exr.d.ts +8 -8
- package/lib/engine/extensions/EXT_texture_exr.js +32 -32
- package/lib/engine/extensions/NEEDLE_animator_controller_model.d.ts +122 -122
- package/lib/engine/extensions/NEEDLE_animator_controller_model.js +95 -95
- package/lib/engine/extensions/NEEDLE_components.d.ts +35 -35
- package/lib/engine/extensions/NEEDLE_components.js +220 -220
- package/lib/engine/extensions/NEEDLE_gameobject_data.d.ts +10 -10
- package/lib/engine/extensions/NEEDLE_gameobject_data.js +57 -57
- package/lib/engine/extensions/NEEDLE_lighting_settings.d.ts +37 -37
- package/lib/engine/extensions/NEEDLE_lighting_settings.js +157 -157
- package/lib/engine/extensions/NEEDLE_lightmaps.d.ts +18 -18
- package/lib/engine/extensions/NEEDLE_lightmaps.js +99 -99
- package/lib/engine/extensions/NEEDLE_persistent_assets.d.ts +11 -11
- package/lib/engine/extensions/NEEDLE_persistent_assets.js +63 -63
- package/lib/engine/extensions/NEEDLE_progressive.d.ts +1 -1
- package/lib/engine/extensions/NEEDLE_progressive.js +1 -1
- package/lib/engine/extensions/NEEDLE_render_objects.d.ts +13 -13
- package/lib/engine/extensions/NEEDLE_render_objects.js +159 -159
- package/lib/engine/extensions/NEEDLE_techniques_webgl.d.ts +38 -38
- package/lib/engine/extensions/NEEDLE_techniques_webgl.js +564 -564
- package/lib/engine/extensions/extension_resolver.d.ts +4 -4
- package/lib/engine/extensions/extension_resolver.js +1 -1
- package/lib/engine/extensions/extension_utils.d.ts +12 -12
- package/lib/engine/extensions/extension_utils.js +152 -152
- package/lib/engine/extensions/extensions.d.ts +32 -32
- package/lib/engine/extensions/extensions.js +107 -107
- package/lib/engine/extensions/index.d.ts +6 -6
- package/lib/engine/extensions/index.js +6 -6
- package/lib/engine/extensions/usage_tracker.d.ts +13 -13
- package/lib/engine/extensions/usage_tracker.js +65 -65
- package/lib/engine/js-extensions/Camera.d.ts +1 -1
- package/lib/engine/js-extensions/Camera.js +39 -39
- package/lib/engine/js-extensions/ExtensionUtils.d.ts +9 -9
- package/lib/engine/js-extensions/ExtensionUtils.js +67 -67
- package/lib/engine/js-extensions/Layers.d.ts +6 -6
- package/lib/engine/js-extensions/Layers.js +22 -22
- package/lib/engine/js-extensions/Object3D.d.ts +120 -120
- package/lib/engine/js-extensions/Object3D.js +136 -136
- package/lib/engine/js-extensions/RGBAColor.d.ts +23 -23
- package/lib/engine/js-extensions/RGBAColor.js +111 -111
- package/lib/engine/js-extensions/Vector.d.ts +3 -3
- package/lib/engine/js-extensions/Vector.js +13 -13
- package/lib/engine/js-extensions/index.d.ts +5 -5
- package/lib/engine/js-extensions/index.js +5 -5
- package/lib/engine/physics/workers/mesh-bvh/GenerateMeshBVHWorker.d.ts +4 -4
- package/lib/engine/physics/workers/mesh-bvh/GenerateMeshBVHWorker.js +79 -79
- package/lib/engine/shaders/shaderData.d.ts +55 -55
- package/lib/engine/shaders/shaderData.js +58 -58
- package/lib/engine/tests/test_utils.d.ts +2 -2
- package/lib/engine/tests/test_utils.js +53 -53
- package/lib/engine/webcomponents/WebXRButtons.d.ts +56 -56
- package/lib/engine/webcomponents/WebXRButtons.js +230 -230
- package/lib/engine/webcomponents/api.d.ts +5 -5
- package/lib/engine/webcomponents/api.js +4 -4
- package/lib/engine/webcomponents/buttons.d.ts +51 -51
- package/lib/engine/webcomponents/buttons.js +264 -264
- package/lib/engine/webcomponents/fonts.d.ts +9 -9
- package/lib/engine/webcomponents/fonts.js +32 -32
- package/lib/engine/webcomponents/icons.d.ts +9 -9
- package/lib/engine/webcomponents/icons.js +52 -52
- package/lib/engine/webcomponents/index.d.ts +1 -1
- package/lib/engine/webcomponents/index.js +1 -1
- package/lib/engine/webcomponents/logo-element.d.ts +10 -10
- package/lib/engine/webcomponents/logo-element.js +67 -67
- package/lib/engine/webcomponents/needle menu/needle-menu-spatial.d.ts +37 -37
- package/lib/engine/webcomponents/needle menu/needle-menu-spatial.js +513 -513
- package/lib/engine/webcomponents/needle menu/needle-menu.d.ts +155 -155
- package/lib/engine/webcomponents/needle menu/needle-menu.js +1029 -1029
- package/lib/engine/webcomponents/needle-button.d.ts +34 -34
- package/lib/engine/webcomponents/needle-button.js +161 -161
- package/lib/engine/webcomponents/needle-engine.ar-overlay.d.ts +21 -21
- package/lib/engine/webcomponents/needle-engine.ar-overlay.js +166 -166
- package/lib/engine/webcomponents/needle-engine.attributes.d.ts +69 -69
- package/lib/engine/webcomponents/needle-engine.attributes.js +1 -1
- package/lib/engine/webcomponents/needle-engine.d.ts +116 -116
- package/lib/engine/webcomponents/needle-engine.extras.d.ts +6 -6
- package/lib/engine/webcomponents/needle-engine.extras.js +13 -13
- package/lib/engine/webcomponents/needle-engine.js +821 -821
- package/lib/engine/webcomponents/needle-engine.loading.d.ts +44 -44
- package/lib/engine/webcomponents/needle-engine.loading.js +341 -341
- package/lib/engine/xr/NeedleXRController.d.ts +313 -313
- package/lib/engine/xr/NeedleXRController.js +1007 -1007
- package/lib/engine/xr/NeedleXRSession.d.ts +340 -340
- package/lib/engine/xr/NeedleXRSession.js +1463 -1463
- package/lib/engine/xr/NeedleXRSync.d.ts +22 -22
- package/lib/engine/xr/NeedleXRSync.js +188 -188
- package/lib/engine/xr/SceneTransition.d.ts +18 -18
- package/lib/engine/xr/SceneTransition.js +69 -69
- package/lib/engine/xr/TempXRContext.d.ts +34 -34
- package/lib/engine/xr/TempXRContext.js +187 -187
- package/lib/engine/xr/XRRig.d.ts +7 -7
- package/lib/engine/xr/XRRig.js +1 -1
- package/lib/engine/xr/api.d.ts +6 -6
- package/lib/engine/xr/api.js +6 -6
- package/lib/engine/xr/events.d.ts +66 -66
- package/lib/engine/xr/events.js +93 -93
- package/lib/engine/xr/internal.d.ts +12 -12
- package/lib/engine/xr/internal.js +25 -25
- package/lib/engine/xr/usdz.d.ts +12 -12
- package/lib/engine/xr/usdz.js +29 -29
- package/lib/engine/xr/utils.d.ts +11 -11
- package/lib/engine/xr/utils.js +34 -34
- package/lib/engine-components/AlignmentConstraint.d.ts +10 -10
- package/lib/engine-components/AlignmentConstraint.js +39 -39
- package/lib/engine-components/Animation.d.ts +156 -156
- package/lib/engine-components/Animation.js +508 -508
- package/lib/engine-components/AnimationCurve.d.ts +40 -40
- package/lib/engine-components/AnimationCurve.js +159 -159
- package/lib/engine-components/AnimationUtils.d.ts +8 -8
- package/lib/engine-components/AnimationUtils.js +27 -27
- package/lib/engine-components/AnimationUtilsAutoplay.d.ts +1 -1
- package/lib/engine-components/AnimationUtilsAutoplay.js +39 -39
- package/lib/engine-components/Animator.d.ts +217 -217
- package/lib/engine-components/Animator.js +354 -354
- package/lib/engine-components/AnimatorController.d.ts +227 -227
- package/lib/engine-components/AnimatorController.js +1152 -1152
- package/lib/engine-components/AudioListener.d.ts +33 -33
- package/lib/engine-components/AudioListener.js +86 -86
- package/lib/engine-components/AudioSource.d.ts +217 -217
- package/lib/engine-components/AudioSource.js +635 -635
- package/lib/engine-components/AvatarLoader.d.ts +80 -80
- package/lib/engine-components/AvatarLoader.js +231 -231
- package/lib/engine-components/AxesHelper.d.ts +32 -32
- package/lib/engine-components/AxesHelper.js +67 -67
- package/lib/engine-components/BasicIKConstraint.d.ts +9 -9
- package/lib/engine-components/BasicIKConstraint.js +43 -43
- package/lib/engine-components/BoxCollider.d.ts +2 -2
- package/lib/engine-components/BoxCollider.js +2 -2
- package/lib/engine-components/BoxHelperComponent.d.ts +47 -47
- package/lib/engine-components/BoxHelperComponent.js +102 -102
- package/lib/engine-components/Camera.d.ts +231 -231
- package/lib/engine-components/Camera.js +700 -700
- package/lib/engine-components/CameraUtils.d.ts +1 -1
- package/lib/engine-components/CameraUtils.js +123 -123
- package/lib/engine-components/CharacterController.d.ts +55 -55
- package/lib/engine-components/CharacterController.js +236 -236
- package/lib/engine-components/Collider.d.ts +188 -188
- package/lib/engine-components/Collider.js +369 -369
- package/lib/engine-components/Component.d.ts +792 -792
- package/lib/engine-components/Component.js +920 -920
- package/lib/engine-components/ContactShadows.d.ts +94 -94
- package/lib/engine-components/ContactShadows.js +453 -453
- package/lib/engine-components/DeleteBox.d.ts +19 -19
- package/lib/engine-components/DeleteBox.js +58 -58
- package/lib/engine-components/DeviceFlag.d.ts +16 -16
- package/lib/engine-components/DeviceFlag.js +47 -47
- package/lib/engine-components/DragControls.d.ts +170 -170
- package/lib/engine-components/DragControls.js +1421 -1421
- package/lib/engine-components/DropListener.d.ts +215 -215
- package/lib/engine-components/DropListener.js +642 -642
- package/lib/engine-components/Duplicatable.d.ts +35 -35
- package/lib/engine-components/Duplicatable.js +202 -202
- package/lib/engine-components/EventList.d.ts +54 -54
- package/lib/engine-components/EventList.js +232 -232
- package/lib/engine-components/EventTrigger.d.ts +33 -33
- package/lib/engine-components/EventTrigger.js +75 -75
- package/lib/engine-components/EventType.d.ts +22 -22
- package/lib/engine-components/EventType.js +23 -23
- package/lib/engine-components/Fog.d.ts +22 -22
- package/lib/engine-components/Fog.js +61 -61
- package/lib/engine-components/Gizmos.d.ts +17 -17
- package/lib/engine-components/Gizmos.js +64 -64
- package/lib/engine-components/GridHelper.d.ts +20 -20
- package/lib/engine-components/GridHelper.js +54 -54
- package/lib/engine-components/GroundProjection.d.ts +67 -67
- package/lib/engine-components/GroundProjection.js +343 -343
- package/lib/engine-components/Interactable.d.ts +12 -12
- package/lib/engine-components/Interactable.js +12 -12
- package/lib/engine-components/Joints.d.ts +19 -19
- package/lib/engine-components/Joints.js +51 -51
- package/lib/engine-components/LODGroup.d.ts +35 -35
- package/lib/engine-components/LODGroup.js +152 -152
- package/lib/engine-components/Light.d.ts +180 -180
- package/lib/engine-components/Light.js +535 -535
- package/lib/engine-components/LookAtConstraint.d.ts +19 -19
- package/lib/engine-components/LookAtConstraint.js +35 -35
- package/lib/engine-components/NeedleMenu.d.ts +50 -50
- package/lib/engine-components/NeedleMenu.js +92 -92
- package/lib/engine-components/NestedGltf.d.ts +25 -25
- package/lib/engine-components/NestedGltf.js +88 -88
- package/lib/engine-components/Networking.d.ts +54 -54
- package/lib/engine-components/Networking.js +112 -112
- package/lib/engine-components/OffsetConstraint.d.ts +14 -14
- package/lib/engine-components/OffsetConstraint.js +65 -65
- package/lib/engine-components/OrbitControls.d.ts +268 -268
- package/lib/engine-components/OrbitControls.js +1015 -1015
- package/lib/engine-components/PlayerColor.d.ts +19 -19
- package/lib/engine-components/PlayerColor.js +94 -94
- package/lib/engine-components/ReflectionProbe.d.ts +28 -28
- package/lib/engine-components/ReflectionProbe.js +204 -204
- package/lib/engine-components/Renderer.d.ts +153 -153
- package/lib/engine-components/Renderer.js +834 -834
- package/lib/engine-components/RendererInstancing.d.ts +140 -140
- package/lib/engine-components/RendererInstancing.js +744 -744
- package/lib/engine-components/RendererInstancing.js.map +1 -1
- package/lib/engine-components/RendererLightmap.d.ts +24 -24
- package/lib/engine-components/RendererLightmap.js +182 -182
- package/lib/engine-components/RigidBody.d.ts +155 -155
- package/lib/engine-components/RigidBody.js +517 -517
- package/lib/engine-components/SceneSwitcher.d.ts +263 -263
- package/lib/engine-components/SceneSwitcher.js +971 -971
- package/lib/engine-components/ScreenCapture.d.ts +144 -144
- package/lib/engine-components/ScreenCapture.js +547 -547
- package/lib/engine-components/ShadowCatcher.d.ts +33 -33
- package/lib/engine-components/ShadowCatcher.js +166 -166
- package/lib/engine-components/Skybox.d.ts +88 -88
- package/lib/engine-components/Skybox.js +469 -469
- package/lib/engine-components/SmoothFollow.d.ts +34 -34
- package/lib/engine-components/SmoothFollow.js +82 -82
- package/lib/engine-components/SpatialTrigger.d.ts +102 -102
- package/lib/engine-components/SpatialTrigger.js +225 -225
- package/lib/engine-components/SpectatorCamera.d.ts +111 -111
- package/lib/engine-components/SpectatorCamera.js +715 -715
- package/lib/engine-components/SphereCollider.d.ts +2 -2
- package/lib/engine-components/SphereCollider.js +2 -2
- package/lib/engine-components/SpriteRenderer.d.ts +132 -132
- package/lib/engine-components/SpriteRenderer.js +472 -472
- package/lib/engine-components/SyncedCamera.d.ts +41 -41
- package/lib/engine-components/SyncedCamera.js +199 -199
- package/lib/engine-components/SyncedRoom.d.ts +106 -106
- package/lib/engine-components/SyncedRoom.js +371 -371
- package/lib/engine-components/SyncedTransform.d.ts +94 -94
- package/lib/engine-components/SyncedTransform.js +331 -331
- package/lib/engine-components/TestRunner.d.ts +16 -16
- package/lib/engine-components/TestRunner.js +102 -102
- package/lib/engine-components/TransformGizmo.d.ts +75 -75
- package/lib/engine-components/TransformGizmo.js +209 -209
- package/lib/engine-components/VideoPlayer.d.ts +184 -184
- package/lib/engine-components/VideoPlayer.js +978 -978
- package/lib/engine-components/Voip.d.ts +67 -67
- package/lib/engine-components/Voip.js +360 -360
- package/lib/engine-components/api.d.ts +51 -51
- package/lib/engine-components/api.js +50 -50
- package/lib/engine-components/avatar/AvatarBlink_Simple.d.ts +11 -11
- package/lib/engine-components/avatar/AvatarBlink_Simple.js +76 -76
- package/lib/engine-components/avatar/AvatarEyeLook_Rotation.d.ts +14 -14
- package/lib/engine-components/avatar/AvatarEyeLook_Rotation.js +68 -68
- package/lib/engine-components/avatar/Avatar_Brain_LookAt.d.ts +29 -29
- package/lib/engine-components/avatar/Avatar_Brain_LookAt.js +121 -121
- package/lib/engine-components/avatar/Avatar_MouthShapes.d.ts +15 -15
- package/lib/engine-components/avatar/Avatar_MouthShapes.js +79 -79
- package/lib/engine-components/avatar/Avatar_MustacheShake.d.ts +9 -9
- package/lib/engine-components/avatar/Avatar_MustacheShake.js +29 -29
- package/lib/engine-components/codegen/components.d.ts +216 -216
- package/lib/engine-components/codegen/components.js +218 -218
- package/lib/engine-components/debug/LogStats.d.ts +5 -5
- package/lib/engine-components/debug/LogStats.js +18 -18
- package/lib/engine-components/export/gltf/GltfExport.d.ts +30 -30
- package/lib/engine-components/export/gltf/GltfExport.js +246 -246
- package/lib/engine-components/export/gltf/index.d.ts +1 -1
- package/lib/engine-components/export/gltf/index.js +1 -1
- package/lib/engine-components/export/index.d.ts +1 -1
- package/lib/engine-components/export/index.js +1 -1
- package/lib/engine-components/export/usdz/Extension.d.ts +22 -22
- package/lib/engine-components/export/usdz/Extension.js +1 -1
- package/lib/engine-components/export/usdz/ThreeUSDZExporter.d.ts +162 -162
- package/lib/engine-components/export/usdz/ThreeUSDZExporter.js +1789 -1789
- package/lib/engine-components/export/usdz/USDZExporter.d.ts +130 -130
- package/lib/engine-components/export/usdz/USDZExporter.js +663 -663
- package/lib/engine-components/export/usdz/extensions/Animation.d.ts +106 -106
- package/lib/engine-components/export/usdz/extensions/Animation.js +1071 -1071
- package/lib/engine-components/export/usdz/extensions/DocumentExtension.d.ts +5 -5
- package/lib/engine-components/export/usdz/extensions/DocumentExtension.js +6 -6
- package/lib/engine-components/export/usdz/extensions/NodeMaterialConverter.d.ts +10 -10
- package/lib/engine-components/export/usdz/extensions/NodeMaterialConverter.js +451 -451
- package/lib/engine-components/export/usdz/extensions/USDZText.d.ts +54 -54
- package/lib/engine-components/export/usdz/extensions/USDZText.js +203 -203
- package/lib/engine-components/export/usdz/extensions/USDZUI.d.ts +8 -8
- package/lib/engine-components/export/usdz/extensions/USDZUI.js +158 -158
- package/lib/engine-components/export/usdz/extensions/behavior/Actions.d.ts +30 -30
- package/lib/engine-components/export/usdz/extensions/behavior/Actions.js +88 -88
- package/lib/engine-components/export/usdz/extensions/behavior/AudioExtension.d.ts +10 -10
- package/lib/engine-components/export/usdz/extensions/behavior/AudioExtension.js +86 -86
- package/lib/engine-components/export/usdz/extensions/behavior/Behaviour.d.ts +28 -28
- package/lib/engine-components/export/usdz/extensions/behavior/Behaviour.js +290 -290
- package/lib/engine-components/export/usdz/extensions/behavior/BehaviourComponents.d.ts +190 -190
- package/lib/engine-components/export/usdz/extensions/behavior/BehaviourComponents.js +1060 -1060
- package/lib/engine-components/export/usdz/extensions/behavior/BehavioursBuilder.d.ts +135 -135
- package/lib/engine-components/export/usdz/extensions/behavior/BehavioursBuilder.js +548 -548
- package/lib/engine-components/export/usdz/extensions/behavior/PhysicsExtension.d.ts +7 -7
- package/lib/engine-components/export/usdz/extensions/behavior/PhysicsExtension.js +115 -115
- package/lib/engine-components/export/usdz/index.d.ts +3 -3
- package/lib/engine-components/export/usdz/index.js +2 -2
- package/lib/engine-components/export/usdz/utils/animationutils.d.ts +7 -7
- package/lib/engine-components/export/usdz/utils/animationutils.js +163 -163
- package/lib/engine-components/export/usdz/utils/quicklook.d.ts +2 -2
- package/lib/engine-components/export/usdz/utils/quicklook.js +43 -43
- package/lib/engine-components/particlesystem/ParticleSystem.d.ts +177 -177
- package/lib/engine-components/particlesystem/ParticleSystem.js +1176 -1176
- package/lib/engine-components/particlesystem/ParticleSystemModules.d.ts +526 -526
- package/lib/engine-components/particlesystem/ParticleSystemModules.js +1930 -1930
- package/lib/engine-components/particlesystem/ParticleSystemSubEmitter.d.ts +25 -25
- package/lib/engine-components/particlesystem/ParticleSystemSubEmitter.js +87 -87
- package/lib/engine-components/particlesystem/api.d.ts +2 -2
- package/lib/engine-components/particlesystem/api.js +2 -2
- package/lib/engine-components/postprocessing/Effects/Antialiasing.d.ts +17 -17
- package/lib/engine-components/postprocessing/Effects/Antialiasing.js +59 -59
- package/lib/engine-components/postprocessing/Effects/BloomEffect.d.ts +46 -46
- package/lib/engine-components/postprocessing/Effects/BloomEffect.js +113 -113
- package/lib/engine-components/postprocessing/Effects/ChromaticAberration.d.ts +11 -11
- package/lib/engine-components/postprocessing/Effects/ChromaticAberration.js +39 -39
- package/lib/engine-components/postprocessing/Effects/ColorAdjustments.d.ts +23 -23
- package/lib/engine-components/postprocessing/Effects/ColorAdjustments.js +111 -111
- package/lib/engine-components/postprocessing/Effects/DepthOfField.d.ts +25 -25
- package/lib/engine-components/postprocessing/Effects/DepthOfField.js +104 -104
- package/lib/engine-components/postprocessing/Effects/EffectWrapper.d.ts +12 -12
- package/lib/engine-components/postprocessing/Effects/EffectWrapper.js +18 -18
- package/lib/engine-components/postprocessing/Effects/Pixelation.d.ts +11 -11
- package/lib/engine-components/postprocessing/Effects/Pixelation.js +32 -32
- package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusion.d.ts +18 -18
- package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusion.js +91 -91
- package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.d.ts +70 -70
- package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.js +176 -176
- package/lib/engine-components/postprocessing/Effects/Sharpening.d.ts +18 -18
- package/lib/engine-components/postprocessing/Effects/Sharpening.js +127 -127
- package/lib/engine-components/postprocessing/Effects/TiltShiftEffect.d.ts +17 -17
- package/lib/engine-components/postprocessing/Effects/TiltShiftEffect.js +70 -70
- package/lib/engine-components/postprocessing/Effects/Tonemapping.d.ts +19 -19
- package/lib/engine-components/postprocessing/Effects/Tonemapping.js +94 -94
- package/lib/engine-components/postprocessing/Effects/Tonemapping.utils.d.ts +13 -13
- package/lib/engine-components/postprocessing/Effects/Tonemapping.utils.js +51 -51
- package/lib/engine-components/postprocessing/Effects/Vignette.d.ts +15 -15
- package/lib/engine-components/postprocessing/Effects/Vignette.js +60 -60
- package/lib/engine-components/postprocessing/PostProcessingEffect.d.ts +90 -90
- package/lib/engine-components/postprocessing/PostProcessingEffect.js +168 -168
- package/lib/engine-components/postprocessing/PostProcessingHandler.d.ts +42 -42
- package/lib/engine-components/postprocessing/PostProcessingHandler.js +494 -494
- package/lib/engine-components/postprocessing/Volume.d.ts +90 -90
- package/lib/engine-components/postprocessing/Volume.js +385 -385
- package/lib/engine-components/postprocessing/VolumeParameter.d.ts +26 -26
- package/lib/engine-components/postprocessing/VolumeParameter.js +136 -136
- package/lib/engine-components/postprocessing/VolumeProfile.d.ts +15 -15
- package/lib/engine-components/postprocessing/VolumeProfile.js +60 -60
- package/lib/engine-components/postprocessing/index.d.ts +6 -6
- package/lib/engine-components/postprocessing/index.js +6 -6
- package/lib/engine-components/postprocessing/utils.d.ts +55 -55
- package/lib/engine-components/postprocessing/utils.js +119 -119
- package/lib/engine-components/timeline/PlayableDirector.d.ts +163 -163
- package/lib/engine-components/timeline/PlayableDirector.js +686 -686
- package/lib/engine-components/timeline/SignalAsset.d.ts +24 -24
- package/lib/engine-components/timeline/SignalAsset.js +130 -130
- package/lib/engine-components/timeline/TimelineModels.d.ts +89 -89
- package/lib/engine-components/timeline/TimelineModels.js +22 -22
- package/lib/engine-components/timeline/TimelineTracks.d.ts +110 -110
- package/lib/engine-components/timeline/TimelineTracks.js +879 -879
- package/lib/engine-components/timeline/index.d.ts +4 -4
- package/lib/engine-components/timeline/index.js +3 -3
- package/lib/engine-components/ui/BaseUIComponent.d.ts +48 -48
- package/lib/engine-components/ui/BaseUIComponent.js +170 -170
- package/lib/engine-components/ui/Button.d.ts +64 -64
- package/lib/engine-components/ui/Button.js +315 -315
- package/lib/engine-components/ui/Canvas.d.ts +74 -74
- package/lib/engine-components/ui/Canvas.js +407 -407
- package/lib/engine-components/ui/CanvasGroup.d.ts +19 -19
- package/lib/engine-components/ui/CanvasGroup.js +58 -58
- package/lib/engine-components/ui/EventSystem.d.ts +125 -125
- package/lib/engine-components/ui/EventSystem.js +765 -765
- package/lib/engine-components/ui/Graphic.d.ts +55 -55
- package/lib/engine-components/ui/Graphic.js +255 -255
- package/lib/engine-components/ui/Image.d.ts +35 -35
- package/lib/engine-components/ui/Image.js +116 -116
- package/lib/engine-components/ui/InputField.d.ts +42 -42
- package/lib/engine-components/ui/InputField.js +268 -268
- package/lib/engine-components/ui/Interfaces.d.ts +38 -38
- package/lib/engine-components/ui/Interfaces.js +12 -12
- package/lib/engine-components/ui/Layout.d.ts +84 -84
- package/lib/engine-components/ui/Layout.js +330 -330
- package/lib/engine-components/ui/Outline.d.ts +7 -7
- package/lib/engine-components/ui/Outline.js +20 -20
- package/lib/engine-components/ui/PointerEvents.d.ts +115 -115
- package/lib/engine-components/ui/PointerEvents.js +145 -145
- package/lib/engine-components/ui/RaycastUtils.d.ts +11 -11
- package/lib/engine-components/ui/RaycastUtils.js +67 -67
- package/lib/engine-components/ui/Raycaster.d.ts +30 -30
- package/lib/engine-components/ui/Raycaster.js +95 -95
- package/lib/engine-components/ui/RectTransform.d.ts +61 -61
- package/lib/engine-components/ui/RectTransform.js +356 -356
- package/lib/engine-components/ui/SpatialHtml.d.ts +8 -8
- package/lib/engine-components/ui/SpatialHtml.js +79 -79
- package/lib/engine-components/ui/Symbols.d.ts +1 -1
- package/lib/engine-components/ui/Symbols.js +1 -1
- package/lib/engine-components/ui/Text.d.ts +78 -78
- package/lib/engine-components/ui/Text.js +539 -539
- package/lib/engine-components/ui/Utils.d.ts +24 -24
- package/lib/engine-components/ui/Utils.js +90 -90
- package/lib/engine-components/ui/index.d.ts +1 -1
- package/lib/engine-components/ui/index.js +1 -1
- package/lib/engine-components/utils/EnvironmentScene.d.ts +5 -5
- package/lib/engine-components/utils/EnvironmentScene.js +205 -205
- package/lib/engine-components/utils/LookAt.d.ts +31 -31
- package/lib/engine-components/utils/LookAt.js +82 -82
- package/lib/engine-components/utils/OpenURL.d.ts +42 -42
- package/lib/engine-components/utils/OpenURL.js +119 -119
- package/lib/engine-components/webxr/Avatar.d.ts +25 -25
- package/lib/engine-components/webxr/Avatar.js +255 -255
- package/lib/engine-components/webxr/TeleportTarget.d.ts +7 -7
- package/lib/engine-components/webxr/TeleportTarget.js +7 -7
- package/lib/engine-components/webxr/WebARCameraBackground.d.ts +30 -30
- package/lib/engine-components/webxr/WebARCameraBackground.js +155 -155
- package/lib/engine-components/webxr/WebARSessionRoot.d.ts +98 -98
- package/lib/engine-components/webxr/WebARSessionRoot.js +770 -770
- package/lib/engine-components/webxr/WebXR.d.ts +232 -232
- package/lib/engine-components/webxr/WebXR.js +561 -561
- package/lib/engine-components/webxr/WebXRAvatar.d.ts +27 -27
- package/lib/engine-components/webxr/WebXRAvatar.js +44 -44
- package/lib/engine-components/webxr/WebXRImageTracking.d.ts +86 -86
- package/lib/engine-components/webxr/WebXRImageTracking.js +471 -471
- package/lib/engine-components/webxr/WebXRPlaneTracking.d.ts +92 -92
- package/lib/engine-components/webxr/WebXRPlaneTracking.js +500 -500
- package/lib/engine-components/webxr/WebXRRig.d.ts +32 -32
- package/lib/engine-components/webxr/WebXRRig.js +72 -72
- package/lib/engine-components/webxr/XRFlag.d.ts +38 -38
- package/lib/engine-components/webxr/XRFlag.js +139 -139
- package/lib/engine-components/webxr/controllers/XRControllerFollow.d.ts +47 -47
- package/lib/engine-components/webxr/controllers/XRControllerFollow.js +120 -120
- package/lib/engine-components/webxr/controllers/XRControllerModel.d.ts +43 -43
- package/lib/engine-components/webxr/controllers/XRControllerModel.js +352 -352
- package/lib/engine-components/webxr/controllers/XRControllerMovement.d.ts +78 -78
- package/lib/engine-components/webxr/controllers/XRControllerMovement.js +506 -506
- package/lib/engine-components/webxr/index.d.ts +3 -3
- package/lib/engine-components/webxr/index.js +3 -3
- package/lib/engine-components/webxr/types.d.ts +3 -3
- package/lib/engine-components/webxr/types.js +1 -1
- package/lib/engine-components-experimental/Presentation.d.ts +6 -6
- package/lib/engine-components-experimental/Presentation.js +9 -9
- package/lib/engine-components-experimental/api.d.ts +4 -4
- package/lib/engine-components-experimental/api.js +4 -4
- package/lib/engine-components-experimental/networking/PlayerSync.d.ts +156 -156
- package/lib/engine-components-experimental/networking/PlayerSync.js +377 -377
- package/lib/engine-schemes/api.d.ts +12 -12
- package/lib/engine-schemes/api.js +12 -12
- package/lib/engine-schemes/schemes.d.ts +7 -7
- package/lib/engine-schemes/schemes.js +19 -19
- package/lib/engine-schemes/synced-camera-model.d.ts +25 -25
- package/lib/engine-schemes/synced-camera-model.js +67 -67
- package/lib/engine-schemes/synced-transform-model.d.ts +31 -31
- package/lib/engine-schemes/synced-transform-model.js +66 -66
- package/lib/engine-schemes/transform.d.ts +12 -12
- package/lib/engine-schemes/transform.js +39 -39
- package/lib/engine-schemes/vec2.d.ts +10 -10
- package/lib/engine-schemes/vec2.js +25 -25
- package/lib/engine-schemes/vec3.d.ts +11 -11
- package/lib/engine-schemes/vec3.js +29 -29
- package/lib/engine-schemes/vec4.d.ts +12 -12
- package/lib/engine-schemes/vec4.js +33 -33
- package/lib/engine-schemes/vr-user-state-buffer.d.ts +37 -37
- package/lib/engine-schemes/vr-user-state-buffer.js +110 -110
- package/lib/include/three/EXT_mesh_gpu_instancing_exporter.d.ts +6 -6
- package/lib/include/three/EXT_mesh_gpu_instancing_exporter.js +45 -45
- package/lib/needle-engine.d.ts +7 -7
- package/lib/needle-engine.js +64 -64
- package/package.json +2 -2
- package/plugins/common/buildinfo.js +64 -64
- package/plugins/common/cloud.js +1 -1
- package/plugins/common/config.cjs +31 -31
- package/plugins/common/config.js +35 -35
- package/plugins/common/files.js +31 -31
- package/plugins/common/generator.js +10 -10
- package/plugins/common/license.js +452 -452
- package/plugins/common/logger.js +327 -327
- package/plugins/common/npm.js +15 -15
- package/plugins/common/timers.js +7 -7
- package/plugins/common/version.js +37 -37
- package/plugins/gltf-packer.mjs +1 -1
- package/plugins/next/alias.cjs +39 -39
- package/plugins/next/license.cjs +24 -24
- package/plugins/next/meshbvhworker.cjs +18 -18
- package/plugins/next/next.js +141 -141
- package/plugins/types/index.d.ts +2 -2
- package/plugins/types/license.d.ts +24 -24
- package/plugins/types/needleConfig.d.ts +27 -27
- package/plugins/types/next.d.ts +2 -2
- package/plugins/types/userconfig.d.ts +124 -124
- package/plugins/types/vite.d.ts +13 -13
- package/plugins/types/webmanifest.d.ts +32 -32
- package/plugins/vite/alias.js +189 -189
- package/plugins/vite/asap.js +251 -251
- package/plugins/vite/build-pipeline.js +371 -371
- package/plugins/vite/build.js +19 -19
- package/plugins/vite/buildinfo.js +41 -41
- package/plugins/vite/config.js +106 -106
- package/plugins/vite/copyfiles.js +138 -138
- package/plugins/vite/defines.js +70 -70
- package/plugins/vite/dependencies.js +232 -232
- package/plugins/vite/dependency-watcher.js +237 -237
- package/plugins/vite/drop-client.js +76 -76
- package/plugins/vite/drop.js +87 -87
- package/plugins/vite/editor-connection.js +124 -124
- package/plugins/vite/facebook-instant-games.js +102 -102
- package/plugins/vite/gzip.js +5 -5
- package/plugins/vite/imports-logger.js +143 -143
- package/plugins/vite/index.js +147 -147
- package/plugins/vite/license.js +56 -56
- package/plugins/vite/local-files.js +440 -440
- package/plugins/vite/logger.client.js +272 -272
- package/plugins/vite/logger.js +100 -100
- package/plugins/vite/materialx.js +31 -31
- package/plugins/vite/meta.js +163 -163
- package/plugins/vite/npm.js +7 -7
- package/plugins/vite/peer.js +29 -29
- package/plugins/vite/poster-client.js +73 -73
- package/plugins/vite/poster.js +79 -79
- package/plugins/vite/pwa.js +604 -604
- package/plugins/vite/reload-client.js +15 -15
- package/plugins/vite/reload.js +351 -351
- package/plugins/vite/server.js +66 -66
- package/plugins/vite/transform-codegen.js +55 -55
- package/plugins/vite/transform.js +32 -32
- package/plugins/vite/vite-4.4-hack.js +31 -31
- package/src/asap/needle-asap.ts +111 -111
- package/src/asap/sessiongranted.ts +75 -75
- package/src/asap/utils.ts +4 -4
- package/src/engine/analytics/index.ts +10 -10
- package/src/engine/analytics/lcp.ts +35 -35
- package/src/engine/api.ts +82 -82
- package/src/engine/assets/index.ts +59 -59
- package/src/engine/assets/static.js +5 -5
- package/src/engine/codegen/register_types.ts +300 -300
- package/src/engine/debug/debug.ts +51 -51
- package/src/engine/debug/debug_console.ts +333 -333
- package/src/engine/debug/debug_overlay.ts +332 -332
- package/src/engine/debug/debug_spatial_console.ts +429 -429
- package/src/engine/debug/index.ts +1 -1
- package/src/engine/engine_addressables.ts +671 -671
- package/src/engine/engine_animation.ts +145 -145
- package/src/engine/engine_application.ts +113 -113
- package/src/engine/engine_assetdatabase.ts +389 -389
- package/src/engine/engine_audio.ts +24 -24
- package/src/engine/engine_camera.ts +39 -39
- package/src/engine/engine_components.ts +366 -366
- package/src/engine/engine_components_internal.ts +40 -40
- package/src/engine/engine_constants.ts +52 -52
- package/src/engine/engine_context.ts +1824 -1824
- package/src/engine/engine_context_registry.ts +129 -129
- package/src/engine/engine_coroutine.ts +54 -54
- package/src/engine/engine_create_objects.ts +411 -411
- package/src/engine/engine_default_parameters.ts +3 -3
- package/src/engine/engine_editor-sync.ts +28 -28
- package/src/engine/engine_fileloader.js +9 -9
- package/src/engine/engine_gameobject.ts +712 -712
- package/src/engine/engine_generic_utils.js +13 -13
- package/src/engine/engine_gizmos.ts +577 -577
- package/src/engine/engine_gltf.ts +29 -29
- package/src/engine/engine_gltf_builtin_components.ts +403 -403
- package/src/engine/engine_hot_reload.ts +210 -210
- package/src/engine/engine_input.ts +1500 -1500
- package/src/engine/engine_input_utils.ts +23 -23
- package/src/engine/engine_instancing.ts +45 -45
- package/src/engine/engine_license.ts +386 -386
- package/src/engine/engine_lifecycle_api.ts +113 -113
- package/src/engine/engine_lifecycle_functions_internal.ts +193 -193
- package/src/engine/engine_lightdata.ts +125 -125
- package/src/engine/engine_loaders.callbacks.ts +136 -136
- package/src/engine/engine_loaders.gltf.ts +82 -82
- package/src/engine/engine_loaders.ts +378 -378
- package/src/engine/engine_lods.ts +186 -186
- package/src/engine/engine_mainloop_utils.ts +472 -472
- package/src/engine/engine_math.ts +282 -282
- package/src/engine/engine_modules.ts +83 -83
- package/src/engine/engine_networking.ts +862 -862
- package/src/engine/engine_networking_auto.ts +352 -352
- package/src/engine/engine_networking_blob.ts +275 -275
- package/src/engine/engine_networking_files.ts +217 -217
- package/src/engine/engine_networking_files_default_components.ts +58 -58
- package/src/engine/engine_networking_instantiate.ts +419 -419
- package/src/engine/engine_networking_peer.ts +159 -159
- package/src/engine/engine_networking_streams.ts +713 -713
- package/src/engine/engine_networking_types.ts +24 -24
- package/src/engine/engine_networking_utils.ts +23 -23
- package/src/engine/engine_networking_websocket.ts +2 -2
- package/src/engine/engine_patcher.ts +199 -199
- package/src/engine/engine_physics.ts +783 -783
- package/src/engine/engine_physics.types.ts +46 -46
- package/src/engine/engine_physics_rapier.ts +1577 -1577
- package/src/engine/engine_playerview.ts +80 -80
- package/src/engine/engine_scenelighting.ts +294 -294
- package/src/engine/engine_serialization.ts +2 -2
- package/src/engine/engine_serialization_builtin_serializer.ts +473 -473
- package/src/engine/engine_serialization_core.ts +720 -720
- package/src/engine/engine_serialization_decorator.ts +80 -80
- package/src/engine/engine_setup.ts +1 -1
- package/src/engine/engine_shaders.ts +267 -267
- package/src/engine/engine_shims.ts +32 -32
- package/src/engine/engine_test_utils.ts +109 -109
- package/src/engine/engine_texture.ts +82 -82
- package/src/engine/engine_three_utils.ts +928 -928
- package/src/engine/engine_time.ts +94 -94
- package/src/engine/engine_time_utils.ts +237 -237
- package/src/engine/engine_tonemapping.ts +208 -208
- package/src/engine/engine_types.ts +730 -730
- package/src/engine/engine_typestore.ts +63 -63
- package/src/engine/engine_util_decorator.ts +136 -136
- package/src/engine/engine_utils.ts +1115 -1115
- package/src/engine/engine_utils_format.ts +273 -273
- package/src/engine/engine_utils_screenshot.ts +708 -708
- package/src/engine/engine_utils_screenshot.xr.ts +103 -103
- package/src/engine/export/gltf/Writers.ts +34 -34
- package/src/engine/export/gltf/index.ts +158 -158
- package/src/engine/export/index.ts +2 -2
- package/src/engine/export/state.ts +19 -19
- package/src/engine/export/utils.ts +9 -9
- package/src/engine/extensions/EXT_texture_exr.ts +50 -50
- package/src/engine/extensions/NEEDLE_animator_controller_model.ts +195 -195
- package/src/engine/extensions/NEEDLE_components.ts +268 -268
- package/src/engine/extensions/NEEDLE_gameobject_data.ts +81 -81
- package/src/engine/extensions/NEEDLE_lighting_settings.ts +185 -185
- package/src/engine/extensions/NEEDLE_lightmaps.ts +119 -119
- package/src/engine/extensions/NEEDLE_persistent_assets.ts +76 -76
- package/src/engine/extensions/NEEDLE_render_objects.ts +209 -209
- package/src/engine/extensions/NEEDLE_techniques_webgl.ts +640 -640
- package/src/engine/extensions/extension_resolver.ts +4 -4
- package/src/engine/extensions/extension_utils.ts +166 -166
- package/src/engine/extensions/extensions.ts +140 -140
- package/src/engine/extensions/index.ts +5 -5
- package/src/engine/extensions/usage_tracker.ts +100 -100
- package/src/engine/js-extensions/Camera.ts +37 -37
- package/src/engine/js-extensions/ExtensionUtils.ts +85 -85
- package/src/engine/js-extensions/Layers.ts +23 -23
- package/src/engine/js-extensions/Object3D.ts +296 -296
- package/src/engine/js-extensions/RGBAColor.ts +126 -126
- package/src/engine/js-extensions/Vector.ts +18 -18
- package/src/engine/js-extensions/index.ts +4 -4
- package/src/engine/physics/workers/mesh-bvh/GenerateMeshBVHWorker.js +125 -125
- package/src/engine/shaders/shaderData.ts +67 -67
- package/src/engine/tests/test_utils.ts +63 -63
- package/src/engine/webcomponents/WebXRButtons.ts +260 -260
- package/src/engine/webcomponents/api.ts +6 -6
- package/src/engine/webcomponents/buttons.ts +292 -292
- package/src/engine/webcomponents/fonts.ts +41 -41
- package/src/engine/webcomponents/icons.ts +57 -57
- package/src/engine/webcomponents/index.ts +1 -1
- package/src/engine/webcomponents/logo-element.ts +78 -78
- package/src/engine/webcomponents/needle menu/needle-menu-spatial.ts +573 -573
- package/src/engine/webcomponents/needle menu/needle-menu.ts +1118 -1118
- package/src/engine/webcomponents/needle-button.ts +181 -181
- package/src/engine/webcomponents/needle-engine.ar-overlay.ts +186 -186
- package/src/engine/webcomponents/needle-engine.attributes.ts +82 -82
- package/src/engine/webcomponents/needle-engine.extras.ts +16 -16
- package/src/engine/webcomponents/needle-engine.loading.ts +373 -373
- package/src/engine/webcomponents/needle-engine.ts +860 -860
- package/src/engine/xr/NeedleXRController.ts +1125 -1125
- package/src/engine/xr/NeedleXRSession.ts +1624 -1624
- package/src/engine/xr/NeedleXRSync.ts +220 -220
- package/src/engine/xr/SceneTransition.ts +78 -78
- package/src/engine/xr/TempXRContext.ts +216 -216
- package/src/engine/xr/XRRig.ts +9 -9
- package/src/engine/xr/api.ts +5 -5
- package/src/engine/xr/events.ts +102 -102
- package/src/engine/xr/internal.ts +34 -34
- package/src/engine/xr/usdz.ts +30 -30
- package/src/engine/xr/utils.ts +39 -39
- package/src/engine-components/AlignmentConstraint.ts +36 -36
- package/src/engine-components/Animation.ts +557 -557
- package/src/engine-components/AnimationCurve.ts +150 -150
- package/src/engine-components/AnimationUtils.ts +28 -28
- package/src/engine-components/AnimationUtilsAutoplay.ts +43 -43
- package/src/engine-components/Animator.ts +397 -397
- package/src/engine-components/AnimatorController.ts +1293 -1293
- package/src/engine-components/AudioListener.ts +92 -92
- package/src/engine-components/AudioSource.ts +644 -644
- package/src/engine-components/AvatarLoader.ts +263 -263
- package/src/engine-components/AxesHelper.ts +59 -59
- package/src/engine-components/BasicIKConstraint.ts +54 -54
- package/src/engine-components/BoxCollider.ts +1 -1
- package/src/engine-components/BoxHelperComponent.ts +114 -114
- package/src/engine-components/Camera.ts +719 -719
- package/src/engine-components/CameraUtils.ts +138 -138
- package/src/engine-components/CharacterController.ts +253 -253
- package/src/engine-components/Collider.ts +374 -374
- package/src/engine-components/Component.ts +1297 -1297
- package/src/engine-components/ContactShadows.ts +506 -506
- package/src/engine-components/DeleteBox.ts +62 -62
- package/src/engine-components/DeviceFlag.ts +46 -46
- package/src/engine-components/DragControls.ts +1623 -1623
- package/src/engine-components/DropListener.ts +713 -713
- package/src/engine-components/Duplicatable.ts +198 -198
- package/src/engine-components/EventList.ts +266 -266
- package/src/engine-components/EventTrigger.ts +74 -74
- package/src/engine-components/EventType.ts +22 -22
- package/src/engine-components/Fog.ts +60 -60
- package/src/engine-components/Gizmos.ts +56 -56
- package/src/engine-components/GridHelper.ts +48 -48
- package/src/engine-components/GroundProjection.ts +356 -356
- package/src/engine-components/Interactable.ts +14 -14
- package/src/engine-components/Joints.ts +52 -52
- package/src/engine-components/LODGroup.ts +153 -153
- package/src/engine-components/Light.ts +558 -558
- package/src/engine-components/LookAtConstraint.ts +25 -25
- package/src/engine-components/NeedleMenu.ts +84 -84
- package/src/engine-components/NestedGltf.ts +86 -86
- package/src/engine-components/Networking.ts +114 -114
- package/src/engine-components/OffsetConstraint.ts +60 -60
- package/src/engine-components/OrbitControls.ts +1074 -1074
- package/src/engine-components/PlayerColor.ts +103 -103
- package/src/engine-components/ReflectionProbe.ts +220 -220
- package/src/engine-components/Renderer.ts +903 -903
- package/src/engine-components/RendererInstancing.ts +855 -855
- package/src/engine-components/RendererLightmap.ts +198 -198
- package/src/engine-components/RigidBody.ts +526 -526
- package/src/engine-components/SceneSwitcher.ts +1030 -1030
- package/src/engine-components/ScreenCapture.ts +592 -592
- package/src/engine-components/ShadowCatcher.ts +172 -172
- package/src/engine-components/Skybox.ts +475 -475
- package/src/engine-components/SmoothFollow.ts +76 -76
- package/src/engine-components/SpatialTrigger.ts +229 -229
- package/src/engine-components/SpectatorCamera.ts +787 -787
- package/src/engine-components/SphereCollider.ts +1 -1
- package/src/engine-components/SpriteRenderer.ts +468 -468
- package/src/engine-components/SyncedCamera.ts +220 -220
- package/src/engine-components/SyncedRoom.ts +380 -380
- package/src/engine-components/SyncedTransform.ts +383 -383
- package/src/engine-components/TestRunner.ts +118 -118
- package/src/engine-components/TransformGizmo.ts +219 -219
- package/src/engine-components/VideoPlayer.ts +1025 -1025
- package/src/engine-components/Voip.ts +363 -363
- package/src/engine-components/api.ts +60 -60
- package/src/engine-components/avatar/AvatarBlink_Simple.ts +69 -69
- package/src/engine-components/avatar/AvatarEyeLook_Rotation.ts +63 -63
- package/src/engine-components/avatar/Avatar_Brain_LookAt.ts +139 -139
- package/src/engine-components/avatar/Avatar_MouthShapes.ts +83 -83
- package/src/engine-components/avatar/Avatar_MustacheShake.ts +31 -31
- package/src/engine-components/codegen/components.ts +217 -217
- package/src/engine-components/debug/LogStats.ts +21 -21
- package/src/engine-components/export/gltf/GltfExport.ts +265 -265
- package/src/engine-components/export/usdz/Extension.ts +24 -24
- package/src/engine-components/export/usdz/ThreeUSDZExporter.ts +2426 -2426
- package/src/engine-components/export/usdz/USDZExporter.ts +705 -705
- package/src/engine-components/export/usdz/extensions/Animation.ts +1204 -1204
- package/src/engine-components/export/usdz/extensions/DocumentExtension.ts +9 -9
- package/src/engine-components/export/usdz/extensions/NodeMaterialConverter.ts +532 -532
- package/src/engine-components/export/usdz/extensions/USDZText.ts +240 -240
- package/src/engine-components/export/usdz/extensions/USDZUI.ts +189 -189
- package/src/engine-components/export/usdz/extensions/behavior/Actions.ts +99 -99
- package/src/engine-components/export/usdz/extensions/behavior/AudioExtension.ts +102 -102
- package/src/engine-components/export/usdz/extensions/behavior/Behaviour.ts +320 -320
- package/src/engine-components/export/usdz/extensions/behavior/BehaviourComponents.ts +1225 -1225
- package/src/engine-components/export/usdz/extensions/behavior/BehavioursBuilder.ts +646 -646
- package/src/engine-components/export/usdz/extensions/behavior/PhysicsExtension.ts +132 -132
- package/src/engine-components/export/usdz/index.ts +2 -2
- package/src/engine-components/export/usdz/utils/animationutils.ts +191 -191
- package/src/engine-components/export/usdz/utils/quicklook.ts +50 -50
- package/src/engine-components/particlesystem/ParticleSystem.ts +1287 -1287
- package/src/engine-components/particlesystem/ParticleSystemModules.ts +1765 -1765
- package/src/engine-components/particlesystem/ParticleSystemSubEmitter.ts +111 -111
- package/src/engine-components/particlesystem/api.ts +1 -1
- package/src/engine-components/postprocessing/Effects/Antialiasing.ts +64 -64
- package/src/engine-components/postprocessing/Effects/BloomEffect.ts +116 -116
- package/src/engine-components/postprocessing/Effects/ChromaticAberration.ts +37 -37
- package/src/engine-components/postprocessing/Effects/ColorAdjustments.ts +106 -106
- package/src/engine-components/postprocessing/Effects/DepthOfField.ts +103 -103
- package/src/engine-components/postprocessing/Effects/EffectWrapper.ts +25 -25
- package/src/engine-components/postprocessing/Effects/Pixelation.ts +32 -32
- package/src/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusion.ts +90 -90
- package/src/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.ts +192 -192
- package/src/engine-components/postprocessing/Effects/Sharpening.ts +143 -143
- package/src/engine-components/postprocessing/Effects/TiltShiftEffect.ts +61 -61
- package/src/engine-components/postprocessing/Effects/Tonemapping.ts +103 -103
- package/src/engine-components/postprocessing/Effects/Tonemapping.utils.ts +60 -60
- package/src/engine-components/postprocessing/Effects/Vignette.ts +59 -59
- package/src/engine-components/postprocessing/PostProcessingEffect.ts +192 -192
- package/src/engine-components/postprocessing/PostProcessingHandler.ts +572 -572
- package/src/engine-components/postprocessing/Volume.ts +426 -426
- package/src/engine-components/postprocessing/VolumeParameter.ts +158 -158
- package/src/engine-components/postprocessing/VolumeProfile.ts +61 -61
- package/src/engine-components/postprocessing/index.ts +5 -5
- package/src/engine-components/postprocessing/utils.ts +154 -154
- package/src/engine-components/timeline/PlayableDirector.ts +722 -722
- package/src/engine-components/timeline/SignalAsset.ts +144 -144
- package/src/engine-components/timeline/TimelineModels.ts +92 -92
- package/src/engine-components/timeline/TimelineTracks.ts +967 -967
- package/src/engine-components/timeline/index.ts +3 -3
- package/src/engine-components/ui/BaseUIComponent.ts +203 -203
- package/src/engine-components/ui/Button.ts +307 -307
- package/src/engine-components/ui/Canvas.ts +419 -419
- package/src/engine-components/ui/CanvasGroup.ts +54 -54
- package/src/engine-components/ui/EventSystem.ts +854 -854
- package/src/engine-components/ui/Graphic.ts +275 -275
- package/src/engine-components/ui/Image.ts +112 -112
- package/src/engine-components/ui/InputField.ts +321 -321
- package/src/engine-components/ui/Interfaces.ts +57 -57
- package/src/engine-components/ui/Layout.ts +334 -334
- package/src/engine-components/ui/Outline.ts +13 -13
- package/src/engine-components/ui/PointerEvents.ts +206 -206
- package/src/engine-components/ui/RaycastUtils.ts +69 -69
- package/src/engine-components/ui/Raycaster.ts +102 -102
- package/src/engine-components/ui/RectTransform.ts +375 -375
- package/src/engine-components/ui/SpatialHtml.ts +79 -79
- package/src/engine-components/ui/Symbols.ts +1 -1
- package/src/engine-components/ui/Text.ts +578 -578
- package/src/engine-components/ui/Utils.ts +113 -113
- package/src/engine-components/utils/EnvironmentScene.ts +245 -245
- package/src/engine-components/utils/LookAt.ts +88 -88
- package/src/engine-components/utils/OpenURL.ts +114 -114
- package/src/engine-components/webxr/Avatar.ts +265 -265
- package/src/engine-components/webxr/TeleportTarget.ts +9 -9
- package/src/engine-components/webxr/WebARCameraBackground.ts +175 -175
- package/src/engine-components/webxr/WebARSessionRoot.ts +880 -880
- package/src/engine-components/webxr/WebXR.ts +585 -585
- package/src/engine-components/webxr/WebXRAvatar.ts +66 -66
- package/src/engine-components/webxr/WebXRImageTracking.ts +519 -519
- package/src/engine-components/webxr/WebXRPlaneTracking.ts +570 -570
- package/src/engine-components/webxr/WebXRRig.ts +77 -77
- package/src/engine-components/webxr/XRFlag.ts +147 -147
- package/src/engine-components/webxr/controllers/XRControllerFollow.ts +118 -118
- package/src/engine-components/webxr/controllers/XRControllerModel.ts +373 -373
- package/src/engine-components/webxr/controllers/XRControllerMovement.ts +550 -550
- package/src/engine-components/webxr/index.ts +2 -2
- package/src/engine-components/webxr/types.ts +3 -3
- package/src/engine-components-experimental/Presentation.ts +12 -12
- package/src/engine-components-experimental/api.ts +4 -4
- package/src/engine-components-experimental/networking/PlayerSync.ts +401 -401
- package/src/engine-schemes/COMPILE_SCHEMES.bat +3 -3
- package/src/engine-schemes/COMPILE_TS.bat +11 -11
- package/src/engine-schemes/README.md +1 -1
- package/src/engine-schemes/api.ts +12 -12
- package/src/engine-schemes/dist/api.js +17 -0
- package/src/engine-schemes/dist/api.js.meta +7 -0
- package/src/engine-schemes/dist/schemes.js +25 -0
- package/src/engine-schemes/dist/schemes.js.meta +7 -0
- package/src/engine-schemes/dist/synced-camera-model.js +74 -0
- package/src/engine-schemes/dist/synced-camera-model.js.meta +7 -0
- package/src/engine-schemes/dist/synced-transform-model.js +73 -0
- package/src/engine-schemes/dist/synced-transform-model.js.meta +7 -0
- package/src/engine-schemes/dist/transform.js +46 -0
- package/src/engine-schemes/dist/transform.js.meta +7 -0
- package/src/engine-schemes/dist/vec2.js +32 -0
- package/src/engine-schemes/dist/vec2.js.meta +7 -0
- package/src/engine-schemes/dist/vec3.js +36 -0
- package/src/engine-schemes/dist/vec3.js.meta +7 -0
- package/src/engine-schemes/dist/vec4.js +40 -0
- package/src/engine-schemes/dist/vec4.js.meta +7 -0
- package/src/engine-schemes/dist/vr-user-state-buffer.js +110 -0
- package/src/engine-schemes/dist/vr-user-state-buffer.js.meta +7 -0
- package/src/engine-schemes/schemes.ts +28 -28
- package/src/engine-schemes/synced-camera-model.ts +92 -92
- package/src/engine-schemes/synced-transform-model.ts +90 -90
- package/src/engine-schemes/syncedCamera.fbs +10 -10
- package/src/engine-schemes/transform.ts +50 -50
- package/src/engine-schemes/transforms.fbs +25 -25
- package/src/engine-schemes/vec.fbs +19 -19
- package/src/engine-schemes/vec2.ts +33 -33
- package/src/engine-schemes/vec3.ts +38 -38
- package/src/engine-schemes/vec4.ts +43 -43
- package/src/engine-schemes/vr-user-state-buffer.ts +145 -145
- package/src/engine-schemes/vrUserStateBuffer.fbs +17 -17
- package/src/include/draco/draco_decoder.js +34 -34
- package/src/include/ktx2/basis_transcoder.js +21 -21
- package/src/include/needle/arial-msdf.json +1471 -1471
- package/src/include/three/DragControls.js +231 -231
- package/src/include/three/EXT_mesh_gpu_instancing_exporter.js +66 -66
- package/src/needle-engine.ts +70 -70
- package/dist/generateMeshBVH.worker-BaNp_Xtp.js +0 -25
- package/dist/gltf-progressive-60Qk5ebF.min.js +0 -8
- package/dist/gltf-progressive-DM5ZiecW.js +0 -1060
- package/dist/gltf-progressive-wxtaVmio.umd.cjs +0 -8
|
@@ -1,928 +1,928 @@
|
|
|
1
|
-
import { AnimationAction, Box3, Box3Helper, Camera, Color, DepthTexture, Euler, GridHelper, Layers, Material, Mesh, MeshStandardMaterial, Object3D, OrthographicCamera, PerspectiveCamera, PlaneGeometry, Quaternion, Scene, ShadowMaterial, Texture, Uniform, Vector2Like, Vector3, WebGLRenderTarget } from "three";
|
|
2
|
-
import { ShaderMaterial, WebGLRenderer } from "three";
|
|
3
|
-
import { GroundedSkybox } from "three/examples/jsm/objects/GroundedSkybox.js";
|
|
4
|
-
|
|
5
|
-
import { useForAutoFit } from "./engine_camera.js";
|
|
6
|
-
import { Mathf } from "./engine_math.js"
|
|
7
|
-
import { Vec3 } from "./engine_types.js";
|
|
8
|
-
import { CircularBuffer } from "./engine_utils.js";
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Slerp between two vectors
|
|
12
|
-
*/
|
|
13
|
-
export function slerp(vec: Vector3, end: Vector3, t: number) {
|
|
14
|
-
const len1 = vec.length();
|
|
15
|
-
const len2 = end.length();
|
|
16
|
-
const targetLen = Mathf.lerp(len1, len2, t);
|
|
17
|
-
return vec.lerp(end, t).normalize().multiplyScalar(targetLen);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
const _tempQuat = new Quaternion();
|
|
21
|
-
const flipYQuat: Quaternion = new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), Math.PI);
|
|
22
|
-
|
|
23
|
-
export function lookAtInverse(obj: Object3D, target: Vector3) {
|
|
24
|
-
obj.lookAt(target);
|
|
25
|
-
obj.quaternion.multiply(flipYQuat);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
/** Better lookAt
|
|
30
|
-
* @param object the object that the lookAt should be applied to
|
|
31
|
-
* @param target the target to look at
|
|
32
|
-
* @param keepUpDirection if true the up direction will be kept
|
|
33
|
-
* @param copyTargetRotation if true the target rotation will be copied so the rotation is not skewed
|
|
34
|
-
*/
|
|
35
|
-
export function lookAtObject(object: Object3D, target: Object3D, keepUpDirection: boolean = true, copyTargetRotation: boolean = false) {
|
|
36
|
-
if (object === target) return;
|
|
37
|
-
_tempQuat.copy(object.quaternion);
|
|
38
|
-
|
|
39
|
-
const lookTarget = getWorldPosition(target);
|
|
40
|
-
const lookFrom = getWorldPosition(object);
|
|
41
|
-
|
|
42
|
-
if (copyTargetRotation) {
|
|
43
|
-
setWorldQuaternion(object, getWorldQuaternion(target));
|
|
44
|
-
// look at forward again so we don't get any roll
|
|
45
|
-
if (keepUpDirection) {
|
|
46
|
-
const ypos = lookFrom.y;
|
|
47
|
-
const forwardPoint = lookFrom.sub(getWorldDirection(object));
|
|
48
|
-
forwardPoint.y = ypos;
|
|
49
|
-
object.lookAt(forwardPoint);
|
|
50
|
-
object.quaternion.multiply(flipYQuat);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
// sanitize – three.js sometimes returns NaN values when parents are non-uniformly scaled
|
|
54
|
-
if (Number.isNaN(object.quaternion.x)) {
|
|
55
|
-
object.quaternion.copy(_tempQuat);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
return;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
if (keepUpDirection) {
|
|
62
|
-
lookTarget.y = lookFrom.y;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
object.lookAt(lookTarget);
|
|
66
|
-
|
|
67
|
-
// sanitize – three.js sometimes returns NaN values when parents are non-uniformly scaled
|
|
68
|
-
if (Number.isNaN(object.quaternion.x)) {
|
|
69
|
-
object.quaternion.copy(_tempQuat);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Look at a 2D point in screen space
|
|
76
|
-
* @param object the object to look at the point
|
|
77
|
-
* @param target the target point in 2D screen space XY e.g. from a mouse event
|
|
78
|
-
* @param camera the camera to use for the lookAt
|
|
79
|
-
* @param factor the factor to multiply the distance from the camera to the object. Default is 1
|
|
80
|
-
* @returns the target point in world space
|
|
81
|
-
*
|
|
82
|
-
* @example Needle Engine Component
|
|
83
|
-
* ```ts
|
|
84
|
-
* export class MyLookAtComponent extends Behaviour {
|
|
85
|
-
* update() {
|
|
86
|
-
* lookAtScreenPoint(this.gameObject, this.context.input.mousePosition, this.context.mainCamera);
|
|
87
|
-
* }
|
|
88
|
-
* }
|
|
89
|
-
* ```
|
|
90
|
-
*
|
|
91
|
-
* @example Look at from browser mouse move event
|
|
92
|
-
* ```ts
|
|
93
|
-
* window.addEventListener("mousemove", (e) => {
|
|
94
|
-
* lookAtScreenPoint(object, new Vector2(e.clientX, e.clientY), camera);
|
|
95
|
-
* });
|
|
96
|
-
* ```
|
|
97
|
-
*/
|
|
98
|
-
export function lookAtScreenPoint(object: Object3D, target: Vector2Like, camera: Camera, factor: number = 1): Vector3 | null {
|
|
99
|
-
|
|
100
|
-
if (camera) {
|
|
101
|
-
const pos = getTempVector(0, 0, 0);
|
|
102
|
-
const ndcx = (target.x / window.innerWidth) * 2 - 1;
|
|
103
|
-
const ndcy = -(target.y / window.innerHeight) * 2 + 1;
|
|
104
|
-
pos.set(
|
|
105
|
-
ndcx,
|
|
106
|
-
ndcy,
|
|
107
|
-
0
|
|
108
|
-
);
|
|
109
|
-
pos.unproject(camera);
|
|
110
|
-
// get distance from object to camera
|
|
111
|
-
const camPos = camera.worldPosition;
|
|
112
|
-
const dist = object.worldPosition.distanceTo(camPos);
|
|
113
|
-
// Create direction from camera through cursor point
|
|
114
|
-
const dir = pos.sub(camPos);
|
|
115
|
-
dir.multiplyScalar(factor * 3.6 * dist);
|
|
116
|
-
const targetPoint = camera.worldPosition.add(dir);
|
|
117
|
-
object.lookAt(targetPoint);
|
|
118
|
-
return targetPoint;
|
|
119
|
-
}
|
|
120
|
-
return null;
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
const _tempVecs = new CircularBuffer(() => new Vector3(), 100);
|
|
126
|
-
|
|
127
|
-
/** Gets a temporary vector. If a vector is passed in it will be copied to the temporary vector
|
|
128
|
-
* Temporary vectors are cached and reused internally. Don't store them!
|
|
129
|
-
* @param vec3 the vector to copy or the x value
|
|
130
|
-
* @param y the y value
|
|
131
|
-
* @param z the z value
|
|
132
|
-
* @returns a temporary vector
|
|
133
|
-
*
|
|
134
|
-
* @example
|
|
135
|
-
* ``` javascript
|
|
136
|
-
* const vec = getTempVector(1, 2, 3);
|
|
137
|
-
* const vec2 = getTempVector(vec);
|
|
138
|
-
* const vec3 = getTempVector(new Vector3(1, 2, 3));
|
|
139
|
-
* const vec4 = getTempVector(new DOMPointReadOnly(1, 2, 3));
|
|
140
|
-
* const vec5 = getTempVector();
|
|
141
|
-
* ```
|
|
142
|
-
*/
|
|
143
|
-
export function getTempVector(): Vector3;
|
|
144
|
-
export function getTempVector(vec3: Vector3): Vector3;
|
|
145
|
-
export function getTempVector(vec3: [number, number, number]): Vector3;
|
|
146
|
-
export function getTempVector(vec3: Vec3): Vector3;
|
|
147
|
-
export function getTempVector(dom: DOMPointReadOnly): Vector3;
|
|
148
|
-
export function getTempVector(x: number): Vector3;
|
|
149
|
-
export function getTempVector(x: number, y: number, z: number): Vector3;
|
|
150
|
-
export function getTempVector(vecOrX?: Vec3 | Vector3 | [number, number, number] | DOMPointReadOnly | number, y?: number, z?: number): Vector3 {
|
|
151
|
-
const vec = _tempVecs.get();
|
|
152
|
-
vec.set(0, 0, 0); // initialize with default values
|
|
153
|
-
if (vecOrX instanceof Vector3) vec.copy(vecOrX);
|
|
154
|
-
else if (Array.isArray(vecOrX)) vec.set(vecOrX[0], vecOrX[1], vecOrX[2]);
|
|
155
|
-
else if (vecOrX instanceof DOMPointReadOnly) vec.set(vecOrX.x, vecOrX.y, vecOrX.z);
|
|
156
|
-
else {
|
|
157
|
-
if (typeof vecOrX === "number") {
|
|
158
|
-
vec.x = vecOrX;
|
|
159
|
-
vec.y = y !== undefined ? y : vec.x;
|
|
160
|
-
vec.z = z !== undefined ? z : vec.x;
|
|
161
|
-
}
|
|
162
|
-
else if (typeof vecOrX === "object") {
|
|
163
|
-
vec.x = vecOrX.x;
|
|
164
|
-
vec.y = vecOrX.y;
|
|
165
|
-
vec.z = vecOrX.z;
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
return vec;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
const _tempColors = new CircularBuffer(() => new Color(), 30);
|
|
173
|
-
export function getTempColor(color?: Color) {
|
|
174
|
-
const col = _tempColors.get();
|
|
175
|
-
if (color) col.copy(color);
|
|
176
|
-
else {
|
|
177
|
-
col.set(0, 0, 0);
|
|
178
|
-
}
|
|
179
|
-
return col;
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
const _tempQuats = new CircularBuffer(() => new Quaternion(), 100);
|
|
184
|
-
|
|
185
|
-
/**
|
|
186
|
-
* Gets a temporary quaternion. If a quaternion is passed in it will be copied to the temporary quaternion
|
|
187
|
-
* Temporary quaternions are cached and reused internally. Don't store them!
|
|
188
|
-
* @param value the quaternion to copy
|
|
189
|
-
* @returns a temporary quaternion
|
|
190
|
-
*/
|
|
191
|
-
export function getTempQuaternion(value?: Quaternion | DOMPointReadOnly) {
|
|
192
|
-
const val = _tempQuats.get();
|
|
193
|
-
val.identity();
|
|
194
|
-
if (value instanceof Quaternion) val.copy(value);
|
|
195
|
-
else if (value instanceof DOMPointReadOnly) val.set(value.x, value.y, value.z, value.w);
|
|
196
|
-
return val;
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
const _worldPositions = new CircularBuffer(() => new Vector3(), 100);
|
|
201
|
-
const _lastMatrixWorldUpdateKey = Symbol("lastMatrixWorldUpdateKey");
|
|
202
|
-
|
|
203
|
-
/**
|
|
204
|
-
* Get the world position of an object
|
|
205
|
-
* @param obj the object to get the world position from
|
|
206
|
-
* @param vec a vector to store the result in. If not passed in a temporary vector will be used
|
|
207
|
-
* @param updateParents if true the parents will be updated before getting the world position
|
|
208
|
-
* @returns the world position
|
|
209
|
-
*/
|
|
210
|
-
export function getWorldPosition(obj: Object3D, vec: Vector3 | null = null, updateParents: boolean = true): Vector3 {
|
|
211
|
-
const wp = vec ?? _worldPositions.get();
|
|
212
|
-
if (!obj) return wp.set(0, 0, 0);
|
|
213
|
-
if (!obj.parent) return wp.copy(obj.position);
|
|
214
|
-
if (updateParents)
|
|
215
|
-
obj.updateWorldMatrix(true, false);
|
|
216
|
-
if (obj.matrixWorldNeedsUpdate && obj[_lastMatrixWorldUpdateKey] !== Date.now()) {
|
|
217
|
-
obj[_lastMatrixWorldUpdateKey] = Date.now();
|
|
218
|
-
obj.updateMatrixWorld();
|
|
219
|
-
}
|
|
220
|
-
wp.setFromMatrixPosition(obj.matrixWorld);
|
|
221
|
-
return wp;
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
/**
|
|
225
|
-
* Set the world position of an object
|
|
226
|
-
* @param obj the object to set the world position of
|
|
227
|
-
* @param val the world position to set
|
|
228
|
-
*/
|
|
229
|
-
export function setWorldPosition(obj: Object3D, val: Vector3): Object3D {
|
|
230
|
-
if (!obj) return obj;
|
|
231
|
-
const wp = _worldPositions.get();
|
|
232
|
-
if (val !== wp)
|
|
233
|
-
wp.copy(val);
|
|
234
|
-
const obj2 = obj?.parent ?? obj;
|
|
235
|
-
obj2.worldToLocal(wp);
|
|
236
|
-
obj.position.set(wp.x, wp.y, wp.z);
|
|
237
|
-
return obj;
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
/**
|
|
241
|
-
* Set the world position of an object
|
|
242
|
-
* @param obj the object to set the world position of
|
|
243
|
-
* @param x the x position
|
|
244
|
-
* @param y the y position
|
|
245
|
-
* @param z the z position
|
|
246
|
-
*/
|
|
247
|
-
export function setWorldPositionXYZ(obj: Object3D, x: number, y: number, z: number): Object3D {
|
|
248
|
-
const wp = _worldPositions.get();
|
|
249
|
-
wp.set(x, y, z);
|
|
250
|
-
setWorldPosition(obj, wp);
|
|
251
|
-
return obj;
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
const _worldQuaternions = new CircularBuffer(() => new Quaternion(), 100);
|
|
256
|
-
const _worldQuaternionBuffer: Quaternion = new Quaternion();
|
|
257
|
-
const _tempQuaternionBuffer2: Quaternion = new Quaternion();
|
|
258
|
-
|
|
259
|
-
export function getWorldQuaternion(obj: Object3D, target: Quaternion | null = null): Quaternion {
|
|
260
|
-
if (!obj) return _worldQuaternions.get().identity();
|
|
261
|
-
const quat = target ?? _worldQuaternions.get();
|
|
262
|
-
if (!obj.parent) return quat.copy(obj.quaternion);
|
|
263
|
-
obj.getWorldQuaternion(quat);
|
|
264
|
-
return quat;
|
|
265
|
-
}
|
|
266
|
-
export function setWorldQuaternion(obj: Object3D, val: Quaternion) {
|
|
267
|
-
if (!obj) return;
|
|
268
|
-
if (val !== _worldQuaternionBuffer)
|
|
269
|
-
_worldQuaternionBuffer.copy(val);
|
|
270
|
-
const tempVec = _worldQuaternionBuffer;
|
|
271
|
-
const parent = obj?.parent;
|
|
272
|
-
parent?.getWorldQuaternion(_tempQuaternionBuffer2);
|
|
273
|
-
_tempQuaternionBuffer2.invert();
|
|
274
|
-
const q = _tempQuaternionBuffer2.multiply(tempVec);
|
|
275
|
-
// console.log(tempVec);
|
|
276
|
-
obj.quaternion.set(q.x, q.y, q.z, q.w);
|
|
277
|
-
// console.error("quaternion world to local is not yet implemented");
|
|
278
|
-
}
|
|
279
|
-
export function setWorldQuaternionXYZW(obj: Object3D, x: number, y: number, z: number, w: number) {
|
|
280
|
-
_worldQuaternionBuffer.set(x, y, z, w);
|
|
281
|
-
setWorldQuaternion(obj, _worldQuaternionBuffer);
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
const _worldScaleBuffer = new CircularBuffer(() => new Vector3(), 100);
|
|
285
|
-
const _worldScale: Vector3 = new Vector3();
|
|
286
|
-
|
|
287
|
-
export function getWorldScale(obj: Object3D, vec: Vector3 | null = null): Vector3 {
|
|
288
|
-
if (!vec)
|
|
289
|
-
vec = _worldScaleBuffer.get();
|
|
290
|
-
if (!obj) return vec.set(0, 0, 0);
|
|
291
|
-
if (!obj.parent) return vec.copy(obj.scale);
|
|
292
|
-
obj.getWorldScale(vec);
|
|
293
|
-
return vec;
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
export function setWorldScale(obj: Object3D, vec: Vector3) {
|
|
297
|
-
if (!obj) return;
|
|
298
|
-
if (!obj.parent) {
|
|
299
|
-
obj.scale.copy(vec);
|
|
300
|
-
return;
|
|
301
|
-
}
|
|
302
|
-
const tempVec = _worldScale;
|
|
303
|
-
const obj2 = obj.parent;
|
|
304
|
-
obj2.getWorldScale(tempVec);
|
|
305
|
-
obj.scale.copy(vec);
|
|
306
|
-
obj.scale.divide(tempVec);
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
const _forward = new Vector3();
|
|
310
|
-
const _forwardQuat = new Quaternion();
|
|
311
|
-
export function forward(obj: Object3D): Vector3 {
|
|
312
|
-
getWorldQuaternion(obj, _forwardQuat);
|
|
313
|
-
return _forward.set(0, 0, 1).applyQuaternion(_forwardQuat);
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
const _worldDirectionBuffer = new CircularBuffer(() => new Vector3(), 100);
|
|
317
|
-
const _worldDirectionQuat = new Quaternion();
|
|
318
|
-
/** Get the world direction. Returns world forward if nothing is passed in.
|
|
319
|
-
* Pass in a relative direction to get it converted to world space (e.g. dir = new Vector3(0, 1, 1))
|
|
320
|
-
* The returned vector will not be normalized
|
|
321
|
-
*/
|
|
322
|
-
export function getWorldDirection(obj: Object3D, dir?: Vector3) {
|
|
323
|
-
// If no direction is passed in set the direction to the forward vector
|
|
324
|
-
if (!dir) dir = _worldDirectionBuffer.get().set(0, 0, 1);
|
|
325
|
-
getWorldQuaternion(obj, _worldDirectionQuat);
|
|
326
|
-
return dir.applyQuaternion(_worldDirectionQuat);
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
const _worldEulerBuffer: Euler = new Euler();
|
|
331
|
-
const _worldEuler: Euler = new Euler();
|
|
332
|
-
const _worldRotation: Vector3 = new Vector3();
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
// world euler (in radians)
|
|
337
|
-
export function getWorldEuler(obj: Object3D): Euler {
|
|
338
|
-
const quat = _worldQuaternions.get();
|
|
339
|
-
obj.getWorldQuaternion(quat);
|
|
340
|
-
_worldEuler.setFromQuaternion(quat);
|
|
341
|
-
return _worldEuler;
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
// world euler (in radians)
|
|
345
|
-
export function setWorldEuler(obj: Object3D, val: Euler) {
|
|
346
|
-
const quat = _worldQuaternions.get();
|
|
347
|
-
setWorldQuaternion(obj, quat.setFromEuler(val));;
|
|
348
|
-
}
|
|
349
|
-
|
|
350
|
-
// returns rotation in degrees
|
|
351
|
-
export function getWorldRotation(obj: Object3D): Vector3 {
|
|
352
|
-
const rot = getWorldEuler(obj);
|
|
353
|
-
const wr = _worldRotation;
|
|
354
|
-
wr.set(rot.x, rot.y, rot.z);
|
|
355
|
-
wr.x = Mathf.toDegrees(wr.x);
|
|
356
|
-
wr.y = Mathf.toDegrees(wr.y);
|
|
357
|
-
wr.z = Mathf.toDegrees(wr.z);
|
|
358
|
-
return wr;
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
export function setWorldRotation(obj: Object3D, val: Vector3) {
|
|
362
|
-
setWorldRotationXYZ(obj, val.x, val.y, val.z, true);
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
export function setWorldRotationXYZ(obj: Object3D, x: number, y: number, z: number, degrees: boolean = true) {
|
|
366
|
-
if (degrees) {
|
|
367
|
-
x = Mathf.toRadians(x);
|
|
368
|
-
y = Mathf.toRadians(y);
|
|
369
|
-
z = Mathf.toRadians(z);
|
|
370
|
-
}
|
|
371
|
-
_worldEulerBuffer.set(x, y, z);
|
|
372
|
-
_worldQuaternionBuffer.setFromEuler(_worldEulerBuffer);
|
|
373
|
-
setWorldQuaternion(obj, _worldQuaternionBuffer);
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
// from https://github.com/mrdoob/js/pull/10995#issuecomment-287614722
|
|
381
|
-
export function logHierarchy(root: Object3D | null | undefined, collapsible: boolean = true) {
|
|
382
|
-
if (!root) return;
|
|
383
|
-
if (collapsible) {
|
|
384
|
-
(function printGraph(obj: Object3D) {
|
|
385
|
-
console.groupCollapsed((obj.name ? obj.name : '(no name : ' + obj.type + ')') + ' %o', obj);
|
|
386
|
-
obj.children.forEach(printGraph);
|
|
387
|
-
console.groupEnd();
|
|
388
|
-
}(root));
|
|
389
|
-
|
|
390
|
-
} else {
|
|
391
|
-
root.traverse(function (obj: Object3D) {
|
|
392
|
-
var s = '|___';
|
|
393
|
-
var obj2 = obj;
|
|
394
|
-
while (obj2.parent !== null) {
|
|
395
|
-
s = '\t' + s;
|
|
396
|
-
obj2 = obj2.parent;
|
|
397
|
-
}
|
|
398
|
-
console.log(s + obj.name + ' <' + obj.type + '>');
|
|
399
|
-
});
|
|
400
|
-
};
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
export function getParentHierarchyPath(obj: Object3D): string {
|
|
404
|
-
let path = obj?.name || "";
|
|
405
|
-
if (!obj) return path;
|
|
406
|
-
let parent = obj.parent;
|
|
407
|
-
while (parent) {
|
|
408
|
-
path = parent.name + "/" + path;
|
|
409
|
-
parent = parent.parent;
|
|
410
|
-
}
|
|
411
|
-
return path;
|
|
412
|
-
}
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
export function isAnimationAction(obj: object) {
|
|
416
|
-
if (obj) {
|
|
417
|
-
// this doesnt work :(
|
|
418
|
-
// return obj instanceof AnimationAction;
|
|
419
|
-
// instead we do this:
|
|
420
|
-
const act = obj as AnimationAction;
|
|
421
|
-
return act.blendMode !== undefined && act.clampWhenFinished !== undefined && act.enabled !== undefined && act.fadeIn !== undefined && act.getClip !== undefined;
|
|
422
|
-
}
|
|
423
|
-
return false;
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
class BlitMaterial extends ShaderMaterial {
|
|
430
|
-
static vertex = `
|
|
431
|
-
varying vec2 vUv;
|
|
432
|
-
void main(){
|
|
433
|
-
vUv = uv;
|
|
434
|
-
gl_Position = vec4(position.xy, 0., 1.0);
|
|
435
|
-
}`;
|
|
436
|
-
|
|
437
|
-
constructor() {
|
|
438
|
-
super({
|
|
439
|
-
vertexShader: BlitMaterial.vertex,
|
|
440
|
-
uniforms: {
|
|
441
|
-
map: new Uniform(null),
|
|
442
|
-
flipY: new Uniform(true),
|
|
443
|
-
writeDepth: new Uniform(false),
|
|
444
|
-
depthTexture: new Uniform(null)
|
|
445
|
-
},
|
|
446
|
-
fragmentShader: `
|
|
447
|
-
uniform sampler2D map;
|
|
448
|
-
uniform bool flipY;
|
|
449
|
-
uniform bool writeDepth;
|
|
450
|
-
uniform sampler2D depthTexture;
|
|
451
|
-
|
|
452
|
-
varying vec2 vUv;
|
|
453
|
-
|
|
454
|
-
void main(){
|
|
455
|
-
vec2 uv = vUv;
|
|
456
|
-
if (flipY) uv.y = 1.0 - uv.y;
|
|
457
|
-
gl_FragColor = texture2D(map, uv);
|
|
458
|
-
|
|
459
|
-
if (writeDepth) {
|
|
460
|
-
float depth = texture2D(depthTexture, uv).r;
|
|
461
|
-
gl_FragDepth = depth;
|
|
462
|
-
|
|
463
|
-
// float linearDepth = (depth - 0.99) * 100.0; // Enhance near 1.0 values
|
|
464
|
-
// gl_FragColor = vec4(linearDepth, linearDepth, linearDepth, 1.0);
|
|
465
|
-
}
|
|
466
|
-
}`
|
|
467
|
-
});
|
|
468
|
-
}
|
|
469
|
-
|
|
470
|
-
reset() {
|
|
471
|
-
this.uniforms.map.value = null;
|
|
472
|
-
this.uniforms.flipY.value = true;
|
|
473
|
-
this.uniforms.writeDepth.value = false;
|
|
474
|
-
this.uniforms.depthTexture.value = null;
|
|
475
|
-
this.needsUpdate = true;
|
|
476
|
-
this.uniformsNeedUpdate = true;
|
|
477
|
-
}
|
|
478
|
-
}
|
|
479
|
-
|
|
480
|
-
/**
|
|
481
|
-
* Utility class to perform various graphics operations like copying textures to canvas
|
|
482
|
-
*/
|
|
483
|
-
export class Graphics {
|
|
484
|
-
private static readonly planeGeometry = new PlaneGeometry(2, 2, 1, 1);
|
|
485
|
-
private static readonly renderer: WebGLRenderer = new WebGLRenderer({ antialias: false, alpha: true });
|
|
486
|
-
private static readonly perspectiveCam = new PerspectiveCamera();
|
|
487
|
-
private static readonly orthographicCam = new OrthographicCamera();
|
|
488
|
-
private static readonly scene = new Scene();
|
|
489
|
-
private static readonly blitMaterial: BlitMaterial = new BlitMaterial();
|
|
490
|
-
private static readonly mesh: Mesh = new Mesh(Graphics.planeGeometry, Graphics.blitMaterial);
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
/**
|
|
494
|
-
* Copy a texture to a new texture
|
|
495
|
-
* @param texture the texture to copy
|
|
496
|
-
* @param blitMaterial the material to use for copying (optional)
|
|
497
|
-
* @returns the newly created, copied texture
|
|
498
|
-
*/
|
|
499
|
-
static copyTexture(texture: Texture, blitMaterial?: ShaderMaterial): Texture {
|
|
500
|
-
|
|
501
|
-
// ensure that a blit material exists
|
|
502
|
-
if (!blitMaterial) {
|
|
503
|
-
blitMaterial = this.blitMaterial;
|
|
504
|
-
};
|
|
505
|
-
this.blitMaterial.reset();
|
|
506
|
-
|
|
507
|
-
const material = blitMaterial || this.blitMaterial;
|
|
508
|
-
|
|
509
|
-
// TODO: reset the uniforms...
|
|
510
|
-
material.uniforms.map.value = texture;
|
|
511
|
-
material.needsUpdate = true;
|
|
512
|
-
material.uniformsNeedUpdate = true;
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
// ensure that the blit material has the correct vertex shader
|
|
516
|
-
const origVertexShader = material.vertexShader;
|
|
517
|
-
material.vertexShader = BlitMaterial.vertex;
|
|
518
|
-
|
|
519
|
-
const mesh = this.mesh;
|
|
520
|
-
mesh.material = material;
|
|
521
|
-
mesh.frustumCulled = false;
|
|
522
|
-
this.scene.children.length = 0;
|
|
523
|
-
this.scene.add(mesh);
|
|
524
|
-
this.renderer.setSize(texture.image.width, texture.image.height);
|
|
525
|
-
this.renderer.clear();
|
|
526
|
-
this.renderer.render(this.scene, this.perspectiveCam);
|
|
527
|
-
const tex = new Texture(this.renderer.domElement);
|
|
528
|
-
tex.name = "Copy";
|
|
529
|
-
tex.needsUpdate = true; // < important!
|
|
530
|
-
|
|
531
|
-
// reset vertex shader
|
|
532
|
-
material.vertexShader = origVertexShader;
|
|
533
|
-
|
|
534
|
-
return tex;
|
|
535
|
-
}
|
|
536
|
-
|
|
537
|
-
static blit(src: Texture, target: WebGLRenderTarget, options?: {
|
|
538
|
-
renderer?: WebGLRenderer,
|
|
539
|
-
blitMaterial?: ShaderMaterial,
|
|
540
|
-
flipY?: boolean,
|
|
541
|
-
depthTexture?: DepthTexture | null,
|
|
542
|
-
depthTest?: boolean,
|
|
543
|
-
depthWrite?: boolean,
|
|
544
|
-
}) {
|
|
545
|
-
const {
|
|
546
|
-
renderer = this.renderer,
|
|
547
|
-
blitMaterial = this.blitMaterial,
|
|
548
|
-
flipY = false,
|
|
549
|
-
depthTexture = null,
|
|
550
|
-
depthTest = true,
|
|
551
|
-
depthWrite = true,
|
|
552
|
-
} = options || {};
|
|
553
|
-
|
|
554
|
-
this.blitMaterial.reset();
|
|
555
|
-
|
|
556
|
-
if (blitMaterial.uniforms.map) blitMaterial.uniforms.map.value = src;
|
|
557
|
-
if (blitMaterial.uniforms.flipY) blitMaterial.uniforms.flipY.value = flipY;
|
|
558
|
-
|
|
559
|
-
if (depthTexture) {
|
|
560
|
-
blitMaterial.uniforms.writeDepth = new Uniform(true);
|
|
561
|
-
blitMaterial.uniforms.depthTexture.value = depthTexture;
|
|
562
|
-
}
|
|
563
|
-
else {
|
|
564
|
-
blitMaterial.uniforms.writeDepth = new Uniform(false);
|
|
565
|
-
blitMaterial.uniforms.depthTexture.value = null;
|
|
566
|
-
}
|
|
567
|
-
blitMaterial.needsUpdate = true;
|
|
568
|
-
blitMaterial.uniformsNeedUpdate = true;
|
|
569
|
-
|
|
570
|
-
const mesh = this.mesh;
|
|
571
|
-
mesh.material = blitMaterial;
|
|
572
|
-
mesh.frustumCulled = false;
|
|
573
|
-
this.scene.children.length = 0;
|
|
574
|
-
this.scene.add(mesh);
|
|
575
|
-
|
|
576
|
-
// Save state
|
|
577
|
-
const renderTarget = renderer.getRenderTarget();
|
|
578
|
-
const gl = renderer.getContext();
|
|
579
|
-
const depthTestEnabled = gl.getParameter(gl.DEPTH_TEST);
|
|
580
|
-
const depthWriteMask = gl.getParameter(gl.DEPTH_WRITEMASK);
|
|
581
|
-
const depthFunc = gl.getParameter(gl.DEPTH_FUNC);
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
// Set state
|
|
585
|
-
if (depthTest) renderer.getContext().enable(renderer.getContext().DEPTH_TEST);
|
|
586
|
-
else renderer.getContext().disable(renderer.getContext().DEPTH_TEST);
|
|
587
|
-
renderer.state.buffers.depth.setMask(depthWrite);
|
|
588
|
-
|
|
589
|
-
renderer.setClearColor(new Color(0, 0, 0), 0);
|
|
590
|
-
// renderer.setSize(target.width, target.height);
|
|
591
|
-
renderer.setPixelRatio(window.devicePixelRatio);
|
|
592
|
-
renderer.setRenderTarget(target);
|
|
593
|
-
renderer.clear();
|
|
594
|
-
renderer.render(this.scene, this.perspectiveCam);
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
// Restore state
|
|
598
|
-
renderer.setRenderTarget(renderTarget); // reset render target
|
|
599
|
-
const depthBuffer = renderer.state.buffers.depth;
|
|
600
|
-
depthBuffer.setTest(depthTestEnabled);
|
|
601
|
-
depthBuffer.setMask(depthWriteMask);
|
|
602
|
-
depthBuffer.setFunc(depthFunc);
|
|
603
|
-
}
|
|
604
|
-
|
|
605
|
-
/**
|
|
606
|
-
* Copy a texture to a HTMLCanvasElement
|
|
607
|
-
* @param texture the texture convert
|
|
608
|
-
* @param force if true the texture will be copied to a new texture before converting
|
|
609
|
-
* @returns the HTMLCanvasElement with the texture or null if the texture could not be copied
|
|
610
|
-
*/
|
|
611
|
-
static textureToCanvas(texture: Texture, force: boolean = false): HTMLCanvasElement | null {
|
|
612
|
-
if (!texture) {
|
|
613
|
-
return null;
|
|
614
|
-
}
|
|
615
|
-
|
|
616
|
-
if (force === true || texture["isCompressedTexture"] === true) {
|
|
617
|
-
texture = copyTexture(texture);
|
|
618
|
-
}
|
|
619
|
-
const image = texture.image;
|
|
620
|
-
if (isImageBitmap(image)) {
|
|
621
|
-
const canvas = document.createElement('canvas');
|
|
622
|
-
canvas.width = image.width;
|
|
623
|
-
canvas.height = image.height;
|
|
624
|
-
|
|
625
|
-
const context = canvas.getContext('2d');
|
|
626
|
-
if (!context) {
|
|
627
|
-
console.error("Failed getting canvas 2d context");
|
|
628
|
-
return null;
|
|
629
|
-
}
|
|
630
|
-
context.drawImage(image, 0, 0, image.width, image.height, 0, 0, canvas.width, canvas.height);
|
|
631
|
-
return canvas;
|
|
632
|
-
}
|
|
633
|
-
|
|
634
|
-
return null;
|
|
635
|
-
}
|
|
636
|
-
}
|
|
637
|
-
|
|
638
|
-
/**@obsolete use Graphics.copyTexture */
|
|
639
|
-
export function copyTexture(texture: Texture): Texture {
|
|
640
|
-
return Graphics.copyTexture(texture);
|
|
641
|
-
}
|
|
642
|
-
|
|
643
|
-
/**@obsolete use Graphics.textureToCanvas */
|
|
644
|
-
export function textureToCanvas(texture: Texture, force: boolean = false): HTMLCanvasElement | null {
|
|
645
|
-
return Graphics.textureToCanvas(texture, force);
|
|
646
|
-
}
|
|
647
|
-
|
|
648
|
-
declare class OffscreenCanvas { };
|
|
649
|
-
|
|
650
|
-
function isImageBitmap(image) {
|
|
651
|
-
return (typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement) ||
|
|
652
|
-
(typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement) ||
|
|
653
|
-
(typeof OffscreenCanvas !== 'undefined' && image instanceof OffscreenCanvas) ||
|
|
654
|
-
(typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap);
|
|
655
|
-
}
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
function isMesh(obj: Object3D): obj is Mesh {
|
|
660
|
-
const type = obj.type;
|
|
661
|
-
// Note: we don't use the instanceof check here because it's unreliable in certain minification scenarios where it returns false
|
|
662
|
-
return type === "Mesh" || type === "SkinnedMesh";
|
|
663
|
-
}
|
|
664
|
-
|
|
665
|
-
// for contact shadows
|
|
666
|
-
export function setVisibleInCustomShadowRendering(obj: Object3D, enabled: boolean) {
|
|
667
|
-
if (enabled)
|
|
668
|
-
obj["needle:rendercustomshadow"] = true;
|
|
669
|
-
else {
|
|
670
|
-
obj["needle:rendercustomshadow"] = false;
|
|
671
|
-
}
|
|
672
|
-
}
|
|
673
|
-
export function getVisibleInCustomShadowRendering(obj: Object3D): boolean {
|
|
674
|
-
if (obj) {
|
|
675
|
-
if (obj["needle:rendercustomshadow"] === true) {
|
|
676
|
-
return true;
|
|
677
|
-
}
|
|
678
|
-
else if (obj["needle:rendercustomshadow"] == undefined) {
|
|
679
|
-
return true;
|
|
680
|
-
}
|
|
681
|
-
}
|
|
682
|
-
return false;
|
|
683
|
-
}
|
|
684
|
-
|
|
685
|
-
/**
|
|
686
|
-
* Get the axis-aligned bounding box of a list of objects.
|
|
687
|
-
* @param objects The objects to get the bounding box from.
|
|
688
|
-
* @param ignore Objects to ignore when calculating the bounding box. Objects that are invisible (gizmos, helpers, etc.) are excluded by default.
|
|
689
|
-
* @param layers The layers to include. Typically the main camera's layers.
|
|
690
|
-
* @param result The result box to store the bounding box in. Returns a new box if not passed in.
|
|
691
|
-
*/
|
|
692
|
-
export function getBoundingBox(objects: Object3D | Object3D[], ignore: ((obj: Object3D) => void | boolean) | Array<Object3D | null | undefined> | undefined = undefined, layers: Layers | undefined | null = undefined, result: Box3 | undefined = undefined): Box3 {
|
|
693
|
-
const box = result || new Box3();
|
|
694
|
-
box.makeEmpty();
|
|
695
|
-
|
|
696
|
-
const emptyChildren = [];
|
|
697
|
-
function expandByObjectRecursive(obj: Object3D) {
|
|
698
|
-
let allowExpanding = true;
|
|
699
|
-
// we dont want to check invisible objects
|
|
700
|
-
if (!obj.visible) return;
|
|
701
|
-
if (useForAutoFit(obj) === false) return;
|
|
702
|
-
if (obj.type === "TransformControlsGizmo" || obj.type === "TransformControlsPlane") return;
|
|
703
|
-
// ignore Box3Helpers
|
|
704
|
-
if (obj instanceof Box3Helper) allowExpanding = false;
|
|
705
|
-
if (obj instanceof GridHelper) allowExpanding = false;
|
|
706
|
-
// ignore GroundProjectedEnv
|
|
707
|
-
if (obj instanceof GroundedSkybox) allowExpanding = false;
|
|
708
|
-
if ((obj as any).isGizmo === true) allowExpanding = false;
|
|
709
|
-
// // Ignore shadow catcher geometry
|
|
710
|
-
if ((obj as Mesh).material instanceof ShadowMaterial) allowExpanding = false;
|
|
711
|
-
// ONLY fit meshes
|
|
712
|
-
if (!(isMesh(obj))) allowExpanding = false;
|
|
713
|
-
// Layer test, typically with the main camera
|
|
714
|
-
if (layers && obj.layers.test(layers) === false) allowExpanding = false;
|
|
715
|
-
if (allowExpanding) {
|
|
716
|
-
// Ignore things parented to the camera + ignore the camera
|
|
717
|
-
if (ignore && Array.isArray(ignore) && ignore?.includes(obj)) return;
|
|
718
|
-
else if (typeof ignore === "function") {
|
|
719
|
-
if (ignore(obj) === true) return;
|
|
720
|
-
}
|
|
721
|
-
}
|
|
722
|
-
// We don't want to fit UI objects
|
|
723
|
-
if (obj["isUI"] === true) return;
|
|
724
|
-
// If we encountered some geometry that should be ignored
|
|
725
|
-
// Then we don't want to use that for expanding the view
|
|
726
|
-
if (allowExpanding) {
|
|
727
|
-
// Temporary override children
|
|
728
|
-
const children = obj.children;
|
|
729
|
-
obj.children = emptyChildren;
|
|
730
|
-
// TODO: validate that object doesn't contain NaN values
|
|
731
|
-
const pos = obj.position;
|
|
732
|
-
const scale = obj.scale;
|
|
733
|
-
if (Number.isNaN(pos.x) || Number.isNaN(pos.y) || Number.isNaN(pos.z)) {
|
|
734
|
-
console.warn(`Object \"${obj.name}\" has NaN values in position or scale.... will ignore it`, pos, scale);
|
|
735
|
-
return;
|
|
736
|
-
}
|
|
737
|
-
// Sanitize for the three.js method that only checks for undefined here
|
|
738
|
-
// @ts-ignore
|
|
739
|
-
if (obj.geometry === null) obj.geometry = undefined;
|
|
740
|
-
box.expandByObject(obj, true);
|
|
741
|
-
obj.children = children;
|
|
742
|
-
}
|
|
743
|
-
for (const child of obj.children) {
|
|
744
|
-
expandByObjectRecursive(child);
|
|
745
|
-
}
|
|
746
|
-
}
|
|
747
|
-
let hasAnyObject = false;
|
|
748
|
-
|
|
749
|
-
if (!Array.isArray(objects))
|
|
750
|
-
objects = [objects];
|
|
751
|
-
|
|
752
|
-
for (const object of objects) {
|
|
753
|
-
if (!object) continue;
|
|
754
|
-
hasAnyObject = true;
|
|
755
|
-
object.updateMatrixWorld();
|
|
756
|
-
expandByObjectRecursive(object);
|
|
757
|
-
}
|
|
758
|
-
if (!hasAnyObject) {
|
|
759
|
-
console.warn("No objects to fit camera to...");
|
|
760
|
-
return box;
|
|
761
|
-
}
|
|
762
|
-
|
|
763
|
-
return box;
|
|
764
|
-
}
|
|
765
|
-
|
|
766
|
-
/**
|
|
767
|
-
* Fits an object into a bounding volume. The volume is defined by a Box3 in world space.
|
|
768
|
-
* @param obj the object to fit
|
|
769
|
-
* @param volume the volume to fit the object into
|
|
770
|
-
* @param opts options for fitting
|
|
771
|
-
*/
|
|
772
|
-
export function fitObjectIntoVolume(obj: Object3D, volume: Box3, opts?: {
|
|
773
|
-
/** Objects to ignore when calculating the obj's bounding box */
|
|
774
|
-
ignore?: Object3D[],
|
|
775
|
-
/** when `true` aligns the objects position to the volume ground
|
|
776
|
-
* @default true
|
|
777
|
-
*/
|
|
778
|
-
position?: boolean
|
|
779
|
-
/** when `true` scales the object to fit the volume
|
|
780
|
-
* @default true
|
|
781
|
-
*/
|
|
782
|
-
scale?: boolean,
|
|
783
|
-
}): {
|
|
784
|
-
/** The object's bounding box before fitting */
|
|
785
|
-
boundsBefore: Box3,
|
|
786
|
-
/** The scale that was applied to the object */
|
|
787
|
-
scale: Vector3,
|
|
788
|
-
} {
|
|
789
|
-
const box = getBoundingBox([obj], opts?.ignore);
|
|
790
|
-
|
|
791
|
-
const boundsSize = new Vector3();
|
|
792
|
-
box.getSize(boundsSize);
|
|
793
|
-
const boundsCenter = new Vector3();
|
|
794
|
-
box.getCenter(boundsCenter);
|
|
795
|
-
|
|
796
|
-
const targetSize = new Vector3();
|
|
797
|
-
volume.getSize(targetSize);
|
|
798
|
-
const targetCenter = new Vector3();
|
|
799
|
-
volume.getCenter(targetCenter);
|
|
800
|
-
|
|
801
|
-
const scale = new Vector3();
|
|
802
|
-
scale.set(targetSize.x / boundsSize.x, targetSize.y / boundsSize.y, targetSize.z / boundsSize.z);
|
|
803
|
-
const minScale = Math.min(scale.x, scale.y, scale.z);
|
|
804
|
-
const useScale = opts?.scale !== false;
|
|
805
|
-
if (useScale) {
|
|
806
|
-
setWorldScale(obj, getWorldScale(obj).multiplyScalar(minScale));
|
|
807
|
-
}
|
|
808
|
-
|
|
809
|
-
if (opts?.position !== false) {
|
|
810
|
-
const boundsBottomPosition = new Vector3();
|
|
811
|
-
box.getCenter(boundsBottomPosition);
|
|
812
|
-
boundsBottomPosition.y = box.min.y;
|
|
813
|
-
const targetBottomPosition = new Vector3();
|
|
814
|
-
volume.getCenter(targetBottomPosition);
|
|
815
|
-
targetBottomPosition.y = volume.min.y;
|
|
816
|
-
const offset = targetBottomPosition.clone().sub(boundsBottomPosition);
|
|
817
|
-
if (useScale) offset.multiplyScalar(minScale);
|
|
818
|
-
setWorldPosition(obj, getWorldPosition(obj).add(offset));
|
|
819
|
-
}
|
|
820
|
-
|
|
821
|
-
return {
|
|
822
|
-
boundsBefore: box,
|
|
823
|
-
scale,
|
|
824
|
-
}
|
|
825
|
-
}
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
declare type PlaceOnSurfaceResult = {
|
|
829
|
-
/** The offset from the object bounds to the pivot */
|
|
830
|
-
offset: Vector3,
|
|
831
|
-
/** The object's bounding box */
|
|
832
|
-
bounds: Box3
|
|
833
|
-
}
|
|
834
|
-
|
|
835
|
-
/**
|
|
836
|
-
* Place an object on a surface. This will calculate the object bounds which might be an expensive operation for complex objects.
|
|
837
|
-
* The object will be visually placed on the surface (the object's pivot will be ignored).
|
|
838
|
-
* @param obj the object to place on the surface
|
|
839
|
-
* @param point the point to place the object on
|
|
840
|
-
* @returns the offset from the object bounds to the pivot
|
|
841
|
-
*/
|
|
842
|
-
export function placeOnSurface(obj: Object3D, point: Vector3): PlaceOnSurfaceResult {
|
|
843
|
-
const bounds = getBoundingBox([obj]);
|
|
844
|
-
const center = new Vector3();
|
|
845
|
-
bounds.getCenter(center);
|
|
846
|
-
center.y = bounds.min.y;
|
|
847
|
-
const offset = point.clone().sub(center);
|
|
848
|
-
const worldPos = getWorldPosition(obj);
|
|
849
|
-
setWorldPosition(obj, worldPos.add(offset));
|
|
850
|
-
return {
|
|
851
|
-
offset,
|
|
852
|
-
bounds,
|
|
853
|
-
}
|
|
854
|
-
}
|
|
855
|
-
|
|
856
|
-
/**
|
|
857
|
-
* Postprocesses the material of an object loaded by {@link FBXLoader}.
|
|
858
|
-
* It will apply necessary color conversions, remap shininess to roughness, and turn everything into {@link MeshStandardMaterial} on the object.
|
|
859
|
-
* This ensures consistent lighting and shading, including environment effects.
|
|
860
|
-
*/
|
|
861
|
-
export function postprocessFBXMaterials(obj: Mesh, material: Material | Material[], index?: number, array?: Material[]): boolean {
|
|
862
|
-
|
|
863
|
-
if (Array.isArray(material)) {
|
|
864
|
-
let success = true;
|
|
865
|
-
for (let i = 0; i < material.length; i++) {
|
|
866
|
-
const res = postprocessFBXMaterials(obj, material[i], i, material);
|
|
867
|
-
if (!res) success = false;
|
|
868
|
-
}
|
|
869
|
-
return success;
|
|
870
|
-
}
|
|
871
|
-
|
|
872
|
-
// ignore if the material is already a MeshStandardMaterial
|
|
873
|
-
if (material.type === "MeshStandardMaterial" || material.type === "MeshBasicMaterial") {
|
|
874
|
-
return false;
|
|
875
|
-
}
|
|
876
|
-
// check if the material was already processed
|
|
877
|
-
else if (material["material:fbx"] != undefined) {
|
|
878
|
-
return true;
|
|
879
|
-
}
|
|
880
|
-
|
|
881
|
-
const newMaterial = new MeshStandardMaterial();
|
|
882
|
-
newMaterial["material:fbx"] = material;
|
|
883
|
-
|
|
884
|
-
const oldMaterial = material as any;
|
|
885
|
-
|
|
886
|
-
if (oldMaterial) {
|
|
887
|
-
// If a map is present then the FBX color should be ignored
|
|
888
|
-
// Tested e.g. in Unity and Substance Stager
|
|
889
|
-
// https://docs.unity3d.com/2020.1/Documentation/Manual/FBXImporter-Materials.html#:~:text=If%20a%20diffuse%20Texture%20is%20set%2C%20it%20ignores%20the%20diffuse%20color%20(this%20matches%20how%20it%20works%20in%20Autodesk®%20Maya®%20and%20Autodesk®%203ds%20Max®)
|
|
890
|
-
if (!oldMaterial.map)
|
|
891
|
-
newMaterial.color.copyLinearToSRGB(oldMaterial.color);
|
|
892
|
-
else newMaterial.color.set(1, 1, 1);
|
|
893
|
-
|
|
894
|
-
newMaterial.emissive.copyLinearToSRGB(oldMaterial.emissive);
|
|
895
|
-
|
|
896
|
-
newMaterial.emissiveIntensity = oldMaterial.emissiveIntensity;
|
|
897
|
-
newMaterial.opacity = oldMaterial.opacity;
|
|
898
|
-
newMaterial.displacementScale = oldMaterial.displacementScale;
|
|
899
|
-
newMaterial.transparent = oldMaterial.transparent;
|
|
900
|
-
newMaterial.bumpMap = oldMaterial.bumpMap;
|
|
901
|
-
newMaterial.aoMap = oldMaterial.aoMap;
|
|
902
|
-
newMaterial.map = oldMaterial.map;
|
|
903
|
-
newMaterial.displacementMap = oldMaterial.displacementMap;
|
|
904
|
-
newMaterial.emissiveMap = oldMaterial.emissiveMap;
|
|
905
|
-
newMaterial.normalMap = oldMaterial.normalMap;
|
|
906
|
-
newMaterial.envMap = oldMaterial.envMap;
|
|
907
|
-
newMaterial.alphaMap = oldMaterial.alphaMap;
|
|
908
|
-
newMaterial.metalness = oldMaterial.reflectivity;
|
|
909
|
-
newMaterial.vertexColors = oldMaterial.vertexColors;
|
|
910
|
-
if (oldMaterial.shininess) {
|
|
911
|
-
// from blender source code
|
|
912
|
-
// https://github.com/blender/blender-addons/blob/5e66092bcbe0df6855b3fa814b4826add8b01360/io_scene_fbx/import_fbx.py#L1442
|
|
913
|
-
// https://github.com/blender/blender-addons/blob/main/io_scene_fbx/import_fbx.py#L2060
|
|
914
|
-
newMaterial.roughness = 1.0 - (Math.sqrt(oldMaterial.shininess) / 10.0);
|
|
915
|
-
}
|
|
916
|
-
newMaterial.needsUpdate = true;
|
|
917
|
-
}
|
|
918
|
-
|
|
919
|
-
if (index === undefined) {
|
|
920
|
-
obj.material = newMaterial;
|
|
921
|
-
}
|
|
922
|
-
else {
|
|
923
|
-
array![index] = newMaterial;
|
|
924
|
-
}
|
|
925
|
-
return true;
|
|
926
|
-
}
|
|
927
|
-
|
|
928
|
-
|
|
1
|
+
import { AnimationAction, Box3, Box3Helper, Camera, Color, DepthTexture, Euler, GridHelper, Layers, Material, Mesh, MeshStandardMaterial, Object3D, OrthographicCamera, PerspectiveCamera, PlaneGeometry, Quaternion, Scene, ShadowMaterial, Texture, Uniform, Vector2Like, Vector3, WebGLRenderTarget } from "three";
|
|
2
|
+
import { ShaderMaterial, WebGLRenderer } from "three";
|
|
3
|
+
import { GroundedSkybox } from "three/examples/jsm/objects/GroundedSkybox.js";
|
|
4
|
+
|
|
5
|
+
import { useForAutoFit } from "./engine_camera.js";
|
|
6
|
+
import { Mathf } from "./engine_math.js"
|
|
7
|
+
import { Vec3 } from "./engine_types.js";
|
|
8
|
+
import { CircularBuffer } from "./engine_utils.js";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Slerp between two vectors
|
|
12
|
+
*/
|
|
13
|
+
export function slerp(vec: Vector3, end: Vector3, t: number) {
|
|
14
|
+
const len1 = vec.length();
|
|
15
|
+
const len2 = end.length();
|
|
16
|
+
const targetLen = Mathf.lerp(len1, len2, t);
|
|
17
|
+
return vec.lerp(end, t).normalize().multiplyScalar(targetLen);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const _tempQuat = new Quaternion();
|
|
21
|
+
const flipYQuat: Quaternion = new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), Math.PI);
|
|
22
|
+
|
|
23
|
+
export function lookAtInverse(obj: Object3D, target: Vector3) {
|
|
24
|
+
obj.lookAt(target);
|
|
25
|
+
obj.quaternion.multiply(flipYQuat);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
/** Better lookAt
|
|
30
|
+
* @param object the object that the lookAt should be applied to
|
|
31
|
+
* @param target the target to look at
|
|
32
|
+
* @param keepUpDirection if true the up direction will be kept
|
|
33
|
+
* @param copyTargetRotation if true the target rotation will be copied so the rotation is not skewed
|
|
34
|
+
*/
|
|
35
|
+
export function lookAtObject(object: Object3D, target: Object3D, keepUpDirection: boolean = true, copyTargetRotation: boolean = false) {
|
|
36
|
+
if (object === target) return;
|
|
37
|
+
_tempQuat.copy(object.quaternion);
|
|
38
|
+
|
|
39
|
+
const lookTarget = getWorldPosition(target);
|
|
40
|
+
const lookFrom = getWorldPosition(object);
|
|
41
|
+
|
|
42
|
+
if (copyTargetRotation) {
|
|
43
|
+
setWorldQuaternion(object, getWorldQuaternion(target));
|
|
44
|
+
// look at forward again so we don't get any roll
|
|
45
|
+
if (keepUpDirection) {
|
|
46
|
+
const ypos = lookFrom.y;
|
|
47
|
+
const forwardPoint = lookFrom.sub(getWorldDirection(object));
|
|
48
|
+
forwardPoint.y = ypos;
|
|
49
|
+
object.lookAt(forwardPoint);
|
|
50
|
+
object.quaternion.multiply(flipYQuat);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// sanitize – three.js sometimes returns NaN values when parents are non-uniformly scaled
|
|
54
|
+
if (Number.isNaN(object.quaternion.x)) {
|
|
55
|
+
object.quaternion.copy(_tempQuat);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if (keepUpDirection) {
|
|
62
|
+
lookTarget.y = lookFrom.y;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
object.lookAt(lookTarget);
|
|
66
|
+
|
|
67
|
+
// sanitize – three.js sometimes returns NaN values when parents are non-uniformly scaled
|
|
68
|
+
if (Number.isNaN(object.quaternion.x)) {
|
|
69
|
+
object.quaternion.copy(_tempQuat);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Look at a 2D point in screen space
|
|
76
|
+
* @param object the object to look at the point
|
|
77
|
+
* @param target the target point in 2D screen space XY e.g. from a mouse event
|
|
78
|
+
* @param camera the camera to use for the lookAt
|
|
79
|
+
* @param factor the factor to multiply the distance from the camera to the object. Default is 1
|
|
80
|
+
* @returns the target point in world space
|
|
81
|
+
*
|
|
82
|
+
* @example Needle Engine Component
|
|
83
|
+
* ```ts
|
|
84
|
+
* export class MyLookAtComponent extends Behaviour {
|
|
85
|
+
* update() {
|
|
86
|
+
* lookAtScreenPoint(this.gameObject, this.context.input.mousePosition, this.context.mainCamera);
|
|
87
|
+
* }
|
|
88
|
+
* }
|
|
89
|
+
* ```
|
|
90
|
+
*
|
|
91
|
+
* @example Look at from browser mouse move event
|
|
92
|
+
* ```ts
|
|
93
|
+
* window.addEventListener("mousemove", (e) => {
|
|
94
|
+
* lookAtScreenPoint(object, new Vector2(e.clientX, e.clientY), camera);
|
|
95
|
+
* });
|
|
96
|
+
* ```
|
|
97
|
+
*/
|
|
98
|
+
export function lookAtScreenPoint(object: Object3D, target: Vector2Like, camera: Camera, factor: number = 1): Vector3 | null {
|
|
99
|
+
|
|
100
|
+
if (camera) {
|
|
101
|
+
const pos = getTempVector(0, 0, 0);
|
|
102
|
+
const ndcx = (target.x / window.innerWidth) * 2 - 1;
|
|
103
|
+
const ndcy = -(target.y / window.innerHeight) * 2 + 1;
|
|
104
|
+
pos.set(
|
|
105
|
+
ndcx,
|
|
106
|
+
ndcy,
|
|
107
|
+
0
|
|
108
|
+
);
|
|
109
|
+
pos.unproject(camera);
|
|
110
|
+
// get distance from object to camera
|
|
111
|
+
const camPos = camera.worldPosition;
|
|
112
|
+
const dist = object.worldPosition.distanceTo(camPos);
|
|
113
|
+
// Create direction from camera through cursor point
|
|
114
|
+
const dir = pos.sub(camPos);
|
|
115
|
+
dir.multiplyScalar(factor * 3.6 * dist);
|
|
116
|
+
const targetPoint = camera.worldPosition.add(dir);
|
|
117
|
+
object.lookAt(targetPoint);
|
|
118
|
+
return targetPoint;
|
|
119
|
+
}
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
const _tempVecs = new CircularBuffer(() => new Vector3(), 100);
|
|
126
|
+
|
|
127
|
+
/** Gets a temporary vector. If a vector is passed in it will be copied to the temporary vector
|
|
128
|
+
* Temporary vectors are cached and reused internally. Don't store them!
|
|
129
|
+
* @param vec3 the vector to copy or the x value
|
|
130
|
+
* @param y the y value
|
|
131
|
+
* @param z the z value
|
|
132
|
+
* @returns a temporary vector
|
|
133
|
+
*
|
|
134
|
+
* @example
|
|
135
|
+
* ``` javascript
|
|
136
|
+
* const vec = getTempVector(1, 2, 3);
|
|
137
|
+
* const vec2 = getTempVector(vec);
|
|
138
|
+
* const vec3 = getTempVector(new Vector3(1, 2, 3));
|
|
139
|
+
* const vec4 = getTempVector(new DOMPointReadOnly(1, 2, 3));
|
|
140
|
+
* const vec5 = getTempVector();
|
|
141
|
+
* ```
|
|
142
|
+
*/
|
|
143
|
+
export function getTempVector(): Vector3;
|
|
144
|
+
export function getTempVector(vec3: Vector3): Vector3;
|
|
145
|
+
export function getTempVector(vec3: [number, number, number]): Vector3;
|
|
146
|
+
export function getTempVector(vec3: Vec3): Vector3;
|
|
147
|
+
export function getTempVector(dom: DOMPointReadOnly): Vector3;
|
|
148
|
+
export function getTempVector(x: number): Vector3;
|
|
149
|
+
export function getTempVector(x: number, y: number, z: number): Vector3;
|
|
150
|
+
export function getTempVector(vecOrX?: Vec3 | Vector3 | [number, number, number] | DOMPointReadOnly | number, y?: number, z?: number): Vector3 {
|
|
151
|
+
const vec = _tempVecs.get();
|
|
152
|
+
vec.set(0, 0, 0); // initialize with default values
|
|
153
|
+
if (vecOrX instanceof Vector3) vec.copy(vecOrX);
|
|
154
|
+
else if (Array.isArray(vecOrX)) vec.set(vecOrX[0], vecOrX[1], vecOrX[2]);
|
|
155
|
+
else if (vecOrX instanceof DOMPointReadOnly) vec.set(vecOrX.x, vecOrX.y, vecOrX.z);
|
|
156
|
+
else {
|
|
157
|
+
if (typeof vecOrX === "number") {
|
|
158
|
+
vec.x = vecOrX;
|
|
159
|
+
vec.y = y !== undefined ? y : vec.x;
|
|
160
|
+
vec.z = z !== undefined ? z : vec.x;
|
|
161
|
+
}
|
|
162
|
+
else if (typeof vecOrX === "object") {
|
|
163
|
+
vec.x = vecOrX.x;
|
|
164
|
+
vec.y = vecOrX.y;
|
|
165
|
+
vec.z = vecOrX.z;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return vec;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
const _tempColors = new CircularBuffer(() => new Color(), 30);
|
|
173
|
+
export function getTempColor(color?: Color) {
|
|
174
|
+
const col = _tempColors.get();
|
|
175
|
+
if (color) col.copy(color);
|
|
176
|
+
else {
|
|
177
|
+
col.set(0, 0, 0);
|
|
178
|
+
}
|
|
179
|
+
return col;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
const _tempQuats = new CircularBuffer(() => new Quaternion(), 100);
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Gets a temporary quaternion. If a quaternion is passed in it will be copied to the temporary quaternion
|
|
187
|
+
* Temporary quaternions are cached and reused internally. Don't store them!
|
|
188
|
+
* @param value the quaternion to copy
|
|
189
|
+
* @returns a temporary quaternion
|
|
190
|
+
*/
|
|
191
|
+
export function getTempQuaternion(value?: Quaternion | DOMPointReadOnly) {
|
|
192
|
+
const val = _tempQuats.get();
|
|
193
|
+
val.identity();
|
|
194
|
+
if (value instanceof Quaternion) val.copy(value);
|
|
195
|
+
else if (value instanceof DOMPointReadOnly) val.set(value.x, value.y, value.z, value.w);
|
|
196
|
+
return val;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
const _worldPositions = new CircularBuffer(() => new Vector3(), 100);
|
|
201
|
+
const _lastMatrixWorldUpdateKey = Symbol("lastMatrixWorldUpdateKey");
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Get the world position of an object
|
|
205
|
+
* @param obj the object to get the world position from
|
|
206
|
+
* @param vec a vector to store the result in. If not passed in a temporary vector will be used
|
|
207
|
+
* @param updateParents if true the parents will be updated before getting the world position
|
|
208
|
+
* @returns the world position
|
|
209
|
+
*/
|
|
210
|
+
export function getWorldPosition(obj: Object3D, vec: Vector3 | null = null, updateParents: boolean = true): Vector3 {
|
|
211
|
+
const wp = vec ?? _worldPositions.get();
|
|
212
|
+
if (!obj) return wp.set(0, 0, 0);
|
|
213
|
+
if (!obj.parent) return wp.copy(obj.position);
|
|
214
|
+
if (updateParents)
|
|
215
|
+
obj.updateWorldMatrix(true, false);
|
|
216
|
+
if (obj.matrixWorldNeedsUpdate && obj[_lastMatrixWorldUpdateKey] !== Date.now()) {
|
|
217
|
+
obj[_lastMatrixWorldUpdateKey] = Date.now();
|
|
218
|
+
obj.updateMatrixWorld();
|
|
219
|
+
}
|
|
220
|
+
wp.setFromMatrixPosition(obj.matrixWorld);
|
|
221
|
+
return wp;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Set the world position of an object
|
|
226
|
+
* @param obj the object to set the world position of
|
|
227
|
+
* @param val the world position to set
|
|
228
|
+
*/
|
|
229
|
+
export function setWorldPosition(obj: Object3D, val: Vector3): Object3D {
|
|
230
|
+
if (!obj) return obj;
|
|
231
|
+
const wp = _worldPositions.get();
|
|
232
|
+
if (val !== wp)
|
|
233
|
+
wp.copy(val);
|
|
234
|
+
const obj2 = obj?.parent ?? obj;
|
|
235
|
+
obj2.worldToLocal(wp);
|
|
236
|
+
obj.position.set(wp.x, wp.y, wp.z);
|
|
237
|
+
return obj;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Set the world position of an object
|
|
242
|
+
* @param obj the object to set the world position of
|
|
243
|
+
* @param x the x position
|
|
244
|
+
* @param y the y position
|
|
245
|
+
* @param z the z position
|
|
246
|
+
*/
|
|
247
|
+
export function setWorldPositionXYZ(obj: Object3D, x: number, y: number, z: number): Object3D {
|
|
248
|
+
const wp = _worldPositions.get();
|
|
249
|
+
wp.set(x, y, z);
|
|
250
|
+
setWorldPosition(obj, wp);
|
|
251
|
+
return obj;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
const _worldQuaternions = new CircularBuffer(() => new Quaternion(), 100);
|
|
256
|
+
const _worldQuaternionBuffer: Quaternion = new Quaternion();
|
|
257
|
+
const _tempQuaternionBuffer2: Quaternion = new Quaternion();
|
|
258
|
+
|
|
259
|
+
export function getWorldQuaternion(obj: Object3D, target: Quaternion | null = null): Quaternion {
|
|
260
|
+
if (!obj) return _worldQuaternions.get().identity();
|
|
261
|
+
const quat = target ?? _worldQuaternions.get();
|
|
262
|
+
if (!obj.parent) return quat.copy(obj.quaternion);
|
|
263
|
+
obj.getWorldQuaternion(quat);
|
|
264
|
+
return quat;
|
|
265
|
+
}
|
|
266
|
+
export function setWorldQuaternion(obj: Object3D, val: Quaternion) {
|
|
267
|
+
if (!obj) return;
|
|
268
|
+
if (val !== _worldQuaternionBuffer)
|
|
269
|
+
_worldQuaternionBuffer.copy(val);
|
|
270
|
+
const tempVec = _worldQuaternionBuffer;
|
|
271
|
+
const parent = obj?.parent;
|
|
272
|
+
parent?.getWorldQuaternion(_tempQuaternionBuffer2);
|
|
273
|
+
_tempQuaternionBuffer2.invert();
|
|
274
|
+
const q = _tempQuaternionBuffer2.multiply(tempVec);
|
|
275
|
+
// console.log(tempVec);
|
|
276
|
+
obj.quaternion.set(q.x, q.y, q.z, q.w);
|
|
277
|
+
// console.error("quaternion world to local is not yet implemented");
|
|
278
|
+
}
|
|
279
|
+
export function setWorldQuaternionXYZW(obj: Object3D, x: number, y: number, z: number, w: number) {
|
|
280
|
+
_worldQuaternionBuffer.set(x, y, z, w);
|
|
281
|
+
setWorldQuaternion(obj, _worldQuaternionBuffer);
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
const _worldScaleBuffer = new CircularBuffer(() => new Vector3(), 100);
|
|
285
|
+
const _worldScale: Vector3 = new Vector3();
|
|
286
|
+
|
|
287
|
+
export function getWorldScale(obj: Object3D, vec: Vector3 | null = null): Vector3 {
|
|
288
|
+
if (!vec)
|
|
289
|
+
vec = _worldScaleBuffer.get();
|
|
290
|
+
if (!obj) return vec.set(0, 0, 0);
|
|
291
|
+
if (!obj.parent) return vec.copy(obj.scale);
|
|
292
|
+
obj.getWorldScale(vec);
|
|
293
|
+
return vec;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
export function setWorldScale(obj: Object3D, vec: Vector3) {
|
|
297
|
+
if (!obj) return;
|
|
298
|
+
if (!obj.parent) {
|
|
299
|
+
obj.scale.copy(vec);
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
const tempVec = _worldScale;
|
|
303
|
+
const obj2 = obj.parent;
|
|
304
|
+
obj2.getWorldScale(tempVec);
|
|
305
|
+
obj.scale.copy(vec);
|
|
306
|
+
obj.scale.divide(tempVec);
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
const _forward = new Vector3();
|
|
310
|
+
const _forwardQuat = new Quaternion();
|
|
311
|
+
export function forward(obj: Object3D): Vector3 {
|
|
312
|
+
getWorldQuaternion(obj, _forwardQuat);
|
|
313
|
+
return _forward.set(0, 0, 1).applyQuaternion(_forwardQuat);
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
const _worldDirectionBuffer = new CircularBuffer(() => new Vector3(), 100);
|
|
317
|
+
const _worldDirectionQuat = new Quaternion();
|
|
318
|
+
/** Get the world direction. Returns world forward if nothing is passed in.
|
|
319
|
+
* Pass in a relative direction to get it converted to world space (e.g. dir = new Vector3(0, 1, 1))
|
|
320
|
+
* The returned vector will not be normalized
|
|
321
|
+
*/
|
|
322
|
+
export function getWorldDirection(obj: Object3D, dir?: Vector3) {
|
|
323
|
+
// If no direction is passed in set the direction to the forward vector
|
|
324
|
+
if (!dir) dir = _worldDirectionBuffer.get().set(0, 0, 1);
|
|
325
|
+
getWorldQuaternion(obj, _worldDirectionQuat);
|
|
326
|
+
return dir.applyQuaternion(_worldDirectionQuat);
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
|
|
330
|
+
const _worldEulerBuffer: Euler = new Euler();
|
|
331
|
+
const _worldEuler: Euler = new Euler();
|
|
332
|
+
const _worldRotation: Vector3 = new Vector3();
|
|
333
|
+
|
|
334
|
+
|
|
335
|
+
|
|
336
|
+
// world euler (in radians)
|
|
337
|
+
export function getWorldEuler(obj: Object3D): Euler {
|
|
338
|
+
const quat = _worldQuaternions.get();
|
|
339
|
+
obj.getWorldQuaternion(quat);
|
|
340
|
+
_worldEuler.setFromQuaternion(quat);
|
|
341
|
+
return _worldEuler;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
// world euler (in radians)
|
|
345
|
+
export function setWorldEuler(obj: Object3D, val: Euler) {
|
|
346
|
+
const quat = _worldQuaternions.get();
|
|
347
|
+
setWorldQuaternion(obj, quat.setFromEuler(val));;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
// returns rotation in degrees
|
|
351
|
+
export function getWorldRotation(obj: Object3D): Vector3 {
|
|
352
|
+
const rot = getWorldEuler(obj);
|
|
353
|
+
const wr = _worldRotation;
|
|
354
|
+
wr.set(rot.x, rot.y, rot.z);
|
|
355
|
+
wr.x = Mathf.toDegrees(wr.x);
|
|
356
|
+
wr.y = Mathf.toDegrees(wr.y);
|
|
357
|
+
wr.z = Mathf.toDegrees(wr.z);
|
|
358
|
+
return wr;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
export function setWorldRotation(obj: Object3D, val: Vector3) {
|
|
362
|
+
setWorldRotationXYZ(obj, val.x, val.y, val.z, true);
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
export function setWorldRotationXYZ(obj: Object3D, x: number, y: number, z: number, degrees: boolean = true) {
|
|
366
|
+
if (degrees) {
|
|
367
|
+
x = Mathf.toRadians(x);
|
|
368
|
+
y = Mathf.toRadians(y);
|
|
369
|
+
z = Mathf.toRadians(z);
|
|
370
|
+
}
|
|
371
|
+
_worldEulerBuffer.set(x, y, z);
|
|
372
|
+
_worldQuaternionBuffer.setFromEuler(_worldEulerBuffer);
|
|
373
|
+
setWorldQuaternion(obj, _worldQuaternionBuffer);
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
|
|
377
|
+
|
|
378
|
+
|
|
379
|
+
|
|
380
|
+
// from https://github.com/mrdoob/js/pull/10995#issuecomment-287614722
|
|
381
|
+
export function logHierarchy(root: Object3D | null | undefined, collapsible: boolean = true) {
|
|
382
|
+
if (!root) return;
|
|
383
|
+
if (collapsible) {
|
|
384
|
+
(function printGraph(obj: Object3D) {
|
|
385
|
+
console.groupCollapsed((obj.name ? obj.name : '(no name : ' + obj.type + ')') + ' %o', obj);
|
|
386
|
+
obj.children.forEach(printGraph);
|
|
387
|
+
console.groupEnd();
|
|
388
|
+
}(root));
|
|
389
|
+
|
|
390
|
+
} else {
|
|
391
|
+
root.traverse(function (obj: Object3D) {
|
|
392
|
+
var s = '|___';
|
|
393
|
+
var obj2 = obj;
|
|
394
|
+
while (obj2.parent !== null) {
|
|
395
|
+
s = '\t' + s;
|
|
396
|
+
obj2 = obj2.parent;
|
|
397
|
+
}
|
|
398
|
+
console.log(s + obj.name + ' <' + obj.type + '>');
|
|
399
|
+
});
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
export function getParentHierarchyPath(obj: Object3D): string {
|
|
404
|
+
let path = obj?.name || "";
|
|
405
|
+
if (!obj) return path;
|
|
406
|
+
let parent = obj.parent;
|
|
407
|
+
while (parent) {
|
|
408
|
+
path = parent.name + "/" + path;
|
|
409
|
+
parent = parent.parent;
|
|
410
|
+
}
|
|
411
|
+
return path;
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
|
|
415
|
+
export function isAnimationAction(obj: object) {
|
|
416
|
+
if (obj) {
|
|
417
|
+
// this doesnt work :(
|
|
418
|
+
// return obj instanceof AnimationAction;
|
|
419
|
+
// instead we do this:
|
|
420
|
+
const act = obj as AnimationAction;
|
|
421
|
+
return act.blendMode !== undefined && act.clampWhenFinished !== undefined && act.enabled !== undefined && act.fadeIn !== undefined && act.getClip !== undefined;
|
|
422
|
+
}
|
|
423
|
+
return false;
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
|
|
427
|
+
|
|
428
|
+
|
|
429
|
+
class BlitMaterial extends ShaderMaterial {
|
|
430
|
+
static vertex = `
|
|
431
|
+
varying vec2 vUv;
|
|
432
|
+
void main(){
|
|
433
|
+
vUv = uv;
|
|
434
|
+
gl_Position = vec4(position.xy, 0., 1.0);
|
|
435
|
+
}`;
|
|
436
|
+
|
|
437
|
+
constructor() {
|
|
438
|
+
super({
|
|
439
|
+
vertexShader: BlitMaterial.vertex,
|
|
440
|
+
uniforms: {
|
|
441
|
+
map: new Uniform(null),
|
|
442
|
+
flipY: new Uniform(true),
|
|
443
|
+
writeDepth: new Uniform(false),
|
|
444
|
+
depthTexture: new Uniform(null)
|
|
445
|
+
},
|
|
446
|
+
fragmentShader: `
|
|
447
|
+
uniform sampler2D map;
|
|
448
|
+
uniform bool flipY;
|
|
449
|
+
uniform bool writeDepth;
|
|
450
|
+
uniform sampler2D depthTexture;
|
|
451
|
+
|
|
452
|
+
varying vec2 vUv;
|
|
453
|
+
|
|
454
|
+
void main(){
|
|
455
|
+
vec2 uv = vUv;
|
|
456
|
+
if (flipY) uv.y = 1.0 - uv.y;
|
|
457
|
+
gl_FragColor = texture2D(map, uv);
|
|
458
|
+
|
|
459
|
+
if (writeDepth) {
|
|
460
|
+
float depth = texture2D(depthTexture, uv).r;
|
|
461
|
+
gl_FragDepth = depth;
|
|
462
|
+
|
|
463
|
+
// float linearDepth = (depth - 0.99) * 100.0; // Enhance near 1.0 values
|
|
464
|
+
// gl_FragColor = vec4(linearDepth, linearDepth, linearDepth, 1.0);
|
|
465
|
+
}
|
|
466
|
+
}`
|
|
467
|
+
});
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
reset() {
|
|
471
|
+
this.uniforms.map.value = null;
|
|
472
|
+
this.uniforms.flipY.value = true;
|
|
473
|
+
this.uniforms.writeDepth.value = false;
|
|
474
|
+
this.uniforms.depthTexture.value = null;
|
|
475
|
+
this.needsUpdate = true;
|
|
476
|
+
this.uniformsNeedUpdate = true;
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
/**
|
|
481
|
+
* Utility class to perform various graphics operations like copying textures to canvas
|
|
482
|
+
*/
|
|
483
|
+
export class Graphics {
|
|
484
|
+
private static readonly planeGeometry = new PlaneGeometry(2, 2, 1, 1);
|
|
485
|
+
private static readonly renderer: WebGLRenderer = new WebGLRenderer({ antialias: false, alpha: true });
|
|
486
|
+
private static readonly perspectiveCam = new PerspectiveCamera();
|
|
487
|
+
private static readonly orthographicCam = new OrthographicCamera();
|
|
488
|
+
private static readonly scene = new Scene();
|
|
489
|
+
private static readonly blitMaterial: BlitMaterial = new BlitMaterial();
|
|
490
|
+
private static readonly mesh: Mesh = new Mesh(Graphics.planeGeometry, Graphics.blitMaterial);
|
|
491
|
+
|
|
492
|
+
|
|
493
|
+
/**
|
|
494
|
+
* Copy a texture to a new texture
|
|
495
|
+
* @param texture the texture to copy
|
|
496
|
+
* @param blitMaterial the material to use for copying (optional)
|
|
497
|
+
* @returns the newly created, copied texture
|
|
498
|
+
*/
|
|
499
|
+
static copyTexture(texture: Texture, blitMaterial?: ShaderMaterial): Texture {
|
|
500
|
+
|
|
501
|
+
// ensure that a blit material exists
|
|
502
|
+
if (!blitMaterial) {
|
|
503
|
+
blitMaterial = this.blitMaterial;
|
|
504
|
+
};
|
|
505
|
+
this.blitMaterial.reset();
|
|
506
|
+
|
|
507
|
+
const material = blitMaterial || this.blitMaterial;
|
|
508
|
+
|
|
509
|
+
// TODO: reset the uniforms...
|
|
510
|
+
material.uniforms.map.value = texture;
|
|
511
|
+
material.needsUpdate = true;
|
|
512
|
+
material.uniformsNeedUpdate = true;
|
|
513
|
+
|
|
514
|
+
|
|
515
|
+
// ensure that the blit material has the correct vertex shader
|
|
516
|
+
const origVertexShader = material.vertexShader;
|
|
517
|
+
material.vertexShader = BlitMaterial.vertex;
|
|
518
|
+
|
|
519
|
+
const mesh = this.mesh;
|
|
520
|
+
mesh.material = material;
|
|
521
|
+
mesh.frustumCulled = false;
|
|
522
|
+
this.scene.children.length = 0;
|
|
523
|
+
this.scene.add(mesh);
|
|
524
|
+
this.renderer.setSize(texture.image.width, texture.image.height);
|
|
525
|
+
this.renderer.clear();
|
|
526
|
+
this.renderer.render(this.scene, this.perspectiveCam);
|
|
527
|
+
const tex = new Texture(this.renderer.domElement);
|
|
528
|
+
tex.name = "Copy";
|
|
529
|
+
tex.needsUpdate = true; // < important!
|
|
530
|
+
|
|
531
|
+
// reset vertex shader
|
|
532
|
+
material.vertexShader = origVertexShader;
|
|
533
|
+
|
|
534
|
+
return tex;
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
static blit(src: Texture, target: WebGLRenderTarget, options?: {
|
|
538
|
+
renderer?: WebGLRenderer,
|
|
539
|
+
blitMaterial?: ShaderMaterial,
|
|
540
|
+
flipY?: boolean,
|
|
541
|
+
depthTexture?: DepthTexture | null,
|
|
542
|
+
depthTest?: boolean,
|
|
543
|
+
depthWrite?: boolean,
|
|
544
|
+
}) {
|
|
545
|
+
const {
|
|
546
|
+
renderer = this.renderer,
|
|
547
|
+
blitMaterial = this.blitMaterial,
|
|
548
|
+
flipY = false,
|
|
549
|
+
depthTexture = null,
|
|
550
|
+
depthTest = true,
|
|
551
|
+
depthWrite = true,
|
|
552
|
+
} = options || {};
|
|
553
|
+
|
|
554
|
+
this.blitMaterial.reset();
|
|
555
|
+
|
|
556
|
+
if (blitMaterial.uniforms.map) blitMaterial.uniforms.map.value = src;
|
|
557
|
+
if (blitMaterial.uniforms.flipY) blitMaterial.uniforms.flipY.value = flipY;
|
|
558
|
+
|
|
559
|
+
if (depthTexture) {
|
|
560
|
+
blitMaterial.uniforms.writeDepth = new Uniform(true);
|
|
561
|
+
blitMaterial.uniforms.depthTexture.value = depthTexture;
|
|
562
|
+
}
|
|
563
|
+
else {
|
|
564
|
+
blitMaterial.uniforms.writeDepth = new Uniform(false);
|
|
565
|
+
blitMaterial.uniforms.depthTexture.value = null;
|
|
566
|
+
}
|
|
567
|
+
blitMaterial.needsUpdate = true;
|
|
568
|
+
blitMaterial.uniformsNeedUpdate = true;
|
|
569
|
+
|
|
570
|
+
const mesh = this.mesh;
|
|
571
|
+
mesh.material = blitMaterial;
|
|
572
|
+
mesh.frustumCulled = false;
|
|
573
|
+
this.scene.children.length = 0;
|
|
574
|
+
this.scene.add(mesh);
|
|
575
|
+
|
|
576
|
+
// Save state
|
|
577
|
+
const renderTarget = renderer.getRenderTarget();
|
|
578
|
+
const gl = renderer.getContext();
|
|
579
|
+
const depthTestEnabled = gl.getParameter(gl.DEPTH_TEST);
|
|
580
|
+
const depthWriteMask = gl.getParameter(gl.DEPTH_WRITEMASK);
|
|
581
|
+
const depthFunc = gl.getParameter(gl.DEPTH_FUNC);
|
|
582
|
+
|
|
583
|
+
|
|
584
|
+
// Set state
|
|
585
|
+
if (depthTest) renderer.getContext().enable(renderer.getContext().DEPTH_TEST);
|
|
586
|
+
else renderer.getContext().disable(renderer.getContext().DEPTH_TEST);
|
|
587
|
+
renderer.state.buffers.depth.setMask(depthWrite);
|
|
588
|
+
|
|
589
|
+
renderer.setClearColor(new Color(0, 0, 0), 0);
|
|
590
|
+
// renderer.setSize(target.width, target.height);
|
|
591
|
+
renderer.setPixelRatio(window.devicePixelRatio);
|
|
592
|
+
renderer.setRenderTarget(target);
|
|
593
|
+
renderer.clear();
|
|
594
|
+
renderer.render(this.scene, this.perspectiveCam);
|
|
595
|
+
|
|
596
|
+
|
|
597
|
+
// Restore state
|
|
598
|
+
renderer.setRenderTarget(renderTarget); // reset render target
|
|
599
|
+
const depthBuffer = renderer.state.buffers.depth;
|
|
600
|
+
depthBuffer.setTest(depthTestEnabled);
|
|
601
|
+
depthBuffer.setMask(depthWriteMask);
|
|
602
|
+
depthBuffer.setFunc(depthFunc);
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
/**
|
|
606
|
+
* Copy a texture to a HTMLCanvasElement
|
|
607
|
+
* @param texture the texture convert
|
|
608
|
+
* @param force if true the texture will be copied to a new texture before converting
|
|
609
|
+
* @returns the HTMLCanvasElement with the texture or null if the texture could not be copied
|
|
610
|
+
*/
|
|
611
|
+
static textureToCanvas(texture: Texture, force: boolean = false): HTMLCanvasElement | null {
|
|
612
|
+
if (!texture) {
|
|
613
|
+
return null;
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
if (force === true || texture["isCompressedTexture"] === true) {
|
|
617
|
+
texture = copyTexture(texture);
|
|
618
|
+
}
|
|
619
|
+
const image = texture.image;
|
|
620
|
+
if (isImageBitmap(image)) {
|
|
621
|
+
const canvas = document.createElement('canvas');
|
|
622
|
+
canvas.width = image.width;
|
|
623
|
+
canvas.height = image.height;
|
|
624
|
+
|
|
625
|
+
const context = canvas.getContext('2d');
|
|
626
|
+
if (!context) {
|
|
627
|
+
console.error("Failed getting canvas 2d context");
|
|
628
|
+
return null;
|
|
629
|
+
}
|
|
630
|
+
context.drawImage(image, 0, 0, image.width, image.height, 0, 0, canvas.width, canvas.height);
|
|
631
|
+
return canvas;
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
return null;
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
/**@obsolete use Graphics.copyTexture */
|
|
639
|
+
export function copyTexture(texture: Texture): Texture {
|
|
640
|
+
return Graphics.copyTexture(texture);
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
/**@obsolete use Graphics.textureToCanvas */
|
|
644
|
+
export function textureToCanvas(texture: Texture, force: boolean = false): HTMLCanvasElement | null {
|
|
645
|
+
return Graphics.textureToCanvas(texture, force);
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
declare class OffscreenCanvas { };
|
|
649
|
+
|
|
650
|
+
function isImageBitmap(image) {
|
|
651
|
+
return (typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement) ||
|
|
652
|
+
(typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement) ||
|
|
653
|
+
(typeof OffscreenCanvas !== 'undefined' && image instanceof OffscreenCanvas) ||
|
|
654
|
+
(typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap);
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
|
|
658
|
+
|
|
659
|
+
function isMesh(obj: Object3D): obj is Mesh {
|
|
660
|
+
const type = obj.type;
|
|
661
|
+
// Note: we don't use the instanceof check here because it's unreliable in certain minification scenarios where it returns false
|
|
662
|
+
return type === "Mesh" || type === "SkinnedMesh";
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
// for contact shadows
|
|
666
|
+
export function setVisibleInCustomShadowRendering(obj: Object3D, enabled: boolean) {
|
|
667
|
+
if (enabled)
|
|
668
|
+
obj["needle:rendercustomshadow"] = true;
|
|
669
|
+
else {
|
|
670
|
+
obj["needle:rendercustomshadow"] = false;
|
|
671
|
+
}
|
|
672
|
+
}
|
|
673
|
+
export function getVisibleInCustomShadowRendering(obj: Object3D): boolean {
|
|
674
|
+
if (obj) {
|
|
675
|
+
if (obj["needle:rendercustomshadow"] === true) {
|
|
676
|
+
return true;
|
|
677
|
+
}
|
|
678
|
+
else if (obj["needle:rendercustomshadow"] == undefined) {
|
|
679
|
+
return true;
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
return false;
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
/**
|
|
686
|
+
* Get the axis-aligned bounding box of a list of objects.
|
|
687
|
+
* @param objects The objects to get the bounding box from.
|
|
688
|
+
* @param ignore Objects to ignore when calculating the bounding box. Objects that are invisible (gizmos, helpers, etc.) are excluded by default.
|
|
689
|
+
* @param layers The layers to include. Typically the main camera's layers.
|
|
690
|
+
* @param result The result box to store the bounding box in. Returns a new box if not passed in.
|
|
691
|
+
*/
|
|
692
|
+
export function getBoundingBox(objects: Object3D | Object3D[], ignore: ((obj: Object3D) => void | boolean) | Array<Object3D | null | undefined> | undefined = undefined, layers: Layers | undefined | null = undefined, result: Box3 | undefined = undefined): Box3 {
|
|
693
|
+
const box = result || new Box3();
|
|
694
|
+
box.makeEmpty();
|
|
695
|
+
|
|
696
|
+
const emptyChildren = [];
|
|
697
|
+
function expandByObjectRecursive(obj: Object3D) {
|
|
698
|
+
let allowExpanding = true;
|
|
699
|
+
// we dont want to check invisible objects
|
|
700
|
+
if (!obj.visible) return;
|
|
701
|
+
if (useForAutoFit(obj) === false) return;
|
|
702
|
+
if (obj.type === "TransformControlsGizmo" || obj.type === "TransformControlsPlane") return;
|
|
703
|
+
// ignore Box3Helpers
|
|
704
|
+
if (obj instanceof Box3Helper) allowExpanding = false;
|
|
705
|
+
if (obj instanceof GridHelper) allowExpanding = false;
|
|
706
|
+
// ignore GroundProjectedEnv
|
|
707
|
+
if (obj instanceof GroundedSkybox) allowExpanding = false;
|
|
708
|
+
if ((obj as any).isGizmo === true) allowExpanding = false;
|
|
709
|
+
// // Ignore shadow catcher geometry
|
|
710
|
+
if ((obj as Mesh).material instanceof ShadowMaterial) allowExpanding = false;
|
|
711
|
+
// ONLY fit meshes
|
|
712
|
+
if (!(isMesh(obj))) allowExpanding = false;
|
|
713
|
+
// Layer test, typically with the main camera
|
|
714
|
+
if (layers && obj.layers.test(layers) === false) allowExpanding = false;
|
|
715
|
+
if (allowExpanding) {
|
|
716
|
+
// Ignore things parented to the camera + ignore the camera
|
|
717
|
+
if (ignore && Array.isArray(ignore) && ignore?.includes(obj)) return;
|
|
718
|
+
else if (typeof ignore === "function") {
|
|
719
|
+
if (ignore(obj) === true) return;
|
|
720
|
+
}
|
|
721
|
+
}
|
|
722
|
+
// We don't want to fit UI objects
|
|
723
|
+
if (obj["isUI"] === true) return;
|
|
724
|
+
// If we encountered some geometry that should be ignored
|
|
725
|
+
// Then we don't want to use that for expanding the view
|
|
726
|
+
if (allowExpanding) {
|
|
727
|
+
// Temporary override children
|
|
728
|
+
const children = obj.children;
|
|
729
|
+
obj.children = emptyChildren;
|
|
730
|
+
// TODO: validate that object doesn't contain NaN values
|
|
731
|
+
const pos = obj.position;
|
|
732
|
+
const scale = obj.scale;
|
|
733
|
+
if (Number.isNaN(pos.x) || Number.isNaN(pos.y) || Number.isNaN(pos.z)) {
|
|
734
|
+
console.warn(`Object \"${obj.name}\" has NaN values in position or scale.... will ignore it`, pos, scale);
|
|
735
|
+
return;
|
|
736
|
+
}
|
|
737
|
+
// Sanitize for the three.js method that only checks for undefined here
|
|
738
|
+
// @ts-ignore
|
|
739
|
+
if (obj.geometry === null) obj.geometry = undefined;
|
|
740
|
+
box.expandByObject(obj, true);
|
|
741
|
+
obj.children = children;
|
|
742
|
+
}
|
|
743
|
+
for (const child of obj.children) {
|
|
744
|
+
expandByObjectRecursive(child);
|
|
745
|
+
}
|
|
746
|
+
}
|
|
747
|
+
let hasAnyObject = false;
|
|
748
|
+
|
|
749
|
+
if (!Array.isArray(objects))
|
|
750
|
+
objects = [objects];
|
|
751
|
+
|
|
752
|
+
for (const object of objects) {
|
|
753
|
+
if (!object) continue;
|
|
754
|
+
hasAnyObject = true;
|
|
755
|
+
object.updateMatrixWorld();
|
|
756
|
+
expandByObjectRecursive(object);
|
|
757
|
+
}
|
|
758
|
+
if (!hasAnyObject) {
|
|
759
|
+
console.warn("No objects to fit camera to...");
|
|
760
|
+
return box;
|
|
761
|
+
}
|
|
762
|
+
|
|
763
|
+
return box;
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
/**
|
|
767
|
+
* Fits an object into a bounding volume. The volume is defined by a Box3 in world space.
|
|
768
|
+
* @param obj the object to fit
|
|
769
|
+
* @param volume the volume to fit the object into
|
|
770
|
+
* @param opts options for fitting
|
|
771
|
+
*/
|
|
772
|
+
export function fitObjectIntoVolume(obj: Object3D, volume: Box3, opts?: {
|
|
773
|
+
/** Objects to ignore when calculating the obj's bounding box */
|
|
774
|
+
ignore?: Object3D[],
|
|
775
|
+
/** when `true` aligns the objects position to the volume ground
|
|
776
|
+
* @default true
|
|
777
|
+
*/
|
|
778
|
+
position?: boolean
|
|
779
|
+
/** when `true` scales the object to fit the volume
|
|
780
|
+
* @default true
|
|
781
|
+
*/
|
|
782
|
+
scale?: boolean,
|
|
783
|
+
}): {
|
|
784
|
+
/** The object's bounding box before fitting */
|
|
785
|
+
boundsBefore: Box3,
|
|
786
|
+
/** The scale that was applied to the object */
|
|
787
|
+
scale: Vector3,
|
|
788
|
+
} {
|
|
789
|
+
const box = getBoundingBox([obj], opts?.ignore);
|
|
790
|
+
|
|
791
|
+
const boundsSize = new Vector3();
|
|
792
|
+
box.getSize(boundsSize);
|
|
793
|
+
const boundsCenter = new Vector3();
|
|
794
|
+
box.getCenter(boundsCenter);
|
|
795
|
+
|
|
796
|
+
const targetSize = new Vector3();
|
|
797
|
+
volume.getSize(targetSize);
|
|
798
|
+
const targetCenter = new Vector3();
|
|
799
|
+
volume.getCenter(targetCenter);
|
|
800
|
+
|
|
801
|
+
const scale = new Vector3();
|
|
802
|
+
scale.set(targetSize.x / boundsSize.x, targetSize.y / boundsSize.y, targetSize.z / boundsSize.z);
|
|
803
|
+
const minScale = Math.min(scale.x, scale.y, scale.z);
|
|
804
|
+
const useScale = opts?.scale !== false;
|
|
805
|
+
if (useScale) {
|
|
806
|
+
setWorldScale(obj, getWorldScale(obj).multiplyScalar(minScale));
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
if (opts?.position !== false) {
|
|
810
|
+
const boundsBottomPosition = new Vector3();
|
|
811
|
+
box.getCenter(boundsBottomPosition);
|
|
812
|
+
boundsBottomPosition.y = box.min.y;
|
|
813
|
+
const targetBottomPosition = new Vector3();
|
|
814
|
+
volume.getCenter(targetBottomPosition);
|
|
815
|
+
targetBottomPosition.y = volume.min.y;
|
|
816
|
+
const offset = targetBottomPosition.clone().sub(boundsBottomPosition);
|
|
817
|
+
if (useScale) offset.multiplyScalar(minScale);
|
|
818
|
+
setWorldPosition(obj, getWorldPosition(obj).add(offset));
|
|
819
|
+
}
|
|
820
|
+
|
|
821
|
+
return {
|
|
822
|
+
boundsBefore: box,
|
|
823
|
+
scale,
|
|
824
|
+
}
|
|
825
|
+
}
|
|
826
|
+
|
|
827
|
+
|
|
828
|
+
declare type PlaceOnSurfaceResult = {
|
|
829
|
+
/** The offset from the object bounds to the pivot */
|
|
830
|
+
offset: Vector3,
|
|
831
|
+
/** The object's bounding box */
|
|
832
|
+
bounds: Box3
|
|
833
|
+
}
|
|
834
|
+
|
|
835
|
+
/**
|
|
836
|
+
* Place an object on a surface. This will calculate the object bounds which might be an expensive operation for complex objects.
|
|
837
|
+
* The object will be visually placed on the surface (the object's pivot will be ignored).
|
|
838
|
+
* @param obj the object to place on the surface
|
|
839
|
+
* @param point the point to place the object on
|
|
840
|
+
* @returns the offset from the object bounds to the pivot
|
|
841
|
+
*/
|
|
842
|
+
export function placeOnSurface(obj: Object3D, point: Vector3): PlaceOnSurfaceResult {
|
|
843
|
+
const bounds = getBoundingBox([obj]);
|
|
844
|
+
const center = new Vector3();
|
|
845
|
+
bounds.getCenter(center);
|
|
846
|
+
center.y = bounds.min.y;
|
|
847
|
+
const offset = point.clone().sub(center);
|
|
848
|
+
const worldPos = getWorldPosition(obj);
|
|
849
|
+
setWorldPosition(obj, worldPos.add(offset));
|
|
850
|
+
return {
|
|
851
|
+
offset,
|
|
852
|
+
bounds,
|
|
853
|
+
}
|
|
854
|
+
}
|
|
855
|
+
|
|
856
|
+
/**
|
|
857
|
+
* Postprocesses the material of an object loaded by {@link FBXLoader}.
|
|
858
|
+
* It will apply necessary color conversions, remap shininess to roughness, and turn everything into {@link MeshStandardMaterial} on the object.
|
|
859
|
+
* This ensures consistent lighting and shading, including environment effects.
|
|
860
|
+
*/
|
|
861
|
+
export function postprocessFBXMaterials(obj: Mesh, material: Material | Material[], index?: number, array?: Material[]): boolean {
|
|
862
|
+
|
|
863
|
+
if (Array.isArray(material)) {
|
|
864
|
+
let success = true;
|
|
865
|
+
for (let i = 0; i < material.length; i++) {
|
|
866
|
+
const res = postprocessFBXMaterials(obj, material[i], i, material);
|
|
867
|
+
if (!res) success = false;
|
|
868
|
+
}
|
|
869
|
+
return success;
|
|
870
|
+
}
|
|
871
|
+
|
|
872
|
+
// ignore if the material is already a MeshStandardMaterial
|
|
873
|
+
if (material.type === "MeshStandardMaterial" || material.type === "MeshBasicMaterial") {
|
|
874
|
+
return false;
|
|
875
|
+
}
|
|
876
|
+
// check if the material was already processed
|
|
877
|
+
else if (material["material:fbx"] != undefined) {
|
|
878
|
+
return true;
|
|
879
|
+
}
|
|
880
|
+
|
|
881
|
+
const newMaterial = new MeshStandardMaterial();
|
|
882
|
+
newMaterial["material:fbx"] = material;
|
|
883
|
+
|
|
884
|
+
const oldMaterial = material as any;
|
|
885
|
+
|
|
886
|
+
if (oldMaterial) {
|
|
887
|
+
// If a map is present then the FBX color should be ignored
|
|
888
|
+
// Tested e.g. in Unity and Substance Stager
|
|
889
|
+
// https://docs.unity3d.com/2020.1/Documentation/Manual/FBXImporter-Materials.html#:~:text=If%20a%20diffuse%20Texture%20is%20set%2C%20it%20ignores%20the%20diffuse%20color%20(this%20matches%20how%20it%20works%20in%20Autodesk®%20Maya®%20and%20Autodesk®%203ds%20Max®)
|
|
890
|
+
if (!oldMaterial.map)
|
|
891
|
+
newMaterial.color.copyLinearToSRGB(oldMaterial.color);
|
|
892
|
+
else newMaterial.color.set(1, 1, 1);
|
|
893
|
+
|
|
894
|
+
newMaterial.emissive.copyLinearToSRGB(oldMaterial.emissive);
|
|
895
|
+
|
|
896
|
+
newMaterial.emissiveIntensity = oldMaterial.emissiveIntensity;
|
|
897
|
+
newMaterial.opacity = oldMaterial.opacity;
|
|
898
|
+
newMaterial.displacementScale = oldMaterial.displacementScale;
|
|
899
|
+
newMaterial.transparent = oldMaterial.transparent;
|
|
900
|
+
newMaterial.bumpMap = oldMaterial.bumpMap;
|
|
901
|
+
newMaterial.aoMap = oldMaterial.aoMap;
|
|
902
|
+
newMaterial.map = oldMaterial.map;
|
|
903
|
+
newMaterial.displacementMap = oldMaterial.displacementMap;
|
|
904
|
+
newMaterial.emissiveMap = oldMaterial.emissiveMap;
|
|
905
|
+
newMaterial.normalMap = oldMaterial.normalMap;
|
|
906
|
+
newMaterial.envMap = oldMaterial.envMap;
|
|
907
|
+
newMaterial.alphaMap = oldMaterial.alphaMap;
|
|
908
|
+
newMaterial.metalness = oldMaterial.reflectivity;
|
|
909
|
+
newMaterial.vertexColors = oldMaterial.vertexColors;
|
|
910
|
+
if (oldMaterial.shininess) {
|
|
911
|
+
// from blender source code
|
|
912
|
+
// https://github.com/blender/blender-addons/blob/5e66092bcbe0df6855b3fa814b4826add8b01360/io_scene_fbx/import_fbx.py#L1442
|
|
913
|
+
// https://github.com/blender/blender-addons/blob/main/io_scene_fbx/import_fbx.py#L2060
|
|
914
|
+
newMaterial.roughness = 1.0 - (Math.sqrt(oldMaterial.shininess) / 10.0);
|
|
915
|
+
}
|
|
916
|
+
newMaterial.needsUpdate = true;
|
|
917
|
+
}
|
|
918
|
+
|
|
919
|
+
if (index === undefined) {
|
|
920
|
+
obj.material = newMaterial;
|
|
921
|
+
}
|
|
922
|
+
else {
|
|
923
|
+
array![index] = newMaterial;
|
|
924
|
+
}
|
|
925
|
+
return true;
|
|
926
|
+
}
|
|
927
|
+
|
|
928
|
+
|