@zephyr3d/scene 0.9.26 → 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 +146 -30
- 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 +300 -56
- 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 +177 -3
- 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 +178 -200
- 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 +30475 -19865
- package/dist/index.js +67 -12
- 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/hairstrand.js +235 -235
- package/dist/material/hairstrand.js.map +1 -1
- package/dist/material/lambert.js +4 -1
- package/dist/material/lambert.js.map +1 -1
- package/dist/material/material.js +362 -300
- 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 +223 -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 +733 -190
- 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 +2009 -201
- 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 +668 -63
- package/dist/posteffect/motionblur.js.map +1 -1
- package/dist/posteffect/posteffect.js +12 -1
- package/dist/posteffect/posteffect.js.map +1 -1
- package/dist/posteffect/postsss.js +572 -0
- package/dist/posteffect/postsss.js.map +1 -0
- package/dist/posteffect/sao.js +48 -50
- 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 +34 -15
- 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 +40 -39
- package/dist/render/abuffer_oit.js.map +1 -1
- package/dist/render/clipmap.js +328 -62
- 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 +26 -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 +53 -53
- 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 +8 -13
- package/dist/render/fbm_wavegenerator.js.map +1 -1
- package/dist/render/fft_wavegenerator.js +268 -136
- package/dist/render/fft_wavegenerator.js.map +1 -1
- package/dist/render/gerstner_wavegenerator.js +113 -28
- 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/hzb.js +80 -22
- package/dist/render/hzb.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 +23 -9
- 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/oit.js +11 -11
- package/dist/render/oit.js.map +1 -1
- 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 +198 -11
- package/dist/render/render_queue.js.map +1 -1
- package/dist/render/renderer.js +14 -7
- package/dist/render/renderer.js.map +1 -1
- package/dist/render/rendergraph/blackboard.js +15 -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 +585 -59
- package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
- package/dist/render/rendergraph/frame_resource_requirements.js +1 -0
- package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -1
- package/dist/render/rendergraph/history_resources.js +8 -1
- package/dist/render/rendergraph/history_resources.js.map +1 -1
- 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 +524 -0
- package/dist/render/underwater.js.map +1 -0
- 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 +1195 -0
- package/dist/render/water_caustics.js.map +1 -0
- 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 +36 -36
- 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 +997 -96
- 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/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 +40 -87
- package/dist/shaders/water.js.map +1 -1
- package/dist/shaders/water_medium.js +42 -0
- package/dist/shaders/water_medium.js.map +1 -0
- 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 +87 -49
- 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 +36 -6
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +77 -7
- 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 +140 -279
- 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 +2473 -114
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/utility/serialization/types.js.map +1 -1
- package/dist/utility/shprojector.js +97 -109
- 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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bake.js","sources":["../../../src/utility/sdf/bake.ts"],"sourcesContent":["import { closestPointOnTriangle, TriangleBVH } from './bvh';\r\n\r\n/**\r\n * Options of {@link bakeMeshSDF}.\r\n * @public\r\n */\r\nexport interface MeshSDFBakeOptions {\r\n /** Scale on the {@link SDF_VOXELS_PER_UNIT} voxel density, before padding and clamp. Default 1. */\r\n resolutionScale?: number;\r\n /** World units one local mesh unit spans, which the density is measured in. Default 1. */\r\n unitScale?: number;\r\n /**\r\n * Treat the mesh as a thin open surface (leaf, sail): unsigned distance less half a voxel.\r\n * Default false.\r\n */\r\n twoSided?: boolean;\r\n /** Rays per hemisphere for the inside/outside test, a square number. Default 49. */\r\n signSamples?: number;\r\n /** Voxels of empty space around the mesh bounds on every side. Default 2. */\r\n padding?: number;\r\n /** Max voxels per axis, padding included. Default 128, or 256 above resolution scale 1. */\r\n maxResolution?: number;\r\n /** Voxels per axis, at least. Default 8. */\r\n minResolution?: number;\r\n}\r\n\r\n/**\r\n * A signed distance field over a mesh in its local space (negative inside, local units). Sample\r\n * `(i, j, k)` sits at voxel centre `boxMin + (i + 0.5, j + 0.5, k + 0.5) * voxelSize`, x fastest.\r\n *\r\n * @public\r\n */\r\nexport interface MeshSDFData {\r\n /** Lower corner of the volume, the mesh bounds less the padding. */\r\n boxMin: [number, number, number];\r\n /** Upper corner of the volume, `boxMin + resolution * voxelSize`. */\r\n boxMax: [number, number, number];\r\n /** Voxels per axis. */\r\n resolution: [number, number, number];\r\n /** Edge of a voxel in local units. */\r\n voxelSize: number;\r\n /** Bounds of the mesh itself, inside the volume. */\r\n meshBoxMin: [number, number, number];\r\n meshBoxMax: [number, number, number];\r\n twoSided: boolean;\r\n /** Smallest and largest distance in the volume. */\r\n minDistance: number;\r\n maxDistance: number;\r\n /** One distance per voxel. */\r\n distances: Float32Array;\r\n}\r\n\r\n/**\r\n * Voxels per world unit (metre) of a baked field at resolution scale 1, matching UE5's\r\n * r.DistanceFields.DefaultVoxelDensity (0.2/cm). Scaled by {@link MeshSDFBakeOptions.unitScale}\r\n * since meshes keep their authored units.\r\n * @public\r\n */\r\nexport const SDF_VOXELS_PER_UNIT = 20;\r\n\r\n/** Voxels from the surface within which the sign is decided by rays; further voxels take it from their neighbours. */\r\nconst SIGN_BAND_VOXELS = 1;\r\n/** Length of a sign ray in voxel diagonals. */\r\nconst SIGN_TRACE_DIAGONALS = 4;\r\n/** Fraction of the sign rays that must hit a back face for a voxel to count as inside. */\r\nconst SIGN_BACK_FRACTION = 0.25;\r\n/** Voxels around a triangle's bounds seeded with its exact distance. */\r\nconst SEED_MARGIN = 1;\r\n\r\n/**\r\n * Unsigned distance per voxel by closest-triangle propagation: voxels near each triangle are\r\n * seeded with their exact distance, then fast sweeps in the eight diagonal orders pass each\r\n * voxel's nearest triangle to its neighbours. Rarely off by a small fraction of a voxel.\r\n */\r\nfunction computeUnsignedDistances(\r\n positions: Float32Array,\r\n indices: Uint32Array,\r\n boxMin: [number, number, number],\r\n resolution: [number, number, number],\r\n h: number\r\n) {\r\n const [nx, ny, nz] = resolution;\r\n const count = nx * ny * nz;\r\n const dist = new Float32Array(count).fill(Infinity);\r\n const tri = new Int32Array(count).fill(-1);\r\n const numTris = Math.floor(indices.length / 3);\r\n const tmp = new Float32Array(3);\r\n const triDist = (t: number, x: number, y: number, z: number) => {\r\n const ia = indices[t * 3] * 3;\r\n const ib = indices[t * 3 + 1] * 3;\r\n const ic = indices[t * 3 + 2] * 3;\r\n closestPointOnTriangle(\r\n x,\r\n y,\r\n z,\r\n positions[ia],\r\n positions[ia + 1],\r\n positions[ia + 2],\r\n positions[ib],\r\n positions[ib + 1],\r\n positions[ib + 2],\r\n positions[ic],\r\n positions[ic + 1],\r\n positions[ic + 2],\r\n tmp\r\n );\r\n const dx = tmp[0] - x;\r\n const dy = tmp[1] - y;\r\n const dz = tmp[2] - z;\r\n return dx * dx + dy * dy + dz * dz;\r\n };\r\n // Seed: exact squared distance in each triangle's own neighbourhood\r\n for (let t = 0; t < numTris; t++) {\r\n const lo = [Infinity, Infinity, Infinity];\r\n const hi = [-Infinity, -Infinity, -Infinity];\r\n for (let k = 0; k < 3; k++) {\r\n const v = indices[t * 3 + k] * 3;\r\n for (let c = 0; c < 3; c++) {\r\n lo[c] = Math.min(lo[c], positions[v + c]);\r\n hi[c] = Math.max(hi[c], positions[v + c]);\r\n }\r\n }\r\n const i0 = Math.max(0, Math.floor((lo[0] - boxMin[0]) / h - 0.5) - SEED_MARGIN + 1);\r\n const j0 = Math.max(0, Math.floor((lo[1] - boxMin[1]) / h - 0.5) - SEED_MARGIN + 1);\r\n const k0 = Math.max(0, Math.floor((lo[2] - boxMin[2]) / h - 0.5) - SEED_MARGIN + 1);\r\n const i1 = Math.min(nx - 1, Math.ceil((hi[0] - boxMin[0]) / h - 0.5) + SEED_MARGIN - 1);\r\n const j1 = Math.min(ny - 1, Math.ceil((hi[1] - boxMin[1]) / h - 0.5) + SEED_MARGIN - 1);\r\n const k1 = Math.min(nz - 1, Math.ceil((hi[2] - boxMin[2]) / h - 0.5) + SEED_MARGIN - 1);\r\n for (let k = k0; k <= k1; k++) {\r\n const z = boxMin[2] + (k + 0.5) * h;\r\n for (let j = j0; j <= j1; j++) {\r\n const y = boxMin[1] + (j + 0.5) * h;\r\n let o = (k * ny + j) * nx + i0;\r\n for (let i = i0; i <= i1; i++, o++) {\r\n const d = triDist(t, boxMin[0] + (i + 0.5) * h, y, z);\r\n if (d < dist[o]) {\r\n dist[o] = d;\r\n tri[o] = t;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n // Sweeps: each voxel tries the nearest triangles of its three predecessors along the order;\r\n // one round of eight is as accurate as two\r\n const strides = [1, nx, nx * ny];\r\n for (let order = 0; order < 8; order++) {\r\n const sx = order & 1 ? -1 : 1;\r\n const sy = order & 2 ? -1 : 1;\r\n const sz = order & 4 ? -1 : 1;\r\n for (let kk = 0; kk < nz; kk++) {\r\n const k = sz > 0 ? kk : nz - 1 - kk;\r\n const z = boxMin[2] + (k + 0.5) * h;\r\n for (let jj = 0; jj < ny; jj++) {\r\n const j = sy > 0 ? jj : ny - 1 - jj;\r\n const y = boxMin[1] + (j + 0.5) * h;\r\n for (let ii = 0; ii < nx; ii++) {\r\n const i = sx > 0 ? ii : nx - 1 - ii;\r\n const o = (k * ny + j) * nx + i;\r\n const x = boxMin[0] + (i + 0.5) * h;\r\n const own = tri[o];\r\n if (ii > 0) {\r\n const t = tri[o - sx * strides[0]];\r\n if (t >= 0 && t !== own) {\r\n const d = triDist(t, x, y, z);\r\n if (d < dist[o]) {\r\n dist[o] = d;\r\n tri[o] = t;\r\n }\r\n }\r\n }\r\n if (jj > 0) {\r\n const t = tri[o - sy * strides[1]];\r\n if (t >= 0 && t !== tri[o]) {\r\n const d = triDist(t, x, y, z);\r\n if (d < dist[o]) {\r\n dist[o] = d;\r\n tri[o] = t;\r\n }\r\n }\r\n }\r\n if (kk > 0) {\r\n const t = tri[o - sz * strides[2]];\r\n if (t >= 0 && t !== tri[o]) {\r\n const d = triDist(t, x, y, z);\r\n if (d < dist[o]) {\r\n dist[o] = d;\r\n tri[o] = t;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n for (let i = 0; i < count; i++) {\r\n dist[i] = Math.sqrt(dist[i]);\r\n }\r\n return dist;\r\n}\r\n\r\n/**\r\n * Bakes the signed distance field of a triangle mesh on the CPU. Unsigned distance by\r\n * closest-triangle propagation; sign by back-face ray voting near the surface (as UE5's mesh\r\n * distance field builder), so open and single-sided meshes work without a closed surface.\r\n *\r\n * @param positions - Vertex positions, xyz per vertex.\r\n * @param indices - Three indices per triangle.\r\n * @public\r\n */\r\nexport function bakeMeshSDF(\r\n positions: Float32Array,\r\n indices: Uint32Array,\r\n options?: MeshSDFBakeOptions\r\n): MeshSDFData {\r\n const scale = Math.max(0.01, options?.resolutionScale ?? 1);\r\n const twoSided = !!options?.twoSided;\r\n const padding = Math.max(1, Math.floor(options?.padding ?? 2));\r\n const maxRes = Math.max(4, Math.floor(options?.maxResolution ?? (scale > 1 ? 256 : 128)));\r\n const minRes = Math.min(maxRes, Math.max(2, Math.floor(options?.minResolution ?? 8)));\r\n const meshMin: [number, number, number] = [Infinity, Infinity, Infinity];\r\n const meshMax: [number, number, number] = [-Infinity, -Infinity, -Infinity];\r\n const numVerts = Math.floor(positions.length / 3);\r\n // Only the vertices triangles use count towards the bounds\r\n for (let i = 0; i < indices.length; i++) {\r\n const v = indices[i];\r\n if (v >= numVerts) {\r\n throw new Error('bakeMeshSDF(): index out of range');\r\n }\r\n for (let c = 0; c < 3; c++) {\r\n meshMin[c] = Math.min(meshMin[c], positions[v * 3 + c]);\r\n meshMax[c] = Math.max(meshMax[c], positions[v * 3 + c]);\r\n }\r\n }\r\n if (indices.length < 3) {\r\n throw new Error('bakeMeshSDF(): the mesh has no triangles');\r\n }\r\n const extent = [meshMax[0] - meshMin[0], meshMax[1] - meshMin[1], meshMax[2] - meshMin[2]];\r\n const longest = Math.max(extent[0], extent[1], extent[2], 1e-6);\r\n const unitScale = options?.unitScale && options.unitScale > 0 ? options.unitScale : 1;\r\n let voxelSize = 1 / (SDF_VOXELS_PER_UNIT * scale * unitScale);\r\n // Fit the longest side, padding included, under the cap\r\n voxelSize = Math.max(voxelSize, longest / (maxRes - 2 * padding));\r\n const resolution: [number, number, number] = [0, 0, 0];\r\n for (let c = 0; c < 3; c++) {\r\n resolution[c] = Math.min(maxRes, Math.max(minRes, Math.ceil(extent[c] / voxelSize) + 2 * padding));\r\n }\r\n // Centre the mesh in the volume\r\n const boxMin: [number, number, number] = [0, 0, 0];\r\n const boxMax: [number, number, number] = [0, 0, 0];\r\n for (let c = 0; c < 3; c++) {\r\n const size = resolution[c] * voxelSize;\r\n boxMin[c] = (meshMin[c] + meshMax[c]) * 0.5 - size * 0.5;\r\n boxMax[c] = boxMin[c] + size;\r\n }\r\n const bvh = new TriangleBVH(positions, indices);\r\n const [nx, ny, nz] = resolution;\r\n const count = nx * ny * nz;\r\n const distances = computeUnsignedDistances(positions, indices, boxMin, resolution, voxelSize);\r\n if (twoSided) {\r\n for (let i = 0; i < count; i++) {\r\n distances[i] -= voxelSize * 0.5;\r\n }\r\n } else {\r\n signDistances(distances, bvh, boxMin, resolution, voxelSize, options?.signSamples);\r\n }\r\n let minDistance = Infinity;\r\n let maxDistance = -Infinity;\r\n for (let i = 0; i < count; i++) {\r\n minDistance = Math.min(minDistance, distances[i]);\r\n maxDistance = Math.max(maxDistance, distances[i]);\r\n }\r\n return {\r\n boxMin,\r\n boxMax,\r\n resolution,\r\n voxelSize,\r\n meshBoxMin: meshMin,\r\n meshBoxMax: meshMax,\r\n twoSided,\r\n minDistance,\r\n maxDistance,\r\n distances\r\n };\r\n}\r\n\r\n/** Deterministic 32-bit generator (mulberry32), so a mesh bakes the same every time. */\r\nfunction makeRandom(seed: number) {\r\n let a = seed >>> 0;\r\n return () => {\r\n a = (a + 0x6d2b79f5) >>> 0;\r\n let t = a;\r\n t = Math.imul(t ^ (t >>> 15), t | 1);\r\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61);\r\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\r\n };\r\n}\r\n\r\n/**\r\n * Stratified directions over the sphere: a square grid of jittered samples on\r\n * each hemisphere, mapped through the concentric disk [Shirley & Chiu 1997],\r\n * one hemisphere mirrored in z. xyz per direction.\r\n */\r\nfunction sphereDirections(perHemisphere: number) {\r\n const dim = Math.max(1, Math.floor(Math.sqrt(perHemisphere)));\r\n const random = makeRandom(0);\r\n const dirs = new Float32Array(dim * dim * 2 * 3);\r\n let n = 0;\r\n // The two hemispheres interleave, so a prefix of the list covers both sides\r\n for (let i = 0; i < dim; i++) {\r\n for (let j = 0; j < dim; j++) {\r\n for (let hemi = 0; hemi < 2; hemi++) {\r\n const u = ((i + random()) / dim) * 2 - 1;\r\n const v = ((j + random()) / dim) * 2 - 1;\r\n let x = 0;\r\n let y = 0;\r\n let z = 1;\r\n if (u !== 0 || v !== 0) {\r\n let r: number;\r\n let theta: number;\r\n if (Math.abs(u) > Math.abs(v)) {\r\n r = u;\r\n theta = (Math.PI / 4) * (v / u);\r\n } else {\r\n r = v;\r\n theta = Math.PI / 2 - (Math.PI / 4) * (u / v);\r\n }\r\n const r2 = r * r;\r\n const s = Math.sqrt(2 - r2);\r\n x = r * Math.cos(theta) * s;\r\n y = r * Math.sin(theta) * s;\r\n z = 1 - r2;\r\n }\r\n dirs[n++] = x;\r\n dirs[n++] = y;\r\n dirs[n++] = hemi === 0 ? z : -z;\r\n }\r\n }\r\n }\r\n return dirs;\r\n}\r\n\r\n/**\r\n * Signs the unsigned distances. Voxels within SIGN_BAND_VOXELS of the surface are inside when\r\n * they hit anything and more than SIGN_BACK_FRACTION of the rays hit a back face (UE5 mesh\r\n * distance field criterion). Six-connected regions beyond the band are outside if they reach the\r\n * volume border, else take the majority sign of their surrounding band voxels.\r\n */\r\nfunction signDistances(\r\n distances: Float32Array,\r\n bvh: TriangleBVH,\r\n boxMin: [number, number, number],\r\n resolution: [number, number, number],\r\n h: number,\r\n samples?: number\r\n) {\r\n const [nx, ny, nz] = resolution;\r\n const count = nx * ny * nz;\r\n const dirs = sphereDirections(Math.max(1, Math.floor(samples ?? 49)));\r\n const numDirs = dirs.length / 3;\r\n const band = SIGN_BAND_VOXELS * h;\r\n const traceDistance = SIGN_TRACE_DIAGONALS * Math.sqrt(3) * h;\r\n // Pulled back a little so a ray starting on a triangle still crosses it\r\n const pullback = 1e-4 * traceDistance;\r\n const tMax = traceDistance + pullback;\r\n const needBack = SIGN_BACK_FRACTION * numDirs;\r\n // 0: beyond the band, 1: outside, 2: inside\r\n const side = new Uint8Array(count);\r\n for (let k = 0; k < nz; k++) {\r\n const z = boxMin[2] + (k + 0.5) * h;\r\n for (let j = 0; j < ny; j++) {\r\n const y = boxMin[1] + (j + 0.5) * h;\r\n for (let i = 0; i < nx; i++) {\r\n const index = i + j * nx + k * nx * ny;\r\n if (distances[index] > band) {\r\n continue;\r\n }\r\n const x = boxMin[0] + (i + 0.5) * h;\r\n let hit = 0;\r\n let hitBack = 0;\r\n // Stops once the back faces seen settle it either way\r\n for (let d = 0; d < numDirs && hitBack <= needBack && hitBack + numDirs - d > needBack; d++) {\r\n const dx = dirs[d * 3];\r\n const dy = dirs[d * 3 + 1];\r\n const dz = dirs[d * 3 + 2];\r\n const t = bvh.rayNearestHit(\r\n x - dx * pullback,\r\n y - dy * pullback,\r\n z - dz * pullback,\r\n dx,\r\n dy,\r\n dz,\r\n tMax\r\n );\r\n if (t !== 0) {\r\n hit++;\r\n if (t < 0) {\r\n hitBack++;\r\n }\r\n }\r\n }\r\n side[index] = hit > 0 && hitBack > needBack ? 2 : 1;\r\n }\r\n }\r\n }\r\n // Regions beyond the band, six-connected\r\n const queue = new Int32Array(count);\r\n const region = new Int32Array(count).fill(-1);\r\n const strides = [1, nx, nx * ny];\r\n for (let seed = 0; seed < count; seed++) {\r\n if (side[seed] !== 0 || region[seed] >= 0) {\r\n continue;\r\n }\r\n let head = 0;\r\n let tail = 0;\r\n let border = false;\r\n let inside = 0;\r\n let outside = 0;\r\n queue[tail++] = seed;\r\n region[seed] = seed;\r\n while (head < tail) {\r\n const v = queue[head++];\r\n const vi = v % nx;\r\n const vj = ((v - vi) / nx) % ny;\r\n const vk = (v - vi - vj * nx) / (nx * ny);\r\n const coord = [vi, vj, vk];\r\n for (let axis = 0; axis < 3; axis++) {\r\n for (let step = -1; step <= 1; step += 2) {\r\n const c = coord[axis] + step;\r\n if (c < 0 || c >= resolution[axis]) {\r\n border = true;\r\n continue;\r\n }\r\n const w = v + step * strides[axis];\r\n const s = side[w];\r\n if (s === 0) {\r\n if (region[w] < 0) {\r\n region[w] = seed;\r\n queue[tail++] = w;\r\n }\r\n } else if (s === 2) {\r\n inside++;\r\n } else {\r\n outside++;\r\n }\r\n }\r\n }\r\n }\r\n if (!border && inside > outside) {\r\n for (let q = 0; q < tail; q++) {\r\n side[queue[q]] = 2;\r\n }\r\n }\r\n }\r\n for (let i = 0; i < count; i++) {\r\n if (side[i] === 2) {\r\n distances[i] = -distances[i];\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Trilinear sample of a baked field at a local position; outside the volume, the nearest border\r\n * sample plus the distance to the volume.\r\n * @public\r\n */\r\nexport function sampleMeshSDF(sdf: MeshSDFData, x: number, y: number, z: number) {\r\n const [nx, ny, nz] = sdf.resolution;\r\n const h = sdf.voxelSize;\r\n const cx = Math.min(Math.max(x, sdf.boxMin[0]), sdf.boxMax[0]);\r\n const cy = Math.min(Math.max(y, sdf.boxMin[1]), sdf.boxMax[1]);\r\n const cz = Math.min(Math.max(z, sdf.boxMin[2]), sdf.boxMax[2]);\r\n const outside = Math.hypot(x - cx, y - cy, z - cz);\r\n const fx = Math.min(Math.max((cx - sdf.boxMin[0]) / h - 0.5, 0), nx - 1);\r\n const fy = Math.min(Math.max((cy - sdf.boxMin[1]) / h - 0.5, 0), ny - 1);\r\n const fz = Math.min(Math.max((cz - sdf.boxMin[2]) / h - 0.5, 0), nz - 1);\r\n const i0 = Math.min(Math.floor(fx), nx - 2 < 0 ? 0 : nx - 2);\r\n const j0 = Math.min(Math.floor(fy), ny - 2 < 0 ? 0 : ny - 2);\r\n const k0 = Math.min(Math.floor(fz), nz - 2 < 0 ? 0 : nz - 2);\r\n const i1 = Math.min(i0 + 1, nx - 1);\r\n const j1 = Math.min(j0 + 1, ny - 1);\r\n const k1 = Math.min(k0 + 1, nz - 1);\r\n const tx = fx - i0;\r\n const ty = fy - j0;\r\n const tz = fz - k0;\r\n const d = sdf.distances;\r\n const at = (i: number, j: number, k: number) => d[(k * ny + j) * nx + i];\r\n const c00 = at(i0, j0, k0) * (1 - tx) + at(i1, j0, k0) * tx;\r\n const c10 = at(i0, j1, k0) * (1 - tx) + at(i1, j1, k0) * tx;\r\n const c01 = at(i0, j0, k1) * (1 - tx) + at(i1, j0, k1) * tx;\r\n const c11 = at(i0, j1, k1) * (1 - tx) + at(i1, j1, k1) * tx;\r\n const c0 = c00 * (1 - ty) + c10 * ty;\r\n const c1 = c01 * (1 - ty) + c11 * ty;\r\n return c0 * (1 - tz) + c1 * tz + outside;\r\n}\r\n"],"names":["SDF_VOXELS_PER_UNIT","SIGN_BAND_VOXELS","SIGN_TRACE_DIAGONALS","SIGN_BACK_FRACTION","SEED_MARGIN","computeUnsignedDistances","positions","indices","boxMin","resolution","h","nx","ny","nz","count","dist","Float32Array","fill","Infinity","tri","Int32Array","numTris","Math","floor","length","tmp","triDist","t","x","y","z","ia","ib","ic","closestPointOnTriangle","dx","dy","dz","lo","hi","k","v","c","min","max","i0","j0","k0","i1","ceil","j1","k1","j","o","i","d","strides","order","sx","sy","sz","kk","jj","ii","own","sqrt","bakeMeshSDF","options","scale","resolutionScale","twoSided","padding","maxRes","maxResolution","minRes","minResolution","meshMin","meshMax","numVerts","Error","extent","longest","unitScale","voxelSize","boxMax","size","bvh","TriangleBVH","distances","signDistances","signSamples","minDistance","maxDistance","meshBoxMin","meshBoxMax","makeRandom","seed","a","imul","sphereDirections","perHemisphere","dim","random","dirs","n","hemi","u","r","theta","abs","PI","r2","s","cos","sin","samples","numDirs","band","traceDistance","pullback","tMax","needBack","side","Uint8Array","index","hit","hitBack","rayNearestHit","queue","region","head","tail","border","inside","outside","vi","vj","vk","coord","axis","step","w","q","sampleMeshSDF","sdf","cx","cy","cz","hypot","fx","fy","fz","tx","ty","tz","at","c00","c10","c01","c11","c0","c1"],"mappings":"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"}
|
|
@@ -0,0 +1,576 @@
|
|
|
1
|
+
/** Most triangles a leaf holds. */ const LEAF_SIZE = 4;
|
|
2
|
+
/** Split candidates per axis for the surface area heuristic. */ const SAH_BINS = 12;
|
|
3
|
+
/**
|
|
4
|
+
* Immutable BVH over a triangle soup for CPU closest-point and ray queries. Nodes are flattened
|
|
5
|
+
* depth first (left child follows its parent, `offset` holds the right); a leaf has `count > 0`
|
|
6
|
+
* and covers `[first, first + count)` of {@link TriangleBVH.order}.
|
|
7
|
+
*
|
|
8
|
+
* @public
|
|
9
|
+
*/ class TriangleBVH {
|
|
10
|
+
/** Vertex positions, xyz per vertex. */ positions;
|
|
11
|
+
/** Three vertex indices per triangle. */ indices;
|
|
12
|
+
/** Triangle indices in leaf order. */ order;
|
|
13
|
+
/** Node bounds, minX minY minZ maxX maxY maxZ per node. */ bounds;
|
|
14
|
+
/** Per node: right child for an interior node, first triangle for a leaf. */ offset;
|
|
15
|
+
/** Per node: triangles in a leaf, 0 for an interior node. */ count;
|
|
16
|
+
_numNodes;
|
|
17
|
+
constructor(positions, indices){
|
|
18
|
+
this.positions = positions;
|
|
19
|
+
this.indices = indices;
|
|
20
|
+
const numTris = Math.floor(indices.length / 3);
|
|
21
|
+
this.order = new Uint32Array(numTris);
|
|
22
|
+
const maxNodes = Math.max(1, 2 * numTris);
|
|
23
|
+
this.bounds = new Float32Array(maxNodes * 6);
|
|
24
|
+
this.offset = new Uint32Array(maxNodes);
|
|
25
|
+
this.count = new Uint32Array(maxNodes);
|
|
26
|
+
this._numNodes = 0;
|
|
27
|
+
const centroids = new Float32Array(numTris * 3);
|
|
28
|
+
const triBounds = new Float32Array(numTris * 6);
|
|
29
|
+
for(let t = 0; t < numTris; t++){
|
|
30
|
+
this.order[t] = t;
|
|
31
|
+
let minX = Infinity;
|
|
32
|
+
let minY = Infinity;
|
|
33
|
+
let minZ = Infinity;
|
|
34
|
+
let maxX = -Infinity;
|
|
35
|
+
let maxY = -Infinity;
|
|
36
|
+
let maxZ = -Infinity;
|
|
37
|
+
for(let k = 0; k < 3; k++){
|
|
38
|
+
const v = indices[t * 3 + k] * 3;
|
|
39
|
+
const x = positions[v];
|
|
40
|
+
const y = positions[v + 1];
|
|
41
|
+
const z = positions[v + 2];
|
|
42
|
+
minX = Math.min(minX, x);
|
|
43
|
+
minY = Math.min(minY, y);
|
|
44
|
+
minZ = Math.min(minZ, z);
|
|
45
|
+
maxX = Math.max(maxX, x);
|
|
46
|
+
maxY = Math.max(maxY, y);
|
|
47
|
+
maxZ = Math.max(maxZ, z);
|
|
48
|
+
}
|
|
49
|
+
triBounds.set([
|
|
50
|
+
minX,
|
|
51
|
+
minY,
|
|
52
|
+
minZ,
|
|
53
|
+
maxX,
|
|
54
|
+
maxY,
|
|
55
|
+
maxZ
|
|
56
|
+
], t * 6);
|
|
57
|
+
centroids[t * 3] = (minX + maxX) * 0.5;
|
|
58
|
+
centroids[t * 3 + 1] = (minY + maxY) * 0.5;
|
|
59
|
+
centroids[t * 3 + 2] = (minZ + maxZ) * 0.5;
|
|
60
|
+
}
|
|
61
|
+
if (numTris > 0) {
|
|
62
|
+
this._build(0, numTris, centroids, triBounds);
|
|
63
|
+
} else {
|
|
64
|
+
this._numNodes = 1;
|
|
65
|
+
this.bounds.set([
|
|
66
|
+
0,
|
|
67
|
+
0,
|
|
68
|
+
0,
|
|
69
|
+
0,
|
|
70
|
+
0,
|
|
71
|
+
0
|
|
72
|
+
]);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/** Nodes in the tree. */ get numNodes() {
|
|
76
|
+
return this._numNodes;
|
|
77
|
+
}
|
|
78
|
+
/** Triangles in the tree. */ get numTriangles() {
|
|
79
|
+
return this.order.length;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Squared distance from a point to the nearest triangle, or `maxDistSq` when
|
|
83
|
+
* none is nearer than that.
|
|
84
|
+
* @param out - Receives the closest point when one is found nearer than `maxDistSq`.
|
|
85
|
+
*/ closestDistanceSq(px, py, pz, maxDistSq = Infinity, out) {
|
|
86
|
+
if (this.order.length === 0) {
|
|
87
|
+
return maxDistSq;
|
|
88
|
+
}
|
|
89
|
+
let best = maxDistSq;
|
|
90
|
+
const stack = this._stack;
|
|
91
|
+
let sp = 0;
|
|
92
|
+
stack[sp++] = 0;
|
|
93
|
+
while(sp > 0){
|
|
94
|
+
const node = stack[--sp];
|
|
95
|
+
if (boxDistSq(this.bounds, node, px, py, pz) >= best) {
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
const count = this.count[node];
|
|
99
|
+
if (count > 0) {
|
|
100
|
+
const first = this.offset[node];
|
|
101
|
+
for(let i = first; i < first + count; i++){
|
|
102
|
+
const d = this._triangleDistSq(this.order[i], px, py, pz);
|
|
103
|
+
if (d < best) {
|
|
104
|
+
best = d;
|
|
105
|
+
if (out) {
|
|
106
|
+
out[0] = this._closest[0];
|
|
107
|
+
out[1] = this._closest[1];
|
|
108
|
+
out[2] = this._closest[2];
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
} else {
|
|
113
|
+
// Nearer child last, so it is popped first and tightens `best` early
|
|
114
|
+
const left = node + 1;
|
|
115
|
+
const right = this.offset[node];
|
|
116
|
+
const dl = boxDistSq(this.bounds, left, px, py, pz);
|
|
117
|
+
const dr = boxDistSq(this.bounds, right, px, py, pz);
|
|
118
|
+
if (dl < dr) {
|
|
119
|
+
stack[sp++] = right;
|
|
120
|
+
stack[sp++] = left;
|
|
121
|
+
} else {
|
|
122
|
+
stack[sp++] = left;
|
|
123
|
+
stack[sp++] = right;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return best;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Every ray parameter `t > 0` at which a ray crosses a triangle, unsorted.
|
|
131
|
+
* @param dir - Ray direction; need not be unit length, `t` is in its units.
|
|
132
|
+
* @returns Number of hits written to `hits`, at most its length.
|
|
133
|
+
*/ rayHits(ox, oy, oz, dx, dy, dz, hits) {
|
|
134
|
+
if (this.order.length === 0) {
|
|
135
|
+
return 0;
|
|
136
|
+
}
|
|
137
|
+
const ix = 1 / dx;
|
|
138
|
+
const iy = 1 / dy;
|
|
139
|
+
const iz = 1 / dz;
|
|
140
|
+
const stack = this._stack;
|
|
141
|
+
let sp = 0;
|
|
142
|
+
let n = 0;
|
|
143
|
+
stack[sp++] = 0;
|
|
144
|
+
while(sp > 0){
|
|
145
|
+
const node = stack[--sp];
|
|
146
|
+
if (!rayHitsBox(this.bounds, node, ox, oy, oz, ix, iy, iz)) {
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
const count = this.count[node];
|
|
150
|
+
if (count > 0) {
|
|
151
|
+
const first = this.offset[node];
|
|
152
|
+
for(let i = first; i < first + count && n < hits.length; i++){
|
|
153
|
+
const t = this._rayTriangle(this.order[i], ox, oy, oz, dx, dy, dz);
|
|
154
|
+
if (t > 0) {
|
|
155
|
+
hits[n++] = t;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
} else {
|
|
159
|
+
stack[sp++] = node + 1;
|
|
160
|
+
stack[sp++] = this.offset[node];
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return n;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* The nearest triangle a ray crosses within `tMax`.
|
|
167
|
+
* @param dir - Unit ray direction.
|
|
168
|
+
* @returns The hit's ray parameter, negated for a back face (winding normal along `dir`);
|
|
169
|
+
* 0 when nothing is hit within `tMax`.
|
|
170
|
+
*/ rayNearestHit(ox, oy, oz, dx, dy, dz, tMax) {
|
|
171
|
+
if (this.order.length === 0) {
|
|
172
|
+
return 0;
|
|
173
|
+
}
|
|
174
|
+
const ix = 1 / dx;
|
|
175
|
+
const iy = 1 / dy;
|
|
176
|
+
const iz = 1 / dz;
|
|
177
|
+
const stack = this._stack;
|
|
178
|
+
let sp = 0;
|
|
179
|
+
let best = tMax;
|
|
180
|
+
let back = false;
|
|
181
|
+
stack[sp++] = 0;
|
|
182
|
+
while(sp > 0){
|
|
183
|
+
const node = stack[--sp];
|
|
184
|
+
if (rayBoxEntry(this.bounds, node, ox, oy, oz, ix, iy, iz) > best) {
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
const count = this.count[node];
|
|
188
|
+
if (count > 0) {
|
|
189
|
+
const first = this.offset[node];
|
|
190
|
+
for(let i = first; i < first + count; i++){
|
|
191
|
+
const t = this._rayTriangle(this.order[i], ox, oy, oz, dx, dy, dz);
|
|
192
|
+
if (t > 0 && t <= best) {
|
|
193
|
+
best = t;
|
|
194
|
+
back = this._lastHitBack;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
} else {
|
|
198
|
+
stack[sp++] = node + 1;
|
|
199
|
+
stack[sp++] = this.offset[node];
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return best < tMax ? back ? -best : best : 0;
|
|
203
|
+
}
|
|
204
|
+
_stack = new Uint32Array(256);
|
|
205
|
+
_closest = new Float32Array(3);
|
|
206
|
+
/** Whether the last triangle `_rayTriangle` hit faced away from the ray. */ _lastHitBack = false;
|
|
207
|
+
/** @internal */ _build(first, count, centroids, triBounds) {
|
|
208
|
+
const node = this._numNodes++;
|
|
209
|
+
const b = this.bounds;
|
|
210
|
+
let minX = Infinity;
|
|
211
|
+
let minY = Infinity;
|
|
212
|
+
let minZ = Infinity;
|
|
213
|
+
let maxX = -Infinity;
|
|
214
|
+
let maxY = -Infinity;
|
|
215
|
+
let maxZ = -Infinity;
|
|
216
|
+
let cMinX = Infinity;
|
|
217
|
+
let cMinY = Infinity;
|
|
218
|
+
let cMinZ = Infinity;
|
|
219
|
+
let cMaxX = -Infinity;
|
|
220
|
+
let cMaxY = -Infinity;
|
|
221
|
+
let cMaxZ = -Infinity;
|
|
222
|
+
for(let i = first; i < first + count; i++){
|
|
223
|
+
const t = this.order[i];
|
|
224
|
+
minX = Math.min(minX, triBounds[t * 6]);
|
|
225
|
+
minY = Math.min(minY, triBounds[t * 6 + 1]);
|
|
226
|
+
minZ = Math.min(minZ, triBounds[t * 6 + 2]);
|
|
227
|
+
maxX = Math.max(maxX, triBounds[t * 6 + 3]);
|
|
228
|
+
maxY = Math.max(maxY, triBounds[t * 6 + 4]);
|
|
229
|
+
maxZ = Math.max(maxZ, triBounds[t * 6 + 5]);
|
|
230
|
+
cMinX = Math.min(cMinX, centroids[t * 3]);
|
|
231
|
+
cMinY = Math.min(cMinY, centroids[t * 3 + 1]);
|
|
232
|
+
cMinZ = Math.min(cMinZ, centroids[t * 3 + 2]);
|
|
233
|
+
cMaxX = Math.max(cMaxX, centroids[t * 3]);
|
|
234
|
+
cMaxY = Math.max(cMaxY, centroids[t * 3 + 1]);
|
|
235
|
+
cMaxZ = Math.max(cMaxZ, centroids[t * 3 + 2]);
|
|
236
|
+
}
|
|
237
|
+
b[node * 6] = minX;
|
|
238
|
+
b[node * 6 + 1] = minY;
|
|
239
|
+
b[node * 6 + 2] = minZ;
|
|
240
|
+
b[node * 6 + 3] = maxX;
|
|
241
|
+
b[node * 6 + 4] = maxY;
|
|
242
|
+
b[node * 6 + 5] = maxZ;
|
|
243
|
+
const extents = [
|
|
244
|
+
cMaxX - cMinX,
|
|
245
|
+
cMaxY - cMinY,
|
|
246
|
+
cMaxZ - cMinZ
|
|
247
|
+
];
|
|
248
|
+
const cMin = [
|
|
249
|
+
cMinX,
|
|
250
|
+
cMinY,
|
|
251
|
+
cMinZ
|
|
252
|
+
];
|
|
253
|
+
const split = count > LEAF_SIZE ? this._findSplit(first, count, centroids, triBounds, cMin, extents, [
|
|
254
|
+
minX,
|
|
255
|
+
minY,
|
|
256
|
+
minZ,
|
|
257
|
+
maxX,
|
|
258
|
+
maxY,
|
|
259
|
+
maxZ
|
|
260
|
+
]) : null;
|
|
261
|
+
if (!split) {
|
|
262
|
+
this.offset[node] = first;
|
|
263
|
+
this.count[node] = count;
|
|
264
|
+
return node;
|
|
265
|
+
}
|
|
266
|
+
// Partition in place around the chosen bin boundary
|
|
267
|
+
const { axis, pos } = split;
|
|
268
|
+
let i = first;
|
|
269
|
+
let j = first + count - 1;
|
|
270
|
+
while(i <= j){
|
|
271
|
+
if (centroids[this.order[i] * 3 + axis] < pos) {
|
|
272
|
+
i++;
|
|
273
|
+
} else {
|
|
274
|
+
const tmp = this.order[i];
|
|
275
|
+
this.order[i] = this.order[j];
|
|
276
|
+
this.order[j] = tmp;
|
|
277
|
+
j--;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
let leftCount = i - first;
|
|
281
|
+
if (leftCount === 0 || leftCount === count) {
|
|
282
|
+
leftCount = count >> 1;
|
|
283
|
+
}
|
|
284
|
+
this.count[node] = 0;
|
|
285
|
+
this._build(first, leftCount, centroids, triBounds);
|
|
286
|
+
this.offset[node] = this._build(first + leftCount, count - leftCount, centroids, triBounds);
|
|
287
|
+
return node;
|
|
288
|
+
}
|
|
289
|
+
/** Binned SAH; null when no split beats a leaf. @internal */ _findSplit(first, count, centroids, triBounds, cMin, extents, nodeBounds) {
|
|
290
|
+
let bestCost = count;
|
|
291
|
+
let bestAxis = -1;
|
|
292
|
+
let bestPos = 0;
|
|
293
|
+
const binCount = new Uint32Array(SAH_BINS);
|
|
294
|
+
const binBounds = new Float32Array(SAH_BINS * 6);
|
|
295
|
+
const rightArea = new Float32Array(SAH_BINS);
|
|
296
|
+
for(let axis = 0; axis < 3; axis++){
|
|
297
|
+
if (extents[axis] <= 1e-12) {
|
|
298
|
+
continue;
|
|
299
|
+
}
|
|
300
|
+
binCount.fill(0);
|
|
301
|
+
for(let k = 0; k < SAH_BINS; k++){
|
|
302
|
+
binBounds.set([
|
|
303
|
+
Infinity,
|
|
304
|
+
Infinity,
|
|
305
|
+
Infinity,
|
|
306
|
+
-Infinity,
|
|
307
|
+
-Infinity,
|
|
308
|
+
-Infinity
|
|
309
|
+
], k * 6);
|
|
310
|
+
}
|
|
311
|
+
const scale = SAH_BINS / extents[axis];
|
|
312
|
+
for(let i = first; i < first + count; i++){
|
|
313
|
+
const t = this.order[i];
|
|
314
|
+
const k = Math.min(SAH_BINS - 1, Math.floor((centroids[t * 3 + axis] - cMin[axis]) * scale));
|
|
315
|
+
binCount[k]++;
|
|
316
|
+
for(let c = 0; c < 3; c++){
|
|
317
|
+
binBounds[k * 6 + c] = Math.min(binBounds[k * 6 + c], triBounds[t * 6 + c]);
|
|
318
|
+
binBounds[k * 6 + 3 + c] = Math.max(binBounds[k * 6 + 3 + c], triBounds[t * 6 + 3 + c]);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
// Sweep from the right for the area of everything past each boundary
|
|
322
|
+
const acc = [
|
|
323
|
+
Infinity,
|
|
324
|
+
Infinity,
|
|
325
|
+
Infinity,
|
|
326
|
+
-Infinity,
|
|
327
|
+
-Infinity,
|
|
328
|
+
-Infinity
|
|
329
|
+
];
|
|
330
|
+
let accCount = 0;
|
|
331
|
+
const rightCount = new Uint32Array(SAH_BINS);
|
|
332
|
+
for(let k = SAH_BINS - 1; k > 0; k--){
|
|
333
|
+
grow(acc, binBounds, k);
|
|
334
|
+
accCount += binCount[k];
|
|
335
|
+
rightArea[k] = area(acc);
|
|
336
|
+
rightCount[k] = accCount;
|
|
337
|
+
}
|
|
338
|
+
const left = [
|
|
339
|
+
Infinity,
|
|
340
|
+
Infinity,
|
|
341
|
+
Infinity,
|
|
342
|
+
-Infinity,
|
|
343
|
+
-Infinity,
|
|
344
|
+
-Infinity
|
|
345
|
+
];
|
|
346
|
+
let leftCount = 0;
|
|
347
|
+
const parentArea = Math.max(area(nodeBounds), 1e-12);
|
|
348
|
+
for(let k = 1; k < SAH_BINS; k++){
|
|
349
|
+
grow(left, binBounds, k - 1);
|
|
350
|
+
leftCount += binCount[k - 1];
|
|
351
|
+
if (leftCount === 0 || rightCount[k] === 0) {
|
|
352
|
+
continue;
|
|
353
|
+
}
|
|
354
|
+
const cost = 0.125 + (area(left) * leftCount + rightArea[k] * rightCount[k]) / parentArea;
|
|
355
|
+
if (cost < bestCost) {
|
|
356
|
+
bestCost = cost;
|
|
357
|
+
bestAxis = axis;
|
|
358
|
+
bestPos = cMin[axis] + k * extents[axis] / SAH_BINS;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
return bestAxis < 0 ? null : {
|
|
363
|
+
axis: bestAxis,
|
|
364
|
+
pos: bestPos
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
/** @internal */ _triangleDistSq(t, px, py, pz) {
|
|
368
|
+
const p = this.positions;
|
|
369
|
+
const ia = this.indices[t * 3] * 3;
|
|
370
|
+
const ib = this.indices[t * 3 + 1] * 3;
|
|
371
|
+
const ic = this.indices[t * 3 + 2] * 3;
|
|
372
|
+
closestPointOnTriangle(px, py, pz, p[ia], p[ia + 1], p[ia + 2], p[ib], p[ib + 1], p[ib + 2], p[ic], p[ic + 1], p[ic + 2], this._closest);
|
|
373
|
+
const dx = this._closest[0] - px;
|
|
374
|
+
const dy = this._closest[1] - py;
|
|
375
|
+
const dz = this._closest[2] - pz;
|
|
376
|
+
return dx * dx + dy * dy + dz * dz;
|
|
377
|
+
}
|
|
378
|
+
/** Möller-Trumbore, both faces; 0 for a miss. @internal */ _rayTriangle(t, ox, oy, oz, dx, dy, dz) {
|
|
379
|
+
const p = this.positions;
|
|
380
|
+
const ia = this.indices[t * 3] * 3;
|
|
381
|
+
const ib = this.indices[t * 3 + 1] * 3;
|
|
382
|
+
const ic = this.indices[t * 3 + 2] * 3;
|
|
383
|
+
const ax = p[ia];
|
|
384
|
+
const ay = p[ia + 1];
|
|
385
|
+
const az = p[ia + 2];
|
|
386
|
+
const e1x = p[ib] - ax;
|
|
387
|
+
const e1y = p[ib + 1] - ay;
|
|
388
|
+
const e1z = p[ib + 2] - az;
|
|
389
|
+
const e2x = p[ic] - ax;
|
|
390
|
+
const e2y = p[ic + 1] - ay;
|
|
391
|
+
const e2z = p[ic + 2] - az;
|
|
392
|
+
const qx = dy * e2z - dz * e2y;
|
|
393
|
+
const qy = dz * e2x - dx * e2z;
|
|
394
|
+
const qz = dx * e2y - dy * e2x;
|
|
395
|
+
const det = e1x * qx + e1y * qy + e1z * qz;
|
|
396
|
+
if (Math.abs(det) < 1e-20) {
|
|
397
|
+
return 0;
|
|
398
|
+
}
|
|
399
|
+
// det = -dir . (e1 x e2): negative when the ray runs along the winding normal
|
|
400
|
+
this._lastHitBack = det < 0;
|
|
401
|
+
const inv = 1 / det;
|
|
402
|
+
const sx = ox - ax;
|
|
403
|
+
const sy = oy - ay;
|
|
404
|
+
const sz = oz - az;
|
|
405
|
+
const u = (sx * qx + sy * qy + sz * qz) * inv;
|
|
406
|
+
if (u < 0 || u > 1) {
|
|
407
|
+
return 0;
|
|
408
|
+
}
|
|
409
|
+
const rx = sy * e1z - sz * e1y;
|
|
410
|
+
const ry = sz * e1x - sx * e1z;
|
|
411
|
+
const rz = sx * e1y - sy * e1x;
|
|
412
|
+
const v = (dx * rx + dy * ry + dz * rz) * inv;
|
|
413
|
+
if (v < 0 || u + v > 1) {
|
|
414
|
+
return 0;
|
|
415
|
+
}
|
|
416
|
+
const tt = (e2x * rx + e2y * ry + e2z * rz) * inv;
|
|
417
|
+
return tt > 0 ? tt : 0;
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
function nanTo(v, fallback) {
|
|
421
|
+
return v !== v ? fallback : v;
|
|
422
|
+
}
|
|
423
|
+
function grow(acc, b, k) {
|
|
424
|
+
if (b[k * 6] > b[k * 6 + 3]) {
|
|
425
|
+
return;
|
|
426
|
+
}
|
|
427
|
+
for(let c = 0; c < 3; c++){
|
|
428
|
+
acc[c] = Math.min(acc[c], b[k * 6 + c]);
|
|
429
|
+
acc[3 + c] = Math.max(acc[3 + c], b[k * 6 + 3 + c]);
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
function area(b) {
|
|
433
|
+
const x = b[3] - b[0];
|
|
434
|
+
const y = b[4] - b[1];
|
|
435
|
+
const z = b[5] - b[2];
|
|
436
|
+
return x < 0 || y < 0 || z < 0 ? 0 : 2 * (x * y + y * z + z * x);
|
|
437
|
+
}
|
|
438
|
+
function boxDistSq(b, node, px, py, pz) {
|
|
439
|
+
const o = node * 6;
|
|
440
|
+
const dx = Math.max(b[o] - px, 0, px - b[o + 3]);
|
|
441
|
+
const dy = Math.max(b[o + 1] - py, 0, py - b[o + 4]);
|
|
442
|
+
const dz = Math.max(b[o + 2] - pz, 0, pz - b[o + 5]);
|
|
443
|
+
return dx * dx + dy * dy + dz * dz;
|
|
444
|
+
}
|
|
445
|
+
/** Ray parameter at which a ray enters node bounds, Infinity when it misses them. */ function rayBoxEntry(b, node, ox, oy, oz, ix, iy, iz) {
|
|
446
|
+
const o = node * 6;
|
|
447
|
+
let t0x = (b[o] - ox) * ix;
|
|
448
|
+
let t1x = (b[o + 3] - ox) * ix;
|
|
449
|
+
if (t0x > t1x) {
|
|
450
|
+
const t = t0x;
|
|
451
|
+
t0x = t1x;
|
|
452
|
+
t1x = t;
|
|
453
|
+
}
|
|
454
|
+
let t0y = (b[o + 1] - oy) * iy;
|
|
455
|
+
let t1y = (b[o + 4] - oy) * iy;
|
|
456
|
+
if (t0y > t1y) {
|
|
457
|
+
const t = t0y;
|
|
458
|
+
t0y = t1y;
|
|
459
|
+
t1y = t;
|
|
460
|
+
}
|
|
461
|
+
let t0z = (b[o + 2] - oz) * iz;
|
|
462
|
+
let t1z = (b[o + 5] - oz) * iz;
|
|
463
|
+
if (t0z > t1z) {
|
|
464
|
+
const t = t0z;
|
|
465
|
+
t0z = t1z;
|
|
466
|
+
t1z = t;
|
|
467
|
+
}
|
|
468
|
+
const tNear = Math.max(nanTo(t0x, -Infinity), nanTo(t0y, -Infinity), nanTo(t0z, -Infinity), 0);
|
|
469
|
+
const tFar = Math.min(nanTo(t1x, Infinity), nanTo(t1y, Infinity), nanTo(t1z, Infinity));
|
|
470
|
+
return tNear <= tFar ? tNear : Infinity;
|
|
471
|
+
}
|
|
472
|
+
function rayHitsBox(b, node, ox, oy, oz, ix, iy, iz) {
|
|
473
|
+
const o = node * 6;
|
|
474
|
+
let t0x = (b[o] - ox) * ix;
|
|
475
|
+
let t1x = (b[o + 3] - ox) * ix;
|
|
476
|
+
if (t0x > t1x) {
|
|
477
|
+
const t = t0x;
|
|
478
|
+
t0x = t1x;
|
|
479
|
+
t1x = t;
|
|
480
|
+
}
|
|
481
|
+
let t0y = (b[o + 1] - oy) * iy;
|
|
482
|
+
let t1y = (b[o + 4] - oy) * iy;
|
|
483
|
+
if (t0y > t1y) {
|
|
484
|
+
const t = t0y;
|
|
485
|
+
t0y = t1y;
|
|
486
|
+
t1y = t;
|
|
487
|
+
}
|
|
488
|
+
let t0z = (b[o + 2] - oz) * iz;
|
|
489
|
+
let t1z = (b[o + 5] - oz) * iz;
|
|
490
|
+
if (t0z > t1z) {
|
|
491
|
+
const t = t0z;
|
|
492
|
+
t0z = t1z;
|
|
493
|
+
t1z = t;
|
|
494
|
+
}
|
|
495
|
+
// NaN from 0 * Infinity (origin on a slab face of an axis-parallel ray) is no constraint
|
|
496
|
+
const tNear = Math.max(nanTo(t0x, -Infinity), nanTo(t0y, -Infinity), nanTo(t0z, -Infinity), 0);
|
|
497
|
+
const tFar = Math.min(nanTo(t1x, Infinity), nanTo(t1y, Infinity), nanTo(t1z, Infinity));
|
|
498
|
+
return tNear <= tFar;
|
|
499
|
+
}
|
|
500
|
+
/**
|
|
501
|
+
* Closest point on triangle abc to p (Ericson, Real-Time Collision Detection 5.1.5).
|
|
502
|
+
* @internal
|
|
503
|
+
*/ function closestPointOnTriangle(px, py, pz, ax, ay, az, bx, by, bz, cx, cy, cz, out) {
|
|
504
|
+
const abx = bx - ax;
|
|
505
|
+
const aby = by - ay;
|
|
506
|
+
const abz = bz - az;
|
|
507
|
+
const acx = cx - ax;
|
|
508
|
+
const acy = cy - ay;
|
|
509
|
+
const acz = cz - az;
|
|
510
|
+
const apx = px - ax;
|
|
511
|
+
const apy = py - ay;
|
|
512
|
+
const apz = pz - az;
|
|
513
|
+
const d1 = abx * apx + aby * apy + abz * apz;
|
|
514
|
+
const d2 = acx * apx + acy * apy + acz * apz;
|
|
515
|
+
if (d1 <= 0 && d2 <= 0) {
|
|
516
|
+
out[0] = ax;
|
|
517
|
+
out[1] = ay;
|
|
518
|
+
out[2] = az;
|
|
519
|
+
return;
|
|
520
|
+
}
|
|
521
|
+
const bpx = px - bx;
|
|
522
|
+
const bpy = py - by;
|
|
523
|
+
const bpz = pz - bz;
|
|
524
|
+
const d3 = abx * bpx + aby * bpy + abz * bpz;
|
|
525
|
+
const d4 = acx * bpx + acy * bpy + acz * bpz;
|
|
526
|
+
if (d3 >= 0 && d4 <= d3) {
|
|
527
|
+
out[0] = bx;
|
|
528
|
+
out[1] = by;
|
|
529
|
+
out[2] = bz;
|
|
530
|
+
return;
|
|
531
|
+
}
|
|
532
|
+
const vc = d1 * d4 - d3 * d2;
|
|
533
|
+
if (vc <= 0 && d1 >= 0 && d3 <= 0) {
|
|
534
|
+
const v = d1 / (d1 - d3);
|
|
535
|
+
out[0] = ax + v * abx;
|
|
536
|
+
out[1] = ay + v * aby;
|
|
537
|
+
out[2] = az + v * abz;
|
|
538
|
+
return;
|
|
539
|
+
}
|
|
540
|
+
const cpx = px - cx;
|
|
541
|
+
const cpy = py - cy;
|
|
542
|
+
const cpz = pz - cz;
|
|
543
|
+
const d5 = abx * cpx + aby * cpy + abz * cpz;
|
|
544
|
+
const d6 = acx * cpx + acy * cpy + acz * cpz;
|
|
545
|
+
if (d6 >= 0 && d5 <= d6) {
|
|
546
|
+
out[0] = cx;
|
|
547
|
+
out[1] = cy;
|
|
548
|
+
out[2] = cz;
|
|
549
|
+
return;
|
|
550
|
+
}
|
|
551
|
+
const vb = d5 * d2 - d1 * d6;
|
|
552
|
+
if (vb <= 0 && d2 >= 0 && d6 <= 0) {
|
|
553
|
+
const w = d2 / (d2 - d6);
|
|
554
|
+
out[0] = ax + w * acx;
|
|
555
|
+
out[1] = ay + w * acy;
|
|
556
|
+
out[2] = az + w * acz;
|
|
557
|
+
return;
|
|
558
|
+
}
|
|
559
|
+
const va = d3 * d6 - d5 * d4;
|
|
560
|
+
if (va <= 0 && d4 - d3 >= 0 && d5 - d6 >= 0) {
|
|
561
|
+
const w = (d4 - d3) / (d4 - d3 + (d5 - d6));
|
|
562
|
+
out[0] = bx + w * (cx - bx);
|
|
563
|
+
out[1] = by + w * (cy - by);
|
|
564
|
+
out[2] = bz + w * (cz - bz);
|
|
565
|
+
return;
|
|
566
|
+
}
|
|
567
|
+
const denom = 1 / (va + vb + vc);
|
|
568
|
+
const v = vb * denom;
|
|
569
|
+
const w = vc * denom;
|
|
570
|
+
out[0] = ax + abx * v + acx * w;
|
|
571
|
+
out[1] = ay + aby * v + acy * w;
|
|
572
|
+
out[2] = az + abz * v + acz * w;
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
export { TriangleBVH, closestPointOnTriangle };
|
|
576
|
+
//# sourceMappingURL=bvh.js.map
|