-
Notifications
You must be signed in to change notification settings - Fork 7
/
Highlighter.go
124 lines (99 loc) · 3.68 KB
/
Highlighter.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
package levels
import (
mgl "github.com/go-gl/mathgl/mgl32"
"github.com/inkyblackness/hacked/editor/render"
"github.com/inkyblackness/hacked/ui/opengl"
)
var highlighterVertexShaderSource = `
#version 150
precision mediump float;
in vec3 vertexPosition;
uniform mat4 modelMatrix;
uniform mat4 viewMatrix;
uniform mat4 projectionMatrix;
void main(void) {
gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(vertexPosition, 1.0);
}
`
var highlighterFragmentShaderSource = `
#version 150
precision mediump float;
uniform vec4 inColor;
out vec4 fragColor;
void main(void) {
fragColor = inColor;
}
`
// Highlighter draws a simple highlighting of a rectangular area.
type Highlighter struct {
context *render.Context
program uint32
vao *opengl.VertexArrayObject
vertexPositionBuffer uint32
vertexPositionAttrib int32
modelMatrixUniform opengl.Matrix4Uniform
viewMatrixUniform opengl.Matrix4Uniform
projectionMatrixUniform opengl.Matrix4Uniform
inColorUniform opengl.Vector4Uniform
}
// NewHighlighter returns a new instance of Highlighter.
func NewHighlighter(context *render.Context) *Highlighter {
gl := context.OpenGL
program, programErr := opengl.LinkNewStandardProgram(gl, highlighterVertexShaderSource, highlighterFragmentShaderSource)
if programErr != nil {
panic(opengl.NamedShaderError{Name: "HighlighterShader", Nested: programErr})
}
highlighter := &Highlighter{
context: context,
program: program,
vao: opengl.NewVertexArrayObject(gl, program),
vertexPositionBuffer: gl.GenBuffers(1)[0],
vertexPositionAttrib: gl.GetAttribLocation(program, "vertexPosition"),
modelMatrixUniform: opengl.Matrix4Uniform(gl.GetUniformLocation(program, "modelMatrix")),
viewMatrixUniform: opengl.Matrix4Uniform(gl.GetUniformLocation(program, "viewMatrix")),
projectionMatrixUniform: opengl.Matrix4Uniform(gl.GetUniformLocation(program, "projectionMatrix")),
inColorUniform: opengl.Vector4Uniform(gl.GetUniformLocation(program, "inColor"))}
{
gl.BindBuffer(opengl.ARRAY_BUFFER, highlighter.vertexPositionBuffer)
half := float32(0.5)
var vertices = []float32{
-half, -half, 0.0,
half, -half, 0.0,
half, half, 0.0,
half, half, 0.0,
-half, half, 0.0,
-half, -half, 0.0}
gl.BufferData(opengl.ARRAY_BUFFER, len(vertices)*4, vertices, opengl.STATIC_DRAW)
gl.BindBuffer(opengl.ARRAY_BUFFER, 0)
}
highlighter.vao.OnShader(func() {
gl.EnableVertexAttribArray(uint32(highlighter.vertexPositionAttrib))
gl.BindBuffer(opengl.ARRAY_BUFFER, highlighter.vertexPositionBuffer)
gl.VertexAttribOffset(uint32(highlighter.vertexPositionAttrib), 3, opengl.FLOAT, false, 0, 0)
gl.BindBuffer(opengl.ARRAY_BUFFER, 0)
})
return highlighter
}
// Dispose releases all resources.
func (highlighter *Highlighter) Dispose() {
gl := highlighter.context.OpenGL
highlighter.vao.Dispose()
gl.DeleteBuffers([]uint32{highlighter.vertexPositionBuffer})
gl.DeleteShader(highlighter.program)
}
// Render renders the highlights.
func (highlighter *Highlighter) Render(positions []MapPosition, sideLength float32, color [4]float32) {
gl := highlighter.context.OpenGL
highlighter.vao.OnShader(func() {
highlighter.viewMatrixUniform.Set(gl, highlighter.context.ViewMatrix)
highlighter.projectionMatrixUniform.Set(gl, &highlighter.context.ProjectionMatrix)
highlighter.inColorUniform.Set(gl, &color)
for _, pos := range positions {
modelMatrix := mgl.Ident4().
Mul4(mgl.Translate3D(float32(pos.X), float32(pos.Y), 0.0)).
Mul4(mgl.Scale3D(sideLength, sideLength, 1.0))
highlighter.modelMatrixUniform.Set(gl, &modelMatrix)
gl.DrawArrays(opengl.TRIANGLES, 0, 6)
}
})
}