@woosh/meep-engine 3.40.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 (539) 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/quaternion/swing_twist_clamp.d.ts +24 -0
  63. package/src/core/geom/3d/quaternion/swing_twist_clamp.d.ts.map +1 -0
  64. package/src/core/geom/3d/quaternion/swing_twist_clamp.js +62 -0
  65. package/src/core/geom/3d/quaternion/swing_twist_compose.d.ts +15 -0
  66. package/src/core/geom/3d/quaternion/swing_twist_compose.d.ts.map +1 -0
  67. package/src/core/geom/3d/quaternion/swing_twist_compose.js +36 -0
  68. package/src/core/geom/3d/quaternion/swing_twist_error.d.ts +39 -0
  69. package/src/core/geom/3d/quaternion/swing_twist_error.d.ts.map +1 -0
  70. package/src/core/geom/3d/quaternion/swing_twist_error.js +85 -0
  71. package/src/core/geom/3d/triangle/tri3_ray_intersection.d.ts +20 -0
  72. package/src/core/geom/3d/triangle/tri3_ray_intersection.d.ts.map +1 -1
  73. package/src/core/geom/3d/triangle/tri3_ray_intersection.js +182 -0
  74. package/src/core/geom/vec3/v3_rigid_align_paired_unit_vectors.d.ts +11 -6
  75. package/src/core/geom/vec3/v3_rigid_align_paired_unit_vectors.d.ts.map +1 -1
  76. package/src/core/geom/vec3/v3_rigid_align_paired_unit_vectors.js +27 -13
  77. package/src/core/math/linalg/eigen/matrix_symmetric_4x4_eigen.d.ts +25 -0
  78. package/src/core/math/linalg/eigen/matrix_symmetric_4x4_eigen.d.ts.map +1 -0
  79. package/src/core/math/linalg/eigen/matrix_symmetric_4x4_eigen.js +166 -0
  80. package/src/core/math/linalg/eigen/matrix_top_eigenvector_power_iteration.d.ts +5 -3
  81. package/src/core/math/linalg/eigen/matrix_top_eigenvector_power_iteration.d.ts.map +1 -1
  82. package/src/core/math/linalg/eigen/matrix_top_eigenvector_power_iteration.js +5 -3
  83. package/src/core/math/noise/curl_noise_3dt.d.ts.map +1 -1
  84. package/src/core/math/noise/curl_noise_3dt.js +20 -10
  85. package/src/core/math/noise/sdnoise.d.ts +16 -5
  86. package/src/core/math/noise/sdnoise.d.ts.map +1 -1
  87. package/src/core/math/noise/sdnoise.js +43 -9
  88. package/src/core/math/spline/spline3_hermite_nearest_point.d.ts +16 -1
  89. package/src/core/math/spline/spline3_hermite_nearest_point.d.ts.map +1 -1
  90. package/src/core/math/spline/spline3_hermite_nearest_point.js +44 -3
  91. package/src/engine/Engine.d.ts.map +1 -1
  92. package/src/engine/Engine.js +6 -2
  93. package/src/engine/animation/curve/AnimationCurve.d.ts +3 -0
  94. package/src/engine/animation/curve/AnimationCurve.d.ts.map +1 -1
  95. package/src/engine/animation/curve/AnimationCurve.js +6 -1
  96. package/src/engine/control/first-person/FirstPersonPlayerController.d.ts +9 -0
  97. package/src/engine/control/first-person/FirstPersonPlayerController.d.ts.map +1 -1
  98. package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.d.ts +26 -0
  99. package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.d.ts.map +1 -1
  100. package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.js +2 -0
  101. package/src/engine/control/first-person/abilities/AbilitySet.d.ts.map +1 -1
  102. package/src/engine/control/first-person/abilities/AbilitySet.js +9 -0
  103. package/src/engine/control/first-person/abilities/LedgeGrab.d.ts.map +1 -1
  104. package/src/engine/control/first-person/abilities/LedgeGrab.js +6 -0
  105. package/src/engine/control/first-person/abilities/Slide.d.ts.map +1 -1
  106. package/src/engine/control/first-person/abilities/Slide.js +1 -0
  107. package/src/engine/control/first-person/abilities/WallRun.d.ts +4 -1
  108. package/src/engine/control/first-person/abilities/WallRun.d.ts.map +1 -1
  109. package/src/engine/control/first-person/abilities/WallRun.js +13 -1
  110. package/src/engine/control/first-person/mastery/SlideInitiationTimingEvaluator.d.ts +1 -1
  111. package/src/engine/control/first-person/mastery/SlideInitiationTimingEvaluator.d.ts.map +1 -1
  112. package/src/engine/control/first-person/mastery/SlideInitiationTimingEvaluator.js +6 -5
  113. package/src/engine/control/first-person/mastery/StrideTimingJumpEvaluator.d.ts +3 -3
  114. package/src/engine/control/first-person/mastery/StrideTimingJumpEvaluator.d.ts.map +1 -1
  115. package/src/engine/control/first-person/mastery/StrideTimingJumpEvaluator.js +9 -8
  116. package/src/engine/control/first-person/sensors/FirstPersonSensorsSystem.d.ts.map +1 -1
  117. package/src/engine/control/first-person/sensors/FirstPersonSensorsSystem.js +13 -4
  118. package/src/engine/ecs/EntityManager.d.ts +9 -1
  119. package/src/engine/ecs/EntityManager.d.ts.map +1 -1
  120. package/src/engine/ecs/EntityManager.js +44 -42
  121. package/src/engine/ecs/dynamic_actions/rules/DynamicRuleDescription.d.ts.map +1 -1
  122. package/src/engine/ecs/dynamic_actions/rules/DynamicRuleDescription.js +2 -1
  123. package/src/engine/ecs/dynamic_actions/rules/DynamicRuleDescriptionTable.d.ts.map +1 -1
  124. package/src/engine/ecs/dynamic_actions/rules/DynamicRuleDescriptionTable.js +1 -0
  125. package/src/engine/ecs/fow/FogOfWarRevealerSystem.d.ts.map +1 -1
  126. package/src/engine/ecs/fow/FogOfWarRevealerSystem.js +3 -0
  127. package/src/engine/ecs/gpu/GPUStateAuthority.d.ts +20 -0
  128. package/src/engine/ecs/gpu/GPUStateAuthority.d.ts.map +1 -1
  129. package/src/engine/ecs/gpu/GPUStateAuthority.js +21 -0
  130. package/src/engine/ecs/gpu/GPU_AUTHORITY_EVENT_HOLD_CHANGE.d.ts +13 -0
  131. package/src/engine/ecs/gpu/GPU_AUTHORITY_EVENT_HOLD_CHANGE.d.ts.map +1 -0
  132. package/src/engine/ecs/gpu/GPU_AUTHORITY_EVENT_HOLD_CHANGE.js +12 -0
  133. package/src/engine/ecs/gpu/gpu_authority_grant.d.ts +6 -0
  134. package/src/engine/ecs/gpu/gpu_authority_grant.d.ts.map +1 -1
  135. package/src/engine/ecs/gpu/gpu_authority_grant.js +7 -1
  136. package/src/engine/ecs/gpu/gpu_authority_held.d.ts +14 -0
  137. package/src/engine/ecs/gpu/gpu_authority_held.d.ts.map +1 -0
  138. package/src/engine/ecs/gpu/gpu_authority_held.js +23 -0
  139. package/src/engine/ecs/gpu/gpu_authority_hold.d.ts +23 -0
  140. package/src/engine/ecs/gpu/gpu_authority_hold.d.ts.map +1 -0
  141. package/src/engine/ecs/gpu/gpu_authority_hold.js +41 -0
  142. package/src/engine/ecs/gpu/gpu_authority_unhold.d.ts +14 -0
  143. package/src/engine/ecs/gpu/gpu_authority_unhold.d.ts.map +1 -0
  144. package/src/engine/ecs/gpu/gpu_authority_unhold.js +32 -0
  145. package/src/engine/ecs/ik/IKGoal.d.ts +59 -0
  146. package/src/engine/ecs/ik/IKGoal.d.ts.map +1 -0
  147. package/src/engine/ecs/ik/IKGoal.js +83 -0
  148. package/src/engine/ecs/ik/IKGoalSystem.d.ts +75 -0
  149. package/src/engine/ecs/ik/IKGoalSystem.d.ts.map +1 -0
  150. package/src/engine/ecs/ik/IKGoalSystem.js +1456 -0
  151. package/src/engine/ecs/ik/PLAN.md +179 -0
  152. package/src/engine/ecs/parent/EntityNode.js +3 -3
  153. package/src/engine/ecs/speaker/VoiceSystem.d.ts +2 -2
  154. package/src/engine/ecs/speaker/VoiceSystem.d.ts.map +1 -1
  155. package/src/engine/ecs/speaker/VoiceSystem.js +4 -0
  156. package/src/engine/ecs/storage/BinaryBufferDeSerializer.js +5 -5
  157. package/src/engine/ecs/storage/BinaryBufferSerializer.d.ts.map +1 -1
  158. package/src/engine/ecs/storage/BinaryBufferSerializer.js +4 -5
  159. package/src/engine/ecs/storage/binary/BinarySerializationRegistry.d.ts.map +1 -1
  160. package/src/engine/ecs/storage/binary/BinarySerializationRegistry.js +3 -2
  161. package/src/engine/ecs/storage/binary/SERIALIZATION_COVERAGE.md +7 -3
  162. package/src/engine/ecs/storage/binary/object/BinaryObjectSerializationAdapter2.js +1 -1
  163. package/src/engine/ecs/storage/binary/object-v2/BinaryObjectDeSerializer.d.ts.map +1 -1
  164. package/src/engine/ecs/storage/binary/object-v2/BinaryObjectDeSerializer.js +8 -1
  165. package/src/engine/ecs/storage/populateEngineSerializationRegistry.d.ts.map +1 -1
  166. package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +9 -2
  167. package/src/engine/ecs/system/orderSystemsByDeclaredAccess.d.ts +33 -0
  168. package/src/engine/ecs/system/orderSystemsByDeclaredAccess.d.ts.map +1 -0
  169. package/src/engine/ecs/system/orderSystemsByDeclaredAccess.js +282 -0
  170. package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.d.ts.map +1 -1
  171. package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.js +5 -2
  172. package/src/engine/ecs/terrain/ecs/layers/TerrainLayers.d.ts.map +1 -1
  173. package/src/engine/ecs/terrain/ecs/layers/TerrainLayers.js +3 -0
  174. package/src/engine/ecs/terrain/ecs/splat/SplatMapping.d.ts.map +1 -1
  175. package/src/engine/ecs/terrain/ecs/splat/SplatMapping.js +1 -0
  176. package/src/engine/ecs/terrain/overlay/TerrainOverlay.js +1 -1
  177. package/src/engine/ecs/terrain/tiles/TerrainTile.d.ts.map +1 -1
  178. package/src/engine/ecs/terrain/tiles/TerrainTile.js +13 -1
  179. package/src/engine/ecs/terrain/tiles/TerrainTileManager.d.ts.map +1 -1
  180. package/src/engine/ecs/terrain/tiles/TerrainTileManager.js +1 -0
  181. package/src/engine/ecs/transform/T64WorldCache.js +139 -139
  182. package/src/engine/ecs/transform/t64_evaluate_local.d.ts +25 -0
  183. package/src/engine/ecs/transform/t64_evaluate_local.d.ts.map +1 -0
  184. package/src/engine/ecs/transform/t64_evaluate_local.js +35 -0
  185. package/src/engine/ecs/transform/t64_evaluate_world.d.ts +5 -3
  186. package/src/engine/ecs/transform/t64_evaluate_world.d.ts.map +1 -1
  187. package/src/engine/ecs/transform/t64_evaluate_world.js +128 -126
  188. package/src/engine/graphics/ecs/light/LightSerializationAdapter.d.ts.map +1 -1
  189. package/src/engine/graphics/ecs/light/LightSerializationAdapter.js +13 -1
  190. package/src/engine/graphics/ecs/light/LightSerializationUpgrader_0_1.d.ts +5 -0
  191. package/src/engine/graphics/ecs/light/LightSerializationUpgrader_0_1.d.ts.map +1 -0
  192. package/src/engine/graphics/ecs/light/LightSerializationUpgrader_0_1.js +27 -0
  193. package/src/engine/graphics/ecs/water/Water.d.ts +11 -0
  194. package/src/engine/graphics/ecs/water/Water.d.ts.map +1 -1
  195. package/src/engine/graphics/ecs/water/Water.js +17 -0
  196. package/src/engine/graphics/ecs/water/WaterSerializationAdapter.d.ts.map +1 -1
  197. package/src/engine/graphics/ecs/water/WaterSerializationAdapter.js +3 -1
  198. package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_4_5.d.ts +9 -0
  199. package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_4_5.d.ts.map +1 -0
  200. package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_4_5.js +24 -0
  201. package/src/engine/graphics/ecs/water/WaterWaves.d.ts +30 -9
  202. package/src/engine/graphics/ecs/water/WaterWaves.d.ts.map +1 -1
  203. package/src/engine/graphics/ecs/water/WaterWaves.js +41 -9
  204. package/src/engine/graphics/ecs/water/WaterWavesSerializationAdapter.d.ts.map +1 -1
  205. package/src/engine/graphics/ecs/water/WaterWavesSerializationAdapter.js +30 -26
  206. package/src/engine/graphics/ecs/water/WaterWavesSerializationUpgrader_0_1.d.ts +6 -0
  207. package/src/engine/graphics/ecs/water/WaterWavesSerializationUpgrader_0_1.d.ts.map +1 -0
  208. package/src/engine/graphics/ecs/water/WaterWavesSerializationUpgrader_0_1.js +22 -0
  209. package/src/engine/graphics/geometry/buffered/query/bvh32_geometry_raycast.d.ts.map +1 -1
  210. package/src/engine/graphics/geometry/buffered/query/bvh32_geometry_raycast.js +3 -5
  211. package/src/engine/graphics/texture/3d/scs3d_sample_linear3.d.ts +20 -0
  212. package/src/engine/graphics/texture/3d/scs3d_sample_linear3.d.ts.map +1 -1
  213. package/src/engine/graphics/texture/3d/scs3d_sample_linear3.js +36 -0
  214. package/src/engine/graphics3/AnimationGraphSystem.d.ts +2 -0
  215. package/src/engine/graphics3/AnimationGraphSystem.d.ts.map +1 -1
  216. package/src/engine/graphics3/AnimationGraphSystem.js +337 -329
  217. package/src/engine/graphics3/AnimationSystem.d.ts +2 -0
  218. package/src/engine/graphics3/AnimationSystem.d.ts.map +1 -1
  219. package/src/engine/graphics3/AnimationSystem.js +360 -352
  220. package/src/engine/graphics3/WaterSystem.d.ts +12 -3
  221. package/src/engine/graphics3/WaterSystem.d.ts.map +1 -1
  222. package/src/engine/graphics3/WaterSystem.js +78 -46
  223. package/src/engine/input/devices/PointerDevice.d.ts.map +1 -1
  224. package/src/engine/input/devices/PointerDevice.js +29 -4
  225. package/src/engine/intelligence/behavior/selector/WeightedRandomBehavior.d.ts +1 -0
  226. package/src/engine/intelligence/behavior/selector/WeightedRandomBehavior.d.ts.map +1 -1
  227. package/src/engine/intelligence/behavior/selector/WeightedRandomBehavior.js +14 -3
  228. package/src/engine/physics/cloth/MEASUREMENTS.md +130 -0
  229. package/src/engine/physics/cloth/PLAN.md +16 -1
  230. package/src/engine/physics/cloth/ecs/ClothColliderSystem.d.ts +5 -6
  231. package/src/engine/physics/cloth/ecs/ClothColliderSystem.d.ts.map +1 -1
  232. package/src/engine/physics/cloth/ecs/ClothColliderSystem.js +5 -6
  233. package/src/engine/physics/cloth/ecs/ClothInstance.d.ts +4 -7
  234. package/src/engine/physics/cloth/ecs/ClothInstance.d.ts.map +1 -1
  235. package/src/engine/physics/cloth/ecs/ClothInstance.js +4 -7
  236. package/src/engine/physics/cloth/ecs/ClothSystem.d.ts +4 -3
  237. package/src/engine/physics/cloth/ecs/ClothSystem.d.ts.map +1 -1
  238. package/src/engine/physics/cloth/ecs/ClothSystem.js +4 -3
  239. package/src/engine/physics/cloth/ecs/ClothWorld.d.ts.map +1 -1
  240. package/src/engine/physics/cloth/ecs/ClothWorld.js +10 -0
  241. package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts +24 -24
  242. package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts.map +1 -1
  243. package/src/engine/physics/cloth/ecs/cloth_seed_rig.js +46 -43
  244. package/src/engine/physics/cloth/ecs/cloth_write_back.d.ts +1 -1
  245. package/src/engine/physics/cloth/ecs/cloth_write_back.js +1 -1
  246. package/src/engine/physics/constraint/solve_constraints.d.ts +0 -35
  247. package/src/engine/physics/constraint/solve_constraints.d.ts.map +1 -1
  248. package/src/engine/physics/constraint/solve_constraints.js +1 -83
  249. package/src/engine/physics/ecs/ContactProbe.d.ts +73 -0
  250. package/src/engine/physics/ecs/ContactProbe.d.ts.map +1 -0
  251. package/src/engine/physics/ecs/ContactProbe.js +103 -0
  252. package/src/engine/physics/ecs/ContactProbeSystem.d.ts +44 -0
  253. package/src/engine/physics/ecs/ContactProbeSystem.d.ts.map +1 -0
  254. package/src/engine/physics/ecs/ContactProbeSystem.js +397 -0
  255. package/src/engine/physics/fluid/ecs/FluidComponent.d.ts +1 -1
  256. package/src/engine/physics/fluid/ecs/FluidComponent.js +1 -1
  257. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  258. package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_velocity.d.ts.map +1 -1
  259. package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_velocity.js +12 -3
  260. package/src/engine/physics/fluid/solver/v3_grid_advect_sl_velocity.d.ts.map +1 -1
  261. package/src/engine/physics/fluid/solver/v3_grid_advect_sl_velocity.js +8 -2
  262. package/src/engine/physics/fluid/solver/v3_grid_sample_scalar_masked.d.ts +19 -0
  263. package/src/engine/physics/fluid/solver/v3_grid_sample_scalar_masked.d.ts.map +1 -1
  264. package/src/engine/physics/fluid/solver/v3_grid_sample_scalar_masked.js +41 -2
  265. package/src/engine/physics/fluid/solver/v3_mac_advect_scalar.d.ts.map +1 -1
  266. package/src/engine/physics/fluid/solver/v3_mac_advect_scalar.js +9 -3
  267. package/src/engine/physics/fluid/solver/v3_mac_advect_sl_velocity.d.ts.map +1 -1
  268. package/src/engine/physics/fluid/solver/v3_mac_advect_sl_velocity.js +26 -10
  269. package/src/engine/physics/inverse_kinematics/frame_fabrik/FrameFabrikProblem.d.ts +205 -0
  270. package/src/engine/physics/inverse_kinematics/frame_fabrik/FrameFabrikProblem.d.ts.map +1 -0
  271. package/src/engine/physics/inverse_kinematics/frame_fabrik/FrameFabrikProblem.js +245 -0
  272. package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_limit_from_joint.d.ts +21 -0
  273. package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_limit_from_joint.d.ts.map +1 -0
  274. package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_limit_from_joint.js +63 -0
  275. package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_solve.d.ts +33 -0
  276. package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_solve.d.ts.map +1 -0
  277. package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_solve.js +874 -0
  278. package/src/engine/physics/inverse_kinematics/joint_hinge_mid_axis.d.ts +27 -0
  279. package/src/engine/physics/inverse_kinematics/joint_hinge_mid_axis.d.ts.map +1 -0
  280. package/src/engine/physics/inverse_kinematics/joint_hinge_mid_axis.js +77 -0
  281. package/src/engine/physics/inverse_kinematics/two_bone_path_solve.d.ts +36 -0
  282. package/src/engine/physics/inverse_kinematics/two_bone_path_solve.d.ts.map +1 -0
  283. package/src/engine/physics/inverse_kinematics/two_bone_path_solve.js +97 -0
  284. package/src/engine/physics/inverse_kinematics/two_joint_ik.d.ts +33 -11
  285. package/src/engine/physics/inverse_kinematics/two_joint_ik.d.ts.map +1 -1
  286. package/src/engine/physics/inverse_kinematics/two_joint_ik.js +158 -67
  287. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.d.ts +3 -6
  288. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.d.ts.map +1 -1
  289. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.js +22 -9
  290. package/src/engine/ui/DraggableAspect.d.ts +5 -1
  291. package/src/engine/ui/DraggableAspect.d.ts.map +1 -1
  292. package/src/engine/ui/DraggableAspect.js +61 -4
  293. package/src/format/image/avif/heif/ItemProperty.d.ts +1 -1
  294. package/src/format/image/avif/heif/ItemProperty.js +1 -1
  295. package/src/format/image/png/chunk/png_chunk_decode_iTXt.d.ts.map +1 -1
  296. package/src/format/image/png/chunk/png_chunk_decode_iTXt.js +17 -6
  297. package/src/shade/device/mock/SoftwareGPUDevice.d.ts +2 -4
  298. package/src/shade/device/mock/SoftwareGPUDevice.d.ts.map +1 -1
  299. package/src/shade/device/mock/SoftwareGPUDevice.js +20 -13
  300. package/src/shade/playground/skinned_blas_refit/sweep_views.d.ts.map +1 -1
  301. package/src/shade/playground/skinned_blas_refit/sweep_views.js +2 -1
  302. package/src/shade/playground/water_refraction/README.md +10 -11
  303. package/src/shade/playground/water_refraction/main.js +9 -8
  304. package/src/shade/playground/water_refraction/world.js +1 -1
  305. package/src/shade/playground/water_surface/README.md +43 -0
  306. package/src/shade/playground/water_surface/index.html +30 -0
  307. package/src/shade/playground/water_surface/main.d.ts +2 -0
  308. package/src/shade/playground/water_surface/main.d.ts.map +1 -0
  309. package/src/shade/playground/water_surface/main.js +154 -0
  310. package/src/shade/playground/water_surface/world.d.ts +44 -0
  311. package/src/shade/playground/water_surface/world.d.ts.map +1 -0
  312. package/src/shade/playground/water_surface/world.js +160 -0
  313. package/src/shade/renderer/animation/ANIMATION_TRACK_BINDING_STRUCT.d.ts.map +1 -1
  314. package/src/shade/renderer/animation/ANIMATION_TRACK_BINDING_STRUCT.js +10 -1
  315. package/src/shade/renderer/animation/GPUAnimationManager.d.ts +10 -4
  316. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  317. package/src/shade/renderer/animation/GPUAnimationManager.js +251 -23
  318. package/src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.d.ts +12 -4
  319. package/src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.d.ts.map +1 -1
  320. package/src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.js +12 -4
  321. package/src/shade/renderer/animation/chunk_pose_accumulator.d.ts.map +1 -1
  322. package/src/shade/renderer/animation/chunk_pose_accumulator.js +14 -1
  323. package/src/shade/renderer/animation/pose/PoseChannelIndex.d.ts +78 -0
  324. package/src/shade/renderer/animation/pose/PoseChannelIndex.d.ts.map +1 -0
  325. package/src/shade/renderer/animation/pose/PoseChannelIndex.js +274 -0
  326. package/src/shade/renderer/animation/pose/PosePlayback.d.ts +40 -3
  327. package/src/shade/renderer/animation/pose/PosePlayback.d.ts.map +1 -1
  328. package/src/shade/renderer/animation/pose/PosePlayback.js +77 -3
  329. package/src/shade/renderer/animation/pose/pose_evaluate_local.d.ts +21 -3
  330. package/src/shade/renderer/animation/pose/pose_evaluate_local.d.ts.map +1 -1
  331. package/src/shade/renderer/animation/pose/pose_evaluate_local.js +79 -11
  332. package/src/shade/renderer/animation/shader_animation_apply.js +1 -1
  333. package/src/shade/renderer/animation/shader_animation_pose_resolve.d.ts +3 -2
  334. package/src/shade/renderer/animation/shader_animation_pose_resolve.d.ts.map +1 -1
  335. package/src/shade/renderer/animation/shader_animation_pose_resolve.js +187 -176
  336. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
  337. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +5 -0
  338. package/src/shade/renderer/binding/BufferBinding.js +2 -2
  339. package/src/shade/renderer/buffer/table/GPUTypedTable.d.ts.map +1 -1
  340. package/src/shade/renderer/buffer/table/GPUTypedTable.js +5 -3
  341. package/src/shade/renderer/buffer/table/GPUTypedTableDescriptor.d.ts +10 -3
  342. package/src/shade/renderer/buffer/table/GPUTypedTableDescriptor.d.ts.map +1 -1
  343. package/src/shade/renderer/buffer/table/GPUTypedTableDescriptor.js +17 -9
  344. package/src/shade/renderer/camera/orbital/OrbitalCameraInput.d.ts +3 -0
  345. package/src/shade/renderer/camera/orbital/OrbitalCameraInput.d.ts.map +1 -1
  346. package/src/shade/renderer/camera/orbital/OrbitalCameraInput.js +16 -0
  347. package/src/shade/renderer/camera/orbital/OrbitalCameraRig.d.ts +2 -0
  348. package/src/shade/renderer/camera/orbital/OrbitalCameraRig.d.ts.map +1 -1
  349. package/src/shade/renderer/camera/orbital/OrbitalCameraRig.js +11 -0
  350. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.d.ts +1 -1
  351. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.d.ts.map +1 -1
  352. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.js +9 -3
  353. package/src/shade/renderer/geometry/util/geometry_simplify_redundant_topology.d.ts.map +1 -1
  354. package/src/shade/renderer/geometry/util/geometry_simplify_redundant_topology.js +2 -2
  355. package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.d.ts.map +1 -1
  356. package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.js +85 -0
  357. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts.map +1 -1
  358. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.js +12 -6
  359. package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.d.ts.map +1 -1
  360. package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.js +7 -0
  361. package/src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.d.ts.map +1 -1
  362. package/src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.js +3 -1
  363. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  364. package/src/shade/renderer/object_property/chunk_write_object_property.d.ts +3 -1
  365. package/src/shade/renderer/object_property/chunk_write_object_property.d.ts.map +1 -1
  366. package/src/shade/renderer/object_property/chunk_write_object_property.js +5 -2
  367. package/src/shade/renderer/object_property/chunk_write_object_property_node3d.d.ts +4 -0
  368. package/src/shade/renderer/object_property/chunk_write_object_property_node3d.d.ts.map +1 -1
  369. package/src/shade/renderer/object_property/chunk_write_object_property_node3d.js +6 -1
  370. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  371. package/src/shade/renderer/scene/SCENE_DATABASE_SPEC.js +2 -1
  372. package/src/shade/renderer/scene/optimization/geometry/geometry_deduplicate.d.ts +1 -1
  373. package/src/shade/renderer/scene/optimization/geometry/geometry_deduplicate.d.ts.map +1 -1
  374. package/src/shade/renderer/scene/optimization/geometry/geometry_deduplicate.js +135 -73
  375. package/src/shade/renderer/scene/optimization/geometry/internal/cover_greedy.d.ts +7 -0
  376. package/src/shade/renderer/scene/optimization/geometry/internal/cover_greedy.d.ts.map +1 -1
  377. package/src/shade/renderer/scene/optimization/geometry/internal/cover_greedy.js +29 -1
  378. package/src/shade/renderer/scene/optimization/geometry/internal/face_neighbourhood_hash.d.ts +19 -0
  379. package/src/shade/renderer/scene/optimization/geometry/internal/face_neighbourhood_hash.d.ts.map +1 -0
  380. package/src/shade/renderer/scene/optimization/geometry/internal/face_neighbourhood_hash.js +167 -0
  381. package/src/shade/renderer/scene/optimization/geometry/internal/neighbourhood_anchor_index.d.ts +25 -0
  382. package/src/shade/renderer/scene/optimization/geometry/internal/neighbourhood_anchor_index.d.ts.map +1 -0
  383. package/src/shade/renderer/scene/optimization/geometry/internal/neighbourhood_anchor_index.js +124 -0
  384. package/src/shade/renderer/scene/optimization/geometry/internal/seed_correspondence_from_face_pair.d.ts +19 -0
  385. package/src/shade/renderer/scene/optimization/geometry/internal/seed_correspondence_from_face_pair.d.ts.map +1 -0
  386. package/src/shade/renderer/scene/optimization/geometry/internal/seed_correspondence_from_face_pair.js +48 -0
  387. package/src/shade/renderer/scene/rows/GPUSceneRows.d.ts +17 -1
  388. package/src/shade/renderer/scene/rows/GPUSceneRows.d.ts.map +1 -1
  389. package/src/shade/renderer/scene/rows/GPUSceneRows.js +29 -3
  390. package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128_inverse.d.ts +13 -0
  391. package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128_inverse.d.ts.map +1 -0
  392. package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128_inverse.js +42 -0
  393. package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128x4_inverse_workgroup.d.ts +15 -0
  394. package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128x4_inverse_workgroup.d.ts.map +1 -0
  395. package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128x4_inverse_workgroup.js +39 -0
  396. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts.map +1 -1
  397. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js +2 -0
  398. package/src/shade/renderer/water/GPUWaterRenderer.d.ts +15 -0
  399. package/src/shade/renderer/water/GPUWaterRenderer.d.ts.map +1 -1
  400. package/src/shade/renderer/water/GPUWaterRenderer.js +110 -30
  401. package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts +16 -8
  402. package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts.map +1 -1
  403. package/src/shade/renderer/water/medium/GPUWaterBodies.js +31 -26
  404. package/src/shade/renderer/water/medium/shader_water_meshlets.d.ts +0 -1
  405. package/src/shade/renderer/water/medium/shader_water_meshlets.d.ts.map +1 -1
  406. package/src/shade/renderer/water/medium/shader_water_meshlets.js +1 -39
  407. package/src/shade/renderer/water/shader_water.d.ts +0 -1
  408. package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
  409. package/src/shade/renderer/water/shader_water.js +201 -72
  410. package/src/shade/renderer/water/surface/GPUWaterSurface.d.ts +70 -0
  411. package/src/shade/renderer/water/surface/GPUWaterSurface.d.ts.map +1 -0
  412. package/src/shade/renderer/water/surface/GPUWaterSurface.js +199 -0
  413. package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.d.ts +5 -2
  414. package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.d.ts.map +1 -1
  415. package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.js +32 -12
  416. package/src/shade/renderer/water/surface/chunk_water_surface_sample.d.ts +22 -0
  417. package/src/shade/renderer/water/surface/chunk_water_surface_sample.d.ts.map +1 -0
  418. package/src/shade/renderer/water/surface/chunk_water_surface_sample.js +217 -0
  419. package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts +65 -11
  420. package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts.map +1 -1
  421. package/src/shade/renderer/water/surface/graph_water_tessellation.js +163 -28
  422. package/src/shade/renderer/water/surface/lod/WATER_LOD.d.ts +51 -0
  423. package/src/shade/renderer/water/surface/lod/WATER_LOD.d.ts.map +1 -0
  424. package/src/shade/renderer/water/surface/lod/WATER_LOD.js +95 -0
  425. package/src/shade/renderer/water/surface/lod/chunk_water_lod.d.ts +10 -0
  426. package/src/shade/renderer/water/surface/lod/chunk_water_lod.d.ts.map +1 -0
  427. package/src/shade/renderer/water/surface/lod/chunk_water_lod.js +127 -0
  428. package/src/shade/renderer/water/surface/lod/chunk_water_lod_cell.d.ts +17 -0
  429. package/src/shade/renderer/water/surface/lod/chunk_water_lod_cell.d.ts.map +1 -0
  430. package/src/shade/renderer/water/surface/lod/chunk_water_lod_cell.js +246 -0
  431. package/src/shade/renderer/water/surface/lod/shader_water_lod.d.ts +118 -0
  432. package/src/shade/renderer/water/surface/lod/shader_water_lod.d.ts.map +1 -0
  433. package/src/shade/renderer/water/surface/lod/shader_water_lod.js +727 -0
  434. package/src/shade/renderer/water/surface/particles/GPUWaterParticles.d.ts +60 -0
  435. package/src/shade/renderer/water/surface/particles/GPUWaterParticles.d.ts.map +1 -0
  436. package/src/shade/renderer/water/surface/particles/GPUWaterParticles.js +228 -0
  437. package/src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.d.ts +17 -0
  438. package/src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.d.ts.map +1 -0
  439. package/src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.js +49 -0
  440. package/src/shade/renderer/water/surface/particles/chunk_water_particle.d.ts +22 -0
  441. package/src/shade/renderer/water/surface/particles/chunk_water_particle.d.ts.map +1 -0
  442. package/src/shade/renderer/water/surface/particles/chunk_water_particle.js +143 -0
  443. package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.d.ts +15 -0
  444. package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.d.ts.map +1 -0
  445. package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.js +121 -0
  446. package/src/shade/renderer/water/surface/particles/shader_water_particles.d.ts +83 -0
  447. package/src/shade/renderer/water/surface/particles/shader_water_particles.d.ts.map +1 -0
  448. package/src/shade/renderer/water/surface/particles/shader_water_particles.js +502 -0
  449. package/src/shade/renderer/water/surface/shader_water_cull.d.ts +42 -0
  450. package/src/shade/renderer/water/surface/shader_water_cull.d.ts.map +1 -0
  451. package/src/shade/renderer/water/surface/shader_water_cull.js +269 -0
  452. package/src/shade/renderer/water/surface/shader_water_waves_combine.d.ts +15 -0
  453. package/src/shade/renderer/water/surface/shader_water_waves_combine.d.ts.map +1 -0
  454. package/src/shade/renderer/water/surface/shader_water_waves_combine.js +73 -0
  455. package/src/shade/renderer/water/surface/shader_water_waves_derive.d.ts +11 -0
  456. package/src/shade/renderer/water/surface/shader_water_waves_derive.d.ts.map +1 -0
  457. package/src/shade/renderer/water/surface/shader_water_waves_derive.js +78 -0
  458. package/src/shade/renderer/water/surface/spectrum/GPUWaterSpectrum.d.ts +35 -0
  459. package/src/shade/renderer/water/surface/spectrum/GPUWaterSpectrum.d.ts.map +1 -0
  460. package/src/shade/renderer/water/surface/spectrum/GPUWaterSpectrum.js +103 -0
  461. package/src/shade/renderer/water/surface/spectrum/WATER_BAND_STATE.d.ts +22 -0
  462. package/src/shade/renderer/water/surface/spectrum/WATER_BAND_STATE.d.ts.map +1 -0
  463. package/src/shade/renderer/water/surface/spectrum/WATER_BAND_STATE.js +57 -0
  464. package/src/shade/renderer/water/surface/spectrum/WATER_SPECTRUM.d.ts +22 -0
  465. package/src/shade/renderer/water/surface/spectrum/WATER_SPECTRUM.d.ts.map +1 -0
  466. package/src/shade/renderer/water/surface/spectrum/WATER_SPECTRUM.js +25 -0
  467. package/src/shade/renderer/water/surface/spectrum/chunk_water_jonswap.d.ts +14 -0
  468. package/src/shade/renderer/water/surface/spectrum/chunk_water_jonswap.d.ts.map +1 -0
  469. package/src/shade/renderer/water/surface/spectrum/chunk_water_jonswap.js +48 -0
  470. package/src/shade/renderer/water/surface/spectrum/chunk_water_spectrum.d.ts +23 -0
  471. package/src/shade/renderer/water/surface/spectrum/chunk_water_spectrum.d.ts.map +1 -0
  472. package/src/shade/renderer/water/surface/spectrum/chunk_water_spectrum.js +169 -0
  473. package/src/shade/renderer/water/surface/spectrum/shader_water_spectrum.d.ts +26 -0
  474. package/src/shade/renderer/water/surface/spectrum/shader_water_spectrum.d.ts.map +1 -0
  475. package/src/shade/renderer/water/surface/spectrum/shader_water_spectrum.js +161 -0
  476. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.d.ts.map +1 -1
  477. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +18 -6
  478. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
  479. package/src/shade/wgsl/emulator/WGSLLanguageCore.js +11 -3
  480. package/src/core/geom/2d/polygon/polygon2_triangulate.corpus.d.ts +0 -28
  481. package/src/core/geom/2d/polygon/polygon2_triangulate.corpus.d.ts.map +0 -1
  482. package/src/core/geom/2d/polygon/polygon2_triangulate.corpus.js +0 -86
  483. package/src/engine/ecs/ik/IKConstraint.d.ts +0 -52
  484. package/src/engine/ecs/ik/IKConstraint.d.ts.map +0 -1
  485. package/src/engine/ecs/ik/IKConstraint.js +0 -95
  486. package/src/engine/ecs/ik/IKProblem.d.ts +0 -45
  487. package/src/engine/ecs/ik/IKProblem.d.ts.map +0 -1
  488. package/src/engine/ecs/ik/IKProblem.js +0 -58
  489. package/src/engine/ecs/ik/IKSolver.d.ts +0 -8
  490. package/src/engine/ecs/ik/IKSolver.d.ts.map +0 -1
  491. package/src/engine/ecs/ik/IKSolver.js +0 -9
  492. package/src/engine/ecs/ik/InverseKinematics.d.ts +0 -48
  493. package/src/engine/ecs/ik/InverseKinematics.d.ts.map +0 -1
  494. package/src/engine/ecs/ik/InverseKinematics.js +0 -119
  495. package/src/engine/ecs/ik/InverseKinematicsSerializationAdapter.d.ts +0 -19
  496. package/src/engine/ecs/ik/InverseKinematicsSerializationAdapter.d.ts.map +0 -1
  497. package/src/engine/ecs/ik/InverseKinematicsSerializationAdapter.js +0 -72
  498. package/src/engine/ecs/ik/InverseKinematicsSystem.d.ts +0 -54
  499. package/src/engine/ecs/ik/InverseKinematicsSystem.d.ts.map +0 -1
  500. package/src/engine/ecs/ik/InverseKinematicsSystem.js +0 -212
  501. package/src/engine/ecs/ik/OneBoneSurfaceAlignmentSolver.d.ts +0 -8
  502. package/src/engine/ecs/ik/OneBoneSurfaceAlignmentSolver.d.ts.map +0 -1
  503. package/src/engine/ecs/ik/OneBoneSurfaceAlignmentSolver.js +0 -153
  504. package/src/engine/ecs/ik/TwoBoneInverseKinematicsSolver.d.ts +0 -5
  505. package/src/engine/ecs/ik/TwoBoneInverseKinematicsSolver.d.ts.map +0 -1
  506. package/src/engine/ecs/ik/TwoBoneInverseKinematicsSolver.js +0 -120
  507. package/src/engine/ecs/ik/ik_bone_chain.d.ts +0 -64
  508. package/src/engine/ecs/ik/ik_bone_chain.d.ts.map +0 -1
  509. package/src/engine/ecs/ik/ik_bone_chain.js +0 -142
  510. package/src/engine/ecs/ik/ik_probe_terrain_contact.d.ts +0 -42
  511. package/src/engine/ecs/ik/ik_probe_terrain_contact.d.ts.map +0 -1
  512. package/src/engine/ecs/ik/ik_probe_terrain_contact.js +0 -123
  513. package/src/engine/ecs/ik/ik_write_local_rotation.d.ts +0 -18
  514. package/src/engine/ecs/ik/ik_write_local_rotation.d.ts.map +0 -1
  515. package/src/engine/ecs/ik/ik_write_local_rotation.js +0 -32
  516. package/src/engine/ecs/storage/binary/object-v2/serializerTestHarness.d.ts +0 -29
  517. package/src/engine/ecs/storage/binary/object-v2/serializerTestHarness.d.ts.map +0 -1
  518. package/src/engine/ecs/storage/binary/object-v2/serializerTestHarness.js +0 -44
  519. package/src/shade/renderer/water/medium/shader_water_bodies_derive.d.ts +0 -4
  520. package/src/shade/renderer/water/medium/shader_water_bodies_derive.d.ts.map +0 -1
  521. package/src/shade/renderer/water/medium/shader_water_bodies_derive.js +0 -32
  522. package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.d.ts +0 -25
  523. package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.d.ts.map +0 -1
  524. package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.js +0 -128
  525. package/src/shade/renderer/water/surface/chunk_water_tessellation.d.ts +0 -9
  526. package/src/shade/renderer/water/surface/chunk_water_tessellation.d.ts.map +0 -1
  527. package/src/shade/renderer/water/surface/chunk_water_tessellation.js +0 -144
  528. package/src/shade/renderer/water/surface/chunk_water_wave.d.ts +0 -13
  529. package/src/shade/renderer/water/surface/chunk_water_wave.d.ts.map +0 -1
  530. package/src/shade/renderer/water/surface/chunk_water_wave.js +0 -40
  531. package/src/shade/renderer/water/surface/shader_water_tiles.d.ts +0 -4
  532. package/src/shade/renderer/water/surface/shader_water_tiles.d.ts.map +0 -1
  533. package/src/shade/renderer/water/surface/shader_water_tiles.js +0 -123
  534. package/src/shade/renderer/water/surface/shader_water_wave_batch.d.ts +0 -6
  535. package/src/shade/renderer/water/surface/shader_water_wave_batch.d.ts.map +0 -1
  536. package/src/shade/renderer/water/surface/shader_water_wave_batch.js +0 -85
  537. package/src/shade/renderer/water/surface/shader_water_wave_domain.d.ts +0 -6
  538. package/src/shade/renderer/water/surface/shader_water_wave_domain.d.ts.map +0 -1
  539. package/src/shade/renderer/water/surface/shader_water_wave_domain.js +0 -83
