@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,172 +1,207 @@
1
- import { v3_distance_above_plane } from "../../vec3/v3_distance_above_plane.js";
2
- import Vector3 from "../../Vector3.js";
3
- import { plane3_compute_3_plane_intersection } from "../plane/plane3_compute_3_plane_intersection.js";
4
- import { plane3_compute_intersection } from "../plane/plane3_compute_intersection.js";
5
- import { plane3_project_point } from "../plane/plane3_project_point.js";
6
- import { ray3_compute_closest_point } from "../ray/ray3_compute_closest_point.js";
7
-
8
- /**
9
- * Indices into the caller's plane list, for the planes the target lies outside of.
10
- * @type {number[]}
11
- */
12
- const scratch_outer_planes = [];
13
-
14
- const scratch_v3_0 = new Vector3();
15
-
16
- const scratch_v3_1 = new Vector3();
17
-
18
- /**
19
- *
20
- * @type {number[]}
21
- */
22
- const scratch_v3_array = [];
23
-
24
- /**
25
- * How many projection rounds the four-or-more-planes fallback takes before it settles for where it
26
- * has got to. Bounded rather than convergent: the loop must not be able to spin on a degenerate
27
- * frustum.
28
- * @type {number}
29
- */
30
- const CLAMP_ITERATION_LIMIT = 32;
31
-
32
- /**
33
- * The point inside a convex frustum nearest to a target point, and whether the target was already
34
- * inside it.
35
- *
36
- * **A plane is a `Vector4`**: `x, y, z` its normal and `w` its constant, inside where
37
- * `dot(normal, p) + w` is non-negative. That is the same four numbers every frustum query in the
38
- * tree reads and what `camera_active_frustum` publishes; it used to be a three `Plane`, whose
39
- * `normal`/`constant` pair is the same thing wearing an object (X15d).
40
- *
41
- * @param {Vector3} result
42
- * @param {Vector4[]} planes
43
- * @param {number} target_x
44
- * @param {number} target_y
45
- * @param {number} target_z
46
- * @returns {boolean} if point is inside the frustum - true, false otherwise
47
- */
48
- export function frustum3_compute_closest_point(result, planes, target_x, target_y, target_z) {
49
- let j;
50
-
51
- let outside_plane_count = 0;
52
-
53
- const plane_count = planes.length;
54
-
55
- for (j = 0; j < plane_count; j++) {
56
-
57
- const plane = planes[j];
58
-
59
- const distance = v3_distance_above_plane(
60
- target_x, target_y, target_z,
61
- plane.x, plane.y, plane.z, plane.w
62
- );
63
-
64
- if (distance < 0) {
65
-
66
- scratch_outer_planes[outside_plane_count] = j;
67
-
68
- outside_plane_count++;
69
-
70
- }
71
-
72
- }
73
-
74
- if (outside_plane_count === 0) {
75
- result.set(target_x, target_y, target_z);
76
-
77
- return true;
78
- }
79
-
80
- // point is outside the frustum
81
-
82
- if (outside_plane_count === 1) {
83
- const plane_0 = planes[scratch_outer_planes[0]];
84
-
85
- // point lies outside exactly one plane
86
- plane3_project_point(result, target_x, target_y, target_z, plane_0.x, plane_0.y, plane_0.z, plane_0.w);
87
- } else if (outside_plane_count === 2) {
88
- // outside two planes, nearest point lies on the intersection line of two planes
89
-
90
- const plane_0 = planes[scratch_outer_planes[0]];
91
- const plane_1 = planes[scratch_outer_planes[1]];
92
-
93
- const intersection_exists = plane3_compute_intersection(
94
- scratch_v3_0, scratch_v3_1,
95
- plane_0.x, plane_0.y, plane_0.z, plane_0.w,
96
- plane_1.x, plane_1.y, plane_1.z, plane_1.w
97
- );
98
-
99
- if (!intersection_exists) {
100
- throw new Error('Planes are parallel and do not intersect, likely an invalid frustum');
101
- }
102
-
103
- ray3_compute_closest_point(result,
104
- scratch_v3_0.x, scratch_v3_0.y, scratch_v3_0.z,
105
- scratch_v3_1.x, scratch_v3_1.y, scratch_v3_1.z,
106
- target_x, target_y, target_z
107
- );
108
- } else if (outside_plane_count === 3) {
109
- // outside 3 planes, nearest point is intersect of 3 planes
110
- const plane_0 = planes[scratch_outer_planes[0]];
111
- const plane_1 = planes[scratch_outer_planes[1]];
112
- const plane_2 = planes[scratch_outer_planes[2]];
113
-
114
- plane3_compute_3_plane_intersection(
115
- scratch_v3_array, 0,
116
- plane_0.x, plane_0.y, plane_0.z, plane_0.w,
117
- plane_1.x, plane_1.y, plane_1.z, plane_1.w,
118
- plane_2.x, plane_2.y, plane_2.z, plane_2.w
119
- );
120
-
121
- result.fromArray(scratch_v3_array, 0)
122
- } else {
123
- // Four or more violated planes has no closed form here, and a perspective frustum reaches
124
- // that easily: its side planes all pass through the apex, so any point behind the camera is
125
- // outside near, left, right, top and bottom at once. Falling out of the chain left `result`
126
- // holding whatever the caller's vector had — with a reused scratch, the *previous* query's
127
- // answer, which reads as a plausibly placed point rather than as a failure.
128
- //
129
- // Walk the point back in by repeatedly projecting it onto whichever plane it violates
130
- // most. For a convex body that converges into the intersection; it is not guaranteed to be
131
- // the exact nearest point, but it is inside, and it is written.
132
- let px = target_x;
133
- let py = target_y;
134
- let pz = target_z;
135
-
136
- for (let iteration = 0; iteration < CLAMP_ITERATION_LIMIT; iteration++) {
137
- let worst_plane = -1;
138
- let worst_distance = 0;
139
-
140
- for (j = 0; j < plane_count; j++) {
141
- const plane = planes[j];
142
-
143
- const distance = v3_distance_above_plane(
144
- px, py, pz,
145
- plane.x, plane.y, plane.z, plane.w
146
- );
147
-
148
- if (distance < worst_distance) {
149
- worst_distance = distance;
150
- worst_plane = j;
151
- }
152
- }
153
-
154
- if (worst_plane === -1) {
155
- // inside every plane
156
- break;
157
- }
158
-
159
- const plane = planes[worst_plane];
160
-
161
- plane3_project_point(scratch_v3_0, px, py, pz, plane.x, plane.y, plane.z, plane.w);
162
-
163
- px = scratch_v3_0.x;
164
- py = scratch_v3_0.y;
165
- pz = scratch_v3_0.z;
166
- }
167
-
168
- result.set(px, py, pz);
169
- }
170
-
171
- return false;
172
- }
1
+ import { v3_distance_above_plane } from "../../vec3/v3_distance_above_plane.js";
2
+ import Vector3 from "../../Vector3.js";
3
+ import { plane3_compute_intersection } from "../plane/plane3_compute_intersection.js";
4
+ import { plane3_project_point } from "../plane/plane3_project_point.js";
5
+
6
+ /**
7
+ * Indices into the caller's plane list, for the planes the target lies outside of.
8
+ * @type {number[]}
9
+ */
10
+ const scratch_outer_planes = [];
11
+
12
+ const scratch_v3_0 = new Vector3();
13
+
14
+ const scratch_v3_1 = new Vector3();
15
+
16
+ /**
17
+ * How many projection rounds the degenerate-edge fallback takes before it settles for where it
18
+ * has got to. Bounded rather than convergent: the loop must not be able to spin on a degenerate
19
+ * frustum.
20
+ * @type {number}
21
+ */
22
+ const CLAMP_ITERATION_LIMIT = 32;
23
+
24
+ /**
25
+ * The point inside a convex frustum nearest to a target point, and whether the target was already
26
+ * inside it.
27
+ *
28
+ * **A plane is a `Vector4`**: `x, y, z` its normal and `w` its constant, inside where
29
+ * `dot(normal, p) + w` is non-negative. That is the same four numbers every frustum query in the
30
+ * tree reads and what `camera_active_frustum` publishes; it used to be a three `Plane`, whose
31
+ * `normal`/`constant` pair is the same thing wearing an object (X15d).
32
+ *
33
+ * @param {Vector3} result
34
+ * @param {Vector4[]} planes
35
+ * @param {number} target_x
36
+ * @param {number} target_y
37
+ * @param {number} target_z
38
+ * @returns {boolean} if point is inside the frustum - true, false otherwise
39
+ */
40
+ export function frustum3_compute_closest_point(result, planes, target_x, target_y, target_z) {
41
+ let j;
42
+
43
+ let outside_plane_count = 0;
44
+
45
+ const plane_count = planes.length;
46
+
47
+ for (j = 0; j < plane_count; j++) {
48
+
49
+ const plane = planes[j];
50
+
51
+ const distance = v3_distance_above_plane(
52
+ target_x, target_y, target_z,
53
+ plane.x, plane.y, plane.z, plane.w
54
+ );
55
+
56
+ if (distance < 0) {
57
+
58
+ scratch_outer_planes[outside_plane_count] = j;
59
+
60
+ outside_plane_count++;
61
+
62
+ }
63
+
64
+ }
65
+
66
+ if (outside_plane_count === 0) {
67
+ result.set(target_x, target_y, target_z);
68
+
69
+ return true;
70
+ }
71
+
72
+ // point is outside the frustum
73
+
74
+ // Several violated planes need not all meet at the nearest point. A feasible face projection
75
+ // attains that halfspace's distance lower bound, so it is also nearest to the whole frustum.
76
+ for (let candidate = 0; candidate < outside_plane_count; candidate++) {
77
+ const face = planes[scratch_outer_planes[candidate]];
78
+ // Stored Float32 normals are only approximately unit length.
79
+ const normal_length_squared = face.x * face.x + face.y * face.y + face.z * face.z;
80
+ const offset = -v3_distance_above_plane(target_x, target_y, target_z, face.x, face.y, face.z, face.w)
81
+ / normal_length_squared;
82
+ scratch_v3_0.set(target_x + face.x * offset, target_y + face.y * offset, target_z + face.z * offset);
83
+
84
+ let inside = true;
85
+ for (j = 0; j < plane_count; j++) {
86
+ if (j === scratch_outer_planes[candidate]) {
87
+ // The projection lies on this face; recomputing it can produce roundoff below zero.
88
+ continue;
89
+ }
90
+ const plane = planes[j];
91
+ if (v3_distance_above_plane(
92
+ scratch_v3_0.x, scratch_v3_0.y, scratch_v3_0.z,
93
+ plane.x, plane.y, plane.z, plane.w
94
+ ) < 0) {
95
+ inside = false;
96
+ break;
97
+ }
98
+ }
99
+
100
+ if (inside) {
101
+ result.copy(scratch_v3_0);
102
+ return false;
103
+ }
104
+ }
105
+
106
+ // If no face projection is feasible, the closest point is on an edge or corner.
107
+ // At least one active plane was initially violated; clip its intersection lines to the frustum.
108
+ let best_distance_squared = Infinity;
109
+ let best_x = 0, best_y = 0, best_z = 0;
110
+ for (let candidate = 0; candidate < outside_plane_count; candidate++) {
111
+ const face_index = scratch_outer_planes[candidate];
112
+ const face = planes[face_index];
113
+ for (let edge_index = 0; edge_index < plane_count; edge_index++) {
114
+ if (edge_index === face_index) continue;
115
+ const edge_plane = planes[edge_index];
116
+ if (edge_index < face_index && v3_distance_above_plane(
117
+ target_x, target_y, target_z,
118
+ edge_plane.x, edge_plane.y, edge_plane.z, edge_plane.w
119
+ ) < 0) continue;
120
+ if (!plane3_compute_intersection(
121
+ scratch_v3_0, scratch_v3_1,
122
+ face.x, face.y, face.z, face.w,
123
+ edge_plane.x, edge_plane.y, edge_plane.z, edge_plane.w
124
+ )) continue;
125
+
126
+ const ox = scratch_v3_0.x, oy = scratch_v3_0.y, oz = scratch_v3_0.z;
127
+ const dx = scratch_v3_1.x, dy = scratch_v3_1.y, dz = scratch_v3_1.z;
128
+ let lower = -Infinity;
129
+ let upper = Infinity;
130
+ for (j = 0; j < plane_count; j++) {
131
+ if (j === face_index || j === edge_index) continue;
132
+ const plane = planes[j];
133
+ const along = plane.x * dx + plane.y * dy + plane.z * dz;
134
+ const at_origin = v3_distance_above_plane(ox, oy, oz, plane.x, plane.y, plane.z, plane.w);
135
+ if (along > 0) {
136
+ lower = Math.max(lower, -at_origin / along);
137
+ } else if (along < 0) {
138
+ upper = Math.min(upper, -at_origin / along);
139
+ } else if (at_origin < 0) {
140
+ lower = Infinity;
141
+ upper = -Infinity;
142
+ break;
143
+ }
144
+ }
145
+ if (lower > upper) continue;
146
+
147
+ const direction_length_squared = dx * dx + dy * dy + dz * dz;
148
+ const target_parameter = ((target_x - ox) * dx + (target_y - oy) * dy + (target_z - oz) * dz)
149
+ / direction_length_squared;
150
+ const parameter = Math.max(lower, Math.min(upper, target_parameter));
151
+ const px = ox + dx * parameter, py = oy + dy * parameter, pz = oz + dz * parameter;
152
+ const tx = px - target_x, ty = py - target_y, tz = pz - target_z;
153
+ const distance_squared = tx * tx + ty * ty + tz * tz;
154
+ if (distance_squared < best_distance_squared) {
155
+ best_distance_squared = distance_squared;
156
+ best_x = px;
157
+ best_y = py;
158
+ best_z = pz;
159
+ }
160
+ }
161
+ }
162
+ if (best_distance_squared < Infinity) {
163
+ result.set(best_x, best_y, best_z);
164
+ return false;
165
+ }
166
+
167
+ // Retain the bounded projection fallback if no usable clipped edge was obtained.
168
+ let px = target_x;
169
+ let py = target_y;
170
+ let pz = target_z;
171
+
172
+ for (let iteration = 0; iteration < CLAMP_ITERATION_LIMIT; iteration++) {
173
+ let worst_plane = -1;
174
+ let worst_distance = 0;
175
+
176
+ for (j = 0; j < plane_count; j++) {
177
+ const plane = planes[j];
178
+
179
+ const distance = v3_distance_above_plane(
180
+ px, py, pz,
181
+ plane.x, plane.y, plane.z, plane.w
182
+ );
183
+
184
+ if (distance < worst_distance) {
185
+ worst_distance = distance;
186
+ worst_plane = j;
187
+ }
188
+ }
189
+
190
+ if (worst_plane === -1) {
191
+ // inside every plane
192
+ break;
193
+ }
194
+
195
+ const plane = planes[worst_plane];
196
+
197
+ plane3_project_point(scratch_v3_0, px, py, pz, plane.x, plane.y, plane.z, plane.w);
198
+
199
+ px = scratch_v3_0.x;
200
+ py = scratch_v3_0.y;
201
+ pz = scratch_v3_0.z;
202
+ }
203
+
204
+ result.set(px, py, pz);
205
+
206
+ return false;
207
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"gjk_epa_penetration.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/gjk/gjk_epa_penetration.js"],"names":[],"mappings":"AAkkBA;;;;;;;;;;;;;;;;GAgBG;AACH,yCATW,YAAY,GAAC,MAAM,EAAE,KACrB,eAAe,KACf,eAAe,GACb,MAAM,CA0BlB;AA7DD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,4BAFU,MAAM,CAEgB;;;;;;;8BAzdnB;IAAE,OAAO,SAAW,YAAY,QAAE,MAAM,QAAE,CAAC,YAAY,GAAC,MAAM,EAAE,CAAC,QAAE,MAAM,KAAG,IAAI,CAAA;CAAE"}
1
+ {"version":3,"file":"gjk_epa_penetration.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/gjk/gjk_epa_penetration.js"],"names":[],"mappings":"AAmkBA;;;;;;;;;;;;;;;;GAgBG;AACH,yCATW,YAAY,GAAC,MAAM,EAAE,KACrB,eAAe,KACf,eAAe,GACb,MAAM,CA0BlB;AA7DD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,4BAFU,MAAM,CAEgB;;;;;;;8BA1dnB;IAAE,OAAO,SAAW,YAAY,QAAE,MAAM,QAAE,CAAC,YAAY,GAAC,MAAM,EAAE,CAAC,QAAE,MAAM,KAAG,IAAI,CAAA;CAAE"}
@@ -533,9 +533,6 @@ function epa(A, B, out) {
533
533
  // Degenerate: no face survived. Report no usable axis (the caller treats a
534
534
  // non-positive depth as a miss) rather than reading a stale face and
535
535
  // throwing out of the narrowphase step.
536
- out[0] = 0;
537
- out[1] = 0;
538
- out[2] = 0;
539
536
  return 0;
540
537
  }
