@woosh/meep-engine 2.168.0 → 2.169.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 (295) hide show
  1. package/README.md +2 -2
  2. package/build/bundle-worker-image-decoder.js +1 -1
  3. package/package.json +1 -1
  4. package/src/REVIEW_2026_08_06/adv-core.md +511 -0
  5. package/src/REVIEW_2026_08_06/adv-gfx.md +480 -0
  6. package/src/REVIEW_2026_08_06/adv-view.md +446 -0
  7. package/src/REVIEW_2026_08_06/api-core.md +296 -0
  8. package/src/REVIEW_2026_08_06/api-engine.md +195 -0
  9. package/src/REVIEW_2026_08_06/bvh-phys-sound-net.md +507 -0
  10. package/src/REVIEW_2026_08_06/core-binary.md +348 -0
  11. package/src/REVIEW_2026_08_06/core-collection.md +376 -0
  12. package/src/REVIEW_2026_08_06/core-math.md +221 -0
  13. package/src/REVIEW_2026_08_06/core-process.md +266 -0
  14. package/src/REVIEW_2026_08_06/core-science.md +223 -0
  15. package/src/REVIEW_2026_08_06/engine-ai-nav.md +279 -0
  16. package/src/REVIEW_2026_08_06/engine-animation.md +167 -0
  17. package/src/REVIEW_2026_08_06/engine-asset.md +166 -0
  18. package/src/REVIEW_2026_08_06/engine-ecs.md +920 -0
  19. package/src/REVIEW_2026_08_06/engine-input.md +197 -0
  20. package/src/REVIEW_2026_08_06/engine-misc.md +248 -0
  21. package/src/REVIEW_2026_08_06/engine-terrain.md +52 -0
  22. package/src/REVIEW_2026_08_06/generation.md +176 -0
  23. package/src/REVIEW_2026_08_06/geom-2d.md +434 -0
  24. package/src/REVIEW_2026_08_06/geom-3d.md +117 -0
  25. package/src/REVIEW_2026_08_06/gfx-gi.md +143 -0
  26. package/src/REVIEW_2026_08_06/gfx-render.md +740 -0
  27. package/src/REVIEW_2026_08_06/gfx-texture.md +690 -0
  28. package/src/REVIEW_2026_08_06/prior-criticals.md +49 -0
  29. package/src/REVIEW_2026_08_06/prior-highs.md +138 -0
  30. package/src/REVIEW_2026_08_06/test-gaps.md +364 -0
  31. package/src/REVIEW_2026_08_06/view.md +667 -0
  32. package/src/REVIEW_2026_08_06.md +571 -0
  33. package/src/core/binary/BinaryBuffer.d.ts.map +1 -1
  34. package/src/core/binary/BinaryBuffer.js +12 -1
  35. package/src/core/binary/BitImage2.d.ts +5 -1
  36. package/src/core/binary/BitImage2.d.ts.map +1 -1
  37. package/src/core/binary/BitImage2.js +5 -1
  38. package/src/core/bvh8/build/NodeProxy.d.ts.map +1 -1
  39. package/src/core/bvh8/build/NodeProxy.js +314 -308
  40. package/src/core/collection/list/List.d.ts +15 -0
  41. package/src/core/collection/list/List.d.ts.map +1 -1
  42. package/src/core/collection/list/List.js +34 -0
  43. package/src/core/collection/list/SortedListProjection.d.ts.map +1 -1
  44. package/src/core/collection/list/SortedListProjection.js +4 -1
  45. package/src/core/collection/map/BiMap.d.ts +25 -2
  46. package/src/core/collection/map/BiMap.d.ts.map +1 -1
  47. package/src/core/collection/map/BiMap.js +57 -3
  48. package/src/core/debug/matchers/IsAnything.d.ts.map +1 -1
  49. package/src/core/debug/matchers/IsAnything.js +5 -1
  50. package/src/core/events/signal/Signal.d.ts.map +1 -1
  51. package/src/core/events/signal/Signal.js +3 -1
  52. package/src/core/geom/2d/polygon/TRIANGULATION_DESIGN.md +433 -0
  53. package/src/core/geom/2d/polygon/polygon2_is_counter_clockwise.d.ts +31 -0
  54. package/src/core/geom/2d/polygon/polygon2_is_counter_clockwise.d.ts.map +1 -0
  55. package/src/core/geom/2d/polygon/polygon2_is_counter_clockwise.js +84 -0
  56. package/src/core/geom/2d/polygon/polygon2_signed_area.d.ts +24 -2
  57. package/src/core/geom/2d/polygon/polygon2_signed_area.d.ts.map +1 -1
  58. package/src/core/geom/2d/polygon/polygon2_signed_area.js +52 -34
  59. package/src/core/geom/2d/polygon/polygon2_triangulate.corpus.d.ts +28 -0
  60. package/src/core/geom/2d/polygon/polygon2_triangulate.corpus.d.ts.map +1 -0
  61. package/src/core/geom/2d/polygon/polygon2_triangulate.corpus.js +86 -0
  62. package/src/core/geom/2d/polygon/polygon2_triangulate.d.ts +40 -0
  63. package/src/core/geom/2d/polygon/polygon2_triangulate.d.ts.map +1 -0
  64. package/src/core/geom/2d/polygon/polygon2_triangulate.js +1280 -0
  65. package/src/core/geom/2d/polygon/polygon2_triangulation_deviation.d.ts +28 -0
  66. package/src/core/geom/2d/polygon/polygon2_triangulation_deviation.d.ts.map +1 -0
  67. package/src/core/geom/2d/polygon/polygon2_triangulation_deviation.js +77 -0
  68. package/src/core/geom/2d/triangle/tri2_rasterize_conservative.d.ts +6 -3
  69. package/src/core/geom/2d/triangle/tri2_rasterize_conservative.d.ts.map +1 -1
  70. package/src/core/geom/2d/triangle/tri2_rasterize_conservative.js +26 -13
  71. package/src/core/geom/2d/triangle/tri2_signed_area.d.ts +17 -1
  72. package/src/core/geom/2d/triangle/tri2_signed_area.d.ts.map +1 -1
  73. package/src/core/geom/2d/triangle/tri2_signed_area.js +35 -23
  74. package/src/core/geom/2d/v2_morton_encode.d.ts +20 -0
  75. package/src/core/geom/2d/v2_morton_encode.d.ts.map +1 -0
  76. package/src/core/geom/2d/v2_morton_encode.js +23 -0
  77. package/src/core/geom/3d/atlas/segment/atlas_merge_charts.d.ts.map +1 -1
  78. package/src/core/geom/3d/atlas/segment/atlas_merge_charts.js +4 -1
  79. package/src/core/geom/3d/polygon/polygon3_compute_normal.d.ts +27 -0
  80. package/src/core/geom/3d/polygon/polygon3_compute_normal.d.ts.map +1 -0
  81. package/src/core/geom/3d/polygon/polygon3_compute_normal.js +60 -0
  82. package/src/core/geom/3d/polygon/polygon3_triangulate.d.ts +34 -0
  83. package/src/core/geom/3d/polygon/polygon3_triangulate.d.ts.map +1 -0
  84. package/src/core/geom/3d/polygon/polygon3_triangulate.js +94 -0
  85. package/src/core/geom/3d/quaternion/quat3_multiply.d.ts +8 -2
  86. package/src/core/geom/3d/quaternion/quat3_multiply.d.ts.map +1 -1
  87. package/src/core/geom/3d/quaternion/quat3_multiply.js +8 -2
  88. package/src/core/geom/3d/shape/ConvexHullShape3D.d.ts.map +1 -1
  89. package/src/core/geom/3d/shape/ConvexHullShape3D.js +32 -2
  90. package/src/core/geom/3d/topology/struct/binary/io/face/bt_face_triangulate.d.ts +23 -6
  91. package/src/core/geom/3d/topology/struct/binary/io/face/bt_face_triangulate.d.ts.map +1 -1
  92. package/src/core/geom/3d/topology/struct/binary/io/face/bt_face_triangulate.js +268 -124
  93. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_assert_valid.d.ts +17 -0
  94. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_assert_valid.d.ts.map +1 -0
  95. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_assert_valid.js +44 -0
  96. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_count_edge_faces.d.ts +20 -0
  97. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_count_edge_faces.d.ts.map +1 -0
  98. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_count_edge_faces.js +40 -0
  99. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_is_closed.d.ts +19 -0
  100. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_is_closed.d.ts.map +1 -0
  101. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_is_closed.js +34 -0
  102. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_is_manifold.d.ts +22 -0
  103. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_is_manifold.d.ts.map +1 -0
  104. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_is_manifold.js +37 -0
  105. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_validate.d.ts +87 -0
  106. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_validate.d.ts.map +1 -0
  107. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_validate.js +599 -0
  108. package/src/core/geom/3d/triangle/tri3_compute_signed_volume.d.ts +32 -0
  109. package/src/core/geom/3d/triangle/tri3_compute_signed_volume.d.ts.map +1 -1
  110. package/src/core/geom/3d/triangle/tri3_compute_signed_volume.js +66 -7
  111. package/src/core/geom/3d/triangle/tri3_mesh_compute_signed_volume.d.ts +22 -1
  112. package/src/core/geom/3d/triangle/tri3_mesh_compute_signed_volume.d.ts.map +1 -1
  113. package/src/core/geom/3d/triangle/tri3_mesh_compute_signed_volume.js +83 -38
  114. package/src/core/geom/MANIFOLD_COMPARISON_2026_08_01.md +554 -0
  115. package/src/core/geom/vec3/v3_cotangent.d.ts +6 -2
  116. package/src/core/geom/vec3/v3_cotangent.d.ts.map +1 -1
  117. package/src/core/geom/vec3/v3_cotangent.js +6 -2
  118. package/src/core/geom/vec3/v3_cross.d.ts +6 -2
  119. package/src/core/geom/vec3/v3_cross.d.ts.map +1 -1
  120. package/src/core/geom/vec3/v3_cross.js +6 -2
  121. package/src/core/geom/vec3/v3_multiply.d.ts +6 -2
  122. package/src/core/geom/vec3/v3_multiply.d.ts.map +1 -1
  123. package/src/core/geom/vec3/v3_multiply.js +6 -2
  124. package/src/core/geom/vec3/v3_subtract.d.ts +6 -2
  125. package/src/core/geom/vec3/v3_subtract.d.ts.map +1 -1
  126. package/src/core/geom/vec3/v3_subtract.js +6 -2
  127. package/src/core/localization/Localization.js +1 -1
  128. package/src/core/math/random/randomSeed.d.ts +13 -0
  129. package/src/core/math/random/randomSeed.d.ts.map +1 -0
  130. package/src/core/math/random/randomSeed.js +16 -0
  131. package/src/core/math/spline/spline3_hermite_apply_transform.d.ts +50 -0
  132. package/src/core/math/spline/spline3_hermite_apply_transform.d.ts.map +1 -0
  133. package/src/core/math/spline/spline3_hermite_apply_transform.js +107 -0
  134. package/src/core/math/spline/spline3_hermite_reverse.d.ts +34 -0
  135. package/src/core/math/spline/spline3_hermite_reverse.d.ts.map +1 -0
  136. package/src/core/math/spline/spline3_hermite_reverse.js +49 -0
  137. package/src/core/math/statistics/hammersley_sequence.d.ts +17 -4
  138. package/src/core/math/statistics/hammersley_sequence.d.ts.map +1 -1
  139. package/src/core/math/statistics/hammersley_sequence.js +25 -16
  140. package/src/core/process/Future.d.ts.map +1 -1
  141. package/src/core/process/Future.js +12 -0
  142. package/src/core/process/PromiseWatcher.d.ts.map +1 -1
  143. package/src/core/process/PromiseWatcher.js +9 -2
  144. package/src/core/process/executor/ConcurrentExecutor.d.ts.map +1 -1
  145. package/src/core/process/executor/ConcurrentExecutor.js +12 -2
  146. package/src/core/process/worker/WorkerProxy.d.ts.map +1 -1
  147. package/src/core/process/worker/WorkerProxy.js +5 -2
  148. package/src/core/process/worker/extractTransferables.d.ts.map +1 -1
  149. package/src/core/process/worker/extractTransferables.js +4 -1
  150. package/src/engine/Engine.d.ts +12 -12
  151. package/src/engine/Engine.d.ts.map +1 -1
  152. package/src/engine/Engine.js +149 -10
  153. package/src/engine/EngineHarness.d.ts.map +1 -1
  154. package/src/engine/EngineHarness.js +4 -1
  155. package/src/engine/asset/loaders/ArrayBufferLoader.d.ts.map +1 -1
  156. package/src/engine/asset/loaders/ArrayBufferLoader.js +7 -0
  157. package/src/engine/ecs/speaker/lines/sets/LineSetDescription.d.ts.map +1 -1
  158. package/src/engine/ecs/speaker/lines/sets/LineSetDescription.js +3 -1
  159. package/src/engine/ecs/terrain/ecs/TerrainSystem.d.ts.map +1 -1
  160. package/src/engine/ecs/terrain/ecs/TerrainSystem.js +4 -1
  161. package/src/engine/ecs/terrain/tiles/TerrainTileManager.d.ts +29 -0
  162. package/src/engine/ecs/terrain/tiles/TerrainTileManager.d.ts.map +1 -1
  163. package/src/engine/ecs/terrain/tiles/TerrainTileManager.js +84 -23
  164. package/src/engine/graphics/CONTEXT_LOSS_RECOVERY_PLAN.md +446 -0
  165. package/src/engine/graphics/GraphicsEngine.d.ts +56 -7
  166. package/src/engine/graphics/GraphicsEngine.d.ts.map +1 -1
  167. package/src/engine/graphics/GraphicsEngine.js +196 -24
  168. package/src/engine/graphics/context/WebGLContextFailureReason.d.ts +9 -0
  169. package/src/engine/graphics/context/WebGLContextFailureReason.d.ts.map +1 -0
  170. package/src/engine/graphics/context/WebGLContextFailureReason.js +17 -0
  171. package/src/engine/graphics/context/WebGLContextMonitor.d.ts +106 -0
  172. package/src/engine/graphics/context/WebGLContextMonitor.d.ts.map +1 -0
  173. package/src/engine/graphics/context/WebGLContextMonitor.js +341 -0
  174. package/src/engine/graphics/context/WebGLContextState.d.ts +14 -0
  175. package/src/engine/graphics/context/WebGLContextState.d.ts.map +1 -0
  176. package/src/engine/graphics/context/WebGLContextState.js +24 -0
  177. package/src/engine/graphics/context/testWebGLContextLoss.d.ts +2 -0
  178. package/src/engine/graphics/context/testWebGLContextLoss.d.ts.map +1 -0
  179. package/src/engine/graphics/context/testWebGLContextLoss.js +696 -0
  180. package/src/engine/graphics/ecs/camera/serialization/CameraSerializationAdapter.d.ts.map +1 -1
  181. package/src/engine/graphics/ecs/camera/serialization/CameraSerializationAdapter.js +68 -32
  182. package/src/engine/graphics/ecs/camera/serialization/CameraSerializationUpgrader_0_1.d.ts +14 -0
  183. package/src/engine/graphics/ecs/camera/serialization/CameraSerializationUpgrader_0_1.d.ts.map +1 -0
  184. package/src/engine/graphics/ecs/camera/serialization/CameraSerializationUpgrader_0_1.js +41 -0
  185. package/src/engine/graphics/ecs/decal/v2/FPDecalSystem.js +1 -1
  186. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometrySystem.d.ts.map +1 -1
  187. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometrySystem.js +5 -0
  188. package/src/engine/graphics/ecs/trail2d/Trail2D.d.ts +5 -1
  189. package/src/engine/graphics/ecs/trail2d/Trail2D.d.ts.map +1 -1
  190. package/src/engine/graphics/ecs/trail2d/Trail2D.js +15 -0
  191. package/src/engine/graphics/ecs/trail2d/Trail2DSystem.d.ts +1 -1
  192. package/src/engine/graphics/ecs/trail2d/Trail2DSystem.d.ts.map +1 -1
  193. package/src/engine/graphics/ecs/trail2d/Trail2DSystem.js +2 -1
  194. package/src/engine/graphics/ecs/trail3d/Trail3D.d.ts +4 -1
  195. package/src/engine/graphics/ecs/trail3d/Trail3D.d.ts.map +1 -1
  196. package/src/engine/graphics/ecs/trail3d/Trail3D.js +488 -476
  197. package/src/engine/graphics/ecs/trail3d/Trail3DSystem.d.ts +1 -1
  198. package/src/engine/graphics/ecs/trail3d/Trail3DSystem.d.ts.map +1 -1
  199. package/src/engine/graphics/ecs/trail3d/Trail3DSystem.js +280 -253
  200. package/src/engine/graphics/geometry/MikkT/BuildNeighborsFast.d.ts.map +1 -1
  201. package/src/engine/graphics/geometry/MikkT/BuildNeighborsFast.js +3 -2
  202. package/src/engine/graphics/geometry/MikkT/GenerateSharedVerticesIndexList.d.ts.map +1 -1
  203. package/src/engine/graphics/geometry/MikkT/GenerateSharedVerticesIndexList.js +3 -1
  204. package/src/engine/graphics/geometry/computeMeshSurfaceArea.js +1 -1
  205. package/src/engine/graphics/load_and_set_cubemap_v0.d.ts +5 -0
  206. package/src/engine/graphics/load_and_set_cubemap_v0.d.ts.map +1 -1
  207. package/src/engine/graphics/load_and_set_cubemap_v0.js +26 -21
  208. package/src/engine/graphics/particles/particular/group/ParticleGroup.d.ts.map +1 -1
  209. package/src/engine/graphics/particles/particular/group/ParticleGroup.js +19 -8
  210. package/src/engine/graphics/particles/particular/group/optimizeCommandQueue.js +1 -1
  211. package/src/engine/graphics/texture/atlas/AtlasLookupTexture.d.ts.map +1 -1
  212. package/src/engine/graphics/texture/atlas/AtlasLookupTexture.js +10 -3
  213. package/src/engine/graphics/texture/atlas/TextureAtlas.d.ts.map +1 -1
  214. package/src/engine/graphics/texture/atlas/TextureAtlas.js +4 -1
  215. package/src/engine/graphics/texture/atlas/gpu/WebGLTextureAtlas.d.ts.map +1 -1
  216. package/src/engine/graphics/texture/atlas/gpu/WebGLTextureAtlas.js +11 -0
  217. package/src/engine/graphics/texture/cubemap/load_environment_map.d.ts.map +1 -1
  218. package/src/engine/graphics/texture/cubemap/load_environment_map.js +5 -2
  219. package/src/engine/graphics/texture/sampler/distance/computeSignedDistanceField_Chamfer.d.ts.map +1 -1
  220. package/src/engine/graphics/texture/sampler/distance/computeSignedDistanceField_Chamfer.js +26 -18
  221. package/src/engine/graphics/texture/sampler/filter/sampler2d_blur_gaussian.d.ts +15 -2
  222. package/src/engine/graphics/texture/sampler/filter/sampler2d_blur_gaussian.d.ts.map +1 -1
  223. package/src/engine/graphics/texture/sampler/filter/sampler2d_blur_gaussian.js +29 -3
  224. package/src/engine/graphics/texture/sampler/resize/sampler2d_scale_down_lanczos.d.ts +11 -1
  225. package/src/engine/graphics/texture/sampler/resize/sampler2d_scale_down_lanczos.d.ts.map +1 -1
  226. package/src/engine/graphics/texture/sampler/resize/sampler2d_scale_down_lanczos.js +158 -171
  227. package/src/engine/graphics/texture/sampler/sampler2d_paint.js +1 -1
  228. package/src/engine/graphics/texture/sampler/util/bitSet2Sampler2D.js +2 -2
  229. package/src/engine/input/ecs/util/TopDownCameraControllerHelper.d.ts.map +1 -1
  230. package/src/engine/input/ecs/util/TopDownCameraControllerHelper.js +10 -3
  231. package/src/engine/navigation/ecs/components/PathSerializationUpgrader_2_3.d.ts +14 -0
  232. package/src/engine/navigation/ecs/components/PathSerializationUpgrader_2_3.d.ts.map +1 -0
  233. package/src/engine/navigation/ecs/components/PathSerializationUpgrader_2_3.js +38 -0
  234. package/src/engine/network/orchestrator/ServerAuthoritativeClient.d.ts.map +1 -1
  235. package/src/engine/network/orchestrator/ServerAuthoritativeClient.js +433 -425
  236. package/src/engine/physics/constraint/solve_constraints.d.ts +4 -1
  237. package/src/engine/physics/constraint/solve_constraints.d.ts.map +1 -1
  238. package/src/engine/physics/constraint/solve_constraints.js +38 -13
  239. package/src/engine/physics/contact/ManifoldStore.d.ts +15 -3
  240. package/src/engine/physics/contact/ManifoldStore.d.ts.map +1 -1
  241. package/src/engine/physics/contact/ManifoldStore.js +15 -3
  242. package/src/engine/physics/ecs/Joint.d.ts +7 -4
  243. package/src/engine/physics/ecs/Joint.d.ts.map +1 -1
  244. package/src/engine/physics/ecs/Joint.js +7 -4
  245. package/src/engine/physics/ecs/PhysicsSystem.d.ts +14 -0
  246. package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
  247. package/src/engine/physics/ecs/PhysicsSystem.js +16 -0
  248. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  249. package/src/engine/physics/fluid/ecs/FluidSystem.d.ts +3 -3
  250. package/src/engine/physics/narrowphase/convex_convex_manifold.d.ts +15 -7
  251. package/src/engine/physics/narrowphase/convex_convex_manifold.d.ts.map +1 -1
  252. package/src/engine/physics/narrowphase/convex_convex_manifold.js +33 -10
  253. package/src/engine/physics/narrowphase/refine_ray_concave.d.ts +6 -2
  254. package/src/engine/physics/narrowphase/refine_ray_concave.d.ts.map +1 -1
  255. package/src/engine/physics/narrowphase/refine_ray_concave.js +6 -2
  256. package/src/engine/physics/narrowphase/refine_ray_hit.d.ts +6 -2
  257. package/src/engine/physics/narrowphase/refine_ray_hit.d.ts.map +1 -1
  258. package/src/engine/physics/narrowphase/refine_ray_hit.js +6 -2
  259. package/src/engine/physics/queries/raycast.d.ts.map +1 -1
  260. package/src/engine/physics/queries/raycast.js +11 -4
  261. package/src/engine/save/storage/IndexedDBStorage.d.ts.map +1 -1
  262. package/src/engine/save/storage/IndexedDBStorage.js +21 -3
  263. package/src/engine/simulation/Ticker.d.ts +12 -0
  264. package/src/engine/simulation/Ticker.d.ts.map +1 -1
  265. package/src/engine/simulation/Ticker.js +18 -0
  266. package/src/engine/sound/simulation/AcousticSimulator.d.ts.map +1 -1
  267. package/src/engine/sound/simulation/AcousticSimulator.js +9 -1
  268. package/src/engine/sound/simulation/core/VolumeField.d.ts +6 -2
  269. package/src/engine/sound/simulation/core/VolumeField.d.ts.map +1 -1
  270. package/src/engine/sound/simulation/core/VolumeField.js +6 -2
  271. package/src/engine/sound/simulation/probe/AcousticProbeField.d.ts +6 -2
  272. package/src/engine/sound/simulation/probe/AcousticProbeField.d.ts.map +1 -1
  273. package/src/engine/sound/simulation/probe/AcousticProbeField.js +6 -2
  274. package/src/engine/sound/simulation/probe/acoustic_probe_transfer.d.ts +6 -2
  275. package/src/engine/sound/simulation/probe/acoustic_probe_transfer.d.ts.map +1 -1
  276. package/src/engine/sound/simulation/probe/acoustic_probe_transfer.js +6 -2
  277. package/src/engine/sound/simulation/probe/bakeProbeReflectors.d.ts +3 -1
  278. package/src/engine/sound/simulation/probe/bakeProbeReflectors.d.ts.map +1 -1
  279. package/src/engine/sound/simulation/probe/bakeProbeReflectors.js +3 -1
  280. package/src/engine/ui/GUIEngine.d.ts.map +1 -1
  281. package/src/engine/ui/GUIEngine.js +8 -1
  282. package/src/generation/theme/TerrainTheme.d.ts.map +1 -1
  283. package/src/generation/theme/TerrainTheme.js +2 -1
  284. package/src/generation/theme/ThemeEngine.d.ts.map +1 -1
  285. package/src/generation/theme/ThemeEngine.js +6 -5
  286. package/src/view/ViewGroup.d.ts.map +1 -1
  287. package/src/view/ViewGroup.js +9 -7
  288. package/src/view/graphics/WebGLContextFailureView.d.ts +19 -0
  289. package/src/view/graphics/WebGLContextFailureView.d.ts.map +1 -0
  290. package/src/view/graphics/WebGLContextFailureView.js +76 -0
  291. package/src/view/minimap/Minimap.d.ts +8 -0
  292. package/src/view/minimap/Minimap.d.ts.map +1 -1
  293. package/src/view/minimap/Minimap.js +16 -3
  294. package/src/view/minimap/dom/MinimapMarkerView.d.ts.map +1 -1
  295. package/src/view/minimap/dom/MinimapMarkerView.js +3 -1
