From 7f49272e5e30d8519e2706c57433d3acdd8d4285 Mon Sep 17 00:00:00 2001 From: timoore Date: Thu, 31 Jul 2008 09:20:35 +0000 Subject: [PATCH] Explicitly set traversal mask for near camera. Don't depend on camera inheritance; set the mask in the traverse() method. --- src/Main/ViewPartitionNode.cxx | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/src/Main/ViewPartitionNode.cxx b/src/Main/ViewPartitionNode.cxx index 920230a6e..f3f6f48e9 100644 --- a/src/Main/ViewPartitionNode.cxx +++ b/src/Main/ViewPartitionNode.cxx @@ -41,8 +41,7 @@ ViewPartitionNode::ViewPartitionNode(): const GLbitfield inheritanceMask = (CullSettings::ALL_VARIABLES & ~CullSettings::COMPUTE_NEAR_FAR_MODE & ~CullSettings::NEAR_FAR_RATIO - & ~CullSettings::CULLING_MODE - & ~CullSettings::CULL_MASK); + & ~CullSettings::CULLING_MODE); int i = 1; for (CameraList::iterator iter = cameras.begin(); iter != cameras.end(); @@ -53,21 +52,17 @@ ViewPartitionNode::ViewPartitionNode(): camera->setComputeNearFarMode(CullSettings::DO_NOT_COMPUTE_NEAR_FAR); camera->setCullingMode(CullSettings::VIEW_FRUSTUM_CULLING); camera->setRenderOrder(Camera::POST_RENDER, i); + // Slave camera "above" us clears the viewport. Perhaps the + // far camera doesn't need to clear the depth buffer; it + // probably doesn't make much difference. + camera->setClearMask(GL_DEPTH_BUFFER_BIT); *iter = camera; } - - 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(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(2), visibility(rhs.visibility) + const CopyOp& copyop) : + cameras(2), visibility(rhs.visibility) { for (int i = 0; i < 2; i++) cameras[i] = static_cast(copyop(rhs.cameras[i].get())); @@ -92,14 +87,23 @@ void ViewPartitionNode::traverse(NodeVisitor& nv) farPlanes[0] = parentFar; nearPlanes[1] = parentNear; farPlanes[1] = nearCameraFar; - for (int i = 0; i < 2; ++i) { if (farPlanes[i] >0.0) { ref_ptr newProj = new RefMatrix(); makeNewProjMat(projection, nearPlanes[i], farPlanes[i], *newProj.get()); cv->pushProjectionMatrix(newProj.get()); - cameras[i]->accept(nv); + if (i == NEAR_CAMERA) { + // The near camera shouldn't draw the background, + // which is hard to cull out. + unsigned int savedTraversalMask = cv->getTraversalMask(); + cv->setTraversalMask(savedTraversalMask + & ~simgear::BACKGROUND_BIT); + cameras[i]->accept(nv); + cv->setTraversalMask(savedTraversalMask); + } else { + cameras[i]->accept(nv); + } cv->popProjectionMatrix(); } } @@ -187,7 +191,6 @@ void ViewPartitionNode::makeNewProjMat(Matrixd& oldProj, double znear, 0.0, 0.0, ratio, 0.0, 0.0, 0.0, center*ratio, 1.0)); } - } namespace