@jbrowse/render-core 5.0.0-beta.11 → 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.
- package/esm/OverlayCanvas.d.ts +3 -2
- package/esm/OverlayCanvas.js +4 -2
- package/esm/RenderCanvas.d.ts +4 -3
- package/esm/RenderCanvas.js +4 -2
- package/esm/ScrollLockedOverlay.d.ts +2 -2
- package/esm/ScrollLockedOverlay.js +3 -2
- package/esm/blockClipUtils.d.ts +5 -5
- package/esm/blockClipUtils.js +4 -3
- package/esm/canvas2dUtils.d.ts +15 -21
- package/esm/canvas2dUtils.js +25 -55
- package/esm/colorRampLut.d.ts +2 -2
- package/esm/colorRampLut.js +2 -2
- package/esm/coverageBand.d.ts +0 -1
- package/esm/coverageBand.js +0 -5
- package/esm/coverageBandBuffers.d.ts +8 -5
- package/esm/createRenderingBackend.d.ts +1 -1
- package/esm/displayPhase.d.ts +5 -9
- package/esm/displayPhase.js +2 -2
- package/esm/hal/mockHal.d.ts +3 -4
- package/esm/hal/mockHal.js +5 -4
- package/esm/hal/types.d.ts +5 -5
- package/esm/hal/webgl2Hal.d.ts +4 -1
- package/esm/hal/webgl2Hal.js +18 -6
- package/esm/hal/webgpuHal.js +2 -2
- package/esm/linkFeet.d.ts +4 -0
- package/esm/linkFeet.js +7 -0
- package/esm/marks/barMark.d.ts +1 -1
- package/esm/marks/barMark.js +4 -2
- package/esm/marks/colorFill.d.ts +4 -4
- package/esm/marks/colorFill.js +4 -4
- package/esm/marks/connectorMark.d.ts +48 -0
- package/esm/marks/connectorMark.js +285 -0
- package/esm/marks/drawAgainstHit.d.ts +1 -1
- package/esm/marks/drawAgainstHit.js +4 -4
- package/esm/marks/glyphPaint.d.ts +5 -4
- package/esm/marks/glyphPaint.js +17 -7
- package/esm/marks/index.d.ts +8 -5
- package/esm/marks/index.js +6 -4
- package/esm/marks/lineMark.d.ts +47 -7
- package/esm/marks/lineMark.js +53 -39
- package/esm/marks/linkMark.d.ts +43 -6
- package/esm/marks/linkMark.js +118 -21
- package/esm/marks/markBackend.d.ts +1 -1
- package/esm/marks/markBackend.js +1 -1
- package/esm/marks/markPlan.d.ts +4 -3
- package/esm/marks/markPlan.js +5 -4
- package/esm/marks/markRamp.d.ts +11 -11
- package/esm/marks/markRamp.js +9 -9
- package/esm/marks/pointMark.d.ts +11 -5
- package/esm/marks/pointMark.js +34 -9
- package/esm/marks/rowLane.d.ts +4 -2
- package/esm/marks/rowLane.js +7 -3
- package/esm/marks/rowTable.d.ts +5 -5
- package/esm/marks/rowTable.js +4 -4
- package/esm/marks/ruleMark.js +1 -0
- package/esm/marks/spanMark.d.ts +8 -7
- package/esm/marks/spanMark.js +3 -3
- package/esm/marks/types.d.ts +8 -5
- package/esm/marks/types.js +8 -1
- package/esm/perRegionRenderingBackend.d.ts +1 -1
- package/esm/perRegionRenderingBackend.js +1 -1
- package/esm/regionDataMap.d.ts +2 -2
- package/esm/regionDataMap.js +2 -2
- package/esm/shaders/barMark.glsl.generated.d.ts +1 -1
- package/esm/shaders/barMark.glsl.generated.js +1 -1
- package/esm/shaders/barMark.wgsl.generated.d.ts +1 -1
- package/esm/shaders/barMark.wgsl.generated.js +1 -1
- package/esm/shaders/capsule.js.generated.d.ts +1 -1
- package/esm/shaders/capsule.js.generated.js +2 -2
- package/esm/shaders/connectorMark.consts.generated.d.ts +11 -0
- package/esm/shaders/connectorMark.consts.generated.js +13 -0
- package/esm/shaders/{coverageIndicator.generated.d.ts → connectorMark.generated.d.ts} +2 -1
- package/esm/shaders/connectorMark.generated.js +8 -0
- package/esm/shaders/connectorMark.glsl.generated.d.ts +2 -0
- package/esm/shaders/connectorMark.glsl.generated.js +4 -0
- package/esm/shaders/connectorMark.iface.generated.d.ts +88 -0
- package/esm/shaders/connectorMark.iface.generated.js +1194 -0
- package/esm/shaders/connectorMark.js.generated.d.ts +5 -0
- package/esm/shaders/connectorMark.js.generated.js +47 -0
- package/esm/shaders/connectorMark.wgsl.generated.d.ts +1 -0
- package/esm/shaders/connectorMark.wgsl.generated.js +3 -0
- package/esm/shaders/coverageInterbase.glsl.generated.d.ts +1 -1
- package/esm/shaders/coverageInterbase.glsl.generated.js +1 -1
- package/esm/shaders/coverageInterbase.wgsl.generated.d.ts +1 -1
- package/esm/shaders/coverageInterbase.wgsl.generated.js +1 -1
- package/esm/shaders/curveDistance.js.generated.d.ts +4 -0
- package/esm/shaders/curveDistance.js.generated.js +113 -0
- package/esm/shaders/insertionGlyph.generated.d.ts +6 -0
- package/esm/shaders/insertionGlyph.generated.js +8 -0
- package/esm/shaders/lineCenterMark.glsl.generated.d.ts +2 -2
- package/esm/shaders/lineCenterMark.glsl.generated.js +2 -2
- package/esm/shaders/lineCenterMark.iface.generated.d.ts +11 -9
- package/esm/shaders/lineCenterMark.iface.generated.js +20 -18
- package/esm/shaders/lineCenterMark.wgsl.generated.d.ts +1 -1
- package/esm/shaders/lineCenterMark.wgsl.generated.js +1 -1
- package/esm/shaders/lineCommon.js.generated.d.ts +1 -0
- package/esm/shaders/lineCommon.js.generated.js +20 -0
- package/esm/shaders/lineStepMark.glsl.generated.d.ts +2 -2
- package/esm/shaders/lineStepMark.glsl.generated.js +2 -2
- package/esm/shaders/lineStepMark.iface.generated.d.ts +11 -9
- package/esm/shaders/lineStepMark.iface.generated.js +20 -18
- package/esm/shaders/lineStepMark.wgsl.generated.d.ts +1 -1
- package/esm/shaders/lineStepMark.wgsl.generated.js +1 -1
- package/esm/shaders/linkMark.consts.generated.d.ts +1 -0
- package/esm/shaders/linkMark.consts.generated.js +1 -0
- package/esm/shaders/linkMark.glsl.generated.d.ts +2 -2
- package/esm/shaders/linkMark.glsl.generated.js +2 -2
- package/esm/shaders/linkMark.js.generated.d.ts +4 -2
- package/esm/shaders/linkMark.js.generated.js +33 -4
- package/esm/shaders/linkMark.wgsl.generated.d.ts +1 -1
- package/esm/shaders/linkMark.wgsl.generated.js +1 -1
- package/esm/shaders/pointMark.glsl.generated.d.ts +1 -1
- package/esm/shaders/pointMark.glsl.generated.js +1 -1
- package/esm/shaders/pointMark.iface.generated.d.ts +10 -8
- package/esm/shaders/pointMark.iface.generated.js +18 -16
- package/esm/shaders/pointMark.wgsl.generated.d.ts +1 -1
- package/esm/shaders/pointMark.wgsl.generated.js +1 -1
- package/esm/shaders/spanMark.glsl.generated.d.ts +1 -1
- package/esm/shaders/spanMark.glsl.generated.js +1 -1
- package/esm/shaders/spanMark.wgsl.generated.d.ts +1 -1
- package/esm/shaders/spanMark.wgsl.generated.js +1 -1
- package/esm/slangPass.d.ts +5 -3
- package/esm/slangPass.js +2 -2
- package/package.json +7 -4
- package/src/shaders/arcHull.test.ts +87 -0
- package/src/shaders/barMark.glsl.generated.ts +1 -1
- package/src/shaders/barMark.slang +2 -2
- package/src/shaders/barMark.wgsl.generated.ts +1 -1
- package/src/shaders/capsule.js.generated.ts +2 -2
- package/src/shaders/capsule.slang +69 -24
- package/src/shaders/clipStrip.slang +1 -1
- package/src/shaders/colorPack.slang +2 -2
- package/src/shaders/colorRampLut.slang +7 -7
- package/src/shaders/connectorMark.consts.generated.ts +24 -0
- package/src/shaders/connectorMark.generated.ts +12 -0
- package/src/shaders/connectorMark.glsl.generated.ts +6 -0
- package/src/shaders/connectorMark.iface.generated.ts +1270 -0
- package/src/shaders/connectorMark.js.generated.ts +52 -0
- package/src/shaders/connectorMark.slang +287 -0
- package/src/shaders/connectorMark.wgsl.generated.ts +4 -0
- package/src/shaders/coverageBand.slang +10 -12
- package/src/shaders/coverageInterbase.glsl.generated.ts +1 -1
- package/src/shaders/coverageInterbase.slang +24 -21
- package/src/shaders/coverageInterbase.wgsl.generated.ts +1 -1
- package/src/shaders/coverageSnp.slang +1 -1
- package/src/shaders/curveDistance.js.generated.ts +112 -0
- package/src/shaders/curveDistance.slang +104 -1
- package/src/shaders/farDome.test.ts +117 -0
- package/src/shaders/hpClampFloor.test.ts +0 -4
- package/src/shaders/insertionGlyph.generated.ts +14 -0
- package/src/shaders/insertionGlyph.slang +59 -0
- package/src/shaders/lineCenterMark.glsl.generated.ts +2 -2
- package/src/shaders/lineCenterMark.iface.generated.ts +21 -18
- package/src/shaders/lineCenterMark.slang +19 -23
- package/src/shaders/lineCenterMark.wgsl.generated.ts +1 -1
- package/src/shaders/lineCommon.js.generated.ts +20 -0
- package/src/shaders/lineCommon.slang +18 -8
- package/src/shaders/lineStepMark.glsl.generated.ts +2 -2
- package/src/shaders/lineStepMark.iface.generated.ts +21 -18
- package/src/shaders/lineStepMark.slang +10 -6
- package/src/shaders/lineStepMark.wgsl.generated.ts +1 -1
- package/src/shaders/linkMark.consts.generated.ts +2 -0
- package/src/shaders/linkMark.glsl.generated.ts +2 -2
- package/src/shaders/linkMark.js.generated.ts +30 -4
- package/src/shaders/linkMark.slang +67 -24
- package/src/shaders/linkMark.wgsl.generated.ts +1 -1
- package/src/shaders/markColor.slang +10 -10
- package/src/shaders/pointMark.glsl.generated.ts +1 -1
- package/src/shaders/pointMark.iface.generated.ts +19 -16
- package/src/shaders/pointMark.slang +12 -8
- package/src/shaders/pointMark.wgsl.generated.ts +1 -1
- package/src/shaders/rowRect.slang +3 -3
- package/src/shaders/rowTable.slang +12 -8
- package/src/shaders/scoreScale.slang +1 -1
- package/src/shaders/spanMark.glsl.generated.ts +1 -1
- package/src/shaders/spanMark.slang +5 -5
- package/src/shaders/spanMark.wgsl.generated.ts +1 -1
- package/src/shaders/viewRegion.slang +13 -0
- package/esm/shaders/coverageIndicator.generated.js +0 -7
- package/esm/shaders/coverageIndicator.glsl.generated.d.ts +0 -2
- package/esm/shaders/coverageIndicator.glsl.generated.js +0 -4
- package/esm/shaders/coverageIndicator.iface.generated.d.ts +0 -85
- package/esm/shaders/coverageIndicator.iface.generated.js +0 -114
- package/esm/shaders/coverageIndicator.wgsl.generated.d.ts +0 -1
- package/esm/shaders/coverageIndicator.wgsl.generated.js +0 -3
- package/src/shaders/coverageIndicator.generated.ts +0 -11
- package/src/shaders/coverageIndicator.glsl.generated.ts +0 -6
- package/src/shaders/coverageIndicator.iface.generated.ts +0 -172
- package/src/shaders/coverageIndicator.slang +0 -61
- package/src/shaders/coverageIndicator.wgsl.generated.ts +0 -4
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// AUTO-GENERATED by packages/shader-tools/src/shader-codegen from linkMark.slang.
|
|
2
2
|
// Do not edit. Run `pnpm gen:shaders` to regenerate.
|
|
3
3
|
|
|
4
|
-
export const GLSL_VERTEX = "#version 300 es\nprecision highp float;\nprecision highp int;\nprecision highp sampler2D;\n\n\n\nlayout(std140) uniform Uniforms\n{\n float canvasHeight_0;\n float devicePixelRatio_0;\n float rowHeight_0;\n float rowOffsetPx_0;\n int reverse_0;\n float stemPx_0;\n float dashPx_0;\n float gapPx_0;\n float footPx_0;\n uint curveSegments_0;\n float insetPx_0;\n float domainMin_0;\n float domainMax_0;\n int valueScaleType_0;\n float valueSymlogConstant_0;\n int rampMode_0;\n float rampMin_0;\n float rampMax_0;\n float rampMidNorm_0;\n int colorCutCount_0;\n vec4 colorCuts_0[2];\n vec4 colorBands_0[9];\n int valued_0;\n int linkShape_0;\n int sizeMode_0;\n float sizeConstantPx_0;\n float sizeDomainMin_0;\n float sizeDomainMax_0;\n int sizeScaleType_0;\n float sizeRangeMin_0;\n float sizeRangeMax_0;\n float canvasWidth_0;\n uint regionCount_0;\n float zero_0;\n vec4 ownEntry_0;\n vec4 ownSpan_0;\n vec4 regionTable_0[256];\n vec4 regionSpan_0[128];\n int rowTableKeys_0;\n}u_0;\n\nuniform sampler2D u_colorRamp;\n\n\nuniform sampler2D u_rowTable;\n\n\nvec4 unpackRGBA_0(uint c_0)\n{\n\n return vec4(float((c_0 >> 0U) & 255U), float((c_0 >> 8U) & 255U), float((c_0 >> 16U) & 255U), float((c_0 >> 24U) & 255U)) / 255.0;\n}\n\n\nfloat rampMidT_0(float t_0, float mid_0)\n{\n\n float _S1 = max(mid_0, 1.0 - mid_0);\n return clamp((t_0 + (_S1 - mid_0)) / (2.0 * _S1), 0.0, 1.0);\n}\n\n\nfloat colorCutAt_0(int i_0, vec4 cutsLo_0, vec4 cutsHi_0)\n{\n\n float _S2;\n if(i_0 < 4)\n {\n\n _S2 = cutsLo_0[i_0];\n\n }\n else\n {\n\n _S2 = cutsHi_0[i_0 - 4];\n\n }\n\n return _S2;\n}\n\n\nint thresholdBand_0(float value_0, int cutCount_0, vec4 cutsLo_1, vec4 cutsHi_1)\n{\n\n int band_0 = 0;\n\n int i_1 = 0;\n\n for(;;)\n {\n\n if(i_1 < cutCount_0)\n {\n }\n else\n {\n\n break;\n }\n\n if(value_0 >= (colorCutAt_0(i_1, cutsLo_1, cutsHi_1)))\n {\n\n band_0 = i_1 + 1;\n\n }\n\n i_1 = i_1 + 1;\n\n }\n\n return band_0;\n}\n\n\nfloat log1pf_0(float x_0)\n{\n\n float u_1 = 1.0 + x_0;\n\n float _S3;\n if(u_1 == 1.0)\n {\n\n _S3 = x_0;\n\n }\n else\n {\n\n _S3 = log(u_1) * (x_0 / (u_1 - 1.0));\n\n }\n\n return _S3;\n}\n\nfloat symlogTransform_0(float x_1, float c_1)\n{\n\n return float((int(sign((x_1))))) * log1pf_0(abs(x_1 / c_1));\n}\n\n\nfloat normalizeScoreUnclamped_0(float score_0, float domainMin_1, float domainMax_1, int scaleType_0, float symlogConstant_0)\n{\n\n float tMax_0;\n\n float tMin_0;\n\n float t_1;\n\n\n\n if(scaleType_0 == 2)\n {\n\n float _S4 = symlogTransform_0(score_0, symlogConstant_0);\n float _S5 = symlogTransform_0(domainMin_1, symlogConstant_0);\n\n tMax_0 = symlogTransform_0(domainMax_1, symlogConstant_0);\n\n tMin_0 = _S5;\n\n t_1 = _S4;\n\n }\n else\n {\n\n if(scaleType_0 == 1)\n {\n if(domainMin_1 > 0.0)\n {\n\n tMax_0 = domainMin_1;\n\n }\n else\n {\n\n tMax_0 = 1.0;\n\n }\n float _S6 = log2(max(score_0, tMax_0));\n float _S7 = log2(tMax_0);\n\n tMax_0 = log2(max(domainMax_1, tMax_0));\n\n tMin_0 = _S7;\n\n t_1 = _S6;\n\n }\n else\n {\n\n tMax_0 = domainMax_1;\n\n tMin_0 = domainMin_1;\n\n t_1 = score_0;\n\n }\n\n }\n\n float tRange_0 = tMax_0 - tMin_0;\n if(tRange_0 <= 0.0)\n {\n\n if(t_1 > tMin_0)\n {\n\n tMax_0 = 1.0;\n\n }\n else\n {\n\n tMax_0 = 0.0;\n\n }\n\n return tMax_0;\n }\n return (t_1 - tMin_0) / tRange_0;\n}\n\nfloat normalizeScore_0(float score_1, float domainMin_2, float domainMax_2, int scaleType_1, float symlogConstant_1)\n{\n\n return clamp(normalizeScoreUnclamped_0(score_1, domainMin_2, domainMax_2, scaleType_1, symlogConstant_1), 0.0, 1.0);\n}\n\n\nuint rowTableWidth_0(uint keys_0)\n{\n\n return max(min(keys_0, 2048U), 1U);\n}\n\nuint rowTablePlaneHeight_0(uint keys_1)\n{\n\n uint w_0 = rowTableWidth_0(keys_1);\n uint _S8 = (keys_1 + w_0 - 1U) / w_0;\n\n return max(_S8, 1U);\n}\n\nuint rowTableTexelX_0(uint key_0, uint keys_2)\n{\n\n uint _S9 = key_0 % rowTableWidth_0(keys_2);\n\n return _S9;\n}\n\n\nuint rowTableTexelY_0(uint key_1, uint keys_3)\n{\n\n uint _S10 = key_1 / rowTableWidth_0(keys_3);\n\n return _S10;\n}\n\n\nuint byteOf_0(float channel_0)\n{\n\n return uint(channel_0 * 255.0 + 0.5);\n}\n\n\nfloat linkStrokeWidthPx_0(float raw_0, int sizeMode_1, float constantPx_0, float domainMin_3, float domainMax_3, int scaleType_2, float rangeMin_0, float rangeMax_0, float dpr_0)\n{\n\n float w_1;\n\n if(sizeMode_1 == 1)\n {\n if(raw_0 > -1.00000001504746622e+29)\n {\n\n w_1 = rangeMin_0 + normalizeScore_0(raw_0, domainMin_3, domainMax_3, scaleType_2, 1.0) * (rangeMax_0 - rangeMin_0);\n\n }\n else\n {\n\n w_1 = rangeMin_0;\n\n }\n\n }\n else\n {\n\n w_1 = constantPx_0;\n\n }\n\n return max(w_1, 1.5 / dpr_0);\n}\n\n\nfloat aaPx_0(float dpr_1)\n{\n\n return 1.0 / max(dpr_1, 1.0);\n}\n\n\nfloat aaHalfPx_0(float dpr_2)\n{\n\n return 0.5 * aaPx_0(dpr_2);\n}\n\n\nfloat rowBandTopPx_0(float rowOffsetPx_1, float rowHeight_1, uint slot_0)\n{\n\n return rowOffsetPx_1 + rowHeight_1 * float(slot_0);\n}\n\n\nfloat linkBaseYPx_0(float rowOffsetPx_2, float rowHeight_2, uint row_0, int reverse_1)\n{\n\n float _S11 = rowBandTopPx_0(rowOffsetPx_2, rowHeight_2, row_0);\n\n float _S12;\n\n if(reverse_1 != 0)\n {\n\n _S12 = 0.0;\n\n }\n else\n {\n\n _S12 = rowHeight_2;\n\n }\n\n return _S11 + _S12;\n}\n\n\nvec2 hpSplitUint_0(uint value_1)\n{\n\n uint lo_0 = value_1 & 4095U;\n\n return vec2(float(value_1 - lo_0), float(lo_0));\n}\n\n\nfloat hpViewportOffsetBp_0(vec2 splitPos_0, vec3 bpRange_0, float hpZero_0)\n{\n\n float floorBp_0 = -3.00000000549775576e+38 + hpZero_0;\n\n\n return max(bpRange_0.x - splitPos_0.x, floorBp_0) + max(bpRange_0.y - splitPos_0.y, floorBp_0);\n}\n\n\nfloat entryPx_0(uint bp_0, vec4 r_0, float hpZero_1)\n{\n\n return r_0.x - hpViewportOffsetBp_0(hpSplitUint_0(bp_0), vec3(r_0.y, r_0.z, 0.0), hpZero_1) * r_0.w;\n}\n\n\nfloat valueToYPxScaled_0(float value_2, float domainMin_4, float domainMax_4, float h_0, int scaleType_3, float symlogConstant_2)\n{\n\n return (1.0 - normalizeScore_0(value_2, domainMin_4, domainMax_4, scaleType_3, symlogConstant_2)) * h_0;\n}\n\n\nfloat insetValueYPx_0(float value_3, float domainMin_5, float domainMax_5, float h_1, int scaleType_4, float insetPx_1, float symlogConstant_3)\n{\n\n float _S13 = min(insetPx_1, h_1 * 0.5);\n return _S13 + valueToYPxScaled_0(value_3, domainMin_5, domainMax_5, h_1 - 2.0 * _S13, scaleType_4, symlogConstant_3);\n}\n\n\nfloat linkValuePx_0(float value_4, float domainMin_6, float domainMax_6, float h_2, int scaleType_5, float insetPx_2, float symlogConstant_4)\n{\n\n return h_2 - insetValueYPx_0(value_4, domainMin_6, domainMax_6, h_2, scaleType_5, insetPx_2, symlogConstant_4);\n}\n\n\nfloat linkApexPx_0(float halfWidthPx_0, float reachPx_0, int linkShape_1, int valued_1, float valuePx_0)\n{\n\n if(valued_1 != 0)\n {\n\n return valuePx_0;\n }\n\n if(linkShape_1 == 2)\n {\n\n return 0.0;\n }\n\n if(linkShape_1 == 1)\n {\n\n return halfWidthPx_0;\n }\n\n return min(halfWidthPx_0, reachPx_0);\n}\n\n\nbool linkIsFar_0(float halfWidthPx_1, float screenWidthPx_0)\n{\n\n return (2.0 * halfWidthPx_1) > (3.0 * screenWidthPx_0);\n}\n\n\nvec2 linkRadiiPx_0(float halfWidthPx_2, float apexPx_0, float screenWidthPx_1)\n{\n\n if(linkIsFar_0(halfWidthPx_2, screenWidthPx_1))\n {\n\n return vec2(halfWidthPx_2, halfWidthPx_2);\n }\n return vec2(halfWidthPx_2, apexPx_0);\n}\n\n\nfloat legSweepAngle_0(float radiusPx_0, float yReachPx_0)\n{\n\n return asin(clamp(yReachPx_0 / max(radiusPx_0, 9.99999997475242708e-07), 0.0, 1.0));\n}\n\n\nvec2 wideCircleLeg_0(uint seg_0, uint segments_0, float legSweep_0)\n{\n\n uint half_0 = segments_0 / 2U;\n if(seg_0 <= half_0)\n {\n\n return vec2(1.0, float(seg_0) / float(half_0) * legSweep_0);\n }\n return vec2(-1.0, float(segments_0 - seg_0) / float(segments_0 - half_0 - 1U) * legSweep_0);\n}\n\n\n\n\nfloat wideCircleLegStep_0(uint seg_1, uint segments_1, float legSweep_1)\n{\n\n uint half_1 = segments_1 / 2U;\n\n uint _S14;\n if(seg_1 <= half_1)\n {\n\n _S14 = half_1;\n\n }\n else\n {\n\n _S14 = segments_1 - half_1 - 1U;\n\n }\n\n return legSweep_1 / float(_S14);\n}\n\n\nvec2 wideCircleHullPoint_0(float sinB_0, float sinHalfB_0, float cosHalf_0, float radiusPx_1, float padPx_0)\n{\n\n float sec_0;\n if(padPx_0 > 0.0)\n {\n\n sec_0 = 1.0 / max(cosHalf_0, 9.99999997475242708e-07);\n\n }\n else\n {\n\n sec_0 = 1.0;\n\n }\n float grow_0 = radiusPx_1 * (sec_0 - 1.0) + sec_0 * padPx_0;\n float sh2_0 = sinHalfB_0 * sinHalfB_0;\n return vec2(grow_0 * (1.0 - 2.0 * sh2_0) - 2.0 * radiusPx_1 * sh2_0, (radiusPx_1 + grow_0) * sinB_0);\n}\n\n\nvec2 ellipseHullPoint_0(float cosA_0, float sinA_0, float cosHalf_1, float sinHalf_0, float rx_0, float ry_0, float padPx_1)\n{\n float px_0 = cosA_0 * rx_0;\n float py_0 = sinA_0 * ry_0;\n if(padPx_1 <= 0.0)\n {\n\n float d_0 = - padPx_1;\n float gx_0 = ry_0 * cosA_0;\n float gy_0 = rx_0 * sinA_0;\n float glen_0 = sqrt(gx_0 * gx_0 + gy_0 * gy_0);\n bool acrossX_0 = (ry_0 * glen_0) < (d_0 * rx_0);\n bool acrossY_0 = (rx_0 * glen_0) < (d_0 * ry_0);\n\n bool _S15;\n if(acrossX_0)\n {\n\n _S15 = acrossY_0;\n\n }\n else\n {\n\n _S15 = false;\n\n }\n\n if(_S15)\n {\n\n return vec2(0.0, 0.0);\n }\n\n if(acrossX_0)\n {\n\n float _S16 = ry_0 * ry_0;\n return vec2(float((int(sign((cosA_0))))) * sqrt(max(_S16 - d_0 * d_0, 0.0) * max(rx_0 * rx_0 - _S16, 0.0)) / max(ry_0, 9.99999997475242708e-07), 0.0);\n }\n if(acrossY_0)\n {\n\n float _S17 = rx_0 * rx_0;\n return vec2(0.0, float((int(sign((sinA_0))))) * sqrt(max(_S17 - d_0 * d_0, 0.0) * max(ry_0 * ry_0 - _S17, 0.0)) / max(rx_0, 9.99999997475242708e-07));\n }\n float k_0 = d_0 / max(glen_0, 9.99999997475242708e-07);\n return vec2(px_0 - gx_0 * k_0, py_0 - gy_0 * k_0);\n }\n float _S18 = cosA_0 * cosHalf_1;\n\n float _S19 = sinA_0 * sinHalf_0;\n\n float ax_0 = ry_0 * (_S18 + _S19);\n float _S20 = sinA_0 * cosHalf_1;\n\n float _S21 = cosA_0 * sinHalf_0;\n\n float ay_0 = rx_0 * (_S20 - _S21);\n float bx_0 = ry_0 * (_S18 - _S19);\n float by_0 = rx_0 * (_S20 + _S21);\n float _S22 = max(sqrt(ax_0 * ax_0 + ay_0 * ay_0), 9.99999968265522539e-21);\n float _S23 = max(sqrt(bx_0 * bx_0 + by_0 * by_0), 9.99999968265522539e-21);\n float nx_0 = ax_0 / _S22 + bx_0 / _S23;\n float ny_0 = ay_0 / _S22 + by_0 / _S23;\n float m_0 = 2.0 * padPx_1 / max(nx_0 * nx_0 + ny_0 * ny_0, 0.00019999999494758);\n return vec2(px_0 / cosHalf_1 + nx_0 * m_0, py_0 / cosHalf_1 + ny_0 * m_0);\n}\n\n\nstruct LinkVertex_0\n{\n vec2 screen_0;\n vec2 local_0;\n vec2 radii_0;\n float kind_0;\n float legSide_0;\n};\n\n\nstruct LinkInstance_0\n{\n uint x_2;\n uint x2_0;\n uint x2Region_0;\n float y_0;\n float size_0;\n uint color_0;\n uint row_1;\n uint feet_0;\n};\n\n\nstruct LinkEnv_0\n{\n float strokeHalf_0;\n float hw_0;\n float baseY_0;\n float ySign_0;\n float reach_0;\n float xPx_0;\n float x2Px_0;\n bool placed_0;\n};\n\n\nLinkVertex_0 curveVertex_0(LinkInstance_0 inst_0, LinkEnv_0 e_0, uint seg_2, float side_0)\n{\n\n float t_2 = float(seg_2) / float(u_0.curveSegments_0);\n\n float pad_0 = side_0 * e_0.hw_0;\n\n\n LinkVertex_0 v_0;\n v_0.legSide_0 = 1.0;\n\n float legDir_0;\n\n vec2 origin_0;\n if(!e_0.placed_0)\n {\n\n v_0.kind_0 = 2.0;\n v_0.radii_0 = vec2(0.0, u_0.stemPx_0);\n\n\n v_0.local_0 = vec2(pad_0, - t_2 * (u_0.stemPx_0 + e_0.hw_0));\n\n origin_0 = vec2(e_0.xPx_0, e_0.baseY_0);\n\n legDir_0 = 1.0;\n\n }\n else\n {\n\n float pairHalf_0 = abs(e_0.x2Px_0 - e_0.xPx_0) * 0.5;\n\n\n float apex_0 = linkApexPx_0(pairHalf_0, e_0.reach_0, u_0.linkShape_0, u_0.valued_0, linkValuePx_0(inst_0.y_0, 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 v_0.radii_0 = linkRadiiPx_0(pairHalf_0, apex_0, u_0.canvasWidth_0);\n float _S24 = min(e_0.xPx_0, e_0.x2Px_0);\n\n float _S25 = max(e_0.xPx_0, e_0.x2Px_0);\n if((u_0.linkShape_0) == 2)\n {\n\n v_0.kind_0 = 3.0;\n float _S26 = max(2.0 * pairHalf_0, 2.5);\n v_0.radii_0 = vec2(_S26, 0.0);\n v_0.local_0 = vec2(t_2 * _S26, pad_0);\n\n origin_0 = vec2((e_0.xPx_0 + e_0.x2Px_0) * 0.5 - _S26 * 0.5, e_0.baseY_0 - apex_0 * e_0.ySign_0);\n\n legDir_0 = 1.0;\n\n }\n else\n {\n\n\n\n if(linkIsFar_0(pairHalf_0, u_0.canvasWidth_0))\n {\n\n v_0.kind_0 = 1.0;\n float legSweep_2 = legSweepAngle_0(v_0.radii_0.x, e_0.reach_0 + e_0.hw_0);\n\n\n vec2 leg_0 = wideCircleLeg_0(seg_2, u_0.curveSegments_0, legSweep_2);\n float b_0 = leg_0.y;\n\n\n vec2 _S27 = wideCircleHullPoint_0(sin(b_0), sin(b_0 * 0.5), cos(0.5 * wideCircleLegStep_0(seg_2, u_0.curveSegments_0, legSweep_2)), v_0.radii_0.x, pad_0);\n\n v_0.local_0 = _S27;\n\n v_0.local_0[1] = - _S27.y;\n float _S28 = leg_0.x;\n\n if(_S28 > 0.0)\n {\n\n legDir_0 = _S25;\n\n }\n else\n {\n\n legDir_0 = _S24;\n\n }\n\n vec2 _S29 = vec2(legDir_0, e_0.baseY_0);\n\n v_0.legSide_0 = _S28;\n\n origin_0 = _S29;\n\n legDir_0 = _S28;\n\n }\n else\n {\n\n v_0.kind_0 = 0.0;\n float a_0 = t_2 * 3.14159274101257324;\n float halfStep_0 = 3.14159274101257324 / (2.0 * float(u_0.curveSegments_0));\n vec2 _S30 = ellipseHullPoint_0(cos(a_0), sin(a_0), cos(halfStep_0), sin(halfStep_0), v_0.radii_0.x, v_0.radii_0.y, pad_0);\n\n v_0.local_0 = _S30;\n\n v_0.local_0[1] = - _S30.y;\n\n origin_0 = vec2((e_0.xPx_0 + e_0.x2Px_0) * 0.5, e_0.baseY_0);\n\n legDir_0 = 1.0;\n\n }\n\n }\n\n }\n\n v_0.screen_0 = origin_0 + vec2(legDir_0 * v_0.local_0.x, v_0.local_0.y * e_0.ySign_0);\n return v_0;\n}\n\n\nvec2 regionSpanPx_0(uint region_0)\n{\n\n vec4 s_0 = u_0.regionSpan_0[region_0 / 2U];\n\n vec2 _S31;\n if((region_0 % 2U) == 0U)\n {\n\n _S31 = s_0.xy;\n\n }\n else\n {\n\n _S31 = s_0.zw;\n\n }\n\n return _S31;\n}\n\n\nfloat linkFootDir_0(uint feet_1, uint shift_0)\n{\n\n uint d_1 = (feet_1 >> shift_0) & 3U;\n\n float _S32;\n if(d_1 == 1U)\n {\n\n _S32 = 1.0;\n\n }\n else\n {\n\n if(d_1 == 2U)\n {\n\n _S32 = -1.0;\n\n }\n else\n {\n\n _S32 = 0.0;\n\n }\n\n }\n\n return _S32;\n}\n\n\nfloat linkFootLenPx_0(float x_3, float dir_0, float leftPx_0, float rightPx_0, float footPx_1)\n{\n\n float _S33;\n if(dir_0 > 0.0)\n {\n\n _S33 = rightPx_0 - x_3;\n\n }\n else\n {\n\n _S33 = x_3 - leftPx_0;\n\n }\n\n return max(0.0, min(footPx_1, _S33));\n}\n\n\nLinkVertex_0 footCorner_0(LinkInstance_0 inst_1, LinkEnv_0 e_1, uint f_0, uint c_2, out bool present_0)\n{\n\n bool _S34 = f_0 == 0U;\n\n float x_4;\n\n if(_S34)\n {\n\n x_4 = e_1.xPx_0;\n\n }\n else\n {\n\n x_4 = e_1.x2Px_0;\n\n }\n uint _S35 = min(inst_1.x2Region_0, 255U);\n\n vec4 entry_0;\n if(_S34)\n {\n\n entry_0 = u_0.ownEntry_0;\n\n }\n else\n {\n\n entry_0 = u_0.regionTable_0[_S35];\n\n }\n\n vec2 span_0;\n if(_S34)\n {\n\n span_0 = u_0.ownSpan_0.xy;\n\n }\n else\n {\n\n span_0 = regionSpanPx_0(_S35);\n\n }\n float dir_1 = linkFootDir_0(inst_1.feet_0, f_0 * 2U) * float((int(sign((entry_0.w)))));\n float len_0 = linkFootLenPx_0(x_4, dir_1, span_0.x, span_0.y, u_0.footPx_0);\n\n bool _S36;\n if(dir_1 != 0.0)\n {\n\n _S36 = len_0 > 0.0;\n\n }\n else\n {\n\n _S36 = false;\n\n }\n\n if(_S36)\n {\n\n if(_S34)\n {\n\n _S36 = true;\n\n }\n else\n {\n\n _S36 = e_1.placed_0;\n\n }\n\n }\n else\n {\n\n _S36 = false;\n\n }\n\n present_0 = _S36;\n\n float along_0;\n if(c_2 >= 2U)\n {\n\n along_0 = len_0;\n\n }\n else\n {\n\n along_0 = 0.0;\n\n }\n\n float across_0;\n if((c_2 % 2U) == 0U)\n {\n\n across_0 = - e_1.hw_0;\n\n }\n else\n {\n\n across_0 = e_1.hw_0;\n\n }\n LinkVertex_0 v_1;\n v_1.kind_0 = 4.0;\n v_1.radii_0 = vec2(len_0, 0.0);\n v_1.legSide_0 = 1.0;\n v_1.local_0 = vec2(along_0, across_0);\n v_1.screen_0 = vec2(x_4 + dir_1 * along_0, e_1.baseY_0 - e_1.ySign_0 * e_1.strokeHalf_0 + across_0);\n return v_1;\n}\n\n\n\nLinkVertex_0 footBlockStart_0(LinkInstance_0 inst_2, LinkEnv_0 e_2, uint f_1)\n{\n\n LinkVertex_0 tail_0 = curveVertex_0(inst_2, e_2, u_0.curveSegments_0, 1.0);\n if(f_1 == 0U)\n {\n\n return tail_0;\n }\n\n bool first_0;\n LinkVertex_0 last_0 = footCorner_0(inst_2, e_2, 0U, 3U, first_0);\n\n LinkVertex_0 _S37;\n if(first_0)\n {\n\n _S37 = last_0;\n\n }\n else\n {\n\n _S37 = tail_0;\n\n }\n\n return _S37;\n}\n\n\n\nLinkVertex_0 footVertex_0(LinkInstance_0 inst_3, LinkEnv_0 e_3, uint f_2, uint k_1)\n{\n\n LinkVertex_0 start_0 = footBlockStart_0(inst_3, e_3, f_2);\n if(k_1 == 0U)\n {\n\n return start_0;\n }\n\n bool present_1;\n\n uint _S38;\n if(k_1 <= 2U)\n {\n\n _S38 = 0U;\n\n }\n else\n {\n\n _S38 = k_1 - 2U;\n\n }\n\n LinkVertex_0 v_2 = footCorner_0(inst_3, e_3, f_2, _S38, present_1);\n\n LinkVertex_0 _S39;\n if(present_1)\n {\n\n _S39 = v_2;\n\n }\n else\n {\n\n _S39 = start_0;\n\n }\n\n return _S39;\n}\n\n\nfloat yPxToClipY_0(float yPx_0, float canvasHeight_1)\n{\n\n return 1.0 - yPx_0 / canvasHeight_1 * 2.0;\n}\n\n\nout vec4 v_color;\n\n\nout vec2 v_local;\n\n\nflat out vec2 v_radii;\n\n\nflat out float v_kind;\n\n\nflat out float v_halfWidthPx;\n\n\nout float v_legSide;\n\n\nlayout(location = 0)\nin uint a_x;\n\n\nlayout(location = 1)\nin uint a_x2;\n\n\nlayout(location = 2)\nin uint a_x2Region;\n\n\nlayout(location = 3)\nin float a_y;\n\n\nlayout(location = 4)\nin float a_size;\n\n\nlayout(location = 5)\nin uint a_color;\n\n\nlayout(location = 6)\nin uint a_row;\n\n\nlayout(location = 7)\nin uint a_feet;\n\n\nvec4 rampColor_0(float _S40)\n{\n\n return (textureLod((u_colorRamp), (vec2((clamp(_S40, 0.0, 1.0) * 255.0 + 0.5) / 256.0, 0.5)), (0.0)));\n}\n\n\nvec4 markScaleColor_0(uint _S41, int _S42, float _S43, float _S44, float _S45, int _S46, vec4 _S47, vec4 _S48)\n{\n\n if(_S42 == 0)\n {\n\n return unpackRGBA_0(_S41);\n }\n if(_S41 == 2143289345U)\n {\n\n return unpackRGBA_0(4289703855U);\n }\n\n int scaleType_6;\n\n if((_S41 & 2139095040U) == 2139095040U)\n {\n\n if((_S41 & 8388607U) != 0U)\n {\n\n return unpackRGBA_0(4286611584U);\n }\n\n bool negative_0 = (_S41 & 2147483648U) != 0U;\n if(_S42 == 3)\n {\n\n if(negative_0)\n {\n\n scaleType_6 = 0;\n\n }\n else\n {\n\n scaleType_6 = _S46;\n\n }\n\n return u_0.colorBands_0[scaleType_6];\n }\n\n float _S49;\n\n if(negative_0)\n {\n\n _S49 = 0.0;\n\n }\n else\n {\n\n _S49 = 1.0;\n\n }\n\n return rampColor_0(rampMidT_0(_S49, _S45));\n }\n float value_5 = uintBitsToFloat(_S41);\n if(_S42 == 3)\n {\n\n return u_0.colorBands_0[thresholdBand_0(value_5, _S46, _S47, _S48)];\n }\n if(_S42 == 2)\n {\n\n scaleType_6 = 1;\n\n }\n else\n {\n\n scaleType_6 = 0;\n\n }\n return rampColor_0(rampMidT_0(normalizeScore_0(value_5, _S43, _S44, scaleType_6, 1.0), _S45));\n}\n\n\nstruct RowPlacement_0\n{\n bool hidden_0;\n uint slot_1;\n vec4 color_1;\n};\n\n\nRowPlacement_0 rowTableLookup_0(uint _S50, int _S51, vec4 _S52)\n{\n\n RowPlacement_0 p_0;\n p_0.hidden_0 = false;\n p_0.slot_1 = _S50;\n p_0.color_1 = _S52;\n if(_S51 < 0)\n {\n\n return p_0;\n }\n uint n_0 = uint(_S51);\n if(_S50 >= n_0)\n {\n\n p_0.hidden_0 = true;\n return p_0;\n }\n uint h_3 = rowTablePlaneHeight_0(n_0);\n uint _S53 = rowTableTexelX_0(_S50, n_0);\n\n float u_2 = (float(_S53) + 0.5) / float(rowTableWidth_0(n_0));\n float rows_0 = float(2U * h_3);\n uint y_1 = rowTableTexelY_0(_S50, n_0);\n vec4 s_1 = (textureLod((u_rowTable), (vec2(u_2, (float(y_1) + 0.5) / rows_0)), (0.0)));\n if((s_1.w) < 0.5)\n {\n\n p_0.hidden_0 = true;\n return p_0;\n }\n p_0.slot_1 = ((byteOf_0(s_1.x)) | ((byteOf_0(s_1.y)) << 8)) | ((byteOf_0(s_1.z)) << 16);\n vec4 c_3 = (textureLod((u_rowTable), (vec2(u_2, (float(y_1 + h_3) + 0.5) / rows_0)), (0.0)));\n\n vec4 _S54;\n if((c_3.w) > 0.0)\n {\n\n _S54 = c_3;\n\n }\n else\n {\n\n _S54 = _S52;\n\n }\n\n p_0.color_1 = _S54;\n return p_0;\n}\n\n\nstruct VsOut_0\n{\n vec4 position_0;\n vec4 color_2;\n vec2 local_1;\n vec2 radii_1;\n float kind_1;\n float halfWidthPx_3;\n float legSide_1;\n};\n\n\nvoid main()\n{\n\n RowPlacement_0 _S55 = rowTableLookup_0(a_row, u_0.rowTableKeys_0, markScaleColor_0(a_color, u_0.rampMode_0, u_0.rampMin_0, u_0.rampMax_0, u_0.rampMidNorm_0, u_0.colorCutCount_0, u_0.colorCuts_0[0], u_0.colorCuts_0[1]));\n\n\n LinkEnv_0 e_4;\n float _S56 = 0.5 * linkStrokeWidthPx_0(a_size, u_0.sizeMode_0, u_0.sizeConstantPx_0, u_0.sizeDomainMin_0, u_0.sizeDomainMax_0, u_0.sizeScaleType_0, u_0.sizeRangeMin_0, u_0.sizeRangeMax_0, u_0.devicePixelRatio_0);\n\n e_4.strokeHalf_0 = _S56;\n\n\n e_4.hw_0 = _S56 + aaHalfPx_0(u_0.devicePixelRatio_0);\n e_4.baseY_0 = linkBaseYPx_0(u_0.rowOffsetPx_0, u_0.rowHeight_0, _S55.slot_1, u_0.reverse_0);\n\n float _S57;\n if((u_0.reverse_0) != 0)\n {\n\n _S57 = -1.0;\n\n }\n else\n {\n\n _S57 = 1.0;\n\n }\n\n e_4.ySign_0 = _S57;\n e_4.reach_0 = max(u_0.rowHeight_0 - u_0.insetPx_0, 0.0);\n e_4.xPx_0 = entryPx_0(a_x, u_0.ownEntry_0, u_0.zero_0);\n bool _S58 = a_x2Region < (u_0.regionCount_0);\n\n e_4.placed_0 = _S58;\n if(_S58)\n {\n\n _S57 = entryPx_0(a_x2, u_0.regionTable_0[a_x2Region], u_0.zero_0);\n\n }\n else\n {\n\n _S57 = e_4.xPx_0;\n\n }\n\n e_4.x2Px_0 = _S57;\n\n uint curveVerts_0 = (u_0.curveSegments_0 + 1U) * 2U;\n\n LinkVertex_0 v_3;\n\n if(uint(gl_VertexID) < curveVerts_0)\n {\n\n LinkEnv_0 _S59 = e_4;\n\n uint _S60 = uint(gl_VertexID) / 2U;\n\n if((uint(gl_VertexID) % 2U) == 0U)\n {\n\n _S57 = -1.0;\n\n }\n else\n {\n\n _S57 = 1.0;\n\n }\n\n LinkInstance_0 _S61 = LinkInstance_0(a_x, a_x2, a_x2Region, a_y, a_size, a_color, a_row, a_feet);\n\n v_3 = curveVertex_0(_S61, _S59, _S60, _S57);\n\n }\n else\n {\n uint j_0 = uint(gl_VertexID) - curveVerts_0;\n\n LinkInstance_0 _S62 = LinkInstance_0(a_x, a_x2, a_x2Region, a_y, a_size, a_color, a_row, a_feet);\n\n v_3 = footVertex_0(_S62, e_4, j_0 / 6U, j_0 % 6U);\n\n }\n\n VsOut_0 o_0;\n\n bool _S63;\n if(a_x2Region == 4294967294U)\n {\n\n _S63 = true;\n\n }\n else\n {\n\n _S63 = _S55.hidden_0;\n\n }\n\n vec4 _S64;\n if(_S63)\n {\n\n _S64 = vec4(-2.0, -2.0, 0.0, 1.0);\n\n }\n else\n {\n\n _S64 = vec4(v_3.screen_0.x / u_0.canvasWidth_0 * 2.0 - 1.0, yPxToClipY_0(v_3.screen_0.y, u_0.canvasHeight_0), 0.0, 1.0);\n\n }\n\n o_0.position_0 = _S64;\n\n o_0.color_2 = _S55.color_1;\n o_0.local_1 = v_3.local_0;\n o_0.radii_1 = v_3.radii_0;\n o_0.kind_1 = v_3.kind_0;\n o_0.halfWidthPx_3 = e_4.strokeHalf_0;\n o_0.legSide_1 = v_3.legSide_0;\n VsOut_0 _S65 = o_0;\n\n gl_Position = o_0.position_0;\n\n v_color = _S65.color_2;\n\n v_local = _S65.local_1;\n\n v_radii = _S65.radii_1;\n\n v_kind = _S65.kind_1;\n\n v_halfWidthPx = _S65.halfWidthPx_3;\n\n v_legSide = _S65.legSide_1;\n\n return;\n}\n\n"
|
|
4
|
+
export const GLSL_VERTEX = "#version 300 es\nprecision highp float;\nprecision highp int;\nprecision highp sampler2D;\n\n\n\nlayout(std140) uniform Uniforms\n{\n float canvasHeight_0;\n float devicePixelRatio_0;\n float rowHeight_0;\n float rowOffsetPx_0;\n int reverse_0;\n float stemPx_0;\n float dashPx_0;\n float gapPx_0;\n float footPx_0;\n uint curveSegments_0;\n float insetPx_0;\n float domainMin_0;\n float domainMax_0;\n int valueScaleType_0;\n float valueSymlogConstant_0;\n int rampMode_0;\n float rampMin_0;\n float rampMax_0;\n float rampMidNorm_0;\n int colorCutCount_0;\n vec4 colorCuts_0[2];\n vec4 colorBands_0[9];\n int valued_0;\n int linkShape_0;\n int sizeMode_0;\n float sizeConstantPx_0;\n float sizeDomainMin_0;\n float sizeDomainMax_0;\n int sizeScaleType_0;\n float sizeRangeMin_0;\n float sizeRangeMax_0;\n float canvasWidth_0;\n uint regionCount_0;\n float zero_0;\n vec4 ownEntry_0;\n vec4 ownSpan_0;\n vec4 regionTable_0[256];\n vec4 regionSpan_0[128];\n int rowTableKeys_0;\n}u_0;\n\nuniform sampler2D u_colorRamp;\n\n\nuniform sampler2D u_rowTable;\n\n\nvec4 unpackRGBA_0(uint c_0)\n{\n\n return vec4(float((c_0 >> 0U) & 255U), float((c_0 >> 8U) & 255U), float((c_0 >> 16U) & 255U), float((c_0 >> 24U) & 255U)) / 255.0;\n}\n\n\nfloat rampMidT_0(float t_0, float mid_0)\n{\n\n float _S1 = max(mid_0, 1.0 - mid_0);\n return clamp((t_0 + (_S1 - mid_0)) / (2.0 * _S1), 0.0, 1.0);\n}\n\n\nfloat colorCutAt_0(int i_0, vec4 cutsLo_0, vec4 cutsHi_0)\n{\n\n float _S2;\n if(i_0 < 4)\n {\n\n _S2 = cutsLo_0[i_0];\n\n }\n else\n {\n\n _S2 = cutsHi_0[i_0 - 4];\n\n }\n\n return _S2;\n}\n\n\nint thresholdBand_0(float value_0, int cutCount_0, vec4 cutsLo_1, vec4 cutsHi_1)\n{\n\n int band_0 = 0;\n\n int i_1 = 0;\n\n for(;;)\n {\n\n if(i_1 < cutCount_0)\n {\n }\n else\n {\n\n break;\n }\n\n if(value_0 >= (colorCutAt_0(i_1, cutsLo_1, cutsHi_1)))\n {\n\n band_0 = i_1 + 1;\n\n }\n\n i_1 = i_1 + 1;\n\n }\n\n return band_0;\n}\n\n\nfloat log1pf_0(float x_0)\n{\n\n float u_1 = 1.0 + x_0;\n\n float _S3;\n if(u_1 == 1.0)\n {\n\n _S3 = x_0;\n\n }\n else\n {\n\n _S3 = log(u_1) * (x_0 / (u_1 - 1.0));\n\n }\n\n return _S3;\n}\n\nfloat symlogTransform_0(float x_1, float c_1)\n{\n\n return float((int(sign((x_1))))) * log1pf_0(abs(x_1 / c_1));\n}\n\n\nfloat normalizeScoreUnclamped_0(float score_0, float domainMin_1, float domainMax_1, int scaleType_0, float symlogConstant_0)\n{\n\n float tMax_0;\n\n float tMin_0;\n\n float t_1;\n\n\n\n if(scaleType_0 == 2)\n {\n\n float _S4 = symlogTransform_0(score_0, symlogConstant_0);\n float _S5 = symlogTransform_0(domainMin_1, symlogConstant_0);\n\n tMax_0 = symlogTransform_0(domainMax_1, symlogConstant_0);\n\n tMin_0 = _S5;\n\n t_1 = _S4;\n\n }\n else\n {\n\n if(scaleType_0 == 1)\n {\n if(domainMin_1 > 0.0)\n {\n\n tMax_0 = domainMin_1;\n\n }\n else\n {\n\n tMax_0 = 1.0;\n\n }\n float _S6 = log2(max(score_0, tMax_0));\n float _S7 = log2(tMax_0);\n\n tMax_0 = log2(max(domainMax_1, tMax_0));\n\n tMin_0 = _S7;\n\n t_1 = _S6;\n\n }\n else\n {\n\n tMax_0 = domainMax_1;\n\n tMin_0 = domainMin_1;\n\n t_1 = score_0;\n\n }\n\n }\n\n float tRange_0 = tMax_0 - tMin_0;\n if(tRange_0 <= 0.0)\n {\n\n if(t_1 > tMin_0)\n {\n\n tMax_0 = 1.0;\n\n }\n else\n {\n\n tMax_0 = 0.0;\n\n }\n\n return tMax_0;\n }\n return (t_1 - tMin_0) / tRange_0;\n}\n\nfloat normalizeScore_0(float score_1, float domainMin_2, float domainMax_2, int scaleType_1, float symlogConstant_1)\n{\n\n return clamp(normalizeScoreUnclamped_0(score_1, domainMin_2, domainMax_2, scaleType_1, symlogConstant_1), 0.0, 1.0);\n}\n\n\nuint rowTableWidth_0(uint keys_0)\n{\n\n return max(min(keys_0, 2048U), 1U);\n}\n\nuint rowTablePlaneHeight_0(uint keys_1)\n{\n\n uint w_0 = rowTableWidth_0(keys_1);\n uint _S8 = (keys_1 + w_0 - 1U) / w_0;\n\n return max(_S8, 1U);\n}\n\nuint rowTableTexelX_0(uint key_0, uint keys_2)\n{\n\n uint _S9 = key_0 % rowTableWidth_0(keys_2);\n\n return _S9;\n}\n\n\nuint rowTableTexelY_0(uint key_1, uint keys_3)\n{\n\n uint _S10 = key_1 / rowTableWidth_0(keys_3);\n\n return _S10;\n}\n\n\nuint byteOf_0(float channel_0)\n{\n\n return uint(channel_0 * 255.0 + 0.5);\n}\n\n\nfloat linkStrokeWidthPx_0(float raw_0, int sizeMode_1, float constantPx_0, float domainMin_3, float domainMax_3, int scaleType_2, float rangeMin_0, float rangeMax_0, float dpr_0)\n{\n\n float w_1;\n\n if(sizeMode_1 == 1)\n {\n if(raw_0 > -1.00000001504746622e+29)\n {\n\n w_1 = rangeMin_0 + normalizeScore_0(raw_0, domainMin_3, domainMax_3, scaleType_2, 1.0) * (rangeMax_0 - rangeMin_0);\n\n }\n else\n {\n\n w_1 = rangeMin_0;\n\n }\n\n }\n else\n {\n\n w_1 = constantPx_0;\n\n }\n\n return max(w_1, 1.5 / dpr_0);\n}\n\n\nfloat aaPx_0(float dpr_1)\n{\n\n return 1.0 / max(dpr_1, 1.0);\n}\n\n\nfloat aaHalfPx_0(float dpr_2)\n{\n\n return 0.5 * aaPx_0(dpr_2);\n}\n\n\nfloat rowBandTopPx_0(float rowOffsetPx_1, float rowHeight_1, uint slot_0)\n{\n\n return rowOffsetPx_1 + rowHeight_1 * float(slot_0);\n}\n\n\nfloat linkBaseYPx_0(float rowOffsetPx_2, float rowHeight_2, uint row_0, int reverse_1)\n{\n\n float _S11 = rowBandTopPx_0(rowOffsetPx_2, rowHeight_2, row_0);\n\n float _S12;\n\n if(reverse_1 != 0)\n {\n\n _S12 = 0.0;\n\n }\n else\n {\n\n _S12 = rowHeight_2;\n\n }\n\n return _S11 + _S12;\n}\n\n\nvec2 hpSplitUint_0(uint value_1)\n{\n\n uint lo_0 = value_1 & 4095U;\n\n return vec2(float(value_1 - lo_0), float(lo_0));\n}\n\n\nfloat hpViewportOffsetBp_0(vec2 splitPos_0, vec3 bpRange_0, float hpZero_0)\n{\n\n float floorBp_0 = -3.00000000549775576e+38 + hpZero_0;\n\n\n return max(bpRange_0.x - splitPos_0.x, floorBp_0) + max(bpRange_0.y - splitPos_0.y, floorBp_0);\n}\n\n\nfloat viewRegionPx_0(uint bp_0, vec4 r_0, float hpZero_1)\n{\n\n return r_0.x - hpViewportOffsetBp_0(hpSplitUint_0(bp_0), vec3(r_0.y, r_0.z, 0.0), hpZero_1) * r_0.w;\n}\n\n\nfloat valueToYPxScaled_0(float value_2, float domainMin_4, float domainMax_4, float h_0, int scaleType_3, float symlogConstant_2)\n{\n\n return (1.0 - normalizeScore_0(value_2, domainMin_4, domainMax_4, scaleType_3, symlogConstant_2)) * h_0;\n}\n\n\nfloat insetValueYPx_0(float value_3, float domainMin_5, float domainMax_5, float h_1, int scaleType_4, float insetPx_1, float symlogConstant_3)\n{\n\n float _S13 = min(insetPx_1, h_1 * 0.5);\n return _S13 + valueToYPxScaled_0(value_3, domainMin_5, domainMax_5, h_1 - 2.0 * _S13, scaleType_4, symlogConstant_3);\n}\n\n\nfloat linkValuePx_0(float value_4, float domainMin_6, float domainMax_6, float h_2, int scaleType_5, float insetPx_2, float symlogConstant_4)\n{\n\n return h_2 - insetValueYPx_0(value_4, domainMin_6, domainMax_6, h_2, scaleType_5, insetPx_2, symlogConstant_4);\n}\n\n\n\n\nfloat linkApexPx_0(float halfWidthPx_0, float reachPx_0, float strokeHalfPx_0, int linkShape_1, int valued_1, float valuePx_0)\n{\n\n if(valued_1 != 0)\n {\n\n return valuePx_0;\n }\n\n if(linkShape_1 == 2)\n {\n\n return 0.0;\n }\n\n if(linkShape_1 == 1)\n {\n\n return halfWidthPx_0;\n }\n\n return min(halfWidthPx_0, max(reachPx_0 - strokeHalfPx_0, 0.0));\n}\n\n\nint linkApexHeld_0(int valued_2, float value_5, float domainMax_7)\n{\n\n bool _S14;\n if(valued_2 != 0)\n {\n\n _S14 = value_5 < domainMax_7;\n\n }\n else\n {\n\n _S14 = false;\n\n }\n\n int _S15;\n\n if(_S14)\n {\n\n _S15 = 1;\n\n }\n else\n {\n\n _S15 = 0;\n\n }\n\n return _S15;\n}\n\n\nbool linkIsFar_0(float halfWidthPx_1, float screenWidthPx_0)\n{\n\n return (2.0 * halfWidthPx_1) > (3.0 * screenWidthPx_0);\n}\n\n\nvec2 linkRadiiPx_0(float halfWidthPx_2, float apexPx_0, float screenWidthPx_1, int held_0)\n{\n\n bool _S16;\n\n if(linkIsFar_0(halfWidthPx_2, screenWidthPx_1))\n {\n\n if(held_0 == 0)\n {\n\n _S16 = true;\n\n }\n else\n {\n\n _S16 = apexPx_0 >= (0.25 * halfWidthPx_2);\n\n }\n\n }\n else\n {\n\n _S16 = false;\n\n }\n\n if(_S16)\n {\n return vec2(halfWidthPx_2, halfWidthPx_2);\n }\n return vec2(halfWidthPx_2, apexPx_0);\n}\n\n\nfloat farDomeParam_0(float dPx_0, float rxPx_0)\n{\n\n return sqrt(clamp(dPx_0 / (2.0 * max(rxPx_0, 9.99999997475242708e-07)), 0.0, 0.8399999737739563));\n}\n\n\nvec2 farDomeHullPoint_0(float u_2, float stepU_0, float rxPx_1, float ryPx_0, float padPx_0)\n{\n\n float _S17 = max(ryPx_0, 9.99999997475242708e-07);\n float _S18 = max(u_2, 0.5 * stepU_0);\n float nx_0 = - _S17 * (1.0 - 2.0 * _S18 * _S18);\n float _S19 = 2.0 * rxPx_1;\n\n float ny_0 = _S19 * _S18 * sqrt(1.0 - _S18 * _S18);\n float _S20 = max(nx_0 * nx_0 + ny_0 * ny_0, 9.99999968265522539e-21);\n float reach_0 = padPx_0 + float((int(sign((padPx_0))))) * 0.5 * rxPx_1 * stepU_0 * stepU_0;\n float _S21 = sqrt(_S20);\n\n float along_0 = reach_0 / _S21;\n float d_0 = _S19 * u_2 * u_2;\n float _S22 = u_2 * u_2;\n\n float h_3 = 2.0 * _S17 * u_2 * sqrt(1.0 - _S22);\n\n bool folded_0;\n\n if(padPx_0 < 0.0)\n {\n\n folded_0 = _S22 < 0.5;\n\n }\n else\n {\n\n folded_0 = false;\n\n }\n if(folded_0)\n {\n\n folded_0 = (_S20 * _S21) < (-2.0 * reach_0 * rxPx_1 * _S17);\n\n }\n else\n {\n\n folded_0 = false;\n\n }\n\n float _S23;\n if(folded_0)\n {\n\n if(u_2 > 0.0)\n {\n\n _S23 = d_0 - reach_0;\n\n }\n else\n {\n\n _S23 = d_0;\n\n }\n\n }\n else\n {\n\n _S23 = d_0 + nx_0 * along_0;\n\n }\n\n float _S24;\n if(folded_0)\n {\n\n _S24 = h_3 + reach_0;\n\n }\n else\n {\n\n _S24 = h_3 + ny_0 * along_0;\n\n }\n\n return vec2(_S23, _S24);\n}\n\n\nfloat legSweepAngle_0(float radiusPx_0, float yReachPx_0)\n{\n\n return asin(clamp(yReachPx_0 / max(radiusPx_0, 9.99999997475242708e-07), 0.0, 1.0));\n}\n\n\nvec2 wideCircleLeg_0(uint seg_0, uint segments_0, float legSweep_0)\n{\n\n uint half_0 = segments_0 / 2U;\n if(seg_0 <= half_0)\n {\n\n return vec2(1.0, float(seg_0) / float(half_0) * legSweep_0);\n }\n return vec2(-1.0, float(segments_0 - seg_0) / float(segments_0 - half_0 - 1U) * legSweep_0);\n}\n\n\n\n\nfloat wideCircleLegStep_0(uint seg_1, uint segments_1, float legSweep_1)\n{\n\n uint half_1 = segments_1 / 2U;\n\n uint _S25;\n if(seg_1 <= half_1)\n {\n\n _S25 = half_1;\n\n }\n else\n {\n\n _S25 = segments_1 - half_1 - 1U;\n\n }\n\n return legSweep_1 / float(_S25);\n}\n\n\nvec2 wideCircleHullPoint_0(float sinB_0, float sinHalfB_0, float cosHalf_0, float radiusPx_1, float padPx_1)\n{\n\n float sec_0;\n if(padPx_1 > 0.0)\n {\n\n sec_0 = 1.0 / max(cosHalf_0, 9.99999997475242708e-07);\n\n }\n else\n {\n\n sec_0 = 1.0;\n\n }\n float grow_0 = radiusPx_1 * (sec_0 - 1.0) + sec_0 * padPx_1;\n float sh2_0 = sinHalfB_0 * sinHalfB_0;\n return vec2(grow_0 * (1.0 - 2.0 * sh2_0) - 2.0 * radiusPx_1 * sh2_0, (radiusPx_1 + grow_0) * sinB_0);\n}\n\n\nvec2 ellipseHullPoint_0(float cosA_0, float sinA_0, float cosHalf_1, float sinHalf_0, float rx_0, float ry_0, float padPx_2)\n{\n float px_0 = cosA_0 * rx_0;\n float py_0 = sinA_0 * ry_0;\n if(padPx_2 <= 0.0)\n {\n\n float d_1 = - padPx_2;\n float gx_0 = ry_0 * cosA_0;\n float gy_0 = rx_0 * sinA_0;\n float glen_0 = sqrt(gx_0 * gx_0 + gy_0 * gy_0);\n bool acrossX_0 = (ry_0 * glen_0) < (d_1 * rx_0);\n bool acrossY_0 = (rx_0 * glen_0) < (d_1 * ry_0);\n\n bool _S26;\n if(acrossX_0)\n {\n\n _S26 = acrossY_0;\n\n }\n else\n {\n\n _S26 = false;\n\n }\n\n if(_S26)\n {\n\n return vec2(0.0, 0.0);\n }\n\n if(acrossX_0)\n {\n\n float _S27 = ry_0 * ry_0;\n return vec2(float((int(sign((cosA_0))))) * sqrt(max(_S27 - d_1 * d_1, 0.0) * max(rx_0 * rx_0 - _S27, 0.0)) / max(ry_0, 9.99999997475242708e-07), 0.0);\n }\n if(acrossY_0)\n {\n\n float _S28 = rx_0 * rx_0;\n return vec2(0.0, float((int(sign((sinA_0))))) * sqrt(max(_S28 - d_1 * d_1, 0.0) * max(ry_0 * ry_0 - _S28, 0.0)) / max(rx_0, 9.99999997475242708e-07));\n }\n float k_0 = d_1 / max(glen_0, 9.99999997475242708e-07);\n return vec2(px_0 - gx_0 * k_0, py_0 - gy_0 * k_0);\n }\n float _S29 = cosA_0 * cosHalf_1;\n\n float _S30 = sinA_0 * sinHalf_0;\n\n float ax_0 = ry_0 * (_S29 + _S30);\n float _S31 = sinA_0 * cosHalf_1;\n\n float _S32 = cosA_0 * sinHalf_0;\n\n float ay_0 = rx_0 * (_S31 - _S32);\n float bx_0 = ry_0 * (_S29 - _S30);\n float by_0 = rx_0 * (_S31 + _S32);\n float _S33 = max(sqrt(ax_0 * ax_0 + ay_0 * ay_0), 9.99999968265522539e-21);\n float _S34 = max(sqrt(bx_0 * bx_0 + by_0 * by_0), 9.99999968265522539e-21);\n float nx_1 = ax_0 / _S33 + bx_0 / _S34;\n float ny_1 = ay_0 / _S33 + by_0 / _S34;\n float m_0 = 2.0 * padPx_2 / max(nx_1 * nx_1 + ny_1 * ny_1, 0.00019999999494758);\n return vec2(px_0 / cosHalf_1 + nx_1 * m_0, py_0 / cosHalf_1 + ny_1 * m_0);\n}\n\n\nstruct LinkVertex_0\n{\n vec2 screen_0;\n vec2 local_0;\n vec2 radii_0;\n float kind_0;\n float legSide_0;\n};\n\n\nstruct LinkInstance_0\n{\n uint x_2;\n uint x2_0;\n uint x2Region_0;\n float y_0;\n float size_0;\n uint color_0;\n uint row_1;\n uint feet_0;\n};\n\n\nstruct LinkEnv_0\n{\n float strokeHalf_0;\n float hw_0;\n float baseY_0;\n float ySign_0;\n float reach_1;\n float xPx_0;\n float x2Px_0;\n bool placed_0;\n};\n\n\nLinkVertex_0 curveVertex_0(LinkInstance_0 inst_0, LinkEnv_0 e_0, uint seg_2, float side_0)\n{\n\n float _S35 = float(seg_2);\n\n float t_2 = _S35 / float(u_0.curveSegments_0);\n\n float pad_0 = side_0 * e_0.hw_0;\n\n\n LinkVertex_0 v_0;\n v_0.legSide_0 = 1.0;\n\n float legDir_0;\n\n vec2 origin_0;\n if(!e_0.placed_0)\n {\n\n v_0.kind_0 = 2.0;\n v_0.radii_0 = vec2(0.0, u_0.stemPx_0);\n\n\n v_0.local_0 = vec2(pad_0, - t_2 * (u_0.stemPx_0 + e_0.hw_0));\n\n origin_0 = vec2(e_0.xPx_0, e_0.baseY_0);\n\n legDir_0 = 1.0;\n\n }\n else\n {\n\n float pairHalf_0 = abs(e_0.x2Px_0 - e_0.xPx_0) * 0.5;\n\n\n float apex_0 = linkApexPx_0(pairHalf_0, e_0.reach_1, e_0.strokeHalf_0, u_0.linkShape_0, u_0.valued_0, linkValuePx_0(inst_0.y_0, 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 v_0.radii_0 = linkRadiiPx_0(pairHalf_0, apex_0, u_0.canvasWidth_0, linkApexHeld_0(u_0.valued_0, inst_0.y_0, u_0.domainMax_0));\n\n float _S36 = min(e_0.xPx_0, e_0.x2Px_0);\n\n float _S37 = max(e_0.xPx_0, e_0.x2Px_0);\n if((u_0.linkShape_0) == 2)\n {\n\n v_0.kind_0 = 3.0;\n float _S38 = max(2.0 * pairHalf_0, 2.5);\n v_0.radii_0 = vec2(_S38, 0.0);\n v_0.local_0 = vec2(t_2 * _S38, pad_0);\n\n origin_0 = vec2((e_0.xPx_0 + e_0.x2Px_0) * 0.5 - _S38 * 0.5, e_0.baseY_0 - apex_0 * e_0.ySign_0);\n\n legDir_0 = 1.0;\n\n }\n else\n {\n\n bool _S39;\n\n if(linkIsFar_0(pairHalf_0, u_0.canvasWidth_0))\n {\n\n _S39 = (v_0.radii_0.y) < (v_0.radii_0.x);\n\n }\n else\n {\n\n _S39 = false;\n\n }\n\n if(_S39)\n {\n\n v_0.kind_0 = 1.0;\n float rx_1 = v_0.radii_0.x;\n bool fromRight_0 = (u_0.canvasWidth_0 * 0.5 - _S36) > rx_1;\n if(fromRight_0)\n {\n\n legDir_0 = _S37;\n\n }\n else\n {\n\n legDir_0 = _S36;\n\n }\n float margin_0 = e_0.hw_0 + 2.0;\n\n float nearD_0;\n if(fromRight_0)\n {\n\n nearD_0 = legDir_0 - u_0.canvasWidth_0 - margin_0;\n\n }\n else\n {\n\n nearD_0 = - margin_0 - legDir_0;\n\n }\n\n float farD_0;\n if(fromRight_0)\n {\n\n farD_0 = legDir_0 + margin_0;\n\n }\n else\n {\n\n farD_0 = u_0.canvasWidth_0 + margin_0 - legDir_0;\n\n }\n float u0_0 = farDomeParam_0(nearD_0, rx_1);\n float step_0 = (max(farDomeParam_0(farD_0, rx_1), u0_0) - u0_0) / float(u_0.curveSegments_0);\n v_0.local_0 = - farDomeHullPoint_0(u0_0 + _S35 * step_0, step_0, rx_1, v_0.radii_0.y, pad_0);\n vec2 _S40 = vec2(legDir_0, e_0.baseY_0);\n if(fromRight_0)\n {\n\n legDir_0 = 1.0;\n\n }\n else\n {\n\n legDir_0 = -1.0;\n\n }\n\n origin_0 = _S40;\n\n }\n else\n {\n\n if(linkIsFar_0(pairHalf_0, u_0.canvasWidth_0))\n {\n\n v_0.kind_0 = 1.0;\n float legSweep_2 = legSweepAngle_0(v_0.radii_0.x, e_0.reach_1 + e_0.hw_0);\n\n\n vec2 leg_0 = wideCircleLeg_0(seg_2, u_0.curveSegments_0, legSweep_2);\n float b_0 = leg_0.y;\n\n\n vec2 _S41 = wideCircleHullPoint_0(sin(b_0), sin(b_0 * 0.5), cos(0.5 * wideCircleLegStep_0(seg_2, u_0.curveSegments_0, legSweep_2)), v_0.radii_0.x, pad_0);\n\n v_0.local_0 = _S41;\n\n v_0.local_0[1] = - _S41.y;\n float _S42 = leg_0.x;\n\n if(_S42 > 0.0)\n {\n\n legDir_0 = _S37;\n\n }\n else\n {\n\n legDir_0 = _S36;\n\n }\n\n vec2 _S43 = vec2(legDir_0, e_0.baseY_0);\n\n v_0.legSide_0 = _S42;\n\n origin_0 = _S43;\n\n legDir_0 = _S42;\n\n }\n else\n {\n\n v_0.kind_0 = 0.0;\n float a_0 = t_2 * 3.14159274101257324;\n float halfStep_0 = 3.14159274101257324 / (2.0 * float(u_0.curveSegments_0));\n vec2 _S44 = ellipseHullPoint_0(cos(a_0), sin(a_0), cos(halfStep_0), sin(halfStep_0), v_0.radii_0.x, v_0.radii_0.y, pad_0);\n\n v_0.local_0 = _S44;\n\n v_0.local_0[1] = - _S44.y;\n\n origin_0 = vec2((e_0.xPx_0 + e_0.x2Px_0) * 0.5, e_0.baseY_0);\n\n legDir_0 = 1.0;\n\n }\n\n }\n\n }\n\n }\n\n v_0.screen_0 = origin_0 + vec2(legDir_0 * v_0.local_0.x, v_0.local_0.y * e_0.ySign_0);\n return v_0;\n}\n\n\nvec2 regionSpanPx_0(uint region_0)\n{\n\n vec4 s_0 = u_0.regionSpan_0[region_0 / 2U];\n\n vec2 _S45;\n if((region_0 % 2U) == 0U)\n {\n\n _S45 = s_0.xy;\n\n }\n else\n {\n\n _S45 = s_0.zw;\n\n }\n\n return _S45;\n}\n\n\nfloat linkFootDir_0(uint feet_1, uint shift_0)\n{\n\n uint d_2 = (feet_1 >> shift_0) & 3U;\n\n float _S46;\n if(d_2 == 1U)\n {\n\n _S46 = 1.0;\n\n }\n else\n {\n\n if(d_2 == 2U)\n {\n\n _S46 = -1.0;\n\n }\n else\n {\n\n _S46 = 0.0;\n\n }\n\n }\n\n return _S46;\n}\n\n\nfloat linkFootLenPx_0(float x_3, float dir_0, float leftPx_0, float rightPx_0, float footPx_1)\n{\n\n float _S47;\n if(dir_0 > 0.0)\n {\n\n _S47 = rightPx_0 - x_3;\n\n }\n else\n {\n\n _S47 = x_3 - leftPx_0;\n\n }\n\n return max(0.0, min(footPx_1, _S47));\n}\n\n\nLinkVertex_0 footCorner_0(LinkInstance_0 inst_1, LinkEnv_0 e_1, uint f_0, uint c_2, out bool present_0)\n{\n\n bool _S48 = f_0 == 0U;\n\n float x_4;\n\n if(_S48)\n {\n\n x_4 = e_1.xPx_0;\n\n }\n else\n {\n\n x_4 = e_1.x2Px_0;\n\n }\n uint _S49 = min(inst_1.x2Region_0, 255U);\n\n vec4 entry_0;\n if(_S48)\n {\n\n entry_0 = u_0.ownEntry_0;\n\n }\n else\n {\n\n entry_0 = u_0.regionTable_0[_S49];\n\n }\n\n vec2 span_0;\n if(_S48)\n {\n\n span_0 = u_0.ownSpan_0.xy;\n\n }\n else\n {\n\n span_0 = regionSpanPx_0(_S49);\n\n }\n float dir_1 = linkFootDir_0(inst_1.feet_0, f_0 * 2U) * float((int(sign((entry_0.w)))));\n float len_0 = linkFootLenPx_0(x_4, dir_1, span_0.x, span_0.y, u_0.footPx_0);\n\n bool _S50;\n if(dir_1 != 0.0)\n {\n\n _S50 = len_0 > 0.0;\n\n }\n else\n {\n\n _S50 = false;\n\n }\n\n if(_S50)\n {\n\n if(_S48)\n {\n\n _S50 = true;\n\n }\n else\n {\n\n _S50 = e_1.placed_0;\n\n }\n\n }\n else\n {\n\n _S50 = false;\n\n }\n\n present_0 = _S50;\n\n float along_1;\n if(c_2 >= 2U)\n {\n\n along_1 = len_0;\n\n }\n else\n {\n\n along_1 = 0.0;\n\n }\n\n float across_0;\n if((c_2 % 2U) == 0U)\n {\n\n across_0 = - e_1.hw_0;\n\n }\n else\n {\n\n across_0 = e_1.hw_0;\n\n }\n LinkVertex_0 v_1;\n v_1.kind_0 = 4.0;\n v_1.radii_0 = vec2(len_0, 0.0);\n v_1.legSide_0 = 1.0;\n v_1.local_0 = vec2(along_1, across_0);\n v_1.screen_0 = vec2(x_4 + dir_1 * along_1, e_1.baseY_0 - e_1.ySign_0 * e_1.strokeHalf_0 + across_0);\n return v_1;\n}\n\n\n\nLinkVertex_0 footBlockStart_0(LinkInstance_0 inst_2, LinkEnv_0 e_2, uint f_1)\n{\n\n LinkVertex_0 tail_0 = curveVertex_0(inst_2, e_2, u_0.curveSegments_0, 1.0);\n if(f_1 == 0U)\n {\n\n return tail_0;\n }\n\n bool first_0;\n LinkVertex_0 last_0 = footCorner_0(inst_2, e_2, 0U, 3U, first_0);\n\n LinkVertex_0 _S51;\n if(first_0)\n {\n\n _S51 = last_0;\n\n }\n else\n {\n\n _S51 = tail_0;\n\n }\n\n return _S51;\n}\n\n\n\nLinkVertex_0 footVertex_0(LinkInstance_0 inst_3, LinkEnv_0 e_3, uint f_2, uint k_1)\n{\n\n LinkVertex_0 start_0 = footBlockStart_0(inst_3, e_3, f_2);\n if(k_1 == 0U)\n {\n\n return start_0;\n }\n\n bool present_1;\n\n uint _S52;\n if(k_1 <= 2U)\n {\n\n _S52 = 0U;\n\n }\n else\n {\n\n _S52 = k_1 - 2U;\n\n }\n\n LinkVertex_0 v_2 = footCorner_0(inst_3, e_3, f_2, _S52, present_1);\n\n LinkVertex_0 _S53;\n if(present_1)\n {\n\n _S53 = v_2;\n\n }\n else\n {\n\n _S53 = start_0;\n\n }\n\n return _S53;\n}\n\n\nfloat yPxToClipY_0(float yPx_0, float canvasHeight_1)\n{\n\n return 1.0 - yPx_0 / canvasHeight_1 * 2.0;\n}\n\n\nout vec4 v_color;\n\n\nout vec2 v_local;\n\n\nflat out vec2 v_radii;\n\n\nflat out float v_kind;\n\n\nflat out float v_halfWidthPx;\n\n\nout float v_legSide;\n\n\nlayout(location = 0)\nin uint a_x;\n\n\nlayout(location = 1)\nin uint a_x2;\n\n\nlayout(location = 2)\nin uint a_x2Region;\n\n\nlayout(location = 3)\nin float a_y;\n\n\nlayout(location = 4)\nin float a_size;\n\n\nlayout(location = 5)\nin uint a_color;\n\n\nlayout(location = 6)\nin uint a_row;\n\n\nlayout(location = 7)\nin uint a_feet;\n\n\nvec4 rampColor_0(float _S54)\n{\n\n return (textureLod((u_colorRamp), (vec2((clamp(_S54, 0.0, 1.0) * 255.0 + 0.5) / 256.0, 0.5)), (0.0)));\n}\n\n\nvec4 markScaleColor_0(uint _S55, int _S56, float _S57, float _S58, float _S59, int _S60, vec4 _S61, vec4 _S62)\n{\n\n if(_S56 == 0)\n {\n\n return unpackRGBA_0(_S55);\n }\n if(_S55 == 2143289345U)\n {\n\n return unpackRGBA_0(4289703855U);\n }\n\n int scaleType_6;\n\n if((_S55 & 2139095040U) == 2139095040U)\n {\n\n if((_S55 & 8388607U) != 0U)\n {\n\n return unpackRGBA_0(4286611584U);\n }\n\n bool negative_0 = (_S55 & 2147483648U) != 0U;\n if(_S56 == 3)\n {\n\n if(negative_0)\n {\n\n scaleType_6 = 0;\n\n }\n else\n {\n\n scaleType_6 = _S60;\n\n }\n\n return u_0.colorBands_0[scaleType_6];\n }\n\n float _S63;\n\n if(negative_0)\n {\n\n _S63 = 0.0;\n\n }\n else\n {\n\n _S63 = 1.0;\n\n }\n\n return rampColor_0(rampMidT_0(_S63, _S59));\n }\n float value_6 = uintBitsToFloat(_S55);\n if(_S56 == 3)\n {\n\n return u_0.colorBands_0[thresholdBand_0(value_6, _S60, _S61, _S62)];\n }\n if(_S56 == 2)\n {\n\n scaleType_6 = 1;\n\n }\n else\n {\n\n scaleType_6 = 0;\n\n }\n return rampColor_0(rampMidT_0(normalizeScore_0(value_6, _S57, _S58, scaleType_6, 1.0), _S59));\n}\n\n\nstruct RowPlacement_0\n{\n bool hidden_0;\n uint slot_1;\n vec4 color_1;\n bool overridden_0;\n};\n\n\nRowPlacement_0 rowTableLookup_0(uint _S64, int _S65, vec4 _S66)\n{\n\n RowPlacement_0 p_0;\n p_0.hidden_0 = false;\n p_0.slot_1 = _S64;\n p_0.color_1 = _S66;\n p_0.overridden_0 = false;\n if(_S65 < 0)\n {\n\n return p_0;\n }\n uint n_0 = uint(_S65);\n if(_S64 >= n_0)\n {\n\n p_0.hidden_0 = true;\n return p_0;\n }\n uint h_4 = rowTablePlaneHeight_0(n_0);\n uint _S67 = rowTableTexelX_0(_S64, n_0);\n\n float u_3 = (float(_S67) + 0.5) / float(rowTableWidth_0(n_0));\n float rows_0 = float(2U * h_4);\n uint y_1 = rowTableTexelY_0(_S64, n_0);\n vec4 s_1 = (textureLod((u_rowTable), (vec2(u_3, (float(y_1) + 0.5) / rows_0)), (0.0)));\n if((s_1.w) < 0.5)\n {\n\n p_0.hidden_0 = true;\n return p_0;\n }\n p_0.slot_1 = ((byteOf_0(s_1.x)) | ((byteOf_0(s_1.y)) << 8)) | ((byteOf_0(s_1.z)) << 16);\n vec4 c_3 = (textureLod((u_rowTable), (vec2(u_3, (float(y_1 + h_4) + 0.5) / rows_0)), (0.0)));\n bool _S68 = (c_3.w) > 0.0;\n\n p_0.overridden_0 = _S68;\n\n vec4 _S69;\n if(_S68)\n {\n\n _S69 = c_3;\n\n }\n else\n {\n\n _S69 = _S66;\n\n }\n\n p_0.color_1 = _S69;\n return p_0;\n}\n\n\nstruct VsOut_0\n{\n vec4 position_0;\n vec4 color_2;\n vec2 local_1;\n vec2 radii_1;\n float kind_1;\n float halfWidthPx_3;\n float legSide_1;\n};\n\n\nvoid main()\n{\n\n RowPlacement_0 _S70 = rowTableLookup_0(a_row, u_0.rowTableKeys_0, markScaleColor_0(a_color, u_0.rampMode_0, u_0.rampMin_0, u_0.rampMax_0, u_0.rampMidNorm_0, u_0.colorCutCount_0, u_0.colorCuts_0[0], u_0.colorCuts_0[1]));\n\n\n LinkEnv_0 e_4;\n float _S71 = 0.5 * linkStrokeWidthPx_0(a_size, u_0.sizeMode_0, u_0.sizeConstantPx_0, u_0.sizeDomainMin_0, u_0.sizeDomainMax_0, u_0.sizeScaleType_0, u_0.sizeRangeMin_0, u_0.sizeRangeMax_0, u_0.devicePixelRatio_0);\n\n e_4.strokeHalf_0 = _S71;\n\n\n e_4.hw_0 = _S71 + aaHalfPx_0(u_0.devicePixelRatio_0);\n e_4.baseY_0 = linkBaseYPx_0(u_0.rowOffsetPx_0, u_0.rowHeight_0, _S70.slot_1, u_0.reverse_0);\n\n float _S72;\n if((u_0.reverse_0) != 0)\n {\n\n _S72 = -1.0;\n\n }\n else\n {\n\n _S72 = 1.0;\n\n }\n\n e_4.ySign_0 = _S72;\n e_4.reach_1 = max(u_0.rowHeight_0 - u_0.insetPx_0, 0.0);\n e_4.xPx_0 = viewRegionPx_0(a_x, u_0.ownEntry_0, u_0.zero_0);\n bool _S73 = a_x2Region < (u_0.regionCount_0);\n\n e_4.placed_0 = _S73;\n if(_S73)\n {\n\n _S72 = viewRegionPx_0(a_x2, u_0.regionTable_0[a_x2Region], u_0.zero_0);\n\n }\n else\n {\n\n _S72 = e_4.xPx_0;\n\n }\n\n e_4.x2Px_0 = _S72;\n\n uint curveVerts_0 = (u_0.curveSegments_0 + 1U) * 2U;\n\n LinkVertex_0 v_3;\n\n if(uint(gl_VertexID) < curveVerts_0)\n {\n\n LinkEnv_0 _S74 = e_4;\n\n uint _S75 = uint(gl_VertexID) / 2U;\n\n if((uint(gl_VertexID) % 2U) == 0U)\n {\n\n _S72 = -1.0;\n\n }\n else\n {\n\n _S72 = 1.0;\n\n }\n\n LinkInstance_0 _S76 = LinkInstance_0(a_x, a_x2, a_x2Region, a_y, a_size, a_color, a_row, a_feet);\n\n v_3 = curveVertex_0(_S76, _S74, _S75, _S72);\n\n }\n else\n {\n uint j_0 = uint(gl_VertexID) - curveVerts_0;\n\n LinkInstance_0 _S77 = LinkInstance_0(a_x, a_x2, a_x2Region, a_y, a_size, a_color, a_row, a_feet);\n\n v_3 = footVertex_0(_S77, e_4, j_0 / 6U, j_0 % 6U);\n\n }\n\n VsOut_0 o_0;\n\n bool _S78;\n if(a_x2Region == 4294967294U)\n {\n\n _S78 = true;\n\n }\n else\n {\n\n _S78 = _S70.hidden_0;\n\n }\n\n vec4 _S79;\n if(_S78)\n {\n\n _S79 = vec4(-2.0, -2.0, 0.0, 1.0);\n\n }\n else\n {\n\n _S79 = vec4(v_3.screen_0.x / u_0.canvasWidth_0 * 2.0 - 1.0, yPxToClipY_0(v_3.screen_0.y, u_0.canvasHeight_0), 0.0, 1.0);\n\n }\n\n o_0.position_0 = _S79;\n\n o_0.color_2 = _S70.color_1;\n o_0.local_1 = v_3.local_0;\n o_0.radii_1 = v_3.radii_0;\n o_0.kind_1 = v_3.kind_0;\n o_0.halfWidthPx_3 = e_4.strokeHalf_0;\n o_0.legSide_1 = v_3.legSide_0;\n VsOut_0 _S80 = o_0;\n\n gl_Position = o_0.position_0;\n\n v_color = _S80.color_2;\n\n v_local = _S80.local_1;\n\n v_radii = _S80.radii_1;\n\n v_kind = _S80.kind_1;\n\n v_halfWidthPx = _S80.halfWidthPx_3;\n\n v_legSide = _S80.legSide_1;\n\n return;\n}\n\n"
|
|
5
5
|
|
|
6
|
-
export const GLSL_FRAGMENT = "#version 300 es\nprecision highp float;\nprecision highp int;\nprecision highp sampler2D;\n\n\n\nlayout(std140) uniform Uniforms\n{\n float canvasHeight_0;\n float devicePixelRatio_0;\n float rowHeight_0;\n float rowOffsetPx_0;\n int reverse_0;\n float stemPx_0;\n float dashPx_0;\n float gapPx_0;\n float footPx_0;\n uint curveSegments_0;\n float insetPx_0;\n float domainMin_0;\n float domainMax_0;\n int valueScaleType_0;\n float valueSymlogConstant_0;\n int rampMode_0;\n float rampMin_0;\n float rampMax_0;\n float rampMidNorm_0;\n int colorCutCount_0;\n vec4 colorCuts_0[2];\n vec4 colorBands_0[9];\n int valued_0;\n int linkShape_0;\n int sizeMode_0;\n float sizeConstantPx_0;\n float sizeDomainMin_0;\n float sizeDomainMax_0;\n int sizeScaleType_0;\n float sizeRangeMin_0;\n float sizeRangeMax_0;\n float canvasWidth_0;\n uint regionCount_0;\n float zero_0;\n vec4 ownEntry_0;\n vec4 ownSpan_0;\n vec4 regionTable_0[256];\n vec4 regionSpan_0[128];\n int rowTableKeys_0;\n}u_0;\n\nfloat distToWideCirclePx_0(float x_0, float y_0, float r_0)\n{\n\n float rk_0 = 2.0 * x_0 + (x_0 * x_0 + y_0 * y_0) / r_0;\n return abs(rk_0 / (sqrt(max(1.0 + rk_0 / r_0, 0.0)) + 1.0));\n}\n\nfloat distToWideCircle_0(vec2 legLocal_0, float r_1)\n{\n\n return distToWideCirclePx_0(legLocal_0.x, legLocal_0.y, r_1);\n}\n\n\nfloat nearCircleDistancePx_0(float qx_0, float qy_0, float ax_0, float ay_0)\n{\n\n float kx_0 = qx_0 / ax_0;\n float ky_0 = qy_0 / ay_0;\n float k_0 = sqrt(kx_0 * kx_0 + ky_0 * ky_0);\n float gx_0 = qx_0 / (ax_0 * ax_0);\n float gy_0 = qy_0 / (ay_0 * ay_0);\n return abs(k_0 * (k_0 - 1.0) / max(sqrt(gx_0 * gx_0 + gy_0 * gy_0), 9.99999968265522539e-21));\n}\n\n\nfloat sdEllipse_0(vec2 p_0, vec2 radii_0)\n{\n\n vec2
|
|
6
|
+
export const GLSL_FRAGMENT = "#version 300 es\nprecision highp float;\nprecision highp int;\nprecision highp sampler2D;\n\n\n\nlayout(std140) uniform Uniforms\n{\n float canvasHeight_0;\n float devicePixelRatio_0;\n float rowHeight_0;\n float rowOffsetPx_0;\n int reverse_0;\n float stemPx_0;\n float dashPx_0;\n float gapPx_0;\n float footPx_0;\n uint curveSegments_0;\n float insetPx_0;\n float domainMin_0;\n float domainMax_0;\n int valueScaleType_0;\n float valueSymlogConstant_0;\n int rampMode_0;\n float rampMin_0;\n float rampMax_0;\n float rampMidNorm_0;\n int colorCutCount_0;\n vec4 colorCuts_0[2];\n vec4 colorBands_0[9];\n int valued_0;\n int linkShape_0;\n int sizeMode_0;\n float sizeConstantPx_0;\n float sizeDomainMin_0;\n float sizeDomainMax_0;\n int sizeScaleType_0;\n float sizeRangeMin_0;\n float sizeRangeMax_0;\n float canvasWidth_0;\n uint regionCount_0;\n float zero_0;\n vec4 ownEntry_0;\n vec4 ownSpan_0;\n vec4 regionTable_0[256];\n vec4 regionSpan_0[128];\n int rowTableKeys_0;\n}u_0;\n\nfloat farDomeDistSq_0(float u_1, float dPx_0, float hPx_0, float rx_0, float ry_0)\n{\n\n float ox_0 = 2.0 * rx_0 * u_1 * u_1 - dPx_0;\n float oy_0 = 2.0 * ry_0 * u_1 * sqrt(max(1.0 - u_1 * u_1, 0.0)) - hPx_0;\n return ox_0 * ox_0 + oy_0 * oy_0;\n}\n\n\n\n\nfloat farDomeStep_0(float u_2, float dPx_1, float hPx_1, float rx_1, float ry_1)\n{\n\n float w_0 = sqrt(max(1.0 - u_2 * u_2, 9.99999997475242708e-07));\n float ox_1 = 2.0 * rx_1 * u_2 * u_2 - dPx_1;\n float _S1 = 2.0 * ry_1;\n\n float _S2 = _S1 * u_2;\n\n float oy_1 = _S2 * w_0 - hPx_1;\n float _S3 = 4.0 * rx_1;\n\n float dx_0 = _S3 * u_2;\n float _S4 = 2.0 * u_2 * u_2;\n\n float dy_0 = _S1 * (1.0 - _S4) / w_0;\n\n float whole_0 = clamp(u_2 - (ox_1 * dx_0 + oy_1 * dy_0) / max(dx_0 * dx_0 + dy_0 * dy_0 + ox_1 * _S3 + oy_1 * (_S2 * (_S4 - 3.0) / (w_0 * w_0 * w_0)), 9.999999960041972e-13), 0.0, 0.99900001287460327);\n float half_0 = 0.5 * (u_2 + whole_0);\n float here_0 = ox_1 * ox_1 + oy_1 * oy_1;\n\n float _S5;\n\n if((farDomeDistSq_0(whole_0, dPx_1, hPx_1, rx_1, ry_1)) < here_0)\n {\n\n _S5 = whole_0;\n\n }\n else\n {\n\n if((farDomeDistSq_0(half_0, dPx_1, hPx_1, rx_1, ry_1)) < here_0)\n {\n\n _S5 = half_0;\n\n }\n else\n {\n\n _S5 = u_2;\n\n }\n\n }\n\n return _S5;\n}\n\n\nfloat farDomeDistancePx_0(float dPx_2, float hPx_2, float rxPx_0, float ryPx_0)\n{\n\n float _S6 = max(rxPx_0, 9.99999997475242708e-07);\n float _S7 = max(ryPx_0, 9.99999997475242708e-07);\n float q_0 = clamp(hPx_2 / _S7, 0.0, 1.0);\n float c_0 = sqrt(1.0 - q_0 * q_0);\n\n float uH_0;\n\n if(dPx_2 > _S6)\n {\n\n uH_0 = sqrt(0.5 * (1.0 + c_0));\n\n }\n else\n {\n\n uH_0 = q_0 / sqrt(2.0 * (1.0 + c_0));\n\n }\n float uD_0 = sqrt(clamp(dPx_2 / (2.0 * _S6), 0.0, 1.0));\n\n float u_3;\n\n if((farDomeDistSq_0(uH_0, dPx_2, hPx_2, _S6, _S7)) < (farDomeDistSq_0(uD_0, dPx_2, hPx_2, _S6, _S7)))\n {\n\n u_3 = uH_0;\n\n }\n else\n {\n\n u_3 = uD_0;\n\n }\n\n return sqrt(farDomeDistSq_0(farDomeStep_0(farDomeStep_0(farDomeStep_0(farDomeStep_0(u_3, dPx_2, hPx_2, _S6, _S7), dPx_2, hPx_2, _S6, _S7), dPx_2, hPx_2, _S6, _S7), dPx_2, hPx_2, _S6, _S7), dPx_2, hPx_2, _S6, _S7));\n}\n\n\nfloat distToWideCirclePx_0(float x_0, float y_0, float r_0)\n{\n\n float rk_0 = 2.0 * x_0 + (x_0 * x_0 + y_0 * y_0) / r_0;\n return abs(rk_0 / (sqrt(max(1.0 + rk_0 / r_0, 0.0)) + 1.0));\n}\n\nfloat distToWideCircle_0(vec2 legLocal_0, float r_1)\n{\n\n return distToWideCirclePx_0(legLocal_0.x, legLocal_0.y, r_1);\n}\n\n\nfloat nearCircleDistancePx_0(float qx_0, float qy_0, float ax_0, float ay_0)\n{\n\n float kx_0 = qx_0 / ax_0;\n float ky_0 = qy_0 / ay_0;\n float k_0 = sqrt(kx_0 * kx_0 + ky_0 * ky_0);\n float gx_0 = qx_0 / (ax_0 * ax_0);\n float gy_0 = qy_0 / (ay_0 * ay_0);\n return abs(k_0 * (k_0 - 1.0) / max(sqrt(gx_0 * gx_0 + gy_0 * gy_0), 9.99999968265522539e-21));\n}\n\n\nfloat sdEllipse_0(vec2 p_0, vec2 radii_0)\n{\n\n vec2 q_1 = abs(p_0);\n\n vec2 ab_0;\n\n vec2 q_2;\n\n if((q_1.x) > (q_1.y))\n {\n\n vec2 _S8 = q_1.yx;\n\n ab_0 = radii_0.yx;\n\n q_2 = _S8;\n\n }\n else\n {\n\n ab_0 = radii_0;\n\n q_2 = q_1;\n\n }\n\n if((dot(ab_0, ab_0)) <= 0.0)\n {\n\n return length(q_2);\n }\n\n float _S9 = ab_0.y;\n\n float _S10 = ab_0.x;\n\n float l_0 = _S9 * _S9 - _S10 * _S10;\n if((abs(l_0)) < (0.05000000074505806 * _S9 * _S9))\n {\n\n return nearCircleDistancePx_0(q_2.x, q_2.y, _S10, _S9);\n }\n float m_0 = _S10 * q_2.x / l_0;\n\n float m2_0 = m_0 * m_0;\n float n_0 = _S9 * q_2.y / l_0;\n\n float n2_0 = n_0 * n_0;\n float c_1 = (m2_0 + n2_0 - 1.0) / 3.0;\n float c3_0 = c_1 * c_1 * c_1;\n float _S11 = m2_0 * n2_0;\n\n float d_0 = c3_0 + _S11;\n float g_0 = m_0 + m_0 * n2_0;\n\n float co_0;\n\n if(d_0 < 0.0)\n {\n\n float h_0 = acos(clamp((c3_0 + _S11 * 2.0) / c3_0, -1.0, 1.0)) / 3.0;\n float s_0 = cos(h_0);\n float t_0 = sin(h_0) * sqrt(3.0);\n float _S12 = - c_1;\n\n float rx_2 = sqrt(max(_S12 * (s_0 + t_0 + 2.0) + m2_0, 0.0));\n float ry_2 = sqrt(max(_S12 * (s_0 - t_0 + 2.0) + m2_0, 0.0));\n\n co_0 = (ry_2 + float((int(sign((l_0))))) * rx_2 + abs(g_0) / max(rx_2 * ry_2, 9.99999968265522539e-21) - m_0) / 2.0;\n\n }\n else\n {\n\n float w_1 = c3_0 + _S11 * 2.0 + 2.0 * m_0 * n_0 * sqrt(d_0);\n float aw_0 = abs(w_1);\n float _S13 = float((int(sign((w_1)))));\n\n float s_1 = _S13 * pow(aw_0, 0.3333333432674408);\n if(aw_0 > 0.0)\n {\n\n co_0 = _S13 * pow(c3_0 * (c3_0 / aw_0), 0.3333333432674408);\n\n }\n else\n {\n\n co_0 = 0.0;\n\n }\n float rx_3 = - s_1 - co_0 - c_1 * 4.0 + 2.0 * m2_0;\n float ry_3 = (s_1 - co_0) * sqrt(3.0);\n float rm_0 = sqrt(rx_3 * rx_3 + ry_3 * ry_3);\n\n co_0 = (ry_3 / sqrt(max(rm_0 - rx_3, 9.99999968265522539e-21)) + 2.0 * g_0 / max(rm_0, 9.99999968265522539e-21) - m_0) / 2.0;\n\n }\n\n float co_1 = clamp(co_0, -1.0, 1.0);\n\n return length(ab_0 * vec2(co_1, sqrt(max(1.0 - co_1 * co_1, 0.0))) - q_2);\n}\n\n\nstruct VsOut_0\n{\n vec4 position_0;\n vec4 color_0;\n vec2 local_0;\n vec2 radii_1;\n float kind_0;\n float halfWidthPx_0;\n float legSide_0;\n};\n\n\nfloat linkDistance_0(VsOut_0 i_0)\n{\n\n if((i_0.kind_0) >= 2.5)\n {\n\n float _S14 = i_0.local_0.x;\n return length(vec2(_S14 - clamp(_S14, 0.0, i_0.radii_1.x), i_0.local_0.y));\n }\n if((i_0.kind_0) >= 1.5)\n {\n\n float _S15 = i_0.local_0.y;\n return length(vec2(i_0.local_0.x, _S15 - clamp(_S15, - i_0.radii_1.y, 0.0)));\n }\n if((i_0.kind_0) >= 0.5)\n {\n\n float _S16 = i_0.radii_1.y;\n\n float _S17 = i_0.radii_1.x;\n\n float _S18;\n if(_S16 < _S17)\n {\n\n _S18 = farDomeDistancePx_0(- i_0.local_0.x, - i_0.local_0.y, _S17, _S16);\n\n }\n else\n {\n\n _S18 = distToWideCircle_0(i_0.local_0, _S17);\n\n }\n\n return _S18;\n }\n\n\n return sdEllipse_0(i_0.local_0, i_0.radii_1);\n}\n\n\nfloat aaPx_0(float dpr_0)\n{\n\n return 1.0 / max(dpr_0, 1.0);\n}\n\n\nfloat aaRamp_0(float signedInk_0, float widthPx_0)\n{\n\n return clamp(signedInk_0 / widthPx_0 + 0.5, 0.0, 1.0);\n}\n\n\nfloat edgeCoverage_0(float signedInkCssPx_0, float dpr_1)\n{\n\n return aaRamp_0(signedInkCssPx_0, aaPx_0(dpr_1));\n}\n\n\nfloat linkDashAlong_0(VsOut_0 i_1)\n{\n\n if((i_1.kind_0) >= 3.5)\n {\n\n return -1.0;\n }\n\n if((i_1.kind_0) >= 2.5)\n {\n\n return i_1.local_0.x;\n }\n\n if((i_1.kind_0) >= 1.5)\n {\n\n return - i_1.local_0.y;\n }\n\n return -1.0;\n}\n\n\nfloat dashCoverageAt_0(float coord_0, float dashPx_1, float gapPx_1, float aaPx_1)\n{\n float period_0 = dashPx_1 + gapPx_1;\n float shifted_0 = coord_0 + gapPx_1 * 0.5;\n\n return aaRamp_0(dashPx_1 * 0.5 - abs(shifted_0 - period_0 * floor(shifted_0 / period_0) - period_0 * 0.5), aaPx_1);\n}\n\nfloat dashCoverage_0(float coord_1, float dashPx_2, float gapPx_2, float dpr_2)\n{\n\n return dashCoverageAt_0(coord_1, dashPx_2, gapPx_2, aaPx_0(dpr_2));\n}\n\n\nfloat linkDash_0(VsOut_0 i_2)\n{\n\n float along_0 = linkDashAlong_0(i_2);\n\n bool _S19;\n if((u_0.dashPx_0) > 0.0)\n {\n\n _S19 = along_0 >= 0.0;\n\n }\n else\n {\n\n _S19 = false;\n\n }\n\n float _S20;\n if(_S19)\n {\n\n _S20 = dashCoverage_0(along_0, u_0.dashPx_0, u_0.gapPx_0, u_0.devicePixelRatio_0);\n\n }\n else\n {\n\n _S20 = 1.0;\n\n }\n\n return _S20;\n}\n\n\nlayout(location = 0)\nout vec4 entryPointParam_fs_main_0;\n\n\nin vec4 v_color;\n\n\nin vec2 v_local;\n\n\nflat in vec2 v_radii;\n\n\nflat in float v_kind;\n\n\nflat in float v_halfWidthPx;\n\n\nin float v_legSide;\n\n\n\n\nvoid main()\n{\n\n if((abs(v_legSide)) < 0.99900001287460327)\n {\n\n discard;\n\n }\n\n VsOut_0 _S21 = VsOut_0(gl_FragCoord, v_color, v_local, v_radii, v_kind, v_halfWidthPx, v_legSide);\n\n VsOut_0 _S22 = VsOut_0(gl_FragCoord, v_color, v_local, v_radii, v_kind, v_halfWidthPx, v_legSide);\n\n entryPointParam_fs_main_0 = vec4(v_color.xyz, v_color.w * (edgeCoverage_0(v_halfWidthPx - linkDistance_0(_S21), u_0.devicePixelRatio_0) * linkDash_0(_S22)));\n\n return;\n}\n\n"
|
|
@@ -117,7 +117,7 @@ export function linkValuePx(value: number, domainMin: number, domainMax: number,
|
|
|
117
117
|
return (h - insetValueYPx(value, domainMin, domainMax, h, scaleType, insetPx, symlogConstant))
|
|
118
118
|
}
|
|
119
119
|
|
|
120
|
-
export function linkApexPx(halfWidthPx: number, reachPx: number, linkShape: number, valued: number, valuePx: number): number {
|
|
120
|
+
export function linkApexPx(halfWidthPx: number, reachPx: number, strokeHalfPx: number, linkShape: number, valued: number, valuePx: number): number {
|
|
121
121
|
if ((valued != 0)) {
|
|
122
122
|
return valuePx
|
|
123
123
|
}
|
|
@@ -127,15 +127,41 @@ export function linkApexPx(halfWidthPx: number, reachPx: number, linkShape: numb
|
|
|
127
127
|
if ((linkShape == 1)) {
|
|
128
128
|
return halfWidthPx
|
|
129
129
|
}
|
|
130
|
-
return _min(halfWidthPx, reachPx)
|
|
130
|
+
return _min(halfWidthPx, _max((reachPx - strokeHalfPx), 0.0))
|
|
131
131
|
}
|
|
132
132
|
|
|
133
|
-
function
|
|
133
|
+
export function linkApexHeld(valued: number, value: number, domainMax: number): number {
|
|
134
|
+
let _t0: boolean
|
|
135
|
+
if ((valued != 0)) {
|
|
136
|
+
_t0 = (value < domainMax)
|
|
137
|
+
} else {
|
|
138
|
+
_t0 = false
|
|
139
|
+
}
|
|
140
|
+
let _t1: number
|
|
141
|
+
if (_t0) {
|
|
142
|
+
_t1 = 1
|
|
143
|
+
} else {
|
|
144
|
+
_t1 = 0
|
|
145
|
+
}
|
|
146
|
+
return _t1
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export function linkIsFar(halfWidthPx: number, screenWidthPx: number): boolean {
|
|
134
150
|
return ((2.0 * halfWidthPx) > (3.0 * screenWidthPx))
|
|
135
151
|
}
|
|
136
152
|
|
|
137
|
-
export function linkRadiiPx(halfWidthPx: number, apexPx: number, screenWidthPx: number): [number, number] {
|
|
153
|
+
export function linkRadiiPx(halfWidthPx: number, apexPx: number, screenWidthPx: number, held: number): [number, number] {
|
|
154
|
+
let _t0: boolean
|
|
138
155
|
if (linkIsFar(halfWidthPx, screenWidthPx)) {
|
|
156
|
+
if ((held == 0)) {
|
|
157
|
+
_t0 = true
|
|
158
|
+
} else {
|
|
159
|
+
_t0 = (apexPx >= (0.25 * halfWidthPx))
|
|
160
|
+
}
|
|
161
|
+
} else {
|
|
162
|
+
_t0 = false
|
|
163
|
+
}
|
|
164
|
+
if (_t0) {
|
|
139
165
|
return [halfWidthPx, halfWidthPx]
|
|
140
166
|
}
|
|
141
167
|
return [halfWidthPx, apexPx]
|
|
@@ -11,7 +11,10 @@
|
|
|
11
11
|
// true distance to the analytic curve, so the hull's facets never reach the
|
|
12
12
|
// picture. A pair wider than LINK_FAR_SCREEN_WIDTHS view widths degenerates to
|
|
13
13
|
// a circle whose legs rise from each real foot, built endpoint-relative so a
|
|
14
|
-
// radius in the millions of px cancels nothing
|
|
14
|
+
// radius in the millions of px cancels nothing, or where its apex is low to
|
|
15
|
+
// a dome that keeps the apex, whose canvas-wide stretch is a nearly level
|
|
16
|
+
// line, so a view inside the pair still shows it passing over. A foot the
|
|
17
|
+
// table cannot place
|
|
15
18
|
// draws a stem at the placed one, so an off-view mate still says it exists. A
|
|
16
19
|
// foot may carry a breakend tick along the baseline, pointing along the arm
|
|
17
20
|
// its junction keeps. Under `line` the pair is a straight segment at the apex
|
|
@@ -24,9 +27,8 @@
|
|
|
24
27
|
//! targets: wgsl, glsl
|
|
25
28
|
//! topology: triangle-strip
|
|
26
29
|
//! coverage: analytic
|
|
27
|
-
//! export-consts: LINK_SHAPE_DOME, LINK_SHAPE_ARC, LINK_SHAPE_LINE, LINK_LINE_MIN_PX, LINK_NO_REGION, LINK_ELSEWHERE, LINK_MAX_REGIONS, LINK_STEM_PX, LINK_FOOT_PX, LINK_FAR_SCREEN_WIDTHS, LINK_SIZE_CONSTANT, LINK_SIZE_SCALED, LINK_NO_SIZE, LINK_CURVE_SEGMENTS
|
|
28
|
-
//! js-export: linkApexPx, linkRadiiPx, linkStrokeWidthPx, linkValuePx, linkBaseYPx, linkFootLenPx, linkFootDir
|
|
29
|
-
//! js-skip: linkIsFar — reached as a private helper inside the generated linkRadiiPx, so the far decision is shared without a second way to ask it
|
|
30
|
+
//! export-consts: LINK_SHAPE_DOME, LINK_SHAPE_ARC, LINK_SHAPE_LINE, LINK_LINE_MIN_PX, LINK_NO_REGION, LINK_ELSEWHERE, LINK_MAX_REGIONS, LINK_STEM_PX, LINK_FOOT_PX, LINK_FAR_SCREEN_WIDTHS, LINK_FAR_FLAT_RATIO, LINK_SIZE_CONSTANT, LINK_SIZE_SCALED, LINK_NO_SIZE, LINK_CURVE_SEGMENTS
|
|
31
|
+
//! js-export: linkApexPx, linkApexHeld, linkRadiiPx, linkIsFar, linkStrokeWidthPx, linkValuePx, linkBaseYPx, linkFootLenPx, linkFootDir
|
|
30
32
|
|
|
31
33
|
import antialias;
|
|
32
34
|
import colorPack;
|
|
@@ -36,6 +38,7 @@ import markColor;
|
|
|
36
38
|
import rowTable;
|
|
37
39
|
import scoreScale;
|
|
38
40
|
import valueScale;
|
|
41
|
+
import viewRegion;
|
|
39
42
|
|
|
40
43
|
public static const uint LINK_CURVE_SEGMENTS = 64u;
|
|
41
44
|
static const uint CURVE_VERTS = (LINK_CURVE_SEGMENTS + 1u) * 2u;
|
|
@@ -57,7 +60,7 @@ public static const uint LINK_NO_REGION = 0xFFFFFFFFu;
|
|
|
57
60
|
// An `x2Region` for an instance another region's payload draws: the far half
|
|
58
61
|
// of a pair both of whose ends have records, or a record fetched twice.
|
|
59
62
|
public static const uint LINK_ELSEWHERE = 0xFFFFFFFEu;
|
|
60
|
-
public static const uint LINK_MAX_REGIONS =
|
|
63
|
+
public static const uint LINK_MAX_REGIONS = VIEW_REGION_MAX;
|
|
61
64
|
public static const float LINK_STEM_PX = 12.0;
|
|
62
65
|
// How long a breakend foot is where its region has the room: a tick along
|
|
63
66
|
// the baseline over the arm its junction keeps, BreakpointSplitView's length.
|
|
@@ -67,6 +70,10 @@ public static const float LINK_FOOT_PX = 20.0;
|
|
|
67
70
|
// Not 1, because a circle throws the pair's direction away, and the limit is
|
|
68
71
|
// tessellation: reference/ARC_BAND.md.
|
|
69
72
|
public static const float LINK_FAR_SCREEN_WIDTHS = 3.0;
|
|
73
|
+
// A far pair whose scale holds an apex under this share of its half-width
|
|
74
|
+
// keeps it and draws as a flattened dome; above it the pair is a circle. A quarter
|
|
75
|
+
// leaves an arc whose apex IS its half-width, give or take a float, a circle.
|
|
76
|
+
public static const float LINK_FAR_FLAT_RATIO = 0.25;
|
|
70
77
|
public static const int LINK_SIZE_CONSTANT = 0;
|
|
71
78
|
public static const int LINK_SIZE_SCALED = 1;
|
|
72
79
|
// The `size` lane's value for an instance holding no number, which takes the
|
|
@@ -114,7 +121,7 @@ struct Uniforms {
|
|
|
114
121
|
float rampMax;
|
|
115
122
|
float rampMidNorm;
|
|
116
123
|
// `markColor`'s threshold: how many cuts are in use, the cuts four to a
|
|
117
|
-
// vector, and the
|
|
124
|
+
// vector, and the color of each interval between them.
|
|
118
125
|
int colorCutCount;
|
|
119
126
|
float4 colorCuts[2];
|
|
120
127
|
float4 colorBands[MAX_COLOR_BANDS];
|
|
@@ -171,11 +178,9 @@ struct VsOut {
|
|
|
171
178
|
float legSide : COLOR5;
|
|
172
179
|
};
|
|
173
180
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
bool linkIsFar(float halfWidthPx, float screenWidthPx) {
|
|
181
|
+
// Whether a pair is wide enough to draw as a true circle's two legs, which the
|
|
182
|
+
// painter strokes as a circle and `linkRadiiPx` sizes as one.
|
|
183
|
+
public bool linkIsFar(float halfWidthPx, float screenWidthPx) {
|
|
179
184
|
return 2.0 * halfWidthPx > LINK_FAR_SCREEN_WIDTHS * screenWidthPx;
|
|
180
185
|
}
|
|
181
186
|
|
|
@@ -185,12 +190,14 @@ public float linkValuePx(float value, float domainMin, float domainMax, float h,
|
|
|
185
190
|
return h - insetValueYPx(value, domainMin, domainMax, h, scaleType, insetPx, symlogConstant);
|
|
186
191
|
}
|
|
187
192
|
|
|
188
|
-
// The apex height of a pair, in CSS px above the baseline.
|
|
189
|
-
|
|
193
|
+
// The apex height of a pair's centreline, in CSS px above the baseline. A dome
|
|
194
|
+
// stops half its stroke short of the band's top, so its thickest arc stays on
|
|
195
|
+
// the canvas.
|
|
196
|
+
public float linkApexPx(float halfWidthPx, float reachPx, float strokeHalfPx, int linkShape, int valued, float valuePx) {
|
|
190
197
|
if (valued != 0) { return valuePx; }
|
|
191
198
|
if (linkShape == LINK_SHAPE_LINE) { return 0.0; }
|
|
192
199
|
if (linkShape == LINK_SHAPE_ARC) { return halfWidthPx; }
|
|
193
|
-
return min(halfWidthPx, reachPx);
|
|
200
|
+
return min(halfWidthPx, max(reachPx - strokeHalfPx, 0.0));
|
|
194
201
|
}
|
|
195
202
|
|
|
196
203
|
// The baseline of a row's band, in canvas px: its bottom, or its top under a
|
|
@@ -199,11 +206,24 @@ public float linkBaseYPx(float rowOffsetPx, float rowHeight, uint row, int rever
|
|
|
199
206
|
return rowBandTopPx(rowOffsetPx, rowHeight, row) + (reverse != 0 ? 0.0 : rowHeight);
|
|
200
207
|
}
|
|
201
208
|
|
|
202
|
-
//
|
|
203
|
-
//
|
|
204
|
-
//
|
|
205
|
-
|
|
206
|
-
|
|
209
|
+
// Whether the value scale holds a pair's `y`: it names an apex inside the
|
|
210
|
+
// band. A value past the top of its domain is clamped there, and so is a dome
|
|
211
|
+
// with no `y`, which rises as far as its band lets it: the apex either draws
|
|
212
|
+
// at is the band's, not the pair's.
|
|
213
|
+
public int linkApexHeld(int valued, float value, float domainMax) {
|
|
214
|
+
return valued != 0 && value < domainMax ? 1 : 0;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
// The two radii of the half-ellipse a pair draws. A far pair's are a true
|
|
218
|
+
// circle's, which its band clips to legs, unless the scale holds a low apex
|
|
219
|
+
// for it: then it keeps the apex and is a dome level across the canvas. A read
|
|
220
|
+
// pair's `y` is its own half-span, off the top of the scale long before the
|
|
221
|
+
// pair is far, so it stays the circle. `//! js-export`ed as a pair because the
|
|
222
|
+
// decision IS the pair, and it is what the painter, the ink and the hit test
|
|
223
|
+
// read.
|
|
224
|
+
public float2 linkRadiiPx(float halfWidthPx, float apexPx, float screenWidthPx, int held) {
|
|
225
|
+
if (linkIsFar(halfWidthPx, screenWidthPx)
|
|
226
|
+
&& (held == 0 || apexPx >= LINK_FAR_FLAT_RATIO * halfWidthPx)) {
|
|
207
227
|
return float2(halfWidthPx, halfWidthPx);
|
|
208
228
|
}
|
|
209
229
|
return float2(halfWidthPx, apexPx);
|
|
@@ -279,8 +299,9 @@ LinkVertex curveVertex(LinkInstance inst, LinkEnv e, uint seg, float side) {
|
|
|
279
299
|
float pairHalf = abs(e.x2Px - e.xPx) * 0.5;
|
|
280
300
|
float valuePx = linkValuePx(inst.y, u.domainMin, u.domainMax, u.rowHeight,
|
|
281
301
|
u.valueScaleType, u.insetPx, u.valueSymlogConstant);
|
|
282
|
-
float apex = linkApexPx(pairHalf, e.reach, u.linkShape, u.valued, valuePx);
|
|
283
|
-
v.radii = linkRadiiPx(pairHalf, apex, u.canvasWidth
|
|
302
|
+
float apex = linkApexPx(pairHalf, e.reach, e.strokeHalf, u.linkShape, u.valued, valuePx);
|
|
303
|
+
v.radii = linkRadiiPx(pairHalf, apex, u.canvasWidth,
|
|
304
|
+
linkApexHeld(u.valued, inst.y, u.domainMax));
|
|
284
305
|
float2 ends = float2(min(e.xPx, e.x2Px), max(e.xPx, e.x2Px));
|
|
285
306
|
if (u.linkShape == LINK_SHAPE_LINE) {
|
|
286
307
|
v.kind = KIND_LINE;
|
|
@@ -288,6 +309,24 @@ LinkVertex curveVertex(LinkInstance inst, LinkEnv e, uint seg, float side) {
|
|
|
288
309
|
v.radii = float2(len, 0.0);
|
|
289
310
|
v.local = float2(t * len, pad);
|
|
290
311
|
origin = float2((e.xPx + e.x2Px) * 0.5 - len * 0.5, e.baseY - apex * e.ySign);
|
|
312
|
+
} else if (linkIsFar(pairHalf, u.canvasWidth) && v.radii.y < v.radii.x) {
|
|
313
|
+
// A far dome, in px from the foot nearer the canvas and stepped in
|
|
314
|
+
// u = sin(b / 2) for the angle b from that foot, as the fragment
|
|
315
|
+
// measures it: a square root places the canvas's edges where an arcsine
|
|
316
|
+
// is px off at these radii. Over the stretch the canvas shows and no
|
|
317
|
+
// more, so every segment is spent on screen.
|
|
318
|
+
v.kind = KIND_CIRCLE;
|
|
319
|
+
float rx = v.radii.x;
|
|
320
|
+
bool fromRight = u.canvasWidth * 0.5 - ends.x > rx;
|
|
321
|
+
float footX = fromRight ? ends.y : ends.x;
|
|
322
|
+
float margin = e.hw + 2.0;
|
|
323
|
+
float nearD = fromRight ? footX - u.canvasWidth - margin : -margin - footX;
|
|
324
|
+
float farD = fromRight ? footX + margin : u.canvasWidth + margin - footX;
|
|
325
|
+
float u0 = farDomeParam(nearD, rx);
|
|
326
|
+
float step = (max(farDomeParam(farD, rx), u0) - u0) / float(u.curveSegments);
|
|
327
|
+
v.local = -farDomeHullPoint(u0 + float(seg) * step, step, rx, v.radii.y, pad);
|
|
328
|
+
origin = float2(footX, e.baseY);
|
|
329
|
+
legDir = fromRight ? 1.0 : -1.0;
|
|
291
330
|
} else if (linkIsFar(pairHalf, u.canvasWidth)) {
|
|
292
331
|
v.kind = KIND_CIRCLE;
|
|
293
332
|
float legSweep = legSweepAngle(v.radii.x, e.reach + e.hw);
|
|
@@ -370,9 +409,9 @@ VsOut vs_main(LinkInstance inst, uint vid : SV_VertexID) {
|
|
|
370
409
|
e.baseY = linkBaseYPx(u.rowOffsetPx, u.rowHeight, place.slot, u.reverse);
|
|
371
410
|
e.ySign = u.reverse != 0 ? -1.0 : 1.0;
|
|
372
411
|
e.reach = max(u.rowHeight - u.insetPx, 0.0);
|
|
373
|
-
e.xPx =
|
|
412
|
+
e.xPx = viewRegionPx(inst.x, u.ownEntry, u.zero);
|
|
374
413
|
e.placed = inst.x2Region < u.regionCount;
|
|
375
|
-
e.x2Px = e.placed ?
|
|
414
|
+
e.x2Px = e.placed ? viewRegionPx(inst.x2, u.regionTable[inst.x2Region], u.zero) : e.xPx;
|
|
376
415
|
|
|
377
416
|
uint curveVerts = (u.curveSegments + 1u) * 2u;
|
|
378
417
|
LinkVertex v;
|
|
@@ -409,7 +448,11 @@ float linkDistance(VsOut i) {
|
|
|
409
448
|
float y = clamp(i.local.y, -i.radii.y, 0.0);
|
|
410
449
|
return length(float2(i.local.x, i.local.y - y));
|
|
411
450
|
}
|
|
412
|
-
if (i.kind >= 0.5) {
|
|
451
|
+
if (i.kind >= 0.5) {
|
|
452
|
+
return i.radii.y < i.radii.x
|
|
453
|
+
? farDomeDistancePx(-i.local.x, -i.local.y, i.radii.x, i.radii.y)
|
|
454
|
+
: distToWideCircle(i.local, i.radii.x);
|
|
455
|
+
}
|
|
413
456
|
return sdEllipse(i.local, i.radii);
|
|
414
457
|
}
|
|
415
458
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
// AUTO-GENERATED by packages/shader-tools/src/shader-codegen from linkMark.slang.
|
|
2
2
|
// Do not edit. Run `pnpm gen:shaders` to regenerate.
|
|
3
3
|
|
|
4
|
-
export const WGSL_SOURCE = "struct Uniforms_std140_0\n{\n @align(16) canvasHeight_0 : f32,\n @align(4) devicePixelRatio_0 : f32,\n @align(8) rowHeight_0 : f32,\n @align(4) rowOffsetPx_0 : f32,\n @align(16) reverse_0 : i32,\n @align(4) stemPx_0 : f32,\n @align(8) dashPx_0 : f32,\n @align(4) gapPx_0 : f32,\n @align(16) footPx_0 : f32,\n @align(4) curveSegments_0 : u32,\n @align(8) insetPx_0 : f32,\n @align(4) domainMin_0 : f32,\n @align(16) domainMax_0 : f32,\n @align(4) valueScaleType_0 : i32,\n @align(8) valueSymlogConstant_0 : f32,\n @align(4) rampMode_0 : i32,\n @align(16) rampMin_0 : f32,\n @align(4) rampMax_0 : f32,\n @align(8) rampMidNorm_0 : f32,\n @align(4) 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) valued_0 : i32,\n @align(4) linkShape_0 : i32,\n @align(8) sizeMode_0 : i32,\n @align(4) sizeConstantPx_0 : f32,\n @align(16) sizeDomainMin_0 : f32,\n @align(4) sizeDomainMax_0 : f32,\n @align(8) sizeScaleType_0 : i32,\n @align(4) sizeRangeMin_0 : f32,\n @align(16) sizeRangeMax_0 : f32,\n @align(4) canvasWidth_0 : f32,\n @align(8) regionCount_0 : u32,\n @align(4) zero_0 : f32,\n @align(16) ownEntry_0 : vec4<f32>,\n @align(16) ownSpan_0 : vec4<f32>,\n @align(16) regionTable_0 : array<vec4<f32>, i32(256)>,\n @align(16) regionSpan_0 : array<vec4<f32>, i32(128)>,\n @align(16) rowTableKeys_0 : i32,\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 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 _S1 : f32 = max(mid_0, 1.0f - mid_0);\n return clamp((t_0 + (_S1 - mid_0)) / (2.0f * _S1), 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 _S2 : f32;\n if(i_0 < i32(4))\n {\n _S2 = cutsLo_0[i_0];\n }\n else\n {\n _S2 = cutsHi_0[i_0 - i32(4)];\n }\n return _S2;\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 _S3 : f32;\n if(u_1 == 1.0f)\n {\n _S3 = x_0;\n }\n else\n {\n _S3 = log(u_1) * (x_0 / (u_1 - 1.0f));\n }\n return _S3;\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 _S4 : f32 = symlogTransform_0(score_0, symlogConstant_0);\n var _S5 : f32 = symlogTransform_0(domainMin_1, symlogConstant_0);\n tMax_0 = symlogTransform_0(domainMax_1, symlogConstant_0);\n tMin_0 = _S5;\n t_2 = _S4;\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 _S6 : f32 = log2(max(score_0, tMax_0));\n var _S7 : f32 = log2(tMax_0);\n tMax_0 = log2(max(domainMax_1, tMax_0));\n tMin_0 = _S7;\n t_2 = _S6;\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 _S8 : u32 = (keys_1 + w_0 - u32(1)) / w_0;\n return max(_S8, u32(1));\n}\n\nfn rowTableTexelX_0( key_0 : u32, keys_2 : u32) -> u32\n{\n var _S9 : u32 = key_0 % rowTableWidth_0(keys_2);\n return _S9;\n}\n\nfn rowTableTexelY_0( key_1 : u32, keys_3 : u32) -> u32\n{\n var _S10 : u32 = key_1 / rowTableWidth_0(keys_3);\n return _S10;\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};\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 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 _S11 : u32 = rowTableTexelX_0(key_2, n_0);\n var u_2 : f32 = (f32(_S11) + 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 _S12 : vec4<f32> = (textureSampleLevel((table_texture_0), (table_sampler_0), (vec2<f32>(u_2, (f32(y_0) + 0.5f) / rows_0)), (0.0f)));\n if((_S12.w) < 0.5f)\n {\n p_0.hidden_0 = true;\n return p_0;\n }\n p_0.slot_0 = ((((byteOf_0(_S12.x)) | ((((byteOf_0(_S12.y)) << (u32(8))))))) | ((((byteOf_0(_S12.z)) << (u32(16))))));\n var _S13 : 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 _S14 : vec4<f32>;\n if((_S13.w) > 0.0f)\n {\n _S14 = _S13;\n }\n else\n {\n _S14 = own_0;\n }\n p_0.color_0 = _S14;\n return p_0;\n}\n\nfn linkStrokeWidthPx_0( raw_0 : f32, sizeMode_1 : i32, constantPx_0 : f32, domainMin_3 : f32, domainMax_3 : f32, scaleType_2 : i32, rangeMin_0 : f32, rangeMax_0 : f32, dpr_0 : f32) -> f32\n{\n var w_1 : f32;\n if(sizeMode_1 == i32(1))\n {\n if(raw_0 > -1.00000001504746622e+29f)\n {\n w_1 = rangeMin_0 + normalizeScore_0(raw_0, domainMin_3, domainMax_3, scaleType_2, 1.0f) * (rangeMax_0 - rangeMin_0);\n }\n else\n {\n w_1 = rangeMin_0;\n }\n }\n else\n {\n w_1 = constantPx_0;\n }\n return max(w_1, 1.5f / dpr_0);\n}\n\nfn aaPx_0( dpr_1 : f32) -> f32\n{\n return 1.0f / max(dpr_1, 1.0f);\n}\n\nfn aaHalfPx_0( dpr_2 : f32) -> f32\n{\n return 0.5f * aaPx_0(dpr_2);\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 linkBaseYPx_0( rowOffsetPx_2 : f32, rowHeight_2 : f32, row_0 : u32, reverse_1 : i32) -> f32\n{\n var _S15 : f32 = rowBandTopPx_0(rowOffsetPx_2, rowHeight_2, row_0);\n var _S16 : f32;\n if(reverse_1 != i32(0))\n {\n _S16 = 0.0f;\n }\n else\n {\n _S16 = rowHeight_2;\n }\n return _S15 + _S16;\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 hpViewportOffsetBp_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 return max(bpRange_0.x - splitPos_0.x, floorBp_0) + max(bpRange_0.y - splitPos_0.y, floorBp_0);\n}\n\nfn entryPx_0( bp_0 : u32, r_0 : vec4<f32>, hpZero_1 : f32) -> f32\n{\n return r_0.x - hpViewportOffsetBp_0(hpSplitUint_0(bp_0), vec3<f32>(r_0.y, r_0.z, 0.0f), hpZero_1) * r_0.w;\n}\n\nfn valueToYPxScaled_0( value_2 : f32, domainMin_4 : f32, domainMax_4 : f32, h_1 : f32, scaleType_3 : i32, symlogConstant_2 : f32) -> f32\n{\n return (1.0f - normalizeScore_0(value_2, domainMin_4, domainMax_4, scaleType_3, symlogConstant_2)) * h_1;\n}\n\nfn insetValueYPx_0( value_3 : f32, domainMin_5 : f32, domainMax_5 : f32, h_2 : f32, scaleType_4 : i32, insetPx_1 : f32, symlogConstant_3 : f32) -> f32\n{\n var _S17 : f32 = min(insetPx_1, h_2 * 0.5f);\n return _S17 + valueToYPxScaled_0(value_3, domainMin_5, domainMax_5, h_2 - 2.0f * _S17, scaleType_4, symlogConstant_3);\n}\n\nfn linkValuePx_0( value_4 : f32, domainMin_6 : f32, domainMax_6 : f32, h_3 : f32, scaleType_5 : i32, insetPx_2 : f32, symlogConstant_4 : f32) -> f32\n{\n return h_3 - insetValueYPx_0(value_4, domainMin_6, domainMax_6, h_3, scaleType_5, insetPx_2, symlogConstant_4);\n}\n\nfn linkApexPx_0( halfWidthPx_0 : f32, reachPx_0 : f32, linkShape_1 : i32, valued_1 : i32, valuePx_0 : f32) -> f32\n{\n if(valued_1 != i32(0))\n {\n return valuePx_0;\n }\n if(linkShape_1 == i32(2))\n {\n return 0.0f;\n }\n if(linkShape_1 == i32(1))\n {\n return halfWidthPx_0;\n }\n return min(halfWidthPx_0, reachPx_0);\n}\n\nfn linkIsFar_0( halfWidthPx_1 : f32, screenWidthPx_0 : f32) -> bool\n{\n return (2.0f * halfWidthPx_1) > (3.0f * screenWidthPx_0);\n}\n\nfn linkRadiiPx_0( halfWidthPx_2 : f32, apexPx_0 : f32, screenWidthPx_1 : f32) -> vec2<f32>\n{\n if(linkIsFar_0(halfWidthPx_2, screenWidthPx_1))\n {\n return vec2<f32>(halfWidthPx_2, halfWidthPx_2);\n }\n return vec2<f32>(halfWidthPx_2, apexPx_0);\n}\n\nfn legSweepAngle_0( radiusPx_0 : f32, yReachPx_0 : f32) -> f32\n{\n return asin(clamp(yReachPx_0 / max(radiusPx_0, 9.99999997475242708e-07f), 0.0f, 1.0f));\n}\n\nfn wideCircleLeg_0( seg_0 : u32, segments_0 : u32, legSweep_0 : f32) -> vec2<f32>\n{\n var half_0 : u32 = segments_0 / u32(2);\n if(seg_0 <= half_0)\n {\n return vec2<f32>(1.0f, f32(seg_0) / f32(half_0) * legSweep_0);\n }\n return vec2<f32>(-1.0f, f32(segments_0 - seg_0) / f32(segments_0 - half_0 - u32(1)) * legSweep_0);\n}\n\nfn wideCircleLegStep_0( seg_1 : u32, segments_1 : u32, legSweep_1 : f32) -> f32\n{\n var half_1 : u32 = segments_1 / u32(2);\n var _S18 : u32;\n if(seg_1 <= half_1)\n {\n _S18 = half_1;\n }\n else\n {\n _S18 = segments_1 - half_1 - u32(1);\n }\n return legSweep_1 / f32(_S18);\n}\n\nfn wideCircleHullPoint_0( sinB_0 : f32, sinHalfB_0 : f32, cosHalf_0 : f32, radiusPx_1 : f32, padPx_0 : f32) -> vec2<f32>\n{\n var sec_0 : f32;\n if(padPx_0 > 0.0f)\n {\n sec_0 = 1.0f / max(cosHalf_0, 9.99999997475242708e-07f);\n }\n else\n {\n sec_0 = 1.0f;\n }\n var grow_0 : f32 = radiusPx_1 * (sec_0 - 1.0f) + sec_0 * padPx_0;\n var sh2_0 : f32 = sinHalfB_0 * sinHalfB_0;\n return vec2<f32>(grow_0 * (1.0f - 2.0f * sh2_0) - 2.0f * radiusPx_1 * sh2_0, (radiusPx_1 + grow_0) * sinB_0);\n}\n\nfn ellipseHullPoint_0( cosA_0 : f32, sinA_0 : f32, cosHalf_1 : f32, sinHalf_0 : f32, rx_0 : f32, ry_0 : f32, padPx_1 : f32) -> vec2<f32>\n{\n var px_0 : f32 = cosA_0 * rx_0;\n var py_0 : f32 = sinA_0 * ry_0;\n if(padPx_1 <= 0.0f)\n {\n var d_0 : f32 = - padPx_1;\n var gx_0 : f32 = ry_0 * cosA_0;\n var gy_0 : f32 = rx_0 * sinA_0;\n var glen_0 : f32 = sqrt(gx_0 * gx_0 + gy_0 * gy_0);\n var acrossX_0 : bool = (ry_0 * glen_0) < (d_0 * rx_0);\n var acrossY_0 : bool = (rx_0 * glen_0) < (d_0 * ry_0);\n var _S19 : bool;\n if(acrossX_0)\n {\n _S19 = acrossY_0;\n }\n else\n {\n _S19 = false;\n }\n if(_S19)\n {\n return vec2<f32>(0.0f, 0.0f);\n }\n if(acrossX_0)\n {\n var _S20 : f32 = ry_0 * ry_0;\n return vec2<f32>(f32((i32(sign((cosA_0))))) * sqrt(max(_S20 - d_0 * d_0, 0.0f) * max(rx_0 * rx_0 - _S20, 0.0f)) / max(ry_0, 9.99999997475242708e-07f), 0.0f);\n }\n if(acrossY_0)\n {\n var _S21 : f32 = rx_0 * rx_0;\n return vec2<f32>(0.0f, f32((i32(sign((sinA_0))))) * sqrt(max(_S21 - d_0 * d_0, 0.0f) * max(ry_0 * ry_0 - _S21, 0.0f)) / max(rx_0, 9.99999997475242708e-07f));\n }\n var k_0 : f32 = d_0 / max(glen_0, 9.99999997475242708e-07f);\n return vec2<f32>(px_0 - gx_0 * k_0, py_0 - gy_0 * k_0);\n }\n var _S22 : f32 = cosA_0 * cosHalf_1;\n var _S23 : f32 = sinA_0 * sinHalf_0;\n var ax_0 : f32 = ry_0 * (_S22 + _S23);\n var _S24 : f32 = sinA_0 * cosHalf_1;\n var _S25 : f32 = cosA_0 * sinHalf_0;\n var ay_0 : f32 = rx_0 * (_S24 - _S25);\n var bx_0 : f32 = ry_0 * (_S22 - _S23);\n var by_0 : f32 = rx_0 * (_S24 + _S25);\n var _S26 : f32 = max(sqrt(ax_0 * ax_0 + ay_0 * ay_0), 9.99999968265522539e-21f);\n var _S27 : f32 = max(sqrt(bx_0 * bx_0 + by_0 * by_0), 9.99999968265522539e-21f);\n var nx_0 : f32 = ax_0 / _S26 + bx_0 / _S27;\n var ny_0 : f32 = ay_0 / _S26 + by_0 / _S27;\n var m_0 : f32 = 2.0f * padPx_1 / max(nx_0 * nx_0 + ny_0 * ny_0, 0.00019999999494758f);\n return vec2<f32>(px_0 / cosHalf_1 + nx_0 * m_0, py_0 / cosHalf_1 + ny_0 * m_0);\n}\n\nstruct LinkVertex_0\n{\n screen_0 : vec2<f32>,\n local_0 : vec2<f32>,\n radii_0 : vec2<f32>,\n kind_0 : f32,\n legSide_0 : f32,\n};\n\nstruct LinkInstance_0\n{\n x_2 : u32,\n x2_0 : u32,\n x2Region_0 : u32,\n y_1 : f32,\n size_0 : f32,\n color_1 : u32,\n row_1 : u32,\n feet_0 : u32,\n};\n\nstruct LinkEnv_0\n{\n strokeHalf_0 : f32,\n hw_0 : f32,\n baseY_0 : f32,\n ySign_0 : f32,\n reach_0 : f32,\n xPx_0 : f32,\n x2Px_0 : f32,\n placed_0 : bool,\n};\n\nfn curveVertex_0( inst_0 : LinkInstance_0, e_0 : LinkEnv_0, seg_2 : u32, side_0 : f32) -> LinkVertex_0\n{\n var t_3 : f32 = f32(seg_2) / f32(u_0.curveSegments_0);\n var pad_0 : f32 = side_0 * e_0.hw_0;\n var v_0 : LinkVertex_0;\n v_0.legSide_0 = 1.0f;\n var legDir_0 : f32;\n var origin_0 : vec2<f32>;\n if(!e_0.placed_0)\n {\n v_0.kind_0 = 2.0f;\n v_0.radii_0 = vec2<f32>(0.0f, u_0.stemPx_0);\n v_0.local_0 = vec2<f32>(pad_0, - t_3 * (u_0.stemPx_0 + e_0.hw_0));\n origin_0 = vec2<f32>(e_0.xPx_0, e_0.baseY_0);\n legDir_0 = 1.0f;\n }\n else\n {\n var pairHalf_0 : f32 = abs(e_0.x2Px_0 - e_0.xPx_0) * 0.5f;\n var apex_0 : f32 = linkApexPx_0(pairHalf_0, e_0.reach_0, u_0.linkShape_0, u_0.valued_0, linkValuePx_0(inst_0.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 v_0.radii_0 = linkRadiiPx_0(pairHalf_0, apex_0, u_0.canvasWidth_0);\n var _S28 : f32 = min(e_0.xPx_0, e_0.x2Px_0);\n var _S29 : f32 = max(e_0.xPx_0, e_0.x2Px_0);\n if((u_0.linkShape_0) == i32(2))\n {\n v_0.kind_0 = 3.0f;\n var _S30 : f32 = max(2.0f * pairHalf_0, 2.5f);\n v_0.radii_0 = vec2<f32>(_S30, 0.0f);\n v_0.local_0 = vec2<f32>(t_3 * _S30, pad_0);\n origin_0 = vec2<f32>((e_0.xPx_0 + e_0.x2Px_0) * 0.5f - _S30 * 0.5f, e_0.baseY_0 - apex_0 * e_0.ySign_0);\n legDir_0 = 1.0f;\n }\n else\n {\n if(linkIsFar_0(pairHalf_0, u_0.canvasWidth_0))\n {\n v_0.kind_0 = 1.0f;\n var legSweep_2 : f32 = legSweepAngle_0(v_0.radii_0.x, e_0.reach_0 + e_0.hw_0);\n var leg_0 : vec2<f32> = wideCircleLeg_0(seg_2, u_0.curveSegments_0, legSweep_2);\n var b_0 : f32 = leg_0.y;\n var _S31 : vec2<f32> = wideCircleHullPoint_0(sin(b_0), sin(b_0 * 0.5f), cos(0.5f * wideCircleLegStep_0(seg_2, u_0.curveSegments_0, legSweep_2)), v_0.radii_0.x, pad_0);\n v_0.local_0 = _S31;\n v_0.local_0[i32(1)] = - _S31.y;\n var _S32 : f32 = leg_0.x;\n if(_S32 > 0.0f)\n {\n legDir_0 = _S29;\n }\n else\n {\n legDir_0 = _S28;\n }\n var _S33 : vec2<f32> = vec2<f32>(legDir_0, e_0.baseY_0);\n v_0.legSide_0 = _S32;\n origin_0 = _S33;\n legDir_0 = _S32;\n }\n else\n {\n v_0.kind_0 = 0.0f;\n var a_0 : f32 = t_3 * 3.14159274101257324f;\n var halfStep_0 : f32 = 3.14159274101257324f / (2.0f * f32(u_0.curveSegments_0));\n var _S34 : vec2<f32> = ellipseHullPoint_0(cos(a_0), sin(a_0), cos(halfStep_0), sin(halfStep_0), v_0.radii_0.x, v_0.radii_0.y, pad_0);\n v_0.local_0 = _S34;\n v_0.local_0[i32(1)] = - _S34.y;\n origin_0 = vec2<f32>((e_0.xPx_0 + e_0.x2Px_0) * 0.5f, e_0.baseY_0);\n legDir_0 = 1.0f;\n }\n }\n }\n v_0.screen_0 = origin_0 + vec2<f32>(legDir_0 * v_0.local_0.x, v_0.local_0.y * e_0.ySign_0);\n return v_0;\n}\n\nfn regionSpanPx_0( region_0 : u32) -> vec2<f32>\n{\n var s_0 : vec4<f32> = u_0.regionSpan_0[region_0 / u32(2)];\n var _S35 : vec2<f32>;\n if((region_0 % u32(2)) == u32(0))\n {\n _S35 = s_0.xy;\n }\n else\n {\n _S35 = s_0.zw;\n }\n return _S35;\n}\n\nfn linkFootDir_0( feet_1 : u32, shift_0 : u32) -> f32\n{\n var d_1 : u32 = (((feet_1 >> (shift_0))) & (u32(3)));\n var _S36 : f32;\n if(d_1 == u32(1))\n {\n _S36 = 1.0f;\n }\n else\n {\n if(d_1 == u32(2))\n {\n _S36 = -1.0f;\n }\n else\n {\n _S36 = 0.0f;\n }\n }\n return _S36;\n}\n\nfn linkFootLenPx_0( x_3 : f32, dir_0 : f32, leftPx_0 : f32, rightPx_0 : f32, footPx_1 : f32) -> f32\n{\n var _S37 : f32;\n if(dir_0 > 0.0f)\n {\n _S37 = rightPx_0 - x_3;\n }\n else\n {\n _S37 = x_3 - leftPx_0;\n }\n return max(0.0f, min(footPx_1, _S37));\n}\n\nfn footCorner_0( inst_1 : LinkInstance_0, e_1 : LinkEnv_0, f_0 : u32, c_2 : u32, present_0 : ptr<function, bool>) -> LinkVertex_0\n{\n var _S38 : bool = f_0 == u32(0);\n var x_4 : f32;\n if(_S38)\n {\n x_4 = e_1.xPx_0;\n }\n else\n {\n x_4 = e_1.x2Px_0;\n }\n var _S39 : u32 = min(inst_1.x2Region_0, u32(255));\n var entry_0 : vec4<f32>;\n if(_S38)\n {\n entry_0 = u_0.ownEntry_0;\n }\n else\n {\n entry_0 = u_0.regionTable_0[_S39];\n }\n var span_0 : vec2<f32>;\n if(_S38)\n {\n span_0 = u_0.ownSpan_0.xy;\n }\n else\n {\n span_0 = regionSpanPx_0(_S39);\n }\n var dir_1 : f32 = linkFootDir_0(inst_1.feet_0, f_0 * u32(2)) * f32((i32(sign((entry_0.w)))));\n var len_0 : f32 = linkFootLenPx_0(x_4, dir_1, span_0.x, span_0.y, u_0.footPx_0);\n var _S40 : bool;\n if(dir_1 != 0.0f)\n {\n _S40 = len_0 > 0.0f;\n }\n else\n {\n _S40 = false;\n }\n if(_S40)\n {\n if(_S38)\n {\n _S40 = true;\n }\n else\n {\n _S40 = e_1.placed_0;\n }\n }\n else\n {\n _S40 = false;\n }\n (*present_0) = _S40;\n var along_0 : f32;\n if(c_2 >= u32(2))\n {\n along_0 = len_0;\n }\n else\n {\n along_0 = 0.0f;\n }\n var across_0 : f32;\n if((c_2 % u32(2)) == u32(0))\n {\n across_0 = - e_1.hw_0;\n }\n else\n {\n across_0 = e_1.hw_0;\n }\n var v_1 : LinkVertex_0;\n v_1.kind_0 = 4.0f;\n v_1.radii_0 = vec2<f32>(len_0, 0.0f);\n v_1.legSide_0 = 1.0f;\n v_1.local_0 = vec2<f32>(along_0, across_0);\n v_1.screen_0 = vec2<f32>(x_4 + dir_1 * along_0, e_1.baseY_0 - e_1.ySign_0 * e_1.strokeHalf_0 + across_0);\n return v_1;\n}\n\nfn footCorner_1( inst_2 : LinkInstance_0, e_2 : LinkEnv_0, f_1 : u32, c_3 : u32, present_1 : ptr<function, bool>) -> LinkVertex_0\n{\n var _S41 : bool = f_1 == u32(0);\n var x_5 : f32;\n if(_S41)\n {\n x_5 = e_2.xPx_0;\n }\n else\n {\n x_5 = e_2.x2Px_0;\n }\n var _S42 : u32 = min(inst_2.x2Region_0, u32(255));\n var entry_1 : vec4<f32>;\n if(_S41)\n {\n entry_1 = u_0.ownEntry_0;\n }\n else\n {\n entry_1 = u_0.regionTable_0[_S42];\n }\n var span_1 : vec2<f32>;\n if(_S41)\n {\n span_1 = u_0.ownSpan_0.xy;\n }\n else\n {\n span_1 = regionSpanPx_0(_S42);\n }\n var dir_2 : f32 = linkFootDir_0(inst_2.feet_0, f_1 * u32(2)) * f32((i32(sign((entry_1.w)))));\n var len_1 : f32 = linkFootLenPx_0(x_5, dir_2, span_1.x, span_1.y, u_0.footPx_0);\n var _S43 : bool;\n if(dir_2 != 0.0f)\n {\n _S43 = len_1 > 0.0f;\n }\n else\n {\n _S43 = false;\n }\n if(_S43)\n {\n if(_S41)\n {\n _S43 = true;\n }\n else\n {\n _S43 = e_2.placed_0;\n }\n }\n else\n {\n _S43 = false;\n }\n (*present_1) = _S43;\n var along_1 : f32;\n if(c_3 >= u32(2))\n {\n along_1 = len_1;\n }\n else\n {\n along_1 = 0.0f;\n }\n var across_1 : f32;\n if((c_3 % u32(2)) == u32(0))\n {\n across_1 = - e_2.hw_0;\n }\n else\n {\n across_1 = e_2.hw_0;\n }\n var v_2 : LinkVertex_0;\n v_2.kind_0 = 4.0f;\n v_2.radii_0 = vec2<f32>(len_1, 0.0f);\n v_2.legSide_0 = 1.0f;\n v_2.local_0 = vec2<f32>(along_1, across_1);\n v_2.screen_0 = vec2<f32>(x_5 + dir_2 * along_1, e_2.baseY_0 - e_2.ySign_0 * e_2.strokeHalf_0 + across_1);\n return v_2;\n}\n\nfn footBlockStart_0( inst_3 : LinkInstance_0, e_3 : LinkEnv_0, f_2 : u32) -> LinkVertex_0\n{\n var tail_0 : LinkVertex_0 = curveVertex_0(inst_3, e_3, u_0.curveSegments_0, 1.0f);\n if(f_2 == u32(0))\n {\n return tail_0;\n }\n var first_0 : bool;\n var last_0 : LinkVertex_0 = footCorner_0(inst_3, e_3, u32(0), u32(3), &(first_0));\n var _S44 : LinkVertex_0;\n if(first_0)\n {\n _S44 = last_0;\n }\n else\n {\n _S44 = tail_0;\n }\n return _S44;\n}\n\nfn footVertex_0( inst_4 : LinkInstance_0, e_4 : LinkEnv_0, f_3 : u32, k_1 : u32) -> LinkVertex_0\n{\n var start_0 : LinkVertex_0 = footBlockStart_0(inst_4, e_4, f_3);\n if(k_1 == u32(0))\n {\n return start_0;\n }\n var present_2 : bool;\n var _S45 : u32;\n if(k_1 <= u32(2))\n {\n _S45 = u32(0);\n }\n else\n {\n _S45 = k_1 - u32(2);\n }\n var v_3 : LinkVertex_0 = footCorner_1(inst_4, e_4, f_3, _S45, &(present_2));\n var _S46 : LinkVertex_0;\n if(present_2)\n {\n _S46 = v_3;\n }\n else\n {\n _S46 = start_0;\n }\n return _S46;\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\nstruct VsOut_0\n{\n @builtin(position) position_0 : vec4<f32>,\n @location(0) color_2 : vec4<f32>,\n @location(1) local_1 : vec2<f32>,\n @interpolate(flat) @location(2) radii_1 : vec2<f32>,\n @interpolate(flat) @location(3) kind_1 : f32,\n @interpolate(flat) @location(4) halfWidthPx_3 : f32,\n @location(5) legSide_1 : f32,\n};\n\nstruct vertexInput_0\n{\n @location(0) x_6 : u32,\n @location(1) x2_1 : u32,\n @location(2) x2Region_1 : u32,\n @location(3) y_2 : f32,\n @location(4) size_1 : f32,\n @location(5) color_3 : u32,\n @location(6) row_2 : u32,\n @location(7) feet_2 : u32,\n};\n\nfn markScaleColor_0( _S47 : texture_2d<f32>, _S48 : sampler, _S49 : u32, _S50 : i32, _S51 : f32, _S52 : f32, _S53 : f32, _S54 : i32, _S55 : vec4<f32>, _S56 : vec4<f32>) -> vec4<f32>\n{\n if(_S50 == i32(0))\n {\n return unpackRGBA_0(_S49);\n }\n if(_S49 == u32(2143289345))\n {\n return unpackRGBA_0(u32(4289703855));\n }\n var scaleType_6 : i32;\n if(((_S49 & (u32(2139095040)))) == u32(2139095040))\n {\n if(((_S49 & (u32(8388607)))) != u32(0))\n {\n return unpackRGBA_0(u32(4286611584));\n }\n var negative_0 : bool = ((_S49 & (u32(2147483648)))) != u32(0);\n if(_S50 == i32(3))\n {\n if(negative_0)\n {\n scaleType_6 = i32(0);\n }\n else\n {\n scaleType_6 = _S54;\n }\n return u_0.colorBands_0[scaleType_6];\n }\n var _S57 : f32;\n if(negative_0)\n {\n _S57 = 0.0f;\n }\n else\n {\n _S57 = 1.0f;\n }\n return rampColor_0(_S47, _S48, rampMidT_0(_S57, _S53));\n }\n var value_5 : f32 = (bitcast<f32>((_S49)));\n if(_S50 == i32(3))\n {\n return u_0.colorBands_0[thresholdBand_0(value_5, _S54, _S55, _S56)];\n }\n if(_S50 == i32(2))\n {\n scaleType_6 = i32(1);\n }\n else\n {\n scaleType_6 = i32(0);\n }\n return rampColor_0(_S47, _S48, rampMidT_0(normalizeScore_0(value_5, _S51, _S52, scaleType_6, 1.0f), _S53));\n}\n\n@vertex\nfn vs_main( _S58 : vertexInput_0, @builtin(vertex_index) vid_0 : u32) -> VsOut_0\n{\n var _S59 : LinkInstance_0 = LinkInstance_0( _S58.x_6, _S58.x2_1, _S58.x2Region_1, _S58.y_2, _S58.size_1, _S58.color_3, _S58.row_2, _S58.feet_2 );\n var _S60 : RowPlacement_0 = rowTableLookup_0(rowTable_texture_0, rowTable_sampler_0, _S58.row_2, u_0.rowTableKeys_0, markScaleColor_0(colorRamp_texture_0, colorRamp_sampler_0, _S58.color_3, 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 var e_5 : LinkEnv_0;\n var _S61 : f32 = 0.5f * linkStrokeWidthPx_0(_S58.size_1, u_0.sizeMode_0, u_0.sizeConstantPx_0, u_0.sizeDomainMin_0, u_0.sizeDomainMax_0, u_0.sizeScaleType_0, u_0.sizeRangeMin_0, u_0.sizeRangeMax_0, u_0.devicePixelRatio_0);\n e_5.strokeHalf_0 = _S61;\n e_5.hw_0 = _S61 + aaHalfPx_0(u_0.devicePixelRatio_0);\n e_5.baseY_0 = linkBaseYPx_0(u_0.rowOffsetPx_0, u_0.rowHeight_0, _S60.slot_0, u_0.reverse_0);\n var _S62 : f32;\n if((u_0.reverse_0) != i32(0))\n {\n _S62 = -1.0f;\n }\n else\n {\n _S62 = 1.0f;\n }\n e_5.ySign_0 = _S62;\n e_5.reach_0 = max(u_0.rowHeight_0 - u_0.insetPx_0, 0.0f);\n e_5.xPx_0 = entryPx_0(_S58.x_6, u_0.ownEntry_0, u_0.zero_0);\n var _S63 : bool = (_S58.x2Region_1) < (u_0.regionCount_0);\n e_5.placed_0 = _S63;\n if(_S63)\n {\n _S62 = entryPx_0(_S58.x2_1, u_0.regionTable_0[_S58.x2Region_1], u_0.zero_0);\n }\n else\n {\n _S62 = e_5.xPx_0;\n }\n e_5.x2Px_0 = _S62;\n var curveVerts_0 : u32 = (u_0.curveSegments_0 + u32(1)) * u32(2);\n var v_4 : LinkVertex_0;\n if(vid_0 < curveVerts_0)\n {\n var _S64 : LinkEnv_0 = e_5;\n var _S65 : u32 = vid_0 / u32(2);\n if((vid_0 % u32(2)) == u32(0))\n {\n _S62 = -1.0f;\n }\n else\n {\n _S62 = 1.0f;\n }\n v_4 = curveVertex_0(_S59, _S64, _S65, _S62);\n }\n else\n {\n var j_0 : u32 = vid_0 - curveVerts_0;\n v_4 = footVertex_0(_S59, e_5, j_0 / u32(6), j_0 % u32(6));\n }\n var o_0 : VsOut_0;\n var _S66 : bool;\n if((_S58.x2Region_1) == u32(4294967294))\n {\n _S66 = true;\n }\n else\n {\n _S66 = _S60.hidden_0;\n }\n var _S67 : vec4<f32>;\n if(_S66)\n {\n _S67 = vec4<f32>(-2.0f, -2.0f, 0.0f, 1.0f);\n }\n else\n {\n _S67 = vec4<f32>(v_4.screen_0.x / u_0.canvasWidth_0 * 2.0f - 1.0f, yPxToClipY_0(v_4.screen_0.y, u_0.canvasHeight_0), 0.0f, 1.0f);\n }\n o_0.position_0 = _S67;\n o_0.color_2 = _S60.color_0;\n o_0.local_1 = v_4.local_0;\n o_0.radii_1 = v_4.radii_0;\n o_0.kind_1 = v_4.kind_0;\n o_0.halfWidthPx_3 = e_5.strokeHalf_0;\n o_0.legSide_1 = v_4.legSide_0;\n return o_0;\n}\n\nfn distToWideCirclePx_0( x_7 : f32, y_3 : f32, r_1 : f32) -> f32\n{\n var rk_0 : f32 = 2.0f * x_7 + (x_7 * x_7 + y_3 * y_3) / r_1;\n return abs(rk_0 / (sqrt(max(1.0f + rk_0 / r_1, 0.0f)) + 1.0f));\n}\n\nfn distToWideCircle_0( legLocal_0 : vec2<f32>, r_2 : f32) -> f32\n{\n return distToWideCirclePx_0(legLocal_0.x, legLocal_0.y, r_2);\n}\n\nfn nearCircleDistancePx_0( qx_0 : f32, qy_0 : f32, ax_1 : f32, ay_1 : f32) -> f32\n{\n var kx_0 : f32 = qx_0 / ax_1;\n var ky_0 : f32 = qy_0 / ay_1;\n var k_2 : f32 = sqrt(kx_0 * kx_0 + ky_0 * ky_0);\n var gx_1 : f32 = qx_0 / (ax_1 * ax_1);\n var gy_1 : f32 = qy_0 / (ay_1 * ay_1);\n return abs(k_2 * (k_2 - 1.0f) / max(sqrt(gx_1 * gx_1 + gy_1 * gy_1), 9.99999968265522539e-21f));\n}\n\nfn sdEllipse_0( p_1 : vec2<f32>, radii_2 : vec2<f32>) -> f32\n{\n var q_0 : vec2<f32> = abs(p_1);\n var ab_0 : vec2<f32>;\n var q_1 : vec2<f32>;\n if((q_0.x) > (q_0.y))\n {\n var _S68 : vec2<f32> = q_0.yx;\n ab_0 = radii_2.yx;\n q_1 = _S68;\n }\n else\n {\n ab_0 = radii_2;\n q_1 = q_0;\n }\n if((dot(ab_0, ab_0)) <= 0.0f)\n {\n return length(q_1);\n }\n var _S69 : f32 = ab_0.y;\n var _S70 : f32 = ab_0.x;\n var l_0 : f32 = _S69 * _S69 - _S70 * _S70;\n if((abs(l_0)) < (0.05000000074505806f * _S69 * _S69))\n {\n return nearCircleDistancePx_0(q_1.x, q_1.y, _S70, _S69);\n }\n var m_1 : f32 = _S70 * q_1.x / l_0;\n var m2_0 : f32 = m_1 * m_1;\n var n_1 : f32 = _S69 * q_1.y / l_0;\n var n2_0 : f32 = n_1 * n_1;\n var c_4 : f32 = (m2_0 + n2_0 - 1.0f) / 3.0f;\n var c3_0 : f32 = c_4 * c_4 * c_4;\n var _S71 : f32 = m2_0 * n2_0;\n var d_2 : f32 = c3_0 + _S71;\n var g_0 : f32 = m_1 + m_1 * n2_0;\n var co_0 : f32;\n if(d_2 < 0.0f)\n {\n var h_4 : f32 = acos(clamp((c3_0 + _S71 * 2.0f) / c3_0, -1.0f, 1.0f)) / 3.0f;\n var s_1 : f32 = cos(h_4);\n var t_4 : f32 = sin(h_4) * sqrt(3.0f);\n var _S72 : f32 = - c_4;\n var rx_1 : f32 = sqrt(max(_S72 * (s_1 + t_4 + 2.0f) + m2_0, 0.0f));\n var ry_1 : f32 = sqrt(max(_S72 * (s_1 - t_4 + 2.0f) + m2_0, 0.0f));\n co_0 = (ry_1 + f32((i32(sign((l_0))))) * rx_1 + abs(g_0) / max(rx_1 * ry_1, 9.99999968265522539e-21f) - m_1) / 2.0f;\n }\n else\n {\n var w_2 : f32 = c3_0 + _S71 * 2.0f + 2.0f * m_1 * n_1 * sqrt(d_2);\n var aw_0 : f32 = abs(w_2);\n var _S73 : f32 = f32((i32(sign((w_2)))));\n var s_2 : f32 = _S73 * pow(aw_0, 0.3333333432674408f);\n if(aw_0 > 0.0f)\n {\n co_0 = _S73 * pow(c3_0 * (c3_0 / aw_0), 0.3333333432674408f);\n }\n else\n {\n co_0 = 0.0f;\n }\n var rx_2 : f32 = - s_2 - co_0 - c_4 * 4.0f + 2.0f * m2_0;\n var ry_2 : f32 = (s_2 - co_0) * sqrt(3.0f);\n var rm_0 : f32 = sqrt(rx_2 * rx_2 + ry_2 * ry_2);\n co_0 = (ry_2 / sqrt(max(rm_0 - rx_2, 9.99999968265522539e-21f)) + 2.0f * g_0 / max(rm_0, 9.99999968265522539e-21f) - m_1) / 2.0f;\n }\n var co_1 : f32 = clamp(co_0, -1.0f, 1.0f);\n return length(ab_0 * vec2<f32>(co_1, sqrt(max(1.0f - co_1 * co_1, 0.0f))) - q_1);\n}\n\nfn linkDistance_0( i_2 : VsOut_0) -> f32\n{\n if((i_2.kind_1) >= 2.5f)\n {\n var _S74 : f32 = i_2.local_1.x;\n return length(vec2<f32>(_S74 - clamp(_S74, 0.0f, i_2.radii_1.x), i_2.local_1.y));\n }\n if((i_2.kind_1) >= 1.5f)\n {\n var _S75 : f32 = i_2.local_1.y;\n return length(vec2<f32>(i_2.local_1.x, _S75 - clamp(_S75, - i_2.radii_1.y, 0.0f)));\n }\n if((i_2.kind_1) >= 0.5f)\n {\n return distToWideCircle_0(i_2.local_1, i_2.radii_1.x);\n }\n return sdEllipse_0(i_2.local_1, i_2.radii_1);\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 edgeCoverage_0( signedInkCssPx_0 : f32, dpr_3 : f32) -> f32\n{\n return aaRamp_0(signedInkCssPx_0, aaPx_0(dpr_3));\n}\n\nfn linkDashAlong_0( i_3 : VsOut_0) -> f32\n{\n if((i_3.kind_1) >= 3.5f)\n {\n return -1.0f;\n }\n if((i_3.kind_1) >= 2.5f)\n {\n return i_3.local_1.x;\n }\n if((i_3.kind_1) >= 1.5f)\n {\n return - i_3.local_1.y;\n }\n return -1.0f;\n}\n\nfn dashCoverageAt_0( coord_0 : f32, dashPx_1 : f32, gapPx_1 : f32, aaPx_1 : f32) -> f32\n{\n var period_0 : f32 = dashPx_1 + gapPx_1;\n var shifted_0 : f32 = coord_0 + gapPx_1 * 0.5f;\n return aaRamp_0(dashPx_1 * 0.5f - abs(shifted_0 - period_0 * floor(shifted_0 / period_0) - period_0 * 0.5f), aaPx_1);\n}\n\nfn dashCoverage_0( coord_1 : f32, dashPx_2 : f32, gapPx_2 : f32, dpr_4 : f32) -> f32\n{\n return dashCoverageAt_0(coord_1, dashPx_2, gapPx_2, aaPx_0(dpr_4));\n}\n\nfn linkDash_0( i_4 : VsOut_0) -> f32\n{\n var along_2 : f32 = linkDashAlong_0(i_4);\n var _S76 : bool;\n if((u_0.dashPx_0) > 0.0f)\n {\n _S76 = along_2 >= 0.0f;\n }\n else\n {\n _S76 = false;\n }\n var _S77 : f32;\n if(_S76)\n {\n _S77 = dashCoverage_0(along_2, u_0.dashPx_0, u_0.gapPx_0, u_0.devicePixelRatio_0);\n }\n else\n {\n _S77 = 1.0f;\n }\n return _S77;\n}\n\nstruct pixelOutput_0\n{\n @location(0) output_0 : vec4<f32>,\n};\n\nstruct pixelInput_0\n{\n @location(0) color_4 : vec4<f32>,\n @location(1) local_2 : vec2<f32>,\n @interpolate(flat) @location(2) radii_3 : vec2<f32>,\n @interpolate(flat) @location(3) kind_2 : f32,\n @interpolate(flat) @location(4) halfWidthPx_4 : f32,\n @location(5) legSide_2 : f32,\n};\n\n@fragment\nfn fs_main( _S78 : pixelInput_0, @builtin(position) position_1 : vec4<f32>) -> pixelOutput_0\n{\n var _S79 : VsOut_0 = VsOut_0( position_1, _S78.color_4, _S78.local_2, _S78.radii_3, _S78.kind_2, _S78.halfWidthPx_4, _S78.legSide_2 );\n if((abs(_S78.legSide_2)) < 0.99900001287460327f)\n {\n discard;\n }\n var _S80 : pixelOutput_0 = pixelOutput_0( vec4<f32>(_S78.color_4.xyz, _S78.color_4.w * (edgeCoverage_0(_S78.halfWidthPx_4 - linkDistance_0(_S79), u_0.devicePixelRatio_0) * linkDash_0(_S79))) );\n return _S80;\n}\n\n"
|
|
4
|
+
export const WGSL_SOURCE = "struct Uniforms_std140_0\n{\n @align(16) canvasHeight_0 : f32,\n @align(4) devicePixelRatio_0 : f32,\n @align(8) rowHeight_0 : f32,\n @align(4) rowOffsetPx_0 : f32,\n @align(16) reverse_0 : i32,\n @align(4) stemPx_0 : f32,\n @align(8) dashPx_0 : f32,\n @align(4) gapPx_0 : f32,\n @align(16) footPx_0 : f32,\n @align(4) curveSegments_0 : u32,\n @align(8) insetPx_0 : f32,\n @align(4) domainMin_0 : f32,\n @align(16) domainMax_0 : f32,\n @align(4) valueScaleType_0 : i32,\n @align(8) valueSymlogConstant_0 : f32,\n @align(4) rampMode_0 : i32,\n @align(16) rampMin_0 : f32,\n @align(4) rampMax_0 : f32,\n @align(8) rampMidNorm_0 : f32,\n @align(4) 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) valued_0 : i32,\n @align(4) linkShape_0 : i32,\n @align(8) sizeMode_0 : i32,\n @align(4) sizeConstantPx_0 : f32,\n @align(16) sizeDomainMin_0 : f32,\n @align(4) sizeDomainMax_0 : f32,\n @align(8) sizeScaleType_0 : i32,\n @align(4) sizeRangeMin_0 : f32,\n @align(16) sizeRangeMax_0 : f32,\n @align(4) canvasWidth_0 : f32,\n @align(8) regionCount_0 : u32,\n @align(4) zero_0 : f32,\n @align(16) ownEntry_0 : vec4<f32>,\n @align(16) ownSpan_0 : vec4<f32>,\n @align(16) regionTable_0 : array<vec4<f32>, i32(256)>,\n @align(16) regionSpan_0 : array<vec4<f32>, i32(128)>,\n @align(16) rowTableKeys_0 : i32,\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 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 _S1 : f32 = max(mid_0, 1.0f - mid_0);\n return clamp((t_0 + (_S1 - mid_0)) / (2.0f * _S1), 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 _S2 : f32;\n if(i_0 < i32(4))\n {\n _S2 = cutsLo_0[i_0];\n }\n else\n {\n _S2 = cutsHi_0[i_0 - i32(4)];\n }\n return _S2;\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 _S3 : f32;\n if(u_1 == 1.0f)\n {\n _S3 = x_0;\n }\n else\n {\n _S3 = log(u_1) * (x_0 / (u_1 - 1.0f));\n }\n return _S3;\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 _S4 : f32 = symlogTransform_0(score_0, symlogConstant_0);\n var _S5 : f32 = symlogTransform_0(domainMin_1, symlogConstant_0);\n tMax_0 = symlogTransform_0(domainMax_1, symlogConstant_0);\n tMin_0 = _S5;\n t_2 = _S4;\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 _S6 : f32 = log2(max(score_0, tMax_0));\n var _S7 : f32 = log2(tMax_0);\n tMax_0 = log2(max(domainMax_1, tMax_0));\n tMin_0 = _S7;\n t_2 = _S6;\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 _S8 : u32 = (keys_1 + w_0 - u32(1)) / w_0;\n return max(_S8, u32(1));\n}\n\nfn rowTableTexelX_0( key_0 : u32, keys_2 : u32) -> u32\n{\n var _S9 : u32 = key_0 % rowTableWidth_0(keys_2);\n return _S9;\n}\n\nfn rowTableTexelY_0( key_1 : u32, keys_3 : u32) -> u32\n{\n var _S10 : u32 = key_1 / rowTableWidth_0(keys_3);\n return _S10;\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 _S11 : u32 = rowTableTexelX_0(key_2, n_0);\n var u_2 : f32 = (f32(_S11) + 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 _S12 : vec4<f32> = (textureSampleLevel((table_texture_0), (table_sampler_0), (vec2<f32>(u_2, (f32(y_0) + 0.5f) / rows_0)), (0.0f)));\n if((_S12.w) < 0.5f)\n {\n p_0.hidden_0 = true;\n return p_0;\n }\n p_0.slot_0 = ((((byteOf_0(_S12.x)) | ((((byteOf_0(_S12.y)) << (u32(8))))))) | ((((byteOf_0(_S12.z)) << (u32(16))))));\n var _S13 : 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 _S14 : bool = (_S13.w) > 0.0f;\n p_0.overridden_0 = _S14;\n var _S15 : vec4<f32>;\n if(_S14)\n {\n _S15 = _S13;\n }\n else\n {\n _S15 = own_0;\n }\n p_0.color_0 = _S15;\n return p_0;\n}\n\nfn linkStrokeWidthPx_0( raw_0 : f32, sizeMode_1 : i32, constantPx_0 : f32, domainMin_3 : f32, domainMax_3 : f32, scaleType_2 : i32, rangeMin_0 : f32, rangeMax_0 : f32, dpr_0 : f32) -> f32\n{\n var w_1 : f32;\n if(sizeMode_1 == i32(1))\n {\n if(raw_0 > -1.00000001504746622e+29f)\n {\n w_1 = rangeMin_0 + normalizeScore_0(raw_0, domainMin_3, domainMax_3, scaleType_2, 1.0f) * (rangeMax_0 - rangeMin_0);\n }\n else\n {\n w_1 = rangeMin_0;\n }\n }\n else\n {\n w_1 = constantPx_0;\n }\n return max(w_1, 1.5f / dpr_0);\n}\n\nfn aaPx_0( dpr_1 : f32) -> f32\n{\n return 1.0f / max(dpr_1, 1.0f);\n}\n\nfn aaHalfPx_0( dpr_2 : f32) -> f32\n{\n return 0.5f * aaPx_0(dpr_2);\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 linkBaseYPx_0( rowOffsetPx_2 : f32, rowHeight_2 : f32, row_0 : u32, reverse_1 : i32) -> f32\n{\n var _S16 : f32 = rowBandTopPx_0(rowOffsetPx_2, rowHeight_2, row_0);\n var _S17 : f32;\n if(reverse_1 != i32(0))\n {\n _S17 = 0.0f;\n }\n else\n {\n _S17 = rowHeight_2;\n }\n return _S16 + _S17;\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 hpViewportOffsetBp_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 return max(bpRange_0.x - splitPos_0.x, floorBp_0) + max(bpRange_0.y - splitPos_0.y, floorBp_0);\n}\n\nfn viewRegionPx_0( bp_0 : u32, r_0 : vec4<f32>, hpZero_1 : f32) -> f32\n{\n return r_0.x - hpViewportOffsetBp_0(hpSplitUint_0(bp_0), vec3<f32>(r_0.y, r_0.z, 0.0f), hpZero_1) * r_0.w;\n}\n\nfn valueToYPxScaled_0( value_2 : f32, domainMin_4 : f32, domainMax_4 : f32, h_1 : f32, scaleType_3 : i32, symlogConstant_2 : f32) -> f32\n{\n return (1.0f - normalizeScore_0(value_2, domainMin_4, domainMax_4, scaleType_3, symlogConstant_2)) * h_1;\n}\n\nfn insetValueYPx_0( value_3 : f32, domainMin_5 : f32, domainMax_5 : f32, h_2 : f32, scaleType_4 : i32, insetPx_1 : f32, symlogConstant_3 : f32) -> f32\n{\n var _S18 : f32 = min(insetPx_1, h_2 * 0.5f);\n return _S18 + valueToYPxScaled_0(value_3, domainMin_5, domainMax_5, h_2 - 2.0f * _S18, scaleType_4, symlogConstant_3);\n}\n\nfn linkValuePx_0( value_4 : f32, domainMin_6 : f32, domainMax_6 : f32, h_3 : f32, scaleType_5 : i32, insetPx_2 : f32, symlogConstant_4 : f32) -> f32\n{\n return h_3 - insetValueYPx_0(value_4, domainMin_6, domainMax_6, h_3, scaleType_5, insetPx_2, symlogConstant_4);\n}\n\nfn linkApexPx_0( halfWidthPx_0 : f32, reachPx_0 : f32, strokeHalfPx_0 : f32, linkShape_1 : i32, valued_1 : i32, valuePx_0 : f32) -> f32\n{\n if(valued_1 != i32(0))\n {\n return valuePx_0;\n }\n if(linkShape_1 == i32(2))\n {\n return 0.0f;\n }\n if(linkShape_1 == i32(1))\n {\n return halfWidthPx_0;\n }\n return min(halfWidthPx_0, max(reachPx_0 - strokeHalfPx_0, 0.0f));\n}\n\nfn linkApexHeld_0( valued_2 : i32, value_5 : f32, domainMax_7 : f32) -> i32\n{\n var _S19 : bool;\n if(valued_2 != i32(0))\n {\n _S19 = value_5 < domainMax_7;\n }\n else\n {\n _S19 = false;\n }\n var _S20 : i32;\n if(_S19)\n {\n _S20 = i32(1);\n }\n else\n {\n _S20 = i32(0);\n }\n return _S20;\n}\n\nfn linkIsFar_0( halfWidthPx_1 : f32, screenWidthPx_0 : f32) -> bool\n{\n return (2.0f * halfWidthPx_1) > (3.0f * screenWidthPx_0);\n}\n\nfn linkRadiiPx_0( halfWidthPx_2 : f32, apexPx_0 : f32, screenWidthPx_1 : f32, held_0 : i32) -> vec2<f32>\n{\n var _S21 : bool;\n if(linkIsFar_0(halfWidthPx_2, screenWidthPx_1))\n {\n if(held_0 == i32(0))\n {\n _S21 = true;\n }\n else\n {\n _S21 = apexPx_0 >= (0.25f * halfWidthPx_2);\n }\n }\n else\n {\n _S21 = false;\n }\n if(_S21)\n {\n return vec2<f32>(halfWidthPx_2, halfWidthPx_2);\n }\n return vec2<f32>(halfWidthPx_2, apexPx_0);\n}\n\nfn farDomeParam_0( dPx_0 : f32, rxPx_0 : f32) -> f32\n{\n return sqrt(clamp(dPx_0 / (2.0f * max(rxPx_0, 9.99999997475242708e-07f)), 0.0f, 0.8399999737739563f));\n}\n\nfn farDomeHullPoint_0( u_3 : f32, stepU_0 : f32, rxPx_1 : f32, ryPx_0 : f32, padPx_0 : f32) -> vec2<f32>\n{\n var _S22 : f32 = max(ryPx_0, 9.99999997475242708e-07f);\n var _S23 : f32 = max(u_3, 0.5f * stepU_0);\n var nx_0 : f32 = - _S22 * (1.0f - 2.0f * _S23 * _S23);\n var _S24 : f32 = 2.0f * rxPx_1;\n var ny_0 : f32 = _S24 * _S23 * sqrt(1.0f - _S23 * _S23);\n var _S25 : f32 = max(nx_0 * nx_0 + ny_0 * ny_0, 9.99999968265522539e-21f);\n var reach_0 : f32 = padPx_0 + f32((i32(sign((padPx_0))))) * 0.5f * rxPx_1 * stepU_0 * stepU_0;\n var _S26 : f32 = sqrt(_S25);\n var along_0 : f32 = reach_0 / _S26;\n var d_0 : f32 = _S24 * u_3 * u_3;\n var _S27 : f32 = u_3 * u_3;\n var h_4 : f32 = 2.0f * _S22 * u_3 * sqrt(1.0f - _S27);\n var folded_0 : bool;\n if(padPx_0 < 0.0f)\n {\n folded_0 = _S27 < 0.5f;\n }\n else\n {\n folded_0 = false;\n }\n if(folded_0)\n {\n folded_0 = (_S25 * _S26) < (-2.0f * reach_0 * rxPx_1 * _S22);\n }\n else\n {\n folded_0 = false;\n }\n var _S28 : f32;\n if(folded_0)\n {\n if(u_3 > 0.0f)\n {\n _S28 = d_0 - reach_0;\n }\n else\n {\n _S28 = d_0;\n }\n }\n else\n {\n _S28 = d_0 + nx_0 * along_0;\n }\n var _S29 : f32;\n if(folded_0)\n {\n _S29 = h_4 + reach_0;\n }\n else\n {\n _S29 = h_4 + ny_0 * along_0;\n }\n return vec2<f32>(_S28, _S29);\n}\n\nfn legSweepAngle_0( radiusPx_0 : f32, yReachPx_0 : f32) -> f32\n{\n return asin(clamp(yReachPx_0 / max(radiusPx_0, 9.99999997475242708e-07f), 0.0f, 1.0f));\n}\n\nfn wideCircleLeg_0( seg_0 : u32, segments_0 : u32, legSweep_0 : f32) -> vec2<f32>\n{\n var half_0 : u32 = segments_0 / u32(2);\n if(seg_0 <= half_0)\n {\n return vec2<f32>(1.0f, f32(seg_0) / f32(half_0) * legSweep_0);\n }\n return vec2<f32>(-1.0f, f32(segments_0 - seg_0) / f32(segments_0 - half_0 - u32(1)) * legSweep_0);\n}\n\nfn wideCircleLegStep_0( seg_1 : u32, segments_1 : u32, legSweep_1 : f32) -> f32\n{\n var half_1 : u32 = segments_1 / u32(2);\n var _S30 : u32;\n if(seg_1 <= half_1)\n {\n _S30 = half_1;\n }\n else\n {\n _S30 = segments_1 - half_1 - u32(1);\n }\n return legSweep_1 / f32(_S30);\n}\n\nfn wideCircleHullPoint_0( sinB_0 : f32, sinHalfB_0 : f32, cosHalf_0 : f32, radiusPx_1 : f32, padPx_1 : f32) -> vec2<f32>\n{\n var sec_0 : f32;\n if(padPx_1 > 0.0f)\n {\n sec_0 = 1.0f / max(cosHalf_0, 9.99999997475242708e-07f);\n }\n else\n {\n sec_0 = 1.0f;\n }\n var grow_0 : f32 = radiusPx_1 * (sec_0 - 1.0f) + sec_0 * padPx_1;\n var sh2_0 : f32 = sinHalfB_0 * sinHalfB_0;\n return vec2<f32>(grow_0 * (1.0f - 2.0f * sh2_0) - 2.0f * radiusPx_1 * sh2_0, (radiusPx_1 + grow_0) * sinB_0);\n}\n\nfn ellipseHullPoint_0( cosA_0 : f32, sinA_0 : f32, cosHalf_1 : f32, sinHalf_0 : f32, rx_0 : f32, ry_0 : f32, padPx_2 : f32) -> vec2<f32>\n{\n var px_0 : f32 = cosA_0 * rx_0;\n var py_0 : f32 = sinA_0 * ry_0;\n if(padPx_2 <= 0.0f)\n {\n var d_1 : f32 = - padPx_2;\n var gx_0 : f32 = ry_0 * cosA_0;\n var gy_0 : f32 = rx_0 * sinA_0;\n var glen_0 : f32 = sqrt(gx_0 * gx_0 + gy_0 * gy_0);\n var acrossX_0 : bool = (ry_0 * glen_0) < (d_1 * rx_0);\n var acrossY_0 : bool = (rx_0 * glen_0) < (d_1 * ry_0);\n var _S31 : bool;\n if(acrossX_0)\n {\n _S31 = acrossY_0;\n }\n else\n {\n _S31 = false;\n }\n if(_S31)\n {\n return vec2<f32>(0.0f, 0.0f);\n }\n if(acrossX_0)\n {\n var _S32 : f32 = ry_0 * ry_0;\n return vec2<f32>(f32((i32(sign((cosA_0))))) * sqrt(max(_S32 - d_1 * d_1, 0.0f) * max(rx_0 * rx_0 - _S32, 0.0f)) / max(ry_0, 9.99999997475242708e-07f), 0.0f);\n }\n if(acrossY_0)\n {\n var _S33 : f32 = rx_0 * rx_0;\n return vec2<f32>(0.0f, f32((i32(sign((sinA_0))))) * sqrt(max(_S33 - d_1 * d_1, 0.0f) * max(ry_0 * ry_0 - _S33, 0.0f)) / max(rx_0, 9.99999997475242708e-07f));\n }\n var k_0 : f32 = d_1 / max(glen_0, 9.99999997475242708e-07f);\n return vec2<f32>(px_0 - gx_0 * k_0, py_0 - gy_0 * k_0);\n }\n var _S34 : f32 = cosA_0 * cosHalf_1;\n var _S35 : f32 = sinA_0 * sinHalf_0;\n var ax_0 : f32 = ry_0 * (_S34 + _S35);\n var _S36 : f32 = sinA_0 * cosHalf_1;\n var _S37 : f32 = cosA_0 * sinHalf_0;\n var ay_0 : f32 = rx_0 * (_S36 - _S37);\n var bx_0 : f32 = ry_0 * (_S34 - _S35);\n var by_0 : f32 = rx_0 * (_S36 + _S37);\n var _S38 : f32 = max(sqrt(ax_0 * ax_0 + ay_0 * ay_0), 9.99999968265522539e-21f);\n var _S39 : f32 = max(sqrt(bx_0 * bx_0 + by_0 * by_0), 9.99999968265522539e-21f);\n var nx_1 : f32 = ax_0 / _S38 + bx_0 / _S39;\n var ny_1 : f32 = ay_0 / _S38 + by_0 / _S39;\n var m_0 : f32 = 2.0f * padPx_2 / max(nx_1 * nx_1 + ny_1 * ny_1, 0.00019999999494758f);\n return vec2<f32>(px_0 / cosHalf_1 + nx_1 * m_0, py_0 / cosHalf_1 + ny_1 * m_0);\n}\n\nstruct LinkVertex_0\n{\n screen_0 : vec2<f32>,\n local_0 : vec2<f32>,\n radii_0 : vec2<f32>,\n kind_0 : f32,\n legSide_0 : f32,\n};\n\nstruct LinkInstance_0\n{\n x_2 : u32,\n x2_0 : u32,\n x2Region_0 : u32,\n y_1 : f32,\n size_0 : f32,\n color_1 : u32,\n row_1 : u32,\n feet_0 : u32,\n};\n\nstruct LinkEnv_0\n{\n strokeHalf_0 : f32,\n hw_0 : f32,\n baseY_0 : f32,\n ySign_0 : f32,\n reach_1 : f32,\n xPx_0 : f32,\n x2Px_0 : f32,\n placed_0 : bool,\n};\n\nfn curveVertex_0( inst_0 : LinkInstance_0, e_0 : LinkEnv_0, seg_2 : u32, side_0 : f32) -> LinkVertex_0\n{\n var _S40 : f32 = f32(seg_2);\n var t_3 : f32 = _S40 / f32(u_0.curveSegments_0);\n var pad_0 : f32 = side_0 * e_0.hw_0;\n var v_0 : LinkVertex_0;\n v_0.legSide_0 = 1.0f;\n var legDir_0 : f32;\n var origin_0 : vec2<f32>;\n if(!e_0.placed_0)\n {\n v_0.kind_0 = 2.0f;\n v_0.radii_0 = vec2<f32>(0.0f, u_0.stemPx_0);\n v_0.local_0 = vec2<f32>(pad_0, - t_3 * (u_0.stemPx_0 + e_0.hw_0));\n origin_0 = vec2<f32>(e_0.xPx_0, e_0.baseY_0);\n legDir_0 = 1.0f;\n }\n else\n {\n var pairHalf_0 : f32 = abs(e_0.x2Px_0 - e_0.xPx_0) * 0.5f;\n var apex_0 : f32 = linkApexPx_0(pairHalf_0, e_0.reach_1, e_0.strokeHalf_0, u_0.linkShape_0, u_0.valued_0, linkValuePx_0(inst_0.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 v_0.radii_0 = linkRadiiPx_0(pairHalf_0, apex_0, u_0.canvasWidth_0, linkApexHeld_0(u_0.valued_0, inst_0.y_1, u_0.domainMax_0));\n var _S41 : f32 = min(e_0.xPx_0, e_0.x2Px_0);\n var _S42 : f32 = max(e_0.xPx_0, e_0.x2Px_0);\n if((u_0.linkShape_0) == i32(2))\n {\n v_0.kind_0 = 3.0f;\n var _S43 : f32 = max(2.0f * pairHalf_0, 2.5f);\n v_0.radii_0 = vec2<f32>(_S43, 0.0f);\n v_0.local_0 = vec2<f32>(t_3 * _S43, pad_0);\n origin_0 = vec2<f32>((e_0.xPx_0 + e_0.x2Px_0) * 0.5f - _S43 * 0.5f, e_0.baseY_0 - apex_0 * e_0.ySign_0);\n legDir_0 = 1.0f;\n }\n else\n {\n var _S44 : bool;\n if(linkIsFar_0(pairHalf_0, u_0.canvasWidth_0))\n {\n _S44 = (v_0.radii_0.y) < (v_0.radii_0.x);\n }\n else\n {\n _S44 = false;\n }\n if(_S44)\n {\n v_0.kind_0 = 1.0f;\n var rx_1 : f32 = v_0.radii_0.x;\n var fromRight_0 : bool = (u_0.canvasWidth_0 * 0.5f - _S41) > rx_1;\n if(fromRight_0)\n {\n legDir_0 = _S42;\n }\n else\n {\n legDir_0 = _S41;\n }\n var margin_0 : f32 = e_0.hw_0 + 2.0f;\n var nearD_0 : f32;\n if(fromRight_0)\n {\n nearD_0 = legDir_0 - u_0.canvasWidth_0 - margin_0;\n }\n else\n {\n nearD_0 = - margin_0 - legDir_0;\n }\n var farD_0 : f32;\n if(fromRight_0)\n {\n farD_0 = legDir_0 + margin_0;\n }\n else\n {\n farD_0 = u_0.canvasWidth_0 + margin_0 - legDir_0;\n }\n var u0_0 : f32 = farDomeParam_0(nearD_0, rx_1);\n var step_0 : f32 = (max(farDomeParam_0(farD_0, rx_1), u0_0) - u0_0) / f32(u_0.curveSegments_0);\n v_0.local_0 = (vec2<f32>(0) - farDomeHullPoint_0(u0_0 + _S40 * step_0, step_0, rx_1, v_0.radii_0.y, pad_0));\n var _S45 : vec2<f32> = vec2<f32>(legDir_0, e_0.baseY_0);\n if(fromRight_0)\n {\n legDir_0 = 1.0f;\n }\n else\n {\n legDir_0 = -1.0f;\n }\n origin_0 = _S45;\n }\n else\n {\n if(linkIsFar_0(pairHalf_0, u_0.canvasWidth_0))\n {\n v_0.kind_0 = 1.0f;\n var legSweep_2 : f32 = legSweepAngle_0(v_0.radii_0.x, e_0.reach_1 + e_0.hw_0);\n var leg_0 : vec2<f32> = wideCircleLeg_0(seg_2, u_0.curveSegments_0, legSweep_2);\n var b_0 : f32 = leg_0.y;\n var _S46 : vec2<f32> = wideCircleHullPoint_0(sin(b_0), sin(b_0 * 0.5f), cos(0.5f * wideCircleLegStep_0(seg_2, u_0.curveSegments_0, legSweep_2)), v_0.radii_0.x, pad_0);\n v_0.local_0 = _S46;\n v_0.local_0[i32(1)] = - _S46.y;\n var _S47 : f32 = leg_0.x;\n if(_S47 > 0.0f)\n {\n legDir_0 = _S42;\n }\n else\n {\n legDir_0 = _S41;\n }\n var _S48 : vec2<f32> = vec2<f32>(legDir_0, e_0.baseY_0);\n v_0.legSide_0 = _S47;\n origin_0 = _S48;\n legDir_0 = _S47;\n }\n else\n {\n v_0.kind_0 = 0.0f;\n var a_0 : f32 = t_3 * 3.14159274101257324f;\n var halfStep_0 : f32 = 3.14159274101257324f / (2.0f * f32(u_0.curveSegments_0));\n var _S49 : vec2<f32> = ellipseHullPoint_0(cos(a_0), sin(a_0), cos(halfStep_0), sin(halfStep_0), v_0.radii_0.x, v_0.radii_0.y, pad_0);\n v_0.local_0 = _S49;\n v_0.local_0[i32(1)] = - _S49.y;\n origin_0 = vec2<f32>((e_0.xPx_0 + e_0.x2Px_0) * 0.5f, e_0.baseY_0);\n legDir_0 = 1.0f;\n }\n }\n }\n }\n v_0.screen_0 = origin_0 + vec2<f32>(legDir_0 * v_0.local_0.x, v_0.local_0.y * e_0.ySign_0);\n return v_0;\n}\n\nfn regionSpanPx_0( region_0 : u32) -> vec2<f32>\n{\n var s_0 : vec4<f32> = u_0.regionSpan_0[region_0 / u32(2)];\n var _S50 : vec2<f32>;\n if((region_0 % u32(2)) == u32(0))\n {\n _S50 = s_0.xy;\n }\n else\n {\n _S50 = s_0.zw;\n }\n return _S50;\n}\n\nfn linkFootDir_0( feet_1 : u32, shift_0 : u32) -> f32\n{\n var d_2 : u32 = (((feet_1 >> (shift_0))) & (u32(3)));\n var _S51 : f32;\n if(d_2 == u32(1))\n {\n _S51 = 1.0f;\n }\n else\n {\n if(d_2 == u32(2))\n {\n _S51 = -1.0f;\n }\n else\n {\n _S51 = 0.0f;\n }\n }\n return _S51;\n}\n\nfn linkFootLenPx_0( x_3 : f32, dir_0 : f32, leftPx_0 : f32, rightPx_0 : f32, footPx_1 : f32) -> f32\n{\n var _S52 : f32;\n if(dir_0 > 0.0f)\n {\n _S52 = rightPx_0 - x_3;\n }\n else\n {\n _S52 = x_3 - leftPx_0;\n }\n return max(0.0f, min(footPx_1, _S52));\n}\n\nfn footCorner_0( inst_1 : LinkInstance_0, e_1 : LinkEnv_0, f_0 : u32, c_2 : u32, present_0 : ptr<function, bool>) -> LinkVertex_0\n{\n var _S53 : bool = f_0 == u32(0);\n var x_4 : f32;\n if(_S53)\n {\n x_4 = e_1.xPx_0;\n }\n else\n {\n x_4 = e_1.x2Px_0;\n }\n var _S54 : u32 = min(inst_1.x2Region_0, u32(255));\n var entry_0 : vec4<f32>;\n if(_S53)\n {\n entry_0 = u_0.ownEntry_0;\n }\n else\n {\n entry_0 = u_0.regionTable_0[_S54];\n }\n var span_0 : vec2<f32>;\n if(_S53)\n {\n span_0 = u_0.ownSpan_0.xy;\n }\n else\n {\n span_0 = regionSpanPx_0(_S54);\n }\n var dir_1 : f32 = linkFootDir_0(inst_1.feet_0, f_0 * u32(2)) * f32((i32(sign((entry_0.w)))));\n var len_0 : f32 = linkFootLenPx_0(x_4, dir_1, span_0.x, span_0.y, u_0.footPx_0);\n var _S55 : bool;\n if(dir_1 != 0.0f)\n {\n _S55 = len_0 > 0.0f;\n }\n else\n {\n _S55 = false;\n }\n if(_S55)\n {\n if(_S53)\n {\n _S55 = true;\n }\n else\n {\n _S55 = e_1.placed_0;\n }\n }\n else\n {\n _S55 = false;\n }\n (*present_0) = _S55;\n var along_1 : f32;\n if(c_2 >= u32(2))\n {\n along_1 = len_0;\n }\n else\n {\n along_1 = 0.0f;\n }\n var across_0 : f32;\n if((c_2 % u32(2)) == u32(0))\n {\n across_0 = - e_1.hw_0;\n }\n else\n {\n across_0 = e_1.hw_0;\n }\n var v_1 : LinkVertex_0;\n v_1.kind_0 = 4.0f;\n v_1.radii_0 = vec2<f32>(len_0, 0.0f);\n v_1.legSide_0 = 1.0f;\n v_1.local_0 = vec2<f32>(along_1, across_0);\n v_1.screen_0 = vec2<f32>(x_4 + dir_1 * along_1, e_1.baseY_0 - e_1.ySign_0 * e_1.strokeHalf_0 + across_0);\n return v_1;\n}\n\nfn footCorner_1( inst_2 : LinkInstance_0, e_2 : LinkEnv_0, f_1 : u32, c_3 : u32, present_1 : ptr<function, bool>) -> LinkVertex_0\n{\n var _S56 : bool = f_1 == u32(0);\n var x_5 : f32;\n if(_S56)\n {\n x_5 = e_2.xPx_0;\n }\n else\n {\n x_5 = e_2.x2Px_0;\n }\n var _S57 : u32 = min(inst_2.x2Region_0, u32(255));\n var entry_1 : vec4<f32>;\n if(_S56)\n {\n entry_1 = u_0.ownEntry_0;\n }\n else\n {\n entry_1 = u_0.regionTable_0[_S57];\n }\n var span_1 : vec2<f32>;\n if(_S56)\n {\n span_1 = u_0.ownSpan_0.xy;\n }\n else\n {\n span_1 = regionSpanPx_0(_S57);\n }\n var dir_2 : f32 = linkFootDir_0(inst_2.feet_0, f_1 * u32(2)) * f32((i32(sign((entry_1.w)))));\n var len_1 : f32 = linkFootLenPx_0(x_5, dir_2, span_1.x, span_1.y, u_0.footPx_0);\n var _S58 : bool;\n if(dir_2 != 0.0f)\n {\n _S58 = len_1 > 0.0f;\n }\n else\n {\n _S58 = false;\n }\n if(_S58)\n {\n if(_S56)\n {\n _S58 = true;\n }\n else\n {\n _S58 = e_2.placed_0;\n }\n }\n else\n {\n _S58 = false;\n }\n (*present_1) = _S58;\n var along_2 : f32;\n if(c_3 >= u32(2))\n {\n along_2 = len_1;\n }\n else\n {\n along_2 = 0.0f;\n }\n var across_1 : f32;\n if((c_3 % u32(2)) == u32(0))\n {\n across_1 = - e_2.hw_0;\n }\n else\n {\n across_1 = e_2.hw_0;\n }\n var v_2 : LinkVertex_0;\n v_2.kind_0 = 4.0f;\n v_2.radii_0 = vec2<f32>(len_1, 0.0f);\n v_2.legSide_0 = 1.0f;\n v_2.local_0 = vec2<f32>(along_2, across_1);\n v_2.screen_0 = vec2<f32>(x_5 + dir_2 * along_2, e_2.baseY_0 - e_2.ySign_0 * e_2.strokeHalf_0 + across_1);\n return v_2;\n}\n\nfn footBlockStart_0( inst_3 : LinkInstance_0, e_3 : LinkEnv_0, f_2 : u32) -> LinkVertex_0\n{\n var tail_0 : LinkVertex_0 = curveVertex_0(inst_3, e_3, u_0.curveSegments_0, 1.0f);\n if(f_2 == u32(0))\n {\n return tail_0;\n }\n var first_0 : bool;\n var last_0 : LinkVertex_0 = footCorner_0(inst_3, e_3, u32(0), u32(3), &(first_0));\n var _S59 : LinkVertex_0;\n if(first_0)\n {\n _S59 = last_0;\n }\n else\n {\n _S59 = tail_0;\n }\n return _S59;\n}\n\nfn footVertex_0( inst_4 : LinkInstance_0, e_4 : LinkEnv_0, f_3 : u32, k_1 : u32) -> LinkVertex_0\n{\n var start_0 : LinkVertex_0 = footBlockStart_0(inst_4, e_4, f_3);\n if(k_1 == u32(0))\n {\n return start_0;\n }\n var present_2 : bool;\n var _S60 : u32;\n if(k_1 <= u32(2))\n {\n _S60 = u32(0);\n }\n else\n {\n _S60 = k_1 - u32(2);\n }\n var v_3 : LinkVertex_0 = footCorner_1(inst_4, e_4, f_3, _S60, &(present_2));\n var _S61 : LinkVertex_0;\n if(present_2)\n {\n _S61 = v_3;\n }\n else\n {\n _S61 = start_0;\n }\n return _S61;\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\nstruct VsOut_0\n{\n @builtin(position) position_0 : vec4<f32>,\n @location(0) color_2 : vec4<f32>,\n @location(1) local_1 : vec2<f32>,\n @interpolate(flat) @location(2) radii_1 : vec2<f32>,\n @interpolate(flat) @location(3) kind_1 : f32,\n @interpolate(flat) @location(4) halfWidthPx_3 : f32,\n @location(5) legSide_1 : f32,\n};\n\nstruct vertexInput_0\n{\n @location(0) x_6 : u32,\n @location(1) x2_1 : u32,\n @location(2) x2Region_1 : u32,\n @location(3) y_2 : f32,\n @location(4) size_1 : f32,\n @location(5) color_3 : u32,\n @location(6) row_2 : u32,\n @location(7) feet_2 : u32,\n};\n\nfn markScaleColor_0( _S62 : texture_2d<f32>, _S63 : sampler, _S64 : u32, _S65 : i32, _S66 : f32, _S67 : f32, _S68 : f32, _S69 : i32, _S70 : vec4<f32>, _S71 : vec4<f32>) -> vec4<f32>\n{\n if(_S65 == i32(0))\n {\n return unpackRGBA_0(_S64);\n }\n if(_S64 == u32(2143289345))\n {\n return unpackRGBA_0(u32(4289703855));\n }\n var scaleType_6 : i32;\n if(((_S64 & (u32(2139095040)))) == u32(2139095040))\n {\n if(((_S64 & (u32(8388607)))) != u32(0))\n {\n return unpackRGBA_0(u32(4286611584));\n }\n var negative_0 : bool = ((_S64 & (u32(2147483648)))) != u32(0);\n if(_S65 == i32(3))\n {\n if(negative_0)\n {\n scaleType_6 = i32(0);\n }\n else\n {\n scaleType_6 = _S69;\n }\n return u_0.colorBands_0[scaleType_6];\n }\n var _S72 : f32;\n if(negative_0)\n {\n _S72 = 0.0f;\n }\n else\n {\n _S72 = 1.0f;\n }\n return rampColor_0(_S62, _S63, rampMidT_0(_S72, _S68));\n }\n var value_6 : f32 = (bitcast<f32>((_S64)));\n if(_S65 == i32(3))\n {\n return u_0.colorBands_0[thresholdBand_0(value_6, _S69, _S70, _S71)];\n }\n if(_S65 == i32(2))\n {\n scaleType_6 = i32(1);\n }\n else\n {\n scaleType_6 = i32(0);\n }\n return rampColor_0(_S62, _S63, rampMidT_0(normalizeScore_0(value_6, _S66, _S67, scaleType_6, 1.0f), _S68));\n}\n\n@vertex\nfn vs_main( _S73 : vertexInput_0, @builtin(vertex_index) vid_0 : u32) -> VsOut_0\n{\n var _S74 : LinkInstance_0 = LinkInstance_0( _S73.x_6, _S73.x2_1, _S73.x2Region_1, _S73.y_2, _S73.size_1, _S73.color_3, _S73.row_2, _S73.feet_2 );\n var _S75 : RowPlacement_0 = rowTableLookup_0(rowTable_texture_0, rowTable_sampler_0, _S73.row_2, u_0.rowTableKeys_0, markScaleColor_0(colorRamp_texture_0, colorRamp_sampler_0, _S73.color_3, 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 var e_5 : LinkEnv_0;\n var _S76 : f32 = 0.5f * linkStrokeWidthPx_0(_S73.size_1, u_0.sizeMode_0, u_0.sizeConstantPx_0, u_0.sizeDomainMin_0, u_0.sizeDomainMax_0, u_0.sizeScaleType_0, u_0.sizeRangeMin_0, u_0.sizeRangeMax_0, u_0.devicePixelRatio_0);\n e_5.strokeHalf_0 = _S76;\n e_5.hw_0 = _S76 + aaHalfPx_0(u_0.devicePixelRatio_0);\n e_5.baseY_0 = linkBaseYPx_0(u_0.rowOffsetPx_0, u_0.rowHeight_0, _S75.slot_0, u_0.reverse_0);\n var _S77 : f32;\n if((u_0.reverse_0) != i32(0))\n {\n _S77 = -1.0f;\n }\n else\n {\n _S77 = 1.0f;\n }\n e_5.ySign_0 = _S77;\n e_5.reach_1 = max(u_0.rowHeight_0 - u_0.insetPx_0, 0.0f);\n e_5.xPx_0 = viewRegionPx_0(_S73.x_6, u_0.ownEntry_0, u_0.zero_0);\n var _S78 : bool = (_S73.x2Region_1) < (u_0.regionCount_0);\n e_5.placed_0 = _S78;\n if(_S78)\n {\n _S77 = viewRegionPx_0(_S73.x2_1, u_0.regionTable_0[_S73.x2Region_1], u_0.zero_0);\n }\n else\n {\n _S77 = e_5.xPx_0;\n }\n e_5.x2Px_0 = _S77;\n var curveVerts_0 : u32 = (u_0.curveSegments_0 + u32(1)) * u32(2);\n var v_4 : LinkVertex_0;\n if(vid_0 < curveVerts_0)\n {\n var _S79 : LinkEnv_0 = e_5;\n var _S80 : u32 = vid_0 / u32(2);\n if((vid_0 % u32(2)) == u32(0))\n {\n _S77 = -1.0f;\n }\n else\n {\n _S77 = 1.0f;\n }\n v_4 = curveVertex_0(_S74, _S79, _S80, _S77);\n }\n else\n {\n var j_0 : u32 = vid_0 - curveVerts_0;\n v_4 = footVertex_0(_S74, e_5, j_0 / u32(6), j_0 % u32(6));\n }\n var o_0 : VsOut_0;\n var _S81 : bool;\n if((_S73.x2Region_1) == u32(4294967294))\n {\n _S81 = true;\n }\n else\n {\n _S81 = _S75.hidden_0;\n }\n var _S82 : vec4<f32>;\n if(_S81)\n {\n _S82 = vec4<f32>(-2.0f, -2.0f, 0.0f, 1.0f);\n }\n else\n {\n _S82 = vec4<f32>(v_4.screen_0.x / u_0.canvasWidth_0 * 2.0f - 1.0f, yPxToClipY_0(v_4.screen_0.y, u_0.canvasHeight_0), 0.0f, 1.0f);\n }\n o_0.position_0 = _S82;\n o_0.color_2 = _S75.color_0;\n o_0.local_1 = v_4.local_0;\n o_0.radii_1 = v_4.radii_0;\n o_0.kind_1 = v_4.kind_0;\n o_0.halfWidthPx_3 = e_5.strokeHalf_0;\n o_0.legSide_1 = v_4.legSide_0;\n return o_0;\n}\n\nfn farDomeDistSq_0( u_4 : f32, dPx_1 : f32, hPx_0 : f32, rx_2 : f32, ry_1 : f32) -> f32\n{\n var ox_0 : f32 = 2.0f * rx_2 * u_4 * u_4 - dPx_1;\n var oy_0 : f32 = 2.0f * ry_1 * u_4 * sqrt(max(1.0f - u_4 * u_4, 0.0f)) - hPx_0;\n return ox_0 * ox_0 + oy_0 * oy_0;\n}\n\nfn farDomeStep_0( u_5 : f32, dPx_2 : f32, hPx_1 : f32, rx_3 : f32, ry_2 : f32) -> f32\n{\n var w_2 : f32 = sqrt(max(1.0f - u_5 * u_5, 9.99999997475242708e-07f));\n var ox_1 : f32 = 2.0f * rx_3 * u_5 * u_5 - dPx_2;\n var _S83 : f32 = 2.0f * ry_2;\n var _S84 : f32 = _S83 * u_5;\n var oy_1 : f32 = _S84 * w_2 - hPx_1;\n var _S85 : f32 = 4.0f * rx_3;\n var dx_0 : f32 = _S85 * u_5;\n var _S86 : f32 = 2.0f * u_5 * u_5;\n var dy_0 : f32 = _S83 * (1.0f - _S86) / w_2;\n var whole_0 : f32 = clamp(u_5 - (ox_1 * dx_0 + oy_1 * dy_0) / max(dx_0 * dx_0 + dy_0 * dy_0 + ox_1 * _S85 + oy_1 * (_S84 * (_S86 - 3.0f) / (w_2 * w_2 * w_2)), 9.999999960041972e-13f), 0.0f, 0.99900001287460327f);\n var half_2 : f32 = 0.5f * (u_5 + whole_0);\n var here_0 : f32 = ox_1 * ox_1 + oy_1 * oy_1;\n var _S87 : f32;\n if((farDomeDistSq_0(whole_0, dPx_2, hPx_1, rx_3, ry_2)) < here_0)\n {\n _S87 = whole_0;\n }\n else\n {\n if((farDomeDistSq_0(half_2, dPx_2, hPx_1, rx_3, ry_2)) < here_0)\n {\n _S87 = half_2;\n }\n else\n {\n _S87 = u_5;\n }\n }\n return _S87;\n}\n\nfn farDomeDistancePx_0( dPx_3 : f32, hPx_2 : f32, rxPx_2 : f32, ryPx_1 : f32) -> f32\n{\n var _S88 : f32 = max(rxPx_2, 9.99999997475242708e-07f);\n var _S89 : f32 = max(ryPx_1, 9.99999997475242708e-07f);\n var q_0 : f32 = clamp(hPx_2 / _S89, 0.0f, 1.0f);\n var c_4 : f32 = sqrt(1.0f - q_0 * q_0);\n var uH_0 : f32;\n if(dPx_3 > _S88)\n {\n uH_0 = sqrt(0.5f * (1.0f + c_4));\n }\n else\n {\n uH_0 = q_0 / sqrt(2.0f * (1.0f + c_4));\n }\n var uD_0 : f32 = sqrt(clamp(dPx_3 / (2.0f * _S88), 0.0f, 1.0f));\n var u_6 : f32;\n if((farDomeDistSq_0(uH_0, dPx_3, hPx_2, _S88, _S89)) < (farDomeDistSq_0(uD_0, dPx_3, hPx_2, _S88, _S89)))\n {\n u_6 = uH_0;\n }\n else\n {\n u_6 = uD_0;\n }\n return sqrt(farDomeDistSq_0(farDomeStep_0(farDomeStep_0(farDomeStep_0(farDomeStep_0(u_6, dPx_3, hPx_2, _S88, _S89), dPx_3, hPx_2, _S88, _S89), dPx_3, hPx_2, _S88, _S89), dPx_3, hPx_2, _S88, _S89), dPx_3, hPx_2, _S88, _S89));\n}\n\nfn distToWideCirclePx_0( x_7 : f32, y_3 : f32, r_1 : f32) -> f32\n{\n var rk_0 : f32 = 2.0f * x_7 + (x_7 * x_7 + y_3 * y_3) / r_1;\n return abs(rk_0 / (sqrt(max(1.0f + rk_0 / r_1, 0.0f)) + 1.0f));\n}\n\nfn distToWideCircle_0( legLocal_0 : vec2<f32>, r_2 : f32) -> f32\n{\n return distToWideCirclePx_0(legLocal_0.x, legLocal_0.y, r_2);\n}\n\nfn nearCircleDistancePx_0( qx_0 : f32, qy_0 : f32, ax_1 : f32, ay_1 : f32) -> f32\n{\n var kx_0 : f32 = qx_0 / ax_1;\n var ky_0 : f32 = qy_0 / ay_1;\n var k_2 : f32 = sqrt(kx_0 * kx_0 + ky_0 * ky_0);\n var gx_1 : f32 = qx_0 / (ax_1 * ax_1);\n var gy_1 : f32 = qy_0 / (ay_1 * ay_1);\n return abs(k_2 * (k_2 - 1.0f) / max(sqrt(gx_1 * gx_1 + gy_1 * gy_1), 9.99999968265522539e-21f));\n}\n\nfn sdEllipse_0( p_1 : vec2<f32>, radii_2 : vec2<f32>) -> f32\n{\n var q_1 : vec2<f32> = abs(p_1);\n var ab_0 : vec2<f32>;\n var q_2 : vec2<f32>;\n if((q_1.x) > (q_1.y))\n {\n var _S90 : vec2<f32> = q_1.yx;\n ab_0 = radii_2.yx;\n q_2 = _S90;\n }\n else\n {\n ab_0 = radii_2;\n q_2 = q_1;\n }\n if((dot(ab_0, ab_0)) <= 0.0f)\n {\n return length(q_2);\n }\n var _S91 : f32 = ab_0.y;\n var _S92 : f32 = ab_0.x;\n var l_0 : f32 = _S91 * _S91 - _S92 * _S92;\n if((abs(l_0)) < (0.05000000074505806f * _S91 * _S91))\n {\n return nearCircleDistancePx_0(q_2.x, q_2.y, _S92, _S91);\n }\n var m_1 : f32 = _S92 * q_2.x / l_0;\n var m2_0 : f32 = m_1 * m_1;\n var n_1 : f32 = _S91 * q_2.y / l_0;\n var n2_0 : f32 = n_1 * n_1;\n var c_5 : f32 = (m2_0 + n2_0 - 1.0f) / 3.0f;\n var c3_0 : f32 = c_5 * c_5 * c_5;\n var _S93 : f32 = m2_0 * n2_0;\n var d_3 : f32 = c3_0 + _S93;\n var g_0 : f32 = m_1 + m_1 * n2_0;\n var co_0 : f32;\n if(d_3 < 0.0f)\n {\n var h_5 : f32 = acos(clamp((c3_0 + _S93 * 2.0f) / c3_0, -1.0f, 1.0f)) / 3.0f;\n var s_1 : f32 = cos(h_5);\n var t_4 : f32 = sin(h_5) * sqrt(3.0f);\n var _S94 : f32 = - c_5;\n var rx_4 : f32 = sqrt(max(_S94 * (s_1 + t_4 + 2.0f) + m2_0, 0.0f));\n var ry_3 : f32 = sqrt(max(_S94 * (s_1 - t_4 + 2.0f) + m2_0, 0.0f));\n co_0 = (ry_3 + f32((i32(sign((l_0))))) * rx_4 + abs(g_0) / max(rx_4 * ry_3, 9.99999968265522539e-21f) - m_1) / 2.0f;\n }\n else\n {\n var w_3 : f32 = c3_0 + _S93 * 2.0f + 2.0f * m_1 * n_1 * sqrt(d_3);\n var aw_0 : f32 = abs(w_3);\n var _S95 : f32 = f32((i32(sign((w_3)))));\n var s_2 : f32 = _S95 * pow(aw_0, 0.3333333432674408f);\n if(aw_0 > 0.0f)\n {\n co_0 = _S95 * pow(c3_0 * (c3_0 / aw_0), 0.3333333432674408f);\n }\n else\n {\n co_0 = 0.0f;\n }\n var rx_5 : f32 = - s_2 - co_0 - c_5 * 4.0f + 2.0f * m2_0;\n var ry_4 : f32 = (s_2 - co_0) * sqrt(3.0f);\n var rm_0 : f32 = sqrt(rx_5 * rx_5 + ry_4 * ry_4);\n co_0 = (ry_4 / sqrt(max(rm_0 - rx_5, 9.99999968265522539e-21f)) + 2.0f * g_0 / max(rm_0, 9.99999968265522539e-21f) - m_1) / 2.0f;\n }\n var co_1 : f32 = clamp(co_0, -1.0f, 1.0f);\n return length(ab_0 * vec2<f32>(co_1, sqrt(max(1.0f - co_1 * co_1, 0.0f))) - q_2);\n}\n\nfn linkDistance_0( i_2 : VsOut_0) -> f32\n{\n if((i_2.kind_1) >= 2.5f)\n {\n var _S96 : f32 = i_2.local_1.x;\n return length(vec2<f32>(_S96 - clamp(_S96, 0.0f, i_2.radii_1.x), i_2.local_1.y));\n }\n if((i_2.kind_1) >= 1.5f)\n {\n var _S97 : f32 = i_2.local_1.y;\n return length(vec2<f32>(i_2.local_1.x, _S97 - clamp(_S97, - i_2.radii_1.y, 0.0f)));\n }\n if((i_2.kind_1) >= 0.5f)\n {\n var _S98 : f32 = i_2.radii_1.y;\n var _S99 : f32 = i_2.radii_1.x;\n var _S100 : f32;\n if(_S98 < _S99)\n {\n _S100 = farDomeDistancePx_0(- i_2.local_1.x, - i_2.local_1.y, _S99, _S98);\n }\n else\n {\n _S100 = distToWideCircle_0(i_2.local_1, _S99);\n }\n return _S100;\n }\n return sdEllipse_0(i_2.local_1, i_2.radii_1);\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 edgeCoverage_0( signedInkCssPx_0 : f32, dpr_3 : f32) -> f32\n{\n return aaRamp_0(signedInkCssPx_0, aaPx_0(dpr_3));\n}\n\nfn linkDashAlong_0( i_3 : VsOut_0) -> f32\n{\n if((i_3.kind_1) >= 3.5f)\n {\n return -1.0f;\n }\n if((i_3.kind_1) >= 2.5f)\n {\n return i_3.local_1.x;\n }\n if((i_3.kind_1) >= 1.5f)\n {\n return - i_3.local_1.y;\n }\n return -1.0f;\n}\n\nfn dashCoverageAt_0( coord_0 : f32, dashPx_1 : f32, gapPx_1 : f32, aaPx_1 : f32) -> f32\n{\n var period_0 : f32 = dashPx_1 + gapPx_1;\n var shifted_0 : f32 = coord_0 + gapPx_1 * 0.5f;\n return aaRamp_0(dashPx_1 * 0.5f - abs(shifted_0 - period_0 * floor(shifted_0 / period_0) - period_0 * 0.5f), aaPx_1);\n}\n\nfn dashCoverage_0( coord_1 : f32, dashPx_2 : f32, gapPx_2 : f32, dpr_4 : f32) -> f32\n{\n return dashCoverageAt_0(coord_1, dashPx_2, gapPx_2, aaPx_0(dpr_4));\n}\n\nfn linkDash_0( i_4 : VsOut_0) -> f32\n{\n var along_3 : f32 = linkDashAlong_0(i_4);\n var _S101 : bool;\n if((u_0.dashPx_0) > 0.0f)\n {\n _S101 = along_3 >= 0.0f;\n }\n else\n {\n _S101 = false;\n }\n var _S102 : f32;\n if(_S101)\n {\n _S102 = dashCoverage_0(along_3, u_0.dashPx_0, u_0.gapPx_0, u_0.devicePixelRatio_0);\n }\n else\n {\n _S102 = 1.0f;\n }\n return _S102;\n}\n\nstruct pixelOutput_0\n{\n @location(0) output_0 : vec4<f32>,\n};\n\nstruct pixelInput_0\n{\n @location(0) color_4 : vec4<f32>,\n @location(1) local_2 : vec2<f32>,\n @interpolate(flat) @location(2) radii_3 : vec2<f32>,\n @interpolate(flat) @location(3) kind_2 : f32,\n @interpolate(flat) @location(4) halfWidthPx_4 : f32,\n @location(5) legSide_2 : f32,\n};\n\n@fragment\nfn fs_main( _S103 : pixelInput_0, @builtin(position) position_1 : vec4<f32>) -> pixelOutput_0\n{\n var _S104 : VsOut_0 = VsOut_0( position_1, _S103.color_4, _S103.local_2, _S103.radii_3, _S103.kind_2, _S103.halfWidthPx_4, _S103.legSide_2 );\n if((abs(_S103.legSide_2)) < 0.99900001287460327f)\n {\n discard;\n }\n var _S105 : pixelOutput_0 = pixelOutput_0( vec4<f32>(_S103.color_4.xyz, _S103.color_4.w * (edgeCoverage_0(_S103.halfWidthPx_4 - linkDistance_0(_S104), u_0.devicePixelRatio_0) * linkDash_0(_S104))) );\n return _S105;\n}\n\n"
|