Skip to content

Commit 8e06c28

Browse files
committed
hotload
1 parent fb4924d commit 8e06c28

File tree

7 files changed

+286
-47
lines changed

7 files changed

+286
-47
lines changed

.vscode/launch.json

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{
2+
// Use IntelliSense to learn about possible attributes.
3+
// Hover to view descriptions of existing attributes.
4+
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
5+
"version": "0.2.0",
6+
"configurations": [
7+
{
8+
"name": "Launch",
9+
"type": "go",
10+
"request": "launch",
11+
"mode": "debug",
12+
"remotePath": "",
13+
"port": 2345,
14+
"host": "127.0.0.1",
15+
"program": "${fileDirname}",
16+
"env": {},
17+
"args": [],
18+
"showLog": true
19+
}
20+
]
21+
}

gogl/gogl.go

Lines changed: 13 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -5,44 +5,17 @@ import (
55
"fmt"
66
"github.com/go-gl/gl/v3.3-core/gl"
77
"io/ioutil"
8-
_ "os"
98
"strings"
10-
"time"
119
)
1210

1311
type ShaderID uint32
1412
type ProgramID uint32
15-
type VAOID uint32
16-
type VBOID uint32
13+
type BufferID uint32
1714

1815
func GetVersion() string {
1916
return gl.GoStr(gl.GetString(gl.VERSION))
2017
}
2118

