Panda3D
 All Classes Functions Variables Enumerations
vertex.cxx
1 #include "zgl.h"
2 #include "string.h"
3 
4 void gl_eval_viewport(GLContext * c) {
5  GLViewport *v = &c->viewport;
6  GLScissor *s = &c->scissor;
7 
8  PN_stdfloat xsize = v->xsize * (s->right - s->left);
9  PN_stdfloat xmin = v->xmin + v->xsize * s->left;
10  PN_stdfloat ysize = v->ysize * (s->top - s->bottom);
11  PN_stdfloat ymin = v->ymin + v->ysize * (1.0f - s->top);
12  PN_stdfloat zsize = (PN_stdfloat)(1 << (ZB_Z_BITS + ZB_POINT_Z_FRAC_BITS));
13 
14  v->trans.v[0] = ((xsize - 0.5f) / 2.0f) + xmin;
15  v->trans.v[1] = ((ysize - 0.5f) / 2.0f) + ymin;
16  v->trans.v[2] = ((zsize - 0.5f) / 2.0f) + ((1 << ZB_POINT_Z_FRAC_BITS)) / 2;
17 
18  v->scale.v[0] = (xsize - 0.5f) / 2.0f;
19  v->scale.v[1] = -(ysize - 0.5f) / 2.0f;
20  v->scale.v[2] = -((zsize - 0.5f) / 2.0f);
21 }
22 
23 /* coords, tranformation , clip code and projection */
24 /* TODO : handle all cases */
25 void
26 gl_vertex_transform(GLContext * c, GLVertex * v) {
27  PN_stdfloat *m;
28  V4 *n;
29 
30  if (c->lighting_enabled) {
31  /* eye coordinates needed for lighting */
32 
33  m = &c->matrix_model_view.m[0][0];
34  v->ec.v[0] = (v->coord.v[0] * m[0] + v->coord.v[1] * m[1] +
35  v->coord.v[2] * m[2] + m[3]);
36  v->ec.v[1] = (v->coord.v[0] * m[4] + v->coord.v[1] * m[5] +
37  v->coord.v[2] * m[6] + m[7]);
38  v->ec.v[2] = (v->coord.v[0] * m[8] + v->coord.v[1] * m[9] +
39  v->coord.v[2] * m[10] + m[11]);
40  v->ec.v[3] = (v->coord.v[0] * m[12] + v->coord.v[1] * m[13] +
41  v->coord.v[2] * m[14] + m[15]);
42 
43  /* projection coordinates */
44  m = &c->matrix_projection.m[0][0];
45  v->pc.v[0] = (v->ec.v[0] * m[0] + v->ec.v[1] * m[1] +
46  v->ec.v[2] * m[2] + v->ec.v[3] * m[3]);
47  v->pc.v[1] = (v->ec.v[0] * m[4] + v->ec.v[1] * m[5] +
48  v->ec.v[2] * m[6] + v->ec.v[3] * m[7]);
49  v->pc.v[2] = (v->ec.v[0] * m[8] + v->ec.v[1] * m[9] +
50  v->ec.v[2] * m[10] + v->ec.v[3] * m[11]);
51  v->pc.v[3] = (v->ec.v[0] * m[12] + v->ec.v[1] * m[13] +
52  v->ec.v[2] * m[14] + v->ec.v[3] * m[15]);
53 
54  m = &c->matrix_model_view_inv.m[0][0];
55  n = &c->current_normal;
56 
57  v->normal.v[0] = (n->v[0] * m[0] + n->v[1] * m[1] + n->v[2] * m[2]) * c->normal_scale;
58  v->normal.v[1] = (n->v[0] * m[4] + n->v[1] * m[5] + n->v[2] * m[6]) * c->normal_scale;
59  v->normal.v[2] = (n->v[0] * m[8] + n->v[1] * m[9] + n->v[2] * m[10]) * c->normal_scale;
60 
61  if (c->normalize_enabled) {
62  gl_V3_Norm(&v->normal);
63  }
64  } else {
65  /* no eye coordinates needed, no normal */
66  /* NOTE: W = 1 is assumed */
67  m = &c->matrix_model_projection.m[0][0];
68 
69  v->pc.v[0] = (v->coord.v[0] * m[0] + v->coord.v[1] * m[1] +
70  v->coord.v[2] * m[2] + m[3]);
71  v->pc.v[1] = (v->coord.v[0] * m[4] + v->coord.v[1] * m[5] +
72  v->coord.v[2] * m[6] + m[7]);
73  v->pc.v[2] = (v->coord.v[0] * m[8] + v->coord.v[1] * m[9] +
74  v->coord.v[2] * m[10] + m[11]);
75  if (c->matrix_model_projection_no_w_transform) {
76  v->pc.v[3] = m[15];
77  } else {
78  v->pc.v[3] = (v->coord.v[0] * m[12] + v->coord.v[1] * m[13] +
79  v->coord.v[2] * m[14] + m[15]);
80  }
81  }
82 
83  v->clip_code = gl_clipcode(v->pc.v[0], v->pc.v[1], v->pc.v[2], v->pc.v[3]);
84 }
Definition: zgl.h:141
Definition: zmath.h:26
Definition: zgl.h:77
Definition: zgl.h:106
Definition: zgl.h:84