@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
|
@@ -1,55 +1,216 @@
|
|
|
1
|
+
/** Number of splat mask vectors for `numLayers` detail layers, 4 weights each */ function terrainSplatMaskCount(numLayers) {
|
|
2
|
+
return numLayers + 3 >> 2;
|
|
3
|
+
}
|
|
4
|
+
/** Splat weight of a layer */ function weight(masks, layer) {
|
|
5
|
+
return masks[layer >> 2][layer & 3];
|
|
6
|
+
}
|
|
7
|
+
function useHex(hex, grad, layer) {
|
|
8
|
+
return !!hex && !!grad && (hex.mask & 1 << layer) !== 0;
|
|
9
|
+
}
|
|
10
|
+
function terrainHexTile(scope, prefix, coord, rotationAmount, scaleAmount) {
|
|
11
|
+
const pb = scope.$builder;
|
|
12
|
+
pb.func('zTerrainHexHash', [
|
|
13
|
+
pb.vec2('p')
|
|
14
|
+
], function() {
|
|
15
|
+
// https://www.shadertoy.com/view/4djSRW, mx_hextile_hash
|
|
16
|
+
this.$l.p3 = pb.fract(pb.mul(pb.vec3(this.p.x, this.p.y, this.p.x), pb.vec3(0.1031, 0.103, 0.0973)));
|
|
17
|
+
this.p3 = pb.add(this.p3, pb.vec3(pb.dot(this.p3, pb.add(this.p3.yzx, pb.vec3(33.33)))));
|
|
18
|
+
this.$return(pb.fract(pb.mul(pb.add(this.p3.xx, this.p3.yz), this.p3.zy)));
|
|
19
|
+
});
|
|
20
|
+
pb.func('zTerrainHexTile', [
|
|
21
|
+
pb.vec2('coord'),
|
|
22
|
+
pb.float('rotation'),
|
|
23
|
+
pb.float('scale'),
|
|
24
|
+
pb.vec2('c1').out(),
|
|
25
|
+
pb.vec2('c2').out(),
|
|
26
|
+
pb.vec2('c3').out(),
|
|
27
|
+
pb.vec3('w').out(),
|
|
28
|
+
pb.vec3('r').out(),
|
|
29
|
+
pb.vec3('s').out()
|
|
30
|
+
], function() {
|
|
31
|
+
const sqrt3x2 = Math.sqrt(3) * 2;
|
|
32
|
+
// scale to keep the original fit, then skew into the simplex triangle grid
|
|
33
|
+
// (GLSL mat2(1, 0, -0.57735027, 1.15470054) * st)
|
|
34
|
+
this.$l.st = pb.mul(this.coord, sqrt3x2);
|
|
35
|
+
this.$l.skewed = pb.vec2(pb.sub(this.st.x, pb.mul(this.st.y, 0.57735027)), pb.mul(this.st.y, 1.15470054));
|
|
36
|
+
this.$l.f = pb.fract(this.skewed);
|
|
37
|
+
this.$l.z = pb.sub(pb.sub(1, this.f.x), this.f.y);
|
|
38
|
+
this.$l.sv = pb.step(0, pb.neg(this.z));
|
|
39
|
+
this.$l.s2 = pb.sub(pb.mul(this.sv, 2), 1);
|
|
40
|
+
this.w = pb.vec3(pb.mul(pb.neg(this.z), this.s2), pb.sub(this.sv, pb.mul(this.f.y, this.s2)), pb.sub(this.sv, pb.mul(this.f.x, this.s2)));
|
|
41
|
+
// vertex ids and hexagon centres (GLSL mat2(1, 0, 0.5, 1 / 1.15470054) * id)
|
|
42
|
+
this.$l.base = pb.floor(this.skewed);
|
|
43
|
+
this.$l.id1 = pb.add(this.base, pb.vec2(this.sv, this.sv));
|
|
44
|
+
this.$l.id2 = pb.add(this.base, pb.vec2(this.sv, pb.sub(1, this.sv)));
|
|
45
|
+
this.$l.id3 = pb.add(this.base, pb.vec2(pb.sub(1, this.sv), this.sv));
|
|
46
|
+
const centre = (id)=>pb.div(pb.vec2(pb.add(id.x, pb.mul(id.y, 0.5)), pb.div(id.y, 1.15470054)), sqrt3x2);
|
|
47
|
+
this.$l.ctr1 = centre(this.id1);
|
|
48
|
+
this.$l.ctr2 = centre(this.id2);
|
|
49
|
+
this.$l.ctr3 = centre(this.id3);
|
|
50
|
+
this.$l.rand1 = this.zTerrainHexHash(pb.add(this.id1, pb.vec2(0.12345)));
|
|
51
|
+
this.$l.rand2 = this.zTerrainHexHash(pb.add(this.id2, pb.vec2(0.12345)));
|
|
52
|
+
this.$l.rand3 = this.zTerrainHexHash(pb.add(this.id3, pb.vec2(0.12345)));
|
|
53
|
+
// rotation range 0..360 degrees, scale range 0.5..2, offset range 0..1 at amount 1
|
|
54
|
+
this.$l.rv = pb.mul(pb.vec3(this.rand1.x, this.rand2.x, this.rand3.x), pb.mul(this.rotation, Math.PI * 2));
|
|
55
|
+
this.$l.sv3 = pb.mix(pb.vec3(1), pb.mix(pb.vec3(0.5), pb.vec3(2), pb.vec3(this.rand1.y, this.rand2.y, this.rand3.y)), pb.vec3(this.scale));
|
|
56
|
+
// ((coord - ctr) * rm / scale) + ctr + offset; GLSL v * mat2(c, -s, s, c) rotates v by +r
|
|
57
|
+
const rotate = (v, r)=>pb.vec2(pb.sub(pb.mul(v.x, pb.cos(r)), pb.mul(v.y, pb.sin(r))), pb.add(pb.mul(v.x, pb.sin(r)), pb.mul(v.y, pb.cos(r))));
|
|
58
|
+
this.c1 = pb.add(pb.add(pb.div(rotate(pb.sub(this.coord, this.ctr1), this.rv.x), this.sv3.x), this.ctr1), this.rand1);
|
|
59
|
+
this.c2 = pb.add(pb.add(pb.div(rotate(pb.sub(this.coord, this.ctr2), this.rv.y), this.sv3.y), this.ctr2), this.rand2);
|
|
60
|
+
this.c3 = pb.add(pb.add(pb.div(rotate(pb.sub(this.coord, this.ctr3), this.rv.z), this.sv3.z), this.ctr3), this.rand3);
|
|
61
|
+
this.r = this.rv;
|
|
62
|
+
this.s = this.sv3;
|
|
63
|
+
});
|
|
64
|
+
for (const name of [
|
|
65
|
+
'C1',
|
|
66
|
+
'C2',
|
|
67
|
+
'C3'
|
|
68
|
+
]){
|
|
69
|
+
scope.$l[`${prefix}${name}`] = pb.vec2();
|
|
70
|
+
}
|
|
71
|
+
for (const name of [
|
|
72
|
+
'W',
|
|
73
|
+
'R',
|
|
74
|
+
'S'
|
|
75
|
+
]){
|
|
76
|
+
scope.$l[`${prefix}${name}`] = pb.vec3();
|
|
77
|
+
}
|
|
78
|
+
pb.getGlobalScope().zTerrainHexTile(coord, rotationAmount, scaleAmount, scope[`${prefix}C1`], scope[`${prefix}C2`], scope[`${prefix}C3`], scope[`${prefix}W`], scope[`${prefix}R`], scope[`${prefix}S`]);
|
|
79
|
+
}
|
|
80
|
+
/** Rotates a 2D vector by `r` radians, counter clockwise */ function rotate2(scope, v, r) {
|
|
81
|
+
const pb = scope.$builder;
|
|
82
|
+
return pb.vec2(pb.sub(pb.mul(v.x, pb.cos(r)), pb.mul(v.y, pb.sin(r))), pb.add(pb.mul(v.x, pb.sin(r)), pb.mul(v.y, pb.cos(r))));
|
|
83
|
+
}
|
|
1
84
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
85
|
+
* The three hex tiling samples of a layer: the gradients follow each sample's rotation and scale
|
|
86
|
+
* (mx_hextile_coord ddx1..3), so the mip is chosen from the continuous coordinate and the jumps
|
|
87
|
+
* at hexagon edges do not show.
|
|
88
|
+
*/ function sampleHexTiled(scope, prefix, layer, sample, ddx, ddy) {
|
|
89
|
+
const pb = scope.$builder;
|
|
90
|
+
return [
|
|
91
|
+
1,
|
|
92
|
+
2,
|
|
93
|
+
3
|
|
94
|
+
].map((k)=>{
|
|
95
|
+
const comp = [
|
|
96
|
+
'x',
|
|
97
|
+
'y',
|
|
98
|
+
'z'
|
|
99
|
+
][k - 1];
|
|
100
|
+
const r = scope[`${prefix}R`][comp];
|
|
101
|
+
const s = scope[`${prefix}S`][comp];
|
|
102
|
+
return sample(scope, layer, scope[`${prefix}C${k}`], pb.div(rotate2(scope, ddx, r), s), pb.div(rotate2(scope, ddy, r), s));
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
/** Blend weights of the three samples: pow(barycentric, 7), normalized (mx_hextiledimage) */ function hexWeights(scope, prefix, colorWeights) {
|
|
17
106
|
const pb = scope.$builder;
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
masks.push(scope[`${namePrefix}${i}`]);
|
|
107
|
+
let w = pb.pow(scope[`${prefix}W`], pb.vec3(7));
|
|
108
|
+
if (colorWeights) {
|
|
109
|
+
w = pb.mul(colorWeights, w);
|
|
22
110
|
}
|
|
23
|
-
|
|
111
|
+
scope.$l[`${prefix}BW`] = w;
|
|
112
|
+
return pb.div(scope[`${prefix}BW`], pb.dot(scope[`${prefix}BW`], pb.vec3(1)));
|
|
24
113
|
}
|
|
25
114
|
/**
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
115
|
+
* Albedo: the layers weighted by the splat masks. Weights are not normalized, uncovered area
|
|
116
|
+
* stays black.
|
|
117
|
+
* @param detailParams - Per layer (uv scale, roughness, 0, 0)
|
|
118
|
+
* @param grad - Gradients of `uv`; required for hex tiled layers, which are sampled flat otherwise
|
|
119
|
+
*/ function blendTerrainAlbedo(scope, numLayers, masks, uv, detailParams, sampleAlbedo, grad = null, hex = null) {
|
|
120
|
+
const pb = scope.$builder;
|
|
121
|
+
let color = pb.vec3(0);
|
|
122
|
+
for(let i = 0; i < numLayers; i++){
|
|
123
|
+
const tiling = detailParams.at(i).x;
|
|
124
|
+
const coord = pb.mul(uv, tiling);
|
|
125
|
+
const ddx = grad ? pb.mul(grad.ddx, tiling) : null;
|
|
126
|
+
const ddy = grad ? pb.mul(grad.ddy, tiling) : null;
|
|
127
|
+
let sample;
|
|
128
|
+
if (useHex(hex, grad, i)) {
|
|
129
|
+
const prefix = `zHexA${i}`;
|
|
130
|
+
const p = hex.params.at(i);
|
|
131
|
+
terrainHexTile(scope, prefix, coord, p.x, p.y);
|
|
132
|
+
const [c1, c2, c3] = sampleHexTiled(scope, prefix, i, sampleAlbedo, ddx, ddy).map((c)=>c.rgb);
|
|
133
|
+
scope.$l[`${prefix}A1`] = c1;
|
|
134
|
+
scope.$l[`${prefix}A2`] = c2;
|
|
135
|
+
scope.$l[`${prefix}A3`] = c3;
|
|
136
|
+
// Luminance as weights, mix(1, luma, contrast); Rec.709 coefficients for our linear
|
|
137
|
+
// working space (one of mx_hextiledimage's lumacoeffs choices)
|
|
138
|
+
const luma = pb.vec3(0.2126, 0.7152, 0.0722);
|
|
139
|
+
const cw = pb.mix(pb.vec3(1), pb.vec3(pb.dot(scope[`${prefix}A1`], luma), pb.dot(scope[`${prefix}A2`], luma), pb.dot(scope[`${prefix}A3`], luma)), pb.vec3(p.z));
|
|
140
|
+
scope.$l[`${prefix}NW`] = hexWeights(scope, prefix, cw);
|
|
141
|
+
const w = scope[`${prefix}NW`];
|
|
142
|
+
sample = pb.add(pb.add(pb.mul(scope[`${prefix}A1`], w.x), pb.mul(scope[`${prefix}A2`], w.y)), pb.mul(scope[`${prefix}A3`], w.z));
|
|
143
|
+
} else {
|
|
144
|
+
sample = sampleAlbedo(scope, i, coord, ddx, ddy).rgb;
|
|
145
|
+
}
|
|
146
|
+
color = pb.add(color, pb.mul(sample, weight(masks, i)));
|
|
147
|
+
}
|
|
148
|
+
return color;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Tangent space detail normal: the decoded layer normals weighted by the splat masks, not
|
|
152
|
+
* normalized.
|
|
42
153
|
*
|
|
43
|
-
*
|
|
44
|
-
|
|
154
|
+
* A hex tiled layer blends its three samples as mx_hextilednormalmap: each normal turned with
|
|
155
|
+
* its sample, then combined as surface gradients (Mikkelsen, Surface Gradient Based Bump Mapping
|
|
156
|
+
* Framework, JCGT 9(3), 2020; mx_gradient_blend_3_normals), which with the tangent space normal
|
|
157
|
+
* (0, 0, 1) reduces to normalize(sum(w * n.xy / |n.z|), 1). The turn is the inverse of the
|
|
158
|
+
* sample's coordinate rotation: sampling at R(r) p shows the texture turned by -r on the
|
|
159
|
+
* surface, and its normals with it. (MaterialX writes mx_axis_rotation_matrix row by row into a
|
|
160
|
+
* column major GLSL mat3, which turns them the other way.)
|
|
161
|
+
* @param sampleNormal - Returns the raw rgb of the layer's normal map
|
|
162
|
+
*/ function blendTerrainDetailNormal(scope, numLayers, masks, uv, detailParams, sampleNormal, grad = null, hex = null) {
|
|
163
|
+
const pb = scope.$builder;
|
|
164
|
+
let normal = pb.vec3(0);
|
|
165
|
+
const decode = (raw)=>pb.normalize(pb.sub(pb.mul(raw, 2), pb.vec3(1)));
|
|
166
|
+
for(let i = 0; i < numLayers; i++){
|
|
167
|
+
const tiling = detailParams.at(i).x;
|
|
168
|
+
const coord = pb.mul(uv, tiling);
|
|
169
|
+
const ddx = grad ? pb.mul(grad.ddx, tiling) : null;
|
|
170
|
+
const ddy = grad ? pb.mul(grad.ddy, tiling) : null;
|
|
171
|
+
let decoded;
|
|
172
|
+
if (useHex(hex, grad, i)) {
|
|
173
|
+
const prefix = `zHexN${i}`;
|
|
174
|
+
const p = hex.params.at(i);
|
|
175
|
+
terrainHexTile(scope, prefix, coord, p.x, p.y);
|
|
176
|
+
const samples = sampleHexTiled(scope, prefix, i, sampleNormal, ddx, ddy);
|
|
177
|
+
const comps = [
|
|
178
|
+
'x',
|
|
179
|
+
'y',
|
|
180
|
+
'z'
|
|
181
|
+
];
|
|
182
|
+
samples.forEach((raw, k)=>{
|
|
183
|
+
scope.$l[`${prefix}N${k}`] = decode(raw.rgb);
|
|
184
|
+
const n = scope[`${prefix}N${k}`];
|
|
185
|
+
const xy = rotate2(scope, n.xy, pb.neg(scope[`${prefix}R`][comps[k]]));
|
|
186
|
+
// surface gradient of the turned normal against (0, 0, 1)
|
|
187
|
+
scope.$l[`${prefix}G${k}`] = pb.div(xy, pb.max(pb.abs(n.z), 1e-5));
|
|
188
|
+
});
|
|
189
|
+
scope.$l[`${prefix}NW`] = hexWeights(scope, prefix, null);
|
|
190
|
+
const w = scope[`${prefix}NW`];
|
|
191
|
+
const g = pb.add(pb.add(pb.mul(scope[`${prefix}G0`], w.x), pb.mul(scope[`${prefix}G1`], w.y)), pb.mul(scope[`${prefix}G2`], w.z));
|
|
192
|
+
decoded = pb.normalize(pb.vec3(g, 1));
|
|
193
|
+
} else {
|
|
194
|
+
decoded = decode(sampleNormal(scope, i, coord, ddx, ddy).rgb);
|
|
195
|
+
}
|
|
196
|
+
normal = pb.add(normal, pb.mul(decoded, weight(masks, i)));
|
|
197
|
+
}
|
|
198
|
+
return normal;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Roughness: the layer roughness weighted by the splat masks, whatever the layers leave
|
|
202
|
+
* uncovered keeps `base`, the material roughness.
|
|
203
|
+
*/ function blendTerrainRoughness(scope, numLayers, masks, detailParams, base) {
|
|
45
204
|
const pb = scope.$builder;
|
|
46
|
-
|
|
205
|
+
let weightSum = pb.float(0);
|
|
206
|
+
let roughness = pb.float(0);
|
|
47
207
|
for(let i = 0; i < numLayers; i++){
|
|
48
|
-
const
|
|
49
|
-
|
|
208
|
+
const w = weight(masks, i);
|
|
209
|
+
weightSum = pb.add(weightSum, w);
|
|
210
|
+
roughness = pb.add(roughness, pb.mul(w, detailParams.at(i).y));
|
|
50
211
|
}
|
|
51
|
-
return
|
|
212
|
+
return pb.add(roughness, pb.mul(pb.max(pb.sub(1, weightSum), 0), base));
|
|
52
213
|
}
|
|
53
214
|
|
|
54
|
-
export {
|
|
215
|
+
export { blendTerrainAlbedo, blendTerrainDetailNormal, blendTerrainRoughness, terrainSplatMaskCount };
|
|
55
216
|
//# sourceMappingURL=terrain_blend.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terrain_blend.js","sources":["../../../src/material/shader/terrain_blend.ts"],"sourcesContent":["import type { PBInsideFunctionScope, PBShaderExp } from '@zephyr3d/device';\r\n\r\n/**\r\n * Samples every splat mask layer once in the given scope.\r\n *\r\n * Shared by the live terrain shading path and the texture cache bake pass so\r\n * both interpret splat weights identically.\r\n *\r\n * @param scope - Scope to sample in\r\n * @param splatMap - Splat map texture expression (2d array, or plain 2d on WebGL1)\r\n * @param uv - Normalized terrain uv\r\n * @param numLayers - Number of detail layers\r\n * @param isWebGL1 - Whether targeting WebGL1 (splat map is a plain 2d texture)\r\n * @param namePrefix - Local variable name prefix for the sampled masks\r\n * @returns One vec4 expression per splat layer, 4 detail weights packed per layer\r\n *\r\n * @internal\r\n */\r\nexport function sampleTerrainSplatMasks(\r\n scope: PBInsideFunctionScope,\r\n splatMap: PBShaderExp,\r\n uv: PBShaderExp,\r\n numLayers: number,\r\n isWebGL1: boolean,\r\n namePrefix = 'splatMask'\r\n): PBShaderExp[] {\r\n const pb = scope.$builder;\r\n const masks: PBShaderExp[] = [];\r\n for (let i = 0; i < (numLayers + 3) >> 2; i++) {\r\n scope.$l[`${namePrefix}${i}`] = isWebGL1\r\n ? pb.textureSample(splatMap, uv)\r\n : pb.textureArraySample(splatMap, uv, i);\r\n masks.push(scope[`${namePrefix}${i}`]);\r\n }\r\n return masks;\r\n}\r\n\r\n/**\r\n * Accumulates per-layer samples weighted by splat masks:\r\n * `result = init + sum(sampleLayer(i, uv * uvScale(i)) * maskWeight(i))`\r\n *\r\n * This is the single definition of terrain detail blending. The live shading\r\n * path and the texture cache bake pass must both go through it so the cached\r\n * result can never diverge from the realtime result.\r\n *\r\n * @param scope - Scope to evaluate in\r\n * @param resultName - Local variable name for the accumulator\r\n * @param init - Initial accumulator value (also determines the value type)\r\n * @param numLayers - Number of detail layers\r\n * @param uv - Normalized terrain uv\r\n * @param masks - Splat masks returned by {@link sampleTerrainSplatMasks}\r\n * @param getUVScale - Per-layer uv scale accessor, or null when uv is unused by sampleLayer\r\n * @param sampleLayer - Per-layer value accessor, must return the same type as init\r\n * @returns The accumulated expression\r\n *\r\n * @internal\r\n */\r\nexport function accumulateTerrainLayers(\r\n scope: PBInsideFunctionScope,\r\n resultName: string,\r\n init: PBShaderExp,\r\n numLayers: number,\r\n uv: PBShaderExp,\r\n masks: PBShaderExp[],\r\n getUVScale: ((index: number) => PBShaderExp) | null,\r\n sampleLayer: (scope: PBInsideFunctionScope, index: number, uv: PBShaderExp) => PBShaderExp\r\n): PBShaderExp {\r\n const pb = scope.$builder;\r\n scope.$l[resultName] = init;\r\n for (let i = 0; i < numLayers; i++) {\r\n const layerUV = getUVScale ? pb.mul(uv, getUVScale(i)) : uv;\r\n scope[resultName] = pb.add(\r\n scope[resultName],\r\n pb.mul(sampleLayer(scope, i, layerUV), masks[i >> 2][i & 3])\r\n );\r\n }\r\n return scope[resultName];\r\n}\r\n"],"names":["sampleTerrainSplatMasks","scope","splatMap","uv","numLayers","isWebGL1","namePrefix","pb","$builder","masks","i","$l","textureSample","textureArraySample","push","accumulateTerrainLayers","resultName","init","getUVScale","sampleLayer","layerUV","mul","add"],"mappings":"AAEA;;;;;;;;;;;;;;;AAeC,IACM,SAASA,uBACdC,CAAAA,KAA4B,EAC5BC,QAAqB,EACrBC,EAAe,EACfC,SAAiB,EACjBC,QAAiB,EACjBC,aAAa,WAAW,EAAA;IAExB,MAAMC,EAAAA,GAAKN,MAAMO,QAAQ;AACzB,IAAA,MAAMC,QAAuB,EAAE;IAC/B,IAAK,IAAIC,IAAI,CAAGA,EAAAA,CAAAA,GAAI,SAAa,GAAA,CAAA,IAAM,GAAGA,CAAK,EAAA,CAAA;AAC7CT,QAAAA,KAAAA,CAAMU,EAAE,CAAC,CAAA,EAAGL,UAAaI,CAAAA,EAAAA,CAAAA,CAAAA,CAAG,CAAC,GAAGL,QAAAA,GAC5BE,EAAGK,CAAAA,aAAa,CAACV,QAAUC,EAAAA,EAAAA,CAAAA,GAC3BI,GAAGM,kBAAkB,CAACX,UAAUC,EAAIO,EAAAA,CAAAA,CAAAA;AACxCD,QAAAA,KAAAA,CAAMK,IAAI,CAACb,KAAK,CAAC,CAAGK,EAAAA,UAAAA,CAAAA,EAAaI,GAAG,CAAC,CAAA;AACvC;IACA,OAAOD,KAAAA;AACT;AAEA;;;;;;;;;;;;;;;;;;;AAmBC,IACM,SAASM,uBAAAA,CACdd,KAA4B,EAC5Be,UAAkB,EAClBC,IAAiB,EACjBb,SAAiB,EACjBD,EAAe,EACfM,KAAoB,EACpBS,UAAmD,EACnDC,WAA0F,EAAA;IAE1F,MAAMZ,EAAAA,GAAKN,MAAMO,QAAQ;IACzBP,KAAMU,CAAAA,EAAE,CAACK,UAAAA,CAAW,GAAGC,IAAAA;AACvB,IAAA,IAAK,IAAIP,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAIN,WAAWM,CAAK,EAAA,CAAA;AAClC,QAAA,MAAMU,UAAUF,UAAaX,GAAAA,EAAAA,CAAGc,GAAG,CAAClB,EAAAA,EAAIe,WAAWR,CAAMP,CAAAA,CAAAA,GAAAA,EAAAA;QACzDF,KAAK,CAACe,WAAW,GAAGT,EAAAA,CAAGe,GAAG,CACxBrB,KAAK,CAACe,UAAAA,CAAW,EACjBT,EAAAA,CAAGc,GAAG,CAACF,WAAAA,CAAYlB,KAAOS,EAAAA,CAAAA,EAAGU,OAAUX,CAAAA,EAAAA,KAAK,CAACC,CAAK,IAAA,CAAA,CAAE,CAACA,CAAAA,GAAI,CAAE,CAAA,CAAA,CAAA;AAE/D;IACA,OAAOT,KAAK,CAACe,UAAW,CAAA;AAC1B;;;;"}
|
|
1
|
+
{"version":3,"file":"terrain_blend.js","sources":["../../../src/material/shader/terrain_blend.ts"],"sourcesContent":["import type { PBInsideFunctionScope, PBShaderExp } from '@zephyr3d/device';\r\n\r\n/**\r\n * The detail layer blend of the clipmap terrain, the only definition of it: the material's live\r\n * path and the runtime virtual texture page fill both go through these, so the two cannot drift.\r\n * The callers differ only in how a layer texture is sampled (screen derivatives when shading,\r\n * the page texel footprint when filling).\r\n */\r\n\r\n/**\r\n * Samples layer `layer` of a detail texture at the already scaled detail uv. `ddx`/`ddy` are the\r\n * gradients of that uv when known (sample with them), null to sample with implicit derivatives.\r\n */\r\nexport type TerrainLayerSampler = (\r\n scope: PBInsideFunctionScope,\r\n layer: number,\r\n uv: PBShaderExp,\r\n ddx: PBShaderExp | null,\r\n ddy: PBShaderExp | null\r\n) => PBShaderExp;\r\n\r\n/** Gradients of the terrain uv across one pixel (or one page texel) */\r\nexport interface TerrainUVGrad {\r\n ddx: PBShaderExp;\r\n ddy: PBShaderExp;\r\n}\r\n\r\n/** Layers using hex tiling, see terrainHexTile */\r\nexport interface TerrainHexTiling {\r\n /** Bit i set: layer i uses hex tiling */\r\n mask: number;\r\n /** Per layer (rotation amount, scale amount, contrast, 0) */\r\n params: PBShaderExp;\r\n}\r\n\r\n/** Number of splat mask vectors for `numLayers` detail layers, 4 weights each */\r\nexport function terrainSplatMaskCount(numLayers: number) {\r\n return (numLayers + 3) >> 2;\r\n}\r\n\r\n/** Splat weight of a layer */\r\nfunction weight(masks: PBShaderExp[], layer: number) {\r\n return masks[layer >> 2][layer & 3] as PBShaderExp;\r\n}\r\n\r\nfunction useHex(hex: TerrainHexTiling | null, grad: TerrainUVGrad | null, layer: number) {\r\n return !!hex && !!grad && (hex.mask & (1 << layer)) !== 0;\r\n}\r\n\r\nfunction terrainHexTile(\r\n scope: PBInsideFunctionScope,\r\n prefix: string,\r\n coord: PBShaderExp,\r\n rotationAmount: PBShaderExp,\r\n scaleAmount: PBShaderExp\r\n) {\r\n const pb = scope.$builder;\r\n pb.func('zTerrainHexHash', [pb.vec2('p')], function () {\r\n // https://www.shadertoy.com/view/4djSRW, mx_hextile_hash\r\n this.$l.p3 = pb.fract(pb.mul(pb.vec3(this.p.x, this.p.y, this.p.x), pb.vec3(0.1031, 0.103, 0.0973)));\r\n this.p3 = pb.add(this.p3, pb.vec3(pb.dot(this.p3, pb.add(this.p3.yzx, pb.vec3(33.33)))));\r\n this.$return(pb.fract(pb.mul(pb.add(this.p3.xx, this.p3.yz), this.p3.zy)));\r\n });\r\n pb.func(\r\n 'zTerrainHexTile',\r\n [\r\n pb.vec2('coord'),\r\n pb.float('rotation'),\r\n pb.float('scale'),\r\n pb.vec2('c1').out(),\r\n pb.vec2('c2').out(),\r\n pb.vec2('c3').out(),\r\n pb.vec3('w').out(),\r\n pb.vec3('r').out(),\r\n pb.vec3('s').out()\r\n ],\r\n function () {\r\n const sqrt3x2 = Math.sqrt(3) * 2;\r\n // scale to keep the original fit, then skew into the simplex triangle grid\r\n // (GLSL mat2(1, 0, -0.57735027, 1.15470054) * st)\r\n this.$l.st = pb.mul(this.coord, sqrt3x2);\r\n this.$l.skewed = pb.vec2(\r\n pb.sub(this.st.x, pb.mul(this.st.y, 0.57735027)),\r\n pb.mul(this.st.y, 1.15470054)\r\n );\r\n this.$l.f = pb.fract(this.skewed);\r\n this.$l.z = pb.sub(pb.sub(1, this.f.x), this.f.y);\r\n this.$l.sv = pb.step(0, pb.neg(this.z));\r\n this.$l.s2 = pb.sub(pb.mul(this.sv, 2), 1);\r\n this.w = pb.vec3(\r\n pb.mul(pb.neg(this.z), this.s2),\r\n pb.sub(this.sv, pb.mul(this.f.y, this.s2)),\r\n pb.sub(this.sv, pb.mul(this.f.x, this.s2))\r\n );\r\n // vertex ids and hexagon centres (GLSL mat2(1, 0, 0.5, 1 / 1.15470054) * id)\r\n this.$l.base = pb.floor(this.skewed);\r\n this.$l.id1 = pb.add(this.base, pb.vec2(this.sv, this.sv));\r\n this.$l.id2 = pb.add(this.base, pb.vec2(this.sv, pb.sub(1, this.sv)));\r\n this.$l.id3 = pb.add(this.base, pb.vec2(pb.sub(1, this.sv), this.sv));\r\n const centre = (id: PBShaderExp) =>\r\n pb.div(pb.vec2(pb.add(id.x, pb.mul(id.y, 0.5)), pb.div(id.y, 1.15470054)), sqrt3x2);\r\n this.$l.ctr1 = centre(this.id1);\r\n this.$l.ctr2 = centre(this.id2);\r\n this.$l.ctr3 = centre(this.id3);\r\n this.$l.rand1 = this.zTerrainHexHash(pb.add(this.id1, pb.vec2(0.12345)));\r\n this.$l.rand2 = this.zTerrainHexHash(pb.add(this.id2, pb.vec2(0.12345)));\r\n this.$l.rand3 = this.zTerrainHexHash(pb.add(this.id3, pb.vec2(0.12345)));\r\n // rotation range 0..360 degrees, scale range 0.5..2, offset range 0..1 at amount 1\r\n this.$l.rv = pb.mul(\r\n pb.vec3(this.rand1.x, this.rand2.x, this.rand3.x),\r\n pb.mul(this.rotation, Math.PI * 2)\r\n );\r\n this.$l.sv3 = pb.mix(\r\n pb.vec3(1),\r\n pb.mix(pb.vec3(0.5), pb.vec3(2), pb.vec3(this.rand1.y, this.rand2.y, this.rand3.y)),\r\n pb.vec3(this.scale)\r\n );\r\n // ((coord - ctr) * rm / scale) + ctr + offset; GLSL v * mat2(c, -s, s, c) rotates v by +r\r\n const rotate = (v: PBShaderExp, r: PBShaderExp) =>\r\n pb.vec2(\r\n pb.sub(pb.mul(v.x, pb.cos(r)), pb.mul(v.y, pb.sin(r))),\r\n pb.add(pb.mul(v.x, pb.sin(r)), pb.mul(v.y, pb.cos(r)))\r\n );\r\n this.c1 = pb.add(\r\n pb.add(pb.div(rotate(pb.sub(this.coord, this.ctr1), this.rv.x), this.sv3.x), this.ctr1),\r\n this.rand1\r\n );\r\n this.c2 = pb.add(\r\n pb.add(pb.div(rotate(pb.sub(this.coord, this.ctr2), this.rv.y), this.sv3.y), this.ctr2),\r\n this.rand2\r\n );\r\n this.c3 = pb.add(\r\n pb.add(pb.div(rotate(pb.sub(this.coord, this.ctr3), this.rv.z), this.sv3.z), this.ctr3),\r\n this.rand3\r\n );\r\n this.r = this.rv;\r\n this.s = this.sv3;\r\n }\r\n );\r\n for (const name of ['C1', 'C2', 'C3']) {\r\n scope.$l[`${prefix}${name}`] = pb.vec2();\r\n }\r\n for (const name of ['W', 'R', 'S']) {\r\n scope.$l[`${prefix}${name}`] = pb.vec3();\r\n }\r\n pb.getGlobalScope().zTerrainHexTile(\r\n coord,\r\n rotationAmount,\r\n scaleAmount,\r\n scope[`${prefix}C1`],\r\n scope[`${prefix}C2`],\r\n scope[`${prefix}C3`],\r\n scope[`${prefix}W`],\r\n scope[`${prefix}R`],\r\n scope[`${prefix}S`]\r\n );\r\n}\r\n\r\n/** Rotates a 2D vector by `r` radians, counter clockwise */\r\nfunction rotate2(scope: PBInsideFunctionScope, v: PBShaderExp, r: PBShaderExp) {\r\n const pb = scope.$builder;\r\n return pb.vec2(\r\n pb.sub(pb.mul(v.x, pb.cos(r)), pb.mul(v.y, pb.sin(r))),\r\n pb.add(pb.mul(v.x, pb.sin(r)), pb.mul(v.y, pb.cos(r)))\r\n );\r\n}\r\n\r\n/**\r\n * The three hex tiling samples of a layer: the gradients follow each sample's rotation and scale\r\n * (mx_hextile_coord ddx1..3), so the mip is chosen from the continuous coordinate and the jumps\r\n * at hexagon edges do not show.\r\n */\r\nfunction sampleHexTiled(\r\n scope: PBInsideFunctionScope,\r\n prefix: string,\r\n layer: number,\r\n sample: TerrainLayerSampler,\r\n ddx: PBShaderExp,\r\n ddy: PBShaderExp\r\n) {\r\n const pb = scope.$builder;\r\n return ([1, 2, 3] as const).map((k) => {\r\n const comp = (['x', 'y', 'z'] as const)[k - 1];\r\n const r = scope[`${prefix}R`][comp] as PBShaderExp;\r\n const s = scope[`${prefix}S`][comp] as PBShaderExp;\r\n return sample(\r\n scope,\r\n layer,\r\n scope[`${prefix}C${k}`],\r\n pb.div(rotate2(scope, ddx, r), s),\r\n pb.div(rotate2(scope, ddy, r), s)\r\n );\r\n });\r\n}\r\n\r\n/** Blend weights of the three samples: pow(barycentric, 7), normalized (mx_hextiledimage) */\r\nfunction hexWeights(scope: PBInsideFunctionScope, prefix: string, colorWeights: PBShaderExp | null) {\r\n const pb = scope.$builder;\r\n let w = pb.pow(scope[`${prefix}W`], pb.vec3(7)) as PBShaderExp;\r\n if (colorWeights) {\r\n w = pb.mul(colorWeights, w);\r\n }\r\n scope.$l[`${prefix}BW`] = w;\r\n return pb.div(scope[`${prefix}BW`], pb.dot(scope[`${prefix}BW`], pb.vec3(1))) as PBShaderExp;\r\n}\r\n\r\n/**\r\n * Albedo: the layers weighted by the splat masks. Weights are not normalized, uncovered area\r\n * stays black.\r\n * @param detailParams - Per layer (uv scale, roughness, 0, 0)\r\n * @param grad - Gradients of `uv`; required for hex tiled layers, which are sampled flat otherwise\r\n */\r\nexport function blendTerrainAlbedo(\r\n scope: PBInsideFunctionScope,\r\n numLayers: number,\r\n masks: PBShaderExp[],\r\n uv: PBShaderExp,\r\n detailParams: PBShaderExp,\r\n sampleAlbedo: TerrainLayerSampler,\r\n grad: TerrainUVGrad | null = null,\r\n hex: TerrainHexTiling | null = null\r\n) {\r\n const pb = scope.$builder;\r\n let color: PBShaderExp = pb.vec3(0);\r\n for (let i = 0; i < numLayers; i++) {\r\n const tiling = detailParams.at(i).x as PBShaderExp;\r\n const coord = pb.mul(uv, tiling);\r\n const ddx = grad ? pb.mul(grad.ddx, tiling) : null;\r\n const ddy = grad ? pb.mul(grad.ddy, tiling) : null;\r\n let sample: PBShaderExp;\r\n if (useHex(hex, grad, i)) {\r\n const prefix = `zHexA${i}`;\r\n const p = hex!.params.at(i) as PBShaderExp;\r\n terrainHexTile(scope, prefix, coord, p.x, p.y);\r\n const [c1, c2, c3] = sampleHexTiled(scope, prefix, i, sampleAlbedo, ddx!, ddy!).map((c) => c.rgb);\r\n scope.$l[`${prefix}A1`] = c1;\r\n scope.$l[`${prefix}A2`] = c2;\r\n scope.$l[`${prefix}A3`] = c3;\r\n // Luminance as weights, mix(1, luma, contrast); Rec.709 coefficients for our linear\r\n // working space (one of mx_hextiledimage's lumacoeffs choices)\r\n const luma = pb.vec3(0.2126, 0.7152, 0.0722);\r\n const cw = pb.mix(\r\n pb.vec3(1),\r\n pb.vec3(\r\n pb.dot(scope[`${prefix}A1`], luma),\r\n pb.dot(scope[`${prefix}A2`], luma),\r\n pb.dot(scope[`${prefix}A3`], luma)\r\n ),\r\n pb.vec3(p.z)\r\n );\r\n scope.$l[`${prefix}NW`] = hexWeights(scope, prefix, cw);\r\n const w = scope[`${prefix}NW`];\r\n sample = pb.add(\r\n pb.add(pb.mul(scope[`${prefix}A1`], w.x), pb.mul(scope[`${prefix}A2`], w.y)),\r\n pb.mul(scope[`${prefix}A3`], w.z)\r\n );\r\n } else {\r\n sample = sampleAlbedo(scope, i, coord, ddx, ddy).rgb;\r\n }\r\n color = pb.add(color, pb.mul(sample, weight(masks, i)));\r\n }\r\n return color;\r\n}\r\n\r\n/**\r\n * Tangent space detail normal: the decoded layer normals weighted by the splat masks, not\r\n * normalized.\r\n *\r\n * A hex tiled layer blends its three samples as mx_hextilednormalmap: each normal turned with\r\n * its sample, then combined as surface gradients (Mikkelsen, Surface Gradient Based Bump Mapping\r\n * Framework, JCGT 9(3), 2020; mx_gradient_blend_3_normals), which with the tangent space normal\r\n * (0, 0, 1) reduces to normalize(sum(w * n.xy / |n.z|), 1). The turn is the inverse of the\r\n * sample's coordinate rotation: sampling at R(r) p shows the texture turned by -r on the\r\n * surface, and its normals with it. (MaterialX writes mx_axis_rotation_matrix row by row into a\r\n * column major GLSL mat3, which turns them the other way.)\r\n * @param sampleNormal - Returns the raw rgb of the layer's normal map\r\n */\r\nexport function blendTerrainDetailNormal(\r\n scope: PBInsideFunctionScope,\r\n numLayers: number,\r\n masks: PBShaderExp[],\r\n uv: PBShaderExp,\r\n detailParams: PBShaderExp,\r\n sampleNormal: TerrainLayerSampler,\r\n grad: TerrainUVGrad | null = null,\r\n hex: TerrainHexTiling | null = null\r\n) {\r\n const pb = scope.$builder;\r\n let normal: PBShaderExp = pb.vec3(0);\r\n const decode = (raw: PBShaderExp) => pb.normalize(pb.sub(pb.mul(raw, 2), pb.vec3(1)));\r\n for (let i = 0; i < numLayers; i++) {\r\n const tiling = detailParams.at(i).x as PBShaderExp;\r\n const coord = pb.mul(uv, tiling);\r\n const ddx = grad ? pb.mul(grad.ddx, tiling) : null;\r\n const ddy = grad ? pb.mul(grad.ddy, tiling) : null;\r\n let decoded: PBShaderExp;\r\n if (useHex(hex, grad, i)) {\r\n const prefix = `zHexN${i}`;\r\n const p = hex!.params.at(i) as PBShaderExp;\r\n terrainHexTile(scope, prefix, coord, p.x, p.y);\r\n const samples = sampleHexTiled(scope, prefix, i, sampleNormal, ddx!, ddy!);\r\n const comps = ['x', 'y', 'z'] as const;\r\n samples.forEach((raw, k) => {\r\n scope.$l[`${prefix}N${k}`] = decode(raw.rgb);\r\n const n = scope[`${prefix}N${k}`];\r\n const xy = rotate2(scope, n.xy, pb.neg(scope[`${prefix}R`][comps[k]]));\r\n // surface gradient of the turned normal against (0, 0, 1)\r\n scope.$l[`${prefix}G${k}`] = pb.div(xy, pb.max(pb.abs(n.z), 1e-5));\r\n });\r\n scope.$l[`${prefix}NW`] = hexWeights(scope, prefix, null);\r\n const w = scope[`${prefix}NW`];\r\n const g = pb.add(\r\n pb.add(pb.mul(scope[`${prefix}G0`], w.x), pb.mul(scope[`${prefix}G1`], w.y)),\r\n pb.mul(scope[`${prefix}G2`], w.z)\r\n );\r\n decoded = pb.normalize(pb.vec3(g, 1));\r\n } else {\r\n decoded = decode(sampleNormal(scope, i, coord, ddx, ddy).rgb);\r\n }\r\n normal = pb.add(normal, pb.mul(decoded, weight(masks, i)));\r\n }\r\n return normal;\r\n}\r\n\r\n/**\r\n * Roughness: the layer roughness weighted by the splat masks, whatever the layers leave\r\n * uncovered keeps `base`, the material roughness.\r\n */\r\nexport function blendTerrainRoughness(\r\n scope: PBInsideFunctionScope,\r\n numLayers: number,\r\n masks: PBShaderExp[],\r\n detailParams: PBShaderExp,\r\n base: PBShaderExp\r\n) {\r\n const pb = scope.$builder;\r\n let weightSum: PBShaderExp = pb.float(0);\r\n let roughness: PBShaderExp = pb.float(0);\r\n for (let i = 0; i < numLayers; i++) {\r\n const w = weight(masks, i);\r\n weightSum = pb.add(weightSum, w);\r\n roughness = pb.add(roughness, pb.mul(w, detailParams.at(i).y));\r\n }\r\n return pb.add(roughness, pb.mul(pb.max(pb.sub(1, weightSum), 0), base)) as PBShaderExp;\r\n}\r\n"],"names":["terrainSplatMaskCount","numLayers","weight","masks","layer","useHex","hex","grad","mask","terrainHexTile","scope","prefix","coord","rotationAmount","scaleAmount","pb","$builder","func","vec2","$l","p3","fract","mul","vec3","p","x","y","add","dot","yzx","$return","xx","yz","zy","float","out","sqrt3x2","Math","sqrt","st","skewed","sub","f","z","sv","step","neg","s2","w","base","floor","id1","id2","id3","centre","id","div","ctr1","ctr2","ctr3","rand1","zTerrainHexHash","rand2","rand3","rv","rotation","PI","sv3","mix","scale","rotate","v","r","cos","sin","c1","c2","c3","s","name","getGlobalScope","zTerrainHexTile","rotate2","sampleHexTiled","sample","ddx","ddy","map","k","comp","hexWeights","colorWeights","pow","blendTerrainAlbedo","uv","detailParams","sampleAlbedo","color","i","tiling","at","params","c","rgb","luma","cw","blendTerrainDetailNormal","sampleNormal","normal","decode","raw","normalize","decoded","samples","comps","forEach","n","xy","max","abs","g","blendTerrainRoughness","weightSum","roughness"],"mappings":"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"}
|