/
main.go
103 lines (92 loc) · 2.43 KB
/
main.go
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
package main
import (
"fmt"
"github.com/EndIsNear/Go-Raytracer/src/raytracer"
"github.com/EndIsNear/Go-Raytracer/src/sdlwrapper"
"github.com/EndIsNear/Go-Raytracer/src/utils"
"os"
"runtime"
"time"
)
const (
help = `
-s "filepath" read scene from filepath
-d - display rendering
-o "filepath" save image to filepath`
tooFewArg = `Too few arguments.`
errParseArg = `Can't parse args.`
errCreateDisp = `Can't initialize window.`
windowName = `GoTracer`
winWidth, winHeight uint16 = 800, 600
)
func main() {
runtime.GOMAXPROCS(runtime.NumCPU())
sceneFilepath := ""
outputFilepath := ""
displayRendering := false
saveImage := false
argc := len(os.Args)
if argc <= 1 {
fmt.Println(tooFewArg)
fmt.Println(help)
return
}
for i := 1; i < argc; i++ {
if os.Args[i] == "-d" {
displayRendering = true
} else if os.Args[i] == "-o" {
saveImage = true
i++
outputFilepath = os.Args[i]
} else if os.Args[i] == "-s" {
i++
sceneFilepath = os.Args[i]
} else {
fmt.Println(errParseArg)
fmt.Printf("Can't parse %s .\n", os.Args[i])
fmt.Println(help)
}
}
render := raytracer.NewRenderManager(winWidth, winHeight, 0)
render.InitScene(sceneFilepath)
render.StartRendering()
if displayRendering {
disp, err := sdlwrapper.NewDisplay(int(winWidth), int(winHeight), windowName)
if err != nil {
fmt.Println(errCreateDisp)
return
}
defer disp.Destroy()
//refreshes display while rendering
for !sdlwrapper.CheckForExitEvent() && render.GetState() == raytracer.RENDERING {
RefreshDisplay(render, disp)
}
//update window title with render time
disp.SetTitle(windowName + " [render time:" + render.GetRenderTime().String() + "]")
RefreshDisplay(render, disp)
}
if saveImage {
for render.GetState() == raytracer.RENDERING {
time.Sleep(100 * time.Millisecond)
}
//save the result
image := utils.NewPNG(int(winWidth), int(winHeight), outputFilepath)
for i := uint16(0); i < winWidth; i++ {
for j := uint16(0); j < winHeight; j++ {
image.SetPixelAt(int(i), int(j), render.GetPixel(i, j))
}
}
image.SavePNG()
}
//loop while user close it
for !sdlwrapper.CheckForExitEvent() {
}
}
func RefreshDisplay(render *raytracer.RenderManager, disp *sdlwrapper.Display) {
for i := uint16(0); i < winWidth; i++ {
for j := uint16(0); j < winHeight; j++ {
disp.DrawPixel(int(i), int(j), render.GetPixel(i, j))
}
}
disp.Flip()
}