aboutsummaryrefslogtreecommitdiff
path: root/src/models/Geometry.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/models/Geometry.ts')
-rw-r--r--src/models/Geometry.ts49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/models/Geometry.ts b/src/models/Geometry.ts
new file mode 100644
index 0000000..556c7ea
--- /dev/null
+++ b/src/models/Geometry.ts
@@ -0,0 +1,49 @@
+import {Type} from 'class-transformer';
+import {Colour} from './Colour';
+import {Albedo, Material} from './Material';
+import {Vector} from './Vector';
+
+export class Sphere {
+ @Type(() => Vector)
+ readonly centerPoint: Vector;
+ @Type(() => Material)
+ readonly material: Material;
+ constructor(
+ readonly radius: number,
+ centerPoint: Vector,
+ material: Material
+ ) {
+ this.centerPoint = centerPoint;
+ this.material = material;
+ }
+}
+
+export class Plane {
+ @Type(() => Colour)
+ readonly checkerboardColour1: Colour;
+ @Type(() => Colour)
+ readonly checkerboardColour2: Colour;
+ constructor(
+ readonly yPos: number,
+ readonly width: number, // How far the plane extends into x/-x from 0
+ readonly zStartPos: number,
+ readonly zEndPos: number,
+ readonly checkerboardScale: number,
+ checkerboardColour1: Colour,
+ checkerboardColour2: Colour
+ ) {
+ this.checkerboardColour1 = checkerboardColour1;
+ this.checkerboardColour2 = checkerboardColour2;
+ }
+
+ getMaterialAtPoint(x: number, z: number): Material {
+ let colour: Colour;
+ // prettier-ignore
+ if ((Math.round(this.checkerboardScale * x) + Math.round(this.checkerboardScale * z)) & 1) {
+ colour = this.checkerboardColour1;
+ } else {
+ colour = this.checkerboardColour2;
+ }
+ return new Material(colour, new Albedo(1, 0, 0, 0), 0, 1);
+ }
+}