diff --git a/include/osg/CameraNode b/include/osg/CameraNode index 63a4566f6..c6ea1104c 100644 --- a/include/osg/CameraNode +++ b/include/osg/CameraNode @@ -92,7 +92,6 @@ class OSG_EXPORT CameraNode : public Transform, public CullSettings void setTransformOrder(TransformOrder order) { _transformOrder = order; } TransformOrder getTransformOrder() const { return _transformOrder; } - /** Set the projection matrix. Can be thought of as setting the lens of a camera. */ inline void setProjectionMatrix(const osg::Matrixf& matrix) { _projectionMatrix.set(matrix); } @@ -184,6 +183,9 @@ class OSG_EXPORT CameraNode : public Transform, public CullSettings /** Get the rendering order of this camera's subgraph relative to any camera that this subgraph is nested within.*/ RenderOrder getRenderOrder() const { return _renderOrder; } + /** Return true if this Camera is set up as a render to texture camera, i.e. it has textures assigned to it.*/ + bool isRenderToTextureCamera() const; + enum RenderTargetImplementation { FRAME_BUFFER_OBJECT, diff --git a/src/osg/CameraNode.cpp b/src/osg/CameraNode.cpp index 99f9f733f..77872fa24 100644 --- a/src/osg/CameraNode.cpp +++ b/src/osg/CameraNode.cpp @@ -53,6 +53,11 @@ CameraNode::~CameraNode() { } +bool CameraNode::isRenderToTextureCamera() const +{ + return (!_bufferAttachmentMap.empty()); +} + void CameraNode::setRenderTargetImplementation(RenderTargetImplementation impl) { _renderTargetImplementation = impl; diff --git a/src/osgProducer/Viewer.cpp b/src/osgProducer/Viewer.cpp index b35ec4fa3..37557cc02 100644 --- a/src/osgProducer/Viewer.cpp +++ b/src/osgProducer/Viewer.cpp @@ -764,13 +764,10 @@ bool Viewer::computeIntersections(float x,float y,unsigned int cameraNum,osg::No view = osg::Matrixd(camera->getViewMatrix()); } - node = node->getParent(0); - osgUtil::PickVisitor pick(viewport, proj, view, pixel_x, pixel_y); pick.setTraversalMask(traversalMask); node->accept(pick); - // copy all the hits across to the external hits list for(osgUtil::PickVisitor::LineSegmentHitListMap::iterator itr = pick.getSegHitList().begin(); itr != pick.getSegHitList().end(); diff --git a/src/osgUtil/IntersectVisitor.cpp b/src/osgUtil/IntersectVisitor.cpp index e6d8f665e..c7129489b 100644 --- a/src/osgUtil/IntersectVisitor.cpp +++ b/src/osgUtil/IntersectVisitor.cpp @@ -113,20 +113,17 @@ bool IntersectVisitor::IntersectState::isCulled(const BoundingSphere& bs,LineSeg LineSegmentMask mask = 0x00000001; segMaskOut = 0x00000000; LineSegmentMask segMaskIn = _segmentMaskStack.back(); - // notify(INFO) << << "IntersectState::isCulled() mask in "<second)->intersect(bs)) { - // notify(INFO) << << "Hit "; segMaskOut = segMaskOut| mask; hit = true; } mask = mask << 1; } - // notify(INFO) << << "mask = "<_segmentMaskStack.empty()) + cis->_segmentMaskStack.push_back(cis->_segmentMaskStack.back()); + else + cis->_segmentMaskStack.push_back(0xffffffff); + + return true; } } @@ -721,9 +724,12 @@ void PickVisitor::apply(osg::Projection& projection) void PickVisitor::apply(osg::CameraNode& camera) { - runNestedPickVisitor( camera, - camera.getViewport() ? camera.getViewport() : _lastViewport.get(), - camera.getProjectionMatrix(), - camera.getViewMatrix(), - _mx, _my ); + if (!camera.isRenderToTextureCamera()) + { + runNestedPickVisitor( camera, + camera.getViewport() ? camera.getViewport() : _lastViewport.get(), + camera.getProjectionMatrix(), + camera.getViewMatrix(), + _mx, _my ); + } } diff --git a/src/osgWrappers/osg/CameraNode.cpp b/src/osgWrappers/osg/CameraNode.cpp index 4cb330ade..b9fd38532 100644 --- a/src/osgWrappers/osg/CameraNode.cpp +++ b/src/osgWrappers/osg/CameraNode.cpp @@ -112,6 +112,7 @@ BEGIN_OBJECT_REFLECTOR(osg::CameraNode) I_Method0(osg::Matrixd, getInverseViewMatrix); I_Method1(void, setRenderOrder, IN, osg::CameraNode::RenderOrder, order); I_Method0(osg::CameraNode::RenderOrder, getRenderOrder); + I_Method0(bool, isRenderToTextureCamera); I_Method1(void, setRenderTargetImplementation, IN, osg::CameraNode::RenderTargetImplementation, impl); I_Method2(void, setRenderTargetImplementation, IN, osg::CameraNode::RenderTargetImplementation, impl, IN, osg::CameraNode::RenderTargetImplementation, fallback); I_Method0(osg::CameraNode::RenderTargetImplementation, getRenderTargetImplementation);