@yurialvesbordin/graphium 0.0.0-stage → 2.0.1
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 +112 -2
- package/dist/Graphium.d.ts +156 -0
- package/dist/Graphium.d.ts.map +1 -0
- package/dist/Graphium.js +413 -0
- package/dist/Graphium.js.map +1 -0
- package/dist/core/FocusController.d.ts +16 -0
- package/dist/core/FocusController.d.ts.map +1 -0
- package/dist/core/FocusController.js +53 -0
- package/dist/core/FocusController.js.map +1 -0
- package/dist/core/GraphEditor.d.ts +61 -0
- package/dist/core/GraphEditor.d.ts.map +1 -0
- package/dist/core/GraphEditor.js +165 -0
- package/dist/core/GraphEditor.js.map +1 -0
- package/dist/core/GraphModel.d.ts +166 -0
- package/dist/core/GraphModel.d.ts.map +1 -0
- package/dist/core/GraphModel.js +730 -0
- package/dist/core/GraphModel.js.map +1 -0
- package/dist/core/SelectionController.d.ts +26 -0
- package/dist/core/SelectionController.d.ts.map +1 -0
- package/dist/core/SelectionController.js +78 -0
- package/dist/core/SelectionController.js.map +1 -0
- package/dist/core/colors.d.ts +27 -0
- package/dist/core/colors.d.ts.map +1 -0
- package/dist/core/colors.js +141 -0
- package/dist/core/colors.js.map +1 -0
- package/dist/core/events.d.ts +21 -0
- package/dist/core/events.d.ts.map +1 -0
- package/dist/core/events.js +64 -0
- package/dist/core/events.js.map +1 -0
- package/dist/core/handles.d.ts +60 -0
- package/dist/core/handles.d.ts.map +1 -0
- package/dist/core/handles.js +116 -0
- package/dist/core/handles.js.map +1 -0
- package/dist/core/theme.d.ts +9 -0
- package/dist/core/theme.d.ts.map +1 -0
- package/dist/core/theme.js +167 -0
- package/dist/core/theme.js.map +1 -0
- package/dist/core/themes.d.ts +9 -0
- package/dist/core/themes.d.ts.map +1 -0
- package/dist/core/themes.js +103 -0
- package/dist/core/themes.js.map +1 -0
- package/dist/core/types.d.ts +287 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +7 -0
- package/dist/core/types.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/interaction/InteractionBinder.d.ts +43 -0
- package/dist/interaction/InteractionBinder.d.ts.map +1 -0
- package/dist/interaction/InteractionBinder.js +121 -0
- package/dist/interaction/InteractionBinder.js.map +1 -0
- package/dist/interaction/PointerController.d.ts +83 -0
- package/dist/interaction/PointerController.d.ts.map +1 -0
- package/dist/interaction/PointerController.js +294 -0
- package/dist/interaction/PointerController.js.map +1 -0
- package/dist/physics/PhysicsEngine.d.ts +82 -0
- package/dist/physics/PhysicsEngine.d.ts.map +1 -0
- package/dist/physics/PhysicsEngine.js +469 -0
- package/dist/physics/PhysicsEngine.js.map +1 -0
- package/dist/physics/SpatialHash.d.ts +36 -0
- package/dist/physics/SpatialHash.d.ts.map +1 -0
- package/dist/physics/SpatialHash.js +126 -0
- package/dist/physics/SpatialHash.js.map +1 -0
- package/dist/physics/presets.d.ts +14 -0
- package/dist/physics/presets.d.ts.map +1 -0
- package/dist/physics/presets.js +108 -0
- package/dist/physics/presets.js.map +1 -0
- package/dist/render/Camera.d.ts +55 -0
- package/dist/render/Camera.d.ts.map +1 -0
- package/dist/render/Camera.js +94 -0
- package/dist/render/Camera.js.map +1 -0
- package/dist/render/LabelLayer.d.ts +32 -0
- package/dist/render/LabelLayer.d.ts.map +1 -0
- package/dist/render/LabelLayer.js +142 -0
- package/dist/render/LabelLayer.js.map +1 -0
- package/dist/render/RenderLoop.d.ts +67 -0
- package/dist/render/RenderLoop.d.ts.map +1 -0
- package/dist/render/RenderLoop.js +126 -0
- package/dist/render/RenderLoop.js.map +1 -0
- package/dist/render/Renderer.d.ts +73 -0
- package/dist/render/Renderer.d.ts.map +1 -0
- package/dist/render/Renderer.js +512 -0
- package/dist/render/Renderer.js.map +1 -0
- package/dist/render/TextureAtlas.d.ts +51 -0
- package/dist/render/TextureAtlas.d.ts.map +1 -0
- package/dist/render/TextureAtlas.js +160 -0
- package/dist/render/TextureAtlas.js.map +1 -0
- package/dist/render/ViewportController.d.ts +34 -0
- package/dist/render/ViewportController.d.ts.map +1 -0
- package/dist/render/ViewportController.js +57 -0
- package/dist/render/ViewportController.js.map +1 -0
- package/dist/render/geometry.d.ts +19 -0
- package/dist/render/geometry.d.ts.map +1 -0
- package/dist/render/geometry.js +71 -0
- package/dist/render/geometry.js.map +1 -0
- package/dist/render/shaders.d.ts +13 -0
- package/dist/render/shaders.d.ts.map +1 -0
- package/dist/render/shaders.js +183 -0
- package/dist/render/shaders.js.map +1 -0
- package/package.json +73 -4
|
@@ -0,0 +1,512 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Draws the graph with three instanced WebGL2 passes: bezier edges, arrow
|
|
3
|
+
* heads and circular nodes with atlas images. Instance buffers are filled
|
|
4
|
+
* from the model on demand and all state uniforms come from the theme.
|
|
5
|
+
*/
|
|
6
|
+
import { LINK_HIDDEN, LINK_DIM, LINK_SELECTED, NODE_DISABLED, NODE_DRAGGED, NODE_DIM, NODE_FIXED, NODE_HIDDEN, NODE_SELECTED } from '../core/GraphModel.js';
|
|
7
|
+
import { packRGBA, unpackRGBA } from '../core/colors.js';
|
|
8
|
+
import { bezierLength, controlPoint } from './geometry.js';
|
|
9
|
+
import { ARROW_FRAGMENT, ARROW_VERTEX, EDGE_FRAGMENT, EDGE_VERTEX, NODE_FRAGMENT, NODE_VERTEX } from './shaders.js';
|
|
10
|
+
const NODE_FLOATS = 20;
|
|
11
|
+
const EDGE_FLOATS = 16;
|
|
12
|
+
const ARROW_FLOATS = 9;
|
|
13
|
+
const CURVE_SEGMENTS = 18;
|
|
14
|
+
function compile(gl, type, source) {
|
|
15
|
+
const shader = gl.createShader(type);
|
|
16
|
+
if (!shader) {
|
|
17
|
+
throw new Error('Graphium could not create a shader.');
|
|
18
|
+
}
|
|
19
|
+
gl.shaderSource(shader, source);
|
|
20
|
+
gl.compileShader(shader);
|
|
21
|
+
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
|
|
22
|
+
const log = gl.getShaderInfoLog(shader);
|
|
23
|
+
gl.deleteShader(shader);
|
|
24
|
+
throw new Error(`Graphium shader error: ${log}`);
|
|
25
|
+
}
|
|
26
|
+
return shader;
|
|
27
|
+
}
|
|
28
|
+
function link(gl, vertexSource, fragmentSource) {
|
|
29
|
+
const program = gl.createProgram();
|
|
30
|
+
if (!program) {
|
|
31
|
+
throw new Error('Graphium could not create a program.');
|
|
32
|
+
}
|
|
33
|
+
const vertex = compile(gl, gl.VERTEX_SHADER, vertexSource);
|
|
34
|
+
const fragment = compile(gl, gl.FRAGMENT_SHADER, fragmentSource);
|
|
35
|
+
gl.attachShader(program, vertex);
|
|
36
|
+
gl.attachShader(program, fragment);
|
|
37
|
+
gl.linkProgram(program);
|
|
38
|
+
gl.deleteShader(vertex);
|
|
39
|
+
gl.deleteShader(fragment);
|
|
40
|
+
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
|
|
41
|
+
const log = gl.getProgramInfoLog(program);
|
|
42
|
+
gl.deleteProgram(program);
|
|
43
|
+
throw new Error(`Graphium program error: ${log}`);
|
|
44
|
+
}
|
|
45
|
+
return program;
|
|
46
|
+
}
|
|
47
|
+
export class Renderer {
|
|
48
|
+
constructor(canvas, theme, options = {}) {
|
|
49
|
+
this.atlas = null;
|
|
50
|
+
this.lastRenderMs = 0;
|
|
51
|
+
this.camera = null;
|
|
52
|
+
this.nodeProgram = null;
|
|
53
|
+
this.edgeProgram = null;
|
|
54
|
+
this.arrowProgram = null;
|
|
55
|
+
this.cornerBuffer = null;
|
|
56
|
+
this.curveCornerBuffer = null;
|
|
57
|
+
this.nodeVAO = null;
|
|
58
|
+
this.nodeBuffer = null;
|
|
59
|
+
this.edgeVAO = null;
|
|
60
|
+
this.edgeBuffer = null;
|
|
61
|
+
this.edgeCurveVAO = null;
|
|
62
|
+
this.edgeCurveBuffer = null;
|
|
63
|
+
this.arrowVAO = null;
|
|
64
|
+
this.arrowBuffer = null;
|
|
65
|
+
this.nodeData = new Float32Array(256 * NODE_FLOATS);
|
|
66
|
+
this.edgeData = new Float32Array(512 * EDGE_FLOATS);
|
|
67
|
+
this.edgeCurveData = new Float32Array(256 * EDGE_FLOATS);
|
|
68
|
+
this.arrowData = new Float32Array(256 * ARROW_FLOATS);
|
|
69
|
+
this.nodeDrawCount = 0;
|
|
70
|
+
this.edgeDrawCount = 0;
|
|
71
|
+
this.edgeCurveDrawCount = 0;
|
|
72
|
+
this.arrowDrawCount = 0;
|
|
73
|
+
this.clearColor = [0.043, 0.047, 0.071, 1];
|
|
74
|
+
this.controlScratch = { x: 0, y: 0 };
|
|
75
|
+
this.canvas = canvas;
|
|
76
|
+
this.theme = theme;
|
|
77
|
+
this.fadeZoom = options.fadeZoom ?? 0.18;
|
|
78
|
+
this.maxPixelRatio = options.maxPixelRatio ?? 2;
|
|
79
|
+
const attributes = { antialias: options.antialias ?? true, alpha: true, premultipliedAlpha: true };
|
|
80
|
+
this.gl = canvas.getContext('webgl2', attributes);
|
|
81
|
+
if (this.gl) {
|
|
82
|
+
this.initGL();
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/** Creates shader programs, vertex arrays and static corner buffers. */
|
|
86
|
+
initGL() {
|
|
87
|
+
const gl = this.gl;
|
|
88
|
+
this.nodeProgram = link(gl, NODE_VERTEX, NODE_FRAGMENT);
|
|
89
|
+
this.edgeProgram = link(gl, EDGE_VERTEX, EDGE_FRAGMENT);
|
|
90
|
+
this.arrowProgram = link(gl, ARROW_VERTEX, ARROW_FRAGMENT);
|
|
91
|
+
this.cornerBuffer = gl.createBuffer();
|
|
92
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, this.cornerBuffer);
|
|
93
|
+
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, -1, 1, -1, 1, 1, -1, 1]), gl.STATIC_DRAW);
|
|
94
|
+
this.nodeVAO = gl.createVertexArray();
|
|
95
|
+
this.nodeBuffer = gl.createBuffer();
|
|
96
|
+
gl.bindVertexArray(this.nodeVAO);
|
|
97
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, this.cornerBuffer);
|
|
98
|
+
gl.enableVertexAttribArray(0);
|
|
99
|
+
gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);
|
|
100
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, this.nodeBuffer);
|
|
101
|
+
gl.bufferData(gl.ARRAY_BUFFER, NODE_FLOATS * 4, gl.DYNAMIC_DRAW);
|
|
102
|
+
for (let attribute = 1; attribute <= 5; attribute++) {
|
|
103
|
+
gl.enableVertexAttribArray(attribute);
|
|
104
|
+
gl.vertexAttribPointer(attribute, 4, gl.FLOAT, false, NODE_FLOATS * 4, (attribute - 1) * 16);
|
|
105
|
+
gl.vertexAttribDivisor(attribute, 1);
|
|
106
|
+
}
|
|
107
|
+
this.edgeVAO = gl.createVertexArray();
|
|
108
|
+
this.edgeBuffer = gl.createBuffer();
|
|
109
|
+
gl.bindVertexArray(this.edgeVAO);
|
|
110
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, this.cornerBuffer);
|
|
111
|
+
gl.enableVertexAttribArray(0);
|
|
112
|
+
gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);
|
|
113
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, this.edgeBuffer);
|
|
114
|
+
gl.bufferData(gl.ARRAY_BUFFER, EDGE_FLOATS * 4, gl.DYNAMIC_DRAW);
|
|
115
|
+
for (let attribute = 1; attribute <= 4; attribute++) {
|
|
116
|
+
gl.enableVertexAttribArray(attribute);
|
|
117
|
+
gl.vertexAttribPointer(attribute, 4, gl.FLOAT, false, EDGE_FLOATS * 4, (attribute - 1) * 16);
|
|
118
|
+
gl.vertexAttribDivisor(attribute, 1);
|
|
119
|
+
}
|
|
120
|
+
this.edgeCurveVAO = gl.createVertexArray();
|
|
121
|
+
this.edgeCurveBuffer = gl.createBuffer();
|
|
122
|
+
this.curveCornerBuffer = gl.createBuffer();
|
|
123
|
+
const stripCorners = new Float32Array((CURVE_SEGMENTS + 1) * 2 * 2);
|
|
124
|
+
for (let step = 0; step <= CURVE_SEGMENTS; step++) {
|
|
125
|
+
const t = (step / CURVE_SEGMENTS) * 2 - 1;
|
|
126
|
+
stripCorners[step * 4] = t;
|
|
127
|
+
stripCorners[step * 4 + 1] = -1;
|
|
128
|
+
stripCorners[step * 4 + 2] = t;
|
|
129
|
+
stripCorners[step * 4 + 3] = 1;
|
|
130
|
+
}
|
|
131
|
+
gl.bindVertexArray(this.edgeCurveVAO);
|
|
132
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, this.curveCornerBuffer);
|
|
133
|
+
gl.bufferData(gl.ARRAY_BUFFER, stripCorners, gl.STATIC_DRAW);
|
|
134
|
+
gl.enableVertexAttribArray(0);
|
|
135
|
+
gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);
|
|
136
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, this.edgeCurveBuffer);
|
|
137
|
+
gl.bufferData(gl.ARRAY_BUFFER, EDGE_FLOATS * 4, gl.DYNAMIC_DRAW);
|
|
138
|
+
for (let attribute = 1; attribute <= 4; attribute++) {
|
|
139
|
+
gl.enableVertexAttribArray(attribute);
|
|
140
|
+
gl.vertexAttribPointer(attribute, 4, gl.FLOAT, false, EDGE_FLOATS * 4, (attribute - 1) * 16);
|
|
141
|
+
gl.vertexAttribDivisor(attribute, 1);
|
|
142
|
+
}
|
|
143
|
+
this.arrowVAO = gl.createVertexArray();
|
|
144
|
+
this.arrowBuffer = gl.createBuffer();
|
|
145
|
+
gl.bindVertexArray(this.arrowVAO);
|
|
146
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, this.cornerBuffer);
|
|
147
|
+
gl.enableVertexAttribArray(0);
|
|
148
|
+
gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);
|
|
149
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, this.arrowBuffer);
|
|
150
|
+
gl.bufferData(gl.ARRAY_BUFFER, ARROW_FLOATS * 4, gl.DYNAMIC_DRAW);
|
|
151
|
+
gl.enableVertexAttribArray(1);
|
|
152
|
+
gl.vertexAttribPointer(1, 4, gl.FLOAT, false, ARROW_FLOATS * 4, 0);
|
|
153
|
+
gl.vertexAttribDivisor(1, 1);
|
|
154
|
+
gl.enableVertexAttribArray(2);
|
|
155
|
+
gl.vertexAttribPointer(2, 4, gl.FLOAT, false, ARROW_FLOATS * 4, 4 * 4);
|
|
156
|
+
gl.vertexAttribDivisor(2, 1);
|
|
157
|
+
gl.enableVertexAttribArray(3);
|
|
158
|
+
gl.vertexAttribPointer(3, 1, gl.FLOAT, false, ARROW_FLOATS * 4, 8 * 4);
|
|
159
|
+
gl.vertexAttribDivisor(3, 1);
|
|
160
|
+
gl.bindVertexArray(null);
|
|
161
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, null);
|
|
162
|
+
gl.enable(gl.BLEND);
|
|
163
|
+
gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA);
|
|
164
|
+
}
|
|
165
|
+
/** Registers the camera used for matrices during rendering. */
|
|
166
|
+
setCamera(camera) {
|
|
167
|
+
this.camera = camera;
|
|
168
|
+
}
|
|
169
|
+
/** Attaches the texture atlas used for node image fills. */
|
|
170
|
+
setAtlas(atlas) {
|
|
171
|
+
this.atlas = atlas;
|
|
172
|
+
}
|
|
173
|
+
/** Applies a resolved theme and refreshes the clear color. */
|
|
174
|
+
setTheme(theme) {
|
|
175
|
+
this.theme = theme;
|
|
176
|
+
const packed = packRGBA(theme.background, 0x0b0e14ff);
|
|
177
|
+
this.clearColor = [((packed >>> 24) & 0xff) / 255, ((packed >>> 16) & 0xff) / 255, ((packed >>> 8) & 0xff) / 255, (packed & 0xff) / 255];
|
|
178
|
+
}
|
|
179
|
+
/** Resizes the drawing buffer with a capped device pixel ratio. */
|
|
180
|
+
resize(width, height, pixelRatio) {
|
|
181
|
+
const ratio = Math.max(0.5, Math.min(this.maxPixelRatio, pixelRatio || 1));
|
|
182
|
+
this.canvas.width = Math.max(1, Math.floor(width * ratio));
|
|
183
|
+
this.canvas.height = Math.max(1, Math.floor(height * ratio));
|
|
184
|
+
if (this.camera) {
|
|
185
|
+
this.camera.setViewport(this.canvas.width, this.canvas.height);
|
|
186
|
+
}
|
|
187
|
+
if (this.gl) {
|
|
188
|
+
this.gl.viewport(0, 0, this.canvas.width, this.canvas.height);
|
|
189
|
+
}
|
|
190
|
+
return this;
|
|
191
|
+
}
|
|
192
|
+
/** Grows an instance buffer when the graph requires more instances. */
|
|
193
|
+
ensure(data, floats, required) {
|
|
194
|
+
if (required <= data.length / floats) {
|
|
195
|
+
return data;
|
|
196
|
+
}
|
|
197
|
+
let capacity = data.length / floats;
|
|
198
|
+
while (capacity < required) {
|
|
199
|
+
capacity *= 2;
|
|
200
|
+
}
|
|
201
|
+
return new Float32Array(capacity * floats);
|
|
202
|
+
}
|
|
203
|
+
/** Writes one edge instance into the target bucket buffer. */
|
|
204
|
+
writeEdgeInstance(target, write, model, link, zoom) {
|
|
205
|
+
const source = model.source[link];
|
|
206
|
+
const target2 = model.target[link];
|
|
207
|
+
const ax = model.x[source];
|
|
208
|
+
const ay = model.y[source];
|
|
209
|
+
const bx = model.x[target2];
|
|
210
|
+
const by = model.y[target2];
|
|
211
|
+
const dx = bx - ax;
|
|
212
|
+
const dy = by - ay;
|
|
213
|
+
const chord = Math.hypot(dx, dy);
|
|
214
|
+
if (chord < 0.0001) {
|
|
215
|
+
return write;
|
|
216
|
+
}
|
|
217
|
+
const curvature = model.linkCurvature[link];
|
|
218
|
+
controlPoint(ax, ay, bx, by, curvature, this.controlScratch);
|
|
219
|
+
const selected = (model.linkFlags[link] & LINK_SELECTED) !== 0;
|
|
220
|
+
const packed = selected ? this.theme.selectedEdgeColor : model.linkColor[link];
|
|
221
|
+
const dimmed = (model.linkFlags[link] & LINK_DIM) !== 0 ? 0.12 : 1;
|
|
222
|
+
const opacity = model.linkOpacity[link] * (selected ? this.theme.selectedEdgeOpacity : 1) * dimmed;
|
|
223
|
+
const dashed = model.linkStyle[link] === 1 ? 1 : 0;
|
|
224
|
+
const arcLength = dashed && curvature !== 0 ? bezierLength(ax, ay, this.controlScratch.x, this.controlScratch.y, bx, by) : chord;
|
|
225
|
+
const offset = write * EDGE_FLOATS;
|
|
226
|
+
target[offset] = ax;
|
|
227
|
+
target[offset + 1] = ay;
|
|
228
|
+
target[offset + 2] = bx;
|
|
229
|
+
target[offset + 3] = by;
|
|
230
|
+
unpackRGBA(packed, target, offset + 4);
|
|
231
|
+
target[offset + 7] *= opacity;
|
|
232
|
+
target[offset + 8] = model.linkWidth[link] * (selected ? this.theme.selectedEdgeWidthMultiplier : 1);
|
|
233
|
+
target[offset + 9] = model.dashLength[link];
|
|
234
|
+
target[offset + 10] = model.dashGap[link];
|
|
235
|
+
target[offset + 11] = model.dashOffset[link];
|
|
236
|
+
target[offset + 12] = curvature;
|
|
237
|
+
target[offset + 13] = dashed;
|
|
238
|
+
target[offset + 14] = model.dashWorldScale[link];
|
|
239
|
+
target[offset + 15] = arcLength;
|
|
240
|
+
return write + 1;
|
|
241
|
+
}
|
|
242
|
+
/** Fills straight and curved edge buckets with their instance data. */
|
|
243
|
+
fillEdgeData(model, zoom) {
|
|
244
|
+
let visible = 0;
|
|
245
|
+
let curvedCount = 0;
|
|
246
|
+
for (let link = 0; link < model.linkCount; link++) {
|
|
247
|
+
if (model.linkFlags[link] & LINK_HIDDEN) {
|
|
248
|
+
continue;
|
|
249
|
+
}
|
|
250
|
+
visible++;
|
|
251
|
+
if (model.linkCurvature[link] !== 0) {
|
|
252
|
+
curvedCount++;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
const straightCount = visible - curvedCount;
|
|
256
|
+
let edgeData = this.ensure(this.edgeData, EDGE_FLOATS, straightCount);
|
|
257
|
+
let edgeCurveData = this.ensure(this.edgeCurveData, EDGE_FLOATS, curvedCount);
|
|
258
|
+
let straightWrite = 0;
|
|
259
|
+
let curvedWrite = 0;
|
|
260
|
+
for (let link = 0; link < model.linkCount; link++) {
|
|
261
|
+
if (model.linkFlags[link] & LINK_HIDDEN) {
|
|
262
|
+
continue;
|
|
263
|
+
}
|
|
264
|
+
if (model.linkCurvature[link] !== 0) {
|
|
265
|
+
curvedWrite = this.writeEdgeInstance(edgeCurveData, curvedWrite, model, link, zoom);
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
straightWrite = this.writeEdgeInstance(edgeData, straightWrite, model, link, zoom);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
this.edgeData = edgeData;
|
|
272
|
+
this.edgeCurveData = edgeCurveData;
|
|
273
|
+
this.edgeDrawCount = straightWrite;
|
|
274
|
+
this.edgeCurveDrawCount = curvedWrite;
|
|
275
|
+
}
|
|
276
|
+
/** Fills the instanced arrow buffer using curve tangent directions. */
|
|
277
|
+
fillArrowData(model, zoom) {
|
|
278
|
+
const globalEnabled = this.theme.edgeArrowEnabled;
|
|
279
|
+
let capacity = 0;
|
|
280
|
+
for (let link = 0; link < model.linkCount; link++) {
|
|
281
|
+
if (model.linkFlags[link] & LINK_HIDDEN) {
|
|
282
|
+
continue;
|
|
283
|
+
}
|
|
284
|
+
const mode = model.arrowMode[link];
|
|
285
|
+
if (mode === 1 || (mode === 0 && globalEnabled)) {
|
|
286
|
+
capacity++;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
let arrowData = this.ensure(this.arrowData, ARROW_FLOATS, capacity);
|
|
290
|
+
let write = 0;
|
|
291
|
+
for (let link = 0; link < model.linkCount; link++) {
|
|
292
|
+
if (model.linkFlags[link] & LINK_HIDDEN) {
|
|
293
|
+
continue;
|
|
294
|
+
}
|
|
295
|
+
const mode = model.arrowMode[link];
|
|
296
|
+
if (!(mode === 1 || (mode === 0 && globalEnabled))) {
|
|
297
|
+
continue;
|
|
298
|
+
}
|
|
299
|
+
const source = model.source[link];
|
|
300
|
+
const target = model.target[link];
|
|
301
|
+
const ax = model.x[source];
|
|
302
|
+
const ay = model.y[source];
|
|
303
|
+
const bx = model.x[target];
|
|
304
|
+
const by = model.y[target];
|
|
305
|
+
const curvature = model.linkCurvature[link];
|
|
306
|
+
controlPoint(ax, ay, bx, by, curvature, this.controlScratch);
|
|
307
|
+
let dx = bx - this.controlScratch.x;
|
|
308
|
+
let dy = by - this.controlScratch.y;
|
|
309
|
+
const length = Math.hypot(dx, dy);
|
|
310
|
+
const arrowSize = model.arrowSize[link] / zoom;
|
|
311
|
+
if (length < 0.0001 || arrowSize <= 0) {
|
|
312
|
+
continue;
|
|
313
|
+
}
|
|
314
|
+
dx /= length;
|
|
315
|
+
dy /= length;
|
|
316
|
+
const radius = model.visualRadius[target];
|
|
317
|
+
const tipOffset = radius + arrowSize * 0.15;
|
|
318
|
+
const tipX = bx - dx * tipOffset;
|
|
319
|
+
const tipY = by - dy * tipOffset;
|
|
320
|
+
const baseX = tipX - dx * arrowSize;
|
|
321
|
+
const baseY = tipY - dy * arrowSize;
|
|
322
|
+
const selected = (model.linkFlags[link] & LINK_SELECTED) !== 0;
|
|
323
|
+
const packed = selected ? this.theme.selectedEdgeColor : model.linkColor[link];
|
|
324
|
+
const opacity = selected ? this.theme.selectedEdgeOpacity : 1;
|
|
325
|
+
const offset = write * ARROW_FLOATS;
|
|
326
|
+
arrowData[offset] = baseX;
|
|
327
|
+
arrowData[offset + 1] = baseY;
|
|
328
|
+
arrowData[offset + 2] = tipX;
|
|
329
|
+
arrowData[offset + 3] = tipY;
|
|
330
|
+
unpackRGBA(packed, arrowData, offset + 4);
|
|
331
|
+
arrowData[offset + 7] *= opacity;
|
|
332
|
+
arrowData[offset + 8] = Math.max(0.5, (model.arrowWidth[link] / 2 / zoom));
|
|
333
|
+
write++;
|
|
334
|
+
}
|
|
335
|
+
this.arrowData = arrowData;
|
|
336
|
+
this.arrowDrawCount = write;
|
|
337
|
+
}
|
|
338
|
+
/** Fills the instanced node buffer with colors, states and image slots. */
|
|
339
|
+
fillNodeData(model, zoom) {
|
|
340
|
+
let nodeData = this.ensure(this.nodeData, NODE_FLOATS, model.nodeCount);
|
|
341
|
+
const theme = this.theme;
|
|
342
|
+
const maxRing = Math.max(theme.hoverRingWidth, theme.selectedRingWidth, theme.fixedRingWidth);
|
|
343
|
+
const ringFade = zoom < this.fadeZoom ? Math.max(0, zoom / Math.max(0.0001, this.fadeZoom)) : 1;
|
|
344
|
+
const ringExtent = maxRing / Math.max(zoom, 0.0001) + 2 / Math.max(zoom, 0.0001);
|
|
345
|
+
let write = 0;
|
|
346
|
+
for (let index = 0; index < model.nodeCount; index++) {
|
|
347
|
+
if (model.flags[index] & NODE_HIDDEN) {
|
|
348
|
+
continue;
|
|
349
|
+
}
|
|
350
|
+
const state = model.flags[index] & NODE_DISABLED
|
|
351
|
+
? 5
|
|
352
|
+
: model.flags[index] & NODE_DRAGGED
|
|
353
|
+
? 3
|
|
354
|
+
: model.flags[index] & NODE_SELECTED
|
|
355
|
+
? 2
|
|
356
|
+
: model.flags[index] & NODE_FIXED
|
|
357
|
+
? 4
|
|
358
|
+
: model.state[index];
|
|
359
|
+
const radius = model.visualRadius[index];
|
|
360
|
+
const extent = radius + ringExtent;
|
|
361
|
+
const offset = write * NODE_FLOATS;
|
|
362
|
+
nodeData[offset] = model.x[index];
|
|
363
|
+
nodeData[offset + 1] = model.y[index];
|
|
364
|
+
nodeData[offset + 2] = radius;
|
|
365
|
+
nodeData[offset + 3] = extent;
|
|
366
|
+
unpackRGBA(model.color[index], nodeData, offset + 4);
|
|
367
|
+
nodeData[offset + 7] *= model.nodeOpacity[index] * ((model.flags[index] & NODE_DIM) !== 0 ? 0.15 : 1);
|
|
368
|
+
unpackRGBA(model.borderColor[index], nodeData, offset + 8);
|
|
369
|
+
nodeData[offset + 11] *= theme.nodeBorderOpacity;
|
|
370
|
+
nodeData[offset + 12] = radius;
|
|
371
|
+
nodeData[offset + 13] = model.borderWidth[index];
|
|
372
|
+
nodeData[offset + 14] = state;
|
|
373
|
+
nodeData[offset + 15] = extent;
|
|
374
|
+
const url = model.nodeImage[index];
|
|
375
|
+
let slot = -1;
|
|
376
|
+
let ready = 0;
|
|
377
|
+
if (url && this.atlas) {
|
|
378
|
+
slot = this.atlas.request(url, model.nodeImageMode[index] === 1 ? 'contain' : 'cover');
|
|
379
|
+
ready = this.atlas.isReady(url) ? 1 : 0;
|
|
380
|
+
}
|
|
381
|
+
nodeData[offset + 16] = slot < 0 ? 0 : slot;
|
|
382
|
+
nodeData[offset + 17] = ready;
|
|
383
|
+
nodeData[offset + 18] = 0;
|
|
384
|
+
nodeData[offset + 19] = 0;
|
|
385
|
+
write++;
|
|
386
|
+
}
|
|
387
|
+
this.nodeData = nodeData;
|
|
388
|
+
this.nodeDrawCount = write;
|
|
389
|
+
}
|
|
390
|
+
/** Renders one complete frame of edges, arrows and nodes. */
|
|
391
|
+
render(model) {
|
|
392
|
+
const gl = this.gl;
|
|
393
|
+
const camera = this.camera;
|
|
394
|
+
if (!gl || !camera || !this.edgeProgram || !this.nodeProgram || !this.arrowProgram) {
|
|
395
|
+
return this;
|
|
396
|
+
}
|
|
397
|
+
const started = performance.now();
|
|
398
|
+
const zoom = camera.zoom;
|
|
399
|
+
if (this.atlas) {
|
|
400
|
+
this.atlas.update();
|
|
401
|
+
}
|
|
402
|
+
this.fillEdgeData(model, zoom);
|
|
403
|
+
this.fillArrowData(model, zoom);
|
|
404
|
+
this.fillNodeData(model, zoom);
|
|
405
|
+
gl.clearColor(this.clearColor[0], this.clearColor[1], this.clearColor[2], this.clearColor[3]);
|
|
406
|
+
gl.clear(gl.COLOR_BUFFER_BIT);
|
|
407
|
+
gl.useProgram(this.edgeProgram);
|
|
408
|
+
gl.uniformMatrix3fv(gl.getUniformLocation(this.edgeProgram, 'uCamera'), false, camera.matrix);
|
|
409
|
+
gl.uniform1f(gl.getUniformLocation(this.edgeProgram, 'uZoom'), zoom);
|
|
410
|
+
if (this.edgeDrawCount > 0) {
|
|
411
|
+
gl.bindVertexArray(this.edgeVAO);
|
|
412
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, this.edgeBuffer);
|
|
413
|
+
gl.bufferData(gl.ARRAY_BUFFER, this.edgeData.subarray(0, this.edgeDrawCount * EDGE_FLOATS), gl.DYNAMIC_DRAW);
|
|
414
|
+
gl.drawArraysInstanced(gl.TRIANGLE_FAN, 0, 4, this.edgeDrawCount);
|
|
415
|
+
}
|
|
416
|
+
if (this.edgeCurveDrawCount > 0) {
|
|
417
|
+
gl.bindVertexArray(this.edgeCurveVAO);
|
|
418
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, this.edgeCurveBuffer);
|
|
419
|
+
gl.bufferData(gl.ARRAY_BUFFER, this.edgeCurveData.subarray(0, this.edgeCurveDrawCount * EDGE_FLOATS), gl.DYNAMIC_DRAW);
|
|
420
|
+
gl.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, (CURVE_SEGMENTS + 1) * 2, this.edgeCurveDrawCount);
|
|
421
|
+
}
|
|
422
|
+
if (this.arrowDrawCount > 0) {
|
|
423
|
+
gl.useProgram(this.arrowProgram);
|
|
424
|
+
gl.uniformMatrix3fv(gl.getUniformLocation(this.arrowProgram, 'uCamera'), false, camera.matrix);
|
|
425
|
+
gl.bindVertexArray(this.arrowVAO);
|
|
426
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, this.arrowBuffer);
|
|
427
|
+
gl.bufferData(gl.ARRAY_BUFFER, this.arrowData.subarray(0, this.arrowDrawCount * ARROW_FLOATS), gl.DYNAMIC_DRAW);
|
|
428
|
+
gl.drawArraysInstanced(gl.TRIANGLE_FAN, 0, 4, this.arrowDrawCount);
|
|
429
|
+
}
|
|
430
|
+
gl.useProgram(this.nodeProgram);
|
|
431
|
+
const theme = this.theme;
|
|
432
|
+
const ringFade = zoom < this.fadeZoom ? Math.max(0, zoom / Math.max(0.0001, this.fadeZoom)) : 1;
|
|
433
|
+
gl.uniformMatrix3fv(gl.getUniformLocation(this.nodeProgram, 'uCamera'), false, camera.matrix);
|
|
434
|
+
gl.uniform1f(gl.getUniformLocation(this.nodeProgram, 'uZoom'), zoom);
|
|
435
|
+
gl.uniform4fv(gl.getUniformLocation(this.nodeProgram, 'uHoverRing'), unpackedColor(theme.hoverRingColor));
|
|
436
|
+
gl.uniform4fv(gl.getUniformLocation(this.nodeProgram, 'uSelectedRing'), unpackedColor(theme.selectedRingColor));
|
|
437
|
+
gl.uniform4fv(gl.getUniformLocation(this.nodeProgram, 'uFixedRing'), unpackedColor(theme.fixedRingColor));
|
|
438
|
+
gl.uniform1f(gl.getUniformLocation(this.nodeProgram, 'uHoverRingWidth'), theme.hoverRingWidth * ringFade);
|
|
439
|
+
gl.uniform1f(gl.getUniformLocation(this.nodeProgram, 'uSelectedRingWidth'), theme.selectedRingWidth * ringFade);
|
|
440
|
+
gl.uniform1f(gl.getUniformLocation(this.nodeProgram, 'uFixedRingWidth'), theme.fixedRingWidth * ringFade);
|
|
441
|
+
gl.uniform1f(gl.getUniformLocation(this.nodeProgram, 'uDisabledOpacity'), theme.disabledOpacity);
|
|
442
|
+
if (this.atlas) {
|
|
443
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
444
|
+
gl.bindTexture(gl.TEXTURE_2D, this.atlas.getTexture());
|
|
445
|
+
gl.uniform1i(gl.getUniformLocation(this.nodeProgram, 'uAtlas'), 0);
|
|
446
|
+
}
|
|
447
|
+
gl.bindVertexArray(this.nodeVAO);
|
|
448
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, this.nodeBuffer);
|
|
449
|
+
gl.bufferData(gl.ARRAY_BUFFER, this.nodeData.subarray(0, this.nodeDrawCount * NODE_FLOATS), gl.DYNAMIC_DRAW);
|
|
450
|
+
gl.drawArraysInstanced(gl.TRIANGLE_FAN, 0, 4, this.nodeDrawCount);
|
|
451
|
+
gl.bindVertexArray(null);
|
|
452
|
+
if (this.atlas) {
|
|
453
|
+
this.atlas.sweep();
|
|
454
|
+
}
|
|
455
|
+
this.lastRenderMs = performance.now() - started;
|
|
456
|
+
return this;
|
|
457
|
+
}
|
|
458
|
+
/** Releases every GL resource owned by the renderer. */
|
|
459
|
+
destroy() {
|
|
460
|
+
const gl = this.gl;
|
|
461
|
+
if (!gl) {
|
|
462
|
+
return;
|
|
463
|
+
}
|
|
464
|
+
if (this.nodeProgram) {
|
|
465
|
+
gl.deleteProgram(this.nodeProgram);
|
|
466
|
+
}
|
|
467
|
+
if (this.edgeProgram) {
|
|
468
|
+
gl.deleteProgram(this.edgeProgram);
|
|
469
|
+
}
|
|
470
|
+
if (this.arrowProgram) {
|
|
471
|
+
gl.deleteProgram(this.arrowProgram);
|
|
472
|
+
}
|
|
473
|
+
if (this.nodeBuffer) {
|
|
474
|
+
gl.deleteBuffer(this.nodeBuffer);
|
|
475
|
+
}
|
|
476
|
+
if (this.edgeBuffer) {
|
|
477
|
+
gl.deleteBuffer(this.edgeBuffer);
|
|
478
|
+
}
|
|
479
|
+
if (this.arrowBuffer) {
|
|
480
|
+
gl.deleteBuffer(this.arrowBuffer);
|
|
481
|
+
}
|
|
482
|
+
if (this.cornerBuffer) {
|
|
483
|
+
gl.deleteBuffer(this.cornerBuffer);
|
|
484
|
+
}
|
|
485
|
+
if (this.nodeVAO) {
|
|
486
|
+
gl.deleteVertexArray(this.nodeVAO);
|
|
487
|
+
}
|
|
488
|
+
if (this.edgeVAO) {
|
|
489
|
+
gl.deleteVertexArray(this.edgeVAO);
|
|
490
|
+
}
|
|
491
|
+
if (this.edgeCurveVAO) {
|
|
492
|
+
gl.deleteVertexArray(this.edgeCurveVAO);
|
|
493
|
+
}
|
|
494
|
+
if (this.edgeCurveBuffer) {
|
|
495
|
+
gl.deleteBuffer(this.edgeCurveBuffer);
|
|
496
|
+
}
|
|
497
|
+
if (this.curveCornerBuffer) {
|
|
498
|
+
gl.deleteBuffer(this.curveCornerBuffer);
|
|
499
|
+
}
|
|
500
|
+
if (this.arrowVAO) {
|
|
501
|
+
gl.deleteVertexArray(this.arrowVAO);
|
|
502
|
+
}
|
|
503
|
+
this.gl = null;
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
/** Converts a packed color into a 4 component float tuple. */
|
|
507
|
+
function unpackedColor(packed) {
|
|
508
|
+
const out = new Float32Array(4);
|
|
509
|
+
unpackRGBA(packed, out, 0);
|
|
510
|
+
return out;
|
|
511
|
+
}
|
|
512
|
+
//# sourceMappingURL=Renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Renderer.js","sourceRoot":"","sources":["../../src/render/Renderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Manages a GPU texture atlas that packs node images into a fixed grid.
|
|
3
|
+
* Images load asynchronously, are drawn into an offscreen canvas using cover
|
|
4
|
+
* or contain framing, and are uploaded in a single texture update per frame.
|
|
5
|
+
*/
|
|
6
|
+
export interface AtlasEntry {
|
|
7
|
+
slot: number;
|
|
8
|
+
ready: boolean;
|
|
9
|
+
failed: boolean;
|
|
10
|
+
used: boolean;
|
|
11
|
+
mode: 'cover' | 'contain';
|
|
12
|
+
image: HTMLImageElement | null;
|
|
13
|
+
}
|
|
14
|
+
export interface AtlasEvent {
|
|
15
|
+
type: 'imageload' | 'imageerror';
|
|
16
|
+
url: string;
|
|
17
|
+
slot: number;
|
|
18
|
+
}
|
|
19
|
+
export declare class TextureAtlas {
|
|
20
|
+
readonly size: number;
|
|
21
|
+
readonly grid: number;
|
|
22
|
+
readonly cellSize: number;
|
|
23
|
+
readonly maxSlots: number;
|
|
24
|
+
revision: number;
|
|
25
|
+
loadedCount: number;
|
|
26
|
+
private gl;
|
|
27
|
+
private texture;
|
|
28
|
+
private canvas;
|
|
29
|
+
private context;
|
|
30
|
+
private entries;
|
|
31
|
+
private pending;
|
|
32
|
+
private nextSlot;
|
|
33
|
+
onEvent: ((event: AtlasEvent) => void) | null;
|
|
34
|
+
constructor(gl: WebGL2RenderingContext, size?: number, grid?: number);
|
|
35
|
+
/** Returns the GPU texture handle for binding during node rendering. */
|
|
36
|
+
getTexture(): WebGLTexture;
|
|
37
|
+
/** Returns the slot for a URL, requesting the image if it is new. */
|
|
38
|
+
request(url: string, mode?: 'cover' | 'contain'): number;
|
|
39
|
+
/** Paints one entry into its atlas cell respecting the framing mode. */
|
|
40
|
+
private drawEntry;
|
|
41
|
+
/** Uploads the atlas canvas to the GPU when new images arrived. */
|
|
42
|
+
update(): boolean;
|
|
43
|
+
/** Marks all entries unused and drops the ones ignored for a full frame. */
|
|
44
|
+
sweep(): void;
|
|
45
|
+
/** Resolves once every pending image finished loading or failed. */
|
|
46
|
+
loadAll(): Promise<void>;
|
|
47
|
+
/** Reports whether a URL finished loading successfully. */
|
|
48
|
+
isReady(url: string): boolean;
|
|
49
|
+
private uploadedRevision;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=TextureAtlas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TextureAtlas.d.ts","sourceRoot":"","sources":["../../src/render/TextureAtlas.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1B,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,WAAW,GAAG,YAAY,CAAC;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,YAAY;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,SAAK;IACb,WAAW,SAAK;IAEhB,OAAO,CAAC,EAAE,CAAyB;IACnC,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,MAAM,CAA6C;IAC3D,OAAO,CAAC,OAAO,CAAsE;IACrF,OAAO,CAAC,OAAO,CAAiC;IAChD,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC,GAAG,IAAI,CAAQ;gBAEzC,EAAE,EAAE,sBAAsB,EAAE,IAAI,SAAO,EAAE,IAAI,SAAI;IAyB7D,wEAAwE;IACxE,UAAU,IAAI,YAAY;IAI1B,qEAAqE;IACrE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,OAAO,GAAG,SAAmB,GAAG,MAAM;IA8CjE,wEAAwE;IACxE,OAAO,CAAC,SAAS;IAmBjB,mEAAmE;IACnE,MAAM,IAAI,OAAO;IAcjB,4EAA4E;IAC5E,KAAK,IAAI,IAAI;IAUb,oEAAoE;IACpE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAsBxB,2DAA2D;IAC3D,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAI7B,OAAO,CAAC,gBAAgB,CAAM;CAC/B"}
|