77FXDEFMAP(GUIOSGView) GUIOSGView_Map[] = {
79 FXMAPFUNC(SEL_CHORE,
MID_CHORE, GUIOSGView::onIdle),
85operator<<(std::ostream& os,
const osg::Vec3d& v) {
86 return os << v.x() <<
"," << v.y() <<
"," << v.z();
93GUIOSGView::Command_TLSChange::Command_TLSChange(
const MSLink*
const link, osg::Switch* switchNode)
99GUIOSGView::Command_TLSChange::~Command_TLSChange() {}
103GUIOSGView::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();
134GUIOSGView::GUIOSGView(
138 GUINet& net, FXGLVisual* glVis,
141 myTracked(0), 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();
150 myCameraManipulator =
new GUIOSGManipulator(
this);
152 const char* sumoPath = getenv(
"SUMO_HOME");
154 std::string newPath = std::string(sumoPath) +
"/data/3D";
156 osgDB::FilePathList path = osgDB::Registry::instance()->getDataFilePathList();
157 path.push_back(newPath);
158 osgDB::Registry::instance()->setDataFilePathList(path);
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) {
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);
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);
186 myViewer->setKeyEventSetsDone(0);
187 myViewer->getCamera()->setGraphicsContext(myAdapter);
188 myViewer->getCamera()->setViewport(0, 0, w, h);
189 myViewer->getCamera()->setNearFarRatio(0.005);
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;
196 myCameraManipulator->setHomePosition(lookFrom, lookAt, up);
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);
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);
216 myHUD =
new osg::Camera;
217 myHUD->setProjectionMatrixAsOrtho2D(0, 800, 0, 800);
218 myHUD->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
219 myHUD->setViewMatrix(osg::Matrix::identity());
220 myHUD->setClearMask(GL_DEPTH_BUFFER_BIT);
221 myHUD->setRenderOrder(osg::Camera::POST_RENDER);
222 myHUD->setAllowEventFocus(
false);
223 myHUD->setGraphicsContext(myAdapter);
224 myHUD->addChild(myTextNode);
225 myHUD->setViewport(0, 0, w, h);
226 myViewer->addSlave(myHUD,
false);
227 myCameraManipulator->updateHUDText();
231 osgUtil::Optimizer optimizer;
232 optimizer.optimize(myRoot);
236GUIOSGView::~GUIOSGView() {
238 myViewer->setDone(
true);
242 myCameraManipulator = 0;
249 myRedYellowLight = 0;
255GUIOSGView::adoptViewSettings() {
257 osg::Light* globalLight = myViewer->getLight();
258 globalLight->setAmbient(toOSGColorVector(myVisualizationSettings->ambient3DLight));
259 globalLight->setDiffuse(toOSGColorVector(myVisualizationSettings->diffuse3DLight));
260 myViewer->getCamera()->setClearColor(toOSGColorVector(myVisualizationSettings->skyColor));
263 osg::Geode* planeGeode =
dynamic_cast<osg::Geode*
>(myPlane->getChild(0));
264 osg::Geometry* planeGeom =
dynamic_cast<osg::Geometry*
>(planeGeode->getChild(0));
265 osg::Vec4ubArray* colors =
dynamic_cast<osg::Vec4ubArray*
>(planeGeom->getColorArray());
266 (*colors)[0].set(myVisualizationSettings->backgroundColor.red(),
267 myVisualizationSettings->backgroundColor.green(),
268 myVisualizationSettings->backgroundColor.blue(),
269 myVisualizationSettings->backgroundColor.alpha());
270 planeGeom->setColorArray(colors);
273 unsigned int cullMask = 0xFFFFFFFF;
274 if (!myVisualizationSettings->show3DTLSDomes) {
275 cullMask &= ~(
unsigned int)NODESET_TLSDOMES;
277 if (!myVisualizationSettings->show3DTLSLinkMarkers) {
278 cullMask &= ~(
unsigned int)NODESET_TLSLINKMARKERS;
280 if (!myVisualizationSettings->generate3DTLSModels) {
281 cullMask &= ~(
unsigned int)NODESET_TLSMODELS;
283 myViewer->getCamera()->setCullMask(cullMask);
284 unsigned int hudCullMask = (myVisualizationSettings->show3DHeadUpDisplay) ? 0xFFFFFFFF : 0;
285 myHUD->setCullMask(hudCullMask);
290GUIOSGView::getPositionInformation()
const {
292 getPositionAtCursor(myOSGNormalizedCursorX, myOSGNormalizedCursorY, pos);
298GUIOSGView::is3DView()
const {
308 for (std::vector<std::string>::const_iterator i = names.begin(); i != names.end(); ++i) {
310 if ((*i) == myVisualizationSettings->name) {
317 "Locate Junction",
"Locate a junction within the network.",
"",
322 "Locate Street",
"Locate a street within the network.",
"",
327 "Locate Vehicle",
"Locate a vehicle within the network.",
"",
332 "Locate Person",
"Locate a person within the network.",
"",
337 "Locate Container",
"Locate a container within the network.",
"",
342 "Locate TLS",
"Locate a tls within the network.",
"",
347 "Locate Additional",
"Locate an additional structure within the network.",
"",
352 "Locate POI",
"Locate a POI within the network.",
"",
357 "Locate Polygon",
"Locate a Polygon within the network.",
"",
364GUIOSGView::resize(
int w,
int h) {
365 GUISUMOAbstractView::resize(w, h);
366 updateHUDPosition(w, h);
371GUIOSGView::position(
int x,
int y,
int w,
int h) {
372 GUISUMOAbstractView::position(x, y, w, h);
373 updateHUDPosition(w, h);
378GUIOSGView::updateHUDPosition(
int w,
int h) {
380 myHUD->setProjectionMatrixAsOrtho2D(0, w, 0, h);
381 myText->setPosition(osg::Vec3d(0.,
static_cast<double>(height), 0.));
386GUIOSGView::updateHUDText(
const std::string text) {
387 myText->setText(text, osgText::String::ENCODING_UTF8);
392GUIOSGView::recenterView() {
394 Position center = myGrid->getCenter();
395 double radius = std::max(myGrid->xmax() - myGrid->xmin(), myGrid->ymax() - myGrid->ymin());
396 myChanger->centerTo(center, radius);
401GUIOSGView::setColorScheme(
const std::string& name) {
405 if (myGUIDialogViewSettings != 0) {
406 if (myGUIDialogViewSettings->getCurrentScheme() != name) {
407 myGUIDialogViewSettings->setCurrentScheme(name);
411 myVisualizationSettings->
gaming = myApp->isGaming();
419GUIOSGView::onPaint(FXObject*, FXSelector,
void*) {
423 myDecalsLockMutex.lock();
425 if (!d.initialised && d.filename.length() > 0) {
426 if (d.filename.length() == 6 && d.filename.substr(0, 5) ==
"light") {
427 GUIOSGBuilder::buildLight(d, *myRoot);
428 }
else if (d.filename.length() > 3 && d.filename.substr(0, 3) ==
"tl:") {
429 const int linkStringIdx = (int)d.filename.find(
':', 3);
432 const std::string tlLogic = d.filename.substr(3, linkStringIdx - 3);
435 if (linkIdx < 0 || linkIdx >=
static_cast<int>(vars.
getActive()->
getLinks().size())) {
439 osg::Group* tlNode = GUIOSGBuilder::getTrafficLight(d, vars, link, myGreenLight, myYellowLight, myRedLight, myRedYellowLight, myPoleBase,
true, 0.5);
440 tlNode->setName(
"tlLogic:" + tlLogic);
441 myRoot->addChild(tlNode);
448 GUIOSGBuilder::buildDecal(d, *myRoot);
450 d.initialised =
true;
453 myDecalsLockMutex.unlock();
456 for (
auto& item : myVehicles) {
457 item.second.active =
false;
462 for (
const MSEdge* e : net->getEdgeControl().getEdges()) {
463 for (
const MSLane* l : e->getLanes()) {
470 auto itVeh = myVehicles.find(veh);
471 if (itVeh == myVehicles.end()) {
472 myVehicles[veh] = GUIOSGBuilder::buildMovable(veh->
getVehicleType());
473 myRoot->addChild(myVehicles[veh].pos);
474 myVehicles[veh].pos->setName(
"vehicle:" + veh->
getID());
475 veh->setNode(myVehicles[veh].pos);
477 itVeh->second.active =
true;
479 osg::PositionAttitudeTransform* n = myVehicles[veh].pos;
482 const double slope = -veh->
getSlope();
483 n->setAttitude(osg::Quat(osg::DegreesToRadians(slope), osg::Vec3(1, 0, 0),
484 0, osg::Vec3(0, 1, 0),
485 dir, osg::Vec3(0, 0, 1)));
498 if (myVisualizationSettings->ignoreColorSchemeFor3DVehicles) {
499 myVehicles[veh].activateMaterial(
false);
501 myVehicles[veh].activateMaterial(
true);
504 col = myVisualizationSettings->vehicleColorer.getScheme().getColor(veh->
getColorValue(*myVisualizationSettings, myVisualizationSettings->vehicleColorer.getActive()));
506 myVehicles[veh].mat->setDiffuse(osg::Material::FRONT_AND_BACK, osg::Vec4d(col.
red() / 255., col.
green() / 255., col.
blue() / 255., col.
alpha() / 255.));
512 l->releaseVehicles();
516 for (
auto veh = myVehicles.begin(); veh != myVehicles.end();) {
517 if (!veh->second.active) {
518 removeVeh((veh++)->first);
525 if (now != myLastUpdate || (myGUIDialogViewSettings != 0 && myGUIDialogViewSettings->shown())) {
528 if (now != myLastUpdate && myTracked != 0) {
529 osg::Vec3d lookFrom, lookAt, up;
530 lookAt[0] = myTracked->getPosition().x();
531 lookAt[1] = myTracked->getPosition().y();
532 lookAt[2] = myTracked->getPosition().z();
533 const double angle = myTracked->getAngle();
534 lookFrom[0] = lookAt[0] + 50. * cos(angle);
535 lookFrom[1] = lookAt[1] + 50. * sin(angle);
536 lookFrom[2] = lookAt[2] + 10.;
538 m.makeLookAt(lookFrom, lookAt, osg::Z_AXIS);
539 myViewer->getCameraManipulator()->setByInverseMatrix(m);
543 for (
auto& item : myPersons) {
544 item.second.active =
false;
547 for (
const MSEdge* e : net->getEdgeControl().getEdges()) {
549 const std::set<MSTransportable*, ComparatorNumericalIdLess>& persons = ge->
getPersonsSecure();
550 for (
auto person : persons) {
551 if (person->hasArrived() || !person->hasDeparted()) {
555 auto itPers = myPersons.find(person);
556 if (itPers == myPersons.end()) {
557 myPersons[person] = GUIOSGBuilder::buildMovable(person->getVehicleType());
558 myRoot->addChild(myPersons[person].pos);
560 itPers->second.active =
true;
562 osg::PositionAttitudeTransform* n = myPersons[person].pos;
563 const Position pos = person->getPosition();
564 n->setPosition(osg::Vec3d(pos.
x(), pos.
y(), pos.
z()));
565 const double dir = person->getAngle() +
M_PI / 2.;
566 n->setAttitude(osg::Quat(dir, osg::Vec3d(0, 0, 1)));
571 col = myVisualizationSettings->personColorer.getScheme().getColor(actualPerson->
getColorValue(*myVisualizationSettings, myVisualizationSettings->vehicleColorer.getActive()));
573 myPersons[person].mat->setDiffuse(osg::Material::FRONT_AND_BACK, osg::Vec4d(col.
red() / 255., col.
green() / 255., col.
blue() / 255., col.
alpha() / 255.));
579 for (
auto person = myPersons.begin(); person != myPersons.end();) {
580 if (!person->second.active) {
581 removeTransportable((person++)->first);
587 if (myAdapter->makeCurrent()) {
598 if (myTracked == veh) {
601 std::map<MSVehicle*, OSGMovable>::iterator i = myVehicles.find(veh);
602 if (i != myVehicles.end()) {
603 myRoot->removeChild(i->second.pos);
611 std::map<MSTransportable*, OSGMovable>::iterator i = myPersons.find(t);
612 if (i != myPersons.end()) {
613 myRoot->removeChild(i->second.pos);
619void GUIOSGView::updateViewportValues() {
620 osg::Vec3d lookFrom, lookAt, up;
621 myViewer->getCameraManipulator()->getInverseMatrix().getLookAt(lookFrom, lookAt, up);
622 myGUIDialogEditViewport->setValues(
Position(lookFrom[0], lookFrom[1], lookFrom[2]),
623 Position(lookAt[0], lookAt[1], lookAt[2]), calculateRotation(lookFrom, lookAt, up));
628GUIOSGView::showViewportEditor() {
630 osg::Vec3d lookFrom, lookAt, up;
631 myViewer->getCameraManipulator()->getInverseMatrix().getLookAt(lookFrom, lookAt, up);
632 Position from(lookFrom[0], lookFrom[1], lookFrom[2]), at(lookAt[0], lookAt[1], lookAt[2]);
633 myGUIDialogEditViewport->setOldValues(from, at, calculateRotation(lookFrom, lookAt, up));
634 myGUIDialogEditViewport->setZoomValue(100);
635 myGUIDialogEditViewport->show();
640GUIOSGView::setViewportFromToRot(
const Position& lookFrom,
const Position& lookAt,
double rotation) {
641 osg::Vec3d lookFromOSG, lookAtOSG, up;
642 lookFromOSG[0] = lookFrom.
x();
643 lookFromOSG[1] = lookFrom.
y();
644 lookFromOSG[2] = lookFrom.
z();
645 lookAtOSG[0] = lookAt.
x();
646 lookAtOSG[1] = lookAt.
y();
647 lookAtOSG[2] = lookAt.
z();
649 osg::Vec3d viewAxis, viewUp, orthogonal, normal;
650 viewAxis = lookFromOSG - lookAtOSG;
651 viewAxis.normalize();
652 viewUp = (viewAxis[0] + viewAxis[1] == 0.) ? osg::Vec3d(0., 1., 0.) : osg::Vec3d(0., 0., 1.);
653 orthogonal = viewUp ^ viewAxis;
654 orthogonal.normalize();
655 normal = viewAxis ^ orthogonal;
657 rotation = std::fmod(rotation, 360.);
661 myChanger->setRotation(rotation);
662 double angle =
DEG2RAD(rotation);
663 up = normal * cos(angle) - orthogonal * sin(angle);
666 double zoom = (myGUIDialogEditViewport !=
nullptr) ? myGUIDialogEditViewport->getZoomValue() : 100.;
667 lookFromOSG = lookFromOSG + viewAxis * (100. - zoom);
668 lookAtOSG = lookFromOSG - viewAxis;
669 myViewer->getCameraManipulator()->setHomePosition(lookFromOSG, lookAtOSG, up);
676 osg::Vec3d lookFrom, lookAt, up;
677 myViewer->getCameraManipulator()->getHomePosition(lookFrom, lookAt, up);
679 Position(lookAt[0], lookAt[1], lookAt[2]), 0);
684GUIOSGView::startTrack(
int id) {
685 if (myTracked == 0 || (
int)myTracked->getGlID() !=
id) {
690 if ((
int)veh->getGlID() ==
id) {
691 if (!veh->
isOnRoad() || myVehicles.find(veh) == myVehicles.end()) {
698 if (myTracked != 0) {
699 osg::Vec3d lookFrom, lookAt, up;
701 lookAt[1] = myTracked->getPosition().y();
702 lookAt[2] = myTracked->getPosition().z();
703 lookFrom[0] = lookAt[0] + 50.;
704 lookFrom[1] = lookAt[1] + 50.;
705 lookFrom[2] = lookAt[2] + 10.;
707 m.makeLookAt(lookFrom, lookAt, osg::Z_AXIS);
708 myViewer->getCameraManipulator()->setByInverseMatrix(m);
715GUIOSGView::stopTrack() {
721GUIOSGView::getTrackedID()
const {
727GUIOSGView::onGamingClick(
Position pos) {
730 double minDist = std::numeric_limits<double>::infinity();
735 if (lanes.size() > 0) {
736 const Position& endPos = lanes[0]->getShape().back();
746 const std::vector<MSTrafficLightLogic*> logics = vars.
getAllLogics();
747 if (logics.size() > 1) {
749 for (
int i = 0; i < (int)logics.size() - 1; i++) {
750 if (minTll->
getProgramID() == logics[i]->getProgramID()) {
755 if (l == logics[0]) {
766GUIOSGView::getCurrentTimeStep()
const {
771long GUIOSGView::onConfigure(FXObject* sender, FXSelector sel,
void* ptr) {
773 const int w = getWidth();
774 const int h = getHeight();
775 if (w > 0 && h > 0) {
776 myAdapter->getEventQueue()->windowResize(0, 0, w, h);
777 myAdapter->resized(0, 0, w, h);
778 updateHUDPosition(w, h);
780 return FXGLCanvas::onConfigure(sender, sel, ptr);
784long GUIOSGView::onKeyPress(FXObject* sender, FXSelector sel,
void* ptr) {
785 int key = ((FXEvent*)ptr)->code;
786 myAdapter->getEventQueue()->keyPress(key);
788 if (key == FX::KEY_f || key == FX::KEY_Left || key == FX::KEY_Right || key == FX::KEY_Up || key == FX::KEY_Down) {
791 return FXGLCanvas::onKeyPress(sender, sel, ptr);
795long GUIOSGView::onKeyRelease(FXObject* sender, FXSelector sel,
void* ptr) {
796 int key = ((FXEvent*)ptr)->code;
797 myAdapter->getEventQueue()->keyRelease(key);
799 if (key == FX::KEY_f || key == FX::KEY_Left || key == FX::KEY_Right || key == FX::KEY_Up || key == FX::KEY_Down) {
802 return FXGLCanvas::onKeyRelease(sender, sel, ptr);
806long GUIOSGView::onLeftBtnPress(FXObject* sender, FXSelector sel,
void* ptr) {
807 handle(
this, FXSEL(SEL_FOCUS_SELF, 0), ptr);
809 FXEvent*
event = (FXEvent*)ptr;
810 myAdapter->getEventQueue()->mouseButtonPress((
float)
event->click_x, (float)event->click_y, 1);
811 if (myApp->isGaming()) {
812 onGamingClick(getPositionInformation());
815 return FXGLCanvas::onLeftBtnPress(sender, sel, ptr);
819long GUIOSGView::onLeftBtnRelease(FXObject* sender, FXSelector sel,
void* ptr) {
820 FXEvent*
event = (FXEvent*)ptr;
821 myAdapter->getEventQueue()->mouseButtonRelease((
float)
event->click_x, (float)event->click_y, 1);
822 myChanger->onLeftBtnRelease(ptr);
823 return FXGLCanvas::onLeftBtnRelease(sender, sel, ptr);
827long GUIOSGView::onMiddleBtnPress(FXObject* sender, FXSelector sel,
void* ptr) {
828 handle(
this, FXSEL(SEL_FOCUS_SELF, 0), ptr);
830 FXEvent*
event = (FXEvent*)ptr;
831 myAdapter->getEventQueue()->mouseButtonPress((
float)
event->click_x, (float)event->click_y, 2);
833 return FXGLCanvas::onMiddleBtnPress(sender, sel, ptr);
837long GUIOSGView::onMiddleBtnRelease(FXObject* sender, FXSelector sel,
void* ptr) {
838 FXEvent*
event = (FXEvent*)ptr;
839 myAdapter->getEventQueue()->mouseButtonRelease((
float)
event->click_x, (float)event->click_y, 2);
840 myChanger->onMiddleBtnRelease(ptr);
841 return FXGLCanvas::onMiddleBtnRelease(sender, sel, ptr);
845long GUIOSGView::onRightBtnPress(FXObject* sender, FXSelector sel,
void* ptr) {
846 handle(
this, FXSEL(SEL_FOCUS_SELF, 0), ptr);
848 FXEvent*
event = (FXEvent*)ptr;
849 myAdapter->getEventQueue()->mouseButtonPress((
float)
event->click_x, (float)event->click_y, 3);
851 return FXGLCanvas::onRightBtnPress(sender, sel, ptr);
855long GUIOSGView::onRightBtnRelease(FXObject* sender, FXSelector sel,
void* ptr) {
856 FXEvent*
event = (FXEvent*)ptr;
857 myAdapter->getEventQueue()->mouseButtonRelease((
float)
event->click_x, (float)event->click_y, 3);
858 myChanger->onRightBtnRelease(ptr);
859 return FXGLCanvas::onRightBtnRelease(sender, sel, ptr);
864GUIOSGView::onMouseMove(FXObject* sender, FXSelector sel,
void* ptr) {
866 if (myPopup && !myPopup->shown()) {
870 FXEvent*
event = (FXEvent*)ptr;
871 osgGA::GUIEventAdapter* ea = myAdapter->getEventQueue()->mouseMotion((
float)
event->win_x, (float)event->win_y);
872 setWindowCursorPosition(ea->getXnormalized(), ea->getYnormalized());
873 if (myGUIDialogEditViewport !=
nullptr && myGUIDialogEditViewport->shown()) {
874 updateViewportValues();
876 updatePositionInformation();
877 return FXGLCanvas::onMotion(sender, sel, ptr);
882GUIOSGView::onIdle(FXObject* , FXSelector ,
void*) {
891GUIOSGView::onCmdCloseLane(FXObject*, FXSelector,
void*) {
892 GUILane* lane = getLaneUnderCursor();
893 if (lane !=
nullptr) {
904GUIOSGView::onCmdCloseEdge(FXObject*, FXSelector,
void*) {
905 GUILane* lane = getLaneUnderCursor();
906 if (lane !=
nullptr) {
917GUIOSGView::onCmdAddRerouter(FXObject*, FXSelector,
void*) {
918 GUILane* lane = getLaneUnderCursor();
919 if (lane !=
nullptr) {
929GUIOSGView::onCmdShowReachability(FXObject* menu, FXSelector selector,
void*) {
930 GUILane* lane = getLaneUnderCursor();
931 if (lane !=
nullptr) {
935 if (myVisualizationSettings->laneColorer.getActive() != 36) {
936 myVisualizationSettings->laneColorer.setActive(1);
946GUIOSGView::onVisualizationChange(FXObject*, FXSelector,
void*) {
953GUIOSGView::setWindowCursorPosition(
float x,
float y) {
954 myOSGNormalizedCursorX = x;
955 myOSGNormalizedCursorY = y;
960GUIOSGView::calculateRotation(
const osg::Vec3d& lookFrom,
const osg::Vec3d& lookAt,
const osg::Vec3d& up) {
961 osg::Vec3d viewAxis, viewUp, orthogonal, normal;
962 viewAxis = lookFrom - lookAt;
963 viewAxis.normalize();
964 viewUp = (abs(viewAxis[0]) + abs(viewAxis[1]) == 0.) ? osg::Y_AXIS : osg::Z_AXIS;
965 orthogonal = viewUp ^ viewAxis;
966 orthogonal.normalize();
967 normal = viewAxis ^ orthogonal;
968 double angle = atan2((normal ^ up).length() / (normal.length() * up.length()), (normal * up) / (normal.length() * up.length()));
977GUIOSGView::updatePositionInformation()
const {
979 if (getPositionAtCursor(myOSGNormalizedCursorX, myOSGNormalizedCursorY, pos)) {
980 myApp->getCartesianLabel()->setText((
"x:" +
toString(pos.
x()) +
", y:" +
toString(pos.
y())).c_str());
986 myApp->getGeoLabel()->setText(
TL(
"(No projection defined)"));
990 myApp->getCartesianLabel()->setText(
TL(
"N/A"));
991 myApp->getGeoLabel()->setText(
TL(
"N/A"));
997GUIOSGView::getPositionAtCursor(
float xNorm,
float yNorm,
Position& pos)
const {
999 osg::Vec3d lookFrom, lookAt, up, viewAxis;
1000 myViewer->getCameraManipulator()->getInverseMatrix().getLookAt(lookFrom, lookAt, up);
1001 if ((lookAt - lookFrom).z() >= 0.) {
1006 osg::Matrixd iVP = osg::Matrixd::inverse(myViewer->getCamera()->getViewMatrix() * myViewer->getCamera()->getProjectionMatrix());
1007 osg::Vec3 nearPoint = osg::Vec3(xNorm, yNorm, 0.0f) * iVP;
1008 osg::Vec3 farPoint = osg::Vec3(xNorm, yNorm, 1.0f) * iVP;
1009 osg::Vec3 ray = farPoint - nearPoint;
1010 osg::Vec3 groundPos = nearPoint - ray * nearPoint.z() / ray.z();
1011 pos.
setx(groundPos.x());
1012 pos.
sety(groundPos.y());
1018std::vector<GUIGlObject*>
1019GUIOSGView::getGUIGlObjectsUnderCursor() {
1020 std::vector<GUIGlObject*> result;
1021 osgUtil::LineSegmentIntersector::Intersections intersections;
1022 if (myViewer->computeIntersections(myViewer->getCamera(), osgUtil::Intersector::CoordinateFrame::PROJECTION, myOSGNormalizedCursorX, myOSGNormalizedCursorY, intersections)) {
1023 for (
auto intersection : intersections) {
1024 if (!intersection.nodePath.empty()) {
1026 for (osg::Node* currentNode : intersection.nodePath) {
1027 if (currentNode->getName().length() > 0 && currentNode->getName().find(
":") != std::string::npos) {
1028 const std::string objID = currentNode->getName();
1038 result.push_back(o);
1051GUIOSGView::getLaneUnderCursor() {
1052 std::vector<GUIGlObject*> objects = getGUIGlObjectsUnderCursor();
1053 if (objects.size() > 0) {
1054 return dynamic_cast<GUILane*
>(objects[0]);
1062 osg::Vec3d lookFromOSG, lookAtOSG, viewAxis, up;
1063 myViewer->getCameraManipulator()->getInverseMatrix().getLookAt(lookFromOSG, lookAtOSG, up);
1064 lookFromOSG[0] = camera.
x();
1065 lookFromOSG[1] = camera.
y();
1066 lookFromOSG[2] = camera.
z();
1067 lookAtOSG[0] = lookAt.
x();
1068 lookAtOSG[1] = lookAt.
y();
1069 lookAtOSG[2] = lookAt.
z();
1070 viewAxis = lookAtOSG - lookFromOSG;
1071 viewAxis.normalize();
1074 osg::Vec3d cameraUpdate = lookFromOSG + viewAxis * (zoom - 100.);
1075 osg::Vec3d lookAtUpdate = cameraUpdate + viewAxis;
1077 myViewer->getCameraManipulator()->setHomePosition(cameraUpdate, lookAtUpdate, up);
1083GUIOSGView::toOSGColorVector(
RGBColor c,
bool useAlpha) {
1084 return osg::Vec4d(c.
red() / 255., c.
green() / 255., c.
blue() / 255., (useAlpha) ? c.
alpha() / 255. : 1.);
1089 : myParent(parent), myOldCursor(cursor) {
1090 _traits =
new GraphicsContext::Traits();
1093 _traits->width = parent->getWidth();
1094 _traits->height = parent->getHeight();
1095 _traits->windowDecoration =
false;
1096 _traits->doubleBuffer =
true;
1097 _traits->sharedContext = 0;
1099 setState(
new osg::State());
1100 getState()->setGraphicsContext(
this);
1101#ifdef DEBUG_GLERRORS
1102 getState()->setCheckForGLErrors(osg::State::ONCE_PER_ATTRIBUTE);
1103 std::cout <<
"OSG getCheckForGLErrors " << getState()->getCheckForGLErrors() << std::endl;
1105 if (_traits.valid() && _traits->sharedContext != 0) {
1106 getState()->setContextID(_traits->sharedContext->getState()->getContextID());
1107 incrementContextIDUsageCount(getState()->getContextID());
1109 getState()->setContextID(createNewContextID());
1115GUIOSGView::FXOSGAdapter::~FXOSGAdapter() {
1121GUIOSGView::FXOSGAdapter::grabFocus() {
1123 myParent->setFocus();
1128GUIOSGView::FXOSGAdapter::useCursor(
bool cursorOn) {
1130 myParent->setDefaultCursor(myOldCursor);
1132 myParent->setDefaultCursor(NULL);
1138GUIOSGView::FXOSGAdapter::makeCurrentImplementation() {
1139 myParent->makeCurrent();
1145GUIOSGView::FXOSGAdapter::releaseContext() {
1146 myParent->makeNonCurrent();
1152GUIOSGView::FXOSGAdapter::swapBuffersImplementation() {
1153 myParent->swapBuffers();
1158GUIOSGView::PickHandler::handle(
const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& ) {
1159 if (ea.getEventType() == osgGA::GUIEventAdapter::DRAG) {
1161 }
else if (ea.getEventType() == osgGA::GUIEventAdapter::RELEASE && ea.getButton() == osgGA::GUIEventAdapter::RIGHT_MOUSE_BUTTON) {
1163 if (myParent->makeCurrent()) {
1164 std::vector<GUIGlObject*> objects = myParent->getGUIGlObjectsUnderCursor();
1165 if (objects.size() > 0) {
1166 myParent->openObjectDialog(objects);
1168 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)
void releasePersons() const
Allows to use the container for microsimulation again.
const std::set< MSTransportable *, ComparatorNumericalIdLess > & getPersonsSecure() const
Returns this edge's persons set; locks it for microsimulation.
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
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.
Representation of a lane in the micro simulation.
std::vector< MSVehicle * > VehCont
Container for vehicles.
MSEdge & getEdge() const
Returns the lane's edge.
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
MSTLLogicControl & getTLSControl()
Returns the tls logics control.
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
MSVehicleControl & getVehicleControl()
Returns the vehicle control.
SUMOTime duration
The duration of the phase.
A fixed traffic light logic.
virtual void changeStepAndDuration(MSTLLogicControl &tlcontrol, SUMOTime simStep, int step, SUMOTime stepDuration) override
Changes the current phase and her duration.
const MSPhaseDefinition & getPhase(int givenstep) const override
Returns the definition of the phase from the given position within the plan.
Storage for all programs of a single tls.
std::vector< MSTrafficLightLogic * > getAllLogics() const
MSTrafficLightLogic * getActive() const
A class that stores and controls tls and switching of their programs.
void switchTo(const std::string &id, const std::string &programID)
Switches the named (id) tls to the named (programID) program.
TLSLogicVariants & get(const std::string &id) const
Returns the variants of a named tls.
bool isActive(const MSTrafficLightLogic *tl) const
Returns whether the given tls program is the currently active for his tls.
The parent class for traffic light logics.
const LinkVectorVector & getLinks() const
Returns the list of lists of all affected links.
std::vector< MSLane * > LaneVector
Definition of the list of arrival lanes subjected to this tls.
const std::string & getProgramID() const
Returns this tl-logic's id.
const LinkVector & getLinksAt(int i) const
Returns the list of links that are controlled by the signals at the given position.
std::map< std::string, SUMOVehicle * >::const_iterator constVehIt
Definition of the internal vehicles map iterator.
constVehIt loadedVehBegin() const
Returns the begin of the internal vehicle map.
constVehIt loadedVehEnd() const
Returns the end of the internal vehicle map.
Representation of a vehicle in the micro simulation.
bool wasRemoteControlled(SUMOTime lookBack=DELTA_T) const
Returns the information whether the vehicle is fully controlled via TraCI within the lookBack time.
bool isOnRoad() const
Returns the information whether the vehicle is on a road (is simulated)
bool signalSet(int which) const
Returns whether the given signal is on.
Position getPosition(const double offset=0) const
Return current position (x/y, cartesian)
@ VEH_SIGNAL_BLINKER_RIGHT
Right blinker lights are switched on.
@ VEH_SIGNAL_BRAKELIGHT
The brake lights are on.
@ VEH_SIGNAL_BLINKER_LEFT
Left blinker lights are switched on.
@ VEH_SIGNAL_BLINKER_EMERGENCY
Blinker lights on both sides are switched on.
double getSlope() const
Returns the slope of the road at vehicle's position in degrees.
const std::string & getID() const
Returns the id.
A point in 2D or 3D with translation and scaling methods.
void setx(double x)
set position x
double distanceTo(const Position &p2) const
returns the euclidean distance in 3 dimensions
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.