@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,137 @@
1
+ import { Color } from "../../../core/color/Color.js";
2
+ import Quaternion from "../../../core/geom/Quaternion.js";
3
+ import Vector3 from "../../../core/geom/Vector3.js";
4
+ import { Entity } from "../../../engine/ecs/Entity.js";
5
+ import Terrain from "../../../engine/ecs/terrain/ecs/Terrain.js";
6
+ import { Transform64 } from "../../../engine/ecs/transform/Transform64.js";
7
+ import { t64_announce_change } from "../../../engine/ecs/transform/t64_announce_change.js";
8
+ import { ShadedGeometry } from "../../../engine/graphics/ecs/mesh-v2/ShadedGeometry.js";
9
+ import Water from "../../../engine/graphics/ecs/water/Water.js";
10
+ import { ParticleEffect } from "../../../engine/graphics/ecs/particles/ParticleEffect.js";
11
+ import { Sampler2D } from "../../../engine/graphics/texture/sampler/Sampler2D.js";
12
+ import { MeshoptClusterizer } from "../../renderer/geometry/meshlet/build/meshoptimizer/meshopt_clusterizer.js";
13
+ import { meshlet_geometry_build_from_geometry } from "../../renderer/geometry/meshlet_geometry_build_from_geometry.js";
14
+ import { MeshletGeometry } from "../../renderer/geometry/MeshletGeometry.js";
15
+ import { make_box_geometry } from "../../renderer/geometry/primitives/make_box_geometry.js";
16
+ import { make_plane_geometry } from "../../renderer/geometry/primitives/make_plane_geometry.js";
17
+ import { StandardAttributes } from "../../renderer/geometry/StandardAttributes.js";
18
+ import { ShadeDrawSide } from "../../renderer/material/ShadeDrawSide.js";
19
+ import { StandardShadeMaterial } from "../../renderer/material/StandardShadeMaterial.js";
20
+ import { TransparencyMode } from "../../renderer/material/TransparencyMode.js";
21
+ import { DynamicMesh } from "../../renderer/scene/DynamicMesh.js";
22
+ import { DynamicMeshBatch } from "../../renderer/scene/DynamicMeshBatch.js";
23
+ import { ColorSpace } from "../../renderer/texture/ColorSpace.js";
24
+ import { ShadeTexture } from "../../renderer/texture/ShadeTexture.js";
25
+ import { ShadeImage } from "../../renderer/texture/source/ShadeImage.js";
26
+ import { bonfire_effects } from "../particle_ecs/bonfire_effects.js";
27
+ import { bonfire_sprites } from "../particle_ecs/bonfire_sprites.js";
28
+
29
+ export const height_at = (x,z,offset=0) => -2 + Math.max(0,z-18)*0.5 + offset;
30
+
31
+ function pose(x,y,z,rotation=Quaternion.identity) {
32
+ const transform = new Transform64();
33
+ transform.setTranslation(x,y,z);
34
+ if (rotation !== undefined) { transform.setRotation(rotation.x,rotation.y,rotation.z,rotation.w); }
35
+ transform.updateMatrix(); return transform;
36
+ }
37
+ function material(rgb,alpha=1) {
38
+ const m=new StandardShadeMaterial(); m.diffuse_color.copy(new Color(...rgb,alpha));
39
+ m.metallic_factor=0; m.roughness_factor=0.55; m.draw_side=ShadeDrawSide.Double;
40
+ m.transparency_mode=alpha<1?TransparencyMode.Transparent:TransparencyMode.Opaque;
41
+ return m;
42
+ }
43
+ function meshlets(geometry) {
44
+ const result=new MeshletGeometry(); meshlet_geometry_build_from_geometry(geometry,result); return result;
45
+ }
46
+ function shaded(geometry,material) { const s=new ShadedGeometry(); s.geometry=geometry; s.material=material; return s; }
47
+ function checker() {
48
+ // A four-texel-wide square blurred under ordinary bilinear filtering even with
49
+ // water disabled. Keep the same world-space pattern with a sharp source image.
50
+ const size=1024, data=Sampler2D.uint8(4,size,size);
51
+ for(let y=0;y<size;y++) for(let x=0;x<size;x++) {
52
+ const bright=((x>>6)+(y>>6))%2===0;
53
+ const n=bright?215:42; data.data.set([n,bright?220:66,bright?200:84,255],(y*size+x)*4);
54
+ }
55
+ const image=ShadeImage.fromSampler2D(data); image.color_space=ColorSpace.SRGB;
56
+ return ShadeTexture.from(image);
57
+ }
58
+
59
+ /** All visible static content uses ordinary ECS meshlets; water owns no demo-specific pass. */
60
+ export async function build_world(dataset) {
61
+ await MeshoptClusterizer.ready;
62
+ const entities=[];
63
+ const build=builder=>{builder.build(dataset);entities.push(builder.id);return builder.id;};
64
+ const terrain=new Terrain(); terrain.size.set(32,32); terrain.gridScale=1;
65
+ function sampler(offset=0) {
66
+ const s=Sampler2D.float32(1,65,65);
67
+ for(let y=0;y<65;y++) for(let x=0;x<65;x++) s.data[y*65+x]=height_at(x/64*32,y/64*32,offset);
68
+ return s;
69
+ }
70
+ terrain.samplerHeight=sampler(); build(new Entity().add(terrain).add(pose(0,0,0)));
71
+ const floor_geo=make_plane_geometry(32,32,32,32);
72
+ const positions=floor_geo.getAttribute(StandardAttributes.Position).data;
73
+ const normals=floor_geo.getAttribute(StandardAttributes.Normal).data;
74
+ for(let i=0;i<positions.length;i+=3) {
75
+ const x=positions[i]+16,z=16-positions[i+1];
76
+ positions[i]=x; positions[i+1]=height_at(x,z); positions[i+2]=z;
77
+ const slope=z>18?0.5:0,n=Math.hypot(1,slope);
78
+ normals[i]=0; normals[i+1]=1/n; normals[i+2]=-slope/n;
79
+ }
80
+ const floor_material=material([1,1,1]); floor_material.texture_albedo=checker();
81
+ const floor_transform=pose(0,0,0);
82
+ const floor_entity=build(new Entity().add(floor_transform).add(shaded(meshlets(floor_geo),floor_material)));
83
+ const water=new Water(); water.level.set(0); water.scattering.set(0.6);
84
+ const water_entity=build(new Entity().add(water));
85
+ const add_mesh=(geo,m,x,y,z,rotation)=>{
86
+ const t=pose(x,y,z,rotation);const component=shaded(meshlets(geo),m);
87
+ const entity=build(new Entity().add(t).add(component)); return {transform:t,component,entity};
88
+ };
89
+ add_mesh(make_box_geometry(4,1.5,2),material([0.48,0.23,0.08]),16,0.15,14);
90
+ for(let i=0;i<5;i++) add_mesh(make_box_geometry(0.12,3.5,0.12),material([0.9,0.5,0.13]),9+i*0.45,-0.25,14);
91
+ const card=add_mesh(make_plane_geometry(2,2),material([0.2,0.65,0.9],0.5),12,0,12);
92
+ const submerged=add_mesh(make_box_geometry(1.2,0.8,1.2),material([0.8,0.14,0.1]),15,-1.4,11);
93
+ const effects=bonfire_effects(bonfire_sprites());
94
+ const live_effects=[effects.smoke,effects.embers];
95
+ const particle_transforms=[];
96
+ for(const [i,effect] of [effects.smoke,effects.embers].entries()) {
97
+ effect.spawn_rate=80; const t=pose(11+i*2,-0.5,10);
98
+ const entity=build(new Entity().add(t).add(effect)); particle_transforms.push({transform:t,entity});
99
+ }
100
+ const ribbon=DynamicMesh.from(make_plane_geometry(6,0.14,16,1),[0.75,0.12,0.9,0.55]);
101
+ const ribbon_base=ribbon.geometry.getAttribute(StandardAttributes.Position).data.slice();
102
+ const batch=new DynamicMeshBatch(); batch.add(ribbon);
103
+ let secondary=null;
104
+ let last_update=null;
105
+ return {terrain,water,water_entity,card,submerged,batch,ribbon,effects:live_effects,entities,
106
+ reset_particles() {
107
+ particle_transforms.forEach(({entity},i)=>{
108
+ const replacement=live_effects[i].clone();
109
+ dataset.removeComponentFromEntity(entity,ParticleEffect);
110
+ dataset.addComponentToEntity(entity,replacement);live_effects[i]=replacement;
111
+ });
112
+ },
113
+ update(time,{layer_height=0,animate=false}={}) {
114
+ if(last_update!==null&&last_update[0]===time&&last_update[1]===layer_height&&last_update[2]===animate)return;
115
+ last_update=[time,layer_height,animate];
116
+ card.transform.setTranslation(12,layer_height,12); t64_announce_change(dataset,card.entity);
117
+ particle_transforms.forEach(({transform:t,entity},i)=>{t.setTranslation(11+i*2,layer_height-0.7,10);t64_announce_change(dataset,entity);});
118
+ submerged.transform.setTranslation(15+(animate?Math.sin(time)*2:0),-1.4,11);
119
+ t64_announce_change(dataset,submerged.entity);
120
+ const p=ribbon.geometry.getAttribute(StandardAttributes.Position).data;
121
+ for(let i=0;i<p.length;i+=3) {
122
+ p[i]=13+ribbon_base[i]; p[i+1]=layer_height+ribbon_base[i+1]+Math.sin(ribbon_base[i]+time)*0.6;
123
+ p[i+2]=9+Math.cos(ribbon_base[i]*0.5)*0.7;
124
+ }
125
+ ribbon.geometry.needsUpdate=true;
126
+ },
127
+ replace_terrain(offset=-0.25) {
128
+ terrain.samplerHeight=sampler(offset); floor_transform.setTranslation(0,offset,0);t64_announce_change(dataset,floor_entity);
129
+ },
130
+ overlap(enabled) {
131
+ if(enabled&&secondary===null) {const other=new Water();other.level.set(water.level.getValue()-0.4);
132
+ other.color.setRGB(0.65,0.1,0.25);secondary=build(new Entity().add(other));}
133
+ if(!enabled&&secondary!==null) {dataset.removeEntity(secondary);secondary=null;}
134
+ },
135
+ dispose() {entities.forEach(id=>{if(dataset.entityExists(id)) dataset.removeEntity(id);});batch.clear();},
136
+ };
137
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"Renderer.d.ts","sourceRoot":"","sources":["../../../../src/shade/renderer/Renderer.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Renderer.d.ts","sourceRoot":"","sources":["../../../../src/shade/renderer/Renderer.js"],"names":[],"mappings":"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"}
@@ -2678,6 +2678,10 @@ export class Renderer {
2678
2678
  color_texture: current_color_out,
2679
2679
  depth_texture: gr_texture_depth_current,
2680
2680
 
2681
+ normal_texture: gr_texture_normal,
2682
+ hzb_texture: gr_texture_hzb,
2683
+ environment_texture: gr_texture_environment,
2684
+
2681
2685
  limits: this.graphics.collection_limits,
2682
2686
 
2683
2687
  light_cluster_data: light_clusters.data,
@@ -4,9 +4,8 @@
4
4
  * The importing shader binds:
5
5
  * `var<storage, read_write> pose_accumulator: array<atomic<u32>>;`
6
6
  *
7
- * f32 atomic-add isn't native to WGSL. We implement it as a
8
- * `atomicCompareExchangeWeak` spin: load the current u32, reinterpret as
9
- * f32, add the contribution, reinterpret back, CAS. Contention is
7
+ * f32 atomic-add isn't native to WGSL. The shared `atomic_add_f32_storage`
8
+ * helper uses a compare-exchange retry loop over plain f32 bits. Contention is
10
9
  * typically low (each `(row, channel)` has 1–2 contributors in a
11
10
  * normalised blend), so the spin rarely loops more than once.
12
11
  *
@@ -1 +1 @@
1
- {"version":3,"file":"chunk_pose_accumulator.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/animation/chunk_pose_accumulator.js"],"names":[],"mappings":"AAgBA;;;;;;;;;;;;;;;;;GAiBG;AACH,qCAFU,SAAS,CAsGhB;0BAtIuB,iCAAiC"}
1
+ {"version":3,"file":"chunk_pose_accumulator.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/animation/chunk_pose_accumulator.js"],"names":[],"mappings":"AAiBA;;;;;;;;;;;;;;;;GAgBG;AACH,qCAFU,SAAS,CA4FgB;0BA5HT,iCAAiC"}
@@ -1 +1 @@
1
- {"version":3,"file":"shader_meshlet_bounds_reduce.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.js"],"names":[],"mappings":"AAUA;;;;;;;GAOG;AACH,gCAAiC;AAsKjC;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,yDAIG;8BAjN2B,kCAAkC"}
1
+ {"version":3,"file":"shader_meshlet_bounds_reduce.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.js"],"names":[],"mappings":"AAWA;;;;;;;GAOG;AACH,gCAAiC;AAsKjC;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,yDAIG;8BAlN2B,kCAAkC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Input roughness is linear (blender calls it "UI roughness")
3
+ * @see https://projects.blender.org/blender/blender/src/commit/866ef5b468589587395b1ee7480ea75b4c0fbc26/source/blender/draw/engines/eevee_next/shaders/eevee_lightprobe_sphere_mapping_lib.glsl#L102
4
+ * @type {CodeChunk}
5
+ */
6
+ export const chunk_roughness_to_mip_ratio: CodeChunk;
7
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
8
+ //# sourceMappingURL=chunk_roughness_to_mip_ratio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk_roughness_to_mip_ratio.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/light/environment/chunk_roughness_to_mip_ratio.js"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,2CAFU,SAAS,CAiBjB;0BAvBwB,oCAAoC"}
@@ -1,9 +1,3 @@
1
- /**
2
- * Input roughness is linear (blender calls it "UI roughness")
3
- * @see https://projects.blender.org/blender/blender/src/commit/866ef5b468589587395b1ee7480ea75b4c0fbc26/source/blender/draw/engines/eevee_next/shaders/eevee_lightprobe_sphere_mapping_lib.glsl#L102
4
- * @type {CodeChunk}
5
- */
6
- export const chunk_roughness_to_mip_ratio: CodeChunk;
7
1
  /**
8
2
  * Input roughness is linear (blender calls it "UI roughness")
9
3
  * @see https://projects.blender.org/blender/blender/src/commit/866ef5b468589587395b1ee7480ea75b4c0fbc26/source/blender/draw/engines/eevee_next/shaders/eevee_lightprobe_sphere_mapping_lib.glsl#L102
@@ -1 +1 @@
1
- {"version":3,"file":"chunk_sphere_probe_roughness_to_lod.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/light/environment/chunk_sphere_probe_roughness_to_lod.js"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,2CAFU,SAAS,CAkBjB;AAEF;;;;GAIG;AACH,kDAFU,SAAS,CAajB;0BA1CwB,oCAAoC"}
1
+ {"version":3,"file":"chunk_sphere_probe_roughness_to_lod.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/light/environment/chunk_sphere_probe_roughness_to_lod.js"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,kDAFU,SAAS,CAajB;0BApBwB,oCAAoC"}
@@ -13,7 +13,7 @@
13
13
  *
14
14
  * ## Why f32 in the buffer, and not an order-preserving encoding
15
15
  *
16
- * `aabb_atomic_min_f32` / `aabb_atomic_max_f32` are the engine's, shared with the skinned-mesh
16
+ * `atomic_min_f32_storage` / `atomic_max_f32_storage` are the engine's, shared with the skinned-mesh
17
17
  * bounds refresh, and they CAS-spin over the plain float so the words are readable as floats at
18
18
  * every moment of the frame. The sign-flip encoding that would let `atomicMin` do it in one
19
19
  * instruction leaves the buffer in a form only a decoder understands, and the publish pass reads
@@ -1 +1 @@
1
- {"version":3,"file":"chunk_particle_bounds.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/bounds/chunk_particle_bounds.js"],"names":[],"mappings":"AAaA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,0CAFU,SAAS,CAwEyC;AAE5D;;;;;;;;;;;;;;;;GAgBG;AACH,8CAFU,SAAS,CA4CsC;0BApL/B,oCAAoC"}
1
+ {"version":3,"file":"chunk_particle_bounds.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/bounds/chunk_particle_bounds.js"],"names":[],"mappings":"AAcA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,0CAFU,SAAS,CAwE8E;AAEjG;;;;;;;;;;;;;;;;GAgBG;AACH,8CAFU,SAAS,CA4CsC;0BArL/B,oCAAoC"}
@@ -34,6 +34,23 @@
34
34
  * channel without the method is always asked.
35
35
  */