@@ -61,11 +61,18 @@ function aabb_face_normal(out, min_x, min_y, min_z, max_x, max_y, max_z, hx, hy,
61
61
  * cannot contain a closer hit. A leaf whose ray crosses the fat AABB but misses
62
62
  * the true shape contributes nothing — the correctness gain over broadphase.
63
63
  *
64
- * @param {BVH} bvh @param {number} root
64
+ * @param {BVH} bvh
65
+ * @param {number} root
65
66
  * @param {PhysicsSystem} system
66
- * @param {number} ox @param {number} oy @param {number} oz ray origin
67
- * @param {number} dx @param {number} dy @param {number} dz ray dir (unit)
68
- * @param {number} inv_dx @param {number} inv_dy @param {number} inv_dz
67
+ * @param {number} ox ray origin x
68
+ * @param {number} oy ray origin y
69
+ * @param {number} oz ray origin z
70
+ * @param {number} dx ray dir x (unit)
71
+ * @param {number} dy ray dir y (unit)
72
+ * @param {number} dz ray dir z (unit)
73
+ * @param {number} inv_dx
74
+ * @param {number} inv_dy
75
+ * @param {number} inv_dz
69
76
  * @param {number} max_distance
70
77
  * @param {(entity:number, collider:Collider)=>boolean} filter
71
78
  */
@@ -1 +1 @@
1
- {"version":3,"file":"IndexedDBStorage.d.ts","sourceRoot":"","sources":["../../../../../src/engine/save/storage/IndexedDBStorage.js"],"names":[],"mappings":"AAMA;;GAEG;AACH;IACI,uBAgCC;IAnBG;;;OAGG;IACH,IAFU,QAAQ,WAAW,CAAC,CAe5B;IAIN,kDA+BC;IAsDD,sCAkBC;CACJ;oBApJmB,eAAe"}
1
+ {"version":3,"file":"IndexedDBStorage.d.ts","sourceRoot":"","sources":["../../../../../src/engine/save/storage/IndexedDBStorage.js"],"names":[],"mappings":"AAMA;;GAEG;AACH;IACI,uBAgCC;IAnBG;;;OAGG;IACH,IAFU,QAAQ,WAAW,CAAC,CAe5B;IAIN,kDA+BC;IAwED,sCAkBC;CACJ;oBAtKmB,eAAe"}
@@ -105,10 +105,20 @@ export class IndexedDBStorage extends Storage {
105
105
 
106
106
  const idbRequest = objectStore.put(value, key);
107
107
 
108
+ // A successful request only means the write was queued. Durability
109
+ // is guaranteed at transaction commit, and a transaction can still
110
+ // abort afterwards -- on quota exhaustion, for instance. Reporting
111
+ // success off the request turns a lost save into a reported save.
112
+ let result;
113
+
114
+ idbRequest.addEventListener('success', (event) => {
115
+ result = event.target.result;
116
+ });
117
+
108
118
  if (typeof resolve === "function") {
109
119
 
110
- idbRequest.addEventListener('success', (event) => {
111
- resolve(event.target.result);
120
+ transaction.addEventListener('complete', () => {
121
+ resolve(result);
112
122
  });
113
123
 
114
124
  }
@@ -119,6 +129,14 @@ export class IndexedDBStorage extends Storage {
119
129
  reject(event);
120
130
  });
121
131
 
132
+ transaction.addEventListener('abort', (event) => {
133
+ reject(event);
134
+ });
135
+
136
+ transaction.addEventListener('error', (event) => {
137
+ reject(event);
138
+ });
139
+
122
140
  }
123
141
  });