541
538
 
@@ -545,11 +542,15 @@ function epa(A, B, out) {
545
542
  best = f;
546
543
  }
547
544
  }
545
+ const depth = FACE_DIST[best];
546
+ if (!(depth > 0) || !Number.isFinite(depth)) {
547
+ return 0;
548
+ }
548
549
  const bn = best * 3;
549
550
  out[0] = FACE_N[bn];
550
551
  out[1] = FACE_N[bn + 1];
551
552
  out[2] = FACE_N[bn + 2];
552
- return FACE_DIST[best];
553
+ return depth;
553
554
  }
554
555
 
555
556
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"line3_compute_segment_point_distance_eikonal.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/line/line3_compute_segment_point_distance_eikonal.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,iEAbW,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,GACJ,MAAM,CAkFlB"}
1
+ {"version":3,"file":"line3_compute_segment_point_distance_eikonal.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/line/line3_compute_segment_point_distance_eikonal.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,iEAbW,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,GACJ,MAAM,CAwFlB"}
@@ -26,7 +26,13 @@ export function line3_compute_segment_point_distance_eikonal(
26
26
  const ab_z = z1 - z0;
27
27
  const L = Math.hypot(ab_x, ab_y, ab_z);
28
28
 
29
- if (L < 1e-9) return Math.min(d0, d1);
29
+ if (L < 1e-9) {
30
+ // A point-like edge still leaves the distance from its endpoints to the target.
31
+ return Math.min(
32
+ d0 + Math.hypot(px - x0, py - y0, pz - z0),
33
+ d1 + Math.hypot(px - x1, py - y1, pz - z1)
34
+ );
35
+ }
30
36
 
31
37
  // Vector AC
32
38
  const ac_x = px - x0;
@@ -93,4 +99,4 @@ export function line3_compute_segment_point_distance_eikonal(
93
99
  const dist_to_v1 = Math.hypot(px - x1, py - y1, pz - z1);
94
100
  return Math.min(d0 + dist_to_v0, d1 + dist_to_v1);
95
101
  }
96
- }
102
+ }
@@ -20,4 +20,24 @@
20
20
  * @returns {boolean}
