Example #1
0
	void Frustum::Update(const Matrix44<float>& aCameraOrientation, float aAspectRatio, float aFov)
	{
		float Hnear = 2.f * tan(aFov / 2.f) * myNear;
		float Wnear = Hnear * aAspectRatio;

		myPosition = aCameraOrientation.GetTranslation();
		Vector3f rightVector = GetNormalized(aCameraOrientation.GetRightVector());
		Vector3f forwardVector = GetNormalized(aCameraOrientation.GetForwardVector());
		Vector3f upVector = GetNormalized(aCameraOrientation.GetUpVector());
		
		Vector3f nc = myPosition + forwardVector * myNear;

		Vector3f ntl = nc + (upVector * Hnear / 2.f) - (rightVector * Wnear / 2.f);
		Vector3f ntr = nc + (upVector * Hnear / 2.f) + (rightVector * Wnear / 2.f);
		Vector3f nbl = nc - (upVector * Hnear / 2.f) - (rightVector * Wnear / 2.f);
		Vector3f nbr = nc - (upVector * Hnear / 2.f) + (rightVector * Wnear / 2.f);

		float Hfar = 2.f * tan(aFov / 2.f) * myFar;
		float Wfar = Hfar * aAspectRatio;

		Vector3f fc = myPosition + forwardVector * myFar;

		Vector3f ftl = fc + (upVector * Hfar / 2.f) - (rightVector * Wfar / 2.f);
		Vector3f ftr = fc + (upVector * Hfar / 2.f) + (rightVector * Wfar / 2.f);
		Vector3f fbl = fc - (upVector * Hfar / 2.f) - (rightVector * Wfar / 2.f);
		Vector3f fbr = fc - (upVector * Hfar / 2.f) + (rightVector * Wfar / 2.f);

		myPointPositions[0] = ntl;
		myPointPositions[1] = ntr;
		myPointPositions[2] = nbl;
		myPointPositions[3] = nbr;
		myPointPositions[4] = ftl;
		myPointPositions[5] = ftr;
		myPointPositions[6] = fbl;
		myPointPositions[7] = fbr;

		Plane<float> plane;
		plane.InitWith3Points(myPosition, nbr, ntr);
		myPlanes[int(eFRUSTUMSIDES::eRIGHT)] = plane;

		plane.InitWith3Points(myPosition, ntl, nbl);
		myPlanes[int(eFRUSTUMSIDES::eLEFT)] = plane;

		plane.InitWith3Points(myPosition, ntr, ntl);
		myPlanes[int(eFRUSTUMSIDES::eUP)] = plane;

		plane.InitWith3Points(myPosition, nbl, nbr);
		myPlanes[int(eFRUSTUMSIDES::eDOWN)] = plane;

		plane.InitWithPointAndNormal(myPosition + (forwardVector * myFar), forwardVector);
		myPlanes[int(eFRUSTUMSIDES::eFAR)] = plane;

		plane.InitWithPointAndNormal(myPosition + (forwardVector * myNear), (forwardVector * -1.f));
		myPlanes[int(eFRUSTUMSIDES::eNEAR)] = plane;

		myPosition += forwardVector * (myFar / 2.f);

		myLines.RemoveAll();

		//Near Plane

		myLines.Add(CU::RenderCommandLine(ntl, ntr));
		myLines.Add(CU::RenderCommandLine(ntr, nbr));
		myLines.Add(CU::RenderCommandLine(nbr, nbl));
		myLines.Add(CU::RenderCommandLine(nbl, ntl));

		//Far plane

		myLines.Add(CU::RenderCommandLine(ftl, ftr));
		myLines.Add(CU::RenderCommandLine(ftr, fbr));
		myLines.Add(CU::RenderCommandLine(fbr, fbl));
		myLines.Add(CU::RenderCommandLine(fbl, ftl));

		//Sides

		myLines.Add(CU::RenderCommandLine(ntl, ftl));
		myLines.Add(CU::RenderCommandLine(ntr, ftr));
		myLines.Add(CU::RenderCommandLine(nbr, fbr));
		myLines.Add(CU::RenderCommandLine(nbl, fbl));
	}