@woosh/meep-engine 3.59.0 → 3.60.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 (326) hide show
  1. package/package.json +1 -1
  2. package/src/shade/playground/probe_clipmap/index.html +12 -0
  3. package/src/shade/playground/probe_clipmap/main.d.ts.map +1 -1
  4. package/src/shade/playground/probe_clipmap/main.js +5 -0
  5. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  6. package/src/shade/renderer/Renderer.js +4 -6
  7. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts +63 -1
  8. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts.map +1 -1
  9. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js +228 -16
  10. package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.d.ts +27 -4
  11. package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.d.ts.map +1 -1
  12. package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.js +526 -23
  13. package/src/shade/renderer/geometry/sdf/cards/MeshCardCaptureMode.d.ts +11 -0
  14. package/src/shade/renderer/geometry/sdf/cards/MeshCardCaptureMode.d.ts.map +1 -0
  15. package/src/shade/renderer/geometry/sdf/cards/MeshCardCaptureMode.js +21 -0
  16. package/src/shade/renderer/geometry/sdf/cards/mesh_cards_raster_pass_descriptor.d.ts +65 -0
  17. package/src/shade/renderer/geometry/sdf/cards/mesh_cards_raster_pass_descriptor.d.ts.map +1 -0
  18. package/src/shade/renderer/geometry/sdf/cards/mesh_cards_raster_pass_descriptor.js +376 -0
  19. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_capture.d.ts +7 -3
  20. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_capture.d.ts.map +1 -1
  21. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_capture.js +70 -6
  22. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_raster_args.d.ts +20 -0
  23. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_raster_args.d.ts.map +1 -0
  24. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_raster_args.js +80 -0
  25. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_raster_scatter.d.ts +18 -0
  26. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_raster_scatter.d.ts.map +1 -0
  27. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_raster_scatter.js +113 -0
  28. package/src/shade/renderer/geometry/virtual/sdf/VGEO_SDF.d.ts +47 -0
  29. package/src/shade/renderer/geometry/virtual/sdf/VGEO_SDF.d.ts.map +1 -0
  30. package/src/shade/renderer/geometry/virtual/sdf/VGEO_SDF.js +80 -0
  31. package/src/shade/renderer/geometry/virtual/sdf/VGeoSDFProxies.d.ts +91 -0
  32. package/src/shade/renderer/geometry/virtual/sdf/VGeoSDFProxies.d.ts.map +1 -0
  33. package/src/shade/renderer/geometry/virtual/sdf/VGeoSDFProxies.js +902 -0
  34. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_collect.d.ts +16 -0
  35. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_collect.d.ts.map +1 -0
  36. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_collect.js +67 -0
  37. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_decode.d.ts +17 -0
  38. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_decode.d.ts.map +1 -0
  39. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_decode.js +145 -0
  40. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_traverse.d.ts +12 -0
  41. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_traverse.d.ts.map +1 -0
  42. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_traverse.js +105 -0
  43. package/src/shade/renderer/global_illumination/probe/octahedral/shader_lpv_build_gbuffer.d.ts.map +1 -1
  44. package/src/shade/renderer/global_illumination/probe/octahedral/shader_lpv_build_gbuffer.js +2 -1
  45. package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.d.ts +3 -9
  46. package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.d.ts.map +1 -1
  47. package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.js +13 -31
  48. package/src/shade/renderer/global_illumination/probe_clipmap/PROBE_CLIPMAP_PROPOSAL_2026_10_27.md +764 -48
  49. package/src/shade/renderer/global_illumination/probe_clipmap/PROBE_RAYS_VARIABLE_AND_SORTED_SCOPE_2026_10_30.md +410 -0
  50. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.d.ts +3 -2
  51. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.d.ts.map +1 -1
  52. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.js +4 -3
  53. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.d.ts +41 -17
  54. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.d.ts.map +1 -1
  55. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.js +57 -33
  56. package/src/shade/renderer/global_illumination/probe_clipmap/brick/BRICK_CLIPMAP.d.ts +11 -3
  57. package/src/shade/renderer/global_illumination/probe_clipmap/brick/BRICK_CLIPMAP.d.ts.map +1 -1
  58. package/src/shade/renderer/global_illumination/probe_clipmap/brick/BRICK_CLIPMAP.js +13 -4
  59. package/src/shade/renderer/global_illumination/probe_clipmap/brick/GPUBrickClipmap.d.ts +9 -18
  60. package/src/shade/renderer/global_illumination/probe_clipmap/brick/GPUBrickClipmap.d.ts.map +1 -1
  61. package/src/shade/renderer/global_illumination/probe_clipmap/brick/GPUBrickClipmap.js +8 -10
  62. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap.d.ts +12 -0
  63. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap.d.ts.map +1 -1
  64. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap.js +28 -0
  65. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap_trace.d.ts +1 -29
  66. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap_trace.d.ts.map +1 -1
  67. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap_trace.js +1 -74
  68. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK.d.ts +161 -0
  69. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK.d.ts.map +1 -0
  70. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK.js +219 -0
  71. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK_INSTANCE_STRUCT.d.ts +1 -8
  72. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK_INSTANCE_STRUCT.d.ts.map +1 -1
  73. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK_INSTANCE_STRUCT.js +1 -9
  74. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MeshSDFBrickProvider.d.ts +40 -12
  75. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MeshSDFBrickProvider.d.ts.map +1 -1
  76. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MeshSDFBrickProvider.js +373 -31
  77. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_instance.d.ts +2 -1
  78. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_instance.d.ts.map +1 -1
  79. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_instance.js +2 -1
  80. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_texel.d.ts +15 -8
  81. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_texel.d.ts.map +1 -1
  82. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_texel.js +28 -14
  83. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_walk.d.ts +23 -0
  84. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_walk.d.ts.map +1 -0
  85. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_walk.js +66 -0
  86. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_batch.d.ts +29 -0
  87. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_batch.d.ts.map +1 -0
  88. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_batch.js +210 -0
  89. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_command.d.ts +29 -0
  90. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_command.d.ts.map +1 -0
  91. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_command.js +86 -0
  92. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_gather.d.ts +41 -0
  93. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_gather.d.ts.map +1 -0
  94. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_gather.js +439 -0
  95. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_resolve.d.ts +23 -0
  96. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_resolve.d.ts.map +1 -0
  97. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_resolve.js +135 -0
  98. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_free.d.ts +3 -1
  99. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_free.d.ts.map +1 -1
  100. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_free.js +12 -3
  101. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts +21 -18
  102. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts.map +1 -1
  103. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.js +254 -73
  104. package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.d.ts +149 -8
  105. package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.d.ts.map +1 -1
  106. package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.js +181 -13
  107. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.d.ts +179 -7
  108. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.d.ts.map +1 -1
  109. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.js +412 -31
  110. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_pick.js +4 -4
  111. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_sample_radiance.d.ts.map +1 -1
  112. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_sample_radiance.js +4 -3
  113. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.d.ts +36 -10
  114. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.d.ts.map +1 -1
  115. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.js +218 -29
  116. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_admit.d.ts +5 -1
  117. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_admit.d.ts.map +1 -1
  118. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_admit.js +24 -14
  119. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.d.ts +15 -6
  120. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.d.ts.map +1 -1
  121. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.js +21 -22
  122. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_guide.d.ts +36 -0
  123. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_guide.d.ts.map +1 -0
  124. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_guide.js +257 -0
  125. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_light.d.ts +18 -7
  126. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_light.d.ts.map +1 -1
  127. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_light.js +157 -51
  128. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_order.d.ts +23 -0
  129. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_order.d.ts.map +1 -0
  130. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_order.js +110 -0
  131. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_project.d.ts +24 -2
  132. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_project.d.ts.map +1 -1
  133. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_project.js +90 -10
  134. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_ray_layout.d.ts +45 -0
  135. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_ray_layout.d.ts.map +1 -0
  136. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_ray_layout.js +205 -0
  137. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_relocate.js +1 -1
  138. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_retire.d.ts +16 -3
  139. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_retire.d.ts.map +1 -1
  140. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_retire.js +55 -10
  141. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_schedule.d.ts +19 -4
  142. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_schedule.d.ts.map +1 -1
  143. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_schedule.js +60 -6
  144. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.d.ts +10 -9
  145. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.d.ts.map +1 -1
  146. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.js +32 -39
  147. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.d.ts +21 -14
  148. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.d.ts.map +1 -1
  149. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.js +100 -30
  150. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace_command.d.ts +6 -2
  151. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace_command.d.ts.map +1 -1
  152. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace_command.js +26 -10
  153. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_hits.d.ts +3 -2
  154. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_hits.d.ts.map +1 -1
  155. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_hits.js +12 -12
  156. package/src/shade/renderer/gpu_primitive/sort/SORT_DIGIT_SETTINGS_STRUCT.d.ts +10 -0
  157. package/src/shade/renderer/gpu_primitive/sort/SORT_DIGIT_SETTINGS_STRUCT.d.ts.map +1 -0
  158. package/src/shade/renderer/gpu_primitive/sort/SORT_DIGIT_SETTINGS_STRUCT.js +21 -0
  159. package/src/shade/renderer/gpu_primitive/sort/SORT_PASS_SETTINGS_STRUCT.d.ts +5 -2
  160. package/src/shade/renderer/gpu_primitive/sort/SORT_PASS_SETTINGS_STRUCT.d.ts.map +1 -1
  161. package/src/shade/renderer/gpu_primitive/sort/SORT_PASS_SETTINGS_STRUCT.js +31 -23
  162. package/src/shade/renderer/gpu_primitive/sort/SORT_SIZE_STRUCT.d.ts +10 -0
  163. package/src/shade/renderer/gpu_primitive/sort/SORT_SIZE_STRUCT.d.ts.map +1 -0
  164. package/src/shade/renderer/gpu_primitive/sort/SORT_SIZE_STRUCT.js +22 -0
  165. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_constants.d.ts +9 -0
  166. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_constants.d.ts.map +1 -0
  167. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_constants.js +18 -0
  168. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_digit.d.ts +8 -3
  169. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_digit.d.ts.map +1 -1
  170. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_digit.js +41 -32
  171. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_histogram_tile.d.ts +31 -0
  172. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_histogram_tile.d.ts.map +1 -0
  173. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_histogram_tile.js +71 -0
  174. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_scatter_tile.d.ts +47 -0
  175. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_scatter_tile.d.ts.map +1 -0
  176. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_scatter_tile.js +210 -0
  177. package/src/shade/renderer/gpu_primitive/sort/defs.d.ts +5 -4
  178. package/src/shade/renderer/gpu_primitive/sort/defs.d.ts.map +1 -1
  179. package/src/shade/renderer/gpu_primitive/sort/defs.js +5 -4
  180. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts +56 -15
  181. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts.map +1 -1
  182. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.js +410 -61
  183. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.d.ts +4 -1
  184. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.d.ts.map +1 -1
  185. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.js +16 -42
  186. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram_indirect.d.ts +15 -0
  187. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram_indirect.d.ts.map +1 -0
  188. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram_indirect.js +60 -0
  189. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_prepare.d.ts +25 -0
  190. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_prepare.d.ts.map +1 -0
  191. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_prepare.js +89 -0
  192. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.d.ts +3 -8
  193. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.d.ts.map +1 -1
  194. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.js +28 -160
  195. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter_indirect.d.ts +12 -0
  196. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter_indirect.d.ts.map +1 -0
  197. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter_indirect.js +74 -0
  198. package/src/shade/renderer/gpu_primitive/sort/verify_radix_sort.d.ts +3 -1
  199. package/src/shade/renderer/gpu_primitive/sort/verify_radix_sort.d.ts.map +1 -1
  200. package/src/shade/renderer/gpu_primitive/sort/verify_radix_sort.js +387 -188
  201. package/src/shade/renderer/lightmap/bake/shader_lightmap_viz_to_irradiance_flat.js +1 -1
  202. package/src/shade/renderer/lightmap/bake/shader_lightmap_viz_to_sh.js +1 -1
  203. package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts.map +1 -1
  204. package/src/shade/renderer/material/resident/GPUResidentMaterialContext.js +90 -72
  205. package/src/shade/renderer/material/resident/RESIDENT_MATERIAL_TEXTURE_LAYOUT.d.ts +5 -0
  206. package/src/shade/renderer/material/resident/RESIDENT_MATERIAL_TEXTURE_LAYOUT.d.ts.map +1 -1
  207. package/src/shade/renderer/material/resident/RESIDENT_MATERIAL_TEXTURE_LAYOUT.js +9 -0
  208. package/src/shade/renderer/path_tracer/shader/INDIRECT_TEXTURE_FILTER.d.ts +13 -0
  209. package/src/shade/renderer/path_tracer/shader/INDIRECT_TEXTURE_FILTER.d.ts.map +1 -0
  210. package/src/shade/renderer/path_tracer/shader/INDIRECT_TEXTURE_FILTER.js +14 -0
  211. package/src/shade/renderer/path_tracer/shader/IndirectTextureFilter.d.ts +10 -0
  212. package/src/shade/renderer/path_tracer/shader/IndirectTextureFilter.d.ts.map +1 -0
  213. package/src/shade/renderer/path_tracer/shader/IndirectTextureFilter.js +15 -0
  214. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_tangent_normal.d.ts +4 -3
  215. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_tangent_normal.d.ts.map +1 -1
  216. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_tangent_normal.js +6 -5
  217. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture.d.ts +17 -2
  218. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture.d.ts.map +1 -1
  219. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture.js +25 -57
  220. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture_exact.d.ts +13 -0
  221. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture_exact.d.ts.map +1 -0
  222. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture_exact.js +70 -0
  223. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture_stochastic.d.ts +10 -0
  224. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture_stochastic.d.ts.map +1 -0
  225. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture_stochastic.js +59 -0
  226. package/src/shade/renderer/path_tracer/shader/chunk_indirect_texture_load.d.ts +12 -0
  227. package/src/shade/renderer/path_tracer/shader/chunk_indirect_texture_load.d.ts.map +1 -0
  228. package/src/shade/renderer/path_tracer/shader/chunk_indirect_texture_load.js +49 -0
  229. package/src/shade/renderer/path_tracer/shader/chunk_ray_hit_to_opacity.d.ts.map +1 -1
  230. package/src/shade/renderer/path_tracer/shader/chunk_ray_hit_to_opacity.js +1 -0
  231. package/src/shade/renderer/path_tracer/shader/chunk_render_trace_path.d.ts.map +1 -1
  232. package/src/shade/renderer/path_tracer/shader/chunk_render_trace_path.js +1 -0
  233. package/src/shade/renderer/path_tracer/shader/chunk_sample_material.d.ts.map +1 -1
  234. package/src/shade/renderer/path_tracer/shader/chunk_sample_material.js +2 -1
  235. package/src/shade/renderer/path_tracer/shader/chunk_sample_material_data.d.ts +7 -0
  236. package/src/shade/renderer/path_tracer/shader/chunk_sample_material_data.d.ts.map +1 -1
  237. package/src/shade/renderer/path_tracer/shader/chunk_sample_material_data.js +15 -6
  238. package/src/shade/renderer/scene/GPUSceneContext.d.ts +7 -1
  239. package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
  240. package/src/shade/renderer/scene/GPUSceneContext.js +26 -1
  241. package/src/shade/renderer/shader/chunk/bvh/chunk_bvh_query_aabb_cooperative.d.ts +7 -7
  242. package/src/shade/renderer/shader/chunk/bvh/chunk_bvh_query_aabb_cooperative.d.ts.map +1 -1
  243. package/src/shade/renderer/shader/chunk/bvh/chunk_bvh_query_aabb_cooperative.js +262 -294
  244. package/src/shade/renderer/shader/chunk/filter/MULTISCALE_MEAN_STRUCT.d.ts +9 -0
  245. package/src/shade/renderer/shader/chunk/filter/MULTISCALE_MEAN_STRUCT.d.ts.map +1 -0
  246. package/src/shade/renderer/shader/chunk/filter/MULTISCALE_MEAN_STRUCT.js +21 -0
  247. package/src/shade/renderer/shader/chunk/filter/chunk_multiscale_mean.d.ts +43 -0
  248. package/src/shade/renderer/shader/chunk/filter/chunk_multiscale_mean.d.ts.map +1 -0
  249. package/src/shade/renderer/shader/chunk/filter/chunk_multiscale_mean.js +87 -0
  250. package/src/shade/renderer/shader/chunk/noise/r/chunk_r2_canonical.d.ts +7 -1
  251. package/src/shade/renderer/shader/chunk/noise/r/chunk_r2_canonical.d.ts.map +1 -1
  252. package/src/shade/renderer/shader/chunk/noise/r/chunk_r2_canonical.js +1 -1
  253. package/src/shade/renderer/shader/chunk/subgroup/chunk_subgroup_reserve_workgroup.d.ts +21 -0
  254. package/src/shade/renderer/shader/chunk/subgroup/chunk_subgroup_reserve_workgroup.d.ts.map +1 -0
  255. package/src/shade/renderer/shader/chunk/subgroup/chunk_subgroup_reserve_workgroup.js +42 -0
  256. package/src/shade/renderer/wind/GPUSceneWind.d.ts +1 -1
  257. package/src/shade/wgsl/emulator/CPUBitmapData.d.ts +19 -0
  258. package/src/shade/wgsl/emulator/CPUBitmapData.d.ts.map +1 -1
  259. package/src/shade/wgsl/emulator/CPUBitmapData.js +27 -0
  260. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
  261. package/src/shade/wgsl/emulator/WGSLLanguageCore.js +65 -19
  262. package/src/view/elements/progress/segmented/GhostTrail.d.ts +116 -0
  263. package/src/view/elements/progress/segmented/GhostTrail.d.ts.map +1 -0
  264. package/src/view/elements/progress/segmented/GhostTrail.js +280 -0
  265. package/src/view/elements/progress/segmented/RESOURCE_BAR_SEGMENTS.d.ts +3 -1
  266. package/src/view/elements/progress/segmented/RESOURCE_BAR_SEGMENTS.d.ts.map +1 -1
  267. package/src/view/elements/progress/segmented/RESOURCE_BAR_SEGMENTS.js +3 -1
  268. package/src/view/elements/progress/segmented/SEGMENT_TIERS_DEFAULT.d.ts +11 -0
  269. package/src/view/elements/progress/segmented/SEGMENT_TIERS_DEFAULT.d.ts.map +1 -0
  270. package/src/view/elements/progress/segmented/SEGMENT_TIERS_DEFAULT.js +15 -0
  271. package/src/view/elements/progress/segmented/SegmentDefinition.d.ts +3 -0
  272. package/src/view/elements/progress/segmented/SegmentDefinition.d.ts.map +1 -1
  273. package/src/view/elements/progress/segmented/SegmentDefinition.js +3 -0
  274. package/src/view/elements/progress/segmented/SegmentTier.d.ts +38 -0
  275. package/src/view/elements/progress/segmented/SegmentTier.d.ts.map +1 -0
  276. package/src/view/elements/progress/segmented/SegmentTier.js +50 -0
  277. package/src/view/elements/progress/segmented/SegmentedResourceBarView.d.ts +163 -10
  278. package/src/view/elements/progress/segmented/SegmentedResourceBarView.d.ts.map +1 -1
  279. package/src/view/elements/progress/segmented/SegmentedResourceBarView.js +442 -101
  280. package/src/view/elements/progress/segmented/playground/index.html +78 -0
  281. package/src/view/elements/progress/segmented/playground/main.d.ts +2 -0
  282. package/src/view/elements/progress/segmented/playground/main.d.ts.map +1 -0
  283. package/src/view/elements/progress/segmented/playground/main.js +173 -0
  284. package/src/view/elements/progress/segmented/segment_cell_layout.d.ts +48 -0
  285. package/src/view/elements/progress/segmented/segment_cell_layout.d.ts.map +1 -0
  286. package/src/view/elements/progress/segmented/segment_cell_layout.js +75 -0
  287. package/src/view/elements/progress/segmented/segment_notch_place.d.ts +18 -0
  288. package/src/view/elements/progress/segmented/segment_notch_place.d.ts.map +1 -0
  289. package/src/view/elements/progress/segmented/segment_notch_place.js +28 -0
  290. package/src/view/elements/progress/segmented/segment_tick_positions.d.ts +32 -0
  291. package/src/view/elements/progress/segmented/segment_tick_positions.d.ts.map +1 -0
  292. package/src/view/elements/progress/segmented/segment_tick_positions.js +103 -0
  293. package/src/view/elements/progress/segmented/segmented-resource-bar.css +142 -0
  294. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_provider.d.ts +0 -35
  295. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_provider.d.ts.map +0 -1
  296. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_provider.js +0 -238
  297. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGEO_BRICK.d.ts +0 -99
  298. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGEO_BRICK.d.ts.map +0 -1
  299. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGEO_BRICK.js +0 -139
  300. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGeoBrickProvider.d.ts +0 -65
  301. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGeoBrickProvider.d.ts.map +0 -1
  302. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGeoBrickProvider.js +0 -393
  303. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_box.d.ts +0 -17
  304. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_box.d.ts.map +0 -1
  305. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_box.js +0 -36
  306. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_pair.d.ts +0 -29
  307. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_pair.d.ts.map +0 -1
  308. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_pair.js +0 -108
  309. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_texel.d.ts +0 -31
  310. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_texel.d.ts.map +0 -1
  311. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_texel.js +0 -113
  312. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_triangle.d.ts +0 -36
  313. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_triangle.d.ts.map +0 -1
  314. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_triangle.js +0 -85
  315. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_distance.d.ts +0 -23
  316. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_distance.d.ts.map +0 -1
  317. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_distance.js +0 -273
  318. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_gather.d.ts +0 -13
  319. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_gather.d.ts.map +0 -1
  320. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_gather.js +0 -151
  321. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_traverse.d.ts +0 -13
  322. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_traverse.d.ts.map +0 -1
  323. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_traverse.js +0 -133
  324. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_wait.d.ts +0 -22
  325. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_wait.d.ts.map +0 -1
  326. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_wait.js +0 -135
