aboutsummaryrefslogtreecommitdiff
path: root/src/Framebuffer.ts
diff options
context:
space:
mode:
authorJames Barnett <noreply@jamesbarnett.xyz>2022-01-01 21:21:52 +0000
committerJames Barnett <noreply@jamesbarnett.xyz>2022-01-01 21:21:52 +0000
commit7ad1b7efabea1349107669a432e6c88305f8d825 (patch)
tree8de34e4b3e20e4e8c0c01578ce0b0cfaa46cc6cf /src/Framebuffer.ts
parentdc5e815da04d7c377b3cb51558d6fe7b8e0fd7c0 (diff)
downloadjs-raytracer-7ad1b7efabea1349107669a432e6c88305f8d825.tar.xz
js-raytracer-7ad1b7efabea1349107669a432e6c88305f8d825.zip
Implement basic ray tracing
Diffstat (limited to 'src/Framebuffer.ts')
-rw-r--r--src/Framebuffer.ts38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/Framebuffer.ts b/src/Framebuffer.ts
new file mode 100644
index 0000000..b9926d2
--- /dev/null
+++ b/src/Framebuffer.ts
@@ -0,0 +1,38 @@
+import {Colour} from './Colour';
+
+export class Framebuffer {
+ readonly width: number;
+ readonly height: number;
+ readonly canvasContext: CanvasRenderingContext2D;
+ readonly canvasImageData: ImageData;
+
+ constructor(width: number, height: number) {
+ this.width = width;
+ this.height = height;
+
+ const canvas = document.getElementById(
+ 'render-output'
+ ) as HTMLCanvasElement;
+
+ canvas.width = this.width;
+ canvas.height = this.height;
+
+ this.canvasContext = canvas.getContext('2d')!;
+ this.canvasImageData = this.canvasContext.createImageData(
+ this.width,
+ this.height
+ );
+ }
+
+ writePixelAt(x: number, y: number, colour: Colour) {
+ const startIdx = (y * this.width + x) * 4;
+ this.canvasImageData.data[startIdx] = colour.r;
+ this.canvasImageData.data[startIdx + 1] = colour.g;
+ this.canvasImageData.data[startIdx + 2] = colour.b;
+ this.canvasImageData.data[startIdx + 3] = 255; // No A
+ }
+
+ flush() {
+ this.canvasContext.putImageData(this.canvasImageData, 0, 0);
+ }
+}