ref: 47f57bd42b9d8eb3ee5d9b34c4221c61cc161395
dir: /src/api.c/
#include "zgl.h" //#include <stdio.h> /* glVertex */ void glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w) { GLParam p[5]; #include "error_check_no_context.h" p[0].op = OP_Vertex; p[1].f = x; p[2].f = y; p[3].f = z; p[4].f = w; gl_add_op(p); } void glVertex2f(GLfloat x, GLfloat y) { glVertex4f(x, y, 0, 1); } void glVertex3f(GLfloat x, GLfloat y, GLfloat z) { glVertex4f(x, y, z, 1); } void glVertex3fv(GLfloat* v) { glVertex4f(v[0], v[1], v[2], 1); } /* glNormal */ void glNormal3f(GLfloat x, GLfloat y, GLfloat z) { GLParam p[4]; #include "error_check_no_context.h" p[0].op = OP_Normal; //NODO: Normalize vector here if it's enabled, so that the display list contains only normalized normals. //Redacted because: It would fuck up the matrix math. Dang it! p[1].f = x; p[2].f = y; p[3].f = z; gl_add_op(p); } void glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2){ glBegin(GL_QUADS); glVertex2f( x1, y1 ); glVertex2f( x2, y1 ); glVertex2f( x2, y2 ); glVertex2f( x1, y2 ); glEnd(); } void glNormal3fv(GLfloat* v) { glNormal3f(v[0], v[1], v[2]); } /* glColor */ void glColor4f(GLfloat r, GLfloat g, GLfloat b, GLfloat a) { GLParam p[8]; #include "error_check_no_context.h" p[0].op = OP_Color; p[1].f = r; p[2].f = g; p[3].f = b; p[4].f = a; /* direct convertion to GLinteger to go faster if no shading */ /* p[5].ui = (GLuint) (r * (ZB_POINT_RED_MAX - ZB_POINT_RED_MIN) + ZB_POINT_RED_MIN); p[6].ui = (GLuint) (g * (ZB_POINT_GREEN_MAX - ZB_POINT_GREEN_MIN) + ZB_POINT_GREEN_MIN); p[7].ui = (GLuint) (b * (ZB_POINT_BLUE_MAX - ZB_POINT_BLUE_MIN) + ZB_POINT_BLUE_MIN); */ p[5].ui = (((GLuint)(r * COLOR_CORRECTED_MULT_MASK) + COLOR_MIN_MULT) & COLOR_MASK); p[6].ui = (((GLuint)(g * COLOR_CORRECTED_MULT_MASK) + COLOR_MIN_MULT) & COLOR_MASK); p[7].ui = (((GLuint)(b * COLOR_CORRECTED_MULT_MASK) + COLOR_MIN_MULT) & COLOR_MASK); gl_add_op(p); } void glColor4fv(GLfloat* v) { GLParam p[8]; #include "error_check_no_context.h" p[0].op = OP_Color; p[1].f = v[0]; p[2].f = v[1]; p[3].f = v[2]; p[4].f = v[3]; p[5].ui = (((GLuint)(v[0] * COLOR_CORRECTED_MULT_MASK) + COLOR_MIN_MULT) & COLOR_MASK); p[6].ui = (((GLuint)(v[1] * COLOR_CORRECTED_MULT_MASK) + COLOR_MIN_MULT) & COLOR_MASK); p[7].ui = (((GLuint)(v[2] * COLOR_CORRECTED_MULT_MASK) + COLOR_MIN_MULT) & COLOR_MASK); gl_add_op(p); } void glColor3f(GLfloat x, GLfloat y, GLfloat z) { glColor4f(x, y, z, 1); } void glColor3fv(GLfloat* v) { glColor4f(v[0], v[1], v[2], 1); } /* TexCoord */ void glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q) { GLParam p[5]; #include "error_check_no_context.h" p[0].op = OP_TexCoord; p[1].f = s; p[2].f = t; p[3].f = r; p[4].f = q; gl_add_op(p); } void glTexCoord2f(GLfloat s, GLfloat t) { glTexCoord4f(s, t, 0, 1); } void glTexCoord2fv(GLfloat* v) { glTexCoord4f(v[0], v[1], 0, 1); } void glEdgeFlag(GLint flag) { GLParam p[2]; #define NEED_CONTEXT #include "error_check_no_context.h" #if TGL_FEATURE_ERROR_CHECK == 1 if(flag != GL_TRUE && flag != GL_FALSE) #define ERROR_FLAG GL_INVALID_ENUM #include "error_check.h" #endif p[0].op = OP_EdgeFlag; p[1].i = flag; gl_add_op(p); } /* misc */ void glShadeModel(GLint mode) { GLParam p[2]; #define NEED_CONTEXT #include "error_check_no_context.h" #if TGL_FEATURE_ERROR_CHECK == 1 if(mode != GL_FLAT && mode != GL_SMOOTH) #define ERROR_FLAG GL_INVALID_ENUM #include "error_check.h" #else if(mode != GL_FLAT && mode != GL_SMOOTH) return; //Assume that they know what they're doing. #endif p[0].op = OP_ShadeModel; p[1].i = mode; gl_add_op(p); } void glCullFace(GLint mode) { GLParam p[2]; #define NEED_CONTEXT #include "error_check_no_context.h" #if TGL_FEATURE_ERROR_CHECK == 1 if(!(mode == GL_BACK || mode == GL_FRONT || mode == GL_FRONT_AND_BACK)) #define ERROR_FLAG GL_INVALID_ENUM #include "error_check.h" #else //assert(mode == GL_BACK || mode == GL_FRONT || mode == GL_FRONT_AND_BACK); //Assume it's alrgiht. #endif p[0].op = OP_CullFace; p[1].i = mode; gl_add_op(p); } void glFrontFace(GLint mode) { GLParam p[2]; #define NEED_CONTEXT #include "error_check_no_context.h" #if TGL_FEATURE_ERROR_CHECK == 1 if(!(mode == GL_CCW || mode == GL_CW)) #define ERROR_FLAG GL_INVALID_ENUM #include "error_check.h" #else //if(!(mode == GL_CCW || mode == GL_CW)) return; #endif mode = (mode != GL_CCW); p[0].op = OP_FrontFace; p[1].i = mode; gl_add_op(p); } void glPolygonMode(GLint face, GLint mode) { GLParam p[3]; #define NEED_CONTEXT #include "error_check_no_context.h" #if TGL_FEATURE_ERROR_CHECK == 1 if(!( (face == GL_BACK || face == GL_FRONT || face == GL_FRONT_AND_BACK)&& (mode == GL_POINT || mode == GL_LINE || mode == GL_FILL) ) ) #define ERROR_FLAG GL_INVALID_ENUM #include "error_check.h" #else //assert(face == GL_BACK || face == GL_FRONT || face == GL_FRONT_AND_BACK); //assert(mode == GL_POINT || mode == GL_LINE || mode == GL_FILL); #endif p[0].op = OP_PolygonMode; p[1].i = face; p[2].i = mode; gl_add_op(p); } void glDepthMask(GLint i){ #include "error_check_no_context.h" gl_get_context()->zb->depth_write = (i==GL_TRUE); } /* glEnable / glDisable */ //TODO go to glopEnableDisable and add error checking there on values there. void glEnable(GLint cap) { GLParam p[3]; #include "error_check_no_context.h" p[0].op = OP_EnableDisable; p[1].i = cap; p[2].i = 1; gl_add_op(p); } void glDisable(GLint cap) { GLParam p[3]; #include "error_check_no_context.h" p[0].op = OP_EnableDisable; p[1].i = cap; p[2].i = 0; gl_add_op(p); } /* glBegin / glEnd */ void glBegin(GLint mode) { GLParam p[2]; #define NEED_CONTEXT #include "error_check_no_context.h" p[0].op = OP_Begin; p[1].i = mode; #if TGL_FEATURE_ERROR_CHECK ==1 //Check for compatibility of selection if(mode != GL_POINTS && mode != GL_LINES && mode != GL_LINE_LOOP && mode != GL_LINE_STRIP && #if TGL_FEATURE_GL_POLYGON == 1 mode != GL_POLYGON && #endif mode != GL_TRIANGLES && mode != GL_TRIANGLE_FAN && mode != GL_TRIANGLE_STRIP && mode != GL_QUADS && mode != GL_QUAD_STRIP ) #define ERROR_FLAG GL_INVALID_ENUM #include "error_check.h" #endif gl_add_op(p); } void glEnd(void) { GLParam p[1]; #include "error_check_no_context.h" p[0].op = OP_End; gl_add_op(p); } /* matrix */ void glMatrixMode(GLint mode) { GLParam p[2]; #include "error_check_no_context.h" p[0].op = OP_MatrixMode; p[1].i = mode; gl_add_op(p); } void glLoadMatrixf(const GLfloat* m) { GLParam p[17]; GLint i; #include "error_check_no_context.h" p[0].op = OP_LoadMatrix; for (i = 0; i < 16; i++) p[i + 1].f = m[i]; gl_add_op(p); } void glLoadIdentity(void) { GLParam p[1]; #include "error_check_no_context.h" p[0].op = OP_LoadIdentity; gl_add_op(p); } void glMultMatrixf(const GLfloat* m) { GLParam p[17]; GLint i; #include "error_check_no_context.h" p[0].op = OP_MultMatrix; for (i = 0; i < 16; i++) p[i + 1].f = m[i]; gl_add_op(p); } void glPushMatrix(void) { GLParam p[1]; #include "error_check_no_context.h" p[0].op = OP_PushMatrix; gl_add_op(p); } void glPopMatrix(void) { GLParam p[1]; #include "error_check_no_context.h" p[0].op = OP_PopMatrix; gl_add_op(p); } void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z) { GLParam p[5]; #include "error_check_no_context.h" p[0].op = OP_Rotate; p[1].f = angle; p[2].f = x; p[3].f = y; p[4].f = z; gl_add_op(p); } void glTranslatef(GLfloat x, GLfloat y, GLfloat z) { GLParam p[4]; #include "error_check_no_context.h" p[0].op = OP_Translate; p[1].f = x; p[2].f = y; p[3].f = z; gl_add_op(p); } void glScalef(GLfloat x, GLfloat y, GLfloat z) { GLParam p[4]; #include "error_check_no_context.h" p[0].op = OP_Scale; p[1].f = x; p[2].f = y; p[3].f = z; gl_add_op(p); } void glViewport(GLint x, GLint y, GLint width, GLint height) { GLParam p[5]; #include "error_check_no_context.h" p[0].op = OP_Viewport; p[1].i = x; p[2].i = y; p[3].i = width; p[4].i = height; gl_add_op(p); } void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble farv) { GLParam p[7]; #include "error_check_no_context.h" p[0].op = OP_Frustum; p[1].f = left; p[2].f = right; p[3].f = bottom; p[4].f = top; p[5].f = near; p[6].f = farv; gl_add_op(p); } /* lightening */ void glMaterialfv(GLint mode, GLint type, GLfloat* v) { GLParam p[7]; GLint i, n; #define NEED_CONTEXT #include "error_check_no_context.h" #if TGL_FEATURE_ERROR_CHECK == 1 if(!(mode == GL_FRONT || mode == GL_BACK || mode == GL_FRONT_AND_BACK)) #define ERROR_FLAG GL_INVALID_ENUM #include "error_check.h" #else //assert(mode == GL_FRONT || mode == GL_BACK || mode == GL_FRONT_AND_BACK); #endif p[0].op = OP_Material; p[1].i = mode; p[2].i = type; n = 4;//This appears to be a hack... to avoid a jump instruction? What the hell? if (type == GL_SHININESS) n = 1; for (i = 0; i < 4; i++) p[3 + i].f = v[i]; for (i = n; i < 4; i++) p[3 + i].f = 0; gl_add_op(p); } void glMaterialf(GLint mode, GLint type, GLfloat v) { GLParam p[7]; GLint i; #include "error_check_no_context.h" p[0].op = OP_Material; p[1].i = mode; p[2].i = type; p[3].f = v; for (i = 0; i < 3; i++) p[4 + i].f = 0; gl_add_op(p); } void glColorMaterial(GLint mode, GLint type) { GLParam p[3]; #include "error_check_no_context.h" p[0].op = OP_ColorMaterial; p[1].i = mode; p[2].i = type; gl_add_op(p); } void glLightfv(GLint light, GLint type, GLfloat* v) { GLParam p[7]; GLint i; #include "error_check_no_context.h" p[0].op = OP_Light; p[1].i = light; p[2].i = type; /* TODO: 3 components ? */ for (i = 0; i < 4; i++) p[3 + i].f = v[i]; gl_add_op(p); } void glLightf(GLint light, GLint type, GLfloat v) { GLParam p[7]; GLint i; #include "error_check_no_context.h" p[0].op = OP_Light; p[1].i = light; p[2].i = type; p[3].f = v; for (i = 0; i < 3; i++) p[4 + i].f = 0; gl_add_op(p); } void glLightModeli(GLint pname, GLint param) { GLParam p[6]; #include "error_check_no_context.h" p[0].op = OP_LightModel; p[1].i = pname; p[2].f = (GLfloat)param; // for(i=0;i<4;i++) p[3+i].f=0; // for(i=0;i<3;i++) p[3+i].f=0; p[3].f = 0; p[4].f = 0; p[5].f = 0; gl_add_op(p); } void glLightModelfv(GLint pname, GLfloat* param) { GLParam p[6]; GLint i; #include "error_check_no_context.h" p[0].op = OP_LightModel; p[1].i = pname; for (i = 0; i < 4; i++) p[2 + i].f = param[i]; gl_add_op(p); } /* clear */ void glClear(GLint mask) { GLParam p[2]; #include "error_check_no_context.h" p[0].op = OP_Clear; p[1].i = mask; gl_add_op(p); } void glClearColor(GLfloat r, GLfloat g, GLfloat b, GLfloat a) { GLParam p[5]; #include "error_check_no_context.h" p[0].op = OP_ClearColor; p[1].f = r; p[2].f = g; p[3].f = b; p[4].f = a; gl_add_op(p); } void glClearDepth(GLdouble depth) { GLParam p[2]; #include "error_check_no_context.h" p[0].op = OP_ClearDepth; p[1].f = depth; gl_add_op(p); } /* textures */ //TODO Check inputs into glopTexImage2D void glTexImage2D(GLint target, GLint level, GLint components, GLint width, GLint height, GLint border, GLint format, GLint type, void* pixels) { GLParam p[10]; #include "error_check_no_context.h" p[0].op = OP_TexImage2D; p[1].i = target; p[2].i = level; p[3].i = components; p[4].i = width; p[5].i = height; p[6].i = border; p[7].i = format; p[8].i = type; p[9].p = pixels; gl_add_op(p); } void glTexImage1D(GLint target, GLint level, GLint components, GLint width, GLint border, GLint format, GLint type, void* pixels) { GLParam p[10]; #include "error_check_no_context.h" p[0].op = OP_TexImage1D; p[1].i = target; p[2].i = level; p[3].i = components; p[4].i = width; p[5].i = border; p[6].i = format; p[7].i = type; p[8].p = pixels; gl_add_op(p); } void glBindTexture(GLint target, GLint texture) { GLParam p[3]; #include "error_check_no_context.h" p[0].op = OP_BindTexture; p[1].i = target; p[2].i = texture; gl_add_op(p); } void glTexEnvi(GLint target, GLint pname, GLint param) { // GLParam p[8]; #include "error_check_no_context.h" // p[0].op = OP_TexEnv; // p[1].i = target; // p[2].i = pname; // p[3].i = param; // p[4].f = 0; // p[5].f = 0; // p[6].f = 0; // p[7].f = 0; // gl_add_op(p); } void glTexParameteri(GLint target, GLint pname, GLint param) { // GLParam p[8]; #include "error_check_no_context.h" // p[0].op = OP_TexParameter; // p[1].i = target; // p[2].i = pname; // p[3].i = param; // p[4].f = 0; // p[5].f = 0; // p[6].f = 0; // p[7].f = 0; // gl_add_op(p); } /* void glPixelStorei(GLint pname, GLint param) { GLParam p[3]; #include "error_check_no_context.h" p[0].op = OP_PixelStore; p[1].i = pname; p[2].i = param; gl_add_op(p); } */ /* selection */ void glInitNames(void) { GLParam p[1]; #include "error_check_no_context.h" p[0].op = OP_InitNames; gl_add_op(p); } void glPushName(GLuint name) { GLParam p[2]; #include "error_check_no_context.h" p[0].op = OP_PushName; p[1].i = name; gl_add_op(p); } void glPopName(void) { GLParam p[1]; #include "error_check_no_context.h" p[0].op = OP_PopName; gl_add_op(p); } void glLoadName(GLuint name) { GLParam p[2]; #include "error_check_no_context.h" p[0].op = OP_LoadName; p[1].i = name; gl_add_op(p); } void glPolygonOffset(GLfloat factor, GLfloat units) { GLParam p[3]; #include "error_check_no_context.h" p[0].op = OP_PolygonOffset; p[1].f = factor; p[2].f = units; gl_add_op(p); } /* Special Functions */ void glCallList(GLuint list) { GLParam p[2]; #include "error_check_no_context.h" p[0].op = OP_CallList; p[1].i = list; gl_add_op(p); } //TODO: Implement a barrier for worker threads if we ever add multithreading support. void glFlush(void) { /* nothing to do */ } void glHint(GLint target, GLint mode) { #include "error_check_no_context.h" } /* Non standard functions */ void glDebug(GLint mode) { GLContext* c = gl_get_context(); #include "error_check.h" c->print_flag = mode; }