@@ -6,13 +6,14 @@ import { Transform64 } from "../../../../../engine/ecs/transform/Transform64.js"
6
6
  import { StandardAttributes } from "../../../geometry/StandardAttributes.js";
7
7
  import { anchor_grow_topological } from "./internal/anchor_grow_topological.js";
8
8
  import { cover_greedy } from "./internal/cover_greedy.js";
9
+ import { face_neighbourhood_hash } from "./internal/face_neighbourhood_hash.js";
9
10
  import { geometry_extract_subset } from "./internal/geometry_extract_subset.js";
10
11
  import { geometry_to_topology } from "./internal/geometry_to_topology.js";
11
12
  import { GLOBAL_RESIDUAL_THRESHOLD_FRACTION, match_refit_and_validate } from "./internal/match_refit_validate.js";
12
13
  import { match_validate_topology } from "./internal/match_validate_topology.js";
13
- import { rolling_hash_anchor_index } from "./internal/rolling_hash_anchor_index.js";
14
- import { seed_correspondence_from_window } from "./internal/seed_correspondence_from_window.js";
15
- import { triangle_fingerprint_stream } from "./internal/triangle_fingerprint_stream.js";
14
+ import { ANCHOR_STRIDE, neighbourhood_anchor_index } from "./internal/neighbourhood_anchor_index.js";
15
+ import { seed_correspondence_from_face_pair } from "./internal/seed_correspondence_from_face_pair.js";
16
+ import { vertex_attribute_pairs } from "./internal/vertex_attributes_equal.js";
16
17
 
