hyper-scatter 0.1.0
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/LICENSE +21 -0
- package/README.md +142 -0
- package/dist-lib/controller/interaction_controller.d.ts +29 -0
- package/dist-lib/controller/interaction_controller.d.ts.map +1 -0
- package/dist-lib/controller/interaction_controller.js +286 -0
- package/dist-lib/controller/interaction_controller.js.map +1 -0
- package/dist-lib/core/dataset.d.ts +62 -0
- package/dist-lib/core/dataset.d.ts.map +1 -0
- package/dist-lib/core/dataset.js +152 -0
- package/dist-lib/core/dataset.js.map +1 -0
- package/dist-lib/core/lasso_simplify.d.ts +16 -0
- package/dist-lib/core/lasso_simplify.d.ts.map +1 -0
- package/dist-lib/core/lasso_simplify.js +173 -0
- package/dist-lib/core/lasso_simplify.js.map +1 -0
- package/dist-lib/core/math/euclidean.d.ts +31 -0
- package/dist-lib/core/math/euclidean.d.ts.map +1 -0
- package/dist-lib/core/math/euclidean.js +64 -0
- package/dist-lib/core/math/euclidean.js.map +1 -0
- package/dist-lib/core/math/poincare.d.ts +117 -0
- package/dist-lib/core/math/poincare.d.ts.map +1 -0
- package/dist-lib/core/math/poincare.js +321 -0
- package/dist-lib/core/math/poincare.js.map +1 -0
- package/dist-lib/core/rng.d.ts +18 -0
- package/dist-lib/core/rng.d.ts.map +1 -0
- package/dist-lib/core/rng.js +52 -0
- package/dist-lib/core/rng.js.map +1 -0
- package/dist-lib/core/selection/point_in_polygon.d.ts +30 -0
- package/dist-lib/core/selection/point_in_polygon.d.ts.map +1 -0
- package/dist-lib/core/selection/point_in_polygon.js +112 -0
- package/dist-lib/core/selection/point_in_polygon.js.map +1 -0
- package/dist-lib/core/types.d.ts +185 -0
- package/dist-lib/core/types.d.ts.map +1 -0
- package/dist-lib/core/types.js +53 -0
- package/dist-lib/core/types.js.map +1 -0
- package/dist-lib/impl_candidate/spatial_index.d.ts +45 -0
- package/dist-lib/impl_candidate/spatial_index.d.ts.map +1 -0
- package/dist-lib/impl_candidate/spatial_index.js +186 -0
- package/dist-lib/impl_candidate/spatial_index.js.map +1 -0
- package/dist-lib/impl_candidate/webgl_candidate.d.ts +283 -0
- package/dist-lib/impl_candidate/webgl_candidate.d.ts.map +1 -0
- package/dist-lib/impl_candidate/webgl_candidate.js +2276 -0
- package/dist-lib/impl_candidate/webgl_candidate.js.map +1 -0
- package/dist-lib/index.d.ts +11 -0
- package/dist-lib/index.d.ts.map +1 -0
- package/dist-lib/index.js +52 -0
- package/dist-lib/index.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebGL2 candidate renderers.
|
|
3
|
+
*
|
|
4
|
+
* Key idea:
|
|
5
|
+
* - Keep all math (view state, project/unproject, pan/zoom) identical to reference
|
|
6
|
+
* by delegating to src/core/math/*.
|
|
7
|
+
* - Move rendering to GPU (WebGL2 point sprites) for high throughput.
|
|
8
|
+
* - Speed up hit-testing and lasso selection via spatial indexes.
|
|
9
|
+
*
|
|
10
|
+
* ---------------------------------------------------------------------------
|
|
11
|
+
* Adaptive Quality / Performance Policy (budget-based)
|
|
12
|
+
* ---------------------------------------------------------------------------
|
|
13
|
+
* This renderer intentionally adapts quality to keep interaction smooth on
|
|
14
|
+
* typical developer hardware.
|
|
15
|
+
*
|
|
16
|
+
* Instead of relying on point-count-only thresholds, we choose settings from
|
|
17
|
+
* simple *work budgets*:
|
|
18
|
+
*
|
|
19
|
+
* 1) Fragment budget (fill-rate proxy)
|
|
20
|
+
* estFragments ≈ drawCount * π * r^2 * dpr^2
|
|
21
|
+
* where r is point radius in CSS pixels and dpr is the offscreen points-FBO
|
|
22
|
+
* pixel ratio (NOT necessarily window.devicePixelRatio).
|
|
23
|
+
*
|
|
24
|
+
* 2) Points FBO pixel budget (memory/bandwidth proxy)
|
|
25
|
+
* pointsPixels = (width * height) * dpr^2
|
|
26
|
+
*
|
|
27
|
+
* The policy chooses an offscreen points DPR that respects BOTH budgets. When
|
|
28
|
+
* fragment pressure is high, we may switch from anti-aliased circles to faster
|
|
29
|
+
* squares (with hysteresis) rather than doing it at a fixed N threshold.
|
|
30
|
+
*
|
|
31
|
+
* NOTE: These adaptations affect *rendering only*; hit-testing and lasso
|
|
32
|
+
* selection remain exact (CPU-side) and must match the reference semantics.
|
|
33
|
+
*
|
|
34
|
+
* IMPORTANT:
|
|
35
|
+
* - The browser benchmark/accuracy harness uses a *separate* hidden canvas for
|
|
36
|
+
* the WebGL candidate (a single <canvas> cannot hold both a 2D and WebGL
|
|
37
|
+
* context at the same time).
|
|
38
|
+
* - This renderer still lazily creates its WebGL2 context only when `render()`
|
|
39
|
+
* is called, because the demo/harness may re-initialize renderers and we
|
|
40
|
+
* want `init()` to remain side-effect-light.
|
|
41
|
+
*/
|
|
42
|
+
import { Dataset, Renderer, InitOptions, ViewState, Modifiers, HitResult, SelectionResult, CountSelectionOptions } from '../core/types.js';
|
|
43
|
+
import { UniformGridIndex } from './spatial_index.js';
|
|
44
|
+
type GeometryKind = 'euclidean' | 'poincare';
|
|
45
|
+
declare abstract class WebGLRendererBase implements Renderer {
|
|
46
|
+
protected canvas: HTMLCanvasElement | null;
|
|
47
|
+
protected width: number;
|
|
48
|
+
protected height: number;
|
|
49
|
+
protected deviceDpr: number;
|
|
50
|
+
protected canvasDpr: number;
|
|
51
|
+
protected dpr: number;
|
|
52
|
+
protected dataset: Dataset | null;
|
|
53
|
+
protected selection: Set<number>;
|
|
54
|
+
protected hoveredIndex: number;
|
|
55
|
+
protected pointRadiusCss: number;
|
|
56
|
+
protected colors: string[];
|
|
57
|
+
protected backgroundColor: string;
|
|
58
|
+
protected poincareDiskFillColor: string;
|
|
59
|
+
protected poincareDiskBorderColor: string;
|
|
60
|
+
protected poincareGridColor: string;
|
|
61
|
+
protected poincareDiskBorderWidthPx: number;
|
|
62
|
+
protected poincareGridWidthPx: number;
|
|
63
|
+
protected paletteSize: number;
|
|
64
|
+
protected paletteDirty: boolean;
|
|
65
|
+
protected paletteTex: WebGLTexture | null;
|
|
66
|
+
protected paletteTexW: number;
|
|
67
|
+
protected paletteTexH: number;
|
|
68
|
+
protected paletteBytes: Uint8Array<ArrayBuffer>;
|
|
69
|
+
protected readonly paletteTexUnit = 1;
|
|
70
|
+
protected scratchIds: number[];
|
|
71
|
+
protected hoverPosScratch: Float32Array<ArrayBuffer>;
|
|
72
|
+
protected hoverLabScratch: Uint16Array<ArrayBuffer>;
|
|
73
|
+
protected hoverIndexScratch: Uint32Array<ArrayBuffer>;
|
|
74
|
+
protected lastViewChangeTs: number;
|
|
75
|
+
protected markViewChanged(): void;
|
|
76
|
+
/**
|
|
77
|
+
* Optional UI hook: call when the user ends an interaction (mouse up / gesture end).
|
|
78
|
+
*
|
|
79
|
+
* The renderer uses `lastViewChangeTs` to decide whether to enable interaction
|
|
80
|
+
* LOD (subsampling) for smooth panning/zooming. In the demo app we only render
|
|
81
|
+
* on demand; if the final frame after mouseup is still considered "interacting",
|
|
82
|
+
* we can end up showing a subsample until the next hover-triggered render,
|
|
83
|
+
* which looks like a visual snap/pop.
|
|
84
|
+
*
|
|
85
|
+
* By resetting the interaction timer, the next render will use the stable
|
|
86
|
+
* (non-interaction) policy immediately.
|
|
87
|
+
*/
|
|
88
|
+
endInteraction(): void;
|
|
89
|
+
protected markBackdropDirty(): void;
|
|
90
|
+
protected uploadPoincareDiskStyleUniforms(): void;
|
|
91
|
+
protected getBackdropZoom(): number;
|
|
92
|
+
protected dataIndex: UniformGridIndex | null;
|
|
93
|
+
protected gl: WebGL2RenderingContext | null;
|
|
94
|
+
protected vao: WebGLVertexArrayObject | null;
|
|
95
|
+
protected posBuffer: WebGLBuffer | null;
|
|
96
|
+
protected labelBuffer: WebGLBuffer | null;
|
|
97
|
+
protected hoverVao: WebGLVertexArrayObject | null;
|
|
98
|
+
protected hoverPosBuffer: WebGLBuffer | null;
|
|
99
|
+
protected hoverLabelBuffer: WebGLBuffer | null;
|
|
100
|
+
protected selectionVao: WebGLVertexArrayObject | null;
|
|
101
|
+
protected selectionPosBuffer: WebGLBuffer | null;
|
|
102
|
+
protected selectionLabelBuffer: WebGLBuffer | null;
|
|
103
|
+
protected selectionOverlayCount: number;
|
|
104
|
+
protected selectionEbo: WebGLBuffer | null;
|
|
105
|
+
protected hoverEbo: WebGLBuffer | null;
|
|
106
|
+
protected interactionEbo: WebGLBuffer | null;
|
|
107
|
+
protected interactionCount: number;
|
|
108
|
+
protected maxBaseDrawPoints: number;
|
|
109
|
+
protected maxGpuUploadPoints: number;
|
|
110
|
+
protected gpuUsesFullDataset: boolean;
|
|
111
|
+
protected gpuPointCount: number;
|
|
112
|
+
protected policy: {
|
|
113
|
+
readonly fragmentBudget: 100000000;
|
|
114
|
+
readonly circleBudget: 60000000;
|
|
115
|
+
readonly squareOnRatio: 1;
|
|
116
|
+
readonly squareOffRatio: 0.75;
|
|
117
|
+
readonly minPointsDpr: 0.35;
|
|
118
|
+
};
|
|
119
|
+
protected renderAsSquares: boolean;
|
|
120
|
+
__debugPolicy: any;
|
|
121
|
+
protected backdropTex: WebGLTexture | null;
|
|
122
|
+
protected backdropFbo: WebGLFramebuffer | null;
|
|
123
|
+
protected backdropW: number;
|
|
124
|
+
protected backdropH: number;
|
|
125
|
+
protected backdropDpr: number;
|
|
126
|
+
protected backdropZoom: number;
|
|
127
|
+
protected backdropDirty: boolean;
|
|
128
|
+
protected pointsTex: WebGLTexture | null;
|
|
129
|
+
protected pointsFbo: WebGLFramebuffer | null;
|
|
130
|
+
protected pointsW: number;
|
|
131
|
+
protected pointsH: number;
|
|
132
|
+
protected programComposite: WebGLProgram | null;
|
|
133
|
+
protected uCompositeTex: WebGLUniformLocation | null;
|
|
134
|
+
protected poincareDisk: {
|
|
135
|
+
program: WebGLProgram;
|
|
136
|
+
uCssSize: WebGLUniformLocation | null;
|
|
137
|
+
uDpr: WebGLUniformLocation | null;
|
|
138
|
+
uDiskFillColor: WebGLUniformLocation | null;
|
|
139
|
+
uDiskBorderColor: WebGLUniformLocation | null;
|
|
140
|
+
uGridColor: WebGLUniformLocation | null;
|
|
141
|
+
uDiskBorderWidthPx: WebGLUniformLocation | null;
|
|
142
|
+
uGridWidthPx: WebGLUniformLocation | null;
|
|
143
|
+
} | null;
|
|
144
|
+
protected pointsCircle: {
|
|
145
|
+
program: WebGLProgram;
|
|
146
|
+
uPaletteTex: WebGLUniformLocation | null;
|
|
147
|
+
uPaletteSize: WebGLUniformLocation | null;
|
|
148
|
+
uPaletteWidth: WebGLUniformLocation | null;
|
|
149
|
+
uCssSize: WebGLUniformLocation | null;
|
|
150
|
+
uDpr: WebGLUniformLocation | null;
|
|
151
|
+
uPointRadius: WebGLUniformLocation | null;
|
|
152
|
+
} | null;
|
|
153
|
+
protected pointsSquare: {
|
|
154
|
+
program: WebGLProgram;
|
|
155
|
+
uPaletteTex: WebGLUniformLocation | null;
|
|
156
|
+
uPaletteSize: WebGLUniformLocation | null;
|
|
157
|
+
uPaletteWidth: WebGLUniformLocation | null;
|
|
158
|
+
uCssSize: WebGLUniformLocation | null;
|
|
159
|
+
uDpr: WebGLUniformLocation | null;
|
|
160
|
+
uPointRadius: WebGLUniformLocation | null;
|
|
161
|
+
} | null;
|
|
162
|
+
protected programSolid: WebGLProgram | null;
|
|
163
|
+
protected uSolidColor: WebGLUniformLocation | null;
|
|
164
|
+
protected uSolidPointSizePx: WebGLUniformLocation | null;
|
|
165
|
+
protected uSolidRingThicknessPx: WebGLUniformLocation | null;
|
|
166
|
+
protected uSolidRingMode: WebGLUniformLocation | null;
|
|
167
|
+
protected uCssSizeSolid: WebGLUniformLocation | null;
|
|
168
|
+
protected uDprSolid: WebGLUniformLocation | null;
|
|
169
|
+
protected uPointRadiusSolid: WebGLUniformLocation | null;
|
|
170
|
+
protected selectionDirty: boolean;
|
|
171
|
+
protected hoverDirty: boolean;
|
|
172
|
+
init(canvas: HTMLCanvasElement, opts: InitOptions): void;
|
|
173
|
+
protected chooseRenderDpr(pointCount: number): number;
|
|
174
|
+
protected estimateSubsampleCount(n: number): number;
|
|
175
|
+
protected estimatePointFragments(drawCount: number, pointsDpr: number): number;
|
|
176
|
+
protected updateSquarePointPolicy(estimatedFragments: number): void;
|
|
177
|
+
setDataset(dataset: Dataset): void;
|
|
178
|
+
abstract setView(view: ViewState): void;
|
|
179
|
+
abstract getView(): ViewState;
|
|
180
|
+
resize(width: number, height: number): void;
|
|
181
|
+
setSelection(indices: Set<number>): void;
|
|
182
|
+
getSelection(): Set<number>;
|
|
183
|
+
setHovered(index: number): void;
|
|
184
|
+
destroy(): void;
|
|
185
|
+
protected uploadPaletteUniforms(): void;
|
|
186
|
+
protected bindPaletteTexture(): void;
|
|
187
|
+
countSelection(result: SelectionResult, opts?: CountSelectionOptions): Promise<number>;
|
|
188
|
+
abstract pan(deltaX: number, deltaY: number, modifiers: Modifiers): void;
|
|
189
|
+
abstract zoom(anchorX: number, anchorY: number, delta: number, modifiers: Modifiers): void;
|
|
190
|
+
abstract hitTest(screenX: number, screenY: number): HitResult | null;
|
|
191
|
+
abstract lassoSelect(polyline: Float32Array): SelectionResult;
|
|
192
|
+
abstract projectToScreen(dataX: number, dataY: number): {
|
|
193
|
+
x: number;
|
|
194
|
+
y: number;
|
|
195
|
+
};
|
|
196
|
+
abstract unprojectFromScreen(screenX: number, screenY: number): {
|
|
197
|
+
x: number;
|
|
198
|
+
y: number;
|
|
199
|
+
};
|
|
200
|
+
protected abstract geometryKind(): GeometryKind;
|
|
201
|
+
protected ensureGL(): void;
|
|
202
|
+
protected ensurePointsResources(): void;
|
|
203
|
+
protected ensureBackdropResources(): void;
|
|
204
|
+
protected renderBackdropIfNeeded(): void;
|
|
205
|
+
protected createProgramsAndBuffers(): void;
|
|
206
|
+
protected uploadDatasetToGPU(): void;
|
|
207
|
+
protected uploadSelectionToGPU(): void;
|
|
208
|
+
protected uploadHoverToGPU(): void;
|
|
209
|
+
protected abstract bindViewUniformsForProgram(program: WebGLProgram): void;
|
|
210
|
+
render(): void;
|
|
211
|
+
}
|
|
212
|
+
export declare class EuclideanWebGLCandidate extends WebGLRendererBase {
|
|
213
|
+
private view;
|
|
214
|
+
private uniformCache;
|
|
215
|
+
protected geometryKind(): GeometryKind;
|
|
216
|
+
setDataset(dataset: Dataset): void;
|
|
217
|
+
private fitToData;
|
|
218
|
+
setView(view: ViewState): void;
|
|
219
|
+
getView(): ViewState;
|
|
220
|
+
protected bindViewUniformsForProgram(program: WebGLProgram): void;
|
|
221
|
+
pan(deltaX: number, deltaY: number, _modifiers: Modifiers): void;
|
|
222
|
+
zoom(anchorX: number, anchorY: number, delta: number, _modifiers: Modifiers): void;
|
|
223
|
+
hitTest(screenX: number, screenY: number): HitResult | null;
|
|
224
|
+
lassoSelect(polyline: Float32Array): SelectionResult;
|
|
225
|
+
projectToScreen(dataX: number, dataY: number): {
|
|
226
|
+
x: number;
|
|
227
|
+
y: number;
|
|
228
|
+
};
|
|
229
|
+
unprojectFromScreen(screenX: number, screenY: number): {
|
|
230
|
+
x: number;
|
|
231
|
+
y: number;
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
export declare class HyperbolicWebGLCandidate extends WebGLRendererBase {
|
|
235
|
+
private view;
|
|
236
|
+
private uniformCache;
|
|
237
|
+
private lastPanScreenX;
|
|
238
|
+
private lastPanScreenY;
|
|
239
|
+
private hasPanAnchor;
|
|
240
|
+
protected geometryKind(): GeometryKind;
|
|
241
|
+
protected getBackdropZoom(): number;
|
|
242
|
+
setDataset(dataset: Dataset): void;
|
|
243
|
+
setView(view: ViewState): void;
|
|
244
|
+
getView(): ViewState;
|
|
245
|
+
protected bindViewUniformsForProgram(program: WebGLProgram): void;
|
|
246
|
+
startPan(screenX: number, screenY: number): void;
|
|
247
|
+
pan(deltaX: number, deltaY: number, _modifiers: Modifiers): void;
|
|
248
|
+
zoom(anchorX: number, anchorY: number, delta: number, _modifiers: Modifiers): void;
|
|
249
|
+
private mobiusDerivativeScaleAt;
|
|
250
|
+
/**
|
|
251
|
+
* Compute a conservative Euclidean data-space radius that guarantees we won't
|
|
252
|
+
* miss any point within `screenRadiusPx` of the cursor.
|
|
253
|
+
*
|
|
254
|
+
* Derivation:
|
|
255
|
+
* - Screen-space displacement is (locally) scaled by:
|
|
256
|
+
* localScale(z) = diskRadius * |T'_a(z)|
|
|
257
|
+
* where T_a is the Möbius transform used by the camera.
|
|
258
|
+
* - |T'_a(z)| = (1 - |a|^2) / |1 - conj(a) z|^2.
|
|
259
|
+
* - Over a Euclidean ball |z - z0| <= r, the denominator norm is Lipschitz:
|
|
260
|
+
* | |1 - conj(a)z| - |1 - conj(a)z0| | <= |a| * r
|
|
261
|
+
* hence for any z in the ball:
|
|
262
|
+
* |1 - conj(a)z| <= D0 + |a| r
|
|
263
|
+
* which yields a lower bound on |T'_a(z)| (worst-case smallest scale).
|
|
264
|
+
*
|
|
265
|
+
* We solve the fixed point:
|
|
266
|
+
* r = screenRadiusPx / (diskRadius * min|T'_a|)
|
|
267
|
+
* = screenRadiusPx * (D0 + |a| r)^2 / (diskRadius * (1 - |a|^2))
|
|
268
|
+
* by a few iterations (converges quickly for |a|<1).
|
|
269
|
+
*/
|
|
270
|
+
private conservativeDataRadiusForScreenRadius;
|
|
271
|
+
hitTest(screenX: number, screenY: number): HitResult | null;
|
|
272
|
+
lassoSelect(polyline: Float32Array): SelectionResult;
|
|
273
|
+
projectToScreen(dataX: number, dataY: number): {
|
|
274
|
+
x: number;
|
|
275
|
+
y: number;
|
|
276
|
+
};
|
|
277
|
+
unprojectFromScreen(screenX: number, screenY: number): {
|
|
278
|
+
x: number;
|
|
279
|
+
y: number;
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
export {};
|
|
283
|
+
//# sourceMappingURL=webgl_candidate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webgl_candidate.d.ts","sourceRoot":"","sources":["../../src/impl_candidate/webgl_candidate.ts"],"names":[],"mappings":"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"}
|