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 " gl_FragColor = colorVar * texture2D(texture, texCoordVar).aaaa;\n"
124 static const char f_color_src[] =
125 "precision mediump float;\n"
126 "varying vec4 colorVar;\n"
129 " gl_FragColor = colorVar;\n"
132 static const char f_fog_color_src[] =
133 "precision mediump float;\n"
134 "varying vec4 colorVar;\n"
135 "varying vec4 secColorVar;\n"
138 " gl_FragColor = vec4(mix(secColorVar.rgb, colorVar.rgb, 1.0 - secColorVar.a), colorVar.a);\n"
141 static const char f_window_src[] =
142 "precision mediump float;\n"
143 "uniform sampler2D texture;\n"
144 "varying vec2 texCoordVar;\n"
147 " gl_FragColor = texture2D(texture, texCoordVar);\n"
151 static GLuint opengl2_create_shader(const char *src, GLenum type)
156 shader = glCreateShader(type);
162 glShaderSource(shader, 1, &src, NULL);
164 glCompileShader(shader);
166 glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
171 glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &len);
174 char *log = (char *) malloc(sizeof(char) * len);
176 glGetShaderInfoLog(shader, len, NULL, log);
177 nprintf(("OpenGL", "Error compiling shader:\n%s\n", log));
182 glDeleteShader(shader);
190 static GLuint opengl2_create_program(GLuint vert, GLuint frag)
195 program = glCreateProgram();
201 glAttachShader(program, vert);
202 glAttachShader(program, frag);
204 glBindAttribLocation(program, SDRI_POSITION, "vPosition");
205 glBindAttribLocation(program, SDRI_COLOR, "vColor");
206 glBindAttribLocation(program, SDRI_SEC_COLOR, "vSecColor");
207 glBindAttribLocation(program, SDRI_TEXCOORD, "vTexCoord");
209 glLinkProgram(program);
211 glGetProgramiv(program, GL_LINK_STATUS, &linked);
216 glGetProgramiv(program, GL_INFO_LOG_LENGTH, &len);
219 char *log = (char *) malloc(sizeof(char) * len);
221 glGetProgramInfoLog(program, len, NULL, log);
222 nprintf(("OpenGL", "Error linking program:\n%s\n", log));
227 glDeleteProgram(program);
235 void opengl2_shader_use(sdr_prog_t prog)
237 static sdr_prog_t current = PROG_INVALID;
239 if (prog == current) {
245 glUseProgram(tex_prog);
249 glUseProgram(aabitmap_prog);
253 glUseProgram(color_prog);
257 glUseProgram(window_prog);
261 glUseProgram(fog_tex_prog);
265 glUseProgram(fog_color_prog);
276 // update window ortho coords
277 void opengl2_shader_update()
283 ortho[0] = 2.0f / GL_viewport_w;
284 ortho[5] = 2.0f / -GL_viewport_h;
285 ortho[10] = -2.0f / 1.0f;
291 opengl2_shader_use(PROG_WINDOW);
292 GLint loc = glGetUniformLocation(window_prog, "vOrtho");
293 glUniformMatrix4fv(loc, 1, GL_FALSE, ortho);
296 int opengl2_shader_init()
298 GLuint v_tex = opengl2_create_shader(v_tex_src, GL_VERTEX_SHADER);
299 GLuint v_fog_tex = opengl2_create_shader(v_fog_tex_src, GL_VERTEX_SHADER);
300 GLuint v_color = opengl2_create_shader(v_color_src, GL_VERTEX_SHADER);
301 GLuint v_fog_color = opengl2_create_shader(v_fog_color_src, GL_VERTEX_SHADER);
302 GLuint v_window = opengl2_create_shader(v_window_src, GL_VERTEX_SHADER);
304 GLuint f_aabitmap = opengl2_create_shader(f_aabitmap_src, GL_FRAGMENT_SHADER);
305 GLuint f_tex = opengl2_create_shader(f_tex_src, GL_FRAGMENT_SHADER);
306 GLuint f_fog_tex = opengl2_create_shader(f_fog_tex_src, GL_FRAGMENT_SHADER);
307 GLuint f_color = opengl2_create_shader(f_color_src, GL_FRAGMENT_SHADER);
308 GLuint f_fog_color = opengl2_create_shader(f_fog_color_src, GL_FRAGMENT_SHADER);
309 GLuint f_window = opengl2_create_shader(f_window_src, GL_FRAGMENT_SHADER);
311 aabitmap_prog = opengl2_create_program(v_tex, f_aabitmap);
312 tex_prog = opengl2_create_program(v_tex, f_tex);
313 fog_tex_prog = opengl2_create_program(v_fog_tex, f_fog_tex);
314 color_prog = opengl2_create_program(v_color, f_color);
315 fog_color_prog = opengl2_create_program(v_fog_color, f_fog_color);
316 window_prog = opengl2_create_program(v_window, f_window);
319 // set up orthographic projection var
320 // (this should never have to change while game is running)
325 ortho[0] = 2.0f / gr_screen.max_w;
326 ortho[5] = 2.0f / -gr_screen.max_h;
327 ortho[10] = -2.0f / 1.0f;
335 opengl2_shader_use(PROG_COLOR_FOG);
336 loc = glGetUniformLocation(fog_color_prog, "vOrtho");
337 glUniformMatrix4fv(loc, 1, GL_FALSE, ortho);
339 opengl2_shader_use(PROG_COLOR);
340 loc = glGetUniformLocation(color_prog, "vOrtho");
341 glUniformMatrix4fv(loc, 1, GL_FALSE, ortho);
343 opengl2_shader_use(PROG_TEX_FOG);
344 loc = glGetUniformLocation(fog_tex_prog, "vOrtho");
345 glUniformMatrix4fv(loc, 1, GL_FALSE, ortho);
347 opengl2_shader_use(PROG_AABITMAP);
348 loc = glGetUniformLocation(aabitmap_prog, "vOrtho");
349 glUniformMatrix4fv(loc, 1, GL_FALSE, ortho);
351 opengl2_shader_use(PROG_TEX);
352 loc = glGetUniformLocation(tex_prog, "vOrtho");
353 glUniformMatrix4fv(loc, 1, GL_FALSE, ortho);
355 opengl2_shader_update();
360 void opengl2_shader_cleanup()
363 glDeleteProgram(tex_prog);
368 glDeleteProgram(fog_tex_prog);
373 glDeleteProgram(aabitmap_prog);
378 glDeleteProgram(color_prog);
382 if (fog_color_prog) {
383 glDeleteProgram(fog_color_prog);
388 glDeleteProgram(window_prog);