@woosh/meep-engine 3.35.0 → 3.37.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 (103) hide show
  1. package/package.json +1 -1
  2. package/src/engine/Engine.d.ts +2 -0
  3. package/src/engine/Engine.d.ts.map +1 -1
  4. package/src/engine/Engine.js +5 -1
  5. package/src/engine/input/devices/XRInputDevice.d.ts +91 -0
  6. package/src/engine/input/devices/XRInputDevice.d.ts.map +1 -0
  7. package/src/engine/input/devices/XRInputDevice.js +479 -0
  8. package/src/engine/input/devices/xr/XRGamepadMapping.d.ts +14 -0
  9. package/src/engine/input/devices/xr/XRGamepadMapping.d.ts.map +1 -0
  10. package/src/engine/input/devices/xr/XRGamepadMapping.js +9 -0
  11. package/src/engine/input/devices/xr/XRHandedness.d.ts +15 -0
  12. package/src/engine/input/devices/xr/XRHandedness.d.ts.map +1 -0
  13. package/src/engine/input/devices/xr/XRHandedness.js +10 -0
  14. package/src/engine/input/devices/xr/XRInputAction.d.ts +50 -0
  15. package/src/engine/input/devices/xr/XRInputAction.d.ts.map +1 -0
  16. package/src/engine/input/devices/xr/XRInputAction.js +116 -0
  17. package/src/engine/input/devices/xr/XRInputButton.d.ts +26 -0
  18. package/src/engine/input/devices/xr/XRInputButton.d.ts.map +1 -0
  19. package/src/engine/input/devices/xr/XRInputButton.js +53 -0
  20. package/src/engine/input/devices/xr/XRInputCoordinates.d.ts +23 -0
  21. package/src/engine/input/devices/xr/XRInputCoordinates.d.ts.map +1 -0
  22. package/src/engine/input/devices/xr/XRInputCoordinates.js +35 -0
  23. package/src/engine/input/devices/xr/XRInputHandle.d.ts +93 -0
  24. package/src/engine/input/devices/xr/XRInputHandle.d.ts.map +1 -0
  25. package/src/engine/input/devices/xr/XRInputHandle.js +268 -0
  26. package/src/engine/input/devices/xr/XRInputPose.d.ts +59 -0
  27. package/src/engine/input/devices/xr/XRInputPose.d.ts.map +1 -0
  28. package/src/engine/input/devices/xr/XRInputPose.js +77 -0
  29. package/src/engine/input/devices/xr/XRInputTypes.d.ts +76 -0
  30. package/src/engine/input/devices/xr/XRInputTypes.d.ts.map +1 -0
  31. package/src/engine/input/devices/xr/XRInputTypes.js +31 -0
  32. package/src/engine/input/devices/xr/XRInputValueSource.d.ts +11 -0
  33. package/src/engine/input/devices/xr/XRInputValueSource.d.ts.map +1 -0
  34. package/src/engine/input/devices/xr/XRInputValueSource.js +11 -0
  35. package/src/engine/input/devices/xr/XRTargetRayMode.d.ts +17 -0
  36. package/src/engine/input/devices/xr/XRTargetRayMode.d.ts.map +1 -0
  37. package/src/engine/input/devices/xr/XRTargetRayMode.js +12 -0
  38. package/src/engine/input/devices/xr/XRVisibilityState.d.ts +15 -0
  39. package/src/engine/input/devices/xr/XRVisibilityState.d.ts.map +1 -0
  40. package/src/engine/input/devices/xr/XRVisibilityState.js +10 -0
  41. package/src/engine/input/ecs/ism/coordinate/InputCoordinateChannel.d.ts +15 -1
  42. package/src/engine/input/ecs/ism/coordinate/InputCoordinateChannel.d.ts.map +1 -1
  43. package/src/engine/input/ecs/ism/coordinate/InputCoordinateChannel.js +9 -0
  44. package/src/engine/input/ecs/ism/coordinate/InputCoordinateDevice.d.ts +17 -4
  45. package/src/engine/input/ecs/ism/coordinate/InputCoordinateDevice.d.ts.map +1 -1
  46. package/src/engine/input/ecs/ism/coordinate/InputCoordinateDevice.js +26 -0
  47. package/src/engine/input/ecs/ism/coordinate/InputCoordinateSwitches.d.ts +17 -2
  48. package/src/engine/input/ecs/ism/coordinate/InputCoordinateSwitches.d.ts.map +1 -1
  49. package/src/engine/input/ecs/ism/device/GamepadInputDeviceAdapter.d.ts +5 -0
  50. package/src/engine/input/ecs/ism/device/GamepadInputDeviceAdapter.d.ts.map +1 -1
  51. package/src/engine/input/ecs/ism/device/InputDeviceAdapter.d.ts +2 -0
  52. package/src/engine/input/ecs/ism/device/InputDeviceAdapter.d.ts.map +1 -1
  53. package/src/engine/input/ecs/ism/device/InputDeviceAdapter.js +2 -0
  54. package/src/engine/input/ecs/ism/device/KeyboardInputDeviceAdapter.d.ts +7 -0
  55. package/src/engine/input/ecs/ism/device/KeyboardInputDeviceAdapter.d.ts.map +1 -1
  56. package/src/engine/input/ecs/ism/device/ManualInputDeviceAdapter.d.ts +5 -0
  57. package/src/engine/input/ecs/ism/device/ManualInputDeviceAdapter.d.ts.map +1 -1
  58. package/src/engine/input/ecs/ism/device/PointerInputDeviceAdapter.d.ts +5 -0
  59. package/src/engine/input/ecs/ism/device/PointerInputDeviceAdapter.d.ts.map +1 -1
  60. package/src/engine/input/ecs/ism/device/XRInputDeviceAdapter.d.ts +30 -0
  61. package/src/engine/input/ecs/ism/device/XRInputDeviceAdapter.d.ts.map +1 -0
  62. package/src/engine/input/ecs/ism/device/XRInputDeviceAdapter.js +87 -0
  63. package/src/engine/input/ecs/ism/device/XR_INPUT_DEVICE_IDS.d.ts +15 -0
  64. package/src/engine/input/ecs/ism/device/XR_INPUT_DEVICE_IDS.d.ts.map +1 -0
  65. package/src/engine/input/ecs/ism/device/XR_INPUT_DEVICE_IDS.js +22 -0
  66. package/src/engine/input/ecs/ism/trigger/InputTrigger.d.ts +11 -1
  67. package/src/engine/input/ecs/ism/trigger/InputTrigger.d.ts.map +1 -1
  68. package/src/engine/input/ecs/ism/trigger/InputTrigger.js +7 -0
  69. package/src/engine/input/ecs/ism/trigger/InputTriggerChord.d.ts +16 -2
  70. package/src/engine/input/ecs/ism/trigger/InputTriggerChord.d.ts.map +1 -1
  71. package/src/engine/input/ecs/ism/trigger/InputTriggerHold.d.ts +22 -2
  72. package/src/engine/input/ecs/ism/trigger/InputTriggerHold.d.ts.map +1 -1
  73. package/src/engine/input/ecs/ism/trigger/InputTriggerRelease.d.ts +16 -2
  74. package/src/engine/input/ecs/ism/trigger/InputTriggerRelease.d.ts.map +1 -1
  75. package/src/engine/input/ecs/ism/trigger/InputTriggerSequence.d.ts +24 -4
  76. package/src/engine/input/ecs/ism/trigger/InputTriggerSequence.d.ts.map +1 -1
  77. package/src/engine/input/ecs/ism/trigger/InputTriggerSwitch.d.ts +6 -8
  78. package/src/engine/input/ecs/ism/trigger/InputTriggerSwitch.d.ts.map +1 -1
  79. package/src/engine/input/ecs/ism/trigger/InputTriggerSwitch.js +5 -0
  80. package/src/engine/input/ecs/ism/trigger/InputTriggerXRButton.d.ts +15 -0
  81. package/src/engine/input/ecs/ism/trigger/InputTriggerXRButton.d.ts.map +1 -0
  82. package/src/engine/input/ecs/ism/trigger/InputTriggerXRButton.js +25 -0
  83. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  84. package/src/shade/renderer/animation/chunk_pose_accumulator.js +14 -24
  85. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.js +16 -15
  86. package/src/shade/renderer/deferred/indirect/chunk_lpv_sample_light.js +1 -1
  87. package/src/shade/renderer/gpu_primitive/bvh/GPU_BVH_BUILD_PLAN.md +1123 -1122
  88. package/src/shade/renderer/gpu_primitive/bvh/PHASE1_HANDOVER.md +202 -201
  89. package/src/shade/renderer/light/environment/chunk_roughness_to_mip_ratio.js +24 -0
  90. package/src/shade/renderer/light/environment/chunk_sphere_probe_roughness_to_lod.js +2 -25
  91. package/src/shade/renderer/light/environment/shader_project_environment_sh.d.ts +2 -2
  92. package/src/shade/renderer/light/environment/shader_project_environment_sh.d.ts.map +1 -1
  93. package/src/shade/renderer/light/environment/shader_project_environment_sh.js +50 -19
  94. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  95. package/src/shade/renderer/particles/DESIGN.md +1 -1
  96. package/src/shade/renderer/particles/bounds/chunk_particle_bounds.js +10 -9
  97. package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.js +10 -8
  98. package/src/shade/renderer/shader/chunk/atomic/chunk_atomic_add_f32_storage.js +25 -0
  99. package/src/shade/renderer/shader/chunk/atomic/chunk_atomic_max_f32_storage.js +28 -0
  100. package/src/shade/renderer/shader/chunk/atomic/chunk_atomic_min_f32_storage.js +28 -0
  101. package/src/shade/renderer/shader/chunk/geometry/plane/{plane_ray_raycast.js → chunk_plane_ray_raycast.js} +1 -1
  102. package/src/shade/renderer/shadow/map/csm/shader/shader_csm_caster_range.js +3 -3
  103. package/src/shade/renderer/animation/skinning/bounds_refresh/chunk_aabb_atomic_f32.js +0 -59
