26#if defined(USE_ANDROID_GLES2) || defined(ocpnUSE_GLSL)
28#ifdef USE_ANDROID_GLES2
33#ifdef USE_ANDROID_GLES2
34const GLchar *preamble =
"\n";
36const GLchar *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 *texture_2D_vertex_shader_source =
66 "attribute vec2 aPos;\n"
67 "attribute vec2 aUV;\n"
68 "uniform mat4 MVMatrix;\n"
69 "uniform mat4 TransformMatrix;\n"
70 "varying vec2 varCoord;\n"
72 " gl_Position = MVMatrix * TransformMatrix * vec4(aPos, 0.0, 1.0);\n"
76static const GLchar *texture_2D_fragment_shader_source =
77 "precision lowp float;\n"
78 "uniform sampler2D uTex;\n"
79 "varying vec2 varCoord;\n"
81 " gl_FragColor = texture2D(uTex, varCoord);\n"
86static const GLchar *circle_filled_vertex_shader_source =
87 "precision highp float;\n"
88 "attribute vec2 aPos;\n"
89 "uniform mat4 MVMatrix;\n"
90 "uniform mat4 TransformMatrix;\n"
92 " gl_Position = MVMatrix * TransformMatrix * vec4(aPos, 0.0, 1.0);\n"
95static const GLchar *circle_filled_fragment_shader_source =
96 "precision highp float;\n"
97 "uniform float border_width;\n"
98 "uniform float circle_radius;\n"
99 "uniform vec4 circle_color;\n"
100 "uniform vec4 border_color;\n"
101 "uniform vec2 circle_center;\n"
103 "float d = distance(gl_FragCoord.xy, circle_center);\n"
104 "if (d < (circle_radius - border_width)) { gl_FragColor = circle_color; }\n"
105 "else if (d < circle_radius) { gl_FragColor = border_color; }\n"
106 "else { gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0); }\n"
110static const GLchar *texture_2DA_vertex_shader_source =
111 "attribute vec2 aPos;\n"
112 "attribute vec2 aUV;\n"
113 "uniform mat4 MVMatrix;\n"
114 "uniform mat4 TransformMatrix;\n"
115 "varying vec2 varCoord;\n"
117 " gl_Position = MVMatrix * TransformMatrix * vec4(aPos, 0.0, 1.0);\n"
121static const GLchar *texture_2DA_fragment_shader_source =
122 "precision lowp float;\n"
123 "uniform sampler2D uTex;\n"
124 "varying vec2 varCoord;\n"
125 "uniform vec4 color;\n"
127 " gl_FragColor = texture2D(uTex, varCoord) + color;\n"
131static const GLchar *AALine_vertex_shader_source =
132 "uniform vec2 uViewPort; //Width and Height of the viewport\n"
133 "varying vec2 vLineCenter;\n"
134 "attribute vec2 position;\n"
135 "uniform mat4 MVMatrix;\n"
136 "uniform mat4 TransformMatrix;\n"
139 " vec4 pp = MVMatrix * vec4(position, 0.0, 1.0);\n"
140 " gl_Position = pp;\n"
141 " vec2 vp = uViewPort;\n"
142 " vLineCenter = 0.5*(pp.xy + vec2(1, 1))*vp;\n"
145static const GLchar *AALine_fragment_shader_source =
146 "precision mediump float;\n"
147 "uniform float uLineWidth;\n"
148 "uniform vec4 color;\n"
149 "uniform float uBlendFactor; //1.5..2.5\n"
150 "varying vec2 vLineCenter;\n"
153 " vec4 col = color;\n"
154 " float d = length(vLineCenter-gl_FragCoord.xy);\n"
155 " float w = uLineWidth;\n"
159 " if(float((w/2.0-d)/(w/2.0)) < .5){\n"
160 " //col.w *= pow(float((w-d)/w), uBlendFactor);\n"
161 " col.w *= pow(float((w/2.0-d)/(w/2.0)), uBlendFactor);\n"
164 " gl_FragColor = col;\n"
169static const GLchar *ring_vertex_shader_source =
170 "precision highp float;\n"
171 "attribute vec2 aPos;\n"
172 "uniform mat4 MVMatrix;\n"
173 "uniform mat4 TransformMatrix;\n"
175 " gl_Position = MVMatrix * TransformMatrix * vec4(aPos, 0.0, 1.0);\n"
178static const GLchar *ring_fragment_shader_source =
179 "precision highp float;\n"
180 "uniform float border_width;\n"
181 "uniform float circle_radius;\n"
182 "uniform float ring_width;\n"
183 "uniform vec4 circle_color;\n"
184 "uniform vec4 border_color;\n"
185 "uniform vec2 circle_center;\n"
186 "uniform float sector_1;\n"
187 "uniform float sector_2;\n"
190 "const float PI = 3.14159265358979323846264;\n"
191 "bool bdraw = false;\n"
193 "float angle = atan(gl_FragCoord.y-circle_center.y, "
194 "gl_FragCoord.x-circle_center.x);\n"
195 "angle = PI/2.0 - angle;\n"
196 "if(angle < 0.0) angle += PI * 2.0;\n"
198 "if(sector_2 > PI * 2.0){\n"
199 " if((angle > sector_1) && (angle < (PI * 2.0) )){\n"
202 " if(angle < sector_2 - (PI * 2.0)){\n"
206 " if((angle > sector_1) && (angle < sector_2)){\n"
212 " float d = distance(gl_FragCoord.xy, circle_center);\n"
213 " if (d > circle_radius) {\n"
215 " } else if( d > (circle_radius - border_width)) {\n"
216 " gl_FragColor = border_color;\n"
217 " } else if( d > (circle_radius - border_width - ring_width)) {\n"
218 " gl_FragColor = circle_color;\n"
219 " } else if( d > (circle_radius - border_width - ring_width - "
221 " gl_FragColor = border_color;\n"
231static const GLchar *Android_texture_2DA_vertex_shader_source =
232 "attribute vec2 aPos;\n"
233 "attribute vec2 aUV;\n"
234 "uniform mat4 MVMatrix;\n"
235 "uniform mat4 TransformMatrix;\n"
236 "varying vec2 varCoord;\n"
238 " gl_Position = MVMatrix * TransformMatrix * vec4(aPos, 0.0, 1.0);\n"
242static const GLchar *Android_texture_2DA_fragment_shader_source =
243 "precision lowp float;\n"
244 "uniform sampler2D uTex;\n"
245 "varying vec2 varCoord;\n"
246 "uniform vec4 color;\n"
248 " gl_FragColor = texture2D(uTex, varCoord) + color;\n"
258GLint texture_2DA_vertex_shader_p;
259GLint texture_2DA_fragment_shader_p;
260GLint texture_2DA_shader_program;
262bool bShadersLoaded[2];
264bool loadShaders(
int index) {
266 if (bShadersLoaded[index]) {
267 reConfigureShaders(index);
275 if (!pcolor_tri_shader_program[index]) {
277 shaderProgram->addShaderFromSource(color_tri_vertex_shader_source,
279 shaderProgram->addShaderFromSource(color_tri_fragment_shader_source,
281 shaderProgram->linkProgram();
283 if (shaderProgram->isOK()) pcolor_tri_shader_program[index] = shaderProgram;
286 if (!ptexture_2D_shader_program[index]) {
288 shaderProgram->addShaderFromSource(texture_2D_vertex_shader_source,
290 shaderProgram->addShaderFromSource(texture_2D_fragment_shader_source,
292 shaderProgram->linkProgram();
294 if (shaderProgram->isOK())
295 ptexture_2D_shader_program[index] = shaderProgram;
298 if (!pcircle_filled_shader_program[index]) {
300 shaderProgram->addShaderFromSource(circle_filled_vertex_shader_source,
302 shaderProgram->addShaderFromSource(circle_filled_fragment_shader_source,
304 shaderProgram->linkProgram();
306 if (shaderProgram->isOK())
307 pcircle_filled_shader_program[index] = shaderProgram;
310 if (!ptexture_2DA_shader_program[index]) {
312 shaderProgram->addShaderFromSource(texture_2DA_vertex_shader_source,
314 shaderProgram->addShaderFromSource(texture_2DA_fragment_shader_source,
316 shaderProgram->linkProgram();
318 if (shaderProgram->isOK())
319 ptexture_2DA_shader_program[index] = shaderProgram;
322 if (!pAALine_shader_program[index]) {
324 shaderProgram->addShaderFromSource(AALine_fragment_shader_source,
326 shaderProgram->addShaderFromSource(AALine_vertex_shader_source,
328 shaderProgram->linkProgram();
330 if (shaderProgram->isOK()) pAALine_shader_program[index] = shaderProgram;
334 if (!pring_shader_program[index]) {
336 shaderProgram->addShaderFromSource(ring_fragment_shader_source,
338 shaderProgram->addShaderFromSource(ring_vertex_shader_source,
340 shaderProgram->linkProgram();
342 if (shaderProgram->isOK()) pring_shader_program[index] = shaderProgram;
347 if (!texture_2DA_vertex_shader_p) {
349 texture_2DA_vertex_shader_p = glCreateShader(GL_VERTEX_SHADER);
350 glShaderSource(texture_2DA_vertex_shader_p, 1,
351 &Android_texture_2DA_vertex_shader_source, NULL);
352 glCompileShader(texture_2DA_vertex_shader_p);
353 glGetShaderiv(texture_2DA_vertex_shader_p, GL_COMPILE_STATUS, &success);
362 if (!texture_2DA_fragment_shader_p) {
364 texture_2DA_fragment_shader_p = glCreateShader(GL_FRAGMENT_SHADER);
365 glShaderSource(texture_2DA_fragment_shader_p, 1,
366 &Android_texture_2DA_fragment_shader_source, NULL);
367 glCompileShader(texture_2DA_fragment_shader_p);
368 glGetShaderiv(texture_2DA_fragment_shader_p, GL_COMPILE_STATUS, &success);
377 if (!texture_2DA_shader_program) {
379 texture_2DA_shader_program = glCreateProgram();
380 glAttachShader(texture_2DA_shader_program, texture_2DA_vertex_shader_p);
381 glAttachShader(texture_2DA_shader_program, texture_2DA_fragment_shader_p);
382 glLinkProgram(texture_2DA_shader_program);
383 glGetProgramiv(texture_2DA_shader_program, GL_LINK_STATUS, &success);
393 bShadersLoaded[index] =
true;
394 reConfigureShaders(index);
399void reConfigureShaders(
int index) {}
401void unloadShaders() { bShadersLoaded[0] = bShadersLoaded[1] =
false; }
405 shaderProgram->addShaderFromSource(color_tri_vertex_shader_source,
407 shaderProgram->addShaderFromSource(color_tri_fragment_shader_source,
409 shaderProgram->linkProgram();
411 if (shaderProgram->isOK())
412 return shaderProgram;
Wrapper class for OpenGL shader programs.