Panda3D
|
00001 #include "zgl.h" 00002 #include "string.h" 00003 00004 void gl_eval_viewport(GLContext * c) { 00005 GLViewport *v = &c->viewport; 00006 GLScissor *s = &c->scissor; 00007 00008 PN_stdfloat xsize = v->xsize * (s->right - s->left); 00009 PN_stdfloat xmin = v->xmin + v->xsize * s->left; 00010 PN_stdfloat ysize = v->ysize * (s->top - s->bottom); 00011 PN_stdfloat ymin = v->ymin + v->ysize * (1.0f - s->top); 00012 PN_stdfloat zsize = (PN_stdfloat)(1 << (ZB_Z_BITS + ZB_POINT_Z_FRAC_BITS)); 00013 00014 v->trans.v[0] = ((xsize - 0.5f) / 2.0f) + xmin; 00015 v->trans.v[1] = ((ysize - 0.5f) / 2.0f) + ymin; 00016 v->trans.v[2] = ((zsize - 0.5f) / 2.0f) + ((1 << ZB_POINT_Z_FRAC_BITS)) / 2; 00017 00018 v->scale.v[0] = (xsize - 0.5f) / 2.0f; 00019 v->scale.v[1] = -(ysize - 0.5f) / 2.0f; 00020 v->scale.v[2] = -((zsize - 0.5f) / 2.0f); 00021 } 00022 00023 /* coords, tranformation , clip code and projection */ 00024 /* TODO : handle all cases */ 00025 void 00026 gl_vertex_transform(GLContext * c, GLVertex * v) { 00027 PN_stdfloat *m; 00028 V4 *n; 00029 00030 if (c->lighting_enabled) { 00031 /* eye coordinates needed for lighting */ 00032 00033 m = &c->matrix_model_view.m[0][0]; 00034 v->ec.v[0] = (v->coord.v[0] * m[0] + v->coord.v[1] * m[1] + 00035 v->coord.v[2] * m[2] + m[3]); 00036 v->ec.v[1] = (v->coord.v[0] * m[4] + v->coord.v[1] * m[5] + 00037 v->coord.v[2] * m[6] + m[7]); 00038 v->ec.v[2] = (v->coord.v[0] * m[8] + v->coord.v[1] * m[9] + 00039 v->coord.v[2] * m[10] + m[11]); 00040 v->ec.v[3] = (v->coord.v[0] * m[12] + v->coord.v[1] * m[13] + 00041 v->coord.v[2] * m[14] + m[15]); 00042 00043 /* projection coordinates */ 00044 m = &c->matrix_projection.m[0][0]; 00045 v->pc.v[0] = (v->ec.v[0] * m[0] + v->ec.v[1] * m[1] + 00046 v->ec.v[2] * m[2] + v->ec.v[3] * m[3]); 00047 v->pc.v[1] = (v->ec.v[0] * m[4] + v->ec.v[1] * m[5] + 00048 v->ec.v[2] * m[6] + v->ec.v[3] * m[7]); 00049 v->pc.v[2] = (v->ec.v[0] * m[8] + v->ec.v[1] * m[9] + 00050 v->ec.v[2] * m[10] + v->ec.v[3] * m[11]); 00051 v->pc.v[3] = (v->ec.v[0] * m[12] + v->ec.v[1] * m[13] + 00052 v->ec.v[2] * m[14] + v->ec.v[3] * m[15]); 00053 00054 m = &c->matrix_model_view_inv.m[0][0]; 00055 n = &c->current_normal; 00056 00057 v->normal.v[0] = (n->v[0] * m[0] + n->v[1] * m[1] + n->v[2] * m[2]) * c->normal_scale; 00058 v->normal.v[1] = (n->v[0] * m[4] + n->v[1] * m[5] + n->v[2] * m[6]) * c->normal_scale; 00059 v->normal.v[2] = (n->v[0] * m[8] + n->v[1] * m[9] + n->v[2] * m[10]) * c->normal_scale; 00060 00061 if (c->normalize_enabled) { 00062 gl_V3_Norm(&v->normal); 00063 } 00064 } else { 00065 /* no eye coordinates needed, no normal */ 00066 /* NOTE: W = 1 is assumed */ 00067 m = &c->matrix_model_projection.m[0][0]; 00068 00069 v->pc.v[0] = (v->coord.v[0] * m[0] + v->coord.v[1] * m[1] + 00070 v->coord.v[2] * m[2] + m[3]); 00071 v->pc.v[1] = (v->coord.v[0] * m[4] + v->coord.v[1] * m[5] + 00072 v->coord.v[2] * m[6] + m[7]); 00073 v->pc.v[2] = (v->coord.v[0] * m[8] + v->coord.v[1] * m[9] + 00074 v->coord.v[2] * m[10] + m[11]); 00075 if (c->matrix_model_projection_no_w_transform) { 00076 v->pc.v[3] = m[15]; 00077 } else { 00078 v->pc.v[3] = (v->coord.v[0] * m[12] + v->coord.v[1] * m[13] + 00079 v->coord.v[2] * m[14] + m[15]); 00080 } 00081 } 00082 00083 v->clip_code = gl_clipcode(v->pc.v[0], v->pc.v[1], v->pc.v[2], v->pc.v[3]); 00084 }