36
36
  export type AVBOITSideChannel = {
37
+ /**
38
+ * Optional optics preparation before occupancy; at most one producer per view. Inputs are
39
+ * immutable opaque resources. The returned background is read by the one shared resolve.
40
+ * Keep prepared state per graph/camera, not on an entity or in a global current-view slot.
41
+ */
42
+ avboit_prepare?: (args: {
43
+ graph: import("../../../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph;
44
+ view_ctx: import("../../../view/GPUViewContext.js").GPUViewContext;
45
+ camera: number;
46
+ color_texture: number;
47
+ depth_texture: number;
48
+ normal_texture: number;
49
+ hzb_texture: number;
50
+ environment_texture: number;
51
+ }) => {
52
+ background_color?: number;
53
+ };
37
54
  /**
38
55
  * add the channel's slices to the occupancy bits; returns the bits'
39
56
  * handle after the write. `cluster_parameters` is the frame's depth curve (`avboit_build_depth_curve`).
@@ -1 +1 @@
1
- {"version":3,"file":"AVBOITSideChannel.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAoCc,CAAC,IAAI,EAAE;QACpB,KAAW,EAAE,OAAO,iEAAiE,EAAE,UAAU,CAAC;QAClG,MAAY,EAAE,MAAM,CAAC;QACrB,kBAAwB,EAAE,UAAU,MAAM,CAAC,CAAC;QAC5C,SAAe,EAAE,MAAM,CAAC;KACrB,KAAK,MAAM;;;;;;;;kBAED,CAAC,IAAI,EAAE;QACpB,KAAW,EAAE,OAAO,iEAAiE,EAAE,UAAU,CAAC;QAClG,MAAY,EAAE,MAAM,CAAC;QACrB,IAAU,EAAE,MAAM,CAAC;QACnB,aAAmB,EAAE,MAAM,CAAC;QAC5B,gBAAsB,EAAE,MAAM,EAAE,CAAC;QACjC,MAAY,EAAE;YAAC,UAAU,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAC,CAAC;KACjE,KAAK;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC;;;;;;;;;iBAKhD,CAAC,IAAI,EAAE;QACpB,KAAW,EAAE,OAAO,iEAAiE,EAAE,UAAU,CAAC;QAClG,QAAc,EAAE,OAAO,iCAAiC,EAAE,cAAc,CAAC;QACzE,MAAY,EAAE,MAAM,CAAC;QACrB,aAAmB,EAAE,MAAM,CAAC;QAC5B,IAAU,EAAE,MAAM,CAAC;QACnB,QAAc,EAAE,MAAM,CAAC;QACvB,eAAqB,EAAE,MAAM,CAAC;QAC9B,oBAA0B,EAAE,MAAM,CAAC;QACnC,sBAA4B,EAAE;YAAC,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAC,CAAC;QACxD,YAAkB,EAAE;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAA;SAAC,CAAC;KACrF,KAAK;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAC;;;;;;sBAM9D,MAAM,OAAO"}
1
+ {"version":3,"file":"AVBOITSideChannel.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAoCc,CAAC,IAAI,EAAE;QAAC,KAAK,EAAE,OAAO,iEAAiE,EAAE,UAAU,CAAC;QACjH,QAAc,EAAE,OAAO,iCAAiC,EAAE,cAAc,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QACzF,aAAmB,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAC3E,WAAiB,EAAE,MAAM,CAAC;QAAC,mBAAmB,EAAE,MAAM,CAAA;KAAC,KAAK;QAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAC;;;;;sBAI1E,CAAC,IAAI,EAAE;QACpB,KAAW,EAAE,OAAO,iEAAiE,EAAE,UAAU,CAAC;QAClG,MAAY,EAAE,MAAM,CAAC;QACrB,kBAAwB,EAAE,UAAU,MAAM,CAAC,CAAC;QAC5C,SAAe,EAAE,MAAM,CAAC;KACrB,KAAK,MAAM;;;;;;;;kBAED,CAAC,IAAI,EAAE;QACpB,KAAW,EAAE,OAAO,iEAAiE,EAAE,UAAU,CAAC;QAClG,MAAY,EAAE,MAAM,CAAC;QACrB,IAAU,EAAE,MAAM,CAAC;QACnB,aAAmB,EAAE,MAAM,CAAC;QAC5B,gBAAsB,EAAE,MAAM,EAAE,CAAC;QACjC,MAAY,EAAE;YAAC,UAAU,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAC,CAAC;KACjE,KAAK;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC;;;;;;;;;iBAKhD,CAAC,IAAI,EAAE;QACpB,KAAW,EAAE,OAAO,iEAAiE,EAAE,UAAU,CAAC;QAClG,QAAc,EAAE,OAAO,iCAAiC,EAAE,cAAc,CAAC;QACzE,MAAY,EAAE,MAAM,CAAC;QACrB,aAAmB,EAAE,MAAM,CAAC;QAC5B,IAAU,EAAE,MAAM,CAAC;QACnB,QAAc,EAAE,MAAM,CAAC;QACvB,eAAqB,EAAE,MAAM,CAAC;QAC9B,oBAA0B,EAAE,MAAM,CAAC;QACnC,sBAA4B,EAAE;YAAC,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAC,CAAC;QACxD,YAAkB,EAAE;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAA;SAAC,CAAC;KACrF,KAAK;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAC;;;;;;sBAM9D,MAAM,OAAO"}
@@ -34,6 +34,13 @@
34
34
  * channel without the method is always asked.
35
35
  *
36
36
  * @typedef {object} AVBOITSideChannel
37
+ * @property {(args: {graph: import("../../../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph,
38
+ * view_ctx: import("../../../view/GPUViewContext.js").GPUViewContext, camera: number,
39
+ * color_texture: number, depth_texture: number, normal_texture: number,
40
+ * hzb_texture: number, environment_texture: number}) => {background_color?: number}} [avboit_prepare]
41
+ * Optional optics preparation before occupancy; at most one producer per view. Inputs are
42
+ * immutable opaque resources. The returned background is read by the one shared resolve.
43
+ * Keep prepared state per graph/camera, not on an entity or in a global current-view slot.
37
44
  * @property {(args: {
38
45
  * graph: import("../../../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph,
39
46
  * camera: number,
@@ -0,0 +1,4 @@
1
+ /** Stable lost throughput at tiny extinction; a fixed norm cutoff drops bright faint surfaces. */
2
+ export const chunk_avboit_renormalization: CodeChunk;
3
+ import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
4
+ //# sourceMappingURL=chunk_avboit_renormalization.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk_avboit_renormalization.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/rasterize/native/avboit/chunk_avboit_renormalization.js"],"names":[],"mappings":"AAEA,kGAAkG;AAClG,qDAOG;0BAVuB,uCAAuC"}
@@ -0,0 +1,11 @@
1
+ import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
2
+
3
+ /** Stable lost throughput at tiny extinction; a fixed norm cutoff drops bright faint surfaces. */
4
+ export const chunk_avboit_renormalization = CodeChunk.from(/* language=WGSL */ `
5
+ fn avboit_renormalization(extinction: vec3f, norm: vec3f) -> vec3f {
6
+ let x = max(extinction, vec3f(0.0));
7
+ let small_loss = x * (1.0 - 0.5 * x + x * x / 6.0);
8
+ let loss = select(vec3f(1.0) - exp(-x), small_loss, x < vec3f(0.001));
9
+ return select(vec3f(0.0), min(loss / max(norm, vec3f(1e-20)), vec3f(65504.0)), norm > vec3f(0.0));
10
+ }
11
+ `);
@@ -0,0 +1,4 @@
1
+ /** A covering RGB-throughput surface; the existing particle/scalar entry point stays unchanged. */
2
+ export const chunk_avboit_rgb_contribution: CodeChunk;
3
+ import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
4
+ //# sourceMappingURL=chunk_avboit_rgb_contribution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk_avboit_rgb_contribution.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/rasterize/native/avboit/chunk_avboit_rgb_contribution.js"],"names":[],"mappings":"AAGA,mGAAmG;AACnG,sDAc8C;0BAlBpB,uCAAuC"}
@@ -0,0 +1,19 @@
1
+ import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
2
+ import { chunk_avboit_premultiplied_contribution } from "./chunk_avboit_premultiplied_contribution.js";
3
+
4
+ /** A covering RGB-throughput surface; the existing particle/scalar entry point stays unchanged. */
5
+ export const chunk_avboit_rgb_contribution = CodeChunk.from(/* language=WGSL */ `
6
+ fn avboit_rgb_contribution(
7
+ radiance: vec3<f32>, self_transmittance: vec3<f32>,
8
+ front_transmittance: vec3<f32>, fog: vec4<f32>,
9
+ ) -> AVBOITContribution {
10
+ let t = clamp(self_transmittance, vec3<f32>(1e-6), vec3<f32>(1.0));
11
+ let loss = vec3<f32>(1.0) - t;
12
+ var out: AVBOITContribution;
13
+ out.color = vec4<f32>((radiance * fog.w + loss * fog.xyz) * front_transmittance, 0.0);
14
+ out.norm = vec4<f32>(loss * front_transmittance, 0.0);
15
+ out.extinction = vec4<f32>(-log(t), 0.0);
16
+ out.emission = vec4<f32>(0.0);
17
+ return out;
18
+ }
19
+ `, [chunk_avboit_premultiplied_contribution]);
@@ -1 +1 @@
1
- {"version":3,"file":"chunk_avboit_splat_slice.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/rasterize/native/avboit/chunk_avboit_splat_slice.js"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;GAcG;AACH,uCAFU,SAAS,CAuCjB;0BAzDwB,uCAAuC"}
1
+ {"version":3,"file":"chunk_avboit_splat_slice.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/rasterize/native/avboit/chunk_avboit_splat_slice.js"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;GAcG;AACH,uCAFU,SAAS,CAyCjB;0BA3DwB,uCAAuC"}
@@ -21,12 +21,10 @@ import { chunk_avboit_pack_counts } from "./chunk_avboit_pack_counts.js";
21
21
  export const chunk_avboit_splat_slice = CodeChunk.from(
22
22
  //language=WGSL
23
23
  `
24
- fn avboit_splat_slice(column: u32, slice: i32, extinction: vec3<f32>, texel: vec2<u32>) {
24
+ fn avboit_splat_counts(column: u32, slice: i32, counts: vec3<u32>, texel: vec2<u32>) {
25
25
  let physical = i32(warp.physical_count);
26
26
  let s = clamp(slice, 0, physical - 1);
27
27
 
28
- let counts = avboit_extinction_to_counts(extinction);
29
-
30
28
  if (all(counts == vec3<u32>(0u))) {
31
29
  return;
32
30
  }
@@ -50,6 +48,10 @@ fn avboit_splat_slice(column: u32, slice: i32, extinction: vec3<f32>, texel: vec
50
48
  }
51
49
  }
52
50
  }
51
+
52
+ fn avboit_splat_slice(column: u32, slice: i32, extinction: vec3<f32>, texel: vec2<u32>) {
53
+ avboit_splat_counts(column, slice, avboit_extinction_to_counts(extinction), texel);
54
+ }
53
55
  `, [
54
56
  chunk_avboit_extinction_to_counts,
55
57
  chunk_avboit_overflows,
@@ -0,0 +1,4 @@
1
+ /** Partition already quantized counts. Rounding two fractional extinctions can erase both. */
2
+ export const chunk_avboit_split_counts: CodeChunk;
3
+ import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
4
+ //# sourceMappingURL=chunk_avboit_split_counts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk_avboit_split_counts.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/rasterize/native/avboit/chunk_avboit_split_counts.js"],"names":[],"mappings":"AAEA,8FAA8F;AAC9F,kDAIG;0BAPuB,uCAAuC"}
@@ -0,0 +1,8 @@
1
+ import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
2
+
3
+ /** Partition already quantized counts. Rounding two fractional extinctions can erase both. */
4
+ export const chunk_avboit_split_counts = CodeChunk.from(/* language=WGSL */ `
5
+ fn avboit_split_counts(counts: vec3<u32>, fraction: f32) -> vec3<u32> {
6
+ return min(counts, vec3<u32>(vec3<f32>(counts) * clamp(fraction, 0.0, 1.0) + 0.5));
7
+ }
8
+ `);
@@ -164,7 +164,7 @@ export function avboit_create_accumulators(pass: FramePassBuilder, resolution: A
164
164
  * sources of transparent fragments; the MBOIT orchestrator ignores them
165
165
  * @returns {number} resource ID of the composited color texture
166
166
  */
167
- export function graph_rasterize_meshes_transparent_avboit({ graph, buckets, view_ctx, viewport, depth_texture, color_texture, limits, light_cluster_parameters, light_cluster_lookup, light_cluster_data, shadowmap_atlas, volumetrics_lut, volumetrics_metadata, volumetrics_irradiance, indirect_lighting_mode, avboit, side_channels, }: {
167
+ export function graph_rasterize_meshes_transparent_avboit({ graph, buckets, view_ctx, viewport, depth_texture, color_texture, normal_texture, hzb_texture, environment_texture, limits, light_cluster_parameters, light_cluster_lookup, light_cluster_data, shadowmap_atlas, volumetrics_lut, volumetrics_metadata, volumetrics_irradiance, indirect_lighting_mode, avboit, side_channels, }: {
168
168
  graph: FrameGraph;
169
169
  buckets: number;
170
170
  view_ctx: GPUViewContext;
@@ -1 +1 @@
1
- {"version":3,"file":"graph_rasterize_meshes_transparent_avboit.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js"],"names":[],"mappings":"AA4DA;;;;;GAKG;AACH,oDAHW,UAAU,MAAM,CAAC,GACf,MAAM,EAAE,CAOpB;AAED;;;;;;;;;;;;GAYG;AACH;IAT+B,KAAK;IACA,KAAK;IACd,MAAM,EAAtB,MAAM;IACqB,kBAAkB,EAA7C,UAAU,MAAM,CAAC;IACD,kBAAkB,EAAlC,MAAM;IACU,wBAAwB,EAAxC,MAAM;IACW,SAAS,GAA1B,MAAM;IACJ,MAAM,CA4DlB;AAED;;;;;;;;;;GAUG;AACH;IAP+B,KAAK;IACT,SAAS,EAAzB,MAAM;IACY,gBAAgB,EAAlC,MAAM,EAAE;IACmB,kBAAkB,EAA7C,UAAU,MAAM,CAAC;IACQ,MAAM,GAA/B,cAAc;IACZ,MAAM,CAsDlB;AAED;;;;;;;;;;;;;;;GAeG;AACH,6KAFa;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAC,CAiJjE;AAED;;;;;;;;;;GAUG;AACH;IAP+B,KAAK;IACT,IAAI,EAApB,MAAM;IACU,UAAU,EAA1B,MAAM;IACU,QAAQ,EAAxB,MAAM;IACY,gBAAgB,EAAlC,MAAM,EAAE;IACN,MAAM,CAoClB;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qUAFa;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAC,CAwN7D;AAED;;;;;;;;GAQG;AACH,+EAHW,UAAU,MAAM,CAAC,GACf;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAC,CAe/E;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH;IAtB+B,KAAK;IACT,OAAO,EAAvB,MAAM;IACkB,QAAQ;IACd,QAAQ,EAA1B,MAAM,EAAE;IACQ,aAAa,EAA7B,MAAM;IACU,aAAa,EAA7B,MAAM;IACuB,MAAM;IACnB,wBAAwB,EAAxC,MAAM;IACU,oBAAoB,EAApC,MAAM;IACU,kBAAkB,EAAlC,MAAM;IACU,eAAe,EAA/B,MAAM;IACU,eAAe,EAA/B,MAAM;IACU,oBAAoB,EAApC,MAAM;IAC6B,sBAAsB,EAAzD;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC;IAGU,sBAAsB,EAAzD,yBAAyB;IACA,MAAM,GAA/B,cAAc;IACiD,aAAa,GAA5E,OAAO,wBAAwB,EAAE,iBAAiB,EAAE;IAElD,MAAM,CA8RlB;+BAr8B8B,qBAAqB;0CA9BV,uCAAuC"}
1
+ {"version":3,"file":"graph_rasterize_meshes_transparent_avboit.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js"],"names":[],"mappings":"AA4DA;;;;;GAKG;AACH,oDAHW,UAAU,MAAM,CAAC,GACf,MAAM,EAAE,CAOpB;AAED;;;;;;;;;;;;GAYG;AACH;IAT+B,KAAK;IACA,KAAK;IACd,MAAM,EAAtB,MAAM;IACqB,kBAAkB,EAA7C,UAAU,MAAM,CAAC;IACD,kBAAkB,EAAlC,MAAM;IACU,wBAAwB,EAAxC,MAAM;IACW,SAAS,GAA1B,MAAM;IACJ,MAAM,CA4DlB;AAED;;;;;;;;;;GAUG;AACH;IAP+B,KAAK;IACT,SAAS,EAAzB,MAAM;IACY,gBAAgB,EAAlC,MAAM,EAAE;IACmB,kBAAkB,EAA7C,UAAU,MAAM,CAAC;IACQ,MAAM,GAA/B,cAAc;IACZ,MAAM,CAsDlB;AAED;;;;;;;;;;;;;;;GAeG;AACH,6KAFa;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAC,CAiJjE;AAED;;;;;;;;;;GAUG;AACH;IAP+B,KAAK;IACT,IAAI,EAApB,MAAM;IACU,UAAU,EAA1B,MAAM;IACU,QAAQ,EAAxB,MAAM;IACY,gBAAgB,EAAlC,MAAM,EAAE;IACN,MAAM,CAoClB;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qUAFa;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAC,CAwN7D;AAED;;;;;;;;GAQG;AACH,+EAHW,UAAU,MAAM,CAAC,GACf;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAC,CAe/E;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH;IAtB+B,KAAK;IACT,OAAO,EAAvB,MAAM;IACkB,QAAQ;IACd,QAAQ,EAA1B,MAAM,EAAE;IACQ,aAAa,EAA7B,MAAM;IACU,aAAa,EAA7B,MAAM;IACuB,MAAM;IACnB,wBAAwB,EAAxC,MAAM;IACU,oBAAoB,EAApC,MAAM;IACU,kBAAkB,EAAlC,MAAM;IACU,eAAe,EAA/B,MAAM;IACU,eAAe,EAA/B,MAAM;IACU,oBAAoB,EAApC,MAAM;IAC6B,sBAAsB,EAAzD;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC;IAGU,sBAAsB,EAAzD,yBAAyB;IACA,MAAM,GAA/B,cAAc;IACiD,aAAa,GAA5E,OAAO,wBAAwB,EAAE,iBAAiB,EAAE;IAElD,MAAM,CAiTlB;+BAx9B8B,qBAAqB;0CA9BV,uCAAuC"}
@@ -724,6 +724,9 @@ export function graph_rasterize_meshes_transparent_avboit({
724
724
  viewport,
725
725
  depth_texture,
726
726
  color_texture,
727
+ normal_texture,
728
+ hzb_texture,
729
+ environment_texture,
727
730
  limits,
728
731
  light_cluster_parameters,
729
732
  light_cluster_lookup,
@@ -809,7 +812,7 @@ export function graph_rasterize_meshes_transparent_avboit({
809
812
  const primitive_front = construct_primitive_state(ShadeDrawMode.Triangles, ShadeDrawSide.Front);
810
813
  const primitive_double = construct_primitive_state(ShadeDrawMode.Triangles, ShadeDrawSide.Double);
811
814
 
812
- const gr_hzb = graph_import_texture(graph, view_ctx.hierarchical_z_buffer.texture);
815
+ const gr_hzb = hzb_texture ?? graph_import_texture(graph, view_ctx.hierarchical_z_buffer.texture);
813
816
  const gr_camera = graph_import_buffer(graph, view_ctx.camera.buffer.buffer);
814
817
 
815
818
  const voxel_resolution = avboit_voxel_resolution(view_ctx.resolution);
@@ -819,6 +822,22 @@ export function graph_rasterize_meshes_transparent_avboit({
819
822
  const camera = view_ctx.camera.camera;
820
823
  const cluster_parameters = avboit_build_depth_curve(camera.near, camera.far);
821
824
 
825
+ // A background producer transports only immutable opaque radiance. Reject ambiguity before
826
+ // recording any preparation rather than letting channel registration order choose a winner.
827
+ const preparers = side_channels.filter(channel => typeof channel.avboit_prepare === "function");
828
+ if (preparers.length > 1) {
829
+ throw new Error("AVBOIT supports one refractive background producer per view");
830
+ }
831
+ let background_color = color_texture;
832
+ for (const channel of preparers) {
833
+ const prepared = channel.avboit_prepare({ graph, view_ctx, camera: gr_camera, color_texture,
834
+ depth_texture, normal_texture, hzb_texture: gr_hzb, environment_texture });
835
+ if (prepared?.background_color !== undefined) {
836
+ assert.isNonNegativeInteger(prepared.background_color, 'prepared.background_color');
837
+ background_color = prepared.background_color;
838
+ }
839
+ }
840
+
822
841
  // Draw artifacts (shared with MBOIT)
823
842
  // ======
824
843
 
@@ -992,7 +1011,7 @@ export function graph_rasterize_meshes_transparent_avboit({
992
1011
  shader: shader_avboit_resolve,
993
1012
  output_resolution: view_ctx.resolution,
994
1013
  inputs: {
995
- tScene: color_texture,
1014
+ tScene: background_color,
996
1015
  tColor: accumulators.color,
997
1016
  tNorm: accumulators.norm,
998
1017
  tExtinction: accumulators.extinction,
@@ -1 +1 @@
1
- {"version":3,"file":"shader_avboit_resolve.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/rasterize/native/avboit/shader_avboit_resolve.js"],"names":[],"mappings":"AA4EA,gDAUE;4BApF0B,gCAAgC"}
1
+ {"version":3,"file":"shader_avboit_resolve.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/rasterize/native/avboit/shader_avboit_resolve.js"],"names":[],"mappings":"AAwEA,gDAUE;4BAhF0B,gCAAgC"}
@@ -3,6 +3,7 @@ import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
3
3
  import { ImageShader } from "../../../shader/ImageShader.js";
4
4
  import { ShaderResourceSetDescriptor } from "../../../shader/resource/ShaderResourceSetDescriptor.js";
5
5
  import { ShaderDescriptor } from "../../../shader/ShaderDescriptor.js";
6
+ import { chunk_avboit_renormalization } from "./chunk_avboit_renormalization.js";
6
7
 
7
8
  const resources = new ShaderResourceSetDescriptor();
8
9
  resources.createGroup()
@@ -19,7 +20,7 @@ resources.createGroup()
19
20
  *
20
21
  * ```
21
22
  * T_total = exp(-Σ extinction)
22
- * norm = Σ norm > ε ? (1 - T_total) / Σ norm : 0
23
+ * norm = Σ norm > 0 ? stable_lost_throughput(Σ extinction) / Σ norm : 0
23
24
  * out = scene × T_total + Σ color × norm + Σ emission
24
25
  * ```
25
26
  *
@@ -58,19 +59,14 @@ fn main(
58
59
  let total_transmittance = exp(-accum_extinction);
59
60
 
60
61
  // sum of (1 - T_self) * T at each fragment; zero where nothing transparent was drawn
61
- let safe = accum_norm > vec3<f32>(1e-4);
62
- let renormalization = select(
63
- vec3<f32>(0.0),
64
- (vec3<f32>(1.0) - total_transmittance) / max(accum_norm, vec3<f32>(1e-4)),
65
- safe
66
- );
62
+ let renormalization = avboit_renormalization(accum_extinction, accum_norm);
67
63
 
68
64
  let transparent = accum_color * renormalization;
69
65
 
70
66
  return vec4<f32>(scene.rgb * total_transmittance + transparent + accum_emission, scene.a);
71
67
  }
72
68
  `, [
73
- chunk_is_nan
69
+ chunk_is_nan, chunk_avboit_renormalization
74
70
  ]
75
71
  )
76
72
 
@@ -1 +1 @@
1
- {"version":3,"file":"shader_bvh_extract_instance_leaves.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/scene/shader_bvh_extract_instance_leaves.js"],"names":[],"mappings":"AAUA,4CAA6C;AAkH7C;;;;;;;;;;;;;;;;;GAiBG;AACH,iDAFU,aAAa,CAMpB;8BA7I2B,4BAA4B"}
1
+ {"version":3,"file":"shader_bvh_extract_instance_leaves.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/scene/shader_bvh_extract_instance_leaves.js"],"names":[],"mappings":"AAWA,4CAA6C;AAmH7C;;;;;;;;;;;;;;;;;GAiBG;AACH,iDAFU,aAAa,CAMpB;8BA9I2B,4BAA4B"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Atomic f32 addition over a read-write storage atomic<u32> cell containing f32 bits.
3
+ *
4
+ * Each compare-exchange attempt adds to the current float value and writes the sum
5
+ * as plain f32 bits. Failed or spurious exchanges retry from a fresh atomic load,
6
+ * so concurrent additions are not lost.
7
+ *
8
+ * @type {CodeChunk}
9
+ */
10
+ export const chunk_atomic_add_f32_storage: CodeChunk;
11
+ import { CodeChunk } from "../../compiler/CodeChunk.js";
12
+ //# sourceMappingURL=chunk_atomic_add_f32_storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk_atomic_add_f32_storage.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/shader/chunk/atomic/chunk_atomic_add_f32_storage.js"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,2CAFU,SAAS,CAehB;0BAxBuB,6BAA6B"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Atomic f32 maximum over a read-write storage atomic<u32> cell containing f32 bits.
3
+ *
4
+ * Compare-exchange retries keep the cell in plain f32 representation. If the stored
5
+ * value already bounds the contribution, the function exits without an exchange.
6
+ * Infinities are supported; the stored value and contribution must not be NaN.
7
+ *
8
+ * @type {CodeChunk}
9
+ */
10
+ export const chunk_atomic_max_f32_storage: CodeChunk;
11
+ import { CodeChunk } from "../../compiler/CodeChunk.js";
12
+ //# sourceMappingURL=chunk_atomic_max_f32_storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk_atomic_max_f32_storage.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/shader/chunk/atomic/chunk_atomic_max_f32_storage.js"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,2CAFU,SAAS,CAkBhB;0BA3BuB,6BAA6B"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Atomic f32 minimum over a read-write storage atomic<u32> cell containing f32 bits.
3
+ *
4
+ * Compare-exchange retries keep the cell in plain f32 representation. If the stored
5
+ * value already bounds the contribution, the function exits without an exchange.
6
+ * Infinities are supported; the stored value and contribution must not be NaN.
7
+ *
8
+ * @type {CodeChunk}
9
+ */
10
+ export const chunk_atomic_min_f32_storage: CodeChunk;
11
+ import { CodeChunk } from "../../compiler/CodeChunk.js";
12
+ //# sourceMappingURL=chunk_atomic_min_f32_storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk_atomic_min_f32_storage.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/shader/chunk/atomic/chunk_atomic_min_f32_storage.js"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,2CAFU,SAAS,CAkBhB;0BA3BuB,6BAA6B"}
@@ -2,6 +2,6 @@
2
2
  * Ported from meep
3
3
  * @type {CodeChunk}
4
4
  */
5
- export const plane_ray_raycast: CodeChunk;
5
+ export const chunk_plane_ray_raycast: CodeChunk;
6
6
  import { CodeChunk } from "../../../compiler/CodeChunk.js";
7
- //# sourceMappingURL=plane_ray_raycast.d.ts.map
7
+ //# sourceMappingURL=chunk_plane_ray_raycast.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk_plane_ray_raycast.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/shader/chunk/geometry/plane/chunk_plane_ray_raycast.js"],"names":[],"mappings":"AAEA;;;GAGG;AACH,sCAFU,SAAS,CA2Cf;0BA/CsB,gCAAgC"}
@@ -0,0 +1,4 @@
1
+ /** Mayer et al. 2026 tangent-plane refinement. All arithmetic is in matrix view space. */
2
+ export const chunk_screen_space_newton_ray: CodeChunk;
3
+ import { CodeChunk } from "../../compiler/CodeChunk.js";
4
+ //# sourceMappingURL=chunk_screen_space_newton_ray.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk_screen_space_newton_ray.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/shader/chunk/screen_space/chunk_screen_space_newton_ray.js"],"names":[],"mappings":"AAWA,0FAA0F;AAC1F,sDAwFkF;0BApGxD,6BAA6B"}