124 lines
3.7 KiB
JavaScript
124 lines
3.7 KiB
JavaScript
class NullIsland {
|
|
constructor() {
|
|
this.id = 'null-island';
|
|
this.type = 'custom';
|
|
this.renderingMode = '2d';
|
|
}
|
|
|
|
onAdd(map, gl) {
|
|
const vertexSource = `
|
|
uniform mat4 u_matrix;
|
|
void main() {
|
|
gl_Position = u_matrix * vec4(0.5, 0.5, 0.0, 1.0);
|
|
gl_PointSize = 20.0;
|
|
}`;
|
|
|
|
const fragmentSource = `
|
|
void main() {
|
|
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
|
|
}`;
|
|
|
|
const vertexShader = gl.createShader(gl.VERTEX_SHADER);
|
|
gl.shaderSource(vertexShader, vertexSource);
|
|
gl.compileShader(vertexShader);
|
|
const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
|
|
gl.shaderSource(fragmentShader, fragmentSource);
|
|
gl.compileShader(fragmentShader);
|
|
|
|
this.program = gl.createProgram();
|
|
gl.attachShader(this.program, vertexShader);
|
|
gl.attachShader(this.program, fragmentShader);
|
|
gl.linkProgram(this.program);
|
|
}
|
|
|
|
render(gl, matrix) {
|
|
gl.useProgram(this.program);
|
|
gl.uniformMatrix4fv(gl.getUniformLocation(this.program, "u_matrix"), false, matrix);
|
|
gl.drawArrays(gl.POINTS, 0, 1);
|
|
}
|
|
}
|
|
|
|
class Tent3D {
|
|
constructor() {
|
|
this.id = 'tent-3d';
|
|
this.type = 'custom';
|
|
this.renderingMode = '3d';
|
|
}
|
|
|
|
onAdd(map, gl) {
|
|
|
|
const vertexSource = `
|
|
|
|
attribute vec3 aPos;
|
|
uniform mat4 uMatrix;
|
|
|
|
void main() {
|
|
gl_Position = uMatrix * vec4(aPos, 1.0);
|
|
}
|
|
`;
|
|
|
|
const fragmentSource = `
|
|
void main() {
|
|
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
|
|
}
|
|
`;
|
|
|
|
const vertexShader = gl.createShader(gl.VERTEX_SHADER);
|
|
gl.shaderSource(vertexShader, vertexSource);
|
|
gl.compileShader(vertexShader);
|
|
const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
|
|
gl.shaderSource(fragmentShader, fragmentSource);
|
|
gl.compileShader(fragmentShader);
|
|
|
|
this.program = gl.createProgram();
|
|
gl.attachShader(this.program, vertexShader);
|
|
gl.attachShader(this.program, fragmentShader);
|
|
gl.linkProgram(this.program);
|
|
gl.validateProgram(this.program);
|
|
|
|
this.program.aPos = gl.getAttribLocation(this.program, "aPos");
|
|
this.program.uMatrix = gl.getUniformLocation(this.program, "uMatrix");
|
|
|
|
const x = 0.5 - 0.015;
|
|
const y = 0.5 - 0.01;
|
|
const z = 0.01;
|
|
const d = 0.01;
|
|
|
|
const vertexArray = new Float32Array([
|
|
x, y, 0,
|
|
x + d, y, 0,
|
|
x, y + d, z,
|
|
x + d, y + d, z,
|
|
x, y + d + d, 0,
|
|
x + d, y + d + d, 0]);
|
|
const indexArray = new Uint16Array([
|
|
0, 1, 2,
|
|
1, 2, 3,
|
|
2, 3, 4,
|
|
3, 4, 5
|
|
]);
|
|
|
|
this.vertexBuffer = gl.createBuffer();
|
|
gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer);
|
|
gl.bufferData(gl.ARRAY_BUFFER, vertexArray, gl.STATIC_DRAW);
|
|
this.indexBuffer = gl.createBuffer();
|
|
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);
|
|
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indexArray, gl.STATIC_DRAW);
|
|
}
|
|
|
|
render(gl, matrix) {
|
|
gl.useProgram(this.program);
|
|
gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer);
|
|
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);
|
|
gl.enableVertexAttribArray(this.program.a_pos);
|
|
gl.vertexAttribPointer(this.program.aPos, 3, gl.FLOAT, false, 0, 0);
|
|
gl.uniformMatrix4fv(this.program.uMatrix, false, matrix);
|
|
gl.drawElements(gl.TRIANGLES, 12, gl.UNSIGNED_SHORT, 0);
|
|
}
|
|
}
|
|
|
|
export default {
|
|
"tent-3d": Tent3D,
|
|
"null-island": NullIsland
|
|
};
|