/* * rcrv * * draws a rational curve * */ void rcrv(Coord (*geom)[4]) { Matrix d, tmp; float *m, xlast, ylast, zlast; Token *tok; int i; if (!vdevice.initialised) verror("rcrv: vogl not initialised"); mult4x4(d, vdevice.tbasis, geom); /* * Find the last point on the curve.... */ xlast = d[0][0] + d[1][0] + d[2][0] + d[3][0]; ylast = d[0][1] + d[1][1] + d[2][1] + d[3][1]; zlast = d[0][2] + d[1][2] + d[2][2] + d[3][2]; /* * Mult. by the precision matrix.... */ mult4x4(tmp, e, d); if (vdevice.inobject) { tok = newtokens(21); tok[0].i = RCURVE; (++tok)->i = nsegs; (++tok)->f = xlast; (++tok)->f = ylast; (++tok)->f = zlast; m = (float *)tmp; for (i = 0; i < 16; i++) (++tok)->f = *m++; return; } /* * Multiply by the current transformation matrix. */ mult4x4(d, tmp, vdevice.transmat->m); /* * Draw the curve..... */ drcurve(nsegs, d); /* * Set the current world position to the last point (This * is the untransformed one) */ vdevice.cpW[V_X] = xlast; vdevice.cpW[V_Y] = ylast; vdevice.cpW[V_Z] = zlast; }
/* * multmatrix * * Premultipy the top matrix on the stack by "mat" * */ void multmatrix(float (*mat)[4]) { Matrix prod; float *m; Token *p; int i; if (vdevice.inobject) { p = newtokens(17); p[0].i = MULTMATRIX; m = (float *)mat; for (i = 0; i < 16; i++) (++p)->f = *m++; return; } mult4x4(prod, mat, vdevice.transmat->m); loadmatrix(prod); }
void FrustumPlanes::CalculateFrustumPlanes() { // normalize value float n = 0.0; // Calculate a combined MVP from MV and P mult4x4(_mvp, _p, _mv); // Extract the frustum's left clipping plane and normalize it. _planes[0][0] = _mvp[3] + _mvp[0]; _planes[0][1] = _mvp[7] + _mvp[4]; _planes[0][2] = _mvp[11] + _mvp[8]; _planes[0][3] = _mvp[15] + _mvp[12]; n = (float) sqrt(_planes[0][0] * _planes[0][0] + _planes[0][1] * _planes[0][1] + _planes[0][2] * _planes[0][2]); _planes[0][0] /= n; _planes[0][1] /= n; _planes[0][2] /= n; _planes[0][3] /= n; // Extract the frustum's right clipping plane and normalize it. _planes[1][0] = _mvp[3] - _mvp[0]; _planes[1][1] = _mvp[7] - _mvp[4]; _planes[1][2] = _mvp[11] - _mvp[8]; _planes[1][3] = _mvp[15] - _mvp[12]; n = (float) sqrt(_planes[1][0] * _planes[1][0] + _planes[1][1] * _planes[1][1] + _planes[1][2] * _planes[1][2]); _planes[1][0] /= n; _planes[1][1] /= n; _planes[1][2] /= n; _planes[1][3] /= n; // Extract the frustum's bottom clipping plane and normalize it. _planes[2][0] = _mvp[3] + _mvp[1]; _planes[2][1] = _mvp[7] + _mvp[5]; _planes[2][2] = _mvp[11] + _mvp[9]; _planes[2][3] = _mvp[15] + _mvp[13]; n = (float) sqrt(_planes[2][0] * _planes[2][0] + _planes[2][1] * _planes[2][1] + _planes[2][2] * _planes[2][2]); _planes[2][0] /= n; _planes[2][1] /= n; _planes[2][2] /= n; _planes[2][3] /= n; // Extract the frustum's top clipping plane and normalize it. _planes[3][0] = _mvp[3] - _mvp[1]; _planes[3][1] = _mvp[7] - _mvp[5]; _planes[3][2] = _mvp[11] - _mvp[9]; _planes[3][3] = _mvp[15] - _mvp[13]; n = (float) sqrt(_planes[3][0] * _planes[3][0] + _planes[3][1] * _planes[3][1] + _planes[3][2] * _planes[3][2]); _planes[3][0] /= n; _planes[3][1] /= n; _planes[3][2] /= n; _planes[3][3] /= n; // Extract the frustum's far clipping plane and normalize it. _planes[4][0] = _mvp[3] - _mvp[2]; _planes[4][1] = _mvp[7] - _mvp[6]; _planes[4][2] = _mvp[11] - _mvp[10]; _planes[4][3] = _mvp[15] - _mvp[14]; n = (float) sqrt(_planes[4][0] * _planes[4][0] + _planes[4][1] * _planes[4][1] + _planes[4][2] * _planes[4][2]); _planes[4][0] /= n; _planes[4][1] /= n; _planes[4][2] /= n; _planes[4][3] /= n; // Extract the frustum's near clipping plane and normalize it. _planes[5][0] = _mvp[3] + _mvp[2]; _planes[5][1] = _mvp[7] + _mvp[6]; _planes[5][2] = _mvp[11] + _mvp[10]; _planes[5][3] = _mvp[15] + _mvp[14]; n = (float) sqrt(_planes[5][0] * _planes[5][0] + _planes[5][1] * _planes[5][1] + _planes[5][2] * _planes[5][2] ); _planes[5][0] /= n; _planes[5][1] /= n; _planes[5][2] /= n; _planes[5][3] /= n; }