package rajawali.math; public class Plane { private static Number3D mTmp1; private static Number3D mTmp2; public final Number3D mNormal; public float d = 0; public enum PlaneSide { Back, OnPlane, Front } public Plane() { mTmp1 = new Number3D(); mTmp2 = new Number3D(); mNormal = new Number3D(); } public Plane(Number3D normal, float d) { this(); mNormal.setAllFrom(normal); mNormal.normalize(); this.d = d; } public Plane(Number3D point1, Number3D point2, Number3D point3) { this(); set(point1, point2, point3); } public void set(Number3D point1, Number3D point2, Number3D point3) { mTmp1.setAllFrom(point1); mTmp2.setAllFrom(point2); mTmp1.x -= mTmp2.x; mTmp1.y -= mTmp2.y; mTmp1.z -= mTmp2.z; mTmp2.x -= point3.x; mTmp2.y -= point3.y; mTmp2.z -= point3.z; mNormal.setAll((mTmp1.y * mTmp2.z) - (mTmp1.z * mTmp2.y), (mTmp1.z * mTmp2.x) - (mTmp1.x * mTmp2.z), (mTmp1.x * mTmp2.y) - (mTmp1.y * mTmp2.x)); mNormal.normalize(); d = -Number3D.dot(point1, mNormal); } public void setAll(float nx, float ny, float nz, float d) { mNormal.setAll(nx, ny, nz); this.d = d; } public float distance(Number3D point) { return Number3D.dot(mNormal, point) + d; } public PlaneSide getPointSide(Number3D point) { float dist =Number3D.dot(mNormal, point) + d; if (dist == 0) {return PlaneSide.OnPlane;} else if (dist < 0){ return PlaneSide.Back;} else {return PlaneSide.Front;} } public boolean isFrontFacing(Number3D direction) { float dot = Number3D.dot(mNormal, direction); return dot <= 0; } public Number3D getNormal() { return mNormal; } public float getD() { return d; } public void setAllFrom(Plane plane) { this.mNormal.setAllFrom(plane.mNormal); this.d = plane.d; } }