-
Notifications
You must be signed in to change notification settings - Fork 0
/
gologo.go
116 lines (98 loc) · 2.28 KB
/
gologo.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
// Package gologo provides a simplified drawing API for learning to code.
//
// gologo uses OpenGL to provide a cross platform drawing API but
// abstracts away the complexities of OpenGL.
//
// A minimal, example gologo program to display a window and wait for it to
// be closed, might be:
//
// package main
//
// import (
// "github.com/leedenison/gologo"
// )
//
// func main() {
// // Create and display the main window
// g := gologo.Init()
// defer g.Close()
//
// // Loop and check if the window has been closed
// for !g.Window.ShouldClose() {
// g.CheckForEvents()
// }
// }
package gologo
import (
"os"
"runtime"
"github.com/go-gl/glfw/v3.2/glfw"
"github.com/leedenison/gologo/log"
"github.com/leedenison/gologo/render"
"github.com/leedenison/gologo/time"
)
type Gologo struct {
Window *glfw.Window
}
type Config struct {
Width int
Height int
Title string
}
const (
defaultTitle = "Gologo!"
defaultWinSizeX = 1024
defaultWinSizeY = 768
)
func init() {
// Make sure main thread is locked so that OpenGL calls
// are always made from the same thread.
runtime.LockOSThread()
}
func Init() *Gologo {
return InitWithConfig(
Config{
Width: defaultWinSizeX,
Height: defaultWinSizeY,
Title: defaultTitle,
})
}
func InitWithConfig(config Config) *Gologo {
// Use io.Discard to disable
log.InitLogger(os.Stdout, os.Stdout, os.Stdout, os.Stderr)
if err := glfw.Init(); err != nil {
log.Error.Fatalln("glfw.Init failed:", err)
}
window, err := render.CreateWindow(config.Title, config.Width, config.Height)
if err != nil {
log.Error.Fatalln("window.CreateWindow failed:", err)
}
width, height := window.GetSize()
render.Set2DProjection(float32(width), float32(height))
if err := render.InitOpenGL(); err != nil {
log.Error.Fatalln("InitOpenGL failed:", err)
}
if err := time.InitTick(); err != nil {
log.Error.Fatalln("InitTick failed:", err)
}
return &Gologo{
Window: window,
}
}
func (g *Gologo) GetWindowCenter() [2]float32 {
width, height := g.Window.GetSize()
return [2]float32{
float32(width) / 2.0,
float32(height) / 2.0,
}
}
func (g *Gologo) ClearBackBuffer() {
// Clear the OpenGL back buffer
render.ClearBackBuffer()
}
func (g *Gologo) CheckForEvents() {
glfw.PollEvents()
}
func (g *Gologo) Close() {
glfw.Terminate()
}