Skip to content

Commit b3d73ee

Browse files
author
Manfred Cheung
committed
feat: add option to change behaviour of point classes
1 parent 89e2f95 commit b3d73ee

File tree

5 files changed

+60
-15
lines changed

5 files changed

+60
-15
lines changed

src/data/GraphPoints.ts

Lines changed: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,21 @@
11
import PicoGL, {App, Framebuffer, Texture} from 'picogl';
22
import pointsVS from './shaders/GraphPoints.vs.glsl';
33
import pointsFS from './shaders/GraphPoints.fs.glsl';
4-
import {GLDataTypes} from '../renderer/Renderable';
4+
import {GLDataTypes, setDrawCallUniforms} from '../renderer/Renderable';
55
import {DataMappings, concatenateData, packData} from './DataTools';
66
import {vec2, vec3} from 'gl-matrix';
77
import {DataTexture} from '../renderer/DataTexture';
88

9+
export enum ClassModes {
10+
NONE,
11+
ADD,
12+
}
13+
14+
export interface PointOptions {
15+
positionClassMode?: ClassModes
16+
radiusClassMode?: ClassModes
17+
}
18+
919
export interface PointData {
1020
id?: number | string;
1121
class?: number | string;
@@ -58,13 +68,31 @@ export class GraphPoints extends DataTexture {
5868
private _pointView: DataView;
5969
private _pointTexture: Texture;
6070

71+
private _localUniforms = {
72+
uPositionClassMode: ClassModes.ADD,
73+
uRadiusClassMode: ClassModes.NONE,
74+
};
6175
private _dataArrayBuffer: Float32Array;
6276

6377
private _length: number = 0;
6478
public get length(): number {
6579
return this._length;
6680
}
6781

82+
public get positionClassMode(): ClassModes {
83+
return this._localUniforms.uPositionClassMode;
84+
}
85+
public set positionClassMode(value: ClassModes) {
86+
this._localUniforms.uPositionClassMode = value;
87+
}
88+
89+
public get radiusClassMode(): ClassModes {
90+
return this._localUniforms.uRadiusClassMode;
91+
}
92+
public set radiusClassMode(value: ClassModes) {
93+
this._localUniforms.uRadiusClassMode = value;
94+
}
95+
6896
private map: Map<number | string, number>;
6997
protected dirty: boolean = false;
7098

@@ -73,10 +101,12 @@ export class GraphPoints extends DataTexture {
73101
public bbDiagonal: number;
74102

75103
constructor(context: App, data: PointData[]);
76-
constructor(context: App, data: unknown[], mappings: Partial<PointDataMappings>);
77-
constructor(context: App, data: unknown[], mappings: Partial<PointDataMappings> = {}) {
104+
constructor(context: App, data: unknown[], mappings: Partial<PointDataMappings>, options: PointOptions);
105+
constructor(context: App, data: unknown[], mappings: Partial<PointDataMappings> = {}, options: PointOptions = {}) {
78106
super(context, data.length);
79107

108+
this._localUniforms = Object.assign({}, this._localUniforms, options);
109+
80110
this.map = new Map();
81111
this.bb = {
82112
min: vec3.fromValues(Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER, Number. MAX_SAFE_INTEGER),
@@ -288,11 +318,13 @@ export class GraphPoints extends DataTexture {
288318
.depthMask(false);
289319

290320
// create and initiate draw call
291-
context.createDrawCall(program, pointsVAO)
292-
.primitive(PicoGL.TRIANGLE_STRIP)
293-
.texture('uPointTexture', this._pointTexture)
294-
.texture('uClassTexture', this._classTexture)
295-
.draw();
321+
const drawCall = context.createDrawCall(program, pointsVAO)
322+
.primitive(PicoGL.TRIANGLE_STRIP);
323+
setDrawCallUniforms(drawCall, Object.assign({}, this._localUniforms, {
324+
uPointTexture: this._pointTexture,
325+
uClassTexture: this._classTexture,
326+
}));
327+
drawCall.draw();
296328

297329
// read points texture into stored buffer for point coordinates readback
298330
this.readTextureAsync(this._frameBuffer.colorAttachments[0]).then(texArrayBuffer => {

src/data/shaders/GraphPoints.fs.glsl

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,11 @@ out vec4 fragColor;
99
uniform sampler2D uPointTexture;
1010
uniform isampler2D uClassTexture;
1111

12+
uniform uint uPositionClassMode;
13+
uniform uint uRadiusClassMode;
14+
1215
#pragma glslify: import(../../renderer/shaders/valueForIndex.glsl)
16+
#pragma glslify: import(./classMode.glsl)
1317

1418
void main() {
1519
vec2 texSize = vec2(textureSize(uPointTexture, 0).xy);
@@ -19,7 +23,13 @@ void main() {
1923
int i = 0;
2024
int classIndex = texelFetch(uClassTexture, coords, 0).x;
2125
while(classIndex != -1 && i++ < 500) {
22-
fragColor += valueForIndex(uPointTexture, classIndex);
26+
vec4 point = valueForIndex(uPointTexture, classIndex);
27+
if(uPositionClassMode == MODE_ADD) {
28+
fragColor.xyz += point.xyz;
29+
}
30+
if(uRadiusClassMode == MODE_ADD) {
31+
fragColor.w += point.w;
32+
}
2333
classIndex = ivalueForIndex(uClassTexture, classIndex).x;
2434
}
2535
}

src/data/shaders/classMode.glsl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
#define MODE_NONE 0u
2+
#define MODE_ADD 1u

src/grafer/GraferController.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {Viewport, ViewportOptions} from '../renderer/Viewport';
2-
import {PointDataMappings} from '../data/GraphPoints';
2+
import {PointOptions, PointDataMappings} from '../data/GraphPoints';
33
import {nodes as GraphNodes, edges as GraphEdges, labels as GraphLabels, Graph} from '../graph/mod';
44
import {Layer} from '../graph/Layer';
55
import {DragTruck} from '../UX/mouse/drag/DragTruck';
@@ -31,6 +31,7 @@ export type GraferLabelsType = keyof typeof GraphLabels.types;
3131
export interface GraferDataInput<T> {
3232
data: unknown[],
3333
mappings?: Partial<T>,
34+
options?: PointOptions,
3435
}
3536

3637
export type GraferPointsData = GraferDataInput<PointDataMappings>;
@@ -411,7 +412,7 @@ export class GraferController extends EventEmitter {
411412
private loadPoints(data: GraferControllerData, pointsRadiusMapping: { radius: (entry: any) => number; }): void {
412413
if (data.points) {
413414
const mappings = Object.assign({}, pointsRadiusMapping, data.points.mappings);
414-
this._viewport.graph = new Graph(this._viewport.context, data.points.data, mappings);
415+
this._viewport.graph = new Graph(this._viewport.context, data.points.data, mappings, data.points.options);
415416
this._viewport.graph.picking = new PickingManager(this._viewport.context, this._viewport.mouseHandler);
416417
}
417418
}

src/graph/Graph.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import {Renderable, RenderMode, RenderUniforms} from '../renderer/Renderable';
22
import {App} from 'picogl';
33
import {mat4, quat, vec3} from 'gl-matrix';
44
import {Layer} from './Layer';
5-
import {GraphPoints, PointData, PointDataMappings} from '../data/GraphPoints';
5+
import {GraphPoints, PointData, PointDataMappings, PointOptions} from '../data/GraphPoints';
66
import {PickingManager} from '../UX/picking/PickingManager';
77
import {EventEmitter} from '@dekkai/event-emitter/build/lib/EventEmitter';
88

@@ -55,9 +55,9 @@ export class Graph extends EventEmitter.mixin(GraphPoints) implements Renderable
5555
}
5656

5757
constructor(context: App, data: PointData[]);
58-
constructor(context: App, data: unknown[], mappings: Partial<PointDataMappings>);
59-
constructor(context: App, data: unknown[], mappings: Partial<PointDataMappings> = {}) {
60-
super(context, data, mappings);
58+
constructor(context: App, data: unknown[], mappings: Partial<PointDataMappings>, options: PointOptions);
59+
constructor(context: App, data: unknown[], mappings: Partial<PointDataMappings> = {}, options: PointOptions = {}) {
60+
super(context, data, mappings, options);
6161
this._layers = [];
6262
this._rotation = quat.create();
6363
this._translation = vec3.create();

0 commit comments

Comments
 (0)