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);