@woosh/meep-engine 3.41.0 → 3.43.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 (384) hide show
  1. package/build/bundle-worker-image-decoder.js +1 -1
  2. package/build/bundle-worker-terrain.js +1 -1
  3. package/editor/selection/editor_pick.d.ts.map +1 -1
  4. package/editor/selection/editor_pick.js +2 -1
  5. package/editor/tools/TransformToolV2.d.ts.map +1 -1
  6. package/editor/tools/TransformToolV2.js +7 -1
  7. package/editor/tools/engine/ToolEngine.d.ts.map +1 -1
  8. package/editor/tools/engine/ToolEngine.js +10 -0
  9. package/editor/tools/v2/TransformControls.d.ts.map +1 -1
  10. package/editor/tools/v2/TransformControls.js +7 -20
  11. package/editor/tools/v2/handle/gizmo_drag_plane.d.ts.map +1 -1
  12. package/editor/tools/v2/handle/gizmo_drag_plane.js +4 -0
  13. package/editor/view/ecs/EntityEditor.d.ts.map +1 -1
  14. package/editor/view/ecs/EntityEditor.js +3 -1
  15. package/editor/view/node-graph/NodeGraphView.d.ts.map +1 -1
  16. package/editor/view/node-graph/NodeGraphView.js +28 -12
  17. package/package.json +91 -96
  18. package/samples/engine/first-scene/index.html +4 -1
  19. package/samples/engine/first-scene/main.js +14 -9
  20. package/src/core/binary/utf8/utf8_decode.js +3 -3
  21. package/src/core/bvh2/binary/2/bvh32_query_user_data_ray.d.ts.map +1 -1
  22. package/src/core/bvh2/binary/2/bvh32_query_user_data_ray.js +112 -113
  23. package/src/core/bvh2/bvh3/ebvh_nodes_sort_sah_local4.js +2 -2
  24. package/src/core/cache/wtinylfu/benchmark/CacheWTinylfu.bench.md +14 -14
  25. package/src/core/collection/RingBuffer.d.ts.map +1 -1
  26. package/src/core/collection/RingBuffer.js +4 -0
  27. package/src/core/collection/array/array_contains_duplicates.d.ts.map +1 -1
  28. package/src/core/collection/array/array_contains_duplicates.js +2 -1
  29. package/src/core/collection/array/array_copy.d.ts.map +1 -1
  30. package/src/core/collection/array/array_copy.js +23 -0
  31. package/src/core/collection/array/typed/sparse_typed_array_hash.d.ts +2 -2
  32. package/src/core/collection/array/typed/sparse_typed_array_hash.d.ts.map +1 -1
  33. package/src/core/collection/array/typed/sparse_typed_array_hash.js +9 -8
  34. package/src/core/collection/array/typed/uint16_array_hash.d.ts +2 -2
  35. package/src/core/collection/array/typed/uint16_array_hash.js +4 -4
  36. package/src/core/collection/array/typed/uint8_array_hash.d.ts +2 -2
  37. package/src/core/collection/array/typed/uint8_array_hash.js +4 -4
  38. package/src/core/collection/array/weightedRandomFromArray.d.ts +1 -0
  39. package/src/core/collection/array/weightedRandomFromArray.d.ts.map +1 -1
  40. package/src/core/collection/array/weightedRandomFromArray.js +9 -1
  41. package/src/core/collection/heap/BinaryHeap.d.ts.map +1 -1
  42. package/src/core/collection/heap/BinaryHeap.js +4 -0
  43. package/src/core/collection/list/List.d.ts.map +1 -1
  44. package/src/core/collection/list/List.js +4 -2
  45. package/src/core/collection/set/ArraySet.js +1 -1
  46. package/src/core/collection/set/HashSet.d.ts +1 -1
  47. package/src/core/collection/set/HashSet.d.ts.map +1 -1
  48. package/src/core/collection/set/HashSet.js +4 -2
  49. package/src/core/debug/matchers/IsEqual.js +1 -1
  50. package/src/core/debug/matchers/IsIterableContaining.d.ts.map +1 -1
  51. package/src/core/debug/matchers/IsIterableContaining.js +61 -74
  52. package/src/core/events/signal/SignalBinding.js +101 -101
  53. package/src/core/function/extractFunctionBody.js +13 -13
  54. package/src/core/function/objectsEqual.d.ts.map +1 -1
  55. package/src/core/function/objectsEqual.js +15 -14
  56. package/src/core/geom/3d/frustum/frustum3_compute_closest_point.d.ts.map +1 -1
  57. package/src/core/geom/3d/frustum/frustum3_compute_closest_point.js +207 -172
  58. package/src/core/geom/3d/gjk/gjk_epa_penetration.d.ts.map +1 -1
  59. package/src/core/geom/3d/gjk/gjk_epa_penetration.js +5 -4
  60. package/src/core/geom/3d/line/line3_compute_segment_point_distance_eikonal.d.ts.map +1 -1
  61. package/src/core/geom/3d/line/line3_compute_segment_point_distance_eikonal.js +8 -2
  62. package/src/core/geom/3d/triangle/tri3_ray_intersection.d.ts +20 -0
  63. package/src/core/geom/3d/triangle/tri3_ray_intersection.d.ts.map +1 -1
  64. package/src/core/geom/3d/triangle/tri3_ray_intersection.js +182 -0
  65. package/src/core/math/noise/curl_noise_3dt.d.ts.map +1 -1
  66. package/src/core/math/noise/curl_noise_3dt.js +20 -10
  67. package/src/core/math/noise/sdnoise.d.ts +16 -5
  68. package/src/core/math/noise/sdnoise.d.ts.map +1 -1
  69. package/src/core/math/noise/sdnoise.js +43 -9
  70. package/src/core/math/spline/spline3_hermite_nearest_point.d.ts +16 -1
  71. package/src/core/math/spline/spline3_hermite_nearest_point.d.ts.map +1 -1
  72. package/src/core/math/spline/spline3_hermite_nearest_point.js +44 -3
  73. package/src/engine/Engine.d.ts.map +1 -1
  74. package/src/engine/Engine.js +6 -2
  75. package/src/engine/control/first-person/FirstPersonPlayerController.d.ts +9 -0
  76. package/src/engine/control/first-person/FirstPersonPlayerController.d.ts.map +1 -1
  77. package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.d.ts +26 -0
  78. package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.d.ts.map +1 -1
  79. package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.js +2 -0
  80. package/src/engine/control/first-person/abilities/AbilitySet.d.ts.map +1 -1
  81. package/src/engine/control/first-person/abilities/AbilitySet.js +9 -0
  82. package/src/engine/control/first-person/abilities/LedgeGrab.d.ts.map +1 -1
  83. package/src/engine/control/first-person/abilities/LedgeGrab.js +6 -0
  84. package/src/engine/control/first-person/abilities/Slide.d.ts.map +1 -1
  85. package/src/engine/control/first-person/abilities/Slide.js +1 -0
  86. package/src/engine/control/first-person/abilities/WallRun.d.ts +4 -1
  87. package/src/engine/control/first-person/abilities/WallRun.d.ts.map +1 -1
  88. package/src/engine/control/first-person/abilities/WallRun.js +13 -1
  89. package/src/engine/control/first-person/mastery/SlideInitiationTimingEvaluator.d.ts +1 -1
  90. package/src/engine/control/first-person/mastery/SlideInitiationTimingEvaluator.d.ts.map +1 -1
  91. package/src/engine/control/first-person/mastery/SlideInitiationTimingEvaluator.js +6 -5
  92. package/src/engine/control/first-person/mastery/StrideTimingJumpEvaluator.d.ts +3 -3
  93. package/src/engine/control/first-person/mastery/StrideTimingJumpEvaluator.d.ts.map +1 -1
  94. package/src/engine/control/first-person/mastery/StrideTimingJumpEvaluator.js +9 -8
  95. package/src/engine/control/first-person/sensors/FirstPersonSensorsSystem.d.ts.map +1 -1
  96. package/src/engine/control/first-person/sensors/FirstPersonSensorsSystem.js +13 -4
  97. package/src/engine/ecs/EntityManager.d.ts.map +1 -1
  98. package/src/engine/ecs/EntityManager.js +18 -15
  99. package/src/engine/ecs/dynamic_actions/rules/DynamicRuleDescription.d.ts.map +1 -1
  100. package/src/engine/ecs/dynamic_actions/rules/DynamicRuleDescription.js +2 -1
  101. package/src/engine/ecs/dynamic_actions/rules/DynamicRuleDescriptionTable.d.ts.map +1 -1
  102. package/src/engine/ecs/dynamic_actions/rules/DynamicRuleDescriptionTable.js +1 -0
  103. package/src/engine/ecs/fow/FogOfWarRevealerSystem.d.ts.map +1 -1
  104. package/src/engine/ecs/fow/FogOfWarRevealerSystem.js +3 -0
  105. package/src/engine/ecs/parent/EntityNode.js +3 -3
  106. package/src/engine/ecs/speaker/VoiceSystem.d.ts.map +1 -1
  107. package/src/engine/ecs/speaker/VoiceSystem.js +4 -0
  108. package/src/engine/ecs/storage/BinaryBufferDeSerializer.js +5 -5
  109. package/src/engine/ecs/storage/binary/BinarySerializationRegistry.d.ts.map +1 -1
  110. package/src/engine/ecs/storage/binary/BinarySerializationRegistry.js +3 -2
  111. package/src/engine/ecs/storage/binary/object/BinaryObjectSerializationAdapter2.js +1 -1
  112. package/src/engine/ecs/storage/binary/object-v2/BinaryObjectDeSerializer.d.ts.map +1 -1
  113. package/src/engine/ecs/storage/binary/object-v2/BinaryObjectDeSerializer.js +8 -1
  114. package/src/engine/ecs/storage/populateEngineSerializationRegistry.d.ts.map +1 -1
  115. package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +8 -0
  116. package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.d.ts.map +1 -1
  117. package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.js +5 -2
  118. package/src/engine/ecs/terrain/ecs/layers/TerrainLayers.d.ts.map +1 -1
  119. package/src/engine/ecs/terrain/ecs/layers/TerrainLayers.js +3 -0
  120. package/src/engine/ecs/terrain/ecs/splat/SplatMapping.d.ts.map +1 -1
  121. package/src/engine/ecs/terrain/ecs/splat/SplatMapping.js +1 -0
  122. package/src/engine/ecs/terrain/overlay/TerrainOverlay.js +1 -1
  123. package/src/engine/ecs/terrain/tiles/TerrainTile.d.ts.map +1 -1
  124. package/src/engine/ecs/terrain/tiles/TerrainTile.js +13 -1
  125. package/src/engine/ecs/terrain/tiles/TerrainTileManager.d.ts.map +1 -1
  126. package/src/engine/ecs/terrain/tiles/TerrainTileManager.js +1 -0
  127. package/src/engine/graphics/ecs/light/LightSerializationAdapter.d.ts.map +1 -1
  128. package/src/engine/graphics/ecs/light/LightSerializationAdapter.js +13 -1
  129. package/src/engine/graphics/ecs/light/LightSerializationUpgrader_0_1.d.ts +5 -0
  130. package/src/engine/graphics/ecs/light/LightSerializationUpgrader_0_1.d.ts.map +1 -0
  131. package/src/engine/graphics/ecs/light/LightSerializationUpgrader_0_1.js +27 -0
  132. package/src/engine/graphics/ecs/water/Water.d.ts +11 -0
  133. package/src/engine/graphics/ecs/water/Water.d.ts.map +1 -1
  134. package/src/engine/graphics/ecs/water/Water.js +17 -0
  135. package/src/engine/graphics/ecs/water/WaterSerializationAdapter.d.ts.map +1 -1
  136. package/src/engine/graphics/ecs/water/WaterSerializationAdapter.js +3 -1
  137. package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_4_5.d.ts +9 -0
  138. package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_4_5.d.ts.map +1 -0
  139. package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_4_5.js +24 -0
  140. package/src/engine/graphics/ecs/water/WaterWaves.d.ts +30 -9
  141. package/src/engine/graphics/ecs/water/WaterWaves.d.ts.map +1 -1
  142. package/src/engine/graphics/ecs/water/WaterWaves.js +41 -9
  143. package/src/engine/graphics/ecs/water/WaterWavesSerializationAdapter.d.ts.map +1 -1
  144. package/src/engine/graphics/ecs/water/WaterWavesSerializationAdapter.js +30 -26
  145. package/src/engine/graphics/ecs/water/WaterWavesSerializationUpgrader_0_1.d.ts +6 -0
  146. package/src/engine/graphics/ecs/water/WaterWavesSerializationUpgrader_0_1.d.ts.map +1 -0
  147. package/src/engine/graphics/ecs/water/WaterWavesSerializationUpgrader_0_1.js +22 -0
  148. package/src/engine/graphics/geometry/buffered/query/bvh32_geometry_raycast.d.ts.map +1 -1
  149. package/src/engine/graphics/geometry/buffered/query/bvh32_geometry_raycast.js +3 -5
  150. package/src/engine/graphics/texture/3d/scs3d_sample_linear3.d.ts +20 -0
  151. package/src/engine/graphics/texture/3d/scs3d_sample_linear3.d.ts.map +1 -1
  152. package/src/engine/graphics/texture/3d/scs3d_sample_linear3.js +36 -0
  153. package/src/engine/graphics3/WaterSystem.d.ts +12 -3
  154. package/src/engine/graphics3/WaterSystem.d.ts.map +1 -1
  155. package/src/engine/graphics3/WaterSystem.js +78 -46
  156. package/src/engine/input/devices/PointerDevice.d.ts.map +1 -1
  157. package/src/engine/input/devices/PointerDevice.js +29 -4
  158. package/src/engine/intelligence/behavior/selector/WeightedRandomBehavior.d.ts +1 -0
  159. package/src/engine/intelligence/behavior/selector/WeightedRandomBehavior.d.ts.map +1 -1
  160. package/src/engine/intelligence/behavior/selector/WeightedRandomBehavior.js +14 -3
  161. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  162. package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_velocity.d.ts.map +1 -1
  163. package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_velocity.js +12 -3
  164. package/src/engine/physics/fluid/solver/v3_grid_advect_sl_velocity.d.ts.map +1 -1
  165. package/src/engine/physics/fluid/solver/v3_grid_advect_sl_velocity.js +8 -2
  166. package/src/engine/physics/fluid/solver/v3_grid_sample_scalar_masked.d.ts +19 -0
  167. package/src/engine/physics/fluid/solver/v3_grid_sample_scalar_masked.d.ts.map +1 -1
  168. package/src/engine/physics/fluid/solver/v3_grid_sample_scalar_masked.js +41 -2
  169. package/src/engine/physics/fluid/solver/v3_mac_advect_scalar.d.ts.map +1 -1
  170. package/src/engine/physics/fluid/solver/v3_mac_advect_scalar.js +9 -3
  171. package/src/engine/physics/fluid/solver/v3_mac_advect_sl_velocity.d.ts.map +1 -1
  172. package/src/engine/physics/fluid/solver/v3_mac_advect_sl_velocity.js +26 -10
  173. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.d.ts +3 -6
  174. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.d.ts.map +1 -1
  175. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.js +22 -9
  176. package/src/engine/ui/DraggableAspect.d.ts +5 -1
  177. package/src/engine/ui/DraggableAspect.d.ts.map +1 -1
  178. package/src/engine/ui/DraggableAspect.js +61 -4
  179. package/src/format/image/avif/heif/ItemProperty.d.ts +1 -1
  180. package/src/format/image/avif/heif/ItemProperty.js +1 -1
  181. package/src/format/image/png/chunk/png_chunk_decode_iTXt.d.ts.map +1 -1
  182. package/src/format/image/png/chunk/png_chunk_decode_iTXt.js +17 -6
  183. package/src/shade/device/mock/SoftwareGPUDevice.d.ts +2 -4
  184. package/src/shade/device/mock/SoftwareGPUDevice.d.ts.map +1 -1
  185. package/src/shade/device/mock/SoftwareGPUDevice.js +20 -13
  186. package/src/shade/playground/skinned_blas_refit/sweep_views.d.ts.map +1 -1
  187. package/src/shade/playground/skinned_blas_refit/sweep_views.js +2 -1
  188. package/src/shade/playground/vgeo_runtime/README.md +5 -4
  189. package/src/shade/playground/water_refraction/README.md +10 -11
  190. package/src/shade/playground/water_refraction/main.js +9 -8
  191. package/src/shade/playground/water_refraction/world.js +1 -1
  192. package/src/shade/playground/water_surface/README.md +43 -0
  193. package/src/shade/playground/water_surface/index.html +30 -0
  194. package/src/shade/playground/water_surface/main.d.ts +2 -0
  195. package/src/shade/playground/water_surface/main.d.ts.map +1 -0
  196. package/src/shade/playground/water_surface/main.js +154 -0
  197. package/src/shade/playground/water_surface/world.d.ts +44 -0
  198. package/src/shade/playground/water_surface/world.d.ts.map +1 -0
  199. package/src/shade/playground/water_surface/world.js +160 -0
  200. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  201. package/src/shade/renderer/Renderer.js +6 -5
  202. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
  203. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +5 -0
  204. package/src/shade/renderer/atmosphere/GPUSky.d.ts +12 -0
  205. package/src/shade/renderer/atmosphere/GPUSky.d.ts.map +1 -1
  206. package/src/shade/renderer/atmosphere/GPUSky.js +162 -147
  207. package/src/shade/renderer/binding/BufferBinding.js +2 -2
  208. package/src/shade/renderer/buffer/table/GPUTypedTable.d.ts.map +1 -1
  209. package/src/shade/renderer/buffer/table/GPUTypedTable.js +5 -3
  210. package/src/shade/renderer/buffer/table/GPUTypedTableDescriptor.d.ts +10 -3
  211. package/src/shade/renderer/buffer/table/GPUTypedTableDescriptor.d.ts.map +1 -1
  212. package/src/shade/renderer/buffer/table/GPUTypedTableDescriptor.js +17 -9
  213. package/src/shade/renderer/camera/orbital/OrbitalCameraInput.d.ts +3 -0
  214. package/src/shade/renderer/camera/orbital/OrbitalCameraInput.d.ts.map +1 -1
  215. package/src/shade/renderer/camera/orbital/OrbitalCameraInput.js +16 -0
  216. package/src/shade/renderer/camera/orbital/OrbitalCameraRig.d.ts +2 -0
  217. package/src/shade/renderer/camera/orbital/OrbitalCameraRig.d.ts.map +1 -1
  218. package/src/shade/renderer/camera/orbital/OrbitalCameraRig.js +11 -0
  219. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.d.ts +1 -1
  220. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.d.ts.map +1 -1
  221. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.js +9 -3
  222. package/src/shade/renderer/geometry/util/geometry_simplify_redundant_topology.d.ts.map +1 -1
  223. package/src/shade/renderer/geometry/util/geometry_simplify_redundant_topology.js +2 -2
  224. package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.d.ts.map +1 -1
  225. package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.js +85 -0
  226. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts.map +1 -1
  227. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.js +12 -6
  228. package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.d.ts.map +1 -1
  229. package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.js +7 -0
  230. package/src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.d.ts.map +1 -1
  231. package/src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.js +3 -1
  232. package/src/shade/renderer/lightmap/bake/shader_lightmap_denoise_sh.d.ts.map +1 -1
  233. package/src/shade/renderer/lightmap/bake/shader_lightmap_denoise_sh.js +10 -3
  234. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  235. package/src/shade/renderer/particles/DESIGN.md +13 -9
  236. package/src/shade/renderer/particles/shaders/chunk_particle_lighting.d.ts +1 -1
  237. package/src/shade/renderer/particles/shaders/chunk_particle_lighting.js +1 -1
  238. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  239. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts +3 -2
  240. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts.map +1 -1
  241. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.js +3 -2
  242. package/src/shade/renderer/scene/GPUSceneContext.d.ts +9 -1
  243. package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
  244. package/src/shade/renderer/scene/GPUSceneContext.js +23 -1
  245. package/src/shade/renderer/scene/SCENE_DATABASE_SPEC.js +2 -1
  246. package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128_inverse.d.ts +13 -0
  247. package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128_inverse.d.ts.map +1 -0
  248. package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128_inverse.js +42 -0
  249. package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128x4_inverse_workgroup.d.ts +15 -0
  250. package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128x4_inverse_workgroup.d.ts.map +1 -0
  251. package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128x4_inverse_workgroup.js +39 -0
  252. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts.map +1 -1
  253. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js +2 -0
  254. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts +4 -1
  255. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts.map +1 -1
  256. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +74 -3
  257. package/src/shade/renderer/volumetrics/NOTES.md +1023 -957
  258. package/src/shade/renderer/volumetrics/chunk_volumetrics_irradiance_sh.d.ts +5 -4
  259. package/src/shade/renderer/volumetrics/chunk_volumetrics_irradiance_sh.d.ts.map +1 -1
  260. package/src/shade/renderer/volumetrics/chunk_volumetrics_irradiance_sh.js +5 -4
  261. package/src/shade/renderer/volumetrics/gi/chunk_volumetrics_gi.d.ts +1 -1
  262. package/src/shade/renderer/volumetrics/gi/chunk_volumetrics_gi.js +1 -1
  263. package/src/shade/renderer/volumetrics/gi/graph_build_froxel_gi.d.ts +1 -1
  264. package/src/shade/renderer/volumetrics/gi/graph_build_froxel_gi.js +1 -1
  265. package/src/shade/renderer/volumetrics/graph_build_froxel_irradiance.d.ts +41 -0
  266. package/src/shade/renderer/volumetrics/graph_build_froxel_irradiance.d.ts.map +1 -0
  267. package/src/shade/renderer/volumetrics/graph_build_froxel_irradiance.js +112 -0
  268. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts +9 -23
  269. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts.map +1 -1
  270. package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +18 -126
  271. package/src/shade/renderer/volumetrics/shader_volumetrics_build_irradiance.d.ts +22 -0
  272. package/src/shade/renderer/volumetrics/shader_volumetrics_build_irradiance.d.ts.map +1 -0
  273. package/src/shade/renderer/volumetrics/shader_volumetrics_build_irradiance.js +228 -0
  274. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts.map +1 -1
  275. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.js +0 -53
  276. package/src/shade/renderer/water/GPUWaterRenderer.d.ts +15 -0
  277. package/src/shade/renderer/water/GPUWaterRenderer.d.ts.map +1 -1
  278. package/src/shade/renderer/water/GPUWaterRenderer.js +110 -30
  279. package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts +16 -8
  280. package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts.map +1 -1
  281. package/src/shade/renderer/water/medium/GPUWaterBodies.js +31 -26
  282. package/src/shade/renderer/water/medium/shader_water_meshlets.d.ts +0 -1
  283. package/src/shade/renderer/water/medium/shader_water_meshlets.d.ts.map +1 -1
  284. package/src/shade/renderer/water/medium/shader_water_meshlets.js +1 -39
  285. package/src/shade/renderer/water/shader_water.d.ts +0 -1
  286. package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
  287. package/src/shade/renderer/water/shader_water.js +201 -72
  288. package/src/shade/renderer/water/surface/GPUWaterSurface.d.ts +70 -0
  289. package/src/shade/renderer/water/surface/GPUWaterSurface.d.ts.map +1 -0
  290. package/src/shade/renderer/water/surface/GPUWaterSurface.js +199 -0
  291. package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.d.ts +5 -2
  292. package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.d.ts.map +1 -1
  293. package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.js +32 -12
  294. package/src/shade/renderer/water/surface/chunk_water_surface_sample.d.ts +23 -0
  295. package/src/shade/renderer/water/surface/chunk_water_surface_sample.d.ts.map +1 -0
  296. package/src/shade/renderer/water/surface/chunk_water_surface_sample.js +227 -0
  297. package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts +65 -11
  298. package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts.map +1 -1
  299. package/src/shade/renderer/water/surface/graph_water_tessellation.js +163 -28
  300. package/src/shade/renderer/water/surface/lod/WATER_LOD.d.ts +51 -0
  301. package/src/shade/renderer/water/surface/lod/WATER_LOD.d.ts.map +1 -0
  302. package/src/shade/renderer/water/surface/lod/WATER_LOD.js +95 -0
  303. package/src/shade/renderer/water/surface/lod/chunk_water_lod.d.ts +10 -0
  304. package/src/shade/renderer/water/surface/lod/chunk_water_lod.d.ts.map +1 -0
  305. package/src/shade/renderer/water/surface/lod/chunk_water_lod.js +127 -0
  306. package/src/shade/renderer/water/surface/lod/chunk_water_lod_cell.d.ts +17 -0
  307. package/src/shade/renderer/water/surface/lod/chunk_water_lod_cell.d.ts.map +1 -0
  308. package/src/shade/renderer/water/surface/lod/chunk_water_lod_cell.js +246 -0
  309. package/src/shade/renderer/water/surface/lod/shader_water_lod.d.ts +118 -0
  310. package/src/shade/renderer/water/surface/lod/shader_water_lod.d.ts.map +1 -0
  311. package/src/shade/renderer/water/surface/lod/shader_water_lod.js +727 -0
  312. package/src/shade/renderer/water/surface/particles/GPUWaterParticles.d.ts +60 -0
  313. package/src/shade/renderer/water/surface/particles/GPUWaterParticles.d.ts.map +1 -0
  314. package/src/shade/renderer/water/surface/particles/GPUWaterParticles.js +274 -0
  315. package/src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.d.ts +17 -0
  316. package/src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.d.ts.map +1 -0
  317. package/src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.js +57 -0
  318. package/src/shade/renderer/water/surface/particles/chunk_water_particle.d.ts +43 -0
  319. package/src/shade/renderer/water/surface/particles/chunk_water_particle.d.ts.map +1 -0
  320. package/src/shade/renderer/water/surface/particles/chunk_water_particle.js +268 -0
  321. package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.d.ts +20 -0
  322. package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.d.ts.map +1 -0
  323. package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.js +239 -0
  324. package/src/shade/renderer/water/surface/particles/shader_water_particles.d.ts +153 -0
  325. package/src/shade/renderer/water/surface/particles/shader_water_particles.d.ts.map +1 -0
  326. package/src/shade/renderer/water/surface/particles/shader_water_particles.js +874 -0
  327. package/src/shade/renderer/water/surface/shader_water_cull.d.ts +42 -0
  328. package/src/shade/renderer/water/surface/shader_water_cull.d.ts.map +1 -0
  329. package/src/shade/renderer/water/surface/shader_water_cull.js +269 -0
  330. package/src/shade/renderer/water/surface/shader_water_waves_combine.d.ts +15 -0
  331. package/src/shade/renderer/water/surface/shader_water_waves_combine.d.ts.map +1 -0
  332. package/src/shade/renderer/water/surface/shader_water_waves_combine.js +73 -0
  333. package/src/shade/renderer/water/surface/shader_water_waves_derive.d.ts +11 -0
  334. package/src/shade/renderer/water/surface/shader_water_waves_derive.d.ts.map +1 -0
  335. package/src/shade/renderer/water/surface/shader_water_waves_derive.js +78 -0
  336. package/src/shade/renderer/water/surface/spectrum/GPUWaterSpectrum.d.ts +35 -0
  337. package/src/shade/renderer/water/surface/spectrum/GPUWaterSpectrum.d.ts.map +1 -0
  338. package/src/shade/renderer/water/surface/spectrum/GPUWaterSpectrum.js +103 -0
  339. package/src/shade/renderer/water/surface/spectrum/WATER_BAND_STATE.d.ts +22 -0
  340. package/src/shade/renderer/water/surface/spectrum/WATER_BAND_STATE.d.ts.map +1 -0
  341. package/src/shade/renderer/water/surface/spectrum/WATER_BAND_STATE.js +57 -0
  342. package/src/shade/renderer/water/surface/spectrum/WATER_SPECTRUM.d.ts +22 -0
  343. package/src/shade/renderer/water/surface/spectrum/WATER_SPECTRUM.d.ts.map +1 -0
  344. package/src/shade/renderer/water/surface/spectrum/WATER_SPECTRUM.js +25 -0
  345. package/src/shade/renderer/water/surface/spectrum/chunk_water_jonswap.d.ts +14 -0
  346. package/src/shade/renderer/water/surface/spectrum/chunk_water_jonswap.d.ts.map +1 -0
  347. package/src/shade/renderer/water/surface/spectrum/chunk_water_jonswap.js +48 -0
  348. package/src/shade/renderer/water/surface/spectrum/chunk_water_spectrum.d.ts +23 -0
  349. package/src/shade/renderer/water/surface/spectrum/chunk_water_spectrum.d.ts.map +1 -0
  350. package/src/shade/renderer/water/surface/spectrum/chunk_water_spectrum.js +169 -0
  351. package/src/shade/renderer/water/surface/spectrum/shader_water_spectrum.d.ts +26 -0
  352. package/src/shade/renderer/water/surface/spectrum/shader_water_spectrum.d.ts.map +1 -0
  353. package/src/shade/renderer/water/surface/spectrum/shader_water_spectrum.js +161 -0
  354. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.d.ts.map +1 -1
  355. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +29 -9
  356. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
  357. package/src/shade/wgsl/emulator/WGSLLanguageCore.js +14 -3
  358. package/src/core/geom/2d/polygon/polygon2_triangulate.corpus.d.ts +0 -28
  359. package/src/core/geom/2d/polygon/polygon2_triangulate.corpus.d.ts.map +0 -1
  360. package/src/core/geom/2d/polygon/polygon2_triangulate.corpus.js +0 -86
  361. package/src/engine/ecs/storage/binary/object-v2/serializerTestHarness.d.ts +0 -29
  362. package/src/engine/ecs/storage/binary/object-v2/serializerTestHarness.d.ts.map +0 -1
  363. package/src/engine/ecs/storage/binary/object-v2/serializerTestHarness.js +0 -44
  364. package/src/shade/renderer/water/medium/shader_water_bodies_derive.d.ts +0 -4
  365. package/src/shade/renderer/water/medium/shader_water_bodies_derive.d.ts.map +0 -1
  366. package/src/shade/renderer/water/medium/shader_water_bodies_derive.js +0 -32
  367. package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.d.ts +0 -25
  368. package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.d.ts.map +0 -1
  369. package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.js +0 -128
  370. package/src/shade/renderer/water/surface/chunk_water_tessellation.d.ts +0 -9
  371. package/src/shade/renderer/water/surface/chunk_water_tessellation.d.ts.map +0 -1
  372. package/src/shade/renderer/water/surface/chunk_water_tessellation.js +0 -144
  373. package/src/shade/renderer/water/surface/chunk_water_wave.d.ts +0 -13
  374. package/src/shade/renderer/water/surface/chunk_water_wave.d.ts.map +0 -1
  375. package/src/shade/renderer/water/surface/chunk_water_wave.js +0 -40
  376. package/src/shade/renderer/water/surface/shader_water_tiles.d.ts +0 -4
  377. package/src/shade/renderer/water/surface/shader_water_tiles.d.ts.map +0 -1
  378. package/src/shade/renderer/water/surface/shader_water_tiles.js +0 -123
  379. package/src/shade/renderer/water/surface/shader_water_wave_batch.d.ts +0 -6
  380. package/src/shade/renderer/water/surface/shader_water_wave_batch.d.ts.map +0 -1
  381. package/src/shade/renderer/water/surface/shader_water_wave_batch.js +0 -85
  382. package/src/shade/renderer/water/surface/shader_water_wave_domain.d.ts +0 -6
  383. package/src/shade/renderer/water/surface/shader_water_wave_domain.d.ts.map +0 -1
  384. package/src/shade/renderer/water/surface/shader_water_wave_domain.js +0 -83
