76FXDEFMAP(GUIOSGView) GUIOSGView_Map[] = {
78 FXMAPFUNC(SEL_CHORE,
MID_CHORE, GUIOSGView::OnIdle),
84operator<<(std::ostream& os,
const osg::Vec3d& v) {
85 return os << v.x() <<
"," << v.y() <<
"," << v.z();
92GUIOSGView::Command_TLSChange::Command_TLSChange(
const MSLink*
const link, osg::Switch* switchNode)
98GUIOSGView::Command_TLSChange::~Command_TLSChange() {}
102GUIOSGView::Command_TLSChange::execute() {
103 switch (myLink->getState()) {
106 mySwitch->setSingleChildOn(0);
110 mySwitch->setSingleChildOn(1);
114 mySwitch->setSingleChildOn(2);
117 mySwitch->setSingleChildOn(3);
121 mySwitch->setSingleChildOn(3);
124 mySwitch->setAllChildrenOff();
126 myLastState = myLink->getState();
133GUIOSGView::GUIOSGView(
137 GUINet& net, FXGLVisual* glVis,
140 myTracked(0), myCameraManipulator(new GUIOSGManipulator(this)), myLastUpdate(-1),
141 myOSGNormalizedCursorX(0.), myOSGNormalizedCursorY(0.) {
142 if (myChanger !=
nullptr) {
147 myAdapter =
new FXOSGAdapter(
this,
new FXCursor(parent->getApp(), CURSOR_CROSS));
148 myViewer =
new osgViewer::Viewer();
150 const char* sumoPath = getenv(
"SUMO_HOME");
152 std::string newPath = std::string(sumoPath) +
"/data/3D";
154 osgDB::FilePathList path = osgDB::Registry::instance()->getDataFilePathList();
155 path.push_back(newPath);
156 osgDB::Registry::instance()->setDataFilePathList(path);
160 myGreenLight = osgDB::readNodeFile(
"tlg.obj");
161 myYellowLight = osgDB::readNodeFile(
"tly.obj");
162 myRedLight = osgDB::readNodeFile(
"tlr.obj");
163 myRedYellowLight = osgDB::readNodeFile(
"tlu.obj");
164 myPoleBase = osgDB::readNodeFile(
"poleBase.obj");
165 if (myGreenLight == 0 || myYellowLight == 0 || myRedLight == 0 || myRedYellowLight == 0 || myPoleBase == 0) {
169 double left, right, bottom, top, zNear, zFar;
170 myViewer->getCamera()->getProjectionMatrixAsFrustum(left, right, bottom, top, zNear, zFar);
171 myRoot = GUIOSGBuilder::buildOSGScene(myGreenLight, myYellowLight, myRedLight, myRedYellowLight, myPoleBase);
172 myPlane =
new osg::MatrixTransform();
173 myPlane->setCullCallback(
new ExcludeFromNearFarComputationCallback());
174 myPlane->addChild(GUIOSGBuilder::buildPlane((
float)(zFar - zNear)));
175 myPlane->addUpdateCallback(
new PlaneMoverCallback(myViewer->getCamera()));
176 myRoot->addChild(myPlane);
178 osgViewer::StatsHandler* statsHandler =
new osgViewer::StatsHandler();
179 statsHandler->setKeyEventTogglesOnScreenStats(osgGA::GUIEventAdapter::KEY_I);
180 myViewer->addEventHandler(statsHandler);
181 myViewer->setSceneData(myRoot);
182 myViewer->setCameraManipulator(myCameraManipulator);
184 myViewer->setKeyEventSetsDone(0);
185 myViewer->getCamera()->setGraphicsContext(myAdapter);
186 myViewer->getCamera()->setViewport(0, 0, w, h);
187 myViewer->getCamera()->setNearFarRatio(0.005);
188 myViewer->setThreadingModel(osgViewer::Viewer::SingleThreaded);
189 myViewer->addEventHandler(
new PickHandler(
this));
190 osg::Vec3d lookFrom, lookAt, up;
191 myCameraManipulator->getHomePosition(lookFrom, lookAt, up);
192 lookFrom = lookAt + osg::Z_AXIS;
194 myCameraManipulator->setHomePosition(lookFrom, lookAt, up);
200 myAdapter->getState()->checkGLErrors(
"GUIOSGView constructor after first init steps");
202 myTextNode =
new osg::Geode();
203 myText =
new osgText::Text;
204 myText->setCharacterSizeMode(osgText::Text::SCREEN_COORDS);
205 myText->setShaderTechnique(osgText::NO_TEXT_SHADER);
206 osgText::Font* font = osgText::readFontFile(
"arial.ttf");
207 if (font !=
nullptr) {
208 myText->setFont(font);
210 myText->setCharacterSize(16.f);
211 myTextNode->addDrawable(myText);
212 myText->setAlignment(osgText::TextBase::AlignmentType::LEFT_TOP);
213 myText->setDrawMode(osgText::TextBase::DrawModeMask::FILLEDBOUNDINGBOX | osgText::TextBase::DrawModeMask::TEXT);
214 myText->setBoundingBoxColor(osg::Vec4(0.0f, 0.0f, 0.2f, 0.5f));
215 myText->setBoundingBoxMargin(2.0f);
217 myAdapter->getState()->checkGLErrors(
"GUIOSGView constructor after myText init");
220 myHUD =
new osg::Camera;
221 myHUD->setProjectionMatrixAsOrtho2D(0, 800, 0, 800);
222 myHUD->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
223 myHUD->setViewMatrix(osg::Matrix::identity());
224 myHUD->setClearMask(GL_DEPTH_BUFFER_BIT);
225 myHUD->setRenderOrder(osg::Camera::POST_RENDER);
226 myHUD->setAllowEventFocus(
false);
227 myHUD->setGraphicsContext(myAdapter);
228 myHUD->addChild(myTextNode);
229 myHUD->setViewport(0, 0, w, h);
230 myViewer->addSlave(myHUD,
false);
231 myCameraManipulator->updateHUDText();
233 myAdapter->getState()->checkGLErrors(
"GUIOSGView constructor after HUD");
239 myAdapter->getState()->checkGLErrors(
"GUIOSGView constructor after adoptViewSettings");
242 osgUtil::Optimizer optimizer;
243 optimizer.optimize(myRoot);
247GUIOSGView::~GUIOSGView() {
249 myViewer->setDone(
true);
253 myCameraManipulator = 0;
260 myRedYellowLight = 0;
266GUIOSGView::adoptViewSettings() {
268 osg::Light* globalLight = myViewer->getLight();
269 globalLight->setAmbient(toOSGColorVector(myVisualizationSettings->ambient3DLight));
270 globalLight->setDiffuse(toOSGColorVector(myVisualizationSettings->diffuse3DLight));
271 myViewer->getCamera()->setClearColor(toOSGColorVector(myVisualizationSettings->skyColor));
274 osg::Geode* planeGeode =
dynamic_cast<osg::Geode*
>(myPlane->getChild(0));
275 osg::Geometry* planeGeom =
dynamic_cast<osg::Geometry*
>(planeGeode->getChild(0));
276 osg::Vec4ubArray* colors =
dynamic_cast<osg::Vec4ubArray*
>(planeGeom->getColorArray());
277 (*colors)[0].set(myVisualizationSettings->backgroundColor.red(),
278 myVisualizationSettings->backgroundColor.green(),
279 myVisualizationSettings->backgroundColor.blue(),
280 myVisualizationSettings->backgroundColor.alpha());
281 planeGeom->setColorArray(colors);
284 unsigned int cullMask = 0xFFFFFFFF;
285 cullMask ^= (-int(myVisualizationSettings->show3DTLSDomes) ^ cullMask) & (1UL << NODESET_TLSDOMES);
286 cullMask ^= (-int(myVisualizationSettings->show3DTLSLinkMarkers) ^ cullMask) & (1UL << NODESET_TLSLINKMARKERS);
287 cullMask ^= (-int(myVisualizationSettings->generate3DTLSModels) ^ cullMask) & (1UL << NODESET_TLSMODELS);
288 myViewer->getCamera()->setCullMask(cullMask);
289 unsigned int hudCullMask = (myVisualizationSettings->show3DHeadUpDisplay) ? 0xFFFFFFFF : 0;
290 myHUD->setCullMask(hudCullMask);
295GUIOSGView::getPositionInformation()
const {
297 getPositionAtCursor(myOSGNormalizedCursorX, myOSGNormalizedCursorY, pos);
303GUIOSGView::recalculateBoundaries() {
308GUIOSGView::is3DView()
const {
318 for (std::vector<std::string>::const_iterator i = names.begin(); i != names.end(); ++i) {
320 if ((*i) == myVisualizationSettings->name) {
328 "\tLocate Junction\tLocate a junction within the network.",
333 "\tLocate Street\tLocate a street within the network.",
338 "\tLocate Vehicle\tLocate a vehicle within the network.",
343 "\tLocate Person\tLocate a person within the network.",
348 "\tLocate Container\tLocate a container within the network.",
353 "\tLocate TLS\tLocate a tls within the network.",
358 "\tLocate Additional\tLocate an additional structure within the network.",
363 "\tLocate POI\tLocate a POI within the network.",
368 "\tLocate Polygon\tLocate a Polygon within the network.",
375GUIOSGView::resize(
int w,
int h) {
376 GUISUMOAbstractView::resize(w, h);
377 updateHUDPosition(w, h);
382GUIOSGView::position(
int x,
int y,
int w,
int h) {
383 GUISUMOAbstractView::position(x, y, w, h);
384 updateHUDPosition(w, h);
389GUIOSGView::updateHUDPosition(
int w,
int h) {
391 myHUD->setProjectionMatrixAsOrtho2D(0, w, 0, h);
392 myText->setPosition(osg::Vec3d(0.,
static_cast<double>(height), 0.));
397GUIOSGView::updateHUDText(
const std::string text) {
398 myText->setText(text, osgText::String::ENCODING_UTF8);
403GUIOSGView::recenterView() {
405 Position center = myGrid->getCenter();
406 double radius = std::max(myGrid->xmax() - myGrid->xmin(), myGrid->ymax() - myGrid->ymin());
407 myChanger->centerTo(center, radius);
412GUIOSGView::setColorScheme(
const std::string& name) {
416 if (myGUIDialogViewSettings != 0) {
417 if (myGUIDialogViewSettings->getCurrentScheme() != name) {
418 myGUIDialogViewSettings->setCurrentScheme(name);
422 myVisualizationSettings->
gaming = myApp->isGaming();
430GUIOSGView::onPaint(FXObject*, FXSelector,
void*) {
434 myDecalsLockMutex.lock();
436 if (!d.initialised) {
437 if (d.filename.length() == 6 && d.filename.substr(0, 5) ==
"light") {
438 GUIOSGBuilder::buildLight(d, *myRoot);
439 }
else if (d.filename.length() > 3 && d.filename.substr(0, 3) ==
"tl:") {
440 const int linkStringIdx = (int)d.filename.find(
':', 3);
443 const std::string tlLogic = d.filename.substr(3, linkStringIdx - 3);
446 if (linkIdx < 0 || linkIdx >=
static_cast<int>(vars.
getActive()->
getLinks().size())) {
450 osg::Group* tlNode = GUIOSGBuilder::getTrafficLight(d, vars, link, myGreenLight, myYellowLight, myRedLight, myRedYellowLight, myPoleBase,
true, 0.5);
451 tlNode->setName(
"tlLogic:" + tlLogic);
452 myRoot->addChild(tlNode);
459 GUIOSGBuilder::buildDecal(d, *myRoot);
461 d.initialised =
true;
464 myDecalsLockMutex.unlock();
467 for (
auto& item : myVehicles) {
468 item.second.active =
false;
473 for (
const MSEdge* e : net->getEdgeControl().getEdges()) {
474 for (
const MSLane* l : e->getLanes()) {
481 auto itVeh = myVehicles.find(veh);
482 if (itVeh == myVehicles.end()) {
483 myVehicles[veh] = GUIOSGBuilder::buildMovable(veh->
getVehicleType());
484 myRoot->addChild(myVehicles[veh].pos);
485 myVehicles[veh].pos->setName(
"vehicle:" + veh->
getID());
486 veh->setNode(myVehicles[veh].pos);
488 itVeh->second.active =
true;
490 osg::PositionAttitudeTransform* n = myVehicles[veh].pos;
493 const double slope = -veh->
getSlope();
494 n->setAttitude(osg::Quat(osg::DegreesToRadians(slope), osg::Vec3(1, 0, 0),
495 0, osg::Vec3(0, 1, 0),
496 dir, osg::Vec3(0, 0, 1)));
511 col = myVisualizationSettings->vehicleColorer.getScheme().getColor(veh->
getColorValue(*myVisualizationSettings, myVisualizationSettings->vehicleColorer.getActive()));
513 myVehicles[veh].mat->setDiffuse(osg::Material::FRONT_AND_BACK, osg::Vec4d(col.
red() / 255., col.
green() / 255., col.
blue() / 255., col.
alpha() / 255.));
518 l->releaseVehicles();
522 for (
auto veh = myVehicles.begin(); veh != myVehicles.end();) {
523 if (!veh->second.active) {
524 removeVeh((veh++)->first);
531 if (now != myLastUpdate || (myGUIDialogViewSettings != 0 && myGUIDialogViewSettings->shown())) {
534 if (now != myLastUpdate && myTracked != 0) {
535 osg::Vec3d lookFrom, lookAt, up;
536 lookAt[0] = myTracked->getPosition().x();
537 lookAt[1] = myTracked->getPosition().y();
538 lookAt[2] = myTracked->getPosition().z();
539 const double angle = myTracked->getAngle();
540 lookFrom[0] = lookAt[0] + 50. * cos(angle);
541 lookFrom[1] = lookAt[1] + 50. * sin(angle);
542 lookFrom[2] = lookAt[2] + 10.;
544 m.makeLookAt(lookFrom, lookAt, osg::Z_AXIS);
545 myViewer->getCameraManipulator()->setByInverseMatrix(m);
549 for (
auto& item : myPersons) {
550 item.second.active =
false;
553 for (
const MSEdge* e : net->getEdgeControl().getEdges()) {
555 const std::set<MSTransportable*, ComparatorNumericalIdLess>& persons = ge->
getPersonsSecure();
556 for (
auto person : persons) {
557 if (person->hasArrived() || !person->hasDeparted()) {
561 auto itPers = myPersons.find(person);
562 if (itPers == myPersons.end()) {
563 myPersons[person] = GUIOSGBuilder::buildMovable(person->getVehicleType());
564 myRoot->addChild(myPersons[person].pos);
566 itPers->second.active =
true;
568 osg::PositionAttitudeTransform* n = myPersons[person].pos;
569 const Position pos = person->getPosition();
570 n->setPosition(osg::Vec3d(pos.
x(), pos.
y(), pos.
z()));
571 const double dir = person->getAngle() +
M_PI / 2.;
572 n->setAttitude(osg::Quat(dir, osg::Vec3d(0, 0, 1)));
577 col = myVisualizationSettings->personColorer.getScheme().getColor(actualPerson->
getColorValue(*myVisualizationSettings, myVisualizationSettings->vehicleColorer.getActive()));
579 myPersons[person].mat->setDiffuse(osg::Material::FRONT_AND_BACK, osg::Vec4d(col.
red() / 255., col.
green() / 255., col.
blue() / 255., col.
alpha() / 255.));
585 for (
auto person = myPersons.begin(); person != myPersons.end();) {
586 if (!person->second.active) {
587 removeTransportable((person++)->first);
593 if (myAdapter->makeCurrent()) {
604 if (myTracked == veh) {
607 std::map<MSVehicle*, OSGMovable>::iterator i = myVehicles.find(veh);
608 if (i != myVehicles.end()) {
609 myRoot->removeChild(i->second.pos);
617 std::map<MSTransportable*, OSGMovable>::iterator i = myPersons.find(t);
618 if (i != myPersons.end()) {
619 myRoot->removeChild(i->second.pos);
625void GUIOSGView::updateViewportValues() {
626 osg::Vec3d lookFrom, lookAt, up;
627 myViewer->getCameraManipulator()->getInverseMatrix().getLookAt(lookFrom, lookAt, up);
628 myGUIDialogEditViewport->setValues(
Position(lookFrom[0], lookFrom[1], lookFrom[2]),
629 Position(lookAt[0], lookAt[1], lookAt[2]), calculateRotation(lookFrom, lookAt, up));
634GUIOSGView::showViewportEditor() {
636 osg::Vec3d lookFrom, lookAt, up;
637 myViewer->getCameraManipulator()->getInverseMatrix().getLookAt(lookFrom, lookAt, up);
638 Position from(lookFrom[0], lookFrom[1], lookFrom[2]), at(lookAt[0], lookAt[1], lookAt[2]);
639 myGUIDialogEditViewport->setOldValues(from, at, calculateRotation(lookFrom, lookAt, up));
640 myGUIDialogEditViewport->setZoomValue(100);
641 myGUIDialogEditViewport->show();
646GUIOSGView::setViewportFromToRot(
const Position& lookFrom,
const Position& lookAt,
double rotation) {
647 osg::Vec3d lookFromOSG, lookAtOSG, up;
648 lookFromOSG[0] = lookFrom.
x();
649 lookFromOSG[1] = lookFrom.
y();
650 lookFromOSG[2] = lookFrom.
z();
651 lookAtOSG[0] = lookAt.
x();
652 lookAtOSG[1] = lookAt.
y();
653 lookAtOSG[2] = lookAt.
z();
655 osg::Vec3d viewAxis, viewUp, orthogonal, normal;
656 viewAxis = lookFromOSG - lookAtOSG;
657 viewAxis.normalize();
658 viewUp = (viewAxis[0] + viewAxis[1] == 0.) ? osg::Vec3d(0., 1., 0.) : osg::Vec3d(0., 0., 1.);
659 orthogonal = viewUp ^ viewAxis;
660 orthogonal.normalize();
661 normal = viewAxis ^ orthogonal;
663 rotation = std::fmod(rotation, 360.);
667 myChanger->setRotation(rotation);
668 double angle =
DEG2RAD(rotation);
669 up = normal * cos(angle) - orthogonal * sin(angle);
672 double zoom = (myGUIDialogEditViewport !=
nullptr) ? myGUIDialogEditViewport->getZoomValue() : 100.;
673 lookFromOSG = lookFromOSG + viewAxis * (100. - zoom);
674 lookAtOSG = lookFromOSG - viewAxis;
675 myViewer->getCameraManipulator()->setHomePosition(lookFromOSG, lookAtOSG, up);
682 osg::Vec3d lookFrom, lookAt, up;
683 myViewer->getCameraManipulator()->getHomePosition(lookFrom, lookAt, up);
685 Position(lookAt[0], lookAt[1], lookAt[2]), 0);
690GUIOSGView::startTrack(
int id) {
691 if (myTracked == 0 || (
int)myTracked->getGlID() !=
id) {
696 if ((
int)veh->getGlID() ==
id) {
697 if (!veh->
isOnRoad() || myVehicles.find(veh) == myVehicles.end()) {
704 if (myTracked != 0) {
705 osg::Vec3d lookFrom, lookAt, up;
707 lookAt[1] = myTracked->getPosition().y();
708 lookAt[2] = myTracked->getPosition().z();
709 lookFrom[0] = lookAt[0] + 50.;
710 lookFrom[1] = lookAt[1] + 50.;
711 lookFrom[2] = lookAt[2] + 10.;
713 m.makeLookAt(lookFrom, lookAt, osg::Z_AXIS);
714 myViewer->getCameraManipulator()->setByInverseMatrix(m);
721GUIOSGView::stopTrack() {
727GUIOSGView::getTrackedID()
const {
733GUIOSGView::onGamingClick(
Position pos) {
736 double minDist = std::numeric_limits<double>::infinity();
741 if (lanes.size() > 0) {
742 const Position& endPos = lanes[0]->getShape().back();
752 const std::vector<MSTrafficLightLogic*> logics = vars.
getAllLogics();
753 if (logics.size() > 1) {
755 for (
int i = 0; i < (int)logics.size() - 1; i++) {
756 if (minTll->
getProgramID() == logics[i]->getProgramID()) {
761 if (l == logics[0]) {
772GUIOSGView::getCurrentTimeStep()
const {
777long GUIOSGView::onConfigure(FXObject* sender, FXSelector sel,
void* ptr) {
779 const int w = getWidth();
780 const int h = getHeight();
781 if (w > 0 && h > 0) {
782 myAdapter->getEventQueue()->windowResize(0, 0, w, h);
783 myAdapter->resized(0, 0, w, h);
784 updateHUDPosition(w, h);
786 return FXGLCanvas::onConfigure(sender, sel, ptr);
790long GUIOSGView::onKeyPress(FXObject* sender, FXSelector sel,
void* ptr) {
791 int key = ((FXEvent*)ptr)->code;
792 myAdapter->getEventQueue()->keyPress(key);
794 if (key == FX::KEY_f || key == FX::KEY_Left || key == FX::KEY_Right || key == FX::KEY_Up || key == FX::KEY_Down) {
797 return FXGLCanvas::onKeyPress(sender, sel, ptr);
801long GUIOSGView::onKeyRelease(FXObject* sender, FXSelector sel,
void* ptr) {
802 int key = ((FXEvent*)ptr)->code;
803 myAdapter->getEventQueue()->keyRelease(key);
805 if (key == FX::KEY_f || key == FX::KEY_Left || key == FX::KEY_Right || key == FX::KEY_Up || key == FX::KEY_Down) {
808 return FXGLCanvas::onKeyRelease(sender, sel, ptr);
812long GUIOSGView::onLeftBtnPress(FXObject* sender, FXSelector sel,
void* ptr) {
813 handle(
this, FXSEL(SEL_FOCUS_SELF, 0), ptr);
815 FXEvent*
event = (FXEvent*)ptr;
816 myAdapter->getEventQueue()->mouseButtonPress((
float)
event->click_x, (float)event->click_y, 1);
817 if (myApp->isGaming()) {
818 onGamingClick(getPositionInformation());
821 return FXGLCanvas::onLeftBtnPress(sender, sel, ptr);
825long GUIOSGView::onLeftBtnRelease(FXObject* sender, FXSelector sel,
void* ptr) {
826 FXEvent*
event = (FXEvent*)ptr;
827 myAdapter->getEventQueue()->mouseButtonRelease((
float)
event->click_x, (float)event->click_y, 1);
828 myChanger->onLeftBtnRelease(ptr);
829 return FXGLCanvas::onLeftBtnRelease(sender, sel, ptr);
833long GUIOSGView::onMiddleBtnPress(FXObject* sender, FXSelector sel,
void* ptr) {
834 handle(
this, FXSEL(SEL_FOCUS_SELF, 0), ptr);
836 FXEvent*
event = (FXEvent*)ptr;
837 myAdapter->getEventQueue()->mouseButtonPress((
float)
event->click_x, (float)event->click_y, 2);
839 return FXGLCanvas::onMiddleBtnPress(sender, sel, ptr);
843long GUIOSGView::onMiddleBtnRelease(FXObject* sender, FXSelector sel,
void* ptr) {
844 FXEvent*
event = (FXEvent*)ptr;
845 myAdapter->getEventQueue()->mouseButtonRelease((
float)
event->click_x, (float)event->click_y, 2);
846 myChanger->onMiddleBtnRelease(ptr);
847 return FXGLCanvas::onMiddleBtnRelease(sender, sel, ptr);
851long GUIOSGView::onRightBtnPress(FXObject* sender, FXSelector sel,
void* ptr) {
852 handle(
this, FXSEL(SEL_FOCUS_SELF, 0), ptr);
854 FXEvent*
event = (FXEvent*)ptr;
855 myAdapter->getEventQueue()->mouseButtonPress((
float)
event->click_x, (float)event->click_y, 3);
857 return FXGLCanvas::onRightBtnPress(sender, sel, ptr);
861long GUIOSGView::onRightBtnRelease(FXObject* sender, FXSelector sel,
void* ptr) {
862 FXEvent*
event = (FXEvent*)ptr;
863 myAdapter->getEventQueue()->mouseButtonRelease((
float)
event->click_x, (float)event->click_y, 3);
864 myChanger->onRightBtnRelease(ptr);
865 return FXGLCanvas::onRightBtnRelease(sender, sel, ptr);
870GUIOSGView::onMouseMove(FXObject* sender, FXSelector sel,
void* ptr) {
872 if (myPopup && (myPopup->shown() ==
false)) {
876 FXEvent*
event = (FXEvent*)ptr;
877 osgGA::GUIEventAdapter* ea = myAdapter->getEventQueue()->mouseMotion((
float)
event->win_x, (float)event->win_y);
878 setWindowCursorPosition(ea->getXnormalized(), ea->getYnormalized());
879 if (myGUIDialogEditViewport !=
nullptr && myGUIDialogEditViewport->shown()) {
880 updateViewportValues();
882 updatePositionInformation();
883 return FXGLCanvas::onMotion(sender, sel, ptr);
888GUIOSGView::OnIdle(FXObject* , FXSelector ,
void*) {
897GUIOSGView::onCmdCloseLane(FXObject*, FXSelector,
void*) {
898 GUILane* lane = getLaneUnderCursor();
899 if (lane !=
nullptr) {
910GUIOSGView::onCmdCloseEdge(FXObject*, FXSelector,
void*) {
911 GUILane* lane = getLaneUnderCursor();
912 if (lane !=
nullptr) {
923GUIOSGView::onCmdAddRerouter(FXObject*, FXSelector,
void*) {
924 GUILane* lane = getLaneUnderCursor();
925 if (lane !=
nullptr) {
935GUIOSGView::onCmdShowReachability(FXObject* menu, FXSelector selector,
void*) {
936 GUILane* lane = getLaneUnderCursor();
937 if (lane !=
nullptr) {
941 if (myVisualizationSettings->laneColorer.getActive() != 36) {
942 myVisualizationSettings->laneColorer.setActive(1);
952GUIOSGView::onVisualizationChange(FXObject*, FXSelector,
void*) {
959GUIOSGView::setWindowCursorPosition(
float x,
float y) {
960 myOSGNormalizedCursorX = x;
961 myOSGNormalizedCursorY = y;
966GUIOSGView::calculateRotation(
const osg::Vec3d& lookFrom,
const osg::Vec3d& lookAt,
const osg::Vec3d& up) {
967 osg::Vec3d viewAxis, viewUp, orthogonal, normal;
968 viewAxis = lookFrom - lookAt;
969 viewAxis.normalize();
970 viewUp = (abs(viewAxis[0]) + abs(viewAxis[1]) == 0.) ? osg::Y_AXIS : osg::Z_AXIS;
971 orthogonal = viewUp ^ viewAxis;
972 orthogonal.normalize();
973 normal = viewAxis ^ orthogonal;
974 double angle = atan2((normal ^ up).length() / (normal.length() * up.length()), (normal * up) / (normal.length() * up.length()));
983GUIOSGView::updatePositionInformation()
const {
985 if (getPositionAtCursor(myOSGNormalizedCursorX, myOSGNormalizedCursorY, pos)) {
986 myApp->getCartesianLabel()->setText((
"x:" +
toString(pos.
x()) +
", y:" +
toString(pos.
y())).c_str());
992 myApp->getGeoLabel()->setText((
"x:" +
toString(pos.
x()) +
", y:" +
toString(pos.
y()) +
TL(
" (No projection defined)")).c_str());
996 myApp->getCartesianLabel()->setText(
TL(
"N/A"));
997 myApp->getGeoLabel()->setText(
TL(
"N/A"));
1003GUIOSGView::getPositionAtCursor(
float xNorm,
float yNorm,
Position& pos)
const {
1005 osg::Vec3d lookFrom, lookAt, up, viewAxis;
1006 myViewer->getCameraManipulator()->getInverseMatrix().getLookAt(lookFrom, lookAt, up);
1007 if ((lookAt - lookFrom).z() >= 0.) {
1012 osg::Matrixd iVP = osg::Matrixd::inverse(myViewer->getCamera()->getViewMatrix() * myViewer->getCamera()->getProjectionMatrix());
1013 osg::Vec3 nearPoint = osg::Vec3(xNorm, yNorm, 0.0f) * iVP;
1014 osg::Vec3 farPoint = osg::Vec3(xNorm, yNorm, 1.0f) * iVP;
1015 osg::Vec3 ray = farPoint - nearPoint;
1016 osg::Vec3 groundPos = nearPoint - ray * nearPoint.z() / ray.z();
1017 pos.
setx(groundPos.x());
1018 pos.
sety(groundPos.y());
1024std::vector<GUIGlObject*>
1025GUIOSGView::getGUIGlObjectsUnderCursor() {
1026 std::vector<GUIGlObject*> result;
1027 osgUtil::LineSegmentIntersector::Intersections intersections;
1028 if (myViewer->computeIntersections(myViewer->getCamera(), osgUtil::Intersector::CoordinateFrame::PROJECTION, myOSGNormalizedCursorX, myOSGNormalizedCursorY, intersections)) {
1029 for (
auto intersection : intersections) {
1030 if (!intersection.nodePath.empty()) {
1032 for (osg::Node* currentNode : intersection.nodePath) {
1033 if (currentNode->getName().length() > 0 && currentNode->getName().find(
":") != std::string::npos) {
1034 const std::string objID = currentNode->getName();
1044 result.push_back(o);
1057GUIOSGView::getLaneUnderCursor() {
1058 std::vector<GUIGlObject*> objects = getGUIGlObjectsUnderCursor();
1059 if (objects.size() > 0) {
1060 return dynamic_cast<GUILane*
>(objects[0]);
1068 osg::Vec3d lookFromOSG, lookAtOSG, viewAxis, up;
1069 myViewer->getCameraManipulator()->getInverseMatrix().getLookAt(lookFromOSG, lookAtOSG, up);
1070 lookFromOSG[0] = camera.
x();
1071 lookFromOSG[1] = camera.
y();
1072 lookFromOSG[2] = camera.
z();
1073 lookAtOSG[0] = lookAt.
x();
1074 lookAtOSG[1] = lookAt.
y();
1075 lookAtOSG[2] = lookAt.
z();
1076 viewAxis = lookAtOSG - lookFromOSG;
1077 viewAxis.normalize();
1080 osg::Vec3d cameraUpdate = lookFromOSG + viewAxis * (zoom - 100.);
1081 osg::Vec3d lookAtUpdate = cameraUpdate + viewAxis;
1083 myViewer->getCameraManipulator()->setHomePosition(cameraUpdate, lookAtUpdate, up);
1089GUIOSGView::toOSGColorVector(
RGBColor c,
bool useAlpha) {
1090 return osg::Vec4d(c.
red() / 255., c.
green() / 255., c.
blue() / 255., (useAlpha) ? c.
alpha() / 255. : 1.);
1095 : myParent(parent), myOldCursor(cursor) {
1096 _traits =
new GraphicsContext::Traits();
1099 _traits->width = parent->getWidth();
1100 _traits->height = parent->getHeight();
1101 _traits->windowDecoration =
false;
1102 _traits->doubleBuffer =
true;
1103 _traits->sharedContext = 0;
1105 setState(
new osg::State());
1106 getState()->setGraphicsContext(
this);
1108 getState()->setCheckForGLErrors(osg::State::ONCE_PER_ATTRIBUTE);
1109 std::cout <<
"OSG getCheckForGLErrors " << getState()->getCheckForGLErrors() << std::endl;
1111 if (_traits.valid() && _traits->sharedContext != 0) {
1112 getState()->setContextID(_traits->sharedContext->getState()->getContextID());
1113 incrementContextIDUsageCount(getState()->getContextID());
1115 getState()->setContextID(createNewContextID());
1121GUIOSGView::FXOSGAdapter::~FXOSGAdapter() {
1127GUIOSGView::FXOSGAdapter::grabFocus() {
1129 myParent->setFocus();
1134GUIOSGView::FXOSGAdapter::useCursor(
bool cursorOn) {
1136 myParent->setDefaultCursor(myOldCursor);
1138 myParent->setDefaultCursor(NULL);
1144GUIOSGView::FXOSGAdapter::makeCurrentImplementation() {
1145 myParent->makeCurrent();
1151GUIOSGView::FXOSGAdapter::releaseContext() {
1152 myParent->makeNonCurrent();
1158GUIOSGView::FXOSGAdapter::swapBuffersImplementation() {
1159 myParent->swapBuffers();
1164GUIOSGView::PickHandler::handle(
const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& ) {
1165 if (ea.getEventType() == osgGA::GUIEventAdapter::DRAG) {
1167 }
else if (ea.getEventType() == osgGA::GUIEventAdapter::RELEASE && ea.getButton() == osgGA::GUIEventAdapter::RIGHT_MOUSE_BUTTON) {
1169 if (myParent->makeCurrent()) {
1170 std::vector<GUIGlObject*> objects = myParent->getGUIGlObjectsUnderCursor();
1171 if (objects.size() > 0) {
1172 myParent->openObjectDialog(objects);
1174 myParent->makeNonCurrent();
@ MID_HOTKEY_SHIFT_O_LOCATEPOI
Locate poi - button.
@ MID_HOTKEY_SHIFT_A_LOCATEADDITIONAL
Locate additional structure - button.
@ MID_HOTKEY_SHIFT_C_LOCATECONTAINER
Locate container - button.
@ MID_HOTKEY_SHIFT_V_LOCATEVEHICLE
Locate vehicle - button.
@ MID_HOTKEY_SHIFT_L_LOCATEPOLY
Locate polygons - button.
@ MID_HOTKEY_SHIFT_E_LOCATEEDGE
Locate edge - button.
@ MID_HOTKEY_SHIFT_P_LOCATEPERSON
Locate person - button.
@ MID_HOTKEY_SHIFT_J_LOCATEJUNCTION
Locate junction - button.
@ MID_HOTKEY_SHIFT_T_LOCATETLS
Locate TLS - button.
GUICompleteSchemeStorage gSchemeStorage
#define GUIDesignButtonPopup
checkable button placed in popup (for example, locate buttons)
FXDEFMAP(GUIDialog_AppSettings) GUIDialog_AppSettingsMap[]
std::ostream & operator<<(std::ostream &out, MSDevice_SSM::EncounterType type)
Nicer output for EncounterType enum.
#define WRITE_ERRORF(...)
@ LINKSTATE_TL_REDYELLOW
The link has red light (must brake) but indicates upcoming green.
@ LINKSTATE_STOP
This is an uncontrolled, minor link, has to stop.
@ LINKSTATE_TL_YELLOW_MAJOR
The link has yellow light, may pass.
@ LINKSTATE_TL_GREEN_MAJOR
The link has green light, may pass.
@ LINKSTATE_TL_OFF_BLINKING
The link is controlled by a tls which is off and blinks, has to brake.
@ LINKSTATE_TL_YELLOW_MINOR
The link has yellow light, has to brake anyway.
@ LINKSTATE_TL_RED
The link has red light (must brake)
@ LINKSTATE_TL_GREEN_MINOR
The link has green light, has to brake.
@ LINKSTATE_TL_OFF_NOSIGNAL
The link is controlled by a tls which is off, not blinking, may pass.
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
static bool isReadable(std::string path)
Checks whether the given file is readable.
static bool setFunctionalColor(int activeScheme, const MSBaseVehicle *veh, RGBColor &col)
sets the color according to the current scheme index and some vehicle function
bool contains(const std::string &name) const
Returns the information whether a setting with the given name is stored.
GUIVisualizationSettings & get(const std::string &name)
Returns the named scheme.
const std::vector< std::string > & getNames() const
Returns a list of stored settings names.
A road/street connecting two junctions (gui-version)
void releasePersons() const
Allows to use the container for microsimulation again.
const std::set< MSTransportable *, ComparatorNumericalIdLess > & getPersonsSecure() const
Returns this edge's persons set; locks it for microsimulation.
FXComboBox * getColoringSchemesCombo()
return combobox with the current coloring schemes (standard, fastest standard, real world....
FXPopup * getLocatorPopup()
@ brief return a pointer to locator popup
static const GUIGlID INVALID_ID
GUIGlID getGlID() const
Returns the numerical id of the object.
void unblockObject(GUIGlID id)
Marks an object as unblocked.
GUIGlObject * getObjectBlocking(GUIGlID id) const
Returns the object from the container locking it.
static GUIGlObjectStorage gIDStorage
A single static instance of this class.
static FXIcon * getIcon(const GUIIcon which)
returns a icon previously defined in the enum GUIIcon
Representation of a lane in the micro simulation (gui-version)
void closeTraffic(bool rebuildAllowed=true)
close this lane for traffic
A MSNet extended by some values for usage within the gui.
static GUINet * getGUIInstance()
Returns the pointer to the unique instance of GUINet (singleton).
double getColorValue(const GUIVisualizationSettings &s, int activeScheme) const override
gets the color value according to the current scheme index
static bool setFunctionalColor(int activeScheme, const MSPerson *person, RGBColor &col)
sets the color according to the current scheme index and some vehicle function
virtual void setViewportFromToRot(const Position &lookFrom, const Position &lookAt, double rotation)
applies the given viewport settings
A single child window which contains a view of the simulation area.
A MSVehicle extended by some values for usage within the gui.
double getAngle() const
Return current angle.
Position getPosition(const double offset=0) const
Return current position (x/y, cartesian)
double getColorValue(const GUIVisualizationSettings &s, int activeScheme) const
gets the color value according to the current scheme index
static long showLaneReachability(GUILane *lane, FXObject *, FXSelector)
bool gaming
whether the application is in gaming mode or not
static const GeoConvHelper & getFinal()
the coordinate transformation for writing the location element and for tracking the original coordina...
void cartesian2geo(Position &cartesian) const
Converts the given cartesian (shifted) position to its geo (lat/long) representation.
bool isParking() const
Returns whether the vehicle is parking.
const MSVehicleType & getVehicleType() const
Returns the vehicle's type definition.
A road/street connecting two junctions.
Representation of a lane in the micro simulation.
std::vector< MSVehicle * > VehCont
Container for vehicles.
MSEdge & getEdge() const
Returns the lane's edge.
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
MSTLLogicControl & getTLSControl()
Returns the tls logics control.
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
MSVehicleControl & getVehicleControl()
Returns the vehicle control.
SUMOTime duration
The duration of the phase.
A fixed traffic light logic.
virtual void changeStepAndDuration(MSTLLogicControl &tlcontrol, SUMOTime simStep, int step, SUMOTime stepDuration) override
Changes the current phase and her duration.
const MSPhaseDefinition & getPhase(int givenstep) const override
Returns the definition of the phase from the given position within the plan.
Storage for all programs of a single tls.
std::vector< MSTrafficLightLogic * > getAllLogics() const
MSTrafficLightLogic * getActive() const
A class that stores and controls tls and switching of their programs.
void switchTo(const std::string &id, const std::string &programID)
Switches the named (id) tls to the named (programID) program.
TLSLogicVariants & get(const std::string &id) const
Returns the variants of a named tls.
bool isActive(const MSTrafficLightLogic *tl) const
Returns whether the given tls program is the currently active for his tls.
The parent class for traffic light logics.
const LinkVectorVector & getLinks() const
Returns the list of lists of all affected links.
std::vector< MSLane * > LaneVector
Definition of the list of arrival lanes subjected to this tls.
const std::string & getProgramID() const
Returns this tl-logic's id.
const LinkVector & getLinksAt(int i) const
Returns the list of links that are controlled by the signals at the given position.
std::map< std::string, SUMOVehicle * >::const_iterator constVehIt
Definition of the internal vehicles map iterator.
constVehIt loadedVehBegin() const
Returns the begin of the internal vehicle map.
constVehIt loadedVehEnd() const
Returns the end of the internal vehicle map.
Representation of a vehicle in the micro simulation.
bool wasRemoteControlled(SUMOTime lookBack=DELTA_T) const
Returns the information whether the vehicle is fully controlled via TraCI within the lookBack time.
bool isOnRoad() const
Returns the information whether the vehicle is on a road (is simulated)
bool signalSet(int which) const
Returns whether the given signal is on.
Position getPosition(const double offset=0) const
Return current position (x/y, cartesian)
@ VEH_SIGNAL_BLINKER_RIGHT
Right blinker lights are switched on.
@ VEH_SIGNAL_BRAKELIGHT
The brake lights are on.
@ VEH_SIGNAL_BLINKER_LEFT
Left blinker lights are switched on.
@ VEH_SIGNAL_BLINKER_EMERGENCY
Blinker lights on both sides are switched on.
double getSlope() const
Returns the slope of the road at vehicle's position in degrees.
const std::string & getID() const
Returns the id.
A point in 2D or 3D with translation and scaling methods.
void setx(double x)
set position x
double distanceTo(const Position &p2) const
returns the euclidean distance in 3 dimension
double x() const
Returns the x-position.
void setz(double z)
set position z
double z() const
Returns the z-position.
void sety(double y)
set position y
double y() const
Returns the y-position.
unsigned char red() const
Returns the red-amount of the color.
unsigned char alpha() const
Returns the alpha-amount of the color.
unsigned char green() const
Returns the green-amount of the color.
unsigned char blue() const
Returns the blue-amount of the color.
static int toInt(const std::string &sData)
converts a string into the integer value described by it by calling the char-type converter,...
@ key
the parser read a key of a value in an object
A decal (an image) that can be shown.