/
opengl_canvas.go
134 lines (109 loc) · 3.68 KB
/
opengl_canvas.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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package opengl41
import (
"fmt"
"log"
"github.com/go-gl/gl/v4.1-core/gl"
"github.com/go-gl/glfw/v3.3/glfw"
"github.com/go4orward/gigl"
)
type OpenGLCanvas struct {
wh [2]int //
window *glfw.Window //
rc *OpenGLRenderingContext //
paused bool //
}
var glfw_initialized bool = false
var gl_initialized bool = false
func NewOpenGLCanvas(width int, height int, title string, resizable bool) (*OpenGLCanvas, error) {
if !glfw_initialized {
if err := glfw.Init(); err != nil {
log.Fatalln("failed to initialize glfw:", err)
}
glfw_initialized = true
}
glfw.WindowHint(glfw.Resizable, glfw.False)
glfw.WindowHint(glfw.ContextVersionMajor, 4)
glfw.WindowHint(glfw.ContextVersionMinor, 1)
glfw.WindowHint(glfw.OpenGLProfile, glfw.OpenGLCoreProfile)
glfw.WindowHint(glfw.OpenGLForwardCompatible, glfw.True)
window, err := glfw.CreateWindow(width, height, title, nil, nil)
if err != nil {
return nil, err
}
window.MakeContextCurrent()
if !gl_initialized {
if err := gl.Init(); err != nil { // Initialize Glow
log.Fatalln("failed to initialize gl: ", err)
}
gl_initialized = true
}
// create WebGL context
self := OpenGLCanvas{window: window, wh: [2]int{width, height}}
self.rc = NewOpenGLRenderingContext(width, height)
return &self, nil
}
func (self *OpenGLCanvas) GetWH() [2]int {
return self.wh
}
func (self *OpenGLCanvas) GetRenderingContext() gigl.GLRenderingContext {
return self.rc
}
func (self *OpenGLCanvas) String() string {
return fmt.Sprintf("OpenGLCanvas{size:%dx%d}\n", self.wh[0], self.wh[1])
}
func (self *OpenGLCanvas) SwapBuffers() {
self.window.SwapBuffers()
}
// ----------------------------------------------------------------------------
// User Interactions (Event Handling)
// ----------------------------------------------------------------------------
func (self *OpenGLCanvas) SetEventHandlerForClick(handler func(canvasxy [2]int, keystat [4]bool)) {
}
func (self *OpenGLCanvas) SetEventHandlerForDoubleClick(handler func(canvasxy [2]int, keystat [4]bool)) {
}
func (self *OpenGLCanvas) SetEventHandlerForMouseOver(handler func(canvasxy [2]int, keystat [4]bool)) {
}
func (self *OpenGLCanvas) SetEventHandlerForMouseDrag(handler func(canvasxy [2]int, dxy [2]int, keystat [4]bool)) {
}
func (self *OpenGLCanvas) SetEventHandlerForZoom(handler func(canvasxy [2]int, scale float32, keystat [4]bool)) {
}
func (self *OpenGLCanvas) SetEventHandlerForScroll(handler func(canvasxy [2]int, dx int, dy int, keystat [4]bool)) {
}
func (self *OpenGLCanvas) SetEventHandlerForKeyPress(handler func(key string, code string, keystat [4]bool)) {
}
func (self *OpenGLCanvas) SetEventHandlerForWindowResize(handler func(w int, h int)) {
}
// ----------------------------------------------------------------------------
// Animating with DrawHandler
// ----------------------------------------------------------------------------
func (self *OpenGLCanvas) Run(draw_handler func(now float64)) {
// run UI animation loop forever, with the given 'draw_handler'
self.paused = false
for !self.window.ShouldClose() {
if draw_handler != nil && !self.paused {
now := glfw.GetTime()
draw_handler(now)
self.window.SwapBuffers()
}
glfw.PollEvents()
}
}
func (self *OpenGLCanvas) RunOnce(draw_handler func(now float64)) {
// run UI animation loop only once, with the given 'draw_handler'
var first_time bool = true
for !self.window.ShouldClose() {
if draw_handler != nil && first_time {
now := glfw.GetTime()
draw_handler(now)
self.window.SwapBuffers()
first_time = false
}
glfw.PollEvents()
}
}
func (self *OpenGLCanvas) Pause() {
self.paused = true
}
func (self *OpenGLCanvas) Resume() {
self.paused = false
}