@woosh/meep-engine 3.41.0 → 3.42.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 (344) 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 +1 -1
  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/water_refraction/README.md +10 -11
  189. package/src/shade/playground/water_refraction/main.js +9 -8
  190. package/src/shade/playground/water_refraction/world.js +1 -1
  191. package/src/shade/playground/water_surface/README.md +43 -0
  192. package/src/shade/playground/water_surface/index.html +30 -0
  193. package/src/shade/playground/water_surface/main.d.ts +2 -0
  194. package/src/shade/playground/water_surface/main.d.ts.map +1 -0
  195. package/src/shade/playground/water_surface/main.js +154 -0
  196. package/src/shade/playground/water_surface/world.d.ts +44 -0
  197. package/src/shade/playground/water_surface/world.d.ts.map +1 -0
  198. package/src/shade/playground/water_surface/world.js +160 -0
  199. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
  200. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +5 -0
  201. package/src/shade/renderer/binding/BufferBinding.js +2 -2
  202. package/src/shade/renderer/buffer/table/GPUTypedTable.d.ts.map +1 -1
  203. package/src/shade/renderer/buffer/table/GPUTypedTable.js +5 -3
  204. package/src/shade/renderer/buffer/table/GPUTypedTableDescriptor.d.ts +10 -3
  205. package/src/shade/renderer/buffer/table/GPUTypedTableDescriptor.d.ts.map +1 -1
  206. package/src/shade/renderer/buffer/table/GPUTypedTableDescriptor.js +17 -9
  207. package/src/shade/renderer/camera/orbital/OrbitalCameraInput.d.ts +3 -0
  208. package/src/shade/renderer/camera/orbital/OrbitalCameraInput.d.ts.map +1 -1
  209. package/src/shade/renderer/camera/orbital/OrbitalCameraInput.js +16 -0
  210. package/src/shade/renderer/camera/orbital/OrbitalCameraRig.d.ts +2 -0
  211. package/src/shade/renderer/camera/orbital/OrbitalCameraRig.d.ts.map +1 -1
  212. package/src/shade/renderer/camera/orbital/OrbitalCameraRig.js +11 -0
  213. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.d.ts +1 -1
  214. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.d.ts.map +1 -1
  215. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.js +9 -3
  216. package/src/shade/renderer/geometry/util/geometry_simplify_redundant_topology.d.ts.map +1 -1
  217. package/src/shade/renderer/geometry/util/geometry_simplify_redundant_topology.js +2 -2
  218. package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.d.ts.map +1 -1
  219. package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.js +85 -0
  220. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts.map +1 -1
  221. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.js +12 -6
  222. package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.d.ts.map +1 -1
  223. package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.js +7 -0
  224. package/src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.d.ts.map +1 -1
  225. package/src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.js +3 -1
  226. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  227. package/src/shade/renderer/scene/SCENE_DATABASE_SPEC.js +2 -1
  228. package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128_inverse.d.ts +13 -0
  229. package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128_inverse.d.ts.map +1 -0
  230. package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128_inverse.js +42 -0
  231. package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128x4_inverse_workgroup.d.ts +15 -0
  232. package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128x4_inverse_workgroup.d.ts.map +1 -0
  233. package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128x4_inverse_workgroup.js +39 -0
  234. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts.map +1 -1
  235. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js +2 -0
  236. package/src/shade/renderer/water/GPUWaterRenderer.d.ts +15 -0
  237. package/src/shade/renderer/water/GPUWaterRenderer.d.ts.map +1 -1
  238. package/src/shade/renderer/water/GPUWaterRenderer.js +110 -30
  239. package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts +16 -8
  240. package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts.map +1 -1
  241. package/src/shade/renderer/water/medium/GPUWaterBodies.js +31 -26
  242. package/src/shade/renderer/water/medium/shader_water_meshlets.d.ts +0 -1
  243. package/src/shade/renderer/water/medium/shader_water_meshlets.d.ts.map +1 -1
  244. package/src/shade/renderer/water/medium/shader_water_meshlets.js +1 -39
  245. package/src/shade/renderer/water/shader_water.d.ts +0 -1
  246. package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
  247. package/src/shade/renderer/water/shader_water.js +201 -72
  248. package/src/shade/renderer/water/surface/GPUWaterSurface.d.ts +70 -0
  249. package/src/shade/renderer/water/surface/GPUWaterSurface.d.ts.map +1 -0
  250. package/src/shade/renderer/water/surface/GPUWaterSurface.js +199 -0
  251. package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.d.ts +5 -2
  252. package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.d.ts.map +1 -1
  253. package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.js +32 -12
  254. package/src/shade/renderer/water/surface/chunk_water_surface_sample.d.ts +22 -0
  255. package/src/shade/renderer/water/surface/chunk_water_surface_sample.d.ts.map +1 -0
  256. package/src/shade/renderer/water/surface/chunk_water_surface_sample.js +217 -0
  257. package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts +65 -11
  258. package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts.map +1 -1
  259. package/src/shade/renderer/water/surface/graph_water_tessellation.js +163 -28
  260. package/src/shade/renderer/water/surface/lod/WATER_LOD.d.ts +51 -0
  261. package/src/shade/renderer/water/surface/lod/WATER_LOD.d.ts.map +1 -0
  262. package/src/shade/renderer/water/surface/lod/WATER_LOD.js +95 -0
  263. package/src/shade/renderer/water/surface/lod/chunk_water_lod.d.ts +10 -0
  264. package/src/shade/renderer/water/surface/lod/chunk_water_lod.d.ts.map +1 -0
  265. package/src/shade/renderer/water/surface/lod/chunk_water_lod.js +127 -0
  266. package/src/shade/renderer/water/surface/lod/chunk_water_lod_cell.d.ts +17 -0
  267. package/src/shade/renderer/water/surface/lod/chunk_water_lod_cell.d.ts.map +1 -0
  268. package/src/shade/renderer/water/surface/lod/chunk_water_lod_cell.js +246 -0
  269. package/src/shade/renderer/water/surface/lod/shader_water_lod.d.ts +118 -0
  270. package/src/shade/renderer/water/surface/lod/shader_water_lod.d.ts.map +1 -0
  271. package/src/shade/renderer/water/surface/lod/shader_water_lod.js +727 -0
  272. package/src/shade/renderer/water/surface/particles/GPUWaterParticles.d.ts +60 -0
  273. package/src/shade/renderer/water/surface/particles/GPUWaterParticles.d.ts.map +1 -0
  274. package/src/shade/renderer/water/surface/particles/GPUWaterParticles.js +228 -0
  275. package/src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.d.ts +17 -0
  276. package/src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.d.ts.map +1 -0
  277. package/src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.js +49 -0
  278. package/src/shade/renderer/water/surface/particles/chunk_water_particle.d.ts +22 -0
  279. package/src/shade/renderer/water/surface/particles/chunk_water_particle.d.ts.map +1 -0
  280. package/src/shade/renderer/water/surface/particles/chunk_water_particle.js +143 -0
  281. package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.d.ts +15 -0
  282. package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.d.ts.map +1 -0
  283. package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.js +121 -0
  284. package/src/shade/renderer/water/surface/particles/shader_water_particles.d.ts +83 -0
  285. package/src/shade/renderer/water/surface/particles/shader_water_particles.d.ts.map +1 -0
  286. package/src/shade/renderer/water/surface/particles/shader_water_particles.js +502 -0
  287. package/src/shade/renderer/water/surface/shader_water_cull.d.ts +42 -0
  288. package/src/shade/renderer/water/surface/shader_water_cull.d.ts.map +1 -0
  289. package/src/shade/renderer/water/surface/shader_water_cull.js +269 -0
  290. package/src/shade/renderer/water/surface/shader_water_waves_combine.d.ts +15 -0
  291. package/src/shade/renderer/water/surface/shader_water_waves_combine.d.ts.map +1 -0
  292. package/src/shade/renderer/water/surface/shader_water_waves_combine.js +73 -0
  293. package/src/shade/renderer/water/surface/shader_water_waves_derive.d.ts +11 -0
  294. package/src/shade/renderer/water/surface/shader_water_waves_derive.d.ts.map +1 -0
  295. package/src/shade/renderer/water/surface/shader_water_waves_derive.js +78 -0
  296. package/src/shade/renderer/water/surface/spectrum/GPUWaterSpectrum.d.ts +35 -0
  297. package/src/shade/renderer/water/surface/spectrum/GPUWaterSpectrum.d.ts.map +1 -0
  298. package/src/shade/renderer/water/surface/spectrum/GPUWaterSpectrum.js +103 -0
  299. package/src/shade/renderer/water/surface/spectrum/WATER_BAND_STATE.d.ts +22 -0
  300. package/src/shade/renderer/water/surface/spectrum/WATER_BAND_STATE.d.ts.map +1 -0
  301. package/src/shade/renderer/water/surface/spectrum/WATER_BAND_STATE.js +57 -0
  302. package/src/shade/renderer/water/surface/spectrum/WATER_SPECTRUM.d.ts +22 -0
  303. package/src/shade/renderer/water/surface/spectrum/WATER_SPECTRUM.d.ts.map +1 -0
  304. package/src/shade/renderer/water/surface/spectrum/WATER_SPECTRUM.js +25 -0
  305. package/src/shade/renderer/water/surface/spectrum/chunk_water_jonswap.d.ts +14 -0
  306. package/src/shade/renderer/water/surface/spectrum/chunk_water_jonswap.d.ts.map +1 -0
  307. package/src/shade/renderer/water/surface/spectrum/chunk_water_jonswap.js +48 -0
  308. package/src/shade/renderer/water/surface/spectrum/chunk_water_spectrum.d.ts +23 -0
  309. package/src/shade/renderer/water/surface/spectrum/chunk_water_spectrum.d.ts.map +1 -0
  310. package/src/shade/renderer/water/surface/spectrum/chunk_water_spectrum.js +169 -0
  311. package/src/shade/renderer/water/surface/spectrum/shader_water_spectrum.d.ts +26 -0
  312. package/src/shade/renderer/water/surface/spectrum/shader_water_spectrum.d.ts.map +1 -0
  313. package/src/shade/renderer/water/surface/spectrum/shader_water_spectrum.js +161 -0
  314. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.d.ts.map +1 -1
  315. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +18 -6
  316. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
  317. package/src/shade/wgsl/emulator/WGSLLanguageCore.js +11 -3
  318. package/src/core/geom/2d/polygon/polygon2_triangulate.corpus.d.ts +0 -28
  319. package/src/core/geom/2d/polygon/polygon2_triangulate.corpus.d.ts.map +0 -1
  320. package/src/core/geom/2d/polygon/polygon2_triangulate.corpus.js +0 -86
  321. package/src/engine/ecs/storage/binary/object-v2/serializerTestHarness.d.ts +0 -29
  322. package/src/engine/ecs/storage/binary/object-v2/serializerTestHarness.d.ts.map +0 -1
  323. package/src/engine/ecs/storage/binary/object-v2/serializerTestHarness.js +0 -44
  324. package/src/shade/renderer/water/medium/shader_water_bodies_derive.d.ts +0 -4
  325. package/src/shade/renderer/water/medium/shader_water_bodies_derive.d.ts.map +0 -1
  326. package/src/shade/renderer/water/medium/shader_water_bodies_derive.js +0 -32
  327. package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.d.ts +0 -25
  328. package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.d.ts.map +0 -1
  329. package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.js +0 -128
  330. package/src/shade/renderer/water/surface/chunk_water_tessellation.d.ts +0 -9
  331. package/src/shade/renderer/water/surface/chunk_water_tessellation.d.ts.map +0 -1
  332. package/src/shade/renderer/water/surface/chunk_water_tessellation.js +0 -144
  333. package/src/shade/renderer/water/surface/chunk_water_wave.d.ts +0 -13
  334. package/src/shade/renderer/water/surface/chunk_water_wave.d.ts.map +0 -1
  335. package/src/shade/renderer/water/surface/chunk_water_wave.js +0 -40
  336. package/src/shade/renderer/water/surface/shader_water_tiles.d.ts +0 -4
  337. package/src/shade/renderer/water/surface/shader_water_tiles.d.ts.map +0 -1
  338. package/src/shade/renderer/water/surface/shader_water_tiles.js +0 -123
  339. package/src/shade/renderer/water/surface/shader_water_wave_batch.d.ts +0 -6
  340. package/src/shade/renderer/water/surface/shader_water_wave_batch.d.ts.map +0 -1
  341. package/src/shade/renderer/water/surface/shader_water_wave_batch.js +0 -85
  342. package/src/shade/renderer/water/surface/shader_water_wave_domain.d.ts +0 -6
  343. package/src/shade/renderer/water/surface/shader_water_wave_domain.d.ts.map +0 -1
  344. package/src/shade/renderer/water/surface/shader_water_wave_domain.js +0 -83
