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];
208#if defined(__linux__) && defined(__OCPN_USE_GLEW__) && \
209 !defined(__ANDROID__) && !defined(__WXOSX)
210 auto GLEW_test = glCreateProgram;
211 if (!GLEW_test) glewInit();
218 if (!GRIBpi_color_tri_shader_program) {
221 .addShaderFromSource(color_tri_vertex_shader_source,
223 .addShaderFromSource(color_tri_fragment_shader_source,
227 GRIBpi_color_tri_shader_program = shaderProgram.programId();
231 if (!pi_color_tri_vertex_shader) {
233 pi_color_tri_vertex_shader = glCreateShader(GL_VERTEX_SHADER);
234 glShaderSource(pi_color_tri_vertex_shader, 1,
235 &color_tri_vertex_shader_source,
nullptr);
236 glCompileShader(pi_color_tri_vertex_shader);
237 glGetShaderiv(pi_color_tri_vertex_shader, GL_COMPILE_STATUS, &success);
239 glGetShaderInfoLog(pi_color_tri_vertex_shader, INFOLOG_LEN,
nullptr,
241 printf(
"ERROR::SHADER::VERTEX::COMPILATION_FAILED\n%s\n", infoLog);
246 if (!pi_color_tri_fragment_shader) {
248 pi_color_tri_fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
249 glShaderSource(pi_color_tri_fragment_shader, 1,
250 &color_tri_fragment_shader_source,
nullptr);
251 glCompileShader(pi_color_tri_fragment_shader);
252 glGetShaderiv(pi_color_tri_fragment_shader, GL_COMPILE_STATUS, &success);
254 glGetShaderInfoLog(pi_color_tri_fragment_shader, INFOLOG_LEN,
nullptr,
256 printf(
"ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n%s\n", infoLog);
261 if (!pi_color_tri_shader_program) {
263 pi_color_tri_shader_program = glCreateProgram();
264 glAttachShader(pi_color_tri_shader_program, pi_color_tri_fragment_shader);
265 glAttachShader(pi_color_tri_shader_program, pi_color_tri_vertex_shader);
266 glLinkProgram(pi_color_tri_shader_program);
267 glGetProgramiv(pi_color_tri_shader_program, GL_LINK_STATUS, &success);
269 glGetProgramInfoLog(pi_color_tri_shader_program, INFOLOG_LEN,
nullptr,
271 printf(
"ERROR::SHADER::PROGRAM::LINKING_FAILED\n%s\n", infoLog);
278 if (!GRIBpi_colorv_tri_shader_program) {
281 .addShaderFromSource(colorv_tri_vertex_shader_source,
283 .addShaderFromSource(colorv_tri_fragment_shader_source,
287 GRIBpi_colorv_tri_shader_program = shaderProgram.programId();
291 if (!pi_colorv_tri_vertex_shader) {
293 pi_colorv_tri_vertex_shader = glCreateShader(GL_VERTEX_SHADER);
294 glShaderSource(pi_colorv_tri_vertex_shader, 1,
295 &colorv_tri_vertex_shader_source,
nullptr);
296 glCompileShader(pi_colorv_tri_vertex_shader);
297 glGetShaderiv(pi_colorv_tri_vertex_shader, GL_COMPILE_STATUS, &success);
299 glGetShaderInfoLog(pi_colorv_tri_vertex_shader, INFOLOG_LEN,
nullptr,
301 printf(
"ERROR::SHADER::VERTEX::COMPILATION_FAILED\n%s\n", infoLog);
306 if (!pi_colorv_tri_fragment_shader) {
308 pi_colorv_tri_fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
309 glShaderSource(pi_colorv_tri_fragment_shader, 1,
310 &colorv_tri_fragment_shader_source,
nullptr);
311 glCompileShader(pi_colorv_tri_fragment_shader);
312 glGetShaderiv(pi_colorv_tri_fragment_shader, GL_COMPILE_STATUS, &success);
314 glGetShaderInfoLog(pi_colorv_tri_fragment_shader, INFOLOG_LEN,
nullptr,
316 printf(
"ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n%s\n", infoLog);
321 if (!pi_colorv_tri_shader_program) {
323 pi_colorv_tri_shader_program = glCreateProgram();
324 glAttachShader(pi_colorv_tri_shader_program, pi_colorv_tri_fragment_shader);
325 glAttachShader(pi_colorv_tri_shader_program, pi_colorv_tri_vertex_shader);
326 glLinkProgram(pi_colorv_tri_shader_program);
327 glGetProgramiv(pi_colorv_tri_shader_program, GL_LINK_STATUS, &success);
329 glGetProgramInfoLog(pi_colorv_tri_shader_program, INFOLOG_LEN,
nullptr,
331 printf(
"ERROR::SHADER::PROGRAM::LINKING_FAILED\n%s\n", infoLog);
338 if (!pi_texture_2D_shader_program) {
341 .addShaderFromSource(texture_2D_vertex_shader_source,
343 .addShaderFromSource(texture_2D_fragment_shader_source,
347 pi_texture_2D_shader_program = shaderProgram.programId();
351 if (!pi_texture_2D_vertex_shader) {
353 pi_texture_2D_vertex_shader = glCreateShader(GL_VERTEX_SHADER);
354 glShaderSource(pi_texture_2D_vertex_shader, 1,
355 &texture_2D_vertex_shader_source,
nullptr);
356 glCompileShader(pi_texture_2D_vertex_shader);
357 glGetShaderiv(pi_texture_2D_vertex_shader, GL_COMPILE_STATUS, &success);
359 glGetShaderInfoLog(pi_texture_2D_vertex_shader, INFOLOG_LEN,
nullptr,
361 printf(
"ERROR::SHADER::VERTEX::COMPILATION_FAILED\n%s\n", infoLog);
366 if (!pi_texture_2D_fragment_shader) {
368 pi_texture_2D_fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
369 glShaderSource(pi_texture_2D_fragment_shader, 1,
370 &texture_2D_fragment_shader_source,
nullptr);
371 glCompileShader(pi_texture_2D_fragment_shader);
372 glGetShaderiv(pi_texture_2D_fragment_shader, GL_COMPILE_STATUS, &success);
374 glGetShaderInfoLog(pi_texture_2D_fragment_shader, INFOLOG_LEN,
nullptr,
376 printf(
"ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n%s\n", infoLog);
381 if (!pi_texture_2D_shader_program) {
383 pi_texture_2D_shader_program = glCreateProgram();
384 glAttachShader(pi_texture_2D_shader_program, pi_texture_2D_vertex_shader);
385 glAttachShader(pi_texture_2D_shader_program, pi_texture_2D_fragment_shader);
386 glLinkProgram(pi_texture_2D_shader_program);
387 glGetProgramiv(pi_texture_2D_shader_program, GL_LINK_STATUS, &success);
389 glGetProgramInfoLog(pi_texture_2D_shader_program, INFOLOG_LEN,
nullptr,
391 printf(
"ERROR::SHADER::PROGRAM::LINKING_FAILED\n%s\n", infoLog);
400 if(!fade_texture_2D_vertex_shader){
402 fade_texture_2D_vertex_shader = glCreateShader(GL_VERTEX_SHADER);
403 glShaderSource(fade_texture_2D_vertex_shader, 1, &fade_texture_2D_vertex_shader_source,
nullptr);
404 glCompileShader(fade_texture_2D_vertex_shader);
405 glGetShaderiv(fade_texture_2D_vertex_shader, GL_COMPILE_STATUS, &success);
407 glGetShaderInfoLog(fade_texture_2D_vertex_shader, INFOLOG_LEN,
nullptr, infoLog);
408 printf(
"ERROR::SHADER::VERTEX::COMPILATION_FAILED\n%s\n", infoLog);
413 if(!fade_texture_2D_fragment_shader){
415 fade_texture_2D_fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
416 glShaderSource(fade_texture_2D_fragment_shader, 1, &fade_texture_2D_fragment_shader_source,
nullptr);
417 glCompileShader(fade_texture_2D_fragment_shader);
418 glGetShaderiv(fade_texture_2D_fragment_shader, GL_COMPILE_STATUS, &success);
420 glGetShaderInfoLog(fade_texture_2D_fragment_shader, INFOLOG_LEN,
nullptr, infoLog);
421 printf(
"ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n%s\n", infoLog);
426 if(!fade_texture_2D_shader_program){
428 fade_texture_2D_shader_program = glCreateProgram();
429 glAttachShader(fade_texture_2D_shader_program, fade_texture_2D_vertex_shader);
430 glAttachShader(fade_texture_2D_shader_program, fade_texture_2D_fragment_shader);
431 glLinkProgram(fade_texture_2D_shader_program);
432 glGetProgramiv(fade_texture_2D_shader_program, GL_LINK_STATUS, &success);
434 glGetProgramInfoLog(fade_texture_2D_shader_program, INFOLOG_LEN,
nullptr, infoLog);
435 printf(
"ERROR::SHADER::PROGRAM::LINKING_FAILED\n%s\n", infoLog);
443 if (!pi_circle_filled_shader_program) {
446 .addShaderFromSource(circle_filled_vertex_shader_source,
448 .addShaderFromSource(circle_filled_fragment_shader_source,
452 pi_circle_filled_shader_program = shaderProgram.programId();
456 if (!pi_circle_filled_vertex_shader) {
458 pi_circle_filled_vertex_shader = glCreateShader(GL_VERTEX_SHADER);
459 glShaderSource(pi_circle_filled_vertex_shader, 1,
460 &circle_filled_vertex_shader_source,
nullptr);
461 glCompileShader(pi_circle_filled_vertex_shader);
462 glGetShaderiv(pi_circle_filled_vertex_shader, GL_COMPILE_STATUS, &success);
464 glGetShaderInfoLog(pi_circle_filled_vertex_shader, INFOLOG_LEN,
nullptr,
466 printf(
"ERROR::SHADER::VERTEX::COMPILATION_FAILED\n%s\n", infoLog);
472 if (!pi_circle_filled_fragment_shader) {
474 pi_circle_filled_fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
475 glShaderSource(pi_circle_filled_fragment_shader, 1,
476 &circle_filled_fragment_shader_source,
nullptr);
477 glCompileShader(pi_circle_filled_fragment_shader);
478 glGetShaderiv(pi_circle_filled_fragment_shader, GL_COMPILE_STATUS,
481 glGetShaderInfoLog(pi_circle_filled_fragment_shader, INFOLOG_LEN,
nullptr,
483 printf(
"ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n%s\n", infoLog);
489 if (!pi_circle_filled_shader_program) {
491 pi_circle_filled_shader_program = glCreateProgram();
492 glAttachShader(pi_circle_filled_shader_program,
493 pi_circle_filled_vertex_shader);
494 glAttachShader(pi_circle_filled_shader_program,
495 pi_circle_filled_fragment_shader);
496 glLinkProgram(pi_circle_filled_shader_program);
497 glGetProgramiv(pi_circle_filled_shader_program, GL_LINK_STATUS, &success);
499 glGetProgramInfoLog(pi_circle_filled_shader_program, INFOLOG_LEN,
nullptr,
501 printf(
"ERROR::SHADER::PROGRAM::LINKING_FAILED\n%s\n", infoLog);
511 if(!FBO_texture_2D_vertex_shader){
513 FBO_texture_2D_vertex_shader = glCreateShader(GL_VERTEX_SHADER);
514 glShaderSource(FBO_texture_2D_vertex_shader, 1, &FBO_texture_2D_vertex_shader_source,
nullptr);
515 glCompileShader(FBO_texture_2D_vertex_shader);
516 glGetShaderiv(FBO_texture_2D_vertex_shader, GL_COMPILE_STATUS, &success);
518 glGetShaderInfoLog(FBO_texture_2D_vertex_shader, INFOLOG_LEN,
nullptr, infoLog);
519 printf(
"ERROR::SHADER::VERTEX::COMPILATION_FAILED\n%s\n", infoLog);
524 if(!FBO_texture_2D_fragment_shader){
526 FBO_texture_2D_fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
527 glShaderSource(FBO_texture_2D_fragment_shader, 1, &FBO_texture_2D_fragment_shader_source,
nullptr);
528 glCompileShader(FBO_texture_2D_fragment_shader);
529 glGetShaderiv(FBO_texture_2D_fragment_shader, GL_COMPILE_STATUS, &success);
531 glGetShaderInfoLog(FBO_texture_2D_fragment_shader, INFOLOG_LEN,
nullptr, infoLog);
532 printf(
"ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n%s\n", infoLog);
537 if(!FBO_texture_2D_shader_program){
539 FBO_texture_2D_shader_program = glCreateProgram();
540 glAttachShader(FBO_texture_2D_shader_program, FBO_texture_2D_vertex_shader);
541 glAttachShader(FBO_texture_2D_shader_program, FBO_texture_2D_fragment_shader);
542 glLinkProgram(FBO_texture_2D_shader_program);
543 glGetProgramiv(FBO_texture_2D_shader_program, GL_LINK_STATUS, &success);
545 glGetProgramInfoLog(FBO_texture_2D_shader_program, INFOLOG_LEN,
nullptr, infoLog);
546 printf(
"ERROR::SHADER::PROGRAM::LINKING_FAILED\n%s\n", infoLog);
556void configureShaders(
float width,
float height) {
558 float vp_transform[16];
561 mat4x4_scale_aniso((
float(*)[4])vp_transform, m, 2.0 / width, -2.0 / height,
563 mat4x4_translate_in_place((
float(*)[4])vp_transform, -width / 2, -height / 2,
569 glUseProgram(GRIBpi_color_tri_shader_program);
571 glGetUniformLocation(GRIBpi_color_tri_shader_program,
"MVMatrix");
572 glUniformMatrix4fv(matloc, 1, GL_FALSE, (
const GLfloat*)vp_transform);
574 glGetUniformLocation(GRIBpi_color_tri_shader_program,
"TransformMatrix");
575 glUniformMatrix4fv(transloc, 1, GL_FALSE, (
const GLfloat*)I);
579 glUseProgram(pi_circle_filled_shader_program);
580 matloc = glGetUniformLocation(pi_circle_filled_shader_program,
"MVMatrix");
581 glUniformMatrix4fv(matloc, 1, GL_FALSE, (
const GLfloat*)vp_transform);
583 glGetUniformLocation(pi_circle_filled_shader_program,
"TransformMatrix");
584 glUniformMatrix4fv(transloc, 1, GL_FALSE, (
const GLfloat*)I);
588 glUseProgram(pi_texture_2D_shader_program);
589 matloc = glGetUniformLocation(pi_texture_2D_shader_program,
"MVMatrix");
590 glUniformMatrix4fv(matloc, 1, GL_FALSE, (
const GLfloat*)vp_transform);
592 glGetUniformLocation(pi_texture_2D_shader_program,
"TransformMatrix");
593 glUniformMatrix4fv(transloc, 1, GL_FALSE, (
const GLfloat*)I);
597 glUseProgram(GRIBpi_colorv_tri_shader_program);
598 matloc = glGetUniformLocation(GRIBpi_colorv_tri_shader_program,
"MVMatrix");
599 glUniformMatrix4fv(matloc, 1, GL_FALSE, (
const GLfloat*)vp_transform);
601 glGetUniformLocation(GRIBpi_colorv_tri_shader_program,
"TransformMatrix");
602 glUniformMatrix4fv(transloc, 1, GL_FALSE, (
const GLfloat*)I);