21
21
  */
22
22
  export function tri3_ray_intersection(result: SurfacePoint3, origin_x: number, origin_y: number, origin_z: number, direction_x: number, direction_y: number, direction_z: number, ax: number, ay: number, az: number, bx: number, by: number, bz: number, cx: number, cy: number, cz: number): boolean;
23
+ /**
24
+ * Ray-triangle intersection with vertices read from a packed triangle,
25
+ * [ax, ay, az, bx, by, bz, cx, cy, cz] at triangle_offset.
26
+ *
27
+ * All nine coordinates are read before validation or output writes so output
28
+ * callbacks can mutate the source without changing this intersection.
29
+ * The arithmetic and output order match tri3_ray_intersection.
30
+ *
31
+ * @param {import("../SurfacePoint3.js").SurfacePoint3} result
32
+ * @param {number} origin_x
33
+ * @param {number} origin_y
34
+ * @param {number} origin_z
35
+ * @param {number} direction_x
36
+ * @param {number} direction_y
37
+ * @param {number} direction_z
38
+ * @param {ArrayLike<number>|number[]|Float32Array|Float64Array} triangle
39
+ * @param {number} [triangle_offset=0]
40
+ * @returns {boolean}
41
+ */
42
+ export function tri3_ray_intersection_triangle_array(result: import("../SurfacePoint3.js").SurfacePoint3, origin_x: number, origin_y: number, origin_z: number, direction_x: number, direction_y: number, direction_z: number, triangle: ArrayLike<number> | number[] | Float32Array | Float64Array, triangle_offset?: number): boolean;
23
43
  //# sourceMappingURL=tri3_ray_intersection.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tri3_ray_intersection.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/triangle/tri3_ray_intersection.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,uEAjBW,MAAM,YACN,MAAM,YACN,MAAM,eACN,MAAM,eACN,MAAM,eACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,GACJ,OAAO,CAoJnB"}
