@woosh/meep-engine 2.168.1 → 2.169.1

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 (624) hide show
  1. package/README.md +2 -2
  2. package/build/bundle-worker-image-decoder.js +1 -1
  3. package/editor/process/symbolic/make3DSymbolicDisplay.js +1 -1
  4. package/editor/view/ecs/EntityList.js +1 -1
  5. package/editor/view/ecs/components/particles/ParticleLayerController.js +1 -1
  6. package/editor/view/makeEntityDecorators.js +1 -1
  7. package/package.json +1 -1
  8. package/src/REVIEW_2026_08_06/adv-core.md +511 -0
  9. package/src/REVIEW_2026_08_06/adv-gfx.md +480 -0
  10. package/src/REVIEW_2026_08_06/adv-view.md +446 -0
  11. package/src/REVIEW_2026_08_06/api-core.md +296 -0
  12. package/src/REVIEW_2026_08_06/api-engine.md +195 -0
  13. package/src/REVIEW_2026_08_06/bvh-phys-sound-net.md +507 -0
  14. package/src/REVIEW_2026_08_06/core-binary.md +348 -0
  15. package/src/REVIEW_2026_08_06/core-collection.md +376 -0
  16. package/src/REVIEW_2026_08_06/core-math.md +221 -0
  17. package/src/REVIEW_2026_08_06/core-process.md +266 -0
  18. package/src/REVIEW_2026_08_06/core-science.md +223 -0
  19. package/src/REVIEW_2026_08_06/engine-ai-nav.md +279 -0
  20. package/src/REVIEW_2026_08_06/engine-animation.md +167 -0
  21. package/src/REVIEW_2026_08_06/engine-asset.md +166 -0
  22. package/src/REVIEW_2026_08_06/engine-ecs.md +920 -0
  23. package/src/REVIEW_2026_08_06/engine-input.md +197 -0
  24. package/src/REVIEW_2026_08_06/engine-misc.md +248 -0
  25. package/src/REVIEW_2026_08_06/engine-terrain.md +52 -0
  26. package/src/REVIEW_2026_08_06/generation.md +176 -0
  27. package/src/REVIEW_2026_08_06/geom-2d.md +434 -0
  28. package/src/REVIEW_2026_08_06/geom-3d.md +117 -0
  29. package/src/REVIEW_2026_08_06/gfx-gi.md +143 -0
  30. package/src/REVIEW_2026_08_06/gfx-render.md +740 -0
  31. package/src/REVIEW_2026_08_06/gfx-texture.md +690 -0
  32. package/src/REVIEW_2026_08_06/prior-criticals.md +49 -0
  33. package/src/REVIEW_2026_08_06/prior-highs.md +138 -0
  34. package/src/REVIEW_2026_08_06/test-gaps.md +364 -0
  35. package/src/REVIEW_2026_08_06/view.md +667 -0
  36. package/src/REVIEW_2026_08_06.md +610 -0
  37. package/src/core/IdPool.d.ts +2 -2
  38. package/src/core/IdPool.d.ts.map +1 -1
  39. package/src/core/IdPool.js +1 -1
  40. package/src/core/binary/32BitEncoder.d.ts +2 -3
  41. package/src/core/binary/32BitEncoder.d.ts.map +1 -1
  42. package/src/core/binary/32BitEncoder.js +1 -1
  43. package/src/core/binary/BinaryBuffer.d.ts.map +1 -1
  44. package/src/core/binary/BinaryBuffer.js +12 -1
  45. package/src/core/binary/BitImage2.d.ts +5 -1
  46. package/src/core/binary/BitImage2.d.ts.map +1 -1
  47. package/src/core/binary/BitImage2.js +5 -1
  48. package/src/core/bvh2/bvh3/BVH.d.ts +2 -2
  49. package/src/core/bvh2/bvh3/BVH.d.ts.map +1 -1
  50. package/src/core/bvh2/bvh3/BVH.js +1 -1
  51. package/src/core/bvh2/bvh3/query/bvh_query_user_data_nearest_to_point_filtered.d.ts +2 -2
  52. package/src/core/bvh2/bvh3/query/bvh_query_user_data_nearest_to_point_filtered.d.ts.map +1 -1
  53. package/src/core/bvh2/bvh3/query/bvh_query_user_data_nearest_to_point_filtered.js +86 -86
  54. package/src/core/bvh2/traversal/aabb3_detailed_volume_intersection_callback_based.d.ts +2 -2
  55. package/src/core/bvh2/traversal/aabb3_detailed_volume_intersection_callback_based.d.ts.map +1 -1
  56. package/src/core/bvh2/traversal/aabb3_detailed_volume_intersection_callback_based.js +1 -1
  57. package/src/core/bvh8/build/NodeProxy.d.ts.map +1 -1
  58. package/src/core/bvh8/build/NodeProxy.js +314 -308
  59. package/src/core/cache/Cache.d.ts +4 -4
  60. package/src/core/cache/Cache.d.ts.map +1 -1
  61. package/src/core/cache/Cache.js +3 -3
  62. package/src/core/cache/LoadingCache.d.ts +1 -1
  63. package/src/core/cache/LoadingCache.js +2 -2
  64. package/src/core/cache/wtinylfu/CacheWTinylfu.d.ts +2 -2
  65. package/src/core/cache/wtinylfu/CacheWTinylfu.js +2 -2
  66. package/src/core/collection/array/array_index_by_equality.d.ts +2 -2
  67. package/src/core/collection/array/array_index_by_equality.d.ts.map +1 -1
  68. package/src/core/collection/array/array_index_by_equality.js +1 -1
  69. package/src/core/collection/array/array_pick_best_element.d.ts +2 -2
  70. package/src/core/collection/array/array_pick_best_element.d.ts.map +1 -1
  71. package/src/core/collection/array/array_pick_best_element.js +1 -1
  72. package/src/core/collection/array/array_pick_best_elements.d.ts +2 -2
  73. package/src/core/collection/array/array_pick_best_elements.d.ts.map +1 -1
  74. package/src/core/collection/array/array_pick_best_elements.js +1 -1
  75. package/src/core/collection/array/array_set_diff.d.ts +2 -3
  76. package/src/core/collection/array/array_set_diff.d.ts.map +1 -1
  77. package/src/core/collection/array/array_set_diff.js +1 -1
  78. package/src/core/collection/array/array_set_diff_sorting.d.ts +2 -2
  79. package/src/core/collection/array/array_set_diff_sorting.d.ts.map +1 -1
  80. package/src/core/collection/array/array_set_diff_sorting.js +1 -1
  81. package/src/core/collection/array/iterator/ArrayIteratorRandom.d.ts +2 -1
  82. package/src/core/collection/array/iterator/ArrayIteratorRandom.d.ts.map +1 -1
  83. package/src/core/collection/heap/BinaryHeap.d.ts +2 -2
  84. package/src/core/collection/heap/BinaryHeap.d.ts.map +1 -1
  85. package/src/core/collection/heap/BinaryHeap.js +1 -1
  86. package/src/core/collection/list/List.d.ts +32 -17
  87. package/src/core/collection/list/List.d.ts.map +1 -1
  88. package/src/core/collection/list/List.js +43 -9
  89. package/src/core/collection/list/SortedListProjection.d.ts.map +1 -1
  90. package/src/core/collection/list/SortedListProjection.js +4 -1
  91. package/src/core/collection/map/BiMap.d.ts +25 -2
  92. package/src/core/collection/map/BiMap.d.ts.map +1 -1
  93. package/src/core/collection/map/BiMap.js +57 -3
  94. package/src/core/collection/map/HashMap.d.ts +2 -2
  95. package/src/core/collection/map/HashMap.d.ts.map +1 -1
  96. package/src/core/collection/map/HashMap.js +1 -1
  97. package/src/core/collection/set/ArraySet.d.ts +2 -2
  98. package/src/core/collection/set/ArraySet.d.ts.map +1 -1
  99. package/src/core/collection/set/ArraySet.js +1 -1
  100. package/src/core/collection/table/RowFirstTable.d.ts +2 -2
  101. package/src/core/collection/table/RowFirstTable.d.ts.map +1 -1
  102. package/src/core/collection/table/RowFirstTable.js +1 -1
  103. package/src/core/collection/table/RowFirstTableSpec.js +4 -4
  104. package/src/core/debug/matchers/IsAnything.d.ts.map +1 -1
  105. package/src/core/debug/matchers/IsAnything.js +5 -1
  106. package/src/core/events/signal/Signal.d.ts.map +1 -1
  107. package/src/core/events/signal/Signal.js +3 -1
  108. package/src/core/fsm/simple/SimpleStateMachineDescription.d.ts +2 -2
  109. package/src/core/fsm/simple/SimpleStateMachineDescription.d.ts.map +1 -1
  110. package/src/core/fsm/simple/SimpleStateMachineDescription.js +1 -1
  111. package/src/core/geom/2d/bvh/BVH2D.d.ts +2 -2
  112. package/src/core/geom/2d/bvh/BVH2D.d.ts.map +1 -1
  113. package/src/core/geom/2d/bvh/BVH2D.js +1 -1
  114. package/src/core/geom/2d/polygon/TRIANGULATION_DESIGN.md +433 -0
  115. package/src/core/geom/2d/polygon/polygon2_is_counter_clockwise.d.ts +31 -0
  116. package/src/core/geom/2d/polygon/polygon2_is_counter_clockwise.d.ts.map +1 -0
  117. package/src/core/geom/2d/polygon/polygon2_is_counter_clockwise.js +84 -0
  118. package/src/core/geom/2d/polygon/polygon2_signed_area.d.ts +24 -2
  119. package/src/core/geom/2d/polygon/polygon2_signed_area.d.ts.map +1 -1
  120. package/src/core/geom/2d/polygon/polygon2_signed_area.js +52 -34
  121. package/src/core/geom/2d/polygon/polygon2_triangulate.corpus.d.ts +28 -0
  122. package/src/core/geom/2d/polygon/polygon2_triangulate.corpus.d.ts.map +1 -0
  123. package/src/core/geom/2d/polygon/polygon2_triangulate.corpus.js +86 -0
  124. package/src/core/geom/2d/polygon/polygon2_triangulate.d.ts +40 -0
  125. package/src/core/geom/2d/polygon/polygon2_triangulate.d.ts.map +1 -0
  126. package/src/core/geom/2d/polygon/polygon2_triangulate.js +1280 -0
  127. package/src/core/geom/2d/polygon/polygon2_triangulation_deviation.d.ts +28 -0
  128. package/src/core/geom/2d/polygon/polygon2_triangulation_deviation.d.ts.map +1 -0
  129. package/src/core/geom/2d/polygon/polygon2_triangulation_deviation.js +77 -0
  130. package/src/core/geom/2d/quad-tree/qt_match_data_by_circle.d.ts +2 -2
  131. package/src/core/geom/2d/quad-tree/qt_match_data_by_circle.d.ts.map +1 -1
  132. package/src/core/geom/2d/quad-tree/qt_match_data_by_circle.js +1 -1
  133. package/src/core/geom/2d/quad-tree/qt_query_data_raycast.d.ts +2 -2
  134. package/src/core/geom/2d/quad-tree/qt_query_data_raycast.d.ts.map +1 -1
  135. package/src/core/geom/2d/quad-tree/qt_query_data_raycast.js +1 -1
  136. package/src/core/geom/2d/triangle/tri2_rasterize_conservative.d.ts +6 -3
  137. package/src/core/geom/2d/triangle/tri2_rasterize_conservative.d.ts.map +1 -1
  138. package/src/core/geom/2d/triangle/tri2_rasterize_conservative.js +26 -13
  139. package/src/core/geom/2d/triangle/tri2_signed_area.d.ts +17 -1
  140. package/src/core/geom/2d/triangle/tri2_signed_area.d.ts.map +1 -1
  141. package/src/core/geom/2d/triangle/tri2_signed_area.js +35 -23
  142. package/src/core/geom/2d/v2_morton_encode.d.ts +20 -0
  143. package/src/core/geom/2d/v2_morton_encode.d.ts.map +1 -0
  144. package/src/core/geom/2d/v2_morton_encode.js +23 -0
  145. package/src/core/geom/3d/aabb/AABB3.d.ts +2 -2
  146. package/src/core/geom/3d/aabb/AABB3.d.ts.map +1 -1
  147. package/src/core/geom/3d/aabb/AABB3.js +1 -1
  148. package/src/core/geom/3d/atlas/segment/atlas_merge_charts.d.ts.map +1 -1
  149. package/src/core/geom/3d/atlas/segment/atlas_merge_charts.js +4 -1
  150. package/src/core/geom/3d/polygon/polygon3_compute_normal.d.ts +27 -0
  151. package/src/core/geom/3d/polygon/polygon3_compute_normal.d.ts.map +1 -0
  152. package/src/core/geom/3d/polygon/polygon3_compute_normal.js +60 -0
  153. package/src/core/geom/3d/polygon/polygon3_triangulate.d.ts +34 -0
  154. package/src/core/geom/3d/polygon/polygon3_triangulate.d.ts.map +1 -0
  155. package/src/core/geom/3d/polygon/polygon3_triangulate.js +94 -0
  156. package/src/core/geom/3d/quaternion/quat3_multiply.d.ts +8 -2
  157. package/src/core/geom/3d/quaternion/quat3_multiply.d.ts.map +1 -1
  158. package/src/core/geom/3d/quaternion/quat3_multiply.js +8 -2
  159. package/src/core/geom/3d/shape/ConvexHullShape3D.d.ts.map +1 -1
  160. package/src/core/geom/3d/shape/ConvexHullShape3D.js +32 -2
  161. package/src/core/geom/3d/tetrahedra/TetrahedralMesh.d.ts +2 -2
  162. package/src/core/geom/3d/tetrahedra/TetrahedralMesh.d.ts.map +1 -1
  163. package/src/core/geom/3d/tetrahedra/TetrahedralMesh.js +1 -1
  164. package/src/core/geom/3d/tetrahedra/delaunay/debug/push_boundary_with_validation.d.ts +2 -5
  165. package/src/core/geom/3d/tetrahedra/delaunay/debug/push_boundary_with_validation.d.ts.map +1 -1
  166. package/src/core/geom/3d/tetrahedra/delaunay/debug/push_boundary_with_validation.js +1 -1
  167. package/src/core/geom/3d/tetrahedra/delaunay/debug/validate_cavity_boundary.d.ts +2 -2
  168. package/src/core/geom/3d/tetrahedra/delaunay/debug/validate_cavity_boundary.d.ts.map +1 -1
  169. package/src/core/geom/3d/tetrahedra/delaunay/debug/validate_cavity_boundary.js +1 -1
  170. package/src/core/geom/3d/tetrahedra/validate_tetrahedral_mesh.d.ts +2 -3
  171. package/src/core/geom/3d/tetrahedra/validate_tetrahedral_mesh.d.ts.map +1 -1
  172. package/src/core/geom/3d/tetrahedra/validate_tetrahedral_mesh.js +69 -69
  173. package/src/core/geom/3d/tetrahedra/validate_tetrahedron_neighbourhood.d.ts +2 -3
  174. package/src/core/geom/3d/tetrahedra/validate_tetrahedron_neighbourhood.d.ts.map +1 -1
  175. package/src/core/geom/3d/tetrahedra/validate_tetrahedron_neighbourhood.js +50 -50
  176. package/src/core/geom/3d/topology/struct/TopoEdge.d.ts +2 -2
  177. package/src/core/geom/3d/topology/struct/TopoEdge.d.ts.map +1 -1
  178. package/src/core/geom/3d/topology/struct/TopoEdge.js +1 -1
  179. package/src/core/geom/3d/topology/struct/TopoMesh.d.ts +2 -3
  180. package/src/core/geom/3d/topology/struct/TopoMesh.d.ts.map +1 -1
  181. package/src/core/geom/3d/topology/struct/TopoMesh.js +1 -1
  182. package/src/core/geom/3d/topology/struct/TopoTriangle.d.ts +2 -2
  183. package/src/core/geom/3d/topology/struct/TopoTriangle.d.ts.map +1 -1
  184. package/src/core/geom/3d/topology/struct/TopoTriangle.js +1 -1
  185. package/src/core/geom/3d/topology/struct/TopoVertex.d.ts +2 -2
  186. package/src/core/geom/3d/topology/struct/TopoVertex.d.ts.map +1 -1
  187. package/src/core/geom/3d/topology/struct/TopoVertex.js +1 -1
  188. package/src/core/geom/3d/topology/struct/binary/io/face/bt_face_triangulate.d.ts +23 -6
  189. package/src/core/geom/3d/topology/struct/binary/io/face/bt_face_triangulate.d.ts.map +1 -1
  190. package/src/core/geom/3d/topology/struct/binary/io/face/bt_face_triangulate.js +268 -124
  191. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_assert_valid.d.ts +17 -0
  192. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_assert_valid.d.ts.map +1 -0
  193. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_assert_valid.js +44 -0
  194. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_count_edge_faces.d.ts +20 -0
  195. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_count_edge_faces.d.ts.map +1 -0
  196. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_count_edge_faces.js +40 -0
  197. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_is_closed.d.ts +19 -0
  198. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_is_closed.d.ts.map +1 -0
  199. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_is_closed.js +34 -0
  200. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_is_manifold.d.ts +22 -0
  201. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_is_manifold.d.ts.map +1 -0
  202. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_is_manifold.js +37 -0
  203. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_validate.d.ts +87 -0
  204. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_validate.d.ts.map +1 -0
  205. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_validate.js +599 -0
  206. package/src/core/geom/3d/topology/util/mesh_flood_fill.d.ts +1 -1
  207. package/src/core/geom/3d/topology/util/mesh_flood_fill.js +1 -1
  208. package/src/core/geom/3d/triangle/tri3_compute_signed_volume.d.ts +32 -0
  209. package/src/core/geom/3d/triangle/tri3_compute_signed_volume.d.ts.map +1 -1
  210. package/src/core/geom/3d/triangle/tri3_compute_signed_volume.js +66 -7
  211. package/src/core/geom/3d/triangle/tri3_mesh_compute_signed_volume.d.ts +22 -1
  212. package/src/core/geom/3d/triangle/tri3_mesh_compute_signed_volume.d.ts.map +1 -1
  213. package/src/core/geom/3d/triangle/tri3_mesh_compute_signed_volume.js +83 -38
  214. package/src/core/geom/3d/util/aabb3_emit_point_grid.d.ts +2 -2
  215. package/src/core/geom/3d/util/aabb3_emit_point_grid.d.ts.map +1 -1
  216. package/src/core/geom/3d/util/aabb3_emit_point_grid.js +1 -1
  217. package/src/core/geom/MANIFOLD_COMPARISON_2026_08_01.md +554 -0
  218. package/src/core/geom/Quaternion.d.ts +2 -2
  219. package/src/core/geom/Quaternion.d.ts.map +1 -1
  220. package/src/core/geom/Quaternion.js +1 -1
  221. package/src/core/geom/Vector1.d.ts +2 -2
  222. package/src/core/geom/Vector1.d.ts.map +1 -1
  223. package/src/core/geom/Vector1.js +1 -1
  224. package/src/core/geom/packing/max-rect/find_best_container.d.ts +2 -2
  225. package/src/core/geom/packing/max-rect/find_best_container.d.ts.map +1 -1
  226. package/src/core/geom/packing/max-rect/find_best_container.js +1 -1
  227. package/src/core/geom/vec3/v3_cotangent.d.ts +6 -2
  228. package/src/core/geom/vec3/v3_cotangent.d.ts.map +1 -1
  229. package/src/core/geom/vec3/v3_cotangent.js +6 -2
  230. package/src/core/geom/vec3/v3_cross.d.ts +6 -2
  231. package/src/core/geom/vec3/v3_cross.d.ts.map +1 -1
  232. package/src/core/geom/vec3/v3_cross.js +6 -2
  233. package/src/core/geom/vec3/v3_lerp.d.ts +1 -1
  234. package/src/core/geom/vec3/v3_lerp.js +1 -1
  235. package/src/core/geom/vec3/v3_multiply.d.ts +6 -2
  236. package/src/core/geom/vec3/v3_multiply.d.ts.map +1 -1
  237. package/src/core/geom/vec3/v3_multiply.js +6 -2
  238. package/src/core/geom/vec3/v3_subtract.d.ts +6 -2
  239. package/src/core/geom/vec3/v3_subtract.d.ts.map +1 -1
  240. package/src/core/geom/vec3/v3_subtract.js +6 -2
  241. package/src/core/json/abstractJSONSerializer.d.ts +2 -2
  242. package/src/core/json/abstractJSONSerializer.d.ts.map +1 -1
  243. package/src/core/json/abstractJSONSerializer.js +1 -1
  244. package/src/core/lang/reactive/AbstractCachingParser.d.ts +2 -3
  245. package/src/core/lang/reactive/AbstractCachingParser.d.ts.map +1 -1
  246. package/src/core/lang/reactive/AbstractCachingParser.js +1 -1
  247. package/src/core/localization/Localization.d.ts +2 -2
  248. package/src/core/localization/Localization.d.ts.map +1 -1
  249. package/src/core/localization/Localization.js +2 -2
  250. package/src/core/math/noise/create_simplex_noise_2d.d.ts +2 -2
  251. package/src/core/math/noise/create_simplex_noise_2d.d.ts.map +1 -1
  252. package/src/core/math/noise/create_simplex_noise_2d.js +1 -1
  253. package/src/core/math/physics/mie/MIE_PARTICLES_STANDARD.js +1 -1
  254. package/src/core/math/physics/mie/compute_mie_particle_properties_rgb.d.ts +3 -3
  255. package/src/core/math/physics/mie/compute_mie_particle_properties_rgb.d.ts.map +1 -1
  256. package/src/core/math/physics/mie/compute_mie_particle_properties_rgb.js +2 -2
  257. package/src/core/math/random/randomSeed.d.ts +13 -0
  258. package/src/core/math/random/randomSeed.d.ts.map +1 -0
  259. package/src/core/math/random/randomSeed.js +16 -0
  260. package/src/core/math/random/seededRandom_Mulberry32.d.ts +3 -2
  261. package/src/core/math/random/seededRandom_Mulberry32.d.ts.map +1 -1
  262. package/src/core/math/random/seededRandom_Mulberry32.js +1 -1
  263. package/src/core/math/spline/spline3_hermite_apply_transform.d.ts +50 -0
  264. package/src/core/math/spline/spline3_hermite_apply_transform.d.ts.map +1 -0
  265. package/src/core/math/spline/spline3_hermite_apply_transform.js +107 -0
  266. package/src/core/math/spline/spline3_hermite_reverse.d.ts +34 -0
  267. package/src/core/math/spline/spline3_hermite_reverse.d.ts.map +1 -0
  268. package/src/core/math/spline/spline3_hermite_reverse.js +49 -0
  269. package/src/core/math/statistics/hammersley_sequence.d.ts +17 -4
  270. package/src/core/math/statistics/hammersley_sequence.d.ts.map +1 -1
  271. package/src/core/math/statistics/hammersley_sequence.js +25 -16
  272. package/src/core/model/ModuleRegistry.d.ts +2 -2
  273. package/src/core/model/ModuleRegistry.d.ts.map +1 -1
  274. package/src/core/model/ModuleRegistry.js +1 -1
  275. package/src/core/model/node-graph/json/serializeNodeGraphToJSON.d.ts +1 -1
  276. package/src/core/model/node-graph/json/serializeNodeGraphToJSON.js +2 -2
  277. package/src/core/model/object/objectDeepEquals.d.ts +2 -2
  278. package/src/core/model/object/objectDeepEquals.d.ts.map +1 -1
  279. package/src/core/model/object/objectDeepEquals.js +1 -1
  280. package/src/core/model/reactive/model/ReactiveExpression.d.ts +2 -2
  281. package/src/core/model/reactive/model/ReactiveExpression.d.ts.map +1 -1
  282. package/src/core/model/reactive/model/ReactiveExpression.js +1 -1
  283. package/src/core/model/validate_enum_schema.d.ts +2 -3
  284. package/src/core/model/validate_enum_schema.d.ts.map +1 -1
  285. package/src/core/model/validate_enum_schema.js +1 -1
  286. package/src/core/process/Future.d.ts +3 -3
  287. package/src/core/process/Future.d.ts.map +1 -1
  288. package/src/core/process/Future.js +13 -1
  289. package/src/core/process/PromiseWatcher.d.ts.map +1 -1
  290. package/src/core/process/PromiseWatcher.js +9 -2
  291. package/src/core/process/executor/ConcurrentExecutor.d.ts.map +1 -1
  292. package/src/core/process/executor/ConcurrentExecutor.js +12 -2
  293. package/src/core/process/task/Task.d.ts +3 -3
  294. package/src/core/process/task/Task.d.ts.map +1 -1
  295. package/src/core/process/task/Task.js +2 -2
  296. package/src/core/process/task/util/countTask.d.ts +2 -2
  297. package/src/core/process/task/util/countTask.d.ts.map +1 -1
  298. package/src/core/process/task/util/countTask.js +1 -1
  299. package/src/core/process/task/util/randomCountTask.d.ts +2 -2
  300. package/src/core/process/task/util/randomCountTask.d.ts.map +1 -1
  301. package/src/core/process/task/util/randomCountTask.js +1 -1
  302. package/src/core/process/worker/WorkerProxy.d.ts.map +1 -1
  303. package/src/core/process/worker/WorkerProxy.js +5 -2
  304. package/src/core/process/worker/extractTransferables.d.ts.map +1 -1
  305. package/src/core/process/worker/extractTransferables.js +4 -1
  306. package/src/engine/Engine.d.ts +12 -12
  307. package/src/engine/Engine.d.ts.map +1 -1
  308. package/src/engine/Engine.js +149 -10
  309. package/src/engine/animation/Animations.d.ts +4 -4
  310. package/src/engine/animation/Animations.d.ts.map +1 -1
  311. package/src/engine/animation/Animations.js +2 -2
  312. package/src/engine/animation/EntityAnimation.d.ts +5 -5
  313. package/src/engine/animation/EntityAnimation.d.ts.map +1 -1
  314. package/src/engine/animation/EntityAnimation.js +2 -2
  315. package/src/engine/animation/TransitionFunctions.d.ts +1 -4
  316. package/src/engine/animation/TransitionFunctions.d.ts.map +1 -1
  317. package/src/engine/animation/TransitionFunctions.js +1 -1
  318. package/src/engine/animation/Tween.d.ts +4 -4
  319. package/src/engine/animation/Tween.d.ts.map +1 -1
  320. package/src/engine/animation/Tween.js +2 -2
  321. package/src/engine/asset/AssetManager.d.ts +6 -6
  322. package/src/engine/asset/AssetManager.d.ts.map +1 -1
  323. package/src/engine/asset/AssetManager.js +1411 -1411
  324. package/src/engine/asset/AssetRequest.d.ts +4 -4
  325. package/src/engine/asset/AssetRequest.d.ts.map +1 -1
  326. package/src/engine/asset/AssetRequest.js +3 -3
  327. package/src/engine/asset/loaders/ArrayBufferLoader.d.ts.map +1 -1
  328. package/src/engine/asset/loaders/ArrayBufferLoader.js +7 -0
  329. package/src/engine/asset/loaders/AssetLoader.d.ts +3 -3
  330. package/src/engine/asset/loaders/AssetLoader.d.ts.map +1 -1
  331. package/src/engine/asset/loaders/AssetLoader.js +2 -2
  332. package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.d.ts +0 -10
  333. package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.d.ts.map +1 -1
  334. package/src/engine/ecs/EntityComponentDataset.d.ts +6 -6
  335. package/src/engine/ecs/EntityComponentDataset.d.ts.map +1 -1
  336. package/src/engine/ecs/EntityComponentDataset.js +3 -3
  337. package/src/engine/ecs/EntityManager.d.ts +4 -4
  338. package/src/engine/ecs/EntityManager.js +4 -4
  339. package/src/engine/ecs/EntityObserver.d.ts +3 -3
  340. package/src/engine/ecs/EntityObserver.d.ts.map +1 -1
  341. package/src/engine/ecs/EntityObserver.js +2 -2
  342. package/src/engine/ecs/System.d.ts +4 -4
  343. package/src/engine/ecs/System.d.ts.map +1 -1
  344. package/src/engine/ecs/System.js +2 -2
  345. package/src/engine/ecs/dynamic_actions/DynamicActorSystem.d.ts +2 -3
  346. package/src/engine/ecs/dynamic_actions/DynamicActorSystem.d.ts.map +1 -1
  347. package/src/engine/ecs/dynamic_actions/DynamicActorSystem.js +1 -1
  348. package/src/engine/ecs/grid/pick.d.ts +4 -2
  349. package/src/engine/ecs/grid/pick.d.ts.map +1 -1
  350. package/src/engine/ecs/grid/pick.js +1 -1
  351. package/src/engine/ecs/parent/EntityNode.d.ts +4 -4
  352. package/src/engine/ecs/parent/EntityNode.d.ts.map +1 -1
  353. package/src/engine/ecs/parent/EntityNode.js +2 -2
  354. package/src/engine/ecs/speaker/lines/sets/LineSetDescription.d.ts.map +1 -1
  355. package/src/engine/ecs/speaker/lines/sets/LineSetDescription.js +3 -1
  356. package/src/engine/ecs/storage/binary/collection/BinaryCollectionDeSerializer.d.ts +2 -2
  357. package/src/engine/ecs/storage/binary/collection/BinaryCollectionDeSerializer.d.ts.map +1 -1
  358. package/src/engine/ecs/storage/binary/collection/BinaryCollectionDeSerializer.js +1 -1
  359. package/src/engine/ecs/storage/binary/collection/BinaryCollectionHeaderCodec.d.ts +1 -2
  360. package/src/engine/ecs/storage/binary/collection/BinaryCollectionHeaderCodec.d.ts.map +1 -1
  361. package/src/engine/ecs/systems/AnimationSystem.d.ts +0 -5
  362. package/src/engine/ecs/systems/AnimationSystem.d.ts.map +1 -1
  363. package/src/engine/ecs/terrain/ecs/TerrainSystem.d.ts +2 -2
  364. package/src/engine/ecs/terrain/ecs/TerrainSystem.d.ts.map +1 -1
  365. package/src/engine/ecs/terrain/ecs/TerrainSystem.js +5 -2
  366. package/src/engine/ecs/terrain/tiles/TerrainTileManager.d.ts +34 -5
  367. package/src/engine/ecs/terrain/tiles/TerrainTileManager.d.ts.map +1 -1
  368. package/src/engine/ecs/terrain/tiles/TerrainTileManager.js +87 -26
  369. package/src/engine/ecs/terrain/util/obtainTerrain.d.ts +2 -3
  370. package/src/engine/ecs/terrain/util/obtainTerrain.d.ts.map +1 -1
  371. package/src/engine/ecs/terrain/util/obtainTerrain.js +1 -1
  372. package/src/engine/ecs/util/hideEntityGracefully.js +2 -2
  373. package/src/engine/graphics/CONTEXT_LOSS_RECOVERY_PLAN.md +446 -0
  374. package/src/engine/graphics/FrameRunner.d.ts +2 -2
  375. package/src/engine/graphics/FrameRunner.d.ts.map +1 -1
  376. package/src/engine/graphics/FrameRunner.js +1 -1
  377. package/src/engine/graphics/GraphicsEngine.d.ts +60 -9
  378. package/src/engine/graphics/GraphicsEngine.d.ts.map +1 -1
  379. package/src/engine/graphics/GraphicsEngine.js +197 -25
  380. package/src/engine/graphics/camera/CameraShake.d.ts +6 -6
  381. package/src/engine/graphics/camera/CameraShake.d.ts.map +1 -1
  382. package/src/engine/graphics/context/WebGLContextFailureReason.d.ts +9 -0
  383. package/src/engine/graphics/context/WebGLContextFailureReason.d.ts.map +1 -0
  384. package/src/engine/graphics/context/WebGLContextFailureReason.js +17 -0
  385. package/src/engine/graphics/context/WebGLContextMonitor.d.ts +106 -0
  386. package/src/engine/graphics/context/WebGLContextMonitor.d.ts.map +1 -0
  387. package/src/engine/graphics/context/WebGLContextMonitor.js +341 -0
  388. package/src/engine/graphics/context/WebGLContextState.d.ts +14 -0
  389. package/src/engine/graphics/context/WebGLContextState.d.ts.map +1 -0
  390. package/src/engine/graphics/context/WebGLContextState.js +24 -0
  391. package/src/engine/graphics/context/testWebGLContextLoss.d.ts +2 -0
  392. package/src/engine/graphics/context/testWebGLContextLoss.d.ts.map +1 -0
  393. package/src/engine/graphics/context/testWebGLContextLoss.js +696 -0
  394. package/src/engine/graphics/ecs/camera/CameraSystem.d.ts +2 -2
  395. package/src/engine/graphics/ecs/camera/CameraSystem.d.ts.map +1 -1
  396. package/src/engine/graphics/ecs/camera/CameraSystem.js +1 -1
  397. package/src/engine/graphics/ecs/camera/serialization/CameraSerializationAdapter.d.ts.map +1 -1
  398. package/src/engine/graphics/ecs/camera/serialization/CameraSerializationAdapter.js +68 -32
  399. package/src/engine/graphics/ecs/camera/serialization/CameraSerializationUpgrader_0_1.d.ts +14 -0
  400. package/src/engine/graphics/ecs/camera/serialization/CameraSerializationUpgrader_0_1.d.ts.map +1 -0
  401. package/src/engine/graphics/ecs/camera/serialization/CameraSerializationUpgrader_0_1.js +41 -0
  402. package/src/engine/graphics/ecs/decal/v2/FPDecalSystem.d.ts +2 -3
  403. package/src/engine/graphics/ecs/decal/v2/FPDecalSystem.d.ts.map +1 -1
  404. package/src/engine/graphics/ecs/decal/v2/FPDecalSystem.js +2 -2
  405. package/src/engine/graphics/ecs/light/three/ThreeLightCache.d.ts +1 -1
  406. package/src/engine/graphics/ecs/light/three/ThreeLightCache.js +1 -1
  407. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometrySystem.d.ts +4 -5
  408. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometrySystem.d.ts.map +1 -1
  409. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometrySystem.js +7 -2
  410. package/src/engine/graphics/ecs/trail2d/Trail2DSystem.d.ts +1 -1
  411. package/src/engine/graphics/ecs/trail2d/Trail2DSystem.d.ts.map +1 -1
  412. package/src/engine/graphics/ecs/trail2d/Trail2DSystem.js +2 -1
  413. package/src/engine/graphics/ecs/trail3d/Trail3DSystem.d.ts +1 -1
  414. package/src/engine/graphics/ecs/trail3d/Trail3DSystem.d.ts.map +1 -1
  415. package/src/engine/graphics/ecs/trail3d/Trail3DSystem.js +3 -5
  416. package/src/engine/graphics/geometry/MikkT/BuildNeighborsFast.d.ts.map +1 -1
  417. package/src/engine/graphics/geometry/MikkT/BuildNeighborsFast.js +3 -2
  418. package/src/engine/graphics/geometry/MikkT/GenerateSharedVerticesIndexList.d.ts.map +1 -1
  419. package/src/engine/graphics/geometry/MikkT/GenerateSharedVerticesIndexList.js +3 -1
  420. package/src/engine/graphics/geometry/computeBoundingSphereFromVertexData.d.ts +2 -2
  421. package/src/engine/graphics/geometry/computeBoundingSphereFromVertexData.js +1 -1
  422. package/src/engine/graphics/geometry/computeMeshSurfaceArea.js +1 -1
  423. package/src/engine/graphics/geometry/instancing/InstancedMeshGroup.d.ts +2 -2
  424. package/src/engine/graphics/geometry/instancing/InstancedMeshGroup.d.ts.map +1 -1
  425. package/src/engine/graphics/geometry/instancing/InstancedMeshGroup.js +1 -1
  426. package/src/engine/graphics/geometry/ribbon/Ribbon.d.ts +2 -2
  427. package/src/engine/graphics/geometry/ribbon/Ribbon.d.ts.map +1 -1
  428. package/src/engine/graphics/geometry/ribbon/Ribbon.js +1 -1
  429. package/src/engine/graphics/load_and_set_cubemap_v0.d.ts +5 -0
  430. package/src/engine/graphics/load_and_set_cubemap_v0.d.ts.map +1 -1
  431. package/src/engine/graphics/load_and_set_cubemap_v0.js +26 -21
  432. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.d.ts +2 -2
  433. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.d.ts.map +1 -1
  434. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +1 -1
  435. package/src/engine/graphics/particles/particular/engine/emitter/computeEmissionFunction.d.ts +2 -2
  436. package/src/engine/graphics/particles/particular/engine/emitter/computeEmissionFunction.d.ts.map +1 -1
  437. package/src/engine/graphics/particles/particular/engine/emitter/computeEmissionFunction.js +1 -1
  438. package/src/engine/graphics/particles/particular/engine/utils/distrubuteParticlesOnMesh.d.ts +2 -2
  439. package/src/engine/graphics/particles/particular/engine/utils/distrubuteParticlesOnMesh.d.ts.map +1 -1
  440. package/src/engine/graphics/particles/particular/engine/utils/distrubuteParticlesOnMesh.js +1 -1
  441. package/src/engine/graphics/particles/particular/group/ParticleGroup.d.ts.map +1 -1
  442. package/src/engine/graphics/particles/particular/group/ParticleGroup.js +19 -8
  443. package/src/engine/graphics/particles/particular/group/optimizeCommandQueue.js +1 -1
  444. package/src/engine/graphics/render/RendererPool.d.ts +4 -4
  445. package/src/engine/graphics/render/RendererPool.d.ts.map +1 -1
  446. package/src/engine/graphics/render/RendererPool.js +2 -2
  447. package/src/engine/graphics/render/frame_graph/FrameGraph.d.ts +5 -4
  448. package/src/engine/graphics/render/frame_graph/FrameGraph.d.ts.map +1 -1
  449. package/src/engine/graphics/render/frame_graph/FrameGraph.js +2 -2
  450. package/src/engine/graphics/render/layers/RenderLayer.d.ts +2 -2
  451. package/src/engine/graphics/render/layers/RenderLayer.d.ts.map +1 -1
  452. package/src/engine/graphics/render/layers/RenderLayer.js +1 -1
  453. package/src/engine/graphics/render/layers/RenderLayerUtils.js +1 -1
  454. package/src/engine/graphics/sh3/lightmap/bake_lightmap_for_scene.d.ts +3 -1
  455. package/src/engine/graphics/sh3/lightmap/bake_lightmap_for_scene.d.ts.map +1 -1
  456. package/src/engine/graphics/sh3/lightmap/bake_lightmap_for_scene.js +681 -681
  457. package/src/engine/graphics/sh3/lightmap/lightmap_rasterize_triangle.d.ts +2 -2
  458. package/src/engine/graphics/sh3/lightmap/lightmap_rasterize_triangle.d.ts.map +1 -1
  459. package/src/engine/graphics/sh3/lightmap/lightmap_rasterize_triangle.js +145 -145
  460. package/src/engine/graphics/sh3/lpv/PathTracerProbeRenderer.d.ts +2 -1
  461. package/src/engine/graphics/sh3/lpv/PathTracerProbeRenderer.d.ts.map +1 -1
  462. package/src/engine/graphics/texture/atlas/AtlasLookupTexture.d.ts.map +1 -1
  463. package/src/engine/graphics/texture/atlas/AtlasLookupTexture.js +10 -3
  464. package/src/engine/graphics/texture/atlas/TextureAtlas.d.ts.map +1 -1
  465. package/src/engine/graphics/texture/atlas/TextureAtlas.js +4 -1
  466. package/src/engine/graphics/texture/atlas/gpu/WebGLTextureAtlas.d.ts.map +1 -1
  467. package/src/engine/graphics/texture/atlas/gpu/WebGLTextureAtlas.js +11 -0
  468. package/src/engine/graphics/texture/cubemap/load_environment_map.d.ts.map +1 -1
  469. package/src/engine/graphics/texture/cubemap/load_environment_map.js +5 -2
  470. package/src/engine/graphics/texture/sampler/Sampler2D.d.ts +2 -2
  471. package/src/engine/graphics/texture/sampler/Sampler2D.d.ts.map +1 -1
  472. package/src/engine/graphics/texture/sampler/Sampler2D.js +1 -1
  473. package/src/engine/graphics/texture/sampler/distance/computeSignedDistanceField_Chamfer.d.ts.map +1 -1
  474. package/src/engine/graphics/texture/sampler/distance/computeSignedDistanceField_Chamfer.js +26 -18
  475. package/src/engine/graphics/texture/sampler/filter/sampler2d_blur_gaussian.d.ts +15 -2
  476. package/src/engine/graphics/texture/sampler/filter/sampler2d_blur_gaussian.d.ts.map +1 -1
  477. package/src/engine/graphics/texture/sampler/filter/sampler2d_blur_gaussian.js +29 -3
  478. package/src/engine/graphics/texture/sampler/resize/sampler2d_scale_down_lanczos.d.ts +14 -1
  479. package/src/engine/graphics/texture/sampler/resize/sampler2d_scale_down_lanczos.d.ts.map +1 -1
  480. package/src/engine/graphics/texture/sampler/resize/sampler2d_scale_down_lanczos.js +148 -171
  481. package/src/engine/graphics/texture/sampler/sampler2d_combine.d.ts +2 -2
  482. package/src/engine/graphics/texture/sampler/sampler2d_combine.d.ts.map +1 -1
  483. package/src/engine/graphics/texture/sampler/sampler2d_combine.js +1 -1
  484. package/src/engine/graphics/texture/sampler/sampler2d_paint.js +1 -1
  485. package/src/engine/graphics/texture/sampler/util/bitSet2Sampler2D.js +2 -2
  486. package/src/engine/graphics/texture/virtual/VirtualTextureTileLoader.d.ts +1 -1
  487. package/src/engine/graphics/texture/virtual/VirtualTextureTileLoader.js +2 -2
  488. package/src/engine/grid/obstacle/GridObstacle.d.ts +2 -2
  489. package/src/engine/grid/obstacle/GridObstacle.d.ts.map +1 -1
  490. package/src/engine/grid/obstacle/GridObstacle.js +1 -1
  491. package/src/engine/input/ecs/util/TopDownCameraControllerHelper.d.ts.map +1 -1
  492. package/src/engine/input/ecs/util/TopDownCameraControllerHelper.js +10 -3
  493. package/src/engine/intelligence/behavior/ecs/BehaviorComponent.d.ts +2 -2
  494. package/src/engine/intelligence/behavior/ecs/BehaviorComponent.d.ts.map +1 -1
  495. package/src/engine/intelligence/behavior/ecs/BehaviorComponent.js +1 -1
  496. package/src/engine/intelligence/behavior/primitive/ActionBehavior.d.ts +3 -3
  497. package/src/engine/intelligence/behavior/primitive/ActionBehavior.d.ts.map +1 -1
  498. package/src/engine/intelligence/behavior/primitive/ActionBehavior.js +1 -1
  499. package/src/engine/intelligence/behavior/util/RandomDelayBehavior.d.ts +2 -1
  500. package/src/engine/intelligence/behavior/util/RandomDelayBehavior.d.ts.map +1 -1
  501. package/src/engine/intelligence/blackboard/Blackboard.d.ts +4 -4
  502. package/src/engine/intelligence/blackboard/Blackboard.d.ts.map +1 -1
  503. package/src/engine/intelligence/blackboard/Blackboard.js +2 -2
  504. package/src/engine/intelligence/mcts/MonteCarlo.d.ts +17 -15
  505. package/src/engine/intelligence/mcts/MonteCarlo.d.ts.map +1 -1
  506. package/src/engine/intelligence/mcts/MonteCarlo.js +345 -345
  507. package/src/engine/intelligence/mcts/StateNode.d.ts +2 -2
  508. package/src/engine/intelligence/mcts/StateNode.d.ts.map +1 -1
  509. package/src/engine/intelligence/mcts/StateNode.js +364 -364
  510. package/src/engine/intelligence/optimization/RandomOptimizer.d.ts +3 -3
  511. package/src/engine/intelligence/optimization/RandomOptimizer.d.ts.map +1 -1
  512. package/src/engine/intelligence/optimization/RandomOptimizer.js +2 -2
  513. package/src/engine/intelligence/optimization/optimize_cyclic_sequence_pairwise.d.ts +2 -2
  514. package/src/engine/intelligence/optimization/optimize_cyclic_sequence_pairwise.d.ts.map +1 -1
  515. package/src/engine/intelligence/optimization/optimize_cyclic_sequence_pairwise.js +1 -1
  516. package/src/engine/knowledge/database/StaticKnowledgeDataTable.d.ts +4 -5
  517. package/src/engine/knowledge/database/StaticKnowledgeDataTable.d.ts.map +1 -1
  518. package/src/engine/knowledge/database/StaticKnowledgeDataTable.js +2 -2
  519. package/src/engine/navigation/ecs/components/PathSerializationUpgrader_2_3.d.ts +14 -0
  520. package/src/engine/navigation/ecs/components/PathSerializationUpgrader_2_3.d.ts.map +1 -0
  521. package/src/engine/navigation/ecs/components/PathSerializationUpgrader_2_3.js +38 -0
  522. package/src/engine/navigation/ecs/path_following/PathFollowingSystem.d.ts +0 -5
  523. package/src/engine/navigation/ecs/path_following/PathFollowingSystem.d.ts.map +1 -1
  524. package/src/engine/network/orchestrator/ServerAuthoritativeClient.d.ts.map +1 -1
  525. package/src/engine/network/orchestrator/ServerAuthoritativeClient.js +433 -425
  526. package/src/engine/physics/constraint/solve_constraints.d.ts +4 -1
  527. package/src/engine/physics/constraint/solve_constraints.d.ts.map +1 -1
  528. package/src/engine/physics/constraint/solve_constraints.js +38 -13
  529. package/src/engine/physics/contact/ManifoldStore.d.ts +15 -3
  530. package/src/engine/physics/contact/ManifoldStore.d.ts.map +1 -1
  531. package/src/engine/physics/contact/ManifoldStore.js +15 -3
  532. package/src/engine/physics/ecs/Joint.d.ts +7 -4
  533. package/src/engine/physics/ecs/Joint.d.ts.map +1 -1
  534. package/src/engine/physics/ecs/Joint.js +7 -4
  535. package/src/engine/physics/ecs/PhysicsSystem.d.ts +14 -0
  536. package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
  537. package/src/engine/physics/ecs/PhysicsSystem.js +16 -0
  538. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -8
  539. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts.map +1 -1
  540. package/src/engine/physics/fluid/ecs/FluidSystem.d.ts +3 -7
  541. package/src/engine/physics/fluid/ecs/FluidSystem.d.ts.map +1 -1
  542. package/src/engine/physics/narrowphase/convex_convex_manifold.d.ts +15 -7
  543. package/src/engine/physics/narrowphase/convex_convex_manifold.d.ts.map +1 -1
  544. package/src/engine/physics/narrowphase/convex_convex_manifold.js +33 -10
  545. package/src/engine/physics/narrowphase/refine_ray_concave.d.ts +6 -2
  546. package/src/engine/physics/narrowphase/refine_ray_concave.d.ts.map +1 -1
  547. package/src/engine/physics/narrowphase/refine_ray_concave.js +6 -2
  548. package/src/engine/physics/narrowphase/refine_ray_hit.d.ts +6 -2
  549. package/src/engine/physics/narrowphase/refine_ray_hit.d.ts.map +1 -1
  550. package/src/engine/physics/narrowphase/refine_ray_hit.js +6 -2
  551. package/src/engine/physics/queries/raycast.d.ts.map +1 -1
  552. package/src/engine/physics/queries/raycast.js +11 -4
  553. package/src/engine/save/GameStateLoader.d.ts +2 -2
  554. package/src/engine/save/GameStateLoader.d.ts.map +1 -1
  555. package/src/engine/save/GameStateLoader.js +1 -1
  556. package/src/engine/save/Storage.d.ts +4 -4
  557. package/src/engine/save/Storage.d.ts.map +1 -1
  558. package/src/engine/save/Storage.js +2 -2
  559. package/src/engine/save/storage/IndexedDBStorage.d.ts.map +1 -1
  560. package/src/engine/save/storage/IndexedDBStorage.js +24 -5
  561. package/src/engine/simulation/Ticker.d.ts +12 -0
  562. package/src/engine/simulation/Ticker.d.ts.map +1 -1
  563. package/src/engine/simulation/Ticker.js +18 -0
  564. package/src/engine/sound/simulation/AcousticSimulator.d.ts.map +1 -1
  565. package/src/engine/sound/simulation/AcousticSimulator.js +9 -1
  566. package/src/engine/sound/simulation/core/VolumeField.d.ts +6 -2
  567. package/src/engine/sound/simulation/core/VolumeField.d.ts.map +1 -1
  568. package/src/engine/sound/simulation/core/VolumeField.js +6 -2
  569. package/src/engine/sound/simulation/probe/AcousticProbeField.d.ts +6 -2
  570. package/src/engine/sound/simulation/probe/AcousticProbeField.d.ts.map +1 -1
  571. package/src/engine/sound/simulation/probe/AcousticProbeField.js +6 -2
  572. package/src/engine/sound/simulation/probe/acoustic_probe_transfer.d.ts +6 -2
  573. package/src/engine/sound/simulation/probe/acoustic_probe_transfer.d.ts.map +1 -1
  574. package/src/engine/sound/simulation/probe/acoustic_probe_transfer.js +6 -2
  575. package/src/engine/sound/simulation/probe/bakeProbeReflectors.d.ts +3 -1
  576. package/src/engine/sound/simulation/probe/bakeProbeReflectors.d.ts.map +1 -1
  577. package/src/engine/sound/simulation/probe/bakeProbeReflectors.js +3 -1
  578. package/src/engine/sound/simulation/prototypeAcousticSolver.js +1652 -1652
  579. package/src/engine/sound/sopra/util/buildAttenuationCurve.d.ts +2 -2
  580. package/src/engine/sound/sopra/util/buildAttenuationCurve.d.ts.map +1 -1
  581. package/src/engine/sound/sopra/util/buildAttenuationCurve.js +40 -40
  582. package/src/engine/ui/GUIEngine.d.ts.map +1 -1
  583. package/src/engine/ui/GUIEngine.js +8 -1
  584. package/src/engine/ui/notification/NotificationManager.d.ts +5 -5
  585. package/src/engine/ui/notification/NotificationManager.d.ts.map +1 -1
  586. package/src/engine/ui/notification/NotificationManager.js +4 -4
  587. package/src/engine/ui/tiles2d/TileGrid.d.ts +2 -2
  588. package/src/engine/ui/tiles2d/TileGrid.d.ts.map +1 -1
  589. package/src/engine/ui/tiles2d/TileGrid.js +1 -1
  590. package/src/generation/filtering/numeric/complex/CellFilterSimplexNoise.d.ts +1 -1
  591. package/src/generation/filtering/numeric/complex/CellFilterSimplexNoise.js +1 -1
  592. package/src/generation/grid/generation/road/GridTaskGenerateRoads.js +2 -2
  593. package/src/generation/grid/generation/util/buildPathFromDistanceMap.d.ts +1 -1
  594. package/src/generation/grid/generation/util/buildPathFromDistanceMap.js +1 -1
  595. package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorRandomRotation.d.ts +2 -1
  596. package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorRandomRotation.d.ts.map +1 -1
  597. package/src/generation/markers/actions/probability/MarkerNodeActionSelectWeighted.d.ts +2 -1
  598. package/src/generation/markers/actions/probability/MarkerNodeActionSelectWeighted.d.ts.map +1 -1
  599. package/src/generation/markers/transform/MarkerNodeTransformRotateRandom.d.ts +2 -1
  600. package/src/generation/markers/transform/MarkerNodeTransformRotateRandom.d.ts.map +1 -1
  601. package/src/generation/markers/transform/MarkerNodeTransformerRecordPropertyClosure.d.ts +4 -3
  602. package/src/generation/markers/transform/MarkerNodeTransformerRecordPropertyClosure.d.ts.map +1 -1
  603. package/src/generation/markers/transform/MarkerNodeTransformerRecordPropertyClosure.js +1 -1
  604. package/src/generation/markers/transform/MarkerNodeTransformerRecordUniqueRandomEnum.d.ts +2 -1
  605. package/src/generation/markers/transform/MarkerNodeTransformerRecordUniqueRandomEnum.d.ts.map +1 -1
  606. package/src/generation/theme/TerrainTheme.d.ts.map +1 -1
  607. package/src/generation/theme/TerrainTheme.js +2 -1
  608. package/src/generation/theme/ThemeEngine.d.ts.map +1 -1
  609. package/src/generation/theme/ThemeEngine.js +6 -5
  610. package/src/view/ViewGroup.d.ts.map +1 -1
  611. package/src/view/ViewGroup.js +9 -7
  612. package/src/view/common/VirtualListView.d.ts +1 -1
  613. package/src/view/common/VirtualListView.js +1 -1
  614. package/src/view/graphics/WebGLContextFailureView.d.ts +19 -0
  615. package/src/view/graphics/WebGLContextFailureView.d.ts.map +1 -0
  616. package/src/view/graphics/WebGLContextFailureView.js +76 -0
  617. package/src/view/minimap/Minimap.d.ts +8 -0
  618. package/src/view/minimap/Minimap.d.ts.map +1 -1
  619. package/src/view/minimap/Minimap.js +16 -3
  620. package/src/view/minimap/dom/MinimapMarkerView.d.ts.map +1 -1
  621. package/src/view/minimap/dom/MinimapMarkerView.js +3 -1
  622. package/src/view/tooltip/gml/compiler/GMLReferenceCompiler.d.ts +2 -2
  623. package/src/view/tooltip/gml/compiler/GMLReferenceCompiler.d.ts.map +1 -1
  624. package/src/view/tooltip/gml/compiler/GMLReferenceCompiler.js +1 -1
