diff --git a/go.mod b/go.mod new file mode 100755 index 0000000..e741540 --- /dev/null +++ b/go.mod @@ -0,0 +1,14 @@ +module github.com/bloeys/gopad + +go 1.17 + +require ( + github.com/bloeys/nmage v0.0.7-0.20220224025919-577e6250a8e5 + github.com/inkyblackness/imgui-go/v4 v4.3.0 + github.com/veandco/go-sdl2 v0.4.14 +) + +require ( + github.com/bloeys/gglm v0.3.1 // indirect + github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 // indirect +) diff --git a/go.sum b/go.sum new file mode 100755 index 0000000..97b15d8 --- /dev/null +++ b/go.sum @@ -0,0 +1,20 @@ +github.com/bloeys/assimp-go v0.4.2/go.mod h1:my3yRxT7CfOztmvi+0svmwbaqw0KFrxaHxncoyaEIP0= +github.com/bloeys/gglm v0.3.1 h1:Sy9upW7SBsBfDXrSmEhid3aQ+7J7itej+upwcxOnPMQ= +github.com/bloeys/gglm v0.3.1/go.mod h1:qwJQ0WzV191wAMwlGicbfbChbKoSedMk7gFFX6GnyOk= +github.com/bloeys/nmage v0.0.7-0.20220224025919-577e6250a8e5 h1:stKgJ7DAhmmYy+meP0j7vyjmlfgrAO7jcz6+BwZAVbg= +github.com/bloeys/nmage v0.0.7-0.20220224025919-577e6250a8e5/go.mod h1:4h2tKtMvk9ab8r/+rem4QonPXEBTho6VWvpCMm0M6iM= +github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/go-gl/gl v0.0.0-20211025173605-bda47ffaa784/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw= +github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 h1:zDw5v7qm4yH7N8C8uWd+8Ii9rROdgWxQuGoJ9WDXxfk= +github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw= +github.com/inkyblackness/imgui-go/v4 v4.3.0 h1:iyAzqWXq/dG5+6ckDPhGivtrIo6AywGQMvENKzun04s= +github.com/inkyblackness/imgui-go/v4 v4.3.0/go.mod h1:g8SAGtOYUP7rYaOB2AsVKCEHmPMDmJKgt4z6d+flhb0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/veandco/go-sdl2 v0.4.10/go.mod h1:OROqMhHD43nT4/i9crJukyVecjPNYYuCofep6SNiAjY= +github.com/veandco/go-sdl2 v0.4.14 h1:ShagETHJG8NCWVn9rwfZ9WLIaN4c2maw3gfFH+9DlOg= +github.com/veandco/go-sdl2 v0.4.14/go.mod h1:OROqMhHD43nT4/i9crJukyVecjPNYYuCofep6SNiAjY= diff --git a/imgui.ini b/imgui.ini new file mode 100755 index 0000000..53bb39e --- /dev/null +++ b/imgui.ini @@ -0,0 +1,15 @@ +[Window][Debug##Default] +Pos=496,94 +Size=400,400 +Collapsed=0 + +[Window][text] +Pos=60,60 +Size=32,32 +Collapsed=0 + +[Window][sidebar] +Pos=0,0 +Size=32,32 +Collapsed=0 + diff --git a/main.go b/main.go new file mode 100644 index 0000000..1c8758e --- /dev/null +++ b/main.go @@ -0,0 +1,132 @@ +package main + +import ( + "github.com/bloeys/nmage/engine" + "github.com/bloeys/nmage/input" + "github.com/bloeys/nmage/logging" + nmageimgui "github.com/bloeys/nmage/ui/imgui" + "github.com/inkyblackness/imgui-go/v4" + "github.com/veandco/go-sdl2/sdl" +) + +type Gopad struct { + Win *engine.Window + ImGUIInfo nmageimgui.ImguiInfo + Quitting bool + + mainFont imgui.Font + buffer []rune +} + +var () + +func main() { + + if err := engine.Init(); err != nil { + panic(err) + } + + window, err := engine.CreateOpenGLWindowCentered("nMage", 1280, 720, engine.WindowFlags_RESIZABLE) + if err != nil { + logging.ErrLog.Fatalln("Failed to create window. Err: ", err) + } + defer window.Destroy() + + g := Gopad{ + Win: window, + ImGUIInfo: nmageimgui.NewImGUI(), + } + + engine.Run(&g) +} + +func (g *Gopad) Init() { + g.Win.EventCallbacks = append(g.Win.EventCallbacks, g.handleWindowEvents) + g.mainFont = g.ImGUIInfo.AddFontTTF("./res/fonts/courier-new.ttf", 24) +} + +func (g *Gopad) handleWindowEvents(event sdl.Event) { + + switch e := event.(type) { + + case *sdl.TextEditingEvent: + case *sdl.TextInputEvent: + g.buffer = append(g.buffer, []rune(e.GetText())...) + } +} + +func (g *Gopad) FrameStart() { +} + +func (g *Gopad) Update() { + + if input.IsQuitClicked() { + g.Quitting = true + } + + if x, y := input.GetMousePos(); x > 0 && y > 0 && input.MouseClicked(sdl.BUTTON_LEFT) { + println("Start") + sdl.StartTextInput() + } + + if input.KeyClicked(sdl.K_ESCAPE) { + println("End") + sdl.StopTextInput() + } + + if input.KeyClicked(sdl.K_BACKSPACE) && len(g.buffer) > 0 { + g.buffer = g.buffer[:len(g.buffer)-1] + } + + if input.KeyClicked(sdl.K_RETURN) || input.KeyClicked(sdl.K_RETURN2) { + g.buffer = append(g.buffer, rune('\n')) + } + +} + +func (g *Gopad) Render() { + + open := true + w, h := g.Win.SDLWin.GetSize() + sidebarSize := float32(w) * 0.25 + + //Global imgui settings + imgui.PushStyleColor(imgui.StyleColorText, imgui.Vec4{X: 1, Y: 0, Z: 1, W: 1}) + imgui.PushFont(g.mainFont) + + //Sidebar + imgui.SetNextWindowPos(imgui.Vec2{X: 0, Y: 0}) + imgui.SetNextWindowSize(imgui.Vec2{X: sidebarSize, Y: float32(h)}) + imgui.BeginV("sidebar", &open, imgui.WindowFlagsNoCollapse|imgui.WindowFlagsNoDecoration|imgui.WindowFlagsNoMove) + imgui.End() + + //Text area + imgui.SetNextWindowPos(imgui.Vec2{X: sidebarSize, Y: 0}) + imgui.SetNextWindowSize(imgui.Vec2{X: float32(w) - sidebarSize, Y: float32(h)}) + imgui.BeginV("editor", &open, imgui.WindowFlagsNoCollapse|imgui.WindowFlagsNoDecoration|imgui.WindowFlagsNoMove) + imgui.Text(string(g.buffer)) + imgui.End() + + imgui.PopFont() + imgui.PopStyleColor() +} + +func (g *Gopad) FrameEnd() { + +} + +func (g *Gopad) ShouldRun() bool { + return !g.Quitting +} + +func (g *Gopad) GetWindow() *engine.Window { + return g.Win +} + +func (g *Gopad) GetImGUI() nmageimgui.ImguiInfo { + return g.ImGUIInfo +} + +func (g *Gopad) Deinit() { + g.Win.Destroy() +} diff --git a/res/fonts/courier-new.ttf b/res/fonts/courier-new.ttf new file mode 100755 index 0000000..ebb3361 Binary files /dev/null and b/res/fonts/courier-new.ttf differ diff --git a/res/shaders/imgui.frag.glsl b/res/shaders/imgui.frag.glsl new file mode 100755 index 0000000..edde592 --- /dev/null +++ b/res/shaders/imgui.frag.glsl @@ -0,0 +1,13 @@ +#version 410 + +uniform sampler2D Texture; + +in vec2 Frag_UV; +in vec4 Frag_Color; + +out vec4 Out_Color; + +void main() +{ + Out_Color = vec4(Frag_Color.rgb, Frag_Color.a * texture(Texture, Frag_UV.st).r); +} \ No newline at end of file diff --git a/res/shaders/imgui.vert.glsl b/res/shaders/imgui.vert.glsl new file mode 100755 index 0000000..a39109a --- /dev/null +++ b/res/shaders/imgui.vert.glsl @@ -0,0 +1,17 @@ +#version 410 + +uniform mat4 ProjMtx; + +in vec2 Position; +in vec2 UV; +in vec4 Color; + +out vec2 Frag_UV; +out vec4 Frag_Color; + +void main() +{ + Frag_UV = UV; + Frag_Color = Color; + gl_Position = ProjMtx * vec4(Position.xy, 0, 1); +} \ No newline at end of file diff --git a/windowflags.go b/windowflags.go new file mode 100755 index 0000000..eca07ea --- /dev/null +++ b/windowflags.go @@ -0,0 +1,31 @@ +package main + +import ( + "github.com/veandco/go-sdl2/sdl" +) + +type WindowFlags int + +const ( + WindowFlags_FULLSCREEN WindowFlags = sdl.WINDOW_FULLSCREEN + WindowFlags_OPENGL WindowFlags = sdl.WINDOW_OPENGL + WindowFlags_SHOWN WindowFlags = sdl.WINDOW_SHOWN + WindowFlags_HIDDEN WindowFlags = sdl.WINDOW_HIDDEN + WindowFlags_BORDERLESS WindowFlags = sdl.WINDOW_BORDERLESS + WindowFlags_RESIZABLE WindowFlags = sdl.WINDOW_RESIZABLE + WindowFlags_MINIMIZED WindowFlags = sdl.WINDOW_MINIMIZED + WindowFlags_MAXIMIZED WindowFlags = sdl.WINDOW_MAXIMIZED + WindowFlags_INPUT_GRABBED WindowFlags = sdl.WINDOW_INPUT_GRABBED + WindowFlags_INPUT_FOCUS WindowFlags = sdl.WINDOW_INPUT_FOCUS + WindowFlags_MOUSE_FOCUS WindowFlags = sdl.WINDOW_MOUSE_FOCUS + WindowFlags_FULLSCREEN_DESKTOP WindowFlags = sdl.WINDOW_FULLSCREEN_DESKTOP + WindowFlags_FOREIGN WindowFlags = sdl.WINDOW_FOREIGN + WindowFlags_ALLOW_HIGHDPI WindowFlags = sdl.WINDOW_ALLOW_HIGHDPI + WindowFlags_MOUSE_CAPTURE WindowFlags = sdl.WINDOW_MOUSE_CAPTURE + WindowFlags_ALWAYS_ON_TOP WindowFlags = sdl.WINDOW_ALWAYS_ON_TOP + WindowFlags_SKIP_TASKBAR WindowFlags = sdl.WINDOW_SKIP_TASKBAR + WindowFlags_UTILITY WindowFlags = sdl.WINDOW_UTILITY + WindowFlags_TOOLTIP WindowFlags = sdl.WINDOW_TOOLTIP + WindowFlags_POPUP_MENU WindowFlags = sdl.WINDOW_POPUP_MENU + // WindowFlags_VULKAN WindowFlags = sdl.WINDOW_VULKAN +)