@jbrowse/render-core 5.0.0-beta.3 → 5.0.0-beta.7
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/RenderLifecycleMixin.d.ts +1 -0
- package/esm/RenderLifecycleMixin.js +8 -0
- package/esm/gpuContextLostError.d.ts +30 -0
- package/esm/gpuContextLostError.js +40 -0
- package/esm/gpuDevice.js +4 -1
- package/esm/hal/gpuHalBase.d.ts +3 -3
- package/esm/hal/index.d.ts +1 -1
- package/esm/hal/mockHal.d.ts +3 -3
- package/esm/hal/mockHal.js +3 -2
- package/esm/hal/oomReporter.d.ts +7 -0
- package/esm/hal/oomReporter.js +10 -0
- package/esm/hal/types.d.ts +8 -1
- package/esm/hal/webgl2Hal.d.ts +2 -2
- package/esm/hal/webgl2Hal.js +8 -1
- package/esm/hal/webgpuHal.d.ts +12 -2
- package/esm/hal/webgpuHal.js +49 -11
- package/esm/marks/barMark.d.ts +28 -0
- package/esm/marks/barMark.js +63 -0
- package/esm/marks/drawAgainstHit.d.ts +85 -14
- package/esm/marks/drawAgainstHit.js +260 -38
- package/esm/marks/glyphPaint.d.ts +10 -2
- package/esm/marks/glyphPaint.js +21 -0
- package/esm/marks/index.d.ts +9 -2
- package/esm/marks/index.js +4 -1
- package/esm/marks/markBackend.d.ts +21 -9
- package/esm/marks/markBackend.js +63 -29
- package/esm/marks/markHit.d.ts +32 -0
- package/esm/marks/markHit.js +61 -0
- package/esm/marks/markInk.d.ts +14 -0
- package/esm/marks/markInk.js +34 -0
- package/esm/marks/markPlan.d.ts +25 -0
- package/esm/marks/markPlan.js +20 -0
- package/esm/marks/markRamp.d.ts +43 -0
- package/esm/marks/markRamp.js +68 -0
- package/esm/marks/pointMark.d.ts +8 -4
- package/esm/marks/pointMark.js +39 -23
- package/esm/marks/spanMark.d.ts +8 -0
- package/esm/marks/spanMark.js +19 -26
- package/esm/marks/types.d.ts +101 -4
- package/esm/marks/types.js +78 -5
- package/esm/renderBlock.d.ts +14 -0
- package/esm/renderBlock.js +25 -0
- package/esm/shaders/barMark.generated.d.ts +4 -0
- package/esm/shaders/barMark.generated.js +6 -0
- package/esm/shaders/barMark.iface.generated.d.ts +64 -0
- package/esm/shaders/barMark.iface.generated.js +110 -0
- package/esm/shaders/markColor.generated.d.ts +3 -0
- package/esm/shaders/markColor.generated.js +5 -0
- package/esm/shaders/pointMark.generated.d.ts +3 -3
- package/esm/shaders/pointMark.generated.js +3 -3
- package/esm/shaders/pointMark.iface.generated.d.ts +17 -6
- package/esm/shaders/pointMark.iface.generated.js +27 -9
- package/esm/shaders/pointMark.js.generated.d.ts +2 -0
- package/esm/shaders/pointMark.js.generated.js +42 -0
- package/esm/shaders/scoreScale.generated.d.ts +2 -0
- package/esm/shaders/scoreScale.generated.js +4 -0
- package/esm/useRenderingBackend.d.ts +1 -16
- package/esm/useRenderingBackend.js +2 -24
- package/package.json +5 -2
- package/src/shaders/barMark.generated.ts +10 -0
- package/src/shaders/barMark.iface.generated.ts +160 -0
- package/src/shaders/barMark.slang +109 -0
- package/src/shaders/markColor.generated.ts +8 -0
- package/src/shaders/markColor.slang +47 -0
- package/src/shaders/pointMark.generated.ts +3 -3
- package/src/shaders/pointMark.iface.generated.ts +34 -10
- package/src/shaders/pointMark.js.generated.ts +45 -0
- package/src/shaders/pointMark.slang +35 -33
- package/src/shaders/scoreScale.generated.ts +6 -0
- package/src/shaders/scoreScale.slang +1 -0
- package/src/shaders/valueScale.slang +52 -0
package/esm/marks/types.d.ts
CHANGED
|
@@ -31,8 +31,35 @@ export interface MarkContext2D extends ClipContext2D {
|
|
|
31
31
|
closePath(): void;
|
|
32
32
|
fill(): void;
|
|
33
33
|
stroke(): void;
|
|
34
|
+
drawImage?(image: CanvasImageSource, sx: number, sy: number, sw: number, sh: number, dx: number, dy: number, dw: number, dh: number): void;
|
|
34
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* A canvas a mark's pass samples in place of a colour ramp, with the size the
|
|
38
|
+
* texture is allocated at. A fresh object per repaint of the canvas: the
|
|
39
|
+
* backend uploads on identity, and a canvas element's identity never moves.
|
|
40
|
+
*/
|
|
41
|
+
export interface MarkImage {
|
|
42
|
+
image: HTMLCanvasElement | OffscreenCanvas;
|
|
43
|
+
width: number;
|
|
44
|
+
height: number;
|
|
45
|
+
}
|
|
46
|
+
/** What a mark's pass binds: a 256-entry RGBA ramp, or a canvas. */
|
|
47
|
+
export type MarkTexture = Uint8Array | MarkImage;
|
|
35
48
|
export type MarkFrame = FrameDimensions;
|
|
49
|
+
/** How a declared value scale reads its domain. */
|
|
50
|
+
export type MarkValueScaleType = 'linear' | 'log';
|
|
51
|
+
/**
|
|
52
|
+
* The quantitative colour scale a frame paints a ramp channel through: the
|
|
53
|
+
* domain, unioned over the loaded regions by the display; the declared scale
|
|
54
|
+
* type; and the 256-entry RGBA LUT the pass's sampler binds. A shape that
|
|
55
|
+
* reads it takes the raw values in `colorValue` and resolves them per frame,
|
|
56
|
+
* so a pan that widens the domain uploads no instance bytes.
|
|
57
|
+
*/
|
|
58
|
+
export interface MarkRamp {
|
|
59
|
+
domain: [number, number];
|
|
60
|
+
scale: MarkValueScaleType;
|
|
61
|
+
lut: Uint8Array;
|
|
62
|
+
}
|
|
36
63
|
/** A horizontal strip of the canvas, in CSS px down from its top edge. */
|
|
37
64
|
export interface MarkBand {
|
|
38
65
|
top: number;
|
|
@@ -45,6 +72,13 @@ export interface MarkHit {
|
|
|
45
72
|
y: number;
|
|
46
73
|
distSq: number;
|
|
47
74
|
}
|
|
75
|
+
/** An axis-aligned box of the canvas, in CSS px. */
|
|
76
|
+
export interface InkRect {
|
|
77
|
+
left: number;
|
|
78
|
+
top: number;
|
|
79
|
+
width: number;
|
|
80
|
+
height: number;
|
|
81
|
+
}
|
|
48
82
|
/**
|
|
49
83
|
* A shape: one hand-written `.slang`, one packer, one Canvas2D painter and one
|
|
50
84
|
* hit test, all reading the same channel arrays.
|
|
@@ -69,7 +103,9 @@ export interface MarkShape<TChannels, TParams> {
|
|
|
69
103
|
/**
|
|
70
104
|
* The shape's draw predicate over (block, frame, params) — not over its
|
|
71
105
|
* instances, which it is never handed. Both backends skip the block when it
|
|
72
|
-
* says no
|
|
106
|
+
* says no, and so does `hitNearest`: a block with no ink on it has nothing
|
|
107
|
+
* to be near. Optional: a shape whose every block can carry ink leaves it
|
|
108
|
+
* off.
|
|
73
109
|
*
|
|
74
110
|
* Placement is one use: the canvas continuation marker exists only where a
|
|
75
111
|
* block meets a canvas edge, and an interior block would otherwise shade a
|
|
@@ -80,6 +116,19 @@ export interface MarkShape<TChannels, TParams> {
|
|
|
80
116
|
* and its triangles turn off together.
|
|
81
117
|
*/
|
|
82
118
|
paintsBlock?(block: RenderBlock, frame: MarkFrame, params: TParams): boolean;
|
|
119
|
+
/**
|
|
120
|
+
* The rect `paintBlock` fills for instance `i`, or undefined for an instance
|
|
121
|
+
* it skips — a row the viewport has scrolled past, a bar with no height. A
|
|
122
|
+
* shape whose every instance is one box declares this and nothing about
|
|
123
|
+
* hovering: `defineMark` derives `hitNearest` from it where none is
|
|
124
|
+
* declared, and a display's highlight guide reads it for the instances it
|
|
125
|
+
* names. A shape whose ink is not a box (a ribbon, an arc, a capsule) leaves
|
|
126
|
+
* it off and keeps its own hit test.
|
|
127
|
+
*
|
|
128
|
+
* Painter-only overdraw — `span`'s seam — is not ink; `drawAgainstHit.ts`
|
|
129
|
+
* holds the two to each other within a pixel.
|
|
130
|
+
*/
|
|
131
|
+
ink?(channels: TChannels, block: RenderBlock, frame: MarkFrame, params: TParams, i: number): InkRect | undefined;
|
|
83
132
|
/**
|
|
84
133
|
* The nearest drawn ink to `(xPx, yPx)` among `candidates`, or undefined if
|
|
85
134
|
* nothing beats `maxDistSq`.
|
|
@@ -98,7 +147,8 @@ export interface MarkShape<TChannels, TParams> {
|
|
|
98
147
|
*
|
|
99
148
|
* Optional, because a shape earns it from a consumer like any other member.
|
|
100
149
|
* MAF answers a hit from row/column arithmetic over the alignment rather than
|
|
101
|
-
* from `span`'s channels, so it reads none.
|
|
150
|
+
* from `span`'s channels, so it reads none. A shape with `ink` and no hit test
|
|
151
|
+
* gets `inkHitNearest` — the nearest of its boxes — through `shapeHitNearest`.
|
|
102
152
|
*/
|
|
103
153
|
hitNearest?(channels: TChannels, block: RenderBlock, frame: MarkFrame, params: TParams, xPx: number, yPx: number, candidates: Iterable<number>, maxDistSq: number): MarkHit | undefined;
|
|
104
154
|
}
|
|
@@ -124,6 +174,15 @@ export interface StagedUniforms {
|
|
|
124
174
|
writer: unknown;
|
|
125
175
|
params: unknown;
|
|
126
176
|
}
|
|
177
|
+
/**
|
|
178
|
+
* A mark's pass as a frame plan draws it: what `hal.drawPass(id, regionKey,
|
|
179
|
+
* bufferOf)` takes and nothing else, resolved once per frame so the per-block
|
|
180
|
+
* loop reads two fields per mark.
|
|
181
|
+
*/
|
|
182
|
+
export interface PlannedPass {
|
|
183
|
+
readonly id: string;
|
|
184
|
+
readonly bufferOf: string | undefined;
|
|
185
|
+
}
|
|
127
186
|
/**
|
|
128
187
|
* A shape bound to one display's region payload and render state — what
|
|
129
188
|
* `defineMark` returns and what a display actually holds.
|
|
@@ -148,10 +207,33 @@ export interface Mark<TRegion, TState extends MarkFrame> {
|
|
|
148
207
|
* undefined case — a shader owns its sampler unconditionally, and a textured
|
|
149
208
|
* pass with no texture never draws on the WebGPU HAL.
|
|
150
209
|
*/
|
|
151
|
-
readonly texture?: (state: TState, region: TRegion) =>
|
|
210
|
+
readonly texture?: (state: TState, region: TRegion) => MarkTexture | undefined;
|
|
211
|
+
/**
|
|
212
|
+
* The frame-level gate: whether the mark draws at all under `state`, read
|
|
213
|
+
* off the display-wide state and nothing else. `planMarks` asks it once per
|
|
214
|
+
* frame; `drawRegion`, `paintBlock` and `hitNearest` ask it per block, so a
|
|
215
|
+
* list drawn through `drawMarks` gates like one drawn through a plan — and
|
|
216
|
+
* so does the hit test, which is what stops a switched-off layer answering a
|
|
217
|
+
* hover over blank pixels. A question about the block is `paintsBlock`, on
|
|
218
|
+
* the shape.
|
|
219
|
+
*/
|
|
220
|
+
readonly enabled?: (state: TState) => boolean;
|
|
221
|
+
/**
|
|
222
|
+
* The pass a frame plan draws for this mark, or undefined for a mark the plan
|
|
223
|
+
* form cannot carry: one with a `band` (a plan's caller owns the scissor) or a
|
|
224
|
+
* `paintsBlock` (a plan asks the block nothing).
|
|
225
|
+
*/
|
|
226
|
+
readonly planned?: PlannedPass;
|
|
152
227
|
drawRegion(hal: GpuHal, scratch: ArrayBuffer, block: RenderBlock, clip: BlockClipResult, region: TRegion, state: TState, regionKey: number, staged?: StagedUniforms): void;
|
|
153
228
|
paintBlock(ctx: MarkContext2D, region: TRegion, block: RenderBlock, state: TState): void;
|
|
154
229
|
hitNearest?(region: TRegion, block: RenderBlock, state: TState, xPx: number, yPx: number, candidates: Iterable<number>, maxDistSq: number): MarkHit | undefined;
|
|
230
|
+
/**
|
|
231
|
+
* The box instance `i` painted under the mark's gates, clipped to its band
|
|
232
|
+
* where it has one: what a highlight guide draws for the instance a display
|
|
233
|
+
* names. Undefined off a shape with no `ink`, and for an instance nothing
|
|
234
|
+
* drew.
|
|
235
|
+
*/
|
|
236
|
+
ink?(region: TRegion, block: RenderBlock, state: TState, i: number): InkRect | undefined;
|
|
155
237
|
}
|
|
156
238
|
/**
|
|
157
239
|
* `{ shape, channels }` over typed arrays — the declaration a display writes in
|
|
@@ -189,12 +271,26 @@ export interface Mark<TRegion, TState extends MarkFrame> {
|
|
|
189
271
|
* uploads it once per pass and re-uploads only when the bytes' identity moves,
|
|
190
272
|
* so a ramp change costs one texture and no instance byte.
|
|
191
273
|
*
|
|
274
|
+
* **Per pass per FRAME, though the lens is handed a region too.** LD reads its
|
|
275
|
+
* ramp off the payload's own metric — a pre-computed file with no D' column
|
|
276
|
+
* downgrades the request, and the metric that arrived is the authoritative one
|
|
277
|
+
* — which is exact because LD holds one region. A display with several regions
|
|
278
|
+
* wanting different ramps for one pass would re-upload the texture per region
|
|
279
|
+
* per frame; correct, since each recorded draw keeps the table bound when it
|
|
280
|
+
* was encoded, but a texture per region per frame is not what this is for.
|
|
281
|
+
*
|
|
192
282
|
* `band` is the strip of the canvas the mark is clipped to, for a display that
|
|
193
283
|
* stacks bands on one canvas (MAF's coverage strip over its rows viewport).
|
|
194
284
|
* The GPU scissors to it and Canvas2D clips to it, a zero-height band draws
|
|
195
285
|
* nothing, and the shape still places Y against the whole canvas — the band is
|
|
196
286
|
* a clip, never an offset, which is what lets one `scrollTop` serve both
|
|
197
287
|
* backends. A mark without one paints wherever its shape puts ink.
|
|
288
|
+
*
|
|
289
|
+
* `enabled` is the setting that turns the mark off for a whole frame — the
|
|
290
|
+
* pileup's "show mismatches" — and it is one gate for the three consumers: a
|
|
291
|
+
* mark that does not draw does not answer a hover either. It reads the state
|
|
292
|
+
* alone so `planMarks` can resolve it once per frame; a gate that needs the
|
|
293
|
+
* block is the shape's `paintsBlock`.
|
|
198
294
|
*/
|
|
199
295
|
export declare function defineMark<TRegion, TState extends MarkFrame, TChannels, TParams>(spec: {
|
|
200
296
|
shape: MarkShape<TChannels, TParams>;
|
|
@@ -202,5 +298,6 @@ export declare function defineMark<TRegion, TState extends MarkFrame, TChannels,
|
|
|
202
298
|
params: (state: TState, region: TRegion, block: RenderBlock) => TParams;
|
|
203
299
|
bufferOf?: Mark<TRegion, TState>;
|
|
204
300
|
band?: (state: TState) => MarkBand;
|
|
205
|
-
texture?: (state: TState, region: TRegion) =>
|
|
301
|
+
texture?: (state: TState, region: TRegion) => MarkTexture | undefined;
|
|
302
|
+
enabled?: (state: TState) => boolean;
|
|
206
303
|
}): Mark<TRegion, TState>;
|
package/esm/marks/types.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { devicePxBand, withClip } from '../canvas2dUtils.js';
|
|
2
|
+
import { shapeHitNearest } from './markHit.js';
|
|
2
3
|
/**
|
|
3
4
|
* `{ shape, channels }` over typed arrays — the declaration a display writes in
|
|
4
5
|
* place of a `GpuXxxRenderer` class, a `Canvas2DXxxRenderer` class, a factory
|
|
@@ -35,15 +36,31 @@ import { devicePxBand, withClip } from '../canvas2dUtils.js';
|
|
|
35
36
|
* uploads it once per pass and re-uploads only when the bytes' identity moves,
|
|
36
37
|
* so a ramp change costs one texture and no instance byte.
|
|
37
38
|
*
|
|
39
|
+
* **Per pass per FRAME, though the lens is handed a region too.** LD reads its
|
|
40
|
+
* ramp off the payload's own metric — a pre-computed file with no D' column
|
|
41
|
+
* downgrades the request, and the metric that arrived is the authoritative one
|
|
42
|
+
* — which is exact because LD holds one region. A display with several regions
|
|
43
|
+
* wanting different ramps for one pass would re-upload the texture per region
|
|
44
|
+
* per frame; correct, since each recorded draw keeps the table bound when it
|
|
45
|
+
* was encoded, but a texture per region per frame is not what this is for.
|
|
46
|
+
*
|
|
38
47
|
* `band` is the strip of the canvas the mark is clipped to, for a display that
|
|
39
48
|
* stacks bands on one canvas (MAF's coverage strip over its rows viewport).
|
|
40
49
|
* The GPU scissors to it and Canvas2D clips to it, a zero-height band draws
|
|
41
50
|
* nothing, and the shape still places Y against the whole canvas — the band is
|
|
42
51
|
* a clip, never an offset, which is what lets one `scrollTop` serve both
|
|
43
52
|
* backends. A mark without one paints wherever its shape puts ink.
|
|
53
|
+
*
|
|
54
|
+
* `enabled` is the setting that turns the mark off for a whole frame — the
|
|
55
|
+
* pileup's "show mismatches" — and it is one gate for the three consumers: a
|
|
56
|
+
* mark that does not draw does not answer a hover either. It reads the state
|
|
57
|
+
* alone so `planMarks` can resolve it once per frame; a gate that needs the
|
|
58
|
+
* block is the shape's `paintsBlock`.
|
|
44
59
|
*/
|
|
45
60
|
export function defineMark(spec) {
|
|
46
|
-
const { shape, channels, params, band, texture } = spec;
|
|
61
|
+
const { shape, channels, params, band, texture, enabled } = spec;
|
|
62
|
+
const hitNearest = shapeHitNearest(shape);
|
|
63
|
+
const shapeInk = shape.ink?.bind(shape);
|
|
47
64
|
const lender = spec.bufferOf?.pass;
|
|
48
65
|
if (lender &&
|
|
49
66
|
(lender.instanceStride !== shape.pass.instanceStride ||
|
|
@@ -52,6 +69,7 @@ export function defineMark(spec) {
|
|
|
52
69
|
throw new Error(`mark ${shape.id} draws off ${lender.id}'s buffer but declares a different instance struct`);
|
|
53
70
|
}
|
|
54
71
|
const bufferOf = lender?.id;
|
|
72
|
+
const planned = band || shape.paintsBlock ? undefined : { id: shape.pass.id, bufferOf };
|
|
55
73
|
return {
|
|
56
74
|
pass: {
|
|
57
75
|
...shape.pass,
|
|
@@ -62,7 +80,12 @@ export function defineMark(spec) {
|
|
|
62
80
|
},
|
|
63
81
|
bufferOf,
|
|
64
82
|
texture,
|
|
83
|
+
enabled,
|
|
84
|
+
planned,
|
|
65
85
|
drawRegion(hal, scratch, block, clip, region, state, regionKey, staged) {
|
|
86
|
+
if (enabled && !enabled(state)) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
66
89
|
const strip = band?.(state);
|
|
67
90
|
const scissor = strip
|
|
68
91
|
? devicePxBand(strip.top, strip.height, clip.scaleY, clip.pxH)
|
|
@@ -90,6 +113,9 @@ export function defineMark(spec) {
|
|
|
90
113
|
}
|
|
91
114
|
},
|
|
92
115
|
paintBlock(ctx, region, block, state) {
|
|
116
|
+
if (enabled && !enabled(state)) {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
93
119
|
const strip = band?.(state);
|
|
94
120
|
const c = channels(region);
|
|
95
121
|
if ((!strip || strip.height > 0) && c !== undefined) {
|
|
@@ -107,16 +133,63 @@ export function defineMark(spec) {
|
|
|
107
133
|
}
|
|
108
134
|
}
|
|
109
135
|
},
|
|
110
|
-
hitNearest:
|
|
136
|
+
hitNearest: hitNearest
|
|
111
137
|
? (region, block, state, xPx, yPx, candidates, maxDistSq) => {
|
|
138
|
+
const strip = band?.(state);
|
|
112
139
|
const c = channels(region);
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
140
|
+
let hit;
|
|
141
|
+
// The three gates `paintBlock` takes, in its order — the band on its
|
|
142
|
+
// HEIGHT, as there, so a band both backends decline answers nothing
|
|
143
|
+
// either. The cursor being inside the strip is a fourth, and the ink
|
|
144
|
+
// being inside it the fifth: a band is a CLIP, so ink outside one was
|
|
145
|
+
// never drawn and cannot be the nearest thing to anything.
|
|
146
|
+
//
|
|
147
|
+
// The fifth gate REJECTS rather than re-runs, and that is the one
|
|
148
|
+
// conservative edge here: the shape picks its winner without knowing
|
|
149
|
+
// about the band, so a clipped-away nearest masks a farther candidate
|
|
150
|
+
// whose ink IS inside the strip, and the mark answers nothing instead
|
|
151
|
+
// of that one. Safe in the direction that matters — it never claims a
|
|
152
|
+
// hover over pixels neither backend drew — and closing it would mean
|
|
153
|
+
// pushing the band down into every shape's own ink test, where the
|
|
154
|
+
// band is deliberately not.
|
|
155
|
+
if ((!enabled || enabled(state)) &&
|
|
156
|
+
(!strip || strip.height > 0) &&
|
|
157
|
+
c !== undefined &&
|
|
158
|
+
!bandExcludes(strip, yPx)) {
|
|
159
|
+
const p = params(state, region, block);
|
|
160
|
+
if (!shape.paintsBlock || shape.paintsBlock(block, state, p)) {
|
|
161
|
+
hit = hitNearest(c, block, state, p, xPx, yPx, candidates, maxDistSq);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return hit && !bandExcludes(strip, hit.y) ? hit : undefined;
|
|
165
|
+
}
|
|
166
|
+
: undefined,
|
|
167
|
+
ink: shapeInk
|
|
168
|
+
? (region, block, state, i) => {
|
|
169
|
+
const strip = band?.(state);
|
|
170
|
+
const c = channels(region);
|
|
171
|
+
if ((enabled && !enabled(state)) ||
|
|
172
|
+
(strip && strip.height <= 0) ||
|
|
173
|
+
c === undefined) {
|
|
174
|
+
return undefined;
|
|
175
|
+
}
|
|
176
|
+
const p = params(state, region, block);
|
|
177
|
+
if (shape.paintsBlock && !shape.paintsBlock(block, state, p)) {
|
|
178
|
+
return undefined;
|
|
179
|
+
}
|
|
180
|
+
const r = shapeInk(c, block, state, p, i);
|
|
181
|
+
return r && strip ? clipToBand(r, strip) : r;
|
|
116
182
|
}
|
|
117
183
|
: undefined,
|
|
118
184
|
};
|
|
119
185
|
}
|
|
186
|
+
function clipToBand(r, strip) {
|
|
187
|
+
const top = Math.max(r.top, strip.top);
|
|
188
|
+
const bottom = Math.min(r.top + r.height, strip.top + strip.height);
|
|
189
|
+
return bottom > top
|
|
190
|
+
? { left: r.left, top, width: r.width, height: bottom - top }
|
|
191
|
+
: undefined;
|
|
192
|
+
}
|
|
120
193
|
// What a mark with nothing in this region packs. An empty pack IS the release
|
|
121
194
|
// — every HAL deletes the pass's prior buffer before it looks at the count.
|
|
122
195
|
const NOTHING = new ArrayBuffer(0);
|
package/esm/renderBlock.d.ts
CHANGED
|
@@ -23,3 +23,17 @@ export interface RenderBlock extends BpRegionBounds {
|
|
|
23
23
|
export declare function buildRenderBlocks(regions: (BpRegionBounds & {
|
|
24
24
|
displayedRegionIndex: number;
|
|
25
25
|
})[]): RenderBlock[];
|
|
26
|
+
/**
|
|
27
|
+
* One display key's whole canvas as a single block.
|
|
28
|
+
*
|
|
29
|
+
* For a display whose x axis is not the block's bp span: a dotplot segment, a
|
|
30
|
+
* synteny ribbon, a Hi-C or LD diamond each read their screen x off the
|
|
31
|
+
* payload's own coordinates through a transform the shader and the painter both
|
|
32
|
+
* apply — a `panPx` fold from the fetch-time base for the first two, the
|
|
33
|
+
* diagonal `viewScale`/`viewOffsetX` for the last two. So the block carries
|
|
34
|
+
* nothing but its key and the identity bp span that keeps `clipBlock`
|
|
35
|
+
* well-formed.
|
|
36
|
+
*/
|
|
37
|
+
export declare function canvasWideBlock(displayedRegionIndex: number, canvasWidth: number): RenderBlock;
|
|
38
|
+
/** {@link canvasWideBlock} per key, in the keys' own order. */
|
|
39
|
+
export declare function canvasWideBlocks(keys: Iterable<number>, canvasWidth: number): RenderBlock[];
|
package/esm/renderBlock.js
CHANGED
|
@@ -8,3 +8,28 @@ export function buildRenderBlocks(regions) {
|
|
|
8
8
|
reversed: r.reversed ?? false,
|
|
9
9
|
}));
|
|
10
10
|
}
|
|
11
|
+
/**
|
|
12
|
+
* One display key's whole canvas as a single block.
|
|
13
|
+
*
|
|
14
|
+
* For a display whose x axis is not the block's bp span: a dotplot segment, a
|
|
15
|
+
* synteny ribbon, a Hi-C or LD diamond each read their screen x off the
|
|
16
|
+
* payload's own coordinates through a transform the shader and the painter both
|
|
17
|
+
* apply — a `panPx` fold from the fetch-time base for the first two, the
|
|
18
|
+
* diagonal `viewScale`/`viewOffsetX` for the last two. So the block carries
|
|
19
|
+
* nothing but its key and the identity bp span that keeps `clipBlock`
|
|
20
|
+
* well-formed.
|
|
21
|
+
*/
|
|
22
|
+
export function canvasWideBlock(displayedRegionIndex, canvasWidth) {
|
|
23
|
+
return {
|
|
24
|
+
displayedRegionIndex,
|
|
25
|
+
start: 0,
|
|
26
|
+
end: canvasWidth,
|
|
27
|
+
screenStartPx: 0,
|
|
28
|
+
screenEndPx: canvasWidth,
|
|
29
|
+
reversed: false,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/** {@link canvasWideBlock} per key, in the keys' own order. */
|
|
33
|
+
export function canvasWideBlocks(keys, canvasWidth) {
|
|
34
|
+
return [...keys].map(key => canvasWideBlock(key, canvasWidth));
|
|
35
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare const WGSL_SOURCE = "struct Uniforms_std140_0\n{\n @align(16) bpRangeX_0 : vec3<f32>,\n @align(4) canvasHeight_0 : f32,\n @align(16) domainMin_0 : f32,\n @align(4) domainMax_0 : f32,\n @align(8) valueScaleType_0 : i32,\n @align(4) rampMode_0 : i32,\n @align(16) rampMin_0 : f32,\n @align(4) rampMax_0 : f32,\n @align(8) origin_0 : f32,\n @align(4) zero_0 : f32,\n @align(16) minCellDenomPx_0 : f32,\n @align(4) minWidthPx_0 : f32,\n @align(8) 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 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 _S1 : f32 = - (1.0f / hpZero_0);\n return dot(vec3<f32>(-1.0f, max(splitPos_0.x - bpRange_0.x, _S1), max(splitPos_0.y - bpRange_0.y, _S1)), 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 extendToMinWidthPx_0( x1_0 : f32, x2_0 : f32, minWidth_0 : f32) -> f32\n{\n var dx_0 : f32 = x2_0 - x1_0;\n var _S2 : f32;\n if((abs(dx_0)) < minWidth_0)\n {\n if(dx_0 < 0.0f)\n {\n _S2 = - minWidth_0;\n }\n else\n {\n _S2 = minWidth_0;\n }\n _S2 = x1_0 + _S2;\n }\n else\n {\n _S2 = x2_0;\n }\n return _S2;\n}\n\nfn extendToMinWidthX_0( x1_1 : f32, x2_1 : f32, minWidthPx_1 : f32, canvasWidth_0 : f32) -> f32\n{\n return extendToMinWidthPx_0(x1_1, x2_1, minWidthPx_1 * 2.0f / canvasWidth_0);\n}\n\nfn quadLocal_0( vid_0 : u32) -> vec2<f32>\n{\n var v_0 : u32 = vid_0 % u32(6);\n var _S3 : bool = v_0 == u32(0);\n var _S4 : bool;\n if(_S3)\n {\n _S4 = true;\n }\n else\n {\n _S4 = v_0 == u32(2);\n }\n if(_S4)\n {\n _S4 = true;\n }\n else\n {\n _S4 = v_0 == u32(3);\n }\n var _S5 : f32;\n if(_S4)\n {\n _S5 = 0.0f;\n }\n else\n {\n _S5 = 1.0f;\n }\n if(_S3)\n {\n _S4 = true;\n }\n else\n {\n _S4 = v_0 == u32(1);\n }\n if(_S4)\n {\n _S4 = true;\n }\n else\n {\n _S4 = v_0 == u32(4);\n }\n var _S6 : f32;\n if(_S4)\n {\n _S6 = 0.0f;\n }\n else\n {\n _S6 = 1.0f;\n }\n return vec2<f32>(_S5, _S6);\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 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 barAaPx_0() -> f32\n{\n return 2.0f * aaHalfPx_0(u_0.devicePixelRatio_0);\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 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\nstruct VsOut_0\n{\n @builtin(position) position_0 : vec4<f32>,\n @location(0) color_0 : vec4<f32>,\n @location(1) barInkPx_0 : vec2<f32>,\n};\n\nstruct vertexInput_0\n{\n @location(0) x_1 : u32,\n @location(1) x2_2 : u32,\n @location(2) y_0 : f32,\n @location(3) color_1 : u32,\n};\n\n@vertex\nfn vs_main( _S7 : vertexInput_0, @builtin(vertex_index) vid_1 : u32) -> VsOut_0\n{\n var _S8 : Uniforms_std140_0 = u_0;\n var _S9 : f32 = bpToClipX_0(_S7.x_1, &(_S8));\n var _S10 : f32 = bpToClipX_0(_S7.x2_2, &(_S8));\n var q_0 : vec2<f32> = quadLocal_0(vid_1);\n var valueY_0 : f32 = valueToYPxScaled_0(_S7.y_0, u_0.domainMin_0, u_0.domainMax_0, u_0.canvasHeight_0, u_0.valueScaleType_0);\n var originY_0 : f32 = valueToYPxScaled_0(u_0.origin_0, u_0.domainMin_0, u_0.domainMax_0, u_0.canvasHeight_0, u_0.valueScaleType_0);\n var _S11 : f32 = min(valueY_0, originY_0);\n var _S12 : f32 = max(valueY_0, originY_0);\n var padPx_0 : f32 = barAaPx_0();\n var vy_0 : f32 = mix(_S12 + padPx_0, _S11 - padPx_0, q_0.y);\n var o_0 : VsOut_0;\n o_0.position_0 = vec4<f32>(mix(_S9, extendToMinWidthX_0(_S9, _S10, u_0.minWidthPx_0, u_0.minCellDenomPx_0), q_0.x), yPxToClipY_0(vy_0, u_0.canvasHeight_0), 0.0f, 1.0f);\n o_0.color_0 = markInstanceColor_0(colorRamp_texture_0, colorRamp_sampler_0, _S7.color_1, u_0.rampMode_0, u_0.rampMin_0, u_0.rampMax_0);\n o_0.barInkPx_0 = vec2<f32>(vy_0 - _S11, vy_0 - _S12);\n return o_0;\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\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(1) barInkPx_1 : vec2<f32>,\n};\n\n@fragment\nfn fs_main( _S13 : pixelInput_0, @builtin(position) position_1 : vec4<f32>) -> pixelOutput_0\n{\n var aaPx_1 : f32 = barAaPx_0();\n var alpha_0 : f32 = aaRamp_0(_S13.barInkPx_1.x, aaPx_1) - aaRamp_0(_S13.barInkPx_1.y, aaPx_1);\n if(alpha_0 <= 0.0f)\n {\n discard;\n }\n var _S14 : pixelOutput_0 = pixelOutput_0( vec4<f32>(_S13.color_2.xyz, _S13.color_2.w * alpha_0) );\n return _S14;\n}\n\n";
|
|
2
|
+
export declare 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 origin_0;\n float zero_0;\n float minCellDenomPx_0;\n float minWidthPx_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 origin_0;\n float zero_0;\n float minCellDenomPx_0;\n float minWidthPx_0;\n float devicePixelRatio_0;\n}u_0;\n\nuniform sampler2D u_colorRamp;\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 _S1 = - (1.0 / hpZero_0);\n\n return dot(vec3(-1.0, max(splitPos_0.x - bpRange_0.x, _S1), max(splitPos_0.y - bpRange_0.y, _S1)), 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 extendToMinWidthPx_0(float x1_0, float x2_0, float minWidth_0)\n{\n\n float dx_0 = x2_0 - x1_0;\n\n float _S2;\n if((abs(dx_0)) < minWidth_0)\n {\n\n if(dx_0 < 0.0)\n {\n\n _S2 = - minWidth_0;\n\n }\n else\n {\n\n _S2 = minWidth_0;\n\n }\n\n _S2 = x1_0 + _S2;\n\n }\n else\n {\n\n _S2 = x2_0;\n\n }\n\n return _S2;\n}\n\nfloat extendToMinWidthX_0(float x1_1, float x2_1, float minWidthPx_1, float canvasWidth_0)\n{\n\n return extendToMinWidthPx_0(x1_1, x2_1, minWidthPx_1 * 2.0 / canvasWidth_0);\n}\n\n\nvec2 quadLocal_0(uint vid_0)\n{\n\n uint v_0 = vid_0 % 6U;\n\n bool _S3 = v_0 == 0U;\n\n bool _S4;\n\n if(_S3)\n {\n\n _S4 = true;\n\n }\n else\n {\n\n _S4 = v_0 == 2U;\n\n }\n\n if(_S4)\n {\n\n _S4 = true;\n\n }\n else\n {\n\n _S4 = v_0 == 3U;\n\n }\n\n float _S5;\n\n if(_S4)\n {\n\n _S5 = 0.0;\n\n }\n else\n {\n\n _S5 = 1.0;\n\n }\n if(_S3)\n {\n\n _S4 = true;\n\n }\n else\n {\n\n _S4 = v_0 == 1U;\n\n }\n\n if(_S4)\n {\n\n _S4 = true;\n\n }\n else\n {\n\n _S4 = v_0 == 4U;\n\n }\n\n float _S6;\n\n if(_S4)\n {\n\n _S6 = 0.0;\n\n }\n else\n {\n\n _S6 = 1.0;\n\n }\n\n return vec2(_S5, _S6);\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 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 barAaPx_0()\n{\n\n return 2.0 * aaHalfPx_0(u_0.devicePixelRatio_0);\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\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\nout vec2 v_barInkPx;\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\nstruct VsOut_0\n{\n vec4 position_0;\n vec4 color_0;\n vec2 barInkPx_0;\n};\n\n\nvec4 rampColor_0(float _S7)\n{\n\n return (textureLod((u_colorRamp), (vec2((clamp(_S7, 0.0, 1.0) * 255.0 + 0.5) / 256.0, 0.5)), (0.0)));\n}\n\n\nvec4 markInstanceColor_0(uint _S8, int _S9, float _S10, float _S11)\n{\n\n if(_S9 == 0)\n {\n\n return unpackRGBA_0(_S8);\n }\n\n int scaleType_2;\n\n if(_S9 == 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(_S8), _S10, _S11, scaleType_2, 1.0));\n}\n\n\nvoid main()\n{\n\n Uniforms_0 _S12 = 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.origin_0, u_0.zero_0, u_0.minCellDenomPx_0, u_0.minWidthPx_0, u_0.devicePixelRatio_0);\n float sx1_0 = bpToClipX_0(a_x, _S12);\n\n\n vec2 q_0 = quadLocal_0(uint(gl_VertexID));\n\n float valueY_0 = valueToYPxScaled_0(a_y, u_0.domainMin_0, u_0.domainMax_0, u_0.canvasHeight_0, u_0.valueScaleType_0);\n float originY_0 = valueToYPxScaled_0(u_0.origin_0, u_0.domainMin_0, u_0.domainMax_0, u_0.canvasHeight_0, u_0.valueScaleType_0);\n float _S13 = min(valueY_0, originY_0);\n float _S14 = max(valueY_0, originY_0);\n float padPx_0 = barAaPx_0();\n float vy_0 = mix(_S14 + padPx_0, _S13 - padPx_0, q_0.y);\n\n VsOut_0 o_0;\n o_0.position_0 = vec4(mix(sx1_0, extendToMinWidthX_0(sx1_0, bpToClipX_0(a_x2, _S12), u_0.minWidthPx_0, u_0.minCellDenomPx_0), q_0.x), yPxToClipY_0(vy_0, u_0.canvasHeight_0), 0.0, 1.0);\n o_0.color_0 = markInstanceColor_0(a_color, u_0.rampMode_0, u_0.rampMin_0, u_0.rampMax_0);\n o_0.barInkPx_0 = vec2(vy_0 - _S13, vy_0 - _S14);\n VsOut_0 _S15 = o_0;\n\n gl_Position = o_0.position_0;\n\n v_color = _S15.color_0;\n\n v_barInkPx = _S15.barInkPx_0;\n\n return;\n}\n\n";
|
|
3
|
+
export declare const GLSL_FRAGMENT = "#version 300 es\nprecision highp float;\nprecision highp int;\nprecision highp sampler2D;\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 origin_0;\n float zero_0;\n float minCellDenomPx_0;\n float minWidthPx_0;\n float devicePixelRatio_0;\n}u_0;\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 barAaPx_0()\n{\n\n return 2.0 * aaHalfPx_0(u_0.devicePixelRatio_0);\n}\n\n\nfloat aaRamp_0(float signedInk_0, float widthPx_0)\n{\n\n return clamp(signedInk_0 / widthPx_0 + 0.5, 0.0, 1.0);\n}\n\n\nlayout(location = 0)\nout vec4 entryPointParam_fs_main_0;\n\n\nin vec4 v_color;\n\n\nin vec2 v_barInkPx;\n\n\nvoid main()\n{\n\n float aaPx_1 = barAaPx_0();\n float alpha_0 = aaRamp_0(v_barInkPx.x, aaPx_1) - aaRamp_0(v_barInkPx.y, aaPx_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
|
+
export * from './barMark.iface.generated.ts';
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// AUTO-GENERATED by packages/shader-tools/src/shader-codegen from barMark.slang.
|
|
2
|
+
// Do not edit. Run `pnpm gen:shaders` to regenerate.
|
|
3
|
+
export const WGSL_SOURCE = "struct Uniforms_std140_0\n{\n @align(16) bpRangeX_0 : vec3<f32>,\n @align(4) canvasHeight_0 : f32,\n @align(16) domainMin_0 : f32,\n @align(4) domainMax_0 : f32,\n @align(8) valueScaleType_0 : i32,\n @align(4) rampMode_0 : i32,\n @align(16) rampMin_0 : f32,\n @align(4) rampMax_0 : f32,\n @align(8) origin_0 : f32,\n @align(4) zero_0 : f32,\n @align(16) minCellDenomPx_0 : f32,\n @align(4) minWidthPx_0 : f32,\n @align(8) 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 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 _S1 : f32 = - (1.0f / hpZero_0);\n return dot(vec3<f32>(-1.0f, max(splitPos_0.x - bpRange_0.x, _S1), max(splitPos_0.y - bpRange_0.y, _S1)), 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 extendToMinWidthPx_0( x1_0 : f32, x2_0 : f32, minWidth_0 : f32) -> f32\n{\n var dx_0 : f32 = x2_0 - x1_0;\n var _S2 : f32;\n if((abs(dx_0)) < minWidth_0)\n {\n if(dx_0 < 0.0f)\n {\n _S2 = - minWidth_0;\n }\n else\n {\n _S2 = minWidth_0;\n }\n _S2 = x1_0 + _S2;\n }\n else\n {\n _S2 = x2_0;\n }\n return _S2;\n}\n\nfn extendToMinWidthX_0( x1_1 : f32, x2_1 : f32, minWidthPx_1 : f32, canvasWidth_0 : f32) -> f32\n{\n return extendToMinWidthPx_0(x1_1, x2_1, minWidthPx_1 * 2.0f / canvasWidth_0);\n}\n\nfn quadLocal_0( vid_0 : u32) -> vec2<f32>\n{\n var v_0 : u32 = vid_0 % u32(6);\n var _S3 : bool = v_0 == u32(0);\n var _S4 : bool;\n if(_S3)\n {\n _S4 = true;\n }\n else\n {\n _S4 = v_0 == u32(2);\n }\n if(_S4)\n {\n _S4 = true;\n }\n else\n {\n _S4 = v_0 == u32(3);\n }\n var _S5 : f32;\n if(_S4)\n {\n _S5 = 0.0f;\n }\n else\n {\n _S5 = 1.0f;\n }\n if(_S3)\n {\n _S4 = true;\n }\n else\n {\n _S4 = v_0 == u32(1);\n }\n if(_S4)\n {\n _S4 = true;\n }\n else\n {\n _S4 = v_0 == u32(4);\n }\n var _S6 : f32;\n if(_S4)\n {\n _S6 = 0.0f;\n }\n else\n {\n _S6 = 1.0f;\n }\n return vec2<f32>(_S5, _S6);\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 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 barAaPx_0() -> f32\n{\n return 2.0f * aaHalfPx_0(u_0.devicePixelRatio_0);\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 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\nstruct VsOut_0\n{\n @builtin(position) position_0 : vec4<f32>,\n @location(0) color_0 : vec4<f32>,\n @location(1) barInkPx_0 : vec2<f32>,\n};\n\nstruct vertexInput_0\n{\n @location(0) x_1 : u32,\n @location(1) x2_2 : u32,\n @location(2) y_0 : f32,\n @location(3) color_1 : u32,\n};\n\n@vertex\nfn vs_main( _S7 : vertexInput_0, @builtin(vertex_index) vid_1 : u32) -> VsOut_0\n{\n var _S8 : Uniforms_std140_0 = u_0;\n var _S9 : f32 = bpToClipX_0(_S7.x_1, &(_S8));\n var _S10 : f32 = bpToClipX_0(_S7.x2_2, &(_S8));\n var q_0 : vec2<f32> = quadLocal_0(vid_1);\n var valueY_0 : f32 = valueToYPxScaled_0(_S7.y_0, u_0.domainMin_0, u_0.domainMax_0, u_0.canvasHeight_0, u_0.valueScaleType_0);\n var originY_0 : f32 = valueToYPxScaled_0(u_0.origin_0, u_0.domainMin_0, u_0.domainMax_0, u_0.canvasHeight_0, u_0.valueScaleType_0);\n var _S11 : f32 = min(valueY_0, originY_0);\n var _S12 : f32 = max(valueY_0, originY_0);\n var padPx_0 : f32 = barAaPx_0();\n var vy_0 : f32 = mix(_S12 + padPx_0, _S11 - padPx_0, q_0.y);\n var o_0 : VsOut_0;\n o_0.position_0 = vec4<f32>(mix(_S9, extendToMinWidthX_0(_S9, _S10, u_0.minWidthPx_0, u_0.minCellDenomPx_0), q_0.x), yPxToClipY_0(vy_0, u_0.canvasHeight_0), 0.0f, 1.0f);\n o_0.color_0 = markInstanceColor_0(colorRamp_texture_0, colorRamp_sampler_0, _S7.color_1, u_0.rampMode_0, u_0.rampMin_0, u_0.rampMax_0);\n o_0.barInkPx_0 = vec2<f32>(vy_0 - _S11, vy_0 - _S12);\n return o_0;\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\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(1) barInkPx_1 : vec2<f32>,\n};\n\n@fragment\nfn fs_main( _S13 : pixelInput_0, @builtin(position) position_1 : vec4<f32>) -> pixelOutput_0\n{\n var aaPx_1 : f32 = barAaPx_0();\n var alpha_0 : f32 = aaRamp_0(_S13.barInkPx_1.x, aaPx_1) - aaRamp_0(_S13.barInkPx_1.y, aaPx_1);\n if(alpha_0 <= 0.0f)\n {\n discard;\n }\n var _S14 : pixelOutput_0 = pixelOutput_0( vec4<f32>(_S13.color_2.xyz, _S13.color_2.w * alpha_0) );\n return _S14;\n}\n\n";
|
|
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 origin_0;\n float zero_0;\n float minCellDenomPx_0;\n float minWidthPx_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 origin_0;\n float zero_0;\n float minCellDenomPx_0;\n float minWidthPx_0;\n float devicePixelRatio_0;\n}u_0;\n\nuniform sampler2D u_colorRamp;\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 _S1 = - (1.0 / hpZero_0);\n\n return dot(vec3(-1.0, max(splitPos_0.x - bpRange_0.x, _S1), max(splitPos_0.y - bpRange_0.y, _S1)), 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 extendToMinWidthPx_0(float x1_0, float x2_0, float minWidth_0)\n{\n\n float dx_0 = x2_0 - x1_0;\n\n float _S2;\n if((abs(dx_0)) < minWidth_0)\n {\n\n if(dx_0 < 0.0)\n {\n\n _S2 = - minWidth_0;\n\n }\n else\n {\n\n _S2 = minWidth_0;\n\n }\n\n _S2 = x1_0 + _S2;\n\n }\n else\n {\n\n _S2 = x2_0;\n\n }\n\n return _S2;\n}\n\nfloat extendToMinWidthX_0(float x1_1, float x2_1, float minWidthPx_1, float canvasWidth_0)\n{\n\n return extendToMinWidthPx_0(x1_1, x2_1, minWidthPx_1 * 2.0 / canvasWidth_0);\n}\n\n\nvec2 quadLocal_0(uint vid_0)\n{\n\n uint v_0 = vid_0 % 6U;\n\n bool _S3 = v_0 == 0U;\n\n bool _S4;\n\n if(_S3)\n {\n\n _S4 = true;\n\n }\n else\n {\n\n _S4 = v_0 == 2U;\n\n }\n\n if(_S4)\n {\n\n _S4 = true;\n\n }\n else\n {\n\n _S4 = v_0 == 3U;\n\n }\n\n float _S5;\n\n if(_S4)\n {\n\n _S5 = 0.0;\n\n }\n else\n {\n\n _S5 = 1.0;\n\n }\n if(_S3)\n {\n\n _S4 = true;\n\n }\n else\n {\n\n _S4 = v_0 == 1U;\n\n }\n\n if(_S4)\n {\n\n _S4 = true;\n\n }\n else\n {\n\n _S4 = v_0 == 4U;\n\n }\n\n float _S6;\n\n if(_S4)\n {\n\n _S6 = 0.0;\n\n }\n else\n {\n\n _S6 = 1.0;\n\n }\n\n return vec2(_S5, _S6);\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 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 barAaPx_0()\n{\n\n return 2.0 * aaHalfPx_0(u_0.devicePixelRatio_0);\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\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\nout vec2 v_barInkPx;\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\nstruct VsOut_0\n{\n vec4 position_0;\n vec4 color_0;\n vec2 barInkPx_0;\n};\n\n\nvec4 rampColor_0(float _S7)\n{\n\n return (textureLod((u_colorRamp), (vec2((clamp(_S7, 0.0, 1.0) * 255.0 + 0.5) / 256.0, 0.5)), (0.0)));\n}\n\n\nvec4 markInstanceColor_0(uint _S8, int _S9, float _S10, float _S11)\n{\n\n if(_S9 == 0)\n {\n\n return unpackRGBA_0(_S8);\n }\n\n int scaleType_2;\n\n if(_S9 == 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(_S8), _S10, _S11, scaleType_2, 1.0));\n}\n\n\nvoid main()\n{\n\n Uniforms_0 _S12 = 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.origin_0, u_0.zero_0, u_0.minCellDenomPx_0, u_0.minWidthPx_0, u_0.devicePixelRatio_0);\n float sx1_0 = bpToClipX_0(a_x, _S12);\n\n\n vec2 q_0 = quadLocal_0(uint(gl_VertexID));\n\n float valueY_0 = valueToYPxScaled_0(a_y, u_0.domainMin_0, u_0.domainMax_0, u_0.canvasHeight_0, u_0.valueScaleType_0);\n float originY_0 = valueToYPxScaled_0(u_0.origin_0, u_0.domainMin_0, u_0.domainMax_0, u_0.canvasHeight_0, u_0.valueScaleType_0);\n float _S13 = min(valueY_0, originY_0);\n float _S14 = max(valueY_0, originY_0);\n float padPx_0 = barAaPx_0();\n float vy_0 = mix(_S14 + padPx_0, _S13 - padPx_0, q_0.y);\n\n VsOut_0 o_0;\n o_0.position_0 = vec4(mix(sx1_0, extendToMinWidthX_0(sx1_0, bpToClipX_0(a_x2, _S12), u_0.minWidthPx_0, u_0.minCellDenomPx_0), q_0.x), yPxToClipY_0(vy_0, u_0.canvasHeight_0), 0.0, 1.0);\n o_0.color_0 = markInstanceColor_0(a_color, u_0.rampMode_0, u_0.rampMin_0, u_0.rampMax_0);\n o_0.barInkPx_0 = vec2(vy_0 - _S13, vy_0 - _S14);\n VsOut_0 _S15 = o_0;\n\n gl_Position = o_0.position_0;\n\n v_color = _S15.color_0;\n\n v_barInkPx = _S15.barInkPx_0;\n\n return;\n}\n\n";
|
|
5
|
+
export const GLSL_FRAGMENT = "#version 300 es\nprecision highp float;\nprecision highp int;\nprecision highp sampler2D;\n\n\n\nlayout(std140) uniform Uniforms\n{\n 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 origin_0;\n float zero_0;\n float minCellDenomPx_0;\n float minWidthPx_0;\n float devicePixelRatio_0;\n}u_0;\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 barAaPx_0()\n{\n\n return 2.0 * aaHalfPx_0(u_0.devicePixelRatio_0);\n}\n\n\nfloat aaRamp_0(float signedInk_0, float widthPx_0)\n{\n\n return clamp(signedInk_0 / widthPx_0 + 0.5, 0.0, 1.0);\n}\n\n\nlayout(location = 0)\nout vec4 entryPointParam_fs_main_0;\n\n\nin vec4 v_color;\n\n\nin vec2 v_barInkPx;\n\n\nvoid main()\n{\n\n float aaPx_1 = barAaPx_0();\n float alpha_0 = aaRamp_0(v_barInkPx.x, aaPx_1) - aaRamp_0(v_barInkPx.y, aaPx_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";
|
|
6
|
+
export * from './barMark.iface.generated.js';
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { VertexAttributeLayout, ShaderBinding, TextureBinding } from '@jbrowse/render-core/hal';
|
|
2
|
+
export declare const BINDINGS: readonly ShaderBinding[];
|
|
3
|
+
export declare const VERTS_PER_INSTANCE = 6;
|
|
4
|
+
export declare const UNIFORMS_SIZE_BYTES = 64;
|
|
5
|
+
export declare const UNIFORM_OFFSET_F32: {
|
|
6
|
+
readonly bpRangeX: 0;
|
|
7
|
+
readonly canvasHeight: 3;
|
|
8
|
+
readonly domainMin: 4;
|
|
9
|
+
readonly domainMax: 5;
|
|
10
|
+
readonly rampMin: 8;
|
|
11
|
+
readonly rampMax: 9;
|
|
12
|
+
readonly origin: 10;
|
|
13
|
+
readonly zero: 11;
|
|
14
|
+
readonly minCellDenomPx: 12;
|
|
15
|
+
readonly minWidthPx: 13;
|
|
16
|
+
readonly devicePixelRatio: 14;
|
|
17
|
+
};
|
|
18
|
+
export declare const UNIFORM_OFFSET_I32: {
|
|
19
|
+
readonly valueScaleType: 6;
|
|
20
|
+
readonly rampMode: 7;
|
|
21
|
+
};
|
|
22
|
+
export interface Uniforms {
|
|
23
|
+
bpRangeX: [number, number, number];
|
|
24
|
+
canvasHeight: number;
|
|
25
|
+
domainMin: number;
|
|
26
|
+
domainMax: number;
|
|
27
|
+
valueScaleType: number;
|
|
28
|
+
rampMode: number;
|
|
29
|
+
rampMin: number;
|
|
30
|
+
rampMax: number;
|
|
31
|
+
origin: number;
|
|
32
|
+
zero: number;
|
|
33
|
+
minCellDenomPx: number;
|
|
34
|
+
minWidthPx: number;
|
|
35
|
+
devicePixelRatio: number;
|
|
36
|
+
}
|
|
37
|
+
export declare function writeUniforms(buf: ArrayBuffer, uniforms: Uniforms): void;
|
|
38
|
+
export declare const INSTANCE_STRIDE_BYTES = 16;
|
|
39
|
+
export declare const INSTANCE_STRIDE_WORDS = 4;
|
|
40
|
+
export declare const INSTANCE_OFFSET_F32: {
|
|
41
|
+
readonly y: 2;
|
|
42
|
+
};
|
|
43
|
+
export declare const INSTANCE_OFFSET_U32: {
|
|
44
|
+
readonly x: 0;
|
|
45
|
+
readonly x2: 1;
|
|
46
|
+
readonly color: 3;
|
|
47
|
+
};
|
|
48
|
+
export declare const VERTEX_ATTRIBUTES: readonly VertexAttributeLayout[];
|
|
49
|
+
export interface InstanceArrays {
|
|
50
|
+
x: ArrayLike<number>;
|
|
51
|
+
x2: ArrayLike<number>;
|
|
52
|
+
y: ArrayLike<number>;
|
|
53
|
+
color: ArrayLike<number>;
|
|
54
|
+
}
|
|
55
|
+
export declare function packInstances(arrays: InstanceArrays, numInstances: number, buf?: ArrayBuffer): ArrayBuffer;
|
|
56
|
+
export declare function getInstanceX(u32: Uint32Array, i: number): number;
|
|
57
|
+
export declare function setInstanceX(u32: Uint32Array, i: number, v: number): void;
|
|
58
|
+
export declare function getInstanceX2(u32: Uint32Array, i: number): number;
|
|
59
|
+
export declare function setInstanceX2(u32: Uint32Array, i: number, v: number): void;
|
|
60
|
+
export declare function getInstanceY(f32: Float32Array, i: number): number;
|
|
61
|
+
export declare function setInstanceY(f32: Float32Array, i: number, v: number): void;
|
|
62
|
+
export declare function getInstanceColor(u32: Uint32Array, i: number): number;
|
|
63
|
+
export declare function setInstanceColor(u32: Uint32Array, i: number, v: number): void;
|
|
64
|
+
export declare const TEXTURES: readonly [TextureBinding, ...TextureBinding[]];
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
// AUTO-GENERATED by packages/shader-tools/src/shader-codegen from barMark.slang.
|
|
2
|
+
// Do not edit. Run `pnpm gen:shaders` to regenerate.
|
|
3
|
+
export const BINDINGS = [
|
|
4
|
+
{ index: 1, kind: 'uniform', name: 'u' },
|
|
5
|
+
{ index: 2, kind: 'texture', name: 'colorRamp' },
|
|
6
|
+
{ index: 3, kind: 'sampler', name: 'colorRamp' },
|
|
7
|
+
];
|
|
8
|
+
export const VERTS_PER_INSTANCE = 6;
|
|
9
|
+
export const UNIFORMS_SIZE_BYTES = 64;
|
|
10
|
+
// Word indices into a Float32Array view over the uniform buffer.
|
|
11
|
+
export const UNIFORM_OFFSET_F32 = {
|
|
12
|
+
bpRangeX: 0,
|
|
13
|
+
canvasHeight: 3,
|
|
14
|
+
domainMin: 4,
|
|
15
|
+
domainMax: 5,
|
|
16
|
+
rampMin: 8,
|
|
17
|
+
rampMax: 9,
|
|
18
|
+
origin: 10,
|
|
19
|
+
zero: 11,
|
|
20
|
+
minCellDenomPx: 12,
|
|
21
|
+
minWidthPx: 13,
|
|
22
|
+
devicePixelRatio: 14,
|
|
23
|
+
};
|
|
24
|
+
// Word indices into a Int32Array view over the uniform buffer.
|
|
25
|
+
export const UNIFORM_OFFSET_I32 = {
|
|
26
|
+
valueScaleType: 6,
|
|
27
|
+
rampMode: 7,
|
|
28
|
+
};
|
|
29
|
+
export function writeUniforms(buf, uniforms) {
|
|
30
|
+
const f32 = new Float32Array(buf);
|
|
31
|
+
const i32 = new Int32Array(buf);
|
|
32
|
+
f32[0] = uniforms.bpRangeX[0];
|
|
33
|
+
f32[1] = uniforms.bpRangeX[1];
|
|
34
|
+
f32[2] = uniforms.bpRangeX[2];
|
|
35
|
+
f32[3] = uniforms.canvasHeight;
|
|
36
|
+
f32[4] = uniforms.domainMin;
|
|
37
|
+
f32[5] = uniforms.domainMax;
|
|
38
|
+
i32[6] = uniforms.valueScaleType;
|
|
39
|
+
i32[7] = uniforms.rampMode;
|
|
40
|
+
f32[8] = uniforms.rampMin;
|
|
41
|
+
f32[9] = uniforms.rampMax;
|
|
42
|
+
f32[10] = uniforms.origin;
|
|
43
|
+
f32[11] = uniforms.zero;
|
|
44
|
+
f32[12] = uniforms.minCellDenomPx;
|
|
45
|
+
f32[13] = uniforms.minWidthPx;
|
|
46
|
+
f32[14] = uniforms.devicePixelRatio;
|
|
47
|
+
}
|
|
48
|
+
export const INSTANCE_STRIDE_BYTES = 16;
|
|
49
|
+
export const INSTANCE_STRIDE_WORDS = 4;
|
|
50
|
+
// Word indices into a Float32Array view over the instance buffer.
|
|
51
|
+
export const INSTANCE_OFFSET_F32 = {
|
|
52
|
+
y: 2,
|
|
53
|
+
};
|
|
54
|
+
// Word indices into a Uint32Array view over the instance buffer.
|
|
55
|
+
export const INSTANCE_OFFSET_U32 = {
|
|
56
|
+
x: 0,
|
|
57
|
+
x2: 1,
|
|
58
|
+
color: 3,
|
|
59
|
+
};
|
|
60
|
+
export const VERTEX_ATTRIBUTES = [
|
|
61
|
+
{ name: 'a_x', components: 1, type: 'uint', offsetBytes: 0, integer: true },
|
|
62
|
+
{ name: 'a_x2', components: 1, type: 'uint', offsetBytes: 4, integer: true },
|
|
63
|
+
{ name: 'a_y', components: 1, type: 'float', offsetBytes: 8, integer: false },
|
|
64
|
+
{ name: 'a_color', components: 1, type: 'uint', offsetBytes: 12, integer: true },
|
|
65
|
+
];
|
|
66
|
+
export function packInstances(arrays, numInstances, buf = new ArrayBuffer(numInstances * INSTANCE_STRIDE_BYTES)) {
|
|
67
|
+
const f32 = new Float32Array(buf);
|
|
68
|
+
const u32 = new Uint32Array(buf);
|
|
69
|
+
const { x, x2, y, color } = arrays;
|
|
70
|
+
for (let i = 0; i < numInstances; i++) {
|
|
71
|
+
const o = i * INSTANCE_STRIDE_WORDS;
|
|
72
|
+
u32[o + 0] = x[i];
|
|
73
|
+
u32[o + 1] = x2[i];
|
|
74
|
+
f32[o + 2] = y[i];
|
|
75
|
+
u32[o + 3] = color[i];
|
|
76
|
+
}
|
|
77
|
+
return buf;
|
|
78
|
+
}
|
|
79
|
+
// Instance `i`'s `x`.
|
|
80
|
+
export function getInstanceX(u32, i) {
|
|
81
|
+
return u32[i * INSTANCE_STRIDE_WORDS];
|
|
82
|
+
}
|
|
83
|
+
export function setInstanceX(u32, i, v) {
|
|
84
|
+
u32[i * INSTANCE_STRIDE_WORDS] = v;
|
|
85
|
+
}
|
|
86
|
+
// Instance `i`'s `x2`.
|
|
87
|
+
export function getInstanceX2(u32, i) {
|
|
88
|
+
return u32[i * INSTANCE_STRIDE_WORDS + 1];
|
|
89
|
+
}
|
|
90
|
+
export function setInstanceX2(u32, i, v) {
|
|
91
|
+
u32[i * INSTANCE_STRIDE_WORDS + 1] = v;
|
|
92
|
+
}
|
|
93
|
+
// Instance `i`'s `y`.
|
|
94
|
+
export function getInstanceY(f32, i) {
|
|
95
|
+
return f32[i * INSTANCE_STRIDE_WORDS + 2];
|
|
96
|
+
}
|
|
97
|
+
export function setInstanceY(f32, i, v) {
|
|
98
|
+
f32[i * INSTANCE_STRIDE_WORDS + 2] = v;
|
|
99
|
+
}
|
|
100
|
+
// Instance `i`'s `color`.
|
|
101
|
+
export function getInstanceColor(u32, i) {
|
|
102
|
+
return u32[i * INSTANCE_STRIDE_WORDS + 3];
|
|
103
|
+
}
|
|
104
|
+
export function setInstanceColor(u32, i, v) {
|
|
105
|
+
u32[i * INSTANCE_STRIDE_WORDS + 3] = v;
|
|
106
|
+
}
|
|
107
|
+
// Combined `Sampler2D` bindings. Texture unit indices start at 0.
|
|
108
|
+
export const TEXTURES = [
|
|
109
|
+
{ textureBinding: 2, samplerBinding: 3, glTextureUnit: 0, glUniformName: 'u_colorRamp', filter: 'linear' },
|
|
110
|
+
];
|