17
18
  /**
18
19
  * @typedef GeometryDeduplicateOptions
@@ -23,9 +24,20 @@ import { triangle_fingerprint_stream } from "./internal/triangle_fingerprint_str
23
24
  * own tolerance ≈ `min(diag_a, diag_b) * 1e-4`.
24
25
  * When provided, the per-pair derivation is
25
26
  * clamped to this value (the tighter wins).
26
- * @property {number} [seed_budget=256] Max occurrences kept per rolling-hash bucket
27
+ * @property {number} [seed_budget=256] Max triangles kept per neighbourhood hash
27
28
  */
28
29
 
30
+ /**
31
+ * Edge-steps of neighbourhood each triangle's anchor hash takes in ({@link face_neighbourhood_hash}).
32
+ * Fewer make a hash that more unrelated triangles share, and more growth spent finding that out; more
33
+ * keep a triangle from anchoring unless the piece around it is that much wider, and thin pieces go
34
+ * unfound. Measured on Sponza through scene_optimize's meshlet round trip, triangles shared and time
35
+ * taken (single runs on a busy machine): 2 rounds 147.3k in 6.5 s, 3 rounds 145.8k in 5.2 s, 4 rounds
36
+ * 144.8k in 3.6 s, 6 rounds 136.4k in 2.6 s.
37
+ * @type {number}
38
+ */
39
+ const NEIGHBOURHOOD_ROUNDS = 3;
40
+
29
41
  /**
30
42
  * Relative tolerance for the per-anchor `position_epsilon` derivation.
31
43
  * The smaller of the two paired geometries' bounding-box diagonals is multiplied
@@ -94,12 +106,14 @@ export function geometry_deduplicate({
94
106
  // loop can derive a per-pair tolerance without recomputing bounds.
95
107
  const geom_diagonals = compute_geometry_diagonals(unique_geoms);
96
108
 
97
- // ────────────────────── Stage B: fingerprints ──────────────────────
98
- let streams = unique_geoms.map(g => triangle_fingerprint_stream(g));
109
+ // ──────────────────── Stage B: neighbourhood hashes ────────────────────
110
+ // Keyed on the triangles around each triangle, not on its place in the index stream: a meshlet build
111
+ // orders a turned copy's triangles differently from the original's, and no run of them survives.
112
+ let hashes = unique_geoms.map(g => face_neighbourhood_hash(g, NEIGHBOURHOOD_ROUNDS));
99
113
 
100
- // ────────────────── Stage C: rolling-hash anchors ──────────────────
101
- const anchors = rolling_hash_anchor_index(streams, min_primitives, seed_budget);
102
- streams = null; // fingerprint streams aren't needed past this point — let GC reclaim
114
+ // ────────────────────── Stage C: anchors ──────────────────────
115
+ const anchors = neighbourhood_anchor_index(hashes, seed_budget);
116
+ hashes = null; // the hashes aren't needed past this point — let GC reclaim
103
117
 
104
118
  // ────────────────────── Stage D: grow each anchor ──────────────────────
105
119
  /** @type {Map<number, BinaryTopology>} */
