bool MouseHandler::handle( const osgGA::GUIEventAdapter &gea, osgGA::GUIActionAdapter& /*gaa*/, osg::Object* /*obj*/, osg::NodeVisitor* /*nv*/ ) { osgGA::GUIEventAdapter::EventType ev = gea.getEventType(); MouseAction ma = _isMouseEvent(ev); if (ma) { // If we're scrolling, we need to inform the WindowManager of that. _wm->setScrollingMotion(gea.getScrollingMotion()); // osgWidget assumes origin is bottom left of window so make sure mouse coordinate are increaseing y upwards and are scaled to window size. float x = (gea.getX() - gea.getXmin()) / (gea.getXmax() - gea.getXmin()) * static_cast<float>(gea.getWindowWidth()); float y = (gea.getY() - gea.getYmin()) / (gea.getYmax() - gea.getYmin()) * static_cast<float>(gea.getWindowHeight()); if (gea.getMouseYOrientation() == osgGA::GUIEventAdapter::Y_INCREASING_DOWNWARDS) y = static_cast<float>(gea.getWindowHeight()) - y; // OSG_NOTICE<<"MouseHandler(x="<<x<<", y="<<y<<")"<<std::endl; return (this->*ma)(x, y, gea.getButton()); } return false; }
void CompositeViewer::reprojectPointerData(osgGA::GUIEventAdapter& source_event, osgGA::GUIEventAdapter& dest_event) { osgViewer::GraphicsWindow* gw = dynamic_cast<osgViewer::GraphicsWindow*>(dest_event.getGraphicsContext()); if (!gw) return; float x = dest_event.getX(); float y = dest_event.getY(); bool invert_y = dest_event.getMouseYOrientation()==osgGA::GUIEventAdapter::Y_INCREASING_DOWNWARDS; if (invert_y && gw->getTraits()) y = gw->getTraits()->height - y; dest_event.addPointerData(new osgGA::PointerData(gw, x, 0, gw->getTraits()->width, y, 0, gw->getTraits()->height)); osg::Camera* camera = (source_event.getNumPointerData()>=2) ? dynamic_cast<osg::Camera*>(source_event.getPointerData(1)->object.get()) : 0; osg::Viewport* viewport = camera ? camera->getViewport() : 0; if (!viewport) return; dest_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, dest_event); } }
virtual bool handle( const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa ) { int x = ea.getX(), y = ea.getY(), width = ea.getWindowWidth(), height = ea.getWindowHeight(); if ( ea.getMouseYOrientation()==osgGA::GUIEventAdapter::Y_INCREASING_UPWARDS ) y = ea.getWindowHeight() - y; if ( !CEGUI::System::getSingletonPtr() ) return false; CEGUI::GUIContext& context = CEGUI::System::getSingleton().getDefaultGUIContext(); switch ( ea.getEventType() ) { case osgGA::GUIEventAdapter::KEYDOWN: context.injectKeyDown(key_conv(ea.getKey())); context.injectChar(char_conv(ea.getKey())); // return key_conv(ea.getKey()) != CEGUI::Key::Unknown; break; case osgGA::GUIEventAdapter::KEYUP: context.injectKeyUp(key_conv(ea.getKey())); // return key_conv(ea.getKey()) != CEGUI::Key::Unknown; break; case osgGA::GUIEventAdapter::PUSH: context.injectMousePosition( x, y ); context.injectMouseButtonDown(convertMouseButton(ea.getButton())); break; case osgGA::GUIEventAdapter::RELEASE: context.injectMousePosition(x, y); context.injectMouseButtonUp(convertMouseButton(ea.getButton())); break; case osgGA::GUIEventAdapter::SCROLL: if ( ea.getScrollingMotion()==osgGA::GUIEventAdapter::SCROLL_DOWN ) context.injectMouseWheelChange(-1); else if ( ea.getScrollingMotion()==osgGA::GUIEventAdapter::SCROLL_UP ) context.injectMouseWheelChange(+1); break; case osgGA::GUIEventAdapter::DRAG: case osgGA::GUIEventAdapter::MOVE: context.injectMousePosition(x, y); break; case osgGA::GUIEventAdapter::RESIZE: if ( _camera.valid() ) { _camera->setProjectionMatrix( osg::Matrixd::ortho2D(0.0, width, 0.0, height) ); _camera->setViewport( 0.0, 0.0, width, height ); } break; default: return false; } CEGUI::Window* rootWindow = context.getRootWindow(); if ( rootWindow ) { CEGUI::Window* anyWindow = rootWindow->getChildAtPosition( CEGUI::Vector2f(x, y) ); if ( anyWindow ) return true; } return false; }
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); } } }
bool MYGUIManager::handleEvent(const osgGA::GUIEventAdapter& ea, bool async) const { if (async || !_platform || !_initialized) { const_cast<MYGUIManager*>(this)->pushEvent(&ea); return false; } int x = ea.getX(), y = ea.getY(), key = ea.getKey(); static int z = 0; if (ea.getMouseYOrientation() == osgGA::GUIEventAdapter::Y_INCREASING_UPWARDS) y = ea.getWindowHeight() - y; x = int(floor(float(x) / _uiScale + 0.5f)); y = int(floor(float(y) / _uiScale + 0.5f)); switch (ea.getEventType()) { case osgGA::GUIEventAdapter::PUSH: return MyGUI::InputManager::getInstance().injectMousePress(x, y, convertMouseButton(ea.getButton())); break; case osgGA::GUIEventAdapter::RELEASE: return MyGUI::InputManager::getInstance().injectMouseRelease(x, y, convertMouseButton(ea.getButton())); break; case osgGA::GUIEventAdapter::SCROLL: switch (ea.getScrollingMotion()) { case osgGA::GUIEventAdapter::SCROLL_UP: z++; break; case osgGA::GUIEventAdapter::SCROLL_DOWN: z--; break; } // fall through case osgGA::GUIEventAdapter::DRAG: case osgGA::GUIEventAdapter::MOVE: return MyGUI::InputManager::getInstance().injectMouseMove(x, y, z); break; case osgGA::GUIEventAdapter::KEYDOWN: if (key<127) return MyGUI::InputManager::getInstance().injectKeyPress(convertKeyCode(key), (char)key); else return MyGUI::InputManager::getInstance().injectKeyPress(convertKeyCode(key)); break; case osgGA::GUIEventAdapter::KEYUP: return MyGUI::InputManager::getInstance().injectKeyRelease(convertKeyCode(key)); break; case osgGA::GUIEventAdapter::RESIZE: _platform->getRenderManagerPtr()->setViewSize( int(floor(float(ea.getWindowWidth()) / _uiScale + 0.5f)), int(floor(float(ea.getWindowHeight()) / _uiScale + 0.5f))); break; default: break; } return false; }
bool OscSendingDevice::sendMultiTouchData(const osgGA::GUIEventAdapter &ea) { if(!ea.isMultiTouchEvent()) return false; beginMultiTouchSequence(); osgGA::GUIEventAdapter::TouchData* touch_data = ea.getTouchData(); _oscStream << osc::BeginMessage("/tuio/2Dcur") << "alive"; for(osgGA::GUIEventAdapter::TouchData::iterator i = touch_data->begin(); i != touch_data->end(); ++i) _oscStream << static_cast<osc::int32>(i->id); _oscStream << osc::EndMessage; unsigned int j(0); unsigned int num_ended(0); for(osgGA::GUIEventAdapter::TouchData::iterator i = touch_data->begin(); i != touch_data->end(); ++i, ++j) { float x = (ea.getTouchPointNormalizedX(j) + 1.0) / 2.0; float y =(ea.getTouchPointNormalizedY(j) + 1.0) / 2.0; // flip y if origin is not top/left if(ea.getMouseYOrientation() == osgGA::GUIEventAdapter::Y_INCREASING_UPWARDS) y *= -1; float vel_x(0), vel_y(0), accel(0); if (_lastEvent.valid()) { // TODO: add velocity + acceleration } _oscStream << osc::BeginMessage("/tuio/2Dcur") << "set" << static_cast<osc::int32>(i->id) << x << y << vel_x << vel_y << accel << osc::EndMessage; if(i->phase == osgGA::GUIEventAdapter::TOUCH_ENDED) num_ended++; } _lastEvent = new osgGA::GUIEventAdapter(ea); _finishMultiTouchSequence = (num_ended == touch_data->getNumTouchPoints()); return true; }
void CompositeViewer::generateSlavePointerData(osg::Camera* camera, osgGA::GUIEventAdapter& event) { osgViewer::GraphicsWindow* gw = dynamic_cast<osgViewer::GraphicsWindow*>(event.getGraphicsContext()); if (!gw) return; // What type of Camera is it? // 1) Master Camera : do nothin extra // 2) Slave Camera, Relative RF, Same scene graph as master : transform coords into Master Camera and add to PointerData list // 3) Slave Camera, Relative RF, Different scene graph from master : do nothing extra? // 4) Slave Camera, Absolute RF, Same scene graph as master : do nothing extra? // 5) Slave Camera, Absolute RF, Different scene graph : do nothing extra? // 6) Slave Camera, Absolute RF, Different scene graph but a distortion correction subgraph depending upon RTT Camera (slave or master) // : project ray into RTT Camera's clip space, and RTT Camera's is Relative RF and sharing same scene graph as master then transform coords. // if camera isn't the master it must be a slave and could need reprojecting. osgViewer::View* view = dynamic_cast<osgViewer::View*>(camera->getView()); if (!view) return; osg::Camera* view_masterCamera = view->getCamera(); if (camera!=view_masterCamera) { 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; double master_min_x = -1.0; double master_max_x = 1.0; double master_min_y = -1.0; double master_max_y = 1.0; osg::Matrix masterCameraVPW = view_masterCamera->getViewMatrix() * view_masterCamera->getProjectionMatrix(); if (view_masterCamera->getViewport()) { osg::Viewport* viewport = view_masterCamera->getViewport(); master_min_x = viewport->x(); master_min_y = viewport->y(); master_max_x = viewport->x()+viewport->width(); master_max_y = viewport->y()+viewport->height(); masterCameraVPW *= viewport->computeWindowMatrix(); } // slave Camera tahnks to sharing the same View osg::View::Slave* slave = view ? view->findSlaveForCamera(camera) : 0; if (slave) { if (camera->getReferenceFrame()==osg::Camera::RELATIVE_RF && slave->_useMastersSceneData) { osg::Viewport* viewport = camera->getViewport(); osg::Matrix localCameraVPW = camera->getViewMatrix() * camera->getProjectionMatrix(); if (viewport) localCameraVPW *= viewport->computeWindowMatrix(); osg::Matrix matrix( osg::Matrix::inverse(localCameraVPW) * masterCameraVPW ); osg::Vec3d new_coord = osg::Vec3d(x,y,0.0) * matrix; //OSG_NOTICE<<" pointer event new_coord.x()="<<new_coord.x()<<" new_coord.y()="<<new_coord.y()<<std::endl; event.addPointerData(new osgGA::PointerData(view_masterCamera, new_coord.x(), master_min_x, master_max_x, new_coord.y(), master_min_y, master_max_y)); } else if (!slave->_useMastersSceneData) { // Are their any RTT Camera's that this Camera depends upon for textures? osg::ref_ptr<osgUtil::LineSegmentIntersector> ray = new osgUtil::LineSegmentIntersector(osgUtil::Intersector::WINDOW, x,y); osgUtil::IntersectionVisitor iv(ray.get()); camera->accept(iv); if (ray->containsIntersections()) { osg::Vec3 tc; osg::Texture* texture = ray->getFirstIntersection().getTextureLookUp(tc); if (texture) { // look up Texture in RTT Camera's. for(unsigned int i=0; i<view->getNumSlaves(); ++i) { osg::Camera* slave_camera = view->getSlave(i)._camera.get(); if (slave_camera) { osg::Camera::BufferAttachmentMap::const_iterator ba_itr = slave_camera->getBufferAttachmentMap().find(osg::Camera::COLOR_BUFFER); if (ba_itr != slave_camera->getBufferAttachmentMap().end()) { if (ba_itr->second._texture == texture) { osg::TextureRectangle* tr = dynamic_cast<osg::TextureRectangle*>(ba_itr->second._texture.get()); osg::TextureCubeMap* tcm = dynamic_cast<osg::TextureCubeMap*>(ba_itr->second._texture.get()); if (tr) { event.addPointerData(new osgGA::PointerData(slave_camera, tc.x(), 0.0f, static_cast<float>(tr->getTextureWidth()), tc.y(), 0.0f, static_cast<float>(tr->getTextureHeight()))); } else if (tcm) { OSG_NOTICE<<" Slave has matched texture cubemap"<<ba_itr->second._texture.get()<<", "<<ba_itr->second._face<<std::endl; } else { event.addPointerData(new osgGA::PointerData(slave_camera, tc.x(), 0.0f, 1.0f, tc.y(), 0.0f, 1.0f)); } } } } } } } } } } }
void OscSendingDevice::beginSendInputRange(const osgGA::GUIEventAdapter &ea, MsgIdType msg_id) { beginBundle(msg_id); _oscStream << osc::BeginMessage("/osgga/mouse/set_input_range") << ea.getXmin() << ea.getYmin() << ea.getXmax() << ea.getYmax() << osc::EndMessage; _oscStream << osc::BeginMessage("/osgga/mouse/y_orientation_increasing_upwards") << (bool)(ea.getMouseYOrientation() == osgGA::GUIEventAdapter::Y_INCREASING_UPWARDS) << osc::EndMessage; }
void OscProxyEventHandler::sendInit(const osgGA::GUIEventAdapter &ea) { _oscStream << osc::BeginBundle(); _oscStream << osc::BeginMessage("/osgga/resize") << ea.getWindowX() << ea.getWindowY() << ea.getWindowWidth() << ea.getWindowHeight() << osc::EndMessage; _oscStream << osc::BeginMessage("/osgga/mouse/set_input_range") << ea.getXmin() << ea.getYmin() << ea.getXmax() << ea.getYmax() << osc::EndMessage; _oscStream << osc::BeginMessage("/osgga/mouse/y_orientation_increasing_upwards") << (bool)(ea.getMouseYOrientation() == osgGA::GUIEventAdapter::Y_INCREASING_UPWARDS) << osc::EndMessage; _oscStream << osc::EndBundle; }