dylanebert's picture
dylanebert HF staff
initial commit
e6b949c
raw
history blame
3.03 kB
import * as SPLAT from "gsplat";
const axisVertexShader = /*glsl*/ `#version 300 es
uniform mat4 projection, view;
in vec3 position;
void main() {
gl_Position = projection * view * vec4(position, 1.0);
}
`;
const axisFragmentShader = /*glsl*/ `#version 300 es
precision mediump float;
uniform vec4 axisColor;
out vec4 outColor;
void main() {
outColor = axisColor;
}
`;
class AxisProgram extends SPLAT.ShaderProgram {
protected _initialize: () => void;
protected _resize: () => void;
protected _render: () => void;
protected _dispose: () => void;
constructor(renderer: SPLAT.WebGLRenderer, passes: SPLAT.ShaderPass[]) {
super(renderer, passes);
const gl = renderer.gl;
let vertexBuffer: WebGLBuffer;
let positionAttribute: number;
let u_projection: WebGLUniformLocation;
let u_view: WebGLUniformLocation;
let u_color: WebGLUniformLocation;
const xVertices = new Float32Array([-50, 0, 0, 50, 0, 0]);
const yVertices = new Float32Array([0, -50, 0, 0, 50, 0]);
const zVertices = new Float32Array([0, 0, -50, 0, 0, 50]);
const xColor = new Float32Array([1, 0, 0, 0.5]);
const yColor = new Float32Array([0, 1, 0, 0.5]);
const zColor = new Float32Array([0, 0.5, 1, 0.5]);
this._initialize = () => {
vertexBuffer = gl.createBuffer() as WebGLBuffer;
positionAttribute = gl.getAttribLocation(this.program, "position");
gl.enableVertexAttribArray(positionAttribute);
u_projection = gl.getUniformLocation(this.program, "projection") as WebGLUniformLocation;
u_view = gl.getUniformLocation(this.program, "view") as WebGLUniformLocation;
u_color = gl.getUniformLocation(this.program, "axisColor") as WebGLUniformLocation;
};
const drawAxis = (vertices: Float32Array, color: Float32Array) => {
gl.uniform4fv(u_color, color);
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);
gl.vertexAttribPointer(positionAttribute, 3, gl.FLOAT, false, 0, 0);
gl.drawArrays(gl.LINES, 0, 2);
};
this._resize = () => {};
this._render = () => {
if (!this._camera) {
throw new Error("Camera not set");
}
gl.enable(gl.BLEND);
gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
gl.uniformMatrix4fv(u_projection, false, this._camera.data.projectionMatrix.buffer);
gl.uniformMatrix4fv(u_view, false, this._camera.data.viewMatrix.buffer);
drawAxis(xVertices, xColor);
drawAxis(yVertices, yColor);
drawAxis(zVertices, zColor);
};
this._dispose = () => {};
}
protected _getVertexSource() {
return axisVertexShader;
}
protected _getFragmentSource() {
return axisFragmentShader;
}
}
export { AxisProgram };