24#include "pi_shaders.h" 
   28#ifdef USE_ANDROID_GLES2 
   34static const GLchar* color_tri_vertex_shader_source =
 
   35    "attribute vec2 position;\n" 
   36    "uniform mat4 MVMatrix;\n" 
   37    "uniform mat4 TransformMatrix;\n" 
   38    "uniform vec4 color;\n" 
   39    "varying vec4 fragColor;\n" 
   41    "   fragColor = color;\n" 
   42    "   gl_Position = MVMatrix * TransformMatrix * vec4(position, 0.0, 1.0);\n" 
   45static const GLchar* color_tri_fragment_shader_source =
 
   46    "precision lowp float;\n" 
   47    "varying vec4 fragColor;\n" 
   49    "   gl_FragColor = fragColor;\n" 
   53static const GLchar* colorv_tri_vertex_shader_source =
 
   54    "attribute vec2 position;\n" 
   55    "attribute vec4 colorv;\n" 
   56    "uniform mat4 MVMatrix;\n" 
   57    "uniform mat4 TransformMatrix;\n" 
   58    "varying vec4 fragColor;\n" 
   60    "   fragColor = colorv;\n" 
   61    "   gl_Position = MVMatrix * TransformMatrix * vec4(position, 0.0, 1.0);\n" 
   64static const GLchar* colorv_tri_fragment_shader_source =
 
   65    "precision lowp float;\n" 
   66    "varying vec4 fragColor;\n" 
   68    "   gl_FragColor = fragColor;\n" 
   72static const GLchar* texture_2D_vertex_shader_source =
 
   73    "attribute vec2 aPos;\n" 
   74    "attribute vec2 aUV;\n" 
   75    "uniform mat4 MVMatrix;\n" 
   76    "uniform mat4 TransformMatrix;\n" 
   77    "varying vec2 varCoord;\n" 
   79    "   gl_Position = MVMatrix * TransformMatrix * vec4(aPos, 0.0, 1.0);\n" 
   83static const GLchar* texture_2D_fragment_shader_source =
 
   84    "precision lowp float;\n" 
   85    "uniform sampler2D uTex;\n" 
   86    "varying vec2 varCoord;\n" 
   88    "   gl_FragColor = texture2D(uTex, varCoord);\n" 
   92static const GLchar* fade_texture_2D_vertex_shader_source =
 
   93    "precision highp float;\n" 
   94    "attribute vec2 aPos;\n" 
   95    "attribute vec2 aUV;\n" 
   96    "attribute vec2 aUV2;\n" 
   97    "uniform mat4 MVMatrix;\n" 
   98    "varying vec2 varCoord;\n" 
   99    "varying vec2 varCoord2;\n" 
  101    "   gl_Position = MVMatrix * vec4(aPos, 0.0, 1.0);\n" 
  102    "   varCoord = aUV.st;\n" 
  103    "   varCoord2 = aUV2.st;\n" 
  106static const GLchar* fade_texture_2D_fragment_shader_source =
 
  107    "precision highp float;\n" 
  108    "uniform sampler2D uTex;\n" 
  109    "uniform sampler2D uTex2;\n" 
  110    "uniform lowp float texAlpha;\n" 
  111    "varying vec2 varCoord;\n" 
  112    "varying vec2 varCoord2;\n" 
  114    "   mediump vec4 texColor = texture2D(uTex, varCoord);\n" 
  115    "   mediump vec4 texTwoColor = texture2D(uTex2, varCoord2);\n" 
  116    "   gl_FragColor = ((texTwoColor * (1.0 - texAlpha)) + (texColor * " 
  122static const GLchar* circle_filled_vertex_shader_source =
 
  123    "precision highplowp float;\n" 
  124    "attribute vec2 aPos;\n" 
  125    "uniform mat4 MVMatrix;\n" 
  126    "uniform mat4 TransformMatrix;\n" 
  128    "   gl_Position = MVMatrix * TransformMatrix * vec4(aPos, 0.0, 1.0);\n" 
  131static const GLchar* circle_filled_fragment_shader_source =
 
  132    "precision highp float;\n" 
  133    "uniform float border_width;\n" 
  134    "uniform float circle_radius;\n" 
  135    "uniform vec4 circle_color;\n" 
  136    "uniform vec4 border_color;\n" 
  137    "uniform vec2 circle_center;\n" 
  139    "float d = distance(gl_FragCoord.xy, circle_center);\n" 
  140    "if (d < (circle_radius - border_width)) { gl_FragColor = circle_color; }\n" 
  141    "else if (d < circle_radius) { gl_FragColor = border_color; }\n" 
  142    "else { gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0); }\n" 
  146static const GLchar* FBO_texture_2D_vertex_shader_source =
 
  147    "attribute vec2 aPos;\n" 
  148    "attribute vec2 aUV;\n" 
  149    "uniform mat4 MVMatrix;\n" 
  150    "varying vec2 varCoord;\n" 
  152    "   gl_Position = MVMatrix * vec4(aPos, 0.0, 1.0);\n" 
  156static const GLchar* FBO_texture_2D_fragment_shader_source =
 
  157    "precision lowp float;\n" 
  158    "uniform sampler2D uTex;\n" 
  159    "varying vec2 varCoord;\n" 
  161    "   gl_FragColor = texture2D(uTex, varCoord);\n" 
  164GLint pi_color_tri_fragment_shader;
 
  165GLint pi_color_tri_shader_program;
 
  166GLint pi_color_tri_vertex_shader;
 
  168GLint pi_colorv_tri_fragment_shader;
 
  169GLint pi_colorv_tri_shader_program;
 
  170GLint pi_colorv_tri_vertex_shader;
 
  172GLint pi_texture_2D_fragment_shader;
 
  173GLint pi_texture_2D_shader_program;
 
  174GLint pi_texture_2D_vertex_shader;
 
  180GLint pi_circle_filled_shader_program;
 
  181GLint pi_circle_filled_vertex_shader;
 
  182GLint pi_circle_filled_fragment_shader;
 
  188bool pi_loadShaders() {
 
  192  enum Consts { INFOLOG_LEN = 512 };
 
  193  GLchar infoLog[INFOLOG_LEN];
 
  199  if (!pi_color_tri_vertex_shader) {
 
  201    pi_color_tri_vertex_shader = glCreateShader(GL_VERTEX_SHADER);
 
  202    glShaderSource(pi_color_tri_vertex_shader, 1,
 
  203                   &color_tri_vertex_shader_source, NULL);
 
  204    glCompileShader(pi_color_tri_vertex_shader);
 
  205    glGetShaderiv(pi_color_tri_vertex_shader, GL_COMPILE_STATUS, &success);
 
  207      glGetShaderInfoLog(pi_color_tri_vertex_shader, INFOLOG_LEN, NULL,
 
  209      printf(
"ERROR::SHADER::VERTEX::COMPILATION_FAILED\n%s\n", infoLog);
 
  214  if (!pi_color_tri_fragment_shader) {
 
  216    pi_color_tri_fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
 
  217    glShaderSource(pi_color_tri_fragment_shader, 1,
 
  218                   &color_tri_fragment_shader_source, NULL);
 
  219    glCompileShader(pi_color_tri_fragment_shader);
 
  220    glGetShaderiv(pi_color_tri_fragment_shader, GL_COMPILE_STATUS, &success);
 
  222      glGetShaderInfoLog(pi_color_tri_fragment_shader, INFOLOG_LEN, NULL,
 
  224      printf(
"ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n%s\n", infoLog);
 
  229  if (!pi_color_tri_shader_program) {
 
  231    pi_color_tri_shader_program = glCreateProgram();
 
  232    glAttachShader(pi_color_tri_shader_program, pi_color_tri_fragment_shader);
 
  233    glAttachShader(pi_color_tri_shader_program, pi_color_tri_vertex_shader);
 
  234    glLinkProgram(pi_color_tri_shader_program);
 
  235    glGetProgramiv(pi_color_tri_shader_program, GL_LINK_STATUS, &success);
 
  237      glGetProgramInfoLog(pi_color_tri_shader_program, INFOLOG_LEN, NULL,
 
  239      printf(
"ERROR::SHADER::PROGRAM::LINKING_FAILED\n%s\n", infoLog);
 
  246  if (!pi_colorv_tri_vertex_shader) {
 
  248    pi_colorv_tri_vertex_shader = glCreateShader(GL_VERTEX_SHADER);
 
  249    glShaderSource(pi_colorv_tri_vertex_shader, 1,
 
  250                   &colorv_tri_vertex_shader_source, NULL);
 
  251    glCompileShader(pi_colorv_tri_vertex_shader);
 
  252    glGetShaderiv(pi_colorv_tri_vertex_shader, GL_COMPILE_STATUS, &success);
 
  254      glGetShaderInfoLog(pi_colorv_tri_vertex_shader, INFOLOG_LEN, NULL,
 
  256      printf(
"ERROR::SHADER::VERTEX::COMPILATION_FAILED\n%s\n", infoLog);
 
  261  if (!pi_colorv_tri_fragment_shader) {
 
  263    pi_colorv_tri_fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
 
  264    glShaderSource(pi_colorv_tri_fragment_shader, 1,
 
  265                   &colorv_tri_fragment_shader_source, NULL);
 
  266    glCompileShader(pi_colorv_tri_fragment_shader);
 
  267    glGetShaderiv(pi_colorv_tri_fragment_shader, GL_COMPILE_STATUS, &success);
 
  269      glGetShaderInfoLog(pi_colorv_tri_fragment_shader, INFOLOG_LEN, NULL,
 
  271      printf(
"ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n%s\n", infoLog);
 
  276  if (!pi_colorv_tri_shader_program) {
 
  278    pi_colorv_tri_shader_program = glCreateProgram();
 
  279    glAttachShader(pi_colorv_tri_shader_program, pi_colorv_tri_fragment_shader);
 
  280    glAttachShader(pi_colorv_tri_shader_program, pi_colorv_tri_vertex_shader);
 
  281    glLinkProgram(pi_colorv_tri_shader_program);
 
  282    glGetProgramiv(pi_colorv_tri_shader_program, GL_LINK_STATUS, &success);
 
  284      glGetProgramInfoLog(pi_colorv_tri_shader_program, INFOLOG_LEN, NULL,
 
  286      printf(
"ERROR::SHADER::PROGRAM::LINKING_FAILED\n%s\n", infoLog);
 
  293  if (!pi_texture_2D_vertex_shader) {
 
  295    pi_texture_2D_vertex_shader = glCreateShader(GL_VERTEX_SHADER);
 
  296    glShaderSource(pi_texture_2D_vertex_shader, 1,
 
  297                   &texture_2D_vertex_shader_source, NULL);
 
  298    glCompileShader(pi_texture_2D_vertex_shader);
 
  299    glGetShaderiv(pi_texture_2D_vertex_shader, GL_COMPILE_STATUS, &success);
 
  301      glGetShaderInfoLog(pi_texture_2D_vertex_shader, INFOLOG_LEN, NULL,
 
  303      printf(
"ERROR::SHADER::VERTEX::COMPILATION_FAILED\n%s\n", infoLog);
 
  308  if (!pi_texture_2D_fragment_shader) {
 
  310    pi_texture_2D_fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
 
  311    glShaderSource(pi_texture_2D_fragment_shader, 1,
 
  312                   &texture_2D_fragment_shader_source, NULL);
 
  313    glCompileShader(pi_texture_2D_fragment_shader);
 
  314    glGetShaderiv(pi_texture_2D_fragment_shader, GL_COMPILE_STATUS, &success);
 
  316      glGetShaderInfoLog(pi_texture_2D_fragment_shader, INFOLOG_LEN, NULL,
 
  318      printf(
"ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n%s\n", infoLog);
 
  323  if (!pi_texture_2D_shader_program) {
 
  325    pi_texture_2D_shader_program = glCreateProgram();
 
  326    glAttachShader(pi_texture_2D_shader_program, pi_texture_2D_vertex_shader);
 
  327    glAttachShader(pi_texture_2D_shader_program, pi_texture_2D_fragment_shader);
 
  328    glLinkProgram(pi_texture_2D_shader_program);
 
  329    glGetProgramiv(pi_texture_2D_shader_program, GL_LINK_STATUS, &success);
 
  331      glGetProgramInfoLog(pi_texture_2D_shader_program, INFOLOG_LEN, NULL,
 
  333      printf(
"ERROR::SHADER::PROGRAM::LINKING_FAILED\n%s\n", infoLog);
 
  341    if(!fade_texture_2D_vertex_shader){
 
  343        fade_texture_2D_vertex_shader = glCreateShader(GL_VERTEX_SHADER);
 
  344        glShaderSource(fade_texture_2D_vertex_shader, 1, &fade_texture_2D_vertex_shader_source, NULL);
 
  345        glCompileShader(fade_texture_2D_vertex_shader);
 
  346        glGetShaderiv(fade_texture_2D_vertex_shader, GL_COMPILE_STATUS, &success);
 
  348            glGetShaderInfoLog(fade_texture_2D_vertex_shader, INFOLOG_LEN, NULL, infoLog);
 
  349            printf(
"ERROR::SHADER::VERTEX::COMPILATION_FAILED\n%s\n", infoLog);
 
  354    if(!fade_texture_2D_fragment_shader){
 
  356        fade_texture_2D_fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
 
  357        glShaderSource(fade_texture_2D_fragment_shader, 1, &fade_texture_2D_fragment_shader_source, NULL);
 
  358        glCompileShader(fade_texture_2D_fragment_shader);
 
  359        glGetShaderiv(fade_texture_2D_fragment_shader, GL_COMPILE_STATUS, &success);
 
  361            glGetShaderInfoLog(fade_texture_2D_fragment_shader, INFOLOG_LEN, NULL, infoLog);
 
  362            printf(
"ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n%s\n", infoLog);
 
  367    if(!fade_texture_2D_shader_program){
 
  369        fade_texture_2D_shader_program = glCreateProgram();
 
  370        glAttachShader(fade_texture_2D_shader_program, fade_texture_2D_vertex_shader);
 
  371        glAttachShader(fade_texture_2D_shader_program, fade_texture_2D_fragment_shader);
 
  372        glLinkProgram(fade_texture_2D_shader_program);
 
  373        glGetProgramiv(fade_texture_2D_shader_program, GL_LINK_STATUS, &success);
 
  375            glGetProgramInfoLog(fade_texture_2D_shader_program, INFOLOG_LEN, NULL, infoLog);
 
  376            printf(
"ERROR::SHADER::PROGRAM::LINKING_FAILED\n%s\n", infoLog);
 
  383  if (!pi_circle_filled_vertex_shader) {
 
  385    pi_circle_filled_vertex_shader = glCreateShader(GL_VERTEX_SHADER);
 
  386    glShaderSource(pi_circle_filled_vertex_shader, 1,
 
  387                   &circle_filled_vertex_shader_source, NULL);
 
  388    glCompileShader(pi_circle_filled_vertex_shader);
 
  389    glGetShaderiv(pi_circle_filled_vertex_shader, GL_COMPILE_STATUS, &success);
 
  391      glGetShaderInfoLog(pi_circle_filled_vertex_shader, INFOLOG_LEN, NULL,
 
  393      printf(
"ERROR::SHADER::VERTEX::COMPILATION_FAILED\n%s\n", infoLog);
 
  399  if (!pi_circle_filled_fragment_shader) {
 
  401    pi_circle_filled_fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
 
  402    glShaderSource(pi_circle_filled_fragment_shader, 1,
 
  403                   &circle_filled_fragment_shader_source, NULL);
 
  404    glCompileShader(pi_circle_filled_fragment_shader);
 
  405    glGetShaderiv(pi_circle_filled_fragment_shader, GL_COMPILE_STATUS,
 
  408      glGetShaderInfoLog(pi_circle_filled_fragment_shader, INFOLOG_LEN, NULL,
 
  410      printf(
"ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n%s\n", infoLog);
 
  416  if (!pi_circle_filled_shader_program) {
 
  418    pi_circle_filled_shader_program = glCreateProgram();
 
  419    glAttachShader(pi_circle_filled_shader_program,
 
  420                   pi_circle_filled_vertex_shader);
 
  421    glAttachShader(pi_circle_filled_shader_program,
 
  422                   pi_circle_filled_fragment_shader);
 
  423    glLinkProgram(pi_circle_filled_shader_program);
 
  424    glGetProgramiv(pi_circle_filled_shader_program, GL_LINK_STATUS, &success);
 
  426      glGetProgramInfoLog(pi_circle_filled_shader_program, INFOLOG_LEN, NULL,
 
  428      printf(
"ERROR::SHADER::PROGRAM::LINKING_FAILED\n%s\n", infoLog);
 
  437    if(!FBO_texture_2D_vertex_shader){
 
  439        FBO_texture_2D_vertex_shader = glCreateShader(GL_VERTEX_SHADER);
 
  440        glShaderSource(FBO_texture_2D_vertex_shader, 1, &FBO_texture_2D_vertex_shader_source, NULL);
 
  441        glCompileShader(FBO_texture_2D_vertex_shader);
 
  442        glGetShaderiv(FBO_texture_2D_vertex_shader, GL_COMPILE_STATUS, &success);
 
  444            glGetShaderInfoLog(FBO_texture_2D_vertex_shader, INFOLOG_LEN, NULL, infoLog);
 
  445            printf(
"ERROR::SHADER::VERTEX::COMPILATION_FAILED\n%s\n", infoLog);
 
  450    if(!FBO_texture_2D_fragment_shader){
 
  452        FBO_texture_2D_fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
 
  453        glShaderSource(FBO_texture_2D_fragment_shader, 1, &FBO_texture_2D_fragment_shader_source, NULL);
 
  454        glCompileShader(FBO_texture_2D_fragment_shader);
 
  455        glGetShaderiv(FBO_texture_2D_fragment_shader, GL_COMPILE_STATUS, &success);
 
  457            glGetShaderInfoLog(FBO_texture_2D_fragment_shader, INFOLOG_LEN, NULL, infoLog);
 
  458            printf(
"ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n%s\n", infoLog);
 
  463    if(!FBO_texture_2D_shader_program){
 
  465        FBO_texture_2D_shader_program = glCreateProgram();
 
  466        glAttachShader(FBO_texture_2D_shader_program, FBO_texture_2D_vertex_shader);
 
  467        glAttachShader(FBO_texture_2D_shader_program, FBO_texture_2D_fragment_shader);
 
  468        glLinkProgram(FBO_texture_2D_shader_program);
 
  469        glGetProgramiv(FBO_texture_2D_shader_program, GL_LINK_STATUS, &success);
 
  471            glGetProgramInfoLog(FBO_texture_2D_shader_program, INFOLOG_LEN, NULL, infoLog);
 
  472            printf(
"ERROR::SHADER::PROGRAM::LINKING_FAILED\n%s\n", infoLog);
 
  482void configureShaders(
float width, 
float height) {
 
  484  float vp_transform[16];
 
  487  mat4x4_scale_aniso((
float(*)[4])vp_transform, m, 2.0 / width, -2.0 / height,
 
  489  mat4x4_translate_in_place((
float(*)[4])vp_transform, -width / 2, -height / 2,
 
  495  glUseProgram(pi_color_tri_shader_program);
 
  496  GLint matloc = glGetUniformLocation(pi_color_tri_shader_program, 
"MVMatrix");
 
  497  glUniformMatrix4fv(matloc, 1, GL_FALSE, (
const GLfloat*)vp_transform);
 
  499      glGetUniformLocation(pi_color_tri_shader_program, 
"TransformMatrix");
 
  500  glUniformMatrix4fv(transloc, 1, GL_FALSE, (
const GLfloat*)I);
 
  504  glUseProgram(pi_circle_filled_shader_program);
 
  505  matloc = glGetUniformLocation(pi_circle_filled_shader_program, 
"MVMatrix");
 
  506  glUniformMatrix4fv(matloc, 1, GL_FALSE, (
const GLfloat*)vp_transform);
 
  508      glGetUniformLocation(pi_circle_filled_shader_program, 
"TransformMatrix");
 
  509  glUniformMatrix4fv(transloc, 1, GL_FALSE, (
const GLfloat*)I);
 
  513  glUseProgram(pi_texture_2D_shader_program);
 
  514  matloc = glGetUniformLocation(pi_texture_2D_shader_program, 
"MVMatrix");
 
  515  glUniformMatrix4fv(matloc, 1, GL_FALSE, (
const GLfloat*)vp_transform);
 
  517      glGetUniformLocation(pi_texture_2D_shader_program, 
"TransformMatrix");
 
  518  glUniformMatrix4fv(transloc, 1, GL_FALSE, (
const GLfloat*)I);
 
  522  glUseProgram(pi_colorv_tri_shader_program);
 
  523  matloc = glGetUniformLocation(pi_colorv_tri_shader_program, 
"MVMatrix");
 
  524  glUniformMatrix4fv(matloc, 1, GL_FALSE, (
const GLfloat*)vp_transform);
 
  526      glGetUniformLocation(pi_colorv_tri_shader_program, 
"TransformMatrix");
 
  527  glUniformMatrix4fv(transloc, 1, GL_FALSE, (
const GLfloat*)I);