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
|
package main
import (
"fmt"
"os"
"gopkg.in/qml.v1"
"gopkg.in/qml.v1/gl/es2"
)
func main() {
if err := qml.Run(run); err != nil {
fmt.Fprintf(os.Stderr, "error: %v\n", err)
os.Exit(1)
}
}
func run() error {
qml.RegisterTypes("GoExtensions", 1, 0, []qml.TypeSpec{{
Init: func(r *GoRect, obj qml.Object) { r.Object = obj },
}})
engine := qml.NewEngine()
component, err := engine.LoadFile("painting.qml")
if err != nil {
return err
}
win := component.CreateWindow(nil)
win.Show()
win.Wait()
return nil
}
type GoRect struct {
qml.Object
}
var vertexShader = `
#version 120
attribute vec2 position;
void main()
{
gl_Position = vec4(position.x, position.y, 0.0, 1.0);
}
`
var fragmentShader = `
#version 120
void main()
{
gl_FragColor = vec4(1.0, 1.0, 1.0, 0.8);
}
`
func (r *GoRect) Paint(p *qml.Painter) {
gl := GL.API(p)
vertices := []float32{
-1, -1,
+1, -1,
+1, +1,
-1, +1,
}
indices := []uint8{
0, 1, 2, // first triangle
2, 3, 0, // second triangle
}
buf := gl.GenBuffers(2)
gl.BindBuffer(GL.ARRAY_BUFFER, buf[0])
gl.BufferData(GL.ARRAY_BUFFER, 0, vertices, GL.STATIC_DRAW)
gl.BindBuffer(GL.ELEMENT_ARRAY_BUFFER, buf[1])
gl.BufferData(GL.ELEMENT_ARRAY_BUFFER, 0, indices, GL.STATIC_DRAW)
vshader := gl.CreateShader(GL.VERTEX_SHADER);
gl.ShaderSource(vshader, vertexShader)
gl.CompileShader(vshader)
var status [1]int32
gl.GetShaderiv(vshader, GL.COMPILE_STATUS, status[:])
if status[0] == 0 {
log := gl.GetShaderInfoLog(vshader)
panic("vertex shader compilation failed: " + string(log))
}
fshader := gl.CreateShader(GL.FRAGMENT_SHADER)
gl.ShaderSource(fshader, fragmentShader)
gl.CompileShader(fshader)
gl.GetShaderiv(fshader, GL.COMPILE_STATUS, status[:])
if status[0] == 0 {
log := gl.GetShaderInfoLog(fshader)
panic("fragment shader compilation failed: " + string(log))
}
program := gl.CreateProgram()
gl.AttachShader(program, vshader)
gl.AttachShader(program, fshader)
gl.LinkProgram(program)
gl.UseProgram(program)
position := gl.GetAttribLocation(program, "position")
gl.VertexAttribPointer(position, 2, GL.FLOAT, false, 0, 0)
gl.EnableVertexAttribArray(position)
gl.Enable(GL.BLEND)
gl.BlendFunc(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA)
gl.DrawElements(GL.TRIANGLES, 6, GL.UNSIGNED_BYTE, nil)
}
|