@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.
- package/package.json +1 -1
- package/src/shade/playground/probe_clipmap/index.html +12 -0
- package/src/shade/playground/probe_clipmap/main.d.ts.map +1 -1
- package/src/shade/playground/probe_clipmap/main.js +5 -0
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +4 -6
- package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts +63 -1
- package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js +228 -16
- package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.d.ts +27 -4
- package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.d.ts.map +1 -1
- package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.js +526 -23
- package/src/shade/renderer/geometry/sdf/cards/MeshCardCaptureMode.d.ts +11 -0
- package/src/shade/renderer/geometry/sdf/cards/MeshCardCaptureMode.d.ts.map +1 -0
- package/src/shade/renderer/geometry/sdf/cards/MeshCardCaptureMode.js +21 -0
- package/src/shade/renderer/geometry/sdf/cards/mesh_cards_raster_pass_descriptor.d.ts +65 -0
- package/src/shade/renderer/geometry/sdf/cards/mesh_cards_raster_pass_descriptor.d.ts.map +1 -0
- package/src/shade/renderer/geometry/sdf/cards/mesh_cards_raster_pass_descriptor.js +376 -0
- package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_capture.d.ts +7 -3
- package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_capture.d.ts.map +1 -1
- package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_capture.js +70 -6
- package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_raster_args.d.ts +20 -0
- package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_raster_args.d.ts.map +1 -0
- package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_raster_args.js +80 -0
- package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_raster_scatter.d.ts +18 -0
- package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_raster_scatter.d.ts.map +1 -0
- package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_raster_scatter.js +113 -0
- package/src/shade/renderer/geometry/virtual/sdf/VGEO_SDF.d.ts +47 -0
- package/src/shade/renderer/geometry/virtual/sdf/VGEO_SDF.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/sdf/VGEO_SDF.js +80 -0
- package/src/shade/renderer/geometry/virtual/sdf/VGeoSDFProxies.d.ts +91 -0
- package/src/shade/renderer/geometry/virtual/sdf/VGeoSDFProxies.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/sdf/VGeoSDFProxies.js +902 -0
- package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_collect.d.ts +16 -0
- package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_collect.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_collect.js +67 -0
- package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_decode.d.ts +17 -0
- package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_decode.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_decode.js +145 -0
- package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_traverse.d.ts +12 -0
- package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_traverse.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_traverse.js +105 -0
- package/src/shade/renderer/global_illumination/probe/octahedral/shader_lpv_build_gbuffer.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe/octahedral/shader_lpv_build_gbuffer.js +2 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.d.ts +3 -9
- package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.js +13 -31
- package/src/shade/renderer/global_illumination/probe_clipmap/PROBE_CLIPMAP_PROPOSAL_2026_10_27.md +764 -48
- package/src/shade/renderer/global_illumination/probe_clipmap/PROBE_RAYS_VARIABLE_AND_SORTED_SCOPE_2026_10_30.md +410 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.d.ts +3 -2
- package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.js +4 -3
- package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.d.ts +41 -17
- package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.js +57 -33
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/BRICK_CLIPMAP.d.ts +11 -3
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/BRICK_CLIPMAP.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/BRICK_CLIPMAP.js +13 -4
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/GPUBrickClipmap.d.ts +9 -18
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/GPUBrickClipmap.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/GPUBrickClipmap.js +8 -10
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap.d.ts +12 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap.js +28 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap_trace.d.ts +1 -29
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap_trace.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap_trace.js +1 -74
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK.d.ts +161 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK.js +219 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK_INSTANCE_STRUCT.d.ts +1 -8
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK_INSTANCE_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK_INSTANCE_STRUCT.js +1 -9
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MeshSDFBrickProvider.d.ts +40 -12
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MeshSDFBrickProvider.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MeshSDFBrickProvider.js +373 -31
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_instance.d.ts +2 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_instance.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_instance.js +2 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_texel.d.ts +15 -8
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_texel.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_texel.js +28 -14
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_walk.d.ts +23 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_walk.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_walk.js +66 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_batch.d.ts +29 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_batch.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_batch.js +210 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_command.d.ts +29 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_command.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_command.js +86 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_gather.d.ts +41 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_gather.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_gather.js +439 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_resolve.d.ts +23 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_resolve.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_resolve.js +135 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_free.d.ts +3 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_free.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_free.js +12 -3
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts +21 -18
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.js +254 -73
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.d.ts +149 -8
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.js +181 -13
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.d.ts +179 -7
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.js +412 -31
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_pick.js +4 -4
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_sample_radiance.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_sample_radiance.js +4 -3
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.d.ts +36 -10
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.js +218 -29
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_admit.d.ts +5 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_admit.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_admit.js +24 -14
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.d.ts +15 -6
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.js +21 -22
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_guide.d.ts +36 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_guide.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_guide.js +257 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_light.d.ts +18 -7
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_light.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_light.js +157 -51
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_order.d.ts +23 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_order.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_order.js +110 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_project.d.ts +24 -2
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_project.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_project.js +90 -10
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_ray_layout.d.ts +45 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_ray_layout.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_ray_layout.js +205 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_relocate.js +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_retire.d.ts +16 -3
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_retire.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_retire.js +55 -10
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_schedule.d.ts +19 -4
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_schedule.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_schedule.js +60 -6
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.d.ts +10 -9
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.js +32 -39
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.d.ts +21 -14
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.js +100 -30
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace_command.d.ts +6 -2
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace_command.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace_command.js +26 -10
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_hits.d.ts +3 -2
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_hits.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_hits.js +12 -12
- package/src/shade/renderer/gpu_primitive/sort/SORT_DIGIT_SETTINGS_STRUCT.d.ts +10 -0
- package/src/shade/renderer/gpu_primitive/sort/SORT_DIGIT_SETTINGS_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/sort/SORT_DIGIT_SETTINGS_STRUCT.js +21 -0
- package/src/shade/renderer/gpu_primitive/sort/SORT_PASS_SETTINGS_STRUCT.d.ts +5 -2
- package/src/shade/renderer/gpu_primitive/sort/SORT_PASS_SETTINGS_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/sort/SORT_PASS_SETTINGS_STRUCT.js +31 -23
- package/src/shade/renderer/gpu_primitive/sort/SORT_SIZE_STRUCT.d.ts +10 -0
- package/src/shade/renderer/gpu_primitive/sort/SORT_SIZE_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/sort/SORT_SIZE_STRUCT.js +22 -0
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_constants.d.ts +9 -0
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_constants.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_constants.js +18 -0
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_digit.d.ts +8 -3
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_digit.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_digit.js +41 -32
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_histogram_tile.d.ts +31 -0
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_histogram_tile.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_histogram_tile.js +71 -0
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_scatter_tile.d.ts +47 -0
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_scatter_tile.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_scatter_tile.js +210 -0
- package/src/shade/renderer/gpu_primitive/sort/defs.d.ts +5 -4
- package/src/shade/renderer/gpu_primitive/sort/defs.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/sort/defs.js +5 -4
- package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts +56 -15
- package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.js +410 -61
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.d.ts +4 -1
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.js +16 -42
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram_indirect.d.ts +15 -0
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram_indirect.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram_indirect.js +60 -0
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_prepare.d.ts +25 -0
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_prepare.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_prepare.js +89 -0
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.d.ts +3 -8
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.js +28 -160
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter_indirect.d.ts +12 -0
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter_indirect.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter_indirect.js +74 -0
- package/src/shade/renderer/gpu_primitive/sort/verify_radix_sort.d.ts +3 -1
- package/src/shade/renderer/gpu_primitive/sort/verify_radix_sort.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/sort/verify_radix_sort.js +387 -188
- package/src/shade/renderer/lightmap/bake/shader_lightmap_viz_to_irradiance_flat.js +1 -1
- package/src/shade/renderer/lightmap/bake/shader_lightmap_viz_to_sh.js +1 -1
- package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts.map +1 -1
- package/src/shade/renderer/material/resident/GPUResidentMaterialContext.js +90 -72
- package/src/shade/renderer/material/resident/RESIDENT_MATERIAL_TEXTURE_LAYOUT.d.ts +5 -0
- package/src/shade/renderer/material/resident/RESIDENT_MATERIAL_TEXTURE_LAYOUT.d.ts.map +1 -1
- package/src/shade/renderer/material/resident/RESIDENT_MATERIAL_TEXTURE_LAYOUT.js +9 -0
- package/src/shade/renderer/path_tracer/shader/INDIRECT_TEXTURE_FILTER.d.ts +13 -0
- package/src/shade/renderer/path_tracer/shader/INDIRECT_TEXTURE_FILTER.d.ts.map +1 -0
- package/src/shade/renderer/path_tracer/shader/INDIRECT_TEXTURE_FILTER.js +14 -0
- package/src/shade/renderer/path_tracer/shader/IndirectTextureFilter.d.ts +10 -0
- package/src/shade/renderer/path_tracer/shader/IndirectTextureFilter.d.ts.map +1 -0
- package/src/shade/renderer/path_tracer/shader/IndirectTextureFilter.js +15 -0
- package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_tangent_normal.d.ts +4 -3
- package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_tangent_normal.d.ts.map +1 -1
- package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_tangent_normal.js +6 -5
- package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture.d.ts +17 -2
- package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture.d.ts.map +1 -1
- package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture.js +25 -57
- package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture_exact.d.ts +13 -0
- package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture_exact.d.ts.map +1 -0
- package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture_exact.js +70 -0
- package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture_stochastic.d.ts +10 -0
- package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture_stochastic.d.ts.map +1 -0
- package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture_stochastic.js +59 -0
- package/src/shade/renderer/path_tracer/shader/chunk_indirect_texture_load.d.ts +12 -0
- package/src/shade/renderer/path_tracer/shader/chunk_indirect_texture_load.d.ts.map +1 -0
- package/src/shade/renderer/path_tracer/shader/chunk_indirect_texture_load.js +49 -0
- package/src/shade/renderer/path_tracer/shader/chunk_ray_hit_to_opacity.d.ts.map +1 -1
- package/src/shade/renderer/path_tracer/shader/chunk_ray_hit_to_opacity.js +1 -0
- package/src/shade/renderer/path_tracer/shader/chunk_render_trace_path.d.ts.map +1 -1
- package/src/shade/renderer/path_tracer/shader/chunk_render_trace_path.js +1 -0
- package/src/shade/renderer/path_tracer/shader/chunk_sample_material.d.ts.map +1 -1
- package/src/shade/renderer/path_tracer/shader/chunk_sample_material.js +2 -1
- package/src/shade/renderer/path_tracer/shader/chunk_sample_material_data.d.ts +7 -0
- package/src/shade/renderer/path_tracer/shader/chunk_sample_material_data.d.ts.map +1 -1
- package/src/shade/renderer/path_tracer/shader/chunk_sample_material_data.js +15 -6
- package/src/shade/renderer/scene/GPUSceneContext.d.ts +7 -1
- package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
- package/src/shade/renderer/scene/GPUSceneContext.js +26 -1
- package/src/shade/renderer/shader/chunk/bvh/chunk_bvh_query_aabb_cooperative.d.ts +7 -7
- package/src/shade/renderer/shader/chunk/bvh/chunk_bvh_query_aabb_cooperative.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/bvh/chunk_bvh_query_aabb_cooperative.js +262 -294
- package/src/shade/renderer/shader/chunk/filter/MULTISCALE_MEAN_STRUCT.d.ts +9 -0
- package/src/shade/renderer/shader/chunk/filter/MULTISCALE_MEAN_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/filter/MULTISCALE_MEAN_STRUCT.js +21 -0
- package/src/shade/renderer/shader/chunk/filter/chunk_multiscale_mean.d.ts +43 -0
- package/src/shade/renderer/shader/chunk/filter/chunk_multiscale_mean.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/filter/chunk_multiscale_mean.js +87 -0
- package/src/shade/renderer/shader/chunk/noise/r/chunk_r2_canonical.d.ts +7 -1
- package/src/shade/renderer/shader/chunk/noise/r/chunk_r2_canonical.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/noise/r/chunk_r2_canonical.js +1 -1
- package/src/shade/renderer/shader/chunk/subgroup/chunk_subgroup_reserve_workgroup.d.ts +21 -0
- package/src/shade/renderer/shader/chunk/subgroup/chunk_subgroup_reserve_workgroup.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/subgroup/chunk_subgroup_reserve_workgroup.js +42 -0
- package/src/shade/renderer/wind/GPUSceneWind.d.ts +1 -1
- package/src/shade/wgsl/emulator/CPUBitmapData.d.ts +19 -0
- package/src/shade/wgsl/emulator/CPUBitmapData.d.ts.map +1 -1
- package/src/shade/wgsl/emulator/CPUBitmapData.js +27 -0
- package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
- package/src/shade/wgsl/emulator/WGSLLanguageCore.js +65 -19
- package/src/view/elements/progress/segmented/GhostTrail.d.ts +116 -0
- package/src/view/elements/progress/segmented/GhostTrail.d.ts.map +1 -0
- package/src/view/elements/progress/segmented/GhostTrail.js +280 -0
- package/src/view/elements/progress/segmented/RESOURCE_BAR_SEGMENTS.d.ts +3 -1
- package/src/view/elements/progress/segmented/RESOURCE_BAR_SEGMENTS.d.ts.map +1 -1
- package/src/view/elements/progress/segmented/RESOURCE_BAR_SEGMENTS.js +3 -1
- package/src/view/elements/progress/segmented/SEGMENT_TIERS_DEFAULT.d.ts +11 -0
- package/src/view/elements/progress/segmented/SEGMENT_TIERS_DEFAULT.d.ts.map +1 -0
- package/src/view/elements/progress/segmented/SEGMENT_TIERS_DEFAULT.js +15 -0
- package/src/view/elements/progress/segmented/SegmentDefinition.d.ts +3 -0
- package/src/view/elements/progress/segmented/SegmentDefinition.d.ts.map +1 -1
- package/src/view/elements/progress/segmented/SegmentDefinition.js +3 -0
- package/src/view/elements/progress/segmented/SegmentTier.d.ts +38 -0
- package/src/view/elements/progress/segmented/SegmentTier.d.ts.map +1 -0
- package/src/view/elements/progress/segmented/SegmentTier.js +50 -0
- package/src/view/elements/progress/segmented/SegmentedResourceBarView.d.ts +163 -10
- package/src/view/elements/progress/segmented/SegmentedResourceBarView.d.ts.map +1 -1
- package/src/view/elements/progress/segmented/SegmentedResourceBarView.js +442 -101
- package/src/view/elements/progress/segmented/playground/index.html +78 -0
- package/src/view/elements/progress/segmented/playground/main.d.ts +2 -0
- package/src/view/elements/progress/segmented/playground/main.d.ts.map +1 -0
- package/src/view/elements/progress/segmented/playground/main.js +173 -0
- package/src/view/elements/progress/segmented/segment_cell_layout.d.ts +48 -0
- package/src/view/elements/progress/segmented/segment_cell_layout.d.ts.map +1 -0
- package/src/view/elements/progress/segmented/segment_cell_layout.js +75 -0
- package/src/view/elements/progress/segmented/segment_notch_place.d.ts +18 -0
- package/src/view/elements/progress/segmented/segment_notch_place.d.ts.map +1 -0
- package/src/view/elements/progress/segmented/segment_notch_place.js +28 -0
- package/src/view/elements/progress/segmented/segment_tick_positions.d.ts +32 -0
- package/src/view/elements/progress/segmented/segment_tick_positions.d.ts.map +1 -0
- package/src/view/elements/progress/segmented/segment_tick_positions.js +103 -0
- package/src/view/elements/progress/segmented/segmented-resource-bar.css +142 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_provider.d.ts +0 -35
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_provider.d.ts.map +0 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_provider.js +0 -238
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGEO_BRICK.d.ts +0 -99
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGEO_BRICK.d.ts.map +0 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGEO_BRICK.js +0 -139
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGeoBrickProvider.d.ts +0 -65
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGeoBrickProvider.d.ts.map +0 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGeoBrickProvider.js +0 -393
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_box.d.ts +0 -17
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_box.d.ts.map +0 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_box.js +0 -36
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_pair.d.ts +0 -29
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_pair.d.ts.map +0 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_pair.js +0 -108
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_texel.d.ts +0 -31
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_texel.d.ts.map +0 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_texel.js +0 -113
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_triangle.d.ts +0 -36
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_triangle.d.ts.map +0 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_triangle.js +0 -85
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_distance.d.ts +0 -23
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_distance.d.ts.map +0 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_distance.js +0 -273
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_gather.d.ts +0 -13
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_gather.d.ts.map +0 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_gather.js +0 -151
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_traverse.d.ts +0 -13
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_traverse.d.ts.map +0 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_traverse.js +0 -133
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_wait.d.ts +0 -22
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_wait.d.ts.map +0 -1
- 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 @@
|
|
|
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
|
+
}
|