@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
@@ -1,9 +1,11 @@
1
1
  import { assert } from "../../../../core/assert.js";
2
2
  import { clamp } from "../../../../core/math/clamp.js";
3
- import { v3_grid_sample_scalar_masked } from "./v3_grid_sample_scalar_masked.js";
3
+ import { v3_grid_sample_scalar_masked, v3_grid_sample_scalar_masked_array } from "./v3_grid_sample_scalar_masked.js";
4
4
  import { v3_mac_clip_trace } from "./v3_mac_clip_trace.js";
5
5
 
6
6
  const scratch_clip = new Float32Array(3);
7
+ // This synchronous typed-array kernel has no callbacks while a sample is in progress.
8
+ const scratch_sample_operands = new Float64Array(4);
7
9
 
8
10
  /**
9
11
  * Straight-line (loop-free, inlinable) test: is the cell containing the
@@ -66,6 +68,7 @@ export function v3_mac_advect_sl_scalar(output, input, vel_u, vel_v, vel_w, res_
66
68
  assert.greaterThanOrEqual(input.length, cell_count, "input covers grid");
67
69
 
68
70
  const cell_slice = res_x * res_y;
71
+ const operands = scratch_sample_operands;
69
72
  const sx = res_x + 1;
70
73
  const v_slice = res_x * (res_y + 1);
71
74
 
@@ -96,8 +99,11 @@ export function v3_mac_advect_sl_scalar(output, input, vel_u, vel_v, vel_w, res_
96
99
  bx = scratch_clip[0]; by = scratch_clip[1]; bz = scratch_clip[2];
97
100
  }
98
101
 
99
- output[c] = v3_grid_sample_scalar_masked(input, solid, res_x, res_y, res_z,
100
- bx, by, bz, input[c]);
102
+ operands[0] = bx;
103
+ operands[1] = by;
104
+ operands[2] = bz;
105
+ operands[3] = input[c];
106
+ v3_grid_sample_scalar_masked_array(output, c, input, solid, res_x, res_y, res_z, operands, 0);
101
107
  }
102
108
  }
103
109
  }
@@ -1 +1 @@
1
- {"version":3,"file":"v3_mac_advect_sl_velocity.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/fluid/solver/v3_mac_advect_sl_velocity.js"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,mDAZW,YAAY,EAAE,WACd,YAAY,EAAE,WACd,YAAY,EAAE,SACd,MAAM,SACN,MAAM,SACN,MAAM,cACN,MAAM,gBACN,UAAU,gBACV,UAAU,gBACV,UAAU,SACV,UAAU,QAwKpB"}
1
+ {"version":3,"file":"v3_mac_advect_sl_velocity.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/fluid/solver/v3_mac_advect_sl_velocity.js"],"names":[],"mappings":"AAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,mDAZW,YAAY,EAAE,WACd,YAAY,EAAE,WACd,YAAY,EAAE,SACd,MAAM,SACN,MAAM,SACN,MAAM,cACN,MAAM,gBACN,UAAU,gBACV,UAAU,gBACV,UAAU,SACV,UAAU,QAuLpB"}
@@ -1,8 +1,9 @@
1
1
  import { assert } from "../../../../core/assert.js";
2
- import { scs3d_sample_linear } from "../../../graphics/texture/3d/scs3d_sample_linear.js";
2
+ import { scs3d_sample_linear_array } from "../../../graphics/texture/3d/scs3d_sample_linear.js";
3
3
  import { v3_mac_clip_trace } from "./v3_mac_clip_trace.js";
4
4
 
5
5
  const scratch_clip = new Float32Array(3);
6
+ const scratch_position = new Float64Array(3);
6
7
 
7
8
  /**
8
9
  * Semi-Lagrangian advection of a MAC (face-centered) velocity field along a
@@ -116,12 +117,17 @@ export function v3_mac_advect_sl_velocity(outputs, sources, carrier, res_x, res_
116
117
  if (ecy < 0) ecy = 0; else if (ecy >= res_y) ecy = last_cy;
117
118
  if (ecz < 0) ecz = 0; else if (ecz >= res_z) ecz = last_cz;
118
119
  if (solid[ecz * cell_slice + ecy * res_x + ecx] === 0) {
119
- out_u[f] = scs3d_sample_linear(src_u, sx, res_y, res_z, ex + 0.5, ey, ez);
120
+ scratch_position[0] = ex + 0.5;
121
+ scratch_position[1] = ey;
122
+ scratch_position[2] = ez;
123
+ scs3d_sample_linear_array(out_u, f, src_u, sx, res_y, res_z, scratch_position, 0);
120
124
  } else {
121
125
  v3_mac_clip_trace(scratch_clip, solid, res_x, res_y, res_z,
122
126
  x - 0.5, y, z, ex, ey, ez);
123
- out_u[f] = scs3d_sample_linear(src_u, sx, res_y, res_z,
124
- scratch_clip[0] + 0.5, scratch_clip[1], scratch_clip[2]);
127
+ scratch_position[0] = scratch_clip[0] + 0.5;
128
+ scratch_position[1] = scratch_clip[1];
129
+ scratch_position[2] = scratch_clip[2];
130
+ scs3d_sample_linear_array(out_u, f, src_u, sx, res_y, res_z, scratch_position, 0);
125
131
  }
126
132
  }
127
133
  }
@@ -159,12 +165,17 @@ export function v3_mac_advect_sl_velocity(outputs, sources, carrier, res_x, res_
159
165
  if (ecy < 0) ecy = 0; else if (ecy >= res_y) ecy = last_cy;
160
166
  if (ecz < 0) ecz = 0; else if (ecz >= res_z) ecz = last_cz;
161
167
  if (solid[ecz * cell_slice + ecy * res_x + ecx] === 0) {
162
- out_v[f] = scs3d_sample_linear(src_v, res_x, sy, res_z, ex, ey + 0.5, ez);
168
+ scratch_position[0] = ex;
169
+ scratch_position[1] = ey + 0.5;
170
+ scratch_position[2] = ez;
171
+ scs3d_sample_linear_array(out_v, f, src_v, res_x, sy, res_z, scratch_position, 0);
163
172
  } else {
164
173
  v3_mac_clip_trace(scratch_clip, solid, res_x, res_y, res_z,
165
174
  x, y - 0.5, z, ex, ey, ez);
166
- out_v[f] = scs3d_sample_linear(src_v, res_x, sy, res_z,
167
- scratch_clip[0], scratch_clip[1] + 0.5, scratch_clip[2]);
175
+ scratch_position[0] = scratch_clip[0];
176
+ scratch_position[1] = scratch_clip[1] + 0.5;
177
+ scratch_position[2] = scratch_clip[2];
178
+ scs3d_sample_linear_array(out_v, f, src_v, res_x, sy, res_z, scratch_position, 0);
168
179
  }
169
180
  }
170
181
  }
@@ -204,12 +215,17 @@ export function v3_mac_advect_sl_velocity(outputs, sources, carrier, res_x, res_
204
215
  if (ecy < 0) ecy = 0; else if (ecy >= res_y) ecy = last_cy;
205
216
  if (ecz < 0) ecz = 0; else if (ecz >= res_z) ecz = last_cz;
206
217
  if (solid[ecz * cell_slice + ecy * res_x + ecx] === 0) {
207
- out_w[f] = scs3d_sample_linear(src_w, res_x, res_y, sz, ex, ey, ez + 0.5);
218
+ scratch_position[0] = ex;
219
+ scratch_position[1] = ey;
220
+ scratch_position[2] = ez + 0.5;
221
+ scs3d_sample_linear_array(out_w, f, src_w, res_x, res_y, sz, scratch_position, 0);
208
222
  } else {
209
223
  v3_mac_clip_trace(scratch_clip, solid, res_x, res_y, res_z,
210
224
  x, y, z - 0.5, ex, ey, ez);
211
- out_w[f] = scs3d_sample_linear(src_w, res_x, res_y, sz,
212
- scratch_clip[0], scratch_clip[1], scratch_clip[2] + 0.5);
225
+ scratch_position[0] = scratch_clip[0];
226
+ scratch_position[1] = scratch_clip[1];
227
+ scratch_position[2] = scratch_clip[2] + 0.5;
228
+ scs3d_sample_linear_array(out_w, f, src_w, res_x, res_y, sz, scratch_position, 0);
213
229
  }
214
230
  }
215
231
  }
@@ -28,10 +28,7 @@ export class RandomContainerAudioClip extends ContainerAudioClip {
28
28
  * container picks uniformly). A weight of `0` (or any non-positive value) means the child is
29
29
  * NEVER picked.
30
30
  *
31
- * Degenerate-but-accepted: if EVERY weight is 0 the container still resolves — deterministically —
32
- * to a single child (there is simply nothing to weight, so the pick collapses to a fixed index).
33
- * That is a content-authoring mistake, not an engine fault; the engine stays well-defined. In
34
- * other words, ten children all weighted 0 will "work", but you get the dog food.
31
+ * If every child is disabled, the container resolves to an empty timeline.
35
32
  * @type {number[]}
36
33
  */
