@yurialvesbordin/graphium 0.0.0-stage → 2.0.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 +37 -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,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Owns the on demand render loop: rAF scheduling, revision based dirty
|
|
3
|
+
* checking, auto fit bookkeeping and the frame timing statistics.
|
|
4
|
+
*/
|
|
5
|
+
import type { GraphModel } from '../core/GraphModel.js';
|
|
6
|
+
import type { PhysicsEngine } from '../physics/PhysicsEngine.js';
|
|
7
|
+
import type { Camera } from './Camera.js';
|
|
8
|
+
import type { LabelLayer } from './LabelLayer.js';
|
|
9
|
+
import type { Renderer } from './Renderer.js';
|
|
10
|
+
import type { TextureAtlas } from './TextureAtlas.js';
|
|
11
|
+
/** Collaborators and hooks the loop needs from the main facade. */
|
|
12
|
+
export interface RenderLoopDeps {
|
|
13
|
+
model: GraphModel;
|
|
14
|
+
physics: PhysicsEngine;
|
|
15
|
+
camera: Camera;
|
|
16
|
+
renderer: Renderer;
|
|
17
|
+
labels: LabelLayer;
|
|
18
|
+
atlas: TextureAtlas;
|
|
19
|
+
/** Whether the simulation should step on every frame. */
|
|
20
|
+
isRunning(): boolean;
|
|
21
|
+
/** Whether the owning instance was destroyed. */
|
|
22
|
+
isDestroyed(): boolean;
|
|
23
|
+
/** Whether the view should fit itself when data first appears. */
|
|
24
|
+
autoFit: boolean;
|
|
25
|
+
/** Fits the view to the graph; used by the auto fit path. */
|
|
26
|
+
fitView(): void;
|
|
27
|
+
}
|
|
28
|
+
export declare class RenderLoop {
|
|
29
|
+
private readonly deps;
|
|
30
|
+
private rafActive;
|
|
31
|
+
private rafHandle;
|
|
32
|
+
private timeoutHandle;
|
|
33
|
+
private lastTime;
|
|
34
|
+
private didAutoFit;
|
|
35
|
+
private lastCameraRevision;
|
|
36
|
+
private lastTopologyRevision;
|
|
37
|
+
private lastAppearanceRevision;
|
|
38
|
+
private lastPositionRevision;
|
|
39
|
+
private lastAtlasRevision;
|
|
40
|
+
private forceDirty;
|
|
41
|
+
/** Exponential moving averages surfaced by the stats snapshot. */
|
|
42
|
+
fps: number;
|
|
43
|
+
frameMs: number;
|
|
44
|
+
physicsMs: number;
|
|
45
|
+
constructor(deps: RenderLoopDeps);
|
|
46
|
+
/** Advances physics and renders once, returning the kinetic energy. */
|
|
47
|
+
step(dt?: number): number;
|
|
48
|
+
/** Performs one render pass immediately without stepping the simulation. */
|
|
49
|
+
renderNow(): void;
|
|
50
|
+
/** Requests a render on the next scheduled frame. */
|
|
51
|
+
requestRender(): void;
|
|
52
|
+
/** Marks the view dirty and guarantees a scheduled frame. */
|
|
53
|
+
invalidate(): void;
|
|
54
|
+
/** Schedules a loop iteration when none is pending. */
|
|
55
|
+
schedule(): void;
|
|
56
|
+
/** Allows the next data arrival to trigger the auto fit again. */
|
|
57
|
+
resetAutoFit(): void;
|
|
58
|
+
/** Cancels any pending frame; called during teardown. */
|
|
59
|
+
cancel(): void;
|
|
60
|
+
/** Performs one render pass and label update with revision bookkeeping. */
|
|
61
|
+
private renderFrame;
|
|
62
|
+
/** Schedules a loop iteration when none is pending. */
|
|
63
|
+
private scheduleFrame;
|
|
64
|
+
/** Runs one loop iteration, stepping physics and rendering when dirty. */
|
|
65
|
+
private frame;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=RenderLoop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RenderLoop.d.ts","sourceRoot":"","sources":["../../src/render/RenderLoop.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,mEAAmE;AACnE,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,UAAU,CAAC;IAClB,OAAO,EAAE,aAAa,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,YAAY,CAAC;IACpB,yDAAyD;IACzD,SAAS,IAAI,OAAO,CAAC;IACrB,iDAAiD;IACjD,WAAW,IAAI,OAAO,CAAC;IACvB,kEAAkE;IAClE,OAAO,EAAE,OAAO,CAAC;IACjB,6DAA6D;IAC7D,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiB;IACtC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,aAAa,CAA8C;IACnE,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,kBAAkB,CAAM;IAChC,OAAO,CAAC,oBAAoB,CAAM;IAClC,OAAO,CAAC,sBAAsB,CAAM;IACpC,OAAO,CAAC,oBAAoB,CAAM;IAClC,OAAO,CAAC,iBAAiB,CAAM;IAC/B,OAAO,CAAC,UAAU,CAAS;IAC3B,kEAAkE;IAClE,GAAG,SAAM;IACT,OAAO,SAAM;IACb,SAAS,SAAK;gBAEF,IAAI,EAAE,cAAc;IAIhC,uEAAuE;IACvE,IAAI,CAAC,EAAE,SAAS,GAAG,MAAM;IAMzB,4EAA4E;IAC5E,SAAS,IAAI,IAAI;IAIjB,qDAAqD;IACrD,aAAa,IAAI,IAAI;IAKrB,6DAA6D;IAC7D,UAAU,IAAI,IAAI;IAIlB,uDAAuD;IACvD,QAAQ,IAAI,IAAI;IAIhB,kEAAkE;IAClE,YAAY,IAAI,IAAI;IAIpB,yDAAyD;IACzD,MAAM,IAAI,IAAI;IAWd,2EAA2E;IAC3E,OAAO,CAAC,WAAW;IAiBnB,uDAAuD;IACvD,OAAO,CAAC,aAAa;IAYrB,0EAA0E;IAC1E,OAAO,CAAC,KAAK,CA+BX;CACH"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Owns the on demand render loop: rAF scheduling, revision based dirty
|
|
3
|
+
* checking, auto fit bookkeeping and the frame timing statistics.
|
|
4
|
+
*/
|
|
5
|
+
export class RenderLoop {
|
|
6
|
+
constructor(deps) {
|
|
7
|
+
this.rafActive = false;
|
|
8
|
+
this.rafHandle = 0;
|
|
9
|
+
this.timeoutHandle = null;
|
|
10
|
+
this.lastTime = 0;
|
|
11
|
+
this.didAutoFit = false;
|
|
12
|
+
this.lastCameraRevision = -1;
|
|
13
|
+
this.lastTopologyRevision = -1;
|
|
14
|
+
this.lastAppearanceRevision = -1;
|
|
15
|
+
this.lastPositionRevision = -1;
|
|
16
|
+
this.lastAtlasRevision = -1;
|
|
17
|
+
this.forceDirty = false;
|
|
18
|
+
/** Exponential moving averages surfaced by the stats snapshot. */
|
|
19
|
+
this.fps = 60;
|
|
20
|
+
this.frameMs = 16;
|
|
21
|
+
this.physicsMs = 0;
|
|
22
|
+
/** Runs one loop iteration, stepping physics and rendering when dirty. */
|
|
23
|
+
this.frame = (time) => {
|
|
24
|
+
this.rafActive = false;
|
|
25
|
+
if (this.deps.isDestroyed()) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const dt = this.lastTime > 0 ? Math.min(0.05, (time - this.lastTime) / 1000) : 1 / 60;
|
|
29
|
+
this.lastTime = time;
|
|
30
|
+
const started = performance.now();
|
|
31
|
+
if (this.deps.isRunning()) {
|
|
32
|
+
this.deps.physics.step(dt);
|
|
33
|
+
}
|
|
34
|
+
this.physicsMs = performance.now() - started;
|
|
35
|
+
const dirty = this.forceDirty ||
|
|
36
|
+
this.deps.camera.revision !== this.lastCameraRevision ||
|
|
37
|
+
this.deps.model.topologyRevision !== this.lastTopologyRevision ||
|
|
38
|
+
this.deps.model.appearanceRevision !== this.lastAppearanceRevision ||
|
|
39
|
+
this.deps.model.positionRevision !== this.lastPositionRevision ||
|
|
40
|
+
this.deps.atlas.revision !== this.lastAtlasRevision;
|
|
41
|
+
this.forceDirty = false;
|
|
42
|
+
if (dirty) {
|
|
43
|
+
this.renderFrame();
|
|
44
|
+
}
|
|
45
|
+
const frameDuration = performance.now() - started;
|
|
46
|
+
this.frameMs = this.frameMs * 0.9 + frameDuration * 0.1;
|
|
47
|
+
this.fps = this.fps * 0.9 + (1 / Math.max(0.001, dt)) * 0.1;
|
|
48
|
+
if (this.deps.isRunning() && !this.deps.physics.sleeping) {
|
|
49
|
+
this.scheduleFrame();
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
this.lastTime = 0;
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
this.deps = deps;
|
|
56
|
+
}
|
|
57
|
+
/** Advances physics and renders once, returning the kinetic energy. */
|
|
58
|
+
step(dt = 1 / 60) {
|
|
59
|
+
const energy = this.deps.physics.step(dt);
|
|
60
|
+
this.renderFrame();
|
|
61
|
+
return energy;
|
|
62
|
+
}
|
|
63
|
+
/** Performs one render pass immediately without stepping the simulation. */
|
|
64
|
+
renderNow() {
|
|
65
|
+
this.renderFrame();
|
|
66
|
+
}
|
|
67
|
+
/** Requests a render on the next scheduled frame. */
|
|
68
|
+
requestRender() {
|
|
69
|
+
this.forceDirty = true;
|
|
70
|
+
this.invalidate();
|
|
71
|
+
}
|
|
72
|
+
/** Marks the view dirty and guarantees a scheduled frame. */
|
|
73
|
+
invalidate() {
|
|
74
|
+
this.scheduleFrame();
|
|
75
|
+
}
|
|
76
|
+
/** Schedules a loop iteration when none is pending. */
|
|
77
|
+
schedule() {
|
|
78
|
+
this.scheduleFrame();
|
|
79
|
+
}
|
|
80
|
+
/** Allows the next data arrival to trigger the auto fit again. */
|
|
81
|
+
resetAutoFit() {
|
|
82
|
+
this.didAutoFit = false;
|
|
83
|
+
}
|
|
84
|
+
/** Cancels any pending frame; called during teardown. */
|
|
85
|
+
cancel() {
|
|
86
|
+
if (this.rafHandle && typeof cancelAnimationFrame === 'function') {
|
|
87
|
+
cancelAnimationFrame(this.rafHandle);
|
|
88
|
+
this.rafHandle = 0;
|
|
89
|
+
}
|
|
90
|
+
if (this.timeoutHandle !== null) {
|
|
91
|
+
clearTimeout(this.timeoutHandle);
|
|
92
|
+
this.timeoutHandle = null;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/** Performs one render pass and label update with revision bookkeeping. */
|
|
96
|
+
renderFrame() {
|
|
97
|
+
if (this.deps.isDestroyed()) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
if (this.deps.autoFit && !this.didAutoFit && this.deps.model.nodeCount > 0) {
|
|
101
|
+
this.didAutoFit = true;
|
|
102
|
+
this.deps.fitView();
|
|
103
|
+
}
|
|
104
|
+
this.deps.renderer.render(this.deps.model);
|
|
105
|
+
this.deps.labels.update();
|
|
106
|
+
this.lastCameraRevision = this.deps.camera.revision;
|
|
107
|
+
this.lastTopologyRevision = this.deps.model.topologyRevision;
|
|
108
|
+
this.lastAppearanceRevision = this.deps.model.appearanceRevision;
|
|
109
|
+
this.lastPositionRevision = this.deps.model.positionRevision;
|
|
110
|
+
this.lastAtlasRevision = this.deps.atlas.revision;
|
|
111
|
+
}
|
|
112
|
+
/** Schedules a loop iteration when none is pending. */
|
|
113
|
+
scheduleFrame() {
|
|
114
|
+
if (this.rafActive || this.deps.isDestroyed()) {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
this.rafActive = true;
|
|
118
|
+
if (typeof requestAnimationFrame === 'function') {
|
|
119
|
+
this.rafHandle = requestAnimationFrame(this.frame);
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
this.timeoutHandle = setTimeout(() => this.frame(performance.now()), 16);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=RenderLoop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RenderLoop.js","sourceRoot":"","sources":["../../src/render/RenderLoop.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
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 { GraphModel } from '../core/GraphModel.js';
|
|
7
|
+
import type { ThemeResolved } from '../core/types.js';
|
|
8
|
+
import { Camera } from './Camera.js';
|
|
9
|
+
import { TextureAtlas } from './TextureAtlas.js';
|
|
10
|
+
export interface RendererOptions {
|
|
11
|
+
antialias?: boolean;
|
|
12
|
+
maxPixelRatio?: number;
|
|
13
|
+
fadeZoom?: number;
|
|
14
|
+
}
|
|
15
|
+
export declare class Renderer {
|
|
16
|
+
readonly canvas: HTMLCanvasElement;
|
|
17
|
+
gl: WebGL2RenderingContext | null;
|
|
18
|
+
theme: ThemeResolved;
|
|
19
|
+
atlas: TextureAtlas | null;
|
|
20
|
+
lastRenderMs: number;
|
|
21
|
+
fadeZoom: number;
|
|
22
|
+
maxPixelRatio: number;
|
|
23
|
+
private camera;
|
|
24
|
+
private nodeProgram;
|
|
25
|
+
private edgeProgram;
|
|
26
|
+
private arrowProgram;
|
|
27
|
+
private cornerBuffer;
|
|
28
|
+
private curveCornerBuffer;
|
|
29
|
+
private nodeVAO;
|
|
30
|
+
private nodeBuffer;
|
|
31
|
+
private edgeVAO;
|
|
32
|
+
private edgeBuffer;
|
|
33
|
+
private edgeCurveVAO;
|
|
34
|
+
private edgeCurveBuffer;
|
|
35
|
+
private arrowVAO;
|
|
36
|
+
private arrowBuffer;
|
|
37
|
+
private nodeData;
|
|
38
|
+
private edgeData;
|
|
39
|
+
private edgeCurveData;
|
|
40
|
+
private arrowData;
|
|
41
|
+
private nodeDrawCount;
|
|
42
|
+
private edgeDrawCount;
|
|
43
|
+
private edgeCurveDrawCount;
|
|
44
|
+
private arrowDrawCount;
|
|
45
|
+
private clearColor;
|
|
46
|
+
private controlScratch;
|
|
47
|
+
constructor(canvas: HTMLCanvasElement, theme: ThemeResolved, options?: RendererOptions);
|
|
48
|
+
/** Creates shader programs, vertex arrays and static corner buffers. */
|
|
49
|
+
private initGL;
|
|
50
|
+
/** Registers the camera used for matrices during rendering. */
|
|
51
|
+
setCamera(camera: Camera): void;
|
|
52
|
+
/** Attaches the texture atlas used for node image fills. */
|
|
53
|
+
setAtlas(atlas: TextureAtlas): void;
|
|
54
|
+
/** Applies a resolved theme and refreshes the clear color. */
|
|
55
|
+
setTheme(theme: ThemeResolved): void;
|
|
56
|
+
/** Resizes the drawing buffer with a capped device pixel ratio. */
|
|
57
|
+
resize(width: number, height: number, pixelRatio: number): this;
|
|
58
|
+
/** Grows an instance buffer when the graph requires more instances. */
|
|
59
|
+
private ensure;
|
|
60
|
+
/** Writes one edge instance into the target bucket buffer. */
|
|
61
|
+
private writeEdgeInstance;
|
|
62
|
+
/** Fills straight and curved edge buckets with their instance data. */
|
|
63
|
+
private fillEdgeData;
|
|
64
|
+
/** Fills the instanced arrow buffer using curve tangent directions. */
|
|
65
|
+
private fillArrowData;
|
|
66
|
+
/** Fills the instanced node buffer with colors, states and image slots. */
|
|
67
|
+
private fillNodeData;
|
|
68
|
+
/** Renders one complete frame of edges, arrows and nodes. */
|
|
69
|
+
render(model: GraphModel): this;
|
|
70
|
+
/** Releases every GL resource owned by the renderer. */
|
|
71
|
+
destroy(): void;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=Renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Renderer.d.ts","sourceRoot":"","sources":["../../src/render/Renderer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAuH,MAAM,uBAAuB,CAAC;AAExK,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAOjD,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAqCD,qBAAa,QAAQ;IACnB,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,EAAE,EAAE,sBAAsB,GAAG,IAAI,CAAC;IAClC,KAAK,EAAE,aAAa,CAAC;IACrB,KAAK,EAAE,YAAY,GAAG,IAAI,CAAQ;IAClC,YAAY,SAAK;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IAEtB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,iBAAiB,CAA4B;IACrD,OAAO,CAAC,OAAO,CAAuC;IACtD,OAAO,CAAC,UAAU,CAA4B;IAC9C,OAAO,CAAC,OAAO,CAAuC;IACtD,OAAO,CAAC,UAAU,CAA4B;IAC9C,OAAO,CAAC,YAAY,CAAuC;IAC3D,OAAO,CAAC,eAAe,CAA4B;IACnD,OAAO,CAAC,QAAQ,CAAuC;IACvD,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,QAAQ,CAAuC;IACvD,OAAO,CAAC,QAAQ,CAAuC;IACvD,OAAO,CAAC,aAAa,CAAuC;IAC5D,OAAO,CAAC,SAAS,CAAwC;IACzD,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,kBAAkB,CAAK;IAC/B,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,UAAU,CAA8D;IAChF,OAAO,CAAC,cAAc,CAAkB;gBAE5B,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,GAAE,eAAoB;IAY1F,wEAAwE;IACxE,OAAO,CAAC,MAAM;IAgFd,+DAA+D;IAC/D,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI/B,4DAA4D;IAC5D,QAAQ,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI;IAInC,8DAA8D;IAC9D,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IAMpC,mEAAmE;IACnE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAa/D,uEAAuE;IACvE,OAAO,CAAC,MAAM;IAWd,8DAA8D;IAC9D,OAAO,CAAC,iBAAiB;IAuCzB,uEAAuE;IACvE,OAAO,CAAC,YAAY;IAiCpB,uEAAuE;IACvE,OAAO,CAAC,aAAa;IA8DrB,2EAA2E;IAC3E,OAAO,CAAC,YAAY;IAoDpB,6DAA6D;IAC7D,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAoE/B,wDAAwD;IACxD,OAAO,IAAI,IAAI;CA8ChB"}
|