@@ -0,0 +1,599 @@
1
+ import { NULL_POINTER } from "../BinaryTopology.js";
2
+
3
+ /**
4
+ * Which kind of element a defect was found on. Typed constant (no stringly-typed
5
+ * states), mirroring the four pools of {@link BinaryTopology}.
6
+ * @readonly
7
+ */
8
+ export const BT_ELEMENT_TYPE = Object.freeze({
9
+ VERTEX: 0,
10
+ EDGE: 1,
11
+ LOOP: 2,
12
+ FACE: 3,
13
+ });
14
+
15
+ /**
16
+ * Structural defects {@link bt_mesh_validate} can report. Each value names a
17
+ * broken invariant of {@link BinaryTopology}, not a symptom.
18
+ * @readonly
19
+ */
20
+ export const BT_DEFECT = Object.freeze({
21
+ /** A handle points at a pool slot that is not allocated (dangling reference). */
22
+ DANGLING_REFERENCE: 0,
23
+ /** A cycle (disk / radial / face-loop) does not return to its start within the pool's size. */
24
+ CYCLE_NOT_CLOSED: 1,
25
+ /** `prev` is not the inverse of `next` somewhere on a cycle. */
26
+ CYCLE_LINK_ASYMMETRIC: 2,
27
+ /** An edge is missing from the disk cycle of one of its vertices. */
28
+ EDGE_NOT_IN_DISK: 3,
29
+ /** An edge sits on the disk cycle of a vertex that is not one of its endpoints. */
30
+ DISK_EDGE_VERTEX_MISMATCH: 4,
31
+ /** A loop is missing from the radial cycle of the edge it claims. */
32
+ LOOP_NOT_IN_RADIAL: 5,
33
+ /** A loop on an edge's radial cycle does not claim that edge. */
34
+ RADIAL_LOOP_EDGE_MISMATCH: 6,
35
+ /** A loop on a face's loop cycle does not claim that face. */
36
+ FACE_LOOP_FACE_MISMATCH: 7,
37
+ /** A face's loop cycle is shorter than three corners. */
38
+ FACE_TOO_FEW_CORNERS: 8,
39
+ /** The same vertex appears twice on one face's loop cycle. */
40
+ FACE_VERTEX_REPEATED: 9,
41
+ /** A loop's edge does not connect that loop's vertex to the next loop's vertex. */
42
+ LOOP_EDGE_ENDPOINT_MISMATCH: 10,
43
+ /** An allocated loop is not reachable from any allocated face. */
44
+ LOOP_ORPHANED: 11,
45
+ /** A vertex with incident edges has a NULL edge pointer, or vice versa. */
46
+ VERTEX_EDGE_POINTER_INCONSISTENT: 12,
47
+ /** A coordinate or normal component is not finite. */
48
+ NON_FINITE_VALUE: 13,
49
+ });
50
+
51
+ /**
52
+ * Bit set in `edge_seen` once an edge has been reached through its v1 disk slot.
53
+ * @type {number}
54
+ */
55
+ const SEEN_V1 = 1;
56
+ /**
57
+ * Bit set in `edge_seen` once an edge has been reached through its v2 disk slot.
58
+ * @type {number}
59
+ */
60
+ const SEEN_V2 = 2;
61
+
62
+ /**
63
+ * @param {object[]} out
64
+ * @param {number} code one of {@link BT_DEFECT}
65
+ * @param {number} element_type one of {@link BT_ELEMENT_TYPE}
66
+ * @param {number} element
67
+ * @param {string} detail
68
+ */
69
+ function record(out, code, element_type, element, detail) {
70
+ out.push({ code, element_type, element, detail });
71
+ }
72
+
73
+ /**
74
+ * True when `id` is a live slot of `pool`, i.e. safe to dereference.
75
+ * @param {BinaryElementPool} pool
76
+ * @param {number} id
77
+ * @returns {boolean}
78
+ */
79
+ function is_live(pool, id) {
80
+ return id !== NULL_POINTER && id < pool.size && pool.is_allocated(id);
81
+ }
82
+
83
+ /**
84
+ * Check every handle an element stores actually points at a live slot of the
85
+ * right pool. Runs first so the cycle walks below can dereference freely.
86
+ *
87
+ * @param {BinaryTopology} mesh
88
+ * @param {object[]} out
89
+ */
90
+ function check_references(mesh, out) {
91
+ const vertices = mesh.vertices;
92
+ const edges = mesh.edges;
93
+ const loops = mesh.loops;
94
+ const faces = mesh.faces;
95
+
96
+ for (let v = 0; v < vertices.size; v++) {
97
+ if (!vertices.is_allocated(v)) {
98
+ continue;
99
+ }
100
+
101
+ const e = mesh.vertex_read_edge(v);
102
+
103
+ if (e !== NULL_POINTER && !is_live(edges, e)) {
104
+ record(out, BT_DEFECT.DANGLING_REFERENCE, BT_ELEMENT_TYPE.VERTEX, v,
105
+ `vertex ${v} points at edge ${e}, which is not allocated`);
106
+ }
107
+ }
108
+
109
+ for (let e = 0; e < edges.size; e++) {
110
+ if (!edges.is_allocated(e)) {
111
+ continue;
112
+ }
113
+
114
+ const v1 = mesh.edge_read_vertex1(e);
115
+ const v2 = mesh.edge_read_vertex2(e);
116
+
117
+ if (!is_live(vertices, v1)) {
118
+ record(out, BT_DEFECT.DANGLING_REFERENCE, BT_ELEMENT_TYPE.EDGE, e,
119
+ `edge ${e} vertex1 = ${v1}, which is not allocated`);
120
+ }
121
+
122
+ if (!is_live(vertices, v2)) {
123
+ record(out, BT_DEFECT.DANGLING_REFERENCE, BT_ELEMENT_TYPE.EDGE, e,
124
+ `edge ${e} vertex2 = ${v2}, which is not allocated`);
125
+ }
126
+
127
+ const l = mesh.edge_read_loop(e);
128
+
129
+ if (l !== NULL_POINTER && !is_live(loops, l)) {
130
+ record(out, BT_DEFECT.DANGLING_REFERENCE, BT_ELEMENT_TYPE.EDGE, e,
131
+ `edge ${e} points at loop ${l}, which is not allocated`);
132
+ }
133
+ }
134
+
135
+ for (let l = 0; l < loops.size; l++) {
136
+ if (!loops.is_allocated(l)) {
137
+ continue;
138
+ }
139
+
140
+ const v = mesh.loop_read_vertex(l);
141
+ const e = mesh.loop_read_edge(l);
142
+ const f = mesh.loop_read_face(l);
143
+
144
+ if (!is_live(vertices, v)) {
145
+ record(out, BT_DEFECT.DANGLING_REFERENCE, BT_ELEMENT_TYPE.LOOP, l,
146
+ `loop ${l} vertex = ${v}, which is not allocated`);
147
+ }
148
+
149
+ if (!is_live(edges, e)) {
150
+ record(out, BT_DEFECT.DANGLING_REFERENCE, BT_ELEMENT_TYPE.LOOP, l,
151
+ `loop ${l} edge = ${e}, which is not allocated`);
152
+ }
153
+
154
+ if (f !== NULL_POINTER && !is_live(faces, f)) {
155
+ record(out, BT_DEFECT.DANGLING_REFERENCE, BT_ELEMENT_TYPE.LOOP, l,
156
+ `loop ${l} face = ${f}, which is not allocated`);
157
+ }
158
+
159
+ const links = [
160
+ ['radial_next', mesh.loop_read_radial_next(l)],
161
+ ['radial_prev', mesh.loop_read_radial_prev(l)],
162
+ ['next', mesh.loop_read_next(l)],
163
+ ['prev', mesh.loop_read_prev(l)],
164
+ ];
165
+
166
+ for (let i = 0; i < links.length; i++) {
167
+ const name = links[i][0];
168
+ const target = links[i][1];
169
+
170
+ if (!is_live(loops, target)) {
171
+ record(out, BT_DEFECT.DANGLING_REFERENCE, BT_ELEMENT_TYPE.LOOP, l,
172
+ `loop ${l} ${name} = ${target}, which is not allocated`);
173
+ }
174
+ }
175
+ }
176
+
177
+ for (let f = 0; f < faces.size; f++) {
178
+ if (!faces.is_allocated(f)) {
179
+ continue;
180
+ }
181
+
182
+ const l = mesh.face_read_loop(f);
183
+
184
+ if (!is_live(loops, l)) {
185
+ record(out, BT_DEFECT.DANGLING_REFERENCE, BT_ELEMENT_TYPE.FACE, f,
186
+ `face ${f} points at loop ${l}, which is not allocated`);
187
+ }
188
+ }
189
+ }
190
+
191
+ /**
192
+ * Walk every vertex's disk cycle and check it is a closed doubly-linked ring
193
+ * whose members all touch that vertex, then check that every allocated edge was
194
+ * reached through both of its endpoints.
195
+ *
196
+ * Self-loops (`vertex1 === vertex2`) occupy the v1 slot only and their
197
+ * v2_disk_link is unspecified, so they are expected on exactly one side. See the
198
+ * disk cycle convention documented on {@link BinaryTopology}.
199
+ *
200
+ * @param {BinaryTopology} mesh
201
+ * @param {object[]} out
202
+ */
203
+ function check_disk_cycles(mesh, out) {
204
+ const vertices = mesh.vertices;
205
+ const edges = mesh.edges;
206
+
207
+ const edge_seen = new Uint8Array(edges.size);
208
+
209
+ for (let v = 0; v < vertices.size; v++) {
210
+ if (!vertices.is_allocated(v)) {
211
+ continue;
212
+ }
213
+
214
+ const start = mesh.vertex_read_edge(v);
215
+
216
+ if (start === NULL_POINTER || !is_live(edges, start)) {
217
+ continue;
218
+ }
219
+
220
+ let e = start;
221
+ // The cycle cannot legally be longer than the pool, so this bounds a walk over
222
+ // corrupt links without hiding the corruption -- it is reported below.
223
+ let steps = 0;
224
+ let closed = false;
225
+
226
+ do {
227
+ const v1 = mesh.edge_read_vertex1(e);
228
+ const v2 = mesh.edge_read_vertex2(e);
229
+
230
+ const is_v1 = v1 === v;
231
+
232
+ if (!is_v1 && v2 !== v) {
233
+ record(out, BT_DEFECT.DISK_EDGE_VERTEX_MISMATCH, BT_ELEMENT_TYPE.EDGE, e,
234
+ `edge ${e} is on vertex ${v}'s disk cycle but connects ${v1} and ${v2}`);
235
+ break;
236
+ }
237
+
238
+ edge_seen[e] |= is_v1 ? SEEN_V1 : SEEN_V2;
239
+
240
+ const next = is_v1 ? mesh.edge_read_v1_disk_next(e) : mesh.edge_read_v2_disk_next(e);
241
+
242
+ if (!is_live(edges, next)) {
243
+ record(out, BT_DEFECT.CYCLE_NOT_CLOSED, BT_ELEMENT_TYPE.VERTEX, v,
244
+ `vertex ${v} disk cycle leaves the pool at edge ${e} (next = ${next})`);
245
+ break;
246
+ }
247
+
248
+ // prev of next, taken on next's slot for v, must come back to e
249
+ const next_is_v1 = mesh.edge_read_vertex1(next) === v;
250
+ const back = next_is_v1 ? mesh.edge_read_v1_disk_prev(next) : mesh.edge_read_v2_disk_prev(next);
251
+
252
+ if (back !== e) {
253
+ record(out, BT_DEFECT.CYCLE_LINK_ASYMMETRIC, BT_ELEMENT_TYPE.VERTEX, v,
254
+ `vertex ${v} disk cycle: next(${e}) = ${next} but prev(${next}) = ${back}`);
255
+ break;
256
+ }
257
+
258
+ e = next;
259
+ steps++;
260
+
261
+ if (e === start) {
262
+ closed = true;
263
+ break;
264
+ }
265
+ } while (steps <= edges.size);
266
+
267
+ if (!closed && steps > edges.size) {
268
+ record(out, BT_DEFECT.CYCLE_NOT_CLOSED, BT_ELEMENT_TYPE.VERTEX, v,
269
+ `vertex ${v} disk cycle did not return to edge ${start} within ${edges.size} steps`);
270
+ }
271
+ }
272
+
273
+ for (let e = 0; e < edges.size; e++) {
274
+ if (!edges.is_allocated(e)) {
275
+ continue;
276
+ }
277
+
278
+ const v1 = mesh.edge_read_vertex1(e);
279
+ const v2 = mesh.edge_read_vertex2(e);
280
+
281
+ if (!is_live(vertices, v1) || !is_live(vertices, v2)) {
282
+ // already reported by check_references
283
+ continue;
284
+ }
285
+
286
+ if ((edge_seen[e] & SEEN_V1) === 0) {
287
+ record(out, BT_DEFECT.EDGE_NOT_IN_DISK, BT_ELEMENT_TYPE.EDGE, e,
288
+ `edge ${e} is not on the disk cycle of its vertex1 (${v1})`);
289
+ }
290
+
291
+ if (v1 !== v2 && (edge_seen[e] & SEEN_V2) === 0) {
292
+ record(out, BT_DEFECT.EDGE_NOT_IN_DISK, BT_ELEMENT_TYPE.EDGE, e,
293
+ `edge ${e} is not on the disk cycle of its vertex2 (${v2})`);
294
+ }
295
+ }
296
+ }
297
+
298
+ /**
299
+ * Walk every edge's radial cycle and check it is a closed doubly-linked ring of
300
+ * loops that all claim that edge, then check every allocated loop was reached
301
+ * through the edge it claims.
302
+ *
303
+ * @param {BinaryTopology} mesh
304
+ * @param {object[]} out
305
+ */
306
+ function check_radial_cycles(mesh, out) {
307
+ const edges = mesh.edges;
308
+ const loops = mesh.loops;
309
+
310
+ const loop_seen = new Uint8Array(loops.size);
311
+
312
+ for (let e = 0; e < edges.size; e++) {
313
+ if (!edges.is_allocated(e)) {
314
+ continue;
315
+ }
316
+
317
+ const start = mesh.edge_read_loop(e);
318
+
319
+ if (start === NULL_POINTER || !is_live(loops, start)) {
320
+ continue;
321
+ }
322
+
323
+ let l = start;
324
+ let steps = 0;
325
+ let closed = false;
326
+
327
+ do {
328
+ if (mesh.loop_read_edge(l) !== e) {
329
+ record(out, BT_DEFECT.RADIAL_LOOP_EDGE_MISMATCH, BT_ELEMENT_TYPE.LOOP, l,
330
+ `loop ${l} is on edge ${e}'s radial cycle but claims edge ${mesh.loop_read_edge(l)}`);
331
+ break;
332
+ }
333
+
334
+ loop_seen[l] = 1;
335
+
336
+ const next = mesh.loop_read_radial_next(l);
337
+
338
+ if (!is_live(loops, next)) {
339
+ record(out, BT_DEFECT.CYCLE_NOT_CLOSED, BT_ELEMENT_TYPE.EDGE, e,
340
+ `edge ${e} radial cycle leaves the pool at loop ${l} (radial_next = ${next})`);
341
+ break;
342
+ }
343
+
344
+ const back = mesh.loop_read_radial_prev(next);
345
+
346
+ if (back !== l) {
347
+ record(out, BT_DEFECT.CYCLE_LINK_ASYMMETRIC, BT_ELEMENT_TYPE.EDGE, e,
348
+ `edge ${e} radial cycle: radial_next(${l}) = ${next} but radial_prev(${next}) = ${back}`);
349
+ break;
350
+ }
351
+
352
+ l = next;
353
+ steps++;
354
+
355
+ if (l === start) {
356
+ closed = true;
357
+ break;
358
+ }
359
+ } while (steps <= loops.size);
360
+
361
+ if (!closed && steps > loops.size) {
362
+ record(out, BT_DEFECT.CYCLE_NOT_CLOSED, BT_ELEMENT_TYPE.EDGE, e,
363
+ `edge ${e} radial cycle did not return to loop ${start} within ${loops.size} steps`);
364
+ }
365
+ }
366
+
367
+ for (let l = 0; l < loops.size; l++) {
368
+ if (!loops.is_allocated(l)) {
369
+ continue;
370
+ }
371
+
372
+ const e = mesh.loop_read_edge(l);
373
+
374
+ if (!is_live(edges, e)) {
375
+ // already reported by check_references
376
+ continue;
377
+ }
378
+
379
+ if (loop_seen[l] === 0) {
380
+ record(out, BT_DEFECT.LOOP_NOT_IN_RADIAL, BT_ELEMENT_TYPE.LOOP, l,
381
+ `loop ${l} claims edge ${e} but is not on that edge's radial cycle`);
382
+ }
383
+ }
384
+ }
385
+
386
+ /**
387
+ * Walk every face's loop cycle. Checks closure, `prev`/`next` symmetry, that
388
+ * every corner claims the face, that the face has at least three corners with no
389
+ * repeated vertex, and that each corner's edge spans that corner's vertex and the
390
+ * next corner's vertex. Finally reports allocated loops no face can reach.
391
+ *
392
+ * @param {BinaryTopology} mesh
393
+ * @param {object[]} out
394
+ */
395
+ function check_face_cycles(mesh, out) {
396
+ const loops = mesh.loops;
397
+ const faces = mesh.faces;
398
+
399
+ const loop_seen = new Uint8Array(loops.size);
400
+
401
+ // Reused across faces so a fan of small faces does not allocate per face.
402
+ const cycle_vertices = [];
403
+
404
+ for (let f = 0; f < faces.size; f++) {
405
+ if (!faces.is_allocated(f)) {
406
+ continue;
407
+ }
408
+
409
+ const start = mesh.face_read_loop(f);
410
+
411
+ if (!is_live(loops, start)) {
412
+ continue;
413
+ }
414
+
415
+ cycle_vertices.length = 0;
416
+
417
+ let l = start;
418
+ let steps = 0;
419
+ let closed = false;
420
+ let broken = false;
421
+
422
+ do {
423
+ if (mesh.loop_read_face(l) !== f) {
424
+ record(out, BT_DEFECT.FACE_LOOP_FACE_MISMATCH, BT_ELEMENT_TYPE.LOOP, l,
425
+ `loop ${l} is on face ${f}'s loop cycle but claims face ${mesh.loop_read_face(l)}`);
426
+ broken = true;
427
+ break;
428
+ }
429
+
430
+ loop_seen[l] = 1;
431
+ cycle_vertices.push(mesh.loop_read_vertex(l));
432
+
433
+ const next = mesh.loop_read_next(l);
434
+
435
+ if (!is_live(loops, next)) {
436
+ record(out, BT_DEFECT.CYCLE_NOT_CLOSED, BT_ELEMENT_TYPE.FACE, f,
437
+ `face ${f} loop cycle leaves the pool at loop ${l} (next = ${next})`);
438
+ broken = true;
439
+ break;
440
+ }
441
+
442
+ const back = mesh.loop_read_prev(next);
443
+
444
+ if (back !== l) {
445
+ record(out, BT_DEFECT.CYCLE_LINK_ASYMMETRIC, BT_ELEMENT_TYPE.FACE, f,
446
+ `face ${f} loop cycle: next(${l}) = ${next} but prev(${next}) = ${back}`);
447
+ broken = true;
448
+ break;
449
+ }
450
+
451
+ // the corner's edge must span this corner and the next one
452
+ const e = mesh.loop_read_edge(l);
453
+ const v_here = mesh.loop_read_vertex(l);
454
+ const v_next = mesh.loop_read_vertex(next);
455
+
456
+ if (is_live(mesh.edges, e)) {
457
+ const e1 = mesh.edge_read_vertex1(e);
458
+ const e2 = mesh.edge_read_vertex2(e);
459
+
460
+ const spans = (e1 === v_here && e2 === v_next) || (e1 === v_next && e2 === v_here);
461
+
462
+ if (!spans) {
463
+ record(out, BT_DEFECT.LOOP_EDGE_ENDPOINT_MISMATCH, BT_ELEMENT_TYPE.LOOP, l,
464
+ `loop ${l} spans vertices ${v_here}->${v_next} but its edge ${e} connects ${e1} and ${e2}`);
465
+ }
466
+ }
467
+
468
+ l = next;
469
+ steps++;
470
+
471
+ if (l === start) {
472
+ closed = true;
473
+ break;
474
+ }
475
+ } while (steps <= loops.size);
476
+
477
+ if (!closed && !broken) {
478
+ record(out, BT_DEFECT.CYCLE_NOT_CLOSED, BT_ELEMENT_TYPE.FACE, f,
479
+ `face ${f} loop cycle did not return to loop ${start} within ${loops.size} steps`);
480
+ continue;
481
+ }
482
+
483
+ if (broken) {
484
+ continue;
485
+ }
486
+
487
+ if (cycle_vertices.length < 3) {
488
+ record(out, BT_DEFECT.FACE_TOO_FEW_CORNERS, BT_ELEMENT_TYPE.FACE, f,
489
+ `face ${f} has ${cycle_vertices.length} corner(s)`);
490
+ }
491
+
492
+ for (let i = 0; i < cycle_vertices.length; i++) {
493
+ for (let j = i + 1; j < cycle_vertices.length; j++) {
494
+ if (cycle_vertices[i] === cycle_vertices[j]) {
495
+ record(out, BT_DEFECT.FACE_VERTEX_REPEATED, BT_ELEMENT_TYPE.FACE, f,
496
+ `face ${f} visits vertex ${cycle_vertices[i]} at corners ${i} and ${j}`);
497
+ }
498
+ }
499
+ }
500
+ }
501
+
502
+ for (let l = 0; l < loops.size; l++) {
503
+ if (!loops.is_allocated(l)) {
504
+ continue;
505
+ }
506
+
507
+ if (loop_seen[l] === 0) {
508
+ record(out, BT_DEFECT.LOOP_ORPHANED, BT_ELEMENT_TYPE.LOOP, l,
509
+ `loop ${l} is allocated but no face's loop cycle reaches it`);
510
+ }
511
+ }
512
+ }
513
+
514
+ /**
515
+ * Vertex coordinates and normals, and face normals, must be finite. A NaN here
516
+ * survives every topological check and only surfaces much later as an empty
517
+ * bounding box or a black triangle.
518
+ *
519
+ * @param {BinaryTopology} mesh
520
+ * @param {object[]} out
521
+ */
522
+ function check_finite_values(mesh, out) {
523
+ const vertices = mesh.vertices;
524
+ const faces = mesh.faces;
525
+
526
+ const scratch = new Float32Array(3);
527
+
528
+ for (let v = 0; v < vertices.size; v++) {
529
+ if (!vertices.is_allocated(v)) {
530
+ continue;
531
+ }
532
+
533
+ mesh.vertex_read_coordinate(scratch, 0, v);
534
+
535
+ if (!Number.isFinite(scratch[0]) || !Number.isFinite(scratch[1]) || !Number.isFinite(scratch[2])) {
536
+ record(out, BT_DEFECT.NON_FINITE_VALUE, BT_ELEMENT_TYPE.VERTEX, v,
537
+ `vertex ${v} coordinate is (${scratch[0]}, ${scratch[1]}, ${scratch[2]})`);
538
+ }
539
+ }
540
+
541
+ for (let f = 0; f < faces.size; f++) {
542
+ if (!faces.is_allocated(f)) {
543
+ continue;
544
+ }
545
+
546
+ mesh.face_read_normal(scratch, 0, f);
547
+
548
+ if (!Number.isFinite(scratch[0]) || !Number.isFinite(scratch[1]) || !Number.isFinite(scratch[2])) {
549
+ record(out, BT_DEFECT.NON_FINITE_VALUE, BT_ELEMENT_TYPE.FACE, f,
550
+ `face ${f} normal is (${scratch[0]}, ${scratch[1]}, ${scratch[2]})`);
551
+ }
552
+ }
553
+ }
554
+
555
+ /**
556
+ * Check every structural invariant of a {@link BinaryTopology} and return the
557
+ * defects found. An empty result means the mesh is internally consistent: every
558
+ * handle resolves, every disk / radial / face-loop cycle is a closed
559
+ * doubly-linked ring, every element agrees with the elements that reference it,
560
+ * and every stored coordinate is finite.
561
+ *
562
+ * This is the counterpart to manifold's `IsManifold()` -- the invariant checker
563
+ * that makes a pile of topology-surgery primitives trustworthy. `BinaryTopology`
564
+ * has ~40 mutators (`bt_edge_collapse`, `bt_vert_splice`, `bt_radial_loop_remove`,
565
+ * `bt_face_poke`, ...), each of which can scribble a cycle; without this, nothing
566
+ * notices until a much later operation reads garbage. Run it in specs after any
567
+ * mutation, and in prototypes after any pipeline stage.
568
+ *
569
+ * What it deliberately does NOT check, because `BinaryTopology` permits all of
570
+ * them by design: wire edges (no incident face), boundary edges (one face),
571
+ * non-manifold edges (three or more faces), n-gon faces, disconnected islands.
572
+ * For those, see {@link bt_mesh_is_manifold} and {@link bt_mesh_is_closed}.
573
+ *
574
+ * O(V + E + L + F) except for the repeated-vertex check, which is quadratic in a
575
+ * single face's corner count (faces are small; a 1000-gon would be the anomaly,
576
+ * not the cost).
577
+ *
578
+ * Cycle walks are bounded by the corresponding pool's size. That bound is the
579
+ * theoretical maximum of a legal cycle, so hitting it is itself a defect and is
580
+ * reported as {@link BT_DEFECT.CYCLE_NOT_CLOSED} rather than swallowed.
581
+ *
582
+ * @param {BinaryTopology} mesh
583
+ * @returns {{code:number, element_type:number, element:number, detail:string}[]}
584
+ * defects found, in discovery order; empty when the mesh is consistent
585
+ *
586
+ * @author Alex Goldring
587
+ * @copyright Company Named Limited (c) 2026
588
+ */
589
+ export function bt_mesh_validate(mesh) {
590
+ const out = [];
591
+
592
+ check_references(mesh, out);
593
+ check_disk_cycles(mesh, out);
594
+ check_radial_cycles(mesh, out);
595
+ check_face_cycles(mesh, out);
596
+ check_finite_values(mesh, out);
597
+
598
+ return out;
599
+ }
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  *
3
3
  * @param {TopoTriangle[]} initial_set indices of triangles that make up initial set, these are triangles that we start from, they will also be included in the resulting set
