tofu

Making something with OpenGL in Go
Log | Files | Refs

commit e98182433ed2b1ed8837709822e058bd44df9867
parent 9cbd64c0f6b6b78cade5f36c16eb80af3313dae6
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Sun, 10 Nov 2024 15:16:04 +0900

make App

Diffstat:
Mcmd/sample/main.go | 121++++++++++++++++++++++++++++++++++---------------------------------------------
Atofu.go | 77+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 129 insertions(+), 69 deletions(-)

diff --git a/cmd/sample/main.go b/cmd/sample/main.go @@ -6,7 +6,6 @@ import ( "math" "path/filepath" "runtime" - "unsafe" "github.com/go-gl/gl/v3.3-core/gl" "github.com/go-gl/glfw/v3.3/glfw" @@ -31,7 +30,7 @@ func framebufferSizeCallback(w *glfw.Window, width int, height int) { gl.Viewport(0, 0, int32(width), int32(height)) } -func keyboardCallback(w *glfw.Window) { +func keyboardCallback(w *glfw.Window, key glfw.Key, scancode int, action glfw.Action, mods glfw.ModifierKey) { const speed = 0.1 if w.GetKey(glfw.KeyQ) == glfw.Press { w.SetShouldClose(true) @@ -88,10 +87,6 @@ func mouseCallback(w *glfw.Window, x, y float64) { camera.Pitch(dy) } -func messageCallback(source, gltype, id, severity uint32, length int32, message string, userProgram unsafe.Pointer) { - log.Printf("debug: type = 0x%x, severity = 0x%x, message = %s", gltype, severity, message) -} - var object = tofu.Object{ Vertices: []tofu.Vec3{ tofu.Vec3{0.5, 0.5, -0.5}, @@ -149,28 +144,52 @@ var object = tofu.Object{ var alpha float32 = 0.2 -func main() { - err := glfw.Init() - if err != nil { - log.Fatalf("init glfw: %v", err) - } - defer glfw.Terminate() - glfw.WindowHint(glfw.ContextVersionMajor, 3) - glfw.WindowHint(glfw.ContextVersionMinor, 3) - glfw.WindowHint(glfw.OpenGLProfile, glfw.OpenGLCoreProfile) +type App struct{ + program *tofu.Program + lightProgram *tofu.Program + lightCol tofu.Vec3 + objCol tofu.Vec3 +} - window, err := glfw.CreateWindow(winW, winH, "Testing", nil, nil) - if err != nil { - log.Fatalf("create window: %v", err) - } - window.MakeContextCurrent() - if err = gl.Init(); err != nil { - log.Fatalf("init gl: %v", err) - } - gl.Viewport(0, 0, winW, winH) +func (app App) Update() error { + lightModel := tofu.Rotate(float32(glfw.GetTime()), tofu.Vec3{0, 1.41421356/2, 1.41421356/2}). + Mul(tofu.Translate(tofu.Vec3{3, 0, 0})) + lightPos := tofu.Rotate(float32(glfw.GetTime()), tofu.Vec3{0, 1.41421356/2, 1.41421356/2}). + MulVec(tofu.Vec4{3, 0, 0, 0}).Vec3() - gl.Enable(gl.DEBUG_OUTPUT) - gl.DebugMessageCallback(messageCallback, nil) + view := camera.View() + projection := tofu.Perspective(80*math.Pi/180, 800/600, 0.1, 100) + app.program.Use() + app.program.SetVec3("lightPos", lightPos) + app.program.SetMat4("view", view) + app.program.SetMat4("projection", projection) + app.program.SetVec3("lightCol", app.lightCol) + app.program.SetVec3("camPos", camera.Pos) + model := tofu.Translate(tofu.Vec3{0, 0, 0}) +// Mul(tofu.Rotate(float32(glfw.GetTime()), tofu.Vec3{0, 0, 1})). +// Mul(tofu.Rotate(float32(glfw.GetTime()), tofu.Vec3{0, 1, 0})) + app.program.SetMat4("model", model) + app.program.SetVec3("objCol", app.objCol) + + gl.DrawElements(gl.TRIANGLES, 36, gl.UNSIGNED_INT, nil) + app.lightProgram.Use() + app.lightProgram.SetMat4("view", view) + app.lightProgram.SetMat4("projection", projection) + app.lightProgram.SetMat4("model", lightModel) + app.lightProgram.SetVec3("lightCol", app.lightCol) + gl.DrawElements(gl.TRIANGLES, 36, gl.UNSIGNED_INT, nil) + + glfw.PollEvents() + return nil +} + +func main() { + var err error + app := App{} + app.lightCol = tofu.Vec3{1, 1, 1} + app.objCol = tofu.Vec3{1.0, 0.5, 0.32} + tofu.SetWindowSize(winW, winH) + tofu.Init() _, f, _, ok := runtime.Caller(0) if !ok { @@ -182,60 +201,24 @@ func main() { object.Load() - program, err := tofu.NewProgram(vpath, fpath) + app.program, err = tofu.NewProgram(vpath, fpath) if err != nil { log.Fatalf("create shader program: %v", err) } - lightProgram, err := tofu.NewProgram(vpath, lightFpath) + app.lightProgram, err = tofu.NewProgram(vpath, lightFpath) if err != nil { log.Fatalf("create light shader program: %v", err) } - objCol := tofu.Vec3{1.0, 0.5, 0.32} - lightCol := tofu.Vec3{1.0, 1.0, 1.0} - - gl.Enable(gl.DEPTH_TEST) camera = tofu.NewCamera() camera.MoveTo(tofu.Vec3{0, 0, 3}) camera.LookAt(tofu.Vec3{0, 0, 0}) - window.SetFramebufferSizeCallback(framebufferSizeCallback) - window.SetCursorPosCallback(mouseCallback) - window.SetInputMode(glfw.CursorMode, glfw.CursorDisabled) - - for !window.ShouldClose() { - keyboardCallback(window) - gl.ClearColor(0.1, 0.2, 0.2, 1.0) - gl.Clear(gl.COLOR_BUFFER_BIT|gl.DEPTH_BUFFER_BIT) - - lightModel := tofu.Rotate(float32(glfw.GetTime()), tofu.Vec3{0, 1.41421356/2, 1.41421356/2}). - Mul(tofu.Translate(tofu.Vec3{3, 0, 0})) - lightPos := tofu.Rotate(float32(glfw.GetTime()), tofu.Vec3{0, 1.41421356/2, 1.41421356/2}). - MulVec(tofu.Vec4{3, 0, 0, 0}).Vec3() + tofu.SetFramebufferSizeCallback(framebufferSizeCallback) + tofu.SetCursorPosCallback(mouseCallback) + tofu.SetKeyCallback(keyboardCallback) - view := camera.View() - projection := tofu.Perspective(80*math.Pi/180, 800/600, 0.1, 100) - program.Use() - program.SetVec3("lightPos", lightPos) - program.SetMat4("view", view) - program.SetMat4("projection", projection) - program.SetVec3("lightCol", lightCol) - program.SetVec3("camPos", camera.Pos) - model := tofu.Translate(tofu.Vec3{0, 0, 0}) -// Mul(tofu.Rotate(float32(glfw.GetTime()), tofu.Vec3{0, 0, 1})). -// Mul(tofu.Rotate(float32(glfw.GetTime()), tofu.Vec3{0, 1, 0})) - program.SetMat4("model", model) - program.SetVec3("objCol", objCol) - - gl.DrawElements(gl.TRIANGLES, 36, gl.UNSIGNED_INT, nil) - lightProgram.Use() - lightProgram.SetMat4("view", view) - lightProgram.SetMat4("projection", projection) - lightProgram.SetMat4("model", lightModel) - lightProgram.SetVec3("lightCol", lightCol) - gl.DrawElements(gl.TRIANGLES, 36, gl.UNSIGNED_INT, nil) - - window.SwapBuffers() - glfw.PollEvents() + if err := tofu.Run(app); err != nil { + log.Fatal(err) } } diff --git a/tofu.go b/tofu.go @@ -0,0 +1,76 @@ +package tofu + +import ( + "fmt" + "log" + "unsafe" + + "github.com/go-gl/gl/v3.3-core/gl" + "github.com/go-gl/glfw/v3.3/glfw" +) + +type App interface { + Update() error +} + +var window *glfw.Window +var winW, winH int = 800, 600 + +func Init() error { + err := glfw.Init() + if err != nil { + return fmt.Errorf("init glfw: %v", err) + } + + glfw.WindowHint(glfw.ContextVersionMajor, 3) + glfw.WindowHint(glfw.ContextVersionMinor, 3) + glfw.WindowHint(glfw.OpenGLProfile, glfw.OpenGLCoreProfile) + + window, err = glfw.CreateWindow(winW, winH, "Testing", nil, nil) + if err != nil { + return fmt.Errorf("create window: %v", err) + } + window.MakeContextCurrent() + if err = gl.Init(); err != nil { + return fmt.Errorf("init gl: %v", err) + } + gl.Viewport(0, 0, int32(winW), int32(winH)) + gl.Enable(gl.DEBUG_OUTPUT) + gl.DebugMessageCallback(messageCallback, nil) + + gl.Enable(gl.DEPTH_TEST) + + window.SetInputMode(glfw.CursorMode, glfw.CursorDisabled) + return nil +} + +func Run(app App) error { + for !window.ShouldClose() { + gl.ClearColor(0.1, 0.2, 0.2, 1.0) + gl.Clear(gl.COLOR_BUFFER_BIT|gl.DEPTH_BUFFER_BIT) + app.Update() + window.SwapBuffers() + } + glfw.Terminate() + return nil +} + +func messageCallback(source, gltype, id, severity uint32, length int32, message string, userProgram unsafe.Pointer) { + log.Printf("debug: type = 0x%x, severity = 0x%x, message = %s", gltype, severity, message) +} + +func SetFramebufferSizeCallback(f glfw.FramebufferSizeCallback) { + window.SetFramebufferSizeCallback(f) +} + +func SetCursorPosCallback(f glfw.CursorPosCallback) { + window.SetCursorPosCallback(f) +} + +func SetKeyCallback(f glfw.KeyCallback) { + window.SetKeyCallback(f) +} + +func SetWindowSize(w, h int) { + winW, winH = w, h +} +\ No newline at end of file