@@ -1,7 +1,7 @@
1
1
  import { v3_grid_limit8_at_indices } from "./v3_grid_limit8_at_indices.js";
2
2
  import { assert } from "../../../../core/assert.js";
3
3
  import { clamp } from "../../../../core/math/clamp.js";
4
- import { scs3d_sample_linear3 } from "../../../graphics/texture/3d/scs3d_sample_linear3.js";
4
+ import { scs3d_sample_linear3_array } from "../../../graphics/texture/3d/scs3d_sample_linear3.js";
5
5
 
6
6
  /*
7
7
  * COLLOCATED VARIANT. FluidSimulator transports through the MAC (staggered-grid) kernels in the sibling
@@ -76,6 +76,7 @@ export function v3_grid_advect_maccormack_velocity(outputs, sources, carrier_x,
76
76
  const last_y = res_y - 1;
77
77
  const last_z = res_z - 1;
78
78
  const sample = scratch_sample;
79
+ const position = scratch_position;
79
80
 
80
81
  // ─── pass 1: forward SL step into the scratch trio ──────────────────────
81
82
  for (let z = 0; z < res_z; z++) {
@@ -93,7 +94,10 @@ export function v3_grid_advect_maccormack_velocity(outputs, sources, carrier_x,
93
94
  const s_x = x - carrier_x[c] * time_delta;
94
95
  const s_y = y - carrier_y[c] * time_delta;
95
96
  const s_z = z - carrier_z[c] * time_delta;
96
- scs3d_sample_linear3(sample, src_x, src_y, src_z, res_x, res_y, res_z, s_x, s_y, s_z);
97
+ position[0] = s_x;
98
+ position[1] = s_y;
99
+ position[2] = s_z;
100
+ scs3d_sample_linear3_array(sample, src_x, src_y, src_z, res_x, res_y, res_z, position, 0);
97
101
  fwd_x[c] = sample[0];
98
102
  fwd_y[c] = sample[1];
99
103
  fwd_z[c] = sample[2];
@@ -119,7 +123,10 @@ export function v3_grid_advect_maccormack_velocity(outputs, sources, carrier_x,
119
123
  const vy = carrier_y[c] * time_delta;
120
124
  const vz = carrier_z[c] * time_delta;
121
125
 
122
- scs3d_sample_linear3(sample, fwd_x, fwd_y, fwd_z, res_x, res_y, res_z, x + vx, y + vy, z + vz);
126
+ position[0] = x + vx;
127
+ position[1] = y + vy;
128
+ position[2] = z + vz;
129
+ scs3d_sample_linear3_array(sample, fwd_x, fwd_y, fwd_z, res_x, res_y, res_z, position, 0);
123
130
  const corr_x = fwd_x[c] + 0.5 * (src_x[c] - sample[0]);
124
131
  const corr_y = fwd_y[c] + 0.5 * (src_y[c] - sample[1]);
125
132
  const corr_z = fwd_z[c] + 0.5 * (src_z[c] - sample[2]);
@@ -160,3 +167,5 @@ export function v3_grid_advect_maccormack_velocity(outputs, sources, carrier_x,
160
167
 
161
168
  /** Module-static sample destination — avoids per-cell allocation. */
