Panda3D
 All Classes Functions Variables Enumerations
vertex.cxx
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 }
 All Classes Functions Variables Enumerations