void SimplePager::removeCallback(Callback* callback) { if (callback) { Threading::ScopedMutexLock lock(_mutex); for (Callbacks::iterator i = _callbacks.begin(); i != _callbacks.end(); ++i) { if (i->get() == callback) { _callbacks.erase(i); break; } } } }
bool MouseCoordsTool::handle( const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa ) { if (ea.getEventType() == ea.MOVE || ea.getEventType() == ea.DRAG) { osg::Vec3d world; if ( _mapNode->getTerrain()->getWorldCoordsUnderMouse(aa.asView(), ea.getX(), ea.getY(), world) ) { GeoPoint map; map.fromWorld( _mapNode->getMapSRS(), world ); for( Callbacks::iterator i = _callbacks.begin(); i != _callbacks.end(); ++i ) i->get()->set( map, aa.asView(), _mapNode ); } else { for( Callbacks::iterator i = _callbacks.begin(); i != _callbacks.end(); ++i ) i->get()->reset( aa.asView(), _mapNode ); } #if 1 // testing AGL, Dist to Point osg::Vec3d eye, center, up; aa.asView()->getCamera()->getViewMatrixAsLookAt(eye, center, up); DPLineSegmentIntersector* lsi = new DPLineSegmentIntersector(eye, osg::Vec3d(0,0,0)); osgUtil::IntersectionVisitor iv(lsi); lsi->setIntersectionLimit(lsi->LIMIT_NEAREST); //iv.setUserData( new Map() ); _mapNode->accept(iv); if ( !lsi->getIntersections().empty() ) { double agl = (eye - lsi->getFirstIntersection().getWorldIntersectPoint()).length(); double dtp = (eye - world).length(); //OE_NOTICE << "AGL = " << agl << "m; DPT = " << dtp << "m" << std::endl; Registry::instance()->startActivity("AGL", Stringify() << agl << " m"); Registry::instance()->startActivity("Range", Stringify() << dtp << " m"); } #endif } return false; }
bool MouseCoordsTool::handle( const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa ) { if (ea.getEventType() == ea.MOVE || ea.getEventType() == ea.DRAG) { osg::Vec3d world; if ( _mapNode->getTerrain()->getWorldCoordsUnderMouse(aa.asView(), ea.getX(), ea.getY(), world) ) { GeoPoint map; map.fromWorld( _mapNode->getMapSRS(), world ); for( Callbacks::iterator i = _callbacks.begin(); i != _callbacks.end(); ++i ) i->get()->set( map, aa.asView(), _mapNode ); } else { for( Callbacks::iterator i = _callbacks.begin(); i != _callbacks.end(); ++i ) i->get()->reset( aa.asView(), _mapNode ); } } return false; }
void SimplePager::fire_onCreateNode(const TileKey& key, osg::Node* node) { Threading::ScopedMutexLock lock(_mutex); for (Callbacks::iterator i = _callbacks.begin(); i != _callbacks.end(); ++i) i->get()->onCreateNode(key, node); }
bool FeatureQueryTool::handle( const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa ) { bool handled = false; bool attempt; if ( _inputPredicate.valid() ) { attempt = _inputPredicate->accept(ea); } else { attempt = ea.getEventType() == osgGA::GUIEventAdapter::RELEASE && _mouseDown && fabs(ea.getX()-_mouseDownX) <= 3.0 && fabs(ea.getY()-_mouseDownY) <= 3.0; } if ( attempt ) { osg::View* view = aa.asView(); Picker picker( dynamic_cast<osgViewer::View*>(view), _mapNode->getModelLayerGroup() ); Picker::Hits hits; if ( picker.pick( ea.getX(), ea.getY(), hits ) ) { // find the closest indexed feature to the camera. It must be a feature // that is not only closest, but exists in the index as well. FeatureSourceIndexNode* closestIndex = 0L; FeatureID closestFID; double closestDistance = DBL_MAX; osg::Vec3d closestWorldPt; for(Picker::Hits::iterator hit = hits.begin(); hit != hits.end(); ++hit ) { FeatureSourceIndexNode* index = picker.getNode<FeatureSourceIndexNode>( *hit ); if ( index && (hit->distance < closestDistance) ) { FeatureID fid; if ( index->getFID( hit->drawable, hit->primitiveIndex, fid ) ) { closestIndex = index; closestFID = fid; closestDistance = hit->distance; closestWorldPt = hit->matrix.valid() ? hit->localIntersectionPoint * (*hit->matrix.get()) : hit->localIntersectionPoint; } } } if ( closestIndex ) { OE_DEBUG << LC << "HIT: feature ID = " << (unsigned)closestFID << std::endl; Callback::EventArgs args; args._ea = &ea; args._aa = &aa; args._worldPoint = closestWorldPt; for( Callbacks::iterator i = _callbacks.begin(); i != _callbacks.end(); ) { if ( i->valid() ) { i->get()->onHit( closestIndex, closestFID, args ); ++i; } else { i = _callbacks.erase( i ); } } handled = true; } } if ( !handled ) { OE_DEBUG << LC << "miss" << std::endl; Callback::EventArgs args; args._ea = &ea; args._aa = &aa; for( Callbacks::iterator i = _callbacks.begin(); i != _callbacks.end(); ) { if ( i->valid() ) { i->get()->onMiss( args ); ++i; } else { i = _callbacks.erase( i ); } } } _mouseDown = false; } // unmodified left mouse click else if ( ea.getEventType() == osgGA::GUIEventAdapter::PUSH && ea.getModKeyMask() == 0 && ea.getButtonMask() == osgGA::GUIEventAdapter::LEFT_MOUSE_BUTTON) { _mouseDown = true; _mouseDownX = ea.getX(); _mouseDownY = ea.getY(); } return handled; }