private void SetupViewFrustum()
{
float xs, xc;
float ang = MathHelper.ToRadians(_viewDefinition.RenderView.FovX) * 0.5f;
idMath.SinCos(ang, out xs, out xc);
Vector3 tmp = xs * new Vector3(_viewDefinition.RenderView.ViewAxis.M11, _viewDefinition.RenderView.ViewAxis.M12, _viewDefinition.RenderView.ViewAxis.M13)
+ xc * new Vector3(_viewDefinition.RenderView.ViewAxis.M21, _viewDefinition.RenderView.ViewAxis.M22, _viewDefinition.RenderView.ViewAxis.M23);
Vector3 tmp2 = xs * new Vector3(_viewDefinition.RenderView.ViewAxis.M11, _viewDefinition.RenderView.ViewAxis.M12, _viewDefinition.RenderView.ViewAxis.M13)
- xc * new Vector3(_viewDefinition.RenderView.ViewAxis.M21, _viewDefinition.RenderView.ViewAxis.M22, _viewDefinition.RenderView.ViewAxis.M23);
_viewDefinition.Frustum[0] = new Plane(tmp.X, tmp.Y, tmp.Z, 0);
_viewDefinition.Frustum[1] = new Plane(tmp2.X, tmp2.Y, tmp2.Z, 0);
ang = MathHelper.ToRadians(_viewDefinition.RenderView.FovY) * 0.5f;
idMath.SinCos(ang, out xs, out xc);
tmp = xs * new Vector3(_viewDefinition.RenderView.ViewAxis.M11, _viewDefinition.RenderView.ViewAxis.M12, _viewDefinition.RenderView.ViewAxis.M13)
+ xc * new Vector3(_viewDefinition.RenderView.ViewAxis.M21, _viewDefinition.RenderView.ViewAxis.M22, _viewDefinition.RenderView.ViewAxis.M23);
tmp2 = xs * new Vector3(_viewDefinition.RenderView.ViewAxis.M11, _viewDefinition.RenderView.ViewAxis.M12, _viewDefinition.RenderView.ViewAxis.M13)
- xc * new Vector3(_viewDefinition.RenderView.ViewAxis.M21, _viewDefinition.RenderView.ViewAxis.M22, _viewDefinition.RenderView.ViewAxis.M23);
_viewDefinition.Frustum[2] = new Plane(tmp.X, tmp.Y, tmp.Z, 0);
_viewDefinition.Frustum[3] = new Plane(tmp2.X, tmp2.Y, tmp2.Z, 0);
// plane four is the front clipping plane
tmp = new Vector3(_viewDefinition.RenderView.ViewAxis.M11, _viewDefinition.RenderView.ViewAxis.M12, _viewDefinition.RenderView.ViewAxis.M13);
_viewDefinition.Frustum[4] = new Plane(tmp.X, tmp.Y, tmp.Z, 0);
for(int i = 0; i < 5; i++)
{
tmp = -_viewDefinition.Frustum[i].Normal;
tmp.Z = -(_viewDefinition.RenderView.ViewOrigin * _viewDefinition.Frustum[i].Normal).Length();
// flip direction so positive side faces out (FIXME: globally unify this)
_viewDefinition.Frustum[i] = new Plane(tmp.X, tmp.Y, tmp.Z, 0);
}
// eventually, plane five will be the rear clipping plane for fog
float dNear = idE.CvarSystem.GetFloat("r_znear");
if(_viewDefinition.RenderView.CramZNear == true)
{
dNear *= 0.25f;
}
float dFar = idE.MaxWorldSize;
float dLeft = dFar * idMath.Tan(MathHelper.ToRadians(_viewDefinition.RenderView.FovX * 0.5f));
float dUp = dFar * idMath.Tan(MathHelper.ToRadians(_viewDefinition.RenderView.FovY * 0.5f));
_viewDefinition.ViewFrustum = new idFrustum();
_viewDefinition.ViewFrustum.Origin = _viewDefinition.RenderView.ViewOrigin;
_viewDefinition.ViewFrustum.Axis = _viewDefinition.RenderView.ViewAxis;
_viewDefinition.ViewFrustum.SetSize(dNear, dFar, dLeft, dUp);
}