2 Deep Runner - 6dof shooter game for the SGI O2.
3 Copyright (C) 2023 John Tsiombikas <nuclear@mutantstargoat.com>
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <https://www.gnu.org/licenses/>.
24 static const float *vertex_ptr, *normal_ptr, *texcoord_ptr, *color_ptr;
25 static int vertex_nelem, texcoord_nelem, color_nelem;
26 static int vertex_stride, normal_stride, texcoord_stride, color_stride;
28 static char *glextstr;
29 static int have_edgeclamp = -1;
32 void gaw_viewport(int x, int y, int w, int h)
34 glViewport(x, y, w, h);
37 void gaw_matrix_mode(int mode)
43 void gaw_load_identity(void)
48 void gaw_load_matrix(const float *m)
53 void gaw_mult_matrix(const float *m)
58 void gaw_push_matrix(void)
63 void gaw_pop_matrix(void)
68 void gaw_get_modelview(float *m)
70 glGetFloatv(GL_MODELVIEW_MATRIX, m);
73 void gaw_get_projection(float *m)
75 glGetFloatv(GL_PROJECTION_MATRIX, m);
78 void gaw_translate(float x, float y, float z)
80 glTranslatef(x, y, z);
83 void gaw_rotate(float angle, float x, float y, float z)
85 glRotatef(angle, x, y, z);
88 void gaw_scale(float sx, float sy, float sz)
93 void gaw_ortho(float l, float r, float b, float t, float n, float f)
95 glOrtho(l, r, b, t, n, f);
98 void gaw_frustum(float l, float r, float b, float t, float n, float f)
100 glFrustum(l, r, b, t, n, f);
103 void gaw_perspective(float vfov, float aspect, float znear, float zfar)
105 gluPerspective(vfov, aspect, znear, zfar);
110 glPushAttrib(GL_ENABLE_BIT);
113 void gaw_restore(void)
118 void gaw_enable(int st)
122 glEnable(GL_CULL_FACE);
125 glEnable(GL_DEPTH_TEST);
128 glEnable(GL_ALPHA_TEST);
140 glEnable(GL_LIGHTING);
155 glEnable(GL_TEXTURE_1D);
158 glEnable(GL_TEXTURE_2D);
165 void gaw_disable(int st)
169 glDisable(GL_CULL_FACE);
172 glDisable(GL_DEPTH_TEST);
175 glDisable(GL_ALPHA_TEST);
184 glDisable(GL_DITHER);
187 glDisable(GL_LIGHTING);
190 glDisable(GL_LIGHT0);
193 glDisable(GL_LIGHT1);
196 glDisable(GL_LIGHT2);
199 glDisable(GL_LIGHT3);
202 glDisable(GL_TEXTURE_1D);
205 glDisable(GL_TEXTURE_2D);
212 void gaw_depth_func(int func)
214 glDepthFunc(func + GL_NEVER);
217 void gaw_blend_func(int src, int dest)
219 static const int glbf[] = {GL_ZERO, GL_ONE, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA};
220 glBlendFunc(glbf[src], glbf[dest]);
223 void gaw_alpha_func(int func, float ref)
225 glAlphaFunc(func + GL_NEVER, ref);
228 void gaw_clear_color(float r, float g, float b, float a)
230 glClearColor(r, g, b, a);
233 void gaw_clear(unsigned int flags)
235 unsigned int glflags = 0;
236 if(flags & GAW_COLORBUF) {
237 glflags |= GL_COLOR_BUFFER_BIT;
239 if(flags & GAW_DEPTHBUF) {
240 glflags |= GL_DEPTH_BUFFER_BIT;
242 if(flags & GAW_STENCILBUF) {
243 glflags |= GL_STENCIL_BUFFER_BIT;
248 void gaw_depth_mask(int mask)
253 void gaw_vertex_array(int nelem, int stride, const void *ptr)
255 vertex_nelem = nelem;
256 vertex_stride = stride;
260 void gaw_normal_array(int stride, const void *ptr)
262 normal_stride = stride;
266 void gaw_texcoord_array(int nelem, int stride, const void *ptr)
268 texcoord_nelem = nelem;
269 texcoord_stride = stride;
273 void gaw_color_array(int nelem, int stride, const void *ptr)
276 color_stride = stride;
280 static int glprim[] = {GL_POINTS, GL_LINES, GL_TRIANGLES, GL_QUADS, GL_QUAD_STRIP};
282 void gaw_draw(int prim, int nverts)
284 glEnableClientState(GL_VERTEX_ARRAY);
285 glVertexPointer(vertex_nelem, GL_FLOAT, vertex_stride, vertex_ptr);
287 glEnableClientState(GL_NORMAL_ARRAY);
288 glNormalPointer(GL_FLOAT, normal_stride, normal_ptr);
291 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
292 glTexCoordPointer(texcoord_nelem, GL_FLOAT, texcoord_stride, texcoord_ptr);
295 glEnableClientState(GL_COLOR_ARRAY);
296 glTexCoordPointer(color_nelem, GL_FLOAT, color_stride, color_ptr);
299 glDrawArrays(glprim[prim], 0, nverts);
301 glDisableClientState(GL_VERTEX_ARRAY);
302 glDisableClientState(GL_NORMAL_ARRAY);
303 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
304 glDisableClientState(GL_COLOR_ARRAY);
307 void gaw_draw_indexed(int prim, const unsigned int *idxarr, int nidx)
309 glEnableClientState(GL_VERTEX_ARRAY);
310 glVertexPointer(3, GL_FLOAT, 0, vertex_ptr);
312 glEnableClientState(GL_NORMAL_ARRAY);
313 glNormalPointer(GL_FLOAT, 0, normal_ptr);
316 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
317 glTexCoordPointer(2, GL_FLOAT, 0, texcoord_ptr);
320 glEnableClientState(GL_COLOR_ARRAY);
321 glTexCoordPointer(color_nelem, GL_FLOAT, color_stride, color_ptr);
324 glDrawElements(glprim[prim], nidx, GL_UNSIGNED_INT, idxarr);
326 glDisableClientState(GL_VERTEX_ARRAY);
327 glDisableClientState(GL_NORMAL_ARRAY);
328 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
329 glDisableClientState(GL_COLOR_ARRAY);
332 void gaw_begin(int prim)
334 glBegin(glprim[prim]);
342 void gaw_color3f(float r, float g, float b)
347 void gaw_color4f(float r, float g, float b, float a)
349 glColor4f(r, g, b, a);
352 void gaw_color3ub(int r, int g, int b)
357 void gaw_normal(float x, float y, float z)
362 void gaw_texcoord1f(float u)
367 void gaw_texcoord2f(float u, float v)
372 void gaw_vertex2f(float x, float y)
377 void gaw_vertex3f(float x, float y, float z)
382 void gaw_rect(float x1, float y1, float x2, float y2)
384 glRectf(x1, y1, x2, y2);
387 void gaw_pointsize(float sz)
392 void gaw_linewidth(float w)
397 int gaw_compile_begin(void)
399 int dlist = glGenLists(1);
400 glNewList(dlist, GL_COMPILE);
404 void gaw_compile_end(void)
409 void gaw_draw_compiled(int id)
414 void gaw_free_compiled(int id)
416 glDeleteLists(id, 1);
419 void gaw_mtl_diffuse(float r, float g, float b, float a)
426 glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, v);
429 void gaw_mtl_specular(float r, float g, float b, float shin)
436 glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, v);
437 glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, shin);
440 void gaw_mtl_emission(float r, float g, float b)
447 glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, v);
450 void gaw_texenv_sphmap(int enable)
453 glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
454 glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
455 glEnable(GL_TEXTURE_GEN_S);
456 glEnable(GL_TEXTURE_GEN_T);
458 glDisable(GL_TEXTURE_GEN_S);
459 glDisable(GL_TEXTURE_GEN_T);
463 unsigned int gaw_create_tex1d(int texfilter)
466 glGenTextures(1, &tex);
467 glBindTexture(GL_TEXTURE_1D, tex);
468 gaw_texfilter1d(texfilter);
472 unsigned int gaw_create_tex2d(int texfilter)
475 glGenTextures(1, &tex);
476 glBindTexture(GL_TEXTURE_2D, tex);
477 gaw_texfilter2d(texfilter);
481 void gaw_destroy_tex(unsigned int tex)
483 glDeleteTextures(1, &tex);
486 void gaw_bind_tex1d(int tex)
488 glBindTexture(GL_TEXTURE_1D, tex);
491 void gaw_bind_tex2d(int tex)
493 glBindTexture(GL_TEXTURE_2D, tex);
496 void gaw_texfilter1d(int texfilter)
500 glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
501 glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
505 glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
506 glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
510 glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
511 glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
519 void gaw_texfilter2d(int texfilter)
523 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
524 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
528 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
529 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
533 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
534 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
542 static int glwrap(int wrap)
544 if(have_edgeclamp == -1) {
546 glextstr = strdup_nf((char*)glGetString(GL_EXTENSIONS));
548 have_edgeclamp = strstr(glextstr, "SGIS_texture_edge_clamp") != 0;
554 return GL_CLAMP_TO_EDGE;
567 void gaw_texwrap1d(int wrap)
569 glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, glwrap(wrap));
572 void gaw_texwrap2d(int uwrap, int vwrap)
574 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, glwrap(uwrap));
575 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, glwrap(vwrap));
579 static const int glfmt[] = {GL_LUMINANCE, GL_RGB, GL_RGBA};
581 void gaw_tex1d(int ifmt, int xsz, int fmt, void *pix)
583 gluBuild1DMipmaps(GL_TEXTURE_1D, glfmt[ifmt], xsz, glfmt[fmt], GL_UNSIGNED_BYTE, pix);
586 void gaw_tex2d(int ifmt, int xsz, int ysz, int fmt, void *pix)
588 gluBuild2DMipmaps(GL_TEXTURE_2D, glfmt[ifmt], xsz, ysz, glfmt[fmt], GL_UNSIGNED_BYTE, pix);
591 void gaw_subtex2d(int lvl, int x, int y, int xsz, int ysz, int fmt, void *pix)
593 glTexSubImage2D(GL_TEXTURE_2D, lvl, x, y, xsz, ysz, glfmt[fmt], GL_UNSIGNED_BYTE, pix);
596 void gaw_set_tex1d(unsigned int texid)
599 glEnable(GL_TEXTURE_1D);
600 glBindTexture(GL_TEXTURE_1D, texid);
602 glDisable(GL_TEXTURE_1D);
606 void gaw_set_tex2d(unsigned int texid)
609 glEnable(GL_TEXTURE_2D);
610 glBindTexture(GL_TEXTURE_2D, texid);
612 glDisable(GL_TEXTURE_2D);
616 void gaw_ambient(float r, float g, float b)
623 glLightModelfv(GL_LIGHT_MODEL_AMBIENT, amb);
626 void gaw_light_dir(int idx, float x, float y, float z)
633 glLightfv(GL_LIGHT0 + idx, GL_POSITION, pos);
637 void gaw_light_color(int idx, float r, float g, float b, float s)
644 glLightfv(GL_LIGHT0 + idx, GL_DIFFUSE, color);
645 glLightfv(GL_LIGHT0 + idx, GL_SPECULAR, color);
648 void gaw_lighting_fast(void)
650 glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 0);
651 glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 0);
655 void gaw_fog_color(float r, float g, float b)
662 glFogfv(GL_FOG_COLOR, col);
665 void gaw_fog_linear(float z0, float z1)
667 glFogi(GL_FOG_MODE, GL_LINEAR);
668 glFogf(GL_FOG_START, z0);
669 glFogf(GL_FOG_END, z1);
672 void gaw_fog_fast(void)
674 glHint(GL_FOG_HINT, GL_FASTEST);
677 void gaw_poly_wire(void)
679 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
682 void gaw_poly_flat(void)
684 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
685 glShadeModel(GL_FLAT);
688 void gaw_poly_gouraud(void)
690 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
691 glShadeModel(GL_SMOOTH);