import { fillRectangle} from "./2d" import { LayerAB, Scene } from "./Scene" import { createProgram, createShader } from "./utils" export class DebugLayer extends LayerAB { private vertexShaderCode = /*glsl*/ ` attribute vec2 a_position; uniform mat4 u_matrix; void main() { gl_PointSize = 20.0; gl_Position = u_matrix * vec4(a_position, 0, 1); } `; private fragmentShaderCode = /*glsl*/ ` precision mediump float; varying vec2 v_texCoord; void main() { gl_FragColor = vec4(0, 0, 1, 1); } ` program: WebGLProgram aPositionLoc: number uMatrixLoc: WebGLUniformLocation vertexBuffer: WebGLBuffer vertexArray = new Float32Array(12) constructor( public readonly scene: Scene, ) { super() const gl = scene.gl; this.program = createProgram(gl, createShader(gl, gl.VERTEX_SHADER, this.vertexShaderCode)!, createShader(gl, gl.FRAGMENT_SHADER, this.fragmentShaderCode)!)! this.aPositionLoc = gl.getAttribLocation(this.program, "a_position") this.uMatrixLoc = gl.getUniformLocation(this.program, "u_matrix")! this.vertexBuffer = gl.createBuffer()!; gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); gl.bufferData(gl.ARRAY_BUFFER, this.vertexArray, gl.STATIC_DRAW); } override draw() { const gl = this.scene.gl; gl.useProgram(this.program); gl.enableVertexAttribArray(this.aPositionLoc); gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); gl.vertexAttribPointer(this.aPositionLoc, 2, gl.FLOAT, false, 0, 0) gl.uniformMatrix4fv(this.uMatrixLoc, false, this.scene.drawMatrix) gl.drawArrays(gl.POINTS, 0, 1); } override tap(cx: number, cy: number, sx: number, sy: number): void { console.log(`tap @${cx},${cy}`) const gl = this.scene.gl this.vertexArray[0] = cx; this.vertexArray[1] = cy; gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); gl.bufferData(gl.ARRAY_BUFFER, this.vertexArray, gl.STATIC_DRAW); this.scene.invalidate() } toString(): string { return `DebugLayer()` } }