@woosh/meep-engine 3.29.0 → 3.30.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 (226) hide show
  1. package/build/bundle-worker-image-decoder.js +1 -1
  2. package/build/bundle-worker-terrain.js +1 -1
  3. package/package.json +1 -1
  4. package/src/core/binary/BinaryBuffer.d.ts.map +1 -1
  5. package/src/core/binary/BinaryBuffer.js +14 -2
  6. package/src/core/bvh2/bvh3/BVH.d.ts.map +1 -1
  7. package/src/core/bvh2/bvh3/BVH.js +14 -1
  8. package/src/core/cache/FrequencySketch.d.ts +3 -1
  9. package/src/core/cache/FrequencySketch.d.ts.map +1 -1
  10. package/src/core/cache/FrequencySketch.js +10 -4
  11. package/src/core/cache/wtinylfu/CacheWTinylfu.d.ts.map +1 -1
  12. package/src/core/cache/wtinylfu/CacheWTinylfu.js +24 -2
  13. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadrics.d.ts +20 -0
  14. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadrics.d.ts.map +1 -1
  15. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadrics.js +69 -4
  16. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.d.ts +48 -18
  17. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.d.ts.map +1 -1
  18. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.js +262 -70
  19. package/src/core/geom/3d/topology/struct/binary/query/bt_edge_collapse_fold_limit.d.ts +25 -0
  20. package/src/core/geom/3d/topology/struct/binary/query/bt_edge_collapse_fold_limit.d.ts.map +1 -0
  21. package/src/core/geom/3d/topology/struct/binary/query/bt_edge_collapse_fold_limit.js +228 -0
  22. package/src/core/geom/3d/topology/struct/binary/query/bt_edge_collapse_would_fold.d.ts +13 -0
  23. package/src/core/geom/3d/topology/struct/binary/query/bt_edge_collapse_would_fold.d.ts.map +1 -1
  24. package/src/core/geom/3d/topology/struct/binary/query/bt_edge_collapse_would_fold.js +10 -128
  25. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_build_face_bvh.d.ts.map +1 -1
  26. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_build_face_bvh.js +11 -1
  27. package/src/core/graph/mn_graph_collapse_weighted_edge.js +6 -6
  28. package/src/core/math/lookup/ParameterLookupTable.d.ts.map +1 -1
  29. package/src/core/math/lookup/ParameterLookupTable.js +10 -5
  30. package/src/core/math/noise/sdnoise.d.ts.map +1 -1
  31. package/src/core/math/noise/sdnoise.js +16 -10
  32. package/src/core/model/object/ImmutableObjectPool.d.ts.map +1 -1
  33. package/src/core/model/object/ImmutableObjectPool.js +17 -7
  34. package/src/core/process/executor/ConcurrentExecutor.d.ts +1 -5
  35. package/src/core/process/executor/ConcurrentExecutor.d.ts.map +1 -1
  36. package/src/core/process/executor/ConcurrentExecutor.js +95 -1
  37. package/src/core/process/task/task_find_dependency_cycle.d.ts +17 -0
  38. package/src/core/process/task/task_find_dependency_cycle.d.ts.map +1 -0
  39. package/src/core/process/task/task_find_dependency_cycle.js +81 -0
  40. package/src/core/wfc/WFCCellChoice.d.ts +17 -0
  41. package/src/core/wfc/WFCCellChoice.d.ts.map +1 -0
  42. package/src/core/wfc/WFCCellChoice.js +36 -0
  43. package/src/core/wfc/WFCLattice.d.ts +105 -0
  44. package/src/core/wfc/WFCLattice.d.ts.map +1 -0
  45. package/src/core/wfc/WFCLattice.js +235 -0
  46. package/src/core/wfc/WFCRuleTable.d.ts +172 -0
  47. package/src/core/wfc/WFCRuleTable.d.ts.map +1 -0
  48. package/src/core/wfc/WFCRuleTable.js +334 -0
  49. package/src/core/wfc/WFCState.d.ts +273 -0
  50. package/src/core/wfc/WFCState.d.ts.map +1 -0
  51. package/src/core/wfc/WFCState.js +552 -0
  52. package/src/core/wfc/WFCStatus.d.ts +11 -0
  53. package/src/core/wfc/WFCStatus.d.ts.map +1 -0
  54. package/src/core/wfc/WFCStatus.js +28 -0
  55. package/src/core/wfc/WFCTileWeights.d.ts +48 -0
  56. package/src/core/wfc/WFCTileWeights.d.ts.map +1 -0
  57. package/src/core/wfc/WFCTileWeights.js +86 -0
  58. package/src/core/wfc/WFC_UNRESOLVED.d.ts +12 -0
  59. package/src/core/wfc/WFC_UNRESOLVED.d.ts.map +1 -0
  60. package/src/core/wfc/WFC_UNRESOLVED.js +11 -0
  61. package/src/core/wfc/wfc_estimate_bytes.d.ts +24 -0
  62. package/src/core/wfc/wfc_estimate_bytes.d.ts.map +1 -0
  63. package/src/core/wfc/wfc_estimate_bytes.js +47 -0
  64. package/src/core/wfc/wfc_rule_table_tile_components.d.ts +27 -0
  65. package/src/core/wfc/wfc_rule_table_tile_components.d.ts.map +1 -0
  66. package/src/core/wfc/wfc_rule_table_tile_components.js +80 -0
  67. package/src/core/wfc/wfc_solve.d.ts +21 -0
  68. package/src/core/wfc/wfc_solve.d.ts.map +1 -0
  69. package/src/core/wfc/wfc_solve.js +154 -0
  70. package/src/core/wfc/wfc_state_apply_boundary.d.ts +18 -0
  71. package/src/core/wfc/wfc_state_apply_boundary.d.ts.map +1 -0
  72. package/src/core/wfc/wfc_state_apply_boundary.js +61 -0
  73. package/src/core/wfc/wfc_state_assign.d.ts +11 -0
  74. package/src/core/wfc/wfc_state_assign.d.ts.map +1 -0
  75. package/src/core/wfc/wfc_state_assign.js +36 -0
  76. package/src/core/wfc/wfc_state_ban_bits.d.ts +17 -0
  77. package/src/core/wfc/wfc_state_ban_bits.d.ts.map +1 -0
  78. package/src/core/wfc/wfc_state_ban_bits.js +81 -0
  79. package/src/core/wfc/wfc_state_collapse.d.ts +12 -0
  80. package/src/core/wfc/wfc_state_collapse.d.ts.map +1 -0
  81. package/src/core/wfc/wfc_state_collapse.js +73 -0
  82. package/src/core/wfc/wfc_state_flush_dirty.d.ts +12 -0
  83. package/src/core/wfc/wfc_state_flush_dirty.d.ts.map +1 -0
  84. package/src/core/wfc/wfc_state_flush_dirty.js +39 -0
  85. package/src/core/wfc/wfc_state_propagate.d.ts +14 -0
  86. package/src/core/wfc/wfc_state_propagate.d.ts.map +1 -0
  87. package/src/core/wfc/wfc_state_propagate.js +155 -0
  88. package/src/core/wfc/wfc_state_read.d.ts +11 -0
  89. package/src/core/wfc/wfc_state_read.d.ts.map +1 -0
  90. package/src/core/wfc/wfc_state_read.js +38 -0
  91. package/src/core/wfc/wfc_state_restrict.d.ts +18 -0
  92. package/src/core/wfc/wfc_state_restrict.d.ts.map +1 -0
  93. package/src/core/wfc/wfc_state_restrict.js +39 -0
  94. package/src/core/wfc/wfc_state_set_eligible.d.ts +24 -0
  95. package/src/core/wfc/wfc_state_set_eligible.d.ts.map +1 -0
  96. package/src/core/wfc/wfc_state_set_eligible.js +49 -0
  97. package/src/core/wfc/wfc_state_undo_to.d.ts +13 -0
  98. package/src/core/wfc/wfc_state_undo_to.d.ts.map +1 -0
  99. package/src/core/wfc/wfc_state_undo_to.js +84 -0
  100. package/src/core/wfc/wfc_words_per_cell.d.ts +11 -0
  101. package/src/core/wfc/wfc_words_per_cell.d.ts.map +1 -0
  102. package/src/core/wfc/wfc_words_per_cell.js +16 -0
  103. package/src/engine/ecs/EntityComponentDataset.d.ts +8 -0
  104. package/src/engine/ecs/EntityComponentDataset.d.ts.map +1 -1
  105. package/src/engine/ecs/EntityComponentDataset.js +37 -14
  106. package/src/engine/ecs/fow/FogOfWarRevealerSystem.d.ts +8 -1
  107. package/src/engine/ecs/fow/FogOfWarRevealerSystem.d.ts.map +1 -1
  108. package/src/engine/ecs/fow/FogOfWarRevealerSystem.js +37 -2
  109. package/src/engine/ecs/guid/UUID.d.ts.map +1 -1
  110. package/src/engine/ecs/guid/UUID.js +45 -17
  111. package/src/engine/ecs/ik/OneBoneSurfaceAlignmentSolver.d.ts.map +1 -1
  112. package/src/engine/ecs/ik/OneBoneSurfaceAlignmentSolver.js +3 -1
  113. package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.d.ts.map +1 -1
  114. package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.js +366 -360
  115. package/src/engine/graphics/texture/sampler/resize/sampler2d_scale_down_linear.d.ts.map +1 -1
  116. package/src/engine/graphics/texture/sampler/resize/sampler2d_scale_down_linear.js +24 -10
  117. package/src/engine/grid/grid2transform/GridPosition2TransformSystem.d.ts.map +1 -1
  118. package/src/engine/grid/grid2transform/GridPosition2TransformSystem.js +24 -5
  119. package/src/engine/interpolation/Interpoland.d.ts +7 -1
  120. package/src/engine/interpolation/Interpoland.d.ts.map +1 -1
  121. package/src/engine/interpolation/Interpoland.js +8 -1
  122. package/src/engine/interpolation/InterpolationSystem.d.ts.map +1 -1
  123. package/src/engine/interpolation/InterpolationSystem.js +3 -0
  124. package/src/engine/interpolation/TransformPoseSerializationAdapter.d.ts +5 -3
  125. package/src/engine/interpolation/TransformPoseSerializationAdapter.d.ts.map +1 -1
  126. package/src/engine/interpolation/TransformPoseSerializationAdapter.js +14 -3
  127. package/src/engine/interpolation/pose_interpoland.d.ts.map +1 -1
  128. package/src/engine/interpolation/pose_interpoland.js +2 -0
  129. package/src/engine/network/orchestrator/NetworkPeer.d.ts.map +1 -1
  130. package/src/engine/network/orchestrator/NetworkPeer.js +15 -10
  131. package/src/engine/physics/cloth/ecs/ClothWorld.d.ts.map +1 -1
  132. package/src/engine/physics/cloth/ecs/ClothWorld.js +17 -0
  133. package/src/engine/physics/mls-mpm/MLS_MPM.d.ts.map +1 -1
  134. package/src/engine/physics/mls-mpm/MLS_MPM.js +14 -0
  135. package/src/engine/sound/sopra/definition/clip/AbstractAudioClip.d.ts +2 -1
  136. package/src/engine/sound/sopra/definition/clip/AbstractAudioClip.d.ts.map +1 -1
  137. package/src/engine/sound/sopra/definition/clip/AbstractAudioClip.js +1 -1
  138. package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClip.d.ts +1 -0
  139. package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClip.d.ts.map +1 -1
  140. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.d.ts +1 -0
  141. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.d.ts.map +1 -1
  142. package/src/engine/sound/sopra/definition/clip/SampleAudioClip.d.ts +2 -1
  143. package/src/engine/sound/sopra/definition/clip/SampleAudioClip.d.ts.map +1 -1
  144. package/src/engine/sound/sopra/definition/clip/SampleAudioClip.js +12 -3
  145. package/src/engine/sound/sopra/definition/clip/SequenceContainerAudioClip.d.ts +1 -0
  146. package/src/engine/sound/sopra/definition/clip/SequenceContainerAudioClip.d.ts.map +1 -1
  147. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.d.ts +1 -0
  148. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.d.ts.map +1 -1
  149. package/src/engine/sound/sopra/runtime/EventInstance.d.ts.map +1 -1
  150. package/src/engine/sound/sopra/runtime/EventInstance.js +4 -1
  151. package/src/format/image/avif/av1/decode/decode_coefficients.d.ts.map +1 -1
  152. package/src/format/image/avif/av1/decode/decode_coefficients.js +248 -259
  153. package/src/format/image/avif/av1/decode/read_golomb.d.ts +21 -0
  154. package/src/format/image/avif/av1/decode/read_golomb.d.ts.map +1 -0
  155. package/src/format/image/avif/av1/decode/read_golomb.js +49 -0
  156. package/src/format/image/avif/av1/filter/loop_restoration.js +461 -451
  157. package/src/format/image/avif/av1/util/round2.d.ts +19 -2
  158. package/src/format/image/avif/av1/util/round2.d.ts.map +1 -1
  159. package/src/format/image/avif/av1/util/round2.js +51 -27
  160. package/src/format/image/avif/heif/parse_avif_file.js +24 -0
  161. package/src/shade/renderer/buffer/table/GPUTypedTable.d.ts.map +1 -1
  162. package/src/shade/renderer/buffer/table/GPUTypedTable.js +14 -0
  163. package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_DESIGN.md +46 -3
  164. package/src/shade/renderer/geometry/virtual/WEDGE_PLAN_2026_09_18.md +91 -1
  165. package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts +0 -13
  166. package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts.map +1 -1
  167. package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.js +0 -15
  168. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_group_step.js +5 -5
  169. package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_DEFAULT_ATTRIBUTE_WEIGHT_RATIOS.d.ts +11 -1
  170. package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_DEFAULT_ATTRIBUTE_WEIGHT_RATIOS.d.ts.map +1 -1
  171. package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_DEFAULT_ATTRIBUTE_WEIGHT_RATIOS.js +11 -1
  172. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_normals.d.ts +18 -9
  173. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_normals.d.ts.map +1 -1
  174. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_normals.js +20 -26
  175. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_normalize_source.d.ts +1 -3
  176. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_normalize_source.d.ts.map +1 -1
  177. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_normalize_source.js +2 -5
  178. package/src/shade/renderer/geometry/virtual/build/vgeo_build.js +1 -1
  179. package/src/shade/renderer/geometry/virtual/runtime/VGeoResidency.d.ts.map +1 -1
  180. package/src/shade/renderer/geometry/virtual/runtime/VGeoResidency.js +14 -1
  181. package/src/shade/renderer/global_illumination/probe/octahedral/GPUProbeAtlas.d.ts.map +1 -1
  182. package/src/shade/renderer/global_illumination/probe/octahedral/GPUProbeAtlas.js +12 -3
  183. package/src/shade/renderer/light/environment/rgbe/RGBE_ReadPixels_RLE.d.ts.map +1 -1
  184. package/src/shade/renderer/light/environment/rgbe/RGBE_ReadPixels_RLE.js +7 -1
  185. package/src/shade/renderer/lightmap/GPULightMap.d.ts.map +1 -1
  186. package/src/shade/renderer/lightmap/GPULightMap.js +349 -336
  187. package/src/shade/renderer/loader/gltf/load_gltf.d.ts.map +1 -1
  188. package/src/shade/renderer/loader/gltf/load_gltf.js +1137 -1128
  189. package/src/shade/renderer/particles/DESIGN.md +14 -5
  190. package/src/shade/renderer/particles/GPUParticleSystem.d.ts +25 -10
  191. package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
  192. package/src/shade/renderer/particles/GPUParticleSystem.js +182 -38
  193. package/src/shade/renderer/particles/graph/groups/simplex_reference.d.ts.map +1 -1
  194. package/src/shade/renderer/particles/graph/groups/simplex_reference.js +16 -10
  195. package/src/shade/renderer/particles/graph_particles.d.ts +4 -2
  196. package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
  197. package/src/shade/renderer/particles/graph_particles.js +8 -2
  198. package/src/shade/renderer/particles/optimizer/particle_vm_semantics.d.ts.map +1 -1
  199. package/src/shade/renderer/particles/optimizer/particle_vm_semantics.js +8 -2
  200. package/src/shade/renderer/particles/optimizer/pass_fold_constants.d.ts.map +1 -1
  201. package/src/shade/renderer/particles/optimizer/pass_fold_constants.js +10 -4
  202. package/src/shade/renderer/particles/shaders/shader_particle_init_free_list.d.ts +31 -0
  203. package/src/shade/renderer/particles/shaders/shader_particle_init_free_list.d.ts.map +1 -0
  204. package/src/shade/renderer/particles/shaders/shader_particle_init_free_list.js +62 -0
  205. package/src/shade/renderer/particles/vm/ParticleVMReference.d.ts +13 -0
  206. package/src/shade/renderer/particles/vm/ParticleVMReference.d.ts.map +1 -1
  207. package/src/shade/renderer/particles/vm/ParticleVMReference.js +95 -17
  208. package/src/shade/renderer/rasterize/bucket/rasterization_has_opaque_bucket.d.ts +21 -0
  209. package/src/shade/renderer/rasterize/bucket/rasterization_has_opaque_bucket.d.ts.map +1 -0
  210. package/src/shade/renderer/rasterize/bucket/rasterization_has_opaque_bucket.js +28 -0
  211. package/src/shade/renderer/rasterize/fast/graph_rasterize_scene_fast.d.ts.map +1 -1
  212. package/src/shade/renderer/rasterize/fast/graph_rasterize_scene_fast.js +19 -2
  213. package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.d.ts.map +1 -1
  214. package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.js +19 -2
  215. package/src/shade/renderer/shader/type/WebGPUStruct.d.ts.map +1 -1
  216. package/src/shade/renderer/shader/type/WebGPUStruct.js +12 -0
  217. package/src/shade/renderer/texture/mipmaps/WebGPUMipmapGenerator.d.ts +8 -2
  218. package/src/shade/renderer/texture/mipmaps/WebGPUMipmapGenerator.d.ts.map +1 -1
  219. package/src/shade/renderer/texture/mipmaps/WebGPUMipmapGenerator.js +41 -6
  220. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +2383 -2356
  221. package/src/view/tooltip/DomTooltipManager.d.ts +7 -0
  222. package/src/view/tooltip/DomTooltipManager.d.ts.map +1 -1
  223. package/src/view/tooltip/DomTooltipManager.js +22 -0
  224. package/src/view/tooltip/DomTooltipObserver.d.ts.map +1 -1
  225. package/src/view/tooltip/DomTooltipObserver.js +13 -3
  226. package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_CREASE_ANGLE.js +0 -45
