aboutsummaryrefslogtreecommitdiffstats
path: root/Godeps/_workspace/src/github.com/obscuren/qml/examples/painting-es2/painting.go
blob: 71f2d89a2d31f13e72fcbfc876f03bddd2bc0db4 (plain) (blame)
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)
}