tofu

Making something with OpenGL in Go
Log | Files | Refs

commit eb86b4639c4b06a71b404489bff845b687b26b36
parent de0d6cb74f630c090bd547e1dd7506bfbdef1e53
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Mon, 11 Nov 2024 14:24:38 +0900

implement key

Diffstat:
Mcmd/sample/main.go | 53+++++++++++++++++++++++++++++------------------------
Mtofu.go | 53++++++++++++++++++++++++++++++++++++++++++++++++-----
2 files changed, 77 insertions(+), 29 deletions(-)

diff --git a/cmd/sample/main.go b/cmd/sample/main.go @@ -23,54 +23,52 @@ func init() { runtime.LockOSThread() } -func keyboardCallback(w *glfw.Window) { +func processInput(app *App) { const speed = 0.1 - if w.GetKey(glfw.KeyQ) == glfw.Press { - w.SetShouldClose(true) + if tofu.IsKeyPressed(tofu.KeyQ) { + app.termination = true + return } - if w.GetKey(glfw.KeyUp) == glfw.Press { + if tofu.IsKeyPressed(tofu.KeyUp) { alpha += 0.01 if alpha > 1.0 { alpha = 1.0 } } - if w.GetKey(glfw.KeyDown) == glfw.Press { + if tofu.IsKeyPressed(tofu.KeyDown) { alpha -= 0.01 if alpha < 0 { alpha = 0 } } - if w.GetKey(glfw.KeyW) == glfw.Press { + if tofu.IsKeyPressed(tofu.KeyW) { camera.Move(0, 0, -speed) } - if w.GetKey(glfw.KeyS) == glfw.Press { + if tofu.IsKeyPressed(tofu.KeyS) { camera.Move(0, 0, speed) } - if w.GetKey(glfw.KeyA) == glfw.Press { + if tofu.IsKeyPressed(tofu.KeyA) { camera.Move(-speed, 0, 0) } - if w.GetKey(glfw.KeyD) == glfw.Press { + if tofu.IsKeyPressed(tofu.KeyD) { camera.Move(speed, 0, 0) } - if w.GetKey(glfw.KeySpace) == glfw.Press { + if tofu.IsKeyPressed(tofu.KeySpace) { camera.Move(0, speed, 0) } - if w.GetKey(glfw.KeyLeftShift) == glfw.Press { + if tofu.IsKeyPressed(tofu.KeyLeftShift) { camera.Move(0, -speed, 0) } } -var ( - cursorX, cursorY float32 - mouseCallbackFirstTime = true -) -func watchCursor(app App) { +func watchCursor(app *App) { const sensitivity = 0.005 + firstTime := true for cur := range app.cursorChan { - if app.cursorFirstTime { + if firstTime { app.cur = cur - app.cursorFirstTime = false + firstTime = false continue } dx, dy := float32(app.cur.X-cur.X), float32(app.cur.Y-cur.Y) @@ -144,13 +142,22 @@ type App struct { lightProgram *tofu.Program lightCol tofu.Vec3 objCol tofu.Vec3 + cursorChan chan tofu.Cursor cur tofu.Cursor - cursorFirstTime bool + + keyChan chan struct{} + camera *tofu.Camera + + termination bool } -func (app App) Update() error { +func (app *App) Update() error { + processInput(app) + if app.termination { + return tofu.Termination + } lightModel := tofu.Rotate(float32(glfw.GetTime()), tofu.Vec3{0, 1.41421356 / 2, 1.41421356 / 2}). Mul(tofu.Translate(tofu.Vec3{3, 0, 0})). Mul(tofu.Scale(0.1)) @@ -181,13 +188,13 @@ func (app App) Update() error { return nil } -func (app App) CursorChan() chan<- tofu.Cursor { +func (app *App) CursorChan() chan<- tofu.Cursor { return app.cursorChan } func main() { var err error - app := App{cursorFirstTime: true} + app := &App{} app.lightCol = tofu.Vec3{1, 1, 1} app.objCol = tofu.Vec3{1.0, 0.5, 0.32} app.cursorChan = make(chan tofu.Cursor) @@ -218,8 +225,6 @@ func main() { camera.MoveTo(tofu.Vec3{0, 0, 3}) camera.LookAt(tofu.Vec3{0, 0, 0}) - tofu.SetKeyCallback(keyboardCallback) - if err := tofu.Run(app); err != nil { log.Fatal(err) } diff --git a/tofu.go b/tofu.go @@ -1,6 +1,7 @@ package tofu import ( + "errors" "fmt" "log" "unsafe" @@ -57,10 +58,12 @@ func Run(app App) error { defer close(c) } for !window.ShouldClose() { - keyCallback(window) gl.ClearColor(0.1, 0.2, 0.2, 1.0) - gl.Clear(gl.COLOR_BUFFER_BIT|gl.DEPTH_BUFFER_BIT) - app.Update() + gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) + err := app.Update() + if err == Termination { + break + } window.SwapBuffers() glfw.PollEvents() } @@ -92,4 +95,45 @@ func SetKeyCallback(f func(*glfw.Window)) { func SetWindowSize(w, h int) { winW, winH = w, h -} -\ No newline at end of file +} + +type Key int + +const ( + KeyA Key = Key(glfw.KeyA) + KeyB = Key(glfw.KeyB) + KeyC = Key(glfw.KeyC) + KeyD = Key(glfw.KeyD) + KeyE = Key(glfw.KeyE) + KeyF = Key(glfw.KeyF) + KeyG = Key(glfw.KeyG) + KeyH = Key(glfw.KeyH) + KeyI = Key(glfw.KeyI) + KeyJ = Key(glfw.KeyJ) + KeyK = Key(glfw.KeyK) + KeyL = Key(glfw.KeyL) + KeyM = Key(glfw.KeyM) + KeyN = Key(glfw.KeyN) + KeyO = Key(glfw.KeyO) + KeyP = Key(glfw.KeyP) + KeyQ = Key(glfw.KeyQ) + KeyR = Key(glfw.KeyR) + KeyS = Key(glfw.KeyS) + KeyT = Key(glfw.KeyT) + KeyU = Key(glfw.KeyU) + KeyV = Key(glfw.KeyV) + KeyW = Key(glfw.KeyW) + KeyX = Key(glfw.KeyX) + KeyY = Key(glfw.KeyY) + KeyZ = Key(glfw.KeyZ) + KeySpace = Key(glfw.KeySpace) + KeyLeftShift = Key(glfw.KeyLeftShift) + KeyUp = Key(glfw.KeyUp) + KeyDown = Key(glfw.KeyDown) +) + +var Termination error = errors.New("Termination") + +func IsKeyPressed(key Key) bool { + return window.GetKey(glfw.Key(key)) == glfw.Press +}