@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.
Files changed (169) 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/input/devices/XRInputDevice.d.ts +51 -23
  21. package/src/engine/input/devices/XRInputDevice.d.ts.map +1 -1
  22. package/src/engine/input/devices/XRInputDevice.js +145 -52
  23. package/src/engine/input/devices/xr/XRGamepadMapping.d.ts +14 -0
  24. package/src/engine/input/devices/xr/XRGamepadMapping.d.ts.map +1 -0
  25. package/src/engine/input/devices/xr/XRGamepadMapping.js +9 -0
  26. package/src/engine/input/devices/xr/XRHandedness.d.ts +15 -0
  27. package/src/engine/input/devices/xr/XRHandedness.d.ts.map +1 -0
  28. package/src/engine/input/devices/xr/XRHandedness.js +10 -0
  29. package/src/engine/input/devices/xr/XRInputAction.d.ts +24 -11
  30. package/src/engine/input/devices/xr/XRInputAction.d.ts.map +1 -1
  31. package/src/engine/input/devices/xr/XRInputAction.js +55 -24
  32. package/src/engine/input/devices/xr/XRInputButton.d.ts +7 -9
  33. package/src/engine/input/devices/xr/XRInputButton.d.ts.map +1 -1
  34. package/src/engine/input/devices/xr/XRInputButton.js +18 -8
  35. package/src/engine/input/devices/xr/XRInputCoordinates.d.ts +11 -3
  36. package/src/engine/input/devices/xr/XRInputCoordinates.d.ts.map +1 -1
  37. package/src/engine/input/devices/xr/XRInputCoordinates.js +17 -3
  38. package/src/engine/input/devices/xr/XRInputHandle.d.ts +41 -11
  39. package/src/engine/input/devices/xr/XRInputHandle.d.ts.map +1 -1
  40. package/src/engine/input/devices/xr/XRInputHandle.js +129 -32
  41. package/src/engine/input/devices/xr/XRInputPose.d.ts +41 -5
  42. package/src/engine/input/devices/xr/XRInputPose.d.ts.map +1 -1
  43. package/src/engine/input/devices/xr/XRInputPose.js +57 -16
  44. package/src/engine/input/devices/xr/XRInputTypes.d.ts +18 -18
  45. package/src/engine/input/devices/xr/XRInputTypes.js +3 -3
  46. package/src/engine/input/devices/xr/XRTargetRayMode.d.ts +17 -0
  47. package/src/engine/input/devices/xr/XRTargetRayMode.d.ts.map +1 -0
  48. package/src/engine/input/devices/xr/XRTargetRayMode.js +12 -0
  49. package/src/engine/input/devices/xr/XRVisibilityState.d.ts +15 -0
  50. package/src/engine/input/devices/xr/XRVisibilityState.d.ts.map +1 -0
  51. package/src/engine/input/devices/xr/XRVisibilityState.js +10 -0
  52. package/src/engine/input/ecs/ism/coordinate/InputCoordinateDevice.d.ts +3 -1
  53. package/src/engine/input/ecs/ism/coordinate/InputCoordinateDevice.d.ts.map +1 -1
  54. package/src/engine/input/ecs/ism/coordinate/InputCoordinateDevice.js +5 -1
  55. package/src/engine/input/ecs/ism/device/XRInputDeviceAdapter.d.ts +19 -5
  56. package/src/engine/input/ecs/ism/device/XRInputDeviceAdapter.d.ts.map +1 -1
  57. package/src/engine/input/ecs/ism/device/XRInputDeviceAdapter.js +42 -9
  58. package/src/engine/input/ecs/ism/device/XR_INPUT_DEVICE_IDS.d.ts +8 -2
  59. package/src/engine/input/ecs/ism/device/XR_INPUT_DEVICE_IDS.d.ts.map +1 -1
  60. package/src/engine/input/ecs/ism/device/XR_INPUT_DEVICE_IDS.js +19 -9
  61. package/src/engine/input/ecs/ism/trigger/InputTriggerXRButton.d.ts +10 -2
  62. package/src/engine/input/ecs/ism/trigger/InputTriggerXRButton.d.ts.map +1 -1
  63. package/src/engine/input/ecs/ism/trigger/InputTriggerXRButton.js +12 -2
  64. package/src/engine/physics/cloth/collider/ClothColliderIndex.d.ts +13 -14
  65. package/src/engine/physics/cloth/collider/ClothColliderIndex.d.ts.map +1 -1
  66. package/src/engine/physics/cloth/collider/ClothColliderIndex.js +137 -36
  67. package/src/engine/physics/cloth/collider/cloth_collider_bounds.d.ts +30 -0
  68. package/src/engine/physics/cloth/collider/cloth_collider_bounds.d.ts.map +1 -1
  69. package/src/engine/physics/cloth/collider/cloth_collider_bounds.js +33 -0
  70. package/src/engine/physics/cloth/ecs/ClothColliderFlags.js +2 -1
  71. package/src/engine/physics/cloth/ecs/ClothColliderSystem.d.ts +10 -1
  72. package/src/engine/physics/cloth/ecs/ClothColliderSystem.d.ts.map +1 -1
  73. package/src/engine/physics/cloth/ecs/ClothColliderSystem.js +36 -14
  74. package/src/engine/physics/cloth/ecs/ClothInstance.d.ts +15 -2
  75. package/src/engine/physics/cloth/ecs/ClothInstance.d.ts.map +1 -1
  76. package/src/engine/physics/cloth/ecs/ClothInstance.js +17 -2
  77. package/src/engine/physics/cloth/ecs/ClothWorld.d.ts.map +1 -1
  78. package/src/engine/physics/cloth/ecs/ClothWorld.js +19 -6
  79. package/src/engine/physics/cloth/ecs/cloth_gather_colliders.d.ts +18 -20
  80. package/src/engine/physics/cloth/ecs/cloth_gather_colliders.d.ts.map +1 -1
  81. package/src/engine/physics/cloth/ecs/cloth_gather_colliders.js +139 -89
  82. package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
  83. package/src/engine/physics/ecs/PhysicsSystem.js +32 -16
  84. package/src/shade/playground/water_refraction/README.md +149 -0
  85. package/src/shade/playground/water_refraction/index.html +42 -0
  86. package/src/shade/playground/water_refraction/main.d.ts +2 -0
  87. package/src/shade/playground/water_refraction/main.d.ts.map +1 -0
  88. package/src/shade/playground/water_refraction/main.js +201 -0
  89. package/src/shade/playground/water_refraction/world.d.ts +37 -0
  90. package/src/shade/playground/water_refraction/world.d.ts.map +1 -0
  91. package/src/shade/playground/water_refraction/world.js +137 -0
  92. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  93. package/src/shade/renderer/Renderer.js +4 -0
  94. package/src/shade/renderer/animation/chunk_pose_accumulator.d.ts +2 -3
  95. package/src/shade/renderer/animation/chunk_pose_accumulator.d.ts.map +1 -1
  96. package/src/shade/renderer/animation/chunk_pose_accumulator.js +14 -24
  97. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.d.ts.map +1 -1
  98. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.js +16 -15
  99. package/src/shade/renderer/deferred/indirect/chunk_lpv_sample_light.js +1 -1
  100. package/src/shade/renderer/gpu_primitive/bvh/GPU_BVH_BUILD_PLAN.md +1123 -1122
  101. package/src/shade/renderer/gpu_primitive/bvh/PHASE1_HANDOVER.md +202 -201
  102. package/src/shade/renderer/light/environment/chunk_roughness_to_mip_ratio.d.ts +8 -0
  103. package/src/shade/renderer/light/environment/chunk_roughness_to_mip_ratio.d.ts.map +1 -0
  104. package/src/shade/renderer/light/environment/chunk_roughness_to_mip_ratio.js +24 -0
  105. package/src/shade/renderer/light/environment/chunk_sphere_probe_roughness_to_lod.d.ts +0 -6
  106. package/src/shade/renderer/light/environment/chunk_sphere_probe_roughness_to_lod.d.ts.map +1 -1
  107. package/src/shade/renderer/light/environment/chunk_sphere_probe_roughness_to_lod.js +2 -25
  108. package/src/shade/renderer/light/environment/shader_project_environment_sh.d.ts +2 -2
  109. package/src/shade/renderer/light/environment/shader_project_environment_sh.d.ts.map +1 -1
  110. package/src/shade/renderer/light/environment/shader_project_environment_sh.js +50 -19
  111. package/src/shade/renderer/particles/DESIGN.md +1 -1
  112. package/src/shade/renderer/particles/bounds/chunk_particle_bounds.d.ts +1 -1
  113. package/src/shade/renderer/particles/bounds/chunk_particle_bounds.d.ts.map +1 -1
  114. package/src/shade/renderer/particles/bounds/chunk_particle_bounds.js +10 -9
  115. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts +17 -0
  116. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts.map +1 -1
  117. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.js +7 -0
  118. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_renormalization.d.ts +4 -0
  119. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_renormalization.d.ts.map +1 -0
  120. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_renormalization.js +11 -0
  121. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_rgb_contribution.d.ts +4 -0
  122. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_rgb_contribution.d.ts.map +1 -0
  123. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_rgb_contribution.js +19 -0
  124. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_splat_slice.d.ts.map +1 -1
  125. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_splat_slice.js +5 -3
  126. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_split_counts.d.ts +4 -0
  127. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_split_counts.d.ts.map +1 -0
  128. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_split_counts.js +8 -0
  129. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts +1 -1
  130. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts.map +1 -1
  131. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +21 -2
  132. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_resolve.d.ts.map +1 -1
  133. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_resolve.js +4 -8
  134. package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.d.ts.map +1 -1
  135. package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.js +10 -8
  136. package/src/shade/renderer/shader/chunk/atomic/chunk_atomic_add_f32_storage.d.ts +12 -0
  137. package/src/shade/renderer/shader/chunk/atomic/chunk_atomic_add_f32_storage.d.ts.map +1 -0
  138. package/src/shade/renderer/shader/chunk/atomic/chunk_atomic_add_f32_storage.js +25 -0
  139. package/src/shade/renderer/shader/chunk/atomic/chunk_atomic_max_f32_storage.d.ts +12 -0
  140. package/src/shade/renderer/shader/chunk/atomic/chunk_atomic_max_f32_storage.d.ts.map +1 -0
  141. package/src/shade/renderer/shader/chunk/atomic/chunk_atomic_max_f32_storage.js +28 -0
  142. package/src/shade/renderer/shader/chunk/atomic/chunk_atomic_min_f32_storage.d.ts +12 -0
  143. package/src/shade/renderer/shader/chunk/atomic/chunk_atomic_min_f32_storage.d.ts.map +1 -0
  144. package/src/shade/renderer/shader/chunk/atomic/chunk_atomic_min_f32_storage.js +28 -0
  145. package/src/shade/renderer/shader/chunk/geometry/plane/{plane_ray_raycast.d.ts → chunk_plane_ray_raycast.d.ts} +2 -2
  146. package/src/shade/renderer/shader/chunk/geometry/plane/chunk_plane_ray_raycast.d.ts.map +1 -0
  147. package/src/shade/renderer/shader/chunk/geometry/plane/{plane_ray_raycast.js → chunk_plane_ray_raycast.js} +1 -1
  148. package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_space_newton_ray.d.ts +4 -0
  149. package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_space_newton_ray.d.ts.map +1 -0
  150. package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_space_newton_ray.js +101 -0
  151. package/src/shade/renderer/shadow/map/csm/shader/shader_csm_caster_range.js +3 -3
  152. package/src/shade/renderer/water/GPUWaterRenderer.d.ts +62 -29
  153. package/src/shade/renderer/water/GPUWaterRenderer.d.ts.map +1 -1
  154. package/src/shade/renderer/water/GPUWaterRenderer.js +235 -147
  155. package/src/shade/renderer/water/chunk_water_transport.d.ts +5 -0
  156. package/src/shade/renderer/water/chunk_water_transport.d.ts.map +1 -0
  157. package/src/shade/renderer/water/chunk_water_transport.js +94 -0
  158. package/src/shade/renderer/water/shader_water.d.ts +9 -26
  159. package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
  160. package/src/shade/renderer/water/shader_water.js +384 -246
  161. package/src/shade/renderer/water/shader_water_avboit.d.ts +12 -0
  162. package/src/shade/renderer/water/shader_water_avboit.d.ts.map +1 -0
  163. package/src/shade/renderer/water/shader_water_avboit.js +258 -0
  164. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
  165. package/src/shade/wgsl/emulator/WGSLLanguageCore.js +13 -0
  166. package/src/shade/renderer/animation/skinning/bounds_refresh/chunk_aabb_atomic_f32.d.ts +0 -29
  167. package/src/shade/renderer/animation/skinning/bounds_refresh/chunk_aabb_atomic_f32.d.ts.map +0 -1
  168. package/src/shade/renderer/animation/skinning/bounds_refresh/chunk_aabb_atomic_f32.js +0 -59
  169. 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,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]);
@@ -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"}
@@ -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