Added a render order sort to the list of Cameras being tested by the *Viewer::generatePointerData(..) method to ensure that the highest Camera gets focus.
git-svn-id: http://svn.openscenegraph.org/osg/OpenSceneGraph/trunk@14309 16af8721-9629-0410-8352-f15c8da7e697
This commit is contained in:
parent
d994e84288
commit
8d6bee6da9
@ -680,6 +680,19 @@ class OSG_EXPORT Camera : public Transform, public CullSettings
|
||||
ref_ptr<DrawCallback> _finalDrawCallback;
|
||||
};
|
||||
|
||||
|
||||
/** Functor to assist with ordering camers in the order they should be rendered in.*/
|
||||
struct CameraRenderOrderSortOp
|
||||
{
|
||||
inline bool operator() (const Camera* lhs,const Camera* rhs) const
|
||||
{
|
||||
if (lhs->getRenderOrder()<rhs->getRenderOrder()) return true;
|
||||
if (rhs->getRenderOrder()<lhs->getRenderOrder()) return false;
|
||||
return lhs->getRenderOrderNum()<rhs->getRenderOrderNum();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -754,18 +754,6 @@ void GraphicsContext::removeAllOperations()
|
||||
_operationsBlock->set(false);
|
||||
}
|
||||
|
||||
|
||||
struct CameraRenderOrderSortOp
|
||||
{
|
||||
inline bool operator() (const Camera* lhs,const Camera* rhs) const
|
||||
{
|
||||
if (lhs->getRenderOrder()<rhs->getRenderOrder()) return true;
|
||||
if (rhs->getRenderOrder()<lhs->getRenderOrder()) return false;
|
||||
return lhs->getRenderOrderNum()<rhs->getRenderOrderNum();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
void GraphicsContext::runOperations()
|
||||
{
|
||||
// sort the cameras into order
|
||||
|
@ -837,7 +837,6 @@ void CompositeViewer::generateSlavePointerData(osg::Camera* camera, osgGA::GUIEv
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void CompositeViewer::generatePointerData(osgGA::GUIEventAdapter& event)
|
||||
{
|
||||
osgViewer::GraphicsWindow* gw = dynamic_cast<osgViewer::GraphicsWindow*>(event.getGraphicsContext());
|
||||
@ -852,6 +851,9 @@ void CompositeViewer::generatePointerData(osgGA::GUIEventAdapter& event)
|
||||
event.addPointerData(new osgGA::PointerData(gw, x, 0, gw->getTraits()->width,
|
||||
y, 0, gw->getTraits()->height));
|
||||
|
||||
typedef std::vector<osg::Camera*> CameraVector;
|
||||
CameraVector activeCameras;
|
||||
|
||||
osg::GraphicsContext::Cameras& cameras = gw->getCameras();
|
||||
for(osg::GraphicsContext::Cameras::iterator citr = cameras.begin();
|
||||
citr != cameras.end();
|
||||
@ -866,20 +868,31 @@ void CompositeViewer::generatePointerData(osgGA::GUIEventAdapter& event)
|
||||
x >= viewport->x() && y >= viewport->y() &&
|
||||
x <= (viewport->x()+viewport->width()) && y <= (viewport->y()+viewport->height()) )
|
||||
{
|
||||
event.addPointerData(new osgGA::PointerData(camera, (x-viewport->x())/viewport->width()*2.0f-1.0f, -1.0, 1.0,
|
||||
(y-viewport->y())/viewport->height()*2.0f-1.0f, -1.0, 1.0));
|
||||
|
||||
osgViewer::View* view = dynamic_cast<osgViewer::View*>(camera->getView());
|
||||
osg::Camera* view_masterCamera = view ? view->getCamera() : 0;
|
||||
|
||||
// if camera isn't the master it must be a slave and could need reprojecting.
|
||||
if (view && camera!=view_masterCamera)
|
||||
{
|
||||
generateSlavePointerData(camera, event);
|
||||
}
|
||||
activeCameras.push_back(camera);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
std::sort(activeCameras.begin(), activeCameras.end(), osg::CameraRenderOrderSortOp());
|
||||
|
||||
osg::Camera* camera = activeCameras.empty() ? 0 : activeCameras.back();
|
||||
|
||||
if (camera)
|
||||
{
|
||||
osg::Viewport* viewport = camera ? camera->getViewport() : 0;
|
||||
|
||||
event.addPointerData(new osgGA::PointerData(camera, (x-viewport->x())/viewport->width()*2.0f-1.0f, -1.0, 1.0,
|
||||
(y-viewport->y())/viewport->height()*2.0f-1.0f, -1.0, 1.0));
|
||||
|
||||
osgViewer::View* view = dynamic_cast<osgViewer::View*>(camera->getView());
|
||||
osg::Camera* view_masterCamera = view ? view->getCamera() : 0;
|
||||
|
||||
// if camera isn't the master it must be a slave and could need reprojecting.
|
||||
if (view && camera!=view_masterCamera)
|
||||
{
|
||||
generateSlavePointerData(camera, event);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CompositeViewer::reprojectPointerData(osgGA::GUIEventAdapter& source_event, osgGA::GUIEventAdapter& dest_event)
|
||||
|
@ -784,7 +784,9 @@ void Viewer::generatePointerData(osgGA::GUIEventAdapter& event)
|
||||
event.addPointerData(new osgGA::PointerData(gw, x, 0, gw->getTraits()->width,
|
||||
y, 0, gw->getTraits()->height));
|
||||
|
||||
// new code for populating the PointerData
|
||||
typedef std::vector<osg::Camera*> CameraVector;
|
||||
CameraVector activeCameras;
|
||||
|
||||
osgViewer::View* this_view = dynamic_cast<osgViewer::View*>(this);
|
||||
osg::GraphicsContext::Cameras& cameras = gw->getCameras();
|
||||
for(osg::GraphicsContext::Cameras::iterator citr = cameras.begin();
|
||||
@ -801,17 +803,28 @@ void Viewer::generatePointerData(osgGA::GUIEventAdapter& event)
|
||||
x >= viewport->x() && y >= viewport->y() &&
|
||||
x <= (viewport->x()+viewport->width()) && y <= (viewport->y()+viewport->height()) )
|
||||
{
|
||||
event.addPointerData(new osgGA::PointerData(camera, (x-viewport->x())/viewport->width()*2.0f-1.0f, -1.0, 1.0,
|
||||
(y-viewport->y())/viewport->height()*2.0f-1.0f, -1.0, 1.0));
|
||||
|
||||
// if camera isn't the master it must be a slave and could need reprojecting.
|
||||
if (camera!=getCamera())
|
||||
{
|
||||
generateSlavePointerData(camera, event);
|
||||
}
|
||||
activeCameras.push_back(camera);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
std::sort(activeCameras.begin(), activeCameras.end(), osg::CameraRenderOrderSortOp());
|
||||
|
||||
osg::Camera* camera = activeCameras.empty() ? 0 : activeCameras.back();
|
||||
|
||||
if (camera)
|
||||
{
|
||||
osg::Viewport* viewport = camera ? camera->getViewport() : 0;
|
||||
|
||||
event.addPointerData(new osgGA::PointerData(camera, (x-viewport->x())/viewport->width()*2.0f-1.0f, -1.0, 1.0,
|
||||
(y-viewport->y())/viewport->height()*2.0f-1.0f, -1.0, 1.0));
|
||||
|
||||
// if camera isn't the master it must be a slave and could need reprojecting.
|
||||
if (camera!=getCamera())
|
||||
{
|
||||
generateSlavePointerData(camera, event);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Viewer::reprojectPointerData(osgGA::GUIEventAdapter& source_event, osgGA::GUIEventAdapter& dest_event)
|
||||
|
Loading…
Reference in New Issue
Block a user