refactor ImGUI code files
This commit is contained in:
126
internal/igwrap/backend/glfw.go
Normal file
126
internal/igwrap/backend/glfw.go
Normal file
@@ -0,0 +1,126 @@
|
||||
package backend
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"github.com/go-gl/glfw/v3.3/glfw"
|
||||
"github.com/inkyblackness/imgui-go/v4"
|
||||
)
|
||||
|
||||
const (
|
||||
mouseButtonPrimary = iota
|
||||
mouseButtonSecondary
|
||||
mouseButtonTertiary
|
||||
mouseButtonCount
|
||||
)
|
||||
|
||||
var (
|
||||
win *glfw.Window
|
||||
io imgui.IO
|
||||
|
||||
lastframe time.Time
|
||||
mouseJustPressed [mouseButtonCount]bool
|
||||
)
|
||||
|
||||
func Init(window *glfw.Window) {
|
||||
win = window
|
||||
io = imgui.CurrentIO()
|
||||
|
||||
setKeymap()
|
||||
lastframe = time.Now()
|
||||
|
||||
renderInit()
|
||||
}
|
||||
|
||||
// NewFrame marks the begin of a render pass.
|
||||
func NewFrame() {
|
||||
dsx, dsy := win.GetSize()
|
||||
io.SetDisplaySize(imgui.Vec2{X: float32(dsx), Y: float32(dsy)})
|
||||
|
||||
now := time.Now()
|
||||
deltaTime := float32(time.Since(lastframe).Seconds())
|
||||
if deltaTime <= 0.0 {
|
||||
deltaTime = 1e-6
|
||||
}
|
||||
io.SetDeltaTime(deltaTime)
|
||||
lastframe = now
|
||||
|
||||
if win.GetAttrib(glfw.Focused) != 0 {
|
||||
x, y := win.GetCursorPos()
|
||||
io.SetMousePosition(imgui.Vec2{X: float32(x), Y: float32(y)})
|
||||
}
|
||||
|
||||
for i := 0; i < mouseButtonCount; i++ {
|
||||
down := mouseJustPressed[i] || (win.GetMouseButton(glfwButtonIDByIndex[i]) == glfw.Press)
|
||||
io.SetMouseButtonDown(i, down)
|
||||
mouseJustPressed[i] = false
|
||||
}
|
||||
imgui.NewFrame()
|
||||
}
|
||||
|
||||
func setKeymap() {
|
||||
io.KeyMap(imgui.KeyTab, int(glfw.KeyTab))
|
||||
io.KeyMap(imgui.KeyLeftArrow, int(glfw.KeyLeft))
|
||||
io.KeyMap(imgui.KeyRightArrow, int(glfw.KeyRight))
|
||||
io.KeyMap(imgui.KeyUpArrow, int(glfw.KeyUp))
|
||||
io.KeyMap(imgui.KeyDownArrow, int(glfw.KeyDown))
|
||||
io.KeyMap(imgui.KeyPageUp, int(glfw.KeyPageUp))
|
||||
io.KeyMap(imgui.KeyPageDown, int(glfw.KeyPageDown))
|
||||
io.KeyMap(imgui.KeyHome, int(glfw.KeyHome))
|
||||
io.KeyMap(imgui.KeyEnd, int(glfw.KeyEnd))
|
||||
io.KeyMap(imgui.KeyInsert, int(glfw.KeyInsert))
|
||||
io.KeyMap(imgui.KeyDelete, int(glfw.KeyDelete))
|
||||
io.KeyMap(imgui.KeyBackspace, int(glfw.KeyBackspace))
|
||||
io.KeyMap(imgui.KeySpace, int(glfw.KeySpace))
|
||||
io.KeyMap(imgui.KeyEnter, int(glfw.KeyEnter))
|
||||
io.KeyMap(imgui.KeyEscape, int(glfw.KeyEscape))
|
||||
io.KeyMap(imgui.KeyA, int(glfw.KeyA))
|
||||
io.KeyMap(imgui.KeyC, int(glfw.KeyC))
|
||||
io.KeyMap(imgui.KeyV, int(glfw.KeyV))
|
||||
io.KeyMap(imgui.KeyX, int(glfw.KeyX))
|
||||
io.KeyMap(imgui.KeyY, int(glfw.KeyY))
|
||||
io.KeyMap(imgui.KeyZ, int(glfw.KeyZ))
|
||||
}
|
||||
|
||||
var glfwButtonIndexByID = map[glfw.MouseButton]int{
|
||||
glfw.MouseButton1: mouseButtonPrimary,
|
||||
glfw.MouseButton2: mouseButtonSecondary,
|
||||
glfw.MouseButton3: mouseButtonTertiary,
|
||||
}
|
||||
|
||||
var glfwButtonIDByIndex = map[int]glfw.MouseButton{
|
||||
mouseButtonPrimary: glfw.MouseButton1,
|
||||
mouseButtonSecondary: glfw.MouseButton2,
|
||||
mouseButtonTertiary: glfw.MouseButton3,
|
||||
}
|
||||
|
||||
// MouseButtonCallback is the callback called when the mouse button changes.
|
||||
func MouseButtonCallback(button glfw.MouseButton, action glfw.Action) {
|
||||
if index, known := glfwButtonIndexByID[button]; known && (action == glfw.Press) {
|
||||
mouseJustPressed[index] = true
|
||||
}
|
||||
}
|
||||
|
||||
// MouseScrollCallback is called when scroll status changes.
|
||||
func MouseScrollCallback(x, y float64) {
|
||||
io.AddMouseWheelDelta(float32(x), float32(y))
|
||||
}
|
||||
|
||||
// KeyCallback is called when a key is pressed or released.
|
||||
func KeyCallback(key glfw.Key, action glfw.Action) {
|
||||
if action == glfw.Press {
|
||||
io.KeyPress(int(key))
|
||||
}
|
||||
if action == glfw.Release {
|
||||
io.KeyRelease(int(key))
|
||||
}
|
||||
io.KeyCtrl(int(glfw.KeyLeftControl), int(glfw.KeyRightControl))
|
||||
io.KeyShift(int(glfw.KeyLeftShift), int(glfw.KeyRightShift))
|
||||
io.KeyAlt(int(glfw.KeyLeftAlt), int(glfw.KeyRightAlt))
|
||||
io.KeySuper(int(glfw.KeyLeftSuper), int(glfw.KeyRightSuper))
|
||||
}
|
||||
|
||||
// InputCallback is called when a char is inputed (CharChange)
|
||||
func InputCallback(input rune) {
|
||||
io.AddInputCharacters(string(input))
|
||||
}
|
||||
Reference in New Issue
Block a user