diff --git a/graphics.ts b/graphics.ts deleted file mode 100644 index 657ca0a..0000000 --- a/graphics.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { - DwmWindow, - gl -} from "./deps.ts"; - -function loadShader(type: number, src: string) { - const shader = gl.CreateShader(type); - gl.ShaderSource( - shader, - 1, - new Uint8Array( - new BigUint64Array([ - BigInt( - Deno.UnsafePointer.value( - Deno.UnsafePointer.of(new TextEncoder().encode(src)), - ), - ), - ]).buffer, - ), - new Int32Array([src.length]), - ); - gl.CompileShader(shader); - const status = new Int32Array(1); - gl.GetShaderiv(shader, gl.COMPILE_STATUS, status); - if (status[0] === gl.FALSE) { - const logLength = new Int32Array(1); - gl.GetShaderiv(shader, gl.INFO_LOG_LENGTH, logLength); - const log = new Uint8Array(logLength[0]); - gl.GetShaderInfoLog(shader, logLength[0], logLength, log); - console.log(new TextDecoder().decode(log)); - gl.DeleteShader(shader); - return 0; - } - return shader; -} - -const vShaderSrc = ` - attribute vec4 vPosition; - void main() { - gl_Position = vPosition; - } - `; - -const fShaderSrc = ` - void main() { - gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0); - } - `; - -const vShader = loadShader(gl.VERTEX_SHADER, vShaderSrc); -const fShader = loadShader(gl.FRAGMENT_SHADER, fShaderSrc); - -const program = gl.CreateProgram(); -gl.AttachShader(program, vShader); -gl.AttachShader(program, fShader); - -gl.BindAttribLocation(program, 0, new TextEncoder().encode("vPosition\0")); - -gl.LinkProgram(program); - -const status = new Int32Array(1); -gl.GetProgramiv(program, gl.LINK_STATUS, status); -if (status[0] === gl.FALSE) { - const logLength = new Int32Array(1); - gl.GetProgramiv(program, gl.INFO_LOG_LENGTH, logLength); - const log = new Uint8Array(logLength[0]); - gl.GetProgramInfoLog(program, logLength[0], logLength, log); - console.log(new TextDecoder().decode(log)); - gl.DeleteProgram(program); - Deno.exit(1); -} - -gl.ClearColor(0.0, 0.0, 0.0, 1.0); - -addEventListener("resize", (event) => { - gl.Viewport(0, 0, event.width, event.height); -}); - -export const makeFrameFunc = (swapBuffers: DwmWindow["swapBuffers"]) => { - return () => { - gl.Clear(gl.COLOR_BUFFER_BIT); - gl.UseProgram(program); - // deno-fmt-ignore - gl.VertexAttribPointer(0, 3, gl.FLOAT, gl.FALSE, 0, new Float32Array([ - 0.0, 0.5, 0.0, - -0.5, 0.0, 0.0, - 0.5, 0.0, 0.0, - ])); - gl.EnableVertexAttribArray(0); - gl.DrawArrays(gl.TRIANGLES, 0, 3); - swapBuffers(); - } -} diff --git a/index.ts b/index.ts index c22a4d1..6d4a279 100644 --- a/index.ts +++ b/index.ts @@ -6,10 +6,10 @@ import { } from "./deps.ts"; const window = createWindow({ - title: "DenoGL", - width: 800, - height: 600, - resizable: true, + title: "Faux", + width: 1024, + height: 1024, + resizable: false, glVersion: [3, 2], gles: true, }); @@ -48,17 +48,22 @@ function loadShader(type: number, src: string) { } const vShaderSrc = ` - attribute vec4 vPosition; - void main() { +attribute vec4 vPosition; +attribute vec4 vCol; +varying vec4 color; +void main() { gl_Position = vPosition; - } - `; + color = vCol; +} +`; const fShaderSrc = ` - void main() { - gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0); - } - `; + precision mediump float; + varying vec4 color; + void main() { + gl_FragColor = color; + } + `; const vShader = loadShader(gl.VERTEX_SHADER, vShaderSrc); const fShader = loadShader(gl.FRAGMENT_SHADER, fShaderSrc); @@ -68,6 +73,7 @@ gl.AttachShader(program, vShader); gl.AttachShader(program, fShader); gl.BindAttribLocation(program, 0, new TextEncoder().encode("vPosition\0")); +gl.BindAttribLocation(program, 1, new TextEncoder().encode("vCol\0")); gl.LinkProgram(program); @@ -89,18 +95,68 @@ addEventListener("resize", (event) => { gl.Viewport(0, 0, event.width, event.height); }); +const pixelsPerRow = 128; + +const top = 1; +const left = -1; +const cell = 2/pixelsPerRow; + +const px = (x: number, y: number) => { + // deno-fmt-ignore + return [ + left + x*cell, top - y*cell, 0, + left + (x+1)*cell, top - y*cell, 0, + left + x*cell, top - (y+1)*cell, 0, + left + (x+1)*cell, top - y*cell, 0, + left + x*cell, top - (y+1)*cell, 0, + left + (x+1)*cell, top - (y+1)*cell, 0, + ]; +} + +const palette = [ + [0, 0, 0, 0], + [0, 0, 0, 1], + [1, 1, 1, 1], + [1, 0, 0, 1], + [1, 1, 0, 1], + [0, 1, 0, 1], + [0, 0, 1, 1], +] + +const c = (n: number) => { + return [ + ...palette[n], + ...palette[n], + ...palette[n], + ...palette[n], + ...palette[n], + ...palette[n], + ]; +} + +const allPixelTriangles = new Float32Array( + Array(pixelsPerRow*pixelsPerRow).fill(null).flatMap((_, i) => px(i%pixelsPerRow,Math.floor(i/pixelsPerRow))) +) + +const choose = (alts: Array): T => { + return alts[Math.floor(Math.random()*alts.length)]; +} + +const allPixelColors = new Float32Array( + Array(pixelsPerRow*pixelsPerRow).fill(null).flatMap(() => c(choose([1,2,3,4,5,6]))) +) + const frame = () => { gl.Clear(gl.COLOR_BUFFER_BIT); gl.UseProgram(program); - // deno-fmt-ignore - gl.VertexAttribPointer(0, 3, gl.FLOAT, gl.FALSE, 0, new Float32Array([ - 0.0, 0.5, 0.0, - -0.5, 0.0, 0.0, - 0.5, 0.0, 0.0, - ])); + gl.VertexAttribPointer(0, 3, gl.FLOAT, gl.FALSE, 0, allPixelTriangles); + gl.VertexAttribPointer(1, 4, gl.FLOAT, gl.FALSE, 0, allPixelColors); gl.EnableVertexAttribArray(0); - gl.DrawArrays(gl.TRIANGLES, 0, 3); + gl.EnableVertexAttribArray(1); + gl.DrawArrays(gl.TRIANGLES, 0, 6*pixelsPerRow*pixelsPerRow); window.swapBuffers(); } -await mainloop(frame); +await mainloop(() => { + frame(); +});