28#ifdef USE_ANDROID_GLES2
33#ifdef USE_ANDROID_GLES2
34const GLchar* PI_shader_preamble =
"\n";
36const GLchar* PI_shader_preamble =
46static const GLchar* color_tri_vertex_shader_source =
47 "attribute vec2 position;\n"
48 "uniform mat4 MVMatrix;\n"
49 "uniform mat4 TransformMatrix;\n"
50 "uniform vec4 color;\n"
51 "varying vec4 fragColor;\n"
53 " fragColor = color;\n"
54 " gl_Position = MVMatrix * TransformMatrix * vec4(position, 0.0, 1.0);\n"
57static const GLchar* color_tri_fragment_shader_source =
58 "precision lowp float;\n"
59 "varying vec4 fragColor;\n"
61 " gl_FragColor = fragColor;\n"
65static const GLchar* colorv_tri_vertex_shader_source =
66 "attribute vec2 position;\n"
67 "attribute vec4 colorv;\n"
68 "uniform mat4 MVMatrix;\n"
69 "uniform mat4 TransformMatrix;\n"
70 "varying vec4 fragColor;\n"
72 " fragColor = colorv;\n"
73 " gl_Position = MVMatrix * TransformMatrix * vec4(position, 0.0, 1.0);\n"
76static const GLchar* colorv_tri_fragment_shader_source =
77 "precision lowp float;\n"
78 "varying vec4 fragColor;\n"
80 " gl_FragColor = fragColor;\n"
84static const GLchar* texture_2D_vertex_shader_source =
85 "attribute vec2 aPos;\n"
86 "attribute vec2 aUV;\n"
87 "uniform mat4 MVMatrix;\n"
88 "uniform mat4 TransformMatrix;\n"
89 "varying vec2 varCoord;\n"
91 " gl_Position = MVMatrix * TransformMatrix * vec4(aPos, 0.0, 1.0);\n"
95static const GLchar* texture_2D_fragment_shader_source =
96 "precision lowp float;\n"
97 "uniform sampler2D uTex;\n"
98 "varying vec2 varCoord;\n"
100 " gl_FragColor = texture2D(uTex, varCoord);\n"
104static const GLchar* fade_texture_2D_vertex_shader_source =
105 "precision highp float;\n"
106 "attribute vec2 aPos;\n"
107 "attribute vec2 aUV;\n"
108 "attribute vec2 aUV2;\n"
109 "uniform mat4 MVMatrix;\n"
110 "varying vec2 varCoord;\n"
111 "varying vec2 varCoord2;\n"
113 " gl_Position = MVMatrix * vec4(aPos, 0.0, 1.0);\n"
114 " varCoord = aUV.st;\n"
115 " varCoord2 = aUV2.st;\n"
118static const GLchar* fade_texture_2D_fragment_shader_source =
119 "precision highp float;\n"
120 "uniform sampler2D uTex;\n"
121 "uniform sampler2D uTex2;\n"
122 "uniform lowp float texAlpha;\n"
123 "varying vec2 varCoord;\n"
124 "varying vec2 varCoord2;\n"
126 " mediump vec4 texColor = texture2D(uTex, varCoord);\n"
127 " mediump vec4 texTwoColor = texture2D(uTex2, varCoord2);\n"
128 " gl_FragColor = ((texTwoColor * (1.0 - texAlpha)) + (texColor * "
134static const GLchar* circle_filled_vertex_shader_source =
135 "precision highp float;\n"
136 "attribute vec2 aPos;\n"
137 "uniform mat4 MVMatrix;\n"
138 "uniform mat4 TransformMatrix;\n"
140 " gl_Position = MVMatrix * TransformMatrix * vec4(aPos, 0.0, 1.0);\n"
143static const GLchar* circle_filled_fragment_shader_source =
144 "precision highp float;\n"
145 "uniform float border_width;\n"
146 "uniform float circle_radius;\n"
147 "uniform vec4 circle_color;\n"
148 "uniform vec4 border_color;\n"
149 "uniform vec2 circle_center;\n"
151 "float d = distance(gl_FragCoord.xy, circle_center);\n"
152 "if (d < (circle_radius - border_width)) { gl_FragColor = circle_color; }\n"
153 "else if (d < circle_radius) { gl_FragColor = border_color; }\n"
154 "else { gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0); }\n"
158static const GLchar* FBO_texture_2D_vertex_shader_source =
159 "attribute vec2 aPos;\n"
160 "attribute vec2 aUV;\n"
161 "uniform mat4 MVMatrix;\n"
162 "varying vec2 varCoord;\n"
164 " gl_Position = MVMatrix * vec4(aPos, 0.0, 1.0);\n"
168static const GLchar* FBO_texture_2D_fragment_shader_source =
169 "precision lowp float;\n"
170 "uniform sampler2D uTex;\n"
171 "varying vec2 varCoord;\n"
173 " gl_FragColor = texture2D(uTex, varCoord);\n"
176GLint pi_color_tri_fragment_shader;
177GLint GRIBpi_color_tri_shader_program;
178GLint pi_color_tri_vertex_shader;
180GLint pi_colorv_tri_fragment_shader;
181GLint GRIBpi_colorv_tri_shader_program;
182GLint pi_colorv_tri_vertex_shader;
184GLint pi_texture_2D_fragment_shader;
185GLint pi_texture_2D_shader_program;
186GLint pi_texture_2D_vertex_shader;
192GLint pi_circle_filled_shader_program;
193GLint pi_circle_filled_vertex_shader;
194GLint pi_circle_filled_fragment_shader;
200bool pi_loadShaders() {
204 enum Consts { INFOLOG_LEN = 512 };
205 GLchar infoLog[INFOLOG_LEN];
209#if defined(__linux__) && defined(__OCPN_USE_GLEW__) && \
210 !defined(__ANDROID__) && !defined(__WXOSX)
211 auto GLEW_test = glCreateProgram;
212 if (!GLEW_test) glewInit();
219 if (!GRIBpi_color_tri_shader_program) {
222 .addShaderFromSource(color_tri_vertex_shader_source,
224 .addShaderFromSource(color_tri_fragment_shader_source,
228 GRIBpi_color_tri_shader_program = shaderProgram.programId();
232 if (!pi_color_tri_vertex_shader) {
234 pi_color_tri_vertex_shader = glCreateShader(GL_VERTEX_SHADER);
235 glShaderSource(pi_color_tri_vertex_shader, 1,
236 &color_tri_vertex_shader_source,
nullptr);
237 glCompileShader(pi_color_tri_vertex_shader);
238 glGetShaderiv(pi_color_tri_vertex_shader, GL_COMPILE_STATUS, &success);
240 glGetShaderInfoLog(pi_color_tri_vertex_shader, INFOLOG_LEN,
nullptr,
242 printf(
"ERROR::SHADER::VERTEX::COMPILATION_FAILED\n%s\n", infoLog);
247 if (!pi_color_tri_fragment_shader) {
249 pi_color_tri_fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
250 glShaderSource(pi_color_tri_fragment_shader, 1,
251 &color_tri_fragment_shader_source,
nullptr);
252 glCompileShader(pi_color_tri_fragment_shader);
253 glGetShaderiv(pi_color_tri_fragment_shader, GL_COMPILE_STATUS, &success);
255 glGetShaderInfoLog(pi_color_tri_fragment_shader, INFOLOG_LEN,
nullptr,
257 printf(
"ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n%s\n", infoLog);
262 if (!pi_color_tri_shader_program) {
264 pi_color_tri_shader_program = glCreateProgram();
265 glAttachShader(pi_color_tri_shader_program, pi_color_tri_fragment_shader);
266 glAttachShader(pi_color_tri_shader_program, pi_color_tri_vertex_shader);
267 glLinkProgram(pi_color_tri_shader_program);
268 glGetProgramiv(pi_color_tri_shader_program, GL_LINK_STATUS, &success);
270 glGetProgramInfoLog(pi_color_tri_shader_program, INFOLOG_LEN,
nullptr,
272 printf(
"ERROR::SHADER::PROGRAM::LINKING_FAILED\n%s\n", infoLog);
279 if (!GRIBpi_colorv_tri_shader_program) {
282 .addShaderFromSource(colorv_tri_vertex_shader_source,
284 .addShaderFromSource(colorv_tri_fragment_shader_source,
288 GRIBpi_colorv_tri_shader_program = shaderProgram.programId();
292 if (!pi_colorv_tri_vertex_shader) {
294 pi_colorv_tri_vertex_shader = glCreateShader(GL_VERTEX_SHADER);
295 glShaderSource(pi_colorv_tri_vertex_shader, 1,
296 &colorv_tri_vertex_shader_source,
nullptr);
297 glCompileShader(pi_colorv_tri_vertex_shader);
298 glGetShaderiv(pi_colorv_tri_vertex_shader, GL_COMPILE_STATUS, &success);
300 glGetShaderInfoLog(pi_colorv_tri_vertex_shader, INFOLOG_LEN,
nullptr,
302 printf(
"ERROR::SHADER::VERTEX::COMPILATION_FAILED\n%s\n", infoLog);
307 if (!pi_colorv_tri_fragment_shader) {
309 pi_colorv_tri_fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
310 glShaderSource(pi_colorv_tri_fragment_shader, 1,
311 &colorv_tri_fragment_shader_source,
nullptr);
312 glCompileShader(pi_colorv_tri_fragment_shader);
313 glGetShaderiv(pi_colorv_tri_fragment_shader, GL_COMPILE_STATUS, &success);
315 glGetShaderInfoLog(pi_colorv_tri_fragment_shader, INFOLOG_LEN,
nullptr,
317 printf(
"ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n%s\n", infoLog);
322 if (!pi_colorv_tri_shader_program) {
324 pi_colorv_tri_shader_program = glCreateProgram();
325 glAttachShader(pi_colorv_tri_shader_program, pi_colorv_tri_fragment_shader);
326 glAttachShader(pi_colorv_tri_shader_program, pi_colorv_tri_vertex_shader);
327 glLinkProgram(pi_colorv_tri_shader_program);
328 glGetProgramiv(pi_colorv_tri_shader_program, GL_LINK_STATUS, &success);
330 glGetProgramInfoLog(pi_colorv_tri_shader_program, INFOLOG_LEN,
nullptr,
332 printf(
"ERROR::SHADER::PROGRAM::LINKING_FAILED\n%s\n", infoLog);
339 if (!pi_texture_2D_shader_program) {
342 .addShaderFromSource(texture_2D_vertex_shader_source,
344 .addShaderFromSource(texture_2D_fragment_shader_source,
348 pi_texture_2D_shader_program = shaderProgram.programId();
352 if (!pi_texture_2D_vertex_shader) {
354 pi_texture_2D_vertex_shader = glCreateShader(GL_VERTEX_SHADER);
355 glShaderSource(pi_texture_2D_vertex_shader, 1,
356 &texture_2D_vertex_shader_source,
nullptr);
357 glCompileShader(pi_texture_2D_vertex_shader);
358 glGetShaderiv(pi_texture_2D_vertex_shader, GL_COMPILE_STATUS, &success);
360 glGetShaderInfoLog(pi_texture_2D_vertex_shader, INFOLOG_LEN,
nullptr,
362 printf(
"ERROR::SHADER::VERTEX::COMPILATION_FAILED\n%s\n", infoLog);
367 if (!pi_texture_2D_fragment_shader) {
369 pi_texture_2D_fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
370 glShaderSource(pi_texture_2D_fragment_shader, 1,
371 &texture_2D_fragment_shader_source,
nullptr);
372 glCompileShader(pi_texture_2D_fragment_shader);
373 glGetShaderiv(pi_texture_2D_fragment_shader, GL_COMPILE_STATUS, &success);
375 glGetShaderInfoLog(pi_texture_2D_fragment_shader, INFOLOG_LEN,
nullptr,
377 printf(
"ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n%s\n", infoLog);
382 if (!pi_texture_2D_shader_program) {
384 pi_texture_2D_shader_program = glCreateProgram();
385 glAttachShader(pi_texture_2D_shader_program, pi_texture_2D_vertex_shader);
386 glAttachShader(pi_texture_2D_shader_program, pi_texture_2D_fragment_shader);
387 glLinkProgram(pi_texture_2D_shader_program);
388 glGetProgramiv(pi_texture_2D_shader_program, GL_LINK_STATUS, &success);
390 glGetProgramInfoLog(pi_texture_2D_shader_program, INFOLOG_LEN,
nullptr,
392 printf(
"ERROR::SHADER::PROGRAM::LINKING_FAILED\n%s\n", infoLog);
401 if(!fade_texture_2D_vertex_shader){
403 fade_texture_2D_vertex_shader = glCreateShader(GL_VERTEX_SHADER);
404 glShaderSource(fade_texture_2D_vertex_shader, 1, &fade_texture_2D_vertex_shader_source,
nullptr);
405 glCompileShader(fade_texture_2D_vertex_shader);
406 glGetShaderiv(fade_texture_2D_vertex_shader, GL_COMPILE_STATUS, &success);
408 glGetShaderInfoLog(fade_texture_2D_vertex_shader, INFOLOG_LEN,
nullptr, infoLog);
409 printf(
"ERROR::SHADER::VERTEX::COMPILATION_FAILED\n%s\n", infoLog);
414 if(!fade_texture_2D_fragment_shader){
416 fade_texture_2D_fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
417 glShaderSource(fade_texture_2D_fragment_shader, 1, &fade_texture_2D_fragment_shader_source,
nullptr);
418 glCompileShader(fade_texture_2D_fragment_shader);
419 glGetShaderiv(fade_texture_2D_fragment_shader, GL_COMPILE_STATUS, &success);
421 glGetShaderInfoLog(fade_texture_2D_fragment_shader, INFOLOG_LEN,
nullptr, infoLog);
422 printf(
"ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n%s\n", infoLog);
427 if(!fade_texture_2D_shader_program){
429 fade_texture_2D_shader_program = glCreateProgram();
430 glAttachShader(fade_texture_2D_shader_program, fade_texture_2D_vertex_shader);
431 glAttachShader(fade_texture_2D_shader_program, fade_texture_2D_fragment_shader);
432 glLinkProgram(fade_texture_2D_shader_program);
433 glGetProgramiv(fade_texture_2D_shader_program, GL_LINK_STATUS, &success);
435 glGetProgramInfoLog(fade_texture_2D_shader_program, INFOLOG_LEN,
nullptr, infoLog);
436 printf(
"ERROR::SHADER::PROGRAM::LINKING_FAILED\n%s\n", infoLog);
444 if (!pi_circle_filled_shader_program) {
447 .addShaderFromSource(circle_filled_vertex_shader_source,
449 .addShaderFromSource(circle_filled_fragment_shader_source,
453 pi_circle_filled_shader_program = shaderProgram.programId();
457 if (!pi_circle_filled_vertex_shader) {
459 pi_circle_filled_vertex_shader = glCreateShader(GL_VERTEX_SHADER);
460 glShaderSource(pi_circle_filled_vertex_shader, 1,
461 &circle_filled_vertex_shader_source,
nullptr);
462 glCompileShader(pi_circle_filled_vertex_shader);
463 glGetShaderiv(pi_circle_filled_vertex_shader, GL_COMPILE_STATUS, &success);
465 glGetShaderInfoLog(pi_circle_filled_vertex_shader, INFOLOG_LEN,
nullptr,
467 printf(
"ERROR::SHADER::VERTEX::COMPILATION_FAILED\n%s\n", infoLog);
473 if (!pi_circle_filled_fragment_shader) {
475 pi_circle_filled_fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
476 glShaderSource(pi_circle_filled_fragment_shader, 1,
477 &circle_filled_fragment_shader_source,
nullptr);
478 glCompileShader(pi_circle_filled_fragment_shader);
479 glGetShaderiv(pi_circle_filled_fragment_shader, GL_COMPILE_STATUS,
482 glGetShaderInfoLog(pi_circle_filled_fragment_shader, INFOLOG_LEN,
nullptr,
484 printf(
"ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n%s\n", infoLog);
490 if (!pi_circle_filled_shader_program) {
492 pi_circle_filled_shader_program = glCreateProgram();
493 glAttachShader(pi_circle_filled_shader_program,
494 pi_circle_filled_vertex_shader);
495 glAttachShader(pi_circle_filled_shader_program,
496 pi_circle_filled_fragment_shader);
497 glLinkProgram(pi_circle_filled_shader_program);
498 glGetProgramiv(pi_circle_filled_shader_program, GL_LINK_STATUS, &success);
500 glGetProgramInfoLog(pi_circle_filled_shader_program, INFOLOG_LEN,
nullptr,
502 printf(
"ERROR::SHADER::PROGRAM::LINKING_FAILED\n%s\n", infoLog);
512 if(!FBO_texture_2D_vertex_shader){
514 FBO_texture_2D_vertex_shader = glCreateShader(GL_VERTEX_SHADER);
515 glShaderSource(FBO_texture_2D_vertex_shader, 1, &FBO_texture_2D_vertex_shader_source,
nullptr);
516 glCompileShader(FBO_texture_2D_vertex_shader);
517 glGetShaderiv(FBO_texture_2D_vertex_shader, GL_COMPILE_STATUS, &success);
519 glGetShaderInfoLog(FBO_texture_2D_vertex_shader, INFOLOG_LEN,
nullptr, infoLog);
520 printf(
"ERROR::SHADER::VERTEX::COMPILATION_FAILED\n%s\n", infoLog);
525 if(!FBO_texture_2D_fragment_shader){
527 FBO_texture_2D_fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
528 glShaderSource(FBO_texture_2D_fragment_shader, 1, &FBO_texture_2D_fragment_shader_source,
nullptr);
529 glCompileShader(FBO_texture_2D_fragment_shader);
530 glGetShaderiv(FBO_texture_2D_fragment_shader, GL_COMPILE_STATUS, &success);
532 glGetShaderInfoLog(FBO_texture_2D_fragment_shader, INFOLOG_LEN,
nullptr, infoLog);
533 printf(
"ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n%s\n", infoLog);
538 if(!FBO_texture_2D_shader_program){
540 FBO_texture_2D_shader_program = glCreateProgram();
541 glAttachShader(FBO_texture_2D_shader_program, FBO_texture_2D_vertex_shader);
542 glAttachShader(FBO_texture_2D_shader_program, FBO_texture_2D_fragment_shader);
543 glLinkProgram(FBO_texture_2D_shader_program);
544 glGetProgramiv(FBO_texture_2D_shader_program, GL_LINK_STATUS, &success);
546 glGetProgramInfoLog(FBO_texture_2D_shader_program, INFOLOG_LEN,
nullptr, infoLog);
547 printf(
"ERROR::SHADER::PROGRAM::LINKING_FAILED\n%s\n", infoLog);
557void configureShaders(
float width,
float height) {
559 float vp_transform[16];
562 mat4x4_scale_aniso((
float(*)[4])vp_transform, m, 2.0 / width, -2.0 / height,
564 mat4x4_translate_in_place((
float(*)[4])vp_transform, -width / 2, -height / 2,
570 glUseProgram(GRIBpi_color_tri_shader_program);
572 glGetUniformLocation(GRIBpi_color_tri_shader_program,
"MVMatrix");
573 glUniformMatrix4fv(matloc, 1, GL_FALSE, (
const GLfloat*)vp_transform);
575 glGetUniformLocation(GRIBpi_color_tri_shader_program,
"TransformMatrix");
576 glUniformMatrix4fv(transloc, 1, GL_FALSE, (
const GLfloat*)I);
580 glUseProgram(pi_circle_filled_shader_program);
581 matloc = glGetUniformLocation(pi_circle_filled_shader_program,
"MVMatrix");
582 glUniformMatrix4fv(matloc, 1, GL_FALSE, (
const GLfloat*)vp_transform);
584 glGetUniformLocation(pi_circle_filled_shader_program,
"TransformMatrix");
585 glUniformMatrix4fv(transloc, 1, GL_FALSE, (
const GLfloat*)I);
589 glUseProgram(pi_texture_2D_shader_program);
590 matloc = glGetUniformLocation(pi_texture_2D_shader_program,
"MVMatrix");
591 glUniformMatrix4fv(matloc, 1, GL_FALSE, (
const GLfloat*)vp_transform);
593 glGetUniformLocation(pi_texture_2D_shader_program,
"TransformMatrix");
594 glUniformMatrix4fv(transloc, 1, GL_FALSE, (
const GLfloat*)I);
598 glUseProgram(GRIBpi_colorv_tri_shader_program);
599 matloc = glGetUniformLocation(GRIBpi_colorv_tri_shader_program,
"MVMatrix");
600 glUniformMatrix4fv(matloc, 1, GL_FALSE, (
const GLfloat*)vp_transform);
602 glGetUniformLocation(GRIBpi_colorv_tri_shader_program,
"TransformMatrix");
603 glUniformMatrix4fv(transloc, 1, GL_FALSE, (
const GLfloat*)I);