@woosh/meep-engine 3.36.0 → 3.38.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/package.json +1 -1
- package/src/engine/ecs/storage/populateEngineSerializationRegistry.d.ts.map +1 -1
- package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +2 -0
- package/src/engine/ecs/transform/TRANSFORM64_EVENT_PLACED.d.ts +11 -0
- package/src/engine/ecs/transform/TRANSFORM64_EVENT_PLACED.d.ts.map +1 -0
- package/src/engine/ecs/transform/TRANSFORM64_EVENT_PLACED.js +10 -0
- package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.d.ts.map +1 -1
- package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.js +16 -0
- package/src/engine/graphics/ecs/water/Water.d.ts +30 -0
- package/src/engine/graphics/ecs/water/Water.d.ts.map +1 -1
- package/src/engine/graphics/ecs/water/Water.js +125 -104
- package/src/engine/graphics/ecs/water/WaterSerializationAdapter.d.ts.map +1 -1
- package/src/engine/graphics/ecs/water/WaterSerializationAdapter.js +13 -1
- package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_1_2.d.ts +6 -0
- package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_1_2.d.ts.map +1 -0
- package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_1_2.js +18 -0
- package/src/engine/graphics3/WaterSystem.d.ts +22 -6
- package/src/engine/graphics3/WaterSystem.d.ts.map +1 -1
- package/src/engine/graphics3/WaterSystem.js +314 -293
- package/src/engine/input/devices/XRInputDevice.d.ts +51 -23
- package/src/engine/input/devices/XRInputDevice.d.ts.map +1 -1
- package/src/engine/input/devices/XRInputDevice.js +145 -52
- package/src/engine/input/devices/xr/XRGamepadMapping.d.ts +14 -0
- package/src/engine/input/devices/xr/XRGamepadMapping.d.ts.map +1 -0
- package/src/engine/input/devices/xr/XRGamepadMapping.js +9 -0
- package/src/engine/input/devices/xr/XRHandedness.d.ts +15 -0
- package/src/engine/input/devices/xr/XRHandedness.d.ts.map +1 -0
- package/src/engine/input/devices/xr/XRHandedness.js +10 -0
- package/src/engine/input/devices/xr/XRInputAction.d.ts +24 -11
- package/src/engine/input/devices/xr/XRInputAction.d.ts.map +1 -1
- package/src/engine/input/devices/xr/XRInputAction.js +55 -24
- package/src/engine/input/devices/xr/XRInputButton.d.ts +7 -9
- package/src/engine/input/devices/xr/XRInputButton.d.ts.map +1 -1
- package/src/engine/input/devices/xr/XRInputButton.js +18 -8
- package/src/engine/input/devices/xr/XRInputCoordinates.d.ts +11 -3
- package/src/engine/input/devices/xr/XRInputCoordinates.d.ts.map +1 -1
- package/src/engine/input/devices/xr/XRInputCoordinates.js +17 -3
- package/src/engine/input/devices/xr/XRInputHandle.d.ts +41 -11
- package/src/engine/input/devices/xr/XRInputHandle.d.ts.map +1 -1
- package/src/engine/input/devices/xr/XRInputHandle.js +129 -32
- package/src/engine/input/devices/xr/XRInputPose.d.ts +41 -5
- package/src/engine/input/devices/xr/XRInputPose.d.ts.map +1 -1
- package/src/engine/input/devices/xr/XRInputPose.js +57 -16
- package/src/engine/input/devices/xr/XRInputTypes.d.ts +18 -18
- package/src/engine/input/devices/xr/XRInputTypes.js +3 -3
- package/src/engine/input/devices/xr/XRTargetRayMode.d.ts +17 -0
- package/src/engine/input/devices/xr/XRTargetRayMode.d.ts.map +1 -0
- package/src/engine/input/devices/xr/XRTargetRayMode.js +12 -0
- package/src/engine/input/devices/xr/XRVisibilityState.d.ts +15 -0
- package/src/engine/input/devices/xr/XRVisibilityState.d.ts.map +1 -0
- package/src/engine/input/devices/xr/XRVisibilityState.js +10 -0
- package/src/engine/input/ecs/ism/coordinate/InputCoordinateDevice.d.ts +3 -1
- package/src/engine/input/ecs/ism/coordinate/InputCoordinateDevice.d.ts.map +1 -1
- package/src/engine/input/ecs/ism/coordinate/InputCoordinateDevice.js +5 -1
- package/src/engine/input/ecs/ism/device/XRInputDeviceAdapter.d.ts +19 -5
- package/src/engine/input/ecs/ism/device/XRInputDeviceAdapter.d.ts.map +1 -1
- package/src/engine/input/ecs/ism/device/XRInputDeviceAdapter.js +42 -9
- package/src/engine/input/ecs/ism/device/XR_INPUT_DEVICE_IDS.d.ts +8 -2
- package/src/engine/input/ecs/ism/device/XR_INPUT_DEVICE_IDS.d.ts.map +1 -1
- package/src/engine/input/ecs/ism/device/XR_INPUT_DEVICE_IDS.js +19 -9
- package/src/engine/input/ecs/ism/trigger/InputTriggerXRButton.d.ts +10 -2
- package/src/engine/input/ecs/ism/trigger/InputTriggerXRButton.d.ts.map +1 -1
- package/src/engine/input/ecs/ism/trigger/InputTriggerXRButton.js +12 -2
- package/src/engine/physics/cloth/collider/ClothColliderIndex.d.ts +13 -14
- package/src/engine/physics/cloth/collider/ClothColliderIndex.d.ts.map +1 -1
- package/src/engine/physics/cloth/collider/ClothColliderIndex.js +137 -36
- package/src/engine/physics/cloth/collider/cloth_collider_bounds.d.ts +30 -0
- package/src/engine/physics/cloth/collider/cloth_collider_bounds.d.ts.map +1 -1
- package/src/engine/physics/cloth/collider/cloth_collider_bounds.js +33 -0
- package/src/engine/physics/cloth/ecs/ClothColliderFlags.js +2 -1
- package/src/engine/physics/cloth/ecs/ClothColliderSystem.d.ts +10 -1
- package/src/engine/physics/cloth/ecs/ClothColliderSystem.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothColliderSystem.js +36 -14
- package/src/engine/physics/cloth/ecs/ClothInstance.d.ts +15 -2
- package/src/engine/physics/cloth/ecs/ClothInstance.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothInstance.js +17 -2
- package/src/engine/physics/cloth/ecs/ClothWorld.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothWorld.js +19 -6
- package/src/engine/physics/cloth/ecs/cloth_gather_colliders.d.ts +18 -20
- package/src/engine/physics/cloth/ecs/cloth_gather_colliders.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_gather_colliders.js +139 -89
- package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
- package/src/engine/physics/ecs/PhysicsSystem.js +32 -16
- package/src/shade/playground/water_refraction/README.md +149 -0
- package/src/shade/playground/water_refraction/index.html +42 -0
- package/src/shade/playground/water_refraction/main.d.ts +2 -0
- package/src/shade/playground/water_refraction/main.d.ts.map +1 -0
- package/src/shade/playground/water_refraction/main.js +201 -0
- package/src/shade/playground/water_refraction/world.d.ts +37 -0
- package/src/shade/playground/water_refraction/world.d.ts.map +1 -0
- package/src/shade/playground/water_refraction/world.js +137 -0
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +4 -0
- package/src/shade/renderer/animation/chunk_pose_accumulator.d.ts +2 -3
- package/src/shade/renderer/animation/chunk_pose_accumulator.d.ts.map +1 -1
- package/src/shade/renderer/animation/chunk_pose_accumulator.js +14 -24
- package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.js +16 -15
- package/src/shade/renderer/deferred/indirect/chunk_lpv_sample_light.js +1 -1
- package/src/shade/renderer/gpu_primitive/bvh/GPU_BVH_BUILD_PLAN.md +1123 -1122
- package/src/shade/renderer/gpu_primitive/bvh/PHASE1_HANDOVER.md +202 -201
- package/src/shade/renderer/light/environment/chunk_roughness_to_mip_ratio.d.ts +8 -0
- package/src/shade/renderer/light/environment/chunk_roughness_to_mip_ratio.d.ts.map +1 -0
- package/src/shade/renderer/light/environment/chunk_roughness_to_mip_ratio.js +24 -0
- package/src/shade/renderer/light/environment/chunk_sphere_probe_roughness_to_lod.d.ts +0 -6
- package/src/shade/renderer/light/environment/chunk_sphere_probe_roughness_to_lod.d.ts.map +1 -1
- package/src/shade/renderer/light/environment/chunk_sphere_probe_roughness_to_lod.js +2 -25
- package/src/shade/renderer/light/environment/shader_project_environment_sh.d.ts +2 -2
- package/src/shade/renderer/light/environment/shader_project_environment_sh.d.ts.map +1 -1
- package/src/shade/renderer/light/environment/shader_project_environment_sh.js +50 -19
- package/src/shade/renderer/particles/DESIGN.md +1 -1
- package/src/shade/renderer/particles/bounds/chunk_particle_bounds.d.ts +1 -1
- package/src/shade/renderer/particles/bounds/chunk_particle_bounds.d.ts.map +1 -1
- package/src/shade/renderer/particles/bounds/chunk_particle_bounds.js +10 -9
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts +17 -0
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.js +7 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_renormalization.d.ts +4 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_renormalization.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_renormalization.js +11 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_rgb_contribution.d.ts +4 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_rgb_contribution.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_rgb_contribution.js +19 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_splat_slice.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_splat_slice.js +5 -3
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_split_counts.d.ts +4 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_split_counts.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_split_counts.js +8 -0
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts +1 -1
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +21 -2
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_resolve.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_resolve.js +4 -8
- package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.d.ts.map +1 -1
- package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.js +10 -8
- package/src/shade/renderer/shader/chunk/atomic/chunk_atomic_add_f32_storage.d.ts +12 -0
- package/src/shade/renderer/shader/chunk/atomic/chunk_atomic_add_f32_storage.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/atomic/chunk_atomic_add_f32_storage.js +25 -0
- package/src/shade/renderer/shader/chunk/atomic/chunk_atomic_max_f32_storage.d.ts +12 -0
- package/src/shade/renderer/shader/chunk/atomic/chunk_atomic_max_f32_storage.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/atomic/chunk_atomic_max_f32_storage.js +28 -0
- package/src/shade/renderer/shader/chunk/atomic/chunk_atomic_min_f32_storage.d.ts +12 -0
- package/src/shade/renderer/shader/chunk/atomic/chunk_atomic_min_f32_storage.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/atomic/chunk_atomic_min_f32_storage.js +28 -0
- package/src/shade/renderer/shader/chunk/geometry/plane/{plane_ray_raycast.d.ts → chunk_plane_ray_raycast.d.ts} +2 -2
- package/src/shade/renderer/shader/chunk/geometry/plane/chunk_plane_ray_raycast.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/geometry/plane/{plane_ray_raycast.js → chunk_plane_ray_raycast.js} +1 -1
- package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_space_newton_ray.d.ts +4 -0
- package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_space_newton_ray.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_space_newton_ray.js +101 -0
- package/src/shade/renderer/shadow/map/csm/shader/shader_csm_caster_range.js +3 -3
- package/src/shade/renderer/water/GPUWaterRenderer.d.ts +62 -29
- package/src/shade/renderer/water/GPUWaterRenderer.d.ts.map +1 -1
- package/src/shade/renderer/water/GPUWaterRenderer.js +235 -147
- package/src/shade/renderer/water/chunk_water_transport.d.ts +5 -0
- package/src/shade/renderer/water/chunk_water_transport.d.ts.map +1 -0
- package/src/shade/renderer/water/chunk_water_transport.js +94 -0
- package/src/shade/renderer/water/shader_water.d.ts +9 -26
- package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
- package/src/shade/renderer/water/shader_water.js +384 -246
- package/src/shade/renderer/water/shader_water_avboit.d.ts +12 -0
- package/src/shade/renderer/water/shader_water_avboit.d.ts.map +1 -0
- package/src/shade/renderer/water/shader_water_avboit.js +258 -0
- package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
- package/src/shade/wgsl/emulator/WGSLLanguageCore.js +13 -0
- package/src/shade/renderer/animation/skinning/bounds_refresh/chunk_aabb_atomic_f32.d.ts +0 -29
- package/src/shade/renderer/animation/skinning/bounds_refresh/chunk_aabb_atomic_f32.d.ts.map +0 -1
- package/src/shade/renderer/animation/skinning/bounds_refresh/chunk_aabb_atomic_f32.js +0 -59
- package/src/shade/renderer/shader/chunk/geometry/plane/plane_ray_raycast.d.ts.map +0 -1
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { chunk_water_refraction_confidence } from "./chunk_water_transport.js";
|
|
2
|
+
export const shader_water_occupancy: ComputeShader;
|
|
3
|
+
export const shader_water_splat: ComputeShader;
|
|
4
|
+
export const shader_water_draw: ImageShader;
|
|
5
|
+
export const shader_water_confidence_seed: ImageShader;
|
|
6
|
+
export const shader_water_confidence_x: ImageShader;
|
|
7
|
+
export const shader_water_confidence_y: ImageShader;
|
|
8
|
+
export const shader_water_background_copy: ImageShader;
|
|
9
|
+
export const shader_water_debug: ImageShader;
|
|
10
|
+
import { ComputeShader } from "../shader/ComputeShader.js";
|
|
11
|
+
import { ImageShader } from "../shader/ImageShader.js";
|
|
12
|
+
//# sourceMappingURL=shader_water_avboit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shader_water_avboit.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/water/shader_water_avboit.js"],"names":[],"mappings":";AAiCA,mDAwBG;AAQH,+CAqCG;AAUH,4CAwBG;AAQH,uDAuBG;AAyBH,oDAA2E;AAC3E,oDAA0E;AAM1E,uDAYG;AAOH,6CAuCG;8BAlP2B,4BAA4B;4BAC9B,0BAA0B"}
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
import { CAMERA_UNIFORM_STRUCT } from "../camera/CAMERA_UNIFORM_STRUCT.js";
|
|
2
|
+
import { chunk_sample_volumetrics } from "../deferred/chunk_sample_volumetrics.js";
|
|
3
|
+
import { AVBOIT_OCCUPANCY_WORDS, AVBOIT_VOXEL_DOWNSCALE } from "../rasterize/native/avboit/AVBOIT_CONSTANTS.js";
|
|
4
|
+
import { AVBOIT_WARP_STRUCT } from "../rasterize/native/avboit/AVBOIT_WARP_STRUCT.js";
|
|
5
|
+
import { AVBOIT_DRAW_TARGETS } from "../rasterize/native/avboit/avboit_draw_fragment_body.js";
|
|
6
|
+
import { chunk_avboit_occupancy_mark } from "../rasterize/native/avboit/chunk_avboit_occupancy_mark.js";
|
|
7
|
+
import { chunk_avboit_rgb_contribution } from "../rasterize/native/avboit/chunk_avboit_rgb_contribution.js";
|
|
8
|
+
import { chunk_avboit_sample_transmittance } from "../rasterize/native/avboit/chunk_avboit_sample_transmittance.js";
|
|
9
|
+
import { chunk_avboit_splat_slice } from "../rasterize/native/avboit/chunk_avboit_splat_slice.js";
|
|
10
|
+
import { chunk_avboit_split_counts } from "../rasterize/native/avboit/chunk_avboit_split_counts.js";
|
|
11
|
+
import { chunk_avboit_transmittance_to_extinction } from "../rasterize/native/avboit/chunk_avboit_transmittance_to_extinction.js";
|
|
12
|
+
import { chunk_avboit_view_depth_to_physical } from "../rasterize/native/avboit/chunk_avboit_view_depth_to_physical.js";
|
|
13
|
+
import { AVBOIT_OCCUPANCY_SETTINGS_STRUCT } from "../rasterize/native/avboit/shader_avboit_occupancy.js";
|
|
14
|
+
import { chunk_get_view_space_depth } from "../shader/chunk/depth/chunk_get_view_space_depth.js";
|
|
15
|
+
import { CodeChunk } from "../shader/compiler/CodeChunk.js";
|
|
16
|
+
import { ComputeShader } from "../shader/ComputeShader.js";
|
|
17
|
+
import { ImageShader } from "../shader/ImageShader.js";
|
|
18
|
+
import { ShaderResourceSetDescriptor } from "../shader/resource/ShaderResourceSetDescriptor.js";
|
|
19
|
+
import { ShaderDescriptor } from "../shader/ShaderDescriptor.js";
|
|
20
|
+
import { atomic_u32, u32, vec2f } from "../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
|
|
21
|
+
import { WebGPUArray } from "../shader/type/WebGPUArray.js";
|
|
22
|
+
import { WebGPUStruct } from "../shader/type/WebGPUStruct.js";
|
|
23
|
+
import { SAMPLER_LINEAR_UPSCALE } from "../texture/SAMPLER_LINEAR_UPSCALE.js";
|
|
24
|
+
import { VIEW_UNIFORM_STRUCT } from "../view/VIEW_UNIFORM_STRUCT.js";
|
|
25
|
+
import { VOLUMETRICS_METADATA_STRUCT } from "../volumetrics/VOLUMETRICS_METADATA_STRUCT.js";
|
|
26
|
+
import { DepthStencilState } from '../../descriptor/pipeline/render/DepthStencilState.js';
|
|
27
|
+
export { chunk_water_refraction_confidence } from './chunk_water_transport.js';
|
|
28
|
+
|
|
29
|
+
const occupancy_resources = new ShaderResourceSetDescriptor();
|
|
30
|
+
occupancy_resources.createGroup().addUniform("camera", CAMERA_UNIFORM_STRUCT)
|
|
31
|
+
.addUniform("settings", AVBOIT_OCCUPANCY_SETTINGS_STRUCT)
|
|
32
|
+
.addTexture("interface_depth").addStorageBuffer("occupancy", WebGPUArray.from(atomic_u32, AVBOIT_OCCUPANCY_WORDS), true);
|
|
33
|
+
|
|
34
|
+
export const shader_water_occupancy = ComputeShader.from({
|
|
35
|
+
label: "Water / AVBOIT occupancy", resources: occupancy_resources,
|
|
36
|
+
body: CodeChunk.from(/* language=WGSL */ `
|
|
37
|
+
var<workgroup> depth_min: atomic<u32>;
|
|
38
|
+
var<workgroup> depth_max: atomic<u32>;
|
|
39
|
+
@compute @workgroup_size(8, 8)
|
|
40
|
+
fn main(@builtin(global_invocation_id) id: vec3u, @builtin(local_invocation_index) index: u32) {
|
|
41
|
+
if (index == 0u) { atomicStore(&depth_min, bitcast<u32>(1e30)); atomicStore(&depth_max, 0u); }
|
|
42
|
+
workgroupBarrier();
|
|
43
|
+
let size = textureDimensions(interface_depth, 0);
|
|
44
|
+
if (all(id.xy < size)) {
|
|
45
|
+
let d = textureLoad(interface_depth, id.xy, 0).r;
|
|
46
|
+
if (d > 0.0) {
|
|
47
|
+
let z = clamp(get_view_space_depth(d, camera), camera.clip_near_far.x, camera.clip_near_far.y);
|
|
48
|
+
atomicMin(&depth_min, bitcast<u32>(z)); atomicMax(&depth_max, bitcast<u32>(z));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
workgroupBarrier();
|
|
52
|
+
if (index == 0u && atomicLoad(&depth_max) != 0u) {
|
|
53
|
+
avboit_occupancy_mark(bitcast<f32>(atomicLoad(&depth_min)), bitcast<f32>(atomicLoad(&depth_max)),
|
|
54
|
+
camera.clip_near_far.x, settings.cluster_parameters);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
`, [chunk_get_view_space_depth, chunk_avboit_occupancy_mark]),
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
const splat_resources = new ShaderResourceSetDescriptor();
|
|
61
|
+
splat_resources.createGroup().addUniform("camera", CAMERA_UNIFORM_STRUCT)
|
|
62
|
+
.addStorageBuffer("warp", AVBOIT_WARP_STRUCT).addTexture("interface_depth").addTexture("transmission")
|
|
63
|
+
.addStorageBuffer("extinction_volume", WebGPUArray.from(atomic_u32), true)
|
|
64
|
+
.addStorageBuffer("overflow_slice", WebGPUArray.from(atomic_u32), true);
|
|
65
|
+
|
|
66
|
+
export const shader_water_splat = ComputeShader.from({
|
|
67
|
+
label: "Water / AVBOIT splat", resources: splat_resources,
|
|
68
|
+
body: CodeChunk.from(/* language=WGSL */ `
|
|
69
|
+
@compute @workgroup_size(8, 8)
|
|
70
|
+
fn main(@builtin(global_invocation_id) id: vec3u) {
|
|
71
|
+
if (id.x >= warp.voxel_width || id.y >= warp.voxel_height) { return; }
|
|
72
|
+
let size = textureDimensions(interface_depth, 0);
|
|
73
|
+
let lo = id.xy * ${AVBOIT_VOXEL_DOWNSCALE}u;
|
|
74
|
+
let hi = min(lo + vec2u(${AVBOIT_VOXEL_DOWNSCALE}u), size);
|
|
75
|
+
var total_t = vec3f(0.0);
|
|
76
|
+
var samples = 0.0;
|
|
77
|
+
var nearest = 1e30;
|
|
78
|
+
for (var y = lo.y; y < hi.y; y++) {
|
|
79
|
+
for (var x = lo.x; x < hi.x; x++) {
|
|
80
|
+
let coord = vec2u(x, y);
|
|
81
|
+
let d = textureLoad(interface_depth, coord, 0).r;
|
|
82
|
+
var t = vec3f(1.0);
|
|
83
|
+
if (d > 0.0) {
|
|
84
|
+
t = textureLoad(transmission, coord, 0).rgb;
|
|
85
|
+
nearest = min(nearest, get_view_space_depth(d, camera));
|
|
86
|
+
}
|
|
87
|
+
total_t += t; samples += 1.0;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (nearest == 1e30 || samples == 0.0) { return; }
|
|
91
|
+
// One area-averaged event, not 64 full-coverage layers. Dry samples retain T=1.
|
|
92
|
+
let extinction = avboit_transmittance_to_extinction(total_t / samples);
|
|
93
|
+
let counts = avboit_extinction_to_counts(extinction);
|
|
94
|
+
let p = avboit_view_depth_to_physical(&warp, nearest) - 0.5;
|
|
95
|
+
let slice = i32(floor(p));
|
|
96
|
+
let upper = avboit_split_counts(counts, fract(p));
|
|
97
|
+
let column = (id.y * warp.voxel_width + id.x) * warp.physical_count;
|
|
98
|
+
avboit_splat_counts(column, slice, counts - upper, id.xy);
|
|
99
|
+
avboit_splat_counts(column, slice + 1, upper, id.xy);
|
|
100
|
+
}
|
|
101
|
+
`, [chunk_get_view_space_depth, chunk_avboit_splat_slice, chunk_avboit_split_counts,
|
|
102
|
+
chunk_avboit_transmittance_to_extinction, chunk_avboit_view_depth_to_physical]),
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
const draw_resources = new ShaderResourceSetDescriptor();
|
|
106
|
+
draw_resources.createGroup().addUniform("camera", CAMERA_UNIFORM_STRUCT).addUniform("view", VIEW_UNIFORM_STRUCT)
|
|
107
|
+
.addStorageBuffer("warp", AVBOIT_WARP_STRUCT).addTexture("interface_depth")
|
|
108
|
+
.addTexture("transmission").addTexture("radiance")
|
|
109
|
+
.addTexture("tIntegral", "float", "3d").addSampler("sLinear", "filtering", SAMPLER_LINEAR_UPSCALE)
|
|
110
|
+
.addUniform("volumetrics_metadata", VOLUMETRICS_METADATA_STRUCT)
|
|
111
|
+
.addTexture("tVolumetrics", "float", "3d").addTexture("tSTBN_vec3", "float", "3d");
|
|
112
|
+
|
|
113
|
+
export const shader_water_draw = ImageShader.from({
|
|
114
|
+
descriptor: ShaderDescriptor.from({ label: "Water / AVBOIT draw", resources: draw_resources,
|
|
115
|
+
body: CodeChunk.from(/* language=WGSL */ `
|
|
116
|
+
struct WaterContribution {
|
|
117
|
+
@location(0) color: vec4f, @location(1) norm: vec4f,
|
|
118
|
+
@location(2) extinction: vec4f, @location(3) emission: vec4f,
|
|
119
|
+
}
|
|
120
|
+
@fragment
|
|
121
|
+
fn main(@builtin(position) coord: vec4f) -> WaterContribution {
|
|
122
|
+
let pixel = vec2u(coord.xy);
|
|
123
|
+
let d = textureLoad(interface_depth, pixel, 0).r;
|
|
124
|
+
if (d <= 0.0) { discard; }
|
|
125
|
+
let z = get_view_space_depth(d, camera);
|
|
126
|
+
let uv = coord.xy / vec2f(textureDimensions(interface_depth, 0));
|
|
127
|
+
let front = avboit_sample_transmittance(&warp, tIntegral, sLinear, uv, z);
|
|
128
|
+
let t = textureLoad(transmission, pixel, 0).rgb;
|
|
129
|
+
let w = textureLoad(radiance, pixel, 0).rgb;
|
|
130
|
+
let fog = sample_volumetrics(z, uv, coord.xy);
|
|
131
|
+
let c = avboit_rgb_contribution(w, t, front, fog);
|
|
132
|
+
return WaterContribution(c.color, c.norm, c.extinction, c.emission);
|
|
133
|
+
}
|
|
134
|
+
`, [chunk_get_view_space_depth, chunk_avboit_sample_transmittance,
|
|
135
|
+
chunk_avboit_rgb_contribution, chunk_sample_volumetrics]),
|
|
136
|
+
}), targets: AVBOIT_DRAW_TARGETS,
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
// A depth buffer cannot reveal the receiver hidden behind an emergent object.
|
|
140
|
+
// Fade displacement around those disocclusions instead of exposing a hard control-UV hole.
|
|
141
|
+
// Quarter-resolution conservative seeds and a separable bounded distance transform keep
|
|
142
|
+
// this independent of scene size and avoid a full-resolution neighbourhood search.
|
|
143
|
+
const confidence_seed_resources = new ShaderResourceSetDescriptor();
|
|
144
|
+
confidence_seed_resources.createGroup().addTexture("trace_metadata").addTexture("scene_depth");
|
|
145
|
+
export const shader_water_confidence_seed = ImageShader.from({
|
|
146
|
+
descriptor: ShaderDescriptor.from({ label: "Water / visibility seeds", resources: confidence_seed_resources,
|
|
147
|
+
body: CodeChunk.from(/* language=WGSL */ `
|
|
148
|
+
@fragment
|
|
149
|
+
fn main(@builtin(position) coord: vec4f) -> @location(0) vec4f {
|
|
150
|
+
let tile = vec2u(coord.xy) * 4u;
|
|
151
|
+
let size = textureDimensions(trace_metadata, 0);
|
|
152
|
+
var distance = 16.0;
|
|
153
|
+
for (var y = 0u; y < 4u; y++) {
|
|
154
|
+
for (var x = 0u; x < 4u; x++) {
|
|
155
|
+
let pixel = tile + vec2u(x, y);
|
|
156
|
+
if (all(pixel < size)) {
|
|
157
|
+
let t = textureLoad(trace_metadata, pixel, 0);
|
|
158
|
+
// Only actual geometry/sky boundaries seed the spatial fade. Trace budget
|
|
159
|
+
// or numerical failures must not create moving 64-pixel holes around themselves.
|
|
160
|
+
if (t.b <= 0.0 || textureLoad(scene_depth, pixel, 0).r == 0.0) { distance = 0.0; }
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return vec4f(distance, 0.0, 0.0, 1.0);
|
|
165
|
+
}
|
|
166
|
+
`),
|
|
167
|
+
}), targets: [{ format: "r16float" }],
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
function confidence_distance_shader(vertical) {
|
|
171
|
+
const resources = new ShaderResourceSetDescriptor();
|
|
172
|
+
resources.createGroup().addTexture("distance_field");
|
|
173
|
+
return ImageShader.from({ descriptor: ShaderDescriptor.from({
|
|
174
|
+
label: vertical ? "Water / visibility distance Y" : "Water / visibility distance X", resources,
|
|
175
|
+
body: CodeChunk.from(/* language=WGSL */ `
|
|
176
|
+
@fragment
|
|
177
|
+
fn main(@builtin(position) coord: vec4f) -> @location(0) vec4f {
|
|
178
|
+
let pixel = vec2i(coord.xy);
|
|
179
|
+
let size = vec2i(textureDimensions(distance_field, 0));
|
|
180
|
+
var distance = 16.0;
|
|
181
|
+
for (var offset = -16; offset <= 16; offset++) {
|
|
182
|
+
let sample = pixel + ${vertical ? "vec2i(0, offset)" : "vec2i(offset, 0)"};
|
|
183
|
+
if (all(sample >= vec2i(0)) && all(sample < size)) {
|
|
184
|
+
let d = textureLoad(distance_field, sample, 0).r;
|
|
185
|
+
distance = min(distance, ${vertical ? "length(vec2f(d, f32(offset)))" : "d + abs(f32(offset))"});
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return vec4f(distance, 0.0, 0.0, 1.0);
|
|
189
|
+
}
|
|
190
|
+
`),
|
|
191
|
+
}), targets: [{ format: "r16float" }] });
|
|
192
|
+
}
|
|
193
|
+
export const shader_water_confidence_x = confidence_distance_shader(false);
|
|
194
|
+
export const shader_water_confidence_y = confidence_distance_shader(true);
|
|
195
|
+
|
|
196
|
+
// Initialize all three final targets in the same render pass as water shading.
|
|
197
|
+
// This samples opaque HDR and needs no COPY_SRC usage or renderer changes.
|
|
198
|
+
const background_resources = new ShaderResourceSetDescriptor();
|
|
199
|
+
background_resources.createGroup().addTexture('tScene');
|
|
200
|
+
export const shader_water_background_copy = ImageShader.from({
|
|
201
|
+
descriptor: ShaderDescriptor.from({label: 'Water / background initialization', resources: background_resources,
|
|
202
|
+
body: CodeChunk.from(/* language=WGSL */ `
|
|
203
|
+
struct WaterBackground {
|
|
204
|
+
@location(0) transmission: vec4f, @location(1) radiance: vec4f, @location(2) background: vec4f,
|
|
205
|
+
}
|
|
206
|
+
@fragment
|
|
207
|
+
fn main(@builtin(position) coord: vec4f) -> WaterBackground {
|
|
208
|
+
return WaterBackground(vec4f(1.0,1.0,1.0,0.0), vec4f(0.0), textureLoad(tScene, vec2i(coord.xy), 0));
|
|
209
|
+
}
|
|
210
|
+
`)}), targets: [{format:'rgba32float'}, {format:'rgba16float'}, {format:'rgba16float'}],
|
|
211
|
+
depthStencil: DepthStencilState.from({format:'depth32float', depthWriteEnabled:false, depthCompare:'always'}),
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
const debug_resources = new ShaderResourceSetDescriptor();
|
|
215
|
+
debug_resources.createGroup().addUniform("inspection", WebGPUStruct.from({ mode: u32, resolution: vec2f }, "WaterInspection").pack())
|
|
216
|
+
.addUniform("camera", CAMERA_UNIFORM_STRUCT).addStorageBuffer("warp", AVBOIT_WARP_STRUCT)
|
|
217
|
+
.addTexture("tIntegral", "float", "3d").addSampler("sLinear", "filtering", SAMPLER_LINEAR_UPSCALE).addTexture("transmission")
|
|
218
|
+
.addTexture("radiance").addTexture("receiver").addTexture("interface_depth").addTexture("trace_metadata");
|
|
219
|
+
export const shader_water_debug = ImageShader.from({
|
|
220
|
+
descriptor: ShaderDescriptor.from({ label: "Water / inspection", resources: debug_resources,
|
|
221
|
+
body: CodeChunk.from(/* language=WGSL */ `
|
|
222
|
+
@fragment
|
|
223
|
+
fn main(@builtin(position) coord: vec4f) -> @location(0) vec4f {
|
|
224
|
+
let uv = coord.xy / inspection.resolution;
|
|
225
|
+
let pixel = min(vec2u(uv*vec2f(textureDimensions(transmission,0))), textureDimensions(transmission,0)-1u);
|
|
226
|
+
let t = textureLoad(transmission, pixel, 0);
|
|
227
|
+
let r = textureLoad(receiver, pixel, 0);
|
|
228
|
+
if (t.a <= 0.0) { return vec4f(0.025, 0.025, 0.025, 1.0); }
|
|
229
|
+
var color = t.rgb;
|
|
230
|
+
switch (inspection.mode) {
|
|
231
|
+
case 1u: { color = vec3f(t.a); }
|
|
232
|
+
case 2u: { color = vec3f(r.xy, 0.0); }
|
|
233
|
+
case 3u: { color = vec3f(r.z / (r.z + 10.0)); }
|
|
234
|
+
case 4u: {
|
|
235
|
+
let code = u32(floor(r.w));
|
|
236
|
+
var palette = array<vec3f,5>(vec3f(0.1,0.9,0.1),vec3f(0.1,0.7,1.0),
|
|
237
|
+
vec3f(0.4,0.2,0.8),vec3f(0.8,0.3,0.1),vec3f(0.9,0.1,0.6));
|
|
238
|
+
color = palette[min(code / 8u, 4u)];
|
|
239
|
+
if (code == 31u) { color = palette[4]; }
|
|
240
|
+
color.r = max(color.r, fract(r.w) * 2.0);
|
|
241
|
+
}
|
|
242
|
+
case 5u: { color = textureLoad(radiance, pixel, 0).rgb; }
|
|
243
|
+
case 6u: { color = vec3f(min(textureLoad(trace_metadata, pixel, 0).g, 1.0)); }
|
|
244
|
+
case 10u: {
|
|
245
|
+
color = vec3f(textureLoad(radiance, pixel, 0).a);
|
|
246
|
+
}
|
|
247
|
+
case 8u, 9u: {
|
|
248
|
+
let z = get_view_space_depth(textureLoad(interface_depth, pixel, 0).r, camera);
|
|
249
|
+
let front = avboit_sample_transmittance(&warp, tIntegral, sLinear, uv, z);
|
|
250
|
+
color = select(front, (1.0 - t.rgb) * front, inspection.mode == 9u);
|
|
251
|
+
}
|
|
252
|
+
default: {}
|
|
253
|
+
}
|
|
254
|
+
return vec4f(color, 1.0);
|
|
255
|
+
}
|
|
256
|
+
`, [chunk_get_view_space_depth, chunk_avboit_sample_transmittance]),
|
|
257
|
+
}), targets: [{ format: "rgba16float" }],
|
|
258
|
+
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WGSLLanguageCore.d.ts","sourceRoot":"","sources":["../../../../../src/shade/wgsl/emulator/WGSLLanguageCore.js"],"names":[],"mappings":"AAkRA;;;;;;;;;;;;GAYG;AACH,+BAFU,MAAM,
|
|
1
|
+
{"version":3,"file":"WGSLLanguageCore.d.ts","sourceRoot":"","sources":["../../../../../src/shade/wgsl/emulator/WGSLLanguageCore.js"],"names":[],"mappings":"AAkRA;;;;;;;;;;;;GAYG;AACH,+BAFU,MAAM,CAqqCd"}
|
|
@@ -767,6 +767,16 @@ export const WGSLLanguageCore = {
|
|
|
767
767
|
return out;
|
|
768
768
|
},
|
|
769
769
|
|
|
770
|
+
refract(i, n, eta) {
|
|
771
|
+
const d = WGSLLanguageCore.dot(n, i);
|
|
772
|
+
const k = 1 - eta * eta * (1 - d * d);
|
|
773
|
+
const out = new i.constructor(i.length);
|
|
774
|
+
if (k < 0) { out.fill(0); return out; }
|
|
775
|
+
const normal_scale = eta * d + Math.sqrt(k);
|
|
776
|
+
for (let j = 0; j < i.length; j++) out[j] = eta * i[j] - normal_scale * n[j];
|
|
777
|
+
return out;
|
|
778
|
+
},
|
|
779
|
+
|
|
770
780
|
// ---------------------------------------------------------------------
|
|
771
781
|
// Matrix × {matrix, vector} and vector × matrix products.
|
|
772
782
|
//
|
|
@@ -1226,6 +1236,9 @@ export const WGSLLanguageCore = {
|
|
|
1226
1236
|
t.write(x, y, z, value);
|
|
1227
1237
|
},
|
|
1228
1238
|
|
|
1239
|
+
// CPUBitmapData models one stored mip level.
|
|
1240
|
+
textureNumLevels(_t) { return 1; },
|
|
1241
|
+
|
|
1229
1242
|
/**
|
|
1230
1243
|
* `textureDimensions(t, level) -> u32 | vec2<u32> | vec3<u32>`
|
|
1231
1244
|
*
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Per-element f32 atomic min/max via CAS-spin over a `atomic<u32>`
|
|
3
|
-
* storage cell, bitcast through f32 for comparison.
|
|
4
|
-
*
|
|
5
|
-
* WGSL has native u32/i32 atomics only. For float min/max the
|
|
6
|
-
* sign-bit-flip encoding (cheaper, only `atomicMin`/`atomicMax`
|
|
7
|
-
* needed) is a tempting alternative, but it leaves the buffer in
|
|
8
|
-
* "encoded" form during the dispatch chain — readers in the same
|
|
9
|
-
* frame would need to know whether the value is encoded or decoded.
|
|
10
|
-
* The CAS-spin keeps the storage in plain f32 the whole time, which
|
|
11
|
-
* matches what the rasterizer's meshlet-culling shader already
|
|
12
|
-
* expects in `meshlet.bounds_box`.
|
|
13
|
-
*
|
|
14
|
-
* Contention model: every contributor reads → compares → conditionally
|
|
15
|
-
* writes. When the existing value already bounds the contribution
|
|
16
|
-
* (typical for late contributors as the box settles), the comparison
|
|
17
|
-
* exits early without any CAS. The worst case is many threads
|
|
18
|
-
* hammering the same slot in the first few iterations; the loop is
|
|
19
|
-
* bounded by collisions, not by thread count.
|
|
20
|
-
*
|
|
21
|
-
* `value` is treated as a normal f32 — NaNs are not handled (vertex
|
|
22
|
-
* positions are never NaN in correctly-loaded geometry). +inf / -inf
|
|
23
|
-
* are valid (they're our scatter sentinels).
|
|
24
|
-
*
|
|
25
|
-
* @type {CodeChunk}
|
|
26
|
-
*/
|
|
27
|
-
export const chunk_aabb_atomic_f32: CodeChunk;
|
|
28
|
-
import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
|
|
29
|
-
//# sourceMappingURL=chunk_aabb_atomic_f32.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"chunk_aabb_atomic_f32.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/animation/skinning/bounds_refresh/chunk_aabb_atomic_f32.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,oCAFU,SAAS,CAgChB;0BA1DuB,uCAAuC"}
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Per-element f32 atomic min/max via CAS-spin over a `atomic<u32>`
|
|
5
|
-
* storage cell, bitcast through f32 for comparison.
|
|
6
|
-
*
|
|
7
|
-
* WGSL has native u32/i32 atomics only. For float min/max the
|
|
8
|
-
* sign-bit-flip encoding (cheaper, only `atomicMin`/`atomicMax`
|
|
9
|
-
* needed) is a tempting alternative, but it leaves the buffer in
|
|
10
|
-
* "encoded" form during the dispatch chain — readers in the same
|
|
11
|
-
* frame would need to know whether the value is encoded or decoded.
|
|
12
|
-
* The CAS-spin keeps the storage in plain f32 the whole time, which
|
|
13
|
-
* matches what the rasterizer's meshlet-culling shader already
|
|
14
|
-
* expects in `meshlet.bounds_box`.
|
|
15
|
-
*
|
|
16
|
-
* Contention model: every contributor reads → compares → conditionally
|
|
17
|
-
* writes. When the existing value already bounds the contribution
|
|
18
|
-
* (typical for late contributors as the box settles), the comparison
|
|
19
|
-
* exits early without any CAS. The worst case is many threads
|
|
20
|
-
* hammering the same slot in the first few iterations; the loop is
|
|
21
|
-
* bounded by collisions, not by thread count.
|
|
22
|
-
*
|
|
23
|
-
* `value` is treated as a normal f32 — NaNs are not handled (vertex
|
|
24
|
-
* positions are never NaN in correctly-loaded geometry). +inf / -inf
|
|
25
|
-
* are valid (they're our scatter sentinels).
|
|
26
|
-
*
|
|
27
|
-
* @type {CodeChunk}
|
|
28
|
-
*/
|
|
29
|
-
export const chunk_aabb_atomic_f32 = CodeChunk.from(
|
|
30
|
-
//language=WGSL
|
|
31
|
-
`
|
|
32
|
-
fn aabb_atomic_min_f32(cell: ptr<storage, atomic<u32>, read_write>, value: f32) {
|
|
33
|
-
loop {
|
|
34
|
-
let old_u = atomicLoad(cell);
|
|
35
|
-
let old_f = bitcast<f32>(old_u);
|
|
36
|
-
if value >= old_f {
|
|
37
|
-
break;
|
|
38
|
-
}
|
|
39
|
-
let result = atomicCompareExchangeWeak(cell, old_u, bitcast<u32>(value));
|
|
40
|
-
if result.exchanged {
|
|
41
|
-
break;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
fn aabb_atomic_max_f32(cell: ptr<storage, atomic<u32>, read_write>, value: f32) {
|
|
47
|
-
loop {
|
|
48
|
-
let old_u = atomicLoad(cell);
|
|
49
|
-
let old_f = bitcast<f32>(old_u);
|
|
50
|
-
if value <= old_f {
|
|
51
|
-
break;
|
|
52
|
-
}
|
|
53
|
-
let result = atomicCompareExchangeWeak(cell, old_u, bitcast<u32>(value));
|
|
54
|
-
if result.exchanged {
|
|
55
|
-
break;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
`);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"plane_ray_raycast.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/shader/chunk/geometry/plane/plane_ray_raycast.js"],"names":[],"mappings":"AAEA;;;GAGG;AACH,gCAFU,SAAS,CA2Cf;0BA/CsB,gCAAgC"}
|