@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
|
@@ -0,0 +1,464 @@
|
|
|
1
|
+
import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
|
|
2
|
+
import { ComputeShader } from "../../shader/ComputeShader.js";
|
|
3
|
+
import { AABB3_STRUCT } from "../../shader/chunk/geometry/aabb3/AABB3_STRUCT.js";
|
|
4
|
+
import {
|
|
5
|
+
chunk_geometry_read_triangle_bounds
|
|
6
|
+
} from "../../shader/chunk/geometry/format/chunk_geometry_read_triangle_bounds.js";
|
|
7
|
+
import { F32_MAX_DEFINITION } from "../../shader/chunk/math/F32_MAX_DEFINITION.js";
|
|
8
|
+
import { BVH8_BLAS_MAX_DEPTH } from "../../shader/chunk/bvh/bvh8/webgpu/BVH8_MAX_DEPTH.js";
|
|
9
|
+
import { chunk_bvh8_node_grid } from "../../shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_node_grid.js";
|
|
10
|
+
import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
|
|
11
|
+
import { atomic_u32, u32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
|
|
12
|
+
import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
|
|
13
|
+
import { GEOMETRY_ATTRIBUTE_DATA_TYPE } from "../GEOMETRY_ATTRIBUTE_DATA_TYPE.js";
|
|
14
|
+
import { GEOMETRY_METADATA_STRUCT } from "../GEOMETRY_METADATA_STRUCT.js";
|
|
15
|
+
import { MESHLET_METADATA_STRUCT } from "../meshlet/encoding/MESHLET_METADATA_STRUCT.js";
|
|
16
|
+
import { BLAS8_REFIT_TARGET_STRUCT } from "./BLAS8_REFIT_TARGET_STRUCT.js";
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Nodes per workgroup. A workgroup serves one tree and one aligned run of this many of its nodes,
|
|
20
|
+
* which is what the lookup's second word counts in.
|
|
21
|
+
*
|
|
22
|
+
* @type {number}
|
|
23
|
+
*/
|
|
24
|
+
export const BLAS8_REFIT_BATCH_WORKGROUP_SIZE = 64;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* `u32` words of spine a node takes: its box's six floats, 24 bits to a word, under a flag.
|
|
28
|
+
*
|
|
29
|
+
* @type {number}
|
|
30
|
+
*/
|
|
31
|
+
export const BLAS8_REFIT_SPINE_STRIDE_WORDS = 8;
|
|
32
|
+
|
|
33
|
+
const resources = new ShaderResourceSetDescriptor();
|
|
34
|
+
|
|
35
|
+
// Workgroups already covered by earlier sub-dispatches of the same batch, for a batch larger than
|
|
36
|
+
// the device's per-dimension cap. Four bytes, per dispatch: immediate data.
|
|
37
|
+
resources.setImmediate("dispatch_offset", u32);
|
|
38
|
+
|
|
39
|
+
resources.createGroup()
|
|
40
|
+
// one row per tree in the batch
|
|
41
|
+
.addStorageBuffer("targets", WebGPUArray.from(BLAS8_REFIT_TARGET_STRUCT), false)
|
|
42
|
+
// `(target_index, node_base)` per workgroup, flat
|
|
43
|
+
.addStorageBuffer("lookup", WebGPUArray.from(u32), false)
|
|
44
|
+
// The node arena, flat. Of a node, this kernel reads words 4 to 7 — its child block, its triangle
|
|
45
|
+
// run and its metas — and writes the rest: its origin, exponents and quantized boxes. Nothing it
|
|
46
|
+
// writes does it read, of any node.
|
|
47
|
+
.addStorageBuffer("nodes", WebGPUArray.from(u32), true)
|
|
48
|
+
// every node's box as its own lane found it, for the lane of the node above; zero at the start of
|
|
49
|
+
// every batch, which reads "not here yet"
|
|
50
|
+
.addStorageBuffer("spine", WebGPUArray.from(atomic_u32), true)
|
|
51
|
+
.addStorageBuffer("geometries", WebGPUArray.from(GEOMETRY_METADATA_STRUCT), false)
|
|
52
|
+
.addStorageBuffer("meshlet_metadata", WebGPUArray.from(MESHLET_METADATA_STRUCT), false)
|
|
53
|
+
.addStorageBuffer("meshlet_data", GEOMETRY_ATTRIBUTE_DATA_TYPE, false);
|
|
54
|
+
|
|
55
|
+
const body = CodeChunk.from(
|
|
56
|
+
//language=WGSL
|
|
57
|
+
`
|
|
58
|
+
const NODE_STRIDE = 20u;
|
|
59
|
+
const NODE_CHILD_BASE = 4u;
|
|
60
|
+
const NODE_TRIANGLE_BASE = 5u;
|
|
61
|
+
const NODE_METAS = 6u;
|
|
62
|
+
const NODE_BOXES = 8u;
|
|
63
|
+
|
|
64
|
+
const SPINE_STRIDE = ${BLAS8_REFIT_SPINE_STRIDE_WORDS}u;
|
|
65
|
+
const SPINE_HERE = 0x80000000u;
|
|
66
|
+
const SPINE_BITS = 0x00ffffffu;
|
|
67
|
+
|
|
68
|
+
// how many rounds a lane looks for its children's boxes before finding the missing ones out for itself;
|
|
69
|
+
// the prefix scan's count
|
|
70
|
+
const LOOKS = 4u;
|
|
71
|
+
|
|
72
|
+
// what a node's four words of topology say
|
|
73
|
+
struct Blas8RefitShape {
|
|
74
|
+
child_base: u32,
|
|
75
|
+
triangle_base: u32,
|
|
76
|
+
metas: vec2<u32>,
|
|
77
|
+
// a bit per slot that holds a child node
|
|
78
|
+
internal: u32,
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
struct Blas8RefitLook {
|
|
82
|
+
found: bool,
|
|
83
|
+
box: ${AABB3_STRUCT.wgsl_ref},
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
fn blas8_refit_shape(node_word: u32) -> Blas8RefitShape {
|
|
87
|
+
let metas = vec2<u32>(nodes[node_word + NODE_METAS], nodes[node_word + NODE_METAS + 1u]);
|
|
88
|
+
|
|
89
|
+
// a child node's meta has 24 or more in its low five bits: bits 3 and 4 both set
|
|
90
|
+
let first = metas.x & (metas.x >> 1u) & 0x08080808u;
|
|
91
|
+
let second = metas.y & (metas.y >> 1u) & 0x08080808u;
|
|
92
|
+
|
|
93
|
+
let internal =
|
|
94
|
+
((first >> 3u) & 1u) | ((first >> 10u) & 2u) | ((first >> 17u) & 4u) | ((first >> 24u) & 8u)
|
|
95
|
+
| ((second << 1u) & 16u) | ((second >> 6u) & 32u) | ((second >> 13u) & 64u) | ((second >> 20u) & 128u);
|
|
96
|
+
|
|
97
|
+
return Blas8RefitShape(nodes[node_word + NODE_CHILD_BASE], nodes[node_word + NODE_TRIANGLE_BASE], metas, internal);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
fn blas8_refit_slot_meta(shape: Blas8RefitShape, slot: u32) -> u32 {
|
|
101
|
+
return (select(shape.metas.y, shape.metas.x, slot < 4u) >> ((slot & 3u) * 8u)) & 0xffu;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
fn blas8_refit_empty_box() -> ${AABB3_STRUCT.wgsl_ref} {
|
|
105
|
+
return ${AABB3_STRUCT.wgsl_ref}(vec3<f32>(F32_MAX), vec3<f32>(-F32_MAX));
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// the box of the triangles a leaf slot names, as the vertices stand now
|
|
109
|
+
fn blas8_refit_slot_triangles(
|
|
110
|
+
geometry: ${GEOMETRY_METADATA_STRUCT.wgsl_ref},
|
|
111
|
+
triangle_base: u32,
|
|
112
|
+
slot_meta: u32,
|
|
113
|
+
) -> ${AABB3_STRUCT.wgsl_ref} {
|
|
114
|
+
var box = blas8_refit_empty_box();
|
|
115
|
+
|
|
116
|
+
let first = triangle_base + (slot_meta & 31u);
|
|
117
|
+
let count = countOneBits(slot_meta >> 5u);
|
|
118
|
+
|
|
119
|
+
for (var i = 0u; i < count; i++) {
|
|
120
|
+
let triangle = geometry_read_triangle_bounds(geometry, first + i);
|
|
121
|
+
|
|
122
|
+
box.min = min(box.min, triangle.min);
|
|
123
|
+
box.max = max(box.max, triangle.max);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
return box;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// A node's box goes into the spine as 192 bits, 24 to a word, each word under its own flag: a reader
|
|
130
|
+
// that finds all eight flags has the box, and one that does not has nothing, whatever order the
|
|
131
|
+
// stores reach it in.
|
|
132
|
+
fn blas8_refit_publish(spine_word: u32, box: ${AABB3_STRUCT.wgsl_ref}) {
|
|
133
|
+
let low = bitcast<vec3<u32>>(box.min);
|
|
134
|
+
let high = bitcast<vec3<u32>>(box.max);
|
|
135
|
+
|
|
136
|
+
atomicStore(&spine[spine_word], SPINE_HERE | (low.x & SPINE_BITS));
|
|
137
|
+
atomicStore(&spine[spine_word + 1u], SPINE_HERE | (low.x >> 24u) | ((low.y & 0xffffu) << 8u));
|
|
138
|
+
atomicStore(&spine[spine_word + 2u], SPINE_HERE | (low.y >> 16u) | ((low.z & 0xffu) << 16u));
|
|
139
|
+
atomicStore(&spine[spine_word + 3u], SPINE_HERE | (low.z >> 8u));
|
|
140
|
+
atomicStore(&spine[spine_word + 4u], SPINE_HERE | (high.x & SPINE_BITS));
|
|
141
|
+
atomicStore(&spine[spine_word + 5u], SPINE_HERE | (high.x >> 24u) | ((high.y & 0xffffu) << 8u));
|
|
142
|
+
atomicStore(&spine[spine_word + 6u], SPINE_HERE | (high.y >> 16u) | ((high.z & 0xffu) << 16u));
|
|
143
|
+
atomicStore(&spine[spine_word + 7u], SPINE_HERE | (high.z >> 8u));
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
fn blas8_refit_look(spine_word: u32) -> Blas8RefitLook {
|
|
147
|
+
var seen: Blas8RefitLook;
|
|
148
|
+
seen.found = false;
|
|
149
|
+
|
|
150
|
+
let w0 = atomicLoad(&spine[spine_word]);
|
|
151
|
+
|
|
152
|
+
if ((w0 & SPINE_HERE) == 0u) {
|
|
153
|
+
return seen;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
let w1 = atomicLoad(&spine[spine_word + 1u]);
|
|
157
|
+
let w2 = atomicLoad(&spine[spine_word + 2u]);
|
|
158
|
+
let w3 = atomicLoad(&spine[spine_word + 3u]);
|
|
159
|
+
let w4 = atomicLoad(&spine[spine_word + 4u]);
|
|
160
|
+
let w5 = atomicLoad(&spine[spine_word + 5u]);
|
|
161
|
+
let w6 = atomicLoad(&spine[spine_word + 6u]);
|
|
162
|
+
let w7 = atomicLoad(&spine[spine_word + 7u]);
|
|
163
|
+
|
|
164
|
+
if ((w1 & w2 & w3 & w4 & w5 & w6 & w7 & SPINE_HERE) == 0u) {
|
|
165
|
+
return seen;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
seen.found = true;
|
|
169
|
+
|
|
170
|
+
seen.box.min = bitcast<vec3<f32>>(vec3<u32>(
|
|
171
|
+
(w0 & SPINE_BITS) | ((w1 & 0xffu) << 24u),
|
|
172
|
+
((w1 & SPINE_BITS) >> 8u) | ((w2 & 0xffffu) << 16u),
|
|
173
|
+
((w2 & SPINE_BITS) >> 16u) | ((w3 & SPINE_BITS) << 8u),
|
|
174
|
+
));
|
|
175
|
+
|
|
176
|
+
seen.box.max = bitcast<vec3<f32>>(vec3<u32>(
|
|
177
|
+
(w4 & SPINE_BITS) | ((w5 & 0xffu) << 24u),
|
|
178
|
+
((w5 & SPINE_BITS) >> 8u) | ((w6 & 0xffffu) << 16u),
|
|
179
|
+
((w6 & SPINE_BITS) >> 16u) | ((w7 & SPINE_BITS) << 8u),
|
|
180
|
+
));
|
|
181
|
+
|
|
182
|
+
return seen;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// The box of everything under a node, found without waiting for anyone: from the triangles, except
|
|
186
|
+
// where a node on the way down has published, whose box is then taken as it stands.
|
|
187
|
+
fn blas8_refit_subtree_box(
|
|
188
|
+
tree: ${BLAS8_REFIT_TARGET_STRUCT.wgsl_ref},
|
|
189
|
+
geometry: ${GEOMETRY_METADATA_STRUCT.wgsl_ref},
|
|
190
|
+
root: u32,
|
|
191
|
+
) -> ${AABB3_STRUCT.wgsl_ref} {
|
|
192
|
+
var box = blas8_refit_empty_box();
|
|
193
|
+
|
|
194
|
+
// a node, and its child slots still to take; one entry a level
|
|
195
|
+
var stack: array<vec2u, ${BVH8_BLAS_MAX_DEPTH}>;
|
|
196
|
+
var pointer = 0u;
|
|
197
|
+
|
|
198
|
+
var node = root;
|
|
199
|
+
var pending = 0u;
|
|
200
|
+
var arriving = true;
|
|
201
|
+
|
|
202
|
+
loop {
|
|
203
|
+
let shape = blas8_refit_shape((tree.node_offset + node) * NODE_STRIDE);
|
|
204
|
+
|
|
205
|
+
if (arriving) {
|
|
206
|
+
for (var slot = 0u; slot < 8u; slot++) {
|
|
207
|
+
let slot_meta = blas8_refit_slot_meta(shape, slot);
|
|
208
|
+
|
|
209
|
+
if (slot_meta == 0u || (shape.internal & (1u << slot)) != 0u) {
|
|
210
|
+
continue;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
let triangles = blas8_refit_slot_triangles(geometry, shape.triangle_base, slot_meta);
|
|
214
|
+
|
|
215
|
+
box.min = min(box.min, triangles.min);
|
|
216
|
+
box.max = max(box.max, triangles.max);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
pending = shape.internal;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
if (pending == 0u) {
|
|
223
|
+
if (pointer == 0u) {
|
|
224
|
+
break;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
pointer--;
|
|
228
|
+
|
|
229
|
+
node = stack[pointer].x;
|
|
230
|
+
pending = stack[pointer].y;
|
|
231
|
+
arriving = false;
|
|
232
|
+
|
|
233
|
+
continue;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
let slot = countTrailingZeros(pending);
|
|
237
|
+
|
|
238
|
+
pending &= pending - 1u;
|
|
239
|
+
|
|
240
|
+
let child = shape.child_base + countOneBits(shape.internal & ((1u << slot) - 1u));
|
|
241
|
+
|
|
242
|
+
let seen = blas8_refit_look((tree.spine_offset + child) * SPINE_STRIDE);
|
|
243
|
+
|
|
244
|
+
if (seen.found) {
|
|
245
|
+
box.min = min(box.min, seen.box.min);
|
|
246
|
+
box.max = max(box.max, seen.box.max);
|
|
247
|
+
|
|
248
|
+
arriving = false;
|
|
249
|
+
|
|
250
|
+
continue;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
if (pending != 0u && pointer < ${BVH8_BLAS_MAX_DEPTH}u) {
|
|
254
|
+
stack[pointer] = vec2u(node, pending);
|
|
255
|
+
pointer++;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
node = child;
|
|
259
|
+
arriving = true;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
return box;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
@compute @workgroup_size(${BLAS8_REFIT_BATCH_WORKGROUP_SIZE}, 1, 1)
|
|
266
|
+
fn main(
|
|
267
|
+
@builtin(workgroup_id) wg: vec3<u32>,
|
|
268
|
+
@builtin(local_invocation_id) lid: vec3<u32>,
|
|
269
|
+
) {
|
|
270
|
+
// Which tree, and which run of its nodes: one lookup pair per workgroup.
|
|
271
|
+
let pair = (wg.x + dispatch_offset) * 2u;
|
|
272
|
+
|
|
273
|
+
// ("target" is a reserved word in WGSL)
|
|
274
|
+
let tree = targets[lookup[pair]];
|
|
275
|
+
|
|
276
|
+
let ordinal = lookup[pair + 1u] + lid.x;
|
|
277
|
+
|
|
278
|
+
if (ordinal >= tree.node_count) {
|
|
279
|
+
// the tail of a tree's last run; the next workgroup is another tree's
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
// Last node first. A child's index is above its parent's, so the order workgroups are started in
|
|
284
|
+
// is the order the nodes depend on each other in, and a lane mostly finds what it looks for.
|
|
285
|
+
let node = tree.node_count - 1u - ordinal;
|
|
286
|
+
|
|
287
|
+
let node_word = (tree.node_offset + node) * NODE_STRIDE;
|
|
288
|
+
|
|
289
|
+
let geometry = geometries[tree.geometry_index];
|
|
290
|
+
|
|
291
|
+
let shape = blas8_refit_shape(node_word);
|
|
292
|
+
|
|
293
|
+
var slot_low: array<vec3<f32>, 8>;
|
|
294
|
+
var slot_high: array<vec3<f32>, 8>;
|
|
295
|
+
|
|
296
|
+
var box = blas8_refit_empty_box();
|
|
297
|
+
|
|
298
|
+
// The slots of triangles first. They are this lane's own work and take it a while, and for that
|
|
299
|
+
// while the lanes of the nodes below are at theirs: by the time this one turns to its child
|
|
300
|
+
// nodes, a child with only triangles under it has published.
|
|
301
|
+
for (var slot = 0u; slot < 8u; slot++) {
|
|
302
|
+
let slot_meta = blas8_refit_slot_meta(shape, slot);
|
|
303
|
+
|
|
304
|
+
if (slot_meta == 0u || (shape.internal & (1u << slot)) != 0u) {
|
|
305
|
+
continue;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
let under = blas8_refit_slot_triangles(geometry, shape.triangle_base, slot_meta);
|
|
309
|
+
|
|
310
|
+
slot_low[slot] = under.min;
|
|
311
|
+
slot_high[slot] = under.max;
|
|
312
|
+
|
|
313
|
+
box.min = min(box.min, under.min);
|
|
314
|
+
box.max = max(box.max, under.max);
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
let spine_word = (tree.spine_offset + node) * SPINE_STRIDE;
|
|
318
|
+
|
|
319
|
+
// A node with nothing but triangles under it has its box now, and says so now: before any lane
|
|
320
|
+
// of this workgroup turns to its children, which may be this node.
|
|
321
|
+
if (shape.internal == 0u) {
|
|
322
|
+
blas8_refit_publish(spine_word, box);
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
// The child nodes, looked for in rounds: every one still missing, once a round. A node whose
|
|
326
|
+
// children have all turned up publishes there and then, inside the round, which is what lets the
|
|
327
|
+
// node above it find it in the next.
|
|
328
|
+
var missing = shape.internal;
|
|
329
|
+
|
|
330
|
+
for (var round = 0u; round < LOOKS && missing != 0u; round++) {
|
|
331
|
+
var unseen = missing;
|
|
332
|
+
|
|
333
|
+
while (unseen != 0u) {
|
|
334
|
+
let slot = countTrailingZeros(unseen);
|
|
335
|
+
|
|
336
|
+
unseen &= unseen - 1u;
|
|
337
|
+
|
|
338
|
+
let child = shape.child_base + countOneBits(shape.internal & ((1u << slot) - 1u));
|
|
339
|
+
|
|
340
|
+
let seen = blas8_refit_look((tree.spine_offset + child) * SPINE_STRIDE);
|
|
341
|
+
|
|
342
|
+
if (!seen.found) {
|
|
343
|
+
continue;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
missing &= ~(1u << slot);
|
|
347
|
+
|
|
348
|
+
slot_low[slot] = seen.box.min;
|
|
349
|
+
slot_high[slot] = seen.box.max;
|
|
350
|
+
|
|
351
|
+
box.min = min(box.min, seen.box.min);
|
|
352
|
+
box.max = max(box.max, seen.box.max);
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
if (missing == 0u) {
|
|
356
|
+
blas8_refit_publish(spine_word, box);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
if (missing != 0u) {
|
|
361
|
+
// not here, and not waited for
|
|
362
|
+
while (missing != 0u) {
|
|
363
|
+
let slot = countTrailingZeros(missing);
|
|
364
|
+
|
|
365
|
+
missing &= missing - 1u;
|
|
366
|
+
|
|
367
|
+
let child = shape.child_base + countOneBits(shape.internal & ((1u << slot) - 1u));
|
|
368
|
+
|
|
369
|
+
let under = blas8_refit_subtree_box(tree, geometry, child);
|
|
370
|
+
|
|
371
|
+
slot_low[slot] = under.min;
|
|
372
|
+
slot_high[slot] = under.max;
|
|
373
|
+
|
|
374
|
+
box.min = min(box.min, under.min);
|
|
375
|
+
box.max = max(box.max, under.max);
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
blas8_refit_publish(spine_word, box);
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
// this node, on the grid of its own box, and each slot's box in bytes on it
|
|
382
|
+
let grid = bvh8_node_grid(box.min, box.max);
|
|
383
|
+
|
|
384
|
+
var boxes: array<u32, 12>;
|
|
385
|
+
|
|
386
|
+
for (var slot = 0u; slot < 8u; slot++) {
|
|
387
|
+
if (blas8_refit_slot_meta(shape, slot) == 0u) {
|
|
388
|
+
continue;
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
let q_low = bvh8_node_grid_low(grid, slot_low[slot]);
|
|
392
|
+
let q_high = bvh8_node_grid_high(grid, slot_high[slot]);
|
|
393
|
+
|
|
394
|
+
let word = slot >> 2u;
|
|
395
|
+
let shift = (slot & 3u) * 8u;
|
|
396
|
+
|
|
397
|
+
// per axis: two words of low bytes, then two of high
|
|
398
|
+
boxes[word] |= q_low.x << shift;
|
|
399
|
+
boxes[2u + word] |= q_high.x << shift;
|
|
400
|
+
boxes[4u + word] |= q_low.y << shift;
|
|
401
|
+
boxes[6u + word] |= q_high.y << shift;
|
|
402
|
+
boxes[8u + word] |= q_low.z << shift;
|
|
403
|
+
boxes[10u + word] |= q_high.z << shift;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
nodes[node_word] = bitcast<u32>(box.min.x);
|
|
407
|
+
nodes[node_word + 1u] = bitcast<u32>(box.min.y);
|
|
408
|
+
nodes[node_word + 2u] = bitcast<u32>(box.min.z);
|
|
409
|
+
nodes[node_word + 3u] = grid.exponent.x | (grid.exponent.y << 8u) | (grid.exponent.z << 16u) | (shape.internal << 24u);
|
|
410
|
+
|
|
411
|
+
for (var i = 0u; i < 12u; i++) {
|
|
412
|
+
nodes[node_word + NODE_BOXES + i] = boxes[i];
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
`, [
|
|
416
|
+
F32_MAX_DEFINITION,
|
|
417
|
+
AABB3_STRUCT.declaration_chunk,
|
|
418
|
+
GEOMETRY_METADATA_STRUCT.declaration_chunk,
|
|
419
|
+
BLAS8_REFIT_TARGET_STRUCT.declaration_chunk,
|
|
420
|
+
chunk_geometry_read_triangle_bounds,
|
|
421
|
+
chunk_bvh8_node_grid,
|
|
422
|
+
]);
|
|
423
|
+
|
|
424
|
+
/**
|
|
425
|
+
* Refit every BVH8 in a batch, from one dispatch.
|
|
426
|
+
*
|
|
427
|
+
* One lane per node, across every tree the batch lists. A node holds its slots' boxes on a grid of
|
|
428
|
+
* its own box, so a lane has two things to find: the box of everything under each of its slots, and
|
|
429
|
+
* from their union its own. A slot of triangles is read off the vertex buffer as it stands *now*. A
|
|
430
|
+
* slot that is a child node depends on that child's lane — as a tile of a prefix scan depends on the
|
|
431
|
+
* tiles before it, and this takes the scan's shape (`graph_prefix_scan_csdldf`):
|
|
432
|
+
*
|
|
433
|
+
* - **Published under a flag.** A lane leaves its node's box in the `spine`, box and flag in the same
|
|
434
|
+
* atomic words, as soon as it has it. A reader has the whole box or none of it.
|
|
435
|
+
* - **Looked for, not waited for.** A lane looks for its children's boxes a fixed number of rounds,
|
|
436
|
+
* and publishes the moment the last turns up. What has not turned up by then the lane finds out
|
|
437
|
+
* for itself, from the triangles under that child, taking as it stands the box of any node on the
|
|
438
|
+
* way down that has published. Nothing spins on another lane,
|
|
439
|
+
* and nothing depends on when a store reaches whom.
|
|
440
|
+
* - **Never in place.** Everything a lane reads to find a box out — the vertices, and the four words
|
|
441
|
+
* of a node that say what it holds — no lane writes. Everything a lane writes, no lane reads.
|
|
442
|
+
* - **In the order of the dependency.** Lanes take a tree's nodes last to first, and a child's index
|
|
443
|
+
* is above its parent's, so a device that starts workgroups in order runs the children first. Within
|
|
444
|
+
* a lane the order is the same: its own triangles, its box published if that is all there is to it,
|
|
445
|
+
* and only then a look at its children. A device that keeps neither order is slower and no less
|
|
446
|
+
* right.
|
|
447
|
+
*
|
|
448
|
+
* So there are no counters, no parents, no seeding pass and nothing to repair: a zeroed spine, then
|
|
449
|
+
* this, whatever the trees' depth.
|
|
450
|
+
*
|
|
451
|
+
* Boxes are rounded outward at every step that rounds, so a refitted node holds what is under it
|
|
452
|
+
* exactly as a built one does; it is not the same node the builder would write, whose arithmetic is
|
|
453
|
+
* exact where this is `f32`.
|
|
454
|
+
*
|
|
455
|
+
* For a skinned mesh this runs against the per-instance clone, after the skinning pass has deformed
|
|
456
|
+
* its vertex region; `geometry_index` on the row is the clone's.
|
|
457
|
+
*
|
|
458
|
+
* @type {ComputeShader}
|
|
459
|
+
*/
|
|
460
|
+
export const shader_blas8_refit_batch = ComputeShader.from({
|
|
461
|
+
label: "BLAS8/RefitBatch",
|
|
462
|
+
resources,
|
|
463
|
+
body,
|
|
464
|
+
});
|
|
@@ -69,6 +69,18 @@ export class MeshletBatch {
|
|
|
69
69
|
attribute_index: Uint32Array;
|
|
70
70
|
attribute_position: Float32Array;
|
|
71
71
|
};
|
|
72
|
+
/**
|
|
73
|
+
* Re-order the triangles of one meshlet: triangle `i` becomes the triangle that was at `order[i]`.
|
|
74
|
+
*
|
|
75
|
+
* Only the meshlet's index section is rewritten, in place. Vertices, attributes, bounds and the
|
|
76
|
+
* meshlet's address are untouched, so the meshlet draws exactly what it drew before; what changes is
|
|
77
|
+
* which triangle a `(meshlet, triangle)` id names. Anything that recorded such an id beforehand —
|
|
78
|
+
* a BLAS leaf, most of all — names a different triangle afterwards.
|
|
79
|
+
*
|
|
80
|
+
* @param {number} meshlet_id
|
|
81
|
+
* @param {Uint8Array|number[]} order a permutation of `0 .. primitive_count - 1`
|
|
82
|
+
*/
|
|
83
|
+
reorder_triangles(meshlet_id: number, order: Uint8Array | number[]): void;
|
|
72
84
|
build_bounds(): void;
|
|
73
85
|
/**
|
|
74
86
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MeshletBatch.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/geometry/meshlet/MeshletBatch.js"],"names":[],"mappings":"AA4DA;;GAEG;AACH;IAiBI;;;OAGG;IACH,oCAGC;IAXD,+BAEC;IA6BD;;;OAGG;IACH,wCAGC;IAfD;;;OAGG;IACH,mCAEC;IAuBD;;;OAGG;IACH,yBAEC;IAdD;;;OAGG;IACH,oBAEC;IAUD;;;OAGG;IACH,8BAEC;IAED;;;OAGG;IACH,QAFa,MAAM,CASlB;IAED;;;OAGG;IACH,cAFW,YAAY,WAQtB;IAED;;;;OAIG;IACH,YAFa,MAAM,CAiHlB;IAED;;;OAGG;IACH,iBAEC;IAED;;;;OAIG;IACH,wBAHW,MAAM,GACL,EAAE,CAeb;IAED;;;OAGG;IACH,yBAFW,MAAM;;;;MAgChB;IAiMD,qBA+BC;IAED;;;OAGG;IACH,gBAFW,QAAQ,QASlB;IAIL;;;;OAIG;IACH,yBAFU,OAAO,CAEoB;;CAPpC;
|
|
1
|
+
{"version":3,"file":"MeshletBatch.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/geometry/meshlet/MeshletBatch.js"],"names":[],"mappings":"AA4DA;;GAEG;AACH;IAiBI;;;OAGG;IACH,oCAGC;IAXD,+BAEC;IA6BD;;;OAGG;IACH,wCAGC;IAfD;;;OAGG;IACH,mCAEC;IAuBD;;;OAGG;IACH,yBAEC;IAdD;;;OAGG;IACH,oBAEC;IAUD;;;OAGG;IACH,8BAEC;IAED;;;OAGG;IACH,QAFa,MAAM,CASlB;IAED;;;OAGG;IACH,cAFW,YAAY,WAQtB;IAED;;;;OAIG;IACH,YAFa,MAAM,CAiHlB;IAED;;;OAGG;IACH,iBAEC;IAED;;;;OAIG;IACH,wBAHW,MAAM,GACL,EAAE,CAeb;IAED;;;OAGG;IACH,yBAFW,MAAM;;;;MAgChB;IAED;;;;;;;;;;OAUG;IACH,8BAHW,MAAM,SACN,UAAU,GAAC,MAAM,EAAE,QA0B7B;IAiMD,qBA+BC;IAED;;;OAGG;IACH,gBAFW,QAAQ,QASlB;IAIL;;;;OAIG;IACH,yBAFU,OAAO,CAEoB;;CAPpC;uBAllBY,OAAO,gBAAgB,EAAE,QAAQ"}
|
|
@@ -349,6 +349,43 @@ export class MeshletBatch {
|
|
|
349
349
|
}
|
|
350
350
|
}
|
|
351
351
|
|
|
352
|
+
/**
|
|
353
|
+
* Re-order the triangles of one meshlet: triangle `i` becomes the triangle that was at `order[i]`.
|
|
354
|
+
*
|
|
355
|
+
* Only the meshlet's index section is rewritten, in place. Vertices, attributes, bounds and the
|
|
356
|
+
* meshlet's address are untouched, so the meshlet draws exactly what it drew before; what changes is
|
|
357
|
+
* which triangle a `(meshlet, triangle)` id names. Anything that recorded such an id beforehand —
|
|
358
|
+
* a BLAS leaf, most of all — names a different triangle afterwards.
|
|
359
|
+
*
|
|
360
|
+
* @param {number} meshlet_id
|
|
361
|
+
* @param {Uint8Array|number[]} order a permutation of `0 .. primitive_count - 1`
|
|
362
|
+
*/
|
|
363
|
+
reorder_triangles(meshlet_id, order) {
|
|
364
|
+
assert.isNonNegativeInteger(meshlet_id, 'meshlet_id');
|
|
365
|
+
assert.lessThan(meshlet_id, this.#count, 'index overflow');
|
|
366
|
+
|
|
367
|
+
const header = this.read_header(meshlet_id);
|
|
368
|
+
|
|
369
|
+
const primitive_count = header.primitive_count;
|
|
370
|
+
|
|
371
|
+
assert.greaterThanOrEqual(order.length, primitive_count, 'order is too short');
|
|
372
|
+
|
|
373
|
+
const bytes = new Uint8Array(this.#data, header.address << 2, primitive_count * 3);
|
|
374
|
+
|
|
375
|
+
const original = bytes.slice();
|
|
376
|
+
|
|
377
|
+
for (let i = 0; i < primitive_count; i++) {
|
|
378
|
+
const source = order[i] * 3;
|
|
379
|
+
const target = i * 3;
|
|
380
|
+
|
|
381
|
+
assert.lessThan(order[i], primitive_count, 'order names a triangle the meshlet does not have');
|
|
382
|
+
|
|
383
|
+
bytes[target] = original[source];
|
|
384
|
+
bytes[target + 1] = original[source + 1];
|
|
385
|
+
bytes[target + 2] = original[source + 2];
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
|
|
352
389
|
/**
|
|
353
390
|
*
|
|
354
391
|
* @param {Geometry} geometry
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shader_mesh_sdf_classify.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_classify.js"],"names":[],"mappings":"AAyCA;;;;;GAKG;AACH,mDAFW,OAAO,2DAA2D,EAAE,6BAA6B,QAS3G;AA/BD;;GAEG;AACH,yCAFU,YAAY,CAeQ;AA6B9B;;;;;;;;;;;;;;;GAeG;AACH,uCAFU,aAAa,CAsDpB;
|
|
1
|
+
{"version":3,"file":"shader_mesh_sdf_classify.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_classify.js"],"names":[],"mappings":"AAyCA;;;;;GAKG;AACH,mDAFW,OAAO,2DAA2D,EAAE,6BAA6B,QAS3G;AA/BD;;GAEG;AACH,yCAFU,YAAY,CAeQ;AA6B9B;;;;;;;;;;;;;;;GAeG;AACH,uCAFU,aAAa,CAsDpB;6BAjI0B,sCAAsC;8BAJrC,kCAAkC"}
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
import { UINT32_MAX } from "../../../../../core/binary/UINT32_MAX.js";
|
|
2
|
-
import { BVH2_NODE_STRUCT } from "../../../shader/chunk/bvh/BVH2_NODE_STRUCT.js";
|
|
3
|
-
import { BVH_TRAVERSAL_STACK_SIZE } from "../../../shader/chunk/bvh/BVH_TRAVERSAL_STACK_SIZE.js";
|
|
4
2
|
import { chunk_point_query_blas_nearest } from "../../../shader/chunk/sdf/chunk_point_query_blas_nearest.js";
|
|
5
3
|
import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
|
|
6
4
|
import { ComputeShader } from "../../../shader/ComputeShader.js";
|
|
@@ -20,6 +18,8 @@ import {
|
|
|
20
18
|
MESH_SDF_RANGES_RESOURCE
|
|
21
19
|
} from "./chunk_mesh_sdf_bake.js";
|
|
22
20
|
import { MESH_SDF_BAKE_WORKGROUP_SIZE } from "./MESH_SDF_BAKE.js";
|
|
21
|
+
import { BVH8_INODE_STRUCT } from "../../../shader/chunk/bvh/bvh8/webgpu/BVH8_INODE_STRUCT.js";
|
|
22
|
+
import { BVH8_TRAVERSAL_STACK_SIZE } from "../../../shader/chunk/bvh/bvh8/webgpu/BVH8_MAX_DEPTH.js";
|
|
23
23
|
|
|
24
24
|
/**
|
|
25
25
|
* @type {WebGPUStruct}
|
|
@@ -48,7 +48,7 @@ export const MESH_SDF_CLASSIFY_SETTINGS = WebGPUStruct.from({
|
|
|
48
48
|
export function mesh_sdf_add_blas_resources(group) {
|
|
49
49
|
group
|
|
50
50
|
.addStorageBuffer("blas_lookup", WebGPUArray.u32)
|
|
51
|
-
.addStorageBuffer("blas_data", WebGPUArray.from(
|
|
51
|
+
.addStorageBuffer("blas_data", WebGPUArray.from(BVH8_INODE_STRUCT))
|
|
52
52
|
.addStorageBuffer("geometries", WebGPUArray.from(GEOMETRY_METADATA_STRUCT))
|
|
53
53
|
.add(MESHLET_METADATA_RESOURCE)
|
|
54
54
|
.add(GEOMETRY_ATTRIBUTE_DATA_RESOURCE);
|
|
@@ -113,7 +113,7 @@ fn main(
|
|
|
113
113
|
let centre = mesh_sdf_brick_corner(header, brick) + vec3<f32>(0.5 * f32(MESH_SDF_BRICK_VOXELS) * voxel);
|
|
114
114
|
let reach = (MESH_SDF_BAND_VOXELS + MESH_SDF_BRICK_HALF_DIAGONAL) * voxel;
|
|
115
115
|
|
|
116
|
-
var stack: array<
|
|
116
|
+
var stack: array<vec2u, ${BVH8_TRAVERSAL_STACK_SIZE}>;
|
|
117
117
|
|
|
118
118
|
let nearest = point_query_blas_nearest(centre, reach, geometry, &stack, 0u);
|
|
119
119
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shader_mesh_sdf_evaluate.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_evaluate.js"],"names":[],"mappings":"AAcA;;GAEG;AACH,yCAFU,YAAY,CAWQ;AAe9B;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,uCAFU,aAAa,CAoFpB;
|
|
1
|
+
{"version":3,"file":"shader_mesh_sdf_evaluate.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_evaluate.js"],"names":[],"mappings":"AAcA;;GAEG;AACH,yCAFU,YAAY,CAWQ;AAe9B;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,uCAFU,aAAa,CAoFpB;6BA5I0B,sCAAsC;8BAJrC,kCAAkC"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { BVH_TRAVERSAL_STACK_SIZE } from "../../../shader/chunk/bvh/BVH_TRAVERSAL_STACK_SIZE.js";
|
|
2
1
|
import { SURFACE_POINT_3D } from "../../../shader/chunk/sdf/SURFACE_POINT_3D.js";
|
|
3
2
|
import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
|
|
4
3
|
import { ComputeShader } from "../../../shader/ComputeShader.js";
|
|
@@ -11,6 +10,7 @@ import { MESH_SDF_HEADERS_RESOURCE } from "../MESH_SDF_RESOURCES.js";
|
|
|
11
10
|
import { chunk_mesh_sdf_bake, chunk_mesh_sdf_bake_settle, MESH_SDF_ARENA_RESOURCE } from "./chunk_mesh_sdf_bake.js";
|
|
12
11
|
import { MESH_SDF_BAKE_WORKGROUP_SIZE } from "./MESH_SDF_BAKE.js";
|
|
13
12
|
import { mesh_sdf_add_blas_resources } from "./shader_mesh_sdf_classify.js";
|
|
13
|
+
import { BVH8_TRAVERSAL_STACK_SIZE } from "../../../shader/chunk/bvh/bvh8/webgpu/BVH8_MAX_DEPTH.js";
|
|
14
14
|
|
|
15
15
|
/**
|
|
16
16
|
* @type {WebGPUStruct}
|
|
@@ -93,7 +93,7 @@ fn main(
|
|
|
93
93
|
let texel = (workgroup_id.x % MESH_SDF_GROUPS_PER_BRICK) * MESH_SDF_BAKE_WORKGROUP_SIZE + lane;
|
|
94
94
|
let point = mesh_sdf_brick_corner(header, brick) + vec3<f32>(vec3<u32>(texel % t, (texel / t) % t, texel / (t * t))) * voxel;
|
|
95
95
|
|
|
96
|
-
var stack: array<
|
|
96
|
+
var stack: array<vec2u, ${BVH8_TRAVERSAL_STACK_SIZE}>;
|
|
97
97
|
var contact: ${SURFACE_POINT_3D.wgsl_ref};
|
|
98
98
|
|
|
99
99
|
let band = MESH_SDF_BAND_VOXELS * voxel;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk_blas_query_band_sdf.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/geometry/sdf/chunk_blas_query_band_sdf.js"],"names":[],"mappings":"AAgBA;;;;GAIG;AACH,oCAFU,MAAM,CAEuB;AAEvC;;;GAGG;AACH,kCAFU,MAAM,CAEqE;AAErF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wCAFU,SAAS,CAgHjB;
|
|
1
|
+
{"version":3,"file":"chunk_blas_query_band_sdf.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/geometry/sdf/chunk_blas_query_band_sdf.js"],"names":[],"mappings":"AAgBA;;;;GAIG;AACH,oCAFU,MAAM,CAEuB;AAEvC;;;GAGG;AACH,kCAFU,MAAM,CAEqE;AAErF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wCAFU,SAAS,CAgHjB;0BAlJwB,oCAAoC"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { UINT32_MAX } from "../../../../core/binary/UINT32_MAX.js";
|
|
2
|
-
import { BVH_TRAVERSAL_STACK_SIZE } from "../../shader/chunk/bvh/BVH_TRAVERSAL_STACK_SIZE.js";
|
|
3
2
|
import {
|
|
4
3
|
chunk_geometry_read_triangle_vertices
|
|
5
4
|
} from "../../shader/chunk/geometry/format/chunk_geometry_read_triangle_vertices.js";
|
|
@@ -13,6 +12,7 @@ import { PI_DECLARATION } from "../../shader/chunk/math/PI_DECLARATION.js";
|
|
|
13
12
|
import { chunk_point_query_blas_nearest } from "../../shader/chunk/sdf/chunk_point_query_blas_nearest.js";
|
|
14
13
|
import { SURFACE_POINT_3D } from "../../shader/chunk/sdf/SURFACE_POINT_3D.js";
|
|
15
14
|
import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
|
|
15
|
+
import { BVH8_TRAVERSAL_STACK_SIZE } from "../../shader/chunk/bvh/bvh8/webgpu/BVH8_MAX_DEPTH.js";
|
|
16
16
|
|
|
17
17
|
/**
|
|
18
18
|
* Strata along a side of each of the vote's two hemispheres, as UE 5.4 has them: 7 × 7 directions a
|
|
@@ -101,7 +101,7 @@ fn blas_query_band_sdf(
|
|
|
101
101
|
band: f32,
|
|
102
102
|
two_sided: bool,
|
|
103
103
|
contact: ptr<function, ${SURFACE_POINT_3D.wgsl_ref}>,
|
|
104
|
-
traversal_stack: ptr<function, array<
|
|
104
|
+
traversal_stack: ptr<function, array<vec2u, ${BVH8_TRAVERSAL_STACK_SIZE}>>,
|
|
105
105
|
stack_top: u32
|
|
106
106
|
) -> f32 {
|
|
107
107
|
*contact = point_query_blas_nearest(point, band, geometry_index, traversal_stack, stack_top);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shader_sdf_visualize.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/geometry/sdf/shader_sdf_visualize.js"],"names":[],"mappings":"AAqKA;;;;;;;;;;;GAWG;AACH;IAT+B,KAAK;IACD,IAAI;IACZ,WAAW,EAA3B,MAAM;IACU,SAAS,EAAzB,MAAM;IACU,gBAAgB,EAAhC,MAAM;IACU,sBAAsB,EAAtC,MAAM;IAEJ,MAAM,CAsGlB;AA3HD,+CASG;
|
|
1
|
+
{"version":3,"file":"shader_sdf_visualize.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/geometry/sdf/shader_sdf_visualize.js"],"names":[],"mappings":"AAqKA;;;;;;;;;;;GAWG;AACH;IAT+B,KAAK;IACD,IAAI;IACZ,WAAW,EAA3B,MAAM;IACU,SAAS,EAAzB,MAAM;IACU,gBAAgB,EAAhC,MAAM;IACU,sBAAsB,EAAtC,MAAM;IAEJ,MAAM,CAsGlB;AA3HD,+CASG;4BAxIyB,6BAA6B"}
|
|
@@ -11,8 +11,7 @@ import {
|
|
|
11
11
|
} from "./MESH_SDF_RESOURCES.js";
|
|
12
12
|
import { CAMERA_UNIFORM_STRUCT } from "../../camera/CAMERA_UNIFORM_STRUCT.js";
|
|
13
13
|
import { DEPTH_BACKGROUND_VALUE } from "../../depth/DEPTH_BACKGROUND_VALUE.js";
|
|
14
|
-
import {
|
|
15
|
-
import { BVH_STRUCT } from "../../shader/chunk/bvh/BVH_STRUCT.js";
|
|
14
|
+
import { BVH8_TREE_TYPE } from "../../shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_tree_read.js";
|
|
16
15
|
import { chunk_project_position_from_depth } from "../../shader/chunk/camera/chunk_project_position_from_depth.js";
|
|
17
16
|
import { chunk_hash_u32_to_v4f32 } from "../../shader/chunk/color/chunk_hash_u32_to_v4f32.js";
|
|
18
17
|
import {
|
|
@@ -34,6 +33,7 @@ import { chunk_ray_query_sdf_raycast } from "../../shadow/sdf/chunk_ray_query_sd
|
|
|
34
33
|
import { SDF_DRAW_SETTINGS_STRUCT } from "../../shadow/sdf/SDF_DRAW_SETTINGS_STRUCT.js";
|
|
35
34
|
import { GEOMETRY_METADATA_STRUCT } from "../GEOMETRY_METADATA_STRUCT.js";
|
|
36
35
|
import { dynamic_chunk_sdf_construct_normal } from "./dynamic_chunk_sdf_construct_normal.js";
|
|
36
|
+
import { BVH8_INODE_STRUCT } from "../../shader/chunk/bvh/bvh8/webgpu/BVH8_INODE_STRUCT.js";
|
|
37
37
|
|
|
38
38
|
const resources = new ShaderResourceSetDescriptor();
|
|
39
39
|
|
|
@@ -53,12 +53,12 @@ resources.createGroup()
|
|
|
53
53
|
resources.createGroup()
|
|
54
54
|
.addStorageBuffer("geometries", WebGPUArray.from(GEOMETRY_METADATA_STRUCT))
|
|
55
55
|
.addStorageBuffer("scene_database", WebGPUArray.from(u32))
|
|
56
|
-
.addStorageBuffer("tlas",
|
|
56
|
+
.addStorageBuffer("tlas", BVH8_TREE_TYPE);
|
|
57
57
|
|
|
58
58
|
// debug
|
|
59
59
|
resources.createGroup()
|
|
60
60
|
.addStorageBuffer("blas_lookup", WebGPUArray.u32)
|
|
61
|
-
.addStorageBuffer("blas_data", WebGPUArray.from(
|
|
61
|
+
.addStorageBuffer("blas_data", WebGPUArray.from(BVH8_INODE_STRUCT))
|
|
62
62
|
|
|
63
63
|
resources.createGroup()
|
|
64
64
|
.addUniform("camera", CAMERA_UNIFORM_STRUCT);
|