@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,537 @@
|
|
|
1
|
+
import { getDevice } from '../app/api.js';
|
|
2
|
+
|
|
3
|
+
/** Uniform names of the global field, see {@link declareGlobalSDFUniforms}. */ const GLOBAL_SDF_TEXTURE = 'zGlobalSDFTex';
|
|
4
|
+
const GLOBAL_SDF_LEVELS = 'zGlobalSDFLevels';
|
|
5
|
+
const GLOBAL_SDF_PARAMS = 'zGlobalSDFParams';
|
|
6
|
+
const GLOBAL_SDF_TAGS = 'zGlobalSDFTags';
|
|
7
|
+
/** Voxels along a brick edge of the global field, the unit it is composited and tagged in. */ const GLOBAL_SDF_BRICK = 8;
|
|
8
|
+
/** Uniform names of the dynamic instances, see {@link declareDynamicSDFUniforms}. */ const SDF_ATLAS_TEXTURE = 'zSDFAtlasTex';
|
|
9
|
+
const SDF_DYNAMIC_INSTANCES = 'zSDFDynamic';
|
|
10
|
+
const SDF_DYNAMIC_INFO = 'zSDFDynamicInfo';
|
|
11
|
+
/** Most dynamic instances a shader merges into the field. */ const MAX_DYNAMIC_SDF_INSTANCES = 16;
|
|
12
|
+
/**
|
|
13
|
+
* vec4s per packed instance: world-to-local rows (3), (field box min, voxel size),
|
|
14
|
+
* (field box max, world scale), (atlas slot offset, thin). `thin` = half thickness in world
|
|
15
|
+
* units of a two-sided field's surface, -1 for one-sided; see `expand` of {@link sampleInstancesSDF}.
|
|
16
|
+
*/ const SDF_INSTANCE_VEC4S = 6;
|
|
17
|
+
/**
|
|
18
|
+
* Declares the uniforms {@link sampleGlobalSDF} reads.
|
|
19
|
+
*
|
|
20
|
+
* - texture: levels stacked along z, `resolution + 1` slices each (last repeats the first),
|
|
21
|
+
* in {@link globalSDFFormat}; see {@link isGlobalSDFFilterable}.
|
|
22
|
+
* - tags: rgba32f, one texel per brick, stacked the same way: (world brick x, y, z, 1) of the
|
|
23
|
+
* brick last composited there.
|
|
24
|
+
* - levels[i]: (window origin in voxels, voxel size).
|
|
25
|
+
* - params: (resolution, number of levels, band in voxels, current mask); bit i set when
|
|
26
|
+
* every brick of level i is current (tags need not be read).
|
|
27
|
+
*
|
|
28
|
+
* @param levels - Clipmap levels; a compile-time constant of the program.
|
|
29
|
+
* @internal
|
|
30
|
+
*/ function declareGlobalSDFUniforms(scope, group, levels) {
|
|
31
|
+
const pb = scope.$builder;
|
|
32
|
+
scope[GLOBAL_SDF_TEXTURE] = isGlobalSDFFilterable() ? pb.tex3D().uniform(group) : pb.tex3D().sampleType('unfilterable-float').uniform(group);
|
|
33
|
+
scope[GLOBAL_SDF_TAGS] = pb.tex3D().sampleType('unfilterable-float').uniform(group);
|
|
34
|
+
scope[GLOBAL_SDF_LEVELS] = pb.vec4[levels]().uniform(group);
|
|
35
|
+
scope[GLOBAL_SDF_PARAMS] = pb.vec4().uniform(group);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Texel format of the global field: r16f where compute-writable (WebGPU texture-formats-tier1),
|
|
39
|
+
* else r32f. Half precision suffices since only distances within the band are stored.
|
|
40
|
+
* @internal
|
|
41
|
+
*/ function globalSDFFormat() {
|
|
42
|
+
return getDevice().getDeviceCaps().textureCaps.getTextureFormatInfo('r16f')?.writable ? 'r16f' : 'r32f';
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* True when the device filters the global field's format (r16f always, r32f with
|
|
46
|
+
* float32-filterable); otherwise trilinear is done by hand from eight loads.
|
|
47
|
+
* @internal
|
|
48
|
+
*/ function isGlobalSDFFilterable() {
|
|
49
|
+
return !!getDevice().getDeviceCaps().textureCaps.getTextureFormatInfo(globalSDFFormat())?.filterable;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Declares the uniforms {@link sampleDynamicSDF} reads: the mesh field atlas,
|
|
53
|
+
* up to {@link MAX_DYNAMIC_SDF_INSTANCES} packed instances and
|
|
54
|
+
* (instance count, 1 / atlas size).
|
|
55
|
+
* @internal
|
|
56
|
+
*/ function declareDynamicSDFUniforms(scope, group) {
|
|
57
|
+
const pb = scope.$builder;
|
|
58
|
+
scope[SDF_ATLAS_TEXTURE] = pb.tex3D().uniform(group);
|
|
59
|
+
scope[SDF_DYNAMIC_INSTANCES] = pb.vec4[MAX_DYNAMIC_SDF_INSTANCES * SDF_INSTANCE_VEC4S]().uniform(group);
|
|
60
|
+
scope[SDF_DYNAMIC_INFO] = pb.vec4().uniform(group);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Distance in local units from a local position to one packed instance's field: trilinear
|
|
64
|
+
* atlas lookup inside the box, border value plus box distance outside. `bmin` is (box min,
|
|
65
|
+
* voxel size), `bmax` (box max, world scale), `slot` the atlas slot offset.
|
|
66
|
+
* @internal
|
|
67
|
+
*/ function sampleInstanceField(scope, lp, bmin, bmax, slot, atlas, atlasInvSize) {
|
|
68
|
+
const pb = scope.$builder;
|
|
69
|
+
const funcName = `Z_sampleInstanceField_${atlas.$str}`;
|
|
70
|
+
pb.func(funcName, [
|
|
71
|
+
pb.vec3('lp'),
|
|
72
|
+
pb.vec4('bmin'),
|
|
73
|
+
pb.vec4('bmax'),
|
|
74
|
+
pb.vec4('slot'),
|
|
75
|
+
pb.vec3('invSize')
|
|
76
|
+
], function() {
|
|
77
|
+
this.$l.c = pb.clamp(this.lp, this.bmin.xyz, this.bmax.xyz);
|
|
78
|
+
this.$l.outside = pb.length(pb.sub(this.lp, this.c));
|
|
79
|
+
this.$l.res = pb.div(pb.sub(this.bmax.xyz, this.bmin.xyz), this.bmin.w);
|
|
80
|
+
// Clamped to the outer sample centres, so the filter never reads a neighbour's slot
|
|
81
|
+
this.$l.f = pb.clamp(pb.div(pb.sub(this.c, this.bmin.xyz), this.bmin.w), pb.vec3(0.5), pb.sub(this.res, pb.vec3(0.5)));
|
|
82
|
+
this.$l.uvw = pb.mul(pb.add(this.slot.xyz, this.f), this.invSize);
|
|
83
|
+
this.$return(pb.add(pb.textureSampleLevel(atlas, this.uvw, 0).r, this.outside));
|
|
84
|
+
});
|
|
85
|
+
return scope[funcName](lp, bmin, bmax, slot, atlasInvSize);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Signed distance from a world position to the nearest of a set of packed instances
|
|
89
|
+
* (layout at {@link SDF_INSTANCE_VEC4S}), or `maxDist` when none is nearer. `baseOf(k)` gives
|
|
90
|
+
* the first vec4 of the k-th instance, `instance(i)` reads vec4 `i`. If `bestIndex` names an
|
|
91
|
+
* int variable, the nearest k is written to it.
|
|
92
|
+
*
|
|
93
|
+
* `expand` (world units) is the minimum half thickness given to two-sided surfaces so coarser
|
|
94
|
+
* grids don't step over them: half the voxel size of the grid being written, 0 for point samples.
|
|
95
|
+
* @internal
|
|
96
|
+
*/ function sampleInstancesSDF(scope, p, count, maxDist, baseOf, instance, atlas, atlasInvSize, expand, bestIndex) {
|
|
97
|
+
const pb = scope.$builder;
|
|
98
|
+
scope.$l.sdfBest = maxDist;
|
|
99
|
+
scope.$l.sdfP4 = pb.vec4(p, 1);
|
|
100
|
+
scope.$l.sdfExpand = expand;
|
|
101
|
+
scope.$for(pb.uint('sdfK'), 0, count, function() {
|
|
102
|
+
this.$l.base = baseOf(this, this.sdfK);
|
|
103
|
+
this.$l.r0 = instance(this, this.base);
|
|
104
|
+
this.$l.r1 = instance(this, pb.add(this.base, 1));
|
|
105
|
+
this.$l.r2 = instance(this, pb.add(this.base, 2));
|
|
106
|
+
this.$l.bmin = instance(this, pb.add(this.base, 3));
|
|
107
|
+
this.$l.bmax = instance(this, pb.add(this.base, 4));
|
|
108
|
+
this.$l.slot = instance(this, pb.add(this.base, 5));
|
|
109
|
+
this.$l.lp = pb.vec3(pb.dot(this.r0, this.sdfP4), pb.dot(this.r1, this.sdfP4), pb.dot(this.r2, this.sdfP4));
|
|
110
|
+
this.$l.c = pb.clamp(this.lp, this.bmin.xyz, this.bmax.xyz);
|
|
111
|
+
// World length of a unit along each local axis
|
|
112
|
+
this.$l.axisScale = pb.div(pb.vec3(1), pb.vec3(pb.length(this.r0.xyz), pb.length(this.r1.xyz), pb.length(this.r2.xyz)));
|
|
113
|
+
// World distance to the field box, exact under non-uniform scale; only the
|
|
114
|
+
// field's own value takes the smallest axis scale
|
|
115
|
+
this.$l.outside = pb.length(pb.mul(pb.sub(this.lp, this.c), this.axisScale));
|
|
116
|
+
// How far a two-sided surface is pushed out to reach the half thickness asked for
|
|
117
|
+
this.$l.grow = this.$choice(pb.greaterThanEqual(this.slot.w, 0), pb.max(pb.sub(this.sdfExpand, this.slot.w), 0), pb.float(0));
|
|
118
|
+
// A field box farther than the current best cannot improve it
|
|
119
|
+
this.$if(pb.lessThan(pb.sub(this.outside, this.grow), this.sdfBest), function() {
|
|
120
|
+
this.$l.cand = pb.sub(pb.add(pb.mul(sampleInstanceField(this, this.c, this.bmin, this.bmax, this.slot, atlas, atlasInvSize), this.bmax.w), this.outside), this.grow);
|
|
121
|
+
this.$if(pb.lessThan(this.cand, this.sdfBest), function() {
|
|
122
|
+
this.sdfBest = this.cand;
|
|
123
|
+
if (bestIndex) {
|
|
124
|
+
this[bestIndex] = pb.int(this.sdfK);
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
return scope.sdfBest;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Signed distance to the dynamic instances at their current transforms, or `maxDist`.
|
|
133
|
+
* @internal
|
|
134
|
+
*/ function sampleDynamicSDF(scope, worldPos, maxDist) {
|
|
135
|
+
const pb = scope.$builder;
|
|
136
|
+
const funcName = 'Z_sampleDynamicSDF';
|
|
137
|
+
pb.func(funcName, [
|
|
138
|
+
pb.vec3('p'),
|
|
139
|
+
pb.float('maxDist')
|
|
140
|
+
], function() {
|
|
141
|
+
this.$return(sampleInstancesSDF(this, this.p, pb.uint(this[SDF_DYNAMIC_INFO].x), this.maxDist, (s, k)=>pb.mul(k, SDF_INSTANCE_VEC4S), (s, i)=>s[SDF_DYNAMIC_INSTANCES].at(i), this[SDF_ATLAS_TEXTURE], this[SDF_DYNAMIC_INFO].yzw, pb.float(0)));
|
|
142
|
+
});
|
|
143
|
+
return scope[funcName](worldPos, maxDist);
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Signed distance to the whole scene field: global clipmap merged with dynamic instances.
|
|
147
|
+
* Needs {@link declareGlobalSDFUniforms} and {@link declareDynamicSDFUniforms}.
|
|
148
|
+
* @internal
|
|
149
|
+
*/ function sampleSceneSDF(scope, worldPos, levels) {
|
|
150
|
+
const pb = scope.$builder;
|
|
151
|
+
const funcName = 'Z_sampleSceneSDF';
|
|
152
|
+
pb.func(funcName, [
|
|
153
|
+
pb.vec3('p')
|
|
154
|
+
], function() {
|
|
155
|
+
this.$l.g = sampleGlobalSDF(this, this.p, levels);
|
|
156
|
+
this.$return(sampleDynamicSDF(this, this.p, this.g));
|
|
157
|
+
});
|
|
158
|
+
return scope[funcName](worldPos);
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Surface expand scale in bricks holding two-sided meshes (1 elsewhere)
|
|
162
|
+
* @internal
|
|
163
|
+
*/ const SDF_NOT_COVERED_EXPAND_SCALE = 0.6;
|
|
164
|
+
/**
|
|
165
|
+
* Tag alpha of a brick holding two-sided meshes (1 otherwise); see
|
|
166
|
+
* {@link SDF_NOT_COVERED_EXPAND_SCALE}.
|
|
167
|
+
* @internal
|
|
168
|
+
*/ const GLOBAL_SDF_TAG_NOT_COVERED = 2;
|
|
169
|
+
/**
|
|
170
|
+
* False where the global field brick holding a position (finest level) was composited with
|
|
171
|
+
* two-sided meshes; true otherwise, including outside every window or for stale bricks.
|
|
172
|
+
* @internal
|
|
173
|
+
*/ function globalSDFCovered(scope, worldPos, levels) {
|
|
174
|
+
const pb = scope.$builder;
|
|
175
|
+
const funcName = 'Z_globalSDFCovered';
|
|
176
|
+
pb.func(funcName, [
|
|
177
|
+
pb.vec3('p')
|
|
178
|
+
], function() {
|
|
179
|
+
this.$l.res = pb.int(this[GLOBAL_SDF_PARAMS].x);
|
|
180
|
+
this.$l.nbi = pb.ivec3(pb.div(this.res, GLOBAL_SDF_BRICK));
|
|
181
|
+
for(let i = 0; i < levels; i++){
|
|
182
|
+
this.$l[`cvInfo${i}`] = this[GLOBAL_SDF_LEVELS].at(i);
|
|
183
|
+
this.$l[`cvV${i}`] = pb.ivec3(pb.floor(pb.div(this.p, this[`cvInfo${i}`].w)));
|
|
184
|
+
this.$l[`cvO${i}`] = pb.ivec3(this[`cvInfo${i}`].xyz);
|
|
185
|
+
this.$if(pb.and(pb.all(pb.greaterThanEqual(this[`cvV${i}`], this[`cvO${i}`])), pb.all(pb.lessThan(this[`cvV${i}`], pb.add(this[`cvO${i}`], pb.ivec3(this.res))))), function() {
|
|
186
|
+
this.$l.b = pb.ivec3(pb.floor(pb.div(pb.vec3(this[`cvV${i}`]), GLOBAL_SDF_BRICK)));
|
|
187
|
+
this.$l.w = wrap(this, this.b, this.nbi);
|
|
188
|
+
this.$l.tag = pb.textureLoad(this[GLOBAL_SDF_TAGS], pb.ivec3(this.w.x, this.w.y, pb.add(this.w.z, pb.mul(this.nbi.z, i))), 0);
|
|
189
|
+
this.$return(pb.not(pb.and(pb.greaterThan(this.tag.w, GLOBAL_SDF_TAG_NOT_COVERED - 0.5), pb.equal(pb.ivec3(this.tag.xyz), this.b))));
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
this.$return(true);
|
|
193
|
+
});
|
|
194
|
+
return scope[funcName](worldPos);
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Lumen surface expand (GlobalDistanceFieldUtils.ush) for a {@link sampleSceneSDFWithVoxel}
|
|
198
|
+
* sample at `p`, `t` along a trace: one voxel of the level read ({@link SDF_NOT_COVERED_EXPAND_SCALE}
|
|
199
|
+
* in two-sided bricks), ramping from 0 over the first two voxels. Zero for dynamic instances.
|
|
200
|
+
* @internal
|
|
201
|
+
*/ function sdfSurfaceExpand(scope, p, sample, t, levels) {
|
|
202
|
+
const pb = scope.$builder;
|
|
203
|
+
const funcName = 'Z_sdfSurfaceExpand';
|
|
204
|
+
pb.func(funcName, [
|
|
205
|
+
pb.vec3('p'),
|
|
206
|
+
pb.vec2('s'),
|
|
207
|
+
pb.float('t')
|
|
208
|
+
], function() {
|
|
209
|
+
this.$l.e = pb.mul(this.s.y, pb.clamp(pb.div(this.t, pb.max(pb.mul(this.s.y, 2), 1e-6)), 0, 1));
|
|
210
|
+
this.$if(pb.and(pb.lessThan(this.s.x, this.e), pb.greaterThanEqual(this.s.x, pb.mul(this.e, SDF_NOT_COVERED_EXPAND_SCALE))), function() {
|
|
211
|
+
this.$if(pb.not(globalSDFCovered(this, this.p, levels)), function() {
|
|
212
|
+
this.e = pb.mul(this.e, SDF_NOT_COVERED_EXPAND_SCALE);
|
|
213
|
+
});
|
|
214
|
+
});
|
|
215
|
+
this.$return(this.e);
|
|
216
|
+
});
|
|
217
|
+
return scope[funcName](p, sample, t);
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Voxels over which a global field level blends into the next coarser one near its window
|
|
221
|
+
* edge; wider than a brick (the window move step) so the hand-over never jumps.
|
|
222
|
+
* @internal
|
|
223
|
+
*/ const SDF_LEVEL_BLEND_VOXELS = 16;
|
|
224
|
+
/**
|
|
225
|
+
* Signed distance (world units, negative inside) from the global clipmap field.
|
|
226
|
+
*
|
|
227
|
+
* The finest level holding the point within its band answers, blending into the next coarser
|
|
228
|
+
* level near window edges and band edges. Past all windows or with every level saturated, the
|
|
229
|
+
* coarsest value is returned as a lower bound, keeping sphere tracing safe. Windows are toroidal;
|
|
230
|
+
* non-filterable formats use manual trilinear. A level answers only where all bricks under the
|
|
231
|
+
* filter are tagged current, so stale bricks after a window move are ignored.
|
|
232
|
+
* @internal
|
|
233
|
+
*/ function sampleGlobalSDF(scope, worldPos, levels) {
|
|
234
|
+
return sampleGlobalSDFWithVoxel(scope, worldPos, levels).x;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* First level worth reading after a sphere-trace step read `prevDist`; finer levels saturate.
|
|
238
|
+
* @internal
|
|
239
|
+
*/ function sdfStartLevel(scope, prevDist, levels) {
|
|
240
|
+
const pb = scope.$builder;
|
|
241
|
+
let start = pb.int(0);
|
|
242
|
+
for(let i = 0; i < levels - 1; i++){
|
|
243
|
+
start = pb.add(start, pb.int(pb.greaterThanEqual(prevDist, pb.mul(scope[GLOBAL_SDF_PARAMS].z, scope[GLOBAL_SDF_LEVELS].at(i).w, 0.95))));
|
|
244
|
+
}
|
|
245
|
+
return start;
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* {@link sampleGlobalSDFWithVoxel} for sphere tracing: starts at the level `prevDist` needs,
|
|
249
|
+
* rereading from the finest level near a surface. Levels finer than `minLevel` are never .
|
|
250
|
+
* @internal
|
|
251
|
+
*/ function sampleGlobalSDFHinted(scope, worldPos, prevDist, levels, minLevel) {
|
|
252
|
+
const pb = scope.$builder;
|
|
253
|
+
const funcName = 'Z_sampleGlobalSDFHinted';
|
|
254
|
+
pb.func(funcName, [
|
|
255
|
+
pb.vec3('p'),
|
|
256
|
+
pb.float('prevDist'),
|
|
257
|
+
pb.int('minLevel')
|
|
258
|
+
], function() {
|
|
259
|
+
this.$l.start = pb.max(sdfStartLevel(this, this.prevDist, levels), this.minLevel);
|
|
260
|
+
this.$l.g = sampleGlobalSDFWithVoxel(this, this.p, levels, this.start);
|
|
261
|
+
this.$if(pb.greaterThan(this.start, this.minLevel), function() {
|
|
262
|
+
this.$if(pb.lessThan(this.g.x, pb.mul(this[GLOBAL_SDF_PARAMS].z, this[GLOBAL_SDF_LEVELS].at(pb.sub(this.start, 1)).w)), function() {
|
|
263
|
+
this.g = sampleGlobalSDFWithVoxel(this, this.p, levels, this.minLevel);
|
|
264
|
+
});
|
|
265
|
+
});
|
|
266
|
+
this.$return(this.g);
|
|
267
|
+
});
|
|
268
|
+
return scope[funcName](worldPos, prevDist, minLevel ?? pb.int(0));
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* {@link sampleSceneSDFWithVoxel} for sphere tracing, using {@link sampleGlobalSDFHinted}.
|
|
272
|
+
* @internal
|
|
273
|
+
*/ function sampleSceneSDFHinted(scope, worldPos, prevDist, levels, minLevel) {
|
|
274
|
+
const pb = scope.$builder;
|
|
275
|
+
const funcName = 'Z_sampleSceneSDFHinted';
|
|
276
|
+
pb.func(funcName, [
|
|
277
|
+
pb.vec3('p'),
|
|
278
|
+
pb.float('prevDist'),
|
|
279
|
+
pb.int('minLevel')
|
|
280
|
+
], function() {
|
|
281
|
+
this.$l.g = sampleGlobalSDFHinted(this, this.p, this.prevDist, levels, this.minLevel);
|
|
282
|
+
this.$l.d = sampleDynamicSDF(this, this.p, this.g.x);
|
|
283
|
+
this.$return(pb.vec2(this.d, this.$choice(pb.lessThan(this.d, this.g.x), pb.float(0), this.g.y)));
|
|
284
|
+
});
|
|
285
|
+
return scope[funcName](worldPos, prevDist, minLevel ?? pb.int(0));
|
|
286
|
+
}
|
|
287
|
+
/** Steps {@link sdfRefineHit} takes past a hit on the swollen surface. @internal */ const SDF_REFINE_STEPS = 8;
|
|
288
|
+
/**
|
|
289
|
+
* Refines a sphere-trace hit on the surface swollen by {@link sdfSurfaceExpand} to the field's
|
|
290
|
+
* own surface: steps on from `t` (distance `d`, answering `voxel` size, 0 for dynamic) to the zero
|
|
291
|
+
* crossing or minimum, at most {@link SDF_REFINE_STEPS} steps of at least 1/8 voxel. Needed because
|
|
292
|
+
* the swollen surface lies up to a voxel short, notably in concave corners.
|
|
293
|
+
* @internal
|
|
294
|
+
*/ function sdfRefineHit(scope, origin, dir, t, d, voxel, minLevel, levels) {
|
|
295
|
+
const pb = scope.$builder;
|
|
296
|
+
const funcName = 'Z_sdfRefineHit';
|
|
297
|
+
pb.func(funcName, [
|
|
298
|
+
pb.vec3('o'),
|
|
299
|
+
pb.vec3('dir'),
|
|
300
|
+
pb.float('t'),
|
|
301
|
+
pb.float('d'),
|
|
302
|
+
pb.float('voxel'),
|
|
303
|
+
pb.int('minLevel')
|
|
304
|
+
], function() {
|
|
305
|
+
// Stopped inside: back out by as much
|
|
306
|
+
this.$if(pb.lessThanEqual(this.d, 0), function() {
|
|
307
|
+
this.$return(pb.max(pb.add(this.t, this.d), 0));
|
|
308
|
+
});
|
|
309
|
+
this.$l.rt = this.t;
|
|
310
|
+
this.$l.rd = this.d;
|
|
311
|
+
this.$l.rStep = pb.mul(pb.max(this.voxel, this[GLOBAL_SDF_LEVELS].at(0).w), 0.125);
|
|
312
|
+
this.$for(pb.int('r'), 0, SDF_REFINE_STEPS, function() {
|
|
313
|
+
this.$l.nt = pb.add(this.rt, pb.max(this.rd, this.rStep));
|
|
314
|
+
this.$l.nd = sampleSceneSDFHinted(this, pb.add(this.o, pb.mul(this.dir, this.nt)), this.rd, levels, this.minLevel).x;
|
|
315
|
+
this.$if(pb.lessThanEqual(this.nd, 0), function() {
|
|
316
|
+
this.$return(pb.add(this.rt, pb.mul(pb.sub(this.nt, this.rt), pb.div(this.rd, pb.sub(this.rd, this.nd)))));
|
|
317
|
+
});
|
|
318
|
+
this.$if(pb.greaterThanEqual(this.nd, this.rd), function() {
|
|
319
|
+
this.$break();
|
|
320
|
+
});
|
|
321
|
+
this.rt = this.nt;
|
|
322
|
+
this.rd = this.nd;
|
|
323
|
+
});
|
|
324
|
+
this.$return(this.rt);
|
|
325
|
+
});
|
|
326
|
+
return scope[funcName](origin, dir, t, d, voxel, minLevel);
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* {@link sampleGlobalSDF} returning (distance, voxel size) in world units; levels finer than
|
|
330
|
+
* `minLevel` are skipped.
|
|
331
|
+
* @internal
|
|
332
|
+
*/ function sampleGlobalSDFWithVoxel(scope, worldPos, levels, minLevel) {
|
|
333
|
+
const pb = scope.$builder;
|
|
334
|
+
const filterable = isGlobalSDFFilterable();
|
|
335
|
+
const funcName = 'Z_sampleGlobalSDFWithVoxel';
|
|
336
|
+
pb.func(funcName, [
|
|
337
|
+
pb.vec3('p'),
|
|
338
|
+
pb.int('minLevel')
|
|
339
|
+
], function() {
|
|
340
|
+
this.$l.res = pb.int(this[GLOBAL_SDF_PARAMS].x);
|
|
341
|
+
this.$l.resF = this[GLOBAL_SDF_PARAMS].x;
|
|
342
|
+
this.$l.band = this[GLOBAL_SDF_PARAMS].z;
|
|
343
|
+
// Weighted sums of the levels read, and the weight still left to coarser levels
|
|
344
|
+
this.$l.sum = pb.float(0);
|
|
345
|
+
this.$l.sumVoxel = pb.float(0);
|
|
346
|
+
this.$l.remaining = pb.float(1);
|
|
347
|
+
// The coarsest value read: a bound when every level read was saturated
|
|
348
|
+
this.$l.last = pb.mul(this.band, this[GLOBAL_SDF_LEVELS].at(levels - 1).w);
|
|
349
|
+
this.$l.lastVoxel = this[GLOBAL_SDF_LEVELS].at(levels - 1).w;
|
|
350
|
+
this.$l.valid = false;
|
|
351
|
+
this.$l.base = pb.vec3(0);
|
|
352
|
+
this.$l.t = pb.vec3(0);
|
|
353
|
+
this.$l.v0 = pb.ivec3(0);
|
|
354
|
+
for(let i = 0; i < levels; i++){
|
|
355
|
+
// Finest first, each level taking the share its finer levels left
|
|
356
|
+
const wanted = i === levels - 1 ? pb.greaterThan(this.remaining, 1e-4) : pb.and(pb.greaterThan(this.remaining, 1e-4), pb.lessThanEqual(this.minLevel, i));
|
|
357
|
+
this.$if(wanted, function() {
|
|
358
|
+
this.$l.info = this[GLOBAL_SDF_LEVELS].at(i);
|
|
359
|
+
// Position in voxels of the window, sample centres at integers
|
|
360
|
+
this.$l.f = pb.sub(pb.div(this.p, this.info.w), pb.add(this.info.xyz, pb.vec3(0.5)));
|
|
361
|
+
this.$l.inside = pb.and(pb.all(pb.greaterThanEqual(this.f, pb.vec3(0))), pb.all(pb.lessThanEqual(this.f, pb.vec3(pb.sub(this.resF, 1)))));
|
|
362
|
+
this.valid = false;
|
|
363
|
+
this.$if(this.inside, function() {
|
|
364
|
+
this.$if(levelCurrent(this, i), function() {
|
|
365
|
+
this.valid = true;
|
|
366
|
+
}).$else(function() {
|
|
367
|
+
// World voxel index of the filter's lower corner
|
|
368
|
+
this.valid = bricksCurrent(this, pb.add(pb.ivec3(pb.floor(this.f)), pb.ivec3(this.info.xyz)), i);
|
|
369
|
+
});
|
|
370
|
+
});
|
|
371
|
+
this.$if(this.valid, function() {
|
|
372
|
+
if (filterable) {
|
|
373
|
+
// World voxel position, sample centres at integers, wrapped into the window
|
|
374
|
+
this.$l.vw = pb.add(this.f, this.info.xyz);
|
|
375
|
+
this.vw = pb.sub(this.vw, pb.mul(pb.floor(pb.div(this.vw, this.resF)), this.resF));
|
|
376
|
+
this.$l.depth = pb.add(this.resF, 1);
|
|
377
|
+
this.$l.d = pb.textureSampleLevel(this[GLOBAL_SDF_TEXTURE], pb.vec3(pb.div(pb.add(this.vw.xy, pb.vec2(0.5)), this.resF), pb.div(pb.add(this.vw.z, pb.add(pb.mul(this.depth, i), 0.5)), pb.mul(this.depth, levels))), 0).r;
|
|
378
|
+
} else {
|
|
379
|
+
this.base = pb.floor(this.f);
|
|
380
|
+
this.t = pb.sub(this.f, this.base);
|
|
381
|
+
// World voxel index of the lower corner, then toroidal texel
|
|
382
|
+
this.v0 = pb.add(pb.ivec3(this.base), pb.ivec3(this.info.xyz));
|
|
383
|
+
this.$l.c000 = loadWrapped(this, this.v0, 0, 0, 0, i);
|
|
384
|
+
this.$l.c100 = loadWrapped(this, this.v0, 1, 0, 0, i);
|
|
385
|
+
this.$l.c010 = loadWrapped(this, this.v0, 0, 1, 0, i);
|
|
386
|
+
this.$l.c110 = loadWrapped(this, this.v0, 1, 1, 0, i);
|
|
387
|
+
this.$l.c001 = loadWrapped(this, this.v0, 0, 0, 1, i);
|
|
388
|
+
this.$l.c101 = loadWrapped(this, this.v0, 1, 0, 1, i);
|
|
389
|
+
this.$l.c011 = loadWrapped(this, this.v0, 0, 1, 1, i);
|
|
390
|
+
this.$l.c111 = loadWrapped(this, this.v0, 1, 1, 1, i);
|
|
391
|
+
this.$l.d = pb.mix(pb.mix(pb.mix(this.c000, this.c100, this.t.x), pb.mix(this.c010, this.c110, this.t.x), this.t.y), pb.mix(pb.mix(this.c001, this.c101, this.t.x), pb.mix(this.c011, this.c111, this.t.x), this.t.y), this.t.z);
|
|
392
|
+
}
|
|
393
|
+
this.last = this.d;
|
|
394
|
+
this.lastVoxel = this.info.w;
|
|
395
|
+
if (i === levels - 1) {
|
|
396
|
+
this.$l.w = pb.float(1);
|
|
397
|
+
} else {
|
|
398
|
+
// Hand over near the window edge and near the band edge (beyond which values are lower bounds)
|
|
399
|
+
this.$l.lo = pb.min(pb.min(this.f.x, this.f.y), this.f.z);
|
|
400
|
+
this.$l.hi = pb.sub(pb.sub(this.resF, 1), pb.max(pb.max(this.f.x, this.f.y), this.f.z));
|
|
401
|
+
this.$l.edge = pb.min(this.lo, this.hi);
|
|
402
|
+
this.$l.bandW = pb.mul(this.band, this.info.w);
|
|
403
|
+
this.$l.w = pb.mul(pb.smoothStep(1, 1 + SDF_LEVEL_BLEND_VOXELS, this.edge), pb.sub(1, pb.smoothStep(pb.mul(this.bandW, 0.75), pb.mul(this.bandW, 0.95), pb.abs(this.d))));
|
|
404
|
+
}
|
|
405
|
+
this.$l.share = pb.mul(this.remaining, this.w);
|
|
406
|
+
this.sum = pb.add(this.sum, pb.mul(this.share, this.d));
|
|
407
|
+
this.sumVoxel = pb.add(this.sumVoxel, pb.mul(this.share, this.info.w));
|
|
408
|
+
this.remaining = pb.sub(this.remaining, this.share);
|
|
409
|
+
});
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
// What no level answered for: past the coarsest window, or every level saturated
|
|
413
|
+
this.$l.result = pb.add(this.sum, pb.mul(this.remaining, this.last));
|
|
414
|
+
this.$l.resultVoxel = pb.add(this.sumVoxel, pb.mul(this.remaining, this.lastVoxel));
|
|
415
|
+
this.$return(pb.vec2(this.result, this.resultVoxel));
|
|
416
|
+
});
|
|
417
|
+
return scope[funcName](worldPos, minLevel ?? pb.int(0));
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* Signed distance from one global clipmap level chosen at run time, with no blending or brick
|
|
421
|
+
* currency check.
|
|
422
|
+
* @internal
|
|
423
|
+
*/ function sampleGlobalSDFLevel(scope, worldPos, level, levels) {
|
|
424
|
+
const pb = scope.$builder;
|
|
425
|
+
const filterable = isGlobalSDFFilterable();
|
|
426
|
+
const funcName = 'Z_sampleGlobalSDFLevel';
|
|
427
|
+
pb.func(funcName, [
|
|
428
|
+
pb.vec3('p'),
|
|
429
|
+
pb.int('level')
|
|
430
|
+
], function() {
|
|
431
|
+
this.$l.res = pb.int(this[GLOBAL_SDF_PARAMS].x);
|
|
432
|
+
this.$l.resF = this[GLOBAL_SDF_PARAMS].x;
|
|
433
|
+
this.$l.info = this[GLOBAL_SDF_LEVELS].at(this.level);
|
|
434
|
+
// Position in voxels of the window, sample centres at integers
|
|
435
|
+
this.$l.f = pb.sub(pb.div(this.p, this.info.w), pb.add(this.info.xyz, pb.vec3(0.5)));
|
|
436
|
+
// Slice of the level's first z, `resolution + 1` slices a level
|
|
437
|
+
this.$l.z0 = pb.mul(pb.add(this.res, 1), this.level);
|
|
438
|
+
if (filterable) {
|
|
439
|
+
this.$l.vw = pb.add(this.f, this.info.xyz);
|
|
440
|
+
this.vw = pb.sub(this.vw, pb.mul(pb.floor(pb.div(this.vw, this.resF)), this.resF));
|
|
441
|
+
this.$l.depth = pb.add(this.resF, 1);
|
|
442
|
+
this.$return(pb.textureSampleLevel(this[GLOBAL_SDF_TEXTURE], pb.vec3(pb.div(pb.add(this.vw.xy, pb.vec2(0.5)), this.resF), pb.div(pb.add(this.vw.z, pb.add(pb.float(this.z0), 0.5)), pb.mul(this.depth, levels))), 0).r);
|
|
443
|
+
} else {
|
|
444
|
+
this.$l.base = pb.floor(this.f);
|
|
445
|
+
this.$l.t = pb.sub(this.f, this.base);
|
|
446
|
+
this.$l.v0 = pb.add(pb.ivec3(this.base), pb.ivec3(this.info.xyz));
|
|
447
|
+
const load = (dx, dy, dz)=>{
|
|
448
|
+
const v = pb.add(this.v0, pb.ivec3(dx, dy, dz));
|
|
449
|
+
const w = wrap(this, v, pb.ivec3(this.res));
|
|
450
|
+
return pb.textureLoad(this[GLOBAL_SDF_TEXTURE], pb.ivec3(w.x, w.y, pb.add(w.z, this.z0)), 0).r;
|
|
451
|
+
};
|
|
452
|
+
this.$return(pb.mix(pb.mix(pb.mix(load(0, 0, 0), load(1, 0, 0), this.t.x), pb.mix(load(0, 1, 0), load(1, 1, 0), this.t.x), this.t.y), pb.mix(pb.mix(load(0, 0, 1), load(1, 0, 1), this.t.x), pb.mix(load(0, 1, 1), load(1, 1, 1), this.t.x), this.t.y), this.t.z));
|
|
453
|
+
}
|
|
454
|
+
});
|
|
455
|
+
return scope[funcName](worldPos, level);
|
|
456
|
+
}
|
|
457
|
+
/** ((v % n) + n) % n, the remainder of a negative index being negative */ function wrap(scope, v, n) {
|
|
458
|
+
const pb = scope.$builder;
|
|
459
|
+
return pb.mod(pb.add(pb.mod(v, n), n), n);
|
|
460
|
+
}
|
|
461
|
+
/**
|
|
462
|
+
* True when the brick of a level holding world voxel `v` is tagged with its own
|
|
463
|
+
* world brick coordinates, i.e. composited for the current window.
|
|
464
|
+
* @internal
|
|
465
|
+
*/ function globalSDFVoxelCurrent(scope, v, level) {
|
|
466
|
+
const pb = scope.$builder;
|
|
467
|
+
const funcName = `Z_globalSDFVoxelCurrent${level}`;
|
|
468
|
+
pb.func(funcName, [
|
|
469
|
+
pb.ivec3('v')
|
|
470
|
+
], function() {
|
|
471
|
+
this.$if(levelCurrent(this, level), function() {
|
|
472
|
+
this.$return(true);
|
|
473
|
+
});
|
|
474
|
+
this.$l.nbi = pb.ivec3(pb.int(pb.div(this[GLOBAL_SDF_PARAMS].x, GLOBAL_SDF_BRICK)));
|
|
475
|
+
this.$l.b = pb.ivec3(pb.floor(pb.div(pb.vec3(this.v), GLOBAL_SDF_BRICK)));
|
|
476
|
+
this.$l.w = wrap(this, this.b, this.nbi);
|
|
477
|
+
this.$l.tag = pb.textureLoad(this[GLOBAL_SDF_TAGS], pb.ivec3(this.w.x, this.w.y, pb.add(this.w.z, pb.mul(this.nbi.z, level))), 0);
|
|
478
|
+
this.$return(pb.and(pb.greaterThan(this.tag.w, 0.5), pb.equal(pb.ivec3(this.tag.xyz), this.b)));
|
|
479
|
+
});
|
|
480
|
+
return scope[funcName](v);
|
|
481
|
+
}
|
|
482
|
+
/** True when every brick of a level is current, by the mask in the params' w. */ function levelCurrent(scope, level) {
|
|
483
|
+
const pb = scope.$builder;
|
|
484
|
+
return pb.notEqual(pb.compAnd(pb.uint(scope[GLOBAL_SDF_PARAMS].w), pb.uint(1 << level)), pb.uint(0));
|
|
485
|
+
}
|
|
486
|
+
/**
|
|
487
|
+
* True when every brick covering voxels v0..v0+1 of a level is tagged current (one to eight bricks).
|
|
488
|
+
*/ function bricksCurrent(scope, v0, level) {
|
|
489
|
+
const pb = scope.$builder;
|
|
490
|
+
const funcName = `Z_globalSDFBricksCurrent${level}`;
|
|
491
|
+
pb.func(funcName, [
|
|
492
|
+
pb.ivec3('v0')
|
|
493
|
+
], function() {
|
|
494
|
+
this.$l.nb = pb.div(this[GLOBAL_SDF_PARAMS].x, GLOBAL_SDF_BRICK);
|
|
495
|
+
this.$l.nbi = pb.ivec3(pb.int(this.nb));
|
|
496
|
+
// Floor division of possibly negative voxel indices
|
|
497
|
+
this.$l.lo = pb.ivec3(pb.floor(pb.div(pb.vec3(this.v0), GLOBAL_SDF_BRICK)));
|
|
498
|
+
this.$l.hi = pb.ivec3(pb.floor(pb.div(pb.vec3(pb.add(this.v0, pb.ivec3(1))), GLOBAL_SDF_BRICK)));
|
|
499
|
+
this.$l.ok = true;
|
|
500
|
+
for(let c = 0; c < 8; c++){
|
|
501
|
+
const bits = [
|
|
502
|
+
c & 1,
|
|
503
|
+
c >> 1 & 1,
|
|
504
|
+
c >> 2 & 1
|
|
505
|
+
];
|
|
506
|
+
// A corner using the upper brick on an axis matters only where the footprint crosses into it
|
|
507
|
+
const needs = [
|
|
508
|
+
'x',
|
|
509
|
+
'y',
|
|
510
|
+
'z'
|
|
511
|
+
].filter((_, a)=>bits[a]).map((a)=>pb.notEqual(this.lo[a], this.hi[a]));
|
|
512
|
+
const body = function() {
|
|
513
|
+
this.$l.b = pb.ivec3(bits[0] ? this.hi.x : this.lo.x, bits[1] ? this.hi.y : this.lo.y, bits[2] ? this.hi.z : this.lo.z);
|
|
514
|
+
this.$l.w = wrap(this, this.b, this.nbi);
|
|
515
|
+
this.$l.tag = pb.textureLoad(this[GLOBAL_SDF_TAGS], pb.ivec3(this.w.x, this.w.y, pb.add(this.w.z, pb.mul(this.nbi.z, level))), 0);
|
|
516
|
+
this.ok = pb.and(this.ok, pb.and(pb.greaterThan(this.tag.w, 0.5), pb.equal(pb.ivec3(this.tag.xyz), this.b)));
|
|
517
|
+
};
|
|
518
|
+
if (needs.length === 0) {
|
|
519
|
+
body.call(this);
|
|
520
|
+
} else {
|
|
521
|
+
this.$if(needs.reduce((x, y)=>pb.and(x, y)), body);
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
this.$return(this.ok);
|
|
525
|
+
});
|
|
526
|
+
return scope[funcName](v0);
|
|
527
|
+
}
|
|
528
|
+
function loadWrapped(scope, v0, dx, dy, dz, level) {
|
|
529
|
+
const pb = scope.$builder;
|
|
530
|
+
const v = pb.add(v0, pb.ivec3(dx, dy, dz));
|
|
531
|
+
// ((v % n) + n) % n, the remainder of a negative index being negative
|
|
532
|
+
const t = pb.mod(pb.add(pb.mod(v, pb.ivec3(scope.res)), pb.ivec3(scope.res)), pb.ivec3(scope.res));
|
|
533
|
+
return pb.textureLoad(scope[GLOBAL_SDF_TEXTURE], pb.ivec3(t.x, t.y, pb.add(t.z, pb.mul(pb.add(scope.res, 1), level))), 0).r;
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
export { GLOBAL_SDF_BRICK, GLOBAL_SDF_LEVELS, GLOBAL_SDF_PARAMS, GLOBAL_SDF_TAGS, GLOBAL_SDF_TAG_NOT_COVERED, GLOBAL_SDF_TEXTURE, MAX_DYNAMIC_SDF_INSTANCES, SDF_ATLAS_TEXTURE, SDF_DYNAMIC_INFO, SDF_DYNAMIC_INSTANCES, SDF_INSTANCE_VEC4S, SDF_LEVEL_BLEND_VOXELS, SDF_NOT_COVERED_EXPAND_SCALE, SDF_REFINE_STEPS, declareDynamicSDFUniforms, declareGlobalSDFUniforms, globalSDFCovered, globalSDFFormat, globalSDFVoxelCurrent, isGlobalSDFFilterable, sampleDynamicSDF, sampleGlobalSDF, sampleGlobalSDFHinted, sampleGlobalSDFLevel, sampleGlobalSDFWithVoxel, sampleInstanceField, sampleInstancesSDF, sampleSceneSDF, sampleSceneSDFHinted, sdfRefineHit, sdfSurfaceExpand };
|
|
537
|
+
//# sourceMappingURL=sdf.js.map
|