@@ -0,0 +1,280 @@
1
+ import { assert } from "../../../../core/assert.js";
2
+ import { clamp01 } from "../../../../core/math/clamp01.js";
3
+
4
+ /**
5
+ * Floats per loss in {@link GhostTrail}'s store: [start, duration, low, amplitude]. A loss's trail is
6
+ * `low + amplitude * u²`, where u runs from 1 (held, and at the start of the ease) to 0 (the ease is over).
7
+ * @type {number}
8
+ */
9
+ const LOSS_STRIDE = 4;
10
+
11
+ /**
12
+ * A value that trails another one down: the "ghost" behind a bar's fill that shows how much was just lost.
13
+ *
14
+ * The knobs are the three Dota 2 exposes for its hero bars as console variables: a short hold after a drop
15
+ * (`dota_health_hurt_delay`) and a decay whose length sits between a floor and a ceiling
16
+ * (`dota_health_hurt_decay_time_min` / `_max`). The defaults, 0.1 s / 0.3 s / 0.8 s, are the values players'
17
+ * published configs list as Dota's own; Valve does not document them. Everything else here is this class's own
18
+ * choice, not known Dota behaviour: the decay's length growing linearly with the loss (the whole bar takes the
19
+ * ceiling), the ease-out curve, and how losses that overlap combine.
20
+ *
21
+ * Every drop is a loss with a trail of its own: it holds at the value from before the drop for {@link delay_ms},
22
+ * then eases down over a length sized by that loss alone. The trail shows the highest of the live losses' trails,
23
+ * and never less than the target. Because no loss looks at another, a drop is drawn the same whether the trail
24
+ * was at rest or still moving when it came: a damage tick that lands just before or just after the previous one
25
+ * has faded looks the same, where a single trail that re-plans has to pick one side of that line.
26
+ *
27
+ * Each loss eases toward the lowest the target has been since it happened, never toward the target itself, so a
28
+ * rise that stays under the trail (regeneration after a hit) cannot lift it. When a later drop lowers that floor,
29
+ * the rest of the loss's ease is rescaled toward the new floor from where it is, so it does not jump. The trail
30
+ * is continuous in time and never rises unless the target rises above it; when it does, the trail jumps to the
31
+ * target and every loss is forgotten.
32
+ *
33
+ * A target that is not a finite number is ignored: the trail carries on with what it had, so one bad value cannot
34
+ * leave it NaN, and its owner animating it forever, for every value after.
35
+ *
36
+ * Each loss's start and length are fixed when it happens, so changing the knobs never revives or reshapes a trail
37
+ * already under way.
38
+ *
39
+ * Time is passed in, in milliseconds on any monotonic clock, so the trail can be driven and checked without one.
40
+ */
41
+ export class GhostTrail {
42
+ /**
43
+ * How long a loss's trail holds before it starts to ease down
44
+ * @type {number}
45
+ */
46
+ delay_ms = 100;
47
+
48
+ /**
49
+ * Length of the ease for the smallest loss; 0 with {@link duration_max_ms} 0 snaps once the hold ends
50
+ * @type {number}
51
+ */
52
+ duration_min_ms = 300;
53
+
54
+ /**
55
+ * Length of the ease for a loss of the whole bar (1); smaller losses take proportionally less, down to
56
+ * {@link duration_min_ms}
57
+ * @type {number}
58
+ */
59
+ duration_max_ms = 800;
60
+
61
+ /**
62
+ * The target, as last set
63
+ * @type {number}
64
+ * @private
65
+ */
66
+ __to = 0;
67
+
68
+ /**
69
+ * Live losses, {@link LOSS_STRIDE} floats each: when the ease starts (after the hold), the ease's length, the
70
+ * lowest the target has been since the loss, and how far above that the trail is while u is 1
71
+ * @type {Float64Array}
72
+ * @private
73
+ */
74
+ __losses = new Float64Array(LOSS_STRIDE * 8);
75
+
76
+ /**
77
+ * @type {number}
78
+ * @private
79
+ */
80
+ __loss_count = 0;
81
+
82
+ /**
83
+ * Length of the ease for a loss of `gap`, a fraction of the bar
84
+ * @param {number} gap
85
+ * @returns {number}
86
+ * @private
87
+ */
88
+ __duration_for(gap) {
89
+ const min = this.duration_min_ms;
90
+
91
+ return min + (this.duration_max_ms - min) * clamp01(gap);
92
+ }
93
+
94
+ /**
95
+ * How much of one loss's ease is left at `time_ms`: 1 while it holds, falling to 0 when the ease is over
96
+ * @param {number} index
97
+ * @param {number} time_ms
98
+ * @returns {number}
99
+ * @private
100
+ */
101
+ __loss_u(index, time_ms) {
102
+ const losses = this.__losses;
103
+ const offset = index * LOSS_STRIDE;
104
+
105
+ const elapsed = time_ms - losses[offset];
106
+ const duration = losses[offset + 1];
107
+
108
+ if (elapsed < 0) {
109
+ return 1;
110
+ }
111
+
112
+ if (elapsed >= duration) {
113
+ return 0;
114
+ }
115
+
116
+ return 1 - elapsed / duration;
117
+ }
118
+
119
+ /**
120
+ * Where one loss's trail is at `time_ms`; an ease-out, fastest at the start of the ease
121
+ * @param {number} index
122
+ * @param {number} time_ms
123
+ * @returns {number}
124
+ * @private
125
+ */
126
+ __loss_at(index, time_ms) {
127
+ const offset = index * LOSS_STRIDE;
128
+ const u = this.__loss_u(index, time_ms);
129
+
130
+ return this.__losses[offset + 2] + this.__losses[offset + 3] * u * u;
131
+ }
132
+
133
+ /**
134
+ * @param {number} start
135
+ * @param {number} duration
136
+ * @param {number} low
137
+ * @param {number} amplitude
138
+ * @private
139
+ */
140
+ __add_loss(start, duration, low, amplitude) {
141
+ const count = this.__loss_count;
142
+
143
+ if ((count + 1) * LOSS_STRIDE > this.__losses.length) {
144
+ const grown = new Float64Array(this.__losses.length * 2);
145
+
146
+ grown.set(this.__losses);
147
+
148
+ this.__losses = grown;
149
+ }
150
+
151
+ const losses = this.__losses;
152
+ const offset = count * LOSS_STRIDE;
153
+
154
+ losses[offset] = start;
155
+ losses[offset + 1] = duration;
156
+ losses[offset + 2] = low;
157
+ losses[offset + 3] = amplitude;
158
+
159
+ this.__loss_count = count + 1;
160
+ }
161
+
162
+ /**
163
+ * Tell the trail its target's new value.
164
+ * @param {number} target
165
+ * @param {number} time_ms
166
+ */
167
+ set(target, time_ms) {
168
+ // the knobs are public and may change between calls, so they are checked where they are read
169
+ assert.isFinite(this.delay_ms, 'delay_ms');
170
+ assert.greaterThanOrEqual(this.delay_ms, 0, 'delay_ms must not be negative');
171
+ assert.isFinite(this.duration_max_ms, 'duration_max_ms');
172
+ assert.greaterThanOrEqual(this.duration_min_ms, 0, 'duration_min_ms must not be negative');
173
+ assert.greaterThanOrEqual(this.duration_max_ms, this.duration_min_ms, 'duration_max_ms must not be under duration_min_ms');
174
+ assert.isFinite(time_ms, 'time_ms');
175
+
176
+ if (!Number.isFinite(target)) {
177
+ return;
178
+ }
179
+
180
+ if (target >= this.sample(time_ms)) {
181
+ // a rise to or above the trail: jump to it, and forget every loss
182
+ this.__to = target;
183
+ this.__loss_count = 0;
184
+
185
+ return;
186
+ }
187
+
188
+ // drop the losses whose ease is over (each rests at its low, which is never above the target); for the rest,
189
+ // if the target went under the low, lower it and rescale what is left of the ease so the trail is where it was
190
+ const losses = this.__losses;
191
+ const count = this.__loss_count;
192
+
193
+ let kept = 0;
194
+
195
+ for (let i = 0; i < count; i++) {
196
+ const offset = i * LOSS_STRIDE;
197
+
198
+ const u = this.__loss_u(i, time_ms);
199
+
200
+ if (u <= 0) {
201
+ continue;
202
+ }
203
+
204
+ let low = losses[offset + 2];
205
+ let amplitude = losses[offset + 3];
206
+
207
+ if (target < low) {
208
+ // where the trail is now, kept: low + amplitude * u² before and after. u > 0 here, and the
209
+ // product amplitude * u² stays at most the trail's height over the new low however small u is
210
+ const value = low + amplitude * u * u;
211
+
212
+ low = target;
213
+ amplitude = (value - low) / (u * u);
214
+ }
215
+
216
+ const kept_offset = kept * LOSS_STRIDE;
217
+
218
+ losses[kept_offset] = losses[offset];
219
+ losses[kept_offset + 1] = losses[offset + 1];
220
+ losses[kept_offset + 2] = low;
221
+ losses[kept_offset + 3] = amplitude;
222
+
223
+ kept++;
224
+ }
225
+
226
+ this.__loss_count = kept;
227
+
228
+ const before = this.__to;
229
+
230
+ if (target < before) {
231
+ this.__add_loss(time_ms + this.delay_ms, this.__duration_for(before - target), target, before - target);
232
+ }
233
+
234
+ this.__to = target;
235
+ }
236
+
237
+ /**
238
+ * Where the trail is at a given time: the highest of the live losses' trails, and never below the target.
239
+ * @param {number} time_ms
240
+ * @returns {number}
241
+ */
242
+ sample(time_ms) {
243
+ let value = this.__to;
244
+
245
+ const count = this.__loss_count;
246
+
247
+ for (let i = 0; i < count; i++) {
248
+ const v = this.__loss_at(i, time_ms);
249
+
250
+ if (v > value) {
251
+ value = v;
252
+ }
253
+ }
254
+
255
+ return value;
256
+ }
257
+
258
+ /**
259
+ * Whether the trail shows the target and will not move until {@link set} is called again
260
+ * @param {number} time_ms
261
+ * @returns {boolean}
262
+ */
263
+ is_settled(time_ms) {
264
+ const to = this.__to;
265
+ const losses = this.__losses;
266
+ const count = this.__loss_count;
267
+
268
+ for (let i = 0; i < count; i++) {
269
+ const offset = i * LOSS_STRIDE;
270
+
271
+ // a loss still easing and still above the target; one at or under it stays there, since its trail
272
+ // only falls and the target holds until the next set
273
+ if (time_ms < losses[offset] + losses[offset + 1] && this.__loss_at(i, time_ms) > to) {
274
+ return false;
275
+ }
276
+ }
277
+
278
+ return true;
279
+ }
280
+ }
@@ -1,5 +1,7 @@
1
1
  /**
2
- *
2
+ * @deprecated {@link SegmentedResourceBarView} no longer reads this: its canvas notches gave way to DOM notches
3
+ * styled by `segmented-resource-bar.css`, and this ladder's tiers changed meaning with the bar's max. Pass
4
+ * {@link SegmentTier}s as `tiers`, or rely on {@link SEGMENT_TIERS_DEFAULT}.
3
5
  * @type {SegmentDefinition[]}
4
6
  */
