From 91436086a86e454298d627b46ebcd79980a493af Mon Sep 17 00:00:00 2001 From: syntaxbullet Date: Fri, 3 Jul 2026 09:36:43 +0200 Subject: [PATCH] feat(renderer): add WebGL renderer skeleton --- renderer/index.ts | 2 ++ renderer/renderer.ts | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 renderer/index.ts create mode 100644 renderer/renderer.ts diff --git a/renderer/index.ts b/renderer/index.ts new file mode 100644 index 0000000..142e2c4 --- /dev/null +++ b/renderer/index.ts @@ -0,0 +1,2 @@ +export type { ImageRenderer, RenderFrame, RendererBackend } from "./renderer"; +export { createRenderer } from "./renderer"; diff --git a/renderer/renderer.ts b/renderer/renderer.ts new file mode 100644 index 0000000..fae79b9 --- /dev/null +++ b/renderer/renderer.ts @@ -0,0 +1,40 @@ +import type { ImageDocument } from "@core/document"; +import type { EditorState } from "@editor/state"; + +export type RenderFrame = { + document: ImageDocument; + editor: EditorState; +}; + +export type ImageRenderer = { + render(frame: RenderFrame): void; + resize(width: number, height: number): void; + dispose(): void; +}; + +export type RendererBackend = "webgl"; + +export function createRenderer(canvas: HTMLCanvasElement, backend: RendererBackend = "webgl"): ImageRenderer { + if (backend !== "webgl") { + throw new Error(`Unsupported renderer backend: ${backend}`); + } + + const context = canvas.getContext("webgl2"); + if (!context) { + throw new Error("WebGL2 is not available"); + } + + return { + render() { + context.viewport(0, 0, canvas.width, canvas.height); + context.clearColor(0, 0, 0, 0); + context.clear(context.COLOR_BUFFER_BIT); + }, + resize(width, height) { + canvas.width = width; + canvas.height = height; + context.viewport(0, 0, width, height); + }, + dispose() {}, + }; +}