aboutsummaryrefslogtreecommitdiff
path: root/main.go
blob: 7042d212f84eec0944ba4595ca6da07bda4045e1 (plain) (blame)
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
65
66
67
68
69
70
71
72
73
74
75

// TODO Use pointers when needed to reduce memory
package main

import (
	"math/rand"

	"github.com/schollz/progressbar"
)

const (
	// Height of frame
	Height = 1000
	// Width of frame
	Width = 2000
	// TMin is the minimal no zero time
	TMin = 0.001
	// TMax limits time
	TMax = 1000
	// RaysPerPixel for anti-aliasing
	RaysPerPixel = 10
	// MaxDepth for ray boucing
	MaxDepth = 50
	// FPS Frames per second for movies
	FPS = 60
)

func main() {
	// Scene
	lowerLeftCorner := Vec3D{-2.0, -1.0, -1.0}
	origin := Vec3D{0.0, 0.0, 0.0}
	horizontal := Vec3D{4.0, 0.0, 0.0}
	vertical := Vec3D{0.0, 2.0, 0.0}
	camera := Camera{lowerLeftCorner, origin, horizontal, vertical}

	matRed := Lambertian{Color{0.7, 0.3, 0.3}}
	matGreen := Lambertian{Color{0.8, 0.8, 0.0}}
	metalGrey := Metal{Color{0.8, 0.8, 0.8}, 0.3}
	// metalBrown := Metal{Color{0.8, 0.6, 0.2}, 1.0}
	glass := Dielectric{1.5}

	WORLD := HitableList{
		Sphere{Vec3D{0.0, 0.0, -1.0}, 0.5, glass},
		Sphere{Vec3D{-1.0, 0.0, -1.0}, 0.5, metalGrey},
		Sphere{Vec3D{1.0, 0.0, -1.0}, 0.5, matRed},
		Sphere{Vec3D{0.0, -100.5, -1.0}, 100.0, matGreen},
	}

	// Program
	// start := AddVec3D(Origin, Vec3D{-1.0, 0.0, 0.0})
	// move := Vec3D{2.0, 0.0, 0.0}
	frame := Frame{}
	bar := progressbar.New(Height)
	bar.RenderBlank()
	// for k := 0; k < FPS*DURATION; k++ {
	// origin := AddVec3D(start, ScalarProduct(float64(k)/float64(FPS*DURATION), move))
	// camera.origin = origin
	for x := 0; x < Height; x++ {
		for y := 0; y < Width; y++ {
			var colorList [RaysPerPixel]Color
			for it := 0; it < RaysPerPixel; it++ {
				u := (float64(y) + rand.Float64()) / float64(Width)
				v := (float64(x) + rand.Float64()) / float64(Height)
				ray := camera.GetRay(u, v)
				colorList[it] = RayColor(ray, WORLD, 0)
			}
			color := ColorMeanSquare(colorList)
			frame[Height-1-x][y] = color.ToPixel()
		}
		bar.Add(1)
	}
	frame.Save("img.png")
	// frame.Save(fmt.Sprintf("frames/frame_%06d.ppm", k))
}

// }