5
7
  export const RESOURCE_BAR_SEGMENTS: SegmentDefinition[];
@@ -1 +1 @@
1
- {"version":3,"file":"RESOURCE_BAR_SEGMENTS.d.ts","sourceRoot":"","sources":["../../../../../../src/view/elements/progress/segmented/RESOURCE_BAR_SEGMENTS.js"],"names":[],"mappings":"AAEA;;;GAGG;AACH,oCAFU,iBAAiB,EAAE,CAiL3B;kCArLgC,wBAAwB"}
1
+ {"version":3,"file":"RESOURCE_BAR_SEGMENTS.d.ts","sourceRoot":"","sources":["../../../../../../src/view/elements/progress/segmented/RESOURCE_BAR_SEGMENTS.js"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,oCAFU,iBAAiB,EAAE,CAiL3B;kCAvLgC,wBAAwB"}
@@ -1,7 +1,9 @@
1
1
  import { SegmentDefinition } from "./SegmentDefinition.js";
2
2
 
3
3
  /**
4
- *
4
+ * @deprecated {@link SegmentedResourceBarView} no longer reads this: its canvas notches gave way to DOM notches
5
+ * styled by `segmented-resource-bar.css`, and this ladder's tiers changed meaning with the bar's max. Pass
6
+ * {@link SegmentTier}s as `tiers`, or rely on {@link SEGMENT_TIERS_DEFAULT}.
5
7
  * @type {SegmentDefinition[]}
6
8
  */
7
9
  export const RESOURCE_BAR_SEGMENTS = [
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Decade ladder a {@link SegmentedResourceBarView} uses when given no tiers: a short notch every 10, a full one
3
+ * every 100, a wide one every 1000. Each marks the same amount on every bar; the finer ones drop out on bars
4
+ * where they would crowd. The class names are styled by `segmented-resource-bar.css`, and a caller's own tiers
5
+ * may reuse them.
6
+ *
7
+ * @type {SegmentTier[]}
8
+ */
9
+ export const SEGMENT_TIERS_DEFAULT: SegmentTier[];
10
+ import { SegmentTier } from "./SegmentTier.js";
11
+ //# sourceMappingURL=SEGMENT_TIERS_DEFAULT.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SEGMENT_TIERS_DEFAULT.d.ts","sourceRoot":"","sources":["../../../../../../src/view/elements/progress/segmented/SEGMENT_TIERS_DEFAULT.js"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,oCAFU,WAAW,EAAE,CAMrB;4BAd0B,kBAAkB"}
@@ -0,0 +1,15 @@
1
+ import { SegmentTier } from "./SegmentTier.js";
2
+
3
+ /**
4
+ * Decade ladder a {@link SegmentedResourceBarView} uses when given no tiers: a short notch every 10, a full one
5
+ * every 100, a wide one every 1000. Each marks the same amount on every bar; the finer ones drop out on bars
6
+ * where they would crowd. The class names are styled by `segmented-resource-bar.css`, and a caller's own tiers
7
+ * may reuse them.
8
+ *
9
+ * @type {SegmentTier[]}
10
+ */
11
+ export const SEGMENT_TIERS_DEFAULT = [
12
+ SegmentTier.from(10, 'segment-tier-minor', 1, 4),
13
+ SegmentTier.from(100, 'segment-tier-major', 1, 3),
14
+ SegmentTier.from(1000, 'segment-tier-super', 2, 0),
15
+ ];
@@ -1,3 +1,6 @@
1
+ /**
2
+ * @deprecated a canvas-drawn notch, which {@link SegmentedResourceBarView} no longer uses; see {@link SegmentTier}
3
+ */
1
4
  export class SegmentDefinition {
2
5
  /**
3
6
  * @return {SegmentDefinition}
@@ -1 +1 @@
1
- {"version":3,"file":"SegmentDefinition.d.ts","sourceRoot":"","sources":["../../../../../../src/view/elements/progress/segmented/SegmentDefinition.js"],"names":[],"mappings":"AAAA;IAaI;;;;OAIG;IACH,mBAHW,MAAM,kCADL,iBAAiB,CAW5B;IAxBD,cAAU;IAEV;;;;;OAKG;IACH,UAJW,wBAAwB,KACxB,MAAM,UACN,MAAM,QAIhB;CAeJ"}
1
+ {"version":3,"file":"SegmentDefinition.d.ts","sourceRoot":"","sources":["../../../../../../src/view/elements/progress/segmented/SegmentDefinition.js"],"names":[],"mappings":"AAAA;;GAEG;AACH;IAaI;;;;OAIG;IACH,mBAHW,MAAM,kCADL,iBAAiB,CAW5B;IAxBD,cAAU;IAEV;;;;;OAKG;IACH,UAJW,wBAAwB,KACxB,MAAM,UACN,MAAM,QAIhB;CAeJ"}
@@ -1,3 +1,6 @@
1
+ /**
2
+ * @deprecated a canvas-drawn notch, which {@link SegmentedResourceBarView} no longer uses; see {@link SegmentTier}
3
+ */
1
4
  export class SegmentDefinition {
2
5
  value = 0;
3
6
 
@@ -0,0 +1,38 @@
1
+ /**
2
+ * One level of notch on a {@link SegmentedResourceBarView}.
3
+ *
4
+ * A tier has a fixed meaning: it marks every multiple of {@link unit} that no coarser tier marks, on every
5
+ * bar, whatever the bar's max. A tier is dropped when its notches would sit closer than
6
+ * {@link min_spacing_px} on screen, finest first.
7
+ */
8
+ export class SegmentTier {
9
+ /**
10
+ * @param {number} unit
11
+ * @param {string} class_name
12
+ * @param {number} width_px
13
+ * @param {number} min_spacing_px
14
+ * @returns {SegmentTier}
15
+ */
16
+ static from(unit: number, class_name: string, width_px: number, min_spacing_px: number): SegmentTier;
17
+ /**
18
+ * Amount between two notches of this tier, in the bar's own units (e.g. 100 hit points)
19
+ * @type {number}
20
+ */
21
+ unit: number;
22
+ /**
23
+ * CSS class every notch of this tier carries; the stylesheet owns its colour, height and highlight
24
+ * @type {string}
25
+ */
26
+ class_name: string;
27
+ /**
28
+ * Notch width in CSS pixels, scaled by the whole part of the device pixel ratio so it stays whole device pixels
29
+ * @type {number}
30
+ */
31
+ width_px: number;
32
+ /**
33
+ * Below this on-screen spacing between neighbouring notches, in CSS pixels, the tier is dropped
34
+ * @type {number}
35
+ */
36
+ min_spacing_px: number;
37
+ }
38
+ //# sourceMappingURL=SegmentTier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SegmentTier.d.ts","sourceRoot":"","sources":["../../../../../../src/view/elements/progress/segmented/SegmentTier.js"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH;IAyBI;;;;;;OAMG;IACH,kBANW,MAAM,cACN,MAAM,YACN,MAAM,kBACN,MAAM,GACJ,WAAW,CAWvB;IAxCD;;;OAGG;IACH,MAFU,MAAM,CAEP;IAET;;;OAGG;IACH,YAFU,MAAM,CAEA;IAEhB;;;OAGG;IACH,UAFU,MAAM,CAEH;IAEb;;;OAGG;IACH,gBAFU,MAAM,CAEG;CAmBtB"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * One level of notch on a {@link SegmentedResourceBarView}.
3
+ *
4
+ * A tier has a fixed meaning: it marks every multiple of {@link unit} that no coarser tier marks, on every
5
+ * bar, whatever the bar's max. A tier is dropped when its notches would sit closer than
6
+ * {@link min_spacing_px} on screen, finest first.
7
+ */
8
+ export class SegmentTier {
9
+ /**
10
+ * Amount between two notches of this tier, in the bar's own units (e.g. 100 hit points)
11
+ * @type {number}
12
+ */
13
+ unit = 1;
14
+
15
+ /**
16
+ * CSS class every notch of this tier carries; the stylesheet owns its colour, height and highlight
17
+ * @type {string}
18
+ */
19
+ class_name = '';
20
+
21
+ /**
22
+ * Notch width in CSS pixels, scaled by the whole part of the device pixel ratio so it stays whole device pixels
23
+ * @type {number}
24
+ */
25
+ width_px = 1;
26
+
27
+ /**
28
+ * Below this on-screen spacing between neighbouring notches, in CSS pixels, the tier is dropped
29
+ * @type {number}
30
+ */
31
+ min_spacing_px = 0;
32
+
33
+ /**
34
+ * @param {number} unit
35
+ * @param {string} class_name
36
+ * @param {number} width_px
37
+ * @param {number} min_spacing_px
38
+ * @returns {SegmentTier}
39
+ */
40
+ static from(unit, class_name, width_px, min_spacing_px) {
41
+ const r = new SegmentTier();
42
+
43
+ r.unit = unit;
44
+ r.class_name = class_name;
45
+ r.width_px = width_px;
46
+ r.min_spacing_px = min_spacing_px;
47
+
48
+ return r;
49
+ }
50
+ }
@@ -1,15 +1,45 @@
1
+ /**
2
+ * Resource bar in the style of a MOBA health bar: the values fill it end to end, notches mark fixed amounts, and
3
+ * a ghost behind the fill trails a drop so the loss stays readable for a moment.
4
+ *
5
+ * Two modes:
6
+ * - notches (default): a continuous fill, with a notch at every multiple of each {@link SegmentTier}'s unit;
7
+ * - cells (`cells` given): `count` separate cells with exact, identical gaps, for counting rounds and the like.
8
+ *
9
+ * Notches and cells sit on whole device pixels at any pixel ratio and under a CSS scale. Colours, notch heights
10
+ * and the ghost are styled by `segmented-resource-bar.css` through `--segmented-bar-*` custom properties.
11
+ */
1
12
  export class SegmentedResourceBarView extends View {
2
13
  /**
3
14
  *
4
15
  * @param {Object} options
5
- * @param {(Vector1|ObservedInteger)[]} options.values
16
+ * @param {(Vector1|ObservedInteger)[]} options.values stacked end to end, value 0 first; their total is clamped to max
6
17
  * @param {Vector1|ObservedInteger|ReactiveExpression} [options.max=1]
7
18
  * @param {string[]} [options.classList]
19
+ * @param {{unit:number, class_name:string, width_px:number, min_spacing_px:number}[]} [options.tiers] notch tiers, finest first; see {@link SegmentTier}
20
+ * @param {{count:number, group:number}|null} [options.cells] draw `count` cells instead of notches, in groups of `group` (0 for none)
21
+ * @param {number} [options.ghost_delay_ms=100] how long the ghost holds after a drop; see {@link GhostTrail}
22
+ * @param {number} [options.ghost_duration_min_ms=300] how long the ghost takes to close the smallest loss
23
+ * @param {number} [options.ghost_duration_max_ms=800] how long it takes to close a loss of the whole bar; both
24
+ * durations are 0 under prefers-reduced-motion, so the ghost holds, then snaps
8
25
  */
9
- constructor({ values, max, classList }: {
26
+ constructor({ values, max, classList, tiers, cells, ghost_delay_ms, ghost_duration_min_ms, ghost_duration_max_ms }: {
10
27
  values: (Vector1 | ObservedInteger)[];
11
28
  max?: Vector1 | ObservedInteger | ReactiveExpression;
12
29
  classList?: string[];
30
+ tiers?: {
31
+ unit: number;
32
+ class_name: string;
33
+ width_px: number;
34
+ min_spacing_px: number;
35
+ }[];
36
+ cells?: {
37
+ count: number;
38
+ group: number;
39
+ } | null;
40
+ ghost_delay_ms?: number;
41
+ ghost_duration_min_ms?: number;
42
+ ghost_duration_max_ms?: number;
13
43
  });
14
44
  /**
15
45
  *
@@ -23,37 +53,160 @@ export class SegmentedResourceBarView extends View {
23
53
  * @private
24
54
  */
25
55
  private __value_max;
56
+ /**
57
+ * @type {{unit:number, class_name:string, width_px:number, min_spacing_px:number}[]}
58
+ * @private
59
+ */
60
+ private __tiers;
61
+ /**
62
+ * @type {{count:number, group:number}|null}
63
+ * @private
64
+ */
65
+ private __cells;
66
+ /**
67
+ * @type {GhostTrail}
68
+ * @private
69
+ */
70
+ private __ghost;
71
+ /**
72
+ * @type {number}
73
+ * @private
74
+ */
75
+ private __ghost_duration_min_ms;
76
+ /**
77
+ * @type {number}
78
+ * @private
79
+ */
80
+ private __ghost_duration_max_ms;
81
+ /**
82
+ * Total fill as a fraction of max, as last drawn
83
+ * @type {number}
84
+ * @private
85
+ */
86
+ private __total_fraction;
87
+ /**
88
+ * @type {MediaQueryList|null}
89
+ * @private
90
+ */
91
+ private __reduced_motion;
92
+ /**
93
+ * Watches for the device pixel ratio moving off the one the layout was built for
94
+ * @type {MediaQueryList|null}
95
+ * @private
96
+ */
97
+ private __dpr_query;
98
+ /**
99
+ * @private
100
+ */
101
+ private __handle_dpr_change;
102
+ __frame_pending: boolean;
103
+ __frame_id: number;
104
+ /**
105
+ * @private
106
+ */
107
+ private __animate_ghost;
108
+ __built_max: number;
109
+ __built_width: number;
110
+ __built_ratio: number;
111
+ __built_origin_phase: number;
112
+ /**
113
+ * scratch for {@link segment_notch_place}
114
+ * @type {Float64Array}
115
+ * @private
116
+ */
117
+ private __place;
26
118
  /**
27
119
  *
28
120
  * @type {List<NumericInterval>}
29
121
  */
30
122
  highlights: List<NumericInterval>;
31
123
  el: HTMLDivElement;
32
- __v__fill: EmptyView;
33
- __value_fills: EmptyView[];
34
- __v__ghost: EmptyView;
35
- __v_segments: CanvasView;
124
+ /**
125
+ * @type {HTMLElement}
126
+ * @private
127
+ */
128
+ private __el_ghost;
129
+ /**
130
+ * @type {HTMLElement[]}
131
+ * @private
132
+ */
133
+ private __value_fills;
134
+ /**
135
+ * @type {HTMLElement[]}
136
+ * @private
137
+ */
138
+ private __notch_elements;
139
+ /**
140
+ * @type {HTMLElement[]}
141
+ * @private
142
+ */
143
+ private __cell_elements;
144
+ __cell_fill_elements: HTMLDivElement[];
145
+ __cell_ghost_elements: HTMLDivElement[];
146
+ __cell_states: Uint8Array;
147
+ __cell_fill_drawn: Float64Array;
148
+ __cell_ghost_drawn: Float64Array;
149
+ /**
150
+ * The notches' own box; what they are positioned in and what is measured to place them
151
+ * @type {HTMLElement}
152
+ * @private
153
+ */
154
+ private __el_layout;
36
155
  /**
37
156
  *
38
157
  * @type {ListView}
39
158
  */
40
159
  highlightViews: ListView;
41
160
  /**
42
- * We need an observer in order to know when we need to resize the canvas element that holds marks
161
+ * Tells us when the bar's width moves, so the notches or cells can be placed again
43
162
  * @type {DomSizeObserver}
44
163
  * @private
45
164
  */
46
165
  private __sizeObserver;
47
166
  update(): void;
48
- __updateSize(): void;
49
167
  handleMaxChange(): void;
168
+ /**
169
+ * Place the notches or cells again, if the max, the bar's width (by {@link REBUILD_WIDTH_THRESHOLD_PX} or more),
170
+ * its pixel ratio or the device-pixel phase of its left edge has moved since they were last placed.
171
+ */
50
172
  updateSegments(): void;
173
+ /**
174
+ * @param {number} max
175
+ * @param {number} width
176
+ * @param {number} left
177
+ * @param {number} ratio
178
+ * @private
179
+ */
180
+ private __place_notches;
181
+ /**
182
+ * @param {number} width
183
+ * @param {number} left
184
+ * @param {number} ratio
185
+ * @private
186
+ */
187
+ private __place_cells;
51
188
  updateFill(): void;
189
+ /**
190
+ * Draw the cells (in cell mode) and the ghost as they stand at `time_ms`, and keep animating until the ghost settles
191
+ * @param {number} time_ms
192
+ * @private
193
+ */
194
+ private __draw;
195
+ /**
196
+ * @param {number} total_fraction
197
+ * @param {number} ghost_fraction
198
+ * @private
199
+ */
200
+ private __draw_cells;
201
+ /**
202
+ * Arm a one-shot watch on the current device pixel ratio; it fires when the window moves to another screen or the
203
+ * page is zoomed, neither of which resizes the bar in CSS pixels
204
+ * @private
205
+ */
206
+ private __watch_device_pixel_ratio;
52
207
  }
53
208
  import View from "../../../View.js";
54
209
  import List from "../../../../core/collection/list/List.js";
55
- import EmptyView from "../../EmptyView.js";
56
- import { CanvasView } from "../../CanvasView.js";
57
210
  import ListView from "../../../common/ListView.js";
58
211
  import Vector1 from "../../../../core/geom/Vector1.js";
59
212
  //# sourceMappingURL=SegmentedResourceBarView.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SegmentedResourceBarView.d.ts","sourceRoot":"","sources":["../../../../../../src/view/elements/progress/segmented/SegmentedResourceBarView.js"],"names":[],"mappings":"AAWA;IACI;;;;;;OAMG;IACH;QAJgD,MAAM,EAA3C,CAAC,OAAO,kBAAgB,CAAC,EAAE;QAC0B,GAAG,GAAxD,OAAO,uCAAmC;QACvB,SAAS,GAA5B,MAAM,EAAE;OA6HlB;IAjHG;;;;OAIG;IACH,yBAA8B;IAE9B;;;;OAIG;IACH,oBAAsB;IAGtB;;;OAGG;IACH,YAFU,qBAAqB,CAEH;IAG5B,mBAAuC;IAQvC,qBAAiE;IAGjE,2BAAuB;IASvB,sBAAyD;IAIzD,yBAAoC;IAMpC;;;OAGG;IACH,gBAFU,QAAQ,CAsChB;IAWF;;;;OAIG;IACH,uBAA2C;IA6B/C,eAGC;IAED,qBAQC;IAED,wBAGC;IAED,uBAkGC;IAED,mBAyBC;CACJ;iBAlTgB,kBAAkB;iBALlB,0CAA0C;sBAOrC,oBAAoB;2BADf,qBAAqB;qBAH3B,6BAA6B;oBAF9B,kCAAkC"}
1
+ {"version":3,"file":"SegmentedResourceBarView.d.ts","sourceRoot":"","sources":["../../../../../../src/view/elements/progress/segmented/SegmentedResourceBarView.js"],"names":[],"mappings":"AA0CA;;;;;;;;;;GAUG;AACH;IACI;;;;;;;;;;;;OAYG;IACH;QAVgD,MAAM,EAA3C,CAAC,OAAO,kBAAgB,CAAC,EAAE;QAC0B,GAAG,GAAxD,OAAO,uCAAmC;QACvB,SAAS,GAA5B,MAAM,EAAE;QAC6E,KAAK,GAA1F;YAAC,IAAI,EAAC,MAAM,CAAC;YAAC,UAAU,EAAC,MAAM,CAAC;YAAC,QAAQ,EAAC,MAAM,CAAC;YAAC,cAAc,EAAC,MAAM,CAAA;SAAC,EAAE;QAC9B,KAAK,GAAjD;YAAC,KAAK,EAAC,MAAM,CAAC;YAAC,KAAK,EAAC,MAAM,CAAA;SAAC,GAAC,IAAI;QAChB,cAAc,GAA/B,MAAM;QACW,qBAAqB,GAAtC,MAAM;QACW,qBAAqB,GAAtC,MAAM;OAiRhB;IApPG;;;;OAIG;IACH,yBAA8B;IAE9B;;;;OAIG;IACH,oBAAsB;IAEtB;;;OAGG;IACH,gBAAoB;IAEpB;;;OAGG;IACH,gBAAoB;IAEpB;;;OAGG;IACH,gBAA+B;IAG/B;;;OAGG;IACH,gCAAoD;IAEpD;;;OAGG;IACH,gCAAoD;IAEpD;;;;OAIG;IACH,yBAAyB;IAEzB;;;OAGG;IACH,yBAAgH;IAEhH;;;;OAIG;IACH,oBAAuB;IAoe3B;;OAEG;IACH,4BASC;IA5eG,yBAA4B;IAC5B,mBAAmB;IAicvB;;OAEG;IACH,wBAQC;IAxcG,oBAAsB;IACtB,sBAAwB;IACxB,sBAAwB;IACxB,6BAA+B;IAE/B;;;;OAIG;IACH,gBAAkC;IAElC;;;OAGG;IACH,YAFU,qBAAqB,CAEH;IAG5B,mBAAuC;IASvC;;;OAGG;IACH,mBAA+C;IAG/C;;;OAGG;IACH,sBAAuB;IAEvB;;;OAGG;IACH,yBAA0B;IAE1B;;;OAGG;IACH,wBAAyB;IACzB,uCAA8B;IAC9B,wCAA+B;IAC/B,0BAAqE;IAGrE,gCAA2E;IAC3E,iCAA4E;IAkBxE;;;;OAIG;IACH,oBAAgD;IA8BpD;;;OAGG;IACH,gBAFU,QAAQ,CAsChB;IAWF;;;;OAIG;IACH,uBAA2C;IAuC/C,eAGC;IAED,wBAGC;IAED;;;OAGG;IACH,uBAmDC;IAED;;;;;;OAMG;IACH,wBAoCC;IAED;;;;;OAKG;IACH,sBAkBC;IAED,mBA2CC;IAED;;;;OAIG;IACH,eAaC;IAED;;;;OAIG;IACH,qBA6BC;IAeD;;;;OAIG;IACH,mCAUC;CAeJ;iBAvoBgB,kBAAkB;iBALlB,0CAA0C;qBAGtC,6BAA6B;oBAF9B,kCAAkC"}