162
169
  const scratch_sample = new Float32Array(3);
170
+ /** Continuous coordinates passed to the sampler during this synchronous typed-array sweep. */
171
+ const scratch_position = new Float64Array(3);
@@ -1 +1 @@
1
- {"version":3,"file":"v3_grid_advect_sl_velocity.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/fluid/solver/v3_grid_advect_sl_velocity.js"],"names":[],"mappings":"AAUA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,oDAdW,YAAY,EAAE,WACd,YAAY,EAAE,aAEd,YAAY,aACZ,YAAY,aACZ,YAAY,SACZ,MAAM,SACN,MAAM,SACN,MAAM,cACN,MAAM,SACN,UAAU,QA+DpB"}
1
+ {"version":3,"file":"v3_grid_advect_sl_velocity.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/fluid/solver/v3_grid_advect_sl_velocity.js"],"names":[],"mappings":"AAUA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,oDAdW,YAAY,EAAE,WACd,YAAY,EAAE,aAEd,YAAY,aACZ,YAAY,aACZ,YAAY,SACZ,MAAM,SACN,MAAM,SACN,MAAM,cACN,MAAM,SACN,UAAU,QAmEpB"}
@@ -1,5 +1,5 @@
1
1
  import { assert } from "../../../../core/assert.js";
