77 FXDEFMAP(GUIOSGView) GUIOSGView_Map[] = {
79 FXMAPFUNC(SEL_CHORE,
MID_CHORE, GUIOSGView::onIdle),
85 operator<<(std::ostream& os,
const osg::Vec3d& v) {
86 return os << v.x() <<
"," << v.y() <<
"," << v.z();
93 GUIOSGView::Command_TLSChange::Command_TLSChange(
const MSLink*
const link, osg::Switch* switchNode)
99 GUIOSGView::Command_TLSChange::~Command_TLSChange() {}
103 GUIOSGView::Command_TLSChange::execute() {
104 switch (myLink->getState()) {
107 mySwitch->setSingleChildOn(0);
111 mySwitch->setSingleChildOn(1);
115 mySwitch->setSingleChildOn(2);
118 mySwitch->setSingleChildOn(3);
122 mySwitch->setSingleChildOn(3);
125 mySwitch->setAllChildrenOff();
127 myLastState = myLink->getState();
134 GUIOSGView::GUIOSGView(
138 GUINet& net, FXGLVisual* glVis,
141 myTracked(0), myCameraManipulator(new GUIOSGManipulator(this)), myLastUpdate(-1),
142 myOSGNormalizedCursorX(0.), myOSGNormalizedCursorY(0.) {
143 if (myChanger !=
nullptr) {
148 myAdapter =
new FXOSGAdapter(
this,
new FXCursor(parent->getApp(), CURSOR_CROSS));
149 myViewer =
new osgViewer::Viewer();
151 const char* sumoPath = getenv(
"SUMO_HOME");
153 std::string newPath = std::string(sumoPath) +
"/data/3D";
155 osgDB::FilePathList path = osgDB::Registry::instance()->getDataFilePathList();
156 path.push_back(newPath);
157 osgDB::Registry::instance()->setDataFilePathList(path);
161 myGreenLight = osgDB::readNodeFile(
"tlg.obj");
162 myYellowLight = osgDB::readNodeFile(
"tly.obj");
163 myRedLight = osgDB::readNodeFile(
"tlr.obj");
164 myRedYellowLight = osgDB::readNodeFile(
"tlu.obj");
165 myPoleBase = osgDB::readNodeFile(
"poleBase.obj");
166 if (myGreenLight == 0 || myYellowLight == 0 || myRedLight == 0 || myRedYellowLight == 0 || myPoleBase == 0) {
170 double left, right, bottom, top, zNear, zFar;
171 myViewer->getCamera()->getProjectionMatrixAsFrustum(left, right, bottom, top, zNear, zFar);
172 myRoot = GUIOSGBuilder::buildOSGScene(myGreenLight, myYellowLight, myRedLight, myRedYellowLight, myPoleBase);
173 myPlane =
new osg::MatrixTransform();
174 myPlane->setCullCallback(
new ExcludeFromNearFarComputationCallback());
175 myPlane->addChild(GUIOSGBuilder::buildPlane((
float)(zFar - zNear)));
176 myPlane->addUpdateCallback(
new PlaneMoverCallback(myViewer->getCamera()));
177 myRoot->addChild(myPlane);
179 osgViewer::StatsHandler* statsHandler =
new osgViewer::StatsHandler();
181 myViewer->addEventHandler(statsHandler);
182 myViewer->setSceneData(myRoot);
183 myViewer->setCameraManipulator(myCameraManipulator);
185 myViewer->setKeyEventSetsDone(0);
186 myViewer->getCamera()->setGraphicsContext(myAdapter);
187 myViewer->getCamera()->setViewport(0, 0, w, h);
188 myViewer->getCamera()->setNearFarRatio(0.005);
189 myViewer->setThreadingModel(osgViewer::Viewer::SingleThreaded);
190 myViewer->addEventHandler(
new PickHandler(
this));
191 osg::Vec3d lookFrom, lookAt, up;
192 myCameraManipulator->getHomePosition(lookFrom, lookAt, up);
193 lookFrom = lookAt + osg::Z_AXIS;
195 myCameraManipulator->setHomePosition(lookFrom, lookAt, up);
200 myTextNode =
new osg::Geode();
201 myText =
new osgText::Text;
202 myText->setCharacterSizeMode(osgText::Text::SCREEN_COORDS);
203 myText->setShaderTechnique(osgText::NO_TEXT_SHADER);
204 osgText::Font* font = osgText::readFontFile(
"arial.ttf");
205 if (font !=
nullptr) {
206 myText->setFont(font);
208 myText->setCharacterSize(16.f);
209 myTextNode->addDrawable(myText);
210 myText->setAlignment(osgText::TextBase::AlignmentType::LEFT_TOP);
211 myText->setDrawMode(osgText::TextBase::DrawModeMask::FILLEDBOUNDINGBOX | osgText::TextBase::DrawModeMask::TEXT);
212 myText->setBoundingBoxColor(osg::Vec4(0.0f, 0.0f, 0.2f, 0.5f));
213 myText->setBoundingBoxMargin(2.0f);
215 myHUD =
new osg::Camera;
216 myHUD->setProjectionMatrixAsOrtho2D(0, 800, 0, 800);
217 myHUD->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
218 myHUD->setViewMatrix(osg::Matrix::identity());
219 myHUD->setClearMask(GL_DEPTH_BUFFER_BIT);
220 myHUD->setRenderOrder(osg::Camera::POST_RENDER);
221 myHUD->setAllowEventFocus(
false);
222 myHUD->setGraphicsContext(myAdapter);
223 myHUD->addChild(myTextNode);
224 myHUD->setViewport(0, 0, w, h);
225 myViewer->addSlave(myHUD,
false);
226 myCameraManipulator->updateHUDText();
230 osgUtil::Optimizer optimizer;
231 optimizer.optimize(myRoot);
235 GUIOSGView::~GUIOSGView() {
237 myViewer->setDone(
true);
241 myCameraManipulator = 0;
248 myRedYellowLight = 0;
254 GUIOSGView::adoptViewSettings() {
256 osg::Light* globalLight = myViewer->getLight();
257 globalLight->setAmbient(toOSGColorVector(myVisualizationSettings->ambient3DLight));
258 globalLight->setDiffuse(toOSGColorVector(myVisualizationSettings->diffuse3DLight));
259 myViewer->getCamera()->setClearColor(toOSGColorVector(myVisualizationSettings->skyColor));
262 osg::Geode* planeGeode =
dynamic_cast<osg::Geode*
>(myPlane->getChild(0));
263 osg::Geometry* planeGeom =
dynamic_cast<osg::Geometry*
>(planeGeode->getChild(0));
264 osg::Vec4ubArray* colors =
dynamic_cast<osg::Vec4ubArray*
>(planeGeom->getColorArray());
265 (*colors)[0].set(myVisualizationSettings->backgroundColor.red(),
266 myVisualizationSettings->backgroundColor.green(),
267 myVisualizationSettings->backgroundColor.blue(),
268 myVisualizationSettings->backgroundColor.alpha());
269 planeGeom->setColorArray(colors);
272 unsigned int cullMask = 0xFFFFFFFF;
273 cullMask ^= (-int(myVisualizationSettings->show3DTLSDomes) ^ cullMask) & (1UL << NODESET_TLSDOMES);
274 cullMask ^= (-int(myVisualizationSettings->show3DTLSLinkMarkers) ^ cullMask) & (1UL << NODESET_TLSLINKMARKERS);
275 cullMask ^= (-int(myVisualizationSettings->generate3DTLSModels) ^ cullMask) & (1UL << NODESET_TLSMODELS);
276 myViewer->getCamera()->setCullMask(cullMask);
277 unsigned int hudCullMask = (myVisualizationSettings->show3DHeadUpDisplay) ? 0xFFFFFFFF : 0;
278 myHUD->setCullMask(hudCullMask);
283 GUIOSGView::getPositionInformation()
const {
285 getPositionAtCursor(myOSGNormalizedCursorX, myOSGNormalizedCursorY, pos);
291 GUIOSGView::is3DView()
const {
301 for (std::vector<std::string>::const_iterator i = names.begin(); i != names.end(); ++i) {
303 if ((*i) == myVisualizationSettings->name) {
310 "Locate Junction",
"Locate a junction within the network.",
"",
315 "Locate Street",
"Locate a street within the network.",
"",
320 "Locate Vehicle",
"Locate a vehicle within the network.",
"",
325 "Locate Person",
"Locate a person within the network.",
"",
330 "Locate Container",
"Locate a container within the network.",
"",
335 "Locate TLS",
"Locate a tls within the network.",
"",
340 "Locate Additional",
"Locate an additional structure within the network.",
"",
345 "Locate POI",
"Locate a POI within the network.",
"",
350 "Locate Polygon",
"Locate a Polygon within the network.",
"",
357 GUIOSGView::resize(
int w,
int h) {
358 GUISUMOAbstractView::resize(w, h);
359 updateHUDPosition(w, h);
364 GUIOSGView::position(
int x,
int y,
int w,
int h) {
365 GUISUMOAbstractView::position(x, y, w, h);
366 updateHUDPosition(w, h);
371 GUIOSGView::updateHUDPosition(
int w,
int h) {
373 myHUD->setProjectionMatrixAsOrtho2D(0, w, 0, h);
374 myText->setPosition(osg::Vec3d(0.,
static_cast<double>(height), 0.));
379 GUIOSGView::updateHUDText(
const std::string text) {
380 myText->setText(text, osgText::String::ENCODING_UTF8);
385 GUIOSGView::recenterView() {
387 Position center = myGrid->getCenter();
388 double radius = std::max(myGrid->xmax() - myGrid->xmin(), myGrid->ymax() - myGrid->ymin());
389 myChanger->centerTo(center, radius);
394 GUIOSGView::setColorScheme(
const std::string& name) {
398 if (myGUIDialogViewSettings != 0) {
399 if (myGUIDialogViewSettings->getCurrentScheme() != name) {
400 myGUIDialogViewSettings->setCurrentScheme(name);
404 myVisualizationSettings->
gaming = myApp->isGaming();
412 GUIOSGView::onPaint(FXObject*, FXSelector,
void*) {
416 myDecalsLockMutex.lock();
418 if (!d.initialised && d.filename.length() > 0) {
419 if (d.filename.length() == 6 && d.filename.substr(0, 5) ==
"light") {
420 GUIOSGBuilder::buildLight(d, *myRoot);
421 }
else if (d.filename.length() > 3 && d.filename.substr(0, 3) ==
"tl:") {
422 const int linkStringIdx = (int)d.filename.find(
':', 3);
425 const std::string tlLogic = d.filename.substr(3, linkStringIdx - 3);
428 if (linkIdx < 0 || linkIdx >=
static_cast<int>(vars.
getActive()->
getLinks().size())) {
432 osg::Group* tlNode = GUIOSGBuilder::getTrafficLight(d, vars, link, myGreenLight, myYellowLight, myRedLight, myRedYellowLight, myPoleBase,
true, 0.5);
433 tlNode->setName(
"tlLogic:" + tlLogic);
434 myRoot->addChild(tlNode);
441 GUIOSGBuilder::buildDecal(d, *myRoot);
443 d.initialised =
true;
446 myDecalsLockMutex.unlock();
449 for (
auto& item : myVehicles) {
450 item.second.active =
false;
456 for (
const MSLane* l : e->getLanes()) {
463 auto itVeh = myVehicles.find(veh);
464 if (itVeh == myVehicles.end()) {
465 myVehicles[veh] = GUIOSGBuilder::buildMovable(veh->
getVehicleType());
466 myRoot->addChild(myVehicles[veh].pos);
467 myVehicles[veh].pos->setName(
"vehicle:" + veh->
getID());
468 veh->setNode(myVehicles[veh].pos);
470 itVeh->second.active =
true;
472 osg::PositionAttitudeTransform* n = myVehicles[veh].pos;
475 const double slope = -veh->
getSlope();
476 n->setAttitude(osg::Quat(osg::DegreesToRadians(slope), osg::Vec3(1, 0, 0),
477 0, osg::Vec3(0, 1, 0),
478 dir, osg::Vec3(0, 0, 1)));
493 col = myVisualizationSettings->vehicleColorer.getScheme().getColor(veh->
getColorValue(*myVisualizationSettings, myVisualizationSettings->vehicleColorer.getActive()));
495 myVehicles[veh].mat->setDiffuse(osg::Material::FRONT_AND_BACK, osg::Vec4d(col.
red() / 255., col.
green() / 255., col.
blue() / 255., col.
alpha() / 255.));
500 l->releaseVehicles();
504 for (
auto veh = myVehicles.begin(); veh != myVehicles.end();) {
505 if (!veh->second.active) {
506 removeVeh((veh++)->first);
513 if (now != myLastUpdate || (myGUIDialogViewSettings != 0 && myGUIDialogViewSettings->shown())) {
516 if (now != myLastUpdate && myTracked != 0) {
517 osg::Vec3d lookFrom, lookAt, up;
518 lookAt[0] = myTracked->getPosition().x();
519 lookAt[1] = myTracked->getPosition().y();
520 lookAt[2] = myTracked->getPosition().z();
521 const double angle = myTracked->getAngle();
522 lookFrom[0] = lookAt[0] + 50. * cos(angle);
523 lookFrom[1] = lookAt[1] + 50. * sin(angle);
524 lookFrom[2] = lookAt[2] + 10.;
526 m.makeLookAt(lookFrom, lookAt, osg::Z_AXIS);
527 myViewer->getCameraManipulator()->setByInverseMatrix(m);
531 for (
auto& item : myPersons) {
532 item.second.active =
false;
537 const std::set<MSTransportable*, ComparatorNumericalIdLess>& persons = ge->
getPersonsSecure();
538 for (
auto person : persons) {
539 if (person->hasArrived() || !person->hasDeparted()) {
543 auto itPers = myPersons.find(person);
544 if (itPers == myPersons.end()) {
545 myPersons[person] = GUIOSGBuilder::buildMovable(person->getVehicleType());
546 myRoot->addChild(myPersons[person].pos);
548 itPers->second.active =
true;
550 osg::PositionAttitudeTransform* n = myPersons[person].pos;
551 const Position pos = person->getPosition();
552 n->setPosition(osg::Vec3d(pos.
x(), pos.
y(), pos.
z()));
553 const double dir = person->getAngle() +
M_PI / 2.;
554 n->setAttitude(osg::Quat(dir, osg::Vec3d(0, 0, 1)));
559 col = myVisualizationSettings->personColorer.getScheme().getColor(actualPerson->
getColorValue(*myVisualizationSettings, myVisualizationSettings->vehicleColorer.getActive()));
561 myPersons[person].mat->setDiffuse(osg::Material::FRONT_AND_BACK, osg::Vec4d(col.
red() / 255., col.
green() / 255., col.
blue() / 255., col.
alpha() / 255.));
567 for (
auto person = myPersons.begin(); person != myPersons.end();) {
568 if (!person->second.active) {
569 removeTransportable((person++)->first);
575 if (myAdapter->makeCurrent()) {
586 if (myTracked == veh) {
589 std::map<MSVehicle*, OSGMovable>::iterator i = myVehicles.find(veh);
590 if (i != myVehicles.end()) {
591 myRoot->removeChild(i->second.pos);
599 std::map<MSTransportable*, OSGMovable>::iterator i = myPersons.find(t);
600 if (i != myPersons.end()) {
601 myRoot->removeChild(i->second.pos);
607 void GUIOSGView::updateViewportValues() {
608 osg::Vec3d lookFrom, lookAt, up;
609 myViewer->getCameraManipulator()->getInverseMatrix().getLookAt(lookFrom, lookAt, up);
610 myGUIDialogEditViewport->setValues(
Position(lookFrom[0], lookFrom[1], lookFrom[2]),
611 Position(lookAt[0], lookAt[1], lookAt[2]), calculateRotation(lookFrom, lookAt, up));
616 GUIOSGView::showViewportEditor() {
618 osg::Vec3d lookFrom, lookAt, up;
619 myViewer->getCameraManipulator()->getInverseMatrix().getLookAt(lookFrom, lookAt, up);
620 Position from(lookFrom[0], lookFrom[1], lookFrom[2]), at(lookAt[0], lookAt[1], lookAt[2]);
621 myGUIDialogEditViewport->setOldValues(from, at, calculateRotation(lookFrom, lookAt, up));
622 myGUIDialogEditViewport->setZoomValue(100);
623 myGUIDialogEditViewport->show();
628 GUIOSGView::setViewportFromToRot(
const Position& lookFrom,
const Position& lookAt,
double rotation) {
629 osg::Vec3d lookFromOSG, lookAtOSG, up;
630 lookFromOSG[0] = lookFrom.
x();
631 lookFromOSG[1] = lookFrom.
y();
632 lookFromOSG[2] = lookFrom.
z();
633 lookAtOSG[0] = lookAt.
x();
634 lookAtOSG[1] = lookAt.
y();
635 lookAtOSG[2] = lookAt.
z();
637 osg::Vec3d viewAxis, viewUp, orthogonal, normal;
638 viewAxis = lookFromOSG - lookAtOSG;
639 viewAxis.normalize();
640 viewUp = (viewAxis[0] + viewAxis[1] == 0.) ? osg::Vec3d(0., 1., 0.) : osg::Vec3d(0., 0., 1.);
641 orthogonal = viewUp ^ viewAxis;
642 orthogonal.normalize();
643 normal = viewAxis ^ orthogonal;
645 rotation = std::fmod(rotation, 360.);
649 myChanger->setRotation(rotation);
650 double angle =
DEG2RAD(rotation);
651 up = normal * cos(angle) - orthogonal * sin(angle);
654 double zoom = (myGUIDialogEditViewport !=
nullptr) ? myGUIDialogEditViewport->getZoomValue() : 100.;
655 lookFromOSG = lookFromOSG + viewAxis * (100. - zoom);
656 lookAtOSG = lookFromOSG - viewAxis;
657 myViewer->getCameraManipulator()->setHomePosition(lookFromOSG, lookAtOSG, up);
664 osg::Vec3d lookFrom, lookAt, up;
665 myViewer->getCameraManipulator()->getHomePosition(lookFrom, lookAt, up);
667 Position(lookAt[0], lookAt[1], lookAt[2]), 0);
672 GUIOSGView::startTrack(
int id) {
673 if (myTracked == 0 || (
int)myTracked->getGlID() !=
id) {
678 if ((
int)veh->
getGlID() == id) {
679 if (!veh->
isOnRoad() || myVehicles.find(veh) == myVehicles.end()) {
686 if (myTracked != 0) {
687 osg::Vec3d lookFrom, lookAt, up;
689 lookAt[1] = myTracked->getPosition().y();
690 lookAt[2] = myTracked->getPosition().z();
691 lookFrom[0] = lookAt[0] + 50.;
692 lookFrom[1] = lookAt[1] + 50.;
693 lookFrom[2] = lookAt[2] + 10.;
695 m.makeLookAt(lookFrom, lookAt, osg::Z_AXIS);
696 myViewer->getCameraManipulator()->setByInverseMatrix(m);
703 GUIOSGView::stopTrack() {
709 GUIOSGView::getTrackedID()
const {
715 GUIOSGView::onGamingClick(
Position pos) {
718 double minDist = std::numeric_limits<double>::infinity();
723 if (lanes.size() > 0) {
724 const Position& endPos = lanes[0]->getShape().back();
734 const std::vector<MSTrafficLightLogic*> logics = vars.
getAllLogics();
735 if (logics.size() > 1) {
737 for (
int i = 0; i < (int)logics.size() - 1; i++) {
738 if (minTll->
getProgramID() == logics[i]->getProgramID()) {
743 if (l == logics[0]) {
754 GUIOSGView::getCurrentTimeStep()
const {
759 long GUIOSGView::onConfigure(FXObject* sender, FXSelector sel,
void* ptr) {
761 const int w = getWidth();
762 const int h = getHeight();
763 if (w > 0 && h > 0) {
764 myAdapter->getEventQueue()->windowResize(0, 0, w, h);
765 myAdapter->resized(0, 0, w, h);
766 updateHUDPosition(w, h);
768 return FXGLCanvas::onConfigure(sender, sel, ptr);
772 long GUIOSGView::onKeyPress(FXObject* sender, FXSelector sel,
void* ptr) {
773 int key = ((FXEvent*)ptr)->code;
774 myAdapter->getEventQueue()->keyPress(key);
776 if (key ==
FX::KEY_f || key == FX::KEY_Left || key == FX::KEY_Right || key == FX::KEY_Up || key == FX::KEY_Down) {
779 return FXGLCanvas::onKeyPress(sender, sel, ptr);
783 long GUIOSGView::onKeyRelease(FXObject* sender, FXSelector sel,
void* ptr) {
784 int key = ((FXEvent*)ptr)->code;
785 myAdapter->getEventQueue()->keyRelease(key);
787 if (key ==
FX::KEY_f || key == FX::KEY_Left || key == FX::KEY_Right || key == FX::KEY_Up || key == FX::KEY_Down) {
790 return FXGLCanvas::onKeyRelease(sender, sel, ptr);
794 long GUIOSGView::onLeftBtnPress(FXObject* sender, FXSelector sel,
void* ptr) {
795 handle(
this, FXSEL(SEL_FOCUS_SELF, 0), ptr);
797 FXEvent*
event = (FXEvent*)ptr;
798 myAdapter->getEventQueue()->mouseButtonPress((
float)
event->click_x, (float)event->click_y, 1);
799 if (myApp->isGaming()) {
800 onGamingClick(getPositionInformation());
803 return FXGLCanvas::onLeftBtnPress(sender, sel, ptr);
807 long GUIOSGView::onLeftBtnRelease(FXObject* sender, FXSelector sel,
void* ptr) {
808 FXEvent*
event = (FXEvent*)ptr;
809 myAdapter->getEventQueue()->mouseButtonRelease((
float)
event->click_x, (float)event->click_y, 1);
810 myChanger->onLeftBtnRelease(ptr);
811 return FXGLCanvas::onLeftBtnRelease(sender, sel, ptr);
815 long GUIOSGView::onMiddleBtnPress(FXObject* sender, FXSelector sel,
void* ptr) {
816 handle(
this, FXSEL(SEL_FOCUS_SELF, 0), ptr);
818 FXEvent*
event = (FXEvent*)ptr;
819 myAdapter->getEventQueue()->mouseButtonPress((
float)
event->click_x, (float)event->click_y, 2);
821 return FXGLCanvas::onMiddleBtnPress(sender, sel, ptr);
825 long GUIOSGView::onMiddleBtnRelease(FXObject* sender, FXSelector sel,
void* ptr) {
826 FXEvent*
event = (FXEvent*)ptr;
827 myAdapter->getEventQueue()->mouseButtonRelease((
float)
event->click_x, (float)event->click_y, 2);
828 myChanger->onMiddleBtnRelease(ptr);
829 return FXGLCanvas::onMiddleBtnRelease(sender, sel, ptr);
833 long GUIOSGView::onRightBtnPress(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, 3);
839 return FXGLCanvas::onRightBtnPress(sender, sel, ptr);
843 long GUIOSGView::onRightBtnRelease(FXObject* sender, FXSelector sel,
void* ptr) {
844 FXEvent*
event = (FXEvent*)ptr;
845 myAdapter->getEventQueue()->mouseButtonRelease((
float)
event->click_x, (float)event->click_y, 3);
846 myChanger->onRightBtnRelease(ptr);
847 return FXGLCanvas::onRightBtnRelease(sender, sel, ptr);
852 GUIOSGView::onMouseMove(FXObject* sender, FXSelector sel,
void* ptr) {
854 if (myPopup && !myPopup->shown()) {
858 FXEvent*
event = (FXEvent*)ptr;
859 osgGA::GUIEventAdapter* ea = myAdapter->getEventQueue()->mouseMotion((
float)
event->win_x, (float)event->win_y);
860 setWindowCursorPosition(ea->getXnormalized(), ea->getYnormalized());
861 if (myGUIDialogEditViewport !=
nullptr && myGUIDialogEditViewport->shown()) {
862 updateViewportValues();
864 updatePositionInformation();
865 return FXGLCanvas::onMotion(sender, sel, ptr);
870 GUIOSGView::onIdle(FXObject* , FXSelector ,
void*) {
879 GUIOSGView::onCmdCloseLane(FXObject*, FXSelector,
void*) {
880 GUILane* lane = getLaneUnderCursor();
881 if (lane !=
nullptr) {
892 GUIOSGView::onCmdCloseEdge(FXObject*, FXSelector,
void*) {
893 GUILane* lane = getLaneUnderCursor();
894 if (lane !=
nullptr) {
905 GUIOSGView::onCmdAddRerouter(FXObject*, FXSelector,
void*) {
906 GUILane* lane = getLaneUnderCursor();
907 if (lane !=
nullptr) {
917 GUIOSGView::onCmdShowReachability(FXObject* menu, FXSelector selector,
void*) {
918 GUILane* lane = getLaneUnderCursor();
919 if (lane !=
nullptr) {
923 if (myVisualizationSettings->laneColorer.getActive() != 36) {
924 myVisualizationSettings->laneColorer.setActive(1);
934 GUIOSGView::onVisualizationChange(FXObject*, FXSelector,
void*) {
941 GUIOSGView::setWindowCursorPosition(
float x,
float y) {
942 myOSGNormalizedCursorX = x;
943 myOSGNormalizedCursorY = y;
948 GUIOSGView::calculateRotation(
const osg::Vec3d& lookFrom,
const osg::Vec3d& lookAt,
const osg::Vec3d& up) {
949 osg::Vec3d viewAxis, viewUp, orthogonal, normal;
950 viewAxis = lookFrom - lookAt;
951 viewAxis.normalize();
952 viewUp = (abs(viewAxis[0]) + abs(viewAxis[1]) == 0.) ? osg::Y_AXIS : osg::Z_AXIS;
953 orthogonal = viewUp ^ viewAxis;
954 orthogonal.normalize();
955 normal = viewAxis ^ orthogonal;
956 double angle = atan2((normal ^ up).length() / (normal.length() * up.length()), (normal * up) / (normal.length() * up.length()));
965 GUIOSGView::updatePositionInformation()
const {
967 if (getPositionAtCursor(myOSGNormalizedCursorX, myOSGNormalizedCursorY, pos)) {
968 myApp->getCartesianLabel()->setText((
"x:" +
toString(pos.
x()) +
", y:" +
toString(pos.
y())).c_str());
974 myApp->getGeoLabel()->setText(
TL(
"(No projection defined)"));
978 myApp->getCartesianLabel()->setText(
TL(
"N/A"));
979 myApp->getGeoLabel()->setText(
TL(
"N/A"));
985 GUIOSGView::getPositionAtCursor(
float xNorm,
float yNorm,
Position& pos)
const {
987 osg::Vec3d lookFrom, lookAt, up, viewAxis;
988 myViewer->getCameraManipulator()->getInverseMatrix().getLookAt(lookFrom, lookAt, up);
989 if ((lookAt - lookFrom).z() >= 0.) {
994 osg::Matrixd iVP = osg::Matrixd::inverse(myViewer->getCamera()->getViewMatrix() * myViewer->getCamera()->getProjectionMatrix());
995 osg::Vec3 nearPoint = osg::Vec3(xNorm, yNorm, 0.0f) * iVP;
996 osg::Vec3 farPoint = osg::Vec3(xNorm, yNorm, 1.0f) * iVP;
997 osg::Vec3 ray = farPoint - nearPoint;
998 osg::Vec3 groundPos = nearPoint - ray * nearPoint.z() / ray.z();
999 pos.
setx(groundPos.x());
1000 pos.
sety(groundPos.y());
1006 std::vector<GUIGlObject*>
1007 GUIOSGView::getGUIGlObjectsUnderCursor() {
1008 std::vector<GUIGlObject*> result;
1009 osgUtil::LineSegmentIntersector::Intersections intersections;
1010 if (myViewer->computeIntersections(myViewer->getCamera(), osgUtil::Intersector::CoordinateFrame::PROJECTION, myOSGNormalizedCursorX, myOSGNormalizedCursorY, intersections)) {
1011 for (
auto intersection : intersections) {
1012 if (!intersection.nodePath.empty()) {
1014 for (osg::Node* currentNode : intersection.nodePath) {
1015 if (currentNode->getName().length() > 0 && currentNode->getName().find(
":") != std::string::npos) {
1016 const std::string objID = currentNode->getName();
1026 result.push_back(o);
1039 GUIOSGView::getLaneUnderCursor() {
1040 std::vector<GUIGlObject*> objects = getGUIGlObjectsUnderCursor();
1041 if (objects.size() > 0) {
1042 return dynamic_cast<GUILane*
>(objects[0]);
1050 osg::Vec3d lookFromOSG, lookAtOSG, viewAxis, up;
1051 myViewer->getCameraManipulator()->getInverseMatrix().getLookAt(lookFromOSG, lookAtOSG, up);
1052 lookFromOSG[0] = camera.
x();
1053 lookFromOSG[1] = camera.
y();
1054 lookFromOSG[2] = camera.
z();
1055 lookAtOSG[0] = lookAt.
x();
1056 lookAtOSG[1] = lookAt.
y();
1057 lookAtOSG[2] = lookAt.
z();
1058 viewAxis = lookAtOSG - lookFromOSG;
1059 viewAxis.normalize();
1062 osg::Vec3d cameraUpdate = lookFromOSG + viewAxis * (zoom - 100.);
1063 osg::Vec3d lookAtUpdate = cameraUpdate + viewAxis;
1065 myViewer->getCameraManipulator()->setHomePosition(cameraUpdate, lookAtUpdate, up);
1071 GUIOSGView::toOSGColorVector(
RGBColor c,
bool useAlpha) {
1072 return osg::Vec4d(c.
red() / 255., c.
green() / 255., c.
blue() / 255., (useAlpha) ? c.
alpha() / 255. : 1.);
1077 : myParent(parent), myOldCursor(cursor) {
1078 _traits =
new GraphicsContext::Traits();
1081 _traits->width = parent->getWidth();
1082 _traits->height = parent->getHeight();
1083 _traits->windowDecoration =
false;
1084 _traits->doubleBuffer =
true;
1085 _traits->sharedContext = 0;
1087 setState(
new osg::State());
1088 getState()->setGraphicsContext(
this);
1089 #ifdef DEBUG_GLERRORS
1090 getState()->setCheckForGLErrors(osg::State::ONCE_PER_ATTRIBUTE);
1091 std::cout <<
"OSG getCheckForGLErrors " << getState()->getCheckForGLErrors() << std::endl;
1093 if (_traits.valid() && _traits->sharedContext != 0) {
1094 getState()->setContextID(_traits->sharedContext->getState()->getContextID());
1095 incrementContextIDUsageCount(getState()->getContextID());
1097 getState()->setContextID(createNewContextID());
1103 GUIOSGView::FXOSGAdapter::~FXOSGAdapter() {
1109 GUIOSGView::FXOSGAdapter::grabFocus() {
1111 myParent->setFocus();
1116 GUIOSGView::FXOSGAdapter::useCursor(
bool cursorOn) {
1118 myParent->setDefaultCursor(myOldCursor);
1120 myParent->setDefaultCursor(NULL);
1126 GUIOSGView::FXOSGAdapter::makeCurrentImplementation() {
1127 myParent->makeCurrent();
1133 GUIOSGView::FXOSGAdapter::releaseContext() {
1134 myParent->makeNonCurrent();
1140 GUIOSGView::FXOSGAdapter::swapBuffersImplementation() {
1141 myParent->swapBuffers();
1146 GUIOSGView::PickHandler::handle(
const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& ) {
1147 if (ea.getEventType() == osgGA::GUIEventAdapter::DRAG) {
1149 }
else if (ea.getEventType() == osgGA::GUIEventAdapter::RELEASE && ea.getButton() == osgGA::GUIEventAdapter::RIGHT_MOUSE_BUTTON) {
1151 if (myParent->makeCurrent()) {
1152 std::vector<GUIGlObject*> objects = myParent->getGUIGlObjectsUnderCursor();
1153 if (objects.size() > 0) {
1154 myParent->openObjectDialog(objects);
1156 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.
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)
const std::set< MSTransportable *, ComparatorNumericalIdLess > & getPersonsSecure() const
Returns this edge's persons set; locks it for microsimulation.
void releasePersons() const
Allows to use the container for microsimulation again.
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
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
void cartesian2geo(Position &cartesian) const
Converts the given cartesian (shifted) position to its geo (lat/long) representation.
static const GeoConvHelper & getFinal()
the coordinate transformation for writing the location element and for tracking the original coordina...
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.
const MSEdgeVector & getEdges() const
Returns loaded edges.
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.
MSVehicleControl & getVehicleControl()
Returns the vehicle control.
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
MSEdgeControl & getEdgeControl()
Returns the edge 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.
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.
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.
@ 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.