@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,78 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>meep — segmented resource bar</title>
6
+ <link rel="stylesheet" href="../segmented-resource-bar.css">
7
+ <style>
8
+ :root {
9
+ color-scheme: dark;
10
+ }
11
+
12
+ html, body {
13
+ margin: 0;
14
+ background: #2a2f36;
15
+ color: #d6dae0;
16
+ font: 12px/1.5 ui-monospace, Consolas, monospace;
17
+ }
18
+
19
+ main {
20
+ padding: 16px;
21
+ }
22
+
23
+ h2 {
24
+ font-size: 12px;
25
+ font-weight: normal;
26
+ color: #8b939f;
27
+ margin: 18px 0 8px;
28
+ }
29
+
30
+ .row {
31
+ display: flex;
32
+ align-items: center;
33
+ gap: 12px;
34
+ margin: 6px 0;
35
+ }
36
+
37
+ .row > .label {
38
+ width: 110px;
39
+ text-align: right;
40
+ }
41
+
42
+ .ui-segmented-resource-bar-view {
43
+ width: 258px;
44
+ }
45
+
46
+ /* the bar starts on a fractional CSS pixel, as it does inside a scaled or flowed HUD */
47
+ .offset {
48
+ margin-left: 0.37px;
49
+ }
50
+
51
+ .mode-cells {
52
+ --segmented-bar-height: 10px;
53
+ }
54
+
55
+ button {
56
+ font: inherit;
57
+ }
58
+ </style>
59
+ </head>
60
+ <body>
61
+ <main>
62
+ <h2>health: tiers 25 / 100 / 500 / 1000, a shield stacked after the health</h2>
63
+ <div id="health"></div>
64
+
65
+ <h2>ammo: cells, grouped in fives and ungrouped</h2>
66
+ <div id="ammo"></div>
67
+
68
+ <h2>controls</h2>
69
+ <div class="row">
70
+ <button id="damage">damage 22%</button>
71
+ <button id="heal">heal to full</button>
72
+ <button id="fire">fire one</button>
73
+ <button id="reload">reload</button>
74
+ </div>
75
+ </main>
76
+ <script type="module" src="./main.js"></script>
77
+ </body>
78
+ </html>
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../../../../../src/view/elements/progress/segmented/playground/main.js"],"names":[],"mappings":""}
@@ -0,0 +1,173 @@
1
+ import Vector1 from "../../../../../core/geom/Vector1.js";
2
+ import { SegmentedResourceBarView } from "../SegmentedResourceBarView.js";
3
+ import { SegmentTier } from "../SegmentTier.js";
4
+
5
+ /**
6
+ * An example health ladder, as a game would pass it; the class names reuse the default stylesheet's tiers
7
+ * @type {SegmentTier[]}
8
+ */
9
+ const HEALTH_TIERS = [
10
+ SegmentTier.from(25, 'segment-tier-minor', 1, 5),
11
+ SegmentTier.from(100, 'segment-tier-major', 1, 3),
12
+ SegmentTier.from(500, 'segment-tier-super', 2, 0),
13
+ SegmentTier.from(1000, 'segment-tier-super', 2, 0),
14
+ ];
15
+
16
+ /**
17
+ * @type {{view:SegmentedResourceBarView, values:Vector1[], max:Vector1}[]}
18
+ */
19
+ const health_bars = [];
20
+
21
+ /**
22
+ * @type {{view:SegmentedResourceBarView, rounds:Vector1, count:number}[]}
23
+ */
24
+ const ammo_bars = [];
25
+
26
+ /**
27
+ * @param {HTMLElement} parent
28
+ * @param {string} label
29
+ * @param {SegmentedResourceBarView} view
30
+ * @param {boolean} offset
31
+ */
32
+ function add_row(parent, label, view, offset) {
33
+ const row = document.createElement('div');
34
+ row.className = 'row';
35
+
36
+ const el_label = document.createElement('span');
37
+ el_label.className = 'label';
38
+ el_label.textContent = label;
39
+
40
+ row.appendChild(el_label);
41
+
42
+ if (offset) {
43
+ view.addClass('offset');
44
+ }
45
+
46
+ row.appendChild(view.el);
47
+ parent.appendChild(row);
48
+
49
+ view.link();
50
+ }
51
+
52
+ const el_health = document.getElementById('health');
53
+
54
+ for (const max_value of [60, 300, 606, 1500]) {
55
+ for (const offset of [false, true]) {
56
+ const max = new Vector1(max_value);
57
+ const health = new Vector1(max_value * 0.7);
58
+ const shield = new Vector1(max_value * 0.12);
59
+
60
+ const view = new SegmentedResourceBarView({ values: [health, shield], max, tiers: HEALTH_TIERS });
61
+
62
+ add_row(el_health, `${max_value}${offset ? ' +0.37px' : ''}`, view, offset);
63
+
64
+ health_bars.push({ view, values: [health, shield], max });
65
+ }
66
+ }
67
+
68
+ const el_ammo = document.getElementById('ammo');
69
+
70
+ for (const count of [12, 17, 33]) {
71
+ for (const group of [5, 0]) {
72
+ const rounds = new Vector1(count - 3);
73
+
74
+ const view = new SegmentedResourceBarView({
75
+ values: [rounds],
76
+ max: new Vector1(count),
77
+ cells: { count, group }
78
+ });
79
+
80
+ add_row(el_ammo, `${count} / g${group}`, view, group === 0);
81
+
82
+ ammo_bars.push({ view, rounds, count });
83
+ }
84
+ }
85
+
86
+ document.getElementById('damage').addEventListener('click', () => {
87
+ for (const { values, max } of health_bars) {
88
+ let damage = max.getValue() * 0.22;
89
+
90
+ // the shield takes it first
91
+ for (let i = values.length - 1; i >= 0 && damage > 0; i--) {
92
+ const taken = Math.min(damage, values[i].getValue());
93
+
94
+ values[i].set(values[i].getValue() - taken);
95
+ damage -= taken;
96
+ }
97
+ }
98
+ });
99
+
100
+ document.getElementById('heal').addEventListener('click', () => {
101
+ for (const { values, max } of health_bars) {
102
+ values[0].set(max.getValue() * 0.88);
103
+ values[1].set(max.getValue() * 0.12);
104
+ }
105
+ });
106
+
107
+ document.getElementById('fire').addEventListener('click', () => {
108
+ for (const { rounds } of ammo_bars) {
109
+ rounds.set(Math.max(0, Math.ceil(rounds.getValue()) - 1));
110
+ }
111
+ });
112
+
113
+ let reload_frame = 0;
114
+
115
+ document.getElementById('reload').addEventListener('click', () => {
116
+ cancelAnimationFrame(reload_frame);
117
+
118
+ // one round every 120 ms, each cell filling as its round goes in
119
+ const step = () => {
120
+ let done = true;
121
+
122
+ for (const { rounds, count } of ammo_bars) {
123
+ const next = Math.min(count, rounds.getValue() + 16 / 120);
124
+
125
+ rounds.set(next);
126
+
127
+ if (next < count) {
128
+ done = false;
129
+ }
130
+ }
131
+
132
+ if (!done) {
133
+ reload_frame = requestAnimationFrame(step);
134
+ }
135
+ };
136
+
137
+ reload_frame = requestAnimationFrame(step);
138
+ });
139
+
140
+ /**
141
+ * For a driver: every notch and cell edge in device pixels, and whether it is whole. Chrome keeps layout in
142
+ * 1/64 CSS pixel steps, so an edge placed at 0.8 CSS px reads back as 0.796875; anything within one such step of
143
+ * a whole device pixel paints on it.
144
+ * @returns {{dpr:number, checked:number, worst:number, off_grid:string[]}}
145
+ */
146
+ globalThis.segmented_bar_pixel_report = function () {
147
+ const dpr = devicePixelRatio;
148
+
149
+ const tolerance = dpr / 64;
150
+
151
+ const off_grid = [];
152
+ let checked = 0;
153
+ let worst = 0;
154
+
155
+ for (const el of document.querySelectorAll('.notch, .cell')) {
156
+ const r = el.getBoundingClientRect();
157
+
158
+ for (const [name, v] of [['left', r.left], ['right', r.right]]) {
159
+ const device = v * dpr;
160
+
161
+ const miss = Math.abs(device - Math.round(device));
162
+
163
+ checked++;
164
+ worst = Math.max(worst, miss);
165
+
166
+ if (miss > tolerance) {
167
+ off_grid.push(`${el.className} ${name} ${device.toFixed(4)}`);
168
+ }
169
+ }
170
+ }
171
+
172
+ return { dpr, checked, worst, off_grid };
173
+ };
@@ -0,0 +1,48 @@
1
+ /**
2
+ * @typedef {Object} SegmentCellLayout
3
+ * @property {number} bar_width_device the bar's width in whole device pixels; the last cell ends here
4
+ * @property {number} gap_device gap between two cells of one group, device pixels
5
+ * @property {number} group_gap_device gap between two groups, device pixels: 3 in-group gaps
6
+ * @property {number[]} cell_x_device each cell's left edge, device pixels from the bar's left edge
7
+ * @property {number[]} cell_width_device each cell's width, device pixels
8
+ */
9
+ /**
10
+ * Lays out `count` separate cells across a bar on whole device pixels.
11
+ *
12
+ * Every in-group gap is the same `max(1, round(dpr))` device pixels and every between-group gap exactly three of
13
+ * those. What the gaps leave is shared among the cells, the remainder spread evenly (Bresenham), so no cell is
14
+ * more than one device pixel wider than another and the last cell ends exactly at `floor(width_px * dpr)`.
15
+ *
16
+ * Needs at least one device pixel per cell after the gaps. A bar narrower than that gets zero-width cells and
17
+ * its last cell does not reach the edge: draw that many rounds as notches instead, or ungroup them.
18
+ *
19
+ * @param {number} width_px the bar's width, CSS pixels
20
+ * @param {number} count number of cells
21
+ * @param {number} group cells per group, 0 for no grouping
22
+ * @param {number} dpr device pixel ratio
23
+ * @returns {SegmentCellLayout}
24
+ */
25
+ export function segment_cell_layout(width_px: number, count: number, group: number, dpr: number): SegmentCellLayout;
26
+ export type SegmentCellLayout = {
27
+ /**
28
+ * the bar's width in whole device pixels; the last cell ends here
29
+ */
30
+ bar_width_device: number;
31
+ /**
32
+ * gap between two cells of one group, device pixels
33
+ */
34
+ gap_device: number;
35
+ /**
36
+ * gap between two groups, device pixels: 3 in-group gaps
37
+ */
38
+ group_gap_device: number;
39
+ /**
40
+ * each cell's left edge, device pixels from the bar's left edge
41
+ */
42
+ cell_x_device: number[];
43
+ /**
44
+ * each cell's width, device pixels
45
+ */
46
+ cell_width_device: number[];
47
+ };
48
+ //# sourceMappingURL=segment_cell_layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"segment_cell_layout.d.ts","sourceRoot":"","sources":["../../../../../../src/view/elements/progress/segmented/segment_cell_layout.js"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH;;;;;;;;;;;;;;;GAeG;AACH,8CANW,MAAM,SACN,MAAM,SACN,MAAM,OACN,MAAM,GACJ,iBAAiB,CAiD7B;;;;;sBAtEa,MAAM;;;;gBACN,MAAM;;;;sBACN,MAAM;;;;mBACN,MAAM,EAAE;;;;uBACR,MAAM,EAAE"}
@@ -0,0 +1,75 @@
1
+ import { assert } from "../../../../core/assert.js";
2
+
3
+ /**
4
+ * @typedef {Object} SegmentCellLayout
5
+ * @property {number} bar_width_device the bar's width in whole device pixels; the last cell ends here
6
+ * @property {number} gap_device gap between two cells of one group, device pixels
7
+ * @property {number} group_gap_device gap between two groups, device pixels: 3 in-group gaps
8
+ * @property {number[]} cell_x_device each cell's left edge, device pixels from the bar's left edge
9
+ * @property {number[]} cell_width_device each cell's width, device pixels
10
+ */
11
+
12
+ /**
13
+ * Lays out `count` separate cells across a bar on whole device pixels.
14
+ *
15
+ * Every in-group gap is the same `max(1, round(dpr))` device pixels and every between-group gap exactly three of
16
+ * those. What the gaps leave is shared among the cells, the remainder spread evenly (Bresenham), so no cell is
17
+ * more than one device pixel wider than another and the last cell ends exactly at `floor(width_px * dpr)`.
18
+ *
19
+ * Needs at least one device pixel per cell after the gaps. A bar narrower than that gets zero-width cells and
20
+ * its last cell does not reach the edge: draw that many rounds as notches instead, or ungroup them.
21
+ *
22
+ * @param {number} width_px the bar's width, CSS pixels
23
+ * @param {number} count number of cells
24
+ * @param {number} group cells per group, 0 for no grouping
25
+ * @param {number} dpr device pixel ratio
26
+ * @returns {SegmentCellLayout}
27
+ */
28
+ export function segment_cell_layout(width_px, count, group, dpr) {
29
+ assert.isNumber(width_px, 'width_px');
30
+ assert.isNonNegativeInteger(count, 'count');
31
+ assert.isNonNegativeInteger(group, 'group');
32
+ assert.isNumber(dpr, 'dpr');
33
+
34
+ const bar_width_device = Math.floor(width_px * dpr);
35
+
36
+ const gap_device = Math.max(1, Math.round(dpr));
37
+ const group_gap_device = gap_device * 3;
38
+
39
+ const group_count = group > 0 ? Math.ceil(count / group) : 1;
40
+ const group_gaps = count > 0 ? group_count - 1 : 0;
41
+ const cell_gaps = count > 0 ? count - 1 - group_gaps : 0;
42
+
43
+ const cells_device = bar_width_device - cell_gaps * gap_device - group_gaps * group_gap_device;
44
+
45
+ const base = count > 0 ? Math.max(0, Math.floor(cells_device / count)) : 0;
46
+ const remainder = count > 0 ? Math.max(0, cells_device - base * count) : 0;
47
+
48
+ const cell_x_device = new Array(count);
49
+ const cell_width_device = new Array(count);
50
+
51
+ let x = 0;
52
+
53
+ for (let i = 0; i < count; i++) {
54
+ if (i > 0) {
55
+ x += (group > 0 && i % group === 0) ? group_gap_device : gap_device;
56
+ }
57
+
58
+ // Bresenham: cell i takes one of the remainder's pixels whenever the running share crosses a whole one
59
+ const extra = Math.floor((i + 1) * remainder / count) - Math.floor(i * remainder / count);
60
+ const w = base + extra;
61
+
62
+ cell_x_device[i] = x;
63
+ cell_width_device[i] = w;
64
+
65
+ x += w;
66
+ }
67
+
68
+ return {
69
+ bar_width_device,
70
+ gap_device,
71
+ group_gap_device,
72
+ cell_x_device,
73
+ cell_width_device
74
+ };
75
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Places one notch on whole device pixels.
3
+ *
4
+ * The notch is centred on its fraction of the bar, measured in device pixels of the bar's rounded device width,
5
+ * and is `width_px` CSS pixels wide scaled by the whole part of the pixel ratio, so a 1 px notch is 1 device pixel
6
+ * at DPR 1.25 and 2 at DPR 1.5 or 2 — never a smear across two. When the bar's own left edge falls between device
7
+ * pixels the notch is shifted back onto the grid, so `(rect_left + left) * dpr` and `width * dpr` are integers.
8
+ *
9
+ * @param {number[]|Float64Array} result receives [left, width], in CSS pixels relative to the bar's left edge
10
+ * @param {number} result_offset
11
+ * @param {number} fraction where the notch sits, value / max
12
+ * @param {number} width_px notch width in CSS pixels, before the pixel-ratio scale
13
+ * @param {number} rect_left the bar's left edge on the page, CSS pixels (getBoundingClientRect().left)
14
+ * @param {number} rect_width the bar's width, CSS pixels
15
+ * @param {number} dpr device pixel ratio
16
+ */
17
+ export function segment_notch_place(result: number[] | Float64Array, result_offset: number, fraction: number, width_px: number, rect_left: number, rect_width: number, dpr: number): void;
18
+ //# sourceMappingURL=segment_notch_place.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"segment_notch_place.d.ts","sourceRoot":"","sources":["../../../../../../src/view/elements/progress/segmented/segment_notch_place.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,4CARW,MAAM,EAAE,GAAC,YAAY,iBACrB,MAAM,YACN,MAAM,YACN,MAAM,aACN,MAAM,cACN,MAAM,OACN,MAAM,QAahB"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Places one notch on whole device pixels.
3
+ *
4
+ * The notch is centred on its fraction of the bar, measured in device pixels of the bar's rounded device width,
5
+ * and is `width_px` CSS pixels wide scaled by the whole part of the pixel ratio, so a 1 px notch is 1 device pixel
6
+ * at DPR 1.25 and 2 at DPR 1.5 or 2 — never a smear across two. When the bar's own left edge falls between device
7
+ * pixels the notch is shifted back onto the grid, so `(rect_left + left) * dpr` and `width * dpr` are integers.
8
+ *
9
+ * @param {number[]|Float64Array} result receives [left, width], in CSS pixels relative to the bar's left edge
10
+ * @param {number} result_offset
11
+ * @param {number} fraction where the notch sits, value / max
12
+ * @param {number} width_px notch width in CSS pixels, before the pixel-ratio scale
13
+ * @param {number} rect_left the bar's left edge on the page, CSS pixels (getBoundingClientRect().left)
14
+ * @param {number} rect_width the bar's width, CSS pixels
15
+ * @param {number} dpr device pixel ratio
16
+ */
17
+ export function segment_notch_place(result, result_offset, fraction, width_px, rect_left, rect_width, dpr) {
18
+ const bar_width_device = Math.round(rect_width * dpr);
19
+ const notch_width_device = width_px * Math.max(1, Math.round(dpr));
20
+
21
+ const x_device = Math.round(fraction * bar_width_device) - Math.floor(notch_width_device / 2);
22
+
23
+ const origin_device = rect_left * dpr;
24
+ const origin_shift = (Math.round(origin_device) - origin_device) / dpr;
25
+
26
+ result[result_offset] = x_device / dpr + origin_shift;
27
+ result[result_offset + 1] = notch_width_device / dpr;
28
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Which notches a bar of the given max and width draws, and the tier of each.
3
+ *
4
+ * A notch at value `v` belongs to the coarsest tier whose unit divides `v`, so a tier marks the same amount on
5
+ * every bar. A tier whose on-screen spacing (`width_px * unit / max`) is under its `min_spacing_px` is dropped,
6
+ * and so is every tier finer than it: dropping goes finest first and the coarser tiers stay. A tier is also
7
+ * dropped when its notches would leave no pixel of bar between them (spacing under `width_px + 1`), which is
8
+ * what bounds the notch count by the bar's width whatever the tiers ask for.
9
+ *
10
+ * Notches sit strictly inside the bar: none at 0, none at max.
11
+ *
12
+ * @param {number} max the bar's full amount
13
+ * @param {number} width_px the bar's width in CSS pixels
14
+ * @param {{unit:number, width_px:number, min_spacing_px:number}[]} tiers finest first, units strictly ascending
15
+ * @returns {SegmentTick[]} ascending by value
16
+ */
17
+ export function segment_tick_positions(max: number, width_px: number, tiers: {
18
+ unit: number;
19
+ width_px: number;
20
+ min_spacing_px: number;
21
+ }[]): SegmentTick[];
22
+ export type SegmentTick = {
23
+ /**
24
+ * where the notch sits, in the bar's own units
25
+ */
26
+ value: number;
27
+ /**
28
+ * index into the tier list of the tier that marks it
29
+ */
30
+ tier: number;
31
+ };
32
+ //# sourceMappingURL=segment_tick_positions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"segment_tick_positions.d.ts","sourceRoot":"","sources":["../../../../../../src/view/elements/progress/segmented/segment_tick_positions.js"],"names":[],"mappings":"AAyBA;;;;;;;;;;;;;;;GAeG;AACH,4CALW,MAAM,YACN,MAAM,SACN;IAAC,IAAI,EAAC,MAAM,CAAC;IAAC,QAAQ,EAAC,MAAM,CAAC;IAAC,cAAc,EAAC,MAAM,CAAA;CAAC,EAAE,GACrD,WAAW,EAAE,CA+DzB;;;;;WAlGa,MAAM;;;;UACN,MAAM"}
@@ -0,0 +1,103 @@
1
+ import { assert } from "../../../../core/assert.js";
2
+
3
+ /**
4
+ * @typedef {Object} SegmentTick
5
+ * @property {number} value where the notch sits, in the bar's own units
6
+ * @property {number} tier index into the tier list of the tier that marks it
7
+ */
8
+
9
+ /**
10
+ * Relative tolerance for "unit divides value", so a fractional unit (0.1) still divides its own multiples
11
+ * @type {number}
12
+ */
13
+ const DIVIDES_TOLERANCE = 1e-9;
14
+
15
+ /**
16
+ * @param {number} value
17
+ * @param {number} unit
18
+ * @returns {boolean}
19
+ */
20
+ function unit_divides(value, unit) {
21
+ const q = value / unit;
22
+
23
+ return Math.abs(q - Math.round(q)) <= DIVIDES_TOLERANCE * q;
24
+ }
25
+
26
+ /**
27
+ * Which notches a bar of the given max and width draws, and the tier of each.
28
+ *
29
+ * A notch at value `v` belongs to the coarsest tier whose unit divides `v`, so a tier marks the same amount on
30
+ * every bar. A tier whose on-screen spacing (`width_px * unit / max`) is under its `min_spacing_px` is dropped,
31
+ * and so is every tier finer than it: dropping goes finest first and the coarser tiers stay. A tier is also
32
+ * dropped when its notches would leave no pixel of bar between them (spacing under `width_px + 1`), which is
33
+ * what bounds the notch count by the bar's width whatever the tiers ask for.
34
+ *
35
+ * Notches sit strictly inside the bar: none at 0, none at max.
36
+ *
37
+ * @param {number} max the bar's full amount
38
+ * @param {number} width_px the bar's width in CSS pixels
39
+ * @param {{unit:number, width_px:number, min_spacing_px:number}[]} tiers finest first, units strictly ascending
40
+ * @returns {SegmentTick[]} ascending by value
41
+ */
42
+ export function segment_tick_positions(max, width_px, tiers) {
43
+ assert.isNumber(max, 'max');
44
+ assert.isNumber(width_px, 'width_px');
45
+ assert.isArray(tiers, 'tiers');
46
+
47
+ /**
48
+ * @type {SegmentTick[]}
49
+ */
50
+ const result = [];
51
+
52
+ if (!(max > 0) || !(width_px > 0) || !Number.isFinite(max)) {
53
+ return result;
54
+ }
55
+
56
+ const tier_count = tiers.length;
57
+
58
+ for (let i = 1; i < tier_count; i++) {
59
+ assert.greaterThan(tiers[i].unit, tiers[i - 1].unit, 'tier units must be strictly ascending');
60
+ }
61
+
62
+ // finest tier that is kept; everything coarser is kept with it
63
+ let first_kept = tier_count;
64
+
65
+ for (let i = 0; i < tier_count; i++) {
66
+ const tier = tiers[i];
67
+
68
+ assert.greaterThan(tier.unit, 0, 'tier.unit');
69
+
70
+ const spacing = width_px * tier.unit / max;
71
+ const min_spacing = Math.max(tier.min_spacing_px, tier.width_px + 1);
72
+
73
+ if (spacing >= min_spacing) {
74
+ first_kept = i;
75
+ break;
76
+ }
77
+ }
78
+
79
+ for (let i = first_kept; i < tier_count; i++) {
80
+ const unit = tiers[i].unit;
81
+
82
+ for (let k = 1; k * unit < max; k++) {
83
+ const value = k * unit;
84
+
85
+ let claimed_by_coarser = false;
86
+
87
+ for (let j = i + 1; j < tier_count; j++) {
88
+ if (unit_divides(value, tiers[j].unit)) {
89
+ claimed_by_coarser = true;
90
+ break;
91
+ }
92
+ }
93
+
94
+ if (!claimed_by_coarser) {
95
+ result.push({ value, tier: i });
96
+ }
97
+ }
98
+ }
99
+
100
+ result.sort((a, b) => a.value - b.value);
101
+
102
+ return result;
103
+ }