From 361fb5cd72c6d22021516490db57147c606816b4 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Alexis=20Laferri=C3=A8re?= Date: Sun, 13 Sep 2015 11:18:22 -0400 Subject: [PATCH] lib/gamnit: add a portable version of the triangle example MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Alexis Laferrière --- lib/gamnit/examples/triangle/Makefile | 16 +++ lib/gamnit/examples/triangle/art/icon.svg | 82 ++++++++++++ lib/gamnit/examples/triangle/res/.gitignore | 1 + .../examples/triangle/src/portable_triangle.nit | 138 ++++++++++++++++++++ 4 files changed, 237 insertions(+) create mode 100644 lib/gamnit/examples/triangle/art/icon.svg create mode 100644 lib/gamnit/examples/triangle/res/.gitignore create mode 100644 lib/gamnit/examples/triangle/src/portable_triangle.nit diff --git a/lib/gamnit/examples/triangle/Makefile b/lib/gamnit/examples/triangle/Makefile index e4490de..22172de 100644 --- a/lib/gamnit/examples/triangle/Makefile +++ b/lib/gamnit/examples/triangle/Makefile @@ -1,5 +1,21 @@ NITC=../../../../bin/nitc NITLS=../../../../bin/nitls +all: bin/standalone_triangle bin/triangle bin/triangle.apk + bin/standalone_triangle: $(shell ${NITLS} -M src/standalone_triangle.nit linux) ${NITC} ${NITC} src/standalone_triangle.nit -m linux -o $@ + +bin/triangle: $(shell ${NITLS} -M src/portable_triangle.nit linux) ${NITC} + ${NITC} src/portable_triangle.nit -m linux -o $@ + +check: bin/standalone_triangle bin/triangle + bin/standalone_triangle + bin/triangle + +android: bin/triangle.apk +bin/triangle.apk: $(shell ${NITLS} -M src/portable_triangle.nit android) ${NITC} res/drawable-hdpi/icon.png + ${NITC} src/portable_triangle.nit -m android -o $@ + +res/drawable-hdpi/icon.png: art/icon.svg + ../../../../contrib/inkscape_tools/bin/svg_to_icons --out res --android art/icon.svg diff --git a/lib/gamnit/examples/triangle/art/icon.svg b/lib/gamnit/examples/triangle/art/icon.svg new file mode 100644 index 0000000..26f7c04 --- /dev/null +++ b/lib/gamnit/examples/triangle/art/icon.svg @@ -0,0 +1,82 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/lib/gamnit/examples/triangle/res/.gitignore b/lib/gamnit/examples/triangle/res/.gitignore new file mode 100644 index 0000000..72e8ffc --- /dev/null +++ b/lib/gamnit/examples/triangle/res/.gitignore @@ -0,0 +1 @@ +* diff --git a/lib/gamnit/examples/triangle/src/portable_triangle.nit b/lib/gamnit/examples/triangle/src/portable_triangle.nit new file mode 100644 index 0000000..ac8e0e6 --- /dev/null +++ b/lib/gamnit/examples/triangle/src/portable_triangle.nit @@ -0,0 +1,138 @@ +# This file is part of NIT ( http://www.nitlanguage.org ). +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Portable example of using Gamnit with custom calls to OpenGL ES 2.0 +# +# References: +# * The book OpenGL ES 2.0 Programming Guide +# * https://code.google.com/p/opengles-book-samples/source/browse/trunk/LinuxX11/Chapter_2/Hello_Triangle/Hello_Triangle.c +module portable_triangle is + app_name "gamnit Triangle" + app_namespace "org.nitlanguage.triangle" + app_version(1, 0, git_revision) +end + +import gamnit + +redef class App + + # Our only program for the graphic card + var program: GLProgram is noautoinit + + # The only vertex sharder + var vertex_shader: GLVertexShader is noautoinit + + # The only fragment sharder + var fragment_shader: GLFragmentShader is noautoinit + + # Vertex data for the triangle + var vertex_array: VertexArray is noautoinit + + redef fun on_create + do + super + + var display = display + assert display != null + + print "Width: {display.width}" + print "Height: {display.height}" + + assert_no_gl_error + assert gl.shader_compiler else print "Cannot compile shaders" + + # GL program + program = new GLProgram + if not program.is_ok then + print "Program is not ok: {gl.error.to_s}\nLog:" + print program.info_log + abort + end + assert_no_gl_error + + # Vertex shader + vertex_shader = new GLVertexShader + assert vertex_shader.is_ok else print "Vertex shader is not ok: {gl.error}" + vertex_shader.source = """ + attribute vec4 vPosition; + void main() + { + gl_Position = vPosition; + } + """@glsl_vertex_shader.to_cstring + vertex_shader.compile + assert vertex_shader.is_compiled else print "Vertex shader compilation failed with: {vertex_shader.info_log} {program.info_log}" + assert_no_gl_error + + # Fragment shader + fragment_shader = new GLFragmentShader + assert fragment_shader.is_ok else print "Fragment shader is not ok: {gl.error}" + fragment_shader.source = """ + precision mediump float; + void main() + { + gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); + } + """@glsl_fragment_shader.to_cstring + fragment_shader.compile + assert fragment_shader.is_compiled else print "Fragment shader compilation failed with: {fragment_shader.info_log}" + assert_no_gl_error + + # Attach to program + program.attach_shader vertex_shader + program.attach_shader fragment_shader + program.bind_attrib_location(0, "vPosition") + program.link + assert program.is_linked else print "Linking failed: {program.info_log}" + assert_no_gl_error + + # Draw! + var vertices = [0.0, 0.5, 0.0, -0.5, -0.5, 0.0, 0.5, -0.5, 0.0] + vertex_array = new VertexArray(0, 3, vertices) + vertex_array.attrib_pointer + end + + redef fun frame_core + do + var display = display + if display != null then + gl.clear_color(0.5, 0.0, 0.5, 1.0) + + assert_no_gl_error + gl.viewport(0, 0, display.width, display.height) + gl.clear((new GLBuffer).color) + program.use + vertex_array.enable + + glDrawArrays(new GLDrawMode.triangles, 0, 3) + + display.flip + end + end + + redef fun on_stop + do + # Clean up + program.delete + vertex_shader.delete + fragment_shader.delete + + # Close gamnit + var display = display + if display != null then display.close + end +end + +if "NIT_TESTING".environ == "true" then exit(0) +super -- 1.7.9.5