Eclipse SUMO - Simulation of Urban MObility
GUIOSGView.cpp
Go to the documentation of this file.
1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.org/sumo
3 // Copyright (C) 2001-2020 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 /****************************************************************************/
19 // An OSG-based 3D view on the simulation
20 /****************************************************************************/
21 #include <config.h>
22 
23 #ifdef HAVE_OSG
24 
25 #include <iostream>
26 #include <utility>
27 #include <cmath>
28 #include <limits>
29 // osg may include windows.h somewhere so we need to guard against macro pollution
30 #ifdef WIN32
31 #define NOMINMAX
32 #pragma warning(push)
33 #pragma warning(disable: 4127) // do not warn about constant conditional expression
34 #pragma warning(disable: 4275) // do not warn about the DLL interface for OSG
35 #endif
36 #include <osgViewer/Viewer>
37 #include <osgViewer/ViewerEventHandlers>
38 #include <osgGA/NodeTrackerManipulator>
39 #include <osgDB/ReadFile>
40 #include <osg/PositionAttitudeTransform>
41 #include <osg/Vec4>
42 #include <osg/ShapeDrawable>
43 #ifdef WIN32
44 #undef NOMINMAX
45 #pragma warning(pop)
46 #endif
60 #include <utils/gui/div/GLHelper.h>
61 #include <guisim/GUINet.h>
63 #include <guisim/GUIEdge.h>
64 #include <guisim/GUILane.h>
65 #include <guisim/GUIVehicle.h>
66 #include <microsim/MSEdge.h>
67 #include <microsim/MSEdgeControl.h>
68 #include <microsim/MSLane.h>
74 #include <utils/common/RGBColor.h>
78 #include <gui/GUISUMOViewParent.h>
80 #include "GUIOSGBuilder.h"
81 #include "GUIOSGView.h"
82 
83 
84 FXDEFMAP(GUIOSGView) GUIOSGView_Map[] = {
85  //________Message_Type_________ ___ID___ ________Message_Handler________
86  FXMAPFUNC(SEL_CHORE, MID_CHORE, GUIOSGView::OnIdle)
87 };
88 FXIMPLEMENT(GUIOSGView, GUISUMOAbstractView, GUIOSGView_Map, ARRAYNUMBER(GUIOSGView_Map))
89 
90 
91 std::ostream&
92 operator<<(std::ostream& os, const osg::Vec3d& v) {
93  return os << v.x() << "," << v.y() << "," << v.z();
94 }
95 
96 
97 // ===========================================================================
98 // GUIOSGView::Command_TLSChange member method definitions
99 // ===========================================================================
100 GUIOSGView::Command_TLSChange::Command_TLSChange(const MSLink* const link, osg::Switch* switchNode)
101  : myLink(link), mySwitch(switchNode), myLastState(LINKSTATE_TL_OFF_NOSIGNAL) {
102  execute();
103 }
104 
105 
106 GUIOSGView::Command_TLSChange::~Command_TLSChange() {}
107 
108 
109 void
110 GUIOSGView::Command_TLSChange::execute() {
111  switch (myLink->getState()) {
114  mySwitch->setSingleChildOn(0);
115  break;
118  mySwitch->setSingleChildOn(1);
119  break;
120  case LINKSTATE_TL_RED:
121  mySwitch->setSingleChildOn(2);
122  break;
124  mySwitch->setSingleChildOn(3);
125  break;
126  default:
127  mySwitch->setAllChildrenOff();
128  }
129  myLastState = myLink->getState();
130 }
131 
132 
133 
134 // ===========================================================================
135 // GUIOSGView member method definitions
136 // ===========================================================================
137 GUIOSGView::GUIOSGView(
138  FXComposite* p,
139  GUIMainWindow& app,
140  GUISUMOViewParent* parent,
141  GUINet& net, FXGLVisual* glVis,
142  FXGLCanvas* share) :
143  GUISUMOAbstractView(p, app, parent, net.getVisualisationSpeedUp(), glVis, share),
144  myTracked(0), myCameraManipulator(new SUMOTerrainManipulator()), myLastUpdate(-1) {
145 
146  //FXGLVisual* glVisual=new FXGLVisual(getApp(),VISUAL_DOUBLEBUFFER|VISUAL_STEREO);
147 
148  //m_gwFox = new GraphicsWindowFOX(this, glVisual, NULL, NULL, LAYOUT_FILL_X|LAYOUT_FILL_Y, x, y, w, h );
149 
150  int w = getWidth();
151  int h = getHeight();
152  myAdapter = new FXOSGAdapter(this, new FXCursor(parent->getApp(), CURSOR_CROSS));
153 
154  myViewer = new osgViewer::Viewer();
155  myViewer->getCamera()->setGraphicsContext(myAdapter);
156  myViewer->getCamera()->setViewport(0, 0, w, h);
157  myViewer->setThreadingModel(osgViewer::Viewer::SingleThreaded);
158 
159  const char* sumoPath = getenv("SUMO_HOME");
160  if (sumoPath != 0) {
161  std::string newPath = std::string(sumoPath) + "/data/3D";
162  if (FileHelpers::isReadable(newPath)) {
163  osgDB::FilePathList path = osgDB::Registry::instance()->getDataFilePathList();
164  path.push_back(newPath);
165  osgDB::Registry::instance()->setDataFilePathList(path);
166  }
167  }
168 
169  myGreenLight = osgDB::readNodeFile("tlg.obj");
170  myYellowLight = osgDB::readNodeFile("tly.obj");
171  myRedLight = osgDB::readNodeFile("tlr.obj");
172  myRedYellowLight = osgDB::readNodeFile("tlu.obj");
173  if (myGreenLight == 0 || myYellowLight == 0 || myRedLight == 0 || myRedYellowLight == 0) {
174  WRITE_ERROR("Could not load traffic light files.");
175  }
176  myRoot = GUIOSGBuilder::buildOSGScene(myGreenLight, myYellowLight, myRedLight, myRedYellowLight);
177  // add the stats handler
178  myViewer->addEventHandler(new osgViewer::StatsHandler());
179  myViewer->setSceneData(myRoot);
180  myViewer->setCameraManipulator(myCameraManipulator);
181  osg::Vec3d lookFrom, lookAt, up;
182  myCameraManipulator->getHomePosition(lookFrom, lookAt, up);
183  double z = lookFrom[2];
184  lookFrom[2] = -lookFrom.y();
185  lookFrom[1] = z;
186  myCameraManipulator->setHomePosition(lookFrom, lookAt, up);
187  myViewer->home();
188  getApp()->addChore(this, MID_CHORE);
189 }
190 
191 
192 GUIOSGView::~GUIOSGView() {
193  getApp()->removeChore(this, MID_CHORE);
194  myViewer->setDone(true);
195  myViewer = 0;
196  myRoot = 0;
197  myAdapter = 0;
198 }
199 
200 
201 void
202 GUIOSGView::buildViewToolBars(GUIGlChildWindow* v) {
203  // build coloring tools
204  {
205  const std::vector<std::string>& names = gSchemeStorage.getNames();
206  for (std::vector<std::string>::const_iterator i = names.begin(); i != names.end(); ++i) {
207  v->getColoringSchemesCombo()->appendItem(i->c_str());
208  if ((*i) == myVisualizationSettings->name) {
209  v->getColoringSchemesCombo()->setCurrentItem(v->getColoringSchemesCombo()->getNumItems() - 1);
210  }
211  }
212  v->getColoringSchemesCombo()->setNumVisible(5);
213  }
214  // for junctions
215  new FXButton(v->getLocatorPopup(),
216  "\tLocate Junction\tLocate a junction within the network.",
218  ICON_ABOVE_TEXT | FRAME_THICK | FRAME_RAISED);
219  // for edges
220  new FXButton(v->getLocatorPopup(),
221  "\tLocate Street\tLocate a street within the network.",
223  ICON_ABOVE_TEXT | FRAME_THICK | FRAME_RAISED);
224  // for vehicles
225  new FXButton(v->getLocatorPopup(),
226  "\tLocate Vehicle\tLocate a vehicle within the network.",
228  ICON_ABOVE_TEXT | FRAME_THICK | FRAME_RAISED);
229  // for persons
230  new FXButton(v->getLocatorPopup(),
231  "\tLocate Person\tLocate a person within the network.",
233  ICON_ABOVE_TEXT | FRAME_THICK | FRAME_RAISED);
234  // for containers
235  new FXButton(v->getLocatorPopup(),
236  "\tLocate Container\tLocate a container within the network.",
238  ICON_ABOVE_TEXT | FRAME_THICK | FRAME_RAISED);
239  // for tls
240  new FXButton(v->getLocatorPopup(),
241  "\tLocate TLS\tLocate a tls within the network.",
243  ICON_ABOVE_TEXT | FRAME_THICK | FRAME_RAISED);
244  // for additional stuff
245  new FXButton(v->getLocatorPopup(),
246  "\tLocate Additional\tLocate an additional structure within the network.",
248  ICON_ABOVE_TEXT | FRAME_THICK | FRAME_RAISED);
249  // for pois
250  new FXButton(v->getLocatorPopup(),
251  "\tLocate POI\tLocate a POI within the network.",
253  ICON_ABOVE_TEXT | FRAME_THICK | FRAME_RAISED);
254  // for polygons
255  new FXButton(v->getLocatorPopup(),
256  "\tLocate Polygon\tLocate a Polygon within the network.",
258  ICON_ABOVE_TEXT | FRAME_THICK | FRAME_RAISED);
259 }
260 
261 
262 void
263 GUIOSGView::recenterView() {
264  stopTrack();
265  Position center = myGrid->getCenter();
266  osg::Vec3d lookFromOSG, lookAtOSG, up;
267  myViewer->getCameraManipulator()->getHomePosition(lookFromOSG, lookAtOSG, up);
268  lookFromOSG[0] = center.x();
269  lookFromOSG[1] = center.y();
270  lookFromOSG[2] = myChanger->zoom2ZPos(100);
271  lookAtOSG[0] = center.x();
272  lookAtOSG[1] = center.y();
273  lookAtOSG[2] = 0;
274  myViewer->getCameraManipulator()->setHomePosition(lookFromOSG, lookAtOSG, up);
275  myViewer->home();
276 }
277 
278 
279 void
280 GUIOSGView::centerTo(GUIGlID id, bool /* applyZoom */, double /* zoomDist */) {
281  startTrack(id);
282 }
283 
284 
285 bool
286 GUIOSGView::setColorScheme(const std::string& name) {
287  if (!gSchemeStorage.contains(name)) {
288  return false;
289  }
290  if (myVisualizationChanger != 0) {
291  if (myVisualizationChanger->getCurrentScheme() != name) {
292  myVisualizationChanger->setCurrentScheme(name);
293  }
294  }
295  myVisualizationSettings = &gSchemeStorage.get(name.c_str());
296  myVisualizationSettings->gaming = myApp->isGaming();
297  update();
298  return true;
299 }
300 
301 
302 long
303 GUIOSGView::onPaint(FXObject*, FXSelector, void*) {
304  if (!isEnabled()) {
305  return 1;
306  }
307  myDecalsLock.lock();
308  for (GUISUMOAbstractView::Decal& d : myDecals) {
309  if (!d.initialised) {
310  if (d.filename.length() == 6 && d.filename.substr(0, 5) == "light") {
311  GUIOSGBuilder::buildLight(d, *myRoot);
312  } else if (d.filename.length() > 3 && d.filename.substr(0, 3) == "tl:") {
313  const int linkStringIdx = (int)d.filename.find(':', 3);
314  GUINet* net = (GUINet*) MSNet::getInstance();
315  try {
316  MSTLLogicControl::TLSLogicVariants& vars = net->getTLSControl().get(d.filename.substr(3, linkStringIdx - 3));
317  const int linkIdx = StringUtils::toInt(d.filename.substr(linkStringIdx + 1));
318  if (linkIdx < 0 || linkIdx >= static_cast<int>(vars.getActive()->getLinks().size())) {
319  throw NumberFormatException("");
320  }
321  const MSLink* const link = vars.getActive()->getLinksAt(linkIdx)[0];
322  osg::Switch* switchNode = new osg::Switch();
323  switchNode->addChild(GUIOSGBuilder::getTrafficLight(d, d.layer < 0 ? 0 : myGreenLight, osg::Vec4d(0., 1., 0., .3)), false);
324  switchNode->addChild(GUIOSGBuilder::getTrafficLight(d, d.layer < 0 ? 0 : myYellowLight, osg::Vec4d(1., 1., 0., .3)), false);
325  switchNode->addChild(GUIOSGBuilder::getTrafficLight(d, d.layer < 0 ? 0 : myRedLight, osg::Vec4d(1., 0., 0., .3)), false);
326  switchNode->addChild(GUIOSGBuilder::getTrafficLight(d, d.layer < 0 ? 0 : myRedYellowLight, osg::Vec4d(1., .5, 0., .3)), false);
327  myRoot->addChild(switchNode);
328  vars.addSwitchCommand(new Command_TLSChange(link, switchNode));
329  } catch (NumberFormatException&) {
330  WRITE_ERROR("Invalid link index in '" + d.filename + "'.");
331  } catch (InvalidArgument&) {
332  WRITE_ERROR("Unknown traffic light in '" + d.filename + "'.");
333  }
334  } else {
335  GUIOSGBuilder::buildDecal(d, *myRoot);
336  }
337  d.initialised = true;
338  }
339  }
340  myDecalsLock.unlock();
342  // reset active flag
343  for (auto& item : myVehicles) {
344  item.second.active = false;
345  }
346  for (; it != MSNet::getInstance()->getVehicleControl().loadedVehEnd(); it++) {
347  GUIVehicle* veh = static_cast<GUIVehicle*>(it->second);
348  if (!(veh->isOnRoad() || veh->isParking() || veh->wasRemoteControlled())) {
349  continue;
350  }
351  auto itVeh = myVehicles.find(veh);
352  if (itVeh == myVehicles.end()) {
353  myVehicles[veh] = GUIOSGBuilder::buildMovable(veh->getVehicleType());
354  myRoot->addChild(myVehicles[veh].pos);
355  } else {
356  itVeh->second.active = true;
357  }
358  osg::PositionAttitudeTransform* n = myVehicles[veh].pos;
359  n->setPosition(osg::Vec3d(veh->getPosition().x(), veh->getPosition().y(), veh->getPosition().z()));
360  const double dir = veh->getAngle() + M_PI / 2.;
361  const double slope = veh->getSlope();
362  n->setAttitude(osg::Quat(dir, osg::Vec3d(0, 0, 1)) *
363  osg::Quat(osg::DegreesToRadians(slope), osg::Vec3d(0, 1, 0)));
364  /*
365  osg::ref_ptr<osg::AnimationPath> path = new osg::AnimationPath;
366  // path->setLoopMode( osg::AnimationPath::NO_LOOPING );
367  osg::AnimationPath::ControlPoint pointA(n->getPosition(), n->getAttitude());
368  osg::AnimationPath::ControlPoint pointB(osg::Vec3(veh->getPosition().x(), veh->getPosition().y(), veh->getPosition().z()),
369  osg::Quat(dir, osg::Vec3(0, 0, 1)) *
370  osg::Quat(osg::DegreesToRadians(slope), osg::Vec3(0, 1, 0)));
371  path->insert(0.0f, pointA);
372  path->insert(0.5f, pointB);
373  n->setUpdateCallback(new osg::AnimationPathCallback(path));
374  */
375  const RGBColor& col = myVisualizationSettings->vehicleColorer.getScheme().getColor(veh->getColorValue(*myVisualizationSettings, myVisualizationSettings->vehicleColorer.getActive()));
376  myVehicles[veh].geom->setColor(osg::Vec4d(col.red() / 255., col.green() / 255., col.blue() / 255., col.alpha() / 255.));
378  myVehicles[veh].lights->setValue(1, veh->signalSet(MSVehicle::VEH_SIGNAL_BLINKER_LEFT | MSVehicle::VEH_SIGNAL_BLINKER_EMERGENCY));
379  myVehicles[veh].lights->setValue(2, veh->signalSet(MSVehicle::VEH_SIGNAL_BRAKELIGHT));
380  }
381  // remove inactive
382  for (auto veh = myVehicles.begin(); veh != myVehicles.end();) {
383  if (!veh->second.active) {
384  removeVeh((veh++)->first);
385  } else {
386  ++veh;
387  }
388  }
389 
391  if (now != myLastUpdate || (myVisualizationChanger != 0 && myVisualizationChanger->shown())) {
392  GUINet::getGUIInstance()->updateColor(*myVisualizationSettings);
393  }
394  if (now != myLastUpdate && myTracked != 0) {
395  osg::Vec3d lookFrom, lookAt, up;
396  lookAt[0] = myTracked->getPosition().x();
397  lookAt[1] = myTracked->getPosition().y();
398  lookAt[2] = myTracked->getPosition().z();
399  const double angle = myTracked->getAngle();
400  lookFrom[0] = lookAt[0] + 50. * cos(angle);
401  lookFrom[1] = lookAt[1] + 50. * sin(angle);
402  lookFrom[2] = lookAt[2] + 10.;
403  osg::Matrix m;
404  m.makeLookAt(lookFrom, lookAt, osg::Z_AXIS);
405  myCameraManipulator->setByInverseMatrix(m);
406  }
407 
408  // reset active flag
409  for (auto& item : myPersons) {
410  item.second.active = false;
411  }
412  for (auto transIt = MSNet::getInstance()->getPersonControl().loadedBegin(); transIt != MSNet::getInstance()->getPersonControl().loadedEnd(); ++transIt) {
413  MSTransportable* const person = transIt->second;
414  // XXX if not departed: continue
415  if (person->hasArrived() || !person->hasDeparted()) {
416  //std::cout << SIMTIME << " person " << person->getID() << " is loaded but arrived\n";
417  continue;
418  }
419  auto itPers = myPersons.find(person);
420  if (itPers == myPersons.end()) {
421  myPersons[person] = GUIOSGBuilder::buildMovable(person->getVehicleType());
422  myRoot->addChild(myPersons[person].pos);
423  } else {
424  itPers->second.active = true;
425  }
426  osg::PositionAttitudeTransform* n = myPersons[person].pos;
427  const Position pos = person->getPosition();
428  n->setPosition(osg::Vec3d(pos.x(), pos.y(), pos.z()));
429  const double dir = person->getAngle() + M_PI / 2.;
430  n->setAttitude(osg::Quat(dir, osg::Vec3d(0, 0, 1)));
431  }
432  // remove inactive
433  for (auto person = myPersons.begin(); person != myPersons.end();) {
434  if (!person->second.active) {
435  removeTransportable((person++)->first);
436  } else {
437  ++person;
438  }
439  }
440 
441 
442  if (myAdapter->makeCurrent()) {
443  myViewer->frame();
444  makeNonCurrent();
445  }
446  myLastUpdate = now;
447  return 1;
448 }
449 
450 
451 void
452 GUIOSGView::removeVeh(MSVehicle* veh) {
453  if (myTracked == veh) {
454  stopTrack();
455  }
456  std::map<MSVehicle*, OSGMovable>::iterator i = myVehicles.find(veh);
457  if (i != myVehicles.end()) {
458  myRoot->removeChild(i->second.pos);
459  myVehicles.erase(i);
460  }
461 }
462 
463 
464 void
465 GUIOSGView::removeTransportable(MSTransportable* t) {
466  std::map<MSTransportable*, OSGMovable>::iterator i = myPersons.find(t);
467  if (i != myPersons.end()) {
468  myRoot->removeChild(i->second.pos);
469  myPersons.erase(i);
470  }
471 }
472 
473 
474 void
475 GUIOSGView::showViewportEditor() {
476  getViewportEditor(); // make sure it exists;
477  osg::Vec3d lookFromOSG, lookAtOSG, up;
478  myViewer->getCameraManipulator()->getInverseMatrix().getLookAt(lookFromOSG, lookAtOSG, up);
479  Position from(lookFromOSG[0], lookFromOSG[1], lookFromOSG[2]), at(lookAtOSG[0], lookAtOSG[1], lookAtOSG[2]);
480  myViewportChooser->setOldValues(from, at, 0);
481  myViewportChooser->show();
482 }
483 
484 
485 void
486 GUIOSGView::setViewportFromToRot(const Position& lookFrom, const Position& lookAt, double /*rotation*/) {
487  osg::Vec3d lookFromOSG, lookAtOSG, up;
488  myViewer->getCameraManipulator()->getHomePosition(lookFromOSG, lookAtOSG, up);
489  lookFromOSG[0] = lookFrom.x();
490  lookFromOSG[1] = lookFrom.y();
491  lookFromOSG[2] = lookFrom.z();
492  lookAtOSG[0] = lookAt.x();
493  lookAtOSG[1] = lookAt.y();
494  lookAtOSG[2] = lookAt.z();
495  myViewer->getCameraManipulator()->setHomePosition(lookFromOSG, lookAtOSG, up);
496  myViewer->home();
497 }
498 
499 
500 
501 void
502 GUIOSGView::copyViewportTo(GUISUMOAbstractView* view) {
503  osg::Vec3d lookFrom, lookAt, up;
504  myCameraManipulator->getHomePosition(lookFrom, lookAt, up);
505  view->setViewportFromToRot(Position(lookFrom[0], lookFrom[1], lookFrom[2]),
506  Position(lookAt[0], lookAt[1], lookAt[2]), 0);
507 }
508 
509 
510 
511 void
512 GUIOSGView::startTrack(int id) {
513  if (myTracked == 0 || (int)myTracked->getGlID() != id) {
514  myTracked = 0;
516  for (; it != MSNet::getInstance()->getVehicleControl().loadedVehEnd(); it++) {
517  GUIVehicle* veh = (GUIVehicle*)(*it).second;
518  if ((int)veh->getGlID() == id) {
519  if (!veh->isOnRoad() || myVehicles.find(veh) == myVehicles.end()) {
520  return;
521  }
522  myTracked = veh;
523  break;
524  }
525  }
526  if (myTracked != 0) {
527  osg::Vec3d lookFrom, lookAt, up;
528  lookAt[0] = myTracked->getPosition().x();
529  lookAt[1] = myTracked->getPosition().y();
530  lookAt[2] = myTracked->getPosition().z();
531  lookFrom[0] = lookAt[0] + 50.;
532  lookFrom[1] = lookAt[1] + 50.;
533  lookFrom[2] = lookAt[2] + 10.;
534  osg::Matrix m;
535  m.makeLookAt(lookFrom, lookAt, osg::Z_AXIS);
536  myCameraManipulator->setByInverseMatrix(m);
537  }
538  }
539 }
540 
541 
542 void
543 GUIOSGView::stopTrack() {
544  myTracked = 0;
545 }
546 
547 
548 GUIGlID
549 GUIOSGView::getTrackedID() const {
550  return myTracked == 0 ? GUIGlObject::INVALID_ID : myTracked->getGlID();
551 }
552 
553 
554 void
555 GUIOSGView::onGamingClick(Position pos) {
557  const MSTrafficLightLogic* minTll = nullptr;
558  double minDist = std::numeric_limits<double>::infinity();
559  for (const MSTrafficLightLogic* const tll : tlsControl.getAllLogics()) {
560  if (tlsControl.isActive(tll)) {
561  // get the links
562  const MSTrafficLightLogic::LaneVector& lanes = tll->getLanesAt(0);
563  if (lanes.size() > 0) {
564  const Position& endPos = lanes[0]->getShape().back();
565  if (endPos.distanceTo(pos) < minDist) {
566  minDist = endPos.distanceTo(pos);
567  minTll = tll;
568  }
569  }
570  }
571  }
572  if (minTll != 0) {
573  const MSTLLogicControl::TLSLogicVariants& vars = tlsControl.get(minTll->getID());
574  const std::vector<MSTrafficLightLogic*> logics = vars.getAllLogics();
575  if (logics.size() > 1) {
577  for (int i = 0; i < (int)logics.size() - 1; i++) {
578  if (minTll->getProgramID() == logics[i]->getProgramID()) {
579  l = (MSSimpleTrafficLightLogic*) logics[i + 1];
580  tlsControl.switchTo(minTll->getID(), l->getProgramID());
581  }
582  }
583  if (l == logics[0]) {
584  tlsControl.switchTo(minTll->getID(), l->getProgramID());
585  }
587  update();
588  }
589  }
590 }
591 
592 
593 SUMOTime
594 GUIOSGView::getCurrentTimeStep() const {
596 }
597 
598 
599 long GUIOSGView::onConfigure(FXObject* sender, FXSelector sel, void* ptr) {
600  // update the window dimensions, in case the window has been resized.
601  myAdapter->getEventQueue()->windowResize(0, 0, getWidth(), getHeight());
602  myAdapter->resized(0, 0, getWidth(), getHeight());
603 
604  return FXGLCanvas::onConfigure(sender, sel, ptr);
605 }
606 
607 long GUIOSGView::onKeyPress(FXObject* sender, FXSelector sel, void* ptr) {
608  int key = ((FXEvent*)ptr)->code;
609  myAdapter->getEventQueue()->keyPress(key);
610 
611  return FXGLCanvas::onKeyPress(sender, sel, ptr);
612 }
613 
614 long GUIOSGView::onKeyRelease(FXObject* sender, FXSelector sel, void* ptr) {
615  int key = ((FXEvent*)ptr)->code;
616  myAdapter->getEventQueue()->keyRelease(key);
617 
618  return FXGLCanvas::onKeyRelease(sender, sel, ptr);
619 }
620 
621 long GUIOSGView::onLeftBtnPress(FXObject* sender, FXSelector sel, void* ptr) {
622  handle(this, FXSEL(SEL_FOCUS_SELF, 0), ptr);
623 
624  FXEvent* event = (FXEvent*)ptr;
625  myAdapter->getEventQueue()->mouseButtonPress((float)event->click_x, (float)event->click_y, 1);
626  if (myApp->isGaming()) {
627  onGamingClick(getPositionInformation());
628  }
629 
630  return FXGLCanvas::onLeftBtnPress(sender, sel, ptr);
631 }
632 
633 long GUIOSGView::onLeftBtnRelease(FXObject* sender, FXSelector sel, void* ptr) {
634  FXEvent* event = (FXEvent*)ptr;
635  myAdapter->getEventQueue()->mouseButtonRelease((float)event->click_x, (float)event->click_y, 1);
636 
637  return FXGLCanvas::onLeftBtnRelease(sender, sel, ptr);
638 }
639 
640 long GUIOSGView::onMiddleBtnPress(FXObject* sender, FXSelector sel, void* ptr) {
641  handle(this, FXSEL(SEL_FOCUS_SELF, 0), ptr);
642 
643  FXEvent* event = (FXEvent*)ptr;
644  myAdapter->getEventQueue()->mouseButtonPress((float)event->click_x, (float)event->click_y, 2);
645 
646  return FXGLCanvas::onMiddleBtnPress(sender, sel, ptr);
647 }
648 
649 long GUIOSGView::onMiddleBtnRelease(FXObject* sender, FXSelector sel, void* ptr) {
650  FXEvent* event = (FXEvent*)ptr;
651  myAdapter->getEventQueue()->mouseButtonRelease((float)event->click_x, (float)event->click_y, 2);
652 
653  return FXGLCanvas::onMiddleBtnRelease(sender, sel, ptr);
654 }
655 
656 long GUIOSGView::onRightBtnPress(FXObject* sender, FXSelector sel, void* ptr) {
657  handle(this, FXSEL(SEL_FOCUS_SELF, 0), ptr);
658 
659  FXEvent* event = (FXEvent*)ptr;
660  myAdapter->getEventQueue()->mouseButtonPress((float)event->click_x, (float)event->click_y, 3);
661 
662  return FXGLCanvas::onRightBtnPress(sender, sel, ptr);
663 }
664 
665 long GUIOSGView::onRightBtnRelease(FXObject* sender, FXSelector sel, void* ptr) {
666  FXEvent* event = (FXEvent*)ptr;
667  myAdapter->getEventQueue()->mouseButtonRelease((float)event->click_x, (float)event->click_y, 3);
668 
669  return FXGLCanvas::onRightBtnRelease(sender, sel, ptr);
670 }
671 
672 long
673 GUIOSGView::onMouseMove(FXObject* sender, FXSelector sel, void* ptr) {
674  FXEvent* event = (FXEvent*)ptr;
675  myAdapter->getEventQueue()->mouseMotion((float)event->win_x, (float)event->win_y);
676 
677  return FXGLCanvas::onMotion(sender, sel, ptr);
678 }
679 
680 long
681 GUIOSGView::OnIdle(FXObject* /* sender */, FXSelector /* sel */, void*) {
682  forceRefresh();
683  update();
684  getApp()->addChore(this, MID_CHORE);
685  return 1;
686 }
687 
688 
689 
690 GUIOSGView::FXOSGAdapter::FXOSGAdapter(GUISUMOAbstractView* parent, FXCursor* cursor)
691  : myParent(parent), myOldCursor(cursor) {
692  _traits = new GraphicsContext::Traits();
693  _traits->x = 0;
694  _traits->y = 0;
695  _traits->width = parent->getWidth();
696  _traits->height = parent->getHeight();
697  _traits->windowDecoration = false;
698  _traits->doubleBuffer = true;
699  _traits->sharedContext = 0;
700  if (valid()) {
701  setState(new osg::State());
702  getState()->setGraphicsContext(this);
703  if (_traits.valid() && _traits->sharedContext != 0) {
704  getState()->setContextID(_traits->sharedContext->getState()->getContextID());
705  incrementContextIDUsageCount(getState()->getContextID());
706  } else {
707  getState()->setContextID(createNewContextID());
708  }
709  }
710 }
711 
712 
713 GUIOSGView::FXOSGAdapter::~FXOSGAdapter() {
714  delete myOldCursor;
715 }
716 
717 
718 void GUIOSGView::FXOSGAdapter::grabFocus() {
719  // focus this window
720  myParent->setFocus();
721 }
722 
723 void GUIOSGView::FXOSGAdapter::useCursor(bool cursorOn) {
724  if (cursorOn) {
725  myParent->setDefaultCursor(myOldCursor);
726  } else {
727  myParent->setDefaultCursor(NULL);
728  }
729 }
730 
731 bool GUIOSGView::FXOSGAdapter::makeCurrentImplementation() {
732  myParent->makeCurrent();
733  return true;
734 }
735 
736 bool GUIOSGView::FXOSGAdapter::releaseContext() {
737  myParent->makeNonCurrent();
738  return true;
739 }
740 
741 void GUIOSGView::FXOSGAdapter::swapBuffersImplementation() {
742  myParent->swapBuffers();
743 }
744 
745 
746 #endif
747 
748 
749 /****************************************************************************/
@ MID_LOCATEPERSON
Locate person - button.
Definition: GUIAppEnum.h:349
@ MID_LOCATEJUNCTION
Locate junction - button.
Definition: GUIAppEnum.h:339
@ MID_CHORE
chore
Definition: GUIAppEnum.h:382
@ MID_LOCATEPOLY
Locate polygons - button.
Definition: GUIAppEnum.h:359
@ MID_LOCATEADD
Locate addtional structure - button.
Definition: GUIAppEnum.h:355
@ MID_LOCATEPOI
Locate poi - button.
Definition: GUIAppEnum.h:357
@ MID_LOCATEEDGE
Locate edge - button.
Definition: GUIAppEnum.h:341
@ MID_LOCATEVEHICLE
Locate vehicle - button.
Definition: GUIAppEnum.h:343
@ MID_LOCATETLS
Locate TLS - button.
Definition: GUIAppEnum.h:353
@ MID_LOCATECONTAINER
Locate container - button.
Definition: GUIAppEnum.h:351
GUICompleteSchemeStorage gSchemeStorage
FXDEFMAP(GUIDialog_AppSettings) GUIDialog_AppSettingsMap[]
unsigned int GUIGlID
Definition: GUIGlObject.h:40
@ LOCATEVEHICLE
@ LOCATEPERSON
@ LOCATECONTAINER
@ LOCATEJUNCTION
std::ostream & operator<<(std::ostream &out, MSDevice_SSM::EncounterType type)
Nicer output for EncounterType enum.
#define WRITE_ERROR(msg)
Definition: MsgHandler.h:284
long long int SUMOTime
Definition: SUMOTime.h:31
@ LINKSTATE_TL_REDYELLOW
The link has red light (must brake) but indicates upcoming green.
@ LINKSTATE_TL_YELLOW_MAJOR
The link has yellow light, may pass.
@ LINKSTATE_TL_GREEN_MAJOR
The link has green light, may pass.
@ 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.
static bool isReadable(std::string path)
Checks whether the given file is readable.
Definition: FileHelpers.cpp:48
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.
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
Definition: GUIGlObject.h:67
GUIGlID getGlID() const
Returns the numerical id of the object.
static FXIcon * getIcon(const GUIIcon which)
returns a icon previously defined in the enum GUIIcon
A MSNet extended by some values for usage within the gui.
Definition: GUINet.h:81
static GUINet * getGUIInstance()
Returns the pointer to the unique instance of GUINet (singleton).
Definition: GUINet.cpp:526
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:51
double getAngle() const
Return current angle.
Definition: GUIVehicle.h:79
Position getPosition(const double offset=0) const
Return current position (x/y, cartesian)
Definition: GUIVehicle.h:71
double getColorValue(const GUIVisualizationSettings &s, int activeScheme) const
gets the color value according to the current scheme index
Definition: GUIVehicle.cpp:526
bool gaming
whether the application is in gaming mode or not
bool isParking() const
Returns whether the vehicle is parking.
const MSVehicleType & getVehicleType() const
Returns the vehicle's type definition.
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
Definition: MSNet.cpp:171
MSTLLogicControl & getTLSControl()
Returns the tls logics control.
Definition: MSNet.h:444
MSVehicleControl & getVehicleControl()
Returns the vehicle control.
Definition: MSNet.h:371
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
Definition: MSNet.h:313
virtual MSTransportableControl & getPersonControl()
Returns the person control.
Definition: MSNet.cpp:986
SUMOTime duration
The duration of the phase.
A fixed traffic light logic.
const MSPhaseDefinition & getPhase(int givenstep) const
Returns the definition of the phase from the given position within the plan.
void changeStepAndDuration(MSTLLogicControl &tlcontrol, SUMOTime simStep, int step, SUMOTime stepDuration)
Changes the current phase and her duration.
Storage for all programs of a single tls.
void addSwitchCommand(OnSwitchAction *c)
std::vector< MSTrafficLightLogic * > getAllLogics() const
MSTrafficLightLogic * getActive() const
A class that stores and controls tls and switching of their programs.
std::vector< MSTrafficLightLogic * > getAllLogics() const
Returns a vector which contains all logics.
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 LinkVector & getLinksAt(int i) const
Returns the list of links that are controlled by the signals at the given position.
std::vector< MSLane * > LaneVector
Definition of the list of arrival lanes subjected to this tls.
const LinkVectorVector & getLinks() const
Returns the list of lists of all affected links.
const std::string & getProgramID() const
Returns this tl-logic's id.
constVehIt loadedEnd() const
Returns the end of the internal transportables map.
bool hasDeparted() const
return whether the transportable has started it's plan
virtual double getAngle() const
return the current angle of the transportable
const MSVehicleType & getVehicleType() const
Returns the object's "vehicle" type.
Position getPosition(const double) const
Return current position (x/y, cartesian)
bool hasArrived() const
return whether the person has reached the end of its plan
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.
Definition: MSVehicle.cpp:6118
bool isOnRoad() const
Returns the information whether the vehicle is on a road (is simulated)
Definition: MSVehicle.h:580
bool signalSet(int which) const
Returns whether the given signal is on.
Definition: MSVehicle.h:1159
@ VEH_SIGNAL_BLINKER_RIGHT
Right blinker lights are switched on.
Definition: MSVehicle.h:1081
@ VEH_SIGNAL_BRAKELIGHT
The brake lights are on.
Definition: MSVehicle.h:1087
@ VEH_SIGNAL_BLINKER_LEFT
Left blinker lights are switched on.
Definition: MSVehicle.h:1083
@ VEH_SIGNAL_BLINKER_EMERGENCY
Blinker lights on both sides are switched on.
Definition: MSVehicle.h:1085
double getSlope() const
Returns the slope of the road at vehicle's position in degrees.
Definition: MSVehicle.cpp:1111
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:36
double distanceTo(const Position &p2) const
returns the euclidean distance in 3 dimension
Definition: Position.h:231
double x() const
Returns the x-position.
Definition: Position.h:54
double z() const
Returns the z-position.
Definition: Position.h:64
double y() const
Returns the y-position.
Definition: Position.h:59
unsigned char red() const
Returns the red-amount of the color.
Definition: RGBColor.h:52
unsigned char alpha() const
Returns the alpha-amount of the color.
Definition: RGBColor.h:73
unsigned char green() const
Returns the green-amount of the color.
Definition: RGBColor.h:59
unsigned char blue() const
Returns the blue-amount of the color.
Definition: RGBColor.h:66
static int toInt(const std::string &sData)
converts a string into the integer value described by it by calling the char-type converter,...
#define M_PI
Definition: odrSpiral.cpp:40
A decal (an image) that can be shown.