|
|
|
@ -392,30 +392,36 @@ public class Camera implements Savable, Cloneable { |
|
|
|
|
if (clipPlane.whichSide(location) == side) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
Matrix4f p = projectionMatrix.clone(); |
|
|
|
|
|
|
|
|
|
Matrix4f ivm = viewMatrix.clone(); |
|
|
|
|
|
|
|
|
|
Vector3f point = clipPlane.getNormal().mult(clipPlane.getConstant()); |
|
|
|
|
Vector3f pp = ivm.mult(point); |
|
|
|
|
Vector3f pn = ivm.multNormal(clipPlane.getNormal(), null); |
|
|
|
|
Vector4f clipPlaneV = new Vector4f(pn.x * sideFactor, pn.y * sideFactor, pn.z * sideFactor, -(pp.dot(pn)) * sideFactor); |
|
|
|
|
|
|
|
|
|
Vector4f v = new Vector4f(0, 0, 0, 0); |
|
|
|
|
|
|
|
|
|
v.x = (Math.signum(clipPlaneV.x) + p.m02) / p.m00; |
|
|
|
|
v.y = (Math.signum(clipPlaneV.y) + p.m12) / p.m11; |
|
|
|
|
v.z = -1.0f; |
|
|
|
|
v.w = (1.0f + p.m22) / p.m23; |
|
|
|
|
|
|
|
|
|
TempVars vars = TempVars.get(); |
|
|
|
|
try { |
|
|
|
|
Matrix4f p = projectionMatrix.clone(); |
|
|
|
|
|
|
|
|
|
float dot = clipPlaneV.dot(v);//clipPlaneV.x * v.x + clipPlaneV.y * v.y + clipPlaneV.z * v.z + clipPlaneV.w * v.w;
|
|
|
|
|
Vector4f c = clipPlaneV.mult(2.0f / dot); |
|
|
|
|
Matrix4f ivm = viewMatrix; |
|
|
|
|
|
|
|
|
|
p.m20 = c.x - p.m30; |
|
|
|
|
p.m21 = c.y - p.m31; |
|
|
|
|
p.m22 = c.z - p.m32; |
|
|
|
|
p.m23 = c.w - p.m33; |
|
|
|
|
setProjectionMatrix(p); |
|
|
|
|
Vector3f point = clipPlane.getNormal().mult(clipPlane.getConstant(), vars.vect1); |
|
|
|
|
Vector3f pp = ivm.mult(point, vars.vect2); |
|
|
|
|
Vector3f pn = ivm.multNormal(clipPlane.getNormal(), vars.vect3); |
|
|
|
|
Vector4f clipPlaneV = vars.vect4f1.set(pn.x * sideFactor, pn.y * sideFactor, pn.z * sideFactor, -(pp.dot(pn)) * sideFactor); |
|
|
|
|
|
|
|
|
|
Vector4f v = vars.vect4f2.set(0, 0, 0, 0); |
|
|
|
|
|
|
|
|
|
v.x = (Math.signum(clipPlaneV.x) + p.m02) / p.m00; |
|
|
|
|
v.y = (Math.signum(clipPlaneV.y) + p.m12) / p.m11; |
|
|
|
|
v.z = -1.0f; |
|
|
|
|
v.w = (1.0f + p.m22) / p.m23; |
|
|
|
|
|
|
|
|
|
float dot = clipPlaneV.dot(v);//clipPlaneV.x * v.x + clipPlaneV.y * v.y + clipPlaneV.z * v.z + clipPlaneV.w * v.w;
|
|
|
|
|
Vector4f c = clipPlaneV.multLocal(2.0f / dot); |
|
|
|
|
|
|
|
|
|
p.m20 = c.x - p.m30; |
|
|
|
|
p.m21 = c.y - p.m31; |
|
|
|
|
p.m22 = c.z - p.m32; |
|
|
|
|
p.m23 = c.w - p.m33; |
|
|
|
|
setProjectionMatrix(p); |
|
|
|
|
} finally { |
|
|
|
|
vars.release(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|