/*
* 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 DARK_AUBERGINE 0.17254902f, 0.0f, 0.117647059f
#define MID_AUBERGINE 0.368627451f, 0.152941176f, 0.31372549f
#define ORANGE 0.866666667f, 0.282352941f, 0.141414141f
int main(int argc, char *argv[])
{
const char vshadersrc[] =
"attribute vec4 vPosition; \n"
"varying vec2 texcoord; \n"
"void main() \n"
"{ \n"
" gl_Position = vPosition; \n"
" texcoord = vec2(vPosition) * vec2(0.5) + vec2(0.5); \n"
"} \n";
const char fshadersrc[] =
"precision mediump float; \n"
"uniform float theta; \n"
"varying vec2 texcoord; \n"
"uniform vec3 low_color, high_color; \n"
" \n"
"vec3 gradient(float x) \n"
"{ \n"
" vec3 col; \n"
" const vec3 white = vec3(1.0, 1.0, 1.0); \n"
" if (x < 0.333) \n"
" col = x * low_color / 0.333; \n"
" else if (x < 0.666) \n"
" col = (x - 0.333) * (high_color - low_color) / \n"
" 0.333 + low_color; \n"
" else \n"
" col = (x - 0.666) * (white - high_color) / \n"
" 0.333 + high_color; \n"
" return col; \n"
"} \n"
" \n"
"void main() \n"
"{ \n"
" const float pi2 = 6.283185308; \n"
" float u = texcoord.x * pi2; \n"
" float v = texcoord.y * pi2; \n"
" float us = (cos(1.1 * u + 7.0 * theta) + \n"
" cos(2.3 * v * cos(1.0 * theta)) + \n"
" cos(0.3 * u * cos(3.0 * theta)) \n"
" ) / 3.0; \n"
" float vs = (cos(2.3 * v + 8.0 * theta) + \n"
" cos(1.3 * u * cos(3.0 * theta)) + \n"
" cos(1.7 * v * cos(2.0 * theta)) \n"
" ) / 3.0; \n"
" float x = (us * vs + 1.0) / 2.0; \n"
" gl_FragColor = vec4(gradient(x), 1.0); \n"
"} \n";
const GLfloat vertices[] =
{
-1.0f, 1.0f,
1.0f, 1.0f,
1.0f,-1.0f,
-1.0f,-1.0f,
};
const float pi2 = 6.283185308f;
GLuint vshader, fshader, prog;
GLint linked, low_color, high_color, vpos, theta;
unsigned int width = 0, height = 0;
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;
}
glViewport(0, 0, width, height);
glUseProgram(prog);
vpos = glGetAttribLocation(prog, "vPosition");
low_color = glGetUniformLocation(prog, "low_color");
high_color = glGetUniformLocation(prog, "high_color");
theta = glGetUniformLocation(prog, "theta");
glUniform3f(low_color, DARK_AUBERGINE);
glUniform3f(high_color, ORANGE);
glVertexAttribPointer(vpos, 2, GL_FLOAT, GL_FALSE, 0, vertices);
glEnableVertexAttribArray(0);
while (mir_eglapp_running())
{
glUniform1f(theta, angle);
angle += 0.005f;
if (angle > pi2)
angle -= pi2;
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
mir_eglapp_swap_buffers();
}
mir_eglapp_shutdown();
return 0;
}