2
- import { scs3d_sample_linear3 } from "../../../graphics/texture/3d/scs3d_sample_linear3.js";
2
+ import { scs3d_sample_linear3_array } from "../../../graphics/texture/3d/scs3d_sample_linear3.js";
3
3
 
4
4
  /*
5
5
  * COLLOCATED VARIANT. FluidSimulator transports through the MAC (staggered-grid) kernels in the sibling
@@ -72,6 +72,7 @@ export function v3_grid_advect_sl_velocity(outputs, sources, carrier_x, carrier_
72
72
 
73
73
  const slice_size = res_x * res_y;
74
74
  const sample = scratch_sample;
75
+ const position = scratch_position;
75
76
 
76
77
  for (let z = 0; z < res_z; z++) {
77
78
  const z_off = z * slice_size;
@@ -94,7 +95,10 @@ export function v3_grid_advect_sl_velocity(outputs, sources, carrier_x, carrier_
94
95
  const s_y = y - carrier_y[c] * time_delta;
95
96
  const s_z = z - carrier_z[c] * time_delta;
96
97
 
97
- scs3d_sample_linear3(sample, src_x, src_y, src_z, res_x, res_y, res_z, s_x, s_y, s_z);
98
+ position[0] = s_x;
99
+ position[1] = s_y;
100
+ position[2] = s_z;
101
+ scs3d_sample_linear3_array(sample, src_x, src_y, src_z, res_x, res_y, res_z, position, 0);
98
102
  out_x[c] = sample[0];
99
103
  out_y[c] = sample[1];
100
104
  out_z[c] = sample[2];
@@ -105,3 +109,5 @@ export function v3_grid_advect_sl_velocity(outputs, sources, carrier_x, carrier_
105
109
 
106
110
  /** Module-static sample destination — avoids per-cell allocation. */
