mainCamera.setUp(tmp);
getWorldTransform().applyInverseVector(mainCamera.getDirection(), tmp);
mainCamera.setDirection(tmp);
}
final ReadOnlyVector3 mainCameraLocation = mainCamera.getLocation();
if (mainCameraLocation.getY() > 0.0 && mainCameraLocation.getY() < upperBound + mainCamera.getFrustumNear()) {
mainCamera.setLocation(mainCameraLocation.getX(), upperBound + mainCamera.getFrustumNear(),
mainCameraLocation.getZ());
} else if (mainCameraLocation.getY() < 0.0
&& mainCameraLocation.getY() > -upperBound - mainCamera.getFrustumNear()) {
mainCamera.setLocation(mainCameraLocation.getX(), -upperBound - mainCamera.getFrustumNear(),
mainCameraLocation.getZ());
}
mainCamera.calculateFrustum();
final Vector3[] corners = mainCamera.getCorners();
int nrPoints = 0;
// check intersections of frustum connections with upper and lower bound
final Vector3 tmpStorage = Vector3.fetchTempInstance();
for (int i = 0; i < 8; i++) {
final int source = connections[i * 2];
final int destination = connections[i * 2 + 1];
if (corners[source].getY() > upperBound && corners[destination].getY() < upperBound
|| corners[source].getY() < upperBound && corners[destination].getY() > upperBound) {
getWorldIntersection(upperBound, corners[source], corners[destination], intersections[nrPoints++],
tmpStorage);
}
if (corners[source].getY() > -upperBound && corners[destination].getY() < -upperBound
|| corners[source].getY() < -upperBound && corners[destination].getY() > -upperBound) {
getWorldIntersection(-upperBound, corners[source], corners[destination], intersections[nrPoints++],
tmpStorage);
}
}
// check if any of the frustums corner vertices lie between the upper and lower bound planes
for (int i = 0; i < 8; i++) {
if (corners[i].getY() < upperBound && corners[i].getY() > -upperBound) {
intersections[nrPoints++].set(corners[i]);
}
}
if (nrPoints == 0) {
// No intersection, grid not visible
return false;
}
// set projector
projectorCamera.set(mainCamera);
// force the projector to point at the plane
if (projectorCamera.getLocation().getY() > 0.0 && projectorCamera.getDirection().getY() > 0.0
|| projectorCamera.getLocation().getY() < 0.0 && projectorCamera.getDirection().getY() < 0.0) {
projectorCamera.setDirection(new Vector3(projectorCamera.getDirection().getX(), -projectorCamera
.getDirection().getY(), projectorCamera.getDirection().getZ()));
projectorCamera.setUp(projectorCamera.getDirection().cross(projectorCamera.getLeft(), null)
.normalizeLocal());
}
// find the plane intersection point
source.set(0.5, 0.5);
getWorldIntersection(0.0, source, projectorCamera.getModelViewProjectionInverseMatrix(), planeIntersection);
// force the projector to be a certain distance above the plane
final ReadOnlyVector3 cameraLocation = projectorCamera.getLocation();
if (cameraLocation.getY() > 0.0 && cameraLocation.getY() < projectorMinHeight * 2) {
final double delta = (projectorMinHeight * 2 - cameraLocation.getY()) / (projectorMinHeight * 2);
projectorCamera.setLocation(cameraLocation.getX(), projectorMinHeight * 2 - projectorMinHeight * delta,
cameraLocation.getZ());
} else if (cameraLocation.getY() < 0.0 && cameraLocation.getY() > -projectorMinHeight * 2) {
final double delta = (-projectorMinHeight * 2 - cameraLocation.getY()) / (-projectorMinHeight * 2);
projectorCamera.setLocation(cameraLocation.getX(), -projectorMinHeight * 2 + projectorMinHeight * delta,
cameraLocation.getZ());
}
// restrict the intersection point to be a certain distance from the camera in plane coords
planeIntersection.subtractLocal(projectorCamera.getLocation());
planeIntersection.setY(0.0);