1
0
Fork 0
go-raytracer/main.go

123 lines
2.3 KiB
Go

package main
import (
"log"
stdmath "math"
"time"
"github.com/pnx/go-raytracer/graphics"
"github.com/pnx/go-raytracer/math"
"github.com/pnx/go-raytracer/render"
"github.com/pnx/go-raytracer/world"
"github.com/veandco/go-sdl2/sdl"
)
type DebugMode int
const (
DebugMode_NONE DebugMode = iota
DebugMode_MINIMAP
DebugMode_PALETTE
)
var (
gfxContext *graphics.Context
player Player
level *world.Level
startOfFrame time.Time
debugMode DebugMode
)
func loadLevel(newLevel *world.Level) {
level = newLevel
// Set player start position
start := level.PlayerStart()
player.Position = math.Position{
X: (float64(start.X) + 0.5) * world.TileSize,
Y: (float64(start.Y) + 0.5) * world.TileSize,
}
}
func update() bool {
for event := sdl.PollEvent(); event != nil; event = sdl.PollEvent() {
switch ev := event.(type) {
case *sdl.QuitEvent:
return true
case *sdl.KeyboardEvent:
if ev.Type == sdl.KEYDOWN {
switch ev.Keysym.Sym {
case sdl.K_p:
if debugMode != DebugMode_PALETTE {
debugMode = DebugMode_PALETTE
} else {
debugMode = DebugMode_NONE
}
case sdl.K_m:
if debugMode != DebugMode_MINIMAP {
debugMode = DebugMode_MINIMAP
} else {
debugMode = DebugMode_NONE
}
case sdl.K_ESCAPE:
return true
}
}
}
}
keys := sdl.GetKeyboardState()
if keys[sdl.SCANCODE_UP] != 0 {
player.MoveForward(level)
}
if keys[sdl.SCANCODE_DOWN] != 0 {
player.MoveBackward(level)
}
if keys[sdl.SCANCODE_LEFT] != 0 {
player.RotateLeft()
}
if keys[sdl.SCANCODE_RIGHT] != 0 {
player.RotateRight()
}
return false
}
func main() {
var err error
gfxContext, err = graphics.Init("Go Raycaster", 1024, 768)
if err != nil {
log.Fatal(err)
}
player = Player{
MoveSpd: 2,
RotSpd: 0.05,
}
loadLevel(&world.Level1)
for {
startOfFrame := time.Now()
if update() {
break
}
render.DrawScene(gfxContext, player.Transform, level)
if debugMode == DebugMode_MINIMAP {
render.DrawMiniMap(gfxContext, player.Transform, level)
}
if debugMode == DebugMode_PALETTE {
render.DrawPalette(gfxContext, 16, 16)
}
gfxContext.Sync()
elapsed := time.Since(startOfFrame)
sdl.Delay(uint32(stdmath.Max(16-float64(elapsed.Milliseconds()), 1)))
}
gfxContext.Exit()
}