void OscSendingDevice::sendUserDataContainer(const std::string& key, const osg::UserDataContainer* udc, bool asBundle, MsgIdType msg_id) { if (asBundle) { beginBundle(msg_id); } OscSendingDeviceGetValueVisitor gvv(_oscStream); unsigned int num_objects = udc->getNumUserObjects(); for(unsigned int i = 0; i < num_objects; ++i) { const osg::Object* o = udc->getUserObject(i); const osg::UserDataContainer* child_udc = dynamic_cast<const osg::UserDataContainer*>(o); if (child_udc) { std::string new_key = key + "/" + (child_udc->getName().empty() ? "user_data" : child_udc->getName()); sendUserDataContainer(transliterateKey(key), child_udc, false, msg_id); } else if (const osg::ValueObject* vo = dynamic_cast<const osg::ValueObject*>(o)) { _oscStream << osc::BeginMessage(std::string("/" + key + "/" + transliterateKey(vo->getName())).c_str()); vo->get(gvv); _oscStream << osc::EndMessage; } } if (asBundle) _oscStream << osc::EndBundle; }
bool OscSendingDevice::sendEventImpl(const osgGA::Event &ea, MsgIdType msg_id) { bool do_send(false); if (ea.getUserDataContainer()) { std::string key = ea.getUserDataContainer()->getName(); if (key.empty()) key = ea.getName(); if (key.empty()) key = "user_data"; sendUserDataContainer(transliterateKey(key), ea.getUserDataContainer(), true, msg_id); do_send = true; } if (do_send) { OSG_INFO << "OscDevice :: sending event per OSC " << std::endl; _transmitSocket.Send( _oscStream.Data(), _oscStream.Size() ); _oscStream.Clear(); } return do_send; }
bool OscSendingDevice::sendUIEventImpl(const osgGA::GUIEventAdapter &ea, MsgIdType msg_id) { bool do_send(false); switch(ea.getEventType()) { case osgGA::GUIEventAdapter::RESIZE: beginBundle(msg_id); _oscStream << osc::BeginMessage("/osgga/resize") << ea.getWindowX() << ea.getWindowY() << ea.getWindowWidth() << ea.getWindowHeight() << osc::EndMessage; _oscStream << osc::EndBundle; do_send = true; break; case osgGA::GUIEventAdapter::SCROLL: beginSendInputRange(ea, msg_id); _oscStream << osc::BeginMessage("/osgga/mouse/scroll") << ea.getScrollingMotion() << ea.getScrollingDeltaX() << ea.getScrollingDeltaY() << osc::EndMessage; _oscStream << osc::EndBundle; do_send = true; break; case osgGA::GUIEventAdapter::PEN_PRESSURE: beginBundle(msg_id); _oscStream << osc::BeginMessage("/osgga/pen/pressure") << ea.getPenPressure() << osc::EndMessage; _oscStream << osc::EndBundle; do_send = true; break; case osgGA::GUIEventAdapter::PEN_ORIENTATION: beginBundle(msg_id); _oscStream << osc::BeginMessage("/osgga/pen/orientation") << ea.getPenRotation() << ea.getPenTiltX() << ea.getPenTiltY() << osc::EndMessage; do_send = true; _oscStream << osc::EndBundle; break; case osgGA::GUIEventAdapter::PEN_PROXIMITY_ENTER: beginBundle(msg_id); _oscStream << osc::BeginMessage("/osgga/pen/proximity/enter") << ea.getTabletPointerType() << osc::EndMessage; do_send = true; break; case osgGA::GUIEventAdapter::PEN_PROXIMITY_LEAVE: beginBundle(msg_id); _oscStream << osc::BeginMessage("/osgga/pen/proximity/leave") << ea.getTabletPointerType() << osc::EndMessage; _oscStream << osc::EndBundle; do_send = true; break; case osgGA::GUIEventAdapter::PUSH: beginSendInputRange(ea, msg_id); if (!sendMultiTouchData(ea)) _oscStream << osc::BeginMessage("/osgga/mouse/press") << ea.getX() << ea.getY() << getButtonNum(ea) << osc::EndMessage; _oscStream << osc::EndBundle; do_send = true; break; case osgGA::GUIEventAdapter::RELEASE: beginSendInputRange(ea, msg_id); if (!sendMultiTouchData(ea)) _oscStream << osc::BeginMessage("/osgga/mouse/release") << ea.getX() << ea.getY() << getButtonNum(ea) << osc::EndMessage; _oscStream << osc::EndBundle; do_send = true; break; case osgGA::GUIEventAdapter::DOUBLECLICK: beginSendInputRange(ea, msg_id); if (!sendMultiTouchData(ea)) _oscStream << osc::BeginMessage("/osgga/mouse/doublepress") << ea.getX() << ea.getY() << getButtonNum(ea) << osc::EndMessage; _oscStream << osc::EndBundle; do_send = true; break; case osgGA::GUIEventAdapter::MOVE: case osgGA::GUIEventAdapter::DRAG: beginSendInputRange(ea, msg_id); if (!sendMultiTouchData(ea)) _oscStream << osc::BeginMessage("/osgga/mouse/motion") << ea.getX() << ea.getY() << osc::EndMessage; _oscStream << osc::EndBundle; do_send = true; break; case osgGA::GUIEventAdapter::KEYDOWN: beginBundle(msg_id); _oscStream << osc::BeginMessage("/osgga/key/press") << ea.getKey() << osc::EndMessage; _oscStream << osc::EndBundle; do_send = true; break; case osgGA::GUIEventAdapter::KEYUP: beginBundle(msg_id); _oscStream << osc::BeginMessage("/osgga/key/release") << ea.getKey() << osc::EndMessage; _oscStream << osc::EndBundle; do_send = true; break; case osgGA::GUIEventAdapter::USER: if (ea.getUserDataContainer()) { std::string key = ea.getUserDataContainer()->getName(); if (key.empty()) key = ea.getName(); if (key.empty()) key = "user_data"; sendUserDataContainer(transliterateKey(key), ea.getUserDataContainer(), true, msg_id); do_send = true; } default: break; } if (do_send) { _transmitSocket.Send( _oscStream.Data(), _oscStream.Size() ); _oscStream.Clear(); } return do_send; }
void OscSendingDevice::sendEvent(const osgGA::GUIEventAdapter &ea) { bool do_send(false); switch(ea.getEventType()) { case osgGA::GUIEventAdapter::RESIZE: sendInit(ea); do_send = true; break; case osgGA::GUIEventAdapter::SCROLL: _oscStream << osc::BeginMessage("/osgga/mouse/scroll") << ea.getScrollingMotion() << ea.getScrollingDeltaX() << ea.getScrollingDeltaY() << osc::EndMessage; do_send = true; break; case osgGA::GUIEventAdapter::PEN_PRESSURE: _oscStream << osc::BeginMessage("/osgga/pen/pressure") << ea.getPenPressure() << osc::EndMessage; do_send = true; break; case osgGA::GUIEventAdapter::PEN_ORIENTATION: _oscStream << osc::BeginMessage("/osgga/pen/orientation") << ea.getPenRotation() << ea.getPenTiltX() << ea.getPenTiltY() << osc::EndMessage; do_send = true; break; case osgGA::GUIEventAdapter::PEN_PROXIMITY_ENTER: _oscStream << osc::BeginMessage("/osgga/pen/proximity/enter") << ea.getTabletPointerType() << osc::EndMessage; do_send = true; break; case osgGA::GUIEventAdapter::PEN_PROXIMITY_LEAVE: _oscStream << osc::BeginMessage("/osgga/pen/proximity/leave") << ea.getTabletPointerType() << osc::EndMessage; do_send = true; break; case osgGA::GUIEventAdapter::PUSH: _oscStream << osc::BeginMessage("/osgga/mouse/press") << ea.getX() << ea.getY() << getButtonNum(ea) << osc::EndMessage; do_send = true; break; case osgGA::GUIEventAdapter::RELEASE: _oscStream << osc::BeginMessage("/osgga/mouse/release") << ea.getX() << ea.getY() << getButtonNum(ea) << osc::EndMessage; do_send = true; break; case osgGA::GUIEventAdapter::DOUBLECLICK: _oscStream << osc::BeginMessage("/osgga/mouse/doublepress") << ea.getX() << ea.getY() << getButtonNum(ea) << osc::EndMessage; do_send = true; break; case osgGA::GUIEventAdapter::MOVE: if (_firstRun) { _firstRun = false; sendInit(ea); do_send = true; break; } // break missing by intent; case osgGA::GUIEventAdapter::DRAG: _oscStream << osc::BeginMessage("/osgga/mouse/motion") << ea.getX() << ea.getY() << osc::EndMessage; do_send = true; break; case osgGA::GUIEventAdapter::KEYDOWN: _oscStream << osc::BeginMessage("/osgga/key/press") << ea.getKey() << osc::EndMessage; do_send = true; break; case osgGA::GUIEventAdapter::KEYUP: _oscStream << osc::BeginMessage("/osgga/key/release") << ea.getKey() << osc::EndMessage; do_send = true; break; case osgGA::GUIEventAdapter::USER: if (ea.getUserDataContainer()) { std::string key = ea.getUserDataContainer()->getName(); if (key.empty()) key = ea.getName(); if (key.empty()) key = "user_data"; sendUserDataContainer(transliterateKey(key), ea.getUserDataContainer(), true); do_send = true; } default: break; } if (do_send) { OSG_INFO << "OscDevice :: sending event per OSC " << std::endl; _transmitSocket.Send( _oscStream.Data(), _oscStream.Size() ); _oscStream.Clear(); } }