@@ -3,6 +3,11 @@ import { InputSource } from "../InputSource.js";
3
3
  import { InputTrigger } from "./InputTrigger.js";
4
4
  import { InputTriggerType } from "./InputTriggerType.js";
5
5
 
6
+ /**
7
+ * @typedef {import('../InputSourceTable.js').InputSourceTable} InputSourceTable
8
+ * @typedef {import('../../../../../core/binary/BitSet.js').BitSet} BitSet
9
+ */
10
+
6
11
  /**
7
12
  * True while one switch is held.
8
13
  *
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Trigger on a native XR button's pressed or touched switch.
3
+ * Subscribe to XRInputAction.completed for semantic select/squeeze completion.
4
+ */
5
+ export class InputTriggerXRButton extends InputTriggerSwitch {
6
+ /**
7
+ * @param {'left'|'right'|'none'} handedness
8
+ * @param {number} index Native button index.
9
+ * @param {boolean} [touched=false] True selects touched; false selects pressed.
10
+ * @returns {InputTriggerXRButton}
11
+ */
12
+ static from(handedness: 'left' | 'right' | 'none', index: number, touched?: boolean): InputTriggerXRButton;
13
+ }
14
+ import { InputTriggerSwitch } from "./InputTriggerSwitch.js";
15
+ //# sourceMappingURL=InputTriggerXRButton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InputTriggerXRButton.d.ts","sourceRoot":"","sources":["../../../../../../../src/engine/input/ecs/ism/trigger/InputTriggerXRButton.js"],"names":[],"mappings":"AAKA;;;GAGG;AACH;IACI;;;;;OAKG;IACH,wBALW,MAAM,GAAC,OAAO,GAAC,MAAM,SACrB,MAAM,YACN,OAAO,GACL,oBAAoB,CAShC;CACJ;mCArBkC,yBAAyB"}
@@ -0,0 +1,25 @@
1
+ import { assert } from "../../../../../core/assert.js";
2
+ import { xr_input_device_id } from "../device/XR_INPUT_DEVICE_IDS.js";
3
+ import { InputSource } from "../InputSource.js";
4
+ import { InputTriggerSwitch } from "./InputTriggerSwitch.js";
5
+
6
+ /**
7
+ * Trigger on a native XR button's pressed or touched switch.
8
+ * Subscribe to XRInputAction.completed for semantic select/squeeze completion.
9
+ */
10
+ export class InputTriggerXRButton extends InputTriggerSwitch {
11
+ /**
12
+ * @param {'left'|'right'|'none'} handedness
13
+ * @param {number} index Native button index.
14
+ * @param {boolean} [touched=false] True selects touched; false selects pressed.
15
+ * @returns {InputTriggerXRButton}
16
+ */
17
+ static from(handedness, index, touched = false) {
18
+ assert.isNonNegativeInteger(index, 'index');
19
+ assert.isBoolean(touched, 'touched');
20
+
21
+ const result = new InputTriggerXRButton();
22
+ result.source = InputSource.from(xr_input_device_id(handedness), index * 2 + (touched ? 1 : 0));
23
+ return result;
24
+ }
25
+ }
@@ -64,11 +64,11 @@ export class FluidObstacleSystem extends System<any> {
64
64
  /**
65
65
  * @param {FluidComponent} fluid
66
66
  */
67
- static "__#413@#refresh_masks"(fluid: FluidComponent): void;
67
+ static "__#418@#refresh_masks"(fluid: FluidComponent): void;
68
68
  /**
69
69
  * @param {FluidComponent} fluid
70
70
  */
71
- static "__#413@#clear_field"(fluid: FluidComponent): void;
71
+ static "__#418@#clear_field"(fluid: FluidComponent): void;
72
72
  /**
73
73
  * Mark every cell of `fluid` whose centre lies within `inflation` of the
74
74
  * posed shape as solid. Iteration is clipped to the shape's world AABB
@@ -80,7 +80,7 @@ export class FluidObstacleSystem extends System<any> {
80
80
  * @param {number} inflation world-units SDF threshold
81
81
  * @param {Float64Array} point length-3 scratch
82
82
  */
83
- static "__#413@#voxelize"(fluid: FluidComponent, posed: PosedShape3D, aabb: Float64Array, inflation: number, point: Float64Array): void;
83
+ static "__#418@#voxelize"(fluid: FluidComponent, posed: PosedShape3D, aabb: Float64Array, inflation: number, point: Float64Array): void;
84
84
  /**
85
85
  * Write the obstacle's translation velocity onto every face of every cell
86
86
  * it voxelized — the moving-wall boundary condition. Runs AFTER the mask
@@ -100,7 +100,7 @@ export class FluidObstacleSystem extends System<any> {
100
100
  * @param {number} wvy
101
101
  * @param {number} wvz
102
102
  */
103
- static "__#413@#stamp_wall_velocity"(fluid: FluidComponent, posed: PosedShape3D, aabb: Float64Array, inflation: number, point: Float64Array, wvx: number, wvy: number, wvz: number): void;
103
+ static "__#418@#stamp_wall_velocity"(fluid: FluidComponent, posed: PosedShape3D, aabb: Float64Array, inflation: number, point: Float64Array, wvx: number, wvy: number, wvz: number): void;
104
104
  constructor();
105
105
  dependencies: (typeof FluidObstacle)[];
106
106
  components_used: (ResourceAccessSpecification<typeof Transform64> | ResourceAccessSpecification<typeof RigidBody> | ResourceAccessSpecification<typeof Collider> | ResourceAccessSpecification<typeof FluidComponent> | ResourceAccessSpecification<typeof FluidObstacle>)[];
@@ -1,4 +1,5 @@
1
1
  import { CodeChunk } from "../shader/compiler/CodeChunk.js";
2
+ import { chunk_atomic_add_f32_storage } from "../shader/chunk/atomic/chunk_atomic_add_f32_storage.js";
2
3
  import {
3
4
  POSE_ACCUMULATOR_OFFSET_DIRTY,
4
5
  POSE_ACCUMULATOR_OFFSET_ROTATION,
@@ -20,9 +21,8 @@ import {
20
21
  * The importing shader binds:
21
22
  * `var<storage, read_write> pose_accumulator: array<atomic<u32>>;`
22
23
  *
23
- * f32 atomic-add isn't native to WGSL. We implement it as a
24
- * `atomicCompareExchangeWeak` spin: load the current u32, reinterpret as
25
- * f32, add the contribution, reinterpret back, CAS. Contention is
24
+ * f32 atomic-add isn't native to WGSL. The shared `atomic_add_f32_storage`
25
+ * helper uses a compare-exchange retry loop over plain f32 bits. Contention is
26
26
  * typically low (each `(row, channel)` has 1–2 contributors in a
27
27
  * normalised blend), so the spin rarely loops more than once.
28
28
  *
@@ -55,29 +55,19 @@ fn pose_accumulator_slot_base(row: u32) -> u32 {
55
55
  return row * POSE_ACCUMULATOR_STRIDE;
56
56
  }
57
57
 
58
- fn pose_accumulator_atomic_add_f32(word_index: u32, value: f32) {
59
- loop {
60
- let old_u = atomicLoad(&pose_accumulator[word_index]);
61
- let new_f = bitcast<f32>(old_u) + value;
62
- let new_u = bitcast<u32>(new_f);
63
- let result = atomicCompareExchangeWeak(&pose_accumulator[word_index], old_u, new_u);
64
- if result.exchanged { break; }
65
- }
66
- }
67
-
68
58
  fn pose_accumulator_add_translation(row: u32, value: vec3<f32>, mask: u32) {
69
59
  let base = pose_accumulator_slot_base(row) + POSE_OFFSET_TRANSLATION;
70
60
  var dirty_bits: u32 = 0u;
71
61
  if (mask & 0x1u) != 0u {
72
- pose_accumulator_atomic_add_f32(base + 0u, value.x);
62
+ atomic_add_f32_storage(&pose_accumulator[base + 0u], value.x);
73
63
  dirty_bits |= POSE_DIRTY_TX;
74
64
  }
75
65
  if (mask & 0x2u) != 0u {
76
- pose_accumulator_atomic_add_f32(base + 1u, value.y);
66
+ atomic_add_f32_storage(&pose_accumulator[base + 1u], value.y);
77
67
  dirty_bits |= POSE_DIRTY_TY;
78
68
  }
79
69
  if (mask & 0x4u) != 0u {
80
- pose_accumulator_atomic_add_f32(base + 2u, value.z);
70
+ atomic_add_f32_storage(&pose_accumulator[base + 2u], value.z);
81
71
  dirty_bits |= POSE_DIRTY_TZ;
82
72
  }
83
73
  if dirty_bits != 0u {
@@ -106,10 +96,10 @@ fn pose_accumulator_add_rotation(row: u32, value: vec4<f32>, mask: u32, weight:
106
96
  let w = select(weight, value.w, (mask & 0x8u) != 0u);
107
97
 
108
98
  let base = pose_accumulator_slot_base(row) + POSE_OFFSET_ROTATION;
109
- pose_accumulator_atomic_add_f32(base + 0u, value.x);
110
- pose_accumulator_atomic_add_f32(base + 1u, value.y);
111
- pose_accumulator_atomic_add_f32(base + 2u, value.z);
112
- pose_accumulator_atomic_add_f32(base + 3u, w);
99
+ atomic_add_f32_storage(&pose_accumulator[base + 0u], value.x);
100
+ atomic_add_f32_storage(&pose_accumulator[base + 1u], value.y);
101
+ atomic_add_f32_storage(&pose_accumulator[base + 2u], value.z);
102
+ atomic_add_f32_storage(&pose_accumulator[base + 3u], w);
113
103
  atomicOr(&pose_accumulator[pose_accumulator_slot_base(row) + POSE_OFFSET_DIRTY], POSE_DIRTY_R);
114
104
  }
115
105
 
@@ -117,19 +107,19 @@ fn pose_accumulator_add_scale(row: u32, value: vec3<f32>, mask: u32) {
117
107
  let base = pose_accumulator_slot_base(row) + POSE_OFFSET_SCALE;
118
108
  var dirty_bits: u32 = 0u;
119
109
  if (mask & 0x1u) != 0u {
120
- pose_accumulator_atomic_add_f32(base + 0u, value.x);
110
+ atomic_add_f32_storage(&pose_accumulator[base + 0u], value.x);
121
111
  dirty_bits |= POSE_DIRTY_SX;
122
112
  }
123
113
  if (mask & 0x2u) != 0u {
124
- pose_accumulator_atomic_add_f32(base + 1u, value.y);
114
+ atomic_add_f32_storage(&pose_accumulator[base + 1u], value.y);
125
115
  dirty_bits |= POSE_DIRTY_SY;
126
116
  }
127
117
  if (mask & 0x4u) != 0u {
128
- pose_accumulator_atomic_add_f32(base + 2u, value.z);
118
+ atomic_add_f32_storage(&pose_accumulator[base + 2u], value.z);
129
119
  dirty_bits |= POSE_DIRTY_SZ;
130
120
  }
131
121
  if dirty_bits != 0u {
132
122
  atomicOr(&pose_accumulator[pose_accumulator_slot_base(row) + POSE_OFFSET_DIRTY], dirty_bits);
133
123
  }
134
124
  }
135
- `);
125
+ `, [chunk_atomic_add_f32_storage]);
@@ -6,7 +6,8 @@ import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
6
6
  import { ComputeShader } from "../../../shader/ComputeShader.js";
7
7
  import { ShaderResourceSetDescriptor } from "../../../shader/resource/ShaderResourceSetDescriptor.js";
8
8
  import { SKINNING_BINDING_STRUCT } from "../SKINNING_BINDING_STRUCT.js";
9
- import { chunk_aabb_atomic_f32 } from "./chunk_aabb_atomic_f32.js";
9
+ import { chunk_atomic_min_f32_storage } from "../../../shader/chunk/atomic/chunk_atomic_min_f32_storage.js";
10
+ import { chunk_atomic_max_f32_storage } from "../../../shader/chunk/atomic/chunk_atomic_max_f32_storage.js";
10
11
 
11
12
  /**
12
13
  * Workgroup size — also the per-meshlet vertex stride. One thread per
@@ -113,7 +114,7 @@ fn main(
113
114
  // Note that the storage sentinels in \`meshlet.bounds_box\` and
114
115
  // \`geometry.bounding_box\` ARE true ±inf — the scatter pass
115
116
  // writes the u32 bit pattern directly via \`atomicStore\`, no
116
- // const-fold involved, and \`aabb_atomic_min_f32\` bitcasts
117
+ // const-fold involved, and \`atomic_min_f32_storage\` bitcasts
117
118
  // back to f32 at runtime where ±inf is a valid value.
118
119
  var thread_min = vec3<f32>( 3.4028234e38);
119
120
  var thread_max = vec3<f32>(-3.4028234e38);
@@ -164,23 +165,23 @@ fn main(
164
165
  let final_max = wg_max[0];
165
166
 
166
167
  let m_bounds_base = m_base_words + MESHLET_BOUNDS_OFFSET;
167
- aabb_atomic_min_f32(&meshlet_metadata_atomic[m_bounds_base + 0u], final_min.x);
168
- aabb_atomic_min_f32(&meshlet_metadata_atomic[m_bounds_base + 1u], final_min.y);
169
- aabb_atomic_min_f32(&meshlet_metadata_atomic[m_bounds_base + 2u], final_min.z);
170
- aabb_atomic_max_f32(&meshlet_metadata_atomic[m_bounds_base + 3u], final_max.x);
171
- aabb_atomic_max_f32(&meshlet_metadata_atomic[m_bounds_base + 4u], final_max.y);
172
- aabb_atomic_max_f32(&meshlet_metadata_atomic[m_bounds_base + 5u], final_max.z);
168
+ atomic_min_f32_storage(&meshlet_metadata_atomic[m_bounds_base + 0u], final_min.x);
169
+ atomic_min_f32_storage(&meshlet_metadata_atomic[m_bounds_base + 1u], final_min.y);
170
+ atomic_min_f32_storage(&meshlet_metadata_atomic[m_bounds_base + 2u], final_min.z);
171
+ atomic_max_f32_storage(&meshlet_metadata_atomic[m_bounds_base + 3u], final_max.x);
172
+ atomic_max_f32_storage(&meshlet_metadata_atomic[m_bounds_base + 4u], final_max.y);
173
+ atomic_max_f32_storage(&meshlet_metadata_atomic[m_bounds_base + 5u], final_max.z);
173
174
 
174
175
  let g_base = binding.clone_geometry_index * GEOMETRY_STRIDE + GEOMETRY_BBOX_OFFSET;
175
- aabb_atomic_min_f32(&geometry_metadata_atomic[g_base + 0u], final_min.x);
176
- aabb_atomic_min_f32(&geometry_metadata_atomic[g_base + 1u], final_min.y);
177
- aabb_atomic_min_f32(&geometry_metadata_atomic[g_base + 2u], final_min.z);
178
- aabb_atomic_max_f32(&geometry_metadata_atomic[g_base + 3u], final_max.x);
179
- aabb_atomic_max_f32(&geometry_metadata_atomic[g_base + 4u], final_max.y);
180
- aabb_atomic_max_f32(&geometry_metadata_atomic[g_base + 5u], final_max.z);
176
+ atomic_min_f32_storage(&geometry_metadata_atomic[g_base + 0u], final_min.x);
177
+ atomic_min_f32_storage(&geometry_metadata_atomic[g_base + 1u], final_min.y);
178
+ atomic_min_f32_storage(&geometry_metadata_atomic[g_base + 2u], final_min.z);
179
+ atomic_max_f32_storage(&geometry_metadata_atomic[g_base + 3u], final_max.x);
180
+ atomic_max_f32_storage(&geometry_metadata_atomic[g_base + 4u], final_max.y);
181
+ atomic_max_f32_storage(&geometry_metadata_atomic[g_base + 5u], final_max.z);
181
182
  }
182
183
  }
183
- `, [chunk_aabb_atomic_f32]);
184
+ `, [chunk_atomic_min_f32_storage, chunk_atomic_max_f32_storage]);
184
185
 
185
186
  /**
186
187
  * Compute shader that reduces a clone meshlet's deformed vertex
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  chunk_lpv_mesh_interpolate_radiance_via_atlas
3
3
  } from "../../global_illumination/probe/octahedral/sample/chunk_lpv_mesh_interpolate_radiance_via_atlas.js";
4
- import { chunk_roughness_to_mip_ratio } from "../../light/environment/chunk_sphere_probe_roughness_to_lod.js";
4
+ import { chunk_roughness_to_mip_ratio } from "../../light/environment/chunk_roughness_to_mip_ratio.js";
5
5
 
6
6
  import {
7
7
  chunk_lpv_mesh_interpolate_probe_irradiance_pre