aboutsummaryrefslogtreecommitdiff
path: root/camera.go
diff options
context:
space:
mode:
Diffstat (limited to 'camera.go')
-rw-r--r--camera.go27
1 files changed, 15 insertions, 12 deletions
diff --git a/camera.go b/camera.go
index 569d385..b42e9e1 100644
--- a/camera.go
+++ b/camera.go
@@ -13,9 +13,10 @@ type Camera struct {
PDV Vec3
Pixel00 Vec3
AntiAliasing uint
+ MaxDepth uint
}
-func NewCamera(w uint, ar float64, aa uint) (cam Camera) {
+func NewCamera(w uint, ar float64, aa uint, md uint) (cam Camera) {
cam.ImageWidth = w;
cam.ImageHeight = uint(float64(cam.ImageWidth) / ar);
if cam.ImageHeight < 1 {
@@ -23,26 +24,27 @@ func NewCamera(w uint, ar float64, aa uint) (cam Camera) {
}
cam.AntiAliasing = aa;
+ cam.MaxDepth = md;
focal_length := 1.0;
viewport_height := 2.0;
viewport_width := viewport_height *
float64(cam.ImageWidth) /
float64(cam.ImageHeight);
- cam.Centre = Splat(0);
+ cam.Centre = SplatVec3(0);
viewport_u := Vec3{viewport_width, 0, 0};
viewport_v := Vec3{0, -viewport_height, 0};
- cam.PDU = viewport_u.Div(Splat(float64(cam.ImageWidth)));
- cam.PDV = viewport_v.Div(Splat(float64(cam.ImageHeight)));
+ cam.PDU = viewport_u.Div(SplatVec3(float64(cam.ImageWidth)));
+ cam.PDV = viewport_v.Div(SplatVec3(float64(cam.ImageHeight)));
viewport_upperleft := cam.Centre.
Sub(Vec3{0, 0, focal_length}).
- Sub(viewport_u.Div(Splat(2))).
- Sub(viewport_v.Div(Splat(2)));
+ Sub(viewport_u.Div(SplatVec3(2))).
+ Sub(viewport_v.Div(SplatVec3(2)));
cam.Pixel00 = viewport_upperleft.
- Add(cam.PDU.Add(cam.PDV).Div(Splat(2)));
+ Add(cam.PDU.Add(cam.PDV).Div(SplatVec3(2)));
return;
}
@@ -54,12 +56,13 @@ func (cam Camera) Render(world Hittable) {
"Scanlines remaining: %3d...",
(cam.ImageHeight - row));
for col := uint(0); col < cam.ImageWidth; col++ {
- pixel_colour := Splat(0);
+ pixel_colour := SplatVec3(0);
for i := uint(0); i < cam.AntiAliasing; i++ {
r := cam.GetRay(row, col);
- pixel_colour = pixel_colour.Add(r.Colour(world));
+ pixel_colour = pixel_colour.Add(r.Colour(world, cam.MaxDepth));
}
- pixel_colour = pixel_colour.Div(Splat(float64(cam.AntiAliasing)));
+ pixel_colour = pixel_colour.
+ Div(SplatVec3(float64(cam.AntiAliasing)));
fmt.Printf("%s ", pixel_colour.ToPPM());
}
fmt.Printf("\n");
@@ -69,8 +72,8 @@ func (cam Camera) Render(world Hittable) {
func (cam Camera) GetRay(row uint, col uint) Ray {
offset := unit_square();
pixel_sample := cam.Pixel00.
- Add(cam.PDU.Mul(Splat(float64(col) + offset.X))).
- Add(cam.PDV.Mul(Splat(float64(row) + offset.Y)));
+ Add(cam.PDU.Mul(SplatVec3(float64(col) + offset.X))).
+ Add(cam.PDV.Mul(SplatVec3(float64(row) + offset.Y)));
return Ray{cam.Centre, pixel_sample.Sub(cam.Centre)};
}