4
- * @param {function(tri:TopoTriangle, prev:TopoTriangle):boolean} filter decides whether a triangle should be included or not
4
+ * @param {(tri: TopoTriangle, prev: TopoTriangle) => boolean} filter decides whether a triangle should be included or not
5
5
  * @returns {TopoTriangle[]} set of selected triangles, will include initial set as well
6
6
  */
7
7
  export function mesh_flood_fill({ initial_set, filter }: TopoTriangle[]): TopoTriangle[];
@@ -9,7 +9,7 @@ const neighbours = [];
9
9
  /**
10
10
  *
11
11
  * @param {TopoTriangle[]} initial_set indices of triangles that make up initial set, these are triangles that we start from, they will also be included in the resulting set
12
- * @param {function(tri:TopoTriangle, prev:TopoTriangle):boolean} filter decides whether a triangle should be included or not
12
+ * @param {(tri: TopoTriangle, prev: TopoTriangle) => boolean} filter decides whether a triangle should be included or not
13
13
  * @returns {TopoTriangle[]} set of selected triangles, will include initial set as well
14
14
  */
15
15
  export function mesh_flood_fill({
@@ -1,6 +1,38 @@
1
1
  /**
2
2
  * Compute signed volume of a tetrahedron with the last point at the origin
3
3
  * Triangle is defined by points A,B,C
4
+ *
5
+ * Evaluated as `p · ((q - p) × (r - p))` where `(p, q, r)` is the cyclic
6
+ * rotation of `(a, b, c)` that puts the vertex nearest the origin first. Both
7
+ * steps are exact rewrites of `a · (b × c)`: a cyclic rotation leaves a 3×3
8
+ * determinant unchanged, and the two extra terms the edge form introduces,
9
+ * `p · (q × p)` and `p · (p × r)`, are identically zero.
10
+ *
11
+ * The rotation is not cosmetic — the two forms fail in opposite regimes, and
12
+ * picking the apex is what makes the result well conditioned in both. The
13
+ * error behaves like `eps · |p| · |q - p| · |r - p|`:
14
+ *
15
+ * - the expanded determinant of absolute coordinates loses everything for a
16
+ * SMALL triangle FAR from the origin. Summed over a unit cube translated to
17
+ * (1e6, 1e6, 1e6) it returned 256, and −262144 at 1e7;
18
+ * - anchoring unconditionally on `a` instead loses everything for a LARGE
19
+ * triangle reaching IN toward the origin, where `|b - a|` and `|c - a|` are
20
+ * both as large as `|a|`. `(1e8, 1e8, 1e8), (1, 0, 0), (0, 1, 0)` returned
21
+ * 0 for a true volume of 16666666.67, and flipped the sign of a needle
22
+ * tetrahedron often enough to break callers using this as an orientation
23
+ * predicate.
24
+ *
25
+ * Anchoring on the vertex nearest the origin is exact in both, and measured at
26
+ * a worst relative error of 8e-13 over 400k triangles with each vertex drawn
27
+ * from an independent magnitude decade up to 1e9.
28
+ *
29
+ * Distance is compared by largest absolute component rather than by squared
30
+ * length, which is cheaper and cannot overflow for coordinates above ~1e154.
31
+ *
32
+ * A caller summing over a whole mesh should still subtract a reference point,
33
+ * as {@link tri3_mesh_compute_signed_volume} does: this conditions each term,
34
+ * but only the caller can stop the terms themselves from being enormous.
35
+ *
4
36
  * @see "EFFICIENT FEATURE EXTRACTION FOR 2D/3D OBJECTS IN MESH REPRESENTATION" by Cha Zhang and Tsuhan Chen
5
37
  * @param {number} ax
6
38
  * @param {number} ay
@@ -1 +1 @@
1
- {"version":3,"file":"tri3_compute_signed_volume.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/triangle/tri3_compute_signed_volume.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;GAcG;AACH,+CAXW,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,GACL,MAAM,CAiBjB"}
1
+ {"version":3,"file":"tri3_compute_signed_volume.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/triangle/tri3_compute_signed_volume.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,+CAXW,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,GACL,MAAM,CA4CjB"}