diff options
| author | James Barnett <noreply@jamesbarnett.xyz> | 2022-01-01 21:21:52 +0000 |
|---|---|---|
| committer | James Barnett <noreply@jamesbarnett.xyz> | 2022-01-01 21:21:52 +0000 |
| commit | 7ad1b7efabea1349107669a432e6c88305f8d825 (patch) | |
| tree | 8de34e4b3e20e4e8c0c01578ce0b0cfaa46cc6cf /src/Framebuffer.ts | |
| parent | dc5e815da04d7c377b3cb51558d6fe7b8e0fd7c0 (diff) | |
| download | js-raytracer-7ad1b7efabea1349107669a432e6c88305f8d825.tar.xz js-raytracer-7ad1b7efabea1349107669a432e6c88305f8d825.zip | |
Implement basic ray tracing
Diffstat (limited to 'src/Framebuffer.ts')
| -rw-r--r-- | src/Framebuffer.ts | 38 |
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); + } +} |