aboutsummaryrefslogtreecommitdiff
path: root/rtiaw.go
blob: 9f900b6568bdeebcea7fd5841566b50eb1bf8d8f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package main

import (
	"fmt"
  "os"
  "time"
)

func main() {
  start := time.Now();

  image_width := 400;
  aspect := 16.0 / 9.0;

  var world Hittables;
  world.Add(Sphere{Vec3{0,    0  , -1},   0.5});
  world.Add(Sphere{Vec3{0, -100.5, -1}, 100  });

  image_height := int(float64(image_width) / aspect);
  if image_height < 1 {
    image_height = 1;
  }

  focal_length := 1.0;
  viewport_height := 2.0;
  viewport_width := viewport_height *
                      (float64(image_width) / float64(image_height));
  camera_centre := Splat(0);

  viewport_u := Vec3{viewport_width, 0, 0};
  viewport_v := Vec3{0, -viewport_height, 0};

  pd_u := viewport_u.Div(Splat(float64(image_width)));
  pd_v := viewport_v.Div(Splat(float64(image_height)));

  viewport_upperleft := camera_centre.
                        Sub(Vec3{0, 0, focal_length}).
                        Sub(viewport_u.Div(Splat(2))).
                        Sub(viewport_v.Div(Splat(2)));
  pixel00_loc := viewport_upperleft.
                 Add(pd_u.Add(pd_v).Div(Splat(2)));

  fmt.Printf("P3\n%d %d\n255\n", image_width, image_height);
  for row := 0; row < image_height; row++ {
    fmt.Fprintf(os.Stderr,
                "Scanlines remaining: %3d...",
                (image_height - row));
    for col := 0; col < image_width; col++ {
      pixel_centre := pixel00_loc.
                      Add(pd_u.Mul(Splat(float64(col)))).
                      Add(pd_v.Mul(Splat(float64(row))));
      ray_direction := pixel_centre.Sub(camera_centre);
      ray := Ray{camera_centre, ray_direction}
      pixel_colour := ray.Colour(world);
      fmt.Printf("%s    ", pixel_colour.ToPPM());
    }
    fmt.Printf("\n");
  }

  dur := time.Since(start);
  fmt.Fprintf(os.Stderr,
              "Done, in %5.2f seconds!    \n",
              dur.Seconds());
}