@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,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The engine's turbulence tile and its levels ({@link fluid_turbulence_tile_generate_levels} at
|
|
3
|
+
* {@link FLUID_TURBULENCE_TILE_RESOLUTION}, {@link FLUID_TURBULENCE_TEXELS_PER_LENGTH} and
|
|
4
|
+
* {@link FLUID_TURBULENCE_TILE_SEED}, a full mip chain), every value rounded to `float16`, as the device
|
|
5
|
+
* holds it. Three values a texel, x fastest. Generated on the first call and kept: about 0.3 s and
|
|
6
|
+
* 7 MiB, once a process, and only for a scene that asks for turbulence. Never write to them.
|
|
7
|
+
*
|
|
8
|
+
* @returns {Float32Array[]}
|
|
9
|
+
*/
|
|
10
|
+
export function fluid_turbulence_tile_levels(): Float32Array[];
|
|
11
|
+
/**
|
|
12
|
+
* The engine's turbulence tile at full resolution: level 0 of {@link fluid_turbulence_tile_levels},
|
|
13
|
+
* what a read of the far field at a point takes. Three values a texel, x fastest.
|
|
14
|
+
*
|
|
15
|
+
* @returns {Float32Array}
|
|
16
|
+
*/
|
|
17
|
+
export function fluid_turbulence_tile_data(): Float32Array;
|
|
18
|
+
/**
|
|
19
|
+
* The tile's levels as an `rgba16float` texture's mips: four halves a texel, alpha 0, x fastest, level
|
|
20
|
+
* 0 first. Allocates the result, about 4.6 MiB, for one upload.
|
|
21
|
+
*
|
|
22
|
+
* @returns {Uint16Array[]}
|
|
23
|
+
*/
|
|
24
|
+
export function fluid_turbulence_tile_data_rgba16(): Uint16Array[];
|
|
25
|
+
//# sourceMappingURL=fluid_turbulence_tile_data.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fluid_turbulence_tile_data.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/fluid/turbulence/fluid_turbulence_tile_data.js"],"names":[],"mappings":"AAUA;;;;;;;;GAQG;AACH,gDAFa,YAAY,EAAE,CAgB1B;AAED;;;;;GAKG;AACH,8CAFa,YAAY,CAIxB;AAED;;;;;GAKG;AACH,qDAFa,WAAW,EAAE,CAezB"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { half_to_float_uint16 } from "../../../../core/binary/half_to_float_uint16.js";
|
|
2
|
+
import { to_half_float_uint16 } from "../../../../core/binary/to_half_float_uint16.js";
|
|
3
|
+
import { FLUID_TURBULENCE_TEXELS_PER_LENGTH, FLUID_TURBULENCE_TILE_RESOLUTION, FLUID_TURBULENCE_TILE_SEED } from "./FLUID_TURBULENCE_TILE.js";
|
|
4
|
+
import { fluid_turbulence_tile_generate_levels } from "./fluid_turbulence_tile_generate.js";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* @type {Float32Array[]|null}
|
|
8
|
+
*/
|
|
9
|
+
let levels = null;
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* The engine's turbulence tile and its levels ({@link fluid_turbulence_tile_generate_levels} at
|
|
13
|
+
* {@link FLUID_TURBULENCE_TILE_RESOLUTION}, {@link FLUID_TURBULENCE_TEXELS_PER_LENGTH} and
|
|
14
|
+
* {@link FLUID_TURBULENCE_TILE_SEED}, a full mip chain), every value rounded to `float16`, as the device
|
|
15
|
+
* holds it. Three values a texel, x fastest. Generated on the first call and kept: about 0.3 s and
|
|
16
|
+
* 7 MiB, once a process, and only for a scene that asks for turbulence. Never write to them.
|
|
17
|
+
*
|
|
18
|
+
* @returns {Float32Array[]}
|
|
19
|
+
*/
|
|
20
|
+
export function fluid_turbulence_tile_levels() {
|
|
21
|
+
if (levels === null) {
|
|
22
|
+
const generated = fluid_turbulence_tile_generate_levels(FLUID_TURBULENCE_TILE_RESOLUTION, FLUID_TURBULENCE_TEXELS_PER_LENGTH, FLUID_TURBULENCE_TILE_SEED);
|
|
23
|
+
|
|
24
|
+
for (const values of generated) {
|
|
25
|
+
for (let i = 0; i < values.length; i++) {
|
|
26
|
+
values[i] = half_to_float_uint16(to_half_float_uint16(values[i]));
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
levels = generated;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return levels;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* The engine's turbulence tile at full resolution: level 0 of {@link fluid_turbulence_tile_levels},
|
|
38
|
+
* what a read of the far field at a point takes. Three values a texel, x fastest.
|
|
39
|
+
*
|
|
40
|
+
* @returns {Float32Array}
|
|
41
|
+
*/
|
|
42
|
+
export function fluid_turbulence_tile_data() {
|
|
43
|
+
return fluid_turbulence_tile_levels()[0];
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* The tile's levels as an `rgba16float` texture's mips: four halves a texel, alpha 0, x fastest, level
|
|
48
|
+
* 0 first. Allocates the result, about 4.6 MiB, for one upload.
|
|
49
|
+
*
|
|
50
|
+
* @returns {Uint16Array[]}
|
|
51
|
+
*/
|
|
52
|
+
export function fluid_turbulence_tile_data_rgba16() {
|
|
53
|
+
return fluid_turbulence_tile_levels().map(values => {
|
|
54
|
+
const count = values.length / 3;
|
|
55
|
+
const out = new Uint16Array(4 * count);
|
|
56
|
+
|
|
57
|
+
for (let i = 0; i < count; i++) {
|
|
58
|
+
out[4 * i] = to_half_float_uint16(values[3 * i]);
|
|
59
|
+
out[4 * i + 1] = to_half_float_uint16(values[3 * i + 1]);
|
|
60
|
+
out[4 * i + 2] = to_half_float_uint16(values[3 * i + 2]);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return out;
|
|
64
|
+
});
|
|
65
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A repeating tile of isotropic, divergence-free turbulence with the von Kármán spectrum, unit rms:
|
|
3
|
+
* the mean over the tile of each component's square, averaged over the three components, is 1.
|
|
4
|
+
* Level 0 of {@link fluid_turbulence_tile_generate_levels}.
|
|
5
|
+
*
|
|
6
|
+
* @param {ArrayLike<number>} resolution texels on x, y and z, each a power of two, 2 or more
|
|
7
|
+
* @param {number} texels_per_length texels per length scale `L`, > 0
|
|
8
|
+
* @param {number} seed
|
|
9
|
+
* @returns {Float32Array} three values a texel, `(u, v, w)`, x fastest, then y, then z
|
|
10
|
+
*/
|
|
11
|
+
export function fluid_turbulence_tile_generate(resolution: ArrayLike<number>, texels_per_length: number, seed: number): Float32Array;
|
|
12
|
+
/**
|
|
13
|
+
* Texels of level `level` of a tile on each axis: the tile's halved `level` times, and at least 1.
|
|
14
|
+
*
|
|
15
|
+
* @param {number[]} out
|
|
16
|
+
* @param {ArrayLike<number>} resolution level 0's
|
|
17
|
+
* @param {number} level
|
|
18
|
+
* @returns {number[]} `out`
|
|
19
|
+
*/
|
|
20
|
+
export function fluid_turbulence_tile_level_size(out: number[], resolution: ArrayLike<number>, level: number): number[];
|
|
21
|
+
/**
|
|
22
|
+
* A repeating tile of isotropic, divergence-free turbulence with the von Kármán spectrum, and its
|
|
23
|
+
* levels: level `ℓ` is the same field band-limited to what texels `2^ℓ` times as large can hold.
|
|
24
|
+
*
|
|
25
|
+
* The tile is laid out in units of the length scale `L`: `texels_per_length` texels a length. In
|
|
26
|
+
* those units the von Kármán energy spectrum is
|
|
27
|
+
*
|
|
28
|
+
* E(k) ∝ (kL)⁴ / (1 + (kL)²)^(17/6)
|
|
29
|
+
*
|
|
30
|
+
* which rises as k⁴ from the largest scales, peaks at a wavelength of about `4.05·L`, and falls as
|
|
31
|
+
* the inertial range's k^(−5/3) below it.
|
|
32
|
+
*
|
|
33
|
+
* Spectral synthesis, Shinozuka's: each wavenumber of the tile's lattice draws a complex Gaussian
|
|
34
|
+
* vector, projects it onto the plane normal to the wavenumber, which makes the field divergence-free,
|
|
35
|
+
* and scales it by `sqrt(E(k) / (4π k²))`, an isotropic field's amplitude at a lattice point; an
|
|
36
|
+
* inverse FFT then gives the field, of which the real part is kept. The mean (`k = 0`) and the
|
|
37
|
+
* Nyquist planes are left at zero.
|
|
38
|
+
*
|
|
39
|
+
* A level keeps the wavenumbers below its own Nyquist and no others, and is the inverse FFT of those at
|
|
40
|
+
* its own texel centres: an ideal low-pass of level 0, evaluated where a sampler reads that level, so
|
|
41
|
+
* a read of level `ℓ` is level 0 with every wavelength shorter than two of its texels taken out, and
|
|
42
|
+
* nothing aliased in. Every level is scaled as level 0 is to unit rms, so a level holds the energy of
|
|
43
|
+
* its band and no more.
|
|
44
|
+
*
|
|
45
|
+
* Deterministic in `seed`, and the same level 0 whatever the level count. Allocates the levels and
|
|
46
|
+
* about 13 MB of transforms, once: this is an asset's generation, not a per-frame path.
|
|
47
|
+
*
|
|
48
|
+
* @param {ArrayLike<number>} resolution texels on x, y and z, each a power of two, 2 or more
|
|
49
|
+
* @param {number} texels_per_length texels per length scale `L`, > 0
|
|
50
|
+
* @param {number} seed
|
|
51
|
+
* @param {number} [level_count] levels to make, 1 or more; by default down to one texel on the
|
|
52
|
+
* longest axis, a full mip chain
|
|
53
|
+
* @returns {Float32Array[]} per level, three values a texel, `(u, v, w)`, x fastest, then y, then z
|
|
54
|
+
*/
|
|
55
|
+
export function fluid_turbulence_tile_generate_levels(resolution: ArrayLike<number>, texels_per_length: number, seed: number, level_count?: number): Float32Array[];
|
|
56
|
+
//# sourceMappingURL=fluid_turbulence_tile_generate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fluid_turbulence_tile_generate.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/fluid/turbulence/fluid_turbulence_tile_generate.js"],"names":[],"mappings":"AAKA;;;;;;;;;GASG;AACH,2DALW,UAAU,MAAM,CAAC,qBACjB,MAAM,QACN,MAAM,GACJ,YAAY,CAIxB;AAED;;;;;;;GAOG;AACH,sDALW,MAAM,EAAE,cACR,UAAU,MAAM,CAAC,SACjB,MAAM,GACJ,MAAM,EAAE,CAQpB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,kEAPW,UAAU,MAAM,CAAC,qBACjB,MAAM,QACN,MAAM,gBACN,MAAM,GAEJ,YAAY,EAAE,CA2L1B"}
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
import { assert } from "../../../../core/assert.js";
|
|
2
|
+
import { isPowerOfTwo } from "../../../../core/math/isPowerOfTwo.js";
|
|
3
|
+
import { complex_fft_radix2 } from "../../../../core/math/complex/complex_fft_radix2.js";
|
|
4
|
+
import { seededRandom_Mulberry32 } from "../../../../core/math/random/seededRandom_Mulberry32.js";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* A repeating tile of isotropic, divergence-free turbulence with the von Kármán spectrum, unit rms:
|
|
8
|
+
* the mean over the tile of each component's square, averaged over the three components, is 1.
|
|
9
|
+
* Level 0 of {@link fluid_turbulence_tile_generate_levels}.
|
|
10
|
+
*
|
|
11
|
+
* @param {ArrayLike<number>} resolution texels on x, y and z, each a power of two, 2 or more
|
|
12
|
+
* @param {number} texels_per_length texels per length scale `L`, > 0
|
|
13
|
+
* @param {number} seed
|
|
14
|
+
* @returns {Float32Array} three values a texel, `(u, v, w)`, x fastest, then y, then z
|
|
15
|
+
*/
|
|
16
|
+
export function fluid_turbulence_tile_generate(resolution, texels_per_length, seed) {
|
|
17
|
+
return fluid_turbulence_tile_generate_levels(resolution, texels_per_length, seed, 1)[0];
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Texels of level `level` of a tile on each axis: the tile's halved `level` times, and at least 1.
|
|
22
|
+
*
|
|
23
|
+
* @param {number[]} out
|
|
24
|
+
* @param {ArrayLike<number>} resolution level 0's
|
|
25
|
+
* @param {number} level
|
|
26
|
+
* @returns {number[]} `out`
|
|
27
|
+
*/
|
|
28
|
+
export function fluid_turbulence_tile_level_size(out, resolution, level) {
|
|
29
|
+
for (let axis = 0; axis < 3; axis++) {
|
|
30
|
+
out[axis] = Math.max(1, resolution[axis] >> level);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return out;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* A repeating tile of isotropic, divergence-free turbulence with the von Kármán spectrum, and its
|
|
38
|
+
* levels: level `ℓ` is the same field band-limited to what texels `2^ℓ` times as large can hold.
|
|
39
|
+
*
|
|
40
|
+
* The tile is laid out in units of the length scale `L`: `texels_per_length` texels a length. In
|
|
41
|
+
* those units the von Kármán energy spectrum is
|
|
42
|
+
*
|
|
43
|
+
* E(k) ∝ (kL)⁴ / (1 + (kL)²)^(17/6)
|
|
44
|
+
*
|
|
45
|
+
* which rises as k⁴ from the largest scales, peaks at a wavelength of about `4.05·L`, and falls as
|
|
46
|
+
* the inertial range's k^(−5/3) below it.
|
|
47
|
+
*
|
|
48
|
+
* Spectral synthesis, Shinozuka's: each wavenumber of the tile's lattice draws a complex Gaussian
|
|
49
|
+
* vector, projects it onto the plane normal to the wavenumber, which makes the field divergence-free,
|
|
50
|
+
* and scales it by `sqrt(E(k) / (4π k²))`, an isotropic field's amplitude at a lattice point; an
|
|
51
|
+
* inverse FFT then gives the field, of which the real part is kept. The mean (`k = 0`) and the
|
|
52
|
+
* Nyquist planes are left at zero.
|
|
53
|
+
*
|
|
54
|
+
* A level keeps the wavenumbers below its own Nyquist and no others, and is the inverse FFT of those at
|
|
55
|
+
* its own texel centres: an ideal low-pass of level 0, evaluated where a sampler reads that level, so
|
|
56
|
+
* a read of level `ℓ` is level 0 with every wavelength shorter than two of its texels taken out, and
|
|
57
|
+
* nothing aliased in. Every level is scaled as level 0 is to unit rms, so a level holds the energy of
|
|
58
|
+
* its band and no more.
|
|
59
|
+
*
|
|
60
|
+
* Deterministic in `seed`, and the same level 0 whatever the level count. Allocates the levels and
|
|
61
|
+
* about 13 MB of transforms, once: this is an asset's generation, not a per-frame path.
|
|
62
|
+
*
|
|
63
|
+
* @param {ArrayLike<number>} resolution texels on x, y and z, each a power of two, 2 or more
|
|
64
|
+
* @param {number} texels_per_length texels per length scale `L`, > 0
|
|
65
|
+
* @param {number} seed
|
|
66
|
+
* @param {number} [level_count] levels to make, 1 or more; by default down to one texel on the
|
|
67
|
+
* longest axis, a full mip chain
|
|
68
|
+
* @returns {Float32Array[]} per level, three values a texel, `(u, v, w)`, x fastest, then y, then z
|
|
69
|
+
*/
|
|
70
|
+
export function fluid_turbulence_tile_generate_levels(resolution, texels_per_length, seed, level_count = 1 + Math.log2(Math.max(resolution[0], resolution[1], resolution[2]))) {
|
|
71
|
+
const nx = resolution[0];
|
|
72
|
+
const ny = resolution[1];
|
|
73
|
+
const nz = resolution[2];
|
|
74
|
+
|
|
75
|
+
for (let axis = 0; axis < 3; axis++) {
|
|
76
|
+
assert.isPositiveInteger(resolution[axis], 'resolution');
|
|
77
|
+
assert.ok(isPowerOfTwo(resolution[axis]), 'resolution is a power of two on each axis');
|
|
78
|
+
assert.greaterThanOrEqual(resolution[axis], 2, 'resolution');
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
assert.isFinite(texels_per_length, 'texels_per_length');
|
|
82
|
+
assert.greaterThan(texels_per_length, 0, 'texels_per_length');
|
|
83
|
+
assert.isPositiveInteger(level_count, 'level_count');
|
|
84
|
+
|
|
85
|
+
const count = nx * ny * nz;
|
|
86
|
+
|
|
87
|
+
const re = [new Float32Array(count), new Float32Array(count), new Float32Array(count)];
|
|
88
|
+
const im = [new Float32Array(count), new Float32Array(count), new Float32Array(count)];
|
|
89
|
+
|
|
90
|
+
const random = seededRandom_Mulberry32(seed);
|
|
91
|
+
|
|
92
|
+
// one standard normal draw, Box–Muller; the second of each pair is discarded, so the stream is
|
|
93
|
+
// one uniform pair a value
|
|
94
|
+
const normal = () => {
|
|
95
|
+
const u1 = 1 - random(); // (0, 1]
|
|
96
|
+
const u2 = random();
|
|
97
|
+
|
|
98
|
+
return Math.sqrt(-2 * Math.log(u1)) * Math.cos(2 * Math.PI * u2);
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
// kL of lattice index i on an axis of n texels: 2π·m / (n / texels_per_length), m signed
|
|
102
|
+
const kl_x = 2 * Math.PI * texels_per_length / nx;
|
|
103
|
+
const kl_y = 2 * Math.PI * texels_per_length / ny;
|
|
104
|
+
const kl_z = 2 * Math.PI * texels_per_length / nz;
|
|
105
|
+
|
|
106
|
+
const xi_re = new Float64Array(3);
|
|
107
|
+
const xi_im = new Float64Array(3);
|
|
108
|
+
|
|
109
|
+
for (let iz = 0; iz < nz; iz++) {
|
|
110
|
+
const mz = signed(iz, nz);
|
|
111
|
+
|
|
112
|
+
for (let iy = 0; iy < ny; iy++) {
|
|
113
|
+
const my = signed(iy, ny);
|
|
114
|
+
|
|
115
|
+
for (let ix = 0; ix < nx; ix++) {
|
|
116
|
+
const mx = signed(ix, nx);
|
|
117
|
+
|
|
118
|
+
// every lattice point draws, the skipped ones too, so the stream does not depend on
|
|
119
|
+
// which are kept
|
|
120
|
+
for (let c = 0; c < 3; c++) {
|
|
121
|
+
xi_re[c] = normal();
|
|
122
|
+
xi_im[c] = normal();
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
if (mx === -nx / 2 || my === -ny / 2 || mz === -nz / 2) {
|
|
126
|
+
continue; // the Nyquist planes
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
const kx = mx * kl_x;
|
|
130
|
+
const ky = my * kl_y;
|
|
131
|
+
const kz = mz * kl_z;
|
|
132
|
+
const k2 = kx * kx + ky * ky + kz * kz;
|
|
133
|
+
|
|
134
|
+
if (k2 === 0) {
|
|
135
|
+
continue; // the mean
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
const energy = k2 * k2 / Math.pow(1 + k2, 17 / 6);
|
|
139
|
+
const amplitude = Math.sqrt(energy / (4 * Math.PI * k2));
|
|
140
|
+
|
|
141
|
+
const inv_k2 = 1 / k2;
|
|
142
|
+
const dot_re = (kx * xi_re[0] + ky * xi_re[1] + kz * xi_re[2]) * inv_k2;
|
|
143
|
+
const dot_im = (kx * xi_im[0] + ky * xi_im[1] + kz * xi_im[2]) * inv_k2;
|
|
144
|
+
|
|
145
|
+
const index = ix + nx * (iy + ny * iz);
|
|
146
|
+
|
|
147
|
+
re[0][index] = amplitude * (xi_re[0] - kx * dot_re);
|
|
148
|
+
re[1][index] = amplitude * (xi_re[1] - ky * dot_re);
|
|
149
|
+
re[2][index] = amplitude * (xi_re[2] - kz * dot_re);
|
|
150
|
+
im[0][index] = amplitude * (xi_im[0] - kx * dot_im);
|
|
151
|
+
im[1][index] = amplitude * (xi_im[1] - ky * dot_im);
|
|
152
|
+
im[2][index] = amplitude * (xi_im[2] - kz * dot_im);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
const longest = Math.max(nx, ny, nz);
|
|
158
|
+
const line_re = new Float64Array(longest);
|
|
159
|
+
const line_im = new Float64Array(longest);
|
|
160
|
+
|
|
161
|
+
// the coarser levels first, from the spectrum before level 0's transform takes it over
|
|
162
|
+
const fields = new Array(level_count);
|
|
163
|
+
const size = [0, 0, 0];
|
|
164
|
+
|
|
165
|
+
for (let level = 1; level < level_count; level++) {
|
|
166
|
+
fluid_turbulence_tile_level_size(size, resolution, level);
|
|
167
|
+
|
|
168
|
+
const [lx, ly, lz] = size;
|
|
169
|
+
const level_count_texels = lx * ly * lz;
|
|
170
|
+
|
|
171
|
+
// texel j of the level is centred at (j + ½)·span in level-0 texels, which level 0's own
|
|
172
|
+
// transform, sampled at its texel i ↦ i + ½, reaches with a phase of m·(span − 1)/2 a component
|
|
173
|
+
const phase_x = Math.PI * (nx / lx - 1) / nx;
|
|
174
|
+
const phase_y = Math.PI * (ny / ly - 1) / ny;
|
|
175
|
+
const phase_z = Math.PI * (nz / lz - 1) / nz;
|
|
176
|
+
|
|
177
|
+
const level_re = [new Float32Array(level_count_texels), new Float32Array(level_count_texels), new Float32Array(level_count_texels)];
|
|
178
|
+
const level_im = [new Float32Array(level_count_texels), new Float32Array(level_count_texels), new Float32Array(level_count_texels)];
|
|
179
|
+
|
|
180
|
+
for (let jz = 0; jz < lz; jz++) {
|
|
181
|
+
const mz = signed(jz, lz);
|
|
182
|
+
|
|
183
|
+
if (lz > 1 && mz === -lz / 2) continue;
|
|
184
|
+
|
|
185
|
+
for (let jy = 0; jy < ly; jy++) {
|
|
186
|
+
const my = signed(jy, ly);
|
|
187
|
+
|
|
188
|
+
if (ly > 1 && my === -ly / 2) continue;
|
|
189
|
+
|
|
190
|
+
for (let jx = 0; jx < lx; jx++) {
|
|
191
|
+
const mx = signed(jx, lx);
|
|
192
|
+
|
|
193
|
+
if (lx > 1 && mx === -lx / 2) continue;
|
|
194
|
+
|
|
195
|
+
const source = wrap(mx, nx) + nx * (wrap(my, ny) + ny * wrap(mz, nz));
|
|
196
|
+
const target = jx + lx * (jy + ly * jz);
|
|
197
|
+
|
|
198
|
+
const angle = mx * phase_x + my * phase_y + mz * phase_z;
|
|
199
|
+
const cos = Math.cos(angle);
|
|
200
|
+
const sin = Math.sin(angle);
|
|
201
|
+
|
|
202
|
+
for (let c = 0; c < 3; c++) {
|
|
203
|
+
const a = re[c][source];
|
|
204
|
+
const b = im[c][source];
|
|
205
|
+
|
|
206
|
+
level_re[c][target] = a * cos - b * sin;
|
|
207
|
+
level_im[c][target] = a * sin + b * cos;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
for (let c = 0; c < 3; c++) {
|
|
214
|
+
inverse_3d(level_re[c], level_im[c], lx, ly, lz, line_re, line_im);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
fields[level] = level_re;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
for (let c = 0; c < 3; c++) {
|
|
221
|
+
inverse_3d(re[c], im[c], nx, ny, nz, line_re, line_im);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
fields[0] = re;
|
|
225
|
+
|
|
226
|
+
let square_sum = 0;
|
|
227
|
+
|
|
228
|
+
for (let c = 0; c < 3; c++) {
|
|
229
|
+
const values = re[c];
|
|
230
|
+
|
|
231
|
+
for (let i = 0; i < count; i++) {
|
|
232
|
+
square_sum += values[i] * values[i];
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
const scale = 1 / Math.sqrt(square_sum / (3 * count));
|
|
237
|
+
|
|
238
|
+
const out = new Array(level_count);
|
|
239
|
+
|
|
240
|
+
for (let level = 0; level < level_count; level++) {
|
|
241
|
+
const field = fields[level];
|
|
242
|
+
const texels = field[0].length;
|
|
243
|
+
const values = new Float32Array(3 * texels);
|
|
244
|
+
|
|
245
|
+
for (let i = 0; i < texels; i++) {
|
|
246
|
+
values[3 * i] = field[0][i] * scale;
|
|
247
|
+
values[3 * i + 1] = field[1][i] * scale;
|
|
248
|
+
values[3 * i + 2] = field[2][i] * scale;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
out[level] = values;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
return out;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* The signed wavenumber of lattice index `i` on an axis of `n`: `i` below `n/2`, `i − n` from it.
|
|
259
|
+
*/
|
|
260
|
+
function signed(i, n) {
|
|
261
|
+
return i < n / 2 ? i : i - n;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* The lattice index of signed wavenumber `m` on an axis of `n`.
|
|
266
|
+
*/
|
|
267
|
+
function wrap(m, n) {
|
|
268
|
+
return m < 0 ? m + n : m;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* The inverse transform of a 3-D array along every axis of more than one texel.
|
|
273
|
+
*/
|
|
274
|
+
function inverse_3d(re, im, nx, ny, nz, line_re, line_im) {
|
|
275
|
+
if (nx > 1) inverse_along(re, im, nx, 1, ny, nx, nz, nx * ny, line_re, line_im);
|
|
276
|
+
if (ny > 1) inverse_along(re, im, ny, nx, nx, 1, nz, nx * ny, line_re, line_im);
|
|
277
|
+
if (nz > 1) inverse_along(re, im, nz, nx * ny, nx, 1, ny, nx, line_re, line_im);
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* The inverse transform along one axis of a 3-D array, every line of it: line `(a, b)` starts at
|
|
282
|
+
* `a·stride_a + b·stride_b` and steps `stride`.
|
|
283
|
+
*
|
|
284
|
+
* @param {Float32Array} re
|
|
285
|
+
* @param {Float32Array} im
|
|
286
|
+
* @param {number} n texels along the axis
|
|
287
|
+
* @param {number} stride index step along the axis
|
|
288
|
+
* @param {number} count_a lines along the first other axis
|
|
289
|
+
* @param {number} stride_a its index step
|
|
290
|
+
* @param {number} count_b lines along the second other axis
|
|
291
|
+
* @param {number} stride_b its index step
|
|
292
|
+
* @param {Float64Array} line_re scratch, `n` or longer
|
|
293
|
+
* @param {Float64Array} line_im scratch, likewise
|
|
294
|
+
*/
|
|
295
|
+
function inverse_along(re, im, n, stride, count_a, stride_a, count_b, stride_b, line_re, line_im) {
|
|
296
|
+
for (let b = 0; b < count_b; b++) {
|
|
297
|
+
for (let a = 0; a < count_a; a++) {
|
|
298
|
+
const base = a * stride_a + b * stride_b;
|
|
299
|
+
|
|
300
|
+
for (let i = 0; i < n; i++) {
|
|
301
|
+
line_re[i] = re[base + i * stride];
|
|
302
|
+
line_im[i] = im[base + i * stride];
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
complex_fft_radix2(line_re, line_im, n, true);
|
|
306
|
+
|
|
307
|
+
for (let i = 0; i < n; i++) {
|
|
308
|
+
re[base + i * stride] = line_re[i];
|
|
309
|
+
im[base + i * stride] = line_im[i];
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A trilinear read of a turbulence tile at tile coordinate `q`, repeating, as a device's
|
|
3
|
+
* linear sampler with `repeat` addressing reads the same texels: one tile is 1 on each axis, and
|
|
4
|
+
* texel `i` is centred at `(i + ½) / n`.
|
|
5
|
+
*
|
|
6
|
+
* The device's filter rounds its weights (to 1/256 of a texel on the GPUs measured), so the two
|
|
7
|
+
* agree to that, not to the bit. Allocates nothing.
|
|
8
|
+
*
|
|
9
|
+
* @param {Float64Array|Float32Array|number[]} out receives `(u, v, w)` at 0..2
|
|
10
|
+
* @param {Float32Array} values three a texel, x fastest, {@link FLUID_TURBULENCE_TILE_RESOLUTION}
|
|
11
|
+
* @param {Float64Array|number[]} q the tile coordinate, x, y, z: handed in an array so that a caller
|
|
12
|
+
* that does not inline this passes no number across the call, which would box it
|
|
13
|
+
* @returns {Float64Array|Float32Array|number[]} `out`
|
|
14
|
+
*/
|
|
15
|
+
export function fluid_turbulence_tile_sample(out: Float64Array | Float32Array | number[], values: Float32Array, q: Float64Array | number[]): Float64Array | Float32Array | number[];
|
|
16
|
+
//# sourceMappingURL=fluid_turbulence_tile_sample.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fluid_turbulence_tile_sample.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/fluid/turbulence/fluid_turbulence_tile_sample.js"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;GAaG;AACH,kDANW,YAAY,GAAC,YAAY,GAAC,MAAM,EAAE,UAClC,YAAY,KACZ,YAAY,GAAC,MAAM,EAAE,GAEnB,YAAY,GAAC,YAAY,GAAC,MAAM,EAAE,CAkD9C"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { FLUID_TURBULENCE_TILE_RESOLUTION } from "./FLUID_TURBULENCE_TILE.js";
|
|
2
|
+
|
|
3
|
+
const NX = FLUID_TURBULENCE_TILE_RESOLUTION[0];
|
|
4
|
+
const NY = FLUID_TURBULENCE_TILE_RESOLUTION[1];
|
|
5
|
+
const NZ = FLUID_TURBULENCE_TILE_RESOLUTION[2];
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* A trilinear read of a turbulence tile at tile coordinate `q`, repeating, as a device's
|
|
9
|
+
* linear sampler with `repeat` addressing reads the same texels: one tile is 1 on each axis, and
|
|
10
|
+
* texel `i` is centred at `(i + ½) / n`.
|
|
11
|
+
*
|
|
12
|
+
* The device's filter rounds its weights (to 1/256 of a texel on the GPUs measured), so the two
|
|
13
|
+
* agree to that, not to the bit. Allocates nothing.
|
|
14
|
+
*
|
|
15
|
+
* @param {Float64Array|Float32Array|number[]} out receives `(u, v, w)` at 0..2
|
|
16
|
+
* @param {Float32Array} values three a texel, x fastest, {@link FLUID_TURBULENCE_TILE_RESOLUTION}
|
|
17
|
+
* @param {Float64Array|number[]} q the tile coordinate, x, y, z: handed in an array so that a caller
|
|
18
|
+
* that does not inline this passes no number across the call, which would box it
|
|
19
|
+
* @returns {Float64Array|Float32Array|number[]} `out`
|
|
20
|
+
*/
|
|
21
|
+
export function fluid_turbulence_tile_sample(out, values, q) {
|
|
22
|
+
const px = q[0] * NX - 0.5;
|
|
23
|
+
const py = q[1] * NY - 0.5;
|
|
24
|
+
const pz = q[2] * NZ - 0.5;
|
|
25
|
+
|
|
26
|
+
const fx = Math.floor(px);
|
|
27
|
+
const fy = Math.floor(py);
|
|
28
|
+
const fz = Math.floor(pz);
|
|
29
|
+
|
|
30
|
+
const tx = px - fx;
|
|
31
|
+
const ty = py - fy;
|
|
32
|
+
const tz = pz - fz;
|
|
33
|
+
|
|
34
|
+
// euclidean modulo: a coordinate below 0 wraps from the far side
|
|
35
|
+
const x0 = ((fx % NX) + NX) % NX;
|
|
36
|
+
const y0 = ((fy % NY) + NY) % NY;
|
|
37
|
+
const z0 = ((fz % NZ) + NZ) % NZ;
|
|
38
|
+
const x1 = x0 + 1 === NX ? 0 : x0 + 1;
|
|
39
|
+
const y1 = y0 + 1 === NY ? 0 : y0 + 1;
|
|
40
|
+
const z1 = z0 + 1 === NZ ? 0 : z0 + 1;
|
|
41
|
+
|
|
42
|
+
const r00 = NX * (y0 + NY * z0);
|
|
43
|
+
const r10 = NX * (y1 + NY * z0);
|
|
44
|
+
const r01 = NX * (y0 + NY * z1);
|
|
45
|
+
const r11 = NX * (y1 + NY * z1);
|
|
46
|
+
|
|
47
|
+
for (let c = 0; c < 3; c++) {
|
|
48
|
+
const c000 = values[3 * (x0 + r00) + c];
|
|
49
|
+
const c100 = values[3 * (x1 + r00) + c];
|
|
50
|
+
const c010 = values[3 * (x0 + r10) + c];
|
|
51
|
+
const c110 = values[3 * (x1 + r10) + c];
|
|
52
|
+
const c001 = values[3 * (x0 + r01) + c];
|
|
53
|
+
const c101 = values[3 * (x1 + r01) + c];
|
|
54
|
+
const c011 = values[3 * (x0 + r11) + c];
|
|
55
|
+
const c111 = values[3 * (x1 + r11) + c];
|
|
56
|
+
|
|
57
|
+
const a0 = c000 + (c100 - c000) * tx;
|
|
58
|
+
const a1 = c010 + (c110 - c010) * tx;
|
|
59
|
+
const a2 = c001 + (c101 - c001) * tx;
|
|
60
|
+
const a3 = c011 + (c111 - c011) * tx;
|
|
61
|
+
|
|
62
|
+
const b0 = a0 + (a1 - a0) * ty;
|
|
63
|
+
const b1 = a2 + (a3 - a2) * ty;
|
|
64
|
+
|
|
65
|
+
out[c] = b0 + (b1 - b0) * tz;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
return out;
|
|
69
|
+
}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* Guarantees:
|
|
7
7
|
* - Strictly `m0 + m1` triangles emitted.
|
|
8
8
|
* - Zero index-degenerate triangles (`i0 !== i1 && i1 !== i2 && i2 !== i0`), preventing
|
|
9
|
-
* `MeshoptClusterizer`
|
|
9
|
+
* `MeshoptClusterizer` from stripping triangles.
|
|
10
10
|
* - Consistent outward CCW winding for right-handed `(T, R, S = T x R)` rings where `theta`
|
|
11
11
|
* increases from `0` to `2*PI`.
|
|
12
12
|
*
|
|
@@ -8,7 +8,7 @@ import { assert } from "../../../core/assert.js";
|
|
|
8
8
|
* Guarantees:
|
|
9
9
|
* - Strictly `m0 + m1` triangles emitted.
|
|
10
10
|
* - Zero index-degenerate triangles (`i0 !== i1 && i1 !== i2 && i2 !== i0`), preventing
|
|
11
|
-
* `MeshoptClusterizer`
|
|
11
|
+
* `MeshoptClusterizer` from stripping triangles.
|
|
12
12
|
* - Consistent outward CCW winding for right-handed `(T, R, S = T x R)` rings where `theta`
|
|
13
13
|
* increases from `0` to `2*PI`.
|
|
14
14
|
*
|
|
@@ -28,7 +28,8 @@ timings simply do not appear without it.
|
|
|
28
28
|
|---|---|---|
|
|
29
29
|
| **Sort** | `gpu_primitive/sort/verify_radix_sort.js` | 30 cases across tile boundaries and three key distributions: keys ascending, payload a permutation of the input indices, every payload still beside its own key, and equal keys still in input order (stability, which is what each digit pass of an LSD sort rests on). |
|
|
30
30
|
| **BVH build** | `gpu_primitive/bvh/verify_gpu_bvh_build.js` | ~58 leaf sets — coincident, tight-clustered, degenerate zero-volume, mixed — at counts either side of every workgroup and tile boundary up to 100k. Structural validity, payload permutation, parent boxes containing children, **topology matching `ebvh_build_hierarchy_radix` node for node**, refit bounds matching the CPU's, a depth histogram against the 32-entry traversal stack, and SAH against the oracle's. |
|
|
31
|
-
| **
|
|
31
|
+
| **BVH8 encode** | `gpu_primitive/bvh8/verify_gpu_bvh8_encode.js` | The same leaf sets, at counts either side of where the encode changes recording (1,024 leaves) and of its workgroups' edges: the binary tree is built as the scene's is, encoded three levels to a node, and the result held **word for word to `bvh8_encode_from_bvh2`** run over the binary tree the device built — header, nodes, payloads, and the words past them left alone. Each tree's depth against the 16 levels a walk's stack holds, and the per-pass time of build and encode at 1,024 and 100,003 leaves. |
|
|
32
|
+
| **TLAS end to end** | `scene/verify_gpu_tlas_build.js` | The shipped path: a real `GPUDatabase` over `SCENE_DATABASE_SPEC`, rows added to `GPUInstancesAccelerationStructure`, `update()` called the way `GPUSceneContext` calls it. The tree read back is the BVH8 every query walks, held by `check_bvh8_tree`: every row a leaf once, every slot holding the world boxes under it, the header's box the scene's. This is the only on-device coverage of `shader_bvh_extract_instance_leaves` and of the ±inf seeding of the scene-bounds cell — plus movement, removal, and the emptied tree. |
|
|
32
33
|
|
|
33
34
|
The BVH harness feeds the CPU oracle the GPU's **own** sorted Morton order rather than recomputing
|
|
34
35
|
it. WGSL's `round` breaks halfway cases to even and JavaScript's breaks them upward, so on
|
|
@@ -39,10 +40,11 @@ order keeps the comparison about emission rather than about rounding.
|
|
|
39
40
|
|
|
40
41
|
`PASS` / `FAIL` per case, in green and red. Below each tree, a depth histogram as `depth:leaves`.
|
|
41
42
|
|
|
42
|
-
A depth **warning** is not a failure.
|
|
43
|
-
|
|
44
|
-
depth is a real output-quality constraint
|
|
45
|
-
|
|
43
|
+
A depth **warning** is not a failure. A query walks the instances' tree and a mesh's on one stack,
|
|
44
|
+
sixteen entries each, and a walk that runs out of entries drops what it cannot keep rather than
|
|
45
|
+
erroring, so depth is a real output-quality constraint. The BVH8 encode and the TLAS check report
|
|
46
|
+
the wide tree's depth against those sixteen; the BVH build check reports the binary tree's, of
|
|
47
|
+
which the wide tree's is a third.
|
|
46
48
|
|
|
47
49
|
Uncaptured device errors and device-lost events are surfaced in the log. They matter here more than
|
|
48
50
|
usual: these harnesses check bytes, and a shader that failed to compile has no bytes to check.
|
|
@@ -53,5 +55,5 @@ What a tree looks like when something traverses it. That needs the full renderer
|
|
|
53
55
|
`src/shade/playground/sponza_path_trace/` is where Sponza gets traced, and where a regression in
|
|
54
56
|
the tree would show as something visible rather than as a failed assertion.
|
|
55
57
|
|
|
56
|
-
|
|
58
|
+
The sort, BVH build and TLAS harnesses are also registered in the main playground's **review checks** folder, for when
|
|
57
59
|
you are already in a scene.
|