@woosh/meep-engine 3.69.0 → 3.70.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/CHANGELOG.md +30 -1
- package/build/bundle-worker-terrain.js +1 -1
- package/package.json +1 -1
- package/src/core/bvh8/build/BVH8Converter.d.ts +16 -0
- package/src/core/bvh8/build/BVH8Converter.d.ts.map +1 -1
- package/src/core/bvh8/build/BVH8Converter.js +64 -37
- package/src/core/bvh8/build/bvh8_assign_slots_greedy.d.ts +25 -0
- package/src/core/bvh8/build/bvh8_assign_slots_greedy.d.ts.map +1 -0
- package/src/core/bvh8/build/bvh8_assign_slots_greedy.js +68 -0
- package/src/core/bvh8/build/bvh8_from_proxy.d.ts.map +1 -1
- package/src/core/bvh8/build/bvh8_from_proxy.js +2 -33
- package/src/core/bvh8/build/bvh8_node_fit_slots.d.ts +22 -0
- package/src/core/bvh8/build/bvh8_node_fit_slots.d.ts.map +1 -0
- package/src/core/bvh8/build/bvh8_node_fit_slots.js +115 -0
- package/src/core/bvh8/bvh8_depth.d.ts +8 -0
- package/src/core/bvh8/bvh8_depth.d.ts.map +1 -0
- package/src/core/bvh8/bvh8_depth.js +39 -0
- package/src/core/math/complex/complex_fft_radix2.d.ts +19 -0
- package/src/core/math/complex/complex_fft_radix2.d.ts.map +1 -0
- package/src/core/math/complex/complex_fft_radix2.js +71 -0
- package/src/engine/graphics3/GPUFluidSystem.d.ts +17 -4
- package/src/engine/graphics3/GPUFluidSystem.d.ts.map +1 -1
- package/src/engine/graphics3/GPUFluidSystem.js +113 -16
- package/src/engine/physics/cloth/playground/wind_main.js +7 -6
- package/src/engine/physics/cloth/wind/AbstractClothWind.d.ts +2 -2
- package/src/engine/physics/cloth/wind/AbstractClothWind.js +2 -2
- package/src/engine/physics/cloth/wind/ClothFluidWind.d.ts +3 -3
- package/src/engine/physics/cloth/wind/ClothFluidWind.d.ts.map +1 -1
- package/src/engine/physics/cloth/wind/ClothFluidWind.js +7 -9
- package/src/engine/physics/cloth/wind/ClothGPUFluidWind.d.ts +10 -10
- package/src/engine/physics/cloth/wind/ClothGPUFluidWind.d.ts.map +1 -1
- package/src/engine/physics/cloth/wind/ClothGPUFluidWind.js +14 -22
- package/src/engine/physics/fluid/FluidAtmosphere.d.ts +16 -2
- package/src/engine/physics/fluid/FluidAtmosphere.d.ts.map +1 -1
- package/src/engine/physics/fluid/FluidAtmosphere.js +17 -3
- package/src/engine/physics/fluid/ecs/FluidEffectorsComponentSerializationAdapter.d.ts +1 -2
- package/src/engine/physics/fluid/ecs/FluidEffectorsComponentSerializationAdapter.d.ts.map +1 -1
- package/src/engine/physics/fluid/ecs/FluidEffectorsComponentSerializationAdapter.js +1 -2
- package/src/engine/physics/fluid/ecs/FluidEffectorsSystem.d.ts +8 -5
- package/src/engine/physics/fluid/ecs/FluidEffectorsSystem.d.ts.map +1 -1
- package/src/engine/physics/fluid/ecs/FluidEffectorsSystem.js +60 -17
- package/src/engine/physics/fluid/effector/AbstractFluidEffector.d.ts +1 -1
- package/src/engine/physics/fluid/effector/AbstractFluidEffector.js +1 -1
- package/src/engine/physics/fluid/effector/GlobalFluidEffector.d.ts +33 -47
- package/src/engine/physics/fluid/effector/GlobalFluidEffector.d.ts.map +1 -1
- package/src/engine/physics/fluid/effector/GlobalFluidEffector.js +38 -176
- package/src/engine/physics/fluid/effector/GlobalFluidEffectorSerializationAdapter.d.ts +8 -11
- package/src/engine/physics/fluid/effector/GlobalFluidEffectorSerializationAdapter.d.ts.map +1 -1
- package/src/engine/physics/fluid/effector/GlobalFluidEffectorSerializationAdapter.js +13 -24
- package/src/engine/physics/fluid/effector/GlobalFluidEffectorSerializationUpgrader_0_1.d.ts +16 -0
- package/src/engine/physics/fluid/effector/GlobalFluidEffectorSerializationUpgrader_0_1.d.ts.map +1 -0
- package/src/engine/physics/fluid/effector/GlobalFluidEffectorSerializationUpgrader_0_1.js +35 -0
- package/src/engine/physics/fluid/fluid_apply_atmosphere.d.ts +1 -1
- package/src/engine/physics/fluid/fluid_apply_atmosphere.js +1 -1
- package/src/engine/physics/fluid/turbulence/FLUID_TURBULENCE_TILE.d.ts +28 -0
- package/src/engine/physics/fluid/turbulence/FLUID_TURBULENCE_TILE.d.ts.map +1 -0
- package/src/engine/physics/fluid/turbulence/FLUID_TURBULENCE_TILE.js +29 -0
- package/src/engine/physics/fluid/turbulence/fluid_atmosphere_velocity_at.d.ts +16 -0
- package/src/engine/physics/fluid/turbulence/fluid_atmosphere_velocity_at.d.ts.map +1 -0
- package/src/engine/physics/fluid/turbulence/fluid_atmosphere_velocity_at.js +49 -0
- package/src/engine/physics/fluid/turbulence/fluid_turbulence_inverse_tile_size.d.ts +11 -0
- package/src/engine/physics/fluid/turbulence/fluid_turbulence_inverse_tile_size.d.ts.map +1 -0
- package/src/engine/physics/fluid/turbulence/fluid_turbulence_inverse_tile_size.js +18 -0
- package/src/engine/physics/fluid/turbulence/fluid_turbulence_tile_data.d.ts +25 -0
- package/src/engine/physics/fluid/turbulence/fluid_turbulence_tile_data.d.ts.map +1 -0
- package/src/engine/physics/fluid/turbulence/fluid_turbulence_tile_data.js +65 -0
- package/src/engine/physics/fluid/turbulence/fluid_turbulence_tile_generate.d.ts +56 -0
- package/src/engine/physics/fluid/turbulence/fluid_turbulence_tile_generate.d.ts.map +1 -0
- package/src/engine/physics/fluid/turbulence/fluid_turbulence_tile_generate.js +313 -0
- package/src/engine/physics/fluid/turbulence/fluid_turbulence_tile_sample.d.ts +16 -0
- package/src/engine/physics/fluid/turbulence/fluid_turbulence_tile_sample.d.ts.map +1 -0
- package/src/engine/physics/fluid/turbulence/fluid_turbulence_tile_sample.js +69 -0
- package/src/generation/foliage/mesh/branch_ring_triangulate.d.ts +1 -1
- package/src/generation/foliage/mesh/branch_ring_triangulate.js +1 -1
- package/src/shade/playground/bvh_repro/README.md +8 -6
- package/src/shade/playground/bvh_repro/index.html +125 -124
- package/src/shade/playground/bvh_repro/main.js +259 -254
- package/src/shade/playground/foliage_wind/foliage_world.d.ts.map +1 -1
- package/src/shade/playground/foliage_wind/foliage_world.js +7 -4
- package/src/shade/playground/grass_surfaces/main.js +3 -2
- package/src/shade/playground/particle_ecs/bonfire_wind.d.ts +23 -13
- package/src/shade/playground/particle_ecs/bonfire_wind.d.ts.map +1 -1
- package/src/shade/playground/particle_ecs/bonfire_wind.js +30 -33
- package/src/shade/playground/skinned_blas_refit/README.md +26 -14
- package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.d.ts +14 -9
- package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.js +126 -127
- package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.js +95 -95
- package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.d.ts +9 -1
- package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.js +146 -135
- package/src/shade/playground/skinned_blas_refit/verify_clone_leaves.d.ts +6 -6
- package/src/shade/playground/skinned_blas_refit/verify_clone_leaves.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/verify_clone_leaves.js +148 -134
- package/src/shade/playground/skinned_blas_refit/verify_leaf_triangles.d.ts +11 -8
- package/src/shade/playground/skinned_blas_refit/verify_leaf_triangles.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/verify_leaf_triangles.js +342 -202
- package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.d.ts +12 -13
- package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.js +136 -116
- package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.d.ts +4 -4
- package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.js +255 -249
- package/src/shade/playground/water_surface/main.js +6 -3
- package/src/shade/renderer/animation/GPUAnimationManager.js +2 -2
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +7 -8
- package/src/shade/renderer/fluid/FLUID_FAR_FIELD_STRUCT.d.ts +111 -0
- package/src/shade/renderer/fluid/FLUID_FAR_FIELD_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/fluid/FLUID_FAR_FIELD_STRUCT.js +162 -0
- package/src/shade/renderer/fluid/GPUFluidCascade.d.ts +37 -8
- package/src/shade/renderer/fluid/GPUFluidCascade.d.ts.map +1 -1
- package/src/shade/renderer/fluid/GPUFluidCascade.js +149 -47
- package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts +10 -3
- package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts.map +1 -1
- package/src/shade/renderer/fluid/GPUFluidCascadeStack.js +69 -10
- package/src/shade/renderer/fluid/chunk_fluid_far_field.d.ts +19 -0
- package/src/shade/renderer/fluid/chunk_fluid_far_field.d.ts.map +1 -0
- package/src/shade/renderer/fluid/chunk_fluid_far_field.js +43 -0
- package/src/shade/renderer/fluid/coupling/FLUID_CASCADE_PARENT_STRUCT.d.ts +10 -9
- package/src/shade/renderer/fluid/coupling/FLUID_CASCADE_PARENT_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/fluid/coupling/FLUID_CASCADE_PARENT_STRUCT.js +14 -12
- package/src/shade/renderer/fluid/coupling/FLUID_CASCADE_RESTRICT_STRUCT.d.ts +3 -2
- package/src/shade/renderer/fluid/coupling/FLUID_CASCADE_RESTRICT_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/fluid/coupling/FLUID_CASCADE_RESTRICT_STRUCT.js +7 -5
- package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_epilogue.d.ts +17 -9
- package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_epilogue.d.ts.map +1 -1
- package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_epilogue.js +58 -18
- package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_parent.d.ts +23 -11
- package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_parent.d.ts.map +1 -1
- package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_parent.js +371 -335
- package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_fill.d.ts.map +1 -1
- package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_fill.js +2 -1
- package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_ghosts.d.ts.map +1 -1
- package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_ghosts.js +109 -108
- package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_restrict.d.ts +5 -3
- package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_restrict.d.ts.map +1 -1
- package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_restrict.js +24 -12
- package/src/shade/renderer/fluid/mac/FLUID_MAC_STEP_STRUCT.d.ts +6 -2
- package/src/shade/renderer/fluid/mac/FLUID_MAC_STEP_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/fluid/mac/FLUID_MAC_STEP_STRUCT.js +10 -5
- package/src/shade/renderer/fluid/mac/FluidMacPasses.d.ts +20 -21
- package/src/shade/renderer/fluid/mac/FluidMacPasses.d.ts.map +1 -1
- package/src/shade/renderer/fluid/mac/FluidMacPasses.js +453 -427
- package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.d.ts.map +1 -1
- package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.js +2 -1
- package/src/shade/renderer/fluid/publish/FluidWindPublish.d.ts +13 -5
- package/src/shade/renderer/fluid/publish/FluidWindPublish.d.ts.map +1 -1
- package/src/shade/renderer/fluid/publish/FluidWindPublish.js +20 -10
- package/src/shade/renderer/fluid/publish/chunk_fluid_wind_publish_cell.d.ts +2 -2
- package/src/shade/renderer/fluid/publish/chunk_fluid_wind_publish_cell.js +2 -2
- package/src/shade/renderer/fluid/publish/shader_fluid_wind_publish.d.ts +5 -3
- package/src/shade/renderer/fluid/publish/shader_fluid_wind_publish.d.ts.map +1 -1
- package/src/shade/renderer/fluid/publish/shader_fluid_wind_publish.js +147 -142
- package/src/shade/renderer/fluid/query/GPUFluidQueries.js +2 -2
- package/src/shade/renderer/geometry/GPUGeometryManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/GPUGeometryManager.js +5 -7
- package/src/shade/renderer/geometry/MeshletGeometry.d.ts +4 -1
- package/src/shade/renderer/geometry/MeshletGeometry.d.ts.map +1 -1
- package/src/shade/renderer/geometry/MeshletGeometry.js +4 -1
- package/src/shade/renderer/geometry/MeshletGeometrySerializationAdapter.d.ts +20 -0
- package/src/shade/renderer/geometry/MeshletGeometrySerializationAdapter.d.ts.map +1 -1
- package/src/shade/renderer/geometry/MeshletGeometrySerializationAdapter.js +35 -3
- package/src/shade/renderer/geometry/blas_from_meshlets.d.ts +9 -3
- package/src/shade/renderer/geometry/blas_from_meshlets.d.ts.map +1 -1
- package/src/shade/renderer/geometry/blas_from_meshlets.js +16 -30
- package/src/shade/renderer/geometry/bvh/BLAS8_REFIT_TARGET_STRUCT.d.ts +14 -0
- package/src/shade/renderer/geometry/bvh/BLAS8_REFIT_TARGET_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/geometry/bvh/BLAS8_REFIT_TARGET_STRUCT.js +33 -0
- package/src/shade/renderer/geometry/bvh/GPUBLASRefitBatch.d.ts +18 -21
- package/src/shade/renderer/geometry/bvh/GPUBLASRefitBatch.d.ts.map +1 -1
- package/src/shade/renderer/geometry/bvh/GPUBLASRefitBatch.js +78 -158
- package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts +18 -39
- package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.js +39 -398
- package/src/shade/renderer/geometry/bvh/GPUGeometryMeshletsBVH.d.ts +6 -7
- package/src/shade/renderer/geometry/bvh/GPUGeometryMeshletsBVH.d.ts.map +1 -1
- package/src/shade/renderer/geometry/bvh/GPUGeometryMeshletsBVH.js +5 -7
- package/src/shade/renderer/geometry/bvh/bvh8_build_for_meshlets.d.ts +36 -0
- package/src/shade/renderer/geometry/bvh/bvh8_build_for_meshlets.d.ts.map +1 -0
- package/src/shade/renderer/geometry/bvh/bvh8_build_for_meshlets.js +179 -0
- package/src/shade/renderer/geometry/bvh/meshlet_batch_to_clustered_bvh.d.ts +30 -0
- package/src/shade/renderer/geometry/bvh/meshlet_batch_to_clustered_bvh.d.ts.map +1 -0
- package/src/shade/renderer/geometry/bvh/meshlet_batch_to_clustered_bvh.js +207 -0
- package/src/shade/renderer/geometry/bvh/shader_blas8_refit_batch.d.ts +52 -0
- package/src/shade/renderer/geometry/bvh/shader_blas8_refit_batch.d.ts.map +1 -0
- package/src/shade/renderer/geometry/bvh/shader_blas8_refit_batch.js +464 -0
- package/src/shade/renderer/geometry/meshlet/MeshletBatch.d.ts +12 -0
- package/src/shade/renderer/geometry/meshlet/MeshletBatch.d.ts.map +1 -1
- package/src/shade/renderer/geometry/meshlet/MeshletBatch.js +37 -0
- package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_classify.d.ts.map +1 -1
- package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_classify.js +4 -4
- package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_evaluate.d.ts.map +1 -1
- package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_evaluate.js +2 -2
- package/src/shade/renderer/geometry/sdf/chunk_blas_query_band_sdf.d.ts.map +1 -1
- package/src/shade/renderer/geometry/sdf/chunk_blas_query_band_sdf.js +2 -2
- package/src/shade/renderer/geometry/sdf/shader_sdf_visualize.d.ts.map +1 -1
- package/src/shade/renderer/geometry/sdf/shader_sdf_visualize.js +4 -4
- package/src/shade/renderer/geometry/sdf/surface/shader_mesh_surface_trace.d.ts.map +1 -1
- package/src/shade/renderer/geometry/sdf/surface/shader_mesh_surface_trace.js +2 -2
- package/src/shade/renderer/geometry/sr_create_group_RTX.d.ts.map +1 -1
- package/src/shade/renderer/geometry/sr_create_group_RTX.js +4 -4
- package/src/shade/renderer/global_illumination/brick4/gpu/bake/brick4_bake_basic.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/brick4/gpu/bake/brick4_bake_basic.js +1 -0
- package/src/shade/renderer/global_illumination/lpv/bake/GPULightProbeVolumeRenderer.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/lpv/bake/GPULightProbeVolumeRenderer.js +1 -0
- package/src/shade/renderer/global_illumination/lpv/placement/graph_generate_probe_locations.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/lpv/placement/graph_generate_probe_locations.js +372 -376
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK.d.ts +9 -10
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK.js +10 -11
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_walk.d.ts +2 -2
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_walk.js +2 -2
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_gather.d.ts +12 -8
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_gather.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_gather.js +109 -60
- package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_mesh_sdf.js +2 -2
- package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_mesh_surfaces.js +2 -2
- package/src/shade/renderer/gpu_primitive/bvh/BVH_BUFFER_LAYOUT.d.ts +2 -2
- package/src/shade/renderer/gpu_primitive/bvh/BVH_BUFFER_LAYOUT.js +70 -70
- package/src/shade/renderer/gpu_primitive/bvh/BVH_BUILD_SETTINGS_STRUCT.d.ts +6 -7
- package/src/shade/renderer/gpu_primitive/bvh/BVH_BUILD_SETTINGS_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/bvh/BVH_BUILD_SETTINGS_STRUCT.js +6 -7
- package/src/shade/renderer/gpu_primitive/bvh/graph_bvh_build_lbvh.d.ts +3 -3
- package/src/shade/renderer/gpu_primitive/bvh/graph_bvh_build_lbvh.js +3 -3
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_build_single_workgroup.js +1 -1
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.d.ts +2 -2
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.js +3 -3
- package/src/shade/renderer/gpu_primitive/bvh8/BVH8_TREE_BUFFER_LAYOUT.d.ts +69 -0
- package/src/shade/renderer/gpu_primitive/bvh8/BVH8_TREE_BUFFER_LAYOUT.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/bvh8/BVH8_TREE_BUFFER_LAYOUT.js +89 -0
- package/src/shade/renderer/gpu_primitive/bvh8/bvh8_encode_from_bvh2.d.ts +41 -0
- package/src/shade/renderer/gpu_primitive/bvh8/bvh8_encode_from_bvh2.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/bvh8/bvh8_encode_from_bvh2.js +348 -0
- package/src/shade/renderer/gpu_primitive/bvh8/check_bvh8_tree.d.ts +34 -0
- package/src/shade/renderer/gpu_primitive/bvh8/check_bvh8_tree.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/bvh8/check_bvh8_tree.js +291 -0
- package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_assign.d.ts +31 -0
- package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_assign.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_assign.js +175 -0
- package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_depth.d.ts +27 -0
- package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_depth.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_depth.js +48 -0
- package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_gather.d.ts +26 -0
- package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_gather.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_gather.js +118 -0
- package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_node.d.ts +22 -0
- package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_node.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_node.js +143 -0
- package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_sums.d.ts +36 -0
- package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_sums.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_sums.js +97 -0
- package/src/shade/renderer/gpu_primitive/bvh8/graph_bvh8_encode_from_bvh2.d.ts +49 -0
- package/src/shade/renderer/gpu_primitive/bvh8/graph_bvh8_encode_from_bvh2.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/bvh8/graph_bvh8_encode_from_bvh2.js +265 -0
- package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_assign.d.ts +37 -0
- package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_assign.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_assign.js +109 -0
- package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_count.d.ts +15 -0
- package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_count.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_count.js +85 -0
- package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_count_single_workgroup.d.ts +26 -0
- package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_count_single_workgroup.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_count_single_workgroup.js +200 -0
- package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_parents.d.ts +19 -0
- package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_parents.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_parents.js +81 -0
- package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_write.d.ts +14 -0
- package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_write.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_write.js +101 -0
- package/src/shade/renderer/gpu_primitive/bvh8/verify_gpu_bvh8_encode.d.ts +19 -0
- package/src/shade/renderer/gpu_primitive/bvh8/verify_gpu_bvh8_encode.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/bvh8/verify_gpu_bvh8_encode.js +361 -0
- package/src/shade/renderer/grass/surface/shader_grass_surface_bake.d.ts.map +1 -1
- package/src/shade/renderer/grass/surface/shader_grass_surface_bake.js +5 -6
- package/src/shade/renderer/lightmap/GPULightMap.d.ts.map +1 -1
- package/src/shade/renderer/lightmap/GPULightMap.js +1 -0
- package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.d.ts.map +1 -1
- package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.js +1 -0
- package/src/shade/renderer/path_tracer/graph_path_trace_scene.d.ts.map +1 -1
- package/src/shade/renderer/path_tracer/graph_path_trace_scene.js +1 -0
- package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.d.ts +8 -4
- package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.d.ts.map +1 -1
- package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.js +60 -33
- package/src/shade/renderer/scene/verify_gpu_tlas_build.d.ts +6 -6
- package/src/shade/renderer/scene/verify_gpu_tlas_build.d.ts.map +1 -1
- package/src/shade/renderer/scene/verify_gpu_tlas_build.js +23 -53
- package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/BVH8_INODE_STRUCT.d.ts +3 -1
- package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/BVH8_INODE_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/BVH8_INODE_STRUCT.js +5 -3
- package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/BVH8_MAX_DEPTH.d.ts +28 -0
- package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/BVH8_MAX_DEPTH.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/BVH8_MAX_DEPTH.js +29 -0
- package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_node_grid.d.ts +25 -0
- package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_node_grid.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_node_grid.js +97 -0
- package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_node_intersect.d.ts +8 -0
- package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_node_intersect.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_node_intersect.js +23 -14
- package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_node_slot_distances.d.ts +36 -0
- package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_node_slot_distances.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_node_slot_distances.js +222 -0
- package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_ray_direction_rcp.d.ts +20 -0
- package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_ray_direction_rcp.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_ray_direction_rcp.js +30 -0
- package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_tree_read.d.ts +30 -0
- package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_tree_read.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_tree_read.js +91 -0
- package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_waiting_slots.d.ts +23 -0
- package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_waiting_slots.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_waiting_slots.js +40 -0
- package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_blas_nearest.d.ts +22 -0
- package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_blas_nearest.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_blas_nearest.js +121 -70
- package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_blas_occluded.d.ts +13 -1
- package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_blas_occluded.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_blas_occluded.js +117 -61
- package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_nearest.d.ts +21 -0
- package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_nearest.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_nearest.js +111 -72
- package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_nearest_among.d.ts +1 -2
- package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_nearest_among.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_nearest_among.js +83 -54
- package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_occluded.d.ts +14 -0
- package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_occluded.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_occluded.js +92 -60
- package/src/shade/renderer/shader/chunk/sdf/chunk_point_query_blas_nearest.d.ts +22 -0
- package/src/shade/renderer/shader/chunk/sdf/chunk_point_query_blas_nearest.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/sdf/chunk_point_query_blas_nearest.js +153 -106
- package/src/shade/renderer/shader/chunk/sdf/chunk_scene_point_query_nearest.d.ts +21 -0
- package/src/shade/renderer/shader/chunk/sdf/chunk_scene_point_query_nearest.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/sdf/chunk_scene_point_query_nearest.js +115 -74
- package/src/shade/renderer/shader/chunk/sdf/chunk_scene_sdf_raymarch.d.ts +5 -2
- package/src/shade/renderer/shader/chunk/sdf/chunk_scene_sdf_raymarch.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/sdf/chunk_scene_sdf_raymarch.js +89 -63
- package/src/shade/renderer/shader/chunk/sdf/chunk_sdf_query_distance.d.ts +15 -0
- package/src/shade/renderer/shader/chunk/sdf/chunk_sdf_query_distance.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/sdf/chunk_sdf_query_distance.js +108 -63
- package/src/shade/renderer/shadow/sdf/chunk_ray_query_sdf_raycast.d.ts +14 -0
- package/src/shade/renderer/shadow/sdf/chunk_ray_query_sdf_raycast.d.ts.map +1 -1
- package/src/shade/renderer/shadow/sdf/chunk_ray_query_sdf_raycast.js +94 -60
- package/src/shade/renderer/shadow/sdf/graph_draw_sdf_shadows.d.ts.map +1 -1
- package/src/shade/renderer/shadow/sdf/graph_draw_sdf_shadows.js +4 -4
- package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +2 -2
- package/src/shade/renderer/water/query/shader_water_surface_query.d.ts.map +1 -1
- package/src/shade/renderer/water/query/shader_water_surface_query.js +227 -227
- package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.d.ts.map +1 -1
- package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.js +7 -4
- package/src/shade/renderer/water/surface/particles/shader_water_particles.js +2 -2
- package/src/shade/renderer/wind/GPUSceneWind.d.ts +36 -4
- package/src/shade/renderer/wind/GPUSceneWind.d.ts.map +1 -1
- package/src/shade/renderer/wind/GPUSceneWind.js +150 -4
- package/src/shade/renderer/wind/WIND_FIELD_STRUCT.d.ts +9 -3
- package/src/shade/renderer/wind/WIND_FIELD_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/wind/WIND_FIELD_STRUCT.js +13 -3
- package/src/shade/renderer/wind/WIND_FIELD_UNIFORM.d.ts +6 -6
- package/src/shade/renderer/wind/WIND_FIELD_UNIFORM.js +6 -6
- package/src/shade/renderer/wind/chunk_fluid_turbulence.d.ts +39 -0
- package/src/shade/renderer/wind/chunk_fluid_turbulence.d.ts.map +1 -0
- package/src/shade/renderer/wind/chunk_fluid_turbulence.js +63 -0
- package/src/shade/renderer/wind/chunk_wind_field_sample_cascades.d.ts +10 -7
- package/src/shade/renderer/wind/chunk_wind_field_sample_cascades.d.ts.map +1 -1
- package/src/shade/renderer/wind/chunk_wind_field_sample_cascades.js +34 -11
- package/src/shade/renderer/wind/chunk_wind_field_sample_uniform.d.ts +2 -2
- package/src/shade/renderer/wind/chunk_wind_field_sample_uniform.js +2 -2
- package/src/shade/renderer/wind/wind_field_add_resources.d.ts +6 -4
- package/src/shade/renderer/wind/wind_field_add_resources.d.ts.map +1 -1
- package/src/shade/renderer/wind/wind_field_add_resources.js +9 -6
- package/src/shade/renderer/geometry/bvh/BLAS_REFIT_TARGET_STRUCT.d.ts +0 -18
- package/src/shade/renderer/geometry/bvh/BLAS_REFIT_TARGET_STRUCT.d.ts.map +0 -1
- package/src/shade/renderer/geometry/bvh/BLAS_REFIT_TARGET_STRUCT.js +0 -50
- package/src/shade/renderer/geometry/bvh/bvh2_derive_topology.d.ts +0 -23
- package/src/shade/renderer/geometry/bvh/bvh2_derive_topology.d.ts.map +0 -1
- package/src/shade/renderer/geometry/bvh/bvh2_derive_topology.js +0 -87
- package/src/shade/renderer/geometry/bvh/shader_blas_refit_batch.d.ts +0 -42
- package/src/shade/renderer/geometry/bvh/shader_blas_refit_batch.d.ts.map +0 -1
- package/src/shade/renderer/geometry/bvh/shader_blas_refit_batch.js +0 -141
- package/src/shade/renderer/geometry/bvh/shader_blas_refit_batch_seed.d.ts +0 -21
- package/src/shade/renderer/geometry/bvh/shader_blas_refit_batch_seed.d.ts.map +0 -1
- package/src/shade/renderer/geometry/bvh/shader_blas_refit_batch_seed.js +0 -75
- package/src/shade/renderer/geometry/meshlet_batch_to_bvh.d.ts +0 -17
- package/src/shade/renderer/geometry/meshlet_batch_to_bvh.d.ts.map +0 -1
- package/src/shade/renderer/geometry/meshlet_batch_to_bvh.js +0 -247
- package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_ray_query_blas_occlusion.d.ts +0 -7
- package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_ray_query_blas_occlusion.d.ts.map +0 -1
- package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_ray_query_blas_occlusion.js +0 -226
- package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_mask_visibility_via_rays.d.ts +0 -8
- package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_mask_visibility_via_rays.d.ts.map +0 -1
- package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_mask_visibility_via_rays.js +0 -45
- package/src/shade/renderer/shader/chunk/light/sample/chunk_ray_sample_light.d.ts +0 -3
- package/src/shade/renderer/shader/chunk/light/sample/chunk_ray_sample_light.d.ts.map +0 -1
- package/src/shade/renderer/shader/chunk/light/sample/chunk_ray_sample_light.js +0 -105
- package/src/shade/renderer/shadow/sdf/chunk_ray_query_sdf_distance.d.ts +0 -6
- package/src/shade/renderer/shadow/sdf/chunk_ray_query_sdf_distance.d.ts.map +0 -1
- package/src/shade/renderer/shadow/sdf/chunk_ray_query_sdf_distance.js +0 -86
- package/src/shade/renderer/shadow/sdf/chunk_ray_query_sdf_raycast_traversal_count.d.ts +0 -2
- package/src/shade/renderer/shadow/sdf/chunk_ray_query_sdf_raycast_traversal_count.d.ts.map +0 -1
- package/src/shade/renderer/shadow/sdf/chunk_ray_query_sdf_raycast_traversal_count.js +0 -136
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @typedef {import("../../../../core/binary/allocator/OffsetAllocator.js").Allocation} Allocation
|
|
3
|
+
* @typedef {import("../MeshletGeometry.js").MeshletGeometry} MeshletGeometry
|
|
3
4
|
*/
|
|
4
5
|
|
|
5
6
|
export class GPUGeometryMeshletsBVH {
|
|
@@ -31,12 +32,11 @@ export class GPUGeometryMeshletsBVH {
|
|
|
31
32
|
allocation = null;
|
|
32
33
|
|
|
33
34
|
/**
|
|
34
|
-
* The
|
|
35
|
-
* geometry, because a copy differs only in where its bounds are.
|
|
35
|
+
* The geometry whose tree this one starts as a copy of.
|
|
36
36
|
*
|
|
37
|
-
* @type {
|
|
37
|
+
* @type {MeshletGeometry}
|
|
38
38
|
*/
|
|
39
|
-
|
|
39
|
+
source;
|
|
40
40
|
|
|
41
41
|
/**
|
|
42
42
|
* Whether {@link address} means anything yet. A record is registered before its nodes are
|
|
@@ -49,9 +49,7 @@ export class GPUGeometryMeshletsBVH {
|
|
|
49
49
|
|
|
50
50
|
/**
|
|
51
51
|
* Bytes of {@link bvh} that {@link GPUGeometryBVHManager#update} actually copied into the arena
|
|
52
|
-
* at {@link address}
|
|
53
|
-
* registered before its geometry had a tree is uploaded as nothing, and a shape derived later,
|
|
54
|
-
* from the bytes that exist by then, must not be answered for at that empty region.
|
|
52
|
+
* at {@link address}: the region a refit of this tree covers.
|
|
55
53
|
*
|
|
56
54
|
* @type {number}
|
|
57
55
|
*/
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build a BVH8 over a meshlet batch that addresses the batch's own triangles, with no index table
|
|
3
|
+
* between the tree and the geometry.
|
|
4
|
+
*
|
|
5
|
+
* A BVH8 node names its triangles as one run: `base_index_triangle`, plus an offset of at most 23.
|
|
6
|
+
* A tree built over a mesh therefore wants the triangles in the tree's order, which is usually paid
|
|
7
|
+
* for with a second, re-ordered index buffer ({@link BVH8#primitives}). A meshlet already owns a
|
|
8
|
+
* private index list of at most {@link GEOMETRY_MESHLET_TRIANGLE_LIMIT} triangles whose order nothing
|
|
9
|
+
* else depends on, so the order is imposed there instead:
|
|
10
|
+
*
|
|
11
|
+
* - the tree is built so that every meshlet is one subtree, and every node at or below a meshlet's root
|
|
12
|
+
* holds triangles of that meshlet alone ({@link meshlet_batch_to_clustered_bvh},
|
|
13
|
+
* {@link BVH8Converter#cluster_roots});
|
|
14
|
+
* - each meshlet's triangles are then re-ordered into the order its nodes visit them
|
|
15
|
+
* ({@link MeshletBatch#reorder_triangles}).
|
|
16
|
+
*
|
|
17
|
+
* `base_index_triangle` comes out as `(meshlet_index << 8) | triangle_index`, the id every ray query
|
|
18
|
+
* in the engine already resolves through `geometry_read_triangle_vertices`. A run never crosses a
|
|
19
|
+
* meshlet, so adding a slot's offset to it stays inside the low byte and the sum is again such an id.
|
|
20
|
+
* Nodes above the meshlet roots hold no triangles.
|
|
21
|
+
*
|
|
22
|
+
* Throws for a batch whose tree comes out deeper than {@link BVH8_BLAS_MAX_DEPTH}: the traversal's stack
|
|
23
|
+
* could not walk it. By then the triangles have been re-ordered and `bvh8` holds the refused tree.
|
|
24
|
+
*
|
|
25
|
+
* **This re-orders the triangles inside `meshlets`.** Any `(meshlet, triangle)` id recorded before the
|
|
26
|
+
* call is stale after it; build this before anything else that names triangles.
|
|
27
|
+
*
|
|
28
|
+
* @param {BVH8} bvh8 output; {@link BVH8#primitives} is left empty
|
|
29
|
+
* @param {MeshletBatch} meshlets triangles are re-ordered within each meshlet
|
|
30
|
+
* @param {Float32Array} bounding_box bounds of the whole batch
|
|
31
|
+
* @param {number} [optimization] treelet optimization passes over the binary tree the BVH8 is collapsed from
|
|
32
|
+
*/
|
|
33
|
+
export function bvh8_build_for_meshlets(bvh8: BVH8, meshlets: MeshletBatch, bounding_box: Float32Array, optimization?: number): void;
|
|
34
|
+
export type BVH8 = import("../../../../core/bvh8/BVH8.js").BVH8;
|
|
35
|
+
export type MeshletBatch = import("../meshlet/MeshletBatch.js").MeshletBatch;
|
|
36
|
+
//# sourceMappingURL=bvh8_build_for_meshlets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bvh8_build_for_meshlets.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/geometry/bvh/bvh8_build_for_meshlets.js"],"names":[],"mappings":"AA8BA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,8CALW,IAAI,YACJ,YAAY,gBACZ,YAAY,iBACZ,MAAM,QAsHhB;mBAzKY,OAAO,+BAA+B,EAAE,IAAI;2BAC5C,OAAO,4BAA4B,EAAE,YAAY"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { assert } from "../../../../core/assert.js";
|
|
2
|
+
import { BVH } from "../../../../core/bvh2/bvh3/BVH.js";
|
|
3
|
+
import { BVH8Converter } from "../../../../core/bvh8/build/BVH8Converter.js";
|
|
4
|
+
import { bvh8_depth } from "../../../../core/bvh8/bvh8_depth.js";
|
|
5
|
+
import { BVH8_BLAS_MAX_DEPTH } from "../../shader/chunk/bvh/bvh8/webgpu/BVH8_MAX_DEPTH.js";
|
|
6
|
+
import { GEOMETRY_MESHLET_TRIANGLE_LIMIT } from "../meshlet/GEOMETRY_MESHLET_TRIANGLE_LIMIT.js";
|
|
7
|
+
import { meshlet_batch_to_clustered_bvh } from "./meshlet_batch_to_clustered_bvh.js";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* @typedef {import("../../../../core/bvh8/BVH8.js").BVH8} BVH8
|
|
11
|
+
* @typedef {import("../meshlet/MeshletBatch.js").MeshletBatch} MeshletBatch
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Triangles in a batch, by its meshlets' own headers. A batch put together from stored buffers has
|
|
16
|
+
* no count of its own to give.
|
|
17
|
+
*
|
|
18
|
+
* @param {MeshletBatch} meshlets
|
|
19
|
+
* @returns {number}
|
|
20
|
+
*/
|
|
21
|
+
function count_triangles(meshlets) {
|
|
22
|
+
let count = 0;
|
|
23
|
+
|
|
24
|
+
for (let i = 0; i < meshlets.count; i++) {
|
|
25
|
+
count += meshlets.read_header(i).primitive_count;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return count;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Build a BVH8 over a meshlet batch that addresses the batch's own triangles, with no index table
|
|
33
|
+
* between the tree and the geometry.
|
|
34
|
+
*
|
|
35
|
+
* A BVH8 node names its triangles as one run: `base_index_triangle`, plus an offset of at most 23.
|
|
36
|
+
* A tree built over a mesh therefore wants the triangles in the tree's order, which is usually paid
|
|
37
|
+
* for with a second, re-ordered index buffer ({@link BVH8#primitives}). A meshlet already owns a
|
|
38
|
+
* private index list of at most {@link GEOMETRY_MESHLET_TRIANGLE_LIMIT} triangles whose order nothing
|
|
39
|
+
* else depends on, so the order is imposed there instead:
|
|
40
|
+
*
|
|
41
|
+
* - the tree is built so that every meshlet is one subtree, and every node at or below a meshlet's root
|
|
42
|
+
* holds triangles of that meshlet alone ({@link meshlet_batch_to_clustered_bvh},
|
|
43
|
+
* {@link BVH8Converter#cluster_roots});
|
|
44
|
+
* - each meshlet's triangles are then re-ordered into the order its nodes visit them
|
|
45
|
+
* ({@link MeshletBatch#reorder_triangles}).
|
|
46
|
+
*
|
|
47
|
+
* `base_index_triangle` comes out as `(meshlet_index << 8) | triangle_index`, the id every ray query
|
|
48
|
+
* in the engine already resolves through `geometry_read_triangle_vertices`. A run never crosses a
|
|
49
|
+
* meshlet, so adding a slot's offset to it stays inside the low byte and the sum is again such an id.
|
|
50
|
+
* Nodes above the meshlet roots hold no triangles.
|
|
51
|
+
*
|
|
52
|
+
* Throws for a batch whose tree comes out deeper than {@link BVH8_BLAS_MAX_DEPTH}: the traversal's stack
|
|
53
|
+
* could not walk it. By then the triangles have been re-ordered and `bvh8` holds the refused tree.
|
|
54
|
+
*
|
|
55
|
+
* **This re-orders the triangles inside `meshlets`.** Any `(meshlet, triangle)` id recorded before the
|
|
56
|
+
* call is stale after it; build this before anything else that names triangles.
|
|
57
|
+
*
|
|
58
|
+
* @param {BVH8} bvh8 output; {@link BVH8#primitives} is left empty
|
|
59
|
+
* @param {MeshletBatch} meshlets triangles are re-ordered within each meshlet
|
|
60
|
+
* @param {Float32Array} bounding_box bounds of the whole batch
|
|
61
|
+
* @param {number} [optimization] treelet optimization passes over the binary tree the BVH8 is collapsed from
|
|
62
|
+
*/
|
|
63
|
+
export function bvh8_build_for_meshlets(bvh8, meshlets, bounding_box, optimization = 1) {
|
|
64
|
+
assert.defined(bvh8, 'bvh8');
|
|
65
|
+
assert.equal(meshlets.isMeshletBatch, true, 'meshlets.isMeshletBatch !== true');
|
|
66
|
+
assert.isArrayLike(bounding_box, 'bounding_box');
|
|
67
|
+
|
|
68
|
+
const meshlet_count = meshlets.count;
|
|
69
|
+
|
|
70
|
+
if (meshlet_count === 0) {
|
|
71
|
+
bvh8.clear();
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const bvh2 = new BVH();
|
|
76
|
+
const meshlet_roots = new Uint32Array(meshlet_count);
|
|
77
|
+
|
|
78
|
+
meshlet_batch_to_clustered_bvh({
|
|
79
|
+
bvh: bvh2,
|
|
80
|
+
meshlets,
|
|
81
|
+
bounding_box,
|
|
82
|
+
meshlet_roots,
|
|
83
|
+
optimization,
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
const cluster_roots = new Uint8Array(bvh2.size);
|
|
87
|
+
|
|
88
|
+
for (let i = 0; i < meshlet_count; i++) {
|
|
89
|
+
cluster_roots[meshlet_roots[i]] = 1;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const converter = new BVH8Converter(bvh8, bvh2);
|
|
93
|
+
|
|
94
|
+
converter.cluster_roots = cluster_roots;
|
|
95
|
+
converter.convert();
|
|
96
|
+
|
|
97
|
+
// ===========
|
|
98
|
+
// The pool now lists every triangle id in the order the nodes address them, one meshlet after
|
|
99
|
+
// another. Find where each meshlet's run starts
|
|
100
|
+
// ===========
|
|
101
|
+
const pool = bvh8.primitives.data_uint32;
|
|
102
|
+
const pool_size = bvh8.primitives.size;
|
|
103
|
+
|
|
104
|
+
assert.equal(pool_size, count_triangles(meshlets), 'the tree must hold every triangle of the batch');
|
|
105
|
+
|
|
106
|
+
const run_start = new Uint32Array(meshlet_count);
|
|
107
|
+
|
|
108
|
+
for (let i = 0, previous = -1; i < pool_size; i++) {
|
|
109
|
+
const meshlet_index = pool[i] >>> 8;
|
|
110
|
+
|
|
111
|
+
if (meshlet_index !== previous) {
|
|
112
|
+
run_start[meshlet_index] = i;
|
|
113
|
+
previous = meshlet_index;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// ===========
|
|
118
|
+
// Point every node at its run inside the meshlet, instead of inside the pool
|
|
119
|
+
// ===========
|
|
120
|
+
const node_count = bvh8.nodes.size;
|
|
121
|
+
|
|
122
|
+
for (let node = 0; node < node_count; node++) {
|
|
123
|
+
const imask = bvh8.node_get_imask(node);
|
|
124
|
+
|
|
125
|
+
let has_triangles = false;
|
|
126
|
+
|
|
127
|
+
for (let slot = 0; slot < 8; slot++) {
|
|
128
|
+
if ((imask & (1 << slot)) === 0 && bvh8.node_get_meta(node, slot) !== 0) {
|
|
129
|
+
has_triangles = true;
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
if (!has_triangles) {
|
|
135
|
+
bvh8.node_set_base_index_triangle(node, 0);
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
const base = bvh8.node_get_base_index_triangle(node);
|
|
140
|
+
|
|
141
|
+
const meshlet_index = pool[base] >>> 8;
|
|
142
|
+
|
|
143
|
+
const base_in_meshlet = base - run_start[meshlet_index];
|
|
144
|
+
|
|
145
|
+
assert.lessThan(base_in_meshlet, GEOMETRY_MESHLET_TRIANGLE_LIMIT, 'run starts outside of its meshlet');
|
|
146
|
+
|
|
147
|
+
bvh8.node_set_base_index_triangle(node, ((meshlet_index << 8) | base_in_meshlet) >>> 0);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// ===========
|
|
151
|
+
// Put each meshlet's triangles in the order of its run
|
|
152
|
+
// ===========
|
|
153
|
+
const order = new Uint8Array(GEOMETRY_MESHLET_TRIANGLE_LIMIT);
|
|
154
|
+
|
|
155
|
+
for (let meshlet_index = 0; meshlet_index < meshlet_count; meshlet_index++) {
|
|
156
|
+
const triangle_count = meshlets.read_header(meshlet_index).primitive_count;
|
|
157
|
+
|
|
158
|
+
const start = run_start[meshlet_index];
|
|
159
|
+
|
|
160
|
+
for (let i = 0; i < triangle_count; i++) {
|
|
161
|
+
const id = pool[start + i];
|
|
162
|
+
|
|
163
|
+
assert.equal(id >>> 8, meshlet_index, "a meshlet's run holds another meshlet's triangle");
|
|
164
|
+
|
|
165
|
+
order[i] = id & 0xFF;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
meshlets.reorder_triangles(meshlet_index, order);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// the order lives in the meshlets now
|
|
172
|
+
bvh8.primitives.clear();
|
|
173
|
+
|
|
174
|
+
const depth = bvh8_depth(bvh8);
|
|
175
|
+
|
|
176
|
+
if (depth > BVH8_BLAS_MAX_DEPTH) {
|
|
177
|
+
throw new Error(`BVH8 over ${count_triangles(meshlets)} triangles in ${meshlet_count} meshlets is ${depth} levels deep, the traversal holds ${BVH8_BLAS_MAX_DEPTH}`);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Binary BVH over the triangles of a meshlet batch, in which every meshlet is one subtree.
|
|
3
|
+
*
|
|
4
|
+
* Treelets are optimized on either side of the meshlet roots and never across them, where an
|
|
5
|
+
* optimization of the whole tree would be free to trade triangles between meshlets: the tree above
|
|
6
|
+
* the roots sees each meshlet as a leaf, and the tree below one holds that meshlet's triangles and
|
|
7
|
+
* no others. That is the property a
|
|
8
|
+
* wide BVH needs in order to address triangles as a run inside a meshlet, see
|
|
9
|
+
* {@link bvh8_build_for_meshlets}.
|
|
10
|
+
*
|
|
11
|
+
* A leaf's user data is `(meshlet_index << 8) | triangle_index`, as everywhere else.
|
|
12
|
+
*
|
|
13
|
+
* @param {Object} options
|
|
14
|
+
* @param {BVH} options.bvh output, anything it held is released
|
|
15
|
+
* @param {MeshletBatch} options.meshlets every meshlet must hold at least one triangle
|
|
16
|
+
* @param {Float32Array} options.bounding_box bounds of the whole batch
|
|
17
|
+
* @param {Uint32Array} options.meshlet_roots output, the node each meshlet is rooted at, by meshlet
|
|
18
|
+
* index. A meshlet of one triangle is rooted at that triangle's leaf.
|
|
19
|
+
* @param {number} [options.optimization] treelet optimization passes
|
|
20
|
+
*/
|
|
21
|
+
export function meshlet_batch_to_clustered_bvh({ bvh, meshlets, bounding_box, meshlet_roots, optimization }: {
|
|
22
|
+
bvh: BVH;
|
|
23
|
+
meshlets: MeshletBatch;
|
|
24
|
+
bounding_box: Float32Array;
|
|
25
|
+
meshlet_roots: Uint32Array;
|
|
26
|
+
optimization?: number;
|
|
27
|
+
}): void;
|
|
28
|
+
export type BVH = import("../../../../core/bvh2/bvh3/BVH.js").BVH;
|
|
29
|
+
export type MeshletBatch = import("../meshlet/MeshletBatch.js").MeshletBatch;
|
|
30
|
+
//# sourceMappingURL=meshlet_batch_to_clustered_bvh.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meshlet_batch_to_clustered_bvh.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/geometry/bvh/meshlet_batch_to_clustered_bvh.js"],"names":[],"mappings":"AA8CA;;;;;;;;;;;;;;;;;;;GAmBG;AACH;IAPwB,GAAG,EAAhB,GAAG;IACmB,QAAQ,EAA9B,YAAY;IACU,YAAY,EAAlC,YAAY;IACS,aAAa,EAAlC,WAAW;IAEM,YAAY,GAA7B,MAAM;SA8IhB;kBAlMY,OAAO,mCAAmC,EAAE,GAAG;2BAC/C,OAAO,4BAA4B,EAAE,YAAY"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { assert } from "../../../../core/assert.js";
|
|
2
|
+
import { NULL_NODE } from "../../../../core/bvh2/bvh3/BVH.js";
|
|
3
|
+
import { ebvh_build_hierarchy } from "../../../../core/bvh2/bvh3/ebvh_build_hierarchy.js";
|
|
4
|
+
import { ebvh_optimize_treelet } from "../../../../core/bvh2/bvh3/ebvh_optimize_treelet.js";
|
|
5
|
+
import {
|
|
6
|
+
array_quick_sort_by_lookup_uint
|
|
7
|
+
} from "../../../../core/collection/array/array_quick_sort_by_lookup_uint.js";
|
|
8
|
+
import { v3_morton_encode_bounded } from "../../../../core/geom/3d/morton/v3_morton_encode_bounded.js";
|
|
9
|
+
import { aabb3_compute_from_triangle } from "../../../../core/geom/3d/triangle/aabb3_compute_from_triangle.js";
|
|
10
|
+
import { GEOMETRY_MESHLET_TRIANGLE_LIMIT } from "../meshlet/GEOMETRY_MESHLET_TRIANGLE_LIMIT.js";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* @typedef {import("../../../../core/bvh2/bvh3/BVH.js").BVH} BVH
|
|
14
|
+
* @typedef {import("../meshlet/MeshletBatch.js").MeshletBatch} MeshletBatch
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Arrange `count` unattached nodes into a hierarchy, nearest in Morton order first.
|
|
19
|
+
*
|
|
20
|
+
* @param {BVH} bvh
|
|
21
|
+
* @param {Uint32Array} nodes the nodes to arrange; left in an unspecified order
|
|
22
|
+
* @param {Uint32Array} codes Morton code of each of `nodes`, by position
|
|
23
|
+
* @param {number} count
|
|
24
|
+
* @param {Uint32Array} scratch_order at least `count` long
|
|
25
|
+
* @param {Uint32Array} scratch_nodes at least `2 * count` long
|
|
26
|
+
* @returns {number} root of the hierarchy; `nodes[0]` itself when `count` is 1
|
|
27
|
+
*/
|
|
28
|
+
function build_hierarchy_by_morton(bvh, nodes, codes, count, scratch_order, scratch_nodes) {
|
|
29
|
+
for (let i = 0; i < count; i++) {
|
|
30
|
+
scratch_order[i] = i;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
array_quick_sort_by_lookup_uint(scratch_order, codes, 0, count - 1);
|
|
34
|
+
|
|
35
|
+
for (let i = 0; i < count; i++) {
|
|
36
|
+
scratch_nodes[i] = nodes[scratch_order[i]];
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// a binary tree over `count` leaves has `count - 1` parents
|
|
40
|
+
for (let i = 0; i < count - 1; i++) {
|
|
41
|
+
scratch_nodes[count + i] = bvh.allocate_node();
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return ebvh_build_hierarchy(bvh, scratch_nodes, count, scratch_nodes, count);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Binary BVH over the triangles of a meshlet batch, in which every meshlet is one subtree.
|
|
49
|
+
*
|
|
50
|
+
* Treelets are optimized on either side of the meshlet roots and never across them, where an
|
|
51
|
+
* optimization of the whole tree would be free to trade triangles between meshlets: the tree above
|
|
52
|
+
* the roots sees each meshlet as a leaf, and the tree below one holds that meshlet's triangles and
|
|
53
|
+
* no others. That is the property a
|
|
54
|
+
* wide BVH needs in order to address triangles as a run inside a meshlet, see
|
|
55
|
+
* {@link bvh8_build_for_meshlets}.
|
|
56
|
+
*
|
|
57
|
+
* A leaf's user data is `(meshlet_index << 8) | triangle_index`, as everywhere else.
|
|
58
|
+
*
|
|
59
|
+
* @param {Object} options
|
|
60
|
+
* @param {BVH} options.bvh output, anything it held is released
|
|
61
|
+
* @param {MeshletBatch} options.meshlets every meshlet must hold at least one triangle
|
|
62
|
+
* @param {Float32Array} options.bounding_box bounds of the whole batch
|
|
63
|
+
* @param {Uint32Array} options.meshlet_roots output, the node each meshlet is rooted at, by meshlet
|
|
64
|
+
* index. A meshlet of one triangle is rooted at that triangle's leaf.
|
|
65
|
+
* @param {number} [options.optimization] treelet optimization passes
|
|
66
|
+
*/
|
|
67
|
+
export function meshlet_batch_to_clustered_bvh({
|
|
68
|
+
bvh,
|
|
69
|
+
meshlets,
|
|
70
|
+
bounding_box,
|
|
71
|
+
meshlet_roots,
|
|
72
|
+
optimization = 1
|
|
73
|
+
}) {
|
|
74
|
+
|
|
75
|
+
assert.defined(bvh, 'bvh');
|
|
76
|
+
assert.defined(meshlets, 'meshlets');
|
|
77
|
+
assert.defined(bounding_box, 'bounding_box');
|
|
78
|
+
|
|
79
|
+
const meshlet_count = meshlets.count;
|
|
80
|
+
|
|
81
|
+
assert.greaterThanOrEqual(meshlet_roots.length, meshlet_count, 'meshlet_roots is too short');
|
|
82
|
+
|
|
83
|
+
bvh.release_all();
|
|
84
|
+
|
|
85
|
+
if (meshlet_count === 0) {
|
|
86
|
+
bvh.root = NULL_NODE;
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const scratch_size = Math.max(meshlet_count, GEOMETRY_MESHLET_TRIANGLE_LIMIT);
|
|
91
|
+
|
|
92
|
+
const scratch_codes = new Uint32Array(scratch_size);
|
|
93
|
+
const scratch_order = new Uint32Array(scratch_size);
|
|
94
|
+
const scratch_nodes = new Uint32Array(scratch_size * 2);
|
|
95
|
+
|
|
96
|
+
// ===========
|
|
97
|
+
// The tree over the meshlets, each one a leaf for now
|
|
98
|
+
// ===========
|
|
99
|
+
for (let i = 0; i < meshlet_count; i++) {
|
|
100
|
+
const header = meshlets.read_header(i);
|
|
101
|
+
|
|
102
|
+
assert.greaterThan(header.primitive_count, 0, 'meshlet holds no triangles');
|
|
103
|
+
|
|
104
|
+
const bb = header.bounds_box;
|
|
105
|
+
|
|
106
|
+
const node = bvh.allocate_node();
|
|
107
|
+
|
|
108
|
+
bvh.node_set_aabb(node, bb);
|
|
109
|
+
|
|
110
|
+
meshlet_roots[i] = node;
|
|
111
|
+
|
|
112
|
+
scratch_codes[i] = v3_morton_encode_bounded(
|
|
113
|
+
(bb[0] + bb[3]) * 0.5,
|
|
114
|
+
(bb[1] + bb[4]) * 0.5,
|
|
115
|
+
(bb[2] + bb[5]) * 0.5,
|
|
116
|
+
bounding_box,
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const root = build_hierarchy_by_morton(bvh, meshlet_roots, scratch_codes, meshlet_count, scratch_order, scratch_nodes);
|
|
121
|
+
|
|
122
|
+
bvh.root = root;
|
|
123
|
+
|
|
124
|
+
for (let i = 0; i < optimization; i++) {
|
|
125
|
+
ebvh_optimize_treelet(bvh, root);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// ===========
|
|
129
|
+
// The tree inside each meshlet, grown under its leaf
|
|
130
|
+
// ===========
|
|
131
|
+
const triangle_nodes = new Uint32Array(GEOMETRY_MESHLET_TRIANGLE_LIMIT);
|
|
132
|
+
const triangle_aabb = new Float32Array(6);
|
|
133
|
+
|
|
134
|
+
for (let meshlet_index = 0; meshlet_index < meshlet_count; meshlet_index++) {
|
|
135
|
+
const meshlet = meshlets.read_meshlet(meshlet_index);
|
|
136
|
+
|
|
137
|
+
const meshlet_bounds = meshlet.header.bounds_box;
|
|
138
|
+
|
|
139
|
+
// NOTE: indices and vertices are per-meshlet, there are no global attributes
|
|
140
|
+
const meshlet_indices = meshlet.attribute_index;
|
|
141
|
+
const meshlet_positions = meshlet.attribute_position;
|
|
142
|
+
|
|
143
|
+
const triangle_count = meshlet.header.primitive_count;
|
|
144
|
+
|
|
145
|
+
const meshlet_root = meshlet_roots[meshlet_index];
|
|
146
|
+
|
|
147
|
+
for (let triangle_index = 0; triangle_index < triangle_count; triangle_index++) {
|
|
148
|
+
const index3 = triangle_index * 3;
|
|
149
|
+
|
|
150
|
+
aabb3_compute_from_triangle(
|
|
151
|
+
triangle_aabb, 0,
|
|
152
|
+
meshlet_positions,
|
|
153
|
+
meshlet_indices[index3],
|
|
154
|
+
meshlet_indices[index3 + 1],
|
|
155
|
+
meshlet_indices[index3 + 2],
|
|
156
|
+
);
|
|
157
|
+
|
|
158
|
+
// the leaf of a one-triangle meshlet is the meshlet's own node
|
|
159
|
+
const node = triangle_count === 1 ? meshlet_root : bvh.allocate_node();
|
|
160
|
+
|
|
161
|
+
bvh.node_set_aabb(node, triangle_aabb);
|
|
162
|
+
|
|
163
|
+
// NOTE: we already limit the number of triangles per meshlet to 256, so this is safe.
|
|
164
|
+
bvh.node_set_user_data(node, (((meshlet_index & 0x00FFFFFF) << 8) | (triangle_index & 0xFF)) >>> 0);
|
|
165
|
+
|
|
166
|
+
triangle_nodes[triangle_index] = node;
|
|
167
|
+
|
|
168
|
+
scratch_codes[triangle_index] = v3_morton_encode_bounded(
|
|
169
|
+
(triangle_aabb[0] + triangle_aabb[3]) * 0.5,
|
|
170
|
+
(triangle_aabb[1] + triangle_aabb[4]) * 0.5,
|
|
171
|
+
(triangle_aabb[2] + triangle_aabb[5]) * 0.5,
|
|
172
|
+
meshlet_bounds,
|
|
173
|
+
);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
if (triangle_count === 1) {
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
const subtree = build_hierarchy_by_morton(bvh, triangle_nodes, scratch_codes, triangle_count, scratch_order, scratch_nodes);
|
|
181
|
+
|
|
182
|
+
// the meshlet's node is already wired into the tree above, so it takes over as the root
|
|
183
|
+
bvh.node_assign_children(meshlet_root, bvh.node_get_child1(subtree), bvh.node_get_child2(subtree));
|
|
184
|
+
bvh.release_node(subtree);
|
|
185
|
+
|
|
186
|
+
for (let i = 0; i < optimization; i++) {
|
|
187
|
+
ebvh_optimize_treelet(bvh, meshlet_root);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// ===========
|
|
192
|
+
// The tree above was measured with every meshlet a leaf; bring it up to date
|
|
193
|
+
// ===========
|
|
194
|
+
for (let meshlet_index = 0; meshlet_index < meshlet_count; meshlet_index++) {
|
|
195
|
+
let node = bvh.node_get_parent(meshlet_roots[meshlet_index]);
|
|
196
|
+
|
|
197
|
+
while (node !== NULL_NODE) {
|
|
198
|
+
const child_1 = bvh.node_get_child1(node);
|
|
199
|
+
const child_2 = bvh.node_get_child2(node);
|
|
200
|
+
|
|
201
|
+
bvh.node_set_combined_aabb(node, child_1, child_2);
|
|
202
|
+
bvh.node_set_height(node, 1 + Math.max(bvh.node_get_height(child_1), bvh.node_get_height(child_2)));
|
|
203
|
+
|
|
204
|
+
node = bvh.node_get_parent(node);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nodes per workgroup. A workgroup serves one tree and one aligned run of this many of its nodes,
|
|
3
|
+
* which is what the lookup's second word counts in.
|
|
4
|
+
*
|
|
5
|
+
* @type {number}
|
|
6
|
+
*/
|
|
7
|
+
export const BLAS8_REFIT_BATCH_WORKGROUP_SIZE: number;
|
|
8
|
+
/**
|
|
9
|
+
* `u32` words of spine a node takes: its box's six floats, 24 bits to a word, under a flag.
|
|
10
|
+
*
|
|
11
|
+
* @type {number}
|
|
12
|
+
*/
|
|
13
|
+
export const BLAS8_REFIT_SPINE_STRIDE_WORDS: number;
|
|
14
|
+
/**
|
|
15
|
+
* Refit every BVH8 in a batch, from one dispatch.
|
|
16
|
+
*
|
|
17
|
+
* One lane per node, across every tree the batch lists. A node holds its slots' boxes on a grid of
|
|
18
|
+
* its own box, so a lane has two things to find: the box of everything under each of its slots, and
|
|
19
|
+
* from their union its own. A slot of triangles is read off the vertex buffer as it stands *now*. A
|
|
20
|
+
* slot that is a child node depends on that child's lane — as a tile of a prefix scan depends on the
|
|
21
|
+
* tiles before it, and this takes the scan's shape (`graph_prefix_scan_csdldf`):
|
|
22
|
+
*
|
|
23
|
+
* - **Published under a flag.** A lane leaves its node's box in the `spine`, box and flag in the same
|
|
24
|
+
* atomic words, as soon as it has it. A reader has the whole box or none of it.
|
|
25
|
+
* - **Looked for, not waited for.** A lane looks for its children's boxes a fixed number of rounds,
|
|
26
|
+
* and publishes the moment the last turns up. What has not turned up by then the lane finds out
|
|
27
|
+
* for itself, from the triangles under that child, taking as it stands the box of any node on the
|
|
28
|
+
* way down that has published. Nothing spins on another lane,
|
|
29
|
+
* and nothing depends on when a store reaches whom.
|
|
30
|
+
* - **Never in place.** Everything a lane reads to find a box out — the vertices, and the four words
|
|
31
|
+
* of a node that say what it holds — no lane writes. Everything a lane writes, no lane reads.
|
|
32
|
+
* - **In the order of the dependency.** Lanes take a tree's nodes last to first, and a child's index
|
|
33
|
+
* is above its parent's, so a device that starts workgroups in order runs the children first. Within
|
|
34
|
+
* a lane the order is the same: its own triangles, its box published if that is all there is to it,
|
|
35
|
+
* and only then a look at its children. A device that keeps neither order is slower and no less
|
|
36
|
+
* right.
|
|
37
|
+
*
|
|
38
|
+
* So there are no counters, no parents, no seeding pass and nothing to repair: a zeroed spine, then
|
|
39
|
+
* this, whatever the trees' depth.
|
|
40
|
+
*
|
|
41
|
+
* Boxes are rounded outward at every step that rounds, so a refitted node holds what is under it
|
|
42
|
+
* exactly as a built one does; it is not the same node the builder would write, whose arithmetic is
|
|
43
|
+
* exact where this is `f32`.
|
|
44
|
+
*
|
|
45
|
+
* For a skinned mesh this runs against the per-instance clone, after the skinning pass has deformed
|
|
46
|
+
* its vertex region; `geometry_index` on the row is the clone's.
|
|
47
|
+
*
|
|
48
|
+
* @type {ComputeShader}
|
|
49
|
+
*/
|
|
50
|
+
export const shader_blas8_refit_batch: ComputeShader;
|
|
51
|
+
import { ComputeShader } from "../../shader/ComputeShader.js";
|
|
52
|
+
//# sourceMappingURL=shader_blas8_refit_batch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shader_blas8_refit_batch.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/geometry/bvh/shader_blas8_refit_batch.js"],"names":[],"mappings":"AAiBA;;;;;GAKG;AACH,+CAFU,MAAM,CAEmC;AAEnD;;;;GAIG;AACH,6CAFU,MAAM,CAEgC;AAyYhD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,uCAFU,aAAa,CAMpB;8BA9c2B,+BAA+B"}
|