Merge: doc: fixed some typos and other misc. corrections
[nit.git] / lib / gamnit / examples / triangle / src / portable_triangle.nit
1 # This file is part of NIT ( http://www.nitlanguage.org ).
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
6 #
7 # http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14
15 # Portable example of using Gamnit with custom calls to OpenGL ES 2.0
16 #
17 # References:
18 # * The book OpenGL ES 2.0 Programming Guide
19 # * https://code.google.com/p/opengles-book-samples/source/browse/trunk/LinuxX11/Chapter_2/Hello_Triangle/Hello_Triangle.c
20 module portable_triangle is
21 example
22 app_name "gamnit Triangle"
23 app_namespace "org.nitlanguage.triangle"
24 app_version(1, 1, git_revision)
25 end
26
27 import gamnit
28
29 redef class App
30
31 # Our only program for the graphic card
32 var program: GLProgram is noautoinit
33
34 # The only vertex sharder
35 var vertex_shader: GLVertexShader is noautoinit
36
37 # The only fragment sharder
38 var fragment_shader: GLFragmentShader is noautoinit
39
40 # Vertex data for the triangle
41 var vertex_array: VertexArray is noautoinit
42
43 redef fun create_scene
44 do
45 super
46
47 var display = display
48 assert display != null
49
50 print "Width: {display.width}"
51 print "Height: {display.height}"
52
53 assert glGetError == gl_NO_ERROR
54 assert gl.shader_compiler else print "Cannot compile shaders"
55
56 # GL program
57 program = new GLProgram
58 if not glIsProgram(program) then
59 print "Program is not ok: {glGetError.to_s}\nLog:"
60 print glGetProgramInfoLog(program)
61 abort
62 end
63 assert glGetError == gl_NO_ERROR
64
65 # Vertex shader
66 vertex_shader = new GLVertexShader
67 assert glIsShader(vertex_shader) else print "Vertex shader is not ok: {glGetError}"
68 glShaderSource(vertex_shader, """
69 attribute vec4 vPosition;
70 void main()
71 {
72 gl_Position = vPosition;
73 }
74 """@glsl_vertex_shader.to_cstring)
75 glCompileShader(vertex_shader)
76 assert vertex_shader.is_compiled else print "Vertex shader compilation failed with: {glGetShaderInfoLog(vertex_shader)} {glGetProgramInfoLog(program)}"
77 assert glGetError == gl_NO_ERROR
78
79 # Fragment shader
80 fragment_shader = new GLFragmentShader
81 assert glIsShader(fragment_shader) else print "Fragment shader is not ok: {glGetError}"
82 glShaderSource(fragment_shader, """
83 precision mediump float;
84 void main()
85 {
86 gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
87 }
88 """@glsl_fragment_shader.to_cstring)
89 glCompileShader(fragment_shader)
90 assert fragment_shader.is_compiled else print "Fragment shader compilation failed with: {glIsShader(fragment_shader)}"
91 assert glGetError == gl_NO_ERROR
92
93 # Attach to program
94 glAttachShader(program, vertex_shader)
95 glAttachShader(program, fragment_shader)
96 program.bind_attrib_location(0, "vPosition")
97 glLinkProgram program
98 assert program.is_linked else print "Linking failed: {glGetProgramInfoLog(program)}"
99 assert glGetError == gl_NO_ERROR
100
101 # Draw!
102 var vertices = [0.0, 0.5, 0.0, -0.5, -0.5, 0.0, 0.5, -0.5, 0.0]
103 vertex_array = new VertexArray(0, 3, vertices)
104 vertex_array.attrib_pointer
105 end
106
107 private var t = 0.0
108
109 redef fun frame_core(display)
110 do
111 glClearColor(t, t, t, 1.0)
112
113 assert glGetError == gl_NO_ERROR
114 glViewport(0, 0, display.width, display.height)
115 glClear gl_COLOR_BUFFER_BIT
116 glUseProgram program
117 vertex_array.enable
118
119 glDrawArrays(gl_TRIANGLES, 0, 3)
120
121 display.flip
122
123 t += 0.01
124 if t > 1.0 then t = 0.0
125 end
126
127 redef fun on_stop
128 do
129 # Clean up
130 glDeleteProgram program
131 glDeleteShader vertex_shader
132 glDeleteShader fragment_shader
133
134 # Close gamnit
135 var display = display
136 if display != null then display.close
137 end
138 end
139
140 if "NIT_TESTING".environ == "true" then exit(0)
141 super