37
34
  weights: number[];
@@ -81,9 +78,9 @@ export class RandomContainerAudioClip extends ContainerAudioClip {
81
78
  * this clip) rather than on this shared, immutable definition; this method owns both the selection
82
79
  * algorithm and the maintenance of that history ring.
83
80
  * @param {SopraPlaybackContext} playback
84
- * @returns {number} chosen child index
81
+ * @returns {number|undefined} chosen child index, or undefined when no child has positive weight
85
82
  */
86
- pickChildIndex(playback: SopraPlaybackContext): number;
83
+ pickChildIndex(playback: SopraPlaybackContext): number | undefined;
87
84
  planTimeline(env: any, gainDb?: number, pitchCents?: number, offset?: number): {
88
85
  plays: {
89
86
  clip: import("./SampleAudioClip.js").SampleAudioClip;
@@ -1 +1 @@
1
- {"version":3,"file":"RandomContainerAudioClip.d.ts","sourceRoot":"","sources":["../../../../../../../src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.js"],"names":[],"mappings":"AAMA;;;;;GAKG;AACH;IAqEI;;;;;;OAMG;IACH,uBALW,mBAAmB,oCACnB;QAAC,kBAAkB,CAAC,EAAC,MAAM,CAAC;QAAC,OAAO,CAAC,EAAC,MAAM,EAAE,CAAA;KAAC,GAE7C,wBAAwB,CAapC;IArFD;;;OAGG;IACH,sBAFU,MAAM,CAES;IAEzB;;;;;;;;;;;;OAYG;IACH,SAFU,MAAM,EAAE,CAEL;IAEb;;;;;OAKG;IACH,4CAFa,IAAI,CAQhB;IAWD;;;;;;OAMG;IACH,oBAHW,MAAM,EAAE,GACN,IAAI,CAgBhB;IAsBD;;;;OAIG;IACH,cAHW,wBAAwB,GACtB,OAAO,CAuBnB;IAcD,kCAaC;IAED;;;;;;;;;MAQC;IAED;;;;;;aAQC;IAED;;;;;;;;OAQG;IACH,gDAFa,MAAM,CA6BlB;IAED;;;;;;;;;MAQC;CACJ;;;;mCA5NkC,yBAAyB"}
1
+ {"version":3,"file":"RandomContainerAudioClip.d.ts","sourceRoot":"","sources":["../../../../../../../src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.js"],"names":[],"mappings":"AAMA;;;;;GAKG;AACH;IAkEI;;;;;;OAMG;IACH,uBALW,mBAAmB,oCACnB;QAAC,kBAAkB,CAAC,EAAC,MAAM,CAAC;QAAC,OAAO,CAAC,EAAC,MAAM,EAAE,CAAA;KAAC,GAE7C,wBAAwB,CAapC;IAlFD;;;OAGG;IACH,sBAFU,MAAM,CAES;IAEzB;;;;;;;;;OASG;IACH,SAFU,MAAM,EAAE,CAEL;IAEb;;;;;OAKG;IACH,4CAFa,IAAI,CAQhB;IAWD;;;;;;OAMG;IACH,oBAHW,MAAM,EAAE,GACN,IAAI,CAgBhB;IAsBD;;;;OAIG;IACH,cAHW,wBAAwB,GACtB,OAAO,CAuBnB;IAcD,kCAaC;IAED;;;;;;;;;MAQC;IAED;;;;;;aAQC;IAED;;;;;;;;OAQG;IACH,gDAFa,MAAM,GAAC,SAAS,CAyC5B;IAED;;;;;;;;;MAYC;CACJ;;;;mCAzOkC,yBAAyB"}
@@ -25,10 +25,7 @@ export class RandomContainerAudioClip extends ContainerAudioClip {
25
25
  * container picks uniformly). A weight of `0` (or any non-positive value) means the child is
26
26
  * NEVER picked.
27
27
  *
28
- * Degenerate-but-accepted: if EVERY weight is 0 the container still resolves — deterministically —
29
- * to a single child (there is simply nothing to weight, so the pick collapses to a fixed index).
30
- * That is a content-authoring mistake, not an engine fault; the engine stays well-defined. In
31
- * other words, ten children all weighted 0 will "work", but you get the dog food.
28
+ * If every child is disabled, the container resolves to an empty timeline.
32
29
  * @type {number[]}
33
30
  */
34
31
  weights = [];
@@ -181,29 +178,41 @@ export class RandomContainerAudioClip extends ContainerAudioClip {
181
178
  * this clip) rather than on this shared, immutable definition; this method owns both the selection
182
179
  * algorithm and the maintenance of that history ring.
183
180
  * @param {SopraPlaybackContext} playback
184
- * @returns {number} chosen child index
181
+ * @returns {number|undefined} chosen child index, or undefined when no child has positive weight
185
182
  */
186
183
  pickChildIndex(playback) {
187
184
  const children = this.children;
188
185
  const n = children.length;
189
186
 
190
- // can't avoid every option — cap so at least one candidate remains
191
- const avoid = Math.min(this.avoid_repeating_last, n - 1);
187
+ const weights = this.weights;
188
+ let eligibleCount = 0;
189
+ for (let i = 0; i < n; i++) {
190
+ if (weights[i] > 0) eligibleCount++;
191
+ }
192
+
193
+ // Disabled children cannot keep an enabled choice out of contention.
194
+ const avoid = Math.max(0, Math.min(this.avoid_repeating_last, eligibleCount - 1));
192
195
 
193
196
  const recent = playback.getState(this, () => []);
197
+ while (recent.length > avoid) {
198
+ recent.shift();
199
+ }
194
200
 
195
201
  const candidates = [];
196
202
  for (let i = 0; i < n; i++) {
197
- if (recent.indexOf(i) === -1) {
203
+ if (weights[i] > 0 && recent.indexOf(i) === -1) {
198
204
  candidates.push(i);
199
205
  }
200
206
  }
201
207
 
202
208
  // weighted pick among the surviving candidates (weight looked up by child index). With the
203
209
  // default all-1 weights this is a uniform draw; a 0 weight removes that child from contention.
204
- const weights = this.weights;
205
210
  const index = weightedRandomFromArray(candidates, playback.random, i => weights[i]);
206
211
 
212
+ if (index === undefined) {
213
+ return undefined;
214
+ }
215
+
207
216
  recent.push(index);
208
217
  while (recent.length > avoid) {
209
218
  recent.shift();
@@ -219,6 +228,10 @@ export class RandomContainerAudioClip extends ContainerAudioClip {
219
228
 
220
229
  const index = this.pickChildIndex(env.playback);
221
230
 
231
+ if (index === undefined) {
232
+ return { plays: [], duration: 0 };
233
+ }
234
+
222
235
  return this.children[index].planTimeline(env, gainDb + this.gain, pitchCents + this.pitch, offset);
223
236
  }
224
237
  }
@@ -20,13 +20,16 @@ export class DraggableAspect {
20
20
  * @param {(position:Vector2, event:Event)=>*} [options.dragStart=noop]
21
21
  * @param {(position:Vector2, origin:Vector2, delta:Vector2, event:Event)=>*} [options.drag=noop]
22
22
  * @param {(position:Vector2, origin:Vector2, event:Event)=>*} [options.dragEnd=noop]
23
+ * @param {(event:Event|undefined)=>*} [options.dragCancel=noop] called for a cancelled press or drag;
24
+ * pointercancel/blur carries its event, while stop() carries undefined. Cancellation never commits dragEnd.
23
25
  * @param {boolean} [options.stopPropagation=true] prevent propagation of pointer events up the DOM tree
24
26
  */
25
- constructor({ el, dragStart, drag, dragEnd, stopPropagation }: {
27
+ constructor({ el, dragStart, drag, dragEnd, dragCancel, stopPropagation }: {
26
28
  el: EventTarget;
27
29
  dragStart?: (position: Vector2, event: Event) => any;
28
30
  drag?: (position: Vector2, origin: Vector2, delta: Vector2, event: Event) => any;
29
31
  dragEnd?: (position: Vector2, origin: Vector2, event: Event) => any;
32
+ dragCancel?: (event: Event | undefined) => any;
30
33
  stopPropagation?: boolean;
31
34
  });
32
35
  /**
@@ -44,6 +47,7 @@ export class DraggableAspect {
44
47
  getPointer(): PointerDevice;
45
48
  start(): void;
46
49
  stop(): void;
50
+ #private;
47
51
  }
48
52
  import { PointerDevice } from "../input/devices/PointerDevice.js";
49
53
  import Vector2 from "../../core/geom/Vector2.js";
@@ -1 +1 @@
1
- {"version":3,"file":"DraggableAspect.d.ts","sourceRoot":"","sources":["../../../../src/engine/ui/DraggableAspect.js"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;GAaG;AACH;IACI;;;;;;;;OAQG;IACH;QANgC,EAAE,EAAvB,WAAW;QACkC,SAAS,GAAtD,CAAC,QAAQ,EAAC,OAAO,EAAE,KAAK,EAAC,KAAK,QAAI;QAC0C,IAAI,GAAhF,CAAC,QAAQ,EAAC,OAAO,EAAE,MAAM,EAAC,OAAO,EAAE,KAAK,EAAC,OAAO,EAAE,KAAK,EAAC,KAAK,QAAI;QACJ,OAAO,GAApE,CAAC,QAAQ,EAAC,OAAO,EAAE,MAAM,EAAC,OAAO,EAAE,KAAK,EAAC,KAAK,QAAI;QAChC,eAAe,GAAjC,OAAO;OAuEjB;IApEG;;;;;OAKG;IACH,8BAAyC;IAQnB,+BAA8C;IAwDxE;;;OAGG;IACH,cAFa,aAAa,CAIzB;IAED,cAEC;IAED,aAGC;CACJ;8BAjHyD,mCAAmC;oBADzE,4BAA4B"}
1
+ {"version":3,"file":"DraggableAspect.d.ts","sourceRoot":"","sources":["../../../../src/engine/ui/DraggableAspect.js"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;GAaG;AACH;IAKI;;;;;;;;;;OAUG;IACH;QARgC,EAAE,EAAvB,WAAW;QACkC,SAAS,GAAtD,CAAC,QAAQ,EAAC,OAAO,EAAE,KAAK,EAAC,KAAK,QAAI;QAC0C,IAAI,GAAhF,CAAC,QAAQ,EAAC,OAAO,EAAE,MAAM,EAAC,OAAO,EAAE,KAAK,EAAC,OAAO,EAAE,KAAK,EAAC,KAAK,QAAI;QACJ,OAAO,GAApE,CAAC,QAAQ,EAAC,OAAO,EAAE,MAAM,EAAC,OAAO,EAAE,KAAK,EAAC,KAAK,QAAI;QACb,UAAU,GAA/C,CAAC,KAAK,EAAC,KAAK,GAAC,SAAS,QAAI;QAER,eAAe,GAAjC,OAAO;OAkHjB;IA/GG;;;;;OAKG;IACH,8BAAyC;IAQnB,+BAA8C;IAmGxE;;;OAGG;IACH,cAFa,aAAa,CAIzB;IAED,cAMC;IAED,aAOC;;CACJ;8BA1KyD,mCAAmC;oBADzE,4BAA4B"}
@@ -17,6 +17,10 @@ import { PointerDevice, readPositionFromMouseEvent } from "../input/devices/Poin
17
17
  * @copyright Company Named Limited (c) 2026
18
18
  */
19
19
  export class DraggableAspect {
20
+ #started = false;
21
+ #cancelGesture = noop;
22
+ #handleCancel = event => this.#cancelGesture(event);
23
+
20
24
  /**
21
25
  *
22
26
  * @param {Object} options
@@ -24,9 +28,11 @@ export class DraggableAspect {
24
28
  * @param {(position:Vector2, event:Event)=>*} [options.dragStart=noop]
25
29
  * @param {(position:Vector2, origin:Vector2, delta:Vector2, event:Event)=>*} [options.drag=noop]
26
30
  * @param {(position:Vector2, origin:Vector2, event:Event)=>*} [options.dragEnd=noop]
31
+ * @param {(event:Event|undefined)=>*} [options.dragCancel=noop] called for a cancelled press or drag;
32
+ * pointercancel/blur carries its event, while stop() carries undefined. Cancellation never commits dragEnd.
27
33
  * @param {boolean} [options.stopPropagation=true] prevent propagation of pointer events up the DOM tree
28
34
  */
29
- constructor({ el, dragStart = noop, drag = noop, dragEnd = noop, stopPropagation = true }) {
35
+ constructor({ el, dragStart = noop, drag = noop, dragEnd = noop, dragCancel = noop, stopPropagation = true }) {
30
36
  /**
31
37
  *
32
38
  * @type {PointerDevice}
@@ -48,6 +54,41 @@ export class DraggableAspect {
48
54
 
49
55
  // top-left corner of `el` in client space, sampled when a drag gesture begins
50
56
  const frameOrigin = new Vector2();
57
+ let pressed = false;
58
+ let dragging = false;
59
+ let pointerId = null;
60
+ let stopDrag = null;
61
+
62
+ this.#cancelGesture = event => {
63
+ if (event?.type === 'pointercancel' && event.pointerId !== pointerId) return;
64
+ const pending = pressed || dragging;
65
+ pressed = dragging = false;
66
+ pointerId = null;
67
+ if (stopDrag !== null) {
68
+ pointerGlobal.on.up.remove(stopDrag);
69
+ stopDrag = null;
70
+ }
71
+ pointerGlobal.stop();
72
+ // An uncaptured pointer can be cancelled outside the local element. Clear its
73
+ // pending detector before the caller can stop the aspect in dragCancel.
74
+ if (pending && event?.type === 'pointercancel' && this.#started) {
75
+ this.pointerLocal.stop();
76
+ if (this.#started) this.pointerLocal.start();
77
+ }
78
+ if (pending) dragCancel(event);
79
+ };
80
+
81
+ this.pointerLocal.on.down.add((p, event) => {
82
+ if (pressed || dragging) return;
83
+ pressed = true;
84
+ pointerId = event.pointerId;
85
+ });
86
+ this.pointerLocal.on.globalUp.add((p, event) => {
87
+ if (!dragging && event.pointerId === pointerId) {
88
+ pressed = false;
89
+ pointerId = null;
90
+ }
91
+ });
51
92
 
52
93
  if (stopPropagation) {
53
94
  this.pointerLocal.on.down.add((p, e) => {
@@ -56,6 +97,8 @@ export class DraggableAspect {
56
97
  }
57
98
 
58
99
  this.pointerLocal.on.dragStart.add((p, event) => {
100
+ if (!pressed || dragging || event.pointerId !== pointerId) return;
101
+ dragging = true;
59
102
  // freeze the coordinate frame of `el` for the duration of the gesture
60
103
  if (typeof el.getBoundingClientRect === "function") {
61
104
  const rect = el.getBoundingClientRect();
@@ -70,9 +113,14 @@ export class DraggableAspect {
70
113
  pointerGlobal.start();
71
114
 
72
115
  dragStart(p, event);
116
+ if (!dragging) return;
73
117
 
74
- function stopDrag(endClientPosition, endEvent) {
118
+ stopDrag = (endClientPosition, endEvent) => {
119
+ if (endEvent.pointerId !== pointerId) return;
75
120
  pointerGlobal.on.up.remove(stopDrag);
121
+ stopDrag = null;
122
+ pressed = dragging = false;
123
+ pointerId = null;
76
124
  pointerGlobal.stop();
77
125
 
78
126
  position.set(
@@ -81,12 +129,13 @@ export class DraggableAspect {
81
129
  );
82
130
 
83
131
  dragEnd(position, dragOriginalPosition, endEvent);
84
- }
132
+ };
85
133
 
86
134
  pointerGlobal.on.up.add(stopDrag);
87
135
  });
88
136
 
89
137
  this.pointerGlobal.on.move.add((clientPosition, event, delta) => {
138
+ if (!dragging || event.pointerId !== pointerId) return;
90
139
  // the global device reports client coordinates, convert into the frozen frame of `el`
91
140
  position.set(
92
141
  clientPosition.x - frameOrigin.x,
@@ -106,11 +155,19 @@ export class DraggableAspect {
106
155
  }
107
156
 
108
157
  start() {
158
+ this.#started = true;
109
159
  this.pointerLocal.start();
160
+ this.pointerLocal.domElement.addEventListener('pointercancel', this.#handleCancel);
161
+ window.addEventListener('pointercancel', this.#handleCancel);
162
+ window.addEventListener('blur', this.#handleCancel);
110
163
  }
111
164
 
112
165
  stop() {
166
+ this.#started = false;
167
+ this.pointerLocal.domElement.removeEventListener('pointercancel', this.#handleCancel);
168
+ window.removeEventListener('pointercancel', this.#handleCancel);
169
+ window.removeEventListener('blur', this.#handleCancel);
113
170
  this.pointerLocal.stop();
114
- this.pointerGlobal.stop();
171
+ this.#cancelGesture();
115
172
  }
116
173
  }
@@ -137,7 +137,7 @@ export class ImageRotation {
137
137
  angle: number;
138
138
  }
139
139
  /**
140
- * `imir` — mirroring, applied after `clap` and before `irot`.
140
+ * `imir` — mirroring, applied after `clap` and `irot` in MIAF.
141
141
  */
142
142
  export class ImageMirror {
143
143
  static TYPE: string;
@@ -184,7 +184,7 @@ export class ImageRotation {
184
184
  }
185
185
 
186
186
  /**
187
- * `imir` — mirroring, applied after `clap` and before `irot`.
187
+ * `imir` — mirroring, applied after `clap` and `irot` in MIAF.
188
188
  */
189
189
  export class ImageMirror {
190
190
  static TYPE = "imir";
@@ -1 +1 @@
1
- {"version":3,"file":"png_chunk_decode_iTXt.d.ts","sourceRoot":"","sources":["../../../../../../src/format/image/png/chunk/png_chunk_decode_iTXt.js"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,6CAHW,UAAU,GACR,QAAQ;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,kBAAkB,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAC,CAAC,CA8CtG"}
1
+ {"version":3,"file":"png_chunk_decode_iTXt.d.ts","sourceRoot":"","sources":["../../../../../../src/format/image/png/chunk/png_chunk_decode_iTXt.js"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,6CAHW,UAAU,GACR,QAAQ;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,kBAAkB,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAC,CAAC,CAwDtG"}
@@ -1,4 +1,5 @@
1
1
  import { BinaryBuffer } from "../../../../core/binary/BinaryBuffer.js";
2
+ import { utf8_decode } from "../../../../core/binary/utf8/utf8_decode.js";
2
3
  import { png_inflate } from "../png_inflate.js";
3
4
 
4
5
  /**
@@ -16,20 +17,32 @@ export async function png_chunk_decode_iTXt(chunk) {
16
17
  const buffer = BinaryBuffer.fromArrayBuffer(chunk_buffer);
17
18
  buffer.position = chunk_byte_offset;
18
19
 
19
- const keyword = buffer.readASCIICharacters(79, true);
20
+ const keyword = buffer.readASCIICharacters(80, true);
21
+ if (keyword.length > 79) {
22
+ throw new Error('iTXt keyword exceeds 79 bytes');
23
+ }
20
24
  const compression_flag = buffer.readUint8();
21
25
  const compression_method = buffer.readUint8();
22
26
 
23
27
 
24
28
  const language_tag = buffer.readASCIICharacters(Number.MAX_SAFE_INTEGER, true);
25
- const translated_keyword = buffer.readASCIICharacters(Number.MAX_SAFE_INTEGER, true);
29
+ const translated_start = buffer.position - chunk_byte_offset;
30
+ let translated_end = translated_start;
31
+ while (translated_end < chunk_size && chunk[translated_end] !== 0) {
32
+ translated_end++;
33
+ }
34
+ if (translated_end >= chunk_size) {
35
+ throw new Error('iTXt translated keyword is not terminated');
36
+ }
37
+ const translated_keyword = utf8_decode(chunk, translated_start, translated_end);
38
+ buffer.position = chunk_byte_offset + translated_end + 1;
26
39
 
27
40
  const remaining_bytes = chunk_byte_end - buffer.position;
28
41
 
29
42
  let text;
30
43
 
31
44
  if (compression_flag === 0) {
32
- text = buffer.readASCIICharacters(remaining_bytes);
45
+ text = utf8_decode(chunk, buffer.position - chunk_byte_offset, chunk_size);
33
46
  } else if (compression_flag === 1) {
34
47
 
35
48
  if (compression_method !== 0) {
@@ -38,9 +51,7 @@ export async function png_chunk_decode_iTXt(chunk) {
38
51
 
39
52
  const decoded = await png_inflate([new Uint8Array(buffer.data, buffer.position, remaining_bytes)]);
40
53
 
41
- buffer.fromArrayBuffer(decoded.buffer);
42
-
43
- text = buffer.readASCIICharacters(decoded.byteLength);
54
+ text = utf8_decode(decoded);
44
55
  } else {
45
56
  throw new Error(`Invalid compression flag value '${compression_flag}'`);
46
57
  }
@@ -38,10 +38,8 @@ export class SoftwareGPUDevice extends SoftwareGPUObjectBase implements GPUDevic
38
38
  * @param {GPUFeatureName[]} [descriptor.requiredFeatures] optional features to enable, from
39
39
  * {@link SUPPORTED_OPTIONAL_FEATURES}. Asking for one this device cannot emulate throws, as
40
40
  * `requestDevice` rejects for one the adapter does not have.
41
- * @param {Partial<GPUSupportedLimits>} [descriptor.requiredLimits] limits to report instead of
42
- * the defaults. Only *worse* values are accepted — see {@link build_limits}. Lowering one is how
43
- * a test reaches the clamping paths the renderer takes on a small device without allocating
44
- * anything large.
41
+ * @param {Partial<GPUSupportedLimits>} [descriptor.requiredLimits] requested limits; worse-than-default
42
+ * requests preserve the defaults, and unsupported better requests are refused
45
43
  */
46
44
  constructor(descriptor?: {
47
45
  label?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"SoftwareGPUDevice.d.ts","sourceRoot":"","sources":["../../../../../src/shade/device/mock/SoftwareGPUDevice.js"],"names":[],"mappings":"AAsQA;;;;;;GAMG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wEAFgB,SAAS;IAkCrB;;;;;;;;;;OAUG;IACH;QAT+B,KAAK,GAAzB,MAAM;QACwB,gBAAgB,GAA9C,gBAAgB;QAGyB,cAAc,GAAvD,2BAA2B;OAyBrC;IAzDD;;;;;OAKG;IACH,qCAEC;IAOD;;;;;;OAMG;IACH,iCAEC;IAmCD;;OAEG;IACH,kCAEC;IAID;;OAEG;IACH,sBAEC;IAaD;;;;;;;;OAQG;IACH,iEAUC;IAwBD;;;;;OAKG;IACH,uCAEC;IAID;;;;OAIG;IACH,2BAEC;IAED;;;;;;;OAOG;IACH,gBAcC;IAID;;;;;;;;;OASG;IACH,uBALW,MAAM,YACN,kCAAkC,YAClC,OAAO,GAAC,uBAAuB,GAC7B,IAAI,CAIhB;IAED;;;;;OAKG;IACH,0BALW,MAAM,YACN,kCAAkC,YAClC,OAAO,GAAC,oBAAoB,GAC1B,IAAI,CAIhB;IAED;;;OAGG;IACH,qBAHW,KAAK,GACH,OAAO,CAInB;IASD;;;;;;;OAOG;IACH,wCAFa,IAAI,CAUhB;IAED;;;;;;;;;OASG;IACH,iBAHa,QAAQ,mBAAiB,IAAI,CAAC,CAc1C;IAED;;;;;;;;;;;;;;OAcG;IACH,yCAFa,IAAI,CA4BhB;IAED;;;;;;;;;OASG;IACH,yDAcC;IAmJD;;;;;;OAMG;IACH,4DAcC;IAED;;;;;;OAMG;IACH,6DAEC;IAED;;;OAGG;IACH,oFAEC;IAED;;;;;;;OAOG;IACH,kEAUC;IAkCD;;;OAGG;IACH,iFAcC;IAED;;;;;;;OAOG;IACH,2EAEC;IAED;;;;;;OAMG;IACH,iFAEC;IAED;;;;;OAKG;IACH,oFAEC;IAUD;;;;;OAKG;IACH,kBAFa,MAAM,CAMlB;IAED;;;OAGG;IACH,+DAQC;IA4BD;;;OAGG;IACH,kFAEC;IAGL;;;OAGG;IACH,8BAFU,OAAO,CAE8B;;CAN9C;;;;;;;;;;;;WA/sBa,mBAAiB,IAAI;;sCArQG,4BAA4B;kCAHhC,wBAAwB;mCASvB,yBAAyB"}
1
+ {"version":3,"file":"SoftwareGPUDevice.d.ts","sourceRoot":"","sources":["../../../../../src/shade/device/mock/SoftwareGPUDevice.js"],"names":[],"mappings":"AA+QA;;;;;;GAMG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wEAFgB,SAAS;IAkCrB;;;;;;;;OAQG;IACH;QAP+B,KAAK,GAAzB,MAAM;QACwB,gBAAgB,GAA9C,gBAAgB;QAGyB,cAAc,GAAvD,2BAA2B;OAuBrC;IAvDD;;;;;OAKG;IACH,qCAEC;IAOD;;;;;;OAMG;IACH,iCAEC;IAiCD;;OAEG;IACH,kCAEC;IAID;;OAEG;IACH,sBAEC;IAaD;;;;;;;;OAQG;IACH,iEAUC;IAwBD;;;;;OAKG;IACH,uCAEC;IAID;;;;OAIG;IACH,2BAEC;IAED;;;;;;;OAOG;IACH,gBAcC;IAID;;;;;;;;;OASG;IACH,uBALW,MAAM,YACN,kCAAkC,YAClC,OAAO,GAAC,uBAAuB,GAC7B,IAAI,CAIhB;IAED;;;;;OAKG;IACH,0BALW,MAAM,YACN,kCAAkC,YAClC,OAAO,GAAC,oBAAoB,GAC1B,IAAI,CAIhB;IAED;;;OAGG;IACH,qBAHW,KAAK,GACH,OAAO,CAInB;IASD;;;;;;;OAOG;IACH,wCAFa,IAAI,CAUhB;IAED;;;;;;;;;OASG;IACH,iBAHa,QAAQ,mBAAiB,IAAI,CAAC,CAc1C;IAED;;;;;;;;;;;;;;OAcG;IACH,yCAFa,IAAI,CA4BhB;IAED;;;;;;;;;OASG;IACH,yDAcC;IAmJD;;;;;;OAMG;IACH,4DAcC;IAED;;;;;;OAMG;IACH,6DAEC;IAED;;;OAGG;IACH,oFAEC;IAED;;;;;;;OAOG;IACH,kEAUC;IAkCD;;;OAGG;IACH,iFAcC;IAED;;;;;;;OAOG;IACH,2EAEC;IAED;;;;;;OAMG;IACH,iFAEC;IAED;;;;;OAKG;IACH,oFAEC;IAUD;;;;;OAKG;IACH,kBAFa,MAAM,CAMlB;IAED;;;OAGG;IACH,+DAQC;IA4BD;;;OAGG;IACH,kFAEC;IAGL;;;OAGG;IACH,8BAFU,OAAO,CAE8B;;CAN9C;;;;;;;;;;;;WA7sBa,mBAAiB,IAAI;;sCA9QG,4BAA4B;kCAHhC,wBAAwB;mCASvB,yBAAyB"}
@@ -87,11 +87,11 @@ const LIMIT_NAMES = Object.keys(DEFAULT_LIMITS);
87
87
  /**
88
88
  * Build the limits one device reports.
89
89
  *
90
- * An override may only make a limit *worse*, which is the direction `requestDevice` allows to
91
- * succeed: asking for a limit better than the adapter supports rejects there, and granting one here
92
- * would let a test pass against a device no hardware offers. "Better" is larger for a `max*` limit
93
- * and smaller for a `min*` one — the alignment limits are minimums, and a device that permitted a
94
- * *smaller* alignment would hide exactly the misalignment bugs those limits exist to catch.
90
+ * Like `requestDevice`, requests worse than the defaults leave those defaults in place.
91
+ * This software device supports the default capabilities, so a better request is refused.
92
+ * "Better" means larger for maximum limits and smaller for minimum alignment limits.
93
+ *
94
+ * @see https://gpuweb.github.io/gpuweb/#dom-gpuadapter-requestdevice
95
95
  *
96
96
  * @param {Partial<GPUSupportedLimits>} [overrides]
97
97
  * @returns {GPUSupportedLimits} frozen, as a real one is read-only
@@ -100,13 +100,23 @@ function build_limits(overrides = {}) {
100
100
  const limits = { ...DEFAULT_LIMITS };
101
101
 
102
102
  for (const [name, value] of Object.entries(overrides)) {
103
+ if (value === undefined) {
104
+ continue;
105
+ }
103
106
  if (!LIMIT_NAMES.includes(name)) {
104
- throw new TypeError(
105
- `SoftwareGPUDevice: '${name}' is not a GPUSupportedLimits member`
107
+ throw new DOMException(
108
+ `SoftwareGPUDevice: '${name}' is not a GPUSupportedLimits member`,
109
+ 'OperationError'
106
110
  );
107
111
  }
108
112
 
109
113
  const is_minimum = name.startsWith('min');
114
+ if (is_minimum && (!Number.isInteger(Math.log2(value)) || value >= 2 ** 32)) {
115
+ throw new DOMException(
116
+ `SoftwareGPUDevice: required alignment limit ${name}=${value} must be a power of two less than 2^32`,
117
+ 'OperationError'
118
+ );
119
+ }
110
120
  const better = is_minimum
111
121
  ? value < DEFAULT_LIMITS[name]
112
122
  : value > DEFAULT_LIMITS[name];
@@ -118,7 +128,6 @@ function build_limits(overrides = {}) {
118
128
  );
119
129
  }
120
130
 
121
- limits[name] = value;
122
131
  }
123
132
 
124
133
  return Object.freeze(limits);
@@ -332,10 +341,8 @@ export class SoftwareGPUDevice extends SoftwareGPUObjectBase {
332
341
  * @param {GPUFeatureName[]} [descriptor.requiredFeatures] optional features to enable, from
333
342
  * {@link SUPPORTED_OPTIONAL_FEATURES}. Asking for one this device cannot emulate throws, as
334
343
  * `requestDevice` rejects for one the adapter does not have.
335
- * @param {Partial<GPUSupportedLimits>} [descriptor.requiredLimits] limits to report instead of
336
- * the defaults. Only *worse* values are accepted — see {@link build_limits}. Lowering one is how
337
- * a test reaches the clamping paths the renderer takes on a small device without allocating
338
- * anything large.
344
+ * @param {Partial<GPUSupportedLimits>} [descriptor.requiredLimits] requested limits; worse-than-default
345
+ * requests preserve the defaults, and unsupported better requests are refused
339
346
  */
340
347
  constructor(descriptor = {}) {
341
348
  super(descriptor);
@@ -990,4 +997,4 @@ export class SoftwareGPUDevice extends SoftwareGPUObjectBase {
990
997
  * @readonly
991
998
  * @type {boolean}
992
999
  */
993
- SoftwareGPUDevice.prototype.isSoftwareGPUDevice = true;
1000
+ SoftwareGPUDevice.prototype.isSoftwareGPUDevice = true;
@@ -1 +1 @@
1
- {"version":3,"file":"sweep_views.d.ts","sourceRoot":"","sources":["../../../../../src/shade/playground/skinned_blas_refit/sweep_views.js"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;GAcG;AAEH;;;;;;;;;;;;GAYG;AACH;IAX6B,QAAQ;IACC,MAAM;IAClB,KAAK;IACJ,MAAM,EAAtB,MAAM;IAC4B,OAAO,UAAhC,OAAO,KAAG,IAAI;IACN,QAAQ,GAAzB,MAAM;IACa,UAAU,GAA7B,MAAM,EAAE;IACS,QAAQ,GAAzB,MAAM;IACW,OAAO,GAAxB,MAAM;IACJ,QAAQ,MAAM,CAAC,CAwG3B"}
1
+ {"version":3,"file":"sweep_views.d.ts","sourceRoot":"","sources":["../../../../../src/shade/playground/skinned_blas_refit/sweep_views.js"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;GAcG;AAEH;;;;;;;;;;;;GAYG;AACH;IAX6B,QAAQ;IACC,MAAM;IAClB,KAAK;IACJ,MAAM,EAAtB,MAAM;IAC4B,OAAO,UAAhC,OAAO,KAAG,IAAI;IACN,QAAQ,GAAzB,MAAM;IACa,UAAU,GAA7B,MAAM,EAAE;IACS,QAAQ,GAAzB,MAAM;IACW,OAAO,GAAxB,MAAM;IACJ,QAAQ,MAAM,CAAC,CAyG3B"}
@@ -61,6 +61,7 @@ export async function sweep_views({
61
61
 
62
62
  const kept = {
63
63
  position: [...camera.transform.translation],
64
+ rotation: [...camera.transform.rotation],
64
65
  near: camera.near,
65
66
  far: camera.far,
66
67
  };
@@ -108,7 +109,7 @@ export async function sweep_views({
108
109
  }
109
110
 
110
111
  camera.transform.setTranslation(...kept.position);
111
- camera.transform.lookAt(centre);
112
+ camera.transform.setRotation(...kept.rotation);
112
113
  camera.near = kept.near;
113
114
  camera.far = kept.far;
114
115
 
@@ -46,10 +46,11 @@ and drawn, and its sub-pixel jitter does not move the cut: the τ table below is
46
46
  and off. The environment is not awaited — `test_assets/` is gitignored, so a checkout without it
47
47
  gets the sun alone and still draws every triangle the cut selected.
48
48
 
49
- **Not the GPU sky, and that is worth writing down.** `renderer/atmosphere/GPUSky.js` and
50
- `view/GPUViewSkyContext.js` would be the natural source for this and are **not reachable**: nothing
51
- in the engine constructs either, `GPUSceneContext` has no `sky` for `GPUViewSkyContext.update` to
52
- ask for, and `Renderer` does not mention the atmosphere at all. Reviving it is not a playground's
49
+ **Not the GPU sky, and that is worth writing down.** `view/GPUViewSkyContext.js` would be the
50
+ natural source for this and is **not reachable**: nothing in the engine constructs it, and `Renderer`
51
+ does not mention the atmosphere. (`GPUSceneContext.sky` is real now -- the scene's `GPUSky`, whose
52
+ transmittance and multiple-scattering LUTs the volumetrics read -- but those are look-up tables, not
53
+ the convolved environment this would need.) Reviving the sky as a light source is not a playground's
53
54
  change — the sky produces an already-convolved GPU texture with `SPHERE_PROBE_MIPMAP_LEVELS` mips,
54
55
  while `GPULightCollection` builds its environment privately from a CPU `ShadeTexture` and convolves
55
56
  a full mip chain itself, so the two do not meet without a new way to hand that class a GPU-side
@@ -23,14 +23,12 @@ below-interface view. The grazing camera stays over the submerged floor.
23
23
 
24
24
  Water is an entity with `Water`, `MeshletGeometry` and `Transform64`. The mesh authors the outline
25
25
  and elevations, and the transform places it; Level edits the transform's height. This fixture
26
- has a curved, coarse authored outline. Optical controls edit Water. Optional WaterWaves supplies wind
27
- forcing to a persistent shared GPU displacement atlas, with 128² samples per active body. The existing
28
- geometry BLAS bakes the authored footprint into a simulation mask when a wave row is created;
29
- dry samples remain zero, including holes and gaps. Vertices sample the field in local xz and move
30
- along local y. This primitive simulation therefore expects a surface that can be represented as a
31
- height field in local xz; multiple stacked surfaces sharing that domain also share its displacement.
32
- Calm meshes allocate no grid. The simulation uses a one-metre reference depth and
33
- does not infer bathymetry from the mesh. Screen reflections can be disabled while retaining the
26
+ has a curved, coarse authored outline. Optical controls edit Water. Optional WaterWaves sets the wind:
27
+ the body's waves are a fetch-limited JONSWAP sea over its own extent along the wind, drawn from 18
28
+ spectral bands every body shares, plus the wave particles of its splashes, which reflect off the mesh's
29
+ outline (`WATER_SURFACE_SIMULATION_PLAN_2026_10_06.md`). Vertices sample both in the body's metric local
30
+ frame and move in it; deep water is assumed, and nothing is inferred from bathymetry. A body with a
31
+ triangle too steep to flatten onto a reference plane stays calm. Screen reflections can be disabled while retaining the
34
32
  fallback to the renderer's indirect lighting (IBL, or Brick4 when it is the active mode).
35
33
  The Newton, bounded HZB traversal, and undisplaced control modes all use the same AVBOIT path.
36
34
  The Medium select picks one of the water presets (`shade/renderer/medium/water/water_presets.js`):
@@ -162,8 +160,8 @@ tiny-loss resolve guard; existing particle, mesh and ribbon APIs remain intact.
162
160
  Water bodies occupy persistent rows in the existing scene database. Optical and component edits
163
161
  queue CPU writes; idle updates do not enumerate bodies. GPU page iteration, the existing prefix
164
162
  scan, ordered meshlet expansion and indirect draws cover the scene. A GPU reduction supplies signed
165
- local-y displacement bounds after each simulation update. Body frustum culling expands the authored
166
- bounds by those extrema before applying the GPU world transform.
163
+ local-y and horizontal displacement bounds every frame. Body frustum culling expands the authored
164
+ bounds by them before applying the GPU world transform.
167
165
 
168
166
  Following Far Cry 5's view-tile approach, each candidate triangle classifies its swept footprint into
169
167
  view tiles. A tile contains 16×16 cells; `settings.tessellation_pixels` sets their reference-view spacing
@@ -181,7 +179,8 @@ against the view planes. Calm bodies project the authored triangles directly. Re
181
179
  when displacement can bring them into view. Opaque depth is tested after displacement, so an
182
180
  undisplaced depth rejection cannot hide a crest. Both surface passes share the same patch counts
183
181
  and reconstruction inputs. Simulation is independent of camera position and render resolution;
184
- wave dispatch count depends on fixed steps, not the number of bodies. Device buffer and indirect
182
+ the spectral bands cost the same for any number of bodies, and particles are dispatched from their
183
+ GPU count. Device buffer and indirect
185
184
  draw limits still bound scene complexity. If the reference is coplanar with the camera, it moves
186
185
  farther beyond the displacement envelope to retain a projectable surface. The body's conservative
187
186
  swept span sets one shared grid spacing, at least the requested pixel spacing. This bounds each