1
0
Fork 0

Changed ViewPartition to use two cameras instead of three.

I thought that this would fix the "black hole in the sky" problem,
which turned out to be caused by an OpenSceneGraph bug. Nevertheless
it is a simplification.
This commit is contained in:
timoore 2008-07-29 11:18:21 +00:00
parent 429f2530de
commit f08e16cd55
2 changed files with 22 additions and 34 deletions

View file

@ -36,12 +36,13 @@ using namespace osg;
const double ViewPartitionNode::nearCameraFar = 100.0;
ViewPartitionNode::ViewPartitionNode():
cameras(3), visibility(40000.0)
cameras(2), visibility(40000.0)
{
const GLbitfield inheritanceMask = (CullSettings::ALL_VARIABLES
& ~CullSettings::COMPUTE_NEAR_FAR_MODE
& ~CullSettings::NEAR_FAR_RATIO
& ~CullSettings::CULLING_MODE);
& ~CullSettings::CULLING_MODE
& ~CullSettings::CULL_MASK);
int i = 1;
for (CameraList::iterator iter = cameras.begin();
iter != cameras.end();
@ -54,28 +55,21 @@ ViewPartitionNode::ViewPartitionNode():
camera->setRenderOrder(Camera::POST_RENDER, i);
*iter = camera;
}
Camera* backgroundCamera = cameras[BACKGROUND_CAMERA].get();
backgroundCamera->setClearMask(GL_DEPTH_BUFFER_BIT);
// Turn off depth test for the background
Depth* depth = new Depth(Depth::LESS, 0.0, 1.0, false);
StateSet* backgroundSS = new StateSet;
backgroundSS->setAttribute(depth);
backgroundSS->setMode(GL_DEPTH_TEST, StateAttribute::OFF);
backgroundCamera->setStateSet(backgroundSS);
backgroundCamera->setInheritanceMask(backgroundCamera->getInheritanceMask()
& ~CullSettings::CULL_MASK);
backgroundCamera->setCullMask(simgear::BACKGROUND_BIT);
cameras[NEAR_CAMERA]->setClearMask(GL_DEPTH_BUFFER_BIT);
// Background camera will have cleared the buffers and doesn't
// touch the depth buffer
cameras[FAR_CAMERA]->setClearMask(0);
cameras[FAR_CAMERA]->setClearMask(GL_DEPTH_BUFFER_BIT);
// near camera shouldn't render the background.
cameras[NEAR_CAMERA]->setCullMask(cameras[NEAR_CAMERA]->getCullMask()
& ~simgear::BACKGROUND_BIT);
}
ViewPartitionNode::ViewPartitionNode(const ViewPartitionNode& rhs,
const CopyOp& copyop):
cameras(3), visibility(rhs.visibility)
cameras(2), visibility(rhs.visibility)
{
for (int i = 0; i < 3; i++)
for (int i = 0; i < 2; i++)
cameras[i] = static_cast<Camera*>(copyop(rhs.cameras[i].get()));
}
@ -88,23 +82,18 @@ void ViewPartitionNode::traverse(NodeVisitor& nv)
}
RefMatrix& modelview = *(cv->getModelViewMatrix());
RefMatrix& projection = *(cv->getProjectionMatrix());
// Get the frustum of the enclosing camera. The ViewPartitionNode
// will divide up the frustum between that camera's near and far
// planes i.e., parentNear and ParentFar.
double left, right, bottom, top, parentNear, parentFar;
projection.getFrustum(left, right, bottom, top, parentNear, parentFar);
double farCameraFar = visibility + 1000.0;
double nearPlanes[3], farPlanes[3];
nearPlanes[0] = farCameraFar; farPlanes[0] = parentFar;
nearPlanes[2] = parentNear;
// If visibility is low, only use two cameras
if (farCameraFar < nearCameraFar) {
nearPlanes[1] = farPlanes[1] = 0.0;
farPlanes[2] = farCameraFar;
} else {
nearPlanes[1] = farPlanes[2] = nearCameraFar;
farPlanes[1] = farCameraFar;
farPlanes[2] = nearCameraFar;
}
for (int i = 0; i < 3; ++i) {
double nearPlanes[2], farPlanes[2];
nearPlanes[0] = nearCameraFar;
farPlanes[0] = parentFar;
nearPlanes[1] = parentNear;
farPlanes[1] = nearCameraFar;
for (int i = 0; i < 2; ++i) {
if (farPlanes[i] >0.0) {
ref_ptr<RefMatrix> newProj = new RefMatrix();
makeNewProjMat(projection, nearPlanes[i], farPlanes[i],

View file

@ -51,9 +51,8 @@ protected:
typedef std::vector< osg::ref_ptr<osg::Camera> > CameraList;
CameraList cameras;
enum CameraNum {
BACKGROUND_CAMERA = 0,
FAR_CAMERA = 1,
NEAR_CAMERA = 2
FAR_CAMERA = 0,
NEAR_CAMERA = 1
};
double visibility;
static const double nearCameraFar;