From d7c2d5adb913bc1bd5596736036c0478928ba652 Mon Sep 17 00:00:00 2001 From: dylan <> Date: Fri, 28 Apr 2023 20:01:48 -0700 Subject: [PATCH] draw triangle --- .vscode/settings.json | 4 ++ README.md | 1 - deno.json | 5 ++ deno.lock | 46 ++++++++++++++++++ deps.ts | 7 +++ graphics.ts | 93 ++++++++++++++++++++++++++++++++++++ index.ts | 106 ++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 261 insertions(+), 1 deletion(-) create mode 100644 .vscode/settings.json create mode 100644 deno.json create mode 100644 deno.lock create mode 100644 deps.ts create mode 100644 graphics.ts create mode 100644 index.ts diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..73eb6c9 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "deno.enable": true, + "deno.unstable": true +} diff --git a/README.md b/README.md index 6e2e588..3f18cb9 100644 --- a/README.md +++ b/README.md @@ -1,2 +1 @@ # fantasy-console - diff --git a/deno.json b/deno.json new file mode 100644 index 0000000..93350f5 --- /dev/null +++ b/deno.json @@ -0,0 +1,5 @@ +{ + "fmt": { + "useTabs": true + } +} diff --git a/deno.lock b/deno.lock new file mode 100644 index 0000000..8c12f9c --- /dev/null +++ b/deno.lock @@ -0,0 +1,46 @@ +{ + "version": "2", + "remote": { + "https://deno.land/std@0.97.0/_util/assert.ts": "2f868145a042a11d5ad0a3c748dcf580add8a0dbc0e876eaa0026303a5488f58", + "https://deno.land/std@0.97.0/_util/os.ts": "e282950a0eaa96760c0cf11e7463e66babd15ec9157d4c9ed49cc0925686f6a7", + "https://deno.land/std@0.97.0/encoding/base64.ts": "eecae390f1f1d1cae6f6c6d732ede5276bf4b9cd29b1d281678c054dc5cc009e", + "https://deno.land/std@0.97.0/encoding/hex.ts": "f952e0727bddb3b2fd2e6889d104eacbd62e92091f540ebd6459317a61932d9b", + "https://deno.land/std@0.97.0/fs/_util.ts": "f2ce811350236ea8c28450ed822a5f42a0892316515b1cd61321dec13569c56b", + "https://deno.land/std@0.97.0/fs/ensure_dir.ts": "b7c103dc41a3d1dbbb522bf183c519c37065fdc234831a4a0f7d671b1ed5fea7", + "https://deno.land/std@0.97.0/fs/exists.ts": "b0d2e31654819cc2a8d37df45d6b14686c0cc1d802e9ff09e902a63e98b85a00", + "https://deno.land/std@0.97.0/hash/_wasm/hash.ts": "cb6ad1ab429f8ac9d6eae48f3286e08236d662e1a2e5cfd681ba1c0f17375895", + "https://deno.land/std@0.97.0/hash/_wasm/wasm.js": "94b1b997ae6fb4e6d2156bcea8f79cfcd1e512a91252b08800a92071e5e84e1a", + "https://deno.land/std@0.97.0/hash/hasher.ts": "57a9ec05dd48a9eceed319ac53463d9873490feea3832d58679df6eec51c176b", + "https://deno.land/std@0.97.0/hash/mod.ts": "5d032bd34186cda2f8d17fc122d621430953a6030d4b3f11172004715e3e2441", + "https://deno.land/std@0.97.0/path/_constants.ts": "1247fee4a79b70c89f23499691ef169b41b6ccf01887a0abd131009c5581b853", + "https://deno.land/std@0.97.0/path/_interface.ts": "1fa73b02aaa24867e481a48492b44f2598cd9dfa513c7b34001437007d3642e4", + "https://deno.land/std@0.97.0/path/_util.ts": "2e06a3b9e79beaf62687196bd4b60a4c391d862cfa007a20fc3a39f778ba073b", + "https://deno.land/std@0.97.0/path/common.ts": "eaf03d08b569e8a87e674e4e265e099f237472b6fd135b3cbeae5827035ea14a", + "https://deno.land/std@0.97.0/path/glob.ts": "314ad9ff263b895795208cdd4d5e35a44618ca3c6dd155e226fb15d065008652", + "https://deno.land/std@0.97.0/path/mod.ts": "4465dc494f271b02569edbb4a18d727063b5dbd6ed84283ff906260970a15d12", + "https://deno.land/std@0.97.0/path/posix.ts": "f56c3c99feb47f30a40ce9d252ef6f00296fa7c0fcb6dd81211bdb3b8b99ca3b", + "https://deno.land/std@0.97.0/path/separator.ts": "8fdcf289b1b76fd726a508f57d3370ca029ae6976fcde5044007f062e643ff1c", + "https://deno.land/std@0.97.0/path/win32.ts": "77f7b3604e0de40f3a7c698e8a79e7f601dc187035a1c21cb1e596666ce112f8", + "https://deno.land/x/cache@0.2.13/deps.ts": "6f14e76a1a09f329e3f3830c6e72bd10b53a89a75769d5ea886e5d8603e503e6", + "https://deno.land/x/cache@0.2.13/directories.ts": "ef48531cab3f827252e248596d15cede0de179a2fb15392ae24cf8034519994f", + "https://deno.land/x/dwm@0.3.3/mod.ts": "8a8ca602442d250eaa7cef67c14245a41aa7dc8de2fa337008e433a2ed1fe2f1", + "https://deno.land/x/dwm@0.3.3/src/core/common.ts": "dd4cd26f45fca187c5a6192bfb7b3b4a01a23c66dddf64e19e013de7748f988d", + "https://deno.land/x/dwm@0.3.3/src/core/event.ts": "715cce309021e9dcd45b7e3f41bddea961d4b157dcf6f29a21e910825aae90a8", + "https://deno.land/x/dwm@0.3.3/src/core/mod.ts": "4c54848365ea17b67e65d4d58c7c94378c9bbc6ea2a59d7d11f1d701e6a5483a", + "https://deno.land/x/dwm@0.3.3/src/core/monitor.ts": "b291ebad386095285fb7c430990be0a9f1f5f81fbcb338058ce72a538a75d667", + "https://deno.land/x/dwm@0.3.3/src/core/platform.ts": "6cab5f575198848673204673fe82d242c9c87549c16cbed9a64c838eb99dd2d4", + "https://deno.land/x/dwm@0.3.3/src/core/window.ts": "1ccd738d6e4e28836327a76480c3c47855f617fa7ed7552a035f2d7bf0fd6c6d", + "https://deno.land/x/dwm@0.3.3/src/platform/glfw/constants.ts": "832295fa6a4bd66aea638bd09ad2cc48b3756daff814c7c0ae2a544f228be9e5", + "https://deno.land/x/dwm@0.3.3/src/platform/glfw/ffi.ts": "0c6a521a8374aa8c912417edfa5c263423286363f4a7c827d4d26ead8b954ee6", + "https://deno.land/x/dwm@0.3.3/src/platform/glfw/monitor.ts": "05506c5d21c527a6ea456d24e00f88a01a9292a68f45a845499137ecb6fb80c7", + "https://deno.land/x/dwm@0.3.3/src/platform/glfw/platform.ts": "cca2684151f34be392e74a9828f89f8c3ed46db25e59aec1f638b4ccf82535e9", + "https://deno.land/x/dwm@0.3.3/src/platform/glfw/scancode_win.json": "711ee525f88fe92129acd7d66fd6a5665b68ce6a60f590ae24de67e1ee916b8f", + "https://deno.land/x/dwm@0.3.3/src/platform/glfw/window.ts": "a6dd426a95cd93ba4905da151a0d06e9376becca273ee8bc8d1c9a7bd16e0d81", + "https://deno.land/x/dwm@0.3.3/src/platform/mod.ts": "20572d937c62ec543e0ca87cf8ed32cd15505d254f97a6fae98b936e480f2157", + "https://deno.land/x/gluten@0.1.6/api/gles23.2.ts": "99cad13b74938ff987a1a707f73d72a82ddf66935e45b59d1980928cd3af3495", + "https://glfw-binaries.deno.dev/3.4.0-patch2/glfw3_darwin.js": "48911f26fff723a9c5f2f38e39be42fc65ed8dea6f2ba1f1acb464d3f0aa435b", + "https://glfw-binaries.deno.dev/3.4.0-patch2/glfw3_darwin_aarch64.js": "ae4d795d93830b8a27714ab6c20b69b67f3d4ad3544c50e344558756cf2e92f3", + "https://glfw-binaries.deno.dev/3.4.0-patch2/glfw3_linux.js": "b064aedb175fee1a977937f07584238f313a1958f9869273e7e672c42f09932d", + "https://glfw-binaries.deno.dev/3.4.0-patch2/glfw3_windows.js": "6ac603e03520c8c333e1475cb00f982adb1f8a99de7f4bb0b8953da66f210159" + } +} diff --git a/deps.ts b/deps.ts new file mode 100644 index 0000000..1aaae9f --- /dev/null +++ b/deps.ts @@ -0,0 +1,7 @@ +export { + createWindow, + getProcAddress, + mainloop, + DwmWindow, +} from "https://deno.land/x/dwm@0.3.3/mod.ts"; +export * as gl from "https://deno.land/x/gluten@0.1.6/api/gles23.2.ts"; \ No newline at end of file diff --git a/graphics.ts b/graphics.ts new file mode 100644 index 0000000..657ca0a --- /dev/null +++ b/graphics.ts @@ -0,0 +1,93 @@ +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 new file mode 100644 index 0000000..c22a4d1 --- /dev/null +++ b/index.ts @@ -0,0 +1,106 @@ +import { + createWindow, + getProcAddress, + mainloop, + gl, +} from "./deps.ts"; + +const window = createWindow({ + title: "DenoGL", + width: 800, + height: 600, + resizable: true, + glVersion: [3, 2], + gles: true, +}); + +gl.load(getProcAddress); + +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); +}); + +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.EnableVertexAttribArray(0); + gl.DrawArrays(gl.TRIANGLES, 0, 3); + window.swapBuffers(); +} + +await mainloop(frame);