@zephyr3d/scene 0.9.27 → 0.10.0
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/README.md +60 -27
- package/dist/animation/animation_bank.js +634 -0
- package/dist/animation/animation_bank.js.map +1 -0
- package/dist/animation/animation_bank_gpu.js +256 -0
- package/dist/animation/animation_bank_gpu.js.map +1 -0
- package/dist/animation/animationset.js +54 -0
- package/dist/animation/animationset.js.map +1 -1
- package/dist/animation/cloth/gpu_cloth_component.js +406 -0
- package/dist/animation/cloth/gpu_cloth_component.js.map +1 -0
- package/dist/animation/cloth/gpu_cloth_system.js +332 -202
- package/dist/animation/cloth/gpu_cloth_system.js.map +1 -1
- package/dist/animation/gpu_animation_driver.js +289 -0
- package/dist/animation/gpu_animation_driver.js.map +1 -0
- package/dist/animation/joint_dynamics/collision.js +112 -1
- package/dist/animation/joint_dynamics/collision.js.map +1 -1
- package/dist/animation/joint_dynamics/controller.js +6 -0
- package/dist/animation/joint_dynamics/controller.js.map +1 -1
- package/dist/animation/joint_dynamics/joint_dynamics_system.js +11 -0
- package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
- package/dist/animation/joint_dynamics/solver.js +50 -12
- package/dist/animation/joint_dynamics/solver.js.map +1 -1
- package/dist/animation/joint_dynamics/types.js.map +1 -1
- package/dist/animation/skeleton.js +279 -55
- package/dist/animation/skeleton.js.map +1 -1
- package/dist/animation/skin_palette_atlas.js +252 -0
- package/dist/animation/skin_palette_atlas.js.map +1 -0
- package/dist/animation/spring/multi_chain_spring_system.js +298 -38
- package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
- package/dist/animation/spring/spring_chain.js +2 -0
- package/dist/animation/spring/spring_chain.js.map +1 -1
- package/dist/animation/spring/spring_collider.js +159 -21
- package/dist/animation/spring/spring_collider.js.map +1 -1
- package/dist/animation/spring/spring_particle.js +1 -0
- package/dist/animation/spring/spring_particle.js.map +1 -1
- package/dist/animation/spring/spring_solver.js +173 -0
- package/dist/animation/spring/spring_solver.js.map +1 -0
- package/dist/animation/spring/spring_system.js +249 -24
- package/dist/animation/spring/spring_system.js.map +1 -1
- package/dist/animation/spring_modifier.js +32 -1
- package/dist/animation/spring_modifier.js.map +1 -1
- package/dist/app/app.js +26 -0
- package/dist/app/app.js.map +1 -1
- package/dist/app/engine.js +86 -15
- package/dist/app/engine.js.map +1 -1
- package/dist/app/gamepad.js +191 -0
- package/dist/app/gamepad.js.map +1 -0
- package/dist/app/inputactions.js +271 -0
- package/dist/app/inputactions.js.map +1 -0
- package/dist/app/inputmgr.js +331 -22
- package/dist/app/inputmgr.js.map +1 -1
- package/dist/app/loading.js +138 -0
- package/dist/app/loading.js.map +1 -0
- package/dist/app/pipelinecache.js +209 -0
- package/dist/app/pipelinecache.js.map +1 -0
- package/dist/app/runtimescript.js +25 -0
- package/dist/app/runtimescript.js.map +1 -1
- package/dist/app/scriptingsystem.js +54 -0
- package/dist/app/scriptingsystem.js.map +1 -1
- package/dist/app/scriptregistry.js +7 -2
- package/dist/app/scriptregistry.js.map +1 -1
- package/dist/asset/asset_manifest.js +59 -0
- package/dist/asset/asset_manifest.js.map +1 -0
- package/dist/asset/asset_preload.js +258 -0
- package/dist/asset/asset_preload.js.map +1 -0
- package/dist/asset/assetmanager.js +117 -65
- package/dist/asset/assetmanager.js.map +1 -1
- package/dist/asset/loaders/ktx2/basis/LICENSE +201 -0
- package/dist/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
- package/dist/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
- package/dist/asset/loaders/ktx2/basis_location.js +17 -0
- package/dist/asset/loaders/ktx2/basis_location.js.map +1 -0
- package/dist/asset/loaders/ktx2/ktx2_loader.js +88 -0
- package/dist/asset/loaders/ktx2/ktx2_loader.js.map +1 -0
- package/dist/asset/loaders/ktx2/ktx2_targets.js +118 -0
- package/dist/asset/loaders/ktx2/ktx2_targets.js.map +1 -0
- package/dist/asset/loaders/ktx2/transcoder_pool.js +259 -0
- package/dist/asset/loaders/ktx2/transcoder_pool.js.map +1 -0
- package/dist/asset/mesh_lod_builder.js +104 -0
- package/dist/asset/mesh_lod_builder.js.map +1 -0
- package/dist/asset/mesh_settings.js +111 -0
- package/dist/asset/mesh_settings.js.map +1 -0
- package/dist/asset/meshopt_decoder.js +18 -0
- package/dist/asset/meshopt_decoder.js.map +1 -0
- package/dist/asset/meshopt_simplifier.js +26 -0
- package/dist/asset/meshopt_simplifier.js.map +1 -0
- package/dist/asset/model.js +171 -1
- package/dist/asset/model.js.map +1 -1
- package/dist/asset/texture_settings.js +231 -0
- package/dist/asset/texture_settings.js.map +1 -0
- package/dist/asset/zmsh_binary.js +131 -0
- package/dist/asset/zmsh_binary.js.map +1 -0
- package/dist/asset/zsdf_binary.js +111 -0
- package/dist/asset/zsdf_binary.js.map +1 -0
- package/dist/blitter/bilateralblur.js +1 -2
- package/dist/blitter/bilateralblur.js.map +1 -1
- package/dist/blitter/gaussianblur.js +1 -6
- package/dist/blitter/gaussianblur.js.map +1 -1
- package/dist/camera/base.js +31 -10
- package/dist/camera/base.js.map +1 -1
- package/dist/camera/camera.js +104 -178
- package/dist/camera/camera.js.map +1 -1
- package/dist/camera/follow.js +342 -0
- package/dist/camera/follow.js.map +1 -0
- package/dist/camera/fps.js +9 -7
- package/dist/camera/fps.js.map +1 -1
- package/dist/camera/orbit.js +46 -19
- package/dist/camera/orbit.js.map +1 -1
- package/dist/index.d.ts +25436 -15990
- package/dist/index.js +65 -11
- package/dist/index.js.map +1 -1
- package/dist/material/blinn.js +3 -0
- package/dist/material/blinn.js.map +1 -1
- package/dist/material/eye.js +1 -1
- package/dist/material/eye.js.map +1 -1
- package/dist/material/hair.js +2 -3
- package/dist/material/hair.js.map +1 -1
- package/dist/material/lambert.js +4 -1
- package/dist/material/lambert.js.map +1 -1
- package/dist/material/material.js +66 -4
- package/dist/material/material.js.map +1 -1
- package/dist/material/meshmaterial.js +118 -45
- package/dist/material/meshmaterial.js.map +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
- package/dist/material/mixins/lightmodel/lambert.js +1 -1
- package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +34 -61
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +16 -2
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js +2 -1
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
- package/dist/material/mixins/lit.js +191 -83
- package/dist/material/mixins/lit.js.map +1 -1
- package/dist/material/mixins/pbr/common.js +31 -206
- package/dist/material/mixins/pbr/common.js.map +1 -1
- package/dist/material/mtoon.js +1 -1
- package/dist/material/mtoon.js.map +1 -1
- package/dist/material/pbrmr.js +3 -0
- package/dist/material/pbrmr.js.map +1 -1
- package/dist/material/pbrsg.js +3 -0
- package/dist/material/pbrsg.js.map +1 -1
- package/dist/material/sdf_debug.js +78 -0
- package/dist/material/sdf_debug.js.map +1 -0
- package/dist/material/shader/helper.js +333 -191
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/material/shader/terrain_blend.js +204 -43
- package/dist/material/shader/terrain_blend.js.map +1 -1
- package/dist/material/skin.js +331 -297
- package/dist/material/skin.js.map +1 -1
- package/dist/material/skinprofile.js +1058 -0
- package/dist/material/skinprofile.js.map +1 -0
- package/dist/material/sss.js +353 -0
- package/dist/material/sss.js.map +1 -0
- package/dist/material/sss_kernel.js +265 -0
- package/dist/material/sss_kernel.js.map +1 -0
- package/dist/material/sssprofile.js +879 -0
- package/dist/material/sssprofile.js.map +1 -0
- package/dist/material/subsurfaceprofile.js +4 -8
- package/dist/material/subsurfaceprofile.js.map +1 -1
- package/dist/material/terrain-cm.js +464 -188
- package/dist/material/terrain-cm.js.map +1 -1
- package/dist/material/unlit.js +3 -0
- package/dist/material/unlit.js.map +1 -1
- package/dist/material/water.js +1261 -1438
- package/dist/material/water.js.map +1 -1
- package/dist/node_modules/meshoptimizer/LICENSE +21 -0
- package/dist/node_modules/meshoptimizer/meshopt_decoder.js +197 -0
- package/dist/node_modules/meshoptimizer/meshopt_decoder.js.map +1 -0
- package/dist/node_modules/meshoptimizer/meshopt_simplifier.js +677 -0
- package/dist/node_modules/meshoptimizer/meshopt_simplifier.js.map +1 -0
- package/dist/physics/character.js +226 -0
- package/dist/physics/character.js.map +1 -0
- package/dist/physics/collider.js +209 -0
- package/dist/physics/collider.js.map +1 -0
- package/dist/physics/events.js +79 -0
- package/dist/physics/events.js.map +1 -0
- package/dist/physics/joint.js +272 -0
- package/dist/physics/joint.js.map +1 -0
- package/dist/physics/node_physics.js +234 -0
- package/dist/physics/node_physics.js.map +1 -0
- package/dist/physics/part.js +91 -0
- package/dist/physics/part.js.map +1 -0
- package/dist/physics/rigid_body.js +379 -0
- package/dist/physics/rigid_body.js.map +1 -0
- package/dist/physics/vehicle.js +335 -0
- package/dist/physics/vehicle.js.map +1 -0
- package/dist/physics/world.js +25 -0
- package/dist/physics/world.js.map +1 -0
- package/dist/posteffect/bloom.js +49 -14
- package/dist/posteffect/bloom.js.map +1 -1
- package/dist/posteffect/motionblur.js +106 -106
- package/dist/posteffect/motionblur.js.map +1 -1
- package/dist/posteffect/postsss.js +572 -0
- package/dist/posteffect/postsss.js.map +1 -0
- package/dist/posteffect/sao.js +2 -6
- package/dist/posteffect/sao.js.map +1 -1
- package/dist/posteffect/skinsss.js +605 -355
- package/dist/posteffect/skinsss.js.map +1 -1
- package/dist/posteffect/ssgi.js +91 -162
- package/dist/posteffect/ssgi.js.map +1 -1
- package/dist/posteffect/ssr.js +3 -11
- package/dist/posteffect/ssr.js.map +1 -1
- package/dist/posteffect/sss.js +4 -13
- package/dist/posteffect/sss.js.map +1 -1
- package/dist/posteffect/taa.js +1 -0
- package/dist/posteffect/taa.js.map +1 -1
- package/dist/render/abuffer_oit.js +3 -2
- package/dist/render/abuffer_oit.js.map +1 -1
- package/dist/render/clipmap.js +179 -64
- package/dist/render/clipmap.js.map +1 -1
- package/dist/render/cluster_light.js +958 -224
- package/dist/render/cluster_light.js.map +1 -1
- package/dist/render/cull_visitor.js +25 -5
- package/dist/render/cull_visitor.js.map +1 -1
- package/dist/render/debug_views.js +37 -0
- package/dist/render/debug_views.js.map +1 -0
- package/dist/render/depthpass.js +5 -1
- package/dist/render/depthpass.js.map +1 -1
- package/dist/render/drawable_mixin.js +53 -6
- package/dist/render/drawable_mixin.js.map +1 -1
- package/dist/render/dualdepthpeeling_oit.js +5 -5
- package/dist/render/dualdepthpeeling_oit.js.map +1 -1
- package/dist/render/envlight.js +196 -113
- package/dist/render/envlight.js.map +1 -1
- package/dist/render/fbm_wavegenerator.js +5 -10
- package/dist/render/fbm_wavegenerator.js.map +1 -1
- package/dist/render/fft_wavegenerator.js +247 -157
- package/dist/render/fft_wavegenerator.js.map +1 -1
- package/dist/render/gerstner_wavegenerator.js +16 -38
- package/dist/render/gerstner_wavegenerator.js.map +1 -1
- package/dist/render/gi/probe_volume.js +1334 -0
- package/dist/render/gi/probe_volume.js.map +1 -0
- package/dist/render/gi/scene_gi.js +282 -0
- package/dist/render/gi/scene_gi.js.map +1 -0
- package/dist/render/gi/voxel_atlas.js +198 -0
- package/dist/render/gi/voxel_atlas.js.map +1 -0
- package/dist/render/gi/voxel_lighting.js +652 -0
- package/dist/render/gi/voxel_lighting.js.map +1 -0
- package/dist/render/gi/voxel_scene.js +642 -0
- package/dist/render/gi/voxel_scene.js.map +1 -0
- package/dist/render/gi/voxelize_pass.js +223 -0
- package/dist/render/gi/voxelize_pass.js.map +1 -0
- package/dist/render/globalbindgroup_allocator.js +3 -2
- package/dist/render/globalbindgroup_allocator.js.map +1 -1
- package/dist/render/gpu_picking.js +9 -36
- package/dist/render/gpu_picking.js.map +1 -1
- package/dist/render/instance_culling.js +499 -0
- package/dist/render/instance_culling.js.map +1 -0
- package/dist/render/lightpass.js +19 -8
- package/dist/render/lightpass.js.map +1 -1
- package/dist/render/lod.js +46 -0
- package/dist/render/lod.js.map +1 -0
- package/dist/render/primitive.js +301 -9
- package/dist/render/primitive.js.map +1 -1
- package/dist/render/primitive_readback.js +209 -0
- package/dist/render/primitive_readback.js.map +1 -0
- package/dist/render/render_queue.js +162 -11
- package/dist/render/render_queue.js.map +1 -1
- package/dist/render/renderer.js +10 -7
- package/dist/render/renderer.js.map +1 -1
- package/dist/render/rendergraph/blackboard.js +14 -1
- package/dist/render/rendergraph/blackboard.js.map +1 -1
- package/dist/render/rendergraph/executor.js +136 -0
- package/dist/render/rendergraph/executor.js.map +1 -1
- package/dist/render/rendergraph/forward_plus_builder.js +272 -55
- package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
- package/dist/render/rendergraph/frame_graph_context.js +41 -0
- package/dist/render/rendergraph/frame_graph_context.js.map +1 -0
- package/dist/render/rendergraph/scene_render_context.js +31 -2
- package/dist/render/rendergraph/scene_render_context.js.map +1 -1
- package/dist/render/rendergraph/types.js.map +1 -1
- package/dist/render/renderpass.js +28 -5
- package/dist/render/renderpass.js.map +1 -1
- package/dist/render/sdf/box_allocator.js +98 -0
- package/dist/render/sdf/box_allocator.js.map +1 -0
- package/dist/render/sdf/global_sdf.js +865 -0
- package/dist/render/sdf/global_sdf.js.map +1 -0
- package/dist/render/sdf/scene_sdf.js +562 -0
- package/dist/render/sdf/scene_sdf.js.map +1 -0
- package/dist/render/sdf/sdf_atlas.js +227 -0
- package/dist/render/sdf/sdf_atlas.js.map +1 -0
- package/dist/render/sdf/sdf_programs.js +42 -0
- package/dist/render/sdf/sdf_programs.js.map +1 -0
- package/dist/render/sdf/sdf_view.js +199 -0
- package/dist/render/sdf/sdf_view.js.map +1 -0
- package/dist/render/sdf/waterline.js +610 -0
- package/dist/render/sdf/waterline.js.map +1 -0
- package/dist/render/shadow_mask_pass.js +142 -25
- package/dist/render/shadow_mask_pass.js.map +1 -1
- package/dist/render/shore_wave_generator.js +1193 -0
- package/dist/render/shore_wave_generator.js.map +1 -0
- package/dist/render/sky.js +516 -86
- package/dist/render/sky.js.map +1 -1
- package/dist/render/transmission_thickness_pass.js +477 -0
- package/dist/render/transmission_thickness_pass.js.map +1 -0
- package/dist/render/underwater.js +58 -158
- package/dist/render/underwater.js.map +1 -1
- package/dist/render/virtualtexture/virtual_texture.js +1214 -0
- package/dist/render/virtualtexture/virtual_texture.js.map +1 -0
- package/dist/render/volumetric_cloud/cloud_common.js +472 -0
- package/dist/render/volumetric_cloud/cloud_common.js.map +1 -0
- package/dist/render/volumetric_cloud/cloud_noise.js +189 -0
- package/dist/render/volumetric_cloud/cloud_noise.js.map +1 -0
- package/dist/render/volumetric_cloud/debug_view.js +131 -0
- package/dist/render/volumetric_cloud/debug_view.js.map +1 -0
- package/dist/render/volumetric_cloud/resources.js +380 -0
- package/dist/render/volumetric_cloud/resources.js.map +1 -0
- package/dist/render/volumetric_cloud/sky_cache.js +380 -0
- package/dist/render/volumetric_cloud/sky_cache.js.map +1 -0
- package/dist/render/volumetric_cloud/volumetric_cloud.js +318 -0
- package/dist/render/volumetric_cloud/volumetric_cloud.js.map +1 -0
- package/dist/render/water_caustics.js +134 -319
- package/dist/render/water_caustics.js.map +1 -1
- package/dist/render/water_foam.js +627 -0
- package/dist/render/water_foam.js.map +1 -0
- package/dist/render/water_interaction.js +1795 -0
- package/dist/render/water_interaction.js.map +1 -0
- package/dist/render/weightedblended_oit.js +3 -3
- package/dist/render/weightedblended_oit.js.map +1 -1
- package/dist/scene/basesprite.js +9 -4
- package/dist/scene/basesprite.js.map +1 -1
- package/dist/scene/batchgroup.js +108 -12
- package/dist/scene/batchgroup.js.map +1 -1
- package/dist/scene/environment.js +28 -7
- package/dist/scene/environment.js.map +1 -1
- package/dist/scene/foliage.js +1020 -0
- package/dist/scene/foliage.js.map +1 -0
- package/dist/scene/foliage_buckets.js +147 -0
- package/dist/scene/foliage_buckets.js.map +1 -0
- package/dist/scene/foliage_mask.js +358 -0
- package/dist/scene/foliage_mask.js.map +1 -0
- package/dist/scene/hair.js +15 -4
- package/dist/scene/hair.js.map +1 -1
- package/dist/scene/light.js +179 -13
- package/dist/scene/light.js.map +1 -1
- package/dist/scene/mesh.js +327 -45
- package/dist/scene/mesh.js.map +1 -1
- package/dist/scene/meshdrawable.js +6 -0
- package/dist/scene/meshdrawable.js.map +1 -1
- package/dist/scene/msdftext.js +9 -3
- package/dist/scene/msdftext.js.map +1 -1
- package/dist/scene/msdftextsprite.js +9 -3
- package/dist/scene/msdftextsprite.js.map +1 -1
- package/dist/scene/particlesys.js +8 -2
- package/dist/scene/particlesys.js.map +1 -1
- package/dist/scene/physics_settings.js +157 -0
- package/dist/scene/physics_settings.js.map +1 -0
- package/dist/scene/scene.js +190 -44
- package/dist/scene/scene.js.map +1 -1
- package/dist/scene/scene_node.js +147 -6
- package/dist/scene/scene_node.js.map +1 -1
- package/dist/scene/terrain-cm/bladegrassmaterial.js +735 -0
- package/dist/scene/terrain-cm/bladegrassmaterial.js.map +1 -0
- package/dist/scene/terrain-cm/grass.js +881 -42
- package/dist/scene/terrain-cm/grass.js.map +1 -1
- package/dist/scene/terrain-cm/grass_gpu.js +929 -0
- package/dist/scene/terrain-cm/grass_gpu.js.map +1 -0
- package/dist/scene/terrain-cm/grassmaterial.js +180 -9
- package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
- package/dist/scene/terrain-cm/terrain-cm.js +465 -36
- package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
- package/dist/scene/terrain-cm/terrain_gi_albedo.js +257 -0
- package/dist/scene/terrain-cm/terrain_gi_albedo.js.map +1 -0
- package/dist/scene/terrain-cm/terrain_rvt.js +395 -0
- package/dist/scene/terrain-cm/terrain_rvt.js.map +1 -0
- package/dist/scene/update_queue.js +54 -0
- package/dist/scene/update_queue.js.map +1 -0
- package/dist/scene/water.js +633 -268
- package/dist/scene/water.js.map +1 -1
- package/dist/scene/water_surface_sampler.js +324 -0
- package/dist/scene/water_surface_sampler.js.map +1 -0
- package/dist/scene/wind.js +317 -0
- package/dist/scene/wind.js.map +1 -0
- package/dist/shaders/atmosphere.js +388 -166
- package/dist/shaders/atmosphere.js.map +1 -1
- package/dist/shaders/fog.js +100 -32
- package/dist/shaders/fog.js.map +1 -1
- package/dist/shaders/gi.js +365 -0
- package/dist/shaders/gi.js.map +1 -0
- package/dist/shaders/ltc_rect.js +202 -0
- package/dist/shaders/ltc_rect.js.map +1 -0
- package/dist/shaders/misc.js +1 -10
- package/dist/shaders/misc.js.map +1 -1
- package/dist/shaders/noise.js +5 -1
- package/dist/shaders/noise.js.map +1 -1
- package/dist/shaders/probes.js +309 -0
- package/dist/shaders/probes.js.map +1 -0
- package/dist/shaders/sdf.js +537 -0
- package/dist/shaders/sdf.js.map +1 -0
- package/dist/shaders/shadow.js +104 -70
- package/dist/shaders/shadow.js.map +1 -1
- package/dist/shaders/skin_brdf.js +243 -0
- package/dist/shaders/skin_brdf.js.map +1 -0
- package/dist/shaders/ssgi.js +63 -0
- package/dist/shaders/ssgi.js.map +1 -0
- package/dist/shaders/ssgi_reprojection.js +118 -0
- package/dist/shaders/ssgi_reprojection.js.map +1 -0
- package/dist/shaders/ssr.js +6 -159
- package/dist/shaders/ssr.js.map +1 -1
- package/dist/shaders/temporal.js +38 -27
- package/dist/shaders/temporal.js.map +1 -1
- package/dist/shaders/water.js +32 -82
- package/dist/shaders/water.js.map +1 -1
- package/dist/shaders/water_medium.js +7 -21
- package/dist/shaders/water_medium.js.map +1 -1
- package/dist/shadow/dom.js +110 -19
- package/dist/shadow/dom.js.map +1 -1
- package/dist/shadow/esm.js +3 -3
- package/dist/shadow/esm.js.map +1 -1
- package/dist/shadow/pcf_opt.js +15 -48
- package/dist/shadow/pcf_opt.js.map +1 -1
- package/dist/shadow/pcf_pd.js +15 -53
- package/dist/shadow/pcf_pd.js.map +1 -1
- package/dist/shadow/pcss.js +34 -9
- package/dist/shadow/pcss.js.map +1 -1
- package/dist/shadow/shadow_impl.js +3 -8
- package/dist/shadow/shadow_impl.js.map +1 -1
- package/dist/shadow/shadow_region.js +40 -2
- package/dist/shadow/shadow_region.js.map +1 -1
- package/dist/shadow/shadowmapper.js +93 -53
- package/dist/shadow/shadowmapper.js.map +1 -1
- package/dist/shadow/ssm.js +18 -72
- package/dist/shadow/ssm.js.map +1 -1
- package/dist/shadow/vsm.js +3 -3
- package/dist/shadow/vsm.js.map +1 -1
- package/dist/shapes/shape.js +44 -1
- package/dist/shapes/shape.js.map +1 -1
- package/dist/utility/buoyancy.js +287 -0
- package/dist/utility/buoyancy.js.map +1 -0
- package/dist/utility/physical.js +10 -1
- package/dist/utility/physical.js.map +1 -1
- package/dist/utility/pmrem.js +17 -43
- package/dist/utility/pmrem.js.map +1 -1
- package/dist/utility/sdf/bake.js +435 -0
- package/dist/utility/sdf/bake.js.map +1 -0
- package/dist/utility/sdf/bvh.js +576 -0
- package/dist/utility/sdf/bvh.js.map +1 -0
- package/dist/utility/serialization/manager.js +34 -6
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +46 -5
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/batch.js +11 -4
- package/dist/utility/serialization/scene/batch.js.map +1 -1
- package/dist/utility/serialization/scene/camera.js +87 -254
- package/dist/utility/serialization/scene/camera.js.map +1 -1
- package/dist/utility/serialization/scene/cloth.js +25 -0
- package/dist/utility/serialization/scene/cloth.js.map +1 -0
- package/dist/utility/serialization/scene/common.js +14 -6
- package/dist/utility/serialization/scene/common.js.map +1 -1
- package/dist/utility/serialization/scene/foliage.js +821 -0
- package/dist/utility/serialization/scene/foliage.js.map +1 -0
- package/dist/utility/serialization/scene/hair.js +11 -4
- package/dist/utility/serialization/scene/hair.js.map +1 -1
- package/dist/utility/serialization/scene/light.js +115 -7
- package/dist/utility/serialization/scene/light.js.map +1 -1
- package/dist/utility/serialization/scene/material.js +388 -220
- package/dist/utility/serialization/scene/material.js.map +1 -1
- package/dist/utility/serialization/scene/mesh.js +69 -4
- package/dist/utility/serialization/scene/mesh.js.map +1 -1
- package/dist/utility/serialization/scene/node.js +140 -5
- package/dist/utility/serialization/scene/node.js.map +1 -1
- package/dist/utility/serialization/scene/node_physics.js +1318 -0
- package/dist/utility/serialization/scene/node_physics.js.map +1 -0
- package/dist/utility/serialization/scene/particle.js +11 -4
- package/dist/utility/serialization/scene/particle.js.map +1 -1
- package/dist/utility/serialization/scene/physics.js +120 -0
- package/dist/utility/serialization/scene/physics.js.map +1 -0
- package/dist/utility/serialization/scene/primitive.js +124 -10
- package/dist/utility/serialization/scene/primitive.js.map +1 -1
- package/dist/utility/serialization/scene/scene.js +1687 -51
- package/dist/utility/serialization/scene/scene.js.map +1 -1
- package/dist/utility/serialization/scene/sprite.js +11 -4
- package/dist/utility/serialization/scene/sprite.js.map +1 -1
- package/dist/utility/serialization/scene/terrain.js +163 -33
- package/dist/utility/serialization/scene/terrain.js.map +1 -1
- package/dist/utility/serialization/scene/text.js +11 -4
- package/dist/utility/serialization/scene/text.js.map +1 -1
- package/dist/utility/serialization/scene/water.js +1543 -264
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/utility/serialization/types.js.map +1 -1
- package/dist/utility/shprojector.js +10 -22
- package/dist/utility/shprojector.js.map +1 -1
- package/dist/utility/textures/foam.js +170 -0
- package/dist/utility/textures/foam.js.map +1 -0
- package/dist/utility/textures/ggxlut.js +17 -43
- package/dist/utility/textures/ggxlut.js.map +1 -1
- package/dist/utility/textures/ltcdata.js +4 -4
- package/dist/utility/textures/ltcdata.js.map +1 -1
- package/dist/utility/textures/ltclut.js +16 -6
- package/dist/utility/textures/ltclut.js.map +1 -1
- package/dist/utility/unsupported.js +24 -0
- package/dist/utility/unsupported.js.map +1 -0
- package/dist/values.js +13 -1
- package/dist/values.js.map +1 -1
- package/package.json +25 -12
- package/src/asset/loaders/ktx2/basis/LICENSE +201 -0
- package/src/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
- package/src/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
- package/src/asset/meshoptimizer/LICENSE +21 -0
- package/dist/animation/joint_dynamics/convex_collider.js +0 -320
- package/dist/animation/joint_dynamics/convex_collider.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sssprofile.js","sources":["../../src/material/sssprofile.ts"],"sourcesContent":["import { Vector3, type Immutable } from '@zephyr3d/base';\r\nimport type { AbstractDevice, Texture2D } from '@zephyr3d/device';\r\n\r\n/** Number of scalar parameter columns stored per profile row. */\r\nconst SKIN_PROFILE_PARAM_COLUMNS = 6;\r\n\r\n/** Number of texels the baked transmission profile occupies. */\r\nconst SKIN_TRANSMISSION_LUT_SIZE = 32;\r\n\r\n/** Total columns per profile row: the scalar parameters followed by the baked transmission profile. */\r\nconst SKIN_PROFILE_COLUMNS = SKIN_PROFILE_PARAM_COLUMNS + SKIN_TRANSMISSION_LUT_SIZE;\r\n\r\n/** Maximum number of live skin profiles, matching the 8-bit profile id channel. */\r\nconst SKIN_PROFILE_CAPACITY = 256;\r\n\r\n/**\r\n * Gate on {@link SSSProfile}'s constructor.\r\n *\r\n * @remarks\r\n * Module-private, so only {@link SSSProfile.createOwned} can pass it. See the\r\n * constructor for why a `private` modifier alone is not enough.\r\n *\r\n * @internal\r\n */\r\nconst CREATE_TOKEN = Symbol('SSSProfile.create');\r\n\r\n/**\r\n * Largest optical depth the transmission profile is defined over.\r\n *\r\n * @internal\r\n **/\r\nexport const SKIN_MAX_TRANSMISSION_OPTICAL_DEPTH = 5;\r\n\r\n/**\r\n * Floor the averaged optical depth is clamped to before encoding.\r\n *\r\n * @internal\r\n **/\r\nexport const SKIN_TRANSMISSION_OPTICAL_DEPTH_FLOOR = 0.15;\r\n\r\n/**\r\n * Constant added to the optical depth after clamping.\r\n *\r\n * @internal\r\n **/\r\nexport const SKIN_TRANSMISSION_OPTICAL_DEPTH_BIAS = 0.25;\r\n\r\n/**\r\n * Largest value the thickness pass can write, and with it the sentinel that\r\n * separates a real measurement from \"no light wrote this\".\r\n *\r\n * @internal\r\n */\r\nexport const SKIN_TRANSMISSION_NO_DATA_ENCODING =\r\n 1 -\r\n (SKIN_TRANSMISSION_OPTICAL_DEPTH_FLOOR + SKIN_TRANSMISSION_OPTICAL_DEPTH_BIAS) /\r\n SKIN_MAX_TRANSMISSION_OPTICAL_DEPTH;\r\n\r\n/**\r\n * Distance, in profile millimetres, the baked transmission profile spans.\r\n *\r\n * @internal\r\n */\r\nconst TRANSMISSION_LUT_MAX_DISTANCE_MM = 50;\r\n\r\n/**\r\n * Radius the baked transmission profile is offset by, in profile millimetres.\r\n *\r\n * @internal\r\n */\r\nconst TRANSMISSION_LUT_RADIUS_OFFSET_MM = 0.6;\r\n\r\n/**\r\n * Profile-space millimetres per world unit, before the profile's own world unit\r\n * scale is applied.\r\n *\r\n * @internal\r\n */\r\nconst WORLD_UNITS_TO_PROFILE_MM = 1000;\r\n\r\n/**\r\n * Optical depth accumulated per world unit of light path, before the profile's\r\n * `extinctionScale`.\r\n *\r\n * @internal\r\n */\r\nexport const SKIN_OPTICAL_DEPTH_PER_WORLD_UNIT =\r\n (WORLD_UNITS_TO_PROFILE_MM * SKIN_MAX_TRANSMISSION_OPTICAL_DEPTH) /\r\n (TRANSMISSION_LUT_MAX_DISTANCE_MM * ((SKIN_TRANSMISSION_LUT_SIZE - 1) / SKIN_TRANSMISSION_LUT_SIZE));\r\n\r\n/**\r\n * Column indices within a packed profile row.\r\n *\r\n * @internal\r\n */\r\nconst enum ProfileColumn {\r\n /** World unit scale + overall scatter scaling. */\r\n Scaling = 0,\r\n /** Per-channel scattering albedo (the `A` in Burley's shaping term). */\r\n SurfaceAlbedo = 1,\r\n /** Per-channel diffuse mean free path, in world units. */\r\n MeanFreePath = 2,\r\n /** Boundary color bleed. */\r\n Boundary = 3,\r\n /**\r\n * Transmission parameters: `(extinctionScale, normalScale,\r\n * scatteringDistribution, 1 / ior)`.\r\n */\r\n Transmission = 4,\r\n /** Dual-lobe specular parameters. */\r\n Specular = 5\r\n}\r\n\r\n/**\r\n * `GetSearchLightDiffuseScalingFactor`, the default variant.\r\n *\r\n * @remarks\r\n * `s = 3.5 + 100 (A - 0.33)^4`. The same curve the diffusion evaluates on the\r\n * GPU (`posteffect/postsss.ts`, `scalingFactor`); the transmission profile is\r\n * baked on the CPU and needs its own copy.\r\n *\r\n * @internal\r\n */\r\nfunction searchLightDiffuseScalingFactor(albedo: number): number {\r\n const v = albedo - 0.33;\r\n return 3.5 + 100 * v * v * v * v;\r\n}\r\n\r\n/**\r\n * Built-in {@link SSSProfile} presets.\r\n *\r\n * @public\r\n */\r\nexport type SSSProfilePreset = 'skin' | 'skin_pale' | 'skin_tan' | 'skin_dark' | 'wax' | 'jade' | 'marble';\r\n\r\ninterface SSSProfileTemplate {\r\n surfaceAlbedo: [number, number, number];\r\n meanFreePath: [number, number, number];\r\n meanFreePathDistance: number;\r\n worldUnitScale: number;\r\n scatterScale: number;\r\n boundaryColorBleed: [number, number, number];\r\n transmissionTint: [number, number, number];\r\n extinctionScale: number;\r\n normalScale: number;\r\n scatteringDistribution: number;\r\n ior: number;\r\n roughness0: number;\r\n roughness1: number;\r\n lobeMix: number;\r\n}\r\n\r\n/**\r\n * Preset parameters.\r\n *\r\n * @internal\r\n */\r\nconst SKIN_PROFILE_TEMPLATES: Record<SSSProfilePreset, SSSProfileTemplate> = {\r\n skin: {\r\n surfaceAlbedo: [0.91058, 0.338275, 0.2718],\r\n meanFreePath: [1.0, 0.0889636, 0.0720951],\r\n meanFreePathDistance: 0.026748,\r\n worldUnitScale: 1,\r\n scatterScale: 1,\r\n boundaryColorBleed: [1, 1, 1],\r\n transmissionTint: [1.0, 0.42, 0.3],\r\n extinctionScale: 1,\r\n normalScale: 0.08,\r\n scatteringDistribution: 0.93,\r\n ior: 1.55,\r\n roughness0: 0.75,\r\n roughness1: 1.3,\r\n lobeMix: 0.85\r\n },\r\n skin_pale: {\r\n surfaceAlbedo: [0.93, 0.4, 0.33],\r\n meanFreePath: [1.0, 0.1, 0.083],\r\n meanFreePathDistance: 0.0294,\r\n worldUnitScale: 1,\r\n scatterScale: 1,\r\n boundaryColorBleed: [1, 1, 1],\r\n transmissionTint: [1.0, 0.48, 0.38],\r\n extinctionScale: 1,\r\n normalScale: 0.08,\r\n scatteringDistribution: 0.93,\r\n ior: 1.55,\r\n roughness0: 0.72,\r\n roughness1: 1.25,\r\n lobeMix: 0.85\r\n },\r\n skin_tan: {\r\n surfaceAlbedo: [0.88, 0.3, 0.235],\r\n meanFreePath: [1.0, 0.082, 0.066],\r\n meanFreePathDistance: 0.0254,\r\n worldUnitScale: 1,\r\n scatterScale: 1,\r\n boundaryColorBleed: [1, 1, 1],\r\n transmissionTint: [1.0, 0.38, 0.26],\r\n extinctionScale: 1,\r\n normalScale: 0.08,\r\n scatteringDistribution: 0.93,\r\n ior: 1.55,\r\n roughness0: 0.76,\r\n roughness1: 1.32,\r\n lobeMix: 0.85\r\n },\r\n skin_dark: {\r\n surfaceAlbedo: [0.8, 0.24, 0.185],\r\n meanFreePath: [1.0, 0.072, 0.057],\r\n meanFreePathDistance: 0.0227,\r\n worldUnitScale: 1,\r\n scatterScale: 1,\r\n boundaryColorBleed: [1, 1, 1],\r\n transmissionTint: [1.0, 0.3, 0.2],\r\n extinctionScale: 1,\r\n normalScale: 0.08,\r\n scatteringDistribution: 0.93,\r\n ior: 1.55,\r\n roughness0: 0.78,\r\n roughness1: 1.35,\r\n lobeMix: 0.85\r\n },\r\n wax: {\r\n surfaceAlbedo: [0.95, 0.9, 0.8],\r\n meanFreePath: [1.0, 0.85, 0.68],\r\n meanFreePathDistance: 0.05,\r\n worldUnitScale: 1,\r\n scatterScale: 1,\r\n boundaryColorBleed: [1, 1, 1],\r\n transmissionTint: [1.0, 0.88, 0.74],\r\n extinctionScale: 1,\r\n normalScale: 0.05,\r\n scatteringDistribution: 0.85,\r\n ior: 1.45,\r\n roughness0: 0.85,\r\n roughness1: 1.4,\r\n lobeMix: 0.8\r\n },\r\n jade: {\r\n surfaceAlbedo: [0.75, 0.93, 0.86],\r\n meanFreePath: [0.6, 1.0, 0.85],\r\n meanFreePathDistance: 0.045,\r\n worldUnitScale: 1,\r\n scatterScale: 1,\r\n boundaryColorBleed: [1, 1, 1],\r\n transmissionTint: [0.68, 0.95, 0.88],\r\n extinctionScale: 1,\r\n normalScale: 0.05,\r\n scatteringDistribution: 0.7,\r\n ior: 1.6,\r\n roughness0: 0.6,\r\n roughness1: 1.1,\r\n lobeMix: 0.75\r\n },\r\n marble: {\r\n surfaceAlbedo: [0.95, 0.94, 0.92],\r\n meanFreePath: [1.0, 0.96, 0.92],\r\n meanFreePathDistance: 0.035,\r\n worldUnitScale: 1,\r\n scatterScale: 1,\r\n boundaryColorBleed: [1, 1, 1],\r\n transmissionTint: [0.96, 0.95, 0.94],\r\n extinctionScale: 1,\r\n normalScale: 0.04,\r\n scatteringDistribution: 0.6,\r\n ior: 1.55,\r\n roughness0: 0.55,\r\n roughness1: 1.05,\r\n lobeMix: 0.7\r\n }\r\n};\r\n\r\n/**\r\n * Subsurface profile for {@link SSSMaterial}.\r\n *\r\n * @public\r\n */\r\nexport class SSSProfile {\r\n private static readonly _profiles: Array<SSSProfile | null> = new Array(SKIN_PROFILE_CAPACITY).fill(null);\r\n private static _table: Texture2D | null = null;\r\n /** Device {@link SSSProfile._table} belongs to, so a device swap can be spotted. */\r\n private static _tableDevice: AbstractDevice | null = null;\r\n private static _tableData: Float32Array<ArrayBuffer> | null = null;\r\n private static _tableDirty = true;\r\n private static _defaultProfile: SSSProfile | null = null;\r\n private readonly _id: number;\r\n private readonly _surfaceAlbedo: Vector3;\r\n private readonly _meanFreePath: Vector3;\r\n private readonly _boundaryColorBleed: Vector3;\r\n private readonly _transmissionTint: Vector3;\r\n private _preset: SSSProfilePreset;\r\n private _meanFreePathDistance: number;\r\n private _worldUnitScale: number;\r\n private _scatterScale: number;\r\n private _extinctionScale: number;\r\n private _normalScale: number;\r\n private _scatteringDistribution: number;\r\n private _ior: number;\r\n private _roughness0: number;\r\n private _roughness1: number;\r\n private _lobeMix: number;\r\n private _disposed: boolean;\r\n private readonly _changeListeners: Set<() => void>;\r\n\r\n /**\r\n * Not constructible from outside. Use {@link SSSMaterial.subsurfaceProfile},\r\n * which owns one for the material's lifetime.\r\n *\r\n * @remarks\r\n * The token check is not redundant with `private`: profiles hold a row of a\r\n * 256-entry GPU table that only {@link SSSProfile.dispose} returns, and the\r\n * editor ships as prebuilt JavaScript that drives this class through\r\n * serialization metadata, where TypeScript's visibility rules do not apply.\r\n *\r\n * @internal\r\n */\r\n private constructor(token: typeof CREATE_TOKEN, preset: SSSProfilePreset = 'skin') {\r\n if (token !== CREATE_TOKEN) {\r\n throw new Error(\r\n 'SSSProfile is not constructible directly; it is owned by the SSSMaterial that created it.'\r\n );\r\n }\r\n this._surfaceAlbedo = new Vector3();\r\n this._meanFreePath = new Vector3();\r\n this._boundaryColorBleed = new Vector3();\r\n this._transmissionTint = new Vector3();\r\n this._preset = preset;\r\n this._meanFreePathDistance = 0;\r\n this._worldUnitScale = 1;\r\n this._scatterScale = 1;\r\n this._extinctionScale = 1;\r\n this._normalScale = 0.08;\r\n this._scatteringDistribution = 0.93;\r\n this._ior = 1.55;\r\n this._roughness0 = 0.75;\r\n this._roughness1 = 1.3;\r\n this._lobeMix = 0.85;\r\n this._disposed = false;\r\n this._changeListeners = new Set();\r\n this._id = SSSProfile.allocateId(this);\r\n this.applyPreset(preset);\r\n }\r\n\r\n /**\r\n * Registers a callback invoked whenever this profile's parameters change.\r\n *\r\n * @param listener - The callback to add.\r\n *\r\n * @public\r\n */\r\n addChangeListener(listener: () => void) {\r\n this._changeListeners.add(listener);\r\n }\r\n\r\n /**\r\n * Removes a previously registered change listener.\r\n *\r\n * @param listener - The callback to remove.\r\n *\r\n * @public\r\n */\r\n removeChangeListener(listener: () => void) {\r\n this._changeListeners.delete(listener);\r\n }\r\n\r\n /**\r\n * Creates a profile for a material to own.\r\n *\r\n * @remarks\r\n * The only way to obtain one. The caller takes on releasing its table row — in\r\n * practice {@link SSSMaterial}, which disposes the profile with itself.\r\n *\r\n * @param preset - Preset to start from. Defaults to `'skin'`.\r\n * @returns The new profile.\r\n *\r\n * @internal\r\n */\r\n static createOwned(preset: SSSProfilePreset = 'skin') {\r\n return new SSSProfile(CREATE_TOKEN, preset);\r\n }\r\n\r\n /**\r\n * The shared default skin profile.\r\n *\r\n * @remarks\r\n * A fallback for consumers with no material to ask — the diffusion uses it for\r\n * pixels whose id is not in the table. Created lazily, since it holds a table\r\n * row for the lifetime of the process.\r\n *\r\n * @public\r\n */\r\n static getDefault() {\r\n if (!this._defaultProfile) {\r\n this._defaultProfile = new SSSProfile(CREATE_TOKEN, 'skin');\r\n }\r\n return this._defaultProfile;\r\n }\r\n\r\n /**\r\n * Looks up a profile by its packed id.\r\n *\r\n * @param id - The profile id, as written to the per-pixel profile channel.\r\n * @returns The profile, or `null` when the id is unused.\r\n *\r\n * @public\r\n */\r\n static getById(id: number) {\r\n return id > 0 && id < SKIN_PROFILE_CAPACITY ? this._profiles[id] : null;\r\n }\r\n\r\n /**\r\n * The packed parameter table, rebuilt when any profile has changed.\r\n *\r\n * @remarks\r\n * Rows are indexed by profile id, columns by parameter group. The skin\r\n * diffusion passes sample this to recover per-pixel scattering parameters.\r\n *\r\n * @param device - Device used to create and upload the table.\r\n * @returns The table texture, or `null` when it could not be created.\r\n *\r\n * @public\r\n */\r\n static getTable(device: AbstractDevice): Texture2D | null {\r\n // The table is static and outlives any one device. A texture belonging to a\r\n // dead device silently swallows every `update`, which strands the last values\r\n // uploaded before the swap on screen until the page is reloaded.\r\n if (this._table && (this._tableDevice !== device || this._table.disposed)) {\r\n this._table = null;\r\n this._tableData = null;\r\n }\r\n if (!this._table) {\r\n this._table = device.createTexture2D('rgba32f', SKIN_PROFILE_COLUMNS, SKIN_PROFILE_CAPACITY, {\r\n mipmapping: false,\r\n samplerOptions: { minFilter: 'nearest', magFilter: 'nearest', mipFilter: 'none' }\r\n });\r\n this._tableDevice = device;\r\n this._tableData = new Float32Array(SKIN_PROFILE_COLUMNS * SKIN_PROFILE_CAPACITY * 4);\r\n this._tableDirty = true;\r\n }\r\n if (this._tableDirty && this._table && this._tableData) {\r\n this.packTable(this._tableData);\r\n this._table.update(this._tableData, 0, 0, SKIN_PROFILE_COLUMNS, SKIN_PROFILE_CAPACITY);\r\n this._tableDirty = false;\r\n }\r\n return this._table;\r\n }\r\n\r\n /** Number of parameter columns in the packed table. @public */\r\n static get tableColumns() {\r\n return SKIN_PROFILE_COLUMNS;\r\n }\r\n\r\n /**\r\n * Column the baked transmission profile starts at.\r\n *\r\n * @public\r\n */\r\n static get transmissionLutOffset() {\r\n return SKIN_PROFILE_PARAM_COLUMNS;\r\n }\r\n\r\n /**\r\n * Column holding `(worldUnitScale, scatterScale, 0, 0)`.\r\n *\r\n * @remarks\r\n * Read by the transmission thickness pass, which needs the world unit scale to\r\n * size its normal shrink against the asset.\r\n *\r\n * @public\r\n */\r\n static get scalingParamColumn() {\r\n return ProfileColumn.Scaling as number;\r\n }\r\n\r\n /**\r\n * Column holding `(extinctionScale, normalScale, scatteringDistribution,\r\n * 1 / ior)`.\r\n *\r\n * @public\r\n */\r\n static get transmissionParamColumn() {\r\n return ProfileColumn.Transmission as number;\r\n }\r\n\r\n /** Number of entries in the baked transmission profile. @public */\r\n static get transmissionLutSize() {\r\n return SKIN_TRANSMISSION_LUT_SIZE;\r\n }\r\n\r\n /** Number of rows in the packed table. @public */\r\n static get tableRows() {\r\n return SKIN_PROFILE_CAPACITY;\r\n }\r\n\r\n /**\r\n * The id this profile occupies in the packed table.\r\n *\r\n * @remarks\r\n * Ids start at 1; 0 means \"not skin\" in the per-pixel profile channel. The\r\n * material encodes this as `id / 255`.\r\n *\r\n * @public\r\n */\r\n get id() {\r\n return this._id;\r\n }\r\n\r\n /** Normalized id as written to an 8-bit per-pixel channel. @public */\r\n get encodedId() {\r\n return this._id / 255;\r\n }\r\n\r\n /** The preset this profile was last initialized from. @public */\r\n get preset() {\r\n return this._preset;\r\n }\r\n set preset(val: SSSProfilePreset) {\r\n if (val !== this._preset) {\r\n this.applyPreset(val);\r\n }\r\n }\r\n\r\n /**\r\n * Per-channel scattering albedo.\r\n *\r\n * @remarks\r\n * Drives Burley's shaping term `s = (albedo - 0.33)^4 * 100 + 3.5`, so values\r\n * near 0.33 give the widest diffusion and values at either extreme tighten it.\r\n *\r\n * @public\r\n */\r\n get surfaceAlbedo(): Immutable<Vector3> {\r\n return this._surfaceAlbedo;\r\n }\r\n set surfaceAlbedo(val: Immutable<Vector3>) {\r\n if (!val.equalsTo(this._surfaceAlbedo)) {\r\n this._surfaceAlbedo.set(val);\r\n this.notifyChanged();\r\n }\r\n }\r\n\r\n /**\r\n * Per-channel diffuse mean free path, as a ratio.\r\n *\r\n * @remarks\r\n * Scaled by {@link SSSProfile.meanFreePathDistance} to reach world units. The\r\n * red channel is normally much longer than blue, which is what makes thin\r\n * geometry such as an ear rim glow red.\r\n *\r\n * @public\r\n */\r\n get meanFreePath(): Immutable<Vector3> {\r\n return this._meanFreePath;\r\n }\r\n set meanFreePath(val: Immutable<Vector3>) {\r\n if (!val.equalsTo(this._meanFreePath)) {\r\n this._meanFreePath.set(val);\r\n this.notifyChanged();\r\n }\r\n }\r\n\r\n /** Mean free path of the widest channel, in profile space. @public */\r\n get meanFreePathDistance() {\r\n return this._meanFreePathDistance;\r\n }\r\n set meanFreePathDistance(val: number) {\r\n const next = Math.max(0, val ?? 0);\r\n if (next !== this._meanFreePathDistance) {\r\n this._meanFreePathDistance = next;\r\n this.notifyChanged();\r\n }\r\n }\r\n\r\n /**\r\n * Profile-space to world-unit conversion, for scenes not authored in metres.\r\n *\r\n * @public\r\n */\r\n get worldUnitScale() {\r\n return this._worldUnitScale;\r\n }\r\n set worldUnitScale(val: number) {\r\n const next = Math.max(0.01, val ?? 1);\r\n if (next !== this._worldUnitScale) {\r\n this._worldUnitScale = next;\r\n this.notifyChanged();\r\n }\r\n }\r\n\r\n /** Overall multiplier on the diffusion width. @public */\r\n get scatterScale() {\r\n return this._scatterScale;\r\n }\r\n set scatterScale(val: number) {\r\n const next = Math.max(0, val ?? 1);\r\n if (next !== this._scatterScale) {\r\n this._scatterScale = next;\r\n this.notifyChanged();\r\n }\r\n }\r\n\r\n /**\r\n * Per-channel tint applied where two different profiles meet.\r\n *\r\n * @remarks\r\n * Taps that belong to another profile are attenuated by this instead of being\r\n * rejected outright, so a face/lip boundary softens rather than forming a seam.\r\n *\r\n * @public\r\n */\r\n get boundaryColorBleed(): Immutable<Vector3> {\r\n return this._boundaryColorBleed;\r\n }\r\n set boundaryColorBleed(val: Immutable<Vector3>) {\r\n if (!val.equalsTo(this._boundaryColorBleed)) {\r\n this._boundaryColorBleed.set(val);\r\n this.notifyChanged();\r\n }\r\n }\r\n\r\n /** Tint applied to light transmitted through thin geometry. @public */\r\n get transmissionTint(): Immutable<Vector3> {\r\n return this._transmissionTint;\r\n }\r\n set transmissionTint(val: Immutable<Vector3>) {\r\n if (!val.equalsTo(this._transmissionTint)) {\r\n this._transmissionTint.set(val);\r\n this.notifyChanged();\r\n }\r\n }\r\n\r\n /** Extinction multiplier for transmission attenuation. @public */\r\n get extinctionScale() {\r\n return this._extinctionScale;\r\n }\r\n set extinctionScale(val: number) {\r\n const next = Math.max(0, val ?? 1);\r\n if (next !== this._extinctionScale) {\r\n this._extinctionScale = next;\r\n this.notifyChanged();\r\n }\r\n }\r\n\r\n /** How much surface normal detail survives the diffusion. @public */\r\n get normalScale() {\r\n return this._normalScale;\r\n }\r\n set normalScale(val: number) {\r\n const next = Math.max(0, val ?? 0);\r\n if (next !== this._normalScale) {\r\n this._normalScale = next;\r\n this.notifyChanged();\r\n }\r\n }\r\n\r\n /**\r\n * Henyey-Greenstein asymmetry of the transmitted light, in `[-1, 1]`.\r\n *\r\n * @public\r\n */\r\n get scatteringDistribution() {\r\n return this._scatteringDistribution;\r\n }\r\n set scatteringDistribution(val: number) {\r\n const next = Math.min(1, Math.max(-1, val ?? 0));\r\n if (next !== this._scatteringDistribution) {\r\n this._scatteringDistribution = next;\r\n this.notifyChanged();\r\n }\r\n }\r\n\r\n /**\r\n * Index of refraction used to bend the view ray before the phase function.\r\n *\r\n * @public\r\n */\r\n get ior() {\r\n return this._ior;\r\n }\r\n set ior(val: number) {\r\n const next = Math.min(3, Math.max(1, val ?? 1.55));\r\n if (next !== this._ior) {\r\n this._ior = next;\r\n this.notifyChanged();\r\n }\r\n }\r\n\r\n /**\r\n * Multiplier on the material roughness for the narrow specular lobe.\r\n *\r\n * @public\r\n */\r\n get roughness0() {\r\n return this._roughness0;\r\n }\r\n set roughness0(val: number) {\r\n const next = Math.min(2, Math.max(0.5, val ?? 0.75));\r\n if (next !== this._roughness0) {\r\n this._roughness0 = next;\r\n this.notifyChanged();\r\n }\r\n }\r\n\r\n /**\r\n * Multiplier on the material roughness for the wide specular lobe.\r\n *\r\n * @remarks\r\n * Same scaling as {@link SSSProfile.roughness0}; skin's default 1.3 broadens\r\n * the second lobe, giving it a soft sheen alongside the tighter highlight.\r\n *\r\n * @public\r\n */\r\n get roughness1() {\r\n return this._roughness1;\r\n }\r\n set roughness1(val: number) {\r\n const next = Math.min(2, Math.max(0.5, val ?? 1.3));\r\n if (next !== this._roughness1) {\r\n this._roughness1 = next;\r\n this.notifyChanged();\r\n }\r\n }\r\n\r\n /** Blend between the narrow and wide specular lobes. @public */\r\n get lobeMix() {\r\n return this._lobeMix;\r\n }\r\n set lobeMix(val: number) {\r\n const next = Math.min(0.9, Math.max(0.1, val ?? 0.85));\r\n if (next !== this._lobeMix) {\r\n this._lobeMix = next;\r\n this.notifyChanged();\r\n }\r\n }\r\n\r\n /**\r\n * Per-channel diffusion distance, in profile space.\r\n *\r\n * @returns Mean free path scaled by the profile's distance and scatter scale.\r\n *\r\n * @public\r\n */\r\n getScatterDistance(): Vector3 {\r\n const s = this._meanFreePathDistance * this._scatterScale;\r\n return new Vector3(this._meanFreePath.x * s, this._meanFreePath.y * s, this._meanFreePath.z * s);\r\n }\r\n\r\n /**\r\n * Overwrites every parameter from another profile.\r\n *\r\n * @remarks\r\n * The only way to transfer a look, since profiles cannot be shared or cloned.\r\n * The table row is untouched: it identifies the profile, not its contents.\r\n *\r\n * @param other - Profile to copy the parameters from.\r\n *\r\n * @public\r\n */\r\n copyFrom(other: SSSProfile) {\r\n this._preset = other._preset;\r\n this._surfaceAlbedo.set(other._surfaceAlbedo);\r\n this._meanFreePath.set(other._meanFreePath);\r\n this._boundaryColorBleed.set(other._boundaryColorBleed);\r\n this._transmissionTint.set(other._transmissionTint);\r\n this._meanFreePathDistance = other._meanFreePathDistance;\r\n this._worldUnitScale = other._worldUnitScale;\r\n this._scatterScale = other._scatterScale;\r\n this._extinctionScale = other._extinctionScale;\r\n this._normalScale = other._normalScale;\r\n this._scatteringDistribution = other._scatteringDistribution;\r\n this._ior = other._ior;\r\n this._roughness0 = other._roughness0;\r\n this._roughness1 = other._roughness1;\r\n this._lobeMix = other._lobeMix;\r\n this.notifyChanged();\r\n }\r\n\r\n /**\r\n * Releases this profile's table slot.\r\n *\r\n * @public\r\n */\r\n dispose() {\r\n if (this._disposed) {\r\n return;\r\n }\r\n this._disposed = true;\r\n if (SSSProfile._profiles[this._id] === this) {\r\n SSSProfile._profiles[this._id] = null;\r\n SSSProfile.markDirty();\r\n }\r\n }\r\n\r\n private applyPreset(preset: SSSProfilePreset) {\r\n const t = SKIN_PROFILE_TEMPLATES[preset] ?? SKIN_PROFILE_TEMPLATES.skin;\r\n this._preset = preset;\r\n this._surfaceAlbedo.setXYZ(t.surfaceAlbedo[0], t.surfaceAlbedo[1], t.surfaceAlbedo[2]);\r\n this._meanFreePath.setXYZ(t.meanFreePath[0], t.meanFreePath[1], t.meanFreePath[2]);\r\n this._boundaryColorBleed.setXYZ(\r\n t.boundaryColorBleed[0],\r\n t.boundaryColorBleed[1],\r\n t.boundaryColorBleed[2]\r\n );\r\n this._transmissionTint.setXYZ(t.transmissionTint[0], t.transmissionTint[1], t.transmissionTint[2]);\r\n this._meanFreePathDistance = t.meanFreePathDistance;\r\n this._worldUnitScale = t.worldUnitScale;\r\n this._scatterScale = t.scatterScale;\r\n this._extinctionScale = t.extinctionScale;\r\n this._normalScale = t.normalScale;\r\n this._scatteringDistribution = t.scatteringDistribution;\r\n this._ior = t.ior;\r\n this._roughness0 = t.roughness0;\r\n this._roughness1 = t.roughness1;\r\n this._lobeMix = t.lobeMix;\r\n this.notifyChanged();\r\n }\r\n\r\n private static allocateId(profile: SSSProfile) {\r\n for (let i = 1; i < SKIN_PROFILE_CAPACITY; i++) {\r\n if (!this._profiles[i]) {\r\n this._profiles[i] = profile;\r\n this.markDirty();\r\n return i;\r\n }\r\n }\r\n throw new Error('SSSProfile limit exceeded');\r\n }\r\n\r\n private static markDirty() {\r\n this._tableDirty = true;\r\n }\r\n\r\n /**\r\n * Flags the packed table for a rebuild and notifies materials using this\r\n * profile so they can refresh their uniforms.\r\n */\r\n private notifyChanged() {\r\n SSSProfile.markDirty();\r\n this._changeListeners.forEach((listener) => listener());\r\n }\r\n\r\n private static packTable(out: Float32Array<ArrayBuffer>) {\r\n out.fill(0);\r\n const stride = SKIN_PROFILE_COLUMNS * 4;\r\n for (let id = 1; id < SKIN_PROFILE_CAPACITY; id++) {\r\n const p = this._profiles[id];\r\n if (!p) {\r\n continue;\r\n }\r\n const row = id * stride;\r\n const write = (column: ProfileColumn, x: number, y: number, z: number, w: number) => {\r\n const o = row + column * 4;\r\n out[o] = x;\r\n out[o + 1] = y;\r\n out[o + 2] = z;\r\n out[o + 3] = w;\r\n };\r\n const d = p.getScatterDistance();\r\n const widest = Math.max(d.x, d.y, d.z);\r\n const albedoForSampling =\r\n widest > 0\r\n ? [p._surfaceAlbedo.x, p._surfaceAlbedo.y, p._surfaceAlbedo.z][[d.x, d.y, d.z].indexOf(widest)]\r\n : p._surfaceAlbedo.x;\r\n write(ProfileColumn.Scaling, p._worldUnitScale, p._scatterScale, 0, 0);\r\n write(\r\n ProfileColumn.SurfaceAlbedo,\r\n p._surfaceAlbedo.x,\r\n p._surfaceAlbedo.y,\r\n p._surfaceAlbedo.z,\r\n albedoForSampling\r\n );\r\n write(ProfileColumn.MeanFreePath, d.x, d.y, d.z, widest);\r\n write(\r\n ProfileColumn.Boundary,\r\n p._boundaryColorBleed.x,\r\n p._boundaryColorBleed.y,\r\n p._boundaryColorBleed.z,\r\n 0\r\n );\r\n write(\r\n ProfileColumn.Transmission,\r\n p._extinctionScale,\r\n p._normalScale,\r\n p._scatteringDistribution,\r\n 1 / Math.max(p._ior, 1e-4)\r\n );\r\n write(ProfileColumn.Specular, p._roughness0, p._roughness1, p._lobeMix, 0);\r\n // The LUT columns are consecutive within the row, so the baked profile\r\n // drops straight in after the scalar parameters.\r\n p.writeTransmissionProfile(out, row + SKIN_PROFILE_PARAM_COLUMNS * 4);\r\n }\r\n }\r\n\r\n /**\r\n * Bakes this profile's transmission table.\r\n *\r\n * @param out - Destination, `4 x transmissionLutSize` floats from `offset`.\r\n * @param offset - Index of the first float to write.\r\n *\r\n * @public\r\n */\r\n writeTransmissionProfile(out: Float32Array, offset = 0) {\r\n const invUnitScale = 1 / Math.max(this._worldUnitScale, 1e-4);\r\n const d = this.getScatterDistance();\r\n const l = [\r\n d.x * WORLD_UNITS_TO_PROFILE_MM,\r\n d.y * WORLD_UNITS_TO_PROFILE_MM,\r\n d.z * WORLD_UNITS_TO_PROFILE_MM\r\n ];\r\n const s = [\r\n searchLightDiffuseScalingFactor(this._surfaceAlbedo.x),\r\n searchLightDiffuseScalingFactor(this._surfaceAlbedo.y),\r\n searchLightDiffuseScalingFactor(this._surfaceAlbedo.z)\r\n ];\r\n const tint = [this._transmissionTint.x, this._transmissionTint.y, this._transmissionTint.z];\r\n const offsetMM = TRANSMISSION_LUT_RADIUS_OFFSET_MM * invUnitScale;\r\n for (let i = 0; i < SKIN_TRANSMISSION_LUT_SIZE; i++) {\r\n const o = offset + i * 4;\r\n if (i === SKIN_TRANSMISSION_LUT_SIZE - 1) {\r\n out[o] = 0;\r\n out[o + 1] = 0;\r\n out[o + 2] = 0;\r\n out[o + 3] = 0;\r\n break;\r\n }\r\n const distanceMM = (i / SKIN_TRANSMISSION_LUT_SIZE) * TRANSMISSION_LUT_MAX_DISTANCE_MM * invUnitScale;\r\n const r = distanceMM + offsetMM;\r\n for (let c = 0; c < 3; c++) {\r\n out[o + c] =\r\n l[c] > 0\r\n ? 0.25 * (Math.exp((-s[c] * r) / l[c]) + 3 * Math.exp((-s[c] * r) / (3 * l[c]))) * tint[c]\r\n : 0;\r\n }\r\n out[o + 3] = Math.exp(-distanceMM * this._extinctionScale);\r\n }\r\n }\r\n}\r\n"],"names":["SKIN_PROFILE_PARAM_COLUMNS","SKIN_TRANSMISSION_LUT_SIZE","SKIN_PROFILE_COLUMNS","SKIN_PROFILE_CAPACITY","CREATE_TOKEN","Symbol","SKIN_MAX_TRANSMISSION_OPTICAL_DEPTH","SKIN_TRANSMISSION_OPTICAL_DEPTH_FLOOR","SKIN_TRANSMISSION_OPTICAL_DEPTH_BIAS","SKIN_TRANSMISSION_NO_DATA_ENCODING","TRANSMISSION_LUT_MAX_DISTANCE_MM","TRANSMISSION_LUT_RADIUS_OFFSET_MM","WORLD_UNITS_TO_PROFILE_MM","SKIN_OPTICAL_DEPTH_PER_WORLD_UNIT","searchLightDiffuseScalingFactor","albedo","v","SKIN_PROFILE_TEMPLATES","skin","surfaceAlbedo","meanFreePath","meanFreePathDistance","worldUnitScale","scatterScale","boundaryColorBleed","transmissionTint","extinctionScale","normalScale","scatteringDistribution","ior","roughness0","roughness1","lobeMix","skin_pale","skin_tan","skin_dark","wax","jade","marble","SSSProfile","_profiles","Array","fill","_table","_tableDevice","_tableData","_tableDirty","_defaultProfile","_id","_surfaceAlbedo","_meanFreePath","_boundaryColorBleed","_transmissionTint","_preset","_meanFreePathDistance","_worldUnitScale","_scatterScale","_extinctionScale","_normalScale","_scatteringDistribution","_ior","_roughness0","_roughness1","_lobeMix","_disposed","_changeListeners","token","preset","Error","Vector3","Set","allocateId","applyPreset","addChangeListener","listener","add","removeChangeListener","delete","createOwned","getDefault","getById","id","getTable","device","disposed","createTexture2D","mipmapping","samplerOptions","minFilter","magFilter","mipFilter","Float32Array","packTable","update","tableColumns","transmissionLutOffset","scalingParamColumn","transmissionParamColumn","transmissionLutSize","tableRows","encodedId","val","equalsTo","set","notifyChanged","next","Math","max","min","getScatterDistance","s","x","y","z","copyFrom","other","dispose","markDirty","t","setXYZ","profile","i","forEach","out","stride","p","row","write","column","w","o","d","widest","albedoForSampling","indexOf","writeTransmissionProfile","offset","invUnitScale","l","tint","offsetMM","distanceMM","r","c","exp"],"mappings":"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"}
|
|
@@ -306,7 +306,7 @@ const SUBSURFACE_PROFILE_PRESET_RESPONSE = {
|
|
|
306
306
|
static _maxProfiles = 255;
|
|
307
307
|
static _profiles = new Array(SubsurfaceProfile._maxProfiles + 1).fill(null);
|
|
308
308
|
static _version = 0;
|
|
309
|
-
static
|
|
309
|
+
static _defaultSSSProfile = null;
|
|
310
310
|
_scatterRadius;
|
|
311
311
|
_falloffColor;
|
|
312
312
|
_meanFreePathColor;
|
|
@@ -399,10 +399,10 @@ const SUBSURFACE_PROFILE_PRESET_RESPONSE = {
|
|
|
399
399
|
*
|
|
400
400
|
* @public
|
|
401
401
|
*/ static getDefaultSkinProfile() {
|
|
402
|
-
if (!this.
|
|
403
|
-
this.
|
|
402
|
+
if (!this._defaultSSSProfile) {
|
|
403
|
+
this._defaultSSSProfile = new SubsurfaceProfile();
|
|
404
404
|
}
|
|
405
|
-
return this.
|
|
405
|
+
return this._defaultSSSProfile;
|
|
406
406
|
}
|
|
407
407
|
/**
|
|
408
408
|
* Gets the preset tint bias used by the screen-space transmission model.
|
|
@@ -525,10 +525,6 @@ const SUBSURFACE_PROFILE_PRESET_RESPONSE = {
|
|
|
525
525
|
/**
|
|
526
526
|
* Mean free path color used to derive channel-dependent scatter radius.
|
|
527
527
|
*
|
|
528
|
-
* @remarks
|
|
529
|
-
* This is a more UE-like authoring control that keeps the existing radius-
|
|
530
|
-
* based implementation, while letting tools expose a color + distance pair.
|
|
531
|
-
*
|
|
532
528
|
* @public
|
|
533
529
|
*/ get meanFreePathColor() {
|
|
534
530
|
return this._meanFreePathColor;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subsurfaceprofile.js","sources":["../../src/material/subsurfaceprofile.ts"],"sourcesContent":["import { Vector3, type Immutable } from '@zephyr3d/base';\r\n\r\n/**\r\n * Built-in subsurface scattering profile preset names.\r\n *\r\n * @remarks\r\n * The short aliases (`skin`, `wax`, and `jade`) resolve to their default\r\n * canonical profiles.\r\n *\r\n * @public\r\n */\r\nexport type SubsurfaceProfilePreset =\r\n | 'skin'\r\n | 'skin_thin'\r\n | 'skin_default'\r\n | 'skin_heavy_makeup'\r\n | 'wax'\r\n | 'wax_backlit'\r\n | 'wax_soft'\r\n | 'jade'\r\n | 'jade_backlit'\r\n | 'jade_soft';\r\n\r\ntype CanonicalSubsurfaceProfilePreset =\r\n | 'skin_thin'\r\n | 'skin_default'\r\n | 'skin_heavy_makeup'\r\n | 'wax_backlit'\r\n | 'wax_soft'\r\n | 'jade_backlit'\r\n | 'jade_soft';\r\n\r\ntype SubsurfaceProfilePresetTemplate = {\r\n meanFreePathColor: [number, number, number];\r\n meanFreePathDistance: number;\r\n falloffColor: [number, number, number];\r\n strength: number;\r\n scale: number;\r\n worldUnitScale: number;\r\n boundaryColorBleed: number;\r\n transmissionTintColor: [number, number, number];\r\n extinctionScale: number;\r\n normalScale: number;\r\n scatteringDistribution: number;\r\n specularDetailSoftness: number;\r\n specularDetailRadius: number;\r\n};\r\n\r\nconst SUBSURFACE_PROFILE_PRESET_ALIAS: Record<SubsurfaceProfilePreset, CanonicalSubsurfaceProfilePreset> = {\r\n skin: 'skin_default',\r\n skin_thin: 'skin_thin',\r\n skin_default: 'skin_default',\r\n skin_heavy_makeup: 'skin_heavy_makeup',\r\n wax: 'wax_backlit',\r\n wax_backlit: 'wax_backlit',\r\n wax_soft: 'wax_soft',\r\n jade: 'jade_soft',\r\n jade_backlit: 'jade_backlit',\r\n jade_soft: 'jade_soft'\r\n};\r\n\r\nconst SUBSURFACE_PROFILE_PRESET_INDEX: Record<CanonicalSubsurfaceProfilePreset, number> = {\r\n skin_thin: 0,\r\n skin_default: 1,\r\n skin_heavy_makeup: 2,\r\n wax_backlit: 3,\r\n wax_soft: 4,\r\n jade_backlit: 5,\r\n jade_soft: 6\r\n};\r\n\r\nconst SUBSURFACE_PROFILE_PRESET_TEMPLATE: Record<\r\n CanonicalSubsurfaceProfilePreset,\r\n SubsurfaceProfilePresetTemplate\r\n> = {\r\n skin_thin: {\r\n meanFreePathColor: [1.0, 0.37, 0.11],\r\n meanFreePathDistance: 0.7,\r\n falloffColor: [1.0, 0.32, 0.2],\r\n strength: 0.68,\r\n scale: 0.82,\r\n worldUnitScale: 0.88,\r\n boundaryColorBleed: 0.13,\r\n transmissionTintColor: [1, 0.37, 0.28],\r\n extinctionScale: 1.24,\r\n normalScale: 1.18,\r\n scatteringDistribution: 0.56,\r\n specularDetailSoftness: 0.66,\r\n specularDetailRadius: 1.35\r\n },\r\n skin_default: {\r\n meanFreePathColor: [1.0, 0.45, 0.17],\r\n meanFreePathDistance: 0.92,\r\n falloffColor: [1.0, 0.39, 0.25],\r\n strength: 0.82,\r\n scale: 0.96,\r\n worldUnitScale: 1,\r\n boundaryColorBleed: 0.22,\r\n transmissionTintColor: [1, 0.46, 0.34],\r\n extinctionScale: 1.06,\r\n normalScale: 1,\r\n scatteringDistribution: 0.6,\r\n specularDetailSoftness: 0.78,\r\n specularDetailRadius: 1.8\r\n },\r\n skin_heavy_makeup: {\r\n meanFreePathColor: [1.0, 0.33, 0.11],\r\n meanFreePathDistance: 0.68,\r\n falloffColor: [1.0, 0.26, 0.16],\r\n strength: 0.56,\r\n scale: 0.76,\r\n worldUnitScale: 0.84,\r\n boundaryColorBleed: 0.08,\r\n transmissionTintColor: [0.94, 0.31, 0.22],\r\n extinctionScale: 1.4,\r\n normalScale: 1.26,\r\n scatteringDistribution: 0.5,\r\n specularDetailSoftness: 0.86,\r\n specularDetailRadius: 2.1\r\n },\r\n wax_backlit: {\r\n meanFreePathColor: [1.0, 0.68, 0.36],\r\n meanFreePathDistance: 1.54,\r\n falloffColor: [1.0, 0.8, 0.66],\r\n strength: 1.12,\r\n scale: 1.42,\r\n worldUnitScale: 1.26,\r\n boundaryColorBleed: 0.42,\r\n transmissionTintColor: [1, 0.82, 0.7],\r\n extinctionScale: 0.78,\r\n normalScale: 0.92,\r\n scatteringDistribution: 0.82,\r\n specularDetailSoftness: 0.88,\r\n specularDetailRadius: 2.35\r\n },\r\n wax_soft: {\r\n meanFreePathColor: [1.0, 0.72, 0.38],\r\n meanFreePathDistance: 1.2,\r\n falloffColor: [1.0, 0.86, 0.74],\r\n strength: 1.02,\r\n scale: 1.28,\r\n worldUnitScale: 1.12,\r\n boundaryColorBleed: 0.36,\r\n transmissionTintColor: [1, 0.86, 0.74],\r\n extinctionScale: 0.86,\r\n normalScale: 0.98,\r\n scatteringDistribution: 0.74,\r\n specularDetailSoftness: 0.94,\r\n specularDetailRadius: 2.65\r\n },\r\n jade_backlit: {\r\n meanFreePathColor: [0.74, 1.0, 0.88],\r\n meanFreePathDistance: 0.92,\r\n falloffColor: [0.66, 0.94, 0.88],\r\n strength: 0.92,\r\n scale: 1.14,\r\n worldUnitScale: 1.06,\r\n boundaryColorBleed: 0.26,\r\n transmissionTintColor: [0.68, 0.92, 0.86],\r\n extinctionScale: 0.92,\r\n normalScale: 1.02,\r\n scatteringDistribution: 0.7,\r\n specularDetailSoftness: 0.42,\r\n specularDetailRadius: 1.2\r\n },\r\n jade_soft: {\r\n meanFreePathColor: [0.68, 1.0, 0.84],\r\n meanFreePathDistance: 0.8,\r\n falloffColor: [0.72, 0.94, 0.86],\r\n strength: 0.82,\r\n scale: 1.02,\r\n worldUnitScale: 0.98,\r\n boundaryColorBleed: 0.22,\r\n transmissionTintColor: [0.74, 0.96, 0.9],\r\n extinctionScale: 1,\r\n normalScale: 1.04,\r\n scatteringDistribution: 0.66,\r\n specularDetailSoftness: 0.5,\r\n specularDetailRadius: 1.4\r\n }\r\n};\r\n\r\nconst SUBSURFACE_PROFILE_PRESET_TINT_BIAS: Record<\r\n CanonicalSubsurfaceProfilePreset,\r\n [number, number, number]\r\n> = {\r\n skin_thin: [1, 0.56, 0.46],\r\n skin_default: [1, 0.62, 0.5],\r\n skin_heavy_makeup: [1, 0.5, 0.42],\r\n wax_backlit: [1, 0.8, 0.7],\r\n wax_soft: [1, 0.86, 0.78],\r\n jade_backlit: [0.72, 0.92, 0.96],\r\n jade_soft: [0.68, 0.96, 0.88]\r\n};\r\n\r\nconst SUBSURFACE_PROFILE_PRESET_RESPONSE: Record<\r\n CanonicalSubsurfaceProfilePreset,\r\n [number, number, number, number]\r\n> = {\r\n skin_thin: [0.08, 0.12, 0.06, 0.12],\r\n skin_default: [0.1, 0.14, 0.08, 0.16],\r\n skin_heavy_makeup: [0.02, 0.05, -0.02, 0.01],\r\n wax_backlit: [0.12, 0.2, 0.26, 0.24],\r\n wax_soft: [0.2, 0.3, 0.34, 0.1],\r\n jade_backlit: [0.08, 0.18, 0.2, 0.24],\r\n jade_soft: [0.16, 0.24, 0.22, 0.12]\r\n};\r\n\r\n/**\r\n * Serializable subsurface scattering profile.\r\n *\r\n * @remarks\r\n * The profile stores the channel-dependent scattering radius and falloff used\r\n * by the screen-space SSS post effect. Materials can share a profile instance\r\n * to emulate Unreal-style skin profile assets.\r\n *\r\n * @public\r\n */\r\nexport class SubsurfaceProfile {\r\n private static readonly _maxProfiles = 255;\r\n private static readonly _profiles: Array<SubsurfaceProfile | null> = new Array(\r\n SubsurfaceProfile._maxProfiles + 1\r\n ).fill(null);\r\n private static _version = 0;\r\n private static _defaultSkinProfile: SubsurfaceProfile | null = null;\r\n private readonly _scatterRadius: Vector3;\r\n private readonly _falloffColor: Vector3;\r\n private readonly _meanFreePathColor: Vector3;\r\n private readonly _transmissionTintColor: Vector3;\r\n private _preset: CanonicalSubsurfaceProfilePreset;\r\n private _meanFreePathDistance: number;\r\n private _strength: number;\r\n private _scale: number;\r\n private _worldUnitScale: number;\r\n private _boundaryColorBleed: number;\r\n private _extinctionScale: number;\r\n private _normalScale: number;\r\n private _scatteringDistribution: number;\r\n private _specularDetailSoftness: number;\r\n private _specularDetailRadius: number;\r\n private readonly _slot: number;\r\n private readonly _changeListeners: Set<() => void>;\r\n private _disposed: boolean;\r\n\r\n /**\r\n * Creates a subsurface scattering profile initialized with the default skin preset.\r\n *\r\n * @public\r\n */\r\n constructor() {\r\n this._scatterRadius = new Vector3(0, 0, 0);\r\n this._falloffColor = new Vector3(0, 0, 0);\r\n this._meanFreePathColor = new Vector3(0, 0, 0);\r\n this._transmissionTintColor = new Vector3(0, 0, 0);\r\n this._preset = 'skin_default';\r\n this._meanFreePathDistance = 0;\r\n this._strength = 0;\r\n this._scale = 0;\r\n this._worldUnitScale = 1;\r\n this._boundaryColorBleed = 0;\r\n this._extinctionScale = 1;\r\n this._normalScale = 1;\r\n this._scatteringDistribution = 0.65;\r\n this._specularDetailSoftness = 0.78;\r\n this._specularDetailRadius = 1.8;\r\n this._changeListeners = new Set();\r\n this._disposed = false;\r\n this._slot = SubsurfaceProfile.allocateSlot(this);\r\n this.applyPresetTemplate(this._preset, false);\r\n }\r\n\r\n clone() {\r\n const other = new SubsurfaceProfile();\r\n other.copyFrom(this);\r\n return other;\r\n }\r\n\r\n copyFrom(other: SubsurfaceProfile) {\r\n this.preset = other.preset;\r\n this.meanFreePathColor = other.meanFreePathColor;\r\n this.meanFreePathDistance = other.meanFreePathDistance;\r\n this.strength = other.strength;\r\n this.scale = other.scale;\r\n this.worldUnitScale = other.worldUnitScale;\r\n this.boundaryColorBleed = other.boundaryColorBleed;\r\n this.transmissionTintColor = other.transmissionTintColor;\r\n this.extinctionScale = other.extinctionScale;\r\n this.normalScale = other.normalScale;\r\n this.scatteringDistribution = other.scatteringDistribution;\r\n this.specularDetailSoftness = other.specularDetailSoftness;\r\n this.specularDetailRadius = other.specularDetailRadius;\r\n this.falloffColor = other.falloffColor;\r\n }\r\n\r\n dispose() {\r\n if (this._disposed) {\r\n return;\r\n }\r\n this._disposed = true;\r\n this._changeListeners.clear();\r\n SubsurfaceProfile.releaseSlot(this._slot, this);\r\n }\r\n\r\n static get version() {\r\n return this._version;\r\n }\r\n\r\n /**\r\n * Gets the profile assigned to a packed profile slot.\r\n *\r\n * @param slot - The 1-based profile slot index.\r\n * @returns The profile assigned to the slot, or `null` if the slot is invalid or unused.\r\n *\r\n * @public\r\n */\r\n static getProfileBySlot(slot: number) {\r\n return slot > 0 && slot < this._profiles.length ? this._profiles[slot] : null;\r\n }\r\n\r\n /**\r\n * Gets the shared default skin subsurface profile.\r\n *\r\n * @returns The lazily-created default skin profile.\r\n *\r\n * @public\r\n */\r\n static getDefaultSkinProfile() {\r\n if (!this._defaultSkinProfile) {\r\n this._defaultSkinProfile = new SubsurfaceProfile();\r\n }\r\n return this._defaultSkinProfile;\r\n }\r\n\r\n /**\r\n * Gets the preset tint bias used by the screen-space transmission model.\r\n *\r\n * @param index - The packed canonical preset index.\r\n * @returns The RGB tint bias for the preset, or white when the index is unknown.\r\n *\r\n * @public\r\n */\r\n static getPresetTintBiasByIndex(index: number) {\r\n return SUBSURFACE_PROFILE_PRESET_TINT_BIAS[this.getPresetNameByIndex(index)] ?? [1, 1, 1];\r\n }\r\n\r\n /**\r\n * Gets the preset transmission response used by the screen-space SSS pass.\r\n *\r\n * @param index - The packed canonical preset index.\r\n * @returns The four-component transmission response for the preset.\r\n *\r\n * @public\r\n */\r\n static getPresetResponseByIndex(index: number) {\r\n return SUBSURFACE_PROFILE_PRESET_RESPONSE[this.getPresetNameByIndex(index)] ?? [0, 0, 0, 0];\r\n }\r\n\r\n /**\r\n * Computes the effective tint bias from the preset and current profile settings.\r\n *\r\n * @returns The derived RGB tint bias used for transmission tinting.\r\n *\r\n * @public\r\n */\r\n getDerivedTintBias(): [number, number, number] {\r\n const base = SUBSURFACE_PROFILE_PRESET_TINT_BIAS[this._preset] ?? [1, 1, 1];\r\n const factors = this.getDerivedProfileFactors();\r\n const derived: [number, number, number] = [\r\n this.clamp01(0.78 + factors.warmBias * 0.26 - factors.coolBias * 0.16 + factors.boundaryNorm * 0.04),\r\n this.clamp01(\r\n 0.3 +\r\n factors.meanFreePathColor[1] * 0.24 +\r\n factors.transmissionTintColor[1] * 0.28 +\r\n factors.distanceNorm * 0.08 +\r\n factors.scaleNorm * 0.05 +\r\n factors.boundaryNorm * 0.08 +\r\n factors.coolBias * 0.06\r\n ),\r\n this.clamp01(\r\n 0.14 +\r\n factors.meanFreePathColor[2] * 0.22 +\r\n factors.transmissionTintColor[2] * 0.32 +\r\n factors.distanceNorm * 0.06 +\r\n factors.boundaryNorm * 0.06 +\r\n factors.coolBias * 0.12 -\r\n factors.warmBias * 0.06\r\n )\r\n ];\r\n const blend = this.clampRange(\r\n 0.26 + factors.radiusNorm * 0.16 + factors.scaleNorm * 0.1 + factors.strengthNorm * 0.08,\r\n 0.25,\r\n 0.88\r\n );\r\n return [\r\n this.mixNumber(base[0], derived[0], blend),\r\n this.mixNumber(base[1], derived[1], blend),\r\n this.mixNumber(base[2], derived[2], blend)\r\n ];\r\n }\r\n\r\n /**\r\n * Computes the effective transmission response from the preset and current profile settings.\r\n *\r\n * @returns The derived transmission response packed as four scalar channels.\r\n *\r\n * @public\r\n */\r\n getDerivedTransmissionResponse(): [number, number, number, number] {\r\n const base = SUBSURFACE_PROFILE_PRESET_RESPONSE[this._preset] ?? [0, 0, 0, 0];\r\n const factors = this.getDerivedProfileFactors();\r\n const blend = this.clampRange(\r\n 0.32 +\r\n factors.distanceNorm * 0.18 +\r\n factors.scaleNorm * 0.12 +\r\n factors.strengthNorm * 0.1 +\r\n factors.boundaryNorm * 0.06,\r\n 0.28,\r\n 0.9\r\n );\r\n const derived: [number, number, number, number] = [\r\n this.clampRange(\r\n -0.06 +\r\n factors.radiusNorm * 0.08 +\r\n factors.distanceNorm * 0.08 +\r\n factors.strengthNorm * 0.05 +\r\n factors.distributionNorm * 0.04 +\r\n factors.boundaryNorm * 0.05 +\r\n factors.extinctionSoftness * 0.03,\r\n -0.25,\r\n 0.45\r\n ),\r\n this.clampRange(\r\n 0.02 +\r\n factors.radiusNorm * 0.1 +\r\n factors.scaleNorm * 0.08 +\r\n factors.worldScaleNorm * 0.04 +\r\n factors.distributionNorm * 0.08 +\r\n factors.extinctionSoftness * 0.06,\r\n -0.25,\r\n 0.45\r\n ),\r\n this.clampRange(\r\n -0.08 +\r\n factors.strengthNorm * 0.12 +\r\n factors.scaleNorm * 0.08 +\r\n factors.extinctionSoftness * 0.12 +\r\n factors.boundaryNorm * 0.06 +\r\n factors.warmBias * 0.05 -\r\n factors.coolBias * 0.04,\r\n -0.25,\r\n 0.45\r\n ),\r\n this.clampRange(\r\n -0.02 +\r\n factors.radiusNorm * 0.12 +\r\n factors.scaleNorm * 0.08 +\r\n factors.strengthNorm * 0.06 +\r\n factors.boundaryNorm * 0.06 +\r\n factors.extinctionSoftness * 0.16 +\r\n factors.warmBias * 0.07 +\r\n factors.transmissionTintColor[0] * 0.04,\r\n -0.25,\r\n 0.5\r\n )\r\n ];\r\n return [\r\n this.clampRange(this.mixNumber(base[0], derived[0], blend), -0.25, 0.45),\r\n this.clampRange(this.mixNumber(base[1], derived[1], blend), -0.25, 0.45),\r\n this.clampRange(this.mixNumber(base[2], derived[2], blend), -0.25, 0.45),\r\n this.clampRange(this.mixNumber(base[3], derived[3], blend), -0.25, 0.5)\r\n ];\r\n }\r\n\r\n /**\r\n * Gets the 1-based profile slot used when encoding this profile into SSS buffers.\r\n *\r\n * @public\r\n */\r\n get slot() {\r\n return this._slot;\r\n }\r\n\r\n /**\r\n * Gets or sets the RGB scatter radius.\r\n *\r\n * @remarks\r\n * Assigning a radius also updates the mean-free-path authoring controls.\r\n *\r\n * @public\r\n */\r\n get scatterRadius(): Immutable<Vector3> {\r\n return this._scatterRadius;\r\n }\r\n\r\n set scatterRadius(val: Immutable<Vector3>) {\r\n if (!val.equalsTo(this._scatterRadius)) {\r\n this._scatterRadius.set(val);\r\n this.syncMeanFreePathFromScatterRadius();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the channel falloff color used by the diffusion kernel.\r\n *\r\n * @public\r\n */\r\n get falloffColor(): Immutable<Vector3> {\r\n return this._falloffColor;\r\n }\r\n\r\n set falloffColor(val: Immutable<Vector3>) {\r\n if (!val.equalsTo(this._falloffColor)) {\r\n this._falloffColor.set(val);\r\n this.markDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Mean free path color used to derive channel-dependent scatter radius.\r\n *\r\n * @remarks\r\n * This is a more UE-like authoring control that keeps the existing radius-\r\n * based implementation, while letting tools expose a color + distance pair.\r\n *\r\n * @public\r\n */\r\n get meanFreePathColor(): Immutable<Vector3> {\r\n return this._meanFreePathColor;\r\n }\r\n\r\n set meanFreePathColor(val: Immutable<Vector3>) {\r\n if (!val.equalsTo(this._meanFreePathColor)) {\r\n this._meanFreePathColor.set(val);\r\n this.syncScatterRadiusFromMeanFreePath();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the mean free path distance used to derive the absolute scatter radius.\r\n *\r\n * @public\r\n */\r\n get meanFreePathDistance() {\r\n return this._meanFreePathDistance;\r\n }\r\n\r\n set meanFreePathDistance(val: number) {\r\n const next = Math.max(0, val ?? 0);\r\n if (next !== this._meanFreePathDistance) {\r\n this._meanFreePathDistance = next;\r\n this.syncScatterRadiusFromMeanFreePath();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the active subsurface profile preset.\r\n *\r\n * @remarks\r\n * Assigning a preset applies its template values to the profile. Alias preset\r\n * names are resolved to their canonical preset.\r\n *\r\n * @public\r\n */\r\n get preset() {\r\n return this._preset;\r\n }\r\n\r\n set preset(val: SubsurfaceProfilePreset) {\r\n const next = SubsurfaceProfile.resolvePreset(val);\r\n if (next !== this._preset) {\r\n this._preset = next;\r\n this.applyPresetTemplate(next);\r\n }\r\n }\r\n\r\n /**\r\n * Gets the packed canonical preset index.\r\n *\r\n * @public\r\n */\r\n get presetIndex() {\r\n return SUBSURFACE_PROFILE_PRESET_INDEX[this._preset] ?? 0;\r\n }\r\n\r\n /**\r\n * Gets or sets the SSS strength multiplier.\r\n *\r\n * @public\r\n */\r\n get strength() {\r\n return this._strength;\r\n }\r\n\r\n set strength(val: number) {\r\n if (val !== this._strength) {\r\n this._strength = val;\r\n this.markDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the screen-space scatter width scale.\r\n *\r\n * @public\r\n */\r\n get scale() {\r\n return this._scale;\r\n }\r\n\r\n set scale(val: number) {\r\n if (val !== this._scale) {\r\n this._scale = val;\r\n this.markDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the world-unit scale used when converting profile radii.\r\n *\r\n * @public\r\n */\r\n get worldUnitScale() {\r\n return this._worldUnitScale;\r\n }\r\n\r\n set worldUnitScale(val: number) {\r\n const next = Math.max(0.05, val ?? 0.05);\r\n if (next !== this._worldUnitScale) {\r\n this._worldUnitScale = next;\r\n this.markDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the amount of color bleeding preserved near SSS boundaries.\r\n *\r\n * @remarks\r\n * Values are clamped to the `[0, 1]` range.\r\n *\r\n * @public\r\n */\r\n get boundaryColorBleed() {\r\n return this._boundaryColorBleed;\r\n }\r\n\r\n set boundaryColorBleed(val: number) {\r\n const next = this.clamp01(val ?? 0);\r\n if (next !== this._boundaryColorBleed) {\r\n this._boundaryColorBleed = next;\r\n this.markDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the RGB tint applied to transmitted subsurface light.\r\n *\r\n * @public\r\n */\r\n get transmissionTintColor(): Immutable<Vector3> {\r\n return this._transmissionTintColor;\r\n }\r\n\r\n set transmissionTintColor(val: Immutable<Vector3>) {\r\n if (!val.equalsTo(this._transmissionTintColor)) {\r\n this._transmissionTintColor.set(val);\r\n this.markDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the extinction multiplier used by transmission attenuation.\r\n *\r\n * @remarks\r\n * Values are clamped to zero or greater.\r\n *\r\n * @public\r\n */\r\n get extinctionScale() {\r\n return this._extinctionScale;\r\n }\r\n\r\n set extinctionScale(val: number) {\r\n const next = Math.max(0, val ?? 0);\r\n if (next !== this._extinctionScale) {\r\n this._extinctionScale = next;\r\n this.markDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the normal sensitivity scale used by SSS filtering.\r\n *\r\n * @remarks\r\n * Values are clamped to zero or greater.\r\n *\r\n * @public\r\n */\r\n get normalScale() {\r\n return this._normalScale;\r\n }\r\n\r\n set normalScale(val: number) {\r\n const next = Math.max(0, val ?? 0);\r\n if (next !== this._normalScale) {\r\n this._normalScale = next;\r\n this.markDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the scattering distribution blend.\r\n *\r\n * @remarks\r\n * Values are clamped to the `[0, 1]` range.\r\n *\r\n * @public\r\n */\r\n get scatteringDistribution() {\r\n return this._scatteringDistribution;\r\n }\r\n\r\n set scatteringDistribution(val: number) {\r\n const next = this.clamp01(val ?? 0);\r\n if (next !== this._scatteringDistribution) {\r\n this._scatteringDistribution = next;\r\n this.markDirty();\r\n }\r\n }\r\n\r\n /** Strength of the screen-space filter applied to normal-driven specular detail. */\r\n get specularDetailSoftness() {\r\n return this._specularDetailSoftness;\r\n }\r\n\r\n set specularDetailSoftness(val: number) {\r\n const next = this.clamp01(val ?? 0);\r\n if (next !== this._specularDetailSoftness) {\r\n this._specularDetailSoftness = next;\r\n this.markDirty();\r\n }\r\n }\r\n\r\n /** Radius in screen pixels used to soften normal-driven specular detail. */\r\n get specularDetailRadius() {\r\n return this._specularDetailRadius;\r\n }\r\n\r\n set specularDetailRadius(val: number) {\r\n const next = this.clampRange(val ?? 0, 0, 4);\r\n if (next !== this._specularDetailRadius) {\r\n this._specularDetailRadius = next;\r\n this.markDirty();\r\n }\r\n }\r\n\r\n addChangeListener(listener: () => void) {\r\n this._changeListeners.add(listener);\r\n }\r\n\r\n /**\r\n * Removes a previously registered profile change listener.\r\n *\r\n * @param listener - The callback to remove.\r\n *\r\n * @public\r\n */\r\n removeChangeListener(listener: () => void) {\r\n this._changeListeners.delete(listener);\r\n }\r\n\r\n private static allocateSlot(profile: SubsurfaceProfile) {\r\n for (let i = 1; i < this._profiles.length; i++) {\r\n if (!this._profiles[i]) {\r\n this._profiles[i] = profile;\r\n this._version++;\r\n return i;\r\n }\r\n }\r\n throw new Error('SubsurfaceProfile limit exceeded');\r\n }\r\n\r\n private static releaseSlot(slot: number, profile: SubsurfaceProfile) {\r\n if (slot > 0 && slot < this._profiles.length && this._profiles[slot] === profile) {\r\n this._profiles[slot] = null;\r\n this._version++;\r\n }\r\n }\r\n\r\n private markDirty() {\r\n SubsurfaceProfile._version++;\r\n this._changeListeners.forEach((listener) => listener());\r\n }\r\n\r\n private static resolvePreset(preset: SubsurfaceProfilePreset | null | undefined) {\r\n return SUBSURFACE_PROFILE_PRESET_ALIAS[preset ?? 'skin_default'] ?? 'skin_default';\r\n }\r\n\r\n private static getPresetNameByIndex(index: number): CanonicalSubsurfaceProfilePreset {\r\n for (const [name, presetIndex] of Object.entries(SUBSURFACE_PROFILE_PRESET_INDEX) as Array<\r\n [CanonicalSubsurfaceProfilePreset, number]\r\n >) {\r\n if (presetIndex === index) {\r\n return name;\r\n }\r\n }\r\n return 'skin_default';\r\n }\r\n\r\n private applyPresetTemplate(preset: CanonicalSubsurfaceProfilePreset, markDirty = true) {\r\n const template =\r\n SUBSURFACE_PROFILE_PRESET_TEMPLATE[preset] ?? SUBSURFACE_PROFILE_PRESET_TEMPLATE.skin_default;\r\n this._meanFreePathColor.setXYZ(\r\n template.meanFreePathColor[0],\r\n template.meanFreePathColor[1],\r\n template.meanFreePathColor[2]\r\n );\r\n this._meanFreePathDistance = template.meanFreePathDistance;\r\n this._strength = template.strength;\r\n this._scale = template.scale;\r\n this._worldUnitScale = template.worldUnitScale;\r\n this._boundaryColorBleed = template.boundaryColorBleed;\r\n this._transmissionTintColor.setXYZ(\r\n template.transmissionTintColor[0],\r\n template.transmissionTintColor[1],\r\n template.transmissionTintColor[2]\r\n );\r\n this._extinctionScale = template.extinctionScale;\r\n this._normalScale = template.normalScale;\r\n this._scatteringDistribution = template.scatteringDistribution;\r\n this._specularDetailSoftness = template.specularDetailSoftness;\r\n this._specularDetailRadius = template.specularDetailRadius;\r\n this.syncScatterRadiusFromMeanFreePath(false);\r\n if (markDirty) {\r\n this.markDirty();\r\n }\r\n }\r\n\r\n private syncMeanFreePathFromScatterRadius(markDirty = true) {\r\n const maxRadius = Math.max(this._scatterRadius.x, this._scatterRadius.y, this._scatterRadius.z);\r\n if (maxRadius > 1e-5) {\r\n this._meanFreePathDistance = maxRadius;\r\n this._meanFreePathColor.setXYZ(\r\n this._scatterRadius.x / maxRadius,\r\n this._scatterRadius.y / maxRadius,\r\n this._scatterRadius.z / maxRadius\r\n );\r\n } else {\r\n this._meanFreePathDistance = 0;\r\n this._meanFreePathColor.setXYZ(0, 0, 0);\r\n }\r\n this.syncFalloffFromMeanFreePath(false);\r\n if (markDirty) {\r\n this.markDirty();\r\n }\r\n }\r\n\r\n private syncScatterRadiusFromMeanFreePath(markDirty = true) {\r\n const distance = Math.max(0, this._meanFreePathDistance);\r\n this._scatterRadius.setXYZ(\r\n Math.max(0, this._meanFreePathColor.x) * distance,\r\n Math.max(0, this._meanFreePathColor.y) * distance,\r\n Math.max(0, this._meanFreePathColor.z) * distance\r\n );\r\n this.syncFalloffFromMeanFreePath(false);\r\n if (markDirty) {\r\n this.markDirty();\r\n }\r\n }\r\n\r\n private syncFalloffFromMeanFreePath(markDirty = true) {\r\n const base =\r\n SUBSURFACE_PROFILE_PRESET_TEMPLATE[this._preset]?.falloffColor ??\r\n SUBSURFACE_PROFILE_PRESET_TEMPLATE.skin_default.falloffColor;\r\n const factors = this.getDerivedProfileFactors();\r\n const derivedG = this.clamp01(\r\n 0.12 +\r\n factors.meanFreePathColor[1] * 0.4 +\r\n factors.transmissionTintColor[1] * 0.12 +\r\n factors.distanceNorm * 0.05 +\r\n factors.scaleNorm * 0.05 +\r\n factors.distributionNorm * 0.05 -\r\n (1 - factors.extinctionSoftness) * 0.04\r\n );\r\n const derivedB = this.clamp01(\r\n 0.04 +\r\n factors.meanFreePathColor[2] * 0.32 +\r\n factors.transmissionTintColor[2] * 0.18 +\r\n factors.distanceNorm * 0.04 +\r\n factors.boundaryNorm * 0.05 +\r\n factors.coolBias * 0.08 -\r\n factors.warmBias * 0.04\r\n );\r\n const blend = this.clampRange(\r\n 0.24 + factors.distanceNorm * 0.16 + factors.scaleNorm * 0.12 + factors.strengthNorm * 0.08,\r\n 0.22,\r\n 0.82\r\n );\r\n this._falloffColor.setXYZ(\r\n 1,\r\n this.mixNumber(base[1], derivedG, blend),\r\n this.mixNumber(base[2], derivedB, blend)\r\n );\r\n if (markDirty) {\r\n this.markDirty();\r\n }\r\n }\r\n\r\n private getNormalizedTransmissionTintColor(): [number, number, number] {\r\n const maxChannel = Math.max(\r\n this._transmissionTintColor.x,\r\n this._transmissionTintColor.y,\r\n this._transmissionTintColor.z,\r\n 1e-5\r\n );\r\n return [\r\n Math.max(0, this._transmissionTintColor.x) / maxChannel,\r\n Math.max(0, this._transmissionTintColor.y) / maxChannel,\r\n Math.max(0, this._transmissionTintColor.z) / maxChannel\r\n ];\r\n }\r\n\r\n private getDerivedProfileFactors() {\r\n const meanFreePathColor = this.getNormalizedMeanFreePathColor();\r\n const transmissionTintColor = this.getNormalizedTransmissionTintColor();\r\n const maxRadius = Math.max(this._scatterRadius.x, this._scatterRadius.y, this._scatterRadius.z);\r\n const radiusNorm = this.clampRange(maxRadius / 1.35, 0, 1.5);\r\n const distanceNorm = this.clampRange(this._meanFreePathDistance / 1.25, 0, 1.5);\r\n const scaleNorm = this.clampRange(this._scale / 1.35, 0, 1.5);\r\n const strengthNorm = this.clampRange(this._strength / 1.2, 0, 1.5);\r\n const worldScaleNorm = this.clampRange(this._worldUnitScale / 1.25, 0, 1.5);\r\n const boundaryNorm = this.clamp01(this._boundaryColorBleed);\r\n const distributionNorm = this.clamp01(this._scatteringDistribution);\r\n const extinctionWeight = this.clampRange(1 / Math.max(this._extinctionScale, 0.35), 0.25, 1.35);\r\n const extinctionSoftness = this.clamp01((extinctionWeight - 0.25) / 1.1);\r\n const warmBias = this.clamp01(\r\n 0.5 +\r\n (meanFreePathColor[0] - Math.max(meanFreePathColor[1], meanFreePathColor[2]) * 0.72) * 0.95 +\r\n (transmissionTintColor[0] - Math.max(transmissionTintColor[1], transmissionTintColor[2]) * 0.78) * 0.7\r\n );\r\n const coolBias = this.clamp01(\r\n 0.32 +\r\n (transmissionTintColor[2] - transmissionTintColor[0] * 0.55) * 0.55 +\r\n (meanFreePathColor[2] - meanFreePathColor[0] * 0.65) * 0.45\r\n );\r\n return {\r\n meanFreePathColor,\r\n transmissionTintColor,\r\n radiusNorm,\r\n distanceNorm,\r\n scaleNorm,\r\n strengthNorm,\r\n worldScaleNorm,\r\n boundaryNorm,\r\n distributionNorm,\r\n extinctionSoftness,\r\n warmBias,\r\n coolBias\r\n };\r\n }\r\n\r\n private getNormalizedMeanFreePathColor(): [number, number, number] {\r\n const maxChannel = Math.max(\r\n this._meanFreePathColor.x,\r\n this._meanFreePathColor.y,\r\n this._meanFreePathColor.z,\r\n 1e-5\r\n );\r\n return [\r\n Math.max(0, this._meanFreePathColor.x) / maxChannel,\r\n Math.max(0, this._meanFreePathColor.y) / maxChannel,\r\n Math.max(0, this._meanFreePathColor.z) / maxChannel\r\n ];\r\n }\r\n\r\n private mixNumber(a: number, b: number, t: number) {\r\n return a * (1 - t) + b * t;\r\n }\r\n\r\n private clampRange(value: number, minValue: number, maxValue: number) {\r\n return Math.max(minValue, Math.min(maxValue, value));\r\n }\r\n\r\n private clamp01(value: number) {\r\n return Math.max(0, Math.min(1, value));\r\n }\r\n}\r\n"],"names":["SUBSURFACE_PROFILE_PRESET_ALIAS","skin","skin_thin","skin_default","skin_heavy_makeup","wax","wax_backlit","wax_soft","jade","jade_backlit","jade_soft","SUBSURFACE_PROFILE_PRESET_INDEX","SUBSURFACE_PROFILE_PRESET_TEMPLATE","meanFreePathColor","meanFreePathDistance","falloffColor","strength","scale","worldUnitScale","boundaryColorBleed","transmissionTintColor","extinctionScale","normalScale","scatteringDistribution","specularDetailSoftness","specularDetailRadius","SUBSURFACE_PROFILE_PRESET_TINT_BIAS","SUBSURFACE_PROFILE_PRESET_RESPONSE","SubsurfaceProfile","_maxProfiles","_profiles","Array","fill","_version","_defaultSkinProfile","_scatterRadius","_falloffColor","_meanFreePathColor","_transmissionTintColor","_preset","_meanFreePathDistance","_strength","_scale","_worldUnitScale","_boundaryColorBleed","_extinctionScale","_normalScale","_scatteringDistribution","_specularDetailSoftness","_specularDetailRadius","_slot","_changeListeners","_disposed","Vector3","Set","allocateSlot","applyPresetTemplate","clone","other","copyFrom","preset","dispose","clear","releaseSlot","version","getProfileBySlot","slot","length","getDefaultSkinProfile","getPresetTintBiasByIndex","index","getPresetNameByIndex","getPresetResponseByIndex","getDerivedTintBias","base","factors","getDerivedProfileFactors","derived","clamp01","warmBias","coolBias","boundaryNorm","distanceNorm","scaleNorm","blend","clampRange","radiusNorm","strengthNorm","mixNumber","getDerivedTransmissionResponse","distributionNorm","extinctionSoftness","worldScaleNorm","scatterRadius","val","equalsTo","set","syncMeanFreePathFromScatterRadius","markDirty","syncScatterRadiusFromMeanFreePath","next","Math","max","resolvePreset","presetIndex","addChangeListener","listener","add","removeChangeListener","delete","profile","i","Error","forEach","name","Object","entries","template","setXYZ","maxRadius","x","y","z","syncFalloffFromMeanFreePath","distance","derivedG","derivedB","getNormalizedTransmissionTintColor","maxChannel","getNormalizedMeanFreePathColor","extinctionWeight","a","b","t","value","minValue","maxValue","min"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"subsurfaceprofile.js","sources":["../../src/material/subsurfaceprofile.ts"],"sourcesContent":["import { Vector3, type Immutable } from '@zephyr3d/base';\r\n\r\n/**\r\n * Built-in subsurface scattering profile preset names.\r\n *\r\n * @remarks\r\n * The short aliases (`skin`, `wax`, and `jade`) resolve to their default\r\n * canonical profiles.\r\n *\r\n * @public\r\n */\r\nexport type SubsurfaceProfilePreset =\r\n | 'skin'\r\n | 'skin_thin'\r\n | 'skin_default'\r\n | 'skin_heavy_makeup'\r\n | 'wax'\r\n | 'wax_backlit'\r\n | 'wax_soft'\r\n | 'jade'\r\n | 'jade_backlit'\r\n | 'jade_soft';\r\n\r\ntype CanonicalSubsurfaceProfilePreset =\r\n | 'skin_thin'\r\n | 'skin_default'\r\n | 'skin_heavy_makeup'\r\n | 'wax_backlit'\r\n | 'wax_soft'\r\n | 'jade_backlit'\r\n | 'jade_soft';\r\n\r\ntype SubsurfaceProfilePresetTemplate = {\r\n meanFreePathColor: [number, number, number];\r\n meanFreePathDistance: number;\r\n falloffColor: [number, number, number];\r\n strength: number;\r\n scale: number;\r\n worldUnitScale: number;\r\n boundaryColorBleed: number;\r\n transmissionTintColor: [number, number, number];\r\n extinctionScale: number;\r\n normalScale: number;\r\n scatteringDistribution: number;\r\n specularDetailSoftness: number;\r\n specularDetailRadius: number;\r\n};\r\n\r\nconst SUBSURFACE_PROFILE_PRESET_ALIAS: Record<SubsurfaceProfilePreset, CanonicalSubsurfaceProfilePreset> = {\r\n skin: 'skin_default',\r\n skin_thin: 'skin_thin',\r\n skin_default: 'skin_default',\r\n skin_heavy_makeup: 'skin_heavy_makeup',\r\n wax: 'wax_backlit',\r\n wax_backlit: 'wax_backlit',\r\n wax_soft: 'wax_soft',\r\n jade: 'jade_soft',\r\n jade_backlit: 'jade_backlit',\r\n jade_soft: 'jade_soft'\r\n};\r\n\r\nconst SUBSURFACE_PROFILE_PRESET_INDEX: Record<CanonicalSubsurfaceProfilePreset, number> = {\r\n skin_thin: 0,\r\n skin_default: 1,\r\n skin_heavy_makeup: 2,\r\n wax_backlit: 3,\r\n wax_soft: 4,\r\n jade_backlit: 5,\r\n jade_soft: 6\r\n};\r\n\r\nconst SUBSURFACE_PROFILE_PRESET_TEMPLATE: Record<\r\n CanonicalSubsurfaceProfilePreset,\r\n SubsurfaceProfilePresetTemplate\r\n> = {\r\n skin_thin: {\r\n meanFreePathColor: [1.0, 0.37, 0.11],\r\n meanFreePathDistance: 0.7,\r\n falloffColor: [1.0, 0.32, 0.2],\r\n strength: 0.68,\r\n scale: 0.82,\r\n worldUnitScale: 0.88,\r\n boundaryColorBleed: 0.13,\r\n transmissionTintColor: [1, 0.37, 0.28],\r\n extinctionScale: 1.24,\r\n normalScale: 1.18,\r\n scatteringDistribution: 0.56,\r\n specularDetailSoftness: 0.66,\r\n specularDetailRadius: 1.35\r\n },\r\n skin_default: {\r\n meanFreePathColor: [1.0, 0.45, 0.17],\r\n meanFreePathDistance: 0.92,\r\n falloffColor: [1.0, 0.39, 0.25],\r\n strength: 0.82,\r\n scale: 0.96,\r\n worldUnitScale: 1,\r\n boundaryColorBleed: 0.22,\r\n transmissionTintColor: [1, 0.46, 0.34],\r\n extinctionScale: 1.06,\r\n normalScale: 1,\r\n scatteringDistribution: 0.6,\r\n specularDetailSoftness: 0.78,\r\n specularDetailRadius: 1.8\r\n },\r\n skin_heavy_makeup: {\r\n meanFreePathColor: [1.0, 0.33, 0.11],\r\n meanFreePathDistance: 0.68,\r\n falloffColor: [1.0, 0.26, 0.16],\r\n strength: 0.56,\r\n scale: 0.76,\r\n worldUnitScale: 0.84,\r\n boundaryColorBleed: 0.08,\r\n transmissionTintColor: [0.94, 0.31, 0.22],\r\n extinctionScale: 1.4,\r\n normalScale: 1.26,\r\n scatteringDistribution: 0.5,\r\n specularDetailSoftness: 0.86,\r\n specularDetailRadius: 2.1\r\n },\r\n wax_backlit: {\r\n meanFreePathColor: [1.0, 0.68, 0.36],\r\n meanFreePathDistance: 1.54,\r\n falloffColor: [1.0, 0.8, 0.66],\r\n strength: 1.12,\r\n scale: 1.42,\r\n worldUnitScale: 1.26,\r\n boundaryColorBleed: 0.42,\r\n transmissionTintColor: [1, 0.82, 0.7],\r\n extinctionScale: 0.78,\r\n normalScale: 0.92,\r\n scatteringDistribution: 0.82,\r\n specularDetailSoftness: 0.88,\r\n specularDetailRadius: 2.35\r\n },\r\n wax_soft: {\r\n meanFreePathColor: [1.0, 0.72, 0.38],\r\n meanFreePathDistance: 1.2,\r\n falloffColor: [1.0, 0.86, 0.74],\r\n strength: 1.02,\r\n scale: 1.28,\r\n worldUnitScale: 1.12,\r\n boundaryColorBleed: 0.36,\r\n transmissionTintColor: [1, 0.86, 0.74],\r\n extinctionScale: 0.86,\r\n normalScale: 0.98,\r\n scatteringDistribution: 0.74,\r\n specularDetailSoftness: 0.94,\r\n specularDetailRadius: 2.65\r\n },\r\n jade_backlit: {\r\n meanFreePathColor: [0.74, 1.0, 0.88],\r\n meanFreePathDistance: 0.92,\r\n falloffColor: [0.66, 0.94, 0.88],\r\n strength: 0.92,\r\n scale: 1.14,\r\n worldUnitScale: 1.06,\r\n boundaryColorBleed: 0.26,\r\n transmissionTintColor: [0.68, 0.92, 0.86],\r\n extinctionScale: 0.92,\r\n normalScale: 1.02,\r\n scatteringDistribution: 0.7,\r\n specularDetailSoftness: 0.42,\r\n specularDetailRadius: 1.2\r\n },\r\n jade_soft: {\r\n meanFreePathColor: [0.68, 1.0, 0.84],\r\n meanFreePathDistance: 0.8,\r\n falloffColor: [0.72, 0.94, 0.86],\r\n strength: 0.82,\r\n scale: 1.02,\r\n worldUnitScale: 0.98,\r\n boundaryColorBleed: 0.22,\r\n transmissionTintColor: [0.74, 0.96, 0.9],\r\n extinctionScale: 1,\r\n normalScale: 1.04,\r\n scatteringDistribution: 0.66,\r\n specularDetailSoftness: 0.5,\r\n specularDetailRadius: 1.4\r\n }\r\n};\r\n\r\nconst SUBSURFACE_PROFILE_PRESET_TINT_BIAS: Record<\r\n CanonicalSubsurfaceProfilePreset,\r\n [number, number, number]\r\n> = {\r\n skin_thin: [1, 0.56, 0.46],\r\n skin_default: [1, 0.62, 0.5],\r\n skin_heavy_makeup: [1, 0.5, 0.42],\r\n wax_backlit: [1, 0.8, 0.7],\r\n wax_soft: [1, 0.86, 0.78],\r\n jade_backlit: [0.72, 0.92, 0.96],\r\n jade_soft: [0.68, 0.96, 0.88]\r\n};\r\n\r\nconst SUBSURFACE_PROFILE_PRESET_RESPONSE: Record<\r\n CanonicalSubsurfaceProfilePreset,\r\n [number, number, number, number]\r\n> = {\r\n skin_thin: [0.08, 0.12, 0.06, 0.12],\r\n skin_default: [0.1, 0.14, 0.08, 0.16],\r\n skin_heavy_makeup: [0.02, 0.05, -0.02, 0.01],\r\n wax_backlit: [0.12, 0.2, 0.26, 0.24],\r\n wax_soft: [0.2, 0.3, 0.34, 0.1],\r\n jade_backlit: [0.08, 0.18, 0.2, 0.24],\r\n jade_soft: [0.16, 0.24, 0.22, 0.12]\r\n};\r\n\r\n/**\r\n * Serializable subsurface scattering profile.\r\n *\r\n * @remarks\r\n * The profile stores the channel-dependent scattering radius and falloff used\r\n * by the screen-space SSS post effect. Materials can share a profile instance\r\n * to emulate Unreal-style skin profile assets.\r\n *\r\n * @public\r\n */\r\nexport class SubsurfaceProfile {\r\n private static readonly _maxProfiles = 255;\r\n private static readonly _profiles: Array<SubsurfaceProfile | null> = new Array(\r\n SubsurfaceProfile._maxProfiles + 1\r\n ).fill(null);\r\n private static _version = 0;\r\n private static _defaultSSSProfile: SubsurfaceProfile | null = null;\r\n private readonly _scatterRadius: Vector3;\r\n private readonly _falloffColor: Vector3;\r\n private readonly _meanFreePathColor: Vector3;\r\n private readonly _transmissionTintColor: Vector3;\r\n private _preset: CanonicalSubsurfaceProfilePreset;\r\n private _meanFreePathDistance: number;\r\n private _strength: number;\r\n private _scale: number;\r\n private _worldUnitScale: number;\r\n private _boundaryColorBleed: number;\r\n private _extinctionScale: number;\r\n private _normalScale: number;\r\n private _scatteringDistribution: number;\r\n private _specularDetailSoftness: number;\r\n private _specularDetailRadius: number;\r\n private readonly _slot: number;\r\n private readonly _changeListeners: Set<() => void>;\r\n private _disposed: boolean;\r\n\r\n /**\r\n * Creates a subsurface scattering profile initialized with the default skin preset.\r\n *\r\n * @public\r\n */\r\n constructor() {\r\n this._scatterRadius = new Vector3(0, 0, 0);\r\n this._falloffColor = new Vector3(0, 0, 0);\r\n this._meanFreePathColor = new Vector3(0, 0, 0);\r\n this._transmissionTintColor = new Vector3(0, 0, 0);\r\n this._preset = 'skin_default';\r\n this._meanFreePathDistance = 0;\r\n this._strength = 0;\r\n this._scale = 0;\r\n this._worldUnitScale = 1;\r\n this._boundaryColorBleed = 0;\r\n this._extinctionScale = 1;\r\n this._normalScale = 1;\r\n this._scatteringDistribution = 0.65;\r\n this._specularDetailSoftness = 0.78;\r\n this._specularDetailRadius = 1.8;\r\n this._changeListeners = new Set();\r\n this._disposed = false;\r\n this._slot = SubsurfaceProfile.allocateSlot(this);\r\n this.applyPresetTemplate(this._preset, false);\r\n }\r\n\r\n clone() {\r\n const other = new SubsurfaceProfile();\r\n other.copyFrom(this);\r\n return other;\r\n }\r\n\r\n copyFrom(other: SubsurfaceProfile) {\r\n this.preset = other.preset;\r\n this.meanFreePathColor = other.meanFreePathColor;\r\n this.meanFreePathDistance = other.meanFreePathDistance;\r\n this.strength = other.strength;\r\n this.scale = other.scale;\r\n this.worldUnitScale = other.worldUnitScale;\r\n this.boundaryColorBleed = other.boundaryColorBleed;\r\n this.transmissionTintColor = other.transmissionTintColor;\r\n this.extinctionScale = other.extinctionScale;\r\n this.normalScale = other.normalScale;\r\n this.scatteringDistribution = other.scatteringDistribution;\r\n this.specularDetailSoftness = other.specularDetailSoftness;\r\n this.specularDetailRadius = other.specularDetailRadius;\r\n this.falloffColor = other.falloffColor;\r\n }\r\n\r\n dispose() {\r\n if (this._disposed) {\r\n return;\r\n }\r\n this._disposed = true;\r\n this._changeListeners.clear();\r\n SubsurfaceProfile.releaseSlot(this._slot, this);\r\n }\r\n\r\n static get version() {\r\n return this._version;\r\n }\r\n\r\n /**\r\n * Gets the profile assigned to a packed profile slot.\r\n *\r\n * @param slot - The 1-based profile slot index.\r\n * @returns The profile assigned to the slot, or `null` if the slot is invalid or unused.\r\n *\r\n * @public\r\n */\r\n static getProfileBySlot(slot: number) {\r\n return slot > 0 && slot < this._profiles.length ? this._profiles[slot] : null;\r\n }\r\n\r\n /**\r\n * Gets the shared default skin subsurface profile.\r\n *\r\n * @returns The lazily-created default skin profile.\r\n *\r\n * @public\r\n */\r\n static getDefaultSkinProfile() {\r\n if (!this._defaultSSSProfile) {\r\n this._defaultSSSProfile = new SubsurfaceProfile();\r\n }\r\n return this._defaultSSSProfile;\r\n }\r\n\r\n /**\r\n * Gets the preset tint bias used by the screen-space transmission model.\r\n *\r\n * @param index - The packed canonical preset index.\r\n * @returns The RGB tint bias for the preset, or white when the index is unknown.\r\n *\r\n * @public\r\n */\r\n static getPresetTintBiasByIndex(index: number) {\r\n return SUBSURFACE_PROFILE_PRESET_TINT_BIAS[this.getPresetNameByIndex(index)] ?? [1, 1, 1];\r\n }\r\n\r\n /**\r\n * Gets the preset transmission response used by the screen-space SSS pass.\r\n *\r\n * @param index - The packed canonical preset index.\r\n * @returns The four-component transmission response for the preset.\r\n *\r\n * @public\r\n */\r\n static getPresetResponseByIndex(index: number) {\r\n return SUBSURFACE_PROFILE_PRESET_RESPONSE[this.getPresetNameByIndex(index)] ?? [0, 0, 0, 0];\r\n }\r\n\r\n /**\r\n * Computes the effective tint bias from the preset and current profile settings.\r\n *\r\n * @returns The derived RGB tint bias used for transmission tinting.\r\n *\r\n * @public\r\n */\r\n getDerivedTintBias(): [number, number, number] {\r\n const base = SUBSURFACE_PROFILE_PRESET_TINT_BIAS[this._preset] ?? [1, 1, 1];\r\n const factors = this.getDerivedProfileFactors();\r\n const derived: [number, number, number] = [\r\n this.clamp01(0.78 + factors.warmBias * 0.26 - factors.coolBias * 0.16 + factors.boundaryNorm * 0.04),\r\n this.clamp01(\r\n 0.3 +\r\n factors.meanFreePathColor[1] * 0.24 +\r\n factors.transmissionTintColor[1] * 0.28 +\r\n factors.distanceNorm * 0.08 +\r\n factors.scaleNorm * 0.05 +\r\n factors.boundaryNorm * 0.08 +\r\n factors.coolBias * 0.06\r\n ),\r\n this.clamp01(\r\n 0.14 +\r\n factors.meanFreePathColor[2] * 0.22 +\r\n factors.transmissionTintColor[2] * 0.32 +\r\n factors.distanceNorm * 0.06 +\r\n factors.boundaryNorm * 0.06 +\r\n factors.coolBias * 0.12 -\r\n factors.warmBias * 0.06\r\n )\r\n ];\r\n const blend = this.clampRange(\r\n 0.26 + factors.radiusNorm * 0.16 + factors.scaleNorm * 0.1 + factors.strengthNorm * 0.08,\r\n 0.25,\r\n 0.88\r\n );\r\n return [\r\n this.mixNumber(base[0], derived[0], blend),\r\n this.mixNumber(base[1], derived[1], blend),\r\n this.mixNumber(base[2], derived[2], blend)\r\n ];\r\n }\r\n\r\n /**\r\n * Computes the effective transmission response from the preset and current profile settings.\r\n *\r\n * @returns The derived transmission response packed as four scalar channels.\r\n *\r\n * @public\r\n */\r\n getDerivedTransmissionResponse(): [number, number, number, number] {\r\n const base = SUBSURFACE_PROFILE_PRESET_RESPONSE[this._preset] ?? [0, 0, 0, 0];\r\n const factors = this.getDerivedProfileFactors();\r\n const blend = this.clampRange(\r\n 0.32 +\r\n factors.distanceNorm * 0.18 +\r\n factors.scaleNorm * 0.12 +\r\n factors.strengthNorm * 0.1 +\r\n factors.boundaryNorm * 0.06,\r\n 0.28,\r\n 0.9\r\n );\r\n const derived: [number, number, number, number] = [\r\n this.clampRange(\r\n -0.06 +\r\n factors.radiusNorm * 0.08 +\r\n factors.distanceNorm * 0.08 +\r\n factors.strengthNorm * 0.05 +\r\n factors.distributionNorm * 0.04 +\r\n factors.boundaryNorm * 0.05 +\r\n factors.extinctionSoftness * 0.03,\r\n -0.25,\r\n 0.45\r\n ),\r\n this.clampRange(\r\n 0.02 +\r\n factors.radiusNorm * 0.1 +\r\n factors.scaleNorm * 0.08 +\r\n factors.worldScaleNorm * 0.04 +\r\n factors.distributionNorm * 0.08 +\r\n factors.extinctionSoftness * 0.06,\r\n -0.25,\r\n 0.45\r\n ),\r\n this.clampRange(\r\n -0.08 +\r\n factors.strengthNorm * 0.12 +\r\n factors.scaleNorm * 0.08 +\r\n factors.extinctionSoftness * 0.12 +\r\n factors.boundaryNorm * 0.06 +\r\n factors.warmBias * 0.05 -\r\n factors.coolBias * 0.04,\r\n -0.25,\r\n 0.45\r\n ),\r\n this.clampRange(\r\n -0.02 +\r\n factors.radiusNorm * 0.12 +\r\n factors.scaleNorm * 0.08 +\r\n factors.strengthNorm * 0.06 +\r\n factors.boundaryNorm * 0.06 +\r\n factors.extinctionSoftness * 0.16 +\r\n factors.warmBias * 0.07 +\r\n factors.transmissionTintColor[0] * 0.04,\r\n -0.25,\r\n 0.5\r\n )\r\n ];\r\n return [\r\n this.clampRange(this.mixNumber(base[0], derived[0], blend), -0.25, 0.45),\r\n this.clampRange(this.mixNumber(base[1], derived[1], blend), -0.25, 0.45),\r\n this.clampRange(this.mixNumber(base[2], derived[2], blend), -0.25, 0.45),\r\n this.clampRange(this.mixNumber(base[3], derived[3], blend), -0.25, 0.5)\r\n ];\r\n }\r\n\r\n /**\r\n * Gets the 1-based profile slot used when encoding this profile into SSS buffers.\r\n *\r\n * @public\r\n */\r\n get slot() {\r\n return this._slot;\r\n }\r\n\r\n /**\r\n * Gets or sets the RGB scatter radius.\r\n *\r\n * @remarks\r\n * Assigning a radius also updates the mean-free-path authoring controls.\r\n *\r\n * @public\r\n */\r\n get scatterRadius(): Immutable<Vector3> {\r\n return this._scatterRadius;\r\n }\r\n\r\n set scatterRadius(val: Immutable<Vector3>) {\r\n if (!val.equalsTo(this._scatterRadius)) {\r\n this._scatterRadius.set(val);\r\n this.syncMeanFreePathFromScatterRadius();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the channel falloff color used by the diffusion kernel.\r\n *\r\n * @public\r\n */\r\n get falloffColor(): Immutable<Vector3> {\r\n return this._falloffColor;\r\n }\r\n\r\n set falloffColor(val: Immutable<Vector3>) {\r\n if (!val.equalsTo(this._falloffColor)) {\r\n this._falloffColor.set(val);\r\n this.markDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Mean free path color used to derive channel-dependent scatter radius.\r\n *\r\n * @public\r\n */\r\n get meanFreePathColor(): Immutable<Vector3> {\r\n return this._meanFreePathColor;\r\n }\r\n\r\n set meanFreePathColor(val: Immutable<Vector3>) {\r\n if (!val.equalsTo(this._meanFreePathColor)) {\r\n this._meanFreePathColor.set(val);\r\n this.syncScatterRadiusFromMeanFreePath();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the mean free path distance used to derive the absolute scatter radius.\r\n *\r\n * @public\r\n */\r\n get meanFreePathDistance() {\r\n return this._meanFreePathDistance;\r\n }\r\n\r\n set meanFreePathDistance(val: number) {\r\n const next = Math.max(0, val ?? 0);\r\n if (next !== this._meanFreePathDistance) {\r\n this._meanFreePathDistance = next;\r\n this.syncScatterRadiusFromMeanFreePath();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the active subsurface profile preset.\r\n *\r\n * @remarks\r\n * Assigning a preset applies its template values to the profile. Alias preset\r\n * names are resolved to their canonical preset.\r\n *\r\n * @public\r\n */\r\n get preset() {\r\n return this._preset;\r\n }\r\n\r\n set preset(val: SubsurfaceProfilePreset) {\r\n const next = SubsurfaceProfile.resolvePreset(val);\r\n if (next !== this._preset) {\r\n this._preset = next;\r\n this.applyPresetTemplate(next);\r\n }\r\n }\r\n\r\n /**\r\n * Gets the packed canonical preset index.\r\n *\r\n * @public\r\n */\r\n get presetIndex() {\r\n return SUBSURFACE_PROFILE_PRESET_INDEX[this._preset] ?? 0;\r\n }\r\n\r\n /**\r\n * Gets or sets the SSS strength multiplier.\r\n *\r\n * @public\r\n */\r\n get strength() {\r\n return this._strength;\r\n }\r\n\r\n set strength(val: number) {\r\n if (val !== this._strength) {\r\n this._strength = val;\r\n this.markDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the screen-space scatter width scale.\r\n *\r\n * @public\r\n */\r\n get scale() {\r\n return this._scale;\r\n }\r\n\r\n set scale(val: number) {\r\n if (val !== this._scale) {\r\n this._scale = val;\r\n this.markDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the world-unit scale used when converting profile radii.\r\n *\r\n * @public\r\n */\r\n get worldUnitScale() {\r\n return this._worldUnitScale;\r\n }\r\n\r\n set worldUnitScale(val: number) {\r\n const next = Math.max(0.05, val ?? 0.05);\r\n if (next !== this._worldUnitScale) {\r\n this._worldUnitScale = next;\r\n this.markDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the amount of color bleeding preserved near SSS boundaries.\r\n *\r\n * @remarks\r\n * Values are clamped to the `[0, 1]` range.\r\n *\r\n * @public\r\n */\r\n get boundaryColorBleed() {\r\n return this._boundaryColorBleed;\r\n }\r\n\r\n set boundaryColorBleed(val: number) {\r\n const next = this.clamp01(val ?? 0);\r\n if (next !== this._boundaryColorBleed) {\r\n this._boundaryColorBleed = next;\r\n this.markDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the RGB tint applied to transmitted subsurface light.\r\n *\r\n * @public\r\n */\r\n get transmissionTintColor(): Immutable<Vector3> {\r\n return this._transmissionTintColor;\r\n }\r\n\r\n set transmissionTintColor(val: Immutable<Vector3>) {\r\n if (!val.equalsTo(this._transmissionTintColor)) {\r\n this._transmissionTintColor.set(val);\r\n this.markDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the extinction multiplier used by transmission attenuation.\r\n *\r\n * @remarks\r\n * Values are clamped to zero or greater.\r\n *\r\n * @public\r\n */\r\n get extinctionScale() {\r\n return this._extinctionScale;\r\n }\r\n\r\n set extinctionScale(val: number) {\r\n const next = Math.max(0, val ?? 0);\r\n if (next !== this._extinctionScale) {\r\n this._extinctionScale = next;\r\n this.markDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the normal sensitivity scale used by SSS filtering.\r\n *\r\n * @remarks\r\n * Values are clamped to zero or greater.\r\n *\r\n * @public\r\n */\r\n get normalScale() {\r\n return this._normalScale;\r\n }\r\n\r\n set normalScale(val: number) {\r\n const next = Math.max(0, val ?? 0);\r\n if (next !== this._normalScale) {\r\n this._normalScale = next;\r\n this.markDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the scattering distribution blend.\r\n *\r\n * @remarks\r\n * Values are clamped to the `[0, 1]` range.\r\n *\r\n * @public\r\n */\r\n get scatteringDistribution() {\r\n return this._scatteringDistribution;\r\n }\r\n\r\n set scatteringDistribution(val: number) {\r\n const next = this.clamp01(val ?? 0);\r\n if (next !== this._scatteringDistribution) {\r\n this._scatteringDistribution = next;\r\n this.markDirty();\r\n }\r\n }\r\n\r\n /** Strength of the screen-space filter applied to normal-driven specular detail. */\r\n get specularDetailSoftness() {\r\n return this._specularDetailSoftness;\r\n }\r\n\r\n set specularDetailSoftness(val: number) {\r\n const next = this.clamp01(val ?? 0);\r\n if (next !== this._specularDetailSoftness) {\r\n this._specularDetailSoftness = next;\r\n this.markDirty();\r\n }\r\n }\r\n\r\n /** Radius in screen pixels used to soften normal-driven specular detail. */\r\n get specularDetailRadius() {\r\n return this._specularDetailRadius;\r\n }\r\n\r\n set specularDetailRadius(val: number) {\r\n const next = this.clampRange(val ?? 0, 0, 4);\r\n if (next !== this._specularDetailRadius) {\r\n this._specularDetailRadius = next;\r\n this.markDirty();\r\n }\r\n }\r\n\r\n addChangeListener(listener: () => void) {\r\n this._changeListeners.add(listener);\r\n }\r\n\r\n /**\r\n * Removes a previously registered profile change listener.\r\n *\r\n * @param listener - The callback to remove.\r\n *\r\n * @public\r\n */\r\n removeChangeListener(listener: () => void) {\r\n this._changeListeners.delete(listener);\r\n }\r\n\r\n private static allocateSlot(profile: SubsurfaceProfile) {\r\n for (let i = 1; i < this._profiles.length; i++) {\r\n if (!this._profiles[i]) {\r\n this._profiles[i] = profile;\r\n this._version++;\r\n return i;\r\n }\r\n }\r\n throw new Error('SubsurfaceProfile limit exceeded');\r\n }\r\n\r\n private static releaseSlot(slot: number, profile: SubsurfaceProfile) {\r\n if (slot > 0 && slot < this._profiles.length && this._profiles[slot] === profile) {\r\n this._profiles[slot] = null;\r\n this._version++;\r\n }\r\n }\r\n\r\n private markDirty() {\r\n SubsurfaceProfile._version++;\r\n this._changeListeners.forEach((listener) => listener());\r\n }\r\n\r\n private static resolvePreset(preset: SubsurfaceProfilePreset | null | undefined) {\r\n return SUBSURFACE_PROFILE_PRESET_ALIAS[preset ?? 'skin_default'] ?? 'skin_default';\r\n }\r\n\r\n private static getPresetNameByIndex(index: number): CanonicalSubsurfaceProfilePreset {\r\n for (const [name, presetIndex] of Object.entries(SUBSURFACE_PROFILE_PRESET_INDEX) as Array<\r\n [CanonicalSubsurfaceProfilePreset, number]\r\n >) {\r\n if (presetIndex === index) {\r\n return name;\r\n }\r\n }\r\n return 'skin_default';\r\n }\r\n\r\n private applyPresetTemplate(preset: CanonicalSubsurfaceProfilePreset, markDirty = true) {\r\n const template =\r\n SUBSURFACE_PROFILE_PRESET_TEMPLATE[preset] ?? SUBSURFACE_PROFILE_PRESET_TEMPLATE.skin_default;\r\n this._meanFreePathColor.setXYZ(\r\n template.meanFreePathColor[0],\r\n template.meanFreePathColor[1],\r\n template.meanFreePathColor[2]\r\n );\r\n this._meanFreePathDistance = template.meanFreePathDistance;\r\n this._strength = template.strength;\r\n this._scale = template.scale;\r\n this._worldUnitScale = template.worldUnitScale;\r\n this._boundaryColorBleed = template.boundaryColorBleed;\r\n this._transmissionTintColor.setXYZ(\r\n template.transmissionTintColor[0],\r\n template.transmissionTintColor[1],\r\n template.transmissionTintColor[2]\r\n );\r\n this._extinctionScale = template.extinctionScale;\r\n this._normalScale = template.normalScale;\r\n this._scatteringDistribution = template.scatteringDistribution;\r\n this._specularDetailSoftness = template.specularDetailSoftness;\r\n this._specularDetailRadius = template.specularDetailRadius;\r\n this.syncScatterRadiusFromMeanFreePath(false);\r\n if (markDirty) {\r\n this.markDirty();\r\n }\r\n }\r\n\r\n private syncMeanFreePathFromScatterRadius(markDirty = true) {\r\n const maxRadius = Math.max(this._scatterRadius.x, this._scatterRadius.y, this._scatterRadius.z);\r\n if (maxRadius > 1e-5) {\r\n this._meanFreePathDistance = maxRadius;\r\n this._meanFreePathColor.setXYZ(\r\n this._scatterRadius.x / maxRadius,\r\n this._scatterRadius.y / maxRadius,\r\n this._scatterRadius.z / maxRadius\r\n );\r\n } else {\r\n this._meanFreePathDistance = 0;\r\n this._meanFreePathColor.setXYZ(0, 0, 0);\r\n }\r\n this.syncFalloffFromMeanFreePath(false);\r\n if (markDirty) {\r\n this.markDirty();\r\n }\r\n }\r\n\r\n private syncScatterRadiusFromMeanFreePath(markDirty = true) {\r\n const distance = Math.max(0, this._meanFreePathDistance);\r\n this._scatterRadius.setXYZ(\r\n Math.max(0, this._meanFreePathColor.x) * distance,\r\n Math.max(0, this._meanFreePathColor.y) * distance,\r\n Math.max(0, this._meanFreePathColor.z) * distance\r\n );\r\n this.syncFalloffFromMeanFreePath(false);\r\n if (markDirty) {\r\n this.markDirty();\r\n }\r\n }\r\n\r\n private syncFalloffFromMeanFreePath(markDirty = true) {\r\n const base =\r\n SUBSURFACE_PROFILE_PRESET_TEMPLATE[this._preset]?.falloffColor ??\r\n SUBSURFACE_PROFILE_PRESET_TEMPLATE.skin_default.falloffColor;\r\n const factors = this.getDerivedProfileFactors();\r\n const derivedG = this.clamp01(\r\n 0.12 +\r\n factors.meanFreePathColor[1] * 0.4 +\r\n factors.transmissionTintColor[1] * 0.12 +\r\n factors.distanceNorm * 0.05 +\r\n factors.scaleNorm * 0.05 +\r\n factors.distributionNorm * 0.05 -\r\n (1 - factors.extinctionSoftness) * 0.04\r\n );\r\n const derivedB = this.clamp01(\r\n 0.04 +\r\n factors.meanFreePathColor[2] * 0.32 +\r\n factors.transmissionTintColor[2] * 0.18 +\r\n factors.distanceNorm * 0.04 +\r\n factors.boundaryNorm * 0.05 +\r\n factors.coolBias * 0.08 -\r\n factors.warmBias * 0.04\r\n );\r\n const blend = this.clampRange(\r\n 0.24 + factors.distanceNorm * 0.16 + factors.scaleNorm * 0.12 + factors.strengthNorm * 0.08,\r\n 0.22,\r\n 0.82\r\n );\r\n this._falloffColor.setXYZ(\r\n 1,\r\n this.mixNumber(base[1], derivedG, blend),\r\n this.mixNumber(base[2], derivedB, blend)\r\n );\r\n if (markDirty) {\r\n this.markDirty();\r\n }\r\n }\r\n\r\n private getNormalizedTransmissionTintColor(): [number, number, number] {\r\n const maxChannel = Math.max(\r\n this._transmissionTintColor.x,\r\n this._transmissionTintColor.y,\r\n this._transmissionTintColor.z,\r\n 1e-5\r\n );\r\n return [\r\n Math.max(0, this._transmissionTintColor.x) / maxChannel,\r\n Math.max(0, this._transmissionTintColor.y) / maxChannel,\r\n Math.max(0, this._transmissionTintColor.z) / maxChannel\r\n ];\r\n }\r\n\r\n private getDerivedProfileFactors() {\r\n const meanFreePathColor = this.getNormalizedMeanFreePathColor();\r\n const transmissionTintColor = this.getNormalizedTransmissionTintColor();\r\n const maxRadius = Math.max(this._scatterRadius.x, this._scatterRadius.y, this._scatterRadius.z);\r\n const radiusNorm = this.clampRange(maxRadius / 1.35, 0, 1.5);\r\n const distanceNorm = this.clampRange(this._meanFreePathDistance / 1.25, 0, 1.5);\r\n const scaleNorm = this.clampRange(this._scale / 1.35, 0, 1.5);\r\n const strengthNorm = this.clampRange(this._strength / 1.2, 0, 1.5);\r\n const worldScaleNorm = this.clampRange(this._worldUnitScale / 1.25, 0, 1.5);\r\n const boundaryNorm = this.clamp01(this._boundaryColorBleed);\r\n const distributionNorm = this.clamp01(this._scatteringDistribution);\r\n const extinctionWeight = this.clampRange(1 / Math.max(this._extinctionScale, 0.35), 0.25, 1.35);\r\n const extinctionSoftness = this.clamp01((extinctionWeight - 0.25) / 1.1);\r\n const warmBias = this.clamp01(\r\n 0.5 +\r\n (meanFreePathColor[0] - Math.max(meanFreePathColor[1], meanFreePathColor[2]) * 0.72) * 0.95 +\r\n (transmissionTintColor[0] - Math.max(transmissionTintColor[1], transmissionTintColor[2]) * 0.78) * 0.7\r\n );\r\n const coolBias = this.clamp01(\r\n 0.32 +\r\n (transmissionTintColor[2] - transmissionTintColor[0] * 0.55) * 0.55 +\r\n (meanFreePathColor[2] - meanFreePathColor[0] * 0.65) * 0.45\r\n );\r\n return {\r\n meanFreePathColor,\r\n transmissionTintColor,\r\n radiusNorm,\r\n distanceNorm,\r\n scaleNorm,\r\n strengthNorm,\r\n worldScaleNorm,\r\n boundaryNorm,\r\n distributionNorm,\r\n extinctionSoftness,\r\n warmBias,\r\n coolBias\r\n };\r\n }\r\n\r\n private getNormalizedMeanFreePathColor(): [number, number, number] {\r\n const maxChannel = Math.max(\r\n this._meanFreePathColor.x,\r\n this._meanFreePathColor.y,\r\n this._meanFreePathColor.z,\r\n 1e-5\r\n );\r\n return [\r\n Math.max(0, this._meanFreePathColor.x) / maxChannel,\r\n Math.max(0, this._meanFreePathColor.y) / maxChannel,\r\n Math.max(0, this._meanFreePathColor.z) / maxChannel\r\n ];\r\n }\r\n\r\n private mixNumber(a: number, b: number, t: number) {\r\n return a * (1 - t) + b * t;\r\n }\r\n\r\n private clampRange(value: number, minValue: number, maxValue: number) {\r\n return Math.max(minValue, Math.min(maxValue, value));\r\n }\r\n\r\n private clamp01(value: number) {\r\n return Math.max(0, Math.min(1, value));\r\n }\r\n}\r\n"],"names":["SUBSURFACE_PROFILE_PRESET_ALIAS","skin","skin_thin","skin_default","skin_heavy_makeup","wax","wax_backlit","wax_soft","jade","jade_backlit","jade_soft","SUBSURFACE_PROFILE_PRESET_INDEX","SUBSURFACE_PROFILE_PRESET_TEMPLATE","meanFreePathColor","meanFreePathDistance","falloffColor","strength","scale","worldUnitScale","boundaryColorBleed","transmissionTintColor","extinctionScale","normalScale","scatteringDistribution","specularDetailSoftness","specularDetailRadius","SUBSURFACE_PROFILE_PRESET_TINT_BIAS","SUBSURFACE_PROFILE_PRESET_RESPONSE","SubsurfaceProfile","_maxProfiles","_profiles","Array","fill","_version","_defaultSSSProfile","_scatterRadius","_falloffColor","_meanFreePathColor","_transmissionTintColor","_preset","_meanFreePathDistance","_strength","_scale","_worldUnitScale","_boundaryColorBleed","_extinctionScale","_normalScale","_scatteringDistribution","_specularDetailSoftness","_specularDetailRadius","_slot","_changeListeners","_disposed","Vector3","Set","allocateSlot","applyPresetTemplate","clone","other","copyFrom","preset","dispose","clear","releaseSlot","version","getProfileBySlot","slot","length","getDefaultSkinProfile","getPresetTintBiasByIndex","index","getPresetNameByIndex","getPresetResponseByIndex","getDerivedTintBias","base","factors","getDerivedProfileFactors","derived","clamp01","warmBias","coolBias","boundaryNorm","distanceNorm","scaleNorm","blend","clampRange","radiusNorm","strengthNorm","mixNumber","getDerivedTransmissionResponse","distributionNorm","extinctionSoftness","worldScaleNorm","scatterRadius","val","equalsTo","set","syncMeanFreePathFromScatterRadius","markDirty","syncScatterRadiusFromMeanFreePath","next","Math","max","resolvePreset","presetIndex","addChangeListener","listener","add","removeChangeListener","delete","profile","i","Error","forEach","name","Object","entries","template","setXYZ","maxRadius","x","y","z","syncFalloffFromMeanFreePath","distance","derivedG","derivedB","getNormalizedTransmissionTintColor","maxChannel","getNormalizedMeanFreePathColor","extinctionWeight","a","b","t","value","minValue","maxValue","min"],"mappings":"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"}
|