1
+ {"version":3,"file":"tri3_ray_intersection.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/triangle/tri3_ray_intersection.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,uEAjBW,MAAM,YACN,MAAM,YACN,MAAM,eACN,MAAM,eACN,MAAM,eACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,GACJ,OAAO,CAoJnB;AAGD;;;;;;;;;;;;;;;;;;GAkBG;AACH,6DAXW,OAAO,qBAAqB,EAAE,aAAa,YAC3C,MAAM,YACN,MAAM,YACN,MAAM,eACN,MAAM,eACN,MAAM,eACN,MAAM,YACN,UAAU,MAAM,CAAC,GAAC,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,oBACpD,MAAM,GACJ,OAAO,CAmKnB"}
@@ -170,3 +170,185 @@ export function tri3_ray_intersection(
170
170
  return true;
171
171
  }
172
172
 
173
+
174
+ /**
175
+ * Ray-triangle intersection with vertices read from a packed triangle,
176
+ * [ax, ay, az, bx, by, bz, cx, cy, cz] at triangle_offset.
177
+ *
178
+ * All nine coordinates are read before validation or output writes so output
179
+ * callbacks can mutate the source without changing this intersection.
180
+ * The arithmetic and output order match tri3_ray_intersection.
181
+ *
182
+ * @param {import("../SurfacePoint3.js").SurfacePoint3} result
183
+ * @param {number} origin_x
184
+ * @param {number} origin_y
185
+ * @param {number} origin_z
186
+ * @param {number} direction_x
187
+ * @param {number} direction_y
188
+ * @param {number} direction_z
189
+ * @param {ArrayLike<number>|number[]|Float32Array|Float64Array} triangle
190
+ * @param {number} [triangle_offset=0]
191
+ * @returns {boolean}
192
+ */
193
+ export function tri3_ray_intersection_triangle_array(
194
+ result,
195
+ origin_x, origin_y, origin_z,
196
+ direction_x, direction_y, direction_z,
197
+ triangle, triangle_offset = 0
198
+ ) {
199
+ const ax = triangle[triangle_offset];
200
+ const ay = triangle[triangle_offset + 1];
201
+ const az = triangle[triangle_offset + 2];
202
+ const bx = triangle[triangle_offset + 3];
203
+ const by = triangle[triangle_offset + 4];
204
+ const bz = triangle[triangle_offset + 5];
205
+ const cx = triangle[triangle_offset + 6];
206
+ const cy = triangle[triangle_offset + 7];
207
+ const cz = triangle[triangle_offset + 8];
208
+
209
+ // Finite primitive numbers keep the valid path unboxed. The fallback
210
+ // preserves the scalar form's validation order and diagnostic messages.
211
+ if (!(Number.isFinite(ax) && Number.isFinite(ay) && Number.isFinite(az)
212
+ && Number.isFinite(bx) && Number.isFinite(by) && Number.isFinite(bz)
213
+ && Number.isFinite(cx) && Number.isFinite(cy) && Number.isFinite(cz))) {
214
+ assert.isNumber(ax, 'ax');
215
+ assert.isNumber(ay, 'ay');
216
+ assert.isNumber(az, 'az');
217
+
218
+ assert.isNumber(bx, 'bx');
219
+ assert.isNumber(by, 'by');
220
+ assert.isNumber(bz, 'bz');
221
+
222
+ assert.isNumber(cx, 'cx');
223
+ assert.isNumber(cy, 'cy');
224
+ assert.isNumber(cz, 'cz');
225
+
226
+ // nan checks
227
+ assert.notNaN(ax, 'ax');
228
+ assert.notNaN(ay, 'ay');
229
+ assert.notNaN(az, 'az');
230
+
231
+ assert.notNaN(bx, 'bx');
232
+ assert.notNaN(by, 'by');
233
+ assert.notNaN(bz, 'bz');
234
+
235
+ assert.notNaN(cx, 'cx');
236
+ assert.notNaN(cy, 'cy');
237
+ assert.notNaN(cz, 'cz');
238
+
239
+ // finate number check
240
+ assert.isFinite(ax, 'ax');
241
+ assert.isFinite(ay, 'ay');
242
+ assert.isFinite(az, 'az');
243
+
244
+ assert.isFinite(bx, 'bx');
245
+ assert.isFinite(by, 'by');
246
+ assert.isFinite(bz, 'bz');
247
+
248
+ assert.isFinite(cx, 'cx');
249
+ assert.isFinite(cy, 'cy');
250
+ assert.isFinite(cz, 'cz');
251
+
252
+
253
+ }
254
+
255
+ // edge1 = a - b
256
+ const edge1_x = bx - ax;
257
+ const edge1_y = by - ay;
258
+ const edge1_z = bz - az;
259
+
260
+ // edge2 = c - a
261
+ const edge2_x = cx - ax;
262
+ const edge2_y = cy - ay;
263
+ const edge2_z = cz - az;
264
+
265
+ // Compute triangle normal
266
+
267
+ // normal = edge1 x edge2
268
+ const normal_x = edge1_y * edge2_z - edge1_z * edge2_y;
269
+ const normal_y = edge1_z * edge2_x - edge1_x * edge2_z;
270
+ const normal_z = edge1_x * edge2_y - edge1_y * edge2_x
271
+
272
+ let DdN = v3_dot(direction_x, direction_y, direction_z, normal_x, normal_y, normal_z);
273
+ let sign = 1;
274
+
275
+ if (DdN === 0) {
276
+ // ray and the triangle normal are orthogonal, means that the ray can not pass penetrate triangle
277
+ return false;
278
+ } else if (DdN < 0) {
279
+ sign = -1;
280
+ DdN = -DdN;
281
+ }
282
+
283
+ // diff = origin - a
284
+ const diff_x = origin_x - ax;
285
+ const diff_y = origin_y - ay;
286
+ const diff_z = origin_z - az;
287
+
288
+ // edge3 = diff x edge2
289
+ const edge3_x = diff_y * edge2_z - diff_z * edge2_y;
290
+ const edge3_y = diff_z * edge2_x - diff_x * edge2_z;
291
+ const edge3_z = diff_x * edge2_y - diff_y * edge2_x;
292
+
293
+ // DdQxE2 = sign * ( direction . edge3)
294
+ const DdQxE2 = sign * v3_dot(direction_x, direction_y, direction_z, edge3_x, edge3_y, edge3_z);
295
+
296
+ if (DdQxE2 < 0) {
297
+ // b1 < 0, no intersection
298
+ return false;
299
+ }
300
+
301
+ const edge4_x = edge1_y * diff_z - edge1_z * diff_y;
302
+ const edge4_y = edge1_z * diff_x - edge1_x * diff_z;
303
+ const edge4_z = edge1_x * diff_y - edge1_y * diff_x;
304
+
305
+ const DdE1xQ = sign * v3_dot(direction_x, direction_y, direction_z, edge4_x, edge4_y, edge4_z);
306
+
307
+ if (DdE1xQ < 0) {
308
+ // b2 < 0, no intersection
309
+ return false;
310
+ }
311
+
312
+ if (DdQxE2 + DdE1xQ > DdN) {
313
+ // b1+b2 > 1, no intersection
314
+ return false;
315
+ }
316
+
317
+ // Line intersects triangle, check if ray does.
318
+ const QdN = -sign * v3_dot(diff_x, diff_y, diff_z, normal_x, normal_y, normal_z);
319
+
320
+ if (QdN < 0) {
321
+ // t < 0, no intersection
322
+ return false;
323
+
324
+ }
325
+
326
+ // Ray intersects triangle.
327
+ const t = QdN / DdN;
328
+
329
+ // `normal_x/y/z` is the raw `edge1 x edge2`, whose length is twice the triangle's area - it was
330
+ // written straight into `SurfacePoint3.normal`, which is documented as a surface normal and is
331
+ // a unit vector out of every other producer in the tree.
332
+ //
333
+ // NOTE: normalised but NOT turned to meet the ray, unlike `tri3_raycast`. This normal keeps the
334
+ // winding's facing on purpose: `StaticSceneBVH.raycast_nearest` derives `geometric_back_face`
335
+ // from `dot(normal, direction)`, and a normal pre-flipped toward the ray would report every hit
336
+ // as front-facing.
337
+ const normal_length = Math.sqrt(normal_x * normal_x + normal_y * normal_y + normal_z * normal_z);
338
+
339
+ const inv_normal_length = 1 / normal_length;
340
+
341
+ result.normal.set(
342
+ normal_x * inv_normal_length,
343
+ normal_y * inv_normal_length,
344
+ normal_z * inv_normal_length
345
+ );
346
+
347
+ result.position.set(
348
+ direction_x * t + origin_x,
349
+ direction_y * t + origin_y,
350
+ direction_z * t + origin_z,
351
+ );
352
+
353
+ return true;
354
+ }