/* * Copyright © 2013 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * Author: Daniel van Vugt */ #include "eglapp.h" #include #include #include static GLuint load_shader(const char *src, GLenum type) { GLuint shader = glCreateShader(type); if (shader) { GLint compiled; glShaderSource(shader, 1, &src, NULL); glCompileShader(shader); glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled); if (!compiled) { GLchar log[1024]; glGetShaderInfoLog(shader, sizeof log - 1, NULL, log); log[sizeof log - 1] = '\0'; printf("load_shader compile failed: %s\n", log); glDeleteShader(shader); shader = 0; } } return shader; } /* Colours from http://design.ubuntu.com/brand/colour-palette */ #define MID_AUBERGINE(x) (x)*0.368627451f, (x)*0.152941176f, (x)*0.31372549f #define ORANGE 0.866666667f, 0.282352941f, 0.141414141f int main(int argc, char *argv[]) { const char vshadersrc[] = "attribute vec4 vPosition; \n" "uniform float theta; \n" "void main() \n" "{ \n" " float c = cos(theta); \n" " float s = sin(theta); \n" " mat2 m; \n" " m[0] = vec2(c, s); \n" " m[1] = vec2(-s, c); \n" " vec2 p = m * vec2(vPosition); \n" " gl_Position = vec4(p, 0.0, 1.0); \n" "} \n"; const char fshadersrc[] = "precision mediump float; \n" "uniform vec4 col; \n" "void main() \n" "{ \n" " gl_FragColor = col; \n" "} \n"; const GLfloat vertices[] = { 0.0f, 1.0f, -1.0f,-0.866f, 1.0f,-0.866f, }; GLuint vshader, fshader, prog; GLint linked, col, vpos, theta; unsigned int width = 512, height = 512; GLfloat angle = 0.0f; if (!mir_eglapp_init(argc, argv, &width, &height)) return 1; vshader = load_shader(vshadersrc, GL_VERTEX_SHADER); assert(vshader); fshader = load_shader(fshadersrc, GL_FRAGMENT_SHADER); assert(fshader); prog = glCreateProgram(); assert(prog); glAttachShader(prog, vshader); glAttachShader(prog, fshader); glLinkProgram(prog); glGetProgramiv(prog, GL_LINK_STATUS, &linked); if (!linked) { GLchar log[1024]; glGetProgramInfoLog(prog, sizeof log - 1, NULL, log); log[sizeof log - 1] = '\0'; printf("Link failed: %s\n", log); return 2; } float const opacity = mir_eglapp_background_opacity; glClearColor(MID_AUBERGINE(opacity), opacity); glViewport(0, 0, width, height); glUseProgram(prog); vpos = glGetAttribLocation(prog, "vPosition"); col = glGetUniformLocation(prog, "col"); theta = glGetUniformLocation(prog, "theta"); glUniform4f(col, ORANGE, 1.0f); glVertexAttribPointer(vpos, 2, GL_FLOAT, GL_FALSE, 0, vertices); glEnableVertexAttribArray(0); while (mir_eglapp_running()) { glClear(GL_COLOR_BUFFER_BIT); glUniform1f(theta, angle); angle += 0.02f; glDrawArrays(GL_TRIANGLES, 0, 3); mir_eglapp_swap_buffers(); } mir_eglapp_shutdown(); return 0; }