void glopLoadIdentity(GLContext *c,GLParam *p) { gl_M4_Id(c->matrix_stack_ptr[c->matrix_mode]); gl_matrix_update(c); }
void glopPopMatrix(GLContext *c, GLParam *) { int n=c->matrix_mode; assert(c->matrix_stack_ptr[n] > c->matrix_stack[n]); c->matrix_stack_ptr[n]--; gl_matrix_update(c); }
void glopOrtho(GLContext *c,GLParam *p) { float *r; M4 m; float left=p[1].f; float right=p[2].f; float bottom=p[3].f; float top=p[4].f; float near=p[5].f; float far=p[6].f; float x,y,A,B,C,D; x = 2.0 / (right-left); y = 2.0 / (top-bottom); A = -(right+left) / (right-left); B = -(top+bottom) / (top-bottom); C = -2.0 / (far-near); D = -(far+near) / (far-near); r=&m.m[0][0]; r[0] = x; r[1] = 0; r[2] = 0; r[3] = A; r[4] = 0; r[5] = y; r[6] = 0; r[7] = B; r[8] = 0; r[9] = 0; r[10] = C; r[11] = D; r[12] = 0; r[13] = 0; r[14] = 0; r[15] = 1; gl_M4_MulLeft(c->matrix_stack_ptr[c->matrix_mode],&m); gl_matrix_update(c); }
void glopFrustum(GLContext *c,GLParam *p) { float *r; M4 m; float left=p[1].f; float right=p[2].f; float bottom=p[3].f; float top=p[4].f; float n_e_a_r=p[5].f; float farp=p[6].f; float x,y,A,B,C,D; x = (2.0f*n_e_a_r) / (right-left); y = (2.0f*n_e_a_r) / (top-bottom); A = (right+left) / (right-left); B = (top+bottom) / (top-bottom); C = -(farp+n_e_a_r) / ( farp-n_e_a_r); D = -(2.0f*farp*n_e_a_r) / (farp-n_e_a_r); r=&m.m[0][0]; r[0]= x; r[1]=0; r[2]=A; r[3]=0; r[4]= 0; r[5]=y; r[6]=B; r[7]=0; r[8]= 0; r[9]=0; r[10]=C; r[11]=D; r[12]= 0; r[13]=0; r[14]=-1; r[15]=0; gl_M4_MulLeft(c->matrix_stack_ptr[c->matrix_mode],&m); gl_matrix_update(c); }
void glopFrustum(GLContext *c,GLParam *p) { GLfloat *r; M4 m; GLfloat left=p[1].f; GLfloat right=p[2].f; GLfloat bottom=p[3].f; GLfloat top=p[4].f; GLfloat near=p[5].f; GLfloat farp=p[6].f; GLfloat x,y,A,B,C,D,tmp2=int2sll(2); x = slldiv(sllmul(tmp2,near), sllsub(right,left)); y = slldiv(sllmul(tmp2,near), sllsub(top,bottom)); A = slldiv(slladd(right,left), sllsub(right,left)); B = slldiv(slladd(top,bottom), sllsub(top,bottom)); C = slldiv(sllneg(slladd(farp,near)), sllsub(farp,near)); D = slldiv(sllneg(sllmul(sllmul(tmp2,farp),near)), sllsub(farp,near)); r=&m.m[0][0]; r[0]= x; r[1]=int2sll(0); r[2]=A; r[3]=int2sll(0); r[4]= int2sll(0); r[5]=y; r[6]=B; r[7]=int2sll(0); r[8]= int2sll(0); r[9]=int2sll(0); r[10]=C; r[11]=D; r[12]=int2sll(0); r[13]=int2sll(0); r[14]=int2sll(-1); r[15]=int2sll(0); gl_M4_MulLeft(c->matrix_stack_ptr[c->matrix_mode],&m); gl_matrix_update(c); }
void glopPushMatrix(GLContext *c, GLParam *) { int n = c->matrix_mode; M4 *m; assert((c->matrix_stack_ptr[n] - c->matrix_stack[n] + 1) < c->matrix_stack_depth_max[n]); m = ++c->matrix_stack_ptr[n]; gl_M4_Move(&m[0], &m[-1]); gl_matrix_update(c); }
void glopScale(GLContext *c, GLParam *p) { float *m; float x = p[1].f, y = p[2].f, z = p[3].f; m = &c->matrix_stack_ptr[c->matrix_mode]->m[0][0]; m[0] *= x; m[1] *= y; m[2] *= z; m[4] *= x; m[5] *= y; m[6] *= z; m[8] *= x; m[9] *= y; m[10] *= z; m[12] *= x; m[13] *= y; m[14] *= z; gl_matrix_update(c); }
void glopTranslate(GLContext *c, GLParam *p) { float *m; float x = p[1].f, y = p[2].f, z = p[3].f; m = &c->matrix_stack_ptr[c->matrix_mode]->m[0][0]; m[3] = m[0] * x + m[1] * y + m[2] * z + m[3]; m[7] = m[4] * x + m[5] * y + m[6] * z + m[7]; m[11] = m[8] * x + m[9] * y + m[10] * z + m[11]; m[15] = m[12] * x + m[13] * y + m[14] * z + m[15]; gl_matrix_update(c); }
void glopScale(GLContext *c,GLParam *p) { GLfloat *m; GLfloat x=p[1].f,y=p[2].f,z=p[3].f; m=&c->matrix_stack_ptr[c->matrix_mode]->m[0][0]; m[0] = sllmul(m[0],x); m[1] = sllmul(m[1],y); m[2] = sllmul(m[2],z); m[4] = sllmul(m[4],x); m[5] = sllmul(m[5],y); m[6] = sllmul(m[6],z); m[8] = sllmul(m[8],x); m[9] = sllmul(m[9],y); m[10] = sllmul(m[10],z); m[12] = sllmul(m[12],x); m[13] = sllmul(m[13],y); m[14] = sllmul(m[14],z); gl_matrix_update(c); }
void glopTranslate(GLContext *c,GLParam *p) { GLfloat *m; GLfloat x=p[1].f,y=p[2].f,z=p[3].f; m=&c->matrix_stack_ptr[c->matrix_mode]->m[0][0]; m[3] = slladd(slladd(slladd(sllmul(m[0], x), sllmul(m[1], y)), sllmul(m[2], z)), m[3]); m[7] = slladd(slladd(slladd(sllmul(m[4], x), sllmul(m[5], y)), sllmul(m[6], z)), m[7]); m[11] = slladd(slladd(slladd(sllmul(m[8], x), sllmul(m[9], y)), sllmul(m[10], z)), m[11]); m[15] = slladd(slladd(slladd(sllmul(m[12], x), sllmul(m[13], y)), sllmul(m[14], z)), m[15]); gl_matrix_update(c); }
void glopMultMatrix(GLContext *c, GLParam *p) { M4 m; int i; GLParam *q; q = p + 1; for (i = 0; i < 4; i++) { m.m[0][i] = q[0].f; m.m[1][i] = q[1].f; m.m[2][i] = q[2].f; m.m[3][i] = q[3].f; q += 4; } gl_M4_MulLeft(c->matrix_stack_ptr[c->matrix_mode], &m); gl_matrix_update(c); }
void glopLoadMatrix(GLContext *c, GLParam *p) { M4 *m; int i; GLParam *q; m = c->matrix_stack_ptr[c->matrix_mode]; q = p + 1; for (i = 0; i < 4; i++) { m->m[0][i] = q[0].f; m->m[1][i] = q[1].f; m->m[2][i] = q[2].f; m->m[3][i] = q[3].f; q += 4; } gl_matrix_update(c); }
void glopRotate(GLContext *c,GLParam *p) { M4 m; float u[3]; float angle; int dir_code; angle = p[1].f * M_PI / 180.0; u[0]=p[2].f; u[1]=p[3].f; u[2]=p[4].f; /* simple case detection */ dir_code = ((u[0] != 0)<<2) | ((u[1] != 0)<<1) | (u[2] != 0); switch(dir_code) { case 0: gl_M4_Id(&m); break; case 4: if (u[0] < 0) angle=-angle; gl_M4_Rotate(&m,angle,0); break; case 2: if (u[1] < 0) angle=-angle; gl_M4_Rotate(&m,angle,1); break; case 1: if (u[2] < 0) angle=-angle; gl_M4_Rotate(&m,angle,2); break; default: { float cost, sint; /* normalize vector */ float len = u[0]*u[0]+u[1]*u[1]+u[2]*u[2]; if (len == 0.0f) return; len = 1.0f / sqrt(len); u[0] *= len; u[1] *= len; u[2] *= len; /* store cos and sin values */ cost=cos(angle); sint=sin(angle); /* fill in the values */ m.m[3][0]=m.m[3][1]=m.m[3][2]= m.m[0][3]=m.m[1][3]=m.m[2][3]=0.0f; m.m[3][3]=1.0f; /* do the math */ m.m[0][0]=u[0]*u[0]+cost*(1-u[0]*u[0]); m.m[1][0]=u[0]*u[1]*(1-cost)-u[2]*sint; m.m[2][0]=u[2]*u[0]*(1-cost)+u[1]*sint; m.m[0][1]=u[0]*u[1]*(1-cost)+u[2]*sint; m.m[1][1]=u[1]*u[1]+cost*(1-u[1]*u[1]); m.m[2][1]=u[1]*u[2]*(1-cost)-u[0]*sint; m.m[0][2]=u[2]*u[0]*(1-cost)-u[1]*sint; m.m[1][2]=u[1]*u[2]*(1-cost)+u[0]*sint; m.m[2][2]=u[2]*u[2]+cost*(1-u[2]*u[2]); } } gl_M4_MulLeft(c->matrix_stack_ptr[c->matrix_mode],&m); gl_matrix_update(c); }
void glopRotate(GLContext *c,GLParam *p) { #define SLL_M_PI dbl2sll(M_PI) M4 m; GLfloat u[3]; GLfloat angle; int dir_code; angle = slldiv(sllmul(p[1].f, SLL_M_PI), int2sll(180)); u[0]=p[2].f; u[1]=p[3].f; u[2]=p[4].f; /* simple case detection */ dir_code = ((sllvalue(u[0]) != sllvalue(int2sll(0)))<<2) | ((sllvalue(u[1]) != sllvalue(int2sll(0)))<<1) | (sllvalue(u[2]) != sllvalue(int2sll(0))); switch(dir_code) { case 0: gl_M4_Id(&m); break; case 4: if (sllvalue(u[0]) < sllvalue(int2sll(0))) angle=sllneg(angle); gl_M4_Rotate(&m,angle,0); break; case 2: if (sllvalue(u[1]) < sllvalue(int2sll(0))) angle=sllneg(angle); gl_M4_Rotate(&m,angle,1); break; case 1: if (sllvalue(u[2]) < sllvalue(int2sll(0))) angle=sllneg(angle); gl_M4_Rotate(&m,angle,2); break; default: { GLfloat cost, sint; /* normalize vector */ GLfloat len = slladd( slladd( sllmul(u[0],u[0]), sllmul(u[1],u[1]) ), sllmul(u[2],u[2])); if (sllvalue(len) == sllvalue(int2sll(0))) return; len = slldiv(int2sll(1), sllsqrt(len)); u[0] = sllmul(u[0], len); u[1] = sllmul(u[1], len); u[2] = sllmul(u[2], len); /* store cos and sin values */ cost=sllcos(angle); sint=sllsin(angle); /* fill in the values */ m.m[3][0]=m.m[3][1]=m.m[3][2]= m.m[0][3]=m.m[1][3]=m.m[2][3]=int2sll(0); m.m[3][3]=int2sll(1); /* do the math */ m.m[0][0]=slladd(sllmul(u[0],u[0]), sllmul(cost, sllsub(int2sll(1), sllmul(u[0],u[0])))); m.m[1][0]=sllsub(sllmul(sllmul(u[0],u[1]), sllsub(int2sll(1), cost)), sllmul(u[2],sint)); m.m[2][0]=slladd(sllmul(sllmul(u[2],u[0]), sllsub(int2sll(1), cost)), sllmul(u[1],sint)); m.m[0][1]=slladd(sllmul(sllmul(u[0],u[1]), sllsub(int2sll(1), cost)), sllmul(u[2],sint)); m.m[1][1]=slladd(sllmul(u[1],u[1]), sllmul(cost, sllsub(int2sll(1), sllmul(u[1],u[1])))); m.m[2][1]=sllsub(sllmul(sllmul(u[1],u[2]), sllsub(int2sll(1), cost)), sllmul(u[0],sint)); m.m[0][2]=sllsub(sllmul(sllmul(u[2],u[0]), sllsub(int2sll(1), cost)), sllmul(u[1],sint)); m.m[1][2]=slladd(sllmul(sllmul(u[1],u[2]), sllsub(int2sll(1), cost)), sllmul(u[0],sint)); m.m[2][2]=slladd(sllmul(u[2],u[2]), sllmul(cost, sllsub(int2sll(1), sllmul(u[2],u[2])))); } } gl_M4_MulLeft(c->matrix_stack_ptr[c->matrix_mode],&m); gl_matrix_update(c); }