CSC8502_Advanced_Graphics_For_Games / nclgl / Frustum.cpp
Frustum.cpp
Raw
#include "Frustum.h"
#include "SceneNode.h"
#include "Matrix4.h"

void Frustum::FromMatrix(const Matrix4& mat)
{
	Vector3 xaxis = Vector3(mat.values[0], mat.values[4], mat.values[8]);
	Vector3 yaxis = Vector3(mat.values[1], mat.values[5], mat.values[9]);
	Vector3 zaxis = Vector3(mat.values[2], mat.values[6], mat.values[10]);
	Vector3 waxis = Vector3(mat.values[3], mat.values[7], mat.values[11]);

	//RIGHT
	planes[0] = Plane(waxis - xaxis,
		(mat.values[15] - mat.values[12]), true);

	//LEFT
	planes[1] = Plane(waxis + xaxis,
		(mat.values[15] + mat.values[12]), true);

	//BOTTOM
	planes[2] = Plane(waxis + yaxis,
		(mat.values[15] + mat.values[13]), true);

	//TOP
	planes[3] = Plane(waxis - yaxis,
		(mat.values[15] - mat.values[13]), true);

	//NEAR
	planes[4] = Plane(waxis + zaxis,
		(mat.values[15] + mat.values[14]), true);

	//FAR
	planes[5] = Plane(waxis - zaxis,
		(mat.values[15] - mat.values[14]), true);
}

bool Frustum::InsideFrustum(SceneNode& n)
{
	for (int p = 0; p < 6; ++p) {
		if (!planes[p].SphereInPlane(n.GetWorldTransform().
			GetPositionVector(), n.GetBounudingRadius())) {
			return false;
		}
	}
	return true;
}