@jbrowse/render-core 5.0.0-beta.1 → 5.0.0-beta.10
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/RenderCanvas.d.ts +2 -2
- package/esm/RenderLifecycleMixin.d.ts +52 -20
- package/esm/RenderLifecycleMixin.js +89 -23
- package/esm/canvas2dUtils.d.ts +90 -23
- package/esm/canvas2dUtils.js +119 -36
- package/esm/colorRampLut.d.ts +5 -5
- package/esm/colorRampLut.js +6 -6
- package/esm/computePipeline.d.ts +14 -0
- package/esm/computePipeline.js +62 -0
- package/esm/contractReports.d.ts +54 -0
- package/esm/contractReports.js +112 -0
- package/esm/coverageBand.d.ts +13 -8
- package/esm/coverageBand.js +15 -5
- package/esm/coverageBandBuffers.d.ts +2 -9
- package/esm/coverageBandBuffers.js +1 -13
- package/esm/createRenderingBackend.d.ts +14 -18
- package/esm/createRenderingBackend.js +4 -2
- package/esm/displayPhase.d.ts +83 -104
- package/esm/displayPhase.js +42 -82
- package/esm/encodeMemo.d.ts +14 -0
- package/esm/encodeMemo.js +48 -0
- package/esm/gpuContextLostError.d.ts +30 -0
- package/esm/gpuContextLostError.js +40 -0
- package/esm/gpuDevice.d.ts +29 -10
- package/esm/gpuDevice.js +35 -16
- package/esm/graphicsCapabilities.d.ts +27 -19
- package/esm/graphicsCapabilities.js +40 -18
- package/esm/hal/createHal.d.ts +4 -5
- package/esm/hal/createHal.js +14 -4
- package/esm/hal/deviceGpuCache.d.ts +25 -30
- package/esm/hal/deviceGpuCache.js +88 -97
- package/esm/hal/gpuHalBase.d.ts +5 -4
- package/esm/hal/gpuHalBase.js +25 -14
- package/esm/hal/index.d.ts +2 -2
- package/esm/hal/index.js +1 -1
- package/esm/hal/mockHal.d.ts +15 -10
- package/esm/hal/mockHal.js +31 -18
- package/esm/hal/oomReporter.d.ts +7 -0
- package/esm/hal/oomReporter.js +10 -0
- package/esm/hal/passIds.d.ts +8 -7
- package/esm/hal/passIds.js +11 -10
- package/esm/hal/regionRegistry.d.ts +0 -1
- package/esm/hal/regionRegistry.js +3 -15
- package/esm/hal/types.d.ts +55 -18
- package/esm/hal/webgl2Hal.d.ts +23 -6
- package/esm/hal/webgl2Hal.js +161 -155
- package/esm/hal/webgpuHal.d.ts +29 -13
- package/esm/hal/webgpuHal.js +221 -153
- package/esm/installUpload.d.ts +16 -3
- package/esm/installUpload.js +13 -41
- package/esm/instanceCache.d.ts +10 -7
- package/esm/instanceCache.js +14 -15
- package/esm/instancePass.d.ts +2 -1
- package/esm/mapUploadSync.d.ts +2 -10
- package/esm/mapUploadSync.js +2 -3
- package/esm/marks/barMark.d.ts +30 -0
- package/esm/marks/barMark.js +149 -0
- package/esm/marks/colorFill.d.ts +17 -0
- package/esm/marks/colorFill.js +26 -0
- package/esm/marks/drawAgainstHit.d.ts +113 -0
- package/esm/marks/drawAgainstHit.js +407 -0
- package/esm/marks/ellipseDistance.d.ts +10 -0
- package/esm/marks/ellipseDistance.js +136 -0
- package/esm/marks/glyphPaint.d.ts +36 -0
- package/esm/marks/glyphPaint.js +77 -0
- package/esm/marks/index.d.ts +33 -0
- package/esm/marks/index.js +20 -0
- package/esm/marks/lineMark.d.ts +37 -0
- package/esm/marks/lineMark.js +416 -0
- package/esm/marks/linkMark.d.ts +76 -0
- package/esm/marks/linkMark.js +585 -0
- package/esm/marks/markBackend.d.ts +118 -0
- package/esm/marks/markBackend.js +196 -0
- package/esm/marks/markHit.d.ts +32 -0
- package/esm/marks/markHit.js +61 -0
- package/esm/marks/markInk.d.ts +18 -0
- package/esm/marks/markInk.js +71 -0
- package/esm/marks/markPaint.d.ts +14 -0
- package/esm/marks/markPaint.js +32 -0
- package/esm/marks/markPlan.d.ts +25 -0
- package/esm/marks/markPlan.js +20 -0
- package/esm/marks/markRamp.d.ts +72 -0
- package/esm/marks/markRamp.js +197 -0
- package/esm/marks/nearestMarkHit.d.ts +55 -0
- package/esm/marks/nearestMarkHit.js +158 -0
- package/esm/marks/pathRecorder.d.ts +14 -0
- package/esm/marks/pathRecorder.js +80 -0
- package/esm/marks/pointMark.d.ts +42 -0
- package/esm/marks/pointMark.js +125 -0
- package/esm/marks/rowLane.d.ts +39 -0
- package/esm/marks/rowLane.js +41 -0
- package/esm/marks/rowSpanIndex.d.ts +29 -0
- package/esm/marks/rowSpanIndex.js +141 -0
- package/esm/marks/rowTable.d.ts +41 -0
- package/esm/marks/rowTable.js +75 -0
- package/esm/marks/ruleMark.d.ts +21 -0
- package/esm/marks/ruleMark.js +91 -0
- package/esm/marks/spanMark.d.ts +42 -0
- package/esm/marks/spanMark.js +81 -0
- package/esm/marks/types.d.ts +261 -0
- package/esm/marks/types.js +175 -0
- package/esm/marks/valueScale.d.ts +23 -0
- package/esm/marks/valueScale.js +11 -0
- package/esm/namedReactions.d.ts +3 -4
- package/esm/namedReactions.js +3 -4
- package/esm/perRegionRenderingBackend.d.ts +21 -3
- package/esm/perRegionRenderingBackend.js +37 -3
- package/esm/regionDataMap.d.ts +2 -2
- package/esm/regionDataMap.js +25 -23
- package/esm/renderBlock.d.ts +14 -0
- package/esm/renderBlock.js +25 -0
- package/esm/renderingBackendBase.d.ts +20 -14
- package/esm/renderingBackendBase.js +12 -7
- package/esm/scoreScale.d.ts +27 -0
- package/esm/scoreScale.js +88 -0
- package/esm/shaders/barMark.generated.d.ts +3 -0
- package/esm/shaders/barMark.generated.js +7 -0
- package/esm/shaders/barMark.glsl.generated.d.ts +2 -0
- package/esm/shaders/barMark.glsl.generated.js +4 -0
- package/esm/shaders/barMark.iface.generated.d.ts +90 -0
- package/esm/shaders/barMark.iface.generated.js +205 -0
- package/esm/shaders/barMark.wgsl.generated.d.ts +1 -0
- package/esm/shaders/barMark.wgsl.generated.js +3 -0
- package/esm/shaders/capsule.js.generated.d.ts +1 -0
- package/esm/shaders/capsule.js.generated.js +11 -0
- package/esm/shaders/clipStrip.generated.d.ts +2 -0
- package/esm/shaders/clipStrip.generated.js +4 -0
- package/esm/shaders/clipStrip.js.generated.d.ts +1 -0
- package/esm/shaders/clipStrip.js.generated.js +21 -0
- package/esm/shaders/colorRampLut.js.generated.d.ts +1 -0
- package/esm/shaders/colorRampLut.js.generated.js +17 -0
- package/esm/shaders/coverageBar.generated.d.ts +2 -3
- package/esm/shaders/coverageBar.generated.js +4 -3
- package/esm/shaders/coverageBar.glsl.generated.d.ts +2 -0
- package/esm/shaders/coverageBar.glsl.generated.js +4 -0
- package/esm/shaders/coverageBar.iface.generated.js +1 -1
- package/esm/shaders/coverageBar.wgsl.generated.d.ts +1 -0
- package/esm/shaders/coverageBar.wgsl.generated.js +3 -0
- package/esm/shaders/coverageClip.generated.d.ts +3 -0
- package/esm/shaders/coverageClip.generated.js +7 -0
- package/esm/shaders/coverageClip.glsl.generated.d.ts +2 -0
- package/esm/shaders/coverageClip.glsl.generated.js +4 -0
- package/esm/shaders/coverageClip.iface.generated.d.ts +85 -0
- package/esm/shaders/coverageClip.iface.generated.js +114 -0
- package/esm/shaders/coverageClip.wgsl.generated.d.ts +1 -0
- package/esm/shaders/coverageClip.wgsl.generated.js +3 -0
- package/esm/shaders/coverageIndicator.generated.d.ts +2 -3
- package/esm/shaders/coverageIndicator.generated.js +4 -3
- package/esm/shaders/coverageIndicator.glsl.generated.d.ts +2 -0
- package/esm/shaders/coverageIndicator.glsl.generated.js +4 -0
- package/esm/shaders/coverageIndicator.iface.generated.js +1 -1
- package/esm/shaders/coverageIndicator.wgsl.generated.d.ts +1 -0
- package/esm/shaders/coverageIndicator.wgsl.generated.js +3 -0
- package/esm/shaders/coverageInterbase.generated.d.ts +2 -3
- package/esm/shaders/coverageInterbase.generated.js +4 -3
- package/esm/shaders/coverageInterbase.glsl.generated.d.ts +2 -0
- package/esm/shaders/coverageInterbase.glsl.generated.js +4 -0
- package/esm/shaders/coverageInterbase.iface.generated.js +1 -1
- package/esm/shaders/coverageInterbase.wgsl.generated.d.ts +1 -0
- package/esm/shaders/coverageInterbase.wgsl.generated.js +3 -0
- package/esm/shaders/coverageMod.generated.d.ts +2 -3
- package/esm/shaders/coverageMod.generated.js +4 -3
- package/esm/shaders/coverageMod.glsl.generated.d.ts +2 -0
- package/esm/shaders/coverageMod.glsl.generated.js +4 -0
- package/esm/shaders/coverageMod.iface.generated.js +1 -1
- package/esm/shaders/coverageMod.wgsl.generated.d.ts +1 -0
- package/esm/shaders/coverageMod.wgsl.generated.js +3 -0
- package/esm/shaders/coverageSnp.generated.d.ts +2 -3
- package/esm/shaders/coverageSnp.generated.js +4 -3
- package/esm/shaders/coverageSnp.glsl.generated.d.ts +2 -0
- package/esm/shaders/coverageSnp.glsl.generated.js +4 -0
- package/esm/shaders/coverageSnp.iface.generated.js +1 -1
- package/esm/shaders/coverageSnp.wgsl.generated.d.ts +1 -0
- package/esm/shaders/coverageSnp.wgsl.generated.js +3 -0
- package/esm/shaders/curveDistance.js.generated.d.ts +5 -0
- package/esm/shaders/curveDistance.js.generated.js +87 -0
- package/esm/shaders/hpmath.js.generated.d.ts +2 -1
- package/esm/shaders/hpmath.js.generated.js +5 -2
- package/esm/shaders/lineCenterMark.generated.d.ts +3 -0
- package/esm/shaders/lineCenterMark.generated.js +7 -0
- package/esm/shaders/lineCenterMark.glsl.generated.d.ts +2 -0
- package/esm/shaders/lineCenterMark.glsl.generated.js +4 -0
- package/esm/shaders/lineCenterMark.iface.generated.d.ts +104 -0
- package/esm/shaders/lineCenterMark.iface.generated.js +237 -0
- package/esm/shaders/lineCenterMark.wgsl.generated.d.ts +1 -0
- package/esm/shaders/lineCenterMark.wgsl.generated.js +3 -0
- package/esm/shaders/lineCommon.generated.d.ts +2 -0
- package/esm/shaders/lineCommon.generated.js +4 -0
- package/esm/shaders/lineStepMark.generated.d.ts +3 -0
- package/esm/shaders/lineStepMark.generated.js +7 -0
- package/esm/shaders/lineStepMark.glsl.generated.d.ts +2 -0
- package/esm/shaders/lineStepMark.glsl.generated.js +4 -0
- package/esm/shaders/lineStepMark.iface.generated.d.ts +98 -0
- package/esm/shaders/lineStepMark.iface.generated.js +225 -0
- package/esm/shaders/lineStepMark.wgsl.generated.d.ts +1 -0
- package/esm/shaders/lineStepMark.wgsl.generated.js +3 -0
- package/esm/shaders/linkMark.consts.generated.d.ts +14 -0
- package/esm/shaders/linkMark.consts.generated.js +16 -0
- package/esm/shaders/linkMark.generated.d.ts +4 -0
- package/esm/shaders/linkMark.generated.js +8 -0
- package/esm/shaders/linkMark.glsl.generated.d.ts +2 -0
- package/esm/shaders/linkMark.glsl.generated.js +4 -0
- package/esm/shaders/linkMark.iface.generated.d.ts +142 -0
- package/esm/shaders/linkMark.iface.generated.js +1829 -0
- package/esm/shaders/linkMark.js.generated.d.ts +7 -0
- package/esm/shaders/linkMark.js.generated.js +159 -0
- package/esm/shaders/linkMark.wgsl.generated.d.ts +1 -0
- package/esm/shaders/linkMark.wgsl.generated.js +3 -0
- package/esm/shaders/markColor.generated.d.ts +9 -0
- package/esm/shaders/markColor.generated.js +11 -0
- package/esm/shaders/pointGlyph.js.generated.d.ts +2 -0
- package/esm/shaders/pointGlyph.js.generated.js +15 -0
- package/esm/shaders/pointMark.consts.generated.d.ts +7 -0
- package/esm/shaders/pointMark.consts.generated.js +9 -0
- package/esm/shaders/pointMark.generated.d.ts +4 -0
- package/esm/shaders/pointMark.generated.js +8 -0
- package/esm/shaders/pointMark.glsl.generated.d.ts +2 -0
- package/esm/shaders/pointMark.glsl.generated.js +4 -0
- package/esm/shaders/pointMark.iface.generated.d.ts +98 -0
- package/esm/shaders/pointMark.iface.generated.js +219 -0
- package/esm/shaders/pointMark.js.generated.d.ts +3 -0
- package/esm/shaders/pointMark.js.generated.js +93 -0
- package/esm/shaders/pointMark.wgsl.generated.d.ts +1 -0
- package/esm/shaders/pointMark.wgsl.generated.js +3 -0
- package/esm/shaders/rowRect.generated.d.ts +0 -1
- package/esm/shaders/rowRect.generated.js +0 -1
- package/esm/shaders/rowTable.generated.d.ts +1 -0
- package/esm/shaders/rowTable.generated.js +3 -0
- package/esm/shaders/rowTable.js.generated.d.ts +5 -0
- package/esm/shaders/rowTable.js.generated.js +29 -0
- package/esm/shaders/scoreScale.generated.d.ts +2 -0
- package/esm/shaders/scoreScale.generated.js +4 -0
- package/esm/shaders/scoreScale.js.generated.d.ts +1 -0
- package/esm/shaders/scoreScale.js.generated.js +50 -23
- package/esm/shaders/spanMark.generated.d.ts +3 -0
- package/esm/shaders/spanMark.generated.js +7 -0
- package/esm/shaders/spanMark.glsl.generated.d.ts +2 -0
- package/esm/shaders/spanMark.glsl.generated.js +4 -0
- package/esm/shaders/spanMark.iface.generated.d.ts +81 -0
- package/esm/shaders/spanMark.iface.generated.js +215 -0
- package/esm/shaders/spanMark.wgsl.generated.d.ts +1 -0
- package/esm/shaders/spanMark.wgsl.generated.js +3 -0
- package/esm/sharedBackendKey.d.ts +18 -0
- package/esm/{keyedRenderingBackend.js → sharedBackendKey.js} +5 -0
- package/esm/slangPass.d.ts +18 -11
- package/esm/slangPass.js +12 -4
- package/esm/useGraphicsCapabilities.d.ts +1 -1
- package/esm/useGraphicsCapabilities.js +1 -1
- package/esm/useRenderingBackend.d.ts +13 -13
- package/esm/useRenderingBackend.js +58 -20
- package/esm/webgpuUtils.d.ts +3 -11
- package/esm/webgpuUtils.js +12 -33
- package/package.json +32 -7
- package/src/shaders/antialias.slang +46 -0
- package/src/shaders/arcHull.test.ts +267 -0
- package/src/shaders/barMark.generated.ts +11 -0
- package/src/shaders/barMark.glsl.generated.ts +6 -0
- package/src/shaders/barMark.iface.generated.ts +285 -0
- package/src/shaders/barMark.slang +167 -0
- package/src/shaders/barMark.wgsl.generated.ts +4 -0
- package/src/shaders/capsule.js.generated.ts +14 -0
- package/src/shaders/capsule.slang +12 -4
- package/src/shaders/clipStrip.generated.ts +6 -0
- package/src/shaders/clipStrip.js.generated.ts +22 -0
- package/src/shaders/clipStrip.slang +34 -0
- package/src/shaders/clipStrip.test.ts +39 -0
- package/src/shaders/colorPack.slang +5 -1
- package/src/shaders/colorRampLut.js.generated.ts +22 -0
- package/src/shaders/colorRampLut.slang +15 -1
- package/src/shaders/coverageBand.slang +64 -32
- package/src/shaders/coverageBar.generated.ts +6 -5
- package/src/shaders/coverageBar.glsl.generated.ts +6 -0
- package/src/shaders/coverageBar.iface.generated.ts +1 -1
- package/src/shaders/coverageBar.slang +10 -10
- package/src/shaders/coverageBar.wgsl.generated.ts +4 -0
- package/src/shaders/coverageClip.generated.ts +11 -0
- package/src/shaders/coverageClip.glsl.generated.ts +6 -0
- package/src/shaders/coverageClip.iface.generated.ts +172 -0
- package/src/shaders/coverageClip.slang +38 -0
- package/src/shaders/coverageClip.wgsl.generated.ts +4 -0
- package/src/shaders/coverageIndicator.generated.ts +6 -5
- package/src/shaders/coverageIndicator.glsl.generated.ts +6 -0
- package/src/shaders/coverageIndicator.iface.generated.ts +1 -1
- package/src/shaders/coverageIndicator.wgsl.generated.ts +4 -0
- package/src/shaders/coverageInterbase.generated.ts +6 -5
- package/src/shaders/coverageInterbase.glsl.generated.ts +6 -0
- package/src/shaders/coverageInterbase.iface.generated.ts +1 -1
- package/src/shaders/coverageInterbase.wgsl.generated.ts +4 -0
- package/src/shaders/coverageMod.generated.ts +6 -5
- package/src/shaders/coverageMod.glsl.generated.ts +6 -0
- package/src/shaders/coverageMod.iface.generated.ts +1 -1
- package/src/shaders/coverageMod.wgsl.generated.ts +4 -0
- package/src/shaders/coverageSnp.generated.ts +6 -5
- package/src/shaders/coverageSnp.glsl.generated.ts +6 -0
- package/src/shaders/coverageSnp.iface.generated.ts +1 -1
- package/src/shaders/coverageSnp.wgsl.generated.ts +4 -0
- package/src/shaders/curveDistance.js.generated.ts +91 -0
- package/src/shaders/curveDistance.slang +265 -0
- package/src/shaders/hpClampFloor.test.ts +87 -0
- package/src/shaders/hpmath.js.generated.ts +6 -2
- package/src/shaders/hpmath.slang +100 -48
- package/src/shaders/insetValueScale.test.ts +67 -0
- package/src/shaders/lineCenterMark.generated.ts +11 -0
- package/src/shaders/lineCenterMark.glsl.generated.ts +6 -0
- package/src/shaders/lineCenterMark.iface.generated.ts +328 -0
- package/src/shaders/lineCenterMark.slang +127 -0
- package/src/shaders/lineCenterMark.wgsl.generated.ts +4 -0
- package/src/shaders/lineCommon.generated.ts +6 -0
- package/src/shaders/lineCommon.slang +102 -0
- package/src/shaders/lineStepMark.generated.ts +11 -0
- package/src/shaders/lineStepMark.glsl.generated.ts +6 -0
- package/src/shaders/lineStepMark.iface.generated.ts +311 -0
- package/src/shaders/lineStepMark.slang +125 -0
- package/src/shaders/lineStepMark.wgsl.generated.ts +4 -0
- package/src/shaders/linkMark.consts.generated.ts +30 -0
- package/src/shaders/linkMark.generated.ts +12 -0
- package/src/shaders/linkMark.glsl.generated.ts +6 -0
- package/src/shaders/linkMark.iface.generated.ts +1954 -0
- package/src/shaders/linkMark.js.generated.ts +167 -0
- package/src/shaders/linkMark.slang +439 -0
- package/src/shaders/linkMark.wgsl.generated.ts +4 -0
- package/src/shaders/markColor.generated.ts +20 -0
- package/src/shaders/markColor.slang +128 -0
- package/src/shaders/pointGlyph.js.generated.ts +20 -0
- package/src/shaders/pointGlyph.slang +23 -7
- package/src/shaders/pointGlyphPad.test.ts +242 -0
- package/src/shaders/pointMark.consts.generated.ts +16 -0
- package/src/shaders/pointMark.generated.ts +12 -0
- package/src/shaders/pointMark.glsl.generated.ts +6 -0
- package/src/shaders/pointMark.iface.generated.ts +304 -0
- package/src/shaders/pointMark.js.generated.ts +99 -0
- package/src/shaders/pointMark.slang +227 -0
- package/src/shaders/pointMark.wgsl.generated.ts +4 -0
- package/src/shaders/rowRect.generated.ts +0 -2
- package/src/shaders/rowRect.slang +39 -58
- package/src/shaders/rowTable.generated.ts +4 -0
- package/src/shaders/rowTable.js.generated.ts +37 -0
- package/src/shaders/rowTable.slang +98 -0
- package/src/shaders/scoreScale.generated.ts +6 -0
- package/src/shaders/scoreScale.js.generated.ts +48 -23
- package/src/shaders/scoreScale.slang +49 -55
- package/src/shaders/sdEllipse.test.ts +211 -0
- package/src/shaders/spanMark.generated.ts +11 -0
- package/src/shaders/spanMark.glsl.generated.ts +6 -0
- package/src/shaders/spanMark.iface.generated.ts +289 -0
- package/src/shaders/spanMark.slang +77 -0
- package/src/shaders/spanMark.wgsl.generated.ts +4 -0
- package/src/shaders/valueScale.slang +26 -0
- package/src/shaders/wideCircleLeg.test.ts +85 -0
- package/esm/globalRenderingBackend.d.ts +0 -90
- package/esm/globalRenderingBackend.js +0 -53
- package/esm/keyedRenderingBackend.d.ts +0 -41
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
// AUTO-GENERATED by packages/shader-tools/src/shader-codegen from pointMark.slang.
|
|
2
|
+
// Do not edit. Run `pnpm gen:shaders` to regenerate.
|
|
3
|
+
|
|
4
|
+
import type { VertexAttributeLayout, ShaderBinding, TextureBinding } from '@jbrowse/render-core/hal'
|
|
5
|
+
|
|
6
|
+
export const BINDINGS: readonly ShaderBinding[] = [
|
|
7
|
+
{ index: 1, kind: 'uniform', name: 'u', stages: ['vertex'] },
|
|
8
|
+
{ index: 2, kind: 'texture', name: 'colorRamp', stages: ['vertex'] },
|
|
9
|
+
{ index: 3, kind: 'sampler', name: 'colorRamp', stages: ['vertex'] },
|
|
10
|
+
{ index: 4, kind: 'texture', name: 'rowTable', stages: ['vertex'] },
|
|
11
|
+
{ index: 5, kind: 'sampler', name: 'rowTable', stages: ['vertex'] },
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
export const VERTS_PER_INSTANCE = 6
|
|
15
|
+
|
|
16
|
+
export const UNIFORMS_SIZE_BYTES = 288
|
|
17
|
+
|
|
18
|
+
// Word indices into a Float32Array view over the uniform buffer.
|
|
19
|
+
export const UNIFORM_OFFSET_F32 = {
|
|
20
|
+
bpRangeX: 0,
|
|
21
|
+
canvasHeight: 3,
|
|
22
|
+
domainMin: 4,
|
|
23
|
+
domainMax: 5,
|
|
24
|
+
valueSymlogConstant: 7,
|
|
25
|
+
rampMin: 9,
|
|
26
|
+
rampMax: 10,
|
|
27
|
+
rampMidNorm: 11,
|
|
28
|
+
zero: 60,
|
|
29
|
+
viewportWidth: 61,
|
|
30
|
+
radiusPx: 62,
|
|
31
|
+
rowHeight: 63,
|
|
32
|
+
rowOffsetPx: 64,
|
|
33
|
+
insetPx: 66,
|
|
34
|
+
devicePixelRatio: 67,
|
|
35
|
+
minWidthPx: 70,
|
|
36
|
+
} as const
|
|
37
|
+
|
|
38
|
+
// Word indices into a Int32Array view over the uniform buffer.
|
|
39
|
+
export const UNIFORM_OFFSET_I32 = {
|
|
40
|
+
valueScaleType: 6,
|
|
41
|
+
rampMode: 8,
|
|
42
|
+
colorCutCount: 12,
|
|
43
|
+
reverse: 65,
|
|
44
|
+
rowTableKeys: 68,
|
|
45
|
+
rule: 69,
|
|
46
|
+
} as const
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
// Word indices of each array field’s elements, into a 4-byte-word
|
|
50
|
+
// view over the uniform buffer (Uint32Array or Float32Array — the
|
|
51
|
+
// field’s scalar type picks, same as UNIFORM_OFFSET_*). NOT
|
|
52
|
+
// consecutive: std140 pads every array element to 16 bytes.
|
|
53
|
+
export const UNIFORM_SLOT_ARRAYS = {
|
|
54
|
+
colorCuts: [16, 20] as const,
|
|
55
|
+
colorBands: [24, 28, 32, 36, 40, 44, 48, 52, 56] as const,
|
|
56
|
+
} as const
|
|
57
|
+
|
|
58
|
+
// Element `i` of the `colorCuts` uniform array (4 components).
|
|
59
|
+
export function setUniformColorCuts(
|
|
60
|
+
f32: Float32Array,
|
|
61
|
+
i: number,
|
|
62
|
+
v0: number,
|
|
63
|
+
v1: number,
|
|
64
|
+
v2: number,
|
|
65
|
+
v3: number,
|
|
66
|
+
) {
|
|
67
|
+
const o = UNIFORM_SLOT_ARRAYS.colorCuts[i]!
|
|
68
|
+
f32[o] = v0
|
|
69
|
+
f32[o + 1] = v1
|
|
70
|
+
f32[o + 2] = v2
|
|
71
|
+
f32[o + 3] = v3
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Element `i` of the `colorBands` uniform array (4 components).
|
|
75
|
+
export function setUniformColorBands(
|
|
76
|
+
f32: Float32Array,
|
|
77
|
+
i: number,
|
|
78
|
+
v0: number,
|
|
79
|
+
v1: number,
|
|
80
|
+
v2: number,
|
|
81
|
+
v3: number,
|
|
82
|
+
) {
|
|
83
|
+
const o = UNIFORM_SLOT_ARRAYS.colorBands[i]!
|
|
84
|
+
f32[o] = v0
|
|
85
|
+
f32[o + 1] = v1
|
|
86
|
+
f32[o + 2] = v2
|
|
87
|
+
f32[o + 3] = v3
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
export interface Uniforms {
|
|
92
|
+
bpRangeX: [number, number, number]
|
|
93
|
+
canvasHeight: number
|
|
94
|
+
domainMin: number
|
|
95
|
+
domainMax: number
|
|
96
|
+
valueScaleType: number
|
|
97
|
+
valueSymlogConstant: number
|
|
98
|
+
rampMode: number
|
|
99
|
+
rampMin: number
|
|
100
|
+
rampMax: number
|
|
101
|
+
rampMidNorm: number
|
|
102
|
+
colorCutCount: number
|
|
103
|
+
colorCuts: [[number, number, number, number], [number, number, number, number]]
|
|
104
|
+
colorBands: [[number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number]]
|
|
105
|
+
zero: number
|
|
106
|
+
viewportWidth: number
|
|
107
|
+
radiusPx: number
|
|
108
|
+
rowHeight: number
|
|
109
|
+
rowOffsetPx: number
|
|
110
|
+
reverse: number
|
|
111
|
+
insetPx: number
|
|
112
|
+
devicePixelRatio: number
|
|
113
|
+
rowTableKeys: number
|
|
114
|
+
rule: number
|
|
115
|
+
minWidthPx: number
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export function writeUniforms(buf: ArrayBuffer, uniforms: Uniforms) {
|
|
119
|
+
const f32 = new Float32Array(buf)
|
|
120
|
+
const i32 = new Int32Array(buf)
|
|
121
|
+
f32[0] = uniforms.bpRangeX[0]
|
|
122
|
+
f32[1] = uniforms.bpRangeX[1]
|
|
123
|
+
f32[2] = uniforms.bpRangeX[2]
|
|
124
|
+
f32[3] = uniforms.canvasHeight
|
|
125
|
+
f32[4] = uniforms.domainMin
|
|
126
|
+
f32[5] = uniforms.domainMax
|
|
127
|
+
i32[6] = uniforms.valueScaleType
|
|
128
|
+
f32[7] = uniforms.valueSymlogConstant
|
|
129
|
+
i32[8] = uniforms.rampMode
|
|
130
|
+
f32[9] = uniforms.rampMin
|
|
131
|
+
f32[10] = uniforms.rampMax
|
|
132
|
+
f32[11] = uniforms.rampMidNorm
|
|
133
|
+
i32[12] = uniforms.colorCutCount
|
|
134
|
+
f32[16] = uniforms.colorCuts[0][0]
|
|
135
|
+
f32[17] = uniforms.colorCuts[0][1]
|
|
136
|
+
f32[18] = uniforms.colorCuts[0][2]
|
|
137
|
+
f32[19] = uniforms.colorCuts[0][3]
|
|
138
|
+
f32[20] = uniforms.colorCuts[1][0]
|
|
139
|
+
f32[21] = uniforms.colorCuts[1][1]
|
|
140
|
+
f32[22] = uniforms.colorCuts[1][2]
|
|
141
|
+
f32[23] = uniforms.colorCuts[1][3]
|
|
142
|
+
f32[24] = uniforms.colorBands[0][0]
|
|
143
|
+
f32[25] = uniforms.colorBands[0][1]
|
|
144
|
+
f32[26] = uniforms.colorBands[0][2]
|
|
145
|
+
f32[27] = uniforms.colorBands[0][3]
|
|
146
|
+
f32[28] = uniforms.colorBands[1][0]
|
|
147
|
+
f32[29] = uniforms.colorBands[1][1]
|
|
148
|
+
f32[30] = uniforms.colorBands[1][2]
|
|
149
|
+
f32[31] = uniforms.colorBands[1][3]
|
|
150
|
+
f32[32] = uniforms.colorBands[2][0]
|
|
151
|
+
f32[33] = uniforms.colorBands[2][1]
|
|
152
|
+
f32[34] = uniforms.colorBands[2][2]
|
|
153
|
+
f32[35] = uniforms.colorBands[2][3]
|
|
154
|
+
f32[36] = uniforms.colorBands[3][0]
|
|
155
|
+
f32[37] = uniforms.colorBands[3][1]
|
|
156
|
+
f32[38] = uniforms.colorBands[3][2]
|
|
157
|
+
f32[39] = uniforms.colorBands[3][3]
|
|
158
|
+
f32[40] = uniforms.colorBands[4][0]
|
|
159
|
+
f32[41] = uniforms.colorBands[4][1]
|
|
160
|
+
f32[42] = uniforms.colorBands[4][2]
|
|
161
|
+
f32[43] = uniforms.colorBands[4][3]
|
|
162
|
+
f32[44] = uniforms.colorBands[5][0]
|
|
163
|
+
f32[45] = uniforms.colorBands[5][1]
|
|
164
|
+
f32[46] = uniforms.colorBands[5][2]
|
|
165
|
+
f32[47] = uniforms.colorBands[5][3]
|
|
166
|
+
f32[48] = uniforms.colorBands[6][0]
|
|
167
|
+
f32[49] = uniforms.colorBands[6][1]
|
|
168
|
+
f32[50] = uniforms.colorBands[6][2]
|
|
169
|
+
f32[51] = uniforms.colorBands[6][3]
|
|
170
|
+
f32[52] = uniforms.colorBands[7][0]
|
|
171
|
+
f32[53] = uniforms.colorBands[7][1]
|
|
172
|
+
f32[54] = uniforms.colorBands[7][2]
|
|
173
|
+
f32[55] = uniforms.colorBands[7][3]
|
|
174
|
+
f32[56] = uniforms.colorBands[8][0]
|
|
175
|
+
f32[57] = uniforms.colorBands[8][1]
|
|
176
|
+
f32[58] = uniforms.colorBands[8][2]
|
|
177
|
+
f32[59] = uniforms.colorBands[8][3]
|
|
178
|
+
f32[60] = uniforms.zero
|
|
179
|
+
f32[61] = uniforms.viewportWidth
|
|
180
|
+
f32[62] = uniforms.radiusPx
|
|
181
|
+
f32[63] = uniforms.rowHeight
|
|
182
|
+
f32[64] = uniforms.rowOffsetPx
|
|
183
|
+
i32[65] = uniforms.reverse
|
|
184
|
+
f32[66] = uniforms.insetPx
|
|
185
|
+
f32[67] = uniforms.devicePixelRatio
|
|
186
|
+
i32[68] = uniforms.rowTableKeys
|
|
187
|
+
i32[69] = uniforms.rule
|
|
188
|
+
f32[70] = uniforms.minWidthPx
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
export const INSTANCE_STRIDE_BYTES = 24
|
|
192
|
+
export const INSTANCE_STRIDE_WORDS = 6
|
|
193
|
+
|
|
194
|
+
// Word indices into a Float32Array view over the instance buffer.
|
|
195
|
+
export const INSTANCE_OFFSET_F32 = {
|
|
196
|
+
y: 2,
|
|
197
|
+
} as const
|
|
198
|
+
|
|
199
|
+
// Word indices into a Uint32Array view over the instance buffer.
|
|
200
|
+
export const INSTANCE_OFFSET_U32 = {
|
|
201
|
+
x: 0,
|
|
202
|
+
x2: 1,
|
|
203
|
+
color: 3,
|
|
204
|
+
glyph: 4,
|
|
205
|
+
row: 5,
|
|
206
|
+
} as const
|
|
207
|
+
|
|
208
|
+
export const VERTEX_ATTRIBUTES: readonly VertexAttributeLayout[] = [
|
|
209
|
+
{ name: 'a_x', components: 1, type: 'uint', offsetBytes: 0, integer: true },
|
|
210
|
+
{ name: 'a_x2', components: 1, type: 'uint', offsetBytes: 4, integer: true },
|
|
211
|
+
{ name: 'a_y', components: 1, type: 'float', offsetBytes: 8, integer: false },
|
|
212
|
+
{ name: 'a_color', components: 1, type: 'uint', offsetBytes: 12, integer: true },
|
|
213
|
+
{ name: 'a_glyph', components: 1, type: 'uint', offsetBytes: 16, integer: true },
|
|
214
|
+
{ name: 'a_row', components: 1, type: 'uint', offsetBytes: 20, integer: true },
|
|
215
|
+
]
|
|
216
|
+
|
|
217
|
+
export interface InstanceArrays {
|
|
218
|
+
x: ArrayLike<number>
|
|
219
|
+
x2: ArrayLike<number>
|
|
220
|
+
y: ArrayLike<number>
|
|
221
|
+
color: ArrayLike<number>
|
|
222
|
+
glyph: ArrayLike<number>
|
|
223
|
+
row: ArrayLike<number>
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
export function packInstances(
|
|
227
|
+
arrays: InstanceArrays,
|
|
228
|
+
numInstances: number,
|
|
229
|
+
buf: ArrayBuffer = new ArrayBuffer(numInstances * INSTANCE_STRIDE_BYTES),
|
|
230
|
+
) {
|
|
231
|
+
const f32 = new Float32Array(buf)
|
|
232
|
+
const u32 = new Uint32Array(buf)
|
|
233
|
+
const { x, x2, y, color, glyph, row } = arrays
|
|
234
|
+
for (let i = 0; i < numInstances; i++) {
|
|
235
|
+
const o = i * INSTANCE_STRIDE_WORDS
|
|
236
|
+
u32[o + 0] = x[i]!
|
|
237
|
+
u32[o + 1] = x2[i]!
|
|
238
|
+
f32[o + 2] = y[i]!
|
|
239
|
+
u32[o + 3] = color[i]!
|
|
240
|
+
u32[o + 4] = glyph[i]!
|
|
241
|
+
u32[o + 5] = row[i]!
|
|
242
|
+
}
|
|
243
|
+
return buf
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// Instance `i`'s `x`.
|
|
247
|
+
export function getInstanceX(u32: Uint32Array, i: number) {
|
|
248
|
+
return u32[i * INSTANCE_STRIDE_WORDS]!
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
export function setInstanceX(u32: Uint32Array, i: number, v: number) {
|
|
252
|
+
u32[i * INSTANCE_STRIDE_WORDS] = v
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
// Instance `i`'s `x2`.
|
|
256
|
+
export function getInstanceX2(u32: Uint32Array, i: number) {
|
|
257
|
+
return u32[i * INSTANCE_STRIDE_WORDS + 1]!
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
export function setInstanceX2(u32: Uint32Array, i: number, v: number) {
|
|
261
|
+
u32[i * INSTANCE_STRIDE_WORDS + 1] = v
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
// Instance `i`'s `y`.
|
|
265
|
+
export function getInstanceY(f32: Float32Array, i: number) {
|
|
266
|
+
return f32[i * INSTANCE_STRIDE_WORDS + 2]!
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
export function setInstanceY(f32: Float32Array, i: number, v: number) {
|
|
270
|
+
f32[i * INSTANCE_STRIDE_WORDS + 2] = v
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
// Instance `i`'s `color`.
|
|
274
|
+
export function getInstanceColor(u32: Uint32Array, i: number) {
|
|
275
|
+
return u32[i * INSTANCE_STRIDE_WORDS + 3]!
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
export function setInstanceColor(u32: Uint32Array, i: number, v: number) {
|
|
279
|
+
u32[i * INSTANCE_STRIDE_WORDS + 3] = v
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
// Instance `i`'s `glyph`.
|
|
283
|
+
export function getInstanceGlyph(u32: Uint32Array, i: number) {
|
|
284
|
+
return u32[i * INSTANCE_STRIDE_WORDS + 4]!
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
export function setInstanceGlyph(u32: Uint32Array, i: number, v: number) {
|
|
288
|
+
u32[i * INSTANCE_STRIDE_WORDS + 4] = v
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// Instance `i`'s `row`.
|
|
292
|
+
export function getInstanceRow(u32: Uint32Array, i: number) {
|
|
293
|
+
return u32[i * INSTANCE_STRIDE_WORDS + 5]!
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
export function setInstanceRow(u32: Uint32Array, i: number, v: number) {
|
|
297
|
+
u32[i * INSTANCE_STRIDE_WORDS + 5] = v
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
// Combined `Sampler2D` bindings. Texture unit indices start at 0.
|
|
301
|
+
export const TEXTURES: readonly [TextureBinding, ...TextureBinding[]] = [
|
|
302
|
+
{ name: 'colorRamp', glTextureUnit: 0, glUniformName: 'u_colorRamp', filter: 'linear' },
|
|
303
|
+
{ name: 'rowTable', glTextureUnit: 1, glUniformName: 'u_rowTable', filter: 'nearest' },
|
|
304
|
+
]
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
// AUTO-GENERATED by packages/shader-tools/src/shader-codegen from pointMark.slang.
|
|
2
|
+
// Do not edit. Run `pnpm gen:shaders` to regenerate.
|
|
3
|
+
|
|
4
|
+
// Scalar twins of pointMark.slang, transliterated from slangc's WGSL so
|
|
5
|
+
// the Canvas2D and SVG paths run the shader's own math. See adr-051.
|
|
6
|
+
|
|
7
|
+
function _clamp(x: number, lo: number, hi: number) {
|
|
8
|
+
return _min(_max(x, lo), hi)
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function _max(a: number, b: number) {
|
|
12
|
+
return b > a || Number.isNaN(a) ? b : a
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function _min(a: number, b: number) {
|
|
16
|
+
return b < a || Number.isNaN(a) ? b : a
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function log1pf(x: number): number {
|
|
20
|
+
let u = (1.0 + x)
|
|
21
|
+
let _t0: number
|
|
22
|
+
if ((u == 1.0)) {
|
|
23
|
+
_t0 = x
|
|
24
|
+
} else {
|
|
25
|
+
_t0 = (Math.log(u) * (x / (u - 1.0)))
|
|
26
|
+
}
|
|
27
|
+
return _t0
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function symlogTransform(x: number, c: number): number {
|
|
31
|
+
return ((((Math.sign(x)) | 0)) * log1pf(Math.abs((x / c))))
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function normalizeScoreUnclamped(score: number, domainMin: number, domainMax: number, scaleType: number, symlogConstant: number): number {
|
|
35
|
+
let tMax: number
|
|
36
|
+
let tMin: number
|
|
37
|
+
let t: number
|
|
38
|
+
if ((scaleType == 2)) {
|
|
39
|
+
let _t0 = symlogTransform(score, symlogConstant)
|
|
40
|
+
let _t1 = symlogTransform(domainMin, symlogConstant)
|
|
41
|
+
tMax = symlogTransform(domainMax, symlogConstant)
|
|
42
|
+
tMin = _t1
|
|
43
|
+
t = _t0
|
|
44
|
+
} else {
|
|
45
|
+
if ((scaleType == 1)) {
|
|
46
|
+
if ((domainMin > 0.0)) {
|
|
47
|
+
tMax = domainMin
|
|
48
|
+
} else {
|
|
49
|
+
tMax = 1.0
|
|
50
|
+
}
|
|
51
|
+
let _t2 = Math.log2(_max(score, tMax))
|
|
52
|
+
let _t3 = Math.log2(tMax)
|
|
53
|
+
tMax = Math.log2(_max(domainMax, tMax))
|
|
54
|
+
tMin = _t3
|
|
55
|
+
t = _t2
|
|
56
|
+
} else {
|
|
57
|
+
tMax = domainMax
|
|
58
|
+
tMin = domainMin
|
|
59
|
+
t = score
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
let tRange = (tMax - tMin)
|
|
63
|
+
if ((tRange <= 0.0)) {
|
|
64
|
+
if ((t > tMin)) {
|
|
65
|
+
tMax = 1.0
|
|
66
|
+
} else {
|
|
67
|
+
tMax = 0.0
|
|
68
|
+
}
|
|
69
|
+
return tMax
|
|
70
|
+
}
|
|
71
|
+
return ((t - tMin) / tRange)
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function normalizeScore(score: number, domainMin: number, domainMax: number, scaleType: number, symlogConstant: number): number {
|
|
75
|
+
return _clamp(normalizeScoreUnclamped(score, domainMin, domainMax, scaleType, symlogConstant), 0.0, 1.0)
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export function valueToYPxScaled(value: number, domainMin: number, domainMax: number, h: number, scaleType: number, symlogConstant: number): number {
|
|
79
|
+
return ((1.0 - normalizeScore(value, domainMin, domainMax, scaleType, symlogConstant)) * h)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function insetValueYPx(value: number, domainMin: number, domainMax: number, h: number, scaleType: number, insetPx: number, symlogConstant: number): number {
|
|
83
|
+
let _t0 = _min(insetPx, (h * 0.5))
|
|
84
|
+
return (_t0 + valueToYPxScaled(value, domainMin, domainMax, (h - (2.0 * _t0)), scaleType, symlogConstant))
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export function pointYPx(value: number, domainMin: number, domainMax: number, h: number, scaleType: number, insetPx: number, symlogConstant: number): number {
|
|
88
|
+
return insetValueYPx(value, domainMin, domainMax, h, scaleType, insetPx, symlogConstant)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export function pointRowYPx(bandTop: number, h: number, reverse: number, valueYPx: number): number {
|
|
92
|
+
let _t0: number
|
|
93
|
+
if ((reverse != 0)) {
|
|
94
|
+
_t0 = (h - valueYPx)
|
|
95
|
+
} else {
|
|
96
|
+
_t0 = valueYPx
|
|
97
|
+
}
|
|
98
|
+
return (bandTop + _t0)
|
|
99
|
+
}
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
// The `point` and `rule` shapes, at a y read off a per-instance value through
|
|
2
|
+
// `valueScale`. A point is one glyph at the centre of its x..x2 extent, the
|
|
3
|
+
// glyph channel picking a disc, an inverted triangle, a diamond or a square. A
|
|
4
|
+
// rule (`u.rule`) is a bar across the extent, `2 * radiusPx` thick and at least
|
|
5
|
+
// `minWidthPx` wide.
|
|
6
|
+
//
|
|
7
|
+
// Each is a 6-vertex quad; the fragment shader carves the glyph.
|
|
8
|
+
//
|
|
9
|
+
// `row` is read through the bound row table, as `spanMark` reads it: a key
|
|
10
|
+
// resolved to its band and colour, or dropped off clip space where the table
|
|
11
|
+
// hides it. A pass binding no table (`rowTableKeys` −1) draws `row` as the band.
|
|
12
|
+
//! targets: wgsl, glsl
|
|
13
|
+
//! export-consts: DIAMOND_GLYPH_SCALE, DIAMOND_MITER_REACHES, TRIANGLE_MITER_REACHES, GLYPH_DISC, GLYPH_TRIANGLE, GLYPH_DIAMOND, GLYPH_SQUARE
|
|
14
|
+
//! js-export: valueToYPxScaled, pointYPx, pointRowYPx
|
|
15
|
+
// `valueScale`'s twin is lifted here, once, for the bar shape too.
|
|
16
|
+
|
|
17
|
+
import antialias;
|
|
18
|
+
import hpmath;
|
|
19
|
+
import colorPack;
|
|
20
|
+
import markColor;
|
|
21
|
+
import pointGlyph;
|
|
22
|
+
import rowTable;
|
|
23
|
+
import valueScale;
|
|
24
|
+
|
|
25
|
+
public static const uint VERTS_PER_INSTANCE = 6u;
|
|
26
|
+
|
|
27
|
+
struct PointMarkInstance {
|
|
28
|
+
uint x : ATTR0;
|
|
29
|
+
uint x2 : ATTR1;
|
|
30
|
+
float y : ATTR2;
|
|
31
|
+
uint color : ATTR3;
|
|
32
|
+
uint glyph : ATTR4;
|
|
33
|
+
uint row : ATTR5;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
struct Uniforms {
|
|
37
|
+
float3 bpRangeX;
|
|
38
|
+
float canvasHeight;
|
|
39
|
+
float domainMin;
|
|
40
|
+
float domainMax;
|
|
41
|
+
// `scoreScale`'s scale-type vocabulary, for the declared y scale.
|
|
42
|
+
int valueScaleType;
|
|
43
|
+
// Already resolved from the domain (`resolveSymlogConstant`); read by symlog alone.
|
|
44
|
+
float valueSymlogConstant;
|
|
45
|
+
// `markColor`'s: 0 packs the instance's colour, 1 and 2 read its slot as a
|
|
46
|
+
// value through the ramp below.
|
|
47
|
+
int rampMode;
|
|
48
|
+
float rampMin;
|
|
49
|
+
float rampMax;
|
|
50
|
+
float rampMidNorm;
|
|
51
|
+
// `markColor`'s threshold: how many cuts are in use, the cuts four to a
|
|
52
|
+
// vector, and the colour of each interval between them.
|
|
53
|
+
int colorCutCount;
|
|
54
|
+
float4 colorCuts[2];
|
|
55
|
+
float4 colorBands[MAX_COLOR_BANDS];
|
|
56
|
+
float zero;
|
|
57
|
+
float viewportWidth;
|
|
58
|
+
float radiusPx;
|
|
59
|
+
// CSS px per row band, the value scale ruling each on its own; the canvas
|
|
60
|
+
// height where every instance is on row 0 (ADR-126).
|
|
61
|
+
float rowHeight;
|
|
62
|
+
float rowOffsetPx;
|
|
63
|
+
// Whether the domain's minimum sits at the band's top.
|
|
64
|
+
int reverse;
|
|
65
|
+
// Ends of the value range, inset by `glyphPaint`'s `pointInsetPx` where the
|
|
66
|
+
// display wants its edge glyphs whole; 0 centres a point on the plot's edge.
|
|
67
|
+
float insetPx;
|
|
68
|
+
// Read by the glyph pad alone; every other length in this block is CSS px.
|
|
69
|
+
float devicePixelRatio;
|
|
70
|
+
int rowTableKeys;
|
|
71
|
+
int rule;
|
|
72
|
+
float minWidthPx;
|
|
73
|
+
};
|
|
74
|
+
[[vk::binding(1, 0)]] ConstantBuffer<Uniforms> u;
|
|
75
|
+
[[vk::binding(2, 0)]] Sampler2D<float4> colorRamp;
|
|
76
|
+
[[vk::binding(4, 0)]] Sampler2D<float4> rowTable;
|
|
77
|
+
|
|
78
|
+
float bpToClipX(uint bp, Uniforms u) {
|
|
79
|
+
return hpToClipX(hpSplitUint(bp), u.bpRangeX, u.zero);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
struct VsOut {
|
|
83
|
+
float4 position : SV_Position;
|
|
84
|
+
float4 color : COLOR0;
|
|
85
|
+
float2 localPos : TEXCOORD0;
|
|
86
|
+
// Shape discriminator passed to the fragment shader: 0 = disc, 1 = diamond,
|
|
87
|
+
// 2 = inverted triangle, 3 = solid fill.
|
|
88
|
+
nointerpolation float shape : TEXCOORD1;
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
// Shape discriminators for the fragment shader. SMALL_POINT_MAX_DIAMETER and
|
|
92
|
+
// the disc SDF come from the shared pointGlyph module so they stay in lockstep
|
|
93
|
+
// with wiggle.slang.
|
|
94
|
+
static const float SHAPE_DISC = 0.0;
|
|
95
|
+
static const float SHAPE_DIAMOND = 1.0;
|
|
96
|
+
static const float SHAPE_TRI = 2.0;
|
|
97
|
+
// >2.5 in the fragment shader = flat solid fill (a rule, or the tiny square).
|
|
98
|
+
static const float SHAPE_BAR = 3.0;
|
|
99
|
+
// 1/sqrt(5): normalizes the two slanted edges of the inverted triangle so the
|
|
100
|
+
// edge functions read as true perpendicular distances for antialiasing.
|
|
101
|
+
static const float INV_SQRT5 = 0.4472136;
|
|
102
|
+
// The diamond is the shape's "singled out" glyph and draws visibly larger than
|
|
103
|
+
// the others, so it reads as the one that matters at a glance rather than as a
|
|
104
|
+
// colour swap. LocusZoom's lead-SNP convention, generalized.
|
|
105
|
+
static const float DIAMOND_GLYPH_SCALE = 1.6;
|
|
106
|
+
|
|
107
|
+
// How far past its boundary each glyph still inks where its quad binds, in ramp
|
|
108
|
+
// reaches. The disc's ramp is isotropic, so one. The diamond's quad binds on
|
|
109
|
+
// the four axes, where two L1 facets miter at a right angle: sqrt(2). The
|
|
110
|
+
// triangle's binds at its apex, where the two slanted edges miter much more
|
|
111
|
+
// sharply: sqrt(5), and padding one reach there cut the apex at alpha 0.276.
|
|
112
|
+
static const float DIAMOND_MITER_REACHES = 1.4142136;
|
|
113
|
+
static const float TRIANGLE_MITER_REACHES = 2.2360680;
|
|
114
|
+
|
|
115
|
+
// The shape's own anchor, the top of its row band. The vertex branch, the
|
|
116
|
+
// Canvas2D painter, the ink box and the hit test all read a value's y here.
|
|
117
|
+
float pointYPx(float value, float domainMin, float domainMax, float h, int scaleType, float insetPx, float symlogConstant) {
|
|
118
|
+
return insetValueYPx(value, domainMin, domainMax, h, scaleType, insetPx, symlogConstant);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// A value's canvas y in the row band starting at `bandTop`, `h` tall, from
|
|
122
|
+
// its `pointYPx`: mirrored within the band under a reversed scale.
|
|
123
|
+
public float pointRowYPx(float bandTop, float h, int reverse, float valueYPx) {
|
|
124
|
+
return bandTop + (reverse != 0 ? h - valueYPx : valueYPx);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// The glyph channel's values. The numbering is a contract between whatever
|
|
128
|
+
// packs the channel, the Canvas2D painter and the branches below, so it is
|
|
129
|
+
// authored once here and `//! export-consts`ed.
|
|
130
|
+
static const uint GLYPH_DISC = 0u;
|
|
131
|
+
static const uint GLYPH_TRIANGLE = 1u;
|
|
132
|
+
static const uint GLYPH_DIAMOND = 2u;
|
|
133
|
+
// A pixel-snapped filled square at any size, the small disc's crisp form.
|
|
134
|
+
static const uint GLYPH_SQUARE = 3u;
|
|
135
|
+
|
|
136
|
+
[shader("vertex")]
|
|
137
|
+
VsOut vs_main(PointMarkInstance inst, uint vid : SV_VertexID) {
|
|
138
|
+
uint v = vid % 6u;
|
|
139
|
+
|
|
140
|
+
// Two-triangle quad corner (0/1 per axis); shared with the whole fleet.
|
|
141
|
+
float2 q = quadLocal(v);
|
|
142
|
+
float2 local = q * 2.0 - 1.0;
|
|
143
|
+
bool xZero = q.x < 0.5;
|
|
144
|
+
|
|
145
|
+
VsOut o;
|
|
146
|
+
RowPlacement place = rowTableLookup(rowTable, inst.row, u.rowTableKeys,
|
|
147
|
+
markScaleColor(colorRamp, inst.color, u.rampMode, u.rampMin, u.rampMax, u.rampMidNorm, u.colorCutCount, u.colorCuts[0], u.colorCuts[1], u.colorBands));
|
|
148
|
+
if (place.hidden) {
|
|
149
|
+
o.position = float4(2.0, 2.0, 0.0, 1.0);
|
|
150
|
+
o.color = float4(0.0);
|
|
151
|
+
o.localPos = float2(0.0);
|
|
152
|
+
o.shape = SHAPE_BAR;
|
|
153
|
+
return o;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
float startClipX = bpToClipX(inst.x, u);
|
|
157
|
+
float endClipX = bpToClipX(inst.x2, u);
|
|
158
|
+
float yPx = pointRowYPx(rowBandTopPx(u.rowOffsetPx, u.rowHeight, place.slot), u.rowHeight, u.reverse, pointYPx(inst.y, u.domainMin, u.domainMax, u.rowHeight, u.valueScaleType, u.insetPx, u.valueSymlogConstant));
|
|
159
|
+
float centerClipY = yPxToClipY(yPx, u.canvasHeight);
|
|
160
|
+
|
|
161
|
+
o.color = place.color;
|
|
162
|
+
float centerClipX = (startClipX + endClipX) * 0.5;
|
|
163
|
+
if (u.rule != 0) {
|
|
164
|
+
float farClipX = extendToMinWidthX(startClipX, endClipX, u.minWidthPx, u.viewportWidth);
|
|
165
|
+
float x = xZero ? min(startClipX, farClipX) : max(startClipX, farClipX);
|
|
166
|
+
float y = centerClipY + pxToClipLen(local.y * u.radiusPx, u.canvasHeight);
|
|
167
|
+
o.position = float4(x, y, 0.0, 1.0);
|
|
168
|
+
o.localPos = local;
|
|
169
|
+
o.shape = SHAPE_BAR;
|
|
170
|
+
} else if (inst.glyph == GLYPH_SQUARE || (inst.glyph == GLYPH_DISC && u.radiusPx * 2.0 <= SMALL_POINT_MAX_DIAMETER)) {
|
|
171
|
+
// tiny disc: pixel-snapped crisp filled square (no AA disc). The triangle
|
|
172
|
+
// and the diamond keep their distinct marker even when small.
|
|
173
|
+
float diamPx = u.radiusPx * 2.0;
|
|
174
|
+
o.position = crispSquareCornerClip(centerClipX, yPx, diamPx, q,
|
|
175
|
+
u.viewportWidth, u.canvasHeight);
|
|
176
|
+
o.localPos = local;
|
|
177
|
+
o.shape = SHAPE_BAR;
|
|
178
|
+
} else {
|
|
179
|
+
bool diamond = inst.glyph == GLYPH_DIAMOND;
|
|
180
|
+
float unitPx = u.radiusPx * (diamond ? DIAMOND_GLYPH_SCALE : 1.0);
|
|
181
|
+
float reaches = inst.glyph == GLYPH_TRIANGLE ? TRIANGLE_MITER_REACHES
|
|
182
|
+
: (diamond ? DIAMOND_MITER_REACHES : 1.0);
|
|
183
|
+
float expand = glyphExpand(unitPx, reaches, u.devicePixelRatio);
|
|
184
|
+
float halfPx = unitPx * expand;
|
|
185
|
+
float dx = pxToClipLen(local.x * halfPx, u.viewportWidth);
|
|
186
|
+
float dy = pxToClipLen(local.y * halfPx, u.canvasHeight);
|
|
187
|
+
o.position = float4(centerClipX + dx, centerClipY + dy, 0.0, 1.0);
|
|
188
|
+
o.localPos = local * expand;
|
|
189
|
+
o.shape = inst.glyph == GLYPH_TRIANGLE ? SHAPE_TRI
|
|
190
|
+
: (inst.glyph == GLYPH_DIAMOND ? SHAPE_DIAMOND : SHAPE_DISC);
|
|
191
|
+
}
|
|
192
|
+
return o;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
[shader("fragment")]
|
|
196
|
+
float4 fs_main(VsOut fragIn) : SV_Target {
|
|
197
|
+
// Each glyph only picks its SDF here; the AA derivative is taken once after
|
|
198
|
+
// the branch, because WGSL rejects a derivative under a branch on a varying
|
|
199
|
+
// ("must only be called from uniform control flow"). shape is constant per
|
|
200
|
+
// primitive, so the shared ramp is exact.
|
|
201
|
+
float2 p = fragIn.localPos;
|
|
202
|
+
float coverage;
|
|
203
|
+
if (fragIn.shape > 2.5) {
|
|
204
|
+
// Extent bar: solid fill, no marker AA. A constant SDF has zero gradient,
|
|
205
|
+
// so the ramp below saturates to alpha 1.
|
|
206
|
+
coverage = 1.0;
|
|
207
|
+
} else if (fragIn.shape > 1.5) {
|
|
208
|
+
// Inverted triangle: top edge (-1,1)-(1,1), apex (0,-1). Each edge's signed
|
|
209
|
+
// distance is positive inside; the min is the SDF used for the AA fade.
|
|
210
|
+
float dTop = 1.0 - p.y;
|
|
211
|
+
float dLeft = (2.0 * p.x + p.y + 1.0) * INV_SQRT5;
|
|
212
|
+
float dRight = (-2.0 * p.x + p.y + 1.0) * INV_SQRT5;
|
|
213
|
+
coverage = min(dTop, min(dLeft, dRight));
|
|
214
|
+
} else if (fragIn.shape > 0.5) {
|
|
215
|
+
// Diamond (rhombus): L1-norm distance from center, positive inside, zero at
|
|
216
|
+
// the four edges.
|
|
217
|
+
coverage = 1.0 - (abs(p.x) + abs(p.y));
|
|
218
|
+
} else {
|
|
219
|
+
coverage = discCoverage(p);
|
|
220
|
+
}
|
|
221
|
+
// One output pixel of ramp, from the SDF's own gradient — which is what lets
|
|
222
|
+
// the four shapes above share a single line despite the diamond's L1 norm
|
|
223
|
+
// carrying a sqrt(2) the others don't. See antialias.slang's glyphEdgeAlpha.
|
|
224
|
+
float alpha = glyphEdgeAlpha(coverage);
|
|
225
|
+
if (alpha <= 0.0) discard;
|
|
226
|
+
return float4(fragIn.color.rgb, fragIn.color.a * alpha);
|
|
227
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
// AUTO-GENERATED by packages/shader-tools/src/shader-codegen from pointMark.slang.
|
|
2
|
+
// Do not edit. Run `pnpm gen:shaders` to regenerate.
|
|
3
|
+
|
|
4
|
+
export const WGSL_SOURCE = "struct Uniforms_std140_0\n{\n @align(16) bpRangeX_0 : vec3<f32>,\n @align(4) canvasHeight_0 : f32,\n @align(16) domainMin_0 : f32,\n @align(4) domainMax_0 : f32,\n @align(8) valueScaleType_0 : i32,\n @align(4) valueSymlogConstant_0 : f32,\n @align(16) rampMode_0 : i32,\n @align(4) rampMin_0 : f32,\n @align(8) rampMax_0 : f32,\n @align(4) rampMidNorm_0 : f32,\n @align(16) colorCutCount_0 : i32,\n @align(16) colorCuts_0 : array<vec4<f32>, i32(2)>,\n @align(16) colorBands_0 : array<vec4<f32>, i32(9)>,\n @align(16) zero_0 : f32,\n @align(4) viewportWidth_0 : f32,\n @align(8) radiusPx_0 : f32,\n @align(4) rowHeight_0 : f32,\n @align(16) rowOffsetPx_0 : f32,\n @align(4) reverse_0 : i32,\n @align(8) insetPx_0 : f32,\n @align(4) devicePixelRatio_0 : f32,\n @align(16) rowTableKeys_0 : i32,\n @align(4) rule_0 : i32,\n @align(8) minWidthPx_0 : f32,\n};\n\n@binding(1) @group(0) var<uniform> u_0 : Uniforms_std140_0;\n@binding(2) @group(0) var colorRamp_texture_0 : texture_2d<f32>;\n\n@binding(3) @group(0) var colorRamp_sampler_0 : sampler;\n\n@binding(4) @group(0) var rowTable_texture_0 : texture_2d<f32>;\n\n@binding(5) @group(0) var rowTable_sampler_0 : sampler;\n\nfn quadLocal_0( vid_0 : u32) -> vec2<f32>\n{\n var v_0 : u32 = vid_0 % u32(6);\n var _S1 : bool = v_0 == u32(0);\n var _S2 : bool;\n if(_S1)\n {\n _S2 = true;\n }\n else\n {\n _S2 = v_0 == u32(2);\n }\n if(_S2)\n {\n _S2 = true;\n }\n else\n {\n _S2 = v_0 == u32(3);\n }\n var _S3 : f32;\n if(_S2)\n {\n _S3 = 0.0f;\n }\n else\n {\n _S3 = 1.0f;\n }\n if(_S1)\n {\n _S2 = true;\n }\n else\n {\n _S2 = v_0 == u32(1);\n }\n if(_S2)\n {\n _S2 = true;\n }\n else\n {\n _S2 = v_0 == u32(4);\n }\n var _S4 : f32;\n if(_S2)\n {\n _S4 = 0.0f;\n }\n else\n {\n _S4 = 1.0f;\n }\n return vec2<f32>(_S3, _S4);\n}\n\nfn unpackRGBA_0( c_0 : u32) -> vec4<f32>\n{\n return vec4<f32>(f32((((c_0 >> (u32(0)))) & (u32(255)))), f32((((c_0 >> (u32(8)))) & (u32(255)))), f32((((c_0 >> (u32(16)))) & (u32(255)))), f32((((c_0 >> (u32(24)))) & (u32(255))))) / vec4<f32>(255.0f);\n}\n\nfn rampMidT_0( t_0 : f32, mid_0 : f32) -> f32\n{\n var _S5 : f32 = max(mid_0, 1.0f - mid_0);\n return clamp((t_0 + (_S5 - mid_0)) / (2.0f * _S5), 0.0f, 1.0f);\n}\n\nfn rampColor_0( ramp_texture_0 : texture_2d<f32>, ramp_sampler_0 : sampler, t_1 : f32) -> vec4<f32>\n{\n return (textureSampleLevel((ramp_texture_0), (ramp_sampler_0), (vec2<f32>((clamp(t_1, 0.0f, 1.0f) * 255.0f + 0.5f) / 256.0f, 0.5f)), (0.0f)));\n}\n\nfn colorCutAt_0( i_0 : i32, cutsLo_0 : vec4<f32>, cutsHi_0 : vec4<f32>) -> f32\n{\n var _S6 : f32;\n if(i_0 < i32(4))\n {\n _S6 = cutsLo_0[i_0];\n }\n else\n {\n _S6 = cutsHi_0[i_0 - i32(4)];\n }\n return _S6;\n}\n\nfn thresholdBand_0( value_0 : f32, cutCount_0 : i32, cutsLo_1 : vec4<f32>, cutsHi_1 : vec4<f32>) -> i32\n{\n var band_0 : i32 = i32(0);\n var i_1 : i32 = i32(0);\n for(;;)\n {\n if(i_1 < cutCount_0)\n {\n }\n else\n {\n break;\n }\n if(value_0 >= (colorCutAt_0(i_1, cutsLo_1, cutsHi_1)))\n {\n band_0 = i_1 + i32(1);\n }\n i_1 = i_1 + i32(1);\n }\n return band_0;\n}\n\nfn log1pf_0( x_0 : f32) -> f32\n{\n var u_1 : f32 = 1.0f + x_0;\n var _S7 : f32;\n if(u_1 == 1.0f)\n {\n _S7 = x_0;\n }\n else\n {\n _S7 = log(u_1) * (x_0 / (u_1 - 1.0f));\n }\n return _S7;\n}\n\nfn symlogTransform_0( x_1 : f32, c_1 : f32) -> f32\n{\n return f32((i32(sign((x_1))))) * log1pf_0(abs(x_1 / c_1));\n}\n\nfn normalizeScoreUnclamped_0( score_0 : f32, domainMin_1 : f32, domainMax_1 : f32, scaleType_0 : i32, symlogConstant_0 : f32) -> f32\n{\n var tMax_0 : f32;\n var tMin_0 : f32;\n var t_2 : f32;\n if(scaleType_0 == i32(2))\n {\n var _S8 : f32 = symlogTransform_0(score_0, symlogConstant_0);\n var _S9 : f32 = symlogTransform_0(domainMin_1, symlogConstant_0);\n tMax_0 = symlogTransform_0(domainMax_1, symlogConstant_0);\n tMin_0 = _S9;\n t_2 = _S8;\n }\n else\n {\n if(scaleType_0 == i32(1))\n {\n if(domainMin_1 > 0.0f)\n {\n tMax_0 = domainMin_1;\n }\n else\n {\n tMax_0 = 1.0f;\n }\n var _S10 : f32 = log2(max(score_0, tMax_0));\n var _S11 : f32 = log2(tMax_0);\n tMax_0 = log2(max(domainMax_1, tMax_0));\n tMin_0 = _S11;\n t_2 = _S10;\n }\n else\n {\n tMax_0 = domainMax_1;\n tMin_0 = domainMin_1;\n t_2 = score_0;\n }\n }\n var tRange_0 : f32 = tMax_0 - tMin_0;\n if(tRange_0 <= 0.0f)\n {\n if(t_2 > tMin_0)\n {\n tMax_0 = 1.0f;\n }\n else\n {\n tMax_0 = 0.0f;\n }\n return tMax_0;\n }\n return (t_2 - tMin_0) / tRange_0;\n}\n\nfn normalizeScore_0( score_1 : f32, domainMin_2 : f32, domainMax_2 : f32, scaleType_1 : i32, symlogConstant_1 : f32) -> f32\n{\n return clamp(normalizeScoreUnclamped_0(score_1, domainMin_2, domainMax_2, scaleType_1, symlogConstant_1), 0.0f, 1.0f);\n}\n\nfn rowTableWidth_0( keys_0 : u32) -> u32\n{\n return max(min(keys_0, u32(2048)), u32(1));\n}\n\nfn rowTablePlaneHeight_0( keys_1 : u32) -> u32\n{\n var w_0 : u32 = rowTableWidth_0(keys_1);\n var _S12 : u32 = (keys_1 + w_0 - u32(1)) / w_0;\n return max(_S12, u32(1));\n}\n\nfn rowTableTexelX_0( key_0 : u32, keys_2 : u32) -> u32\n{\n var _S13 : u32 = key_0 % rowTableWidth_0(keys_2);\n return _S13;\n}\n\nfn rowTableTexelY_0( key_1 : u32, keys_3 : u32) -> u32\n{\n var _S14 : u32 = key_1 / rowTableWidth_0(keys_3);\n return _S14;\n}\n\nfn byteOf_0( channel_0 : f32) -> u32\n{\n return u32(channel_0 * 255.0f + 0.5f);\n}\n\nstruct RowPlacement_0\n{\n hidden_0 : bool,\n slot_0 : u32,\n color_0 : vec4<f32>,\n};\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 _S15 : u32 = rowTableTexelX_0(key_2, n_0);\n var u_2 : f32 = (f32(_S15) + 0.5f) / f32(rowTableWidth_0(n_0));\n var rows_0 : f32 = f32(u32(2) * h_0);\n var y_0 : u32 = rowTableTexelY_0(key_2, n_0);\n var _S16 : vec4<f32> = (textureSampleLevel((table_texture_0), (table_sampler_0), (vec2<f32>(u_2, (f32(y_0) + 0.5f) / rows_0)), (0.0f)));\n if((_S16.w) < 0.5f)\n {\n p_0.hidden_0 = true;\n return p_0;\n }\n p_0.slot_0 = ((((byteOf_0(_S16.x)) | ((((byteOf_0(_S16.y)) << (u32(8))))))) | ((((byteOf_0(_S16.z)) << (u32(16))))));\n var _S17 : vec4<f32> = (textureSampleLevel((table_texture_0), (table_sampler_0), (vec2<f32>(u_2, (f32(y_0 + h_0) + 0.5f) / rows_0)), (0.0f)));\n var _S18 : vec4<f32>;\n if((_S17.w) > 0.0f)\n {\n _S18 = _S17;\n }\n else\n {\n _S18 = own_0;\n }\n p_0.color_0 = _S18;\n return p_0;\n}\n\nfn hpSplitUint_0( value_1 : u32) -> vec2<f32>\n{\n var lo_0 : u32 = (value_1 & (u32(4095)));\n return vec2<f32>(f32(value_1 - lo_0), f32(lo_0));\n}\n\nfn hpToClipX_0( splitPos_0 : vec2<f32>, bpRange_0 : vec3<f32>, hpZero_0 : f32) -> f32\n{\n var floorBp_0 : f32 = -3.00000000549775576e+38f + hpZero_0;\n var step_0 : f32 = 2.0f / bpRange_0.z;\n return dot(vec3<f32>(-1.0f, max(splitPos_0.x - bpRange_0.x, floorBp_0), max(splitPos_0.y - bpRange_0.y, floorBp_0)), vec3<f32>(1.0f, step_0, step_0));\n}\n\nfn rowBandTopPx_0( rowOffsetPx_1 : f32, rowHeight_1 : f32, slot_1 : u32) -> f32\n{\n return rowOffsetPx_1 + rowHeight_1 * f32(slot_1);\n}\n\nfn valueToYPxScaled_0( value_2 : f32, domainMin_3 : f32, domainMax_3 : f32, h_1 : f32, scaleType_2 : i32, symlogConstant_2 : f32) -> f32\n{\n return (1.0f - normalizeScore_0(value_2, domainMin_3, domainMax_3, scaleType_2, symlogConstant_2)) * h_1;\n}\n\nfn insetValueYPx_0( value_3 : f32, domainMin_4 : f32, domainMax_4 : f32, h_2 : f32, scaleType_3 : i32, insetPx_1 : f32, symlogConstant_3 : f32) -> f32\n{\n var _S19 : f32 = min(insetPx_1, h_2 * 0.5f);\n return _S19 + valueToYPxScaled_0(value_3, domainMin_4, domainMax_4, h_2 - 2.0f * _S19, scaleType_3, symlogConstant_3);\n}\n\nfn pointYPx_0( value_4 : f32, domainMin_5 : f32, domainMax_5 : f32, h_3 : f32, scaleType_4 : i32, insetPx_2 : f32, symlogConstant_4 : f32) -> f32\n{\n return insetValueYPx_0(value_4, domainMin_5, domainMax_5, h_3, scaleType_4, insetPx_2, symlogConstant_4);\n}\n\nfn pointRowYPx_0( bandTop_0 : f32, h_4 : f32, reverse_1 : i32, valueYPx_0 : f32) -> f32\n{\n var _S20 : f32;\n if(reverse_1 != i32(0))\n {\n _S20 = h_4 - valueYPx_0;\n }\n else\n {\n _S20 = valueYPx_0;\n }\n return bandTop_0 + _S20;\n}\n\nfn yPxToClipY_0( yPx_0 : f32, canvasHeight_1 : f32) -> f32\n{\n return 1.0f - yPx_0 / canvasHeight_1 * 2.0f;\n}\n\nfn pxToClipLen_0( px_0 : f32, size_0 : f32) -> f32\n{\n return px_0 * 2.0f / size_0;\n}\n\nfn extendToMinWidthPx_0( x1_0 : f32, x2_0 : f32, minWidth_0 : f32) -> f32\n{\n var dx_0 : f32 = x2_0 - x1_0;\n var _S21 : f32;\n if((abs(dx_0)) < minWidth_0)\n {\n if(dx_0 < 0.0f)\n {\n _S21 = - minWidth_0;\n }\n else\n {\n _S21 = minWidth_0;\n }\n _S21 = x1_0 + _S21;\n }\n else\n {\n _S21 = x2_0;\n }\n return _S21;\n}\n\nfn extendToMinWidthX_0( x1_1 : f32, x2_1 : f32, minWidthPx_1 : f32, canvasWidth_0 : f32) -> f32\n{\n return extendToMinWidthPx_0(x1_1, x2_1, pxToClipLen_0(minWidthPx_1, canvasWidth_0));\n}\n\nfn clipXToPx_0( clipX_0 : f32, canvasWidth_1 : f32) -> f32\n{\n return (clipX_0 + 1.0f) * 0.5f * canvasWidth_1;\n}\n\nfn crispSquareTopLeftPx_0( centerPx_0 : f32, diameterPx_0 : f32) -> f32\n{\n return floor(centerPx_0 - diameterPx_0 * 0.5f + 0.5f);\n}\n\nfn crispSquareCornerPx_0( centerPx_1 : vec2<f32>, diameterPx_1 : f32, q_0 : vec2<f32>) -> vec2<f32>\n{\n return vec2<f32>(crispSquareTopLeftPx_0(centerPx_1.x, diameterPx_1), crispSquareTopLeftPx_0(centerPx_1.y, diameterPx_1)) + q_0 * vec2<f32>(diameterPx_1);\n}\n\nfn pxToClipX_0( xPx_0 : f32, canvasWidth_2 : f32) -> f32\n{\n return xPx_0 / canvasWidth_2 * 2.0f - 1.0f;\n}\n\nfn crispSquareCornerClip_0( centerClipX_0 : f32, centerYPx_0 : f32, diameterPx_2 : f32, q_1 : vec2<f32>, viewportWidth_1 : f32, canvasHeight_2 : f32) -> vec4<f32>\n{\n var vPx_0 : vec2<f32> = crispSquareCornerPx_0(vec2<f32>(clipXToPx_0(centerClipX_0, viewportWidth_1), centerYPx_0), diameterPx_2, q_1);\n return vec4<f32>(pxToClipX_0(vPx_0.x, viewportWidth_1), yPxToClipY_0(vPx_0.y, canvasHeight_2), 0.0f, 1.0f);\n}\n\nfn aaPx_0( dpr_0 : f32) -> f32\n{\n return 1.0f / max(dpr_0, 1.0f);\n}\n\nfn aaHalfPx_0( dpr_1 : f32) -> f32\n{\n return 0.5f * aaPx_0(dpr_1);\n}\n\nfn glyphExpand_0( unitPx_0 : f32, reaches_0 : f32, dpr_2 : f32) -> f32\n{\n return 1.0f + reaches_0 * aaHalfPx_0(dpr_2) / max(unitPx_0, 0.00100000004749745f);\n}\n\nstruct VsOut_0\n{\n @builtin(position) position_0 : vec4<f32>,\n @location(0) color_1 : vec4<f32>,\n @location(2) localPos_0 : vec2<f32>,\n @interpolate(flat) @location(1) shape_0 : f32,\n};\n\nstruct vertexInput_0\n{\n @location(0) x_2 : u32,\n @location(1) x2_2 : u32,\n @location(2) y_1 : f32,\n @location(3) color_2 : u32,\n @location(4) glyph_0 : u32,\n @location(5) row_0 : u32,\n};\n\nfn markScaleColor_0( _S22 : texture_2d<f32>, _S23 : sampler, _S24 : u32, _S25 : i32, _S26 : f32, _S27 : f32, _S28 : f32, _S29 : i32, _S30 : vec4<f32>, _S31 : vec4<f32>) -> vec4<f32>\n{\n if(_S25 == i32(0))\n {\n return unpackRGBA_0(_S24);\n }\n if(_S24 == u32(2143289345))\n {\n return unpackRGBA_0(u32(4289703855));\n }\n var scaleType_5 : i32;\n if(((_S24 & (u32(2139095040)))) == u32(2139095040))\n {\n if(((_S24 & (u32(8388607)))) != u32(0))\n {\n return unpackRGBA_0(u32(4286611584));\n }\n var negative_0 : bool = ((_S24 & (u32(2147483648)))) != u32(0);\n if(_S25 == i32(3))\n {\n if(negative_0)\n {\n scaleType_5 = i32(0);\n }\n else\n {\n scaleType_5 = _S29;\n }\n return u_0.colorBands_0[scaleType_5];\n }\n var _S32 : f32;\n if(negative_0)\n {\n _S32 = 0.0f;\n }\n else\n {\n _S32 = 1.0f;\n }\n return rampColor_0(_S22, _S23, rampMidT_0(_S32, _S28));\n }\n var value_5 : f32 = (bitcast<f32>((_S24)));\n if(_S25 == i32(3))\n {\n return u_0.colorBands_0[thresholdBand_0(value_5, _S29, _S30, _S31)];\n }\n if(_S25 == i32(2))\n {\n scaleType_5 = i32(1);\n }\n else\n {\n scaleType_5 = i32(0);\n }\n return rampColor_0(_S22, _S23, rampMidT_0(normalizeScore_0(value_5, _S26, _S27, scaleType_5, 1.0f), _S28));\n}\n\nfn bpToClipX_0( _S33 : u32) -> f32\n{\n return hpToClipX_0(hpSplitUint_0(_S33), u_0.bpRangeX_0, u_0.zero_0);\n}\n\n@vertex\nfn vs_main( _S34 : vertexInput_0, @builtin(vertex_index) vid_1 : u32) -> VsOut_0\n{\n var q_2 : vec2<f32> = quadLocal_0(vid_1 % u32(6));\n var local_0 : vec2<f32> = q_2 * vec2<f32>(2.0f) - vec2<f32>(1.0f);\n var xZero_0 : bool = (q_2.x) < 0.5f;\n var o_0 : VsOut_0;\n var _S35 : RowPlacement_0 = rowTableLookup_0(rowTable_texture_0, rowTable_sampler_0, _S34.row_0, u_0.rowTableKeys_0, markScaleColor_0(colorRamp_texture_0, colorRamp_sampler_0, _S34.color_2, u_0.rampMode_0, u_0.rampMin_0, u_0.rampMax_0, u_0.rampMidNorm_0, u_0.colorCutCount_0, u_0.colorCuts_0[i32(0)], u_0.colorCuts_0[i32(1)]));\n if(_S35.hidden_0)\n {\n o_0.position_0 = vec4<f32>(2.0f, 2.0f, 0.0f, 1.0f);\n o_0.color_1 = vec4<f32>(0.0f);\n o_0.localPos_0 = vec2<f32>(0.0f);\n o_0.shape_0 = 3.0f;\n return o_0;\n }\n var _S36 : f32 = bpToClipX_0(_S34.x_2);\n var _S37 : f32 = bpToClipX_0(_S34.x2_2);\n var yPx_1 : f32 = pointRowYPx_0(rowBandTopPx_0(u_0.rowOffsetPx_0, u_0.rowHeight_0, _S35.slot_0), u_0.rowHeight_0, u_0.reverse_0, pointYPx_0(_S34.y_1, u_0.domainMin_0, u_0.domainMax_0, u_0.rowHeight_0, u_0.valueScaleType_0, u_0.insetPx_0, u_0.valueSymlogConstant_0));\n var centerClipY_0 : f32 = yPxToClipY_0(yPx_1, u_0.canvasHeight_0);\n o_0.color_1 = _S35.color_0;\n var centerClipX_1 : f32 = (_S36 + _S37) * 0.5f;\n var x_3 : f32;\n if((u_0.rule_0) != i32(0))\n {\n var farClipX_0 : f32 = extendToMinWidthX_0(_S36, _S37, u_0.minWidthPx_0, u_0.viewportWidth_0);\n if(xZero_0)\n {\n x_3 = min(_S36, farClipX_0);\n }\n else\n {\n x_3 = max(_S36, farClipX_0);\n }\n o_0.position_0 = vec4<f32>(x_3, centerClipY_0 + pxToClipLen_0(local_0.y * u_0.radiusPx_0, u_0.canvasHeight_0), 0.0f, 1.0f);\n o_0.localPos_0 = local_0;\n o_0.shape_0 = 3.0f;\n }\n else\n {\n var _S38 : bool;\n if((_S34.glyph_0) == u32(3))\n {\n _S38 = true;\n }\n else\n {\n if((_S34.glyph_0) == u32(0))\n {\n _S38 = (u_0.radiusPx_0 * 2.0f) <= 3.0f;\n }\n else\n {\n _S38 = false;\n }\n }\n if(_S38)\n {\n o_0.position_0 = crispSquareCornerClip_0(centerClipX_1, yPx_1, u_0.radiusPx_0 * 2.0f, q_2, u_0.viewportWidth_0, u_0.canvasHeight_0);\n o_0.localPos_0 = local_0;\n o_0.shape_0 = 3.0f;\n }\n else\n {\n var diamond_0 : bool = (_S34.glyph_0) == u32(2);\n var _S39 : f32 = u_0.radiusPx_0;\n if(diamond_0)\n {\n x_3 = 1.60000002384185791f;\n }\n else\n {\n x_3 = 1.0f;\n }\n var unitPx_1 : f32 = _S39 * x_3;\n var _S40 : bool = (_S34.glyph_0) == u32(1);\n if(_S40)\n {\n x_3 = 2.2360680103302002f;\n }\n else\n {\n if(diamond_0)\n {\n x_3 = 1.41421365737915039f;\n }\n else\n {\n x_3 = 1.0f;\n }\n }\n var expand_0 : f32 = glyphExpand_0(unitPx_1, x_3, u_0.devicePixelRatio_0);\n var halfPx_0 : f32 = unitPx_1 * expand_0;\n o_0.position_0 = vec4<f32>(centerClipX_1 + pxToClipLen_0(local_0.x * halfPx_0, u_0.viewportWidth_0), centerClipY_0 + pxToClipLen_0(local_0.y * halfPx_0, u_0.canvasHeight_0), 0.0f, 1.0f);\n o_0.localPos_0 = local_0 * vec2<f32>(expand_0);\n if(_S40)\n {\n x_3 = 2.0f;\n }\n else\n {\n if(diamond_0)\n {\n x_3 = 1.0f;\n }\n else\n {\n x_3 = 0.0f;\n }\n }\n o_0.shape_0 = x_3;\n }\n }\n return o_0;\n}\n\nfn discCoverage_0( localPos_1 : vec2<f32>) -> f32\n{\n return 1.0f - length(localPos_1);\n}\n\nfn aaGradient_0( d_0 : f32) -> f32\n{\n return max(length(vec2<f32>(dpdx(d_0), dpdy(d_0))), 0.00000999999974738f);\n}\n\nfn aaRamp_0( signedInk_0 : f32, widthPx_0 : f32) -> f32\n{\n return clamp(signedInk_0 / widthPx_0 + 0.5f, 0.0f, 1.0f);\n}\n\nfn glyphEdgeAlpha_0( coverage_0 : f32) -> f32\n{\n return aaRamp_0(coverage_0, aaGradient_0(coverage_0));\n}\n\nstruct pixelOutput_0\n{\n @location(0) output_0 : vec4<f32>,\n};\n\nstruct pixelInput_0\n{\n @location(0) color_3 : vec4<f32>,\n @location(2) localPos_2 : vec2<f32>,\n @interpolate(flat) @location(1) shape_1 : f32,\n};\n\n@fragment\nfn fs_main( _S41 : pixelInput_0, @builtin(position) position_1 : vec4<f32>) -> pixelOutput_0\n{\n var coverage_1 : f32;\n if((_S41.shape_1) > 2.5f)\n {\n coverage_1 = 1.0f;\n }\n else\n {\n if((_S41.shape_1) > 1.5f)\n {\n var _S42 : f32 = _S41.localPos_2.y;\n var _S43 : f32 = _S41.localPos_2.x;\n coverage_1 = min(1.0f - _S42, min((2.0f * _S43 + _S42 + 1.0f) * 0.44721359014511108f, (-2.0f * _S43 + _S42 + 1.0f) * 0.44721359014511108f));\n }\n else\n {\n if((_S41.shape_1) > 0.5f)\n {\n coverage_1 = 1.0f - (abs(_S41.localPos_2.x) + abs(_S41.localPos_2.y));\n }\n else\n {\n coverage_1 = discCoverage_0(_S41.localPos_2);\n }\n }\n }\n var alpha_0 : f32 = glyphEdgeAlpha_0(coverage_1);\n if(alpha_0 <= 0.0f)\n {\n discard;\n }\n var _S44 : pixelOutput_0 = pixelOutput_0( vec4<f32>(_S41.color_3.xyz, _S41.color_3.w * alpha_0) );\n return _S44;\n}\n\n"
|