@woosh/meep-engine 3.37.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.
Files changed (106) hide show
  1. package/package.json +1 -1
  2. package/src/engine/ecs/storage/populateEngineSerializationRegistry.d.ts.map +1 -1
  3. package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +2 -0
  4. package/src/engine/ecs/transform/TRANSFORM64_EVENT_PLACED.d.ts +11 -0
  5. package/src/engine/ecs/transform/TRANSFORM64_EVENT_PLACED.d.ts.map +1 -0
  6. package/src/engine/ecs/transform/TRANSFORM64_EVENT_PLACED.js +10 -0
  7. package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.d.ts.map +1 -1
  8. package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.js +16 -0
  9. package/src/engine/graphics/ecs/water/Water.d.ts +30 -0
  10. package/src/engine/graphics/ecs/water/Water.d.ts.map +1 -1
  11. package/src/engine/graphics/ecs/water/Water.js +125 -104
  12. package/src/engine/graphics/ecs/water/WaterSerializationAdapter.d.ts.map +1 -1
  13. package/src/engine/graphics/ecs/water/WaterSerializationAdapter.js +13 -1
  14. package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_1_2.d.ts +6 -0
  15. package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_1_2.d.ts.map +1 -0
  16. package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_1_2.js +18 -0
  17. package/src/engine/graphics3/WaterSystem.d.ts +22 -6
  18. package/src/engine/graphics3/WaterSystem.d.ts.map +1 -1
  19. package/src/engine/graphics3/WaterSystem.js +314 -293
  20. package/src/engine/physics/cloth/collider/ClothColliderIndex.d.ts +13 -14
  21. package/src/engine/physics/cloth/collider/ClothColliderIndex.d.ts.map +1 -1
  22. package/src/engine/physics/cloth/collider/ClothColliderIndex.js +137 -36
  23. package/src/engine/physics/cloth/collider/cloth_collider_bounds.d.ts +30 -0
  24. package/src/engine/physics/cloth/collider/cloth_collider_bounds.d.ts.map +1 -1
  25. package/src/engine/physics/cloth/collider/cloth_collider_bounds.js +33 -0
  26. package/src/engine/physics/cloth/ecs/ClothColliderFlags.js +2 -1
  27. package/src/engine/physics/cloth/ecs/ClothColliderSystem.d.ts +10 -1
  28. package/src/engine/physics/cloth/ecs/ClothColliderSystem.d.ts.map +1 -1
  29. package/src/engine/physics/cloth/ecs/ClothColliderSystem.js +36 -14
  30. package/src/engine/physics/cloth/ecs/ClothInstance.d.ts +15 -2
  31. package/src/engine/physics/cloth/ecs/ClothInstance.d.ts.map +1 -1
  32. package/src/engine/physics/cloth/ecs/ClothInstance.js +17 -2
  33. package/src/engine/physics/cloth/ecs/ClothWorld.d.ts.map +1 -1
  34. package/src/engine/physics/cloth/ecs/ClothWorld.js +19 -6
  35. package/src/engine/physics/cloth/ecs/cloth_gather_colliders.d.ts +18 -20
  36. package/src/engine/physics/cloth/ecs/cloth_gather_colliders.d.ts.map +1 -1
  37. package/src/engine/physics/cloth/ecs/cloth_gather_colliders.js +139 -89
  38. package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
  39. package/src/engine/physics/ecs/PhysicsSystem.js +32 -16
  40. package/src/shade/playground/water_refraction/README.md +149 -0
  41. package/src/shade/playground/water_refraction/index.html +42 -0
  42. package/src/shade/playground/water_refraction/main.d.ts +2 -0
  43. package/src/shade/playground/water_refraction/main.d.ts.map +1 -0
  44. package/src/shade/playground/water_refraction/main.js +201 -0
  45. package/src/shade/playground/water_refraction/world.d.ts +37 -0
  46. package/src/shade/playground/water_refraction/world.d.ts.map +1 -0
  47. package/src/shade/playground/water_refraction/world.js +137 -0
  48. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  49. package/src/shade/renderer/Renderer.js +4 -0
  50. package/src/shade/renderer/animation/chunk_pose_accumulator.d.ts +2 -3
  51. package/src/shade/renderer/animation/chunk_pose_accumulator.d.ts.map +1 -1
  52. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.d.ts.map +1 -1
  53. package/src/shade/renderer/light/environment/chunk_roughness_to_mip_ratio.d.ts +8 -0
  54. package/src/shade/renderer/light/environment/chunk_roughness_to_mip_ratio.d.ts.map +1 -0
  55. package/src/shade/renderer/light/environment/chunk_sphere_probe_roughness_to_lod.d.ts +0 -6
  56. package/src/shade/renderer/light/environment/chunk_sphere_probe_roughness_to_lod.d.ts.map +1 -1
  57. package/src/shade/renderer/particles/bounds/chunk_particle_bounds.d.ts +1 -1
  58. package/src/shade/renderer/particles/bounds/chunk_particle_bounds.d.ts.map +1 -1
  59. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts +17 -0
  60. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts.map +1 -1
  61. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.js +7 -0
  62. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_renormalization.d.ts +4 -0
  63. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_renormalization.d.ts.map +1 -0
  64. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_renormalization.js +11 -0
  65. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_rgb_contribution.d.ts +4 -0
  66. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_rgb_contribution.d.ts.map +1 -0
  67. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_rgb_contribution.js +19 -0
  68. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_splat_slice.d.ts.map +1 -1
  69. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_splat_slice.js +5 -3
  70. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_split_counts.d.ts +4 -0
  71. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_split_counts.d.ts.map +1 -0
  72. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_split_counts.js +8 -0
  73. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts +1 -1
  74. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts.map +1 -1
  75. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +21 -2
  76. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_resolve.d.ts.map +1 -1
  77. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_resolve.js +4 -8
  78. package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.d.ts.map +1 -1
  79. package/src/shade/renderer/shader/chunk/atomic/chunk_atomic_add_f32_storage.d.ts +12 -0
  80. package/src/shade/renderer/shader/chunk/atomic/chunk_atomic_add_f32_storage.d.ts.map +1 -0
  81. package/src/shade/renderer/shader/chunk/atomic/chunk_atomic_max_f32_storage.d.ts +12 -0
  82. package/src/shade/renderer/shader/chunk/atomic/chunk_atomic_max_f32_storage.d.ts.map +1 -0
  83. package/src/shade/renderer/shader/chunk/atomic/chunk_atomic_min_f32_storage.d.ts +12 -0
  84. package/src/shade/renderer/shader/chunk/atomic/chunk_atomic_min_f32_storage.d.ts.map +1 -0
  85. package/src/shade/renderer/shader/chunk/geometry/plane/{plane_ray_raycast.d.ts → chunk_plane_ray_raycast.d.ts} +2 -2
  86. package/src/shade/renderer/shader/chunk/geometry/plane/chunk_plane_ray_raycast.d.ts.map +1 -0
  87. package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_space_newton_ray.d.ts +4 -0
  88. package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_space_newton_ray.d.ts.map +1 -0
  89. package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_space_newton_ray.js +101 -0
  90. package/src/shade/renderer/water/GPUWaterRenderer.d.ts +62 -29
  91. package/src/shade/renderer/water/GPUWaterRenderer.d.ts.map +1 -1
  92. package/src/shade/renderer/water/GPUWaterRenderer.js +235 -147
  93. package/src/shade/renderer/water/chunk_water_transport.d.ts +5 -0
  94. package/src/shade/renderer/water/chunk_water_transport.d.ts.map +1 -0
  95. package/src/shade/renderer/water/chunk_water_transport.js +94 -0
  96. package/src/shade/renderer/water/shader_water.d.ts +9 -26
  97. package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
  98. package/src/shade/renderer/water/shader_water.js +384 -246
  99. package/src/shade/renderer/water/shader_water_avboit.d.ts +12 -0
  100. package/src/shade/renderer/water/shader_water_avboit.d.ts.map +1 -0
  101. package/src/shade/renderer/water/shader_water_avboit.js +258 -0
  102. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
  103. package/src/shade/wgsl/emulator/WGSLLanguageCore.js +13 -0
  104. package/src/shade/renderer/animation/skinning/bounds_refresh/chunk_aabb_atomic_f32.d.ts +0 -29
  105. package/src/shade/renderer/animation/skinning/bounds_refresh/chunk_aabb_atomic_f32.d.ts.map +0 -1
  106. package/src/shade/renderer/shader/chunk/geometry/plane/plane_ray_raycast.d.ts.map +0 -1
