23#include "pi_shaders.h"
27#ifdef USE_ANDROID_GLES2
32#ifdef USE_ANDROID_GLES2
33const GLchar* PI_shader_preamble =
"\n";
35const GLchar* PI_shader_preamble =
45static const GLchar* color_tri_vertex_shader_source =
46 "attribute vec2 position;\n"
47 "uniform mat4 MVMatrix;\n"
48 "uniform mat4 TransformMatrix;\n"
49 "uniform vec4 color;\n"
50 "varying vec4 fragColor;\n"
52 " fragColor = color;\n"
53 " gl_Position = MVMatrix * TransformMatrix * vec4(position, 0.0, 1.0);\n"
56static const GLchar* color_tri_fragment_shader_source =
57 "precision lowp float;\n"
58 "varying vec4 fragColor;\n"
60 " gl_FragColor = fragColor;\n"
64static const GLchar* colorv_tri_vertex_shader_source =
65 "attribute vec2 position;\n"
66 "attribute vec4 colorv;\n"
67 "uniform mat4 MVMatrix;\n"
68 "uniform mat4 TransformMatrix;\n"
69 "varying vec4 fragColor;\n"
71 " fragColor = colorv;\n"
72 " gl_Position = MVMatrix * TransformMatrix * vec4(position, 0.0, 1.0);\n"
75static const GLchar* colorv_tri_fragment_shader_source =
76 "precision lowp float;\n"
77 "varying vec4 fragColor;\n"
79 " gl_FragColor = fragColor;\n"
83static const GLchar* texture_2D_vertex_shader_source =
84 "attribute vec2 aPos;\n"
85 "attribute vec2 aUV;\n"
86 "uniform mat4 MVMatrix;\n"
87 "uniform mat4 TransformMatrix;\n"
88 "varying vec2 varCoord;\n"
90 " gl_Position = MVMatrix * TransformMatrix * vec4(aPos, 0.0, 1.0);\n"
94static const GLchar* texture_2D_fragment_shader_source =
95 "precision lowp float;\n"
96 "uniform sampler2D uTex;\n"
97 "varying vec2 varCoord;\n"
99 " gl_FragColor = texture2D(uTex, varCoord);\n"
103static const GLchar* fade_texture_2D_vertex_shader_source =
104 "precision highp float;\n"
105 "attribute vec2 aPos;\n"
106 "attribute vec2 aUV;\n"
107 "attribute vec2 aUV2;\n"
108 "uniform mat4 MVMatrix;\n"
109 "varying vec2 varCoord;\n"
110 "varying vec2 varCoord2;\n"
112 " gl_Position = MVMatrix * vec4(aPos, 0.0, 1.0);\n"
113 " varCoord = aUV.st;\n"
114 " varCoord2 = aUV2.st;\n"
117static const GLchar* fade_texture_2D_fragment_shader_source =
118 "precision highp float;\n"
119 "uniform sampler2D uTex;\n"
120 "uniform sampler2D uTex2;\n"
121 "uniform lowp float texAlpha;\n"
122 "varying vec2 varCoord;\n"
123 "varying vec2 varCoord2;\n"
125 " mediump vec4 texColor = texture2D(uTex, varCoord);\n"
126 " mediump vec4 texTwoColor = texture2D(uTex2, varCoord2);\n"
127 " gl_FragColor = ((texTwoColor * (1.0 - texAlpha)) + (texColor * "
133static const GLchar* circle_filled_vertex_shader_source =
134 "precision highp float;\n"
135 "attribute vec2 aPos;\n"
136 "uniform mat4 MVMatrix;\n"
137 "uniform mat4 TransformMatrix;\n"
139 " gl_Position = MVMatrix * TransformMatrix * vec4(aPos, 0.0, 1.0);\n"
142static const GLchar* circle_filled_fragment_shader_source =
143 "precision highp float;\n"
144 "uniform float border_width;\n"
145 "uniform float circle_radius;\n"
146 "uniform vec4 circle_color;\n"
147 "uniform vec4 border_color;\n"
148 "uniform vec2 circle_center;\n"
150 "float d = distance(gl_FragCoord.xy, circle_center);\n"
151 "if (d < (circle_radius - border_width)) { gl_FragColor = circle_color; }\n"
152 "else if (d < circle_radius) { gl_FragColor = border_color; }\n"
153 "else { gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0); }\n"
157static const GLchar* FBO_texture_2D_vertex_shader_source =
158 "attribute vec2 aPos;\n"
159 "attribute vec2 aUV;\n"
160 "uniform mat4 MVMatrix;\n"
161 "varying vec2 varCoord;\n"
163 " gl_Position = MVMatrix * vec4(aPos, 0.0, 1.0);\n"
167static const GLchar* FBO_texture_2D_fragment_shader_source =
168 "precision lowp float;\n"
169 "uniform sampler2D uTex;\n"
170 "varying vec2 varCoord;\n"
172 " gl_FragColor = texture2D(uTex, varCoord);\n"
175GLint pi_color_tri_fragment_shader;
176GLint GRIBpi_color_tri_shader_program;
177GLint pi_color_tri_vertex_shader;
179GLint pi_colorv_tri_fragment_shader;
180GLint GRIBpi_colorv_tri_shader_program;
181GLint pi_colorv_tri_vertex_shader;
183GLint pi_texture_2D_fragment_shader;
184GLint pi_texture_2D_shader_program;
185GLint pi_texture_2D_vertex_shader;
191GLint pi_circle_filled_shader_program;
192GLint pi_circle_filled_vertex_shader;
193GLint pi_circle_filled_fragment_shader;
199bool pi_loadShaders() {
203 enum Consts { INFOLOG_LEN = 512 };
204 GLchar infoLog[INFOLOG_LEN];
210 if (!GRIBpi_color_tri_shader_program) {
213 .addShaderFromSource(color_tri_vertex_shader_source,
215 .addShaderFromSource(color_tri_fragment_shader_source,
219 GRIBpi_color_tri_shader_program = shaderProgram.programId();
223 if (!pi_color_tri_vertex_shader) {
225 pi_color_tri_vertex_shader = glCreateShader(GL_VERTEX_SHADER);
226 glShaderSource(pi_color_tri_vertex_shader, 1,
227 &color_tri_vertex_shader_source,
nullptr);
228 glCompileShader(pi_color_tri_vertex_shader);
229 glGetShaderiv(pi_color_tri_vertex_shader, GL_COMPILE_STATUS, &success);
231 glGetShaderInfoLog(pi_color_tri_vertex_shader, INFOLOG_LEN,
nullptr,
233 printf(
"ERROR::SHADER::VERTEX::COMPILATION_FAILED\n%s\n", infoLog);
238 if (!pi_color_tri_fragment_shader) {
240 pi_color_tri_fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
241 glShaderSource(pi_color_tri_fragment_shader, 1,
242 &color_tri_fragment_shader_source,
nullptr);
243 glCompileShader(pi_color_tri_fragment_shader);
244 glGetShaderiv(pi_color_tri_fragment_shader, GL_COMPILE_STATUS, &success);
246 glGetShaderInfoLog(pi_color_tri_fragment_shader, INFOLOG_LEN,
nullptr,
248 printf(
"ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n%s\n", infoLog);
253 if (!pi_color_tri_shader_program) {
255 pi_color_tri_shader_program = glCreateProgram();
256 glAttachShader(pi_color_tri_shader_program, pi_color_tri_fragment_shader);
257 glAttachShader(pi_color_tri_shader_program, pi_color_tri_vertex_shader);
258 glLinkProgram(pi_color_tri_shader_program);
259 glGetProgramiv(pi_color_tri_shader_program, GL_LINK_STATUS, &success);
261 glGetProgramInfoLog(pi_color_tri_shader_program, INFOLOG_LEN,
nullptr,
263 printf(
"ERROR::SHADER::PROGRAM::LINKING_FAILED\n%s\n", infoLog);
270 if (!GRIBpi_colorv_tri_shader_program) {
273 .addShaderFromSource(colorv_tri_vertex_shader_source,
275 .addShaderFromSource(colorv_tri_fragment_shader_source,
279 GRIBpi_colorv_tri_shader_program = shaderProgram.programId();
283 if (!pi_colorv_tri_vertex_shader) {
285 pi_colorv_tri_vertex_shader = glCreateShader(GL_VERTEX_SHADER);
286 glShaderSource(pi_colorv_tri_vertex_shader, 1,
287 &colorv_tri_vertex_shader_source,
nullptr);
288 glCompileShader(pi_colorv_tri_vertex_shader);
289 glGetShaderiv(pi_colorv_tri_vertex_shader, GL_COMPILE_STATUS, &success);
291 glGetShaderInfoLog(pi_colorv_tri_vertex_shader, INFOLOG_LEN,
nullptr,
293 printf(
"ERROR::SHADER::VERTEX::COMPILATION_FAILED\n%s\n", infoLog);
298 if (!pi_colorv_tri_fragment_shader) {
300 pi_colorv_tri_fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
301 glShaderSource(pi_colorv_tri_fragment_shader, 1,
302 &colorv_tri_fragment_shader_source,
nullptr);
303 glCompileShader(pi_colorv_tri_fragment_shader);
304 glGetShaderiv(pi_colorv_tri_fragment_shader, GL_COMPILE_STATUS, &success);
306 glGetShaderInfoLog(pi_colorv_tri_fragment_shader, INFOLOG_LEN,
nullptr,
308 printf(
"ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n%s\n", infoLog);
313 if (!pi_colorv_tri_shader_program) {
315 pi_colorv_tri_shader_program = glCreateProgram();
316 glAttachShader(pi_colorv_tri_shader_program, pi_colorv_tri_fragment_shader);
317 glAttachShader(pi_colorv_tri_shader_program, pi_colorv_tri_vertex_shader);
318 glLinkProgram(pi_colorv_tri_shader_program);
319 glGetProgramiv(pi_colorv_tri_shader_program, GL_LINK_STATUS, &success);
321 glGetProgramInfoLog(pi_colorv_tri_shader_program, INFOLOG_LEN,
nullptr,
323 printf(
"ERROR::SHADER::PROGRAM::LINKING_FAILED\n%s\n", infoLog);
330 if (!pi_texture_2D_shader_program) {
333 .addShaderFromSource(texture_2D_vertex_shader_source,
335 .addShaderFromSource(texture_2D_fragment_shader_source,
339 pi_texture_2D_shader_program = shaderProgram.programId();
343 if (!pi_texture_2D_vertex_shader) {
345 pi_texture_2D_vertex_shader = glCreateShader(GL_VERTEX_SHADER);
346 glShaderSource(pi_texture_2D_vertex_shader, 1,
347 &texture_2D_vertex_shader_source,
nullptr);
348 glCompileShader(pi_texture_2D_vertex_shader);
349 glGetShaderiv(pi_texture_2D_vertex_shader, GL_COMPILE_STATUS, &success);
351 glGetShaderInfoLog(pi_texture_2D_vertex_shader, INFOLOG_LEN,
nullptr,
353 printf(
"ERROR::SHADER::VERTEX::COMPILATION_FAILED\n%s\n", infoLog);
358 if (!pi_texture_2D_fragment_shader) {
360 pi_texture_2D_fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
361 glShaderSource(pi_texture_2D_fragment_shader, 1,
362 &texture_2D_fragment_shader_source,
nullptr);
363 glCompileShader(pi_texture_2D_fragment_shader);
364 glGetShaderiv(pi_texture_2D_fragment_shader, GL_COMPILE_STATUS, &success);
366 glGetShaderInfoLog(pi_texture_2D_fragment_shader, INFOLOG_LEN,
nullptr,
368 printf(
"ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n%s\n", infoLog);
373 if (!pi_texture_2D_shader_program) {
375 pi_texture_2D_shader_program = glCreateProgram();
376 glAttachShader(pi_texture_2D_shader_program, pi_texture_2D_vertex_shader);
377 glAttachShader(pi_texture_2D_shader_program, pi_texture_2D_fragment_shader);
378 glLinkProgram(pi_texture_2D_shader_program);
379 glGetProgramiv(pi_texture_2D_shader_program, GL_LINK_STATUS, &success);
381 glGetProgramInfoLog(pi_texture_2D_shader_program, INFOLOG_LEN,
nullptr,
383 printf(
"ERROR::SHADER::PROGRAM::LINKING_FAILED\n%s\n", infoLog);
392 if(!fade_texture_2D_vertex_shader){
394 fade_texture_2D_vertex_shader = glCreateShader(GL_VERTEX_SHADER);
395 glShaderSource(fade_texture_2D_vertex_shader, 1, &fade_texture_2D_vertex_shader_source,
nullptr);
396 glCompileShader(fade_texture_2D_vertex_shader);
397 glGetShaderiv(fade_texture_2D_vertex_shader, GL_COMPILE_STATUS, &success);
399 glGetShaderInfoLog(fade_texture_2D_vertex_shader, INFOLOG_LEN,
nullptr, infoLog);
400 printf(
"ERROR::SHADER::VERTEX::COMPILATION_FAILED\n%s\n", infoLog);
405 if(!fade_texture_2D_fragment_shader){
407 fade_texture_2D_fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
408 glShaderSource(fade_texture_2D_fragment_shader, 1, &fade_texture_2D_fragment_shader_source,
nullptr);
409 glCompileShader(fade_texture_2D_fragment_shader);
410 glGetShaderiv(fade_texture_2D_fragment_shader, GL_COMPILE_STATUS, &success);
412 glGetShaderInfoLog(fade_texture_2D_fragment_shader, INFOLOG_LEN,
nullptr, infoLog);
413 printf(
"ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n%s\n", infoLog);
418 if(!fade_texture_2D_shader_program){
420 fade_texture_2D_shader_program = glCreateProgram();
421 glAttachShader(fade_texture_2D_shader_program, fade_texture_2D_vertex_shader);
422 glAttachShader(fade_texture_2D_shader_program, fade_texture_2D_fragment_shader);
423 glLinkProgram(fade_texture_2D_shader_program);
424 glGetProgramiv(fade_texture_2D_shader_program, GL_LINK_STATUS, &success);
426 glGetProgramInfoLog(fade_texture_2D_shader_program, INFOLOG_LEN,
nullptr, infoLog);
427 printf(
"ERROR::SHADER::PROGRAM::LINKING_FAILED\n%s\n", infoLog);
435 if (!pi_circle_filled_shader_program) {
438 .addShaderFromSource(circle_filled_vertex_shader_source,
440 .addShaderFromSource(circle_filled_fragment_shader_source,
444 pi_circle_filled_shader_program = shaderProgram.programId();
448 if (!pi_circle_filled_vertex_shader) {
450 pi_circle_filled_vertex_shader = glCreateShader(GL_VERTEX_SHADER);
451 glShaderSource(pi_circle_filled_vertex_shader, 1,
452 &circle_filled_vertex_shader_source,
nullptr);
453 glCompileShader(pi_circle_filled_vertex_shader);
454 glGetShaderiv(pi_circle_filled_vertex_shader, GL_COMPILE_STATUS, &success);
456 glGetShaderInfoLog(pi_circle_filled_vertex_shader, INFOLOG_LEN,
nullptr,
458 printf(
"ERROR::SHADER::VERTEX::COMPILATION_FAILED\n%s\n", infoLog);
464 if (!pi_circle_filled_fragment_shader) {
466 pi_circle_filled_fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
467 glShaderSource(pi_circle_filled_fragment_shader, 1,
468 &circle_filled_fragment_shader_source,
nullptr);
469 glCompileShader(pi_circle_filled_fragment_shader);
470 glGetShaderiv(pi_circle_filled_fragment_shader, GL_COMPILE_STATUS,
473 glGetShaderInfoLog(pi_circle_filled_fragment_shader, INFOLOG_LEN,
nullptr,
475 printf(
"ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n%s\n", infoLog);
481 if (!pi_circle_filled_shader_program) {
483 pi_circle_filled_shader_program = glCreateProgram();
484 glAttachShader(pi_circle_filled_shader_program,
485 pi_circle_filled_vertex_shader);
486 glAttachShader(pi_circle_filled_shader_program,
487 pi_circle_filled_fragment_shader);
488 glLinkProgram(pi_circle_filled_shader_program);
489 glGetProgramiv(pi_circle_filled_shader_program, GL_LINK_STATUS, &success);
491 glGetProgramInfoLog(pi_circle_filled_shader_program, INFOLOG_LEN,
nullptr,
493 printf(
"ERROR::SHADER::PROGRAM::LINKING_FAILED\n%s\n", infoLog);
503 if(!FBO_texture_2D_vertex_shader){
505 FBO_texture_2D_vertex_shader = glCreateShader(GL_VERTEX_SHADER);
506 glShaderSource(FBO_texture_2D_vertex_shader, 1, &FBO_texture_2D_vertex_shader_source,
nullptr);
507 glCompileShader(FBO_texture_2D_vertex_shader);
508 glGetShaderiv(FBO_texture_2D_vertex_shader, GL_COMPILE_STATUS, &success);
510 glGetShaderInfoLog(FBO_texture_2D_vertex_shader, INFOLOG_LEN,
nullptr, infoLog);
511 printf(
"ERROR::SHADER::VERTEX::COMPILATION_FAILED\n%s\n", infoLog);
516 if(!FBO_texture_2D_fragment_shader){
518 FBO_texture_2D_fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
519 glShaderSource(FBO_texture_2D_fragment_shader, 1, &FBO_texture_2D_fragment_shader_source,
nullptr);
520 glCompileShader(FBO_texture_2D_fragment_shader);
521 glGetShaderiv(FBO_texture_2D_fragment_shader, GL_COMPILE_STATUS, &success);
523 glGetShaderInfoLog(FBO_texture_2D_fragment_shader, INFOLOG_LEN,
nullptr, infoLog);
524 printf(
"ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n%s\n", infoLog);
529 if(!FBO_texture_2D_shader_program){
531 FBO_texture_2D_shader_program = glCreateProgram();
532 glAttachShader(FBO_texture_2D_shader_program, FBO_texture_2D_vertex_shader);
533 glAttachShader(FBO_texture_2D_shader_program, FBO_texture_2D_fragment_shader);
534 glLinkProgram(FBO_texture_2D_shader_program);
535 glGetProgramiv(FBO_texture_2D_shader_program, GL_LINK_STATUS, &success);
537 glGetProgramInfoLog(FBO_texture_2D_shader_program, INFOLOG_LEN,
nullptr, infoLog);
538 printf(
"ERROR::SHADER::PROGRAM::LINKING_FAILED\n%s\n", infoLog);
548void configureShaders(
float width,
float height) {
550 float vp_transform[16];
553 mat4x4_scale_aniso((
float(*)[4])vp_transform, m, 2.0 / width, -2.0 / height,
555 mat4x4_translate_in_place((
float(*)[4])vp_transform, -width / 2, -height / 2,
561 glUseProgram(GRIBpi_color_tri_shader_program);
563 glGetUniformLocation(GRIBpi_color_tri_shader_program,
"MVMatrix");
564 glUniformMatrix4fv(matloc, 1, GL_FALSE, (
const GLfloat*)vp_transform);
566 glGetUniformLocation(GRIBpi_color_tri_shader_program,
"TransformMatrix");
567 glUniformMatrix4fv(transloc, 1, GL_FALSE, (
const GLfloat*)I);
571 glUseProgram(pi_circle_filled_shader_program);
572 matloc = glGetUniformLocation(pi_circle_filled_shader_program,
"MVMatrix");
573 glUniformMatrix4fv(matloc, 1, GL_FALSE, (
const GLfloat*)vp_transform);
575 glGetUniformLocation(pi_circle_filled_shader_program,
"TransformMatrix");
576 glUniformMatrix4fv(transloc, 1, GL_FALSE, (
const GLfloat*)I);
580 glUseProgram(pi_texture_2D_shader_program);
581 matloc = glGetUniformLocation(pi_texture_2D_shader_program,
"MVMatrix");
582 glUniformMatrix4fv(matloc, 1, GL_FALSE, (
const GLfloat*)vp_transform);
584 glGetUniformLocation(pi_texture_2D_shader_program,
"TransformMatrix");
585 glUniformMatrix4fv(transloc, 1, GL_FALSE, (
const GLfloat*)I);
589 glUseProgram(GRIBpi_colorv_tri_shader_program);
590 matloc = glGetUniformLocation(GRIBpi_colorv_tri_shader_program,
"MVMatrix");
591 glUniformMatrix4fv(matloc, 1, GL_FALSE, (
const GLfloat*)vp_transform);
593 glGetUniformLocation(GRIBpi_colorv_tri_shader_program,
"TransformMatrix");
594 glUniformMatrix4fv(transloc, 1, GL_FALSE, (
const GLfloat*)I);