@woosh/meep-engine 3.41.0 → 3.42.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/build/bundle-worker-image-decoder.js +1 -1
- package/build/bundle-worker-terrain.js +1 -1
- package/editor/selection/editor_pick.d.ts.map +1 -1
- package/editor/selection/editor_pick.js +2 -1
- package/editor/tools/TransformToolV2.d.ts.map +1 -1
- package/editor/tools/TransformToolV2.js +7 -1
- package/editor/tools/engine/ToolEngine.d.ts.map +1 -1
- package/editor/tools/engine/ToolEngine.js +10 -0
- package/editor/tools/v2/TransformControls.d.ts.map +1 -1
- package/editor/tools/v2/TransformControls.js +7 -20
- package/editor/tools/v2/handle/gizmo_drag_plane.d.ts.map +1 -1
- package/editor/tools/v2/handle/gizmo_drag_plane.js +4 -0
- package/editor/view/ecs/EntityEditor.d.ts.map +1 -1
- package/editor/view/ecs/EntityEditor.js +3 -1
- package/editor/view/node-graph/NodeGraphView.d.ts.map +1 -1
- package/editor/view/node-graph/NodeGraphView.js +28 -12
- package/package.json +1 -1
- package/samples/engine/first-scene/index.html +4 -1
- package/samples/engine/first-scene/main.js +14 -9
- package/src/core/binary/utf8/utf8_decode.js +3 -3
- package/src/core/bvh2/binary/2/bvh32_query_user_data_ray.d.ts.map +1 -1
- package/src/core/bvh2/binary/2/bvh32_query_user_data_ray.js +112 -113
- package/src/core/bvh2/bvh3/ebvh_nodes_sort_sah_local4.js +2 -2
- package/src/core/cache/wtinylfu/benchmark/CacheWTinylfu.bench.md +14 -14
- package/src/core/collection/RingBuffer.d.ts.map +1 -1
- package/src/core/collection/RingBuffer.js +4 -0
- package/src/core/collection/array/array_contains_duplicates.d.ts.map +1 -1
- package/src/core/collection/array/array_contains_duplicates.js +2 -1
- package/src/core/collection/array/array_copy.d.ts.map +1 -1
- package/src/core/collection/array/array_copy.js +23 -0
- package/src/core/collection/array/typed/sparse_typed_array_hash.d.ts +2 -2
- package/src/core/collection/array/typed/sparse_typed_array_hash.d.ts.map +1 -1
- package/src/core/collection/array/typed/sparse_typed_array_hash.js +9 -8
- package/src/core/collection/array/typed/uint16_array_hash.d.ts +2 -2
- package/src/core/collection/array/typed/uint16_array_hash.js +4 -4
- package/src/core/collection/array/typed/uint8_array_hash.d.ts +2 -2
- package/src/core/collection/array/typed/uint8_array_hash.js +4 -4
- package/src/core/collection/array/weightedRandomFromArray.d.ts +1 -0
- package/src/core/collection/array/weightedRandomFromArray.d.ts.map +1 -1
- package/src/core/collection/array/weightedRandomFromArray.js +9 -1
- package/src/core/collection/heap/BinaryHeap.d.ts.map +1 -1
- package/src/core/collection/heap/BinaryHeap.js +4 -0
- package/src/core/collection/list/List.d.ts.map +1 -1
- package/src/core/collection/list/List.js +4 -2
- package/src/core/collection/set/ArraySet.js +1 -1
- package/src/core/collection/set/HashSet.d.ts +1 -1
- package/src/core/collection/set/HashSet.d.ts.map +1 -1
- package/src/core/collection/set/HashSet.js +4 -2
- package/src/core/debug/matchers/IsEqual.js +1 -1
- package/src/core/debug/matchers/IsIterableContaining.d.ts.map +1 -1
- package/src/core/debug/matchers/IsIterableContaining.js +61 -74
- package/src/core/events/signal/SignalBinding.js +101 -101
- package/src/core/function/extractFunctionBody.js +13 -13
- package/src/core/function/objectsEqual.d.ts.map +1 -1
- package/src/core/function/objectsEqual.js +15 -14
- package/src/core/geom/3d/frustum/frustum3_compute_closest_point.d.ts.map +1 -1
- package/src/core/geom/3d/frustum/frustum3_compute_closest_point.js +207 -172
- package/src/core/geom/3d/gjk/gjk_epa_penetration.d.ts.map +1 -1
- package/src/core/geom/3d/gjk/gjk_epa_penetration.js +5 -4
- package/src/core/geom/3d/line/line3_compute_segment_point_distance_eikonal.d.ts.map +1 -1
- package/src/core/geom/3d/line/line3_compute_segment_point_distance_eikonal.js +8 -2
- package/src/core/geom/3d/triangle/tri3_ray_intersection.d.ts +20 -0
- package/src/core/geom/3d/triangle/tri3_ray_intersection.d.ts.map +1 -1
- package/src/core/geom/3d/triangle/tri3_ray_intersection.js +182 -0
- package/src/core/math/noise/curl_noise_3dt.d.ts.map +1 -1
- package/src/core/math/noise/curl_noise_3dt.js +20 -10
- package/src/core/math/noise/sdnoise.d.ts +16 -5
- package/src/core/math/noise/sdnoise.d.ts.map +1 -1
- package/src/core/math/noise/sdnoise.js +43 -9
- package/src/core/math/spline/spline3_hermite_nearest_point.d.ts +16 -1
- package/src/core/math/spline/spline3_hermite_nearest_point.d.ts.map +1 -1
- package/src/core/math/spline/spline3_hermite_nearest_point.js +44 -3
- package/src/engine/Engine.d.ts.map +1 -1
- package/src/engine/Engine.js +6 -2
- package/src/engine/control/first-person/FirstPersonPlayerController.d.ts +9 -0
- package/src/engine/control/first-person/FirstPersonPlayerController.d.ts.map +1 -1
- package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.d.ts +26 -0
- package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.d.ts.map +1 -1
- package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.js +2 -0
- package/src/engine/control/first-person/abilities/AbilitySet.d.ts.map +1 -1
- package/src/engine/control/first-person/abilities/AbilitySet.js +9 -0
- package/src/engine/control/first-person/abilities/LedgeGrab.d.ts.map +1 -1
- package/src/engine/control/first-person/abilities/LedgeGrab.js +6 -0
- package/src/engine/control/first-person/abilities/Slide.d.ts.map +1 -1
- package/src/engine/control/first-person/abilities/Slide.js +1 -0
- package/src/engine/control/first-person/abilities/WallRun.d.ts +4 -1
- package/src/engine/control/first-person/abilities/WallRun.d.ts.map +1 -1
- package/src/engine/control/first-person/abilities/WallRun.js +13 -1
- package/src/engine/control/first-person/mastery/SlideInitiationTimingEvaluator.d.ts +1 -1
- package/src/engine/control/first-person/mastery/SlideInitiationTimingEvaluator.d.ts.map +1 -1
- package/src/engine/control/first-person/mastery/SlideInitiationTimingEvaluator.js +6 -5
- package/src/engine/control/first-person/mastery/StrideTimingJumpEvaluator.d.ts +3 -3
- package/src/engine/control/first-person/mastery/StrideTimingJumpEvaluator.d.ts.map +1 -1
- package/src/engine/control/first-person/mastery/StrideTimingJumpEvaluator.js +9 -8
- package/src/engine/control/first-person/sensors/FirstPersonSensorsSystem.d.ts.map +1 -1
- package/src/engine/control/first-person/sensors/FirstPersonSensorsSystem.js +13 -4
- package/src/engine/ecs/EntityManager.d.ts.map +1 -1
- package/src/engine/ecs/EntityManager.js +18 -15
- package/src/engine/ecs/dynamic_actions/rules/DynamicRuleDescription.d.ts.map +1 -1
- package/src/engine/ecs/dynamic_actions/rules/DynamicRuleDescription.js +2 -1
- package/src/engine/ecs/dynamic_actions/rules/DynamicRuleDescriptionTable.d.ts.map +1 -1
- package/src/engine/ecs/dynamic_actions/rules/DynamicRuleDescriptionTable.js +1 -0
- package/src/engine/ecs/fow/FogOfWarRevealerSystem.d.ts.map +1 -1
- package/src/engine/ecs/fow/FogOfWarRevealerSystem.js +3 -0
- package/src/engine/ecs/parent/EntityNode.js +3 -3
- package/src/engine/ecs/speaker/VoiceSystem.d.ts.map +1 -1
- package/src/engine/ecs/speaker/VoiceSystem.js +4 -0
- package/src/engine/ecs/storage/BinaryBufferDeSerializer.js +5 -5
- package/src/engine/ecs/storage/binary/BinarySerializationRegistry.d.ts.map +1 -1
- package/src/engine/ecs/storage/binary/BinarySerializationRegistry.js +3 -2
- package/src/engine/ecs/storage/binary/object/BinaryObjectSerializationAdapter2.js +1 -1
- package/src/engine/ecs/storage/binary/object-v2/BinaryObjectDeSerializer.d.ts.map +1 -1
- package/src/engine/ecs/storage/binary/object-v2/BinaryObjectDeSerializer.js +8 -1
- package/src/engine/ecs/storage/populateEngineSerializationRegistry.d.ts.map +1 -1
- package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +8 -0
- package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.d.ts.map +1 -1
- package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.js +5 -2
- package/src/engine/ecs/terrain/ecs/layers/TerrainLayers.d.ts.map +1 -1
- package/src/engine/ecs/terrain/ecs/layers/TerrainLayers.js +3 -0
- package/src/engine/ecs/terrain/ecs/splat/SplatMapping.d.ts.map +1 -1
- package/src/engine/ecs/terrain/ecs/splat/SplatMapping.js +1 -0
- package/src/engine/ecs/terrain/overlay/TerrainOverlay.js +1 -1
- package/src/engine/ecs/terrain/tiles/TerrainTile.d.ts.map +1 -1
- package/src/engine/ecs/terrain/tiles/TerrainTile.js +13 -1
- package/src/engine/ecs/terrain/tiles/TerrainTileManager.d.ts.map +1 -1
- package/src/engine/ecs/terrain/tiles/TerrainTileManager.js +1 -0
- package/src/engine/graphics/ecs/light/LightSerializationAdapter.d.ts.map +1 -1
- package/src/engine/graphics/ecs/light/LightSerializationAdapter.js +13 -1
- package/src/engine/graphics/ecs/light/LightSerializationUpgrader_0_1.d.ts +5 -0
- package/src/engine/graphics/ecs/light/LightSerializationUpgrader_0_1.d.ts.map +1 -0
- package/src/engine/graphics/ecs/light/LightSerializationUpgrader_0_1.js +27 -0
- package/src/engine/graphics/ecs/water/Water.d.ts +11 -0
- package/src/engine/graphics/ecs/water/Water.d.ts.map +1 -1
- package/src/engine/graphics/ecs/water/Water.js +17 -0
- package/src/engine/graphics/ecs/water/WaterSerializationAdapter.d.ts.map +1 -1
- package/src/engine/graphics/ecs/water/WaterSerializationAdapter.js +3 -1
- package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_4_5.d.ts +9 -0
- package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_4_5.d.ts.map +1 -0
- package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_4_5.js +24 -0
- package/src/engine/graphics/ecs/water/WaterWaves.d.ts +30 -9
- package/src/engine/graphics/ecs/water/WaterWaves.d.ts.map +1 -1
- package/src/engine/graphics/ecs/water/WaterWaves.js +41 -9
- package/src/engine/graphics/ecs/water/WaterWavesSerializationAdapter.d.ts.map +1 -1
- package/src/engine/graphics/ecs/water/WaterWavesSerializationAdapter.js +30 -26
- package/src/engine/graphics/ecs/water/WaterWavesSerializationUpgrader_0_1.d.ts +6 -0
- package/src/engine/graphics/ecs/water/WaterWavesSerializationUpgrader_0_1.d.ts.map +1 -0
- package/src/engine/graphics/ecs/water/WaterWavesSerializationUpgrader_0_1.js +22 -0
- package/src/engine/graphics/geometry/buffered/query/bvh32_geometry_raycast.d.ts.map +1 -1
- package/src/engine/graphics/geometry/buffered/query/bvh32_geometry_raycast.js +3 -5
- package/src/engine/graphics/texture/3d/scs3d_sample_linear3.d.ts +20 -0
- package/src/engine/graphics/texture/3d/scs3d_sample_linear3.d.ts.map +1 -1
- package/src/engine/graphics/texture/3d/scs3d_sample_linear3.js +36 -0
- package/src/engine/graphics3/WaterSystem.d.ts +12 -3
- package/src/engine/graphics3/WaterSystem.d.ts.map +1 -1
- package/src/engine/graphics3/WaterSystem.js +78 -46
- package/src/engine/input/devices/PointerDevice.d.ts.map +1 -1
- package/src/engine/input/devices/PointerDevice.js +29 -4
- package/src/engine/intelligence/behavior/selector/WeightedRandomBehavior.d.ts +1 -0
- package/src/engine/intelligence/behavior/selector/WeightedRandomBehavior.d.ts.map +1 -1
- package/src/engine/intelligence/behavior/selector/WeightedRandomBehavior.js +14 -3
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
- package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_velocity.d.ts.map +1 -1
- package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_velocity.js +12 -3
- package/src/engine/physics/fluid/solver/v3_grid_advect_sl_velocity.d.ts.map +1 -1
- package/src/engine/physics/fluid/solver/v3_grid_advect_sl_velocity.js +8 -2
- package/src/engine/physics/fluid/solver/v3_grid_sample_scalar_masked.d.ts +19 -0
- package/src/engine/physics/fluid/solver/v3_grid_sample_scalar_masked.d.ts.map +1 -1
- package/src/engine/physics/fluid/solver/v3_grid_sample_scalar_masked.js +41 -2
- package/src/engine/physics/fluid/solver/v3_mac_advect_scalar.d.ts.map +1 -1
- package/src/engine/physics/fluid/solver/v3_mac_advect_scalar.js +9 -3
- package/src/engine/physics/fluid/solver/v3_mac_advect_sl_velocity.d.ts.map +1 -1
- package/src/engine/physics/fluid/solver/v3_mac_advect_sl_velocity.js +26 -10
- package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.d.ts +3 -6
- package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.d.ts.map +1 -1
- package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.js +22 -9
- package/src/engine/ui/DraggableAspect.d.ts +5 -1
- package/src/engine/ui/DraggableAspect.d.ts.map +1 -1
- package/src/engine/ui/DraggableAspect.js +61 -4
- package/src/format/image/avif/heif/ItemProperty.d.ts +1 -1
- package/src/format/image/avif/heif/ItemProperty.js +1 -1
- package/src/format/image/png/chunk/png_chunk_decode_iTXt.d.ts.map +1 -1
- package/src/format/image/png/chunk/png_chunk_decode_iTXt.js +17 -6
- package/src/shade/device/mock/SoftwareGPUDevice.d.ts +2 -4
- package/src/shade/device/mock/SoftwareGPUDevice.d.ts.map +1 -1
- package/src/shade/device/mock/SoftwareGPUDevice.js +20 -13
- package/src/shade/playground/skinned_blas_refit/sweep_views.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/sweep_views.js +2 -1
- package/src/shade/playground/water_refraction/README.md +10 -11
- package/src/shade/playground/water_refraction/main.js +9 -8
- package/src/shade/playground/water_refraction/world.js +1 -1
- package/src/shade/playground/water_surface/README.md +43 -0
- package/src/shade/playground/water_surface/index.html +30 -0
- package/src/shade/playground/water_surface/main.d.ts +2 -0
- package/src/shade/playground/water_surface/main.d.ts.map +1 -0
- package/src/shade/playground/water_surface/main.js +154 -0
- package/src/shade/playground/water_surface/world.d.ts +44 -0
- package/src/shade/playground/water_surface/world.d.ts.map +1 -0
- package/src/shade/playground/water_surface/world.js +160 -0
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +5 -0
- package/src/shade/renderer/binding/BufferBinding.js +2 -2
- package/src/shade/renderer/buffer/table/GPUTypedTable.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/GPUTypedTable.js +5 -3
- package/src/shade/renderer/buffer/table/GPUTypedTableDescriptor.d.ts +10 -3
- package/src/shade/renderer/buffer/table/GPUTypedTableDescriptor.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/GPUTypedTableDescriptor.js +17 -9
- package/src/shade/renderer/camera/orbital/OrbitalCameraInput.d.ts +3 -0
- package/src/shade/renderer/camera/orbital/OrbitalCameraInput.d.ts.map +1 -1
- package/src/shade/renderer/camera/orbital/OrbitalCameraInput.js +16 -0
- package/src/shade/renderer/camera/orbital/OrbitalCameraRig.d.ts +2 -0
- package/src/shade/renderer/camera/orbital/OrbitalCameraRig.d.ts.map +1 -1
- package/src/shade/renderer/camera/orbital/OrbitalCameraRig.js +11 -0
- package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.d.ts +1 -1
- package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.d.ts.map +1 -1
- package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.js +9 -3
- package/src/shade/renderer/geometry/util/geometry_simplify_redundant_topology.d.ts.map +1 -1
- package/src/shade/renderer/geometry/util/geometry_simplify_redundant_topology.js +2 -2
- package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.js +85 -0
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.js +12 -6
- package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.js +7 -0
- package/src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.js +3 -1
- package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
- package/src/shade/renderer/scene/SCENE_DATABASE_SPEC.js +2 -1
- package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128_inverse.d.ts +13 -0
- package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128_inverse.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128_inverse.js +42 -0
- package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128x4_inverse_workgroup.d.ts +15 -0
- package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128x4_inverse_workgroup.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128x4_inverse_workgroup.js +39 -0
- package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts.map +1 -1
- package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js +2 -0
- package/src/shade/renderer/water/GPUWaterRenderer.d.ts +15 -0
- package/src/shade/renderer/water/GPUWaterRenderer.d.ts.map +1 -1
- package/src/shade/renderer/water/GPUWaterRenderer.js +110 -30
- package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts +16 -8
- package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts.map +1 -1
- package/src/shade/renderer/water/medium/GPUWaterBodies.js +31 -26
- package/src/shade/renderer/water/medium/shader_water_meshlets.d.ts +0 -1
- package/src/shade/renderer/water/medium/shader_water_meshlets.d.ts.map +1 -1
- package/src/shade/renderer/water/medium/shader_water_meshlets.js +1 -39
- package/src/shade/renderer/water/shader_water.d.ts +0 -1
- package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
- package/src/shade/renderer/water/shader_water.js +201 -72
- package/src/shade/renderer/water/surface/GPUWaterSurface.d.ts +70 -0
- package/src/shade/renderer/water/surface/GPUWaterSurface.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/GPUWaterSurface.js +199 -0
- package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.d.ts +5 -2
- package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.js +32 -12
- package/src/shade/renderer/water/surface/chunk_water_surface_sample.d.ts +22 -0
- package/src/shade/renderer/water/surface/chunk_water_surface_sample.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/chunk_water_surface_sample.js +217 -0
- package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts +65 -11
- package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts.map +1 -1
- package/src/shade/renderer/water/surface/graph_water_tessellation.js +163 -28
- package/src/shade/renderer/water/surface/lod/WATER_LOD.d.ts +51 -0
- package/src/shade/renderer/water/surface/lod/WATER_LOD.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/lod/WATER_LOD.js +95 -0
- package/src/shade/renderer/water/surface/lod/chunk_water_lod.d.ts +10 -0
- package/src/shade/renderer/water/surface/lod/chunk_water_lod.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/lod/chunk_water_lod.js +127 -0
- package/src/shade/renderer/water/surface/lod/chunk_water_lod_cell.d.ts +17 -0
- package/src/shade/renderer/water/surface/lod/chunk_water_lod_cell.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/lod/chunk_water_lod_cell.js +246 -0
- package/src/shade/renderer/water/surface/lod/shader_water_lod.d.ts +118 -0
- package/src/shade/renderer/water/surface/lod/shader_water_lod.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/lod/shader_water_lod.js +727 -0
- package/src/shade/renderer/water/surface/particles/GPUWaterParticles.d.ts +60 -0
- package/src/shade/renderer/water/surface/particles/GPUWaterParticles.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/particles/GPUWaterParticles.js +228 -0
- package/src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.d.ts +17 -0
- package/src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.js +49 -0
- package/src/shade/renderer/water/surface/particles/chunk_water_particle.d.ts +22 -0
- package/src/shade/renderer/water/surface/particles/chunk_water_particle.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/particles/chunk_water_particle.js +143 -0
- package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.d.ts +15 -0
- package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.js +121 -0
- package/src/shade/renderer/water/surface/particles/shader_water_particles.d.ts +83 -0
- package/src/shade/renderer/water/surface/particles/shader_water_particles.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/particles/shader_water_particles.js +502 -0
- package/src/shade/renderer/water/surface/shader_water_cull.d.ts +42 -0
- package/src/shade/renderer/water/surface/shader_water_cull.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/shader_water_cull.js +269 -0
- package/src/shade/renderer/water/surface/shader_water_waves_combine.d.ts +15 -0
- package/src/shade/renderer/water/surface/shader_water_waves_combine.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/shader_water_waves_combine.js +73 -0
- package/src/shade/renderer/water/surface/shader_water_waves_derive.d.ts +11 -0
- package/src/shade/renderer/water/surface/shader_water_waves_derive.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/shader_water_waves_derive.js +78 -0
- package/src/shade/renderer/water/surface/spectrum/GPUWaterSpectrum.d.ts +35 -0
- package/src/shade/renderer/water/surface/spectrum/GPUWaterSpectrum.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/spectrum/GPUWaterSpectrum.js +103 -0
- package/src/shade/renderer/water/surface/spectrum/WATER_BAND_STATE.d.ts +22 -0
- package/src/shade/renderer/water/surface/spectrum/WATER_BAND_STATE.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/spectrum/WATER_BAND_STATE.js +57 -0
- package/src/shade/renderer/water/surface/spectrum/WATER_SPECTRUM.d.ts +22 -0
- package/src/shade/renderer/water/surface/spectrum/WATER_SPECTRUM.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/spectrum/WATER_SPECTRUM.js +25 -0
- package/src/shade/renderer/water/surface/spectrum/chunk_water_jonswap.d.ts +14 -0
- package/src/shade/renderer/water/surface/spectrum/chunk_water_jonswap.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/spectrum/chunk_water_jonswap.js +48 -0
- package/src/shade/renderer/water/surface/spectrum/chunk_water_spectrum.d.ts +23 -0
- package/src/shade/renderer/water/surface/spectrum/chunk_water_spectrum.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/spectrum/chunk_water_spectrum.js +169 -0
- package/src/shade/renderer/water/surface/spectrum/shader_water_spectrum.d.ts +26 -0
- package/src/shade/renderer/water/surface/spectrum/shader_water_spectrum.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/spectrum/shader_water_spectrum.js +161 -0
- package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.d.ts.map +1 -1
- package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +18 -6
- package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
- package/src/shade/wgsl/emulator/WGSLLanguageCore.js +11 -3
- package/src/core/geom/2d/polygon/polygon2_triangulate.corpus.d.ts +0 -28
- package/src/core/geom/2d/polygon/polygon2_triangulate.corpus.d.ts.map +0 -1
- package/src/core/geom/2d/polygon/polygon2_triangulate.corpus.js +0 -86
- package/src/engine/ecs/storage/binary/object-v2/serializerTestHarness.d.ts +0 -29
- package/src/engine/ecs/storage/binary/object-v2/serializerTestHarness.d.ts.map +0 -1
- package/src/engine/ecs/storage/binary/object-v2/serializerTestHarness.js +0 -44
- package/src/shade/renderer/water/medium/shader_water_bodies_derive.d.ts +0 -4
- package/src/shade/renderer/water/medium/shader_water_bodies_derive.d.ts.map +0 -1
- package/src/shade/renderer/water/medium/shader_water_bodies_derive.js +0 -32
- package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.d.ts +0 -25
- package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.d.ts.map +0 -1
- package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.js +0 -128
- package/src/shade/renderer/water/surface/chunk_water_tessellation.d.ts +0 -9
- package/src/shade/renderer/water/surface/chunk_water_tessellation.d.ts.map +0 -1
- package/src/shade/renderer/water/surface/chunk_water_tessellation.js +0 -144
- package/src/shade/renderer/water/surface/chunk_water_wave.d.ts +0 -13
- package/src/shade/renderer/water/surface/chunk_water_wave.d.ts.map +0 -1
- package/src/shade/renderer/water/surface/chunk_water_wave.js +0 -40
- package/src/shade/renderer/water/surface/shader_water_tiles.d.ts +0 -4
- package/src/shade/renderer/water/surface/shader_water_tiles.d.ts.map +0 -1
- package/src/shade/renderer/water/surface/shader_water_tiles.js +0 -123
- package/src/shade/renderer/water/surface/shader_water_wave_batch.d.ts +0 -6
- package/src/shade/renderer/water/surface/shader_water_wave_batch.d.ts.map +0 -1
- package/src/shade/renderer/water/surface/shader_water_wave_batch.js +0 -85
- package/src/shade/renderer/water/surface/shader_water_wave_domain.d.ts +0 -6
- package/src/shade/renderer/water/surface/shader_water_wave_domain.d.ts.map +0 -1
- package/src/shade/renderer/water/surface/shader_water_wave_domain.js +0 -83
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WaterWavesSerializationUpgrader_0_1.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/graphics/ecs/water/WaterWavesSerializationUpgrader_0_1.js"],"names":[],"mappings":"AAWA,+DAA+D;AAC/D;IAII,wCAIC;CACJ;oCArBmC,oDAAoD"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { BinaryClassUpgrader } from "../../../ecs/storage/binary/BinaryClassUpgrader.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The fields version 1 appended, with the defaults they had at that version: constants, not read off the
|
|
5
|
+
* current `WaterWaves`, since an upgrader writes the format of its target version.
|
|
6
|
+
*/
|
|
7
|
+
const VERSION_1_DEFAULTS = [
|
|
8
|
+
0, // upwind fetch, metres
|
|
9
|
+
0.5, // shore reflection
|
|
10
|
+
];
|
|
11
|
+
|
|
12
|
+
/** Keep version 0's wind and append the version-1 defaults. */
|
|
13
|
+
export class WaterWavesSerializationUpgrader_0_1 extends BinaryClassUpgrader {
|
|
14
|
+
__startVersion = 0;
|
|
15
|
+
__targetVersion = 1;
|
|
16
|
+
|
|
17
|
+
upgrade(source, target) {
|
|
18
|
+
target.writeFloat32(source.readFloat32());
|
|
19
|
+
target.writeFloat32(source.readFloat32());
|
|
20
|
+
for (const value of VERSION_1_DEFAULTS) { target.writeFloat32(value); }
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bvh32_geometry_raycast.d.ts","sourceRoot":"","sources":["../../../../../../../src/engine/graphics/geometry/buffered/query/bvh32_geometry_raycast.js"],"names":[],"mappings":"AAeA;;;;;;;;;;;;;;;;;GAiBG;AACH,+CAhBW,aAAa,kCAEb,MAAM,EAAE,GAAC,UAAU,MAAM,CAAC,iBAC1B,MAAM,iBACN,MAAM,0BACN,OAAO,WACP,MAAM,EAAE,GAAC,UAAU,MAAM,CAAC,GAAC,SAAS,YACpC,MAAM,YACN,MAAM,YACN,MAAM,eACN,MAAM,eACN,MAAM,eACN,MAAM,gBACN,MAAM,GACJ,OAAO,
|
|
1
|
+
{"version":3,"file":"bvh32_geometry_raycast.d.ts","sourceRoot":"","sources":["../../../../../../../src/engine/graphics/geometry/buffered/query/bvh32_geometry_raycast.js"],"names":[],"mappings":"AAeA;;;;;;;;;;;;;;;;;GAiBG;AACH,+CAhBW,aAAa,kCAEb,MAAM,EAAE,GAAC,UAAU,MAAM,CAAC,iBAC1B,MAAM,iBACN,MAAM,0BACN,OAAO,WACP,MAAM,EAAE,GAAC,UAAU,MAAM,CAAC,GAAC,SAAS,YACpC,MAAM,YACN,MAAM,YACN,MAAM,eACN,MAAM,eACN,MAAM,eACN,MAAM,gBACN,MAAM,GACJ,OAAO,CA6DnB;8BA1F6B,8CAA8C"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { assert } from "../../../../../core/assert.js";
|
|
2
2
|
import { bvh32_query_user_data_ray } from "../../../../../core/bvh2/binary/2/bvh32_query_user_data_ray.js";
|
|
3
3
|
import { SurfacePoint3 } from "../../../../../core/geom/3d/SurfacePoint3.js";
|
|
4
|
-
import {
|
|
4
|
+
import { tri3_ray_intersection_triangle_array } from "../../../../../core/geom/3d/triangle/tri3_ray_intersection.js";
|
|
5
5
|
import { read_triangle_vertices } from "../read_triangle_vertices.js";
|
|
6
6
|
|
|
7
7
|
const scratch_array = []
|
|
@@ -68,13 +68,11 @@ export function bvh32_geometry_raycast(
|
|
|
68
68
|
triangle_index
|
|
69
69
|
);
|
|
70
70
|
|
|
71
|
-
const triangle_hit_found =
|
|
71
|
+
const triangle_hit_found = tri3_ray_intersection_triangle_array(
|
|
72
72
|
scratch_hit,
|
|
73
73
|
origin_x, origin_y, origin_z,
|
|
74
74
|
direction_x, direction_y, direction_z,
|
|
75
|
-
triangle_scratch
|
|
76
|
-
triangle_scratch[3], triangle_scratch[4], triangle_scratch[5],
|
|
77
|
-
triangle_scratch[6], triangle_scratch[7], triangle_scratch[8]
|
|
75
|
+
triangle_scratch, 0
|
|
78
76
|
)
|
|
79
77
|
|
|
80
78
|
if (!triangle_hit_found) {
|
|
@@ -24,4 +24,24 @@
|
|
|
24
24
|
* @return {Float32Array|number[]} `out`, for chaining.
|
|
25
25
|
*/
|
|
26
26
|
export function scs3d_sample_linear3(out: Float32Array | number[], data_0: Float32Array, data_1: Float32Array, data_2: Float32Array, res_x: number, res_y: number, res_z: number, x: number, y: number, z: number): Float32Array | number[];
|
|
27
|
+
/**
|
|
28
|
+
* {@link scs3d_sample_linear3} with the position read from `position[position_offset ..+2]`.
|
|
29
|
+
* For per-cell callers, passing fractional coordinates in a reusable array avoids numeric argument
|
|
30
|
+
* boxes when the sampler is not inlined. Float64 coordinates preserve the scalar form's precision.
|
|
31
|
+
*
|
|
32
|
+
* The three coordinates are read before any output store, so `position` may overlap `out` and a
|
|
33
|
+
* reentrant output setter cannot change the coordinates used by the scalar facade's sample.
|
|
34
|
+
*
|
|
35
|
+
* @param {Float32Array|Float64Array|number[]} out length >= 3
|
|
36
|
+
* @param {Float32Array} data_0
|
|
37
|
+
* @param {Float32Array} data_1
|
|
38
|
+
* @param {Float32Array} data_2
|
|
39
|
+
* @param {number} res_x
|
|
40
|
+
* @param {number} res_y
|
|
41
|
+
* @param {number} res_z
|
|
42
|
+
* @param {Float64Array} position `[x, y, z]`, in grid index space
|
|
43
|
+
* @param {number} position_offset
|
|
44
|
+
* @return {Float32Array|Float64Array|number[]} `out`, for chaining.
|
|
45
|
+
*/
|
|
46
|
+
export function scs3d_sample_linear3_array(out: Float32Array | Float64Array | number[], data_0: Float32Array, data_1: Float32Array, data_2: Float32Array, res_x: number, res_y: number, res_z: number, position: Float64Array, position_offset: number): Float32Array | Float64Array | number[];
|
|
27
47
|
//# sourceMappingURL=scs3d_sample_linear3.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scs3d_sample_linear3.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/graphics/texture/3d/scs3d_sample_linear3.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"scs3d_sample_linear3.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/graphics/texture/3d/scs3d_sample_linear3.js"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,0CAZW,YAAY,GAAC,MAAM,EAAE,UACrB,YAAY,UACZ,YAAY,UACZ,YAAY,SACZ,MAAM,SACN,MAAM,SACN,MAAM,KACN,MAAM,KACN,MAAM,KACN,MAAM,GACL,YAAY,GAAC,MAAM,EAAE,CAWhC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,gDAXW,YAAY,GAAC,YAAY,GAAC,MAAM,EAAE,UAClC,YAAY,UACZ,YAAY,UACZ,YAAY,SACZ,MAAM,SACN,MAAM,SACN,MAAM,YACN,YAAY,mBACZ,MAAM,GACL,YAAY,GAAC,YAAY,GAAC,MAAM,EAAE,CA0D7C"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { clamp } from "../../../../core/math/clamp.js";
|
|
2
2
|
import { lerp } from "../../../../core/math/lerp.js";
|
|
3
3
|
|
|
4
|
+
const scratch_position = new Float64Array(3);
|
|
5
|
+
|
|
4
6
|
/**
|
|
5
7
|
* Trilinearly sample THREE single-channel 3D grids at the same fractional
|
|
6
8
|
* position, sharing one set of corner indices and interpolation weights.
|
|
@@ -27,6 +29,40 @@ import { lerp } from "../../../../core/math/lerp.js";
|
|
|
27
29
|
* @return {Float32Array|number[]} `out`, for chaining.
|
|
28
30
|
*/
|
|
29
31
|
export function scs3d_sample_linear3(out, data_0, data_1, data_2, res_x, res_y, res_z, x, y, z) {
|
|
32
|
+
const position = scratch_position;
|
|
33
|
+
position[0] = x;
|
|
34
|
+
position[1] = y;
|
|
35
|
+
position[2] = z;
|
|
36
|
+
|
|
37
|
+
scs3d_sample_linear3_array(out, data_0, data_1, data_2, res_x, res_y, res_z, position, 0);
|
|
38
|
+
|
|
39
|
+
return out;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* {@link scs3d_sample_linear3} with the position read from `position[position_offset ..+2]`.
|
|
44
|
+
* For per-cell callers, passing fractional coordinates in a reusable array avoids numeric argument
|
|
45
|
+
* boxes when the sampler is not inlined. Float64 coordinates preserve the scalar form's precision.
|
|
46
|
+
*
|
|
47
|
+
* The three coordinates are read before any output store, so `position` may overlap `out` and a
|
|
48
|
+
* reentrant output setter cannot change the coordinates used by the scalar facade's sample.
|
|
49
|
+
*
|
|
50
|
+
* @param {Float32Array|Float64Array|number[]} out length >= 3
|
|
51
|
+
* @param {Float32Array} data_0
|
|
52
|
+
* @param {Float32Array} data_1
|
|
53
|
+
* @param {Float32Array} data_2
|
|
54
|
+
* @param {number} res_x
|
|
55
|
+
* @param {number} res_y
|
|
56
|
+
* @param {number} res_z
|
|
57
|
+
* @param {Float64Array} position `[x, y, z]`, in grid index space
|
|
58
|
+
* @param {number} position_offset
|
|
59
|
+
* @return {Float32Array|Float64Array|number[]} `out`, for chaining.
|
|
60
|
+
*/
|
|
61
|
+
export function scs3d_sample_linear3_array(out, data_0, data_1, data_2, res_x, res_y, res_z, position, position_offset) {
|
|
62
|
+
const x = position[position_offset];
|
|
63
|
+
const y = position[position_offset + 1];
|
|
64
|
+
const z = position[position_offset + 2];
|
|
65
|
+
|
|
30
66
|
const x_max = res_x - 1;
|
|
31
67
|
const y_max = res_y - 1;
|
|
32
68
|
const z_max = res_z - 1;
|
|
@@ -2,6 +2,11 @@
|
|
|
2
2
|
* Registers [Water, MeshletGeometry, Transform64] in the scene's existing GPU database. Authored
|
|
3
3
|
* edits queue writes; idle frames never walk bodies. Transform rows follow the same change events
|
|
4
4
|
* and GPU hierarchy as shaded geometry. Water does not enter the opaque mesh table or its TLAS.
|
|
5
|
+
*
|
|
6
|
+
* Every body has a surface row (WATER_SURFACE_SIMULATION_PLAN_2026_10_06.md §6.1): its wind from an
|
|
7
|
+
* optional {@link WaterWaves}, its queued splashes, and what the GPU derives from them each frame. The GPU culls
|
|
8
|
+
* every body against the frame's view before simulating; a hidden body is paused unless
|
|
9
|
+
* {@link Water#simulateWhenHidden} (WATER_SURFACE_DISTANCE_LOD_PROPOSAL_2026_10_06.md §3).
|
|
5
10
|
*/
|
|
6
11
|
export class WaterSystem extends System<any> {
|
|
7
12
|
constructor(graphics: any, scene: any);
|
|
@@ -19,7 +24,7 @@ export class WaterSystem extends System<any> {
|
|
|
19
24
|
inscatter_segments: number;
|
|
20
25
|
tessellation_pixels: number;
|
|
21
26
|
};
|
|
22
|
-
get waves():
|
|
27
|
+
get waves(): GPUWaterSurface;
|
|
23
28
|
get transparency_channel(): GPUWaterRenderer;
|
|
24
29
|
get scene(): any;
|
|
25
30
|
request_probe(uv: any): Promise<any>;
|
|
@@ -30,7 +35,11 @@ export class WaterSystem extends System<any> {
|
|
|
30
35
|
link(water: any, geometry: any, transform: any, entity: any): void;
|
|
31
36
|
unlink(water: any, geometry: any, transform: any, entity: any): void;
|
|
32
37
|
update(dt: any): void;
|
|
33
|
-
/**
|
|
38
|
+
/**
|
|
39
|
+
* A splash at a world position: rings of wave particles of the given world radius (half their wavelength)
|
|
40
|
+
* whose height is the given vertical velocity kick, m/s, over the time a crest takes to cross them. The
|
|
41
|
+
* position is interpreted in the CPU-owned pose; queued on the CPU and spent on the GPU, sixteen a body a frame.
|
|
42
|
+
*/
|
|
34
43
|
splash(entity: any, position: any, radius: any, strength: any): void;
|
|
35
44
|
record_surface(frame: any): void;
|
|
36
45
|
record(frame: any): void;
|
|
@@ -52,7 +61,7 @@ import { MeshletGeometry } from "../../shade/renderer/geometry/MeshletGeometry.j
|
|
|
52
61
|
import Water from "../graphics/ecs/water/Water.js";
|
|
53
62
|
import WaterWaves from "../graphics/ecs/water/WaterWaves.js";
|
|
54
63
|
import { ResourceAccessSpecification } from "../../core/model/ResourceAccessSpecification.js";
|
|
55
|
-
import {
|
|
64
|
+
import { GPUWaterSurface } from "../../shade/renderer/water/surface/GPUWaterSurface.js";
|
|
56
65
|
import { GPUWaterRenderer } from "../../shade/renderer/water/GPUWaterRenderer.js";
|
|
57
66
|
import { RenderExtension } from "../../shade/renderer/extension/RenderExtension.js";
|
|
58
67
|
//# sourceMappingURL=WaterSystem.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WaterSystem.d.ts","sourceRoot":"","sources":["../../../../src/engine/graphics3/WaterSystem.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"WaterSystem.d.ts","sourceRoot":"","sources":["../../../../src/engine/graphics3/WaterSystem.js"],"names":[],"mappings":"AA+BA;;;;;;;;;GASG;AACH;IA2BI,uCAaC;IAvCD,6EAAqD;IACrD,kEAA0F;IAc1F;;;;;;;;;;;MAAkD;IAClD,6BAAmC;IACnC,6CAAqD;IACrD,iBAAmC;IACnC,qCAA8D;IAE9D,0BAGC;IAJD,mBAAiC;IAqBjC,2CAOC;IAED,0BAMC;IAED,mEAsBC;IAQD,qEAkBC;IAED,sBAoBC;IAqDD;;;;OAIG;IACH,qEASC;IAED,iCAMC;IACD,yBAGC;;CACJ;AAED;IAEI,yBAAsD;IAAvB,YAAoB;IACnD,yBAA4C;CAC/C;AACD;IAEI,yBAAsD;IAAvB,YAAoB;IACnD,yBAAoD;CACvD;uBAlQsB,kBAAkB;4BAEb,iCAAiC;gCAI7B,kDAAkD;kBARhE,gCAAgC;uBACe,qCAAqC;4CAS1D,iDAAiD;gCAG7D,uDAAuD;iCAFtD,gDAAgD;gCAIjD,mDAAmD"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { assert } from "../../core/assert.js";
|
|
2
2
|
import Water from "../graphics/ecs/water/Water.js";
|
|
3
|
-
import WaterWaves from "../graphics/ecs/water/WaterWaves.js";
|
|
3
|
+
import WaterWaves, { WATER_WAVES_SHORE_REFLECTION_DEFAULT } from "../graphics/ecs/water/WaterWaves.js";
|
|
4
4
|
import { System } from "../ecs/System.js";
|
|
5
5
|
import { EventType } from "../ecs/EventType.js";
|
|
6
6
|
import { Transform64 } from "../ecs/transform/Transform64.js";
|
|
@@ -12,21 +12,32 @@ import { ResourceAccessKind } from "../../core/model/ResourceAccessKind.js";
|
|
|
12
12
|
import { ResourceAccessSpecification } from "../../core/model/ResourceAccessSpecification.js";
|
|
13
13
|
import { GPUWaterRenderer } from "../../shade/renderer/water/GPUWaterRenderer.js";
|
|
14
14
|
import { GPUWaterBodies } from "../../shade/renderer/water/medium/GPUWaterBodies.js";
|
|
15
|
-
import {
|
|
15
|
+
import { GPUWaterSurface } from "../../shade/renderer/water/surface/GPUWaterSurface.js";
|
|
16
16
|
import { FramePhase } from "../../shade/renderer/extension/FramePhase.js";
|
|
17
17
|
import { RenderExtension } from "../../shade/renderer/extension/RenderExtension.js";
|
|
18
18
|
import { SceneColor } from "../../shade/renderer/extension/SceneColor.js";
|
|
19
19
|
import { m4_invert } from "../../core/geom/3d/mat4/m4_invert.js";
|
|
20
20
|
import { generate_record_writer } from "../../shade/renderer/buffer/table/serde/generate_record_writer.js";
|
|
21
21
|
import { WATER_WAVE_IMPULSE_LIMIT, WATER_WAVE_RECORD_STRUCT } from "../../shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.js";
|
|
22
|
+
import { WATER_SPECTRUM_BAND_COUNT } from "../../shade/renderer/water/surface/spectrum/WATER_SPECTRUM.js";
|
|
22
23
|
|
|
23
|
-
|
|
24
|
+
// Only the authored fields: a whole-record write would undo what the GPU derives into the row.
|
|
25
|
+
const AUTHORED_WRITER = generate_record_writer(WATER_WAVE_RECORD_STRUCT, ['wind', 'upwind_fetch', 'node', 'geometry', 'simulate_hidden']);
|
|
24
26
|
const IMPULSE_WRITER = generate_record_writer(WATER_WAVE_RECORD_STRUCT, ['impulses', 'impulse_count']);
|
|
27
|
+
/** The WaterWaves fields a body's row follows. */
|
|
28
|
+
const WAVE_FIELDS = ['windSpeed', 'windDirection', 'upwindFetch', 'shoreReflection'];
|
|
29
|
+
/** A splash's world-to-local matrix: rain can splash hundreds of times a second. */
|
|
30
|
+
const SPLASH_INVERSE = new Float64Array(16);
|
|
25
31
|
|
|
26
32
|
/**
|
|
27
33
|
* Registers [Water, MeshletGeometry, Transform64] in the scene's existing GPU database. Authored
|
|
28
34
|
* edits queue writes; idle frames never walk bodies. Transform rows follow the same change events
|
|
29
35
|
* and GPU hierarchy as shaded geometry. Water does not enter the opaque mesh table or its TLAS.
|
|
36
|
+
*
|
|
37
|
+
* Every body has a surface row (WATER_SURFACE_SIMULATION_PLAN_2026_10_06.md §6.1): its wind from an
|
|
38
|
+
* optional {@link WaterWaves}, its queued splashes, and what the GPU derives from them each frame. The GPU culls
|
|
39
|
+
* every body against the frame's view before simulating; a hidden body is paused unless
|
|
40
|
+
* {@link Water#simulateWhenHidden} (WATER_SURFACE_DISTANCE_LOD_PROPOSAL_2026_10_06.md §3).
|
|
30
41
|
*/
|
|
31
42
|
export class WaterSystem extends System {
|
|
32
43
|
dependencies = [Water, MeshletGeometry, Transform64];
|
|
@@ -35,11 +46,13 @@ export class WaterSystem extends System {
|
|
|
35
46
|
#scene;
|
|
36
47
|
#context = null;
|
|
37
48
|
#renderer = new GPUWaterRenderer();
|
|
38
|
-
#waves = new
|
|
49
|
+
#waves = new GPUWaterSurface();
|
|
39
50
|
#bodies = new GPUWaterBodies();
|
|
40
51
|
#entries = new Map();
|
|
41
52
|
#dirty = new Set();
|
|
42
53
|
#impulses = new Set();
|
|
54
|
+
// bodies with wind: while there is none, the shared band tiles are not animated
|
|
55
|
+
#windy = new Set();
|
|
43
56
|
#extensions = [];
|
|
44
57
|
#time = 0;
|
|
45
58
|
get settings() { return this.#renderer.settings; }
|
|
@@ -60,9 +73,8 @@ export class WaterSystem extends System {
|
|
|
60
73
|
this.#waves.onInputsConsumed.add(context => {
|
|
61
74
|
if (context !== this.#context) { return; }
|
|
62
75
|
for (const entry of this.#impulses) {
|
|
63
|
-
entry.staged.
|
|
64
|
-
if (entry.
|
|
65
|
-
else { this.#impulses.delete(entry); }
|
|
76
|
+
entry.staged.impulse_count = 0;
|
|
77
|
+
if (entry.queue.length === 0) { this.#impulses.delete(entry); }
|
|
66
78
|
}
|
|
67
79
|
});
|
|
68
80
|
this.#renderer.bodies = this.#bodies;
|
|
@@ -87,8 +99,10 @@ export class WaterSystem extends System {
|
|
|
87
99
|
}
|
|
88
100
|
|
|
89
101
|
link(water, geometry, transform, entity) {
|
|
90
|
-
|
|
91
|
-
|
|
102
|
+
// queue: splashes not yet staged, four numbers each (local x, z, radius, kick); staged: the batch on the
|
|
103
|
+
// GPU row until a submitted frame spends it
|
|
104
|
+
const entry = { water, geometry, transform, entity, context: null, row: -1, wave: -1, waves: null, queue: [],
|
|
105
|
+
staged: { impulses: Array.from({ length: WATER_WAVE_IMPULSE_LIMIT }, () => new Float64Array(4)), impulse_count: 0 } };
|
|
92
106
|
const dataset = this.entityManager.dataset;
|
|
93
107
|
entry.changed = () => this.#dirty.add(entry);
|
|
94
108
|
entry.world = () => entry.context?.rows.mark_world(entity);
|
|
@@ -109,11 +123,9 @@ export class WaterSystem extends System {
|
|
|
109
123
|
}
|
|
110
124
|
|
|
111
125
|
#watch_waves(entry) {
|
|
112
|
-
entry.waves
|
|
113
|
-
entry.waves?.windDirection.onChanged.remove(entry.changed);
|
|
126
|
+
if (entry.waves != null) { for (const field of WAVE_FIELDS) { entry.waves[field].onChanged.remove(entry.changed); } }
|
|
114
127
|
entry.waves = this.entityManager.dataset.getComponent(entry.entity, WaterWaves);
|
|
115
|
-
entry.waves
|
|
116
|
-
entry.waves?.windDirection.onChanged.add(entry.changed);
|
|
128
|
+
if (entry.waves != null) { for (const field of WAVE_FIELDS) { entry.waves[field].onChanged.add(entry.changed); } }
|
|
117
129
|
}
|
|
118
130
|
|
|
119
131
|
unlink(water, geometry, transform, entity) {
|
|
@@ -121,8 +133,7 @@ export class WaterSystem extends System {
|
|
|
121
133
|
if (entry === undefined) { return; }
|
|
122
134
|
const dataset = this.entityManager.dataset;
|
|
123
135
|
water.onChanged.remove(entry.changed);
|
|
124
|
-
entry.waves
|
|
125
|
-
entry.waves?.windDirection.onChanged.remove(entry.changed);
|
|
136
|
+
if (entry.waves != null) { for (const field of WAVE_FIELDS) { entry.waves[field].onChanged.remove(entry.changed); } }
|
|
126
137
|
dataset.removeEntityEventListener(entity, TRANSFORM64_EVENT_CHANGE, entry.world);
|
|
127
138
|
dataset.removeEntityEventListener(entity, TRANSFORM_ATTACHMENT_EVENT_CHANGE, entry.local);
|
|
128
139
|
dataset.removeEntityEventListener(entity, EventType.ComponentAdded, entry.components);
|
|
@@ -132,6 +143,7 @@ export class WaterSystem extends System {
|
|
|
132
143
|
entry.context.rows.release(entity);
|
|
133
144
|
}
|
|
134
145
|
this.#entries.delete(entity); this.#dirty.delete(entry); this.#impulses.delete(entry);
|
|
146
|
+
this.#windy.delete(entry); this.#waves.windy = this.#windy.size > 0;
|
|
135
147
|
this.#renderer.body_count--;
|
|
136
148
|
if (entry.context !== null) { this.#renderer.meshlet_capacity -= entry.geometry.meshlets.count; }
|
|
137
149
|
}
|
|
@@ -144,14 +156,34 @@ export class WaterSystem extends System {
|
|
|
144
156
|
this.#context = context;
|
|
145
157
|
// Device replacement is the only whole-scene rebuild; ordinary frames drain edits.
|
|
146
158
|
for (const entry of this.#entries.values()) {
|
|
147
|
-
entry.context = null; entry.row = -1; entry.wave = -1;
|
|
148
|
-
|
|
159
|
+
entry.context = null; entry.row = -1; entry.wave = -1;
|
|
160
|
+
// a batch the old context never spent goes back to the front of the queue
|
|
161
|
+
const staged = [];
|
|
162
|
+
for (let i = 0; i < entry.staged.impulse_count; i++) { staged.push(...entry.staged.impulses[i]); }
|
|
163
|
+
entry.queue.unshift(...staged); entry.staged.impulse_count = 0;
|
|
149
164
|
this.#dirty.add(entry);
|
|
150
165
|
}
|
|
151
166
|
this.#renderer.meshlet_capacity = 0;
|
|
152
167
|
}
|
|
153
168
|
for (const entry of this.#dirty) { this.#write(entry, context); }
|
|
154
169
|
this.#dirty.clear();
|
|
170
|
+
for (const entry of this.#impulses) { this.#stage(entry, context); }
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/** Top up a body's batch on its surface row from its queue, up to the row's limit. */
|
|
174
|
+
#stage(entry, context) {
|
|
175
|
+
const staged = entry.staged, queue = entry.queue;
|
|
176
|
+
if (entry.wave === -1 || queue.length === 0 || staged.impulse_count === WATER_WAVE_IMPULSE_LIMIT) { return; }
|
|
177
|
+
const taken = Math.min(queue.length / 4, WATER_WAVE_IMPULSE_LIMIT - staged.impulse_count);
|
|
178
|
+
for (let i = 0; i < taken; i++) {
|
|
179
|
+
const impulse = staged.impulses[staged.impulse_count++];
|
|
180
|
+
for (let c = 0; c < 4; c++) { impulse[c] = queue[4 * i + c]; }
|
|
181
|
+
}
|
|
182
|
+
queue.copyWithin(0, 4 * taken);
|
|
183
|
+
queue.length -= 4 * taken;
|
|
184
|
+
this.#waves.splashed = true;
|
|
185
|
+
for (let i = staged.impulse_count; i < WATER_WAVE_IMPULSE_LIMIT; i++) { staged.impulses[i].fill(0); }
|
|
186
|
+
context.scene_database.get('water_waves').set_fields(entry.wave, staged, IMPULSE_WRITER);
|
|
155
187
|
}
|
|
156
188
|
|
|
157
189
|
#write(entry, context) {
|
|
@@ -163,54 +195,54 @@ export class WaterSystem extends System {
|
|
|
163
195
|
entry.context = context;
|
|
164
196
|
this.#renderer.meshlet_capacity += entry.geometry.meshlets.count;
|
|
165
197
|
}
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
entry.wave = waves.add(entry.wave_record);
|
|
174
|
-
}
|
|
175
|
-
const wind = Math.max(0, entry.waves?.windSpeed.getValue() ?? 0);
|
|
176
|
-
const direction = entry.waves?.windDirection.getValue() ?? 0;
|
|
177
|
-
// Patch only authored fields: a full write would restore GPU-consumed impulses/reset flags.
|
|
178
|
-
waves.set_fields(entry.wave, { forcing: [Math.cos(direction), Math.sin(direction), 0.02 * wind * wind, 0.5 * wind],
|
|
179
|
-
unresolved_variance: wind > 0 ? 0.003 + 0.00512 * wind : 0 }, WIND_WRITER);
|
|
180
|
-
if (entry.impulses.length !== 0) {
|
|
181
|
-
entry.staged.push(...entry.impulses.splice(0, WATER_WAVE_IMPULSE_LIMIT - entry.staged.length));
|
|
182
|
-
const impulses = entry.staged.slice();
|
|
183
|
-
const count = impulses.length;
|
|
184
|
-
while (impulses.length < WATER_WAVE_IMPULSE_LIMIT) { impulses.push([0, 0, 0, 0]); }
|
|
185
|
-
waves.set_fields(entry.wave, { impulses, impulse_count: count }, IMPULSE_WRITER);
|
|
186
|
-
}
|
|
198
|
+
const geometry = context.geometries.getAddress(entry.geometry);
|
|
199
|
+
if (entry.wave === -1) {
|
|
200
|
+
entry.wave = waves.add({ wind: [1, 0, 0, WATER_WAVES_SHORE_REFLECTION_DEFAULT], upwind_fetch: 0,
|
|
201
|
+
impulses: Array.from({ length: WATER_WAVE_IMPULSE_LIMIT }, () => [0, 0, 0, 0]), impulse_count: 0,
|
|
202
|
+
node: entry.entity + 1, geometry, simulate_hidden: 0, derived_for: [-1, -1],
|
|
203
|
+
weights: new Array(WATER_SPECTRUM_BAND_COUNT).fill(0), slope_variance: 0,
|
|
204
|
+
wind_from: [0, 0], wind_to: [0, 0], wind_blend: 1, displacement_bounds: [0, 0, 0, 0], particle_levels: 0 });
|
|
187
205
|
}
|
|
206
|
+
const waves_component = entry.waves;
|
|
207
|
+
const speed = Math.max(0, waves_component?.windSpeed.getValue() ?? 0);
|
|
208
|
+
const direction = waves_component?.windDirection.getValue() ?? 0;
|
|
209
|
+
const reflection = Math.min(1, Math.max(0, waves_component?.shoreReflection.getValue() ?? WATER_WAVES_SHORE_REFLECTION_DEFAULT));
|
|
210
|
+
waves.set_fields(entry.wave, { wind: [Math.cos(direction), Math.sin(direction), speed, reflection],
|
|
211
|
+
upwind_fetch: Math.max(0, waves_component?.upwindFetch.getValue() ?? 0), node: entry.entity + 1, geometry,
|
|
212
|
+
simulate_hidden: entry.water.simulateWhenHidden.getValue() ? 1 : 0 }, AUTHORED_WRITER);
|
|
213
|
+
if (speed > 0) { this.#windy.add(entry); } else { this.#windy.delete(entry); }
|
|
214
|
+
this.#waves.windy = this.#windy.size > 0;
|
|
188
215
|
const water = entry.water;
|
|
189
|
-
const record = { geometry
|
|
216
|
+
const record = { geometry, node: entry.entity + 1,
|
|
190
217
|
dirty: 1,
|
|
191
|
-
wave: entry.wave
|
|
218
|
+
wave: entry.wave, ior: Math.max(1, water.ior.getValue()),
|
|
192
219
|
roughness: Math.min(1, Math.max(0, water.roughness.getValue())), medium: water.medium.to_gpu_record(),
|
|
193
220
|
backscattering: [0, 0, 0, 0], extinction: [0, 0, 0, 0], diffuse_transmittance: 0 };
|
|
194
221
|
if (entry.row === -1) { entry.row = bodies.add(record); } else { bodies.set(entry.row, record); }
|
|
195
222
|
}
|
|
196
223
|
|
|
197
|
-
/**
|
|
224
|
+
/**
|
|
225
|
+
* A splash at a world position: rings of wave particles of the given world radius (half their wavelength)
|
|
226
|
+
* whose height is the given vertical velocity kick, m/s, over the time a crest takes to cross them. The
|
|
227
|
+
* position is interpreted in the CPU-owned pose; queued on the CPU and spent on the GPU, sixteen a body a frame.
|
|
228
|
+
*/
|
|
198
229
|
splash(entity, position, radius, strength) {
|
|
199
230
|
const entry = this.#entries.get(entity); assert.defined(entry, 'water entity');
|
|
200
231
|
assert.greaterThan(radius, 0, 'radius'); assert.isFinite(radius, 'radius'); assert.isFinite(strength, 'strength');
|
|
201
232
|
for (let i = 0; i < 3; i++) { assert.isFinite(position[i], `position[${i}]`); }
|
|
202
|
-
const inverse =
|
|
233
|
+
const inverse = SPLASH_INVERSE;
|
|
203
234
|
assert.ok(m4_invert(inverse, entry.transform), 'water transform is singular');
|
|
204
235
|
const x = inverse[0] * position[0] + inverse[4] * position[1] + inverse[8] * position[2] + inverse[12];
|
|
205
236
|
const z = inverse[2] * position[0] + inverse[6] * position[1] + inverse[10] * position[2] + inverse[14];
|
|
206
|
-
entry.
|
|
237
|
+
entry.queue.push(x, z, radius, strength); this.#impulses.add(entry);
|
|
207
238
|
}
|
|
208
239
|
|
|
209
240
|
record_surface(frame) {
|
|
210
|
-
const
|
|
241
|
+
const view = frame.view, scene = view.scene;
|
|
211
242
|
if (scene.scene !== this.#scene) { return; }
|
|
212
|
-
this.#waves.record({ graph: frame.graph, device: this.#graphics.renderer.graphics.device, scene
|
|
213
|
-
|
|
243
|
+
this.#waves.record({ graph: frame.graph, device: this.#graphics.renderer.graphics.device, scene, time: this.#time,
|
|
244
|
+
view: { camera: view.camera.gpu_buffer, projection: view.camera.camera.projection_matrix, height: view.resolution[1] },
|
|
245
|
+
pixels: this.#renderer.settings.tessellation_pixels });
|
|
214
246
|
}
|
|
215
247
|
record(frame) {
|
|
216
248
|
const inspection = this.#renderer.inspect(frame.graph, frame.view, frame.resolution);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PointerDevice.d.ts","sourceRoot":"","sources":["../../../../../src/engine/input/devices/PointerDevice.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PointerDevice.d.ts","sourceRoot":"","sources":["../../../../../src/engine/input/devices/PointerDevice.js"],"names":[],"mappings":"AAgPA;;;;;GAKG;AACH,mDAJW,OAAO,SACP,UAAU,GAAC,KAAK,WAChB,OAAO,QAejB;AAED;;;;;GAKG;AACH;IAyFI;;;;OAIG;IACH,wBAHW,WAAW,EA+BrB;IAtHD;;;;OAIG;IACH,mBAFU,OAAO,CAEQ;IAEzB;;OAEG;IACH;;;QAGI;;;;;;WAMG;;;QAGH;;WAEG;;;;;;;;;MASL;IAeF;;;OAGG;IACH,kBAAkB;IAElB;;;;OAIG;IACH,kBAFU,iBAAiB,EAAE,CAEL;IAExB;;;OAGG;IACH,yCAEC;IAED;;;OAGG;IACH,0CAEC;IAED;;;OAGG;IACH,2CAEC;IA2ID;;;OAGG;IACH,oBAFY,OAAO,CAIlB;IAED;;;OAGG;IACH,4BAsBC;IAED,0BAEC;IAED;;;;OAIG;IACH,qCAHW,OAAO,SACP,UAAU,GAAC,KAAK,QAI1B;IAED,cAiCC;IAED,aA4BC;;CACJ;oBA5lBmB,+BAA+B;mBADhC,uCAAuC;kCAOxB,wBAAwB"}
|
|
@@ -20,6 +20,7 @@ import { suppressContextMenu } from "./mouse/suppressContextMenu.js";
|
|
|
20
20
|
* @param {number} [options.maxDistance] in pixels
|
|
21
21
|
* @param {number} [options.maxDelay] Maximum delay between down and up events in seconds
|
|
22
22
|
* @param {Signal} options.signal
|
|
23
|
+
* @returns {(id?:number)=>void} clears pending candidates without emitting a tap
|
|
23
24
|
*/
|
|
24
25
|
function observeTap({
|
|
25
26
|
up,
|
|
@@ -139,6 +140,16 @@ function observeTap({
|
|
|
139
140
|
}
|
|
140
141
|
|
|
141
142
|
down.add(handleDown);
|
|
143
|
+
|
|
144
|
+
return id => {
|
|
145
|
+
if (id !== undefined) {
|
|
146
|
+
reset(id);
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
active.clear();
|
|
150
|
+
up.remove(handleUp);
|
|
151
|
+
move.remove(handleMove);
|
|
152
|
+
};
|
|
142
153
|
}
|
|
143
154
|
|
|
144
155
|
/**
|
|
@@ -149,6 +160,7 @@ function observeTap({
|
|
|
149
160
|
* @param {Signal} dragStart
|
|
150
161
|
* @param {Signal} dragEnd
|
|
151
162
|
* @param {Signal} drag
|
|
163
|
+
* @returns {()=>void} removes pending gesture observations without emitting a drag end
|
|
152
164
|
*/
|
|
153
165
|
function observeDrag(up, down, move, dragStart, dragEnd, drag) {
|
|
154
166
|
const origin = new Vector2();
|
|
@@ -188,7 +200,8 @@ function observeDrag(up, down, move, dragStart, dragEnd, drag) {
|
|
|
188
200
|
|
|
189
201
|
lastDragPosition.copy(origin);
|
|
190
202
|
dragStart.send2(origin, event);
|
|
191
|
-
|
|
203
|
+
// A start consumer can stop the device and remove this gesture before motion is delivered.
|
|
204
|
+
if (up.contains(handleDragEnd)) handleDrag(position, event);
|
|
192
205
|
}
|
|
193
206
|
|
|
194
207
|
const lastDragPosition = new Vector2();
|
|
@@ -214,6 +227,14 @@ function observeDrag(up, down, move, dragStart, dragEnd, drag) {
|
|
|
214
227
|
}
|
|
215
228
|
|
|
216
229
|
down.add(handleDown);
|
|
230
|
+
|
|
231
|
+
return () => {
|
|
232
|
+
// Overlapping presses can register these owned observations more than once.
|
|
233
|
+
while (up.remove(noDrag)) {}
|
|
234
|
+
while (up.remove(handleDragEnd)) {}
|
|
235
|
+
while (move.remove(handleDragStart)) {}
|
|
236
|
+
while (move.remove(handleDrag)) {}
|
|
237
|
+
};
|
|
217
238
|
}
|
|
218
239
|
|
|
219
240
|
|
|
@@ -245,6 +266,8 @@ export function readPositionFromMouseEvent(result, event, source = event.target)
|
|
|
245
266
|
* @copyright Company Named Limited (c) 2026
|
|
246
267
|
*/
|
|
247
268
|
export class PointerDevice {
|
|
269
|
+
#resetTap;
|
|
270
|
+
#resetDrag;
|
|
248
271
|
|
|
249
272
|
/**
|
|
250
273
|
* Current live position of the pointer
|
|
@@ -355,14 +378,14 @@ export class PointerDevice {
|
|
|
355
378
|
// `globalUp`, not `up`, for the same reason observeDrag below uses it: `up` only fires for
|
|
356
379
|
// a release over the element, so a press that lifted one pixel outside the canvas was
|
|
357
380
|
// never resolved and never reset - the candidate simply sat in the map.
|
|
358
|
-
observeTap({
|
|
381
|
+
this.#resetTap = observeTap({
|
|
359
382
|
up: this.on.globalUp,
|
|
360
383
|
down: this.on.down,
|
|
361
384
|
move: this.on.move,
|
|
362
385
|
maxDistance: 10,
|
|
363
386
|
signal: this.on.tap
|
|
364
387
|
});
|
|
365
|
-
observeDrag(this.on.globalUp, this.on.down, this.on.move, this.on.dragStart, this.on.dragEnd, this.on.drag);
|
|
388
|
+
this.#resetDrag = observeDrag(this.on.globalUp, this.on.down, this.on.move, this.on.dragStart, this.on.dragEnd, this.on.drag);
|
|
366
389
|
|
|
367
390
|
}
|
|
368
391
|
|
|
@@ -424,7 +447,9 @@ export class PointerDevice {
|
|
|
424
447
|
* every button for the same reason. The pointer was the one device of the three that did not,
|
|
425
448
|
* with `PointerEvents.Cancel` sitting unused in the event table as the tell.
|
|
426
449
|
*/
|
|
427
|
-
#releaseAllButtons =
|
|
450
|
+
#releaseAllButtons = event => {
|
|
451
|
+
this.#resetTap(event?.type === PointerEvents.Cancel ? event.pointerId : undefined);
|
|
452
|
+
this.#resetDrag();
|
|
428
453
|
const buttons = this.buttons;
|
|
429
454
|
|
|
430
455
|
for (let i = 0; i < buttons.length; i++) {
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* Picks a random behavior to execute.
|
|
3
3
|
* The selection is done during initialization, and that selected behavior will then run to completion.
|
|
4
4
|
* NOTE: Weights are relative, so they don't need to add up to any specific value.
|
|
5
|
+
* If every weight is zero, no child runs and the selector fails.
|
|
5
6
|
*
|
|
6
7
|
* @example
|
|
7
8
|
* const behavior = WeightedRandomBehavior.from([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WeightedRandomBehavior.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/intelligence/behavior/selector/WeightedRandomBehavior.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"WeightedRandomBehavior.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/intelligence/behavior/selector/WeightedRandomBehavior.js"],"names":[],"mappings":"AAOA;;;;;;;;;;;;;;GAcG;AACH;IAkEI;;;;OAIG;IACH,sBAHW,8BAAyB,EAAE,GACzB,sBAAsB,CAUlC;;IA7ED;;;;OAIG;IACH,mBAAgB;IAEhB;;;;OAIG;IACH,iBAA+B;IAE/B;;;;OAIG;IACH,mBAAuB;IAEvB;;;OAGG;IACH,iBAFW,MAAM,QAIhB;IAED;;;OAGG;IACH,sBAFW,8BAAyB,EAAE,QAcrC;IAED;;;OAGG;IACH,cAFW,8BAAyB,QAanC;IAiBD,iBAiBC;IAsBD,6BAEC;CACJ;yBA9IwB,gBAAgB;gCAET,sBAAsB"}
|
|
@@ -2,12 +2,14 @@ import { assert } from "../../../../core/assert.js";
|
|
|
2
2
|
import { weightedRandomFromArray } from "../../../../core/collection/array/weightedRandomFromArray.js";
|
|
3
3
|
import { seededRandom } from "../../../../core/math/random/seededRandom.js";
|
|
4
4
|
import { Behavior } from "../Behavior.js";
|
|
5
|
+
import { BehaviorStatus } from "../BehaviorStatus.js";
|
|
5
6
|
import { WeightedElement } from "./WeightedElement.js";
|
|
6
7
|
|
|
7
8
|
/**
|
|
8
9
|
* Picks a random behavior to execute.
|
|
9
10
|
* The selection is done during initialization, and that selected behavior will then run to completion.
|
|
10
11
|
* NOTE: Weights are relative, so they don't need to add up to any specific value.
|
|
12
|
+
* If every weight is zero, no child runs and the selector fails.
|
|
11
13
|
*
|
|
12
14
|
* @example
|
|
13
15
|
* const behavior = WeightedRandomBehavior.from([
|
|
@@ -106,6 +108,11 @@ export class WeightedRandomBehavior extends Behavior {
|
|
|
106
108
|
*/
|
|
107
109
|
const weightedElement = weightedRandomFromArray(this.__elements, this.__random, WeightedElement.getWeight);
|
|
108
110
|
|
|
111
|
+
if (weightedElement === undefined) {
|
|
112
|
+
this.__selected = undefined;
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
|
|
109
116
|
const selected = weightedElement.data;
|
|
110
117
|
|
|
111
118
|
assert.equal(selected.isBehavior, true, 'selected.isBehavior !== true');
|
|
@@ -118,18 +125,22 @@ export class WeightedRandomBehavior extends Behavior {
|
|
|
118
125
|
|
|
119
126
|
this.__select();
|
|
120
127
|
|
|
121
|
-
this.__selected
|
|
128
|
+
if (this.__selected !== undefined) {
|
|
129
|
+
this.__selected.initialize(context);
|
|
130
|
+
}
|
|
122
131
|
}
|
|
123
132
|
|
|
124
133
|
finalize() {
|
|
125
134
|
super.finalize();
|
|
126
135
|
|
|
127
|
-
this.__selected
|
|
136
|
+
if (this.__selected !== undefined) {
|
|
137
|
+
this.__selected.finalize();
|
|
138
|
+
}
|
|
128
139
|
|
|
129
140
|
this.__selected = undefined;
|
|
130
141
|
}
|
|
131
142
|
|
|
132
143
|
tick(timeDelta) {
|
|
133
|
-
return this.__selected.tick(timeDelta);
|
|
144
|
+
return this.__selected === undefined ? BehaviorStatus.Failed : this.__selected.tick(timeDelta);
|
|
134
145
|
}
|
|
135
146
|
}
|
|
@@ -66,11 +66,11 @@ export class FluidObstacleSystem extends System<any> {
|
|
|
66
66
|
/**
|
|
67
67
|
* @param {FluidComponent} fluid
|
|
68
68
|
*/
|
|
69
|
-
static "__#
|
|
69
|
+
static "__#429@#refresh_masks"(fluid: FluidComponent): void;
|
|
70
70
|
/**
|
|
71
71
|
* @param {FluidComponent} fluid
|
|
72
72
|
*/
|
|
73
|
-
static "__#
|
|
73
|
+
static "__#429@#clear_field"(fluid: FluidComponent): void;
|
|
74
74
|
/**
|
|
75
75
|
* Mark every cell of `fluid` whose centre lies within `inflation` of the
|
|
76
76
|
* posed shape as solid. Iteration is clipped to the shape's world AABB
|
|
@@ -82,7 +82,7 @@ export class FluidObstacleSystem extends System<any> {
|
|
|
82
82
|
* @param {number} inflation world-units SDF threshold
|
|
83
83
|
* @param {Float64Array} point length-3 scratch
|
|
84
84
|
*/
|
|
85
|
-
static "__#
|
|
85
|
+
static "__#429@#voxelize"(fluid: FluidComponent, posed: PosedShape3D, aabb: Float64Array, inflation: number, point: Float64Array): void;
|
|
86
86
|
/**
|
|
87
87
|
* Write the obstacle's translation velocity onto every face of every cell
|
|
88
88
|
* it voxelized — the moving-wall boundary condition. Runs AFTER the mask
|
|
@@ -102,7 +102,7 @@ export class FluidObstacleSystem extends System<any> {
|
|
|
102
102
|
* @param {number} wvy
|
|
103
103
|
* @param {number} wvz
|
|
104
104
|
*/
|
|
105
|
-
static "__#
|
|
105
|
+
static "__#429@#stamp_wall_velocity"(fluid: FluidComponent, posed: PosedShape3D, aabb: Float64Array, inflation: number, point: Float64Array, wvx: number, wvy: number, wvz: number): void;
|
|
106
106
|
constructor();
|
|
107
107
|
dependencies: (typeof FluidObstacle)[];
|
|
108
108
|
components_used: (ResourceAccessSpecification<typeof Transform64> | ResourceAccessSpecification<typeof RigidBody> | ResourceAccessSpecification<typeof Collider> | ResourceAccessSpecification<typeof FluidComponent> | ResourceAccessSpecification<typeof FluidObstacle>)[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"v3_grid_advect_maccormack_velocity.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/fluid/solver/v3_grid_advect_maccormack_velocity.js"],"names":[],"mappings":"AAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,4DAbW,YAAY,EAAE,WACd,YAAY,EAAE,aACd,YAAY,aACZ,YAAY,aACZ,YAAY,mBACZ,YAAY,EAAE,SAEd,MAAM,SACN,MAAM,SACN,MAAM,cACN,MAAM,SACN,UAAU,
|
|
1
|
+
{"version":3,"file":"v3_grid_advect_maccormack_velocity.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/fluid/solver/v3_grid_advect_maccormack_velocity.js"],"names":[],"mappings":"AAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,4DAbW,YAAY,EAAE,WACd,YAAY,EAAE,aACd,YAAY,aACZ,YAAY,aACZ,YAAY,mBACZ,YAAY,EAAE,SAEd,MAAM,SACN,MAAM,SACN,MAAM,cACN,MAAM,SACN,UAAU,QAuHpB"}
|