@jbrowse/render-core 5.0.0-beta.7 → 5.0.0-beta.9
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 +7 -6
- package/esm/RenderLifecycleMixin.js +7 -6
- package/esm/canvas2dUtils.d.ts +58 -17
- package/esm/canvas2dUtils.js +82 -30
- package/esm/computePipeline.d.ts +4 -3
- package/esm/computePipeline.js +21 -14
- package/esm/coverageBand.d.ts +3 -3
- package/esm/coverageBand.js +2 -2
- package/esm/coverageBandBuffers.d.ts +2 -3
- package/esm/createRenderingBackend.d.ts +1 -1
- package/esm/displayPhase.d.ts +79 -109
- package/esm/displayPhase.js +42 -83
- package/esm/gpuDevice.d.ts +11 -10
- package/esm/gpuDevice.js +10 -11
- package/esm/graphicsCapabilities.d.ts +6 -7
- package/esm/graphicsCapabilities.js +3 -4
- package/esm/hal/createHal.js +1 -1
- package/esm/hal/deviceGpuCache.d.ts +25 -30
- package/esm/hal/deviceGpuCache.js +85 -97
- package/esm/hal/index.d.ts +2 -2
- package/esm/hal/index.js +1 -1
- package/esm/hal/mockHal.d.ts +8 -6
- package/esm/hal/mockHal.js +7 -2
- package/esm/hal/passIds.d.ts +8 -7
- package/esm/hal/passIds.js +11 -10
- package/esm/hal/types.d.ts +28 -12
- package/esm/hal/webgl2Hal.d.ts +11 -3
- package/esm/hal/webgl2Hal.js +116 -145
- package/esm/hal/webgpuHal.d.ts +8 -8
- package/esm/hal/webgpuHal.js +97 -124
- package/esm/instancePass.d.ts +2 -1
- package/esm/mapUploadSync.d.ts +2 -2
- package/esm/mapUploadSync.js +2 -2
- package/esm/marks/barMark.d.ts +6 -3
- package/esm/marks/barMark.js +19 -13
- package/esm/marks/drawAgainstHit.d.ts +58 -39
- package/esm/marks/drawAgainstHit.js +136 -96
- package/esm/marks/glyphPaint.d.ts +14 -2
- package/esm/marks/glyphPaint.js +16 -2
- package/esm/marks/index.d.ts +4 -2
- package/esm/marks/index.js +3 -2
- package/esm/marks/markBackend.d.ts +2 -2
- package/esm/marks/markBackend.js +2 -2
- package/esm/marks/markHit.d.ts +2 -2
- package/esm/marks/markHit.js +2 -2
- package/esm/marks/markPlan.d.ts +2 -2
- package/esm/marks/markPlan.js +2 -2
- package/esm/marks/markRamp.d.ts +1 -3
- package/esm/marks/markRamp.js +1 -5
- package/esm/marks/nearestMarkHit.d.ts +49 -0
- package/esm/marks/nearestMarkHit.js +126 -0
- package/esm/marks/pointMark.d.ts +9 -2
- package/esm/marks/pointMark.js +36 -31
- package/esm/marks/rowLane.d.ts +17 -0
- package/esm/marks/rowLane.js +11 -0
- package/esm/marks/spanMark.d.ts +6 -26
- package/esm/marks/spanMark.js +34 -31
- package/esm/marks/types.d.ts +51 -181
- package/esm/marks/types.js +91 -131
- package/esm/namedReactions.d.ts +3 -4
- package/esm/namedReactions.js +3 -4
- package/esm/scoreScale.d.ts +20 -0
- package/esm/scoreScale.js +77 -0
- package/esm/shaders/barMark.generated.d.ts +2 -3
- package/esm/shaders/barMark.generated.js +4 -3
- 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 +12 -6
- package/esm/shaders/barMark.iface.generated.js +27 -15
- package/esm/shaders/barMark.wgsl.generated.d.ts +1 -0
- package/esm/shaders/barMark.wgsl.generated.js +3 -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/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/pointMark.generated.d.ts +2 -3
- package/esm/shaders/pointMark.generated.js +4 -3
- 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 +11 -3
- package/esm/shaders/pointMark.iface.generated.js +23 -9
- package/esm/shaders/pointMark.js.generated.d.ts +1 -1
- package/esm/shaders/pointMark.js.generated.js +51 -29
- package/esm/shaders/pointMark.wgsl.generated.d.ts +1 -0
- package/esm/shaders/pointMark.wgsl.generated.js +3 -0
- package/esm/shaders/scoreScale.js.generated.js +46 -22
- package/esm/shaders/spanMark.generated.d.ts +2 -3
- package/esm/shaders/spanMark.generated.js +4 -3
- 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.js +1 -1
- package/esm/shaders/spanMark.wgsl.generated.d.ts +1 -0
- package/esm/shaders/spanMark.wgsl.generated.js +3 -0
- package/esm/slangPass.d.ts +9 -10
- package/esm/slangPass.js +9 -3
- package/esm/useGraphicsCapabilities.d.ts +1 -1
- package/esm/useGraphicsCapabilities.js +1 -1
- package/esm/webgpuUtils.d.ts +3 -11
- package/esm/webgpuUtils.js +12 -33
- package/package.json +3 -2
- package/src/shaders/barMark.generated.ts +6 -5
- package/src/shaders/barMark.glsl.generated.ts +6 -0
- package/src/shaders/barMark.iface.generated.ts +31 -15
- package/src/shaders/barMark.slang +11 -3
- package/src/shaders/barMark.wgsl.generated.ts +4 -0
- package/src/shaders/colorPack.slang +3 -2
- package/src/shaders/coverageBand.slang +5 -11
- 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 +1 -1
- package/src/shaders/coverageBar.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/hpmath.slang +18 -6
- package/src/shaders/pointMark.generated.ts +6 -6
- package/src/shaders/pointMark.glsl.generated.ts +6 -0
- package/src/shaders/pointMark.iface.generated.ts +28 -9
- package/src/shaders/pointMark.js.generated.ts +48 -29
- package/src/shaders/pointMark.slang +18 -5
- package/src/shaders/pointMark.wgsl.generated.ts +4 -0
- package/src/shaders/scoreScale.js.generated.ts +43 -22
- package/src/shaders/scoreScale.slang +37 -53
- package/src/shaders/spanMark.generated.ts +6 -5
- package/src/shaders/spanMark.glsl.generated.ts +6 -0
- package/src/shaders/spanMark.iface.generated.ts +1 -1
- package/src/shaders/spanMark.wgsl.generated.ts +4 -0
- package/src/shaders/valueScale.slang +8 -45
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
import type { VertexAttributeLayout, ShaderBinding } from '@jbrowse/render-core/hal'
|
|
5
5
|
|
|
6
6
|
export const BINDINGS: readonly ShaderBinding[] = [
|
|
7
|
-
{ index: 1, kind: 'uniform', name: 'u' },
|
|
7
|
+
{ index: 1, kind: 'uniform', name: 'u', stages: ['vertex'] },
|
|
8
8
|
]
|
|
9
9
|
|
|
10
10
|
export const VERTS_PER_INSTANCE = 6
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
// AUTO-GENERATED by packages/shader-tools/src/shader-codegen from coverageInterbase.slang.
|
|
2
|
+
// Do not edit. Run `pnpm gen:shaders` to regenerate.
|
|
3
|
+
|
|
4
|
+
export const WGSL_SOURCE = "struct CoverageBandUniforms_std140_0\n{\n @align(16) bpHi_0 : f32,\n @align(4) bpLo_0 : f32,\n @align(8) bpLen_0 : f32,\n @align(4) hpZero_0 : f32,\n @align(16) canvasW_0 : f32,\n @align(4) canvasH_0 : f32,\n @align(8) covHeight_0 : f32,\n @align(4) covYOffset_0 : f32,\n @align(16) covTop_0 : f32,\n @align(4) regionMaxDepth_0 : f32,\n @align(8) depthDomainMax_0 : f32,\n @align(4) depthDomainMin_0 : f32,\n @align(16) coverageSymlogConstant_0 : f32,\n @align(4) binSize_0 : f32,\n @align(8) interbaseHeight_0 : f32,\n @align(4) snpMinFreq_0 : f32,\n @align(16) reversed_0 : f32,\n @align(4) coverageScaleType_0 : i32,\n @align(8) colorCoverage_0 : u32,\n @align(4) colorBaseA_0 : u32,\n @align(16) colorBaseC_0 : u32,\n @align(4) colorBaseG_0 : u32,\n @align(8) colorBaseT_0 : u32,\n @align(4) colorBaseN_0 : u32,\n @align(16) colorInsertionIndicator_0 : u32,\n @align(4) colorSoftclipIndicator_0 : u32,\n @align(8) colorHardclipIndicator_0 : u32,\n};\n\n@binding(1) @group(0) var<uniform> u_0 : CoverageBandUniforms_std140_0;\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 hpSplitUint_0( value_0 : u32) -> vec2<f32>\n{\n var lo_0 : u32 = (value_0 & (u32(4095)));\n return vec2<f32>(f32(value_0 - lo_0), f32(lo_0));\n}\n\nfn hpToClipX_0( splitPos_0 : vec2<f32>, bpRange_0 : vec3<f32>, hpZero_1 : f32) -> f32\n{\n var step_0 : f32 = 2.0f / bpRange_0.z;\n var _S5 : f32 = - (1.0f / hpZero_1);\n return dot(vec3<f32>(-1.0f, max(splitPos_0.x - bpRange_0.x, _S5), max(splitPos_0.y - bpRange_0.y, _S5)), vec3<f32>(1.0f, step_0, step_0));\n}\n\nfn covBpToClipX_0( bp_0 : u32, u_1 : ptr<function, CoverageBandUniforms_std140_0>) -> f32\n{\n return hpToClipX_0(hpSplitUint_0(bp_0), vec3<f32>((*u_1).bpHi_0, (*u_1).bpLo_0, (*u_1).bpLen_0), (*u_1).hpZero_0);\n}\n\nfn pxToClipLen_0( px_0 : f32, size_0 : f32) -> f32\n{\n return px_0 * 2.0f / size_0;\n}\n\nfn interbaseEdgePx_0( offset_0 : f32, interbaseHeight_1 : f32) -> f32\n{\n return floor(4.5f + offset_0 * interbaseHeight_1 + 0.5f);\n}\n\nfn yPxToClipY_0( yPx_0 : f32, canvasHeight_0 : f32) -> f32\n{\n return 1.0f - yPx_0 / canvasHeight_0 * 2.0f;\n}\n\nfn covAreaTop_0( u_2 : ptr<function, CoverageBandUniforms_std140_0>) -> f32\n{\n return yPxToClipY_0((*u_2).covTop_0, (*u_2).canvasH_0);\n}\n\nfn covFlipX_0( x_0 : f32, u_3 : ptr<function, CoverageBandUniforms_std140_0>) -> f32\n{\n return mix(x_0, - x_0, (*u_3).reversed_0);\n}\n\nfn covFlippedQuad_0( x0_0 : f32, x1_0 : f32, yBot_0 : f32, yTop_0 : f32, local_0 : vec2<f32>, u_4 : ptr<function, CoverageBandUniforms_std140_0>) -> vec4<f32>\n{\n var _S6 : f32 = covFlipX_0(mix(x0_0, x1_0, local_0.x), &((*u_4)));\n return vec4<f32>(_S6, mix(yBot_0, yTop_0, local_0.y), 0.0f, 1.0f);\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 covClipKindColor_0( ct_0 : f32, u_5 : ptr<function, CoverageBandUniforms_std140_0>) -> vec3<f32>\n{\n var ci_0 : i32 = i32(ct_0);\n if(ci_0 == i32(2))\n {\n return unpackRGBA_0((*u_5).colorSoftclipIndicator_0).xyz;\n }\n if(ci_0 == i32(3))\n {\n return unpackRGBA_0((*u_5).colorHardclipIndicator_0).xyz;\n }\n return unpackRGBA_0((*u_5).colorInsertionIndicator_0).xyz;\n}\n\nstruct CoverageVsOut_0\n{\n @builtin(position) position_0 : vec4<f32>,\n @location(0) color_0 : vec4<f32>,\n};\n\nstruct vertexInput_0\n{\n @location(0) position_1 : u32,\n @location(1) yOffset_0 : f32,\n @location(2) segHeight_0 : f32,\n @location(3) colorType_0 : f32,\n};\n\n@vertex\nfn vs_main( _S7 : vertexInput_0, @builtin(vertex_index) vid_1 : u32) -> CoverageVsOut_0\n{\n var local_1 : vec2<f32> = quadLocal_0(vid_1);\n var _S8 : CoverageBandUniforms_std140_0 = u_0;\n var _S9 : f32 = covBpToClipX_0(_S7.position_1, &(_S8));\n var barW_0 : f32 = pxToClipLen_0(1.0f, u_0.canvasW_0);\n var topPx_0 : f32 = interbaseEdgePx_0(_S7.yOffset_0, u_0.interbaseHeight_0);\n var botPx_0 : f32 = interbaseEdgePx_0(_S7.yOffset_0 + _S7.segHeight_0, u_0.interbaseHeight_0);\n var _S10 : f32 = covAreaTop_0(&(_S8));\n var o_0 : CoverageVsOut_0;\n var _S11 : f32 = barW_0 * 0.5f;\n var _S12 : vec4<f32> = covFlippedQuad_0(_S9 - _S11, _S9 + _S11, _S10 - pxToClipLen_0(botPx_0, u_0.canvasH_0), _S10 - pxToClipLen_0(topPx_0, u_0.canvasH_0), local_1, &(_S8));\n o_0.position_0 = _S12;\n var _S13 : vec3<f32> = covClipKindColor_0(_S7.colorType_0, &(_S8));\n o_0.color_0 = vec4<f32>(_S13, 1.0f);\n return o_0;\n}\n\nstruct pixelOutput_0\n{\n @location(0) output_0 : vec4<f32>,\n};\n\nstruct pixelInput_0\n{\n @location(0) color_1 : vec4<f32>,\n};\n\n@fragment\nfn fs_main( _S14 : pixelInput_0, @builtin(position) position_2 : vec4<f32>) -> pixelOutput_0\n{\n var _S15 : pixelOutput_0 = pixelOutput_0( _S14.color_1 );\n return _S15;\n}\n\n"
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
// AUTO-GENERATED by packages/shader-tools/src/shader-codegen from coverageMod.slang.
|
|
2
2
|
// Do not edit. Run `pnpm gen:shaders` to regenerate.
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
export const GLSL_VERTEX = "#version 300 es\nprecision highp float;\nprecision highp int;\nstruct CoverageBandUniforms_0\n{\n float bpHi_0;\n float bpLo_0;\n float bpLen_0;\n float hpZero_0;\n float canvasW_0;\n float canvasH_0;\n float covHeight_0;\n float covYOffset_0;\n float covTop_0;\n float regionMaxDepth_0;\n float depthDomainMax_0;\n float depthDomainMin_0;\n float coverageSymlogConstant_0;\n float binSize_0;\n float interbaseHeight_0;\n float snpMinFreq_0;\n float reversed_0;\n int coverageScaleType_0;\n uint colorCoverage_0;\n uint colorBaseA_0;\n uint colorBaseC_0;\n uint colorBaseG_0;\n uint colorBaseT_0;\n uint colorBaseN_0;\n uint colorInsertionIndicator_0;\n uint colorSoftclipIndicator_0;\n uint colorHardclipIndicator_0;\n};\n\n\nlayout(std140) uniform Uniforms\n{\n float bpHi_0;\n float bpLo_0;\n float bpLen_0;\n float hpZero_0;\n float canvasW_0;\n float canvasH_0;\n float covHeight_0;\n float covYOffset_0;\n float covTop_0;\n float regionMaxDepth_0;\n float depthDomainMax_0;\n float depthDomainMin_0;\n float coverageSymlogConstant_0;\n float binSize_0;\n float interbaseHeight_0;\n float snpMinFreq_0;\n float reversed_0;\n int coverageScaleType_0;\n uint colorCoverage_0;\n uint colorBaseA_0;\n uint colorBaseC_0;\n uint colorBaseG_0;\n uint colorBaseT_0;\n uint colorBaseN_0;\n uint colorInsertionIndicator_0;\n uint colorSoftclipIndicator_0;\n uint colorHardclipIndicator_0;\n}u_0;\n\nvec2 quadLocal_0(uint vid_0)\n{\n\n uint v_0 = vid_0 % 6U;\n\n bool _S1 = v_0 == 0U;\n\n bool _S2;\n\n if(_S1)\n {\n\n _S2 = true;\n\n }\n else\n {\n\n _S2 = v_0 == 2U;\n\n }\n\n if(_S2)\n {\n\n _S2 = true;\n\n }\n else\n {\n\n _S2 = v_0 == 3U;\n\n }\n\n float _S3;\n\n if(_S2)\n {\n\n _S3 = 0.0;\n\n }\n else\n {\n\n _S3 = 1.0;\n\n }\n if(_S1)\n {\n\n _S2 = true;\n\n }\n else\n {\n\n _S2 = v_0 == 1U;\n\n }\n\n if(_S2)\n {\n\n _S2 = true;\n\n }\n else\n {\n\n _S2 = v_0 == 4U;\n\n }\n\n float _S4;\n\n if(_S2)\n {\n\n _S4 = 0.0;\n\n }\n else\n {\n\n _S4 = 1.0;\n\n }\n\n return vec2(_S3, _S4);\n}\n\n\nvec2 hpSplitUint_0(uint value_0)\n{\n\n uint lo_0 = value_0 & 4095U;\n\n return vec2(float(value_0 - lo_0), float(lo_0));\n}\n\n\nfloat hpToClipX_0(vec2 splitPos_0, vec3 bpRange_0, float hpZero_1)\n{\n float step_0 = 2.0 / bpRange_0.z;\n float _S5 = - (1.0 / hpZero_1);\n\n return dot(vec3(-1.0, max(splitPos_0.x - bpRange_0.x, _S5), max(splitPos_0.y - bpRange_0.y, _S5)), vec3(1.0, step_0, step_0));\n}\n\n\nfloat covBpToClipX_0(uint bp_0, CoverageBandUniforms_0 u_1)\n{\n\n return hpToClipX_0(hpSplitUint_0(bp_0), vec3(u_1.bpHi_0, u_1.bpLo_0, u_1.bpLen_0), u_1.hpZero_0);\n}\n\n\nvec2 expandToMinWidthPx_0(float x1_0, float x2_0, float minWidth_0)\n{\n\n if((x2_0 - x1_0) < minWidth_0)\n {\n\n float mid_0 = (x1_0 + x2_0) * 0.5;\n float _S6 = minWidth_0 * 0.5;\n\n return vec2(mid_0 - _S6, mid_0 + _S6);\n }\n return vec2(x1_0, x2_0);\n}\n\nvec2 expandToMinWidthX_0(float x1_1, float x2_1, float minWidthPx_0, float canvasWidth_0)\n{\n\n return expandToMinWidthPx_0(x1_1, x2_1, minWidthPx_0 * 2.0 / canvasWidth_0);\n}\n\n\nvec2 covExpandMinWidthX_0(float x1_2, float x2_2, float canvasWidth_1)\n{\n\n return expandToMinWidthX_0(x1_2, x2_2, 1.0, canvasWidth_1);\n}\n\n\nfloat covBottomOffsetPx_0(float covHeight_1, float covYOffset_1)\n{\n\n return covHeight_1 - covYOffset_1;\n}\n\n\nfloat covBaselinePx_0(CoverageBandUniforms_0 u_2)\n{\n\n return u_2.covTop_0 + covBottomOffsetPx_0(u_2.covHeight_0, u_2.covYOffset_0);\n}\n\n\nfloat symlogTransform_0(float x_0, float c_0)\n{\n\n return float((int(sign((x_0))))) * log(1.0 + abs(x_0 / c_0));\n}\n\nfloat normalizeScore_0(float score_0, float domainMin_0, float domainMax_0, int scaleType_0, float symlogConstant_0)\n{\n\n if(scaleType_0 == 2)\n {\n\n float tMin_0 = symlogTransform_0(domainMin_0, symlogConstant_0);\n\n float tRange_0 = symlogTransform_0(domainMax_0, symlogConstant_0) - tMin_0;\n if(tRange_0 <= 0.0)\n {\n\n return 0.0;\n }\n return clamp((symlogTransform_0(score_0, symlogConstant_0) - tMin_0) / tRange_0, 0.0, 1.0);\n }\n if(scaleType_0 == 1)\n {\n\n float floorV_0;\n\n if(domainMin_0 > 0.0)\n {\n\n floorV_0 = domainMin_0;\n\n }\n else\n {\n\n floorV_0 = 1.0;\n\n }\n float logMin_0 = log2(floorV_0);\n\n float logRange_0 = log2(max(domainMax_0, floorV_0)) - logMin_0;\n if(logRange_0 <= 0.0)\n {\n\n return 0.0;\n }\n return clamp((log2(max(score_0, floorV_0)) - logMin_0) / logRange_0, 0.0, 1.0);\n }\n float range_0 = domainMax_0 - domainMin_0;\n if(range_0 <= 0.0)\n {\n\n return 0.0;\n }\n\n return clamp((score_0 - domainMin_0) / range_0, 0.0, 1.0);\n}\n\n\nfloat normalizeDepthScalar_0(float rawDepth_0, float domainMin_1, float domainMax_1, int scaleType_1, float symlogConstant_1)\n{\n\n return normalizeScore_0(rawDepth_0, domainMin_1, domainMax_1, scaleType_1, symlogConstant_1);\n}\n\n\nfloat covNormalizeDepth_0(float relDepth_0, CoverageBandUniforms_0 u_3)\n{\n return normalizeDepthScalar_0(relDepth_0 * u_3.regionMaxDepth_0, u_3.depthDomainMin_0, u_3.depthDomainMax_0, u_3.coverageScaleType_0, u_3.coverageSymlogConstant_0);\n}\n\n\nfloat covEffectiveHeightPx_0(float covHeight_2, float covYOffset_2)\n{\n\n return max(covHeight_2 - 2.0 * covYOffset_2, 0.0);\n}\n\n\nfloat covEffHeight_0(CoverageBandUniforms_0 u_4)\n{\n\n return covEffectiveHeightPx_0(u_4.covHeight_0, u_4.covYOffset_0);\n}\n\n\nfloat covBarHeightPx_0(float depthFraction_0, float effectiveHeightPx_0)\n{\n\n return depthFraction_0 * effectiveHeightPx_0;\n}\n\n\nfloat covSegBottomPx_0(float baselinePx_0, float yOffset_0, float barHeightPx_0)\n{\n return baselinePx_0 - yOffset_0 * barHeightPx_0;\n}\n\n\nfloat yPxToClipY_0(float yPx_0, float canvasHeight_0)\n{\n\n return 1.0 - yPx_0 / canvasHeight_0 * 2.0;\n}\n\n\nfloat covSegTopPx_0(float baselinePx_1, float yOffset_1, float segHeight_0, float barHeightPx_1)\n{\n return covSegBottomPx_0(baselinePx_1, yOffset_1, barHeightPx_1) - segHeight_0 * barHeightPx_1;\n}\n\n\nfloat covFlipX_0(float x_1, CoverageBandUniforms_0 u_5)\n{\n\n return mix(x_1, - x_1, u_5.reversed_0);\n}\n\n\nvec4 covFlippedQuad_0(float x0_0, float x1_3, float yBot_0, float yTop_0, vec2 local_0, CoverageBandUniforms_0 u_6)\n{\n return vec4(covFlipX_0(mix(x0_0, x1_3, local_0.x), u_6), mix(yBot_0, yTop_0, local_0.y), 0.0, 1.0);\n}\n\n\nvec4 covSegQuad_0(uint position_0, uint widthBp_0, float yOffset_2, float segHeight_1, float relDepth_1, vec2 local_1, CoverageBandUniforms_0 u_7)\n{\n\n vec2 xx_0 = covExpandMinWidthX_0(covBpToClipX_0(position_0, u_7), covBpToClipX_0(position_0 + widthBp_0, u_7), u_7.canvasW_0);\n\n float basePx_0 = covBaselinePx_0(u_7);\n float barPx_0 = covBarHeightPx_0(covNormalizeDepth_0(relDepth_1, u_7), covEffHeight_0(u_7));\n return covFlippedQuad_0(xx_0.x, xx_0.y, yPxToClipY_0(covSegBottomPx_0(basePx_0, yOffset_2, barPx_0), u_7.canvasH_0), yPxToClipY_0(covSegTopPx_0(basePx_0, yOffset_2, segHeight_1, barPx_0), u_7.canvasH_0), local_1, u_7);\n}\n\n\nvec4 unpackRGBA_0(uint c_1)\n{\n\n return vec4(float((c_1 >> 0U) & 255U), float((c_1 >> 8U) & 255U), float((c_1 >> 16U) & 255U), float((c_1 >> 24U) & 255U)) / 255.0;\n}\n\n\nout vec4 v_color;\n\n\nlayout(location = 0)\nin uint a_position;\n\n\nlayout(location = 1)\nin float a_yOffset;\n\n\nlayout(location = 2)\nin float a_segHeight;\n\n\nlayout(location = 3)\nin uint a_packedColor;\n\n\nlayout(location = 4)\nin float a_relDepth;\n\n\nstruct CoverageVsOut_0\n{\n vec4 position_1;\n vec4 color_0;\n};\n\n\nvoid main()\n{\n\n CoverageVsOut_0 o_0;\n\n CoverageBandUniforms_0 _S7 = CoverageBandUniforms_0(u_0.bpHi_0, u_0.bpLo_0, u_0.bpLen_0, u_0.hpZero_0, u_0.canvasW_0, u_0.canvasH_0, u_0.covHeight_0, u_0.covYOffset_0, u_0.covTop_0, u_0.regionMaxDepth_0, u_0.depthDomainMax_0, u_0.depthDomainMin_0, u_0.coverageSymlogConstant_0, u_0.binSize_0, u_0.interbaseHeight_0, u_0.snpMinFreq_0, u_0.reversed_0, u_0.coverageScaleType_0, u_0.colorCoverage_0, u_0.colorBaseA_0, u_0.colorBaseC_0, u_0.colorBaseG_0, u_0.colorBaseT_0, u_0.colorBaseN_0, u_0.colorInsertionIndicator_0, u_0.colorSoftclipIndicator_0, u_0.colorHardclipIndicator_0);\n o_0.position_1 = covSegQuad_0(a_position, 1U, a_yOffset, a_segHeight, a_relDepth, quadLocal_0(uint(gl_VertexID)), _S7);\n\n o_0.color_0 = unpackRGBA_0(a_packedColor);\n CoverageVsOut_0 _S8 = o_0;\n\n gl_Position = o_0.position_1;\n\n v_color = _S8.color_0;\n\n return;\n}\n\n"
|
|
7
|
-
|
|
8
|
-
export const GLSL_FRAGMENT = "#version 300 es\nprecision highp float;\nprecision highp int;\nlayout(location = 0)\nout vec4 entryPointParam_fs_main_0;\n\n\nin vec4 v_color;\n\n\nvoid main()\n{\n\n entryPointParam_fs_main_0 = v_color;\n\n return;\n}\n\n"
|
|
4
|
+
import type { ShaderSource } from '@jbrowse/render-core/hal'
|
|
9
5
|
|
|
10
6
|
export * from './coverageMod.iface.generated.ts'
|
|
7
|
+
|
|
8
|
+
export const SOURCE: ShaderSource = {
|
|
9
|
+
wgsl: () => import('./coverageMod.wgsl.generated.ts'),
|
|
10
|
+
glsl: () => import('./coverageMod.glsl.generated.ts'),
|
|
11
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// AUTO-GENERATED by packages/shader-tools/src/shader-codegen from coverageMod.slang.
|
|
2
|
+
// Do not edit. Run `pnpm gen:shaders` to regenerate.
|
|
3
|
+
|
|
4
|
+
export const GLSL_VERTEX = "#version 300 es\nprecision highp float;\nprecision highp int;\nstruct CoverageBandUniforms_0\n{\n float bpHi_0;\n float bpLo_0;\n float bpLen_0;\n float hpZero_0;\n float canvasW_0;\n float canvasH_0;\n float covHeight_0;\n float covYOffset_0;\n float covTop_0;\n float regionMaxDepth_0;\n float depthDomainMax_0;\n float depthDomainMin_0;\n float coverageSymlogConstant_0;\n float binSize_0;\n float interbaseHeight_0;\n float snpMinFreq_0;\n float reversed_0;\n int coverageScaleType_0;\n uint colorCoverage_0;\n uint colorBaseA_0;\n uint colorBaseC_0;\n uint colorBaseG_0;\n uint colorBaseT_0;\n uint colorBaseN_0;\n uint colorInsertionIndicator_0;\n uint colorSoftclipIndicator_0;\n uint colorHardclipIndicator_0;\n};\n\n\nlayout(std140) uniform Uniforms\n{\n float bpHi_0;\n float bpLo_0;\n float bpLen_0;\n float hpZero_0;\n float canvasW_0;\n float canvasH_0;\n float covHeight_0;\n float covYOffset_0;\n float covTop_0;\n float regionMaxDepth_0;\n float depthDomainMax_0;\n float depthDomainMin_0;\n float coverageSymlogConstant_0;\n float binSize_0;\n float interbaseHeight_0;\n float snpMinFreq_0;\n float reversed_0;\n int coverageScaleType_0;\n uint colorCoverage_0;\n uint colorBaseA_0;\n uint colorBaseC_0;\n uint colorBaseG_0;\n uint colorBaseT_0;\n uint colorBaseN_0;\n uint colorInsertionIndicator_0;\n uint colorSoftclipIndicator_0;\n uint colorHardclipIndicator_0;\n}u_0;\n\nvec2 quadLocal_0(uint vid_0)\n{\n\n uint v_0 = vid_0 % 6U;\n\n bool _S1 = v_0 == 0U;\n\n bool _S2;\n\n if(_S1)\n {\n\n _S2 = true;\n\n }\n else\n {\n\n _S2 = v_0 == 2U;\n\n }\n\n if(_S2)\n {\n\n _S2 = true;\n\n }\n else\n {\n\n _S2 = v_0 == 3U;\n\n }\n\n float _S3;\n\n if(_S2)\n {\n\n _S3 = 0.0;\n\n }\n else\n {\n\n _S3 = 1.0;\n\n }\n if(_S1)\n {\n\n _S2 = true;\n\n }\n else\n {\n\n _S2 = v_0 == 1U;\n\n }\n\n if(_S2)\n {\n\n _S2 = true;\n\n }\n else\n {\n\n _S2 = v_0 == 4U;\n\n }\n\n float _S4;\n\n if(_S2)\n {\n\n _S4 = 0.0;\n\n }\n else\n {\n\n _S4 = 1.0;\n\n }\n\n return vec2(_S3, _S4);\n}\n\n\nvec2 hpSplitUint_0(uint value_0)\n{\n\n uint lo_0 = value_0 & 4095U;\n\n return vec2(float(value_0 - lo_0), float(lo_0));\n}\n\n\nfloat hpToClipX_0(vec2 splitPos_0, vec3 bpRange_0, float hpZero_1)\n{\n float step_0 = 2.0 / bpRange_0.z;\n float _S5 = - (1.0 / hpZero_1);\n\n return dot(vec3(-1.0, max(splitPos_0.x - bpRange_0.x, _S5), max(splitPos_0.y - bpRange_0.y, _S5)), vec3(1.0, step_0, step_0));\n}\n\n\nfloat covBpToClipX_0(uint bp_0, CoverageBandUniforms_0 u_1)\n{\n\n return hpToClipX_0(hpSplitUint_0(bp_0), vec3(u_1.bpHi_0, u_1.bpLo_0, u_1.bpLen_0), u_1.hpZero_0);\n}\n\n\nfloat expandToMinWidthLeftPx_0(float x1_0, float x2_0, float minWidth_0)\n{\n\n float _S6;\n if((x2_0 - x1_0) < minWidth_0)\n {\n\n _S6 = (x1_0 + x2_0) * 0.5 - minWidth_0 * 0.5;\n\n }\n else\n {\n\n _S6 = x1_0;\n\n }\n\n return _S6;\n}\n\nfloat expandToMinWidthRightPx_0(float x1_1, float x2_1, float minWidth_1)\n{\n\n float _S7;\n if((x2_1 - x1_1) < minWidth_1)\n {\n\n _S7 = (x1_1 + x2_1) * 0.5 + minWidth_1 * 0.5;\n\n }\n else\n {\n\n _S7 = x2_1;\n\n }\n\n return _S7;\n}\n\nvec2 expandToMinWidthPx_0(float x1_2, float x2_2, float minWidth_2)\n{\n\n return vec2(expandToMinWidthLeftPx_0(x1_2, x2_2, minWidth_2), expandToMinWidthRightPx_0(x1_2, x2_2, minWidth_2));\n}\n\n\n\n\nvec2 expandToMinWidthX_0(float x1_3, float x2_3, float minWidthPx_0, float canvasWidth_0)\n{\n\n return expandToMinWidthPx_0(x1_3, x2_3, minWidthPx_0 * 2.0 / canvasWidth_0);\n}\n\n\nvec2 covExpandMinWidthX_0(float x1_4, float x2_4, float canvasWidth_1)\n{\n\n return expandToMinWidthX_0(x1_4, x2_4, 1.0, canvasWidth_1);\n}\n\n\nfloat covBottomOffsetPx_0(float covHeight_1, float covYOffset_1)\n{\n\n return covHeight_1 - covYOffset_1;\n}\n\n\nfloat covBaselinePx_0(CoverageBandUniforms_0 u_2)\n{\n\n return u_2.covTop_0 + covBottomOffsetPx_0(u_2.covHeight_0, u_2.covYOffset_0);\n}\n\n\nfloat log1pf_0(float x_0)\n{\n\n float u_3 = 1.0 + x_0;\n\n float _S8;\n if(u_3 == 1.0)\n {\n\n _S8 = x_0;\n\n }\n else\n {\n\n _S8 = log(u_3) * (x_0 / (u_3 - 1.0));\n\n }\n\n return _S8;\n}\n\nfloat symlogTransform_0(float x_1, float c_0)\n{\n\n return float((int(sign((x_1))))) * log1pf_0(abs(x_1 / c_0));\n}\n\nfloat normalizeScore_0(float score_0, float domainMin_0, float domainMax_0, int scaleType_0, float symlogConstant_0)\n{\n\n float tMax_0;\n\n float tMin_0;\n\n float t_0;\n\n\n\n if(scaleType_0 == 2)\n {\n\n float _S9 = symlogTransform_0(score_0, symlogConstant_0);\n float _S10 = symlogTransform_0(domainMin_0, symlogConstant_0);\n\n tMax_0 = symlogTransform_0(domainMax_0, symlogConstant_0);\n\n tMin_0 = _S10;\n\n t_0 = _S9;\n\n }\n else\n {\n\n if(scaleType_0 == 1)\n {\n if(domainMin_0 > 0.0)\n {\n\n tMax_0 = domainMin_0;\n\n }\n else\n {\n\n tMax_0 = 1.0;\n\n }\n float _S11 = log2(max(score_0, tMax_0));\n float _S12 = log2(tMax_0);\n\n tMax_0 = log2(max(domainMax_0, tMax_0));\n\n tMin_0 = _S12;\n\n t_0 = _S11;\n\n }\n else\n {\n\n tMax_0 = domainMax_0;\n\n tMin_0 = domainMin_0;\n\n t_0 = 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_0 > 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 clamp((t_0 - tMin_0) / tRange_0, 0.0, 1.0);\n}\n\n\nfloat normalizeDepthScalar_0(float rawDepth_0, float domainMin_1, float domainMax_1, int scaleType_1, float symlogConstant_1)\n{\n\n return normalizeScore_0(rawDepth_0, domainMin_1, domainMax_1, scaleType_1, symlogConstant_1);\n}\n\n\nfloat covNormalizeDepth_0(float relDepth_0, CoverageBandUniforms_0 u_4)\n{\n return normalizeDepthScalar_0(relDepth_0 * u_4.regionMaxDepth_0, u_4.depthDomainMin_0, u_4.depthDomainMax_0, u_4.coverageScaleType_0, u_4.coverageSymlogConstant_0);\n}\n\n\nfloat covEffectiveHeightPx_0(float covHeight_2, float covYOffset_2)\n{\n\n return max(covHeight_2 - 2.0 * covYOffset_2, 0.0);\n}\n\n\nfloat covEffHeight_0(CoverageBandUniforms_0 u_5)\n{\n\n return covEffectiveHeightPx_0(u_5.covHeight_0, u_5.covYOffset_0);\n}\n\n\nfloat covBarHeightPx_0(float depthFraction_0, float effectiveHeightPx_0)\n{\n\n return depthFraction_0 * effectiveHeightPx_0;\n}\n\n\nfloat covSegBottomPx_0(float baselinePx_0, float yOffset_0, float barHeightPx_0)\n{\n return baselinePx_0 - yOffset_0 * barHeightPx_0;\n}\n\n\nfloat yPxToClipY_0(float yPx_0, float canvasHeight_0)\n{\n\n return 1.0 - yPx_0 / canvasHeight_0 * 2.0;\n}\n\n\nfloat covSegTopPx_0(float baselinePx_1, float yOffset_1, float segHeight_0, float barHeightPx_1)\n{\n return covSegBottomPx_0(baselinePx_1, yOffset_1, barHeightPx_1) - segHeight_0 * barHeightPx_1;\n}\n\n\nfloat covFlipX_0(float x_2, CoverageBandUniforms_0 u_6)\n{\n\n return mix(x_2, - x_2, u_6.reversed_0);\n}\n\n\nvec4 covFlippedQuad_0(float x0_0, float x1_5, float yBot_0, float yTop_0, vec2 local_0, CoverageBandUniforms_0 u_7)\n{\n return vec4(covFlipX_0(mix(x0_0, x1_5, local_0.x), u_7), mix(yBot_0, yTop_0, local_0.y), 0.0, 1.0);\n}\n\n\nvec4 covSegQuad_0(uint position_0, uint widthBp_0, float yOffset_2, float segHeight_1, float relDepth_1, vec2 local_1, CoverageBandUniforms_0 u_8)\n{\n\n vec2 xx_0 = covExpandMinWidthX_0(covBpToClipX_0(position_0, u_8), covBpToClipX_0(position_0 + widthBp_0, u_8), u_8.canvasW_0);\n\n float basePx_0 = covBaselinePx_0(u_8);\n float barPx_0 = covBarHeightPx_0(covNormalizeDepth_0(relDepth_1, u_8), covEffHeight_0(u_8));\n return covFlippedQuad_0(xx_0.x, xx_0.y, yPxToClipY_0(covSegBottomPx_0(basePx_0, yOffset_2, barPx_0), u_8.canvasH_0), yPxToClipY_0(covSegTopPx_0(basePx_0, yOffset_2, segHeight_1, barPx_0), u_8.canvasH_0), local_1, u_8);\n}\n\n\nvec4 unpackRGBA_0(uint c_1)\n{\n\n return vec4(float((c_1 >> 0U) & 255U), float((c_1 >> 8U) & 255U), float((c_1 >> 16U) & 255U), float((c_1 >> 24U) & 255U)) / 255.0;\n}\n\n\nout vec4 v_color;\n\n\nlayout(location = 0)\nin uint a_position;\n\n\nlayout(location = 1)\nin float a_yOffset;\n\n\nlayout(location = 2)\nin float a_segHeight;\n\n\nlayout(location = 3)\nin uint a_packedColor;\n\n\nlayout(location = 4)\nin float a_relDepth;\n\n\nstruct CoverageVsOut_0\n{\n vec4 position_1;\n vec4 color_0;\n};\n\n\nvoid main()\n{\n\n CoverageVsOut_0 o_0;\n\n CoverageBandUniforms_0 _S13 = CoverageBandUniforms_0(u_0.bpHi_0, u_0.bpLo_0, u_0.bpLen_0, u_0.hpZero_0, u_0.canvasW_0, u_0.canvasH_0, u_0.covHeight_0, u_0.covYOffset_0, u_0.covTop_0, u_0.regionMaxDepth_0, u_0.depthDomainMax_0, u_0.depthDomainMin_0, u_0.coverageSymlogConstant_0, u_0.binSize_0, u_0.interbaseHeight_0, u_0.snpMinFreq_0, u_0.reversed_0, u_0.coverageScaleType_0, u_0.colorCoverage_0, u_0.colorBaseA_0, u_0.colorBaseC_0, u_0.colorBaseG_0, u_0.colorBaseT_0, u_0.colorBaseN_0, u_0.colorInsertionIndicator_0, u_0.colorSoftclipIndicator_0, u_0.colorHardclipIndicator_0);\n o_0.position_1 = covSegQuad_0(a_position, 1U, a_yOffset, a_segHeight, a_relDepth, quadLocal_0(uint(gl_VertexID)), _S13);\n\n o_0.color_0 = unpackRGBA_0(a_packedColor);\n CoverageVsOut_0 _S14 = o_0;\n\n gl_Position = o_0.position_1;\n\n v_color = _S14.color_0;\n\n return;\n}\n\n"
|
|
5
|
+
|
|
6
|
+
export const GLSL_FRAGMENT = "#version 300 es\nprecision highp float;\nprecision highp int;\nlayout(location = 0)\nout vec4 entryPointParam_fs_main_0;\n\n\nin vec4 v_color;\n\n\nvoid main()\n{\n\n entryPointParam_fs_main_0 = v_color;\n\n return;\n}\n\n"
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
import type { VertexAttributeLayout, ShaderBinding } from '@jbrowse/render-core/hal'
|
|
5
5
|
|
|
6
6
|
export const BINDINGS: readonly ShaderBinding[] = [
|
|
7
|
-
{ index: 1, kind: 'uniform', name: 'u' },
|
|
7
|
+
{ index: 1, kind: 'uniform', name: 'u', stages: ['vertex'] },
|
|
8
8
|
]
|
|
9
9
|
|
|
10
10
|
export const VERTS_PER_INSTANCE = 6
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
// AUTO-GENERATED by packages/shader-tools/src/shader-codegen from coverageMod.slang.
|
|
2
|
+
// Do not edit. Run `pnpm gen:shaders` to regenerate.
|
|
3
|
+
|
|
4
|
+
export const WGSL_SOURCE = "struct CoverageBandUniforms_std140_0\n{\n @align(16) bpHi_0 : f32,\n @align(4) bpLo_0 : f32,\n @align(8) bpLen_0 : f32,\n @align(4) hpZero_0 : f32,\n @align(16) canvasW_0 : f32,\n @align(4) canvasH_0 : f32,\n @align(8) covHeight_0 : f32,\n @align(4) covYOffset_0 : f32,\n @align(16) covTop_0 : f32,\n @align(4) regionMaxDepth_0 : f32,\n @align(8) depthDomainMax_0 : f32,\n @align(4) depthDomainMin_0 : f32,\n @align(16) coverageSymlogConstant_0 : f32,\n @align(4) binSize_0 : f32,\n @align(8) interbaseHeight_0 : f32,\n @align(4) snpMinFreq_0 : f32,\n @align(16) reversed_0 : f32,\n @align(4) coverageScaleType_0 : i32,\n @align(8) colorCoverage_0 : u32,\n @align(4) colorBaseA_0 : u32,\n @align(16) colorBaseC_0 : u32,\n @align(4) colorBaseG_0 : u32,\n @align(8) colorBaseT_0 : u32,\n @align(4) colorBaseN_0 : u32,\n @align(16) colorInsertionIndicator_0 : u32,\n @align(4) colorSoftclipIndicator_0 : u32,\n @align(8) colorHardclipIndicator_0 : u32,\n};\n\n@binding(1) @group(0) var<uniform> u_0 : CoverageBandUniforms_std140_0;\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 hpSplitUint_0( value_0 : u32) -> vec2<f32>\n{\n var lo_0 : u32 = (value_0 & (u32(4095)));\n return vec2<f32>(f32(value_0 - lo_0), f32(lo_0));\n}\n\nfn hpToClipX_0( splitPos_0 : vec2<f32>, bpRange_0 : vec3<f32>, hpZero_1 : f32) -> f32\n{\n var step_0 : f32 = 2.0f / bpRange_0.z;\n var _S5 : f32 = - (1.0f / hpZero_1);\n return dot(vec3<f32>(-1.0f, max(splitPos_0.x - bpRange_0.x, _S5), max(splitPos_0.y - bpRange_0.y, _S5)), vec3<f32>(1.0f, step_0, step_0));\n}\n\nfn covBpToClipX_0( bp_0 : u32, u_1 : ptr<function, CoverageBandUniforms_std140_0>) -> f32\n{\n return hpToClipX_0(hpSplitUint_0(bp_0), vec3<f32>((*u_1).bpHi_0, (*u_1).bpLo_0, (*u_1).bpLen_0), (*u_1).hpZero_0);\n}\n\nfn expandToMinWidthLeftPx_0( x1_0 : f32, x2_0 : f32, minWidth_0 : f32) -> f32\n{\n var _S6 : f32;\n if((x2_0 - x1_0) < minWidth_0)\n {\n _S6 = (x1_0 + x2_0) * 0.5f - minWidth_0 * 0.5f;\n }\n else\n {\n _S6 = x1_0;\n }\n return _S6;\n}\n\nfn expandToMinWidthRightPx_0( x1_1 : f32, x2_1 : f32, minWidth_1 : f32) -> f32\n{\n var _S7 : f32;\n if((x2_1 - x1_1) < minWidth_1)\n {\n _S7 = (x1_1 + x2_1) * 0.5f + minWidth_1 * 0.5f;\n }\n else\n {\n _S7 = x2_1;\n }\n return _S7;\n}\n\nfn expandToMinWidthPx_0( x1_2 : f32, x2_2 : f32, minWidth_2 : f32) -> vec2<f32>\n{\n return vec2<f32>(expandToMinWidthLeftPx_0(x1_2, x2_2, minWidth_2), expandToMinWidthRightPx_0(x1_2, x2_2, minWidth_2));\n}\n\nfn expandToMinWidthX_0( x1_3 : f32, x2_3 : f32, minWidthPx_0 : f32, canvasWidth_0 : f32) -> vec2<f32>\n{\n return expandToMinWidthPx_0(x1_3, x2_3, minWidthPx_0 * 2.0f / canvasWidth_0);\n}\n\nfn covExpandMinWidthX_0( x1_4 : f32, x2_4 : f32, canvasWidth_1 : f32) -> vec2<f32>\n{\n return expandToMinWidthX_0(x1_4, x2_4, 1.0f, canvasWidth_1);\n}\n\nfn covBottomOffsetPx_0( covHeight_1 : f32, covYOffset_1 : f32) -> f32\n{\n return covHeight_1 - covYOffset_1;\n}\n\nfn covBaselinePx_0( u_2 : ptr<function, CoverageBandUniforms_std140_0>) -> f32\n{\n return (*u_2).covTop_0 + covBottomOffsetPx_0((*u_2).covHeight_0, (*u_2).covYOffset_0);\n}\n\nfn log1pf_0( x_0 : f32) -> f32\n{\n var u_3 : f32 = 1.0f + x_0;\n var _S8 : f32;\n if(u_3 == 1.0f)\n {\n _S8 = x_0;\n }\n else\n {\n _S8 = log(u_3) * (x_0 / (u_3 - 1.0f));\n }\n return _S8;\n}\n\nfn symlogTransform_0( x_1 : f32, c_0 : f32) -> f32\n{\n return f32((i32(sign((x_1))))) * log1pf_0(abs(x_1 / c_0));\n}\n\nfn normalizeScore_0( score_0 : f32, domainMin_0 : f32, domainMax_0 : f32, scaleType_0 : i32, symlogConstant_0 : f32) -> f32\n{\n var tMax_0 : f32;\n var tMin_0 : f32;\n var t_0 : f32;\n if(scaleType_0 == i32(2))\n {\n var _S9 : f32 = symlogTransform_0(score_0, symlogConstant_0);\n var _S10 : f32 = symlogTransform_0(domainMin_0, symlogConstant_0);\n tMax_0 = symlogTransform_0(domainMax_0, symlogConstant_0);\n tMin_0 = _S10;\n t_0 = _S9;\n }\n else\n {\n if(scaleType_0 == i32(1))\n {\n if(domainMin_0 > 0.0f)\n {\n tMax_0 = domainMin_0;\n }\n else\n {\n tMax_0 = 1.0f;\n }\n var _S11 : f32 = log2(max(score_0, tMax_0));\n var _S12 : f32 = log2(tMax_0);\n tMax_0 = log2(max(domainMax_0, tMax_0));\n tMin_0 = _S12;\n t_0 = _S11;\n }\n else\n {\n tMax_0 = domainMax_0;\n tMin_0 = domainMin_0;\n t_0 = score_0;\n }\n }\n var tRange_0 : f32 = tMax_0 - tMin_0;\n if(tRange_0 <= 0.0f)\n {\n if(t_0 > 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 clamp((t_0 - tMin_0) / tRange_0, 0.0f, 1.0f);\n}\n\nfn normalizeDepthScalar_0( rawDepth_0 : f32, domainMin_1 : f32, domainMax_1 : f32, scaleType_1 : i32, symlogConstant_1 : f32) -> f32\n{\n return normalizeScore_0(rawDepth_0, domainMin_1, domainMax_1, scaleType_1, symlogConstant_1);\n}\n\nfn covNormalizeDepth_0( relDepth_0 : f32, u_4 : ptr<function, CoverageBandUniforms_std140_0>) -> f32\n{\n return normalizeDepthScalar_0(relDepth_0 * (*u_4).regionMaxDepth_0, (*u_4).depthDomainMin_0, (*u_4).depthDomainMax_0, (*u_4).coverageScaleType_0, (*u_4).coverageSymlogConstant_0);\n}\n\nfn covEffectiveHeightPx_0( covHeight_2 : f32, covYOffset_2 : f32) -> f32\n{\n return max(covHeight_2 - 2.0f * covYOffset_2, 0.0f);\n}\n\nfn covEffHeight_0( u_5 : ptr<function, CoverageBandUniforms_std140_0>) -> f32\n{\n return covEffectiveHeightPx_0((*u_5).covHeight_0, (*u_5).covYOffset_0);\n}\n\nfn covBarHeightPx_0( depthFraction_0 : f32, effectiveHeightPx_0 : f32) -> f32\n{\n return depthFraction_0 * effectiveHeightPx_0;\n}\n\nfn covSegBottomPx_0( baselinePx_0 : f32, yOffset_0 : f32, barHeightPx_0 : f32) -> f32\n{\n return baselinePx_0 - yOffset_0 * barHeightPx_0;\n}\n\nfn yPxToClipY_0( yPx_0 : f32, canvasHeight_0 : f32) -> f32\n{\n return 1.0f - yPx_0 / canvasHeight_0 * 2.0f;\n}\n\nfn covSegTopPx_0( baselinePx_1 : f32, yOffset_1 : f32, segHeight_0 : f32, barHeightPx_1 : f32) -> f32\n{\n return covSegBottomPx_0(baselinePx_1, yOffset_1, barHeightPx_1) - segHeight_0 * barHeightPx_1;\n}\n\nfn covFlipX_0( x_2 : f32, u_6 : ptr<function, CoverageBandUniforms_std140_0>) -> f32\n{\n return mix(x_2, - x_2, (*u_6).reversed_0);\n}\n\nfn covFlippedQuad_0( x0_0 : f32, x1_5 : f32, yBot_0 : f32, yTop_0 : f32, local_0 : vec2<f32>, u_7 : ptr<function, CoverageBandUniforms_std140_0>) -> vec4<f32>\n{\n var _S13 : f32 = covFlipX_0(mix(x0_0, x1_5, local_0.x), &((*u_7)));\n return vec4<f32>(_S13, mix(yBot_0, yTop_0, local_0.y), 0.0f, 1.0f);\n}\n\nfn covSegQuad_0( position_0 : u32, widthBp_0 : u32, yOffset_2 : f32, segHeight_1 : f32, relDepth_1 : f32, local_1 : vec2<f32>, u_8 : ptr<function, CoverageBandUniforms_std140_0>) -> vec4<f32>\n{\n var _S14 : f32 = covBpToClipX_0(position_0, &((*u_8)));\n var _S15 : f32 = covBpToClipX_0(position_0 + widthBp_0, &((*u_8)));\n var xx_0 : vec2<f32> = covExpandMinWidthX_0(_S14, _S15, (*u_8).canvasW_0);\n var _S16 : f32 = covBaselinePx_0(&((*u_8)));\n var _S17 : f32 = covNormalizeDepth_0(relDepth_1, &((*u_8)));\n var _S18 : f32 = covEffHeight_0(&((*u_8)));\n var barPx_0 : f32 = covBarHeightPx_0(_S17, _S18);\n var _S19 : vec4<f32> = covFlippedQuad_0(xx_0.x, xx_0.y, yPxToClipY_0(covSegBottomPx_0(_S16, yOffset_2, barPx_0), (*u_8).canvasH_0), yPxToClipY_0(covSegTopPx_0(_S16, yOffset_2, segHeight_1, barPx_0), (*u_8).canvasH_0), local_1, &((*u_8)));\n return _S19;\n}\n\nfn unpackRGBA_0( c_1 : u32) -> vec4<f32>\n{\n return vec4<f32>(f32((((c_1 >> (u32(0)))) & (u32(255)))), f32((((c_1 >> (u32(8)))) & (u32(255)))), f32((((c_1 >> (u32(16)))) & (u32(255)))), f32((((c_1 >> (u32(24)))) & (u32(255))))) / vec4<f32>(255.0f);\n}\n\nstruct CoverageVsOut_0\n{\n @builtin(position) position_1 : vec4<f32>,\n @location(0) color_0 : vec4<f32>,\n};\n\nstruct vertexInput_0\n{\n @location(0) position_2 : u32,\n @location(1) yOffset_3 : f32,\n @location(2) segHeight_2 : f32,\n @location(3) packedColor_0 : u32,\n @location(4) relDepth_2 : f32,\n};\n\n@vertex\nfn vs_main( _S20 : vertexInput_0, @builtin(vertex_index) vid_1 : u32) -> CoverageVsOut_0\n{\n var o_0 : CoverageVsOut_0;\n var _S21 : vec2<f32> = quadLocal_0(vid_1);\n var _S22 : CoverageBandUniforms_std140_0 = u_0;\n var _S23 : vec4<f32> = covSegQuad_0(_S20.position_2, u32(1), _S20.yOffset_3, _S20.segHeight_2, _S20.relDepth_2, _S21, &(_S22));\n o_0.position_1 = _S23;\n o_0.color_0 = unpackRGBA_0(_S20.packedColor_0);\n return o_0;\n}\n\nstruct pixelOutput_0\n{\n @location(0) output_0 : vec4<f32>,\n};\n\nstruct pixelInput_0\n{\n @location(0) color_1 : vec4<f32>,\n};\n\n@fragment\nfn fs_main( _S24 : pixelInput_0, @builtin(position) position_3 : vec4<f32>) -> pixelOutput_0\n{\n var _S25 : pixelOutput_0 = pixelOutput_0( _S24.color_1 );\n return _S25;\n}\n\n"
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
// AUTO-GENERATED by packages/shader-tools/src/shader-codegen from coverageSnp.slang.
|
|
2
2
|
// Do not edit. Run `pnpm gen:shaders` to regenerate.
|
|
3
3
|
|
|
4
|
-
export const WGSL_SOURCE = "struct CoverageBandUniforms_std140_0\n{\n @align(16) bpHi_0 : f32,\n @align(4) bpLo_0 : f32,\n @align(8) bpLen_0 : f32,\n @align(4) hpZero_0 : f32,\n @align(16) canvasW_0 : f32,\n @align(4) canvasH_0 : f32,\n @align(8) covHeight_0 : f32,\n @align(4) covYOffset_0 : f32,\n @align(16) covTop_0 : f32,\n @align(4) regionMaxDepth_0 : f32,\n @align(8) depthDomainMax_0 : f32,\n @align(4) depthDomainMin_0 : f32,\n @align(16) coverageSymlogConstant_0 : f32,\n @align(4) binSize_0 : f32,\n @align(8) interbaseHeight_0 : f32,\n @align(4) snpMinFreq_0 : f32,\n @align(16) reversed_0 : f32,\n @align(4) coverageScaleType_0 : i32,\n @align(8) colorCoverage_0 : u32,\n @align(4) colorBaseA_0 : u32,\n @align(16) colorBaseC_0 : u32,\n @align(4) colorBaseG_0 : u32,\n @align(8) colorBaseT_0 : u32,\n @align(4) colorBaseN_0 : u32,\n @align(16) colorInsertionIndicator_0 : u32,\n @align(4) colorSoftclipIndicator_0 : u32,\n @align(8) colorHardclipIndicator_0 : u32,\n};\n\n@binding(1) @group(0) var<uniform> u_0 : CoverageBandUniforms_std140_0;\nstruct CoverageVsOut_0\n{\n @builtin(position) position_0 : vec4<f32>,\n @location(0) color_0 : vec4<f32>,\n};\n\nfn covDiscardVertex_0() -> CoverageVsOut_0\n{\n var o_0 : CoverageVsOut_0;\n var _S1 : vec4<f32> = vec4<f32>(0.0f);\n o_0.position_0 = _S1;\n o_0.color_0 = _S1;\n return o_0;\n}\n\nfn quadLocal_0( vid_0 : u32) -> vec2<f32>\n{\n var v_0 : u32 = vid_0 % u32(6);\n var _S2 : bool = v_0 == u32(0);\n var _S3 : bool;\n if(_S2)\n {\n _S3 = true;\n }\n else\n {\n _S3 = v_0 == u32(2);\n }\n if(_S3)\n {\n _S3 = true;\n }\n else\n {\n _S3 = v_0 == u32(3);\n }\n var _S4 : f32;\n if(_S3)\n {\n _S4 = 0.0f;\n }\n else\n {\n _S4 = 1.0f;\n }\n if(_S2)\n {\n _S3 = true;\n }\n else\n {\n _S3 = v_0 == u32(1);\n }\n if(_S3)\n {\n _S3 = true;\n }\n else\n {\n _S3 = v_0 == u32(4);\n }\n var _S5 : f32;\n if(_S3)\n {\n _S5 = 0.0f;\n }\n else\n {\n _S5 = 1.0f;\n }\n return vec2<f32>(_S4, _S5);\n}\n\nfn hpSplitUint_0( value_0 : u32) -> vec2<f32>\n{\n var lo_0 : u32 = (value_0 & (u32(4095)));\n return vec2<f32>(f32(value_0 - lo_0), f32(lo_0));\n}\n\nfn hpToClipX_0( splitPos_0 : vec2<f32>, bpRange_0 : vec3<f32>, hpZero_1 : f32) -> f32\n{\n var step_0 : f32 = 2.0f / bpRange_0.z;\n var _S6 : f32 = - (1.0f / hpZero_1);\n return dot(vec3<f32>(-1.0f, max(splitPos_0.x - bpRange_0.x, _S6), max(splitPos_0.y - bpRange_0.y, _S6)), vec3<f32>(1.0f, step_0, step_0));\n}\n\nfn covBpToClipX_0( bp_0 : u32, u_1 : ptr<function, CoverageBandUniforms_std140_0>) -> f32\n{\n return hpToClipX_0(hpSplitUint_0(bp_0), vec3<f32>((*u_1).bpHi_0, (*u_1).bpLo_0, (*u_1).bpLen_0), (*u_1).hpZero_0);\n}\n\nfn expandToMinWidthPx_0( x1_0 : f32, x2_0 : f32, minWidth_0 : f32) -> vec2<f32>\n{\n if((x2_0 - x1_0) < minWidth_0)\n {\n var mid_0 : f32 = (x1_0 + x2_0) * 0.5f;\n var _S7 : f32 = minWidth_0 * 0.5f;\n return vec2<f32>(mid_0 - _S7, mid_0 + _S7);\n }\n return vec2<f32>(x1_0, x2_0);\n}\n\nfn expandToMinWidthX_0( x1_1 : f32, x2_1 : f32, minWidthPx_0 : f32, canvasWidth_0 : f32) -> vec2<f32>\n{\n return expandToMinWidthPx_0(x1_1, x2_1, minWidthPx_0 * 2.0f / canvasWidth_0);\n}\n\nfn covExpandMinWidthX_0( x1_2 : f32, x2_2 : f32, canvasWidth_1 : f32) -> vec2<f32>\n{\n return expandToMinWidthX_0(x1_2, x2_2, 1.0f, canvasWidth_1);\n}\n\nfn covBottomOffsetPx_0( covHeight_1 : f32, covYOffset_1 : f32) -> f32\n{\n return covHeight_1 - covYOffset_1;\n}\n\nfn covBaselinePx_0( u_2 : ptr<function, CoverageBandUniforms_std140_0>) -> f32\n{\n return (*u_2).covTop_0 + covBottomOffsetPx_0((*u_2).covHeight_0, (*u_2).covYOffset_0);\n}\n\nfn symlogTransform_0( x_0 : f32, c_0 : f32) -> f32\n{\n return f32((i32(sign((x_0))))) * log(1.0f + abs(x_0 / c_0));\n}\n\nfn normalizeScore_0( score_0 : f32, domainMin_0 : f32, domainMax_0 : f32, scaleType_0 : i32, symlogConstant_0 : f32) -> f32\n{\n if(scaleType_0 == i32(2))\n {\n var tMin_0 : f32 = symlogTransform_0(domainMin_0, symlogConstant_0);\n var tRange_0 : f32 = symlogTransform_0(domainMax_0, symlogConstant_0) - tMin_0;\n if(tRange_0 <= 0.0f)\n {\n return 0.0f;\n }\n return clamp((symlogTransform_0(score_0, symlogConstant_0) - tMin_0) / tRange_0, 0.0f, 1.0f);\n }\n if(scaleType_0 == i32(1))\n {\n var floorV_0 : f32;\n if(domainMin_0 > 0.0f)\n {\n floorV_0 = domainMin_0;\n }\n else\n {\n floorV_0 = 1.0f;\n }\n var logMin_0 : f32 = log2(floorV_0);\n var logRange_0 : f32 = log2(max(domainMax_0, floorV_0)) - logMin_0;\n if(logRange_0 <= 0.0f)\n {\n return 0.0f;\n }\n return clamp((log2(max(score_0, floorV_0)) - logMin_0) / logRange_0, 0.0f, 1.0f);\n }\n var range_0 : f32 = domainMax_0 - domainMin_0;\n if(range_0 <= 0.0f)\n {\n return 0.0f;\n }\n return clamp((score_0 - domainMin_0) / range_0, 0.0f, 1.0f);\n}\n\nfn normalizeDepthScalar_0( rawDepth_0 : f32, domainMin_1 : f32, domainMax_1 : f32, scaleType_1 : i32, symlogConstant_1 : f32) -> f32\n{\n return normalizeScore_0(rawDepth_0, domainMin_1, domainMax_1, scaleType_1, symlogConstant_1);\n}\n\nfn covNormalizeDepth_0( relDepth_0 : f32, u_3 : ptr<function, CoverageBandUniforms_std140_0>) -> f32\n{\n return normalizeDepthScalar_0(relDepth_0 * (*u_3).regionMaxDepth_0, (*u_3).depthDomainMin_0, (*u_3).depthDomainMax_0, (*u_3).coverageScaleType_0, (*u_3).coverageSymlogConstant_0);\n}\n\nfn covEffectiveHeightPx_0( covHeight_2 : f32, covYOffset_2 : f32) -> f32\n{\n return max(covHeight_2 - 2.0f * covYOffset_2, 0.0f);\n}\n\nfn covEffHeight_0( u_4 : ptr<function, CoverageBandUniforms_std140_0>) -> f32\n{\n return covEffectiveHeightPx_0((*u_4).covHeight_0, (*u_4).covYOffset_0);\n}\n\nfn covBarHeightPx_0( depthFraction_0 : f32, effectiveHeightPx_0 : f32) -> f32\n{\n return depthFraction_0 * effectiveHeightPx_0;\n}\n\nfn covSegBottomPx_0( baselinePx_0 : f32, yOffset_0 : f32, barHeightPx_0 : f32) -> f32\n{\n return baselinePx_0 - yOffset_0 * barHeightPx_0;\n}\n\nfn yPxToClipY_0( yPx_0 : f32, canvasHeight_0 : f32) -> f32\n{\n return 1.0f - yPx_0 / canvasHeight_0 * 2.0f;\n}\n\nfn covSegTopPx_0( baselinePx_1 : f32, yOffset_1 : f32, segHeight_0 : f32, barHeightPx_1 : f32) -> f32\n{\n return covSegBottomPx_0(baselinePx_1, yOffset_1, barHeightPx_1) - segHeight_0 * barHeightPx_1;\n}\n\nfn covFlipX_0( x_1 : f32, u_5 : ptr<function, CoverageBandUniforms_std140_0>) -> f32\n{\n return mix(x_1, - x_1, (*u_5).reversed_0);\n}\n\nfn covFlippedQuad_0( x0_0 : f32, x1_3 : f32, yBot_0 : f32, yTop_0 : f32, local_0 : vec2<f32>, u_6 : ptr<function, CoverageBandUniforms_std140_0>) -> vec4<f32>\n{\n var _S8 : f32 = covFlipX_0(mix(x0_0, x1_3, local_0.x), &((*u_6)));\n return vec4<f32>(_S8, mix(yBot_0, yTop_0, local_0.y), 0.0f, 1.0f);\n}\n\nfn covSegQuad_0( position_1 : u32, widthBp_0 : u32, yOffset_2 : f32, segHeight_1 : f32, relDepth_1 : f32, local_1 : vec2<f32>, u_7 : ptr<function, CoverageBandUniforms_std140_0>) -> vec4<f32>\n{\n var _S9 : f32 = covBpToClipX_0(position_1, &((*u_7)));\n var _S10 : f32 = covBpToClipX_0(position_1 + widthBp_0, &((*u_7)));\n var xx_0 : vec2<f32> = covExpandMinWidthX_0(_S9, _S10, (*u_7).canvasW_0);\n var _S11 : f32 = covBaselinePx_0(&((*u_7)));\n var _S12 : f32 = covNormalizeDepth_0(relDepth_1, &((*u_7)));\n var _S13 : f32 = covEffHeight_0(&((*u_7)));\n var barPx_0 : f32 = covBarHeightPx_0(_S12, _S13);\n var _S14 : vec4<f32> = covFlippedQuad_0(xx_0.x, xx_0.y, yPxToClipY_0(covSegBottomPx_0(_S11, yOffset_2, barPx_0), (*u_7).canvasH_0), yPxToClipY_0(covSegTopPx_0(_S11, yOffset_2, segHeight_1, barPx_0), (*u_7).canvasH_0), local_1, &((*u_7)));\n return _S14;\n}\n\nfn unpackRGBA_0( c_1 : u32) -> vec4<f32>\n{\n return vec4<f32>(f32((((c_1 >> (u32(0)))) & (u32(255)))), f32((((c_1 >> (u32(8)))) & (u32(255)))), f32((((c_1 >> (u32(16)))) & (u32(255)))), f32((((c_1 >> (u32(24)))) & (u32(255))))) / vec4<f32>(255.0f);\n}\n\nfn covSnpColor_0( ct_0 : f32, u_8 : ptr<function, CoverageBandUniforms_std140_0>) -> vec3<f32>\n{\n switch(i32(ct_0))\n {\n case i32(1):\n {\n return unpackRGBA_0((*u_8).colorBaseA_0).xyz;\n }\n case i32(2):\n {\n return unpackRGBA_0((*u_8).colorBaseC_0).xyz;\n }\n case i32(3):\n {\n return unpackRGBA_0((*u_8).colorBaseG_0).xyz;\n }\n case i32(4):\n {\n return unpackRGBA_0((*u_8).colorBaseT_0).xyz;\n }\n default :\n {\n return unpackRGBA_0((*u_8).colorBaseN_0).xyz;\n }\n }\n}\n\nstruct vertexInput_0\n{\n @location(0) position_2 : u32,\n @location(1) yOffset_3 : f32,\n @location(2) segHeight_2 : f32,\n @location(3) colorType_0 : f32,\n @location(4) relDepth_2 : f32,\n};\n\n@vertex\nfn vs_main( _S15 : vertexInput_0, @builtin(vertex_index) vid_1 : u32) -> CoverageVsOut_0\n{\n if((_S15.segHeight_2) < (u_0.snpMinFreq_0))\n {\n return covDiscardVertex_0();\n }\n var o_1 : CoverageVsOut_0;\n var _S16 : vec2<f32> = quadLocal_0(vid_1);\n var _S17 : CoverageBandUniforms_std140_0 = u_0;\n var _S18 : vec4<f32> = covSegQuad_0(_S15.position_2, u32(1), _S15.yOffset_3, _S15.segHeight_2, _S15.relDepth_2, _S16, &(_S17));\n o_1.position_0 = _S18;\n var _S19 : vec3<f32> = covSnpColor_0(_S15.colorType_0, &(_S17));\n o_1.color_0 = vec4<f32>(_S19, 1.0f);\n return o_1;\n}\n\nstruct pixelOutput_0\n{\n @location(0) output_0 : vec4<f32>,\n};\n\nstruct pixelInput_0\n{\n @location(0) color_1 : vec4<f32>,\n};\n\n@fragment\nfn fs_main( _S20 : pixelInput_0, @builtin(position) position_3 : vec4<f32>) -> pixelOutput_0\n{\n var _S21 : pixelOutput_0 = pixelOutput_0( _S20.color_1 );\n return _S21;\n}\n\n"
|
|
5
|
-
|
|
6
|
-
export const GLSL_VERTEX = "#version 300 es\nprecision highp float;\nprecision highp int;\nstruct CoverageBandUniforms_0\n{\n float bpHi_0;\n float bpLo_0;\n float bpLen_0;\n float hpZero_0;\n float canvasW_0;\n float canvasH_0;\n float covHeight_0;\n float covYOffset_0;\n float covTop_0;\n float regionMaxDepth_0;\n float depthDomainMax_0;\n float depthDomainMin_0;\n float coverageSymlogConstant_0;\n float binSize_0;\n float interbaseHeight_0;\n float snpMinFreq_0;\n float reversed_0;\n int coverageScaleType_0;\n uint colorCoverage_0;\n uint colorBaseA_0;\n uint colorBaseC_0;\n uint colorBaseG_0;\n uint colorBaseT_0;\n uint colorBaseN_0;\n uint colorInsertionIndicator_0;\n uint colorSoftclipIndicator_0;\n uint colorHardclipIndicator_0;\n};\n\n\nlayout(std140) uniform Uniforms\n{\n float bpHi_0;\n float bpLo_0;\n float bpLen_0;\n float hpZero_0;\n float canvasW_0;\n float canvasH_0;\n float covHeight_0;\n float covYOffset_0;\n float covTop_0;\n float regionMaxDepth_0;\n float depthDomainMax_0;\n float depthDomainMin_0;\n float coverageSymlogConstant_0;\n float binSize_0;\n float interbaseHeight_0;\n float snpMinFreq_0;\n float reversed_0;\n int coverageScaleType_0;\n uint colorCoverage_0;\n uint colorBaseA_0;\n uint colorBaseC_0;\n uint colorBaseG_0;\n uint colorBaseT_0;\n uint colorBaseN_0;\n uint colorInsertionIndicator_0;\n uint colorSoftclipIndicator_0;\n uint colorHardclipIndicator_0;\n}u_0;\n\nstruct CoverageVsOut_0\n{\n vec4 position_0;\n vec4 color_0;\n};\n\n\n\nCoverageVsOut_0 covDiscardVertex_0()\n{\n\n CoverageVsOut_0 o_0;\n const vec4 _S1 = vec4(0.0);\n\n o_0.position_0 = _S1;\n o_0.color_0 = _S1;\n return o_0;\n}\n\n\nvec2 quadLocal_0(uint vid_0)\n{\n\n uint v_0 = vid_0 % 6U;\n\n bool _S2 = v_0 == 0U;\n\n bool _S3;\n\n if(_S2)\n {\n\n _S3 = true;\n\n }\n else\n {\n\n _S3 = v_0 == 2U;\n\n }\n\n if(_S3)\n {\n\n _S3 = true;\n\n }\n else\n {\n\n _S3 = v_0 == 3U;\n\n }\n\n float _S4;\n\n if(_S3)\n {\n\n _S4 = 0.0;\n\n }\n else\n {\n\n _S4 = 1.0;\n\n }\n if(_S2)\n {\n\n _S3 = true;\n\n }\n else\n {\n\n _S3 = v_0 == 1U;\n\n }\n\n if(_S3)\n {\n\n _S3 = true;\n\n }\n else\n {\n\n _S3 = v_0 == 4U;\n\n }\n\n float _S5;\n\n if(_S3)\n {\n\n _S5 = 0.0;\n\n }\n else\n {\n\n _S5 = 1.0;\n\n }\n\n return vec2(_S4, _S5);\n}\n\n\nvec2 hpSplitUint_0(uint value_0)\n{\n\n uint lo_0 = value_0 & 4095U;\n\n return vec2(float(value_0 - lo_0), float(lo_0));\n}\n\n\nfloat hpToClipX_0(vec2 splitPos_0, vec3 bpRange_0, float hpZero_1)\n{\n float step_0 = 2.0 / bpRange_0.z;\n float _S6 = - (1.0 / hpZero_1);\n\n return dot(vec3(-1.0, max(splitPos_0.x - bpRange_0.x, _S6), max(splitPos_0.y - bpRange_0.y, _S6)), vec3(1.0, step_0, step_0));\n}\n\n\nfloat covBpToClipX_0(uint bp_0, CoverageBandUniforms_0 u_1)\n{\n\n return hpToClipX_0(hpSplitUint_0(bp_0), vec3(u_1.bpHi_0, u_1.bpLo_0, u_1.bpLen_0), u_1.hpZero_0);\n}\n\n\nvec2 expandToMinWidthPx_0(float x1_0, float x2_0, float minWidth_0)\n{\n\n if((x2_0 - x1_0) < minWidth_0)\n {\n\n float mid_0 = (x1_0 + x2_0) * 0.5;\n float _S7 = minWidth_0 * 0.5;\n\n return vec2(mid_0 - _S7, mid_0 + _S7);\n }\n return vec2(x1_0, x2_0);\n}\n\nvec2 expandToMinWidthX_0(float x1_1, float x2_1, float minWidthPx_0, float canvasWidth_0)\n{\n\n return expandToMinWidthPx_0(x1_1, x2_1, minWidthPx_0 * 2.0 / canvasWidth_0);\n}\n\n\nvec2 covExpandMinWidthX_0(float x1_2, float x2_2, float canvasWidth_1)\n{\n\n return expandToMinWidthX_0(x1_2, x2_2, 1.0, canvasWidth_1);\n}\n\n\nfloat covBottomOffsetPx_0(float covHeight_1, float covYOffset_1)\n{\n\n return covHeight_1 - covYOffset_1;\n}\n\n\nfloat covBaselinePx_0(CoverageBandUniforms_0 u_2)\n{\n\n return u_2.covTop_0 + covBottomOffsetPx_0(u_2.covHeight_0, u_2.covYOffset_0);\n}\n\n\nfloat symlogTransform_0(float x_0, float c_0)\n{\n\n return float((int(sign((x_0))))) * log(1.0 + abs(x_0 / c_0));\n}\n\nfloat normalizeScore_0(float score_0, float domainMin_0, float domainMax_0, int scaleType_0, float symlogConstant_0)\n{\n\n if(scaleType_0 == 2)\n {\n\n float tMin_0 = symlogTransform_0(domainMin_0, symlogConstant_0);\n\n float tRange_0 = symlogTransform_0(domainMax_0, symlogConstant_0) - tMin_0;\n if(tRange_0 <= 0.0)\n {\n\n return 0.0;\n }\n return clamp((symlogTransform_0(score_0, symlogConstant_0) - tMin_0) / tRange_0, 0.0, 1.0);\n }\n if(scaleType_0 == 1)\n {\n\n float floorV_0;\n\n if(domainMin_0 > 0.0)\n {\n\n floorV_0 = domainMin_0;\n\n }\n else\n {\n\n floorV_0 = 1.0;\n\n }\n float logMin_0 = log2(floorV_0);\n\n float logRange_0 = log2(max(domainMax_0, floorV_0)) - logMin_0;\n if(logRange_0 <= 0.0)\n {\n\n return 0.0;\n }\n return clamp((log2(max(score_0, floorV_0)) - logMin_0) / logRange_0, 0.0, 1.0);\n }\n float range_0 = domainMax_0 - domainMin_0;\n if(range_0 <= 0.0)\n {\n\n return 0.0;\n }\n\n return clamp((score_0 - domainMin_0) / range_0, 0.0, 1.0);\n}\n\n\nfloat normalizeDepthScalar_0(float rawDepth_0, float domainMin_1, float domainMax_1, int scaleType_1, float symlogConstant_1)\n{\n\n return normalizeScore_0(rawDepth_0, domainMin_1, domainMax_1, scaleType_1, symlogConstant_1);\n}\n\n\nfloat covNormalizeDepth_0(float relDepth_0, CoverageBandUniforms_0 u_3)\n{\n return normalizeDepthScalar_0(relDepth_0 * u_3.regionMaxDepth_0, u_3.depthDomainMin_0, u_3.depthDomainMax_0, u_3.coverageScaleType_0, u_3.coverageSymlogConstant_0);\n}\n\n\nfloat covEffectiveHeightPx_0(float covHeight_2, float covYOffset_2)\n{\n\n return max(covHeight_2 - 2.0 * covYOffset_2, 0.0);\n}\n\n\nfloat covEffHeight_0(CoverageBandUniforms_0 u_4)\n{\n\n return covEffectiveHeightPx_0(u_4.covHeight_0, u_4.covYOffset_0);\n}\n\n\nfloat covBarHeightPx_0(float depthFraction_0, float effectiveHeightPx_0)\n{\n\n return depthFraction_0 * effectiveHeightPx_0;\n}\n\n\nfloat covSegBottomPx_0(float baselinePx_0, float yOffset_0, float barHeightPx_0)\n{\n return baselinePx_0 - yOffset_0 * barHeightPx_0;\n}\n\n\nfloat yPxToClipY_0(float yPx_0, float canvasHeight_0)\n{\n\n return 1.0 - yPx_0 / canvasHeight_0 * 2.0;\n}\n\n\nfloat covSegTopPx_0(float baselinePx_1, float yOffset_1, float segHeight_0, float barHeightPx_1)\n{\n return covSegBottomPx_0(baselinePx_1, yOffset_1, barHeightPx_1) - segHeight_0 * barHeightPx_1;\n}\n\n\nfloat covFlipX_0(float x_1, CoverageBandUniforms_0 u_5)\n{\n\n return mix(x_1, - x_1, u_5.reversed_0);\n}\n\n\nvec4 covFlippedQuad_0(float x0_0, float x1_3, float yBot_0, float yTop_0, vec2 local_0, CoverageBandUniforms_0 u_6)\n{\n return vec4(covFlipX_0(mix(x0_0, x1_3, local_0.x), u_6), mix(yBot_0, yTop_0, local_0.y), 0.0, 1.0);\n}\n\n\nvec4 covSegQuad_0(uint position_1, uint widthBp_0, float yOffset_2, float segHeight_1, float relDepth_1, vec2 local_1, CoverageBandUniforms_0 u_7)\n{\n\n vec2 xx_0 = covExpandMinWidthX_0(covBpToClipX_0(position_1, u_7), covBpToClipX_0(position_1 + widthBp_0, u_7), u_7.canvasW_0);\n\n float basePx_0 = covBaselinePx_0(u_7);\n float barPx_0 = covBarHeightPx_0(covNormalizeDepth_0(relDepth_1, u_7), covEffHeight_0(u_7));\n return covFlippedQuad_0(xx_0.x, xx_0.y, yPxToClipY_0(covSegBottomPx_0(basePx_0, yOffset_2, barPx_0), u_7.canvasH_0), yPxToClipY_0(covSegTopPx_0(basePx_0, yOffset_2, segHeight_1, barPx_0), u_7.canvasH_0), local_1, u_7);\n}\n\n\nvec4 unpackRGBA_0(uint c_1)\n{\n\n return vec4(float((c_1 >> 0U) & 255U), float((c_1 >> 8U) & 255U), float((c_1 >> 16U) & 255U), float((c_1 >> 24U) & 255U)) / 255.0;\n}\n\n\nvec3 covSnpColor_0(float ct_0, CoverageBandUniforms_0 u_8)\n{\n\n switch(int(ct_0))\n {\n case 1:\n {\n\n return unpackRGBA_0(u_8.colorBaseA_0).xyz;\n }\n case 2:\n {\n\n return unpackRGBA_0(u_8.colorBaseC_0).xyz;\n }\n case 3:\n {\n\n return unpackRGBA_0(u_8.colorBaseG_0).xyz;\n }\n case 4:\n {\n\n return unpackRGBA_0(u_8.colorBaseT_0).xyz;\n }\n default:\n {\n\n return unpackRGBA_0(u_8.colorBaseN_0).xyz;\n }\n }\n\n}\n\n\nout vec4 v_color;\n\n\nlayout(location = 0)\nin uint a_position;\n\n\nlayout(location = 1)\nin float a_yOffset;\n\n\nlayout(location = 2)\nin float a_segHeight;\n\n\nlayout(location = 3)\nin float a_colorType;\n\n\nlayout(location = 4)\nin float a_relDepth;\n\n\nvoid main()\n{\n\n if(a_segHeight < (u_0.snpMinFreq_0))\n {\n\n CoverageVsOut_0 _S8 = covDiscardVertex_0();\n\n gl_Position = _S8.position_0;\n\n v_color = _S8.color_0;\n\n return;\n }\n CoverageVsOut_0 o_1;\n\n CoverageBandUniforms_0 _S9 = CoverageBandUniforms_0(u_0.bpHi_0, u_0.bpLo_0, u_0.bpLen_0, u_0.hpZero_0, u_0.canvasW_0, u_0.canvasH_0, u_0.covHeight_0, u_0.covYOffset_0, u_0.covTop_0, u_0.regionMaxDepth_0, u_0.depthDomainMax_0, u_0.depthDomainMin_0, u_0.coverageSymlogConstant_0, u_0.binSize_0, u_0.interbaseHeight_0, u_0.snpMinFreq_0, u_0.reversed_0, u_0.coverageScaleType_0, u_0.colorCoverage_0, u_0.colorBaseA_0, u_0.colorBaseC_0, u_0.colorBaseG_0, u_0.colorBaseT_0, u_0.colorBaseN_0, u_0.colorInsertionIndicator_0, u_0.colorSoftclipIndicator_0, u_0.colorHardclipIndicator_0);\n o_1.position_0 = covSegQuad_0(a_position, 1U, a_yOffset, a_segHeight, a_relDepth, quadLocal_0(uint(gl_VertexID)), _S9);\n\n o_1.color_0 = vec4(covSnpColor_0(a_colorType, _S9), 1.0);\n CoverageVsOut_0 _S10 = o_1;\n\n gl_Position = o_1.position_0;\n\n v_color = _S10.color_0;\n\n return;\n}\n\n"
|
|
7
|
-
|
|
8
|
-
export const GLSL_FRAGMENT = "#version 300 es\nprecision highp float;\nprecision highp int;\nlayout(location = 0)\nout vec4 entryPointParam_fs_main_0;\n\n\nin vec4 v_color;\n\n\nvoid main()\n{\n\n entryPointParam_fs_main_0 = v_color;\n\n return;\n}\n\n"
|
|
4
|
+
import type { ShaderSource } from '@jbrowse/render-core/hal'
|
|
9
5
|
|
|
10
6
|
export * from './coverageSnp.iface.generated.ts'
|
|
7
|
+
|
|
8
|
+
export const SOURCE: ShaderSource = {
|
|
9
|
+
wgsl: () => import('./coverageSnp.wgsl.generated.ts'),
|
|
10
|
+
glsl: () => import('./coverageSnp.glsl.generated.ts'),
|
|
11
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// AUTO-GENERATED by packages/shader-tools/src/shader-codegen from coverageSnp.slang.
|
|
2
|
+
// Do not edit. Run `pnpm gen:shaders` to regenerate.
|
|
3
|
+
|
|
4
|
+
export const GLSL_VERTEX = "#version 300 es\nprecision highp float;\nprecision highp int;\nstruct CoverageBandUniforms_0\n{\n float bpHi_0;\n float bpLo_0;\n float bpLen_0;\n float hpZero_0;\n float canvasW_0;\n float canvasH_0;\n float covHeight_0;\n float covYOffset_0;\n float covTop_0;\n float regionMaxDepth_0;\n float depthDomainMax_0;\n float depthDomainMin_0;\n float coverageSymlogConstant_0;\n float binSize_0;\n float interbaseHeight_0;\n float snpMinFreq_0;\n float reversed_0;\n int coverageScaleType_0;\n uint colorCoverage_0;\n uint colorBaseA_0;\n uint colorBaseC_0;\n uint colorBaseG_0;\n uint colorBaseT_0;\n uint colorBaseN_0;\n uint colorInsertionIndicator_0;\n uint colorSoftclipIndicator_0;\n uint colorHardclipIndicator_0;\n};\n\n\nlayout(std140) uniform Uniforms\n{\n float bpHi_0;\n float bpLo_0;\n float bpLen_0;\n float hpZero_0;\n float canvasW_0;\n float canvasH_0;\n float covHeight_0;\n float covYOffset_0;\n float covTop_0;\n float regionMaxDepth_0;\n float depthDomainMax_0;\n float depthDomainMin_0;\n float coverageSymlogConstant_0;\n float binSize_0;\n float interbaseHeight_0;\n float snpMinFreq_0;\n float reversed_0;\n int coverageScaleType_0;\n uint colorCoverage_0;\n uint colorBaseA_0;\n uint colorBaseC_0;\n uint colorBaseG_0;\n uint colorBaseT_0;\n uint colorBaseN_0;\n uint colorInsertionIndicator_0;\n uint colorSoftclipIndicator_0;\n uint colorHardclipIndicator_0;\n}u_0;\n\nstruct CoverageVsOut_0\n{\n vec4 position_0;\n vec4 color_0;\n};\n\n\n\nCoverageVsOut_0 covDiscardVertex_0()\n{\n\n CoverageVsOut_0 o_0;\n const vec4 _S1 = vec4(0.0);\n\n o_0.position_0 = _S1;\n o_0.color_0 = _S1;\n return o_0;\n}\n\n\nvec2 quadLocal_0(uint vid_0)\n{\n\n uint v_0 = vid_0 % 6U;\n\n bool _S2 = v_0 == 0U;\n\n bool _S3;\n\n if(_S2)\n {\n\n _S3 = true;\n\n }\n else\n {\n\n _S3 = v_0 == 2U;\n\n }\n\n if(_S3)\n {\n\n _S3 = true;\n\n }\n else\n {\n\n _S3 = v_0 == 3U;\n\n }\n\n float _S4;\n\n if(_S3)\n {\n\n _S4 = 0.0;\n\n }\n else\n {\n\n _S4 = 1.0;\n\n }\n if(_S2)\n {\n\n _S3 = true;\n\n }\n else\n {\n\n _S3 = v_0 == 1U;\n\n }\n\n if(_S3)\n {\n\n _S3 = true;\n\n }\n else\n {\n\n _S3 = v_0 == 4U;\n\n }\n\n float _S5;\n\n if(_S3)\n {\n\n _S5 = 0.0;\n\n }\n else\n {\n\n _S5 = 1.0;\n\n }\n\n return vec2(_S4, _S5);\n}\n\n\nvec2 hpSplitUint_0(uint value_0)\n{\n\n uint lo_0 = value_0 & 4095U;\n\n return vec2(float(value_0 - lo_0), float(lo_0));\n}\n\n\nfloat hpToClipX_0(vec2 splitPos_0, vec3 bpRange_0, float hpZero_1)\n{\n float step_0 = 2.0 / bpRange_0.z;\n float _S6 = - (1.0 / hpZero_1);\n\n return dot(vec3(-1.0, max(splitPos_0.x - bpRange_0.x, _S6), max(splitPos_0.y - bpRange_0.y, _S6)), vec3(1.0, step_0, step_0));\n}\n\n\nfloat covBpToClipX_0(uint bp_0, CoverageBandUniforms_0 u_1)\n{\n\n return hpToClipX_0(hpSplitUint_0(bp_0), vec3(u_1.bpHi_0, u_1.bpLo_0, u_1.bpLen_0), u_1.hpZero_0);\n}\n\n\nfloat expandToMinWidthLeftPx_0(float x1_0, float x2_0, float minWidth_0)\n{\n\n float _S7;\n if((x2_0 - x1_0) < minWidth_0)\n {\n\n _S7 = (x1_0 + x2_0) * 0.5 - minWidth_0 * 0.5;\n\n }\n else\n {\n\n _S7 = x1_0;\n\n }\n\n return _S7;\n}\n\nfloat expandToMinWidthRightPx_0(float x1_1, float x2_1, float minWidth_1)\n{\n\n float _S8;\n if((x2_1 - x1_1) < minWidth_1)\n {\n\n _S8 = (x1_1 + x2_1) * 0.5 + minWidth_1 * 0.5;\n\n }\n else\n {\n\n _S8 = x2_1;\n\n }\n\n return _S8;\n}\n\nvec2 expandToMinWidthPx_0(float x1_2, float x2_2, float minWidth_2)\n{\n\n return vec2(expandToMinWidthLeftPx_0(x1_2, x2_2, minWidth_2), expandToMinWidthRightPx_0(x1_2, x2_2, minWidth_2));\n}\n\n\n\n\nvec2 expandToMinWidthX_0(float x1_3, float x2_3, float minWidthPx_0, float canvasWidth_0)\n{\n\n return expandToMinWidthPx_0(x1_3, x2_3, minWidthPx_0 * 2.0 / canvasWidth_0);\n}\n\n\nvec2 covExpandMinWidthX_0(float x1_4, float x2_4, float canvasWidth_1)\n{\n\n return expandToMinWidthX_0(x1_4, x2_4, 1.0, canvasWidth_1);\n}\n\n\nfloat covBottomOffsetPx_0(float covHeight_1, float covYOffset_1)\n{\n\n return covHeight_1 - covYOffset_1;\n}\n\n\nfloat covBaselinePx_0(CoverageBandUniforms_0 u_2)\n{\n\n return u_2.covTop_0 + covBottomOffsetPx_0(u_2.covHeight_0, u_2.covYOffset_0);\n}\n\n\nfloat log1pf_0(float x_0)\n{\n\n float u_3 = 1.0 + x_0;\n\n float _S9;\n if(u_3 == 1.0)\n {\n\n _S9 = x_0;\n\n }\n else\n {\n\n _S9 = log(u_3) * (x_0 / (u_3 - 1.0));\n\n }\n\n return _S9;\n}\n\nfloat symlogTransform_0(float x_1, float c_0)\n{\n\n return float((int(sign((x_1))))) * log1pf_0(abs(x_1 / c_0));\n}\n\nfloat normalizeScore_0(float score_0, float domainMin_0, float domainMax_0, int scaleType_0, float symlogConstant_0)\n{\n\n float tMax_0;\n\n float tMin_0;\n\n float t_0;\n\n\n\n if(scaleType_0 == 2)\n {\n\n float _S10 = symlogTransform_0(score_0, symlogConstant_0);\n float _S11 = symlogTransform_0(domainMin_0, symlogConstant_0);\n\n tMax_0 = symlogTransform_0(domainMax_0, symlogConstant_0);\n\n tMin_0 = _S11;\n\n t_0 = _S10;\n\n }\n else\n {\n\n if(scaleType_0 == 1)\n {\n if(domainMin_0 > 0.0)\n {\n\n tMax_0 = domainMin_0;\n\n }\n else\n {\n\n tMax_0 = 1.0;\n\n }\n float _S12 = log2(max(score_0, tMax_0));\n float _S13 = log2(tMax_0);\n\n tMax_0 = log2(max(domainMax_0, tMax_0));\n\n tMin_0 = _S13;\n\n t_0 = _S12;\n\n }\n else\n {\n\n tMax_0 = domainMax_0;\n\n tMin_0 = domainMin_0;\n\n t_0 = 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_0 > 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 clamp((t_0 - tMin_0) / tRange_0, 0.0, 1.0);\n}\n\n\nfloat normalizeDepthScalar_0(float rawDepth_0, float domainMin_1, float domainMax_1, int scaleType_1, float symlogConstant_1)\n{\n\n return normalizeScore_0(rawDepth_0, domainMin_1, domainMax_1, scaleType_1, symlogConstant_1);\n}\n\n\nfloat covNormalizeDepth_0(float relDepth_0, CoverageBandUniforms_0 u_4)\n{\n return normalizeDepthScalar_0(relDepth_0 * u_4.regionMaxDepth_0, u_4.depthDomainMin_0, u_4.depthDomainMax_0, u_4.coverageScaleType_0, u_4.coverageSymlogConstant_0);\n}\n\n\nfloat covEffectiveHeightPx_0(float covHeight_2, float covYOffset_2)\n{\n\n return max(covHeight_2 - 2.0 * covYOffset_2, 0.0);\n}\n\n\nfloat covEffHeight_0(CoverageBandUniforms_0 u_5)\n{\n\n return covEffectiveHeightPx_0(u_5.covHeight_0, u_5.covYOffset_0);\n}\n\n\nfloat covBarHeightPx_0(float depthFraction_0, float effectiveHeightPx_0)\n{\n\n return depthFraction_0 * effectiveHeightPx_0;\n}\n\n\nfloat covSegBottomPx_0(float baselinePx_0, float yOffset_0, float barHeightPx_0)\n{\n return baselinePx_0 - yOffset_0 * barHeightPx_0;\n}\n\n\nfloat yPxToClipY_0(float yPx_0, float canvasHeight_0)\n{\n\n return 1.0 - yPx_0 / canvasHeight_0 * 2.0;\n}\n\n\nfloat covSegTopPx_0(float baselinePx_1, float yOffset_1, float segHeight_0, float barHeightPx_1)\n{\n return covSegBottomPx_0(baselinePx_1, yOffset_1, barHeightPx_1) - segHeight_0 * barHeightPx_1;\n}\n\n\nfloat covFlipX_0(float x_2, CoverageBandUniforms_0 u_6)\n{\n\n return mix(x_2, - x_2, u_6.reversed_0);\n}\n\n\nvec4 covFlippedQuad_0(float x0_0, float x1_5, float yBot_0, float yTop_0, vec2 local_0, CoverageBandUniforms_0 u_7)\n{\n return vec4(covFlipX_0(mix(x0_0, x1_5, local_0.x), u_7), mix(yBot_0, yTop_0, local_0.y), 0.0, 1.0);\n}\n\n\nvec4 covSegQuad_0(uint position_1, uint widthBp_0, float yOffset_2, float segHeight_1, float relDepth_1, vec2 local_1, CoverageBandUniforms_0 u_8)\n{\n\n vec2 xx_0 = covExpandMinWidthX_0(covBpToClipX_0(position_1, u_8), covBpToClipX_0(position_1 + widthBp_0, u_8), u_8.canvasW_0);\n\n float basePx_0 = covBaselinePx_0(u_8);\n float barPx_0 = covBarHeightPx_0(covNormalizeDepth_0(relDepth_1, u_8), covEffHeight_0(u_8));\n return covFlippedQuad_0(xx_0.x, xx_0.y, yPxToClipY_0(covSegBottomPx_0(basePx_0, yOffset_2, barPx_0), u_8.canvasH_0), yPxToClipY_0(covSegTopPx_0(basePx_0, yOffset_2, segHeight_1, barPx_0), u_8.canvasH_0), local_1, u_8);\n}\n\n\nvec4 unpackRGBA_0(uint c_1)\n{\n\n return vec4(float((c_1 >> 0U) & 255U), float((c_1 >> 8U) & 255U), float((c_1 >> 16U) & 255U), float((c_1 >> 24U) & 255U)) / 255.0;\n}\n\n\nvec3 covSnpColor_0(float ct_0, CoverageBandUniforms_0 u_9)\n{\n\n switch(int(ct_0))\n {\n case 1:\n {\n\n return unpackRGBA_0(u_9.colorBaseA_0).xyz;\n }\n case 2:\n {\n\n return unpackRGBA_0(u_9.colorBaseC_0).xyz;\n }\n case 3:\n {\n\n return unpackRGBA_0(u_9.colorBaseG_0).xyz;\n }\n case 4:\n {\n\n return unpackRGBA_0(u_9.colorBaseT_0).xyz;\n }\n default:\n {\n\n return unpackRGBA_0(u_9.colorBaseN_0).xyz;\n }\n }\n\n}\n\n\nout vec4 v_color;\n\n\nlayout(location = 0)\nin uint a_position;\n\n\nlayout(location = 1)\nin float a_yOffset;\n\n\nlayout(location = 2)\nin float a_segHeight;\n\n\nlayout(location = 3)\nin float a_colorType;\n\n\nlayout(location = 4)\nin float a_relDepth;\n\n\nvoid main()\n{\n\n if(a_segHeight < (u_0.snpMinFreq_0))\n {\n\n CoverageVsOut_0 _S14 = covDiscardVertex_0();\n\n gl_Position = _S14.position_0;\n\n v_color = _S14.color_0;\n\n return;\n }\n CoverageVsOut_0 o_1;\n\n CoverageBandUniforms_0 _S15 = CoverageBandUniforms_0(u_0.bpHi_0, u_0.bpLo_0, u_0.bpLen_0, u_0.hpZero_0, u_0.canvasW_0, u_0.canvasH_0, u_0.covHeight_0, u_0.covYOffset_0, u_0.covTop_0, u_0.regionMaxDepth_0, u_0.depthDomainMax_0, u_0.depthDomainMin_0, u_0.coverageSymlogConstant_0, u_0.binSize_0, u_0.interbaseHeight_0, u_0.snpMinFreq_0, u_0.reversed_0, u_0.coverageScaleType_0, u_0.colorCoverage_0, u_0.colorBaseA_0, u_0.colorBaseC_0, u_0.colorBaseG_0, u_0.colorBaseT_0, u_0.colorBaseN_0, u_0.colorInsertionIndicator_0, u_0.colorSoftclipIndicator_0, u_0.colorHardclipIndicator_0);\n o_1.position_0 = covSegQuad_0(a_position, 1U, a_yOffset, a_segHeight, a_relDepth, quadLocal_0(uint(gl_VertexID)), _S15);\n\n o_1.color_0 = vec4(covSnpColor_0(a_colorType, _S15), 1.0);\n CoverageVsOut_0 _S16 = o_1;\n\n gl_Position = o_1.position_0;\n\n v_color = _S16.color_0;\n\n return;\n}\n\n"
|
|
5
|
+
|
|
6
|
+
export const GLSL_FRAGMENT = "#version 300 es\nprecision highp float;\nprecision highp int;\nlayout(location = 0)\nout vec4 entryPointParam_fs_main_0;\n\n\nin vec4 v_color;\n\n\nvoid main()\n{\n\n entryPointParam_fs_main_0 = v_color;\n\n return;\n}\n\n"
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
import type { VertexAttributeLayout, ShaderBinding } from '@jbrowse/render-core/hal'
|
|
5
5
|
|
|
6
6
|
export const BINDINGS: readonly ShaderBinding[] = [
|
|
7
|
-
{ index: 1, kind: 'uniform', name: 'u' },
|
|
7
|
+
{ index: 1, kind: 'uniform', name: 'u', stages: ['vertex'] },
|
|
8
8
|
]
|
|
9
9
|
|
|
10
10
|
export const VERTS_PER_INSTANCE = 6
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
// AUTO-GENERATED by packages/shader-tools/src/shader-codegen from coverageSnp.slang.
|
|
2
|
+
// Do not edit. Run `pnpm gen:shaders` to regenerate.
|
|
3
|
+
|
|
4
|
+
export const WGSL_SOURCE = "struct CoverageBandUniforms_std140_0\n{\n @align(16) bpHi_0 : f32,\n @align(4) bpLo_0 : f32,\n @align(8) bpLen_0 : f32,\n @align(4) hpZero_0 : f32,\n @align(16) canvasW_0 : f32,\n @align(4) canvasH_0 : f32,\n @align(8) covHeight_0 : f32,\n @align(4) covYOffset_0 : f32,\n @align(16) covTop_0 : f32,\n @align(4) regionMaxDepth_0 : f32,\n @align(8) depthDomainMax_0 : f32,\n @align(4) depthDomainMin_0 : f32,\n @align(16) coverageSymlogConstant_0 : f32,\n @align(4) binSize_0 : f32,\n @align(8) interbaseHeight_0 : f32,\n @align(4) snpMinFreq_0 : f32,\n @align(16) reversed_0 : f32,\n @align(4) coverageScaleType_0 : i32,\n @align(8) colorCoverage_0 : u32,\n @align(4) colorBaseA_0 : u32,\n @align(16) colorBaseC_0 : u32,\n @align(4) colorBaseG_0 : u32,\n @align(8) colorBaseT_0 : u32,\n @align(4) colorBaseN_0 : u32,\n @align(16) colorInsertionIndicator_0 : u32,\n @align(4) colorSoftclipIndicator_0 : u32,\n @align(8) colorHardclipIndicator_0 : u32,\n};\n\n@binding(1) @group(0) var<uniform> u_0 : CoverageBandUniforms_std140_0;\nstruct CoverageVsOut_0\n{\n @builtin(position) position_0 : vec4<f32>,\n @location(0) color_0 : vec4<f32>,\n};\n\nfn covDiscardVertex_0() -> CoverageVsOut_0\n{\n var o_0 : CoverageVsOut_0;\n var _S1 : vec4<f32> = vec4<f32>(0.0f);\n o_0.position_0 = _S1;\n o_0.color_0 = _S1;\n return o_0;\n}\n\nfn quadLocal_0( vid_0 : u32) -> vec2<f32>\n{\n var v_0 : u32 = vid_0 % u32(6);\n var _S2 : bool = v_0 == u32(0);\n var _S3 : bool;\n if(_S2)\n {\n _S3 = true;\n }\n else\n {\n _S3 = v_0 == u32(2);\n }\n if(_S3)\n {\n _S3 = true;\n }\n else\n {\n _S3 = v_0 == u32(3);\n }\n var _S4 : f32;\n if(_S3)\n {\n _S4 = 0.0f;\n }\n else\n {\n _S4 = 1.0f;\n }\n if(_S2)\n {\n _S3 = true;\n }\n else\n {\n _S3 = v_0 == u32(1);\n }\n if(_S3)\n {\n _S3 = true;\n }\n else\n {\n _S3 = v_0 == u32(4);\n }\n var _S5 : f32;\n if(_S3)\n {\n _S5 = 0.0f;\n }\n else\n {\n _S5 = 1.0f;\n }\n return vec2<f32>(_S4, _S5);\n}\n\nfn hpSplitUint_0( value_0 : u32) -> vec2<f32>\n{\n var lo_0 : u32 = (value_0 & (u32(4095)));\n return vec2<f32>(f32(value_0 - lo_0), f32(lo_0));\n}\n\nfn hpToClipX_0( splitPos_0 : vec2<f32>, bpRange_0 : vec3<f32>, hpZero_1 : f32) -> f32\n{\n var step_0 : f32 = 2.0f / bpRange_0.z;\n var _S6 : f32 = - (1.0f / hpZero_1);\n return dot(vec3<f32>(-1.0f, max(splitPos_0.x - bpRange_0.x, _S6), max(splitPos_0.y - bpRange_0.y, _S6)), vec3<f32>(1.0f, step_0, step_0));\n}\n\nfn covBpToClipX_0( bp_0 : u32, u_1 : ptr<function, CoverageBandUniforms_std140_0>) -> f32\n{\n return hpToClipX_0(hpSplitUint_0(bp_0), vec3<f32>((*u_1).bpHi_0, (*u_1).bpLo_0, (*u_1).bpLen_0), (*u_1).hpZero_0);\n}\n\nfn expandToMinWidthLeftPx_0( x1_0 : f32, x2_0 : f32, minWidth_0 : f32) -> f32\n{\n var _S7 : f32;\n if((x2_0 - x1_0) < minWidth_0)\n {\n _S7 = (x1_0 + x2_0) * 0.5f - minWidth_0 * 0.5f;\n }\n else\n {\n _S7 = x1_0;\n }\n return _S7;\n}\n\nfn expandToMinWidthRightPx_0( x1_1 : f32, x2_1 : f32, minWidth_1 : f32) -> f32\n{\n var _S8 : f32;\n if((x2_1 - x1_1) < minWidth_1)\n {\n _S8 = (x1_1 + x2_1) * 0.5f + minWidth_1 * 0.5f;\n }\n else\n {\n _S8 = x2_1;\n }\n return _S8;\n}\n\nfn expandToMinWidthPx_0( x1_2 : f32, x2_2 : f32, minWidth_2 : f32) -> vec2<f32>\n{\n return vec2<f32>(expandToMinWidthLeftPx_0(x1_2, x2_2, minWidth_2), expandToMinWidthRightPx_0(x1_2, x2_2, minWidth_2));\n}\n\nfn expandToMinWidthX_0( x1_3 : f32, x2_3 : f32, minWidthPx_0 : f32, canvasWidth_0 : f32) -> vec2<f32>\n{\n return expandToMinWidthPx_0(x1_3, x2_3, minWidthPx_0 * 2.0f / canvasWidth_0);\n}\n\nfn covExpandMinWidthX_0( x1_4 : f32, x2_4 : f32, canvasWidth_1 : f32) -> vec2<f32>\n{\n return expandToMinWidthX_0(x1_4, x2_4, 1.0f, canvasWidth_1);\n}\n\nfn covBottomOffsetPx_0( covHeight_1 : f32, covYOffset_1 : f32) -> f32\n{\n return covHeight_1 - covYOffset_1;\n}\n\nfn covBaselinePx_0( u_2 : ptr<function, CoverageBandUniforms_std140_0>) -> f32\n{\n return (*u_2).covTop_0 + covBottomOffsetPx_0((*u_2).covHeight_0, (*u_2).covYOffset_0);\n}\n\nfn log1pf_0( x_0 : f32) -> f32\n{\n var u_3 : f32 = 1.0f + x_0;\n var _S9 : f32;\n if(u_3 == 1.0f)\n {\n _S9 = x_0;\n }\n else\n {\n _S9 = log(u_3) * (x_0 / (u_3 - 1.0f));\n }\n return _S9;\n}\n\nfn symlogTransform_0( x_1 : f32, c_0 : f32) -> f32\n{\n return f32((i32(sign((x_1))))) * log1pf_0(abs(x_1 / c_0));\n}\n\nfn normalizeScore_0( score_0 : f32, domainMin_0 : f32, domainMax_0 : f32, scaleType_0 : i32, symlogConstant_0 : f32) -> f32\n{\n var tMax_0 : f32;\n var tMin_0 : f32;\n var t_0 : f32;\n if(scaleType_0 == i32(2))\n {\n var _S10 : f32 = symlogTransform_0(score_0, symlogConstant_0);\n var _S11 : f32 = symlogTransform_0(domainMin_0, symlogConstant_0);\n tMax_0 = symlogTransform_0(domainMax_0, symlogConstant_0);\n tMin_0 = _S11;\n t_0 = _S10;\n }\n else\n {\n if(scaleType_0 == i32(1))\n {\n if(domainMin_0 > 0.0f)\n {\n tMax_0 = domainMin_0;\n }\n else\n {\n tMax_0 = 1.0f;\n }\n var _S12 : f32 = log2(max(score_0, tMax_0));\n var _S13 : f32 = log2(tMax_0);\n tMax_0 = log2(max(domainMax_0, tMax_0));\n tMin_0 = _S13;\n t_0 = _S12;\n }\n else\n {\n tMax_0 = domainMax_0;\n tMin_0 = domainMin_0;\n t_0 = score_0;\n }\n }\n var tRange_0 : f32 = tMax_0 - tMin_0;\n if(tRange_0 <= 0.0f)\n {\n if(t_0 > 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 clamp((t_0 - tMin_0) / tRange_0, 0.0f, 1.0f);\n}\n\nfn normalizeDepthScalar_0( rawDepth_0 : f32, domainMin_1 : f32, domainMax_1 : f32, scaleType_1 : i32, symlogConstant_1 : f32) -> f32\n{\n return normalizeScore_0(rawDepth_0, domainMin_1, domainMax_1, scaleType_1, symlogConstant_1);\n}\n\nfn covNormalizeDepth_0( relDepth_0 : f32, u_4 : ptr<function, CoverageBandUniforms_std140_0>) -> f32\n{\n return normalizeDepthScalar_0(relDepth_0 * (*u_4).regionMaxDepth_0, (*u_4).depthDomainMin_0, (*u_4).depthDomainMax_0, (*u_4).coverageScaleType_0, (*u_4).coverageSymlogConstant_0);\n}\n\nfn covEffectiveHeightPx_0( covHeight_2 : f32, covYOffset_2 : f32) -> f32\n{\n return max(covHeight_2 - 2.0f * covYOffset_2, 0.0f);\n}\n\nfn covEffHeight_0( u_5 : ptr<function, CoverageBandUniforms_std140_0>) -> f32\n{\n return covEffectiveHeightPx_0((*u_5).covHeight_0, (*u_5).covYOffset_0);\n}\n\nfn covBarHeightPx_0( depthFraction_0 : f32, effectiveHeightPx_0 : f32) -> f32\n{\n return depthFraction_0 * effectiveHeightPx_0;\n}\n\nfn covSegBottomPx_0( baselinePx_0 : f32, yOffset_0 : f32, barHeightPx_0 : f32) -> f32\n{\n return baselinePx_0 - yOffset_0 * barHeightPx_0;\n}\n\nfn yPxToClipY_0( yPx_0 : f32, canvasHeight_0 : f32) -> f32\n{\n return 1.0f - yPx_0 / canvasHeight_0 * 2.0f;\n}\n\nfn covSegTopPx_0( baselinePx_1 : f32, yOffset_1 : f32, segHeight_0 : f32, barHeightPx_1 : f32) -> f32\n{\n return covSegBottomPx_0(baselinePx_1, yOffset_1, barHeightPx_1) - segHeight_0 * barHeightPx_1;\n}\n\nfn covFlipX_0( x_2 : f32, u_6 : ptr<function, CoverageBandUniforms_std140_0>) -> f32\n{\n return mix(x_2, - x_2, (*u_6).reversed_0);\n}\n\nfn covFlippedQuad_0( x0_0 : f32, x1_5 : f32, yBot_0 : f32, yTop_0 : f32, local_0 : vec2<f32>, u_7 : ptr<function, CoverageBandUniforms_std140_0>) -> vec4<f32>\n{\n var _S14 : f32 = covFlipX_0(mix(x0_0, x1_5, local_0.x), &((*u_7)));\n return vec4<f32>(_S14, mix(yBot_0, yTop_0, local_0.y), 0.0f, 1.0f);\n}\n\nfn covSegQuad_0( position_1 : u32, widthBp_0 : u32, yOffset_2 : f32, segHeight_1 : f32, relDepth_1 : f32, local_1 : vec2<f32>, u_8 : ptr<function, CoverageBandUniforms_std140_0>) -> vec4<f32>\n{\n var _S15 : f32 = covBpToClipX_0(position_1, &((*u_8)));\n var _S16 : f32 = covBpToClipX_0(position_1 + widthBp_0, &((*u_8)));\n var xx_0 : vec2<f32> = covExpandMinWidthX_0(_S15, _S16, (*u_8).canvasW_0);\n var _S17 : f32 = covBaselinePx_0(&((*u_8)));\n var _S18 : f32 = covNormalizeDepth_0(relDepth_1, &((*u_8)));\n var _S19 : f32 = covEffHeight_0(&((*u_8)));\n var barPx_0 : f32 = covBarHeightPx_0(_S18, _S19);\n var _S20 : vec4<f32> = covFlippedQuad_0(xx_0.x, xx_0.y, yPxToClipY_0(covSegBottomPx_0(_S17, yOffset_2, barPx_0), (*u_8).canvasH_0), yPxToClipY_0(covSegTopPx_0(_S17, yOffset_2, segHeight_1, barPx_0), (*u_8).canvasH_0), local_1, &((*u_8)));\n return _S20;\n}\n\nfn unpackRGBA_0( c_1 : u32) -> vec4<f32>\n{\n return vec4<f32>(f32((((c_1 >> (u32(0)))) & (u32(255)))), f32((((c_1 >> (u32(8)))) & (u32(255)))), f32((((c_1 >> (u32(16)))) & (u32(255)))), f32((((c_1 >> (u32(24)))) & (u32(255))))) / vec4<f32>(255.0f);\n}\n\nfn covSnpColor_0( ct_0 : f32, u_9 : ptr<function, CoverageBandUniforms_std140_0>) -> vec3<f32>\n{\n switch(i32(ct_0))\n {\n case i32(1):\n {\n return unpackRGBA_0((*u_9).colorBaseA_0).xyz;\n }\n case i32(2):\n {\n return unpackRGBA_0((*u_9).colorBaseC_0).xyz;\n }\n case i32(3):\n {\n return unpackRGBA_0((*u_9).colorBaseG_0).xyz;\n }\n case i32(4):\n {\n return unpackRGBA_0((*u_9).colorBaseT_0).xyz;\n }\n default :\n {\n return unpackRGBA_0((*u_9).colorBaseN_0).xyz;\n }\n }\n}\n\nstruct vertexInput_0\n{\n @location(0) position_2 : u32,\n @location(1) yOffset_3 : f32,\n @location(2) segHeight_2 : f32,\n @location(3) colorType_0 : f32,\n @location(4) relDepth_2 : f32,\n};\n\n@vertex\nfn vs_main( _S21 : vertexInput_0, @builtin(vertex_index) vid_1 : u32) -> CoverageVsOut_0\n{\n if((_S21.segHeight_2) < (u_0.snpMinFreq_0))\n {\n return covDiscardVertex_0();\n }\n var o_1 : CoverageVsOut_0;\n var _S22 : vec2<f32> = quadLocal_0(vid_1);\n var _S23 : CoverageBandUniforms_std140_0 = u_0;\n var _S24 : vec4<f32> = covSegQuad_0(_S21.position_2, u32(1), _S21.yOffset_3, _S21.segHeight_2, _S21.relDepth_2, _S22, &(_S23));\n o_1.position_0 = _S24;\n var _S25 : vec3<f32> = covSnpColor_0(_S21.colorType_0, &(_S23));\n o_1.color_0 = vec4<f32>(_S25, 1.0f);\n return o_1;\n}\n\nstruct pixelOutput_0\n{\n @location(0) output_0 : vec4<f32>,\n};\n\nstruct pixelInput_0\n{\n @location(0) color_1 : vec4<f32>,\n};\n\n@fragment\nfn fs_main( _S26 : pixelInput_0, @builtin(position) position_3 : vec4<f32>) -> pixelOutput_0\n{\n var _S27 : pixelOutput_0 = pixelOutput_0( _S26.color_1 );\n return _S27;\n}\n\n"
|
package/src/shaders/hpmath.slang
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
// sub-pixel span is widened. `pnpm gen:shaders` transliterates them into
|
|
10
10
|
// hpmath.js.generated.ts; nothing downstream re-derives them by hand.
|
|
11
11
|
//
|
|
12
|
-
// `
|
|
12
|
+
// `expandToMinWidthLeftPx`/`RightPx` are exported too, but by `coverageBar.slang`, into
|
|
13
13
|
// @jbrowse/alignments-core — the twin's consumer (`fillSpanRect`) lives in a
|
|
14
14
|
// package that cannot import render-core, and this file's own redirect would
|
|
15
15
|
// move every export above with it. adr-051 §"a shader may also export a
|
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
//! js-skip: clipLenToPx — the inverse of pxToClipLen, same reason
|
|
26
26
|
//! js-skip: extendToMinWidthX — clip-space wrapper over the exported extendToMinWidthPx, which is the decision
|
|
27
27
|
//! js-skip: expandToMinWidthX — clip-space wrapper over expandToMinWidthPx, same reason as extendToMinWidthX
|
|
28
|
+
//! js-skip: expandToMinWidthPx — the float2 over expandToMinWidthLeftPx and RightPx, which coverageBar.slang exports as the twins; a float2 twin is a tuple per call, and the pileup walk allocating one per span measured 0.85x against 0.78x of its hand painter
|
|
28
29
|
//! js-skip: snapToPixelX — clip in, clip out; its px core is `floor(x + 0.5)`, which is Math.round and needs no twin
|
|
29
30
|
//! js-skip: snapBoxCenterY — clip-space wrapper over the exported snapBoxCenterYPx
|
|
30
31
|
module hpmath;
|
|
@@ -173,12 +174,23 @@ public float extendToMinWidthX(
|
|
|
173
174
|
// what lets the alignments passes (clip space, a 1 CSS px floor) and the variant
|
|
174
175
|
// matrix (physical px, its own MIN_COL_PX) run one rule instead of two spellings
|
|
175
176
|
// of it.
|
|
177
|
+
// The two edges as scalars, which is what the Canvas2D twins export: a
|
|
178
|
+
// `float2` twin comes back as a tuple, and the pileup walk allocating one per
|
|
179
|
+
// span measured 0.85x against 0.78x of its hand painter
|
|
180
|
+
// (plugins/alignments/benches/rectWalker.bench.ts).
|
|
181
|
+
public float expandToMinWidthLeftPx(float x1, float x2, float minWidth) {
|
|
182
|
+
return x2 - x1 < minWidth ? (x1 + x2) * 0.5 - minWidth * 0.5 : x1;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
public float expandToMinWidthRightPx(float x1, float x2, float minWidth) {
|
|
186
|
+
return x2 - x1 < minWidth ? (x1 + x2) * 0.5 + minWidth * 0.5 : x2;
|
|
187
|
+
}
|
|
188
|
+
|
|
176
189
|
public float2 expandToMinWidthPx(float x1, float x2, float minWidth) {
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
return float2(x1, x2);
|
|
190
|
+
return float2(
|
|
191
|
+
expandToMinWidthLeftPx(x1, x2, minWidth),
|
|
192
|
+
expandToMinWidthRightPx(x1, x2, minWidth)
|
|
193
|
+
);
|
|
182
194
|
}
|
|
183
195
|
|
|
184
196
|
public float2 expandToMinWidthX(
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
// AUTO-GENERATED by packages/shader-tools/src/shader-codegen from pointMark.slang.
|
|
2
2
|
// Do not edit. Run `pnpm gen:shaders` to regenerate.
|
|
3
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) rampMode_0 : i32,\n @align(16) rampMin_0 : f32,\n @align(4) rampMax_0 : f32,\n @align(8) zero_0 : f32,\n @align(4) viewportWidth_0 : f32,\n @align(16) radiusPx_0 : f32,\n @align(4) devicePixelRatio_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\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 hpSplitUint_0( value_0 : u32) -> vec2<f32>\n{\n var lo_0 : u32 = (value_0 & (u32(4095)));\n return vec2<f32>(f32(value_0 - 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 step_0 : f32 = 2.0f / bpRange_0.z;\n var _S5 : f32 = - (1.0f / hpZero_0);\n return dot(vec3<f32>(-1.0f, max(splitPos_0.x - bpRange_0.x, _S5), max(splitPos_0.y - bpRange_0.y, _S5)), vec3<f32>(1.0f, step_0, step_0));\n}\n\nfn bpToClipX_0( bp_0 : u32, u_1 : ptr<function, Uniforms_std140_0>) -> f32\n{\n return hpToClipX_0(hpSplitUint_0(bp_0), (*u_1).bpRangeX_0, (*u_1).zero_0);\n}\n\nfn symlogTransform_0( x_0 : f32, c_0 : f32) -> f32\n{\n return f32((i32(sign((x_0))))) * log(1.0f + abs(x_0 / c_0));\n}\n\nfn normalizeScore_0( score_0 : f32, domainMin_1 : f32, domainMax_1 : f32, scaleType_0 : i32, symlogConstant_0 : f32) -> f32\n{\n if(scaleType_0 == i32(2))\n {\n var tMin_0 : f32 = symlogTransform_0(domainMin_1, symlogConstant_0);\n var tRange_0 : f32 = symlogTransform_0(domainMax_1, symlogConstant_0) - tMin_0;\n if(tRange_0 <= 0.0f)\n {\n return 0.0f;\n }\n return clamp((symlogTransform_0(score_0, symlogConstant_0) - tMin_0) / tRange_0, 0.0f, 1.0f);\n }\n if(scaleType_0 == i32(1))\n {\n var floorV_0 : f32;\n if(domainMin_1 > 0.0f)\n {\n floorV_0 = domainMin_1;\n }\n else\n {\n floorV_0 = 1.0f;\n }\n var logMin_0 : f32 = log2(floorV_0);\n var logRange_0 : f32 = log2(max(domainMax_1, floorV_0)) - logMin_0;\n if(logRange_0 <= 0.0f)\n {\n return 0.0f;\n }\n return clamp((log2(max(score_0, floorV_0)) - logMin_0) / logRange_0, 0.0f, 1.0f);\n }\n var range_0 : f32 = domainMax_1 - domainMin_1;\n if(range_0 <= 0.0f)\n {\n return 0.0f;\n }\n return clamp((score_0 - domainMin_1) / range_0, 0.0f, 1.0f);\n}\n\nfn valueToYPx_0( value_1 : f32, domainMin_2 : f32, domainMax_2 : f32, h_0 : f32) -> f32\n{\n return (1.0f - clamp((value_1 - domainMin_2) / max(domainMax_2 - domainMin_2, 9.99999997475242708e-07f), 0.0f, 1.0f)) * h_0;\n}\n\nfn valueToYPxScaled_0( value_2 : f32, domainMin_3 : f32, domainMax_3 : f32, h_1 : f32, scaleType_1 : i32) -> f32\n{\n if(scaleType_1 == i32(1))\n {\n return (1.0f - normalizeScore_0(value_2, domainMin_3, domainMax_3, i32(1), 1.0f)) * h_1;\n }\n return valueToYPx_0(value_2, domainMin_3, domainMax_3, h_1);\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 clipLenToPx_0( clipLen_0 : f32, size_0 : f32) -> f32\n{\n return clipLen_0 * 0.5f * size_0;\n}\n\nfn pointDrawsBar_0( spanPx_0 : f32, radiusPx_1 : f32) -> bool\n{\n return spanPx_0 > (radiusPx_1 * 2.0f);\n}\n\nfn unpackRGBA_0( c_1 : u32) -> vec4<f32>\n{\n return vec4<f32>(f32((((c_1 >> (u32(0)))) & (u32(255)))), f32((((c_1 >> (u32(8)))) & (u32(255)))), f32((((c_1 >> (u32(16)))) & (u32(255)))), f32((((c_1 >> (u32(24)))) & (u32(255))))) / vec4<f32>(255.0f);\n}\n\nfn rampColor_0( ramp_texture_0 : texture_2d<f32>, ramp_sampler_0 : sampler, t_0 : f32) -> vec4<f32>\n{\n return (textureSampleLevel((ramp_texture_0), (ramp_sampler_0), (vec2<f32>((clamp(t_0, 0.0f, 1.0f) * 255.0f + 0.5f) / 256.0f, 0.5f)), (0.0f)));\n}\n\nfn markInstanceColor_0( ramp_texture_1 : texture_2d<f32>, ramp_sampler_1 : sampler, packed_0 : u32, rampMode_1 : i32, rampMin_1 : f32, rampMax_1 : f32) -> vec4<f32>\n{\n if(rampMode_1 == i32(0))\n {\n return unpackRGBA_0(packed_0);\n }\n var scaleType_2 : i32;\n if(rampMode_1 == i32(2))\n {\n scaleType_2 = i32(1);\n }\n else\n {\n scaleType_2 = i32(0);\n }\n return rampColor_0(ramp_texture_1, ramp_sampler_1, normalizeScore_0((bitcast<f32>((packed_0))), rampMin_1, rampMax_1, scaleType_2, 1.0f));\n}\n\nfn pxToClipLen_0( px_0 : f32, size_1 : f32) -> f32\n{\n return px_0 * 2.0f / size_1;\n}\n\nfn clipXToPx_0( clipX_0 : f32, canvasWidth_0 : f32) -> f32\n{\n return (clipX_0 + 1.0f) * 0.5f * canvasWidth_0;\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_1 : f32) -> f32\n{\n return xPx_0 / canvasWidth_1 * 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 discExpand_0( radiusPx_2 : f32, dpr_2 : f32) -> f32\n{\n return (radiusPx_2 + aaHalfPx_0(dpr_2)) / max(radiusPx_2, 0.5f);\n}\n\nstruct VsOut_0\n{\n @builtin(position) position_0 : vec4<f32>,\n @location(0) color_0 : 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_1 : u32,\n @location(1) x2_0 : u32,\n @location(2) y_0 : f32,\n @location(3) color_1 : u32,\n @location(4) glyph_0 : u32,\n};\n\n@vertex\nfn vs_main( _S6 : 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 _S7 : Uniforms_std140_0 = u_0;\n var _S8 : f32 = bpToClipX_0(_S6.x_1, &(_S7));\n var _S9 : f32 = bpToClipX_0(_S6.x2_0, &(_S7));\n var yPx_1 : f32 = valueToYPxScaled_0(_S6.y_0, u_0.domainMin_0, u_0.domainMax_0, u_0.canvasHeight_0, u_0.valueScaleType_0);\n var centerClipY_0 : f32 = yPxToClipY_0(yPx_1, u_0.canvasHeight_0);\n var isBar_0 : bool = pointDrawsBar_0(clipLenToPx_0(abs(_S9 - _S8), u_0.viewportWidth_0), u_0.radiusPx_0);\n var o_0 : VsOut_0;\n o_0.color_0 = markInstanceColor_0(colorRamp_texture_0, colorRamp_sampler_0, _S6.color_1, u_0.rampMode_0, u_0.rampMin_0, u_0.rampMax_0);\n var x_2 : f32;\n if(isBar_0)\n {\n if(xZero_0)\n {\n x_2 = min(_S8, _S9);\n }\n else\n {\n x_2 = max(_S8, _S9);\n }\n o_0.position_0 = vec4<f32>(x_2, 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 _S10 : bool;\n if((_S6.glyph_0) == u32(0))\n {\n _S10 = (u_0.radiusPx_0 * 2.0f) <= 3.0f;\n }\n else\n {\n _S10 = false;\n }\n if(_S10)\n {\n o_0.position_0 = crispSquareCornerClip_0(_S8, 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 expand_0 : f32 = discExpand_0(u_0.radiusPx_0, u_0.devicePixelRatio_0);\n var _S11 : bool = (_S6.glyph_0) == u32(2);\n if(_S11)\n {\n x_2 = 1.60000002384185791f;\n }\n else\n {\n x_2 = 1.0f;\n }\n var halfPx_0 : f32 = u_0.radiusPx_0 * expand_0 * x_2;\n o_0.position_0 = vec4<f32>(_S8 + 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((_S6.glyph_0) == u32(1))\n {\n x_2 = 2.0f;\n }\n else\n {\n if(_S11)\n {\n x_2 = 1.0f;\n }\n else\n {\n x_2 = 0.0f;\n }\n }\n o_0.shape_0 = x_2;\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_2 : vec4<f32>,\n @location(2) localPos_2 : vec2<f32>,\n @interpolate(flat) @location(1) shape_1 : f32,\n};\n\n@fragment\nfn fs_main( _S12 : pixelInput_0, @builtin(position) position_1 : vec4<f32>) -> pixelOutput_0\n{\n var coverage_1 : f32;\n if((_S12.shape_1) > 2.5f)\n {\n coverage_1 = 1.0f;\n }\n else\n {\n if((_S12.shape_1) > 1.5f)\n {\n var _S13 : f32 = _S12.localPos_2.y;\n var _S14 : f32 = _S12.localPos_2.x;\n coverage_1 = min(1.0f - _S13, min((2.0f * _S14 + _S13 + 1.0f) * 0.44721359014511108f, (-2.0f * _S14 + _S13 + 1.0f) * 0.44721359014511108f));\n }\n else\n {\n if((_S12.shape_1) > 0.5f)\n {\n coverage_1 = 1.0f - (abs(_S12.localPos_2.x) + abs(_S12.localPos_2.y));\n }\n else\n {\n coverage_1 = discCoverage_0(_S12.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 _S15 : pixelOutput_0 = pixelOutput_0( vec4<f32>(_S12.color_2.xyz, _S12.color_2.w * alpha_0) );\n return _S15;\n}\n\n"
|
|
5
|
-
|
|
6
|
-
export const GLSL_VERTEX = "#version 300 es\nprecision highp float;\nprecision highp int;\nprecision highp sampler2D;\nstruct Uniforms_0\n{\n vec3 bpRangeX_0;\n float canvasHeight_0;\n float domainMin_0;\n float domainMax_0;\n int valueScaleType_0;\n int rampMode_0;\n float rampMin_0;\n float rampMax_0;\n float zero_0;\n float viewportWidth_0;\n float radiusPx_0;\n float devicePixelRatio_0;\n};\n\n\n\nlayout(std140) uniform Uniforms\n{\n vec3 bpRangeX_0;\n float canvasHeight_0;\n float domainMin_0;\n float domainMax_0;\n int valueScaleType_0;\n int rampMode_0;\n float rampMin_0;\n float rampMax_0;\n float zero_0;\n float viewportWidth_0;\n float radiusPx_0;\n float devicePixelRatio_0;\n}u_0;\n\nuniform sampler2D u_colorRamp;\n\n\nvec2 quadLocal_0(uint vid_0)\n{\n\n uint v_0 = vid_0 % 6U;\n\n bool _S1 = v_0 == 0U;\n\n bool _S2;\n\n if(_S1)\n {\n\n _S2 = true;\n\n }\n else\n {\n\n _S2 = v_0 == 2U;\n\n }\n\n if(_S2)\n {\n\n _S2 = true;\n\n }\n else\n {\n\n _S2 = v_0 == 3U;\n\n }\n\n float _S3;\n\n if(_S2)\n {\n\n _S3 = 0.0;\n\n }\n else\n {\n\n _S3 = 1.0;\n\n }\n if(_S1)\n {\n\n _S2 = true;\n\n }\n else\n {\n\n _S2 = v_0 == 1U;\n\n }\n\n if(_S2)\n {\n\n _S2 = true;\n\n }\n else\n {\n\n _S2 = v_0 == 4U;\n\n }\n\n float _S4;\n\n if(_S2)\n {\n\n _S4 = 0.0;\n\n }\n else\n {\n\n _S4 = 1.0;\n\n }\n\n return vec2(_S3, _S4);\n}\n\n\nvec2 hpSplitUint_0(uint value_0)\n{\n\n uint lo_0 = value_0 & 4095U;\n\n return vec2(float(value_0 - lo_0), float(lo_0));\n}\n\n\nfloat hpToClipX_0(vec2 splitPos_0, vec3 bpRange_0, float hpZero_0)\n{\n float step_0 = 2.0 / bpRange_0.z;\n float _S5 = - (1.0 / hpZero_0);\n\n return dot(vec3(-1.0, max(splitPos_0.x - bpRange_0.x, _S5), max(splitPos_0.y - bpRange_0.y, _S5)), vec3(1.0, step_0, step_0));\n}\n\n\nfloat bpToClipX_0(uint bp_0, Uniforms_0 u_1)\n{\n\n return hpToClipX_0(hpSplitUint_0(bp_0), u_1.bpRangeX_0, u_1.zero_0);\n}\n\n\nfloat symlogTransform_0(float x_0, float c_0)\n{\n\n return float((int(sign((x_0))))) * log(1.0 + abs(x_0 / c_0));\n}\n\nfloat normalizeScore_0(float score_0, float domainMin_1, float domainMax_1, int scaleType_0, float symlogConstant_0)\n{\n\n if(scaleType_0 == 2)\n {\n\n float tMin_0 = symlogTransform_0(domainMin_1, symlogConstant_0);\n\n float tRange_0 = symlogTransform_0(domainMax_1, symlogConstant_0) - tMin_0;\n if(tRange_0 <= 0.0)\n {\n\n return 0.0;\n }\n return clamp((symlogTransform_0(score_0, symlogConstant_0) - tMin_0) / tRange_0, 0.0, 1.0);\n }\n if(scaleType_0 == 1)\n {\n\n float floorV_0;\n\n if(domainMin_1 > 0.0)\n {\n\n floorV_0 = domainMin_1;\n\n }\n else\n {\n\n floorV_0 = 1.0;\n\n }\n float logMin_0 = log2(floorV_0);\n\n float logRange_0 = log2(max(domainMax_1, floorV_0)) - logMin_0;\n if(logRange_0 <= 0.0)\n {\n\n return 0.0;\n }\n return clamp((log2(max(score_0, floorV_0)) - logMin_0) / logRange_0, 0.0, 1.0);\n }\n float range_0 = domainMax_1 - domainMin_1;\n if(range_0 <= 0.0)\n {\n\n return 0.0;\n }\n\n return clamp((score_0 - domainMin_1) / range_0, 0.0, 1.0);\n}\n\n\nfloat valueToYPx_0(float value_1, float domainMin_2, float domainMax_2, float h_0)\n{\n\n return (1.0 - clamp((value_1 - domainMin_2) / max(domainMax_2 - domainMin_2, 9.99999997475242708e-07), 0.0, 1.0)) * h_0;\n}\n\n\n\n\nfloat valueToYPxScaled_0(float value_2, float domainMin_3, float domainMax_3, float h_1, int scaleType_1)\n{\n\n if(scaleType_1 == 1)\n {\n\n return (1.0 - normalizeScore_0(value_2, domainMin_3, domainMax_3, 1, 1.0)) * h_1;\n }\n return valueToYPx_0(value_2, domainMin_3, domainMax_3, h_1);\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\nfloat clipLenToPx_0(float clipLen_0, float size_0)\n{\n\n return clipLen_0 * 0.5 * size_0;\n}\n\n\nbool pointDrawsBar_0(float spanPx_0, float radiusPx_1)\n{\n\n return spanPx_0 > (radiusPx_1 * 2.0);\n}\n\n\nvec4 unpackRGBA_0(uint c_1)\n{\n\n return vec4(float((c_1 >> 0U) & 255U), float((c_1 >> 8U) & 255U), float((c_1 >> 16U) & 255U), float((c_1 >> 24U) & 255U)) / 255.0;\n}\n\n\nfloat pxToClipLen_0(float px_0, float size_1)\n{\n\n return px_0 * 2.0 / size_1;\n}\n\n\nfloat clipXToPx_0(float clipX_0, float canvasWidth_0)\n{\n\n return (clipX_0 + 1.0) * 0.5 * canvasWidth_0;\n}\n\n\nfloat crispSquareTopLeftPx_0(float centerPx_0, float diameterPx_0)\n{\n\n return floor(centerPx_0 - diameterPx_0 * 0.5 + 0.5);\n}\n\n\n\nvec2 crispSquareCornerPx_0(vec2 centerPx_1, float diameterPx_1, vec2 q_0)\n{\n\n\n\n return vec2(crispSquareTopLeftPx_0(centerPx_1.x, diameterPx_1), crispSquareTopLeftPx_0(centerPx_1.y, diameterPx_1)) + q_0 * diameterPx_1;\n}\n\n\nfloat pxToClipX_0(float xPx_0, float canvasWidth_1)\n{\n\n return xPx_0 / canvasWidth_1 * 2.0 - 1.0;\n}\n\n\nvec4 crispSquareCornerClip_0(float centerClipX_0, float centerYPx_0, float diameterPx_2, vec2 q_1, float viewportWidth_1, float canvasHeight_2)\n{\n\n\n\n vec2 vPx_0 = crispSquareCornerPx_0(vec2(clipXToPx_0(centerClipX_0, viewportWidth_1), centerYPx_0), diameterPx_2, q_1);\n return vec4(pxToClipX_0(vPx_0.x, viewportWidth_1), yPxToClipY_0(vPx_0.y, canvasHeight_2), 0.0, 1.0);\n}\n\n\nfloat aaPx_0(float dpr_0)\n{\n\n return 1.0 / max(dpr_0, 1.0);\n}\n\n\nfloat aaHalfPx_0(float dpr_1)\n{\n\n return 0.5 * aaPx_0(dpr_1);\n}\n\n\nfloat discExpand_0(float radiusPx_2, float dpr_2)\n{\n\n return (radiusPx_2 + aaHalfPx_0(dpr_2)) / max(radiusPx_2, 0.5);\n}\n\n\nout vec4 v_color;\n\n\nout vec2 v_localPos;\n\n\nflat out float v_shape;\n\n\nlayout(location = 0)\nin uint a_x;\n\n\nlayout(location = 1)\nin uint a_x2;\n\n\nlayout(location = 2)\nin float a_y;\n\n\nlayout(location = 3)\nin uint a_color;\n\n\nlayout(location = 4)\nin uint a_glyph;\n\n\nstruct VsOut_0\n{\n vec4 position_0;\n vec4 color_0;\n vec2 localPos_0;\n float shape_0;\n};\n\n\nvec4 rampColor_0(float _S6)\n{\n\n return (textureLod((u_colorRamp), (vec2((clamp(_S6, 0.0, 1.0) * 255.0 + 0.5) / 256.0, 0.5)), (0.0)));\n}\n\n\nvec4 markInstanceColor_0(uint _S7, int _S8, float _S9, float _S10)\n{\n\n if(_S8 == 0)\n {\n\n return unpackRGBA_0(_S7);\n }\n\n int scaleType_2;\n\n if(_S8 == 2)\n {\n\n scaleType_2 = 1;\n\n }\n else\n {\n\n scaleType_2 = 0;\n\n }\n return rampColor_0(normalizeScore_0(uintBitsToFloat(_S7), _S9, _S10, scaleType_2, 1.0));\n}\n\n\nvoid main()\n{\n\n\n vec2 q_2 = quadLocal_0(uint(gl_VertexID) % 6U);\n vec2 local_0 = q_2 * 2.0 - 1.0;\n bool xZero_0 = (q_2.x) < 0.5;\n\n Uniforms_0 _S11 = Uniforms_0(u_0.bpRangeX_0, u_0.canvasHeight_0, u_0.domainMin_0, u_0.domainMax_0, u_0.valueScaleType_0, u_0.rampMode_0, u_0.rampMin_0, u_0.rampMax_0, u_0.zero_0, u_0.viewportWidth_0, u_0.radiusPx_0, u_0.devicePixelRatio_0);\n\n float startClipX_0 = bpToClipX_0(a_x, _S11);\n float endClipX_0 = bpToClipX_0(a_x2, _S11);\n float yPx_1 = valueToYPxScaled_0(a_y, u_0.domainMin_0, u_0.domainMax_0, u_0.canvasHeight_0, u_0.valueScaleType_0);\n float centerClipY_0 = yPxToClipY_0(yPx_1, u_0.canvasHeight_0);\n\n bool isBar_0 = pointDrawsBar_0(clipLenToPx_0(abs(endClipX_0 - startClipX_0), u_0.viewportWidth_0), u_0.radiusPx_0);\n\n VsOut_0 o_0;\n o_0.color_0 = markInstanceColor_0(a_color, u_0.rampMode_0, u_0.rampMin_0, u_0.rampMax_0);\n\n float x_1;\n if(isBar_0)\n {\n\n if(xZero_0)\n {\n\n x_1 = min(startClipX_0, endClipX_0);\n\n }\n else\n {\n\n x_1 = max(startClipX_0, endClipX_0);\n\n }\n\n\n o_0.position_0 = vec4(x_1, centerClipY_0 + pxToClipLen_0(local_0.y * u_0.radiusPx_0, u_0.canvasHeight_0), 0.0, 1.0);\n o_0.localPos_0 = local_0;\n o_0.shape_0 = 3.0;\n\n }\n else\n {\n\n bool _S12;\n\n if(a_glyph == 0U)\n {\n\n _S12 = (u_0.radiusPx_0 * 2.0) <= 3.0;\n\n }\n else\n {\n\n _S12 = false;\n\n }\n\n if(_S12)\n {\n\n\n o_0.position_0 = crispSquareCornerClip_0(startClipX_0, yPx_1, u_0.radiusPx_0 * 2.0, q_2, u_0.viewportWidth_0, u_0.canvasHeight_0);\n\n o_0.localPos_0 = local_0;\n o_0.shape_0 = 3.0;\n\n }\n else\n {\n\n float expand_0 = discExpand_0(u_0.radiusPx_0, u_0.devicePixelRatio_0);\n if(a_glyph == 2U)\n {\n\n x_1 = 1.60000002384185791;\n\n }\n else\n {\n\n x_1 = 1.0;\n\n }\n float halfPx_0 = u_0.radiusPx_0 * expand_0 * x_1;\n\n\n o_0.position_0 = vec4(startClipX_0 + 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.0, 1.0);\n o_0.localPos_0 = local_0 * expand_0;\n if(a_glyph == 1U)\n {\n\n x_1 = 2.0;\n\n }\n else\n {\n\n if(a_glyph == 2U)\n {\n\n x_1 = 1.0;\n\n }\n else\n {\n\n x_1 = 0.0;\n\n }\n\n }\n\n o_0.shape_0 = x_1;\n\n }\n\n }\n\n VsOut_0 _S13 = o_0;\n\n gl_Position = o_0.position_0;\n\n v_color = _S13.color_0;\n\n v_localPos = _S13.localPos_0;\n\n v_shape = _S13.shape_0;\n\n return;\n}\n\n"
|
|
7
|
-
|
|
8
|
-
export const GLSL_FRAGMENT = "#version 300 es\nprecision highp float;\nprecision highp int;\nprecision highp sampler2D;\nfloat discCoverage_0(vec2 localPos_0)\n{\n\n return 1.0 - length(localPos_0);\n}\n\n\nfloat aaGradient_0(float d_0)\n{\n\n return max(length(vec2(dFdx(d_0), dFdy(d_0))), 0.00000999999974738);\n}\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 glyphEdgeAlpha_0(float coverage_0)\n{\n\n return aaRamp_0(coverage_0, aaGradient_0(coverage_0));\n}\n\n\nlayout(location = 0)\nout vec4 entryPointParam_fs_main_0;\n\n\nin vec4 v_color;\n\n\nin vec2 v_localPos;\n\n\nflat in float v_shape;\n\n\nvoid main()\n{\n\n float coverage_1;\n\n if(v_shape > 2.5)\n {\n\n coverage_1 = 1.0;\n\n }\n else\n {\n\n if(v_shape > 1.5)\n {\n\n float _S1 = v_localPos.y;\n float _S2 = v_localPos.x;\n\n coverage_1 = min(1.0 - _S1, min((2.0 * _S2 + _S1 + 1.0) * 0.44721359014511108, (-2.0 * _S2 + _S1 + 1.0) * 0.44721359014511108));\n\n }\n else\n {\n\n if(v_shape > 0.5)\n {\n\n coverage_1 = 1.0 - (abs(v_localPos.x) + abs(v_localPos.y));\n\n }\n else\n {\n\n coverage_1 = discCoverage_0(v_localPos);\n\n }\n\n }\n\n }\n\n float alpha_0 = glyphEdgeAlpha_0(coverage_1);\n if(alpha_0 <= 0.0)\n {\n\n discard;\n\n }\n\n entryPointParam_fs_main_0 = vec4(v_color.xyz, v_color.w * alpha_0);\n\n return;\n}\n\n"
|
|
4
|
+
import type { ShaderSource } from '@jbrowse/render-core/hal'
|
|
9
5
|
|
|
10
6
|
export * from './pointMark.iface.generated.ts'
|
|
11
|
-
|
|
12
7
|
export * from './pointMark.consts.generated.ts'
|
|
8
|
+
|
|
9
|
+
export const SOURCE: ShaderSource = {
|
|
10
|
+
wgsl: () => import('./pointMark.wgsl.generated.ts'),
|
|
11
|
+
glsl: () => import('./pointMark.glsl.generated.ts'),
|
|
12
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
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 GLSL_VERTEX = "#version 300 es\nprecision highp float;\nprecision highp int;\nprecision highp sampler2D;\nstruct Uniforms_0\n{\n vec3 bpRangeX_0;\n float canvasHeight_0;\n float domainMin_0;\n float domainMax_0;\n int valueScaleType_0;\n int rampMode_0;\n float rampMin_0;\n float rampMax_0;\n float zero_0;\n float viewportWidth_0;\n float radiusPx_0;\n float rowHeight_0;\n float insetPx_0;\n float devicePixelRatio_0;\n};\n\n\nlayout(std140) uniform Uniforms\n{\n vec3 bpRangeX_0;\n float canvasHeight_0;\n float domainMin_0;\n float domainMax_0;\n int valueScaleType_0;\n int rampMode_0;\n float rampMin_0;\n float rampMax_0;\n float zero_0;\n float viewportWidth_0;\n float radiusPx_0;\n float rowHeight_0;\n float insetPx_0;\n float devicePixelRatio_0;\n}u_0;\n\nuniform sampler2D u_colorRamp;\n\n\nvec2 quadLocal_0(uint vid_0)\n{\n\n uint v_0 = vid_0 % 6U;\n\n bool _S1 = v_0 == 0U;\n\n bool _S2;\n\n if(_S1)\n {\n\n _S2 = true;\n\n }\n else\n {\n\n _S2 = v_0 == 2U;\n\n }\n\n if(_S2)\n {\n\n _S2 = true;\n\n }\n else\n {\n\n _S2 = v_0 == 3U;\n\n }\n\n float _S3;\n\n if(_S2)\n {\n\n _S3 = 0.0;\n\n }\n else\n {\n\n _S3 = 1.0;\n\n }\n if(_S1)\n {\n\n _S2 = true;\n\n }\n else\n {\n\n _S2 = v_0 == 1U;\n\n }\n\n if(_S2)\n {\n\n _S2 = true;\n\n }\n else\n {\n\n _S2 = v_0 == 4U;\n\n }\n\n float _S4;\n\n if(_S2)\n {\n\n _S4 = 0.0;\n\n }\n else\n {\n\n _S4 = 1.0;\n\n }\n\n return vec2(_S3, _S4);\n}\n\n\nvec2 hpSplitUint_0(uint value_0)\n{\n\n uint lo_0 = value_0 & 4095U;\n\n return vec2(float(value_0 - lo_0), float(lo_0));\n}\n\n\nfloat hpToClipX_0(vec2 splitPos_0, vec3 bpRange_0, float hpZero_0)\n{\n float step_0 = 2.0 / bpRange_0.z;\n float _S5 = - (1.0 / hpZero_0);\n\n return dot(vec3(-1.0, max(splitPos_0.x - bpRange_0.x, _S5), max(splitPos_0.y - bpRange_0.y, _S5)), vec3(1.0, step_0, step_0));\n}\n\n\nfloat bpToClipX_0(uint bp_0, Uniforms_0 u_1)\n{\n\n return hpToClipX_0(hpSplitUint_0(bp_0), u_1.bpRangeX_0, u_1.zero_0);\n}\n\n\nfloat log1pf_0(float x_0)\n{\n\n float u_2 = 1.0 + x_0;\n\n float _S6;\n if(u_2 == 1.0)\n {\n\n _S6 = x_0;\n\n }\n else\n {\n\n _S6 = log(u_2) * (x_0 / (u_2 - 1.0));\n\n }\n\n return _S6;\n}\n\nfloat symlogTransform_0(float x_1, float c_0)\n{\n\n return float((int(sign((x_1))))) * log1pf_0(abs(x_1 / c_0));\n}\n\nfloat normalizeScore_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_0;\n\n\n\n if(scaleType_0 == 2)\n {\n\n float _S7 = symlogTransform_0(score_0, symlogConstant_0);\n float _S8 = symlogTransform_0(domainMin_1, symlogConstant_0);\n\n tMax_0 = symlogTransform_0(domainMax_1, symlogConstant_0);\n\n tMin_0 = _S8;\n\n t_0 = _S7;\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 _S9 = log2(max(score_0, tMax_0));\n float _S10 = log2(tMax_0);\n\n tMax_0 = log2(max(domainMax_1, tMax_0));\n\n tMin_0 = _S10;\n\n t_0 = _S9;\n\n }\n else\n {\n\n tMax_0 = domainMax_1;\n\n tMin_0 = domainMin_1;\n\n t_0 = 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_0 > 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 clamp((t_0 - tMin_0) / tRange_0, 0.0, 1.0);\n}\n\n\nfloat valueToYPxScaled_0(float value_1, float domainMin_2, float domainMax_2, float h_0, int scaleType_1)\n{\n\n return (1.0 - normalizeScore_0(value_1, domainMin_2, domainMax_2, scaleType_1, 1.0)) * h_0;\n}\n\n\nfloat pointYPx_0(float value_2, float domainMin_3, float domainMax_3, float h_1, int scaleType_2, float insetPx_1)\n{\n\n float _S11 = min(insetPx_1, h_1 * 0.5);\n return _S11 + valueToYPxScaled_0(value_2, domainMin_3, domainMax_3, h_1 - 2.0 * _S11, scaleType_2);\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\nfloat clipLenToPx_0(float clipLen_0, float size_0)\n{\n\n return clipLen_0 * 0.5 * size_0;\n}\n\n\nbool pointDrawsBar_0(float spanPx_0, float radiusPx_1)\n{\n\n return spanPx_0 > (radiusPx_1 * 2.0);\n}\n\n\nvec4 unpackRGBA_0(uint c_1)\n{\n\n return vec4(float((c_1 >> 0U) & 255U), float((c_1 >> 8U) & 255U), float((c_1 >> 16U) & 255U), float((c_1 >> 24U) & 255U)) / 255.0;\n}\n\n\nfloat pxToClipLen_0(float px_0, float size_1)\n{\n\n return px_0 * 2.0 / size_1;\n}\n\n\nfloat clipXToPx_0(float clipX_0, float canvasWidth_0)\n{\n\n return (clipX_0 + 1.0) * 0.5 * canvasWidth_0;\n}\n\n\nfloat crispSquareTopLeftPx_0(float centerPx_0, float diameterPx_0)\n{\n\n return floor(centerPx_0 - diameterPx_0 * 0.5 + 0.5);\n}\n\n\n\nvec2 crispSquareCornerPx_0(vec2 centerPx_1, float diameterPx_1, vec2 q_0)\n{\n\n\n\n return vec2(crispSquareTopLeftPx_0(centerPx_1.x, diameterPx_1), crispSquareTopLeftPx_0(centerPx_1.y, diameterPx_1)) + q_0 * diameterPx_1;\n}\n\n\nfloat pxToClipX_0(float xPx_0, float canvasWidth_1)\n{\n\n return xPx_0 / canvasWidth_1 * 2.0 - 1.0;\n}\n\n\nvec4 crispSquareCornerClip_0(float centerClipX_0, float centerYPx_0, float diameterPx_2, vec2 q_1, float viewportWidth_1, float canvasHeight_2)\n{\n\n\n\n vec2 vPx_0 = crispSquareCornerPx_0(vec2(clipXToPx_0(centerClipX_0, viewportWidth_1), centerYPx_0), diameterPx_2, q_1);\n return vec4(pxToClipX_0(vPx_0.x, viewportWidth_1), yPxToClipY_0(vPx_0.y, canvasHeight_2), 0.0, 1.0);\n}\n\n\nfloat aaPx_0(float dpr_0)\n{\n\n return 1.0 / max(dpr_0, 1.0);\n}\n\n\nfloat aaHalfPx_0(float dpr_1)\n{\n\n return 0.5 * aaPx_0(dpr_1);\n}\n\n\nfloat discExpand_0(float radiusPx_2, float dpr_2)\n{\n\n return (radiusPx_2 + aaHalfPx_0(dpr_2)) / max(radiusPx_2, 0.5);\n}\n\n\nout vec4 v_color;\n\n\nout vec2 v_localPos;\n\n\nflat out float v_shape;\n\n\nlayout(location = 0)\nin uint a_x;\n\n\nlayout(location = 1)\nin uint a_x2;\n\n\nlayout(location = 2)\nin float a_y;\n\n\nlayout(location = 3)\nin uint a_color;\n\n\nlayout(location = 4)\nin uint a_glyph;\n\n\nlayout(location = 5)\nin uint a_row;\n\n\nstruct VsOut_0\n{\n vec4 position_0;\n vec4 color_0;\n vec2 localPos_0;\n float shape_0;\n};\n\n\nvec4 rampColor_0(float _S12)\n{\n\n return (textureLod((u_colorRamp), (vec2((clamp(_S12, 0.0, 1.0) * 255.0 + 0.5) / 256.0, 0.5)), (0.0)));\n}\n\n\nvec4 markInstanceColor_0(uint _S13, int _S14, float _S15, float _S16)\n{\n\n if(_S14 == 0)\n {\n\n return unpackRGBA_0(_S13);\n }\n\n int scaleType_3;\n\n if(_S14 == 2)\n {\n\n scaleType_3 = 1;\n\n }\n else\n {\n\n scaleType_3 = 0;\n\n }\n return rampColor_0(normalizeScore_0(uintBitsToFloat(_S13), _S15, _S16, scaleType_3, 1.0));\n}\n\n\nvoid main()\n{\n\n\n vec2 q_2 = quadLocal_0(uint(gl_VertexID) % 6U);\n vec2 local_0 = q_2 * 2.0 - 1.0;\n bool xZero_0 = (q_2.x) < 0.5;\n\n Uniforms_0 _S17 = Uniforms_0(u_0.bpRangeX_0, u_0.canvasHeight_0, u_0.domainMin_0, u_0.domainMax_0, u_0.valueScaleType_0, u_0.rampMode_0, u_0.rampMin_0, u_0.rampMax_0, u_0.zero_0, u_0.viewportWidth_0, u_0.radiusPx_0, u_0.rowHeight_0, u_0.insetPx_0, u_0.devicePixelRatio_0);\n\n float startClipX_0 = bpToClipX_0(a_x, _S17);\n float endClipX_0 = bpToClipX_0(a_x2, _S17);\n float yPx_1 = u_0.rowHeight_0 * float(a_row) + pointYPx_0(a_y, u_0.domainMin_0, u_0.domainMax_0, u_0.rowHeight_0, u_0.valueScaleType_0, u_0.insetPx_0);\n float centerClipY_0 = yPxToClipY_0(yPx_1, u_0.canvasHeight_0);\n\n bool isBar_0 = pointDrawsBar_0(clipLenToPx_0(abs(endClipX_0 - startClipX_0), u_0.viewportWidth_0), u_0.radiusPx_0);\n\n VsOut_0 o_0;\n o_0.color_0 = markInstanceColor_0(a_color, u_0.rampMode_0, u_0.rampMin_0, u_0.rampMax_0);\n\n float x_2;\n if(isBar_0)\n {\n\n if(xZero_0)\n {\n\n x_2 = min(startClipX_0, endClipX_0);\n\n }\n else\n {\n\n x_2 = max(startClipX_0, endClipX_0);\n\n }\n\n\n o_0.position_0 = vec4(x_2, centerClipY_0 + pxToClipLen_0(local_0.y * u_0.radiusPx_0, u_0.canvasHeight_0), 0.0, 1.0);\n o_0.localPos_0 = local_0;\n o_0.shape_0 = 3.0;\n\n }\n else\n {\n\n bool _S18;\n\n if(a_glyph == 0U)\n {\n\n _S18 = (u_0.radiusPx_0 * 2.0) <= 3.0;\n\n }\n else\n {\n\n _S18 = false;\n\n }\n\n if(_S18)\n {\n\n\n o_0.position_0 = crispSquareCornerClip_0(startClipX_0, yPx_1, u_0.radiusPx_0 * 2.0, q_2, u_0.viewportWidth_0, u_0.canvasHeight_0);\n\n o_0.localPos_0 = local_0;\n o_0.shape_0 = 3.0;\n\n }\n else\n {\n\n float expand_0 = discExpand_0(u_0.radiusPx_0, u_0.devicePixelRatio_0);\n if(a_glyph == 2U)\n {\n\n x_2 = 1.60000002384185791;\n\n }\n else\n {\n\n x_2 = 1.0;\n\n }\n float halfPx_0 = u_0.radiusPx_0 * expand_0 * x_2;\n\n\n o_0.position_0 = vec4(startClipX_0 + 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.0, 1.0);\n o_0.localPos_0 = local_0 * expand_0;\n if(a_glyph == 1U)\n {\n\n x_2 = 2.0;\n\n }\n else\n {\n\n if(a_glyph == 2U)\n {\n\n x_2 = 1.0;\n\n }\n else\n {\n\n x_2 = 0.0;\n\n }\n\n }\n\n o_0.shape_0 = x_2;\n\n }\n\n }\n\n VsOut_0 _S19 = o_0;\n\n gl_Position = o_0.position_0;\n\n v_color = _S19.color_0;\n\n v_localPos = _S19.localPos_0;\n\n v_shape = _S19.shape_0;\n\n return;\n}\n\n"
|
|
5
|
+
|
|
6
|
+
export const GLSL_FRAGMENT = "#version 300 es\nprecision highp float;\nprecision highp int;\nprecision highp sampler2D;\nfloat discCoverage_0(vec2 localPos_0)\n{\n\n return 1.0 - length(localPos_0);\n}\n\n\nfloat aaGradient_0(float d_0)\n{\n\n return max(length(vec2(dFdx(d_0), dFdy(d_0))), 0.00000999999974738);\n}\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 glyphEdgeAlpha_0(float coverage_0)\n{\n\n return aaRamp_0(coverage_0, aaGradient_0(coverage_0));\n}\n\n\nlayout(location = 0)\nout vec4 entryPointParam_fs_main_0;\n\n\nin vec4 v_color;\n\n\nin vec2 v_localPos;\n\n\nflat in float v_shape;\n\n\nvoid main()\n{\n\n float coverage_1;\n\n if(v_shape > 2.5)\n {\n\n coverage_1 = 1.0;\n\n }\n else\n {\n\n if(v_shape > 1.5)\n {\n\n float _S1 = v_localPos.y;\n float _S2 = v_localPos.x;\n\n coverage_1 = min(1.0 - _S1, min((2.0 * _S2 + _S1 + 1.0) * 0.44721359014511108, (-2.0 * _S2 + _S1 + 1.0) * 0.44721359014511108));\n\n }\n else\n {\n\n if(v_shape > 0.5)\n {\n\n coverage_1 = 1.0 - (abs(v_localPos.x) + abs(v_localPos.y));\n\n }\n else\n {\n\n coverage_1 = discCoverage_0(v_localPos);\n\n }\n\n }\n\n }\n\n float alpha_0 = glyphEdgeAlpha_0(coverage_1);\n if(alpha_0 <= 0.0)\n {\n\n discard;\n\n }\n\n entryPointParam_fs_main_0 = vec4(v_color.xyz, v_color.w * alpha_0);\n\n return;\n}\n\n"
|
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
import type { VertexAttributeLayout, ShaderBinding, TextureBinding } from '@jbrowse/render-core/hal'
|
|
5
5
|
|
|
6
6
|
export const BINDINGS: readonly ShaderBinding[] = [
|
|
7
|
-
{ index: 1, kind: 'uniform', name: 'u' },
|
|
8
|
-
{ index: 2, kind: 'texture', name: 'colorRamp' },
|
|
9
|
-
{ index: 3, kind: 'sampler', name: 'colorRamp' },
|
|
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
10
|
]
|
|
11
11
|
|
|
12
12
|
export const VERTS_PER_INSTANCE = 6
|
|
@@ -24,7 +24,9 @@ export const UNIFORM_OFFSET_F32 = {
|
|
|
24
24
|
zero: 10,
|
|
25
25
|
viewportWidth: 11,
|
|
26
26
|
radiusPx: 12,
|
|
27
|
-
|
|
27
|
+
rowHeight: 13,
|
|
28
|
+
insetPx: 14,
|
|
29
|
+
devicePixelRatio: 15,
|
|
28
30
|
} as const
|
|
29
31
|
|
|
30
32
|
// Word indices into a Int32Array view over the uniform buffer.
|
|
@@ -46,6 +48,8 @@ export interface Uniforms {
|
|
|
46
48
|
zero: number
|
|
47
49
|
viewportWidth: number
|
|
48
50
|
radiusPx: number
|
|
51
|
+
rowHeight: number
|
|
52
|
+
insetPx: number
|
|
49
53
|
devicePixelRatio: number
|
|
50
54
|
}
|
|
51
55
|
|
|
@@ -65,11 +69,13 @@ export function writeUniforms(buf: ArrayBuffer, uniforms: Uniforms) {
|
|
|
65
69
|
f32[10] = uniforms.zero
|
|
66
70
|
f32[11] = uniforms.viewportWidth
|
|
67
71
|
f32[12] = uniforms.radiusPx
|
|
68
|
-
f32[13] = uniforms.
|
|
72
|
+
f32[13] = uniforms.rowHeight
|
|
73
|
+
f32[14] = uniforms.insetPx
|
|
74
|
+
f32[15] = uniforms.devicePixelRatio
|
|
69
75
|
}
|
|
70
76
|
|
|
71
|
-
export const INSTANCE_STRIDE_BYTES =
|
|
72
|
-
export const INSTANCE_STRIDE_WORDS =
|
|
77
|
+
export const INSTANCE_STRIDE_BYTES = 24
|
|
78
|
+
export const INSTANCE_STRIDE_WORDS = 6
|
|
73
79
|
|
|
74
80
|
// Word indices into a Float32Array view over the instance buffer.
|
|
75
81
|
export const INSTANCE_OFFSET_F32 = {
|
|
@@ -82,6 +88,7 @@ export const INSTANCE_OFFSET_U32 = {
|
|
|
82
88
|
x2: 1,
|
|
83
89
|
color: 3,
|
|
84
90
|
glyph: 4,
|
|
91
|
+
row: 5,
|
|
85
92
|
} as const
|
|
86
93
|
|
|
87
94
|
export const VERTEX_ATTRIBUTES: readonly VertexAttributeLayout[] = [
|
|
@@ -90,6 +97,7 @@ export const VERTEX_ATTRIBUTES: readonly VertexAttributeLayout[] = [
|
|
|
90
97
|
{ name: 'a_y', components: 1, type: 'float', offsetBytes: 8, integer: false },
|
|
91
98
|
{ name: 'a_color', components: 1, type: 'uint', offsetBytes: 12, integer: true },
|
|
92
99
|
{ name: 'a_glyph', components: 1, type: 'uint', offsetBytes: 16, integer: true },
|
|
100
|
+
{ name: 'a_row', components: 1, type: 'uint', offsetBytes: 20, integer: true },
|
|
93
101
|
]
|
|
94
102
|
|
|
95
103
|
export interface InstanceArrays {
|
|
@@ -98,6 +106,7 @@ export interface InstanceArrays {
|
|
|
98
106
|
y: ArrayLike<number>
|
|
99
107
|
color: ArrayLike<number>
|
|
100
108
|
glyph: ArrayLike<number>
|
|
109
|
+
row: ArrayLike<number>
|
|
101
110
|
}
|
|
102
111
|
|
|
103
112
|
export function packInstances(
|
|
@@ -107,7 +116,7 @@ export function packInstances(
|
|
|
107
116
|
) {
|
|
108
117
|
const f32 = new Float32Array(buf)
|
|
109
118
|
const u32 = new Uint32Array(buf)
|
|
110
|
-
const { x, x2, y, color, glyph } = arrays
|
|
119
|
+
const { x, x2, y, color, glyph, row } = arrays
|
|
111
120
|
for (let i = 0; i < numInstances; i++) {
|
|
112
121
|
const o = i * INSTANCE_STRIDE_WORDS
|
|
113
122
|
u32[o + 0] = x[i]!
|
|
@@ -115,6 +124,7 @@ export function packInstances(
|
|
|
115
124
|
f32[o + 2] = y[i]!
|
|
116
125
|
u32[o + 3] = color[i]!
|
|
117
126
|
u32[o + 4] = glyph[i]!
|
|
127
|
+
u32[o + 5] = row[i]!
|
|
118
128
|
}
|
|
119
129
|
return buf
|
|
120
130
|
}
|
|
@@ -164,7 +174,16 @@ export function setInstanceGlyph(u32: Uint32Array, i: number, v: number) {
|
|
|
164
174
|
u32[i * INSTANCE_STRIDE_WORDS + 4] = v
|
|
165
175
|
}
|
|
166
176
|
|
|
177
|
+
// Instance `i`'s `row`.
|
|
178
|
+
export function getInstanceRow(u32: Uint32Array, i: number) {
|
|
179
|
+
return u32[i * INSTANCE_STRIDE_WORDS + 5]!
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
export function setInstanceRow(u32: Uint32Array, i: number, v: number) {
|
|
183
|
+
u32[i * INSTANCE_STRIDE_WORDS + 5] = v
|
|
184
|
+
}
|
|
185
|
+
|
|
167
186
|
// Combined `Sampler2D` bindings. Texture unit indices start at 0.
|
|
168
187
|
export const TEXTURES: readonly [TextureBinding, ...TextureBinding[]] = [
|
|
169
|
-
{
|
|
188
|
+
{ glTextureUnit: 0, glUniformName: 'u_colorRamp', filter: 'linear' },
|
|
170
189
|
]
|