@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,903 +1,903 @@
|
|
|
1
|
-
import { getRaycastMesh } from "@needle-tools/gltf-progressive";
|
|
2
|
-
import { AxesHelper, Material, Mesh, Object3D, SkinnedMesh, Texture, Vector4 } from "three";
|
|
3
|
-
|
|
4
|
-
import { showBalloonWarning } from "../engine/debug/index.js";
|
|
5
|
-
import { getComponent, getOrAddComponent } from "../engine/engine_components.js";
|
|
6
|
-
import { Gizmos } from "../engine/engine_gizmos.js";
|
|
7
|
-
import { InstancingUtil, NEED_UPDATE_INSTANCE_KEY } from "../engine/engine_instancing.js";
|
|
8
|
-
import { isLocalNetwork } from "../engine/engine_networking_utils.js";
|
|
9
|
-
import { serializable } from "../engine/engine_serialization_decorator.js";
|
|
10
|
-
import { FrameEvent } from "../engine/engine_setup.js";
|
|
11
|
-
import { getTempVector } from "../engine/engine_three_utils.js";
|
|
12
|
-
import type { IRenderer, ISharedMaterials } from "../engine/engine_types.js";
|
|
13
|
-
import { getParam } from "../engine/engine_utils.js";
|
|
14
|
-
import { NEEDLE_render_objects } from "../engine/extensions/NEEDLE_render_objects.js";
|
|
15
|
-
import { setCustomVisibility } from "../engine/js-extensions/Layers.js";
|
|
16
|
-
import { Behaviour, GameObject } from "./Component.js";
|
|
17
|
-
import { ReflectionProbe } from "./ReflectionProbe.js";
|
|
18
|
-
import { InstanceHandle, InstancingHandler } from "./RendererInstancing.js"
|
|
19
|
-
// import { RendererCustomShader } from "./RendererCustomShader.js";
|
|
20
|
-
import { RendererLightmap } from "./RendererLightmap.js";
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
// for staying compatible with old code
|
|
24
|
-
export { InstancingUtil } from "../engine/engine_instancing.js";
|
|
25
|
-
|
|
26
|
-
const debugRenderer = getParam("debugrenderer");
|
|
27
|
-
const debugskinnedmesh = getParam("debugskinnedmesh");
|
|
28
|
-
const suppressInstancing = getParam("noinstancing");
|
|
29
|
-
const showWireframe = getParam("wireframe");
|
|
30
|
-
|
|
31
|
-
export enum ReflectionProbeUsage {
|
|
32
|
-
Off = 0,
|
|
33
|
-
BlendProbes = 1,
|
|
34
|
-
BlendProbesAndSkybox = 2,
|
|
35
|
-
Simple = 3,
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
export class FieldWithDefault {
|
|
40
|
-
public path: string | null = null;
|
|
41
|
-
public asset: object | null = null;
|
|
42
|
-
public default: any;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
export enum RenderState {
|
|
46
|
-
Both = 0,
|
|
47
|
-
Back = 1,
|
|
48
|
-
Front = 2,
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
// support sharedMaterials[index] assigning materials directly to the objects
|
|
53
|
-
class SharedMaterialArray implements ISharedMaterials {
|
|
54
|
-
|
|
55
|
-
[num: number]: Material;
|
|
56
|
-
|
|
57
|
-
private _renderer: Renderer;
|
|
58
|
-
private _targets: Object3D[] = [];
|
|
59
|
-
|
|
60
|
-
private _indexMapMaxIndex?: number;
|
|
61
|
-
private _indexMap?: Map<number, number>;
|
|
62
|
-
|
|
63
|
-
private _changed: boolean = false;
|
|
64
|
-
get changed(): boolean {
|
|
65
|
-
return this._changed;
|
|
66
|
-
}
|
|
67
|
-
set changed(value: boolean) {
|
|
68
|
-
if (value === true) {
|
|
69
|
-
if (debugRenderer)
|
|
70
|
-
console.warn("SharedMaterials have changed: " + this._renderer.name, this);
|
|
71
|
-
}
|
|
72
|
-
this._changed = value;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
is(renderer: Renderer) {
|
|
76
|
-
return this._renderer === renderer;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
constructor(renderer: Renderer, originalMaterials: Material[]) {
|
|
80
|
-
this._renderer = renderer;
|
|
81
|
-
const setMaterial = this.setMaterial.bind(this);
|
|
82
|
-
const getMaterial = this.getMaterial.bind(this);
|
|
83
|
-
const go = renderer.gameObject;
|
|
84
|
-
this._targets = [];
|
|
85
|
-
if (go) {
|
|
86
|
-
switch (go.type) {
|
|
87
|
-
case "Group":
|
|
88
|
-
this._targets = [...go.children];
|
|
89
|
-
break;
|
|
90
|
-
case "SkinnedMesh":
|
|
91
|
-
case "Mesh":
|
|
92
|
-
this._targets.push(go);
|
|
93
|
-
break;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
// this is useful to have an index map when e.g. materials are trying to be assigned by index
|
|
98
|
-
let hasMissingMaterials = false;
|
|
99
|
-
let indexMap: Map<number, number> | undefined = undefined;
|
|
100
|
-
let maxIndex: number = 0;
|
|
101
|
-
for (let i = 0; i < this._targets.length; i++) {
|
|
102
|
-
const target = this._targets[i] as Mesh;
|
|
103
|
-
if (!target) continue;
|
|
104
|
-
const mat = target.material as Material;
|
|
105
|
-
if (!mat) continue;
|
|
106
|
-
// set the shadow side to the same as the side of the material, three flips this for some reason
|
|
107
|
-
mat.shadowSide = mat.side;
|
|
108
|
-
for (let k = 0; k < originalMaterials.length; k++) {
|
|
109
|
-
const orig = originalMaterials[k];
|
|
110
|
-
if (!orig) {
|
|
111
|
-
hasMissingMaterials = true;
|
|
112
|
-
continue;
|
|
113
|
-
}
|
|
114
|
-
if (mat.name === orig.name) {
|
|
115
|
-
if (indexMap === undefined) indexMap = new Map();
|
|
116
|
-
indexMap.set(k, i);
|
|
117
|
-
maxIndex = Math.max(maxIndex, k);
|
|
118
|
-
// console.log(`Material ${mat.name} at ${k} was found at index ${i} in renderer ${renderer.name}.`)
|
|
119
|
-
break;
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
if (hasMissingMaterials) {
|
|
124
|
-
this._indexMapMaxIndex = maxIndex;
|
|
125
|
-
this._indexMap = indexMap;
|
|
126
|
-
const warningMessage = `Renderer ${renderer.name} was initialized with missing materials - this may lead to unexpected behaviour when trying to access sharedMaterials by index.`;
|
|
127
|
-
console.warn(warningMessage);
|
|
128
|
-
if (isLocalNetwork()) showBalloonWarning("Found renderer with missing materials: please check the console for details.");
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
// this lets us override the javascript indexer, only works in ES6 tho
|
|
132
|
-
// but like that we can use sharedMaterials[index] and it will be assigned to the object directly
|
|
133
|
-
return new Proxy(this, {
|
|
134
|
-
get(target, key) {
|
|
135
|
-
if (typeof key === "string") {
|
|
136
|
-
const index = parseInt(key);
|
|
137
|
-
if (!isNaN(index)) {
|
|
138
|
-
return getMaterial(index);
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
return target[key];
|
|
142
|
-
},
|
|
143
|
-
set(target, key, value) {
|
|
144
|
-
if (typeof key === "string")
|
|
145
|
-
setMaterial(value, Number.parseInt(key));
|
|
146
|
-
// console.log(target, key, value);
|
|
147
|
-
if (Reflect.set(target, key, value)) {
|
|
148
|
-
if (value instanceof Material)
|
|
149
|
-
target.changed = true;
|
|
150
|
-
return true;
|
|
151
|
-
}
|
|
152
|
-
return false;
|
|
153
|
-
}
|
|
154
|
-
});
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
get length(): number {
|
|
158
|
-
if (this._indexMapMaxIndex !== undefined) return this._indexMapMaxIndex + 1;
|
|
159
|
-
return this._targets.length;
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
// iterator to support: for(const mat of sharedMaterials)
|
|
163
|
-
*[Symbol.iterator]() {
|
|
164
|
-
for (let i = 0; i < this.length; i++) {
|
|
165
|
-
yield this.getMaterial(i);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
private resolveIndex(index: number): number {
|
|
170
|
-
const map = this._indexMap;
|
|
171
|
-
// if we have a index map it means that some materials were missing
|
|
172
|
-
if (map) {
|
|
173
|
-
if (map.has(index)) return map.get(index) as number;
|
|
174
|
-
// return -1;
|
|
175
|
-
}
|
|
176
|
-
return index;
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
private setMaterial(mat: Material, index: number) {
|
|
180
|
-
index = this.resolveIndex(index);
|
|
181
|
-
if (index < 0 || index >= this._targets.length) return;
|
|
182
|
-
const target = this._targets[index];
|
|
183
|
-
if (!target || target["material"] === undefined) return;
|
|
184
|
-
target["material"] = mat;
|
|
185
|
-
this.changed = true;
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
private getMaterial(index: number): Material | null {
|
|
189
|
-
index = this.resolveIndex(index);
|
|
190
|
-
if (index < 0) return null;
|
|
191
|
-
const obj = this._targets;
|
|
192
|
-
if (index >= obj.length) return null;
|
|
193
|
-
const target = obj[index];
|
|
194
|
-
if (!target) return null;
|
|
195
|
-
return target["material"];
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
/**
|
|
201
|
-
* @category Rendering
|
|
202
|
-
* @group Components
|
|
203
|
-
*/
|
|
204
|
-
export class Renderer extends Behaviour implements IRenderer {
|
|
205
|
-
|
|
206
|
-
/** Enable or disable instancing for an object. This will create a Renderer component if it does not exist yet.
|
|
207
|
-
* @returns the Renderer component that was created or already existed on the object
|
|
208
|
-
*/
|
|
209
|
-
static setInstanced(obj: Object3D, enableInstancing: boolean): Renderer {
|
|
210
|
-
const renderer = getOrAddComponent(obj, Renderer);
|
|
211
|
-
renderer.setInstancingEnabled(enableInstancing);
|
|
212
|
-
return renderer;
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
/** Check if an object is currently rendered using instancing
|
|
216
|
-
* @returns true if the object is rendered using instancing
|
|
217
|
-
*/
|
|
218
|
-
static isInstanced(obj: Object3D): boolean {
|
|
219
|
-
const renderer = getComponent(obj, Renderer);
|
|
220
|
-
if (renderer) return renderer.isInstancingActive;
|
|
221
|
-
return InstancingUtil.isUsingInstancing(obj);
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
/** Set the rendering state only of an object (makes it visible or invisible) without affecting component state or child hierarchy visibility! You can also just enable/disable the Renderer component on that object for the same effect!
|
|
225
|
-
*
|
|
226
|
-
* If you want to activate or deactivate a complete object you can use obj.visible as usual (it acts the same as setActive in Unity) */
|
|
227
|
-
static setVisible(obj: Object3D, visible: boolean) {
|
|
228
|
-
setCustomVisibility(obj, visible);
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
@serializable()
|
|
232
|
-
receiveShadows: boolean = false;
|
|
233
|
-
@serializable()
|
|
234
|
-
shadowCastingMode: ShadowCastingMode = ShadowCastingMode.Off;
|
|
235
|
-
@serializable()
|
|
236
|
-
lightmapIndex: number = -1;
|
|
237
|
-
@serializable(Vector4)
|
|
238
|
-
lightmapScaleOffset: Vector4 = new Vector4(1, 1, 0, 0);
|
|
239
|
-
/** If the renderer should use instancing
|
|
240
|
-
* If this is a boolean (true) all materials will be instanced or (false) none of them.
|
|
241
|
-
* If this is an array of booleans the materials will be instanced based on the index of the material.
|
|
242
|
-
*/
|
|
243
|
-
@serializable()
|
|
244
|
-
enableInstancing: boolean | boolean[] | undefined = undefined;
|
|
245
|
-
@serializable()
|
|
246
|
-
renderOrder: number[] | undefined = undefined;
|
|
247
|
-
@serializable()
|
|
248
|
-
allowOcclusionWhenDynamic: boolean = true;
|
|
249
|
-
|
|
250
|
-
@serializable(Object3D)
|
|
251
|
-
probeAnchor?: Object3D;
|
|
252
|
-
@serializable()
|
|
253
|
-
reflectionProbeUsage: ReflectionProbeUsage = ReflectionProbeUsage.Off;
|
|
254
|
-
|
|
255
|
-
// custom shader
|
|
256
|
-
// get materialProperties(): Array<MaterialProperties> | undefined {
|
|
257
|
-
// return this._materialProperties;
|
|
258
|
-
// }
|
|
259
|
-
// set materialProperties(value: Array<MaterialProperties> | undefined) {
|
|
260
|
-
// this._materialProperties = value;
|
|
261
|
-
// }
|
|
262
|
-
|
|
263
|
-
// private customShaderHandler: RendererCustomShader | undefined = undefined;
|
|
264
|
-
|
|
265
|
-
// private _materialProperties: Array<MaterialProperties> | undefined = undefined;
|
|
266
|
-
private _lightmaps?: RendererLightmap[];
|
|
267
|
-
|
|
268
|
-
/** Get the mesh Object3D for this renderer
|
|
269
|
-
* Warn: if this is a multimaterial object it will return the first mesh only
|
|
270
|
-
* @returns a mesh object3D.
|
|
271
|
-
* */
|
|
272
|
-
get sharedMesh(): Mesh | SkinnedMesh | undefined {
|
|
273
|
-
if (this.gameObject.type === "Mesh") {
|
|
274
|
-
return this.gameObject as unknown as Mesh
|
|
275
|
-
}
|
|
276
|
-
else if (this.gameObject.type === "SkinnesMesh") {
|
|
277
|
-
return this.gameObject as unknown as SkinnedMesh;
|
|
278
|
-
}
|
|
279
|
-
else if (this.gameObject.type === "Group") {
|
|
280
|
-
return this.gameObject.children[0] as unknown as Mesh;
|
|
281
|
-
}
|
|
282
|
-
return undefined;
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
private readonly _sharedMeshes: Mesh[] = [];
|
|
286
|
-
/** Get all the mesh Object3D for this renderer
|
|
287
|
-
* @returns an array of mesh object3D.
|
|
288
|
-
*/
|
|
289
|
-
get sharedMeshes(): Mesh[] {
|
|
290
|
-
if (this.destroyed || !this.gameObject) return this._sharedMeshes;
|
|
291
|
-
this._sharedMeshes.length = 0;
|
|
292
|
-
if (this.gameObject.type === "Group") {
|
|
293
|
-
for (const ch of this.gameObject.children) {
|
|
294
|
-
if (ch.type === "Mesh" || ch.type === "SkinnedMesh") {
|
|
295
|
-
this._sharedMeshes.push(ch as Mesh);
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
else if (this.gameObject.type === "Mesh" || this.gameObject.type === "SkinnedMesh") {
|
|
300
|
-
this._sharedMeshes.push(this.gameObject as unknown as Mesh);
|
|
301
|
-
}
|
|
302
|
-
return this._sharedMeshes;
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
get sharedMaterial(): Material {
|
|
306
|
-
return this.sharedMaterials[0];
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
set sharedMaterial(mat: Material) {
|
|
310
|
-
const cur = this.sharedMaterials[0];
|
|
311
|
-
if (cur === mat) return;
|
|
312
|
-
this.sharedMaterials[0] = mat;
|
|
313
|
-
this.applyLightmapping();
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
/**@deprecated please use sharedMaterial */
|
|
317
|
-
get material(): Material {
|
|
318
|
-
return this.sharedMaterials[0];
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
/**@deprecated please use sharedMaterial */
|
|
322
|
-
set material(mat: Material) {
|
|
323
|
-
this.sharedMaterial = mat;
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
private _sharedMaterials!: SharedMaterialArray;
|
|
327
|
-
private _originalMaterials?: Material[];
|
|
328
|
-
|
|
329
|
-
private _probeAnchorLastFrame?: Object3D;
|
|
330
|
-
|
|
331
|
-
// this is just available during deserialization
|
|
332
|
-
private set sharedMaterials(_val: Array<Material | null>) {
|
|
333
|
-
// TODO: elements in the array might be missing at the moment which leads to problems if an index is serialized
|
|
334
|
-
if (!this._originalMaterials) {
|
|
335
|
-
this._originalMaterials = _val as Material[];
|
|
336
|
-
}
|
|
337
|
-
else if (_val) {
|
|
338
|
-
let didWarn = false;
|
|
339
|
-
for (let i = 0; i < this._sharedMaterials.length; i++) {
|
|
340
|
-
const mat = i < _val.length ? _val[i] : null;
|
|
341
|
-
if (mat && mat instanceof Material) {
|
|
342
|
-
this.sharedMaterials[i] = mat as Material;
|
|
343
|
-
}
|
|
344
|
-
else {
|
|
345
|
-
if (!didWarn) {
|
|
346
|
-
didWarn = true;
|
|
347
|
-
console.warn("Can not assign null as material: " + this.name, mat);
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
//@ts-ignore
|
|
355
|
-
get sharedMaterials(): SharedMaterialArray {
|
|
356
|
-
if (!this._sharedMaterials || !this._sharedMaterials.is(this)) {
|
|
357
|
-
if (!this._originalMaterials) this._originalMaterials = [];
|
|
358
|
-
this._sharedMaterials = new SharedMaterialArray(this, this._originalMaterials);
|
|
359
|
-
}
|
|
360
|
-
return this._sharedMaterials!;
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
public static get shouldSuppressInstancing() {
|
|
364
|
-
return suppressInstancing;
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
private _lightmapTextureOverride: Texture | null | undefined = undefined;
|
|
368
|
-
public get lightmap(): Texture | null {
|
|
369
|
-
if (this._lightmaps?.length) {
|
|
370
|
-
return this._lightmaps[0].lightmap;
|
|
371
|
-
}
|
|
372
|
-
return null;
|
|
373
|
-
}
|
|
374
|
-
/** set undefined to return to default lightmap */
|
|
375
|
-
public set lightmap(tex: Texture | null | undefined) {
|
|
376
|
-
this._lightmapTextureOverride = tex;
|
|
377
|
-
if (tex === undefined) {
|
|
378
|
-
tex = this.context.lightmaps.tryGetLightmap(this.sourceId, this.lightmapIndex);
|
|
379
|
-
}
|
|
380
|
-
if (this._lightmaps?.length) {
|
|
381
|
-
for (const lm of this._lightmaps) {
|
|
382
|
-
lm.lightmap = tex;
|
|
383
|
-
}
|
|
384
|
-
}
|
|
385
|
-
}
|
|
386
|
-
get hasLightmap(): boolean {
|
|
387
|
-
const lm = this.lightmap;
|
|
388
|
-
return lm !== null && lm !== undefined;
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
public allowProgressiveLoading: boolean = true;
|
|
392
|
-
|
|
393
|
-
private _firstFrame: number = -1;
|
|
394
|
-
|
|
395
|
-
registering() {
|
|
396
|
-
if (!this.enabled) {
|
|
397
|
-
this.setVisibility(false);
|
|
398
|
-
}
|
|
399
|
-
}
|
|
400
|
-
|
|
401
|
-
awake() {
|
|
402
|
-
this._firstFrame = this.context.time.frame;
|
|
403
|
-
|
|
404
|
-
if (debugRenderer) console.log("Renderer ", this.name, this);
|
|
405
|
-
this.clearInstancingState();
|
|
406
|
-
|
|
407
|
-
if (this.probeAnchor && debugRenderer) this.probeAnchor.add(new AxesHelper(.2));
|
|
408
|
-
|
|
409
|
-
this._reflectionProbe = null;
|
|
410
|
-
|
|
411
|
-
if (this.isMultiMaterialObject(this.gameObject)) {
|
|
412
|
-
for (const child of this.gameObject.children) {
|
|
413
|
-
this.context.addBeforeRenderListener(child, this.onBeforeRenderThree);
|
|
414
|
-
child.layers.mask = this.gameObject.layers.mask;
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
if (this.renderOrder !== undefined) {
|
|
418
|
-
// Objects can have nested renderers (e.g. contain 2 meshes and then again another group)
|
|
419
|
-
// or perhaps just regular child objects that have their own renderer component (?)
|
|
420
|
-
let index = 0;
|
|
421
|
-
for (let i = 0; i < this.gameObject.children.length; i++) {
|
|
422
|
-
const ch = this.gameObject.children[i];
|
|
423
|
-
// ignore nested groups or objects that have their own renderer (aka their own render order settings)
|
|
424
|
-
if (!this.isMeshOrSkinnedMesh(ch) || GameObject.getComponent(ch, Renderer)) continue;
|
|
425
|
-
if (this.renderOrder.length <= index) {
|
|
426
|
-
console.warn("Incorrect renderOrder element count", this, this.renderOrder.length + " but expected " + this.gameObject.children.length, "Index: " + index, "ChildElement:", ch);
|
|
427
|
-
continue;
|
|
428
|
-
}
|
|
429
|
-
// if(debugRenderer) console.log("Setting render order", ch, this.renderOrder[index])
|
|
430
|
-
ch.renderOrder = this.renderOrder[index];
|
|
431
|
-
index += 1;
|
|
432
|
-
}
|
|
433
|
-
}
|
|
434
|
-
}
|
|
435
|
-
// TODO: custom shader with sub materials
|
|
436
|
-
else if (this.isMeshOrSkinnedMesh(this.gameObject)) {
|
|
437
|
-
this.context.addBeforeRenderListener(this.gameObject, this.onBeforeRenderThree);
|
|
438
|
-
|
|
439
|
-
if (this.renderOrder !== undefined && this.renderOrder.length > 0)
|
|
440
|
-
this.gameObject.renderOrder = this.renderOrder[0];
|
|
441
|
-
}
|
|
442
|
-
else {
|
|
443
|
-
this.context.addBeforeRenderListener(this.gameObject, this.onBeforeRenderThree);
|
|
444
|
-
}
|
|
445
|
-
|
|
446
|
-
this.applyLightmapping();
|
|
447
|
-
|
|
448
|
-
if (showWireframe) {
|
|
449
|
-
for (let i = 0; i < this.sharedMaterials.length; i++) {
|
|
450
|
-
const mat: any = this.sharedMaterials[i];
|
|
451
|
-
if (mat) {
|
|
452
|
-
mat.wireframe = true;
|
|
453
|
-
}
|
|
454
|
-
}
|
|
455
|
-
}
|
|
456
|
-
|
|
457
|
-
}
|
|
458
|
-
|
|
459
|
-
private applyLightmapping() {
|
|
460
|
-
if (this.lightmapIndex >= 0) {
|
|
461
|
-
const type = this.gameObject.type;
|
|
462
|
-
|
|
463
|
-
// use the override lightmap if its not undefined
|
|
464
|
-
const tex = this._lightmapTextureOverride !== undefined
|
|
465
|
-
? this._lightmapTextureOverride
|
|
466
|
-
: this.context.lightmaps.tryGetLightmap(this.sourceId, this.lightmapIndex);
|
|
467
|
-
if (tex) {
|
|
468
|
-
if (!this._lightmaps)
|
|
469
|
-
this._lightmaps = [];
|
|
470
|
-
|
|
471
|
-
if (type === "Mesh") {
|
|
472
|
-
const mat = this.gameObject["material"];
|
|
473
|
-
if (!mat?.isMeshBasicMaterial) {
|
|
474
|
-
if (this._lightmaps.length <= 0) {
|
|
475
|
-
const rm = new RendererLightmap(this.gameObject as any as Mesh, this.context);
|
|
476
|
-
this._lightmaps.push(rm);
|
|
477
|
-
}
|
|
478
|
-
const rm = this._lightmaps[0];
|
|
479
|
-
rm.init(this.lightmapIndex, this.lightmapScaleOffset, tex);
|
|
480
|
-
}
|
|
481
|
-
else {
|
|
482
|
-
if (mat)
|
|
483
|
-
console.warn("Lightmapping is not supported on MeshBasicMaterial", mat.name)
|
|
484
|
-
}
|
|
485
|
-
}
|
|
486
|
-
// for multi materials we need to loop through children
|
|
487
|
-
// and then we add a lightmap renderer component to each of them
|
|
488
|
-
else if (this.isMultiMaterialObject(this.gameObject) && this.sharedMaterials.length > 0) {
|
|
489
|
-
for (let i = 0; i < this.gameObject.children.length; i++) {
|
|
490
|
-
const child = this.gameObject.children[i];
|
|
491
|
-
if (!child["material"]?.isMeshBasicMaterial) {
|
|
492
|
-
let rm: RendererLightmap | undefined = undefined;
|
|
493
|
-
if (i >= this._lightmaps.length) {
|
|
494
|
-
rm = new RendererLightmap(child as Mesh, this.context);
|
|
495
|
-
this._lightmaps.push(rm);
|
|
496
|
-
}
|
|
497
|
-
else
|
|
498
|
-
rm = this._lightmaps[i];
|
|
499
|
-
rm.init(this.lightmapIndex, this.lightmapScaleOffset, tex);
|
|
500
|
-
}
|
|
501
|
-
}
|
|
502
|
-
}
|
|
503
|
-
}
|
|
504
|
-
else {
|
|
505
|
-
if (debugRenderer) console.warn("Lightmap not found", this.sourceId, this.lightmapIndex);
|
|
506
|
-
}
|
|
507
|
-
}
|
|
508
|
-
|
|
509
|
-
}
|
|
510
|
-
|
|
511
|
-
private _isInstancingEnabled: boolean = false;
|
|
512
|
-
private _handles: InstanceHandle[] | null | undefined = undefined;
|
|
513
|
-
|
|
514
|
-
/**
|
|
515
|
-
* @returns true if this renderer has instanced objects
|
|
516
|
-
*/
|
|
517
|
-
get isInstancingActive() {
|
|
518
|
-
return this._handles != undefined && this._handles.length > 0 && this._isInstancingEnabled;
|
|
519
|
-
}
|
|
520
|
-
/** @returns the instancing handles */
|
|
521
|
-
get instances(): InstanceHandle[] | null {
|
|
522
|
-
if (!this._handles || this._handles.length <= 0) {
|
|
523
|
-
return null;
|
|
524
|
-
}
|
|
525
|
-
this._handlesTempArray.length = 0;
|
|
526
|
-
if (this._handles) {
|
|
527
|
-
for (const h of this._handles) {
|
|
528
|
-
this._handlesTempArray.push(h);
|
|
529
|
-
}
|
|
530
|
-
}
|
|
531
|
-
return this._handlesTempArray;
|
|
532
|
-
}
|
|
533
|
-
private _handlesTempArray: InstanceHandle[] = [];
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
/** Enable or disable instancing for this renderer.
|
|
537
|
-
* @param enabled true to enable instancing, false to disable it
|
|
538
|
-
*/
|
|
539
|
-
setInstancingEnabled(enabled: boolean): boolean {
|
|
540
|
-
if (this._isInstancingEnabled === enabled) return enabled && (this._handles === undefined || this._handles != null && this._handles.length > 0);
|
|
541
|
-
this._isInstancingEnabled = enabled;
|
|
542
|
-
if (enabled) {
|
|
543
|
-
if (this.enableInstancing === undefined) this.enableInstancing = true;
|
|
544
|
-
if (this._handles === undefined) {
|
|
545
|
-
this._handles = InstancingHandler.instance.setup(this, this.gameObject, this.context, null, { rend: this, foundMeshes: 0, useMatrixWorldAutoUpdate: this.useInstanceMatrixWorldAutoUpdate() });
|
|
546
|
-
if (this._handles) {
|
|
547
|
-
GameObject.markAsInstancedRendered(this.gameObject, true);
|
|
548
|
-
return true;
|
|
549
|
-
}
|
|
550
|
-
}
|
|
551
|
-
else if (this._handles !== null) {
|
|
552
|
-
for (const handler of this._handles) {
|
|
553
|
-
handler.updateInstanceMatrix(true);
|
|
554
|
-
handler.add();
|
|
555
|
-
}
|
|
556
|
-
GameObject.markAsInstancedRendered(this.gameObject, true);
|
|
557
|
-
return true;
|
|
558
|
-
}
|
|
559
|
-
}
|
|
560
|
-
else {
|
|
561
|
-
if (this._handles) {
|
|
562
|
-
for (const handler of this._handles) {
|
|
563
|
-
handler.remove(this.destroyed);
|
|
564
|
-
}
|
|
565
|
-
}
|
|
566
|
-
return true;
|
|
567
|
-
}
|
|
568
|
-
|
|
569
|
-
return false;
|
|
570
|
-
}
|
|
571
|
-
|
|
572
|
-
private clearInstancingState() {
|
|
573
|
-
this._isInstancingEnabled = false;
|
|
574
|
-
this._handles = undefined;
|
|
575
|
-
}
|
|
576
|
-
|
|
577
|
-
/** Return true to wrap matrix update events for instanced rendering to update instance matrices automatically when matrixWorld changes
|
|
578
|
-
* This is a separate method to be overrideable from user code
|
|
579
|
-
*/
|
|
580
|
-
useInstanceMatrixWorldAutoUpdate() {
|
|
581
|
-
return true;
|
|
582
|
-
}
|
|
583
|
-
|
|
584
|
-
start() {
|
|
585
|
-
if (this.enableInstancing && !suppressInstancing) {
|
|
586
|
-
this.setInstancingEnabled(true);
|
|
587
|
-
// make sure the instance is marked dirty once for cases where e.g. an animator animates the instanced object
|
|
588
|
-
// in the first frame we want the updated matrix then to be applied immediately to the instancing
|
|
589
|
-
InstancingUtil.markDirty(this.gameObject);
|
|
590
|
-
}
|
|
591
|
-
this.gameObject.frustumCulled = this.allowOcclusionWhenDynamic;
|
|
592
|
-
if (this.isMultiMaterialObject(this.gameObject)) {
|
|
593
|
-
for (let i = 0; i < this.gameObject.children.length; i++) {
|
|
594
|
-
const ch = this.gameObject.children[i];
|
|
595
|
-
ch.frustumCulled = this.allowOcclusionWhenDynamic;
|
|
596
|
-
}
|
|
597
|
-
}
|
|
598
|
-
}
|
|
599
|
-
|
|
600
|
-
onEnable() {
|
|
601
|
-
// ensure shared meshes are initialized
|
|
602
|
-
const _ = this.sharedMeshes;
|
|
603
|
-
|
|
604
|
-
this.setVisibility(true);
|
|
605
|
-
|
|
606
|
-
// Check if the renderer is using instancing (or any child object is supposed to use instancing)
|
|
607
|
-
const isUsingInstancing = this._isInstancingEnabled ||
|
|
608
|
-
(this.enableInstancing == true || (Array.isArray(this.enableInstancing) && this.enableInstancing.some(x => x)));
|
|
609
|
-
|
|
610
|
-
if (isUsingInstancing) {
|
|
611
|
-
if (this.__internalDidAwakeAndStart) this.setInstancingEnabled(true);
|
|
612
|
-
}
|
|
613
|
-
// if no insancing is used we can apply the stencil settings
|
|
614
|
-
// but instancing and stencil at the same time is not supported
|
|
615
|
-
else if (this.enabled) {
|
|
616
|
-
this.applyStencil();
|
|
617
|
-
}
|
|
618
|
-
|
|
619
|
-
this.updateReflectionProbe();
|
|
620
|
-
|
|
621
|
-
// this.testIfLODLevelsAreAvailable();
|
|
622
|
-
}
|
|
623
|
-
|
|
624
|
-
onDisable() {
|
|
625
|
-
this.setVisibility(false);
|
|
626
|
-
|
|
627
|
-
if (this._handles && this._handles.length > 0) {
|
|
628
|
-
this.setInstancingEnabled(false);
|
|
629
|
-
}
|
|
630
|
-
}
|
|
631
|
-
|
|
632
|
-
onDestroy(): void {
|
|
633
|
-
this._handles = null;
|
|
634
|
-
|
|
635
|
-
if (this.isMultiMaterialObject(this.gameObject)) {
|
|
636
|
-
for (const child of this.gameObject.children) {
|
|
637
|
-
this.context.removeBeforeRenderListener(child, this.onBeforeRenderThree);
|
|
638
|
-
}
|
|
639
|
-
}
|
|
640
|
-
else {
|
|
641
|
-
this.context.removeBeforeRenderListener(this.gameObject, this.onBeforeRenderThree);
|
|
642
|
-
}
|
|
643
|
-
}
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
onBeforeRender() {
|
|
647
|
-
if (!this.gameObject) {
|
|
648
|
-
return;
|
|
649
|
-
}
|
|
650
|
-
|
|
651
|
-
if (this._probeAnchorLastFrame !== this.probeAnchor) {
|
|
652
|
-
this._reflectionProbe?.onUnset(this);
|
|
653
|
-
this.updateReflectionProbe();
|
|
654
|
-
}
|
|
655
|
-
|
|
656
|
-
if (debugRenderer == this.name && this.gameObject instanceof Mesh) {
|
|
657
|
-
this.gameObject.geometry.computeBoundingSphere();
|
|
658
|
-
const tempCenter = getTempVector(this.gameObject.geometry.boundingSphere.center).applyMatrix4(this.gameObject.matrixWorld);
|
|
659
|
-
Gizmos.DrawWireSphere(tempCenter, this.gameObject.geometry.boundingSphere.radius, 0x00ddff);
|
|
660
|
-
}
|
|
661
|
-
|
|
662
|
-
if (this.isMultiMaterialObject(this.gameObject) && this.gameObject.children?.length > 0) {
|
|
663
|
-
for (const ch of this.gameObject.children) {
|
|
664
|
-
this.applySettings(ch);
|
|
665
|
-
}
|
|
666
|
-
}
|
|
667
|
-
else {
|
|
668
|
-
this.applySettings(this.gameObject);
|
|
669
|
-
}
|
|
670
|
-
|
|
671
|
-
if (this.sharedMaterials.changed) {
|
|
672
|
-
this.sharedMaterials.changed = false;
|
|
673
|
-
this.applyLightmapping();
|
|
674
|
-
}
|
|
675
|
-
|
|
676
|
-
if (this._handles?.length) {
|
|
677
|
-
// if (this.name === "Darbouka")
|
|
678
|
-
// console.log(this.name, this.gameObject.matrixWorldNeedsUpdate);
|
|
679
|
-
const needsUpdate: boolean = this.gameObject[NEED_UPDATE_INSTANCE_KEY] === true;// || this.gameObject.matrixWorldNeedsUpdate;
|
|
680
|
-
if (needsUpdate) {
|
|
681
|
-
// if (debugInstancing) console.log("UPDATE INSTANCED MATRICES at frame #" + this.context.time.frame);
|
|
682
|
-
this.gameObject[NEED_UPDATE_INSTANCE_KEY] = false;
|
|
683
|
-
const remove = false;// Math.random() < .01;
|
|
684
|
-
for (let i = this._handles.length - 1; i >= 0; i--) {
|
|
685
|
-
const h = this._handles[i];
|
|
686
|
-
if (remove) {
|
|
687
|
-
h.remove(this.destroyed);
|
|
688
|
-
this._handles.splice(i, 1);
|
|
689
|
-
}
|
|
690
|
-
else
|
|
691
|
-
h.updateInstanceMatrix();
|
|
692
|
-
}
|
|
693
|
-
this.gameObject.matrixWorldNeedsUpdate = false;
|
|
694
|
-
}
|
|
695
|
-
}
|
|
696
|
-
|
|
697
|
-
if (this._handles && this._handles.length <= 0) {
|
|
698
|
-
GameObject.markAsInstancedRendered(this.gameObject, false);
|
|
699
|
-
}
|
|
700
|
-
|
|
701
|
-
if (this._isInstancingEnabled && this._handles) {
|
|
702
|
-
for (let i = 0; i < this._handles.length; i++) {
|
|
703
|
-
const handle = this._handles[i];
|
|
704
|
-
setCustomVisibility(handle.object, false);
|
|
705
|
-
}
|
|
706
|
-
}
|
|
707
|
-
|
|
708
|
-
if (this.reflectionProbeUsage !== ReflectionProbeUsage.Off && this._reflectionProbe) {
|
|
709
|
-
this._reflectionProbe.onSet(this);
|
|
710
|
-
}
|
|
711
|
-
// since three 163 we need to set the envMap to the scene envMap if it is not set
|
|
712
|
-
// otherwise the envmapIntensity has no effect: https://github.com/mrdoob/three.js/pull/27903
|
|
713
|
-
// internal issue: https://linear.app/needle/issue/NE-6363
|
|
714
|
-
for (const mat of this._sharedMaterials) {
|
|
715
|
-
// If the material has a envMap and is NOT using a reflection probe we set the envMap to the scene environment
|
|
716
|
-
if (mat && "envMap" in mat && "envMapIntensity" in mat && !ReflectionProbe.isUsingReflectionProbe(mat)) {
|
|
717
|
-
mat.envMap = this.context.scene.environment;
|
|
718
|
-
}
|
|
719
|
-
}
|
|
720
|
-
}
|
|
721
|
-
|
|
722
|
-
private onBeforeRenderThree = (_renderer, _scene, _camera, _geometry, material, _group) => {
|
|
723
|
-
if (material.envMapIntensity !== undefined) {
|
|
724
|
-
const factor = this.hasLightmap ? Math.PI : 1;
|
|
725
|
-
const environmentIntensity = this.context.mainCameraComponent?.environmentIntensity ?? 1;
|
|
726
|
-
material.envMapIntensity = Math.max(0, environmentIntensity * this.context.sceneLighting.environmentIntensity / factor);
|
|
727
|
-
}
|
|
728
|
-
|
|
729
|
-
if (this._lightmaps) {
|
|
730
|
-
for (const lm of this._lightmaps) {
|
|
731
|
-
lm.updateLightmapUniforms(material);
|
|
732
|
-
lm.applyLightmap();
|
|
733
|
-
}
|
|
734
|
-
}
|
|
735
|
-
}
|
|
736
|
-
|
|
737
|
-
onAfterRender() {
|
|
738
|
-
if (this._isInstancingEnabled && this._handles) {
|
|
739
|
-
for (let i = 0; i < this._handles.length; i++) {
|
|
740
|
-
const handle = this._handles[i];
|
|
741
|
-
setCustomVisibility(handle.object, true);
|
|
742
|
-
}
|
|
743
|
-
}
|
|
744
|
-
|
|
745
|
-
if (this.reflectionProbeUsage !== ReflectionProbeUsage.Off && this._reflectionProbe) {
|
|
746
|
-
this._reflectionProbe.onUnset(this);
|
|
747
|
-
}
|
|
748
|
-
|
|
749
|
-
if (this.static && this.gameObject.matrixAutoUpdate) {
|
|
750
|
-
this.gameObject.matrixAutoUpdate = false;
|
|
751
|
-
}
|
|
752
|
-
}
|
|
753
|
-
|
|
754
|
-
/** Applies stencil settings for this renderer's objects (if stencil settings are available) */
|
|
755
|
-
applyStencil() {
|
|
756
|
-
NEEDLE_render_objects.applyStencil(this);
|
|
757
|
-
}
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
/** Apply the settings of this renderer to the given object
|
|
763
|
-
* Settings include shadow casting and receiving (e.g. this.receiveShadows, this.shadowCastingMode)
|
|
764
|
-
*/
|
|
765
|
-
applySettings(go: Object3D) {
|
|
766
|
-
go.receiveShadow = this.receiveShadows;
|
|
767
|
-
if (this.shadowCastingMode == ShadowCastingMode.On) {
|
|
768
|
-
go.castShadow = true;
|
|
769
|
-
}
|
|
770
|
-
else go.castShadow = false;
|
|
771
|
-
}
|
|
772
|
-
|
|
773
|
-
private _reflectionProbe: ReflectionProbe | null = null;
|
|
774
|
-
private updateReflectionProbe() {
|
|
775
|
-
// handle reflection probe
|
|
776
|
-
this._reflectionProbe = null;
|
|
777
|
-
if (this.reflectionProbeUsage !== ReflectionProbeUsage.Off) {
|
|
778
|
-
// update the reflection probe right before rendering
|
|
779
|
-
// if we do it immediately the reflection probe might not be enabled yet
|
|
780
|
-
// (since this method is called from onEnable)
|
|
781
|
-
this.startCoroutine(this._updateReflectionProbe(), FrameEvent.LateUpdate);
|
|
782
|
-
|
|
783
|
-
this._probeAnchorLastFrame = this.probeAnchor;
|
|
784
|
-
}
|
|
785
|
-
}
|
|
786
|
-
private *_updateReflectionProbe() {
|
|
787
|
-
const obj = this.probeAnchor || this.gameObject;
|
|
788
|
-
const isAnchor = this.probeAnchor ? true : false;
|
|
789
|
-
this._reflectionProbe = ReflectionProbe.get(obj, this.context, isAnchor, this.probeAnchor);
|
|
790
|
-
}
|
|
791
|
-
|
|
792
|
-
private setVisibility(visible: boolean) {
|
|
793
|
-
|
|
794
|
-
if (!this.isMultiMaterialObject(this.gameObject)) {
|
|
795
|
-
setCustomVisibility(this.gameObject, visible);
|
|
796
|
-
}
|
|
797
|
-
else {
|
|
798
|
-
for (const ch of this.gameObject.children) {
|
|
799
|
-
if (this.isMeshOrSkinnedMesh(ch)) {
|
|
800
|
-
setCustomVisibility(ch, visible);
|
|
801
|
-
}
|
|
802
|
-
}
|
|
803
|
-
}
|
|
804
|
-
}
|
|
805
|
-
|
|
806
|
-
private isMultiMaterialObject(obj: Object3D) {
|
|
807
|
-
return obj.type === "Group";
|
|
808
|
-
}
|
|
809
|
-
|
|
810
|
-
private isMeshOrSkinnedMesh(obj: Object3D): obj is Mesh | SkinnedMesh {
|
|
811
|
-
return obj.type === "Mesh" || obj.type === "SkinnedMesh";
|
|
812
|
-
}
|
|
813
|
-
}
|
|
814
|
-
|
|
815
|
-
export class MeshRenderer extends Renderer {
|
|
816
|
-
}
|
|
817
|
-
|
|
818
|
-
export class SkinnedMeshRenderer extends MeshRenderer {
|
|
819
|
-
|
|
820
|
-
private _needUpdateBoundingSphere = false;
|
|
821
|
-
// private _lastWorldPosition = new Vector3();
|
|
822
|
-
|
|
823
|
-
awake() {
|
|
824
|
-
super.awake();
|
|
825
|
-
if (debugskinnedmesh) console.log("SkinnedMeshRenderer for \"" + this.name + "\"", this);
|
|
826
|
-
// disable skinned mesh occlusion because of https://github.com/mrdoob/js/issues/14499
|
|
827
|
-
this.allowOcclusionWhenDynamic = false;
|
|
828
|
-
|
|
829
|
-
for (const mesh of this.sharedMeshes) {
|
|
830
|
-
// If we don't do that here the bounding sphere matrix used for raycasts will be wrong. Not sure *why* this is necessary
|
|
831
|
-
mesh.parent?.updateWorldMatrix(false, true);
|
|
832
|
-
this.markBoundsDirty();
|
|
833
|
-
}
|
|
834
|
-
}
|
|
835
|
-
onAfterRender(): void {
|
|
836
|
-
super.onAfterRender();
|
|
837
|
-
|
|
838
|
-
// this.gameObject.parent.position.x += Math.sin(this.context.time.time) * .01;
|
|
839
|
-
|
|
840
|
-
// if (this.gameObject instanceof SkinnedMesh && this.gameObject.geometry.boundingSphere) {
|
|
841
|
-
// const bounds = this.gameObject.geometry.boundingSphere;
|
|
842
|
-
// const worldpos = getTempVector().setFromMatrixPosition(this.gameObject.matrixWorld);
|
|
843
|
-
// if (worldpos.distanceTo(this._lastWorldPosition) > bounds.radius) {
|
|
844
|
-
// this._lastWorldPosition.copy(worldpos);
|
|
845
|
-
// this.markBoundsDirty();
|
|
846
|
-
// };
|
|
847
|
-
// }
|
|
848
|
-
|
|
849
|
-
if (this._needUpdateBoundingSphere) {
|
|
850
|
-
for (const mesh of this.sharedMeshes) {
|
|
851
|
-
if (mesh instanceof SkinnedMesh) {
|
|
852
|
-
this._needUpdateBoundingSphere = false;
|
|
853
|
-
try {
|
|
854
|
-
const geometry = mesh.geometry;
|
|
855
|
-
const raycastmesh = getRaycastMesh(mesh);
|
|
856
|
-
if (raycastmesh) {
|
|
857
|
-
mesh.geometry = raycastmesh;
|
|
858
|
-
}
|
|
859
|
-
mesh.computeBoundingSphere();
|
|
860
|
-
mesh.geometry = geometry;
|
|
861
|
-
}
|
|
862
|
-
catch (err) {
|
|
863
|
-
console.error(`Error updating bounding sphere for ${mesh.name}`, err);
|
|
864
|
-
}
|
|
865
|
-
}
|
|
866
|
-
}
|
|
867
|
-
}
|
|
868
|
-
|
|
869
|
-
// if (this.context.time.frame % 30 === 0) this.markBoundsDirty();
|
|
870
|
-
|
|
871
|
-
if (debugskinnedmesh) {
|
|
872
|
-
for (const mesh of this.sharedMeshes) {
|
|
873
|
-
if (mesh instanceof SkinnedMesh && mesh.boundingSphere) {
|
|
874
|
-
const tempCenter = getTempVector(mesh.boundingSphere.center).applyMatrix4(mesh.matrixWorld);
|
|
875
|
-
Gizmos.DrawWireSphere(tempCenter, mesh.boundingSphere.radius, "red");
|
|
876
|
-
}
|
|
877
|
-
}
|
|
878
|
-
}
|
|
879
|
-
}
|
|
880
|
-
|
|
881
|
-
markBoundsDirty() {
|
|
882
|
-
this._needUpdateBoundingSphere = true;
|
|
883
|
-
}
|
|
884
|
-
}
|
|
885
|
-
|
|
886
|
-
export enum ShadowCastingMode {
|
|
887
|
-
/// <summary>
|
|
888
|
-
/// <para>No shadows are cast from this object.</para>
|
|
889
|
-
/// </summary>
|
|
890
|
-
Off,
|
|
891
|
-
/// <summary>
|
|
892
|
-
/// <para>Shadows are cast from this object.</para>
|
|
893
|
-
/// </summary>
|
|
894
|
-
On,
|
|
895
|
-
/// <summary>
|
|
896
|
-
/// <para>Shadows are cast from this object, treating it as two-sided.</para>
|
|
897
|
-
/// </summary>
|
|
898
|
-
TwoSided,
|
|
899
|
-
/// <summary>
|
|
900
|
-
/// <para>Object casts shadows, but is otherwise invisible in the Scene.</para>
|
|
901
|
-
/// </summary>
|
|
902
|
-
ShadowsOnly,
|
|
903
|
-
}
|
|
1
|
+
import { getRaycastMesh } from "@needle-tools/gltf-progressive";
|
|
2
|
+
import { AxesHelper, Material, Mesh, Object3D, SkinnedMesh, Texture, Vector4 } from "three";
|
|
3
|
+
|
|
4
|
+
import { showBalloonWarning } from "../engine/debug/index.js";
|
|
5
|
+
import { getComponent, getOrAddComponent } from "../engine/engine_components.js";
|
|
6
|
+
import { Gizmos } from "../engine/engine_gizmos.js";
|
|
7
|
+
import { InstancingUtil, NEED_UPDATE_INSTANCE_KEY } from "../engine/engine_instancing.js";
|
|
8
|
+
import { isLocalNetwork } from "../engine/engine_networking_utils.js";
|
|
9
|
+
import { serializable } from "../engine/engine_serialization_decorator.js";
|
|
10
|
+
import { FrameEvent } from "../engine/engine_setup.js";
|
|
11
|
+
import { getTempVector } from "../engine/engine_three_utils.js";
|
|
12
|
+
import type { IRenderer, ISharedMaterials } from "../engine/engine_types.js";
|
|
13
|
+
import { getParam } from "../engine/engine_utils.js";
|
|
14
|
+
import { NEEDLE_render_objects } from "../engine/extensions/NEEDLE_render_objects.js";
|
|
15
|
+
import { setCustomVisibility } from "../engine/js-extensions/Layers.js";
|
|
16
|
+
import { Behaviour, GameObject } from "./Component.js";
|
|
17
|
+
import { ReflectionProbe } from "./ReflectionProbe.js";
|
|
18
|
+
import { InstanceHandle, InstancingHandler } from "./RendererInstancing.js"
|
|
19
|
+
// import { RendererCustomShader } from "./RendererCustomShader.js";
|
|
20
|
+
import { RendererLightmap } from "./RendererLightmap.js";
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
// for staying compatible with old code
|
|
24
|
+
export { InstancingUtil } from "../engine/engine_instancing.js";
|
|
25
|
+
|
|
26
|
+
const debugRenderer = getParam("debugrenderer");
|
|
27
|
+
const debugskinnedmesh = getParam("debugskinnedmesh");
|
|
28
|
+
const suppressInstancing = getParam("noinstancing");
|
|
29
|
+
const showWireframe = getParam("wireframe");
|
|
30
|
+
|
|
31
|
+
export enum ReflectionProbeUsage {
|
|
32
|
+
Off = 0,
|
|
33
|
+
BlendProbes = 1,
|
|
34
|
+
BlendProbesAndSkybox = 2,
|
|
35
|
+
Simple = 3,
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
export class FieldWithDefault {
|
|
40
|
+
public path: string | null = null;
|
|
41
|
+
public asset: object | null = null;
|
|
42
|
+
public default: any;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export enum RenderState {
|
|
46
|
+
Both = 0,
|
|
47
|
+
Back = 1,
|
|
48
|
+
Front = 2,
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
// support sharedMaterials[index] assigning materials directly to the objects
|
|
53
|
+
class SharedMaterialArray implements ISharedMaterials {
|
|
54
|
+
|
|
55
|
+
[num: number]: Material;
|
|
56
|
+
|
|
57
|
+
private _renderer: Renderer;
|
|
58
|
+
private _targets: Object3D[] = [];
|
|
59
|
+
|
|
60
|
+
private _indexMapMaxIndex?: number;
|
|
61
|
+
private _indexMap?: Map<number, number>;
|
|
62
|
+
|
|
63
|
+
private _changed: boolean = false;
|
|
64
|
+
get changed(): boolean {
|
|
65
|
+
return this._changed;
|
|
66
|
+
}
|
|
67
|
+
set changed(value: boolean) {
|
|
68
|
+
if (value === true) {
|
|
69
|
+
if (debugRenderer)
|
|
70
|
+
console.warn("SharedMaterials have changed: " + this._renderer.name, this);
|
|
71
|
+
}
|
|
72
|
+
this._changed = value;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
is(renderer: Renderer) {
|
|
76
|
+
return this._renderer === renderer;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
constructor(renderer: Renderer, originalMaterials: Material[]) {
|
|
80
|
+
this._renderer = renderer;
|
|
81
|
+
const setMaterial = this.setMaterial.bind(this);
|
|
82
|
+
const getMaterial = this.getMaterial.bind(this);
|
|
83
|
+
const go = renderer.gameObject;
|
|
84
|
+
this._targets = [];
|
|
85
|
+
if (go) {
|
|
86
|
+
switch (go.type) {
|
|
87
|
+
case "Group":
|
|
88
|
+
this._targets = [...go.children];
|
|
89
|
+
break;
|
|
90
|
+
case "SkinnedMesh":
|
|
91
|
+
case "Mesh":
|
|
92
|
+
this._targets.push(go);
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// this is useful to have an index map when e.g. materials are trying to be assigned by index
|
|
98
|
+
let hasMissingMaterials = false;
|
|
99
|
+
let indexMap: Map<number, number> | undefined = undefined;
|
|
100
|
+
let maxIndex: number = 0;
|
|
101
|
+
for (let i = 0; i < this._targets.length; i++) {
|
|
102
|
+
const target = this._targets[i] as Mesh;
|
|
103
|
+
if (!target) continue;
|
|
104
|
+
const mat = target.material as Material;
|
|
105
|
+
if (!mat) continue;
|
|
106
|
+
// set the shadow side to the same as the side of the material, three flips this for some reason
|
|
107
|
+
mat.shadowSide = mat.side;
|
|
108
|
+
for (let k = 0; k < originalMaterials.length; k++) {
|
|
109
|
+
const orig = originalMaterials[k];
|
|
110
|
+
if (!orig) {
|
|
111
|
+
hasMissingMaterials = true;
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
if (mat.name === orig.name) {
|
|
115
|
+
if (indexMap === undefined) indexMap = new Map();
|
|
116
|
+
indexMap.set(k, i);
|
|
117
|
+
maxIndex = Math.max(maxIndex, k);
|
|
118
|
+
// console.log(`Material ${mat.name} at ${k} was found at index ${i} in renderer ${renderer.name}.`)
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
if (hasMissingMaterials) {
|
|
124
|
+
this._indexMapMaxIndex = maxIndex;
|
|
125
|
+
this._indexMap = indexMap;
|
|
126
|
+
const warningMessage = `Renderer ${renderer.name} was initialized with missing materials - this may lead to unexpected behaviour when trying to access sharedMaterials by index.`;
|
|
127
|
+
console.warn(warningMessage);
|
|
128
|
+
if (isLocalNetwork()) showBalloonWarning("Found renderer with missing materials: please check the console for details.");
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// this lets us override the javascript indexer, only works in ES6 tho
|
|
132
|
+
// but like that we can use sharedMaterials[index] and it will be assigned to the object directly
|
|
133
|
+
return new Proxy(this, {
|
|
134
|
+
get(target, key) {
|
|
135
|
+
if (typeof key === "string") {
|
|
136
|
+
const index = parseInt(key);
|
|
137
|
+
if (!isNaN(index)) {
|
|
138
|
+
return getMaterial(index);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return target[key];
|
|
142
|
+
},
|
|
143
|
+
set(target, key, value) {
|
|
144
|
+
if (typeof key === "string")
|
|
145
|
+
setMaterial(value, Number.parseInt(key));
|
|
146
|
+
// console.log(target, key, value);
|
|
147
|
+
if (Reflect.set(target, key, value)) {
|
|
148
|
+
if (value instanceof Material)
|
|
149
|
+
target.changed = true;
|
|
150
|
+
return true;
|
|
151
|
+
}
|
|
152
|
+
return false;
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
get length(): number {
|
|
158
|
+
if (this._indexMapMaxIndex !== undefined) return this._indexMapMaxIndex + 1;
|
|
159
|
+
return this._targets.length;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// iterator to support: for(const mat of sharedMaterials)
|
|
163
|
+
*[Symbol.iterator]() {
|
|
164
|
+
for (let i = 0; i < this.length; i++) {
|
|
165
|
+
yield this.getMaterial(i);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
private resolveIndex(index: number): number {
|
|
170
|
+
const map = this._indexMap;
|
|
171
|
+
// if we have a index map it means that some materials were missing
|
|
172
|
+
if (map) {
|
|
173
|
+
if (map.has(index)) return map.get(index) as number;
|
|
174
|
+
// return -1;
|
|
175
|
+
}
|
|
176
|
+
return index;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
private setMaterial(mat: Material, index: number) {
|
|
180
|
+
index = this.resolveIndex(index);
|
|
181
|
+
if (index < 0 || index >= this._targets.length) return;
|
|
182
|
+
const target = this._targets[index];
|
|
183
|
+
if (!target || target["material"] === undefined) return;
|
|
184
|
+
target["material"] = mat;
|
|
185
|
+
this.changed = true;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
private getMaterial(index: number): Material | null {
|
|
189
|
+
index = this.resolveIndex(index);
|
|
190
|
+
if (index < 0) return null;
|
|
191
|
+
const obj = this._targets;
|
|
192
|
+
if (index >= obj.length) return null;
|
|
193
|
+
const target = obj[index];
|
|
194
|
+
if (!target) return null;
|
|
195
|
+
return target["material"];
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* @category Rendering
|
|
202
|
+
* @group Components
|
|
203
|
+
*/
|
|
204
|
+
export class Renderer extends Behaviour implements IRenderer {
|
|
205
|
+
|
|
206
|
+
/** Enable or disable instancing for an object. This will create a Renderer component if it does not exist yet.
|
|
207
|
+
* @returns the Renderer component that was created or already existed on the object
|
|
208
|
+
*/
|
|
209
|
+
static setInstanced(obj: Object3D, enableInstancing: boolean): Renderer {
|
|
210
|
+
const renderer = getOrAddComponent(obj, Renderer);
|
|
211
|
+
renderer.setInstancingEnabled(enableInstancing);
|
|
212
|
+
return renderer;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/** Check if an object is currently rendered using instancing
|
|
216
|
+
* @returns true if the object is rendered using instancing
|
|
217
|
+
*/
|
|
218
|
+
static isInstanced(obj: Object3D): boolean {
|
|
219
|
+
const renderer = getComponent(obj, Renderer);
|
|
220
|
+
if (renderer) return renderer.isInstancingActive;
|
|
221
|
+
return InstancingUtil.isUsingInstancing(obj);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/** Set the rendering state only of an object (makes it visible or invisible) without affecting component state or child hierarchy visibility! You can also just enable/disable the Renderer component on that object for the same effect!
|
|
225
|
+
*
|
|
226
|
+
* If you want to activate or deactivate a complete object you can use obj.visible as usual (it acts the same as setActive in Unity) */
|
|
227
|
+
static setVisible(obj: Object3D, visible: boolean) {
|
|
228
|
+
setCustomVisibility(obj, visible);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
@serializable()
|
|
232
|
+
receiveShadows: boolean = false;
|
|
233
|
+
@serializable()
|
|
234
|
+
shadowCastingMode: ShadowCastingMode = ShadowCastingMode.Off;
|
|
235
|
+
@serializable()
|
|
236
|
+
lightmapIndex: number = -1;
|
|
237
|
+
@serializable(Vector4)
|
|
238
|
+
lightmapScaleOffset: Vector4 = new Vector4(1, 1, 0, 0);
|
|
239
|
+
/** If the renderer should use instancing
|
|
240
|
+
* If this is a boolean (true) all materials will be instanced or (false) none of them.
|
|
241
|
+
* If this is an array of booleans the materials will be instanced based on the index of the material.
|
|
242
|
+
*/
|
|
243
|
+
@serializable()
|
|
244
|
+
enableInstancing: boolean | boolean[] | undefined = undefined;
|
|
245
|
+
@serializable()
|
|
246
|
+
renderOrder: number[] | undefined = undefined;
|
|
247
|
+
@serializable()
|
|
248
|
+
allowOcclusionWhenDynamic: boolean = true;
|
|
249
|
+
|
|
250
|
+
@serializable(Object3D)
|
|
251
|
+
probeAnchor?: Object3D;
|
|
252
|
+
@serializable()
|
|
253
|
+
reflectionProbeUsage: ReflectionProbeUsage = ReflectionProbeUsage.Off;
|
|
254
|
+
|
|
255
|
+
// custom shader
|
|
256
|
+
// get materialProperties(): Array<MaterialProperties> | undefined {
|
|
257
|
+
// return this._materialProperties;
|
|
258
|
+
// }
|
|
259
|
+
// set materialProperties(value: Array<MaterialProperties> | undefined) {
|
|
260
|
+
// this._materialProperties = value;
|
|
261
|
+
// }
|
|
262
|
+
|
|
263
|
+
// private customShaderHandler: RendererCustomShader | undefined = undefined;
|
|
264
|
+
|
|
265
|
+
// private _materialProperties: Array<MaterialProperties> | undefined = undefined;
|
|
266
|
+
private _lightmaps?: RendererLightmap[];
|
|
267
|
+
|
|
268
|
+
/** Get the mesh Object3D for this renderer
|
|
269
|
+
* Warn: if this is a multimaterial object it will return the first mesh only
|
|
270
|
+
* @returns a mesh object3D.
|
|
271
|
+
* */
|
|
272
|
+
get sharedMesh(): Mesh | SkinnedMesh | undefined {
|
|
273
|
+
if (this.gameObject.type === "Mesh") {
|
|
274
|
+
return this.gameObject as unknown as Mesh
|
|
275
|
+
}
|
|
276
|
+
else if (this.gameObject.type === "SkinnesMesh") {
|
|
277
|
+
return this.gameObject as unknown as SkinnedMesh;
|
|
278
|
+
}
|
|
279
|
+
else if (this.gameObject.type === "Group") {
|
|
280
|
+
return this.gameObject.children[0] as unknown as Mesh;
|
|
281
|
+
}
|
|
282
|
+
return undefined;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
private readonly _sharedMeshes: Mesh[] = [];
|
|
286
|
+
/** Get all the mesh Object3D for this renderer
|
|
287
|
+
* @returns an array of mesh object3D.
|
|
288
|
+
*/
|
|
289
|
+
get sharedMeshes(): Mesh[] {
|
|
290
|
+
if (this.destroyed || !this.gameObject) return this._sharedMeshes;
|
|
291
|
+
this._sharedMeshes.length = 0;
|
|
292
|
+
if (this.gameObject.type === "Group") {
|
|
293
|
+
for (const ch of this.gameObject.children) {
|
|
294
|
+
if (ch.type === "Mesh" || ch.type === "SkinnedMesh") {
|
|
295
|
+
this._sharedMeshes.push(ch as Mesh);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
else if (this.gameObject.type === "Mesh" || this.gameObject.type === "SkinnedMesh") {
|
|
300
|
+
this._sharedMeshes.push(this.gameObject as unknown as Mesh);
|
|
301
|
+
}
|
|
302
|
+
return this._sharedMeshes;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
get sharedMaterial(): Material {
|
|
306
|
+
return this.sharedMaterials[0];
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
set sharedMaterial(mat: Material) {
|
|
310
|
+
const cur = this.sharedMaterials[0];
|
|
311
|
+
if (cur === mat) return;
|
|
312
|
+
this.sharedMaterials[0] = mat;
|
|
313
|
+
this.applyLightmapping();
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
/**@deprecated please use sharedMaterial */
|
|
317
|
+
get material(): Material {
|
|
318
|
+
return this.sharedMaterials[0];
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
/**@deprecated please use sharedMaterial */
|
|
322
|
+
set material(mat: Material) {
|
|
323
|
+
this.sharedMaterial = mat;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
private _sharedMaterials!: SharedMaterialArray;
|
|
327
|
+
private _originalMaterials?: Material[];
|
|
328
|
+
|
|
329
|
+
private _probeAnchorLastFrame?: Object3D;
|
|
330
|
+
|
|
331
|
+
// this is just available during deserialization
|
|
332
|
+
private set sharedMaterials(_val: Array<Material | null>) {
|
|
333
|
+
// TODO: elements in the array might be missing at the moment which leads to problems if an index is serialized
|
|
334
|
+
if (!this._originalMaterials) {
|
|
335
|
+
this._originalMaterials = _val as Material[];
|
|
336
|
+
}
|
|
337
|
+
else if (_val) {
|
|
338
|
+
let didWarn = false;
|
|
339
|
+
for (let i = 0; i < this._sharedMaterials.length; i++) {
|
|
340
|
+
const mat = i < _val.length ? _val[i] : null;
|
|
341
|
+
if (mat && mat instanceof Material) {
|
|
342
|
+
this.sharedMaterials[i] = mat as Material;
|
|
343
|
+
}
|
|
344
|
+
else {
|
|
345
|
+
if (!didWarn) {
|
|
346
|
+
didWarn = true;
|
|
347
|
+
console.warn("Can not assign null as material: " + this.name, mat);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
//@ts-ignore
|
|
355
|
+
get sharedMaterials(): SharedMaterialArray {
|
|
356
|
+
if (!this._sharedMaterials || !this._sharedMaterials.is(this)) {
|
|
357
|
+
if (!this._originalMaterials) this._originalMaterials = [];
|
|
358
|
+
this._sharedMaterials = new SharedMaterialArray(this, this._originalMaterials);
|
|
359
|
+
}
|
|
360
|
+
return this._sharedMaterials!;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
public static get shouldSuppressInstancing() {
|
|
364
|
+
return suppressInstancing;
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
private _lightmapTextureOverride: Texture | null | undefined = undefined;
|
|
368
|
+
public get lightmap(): Texture | null {
|
|
369
|
+
if (this._lightmaps?.length) {
|
|
370
|
+
return this._lightmaps[0].lightmap;
|
|
371
|
+
}
|
|
372
|
+
return null;
|
|
373
|
+
}
|
|
374
|
+
/** set undefined to return to default lightmap */
|
|
375
|
+
public set lightmap(tex: Texture | null | undefined) {
|
|
376
|
+
this._lightmapTextureOverride = tex;
|
|
377
|
+
if (tex === undefined) {
|
|
378
|
+
tex = this.context.lightmaps.tryGetLightmap(this.sourceId, this.lightmapIndex);
|
|
379
|
+
}
|
|
380
|
+
if (this._lightmaps?.length) {
|
|
381
|
+
for (const lm of this._lightmaps) {
|
|
382
|
+
lm.lightmap = tex;
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
get hasLightmap(): boolean {
|
|
387
|
+
const lm = this.lightmap;
|
|
388
|
+
return lm !== null && lm !== undefined;
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
public allowProgressiveLoading: boolean = true;
|
|
392
|
+
|
|
393
|
+
private _firstFrame: number = -1;
|
|
394
|
+
|
|
395
|
+
registering() {
|
|
396
|
+
if (!this.enabled) {
|
|
397
|
+
this.setVisibility(false);
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
awake() {
|
|
402
|
+
this._firstFrame = this.context.time.frame;
|
|
403
|
+
|
|
404
|
+
if (debugRenderer) console.log("Renderer ", this.name, this);
|
|
405
|
+
this.clearInstancingState();
|
|
406
|
+
|
|
407
|
+
if (this.probeAnchor && debugRenderer) this.probeAnchor.add(new AxesHelper(.2));
|
|
408
|
+
|
|
409
|
+
this._reflectionProbe = null;
|
|
410
|
+
|
|
411
|
+
if (this.isMultiMaterialObject(this.gameObject)) {
|
|
412
|
+
for (const child of this.gameObject.children) {
|
|
413
|
+
this.context.addBeforeRenderListener(child, this.onBeforeRenderThree);
|
|
414
|
+
child.layers.mask = this.gameObject.layers.mask;
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
if (this.renderOrder !== undefined) {
|
|
418
|
+
// Objects can have nested renderers (e.g. contain 2 meshes and then again another group)
|
|
419
|
+
// or perhaps just regular child objects that have their own renderer component (?)
|
|
420
|
+
let index = 0;
|
|
421
|
+
for (let i = 0; i < this.gameObject.children.length; i++) {
|
|
422
|
+
const ch = this.gameObject.children[i];
|
|
423
|
+
// ignore nested groups or objects that have their own renderer (aka their own render order settings)
|
|
424
|
+
if (!this.isMeshOrSkinnedMesh(ch) || GameObject.getComponent(ch, Renderer)) continue;
|
|
425
|
+
if (this.renderOrder.length <= index) {
|
|
426
|
+
console.warn("Incorrect renderOrder element count", this, this.renderOrder.length + " but expected " + this.gameObject.children.length, "Index: " + index, "ChildElement:", ch);
|
|
427
|
+
continue;
|
|
428
|
+
}
|
|
429
|
+
// if(debugRenderer) console.log("Setting render order", ch, this.renderOrder[index])
|
|
430
|
+
ch.renderOrder = this.renderOrder[index];
|
|
431
|
+
index += 1;
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
// TODO: custom shader with sub materials
|
|
436
|
+
else if (this.isMeshOrSkinnedMesh(this.gameObject)) {
|
|
437
|
+
this.context.addBeforeRenderListener(this.gameObject, this.onBeforeRenderThree);
|
|
438
|
+
|
|
439
|
+
if (this.renderOrder !== undefined && this.renderOrder.length > 0)
|
|
440
|
+
this.gameObject.renderOrder = this.renderOrder[0];
|
|
441
|
+
}
|
|
442
|
+
else {
|
|
443
|
+
this.context.addBeforeRenderListener(this.gameObject, this.onBeforeRenderThree);
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
this.applyLightmapping();
|
|
447
|
+
|
|
448
|
+
if (showWireframe) {
|
|
449
|
+
for (let i = 0; i < this.sharedMaterials.length; i++) {
|
|
450
|
+
const mat: any = this.sharedMaterials[i];
|
|
451
|
+
if (mat) {
|
|
452
|
+
mat.wireframe = true;
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
private applyLightmapping() {
|
|
460
|
+
if (this.lightmapIndex >= 0) {
|
|
461
|
+
const type = this.gameObject.type;
|
|
462
|
+
|
|
463
|
+
// use the override lightmap if its not undefined
|
|
464
|
+
const tex = this._lightmapTextureOverride !== undefined
|
|
465
|
+
? this._lightmapTextureOverride
|
|
466
|
+
: this.context.lightmaps.tryGetLightmap(this.sourceId, this.lightmapIndex);
|
|
467
|
+
if (tex) {
|
|
468
|
+
if (!this._lightmaps)
|
|
469
|
+
this._lightmaps = [];
|
|
470
|
+
|
|
471
|
+
if (type === "Mesh") {
|
|
472
|
+
const mat = this.gameObject["material"];
|
|
473
|
+
if (!mat?.isMeshBasicMaterial) {
|
|
474
|
+
if (this._lightmaps.length <= 0) {
|
|
475
|
+
const rm = new RendererLightmap(this.gameObject as any as Mesh, this.context);
|
|
476
|
+
this._lightmaps.push(rm);
|
|
477
|
+
}
|
|
478
|
+
const rm = this._lightmaps[0];
|
|
479
|
+
rm.init(this.lightmapIndex, this.lightmapScaleOffset, tex);
|
|
480
|
+
}
|
|
481
|
+
else {
|
|
482
|
+
if (mat)
|
|
483
|
+
console.warn("Lightmapping is not supported on MeshBasicMaterial", mat.name)
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
// for multi materials we need to loop through children
|
|
487
|
+
// and then we add a lightmap renderer component to each of them
|
|
488
|
+
else if (this.isMultiMaterialObject(this.gameObject) && this.sharedMaterials.length > 0) {
|
|
489
|
+
for (let i = 0; i < this.gameObject.children.length; i++) {
|
|
490
|
+
const child = this.gameObject.children[i];
|
|
491
|
+
if (!child["material"]?.isMeshBasicMaterial) {
|
|
492
|
+
let rm: RendererLightmap | undefined = undefined;
|
|
493
|
+
if (i >= this._lightmaps.length) {
|
|
494
|
+
rm = new RendererLightmap(child as Mesh, this.context);
|
|
495
|
+
this._lightmaps.push(rm);
|
|
496
|
+
}
|
|
497
|
+
else
|
|
498
|
+
rm = this._lightmaps[i];
|
|
499
|
+
rm.init(this.lightmapIndex, this.lightmapScaleOffset, tex);
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
else {
|
|
505
|
+
if (debugRenderer) console.warn("Lightmap not found", this.sourceId, this.lightmapIndex);
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
private _isInstancingEnabled: boolean = false;
|
|
512
|
+
private _handles: InstanceHandle[] | null | undefined = undefined;
|
|
513
|
+
|
|
514
|
+
/**
|
|
515
|
+
* @returns true if this renderer has instanced objects
|
|
516
|
+
*/
|
|
517
|
+
get isInstancingActive() {
|
|
518
|
+
return this._handles != undefined && this._handles.length > 0 && this._isInstancingEnabled;
|
|
519
|
+
}
|
|
520
|
+
/** @returns the instancing handles */
|
|
521
|
+
get instances(): InstanceHandle[] | null {
|
|
522
|
+
if (!this._handles || this._handles.length <= 0) {
|
|
523
|
+
return null;
|
|
524
|
+
}
|
|
525
|
+
this._handlesTempArray.length = 0;
|
|
526
|
+
if (this._handles) {
|
|
527
|
+
for (const h of this._handles) {
|
|
528
|
+
this._handlesTempArray.push(h);
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
return this._handlesTempArray;
|
|
532
|
+
}
|
|
533
|
+
private _handlesTempArray: InstanceHandle[] = [];
|
|
534
|
+
|
|
535
|
+
|
|
536
|
+
/** Enable or disable instancing for this renderer.
|
|
537
|
+
* @param enabled true to enable instancing, false to disable it
|
|
538
|
+
*/
|
|
539
|
+
setInstancingEnabled(enabled: boolean): boolean {
|
|
540
|
+
if (this._isInstancingEnabled === enabled) return enabled && (this._handles === undefined || this._handles != null && this._handles.length > 0);
|
|
541
|
+
this._isInstancingEnabled = enabled;
|
|
542
|
+
if (enabled) {
|
|
543
|
+
if (this.enableInstancing === undefined) this.enableInstancing = true;
|
|
544
|
+
if (this._handles === undefined) {
|
|
545
|
+
this._handles = InstancingHandler.instance.setup(this, this.gameObject, this.context, null, { rend: this, foundMeshes: 0, useMatrixWorldAutoUpdate: this.useInstanceMatrixWorldAutoUpdate() });
|
|
546
|
+
if (this._handles) {
|
|
547
|
+
GameObject.markAsInstancedRendered(this.gameObject, true);
|
|
548
|
+
return true;
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
else if (this._handles !== null) {
|
|
552
|
+
for (const handler of this._handles) {
|
|
553
|
+
handler.updateInstanceMatrix(true);
|
|
554
|
+
handler.add();
|
|
555
|
+
}
|
|
556
|
+
GameObject.markAsInstancedRendered(this.gameObject, true);
|
|
557
|
+
return true;
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
else {
|
|
561
|
+
if (this._handles) {
|
|
562
|
+
for (const handler of this._handles) {
|
|
563
|
+
handler.remove(this.destroyed);
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
return true;
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
return false;
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
private clearInstancingState() {
|
|
573
|
+
this._isInstancingEnabled = false;
|
|
574
|
+
this._handles = undefined;
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
/** Return true to wrap matrix update events for instanced rendering to update instance matrices automatically when matrixWorld changes
|
|
578
|
+
* This is a separate method to be overrideable from user code
|
|
579
|
+
*/
|
|
580
|
+
useInstanceMatrixWorldAutoUpdate() {
|
|
581
|
+
return true;
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
start() {
|
|
585
|
+
if (this.enableInstancing && !suppressInstancing) {
|
|
586
|
+
this.setInstancingEnabled(true);
|
|
587
|
+
// make sure the instance is marked dirty once for cases where e.g. an animator animates the instanced object
|
|
588
|
+
// in the first frame we want the updated matrix then to be applied immediately to the instancing
|
|
589
|
+
InstancingUtil.markDirty(this.gameObject);
|
|
590
|
+
}
|
|
591
|
+
this.gameObject.frustumCulled = this.allowOcclusionWhenDynamic;
|
|
592
|
+
if (this.isMultiMaterialObject(this.gameObject)) {
|
|
593
|
+
for (let i = 0; i < this.gameObject.children.length; i++) {
|
|
594
|
+
const ch = this.gameObject.children[i];
|
|
595
|
+
ch.frustumCulled = this.allowOcclusionWhenDynamic;
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
onEnable() {
|
|
601
|
+
// ensure shared meshes are initialized
|
|
602
|
+
const _ = this.sharedMeshes;
|
|
603
|
+
|
|
604
|
+
this.setVisibility(true);
|
|
605
|
+
|
|
606
|
+
// Check if the renderer is using instancing (or any child object is supposed to use instancing)
|
|
607
|
+
const isUsingInstancing = this._isInstancingEnabled ||
|
|
608
|
+
(this.enableInstancing == true || (Array.isArray(this.enableInstancing) && this.enableInstancing.some(x => x)));
|
|
609
|
+
|
|
610
|
+
if (isUsingInstancing) {
|
|
611
|
+
if (this.__internalDidAwakeAndStart) this.setInstancingEnabled(true);
|
|
612
|
+
}
|
|
613
|
+
// if no insancing is used we can apply the stencil settings
|
|
614
|
+
// but instancing and stencil at the same time is not supported
|
|
615
|
+
else if (this.enabled) {
|
|
616
|
+
this.applyStencil();
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
this.updateReflectionProbe();
|
|
620
|
+
|
|
621
|
+
// this.testIfLODLevelsAreAvailable();
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
onDisable() {
|
|
625
|
+
this.setVisibility(false);
|
|
626
|
+
|
|
627
|
+
if (this._handles && this._handles.length > 0) {
|
|
628
|
+
this.setInstancingEnabled(false);
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
onDestroy(): void {
|
|
633
|
+
this._handles = null;
|
|
634
|
+
|
|
635
|
+
if (this.isMultiMaterialObject(this.gameObject)) {
|
|
636
|
+
for (const child of this.gameObject.children) {
|
|
637
|
+
this.context.removeBeforeRenderListener(child, this.onBeforeRenderThree);
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
else {
|
|
641
|
+
this.context.removeBeforeRenderListener(this.gameObject, this.onBeforeRenderThree);
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
|
|
646
|
+
onBeforeRender() {
|
|
647
|
+
if (!this.gameObject) {
|
|
648
|
+
return;
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
if (this._probeAnchorLastFrame !== this.probeAnchor) {
|
|
652
|
+
this._reflectionProbe?.onUnset(this);
|
|
653
|
+
this.updateReflectionProbe();
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
if (debugRenderer == this.name && this.gameObject instanceof Mesh) {
|
|
657
|
+
this.gameObject.geometry.computeBoundingSphere();
|
|
658
|
+
const tempCenter = getTempVector(this.gameObject.geometry.boundingSphere.center).applyMatrix4(this.gameObject.matrixWorld);
|
|
659
|
+
Gizmos.DrawWireSphere(tempCenter, this.gameObject.geometry.boundingSphere.radius, 0x00ddff);
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
if (this.isMultiMaterialObject(this.gameObject) && this.gameObject.children?.length > 0) {
|
|
663
|
+
for (const ch of this.gameObject.children) {
|
|
664
|
+
this.applySettings(ch);
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
else {
|
|
668
|
+
this.applySettings(this.gameObject);
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
if (this.sharedMaterials.changed) {
|
|
672
|
+
this.sharedMaterials.changed = false;
|
|
673
|
+
this.applyLightmapping();
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
if (this._handles?.length) {
|
|
677
|
+
// if (this.name === "Darbouka")
|
|
678
|
+
// console.log(this.name, this.gameObject.matrixWorldNeedsUpdate);
|
|
679
|
+
const needsUpdate: boolean = this.gameObject[NEED_UPDATE_INSTANCE_KEY] === true;// || this.gameObject.matrixWorldNeedsUpdate;
|
|
680
|
+
if (needsUpdate) {
|
|
681
|
+
// if (debugInstancing) console.log("UPDATE INSTANCED MATRICES at frame #" + this.context.time.frame);
|
|
682
|
+
this.gameObject[NEED_UPDATE_INSTANCE_KEY] = false;
|
|
683
|
+
const remove = false;// Math.random() < .01;
|
|
684
|
+
for (let i = this._handles.length - 1; i >= 0; i--) {
|
|
685
|
+
const h = this._handles[i];
|
|
686
|
+
if (remove) {
|
|
687
|
+
h.remove(this.destroyed);
|
|
688
|
+
this._handles.splice(i, 1);
|
|
689
|
+
}
|
|
690
|
+
else
|
|
691
|
+
h.updateInstanceMatrix();
|
|
692
|
+
}
|
|
693
|
+
this.gameObject.matrixWorldNeedsUpdate = false;
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
if (this._handles && this._handles.length <= 0) {
|
|
698
|
+
GameObject.markAsInstancedRendered(this.gameObject, false);
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
if (this._isInstancingEnabled && this._handles) {
|
|
702
|
+
for (let i = 0; i < this._handles.length; i++) {
|
|
703
|
+
const handle = this._handles[i];
|
|
704
|
+
setCustomVisibility(handle.object, false);
|
|
705
|
+
}
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
if (this.reflectionProbeUsage !== ReflectionProbeUsage.Off && this._reflectionProbe) {
|
|
709
|
+
this._reflectionProbe.onSet(this);
|
|
710
|
+
}
|
|
711
|
+
// since three 163 we need to set the envMap to the scene envMap if it is not set
|
|
712
|
+
// otherwise the envmapIntensity has no effect: https://github.com/mrdoob/three.js/pull/27903
|
|
713
|
+
// internal issue: https://linear.app/needle/issue/NE-6363
|
|
714
|
+
for (const mat of this._sharedMaterials) {
|
|
715
|
+
// If the material has a envMap and is NOT using a reflection probe we set the envMap to the scene environment
|
|
716
|
+
if (mat && "envMap" in mat && "envMapIntensity" in mat && !ReflectionProbe.isUsingReflectionProbe(mat)) {
|
|
717
|
+
mat.envMap = this.context.scene.environment;
|
|
718
|
+
}
|
|
719
|
+
}
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
private onBeforeRenderThree = (_renderer, _scene, _camera, _geometry, material, _group) => {
|
|
723
|
+
if (material.envMapIntensity !== undefined) {
|
|
724
|
+
const factor = this.hasLightmap ? Math.PI : 1;
|
|
725
|
+
const environmentIntensity = this.context.mainCameraComponent?.environmentIntensity ?? 1;
|
|
726
|
+
material.envMapIntensity = Math.max(0, environmentIntensity * this.context.sceneLighting.environmentIntensity / factor);
|
|
727
|
+
}
|
|
728
|
+
|
|
729
|
+
if (this._lightmaps) {
|
|
730
|
+
for (const lm of this._lightmaps) {
|
|
731
|
+
lm.updateLightmapUniforms(material);
|
|
732
|
+
lm.applyLightmap();
|
|
733
|
+
}
|
|
734
|
+
}
|
|
735
|
+
}
|
|
736
|
+
|
|
737
|
+
onAfterRender() {
|
|
738
|
+
if (this._isInstancingEnabled && this._handles) {
|
|
739
|
+
for (let i = 0; i < this._handles.length; i++) {
|
|
740
|
+
const handle = this._handles[i];
|
|
741
|
+
setCustomVisibility(handle.object, true);
|
|
742
|
+
}
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
if (this.reflectionProbeUsage !== ReflectionProbeUsage.Off && this._reflectionProbe) {
|
|
746
|
+
this._reflectionProbe.onUnset(this);
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
if (this.static && this.gameObject.matrixAutoUpdate) {
|
|
750
|
+
this.gameObject.matrixAutoUpdate = false;
|
|
751
|
+
}
|
|
752
|
+
}
|
|
753
|
+
|
|
754
|
+
/** Applies stencil settings for this renderer's objects (if stencil settings are available) */
|
|
755
|
+
applyStencil() {
|
|
756
|
+
NEEDLE_render_objects.applyStencil(this);
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
|
|
760
|
+
|
|
761
|
+
|
|
762
|
+
/** Apply the settings of this renderer to the given object
|
|
763
|
+
* Settings include shadow casting and receiving (e.g. this.receiveShadows, this.shadowCastingMode)
|
|
764
|
+
*/
|
|
765
|
+
applySettings(go: Object3D) {
|
|
766
|
+
go.receiveShadow = this.receiveShadows;
|
|
767
|
+
if (this.shadowCastingMode == ShadowCastingMode.On) {
|
|
768
|
+
go.castShadow = true;
|
|
769
|
+
}
|
|
770
|
+
else go.castShadow = false;
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
private _reflectionProbe: ReflectionProbe | null = null;
|
|
774
|
+
private updateReflectionProbe() {
|
|
775
|
+
// handle reflection probe
|
|
776
|
+
this._reflectionProbe = null;
|
|
777
|
+
if (this.reflectionProbeUsage !== ReflectionProbeUsage.Off) {
|
|
778
|
+
// update the reflection probe right before rendering
|
|
779
|
+
// if we do it immediately the reflection probe might not be enabled yet
|
|
780
|
+
// (since this method is called from onEnable)
|
|
781
|
+
this.startCoroutine(this._updateReflectionProbe(), FrameEvent.LateUpdate);
|
|
782
|
+
|
|
783
|
+
this._probeAnchorLastFrame = this.probeAnchor;
|
|
784
|
+
}
|
|
785
|
+
}
|
|
786
|
+
private *_updateReflectionProbe() {
|
|
787
|
+
const obj = this.probeAnchor || this.gameObject;
|
|
788
|
+
const isAnchor = this.probeAnchor ? true : false;
|
|
789
|
+
this._reflectionProbe = ReflectionProbe.get(obj, this.context, isAnchor, this.probeAnchor);
|
|
790
|
+
}
|
|
791
|
+
|
|
792
|
+
private setVisibility(visible: boolean) {
|
|
793
|
+
|
|
794
|
+
if (!this.isMultiMaterialObject(this.gameObject)) {
|
|
795
|
+
setCustomVisibility(this.gameObject, visible);
|
|
796
|
+
}
|
|
797
|
+
else {
|
|
798
|
+
for (const ch of this.gameObject.children) {
|
|
799
|
+
if (this.isMeshOrSkinnedMesh(ch)) {
|
|
800
|
+
setCustomVisibility(ch, visible);
|
|
801
|
+
}
|
|
802
|
+
}
|
|
803
|
+
}
|
|
804
|
+
}
|
|
805
|
+
|
|
806
|
+
private isMultiMaterialObject(obj: Object3D) {
|
|
807
|
+
return obj.type === "Group";
|
|
808
|
+
}
|
|
809
|
+
|
|
810
|
+
private isMeshOrSkinnedMesh(obj: Object3D): obj is Mesh | SkinnedMesh {
|
|
811
|
+
return obj.type === "Mesh" || obj.type === "SkinnedMesh";
|
|
812
|
+
}
|
|
813
|
+
}
|
|
814
|
+
|
|
815
|
+
export class MeshRenderer extends Renderer {
|
|
816
|
+
}
|
|
817
|
+
|
|
818
|
+
export class SkinnedMeshRenderer extends MeshRenderer {
|
|
819
|
+
|
|
820
|
+
private _needUpdateBoundingSphere = false;
|
|
821
|
+
// private _lastWorldPosition = new Vector3();
|
|
822
|
+
|
|
823
|
+
awake() {
|
|
824
|
+
super.awake();
|
|
825
|
+
if (debugskinnedmesh) console.log("SkinnedMeshRenderer for \"" + this.name + "\"", this);
|
|
826
|
+
// disable skinned mesh occlusion because of https://github.com/mrdoob/js/issues/14499
|
|
827
|
+
this.allowOcclusionWhenDynamic = false;
|
|
828
|
+
|
|
829
|
+
for (const mesh of this.sharedMeshes) {
|
|
830
|
+
// If we don't do that here the bounding sphere matrix used for raycasts will be wrong. Not sure *why* this is necessary
|
|
831
|
+
mesh.parent?.updateWorldMatrix(false, true);
|
|
832
|
+
this.markBoundsDirty();
|
|
833
|
+
}
|
|
834
|
+
}
|
|
835
|
+
onAfterRender(): void {
|
|
836
|
+
super.onAfterRender();
|
|
837
|
+
|
|
838
|
+
// this.gameObject.parent.position.x += Math.sin(this.context.time.time) * .01;
|
|
839
|
+
|
|
840
|
+
// if (this.gameObject instanceof SkinnedMesh && this.gameObject.geometry.boundingSphere) {
|
|
841
|
+
// const bounds = this.gameObject.geometry.boundingSphere;
|
|
842
|
+
// const worldpos = getTempVector().setFromMatrixPosition(this.gameObject.matrixWorld);
|
|
843
|
+
// if (worldpos.distanceTo(this._lastWorldPosition) > bounds.radius) {
|
|
844
|
+
// this._lastWorldPosition.copy(worldpos);
|
|
845
|
+
// this.markBoundsDirty();
|
|
846
|
+
// };
|
|
847
|
+
// }
|
|
848
|
+
|
|
849
|
+
if (this._needUpdateBoundingSphere) {
|
|
850
|
+
for (const mesh of this.sharedMeshes) {
|
|
851
|
+
if (mesh instanceof SkinnedMesh) {
|
|
852
|
+
this._needUpdateBoundingSphere = false;
|
|
853
|
+
try {
|
|
854
|
+
const geometry = mesh.geometry;
|
|
855
|
+
const raycastmesh = getRaycastMesh(mesh);
|
|
856
|
+
if (raycastmesh) {
|
|
857
|
+
mesh.geometry = raycastmesh;
|
|
858
|
+
}
|
|
859
|
+
mesh.computeBoundingSphere();
|
|
860
|
+
mesh.geometry = geometry;
|
|
861
|
+
}
|
|
862
|
+
catch (err) {
|
|
863
|
+
console.error(`Error updating bounding sphere for ${mesh.name}`, err);
|
|
864
|
+
}
|
|
865
|
+
}
|
|
866
|
+
}
|
|
867
|
+
}
|
|
868
|
+
|
|
869
|
+
// if (this.context.time.frame % 30 === 0) this.markBoundsDirty();
|
|
870
|
+
|
|
871
|
+
if (debugskinnedmesh) {
|
|
872
|
+
for (const mesh of this.sharedMeshes) {
|
|
873
|
+
if (mesh instanceof SkinnedMesh && mesh.boundingSphere) {
|
|
874
|
+
const tempCenter = getTempVector(mesh.boundingSphere.center).applyMatrix4(mesh.matrixWorld);
|
|
875
|
+
Gizmos.DrawWireSphere(tempCenter, mesh.boundingSphere.radius, "red");
|
|
876
|
+
}
|
|
877
|
+
}
|
|
878
|
+
}
|
|
879
|
+
}
|
|
880
|
+
|
|
881
|
+
markBoundsDirty() {
|
|
882
|
+
this._needUpdateBoundingSphere = true;
|
|
883
|
+
}
|
|
884
|
+
}
|
|
885
|
+
|
|
886
|
+
export enum ShadowCastingMode {
|
|
887
|
+
/// <summary>
|
|
888
|
+
/// <para>No shadows are cast from this object.</para>
|
|
889
|
+
/// </summary>
|
|
890
|
+
Off,
|
|
891
|
+
/// <summary>
|
|
892
|
+
/// <para>Shadows are cast from this object.</para>
|
|
893
|
+
/// </summary>
|
|
894
|
+
On,
|
|
895
|
+
/// <summary>
|
|
896
|
+
/// <para>Shadows are cast from this object, treating it as two-sided.</para>
|
|
897
|
+
/// </summary>
|
|
898
|
+
TwoSided,
|
|
899
|
+
/// <summary>
|
|
900
|
+
/// <para>Object casts shadows, but is otherwise invisible in the Scene.</para>
|
|
901
|
+
/// </summary>
|
|
902
|
+
ShadowsOnly,
|
|
903
|
+
}
|