107
111
  const scratch_sample = new Float32Array(3);
112
+ /** Continuous coordinates passed to the sampler during this synchronous typed-array sweep. */
113
+ const scratch_position = new Float64Array(3);
@@ -27,4 +27,23 @@
27
27
  * @return {number}
28
28
  */
29
29
  export function v3_grid_sample_scalar_masked(data: Float32Array, solid: Uint8Array, res_x: number, res_y: number, res_z: number, x: number, y: number, z: number, fallback: number): number;
30
+ /**
31
+ * {@link v3_grid_sample_scalar_masked} with `[x, y, z, fallback]` read from a reusable operand record
32
+ * and the sample written into `out`. No continuous number crosses the call boundary, including the
33
+ * result, so a per-cell caller does not need this sampler to be inlined to avoid numeric boxes.
34
+ *
35
+ * The operands are read before any output write; `out` may overlap `operands` or `data`. Float64
36
+ * operands preserve the scalar form's coordinate and fallback precision.
37
+ *
38
+ * @param {Float32Array|Float64Array|number[]} out
39
+ * @param {number} out_offset
40
+ * @param {Float32Array} data
41
+ * @param {Uint8Array} solid
42
+ * @param {number} res_x
43
+ * @param {number} res_y
44
+ * @param {number} res_z
45
+ * @param {Float64Array} operands `[x, y, z, fallback]`
46
+ * @param {number} operands_offset
47
+ */
48
+ export function v3_grid_sample_scalar_masked_array(out: Float32Array | Float64Array | number[], out_offset: number, data: Float32Array, solid: Uint8Array, res_x: number, res_y: number, res_z: number, operands: Float64Array, operands_offset: number): void;
30
49
  //# sourceMappingURL=v3_grid_sample_scalar_masked.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"v3_grid_sample_scalar_masked.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/fluid/solver/v3_grid_sample_scalar_masked.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,mDAXW,YAAY,SACZ,UAAU,SACV,MAAM,SACN,MAAM,SACN,MAAM,KACN,MAAM,KACN,MAAM,KACN,MAAM,YACN,MAAM,GACL,MAAM,CA+DjB"}
