50 lines
1.5 KiB
TypeScript
50 lines
1.5 KiB
TypeScript
import Shader from './Shader';
|
|
import assert from './utils/assert';
|
|
|
|
export default class Program {
|
|
public readonly program: WebGLProgram | null;
|
|
|
|
constructor(readonly gl: WebGLRenderingContext) {
|
|
this.program = this.gl.createProgram();
|
|
}
|
|
|
|
public attach(shader: Shader): void {
|
|
if (!this.program) {
|
|
throw Error(`Program type is ${typeof this.program}`);
|
|
}
|
|
if (!shader.shader) {
|
|
throw Error(`Shader type is ${typeof shader.shader}`);
|
|
}
|
|
this.gl.attachShader(this.program, shader.shader);
|
|
}
|
|
|
|
public link(): void {
|
|
if (!this.program) {
|
|
throw Error(`Program type is ${typeof this.program}`);
|
|
}
|
|
this.gl.linkProgram(this.program);
|
|
// If creating the shader program failed, alert.
|
|
assert(this.gl.getProgramParameter(this.program, this.gl.LINK_STATUS),
|
|
'Unable to initialize the shader program.');
|
|
}
|
|
|
|
public use(): void {
|
|
this.gl.useProgram(this.program);
|
|
}
|
|
|
|
public getAttributeLocation(name: string): number {
|
|
if (!this.program) {
|
|
throw Error(`Program type is ${typeof this.program}`);
|
|
}
|
|
return this.gl.getAttribLocation(this.program, name);
|
|
}
|
|
|
|
public setMatrixUniform(name: string, array: Float32List): void {
|
|
if (!this.program) {
|
|
throw Error(`Program type is ${typeof this.program}`);
|
|
}
|
|
const uniform = this.gl.getUniformLocation(this.program, name);
|
|
this.gl.uniformMatrix4fv(uniform, false, array);
|
|
}
|
|
}
|