2 * Copyright (C) Volition, Inc. 1999. All rights reserved.
4 * All source code herein is the property of Volition, Inc. You may not sell
5 * or otherwise commercially exploit the source or things you created based on
9 #include "SDL_opengles2.h"
13 #include "gropenglinternal.h"
17 static GLuint tex_prog = 0;
18 static GLuint fog_tex_prog = 0;
19 static GLuint aabitmap_prog = 0;
20 static GLuint color_prog = 0;
21 static GLuint fog_color_prog = 0;
22 static GLuint window_prog = 0;
25 static const char v_tex_src[] =
26 "uniform mat4 vOrtho;\n"
27 "attribute vec4 vPosition;\n"
28 "attribute vec4 vColor;\n"
29 "attribute vec2 vTexCoord;\n"
30 "varying vec4 colorVar;\n"
31 "varying vec2 texCoordVar;\n"
34 " gl_Position = vOrtho * vPosition;\n"
35 " colorVar = vColor;\n"
36 " texCoordVar = vTexCoord;\n"
39 static const char v_fog_tex_src[] =
40 "uniform mat4 vOrtho;\n"
41 "attribute vec4 vPosition;\n"
42 "attribute vec4 vColor;\n"
43 "attribute vec4 vSecColor;\n"
44 "attribute vec2 vTexCoord;\n"
45 "varying vec4 colorVar;\n"
46 "varying vec4 secColorVar;\n"
47 "varying vec2 texCoordVar;\n"
50 " gl_Position = vOrtho * vPosition;\n"
51 " colorVar = vColor;\n"
52 " secColorVar = vSecColor;\n"
53 " texCoordVar = vTexCoord;\n"
56 static const char v_color_src[] =
57 "uniform mat4 vOrtho;\n"
58 "attribute vec4 vPosition;\n"
59 "attribute vec4 vColor;\n"
60 "varying vec4 colorVar;\n"
63 " gl_Position = vOrtho * vPosition;\n"
64 " colorVar = vColor;\n"
67 static const char v_fog_color_src[] =
68 "uniform mat4 vOrtho;\n"
69 "attribute vec4 vPosition;\n"
70 "attribute vec4 vColor;\n"
71 "attribute vec4 vSecColor;\n"
72 "varying vec4 colorVar;\n"
73 "varying vec4 secColorVar;\n"
76 " gl_Position = vOrtho * vPosition;\n"
77 " colorVar = vColor;\n"
78 " secColorVar = vSecColor;\n"
81 static const char v_window_src[] =
82 "uniform mat4 vOrtho;\n"
83 "attribute vec4 vPosition;\n"
84 "attribute vec2 vTexCoord;\n"
85 "varying vec2 texCoordVar;\n"
88 " gl_Position = vOrtho * vPosition;\n"
89 " texCoordVar = vTexCoord;\n"
92 static const char f_tex_src[] =
93 "precision mediump float;\n"
94 "uniform sampler2D texture;\n"
95 "varying vec4 colorVar;\n"
96 "varying vec2 texCoordVar;\n"
99 " gl_FragColor = colorVar * texture2D(texture, texCoordVar);\n"
102 static const char f_fog_tex_src[] =
103 "precision mediump float;\n"
104 "uniform sampler2D texture;\n"
105 "varying vec4 colorVar;\n"
106 "varying vec4 secColorVar;\n"
107 "varying vec2 texCoordVar;\n"
110 " vec4 base_color = colorVar * texture2D(texture, texCoordVar);\n"
111 " gl_FragColor = vec4(mix(secColorVar.rgb, base_color.rgb, 1.0 - secColorVar.a), base_color.a);\n"
114 static const char f_aabitmap_src[] =
115 "precision mediump float;\n"
116 "uniform sampler2D texture;\n"
117 "varying vec4 colorVar;\n"
118 "varying vec2 texCoordVar;\n"
121 " float alpha1 = texture2D(texture, texCoordVar).a;\n"
122 " gl_FragColor = vec4(colorVar.rgb, mix(0.0, colorVar.a, alpha1));\n"
125 static const char f_color_src[] =
126 "precision mediump float;\n"
127 "varying vec4 colorVar;\n"
130 " gl_FragColor = colorVar;\n"
133 static const char f_fog_color_src[] =
134 "precision mediump float;\n"
135 "varying vec4 colorVar;\n"
136 "varying vec4 secColorVar;\n"
139 " gl_FragColor = vec4(mix(secColorVar.rgb, colorVar.rgb, 1.0 - secColorVar.a), colorVar.a);\n"
142 static const char f_window_src[] =
143 "precision mediump float;\n"
144 "uniform sampler2D texture;\n"
145 "varying vec2 texCoordVar;\n"
148 " gl_FragColor = texture2D(texture, texCoordVar);\n"
152 static GLuint opengl2_create_shader(const char *src, GLenum type)
157 shader = glCreateShader(type);
163 glShaderSource(shader, 1, &src, NULL);
165 glCompileShader(shader);
167 glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
172 glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &len);
175 char *log = (char *) malloc(sizeof(char) * len);
177 glGetShaderInfoLog(shader, len, NULL, log);
178 nprintf(("OpenGL", "Error compiling shader:\n%s\n", log));
183 glDeleteShader(shader);
191 static GLuint opengl2_create_program(GLuint vert, GLuint frag)
196 program = glCreateProgram();
202 glAttachShader(program, vert);
203 glAttachShader(program, frag);
205 glBindAttribLocation(program, SDRI_POSITION, "vPosition");
206 glBindAttribLocation(program, SDRI_COLOR, "vColor");
207 glBindAttribLocation(program, SDRI_SEC_COLOR, "vSecColor");
208 glBindAttribLocation(program, SDRI_TEXCOORD, "vTexCoord");
210 glLinkProgram(program);
212 glGetProgramiv(program, GL_LINK_STATUS, &linked);
217 glGetProgramiv(program, GL_INFO_LOG_LENGTH, &len);
220 char *log = (char *) malloc(sizeof(char) * len);
222 glGetProgramInfoLog(program, len, NULL, log);
223 nprintf(("OpenGL", "Error linking program:\n%s\n", log));
228 glDeleteProgram(program);
236 void opengl2_shader_use(sdr_prog_t prog)
238 static sdr_prog_t current = PROG_INVALID;
240 if (prog == current) {
246 glUseProgram(tex_prog);
250 glUseProgram(aabitmap_prog);
254 glUseProgram(color_prog);
258 glUseProgram(window_prog);
262 glUseProgram(fog_tex_prog);
266 glUseProgram(fog_color_prog);
277 // update window ortho coords
278 void opengl2_shader_update()
284 ortho[0] = 2.0f / GL_viewport_w;
285 ortho[5] = 2.0f / -GL_viewport_h;
286 ortho[10] = -2.0f / 1.0f;
292 opengl2_shader_use(PROG_WINDOW);
293 GLint loc = glGetUniformLocation(window_prog, "vOrtho");
294 glUniformMatrix4fv(loc, 1, GL_FALSE, ortho);
297 int opengl2_shader_init()
299 GLuint v_tex = opengl2_create_shader(v_tex_src, GL_VERTEX_SHADER);
300 GLuint v_fog_tex = opengl2_create_shader(v_fog_tex_src, GL_VERTEX_SHADER);
301 GLuint v_color = opengl2_create_shader(v_color_src, GL_VERTEX_SHADER);
302 GLuint v_fog_color = opengl2_create_shader(v_fog_color_src, GL_VERTEX_SHADER);
303 GLuint v_window = opengl2_create_shader(v_window_src, GL_VERTEX_SHADER);
305 GLuint f_aabitmap = opengl2_create_shader(f_aabitmap_src, GL_FRAGMENT_SHADER);
306 GLuint f_tex = opengl2_create_shader(f_tex_src, GL_FRAGMENT_SHADER);
307 GLuint f_fog_tex = opengl2_create_shader(f_fog_tex_src, GL_FRAGMENT_SHADER);
308 GLuint f_color = opengl2_create_shader(f_color_src, GL_FRAGMENT_SHADER);
309 GLuint f_fog_color = opengl2_create_shader(f_fog_color_src, GL_FRAGMENT_SHADER);
310 GLuint f_window = opengl2_create_shader(f_window_src, GL_FRAGMENT_SHADER);
312 aabitmap_prog = opengl2_create_program(v_tex, f_aabitmap);
313 tex_prog = opengl2_create_program(v_tex, f_tex);
314 fog_tex_prog = opengl2_create_program(v_fog_tex, f_fog_tex);
315 color_prog = opengl2_create_program(v_color, f_color);
316 fog_color_prog = opengl2_create_program(v_fog_color, f_fog_color);
317 window_prog = opengl2_create_program(v_window, f_window);
320 // set up orthographic projection var
321 // (this should never have to change while game is running)
326 ortho[0] = 2.0f / gr_screen.max_w;
327 ortho[5] = 2.0f / -gr_screen.max_h;
328 ortho[10] = -2.0f / 1.0f;
336 opengl2_shader_use(PROG_COLOR_FOG);
337 loc = glGetUniformLocation(fog_color_prog, "vOrtho");
338 glUniformMatrix4fv(loc, 1, GL_FALSE, ortho);
340 opengl2_shader_use(PROG_COLOR);
341 loc = glGetUniformLocation(color_prog, "vOrtho");
342 glUniformMatrix4fv(loc, 1, GL_FALSE, ortho);
344 opengl2_shader_use(PROG_TEX_FOG);
345 loc = glGetUniformLocation(fog_tex_prog, "vOrtho");
346 glUniformMatrix4fv(loc, 1, GL_FALSE, ortho);
348 opengl2_shader_use(PROG_AABITMAP);
349 loc = glGetUniformLocation(aabitmap_prog, "vOrtho");
350 glUniformMatrix4fv(loc, 1, GL_FALSE, ortho);
352 opengl2_shader_use(PROG_TEX);
353 loc = glGetUniformLocation(tex_prog, "vOrtho");
354 glUniformMatrix4fv(loc, 1, GL_FALSE, ortho);
356 opengl2_shader_update();
361 void opengl2_shader_cleanup()
364 glDeleteProgram(tex_prog);
369 glDeleteProgram(fog_tex_prog);
374 glDeleteProgram(aabitmap_prog);
379 glDeleteProgram(color_prog);
383 if (fog_color_prog) {
384 glDeleteProgram(fog_color_prog);
389 glDeleteProgram(window_prog);