@@ -0,0 +1,94 @@
1
+ import { CodeChunk } from '../shader/compiler/CodeChunk.js';
2
+ import { chunk_decode_g_buffer_normal } from '../shader/chunk/geometry/normal/chunk_decode_g_buffer_normal.js';
3
+ import { chunk_inv_project_position } from '../shader/chunk/screen_space/chunk_inv_project_position.js';
4
+ import { chunk_is_background } from '../shader/chunk/depth/chunk_is_background.js';
5
+
6
+ export const chunk_water_refraction_confidence = CodeChunk.from(/* language=WGSL */ `
7
+ fn water_refraction_lookup(original: vec2f, receiver: vec2f, confidence: f32) -> vec2f {
8
+ return mix(original, receiver, clamp(confidence, 0.0, 1.0));
9
+ }
10
+ fn water_refraction_confidence(uv: vec2f, original_uv: vec2f, size: vec2f, distance_tiles: f32) -> f32 {
11
+ let displacement = length((uv - original_uv) * size);
12
+ let fade_width = clamp(displacement, 8.0, 64.0);
13
+ let visibility = smoothstep(0.0, fade_width, distance_tiles * 4.0);
14
+ let source_edge = min(min(original_uv.x, original_uv.y), min(1.0-original_uv.x, 1.0-original_uv.y));
15
+ let receiver_edge = min(min(uv.x, uv.y), min(1.0-uv.x, 1.0-uv.y));
16
+ // Approaching an off-screen receiver must approach the control lookup continuously,
17
+ // even while the water fragment itself is far enough from the frame border.
18
+ return visibility * smoothstep(0.0, clamp(displacement / min(size.x, size.y), 0.01, 0.1),
19
+ min(source_edge, receiver_edge));
20
+ }
21
+ `);
22
+
23
+ export const chunk_water_transport = CodeChunk.from(/* language=WGSL */ `
24
+ struct WaterEvent { transmission: vec3f, radiance: vec3f }
25
+ struct WaterTransport { transmission: vec3f, radiance: vec3f, background: vec3f }
26
+ fn water_event(path: f32, extinction: vec3f, fresnel: f32, reflection: vec3f, body: vec3f) -> WaterEvent {
27
+ let absorption = exp(-max(extinction, vec3f(0.0)) * max(path, 0.0));
28
+ let raw = (1.0 - fresnel) * absorption;
29
+ let t = max(raw, vec3f(1e-6));
30
+ let scale = (1.0 - t) / max(1.0 - raw, vec3f(1e-20));
31
+ return WaterEvent(t, scale * (fresnel * reflection + (1.0-fresnel) * (1.0-absorption) * body));
32
+ }
33
+ // One selected lookup and its optical event. Only geometric coverage mixes images;
34
+ // fading refraction interpolates the lookup UV before sampling, never two displaced colors.
35
+ fn water_transport(event: WaterEvent, original: vec3f, receiver: vec3f,
36
+ coverage: f32) -> WaterTransport {
37
+ let a = clamp(coverage, 0.0, 1.0);
38
+ let t = (1.0-a) + a * event.transmission;
39
+ let w = a * event.radiance;
40
+ let background = ((1.0-a)*original + a*event.transmission*receiver) / t;
41
+ return WaterTransport(t, w, background);
42
+ }
43
+ `);
44
+
45
+ // Filtering radiance across a silhouette must not introduce a surface that the ray never hit.
46
+ // The center depth/face normal define receiver ownership; taps must lie on that same local plane.
47
+ export const chunk_water_receiver_radiance = CodeChunk.from(/* language=WGSL */ `
48
+ // Depth is stored at the texel center. Intersect the lookup's camera ray with that
49
+ // local plane so subpixel lookup motion does not quantize water thickness.
50
+ fn water_receiver_path(depth: texture_2d<f32>, normals: texture_2d<u32>, uv: vec2f,
51
+ inverse_projection: mat4x4f, world_to_view: mat4x4f, origin: vec3f) -> f32 {
52
+ let size = vec2f(textureDimensions(depth, 0));
53
+ let coord = clamp(vec2i(uv*size), vec2i(0), vec2i(size)-1);
54
+ let d = textureLoad(depth, coord, 0).r;
55
+ let p = inv_project_position(vec3f((vec2f(coord)+0.5)/size,d), inverse_projection);
56
+ let direction = inv_project_position(vec3f(uv,d), inverse_projection);
57
+ let n = (world_to_view * vec4f(decode_g_buffer_normal(textureLoad(normals,coord,0).zw),0.0)).xyz;
58
+ let denominator = dot(n,direction);
59
+ if (abs(denominator) <= 1e-6) { return distance(origin,p); }
60
+ return distance(origin, direction * (dot(n,p)/denominator));
61
+ }
62
+ fn water_receiver_radiance(scene: texture_2d<f32>, depth: texture_2d<f32>, normals: texture_2d<u32>,
63
+ uv: vec2f, inverse_projection: mat4x4f, inverse_view: mat4x4f, level: f32, below_interface: bool) -> vec4f {
64
+ let size = vec2i(textureDimensions(depth, 0));
65
+ let center = clamp(vec2i(uv * vec2f(size)), vec2i(0), size-1);
66
+ let center_depth = textureLoad(depth, center, 0).r;
67
+ if (is_background(center_depth)) { return vec4f(0.0); }
68
+ let center_vs = inv_project_position(vec3f((vec2f(center)+0.5)/vec2f(size), center_depth), inverse_projection);
69
+ let p = (inverse_view * vec4f(center_vs, 1.0)).xyz;
70
+ let n = decode_g_buffer_normal(textureLoad(normals, center, 0).zw);
71
+ if (below_interface && p.y > level + 0.02) { return vec4f(0.0); }
72
+ let texel = uv * vec2f(size) - 0.5;
73
+ let base = vec2i(floor(texel));
74
+ let f = fract(texel);
75
+ var color = vec3f(0.0);
76
+ var weight = 0.0;
77
+ for (var y = 0; y < 2; y++) {
78
+ for (var x = 0; x < 2; x++) {
79
+ let coord = clamp(base + vec2i(x,y), vec2i(0), size-1);
80
+ let d = textureLoad(depth, coord, 0).r;
81
+ if (is_background(d)) { continue; }
82
+ let tap_vs = inv_project_position(vec3f((vec2f(coord)+0.5)/vec2f(size), d), inverse_projection);
83
+ let tap = (inverse_view * vec4f(tap_vs, 1.0)).xyz;
84
+ let tap_n = decode_g_buffer_normal(textureLoad(normals, coord, 0).zw);
85
+ if ((below_interface && tap.y > level+0.02) || dot(n,tap_n) < 0.95
86
+ || abs(dot(tap-p,n)) > 0.02) { continue; }
87
+ let w = select(1.0-f.x, f.x, x == 1) * select(1.0-f.y, f.y, y == 1);
88
+ color += w * textureLoad(scene, coord, 0).rgb;
89
+ weight += w;
90
+ }
91
+ }
92
+ return vec4f(color / max(weight, 1e-20), weight);
93
+ }
94
+ `, [chunk_decode_g_buffer_normal, chunk_inv_project_position, chunk_is_background]);
@@ -1,33 +1,16 @@
1
- /**
2
- * Build the water pipeline.
3
- *
4
- * **It has no depth attachment, and that is forced rather than chosen.** The shader *samples* scene
5
- * depth to know how much water the view looks through, and a texture may not be a sampled source
6
- * and a render attachment in the same pass. So the depth test the hardware would have done is done
7
- * in the shader instead — which is also why the fragment `discard` there is load-bearing rather
8
- * than a guard: without it, water would draw over the things standing in it.
9
- *
10
- * @param {object} [options]
11
- * @param {string} [options.color_format]
12
- * @returns {RenderPipelineDescriptor}
13
- */
14
- export function create_water_pipeline({ color_format }?: {
15
- color_format?: string;
16
- }): RenderPipelineDescriptor;
17
- /**
18
- * One water surface. Small, and rewritten per surface per frame rather than tabled — a level has a
19
- * handful of these, not thousands.
20
- */
1
+ export function create_water_pipeline(): RenderPipelineDescriptor;
2
+ export function create_water_finalize_pipeline(): RenderPipelineDescriptor;
21
3
  export const WATER_DRAW_STRUCT: WebGPUStruct;
