@jbrowse/render-core 5.0.0-beta.13 → 5.0.0-beta.14

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 (153) hide show
  1. package/esm/OverlayCanvas.d.ts +3 -2
  2. package/esm/OverlayCanvas.js +4 -2
  3. package/esm/RenderCanvas.d.ts +4 -3
  4. package/esm/RenderCanvas.js +4 -2
  5. package/esm/ScrollLockedOverlay.d.ts +2 -2
  6. package/esm/ScrollLockedOverlay.js +3 -2
  7. package/esm/blockClipUtils.d.ts +5 -5
  8. package/esm/blockClipUtils.js +4 -3
  9. package/esm/canvas2dUtils.d.ts +15 -21
  10. package/esm/canvas2dUtils.js +25 -55
  11. package/esm/colorRampLut.d.ts +2 -2
  12. package/esm/colorRampLut.js +2 -2
  13. package/esm/coverageBand.d.ts +0 -1
  14. package/esm/coverageBand.js +0 -5
  15. package/esm/coverageBandBuffers.d.ts +8 -5
  16. package/esm/createRenderingBackend.d.ts +1 -1
  17. package/esm/displayPhase.d.ts +5 -9
  18. package/esm/displayPhase.js +2 -2
  19. package/esm/hal/mockHal.d.ts +3 -4
  20. package/esm/hal/mockHal.js +5 -4
  21. package/esm/hal/types.d.ts +5 -5
  22. package/esm/hal/webgl2Hal.d.ts +4 -1
  23. package/esm/hal/webgl2Hal.js +15 -6
  24. package/esm/hal/webgpuHal.js +2 -2
  25. package/esm/linkFeet.d.ts +4 -0
  26. package/esm/linkFeet.js +7 -0
  27. package/esm/marks/barMark.d.ts +1 -1
  28. package/esm/marks/colorFill.d.ts +4 -4
  29. package/esm/marks/colorFill.js +4 -4
  30. package/esm/marks/connectorMark.d.ts +48 -0
  31. package/esm/marks/connectorMark.js +285 -0
  32. package/esm/marks/drawAgainstHit.d.ts +1 -1
  33. package/esm/marks/drawAgainstHit.js +4 -4
  34. package/esm/marks/glyphPaint.d.ts +5 -4
  35. package/esm/marks/glyphPaint.js +17 -7
  36. package/esm/marks/index.d.ts +6 -3
  37. package/esm/marks/index.js +5 -3
  38. package/esm/marks/lineMark.d.ts +44 -10
  39. package/esm/marks/lineMark.js +20 -19
  40. package/esm/marks/linkMark.d.ts +22 -5
  41. package/esm/marks/linkMark.js +103 -25
  42. package/esm/marks/markBackend.d.ts +1 -1
  43. package/esm/marks/markBackend.js +1 -1
  44. package/esm/marks/markRamp.d.ts +11 -11
  45. package/esm/marks/markRamp.js +9 -9
  46. package/esm/marks/pointMark.d.ts +11 -5
  47. package/esm/marks/pointMark.js +34 -9
  48. package/esm/marks/rowLane.d.ts +3 -3
  49. package/esm/marks/rowLane.js +2 -2
  50. package/esm/marks/rowTable.d.ts +5 -5
  51. package/esm/marks/rowTable.js +4 -4
  52. package/esm/marks/ruleMark.js +1 -0
  53. package/esm/marks/spanMark.d.ts +4 -4
  54. package/esm/marks/types.d.ts +4 -4
  55. package/esm/marks/types.js +5 -0
  56. package/esm/perRegionRenderingBackend.d.ts +1 -1
  57. package/esm/perRegionRenderingBackend.js +1 -1
  58. package/esm/regionDataMap.d.ts +2 -2
  59. package/esm/regionDataMap.js +2 -2
  60. package/esm/shaders/capsule.js.generated.d.ts +1 -1
  61. package/esm/shaders/capsule.js.generated.js +2 -2
  62. package/esm/shaders/connectorMark.consts.generated.d.ts +11 -0
  63. package/esm/shaders/connectorMark.consts.generated.js +13 -0
  64. package/esm/shaders/{coverageIndicator.generated.d.ts → connectorMark.generated.d.ts} +2 -1
  65. package/esm/shaders/connectorMark.generated.js +8 -0
  66. package/esm/shaders/connectorMark.glsl.generated.d.ts +2 -0
  67. package/esm/shaders/connectorMark.glsl.generated.js +4 -0
  68. package/esm/shaders/connectorMark.iface.generated.d.ts +88 -0
  69. package/esm/shaders/connectorMark.iface.generated.js +1194 -0
  70. package/esm/shaders/connectorMark.js.generated.d.ts +5 -0
  71. package/esm/shaders/connectorMark.js.generated.js +47 -0
  72. package/esm/shaders/connectorMark.wgsl.generated.d.ts +1 -0
  73. package/esm/shaders/connectorMark.wgsl.generated.js +3 -0
  74. package/esm/shaders/coverageInterbase.glsl.generated.d.ts +1 -1
  75. package/esm/shaders/coverageInterbase.glsl.generated.js +1 -1
  76. package/esm/shaders/coverageInterbase.wgsl.generated.d.ts +1 -1
  77. package/esm/shaders/coverageInterbase.wgsl.generated.js +1 -1
  78. package/esm/shaders/curveDistance.js.generated.d.ts +3 -0
  79. package/esm/shaders/curveDistance.js.generated.js +104 -0
  80. package/esm/shaders/lineCenterMark.glsl.generated.d.ts +2 -2
  81. package/esm/shaders/lineCenterMark.glsl.generated.js +2 -2
  82. package/esm/shaders/lineCenterMark.wgsl.generated.d.ts +1 -1
  83. package/esm/shaders/lineCenterMark.wgsl.generated.js +1 -1
  84. package/esm/shaders/linkMark.consts.generated.d.ts +1 -0
  85. package/esm/shaders/linkMark.consts.generated.js +1 -0
  86. package/esm/shaders/linkMark.glsl.generated.d.ts +2 -2
  87. package/esm/shaders/linkMark.glsl.generated.js +2 -2
  88. package/esm/shaders/linkMark.js.generated.d.ts +2 -1
  89. package/esm/shaders/linkMark.js.generated.js +30 -1
  90. package/esm/shaders/linkMark.wgsl.generated.d.ts +1 -1
  91. package/esm/shaders/linkMark.wgsl.generated.js +1 -1
  92. package/esm/shaders/pointMark.glsl.generated.d.ts +1 -1
  93. package/esm/shaders/pointMark.glsl.generated.js +1 -1
  94. package/esm/shaders/pointMark.iface.generated.d.ts +10 -8
  95. package/esm/shaders/pointMark.iface.generated.js +18 -16
  96. package/esm/shaders/pointMark.wgsl.generated.d.ts +1 -1
  97. package/esm/shaders/pointMark.wgsl.generated.js +1 -1
  98. package/package.json +7 -4
  99. package/src/shaders/arcHull.test.ts +87 -0
  100. package/src/shaders/barMark.slang +2 -2
  101. package/src/shaders/capsule.js.generated.ts +2 -2
  102. package/src/shaders/capsule.slang +69 -24
  103. package/src/shaders/clipStrip.slang +1 -1
  104. package/src/shaders/colorPack.slang +2 -2
  105. package/src/shaders/colorRampLut.slang +7 -7
  106. package/src/shaders/connectorMark.consts.generated.ts +24 -0
  107. package/src/shaders/connectorMark.generated.ts +12 -0
  108. package/src/shaders/connectorMark.glsl.generated.ts +6 -0
  109. package/src/shaders/connectorMark.iface.generated.ts +1270 -0
  110. package/src/shaders/connectorMark.js.generated.ts +52 -0
  111. package/src/shaders/connectorMark.slang +287 -0
  112. package/src/shaders/connectorMark.wgsl.generated.ts +4 -0
  113. package/src/shaders/coverageBand.slang +10 -12
  114. package/src/shaders/coverageInterbase.glsl.generated.ts +1 -1
  115. package/src/shaders/coverageInterbase.slang +24 -21
  116. package/src/shaders/coverageInterbase.wgsl.generated.ts +1 -1
  117. package/src/shaders/coverageSnp.slang +1 -1
  118. package/src/shaders/curveDistance.js.generated.ts +100 -0
  119. package/src/shaders/curveDistance.slang +104 -1
  120. package/src/shaders/farDome.test.ts +117 -0
  121. package/src/shaders/hpClampFloor.test.ts +0 -4
  122. package/src/shaders/lineCenterMark.glsl.generated.ts +2 -2
  123. package/src/shaders/lineCenterMark.slang +14 -22
  124. package/src/shaders/lineCenterMark.wgsl.generated.ts +1 -1
  125. package/src/shaders/lineCommon.slang +10 -10
  126. package/src/shaders/lineStepMark.slang +5 -5
  127. package/src/shaders/linkMark.consts.generated.ts +2 -0
  128. package/src/shaders/linkMark.glsl.generated.ts +2 -2
  129. package/src/shaders/linkMark.js.generated.ts +27 -1
  130. package/src/shaders/linkMark.slang +58 -18
  131. package/src/shaders/linkMark.wgsl.generated.ts +1 -1
  132. package/src/shaders/markColor.slang +10 -10
  133. package/src/shaders/pointMark.glsl.generated.ts +1 -1
  134. package/src/shaders/pointMark.iface.generated.ts +19 -16
  135. package/src/shaders/pointMark.slang +12 -8
  136. package/src/shaders/pointMark.wgsl.generated.ts +1 -1
  137. package/src/shaders/rowRect.slang +3 -3
  138. package/src/shaders/rowTable.slang +7 -7
  139. package/src/shaders/scoreScale.slang +1 -1
  140. package/src/shaders/spanMark.slang +5 -5
  141. package/src/shaders/viewRegion.slang +13 -0
  142. package/esm/shaders/coverageIndicator.generated.js +0 -7
  143. package/esm/shaders/coverageIndicator.glsl.generated.d.ts +0 -2
  144. package/esm/shaders/coverageIndicator.glsl.generated.js +0 -4
  145. package/esm/shaders/coverageIndicator.iface.generated.d.ts +0 -85
  146. package/esm/shaders/coverageIndicator.iface.generated.js +0 -114
  147. package/esm/shaders/coverageIndicator.wgsl.generated.d.ts +0 -1
  148. package/esm/shaders/coverageIndicator.wgsl.generated.js +0 -3
  149. package/src/shaders/coverageIndicator.generated.ts +0 -11
  150. package/src/shaders/coverageIndicator.glsl.generated.ts +0 -6
  151. package/src/shaders/coverageIndicator.iface.generated.ts +0 -172
  152. package/src/shaders/coverageIndicator.slang +0 -61
  153. package/src/shaders/coverageIndicator.wgsl.generated.ts +0 -4
@@ -14,19 +14,20 @@ export declare const UNIFORM_OFFSET_F32: {
14
14
  readonly zero: 60;
15
15
  readonly viewportWidth: 61;
16
16
  readonly radiusPx: 62;
17
- readonly rowHeight: 63;
18
- readonly rowOffsetPx: 64;
19
- readonly insetPx: 66;
20
- readonly devicePixelRatio: 67;
21
- readonly minWidthPx: 70;
17
+ readonly triangleRadiusYPx: 63;
18
+ readonly rowHeight: 64;
19
+ readonly rowOffsetPx: 65;
20
+ readonly insetPx: 67;
21
+ readonly devicePixelRatio: 68;
22
+ readonly minWidthPx: 71;
22
23
  };
23
24
  export declare const UNIFORM_OFFSET_I32: {
24
25
  readonly valueScaleType: 6;
25
26
  readonly rampMode: 8;
26
27
  readonly colorCutCount: 12;
27
- readonly reverse: 65;
28
- readonly rowTableKeys: 68;
29
- readonly rule: 69;
28
+ readonly reverse: 66;
29
+ readonly rowTableKeys: 69;
30
+ readonly rule: 70;
30
31
  };
