void CompositeViewer::generatePointerData(osgGA::GUIEventAdapter& event) { osgViewer::GraphicsWindow* gw = dynamic_cast<osgViewer::GraphicsWindow*>(event.getGraphicsContext()); if (!gw) return; float x = event.getX(); float y = event.getY(); bool invert_y = event.getMouseYOrientation()==osgGA::GUIEventAdapter::Y_INCREASING_DOWNWARDS; if (invert_y && gw->getTraits()) y = gw->getTraits()->height - y; event.addPointerData(new osgGA::PointerData(gw, x, 0, gw->getTraits()->width, y, 0, gw->getTraits()->height)); event.setMouseYOrientationAndUpdateCoords(osgGA::GUIEventAdapter::Y_INCREASING_UPWARDS); 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(); ++citr) { osg::Camera* camera = *citr; if (camera->getAllowEventFocus() && camera->getRenderTargetImplementation()==osg::Camera::FRAME_BUFFER) { osg::Viewport* viewport = camera ? camera->getViewport() : 0; if (viewport && x >= viewport->x() && y >= viewport->y() && x <= (viewport->x()+viewport->width()) && y <= (viewport->y()+viewport->height()) ) { 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); } } }