Пример #1
0
/*
 * 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;
}
Пример #2
0
/*
 * 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);
}
Пример #3
0
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;
  
}