4
+ export const WATER_TRACE_STRUCT: WebGPUStruct;
5
+ export const WATER_FINALIZE_RESOURCES: ShaderResourceSetDescriptor;
6
+ export const water_transport_fallback: CodeChunk;
7
+ export const chunk_water_screen_ray: CodeChunk;
22
8
  export const water_shader: ShaderDescriptor;
23
- /**
24
- * The pipeline's resource set, for building bind groups.
25
- *
26
- * @type {ShaderResourceSetDescriptor}
27
- */
9
+ export const water_finalize_shader: ShaderDescriptor;
28
10
  export const WATER_RESOURCES: ShaderResourceSetDescriptor;
29
11
  import { RenderPipelineDescriptor } from "../../descriptor/pipeline/render/RenderPipelineDescriptor.js";
30
12
  import { WebGPUStruct } from "../shader/type/WebGPUStruct.js";
31
- import { ShaderDescriptor } from "../shader/ShaderDescriptor.js";
32
13
  import { ShaderResourceSetDescriptor } from "../shader/resource/ShaderResourceSetDescriptor.js";
14
+ import { CodeChunk } from "../shader/compiler/CodeChunk.js";
15
+ import { ShaderDescriptor } from "../shader/ShaderDescriptor.js";
33
16
  //# sourceMappingURL=shader_water.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shader_water.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/water/shader_water.js"],"names":[],"mappings":"AAiNA;;;;;;;;;;;;GAYG;AACH;IAH4B,YAAY,GAA7B,MAAM;IACJ,wBAAwB,CAkBpC;AAnOD;;;GAGG;AACH,6CAuCuB;AAwIvB,4CAIG;AA8CH;;;;GAIG;AACH,8BAFU,2BAA2B,CAEI;yCAnPA,8DAA8D;6BAO1E,gCAAgC;iCAF5B,+BAA+B;4CADpB,mDAAmD"}
1
+ {"version":3,"file":"shader_water.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/water/shader_water.js"],"names":[],"mappings":"AA8XA,kEAAuH;AACvH,2EAAuJ;AA3WvJ,6CAKuB;AAEvB,8CAGwB;AAmBxB,mEAA8D;AAE9D,iDAIG;AAsCH,+CAmGoH;AA8KpH,4CAAmG;AACnG,qDAA2J;AAC3J,0DAAyC;yCA9WA,8DAA8D;6BAe1E,gCAAgC;4CAHjB,mDAAmD;0BADrE,iCAAiC;iCAE1B,+BAA+B"}