@@ -29,6 +29,13 @@ export class DomTooltipManager {
29
29
  * @private
30
30
  */
31
31
  private __showDelayTimeout;
32
+ /**
33
+ * Whose show the pending {@link __showDelayTimeout} belongs to, so {@link remove} can cancel one
34
+ * it owns without cancelling another view's.
35
+ * @type {DomTooltipObserver|null}
36
+ * @private
37
+ */
38
+ private __showDelayObserver;
32
39
  /**
33
40
  * @readonly
34
41
  * @private
@@ -1 +1 @@
1
- {"version":3,"file":"DomTooltipManager.d.ts","sourceRoot":"","sources":["../../../../src/view/tooltip/DomTooltipManager.js"],"names":[],"mappings":"AAEA;;;GAGG;AAGH;;GAEG;AACH;IAsBI;;;OAGG;IACH,wBAFW,cAAc,EASxB;IAhCD;;;;OAIG;IACH,sBAAqB;IAErB;;;;OAIG;IACH,oBAAkB;IAElB;;;;OAIG;IACH,2BAAwB;IAOpB;;;;OAIG;IACH,4BAA4B;IAGhC;;;OAGG;IACH,iBAFa,cAAc,CAI1B;IAED;;;OAGG;IACH,eAFW,kBAAkB,QAM5B;IAED;;;OAGG;IACH,eAFW,kBAAkB,QAM5B;IAED,wBAQC;IAED;;;;OAIG;IACH,gBAHW,IAAI,GACF,OAAO,CAiBnB;IAED;;;;;OAKG;IACH,aAJW,IAAI,iDAYd;IAED;;;OAGG;IACH,oBAMC;IAED,0BAOC;IAED;;;OAGG;IACH,uBAIC;IAED;;;;;;OAMG;IACH,UAJW,IAAI,iDAmBd;IAED;;;OAGG;IACH,gBAFW,IAAI,QAkBd;CACJ;mBAnMY,OAAO,YAAY,EAAE,OAAO;6BAC5B,OAAO,qBAAqB,EAAE,cAAc;mCAJtB,yBAAyB"}
1
+ {"version":3,"file":"DomTooltipManager.d.ts","sourceRoot":"","sources":["../../../../src/view/tooltip/DomTooltipManager.js"],"names":[],"mappings":"AAEA;;;GAGG;AAGH;;GAEG;AACH;IA8BI;;;OAGG;IACH,wBAFW,cAAc,EASxB;IAxCD;;;;OAIG;IACH,sBAAqB;IAErB;;;;OAIG;IACH,oBAAkB;IAElB;;;;OAIG;IACH,2BAAwB;IAExB;;;;;OAKG;IACH,4BAA2B;IAOvB;;;;OAIG;IACH,4BAA4B;IAGhC;;;OAGG;IACH,iBAFa,cAAc,CAI1B;IAED;;;OAGG;IACH,eAFW,kBAAkB,QAM5B;IAED;;;OAGG;IACH,eAFW,kBAAkB,QAM5B;IAED,wBAQC;IAED;;;;OAIG;IACH,gBAHW,IAAI,GACF,OAAO,CAiBnB;IAED;;;;;OAKG;IACH,aAJW,IAAI,iDAYd;IAED;;;OAGG;IACH,oBASC;IAED,0BAQC;IAED;;;OAGG;IACH,uBAIC;IAED;;;;;;OAMG;IACH,UAJW,IAAI,iDAmBd;IAED;;;OAGG;IACH,gBAFW,IAAI,QA4Bd;CACJ;mBAzNY,OAAO,YAAY,EAAE,OAAO;6BAC5B,OAAO,qBAAqB,EAAE,cAAc;mCAJtB,yBAAyB"}
@@ -31,6 +31,14 @@ export class DomTooltipManager {
31
31
  */
32
32
  __showDelayTimeout = -1;
33
33
 
34
+ /**
35
+ * Whose show the pending {@link __showDelayTimeout} belongs to, so {@link remove} can cancel one
36
+ * it owns without cancelling another view's.
37
+ * @type {DomTooltipObserver|null}
38
+ * @private
39
+ */
40
+ __showDelayObserver = null;
41
+
34
42
  /**
35
43
  *
36
44
  * @param {TooltipManager} tipManager
@@ -127,7 +135,10 @@ export class DomTooltipManager {
127
135
  requestShow(observer) {
128
136
  this.cancelShowRequest();
129
137
 
138
+ this.__showDelayObserver = observer;
130
139
  this.__showDelayTimeout = setTimeout(() => {
140
+ this.__showDelayObserver = null;
141
+ this.__showDelayTimeout = -1;
131
142
  this.show(observer);
132
143
  }, this.__showDelay);
133
144
  }
@@ -138,6 +149,7 @@ export class DomTooltipManager {
138
149
  //cancel timeout
139
150
  clearTimeout(this.__showDelayTimeout);
140
151
  this.__showDelayTimeout = -1;
152
+ this.__showDelayObserver = null;
141
153
  }
142
154
  }
143
155
 
@@ -187,6 +199,16 @@ export class DomTooltipManager {
187
199
  return;
188
200
  }
189
201
 
202
+ /**
203
+ * A show that is still pending belongs to an observer that is about to stop existing, and
204
+ * `on.exited` — the only other route to `cancelShowRequest` — cannot fire once the observer
205
+ * is torn down. Left alone, the timer fired `show` for a view that had already left the
206
+ * document, appending a tooltip that nothing could dismiss: `live` no longer maps the view.
207
+ */
208
+ if (this.__showDelayObserver === observer) {
209
+ this.cancelShowRequest();
210
+ }
211
+
190
212
  //hide if shown
191
213
  this.hide(observer);
192
214
 
@@ -1 +1 @@
1
- {"version":3,"file":"DomTooltipObserver.d.ts","sourceRoot":"","sources":["../../../../src/view/tooltip/DomTooltipObserver.js"],"names":[],"mappings":"AAQA;;GAEG;AAEH;IACI;;;;;OAKG;IACH,kBAJW,IAAI,2CAoEd;IA/DG;;;OAGG;IACH,MAFU,IAAI,CAEE;IAEhB;;;OAGG;IACH,kBAAsB;IAItB;;;OAGG;IACH,oBAFU,SAAS,CAEyB;IAE5C;;;OAGG;IACH,KAFU,SAAS,CAEkD;IAErE;;;MAGC;IAEiB,2BAA2C;IAG7D,8BAAgC;IAGhC,0BAKC;IAGD,6BAOC;IAED,6BAOC;IAIL,yCAIC;IAED,yBAWC;IAED,2BAmBC;IAGD,6BAmBC;IAED,aAUC;IAED,eASC;CACJ;mBAhKY,OAAO,YAAY,EAAE,OAAO;sBATnB,iCAAiC;0BAC7B,gBAAgB;mBACvB,oCAAoC;4BAC3B,qCAAqC;gCACjC,4BAA4B;8BAC9B,2CAA2C"}
1
+ {"version":3,"file":"DomTooltipObserver.d.ts","sourceRoot":"","sources":["../../../../src/view/tooltip/DomTooltipObserver.js"],"names":[],"mappings":"AAQA;;GAEG;AAEH;IACI;;;;;OAKG;IACH,kBAJW,IAAI,2CAoEd;IA/DG;;;OAGG;IACH,MAFU,IAAI,CAEE;IAEhB;;;OAGG;IACH,kBAAsB;IAItB;;;OAGG;IACH,oBAFU,SAAS,CAEyB;IAE5C;;;OAGG;IACH,KAFU,SAAS,CAEkD;IAErE;;;MAGC;IAEiB,2BAA2C;IAG7D,8BAAgC;IAGhC,0BAKC;IAGD,6BAOC;IAED,6BAOC;IAIL,yCAIC;IAED,yBAWC;IAED,2BAmBC;IAGD,6BAmBC;IAED,aAUC;IAED,eAmBC;CACJ;mBA1KY,OAAO,YAAY,EAAE,OAAO;sBATnB,iCAAiC;0BAC7B,gBAAgB;mBACvB,oCAAoC;4BAC3B,qCAAqC;gCACjC,4BAA4B;8BAC9B,2CAA2C"}
@@ -160,9 +160,19 @@ export class DomTooltipObserver {
160
160
  unlink() {
161
161
  const view = this.view;
162
162
 
163
- if (view.isLinked) {
164
- this.__handleViewUnlinked();
165
- }
163
+ /**
164
+ * Unconditionally, and not `if (view.isLinked)`. `View.unlink` clears the flag *before* it
165
+ * sends `on.unlinked`, and the manager's own `remove` handler sits ahead of
166
+ * `__handleViewUnlinked` on that same signal — so by the time this ran the flag was already
167
+ * false and the teardown was skipped, and then the line below removed
168
+ * `__handleViewUnlinked` from the Map the dispatch was still walking, so it never ran
169
+ * either. Two DOM listeners and four bindings survived every link/unlink cycle.
170
+ *
171
+ * Safe to run twice: `removeEventListener` is a no-op for a listener that is gone,
172
+ * `SignalBinding#unlink` returns early when it is already unlinked, and the mouse-leave is
173
+ * gated on `isEntered`.
174
+ */
175
+ this.__handleViewUnlinked();
166
176
 
167
177
  view.on.linked.remove(this.__handleViewLinked, this);
168
178
  view.on.unlinked.remove(this.__handleViewUnlinked, this);
@@ -1,45 +0,0 @@
1
- /**
2
- * How far two triangles may turn across a shared edge before the builder stops pretending the
3
- * surface is smooth there, in degrees.
4
- *
5
- * Only ever applied to normals the builder *synthesizes*. A source that authored its own normals has
6
- * already answered this question, and its answer is the one that ships.
7
- *
8
- * **What it is for.** Averaging every face around a vertex into one direction is right for a surface
9
- * and wrong for a corner, and a mesh does not say which it is — so an angle has to. A cube is the
10
- * whole argument: its eight corner vertices each meet three faces, and one direction for all three
11
- * is ninety degrees wrong for two of them. Measured on Zorah's `mesh1[0]`, whose source is
12
- * `POSITION`-only and so gets every normal from this pass, the angle between a shipped corner's
13
- * normal and the normal of the triangle that corner belongs to ran to a mean of 8.60 degrees and a
14
- * p99 of 37.66 at LOD 0 — the numbers `WEDGE_PLAN_2026_09_18.md` §1 records — before a single
15
- * collapse.
16
- *
17
- * **Why 45.** A threshold splits a curve as readily as a corner, so it is a trade: too low and a
18
- * coarsely tessellated cylinder gains a crease at every segment, too high and a box stays soft.
19
- * Swept over that same primitive, over its whole DAG:
20
- *
21
- * | crease | vertices/triangle | LOD 0 mean | LOD 0 p99 | all levels p99 | share over 30° |
22
- * |---|---|---|---|---|---|
23
- * | none | 0.641 | 8.60 | 37.66 | 54.27 | 6.5% |
24
- * | 60° | 0.646 | 8.42 | 35.26 | 52.60 | 6.2% |
25
- * | **45°** | **0.661** | **8.05** | **32.19** | **50.29** | **5.3%** |
26
- * | 30° | 0.724 | 7.04 | 26.88 | 45.97 | 3.6% |
27
- * | 20° | 0.880 | 5.53 | 20.58 | 38.65 | 2.0% |
28
- *
29
- * A wedge is a shipped vertex, so that first column is very nearly the size of the asset: 45 degrees
30
- * costs 3%, 30 costs 13% and 20 costs 37%. The curve is smooth because *this* mesh's residual is
31
- * mostly tessellation rather than creases — it keeps improving as the threshold falls, right through
32
- * the range where a cylinder would start faceting, which is the sign that the number below is a
33
- * judgement about content and not a fact about arithmetic. Hard-surface content is where it earns
34
- * its keep and where the choice is obvious: every edge of a box is ninety degrees, and any threshold
35
- * under that keeps all of them.
36
- *
37
- * So it is also {@link VGeoBuildOptions#crease_angle}, and a conversion of one kind of content can
38
- * say so.
39
- *
40
- * @type {number}
41
- *
42
- * @author Alex Goldring
43
- * @copyright Company Named Limited (c) 2026
44
- */
45
- export const VGEO_CREASE_ANGLE = 45;