@needle-tools/engine 3.28.6-beta → 3.28.7-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +2259 -2253
- package/LICENSE.md +10 -10
- package/README.md +52 -52
- package/dist/needle-engine.js +7 -10
- package/dist/needle-engine.light.js +7 -10
- package/dist/needle-engine.light.min.js +7 -10
- package/dist/needle-engine.light.umd.cjs +7 -10
- package/dist/needle-engine.min.js +7 -10
- package/dist/needle-engine.umd.cjs +7 -10
- package/lib/engine/api.d.ts +52 -52
- package/lib/engine/api.js +51 -51
- package/lib/engine/assets/index.d.ts +1 -1
- package/lib/engine/assets/index.js +4 -4
- package/lib/engine/codegen/register_types.d.ts +1 -1
- package/lib/engine/codegen/register_types.js +439 -439
- package/lib/engine/debug/debug.d.ts +12 -12
- package/lib/engine/debug/debug.js +26 -26
- package/lib/engine/debug/debug_console.d.ts +2 -2
- package/lib/engine/debug/debug_console.js +204 -204
- package/lib/engine/debug/debug_overlay.d.ts +10 -10
- package/lib/engine/debug/debug_overlay.js +277 -277
- package/lib/engine/debug/index.d.ts +1 -1
- package/lib/engine/debug/index.js +1 -1
- package/lib/engine/engine_addressables.d.ts +75 -75
- package/lib/engine/engine_addressables.js +441 -441
- package/lib/engine/engine_application.d.ts +19 -19
- package/lib/engine/engine_application.js +45 -45
- package/lib/engine/engine_assetdatabase.d.ts +25 -25
- package/lib/engine/engine_assetdatabase.js +341 -341
- package/lib/engine/engine_camera.d.ts +6 -6
- package/lib/engine/engine_camera.js +23 -23
- package/lib/engine/engine_components.d.ts +17 -17
- package/lib/engine/engine_components.js +273 -273
- package/lib/engine/engine_components_internal.d.ts +11 -11
- package/lib/engine/engine_components_internal.js +41 -41
- package/lib/engine/engine_constants.d.ts +5 -5
- package/lib/engine/engine_constants.js +32 -32
- package/lib/engine/engine_context.d.ts +269 -269
- package/lib/engine/engine_context.js +1242 -1242
- package/lib/engine/engine_context_registry.d.ts +50 -50
- package/lib/engine/engine_context_registry.js +89 -89
- package/lib/engine/engine_coroutine.d.ts +4 -4
- package/lib/engine/engine_coroutine.js +21 -21
- package/lib/engine/engine_create_objects.d.ts +13 -13
- package/lib/engine/engine_create_objects.js +33 -33
- package/lib/engine/engine_default_parameters.d.ts +2 -2
- package/lib/engine/engine_default_parameters.js +3 -3
- package/lib/engine/engine_editor-sync.d.ts +17 -17
- package/lib/engine/engine_editor-sync.js +7 -7
- package/lib/engine/engine_element.d.ts +55 -55
- package/lib/engine/engine_element.js +559 -559
- package/lib/engine/engine_element_attributes.d.ts +49 -49
- package/lib/engine/engine_element_attributes.js +1 -1
- package/lib/engine/engine_element_extras.d.ts +6 -6
- package/lib/engine/engine_element_extras.js +13 -13
- package/lib/engine/engine_element_loading.d.ts +40 -40
- package/lib/engine/engine_element_loading.js +312 -312
- package/lib/engine/engine_element_overlay.d.ts +19 -19
- package/lib/engine/engine_element_overlay.js +143 -143
- package/lib/engine/engine_fileloader.d.ts +3 -3
- package/lib/engine/engine_fileloader.js +7 -7
- package/lib/engine/engine_gameobject.d.ts +39 -39
- package/lib/engine/engine_gameobject.js +559 -559
- package/lib/engine/engine_generic_utils.d.ts +1 -1
- package/lib/engine/engine_generic_utils.js +13 -13
- package/lib/engine/engine_gizmos.d.ts +26 -26
- package/lib/engine/engine_gizmos.js +282 -282
- package/lib/engine/engine_gltf.d.ts +13 -13
- package/lib/engine/engine_gltf.js +15 -15
- package/lib/engine/engine_gltf_builtin_components.d.ts +7 -7
- package/lib/engine/engine_gltf_builtin_components.js +298 -298
- package/lib/engine/engine_hot_reload.d.ts +5 -5
- package/lib/engine/engine_hot_reload.js +182 -182
- package/lib/engine/engine_input.d.ts +129 -129
- package/lib/engine/engine_input.js +799 -799
- package/lib/engine/engine_input_utils.d.ts +2 -2
- package/lib/engine/engine_input_utils.js +22 -22
- package/lib/engine/engine_instancing.d.ts +16 -16
- package/lib/engine/engine_instancing.js +36 -36
- package/lib/engine/engine_license.d.ts +4 -4
- package/lib/engine/engine_license.js +398 -398
- package/lib/engine/engine_lifecycle_api.d.ts +14 -14
- package/lib/engine/engine_lifecycle_api.js +24 -24
- package/lib/engine/engine_lifecycle_functions_internal.d.ts +6 -6
- package/lib/engine/engine_lifecycle_functions_internal.js +28 -28
- package/lib/engine/engine_lightdata.d.ts +23 -23
- package/lib/engine/engine_lightdata.js +86 -86
- package/lib/engine/engine_loaders.d.ts +7 -7
- package/lib/engine/engine_loaders.js +69 -69
- package/lib/engine/engine_mainloop_utils.d.ts +13 -13
- package/lib/engine/engine_mainloop_utils.js +426 -426
- package/lib/engine/engine_math.d.ts +43 -43
- package/lib/engine/engine_math.js +147 -147
- package/lib/engine/engine_networking.d.ts +176 -176
- package/lib/engine/engine_networking.js +649 -649
- package/lib/engine/engine_networking_auto.d.ts +24 -24
- package/lib/engine/engine_networking_auto.js +324 -324
- package/lib/engine/engine_networking_files.d.ts +23 -23
- package/lib/engine/engine_networking_files.js +176 -176
- package/lib/engine/engine_networking_files_default_components.d.ts +3 -3
- package/lib/engine/engine_networking_files_default_components.js +39 -39
- package/lib/engine/engine_networking_instantiate.d.ts +39 -39
- package/lib/engine/engine_networking_instantiate.js +302 -302
- package/lib/engine/engine_networking_peer.d.ts +15 -15
- package/lib/engine/engine_networking_peer.js +132 -132
- package/lib/engine/engine_networking_streams.d.ts +90 -90
- package/lib/engine/engine_networking_streams.js +428 -428
- package/lib/engine/engine_networking_types.d.ts +14 -14
- package/lib/engine/engine_networking_types.js +7 -7
- package/lib/engine/engine_networking_utils.d.ts +2 -2
- package/lib/engine/engine_networking_utils.js +20 -20
- package/lib/engine/engine_patcher.d.ts +10 -10
- package/lib/engine/engine_patcher.js +142 -142
- package/lib/engine/engine_physics.d.ts +115 -115
- package/lib/engine/engine_physics.js +228 -228
- package/lib/engine/engine_physics.types.d.ts +37 -37
- package/lib/engine/engine_physics.types.js +33 -33
- package/lib/engine/engine_physics_rapier.d.ts +112 -112
- package/lib/engine/engine_physics_rapier.js +1266 -1266
- package/lib/engine/engine_playerview.d.ts +26 -26
- package/lib/engine/engine_playerview.js +64 -64
- package/lib/engine/engine_scenelighting.d.ts +74 -74
- package/lib/engine/engine_scenelighting.js +285 -285
- package/lib/engine/engine_scenetools.d.ts +35 -35
- package/lib/engine/engine_scenetools.js +212 -212
- package/lib/engine/engine_serialization.d.ts +4 -4
- package/lib/engine/engine_serialization.js +4 -4
- package/lib/engine/engine_serialization_builtin_serializer.d.ts +62 -62
- package/lib/engine/engine_serialization_builtin_serializer.js +369 -369
- package/lib/engine/engine_serialization_core.d.ts +84 -84
- package/lib/engine/engine_serialization_core.js +576 -576
- package/lib/engine/engine_serialization_decorator.d.ts +15 -15
- package/lib/engine/engine_serialization_decorator.js +54 -54
- package/lib/engine/engine_setup.d.ts +1 -1
- package/lib/engine/engine_setup.js +2 -2
- package/lib/engine/engine_shaders.d.ts +31 -31
- package/lib/engine/engine_shaders.js +229 -229
- package/lib/engine/engine_shims.d.ts +3 -3
- package/lib/engine/engine_shims.js +22 -22
- package/lib/engine/engine_texture.d.ts +20 -20
- package/lib/engine/engine_texture.js +57 -57
- package/lib/engine/engine_three_utils.d.ts +51 -51
- package/lib/engine/engine_three_utils.js +342 -342
- package/lib/engine/engine_time.d.ts +19 -19
- package/lib/engine/engine_time.js +47 -47
- package/lib/engine/engine_types.d.ts +358 -358
- package/lib/engine/engine_types.js +72 -72
- package/lib/engine/engine_typestore.d.ts +16 -16
- package/lib/engine/engine_typestore.js +35 -35
- package/lib/engine/engine_util_decorator.d.ts +12 -12
- package/lib/engine/engine_util_decorator.js +115 -115
- package/lib/engine/engine_utils.d.ts +104 -104
- package/lib/engine/engine_utils.js +518 -518
- package/lib/engine/engine_utils_screenshot.d.ts +10 -10
- package/lib/engine/engine_utils_screenshot.js +70 -70
- package/lib/engine/engine_web_api.d.ts +12 -12
- package/lib/engine/engine_web_api.js +112 -112
- package/lib/engine/extensions/EXT_texture_exr.d.ts +8 -8
- package/lib/engine/extensions/EXT_texture_exr.js +32 -32
- package/lib/engine/extensions/NEEDLE_animator_controller_model.d.ts +116 -116
- package/lib/engine/extensions/NEEDLE_animator_controller_model.js +91 -91
- package/lib/engine/extensions/NEEDLE_components.d.ts +33 -33
- package/lib/engine/extensions/NEEDLE_components.js +206 -206
- package/lib/engine/extensions/NEEDLE_gameobject_data.d.ts +10 -10
- package/lib/engine/extensions/NEEDLE_gameobject_data.js +57 -57
- package/lib/engine/extensions/NEEDLE_lighting_settings.d.ts +38 -38
- package/lib/engine/extensions/NEEDLE_lighting_settings.js +183 -183
- package/lib/engine/extensions/NEEDLE_lightmaps.d.ts +18 -18
- package/lib/engine/extensions/NEEDLE_lightmaps.js +108 -108
- package/lib/engine/extensions/NEEDLE_persistent_assets.d.ts +11 -11
- package/lib/engine/extensions/NEEDLE_persistent_assets.js +63 -63
- package/lib/engine/extensions/NEEDLE_progressive.d.ts +41 -41
- package/lib/engine/extensions/NEEDLE_progressive.js +366 -366
- package/lib/engine/extensions/NEEDLE_render_objects.d.ts +13 -13
- package/lib/engine/extensions/NEEDLE_render_objects.js +159 -159
- package/lib/engine/extensions/NEEDLE_techniques_webgl.d.ts +39 -39
- package/lib/engine/extensions/NEEDLE_techniques_webgl.js +544 -544
- package/lib/engine/extensions/extension_resolver.d.ts +4 -4
- package/lib/engine/extensions/extension_resolver.js +1 -1
- package/lib/engine/extensions/extension_utils.d.ts +2 -2
- package/lib/engine/extensions/extension_utils.js +140 -140
- package/lib/engine/extensions/extensions.d.ts +21 -21
- package/lib/engine/extensions/extensions.js +94 -94
- package/lib/engine/extensions/index.d.ts +5 -5
- package/lib/engine/extensions/index.js +5 -5
- package/lib/engine/extensions/usage_tracker.d.ts +13 -13
- package/lib/engine/extensions/usage_tracker.js +61 -61
- package/lib/engine/js-extensions/Camera.d.ts +1 -1
- package/lib/engine/js-extensions/Camera.js +36 -36
- package/lib/engine/js-extensions/Layers.d.ts +3 -3
- package/lib/engine/js-extensions/Layers.js +19 -19
- package/lib/engine/js-extensions/index.d.ts +2 -2
- package/lib/engine/js-extensions/index.js +2 -2
- package/lib/engine/shaders/shaderData.d.ts +55 -55
- package/lib/engine/shaders/shaderData.js +58 -58
- package/lib/engine/tests/test_utils.d.ts +2 -2
- package/lib/engine/tests/test_utils.js +53 -53
- package/lib/engine-components/AlignmentConstraint.d.ts +10 -10
- package/lib/engine-components/AlignmentConstraint.js +39 -39
- package/lib/engine-components/Animation.d.ts +53 -53
- package/lib/engine-components/Animation.js +333 -333
- package/lib/engine-components/AnimationCurve.d.ts +16 -16
- package/lib/engine-components/AnimationCurve.js +97 -97
- package/lib/engine-components/AnimationUtils.d.ts +8 -8
- package/lib/engine-components/AnimationUtils.js +110 -110
- package/lib/engine-components/Animator.d.ts +81 -81
- package/lib/engine-components/Animator.js +229 -229
- package/lib/engine-components/AnimatorController.d.ts +57 -57
- package/lib/engine-components/AnimatorController.js +887 -887
- package/lib/engine-components/AudioListener.d.ts +7 -7
- package/lib/engine-components/AudioListener.js +30 -30
- package/lib/engine-components/AudioSource.d.ts +61 -61
- package/lib/engine-components/AudioSource.js +422 -422
- package/lib/engine-components/AvatarLoader.d.ts +19 -19
- package/lib/engine-components/AvatarLoader.js +173 -173
- package/lib/engine-components/AxesHelper.d.ts +9 -9
- package/lib/engine-components/AxesHelper.js +44 -44
- package/lib/engine-components/BasicIKConstraint.d.ts +9 -9
- package/lib/engine-components/BasicIKConstraint.js +43 -43
- package/lib/engine-components/BoxHelperComponent.d.ts +16 -16
- package/lib/engine-components/BoxHelperComponent.js +89 -89
- package/lib/engine-components/Camera.d.ts +70 -70
- package/lib/engine-components/Camera.js +450 -450
- package/lib/engine-components/CameraUtils.d.ts +1 -1
- package/lib/engine-components/CameraUtils.js +77 -77
- package/lib/engine-components/CharacterController.d.ts +46 -46
- package/lib/engine-components/CharacterController.js +227 -227
- package/lib/engine-components/Collider.d.ts +46 -46
- package/lib/engine-components/Collider.js +153 -153
- package/lib/engine-components/Component.d.ts +228 -228
- package/lib/engine-components/Component.js +541 -541
- package/lib/engine-components/ContactShadows.d.ts +23 -23
- package/lib/engine-components/ContactShadows.js +233 -233
- package/lib/engine-components/DeleteBox.d.ts +9 -9
- package/lib/engine-components/DeleteBox.js +30 -30
- package/lib/engine-components/DeviceFlag.d.ts +12 -12
- package/lib/engine-components/DeviceFlag.js +43 -43
- package/lib/engine-components/DragControls.d.ts +51 -51
- package/lib/engine-components/DragControls.js +516 -516
- package/lib/engine-components/DropListener.d.ts +15 -15
- package/lib/engine-components/DropListener.js +120 -120
- package/lib/engine-components/Duplicatable.d.ts +16 -16
- package/lib/engine-components/Duplicatable.js +150 -150
- package/lib/engine-components/EventList.d.ts +28 -28
- package/lib/engine-components/EventList.js +105 -105
- package/lib/engine-components/EventTrigger.d.ts +12 -12
- package/lib/engine-components/EventTrigger.js +50 -50
- package/lib/engine-components/EventType.d.ts +19 -19
- package/lib/engine-components/EventType.js +71 -71
- package/lib/engine-components/FlyControls.d.ts +7 -7
- package/lib/engine-components/FlyControls.js +25 -25
- package/lib/engine-components/Fog.d.ts +20 -20
- package/lib/engine-components/Fog.js +60 -60
- package/lib/engine-components/Gizmos.d.ts +12 -12
- package/lib/engine-components/Gizmos.js +60 -60
- package/lib/engine-components/GridHelper.d.ts +12 -12
- package/lib/engine-components/GridHelper.js +47 -47
- package/lib/engine-components/GroundProjection.d.ts +21 -21
- package/lib/engine-components/GroundProjection.js +97 -97
- package/lib/engine-components/Interactable.d.ts +10 -10
- package/lib/engine-components/Interactable.js +11 -11
- package/lib/engine-components/Joints.d.ts +19 -19
- package/lib/engine-components/Joints.js +51 -51
- package/lib/engine-components/LODGroup.d.ts +30 -30
- package/lib/engine-components/LODGroup.js +145 -145
- package/lib/engine-components/Light.d.ts +75 -75
- package/lib/engine-components/Light.js +475 -475
- package/lib/engine-components/LookAtConstraint.d.ts +7 -7
- package/lib/engine-components/LookAtConstraint.js +17 -17
- package/lib/engine-components/NestedGltf.d.ts +11 -11
- package/lib/engine-components/NestedGltf.js +74 -74
- package/lib/engine-components/Networking.d.ts +11 -11
- package/lib/engine-components/Networking.js +70 -70
- package/lib/engine-components/OffsetConstraint.d.ts +14 -14
- package/lib/engine-components/OffsetConstraint.js +65 -65
- package/lib/engine-components/OrbitControls.d.ts +111 -111
- package/lib/engine-components/OrbitControls.js +646 -646
- package/lib/engine-components/ParticleSystem.d.ts +145 -145
- package/lib/engine-components/ParticleSystem.js +1077 -1077
- package/lib/engine-components/ParticleSystemModules.d.ts +489 -489
- package/lib/engine-components/ParticleSystemModules.js +1667 -1667
- package/lib/engine-components/ParticleSystemSubEmitter.d.ts +25 -25
- package/lib/engine-components/ParticleSystemSubEmitter.js +86 -86
- package/lib/engine-components/PlayerColor.d.ts +13 -13
- package/lib/engine-components/PlayerColor.js +83 -83
- package/lib/engine-components/ReflectionProbe.d.ts +22 -22
- package/lib/engine-components/ReflectionProbe.js +181 -181
- package/lib/engine-components/Renderer.d.ts +112 -112
- package/lib/engine-components/Renderer.js +1029 -1029
- package/lib/engine-components/RendererLightmap.d.ts +19 -19
- package/lib/engine-components/RendererLightmap.js +127 -127
- package/lib/engine-components/RigidBody.d.ts +120 -120
- package/lib/engine-components/RigidBody.js +452 -452
- package/lib/engine-components/SceneSwitcher.d.ts +72 -72
- package/lib/engine-components/SceneSwitcher.js +583 -583
- package/lib/engine-components/ScreenCapture.d.ts +64 -64
- package/lib/engine-components/ScreenCapture.js +405 -405
- package/lib/engine-components/ShadowCatcher.d.ts +18 -18
- package/lib/engine-components/ShadowCatcher.js +144 -144
- package/lib/engine-components/Skybox.d.ts +23 -23
- package/lib/engine-components/Skybox.js +287 -287
- package/lib/engine-components/SmoothFollow.d.ts +14 -14
- package/lib/engine-components/SmoothFollow.js +63 -63
- package/lib/engine-components/SpatialTrigger.d.ts +27 -27
- package/lib/engine-components/SpatialTrigger.js +144 -144
- package/lib/engine-components/SpectatorCamera.d.ts +45 -45
- package/lib/engine-components/SpectatorCamera.js +593 -593
- package/lib/engine-components/SpriteRenderer.d.ts +48 -48
- package/lib/engine-components/SpriteRenderer.js +257 -257
- package/lib/engine-components/SyncedCamera.d.ts +27 -27
- package/lib/engine-components/SyncedCamera.js +187 -187
- package/lib/engine-components/SyncedRoom.d.ts +24 -24
- package/lib/engine-components/SyncedRoom.js +162 -162
- package/lib/engine-components/SyncedTransform.d.ts +35 -35
- package/lib/engine-components/SyncedTransform.js +265 -265
- package/lib/engine-components/TestRunner.d.ts +13 -13
- package/lib/engine-components/TestRunner.js +99 -99
- package/lib/engine-components/TransformGizmo.d.ts +16 -16
- package/lib/engine-components/TransformGizmo.js +148 -148
- package/lib/engine-components/VideoPlayer.d.ts +86 -86
- package/lib/engine-components/VideoPlayer.js +792 -792
- package/lib/engine-components/Voip.d.ts +29 -29
- package/lib/engine-components/Voip.js +203 -203
- package/lib/engine-components/XRFlag.d.ts +33 -33
- package/lib/engine-components/XRFlag.js +128 -128
- package/lib/engine-components/api.d.ts +15 -15
- package/lib/engine-components/api.js +15 -15
- package/lib/engine-components/avatar/AvatarBlink_Simple.d.ts +10 -10
- package/lib/engine-components/avatar/AvatarBlink_Simple.js +75 -75
- package/lib/engine-components/avatar/AvatarEyeLook_Rotation.d.ts +13 -13
- package/lib/engine-components/avatar/AvatarEyeLook_Rotation.js +74 -74
- package/lib/engine-components/avatar/Avatar_Brain_LookAt.d.ts +27 -27
- package/lib/engine-components/avatar/Avatar_Brain_LookAt.js +119 -119
- package/lib/engine-components/avatar/Avatar_MouthShapes.d.ts +13 -13
- package/lib/engine-components/avatar/Avatar_MouthShapes.js +78 -78
- package/lib/engine-components/avatar/Avatar_MustacheShake.d.ts +8 -8
- package/lib/engine-components/avatar/Avatar_MustacheShake.js +28 -28
- package/lib/engine-components/codegen/components.d.ts +216 -216
- package/lib/engine-components/codegen/components.js +217 -217
- package/lib/engine-components/debug/LogStats.d.ts +5 -5
- package/lib/engine-components/debug/LogStats.js +18 -18
- package/lib/engine-components/export/gltf/GltfExport.d.ts +25 -25
- package/lib/engine-components/export/gltf/GltfExport.js +215 -215
- package/lib/engine-components/export/index.d.ts +1 -1
- package/lib/engine-components/export/index.js +1 -1
- package/lib/engine-components/export/usdz/Extension.d.ts +10 -10
- package/lib/engine-components/export/usdz/Extension.js +1 -1
- package/lib/engine-components/export/usdz/ThreeUSDZExporter.d.ts +114 -114
- package/lib/engine-components/export/usdz/ThreeUSDZExporter.js +1211 -1211
- package/lib/engine-components/export/usdz/USDZExporter.d.ts +59 -59
- package/lib/engine-components/export/usdz/USDZExporter.js +450 -450
- package/lib/engine-components/export/usdz/extensions/Animation.d.ts +69 -69
- package/lib/engine-components/export/usdz/extensions/Animation.js +650 -650
- package/lib/engine-components/export/usdz/extensions/DocumentExtension.d.ts +5 -5
- package/lib/engine-components/export/usdz/extensions/DocumentExtension.js +6 -6
- package/lib/engine-components/export/usdz/extensions/USDZText.d.ts +55 -55
- package/lib/engine-components/export/usdz/extensions/USDZText.js +246 -246
- package/lib/engine-components/export/usdz/extensions/USDZUI.d.ts +8 -8
- package/lib/engine-components/export/usdz/extensions/USDZUI.js +100 -100
- package/lib/engine-components/export/usdz/extensions/behavior/Actions.d.ts +30 -30
- package/lib/engine-components/export/usdz/extensions/behavior/Actions.js +88 -88
- package/lib/engine-components/export/usdz/extensions/behavior/AudioExtension.d.ts +9 -9
- package/lib/engine-components/export/usdz/extensions/behavior/AudioExtension.js +52 -52
- package/lib/engine-components/export/usdz/extensions/behavior/Behaviour.d.ts +22 -22
- package/lib/engine-components/export/usdz/extensions/behavior/Behaviour.js +134 -134
- package/lib/engine-components/export/usdz/extensions/behavior/BehaviourComponents.d.ts +126 -126
- package/lib/engine-components/export/usdz/extensions/behavior/BehaviourComponents.js +824 -824
- package/lib/engine-components/export/usdz/extensions/behavior/BehavioursBuilder.d.ts +133 -133
- package/lib/engine-components/export/usdz/extensions/behavior/BehavioursBuilder.js +464 -464
- package/lib/engine-components/export/usdz/index.d.ts +3 -3
- package/lib/engine-components/export/usdz/index.js +2 -2
- package/lib/engine-components/export/usdz/utils/animationutils.d.ts +3 -3
- package/lib/engine-components/export/usdz/utils/animationutils.js +85 -85
- package/lib/engine-components/export/usdz/utils/quicklook.d.ts +2 -2
- package/lib/engine-components/export/usdz/utils/quicklook.js +35 -35
- package/lib/engine-components/export/usdz/utils/timeutils.d.ts +1 -1
- package/lib/engine-components/export/usdz/utils/timeutils.js +14 -14
- package/lib/engine-components/js-extensions/ExtensionUtils.d.ts +6 -6
- package/lib/engine-components/js-extensions/ExtensionUtils.js +65 -65
- package/lib/engine-components/js-extensions/Object3D.d.ts +2 -2
- package/lib/engine-components/js-extensions/Object3D.js +140 -140
- package/lib/engine-components/js-extensions/RGBAColor.d.ts +14 -14
- package/lib/engine-components/js-extensions/RGBAColor.js +49 -49
- package/lib/engine-components/js-extensions/index.d.ts +3 -3
- package/lib/engine-components/js-extensions/index.js +3 -3
- package/lib/engine-components/postprocessing/Effects/Antialiasing.d.ts +13 -13
- package/lib/engine-components/postprocessing/Effects/Antialiasing.js +45 -45
- package/lib/engine-components/postprocessing/Effects/Bloom.d.ts +12 -12
- package/lib/engine-components/postprocessing/Effects/Bloom.js +77 -77
- package/lib/engine-components/postprocessing/Effects/ChromaticAberration.d.ts +8 -8
- package/lib/engine-components/postprocessing/Effects/ChromaticAberration.js +38 -38
- package/lib/engine-components/postprocessing/Effects/ColorAdjustments.d.ts +12 -12
- package/lib/engine-components/postprocessing/Effects/ColorAdjustments.js +81 -81
- package/lib/engine-components/postprocessing/Effects/DepthOfField.d.ts +21 -21
- package/lib/engine-components/postprocessing/Effects/DepthOfField.js +97 -97
- package/lib/engine-components/postprocessing/Effects/Pixelation.d.ts +7 -7
- package/lib/engine-components/postprocessing/Effects/Pixelation.js +28 -28
- package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusion.d.ts +13 -13
- package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusion.js +86 -86
- package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.d.ts +24 -24
- package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.js +94 -94
- package/lib/engine-components/postprocessing/Effects/TiltShiftEffect.d.ts +13 -13
- package/lib/engine-components/postprocessing/Effects/TiltShiftEffect.js +62 -62
- package/lib/engine-components/postprocessing/Effects/Tonemapping.d.ts +16 -16
- package/lib/engine-components/postprocessing/Effects/Tonemapping.js +51 -51
- package/lib/engine-components/postprocessing/Effects/Vignette.d.ts +11 -11
- package/lib/engine-components/postprocessing/Effects/Vignette.js +56 -56
- package/lib/engine-components/postprocessing/PostProcessingEffect.d.ts +33 -33
- package/lib/engine-components/postprocessing/PostProcessingEffect.js +126 -126
- package/lib/engine-components/postprocessing/PostProcessingHandler.d.ts +22 -22
- package/lib/engine-components/postprocessing/PostProcessingHandler.js +201 -201
- package/lib/engine-components/postprocessing/Volume.d.ts +25 -25
- package/lib/engine-components/postprocessing/Volume.js +193 -193
- package/lib/engine-components/postprocessing/VolumeParameter.d.ts +22 -22
- package/lib/engine-components/postprocessing/VolumeParameter.js +80 -80
- package/lib/engine-components/postprocessing/VolumeProfile.d.ts +7 -7
- package/lib/engine-components/postprocessing/VolumeProfile.js +41 -41
- package/lib/engine-components/postprocessing/index.d.ts +4 -4
- package/lib/engine-components/postprocessing/index.js +4 -4
- package/lib/engine-components/timeline/PlayableDirector.d.ts +107 -107
- package/lib/engine-components/timeline/PlayableDirector.js +624 -624
- package/lib/engine-components/timeline/SignalAsset.d.ts +18 -18
- package/lib/engine-components/timeline/SignalAsset.js +124 -124
- package/lib/engine-components/timeline/TimelineModels.d.ts +88 -88
- package/lib/engine-components/timeline/TimelineModels.js +22 -22
- package/lib/engine-components/timeline/TimelineTracks.d.ts +90 -90
- package/lib/engine-components/timeline/TimelineTracks.js +825 -825
- package/lib/engine-components/timeline/index.d.ts +4 -4
- package/lib/engine-components/timeline/index.js +3 -3
- package/lib/engine-components/ui/BaseUIComponent.d.ts +31 -31
- package/lib/engine-components/ui/BaseUIComponent.js +161 -161
- package/lib/engine-components/ui/Button.d.ts +56 -56
- package/lib/engine-components/ui/Button.js +282 -282
- package/lib/engine-components/ui/Canvas.d.ts +67 -67
- package/lib/engine-components/ui/Canvas.js +382 -382
- package/lib/engine-components/ui/CanvasGroup.d.ts +15 -15
- package/lib/engine-components/ui/CanvasGroup.js +53 -53
- package/lib/engine-components/ui/EventSystem.d.ts +102 -102
- package/lib/engine-components/ui/EventSystem.js +641 -641
- package/lib/engine-components/ui/Graphic.d.ts +45 -45
- package/lib/engine-components/ui/Graphic.js +236 -236
- package/lib/engine-components/ui/Image.d.ts +27 -27
- package/lib/engine-components/ui/Image.js +107 -107
- package/lib/engine-components/ui/InputField.d.ts +34 -34
- package/lib/engine-components/ui/InputField.js +234 -234
- package/lib/engine-components/ui/Interfaces.d.ts +38 -38
- package/lib/engine-components/ui/Interfaces.js +12 -12
- package/lib/engine-components/ui/Layout.d.ts +72 -72
- package/lib/engine-components/ui/Layout.js +318 -318
- package/lib/engine-components/ui/Outline.d.ts +7 -7
- package/lib/engine-components/ui/Outline.js +20 -20
- package/lib/engine-components/ui/PointerEvents.d.ts +64 -64
- package/lib/engine-components/ui/PointerEvents.js +68 -68
- package/lib/engine-components/ui/RaycastUtils.d.ts +11 -11
- package/lib/engine-components/ui/RaycastUtils.js +67 -67
- package/lib/engine-components/ui/Raycaster.d.ts +18 -18
- package/lib/engine-components/ui/Raycaster.js +69 -69
- package/lib/engine-components/ui/RectTransform.d.ts +61 -61
- package/lib/engine-components/ui/RectTransform.js +343 -343
- package/lib/engine-components/ui/SpatialHtml.d.ts +6 -6
- package/lib/engine-components/ui/SpatialHtml.js +57 -57
- package/lib/engine-components/ui/Text.d.ts +74 -74
- package/lib/engine-components/ui/Text.js +534 -534
- package/lib/engine-components/ui/Utils.d.ts +23 -23
- package/lib/engine-components/ui/Utils.js +90 -90
- package/lib/engine-components/ui/index.d.ts +1 -1
- package/lib/engine-components/ui/index.js +1 -1
- package/lib/engine-components/utils/LookAt.d.ts +13 -13
- package/lib/engine-components/utils/LookAt.js +59 -59
- package/lib/engine-components/utils/OpenURL.d.ts +21 -21
- package/lib/engine-components/utils/OpenURL.js +124 -124
- package/lib/engine-components/webxr/WebARCameraBackground.d.ts +19 -19
- package/lib/engine-components/webxr/WebARCameraBackground.js +193 -193
- package/lib/engine-components/webxr/WebARSessionRoot.d.ts +38 -38
- package/lib/engine-components/webxr/WebARSessionRoot.js +407 -407
- package/lib/engine-components/webxr/WebXR.d.ts +110 -110
- package/lib/engine-components/webxr/WebXR.js +672 -672
- package/lib/engine-components/webxr/WebXRAvatar.d.ts +61 -61
- package/lib/engine-components/webxr/WebXRAvatar.js +289 -289
- package/lib/engine-components/webxr/WebXRController.d.ts +154 -154
- package/lib/engine-components/webxr/WebXRController.js +1028 -1028
- package/lib/engine-components/webxr/WebXRGrabRendering.d.ts +42 -42
- package/lib/engine-components/webxr/WebXRGrabRendering.js +137 -137
- package/lib/engine-components/webxr/WebXRImageTracking.d.ts +49 -49
- package/lib/engine-components/webxr/WebXRImageTracking.js +336 -336
- package/lib/engine-components/webxr/WebXRPlaneTracking.d.ts +49 -49
- package/lib/engine-components/webxr/WebXRPlaneTracking.js +372 -372
- package/lib/engine-components/webxr/WebXRRig.d.ts +4 -4
- package/lib/engine-components/webxr/WebXRRig.js +19 -19
- package/lib/engine-components/webxr/WebXRSync.d.ts +54 -54
- package/lib/engine-components/webxr/WebXRSync.js +410 -410
- package/lib/engine-components/webxr/index.d.ts +4 -4
- package/lib/engine-components/webxr/index.js +4 -4
- package/lib/engine-components-experimental/Presentation.d.ts +6 -6
- package/lib/engine-components-experimental/Presentation.js +9 -9
- package/lib/engine-components-experimental/api.d.ts +1 -1
- package/lib/engine-components-experimental/api.js +1 -1
- package/lib/engine-components-experimental/networking/PlayerSync.d.ts +50 -50
- package/lib/engine-components-experimental/networking/PlayerSync.js +200 -200
- package/lib/engine-schemes/api.d.ts +1 -1
- package/lib/engine-schemes/api.js +1 -1
- package/lib/engine-schemes/schemes.d.ts +7 -7
- package/lib/engine-schemes/schemes.js +19 -19
- package/lib/engine-schemes/synced-camera-model.d.ts +25 -25
- package/lib/engine-schemes/synced-camera-model.js +67 -67
- package/lib/engine-schemes/synced-transform-model.d.ts +31 -31
- package/lib/engine-schemes/synced-transform-model.js +66 -66
- package/lib/engine-schemes/transform.d.ts +12 -12
- package/lib/engine-schemes/transform.js +39 -39
- package/lib/engine-schemes/vec3.d.ts +11 -11
- package/lib/engine-schemes/vec3.js +29 -29
- package/lib/engine-schemes/vec4.d.ts +12 -12
- package/lib/engine-schemes/vec4.js +33 -33
- package/lib/engine-schemes/vr-user-state-buffer.d.ts +36 -36
- package/lib/engine-schemes/vr-user-state-buffer.js +103 -103
- package/lib/include/three/ARButton.d.ts +3 -3
- package/lib/include/three/ARButton.js +151 -151
- package/lib/include/three/EXT_mesh_gpu_instancing_exporter.d.ts +6 -6
- package/lib/include/three/EXT_mesh_gpu_instancing_exporter.js +45 -45
- package/lib/include/three/VRButton.d.ts +5 -5
- package/lib/include/three/VRButton.js +118 -118
- package/lib/needle-engine.d.ts +6 -6
- package/lib/needle-engine.js +49 -49
- package/package.json +1 -1
- package/plugins/common/config.cjs +14 -14
- package/plugins/common/config.js +19 -19
- package/plugins/common/generator.js +10 -10
- package/plugins/common/license.cjs +30 -30
- package/plugins/common/version.js +11 -11
- package/plugins/next/license.cjs +4 -4
- package/plugins/next/next.js +70 -70
- package/plugins/types/index.d.ts +1 -1
- package/plugins/types/needleConfig.d.ts +21 -21
- package/plugins/types/userconfig.d.ts +42 -42
- package/plugins/vite/alias.js +70 -70
- package/plugins/vite/build.js +19 -19
- package/plugins/vite/config.js +73 -73
- package/plugins/vite/copyfiles.js +134 -134
- package/plugins/vite/defines.js +45 -45
- package/plugins/vite/dependency-watcher.js +224 -224
- package/plugins/vite/drop-client.js +76 -76
- package/plugins/vite/drop.js +82 -82
- package/plugins/vite/editor-connection.js +121 -121
- package/plugins/vite/facebook-instant-games.js +99 -99
- package/plugins/vite/gzip.js +5 -5
- package/plugins/vite/imports-logger.js +143 -143
- package/plugins/vite/index.js +81 -81
- package/plugins/vite/license.js +42 -42
- package/plugins/vite/meta.js +149 -149
- package/plugins/vite/peer.js +31 -31
- package/plugins/vite/poster-client.js +59 -59
- package/plugins/vite/poster.js +73 -73
- package/plugins/vite/reload-client.js +15 -15
- package/plugins/vite/reload.js +363 -363
- package/plugins/vite/transform-codegen.js +55 -55
- package/plugins/vite/vite-4.4-hack.js +31 -31
- package/src/engine/api.ts +54 -54
- package/src/engine/assets/index.ts +4 -4
- package/src/engine/codegen/register_types.ts +441 -441
- package/src/engine/debug/debug.ts +29 -29
- package/src/engine/debug/debug_console.ts +213 -213
- package/src/engine/debug/debug_overlay.ts +283 -283
- package/src/engine/engine.ts +13 -13
- package/src/engine/engine_addressables.ts +494 -494
- package/src/engine/engine_application.ts +53 -53
- package/src/engine/engine_assetdatabase.ts +383 -383
- package/src/engine/engine_camera.ts +32 -32
- package/src/engine/engine_components.ts +266 -266
- package/src/engine/engine_components_internal.ts +42 -42
- package/src/engine/engine_constants.ts +42 -42
- package/src/engine/engine_context.ts +1386 -1386
- package/src/engine/engine_context_registry.ts +103 -103
- package/src/engine/engine_coroutine.ts +24 -24
- package/src/engine/engine_create_objects.ts +39 -39
- package/src/engine/engine_default_parameters.ts +3 -3
- package/src/engine/engine_editor-sync.ts +29 -29
- package/src/engine/engine_element.ts +592 -592
- package/src/engine/engine_element_attributes.ts +61 -61
- package/src/engine/engine_element_extras.ts +16 -16
- package/src/engine/engine_element_loading.ts +341 -341
- package/src/engine/engine_element_overlay.ts +160 -160
- package/src/engine/engine_fileloader.js +8 -8
- package/src/engine/engine_gameobject.ts +621 -621
- package/src/engine/engine_generic_utils.js +13 -13
- package/src/engine/engine_gizmos.ts +321 -321
- package/src/engine/engine_gltf.ts +30 -30
- package/src/engine/engine_gltf_builtin_components.ts +350 -350
- package/src/engine/engine_hot_reload.ts +196 -196
- package/src/engine/engine_input.ts +879 -879
- package/src/engine/engine_input_utils.ts +23 -23
- package/src/engine/engine_instancing.ts +42 -42
- package/src/engine/engine_license.ts +413 -413
- package/src/engine/engine_lifecycle_api.ts +29 -29
- package/src/engine/engine_lifecycle_functions_internal.ts +36 -36
- package/src/engine/engine_lightdata.ts +113 -113
- package/src/engine/engine_loaders.ts +77 -77
- package/src/engine/engine_mainloop_utils.ts +431 -431
- package/src/engine/engine_math.ts +174 -174
- package/src/engine/engine_networking.ts +742 -742
- package/src/engine/engine_networking_auto.ts +373 -373
- package/src/engine/engine_networking_files.ts +206 -206
- package/src/engine/engine_networking_files_default_components.ts +54 -54
- package/src/engine/engine_networking_instantiate.ts +362 -362
- package/src/engine/engine_networking_peer.ts +158 -158
- package/src/engine/engine_networking_streams.ts +489 -489
- package/src/engine/engine_networking_types.ts +18 -18
- package/src/engine/engine_networking_utils.ts +23 -23
- package/src/engine/engine_networking_websocket.ts +2 -2
- package/src/engine/engine_patcher.ts +199 -199
- package/src/engine/engine_physics.ts +287 -287
- package/src/engine/engine_physics.types.ts +43 -43
- package/src/engine/engine_physics_rapier.ts +1385 -1385
- package/src/engine/engine_playerview.ts +79 -79
- package/src/engine/engine_scenelighting.ts +313 -313
- package/src/engine/engine_scenetools.ts +242 -242
- package/src/engine/engine_serialization.ts +6 -6
- package/src/engine/engine_serialization_builtin_serializer.ts +415 -415
- package/src/engine/engine_serialization_core.ts +680 -680
- package/src/engine/engine_serialization_decorator.ts +68 -68
- package/src/engine/engine_setup.ts +1 -1
- package/src/engine/engine_shaders.ts +242 -242
- package/src/engine/engine_shims.ts +28 -28
- package/src/engine/engine_texture.ts +70 -70
- package/src/engine/engine_three_utils.ts +382 -382
- package/src/engine/engine_time.ts +55 -55
- package/src/engine/engine_types.ts +489 -489
- package/src/engine/engine_typestore.ts +41 -41
- package/src/engine/engine_util_decorator.ts +134 -134
- package/src/engine/engine_utils.ts +605 -605
- package/src/engine/engine_utils_screenshot.ts +84 -84
- package/src/engine/engine_web_api.ts +119 -119
- package/src/engine/extensions/EXT_texture_exr.ts +49 -49
- package/src/engine/extensions/NEEDLE_animator_controller_model.ts +193 -193
- package/src/engine/extensions/NEEDLE_components.ts +250 -250
- package/src/engine/extensions/NEEDLE_gameobject_data.ts +82 -82
- package/src/engine/extensions/NEEDLE_lighting_settings.ts +210 -210
- package/src/engine/extensions/NEEDLE_lightmaps.ts +130 -130
- package/src/engine/extensions/NEEDLE_persistent_assets.ts +75 -75
- package/src/engine/extensions/NEEDLE_progressive.ts +412 -412
- package/src/engine/extensions/NEEDLE_render_objects.ts +209 -209
- package/src/engine/extensions/NEEDLE_techniques_webgl.ts +618 -618
- package/src/engine/extensions/extension_resolver.ts +4 -4
- package/src/engine/extensions/extension_utils.ts +149 -149
- package/src/engine/extensions/extensions.ts +118 -118
- package/src/engine/extensions/index.ts +4 -4
- package/src/engine/extensions/usage_tracker.ts +95 -95
- package/src/engine/js-extensions/Camera.ts +34 -34
- package/src/engine/js-extensions/Layers.ts +19 -19
- package/src/engine/js-extensions/index.ts +1 -1
- package/src/engine/shaders/shaderData.ts +67 -67
- package/src/engine/tests/test_utils.ts +63 -63
- package/src/engine-components/AlignmentConstraint.ts +35 -35
- package/src/engine-components/Animation.ts +345 -345
- package/src/engine-components/AnimationCurve.ts +83 -83
- package/src/engine-components/AnimationUtils.ts +117 -117
- package/src/engine-components/Animator.ts +243 -243
- package/src/engine-components/AnimatorController.ts +1020 -1020
- package/src/engine-components/AudioListener.ts +32 -32
- package/src/engine-components/AudioSource.ts +419 -419
- package/src/engine-components/AvatarLoader.ts +204 -204
- package/src/engine-components/AxesHelper.ts +33 -33
- package/src/engine-components/BasicIKConstraint.ts +53 -53
- package/src/engine-components/BoxCollider.ts +1 -1
- package/src/engine-components/BoxHelperComponent.ts +100 -100
- package/src/engine-components/Camera.ts +454 -454
- package/src/engine-components/CameraUtils.ts +89 -89
- package/src/engine-components/CharacterController.ts +243 -243
- package/src/engine-components/Collider.ts +160 -160
- package/src/engine-components/Component.ts +670 -670
- package/src/engine-components/ContactShadows.ts +265 -265
- package/src/engine-components/DeleteBox.ts +35 -35
- package/src/engine-components/DeviceFlag.ts +42 -42
- package/src/engine-components/DragControls.ts +574 -574
- package/src/engine-components/DropListener.ts +112 -112
- package/src/engine-components/Duplicatable.ts +146 -146
- package/src/engine-components/EventList.ts +125 -125
- package/src/engine-components/EventTrigger.ts +47 -47
- package/src/engine-components/EventType.ts +87 -87
- package/src/engine-components/FlyControls.ts +31 -31
- package/src/engine-components/Fog.ts +59 -59
- package/src/engine-components/Gizmos.ts +52 -52
- package/src/engine-components/GridHelper.ts +40 -40
- package/src/engine-components/GroundProjection.ts +97 -97
- package/src/engine-components/Interactable.ts +18 -18
- package/src/engine-components/Joints.ts +51 -51
- package/src/engine-components/LODGroup.ts +145 -145
- package/src/engine-components/Light.ts +493 -493
- package/src/engine-components/LookAtConstraint.ts +11 -11
- package/src/engine-components/NestedGltf.ts +70 -70
- package/src/engine-components/Networking.ts +72 -72
- package/src/engine-components/OffsetConstraint.ts +59 -59
- package/src/engine-components/OrbitControls.ts +653 -653
- package/src/engine-components/ParticleSystem.ts +1192 -1192
- package/src/engine-components/ParticleSystemModules.ts +1481 -1481
- package/src/engine-components/ParticleSystemSubEmitter.ts +110 -110
- package/src/engine-components/PlayerColor.ts +93 -93
- package/src/engine-components/ReflectionProbe.ts +192 -192
- package/src/engine-components/Renderer.ts +1125 -1125
- package/src/engine-components/RendererLightmap.ts +145 -145
- package/src/engine-components/RigidBody.ts +453 -453
- package/src/engine-components/SceneSwitcher.ts +594 -594
- package/src/engine-components/ScreenCapture.ts +437 -437
- package/src/engine-components/ShadowCatcher.ts +149 -149
- package/src/engine-components/Skybox.ts +281 -281
- package/src/engine-components/SmoothFollow.ts +57 -57
- package/src/engine-components/SpatialTrigger.ts +142 -142
- package/src/engine-components/SpectatorCamera.ts +675 -675
- package/src/engine-components/SphereCollider.ts +1 -1
- package/src/engine-components/SpriteRenderer.ts +244 -244
- package/src/engine-components/SyncedCamera.ts +208 -208
- package/src/engine-components/SyncedRoom.ts +166 -166
- package/src/engine-components/SyncedTransform.ts +336 -336
- package/src/engine-components/TestRunner.ts +114 -114
- package/src/engine-components/TransformGizmo.ts +157 -157
- package/src/engine-components/VideoPlayer.ts +831 -831
- package/src/engine-components/Voip.ts +214 -214
- package/src/engine-components/XRFlag.ts +138 -138
- package/src/engine-components/api.ts +22 -22
- package/src/engine-components/avatar/AvatarBlink_Simple.ts +67 -67
- package/src/engine-components/avatar/AvatarEyeLook_Rotation.ts +68 -68
- package/src/engine-components/avatar/Avatar_Brain_LookAt.ts +136 -136
- package/src/engine-components/avatar/Avatar_MouthShapes.ts +81 -81
- package/src/engine-components/avatar/Avatar_MustacheShake.ts +28 -28
- package/src/engine-components/codegen/components.ts +216 -216
- package/src/engine-components/debug/LogStats.ts +21 -21
- package/src/engine-components/export/gltf/GltfExport.ts +231 -231
- package/src/engine-components/export/usdz/Extension.ts +11 -11
- package/src/engine-components/export/usdz/ThreeUSDZExporter.ts +1773 -1773
- package/src/engine-components/export/usdz/USDZExporter.ts +477 -477
- package/src/engine-components/export/usdz/extensions/Animation.ts +774 -774
- package/src/engine-components/export/usdz/extensions/DocumentExtension.ts +9 -9
- package/src/engine-components/export/usdz/extensions/USDZText.ts +287 -287
- package/src/engine-components/export/usdz/extensions/USDZUI.ts +119 -119
- package/src/engine-components/export/usdz/extensions/behavior/Actions.ts +98 -98
- package/src/engine-components/export/usdz/extensions/behavior/AudioExtension.ts +67 -67
- package/src/engine-components/export/usdz/extensions/behavior/Behaviour.ts +202 -202
- package/src/engine-components/export/usdz/extensions/behavior/BehaviourComponents.ts +963 -963
- package/src/engine-components/export/usdz/extensions/behavior/BehavioursBuilder.ts +517 -517
- package/src/engine-components/export/usdz/index.ts +2 -2
- package/src/engine-components/export/usdz/utils/animationutils.ts +100 -100
- package/src/engine-components/export/usdz/utils/quicklook.ts +42 -42
- package/src/engine-components/export/usdz/utils/timeutils.ts +19 -19
- package/src/engine-components/js-extensions/ExtensionUtils.ts +81 -81
- package/src/engine-components/js-extensions/Object3D.ts +181 -181
- package/src/engine-components/js-extensions/RGBAColor.ts +54 -54
- package/src/engine-components/js-extensions/Vector.ts +16 -16
- package/src/engine-components/js-extensions/index.ts +2 -2
- package/src/engine-components/postprocessing/Effects/Antialiasing.ts +51 -51
- package/src/engine-components/postprocessing/Effects/Bloom.ts +76 -76
- package/src/engine-components/postprocessing/Effects/ChromaticAberration.ts +35 -35
- package/src/engine-components/postprocessing/Effects/ColorAdjustments.ts +96 -96
- package/src/engine-components/postprocessing/Effects/DepthOfField.ts +93 -93
- package/src/engine-components/postprocessing/Effects/Pixelation.ts +26 -26
- package/src/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusion.ts +84 -84
- package/src/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.ts +98 -98
- package/src/engine-components/postprocessing/Effects/TiltShiftEffect.ts +55 -55
- package/src/engine-components/postprocessing/Effects/Tonemapping.ts +54 -54
- package/src/engine-components/postprocessing/Effects/Vignette.ts +54 -54
- package/src/engine-components/postprocessing/PostProcessingEffect.ts +148 -148
- package/src/engine-components/postprocessing/PostProcessingHandler.ts +232 -232
- package/src/engine-components/postprocessing/Volume.ts +216 -216
- package/src/engine-components/postprocessing/VolumeParameter.ts +92 -92
- package/src/engine-components/postprocessing/VolumeProfile.ts +40 -40
- package/src/engine-components/postprocessing/index.ts +3 -3
- package/src/engine-components/timeline/PlayableDirector.ts +666 -666
- package/src/engine-components/timeline/SignalAsset.ts +138 -138
- package/src/engine-components/timeline/TimelineModels.ts +93 -93
- package/src/engine-components/timeline/TimelineTracks.ts +906 -906
- package/src/engine-components/timeline/index.ts +3 -3
- package/src/engine-components/ui/BaseUIComponent.ts +195 -195
- package/src/engine-components/ui/Button.ts +283 -283
- package/src/engine-components/ui/Canvas.ts +390 -390
- package/src/engine-components/ui/CanvasGroup.ts +49 -49
- package/src/engine-components/ui/EventSystem.ts +736 -736
- package/src/engine-components/ui/Graphic.ts +255 -255
- package/src/engine-components/ui/Image.ts +102 -102
- package/src/engine-components/ui/InputField.ts +290 -290
- package/src/engine-components/ui/Interfaces.ts +57 -57
- package/src/engine-components/ui/Layout.ts +322 -322
- package/src/engine-components/ui/Outline.ts +12 -12
- package/src/engine-components/ui/PointerEvents.ts +118 -118
- package/src/engine-components/ui/RaycastUtils.ts +68 -68
- package/src/engine-components/ui/Raycaster.ts +73 -73
- package/src/engine-components/ui/RectTransform.ts +364 -364
- package/src/engine-components/ui/SpatialHtml.ts +63 -63
- package/src/engine-components/ui/Text.ts +572 -572
- package/src/engine-components/ui/Utils.ts +110 -110
- package/src/engine-components/utils/LookAt.ts +65 -65
- package/src/engine-components/utils/OpenURL.ts +118 -118
- package/src/engine-components/webxr/WebARCameraBackground.ts +224 -224
- package/src/engine-components/webxr/WebARSessionRoot.ts +446 -446
- package/src/engine-components/webxr/WebXR.ts +761 -761
- package/src/engine-components/webxr/WebXRAvatar.ts +356 -356
- package/src/engine-components/webxr/WebXRController.ts +1168 -1168
- package/src/engine-components/webxr/WebXRGrabRendering.ts +150 -150
- package/src/engine-components/webxr/WebXRImageTracking.ts +371 -371
- package/src/engine-components/webxr/WebXRPlaneTracking.ts +429 -429
- package/src/engine-components/webxr/WebXRRig.ts +21 -21
- package/src/engine-components/webxr/WebXRSync.ts +463 -463
- package/src/engine-components/webxr/index.ts +3 -3
- package/src/engine-components-experimental/Presentation.ts +12 -12
- package/src/engine-components-experimental/networking/PlayerSync.ts +217 -217
- package/src/engine-schemes/COMPILE_SCHEMES.bat +3 -3
- package/src/engine-schemes/COMPILE_TS.bat +11 -11
- package/src/engine-schemes/schemes.ts +27 -27
- package/src/engine-schemes/synced-camera-model.ts +92 -92
- package/src/engine-schemes/synced-transform-model.ts +90 -90
- package/src/engine-schemes/syncedCamera.fbs +10 -10
- package/src/engine-schemes/transform.ts +50 -50
- package/src/engine-schemes/transforms.fbs +25 -25
- package/src/engine-schemes/vec.fbs +19 -19
- package/src/engine-schemes/vec2.ts +33 -33
- package/src/engine-schemes/vec3.ts +38 -38
- package/src/engine-schemes/vec4.ts +43 -43
- package/src/engine-schemes/vr-user-state-buffer.ts +138 -138
- package/src/engine-schemes/vrUserStateBuffer.fbs +16 -16
- package/src/include/draco/draco_decoder.js +34 -34
- package/src/include/draco/draco_wasm_wrapper.js +117 -117
- package/src/include/ktx2/basis_transcoder.js +21 -21
- package/src/include/needle/arial-msdf.json +1471 -1471
- package/src/include/three/ARButton.js +231 -231
- package/src/include/three/DragControls.js +231 -231
- package/src/include/three/EXT_mesh_gpu_instancing_exporter.js +66 -66
- package/src/include/three/VRButton.js +194 -194
- package/src/needle-engine.ts +55 -55
- package/src/engine/dist/api.js +0 -73
- package/src/engine/dist/api.js.meta +0 -7
- package/src/engine/dist/engine_networking_streams.js +0 -474
- package/src/engine/dist/engine_networking_streams.js.meta +0 -7
- package/src/engine-schemes/dist/api.js +0 -17
- package/src/engine-schemes/dist/api.js.meta +0 -7
- package/src/engine-schemes/dist/schemes.js +0 -25
- package/src/engine-schemes/dist/schemes.js.meta +0 -7
- package/src/engine-schemes/dist/synced-camera-model.js +0 -74
- package/src/engine-schemes/dist/synced-camera-model.js.meta +0 -7
- package/src/engine-schemes/dist/synced-transform-model.js +0 -73
- package/src/engine-schemes/dist/synced-transform-model.js.meta +0 -7
- package/src/engine-schemes/dist/transform.js +0 -46
- package/src/engine-schemes/dist/transform.js.meta +0 -7
- package/src/engine-schemes/dist/vec2.js +0 -32
- package/src/engine-schemes/dist/vec2.js.meta +0 -7
- package/src/engine-schemes/dist/vec3.js +0 -36
- package/src/engine-schemes/dist/vec3.js.meta +0 -7
- package/src/engine-schemes/dist/vec4.js +0 -40
- package/src/engine-schemes/dist/vec4.js.meta +0 -7
- package/src/engine-schemes/dist/vr-user-state-buffer.js +0 -110
- package/src/engine-schemes/dist/vr-user-state-buffer.js.meta +0 -7
- package/src/engine-schemes/flatc.exe +0 -0
|
@@ -1,1030 +1,1030 @@
|
|
|
1
|
-
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
-
};
|
|
7
|
-
import { Behaviour, GameObject } from "./Component.js";
|
|
8
|
-
import * as THREE from "three";
|
|
9
|
-
// import { RendererCustomShader } from "./RendererCustomShader.js";
|
|
10
|
-
import { RendererLightmap } from "./RendererLightmap.js";
|
|
11
|
-
import { FrameEvent } from "../engine/engine_setup.js";
|
|
12
|
-
import { getParam } from "../engine/engine_utils.js";
|
|
13
|
-
import { serializable } from "../engine/engine_serialization_decorator.js";
|
|
14
|
-
import { AxesHelper, Material, Object3D, SkinnedMesh, Vector4 } from "three";
|
|
15
|
-
import { NEEDLE_render_objects } from "../engine/extensions/NEEDLE_render_objects.js";
|
|
16
|
-
import { NEEDLE_progressive } from "../engine/extensions/NEEDLE_progressive.js";
|
|
17
|
-
import { $instancingAutoUpdateBounds, $instancingRenderer, InstancingUtil, NEED_UPDATE_INSTANCE_KEY } from "../engine/engine_instancing.js";
|
|
18
|
-
import { ReflectionProbe } from "./ReflectionProbe.js";
|
|
19
|
-
import { setCustomVisibility } from "../engine/js-extensions/Layers.js";
|
|
20
|
-
import { isLocalNetwork } from "../engine/engine_networking_utils.js";
|
|
21
|
-
import { showBalloonWarning } from "../engine/debug/index.js";
|
|
22
|
-
import { Gizmos } from "../engine/engine_gizmos.js";
|
|
23
|
-
import { getTempVector } from "../engine/engine_three_utils.js";
|
|
24
|
-
// for staying compatible with old code
|
|
25
|
-
export { InstancingUtil } from "../engine/engine_instancing.js";
|
|
26
|
-
const debugRenderer = getParam("debugrenderer");
|
|
27
|
-
const debugskinnedmesh = getParam("debugskinnedmesh");
|
|
28
|
-
const suppressInstancing = getParam("noInstancing");
|
|
29
|
-
const debugInstancing = getParam("debuginstancing");
|
|
30
|
-
const debugProgressiveLoading = getParam("debugprogressive");
|
|
31
|
-
const suppressProgressiveLoading = getParam("noprogressive");
|
|
32
|
-
const showWireframe = getParam("wireframe");
|
|
33
|
-
export var ReflectionProbeUsage;
|
|
34
|
-
(function (ReflectionProbeUsage) {
|
|
35
|
-
ReflectionProbeUsage[ReflectionProbeUsage["Off"] = 0] = "Off";
|
|
36
|
-
ReflectionProbeUsage[ReflectionProbeUsage["BlendProbes"] = 1] = "BlendProbes";
|
|
37
|
-
ReflectionProbeUsage[ReflectionProbeUsage["BlendProbesAndSkybox"] = 2] = "BlendProbesAndSkybox";
|
|
38
|
-
ReflectionProbeUsage[ReflectionProbeUsage["Simple"] = 3] = "Simple";
|
|
39
|
-
})(ReflectionProbeUsage || (ReflectionProbeUsage = {}));
|
|
40
|
-
export class FieldWithDefault {
|
|
41
|
-
path = null;
|
|
42
|
-
asset = null;
|
|
43
|
-
default;
|
|
44
|
-
}
|
|
45
|
-
export var RenderState;
|
|
46
|
-
(function (RenderState) {
|
|
47
|
-
RenderState[RenderState["Both"] = 0] = "Both";
|
|
48
|
-
RenderState[RenderState["Back"] = 1] = "Back";
|
|
49
|
-
RenderState[RenderState["Front"] = 2] = "Front";
|
|
50
|
-
})(RenderState || (RenderState = {}));
|
|
51
|
-
// support sharedMaterials[index] assigning materials directly to the objects
|
|
52
|
-
class SharedMaterialArray {
|
|
53
|
-
_renderer;
|
|
54
|
-
_targets = [];
|
|
55
|
-
_indexMapMaxIndex;
|
|
56
|
-
_indexMap;
|
|
57
|
-
_changed = false;
|
|
58
|
-
get changed() {
|
|
59
|
-
return this._changed;
|
|
60
|
-
}
|
|
61
|
-
set changed(value) {
|
|
62
|
-
if (value === true) {
|
|
63
|
-
if (debugRenderer)
|
|
64
|
-
console.warn("SharedMaterials have changed: " + this._renderer.name, this);
|
|
65
|
-
}
|
|
66
|
-
this._changed = value;
|
|
67
|
-
}
|
|
68
|
-
is(renderer) {
|
|
69
|
-
return this._renderer === renderer;
|
|
70
|
-
}
|
|
71
|
-
constructor(renderer, originalMaterials) {
|
|
72
|
-
this._renderer = renderer;
|
|
73
|
-
const setMaterial = this.setMaterial.bind(this);
|
|
74
|
-
const getMaterial = this.getMaterial.bind(this);
|
|
75
|
-
const go = renderer.gameObject;
|
|
76
|
-
this._targets = [];
|
|
77
|
-
if (go) {
|
|
78
|
-
switch (go.type) {
|
|
79
|
-
case "Group":
|
|
80
|
-
this._targets = [...go.children];
|
|
81
|
-
break;
|
|
82
|
-
case "SkinnedMesh":
|
|
83
|
-
case "Mesh":
|
|
84
|
-
this._targets.push(go);
|
|
85
|
-
break;
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
// this is useful to have an index map when e.g. materials are trying to be assigned by index
|
|
89
|
-
let hasMissingMaterials = false;
|
|
90
|
-
let indexMap = undefined;
|
|
91
|
-
let maxIndex = 0;
|
|
92
|
-
for (let i = 0; i < this._targets.length; i++) {
|
|
93
|
-
const target = this._targets[i];
|
|
94
|
-
if (!target)
|
|
95
|
-
continue;
|
|
96
|
-
const mat = target.material;
|
|
97
|
-
if (!mat)
|
|
98
|
-
continue;
|
|
99
|
-
// set the shadow side to the same as the side of the material, three flips this for some reason
|
|
100
|
-
mat.shadowSide = mat.side;
|
|
101
|
-
for (let k = 0; k < originalMaterials.length; k++) {
|
|
102
|
-
const orig = originalMaterials[k];
|
|
103
|
-
if (!orig) {
|
|
104
|
-
hasMissingMaterials = true;
|
|
105
|
-
continue;
|
|
106
|
-
}
|
|
107
|
-
if (mat.name === orig.name) {
|
|
108
|
-
if (indexMap === undefined)
|
|
109
|
-
indexMap = new Map();
|
|
110
|
-
indexMap.set(k, i);
|
|
111
|
-
maxIndex = Math.max(maxIndex, k);
|
|
112
|
-
// console.log(`Material ${mat.name} at ${k} was found at index ${i} in renderer ${renderer.name}.`)
|
|
113
|
-
break;
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
if (hasMissingMaterials) {
|
|
118
|
-
this._indexMapMaxIndex = maxIndex;
|
|
119
|
-
this._indexMap = indexMap;
|
|
120
|
-
const warningMessage = `Renderer ${renderer.name} was initialized with missing materials - this may lead to unexpected behaviour when trying to access sharedMaterials by index.`;
|
|
121
|
-
console.warn(warningMessage);
|
|
122
|
-
if (isLocalNetwork())
|
|
123
|
-
showBalloonWarning("Found renderer with missing materials: please check the console for details.");
|
|
124
|
-
}
|
|
125
|
-
// this lets us override the javascript indexer, only works in ES6 tho
|
|
126
|
-
// but like that we can use sharedMaterials[index] and it will be assigned to the object directly
|
|
127
|
-
return new Proxy(this, {
|
|
128
|
-
get(target, key) {
|
|
129
|
-
if (typeof key === "string") {
|
|
130
|
-
const index = parseInt(key);
|
|
131
|
-
if (!isNaN(index)) {
|
|
132
|
-
return getMaterial(index);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
return target[key];
|
|
136
|
-
},
|
|
137
|
-
set(target, key, value) {
|
|
138
|
-
if (typeof key === "string")
|
|
139
|
-
setMaterial(value, Number.parseInt(key));
|
|
140
|
-
// console.log(target, key, value);
|
|
141
|
-
if (Reflect.set(target, key, value)) {
|
|
142
|
-
if (value instanceof Material)
|
|
143
|
-
target.changed = true;
|
|
144
|
-
return true;
|
|
145
|
-
}
|
|
146
|
-
return false;
|
|
147
|
-
}
|
|
148
|
-
});
|
|
149
|
-
}
|
|
150
|
-
get length() {
|
|
151
|
-
if (this._indexMapMaxIndex !== undefined)
|
|
152
|
-
return this._indexMapMaxIndex + 1;
|
|
153
|
-
return this._targets.length;
|
|
154
|
-
}
|
|
155
|
-
// iterator to support: for(const mat of sharedMaterials)
|
|
156
|
-
*[Symbol.iterator]() {
|
|
157
|
-
for (let i = 0; i < this.length; i++) {
|
|
158
|
-
yield this.getMaterial(i);
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
resolveIndex(index) {
|
|
162
|
-
const map = this._indexMap;
|
|
163
|
-
// if we have a index map it means that some materials were missing
|
|
164
|
-
if (map) {
|
|
165
|
-
if (map.has(index))
|
|
166
|
-
return map.get(index);
|
|
167
|
-
// return -1;
|
|
168
|
-
}
|
|
169
|
-
return index;
|
|
170
|
-
}
|
|
171
|
-
setMaterial(mat, index) {
|
|
172
|
-
index = this.resolveIndex(index);
|
|
173
|
-
if (index < 0 || index >= this._targets.length)
|
|
174
|
-
return;
|
|
175
|
-
const target = this._targets[index];
|
|
176
|
-
if (!target || target["material"] === undefined)
|
|
177
|
-
return;
|
|
178
|
-
target["material"] = mat;
|
|
179
|
-
this.changed = true;
|
|
180
|
-
}
|
|
181
|
-
getMaterial(index) {
|
|
182
|
-
index = this.resolveIndex(index);
|
|
183
|
-
if (index < 0)
|
|
184
|
-
return null;
|
|
185
|
-
const obj = this._targets;
|
|
186
|
-
if (index >= obj.length)
|
|
187
|
-
return null;
|
|
188
|
-
const target = obj[index];
|
|
189
|
-
if (!target)
|
|
190
|
-
return null;
|
|
191
|
-
return target["material"];
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
export class Renderer extends Behaviour {
|
|
195
|
-
/** 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!
|
|
196
|
-
*
|
|
197
|
-
* 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) */
|
|
198
|
-
static setVisible(obj, visible) {
|
|
199
|
-
setCustomVisibility(obj, visible);
|
|
200
|
-
}
|
|
201
|
-
receiveShadows = false;
|
|
202
|
-
shadowCastingMode = ShadowCastingMode.Off;
|
|
203
|
-
lightmapIndex = -1;
|
|
204
|
-
lightmapScaleOffset = new THREE.Vector4(1, 1, 0, 0);
|
|
205
|
-
enableInstancing = undefined;
|
|
206
|
-
renderOrder = undefined;
|
|
207
|
-
allowOcclusionWhenDynamic = true;
|
|
208
|
-
probeAnchor;
|
|
209
|
-
reflectionProbeUsage = ReflectionProbeUsage.Off;
|
|
210
|
-
// custom shader
|
|
211
|
-
// get materialProperties(): Array<MaterialProperties> | undefined {
|
|
212
|
-
// return this._materialProperties;
|
|
213
|
-
// }
|
|
214
|
-
// set materialProperties(value: Array<MaterialProperties> | undefined) {
|
|
215
|
-
// this._materialProperties = value;
|
|
216
|
-
// }
|
|
217
|
-
// private customShaderHandler: RendererCustomShader | undefined = undefined;
|
|
218
|
-
// private _materialProperties: Array<MaterialProperties> | undefined = undefined;
|
|
219
|
-
_lightmaps;
|
|
220
|
-
get sharedMesh() {
|
|
221
|
-
if (this.gameObject.type === "Mesh") {
|
|
222
|
-
return this.gameObject;
|
|
223
|
-
}
|
|
224
|
-
else if (this.gameObject.type === "SkinnesMesh") {
|
|
225
|
-
return this.gameObject;
|
|
226
|
-
}
|
|
227
|
-
else if (this.gameObject.type === "Group") {
|
|
228
|
-
return this.gameObject.children[0];
|
|
229
|
-
}
|
|
230
|
-
return undefined;
|
|
231
|
-
}
|
|
232
|
-
get sharedMaterial() {
|
|
233
|
-
return this.sharedMaterials[0];
|
|
234
|
-
}
|
|
235
|
-
set sharedMaterial(mat) {
|
|
236
|
-
const cur = this.sharedMaterials[0];
|
|
237
|
-
if (cur === mat)
|
|
238
|
-
return;
|
|
239
|
-
this.sharedMaterials[0] = mat;
|
|
240
|
-
this.applyLightmapping();
|
|
241
|
-
}
|
|
242
|
-
/**@deprecated please use sharedMaterial */
|
|
243
|
-
get material() {
|
|
244
|
-
return this.sharedMaterials[0];
|
|
245
|
-
}
|
|
246
|
-
/**@deprecated please use sharedMaterial */
|
|
247
|
-
set material(mat) {
|
|
248
|
-
this.sharedMaterial = mat;
|
|
249
|
-
}
|
|
250
|
-
_sharedMaterials;
|
|
251
|
-
_originalMaterials;
|
|
252
|
-
// this is just available during deserialization
|
|
253
|
-
set sharedMaterials(_val) {
|
|
254
|
-
// TODO: elements in the array might be missing at the moment which leads to problems if an index is serialized
|
|
255
|
-
if (!this._originalMaterials) {
|
|
256
|
-
this._originalMaterials = _val;
|
|
257
|
-
}
|
|
258
|
-
else if (_val) {
|
|
259
|
-
let didWarn = false;
|
|
260
|
-
for (let i = 0; i < this._sharedMaterials.length; i++) {
|
|
261
|
-
const mat = i < _val.length ? _val[i] : null;
|
|
262
|
-
if (mat && mat instanceof Material) {
|
|
263
|
-
this.sharedMaterials[i] = mat;
|
|
264
|
-
}
|
|
265
|
-
else {
|
|
266
|
-
if (!didWarn) {
|
|
267
|
-
didWarn = true;
|
|
268
|
-
console.warn("Can not assign null as material: " + this.name, mat);
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
//@ts-ignore
|
|
275
|
-
get sharedMaterials() {
|
|
276
|
-
if (!this._sharedMaterials || !this._sharedMaterials.is(this)) {
|
|
277
|
-
if (!this._originalMaterials)
|
|
278
|
-
this._originalMaterials = [];
|
|
279
|
-
this._sharedMaterials = new SharedMaterialArray(this, this._originalMaterials);
|
|
280
|
-
}
|
|
281
|
-
return this._sharedMaterials;
|
|
282
|
-
}
|
|
283
|
-
static get shouldSuppressInstancing() {
|
|
284
|
-
return suppressInstancing;
|
|
285
|
-
}
|
|
286
|
-
_lightmapTextureOverride = undefined;
|
|
287
|
-
get lightmap() {
|
|
288
|
-
if (this._lightmaps?.length) {
|
|
289
|
-
return this._lightmaps[0].lightmap;
|
|
290
|
-
}
|
|
291
|
-
return null;
|
|
292
|
-
}
|
|
293
|
-
/** set undefined to return to default lightmap */
|
|
294
|
-
set lightmap(tex) {
|
|
295
|
-
this._lightmapTextureOverride = tex;
|
|
296
|
-
if (tex === undefined) {
|
|
297
|
-
tex = this.context.lightmaps.tryGetLightmap(this.sourceId, this.lightmapIndex);
|
|
298
|
-
}
|
|
299
|
-
if (this._lightmaps?.length) {
|
|
300
|
-
for (const lm of this._lightmaps) {
|
|
301
|
-
lm.lightmap = tex;
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
get hasLightmap() {
|
|
306
|
-
const lm = this.lightmap;
|
|
307
|
-
return lm !== null && lm !== undefined;
|
|
308
|
-
}
|
|
309
|
-
allowProgressiveLoading = true;
|
|
310
|
-
registering() {
|
|
311
|
-
if (!this.enabled) {
|
|
312
|
-
this.setVisibility(false);
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
awake() {
|
|
316
|
-
if (debugRenderer)
|
|
317
|
-
console.log("Renderer ", this.name, this);
|
|
318
|
-
this.clearInstancingState();
|
|
319
|
-
if (this.probeAnchor && debugRenderer)
|
|
320
|
-
this.probeAnchor.add(new AxesHelper(.2));
|
|
321
|
-
this._reflectionProbe = null;
|
|
322
|
-
if (this.isMultiMaterialObject(this.gameObject)) {
|
|
323
|
-
for (const child of this.gameObject.children) {
|
|
324
|
-
this.context.addBeforeRenderListener(child, this.onBeforeRenderThree);
|
|
325
|
-
child.layers.mask = this.gameObject.layers.mask;
|
|
326
|
-
}
|
|
327
|
-
if (this.renderOrder !== undefined) {
|
|
328
|
-
// Objects can have nested renderers (e.g. contain 2 meshes and then again another group)
|
|
329
|
-
// or perhaps just regular child objects that have their own renderer component (?)
|
|
330
|
-
let index = 0;
|
|
331
|
-
for (let i = 0; i < this.gameObject.children.length; i++) {
|
|
332
|
-
const ch = this.gameObject.children[i];
|
|
333
|
-
// ignore nested groups or objects that have their own renderer (aka their own render order settings)
|
|
334
|
-
if (!this.isMeshOrSkinnedMesh(ch) || GameObject.getComponent(ch, Renderer))
|
|
335
|
-
continue;
|
|
336
|
-
if (this.renderOrder.length <= index) {
|
|
337
|
-
console.warn("Incorrect renderOrder element count", this, this.renderOrder.length + " but expected " + this.gameObject.children.length, "Index: " + index, "ChildElement:", ch);
|
|
338
|
-
continue;
|
|
339
|
-
}
|
|
340
|
-
// if(debugRenderer) console.log("Setting render order", ch, this.renderOrder[index])
|
|
341
|
-
ch.renderOrder = this.renderOrder[index];
|
|
342
|
-
index += 1;
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
// TODO: custom shader with sub materials
|
|
347
|
-
else if (this.isMeshOrSkinnedMesh(this.gameObject)) {
|
|
348
|
-
this.context.addBeforeRenderListener(this.gameObject, this.onBeforeRenderThree);
|
|
349
|
-
if (this.renderOrder !== undefined && this.renderOrder.length > 0)
|
|
350
|
-
this.gameObject.renderOrder = this.renderOrder[0];
|
|
351
|
-
}
|
|
352
|
-
else {
|
|
353
|
-
this.context.addBeforeRenderListener(this.gameObject, this.onBeforeRenderThree);
|
|
354
|
-
}
|
|
355
|
-
this.applyLightmapping();
|
|
356
|
-
if (showWireframe) {
|
|
357
|
-
for (let i = 0; i < this.sharedMaterials.length; i++) {
|
|
358
|
-
const mat = this.sharedMaterials[i];
|
|
359
|
-
if (mat) {
|
|
360
|
-
mat.wireframe = true;
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
}
|
|
365
|
-
applyLightmapping() {
|
|
366
|
-
if (this.lightmapIndex >= 0) {
|
|
367
|
-
const type = this.gameObject.type;
|
|
368
|
-
// use the override lightmap if its not undefined
|
|
369
|
-
const tex = this._lightmapTextureOverride !== undefined
|
|
370
|
-
? this._lightmapTextureOverride
|
|
371
|
-
: this.context.lightmaps.tryGetLightmap(this.sourceId, this.lightmapIndex);
|
|
372
|
-
if (tex) {
|
|
373
|
-
if (!this._lightmaps)
|
|
374
|
-
this._lightmaps = [];
|
|
375
|
-
if (type === "Mesh") {
|
|
376
|
-
const mat = this.gameObject["material"];
|
|
377
|
-
if (!mat?.isMeshBasicMaterial) {
|
|
378
|
-
if (this._lightmaps.length <= 0) {
|
|
379
|
-
const rm = new RendererLightmap(this.gameObject, this.context);
|
|
380
|
-
this._lightmaps.push(rm);
|
|
381
|
-
}
|
|
382
|
-
const rm = this._lightmaps[0];
|
|
383
|
-
rm.init(this.lightmapIndex, this.lightmapScaleOffset, tex);
|
|
384
|
-
}
|
|
385
|
-
else {
|
|
386
|
-
if (mat)
|
|
387
|
-
console.warn("Lightmapping is not supported on MeshBasicMaterial", mat.name);
|
|
388
|
-
}
|
|
389
|
-
}
|
|
390
|
-
// for multi materials we need to loop through children
|
|
391
|
-
// and then we add a lightmap renderer component to each of them
|
|
392
|
-
else if (this.isMultiMaterialObject(this.gameObject) && this.sharedMaterials.length > 0) {
|
|
393
|
-
for (let i = 0; i < this.gameObject.children.length; i++) {
|
|
394
|
-
const child = this.gameObject.children[i];
|
|
395
|
-
if (!child["material"]?.isMeshBasicMaterial) {
|
|
396
|
-
let rm = undefined;
|
|
397
|
-
if (i >= this._lightmaps.length) {
|
|
398
|
-
rm = new RendererLightmap(child, this.context);
|
|
399
|
-
this._lightmaps.push(rm);
|
|
400
|
-
}
|
|
401
|
-
else
|
|
402
|
-
rm = this._lightmaps[i];
|
|
403
|
-
rm.init(this.lightmapIndex, this.lightmapScaleOffset, tex);
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
}
|
|
408
|
-
else {
|
|
409
|
-
if (debugRenderer)
|
|
410
|
-
console.warn("Lightmap not found", this.sourceId, this.lightmapIndex);
|
|
411
|
-
}
|
|
412
|
-
}
|
|
413
|
-
}
|
|
414
|
-
_isInstancingEnabled = false;
|
|
415
|
-
handles = undefined;
|
|
416
|
-
prevLayers = undefined;
|
|
417
|
-
clearInstancingState() {
|
|
418
|
-
this._isInstancingEnabled = false;
|
|
419
|
-
this.handles = undefined;
|
|
420
|
-
this.prevLayers = undefined;
|
|
421
|
-
}
|
|
422
|
-
setInstancingEnabled(enabled) {
|
|
423
|
-
if (this._isInstancingEnabled === enabled)
|
|
424
|
-
return enabled && (this.handles === undefined || this.handles != null && this.handles.length > 0);
|
|
425
|
-
this._isInstancingEnabled = enabled;
|
|
426
|
-
if (enabled) {
|
|
427
|
-
if (this.handles === undefined) {
|
|
428
|
-
this.handles = instancing.setup(this, this.gameObject, this.context, null, { rend: this, foundMeshes: 0, useMatrixWorldAutoUpdate: this.useInstanceMatrixWorldAutoUpdate() });
|
|
429
|
-
if (this.handles) {
|
|
430
|
-
GameObject.markAsInstancedRendered(this.gameObject, true);
|
|
431
|
-
return true;
|
|
432
|
-
}
|
|
433
|
-
}
|
|
434
|
-
else if (this.handles !== null) {
|
|
435
|
-
for (const handler of this.handles) {
|
|
436
|
-
handler.updateInstanceMatrix(true);
|
|
437
|
-
handler.add();
|
|
438
|
-
}
|
|
439
|
-
GameObject.markAsInstancedRendered(this.gameObject, true);
|
|
440
|
-
return true;
|
|
441
|
-
}
|
|
442
|
-
}
|
|
443
|
-
else {
|
|
444
|
-
if (this.handles) {
|
|
445
|
-
for (const handler of this.handles) {
|
|
446
|
-
handler.remove();
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
return true;
|
|
450
|
-
}
|
|
451
|
-
return false;
|
|
452
|
-
}
|
|
453
|
-
/** Return true to wrap matrix update events for instanced rendering to update instance matrices automatically when matrixWorld changes
|
|
454
|
-
* This is a separate method to be overrideable from user code
|
|
455
|
-
*/
|
|
456
|
-
useInstanceMatrixWorldAutoUpdate() {
|
|
457
|
-
return true;
|
|
458
|
-
}
|
|
459
|
-
start() {
|
|
460
|
-
if (this.enableInstancing && !suppressInstancing) {
|
|
461
|
-
this.setInstancingEnabled(true);
|
|
462
|
-
// make sure the instance is marked dirty once for cases where e.g. an animator animates the instanced object
|
|
463
|
-
// in the first frame we want the updated matrix then to be applied immediately to the instancing
|
|
464
|
-
InstancingUtil.markDirty(this.gameObject);
|
|
465
|
-
}
|
|
466
|
-
this.gameObject.frustumCulled = this.allowOcclusionWhenDynamic;
|
|
467
|
-
if (this.isMultiMaterialObject(this.gameObject)) {
|
|
468
|
-
for (let i = 0; i < this.gameObject.children.length; i++) {
|
|
469
|
-
const ch = this.gameObject.children[i];
|
|
470
|
-
ch.frustumCulled = this.allowOcclusionWhenDynamic;
|
|
471
|
-
}
|
|
472
|
-
}
|
|
473
|
-
}
|
|
474
|
-
onEnable() {
|
|
475
|
-
this.setVisibility(true);
|
|
476
|
-
if (this._isInstancingEnabled) {
|
|
477
|
-
this.setInstancingEnabled(true);
|
|
478
|
-
}
|
|
479
|
-
else if (this.enabled) {
|
|
480
|
-
// this.gameObject.visible = true;
|
|
481
|
-
this.applyStencil();
|
|
482
|
-
}
|
|
483
|
-
this.updateReflectionProbe();
|
|
484
|
-
}
|
|
485
|
-
onDisable() {
|
|
486
|
-
this.setVisibility(false);
|
|
487
|
-
if (this.handles && this.handles.length > 0) {
|
|
488
|
-
this.setInstancingEnabled(false);
|
|
489
|
-
}
|
|
490
|
-
}
|
|
491
|
-
onDestroy() {
|
|
492
|
-
this.handles = null;
|
|
493
|
-
if (this.isMultiMaterialObject(this.gameObject)) {
|
|
494
|
-
for (const child of this.gameObject.children) {
|
|
495
|
-
this.context.removeBeforeRenderListener(child, this.onBeforeRenderThree);
|
|
496
|
-
}
|
|
497
|
-
}
|
|
498
|
-
else {
|
|
499
|
-
this.context.removeBeforeRenderListener(this.gameObject, this.onBeforeRenderThree);
|
|
500
|
-
}
|
|
501
|
-
}
|
|
502
|
-
applyStencil() {
|
|
503
|
-
NEEDLE_render_objects.applyStencil(this);
|
|
504
|
-
}
|
|
505
|
-
onBeforeRender() {
|
|
506
|
-
if (!this.gameObject) {
|
|
507
|
-
return;
|
|
508
|
-
}
|
|
509
|
-
if (this.isMultiMaterialObject(this.gameObject) && this.gameObject.children?.length > 0) {
|
|
510
|
-
for (const ch of this.gameObject.children) {
|
|
511
|
-
this.applySettings(ch);
|
|
512
|
-
}
|
|
513
|
-
}
|
|
514
|
-
else {
|
|
515
|
-
this.applySettings(this.gameObject);
|
|
516
|
-
}
|
|
517
|
-
if (this.sharedMaterials.changed) {
|
|
518
|
-
this.sharedMaterials.changed = false;
|
|
519
|
-
this.applyLightmapping();
|
|
520
|
-
}
|
|
521
|
-
if (this.handles?.length) {
|
|
522
|
-
// if (this.name === "Darbouka")
|
|
523
|
-
// console.log(this.name, this.gameObject.matrixWorldNeedsUpdate);
|
|
524
|
-
const needsUpdate = this.gameObject[NEED_UPDATE_INSTANCE_KEY] === true; // || this.gameObject.matrixWorldNeedsUpdate;
|
|
525
|
-
if (needsUpdate) {
|
|
526
|
-
if (debugInstancing)
|
|
527
|
-
console.log("UPDATE INSTANCED MATRICES", this.context.time.frame);
|
|
528
|
-
this.gameObject[NEED_UPDATE_INSTANCE_KEY] = false;
|
|
529
|
-
const remove = false; // Math.random() < .01;
|
|
530
|
-
for (let i = this.handles.length - 1; i >= 0; i--) {
|
|
531
|
-
const h = this.handles[i];
|
|
532
|
-
if (remove) {
|
|
533
|
-
h.remove();
|
|
534
|
-
this.handles.splice(i, 1);
|
|
535
|
-
}
|
|
536
|
-
else
|
|
537
|
-
h.updateInstanceMatrix();
|
|
538
|
-
}
|
|
539
|
-
this.gameObject.matrixWorldNeedsUpdate = false;
|
|
540
|
-
}
|
|
541
|
-
}
|
|
542
|
-
if (this.handles && this.handles.length <= 0) {
|
|
543
|
-
GameObject.markAsInstancedRendered(this.gameObject, false);
|
|
544
|
-
}
|
|
545
|
-
if (this._isInstancingEnabled && this.handles) {
|
|
546
|
-
for (let i = 0; i < this.handles.length; i++) {
|
|
547
|
-
const handle = this.handles[i];
|
|
548
|
-
if (!this.prevLayers)
|
|
549
|
-
this.prevLayers = [];
|
|
550
|
-
const layer = handle.object.layers.mask;
|
|
551
|
-
if (i >= this.prevLayers.length)
|
|
552
|
-
this.prevLayers.push(layer);
|
|
553
|
-
else
|
|
554
|
-
this.prevLayers[i] = layer;
|
|
555
|
-
handle.object.layers.disableAll();
|
|
556
|
-
}
|
|
557
|
-
}
|
|
558
|
-
for (const mat of this.sharedMaterials) {
|
|
559
|
-
if (mat)
|
|
560
|
-
this.loadProgressiveTextures(mat);
|
|
561
|
-
}
|
|
562
|
-
if (this.reflectionProbeUsage !== ReflectionProbeUsage.Off && this._reflectionProbe) {
|
|
563
|
-
this._reflectionProbe.onSet(this);
|
|
564
|
-
}
|
|
565
|
-
}
|
|
566
|
-
onBeforeRenderThree = (_renderer, _scene, _camera, _geometry, material, _group) => {
|
|
567
|
-
if (material.envMapIntensity !== undefined) {
|
|
568
|
-
const factor = this.hasLightmap ? Math.PI : 1;
|
|
569
|
-
const environmentIntensity = this.context.mainCameraComponent?.environmentIntensity ?? 1;
|
|
570
|
-
material.envMapIntensity = Math.max(0, environmentIntensity * this.context.sceneLighting.environmentIntensity / factor);
|
|
571
|
-
}
|
|
572
|
-
// if (this._reflectionProbe?.texture) {
|
|
573
|
-
// material.envMap = this._reflectionProbe.texture;
|
|
574
|
-
// // this.context.renderer.prop
|
|
575
|
-
// // console.log(material.name);
|
|
576
|
-
// // this.context.renderer.properties.get(material);
|
|
577
|
-
// // this.context.renderer.properties.update(material, "environment", this._reflectionProbe.texture);
|
|
578
|
-
// }
|
|
579
|
-
// _scene.environment = null;
|
|
580
|
-
// else _scene.environment = Renderer.envmap;
|
|
581
|
-
// if (!material.envmap)
|
|
582
|
-
// material.envMap = Renderer.envmap;
|
|
583
|
-
// material.needsUpdate = true;
|
|
584
|
-
// if (!camera) {
|
|
585
|
-
// let isXRCamera = false;
|
|
586
|
-
// if (this.context.isInXR) {
|
|
587
|
-
// // @ts-ignore
|
|
588
|
-
// const arr = this.context.renderer.xr.getCamera() as ArrayCamera;
|
|
589
|
-
// if (arr.cameras?.length > 0) {
|
|
590
|
-
// camera = arr;
|
|
591
|
-
// isXRCamera = true;
|
|
592
|
-
// }
|
|
593
|
-
// }
|
|
594
|
-
// }
|
|
595
|
-
// if (this.customShaderHandler) {
|
|
596
|
-
// this.customShaderHandler.onBeforeRender(renderer, scene, camera, geometry, material, group);
|
|
597
|
-
// }
|
|
598
|
-
// else if (this.rawShaderHandler) {
|
|
599
|
-
// for (const h of this.rawShaderHandler) {
|
|
600
|
-
// h.onBeforeRender(this.gameObject, camera);
|
|
601
|
-
// }
|
|
602
|
-
// }
|
|
603
|
-
if (this._lightmaps) {
|
|
604
|
-
for (const lm of this._lightmaps) {
|
|
605
|
-
lm.updateLightmapUniforms(material);
|
|
606
|
-
}
|
|
607
|
-
}
|
|
608
|
-
};
|
|
609
|
-
onAfterRender() {
|
|
610
|
-
if (this._isInstancingEnabled && this.handles && this.prevLayers && this.prevLayers.length >= this.handles.length) {
|
|
611
|
-
for (let i = 0; i < this.handles.length; i++) {
|
|
612
|
-
const handle = this.handles[i];
|
|
613
|
-
handle.object.layers.mask = this.prevLayers[i];
|
|
614
|
-
}
|
|
615
|
-
}
|
|
616
|
-
if (this.reflectionProbeUsage !== ReflectionProbeUsage.Off && this._reflectionProbe) {
|
|
617
|
-
this._reflectionProbe.onUnset(this);
|
|
618
|
-
}
|
|
619
|
-
}
|
|
620
|
-
loadProgressiveTextures(material) {
|
|
621
|
-
// progressive load before rendering so we only load textures for visible materials
|
|
622
|
-
if (!suppressProgressiveLoading && material) {
|
|
623
|
-
if (material["_didRequestTextureLOD"] === undefined && this.allowProgressiveLoading) {
|
|
624
|
-
material["_didRequestTextureLOD"] = 0;
|
|
625
|
-
if (debugProgressiveLoading) {
|
|
626
|
-
console.log("Load material LOD", material.name);
|
|
627
|
-
}
|
|
628
|
-
return NEEDLE_progressive.assignTextureLOD(this.context, this.sourceId, material);
|
|
629
|
-
}
|
|
630
|
-
}
|
|
631
|
-
return Promise.resolve(true);
|
|
632
|
-
}
|
|
633
|
-
applySettings(go) {
|
|
634
|
-
go.receiveShadow = this.receiveShadows;
|
|
635
|
-
if (this.shadowCastingMode == ShadowCastingMode.On) {
|
|
636
|
-
go.castShadow = true;
|
|
637
|
-
}
|
|
638
|
-
else
|
|
639
|
-
go.castShadow = false;
|
|
640
|
-
}
|
|
641
|
-
_reflectionProbe = null;
|
|
642
|
-
updateReflectionProbe() {
|
|
643
|
-
// handle reflection probe
|
|
644
|
-
this._reflectionProbe = null;
|
|
645
|
-
if (this.reflectionProbeUsage !== ReflectionProbeUsage.Off) {
|
|
646
|
-
if (!this.probeAnchor)
|
|
647
|
-
return;
|
|
648
|
-
// update the reflection probe right before rendering
|
|
649
|
-
// if we do it immediately the reflection probe might not be enabled yet
|
|
650
|
-
// (since this method is called from onEnable)
|
|
651
|
-
this.startCoroutine(this._updateReflectionProbe(), FrameEvent.LateUpdate);
|
|
652
|
-
}
|
|
653
|
-
}
|
|
654
|
-
*_updateReflectionProbe() {
|
|
655
|
-
const obj = this.probeAnchor || this.gameObject;
|
|
656
|
-
const isAnchor = this.probeAnchor ? true : false;
|
|
657
|
-
this._reflectionProbe = ReflectionProbe.get(obj, this.context, isAnchor, this.probeAnchor);
|
|
658
|
-
}
|
|
659
|
-
setVisibility(visible) {
|
|
660
|
-
if (!this.isMultiMaterialObject(this.gameObject)) {
|
|
661
|
-
setCustomVisibility(this.gameObject, visible);
|
|
662
|
-
}
|
|
663
|
-
else {
|
|
664
|
-
for (const ch of this.gameObject.children) {
|
|
665
|
-
if (this.isMeshOrSkinnedMesh(ch)) {
|
|
666
|
-
setCustomVisibility(ch, visible);
|
|
667
|
-
}
|
|
668
|
-
}
|
|
669
|
-
}
|
|
670
|
-
}
|
|
671
|
-
isMultiMaterialObject(obj) {
|
|
672
|
-
return obj.type === "Group";
|
|
673
|
-
}
|
|
674
|
-
isMeshOrSkinnedMesh(obj) {
|
|
675
|
-
return obj.type === "Mesh" || obj.type === "SkinnedMesh";
|
|
676
|
-
}
|
|
677
|
-
}
|
|
678
|
-
__decorate([
|
|
679
|
-
serializable()
|
|
680
|
-
], Renderer.prototype, "receiveShadows", void 0);
|
|
681
|
-
__decorate([
|
|
682
|
-
serializable()
|
|
683
|
-
], Renderer.prototype, "shadowCastingMode", void 0);
|
|
684
|
-
__decorate([
|
|
685
|
-
serializable()
|
|
686
|
-
], Renderer.prototype, "lightmapIndex", void 0);
|
|
687
|
-
__decorate([
|
|
688
|
-
serializable(Vector4)
|
|
689
|
-
], Renderer.prototype, "lightmapScaleOffset", void 0);
|
|
690
|
-
__decorate([
|
|
691
|
-
serializable()
|
|
692
|
-
], Renderer.prototype, "enableInstancing", void 0);
|
|
693
|
-
__decorate([
|
|
694
|
-
serializable()
|
|
695
|
-
], Renderer.prototype, "renderOrder", void 0);
|
|
696
|
-
__decorate([
|
|
697
|
-
serializable()
|
|
698
|
-
], Renderer.prototype, "allowOcclusionWhenDynamic", void 0);
|
|
699
|
-
__decorate([
|
|
700
|
-
serializable(Object3D)
|
|
701
|
-
], Renderer.prototype, "probeAnchor", void 0);
|
|
702
|
-
__decorate([
|
|
703
|
-
serializable()
|
|
704
|
-
], Renderer.prototype, "reflectionProbeUsage", void 0);
|
|
705
|
-
export class MeshRenderer extends Renderer {
|
|
706
|
-
}
|
|
707
|
-
export class SkinnedMeshRenderer extends MeshRenderer {
|
|
708
|
-
awake() {
|
|
709
|
-
super.awake();
|
|
710
|
-
// disable skinned mesh occlusion because of https://github.com/mrdoob/three.js/issues/14499
|
|
711
|
-
this.allowOcclusionWhenDynamic = false;
|
|
712
|
-
// If we don't do that here the bounding sphere matrix used for raycasts will be wrong. Not sure *why* this is necessary
|
|
713
|
-
this.gameObject.parent?.updateWorldMatrix(false, true);
|
|
714
|
-
}
|
|
715
|
-
onBeforeRender() {
|
|
716
|
-
super.onBeforeRender();
|
|
717
|
-
if (debugskinnedmesh && this.gameObject instanceof SkinnedMesh && this.gameObject.boundingSphere) {
|
|
718
|
-
const tempCenter = getTempVector(this.gameObject.boundingSphere.center).applyMatrix4(this.gameObject.matrixWorld);
|
|
719
|
-
Gizmos.DrawWireSphere(tempCenter, this.gameObject.boundingSphere.radius, "red");
|
|
720
|
-
}
|
|
721
|
-
}
|
|
722
|
-
}
|
|
723
|
-
export var ShadowCastingMode;
|
|
724
|
-
(function (ShadowCastingMode) {
|
|
725
|
-
/// <summary>
|
|
726
|
-
/// <para>No shadows are cast from this object.</para>
|
|
727
|
-
/// </summary>
|
|
728
|
-
ShadowCastingMode[ShadowCastingMode["Off"] = 0] = "Off";
|
|
729
|
-
/// <summary>
|
|
730
|
-
/// <para>Shadows are cast from this object.</para>
|
|
731
|
-
/// </summary>
|
|
732
|
-
ShadowCastingMode[ShadowCastingMode["On"] = 1] = "On";
|
|
733
|
-
/// <summary>
|
|
734
|
-
/// <para>Shadows are cast from this object, treating it as two-sided.</para>
|
|
735
|
-
/// </summary>
|
|
736
|
-
ShadowCastingMode[ShadowCastingMode["TwoSided"] = 2] = "TwoSided";
|
|
737
|
-
/// <summary>
|
|
738
|
-
/// <para>Object casts shadows, but is otherwise invisible in the Scene.</para>
|
|
739
|
-
/// </summary>
|
|
740
|
-
ShadowCastingMode[ShadowCastingMode["ShadowsOnly"] = 3] = "ShadowsOnly";
|
|
741
|
-
})(ShadowCastingMode || (ShadowCastingMode = {}));
|
|
742
|
-
;
|
|
743
|
-
class InstancingHandler {
|
|
744
|
-
objs = [];
|
|
745
|
-
setup(renderer, obj, context, handlesArray, args, level = 0) {
|
|
746
|
-
// make sure setting casting settings are applied so when we add the mesh to the InstancedMesh we can ask for the correct cast shadow setting
|
|
747
|
-
renderer.applySettings(obj);
|
|
748
|
-
const res = this.tryCreateOrAddInstance(obj, context, args);
|
|
749
|
-
if (res) {
|
|
750
|
-
renderer.loadProgressiveTextures(res.instancer.material);
|
|
751
|
-
if (handlesArray === null)
|
|
752
|
-
handlesArray = [];
|
|
753
|
-
handlesArray.push(res);
|
|
754
|
-
}
|
|
755
|
-
else if (level <= 0 && obj.type !== "Mesh") {
|
|
756
|
-
const nextLevel = level + 1;
|
|
757
|
-
for (const ch of obj.children) {
|
|
758
|
-
handlesArray = this.setup(renderer, ch, context, handlesArray, args, nextLevel);
|
|
759
|
-
}
|
|
760
|
-
}
|
|
761
|
-
if (level === 0) {
|
|
762
|
-
// For multi material objects we only want to track the root object's matrix
|
|
763
|
-
if (args.useMatrixWorldAutoUpdate && handlesArray && handlesArray.length >= 0) {
|
|
764
|
-
this.autoUpdateInstanceMatrix(obj);
|
|
765
|
-
}
|
|
766
|
-
}
|
|
767
|
-
return handlesArray;
|
|
768
|
-
}
|
|
769
|
-
tryCreateOrAddInstance(obj, context, args) {
|
|
770
|
-
if (obj.type === "Mesh") {
|
|
771
|
-
const index = args.foundMeshes;
|
|
772
|
-
args.foundMeshes += 1;
|
|
773
|
-
if (!args.rend.enableInstancing)
|
|
774
|
-
return null;
|
|
775
|
-
if (index >= args.rend.enableInstancing.length) {
|
|
776
|
-
// console.error("Something is wrong with instance setup", obj, args.rend.enableInstancing, index);
|
|
777
|
-
return null;
|
|
778
|
-
}
|
|
779
|
-
if (!args.rend.enableInstancing[index]) {
|
|
780
|
-
// instancing is disabled
|
|
781
|
-
// console.log("Instancing is disabled", obj);
|
|
782
|
-
return null;
|
|
783
|
-
}
|
|
784
|
-
// instancing is enabled:
|
|
785
|
-
const mesh = obj;
|
|
786
|
-
const geo = mesh.geometry;
|
|
787
|
-
const mat = mesh.material;
|
|
788
|
-
for (const i of this.objs) {
|
|
789
|
-
if (i.isFull())
|
|
790
|
-
continue;
|
|
791
|
-
if (i.geo === geo && i.material === mat) {
|
|
792
|
-
const handle = i.addInstance(mesh);
|
|
793
|
-
return handle;
|
|
794
|
-
}
|
|
795
|
-
}
|
|
796
|
-
// console.log("Add new instance mesh renderer", obj);
|
|
797
|
-
const i = new InstancedMeshRenderer(obj.name, geo, mat, 200, context);
|
|
798
|
-
this.objs.push(i);
|
|
799
|
-
const handle = i.addInstance(mesh);
|
|
800
|
-
return handle;
|
|
801
|
-
}
|
|
802
|
-
return null;
|
|
803
|
-
}
|
|
804
|
-
autoUpdateInstanceMatrix(obj) {
|
|
805
|
-
const original = obj.matrixWorld["multiplyMatrices"].bind(obj.matrixWorld);
|
|
806
|
-
const previousMatrix = obj.matrixWorld.clone();
|
|
807
|
-
const matrixChangeWrapper = (a, b) => {
|
|
808
|
-
const newMatrixWorld = original(a, b);
|
|
809
|
-
if (obj[NEED_UPDATE_INSTANCE_KEY] || previousMatrix.equals(newMatrixWorld) === false) {
|
|
810
|
-
previousMatrix.copy(newMatrixWorld);
|
|
811
|
-
obj[NEED_UPDATE_INSTANCE_KEY] = true;
|
|
812
|
-
}
|
|
813
|
-
return newMatrixWorld;
|
|
814
|
-
};
|
|
815
|
-
obj.matrixWorld["multiplyMatrices"] = matrixChangeWrapper;
|
|
816
|
-
// wrap matrixWorldNeedsUpdate
|
|
817
|
-
// let originalMatrixWorldNeedsUpdate = obj.matrixWorldNeedsUpdate;
|
|
818
|
-
// Object.defineProperty(obj, "matrixWorldNeedsUpdate", {
|
|
819
|
-
// get: () => {
|
|
820
|
-
// return originalMatrixWorldNeedsUpdate;
|
|
821
|
-
// },
|
|
822
|
-
// set: (value: boolean) => {
|
|
823
|
-
// if(value) console.warn("SET MATRIX WORLD NEEDS UPDATE");
|
|
824
|
-
// originalMatrixWorldNeedsUpdate = value;
|
|
825
|
-
// }
|
|
826
|
-
// });
|
|
827
|
-
}
|
|
828
|
-
}
|
|
829
|
-
const instancing = new InstancingHandler();
|
|
830
|
-
class InstanceHandle {
|
|
831
|
-
get name() {
|
|
832
|
-
return this.object.name;
|
|
833
|
-
}
|
|
834
|
-
instanceIndex = -1;
|
|
835
|
-
object;
|
|
836
|
-
instancer;
|
|
837
|
-
constructor(instanceIndex, originalObject, instancer) {
|
|
838
|
-
this.instanceIndex = instanceIndex;
|
|
839
|
-
this.object = originalObject;
|
|
840
|
-
this.instancer = instancer;
|
|
841
|
-
originalObject[$instancingRenderer] = instancer;
|
|
842
|
-
GameObject.markAsInstancedRendered(originalObject, true);
|
|
843
|
-
}
|
|
844
|
-
updateInstanceMatrix(updateChildren = false) {
|
|
845
|
-
if (this.instanceIndex < 0)
|
|
846
|
-
return;
|
|
847
|
-
this.object.updateWorldMatrix(true, updateChildren);
|
|
848
|
-
this.instancer.updateInstance(this.object.matrixWorld, this.instanceIndex);
|
|
849
|
-
}
|
|
850
|
-
setMatrix(matrix) {
|
|
851
|
-
if (this.instanceIndex < 0)
|
|
852
|
-
return;
|
|
853
|
-
this.instancer.updateInstance(matrix, this.instanceIndex);
|
|
854
|
-
}
|
|
855
|
-
add() {
|
|
856
|
-
if (this.instanceIndex >= 0)
|
|
857
|
-
return;
|
|
858
|
-
this.instancer.add(this);
|
|
859
|
-
}
|
|
860
|
-
remove() {
|
|
861
|
-
if (this.instanceIndex < 0)
|
|
862
|
-
return;
|
|
863
|
-
this.instancer.remove(this);
|
|
864
|
-
}
|
|
865
|
-
}
|
|
866
|
-
class InstancedMeshRenderer {
|
|
867
|
-
/** The three instanced mesh
|
|
868
|
-
* @link https://threejs.org/docs/#api/en/objects/InstancedMesh
|
|
869
|
-
*/
|
|
870
|
-
get mesh() {
|
|
871
|
-
return this.inst;
|
|
872
|
-
}
|
|
873
|
-
get visible() {
|
|
874
|
-
return this.inst.visible;
|
|
875
|
-
}
|
|
876
|
-
set visible(val) {
|
|
877
|
-
this.inst.visible = val;
|
|
878
|
-
}
|
|
879
|
-
get castShadow() {
|
|
880
|
-
return this.inst.castShadow;
|
|
881
|
-
}
|
|
882
|
-
set castShadow(val) {
|
|
883
|
-
this.inst.castShadow = val;
|
|
884
|
-
}
|
|
885
|
-
set receiveShadow(val) {
|
|
886
|
-
this.inst.receiveShadow = val;
|
|
887
|
-
}
|
|
888
|
-
updateBounds(box = true, sphere = true) {
|
|
889
|
-
this._needUpdateBounds = false;
|
|
890
|
-
if (box)
|
|
891
|
-
this.inst.computeBoundingBox();
|
|
892
|
-
if (sphere)
|
|
893
|
-
this.inst.computeBoundingSphere();
|
|
894
|
-
}
|
|
895
|
-
name = "";
|
|
896
|
-
geo;
|
|
897
|
-
material;
|
|
898
|
-
get currentCount() { return this.inst.count; }
|
|
899
|
-
context;
|
|
900
|
-
inst;
|
|
901
|
-
handles = [];
|
|
902
|
-
maxCount;
|
|
903
|
-
static nullMatrix = new THREE.Matrix4();
|
|
904
|
-
isFull() {
|
|
905
|
-
return this.currentCount >= this.maxCount;
|
|
906
|
-
}
|
|
907
|
-
_needUpdateBounds = false;
|
|
908
|
-
constructor(name, geo, material, count, context) {
|
|
909
|
-
this.name = name;
|
|
910
|
-
this.geo = geo;
|
|
911
|
-
this.material = material;
|
|
912
|
-
this.context = context;
|
|
913
|
-
this.maxCount = count;
|
|
914
|
-
if (debugInstancing) {
|
|
915
|
-
material = new THREE.MeshBasicMaterial({ color: this.randomColor() });
|
|
916
|
-
}
|
|
917
|
-
this.inst = new THREE.InstancedMesh(geo, material, count);
|
|
918
|
-
this.inst[$instancingAutoUpdateBounds] = true;
|
|
919
|
-
this.inst.count = 0;
|
|
920
|
-
this.inst.layers.set(2);
|
|
921
|
-
this.inst.visible = true;
|
|
922
|
-
// Not handled by RawShaderMaterial, so we need to set the define explicitly.
|
|
923
|
-
// Edge case: theoretically some users of the material could use it in an
|
|
924
|
-
// instanced fashion, and some others not. In that case, the material would not
|
|
925
|
-
// be able to be shared between the two use cases. We could probably add a
|
|
926
|
-
// onBeforeRender call for the InstancedMesh and set the define there.
|
|
927
|
-
// Same would apply if we support skinning -
|
|
928
|
-
// there we would have to split instanced batches so that the ones using skinning
|
|
929
|
-
// are all in the same batch.
|
|
930
|
-
if (material instanceof THREE.RawShaderMaterial) {
|
|
931
|
-
material.defines["USE_INSTANCING"] = true;
|
|
932
|
-
material.needsUpdate = true;
|
|
933
|
-
}
|
|
934
|
-
// this.inst.castShadow = true;
|
|
935
|
-
// this.inst.receiveShadow = true;
|
|
936
|
-
this.context.scene.add(this.inst);
|
|
937
|
-
context.pre_render_callbacks.push(this.onBeforeRender);
|
|
938
|
-
// console.log(this.inst);
|
|
939
|
-
// this.context.pre_render_callbacks.push(this.onPreRender.bind(this));
|
|
940
|
-
// setInterval(() => {
|
|
941
|
-
// this.inst.visible = !this.inst.visible;
|
|
942
|
-
// }, 500);
|
|
943
|
-
}
|
|
944
|
-
onBeforeRender = () => {
|
|
945
|
-
if (this._needUpdateBounds && this.inst[$instancingAutoUpdateBounds] === true) {
|
|
946
|
-
if (debugInstancing)
|
|
947
|
-
console.log("Update instancing bounds", this.name, this.inst.matrixWorldNeedsUpdate);
|
|
948
|
-
this.updateBounds();
|
|
949
|
-
}
|
|
950
|
-
};
|
|
951
|
-
randomColor() {
|
|
952
|
-
return new THREE.Color(Math.random(), Math.random(), Math.random());
|
|
953
|
-
}
|
|
954
|
-
addInstance(obj) {
|
|
955
|
-
if (this.currentCount >= this.maxCount) {
|
|
956
|
-
console.error("TOO MANY INSTANCES - resize is not yet implemented!", this.inst.count); // todo: make it resize
|
|
957
|
-
return null;
|
|
958
|
-
}
|
|
959
|
-
const handle = new InstanceHandle(-1, obj, this);
|
|
960
|
-
if (obj.castShadow === true && this.inst.castShadow === false) {
|
|
961
|
-
this.inst.castShadow = true;
|
|
962
|
-
}
|
|
963
|
-
if (obj.receiveShadow === true && this.inst.receiveShadow === false) {
|
|
964
|
-
this.inst.receiveShadow = true;
|
|
965
|
-
}
|
|
966
|
-
this.add(handle);
|
|
967
|
-
return handle;
|
|
968
|
-
}
|
|
969
|
-
add(handle) {
|
|
970
|
-
if (handle.instanceIndex < 0) {
|
|
971
|
-
handle.instanceIndex = this.currentCount;
|
|
972
|
-
// console.log(handle.instanceIndex, this.currentCount);
|
|
973
|
-
if (handle.instanceIndex >= this.handles.length)
|
|
974
|
-
this.handles.push(handle);
|
|
975
|
-
else
|
|
976
|
-
this.handles[handle.instanceIndex] = handle;
|
|
977
|
-
}
|
|
978
|
-
// console.log("Handle instance");
|
|
979
|
-
handle.object.updateWorldMatrix(true, true);
|
|
980
|
-
this.inst.setMatrixAt(handle.instanceIndex, handle.object.matrixWorld);
|
|
981
|
-
this.inst.instanceMatrix.needsUpdate = true;
|
|
982
|
-
this.inst.count += 1;
|
|
983
|
-
this._needUpdateBounds = true;
|
|
984
|
-
if (this.inst.count > 0)
|
|
985
|
-
this.inst.visible = true;
|
|
986
|
-
// console.log("Added", this.name, this.inst.count, this.handles);
|
|
987
|
-
}
|
|
988
|
-
remove(handle) {
|
|
989
|
-
if (!handle)
|
|
990
|
-
return;
|
|
991
|
-
if (handle.instanceIndex < 0 || handle.instanceIndex >= this.handles.length || this.inst.count <= 0) {
|
|
992
|
-
return;
|
|
993
|
-
}
|
|
994
|
-
if (this.handles[handle.instanceIndex] !== handle) {
|
|
995
|
-
console.error("instance handle is not part of renderer, was it removed before?", handle.instanceIndex, this.name);
|
|
996
|
-
const index = this.handles.indexOf(handle);
|
|
997
|
-
if (index < 0)
|
|
998
|
-
return;
|
|
999
|
-
handle.instanceIndex = index;
|
|
1000
|
-
}
|
|
1001
|
-
this.handles[handle.instanceIndex] = null;
|
|
1002
|
-
this.inst.setMatrixAt(handle.instanceIndex, InstancedMeshRenderer.nullMatrix);
|
|
1003
|
-
const removedLastElement = handle.instanceIndex >= this.currentCount - 1;
|
|
1004
|
-
// console.log(removedLastElement, this.currentCount, handle.instanceIndex, this.handles);
|
|
1005
|
-
if (!removedLastElement && this.currentCount > 0) {
|
|
1006
|
-
const lastElement = this.handles[this.currentCount - 1];
|
|
1007
|
-
if (lastElement) {
|
|
1008
|
-
lastElement.instanceIndex = handle.instanceIndex;
|
|
1009
|
-
lastElement.updateInstanceMatrix();
|
|
1010
|
-
this.handles[handle.instanceIndex] = lastElement;
|
|
1011
|
-
this.handles[this.currentCount - 1] = null;
|
|
1012
|
-
// this.inst.setMatrixAt(handle.instanceIndex, lastElement.object.matrixWorld);
|
|
1013
|
-
// this.inst.setMatrixAt(this.currentCount - 1, InstancedMeshRenderer.nullMatrix);
|
|
1014
|
-
}
|
|
1015
|
-
}
|
|
1016
|
-
if (this.inst.count > 0)
|
|
1017
|
-
this.inst.count -= 1;
|
|
1018
|
-
handle.instanceIndex = -1;
|
|
1019
|
-
this._needUpdateBounds = true;
|
|
1020
|
-
if (this.inst.count <= 0)
|
|
1021
|
-
this.inst.visible = false;
|
|
1022
|
-
this.inst.instanceMatrix.needsUpdate = true;
|
|
1023
|
-
}
|
|
1024
|
-
updateInstance(mat, index) {
|
|
1025
|
-
this.inst.setMatrixAt(index, mat);
|
|
1026
|
-
this.inst.instanceMatrix.needsUpdate = true;
|
|
1027
|
-
this._needUpdateBounds = true;
|
|
1028
|
-
}
|
|
1029
|
-
}
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { Behaviour, GameObject } from "./Component.js";
|
|
8
|
+
import * as THREE from "three";
|
|
9
|
+
// import { RendererCustomShader } from "./RendererCustomShader.js";
|
|
10
|
+
import { RendererLightmap } from "./RendererLightmap.js";
|
|
11
|
+
import { FrameEvent } from "../engine/engine_setup.js";
|
|
12
|
+
import { getParam } from "../engine/engine_utils.js";
|
|
13
|
+
import { serializable } from "../engine/engine_serialization_decorator.js";
|
|
14
|
+
import { AxesHelper, Material, Object3D, SkinnedMesh, Vector4 } from "three";
|
|
15
|
+
import { NEEDLE_render_objects } from "../engine/extensions/NEEDLE_render_objects.js";
|
|
16
|
+
import { NEEDLE_progressive } from "../engine/extensions/NEEDLE_progressive.js";
|
|
17
|
+
import { $instancingAutoUpdateBounds, $instancingRenderer, InstancingUtil, NEED_UPDATE_INSTANCE_KEY } from "../engine/engine_instancing.js";
|
|
18
|
+
import { ReflectionProbe } from "./ReflectionProbe.js";
|
|
19
|
+
import { setCustomVisibility } from "../engine/js-extensions/Layers.js";
|
|
20
|
+
import { isLocalNetwork } from "../engine/engine_networking_utils.js";
|
|
21
|
+
import { showBalloonWarning } from "../engine/debug/index.js";
|
|
22
|
+
import { Gizmos } from "../engine/engine_gizmos.js";
|
|
23
|
+
import { getTempVector } from "../engine/engine_three_utils.js";
|
|
24
|
+
// for staying compatible with old code
|
|
25
|
+
export { InstancingUtil } from "../engine/engine_instancing.js";
|
|
26
|
+
const debugRenderer = getParam("debugrenderer");
|
|
27
|
+
const debugskinnedmesh = getParam("debugskinnedmesh");
|
|
28
|
+
const suppressInstancing = getParam("noInstancing");
|
|
29
|
+
const debugInstancing = getParam("debuginstancing");
|
|
30
|
+
const debugProgressiveLoading = getParam("debugprogressive");
|
|
31
|
+
const suppressProgressiveLoading = getParam("noprogressive");
|
|
32
|
+
const showWireframe = getParam("wireframe");
|
|
33
|
+
export var ReflectionProbeUsage;
|
|
34
|
+
(function (ReflectionProbeUsage) {
|
|
35
|
+
ReflectionProbeUsage[ReflectionProbeUsage["Off"] = 0] = "Off";
|
|
36
|
+
ReflectionProbeUsage[ReflectionProbeUsage["BlendProbes"] = 1] = "BlendProbes";
|
|
37
|
+
ReflectionProbeUsage[ReflectionProbeUsage["BlendProbesAndSkybox"] = 2] = "BlendProbesAndSkybox";
|
|
38
|
+
ReflectionProbeUsage[ReflectionProbeUsage["Simple"] = 3] = "Simple";
|
|
39
|
+
})(ReflectionProbeUsage || (ReflectionProbeUsage = {}));
|
|
40
|
+
export class FieldWithDefault {
|
|
41
|
+
path = null;
|
|
42
|
+
asset = null;
|
|
43
|
+
default;
|
|
44
|
+
}
|
|
45
|
+
export var RenderState;
|
|
46
|
+
(function (RenderState) {
|
|
47
|
+
RenderState[RenderState["Both"] = 0] = "Both";
|
|
48
|
+
RenderState[RenderState["Back"] = 1] = "Back";
|
|
49
|
+
RenderState[RenderState["Front"] = 2] = "Front";
|
|
50
|
+
})(RenderState || (RenderState = {}));
|
|
51
|
+
// support sharedMaterials[index] assigning materials directly to the objects
|
|
52
|
+
class SharedMaterialArray {
|
|
53
|
+
_renderer;
|
|
54
|
+
_targets = [];
|
|
55
|
+
_indexMapMaxIndex;
|
|
56
|
+
_indexMap;
|
|
57
|
+
_changed = false;
|
|
58
|
+
get changed() {
|
|
59
|
+
return this._changed;
|
|
60
|
+
}
|
|
61
|
+
set changed(value) {
|
|
62
|
+
if (value === true) {
|
|
63
|
+
if (debugRenderer)
|
|
64
|
+
console.warn("SharedMaterials have changed: " + this._renderer.name, this);
|
|
65
|
+
}
|
|
66
|
+
this._changed = value;
|
|
67
|
+
}
|
|
68
|
+
is(renderer) {
|
|
69
|
+
return this._renderer === renderer;
|
|
70
|
+
}
|
|
71
|
+
constructor(renderer, originalMaterials) {
|
|
72
|
+
this._renderer = renderer;
|
|
73
|
+
const setMaterial = this.setMaterial.bind(this);
|
|
74
|
+
const getMaterial = this.getMaterial.bind(this);
|
|
75
|
+
const go = renderer.gameObject;
|
|
76
|
+
this._targets = [];
|
|
77
|
+
if (go) {
|
|
78
|
+
switch (go.type) {
|
|
79
|
+
case "Group":
|
|
80
|
+
this._targets = [...go.children];
|
|
81
|
+
break;
|
|
82
|
+
case "SkinnedMesh":
|
|
83
|
+
case "Mesh":
|
|
84
|
+
this._targets.push(go);
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// this is useful to have an index map when e.g. materials are trying to be assigned by index
|
|
89
|
+
let hasMissingMaterials = false;
|
|
90
|
+
let indexMap = undefined;
|
|
91
|
+
let maxIndex = 0;
|
|
92
|
+
for (let i = 0; i < this._targets.length; i++) {
|
|
93
|
+
const target = this._targets[i];
|
|
94
|
+
if (!target)
|
|
95
|
+
continue;
|
|
96
|
+
const mat = target.material;
|
|
97
|
+
if (!mat)
|
|
98
|
+
continue;
|
|
99
|
+
// set the shadow side to the same as the side of the material, three flips this for some reason
|
|
100
|
+
mat.shadowSide = mat.side;
|
|
101
|
+
for (let k = 0; k < originalMaterials.length; k++) {
|
|
102
|
+
const orig = originalMaterials[k];
|
|
103
|
+
if (!orig) {
|
|
104
|
+
hasMissingMaterials = true;
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
if (mat.name === orig.name) {
|
|
108
|
+
if (indexMap === undefined)
|
|
109
|
+
indexMap = new Map();
|
|
110
|
+
indexMap.set(k, i);
|
|
111
|
+
maxIndex = Math.max(maxIndex, k);
|
|
112
|
+
// console.log(`Material ${mat.name} at ${k} was found at index ${i} in renderer ${renderer.name}.`)
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
if (hasMissingMaterials) {
|
|
118
|
+
this._indexMapMaxIndex = maxIndex;
|
|
119
|
+
this._indexMap = indexMap;
|
|
120
|
+
const warningMessage = `Renderer ${renderer.name} was initialized with missing materials - this may lead to unexpected behaviour when trying to access sharedMaterials by index.`;
|
|
121
|
+
console.warn(warningMessage);
|
|
122
|
+
if (isLocalNetwork())
|
|
123
|
+
showBalloonWarning("Found renderer with missing materials: please check the console for details.");
|
|
124
|
+
}
|
|
125
|
+
// this lets us override the javascript indexer, only works in ES6 tho
|
|
126
|
+
// but like that we can use sharedMaterials[index] and it will be assigned to the object directly
|
|
127
|
+
return new Proxy(this, {
|
|
128
|
+
get(target, key) {
|
|
129
|
+
if (typeof key === "string") {
|
|
130
|
+
const index = parseInt(key);
|
|
131
|
+
if (!isNaN(index)) {
|
|
132
|
+
return getMaterial(index);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return target[key];
|
|
136
|
+
},
|
|
137
|
+
set(target, key, value) {
|
|
138
|
+
if (typeof key === "string")
|
|
139
|
+
setMaterial(value, Number.parseInt(key));
|
|
140
|
+
// console.log(target, key, value);
|
|
141
|
+
if (Reflect.set(target, key, value)) {
|
|
142
|
+
if (value instanceof Material)
|
|
143
|
+
target.changed = true;
|
|
144
|
+
return true;
|
|
145
|
+
}
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
get length() {
|
|
151
|
+
if (this._indexMapMaxIndex !== undefined)
|
|
152
|
+
return this._indexMapMaxIndex + 1;
|
|
153
|
+
return this._targets.length;
|
|
154
|
+
}
|
|
155
|
+
// iterator to support: for(const mat of sharedMaterials)
|
|
156
|
+
*[Symbol.iterator]() {
|
|
157
|
+
for (let i = 0; i < this.length; i++) {
|
|
158
|
+
yield this.getMaterial(i);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
resolveIndex(index) {
|
|
162
|
+
const map = this._indexMap;
|
|
163
|
+
// if we have a index map it means that some materials were missing
|
|
164
|
+
if (map) {
|
|
165
|
+
if (map.has(index))
|
|
166
|
+
return map.get(index);
|
|
167
|
+
// return -1;
|
|
168
|
+
}
|
|
169
|
+
return index;
|
|
170
|
+
}
|
|
171
|
+
setMaterial(mat, index) {
|
|
172
|
+
index = this.resolveIndex(index);
|
|
173
|
+
if (index < 0 || index >= this._targets.length)
|
|
174
|
+
return;
|
|
175
|
+
const target = this._targets[index];
|
|
176
|
+
if (!target || target["material"] === undefined)
|
|
177
|
+
return;
|
|
178
|
+
target["material"] = mat;
|
|
179
|
+
this.changed = true;
|
|
180
|
+
}
|
|
181
|
+
getMaterial(index) {
|
|
182
|
+
index = this.resolveIndex(index);
|
|
183
|
+
if (index < 0)
|
|
184
|
+
return null;
|
|
185
|
+
const obj = this._targets;
|
|
186
|
+
if (index >= obj.length)
|
|
187
|
+
return null;
|
|
188
|
+
const target = obj[index];
|
|
189
|
+
if (!target)
|
|
190
|
+
return null;
|
|
191
|
+
return target["material"];
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
export class Renderer extends Behaviour {
|
|
195
|
+
/** 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!
|
|
196
|
+
*
|
|
197
|
+
* 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) */
|
|
198
|
+
static setVisible(obj, visible) {
|
|
199
|
+
setCustomVisibility(obj, visible);
|
|
200
|
+
}
|
|
201
|
+
receiveShadows = false;
|
|
202
|
+
shadowCastingMode = ShadowCastingMode.Off;
|
|
203
|
+
lightmapIndex = -1;
|
|
204
|
+
lightmapScaleOffset = new THREE.Vector4(1, 1, 0, 0);
|
|
205
|
+
enableInstancing = undefined;
|
|
206
|
+
renderOrder = undefined;
|
|
207
|
+
allowOcclusionWhenDynamic = true;
|
|
208
|
+
probeAnchor;
|
|
209
|
+
reflectionProbeUsage = ReflectionProbeUsage.Off;
|
|
210
|
+
// custom shader
|
|
211
|
+
// get materialProperties(): Array<MaterialProperties> | undefined {
|
|
212
|
+
// return this._materialProperties;
|
|
213
|
+
// }
|
|
214
|
+
// set materialProperties(value: Array<MaterialProperties> | undefined) {
|
|
215
|
+
// this._materialProperties = value;
|
|
216
|
+
// }
|
|
217
|
+
// private customShaderHandler: RendererCustomShader | undefined = undefined;
|
|
218
|
+
// private _materialProperties: Array<MaterialProperties> | undefined = undefined;
|
|
219
|
+
_lightmaps;
|
|
220
|
+
get sharedMesh() {
|
|
221
|
+
if (this.gameObject.type === "Mesh") {
|
|
222
|
+
return this.gameObject;
|
|
223
|
+
}
|
|
224
|
+
else if (this.gameObject.type === "SkinnesMesh") {
|
|
225
|
+
return this.gameObject;
|
|
226
|
+
}
|
|
227
|
+
else if (this.gameObject.type === "Group") {
|
|
228
|
+
return this.gameObject.children[0];
|
|
229
|
+
}
|
|
230
|
+
return undefined;
|
|
231
|
+
}
|
|
232
|
+
get sharedMaterial() {
|
|
233
|
+
return this.sharedMaterials[0];
|
|
234
|
+
}
|
|
235
|
+
set sharedMaterial(mat) {
|
|
236
|
+
const cur = this.sharedMaterials[0];
|
|
237
|
+
if (cur === mat)
|
|
238
|
+
return;
|
|
239
|
+
this.sharedMaterials[0] = mat;
|
|
240
|
+
this.applyLightmapping();
|
|
241
|
+
}
|
|
242
|
+
/**@deprecated please use sharedMaterial */
|
|
243
|
+
get material() {
|
|
244
|
+
return this.sharedMaterials[0];
|
|
245
|
+
}
|
|
246
|
+
/**@deprecated please use sharedMaterial */
|
|
247
|
+
set material(mat) {
|
|
248
|
+
this.sharedMaterial = mat;
|
|
249
|
+
}
|
|
250
|
+
_sharedMaterials;
|
|
251
|
+
_originalMaterials;
|
|
252
|
+
// this is just available during deserialization
|
|
253
|
+
set sharedMaterials(_val) {
|
|
254
|
+
// TODO: elements in the array might be missing at the moment which leads to problems if an index is serialized
|
|
255
|
+
if (!this._originalMaterials) {
|
|
256
|
+
this._originalMaterials = _val;
|
|
257
|
+
}
|
|
258
|
+
else if (_val) {
|
|
259
|
+
let didWarn = false;
|
|
260
|
+
for (let i = 0; i < this._sharedMaterials.length; i++) {
|
|
261
|
+
const mat = i < _val.length ? _val[i] : null;
|
|
262
|
+
if (mat && mat instanceof Material) {
|
|
263
|
+
this.sharedMaterials[i] = mat;
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
if (!didWarn) {
|
|
267
|
+
didWarn = true;
|
|
268
|
+
console.warn("Can not assign null as material: " + this.name, mat);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
//@ts-ignore
|
|
275
|
+
get sharedMaterials() {
|
|
276
|
+
if (!this._sharedMaterials || !this._sharedMaterials.is(this)) {
|
|
277
|
+
if (!this._originalMaterials)
|
|
278
|
+
this._originalMaterials = [];
|
|
279
|
+
this._sharedMaterials = new SharedMaterialArray(this, this._originalMaterials);
|
|
280
|
+
}
|
|
281
|
+
return this._sharedMaterials;
|
|
282
|
+
}
|
|
283
|
+
static get shouldSuppressInstancing() {
|
|
284
|
+
return suppressInstancing;
|
|
285
|
+
}
|
|
286
|
+
_lightmapTextureOverride = undefined;
|
|
287
|
+
get lightmap() {
|
|
288
|
+
if (this._lightmaps?.length) {
|
|
289
|
+
return this._lightmaps[0].lightmap;
|
|
290
|
+
}
|
|
291
|
+
return null;
|
|
292
|
+
}
|
|
293
|
+
/** set undefined to return to default lightmap */
|
|
294
|
+
set lightmap(tex) {
|
|
295
|
+
this._lightmapTextureOverride = tex;
|
|
296
|
+
if (tex === undefined) {
|
|
297
|
+
tex = this.context.lightmaps.tryGetLightmap(this.sourceId, this.lightmapIndex);
|
|
298
|
+
}
|
|
299
|
+
if (this._lightmaps?.length) {
|
|
300
|
+
for (const lm of this._lightmaps) {
|
|
301
|
+
lm.lightmap = tex;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
get hasLightmap() {
|
|
306
|
+
const lm = this.lightmap;
|
|
307
|
+
return lm !== null && lm !== undefined;
|
|
308
|
+
}
|
|
309
|
+
allowProgressiveLoading = true;
|
|
310
|
+
registering() {
|
|
311
|
+
if (!this.enabled) {
|
|
312
|
+
this.setVisibility(false);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
awake() {
|
|
316
|
+
if (debugRenderer)
|
|
317
|
+
console.log("Renderer ", this.name, this);
|
|
318
|
+
this.clearInstancingState();
|
|
319
|
+
if (this.probeAnchor && debugRenderer)
|
|
320
|
+
this.probeAnchor.add(new AxesHelper(.2));
|
|
321
|
+
this._reflectionProbe = null;
|
|
322
|
+
if (this.isMultiMaterialObject(this.gameObject)) {
|
|
323
|
+
for (const child of this.gameObject.children) {
|
|
324
|
+
this.context.addBeforeRenderListener(child, this.onBeforeRenderThree);
|
|
325
|
+
child.layers.mask = this.gameObject.layers.mask;
|
|
326
|
+
}
|
|
327
|
+
if (this.renderOrder !== undefined) {
|
|
328
|
+
// Objects can have nested renderers (e.g. contain 2 meshes and then again another group)
|
|
329
|
+
// or perhaps just regular child objects that have their own renderer component (?)
|
|
330
|
+
let index = 0;
|
|
331
|
+
for (let i = 0; i < this.gameObject.children.length; i++) {
|
|
332
|
+
const ch = this.gameObject.children[i];
|
|
333
|
+
// ignore nested groups or objects that have their own renderer (aka their own render order settings)
|
|
334
|
+
if (!this.isMeshOrSkinnedMesh(ch) || GameObject.getComponent(ch, Renderer))
|
|
335
|
+
continue;
|
|
336
|
+
if (this.renderOrder.length <= index) {
|
|
337
|
+
console.warn("Incorrect renderOrder element count", this, this.renderOrder.length + " but expected " + this.gameObject.children.length, "Index: " + index, "ChildElement:", ch);
|
|
338
|
+
continue;
|
|
339
|
+
}
|
|
340
|
+
// if(debugRenderer) console.log("Setting render order", ch, this.renderOrder[index])
|
|
341
|
+
ch.renderOrder = this.renderOrder[index];
|
|
342
|
+
index += 1;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
// TODO: custom shader with sub materials
|
|
347
|
+
else if (this.isMeshOrSkinnedMesh(this.gameObject)) {
|
|
348
|
+
this.context.addBeforeRenderListener(this.gameObject, this.onBeforeRenderThree);
|
|
349
|
+
if (this.renderOrder !== undefined && this.renderOrder.length > 0)
|
|
350
|
+
this.gameObject.renderOrder = this.renderOrder[0];
|
|
351
|
+
}
|
|
352
|
+
else {
|
|
353
|
+
this.context.addBeforeRenderListener(this.gameObject, this.onBeforeRenderThree);
|
|
354
|
+
}
|
|
355
|
+
this.applyLightmapping();
|
|
356
|
+
if (showWireframe) {
|
|
357
|
+
for (let i = 0; i < this.sharedMaterials.length; i++) {
|
|
358
|
+
const mat = this.sharedMaterials[i];
|
|
359
|
+
if (mat) {
|
|
360
|
+
mat.wireframe = true;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
applyLightmapping() {
|
|
366
|
+
if (this.lightmapIndex >= 0) {
|
|
367
|
+
const type = this.gameObject.type;
|
|
368
|
+
// use the override lightmap if its not undefined
|
|
369
|
+
const tex = this._lightmapTextureOverride !== undefined
|
|
370
|
+
? this._lightmapTextureOverride
|
|
371
|
+
: this.context.lightmaps.tryGetLightmap(this.sourceId, this.lightmapIndex);
|
|
372
|
+
if (tex) {
|
|
373
|
+
if (!this._lightmaps)
|
|
374
|
+
this._lightmaps = [];
|
|
375
|
+
if (type === "Mesh") {
|
|
376
|
+
const mat = this.gameObject["material"];
|
|
377
|
+
if (!mat?.isMeshBasicMaterial) {
|
|
378
|
+
if (this._lightmaps.length <= 0) {
|
|
379
|
+
const rm = new RendererLightmap(this.gameObject, this.context);
|
|
380
|
+
this._lightmaps.push(rm);
|
|
381
|
+
}
|
|
382
|
+
const rm = this._lightmaps[0];
|
|
383
|
+
rm.init(this.lightmapIndex, this.lightmapScaleOffset, tex);
|
|
384
|
+
}
|
|
385
|
+
else {
|
|
386
|
+
if (mat)
|
|
387
|
+
console.warn("Lightmapping is not supported on MeshBasicMaterial", mat.name);
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
// for multi materials we need to loop through children
|
|
391
|
+
// and then we add a lightmap renderer component to each of them
|
|
392
|
+
else if (this.isMultiMaterialObject(this.gameObject) && this.sharedMaterials.length > 0) {
|
|
393
|
+
for (let i = 0; i < this.gameObject.children.length; i++) {
|
|
394
|
+
const child = this.gameObject.children[i];
|
|
395
|
+
if (!child["material"]?.isMeshBasicMaterial) {
|
|
396
|
+
let rm = undefined;
|
|
397
|
+
if (i >= this._lightmaps.length) {
|
|
398
|
+
rm = new RendererLightmap(child, this.context);
|
|
399
|
+
this._lightmaps.push(rm);
|
|
400
|
+
}
|
|
401
|
+
else
|
|
402
|
+
rm = this._lightmaps[i];
|
|
403
|
+
rm.init(this.lightmapIndex, this.lightmapScaleOffset, tex);
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
else {
|
|
409
|
+
if (debugRenderer)
|
|
410
|
+
console.warn("Lightmap not found", this.sourceId, this.lightmapIndex);
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
_isInstancingEnabled = false;
|
|
415
|
+
handles = undefined;
|
|
416
|
+
prevLayers = undefined;
|
|
417
|
+
clearInstancingState() {
|
|
418
|
+
this._isInstancingEnabled = false;
|
|
419
|
+
this.handles = undefined;
|
|
420
|
+
this.prevLayers = undefined;
|
|
421
|
+
}
|
|
422
|
+
setInstancingEnabled(enabled) {
|
|
423
|
+
if (this._isInstancingEnabled === enabled)
|
|
424
|
+
return enabled && (this.handles === undefined || this.handles != null && this.handles.length > 0);
|
|
425
|
+
this._isInstancingEnabled = enabled;
|
|
426
|
+
if (enabled) {
|
|
427
|
+
if (this.handles === undefined) {
|
|
428
|
+
this.handles = instancing.setup(this, this.gameObject, this.context, null, { rend: this, foundMeshes: 0, useMatrixWorldAutoUpdate: this.useInstanceMatrixWorldAutoUpdate() });
|
|
429
|
+
if (this.handles) {
|
|
430
|
+
GameObject.markAsInstancedRendered(this.gameObject, true);
|
|
431
|
+
return true;
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
else if (this.handles !== null) {
|
|
435
|
+
for (const handler of this.handles) {
|
|
436
|
+
handler.updateInstanceMatrix(true);
|
|
437
|
+
handler.add();
|
|
438
|
+
}
|
|
439
|
+
GameObject.markAsInstancedRendered(this.gameObject, true);
|
|
440
|
+
return true;
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
else {
|
|
444
|
+
if (this.handles) {
|
|
445
|
+
for (const handler of this.handles) {
|
|
446
|
+
handler.remove();
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
return true;
|
|
450
|
+
}
|
|
451
|
+
return false;
|
|
452
|
+
}
|
|
453
|
+
/** Return true to wrap matrix update events for instanced rendering to update instance matrices automatically when matrixWorld changes
|
|
454
|
+
* This is a separate method to be overrideable from user code
|
|
455
|
+
*/
|
|
456
|
+
useInstanceMatrixWorldAutoUpdate() {
|
|
457
|
+
return true;
|
|
458
|
+
}
|
|
459
|
+
start() {
|
|
460
|
+
if (this.enableInstancing && !suppressInstancing) {
|
|
461
|
+
this.setInstancingEnabled(true);
|
|
462
|
+
// make sure the instance is marked dirty once for cases where e.g. an animator animates the instanced object
|
|
463
|
+
// in the first frame we want the updated matrix then to be applied immediately to the instancing
|
|
464
|
+
InstancingUtil.markDirty(this.gameObject);
|
|
465
|
+
}
|
|
466
|
+
this.gameObject.frustumCulled = this.allowOcclusionWhenDynamic;
|
|
467
|
+
if (this.isMultiMaterialObject(this.gameObject)) {
|
|
468
|
+
for (let i = 0; i < this.gameObject.children.length; i++) {
|
|
469
|
+
const ch = this.gameObject.children[i];
|
|
470
|
+
ch.frustumCulled = this.allowOcclusionWhenDynamic;
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
onEnable() {
|
|
475
|
+
this.setVisibility(true);
|
|
476
|
+
if (this._isInstancingEnabled) {
|
|
477
|
+
this.setInstancingEnabled(true);
|
|
478
|
+
}
|
|
479
|
+
else if (this.enabled) {
|
|
480
|
+
// this.gameObject.visible = true;
|
|
481
|
+
this.applyStencil();
|
|
482
|
+
}
|
|
483
|
+
this.updateReflectionProbe();
|
|
484
|
+
}
|
|
485
|
+
onDisable() {
|
|
486
|
+
this.setVisibility(false);
|
|
487
|
+
if (this.handles && this.handles.length > 0) {
|
|
488
|
+
this.setInstancingEnabled(false);
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
onDestroy() {
|
|
492
|
+
this.handles = null;
|
|
493
|
+
if (this.isMultiMaterialObject(this.gameObject)) {
|
|
494
|
+
for (const child of this.gameObject.children) {
|
|
495
|
+
this.context.removeBeforeRenderListener(child, this.onBeforeRenderThree);
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
else {
|
|
499
|
+
this.context.removeBeforeRenderListener(this.gameObject, this.onBeforeRenderThree);
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
applyStencil() {
|
|
503
|
+
NEEDLE_render_objects.applyStencil(this);
|
|
504
|
+
}
|
|
505
|
+
onBeforeRender() {
|
|
506
|
+
if (!this.gameObject) {
|
|
507
|
+
return;
|
|
508
|
+
}
|
|
509
|
+
if (this.isMultiMaterialObject(this.gameObject) && this.gameObject.children?.length > 0) {
|
|
510
|
+
for (const ch of this.gameObject.children) {
|
|
511
|
+
this.applySettings(ch);
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
else {
|
|
515
|
+
this.applySettings(this.gameObject);
|
|
516
|
+
}
|
|
517
|
+
if (this.sharedMaterials.changed) {
|
|
518
|
+
this.sharedMaterials.changed = false;
|
|
519
|
+
this.applyLightmapping();
|
|
520
|
+
}
|
|
521
|
+
if (this.handles?.length) {
|
|
522
|
+
// if (this.name === "Darbouka")
|
|
523
|
+
// console.log(this.name, this.gameObject.matrixWorldNeedsUpdate);
|
|
524
|
+
const needsUpdate = this.gameObject[NEED_UPDATE_INSTANCE_KEY] === true; // || this.gameObject.matrixWorldNeedsUpdate;
|
|
525
|
+
if (needsUpdate) {
|
|
526
|
+
if (debugInstancing)
|
|
527
|
+
console.log("UPDATE INSTANCED MATRICES", this.context.time.frame);
|
|
528
|
+
this.gameObject[NEED_UPDATE_INSTANCE_KEY] = false;
|
|
529
|
+
const remove = false; // Math.random() < .01;
|
|
530
|
+
for (let i = this.handles.length - 1; i >= 0; i--) {
|
|
531
|
+
const h = this.handles[i];
|
|
532
|
+
if (remove) {
|
|
533
|
+
h.remove();
|
|
534
|
+
this.handles.splice(i, 1);
|
|
535
|
+
}
|
|
536
|
+
else
|
|
537
|
+
h.updateInstanceMatrix();
|
|
538
|
+
}
|
|
539
|
+
this.gameObject.matrixWorldNeedsUpdate = false;
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
if (this.handles && this.handles.length <= 0) {
|
|
543
|
+
GameObject.markAsInstancedRendered(this.gameObject, false);
|
|
544
|
+
}
|
|
545
|
+
if (this._isInstancingEnabled && this.handles) {
|
|
546
|
+
for (let i = 0; i < this.handles.length; i++) {
|
|
547
|
+
const handle = this.handles[i];
|
|
548
|
+
if (!this.prevLayers)
|
|
549
|
+
this.prevLayers = [];
|
|
550
|
+
const layer = handle.object.layers.mask;
|
|
551
|
+
if (i >= this.prevLayers.length)
|
|
552
|
+
this.prevLayers.push(layer);
|
|
553
|
+
else
|
|
554
|
+
this.prevLayers[i] = layer;
|
|
555
|
+
handle.object.layers.disableAll();
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
for (const mat of this.sharedMaterials) {
|
|
559
|
+
if (mat)
|
|
560
|
+
this.loadProgressiveTextures(mat);
|
|
561
|
+
}
|
|
562
|
+
if (this.reflectionProbeUsage !== ReflectionProbeUsage.Off && this._reflectionProbe) {
|
|
563
|
+
this._reflectionProbe.onSet(this);
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
onBeforeRenderThree = (_renderer, _scene, _camera, _geometry, material, _group) => {
|
|
567
|
+
if (material.envMapIntensity !== undefined) {
|
|
568
|
+
const factor = this.hasLightmap ? Math.PI : 1;
|
|
569
|
+
const environmentIntensity = this.context.mainCameraComponent?.environmentIntensity ?? 1;
|
|
570
|
+
material.envMapIntensity = Math.max(0, environmentIntensity * this.context.sceneLighting.environmentIntensity / factor);
|
|
571
|
+
}
|
|
572
|
+
// if (this._reflectionProbe?.texture) {
|
|
573
|
+
// material.envMap = this._reflectionProbe.texture;
|
|
574
|
+
// // this.context.renderer.prop
|
|
575
|
+
// // console.log(material.name);
|
|
576
|
+
// // this.context.renderer.properties.get(material);
|
|
577
|
+
// // this.context.renderer.properties.update(material, "environment", this._reflectionProbe.texture);
|
|
578
|
+
// }
|
|
579
|
+
// _scene.environment = null;
|
|
580
|
+
// else _scene.environment = Renderer.envmap;
|
|
581
|
+
// if (!material.envmap)
|
|
582
|
+
// material.envMap = Renderer.envmap;
|
|
583
|
+
// material.needsUpdate = true;
|
|
584
|
+
// if (!camera) {
|
|
585
|
+
// let isXRCamera = false;
|
|
586
|
+
// if (this.context.isInXR) {
|
|
587
|
+
// // @ts-ignore
|
|
588
|
+
// const arr = this.context.renderer.xr.getCamera() as ArrayCamera;
|
|
589
|
+
// if (arr.cameras?.length > 0) {
|
|
590
|
+
// camera = arr;
|
|
591
|
+
// isXRCamera = true;
|
|
592
|
+
// }
|
|
593
|
+
// }
|
|
594
|
+
// }
|
|
595
|
+
// if (this.customShaderHandler) {
|
|
596
|
+
// this.customShaderHandler.onBeforeRender(renderer, scene, camera, geometry, material, group);
|
|
597
|
+
// }
|
|
598
|
+
// else if (this.rawShaderHandler) {
|
|
599
|
+
// for (const h of this.rawShaderHandler) {
|
|
600
|
+
// h.onBeforeRender(this.gameObject, camera);
|
|
601
|
+
// }
|
|
602
|
+
// }
|
|
603
|
+
if (this._lightmaps) {
|
|
604
|
+
for (const lm of this._lightmaps) {
|
|
605
|
+
lm.updateLightmapUniforms(material);
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
};
|
|
609
|
+
onAfterRender() {
|
|
610
|
+
if (this._isInstancingEnabled && this.handles && this.prevLayers && this.prevLayers.length >= this.handles.length) {
|
|
611
|
+
for (let i = 0; i < this.handles.length; i++) {
|
|
612
|
+
const handle = this.handles[i];
|
|
613
|
+
handle.object.layers.mask = this.prevLayers[i];
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
if (this.reflectionProbeUsage !== ReflectionProbeUsage.Off && this._reflectionProbe) {
|
|
617
|
+
this._reflectionProbe.onUnset(this);
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
loadProgressiveTextures(material) {
|
|
621
|
+
// progressive load before rendering so we only load textures for visible materials
|
|
622
|
+
if (!suppressProgressiveLoading && material) {
|
|
623
|
+
if (material["_didRequestTextureLOD"] === undefined && this.allowProgressiveLoading) {
|
|
624
|
+
material["_didRequestTextureLOD"] = 0;
|
|
625
|
+
if (debugProgressiveLoading) {
|
|
626
|
+
console.log("Load material LOD", material.name);
|
|
627
|
+
}
|
|
628
|
+
return NEEDLE_progressive.assignTextureLOD(this.context, this.sourceId, material);
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
return Promise.resolve(true);
|
|
632
|
+
}
|
|
633
|
+
applySettings(go) {
|
|
634
|
+
go.receiveShadow = this.receiveShadows;
|
|
635
|
+
if (this.shadowCastingMode == ShadowCastingMode.On) {
|
|
636
|
+
go.castShadow = true;
|
|
637
|
+
}
|
|
638
|
+
else
|
|
639
|
+
go.castShadow = false;
|
|
640
|
+
}
|
|
641
|
+
_reflectionProbe = null;
|
|
642
|
+
updateReflectionProbe() {
|
|
643
|
+
// handle reflection probe
|
|
644
|
+
this._reflectionProbe = null;
|
|
645
|
+
if (this.reflectionProbeUsage !== ReflectionProbeUsage.Off) {
|
|
646
|
+
if (!this.probeAnchor)
|
|
647
|
+
return;
|
|
648
|
+
// update the reflection probe right before rendering
|
|
649
|
+
// if we do it immediately the reflection probe might not be enabled yet
|
|
650
|
+
// (since this method is called from onEnable)
|
|
651
|
+
this.startCoroutine(this._updateReflectionProbe(), FrameEvent.LateUpdate);
|
|
652
|
+
}
|
|
653
|
+
}
|
|
654
|
+
*_updateReflectionProbe() {
|
|
655
|
+
const obj = this.probeAnchor || this.gameObject;
|
|
656
|
+
const isAnchor = this.probeAnchor ? true : false;
|
|
657
|
+
this._reflectionProbe = ReflectionProbe.get(obj, this.context, isAnchor, this.probeAnchor);
|
|
658
|
+
}
|
|
659
|
+
setVisibility(visible) {
|
|
660
|
+
if (!this.isMultiMaterialObject(this.gameObject)) {
|
|
661
|
+
setCustomVisibility(this.gameObject, visible);
|
|
662
|
+
}
|
|
663
|
+
else {
|
|
664
|
+
for (const ch of this.gameObject.children) {
|
|
665
|
+
if (this.isMeshOrSkinnedMesh(ch)) {
|
|
666
|
+
setCustomVisibility(ch, visible);
|
|
667
|
+
}
|
|
668
|
+
}
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
isMultiMaterialObject(obj) {
|
|
672
|
+
return obj.type === "Group";
|
|
673
|
+
}
|
|
674
|
+
isMeshOrSkinnedMesh(obj) {
|
|
675
|
+
return obj.type === "Mesh" || obj.type === "SkinnedMesh";
|
|
676
|
+
}
|
|
677
|
+
}
|
|
678
|
+
__decorate([
|
|
679
|
+
serializable()
|
|
680
|
+
], Renderer.prototype, "receiveShadows", void 0);
|
|
681
|
+
__decorate([
|
|
682
|
+
serializable()
|
|
683
|
+
], Renderer.prototype, "shadowCastingMode", void 0);
|
|
684
|
+
__decorate([
|
|
685
|
+
serializable()
|
|
686
|
+
], Renderer.prototype, "lightmapIndex", void 0);
|
|
687
|
+
__decorate([
|
|
688
|
+
serializable(Vector4)
|
|
689
|
+
], Renderer.prototype, "lightmapScaleOffset", void 0);
|
|
690
|
+
__decorate([
|
|
691
|
+
serializable()
|
|
692
|
+
], Renderer.prototype, "enableInstancing", void 0);
|
|
693
|
+
__decorate([
|
|
694
|
+
serializable()
|
|
695
|
+
], Renderer.prototype, "renderOrder", void 0);
|
|
696
|
+
__decorate([
|
|
697
|
+
serializable()
|
|
698
|
+
], Renderer.prototype, "allowOcclusionWhenDynamic", void 0);
|
|
699
|
+
__decorate([
|
|
700
|
+
serializable(Object3D)
|
|
701
|
+
], Renderer.prototype, "probeAnchor", void 0);
|
|
702
|
+
__decorate([
|
|
703
|
+
serializable()
|
|
704
|
+
], Renderer.prototype, "reflectionProbeUsage", void 0);
|
|
705
|
+
export class MeshRenderer extends Renderer {
|
|
706
|
+
}
|
|
707
|
+
export class SkinnedMeshRenderer extends MeshRenderer {
|
|
708
|
+
awake() {
|
|
709
|
+
super.awake();
|
|
710
|
+
// disable skinned mesh occlusion because of https://github.com/mrdoob/three.js/issues/14499
|
|
711
|
+
this.allowOcclusionWhenDynamic = false;
|
|
712
|
+
// If we don't do that here the bounding sphere matrix used for raycasts will be wrong. Not sure *why* this is necessary
|
|
713
|
+
this.gameObject.parent?.updateWorldMatrix(false, true);
|
|
714
|
+
}
|
|
715
|
+
onBeforeRender() {
|
|
716
|
+
super.onBeforeRender();
|
|
717
|
+
if (debugskinnedmesh && this.gameObject instanceof SkinnedMesh && this.gameObject.boundingSphere) {
|
|
718
|
+
const tempCenter = getTempVector(this.gameObject.boundingSphere.center).applyMatrix4(this.gameObject.matrixWorld);
|
|
719
|
+
Gizmos.DrawWireSphere(tempCenter, this.gameObject.boundingSphere.radius, "red");
|
|
720
|
+
}
|
|
721
|
+
}
|
|
722
|
+
}
|
|
723
|
+
export var ShadowCastingMode;
|
|
724
|
+
(function (ShadowCastingMode) {
|
|
725
|
+
/// <summary>
|
|
726
|
+
/// <para>No shadows are cast from this object.</para>
|
|
727
|
+
/// </summary>
|
|
728
|
+
ShadowCastingMode[ShadowCastingMode["Off"] = 0] = "Off";
|
|
729
|
+
/// <summary>
|
|
730
|
+
/// <para>Shadows are cast from this object.</para>
|
|
731
|
+
/// </summary>
|
|
732
|
+
ShadowCastingMode[ShadowCastingMode["On"] = 1] = "On";
|
|
733
|
+
/// <summary>
|
|
734
|
+
/// <para>Shadows are cast from this object, treating it as two-sided.</para>
|
|
735
|
+
/// </summary>
|
|
736
|
+
ShadowCastingMode[ShadowCastingMode["TwoSided"] = 2] = "TwoSided";
|
|
737
|
+
/// <summary>
|
|
738
|
+
/// <para>Object casts shadows, but is otherwise invisible in the Scene.</para>
|
|
739
|
+
/// </summary>
|
|
740
|
+
ShadowCastingMode[ShadowCastingMode["ShadowsOnly"] = 3] = "ShadowsOnly";
|
|
741
|
+
})(ShadowCastingMode || (ShadowCastingMode = {}));
|
|
742
|
+
;
|
|
743
|
+
class InstancingHandler {
|
|
744
|
+
objs = [];
|
|
745
|
+
setup(renderer, obj, context, handlesArray, args, level = 0) {
|
|
746
|
+
// make sure setting casting settings are applied so when we add the mesh to the InstancedMesh we can ask for the correct cast shadow setting
|
|
747
|
+
renderer.applySettings(obj);
|
|
748
|
+
const res = this.tryCreateOrAddInstance(obj, context, args);
|
|
749
|
+
if (res) {
|
|
750
|
+
renderer.loadProgressiveTextures(res.instancer.material);
|
|
751
|
+
if (handlesArray === null)
|
|
752
|
+
handlesArray = [];
|
|
753
|
+
handlesArray.push(res);
|
|
754
|
+
}
|
|
755
|
+
else if (level <= 0 && obj.type !== "Mesh") {
|
|
756
|
+
const nextLevel = level + 1;
|
|
757
|
+
for (const ch of obj.children) {
|
|
758
|
+
handlesArray = this.setup(renderer, ch, context, handlesArray, args, nextLevel);
|
|
759
|
+
}
|
|
760
|
+
}
|
|
761
|
+
if (level === 0) {
|
|
762
|
+
// For multi material objects we only want to track the root object's matrix
|
|
763
|
+
if (args.useMatrixWorldAutoUpdate && handlesArray && handlesArray.length >= 0) {
|
|
764
|
+
this.autoUpdateInstanceMatrix(obj);
|
|
765
|
+
}
|
|
766
|
+
}
|
|
767
|
+
return handlesArray;
|
|
768
|
+
}
|
|
769
|
+
tryCreateOrAddInstance(obj, context, args) {
|
|
770
|
+
if (obj.type === "Mesh") {
|
|
771
|
+
const index = args.foundMeshes;
|
|
772
|
+
args.foundMeshes += 1;
|
|
773
|
+
if (!args.rend.enableInstancing)
|
|
774
|
+
return null;
|
|
775
|
+
if (index >= args.rend.enableInstancing.length) {
|
|
776
|
+
// console.error("Something is wrong with instance setup", obj, args.rend.enableInstancing, index);
|
|
777
|
+
return null;
|
|
778
|
+
}
|
|
779
|
+
if (!args.rend.enableInstancing[index]) {
|
|
780
|
+
// instancing is disabled
|
|
781
|
+
// console.log("Instancing is disabled", obj);
|
|
782
|
+
return null;
|
|
783
|
+
}
|
|
784
|
+
// instancing is enabled:
|
|
785
|
+
const mesh = obj;
|
|
786
|
+
const geo = mesh.geometry;
|
|
787
|
+
const mat = mesh.material;
|
|
788
|
+
for (const i of this.objs) {
|
|
789
|
+
if (i.isFull())
|
|
790
|
+
continue;
|
|
791
|
+
if (i.geo === geo && i.material === mat) {
|
|
792
|
+
const handle = i.addInstance(mesh);
|
|
793
|
+
return handle;
|
|
794
|
+
}
|
|
795
|
+
}
|
|
796
|
+
// console.log("Add new instance mesh renderer", obj);
|
|
797
|
+
const i = new InstancedMeshRenderer(obj.name, geo, mat, 200, context);
|
|
798
|
+
this.objs.push(i);
|
|
799
|
+
const handle = i.addInstance(mesh);
|
|
800
|
+
return handle;
|
|
801
|
+
}
|
|
802
|
+
return null;
|
|
803
|
+
}
|
|
804
|
+
autoUpdateInstanceMatrix(obj) {
|
|
805
|
+
const original = obj.matrixWorld["multiplyMatrices"].bind(obj.matrixWorld);
|
|
806
|
+
const previousMatrix = obj.matrixWorld.clone();
|
|
807
|
+
const matrixChangeWrapper = (a, b) => {
|
|
808
|
+
const newMatrixWorld = original(a, b);
|
|
809
|
+
if (obj[NEED_UPDATE_INSTANCE_KEY] || previousMatrix.equals(newMatrixWorld) === false) {
|
|
810
|
+
previousMatrix.copy(newMatrixWorld);
|
|
811
|
+
obj[NEED_UPDATE_INSTANCE_KEY] = true;
|
|
812
|
+
}
|
|
813
|
+
return newMatrixWorld;
|
|
814
|
+
};
|
|
815
|
+
obj.matrixWorld["multiplyMatrices"] = matrixChangeWrapper;
|
|
816
|
+
// wrap matrixWorldNeedsUpdate
|
|
817
|
+
// let originalMatrixWorldNeedsUpdate = obj.matrixWorldNeedsUpdate;
|
|
818
|
+
// Object.defineProperty(obj, "matrixWorldNeedsUpdate", {
|
|
819
|
+
// get: () => {
|
|
820
|
+
// return originalMatrixWorldNeedsUpdate;
|
|
821
|
+
// },
|
|
822
|
+
// set: (value: boolean) => {
|
|
823
|
+
// if(value) console.warn("SET MATRIX WORLD NEEDS UPDATE");
|
|
824
|
+
// originalMatrixWorldNeedsUpdate = value;
|
|
825
|
+
// }
|
|
826
|
+
// });
|
|
827
|
+
}
|
|
828
|
+
}
|
|
829
|
+
const instancing = new InstancingHandler();
|
|
830
|
+
class InstanceHandle {
|
|
831
|
+
get name() {
|
|
832
|
+
return this.object.name;
|
|
833
|
+
}
|
|
834
|
+
instanceIndex = -1;
|
|
835
|
+
object;
|
|
836
|
+
instancer;
|
|
837
|
+
constructor(instanceIndex, originalObject, instancer) {
|
|
838
|
+
this.instanceIndex = instanceIndex;
|
|
839
|
+
this.object = originalObject;
|
|
840
|
+
this.instancer = instancer;
|
|
841
|
+
originalObject[$instancingRenderer] = instancer;
|
|
842
|
+
GameObject.markAsInstancedRendered(originalObject, true);
|
|
843
|
+
}
|
|
844
|
+
updateInstanceMatrix(updateChildren = false) {
|
|
845
|
+
if (this.instanceIndex < 0)
|
|
846
|
+
return;
|
|
847
|
+
this.object.updateWorldMatrix(true, updateChildren);
|
|
848
|
+
this.instancer.updateInstance(this.object.matrixWorld, this.instanceIndex);
|
|
849
|
+
}
|
|
850
|
+
setMatrix(matrix) {
|
|
851
|
+
if (this.instanceIndex < 0)
|
|
852
|
+
return;
|
|
853
|
+
this.instancer.updateInstance(matrix, this.instanceIndex);
|
|
854
|
+
}
|
|
855
|
+
add() {
|
|
856
|
+
if (this.instanceIndex >= 0)
|
|
857
|
+
return;
|
|
858
|
+
this.instancer.add(this);
|
|
859
|
+
}
|
|
860
|
+
remove() {
|
|
861
|
+
if (this.instanceIndex < 0)
|
|
862
|
+
return;
|
|
863
|
+
this.instancer.remove(this);
|
|
864
|
+
}
|
|
865
|
+
}
|
|
866
|
+
class InstancedMeshRenderer {
|
|
867
|
+
/** The three instanced mesh
|
|
868
|
+
* @link https://threejs.org/docs/#api/en/objects/InstancedMesh
|
|
869
|
+
*/
|
|
870
|
+
get mesh() {
|
|
871
|
+
return this.inst;
|
|
872
|
+
}
|
|
873
|
+
get visible() {
|
|
874
|
+
return this.inst.visible;
|
|
875
|
+
}
|
|
876
|
+
set visible(val) {
|
|
877
|
+
this.inst.visible = val;
|
|
878
|
+
}
|
|
879
|
+
get castShadow() {
|
|
880
|
+
return this.inst.castShadow;
|
|
881
|
+
}
|
|
882
|
+
set castShadow(val) {
|
|
883
|
+
this.inst.castShadow = val;
|
|
884
|
+
}
|
|
885
|
+
set receiveShadow(val) {
|
|
886
|
+
this.inst.receiveShadow = val;
|
|
887
|
+
}
|
|
888
|
+
updateBounds(box = true, sphere = true) {
|
|
889
|
+
this._needUpdateBounds = false;
|
|
890
|
+
if (box)
|
|
891
|
+
this.inst.computeBoundingBox();
|
|
892
|
+
if (sphere)
|
|
893
|
+
this.inst.computeBoundingSphere();
|
|
894
|
+
}
|
|
895
|
+
name = "";
|
|
896
|
+
geo;
|
|
897
|
+
material;
|
|
898
|
+
get currentCount() { return this.inst.count; }
|
|
899
|
+
context;
|
|
900
|
+
inst;
|
|
901
|
+
handles = [];
|
|
902
|
+
maxCount;
|
|
903
|
+
static nullMatrix = new THREE.Matrix4();
|
|
904
|
+
isFull() {
|
|
905
|
+
return this.currentCount >= this.maxCount;
|
|
906
|
+
}
|
|
907
|
+
_needUpdateBounds = false;
|
|
908
|
+
constructor(name, geo, material, count, context) {
|
|
909
|
+
this.name = name;
|
|
910
|
+
this.geo = geo;
|
|
911
|
+
this.material = material;
|
|
912
|
+
this.context = context;
|
|
913
|
+
this.maxCount = count;
|
|
914
|
+
if (debugInstancing) {
|
|
915
|
+
material = new THREE.MeshBasicMaterial({ color: this.randomColor() });
|
|
916
|
+
}
|
|
917
|
+
this.inst = new THREE.InstancedMesh(geo, material, count);
|
|
918
|
+
this.inst[$instancingAutoUpdateBounds] = true;
|
|
919
|
+
this.inst.count = 0;
|
|
920
|
+
this.inst.layers.set(2);
|
|
921
|
+
this.inst.visible = true;
|
|
922
|
+
// Not handled by RawShaderMaterial, so we need to set the define explicitly.
|
|
923
|
+
// Edge case: theoretically some users of the material could use it in an
|
|
924
|
+
// instanced fashion, and some others not. In that case, the material would not
|
|
925
|
+
// be able to be shared between the two use cases. We could probably add a
|
|
926
|
+
// onBeforeRender call for the InstancedMesh and set the define there.
|
|
927
|
+
// Same would apply if we support skinning -
|
|
928
|
+
// there we would have to split instanced batches so that the ones using skinning
|
|
929
|
+
// are all in the same batch.
|
|
930
|
+
if (material instanceof THREE.RawShaderMaterial) {
|
|
931
|
+
material.defines["USE_INSTANCING"] = true;
|
|
932
|
+
material.needsUpdate = true;
|
|
933
|
+
}
|
|
934
|
+
// this.inst.castShadow = true;
|
|
935
|
+
// this.inst.receiveShadow = true;
|
|
936
|
+
this.context.scene.add(this.inst);
|
|
937
|
+
context.pre_render_callbacks.push(this.onBeforeRender);
|
|
938
|
+
// console.log(this.inst);
|
|
939
|
+
// this.context.pre_render_callbacks.push(this.onPreRender.bind(this));
|
|
940
|
+
// setInterval(() => {
|
|
941
|
+
// this.inst.visible = !this.inst.visible;
|
|
942
|
+
// }, 500);
|
|
943
|
+
}
|
|
944
|
+
onBeforeRender = () => {
|
|
945
|
+
if (this._needUpdateBounds && this.inst[$instancingAutoUpdateBounds] === true) {
|
|
946
|
+
if (debugInstancing)
|
|
947
|
+
console.log("Update instancing bounds", this.name, this.inst.matrixWorldNeedsUpdate);
|
|
948
|
+
this.updateBounds();
|
|
949
|
+
}
|
|
950
|
+
};
|
|
951
|
+
randomColor() {
|
|
952
|
+
return new THREE.Color(Math.random(), Math.random(), Math.random());
|
|
953
|
+
}
|
|
954
|
+
addInstance(obj) {
|
|
955
|
+
if (this.currentCount >= this.maxCount) {
|
|
956
|
+
console.error("TOO MANY INSTANCES - resize is not yet implemented!", this.inst.count); // todo: make it resize
|
|
957
|
+
return null;
|
|
958
|
+
}
|
|
959
|
+
const handle = new InstanceHandle(-1, obj, this);
|
|
960
|
+
if (obj.castShadow === true && this.inst.castShadow === false) {
|
|
961
|
+
this.inst.castShadow = true;
|
|
962
|
+
}
|
|
963
|
+
if (obj.receiveShadow === true && this.inst.receiveShadow === false) {
|
|
964
|
+
this.inst.receiveShadow = true;
|
|
965
|
+
}
|
|
966
|
+
this.add(handle);
|
|
967
|
+
return handle;
|
|
968
|
+
}
|
|
969
|
+
add(handle) {
|
|
970
|
+
if (handle.instanceIndex < 0) {
|
|
971
|
+
handle.instanceIndex = this.currentCount;
|
|
972
|
+
// console.log(handle.instanceIndex, this.currentCount);
|
|
973
|
+
if (handle.instanceIndex >= this.handles.length)
|
|
974
|
+
this.handles.push(handle);
|
|
975
|
+
else
|
|
976
|
+
this.handles[handle.instanceIndex] = handle;
|
|
977
|
+
}
|
|
978
|
+
// console.log("Handle instance");
|
|
979
|
+
handle.object.updateWorldMatrix(true, true);
|
|
980
|
+
this.inst.setMatrixAt(handle.instanceIndex, handle.object.matrixWorld);
|
|
981
|
+
this.inst.instanceMatrix.needsUpdate = true;
|
|
982
|
+
this.inst.count += 1;
|
|
983
|
+
this._needUpdateBounds = true;
|
|
984
|
+
if (this.inst.count > 0)
|
|
985
|
+
this.inst.visible = true;
|
|
986
|
+
// console.log("Added", this.name, this.inst.count, this.handles);
|
|
987
|
+
}
|
|
988
|
+
remove(handle) {
|
|
989
|
+
if (!handle)
|
|
990
|
+
return;
|
|
991
|
+
if (handle.instanceIndex < 0 || handle.instanceIndex >= this.handles.length || this.inst.count <= 0) {
|
|
992
|
+
return;
|
|
993
|
+
}
|
|
994
|
+
if (this.handles[handle.instanceIndex] !== handle) {
|
|
995
|
+
console.error("instance handle is not part of renderer, was it removed before?", handle.instanceIndex, this.name);
|
|
996
|
+
const index = this.handles.indexOf(handle);
|
|
997
|
+
if (index < 0)
|
|
998
|
+
return;
|
|
999
|
+
handle.instanceIndex = index;
|
|
1000
|
+
}
|
|
1001
|
+
this.handles[handle.instanceIndex] = null;
|
|
1002
|
+
this.inst.setMatrixAt(handle.instanceIndex, InstancedMeshRenderer.nullMatrix);
|
|
1003
|
+
const removedLastElement = handle.instanceIndex >= this.currentCount - 1;
|
|
1004
|
+
// console.log(removedLastElement, this.currentCount, handle.instanceIndex, this.handles);
|
|
1005
|
+
if (!removedLastElement && this.currentCount > 0) {
|
|
1006
|
+
const lastElement = this.handles[this.currentCount - 1];
|
|
1007
|
+
if (lastElement) {
|
|
1008
|
+
lastElement.instanceIndex = handle.instanceIndex;
|
|
1009
|
+
lastElement.updateInstanceMatrix();
|
|
1010
|
+
this.handles[handle.instanceIndex] = lastElement;
|
|
1011
|
+
this.handles[this.currentCount - 1] = null;
|
|
1012
|
+
// this.inst.setMatrixAt(handle.instanceIndex, lastElement.object.matrixWorld);
|
|
1013
|
+
// this.inst.setMatrixAt(this.currentCount - 1, InstancedMeshRenderer.nullMatrix);
|
|
1014
|
+
}
|
|
1015
|
+
}
|
|
1016
|
+
if (this.inst.count > 0)
|
|
1017
|
+
this.inst.count -= 1;
|
|
1018
|
+
handle.instanceIndex = -1;
|
|
1019
|
+
this._needUpdateBounds = true;
|
|
1020
|
+
if (this.inst.count <= 0)
|
|
1021
|
+
this.inst.visible = false;
|
|
1022
|
+
this.inst.instanceMatrix.needsUpdate = true;
|
|
1023
|
+
}
|
|
1024
|
+
updateInstance(mat, index) {
|
|
1025
|
+
this.inst.setMatrixAt(index, mat);
|
|
1026
|
+
this.inst.instanceMatrix.needsUpdate = true;
|
|
1027
|
+
this._needUpdateBounds = true;
|
|
1028
|
+
}
|
|
1029
|
+
}
|
|
1030
1030
|
//# sourceMappingURL=Renderer.js.map
|