1
+ {"version":3,"file":"v3_grid_sample_scalar_masked.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/fluid/solver/v3_grid_sample_scalar_masked.js"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,mDAXW,YAAY,SACZ,UAAU,SACV,MAAM,SACN,MAAM,SACN,MAAM,KACN,MAAM,KACN,MAAM,KACN,MAAM,YACN,MAAM,GACL,MAAM,CAYjB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wDAVW,YAAY,GAAC,YAAY,GAAC,MAAM,EAAE,cAClC,MAAM,QACN,YAAY,SACZ,UAAU,SACV,MAAM,SACN,MAAM,SACN,MAAM,YACN,YAAY,mBACZ,MAAM,QAqEhB"}
@@ -1,5 +1,8 @@
1
1
  import { clamp } from "../../../../core/math/clamp.js";
2
2
 
3
+ const scratch_operands = new Float64Array(4);
4
+ const scratch_sample = new Float64Array(1);
5
+
3
6
  /**
4
7
  * Trilinearly sample a cell-centered scalar at a fractional position,
5
8
  * EXCLUDING solid cells from the interpolation: solid taps contribute zero
@@ -29,6 +32,41 @@ import { clamp } from "../../../../core/math/clamp.js";
29
32
  * @return {number}
30
33
  */
31
34
  export function v3_grid_sample_scalar_masked(data, solid, res_x, res_y, res_z, x, y, z, fallback) {
35
+ const operands = scratch_operands;
36
+ operands[0] = x;
37
+ operands[1] = y;
38
+ operands[2] = z;
39
+ operands[3] = fallback;
40
+
41
+ v3_grid_sample_scalar_masked_array(scratch_sample, 0, data, solid, res_x, res_y, res_z, operands, 0);
42
+
43
+ return scratch_sample[0];
44
+ }
45
+
46
+ /**
47
+ * {@link v3_grid_sample_scalar_masked} with `[x, y, z, fallback]` read from a reusable operand record
48
+ * and the sample written into `out`. No continuous number crosses the call boundary, including the
49
+ * result, so a per-cell caller does not need this sampler to be inlined to avoid numeric boxes.
50
+ *
51
+ * The operands are read before any output write; `out` may overlap `operands` or `data`. Float64
52
+ * operands preserve the scalar form's coordinate and fallback precision.
53
+ *
54
+ * @param {Float32Array|Float64Array|number[]} out
55
+ * @param {number} out_offset
56
+ * @param {Float32Array} data
57
+ * @param {Uint8Array} solid
58
+ * @param {number} res_x
59
+ * @param {number} res_y
60
+ * @param {number} res_z
61
+ * @param {Float64Array} operands `[x, y, z, fallback]`
62
+ * @param {number} operands_offset
63
+ */
64
+ export function v3_grid_sample_scalar_masked_array(out, out_offset, data, solid, res_x, res_y, res_z, operands, operands_offset) {
65
+ const x = operands[operands_offset];
66
+ const y = operands[operands_offset + 1];
67
+ const z = operands[operands_offset + 2];
68
+ const fallback = operands[operands_offset + 3];
69
+
32
70
  const x_max = res_x - 1;
33
71
  const y_max = res_y - 1;
34
72
  const z_max = res_z - 1;
@@ -80,7 +118,8 @@ export function v3_grid_sample_scalar_masked(data, solid, res_x, res_y, res_z, x
80
118
 
81
119
  const total = w000 + w100 + w010 + w110 + w001 + w101 + w011 + w111;
82
120
  if (total <= 0) {
83
- return fallback;
121
+ out[out_offset] = fallback;
122
+ return;
84
123
  }
85
124
 
86
125
  const sum = w000 * data[c000] + w100 * data[c100]
@@ -88,5 +127,5 @@ export function v3_grid_sample_scalar_masked(data, solid, res_x, res_y, res_z, x
88
127
  + w001 * data[c001] + w101 * data[c101]
89
128
  + w011 * data[c011] + w111 * data[c111];
90
129
 
91
- return sum / total;
130
+ out[out_offset] = sum / total;
92
131
  }
@@ -1 +1 @@
1
- {"version":3,"file":"v3_mac_advect_scalar.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/fluid/solver/v3_mac_advect_scalar.js"],"names":[],"mappings":"AAiCA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,gDAXW,YAAY,SACZ,YAAY,SACZ,YAAY,SACZ,YAAY,SACZ,YAAY,SACZ,MAAM,SACN,MAAM,SACN,MAAM,cACN,MAAM,SACN,UAAU,QA4CpB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wDAZW,YAAY,SACZ,YAAY,mBACZ,YAAY,SACZ,YAAY,SACZ,YAAY,SACZ,YAAY,SACZ,MAAM,SACN,MAAM,SACN,MAAM,cACN,MAAM,SACN,UAAU,QA8GpB"}
1
+ {"version":3,"file":"v3_mac_advect_scalar.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/fluid/solver/v3_mac_advect_scalar.js"],"names":[],"mappings":"AAmCA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,gDAXW,YAAY,SACZ,YAAY,SACZ,YAAY,SACZ,YAAY,SACZ,YAAY,SACZ,MAAM,SACN,MAAM,SACN,MAAM,cACN,MAAM,SACN,UAAU,QAgDpB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wDAZW,YAAY,SACZ,YAAY,mBACZ,YAAY,SACZ,YAAY,SACZ,YAAY,SACZ,YAAY,SACZ,MAAM,SACN,MAAM,SACN,MAAM,cACN,MAAM,SACN,UAAU,QA8GpB"}
@@ -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
  }