sigma
Version:
A JavaScript library dedicated to graph drawing.
101 lines (87 loc) • 2.59 kB
text/typescript
/**
* Sigma.js WebGL Abstract Edge Program
* =====================================
*
* @module
*/
import { AbstractProgram, IProgram, RenderParams } from "./program";
import { EdgeAttributes, NodeAttributes } from "../../../../types";
export interface RenderEdgeParams extends RenderParams {
edgesPowRatio: number;
}
export interface IEdgeProgram extends IProgram {
computeIndices(): void;
process(
sourceData: NodeAttributes,
targetData: NodeAttributes,
data: EdgeAttributes,
hidden: boolean,
offset: number,
): void;
render(params: RenderEdgeParams): void;
}
/**
* Edge Program class.
*
* @constructor
*/
export abstract class AbstractEdgeProgram extends AbstractProgram implements IEdgeProgram {
constructor(
gl: WebGLRenderingContext,
vertexShaderSource: string,
fragmentShaderSource: string,
points: number,
attributes: number,
) {
super(gl, vertexShaderSource, fragmentShaderSource, points, attributes);
}
abstract bind(): void;
abstract computeIndices(): void;
abstract process(
sourceData: NodeAttributes,
targetData: NodeAttributes,
data: EdgeAttributes,
hidden: boolean,
offset: number,
): void;
abstract render(params: RenderEdgeParams): void;
}
export interface EdgeProgramConstructor {
new (gl: WebGLRenderingContext): IEdgeProgram;
}
export function createEdgeCompoundProgram(programClasses: Array<EdgeProgramConstructor>): EdgeProgramConstructor {
return class EdgeCompoundProgram implements IEdgeProgram {
programs: Array<IEdgeProgram>;
constructor(gl: WebGLRenderingContext) {
this.programs = programClasses.map((ProgramClass) => new ProgramClass(gl));
}
bufferData(): void {
this.programs.forEach((program) => program.bufferData());
}
allocate(capacity: number): void {
this.programs.forEach((program) => program.allocate(capacity));
}
bind(): void {
// nothing todo, it's already done in each program constructor
}
computeIndices(): void {
this.programs.forEach((program) => program.computeIndices());
}
render(params: RenderEdgeParams): void {
this.programs.forEach((program) => {
program.bind();
program.bufferData();
program.render(params);
});
}
process(
sourceData: NodeAttributes,
targetData: NodeAttributes,
data: EdgeAttributes,
hidden: boolean,
offset: number,
): void {
this.programs.forEach((program) => program.process(sourceData, targetData, data, hidden, offset));
}
};
}