Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
GUIOSGView.cpp
Go to the documentation of this file.
1/****************************************************************************/
2// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3// Copyright (C) 2001-2026 German Aerospace Center (DLR) and others.
4// This program and the accompanying materials are made available under the
5// terms of the Eclipse Public License 2.0 which is available at
6// https://www.eclipse.org/legal/epl-2.0/
7// This Source Code may also be made available under the following Secondary
8// Licenses when the conditions for such availability set forth in the Eclipse
9// Public License 2.0 are satisfied: GNU General Public License, version 2
10// or later which is available at
11// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13/****************************************************************************/
20// An OSG-based 3D view on the simulation
21/****************************************************************************/
22#include <config.h>
23
24#ifdef HAVE_OSG
25
26#include <cmath>
27#include <fxkeys.h>
28#include <iostream>
29#include <limits>
30#include <utility>
34#include <gui/GUIViewTraffic.h>
35#include <guisim/GUIEdge.h>
37#include <guisim/GUILane.h>
38#include <guisim/GUINet.h>
39#include <guisim/GUIPerson.h>
40#include <guisim/GUIVehicle.h>
41#include <microsim/MSEdge.h>
43#include <microsim/MSLane.h>
44#include <microsim/MSNet.h>
70
71#include "GUIOSGBuilder.h"
73#include "GUIOSGView.h"
74
75//#define DEBUG_GLERRORS
76
77FXDEFMAP(GUIOSGView) GUIOSGView_Map[] = {
78 //________Message_Type_________ ___ID___ ________Message_Handler________
79 FXMAPFUNC(SEL_CHORE, MID_CHORE, GUIOSGView::onIdle),
80};
81FXIMPLEMENT(GUIOSGView, GUISUMOAbstractView, GUIOSGView_Map, ARRAYNUMBER(GUIOSGView_Map))
82
83
84std::ostream&
85operator<<(std::ostream& os, const osg::Vec3d& v) {
86 return os << v.x() << "," << v.y() << "," << v.z();
87}
88
89// ===========================================================================
90// GUIOSGView::Command_TLSChange member method definitions
91// ===========================================================================
92
93GUIOSGView::Command_TLSChange::Command_TLSChange(const MSLink* const link, osg::Switch* switchNode)
94 : myLink(link), mySwitch(switchNode), myLastState(LINKSTATE_TL_OFF_NOSIGNAL) {
95 execute();
96}
97
98
99GUIOSGView::Command_TLSChange::~Command_TLSChange() {}
100
101
102void
103GUIOSGView::Command_TLSChange::execute() {
104 switch (myLink->getState()) {
107 mySwitch->setSingleChildOn(0);
108 break;
111 mySwitch->setSingleChildOn(1);
112 break;
113 case LINKSTATE_TL_RED:
114 case LINKSTATE_STOP:
115 mySwitch->setSingleChildOn(2);
116 break;
118 mySwitch->setSingleChildOn(3);
119 break;
122 mySwitch->setSingleChildOn(3);
123 break;
124 default:
125 mySwitch->setAllChildrenOff();
126 }
127 myLastState = myLink->getState();
128}
129
130// ===========================================================================
131// GUIOSGView member method definitions
132// ===========================================================================
133
134GUIOSGView::GUIOSGView(
135 FXComposite* p,
136 GUIMainWindow& app,
137 GUISUMOViewParent* parent,
138 GUINet& net, FXGLVisual* glVis,
139 FXGLCanvas* share) :
140 GUISUMOAbstractView(p, app, parent, net.getVisualisationSpeedUp(), glVis, share),
141 myTracked(0), myLastUpdate(-1),
142 myOSGNormalizedCursorX(0.), myOSGNormalizedCursorY(0.) {
143 if (myChanger != nullptr) {
144 delete (myChanger);
145 }
146 int w = getWidth();
147 int h = getHeight();
148 myAdapter = new FXOSGAdapter(this, new FXCursor(parent->getApp(), CURSOR_CROSS));
149 myViewer = new osgViewer::Viewer();
150 myCameraManipulator = new GUIOSGManipulator(this);
151 myChanger = new GUIOSGPerspectiveChanger(*this, *myGrid);
152 const char* sumoPath = getenv("SUMO_HOME");
153 if (sumoPath != 0) {
154 std::string newPath = std::string(sumoPath) + "/data/3D";
155 if (FileHelpers::isReadable(newPath)) {
156 osgDB::FilePathList path = osgDB::Registry::instance()->getDataFilePathList();
157 path.push_back(newPath);
158 osgDB::Registry::instance()->setDataFilePathList(path);
159 }
160 }
161
162 myGreenLight = osgDB::readNodeFile("tlg.obj");
163 myYellowLight = osgDB::readNodeFile("tly.obj");
164 myRedLight = osgDB::readNodeFile("tlr.obj");
165 myRedYellowLight = osgDB::readNodeFile("tlu.obj");
166 myPoleBase = osgDB::readNodeFile("poleBase.obj");
167 if (myGreenLight == 0 || myYellowLight == 0 || myRedLight == 0 || myRedYellowLight == 0 || myPoleBase == 0) {
168 WRITE_ERROR(TL("Could not load traffic light files."));
169 }
170 // calculate camera frustum to scale the ground plane all across
171 double left, right, bottom, top, zNear, zFar;
172 myViewer->getCamera()->getProjectionMatrixAsFrustum(left, right, bottom, top, zNear, zFar);
173 myRoot = GUIOSGBuilder::buildOSGScene(myGreenLight, myYellowLight, myRedLight, myRedYellowLight, myPoleBase);
174 myPlane = new osg::MatrixTransform();
175 myPlane->setCullCallback(new ExcludeFromNearFarComputationCallback());
176 myPlane->addChild(GUIOSGBuilder::buildPlane((float)(zFar - zNear)));
177 myPlane->addUpdateCallback(new PlaneMoverCallback(myViewer->getCamera()));
178 myRoot->addChild(myPlane);
179 // add the stats handler
180 osgViewer::StatsHandler* statsHandler = new osgViewer::StatsHandler();
181 statsHandler->setKeyEventTogglesOnScreenStats(osgGA::GUIEventAdapter::KEY_I);
182 myViewer->addEventHandler(statsHandler);
183 myViewer->setSceneData(myRoot);
184 myViewer->setCameraManipulator(myCameraManipulator);
185
186 myViewer->setKeyEventSetsDone(0);
187 myViewer->getCamera()->setGraphicsContext(myAdapter);
188 myViewer->getCamera()->setViewport(0, 0, w, h);
189 myViewer->getCamera()->setNearFarRatio(0.005); // does not work together with setUpDepthPartitionForCamera
190 myViewer->setThreadingModel(osgViewer::Viewer::SingleThreaded);
191 myViewer->addEventHandler(new PickHandler(this));
192 osg::Vec3d lookFrom, lookAt, up;
193 myCameraManipulator->getHomePosition(lookFrom, lookAt, up);
194 lookFrom = lookAt + osg::Z_AXIS;
195 up = osg::Y_AXIS;
196 myCameraManipulator->setHomePosition(lookFrom, lookAt, up);
197 myViewer->home();
198 recenterView();
199 myViewer->home();
200 getApp()->addChore(this, MID_CHORE);
201 myTextNode = new osg::Geode();
202 myText = new osgText::Text;
203 myText->setCharacterSizeMode(osgText::Text::SCREEN_COORDS);
204 myText->setShaderTechnique(osgText::NO_TEXT_SHADER);
205 osgText::Font* font = osgText::readFontFile("arial.ttf");
206 if (font != nullptr) {
207 myText->setFont(font);
208 }
209 myText->setCharacterSize(16.f);
210 myTextNode->addDrawable(myText);
211 myText->setAlignment(osgText::TextBase::AlignmentType::LEFT_TOP);
212 myText->setDrawMode(osgText::TextBase::DrawModeMask::FILLEDBOUNDINGBOX | osgText::TextBase::DrawModeMask::TEXT);
213 myText->setBoundingBoxColor(osg::Vec4(0.0f, 0.0f, 0.2f, 0.5f));
214 myText->setBoundingBoxMargin(2.0f);
215
216 myFullScreenTextNode = new osg::Geode();
217 myFullScreenText = new osgText::Text;
218 myFullScreenText->setCharacterSizeMode(osgText::Text::SCREEN_COORDS);
219 myFullScreenText->setShaderTechnique(osgText::NO_TEXT_SHADER);
220 if (font != nullptr) {
221 myFullScreenText->setFont(font);
222 }
223 myFullScreenText->setCharacterSize(16.f);
224 myFullScreenText->setAlignment(osgText::TextBase::AlignmentType::RIGHT_BOTTOM);
225 myFullScreenText->setDrawMode(osgText::TextBase::DrawModeMask::FILLEDBOUNDINGBOX | osgText::TextBase::DrawModeMask::TEXT);
226 myFullScreenText->setBoundingBoxColor(osg::Vec4(0.0f, 0.0f, 0.0f, 0.6f));
227 myFullScreenText->setBoundingBoxMargin(6.0f);
228 myFullScreenText->setText(getFullScreenHintText(), osgText::String::ENCODING_UTF8);
229 myFullScreenTextNode->addDrawable(myFullScreenText);
230 myFullScreenTextNode->setNodeMask(0);
231
232 myHUD = new osg::Camera;
233 myHUD->setProjectionMatrixAsOrtho2D(0, 800, 0, 800); // default size will be overwritten
234 myHUD->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
235 myHUD->setViewMatrix(osg::Matrix::identity());
236 myHUD->setClearMask(GL_DEPTH_BUFFER_BIT);
237 myHUD->setRenderOrder(osg::Camera::POST_RENDER);
238 myHUD->setAllowEventFocus(false);
239 myHUD->setGraphicsContext(myAdapter);
240 myHUD->addChild(myTextNode);
241 myHUD->addChild(myFullScreenTextNode);
242 myHUD->setViewport(0, 0, w, h);
243 myViewer->addSlave(myHUD, false);
244 myCameraManipulator->updateHUDText();
245
246 // adjust the main light
247 adoptViewSettings();
248 osgUtil::Optimizer optimizer;
249 optimizer.optimize(myRoot);
250}
251
252
253GUIOSGView::~GUIOSGView() {
254 getApp()->removeChore(this, MID_CHORE);
255 myViewer->setDone(true);
256 myViewer = 0;
257 myRoot = 0;
258 myAdapter = 0;
259 myCameraManipulator = 0;
260 myHUD = 0;
261 myText = 0;
262 myTextNode = 0;
263 myFullScreenText = 0;
264 myFullScreenTextNode = 0;
265 myGreenLight = 0;
266 myYellowLight = 0;
267 myRedLight = 0;
268 myRedYellowLight = 0;
269 myPoleBase = 0;
270}
271
272
273void
274GUIOSGView::adoptViewSettings() {
275 // lighting
276 osg::Light* globalLight = myViewer->getLight();
277 globalLight->setAmbient(toOSGColorVector(myVisualizationSettings->ambient3DLight));
278 globalLight->setDiffuse(toOSGColorVector(myVisualizationSettings->diffuse3DLight));
279 myViewer->getCamera()->setClearColor(toOSGColorVector(myVisualizationSettings->skyColor));
280
281 // ground color
282 osg::Geode* planeGeode = dynamic_cast<osg::Geode*>(myPlane->getChild(0));
283 osg::Geometry* planeGeom = dynamic_cast<osg::Geometry*>(planeGeode->getChild(0));
284 osg::Vec4ubArray* colors = dynamic_cast<osg::Vec4ubArray*>(planeGeom->getColorArray());
285 (*colors)[0].set(myVisualizationSettings->backgroundColor.red(),
286 myVisualizationSettings->backgroundColor.green(),
287 myVisualizationSettings->backgroundColor.blue(),
288 myVisualizationSettings->backgroundColor.alpha());
289 planeGeom->setColorArray(colors);
290
291 // show/hide OSG nodes
292 unsigned int cullMask = 0xFFFFFFFF;
293 if (!myVisualizationSettings->show3DTLSDomes) {
294 cullMask &= ~(unsigned int)NODESET_TLSDOMES;
295 }
296 if (!myVisualizationSettings->show3DTLSLinkMarkers) {
297 cullMask &= ~(unsigned int)NODESET_TLSLINKMARKERS;
298 }
299 if (!myVisualizationSettings->generate3DTLSModels) {
300 cullMask &= ~(unsigned int)NODESET_TLSMODELS;
301 }
302 myViewer->getCamera()->setCullMask(cullMask);
303 const unsigned int hudNodeMask = (myVisualizationSettings->show3DHeadUpDisplay) ? 0xFFFFFFFF : 0;
304 myTextNode->setNodeMask(hudNodeMask);
305}
306
307
309GUIOSGView::getPositionInformation() const {
310 Position pos;
311 getPositionAtCursor(myOSGNormalizedCursorX, myOSGNormalizedCursorY, pos);
312 return pos;
313}
314
315
316bool
317GUIOSGView::is3DView() const {
318 return true;
319}
320
321
322void
323GUIOSGView::buildViewToolBars(GUIGlChildWindow* v) {
324 // build coloring tools
325 {
326 const std::vector<std::string>& names = gSchemeStorage.getNames();
327 for (std::vector<std::string>::const_iterator i = names.begin(); i != names.end(); ++i) {
328 v->getColoringSchemesCombo()->appendIconItem(i->c_str());
329 if ((*i) == myVisualizationSettings->name) {
331 }
332 }
333 }
334 // for junctions
336 "Locate Junction", "Locate a junction within the network.", "",
339 // for edges
341 "Locate Street", "Locate a street within the network.", "",
344 // for vehicles
346 "Locate Vehicle", "Locate a vehicle within the network.", "",
349 // for persons
351 "Locate Person", "Locate a person within the network.", "",
354 // for containers
356 "Locate Container", "Locate a container within the network.", "",
359 // for tls
361 "Locate TLS", "Locate a tls within the network.", "",
364 // for additional stuff
366 "Locate Additional", "Locate an additional structure within the network.", "",
369 // for pois
371 "Locate POI", "Locate a POI within the network.", "",
374 // for polygons
376 "Locate Polygon", "Locate a Polygon within the network.", "",
379}
380
381
382void
383GUIOSGView::resize(int w, int h) {
384 GUISUMOAbstractView::resize(w, h);
385 updateHUDPosition(w, h);
386}
387
388
389void
390GUIOSGView::position(int x, int y, int w, int h) {
391 GUISUMOAbstractView::position(x, y, w, h);
392 updateHUDPosition(w, h);
393}
394
395
396void
397GUIOSGView::updateHUDPosition(int w, int h) {
398 // keep the HUD text in the left top corner
399 myHUD->setProjectionMatrixAsOrtho2D(0, w, 0, h);
400 myText->setPosition(osg::Vec3d(0., static_cast<double>(height), 0.));
401 // keep the full screen hint in the bottom right corner
402 myFullScreenText->setPosition(osg::Vec3d(static_cast<double>(w) - 12., 12., 0.));
403}
404
405
406void
407GUIOSGView::updateHUDText(const std::string text) {
408 myText->setText(text, osgText::String::ENCODING_UTF8);
409}
410
411
412void
413GUIOSGView::recenterView() {
414 stopTrack();
415 Position center = myGrid->getCenter();
416 double radius = std::max(myGrid->xmax() - myGrid->xmin(), myGrid->ymax() - myGrid->ymin());
417 myChanger->centerTo(center, radius);
418}
419
420
421bool
422GUIOSGView::setColorScheme(const std::string& name) {
423 if (!gSchemeStorage.contains(name)) {
424 return false;
425 }
426 if (myGUIDialogViewSettings != 0) {
427 if (myGUIDialogViewSettings->getCurrentScheme() != name) {
428 myGUIDialogViewSettings->setCurrentScheme(name);
429 }
430 }
431 myVisualizationSettings = &gSchemeStorage.get(name.c_str());
432 myVisualizationSettings->gaming = myApp->isGaming();
433 adoptViewSettings();
434 update();
435 return true;
436}
437
438
439long
440GUIOSGView::onPaint(FXObject*, FXSelector, void*) {
441 if (!isEnabled()) {
442 return 1;
443 }
444 myDecalsLockMutex.lock();
445 for (GUISUMOAbstractView::Decal& d : myDecals) {
446 if (!d.initialised && d.filename.length() > 0) {
447 if (d.filename.length() == 6 && d.filename.substr(0, 5) == "light") {
448 GUIOSGBuilder::buildLight(d, *myRoot);
449 } else if (d.filename.length() > 3 && d.filename.substr(0, 3) == "tl:") {
450 const int linkStringIdx = (int)d.filename.find(':', 3);
451 GUINet* net = (GUINet*) MSNet::getInstance();
452 try {
453 const std::string tlLogic = d.filename.substr(3, linkStringIdx - 3);
455 const int linkIdx = StringUtils::toInt(d.filename.substr(linkStringIdx + 1));
456 if (linkIdx < 0 || linkIdx >= static_cast<int>(vars.getActive()->getLinks().size())) {
457 throw NumberFormatException("");
458 }
459 const MSLink* const link = vars.getActive()->getLinksAt(linkIdx)[0];
460 osg::Group* tlNode = GUIOSGBuilder::getTrafficLight(d, vars, link, myGreenLight, myYellowLight, myRedLight, myRedYellowLight, myPoleBase, true, 0.5);
461 tlNode->setName("tlLogic:" + tlLogic);
462 myRoot->addChild(tlNode);
463 } catch (NumberFormatException&) {
464 WRITE_ERRORF(TL("Invalid link index in '%'."), d.filename);
465 } catch (InvalidArgument&) {
466 WRITE_ERRORF(TL("Unknown traffic light in '%'."), d.filename);
467 }
468 } else {
469 GUIOSGBuilder::buildDecal(d, *myRoot);
470 }
471 d.initialised = true;
472 }
473 }
474 myDecalsLockMutex.unlock();
475
476 // reset active flag
477 for (auto& item : myVehicles) {
478 item.second.active = false;
479 }
480
481 GUINet* net = static_cast<GUINet*>(MSNet::getInstance());
482 // build edges
483 for (const MSEdge* e : net->getEdgeControl().getEdges()) {
484 for (const MSLane* l : e->getLanes()) {
485 const MSLane::VehCont& vehicles = l->getVehiclesSecure();
486 for (MSVehicle* msVeh : vehicles) {
487 GUIVehicle* veh = static_cast<GUIVehicle*>(msVeh);
488 if (!(veh->isOnRoad() || veh->isParking() || veh->wasRemoteControlled())) {
489 continue;
490 }
491 auto itVeh = myVehicles.find(veh);
492 if (itVeh == myVehicles.end()) {
493 myVehicles[veh] = GUIOSGBuilder::buildMovable(veh->getVehicleType());
494 myRoot->addChild(myVehicles[veh].pos);
495 myVehicles[veh].pos->setName("vehicle:" + veh->getID());
496 veh->setNode(myVehicles[veh].pos);
497 } else {
498 itVeh->second.active = true;
499 }
500 osg::PositionAttitudeTransform* n = myVehicles[veh].pos;
501 n->setPosition(osg::Vec3d(veh->getPosition().x(), veh->getPosition().y(), veh->getPosition().z()));
502 const double dir = veh->getAngle() + M_PI / 2.;
503 const double slope = -veh->getSlope();
504 n->setAttitude(osg::Quat(osg::DegreesToRadians(slope), osg::Vec3(1, 0, 0),
505 0, osg::Vec3(0, 1, 0),
506 dir, osg::Vec3(0, 0, 1)));
507 /*
508 osg::ref_ptr<osg::AnimationPath> path = new osg::AnimationPath;
509 // path->setLoopMode( osg::AnimationPath::NO_LOOPING );
510 osg::AnimationPath::ControlPoint pointA(n->getPosition(), n->getAttitude());
511 osg::AnimationPath::ControlPoint pointB(osg::Vec3(veh->getPosition().x(), veh->getPosition().y(), veh->getPosition().z()),
512 osg::Quat(dir, osg::Vec3(0, 0, 1)) *
513 osg::Quat(osg::DegreesToRadians(slope), osg::Vec3(0, 1, 0)));
514 path->insert(0.0f, pointA);
515 path->insert(0.5f, pointB);
516 n->setUpdateCallback(new osg::AnimationPathCallback(path));
517 */
518
519 if (myVisualizationSettings->ignoreColorSchemeFor3DVehicles) {
520 myVehicles[veh].activateMaterial(false);
521 } else {
522 myVehicles[veh].activateMaterial(true);
523 RGBColor col;
524 if (!GUIBaseVehicle::setFunctionalColor(myVisualizationSettings->vehicleColorer.getActive(), veh, col)) {
525 col = myVisualizationSettings->vehicleColorer.getScheme().getColor(veh->getColorValue(*myVisualizationSettings, myVisualizationSettings->vehicleColorer.getActive()));
526 }
527 myVehicles[veh].mat->setDiffuse(osg::Material::FRONT_AND_BACK, osg::Vec4d(col.red() / 255., col.green() / 255., col.blue() / 255., col.alpha() / 255.));
528 }
531 myVehicles[veh].lights->setValue(2, veh->signalSet(MSVehicle::VEH_SIGNAL_BRAKELIGHT));
532 }
533 l->releaseVehicles();
534 }
535 }
536 // remove inactive
537 for (auto veh = myVehicles.begin(); veh != myVehicles.end();) {
538 if (!veh->second.active) {
539 removeVeh((veh++)->first);
540 } else {
541 ++veh;
542 }
543 }
544
546 if (now != myLastUpdate || (myGUIDialogViewSettings != 0 && myGUIDialogViewSettings->shown())) {
547 GUINet::getGUIInstance()->updateColor(*myVisualizationSettings);
548 }
549 if (now != myLastUpdate && myTracked != 0) {
550 osg::Vec3d lookFrom, lookAt, up;
551 lookAt[0] = myTracked->getPosition().x();
552 lookAt[1] = myTracked->getPosition().y();
553 lookAt[2] = myTracked->getPosition().z();
554 const double angle = myTracked->getAngle();
555 lookFrom[0] = lookAt[0] + 50. * cos(angle);
556 lookFrom[1] = lookAt[1] + 50. * sin(angle);
557 lookFrom[2] = lookAt[2] + 10.;
558 osg::Matrix m;
559 m.makeLookAt(lookFrom, lookAt, osg::Z_AXIS);
560 myViewer->getCameraManipulator()->setByInverseMatrix(m);
561 }
562
563 // reset active flag
564 for (auto& item : myPersons) {
565 item.second.active = false;
566 }
567
568 for (const MSEdge* e : net->getEdgeControl().getEdges()) {
569 const GUIEdge* ge = static_cast<const GUIEdge*>(e);
570 const std::set<MSTransportable*, ComparatorNumericalIdLess>& persons = ge->getPersonsSecure();
571 for (auto person : persons) {
572 if (person->hasArrived() || !person->hasDeparted()) {
573 //std::cout << SIMTIME << " person " << person->getID() << " is loaded but arrived\n";
574 continue;
575 }
576 auto itPers = myPersons.find(person);
577 if (itPers == myPersons.end()) {
578 myPersons[person] = GUIOSGBuilder::buildMovable(person->getVehicleType());
579 myRoot->addChild(myPersons[person].pos);
580 } else {
581 itPers->second.active = true;
582 }
583 osg::PositionAttitudeTransform* n = myPersons[person].pos;
584 const Position pos = person->getPosition();
585 n->setPosition(osg::Vec3d(pos.x(), pos.y(), pos.z()));
586 const double dir = person->getAngle() + M_PI / 2.;
587 n->setAttitude(osg::Quat(dir, osg::Vec3d(0, 0, 1)));
588
589 RGBColor col;
590 GUIPerson* actualPerson = dynamic_cast<GUIPerson*>(person);
591 if (!GUIPerson::setFunctionalColor(myVisualizationSettings->personColorer.getActive(), actualPerson, col)) {
592 col = myVisualizationSettings->personColorer.getScheme().getColor(actualPerson->getColorValue(*myVisualizationSettings, myVisualizationSettings->vehicleColorer.getActive()));
593 }
594 myPersons[person].mat->setDiffuse(osg::Material::FRONT_AND_BACK, osg::Vec4d(col.red() / 255., col.green() / 255., col.blue() / 255., col.alpha() / 255.));
595 }
596 ge->releasePersons();
597 }
598
599 // remove inactive
600 for (auto person = myPersons.begin(); person != myPersons.end();) {
601 if (!person->second.active) {
602 removeTransportable((person++)->first);
603 } else {
604 ++person;
605 }
606 }
607
608 if (myAdapter->makeCurrent()) {
609 myFullScreenTextNode->setNodeMask(myApp->isFullScreen() ? 0xFFFFFFFF : 0);
610 myViewer->frame();
611 makeNonCurrent();
612 }
613 myLastUpdate = now;
614 return 1;
615}
616
617
618void
619GUIOSGView::removeVeh(MSVehicle* veh) {
620 if (myTracked == veh) {
621 stopTrack();
622 }
623 std::map<MSVehicle*, OSGMovable>::iterator i = myVehicles.find(veh);
624 if (i != myVehicles.end()) {
625 myRoot->removeChild(i->second.pos);
626 myVehicles.erase(i);
627 }
628}
629
630
631void
632GUIOSGView::removeTransportable(MSTransportable* t) {
633 std::map<MSTransportable*, OSGMovable>::iterator i = myPersons.find(t);
634 if (i != myPersons.end()) {
635 myRoot->removeChild(i->second.pos);
636 myPersons.erase(i);
637 }
638}
639
640
641void GUIOSGView::updateViewportValues() {
642 osg::Vec3d lookFrom, lookAt, up;
643 myViewer->getCameraManipulator()->getInverseMatrix().getLookAt(lookFrom, lookAt, up);
644 myGUIDialogEditViewport->setValues(Position(lookFrom[0], lookFrom[1], lookFrom[2]),
645 Position(lookAt[0], lookAt[1], lookAt[2]), calculateRotation(lookFrom, lookAt, up));
646}
647
648
649void
650GUIOSGView::showViewportEditor() {
651 getViewportEditor(); // make sure it exists;
652 osg::Vec3d lookFrom, lookAt, up;
653 myViewer->getCameraManipulator()->getInverseMatrix().getLookAt(lookFrom, lookAt, up);
654 Position from(lookFrom[0], lookFrom[1], lookFrom[2]), at(lookAt[0], lookAt[1], lookAt[2]);
655 myGUIDialogEditViewport->setOldValues(from, at, calculateRotation(lookFrom, lookAt, up));
656 myGUIDialogEditViewport->setZoomValue(100);
657 myGUIDialogEditViewport->show();
658}
659
660
661void
662GUIOSGView::setViewportFromToRot(const Position& lookFrom, const Position& lookAt, double rotation) {
663 osg::Vec3d lookFromOSG, lookAtOSG, up;
664 lookFromOSG[0] = lookFrom.x();
665 lookFromOSG[1] = lookFrom.y();
666 lookFromOSG[2] = lookFrom.z();
667 lookAtOSG[0] = lookAt.x();
668 lookAtOSG[1] = lookAt.y();
669 lookAtOSG[2] = lookAt.z();
670
671 osg::Vec3d viewAxis, viewUp, orthogonal, normal;
672 viewAxis = lookFromOSG - lookAtOSG;
673 viewAxis.normalize();
674 viewUp = (viewAxis[0] + viewAxis[1] == 0.) ? osg::Vec3d(0., 1., 0.) : osg::Vec3d(0., 0., 1.); // check for parallel vectors
675 orthogonal = viewUp ^ viewAxis;
676 orthogonal.normalize();
677 normal = viewAxis ^ orthogonal;
678
679 rotation = std::fmod(rotation, 360.);
680 if (rotation < 0) {
681 rotation += 360.;
682 }
683 myChanger->setRotation(rotation);
684 double angle = DEG2RAD(rotation);
685 up = normal * cos(angle) - orthogonal * sin(angle);
686 up.normalize();
687
688 double zoom = (myGUIDialogEditViewport != nullptr) ? myGUIDialogEditViewport->getZoomValue() : 100.;
689 lookFromOSG = lookFromOSG + viewAxis * (100. - zoom);
690 lookAtOSG = lookFromOSG - viewAxis;
691 myViewer->getCameraManipulator()->setHomePosition(lookFromOSG, lookAtOSG, up);
692 myViewer->home();
693}
694
695
696void
697GUIOSGView::copyViewportTo(GUISUMOAbstractView* view) {
698 osg::Vec3d lookFrom, lookAt, up;
699 myViewer->getCameraManipulator()->getHomePosition(lookFrom, lookAt, up);
700 view->setViewportFromToRot(Position(lookFrom[0], lookFrom[1], lookFrom[2]),
701 Position(lookAt[0], lookAt[1], lookAt[2]), 0);
702}
703
704
705void
706GUIOSGView::startTrack(int id) {
707 if (myTracked == 0 || (int)myTracked->getGlID() != id) {
708 myTracked = 0;
710 for (; it != MSNet::getInstance()->getVehicleControl().loadedVehEnd(); it++) {
711 GUIVehicle* veh = (GUIVehicle*)(*it).second;
712 if ((int)veh->getGlID() == id) {
713 if (!veh->isOnRoad() || myVehicles.find(veh) == myVehicles.end()) {
714 return;
715 }
716 myTracked = veh;
717 break;
718 }
719 }
720 if (myTracked != 0) {
721 osg::Vec3d lookFrom, lookAt, up;
722 lookAt[0] = myTracked->getPosition().x();
723 lookAt[1] = myTracked->getPosition().y();
724 lookAt[2] = myTracked->getPosition().z();
725 lookFrom[0] = lookAt[0] + 50.;
726 lookFrom[1] = lookAt[1] + 50.;
727 lookFrom[2] = lookAt[2] + 10.;
728 osg::Matrix m;
729 m.makeLookAt(lookFrom, lookAt, osg::Z_AXIS);
730 myViewer->getCameraManipulator()->setByInverseMatrix(m);
731 }
732 }
733}
734
735
736void
737GUIOSGView::stopTrack() {
738 myTracked = 0;
739}
740
741
743GUIOSGView::getTrackedID() const {
744 return myTracked == 0 ? GUIGlObject::INVALID_ID : myTracked->getGlID();
745}
746
747
748void
749GUIOSGView::onGamingClick(Position pos) {
751 const MSTrafficLightLogic* minTll = nullptr;
752 double minDist = std::numeric_limits<double>::infinity();
753 for (const MSTrafficLightLogic* const tll : tlsControl.getAllLogics()) {
754 if (tlsControl.isActive(tll)) {
755 // get the links
756 const MSTrafficLightLogic::LaneVector& lanes = tll->getLanesAt(0);
757 if (lanes.size() > 0) {
758 const Position& endPos = lanes[0]->getShape().back();
759 if (endPos.distanceTo(pos) < minDist) {
760 minDist = endPos.distanceTo(pos);
761 minTll = tll;
762 }
763 }
764 }
765 }
766 if (minTll != 0) {
767 const MSTLLogicControl::TLSLogicVariants& vars = tlsControl.get(minTll->getID());
768 const std::vector<MSTrafficLightLogic*> logics = vars.getAllLogics();
769 if (logics.size() > 1) {
771 for (int i = 0; i < (int)logics.size() - 1; i++) {
772 if (minTll->getProgramID() == logics[i]->getProgramID()) {
773 l = (MSSimpleTrafficLightLogic*) logics[i + 1];
774 tlsControl.switchTo(minTll->getID(), l->getProgramID());
775 }
776 }
777 if (l == logics[0]) {
778 tlsControl.switchTo(minTll->getID(), l->getProgramID());
779 }
781 update();
782 }
783 }
784}
785
786
788GUIOSGView::getCurrentTimeStep() const {
790}
791
792
793long GUIOSGView::onConfigure(FXObject* sender, FXSelector sel, void* ptr) {
794 // update the window dimensions, in case the window has been resized.
795 const int w = getWidth();
796 const int h = getHeight();
797 if (w > 0 && h > 0) {
798 myAdapter->getEventQueue()->windowResize(0, 0, w, h);
799 myAdapter->resized(0, 0, w, h);
800 updateHUDPosition(w, h);
801 }
802 return FXGLCanvas::onConfigure(sender, sel, ptr);
803}
804
805
806long GUIOSGView::onKeyPress(FXObject* sender, FXSelector sel, void* ptr) {
807 int key = ((FXEvent*)ptr)->code;
808 myAdapter->getEventQueue()->keyPress(key);
809 // leave key handling for some cases to OSG
810 if (key == FX::KEY_f || key == FX::KEY_Left || key == FX::KEY_Right || key == FX::KEY_Up || key == FX::KEY_Down) {
811 return 1;
812 }
813 return FXGLCanvas::onKeyPress(sender, sel, ptr);
814}
815
816
817long GUIOSGView::onKeyRelease(FXObject* sender, FXSelector sel, void* ptr) {
818 int key = ((FXEvent*)ptr)->code;
819 myAdapter->getEventQueue()->keyRelease(key);
820 // leave key handling for some cases to OSG
821 if (key == FX::KEY_f || key == FX::KEY_Left || key == FX::KEY_Right || key == FX::KEY_Up || key == FX::KEY_Down) {
822 return 1;
823 }
824 return FXGLCanvas::onKeyRelease(sender, sel, ptr);
825}
826
827
828long GUIOSGView::onLeftBtnPress(FXObject* sender, FXSelector sel, void* ptr) {
829 handle(this, FXSEL(SEL_FOCUS_SELF, 0), ptr);
830
831 FXEvent* event = (FXEvent*)ptr;
832 myAdapter->getEventQueue()->mouseButtonPress((float)event->click_x, (float)event->click_y, 1);
833 if (myApp->isGaming()) {
834 onGamingClick(getPositionInformation());
835 }
836
837 return FXGLCanvas::onLeftBtnPress(sender, sel, ptr);
838}
839
840
841long GUIOSGView::onLeftBtnRelease(FXObject* sender, FXSelector sel, void* ptr) {
842 FXEvent* event = (FXEvent*)ptr;
843 myAdapter->getEventQueue()->mouseButtonRelease((float)event->click_x, (float)event->click_y, 1);
844 myChanger->onLeftBtnRelease(ptr);
845 return FXGLCanvas::onLeftBtnRelease(sender, sel, ptr);
846}
847
848
849long GUIOSGView::onMiddleBtnPress(FXObject* sender, FXSelector sel, void* ptr) {
850 handle(this, FXSEL(SEL_FOCUS_SELF, 0), ptr);
851
852 FXEvent* event = (FXEvent*)ptr;
853 myAdapter->getEventQueue()->mouseButtonPress((float)event->click_x, (float)event->click_y, 2);
854
855 return FXGLCanvas::onMiddleBtnPress(sender, sel, ptr);
856}
857
858
859long GUIOSGView::onMiddleBtnRelease(FXObject* sender, FXSelector sel, void* ptr) {
860 FXEvent* event = (FXEvent*)ptr;
861 myAdapter->getEventQueue()->mouseButtonRelease((float)event->click_x, (float)event->click_y, 2);
862 myChanger->onMiddleBtnRelease(ptr);
863 return FXGLCanvas::onMiddleBtnRelease(sender, sel, ptr);
864}
865
866
867long GUIOSGView::onRightBtnPress(FXObject* sender, FXSelector sel, void* ptr) {
868 handle(this, FXSEL(SEL_FOCUS_SELF, 0), ptr);
869
870 FXEvent* event = (FXEvent*)ptr;
871 myAdapter->getEventQueue()->mouseButtonPress((float)event->click_x, (float)event->click_y, 3);
872
873 return FXGLCanvas::onRightBtnPress(sender, sel, ptr);
874}
875
876
877long GUIOSGView::onRightBtnRelease(FXObject* sender, FXSelector sel, void* ptr) {
878 FXEvent* event = (FXEvent*)ptr;
879 myAdapter->getEventQueue()->mouseButtonRelease((float)event->click_x, (float)event->click_y, 3);
880 myChanger->onRightBtnRelease(ptr);
881 return FXGLCanvas::onRightBtnRelease(sender, sel, ptr);
882}
883
884
885long
886GUIOSGView::onMouseMove(FXObject* sender, FXSelector sel, void* ptr) {
887 // if popup exist but isn't shown, destroy it first
888 if (myPopup && !myPopup->shown()) {
889 destroyPopup();
890 }
891
892 FXEvent* event = (FXEvent*)ptr;
893 osgGA::GUIEventAdapter* ea = myAdapter->getEventQueue()->mouseMotion((float)event->win_x, (float)event->win_y);
894 setWindowCursorPosition(ea->getXnormalized(), ea->getYnormalized());
895 if (myGUIDialogEditViewport != nullptr && myGUIDialogEditViewport->shown()) {
896 updateViewportValues();
897 }
898 updatePositionInformation();
899 return FXGLCanvas::onMotion(sender, sel, ptr);
900}
901
902
903long
904GUIOSGView::onIdle(FXObject* /* sender */, FXSelector /* sel */, void*) {
905 forceRefresh();
906 update();
907 getApp()->addChore(this, MID_CHORE);
908 return 1;
909}
910
911
912long
913GUIOSGView::onCmdCloseLane(FXObject*, FXSelector, void*) {
914 GUILane* lane = getLaneUnderCursor();
915 if (lane != nullptr) {
916 lane->closeTraffic();
918 GUINet::getGUIInstance()->updateColor(*myVisualizationSettings);
919 update();
920 }
921 return 1;
922}
923
924
925long
926GUIOSGView::onCmdCloseEdge(FXObject*, FXSelector, void*) {
927 GUILane* lane = getLaneUnderCursor();
928 if (lane != nullptr) {
929 dynamic_cast<GUIEdge*>(&lane->getEdge())->closeTraffic(lane);
931 GUINet::getGUIInstance()->updateColor(*myVisualizationSettings);
932 update();
933 }
934 return 1;
935}
936
937
938long
939GUIOSGView::onCmdAddRerouter(FXObject*, FXSelector, void*) {
940 GUILane* lane = getLaneUnderCursor();
941 if (lane != nullptr) {
942 dynamic_cast<GUIEdge*>(&lane->getEdge())->addRerouter();
944 update();
945 }
946 return 1;
947}
948
949
950long
951GUIOSGView::onCmdShowReachability(FXObject* menu, FXSelector selector, void*) {
952 GUILane* lane = getLaneUnderCursor();
953 if (lane != nullptr) {
954 // reset
955 GUIViewTraffic::showLaneReachability(lane, menu, selector);
956 // switch to 'color by selection' unless coloring 'by reachability'
957 if (myVisualizationSettings->laneColorer.getActive() != 36) {
958 myVisualizationSettings->laneColorer.setActive(1);
959 GUINet::getGUIInstance()->updateColor(*myVisualizationSettings);
960 }
961 update();
962 }
963 return 1;
964}
965
966
967long
968GUIOSGView::onVisualizationChange(FXObject*, FXSelector, void*) {
969 adoptViewSettings();
970 return 1;
971}
972
973
974void
975GUIOSGView::setWindowCursorPosition(float x, float y) {
976 myOSGNormalizedCursorX = x;
977 myOSGNormalizedCursorY = y;
978}
979
980
981double
982GUIOSGView::calculateRotation(const osg::Vec3d& lookFrom, const osg::Vec3d& lookAt, const osg::Vec3d& up) {
983 osg::Vec3d viewAxis, viewUp, orthogonal, normal;
984 viewAxis = lookFrom - lookAt;
985 viewAxis.normalize();
986 viewUp = (abs(viewAxis[0]) + abs(viewAxis[1]) == 0.) ? osg::Y_AXIS : osg::Z_AXIS; // check for parallel vectors
987 orthogonal = viewUp ^ viewAxis;
988 orthogonal.normalize();
989 normal = viewAxis ^ orthogonal;
990 double angle = atan2((normal ^ up).length() / (normal.length() * up.length()), (normal * up) / (normal.length() * up.length()));
991 if (angle < 0) {
992 angle += M_PI;
993 }
994 return RAD2DEG(angle);
995}
996
997
998void
999GUIOSGView::updatePositionInformation() const {
1000 Position pos;
1001 if (getPositionAtCursor(myOSGNormalizedCursorX, myOSGNormalizedCursorY, pos)) {
1002 if (!myApp->getCartesianLabel()->hasFocus()) {
1003 myApp->getCartesianLabel()->setText(("x:" + toString(pos.x()) + ", y:" + toString(pos.y())).c_str());
1004 }
1005 // set geo position
1006 if (!myApp->getGeoLabel()->hasFocus()) {
1008 if (GeoConvHelper::getFinal().usingGeoProjection()) {
1009 if (!myApp->getGeoLabel()->isEnabled()) {
1010 myApp->getGeoLabel()->enable();
1011 myApp->getGeoLabel()->setEditable(true);
1012 }
1013 myApp->getGeoLabel()->setText(("lat:" + toString(pos.y(), gPrecisionGeo) + ", lon:" + toString(pos.x(), gPrecisionGeo)).c_str());
1014 } else {
1015 myApp->getGeoLabel()->setText(TL("(No projection defined)"));
1016 if (myApp->getGeoLabel()->isEnabled()) {
1017 myApp->getGeoLabel()->disable();
1018 myApp->getGeoLabel()->setEditable(false);
1019 }
1020 }
1021 }
1022 } else {
1023 // set placeholder
1024 if (!myApp->getCartesianLabel()->hasFocus()) {
1025 myApp->getCartesianLabel()->setText(TL("N/A"));
1026 }
1027 if (!myApp->getGeoLabel()->hasFocus()) {
1028 if (GeoConvHelper::getFinal().usingGeoProjection()) {
1029 myApp->getGeoLabel()->setText(TL("N/A"));
1030 } else {
1031 myApp->getGeoLabel()->setText(TL("(No projection defined)"));
1032 if (myApp->getGeoLabel()->isEnabled()) {
1033 myApp->getGeoLabel()->disable();
1034 myApp->getGeoLabel()->setEditable(false);
1035 }
1036 }
1037 }
1038 }
1039}
1040
1041
1042bool
1043GUIOSGView::getPositionAtCursor(float xNorm, float yNorm, Position& pos) const {
1044 // only reasonable if view axis points to the ground (not parallel to the ground or in the sky)
1045 osg::Vec3d lookFrom, lookAt, up, viewAxis;
1046 myViewer->getCameraManipulator()->getInverseMatrix().getLookAt(lookFrom, lookAt, up);
1047 if ((lookAt - lookFrom).z() >= 0.) {
1048 // looking to the sky makes position at ground pointless
1049 return false;
1050 }
1051 // solve linear equation of ray crossing the ground plane
1052 osg::Matrixd iVP = osg::Matrixd::inverse(myViewer->getCamera()->getViewMatrix() * myViewer->getCamera()->getProjectionMatrix());
1053 osg::Vec3 nearPoint = osg::Vec3(xNorm, yNorm, 0.0f) * iVP;
1054 osg::Vec3 farPoint = osg::Vec3(xNorm, yNorm, 1.0f) * iVP;
1055 osg::Vec3 ray = farPoint - nearPoint;
1056 osg::Vec3 groundPos = nearPoint - ray * nearPoint.z() / ray.z();
1057 pos.setx(groundPos.x());
1058 pos.sety(groundPos.y());
1059 pos.setz(0.);
1060 return true;
1061}
1062
1063
1064std::vector<GUIGlObject*>
1065GUIOSGView::getGUIGlObjectsUnderCursor() {
1066 std::vector<GUIGlObject*> result;
1067 osgUtil::LineSegmentIntersector::Intersections intersections;
1068 if (myViewer->computeIntersections(myViewer->getCamera(), osgUtil::Intersector::CoordinateFrame::PROJECTION, myOSGNormalizedCursorX, myOSGNormalizedCursorY, intersections)) {
1069 for (auto intersection : intersections) {
1070 if (!intersection.nodePath.empty()) {
1071 // the object is identified by the ID stored in OSG
1072 for (osg::Node* currentNode : intersection.nodePath) {
1073 if (currentNode->getName().length() > 0 && currentNode->getName().find(":") != std::string::npos) {
1074 const std::string objID = currentNode->getName();
1076 // check that GUIGlObject exist
1077 if (o == nullptr) {
1078 continue;
1079 }
1080 // check that GUIGlObject isn't the network
1081 if (o->getGlID() == 0) {
1082 continue;
1083 }
1084 result.push_back(o);
1085 // unblock object
1087 }
1088 }
1089 }
1090 }
1091 }
1092 return result;
1093}
1094
1095
1096GUILane*
1097GUIOSGView::getLaneUnderCursor() {
1098 std::vector<GUIGlObject*> objects = getGUIGlObjectsUnderCursor();
1099 if (objects.size() > 0) {
1100 return dynamic_cast<GUILane*>(objects[0]);
1101 }
1102 return nullptr;
1103}
1104
1105
1106void
1107GUIOSGView::zoom2Pos(Position& camera, Position& lookAt, double zoom) {
1108 osg::Vec3d lookFromOSG, lookAtOSG, viewAxis, up;
1109 myViewer->getCameraManipulator()->getInverseMatrix().getLookAt(lookFromOSG, lookAtOSG, up);
1110 lookFromOSG[0] = camera.x();
1111 lookFromOSG[1] = camera.y();
1112 lookFromOSG[2] = camera.z();
1113 lookAtOSG[0] = lookAt.x();
1114 lookAtOSG[1] = lookAt.y();
1115 lookAtOSG[2] = lookAt.z();
1116 viewAxis = lookAtOSG - lookFromOSG;
1117 viewAxis.normalize();
1118
1119 // compute new camera and lookAt pos
1120 osg::Vec3d cameraUpdate = lookFromOSG + viewAxis * (zoom - 100.);
1121 osg::Vec3d lookAtUpdate = cameraUpdate + viewAxis;
1122
1123 myViewer->getCameraManipulator()->setHomePosition(cameraUpdate, lookAtUpdate, up);
1124 myViewer->home();
1125}
1126
1127
1128osg::Vec4d
1129GUIOSGView::toOSGColorVector(RGBColor c, bool useAlpha) {
1130 return osg::Vec4d(c.red() / 255., c.green() / 255., c.blue() / 255., (useAlpha) ? c.alpha() / 255. : 1.);
1131}
1132
1133
1134GUIOSGView::FXOSGAdapter::FXOSGAdapter(GUISUMOAbstractView* parent, FXCursor* cursor)
1135 : myParent(parent), myOldCursor(cursor) {
1136 _traits = new GraphicsContext::Traits();
1137 _traits->x = 0;
1138 _traits->y = 0;
1139 _traits->width = parent->getWidth();
1140 _traits->height = parent->getHeight();
1141 _traits->windowDecoration = false;
1142 _traits->doubleBuffer = true;
1143 _traits->sharedContext = 0;
1144 if (valid()) {
1145 setState(new osg::State());
1146 getState()->setGraphicsContext(this);
1147#ifdef DEBUG_GLERRORS
1148 getState()->setCheckForGLErrors(osg::State::ONCE_PER_ATTRIBUTE);
1149 std::cout << "OSG getCheckForGLErrors " << getState()->getCheckForGLErrors() << std::endl;
1150#endif
1151 if (_traits.valid() && _traits->sharedContext != 0) {
1152 getState()->setContextID(_traits->sharedContext->getState()->getContextID());
1153 incrementContextIDUsageCount(getState()->getContextID());
1154 } else {
1155 getState()->setContextID(createNewContextID());
1156 }
1157 }
1158}
1159
1160
1161GUIOSGView::FXOSGAdapter::~FXOSGAdapter() {
1162 delete myOldCursor;
1163}
1164
1165
1166void
1167GUIOSGView::FXOSGAdapter::grabFocus() {
1168 // focus this window
1169 myParent->setFocus();
1170}
1171
1172
1173void
1174GUIOSGView::FXOSGAdapter::useCursor(bool cursorOn) {
1175 if (cursorOn) {
1176 myParent->setDefaultCursor(myOldCursor);
1177 } else {
1178 myParent->setDefaultCursor(NULL);
1179 }
1180}
1181
1182
1183bool
1184GUIOSGView::FXOSGAdapter::makeCurrentImplementation() {
1185 myParent->makeCurrent();
1186 return true;
1187}
1188
1189
1190bool
1191GUIOSGView::FXOSGAdapter::releaseContext() {
1192 myParent->makeNonCurrent();
1193 return true;
1194}
1195
1196
1197void
1198GUIOSGView::FXOSGAdapter::swapBuffersImplementation() {
1199 myParent->swapBuffers();
1200}
1201
1202
1203bool
1204GUIOSGView::PickHandler::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& /* aa */) {
1205 if (ea.getEventType() == osgGA::GUIEventAdapter::DRAG) {
1206 myDrag = true;
1207 } else if (ea.getEventType() == osgGA::GUIEventAdapter::RELEASE && ea.getButton() == osgGA::GUIEventAdapter::RIGHT_MOUSE_BUTTON) {
1208 if (!myDrag) {
1209 if (myParent->makeCurrent()) {
1210 std::vector<GUIGlObject*> objects = myParent->getGUIGlObjectsUnderCursor();
1211 if (objects.size() > 0) {
1212 myParent->openObjectDialog(objects);
1213 }
1214 myParent->makeNonCurrent();
1215 }
1216 }
1217 myDrag = false;
1218 }
1219 return false;
1220}
1221
1222
1223#endif
1224
1225/****************************************************************************/
long long int SUMOTime
Definition GUI.h:36
@ MID_CHORE
chore
Definition GUIAppEnum.h:419
@ MID_HOTKEY_SHIFT_O_LOCATEPOI
Locate poi - button.
Definition GUIAppEnum.h:182
@ MID_HOTKEY_SHIFT_A_LOCATEADDITIONAL
Locate additional structure - button.
Definition GUIAppEnum.h:172
@ MID_HOTKEY_SHIFT_C_LOCATECONTAINER
Locate container - button.
Definition GUIAppEnum.h:174
@ MID_HOTKEY_SHIFT_V_LOCATEVEHICLE
Locate vehicle - button.
Definition GUIAppEnum.h:192
@ MID_HOTKEY_SHIFT_L_LOCATEPOLY
Locate polygons - button.
Definition GUIAppEnum.h:180
@ MID_HOTKEY_SHIFT_E_LOCATEEDGE
Locate edge - button.
Definition GUIAppEnum.h:176
@ MID_HOTKEY_SHIFT_P_LOCATEPERSON
Locate person - button.
Definition GUIAppEnum.h:184
@ MID_HOTKEY_SHIFT_J_LOCATEJUNCTION
Locate junction - button.
Definition GUIAppEnum.h:178
@ MID_HOTKEY_SHIFT_T_LOCATETLS
Locate TLS - button.
Definition GUIAppEnum.h:190
GUICompleteSchemeStorage gSchemeStorage
#define GUIDesignButtonPopup
checkable button placed in popup (for example, locate buttons)
Definition GUIDesigns.h:130
FXDEFMAP(GUIDialog_AppSettings) GUIDialog_AppSettingsMap[]
unsigned int GUIGlID
Definition GUIGlObject.h:44
@ LOCATEVEHICLE
@ LOCATEPERSON
@ LOCATECONTAINER
@ LOCATEJUNCTION
#define DEG2RAD(x)
Definition GeomHelper.h:35
#define RAD2DEG(x)
Definition GeomHelper.h:36
std::ostream & operator<<(std::ostream &out, MSDevice_SSM::EncounterType type)
Nicer output for EncounterType enum.
#define WRITE_ERRORF(...)
Definition MsgHandler.h:296
#define WRITE_ERROR(msg)
Definition MsgHandler.h:295
#define TL(string)
Definition MsgHandler.h:304
@ 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.
int gPrecisionGeo
Definition StdDefs.cpp:29
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition ToString.h:57
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.
static FXButton * buildFXButton(FXComposite *p, const std::string &text, const std::string &tip, const std::string &help, FXIcon *ic, FXObject *tgt, FXSelector sel, FXuint opts=BUTTON_NORMAL, FXint x=0, FXint y=0, FXint w=0, FXint h=0, FXint pl=DEFAULT_PAD, FXint pr=DEFAULT_PAD, FXint pt=DEFAULT_PAD, FXint pb=DEFAULT_PAD)
build button
A road/street connecting two junctions (gui-version)
Definition GUIEdge.h:51
void releasePersons() const
Allows to use the container for microsimulation again.
Definition GUIEdge.h:174
const std::set< MSTransportable *, ComparatorNumericalIdLess > & getPersonsSecure() const
Returns this edge's persons set; locks it for microsimulation.
Definition GUIEdge.h:165
MFXComboBoxIcon * 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
Definition GUIGlObject.h:73
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)
Definition GUILane.h:60
void closeTraffic(bool rebuildAllowed=true)
close this lane for traffic
Definition GUILane.cpp:1606
A MSNet extended by some values for usage within the gui.
Definition GUINet.h:82
static GUINet * getGUIInstance()
Returns the pointer to the unique instance of GUINet (singleton).
Definition GUINet.cpp:581
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.
Definition GUIVehicle.h:52
double getAngle() const override
Return current angle.
Definition GUIVehicle.h:82
Position getPosition(const double offset=0) const override
Return current position (x/y, cartesian)
Definition GUIVehicle.h:72
double getColorValue(const GUIVisualizationSettings &s, int activeScheme) const override
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.
long setCurrentItem(const FXint index, FXbool notify=FALSE)
Set the current item (index is zero-based)
FXint getNumItems() const
Return the number of items in the list.
FXint appendIconItem(const FXString &text, FXIcon *icon=nullptr, FXColor bgColor=FXRGB(255, 255, 255), void *ptr=nullptr)
append icon item in the last position
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.
Definition MSEdge.h:78
Representation of a lane in the micro simulation.
Definition MSLane.h:84
std::vector< MSVehicle * > VehCont
Container for vehicles.
Definition MSLane.h:119
MSEdge & getEdge() const
Returns the lane's edge.
Definition MSLane.h:790
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
Definition MSNet.cpp:201
MSTLLogicControl & getTLSControl()
Returns the tls logics control.
Definition MSNet.h:475
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
Definition MSNet.h:334
MSVehicleControl & getVehicleControl()
Returns the vehicle control.
Definition MSNet.h:402
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.
Definition MSVehicle.h:77
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)
Definition MSVehicle.h:605
bool signalSet(int which) const
Returns whether the given signal is on.
Definition MSVehicle.h:1194
Position getPosition(const double offset=0) const
Return current position (x/y, cartesian)
@ VEH_SIGNAL_BLINKER_RIGHT
Right blinker lights are switched on.
Definition MSVehicle.h:1116
@ VEH_SIGNAL_BRAKELIGHT
The brake lights are on.
Definition MSVehicle.h:1122
@ VEH_SIGNAL_BLINKER_LEFT
Left blinker lights are switched on.
Definition MSVehicle.h:1118
@ VEH_SIGNAL_BLINKER_EMERGENCY
Blinker lights on both sides are switched on.
Definition MSVehicle.h:1120
double getSlope() const
Returns the slope of the road at vehicle's position in degrees.
const std::string & getID() const
Returns the id.
Definition Named.h:73
A point in 2D or 3D with translation and scaling methods.
Definition Position.h:37
void setx(double x)
set position x
Definition Position.h:67
double distanceTo(const Position &p2) const
returns the euclidean distance in 3 dimensions
Definition Position.h:263
double x() const
Returns the x-position.
Definition Position.h:52
void setz(double z)
set position z
Definition Position.h:77
double z() const
Returns the z-position.
Definition Position.h:62
void sety(double y)
set position y
Definition Position.h:72
double y() const
Returns the y-position.
Definition Position.h:57
unsigned char red() const
Returns the red-amount of the color.
Definition RGBColor.cpp:78
unsigned char alpha() const
Returns the alpha-amount of the color.
Definition RGBColor.cpp:96
unsigned char green() const
Returns the green-amount of the color.
Definition RGBColor.cpp:84
unsigned char blue() const
Returns the blue-amount of the color.
Definition RGBColor.cpp:90
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
#define M_PI
Definition odrSpiral.cpp:45
A decal (an image) that can be shown.