124
142
 
@@ -130,7 +148,7 @@ export class IndexedDBStorage extends Storage {
130
148
  list(resolve, reject) {
131
149
  this.db
132
150
  .then((db) => {
133
- const transaction = db.transaction(MAIN_STORE_NAME, IDBTransaction.READ_ONLY);
151
+ const transaction = db.transaction(MAIN_STORE_NAME, IndexedDBTransactionMode.ReadOnly);
134
152
 
135
153
  const objectStore = transaction.objectStore(MAIN_STORE_NAME);
136
154
 
@@ -40,6 +40,18 @@ declare class Ticker {
40
40
  * @type {Signal<number>}
41
41
  */
42
42
  readonly onTick: any;
43
+ /**
44
+ * Whether the update loop is cycling. {@link Ticker#pause} and {@link Ticker#resume} require this,
45
+ * they throw otherwise.
46
+ * @returns {boolean}
47
+ */
48
+ get is_active(): boolean;
49
+ /**
50
+ * Whether tick dispatch is currently stopped via {@link Ticker#pause}. Suspension caused by the host
51
+ * page going into the background is not reported here, see {@link Ticker#suspend_in_background}.
52
+ * @returns {boolean}
53
+ */
54
+ get is_paused(): boolean;
43
55
  /**
44
56
  *
45
57
  * @param {number} [maxTimeout]
@@ -1 +1 @@
1
- {"version":3,"file":"Ticker.d.ts","sourceRoot":"","sources":["../../../../src/engine/simulation/Ticker.js"],"names":[],"mappings":";AAIA;;;;;;;;;;;;;;GAcG;AACH;IACI;;;OAGG;IACH,gBAFU,KAAK,CAEK;IAEpB;;;;;;;;;;;;OAYG;IACH,uBAFU,OAAO,CAEY;IAwB7B;;;;OAIG;IACH,qBAAsB;IA+GtB;;;OAGG;IACH,uBAFW,MAAM,QAyDhB;IAED,cAWC;IAED,eAaC;IAED,aAUC;;CACJ;kBArRiB,aAAa"}
1
+ {"version":3,"file":"Ticker.d.ts","sourceRoot":"","sources":["../../../../src/engine/simulation/Ticker.js"],"names":[],"mappings":";AAIA;;;;;;;;;;;;;;GAcG;AACH;IACI;;;OAGG;IACH,gBAFU,KAAK,CAEK;IAEpB;;;;;;;;;;;;OAYG;IACH,uBAFU,OAAO,CAEY;IAwB7B;;;;OAIG;IACH,qBAAsB;IAUtB;;;;OAIG;IACH,yBAEC;IAED;;;;OAIG;IACH,yBAEC;IAuGD;;;OAGG;IACH,uBAFW,MAAM,QAyDhB;IAED,cAWC;IAED,eAaC;IAED,aAUC;;CACJ;kBAvSiB,aAAa"}
@@ -76,6 +76,24 @@ class Ticker {
76
76
  return this.#timeoutHandle !== -1 && this.#animationFrameHandle !== -1;
77
77
  }
78
78
 
79
+ /**
80
+ * Whether the update loop is cycling. {@link Ticker#pause} and {@link Ticker#resume} require this,
81
+ * they throw otherwise.
82
+ * @returns {boolean}
83
+ */
84
+ get is_active() {
85
+ return this.#isUpdateLoopActive();
86
+ }
87
+
88
+ /**
89
+ * Whether tick dispatch is currently stopped via {@link Ticker#pause}. Suspension caused by the host
90
+ * page going into the background is not reported here, see {@link Ticker#suspend_in_background}.
91
+ * @returns {boolean}
92
+ */
93
+ get is_paused() {
94
+ return !this.#isRunning;
95
+ }
96
+
79
97
  /**
80
98
  * Stop dispatching ticks because the host page moved to the background.
81
99
  * The clock is paused so no simulation time accrues while suspended. The
@@ -1 +1 @@
1
- {"version":3,"file":"AcousticSimulator.d.ts","sourceRoot":"","sources":["../../../../../src/engine/sound/simulation/AcousticSimulator.js"],"names":[],"mappings":"AAyCA;;;;;;;;;GASG;AACH;IACI;;;OAGG;IACH,UAFU,MAAM,CAEF;IAEd;;;OAGG;IACH,WAFU,MAAM,CAEA;IAEhB;;;;;OAKG;IACH,SAFU,OAAO,CAED;IAEhB;;;;;;OAMG;IACH,gBAFU,OAAO,CAEM;IAEvB;;;;OAIG;IACH,eAFU,MAAM,CAEE;IAgGlB,6BAGC;IAZD;;;;OAIG;IACH,0BAEC;IAiBD,gCAEC;IAZD;;;;;OAKG;IACH,6BAEC;IAMD;;;;OAIG;IACH,2CAEC;IAED;;;;;;;OAOG;IACH,yEAHW,YAAY,GAAC,MAAM,EAAE,GACnB,MAAM,CAIlB;IAED;;;OAGG;IACH,6BAHW,MAAM,UACN,YAAY,GAAC,MAAM,EAAE,QAI/B;IAED;;OAEG;IACH,uBAFW,MAAM,QAIhB;IAED;;;OAGG;IACH,8DAEC;IAED;;OAEG;IACH,iDAEC;IAED;;;;OAIG;IACH,sBAEC;IAED;;;;;OAKG;IACH,qBAFW,qBAAmB,IAAI,QAMjC;IAED;;;;;;;;OAQG;IACH,mBAPW,OAAO,UACP,OAAO,gBACP,MAAM,SAEN,mBAAmB,OACnB,gBAAgB,QAkB1B;IAED;;;;;;OAMG;IACH,qBAHW,eAAe,YACf,OAAO,QAuFjB;IAwOD;;;OAGG;IACH,sCAOC;;CACJ;+BAvnB8B,0BAA0B;sCACnB,iCAAiC;wBAL/C,+BAA+B;oCAQW,+BAA+B;iCADhE,4BAA4B"}
1
+ {"version":3,"file":"AcousticSimulator.d.ts","sourceRoot":"","sources":["../../../../../src/engine/sound/simulation/AcousticSimulator.js"],"names":[],"mappings":"AAyCA;;;;;;;;;GASG;AACH;IACI;;;OAGG;IACH,UAFU,MAAM,CAEF;IAEd;;;OAGG;IACH,WAFU,MAAM,CAEA;IAEhB;;;;;OAKG;IACH,SAFU,OAAO,CAED;IAEhB;;;;;;OAMG;IACH,gBAFU,OAAO,CAEM;IAEvB;;;;OAIG;IACH,eAFU,MAAM,CAEE;IAgGlB,6BAGC;IAZD;;;;OAIG;IACH,0BAEC;IAiBD,gCAEC;IAZD;;;;;OAKG;IACH,6BAEC;IAMD;;;;OAIG;IACH,2CAEC;IAED;;;;;;;OAOG;IACH,yEAHW,YAAY,GAAC,MAAM,EAAE,GACnB,MAAM,CAIlB;IAED;;;OAGG;IACH,6BAHW,MAAM,UACN,YAAY,GAAC,MAAM,EAAE,QAI/B;IAED;;OAEG;IACH,uBAFW,MAAM,QAIhB;IAED;;;OAGG;IACH,8DAEC;IAED;;OAEG;IACH,iDAEC;IAED;;;;OAIG;IACH,sBAEC;IAED;;;;;OAKG;IACH,qBAFW,qBAAmB,IAAI,QAMjC;IAED;;;;;;;;OAQG;IACH,mBAPW,OAAO,UACP,OAAO,gBACP,MAAM,SAEN,mBAAmB,OACnB,gBAAgB,QAkB1B;IAED;;;;;;OAMG;IACH,qBAHW,eAAe,YACf,OAAO,QAuFjB;IAgPD;;;OAGG;IACH,sCAOC;;CACJ;+BA/nB8B,0BAA0B;sCACnB,iCAAiC;wBAL/C,+BAA+B;oCAQW,+BAA+B;iCADhE,4BAA4B"}
@@ -554,6 +554,12 @@ export class AcousticSimulator {
554
554
  * degenerate (zero-length) direction → 1 (no gate). See {@link AcousticProbeField#probeTransfer} /
555
555
  * PROBE_TRANSFER_RESEARCH.md §3.
556
556
  * @param {number} p probe index
557
+ * @param {number} inx incoming propagation direction x; need not be unit
558
+ * @param {number} iny incoming propagation direction y
559
+ * @param {number} inz incoming propagation direction z
560
+ * @param {number} outx outgoing propagation direction x; need not be unit
561
+ * @param {number} outy outgoing propagation direction y
562
+ * @param {number} outz outgoing propagation direction z
557
563
  * @returns {number} gain in [0, 1]
558
564
  */
559
565
  #turnGain(p, inx, iny, inz, outx, outy, outz) {
@@ -584,7 +590,9 @@ export class AcousticSimulator {
584
590
  * PRECONDITION: only called for a non-omni `instance.directivity`, which (being authored on the source)
585
591
  * always travels with the source's `orientation`.
586
592
  * @param {EventInstance} instance the source — position + orientation + directivity
587
- * @param {number} tx @param {number} ty @param {number} tz target point
593
+ * @param {number} tx target point x
594
+ * @param {number} ty target point y
595
+ * @param {number} tz target point z
588
596
  * @returns {number} radiation gain ≥ 0
589
597
  */
590
598
  #directivityGainToward(instance, tx, ty, tz) {
@@ -44,8 +44,12 @@ export class VolumeField {
44
44
  * midpoints, blending the medium at each via {@link sample}. Allocation-free (module scratch).
45
45
  *
46
46
  * @param {AcousticRegionIndex} regionIndex
47
- * @param {number} sx @param {number} sy @param {number} sz source position
48
- * @param {number} lx @param {number} ly @param {number} lz listener position
47
+ * @param {number} sx source position x
48
+ * @param {number} sy source position y
49
+ * @param {number} sz source position z
50
+ * @param {number} lx listener position x
51
+ * @param {number} ly listener position y
52
+ * @param {number} lz listener position z
49
53
  * @param {Float32Array} outLoss `[low, mid, high]` total dB attenuation over the path
50
54
  */
51
55
  integrateAbsorption(regionIndex: AcousticRegionIndex, sx: number, sy: number, sz: number, lx: number, ly: number, lz: number, outLoss: Float32Array): void;
@@ -1 +1 @@
1
- {"version":3,"file":"VolumeField.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/sound/simulation/core/VolumeField.js"],"names":[],"mappings":"AAaA;;;;;GAKG;AACH;IAMI;;OAEG;IACH,4BAFW,cAAc,EAIxB;IASD;;OAEG;IACH,uCAEC;IAZD;;OAEG;IACH,oCAEC;IASD;;;;;;;;;;;;OAYG;IACH,4CALW,MAAM,KACN,MAAM,KACN,MAAM,OACN,cAAc,QA0BxB;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,0DAJW,MAAM,MAAa,MAAM,MAAa,MAAM,MAC5C,MAAM,MAAa,MAAM,MAAa,MAAM,WAC5C,YAAY,QA2CtB;;CACJ;+BAhJ8B,qBAAqB"}
1
+ {"version":3,"file":"VolumeField.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/sound/simulation/core/VolumeField.js"],"names":[],"mappings":"AAaA;;;;;GAKG;AACH;IAMI;;OAEG;IACH,4BAFW,cAAc,EAIxB;IASD;;OAEG;IACH,uCAEC;IAZD;;OAEG;IACH,oCAEC;IASD;;;;;;;;;;;;OAYG;IACH,4CALW,MAAM,KACN,MAAM,KACN,MAAM,OACN,cAAc,QA0BxB;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,0DARW,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,WACN,YAAY,QA2CtB;;CACJ;+BApJ8B,qBAAqB"}
@@ -96,8 +96,12 @@ export class VolumeField {
96
96
  * midpoints, blending the medium at each via {@link sample}. Allocation-free (module scratch).
97
97
  *
98
98
  * @param {AcousticRegionIndex} regionIndex
99
- * @param {number} sx @param {number} sy @param {number} sz source position
100
- * @param {number} lx @param {number} ly @param {number} lz listener position
99
+ * @param {number} sx source position x
100
+ * @param {number} sy source position y
101
+ * @param {number} sz source position z
102
+ * @param {number} lx listener position x
103
+ * @param {number} ly listener position y
104
+ * @param {number} lz listener position z
101
105
  * @param {Float32Array} outLoss `[low, mid, high]` total dB attenuation over the path
102
106
  */
103
107
  integrateAbsorption(regionIndex, sx, sy, sz, lx, ly, lz, outLoss) {
@@ -201,8 +201,12 @@ export class AcousticProbeField {
201
201
  * passthrough term alone. Directions are unit PROPAGATION directions.
202
202
  * @param {Float32Array|number[]} out length ≥ 3
203
203
  * @param {number} i probe index
204
- * @param {number} inx @param {number} iny @param {number} inz ω_in
205
- * @param {number} outx @param {number} outy @param {number} outz ω_out
204
+ * @param {number} inx ω_in x
205
+ * @param {number} iny ω_in y
206
+ * @param {number} inz ω_in z
207
+ * @param {number} outx ω_out x
208
+ * @param {number} outy ω_out y
209
+ * @param {number} outz ω_out z
206
210
  */
207
211
  probeTransfer(out: Float32Array | number[], i: number, inx: number, iny: number, inz: number, outx: number, outy: number, outz: number): void;
208
212
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"AcousticProbeField.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/sound/simulation/probe/AcousticProbeField.js"],"names":[],"mappings":"AAmCA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH;IAmDI;;OAEG;IACH,mBAEC;IAED;;;OAGG;IACH,6BAEC;IAED;;;;OAIG;IACH,2BAEC;IAED;;;OAGG;IACH,2BAEC;IAED;;;;OAIG;IACH,kBAHW,MAAM,GACJ,MAAM,CAIlB;IAwBD;;;;;;;;;OASG;IACH,wBALW,MAAM,KACN,MAAM,KACN,MAAM,KACN,MAAM,QAsBhB;IAED;;;;;;;;OAQG;IACH,2BALW,MAAM,OACN,MAAM,OACN,MAAM,QACN,MAAM,QAShB;IAED;;;;;;;OAOG;IACH,gCAHW,MAAM,cACN,YAAY,GAAC,MAAM,EAAE,QAS/B;IAED;;;OAGG;IACH,UAHW,MAAM,GACJ,MAAM,CAIlB;IAED;;;OAGG;IACH,UAHW,MAAM,GACJ,MAAM,CAIlB;IAED;;;OAGG;IACH,UAHW,MAAM,GACJ,MAAM,CAIlB;IAED;;;;;OAKG;IACH,cAJW,MAAM,QACN,MAAM,GACJ,MAAM,CAIlB;IAED;;;;;;OAMG;IACH,mBAJW,MAAM,QACN,MAAM,OACN,YAAY,GAAC,MAAM,EAAE,QAS/B;IAED;;;;OAIG;IACH,eAHW,MAAM,GACJ,MAAM,CAIlB;IAED;;;;;;OAMG;IACH,gBALW,MAAM,KACN,MAAM,KACN,MAAM,GACJ,MAAM,CAKlB;IAED;;;;;;;;;;;;;OAaG;IACH,uBANW,MAAM,KACN,MAAM,KACN,MAAM,yCAEJ,MAAM,CAyBlB;IAED;;;;;;;;;;;;;;;OAeG;IACH,2BARW,MAAM,EAAE,GAAC,WAAW,iBACpB,MAAM,KACN,MAAM,KACN,MAAM,KACN,MAAM,UACN,MAAM,GACJ,MAAM,CAKlB;IAED;;;;;;;OAOG;IACH,iBALW,MAAM,KACN,MAAM,KACN,MAAM,GACJ,MAAM,CAKlB;IAED;;;;;;;OAOG;IACH,iBALW,MAAM,KACN,MAAM,KACN,MAAM,OACN,YAAY,GAAC,MAAM,EAAE,QAe/B;IAED;;;;;;;OAOG;IACH,sBALW,MAAM,KACN,MAAM,KACN,MAAM,OACN,YAAY,GAAC,MAAM,EAAE,QAkB/B;IAmCD;;;;;;OAMG;IACH,0CAEC;IAED;;;;;;OAMG;IACH,kBAHW,WAAW,QACX,YAAY,QAKtB;IAED;;;;;;;;OAQG;IACH,mBALW,YAAY,GAAC,MAAM,EAAE,KACrB,MAAM,OACN,MAAM,OAAc,MAAM,OAAc,MAAM,QAC9C,MAAM,QAAe,MAAM,QAAe,MAAM,QAQ1D;IAED;;;;;;;OAOG;IACH,mBAJW,MAAM,MACN,MAAM,GACJ,MAAM,EAAE,GAAC,IAAI,CAQzB;IAED;;;;;;;;MA0BC;IAED;;;;OAIG;IACH;gBAFmB;YAAC,CAAC,EAAC,MAAM,CAAC;YAAA,CAAC,EAAC,MAAM,CAAC;YAAA,CAAC,EAAC,MAAM,CAAC;YAAA,WAAW,EAAC,MAAM,EAAE,CAAC;YAAA,eAAe,EAAC,MAAM,EAAE,CAAA;SAAC,EAAE;aAoB9F;;CACJ"}
1
+ {"version":3,"file":"AcousticProbeField.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/sound/simulation/probe/AcousticProbeField.js"],"names":[],"mappings":"AAmCA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH;IAmDI;;OAEG;IACH,mBAEC;IAED;;;OAGG;IACH,6BAEC;IAED;;;;OAIG;IACH,2BAEC;IAED;;;OAGG;IACH,2BAEC;IAED;;;;OAIG;IACH,kBAHW,MAAM,GACJ,MAAM,CAIlB;IAwBD;;;;;;;;;OASG;IACH,wBALW,MAAM,KACN,MAAM,KACN,MAAM,KACN,MAAM,QAsBhB;IAED;;;;;;;;OAQG;IACH,2BALW,MAAM,OACN,MAAM,OACN,MAAM,QACN,MAAM,QAShB;IAED;;;;;;;OAOG;IACH,gCAHW,MAAM,cACN,YAAY,GAAC,MAAM,EAAE,QAS/B;IAED;;;OAGG;IACH,UAHW,MAAM,GACJ,MAAM,CAIlB;IAED;;;OAGG;IACH,UAHW,MAAM,GACJ,MAAM,CAIlB;IAED;;;OAGG;IACH,UAHW,MAAM,GACJ,MAAM,CAIlB;IAED;;;;;OAKG;IACH,cAJW,MAAM,QACN,MAAM,GACJ,MAAM,CAIlB;IAED;;;;;;OAMG;IACH,mBAJW,MAAM,QACN,MAAM,OACN,YAAY,GAAC,MAAM,EAAE,QAS/B;IAED;;;;OAIG;IACH,eAHW,MAAM,GACJ,MAAM,CAIlB;IAED;;;;;;OAMG;IACH,gBALW,MAAM,KACN,MAAM,KACN,MAAM,GACJ,MAAM,CAKlB;IAED;;;;;;;;;;;;;OAaG;IACH,uBANW,MAAM,KACN,MAAM,KACN,MAAM,yCAEJ,MAAM,CAyBlB;IAED;;;;;;;;;;;;;;;OAeG;IACH,2BARW,MAAM,EAAE,GAAC,WAAW,iBACpB,MAAM,KACN,MAAM,KACN,MAAM,KACN,MAAM,UACN,MAAM,GACJ,MAAM,CAKlB;IAED;;;;;;;OAOG;IACH,iBALW,MAAM,KACN,MAAM,KACN,MAAM,GACJ,MAAM,CAKlB;IAED;;;;;;;OAOG;IACH,iBALW,MAAM,KACN,MAAM,KACN,MAAM,OACN,YAAY,GAAC,MAAM,EAAE,QAe/B;IAED;;;;;;;OAOG;IACH,sBALW,MAAM,KACN,MAAM,KACN,MAAM,OACN,YAAY,GAAC,MAAM,EAAE,QAkB/B;IAmCD;;;;;;OAMG;IACH,0CAEC;IAED;;;;;;OAMG;IACH,kBAHW,WAAW,QACX,YAAY,QAKtB;IAED;;;;;;;;;;;;OAYG;IACH,mBATW,YAAY,GAAC,MAAM,EAAE,KACrB,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QAQhB;IAED;;;;;;;OAOG;IACH,mBAJW,MAAM,MACN,MAAM,GACJ,MAAM,EAAE,GAAC,IAAI,CAQzB;IAED;;;;;;;;MA0BC;IAED;;;;OAIG;IACH;gBAFmB;YAAC,CAAC,EAAC,MAAM,CAAC;YAAA,CAAC,EAAC,MAAM,CAAC;YAAA,CAAC,EAAC,MAAM,CAAC;YAAA,WAAW,EAAC,MAAM,EAAE,CAAC;YAAA,eAAe,EAAC,MAAM,EAAE,CAAA;SAAC,EAAE;aAoB9F;;CACJ"}
@@ -490,8 +490,12 @@ export class AcousticProbeField {
490
490
  * passthrough term alone. Directions are unit PROPAGATION directions.
491
491
  * @param {Float32Array|number[]} out length ≥ 3
492
492
  * @param {number} i probe index
493
- * @param {number} inx @param {number} iny @param {number} inz ω_in
494
- * @param {number} outx @param {number} outy @param {number} outz ω_out
493
+ * @param {number} inx ω_in x
494
+ * @param {number} iny ω_in y
495
+ * @param {number} inz ω_in z
496
+ * @param {number} outx ω_out x
497
+ * @param {number} outy ω_out y
498
+ * @param {number} outz ω_out z
495
499
  */
496
500
  probeTransfer(out, i, inx, iny, inz, outx, outy, outz) {
497
501
  const offsets = this.#lobeOffsets;
@@ -19,8 +19,12 @@ export function forward_plateau(c: number): number;
19
19
  * @param {Float32Array} lobes flat lobe array (LOBE_STRIDE floats each)
20
20
  * @param {number} lobeOffset start index of this probe's lobes in `lobes`
21
21
  * @param {number} lobeCount number of lobes for this probe
22
- * @param {number} inx @param {number} iny @param {number} inz ω_in (unit)
23
- * @param {number} outx @param {number} outy @param {number} outz ω_out (unit)
22
+ * @param {number} inx ω_in x (unit)
23
+ * @param {number} iny ω_in y (unit)
24
+ * @param {number} inz ω_in z (unit)
25
+ * @param {number} outx ω_out x (unit)
26
+ * @param {number} outy ω_out y (unit)
27
+ * @param {number} outz ω_out z (unit)
24
28
  */
25
29
  export function acoustic_probe_transfer(out: Float32Array | number[], lobes: Float32Array, lobeOffset: number, lobeCount: number, inx: number, iny: number, inz: number, outx: number, outy: number, outz: number): void;
26
30
  export const LOBE_STRIDE: 7;
@@ -1 +1 @@
1
- {"version":3,"file":"acoustic_probe_transfer.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/sound/simulation/probe/acoustic_probe_transfer.js"],"names":[],"mappings":"AAgCA;;;;;GAKG;AACH,mCAHW,MAAM,GACJ,MAAM,CAOlB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,6CAPW,YAAY,GAAC,MAAM,EAAE,SACrB,YAAY,cACZ,MAAM,aACN,MAAM,OACN,MAAM,OAAc,MAAM,OAAc,MAAM,QAC9C,MAAM,QAAe,MAAM,QAAe,MAAM,QAsC1D;AAlFD,4BAA6B;AAU7B,wCAAyC;AACzC,gCAAiC"}
1
+ {"version":3,"file":"acoustic_probe_transfer.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/sound/simulation/probe/acoustic_probe_transfer.js"],"names":[],"mappings":"AAgCA;;;;;GAKG;AACH,mCAHW,MAAM,GACJ,MAAM,CAOlB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,6CAXW,YAAY,GAAC,MAAM,EAAE,SACrB,YAAY,cACZ,MAAM,aACN,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QAsChB;AAtFD,4BAA6B;AAU7B,wCAAyC;AACzC,gCAAiC"}
@@ -57,8 +57,12 @@ export function forward_plateau(c) {
57
57
  * @param {Float32Array} lobes flat lobe array (LOBE_STRIDE floats each)
58
58
  * @param {number} lobeOffset start index of this probe's lobes in `lobes`
59
59
  * @param {number} lobeCount number of lobes for this probe
60
- * @param {number} inx @param {number} iny @param {number} inz ω_in (unit)
61
- * @param {number} outx @param {number} outy @param {number} outz ω_out (unit)
60
+ * @param {number} inx ω_in x (unit)
61
+ * @param {number} iny ω_in y (unit)
62
+ * @param {number} inz ω_in z (unit)
63
+ * @param {number} outx ω_out x (unit)
64
+ * @param {number} outy ω_out y (unit)
65
+ * @param {number} outz ω_out z (unit)
62
66
  */
63
67
  export function acoustic_probe_transfer(out, lobes, lobeOffset, lobeCount, inx, iny, inz, outx, outy, outz) {
64
68
  const c = inx * outx + iny * outy + inz * outz; // ω_in·ω_out
@@ -4,7 +4,9 @@
4
4
  * occluder within `radius`) yields 0 lobes — pure forward transfer.
5
5
  *
6
6
  * @param {AcousticOccluderIndex} index the acoustic scene
7
- * @param {number} x @param {number} y @param {number} z probe position
7
+ * @param {number} x probe position x
8
+ * @param {number} y probe position y
9
+ * @param {number} z probe position z
8
10
  * @param {number} radius probe-local reflector radius (a reflector beyond this can't bend a local probe)
9
11
  * @param {number} rayCount rays to shoot (more = finer reflector coverage)
10
12
  * @param {Float32Array} outLobes destination, ≥ MAX_LOBES·LOBE_STRIDE floats
@@ -1 +1 @@
1
- {"version":3,"file":"bakeProbeReflectors.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/sound/simulation/probe/bakeProbeReflectors.js"],"names":[],"mappings":"AAgCA;;;;;;;;;;;GAWG;AACH,qEANW,MAAM,KAAY,MAAM,KAAY,MAAM,UAC1C,MAAM,YACN,MAAM,YACN,YAAY,GACV,MAAM,CA+DlB;AA5FD,0BAAoB"}
1
+ {"version":3,"file":"bakeProbeReflectors.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/sound/simulation/probe/bakeProbeReflectors.js"],"names":[],"mappings":"AAgCA;;;;;;;;;;;;;GAaG;AACH,qEARW,MAAM,KACN,MAAM,KACN,MAAM,UACN,MAAM,YACN,MAAM,YACN,YAAY,GACV,MAAM,CA+DlB;AA9FD,0BAAoB"}
@@ -36,7 +36,9 @@ const C_COUNT = new Float32Array(MAX_LOBES);
36
36
  * occluder within `radius`) yields 0 lobes — pure forward transfer.
37
37
  *
38
38
  * @param {AcousticOccluderIndex} index the acoustic scene
39
- * @param {number} x @param {number} y @param {number} z probe position
39
+ * @param {number} x probe position x
40
+ * @param {number} y probe position y
41
+ * @param {number} z probe position z
40
42
  * @param {number} radius probe-local reflector radius (a reflector beyond this can't bend a local probe)
41
43
  * @param {number} rayCount rays to shoot (more = finer reflector coverage)
42
44
  * @param {Float32Array} outLobes destination, ≥ MAX_LOBES·LOBE_STRIDE floats
@@ -1 +1 @@
1
- {"version":3,"file":"GUIEngine.d.ts","sourceRoot":"","sources":["../../../../src/engine/ui/GUIEngine.js"],"names":[],"mappings":";AA4BA;IACI,mBAAqB;IAErB;;;OAGG;IACH,eAFU,gBAAc,IAAI,CAEP;IAErB;;;OAGG;IACH,eAAc;IAEd;;;OAGG;IACH,eAFU,eAAe,eAAe,CAAC,CAEX;IAE9B;;;OAGG;IACH,UAFU,cAAc,CAEQ;IAEhC;;;OAGG;IACH,cAFU,iBAAiB,CAEyB;IAGpD;;;OAGG;IACH,QAFU,MAAM,CAEM;IAEtB,gBAOG;IAEH;;;OAGG;IACH,KAFU,SAAS,CAEG;IAEtB;;;OAGG;IACH,QAFU,cAAc,CAEuB;IAG/C;;;OAGG;IACH,cAFU,eAAa,IAAI,CAEP;IAqBpB;;;;;;OAMG;IACH,mDANW,OAAO,GAIL,MAAM,CAoClB;IAED;;;;;;OAMG;IACH,0CALW,IAAI,GAGF,eAAe,CA+D3B;IAED;;;;;;OAMG;IACH,iEALW,MAAM,GAGJ,QAAQ,GAAG,CAAC,CA0DxB;IAED;;;;OAIG;IACH,mCAJW,MAAM,gBAWhB;IAED;;;;;OAKG;IACH,iCAJW,MAAM,gBAUhB;IAED;;;;;;;;OAQG;IACH,gEAPW,IAAI,gBA0Dd;IAED;;;;OAIG;IACH,kCAFY,eAAe,CAgB1B;IAED;;OAEG;IACH,yBAFa,eAAe,GAAC,IAAI,CAkBhC;IAED;;;OAGG;IACH,8BAKC;IAED;;;OAGG;IACH,wCA0DC;IAED,2BAYC;CACJ;iBAjgBgB,oCAAoC;gCAyBrB,4BAA4B;+BAf7B,sCAAsC;kCAFnC,yCAAyC;mBAexD,yBAAyB;sBAjBtB,kCAAkC;0BAG9B,qCAAqC;2BAPpC,oCAAoC;mBAiB5C,kBAAkB;iBAPpB,oBAAoB;gCATqB,uCAAuC"}
1
+ {"version":3,"file":"GUIEngine.d.ts","sourceRoot":"","sources":["../../../../src/engine/ui/GUIEngine.js"],"names":[],"mappings":";AA4BA;IACI,mBAAqB;IAErB;;;OAGG;IACH,eAFU,gBAAc,IAAI,CAEP;IAErB;;;OAGG;IACH,eAAc;IAEd;;;OAGG;IACH,eAFU,eAAe,eAAe,CAAC,CAEX;IAE9B;;;OAGG;IACH,UAFU,cAAc,CAEQ;IAEhC;;;OAGG;IACH,cAFU,iBAAiB,CAEyB;IAGpD;;;OAGG;IACH,QAFU,MAAM,CAEM;IAEtB,gBAOG;IAEH;;;OAGG;IACH,KAFU,SAAS,CAEG;IAEtB;;;OAGG;IACH,QAFU,cAAc,CAEuB;IAG/C;;;OAGG;IACH,cAFU,eAAa,IAAI,CAEP;IAqBpB;;;;;;OAMG;IACH,mDANW,OAAO,GAIL,MAAM,CAoClB;IAED;;;;;;OAMG;IACH,0CALW,IAAI,GAGF,eAAe,CA+D3B;IAED;;;;;;OAMG;IACH,iEALW,MAAM,GAGJ,QAAQ,GAAG,CAAC,CA0DxB;IAED;;;;OAIG;IACH,mCAJW,MAAM,gBAWhB;IAED;;;;;OAKG;IACH,iCAJW,MAAM,gBAUhB;IAED;;;;;;;;OAQG;IACH,gEAPW,IAAI,gBA0Dd;IAED;;;;OAIG;IACH,kCAFY,eAAe,CAgB1B;IAED;;OAEG;IACH,yBAFa,eAAe,GAAC,IAAI,CAkBhC;IAED;;;OAGG;IACH,8BAKC;IAED;;;OAGG;IACH,wCAiEC;IAED,2BAYC;CACJ;iBAxgBgB,oCAAoC;gCAyBrB,4BAA4B;+BAf7B,sCAAsC;kCAFnC,yCAAyC;mBAexD,yBAAyB;sBAjBtB,kCAAkC;0BAG9B,qCAAqC;2BAPpC,oCAAoC;mBAiB5C,kBAAkB;iBAPpB,oBAAoB;gCATqB,uCAAuC"}
@@ -478,7 +478,14 @@ class GUIEngine {
478
478
  return `cursor-${cursorName}`;
479
479
  }
480
480
 
481
- const classList = engine.graphics.domElement.classList;
481
+ const graphics = engine.graphics;
482
+
483
+ if (graphics === null) {
484
+ // headless: there is no canvas to carry the cursor class
485
+ return;
486
+ }
487
+
488
+ const classList = graphics.domElement.classList;
482
489
 
483
490
  if (typeof oldValue === 'string') {
484
491
  classList.remove(className(oldValue));
@@ -1 +1 @@
1
- {"version":3,"file":"TerrainTheme.d.ts","sourceRoot":"","sources":["../../../../src/generation/theme/TerrainTheme.js"],"names":[],"mappings":"AAGA;IACI;;;OAGG;IACH,OAFU,kBAAkB,CAEjB;IAGX;;;;OAIG;IACH,iCAFW,MAAM,QAkBhB;CACJ"}
1
+ {"version":3,"file":"TerrainTheme.d.ts","sourceRoot":"","sources":["../../../../src/generation/theme/TerrainTheme.js"],"names":[],"mappings":"AAIA;IACI;;;OAGG;IACH,OAFU,kBAAkB,CAEjB;IAGX;;;;OAIG;IACH,iCAFW,MAAM,QAkBhB;CACJ"}
@@ -1,4 +1,5 @@
1
1
  import { assert } from "../../core/assert.js";
2
+ import { randomSeed } from "../../core/math/random/randomSeed.js";
2
3
  import { seededRandom } from "../../core/math/random/seededRandom.js";
3
4
 
4
5
  export class TerrainTheme {
@@ -26,7 +27,7 @@ export class TerrainTheme {
26
27
  for (let i = 0; i < n; i++) {
27
28
  const rule = rules[i];
28
29
 
29
- const ruleSeed = random();
30
+ const ruleSeed = randomSeed(random);
30
31
 
31
32
  rule.filter.initialize(grid, ruleSeed);
32
33
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ThemeEngine.d.ts","sourceRoot":"","sources":["../../../../src/generation/theme/ThemeEngine.js"],"names":[],"mappings":"AAoFA;IAEI;;;OAGG;IACH,OAFU,uBAAuB,CAEN;IAE3B;;;OAGG;IACH,uBAFqB,MAAM,CAEF;IAEzB;;;;OAIG;IACH,uBAAsB;IAEtB,2BAEC;IAED;;;OAGG;IACH,sBAEC;IAED;;;OAGG;IACH,mBAEC;IAED;;;OAGG;IACH,4BAUC;IAED;;;;;;OAMG;IACH,4BALW,WAAW,KACX,MAAM,KACN,MAAM,GACJ,MAAM,CA8BlB;IAED;;;;;;OAMG;IACH,oEAHW,MAAM,GACJ,IAAI,CAmChB;IAED;;;;;OAKG;IACH,sDAFa,SAAS,CAgLrB;IAED;;;;;;OAMG;IACH,+DAHW,MAAM,GACJ,IAAI,GAAC,SAAS,CA2G1B;IAED;;;;OAIG;IACH,kEAqCC;IAED;;;;;;;;;;;;;OAaG;IACH,iCAFa,IAAI,CA+BhB;IAED;;;;OAIG;IACH,uCAHa,SAAS,CAYrB;IAED;;;;;OAKG;IACH,oDAFa,SAAS,CA6DrB;CACJ;6BA5qB4B,8CAA8C;iBAM1D,iCAAiC;sBAC5B,sCAAsC"}
1
+ {"version":3,"file":"ThemeEngine.d.ts","sourceRoot":"","sources":["../../../../src/generation/theme/ThemeEngine.js"],"names":[],"mappings":"AAqFA;IAEI;;;OAGG;IACH,OAFU,uBAAuB,CAEN;IAE3B;;;OAGG;IACH,uBAFqB,MAAM,CAEF;IAEzB;;;;OAIG;IACH,uBAAsB;IAEtB,2BAEC;IAED;;;OAGG;IACH,sBAEC;IAED;;;OAGG;IACH,mBAEC;IAED;;;OAGG;IACH,4BAUC;IAED;;;;;;OAMG;IACH,4BALW,WAAW,KACX,MAAM,KACN,MAAM,GACJ,MAAM,CA8BlB;IAED;;;;;;OAMG;IACH,oEAHW,MAAM,GACJ,IAAI,CAmChB;IAED;;;;;OAKG;IACH,sDAFa,SAAS,CAgLrB;IAED;;;;;;OAMG;IACH,+DAHW,MAAM,GACJ,IAAI,GAAC,SAAS,CA2G1B;IAED;;;;OAIG;IACH,kEAqCC;IAED;;;;;;;;;;;;;OAaG;IACH,iCAFa,IAAI,CA+BhB;IAED;;;;OAIG;IACH,uCAHa,SAAS,CAYrB;IAED;;;;;OAKG;IACH,oDAFa,SAAS,CA6DrB;CACJ;6BA7qB4B,8CAA8C;iBAO1D,iCAAiC;sBAC5B,sCAAsC"}
@@ -4,6 +4,7 @@ import { HashMap } from "../../core/collection/map/HashMap.js";
4
4
  import { QuadTreeNode } from "../../core/geom/2d/quad-tree/QuadTreeNode.js";
5
5
  import { randomFloatBetween } from "../../core/math/random/randomFloatBetween.js";
6
6
  import { randomIntegerBetween } from "../../core/math/random/randomIntegerBetween.js";
7
+ import { randomSeed } from "../../core/math/random/randomSeed.js";
7
8
  import { seededRandom } from "../../core/math/random/seededRandom.js";
8
9
  import { number_compare_ascending } from "../../core/primitives/numbers/number_compare_ascending.js";
9
10
  import Future from "../../core/process/Future.js";
@@ -185,6 +186,8 @@ export class ThemeEngine {
185
186
  */
186
187
  initializeThemes(grid, ecd, seed) {
187
188
 
189
+ const random = seededRandom(seed);
190
+
188
191
  return actionTask(() => {
189
192
  /**
190
193
  *
@@ -209,9 +212,7 @@ export class ThemeEngine {
209
212
  if (themes.indexOf(theme) === -1) {
210
213
  themes.push(theme);
211
214
 
212
- const seed = this.random();
213
-
214
- theme.initialize(grid, ecd, seed);
215
+ theme.initialize(grid, ecd, randomSeed(random));
215
216
  }
216
217
  }
217
218
 
@@ -628,9 +629,9 @@ export class ThemeEngine {
628
629
  apply(grid, ecd) {
629
630
  const terrain = obtainTerrain(ecd);
630
631
 
631
- const tInitializeThemes = this.initializeThemes(grid, ecd, this.random());
632
+ const tInitializeThemes = this.initializeThemes(grid, ecd, randomSeed(this.random));
632
633
 
633
- const tNodes = this.applyNodes(grid, ecd);
634
+ const tNodes = this.applyNodes(grid, ecd, randomSeed(this.random));
634
635
 
635
636
  const tCells = this.applyCellRules(grid, ecd);
636
637
 
@@ -1 +1 @@
1
- {"version":3,"file":"ViewGroup.d.ts","sourceRoot":"","sources":["../../../src/view/ViewGroup.js"],"names":[],"mappings":"AAAA;IAEQ;;;OAGG;IACH,iBAAyB;IAGzB;;;OAGG;IACH,kBAAqB;IAGzB;;;OAGG;IACH,sBAMC;IAED;;;OAGG;IACH,4BAYC;IAED;;;OAGG;IACH,+BAqBC;IAED,mBAeC;CACJ"}
1
+ {"version":3,"file":"ViewGroup.d.ts","sourceRoot":"","sources":["../../../src/view/ViewGroup.js"],"names":[],"mappings":"AAAA;IAEQ;;;OAGG;IACH,iBAAyB;IAGzB;;;OAGG;IACH,kBAAqB;IAGzB;;;OAGG;IACH,sBAMC;IAED;;;OAGG;IACH,4BAYC;IAED;;;OAGG;IACH,+BAqBC;IAED,mBAiBC;CACJ"}
@@ -31,7 +31,7 @@ export class ViewGroup {
31
31
  * @param {View} view
32
32
  */
33
33
  remove(view) {
34
- const removedElement = this.elements.remove(view);
34
+ const removedElement = this.elements.delete(view);
35
35
 
36
36
  if (removedElement) {
37
37
  if (this.container !== null) {
@@ -72,17 +72,19 @@ export class ViewGroup {
72
72
  }
73
73
 
74
74
  disconnect() {
75
- const iterator = this.elements.values();
75
+ const container = this.container;
76
76
 
77
- const views = Array.from(iterator);
77
+ if (container === null) {
78
+ return;
79
+ }
80
+
81
+ const views = Array.from(this.elements.values());
78
82
 
79
83
  const l = views.length;
80
84
 
81
85
  for (let i = 0; i < l; i++) {
82
-
83
- const view = views[i];
84
-
85
- this.container.addChild(view);
86
+ // detach: this is the inverse of connect(), which adds them
87
+ container.removeChild(views[i]);
86
88
  }
87
89
 
88
90
  this.container = null;
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Shown when WebGL context recovery has been abandoned, so the player sees an explanation instead of a
3
+ * black canvas.
4
+ *
5
+ * Strings are supplied by the caller. They default to English because this view exists precisely for the
6
+ * case where the renderer is dead, which is not a good moment to depend on the localization pipeline
7
+ * having the keys; an application that has them should pass localized strings in.
8
+ */
9
+ export class WebGLContextFailureView extends EmptyView {
10
+ /**
11
+ * @param {string} [title]
12
+ * @param {string} [text]
13
+ * @param {string} [action_label]
14
+ * @param {function} [action] invoked when the button is pressed, defaults to reloading the page
15
+ */
16
+ constructor({ title, text, action_label, action }?: string);
17
+ }
18
+ import EmptyView from "../elements/EmptyView.js";
19
+ //# sourceMappingURL=WebGLContextFailureView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebGLContextFailureView.d.ts","sourceRoot":"","sources":["../../../../src/view/graphics/WebGLContextFailureView.js"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AACH;IACI;;;;;OAKG;IACH,oDALW,MAAM,EA4DhB;CACJ;sBA1EqB,0BAA0B"}
@@ -0,0 +1,76 @@
1
+ import ButtonView from "../elements/button/ButtonView.js";
2
+ import EmptyView from "../elements/EmptyView.js";
3
+ import LabelView from "../common/LabelView.js";
4
+
5
+ /**
6
+ * Shown when WebGL context recovery has been abandoned, so the player sees an explanation instead of a
7
+ * black canvas.
8
+ *
9
+ * Strings are supplied by the caller. They default to English because this view exists precisely for the
10
+ * case where the renderer is dead, which is not a good moment to depend on the localization pipeline
11
+ * having the keys; an application that has them should pass localized strings in.
12
+ */
13
+ export class WebGLContextFailureView extends EmptyView {
14
+ /**
15
+ * @param {string} [title]
16
+ * @param {string} [text]
17
+ * @param {string} [action_label]
18
+ * @param {function} [action] invoked when the button is pressed, defaults to reloading the page
19
+ */
20
+ constructor({
21
+ title = 'Graphics device lost',
22
+ text = 'The graphics device stopped responding and could not be recovered. Reloading should fix it.',
23
+ action_label = 'Reload',
24
+ action = () => window.location.reload()
25
+ } = {}) {
26
+ super({
27
+ classList: ['webgl-context-failure-view'],
28
+ css: {
29
+ position: 'absolute',
30
+ left: 0,
31
+ top: 0,
32
+ width: '100%',
33
+ height: '100%',
34
+ display: 'flex',
35
+ flexDirection: 'column',
36
+ alignItems: 'center',
37
+ justifyContent: 'center',
38
+ // the canvas underneath holds whatever was on screen when the device died, dim it out
39
+ backgroundColor: 'rgba(0,0,0,0.82)',
40
+ color: '#f0f0f0',
41
+ fontFamily: 'sans-serif',
42
+ textAlign: 'center',
43
+ pointerEvents: 'auto',
44
+ zIndex: 1000
45
+ }
46
+ });
47
+
48
+ this.addChild(new LabelView(title, {
49
+ classList: ['title'],
50
+ css: {
51
+ fontSize: '1.6em',
52
+ marginBottom: '0.6em'
53
+ }
54
+ }));
55
+
56
+ this.addChild(new LabelView(text, {
57
+ classList: ['text'],
58
+ css: {
59
+ maxWidth: '30em',
60
+ marginBottom: '1.4em',
61
+ lineHeight: '1.4'
62
+ }
63
+ }));
64
+
65
+ this.addChild(new ButtonView({
66
+ action,
67
+ name: action_label,
68
+ classList: ['action'],
69
+ css: {
70
+ cursor: 'pointer',
71
+ padding: '0.5em 1.5em',
72
+ border: '1px solid #f0f0f0'
73
+ }
74
+ }));
75
+ }
76
+ }
@@ -21,6 +21,14 @@ declare class MinimapView extends View {
21
21
  __cameraViews: MinimapCameraView[];
22
22
  cameraObserver: EntityObserver;
23
23
  pointer: PointerDevice;
24
+ /**
25
+ * Detaches every camera view and forgets it.
26
+ *
27
+ * Called from {@link unlink}, where the observer teardown has usually
28
+ * emptied the list already, but it is also the only way for a caller to
29
+ * reset the view: leaving the entries behind would let a later camera
30
+ * removal detach a child that is no longer attached.
31
+ */
24
32
  clear(): void;
25
33
  }
26
34
  import View from "../View.js";
@@ -1 +1 @@
1
- {"version":3,"file":"Minimap.d.ts","sourceRoot":"","sources":["../../../../src/view/minimap/Minimap.js"],"names":[],"mappings":";AAmBA;IACI;;;;;OAKG;IACH,+EA0JC;IAvJG,YAAsD;IAEtD;;;OAGG;IACH,sCAAkC;IASpB,OAFJ,SAAS,CAEiC;IAKpD,wBAAgF;IAmBhF,oBAAwE;IAGxE,uBAAyB;IACzB,gCAA6B;IAMT,eAFV,iBAAiB,EAAE,CAEc;IA+B3C,+BAAyF;IA+BzE,uBAA2C;IA0C/D,cAKC;CAkDJ;iBAlOgB,YAAY;sBAXP,iCAAiC;+BAgBxB,wBAAwB;sBANjC,0BAA0B;iCAKf,0BAA0B;kCAHzB,4BAA4B;+BAV/B,oCAAoC;8BAMrC,6CAA6C"}
1
+ {"version":3,"file":"Minimap.d.ts","sourceRoot":"","sources":["../../../../src/view/minimap/Minimap.js"],"names":[],"mappings":";AAmBA;IACI;;;;;OAKG;IACH,+EA0JC;IAvJG,YAAsD;IAEtD;;;OAGG;IACH,sCAAkC;IASpB,OAFJ,SAAS,CAEiC;IAKpD,wBAAgF;IAmBhF,oBAAwE;IAGxE,uBAAyB;IACzB,gCAA6B;IAMT,eAFV,iBAAiB,EAAE,CAEc;IA+B3C,+BAAyF;IA+BzE,uBAA2C;IA0C/D;;;;;;;OAOG;IACH,cAUC;CAkDJ;iBA/OgB,YAAY;sBAXP,iCAAiC;+BAgBxB,wBAAwB;sBANjC,0BAA0B;iCAKf,0BAA0B;kCAHzB,4BAA4B;+BAV/B,oCAAoC;8BAMrC,6CAA6C"}
@@ -180,11 +180,24 @@ class MinimapView extends View {
180
180
 
181
181
  }
182
182
 
183
+ /**
184
+ * Detaches every camera view and forgets it.
185
+ *
186
+ * Called from {@link unlink}, where the observer teardown has usually
187
+ * emptied the list already, but it is also the only way for a caller to
188
+ * reset the view: leaving the entries behind would let a later camera
189
+ * removal detach a child that is no longer attached.
190
+ */
183
191
  clear() {
184
- for (let i = 0, l = this.__cameraViews.length; i < l; i++) {
185
- const v = this.__cameraViews[i];
186
- this.__worldView.addChild(v);
192
+ const views = this.__cameraViews;
193
+
194
+ // this used to call addChild, which attached each camera view a second
195
+ // time rather than removing it
196
+ for (let i = 0, l = views.length; i < l; i++) {
197
+ this.__worldView.removeChild(views[i]);
187
198
  }
199
+
200
+ views.length = 0;
188
201
  }
189
202
 
190
203
  link() {
@@ -1 +1 @@
1
- {"version":3,"file":"MinimapMarkerView.d.ts","sourceRoot":"","sources":["../../../../../src/view/minimap/dom/MinimapMarkerView.js"],"names":[],"mappings":"AAMA;IACI;;;;;;;OAOG;IACH,0FAiCC;IA9BG,SAAsD;IAEtD;;;OAGG;IACH,sBAAoB;IACpB;;;OAGG;IACH,qBAA0B;IAC1B,gBAA4B;IAoBhC,8DAEK;IAEL,+CAIK;IAEL,8CAGK;CAYR;iBA3EgB,eAAe"}
1
+ {"version":3,"file":"MinimapMarkerView.d.ts","sourceRoot":"","sources":["../../../../../src/view/minimap/dom/MinimapMarkerView.js"],"names":[],"mappings":"AAMA;IACI;;;;;;;OAOG;IACH,0FAmCC;IA9BG,SAAsD;IAEtD;;;OAGG;IACH,sBAAoB;IACpB;;;OAGG;IACH,qBAA0B;IAC1B,gBAA4B;IAoBhC,8DAEK;IAEL,+CAIK;IAEL,8CAGK;CAYR;iBA7EgB,eAAe"}
@@ -14,7 +14,9 @@ export class MinimapMarkerView extends View {
14
14
  * @constructor
15
15
  */
16
16
  constructor(entity, marker, transform, worldScale) {
17
- super(entity, this.marker, this.transform, this.worldScale);
17
+ // `this` is not available until super() returns; reading it here threw
18
+ // a ReferenceError on every construction
19
+ super(entity, marker, transform, worldScale);
18
20
 
19
21
  this.el = MinimapMarkerDOMElementPrototype.cloneNode();
20
22