22-
type programInfo struct {
23-
vertPath string
24-
fragPath string
25-
modified time.Time
26-
}
27-
28-
var loadedShaders []programInfo
29-
30-
func CheckShadersForChanges() {
31-
/*
32-
for _, shaderInfo := range loadedShaders {
33-
file, err := os.Stat(oriInfo.path)
34-
if err != nil {
35-
panic(err)
36-
}
37-
modTime := file.ModTime()
38-
// check if greater than?
39-
if !modTime.Equal(shaderInfo.modified) {
40-
fmt.Println("Shader modified")
41-
}
42-
}
43-
*/
44-
}
45-
4619
func LoadShader(path string, shaderType uint32) (ShaderID, error) {
4720
shaderFile, err := ioutil.ReadFile(path)
4821
if err != nil {
@@ -114,28 +87,32 @@ func CreateProgram(vertPath string, fragPath string) (ProgramID, error) {
11487
return ProgramID(shaderProgram), nil
11588
}
11689

117-
func GenBindBuffer(target uint32) VBOID {
118-
var VBO uint32
119-
gl.GenBuffers(1, &VBO)
120-
gl.BindBuffer(target, VBO)
121-
return VBOID(VBO)
90+
func GenBindBuffer(target uint32) BufferID {
91+
var buffer uint32
92+
gl.GenBuffers(1, &buffer)
93+
gl.BindBuffer(target, buffer)
94+
return BufferID(buffer)
12295
}
12396

124-
func GenBindVertexArray() VAOID {
97+
func GenBindVertexArray() BufferID {
12598
var VAO uint32
12699
gl.GenVertexArrays(1, &VAO)
127100
gl.BindVertexArray(VAO)
128-
return VAOID(VAO)
101+
return BufferID(VAO)
129102
}
130103

131-
func BindVertexArray(vaoID VAOID) {
104+
func BindVertexArray(vaoID BufferID) {
132105
gl.BindVertexArray(uint32(vaoID))
133106
}
134107

135108
func BufferDataFloat(target uint32, data []float32, usage uint32) {
136109
gl.BufferData(target, len(data)*4, gl.Ptr(data), usage)
137110
}
138111

112+
func BufferDataInt(target uint32, data []uint32, usage uint32) {
113+
gl.BufferData(target, len(data)*4, gl.Ptr(data), usage)
114+
}
115+
139116
func UnbindVertexArray() {
140117
gl.BindVertexArray(0)
141118
}

gogl/shader.go

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package gogl
2+
3+
import (
4+
"fmt"
5+
"github.com/go-gl/gl/v3.3-core/gl"
6+
"os"
7+
"time"
8+
)
9+
10+
type Shader struct {
11+
id ProgramID
12+
vertexPath string
13+
fragmentPath string
14+
vertexModified time.Time
15+
fragmentModified time.Time
16+
}
17+
18+
func NewShader(vertexPath string, fragmentPath string) (*Shader, error) {
19+
id, err := CreateProgram(vertexPath, fragmentPath)
20+
if err != nil {
21+
return nil, err
22+
}
23+
result := &Shader{id, vertexPath, fragmentPath, getModifiedTime(vertexPath), getModifiedTime(fragmentPath)}
24+
return result, nil
25+
}
26+
27+
func (shader *Shader) Use() {
28+
UseProgram(shader.id)
29+
}
30+
31+
func (shader *Shader) SetFloat(name string, f float32) {
32+
name_cstr := gl.Str(name + "\x00")
33+
location := gl.GetUniformLocation(uint32(shader.id), name_cstr)
34+
gl.Uniform1f(location, f)
35+
}
36+
37+
func getModifiedTime(filePath string) time.Time {
38+
file, err := os.Stat(filePath)
39+
if err != nil {
40+
panic(err)
41+
}
42+
return file.ModTime()
43+
}
44+
45+
func (shader *Shader) CheckShaderForChanges() {
46+
47+
vertexModTime := getModifiedTime(shader.vertexPath)
48+
fragmentModTime := getModifiedTime(shader.fragmentPath)
49+
// check if greater than?
50+
if !vertexModTime.Equal(shader.vertexModified) ||
51+
!fragmentModTime.Equal(shader.fragmentModified) {
52+
id, err := CreateProgram(shader.vertexPath, shader.fragmentPath)
53+
if err != nil {
54+
fmt.Println(err)
55+
} else {
56+
gl.DeleteProgram(uint32(shader.id))
57+
shader.id = id
58+
}
59+
}
60+
61+
}

hellotriangle/debug

5.47 MB
Binary file not shown.

hellotriangle/hellotriangle.go

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -32,24 +32,34 @@ func main() {
3232

3333
fmt.Println("OpenGL Version", gogl.GetVersion())
3434

35-
shaderProgram, err := gogl.CreateProgram("shaders/hello.vert", "shaders/hello.frag")
35+
shaderProgram, err := gogl.NewShader("shaders/hello.vert", "shaders/hello.frag")
3636
if err != nil {
3737
panic(err)
3838
}
3939

4040
vertices := []float32{
41-
-0.5, -0.5, 0.0,
42-
0.5, -0.5, 0.0,
43-
0.0, 0.5, 0.0}
41+
0.5, 0.5, 0.0, 1.0, 1.0,
42+
0.5, -0.5, 0.0, 1.0, 0.0,
43+
-0.5, -0.5, 0.0, 0.0, 0.0,
44+
-0.5, 0.5, 0.0, 0.0, 1.0}
45+
46+
indices := []uint32{
47+
0, 1, 3, // triangle 1
48+
1, 2, 3, // triangle 2
49+
}
4450

4551
gogl.GenBindBuffer(gl.ARRAY_BUFFER)
4652
VAO := gogl.GenBindVertexArray()
47-
4853
gogl.BufferDataFloat(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW)
49-
gl.VertexAttribPointer(0, 3, gl.FLOAT, false, 3*4, nil)
54+
gogl.GenBindBuffer(gl.ELEMENT_ARRAY_BUFFER)
55+
gogl.BufferDataInt(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW)
56+
57+
gl.VertexAttribPointer(0, 3, gl.FLOAT, false, 5*4, nil)
5058
gl.EnableVertexAttribArray(0)
59+
gl.VertexAttribPointer(1, 2, gl.FLOAT, false, 5*4, gl.PtrOffset(3*4))
60+
gl.EnableVertexAttribArray(1)
5161
gogl.UnbindVertexArray()
52-
62+
var x float32 = 0.0
5363
for {
5464
for event := sdl.PollEvent(); event != nil; event = sdl.PollEvent() {
5565
switch event.(type) {
@@ -61,10 +71,13 @@ func main() {
6171
gl.ClearColor(0.0, 0.0, 0.0, 0.0)
6272
gl.Clear(gl.COLOR_BUFFER_BIT)
6373

64-
gogl.UseProgram(shaderProgram)
74+
shaderProgram.Use()
75+
shaderProgram.SetFloat("x", x)
76+
shaderProgram.SetFloat("y", 0.0)
6577
gogl.BindVertexArray(VAO)
66-
gl.DrawArrays(gl.TRIANGLES, 0, 3)
78+
gl.DrawElements(gl.TRIANGLES, 6, gl.UNSIGNED_INT, gl.PtrOffset(0))
6779
window.GLSwap()
68-
gogl.CheckShadersForChanges()
80+
shaderProgram.CheckShaderForChanges()
81+
x = x + .01
6982
}
7083
}

0 commit comments

Comments
 (0)