@@ -302,6 +302,8 @@ function classifyType(ident, args, template_list_node) {
302
302
  // template arg 0 is the element type (sub-template), arg 1 is the count
303
303
  let element = T_UNKNOWN;
304
304
  let count = -1;
305
+ // a count named by a module constant is read from that constant when a value is made
306
+ let count_name = null;
305
307
  if (template_list_node !== null) {
306
308
  const comma_list = namedChildByType(template_list_node, 'template_arg_comma_list');
307
309
  if (comma_list !== null) {
@@ -312,12 +314,14 @@ function classifyType(ident, args, template_list_node) {
312
314
  element = parseTypeSpecifier(inner_expr);
313
315
  }
314
316
  if (arg_nodes.length > 1) {
315
- const c = parseInt(arg_nodes[1].text.trim());
317
+ const text = arg_nodes[1].text.trim();
318
+ const c = parseInt(text);
316
319
  if (!isNaN(c)) count = c;
320
+ else if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(text)) count_name = text;
317
321
  }
318
322
  }
319
323
  }
320
- return { kind: 'array', element, count };
324
+ return count_name === null ? { kind: 'array', element, count } : { kind: 'array', element, count, count_name };
321
325
  }
322
326
  if (ident === 'atomic') {
323
327
  const inner = args.length > 0 ? args[0] : 'i32';
@@ -843,14 +847,16 @@ function defaultValueForType(type) {
843
847
  case 'mat':
844
848
  return `new Float32Array(${type.cols * type.rows})`;
845
849
  case 'array': {
846
- if (type.count > 0) {
850
+ const length = type.count > 0 ? String(type.count)
851
+ : type.count_name !== undefined ? `Number(${identToJs(type.count_name)})` : null;
852
+ if (length !== null) {
847
853
  if (type.element.kind === 'primitive') {
848
854
  const ctor = arrayCtorForScalar(type.element.name);
849
- return `new ${ctor}(${type.count})`;
855
+ return `new ${ctor}(${length})`;
850
856
  }
851
857
  // For non-primitive elements (vec / mat / struct / nested array) build the
852
858
  // array eagerly so `out[i]` is a fresh, mutable element rather than `undefined`.
853
- return `Array.from({ length: ${type.count} }, () => ${defaultValueForType(type.element)})`;
859
+ return `Array.from({ length: ${length} }, () => ${defaultValueForType(type.element)})`;
854
860
  }
855
861
  return '[]';
856
862
  }
@@ -1485,7 +1491,8 @@ function emitVariableUpdatingStatement(c, node) {
1485
1491
  || isScalarUnsigned(lhs_compiled.type)
1486
1492
  || isScalarUnsigned(rhs_compiled.type)
1487
1493
  )) {
1488
- c.out.add(emitWriteStatement(lhs_compiled, `wgsl.${bitwise_helper}(${lhs_compiled.code}, ${rhs_compiled.code})`));
1494
+ c.out.add(emitWriteStatement(lhs_compiled,
1495
+ `wgsl.${shiftHelperFor(bitwise_helper, lhs_compiled.type)}(${lhs_compiled.code}, ${rhs_compiled.code})`));
1489
1496
  return;
1490
1497
  }
1491
1498
  c.out.add(`${lhs_compiled.code} ${op_text} ${rhs_compiled.code};`);
@@ -2149,14 +2156,15 @@ function compileBinaryExpression(c, node, op_type, mode) {
2149
2156
  // bit set was negative too. The helpers normalise with `>>> 0`, which is what WGSL u32 means.
2150
2157
  //
2151
2158
  // Deliberately not extended to i32: `bit_and` and friends return an unsigned result, and a
2152
- // signed operand is exactly the case raw JS already gets right.
2159
+ // signed operand is exactly the case raw JS already gets right. A shift is the exception: WGSL
2160
+ // makes its amount a u32 whatever it shifts, so an i32 shift lands here and takes the signed helper.
2153
2161
  const bitwise_helper = BITWISE_HELPER[op_text];
2154
2162
  if (bitwise_helper !== undefined) {
2155
2163
  if (isContainerType(left.type) || isContainerType(right.type)
2156
2164
  || isScalarBool(left.type) || isScalarBool(right.type)
2157
2165
  || isScalarUnsigned(left.type) || isScalarUnsigned(right.type)) {
2158
2166
  return {
2159
- code: `wgsl.${bitwise_helper}(${left.code}, ${right.code})`,
2167
+ code: `wgsl.${shiftHelperFor(bitwise_helper, left.type)}(${left.code}, ${right.code})`,
2160
2168
  type: inferRawBinaryResultType(left.type, right.type, op_text),
2161
2169
  };
2162
2170
  }
@@ -2187,6 +2195,12 @@ const BITWISE_HELPER = {
2187
2195
  '>>': 'shr',
2188
2196
  };
2189
2197
 
2198
+ /** The helper for a bitwise operator on a value of type `t`: a shift of an i32 (scalar or vector) keeps its sign. */
2199
+ function shiftHelperFor(helper, t) {
2200
+ if ((helper === 'shl' || helper === 'shr') && isIntegerType(t) && integerScalarName(t) === 'i32') { return `${helper}_i32`; }
2201
+ return helper;
2202
+ }
2203
+
2190
2204
  /** Map WGSL comparison operators to language-core element-wise helper names. */
2191
2205
  const COMPARISON_HELPER = {
2192
2206
  '==': 'eq',
@@ -2727,7 +2741,13 @@ function compileCallPhraseTyped(c, node) {
2727
2741
 
2728
2742
  // 6) array / array<T, N> constructor.
2729
2743
  if (callee_name === 'array') {
2730
- return { code: `[${stored_args.join(', ')}]`, type: T_UNKNOWN };
2744
+ // The element type is what makes a member or swizzle on an element read compile; without
2745
+ // a template, it is the first argument's, as WGSL infers it.
2746
+ let type = parseTypeSpecifier(ident_node);
2747
+ if ((type.kind !== 'array' || type.element === T_UNKNOWN) && arg_results.length > 0 && !isAbstractType(arg_results[0].type)) {
2748
+ type = { kind: 'array', element: arg_results[0].type, count: arg_results.length };
2749
+ }
2750
+ return { code: `[${stored_args.join(', ')}]`, type };
2731
2751
  }
2732
2752
 
2733
2753
  // 7) Struct constructor.
@@ -1 +1 @@
1
- {"version":3,"file":"WGSLLanguageCore.d.ts","sourceRoot":"","sources":["../../../../../src/shade/wgsl/emulator/WGSLLanguageCore.js"],"names":[],"mappings":";IA8+CA;;;;;;;;;;;;;;OAcG;IACH,+DAmDC"}
1
+ {"version":3,"file":"WGSLLanguageCore.d.ts","sourceRoot":"","sources":["../../../../../src/shade/wgsl/emulator/WGSLLanguageCore.js"],"names":[],"mappings":";IAy/CA;;;;;;;;;;;;;;OAcG;IACH,+DAmDC"}
@@ -586,6 +586,9 @@ export const WGSLLanguageCore = {
586
586
  bit_xor: (a, b) => binop(a, b, (x, y) => typeof x === 'boolean' ? x !== y : (x ^ y) >>> 0),
587
587
  shl: (a, b) => binop(a, b, (x, y) => (x << y) >>> 0),
588
588
  shr: (a, b) => binop(a, b, (x, y) => x >>> y),
589
+ // The same on an i32, whose shift amount WGSL still makes a u32: `>>` sign-extends, and both stay signed.
590
+ shl_i32: (a, b) => binop(a, b, (x, y) => (x << y) | 0),
591
+ shr_i32: (a, b) => binop(a, b, (x, y) => x >> y),
589
592
 
590
593
  neg: (a) => unop(a, x => -x),
591
594
  not: (a) => unop(a, x => (~x) >>> 0),
@@ -1265,17 +1268,25 @@ export const WGSLLanguageCore = {
1265
1268
  * silently dropped (WGSL semantics). `coords` length matches the
1266
1269
  * texture dimensionality.
1267
1270
  *
1271
+ * Four arguments is the `texture_storage_2d_array` form — `(t, coords, array_index, value)` —
1272
+ * where the third argument selects the slice, stored along z as the sampling side reads it.
1273
+ *
1268
1274
  * @param {import("./CPUBitmapData.js").CPUBitmapData} t
1269
1275
  * @param {Int32Array | Uint32Array | number[] | number} coords
1270
- * @param {Float32Array | Int32Array | Uint32Array | number[]} value
1276
+ * @param {Float32Array | Int32Array | Uint32Array | number[] | number} value_or_index
1277
+ * @param {Float32Array | Int32Array | Uint32Array | number[]} [array_value]
1271
1278
  */
1272
- textureStore(t, coords, value) {
1279
+ textureStore(t, coords, value_or_index, array_value = undefined) {
1273
1280
  assert.defined(t, 'texture');
1281
+ if (array_value !== undefined) {
1282
+ t.write(coords[0] | 0, coords[1] | 0, value_or_index | 0, array_value);
1283
+ return;
1284
+ }
1274
1285
  const dim = t.dimensionality;
1275
1286
  const x = (dim >= 1 ? (typeof coords === 'number' ? coords : coords[0]) : 0) | 0;
1276
1287
  const y = (dim >= 2 ? coords[1] : 0) | 0;
1277
1288
  const z = (dim >= 3 ? coords[2] : 0) | 0;
1278
- t.write(x, y, z, value);
1289
+ t.write(x, y, z, value_or_index);
1279
1290
  },
1280
1291
 
1281
1292
  // CPUBitmapData models one stored mip level.
@@ -1,28 +0,0 @@
1
- /**
2
- * Inputs that have actually broken {@link polygon2_triangulate}, kept so they can
3
- * never break it again.
4
- *
5
- * This file only ever grows, and only from real failures -- a case someone
6
- * *imagines* might be hard belongs in the ordinary spec, not here. Every entry
7
- * records what went wrong when it was added, because that is the part that stops
8
- * a future change from quietly reintroducing the same class of bug. The practice
9
- * is borrowed from manifold, whose triangulator carries ~3 MB of recorded failing
10
- * polygons replayed as tests.
11
- *
12
- * `expect_full` says whether the polygon is well-formed enough that the whole of
13
- * its area must be covered. `false` means the input is genuinely invalid
14
- * (self-intersecting) and the only requirements are the universal ones: no throw,
15
- * no hang, no out-of-range index.
16
- *
17
- * @author Alex Goldring
18
- * @copyright Company Named Limited (c) 2026
19
- */
20
- export const POLYGON2_TRIANGULATE_CORPUS: {
21
- name: string;
22
- why: string;
23
- points: number[];
24
- contour_ends: number[];
25
- contour_count: number;
26
- expect_full: boolean;
27
- }[];
28
- //# sourceMappingURL=polygon2_triangulate.corpus.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"polygon2_triangulate.corpus.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/2d/polygon/polygon2_triangulate.corpus.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH;;;;;;;IAkEE"}
@@ -1,86 +0,0 @@
1
- /**
2
- * Inputs that have actually broken {@link polygon2_triangulate}, kept so they can
3
- * never break it again.
4
- *
5
- * This file only ever grows, and only from real failures -- a case someone
6
- * *imagines* might be hard belongs in the ordinary spec, not here. Every entry
7
- * records what went wrong when it was added, because that is the part that stops
8
- * a future change from quietly reintroducing the same class of bug. The practice
9
- * is borrowed from manifold, whose triangulator carries ~3 MB of recorded failing
10
- * polygons replayed as tests.
11
- *
12
- * `expect_full` says whether the polygon is well-formed enough that the whole of
13
- * its area must be covered. `false` means the input is genuinely invalid
14
- * (self-intersecting) and the only requirements are the universal ones: no throw,
15
- * no hang, no out-of-range index.
16
- *
17
- * @author Alex Goldring
18
- * @copyright Company Named Limited (c) 2026
19
- */
20
- export const POLYGON2_TRIANGULATE_CORPUS = [
21
- {
22
- name: "unit-offset micro square",
23
- why: "Winding was decided by the shoelace sum, whose sign here is pure "
24
- + "rounding noise: the true area is 1e-18 against ~1e-16 per-term error. "
25
- + "The ring came out backwards, every corner looked reflex, and the "
26
- + "result was zero triangles. Fixed by deciding winding with one exact "
27
- + "orientation predicate at a hull vertex (polygon2_is_counter_clockwise).",
28
- points: [
29
- 1, 1,
30
- 1 + 1e-9, 1,
31
- 1 + 1e-9, 1 + 1e-9,
32
- 1, 1 + 1e-9,
33
- ],
34
- contour_ends: [4],
35
- contour_count: 1,
36
- expect_full: true,
37
- },
38
- {
39
- name: "coarse-grid point soup (fuzz seed 24)",
40
- why: "Twenty points on a 7x7 integer grid, with duplicates and collinear "
41
- + "runs. The ear search exhausted itself, fell through to the "
42
- + "cure-local-intersections pass, and that pass walked the "
43
- + "collapsed-ring sentinel as if it were a node -- an infinite loop. "
44
- + "Fixed by making the recovery pass accept and propagate the sentinel, "
45
- + "and by stopping it once the ring holds fewer than three nodes.",
46
- points: [
47
- 2, 3, 3, 6, 1, 5, 0, 4, 5, 0,
48
- 4, 2, 3, 3, 3, 6, 2, 3, 6, 1,
49
- 4, 4, 2, 6, 3, 2, 6, 4, 1, 1,
50
- 3, 0, 5, 0, 3, 2, 6, 4, 3, 3,
51
- ],
52
- contour_ends: [20],
53
- contour_count: 1,
54
- expect_full: false,
55
- },
56
- {
57
- name: "two rectangular holes bridged through a shared edge",
58
- why: "Produced 12 triangles where the Euler bound allows 14, which looked "
59
- + "like dropped geometry. It was not: the bridges left collinear corners "
60
- + "that were correctly absorbed rather than emitted as zero-area "
61
- + "triangles. Kept as the standing reminder that V + 2H - 2 is an upper "
62
- + "bound, not an equality -- area conservation is the real invariant.",
63
- points: [
64
- 0, 0, 20, 0, 20, 10, 0, 10,
65
- 2, 8, 6, 8, 6, 2, 2, 2,
66
- 12, 8, 18, 8, 18, 2, 12, 2,
67
- ],
68
- contour_ends: [4, 8, 12],
69
- contour_count: 3,
70
- expect_full: true,
71
- },
72
- {
73
- name: "hole touching the outer boundary at a vertex",
74
- why: "Same class as above -- 6 triangles against a bound of 7. The hole's "
75
- + "corner lands exactly on the outer edge, so the bridge is degenerate "
76
- + "and one corner becomes collinear. Area is still exact and every input "
77
- + "vertex is still used.",
78
- points: [
79
- 0, 0, 10, 0, 10, 10, 0, 10,
80
- 4, 7, 4, 3, 0, 5,
81
- ],
82
- contour_ends: [4, 7],
83
- contour_count: 2,
84
- expect_full: true,
85
- },
86
- ];
@@ -1,29 +0,0 @@
1
- /**
2
- * Serialize `value` with a serializer built on `registry`, then deserialize it with a deserializer built on
3
- * `registry` + `modules`. Shared by the object-graph specs.
4
- *
5
- * @template T
6
- * @param {T} value
7
- * @param {{registry?: BinarySerializationRegistry, modules?: ModuleRegistry}} [options]
8
- * @returns {T}
9
- */
10
- export function roundTrip<T>(value: T, { registry, modules }?: {
11
- registry?: BinarySerializationRegistry;
12
- modules?: ModuleRegistry<any>;
13
- }): T;
14
- /**
15
- * @param {*} value
16
- * @param {BinarySerializationRegistry} [registry]
17
- * @returns {BinaryBuffer} rewound to position 0
18
- */
19
- export function serialize(value: any, registry?: BinarySerializationRegistry): BinaryBuffer;
20
- /**
21
- * @param {*} value
22
- * @param {BinarySerializationRegistry} [registry]
23
- * @returns {number} byte length of the serialized form
24
- */
25
- export function serializedSize(value: any, registry?: BinarySerializationRegistry): number;
26
- import { BinarySerializationRegistry } from "../BinarySerializationRegistry.js";
27
- import { ModuleRegistry } from "../../../../../core/model/ModuleRegistry.js";
28
- import { BinaryBuffer } from "../../../../../core/binary/BinaryBuffer.js";
29
- //# sourceMappingURL=serializerTestHarness.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"serializerTestHarness.d.ts","sourceRoot":"","sources":["../../../../../../../src/engine/ecs/storage/binary/object-v2/serializerTestHarness.js"],"names":[],"mappings":"AAMA;;;;;;;;GAQG;AACH,+DAHW;IAAC,QAAQ,CAAC,EAAE,2BAA2B,CAAC;IAAC,OAAO,CAAC,sBAAgB;CAAC,KAS5E;AAED;;;;GAIG;AACH,iDAHW,2BAA2B,GACzB,YAAY,CAQxB;AAED;;;;GAIG;AACH,sDAHW,2BAA2B,GACzB,MAAM,CAIlB;4CAzC2C,mCAAmC;+BADhD,6CAA6C;6BAD/C,4CAA4C"}
@@ -1,44 +0,0 @@
1
- import { BinaryBuffer } from "../../../../../core/binary/BinaryBuffer.js";
2
- import { ModuleRegistry } from "../../../../../core/model/ModuleRegistry.js";
3
- import { BinarySerializationRegistry } from "../BinarySerializationRegistry.js";
4
- import { BinaryObjectDeSerializer } from "./BinaryObjectDeSerializer.js";
5
- import { BinaryObjectSerializer } from "./BinaryObjectSerializer.js";
6
-
7
- /**
8
- * Serialize `value` with a serializer built on `registry`, then deserialize it with a deserializer built on
9
- * `registry` + `modules`. Shared by the object-graph specs.
10
- *
11
- * @template T
12
- * @param {T} value
13
- * @param {{registry?: BinarySerializationRegistry, modules?: ModuleRegistry}} [options]
14
- * @returns {T}
15
- */
16
- export function roundTrip(value, { registry = new BinarySerializationRegistry(), modules = new ModuleRegistry() } = {}) {
17
- const buffer = serialize(value, registry);
18
-
19
- buffer.position = 0;
20
-
21
- return new BinaryObjectDeSerializer(registry, modules).deserialize(buffer);
22
- }
23
-
24
- /**
25
- * @param {*} value
26
- * @param {BinarySerializationRegistry} [registry]
27
- * @returns {BinaryBuffer} rewound to position 0
28
- */
29
- export function serialize(value, registry = new BinarySerializationRegistry()) {
30
- const buffer = new BinaryBuffer();
31
-
32
- new BinaryObjectSerializer(registry).serialize(buffer, value);
33
-
34
- return buffer;
35
- }
36
-
37
- /**
38
- * @param {*} value
39
- * @param {BinarySerializationRegistry} [registry]
40
- * @returns {number} byte length of the serialized form
41
- */
42
- export function serializedSize(value, registry = new BinarySerializationRegistry()) {
43
- return serialize(value, registry).position;
44
- }
@@ -1,4 +0,0 @@
1
- export const WORKGROUP_SIZE: 64;
2
- export const shader_water_bodies_derive: ComputeShader;
3
- import { ComputeShader } from "../../shader/ComputeShader.js";
4
- //# sourceMappingURL=shader_water_bodies_derive.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"shader_water_bodies_derive.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/water/medium/shader_water_bodies_derive.js"],"names":[],"mappings":"AASA,gCAAiC;AAIjC,uDAkBG;8BA/B2B,+BAA+B"}
@@ -1,32 +0,0 @@
1
- import { ComputeShader } from "../../shader/ComputeShader.js";
2
- import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
3
- import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
4
- import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
5
- import { chunk_water_medium_derived } from "./chunk_water_medium_derived.js";
6
- import { chunk_water_medium_scattering } from "./chunk_water_medium_scattering.js";
7
- import { WATER_BODIES_TABLE as table } from "./chunk_water_bodies.js";
8
- import { chunk_folded_workgroup_index } from "../../shader/chunk/grid/chunk_folded_workgroup_index.js";
9
-
10
- export const WORKGROUP_SIZE = 64;
11
- const pg = table.page_iterator_symbol_prefix(WORKGROUP_SIZE, true);
12
- const resources = new ShaderResourceSetDescriptor();
13
- resources.createGroup().addStorageBuffer('scene_database', WebGPUArray.u32, true);
14
- export const shader_water_bodies_derive = ComputeShader.from({
15
- label: "Water / bodies derive", resources,
16
- body: CodeChunk.from(/* language=WGSL */ `
17
- @compute @workgroup_size(${WORKGROUP_SIZE})
18
- fn main(@builtin(workgroup_id) group: vec3u, @builtin(local_invocation_index) lane: u32) {
19
- if (!${pg}_setup(&scene_database, folded_workgroup_index(group), lane)) { return; }
20
- let slot = ${pg}_slot_in_page(lane);
21
- if (slot >= ${pg}_ELEMENTS_PER_PAGE || !${pg}_is_occupied(slot)) { return; }
22
- var body = ${pg}_read(&scene_database, slot);
23
- if (body.dirty == 0u) { return; }
24
- body.backscattering = vec4f(water_medium_backscattering(body.medium), 0.0);
25
- body.extinction = vec4f(body.medium.absorption + water_medium_scattering(body.medium), 0.0);
26
- body.diffuse_transmittance = water_diffuse_fresnel_transmittance(body.ior);
27
- body.dirty = 0u;
28
- ${table.marshalling_method_write}(&scene_database, ${pg}_slot_to_index(slot), body);
29
- }
30
- `, [table.chunk_iterate(WORKGROUP_SIZE, true), table.chunk_write, chunk_water_medium_derived,
31
- chunk_water_medium_scattering, chunk_folded_workgroup_index]),
32
- });
@@ -1,25 +0,0 @@
1
- /**
2
- * A shared wave atlas, indexed by occupied water_waves rows. Calm bodies allocate no grid.
3
- * Each fixed step dispatches the whole atlas once; tessellated vertices sample it in local xz.
4
- * The regular grid is a displacement field, never the rendered water footprint.
5
- */
6
- export class GPUWaterWaveSimulation {
7
- onInputsConsumed: Signal;
8
- resolution: number;
9
- step: number;
10
- max_steps_per_frame: number;
11
- damping: number;
12
- get time(): number;
13
- get buffer(): any;
14
- get grid_resolution(): number;
15
- advance(dt: any): void;
16
- dispose(): void;
17
- record({ graph, device, scene }: {
18
- graph: any;
19
- device: any;
20
- scene: any;
21
- }): void;
22
- #private;
23
- }
24
- import Signal from "../../../../core/events/signal/Signal.js";
25
- //# sourceMappingURL=GPUWaterWaveSimulation.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"GPUWaterWaveSimulation.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/water/surface/GPUWaterWaveSimulation.js"],"names":[],"mappings":"AAKA;;;;GAIG;AACH;IACI,yBAAgC;IAChC,mBAAiB;IACjB,aAAe;IACf,4BAAwB;IACxB,gBAAe;IAYf,mBAAiC;IACjC,kBAAkD;IAClD,8BAAqE;IAErE,uBAIC;IAED,gBAMC;IAED;;;;aAiFC;;CACJ;mBA/HkB,0CAA0C"}
@@ -1,128 +0,0 @@
1
- import Signal from "../../../../core/events/signal/Signal.js";
2
- import { assert } from "../../../../core/assert.js";
3
- import { WATER_WAVE_BATCH_STRUCT, shader_water_wave_batch, shader_water_wave_batch_finish } from "./shader_water_wave_batch.js";
4
- import { shader_water_wave_bounds, shader_water_wave_domain } from "./shader_water_wave_domain.js";
5
-
6
- /**
7
- * A shared wave atlas, indexed by occupied water_waves rows. Calm bodies allocate no grid.
8
- * Each fixed step dispatches the whole atlas once; tessellated vertices sample it in local xz.
9
- * The regular grid is a displacement field, never the rendered water footprint.
10
- */
11
- export class GPUWaterWaveSimulation {
12
- onInputsConsumed = new Signal();
13
- resolution = 128;
14
- step = 1 / 120;
15
- max_steps_per_frame = 8;
16
- damping = 0.08;
17
- #device = null;
18
- #scene = null;
19
- #state = [];
20
- #domain = null;
21
- #capacity = 0;
22
- #resolution = 0;
23
- #parity = 0;
24
- #pending = 0;
25
- #time = 0;
26
- #recorded = new WeakSet();
27
- #write_pending = true;
28
- get time() { return this.#time; }
29
- get buffer() { return this.#state[this.#parity]; }
30
- get grid_resolution() { return this.#resolution || this.resolution; }
31
-
32
- advance(dt) {
33
- assert.isFinite(dt, 'dt'); assert.greaterThanOrEqual(dt, 0, 'dt');
34
- this.#pending += dt;
35
- this.#write_pending = true;
36
- }
37
-
38
- dispose() {
39
- for (const buffer of this.#state) { buffer.destroy(); }
40
- this.#domain?.destroy(); this.#domain = null;
41
- this.#state = []; this.#capacity = 0; this.#device = null; this.#scene = null;
42
- this.#recorded = new WeakSet();
43
- this.#write_pending = true;
44
- }
45
-
46
- record({ graph, device, scene }) {
47
- if (this.#recorded.has(graph)) { return; }
48
- if (device !== this.#device || scene !== this.#scene) {
49
- this.dispose(); this.#device = device; this.#scene = scene;
50
- }
51
- this.#recorded.add(graph);
52
- if (!this.#write_pending) { return; }
53
- this.#write_pending = false;
54
- const table = scene.scene_database.get('water_waves');
55
- const capacity = table.count === 0 ? 0 : table.element_capacity;
56
- assert.isInteger(this.resolution, 'resolution'); assert.greaterThanOrEqual(this.resolution, 2, 'resolution');
57
- assert.greaterThan(this.step, 0, 'step');
58
- const resize = capacity > this.#capacity || (capacity === 0 && this.#capacity !== 0) || this.resolution !== this.#resolution;
59
- const old = this.#state;
60
- const old_domain = this.#domain;
61
- if (resize || old.length === 0) {
62
- const size = Math.max(4, capacity * this.resolution ** 2 * 4);
63
- assert.lessThanOrEqual(size, device.limits.maxStorageBufferBindingSize, 'Water wave atlas exceeds device storage limit; lower waves.resolution');
64
- this.#state = [0, 1].map(i => device.createBuffer({ label: `Water / wave state ${i}`, size,
65
- usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST }));
66
- this.#domain = device.createBuffer({ label: 'Water / authored footprint', size,
67
- usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST });
68
- this.#capacity = capacity;
69
- }
70
- const same_resolution = this.#resolution === this.resolution;
71
- this.#resolution = this.resolution;
72
- const steps = Math.min(Math.floor(this.#pending / this.step + 1e-6), this.max_steps_per_frame);
73
- this.#pending = Math.max(0, Math.min(this.#pending - steps * this.step, this.step));
74
- const start = this.#parity, time = this.#time, state = this.#state, domain = this.#domain;
75
- this.#parity = (start + steps) % 2;
76
- this.#time += steps * this.step;
77
- const n = this.#resolution, dt = this.step, damping = this.damping;
78
- const pass = graph.add('Water / batched surface update', {}, (_d, _r, { encoder }) => {
79
- if (state !== old) {
80
- if (same_resolution && old.length !== 0) {
81
- for (let i = 0; i < 2; i++) { encoder.copyBufferToBuffer(old[i], 0, state[i], 0, Math.min(old[i].size, state[i].size)); }
82
- encoder.copyBufferToBuffer(old_domain, 0, domain, 0, Math.min(old_domain.size, domain.size));
83
- }
84
- encoder.done.then(() => { for (const buffer of old) { buffer.destroy(); } old_domain?.destroy(); });
85
- }
86
- if (capacity === 0) { return; }
87
- const groups = Math.ceil(capacity * n * n / 128);
88
- shader_water_wave_domain.dispatch({ encoder, bindings: {
89
- batch: encoder.allocateTransientValueBuffer(WATER_WAVE_BATCH_STRUCT,
90
- { resolution: n, capacity, apply_impulses: same_resolution ? 0 : 1 }),
91
- scene_database: scene.scene_database_buffer, domain,
92
- geometries: scene.geometries.buffer_metadata,
93
- blas_lookup: scene.geometries.blas.buffer_metadata, blas_data: scene.geometries.blas.buffer_data,
94
- meshlet_metadata: scene.geometries.meshlets.buffer_metadata, meshlet_data: scene.geometries.meshlets.buffer_data,
95
- }, group_count_x: Math.min(groups, 65535), group_count_y: Math.ceil(groups / 65535) });
96
- const dispatch = (parity, step_dt, step_time, apply_impulses) => {
97
- shader_water_wave_batch.dispatch({ encoder, bindings: {
98
- batch: encoder.allocateTransientValueBuffer(WATER_WAVE_BATCH_STRUCT,
99
- { resolution: n, capacity, dt: step_dt, time: step_time, damping, apply_impulses }),
100
- scene_database: scene.scene_database_buffer, domain, state_current: state[parity], state_previous: state[1 - parity],
101
- }, group_count_x: Math.min(groups, 65535), group_count_y: Math.ceil(groups / 65535) });
102
- };
103
- // Clear both histories of new/reused slots before advancing, then release the reset flag.
104
- dispatch(0, 0, time, 0); dispatch(1, 0, time, 0);
105
- const finish = apply_impulses => {
106
- const groups = table.dispatch_group_count(64);
107
- shader_water_wave_batch_finish.dispatch({ encoder, bindings: { scene_database: scene.scene_database_buffer,
108
- batch: encoder.allocateTransientValueBuffer(WATER_WAVE_BATCH_STRUCT,
109
- { resolution: n, capacity, dt, time, damping, apply_impulses }) },
110
- group_count_x: Math.min(groups, 65535), group_count_y: Math.ceil(groups / 65535) });
111
- };
112
- finish(0);
113
- for (let i = 0; i < steps; i++) { dispatch((start + i) % 2, dt, time + i * dt, i === 0 ? 1 : 0); }
114
- if (steps > 0) {
115
- finish(1);
116
- // Submit is the ownership boundary for staged CPU inputs. Use the encoder's
117
- // existing synchronous signal so a later scene/update cannot be cleared by
118
- // an old promise callback.
119
- encoder.onFinished.addOne(() => this.onInputsConsumed.dispatch(scene));
120
- }
121
- shader_water_wave_bounds.dispatch({ encoder, bindings: {
122
- batch: encoder.allocateTransientValueBuffer(WATER_WAVE_BATCH_STRUCT, { resolution: n, capacity }),
123
- scene_database: scene.scene_database_buffer, state: state[(start + steps) % 2],
124
- }, group_count_x: Math.min(capacity, 65535), group_count_y: Math.ceil(capacity / 65535) });
125
- });
126
- pass.make_side_effect();
127
- }
128
- }
@@ -1,9 +0,0 @@
1
- export const WATER_TILE_CELLS: 16;
2
- export const WATER_TILE_VERTEX_COUNT: number;
3
- export const WATER_TILE_STRUCT: WebGPUStruct;
4
- export const WATER_TESSELLATION_STRUCT: WebGPUStruct;
5
- /** Clip in barycentric space: every generated point remains on the authored triangle. */
6
- export const chunk_water_tessellation: CodeChunk;
7
- import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
8
- import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
9
- //# sourceMappingURL=chunk_water_tessellation.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"chunk_water_tessellation.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/water/surface/chunk_water_tessellation.js"],"names":[],"mappings":"AAKA,kCAAmC;AAEnC,6CAAkE;AAClE,6CAEuB;AACvB,qDAE+B;AAE/B,yFAAyF;AACzF,iDA+H8B;6BA9ID,mCAAmC;0BADtC,oCAAoC"}