@@ -118,79 +132,52 @@ export function geometry_deduplicate({
118
132
  /** Per-geom faces already covered by an accepted grown match. */
119
133
  const grown_face_set_per_geom = new Map();
120
134
 
121
- for (const anchor of anchors) {
122
- const a_grown = get_or_create_set(grown_face_set_per_geom, anchor.a_geom);
123
- const b_grown = get_or_create_set(grown_face_set_per_geom, anchor.b_geom);
135
+ /** @type {Map<number, number>} an anchor's seed, rewritten per attempt; growth works on a copy */
136
+ const seed = new Map();
124
137
 
125
- if (a_grown.has(anchor.a_start) && b_grown.has(anchor.b_start)) continue;
126
- if (anchor.a_geom === anchor.b_geom && anchor.a_start === anchor.b_start) continue;
138
+ for (let i = 0; i < anchors.length; i += ANCHOR_STRIDE) {
139
+ const a_index = anchors[i];
140
+ const a_face = anchors[i + 1];
141
+ const b_index = anchors[i + 2];
142
+ const b_face = anchors[i + 3];
127
143
 
128
- const a_geom = unique_geoms[anchor.a_geom];
129
- const b_geom = unique_geoms[anchor.b_geom];
130
- const topology_a = get_topology(anchor.a_geom);
131
- const topology_b = get_topology(anchor.b_geom);
144
+ const a_grown = get_or_create_set(grown_face_set_per_geom, a_index);
145
+ const b_grown = get_or_create_set(grown_face_set_per_geom, b_index);
132
146
 
133
- const seed = seed_correspondence_from_window(
134
- a_geom, b_geom,
135
- topology_a, topology_b,
136
- anchor.a_start, anchor.b_start,
137
- min_primitives
138
- );
139
- if (seed === null) continue;
147
+ if (a_grown.has(a_face) && b_grown.has(b_face)) continue;
148
+
149
+ const topology_a = get_topology(a_index);
150
+ const topology_b = get_topology(b_index);
151
+ const attributes = vertex_attribute_pairs(unique_geoms[a_index], unique_geoms[b_index]);
140
152
 
141
153
  const pair_epsilon = derive_pair_epsilon(
142
- geom_diagonals[anchor.a_geom],
143
- geom_diagonals[anchor.b_geom],
154
+ geom_diagonals[a_index],
155
+ geom_diagonals[b_index],
144
156
  position_epsilon
145
157
  );
146
158
 
147
- const grown = anchor_grow_topological({
148
- geometry_a: a_geom,
149
- geometry_b: b_geom,
150
- topology_a, topology_b,
151
- initial_vertex_correspondence: seed.vertex_correspondence,
152
- seed_face_a: seed.seed_face_a,
153
- seed_face_b: seed.seed_face_b,
154
- position_epsilon: pair_epsilon,
155
- });
156
- if (grown === null) continue;
157
- if (grown.faces_a.length < min_primitives) continue;
158
-
159
- const matched_set_a = new Set(grown.faces_a);
160
- if (!match_validate_topology(
161
- topology_a, topology_b,
162
- matched_set_a, grown.face_correspondence, grown.vertex_correspondence
163
- )) {
164
- continue;
165
- }
159
+ // the anchor pairs two triangles; which corner lies on which is for attributes, then positions, to say
160
+ for (let offset = 0; offset < 3; offset++) {
161
+ if (!seed_correspondence_from_face_pair(seed, attributes, topology_a, topology_b, a_face, b_face, offset)) {
162
+ continue;
163
+ }
164
+
165
+ const match = grow_validated_match(
166
+ unique_geoms, a_index, b_index,
167
+ topology_a, topology_b,
168
+ seed, a_face, b_face,
169
+ pair_epsilon, min_primitives
170
+ );
166
171
 
167
- // Global post-grow residual check: the per-face check inside growth
168
- // uses the incrementally-refit transform, so cumulative drift can
169
- // smuggle past-acceptable faces through while the final fit produces
170
- // worse residuals elsewhere. Refit on all correspondences and reject
171
- // if any vertex deviates by more than a fraction of pair_epsilon.
172
- const validation = match_refit_and_validate({
173
- geometry_a: a_geom,
174
- geometry_b: b_geom,
175
- vertex_correspondence: grown.vertex_correspondence,
176
- transform: grown.transform,
177
- threshold: pair_epsilon * GLOBAL_RESIDUAL_THRESHOLD_FRACTION,
178
- });
179
- if (!validation.valid) {
180
- continue;
181
- }
172
+ if (match === null) continue;
173
+
174
+ for (const f of match.faces_a) a_grown.add(f);
175
+ for (const f of match.faces_b) b_grown.add(f);
176
+
177
+ matches.push(match);
182
178
 
183
- for (const f of grown.faces_a) a_grown.add(f);
184
- for (const f of grown.faces_b) b_grown.add(f);
185
-
186
- matches.push({
187
- a_geom: anchor.a_geom,
188
- b_geom: anchor.b_geom,
189
- faces_a: grown.faces_a,
190
- faces_b: grown.faces_b,
191
- transform: grown.transform,
192
- max_residual: validation.max_residual,
193
- });
179
+ break;
180
+ }
194
181
  }
195
182
 
196
183
  // ────────────────────── Stage E: greedy cover ──────────────────────
@@ -267,6 +254,76 @@ export function geometry_deduplicate({
267
254
  return result;
268
255
  }
269
256
 
257
+ /**
258
+ * Grow a match out from a seeded triangle pair, and keep it only if it covers at least `min_primitives`
259
+ * triangles, its connectivity is the same on both sides, and one transform fitted to all of it still
260
+ * places every vertex within tolerance.
261
+ *
262
+ * @param {Geometry[]} unique_geoms
263
+ * @param {number} a_geom index of A in `unique_geoms`
264
+ * @param {number} b_geom index of B in `unique_geoms`
265
+ * @param {BinaryTopology} topology_a
266
+ * @param {BinaryTopology} topology_b
267
+ * @param {Map<number, number>} seed vertex of A → vertex of B, for the seed triangles' corners
268
+ * @param {number} seed_face_a
269
+ * @param {number} seed_face_b
270
+ * @param {number} pair_epsilon
271
+ * @param {number} min_primitives
272
+ * @returns {import("./internal/cover_greedy.js").GrownMatchRecord|null}
273
+ */
274
+ function grow_validated_match(
275
+ unique_geoms, a_geom, b_geom,
276
+ topology_a, topology_b,
277
+ seed, seed_face_a, seed_face_b,
278
+ pair_epsilon, min_primitives
279
+ ) {
280
+ const geometry_a = unique_geoms[a_geom];
281
+ const geometry_b = unique_geoms[b_geom];
282
+
283
+ const grown = anchor_grow_topological({
284
+ geometry_a,
285
+ geometry_b,
286
+ topology_a, topology_b,
287
+ initial_vertex_correspondence: seed,
288
+ seed_face_a,
289
+ seed_face_b,
290
+ position_epsilon: pair_epsilon,
291
+ });
292
+ if (grown === null) return null;
293
+ if (grown.faces_a.length < min_primitives) return null;
294
+
295
+ const matched_set_a = new Set(grown.faces_a);
296
+ if (!match_validate_topology(
297
+ topology_a, topology_b,
298
+ matched_set_a, grown.face_correspondence, grown.vertex_correspondence
299
+ )) {
300
+ return null;
301
+ }
302
+
303
+ // Global post-grow residual check: the per-face check inside growth
304
+ // uses the incrementally-refit transform, so cumulative drift can
305
+ // smuggle past-acceptable faces through while the final fit produces
306
+ // worse residuals elsewhere. Refit on all correspondences and reject
307
+ // if any vertex deviates by more than a fraction of pair_epsilon.
308
+ const validation = match_refit_and_validate({
309
+ geometry_a,
310
+ geometry_b,
311
+ vertex_correspondence: grown.vertex_correspondence,
312
+ transform: grown.transform,
313
+ threshold: pair_epsilon * GLOBAL_RESIDUAL_THRESHOLD_FRACTION,
314
+ });
315
+ if (!validation.valid) return null;
316
+
317
+ return {
318
+ a_geom,
319
+ b_geom,
320
+ faces_a: grown.faces_a,
321
+ faces_b: grown.faces_b,
322
+ transform: grown.transform,
323
+ max_residual: validation.max_residual,
324
+ };
325
+ }
326
+
270
327
  /**
271
328
  * Bounding-box diagonal length per unique geometry, in input order.
272
329
  *
@@ -429,7 +486,12 @@ function match_transform_to_meep_transform(mt, piece_stats, max_residual) {
429
486
  if (delta > OVERSCALE_MAX_FRACTION) delta = OVERSCALE_MAX_FRACTION;
430
487
  }
431
488
 
432
- if (delta === 0) return t;
489
+ if (delta === 0) {
490
+ // The solver writes components only, so the clone's matrix was never composed. An exact fit (a half
491
+ // turn, say) leaves no residual to boost, and still owes the matrix its rotation and scale.
492
+ t.updateMatrix();
493
+ return t;
494
+ }
433
495
 
434
496
  const boost = 1 + delta;
435
497
  t.setScale(t.scale_x * boost, t.scale_y * boost, t.scale_z * boost);
@@ -31,6 +31,13 @@
31
31
  * - faces_b not yet claimed as instance or canonical anywhere
32
32
  * - faces_a not yet claimed as instance anywhere (we allow them to keep
33
33
  * serving as canonical for additional matches)
34
+ * - within one geometry, faces_b sharing no face with faces_a: the piece is
35
+ * drawn at the canonical's place and again at the instance's, so a shared
36
+ * face would be drawn twice (a symmetric part matched onto itself)
37
+ * - a new canonical face-set sharing no face with one already chosen in its
38
+ * geometry: every piece of a geometry is drawn at the geometry's own place,
39
+ * so two overlapping pieces draw the overlap twice. The same set exactly
40
+ * is not new, and its piece is reused.
34
41
  *
35
42
  * @param {GrownMatchRecord[]} matches
36
43
  * @param {number} min_primitives Drop matches smaller than this — they go to leftover
@@ -1 +1 @@
1
- {"version":3,"file":"cover_greedy.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/scene/optimization/geometry/internal/cover_greedy.js"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;;;;;GAMG;AAEH;;;;;;;GAOG;AAEH;;;;;;;;;;;GAWG;AACH,sCAJW,gBAAgB,EAAE,kBAClB,MAAM,GACJ,aAAa,EAAE,CA2F3B;;;;;YAhIa,MAAM;;;;YACN,MAAM;aACN,MAAM,EAAE;aACR,MAAM,EAAE;eACR,OAAO,uDAAuD,EAAE,WAAW;;;;;;kBAC3E,MAAM;;;YAON,MAAM;aACN,MAAM,EAAE;eACR,OAAO,uDAAuD,EAAE,WAAW;kBAC3E,MAAM;;;;;;wBAKN,MAAM;;;;YACN,MAAM;;;;qBACN,MAAM,EAAE;;;;eACR,qBAAqB,EAAE"}
1
+ {"version":3,"file":"cover_greedy.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/scene/optimization/geometry/internal/cover_greedy.js"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;;;;;GAMG;AAEH;;;;;;;GAOG;AAEH;;;;;;;;;;;;;;;;;;GAkBG;AACH,sCAJW,gBAAgB,EAAE,kBAClB,MAAM,GACJ,aAAa,EAAE,CAwG3B;;;;;YApJa,MAAM;;;;YACN,MAAM;aACN,MAAM,EAAE;aACR,MAAM,EAAE;eACR,OAAO,uDAAuD,EAAE,WAAW;;;;;;kBAC3E,MAAM;;;YAON,MAAM;aACN,MAAM,EAAE;eACR,OAAO,uDAAuD,EAAE,WAAW;kBAC3E,MAAM;;;;;;wBAKN,MAAM;;;;YACN,MAAM;;;;qBACN,MAAM,EAAE;;;;eACR,qBAAqB,EAAE"}
@@ -34,6 +34,13 @@
34
34
  * - faces_b not yet claimed as instance or canonical anywhere
35
35
  * - faces_a not yet claimed as instance anywhere (we allow them to keep
36
36
  * serving as canonical for additional matches)
37
+ * - within one geometry, faces_b sharing no face with faces_a: the piece is
38
+ * drawn at the canonical's place and again at the instance's, so a shared
39
+ * face would be drawn twice (a symmetric part matched onto itself)
40
+ * - a new canonical face-set sharing no face with one already chosen in its
41
+ * geometry: every piece of a geometry is drawn at the geometry's own place,
42
+ * so two overlapping pieces draw the overlap twice. The same set exactly
43
+ * is not new, and its piece is reused.
37
44
  *
38
45
  * @param {GrownMatchRecord[]} matches
39
46
  * @param {number} min_primitives Drop matches smaller than this — they go to leftover
@@ -92,6 +99,9 @@ export function cover_greedy(matches, min_primitives) {
92
99
  }
93
100
  if (conflict) continue;
94
101
 
102
+ // (3) within one geometry, the two sides must not share a face
103
+ if (match.a_geom === match.b_geom && face_sets_intersect(match.faces_a, match.faces_b)) continue;
104
+
95
105
  // Accept. If another match has chosen this exact canonical face-set,
96
106
  // reuse the piece. Group candidates by a cheap hash, then deep-compare
97
107
  // on hash collision.
@@ -99,6 +109,17 @@ export function cover_greedy(matches, min_primitives) {
99
109
  let decision = find_decision(decisions_by_canonical.get(canonical_hash), match.a_geom, match.faces_a);
100
110
 
101
111
  if (decision === undefined) {
112
+ // (4) a new canonical face-set must not share a face with one already chosen
113
+ const a_canonical_set = get_or_create(claimed_as_canonical, match.a_geom);
114
+
115
+ for (const f of match.faces_a) {
116
+ if (a_canonical_set.has(f)) {
117
+ conflict = true;
118
+ break;
119
+ }
120
+ }
121
+ if (conflict) continue;
122
+
102
123
  decision = {
103
124
  canonical_piece_id: next_piece_id++,
104
125
  a_geom: match.a_geom,
@@ -113,7 +134,6 @@ export function cover_greedy(matches, min_primitives) {
113
134
  bucket.push(decision);
114
135
  decisions.push(decision);
115
136
 
116
- const a_canonical_set = get_or_create(claimed_as_canonical, match.a_geom);
117
137
  for (const f of match.faces_a) a_canonical_set.add(f);
118
138
  }
119
139
 
@@ -173,3 +193,11 @@ function face_sets_equal(a, b) {
173
193
  }
174
194
  return true;
175
195
  }
196
+
197
+ function face_sets_intersect(a, b) {
198
+ const seen = new Set(a);
199
+ for (const f of b) {
200
+ if (seen.has(f)) return true;
201
+ }
202
+ return false;
203
+ }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * One 32-bit hash per triangle that depends on the triangles within `rounds` edge-steps of it, and on
3
+ * nothing else: not on where any of them sits in the index stream, not on which corner a triangle's
4
+ * indices start at, and not on the rigid motion and uniform scale the geometry was placed with.
5
+ *
6
+ * Round 0 is the triangle's own {@link triangle_fingerprint_stream} fingerprint. Each round after that
7
+ * mixes in the three hashes across the triangle's edges, read in winding order and started at the
8
+ * smallest, so the same triangle indexed from another corner reads the same three in the same order.
9
+ *
10
+ * Two copies of a piece hash their triangles alike wherever a triangle's `rounds`-ring lies inside the
11
+ * piece, whatever order a meshlet build or an exporter left the triangles in. A triangle nearer the
12
+ * piece's edge than that sees what surrounds the piece, which differs between copies.
13
+ *
14
+ * @param {Geometry} geometry
15
+ * @param {number} rounds
16
+ * @returns {Uint32Array} one per triangle
17
+ */
18
+ export function face_neighbourhood_hash(geometry: Geometry, rounds: number): Uint32Array;
19
+ //# sourceMappingURL=face_neighbourhood_hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"face_neighbourhood_hash.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/scene/optimization/geometry/internal/face_neighbourhood_hash.js"],"names":[],"mappings":"AAkGA;;;;;;;;;;;;;;;;GAgBG;AACH,oEAHW,MAAM,GACJ,WAAW,CAqDvB"}
@@ -0,0 +1,167 @@
1
+ import { hash_mix2 } from "../../../../../../core/math/hash/hash_mix2.js";
2
+ import { hash_mix3 } from "../../../../../../core/math/hash/hash_mix3.js";
3
+ import { lowbias32 } from "../../../../../../core/math/hash/lowbias32.js";
4
+ import { triangle_fingerprint_stream } from "./triangle_fingerprint_stream.js";
5
+
6
+ /**
7
+ * Stands in for the triangle across an edge that has none, or more than one: a boundary or a
8
+ * non-manifold edge. Any value does, so long as it is the same for every geometry.
9
+ * @type {number}
10
+ */
11
+ const NO_NEIGHBOUR = 0x5bd1e995;
12
+
13
+ /**
14
+ * For every triangle, the triangle across each of its three edges, where edge `k` runs from corner `k`
15
+ * to corner `k + 1`; -1 across a boundary edge or one shared by more than two triangles.
16
+ *
17
+ * Two triangles are neighbours when they share an edge's two vertex indices, which is how
18
+ * {@link geometry_to_topology} joins them too, so the triangles a hash reaches are the ones growth walks.
19
+ *
20
+ * @param {ArrayLike<number>|null} index three entries per triangle, or null for one vertex per corner
21
+ * @param {number} triangle_count
22
+ * @param {number} vertex_count
23
+ * @returns {Int32Array} `triangle_count * 3`
24
+ */
25
+ function triangle_edge_neighbours(index, triangle_count, vertex_count) {
26
+ const corner_count = triangle_count * 3;
27
+
28
+ const result = new Int32Array(corner_count).fill(-1);
29
+
30
+ if (index === null) {
31
+ // no corner shares a vertex with another, so no edge is shared
32
+ return result;
33
+ }
34
+
35
+ // each edge filed under its lower vertex, so the two sides of an edge land in one short list
36
+ const start = new Uint32Array(vertex_count + 1);
37
+
38
+ for (let e = 0; e < corner_count; e++) {
39
+ const a = index[e];
40
+ const b = index[e - e % 3 + (e + 1) % 3];
41
+
42
+ start[(a < b ? a : b) + 1]++;
43
+ }
44
+
45
+ for (let v = 0; v < vertex_count; v++) {
46
+ start[v + 1] += start[v];
47
+ }
48
+
49
+ const cursor = start.slice(0, vertex_count);
50
+ const edges = new Uint32Array(corner_count);
51
+
52
+ for (let e = 0; e < corner_count; e++) {
53
+ const a = index[e];
54
+ const b = index[e - e % 3 + (e + 1) % 3];
55
+
56
+ edges[cursor[a < b ? a : b]++] = e;
57
+ }
58
+
59
+ for (let v = 0; v < vertex_count; v++) {
60
+ const end = start[v + 1];
61
+
62
+ for (let i = start[v]; i < end; i++) {
63
+ const e = edges[i];
64
+ const a = index[e];
65
+ const b = index[e - e % 3 + (e + 1) % 3];
66
+
67
+ if (a === b) {
68
+ // a degenerate triangle's collapsed edge joins nothing
69
+ continue;
70
+ }
71
+
72
+ const upper = a < b ? b : a;
73
+
74
+ let other = -1;
75
+ let sharing = 0;
76
+
77
+ for (let j = start[v]; j < end; j++) {
78
+ if (j === i) continue;
79
+
80
+ const f = edges[j];
81
+ const fa = index[f];
82
+ const fb = index[f - f % 3 + (f + 1) % 3];
83
+
84
+ if ((fa < fb ? fb : fa) === upper) {
85
+ other = f;
86
+ sharing++;
87
+ }
88
+ }
89
+
90
+ if (sharing === 1) {
91
+ result[e] = (other / 3) | 0;
92
+ }
93
+ }
94
+ }
95
+
96
+ return result;
97
+ }
98
+
99
+ /**
100
+ * One 32-bit hash per triangle that depends on the triangles within `rounds` edge-steps of it, and on
101
+ * nothing else: not on where any of them sits in the index stream, not on which corner a triangle's
102
+ * indices start at, and not on the rigid motion and uniform scale the geometry was placed with.
103
+ *
104
+ * Round 0 is the triangle's own {@link triangle_fingerprint_stream} fingerprint. Each round after that
105
+ * mixes in the three hashes across the triangle's edges, read in winding order and started at the
106
+ * smallest, so the same triangle indexed from another corner reads the same three in the same order.
107
+ *
108
+ * Two copies of a piece hash their triangles alike wherever a triangle's `rounds`-ring lies inside the
109
+ * piece, whatever order a meshlet build or an exporter left the triangles in. A triangle nearer the
110
+ * piece's edge than that sees what surrounds the piece, which differs between copies.
111
+ *
112
+ * @param {Geometry} geometry
113
+ * @param {number} rounds
114
+ * @returns {Uint32Array} one per triangle
115
+ */
116
+ export function face_neighbourhood_hash(geometry, rounds) {
117
+ let hash = triangle_fingerprint_stream(geometry);
118
+
119
+ if (rounds === 0) {
120
+ return hash;
121
+ }
122
+
123
+ const triangle_count = hash.length;
124
+
125
+ const neighbours = triangle_edge_neighbours(
126
+ geometry.index !== null ? geometry.index.data : null,
127
+ triangle_count,
128
+ geometry.getVertexCount()
129
+ );
130
+
131
+ let next = new Uint32Array(triangle_count);
132
+
133
+ for (let round = 0; round < rounds; round++) {
134
+ for (let t = 0; t < triangle_count; t++) {
135
+ const n0 = neighbours[t * 3];
136
+ const n1 = neighbours[t * 3 + 1];
137
+ const n2 = neighbours[t * 3 + 2];
138
+
139
+ const h0 = n0 >= 0 ? hash[n0] : NO_NEIGHBOUR;
140
+ const h1 = n1 >= 0 ? hash[n1] : NO_NEIGHBOUR;
141
+ const h2 = n2 >= 0 ? hash[n2] : NO_NEIGHBOUR;
142
+
143
+ // the rotation of (h0, h1, h2) that starts at the smallest; ties go to the smaller next value
144
+ let x = h0, y = h1, z = h2;
145
+
146
+ if (h1 < x || (h1 === x && (h2 < y || (h2 === y && h0 < z)))) {
147
+ x = h1;
148
+ y = h2;
149
+ z = h0;
150
+ }
151
+
152
+ if (h2 < x || (h2 === x && (h0 < y || (h0 === y && h1 < z)))) {
153
+ x = h2;
154
+ y = h0;
155
+ z = h1;
156
+ }
157
+
158
+ next[t] = lowbias32(hash_mix2(hash_mix3(hash[t], x, y), z));
159
+ }
160
+
161
+ const swap = hash;
162
+ hash = next;
163
+ next = swap;
164
+ }
165
+
166
+ return hash;
167
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Pair up triangles whose {@link face_neighbourhood_hash} values are equal, within a geometry or across
3
+ * two: each pair is a place where a copy may sit, for growth to confirm or throw out.
4
+ *
5
+ * Within one hash, every triangle is paired with the first, in input order (geometry, then triangle) -
6
+ * not every triangle with every other. A copy that matches the first is found from it, and one that
7
+ * does not still gets the first's canonical piece by another anchor; pairing them all only repeats
8
+ * growth that the first pair already did. On Sponza through scene_optimize's meshlet round trip,
9
+ * pairing them all grew 172k times against 41k, and shared fewer triangles: 144.5k against 145.8k.
10
+ *
11
+ * A hash shared by more than `seed_budget` triangles keeps the first `seed_budget` of them, so a
12
+ * featureless region repeated thousands of times does not swamp what follows.
13
+ *
14
+ * @param {Uint32Array[]} hash_streams one per geometry, one hash per triangle
15
+ * @param {number} seed_budget most triangles kept per hash, >= 2
16
+ * @returns {Uint32Array} {@link ANCHOR_STRIDE} words per anchor: a geometry, a triangle of it, b geometry,
17
+ * a triangle of it. The `a` side is the earlier of the two in input order.
18
+ */
19
+ export function neighbourhood_anchor_index(hash_streams: Uint32Array[], seed_budget: number): Uint32Array;
20
+ /**
21
+ * Words per anchor in the array {@link neighbourhood_anchor_index} returns.
22
+ * @type {number}
23
+ */
24
+ export const ANCHOR_STRIDE: number;
25
+ //# sourceMappingURL=neighbourhood_anchor_index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"neighbourhood_anchor_index.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/scene/optimization/geometry/internal/neighbourhood_anchor_index.js"],"names":[],"mappings":"AAQA;;;;;;;;;;;;;;;;;GAiBG;AACH,yDALW,WAAW,EAAE,eACb,MAAM,GACJ,WAAW,CAoGvB;AAzHD;;;GAGG;AACH,4BAFU,MAAM,CAEe"}