gl01/main.go
2024-08-02 18:47:14 +08:00

106 lines
2.1 KiB
Go

package main
import (
"fmt"
"runtime"
"time"
"edgaru089.ink/go/gl01/internal/game"
gio "edgaru089.ink/go/gl01/internal/io"
_ "edgaru089.ink/go/gl01/internal/render/gpu_preference"
"edgaru089.ink/go/gl01/internal/util/itype"
"github.com/go-gl/gl/all-core/gl"
"github.com/go-gl/glfw/v3.3/glfw"
)
var (
frameTick *time.Ticker
)
func init() {
runtime.LockOSThread()
}
func main() {
err := gio.LoadConfig()
if err != nil {
panic(err)
}
if err := glfw.Init(); err != nil {
panic(err)
}
defer glfw.Terminate()
// framerate limit ticker
if gio.MainConfig.FramerateLimit > 0 {
frameTick = time.NewTicker(time.Second / time.Duration(gio.MainConfig.FramerateLimit))
}
glfw.WindowHint(glfw.Resizable, 1)
glfw.WindowHint(glfw.ContextVersionMajor, 3)
glfw.WindowHint(glfw.ContextVersionMinor, 3)
glfw.WindowHint(glfw.OpenGLProfile, glfw.OpenGLCoreProfile)
glfw.WindowHint(glfw.OpenGLForwardCompatible, 1)
win, err := glfw.CreateWindow(gio.MainConfig.WindowWidth, gio.MainConfig.WindowHeight, "Gl01", nil, nil)
if err != nil {
panic(err)
}
win.MakeContextCurrent()
// vsync
if gio.MainConfig.FramerateLimit == 0 {
glfw.SwapInterval(1)
} else {
glfw.SwapInterval(0)
}
err = gl.Init()
if err != nil {
panic(err)
}
fmt.Println("OpenGL Version: ", gl.GoStr(gl.GetString(gl.VERSION)))
game := game.NewGame()
game.Init(win)
gio.ClearColor = itype.Vec4f{0.6, 0.8, 1.0, 1.0}
gio.FogColor = itype.Vec4f{0.6, 0.8, 1.0, 1.0}
gl.ClearColor(0.6, 0.8, 1.0, 1)
gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT)
win.SwapBuffers()
winClock := time.Now()
fpsClock := time.Now()
fpsCounter := 0
for !win.ShouldClose() {
deltaTime := time.Since(winClock)
winClock = time.Now()
game.Update(win, deltaTime)
gl.ClearColor(0.6, 0.8, 1.0, 1)
gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT)
game.Render(win)
win.SwapBuffers()
glfw.PollEvents()
if time.Since(fpsClock) >= time.Second {
win.SetTitle(fmt.Sprintf("Gl01 %dFPS", fpsCounter))
fpsCounter = 0
fpsClock = time.Now()
} else {
fpsCounter++
}
if gio.MainConfig.FramerateLimit > 0 {
<-frameTick.C
}
}
}