package rajawali;
import rajawali.bounds.BoundingBox;
import rajawali.math.Number3D;
import rajawali.math.Plane;
import rajawali.math.Plane.PlaneSide;
import rajawali.primitives.Sphere;
public class Frustum {
private Number3D[] mTmp = new Number3D[8];
protected Sphere mVisualSphere;
protected float[] mTmpMatrix = new float[16];
protected static final Number3D[] mClipSpacePlanePoints = {
new Number3D(-1, -1, -1),
new Number3D( 1, -1, -1),
new Number3D( 1, 1, -1),
new Number3D(-1, 1, -1),
new Number3D(-1, -1, 1),
new Number3D( 1, -1, 1),
new Number3D( 1, 1, 1),
new Number3D(-1, 1, 1)};
public final Plane[] planes = new Plane[6];
protected final Number3D[] planePoints = { new Number3D(), new Number3D(), new Number3D(), new Number3D(),
new Number3D(), new Number3D(), new Number3D(), new Number3D()
};
public Frustum() {
for(int i = 0; i < 6; i++) {
planes[i] = new Plane(new Number3D(), 0);
}
for(int i=0;i<8;i++){
mTmp[i]=new Number3D();
}
}
public void update(float[] m) {
planes[0].setAll(m[12] - m[0], m[13] - m[1], m[14] - m[2], m[15] - m[3]);
planes[1].setAll(m[12] + m[0], m[13] + m[1], m[14] + m[2], m[15] + m[3]);
planes[2].setAll(m[12] + m[4], m[13] + m[5], m[14] + m[6], m[15] + m[7]);
planes[3].setAll(m[12] - m[4], m[13] - m[5], m[14] - m[6], m[15] - m[7]);
planes[4].setAll(m[12] - m[8], m[13] - m[9], m[14] - m[10], m[15] - m[11]);
planes[5].setAll(m[12] + m[8], m[13] + m[9], m[14] + m[10], m[15] + m[11]);
// planes[0].normalize();
// planes[1].normalize();
// planes[2].normalize();
// planes[3].normalize();
// planes[4].normalize();
// planes[5].normalize();
}
public boolean sphereInFrustum (Number3D center, float radius) {
for (int i = 0; i < planes.length; i++)
if (planes[i].distance(center) < -radius) return false;
return true;
}
Number3D mPoint1 = new Number3D(), mPoint2 = new Number3D();
public boolean boundsInFrustum (BoundingBox bounds) {
for(int i=0; i<6; i++) {
Plane p = planes[i];
mPoint1.x = p.getNormal().x > 0 ? bounds.getMin().x : bounds.getMax().x;
mPoint2.x = p.getNormal().x > 0 ? bounds.getMax().x : bounds.getMin().x;
mPoint1.y = p.getNormal().y > 0 ? bounds.getMin().y : bounds.getMax().y;
mPoint2.y = p.getNormal().y > 0 ? bounds.getMax().y : bounds.getMin().y;
mPoint1.z = p.getNormal().z > 0 ? bounds.getMin().z : bounds.getMax().z;
mPoint2.z = p.getNormal().z > 0 ? bounds.getMax().z : bounds.getMin().z;
double distance1 = p.distance(mPoint1);
double distance2 = p.distance(mPoint2);
if ( distance1 < 0 && distance2 < 0 )
return false;
}
return true;
}
public boolean pointInFrustum (Number3D point) {
for (int i = 0; i < planes.length; i++) {
PlaneSide result = planes[i].getPointSide(point);
if (result == PlaneSide.Back) {return false;}
}
return true;
}
}