0,0 → 1,666 |
#include "zgl.h" |
#include <stdio.h> |
/* glVertex */ |
|
void glVertex4f(float x,float y,float z,float w) |
{ |
GLParam p[5]; |
|
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(float x,float y) |
{ |
glVertex4f(x,y,0,1); |
} |
|
void glVertex3f(float x,float y,float z) |
{ |
glVertex4f(x,y,z,1); |
} |
|
void glVertex3fv(float *v) |
{ |
glVertex4f(v[0],v[1],v[2],1); |
} |
|
/* glNormal */ |
|
void glNormal3f(float x,float y,float z) |
{ |
GLParam p[4]; |
|
p[0].op=OP_Normal; |
p[1].f=x; |
p[2].f=y; |
p[3].f=z; |
|
gl_add_op(p); |
} |
|
void glNormal3fv(float *v) |
{ |
glNormal3f(v[0],v[1],v[2]); |
} |
|
/* glColor */ |
|
void glColor4f(float r,float g,float b,float a) |
{ |
GLParam p[8]; |
|
p[0].op=OP_Color; |
p[1].f=b; |
p[2].f=g; |
p[3].f=r; |
p[4].f=a; |
/* direct convertion to integer to go faster if no shading */ |
RGBFtoRGBI(r,g,b,p[7].ui,p[6].ui,p[5].ui); |
gl_add_op(p); |
} |
|
void glColor4fv(float *v) |
{ |
GLParam p[8]; |
|
p[0].op=OP_Color; |
p[1].f=v[2]; |
p[2].f=v[1]; |
p[3].f=v[0]; |
p[4].f=v[3]; |
/* direct convertion to integer to go faster if no shading */ |
p[5].ui = (unsigned int) (v[2] * (ZB_POINT_RED_MAX - ZB_POINT_RED_MIN) + |
ZB_POINT_RED_MIN); |
p[6].ui = (unsigned int) (v[1] * (ZB_POINT_GREEN_MAX - ZB_POINT_GREEN_MIN) + |
ZB_POINT_GREEN_MIN); |
p[7].ui = (unsigned int) (v[0] * (ZB_POINT_BLUE_MAX - ZB_POINT_BLUE_MIN) + |
ZB_POINT_BLUE_MIN); |
gl_add_op(p); |
} |
|
void glColor3f(float x,float y,float z) |
{ |
glColor4f(x,y,z,1); |
} |
|
void glColor3fv(float *v) |
{ |
glColor4f(v[0],v[1],v[2],1); |
} |
|
|
/* TexCoord */ |
|
void glTexCoord4f(float s,float t,float r,float q) |
{ |
GLParam p[5]; |
|
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(float s,float t) |
{ |
glTexCoord4f(s,t,0,1); |
} |
|
void glTexCoord2fv(float *v) |
{ |
glTexCoord4f(v[0],v[1],0,1); |
} |
|
void glEdgeFlag(int flag) |
{ |
GLParam p[2]; |
|
p[0].op=OP_EdgeFlag; |
p[1].i=flag; |
|
gl_add_op(p); |
} |
|
/* misc */ |
|
void glShadeModel(int mode) |
{ |
GLParam p[2]; |
|
assert(mode == GL_FLAT || mode == GL_SMOOTH); |
|
p[0].op=OP_ShadeModel; |
p[1].i=mode; |
|
gl_add_op(p); |
} |
|
void glCullFace(int mode) |
{ |
GLParam p[2]; |
|
assert(mode == GL_BACK || |
mode == GL_FRONT || |
mode == GL_FRONT_AND_BACK); |
|
p[0].op=OP_CullFace; |
p[1].i=mode; |
|
gl_add_op(p); |
} |
|
void glFrontFace(int mode) |
{ |
GLParam p[2]; |
|
assert(mode == GL_CCW || mode == GL_CW); |
|
mode = (mode != GL_CCW); |
|
p[0].op=OP_FrontFace; |
p[1].i=mode; |
|
gl_add_op(p); |
} |
|
void glPolygonMode(int face,int mode) |
{ |
GLParam p[3]; |
|
assert(face == GL_BACK || |
face == GL_FRONT || |
face == GL_FRONT_AND_BACK); |
assert(mode == GL_POINT || mode == GL_LINE || mode==GL_FILL); |
|
p[0].op=OP_PolygonMode; |
p[1].i=face; |
p[2].i=mode; |
|
gl_add_op(p); |
} |
|
|
/* glEnable / glDisable */ |
|
void glEnable(int cap) |
{ |
GLParam p[3]; |
|
p[0].op=OP_EnableDisable; |
p[1].i=cap; |
p[2].i=1; |
|
gl_add_op(p); |
} |
|
void glDisable(int cap) |
{ |
GLParam p[3]; |
|
p[0].op=OP_EnableDisable; |
p[1].i=cap; |
p[2].i=0; |
|
gl_add_op(p); |
} |
|
/* glBegin / glEnd */ |
|
void glBegin(int mode) |
{ |
GLParam p[2]; |
|
p[0].op=OP_Begin; |
p[1].i=mode; |
|
gl_add_op(p); |
} |
|
void glEnd(void) |
{ |
GLParam p[1]; |
|
p[0].op=OP_End; |
|
gl_add_op(p); |
} |
|
/* matrix */ |
|
void glMatrixMode(int mode) |
{ |
GLParam p[2]; |
|
p[0].op=OP_MatrixMode; |
p[1].i=mode; |
|
gl_add_op(p); |
} |
|
void glLoadMatrixf(const float *m) |
{ |
GLParam p[17]; |
int i; |
|
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]; |
|
p[0].op=OP_LoadIdentity; |
|
gl_add_op(p); |
} |
|
void glMultMatrixf(const float *m) |
{ |
GLParam p[17]; |
int i; |
|
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]; |
|
p[0].op=OP_PushMatrix; |
|
gl_add_op(p); |
} |
|
void glPopMatrix(void) |
{ |
GLParam p[1]; |
|
p[0].op=OP_PopMatrix; |
|
gl_add_op(p); |
} |
|
void glRotatef(float angle,float x,float y,float z) |
{ |
GLParam p[5]; |
|
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(float x,float y,float z) |
{ |
GLParam p[4]; |
|
p[0].op=OP_Translate; |
p[1].f=x; |
p[2].f=y; |
p[3].f=z; |
|
gl_add_op(p); |
} |
|
void glScalef(float x,float y,float z) |
{ |
GLParam p[4]; |
|
p[0].op=OP_Scale; |
p[1].f=x; |
p[2].f=y; |
p[3].f=z; |
|
gl_add_op(p); |
} |
|
|
void glViewport(int x,int y,int width,int height) |
{ |
GLParam p[5]; |
|
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(double left,double right,double bottom,double top, |
double near,double farv) |
{ |
GLParam p[7]; |
|
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(int mode,int type,float *v) |
{ |
GLParam p[7]; |
int i,n; |
|
assert(mode == GL_FRONT || mode == GL_BACK || mode==GL_FRONT_AND_BACK); |
|
p[0].op=OP_Material; |
p[1].i=mode; |
p[2].i=type; |
n=4; |
if (type == GL_SHININESS) n=1; |
|
p[3].f=v[2]; |
p[4].f=v[1]; |
p[5].f=v[0]; |
p[6].f=v[3]; |
|
for(i=n;i<4;i++) p[3+i].f=0; |
|
gl_add_op(p); |
} |
|
void glMaterialf(int mode,int type,float v) |
{ |
GLParam p[7]; |
int i; |
|
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(int mode,int type) |
{ |
GLParam p[3]; |
|
p[0].op=OP_ColorMaterial; |
p[1].i=mode; |
p[2].i=type; |
|
gl_add_op(p); |
} |
|
void glLightfv(int light,int type,float *v) |
{ |
GLParam p[7]; |
int i; |
|
p[0].op=OP_Light; |
p[1].i=light; |
p[2].i=type; |
/* TODO: 3 composants ? */ |
for(i=0;i<4;i++) p[3+i].f=v[i]; |
|
gl_add_op(p); |
} |
|
|
void glLightf(int light,int type,float v) |
{ |
GLParam p[7]; |
int i; |
|
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(int pname,int param) |
{ |
GLParam p[6]; |
int i; |
|
p[0].op=OP_LightModel; |
p[1].i=pname; |
p[2].f=(float)param; |
for(i=0;i<4;i++) p[3+i].f=0; |
|
gl_add_op(p); |
} |
|
void glLightModelfv(int pname,float *param) |
{ |
GLParam p[6]; |
int i; |
|
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(int mask) |
{ |
GLParam p[2]; |
|
p[0].op=OP_Clear; |
p[1].i=mask; |
|
gl_add_op(p); |
} |
|
void glClearColor(float r,float g,float b,float a) |
{ |
GLParam p[5]; |
|
p[0].op=OP_ClearColor; |
p[1].f=b; |
p[2].f=g; |
p[3].f=r; |
p[4].f=a; |
|
gl_add_op(p); |
} |
|
void glClearDepth(double depth) |
{ |
GLParam p[2]; |
|
p[0].op=OP_ClearDepth; |
p[1].f=depth; |
|
gl_add_op(p); |
} |
|
|
/* textures */ |
|
void glTexImage2D( int target, int level, int components, |
int width, int height, int border, |
int format, int type, void *pixels) |
{ |
GLParam p[10]; |
|
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 glBindTexture(int target,int texture) |
{ |
GLParam p[3]; |
|
p[0].op=OP_BindTexture; |
p[1].i=target; |
p[2].i=texture; |
|
gl_add_op(p); |
} |
|
void glTexEnvi(int target,int pname,int param) |
{ |
GLParam p[8]; |
|
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(int target,int pname,int param) |
{ |
GLParam p[8]; |
|
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(int pname,int param) |
{ |
GLParam p[3]; |
|
p[0].op=OP_PixelStore; |
p[1].i=pname; |
p[2].i=param; |
|
gl_add_op(p); |
} |
|
/* selection */ |
|
void glInitNames(void) |
{ |
GLParam p[1]; |
|
p[0].op=OP_InitNames; |
|
gl_add_op(p); |
} |
|
void glPushName(unsigned int name) |
{ |
GLParam p[2]; |
|
p[0].op=OP_PushName; |
p[1].i=name; |
|
gl_add_op(p); |
} |
|
void glPopName(void) |
{ |
GLParam p[1]; |
|
p[0].op=OP_PopName; |
|
gl_add_op(p); |
} |
|
void glLoadName(unsigned int name) |
{ |
GLParam p[2]; |
|
p[0].op=OP_LoadName; |
p[1].i=name; |
|
gl_add_op(p); |
} |
|
void |
glPolygonOffset(GLfloat factor, GLfloat units) |
{ |
GLParam p[3]; |
p[0].op = OP_PolygonOffset; |
p[1].f = factor; |
p[2].f = units; |
} |
|
/* Special Functions */ |
|
void glCallList(unsigned int list) |
{ |
GLParam p[2]; |
|
p[0].op=OP_CallList; |
p[1].i=list; |
|
gl_add_op(p); |
} |
|
void glFlush(void) |
{ |
/* nothing to do */ |
} |
|
void glHint(int target,int mode) |
{ |
GLParam p[3]; |
|
p[0].op=OP_Hint; |
p[1].i=target; |
p[2].i=mode; |
|
gl_add_op(p); |
} |
|
/* Non standard functions */ |
|
void glDebug(int mode) |
{ |
GLContext *c=gl_get_context(); |
c->print_flag=mode; |
} |
|