31
32
  export declare const UNIFORM_SLOT_ARRAYS: {
32
33
  readonly colorCuts: readonly [16, 20];
@@ -51,6 +52,7 @@ export interface Uniforms {
51
52
  zero: number;
52
53
  viewportWidth: number;
53
54
  radiusPx: number;
55
+ triangleRadiusYPx: number;
54
56
  rowHeight: number;
55
57
  rowOffsetPx: number;
56
58
  reverse: number;
@@ -22,20 +22,21 @@ export const UNIFORM_OFFSET_F32 = {
22
22
  zero: 60,
23
23
  viewportWidth: 61,
24
24
  radiusPx: 62,
25
- rowHeight: 63,
26
- rowOffsetPx: 64,
27
- insetPx: 66,
28
- devicePixelRatio: 67,
29
- minWidthPx: 70,
25
+ triangleRadiusYPx: 63,
26
+ rowHeight: 64,
27
+ rowOffsetPx: 65,
28
+ insetPx: 67,
29
+ devicePixelRatio: 68,
30
+ minWidthPx: 71,
30
31
  };
31
32
  // Word indices into a Int32Array view over the uniform buffer.
32
33
  export const UNIFORM_OFFSET_I32 = {
33
34
  valueScaleType: 6,
34
35
  rampMode: 8,
35
36
  colorCutCount: 12,
36
- reverse: 65,
37
- rowTableKeys: 68,
38
- rule: 69,
37
+ reverse: 66,
38
+ rowTableKeys: 69,
39
+ rule: 70,
39
40
  };
40
41
  // Word indices of each array field’s elements, into a 4-byte-word
41
42
  // view over the uniform buffer (Uint32Array or Float32Array — the
@@ -124,14 +125,15 @@ export function writeUniforms(buf, uniforms) {
124
125
  f32[60] = uniforms.zero;
125
126
  f32[61] = uniforms.viewportWidth;
126
127
  f32[62] = uniforms.radiusPx;
127
- f32[63] = uniforms.rowHeight;
128
- f32[64] = uniforms.rowOffsetPx;
129
- i32[65] = uniforms.reverse;
130
- f32[66] = uniforms.insetPx;
131
- f32[67] = uniforms.devicePixelRatio;
132
- i32[68] = uniforms.rowTableKeys;
133
- i32[69] = uniforms.rule;
134
- f32[70] = uniforms.minWidthPx;
128
+ f32[63] = uniforms.triangleRadiusYPx;
129
+ f32[64] = uniforms.rowHeight;
130
+ f32[65] = uniforms.rowOffsetPx;
131
+ i32[66] = uniforms.reverse;
132
+ f32[67] = uniforms.insetPx;
133
+ f32[68] = uniforms.devicePixelRatio;
134
+ i32[69] = uniforms.rowTableKeys;
135
+ i32[70] = uniforms.rule;
136
+ f32[71] = uniforms.minWidthPx;
135
137
  }
136
138
  export const INSTANCE_STRIDE_BYTES = 24;
137
139
  export const INSTANCE_STRIDE_WORDS = 6;
@@ -1 +1 @@
1
- export declare const WGSL_SOURCE = "struct Uniforms_std140_0\n{\n @align(16) bpRangeX_0 : vec3<f32>,\n @align(4) canvasHeight_0 : f32,\n @align(16) domainMin_0 : f32,\n @align(4) domainMax_0 : f32,\n @align(8) valueScaleType_0 : i32,\n @align(4) valueSymlogConstant_0 : f32,\n @align(16) rampMode_0 : i32,\n @align(4) rampMin_0 : f32,\n @align(8) rampMax_0 : f32,\n @align(4) rampMidNorm_0 : f32,\n @align(16) colorCutCount_0 : i32,\n @align(16) colorCuts_0 : array<vec4<f32>, i32(2)>,\n @align(16) colorBands_0 : array<vec4<f32>, i32(9)>,\n @align(16) zero_0 : f32,\n @align(4) viewportWidth_0 : f32,\n @align(8) radiusPx_0 : f32,\n @align(4) rowHeight_0 : f32,\n @align(16) rowOffsetPx_0 : f32,\n @align(4) reverse_0 : i32,\n @align(8) insetPx_0 : f32,\n @align(4) devicePixelRatio_0 : f32,\n @align(16) rowTableKeys_0 : i32,\n @align(4) rule_0 : i32,\n @align(8) minWidthPx_0 : f32,\n};\n\n@binding(1) @group(0) var<uniform> u_0 : Uniforms_std140_0;\n@binding(2) @group(0) var colorRamp_texture_0 : texture_2d<f32>;\n\n@binding(3) @group(0) var colorRamp_sampler_0 : sampler;\n\n@binding(4) @group(0) var rowTable_texture_0 : texture_2d<f32>;\n\n@binding(5) @group(0) var rowTable_sampler_0 : sampler;\n\nfn quadLocal_0( vid_0 : u32) -> vec2<f32>\n{\n var v_0 : u32 = vid_0 % u32(6);\n var _S1 : bool = v_0 == u32(0);\n var _S2 : bool;\n if(_S1)\n {\n _S2 = true;\n }\n else\n {\n _S2 = v_0 == u32(2);\n }\n if(_S2)\n {\n _S2 = true;\n }\n else\n {\n _S2 = v_0 == u32(3);\n }\n var _S3 : f32;\n if(_S2)\n {\n _S3 = 0.0f;\n }\n else\n {\n _S3 = 1.0f;\n }\n if(_S1)\n {\n _S2 = true;\n }\n else\n {\n _S2 = v_0 == u32(1);\n }\n if(_S2)\n {\n _S2 = true;\n }\n else\n {\n _S2 = v_0 == u32(4);\n }\n var _S4 : f32;\n if(_S2)\n {\n _S4 = 0.0f;\n }\n else\n {\n _S4 = 1.0f;\n }\n return vec2<f32>(_S3, _S4);\n}\n\nfn unpackRGBA_0( c_0 : u32) -> vec4<f32>\n{\n return vec4<f32>(f32((((c_0 >> (u32(0)))) & (u32(255)))), f32((((c_0 >> (u32(8)))) & (u32(255)))), f32((((c_0 >> (u32(16)))) & (u32(255)))), f32((((c_0 >> (u32(24)))) & (u32(255))))) / vec4<f32>(255.0f);\n}\n\nfn rampMidT_0( t_0 : f32, mid_0 : f32) -> f32\n{\n var _S5 : f32 = max(mid_0, 1.0f - mid_0);\n return clamp((t_0 + (_S5 - mid_0)) / (2.0f * _S5), 0.0f, 1.0f);\n}\n\nfn rampColor_0( ramp_texture_0 : texture_2d<f32>, ramp_sampler_0 : sampler, t_1 : f32) -> vec4<f32>\n{\n return (textureSampleLevel((ramp_texture_0), (ramp_sampler_0), (vec2<f32>((clamp(t_1, 0.0f, 1.0f) * 255.0f + 0.5f) / 256.0f, 0.5f)), (0.0f)));\n}\n\nfn colorCutAt_0( i_0 : i32, cutsLo_0 : vec4<f32>, cutsHi_0 : vec4<f32>) -> f32\n{\n var _S6 : f32;\n if(i_0 < i32(4))\n {\n _S6 = cutsLo_0[i_0];\n }\n else\n {\n _S6 = cutsHi_0[i_0 - i32(4)];\n }\n return _S6;\n}\n\nfn thresholdBand_0( value_0 : f32, cutCount_0 : i32, cutsLo_1 : vec4<f32>, cutsHi_1 : vec4<f32>) -> i32\n{\n var band_0 : i32 = i32(0);\n var i_1 : i32 = i32(0);\n for(;;)\n {\n if(i_1 < cutCount_0)\n {\n }\n else\n {\n break;\n }\n if(value_0 >= (colorCutAt_0(i_1, cutsLo_1, cutsHi_1)))\n {\n band_0 = i_1 + i32(1);\n }\n i_1 = i_1 + i32(1);\n }\n return band_0;\n}\n\nfn log1pf_0( x_0 : f32) -> f32\n{\n var u_1 : f32 = 1.0f + x_0;\n var _S7 : f32;\n if(u_1 == 1.0f)\n {\n _S7 = x_0;\n }\n else\n {\n _S7 = log(u_1) * (x_0 / (u_1 - 1.0f));\n }\n return _S7;\n}\n\nfn symlogTransform_0( x_1 : f32, c_1 : f32) -> f32\n{\n return f32((i32(sign((x_1))))) * log1pf_0(abs(x_1 / c_1));\n}\n\nfn normalizeScoreUnclamped_0( score_0 : f32, domainMin_1 : f32, domainMax_1 : f32, scaleType_0 : i32, symlogConstant_0 : f32) -> f32\n{\n var tMax_0 : f32;\n var tMin_0 : f32;\n var t_2 : f32;\n if(scaleType_0 == i32(2))\n {\n var _S8 : f32 = symlogTransform_0(score_0, symlogConstant_0);\n var _S9 : f32 = symlogTransform_0(domainMin_1, symlogConstant_0);\n tMax_0 = symlogTransform_0(domainMax_1, symlogConstant_0);\n tMin_0 = _S9;\n t_2 = _S8;\n }\n else\n {\n if(scaleType_0 == i32(1))\n {\n if(domainMin_1 > 0.0f)\n {\n tMax_0 = domainMin_1;\n }\n else\n {\n tMax_0 = 1.0f;\n }\n var _S10 : f32 = log2(max(score_0, tMax_0));\n var _S11 : f32 = log2(tMax_0);\n tMax_0 = log2(max(domainMax_1, tMax_0));\n tMin_0 = _S11;\n t_2 = _S10;\n }\n else\n {\n tMax_0 = domainMax_1;\n tMin_0 = domainMin_1;\n t_2 = score_0;\n }\n }\n var tRange_0 : f32 = tMax_0 - tMin_0;\n if(tRange_0 <= 0.0f)\n {\n if(t_2 > tMin_0)\n {\n tMax_0 = 1.0f;\n }\n else\n {\n tMax_0 = 0.0f;\n }\n return tMax_0;\n }\n return (t_2 - tMin_0) / tRange_0;\n}\n\nfn normalizeScore_0( score_1 : f32, domainMin_2 : f32, domainMax_2 : f32, scaleType_1 : i32, symlogConstant_1 : f32) -> f32\n{\n return clamp(normalizeScoreUnclamped_0(score_1, domainMin_2, domainMax_2, scaleType_1, symlogConstant_1), 0.0f, 1.0f);\n}\n\nfn rowTableWidth_0( keys_0 : u32) -> u32\n{\n return max(min(keys_0, u32(2048)), u32(1));\n}\n\nfn rowTablePlaneHeight_0( keys_1 : u32) -> u32\n{\n var w_0 : u32 = rowTableWidth_0(keys_1);\n var _S12 : u32 = (keys_1 + w_0 - u32(1)) / w_0;\n return max(_S12, u32(1));\n}\n\nfn rowTableTexelX_0( key_0 : u32, keys_2 : u32) -> u32\n{\n var _S13 : u32 = key_0 % rowTableWidth_0(keys_2);\n return _S13;\n}\n\nfn rowTableTexelY_0( key_1 : u32, keys_3 : u32) -> u32\n{\n var _S14 : u32 = key_1 / rowTableWidth_0(keys_3);\n return _S14;\n}\n\nfn byteOf_0( channel_0 : f32) -> u32\n{\n return u32(channel_0 * 255.0f + 0.5f);\n}\n\nstruct RowPlacement_0\n{\n hidden_0 : bool,\n slot_0 : u32,\n color_0 : vec4<f32>,\n overridden_0 : bool,\n};\n\nfn rowTableLookup_0( table_texture_0 : texture_2d<f32>, table_sampler_0 : sampler, key_2 : u32, keys_4 : i32, own_0 : vec4<f32>) -> RowPlacement_0\n{\n var p_0 : RowPlacement_0;\n p_0.hidden_0 = false;\n p_0.slot_0 = key_2;\n p_0.color_0 = own_0;\n p_0.overridden_0 = false;\n if(keys_4 < i32(0))\n {\n return p_0;\n }\n var n_0 : u32 = u32(keys_4);\n if(key_2 >= n_0)\n {\n p_0.hidden_0 = true;\n return p_0;\n }\n var h_0 : u32 = rowTablePlaneHeight_0(n_0);\n var _S15 : u32 = rowTableTexelX_0(key_2, n_0);\n var u_2 : f32 = (f32(_S15) + 0.5f) / f32(rowTableWidth_0(n_0));\n var rows_0 : f32 = f32(u32(2) * h_0);\n var y_0 : u32 = rowTableTexelY_0(key_2, n_0);\n var _S16 : vec4<f32> = (textureSampleLevel((table_texture_0), (table_sampler_0), (vec2<f32>(u_2, (f32(y_0) + 0.5f) / rows_0)), (0.0f)));\n if((_S16.w) < 0.5f)\n {\n p_0.hidden_0 = true;\n return p_0;\n }\n p_0.slot_0 = ((((byteOf_0(_S16.x)) | ((((byteOf_0(_S16.y)) << (u32(8))))))) | ((((byteOf_0(_S16.z)) << (u32(16))))));\n var _S17 : vec4<f32> = (textureSampleLevel((table_texture_0), (table_sampler_0), (vec2<f32>(u_2, (f32(y_0 + h_0) + 0.5f) / rows_0)), (0.0f)));\n var _S18 : bool = (_S17.w) > 0.0f;\n p_0.overridden_0 = _S18;\n var _S19 : vec4<f32>;\n if(_S18)\n {\n _S19 = _S17;\n }\n else\n {\n _S19 = own_0;\n }\n p_0.color_0 = _S19;\n return p_0;\n}\n\nfn hpSplitUint_0( value_1 : u32) -> vec2<f32>\n{\n var lo_0 : u32 = (value_1 & (u32(4095)));\n return vec2<f32>(f32(value_1 - lo_0), f32(lo_0));\n}\n\nfn hpToClipX_0( splitPos_0 : vec2<f32>, bpRange_0 : vec3<f32>, hpZero_0 : f32) -> f32\n{\n var floorBp_0 : f32 = -3.00000000549775576e+38f + hpZero_0;\n var step_0 : f32 = 2.0f / bpRange_0.z;\n return dot(vec3<f32>(-1.0f, max(splitPos_0.x - bpRange_0.x, floorBp_0), max(splitPos_0.y - bpRange_0.y, floorBp_0)), vec3<f32>(1.0f, step_0, step_0));\n}\n\nfn rowBandTopPx_0( rowOffsetPx_1 : f32, rowHeight_1 : f32, slot_1 : u32) -> f32\n{\n return rowOffsetPx_1 + rowHeight_1 * f32(slot_1);\n}\n\nfn valueToYPxScaled_0( value_2 : f32, domainMin_3 : f32, domainMax_3 : f32, h_1 : f32, scaleType_2 : i32, symlogConstant_2 : f32) -> f32\n{\n return (1.0f - normalizeScore_0(value_2, domainMin_3, domainMax_3, scaleType_2, symlogConstant_2)) * h_1;\n}\n\nfn insetValueYPx_0( value_3 : f32, domainMin_4 : f32, domainMax_4 : f32, h_2 : f32, scaleType_3 : i32, insetPx_1 : f32, symlogConstant_3 : f32) -> f32\n{\n var _S20 : f32 = min(insetPx_1, h_2 * 0.5f);\n return _S20 + valueToYPxScaled_0(value_3, domainMin_4, domainMax_4, h_2 - 2.0f * _S20, scaleType_3, symlogConstant_3);\n}\n\nfn pointYPx_0( value_4 : f32, domainMin_5 : f32, domainMax_5 : f32, h_3 : f32, scaleType_4 : i32, insetPx_2 : f32, symlogConstant_4 : f32) -> f32\n{\n return insetValueYPx_0(value_4, domainMin_5, domainMax_5, h_3, scaleType_4, insetPx_2, symlogConstant_4);\n}\n\nfn pointRowYPx_0( bandTop_0 : f32, h_4 : f32, reverse_1 : i32, valueYPx_0 : f32) -> f32\n{\n var _S21 : f32;\n if(reverse_1 != i32(0))\n {\n _S21 = h_4 - valueYPx_0;\n }\n else\n {\n _S21 = valueYPx_0;\n }\n return bandTop_0 + _S21;\n}\n\nfn yPxToClipY_0( yPx_0 : f32, canvasHeight_1 : f32) -> f32\n{\n return 1.0f - yPx_0 / canvasHeight_1 * 2.0f;\n}\n\nfn pxToClipLen_0( px_0 : f32, size_0 : f32) -> f32\n{\n return px_0 * 2.0f / size_0;\n}\n\nfn extendToMinWidthPx_0( x1_0 : f32, x2_0 : f32, minWidth_0 : f32) -> f32\n{\n var dx_0 : f32 = x2_0 - x1_0;\n var _S22 : f32;\n if((abs(dx_0)) < minWidth_0)\n {\n if(dx_0 < 0.0f)\n {\n _S22 = - minWidth_0;\n }\n else\n {\n _S22 = minWidth_0;\n }\n _S22 = x1_0 + _S22;\n }\n else\n {\n _S22 = x2_0;\n }\n return _S22;\n}\n\nfn extendToMinWidthX_0( x1_1 : f32, x2_1 : f32, minWidthPx_1 : f32, canvasWidth_0 : f32) -> f32\n{\n return extendToMinWidthPx_0(x1_1, x2_1, pxToClipLen_0(minWidthPx_1, canvasWidth_0));\n}\n\nfn clipXToPx_0( clipX_0 : f32, canvasWidth_1 : f32) -> f32\n{\n return (clipX_0 + 1.0f) * 0.5f * canvasWidth_1;\n}\n\nfn crispSquareTopLeftPx_0( centerPx_0 : f32, diameterPx_0 : f32) -> f32\n{\n return floor(centerPx_0 - diameterPx_0 * 0.5f + 0.5f);\n}\n\nfn crispSquareCornerPx_0( centerPx_1 : vec2<f32>, diameterPx_1 : f32, q_0 : vec2<f32>) -> vec2<f32>\n{\n return vec2<f32>(crispSquareTopLeftPx_0(centerPx_1.x, diameterPx_1), crispSquareTopLeftPx_0(centerPx_1.y, diameterPx_1)) + q_0 * vec2<f32>(diameterPx_1);\n}\n\nfn pxToClipX_0( xPx_0 : f32, canvasWidth_2 : f32) -> f32\n{\n return xPx_0 / canvasWidth_2 * 2.0f - 1.0f;\n}\n\nfn crispSquareCornerClip_0( centerClipX_0 : f32, centerYPx_0 : f32, diameterPx_2 : f32, q_1 : vec2<f32>, viewportWidth_1 : f32, canvasHeight_2 : f32) -> vec4<f32>\n{\n var vPx_0 : vec2<f32> = crispSquareCornerPx_0(vec2<f32>(clipXToPx_0(centerClipX_0, viewportWidth_1), centerYPx_0), diameterPx_2, q_1);\n return vec4<f32>(pxToClipX_0(vPx_0.x, viewportWidth_1), yPxToClipY_0(vPx_0.y, canvasHeight_2), 0.0f, 1.0f);\n}\n\nfn aaPx_0( dpr_0 : f32) -> f32\n{\n return 1.0f / max(dpr_0, 1.0f);\n}\n\nfn aaHalfPx_0( dpr_1 : f32) -> f32\n{\n return 0.5f * aaPx_0(dpr_1);\n}\n\nfn glyphExpand_0( unitPx_0 : f32, reaches_0 : f32, dpr_2 : f32) -> f32\n{\n return 1.0f + reaches_0 * aaHalfPx_0(dpr_2) / max(unitPx_0, 0.00100000004749745f);\n}\n\nstruct VsOut_0\n{\n @builtin(position) position_0 : vec4<f32>,\n @location(0) color_1 : vec4<f32>,\n @location(2) localPos_0 : vec2<f32>,\n @interpolate(flat) @location(1) shape_0 : f32,\n};\n\nstruct vertexInput_0\n{\n @location(0) x_2 : u32,\n @location(1) x2_2 : u32,\n @location(2) y_1 : f32,\n @location(3) color_2 : u32,\n @location(4) glyph_0 : u32,\n @location(5) row_0 : u32,\n};\n\nfn markScaleColor_0( _S23 : texture_2d<f32>, _S24 : sampler, _S25 : u32, _S26 : i32, _S27 : f32, _S28 : f32, _S29 : f32, _S30 : i32, _S31 : vec4<f32>, _S32 : vec4<f32>) -> vec4<f32>\n{\n if(_S26 == i32(0))\n {\n return unpackRGBA_0(_S25);\n }\n if(_S25 == u32(2143289345))\n {\n return unpackRGBA_0(u32(4289703855));\n }\n var scaleType_5 : i32;\n if(((_S25 & (u32(2139095040)))) == u32(2139095040))\n {\n if(((_S25 & (u32(8388607)))) != u32(0))\n {\n return unpackRGBA_0(u32(4286611584));\n }\n var negative_0 : bool = ((_S25 & (u32(2147483648)))) != u32(0);\n if(_S26 == i32(3))\n {\n if(negative_0)\n {\n scaleType_5 = i32(0);\n }\n else\n {\n scaleType_5 = _S30;\n }\n return u_0.colorBands_0[scaleType_5];\n }\n var _S33 : f32;\n if(negative_0)\n {\n _S33 = 0.0f;\n }\n else\n {\n _S33 = 1.0f;\n }\n return rampColor_0(_S23, _S24, rampMidT_0(_S33, _S29));\n }\n var value_5 : f32 = (bitcast<f32>((_S25)));\n if(_S26 == i32(3))\n {\n return u_0.colorBands_0[thresholdBand_0(value_5, _S30, _S31, _S32)];\n }\n if(_S26 == i32(2))\n {\n scaleType_5 = i32(1);\n }\n else\n {\n scaleType_5 = i32(0);\n }\n return rampColor_0(_S23, _S24, rampMidT_0(normalizeScore_0(value_5, _S27, _S28, scaleType_5, 1.0f), _S29));\n}\n\nfn bpToClipX_0( _S34 : u32) -> f32\n{\n return hpToClipX_0(hpSplitUint_0(_S34), u_0.bpRangeX_0, u_0.zero_0);\n}\n\n@vertex\nfn vs_main( _S35 : vertexInput_0, @builtin(vertex_index) vid_1 : u32) -> VsOut_0\n{\n var q_2 : vec2<f32> = quadLocal_0(vid_1 % u32(6));\n var local_0 : vec2<f32> = q_2 * vec2<f32>(2.0f) - vec2<f32>(1.0f);\n var xZero_0 : bool = (q_2.x) < 0.5f;\n var o_0 : VsOut_0;\n var _S36 : RowPlacement_0 = rowTableLookup_0(rowTable_texture_0, rowTable_sampler_0, _S35.row_0, u_0.rowTableKeys_0, markScaleColor_0(colorRamp_texture_0, colorRamp_sampler_0, _S35.color_2, u_0.rampMode_0, u_0.rampMin_0, u_0.rampMax_0, u_0.rampMidNorm_0, u_0.colorCutCount_0, u_0.colorCuts_0[i32(0)], u_0.colorCuts_0[i32(1)]));\n if(_S36.hidden_0)\n {\n o_0.position_0 = vec4<f32>(2.0f, 2.0f, 0.0f, 1.0f);\n o_0.color_1 = vec4<f32>(0.0f);\n o_0.localPos_0 = vec2<f32>(0.0f);\n o_0.shape_0 = 3.0f;\n return o_0;\n }\n var _S37 : f32 = bpToClipX_0(_S35.x_2);\n var _S38 : f32 = bpToClipX_0(_S35.x2_2);\n var yPx_1 : f32 = pointRowYPx_0(rowBandTopPx_0(u_0.rowOffsetPx_0, u_0.rowHeight_0, _S36.slot_0), u_0.rowHeight_0, u_0.reverse_0, pointYPx_0(_S35.y_1, u_0.domainMin_0, u_0.domainMax_0, u_0.rowHeight_0, u_0.valueScaleType_0, u_0.insetPx_0, u_0.valueSymlogConstant_0));\n var centerClipY_0 : f32 = yPxToClipY_0(yPx_1, u_0.canvasHeight_0);\n o_0.color_1 = _S36.color_0;\n var centerClipX_1 : f32 = (_S37 + _S38) * 0.5f;\n var x_3 : f32;\n if((u_0.rule_0) != i32(0))\n {\n var farClipX_0 : f32 = extendToMinWidthX_0(_S37, _S38, u_0.minWidthPx_0, u_0.viewportWidth_0);\n if(xZero_0)\n {\n x_3 = min(_S37, farClipX_0);\n }\n else\n {\n x_3 = max(_S37, farClipX_0);\n }\n o_0.position_0 = vec4<f32>(x_3, centerClipY_0 + pxToClipLen_0(local_0.y * u_0.radiusPx_0, u_0.canvasHeight_0), 0.0f, 1.0f);\n o_0.localPos_0 = local_0;\n o_0.shape_0 = 3.0f;\n }\n else\n {\n var _S39 : bool;\n if((_S35.glyph_0) == u32(3))\n {\n _S39 = true;\n }\n else\n {\n if((_S35.glyph_0) == u32(0))\n {\n _S39 = (u_0.radiusPx_0 * 2.0f) <= 3.0f;\n }\n else\n {\n _S39 = false;\n }\n }\n if(_S39)\n {\n o_0.position_0 = crispSquareCornerClip_0(centerClipX_1, yPx_1, u_0.radiusPx_0 * 2.0f, q_2, u_0.viewportWidth_0, u_0.canvasHeight_0);\n o_0.localPos_0 = local_0;\n o_0.shape_0 = 3.0f;\n }\n else\n {\n var diamond_0 : bool = (_S35.glyph_0) == u32(2);\n var _S40 : f32 = u_0.radiusPx_0;\n if(diamond_0)\n {\n x_3 = 1.60000002384185791f;\n }\n else\n {\n x_3 = 1.0f;\n }\n var unitPx_1 : f32 = _S40 * x_3;\n var _S41 : bool = (_S35.glyph_0) == u32(1);\n if(_S41)\n {\n x_3 = 2.2360680103302002f;\n }\n else\n {\n if(diamond_0)\n {\n x_3 = 1.41421365737915039f;\n }\n else\n {\n x_3 = 1.0f;\n }\n }\n var expand_0 : f32 = glyphExpand_0(unitPx_1, x_3, u_0.devicePixelRatio_0);\n var halfPx_0 : f32 = unitPx_1 * expand_0;\n o_0.position_0 = vec4<f32>(centerClipX_1 + pxToClipLen_0(local_0.x * halfPx_0, u_0.viewportWidth_0), centerClipY_0 + pxToClipLen_0(local_0.y * halfPx_0, u_0.canvasHeight_0), 0.0f, 1.0f);\n o_0.localPos_0 = local_0 * vec2<f32>(expand_0);\n if(_S41)\n {\n x_3 = 2.0f;\n }\n else\n {\n if(diamond_0)\n {\n x_3 = 1.0f;\n }\n else\n {\n x_3 = 0.0f;\n }\n }\n o_0.shape_0 = x_3;\n }\n }\n return o_0;\n}\n\nfn discCoverage_0( localPos_1 : vec2<f32>) -> f32\n{\n return 1.0f - length(localPos_1);\n}\n\nfn aaGradient_0( d_0 : f32) -> f32\n{\n return max(length(vec2<f32>(dpdx(d_0), dpdy(d_0))), 0.00000999999974738f);\n}\n\nfn aaRamp_0( signedInk_0 : f32, widthPx_0 : f32) -> f32\n{\n return clamp(signedInk_0 / widthPx_0 + 0.5f, 0.0f, 1.0f);\n}\n\nfn glyphEdgeAlpha_0( coverage_0 : f32) -> f32\n{\n return aaRamp_0(coverage_0, aaGradient_0(coverage_0));\n}\n\nstruct pixelOutput_0\n{\n @location(0) output_0 : vec4<f32>,\n};\n\nstruct pixelInput_0\n{\n @location(0) color_3 : vec4<f32>,\n @location(2) localPos_2 : vec2<f32>,\n @interpolate(flat) @location(1) shape_1 : f32,\n};\n\n@fragment\nfn fs_main( _S42 : pixelInput_0, @builtin(position) position_1 : vec4<f32>) -> pixelOutput_0\n{\n var coverage_1 : f32;\n if((_S42.shape_1) > 2.5f)\n {\n coverage_1 = 1.0f;\n }\n else\n {\n if((_S42.shape_1) > 1.5f)\n {\n var _S43 : f32 = _S42.localPos_2.y;\n var _S44 : f32 = _S42.localPos_2.x;\n coverage_1 = min(1.0f - _S43, min((2.0f * _S44 + _S43 + 1.0f) * 0.44721359014511108f, (-2.0f * _S44 + _S43 + 1.0f) * 0.44721359014511108f));\n }\n else\n {\n if((_S42.shape_1) > 0.5f)\n {\n coverage_1 = 1.0f - (abs(_S42.localPos_2.x) + abs(_S42.localPos_2.y));\n }\n else\n {\n coverage_1 = discCoverage_0(_S42.localPos_2);\n }\n }\n }\n var alpha_0 : f32 = glyphEdgeAlpha_0(coverage_1);\n if(alpha_0 <= 0.0f)\n {\n discard;\n }\n var _S45 : pixelOutput_0 = pixelOutput_0( vec4<f32>(_S42.color_3.xyz, _S42.color_3.w * alpha_0) );\n return _S45;\n}\n\n";
1
+ export declare const WGSL_SOURCE = "struct Uniforms_std140_0\n{\n @align(16) bpRangeX_0 : vec3<f32>,\n @align(4) canvasHeight_0 : f32,\n @align(16) domainMin_0 : f32,\n @align(4) domainMax_0 : f32,\n @align(8) valueScaleType_0 : i32,\n @align(4) valueSymlogConstant_0 : f32,\n @align(16) rampMode_0 : i32,\n @align(4) rampMin_0 : f32,\n @align(8) rampMax_0 : f32,\n @align(4) rampMidNorm_0 : f32,\n @align(16) colorCutCount_0 : i32,\n @align(16) colorCuts_0 : array<vec4<f32>, i32(2)>,\n @align(16) colorBands_0 : array<vec4<f32>, i32(9)>,\n @align(16) zero_0 : f32,\n @align(4) viewportWidth_0 : f32,\n @align(8) radiusPx_0 : f32,\n @align(4) triangleRadiusYPx_0 : f32,\n @align(16) rowHeight_0 : f32,\n @align(4) rowOffsetPx_0 : f32,\n @align(8) reverse_0 : i32,\n @align(4) insetPx_0 : f32,\n @align(16) devicePixelRatio_0 : f32,\n @align(4) rowTableKeys_0 : i32,\n @align(8) rule_0 : i32,\n @align(4) minWidthPx_0 : f32,\n};\n\n@binding(1) @group(0) var<uniform> u_0 : Uniforms_std140_0;\n@binding(2) @group(0) var colorRamp_texture_0 : texture_2d<f32>;\n\n@binding(3) @group(0) var colorRamp_sampler_0 : sampler;\n\n@binding(4) @group(0) var rowTable_texture_0 : texture_2d<f32>;\n\n@binding(5) @group(0) var rowTable_sampler_0 : sampler;\n\nfn quadLocal_0( vid_0 : u32) -> vec2<f32>\n{\n var v_0 : u32 = vid_0 % u32(6);\n var _S1 : bool = v_0 == u32(0);\n var _S2 : bool;\n if(_S1)\n {\n _S2 = true;\n }\n else\n {\n _S2 = v_0 == u32(2);\n }\n if(_S2)\n {\n _S2 = true;\n }\n else\n {\n _S2 = v_0 == u32(3);\n }\n var _S3 : f32;\n if(_S2)\n {\n _S3 = 0.0f;\n }\n else\n {\n _S3 = 1.0f;\n }\n if(_S1)\n {\n _S2 = true;\n }\n else\n {\n _S2 = v_0 == u32(1);\n }\n if(_S2)\n {\n _S2 = true;\n }\n else\n {\n _S2 = v_0 == u32(4);\n }\n var _S4 : f32;\n if(_S2)\n {\n _S4 = 0.0f;\n }\n else\n {\n _S4 = 1.0f;\n }\n return vec2<f32>(_S3, _S4);\n}\n\nfn unpackRGBA_0( c_0 : u32) -> vec4<f32>\n{\n return vec4<f32>(f32((((c_0 >> (u32(0)))) & (u32(255)))), f32((((c_0 >> (u32(8)))) & (u32(255)))), f32((((c_0 >> (u32(16)))) & (u32(255)))), f32((((c_0 >> (u32(24)))) & (u32(255))))) / vec4<f32>(255.0f);\n}\n\nfn rampMidT_0( t_0 : f32, mid_0 : f32) -> f32\n{\n var _S5 : f32 = max(mid_0, 1.0f - mid_0);\n return clamp((t_0 + (_S5 - mid_0)) / (2.0f * _S5), 0.0f, 1.0f);\n}\n\nfn rampColor_0( ramp_texture_0 : texture_2d<f32>, ramp_sampler_0 : sampler, t_1 : f32) -> vec4<f32>\n{\n return (textureSampleLevel((ramp_texture_0), (ramp_sampler_0), (vec2<f32>((clamp(t_1, 0.0f, 1.0f) * 255.0f + 0.5f) / 256.0f, 0.5f)), (0.0f)));\n}\n\nfn colorCutAt_0( i_0 : i32, cutsLo_0 : vec4<f32>, cutsHi_0 : vec4<f32>) -> f32\n{\n var _S6 : f32;\n if(i_0 < i32(4))\n {\n _S6 = cutsLo_0[i_0];\n }\n else\n {\n _S6 = cutsHi_0[i_0 - i32(4)];\n }\n return _S6;\n}\n\nfn thresholdBand_0( value_0 : f32, cutCount_0 : i32, cutsLo_1 : vec4<f32>, cutsHi_1 : vec4<f32>) -> i32\n{\n var band_0 : i32 = i32(0);\n var i_1 : i32 = i32(0);\n for(;;)\n {\n if(i_1 < cutCount_0)\n {\n }\n else\n {\n break;\n }\n if(value_0 >= (colorCutAt_0(i_1, cutsLo_1, cutsHi_1)))\n {\n band_0 = i_1 + i32(1);\n }\n i_1 = i_1 + i32(1);\n }\n return band_0;\n}\n\nfn log1pf_0( x_0 : f32) -> f32\n{\n var u_1 : f32 = 1.0f + x_0;\n var _S7 : f32;\n if(u_1 == 1.0f)\n {\n _S7 = x_0;\n }\n else\n {\n _S7 = log(u_1) * (x_0 / (u_1 - 1.0f));\n }\n return _S7;\n}\n\nfn symlogTransform_0( x_1 : f32, c_1 : f32) -> f32\n{\n return f32((i32(sign((x_1))))) * log1pf_0(abs(x_1 / c_1));\n}\n\nfn normalizeScoreUnclamped_0( score_0 : f32, domainMin_1 : f32, domainMax_1 : f32, scaleType_0 : i32, symlogConstant_0 : f32) -> f32\n{\n var tMax_0 : f32;\n var tMin_0 : f32;\n var t_2 : f32;\n if(scaleType_0 == i32(2))\n {\n var _S8 : f32 = symlogTransform_0(score_0, symlogConstant_0);\n var _S9 : f32 = symlogTransform_0(domainMin_1, symlogConstant_0);\n tMax_0 = symlogTransform_0(domainMax_1, symlogConstant_0);\n tMin_0 = _S9;\n t_2 = _S8;\n }\n else\n {\n if(scaleType_0 == i32(1))\n {\n if(domainMin_1 > 0.0f)\n {\n tMax_0 = domainMin_1;\n }\n else\n {\n tMax_0 = 1.0f;\n }\n var _S10 : f32 = log2(max(score_0, tMax_0));\n var _S11 : f32 = log2(tMax_0);\n tMax_0 = log2(max(domainMax_1, tMax_0));\n tMin_0 = _S11;\n t_2 = _S10;\n }\n else\n {\n tMax_0 = domainMax_1;\n tMin_0 = domainMin_1;\n t_2 = score_0;\n }\n }\n var tRange_0 : f32 = tMax_0 - tMin_0;\n if(tRange_0 <= 0.0f)\n {\n if(t_2 > tMin_0)\n {\n tMax_0 = 1.0f;\n }\n else\n {\n tMax_0 = 0.0f;\n }\n return tMax_0;\n }\n return (t_2 - tMin_0) / tRange_0;\n}\n\nfn normalizeScore_0( score_1 : f32, domainMin_2 : f32, domainMax_2 : f32, scaleType_1 : i32, symlogConstant_1 : f32) -> f32\n{\n return clamp(normalizeScoreUnclamped_0(score_1, domainMin_2, domainMax_2, scaleType_1, symlogConstant_1), 0.0f, 1.0f);\n}\n\nfn rowTableWidth_0( keys_0 : u32) -> u32\n{\n return max(min(keys_0, u32(2048)), u32(1));\n}\n\nfn rowTablePlaneHeight_0( keys_1 : u32) -> u32\n{\n var w_0 : u32 = rowTableWidth_0(keys_1);\n var _S12 : u32 = (keys_1 + w_0 - u32(1)) / w_0;\n return max(_S12, u32(1));\n}\n\nfn rowTableTexelX_0( key_0 : u32, keys_2 : u32) -> u32\n{\n var _S13 : u32 = key_0 % rowTableWidth_0(keys_2);\n return _S13;\n}\n\nfn rowTableTexelY_0( key_1 : u32, keys_3 : u32) -> u32\n{\n var _S14 : u32 = key_1 / rowTableWidth_0(keys_3);\n return _S14;\n}\n\nfn byteOf_0( channel_0 : f32) -> u32\n{\n return u32(channel_0 * 255.0f + 0.5f);\n}\n\nstruct RowPlacement_0\n{\n hidden_0 : bool,\n slot_0 : u32,\n color_0 : vec4<f32>,\n overridden_0 : bool,\n};\n\nfn rowTableLookup_0( table_texture_0 : texture_2d<f32>, table_sampler_0 : sampler, key_2 : u32, keys_4 : i32, own_0 : vec4<f32>) -> RowPlacement_0\n{\n var p_0 : RowPlacement_0;\n p_0.hidden_0 = false;\n p_0.slot_0 = key_2;\n p_0.color_0 = own_0;\n p_0.overridden_0 = false;\n if(keys_4 < i32(0))\n {\n return p_0;\n }\n var n_0 : u32 = u32(keys_4);\n if(key_2 >= n_0)\n {\n p_0.hidden_0 = true;\n return p_0;\n }\n var h_0 : u32 = rowTablePlaneHeight_0(n_0);\n var _S15 : u32 = rowTableTexelX_0(key_2, n_0);\n var u_2 : f32 = (f32(_S15) + 0.5f) / f32(rowTableWidth_0(n_0));\n var rows_0 : f32 = f32(u32(2) * h_0);\n var y_0 : u32 = rowTableTexelY_0(key_2, n_0);\n var _S16 : vec4<f32> = (textureSampleLevel((table_texture_0), (table_sampler_0), (vec2<f32>(u_2, (f32(y_0) + 0.5f) / rows_0)), (0.0f)));\n if((_S16.w) < 0.5f)\n {\n p_0.hidden_0 = true;\n return p_0;\n }\n p_0.slot_0 = ((((byteOf_0(_S16.x)) | ((((byteOf_0(_S16.y)) << (u32(8))))))) | ((((byteOf_0(_S16.z)) << (u32(16))))));\n var _S17 : vec4<f32> = (textureSampleLevel((table_texture_0), (table_sampler_0), (vec2<f32>(u_2, (f32(y_0 + h_0) + 0.5f) / rows_0)), (0.0f)));\n var _S18 : bool = (_S17.w) > 0.0f;\n p_0.overridden_0 = _S18;\n var _S19 : vec4<f32>;\n if(_S18)\n {\n _S19 = _S17;\n }\n else\n {\n _S19 = own_0;\n }\n p_0.color_0 = _S19;\n return p_0;\n}\n\nfn hpSplitUint_0( value_1 : u32) -> vec2<f32>\n{\n var lo_0 : u32 = (value_1 & (u32(4095)));\n return vec2<f32>(f32(value_1 - lo_0), f32(lo_0));\n}\n\nfn hpToClipX_0( splitPos_0 : vec2<f32>, bpRange_0 : vec3<f32>, hpZero_0 : f32) -> f32\n{\n var floorBp_0 : f32 = -3.00000000549775576e+38f + hpZero_0;\n var step_0 : f32 = 2.0f / bpRange_0.z;\n return dot(vec3<f32>(-1.0f, max(splitPos_0.x - bpRange_0.x, floorBp_0), max(splitPos_0.y - bpRange_0.y, floorBp_0)), vec3<f32>(1.0f, step_0, step_0));\n}\n\nfn rowBandTopPx_0( rowOffsetPx_1 : f32, rowHeight_1 : f32, slot_1 : u32) -> f32\n{\n return rowOffsetPx_1 + rowHeight_1 * f32(slot_1);\n}\n\nfn valueToYPxScaled_0( value_2 : f32, domainMin_3 : f32, domainMax_3 : f32, h_1 : f32, scaleType_2 : i32, symlogConstant_2 : f32) -> f32\n{\n return (1.0f - normalizeScore_0(value_2, domainMin_3, domainMax_3, scaleType_2, symlogConstant_2)) * h_1;\n}\n\nfn insetValueYPx_0( value_3 : f32, domainMin_4 : f32, domainMax_4 : f32, h_2 : f32, scaleType_3 : i32, insetPx_1 : f32, symlogConstant_3 : f32) -> f32\n{\n var _S20 : f32 = min(insetPx_1, h_2 * 0.5f);\n return _S20 + valueToYPxScaled_0(value_3, domainMin_4, domainMax_4, h_2 - 2.0f * _S20, scaleType_3, symlogConstant_3);\n}\n\nfn pointYPx_0( value_4 : f32, domainMin_5 : f32, domainMax_5 : f32, h_3 : f32, scaleType_4 : i32, insetPx_2 : f32, symlogConstant_4 : f32) -> f32\n{\n return insetValueYPx_0(value_4, domainMin_5, domainMax_5, h_3, scaleType_4, insetPx_2, symlogConstant_4);\n}\n\nfn pointRowYPx_0( bandTop_0 : f32, h_4 : f32, reverse_1 : i32, valueYPx_0 : f32) -> f32\n{\n var _S21 : f32;\n if(reverse_1 != i32(0))\n {\n _S21 = h_4 - valueYPx_0;\n }\n else\n {\n _S21 = valueYPx_0;\n }\n return bandTop_0 + _S21;\n}\n\nfn yPxToClipY_0( yPx_0 : f32, canvasHeight_1 : f32) -> f32\n{\n return 1.0f - yPx_0 / canvasHeight_1 * 2.0f;\n}\n\nfn pxToClipLen_0( px_0 : f32, size_0 : f32) -> f32\n{\n return px_0 * 2.0f / size_0;\n}\n\nfn extendToMinWidthPx_0( x1_0 : f32, x2_0 : f32, minWidth_0 : f32) -> f32\n{\n var dx_0 : f32 = x2_0 - x1_0;\n var _S22 : f32;\n if((abs(dx_0)) < minWidth_0)\n {\n if(dx_0 < 0.0f)\n {\n _S22 = - minWidth_0;\n }\n else\n {\n _S22 = minWidth_0;\n }\n _S22 = x1_0 + _S22;\n }\n else\n {\n _S22 = x2_0;\n }\n return _S22;\n}\n\nfn extendToMinWidthX_0( x1_1 : f32, x2_1 : f32, minWidthPx_1 : f32, canvasWidth_0 : f32) -> f32\n{\n return extendToMinWidthPx_0(x1_1, x2_1, pxToClipLen_0(minWidthPx_1, canvasWidth_0));\n}\n\nfn clipXToPx_0( clipX_0 : f32, canvasWidth_1 : f32) -> f32\n{\n return (clipX_0 + 1.0f) * 0.5f * canvasWidth_1;\n}\n\nfn crispSquareTopLeftPx_0( centerPx_0 : f32, diameterPx_0 : f32) -> f32\n{\n return floor(centerPx_0 - diameterPx_0 * 0.5f + 0.5f);\n}\n\nfn crispSquareCornerPx_0( centerPx_1 : vec2<f32>, diameterPx_1 : f32, q_0 : vec2<f32>) -> vec2<f32>\n{\n return vec2<f32>(crispSquareTopLeftPx_0(centerPx_1.x, diameterPx_1), crispSquareTopLeftPx_0(centerPx_1.y, diameterPx_1)) + q_0 * vec2<f32>(diameterPx_1);\n}\n\nfn pxToClipX_0( xPx_0 : f32, canvasWidth_2 : f32) -> f32\n{\n return xPx_0 / canvasWidth_2 * 2.0f - 1.0f;\n}\n\nfn crispSquareCornerClip_0( centerClipX_0 : f32, centerYPx_0 : f32, diameterPx_2 : f32, q_1 : vec2<f32>, viewportWidth_1 : f32, canvasHeight_2 : f32) -> vec4<f32>\n{\n var vPx_0 : vec2<f32> = crispSquareCornerPx_0(vec2<f32>(clipXToPx_0(centerClipX_0, viewportWidth_1), centerYPx_0), diameterPx_2, q_1);\n return vec4<f32>(pxToClipX_0(vPx_0.x, viewportWidth_1), yPxToClipY_0(vPx_0.y, canvasHeight_2), 0.0f, 1.0f);\n}\n\nfn aaPx_0( dpr_0 : f32) -> f32\n{\n return 1.0f / max(dpr_0, 1.0f);\n}\n\nfn aaHalfPx_0( dpr_1 : f32) -> f32\n{\n return 0.5f * aaPx_0(dpr_1);\n}\n\nfn glyphExpand_0( unitPx_0 : f32, reaches_0 : f32, dpr_2 : f32) -> f32\n{\n return 1.0f + reaches_0 * aaHalfPx_0(dpr_2) / max(unitPx_0, 0.00100000004749745f);\n}\n\nstruct VsOut_0\n{\n @builtin(position) position_0 : vec4<f32>,\n @location(0) color_1 : vec4<f32>,\n @location(2) localPos_0 : vec2<f32>,\n @interpolate(flat) @location(1) shape_0 : f32,\n};\n\nstruct vertexInput_0\n{\n @location(0) x_2 : u32,\n @location(1) x2_2 : u32,\n @location(2) y_1 : f32,\n @location(3) color_2 : u32,\n @location(4) glyph_0 : u32,\n @location(5) row_0 : u32,\n};\n\nfn markScaleColor_0( _S23 : texture_2d<f32>, _S24 : sampler, _S25 : u32, _S26 : i32, _S27 : f32, _S28 : f32, _S29 : f32, _S30 : i32, _S31 : vec4<f32>, _S32 : vec4<f32>) -> vec4<f32>\n{\n if(_S26 == i32(0))\n {\n return unpackRGBA_0(_S25);\n }\n if(_S25 == u32(2143289345))\n {\n return unpackRGBA_0(u32(4289703855));\n }\n var scaleType_5 : i32;\n if(((_S25 & (u32(2139095040)))) == u32(2139095040))\n {\n if(((_S25 & (u32(8388607)))) != u32(0))\n {\n return unpackRGBA_0(u32(4286611584));\n }\n var negative_0 : bool = ((_S25 & (u32(2147483648)))) != u32(0);\n if(_S26 == i32(3))\n {\n if(negative_0)\n {\n scaleType_5 = i32(0);\n }\n else\n {\n scaleType_5 = _S30;\n }\n return u_0.colorBands_0[scaleType_5];\n }\n var _S33 : f32;\n if(negative_0)\n {\n _S33 = 0.0f;\n }\n else\n {\n _S33 = 1.0f;\n }\n return rampColor_0(_S23, _S24, rampMidT_0(_S33, _S29));\n }\n var value_5 : f32 = (bitcast<f32>((_S25)));\n if(_S26 == i32(3))\n {\n return u_0.colorBands_0[thresholdBand_0(value_5, _S30, _S31, _S32)];\n }\n if(_S26 == i32(2))\n {\n scaleType_5 = i32(1);\n }\n else\n {\n scaleType_5 = i32(0);\n }\n return rampColor_0(_S23, _S24, rampMidT_0(normalizeScore_0(value_5, _S27, _S28, scaleType_5, 1.0f), _S29));\n}\n\nfn bpToClipX_0( _S34 : u32) -> f32\n{\n return hpToClipX_0(hpSplitUint_0(_S34), u_0.bpRangeX_0, u_0.zero_0);\n}\n\n@vertex\nfn vs_main( _S35 : vertexInput_0, @builtin(vertex_index) vid_1 : u32) -> VsOut_0\n{\n var q_2 : vec2<f32> = quadLocal_0(vid_1 % u32(6));\n var local_0 : vec2<f32> = q_2 * vec2<f32>(2.0f) - vec2<f32>(1.0f);\n var xZero_0 : bool = (q_2.x) < 0.5f;\n var o_0 : VsOut_0;\n var _S36 : RowPlacement_0 = rowTableLookup_0(rowTable_texture_0, rowTable_sampler_0, _S35.row_0, u_0.rowTableKeys_0, markScaleColor_0(colorRamp_texture_0, colorRamp_sampler_0, _S35.color_2, u_0.rampMode_0, u_0.rampMin_0, u_0.rampMax_0, u_0.rampMidNorm_0, u_0.colorCutCount_0, u_0.colorCuts_0[i32(0)], u_0.colorCuts_0[i32(1)]));\n if(_S36.hidden_0)\n {\n o_0.position_0 = vec4<f32>(2.0f, 2.0f, 0.0f, 1.0f);\n o_0.color_1 = vec4<f32>(0.0f);\n o_0.localPos_0 = vec2<f32>(0.0f);\n o_0.shape_0 = 3.0f;\n return o_0;\n }\n var _S37 : f32 = bpToClipX_0(_S35.x_2);\n var _S38 : f32 = bpToClipX_0(_S35.x2_2);\n var yPx_1 : f32 = pointRowYPx_0(rowBandTopPx_0(u_0.rowOffsetPx_0, u_0.rowHeight_0, _S36.slot_0), u_0.rowHeight_0, u_0.reverse_0, pointYPx_0(_S35.y_1, u_0.domainMin_0, u_0.domainMax_0, u_0.rowHeight_0, u_0.valueScaleType_0, u_0.insetPx_0, u_0.valueSymlogConstant_0));\n var centerClipY_0 : f32 = yPxToClipY_0(yPx_1, u_0.canvasHeight_0);\n o_0.color_1 = _S36.color_0;\n var centerClipX_1 : f32 = (_S37 + _S38) * 0.5f;\n var x_3 : f32;\n if((u_0.rule_0) != i32(0))\n {\n var farClipX_0 : f32 = extendToMinWidthX_0(_S37, _S38, u_0.minWidthPx_0, u_0.viewportWidth_0);\n if(xZero_0)\n {\n x_3 = min(_S37, farClipX_0);\n }\n else\n {\n x_3 = max(_S37, farClipX_0);\n }\n o_0.position_0 = vec4<f32>(x_3, centerClipY_0 + pxToClipLen_0(local_0.y * u_0.radiusPx_0, u_0.canvasHeight_0), 0.0f, 1.0f);\n o_0.localPos_0 = local_0;\n o_0.shape_0 = 3.0f;\n }\n else\n {\n var _S39 : bool;\n if((_S35.glyph_0) == u32(3))\n {\n _S39 = true;\n }\n else\n {\n if((_S35.glyph_0) == u32(0))\n {\n _S39 = (u_0.radiusPx_0 * 2.0f) <= 3.0f;\n }\n else\n {\n _S39 = false;\n }\n }\n if(_S39)\n {\n o_0.position_0 = crispSquareCornerClip_0(centerClipX_1, yPx_1, u_0.radiusPx_0 * 2.0f, q_2, u_0.viewportWidth_0, u_0.canvasHeight_0);\n o_0.localPos_0 = local_0;\n o_0.shape_0 = 3.0f;\n }\n else\n {\n var diamond_0 : bool = (_S35.glyph_0) == u32(2);\n var _S40 : f32 = u_0.radiusPx_0;\n if(diamond_0)\n {\n x_3 = 1.60000002384185791f;\n }\n else\n {\n x_3 = 1.0f;\n }\n var unitPx_1 : f32 = _S40 * x_3;\n var _S41 : bool = (_S35.glyph_0) == u32(1);\n if(_S41)\n {\n x_3 = 2.2360680103302002f;\n }\n else\n {\n if(diamond_0)\n {\n x_3 = 1.41421365737915039f;\n }\n else\n {\n x_3 = 1.0f;\n }\n }\n var unitYPx_0 : f32;\n if(_S41)\n {\n unitYPx_0 = u_0.triangleRadiusYPx_0;\n }\n else\n {\n unitYPx_0 = unitPx_1;\n }\n var _S42 : f32 = glyphExpand_0(unitPx_1, x_3, u_0.devicePixelRatio_0);\n var _S43 : f32 = glyphExpand_0(unitYPx_0, x_3, u_0.devicePixelRatio_0);\n var expand_0 : vec2<f32> = vec2<f32>(_S42, _S43);\n o_0.position_0 = vec4<f32>(centerClipX_1 + pxToClipLen_0(local_0.x * unitPx_1 * _S42, u_0.viewportWidth_0), centerClipY_0 + pxToClipLen_0(local_0.y * unitYPx_0 * _S43, u_0.canvasHeight_0), 0.0f, 1.0f);\n o_0.localPos_0 = local_0 * expand_0;\n if(_S41)\n {\n x_3 = 2.0f;\n }\n else\n {\n if(diamond_0)\n {\n x_3 = 1.0f;\n }\n else\n {\n x_3 = 0.0f;\n }\n }\n o_0.shape_0 = x_3;\n }\n }\n return o_0;\n}\n\nfn discCoverage_0( localPos_1 : vec2<f32>) -> f32\n{\n return 1.0f - length(localPos_1);\n}\n\nfn aaGradient_0( d_0 : f32) -> f32\n{\n return max(length(vec2<f32>(dpdx(d_0), dpdy(d_0))), 0.00000999999974738f);\n}\n\nfn aaRamp_0( signedInk_0 : f32, widthPx_0 : f32) -> f32\n{\n return clamp(signedInk_0 / widthPx_0 + 0.5f, 0.0f, 1.0f);\n}\n\nfn glyphEdgeAlpha_0( coverage_0 : f32) -> f32\n{\n return aaRamp_0(coverage_0, aaGradient_0(coverage_0));\n}\n\nstruct pixelOutput_0\n{\n @location(0) output_0 : vec4<f32>,\n};\n\nstruct pixelInput_0\n{\n @location(0) color_3 : vec4<f32>,\n @location(2) localPos_2 : vec2<f32>,\n @interpolate(flat) @location(1) shape_1 : f32,\n};\n\n@fragment\nfn fs_main( _S44 : pixelInput_0, @builtin(position) position_1 : vec4<f32>) -> pixelOutput_0\n{\n var coverage_1 : f32;\n if((_S44.shape_1) > 2.5f)\n {\n coverage_1 = 1.0f;\n }\n else\n {\n if((_S44.shape_1) > 1.5f)\n {\n var _S45 : f32 = _S44.localPos_2.y;\n var _S46 : f32 = _S44.localPos_2.x;\n coverage_1 = min(1.0f - _S45, min((2.0f * _S46 + _S45 + 1.0f) * 0.44721359014511108f, (-2.0f * _S46 + _S45 + 1.0f) * 0.44721359014511108f));\n }\n else\n {\n if((_S44.shape_1) > 0.5f)\n {\n coverage_1 = 1.0f - (abs(_S44.localPos_2.x) + abs(_S44.localPos_2.y));\n }\n else\n {\n coverage_1 = discCoverage_0(_S44.localPos_2);\n }\n }\n }\n var alpha_0 : f32 = glyphEdgeAlpha_0(coverage_1);\n if(alpha_0 <= 0.0f)\n {\n discard;\n }\n var _S47 : pixelOutput_0 = pixelOutput_0( vec4<f32>(_S44.color_3.xyz, _S44.color_3.w * alpha_0) );\n return _S47;\n}\n\n";
@@ -1,3 +1,3 @@
1
1
  // AUTO-GENERATED by packages/shader-tools/src/shader-codegen from pointMark.slang.
2
2
  // Do not edit. Run `pnpm gen:shaders` to regenerate.
3
- export const WGSL_SOURCE = "struct Uniforms_std140_0\n{\n @align(16) bpRangeX_0 : vec3<f32>,\n @align(4) canvasHeight_0 : f32,\n @align(16) domainMin_0 : f32,\n @align(4) domainMax_0 : f32,\n @align(8) valueScaleType_0 : i32,\n @align(4) valueSymlogConstant_0 : f32,\n @align(16) rampMode_0 : i32,\n @align(4) rampMin_0 : f32,\n @align(8) rampMax_0 : f32,\n @align(4) rampMidNorm_0 : f32,\n @align(16) colorCutCount_0 : i32,\n @align(16) colorCuts_0 : array<vec4<f32>, i32(2)>,\n @align(16) colorBands_0 : array<vec4<f32>, i32(9)>,\n @align(16) zero_0 : f32,\n @align(4) viewportWidth_0 : f32,\n @align(8) radiusPx_0 : f32,\n @align(4) rowHeight_0 : f32,\n @align(16) rowOffsetPx_0 : f32,\n @align(4) reverse_0 : i32,\n @align(8) insetPx_0 : f32,\n @align(4) devicePixelRatio_0 : f32,\n @align(16) rowTableKeys_0 : i32,\n @align(4) rule_0 : i32,\n @align(8) minWidthPx_0 : f32,\n};\n\n@binding(1) @group(0) var<uniform> u_0 : Uniforms_std140_0;\n@binding(2) @group(0) var colorRamp_texture_0 : texture_2d<f32>;\n\n@binding(3) @group(0) var colorRamp_sampler_0 : sampler;\n\n@binding(4) @group(0) var rowTable_texture_0 : texture_2d<f32>;\n\n@binding(5) @group(0) var rowTable_sampler_0 : sampler;\n\nfn quadLocal_0( vid_0 : u32) -> vec2<f32>\n{\n var v_0 : u32 = vid_0 % u32(6);\n var _S1 : bool = v_0 == u32(0);\n var _S2 : bool;\n if(_S1)\n {\n _S2 = true;\n }\n else\n {\n _S2 = v_0 == u32(2);\n }\n if(_S2)\n {\n _S2 = true;\n }\n else\n {\n _S2 = v_0 == u32(3);\n }\n var _S3 : f32;\n if(_S2)\n {\n _S3 = 0.0f;\n }\n else\n {\n _S3 = 1.0f;\n }\n if(_S1)\n {\n _S2 = true;\n }\n else\n {\n _S2 = v_0 == u32(1);\n }\n if(_S2)\n {\n _S2 = true;\n }\n else\n {\n _S2 = v_0 == u32(4);\n }\n var _S4 : f32;\n if(_S2)\n {\n _S4 = 0.0f;\n }\n else\n {\n _S4 = 1.0f;\n }\n return vec2<f32>(_S3, _S4);\n}\n\nfn unpackRGBA_0( c_0 : u32) -> vec4<f32>\n{\n return vec4<f32>(f32((((c_0 >> (u32(0)))) & (u32(255)))), f32((((c_0 >> (u32(8)))) & (u32(255)))), f32((((c_0 >> (u32(16)))) & (u32(255)))), f32((((c_0 >> (u32(24)))) & (u32(255))))) / vec4<f32>(255.0f);\n}\n\nfn rampMidT_0( t_0 : f32, mid_0 : f32) -> f32\n{\n var _S5 : f32 = max(mid_0, 1.0f - mid_0);\n return clamp((t_0 + (_S5 - mid_0)) / (2.0f * _S5), 0.0f, 1.0f);\n}\n\nfn rampColor_0( ramp_texture_0 : texture_2d<f32>, ramp_sampler_0 : sampler, t_1 : f32) -> vec4<f32>\n{\n return (textureSampleLevel((ramp_texture_0), (ramp_sampler_0), (vec2<f32>((clamp(t_1, 0.0f, 1.0f) * 255.0f + 0.5f) / 256.0f, 0.5f)), (0.0f)));\n}\n\nfn colorCutAt_0( i_0 : i32, cutsLo_0 : vec4<f32>, cutsHi_0 : vec4<f32>) -> f32\n{\n var _S6 : f32;\n if(i_0 < i32(4))\n {\n _S6 = cutsLo_0[i_0];\n }\n else\n {\n _S6 = cutsHi_0[i_0 - i32(4)];\n }\n return _S6;\n}\n\nfn thresholdBand_0( value_0 : f32, cutCount_0 : i32, cutsLo_1 : vec4<f32>, cutsHi_1 : vec4<f32>) -> i32\n{\n var band_0 : i32 = i32(0);\n var i_1 : i32 = i32(0);\n for(;;)\n {\n if(i_1 < cutCount_0)\n {\n }\n else\n {\n break;\n }\n if(value_0 >= (colorCutAt_0(i_1, cutsLo_1, cutsHi_1)))\n {\n band_0 = i_1 + i32(1);\n }\n i_1 = i_1 + i32(1);\n }\n return band_0;\n}\n\nfn log1pf_0( x_0 : f32) -> f32\n{\n var u_1 : f32 = 1.0f + x_0;\n var _S7 : f32;\n if(u_1 == 1.0f)\n {\n _S7 = x_0;\n }\n else\n {\n _S7 = log(u_1) * (x_0 / (u_1 - 1.0f));\n }\n return _S7;\n}\n\nfn symlogTransform_0( x_1 : f32, c_1 : f32) -> f32\n{\n return f32((i32(sign((x_1))))) * log1pf_0(abs(x_1 / c_1));\n}\n\nfn normalizeScoreUnclamped_0( score_0 : f32, domainMin_1 : f32, domainMax_1 : f32, scaleType_0 : i32, symlogConstant_0 : f32) -> f32\n{\n var tMax_0 : f32;\n var tMin_0 : f32;\n var t_2 : f32;\n if(scaleType_0 == i32(2))\n {\n var _S8 : f32 = symlogTransform_0(score_0, symlogConstant_0);\n var _S9 : f32 = symlogTransform_0(domainMin_1, symlogConstant_0);\n tMax_0 = symlogTransform_0(domainMax_1, symlogConstant_0);\n tMin_0 = _S9;\n t_2 = _S8;\n }\n else\n {\n if(scaleType_0 == i32(1))\n {\n if(domainMin_1 > 0.0f)\n {\n tMax_0 = domainMin_1;\n }\n else\n {\n tMax_0 = 1.0f;\n }\n var _S10 : f32 = log2(max(score_0, tMax_0));\n var _S11 : f32 = log2(tMax_0);\n tMax_0 = log2(max(domainMax_1, tMax_0));\n tMin_0 = _S11;\n t_2 = _S10;\n }\n else\n {\n tMax_0 = domainMax_1;\n tMin_0 = domainMin_1;\n t_2 = score_0;\n }\n }\n var tRange_0 : f32 = tMax_0 - tMin_0;\n if(tRange_0 <= 0.0f)\n {\n if(t_2 > tMin_0)\n {\n tMax_0 = 1.0f;\n }\n else\n {\n tMax_0 = 0.0f;\n }\n return tMax_0;\n }\n return (t_2 - tMin_0) / tRange_0;\n}\n\nfn normalizeScore_0( score_1 : f32, domainMin_2 : f32, domainMax_2 : f32, scaleType_1 : i32, symlogConstant_1 : f32) -> f32\n{\n return clamp(normalizeScoreUnclamped_0(score_1, domainMin_2, domainMax_2, scaleType_1, symlogConstant_1), 0.0f, 1.0f);\n}\n\nfn rowTableWidth_0( keys_0 : u32) -> u32\n{\n return max(min(keys_0, u32(2048)), u32(1));\n}\n\nfn rowTablePlaneHeight_0( keys_1 : u32) -> u32\n{\n var w_0 : u32 = rowTableWidth_0(keys_1);\n var _S12 : u32 = (keys_1 + w_0 - u32(1)) / w_0;\n return max(_S12, u32(1));\n}\n\nfn rowTableTexelX_0( key_0 : u32, keys_2 : u32) -> u32\n{\n var _S13 : u32 = key_0 % rowTableWidth_0(keys_2);\n return _S13;\n}\n\nfn rowTableTexelY_0( key_1 : u32, keys_3 : u32) -> u32\n{\n var _S14 : u32 = key_1 / rowTableWidth_0(keys_3);\n return _S14;\n}\n\nfn byteOf_0( channel_0 : f32) -> u32\n{\n return u32(channel_0 * 255.0f + 0.5f);\n}\n\nstruct RowPlacement_0\n{\n hidden_0 : bool,\n slot_0 : u32,\n color_0 : vec4<f32>,\n overridden_0 : bool,\n};\n\nfn rowTableLookup_0( table_texture_0 : texture_2d<f32>, table_sampler_0 : sampler, key_2 : u32, keys_4 : i32, own_0 : vec4<f32>) -> RowPlacement_0\n{\n var p_0 : RowPlacement_0;\n p_0.hidden_0 = false;\n p_0.slot_0 = key_2;\n p_0.color_0 = own_0;\n p_0.overridden_0 = false;\n if(keys_4 < i32(0))\n {\n return p_0;\n }\n var n_0 : u32 = u32(keys_4);\n if(key_2 >= n_0)\n {\n p_0.hidden_0 = true;\n return p_0;\n }\n var h_0 : u32 = rowTablePlaneHeight_0(n_0);\n var _S15 : u32 = rowTableTexelX_0(key_2, n_0);\n var u_2 : f32 = (f32(_S15) + 0.5f) / f32(rowTableWidth_0(n_0));\n var rows_0 : f32 = f32(u32(2) * h_0);\n var y_0 : u32 = rowTableTexelY_0(key_2, n_0);\n var _S16 : vec4<f32> = (textureSampleLevel((table_texture_0), (table_sampler_0), (vec2<f32>(u_2, (f32(y_0) + 0.5f) / rows_0)), (0.0f)));\n if((_S16.w) < 0.5f)\n {\n p_0.hidden_0 = true;\n return p_0;\n }\n p_0.slot_0 = ((((byteOf_0(_S16.x)) | ((((byteOf_0(_S16.y)) << (u32(8))))))) | ((((byteOf_0(_S16.z)) << (u32(16))))));\n var _S17 : vec4<f32> = (textureSampleLevel((table_texture_0), (table_sampler_0), (vec2<f32>(u_2, (f32(y_0 + h_0) + 0.5f) / rows_0)), (0.0f)));\n var _S18 : bool = (_S17.w) > 0.0f;\n p_0.overridden_0 = _S18;\n var _S19 : vec4<f32>;\n if(_S18)\n {\n _S19 = _S17;\n }\n else\n {\n _S19 = own_0;\n }\n p_0.color_0 = _S19;\n return p_0;\n}\n\nfn hpSplitUint_0( value_1 : u32) -> vec2<f32>\n{\n var lo_0 : u32 = (value_1 & (u32(4095)));\n return vec2<f32>(f32(value_1 - lo_0), f32(lo_0));\n}\n\nfn hpToClipX_0( splitPos_0 : vec2<f32>, bpRange_0 : vec3<f32>, hpZero_0 : f32) -> f32\n{\n var floorBp_0 : f32 = -3.00000000549775576e+38f + hpZero_0;\n var step_0 : f32 = 2.0f / bpRange_0.z;\n return dot(vec3<f32>(-1.0f, max(splitPos_0.x - bpRange_0.x, floorBp_0), max(splitPos_0.y - bpRange_0.y, floorBp_0)), vec3<f32>(1.0f, step_0, step_0));\n}\n\nfn rowBandTopPx_0( rowOffsetPx_1 : f32, rowHeight_1 : f32, slot_1 : u32) -> f32\n{\n return rowOffsetPx_1 + rowHeight_1 * f32(slot_1);\n}\n\nfn valueToYPxScaled_0( value_2 : f32, domainMin_3 : f32, domainMax_3 : f32, h_1 : f32, scaleType_2 : i32, symlogConstant_2 : f32) -> f32\n{\n return (1.0f - normalizeScore_0(value_2, domainMin_3, domainMax_3, scaleType_2, symlogConstant_2)) * h_1;\n}\n\nfn insetValueYPx_0( value_3 : f32, domainMin_4 : f32, domainMax_4 : f32, h_2 : f32, scaleType_3 : i32, insetPx_1 : f32, symlogConstant_3 : f32) -> f32\n{\n var _S20 : f32 = min(insetPx_1, h_2 * 0.5f);\n return _S20 + valueToYPxScaled_0(value_3, domainMin_4, domainMax_4, h_2 - 2.0f * _S20, scaleType_3, symlogConstant_3);\n}\n\nfn pointYPx_0( value_4 : f32, domainMin_5 : f32, domainMax_5 : f32, h_3 : f32, scaleType_4 : i32, insetPx_2 : f32, symlogConstant_4 : f32) -> f32\n{\n return insetValueYPx_0(value_4, domainMin_5, domainMax_5, h_3, scaleType_4, insetPx_2, symlogConstant_4);\n}\n\nfn pointRowYPx_0( bandTop_0 : f32, h_4 : f32, reverse_1 : i32, valueYPx_0 : f32) -> f32\n{\n var _S21 : f32;\n if(reverse_1 != i32(0))\n {\n _S21 = h_4 - valueYPx_0;\n }\n else\n {\n _S21 = valueYPx_0;\n }\n return bandTop_0 + _S21;\n}\n\nfn yPxToClipY_0( yPx_0 : f32, canvasHeight_1 : f32) -> f32\n{\n return 1.0f - yPx_0 / canvasHeight_1 * 2.0f;\n}\n\nfn pxToClipLen_0( px_0 : f32, size_0 : f32) -> f32\n{\n return px_0 * 2.0f / size_0;\n}\n\nfn extendToMinWidthPx_0( x1_0 : f32, x2_0 : f32, minWidth_0 : f32) -> f32\n{\n var dx_0 : f32 = x2_0 - x1_0;\n var _S22 : f32;\n if((abs(dx_0)) < minWidth_0)\n {\n if(dx_0 < 0.0f)\n {\n _S22 = - minWidth_0;\n }\n else\n {\n _S22 = minWidth_0;\n }\n _S22 = x1_0 + _S22;\n }\n else\n {\n _S22 = x2_0;\n }\n return _S22;\n}\n\nfn extendToMinWidthX_0( x1_1 : f32, x2_1 : f32, minWidthPx_1 : f32, canvasWidth_0 : f32) -> f32\n{\n return extendToMinWidthPx_0(x1_1, x2_1, pxToClipLen_0(minWidthPx_1, canvasWidth_0));\n}\n\nfn clipXToPx_0( clipX_0 : f32, canvasWidth_1 : f32) -> f32\n{\n return (clipX_0 + 1.0f) * 0.5f * canvasWidth_1;\n}\n\nfn crispSquareTopLeftPx_0( centerPx_0 : f32, diameterPx_0 : f32) -> f32\n{\n return floor(centerPx_0 - diameterPx_0 * 0.5f + 0.5f);\n}\n\nfn crispSquareCornerPx_0( centerPx_1 : vec2<f32>, diameterPx_1 : f32, q_0 : vec2<f32>) -> vec2<f32>\n{\n return vec2<f32>(crispSquareTopLeftPx_0(centerPx_1.x, diameterPx_1), crispSquareTopLeftPx_0(centerPx_1.y, diameterPx_1)) + q_0 * vec2<f32>(diameterPx_1);\n}\n\nfn pxToClipX_0( xPx_0 : f32, canvasWidth_2 : f32) -> f32\n{\n return xPx_0 / canvasWidth_2 * 2.0f - 1.0f;\n}\n\nfn crispSquareCornerClip_0( centerClipX_0 : f32, centerYPx_0 : f32, diameterPx_2 : f32, q_1 : vec2<f32>, viewportWidth_1 : f32, canvasHeight_2 : f32) -> vec4<f32>\n{\n var vPx_0 : vec2<f32> = crispSquareCornerPx_0(vec2<f32>(clipXToPx_0(centerClipX_0, viewportWidth_1), centerYPx_0), diameterPx_2, q_1);\n return vec4<f32>(pxToClipX_0(vPx_0.x, viewportWidth_1), yPxToClipY_0(vPx_0.y, canvasHeight_2), 0.0f, 1.0f);\n}\n\nfn aaPx_0( dpr_0 : f32) -> f32\n{\n return 1.0f / max(dpr_0, 1.0f);\n}\n\nfn aaHalfPx_0( dpr_1 : f32) -> f32\n{\n return 0.5f * aaPx_0(dpr_1);\n}\n\nfn glyphExpand_0( unitPx_0 : f32, reaches_0 : f32, dpr_2 : f32) -> f32\n{\n return 1.0f + reaches_0 * aaHalfPx_0(dpr_2) / max(unitPx_0, 0.00100000004749745f);\n}\n\nstruct VsOut_0\n{\n @builtin(position) position_0 : vec4<f32>,\n @location(0) color_1 : vec4<f32>,\n @location(2) localPos_0 : vec2<f32>,\n @interpolate(flat) @location(1) shape_0 : f32,\n};\n\nstruct vertexInput_0\n{\n @location(0) x_2 : u32,\n @location(1) x2_2 : u32,\n @location(2) y_1 : f32,\n @location(3) color_2 : u32,\n @location(4) glyph_0 : u32,\n @location(5) row_0 : u32,\n};\n\nfn markScaleColor_0( _S23 : texture_2d<f32>, _S24 : sampler, _S25 : u32, _S26 : i32, _S27 : f32, _S28 : f32, _S29 : f32, _S30 : i32, _S31 : vec4<f32>, _S32 : vec4<f32>) -> vec4<f32>\n{\n if(_S26 == i32(0))\n {\n return unpackRGBA_0(_S25);\n }\n if(_S25 == u32(2143289345))\n {\n return unpackRGBA_0(u32(4289703855));\n }\n var scaleType_5 : i32;\n if(((_S25 & (u32(2139095040)))) == u32(2139095040))\n {\n if(((_S25 & (u32(8388607)))) != u32(0))\n {\n return unpackRGBA_0(u32(4286611584));\n }\n var negative_0 : bool = ((_S25 & (u32(2147483648)))) != u32(0);\n if(_S26 == i32(3))\n {\n if(negative_0)\n {\n scaleType_5 = i32(0);\n }\n else\n {\n scaleType_5 = _S30;\n }\n return u_0.colorBands_0[scaleType_5];\n }\n var _S33 : f32;\n if(negative_0)\n {\n _S33 = 0.0f;\n }\n else\n {\n _S33 = 1.0f;\n }\n return rampColor_0(_S23, _S24, rampMidT_0(_S33, _S29));\n }\n var value_5 : f32 = (bitcast<f32>((_S25)));\n if(_S26 == i32(3))\n {\n return u_0.colorBands_0[thresholdBand_0(value_5, _S30, _S31, _S32)];\n }\n if(_S26 == i32(2))\n {\n scaleType_5 = i32(1);\n }\n else\n {\n scaleType_5 = i32(0);\n }\n return rampColor_0(_S23, _S24, rampMidT_0(normalizeScore_0(value_5, _S27, _S28, scaleType_5, 1.0f), _S29));\n}\n\nfn bpToClipX_0( _S34 : u32) -> f32\n{\n return hpToClipX_0(hpSplitUint_0(_S34), u_0.bpRangeX_0, u_0.zero_0);\n}\n\n@vertex\nfn vs_main( _S35 : vertexInput_0, @builtin(vertex_index) vid_1 : u32) -> VsOut_0\n{\n var q_2 : vec2<f32> = quadLocal_0(vid_1 % u32(6));\n var local_0 : vec2<f32> = q_2 * vec2<f32>(2.0f) - vec2<f32>(1.0f);\n var xZero_0 : bool = (q_2.x) < 0.5f;\n var o_0 : VsOut_0;\n var _S36 : RowPlacement_0 = rowTableLookup_0(rowTable_texture_0, rowTable_sampler_0, _S35.row_0, u_0.rowTableKeys_0, markScaleColor_0(colorRamp_texture_0, colorRamp_sampler_0, _S35.color_2, u_0.rampMode_0, u_0.rampMin_0, u_0.rampMax_0, u_0.rampMidNorm_0, u_0.colorCutCount_0, u_0.colorCuts_0[i32(0)], u_0.colorCuts_0[i32(1)]));\n if(_S36.hidden_0)\n {\n o_0.position_0 = vec4<f32>(2.0f, 2.0f, 0.0f, 1.0f);\n o_0.color_1 = vec4<f32>(0.0f);\n o_0.localPos_0 = vec2<f32>(0.0f);\n o_0.shape_0 = 3.0f;\n return o_0;\n }\n var _S37 : f32 = bpToClipX_0(_S35.x_2);\n var _S38 : f32 = bpToClipX_0(_S35.x2_2);\n var yPx_1 : f32 = pointRowYPx_0(rowBandTopPx_0(u_0.rowOffsetPx_0, u_0.rowHeight_0, _S36.slot_0), u_0.rowHeight_0, u_0.reverse_0, pointYPx_0(_S35.y_1, u_0.domainMin_0, u_0.domainMax_0, u_0.rowHeight_0, u_0.valueScaleType_0, u_0.insetPx_0, u_0.valueSymlogConstant_0));\n var centerClipY_0 : f32 = yPxToClipY_0(yPx_1, u_0.canvasHeight_0);\n o_0.color_1 = _S36.color_0;\n var centerClipX_1 : f32 = (_S37 + _S38) * 0.5f;\n var x_3 : f32;\n if((u_0.rule_0) != i32(0))\n {\n var farClipX_0 : f32 = extendToMinWidthX_0(_S37, _S38, u_0.minWidthPx_0, u_0.viewportWidth_0);\n if(xZero_0)\n {\n x_3 = min(_S37, farClipX_0);\n }\n else\n {\n x_3 = max(_S37, farClipX_0);\n }\n o_0.position_0 = vec4<f32>(x_3, centerClipY_0 + pxToClipLen_0(local_0.y * u_0.radiusPx_0, u_0.canvasHeight_0), 0.0f, 1.0f);\n o_0.localPos_0 = local_0;\n o_0.shape_0 = 3.0f;\n }\n else\n {\n var _S39 : bool;\n if((_S35.glyph_0) == u32(3))\n {\n _S39 = true;\n }\n else\n {\n if((_S35.glyph_0) == u32(0))\n {\n _S39 = (u_0.radiusPx_0 * 2.0f) <= 3.0f;\n }\n else\n {\n _S39 = false;\n }\n }\n if(_S39)\n {\n o_0.position_0 = crispSquareCornerClip_0(centerClipX_1, yPx_1, u_0.radiusPx_0 * 2.0f, q_2, u_0.viewportWidth_0, u_0.canvasHeight_0);\n o_0.localPos_0 = local_0;\n o_0.shape_0 = 3.0f;\n }\n else\n {\n var diamond_0 : bool = (_S35.glyph_0) == u32(2);\n var _S40 : f32 = u_0.radiusPx_0;\n if(diamond_0)\n {\n x_3 = 1.60000002384185791f;\n }\n else\n {\n x_3 = 1.0f;\n }\n var unitPx_1 : f32 = _S40 * x_3;\n var _S41 : bool = (_S35.glyph_0) == u32(1);\n if(_S41)\n {\n x_3 = 2.2360680103302002f;\n }\n else\n {\n if(diamond_0)\n {\n x_3 = 1.41421365737915039f;\n }\n else\n {\n x_3 = 1.0f;\n }\n }\n var expand_0 : f32 = glyphExpand_0(unitPx_1, x_3, u_0.devicePixelRatio_0);\n var halfPx_0 : f32 = unitPx_1 * expand_0;\n o_0.position_0 = vec4<f32>(centerClipX_1 + pxToClipLen_0(local_0.x * halfPx_0, u_0.viewportWidth_0), centerClipY_0 + pxToClipLen_0(local_0.y * halfPx_0, u_0.canvasHeight_0), 0.0f, 1.0f);\n o_0.localPos_0 = local_0 * vec2<f32>(expand_0);\n if(_S41)\n {\n x_3 = 2.0f;\n }\n else\n {\n if(diamond_0)\n {\n x_3 = 1.0f;\n }\n else\n {\n x_3 = 0.0f;\n }\n }\n o_0.shape_0 = x_3;\n }\n }\n return o_0;\n}\n\nfn discCoverage_0( localPos_1 : vec2<f32>) -> f32\n{\n return 1.0f - length(localPos_1);\n}\n\nfn aaGradient_0( d_0 : f32) -> f32\n{\n return max(length(vec2<f32>(dpdx(d_0), dpdy(d_0))), 0.00000999999974738f);\n}\n\nfn aaRamp_0( signedInk_0 : f32, widthPx_0 : f32) -> f32\n{\n return clamp(signedInk_0 / widthPx_0 + 0.5f, 0.0f, 1.0f);\n}\n\nfn glyphEdgeAlpha_0( coverage_0 : f32) -> f32\n{\n return aaRamp_0(coverage_0, aaGradient_0(coverage_0));\n}\n\nstruct pixelOutput_0\n{\n @location(0) output_0 : vec4<f32>,\n};\n\nstruct pixelInput_0\n{\n @location(0) color_3 : vec4<f32>,\n @location(2) localPos_2 : vec2<f32>,\n @interpolate(flat) @location(1) shape_1 : f32,\n};\n\n@fragment\nfn fs_main( _S42 : pixelInput_0, @builtin(position) position_1 : vec4<f32>) -> pixelOutput_0\n{\n var coverage_1 : f32;\n if((_S42.shape_1) > 2.5f)\n {\n coverage_1 = 1.0f;\n }\n else\n {\n if((_S42.shape_1) > 1.5f)\n {\n var _S43 : f32 = _S42.localPos_2.y;\n var _S44 : f32 = _S42.localPos_2.x;\n coverage_1 = min(1.0f - _S43, min((2.0f * _S44 + _S43 + 1.0f) * 0.44721359014511108f, (-2.0f * _S44 + _S43 + 1.0f) * 0.44721359014511108f));\n }\n else\n {\n if((_S42.shape_1) > 0.5f)\n {\n coverage_1 = 1.0f - (abs(_S42.localPos_2.x) + abs(_S42.localPos_2.y));\n }\n else\n {\n coverage_1 = discCoverage_0(_S42.localPos_2);\n }\n }\n }\n var alpha_0 : f32 = glyphEdgeAlpha_0(coverage_1);\n if(alpha_0 <= 0.0f)\n {\n discard;\n }\n var _S45 : pixelOutput_0 = pixelOutput_0( vec4<f32>(_S42.color_3.xyz, _S42.color_3.w * alpha_0) );\n return _S45;\n}\n\n";
3
+ export const WGSL_SOURCE = "struct Uniforms_std140_0\n{\n @align(16) bpRangeX_0 : vec3<f32>,\n @align(4) canvasHeight_0 : f32,\n @align(16) domainMin_0 : f32,\n @align(4) domainMax_0 : f32,\n @align(8) valueScaleType_0 : i32,\n @align(4) valueSymlogConstant_0 : f32,\n @align(16) rampMode_0 : i32,\n @align(4) rampMin_0 : f32,\n @align(8) rampMax_0 : f32,\n @align(4) rampMidNorm_0 : f32,\n @align(16) colorCutCount_0 : i32,\n @align(16) colorCuts_0 : array<vec4<f32>, i32(2)>,\n @align(16) colorBands_0 : array<vec4<f32>, i32(9)>,\n @align(16) zero_0 : f32,\n @align(4) viewportWidth_0 : f32,\n @align(8) radiusPx_0 : f32,\n @align(4) triangleRadiusYPx_0 : f32,\n @align(16) rowHeight_0 : f32,\n @align(4) rowOffsetPx_0 : f32,\n @align(8) reverse_0 : i32,\n @align(4) insetPx_0 : f32,\n @align(16) devicePixelRatio_0 : f32,\n @align(4) rowTableKeys_0 : i32,\n @align(8) rule_0 : i32,\n @align(4) minWidthPx_0 : f32,\n};\n\n@binding(1) @group(0) var<uniform> u_0 : Uniforms_std140_0;\n@binding(2) @group(0) var colorRamp_texture_0 : texture_2d<f32>;\n\n@binding(3) @group(0) var colorRamp_sampler_0 : sampler;\n\n@binding(4) @group(0) var rowTable_texture_0 : texture_2d<f32>;\n\n@binding(5) @group(0) var rowTable_sampler_0 : sampler;\n\nfn quadLocal_0( vid_0 : u32) -> vec2<f32>\n{\n var v_0 : u32 = vid_0 % u32(6);\n var _S1 : bool = v_0 == u32(0);\n var _S2 : bool;\n if(_S1)\n {\n _S2 = true;\n }\n else\n {\n _S2 = v_0 == u32(2);\n }\n if(_S2)\n {\n _S2 = true;\n }\n else\n {\n _S2 = v_0 == u32(3);\n }\n var _S3 : f32;\n if(_S2)\n {\n _S3 = 0.0f;\n }\n else\n {\n _S3 = 1.0f;\n }\n if(_S1)\n {\n _S2 = true;\n }\n else\n {\n _S2 = v_0 == u32(1);\n }\n if(_S2)\n {\n _S2 = true;\n }\n else\n {\n _S2 = v_0 == u32(4);\n }\n var _S4 : f32;\n if(_S2)\n {\n _S4 = 0.0f;\n }\n else\n {\n _S4 = 1.0f;\n }\n return vec2<f32>(_S3, _S4);\n}\n\nfn unpackRGBA_0( c_0 : u32) -> vec4<f32>\n{\n return vec4<f32>(f32((((c_0 >> (u32(0)))) & (u32(255)))), f32((((c_0 >> (u32(8)))) & (u32(255)))), f32((((c_0 >> (u32(16)))) & (u32(255)))), f32((((c_0 >> (u32(24)))) & (u32(255))))) / vec4<f32>(255.0f);\n}\n\nfn rampMidT_0( t_0 : f32, mid_0 : f32) -> f32\n{\n var _S5 : f32 = max(mid_0, 1.0f - mid_0);\n return clamp((t_0 + (_S5 - mid_0)) / (2.0f * _S5), 0.0f, 1.0f);\n}\n\nfn rampColor_0( ramp_texture_0 : texture_2d<f32>, ramp_sampler_0 : sampler, t_1 : f32) -> vec4<f32>\n{\n return (textureSampleLevel((ramp_texture_0), (ramp_sampler_0), (vec2<f32>((clamp(t_1, 0.0f, 1.0f) * 255.0f + 0.5f) / 256.0f, 0.5f)), (0.0f)));\n}\n\nfn colorCutAt_0( i_0 : i32, cutsLo_0 : vec4<f32>, cutsHi_0 : vec4<f32>) -> f32\n{\n var _S6 : f32;\n if(i_0 < i32(4))\n {\n _S6 = cutsLo_0[i_0];\n }\n else\n {\n _S6 = cutsHi_0[i_0 - i32(4)];\n }\n return _S6;\n}\n\nfn thresholdBand_0( value_0 : f32, cutCount_0 : i32, cutsLo_1 : vec4<f32>, cutsHi_1 : vec4<f32>) -> i32\n{\n var band_0 : i32 = i32(0);\n var i_1 : i32 = i32(0);\n for(;;)\n {\n if(i_1 < cutCount_0)\n {\n }\n else\n {\n break;\n }\n if(value_0 >= (colorCutAt_0(i_1, cutsLo_1, cutsHi_1)))\n {\n band_0 = i_1 + i32(1);\n }\n i_1 = i_1 + i32(1);\n }\n return band_0;\n}\n\nfn log1pf_0( x_0 : f32) -> f32\n{\n var u_1 : f32 = 1.0f + x_0;\n var _S7 : f32;\n if(u_1 == 1.0f)\n {\n _S7 = x_0;\n }\n else\n {\n _S7 = log(u_1) * (x_0 / (u_1 - 1.0f));\n }\n return _S7;\n}\n\nfn symlogTransform_0( x_1 : f32, c_1 : f32) -> f32\n{\n return f32((i32(sign((x_1))))) * log1pf_0(abs(x_1 / c_1));\n}\n\nfn normalizeScoreUnclamped_0( score_0 : f32, domainMin_1 : f32, domainMax_1 : f32, scaleType_0 : i32, symlogConstant_0 : f32) -> f32\n{\n var tMax_0 : f32;\n var tMin_0 : f32;\n var t_2 : f32;\n if(scaleType_0 == i32(2))\n {\n var _S8 : f32 = symlogTransform_0(score_0, symlogConstant_0);\n var _S9 : f32 = symlogTransform_0(domainMin_1, symlogConstant_0);\n tMax_0 = symlogTransform_0(domainMax_1, symlogConstant_0);\n tMin_0 = _S9;\n t_2 = _S8;\n }\n else\n {\n if(scaleType_0 == i32(1))\n {\n if(domainMin_1 > 0.0f)\n {\n tMax_0 = domainMin_1;\n }\n else\n {\n tMax_0 = 1.0f;\n }\n var _S10 : f32 = log2(max(score_0, tMax_0));\n var _S11 : f32 = log2(tMax_0);\n tMax_0 = log2(max(domainMax_1, tMax_0));\n tMin_0 = _S11;\n t_2 = _S10;\n }\n else\n {\n tMax_0 = domainMax_1;\n tMin_0 = domainMin_1;\n t_2 = score_0;\n }\n }\n var tRange_0 : f32 = tMax_0 - tMin_0;\n if(tRange_0 <= 0.0f)\n {\n if(t_2 > tMin_0)\n {\n tMax_0 = 1.0f;\n }\n else\n {\n tMax_0 = 0.0f;\n }\n return tMax_0;\n }\n return (t_2 - tMin_0) / tRange_0;\n}\n\nfn normalizeScore_0( score_1 : f32, domainMin_2 : f32, domainMax_2 : f32, scaleType_1 : i32, symlogConstant_1 : f32) -> f32\n{\n return clamp(normalizeScoreUnclamped_0(score_1, domainMin_2, domainMax_2, scaleType_1, symlogConstant_1), 0.0f, 1.0f);\n}\n\nfn rowTableWidth_0( keys_0 : u32) -> u32\n{\n return max(min(keys_0, u32(2048)), u32(1));\n}\n\nfn rowTablePlaneHeight_0( keys_1 : u32) -> u32\n{\n var w_0 : u32 = rowTableWidth_0(keys_1);\n var _S12 : u32 = (keys_1 + w_0 - u32(1)) / w_0;\n return max(_S12, u32(1));\n}\n\nfn rowTableTexelX_0( key_0 : u32, keys_2 : u32) -> u32\n{\n var _S13 : u32 = key_0 % rowTableWidth_0(keys_2);\n return _S13;\n}\n\nfn rowTableTexelY_0( key_1 : u32, keys_3 : u32) -> u32\n{\n var _S14 : u32 = key_1 / rowTableWidth_0(keys_3);\n return _S14;\n}\n\nfn byteOf_0( channel_0 : f32) -> u32\n{\n return u32(channel_0 * 255.0f + 0.5f);\n}\n\nstruct RowPlacement_0\n{\n hidden_0 : bool,\n slot_0 : u32,\n color_0 : vec4<f32>,\n overridden_0 : bool,\n};\n\nfn rowTableLookup_0( table_texture_0 : texture_2d<f32>, table_sampler_0 : sampler, key_2 : u32, keys_4 : i32, own_0 : vec4<f32>) -> RowPlacement_0\n{\n var p_0 : RowPlacement_0;\n p_0.hidden_0 = false;\n p_0.slot_0 = key_2;\n p_0.color_0 = own_0;\n p_0.overridden_0 = false;\n if(keys_4 < i32(0))\n {\n return p_0;\n }\n var n_0 : u32 = u32(keys_4);\n if(key_2 >= n_0)\n {\n p_0.hidden_0 = true;\n return p_0;\n }\n var h_0 : u32 = rowTablePlaneHeight_0(n_0);\n var _S15 : u32 = rowTableTexelX_0(key_2, n_0);\n var u_2 : f32 = (f32(_S15) + 0.5f) / f32(rowTableWidth_0(n_0));\n var rows_0 : f32 = f32(u32(2) * h_0);\n var y_0 : u32 = rowTableTexelY_0(key_2, n_0);\n var _S16 : vec4<f32> = (textureSampleLevel((table_texture_0), (table_sampler_0), (vec2<f32>(u_2, (f32(y_0) + 0.5f) / rows_0)), (0.0f)));\n if((_S16.w) < 0.5f)\n {\n p_0.hidden_0 = true;\n return p_0;\n }\n p_0.slot_0 = ((((byteOf_0(_S16.x)) | ((((byteOf_0(_S16.y)) << (u32(8))))))) | ((((byteOf_0(_S16.z)) << (u32(16))))));\n var _S17 : vec4<f32> = (textureSampleLevel((table_texture_0), (table_sampler_0), (vec2<f32>(u_2, (f32(y_0 + h_0) + 0.5f) / rows_0)), (0.0f)));\n var _S18 : bool = (_S17.w) > 0.0f;\n p_0.overridden_0 = _S18;\n var _S19 : vec4<f32>;\n if(_S18)\n {\n _S19 = _S17;\n }\n else\n {\n _S19 = own_0;\n }\n p_0.color_0 = _S19;\n return p_0;\n}\n\nfn hpSplitUint_0( value_1 : u32) -> vec2<f32>\n{\n var lo_0 : u32 = (value_1 & (u32(4095)));\n return vec2<f32>(f32(value_1 - lo_0), f32(lo_0));\n}\n\nfn hpToClipX_0( splitPos_0 : vec2<f32>, bpRange_0 : vec3<f32>, hpZero_0 : f32) -> f32\n{\n var floorBp_0 : f32 = -3.00000000549775576e+38f + hpZero_0;\n var step_0 : f32 = 2.0f / bpRange_0.z;\n return dot(vec3<f32>(-1.0f, max(splitPos_0.x - bpRange_0.x, floorBp_0), max(splitPos_0.y - bpRange_0.y, floorBp_0)), vec3<f32>(1.0f, step_0, step_0));\n}\n\nfn rowBandTopPx_0( rowOffsetPx_1 : f32, rowHeight_1 : f32, slot_1 : u32) -> f32\n{\n return rowOffsetPx_1 + rowHeight_1 * f32(slot_1);\n}\n\nfn valueToYPxScaled_0( value_2 : f32, domainMin_3 : f32, domainMax_3 : f32, h_1 : f32, scaleType_2 : i32, symlogConstant_2 : f32) -> f32\n{\n return (1.0f - normalizeScore_0(value_2, domainMin_3, domainMax_3, scaleType_2, symlogConstant_2)) * h_1;\n}\n\nfn insetValueYPx_0( value_3 : f32, domainMin_4 : f32, domainMax_4 : f32, h_2 : f32, scaleType_3 : i32, insetPx_1 : f32, symlogConstant_3 : f32) -> f32\n{\n var _S20 : f32 = min(insetPx_1, h_2 * 0.5f);\n return _S20 + valueToYPxScaled_0(value_3, domainMin_4, domainMax_4, h_2 - 2.0f * _S20, scaleType_3, symlogConstant_3);\n}\n\nfn pointYPx_0( value_4 : f32, domainMin_5 : f32, domainMax_5 : f32, h_3 : f32, scaleType_4 : i32, insetPx_2 : f32, symlogConstant_4 : f32) -> f32\n{\n return insetValueYPx_0(value_4, domainMin_5, domainMax_5, h_3, scaleType_4, insetPx_2, symlogConstant_4);\n}\n\nfn pointRowYPx_0( bandTop_0 : f32, h_4 : f32, reverse_1 : i32, valueYPx_0 : f32) -> f32\n{\n var _S21 : f32;\n if(reverse_1 != i32(0))\n {\n _S21 = h_4 - valueYPx_0;\n }\n else\n {\n _S21 = valueYPx_0;\n }\n return bandTop_0 + _S21;\n}\n\nfn yPxToClipY_0( yPx_0 : f32, canvasHeight_1 : f32) -> f32\n{\n return 1.0f - yPx_0 / canvasHeight_1 * 2.0f;\n}\n\nfn pxToClipLen_0( px_0 : f32, size_0 : f32) -> f32\n{\n return px_0 * 2.0f / size_0;\n}\n\nfn extendToMinWidthPx_0( x1_0 : f32, x2_0 : f32, minWidth_0 : f32) -> f32\n{\n var dx_0 : f32 = x2_0 - x1_0;\n var _S22 : f32;\n if((abs(dx_0)) < minWidth_0)\n {\n if(dx_0 < 0.0f)\n {\n _S22 = - minWidth_0;\n }\n else\n {\n _S22 = minWidth_0;\n }\n _S22 = x1_0 + _S22;\n }\n else\n {\n _S22 = x2_0;\n }\n return _S22;\n}\n\nfn extendToMinWidthX_0( x1_1 : f32, x2_1 : f32, minWidthPx_1 : f32, canvasWidth_0 : f32) -> f32\n{\n return extendToMinWidthPx_0(x1_1, x2_1, pxToClipLen_0(minWidthPx_1, canvasWidth_0));\n}\n\nfn clipXToPx_0( clipX_0 : f32, canvasWidth_1 : f32) -> f32\n{\n return (clipX_0 + 1.0f) * 0.5f * canvasWidth_1;\n}\n\nfn crispSquareTopLeftPx_0( centerPx_0 : f32, diameterPx_0 : f32) -> f32\n{\n return floor(centerPx_0 - diameterPx_0 * 0.5f + 0.5f);\n}\n\nfn crispSquareCornerPx_0( centerPx_1 : vec2<f32>, diameterPx_1 : f32, q_0 : vec2<f32>) -> vec2<f32>\n{\n return vec2<f32>(crispSquareTopLeftPx_0(centerPx_1.x, diameterPx_1), crispSquareTopLeftPx_0(centerPx_1.y, diameterPx_1)) + q_0 * vec2<f32>(diameterPx_1);\n}\n\nfn pxToClipX_0( xPx_0 : f32, canvasWidth_2 : f32) -> f32\n{\n return xPx_0 / canvasWidth_2 * 2.0f - 1.0f;\n}\n\nfn crispSquareCornerClip_0( centerClipX_0 : f32, centerYPx_0 : f32, diameterPx_2 : f32, q_1 : vec2<f32>, viewportWidth_1 : f32, canvasHeight_2 : f32) -> vec4<f32>\n{\n var vPx_0 : vec2<f32> = crispSquareCornerPx_0(vec2<f32>(clipXToPx_0(centerClipX_0, viewportWidth_1), centerYPx_0), diameterPx_2, q_1);\n return vec4<f32>(pxToClipX_0(vPx_0.x, viewportWidth_1), yPxToClipY_0(vPx_0.y, canvasHeight_2), 0.0f, 1.0f);\n}\n\nfn aaPx_0( dpr_0 : f32) -> f32\n{\n return 1.0f / max(dpr_0, 1.0f);\n}\n\nfn aaHalfPx_0( dpr_1 : f32) -> f32\n{\n return 0.5f * aaPx_0(dpr_1);\n}\n\nfn glyphExpand_0( unitPx_0 : f32, reaches_0 : f32, dpr_2 : f32) -> f32\n{\n return 1.0f + reaches_0 * aaHalfPx_0(dpr_2) / max(unitPx_0, 0.00100000004749745f);\n}\n\nstruct VsOut_0\n{\n @builtin(position) position_0 : vec4<f32>,\n @location(0) color_1 : vec4<f32>,\n @location(2) localPos_0 : vec2<f32>,\n @interpolate(flat) @location(1) shape_0 : f32,\n};\n\nstruct vertexInput_0\n{\n @location(0) x_2 : u32,\n @location(1) x2_2 : u32,\n @location(2) y_1 : f32,\n @location(3) color_2 : u32,\n @location(4) glyph_0 : u32,\n @location(5) row_0 : u32,\n};\n\nfn markScaleColor_0( _S23 : texture_2d<f32>, _S24 : sampler, _S25 : u32, _S26 : i32, _S27 : f32, _S28 : f32, _S29 : f32, _S30 : i32, _S31 : vec4<f32>, _S32 : vec4<f32>) -> vec4<f32>\n{\n if(_S26 == i32(0))\n {\n return unpackRGBA_0(_S25);\n }\n if(_S25 == u32(2143289345))\n {\n return unpackRGBA_0(u32(4289703855));\n }\n var scaleType_5 : i32;\n if(((_S25 & (u32(2139095040)))) == u32(2139095040))\n {\n if(((_S25 & (u32(8388607)))) != u32(0))\n {\n return unpackRGBA_0(u32(4286611584));\n }\n var negative_0 : bool = ((_S25 & (u32(2147483648)))) != u32(0);\n if(_S26 == i32(3))\n {\n if(negative_0)\n {\n scaleType_5 = i32(0);\n }\n else\n {\n scaleType_5 = _S30;\n }\n return u_0.colorBands_0[scaleType_5];\n }\n var _S33 : f32;\n if(negative_0)\n {\n _S33 = 0.0f;\n }\n else\n {\n _S33 = 1.0f;\n }\n return rampColor_0(_S23, _S24, rampMidT_0(_S33, _S29));\n }\n var value_5 : f32 = (bitcast<f32>((_S25)));\n if(_S26 == i32(3))\n {\n return u_0.colorBands_0[thresholdBand_0(value_5, _S30, _S31, _S32)];\n }\n if(_S26 == i32(2))\n {\n scaleType_5 = i32(1);\n }\n else\n {\n scaleType_5 = i32(0);\n }\n return rampColor_0(_S23, _S24, rampMidT_0(normalizeScore_0(value_5, _S27, _S28, scaleType_5, 1.0f), _S29));\n}\n\nfn bpToClipX_0( _S34 : u32) -> f32\n{\n return hpToClipX_0(hpSplitUint_0(_S34), u_0.bpRangeX_0, u_0.zero_0);\n}\n\n@vertex\nfn vs_main( _S35 : vertexInput_0, @builtin(vertex_index) vid_1 : u32) -> VsOut_0\n{\n var q_2 : vec2<f32> = quadLocal_0(vid_1 % u32(6));\n var local_0 : vec2<f32> = q_2 * vec2<f32>(2.0f) - vec2<f32>(1.0f);\n var xZero_0 : bool = (q_2.x) < 0.5f;\n var o_0 : VsOut_0;\n var _S36 : RowPlacement_0 = rowTableLookup_0(rowTable_texture_0, rowTable_sampler_0, _S35.row_0, u_0.rowTableKeys_0, markScaleColor_0(colorRamp_texture_0, colorRamp_sampler_0, _S35.color_2, u_0.rampMode_0, u_0.rampMin_0, u_0.rampMax_0, u_0.rampMidNorm_0, u_0.colorCutCount_0, u_0.colorCuts_0[i32(0)], u_0.colorCuts_0[i32(1)]));\n if(_S36.hidden_0)\n {\n o_0.position_0 = vec4<f32>(2.0f, 2.0f, 0.0f, 1.0f);\n o_0.color_1 = vec4<f32>(0.0f);\n o_0.localPos_0 = vec2<f32>(0.0f);\n o_0.shape_0 = 3.0f;\n return o_0;\n }\n var _S37 : f32 = bpToClipX_0(_S35.x_2);\n var _S38 : f32 = bpToClipX_0(_S35.x2_2);\n var yPx_1 : f32 = pointRowYPx_0(rowBandTopPx_0(u_0.rowOffsetPx_0, u_0.rowHeight_0, _S36.slot_0), u_0.rowHeight_0, u_0.reverse_0, pointYPx_0(_S35.y_1, u_0.domainMin_0, u_0.domainMax_0, u_0.rowHeight_0, u_0.valueScaleType_0, u_0.insetPx_0, u_0.valueSymlogConstant_0));\n var centerClipY_0 : f32 = yPxToClipY_0(yPx_1, u_0.canvasHeight_0);\n o_0.color_1 = _S36.color_0;\n var centerClipX_1 : f32 = (_S37 + _S38) * 0.5f;\n var x_3 : f32;\n if((u_0.rule_0) != i32(0))\n {\n var farClipX_0 : f32 = extendToMinWidthX_0(_S37, _S38, u_0.minWidthPx_0, u_0.viewportWidth_0);\n if(xZero_0)\n {\n x_3 = min(_S37, farClipX_0);\n }\n else\n {\n x_3 = max(_S37, farClipX_0);\n }\n o_0.position_0 = vec4<f32>(x_3, centerClipY_0 + pxToClipLen_0(local_0.y * u_0.radiusPx_0, u_0.canvasHeight_0), 0.0f, 1.0f);\n o_0.localPos_0 = local_0;\n o_0.shape_0 = 3.0f;\n }\n else\n {\n var _S39 : bool;\n if((_S35.glyph_0) == u32(3))\n {\n _S39 = true;\n }\n else\n {\n if((_S35.glyph_0) == u32(0))\n {\n _S39 = (u_0.radiusPx_0 * 2.0f) <= 3.0f;\n }\n else\n {\n _S39 = false;\n }\n }\n if(_S39)\n {\n o_0.position_0 = crispSquareCornerClip_0(centerClipX_1, yPx_1, u_0.radiusPx_0 * 2.0f, q_2, u_0.viewportWidth_0, u_0.canvasHeight_0);\n o_0.localPos_0 = local_0;\n o_0.shape_0 = 3.0f;\n }\n else\n {\n var diamond_0 : bool = (_S35.glyph_0) == u32(2);\n var _S40 : f32 = u_0.radiusPx_0;\n if(diamond_0)\n {\n x_3 = 1.60000002384185791f;\n }\n else\n {\n x_3 = 1.0f;\n }\n var unitPx_1 : f32 = _S40 * x_3;\n var _S41 : bool = (_S35.glyph_0) == u32(1);\n if(_S41)\n {\n x_3 = 2.2360680103302002f;\n }\n else\n {\n if(diamond_0)\n {\n x_3 = 1.41421365737915039f;\n }\n else\n {\n x_3 = 1.0f;\n }\n }\n var unitYPx_0 : f32;\n if(_S41)\n {\n unitYPx_0 = u_0.triangleRadiusYPx_0;\n }\n else\n {\n unitYPx_0 = unitPx_1;\n }\n var _S42 : f32 = glyphExpand_0(unitPx_1, x_3, u_0.devicePixelRatio_0);\n var _S43 : f32 = glyphExpand_0(unitYPx_0, x_3, u_0.devicePixelRatio_0);\n var expand_0 : vec2<f32> = vec2<f32>(_S42, _S43);\n o_0.position_0 = vec4<f32>(centerClipX_1 + pxToClipLen_0(local_0.x * unitPx_1 * _S42, u_0.viewportWidth_0), centerClipY_0 + pxToClipLen_0(local_0.y * unitYPx_0 * _S43, u_0.canvasHeight_0), 0.0f, 1.0f);\n o_0.localPos_0 = local_0 * expand_0;\n if(_S41)\n {\n x_3 = 2.0f;\n }\n else\n {\n if(diamond_0)\n {\n x_3 = 1.0f;\n }\n else\n {\n x_3 = 0.0f;\n }\n }\n o_0.shape_0 = x_3;\n }\n }\n return o_0;\n}\n\nfn discCoverage_0( localPos_1 : vec2<f32>) -> f32\n{\n return 1.0f - length(localPos_1);\n}\n\nfn aaGradient_0( d_0 : f32) -> f32\n{\n return max(length(vec2<f32>(dpdx(d_0), dpdy(d_0))), 0.00000999999974738f);\n}\n\nfn aaRamp_0( signedInk_0 : f32, widthPx_0 : f32) -> f32\n{\n return clamp(signedInk_0 / widthPx_0 + 0.5f, 0.0f, 1.0f);\n}\n\nfn glyphEdgeAlpha_0( coverage_0 : f32) -> f32\n{\n return aaRamp_0(coverage_0, aaGradient_0(coverage_0));\n}\n\nstruct pixelOutput_0\n{\n @location(0) output_0 : vec4<f32>,\n};\n\nstruct pixelInput_0\n{\n @location(0) color_3 : vec4<f32>,\n @location(2) localPos_2 : vec2<f32>,\n @interpolate(flat) @location(1) shape_1 : f32,\n};\n\n@fragment\nfn fs_main( _S44 : pixelInput_0, @builtin(position) position_1 : vec4<f32>) -> pixelOutput_0\n{\n var coverage_1 : f32;\n if((_S44.shape_1) > 2.5f)\n {\n coverage_1 = 1.0f;\n }\n else\n {\n if((_S44.shape_1) > 1.5f)\n {\n var _S45 : f32 = _S44.localPos_2.y;\n var _S46 : f32 = _S44.localPos_2.x;\n coverage_1 = min(1.0f - _S45, min((2.0f * _S46 + _S45 + 1.0f) * 0.44721359014511108f, (-2.0f * _S46 + _S45 + 1.0f) * 0.44721359014511108f));\n }\n else\n {\n if((_S44.shape_1) > 0.5f)\n {\n coverage_1 = 1.0f - (abs(_S44.localPos_2.x) + abs(_S44.localPos_2.y));\n }\n else\n {\n coverage_1 = discCoverage_0(_S44.localPos_2);\n }\n }\n }\n var alpha_0 : f32 = glyphEdgeAlpha_0(coverage_1);\n if(alpha_0 <= 0.0f)\n {\n discard;\n }\n var _S47 : pixelOutput_0 = pixelOutput_0( vec4<f32>(_S44.color_3.xyz, _S44.color_3.w * alpha_0) );\n return _S47;\n}\n\n";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jbrowse/render-core",
3
- "version": "5.0.0-beta.13",
3
+ "version": "5.0.0-beta.14",
4
4
  "type": "module",
5
5
  "description": "GPU/Canvas2D rendering primitives for JBrowse displays: the HAL, the draw-lifecycle mixin, per-region/global backend bases, and the React backend hooks",
6
6
  "keywords": [
@@ -44,6 +44,7 @@
44
44
  "./installUpload": "./esm/installUpload.js",
45
45
  "./instanceCache": "./esm/instanceCache.js",
46
46
  "./instancePass": "./esm/instancePass.js",
47
+ "./linkFeet": "./esm/linkFeet.js",
47
48
  "./marks": "./esm/marks/index.js",
48
49
  "./marks/ellipseDistance": "./esm/marks/ellipseDistance.js",
49
50
  "./marks/backend": "./esm/marks/markBackend.js",
@@ -68,10 +69,11 @@
68
69
  "./shaders/clipStripConsts": "./esm/shaders/clipStrip.generated.js",
69
70
  "./shaders/colorRampLut": "./esm/shaders/colorRampLut.js.generated.js",
70
71
  "./shaders/coverageBar": "./esm/shaders/coverageBar.generated.js",
71
- "./shaders/coverageIndicator": "./esm/shaders/coverageIndicator.generated.js",
72
72
  "./shaders/coverageInterbase": "./esm/shaders/coverageInterbase.generated.js",
73
73
  "./shaders/coverageMod": "./esm/shaders/coverageMod.generated.js",
74
74
  "./shaders/coverageSnp": "./esm/shaders/coverageSnp.generated.js",
75
+ "./shaders/connectorMark": "./esm/shaders/connectorMark.js.generated.js",
76
+ "./shaders/connectorMarkConsts": "./esm/shaders/connectorMark.consts.generated.js",
75
77
  "./shaders/curveDistance": "./esm/shaders/curveDistance.js.generated.js",
76
78
  "./shaders/hpmath": "./esm/shaders/hpmath.js.generated.js",
77
79
  "./shaders/linkMark": "./esm/shaders/linkMark.js.generated.js",
@@ -95,8 +97,9 @@
95
97
  "./useTabVisibilityRerender": "./esm/useTabVisibilityRerender.js"
96
98
  },
97
99
  "dependencies": {
98
- "@jbrowse/mobx-state-tree": "^6.7.0",
99
- "mobx": "^7.0.6"
100
+ "@jbrowse/mobx-state-tree": "^6.9.0",
101
+ "mobx": "^7.0.6",
102
+ "mobx-react": "^10.0.2"
100
103
  },
101
104
  "peerDependencies": {
102
105
  "react": ">=19.0.0"
@@ -10,6 +10,9 @@ import { aaHalfPx, edgeCoverage } from './antialias.js.generated.ts'
10
10
  import {
11
11
  distToWideCirclePx,
12
12
  ellipseHullPoint,
13
+ farDomeDistancePx,
14
+ farDomeHullPoint,
15
+ farDomeParam,
13
16
  wideCircleHullPoint,
14
17
  wideCircleLeg,
15
18
  wideCircleLegStep,
@@ -243,6 +246,90 @@ test.each([
243
246
  },
244
247
  )
245
248
 
249
+ // A far dome in the frame of the foot nearer the canvas, inward and up, over
250
+ // the stretch a canvas `canvasPx` wide shows with that foot at `footX`, as
251
+ // `linkMark.slang` steps it. Ink is every point the fragment paints on the
252
+ // canvas, the half stroke under the baseline included.
253
+ function worstOnFarDome(
254
+ rx: number,
255
+ ry: number,
256
+ footX: number,
257
+ canvasPx: number,
258
+ dpr: number,
259
+ lineWidthPx: number,
260
+ segs: number,
261
+ ) {
262
+ const half = strokeHalfPx(dpr, lineWidthPx)
263
+ const pad = half + aaHalfPx(dpr)
264
+ const margin = pad + 2
265
+ const u0 = farDomeParam(-margin - footX, rx)
266
+ const step = (farDomeParam(canvasPx + margin - footX, rx) - u0) / segs
267
+ const pairs: (readonly [Pt, Pt])[] = []
268
+ for (let seg = 0; seg <= segs; seg++) {
269
+ const u = u0 + seg * step
270
+ pairs.push([
271
+ farDomeHullPoint(u, step, rx, ry, -pad),
272
+ farDomeHullPoint(u, step, rx, ry, pad),
273
+ ])
274
+ }
275
+ const chord = [4 * rx * (step / 2), 2 * ry] as const
276
+ const from = farDomeParam(-footX, rx)
277
+ const to = farDomeParam(canvasPx - footX, rx)
278
+ const samples = alongNormals(
279
+ 4000,
280
+ pad,
281
+ t => {
282
+ const u = from + t * (to - from)
283
+ const w = Math.sqrt(1 - u * u)
284
+ const nx = -ry * (1 - 2 * u * u)
285
+ const ny = 2 * rx * u * w
286
+ const g = Math.hypot(nx, ny) || 1
287
+ return [
288
+ [2 * rx * u * u, 2 * ry * u * w],
289
+ [nx / g, ny / g],
290
+ ]
291
+ },
292
+ // on the canvas, and ahead of the foot's butt end, which is square to
293
+ // the dome's first chord
294
+ p =>
295
+ p[0] >= Math.max(-footX, 0) &&
296
+ p[0] <= canvasPx - footX &&
297
+ p[0] * chord[0] + p[1] * chord[1] >= 0,
298
+ )
299
+ return worstUncovered(coverIndex(stripTriangles(pairs)), samples, p =>
300
+ edgeCoverage(half - farDomeDistancePx(p[0], p[1], rx, ry), dpr),
301
+ )
302
+ }
303
+
304
+ test.each([
305
+ [2500, 40],
306
+ [2500, 300],
307
+ [35_000, 27],
308
+ [1_000_000, 40],
309
+ [10_000_000, 90],
310
+ ] as const)('a far %sx%s dome covers its ink across the canvas', (rx, ry) => {
311
+ const canvasPx = 1400
312
+ // the foot on the canvas, just off it, deep inside the pair, and the apex
313
+ // on the canvas with the stretch running past it
314
+ for (const footX of [200, 700, -40, -0.4 * rx, canvasPx / 2 - rx]) {
315
+ for (const dpr of [1, 2]) {
316
+ for (const lineWidthPx of [1, 6]) {
317
+ expect(
318
+ worstOnFarDome(
319
+ rx,
320
+ ry,
321
+ footX,
322
+ canvasPx,
323
+ dpr,
324
+ lineWidthPx,
325
+ LINK_CURVE_SEGMENTS,
326
+ ),
327
+ ).toBeLessThan(EXACT)
328
+ }
329
+ }
330
+ }
331
+ })
332
+
246
333
  // A collapsed band (`arcAvailH` floors at 0) hands the dome ry 0, where the
247
334
  // foot's two normals are exactly opposed.
248
335
  test('a zero-height dome stays finite', () => {
@@ -57,14 +57,14 @@ struct Uniforms {
57
57
  int valueScaleType;
58
58
  // Already resolved from the domain (`resolveSymlogConstant`); read by symlog alone.
59
59
  float valueSymlogConstant;
60
- // `markColor`'s: 0 packs the instance's colour, 1 and 2 read its slot as a
60
+ // `markColor`'s: 0 packs the instance's color, 1 and 2 read its slot as a
61
61
  // value through the ramp below.
62
62
  int rampMode;
63
63
  float rampMin;
64
64
  float rampMax;
65
65
  float rampMidNorm;
66
66
  // `markColor`'s threshold: how many cuts are in use, the cuts four to a
67
- // vector, and the colour of each interval between them.
67
+ // vector, and the color of each interval between them.
68
68
  int colorCutCount;
69
69
  float4 colorCuts[2];
70
70
  float4 colorBands[MAX_COLOR_BANDS];
@@ -8,7 +8,7 @@ function _max(a: number, b: number) {
8
8
  return b > a || Number.isNaN(a) ? b : a
9
9
  }
10
10
 
11
- export function capsuleDistPx(alongPx: number, acrossPx: number, halfLenPx: number): number {
12
- let _t0 = _max((Math.abs(alongPx) - halfLenPx), 0.0)
11
+ export function capsuleDistPx(fromStartPx: number, fromEndPx: number, acrossPx: number): number {
12
+ let _t0 = _max(_max(-fromStartPx, -fromEndPx), 0.0)
13
13
  return Math.sqrt(((_t0 * _t0) + (acrossPx * acrossPx)))
14
14
  }
@@ -4,12 +4,19 @@
4
4
  // tree. Consumers, and which half each takes:
5
5
  // agent-docs/reference/SHADER_JS_CODEGEN.md.
6
6
  //
7
- // `capsuleQuadLocal` pads by exactly `aaHalfPx(dpr)` past the ink. Pad less and
7
+ // `capsuleCorner` pads by exactly `aaHalfPx(dpr)` past the ink. Pad less and
8
8
  // the ramp is clipped at the quad edge — coverage falls to 0.5 at the boundary,
9
9
  // the rasterizer cuts it to 0, and the line reads a hard 50%-alpha edge about a
10
10
  // pixel narrower than `lineWidth` asked for. Pad more and the surplus fragments
11
11
  // shade to alpha 0.
12
12
  //
13
+ // Every corner hangs off its own endpoint, and the fragment measures along the
14
+ // segment from each end rather than from the middle. A segment with one end on
15
+ // screen and the other 1e7 px away is ordinary in a zoomed-in dotplot or a
16
+ // linked read with a distant mate; anchored at the centre, its visible corners
17
+ // were `centre ± halfLen` with both terms at 1e7, and float32 put them pixels
18
+ // off. Off its endpoint, a visible corner is a small offset from a small number.
19
+ //
13
20
  // The distance is Euclidean in CSS px, so |grad d| = 1 at every angle and the
14
21
  // ramp is analytic rather than differentiated — which it has to be, since `d`
15
22
  // comes off a clamp and the 2x2 quads straddling the cap/body junction would be
@@ -23,15 +30,10 @@ import hpmath;
23
30
 
24
31
  // Below this length a segment has no direction to speak of and `delta / len`
25
32
  // is 0/0. Any positive threshold under a visible fraction of a pixel behaves
26
- // the same (at that length the mark IS its cap); this was `1e-3` in dotplot
27
- // and `1e-4` in the two others, and takes the majority spelling, which is also
28
- // the one leaving the fallback the smallest reach.
33
+ // the same: at that length the mark IS its cap.
29
34
  public static const float CAPSULE_MIN_LEN_PX = 1e-4;
30
35
 
31
- // The segment's own frame — x along it, y across it. Cap-agnostic, which is
32
- // what lets the butt-capped linkedReadLine orient its diagonal through it. The
33
- // degenerate guard exists only to keep a zero-length segment's 0/0 out of the
34
- // frame.
36
+ // The segment's own frame — x along it, y across it.
35
37
  public struct CapsuleFrame {
36
38
  public float2 tangent;
37
39
  public float2 normal;
@@ -44,27 +46,70 @@ public CapsuleFrame capsuleFrame(float2 delta, float len) {
44
46
  return f;
45
47
  }
46
48
 
47
- // Quad corner `vid` in the segment's frame, for a capsule of half-length
48
- // `halfLenPx` and stroke half-width `halfWidthPx`, grown by the pad the module
49
- // header describes. Center-anchored: ±(halfLen + ext) along, ±ext across.
50
- public float2 capsuleQuadLocal(
51
- uint vid, float halfLenPx, float halfWidthPx, float dpr
49
+ // Quad corner `vid` of the segment p1 -> p1 + deltaPx, grown by `alongPadPx`
50
+ // past each end and `acrossPadPx` either side. The caller places it at
51
+ // `(atEnd ? p2 : p1) + offsetPx` in whatever space it holds the endpoints in.
52
+ // `local` is (along from p1, along back from p2, across), the varying
53
+ // `capsuleDist` and `buttSegmentCoverage` read; both along terms are positive
54
+ // over the body and the larger one is never consulted.
55
+ public struct SegmentCorner {
56
+ public bool atEnd;
57
+ public float2 offsetPx;
58
+ public float3 local;
59
+ };
60
+
61
+ public SegmentCorner segmentCorner(
62
+ uint vid, float2 deltaPx, float alongPadPx, float acrossPadPx
52
63
  ) {
53
- float ext = halfWidthPx + aaHalfPx(dpr);
64
+ float len = length(deltaPx);
65
+ CapsuleFrame f = capsuleFrame(deltaPx, len);
54
66
  float2 q = quadLocal(vid) * 2.0 - 1.0;
55
- return float2(q.x * (halfLenPx + ext), q.y * ext);
67
+ float across = q.y * acrossPadPx;
68
+ SegmentCorner c;
69
+ c.atEnd = q.x > 0.0;
70
+ c.offsetPx = f.tangent * (q.x * alongPadPx) + f.normal * across;
71
+ float far = len + alongPadPx;
72
+ c.local = c.atEnd
73
+ ? float3(far, -alongPadPx, across)
74
+ : float3(-alongPadPx, far, across);
75
+ return c;
76
+ }
77
+
78
+ // The round-capped stroke's corner: the cap is a half-width, so the pad is the
79
+ // same on both axes.
80
+ public SegmentCorner capsuleCorner(
81
+ uint vid, float2 deltaPx, float halfWidthPx, float dpr
82
+ ) {
83
+ float ext = halfWidthPx + aaHalfPx(dpr);
84
+ return segmentCorner(vid, deltaPx, ext, ext);
85
+ }
86
+
87
+ // The butt-capped stroke, which is what Canvas2D's default lineCap draws: the
88
+ // ink stops at each endpoint, so the pad along is the ramp's reach alone.
89
+ public SegmentCorner buttSegmentCorner(
90
+ uint vid, float2 deltaPx, float halfWidthPx, float dpr
91
+ ) {
92
+ float aa = aaHalfPx(dpr);
93
+ return segmentCorner(vid, deltaPx, aa, halfWidthPx + aa);
94
+ }
95
+
96
+ // Box-filter coverage of a rectangle separates per axis, so the product is
97
+ // exact and the ends are exactly as soft as the sides.
98
+ public float buttSegmentCoverage(float3 local, float halfWidthPx, float dpr) {
99
+ return edgeCoverage(halfWidthPx - abs(local.z), dpr)
100
+ * edgeCoverage(min(local.x, local.y), dpr);
56
101
  }
57
102
 
58
- // CSS-px distance from a point in the segment's frame (center-anchored, x
59
- // along, y across) to the segment {(-halfLen,0)..(halfLen,0)}. Collapses to
60
- // distance-from-origin for a degenerate segment — the circular dot of radius
61
- // halfWidth. Scalar so `//! js-export` can lift it: the dotplot's pick measures
62
- // the cursor against the same capsule the fragment inks, end caps included.
63
- public float capsuleDistPx(float alongPx, float acrossPx, float halfLenPx) {
64
- float beyond = max(abs(alongPx) - halfLenPx, 0.0);
103
+ // CSS-px distance from a point to the segment, given how far along it the
104
+ // point is from each end. A degenerate segment collapses to the distance from
105
+ // its one point — the circular dot of radius halfWidth. Scalar so
106
+ // `//! js-export` can lift it: the dotplot's pick measures the cursor against
107
+ // the same capsule the fragment inks, end caps included.
108
+ public float capsuleDistPx(float fromStartPx, float fromEndPx, float acrossPx) {
109
+ float beyond = max(max(-fromStartPx, -fromEndPx), 0.0);
65
110
  return sqrt(beyond * beyond + acrossPx * acrossPx);
66
111
  }
67
112
 
68
- public float capsuleDist(float2 local, float halfLenPx) {
69
- return capsuleDistPx(local.x, local.y, halfLenPx);
113
+ public float capsuleDist(float3 local) {
114
+ return capsuleDistPx(local.x, local.y, local.z);
70
115
  }
@@ -10,7 +10,7 @@ module clipStrip;
10
10
  import scoreScale;
11
11
 
12
12
  public static const float CLIP_STRIP_PX = 2.0;
13
- // #c62828, packed ABGR as every instance colour is: a red a shade darker than
13
+ // #c62828, packed ABGR as every instance color is: a red a shade darker than
14
14
  // the coverage band's hard-clip triangles, which stand just above the strip.
15
15
  public static const uint CLIP_STRIP_COLOR = 0xFF2828C6u;
16
16
 
@@ -15,10 +15,10 @@ module colorPack;
15
15
  //
16
16
  // Declare such a palette as `float4[N]` instead — a vector element needs no
17
17
  // wrapper struct, lowers correctly, AND costs the same 16 bytes per slot that
18
- // std140 was padding the uint to anyway, so packing one colour per element
18
+ // std140 was padding the uint to anyway, so packing one color per element
19
19
  // bought nothing here. FOUR to a `uint4` element, read as `p[i >> 2][i & 3]`,
20
20
  // does compile and does save — it is the only form that beats the padding — and
21
- // on alignments' 23-colour palette it was measured and declined:
21
+ // on alignments' 23-color palette it was measured and declined:
22
22
  // agent-docs/reference/ARCHITECTURAL_LIMITS.md §"The uniform ring". Packing
23
23
  // still earns its keep in VERTEX ATTRIBUTES, which is what this is for.
24
24
  public float4 unpackRGBA(uint c) {