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 myFullScreenTextNode =
new osg::Geode();
217 myFullScreenText =
new osgText::Text;
218 myFullScreenText->setCharacterSizeMode(osgText::Text::SCREEN_COORDS);
219 myFullScreenText->setShaderTechnique(osgText::NO_TEXT_SHADER);
220 if (font !=
nullptr) {
221 myFullScreenText->setFont(font);
223 myFullScreenText->setCharacterSize(16.f);
224 myFullScreenText->setAlignment(osgText::TextBase::AlignmentType::RIGHT_BOTTOM);
225 myFullScreenText->setDrawMode(osgText::TextBase::DrawModeMask::FILLEDBOUNDINGBOX | osgText::TextBase::DrawModeMask::TEXT);
226 myFullScreenText->setBoundingBoxColor(osg::Vec4(0.0f, 0.0f, 0.0f, 0.6f));
227 myFullScreenText->setBoundingBoxMargin(6.0f);
228 myFullScreenText->setText(getFullScreenHintText(), osgText::String::ENCODING_UTF8);
229 myFullScreenTextNode->addDrawable(myFullScreenText);
230 myFullScreenTextNode->setNodeMask(0);
232 myHUD =
new osg::Camera;
233 myHUD->setProjectionMatrixAsOrtho2D(0, 800, 0, 800);
234 myHUD->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
235 myHUD->setViewMatrix(osg::Matrix::identity());
236 myHUD->setClearMask(GL_DEPTH_BUFFER_BIT);
237 myHUD->setRenderOrder(osg::Camera::POST_RENDER);
238 myHUD->setAllowEventFocus(
false);
239 myHUD->setGraphicsContext(myAdapter);
240 myHUD->addChild(myTextNode);
241 myHUD->addChild(myFullScreenTextNode);
242 myHUD->setViewport(0, 0, w, h);
243 myViewer->addSlave(myHUD,
false);
244 myCameraManipulator->updateHUDText();
248 osgUtil::Optimizer optimizer;
249 optimizer.optimize(myRoot);
253GUIOSGView::~GUIOSGView() {
255 myViewer->setDone(
true);
259 myCameraManipulator = 0;
263 myFullScreenText = 0;
264 myFullScreenTextNode = 0;
268 myRedYellowLight = 0;
274GUIOSGView::adoptViewSettings() {
276 osg::Light* globalLight = myViewer->getLight();
277 globalLight->setAmbient(toOSGColorVector(myVisualizationSettings->ambient3DLight));
278 globalLight->setDiffuse(toOSGColorVector(myVisualizationSettings->diffuse3DLight));
279 myViewer->getCamera()->setClearColor(toOSGColorVector(myVisualizationSettings->skyColor));
282 osg::Geode* planeGeode =
dynamic_cast<osg::Geode*
>(myPlane->getChild(0));
283 osg::Geometry* planeGeom =
dynamic_cast<osg::Geometry*
>(planeGeode->getChild(0));
284 osg::Vec4ubArray* colors =
dynamic_cast<osg::Vec4ubArray*
>(planeGeom->getColorArray());
285 (*colors)[0].set(myVisualizationSettings->backgroundColor.red(),
286 myVisualizationSettings->backgroundColor.green(),
287 myVisualizationSettings->backgroundColor.blue(),
288 myVisualizationSettings->backgroundColor.alpha());
289 planeGeom->setColorArray(colors);
292 unsigned int cullMask = 0xFFFFFFFF;
293 if (!myVisualizationSettings->show3DTLSDomes) {
294 cullMask &= ~(
unsigned int)NODESET_TLSDOMES;
296 if (!myVisualizationSettings->show3DTLSLinkMarkers) {
297 cullMask &= ~(
unsigned int)NODESET_TLSLINKMARKERS;
299 if (!myVisualizationSettings->generate3DTLSModels) {
300 cullMask &= ~(
unsigned int)NODESET_TLSMODELS;
302 myViewer->getCamera()->setCullMask(cullMask);
303 const unsigned int hudNodeMask = (myVisualizationSettings->show3DHeadUpDisplay) ? 0xFFFFFFFF : 0;
304 myTextNode->setNodeMask(hudNodeMask);
309GUIOSGView::getPositionInformation()
const {
311 getPositionAtCursor(myOSGNormalizedCursorX, myOSGNormalizedCursorY, pos);
317GUIOSGView::is3DView()
const {
327 for (std::vector<std::string>::const_iterator i = names.begin(); i != names.end(); ++i) {
329 if ((*i) == myVisualizationSettings->name) {
336 "Locate Junction",
"Locate a junction within the network.",
"",
341 "Locate Street",
"Locate a street within the network.",
"",
346 "Locate Vehicle",
"Locate a vehicle within the network.",
"",
351 "Locate Person",
"Locate a person within the network.",
"",
356 "Locate Container",
"Locate a container within the network.",
"",
361 "Locate TLS",
"Locate a tls within the network.",
"",
366 "Locate Additional",
"Locate an additional structure within the network.",
"",
371 "Locate POI",
"Locate a POI within the network.",
"",
376 "Locate Polygon",
"Locate a Polygon within the network.",
"",
383GUIOSGView::resize(
int w,
int h) {
384 GUISUMOAbstractView::resize(w, h);
385 updateHUDPosition(w, h);
390GUIOSGView::position(
int x,
int y,
int w,
int h) {
391 GUISUMOAbstractView::position(x, y, w, h);
392 updateHUDPosition(w, h);
397GUIOSGView::updateHUDPosition(
int w,
int h) {
399 myHUD->setProjectionMatrixAsOrtho2D(0, w, 0, h);
400 myText->setPosition(osg::Vec3d(0.,
static_cast<double>(height), 0.));
402 myFullScreenText->setPosition(osg::Vec3d(
static_cast<double>(w) - 12., 12., 0.));
407GUIOSGView::updateHUDText(
const std::string text) {
408 myText->setText(text, osgText::String::ENCODING_UTF8);
413GUIOSGView::recenterView() {
415 Position center = myGrid->getCenter();
416 double radius = std::max(myGrid->xmax() - myGrid->xmin(), myGrid->ymax() - myGrid->ymin());
417 myChanger->centerTo(center, radius);
422GUIOSGView::setColorScheme(
const std::string& name) {
426 if (myGUIDialogViewSettings != 0) {
427 if (myGUIDialogViewSettings->getCurrentScheme() != name) {
428 myGUIDialogViewSettings->setCurrentScheme(name);
432 myVisualizationSettings->
gaming = myApp->isGaming();
440GUIOSGView::onPaint(FXObject*, FXSelector,
void*) {
444 myDecalsLockMutex.lock();
446 if (!d.initialised && d.filename.length() > 0) {
447 if (d.filename.length() == 6 && d.filename.substr(0, 5) ==
"light") {
448 GUIOSGBuilder::buildLight(d, *myRoot);
449 }
else if (d.filename.length() > 3 && d.filename.substr(0, 3) ==
"tl:") {
450 const int linkStringIdx = (int)d.filename.find(
':', 3);
453 const std::string tlLogic = d.filename.substr(3, linkStringIdx - 3);
456 if (linkIdx < 0 || linkIdx >=
static_cast<int>(vars.
getActive()->
getLinks().size())) {
460 osg::Group* tlNode = GUIOSGBuilder::getTrafficLight(d, vars, link, myGreenLight, myYellowLight, myRedLight, myRedYellowLight, myPoleBase,
true, 0.5);
461 tlNode->setName(
"tlLogic:" + tlLogic);
462 myRoot->addChild(tlNode);
469 GUIOSGBuilder::buildDecal(d, *myRoot);
471 d.initialised =
true;
474 myDecalsLockMutex.unlock();
477 for (
auto& item : myVehicles) {
478 item.second.active =
false;
483 for (
const MSEdge* e : net->getEdgeControl().getEdges()) {
484 for (
const MSLane* l : e->getLanes()) {
491 auto itVeh = myVehicles.find(veh);
492 if (itVeh == myVehicles.end()) {
493 myVehicles[veh] = GUIOSGBuilder::buildMovable(veh->
getVehicleType());
494 myRoot->addChild(myVehicles[veh].pos);
495 myVehicles[veh].pos->setName(
"vehicle:" + veh->
getID());
496 veh->setNode(myVehicles[veh].pos);
498 itVeh->second.active =
true;
500 osg::PositionAttitudeTransform* n = myVehicles[veh].pos;
503 const double slope = -veh->
getSlope();
504 n->setAttitude(osg::Quat(osg::DegreesToRadians(slope), osg::Vec3(1, 0, 0),
505 0, osg::Vec3(0, 1, 0),
506 dir, osg::Vec3(0, 0, 1)));
519 if (myVisualizationSettings->ignoreColorSchemeFor3DVehicles) {
520 myVehicles[veh].activateMaterial(
false);
522 myVehicles[veh].activateMaterial(
true);
525 col = myVisualizationSettings->vehicleColorer.getScheme().getColor(veh->
getColorValue(*myVisualizationSettings, myVisualizationSettings->vehicleColorer.getActive()));
527 myVehicles[veh].mat->setDiffuse(osg::Material::FRONT_AND_BACK, osg::Vec4d(col.
red() / 255., col.
green() / 255., col.
blue() / 255., col.
alpha() / 255.));
533 l->releaseVehicles();
537 for (
auto veh = myVehicles.begin(); veh != myVehicles.end();) {
538 if (!veh->second.active) {
539 removeVeh((veh++)->first);
546 if (now != myLastUpdate || (myGUIDialogViewSettings != 0 && myGUIDialogViewSettings->shown())) {
549 if (now != myLastUpdate && myTracked != 0) {
550 osg::Vec3d lookFrom, lookAt, up;
551 lookAt[0] = myTracked->getPosition().x();
552 lookAt[1] = myTracked->getPosition().y();
553 lookAt[2] = myTracked->getPosition().z();
554 const double angle = myTracked->getAngle();
555 lookFrom[0] = lookAt[0] + 50. * cos(angle);
556 lookFrom[1] = lookAt[1] + 50. * sin(angle);
557 lookFrom[2] = lookAt[2] + 10.;
559 m.makeLookAt(lookFrom, lookAt, osg::Z_AXIS);
560 myViewer->getCameraManipulator()->setByInverseMatrix(m);
564 for (
auto& item : myPersons) {
565 item.second.active =
false;
568 for (
const MSEdge* e : net->getEdgeControl().getEdges()) {
570 const std::set<MSTransportable*, ComparatorNumericalIdLess>& persons = ge->
getPersonsSecure();
571 for (
auto person : persons) {
572 if (person->hasArrived() || !person->hasDeparted()) {
576 auto itPers = myPersons.find(person);
577 if (itPers == myPersons.end()) {
578 myPersons[person] = GUIOSGBuilder::buildMovable(person->getVehicleType());
579 myRoot->addChild(myPersons[person].pos);
581 itPers->second.active =
true;
583 osg::PositionAttitudeTransform* n = myPersons[person].pos;
584 const Position pos = person->getPosition();
585 n->setPosition(osg::Vec3d(pos.
x(), pos.
y(), pos.
z()));
586 const double dir = person->getAngle() +
M_PI / 2.;
587 n->setAttitude(osg::Quat(dir, osg::Vec3d(0, 0, 1)));
592 col = myVisualizationSettings->personColorer.getScheme().getColor(actualPerson->
getColorValue(*myVisualizationSettings, myVisualizationSettings->vehicleColorer.getActive()));
594 myPersons[person].mat->setDiffuse(osg::Material::FRONT_AND_BACK, osg::Vec4d(col.
red() / 255., col.
green() / 255., col.
blue() / 255., col.
alpha() / 255.));
600 for (
auto person = myPersons.begin(); person != myPersons.end();) {
601 if (!person->second.active) {
602 removeTransportable((person++)->first);
608 if (myAdapter->makeCurrent()) {
609 myFullScreenTextNode->setNodeMask(myApp->isFullScreen() ? 0xFFFFFFFF : 0);
620 if (myTracked == veh) {
623 std::map<MSVehicle*, OSGMovable>::iterator i = myVehicles.find(veh);
624 if (i != myVehicles.end()) {
625 myRoot->removeChild(i->second.pos);
633 std::map<MSTransportable*, OSGMovable>::iterator i = myPersons.find(t);
634 if (i != myPersons.end()) {
635 myRoot->removeChild(i->second.pos);
641void GUIOSGView::updateViewportValues() {
642 osg::Vec3d lookFrom, lookAt, up;
643 myViewer->getCameraManipulator()->getInverseMatrix().getLookAt(lookFrom, lookAt, up);
644 myGUIDialogEditViewport->setValues(
Position(lookFrom[0], lookFrom[1], lookFrom[2]),
645 Position(lookAt[0], lookAt[1], lookAt[2]), calculateRotation(lookFrom, lookAt, up));
650GUIOSGView::showViewportEditor() {
652 osg::Vec3d lookFrom, lookAt, up;
653 myViewer->getCameraManipulator()->getInverseMatrix().getLookAt(lookFrom, lookAt, up);
654 Position from(lookFrom[0], lookFrom[1], lookFrom[2]), at(lookAt[0], lookAt[1], lookAt[2]);
655 myGUIDialogEditViewport->setOldValues(from, at, calculateRotation(lookFrom, lookAt, up));
656 myGUIDialogEditViewport->setZoomValue(100);
657 myGUIDialogEditViewport->show();
662GUIOSGView::setViewportFromToRot(
const Position& lookFrom,
const Position& lookAt,
double rotation) {
663 osg::Vec3d lookFromOSG, lookAtOSG, up;
664 lookFromOSG[0] = lookFrom.
x();
665 lookFromOSG[1] = lookFrom.
y();
666 lookFromOSG[2] = lookFrom.
z();
667 lookAtOSG[0] = lookAt.
x();
668 lookAtOSG[1] = lookAt.
y();
669 lookAtOSG[2] = lookAt.
z();
671 osg::Vec3d viewAxis, viewUp, orthogonal, normal;
672 viewAxis = lookFromOSG - lookAtOSG;
673 viewAxis.normalize();
674 viewUp = (viewAxis[0] + viewAxis[1] == 0.) ? osg::Vec3d(0., 1., 0.) : osg::Vec3d(0., 0., 1.);
675 orthogonal = viewUp ^ viewAxis;
676 orthogonal.normalize();
677 normal = viewAxis ^ orthogonal;
679 rotation = std::fmod(rotation, 360.);
683 myChanger->setRotation(rotation);
684 double angle =
DEG2RAD(rotation);
685 up = normal * cos(angle) - orthogonal * sin(angle);
688 double zoom = (myGUIDialogEditViewport !=
nullptr) ? myGUIDialogEditViewport->getZoomValue() : 100.;
689 lookFromOSG = lookFromOSG + viewAxis * (100. - zoom);
690 lookAtOSG = lookFromOSG - viewAxis;
691 myViewer->getCameraManipulator()->setHomePosition(lookFromOSG, lookAtOSG, up);
698 osg::Vec3d lookFrom, lookAt, up;
699 myViewer->getCameraManipulator()->getHomePosition(lookFrom, lookAt, up);
701 Position(lookAt[0], lookAt[1], lookAt[2]), 0);
706GUIOSGView::startTrack(
int id) {
707 if (myTracked == 0 || (
int)myTracked->getGlID() !=
id) {
712 if ((
int)veh->getGlID() ==
id) {
713 if (!veh->
isOnRoad() || myVehicles.find(veh) == myVehicles.end()) {
720 if (myTracked != 0) {
721 osg::Vec3d lookFrom, lookAt, up;
723 lookAt[1] = myTracked->getPosition().y();
724 lookAt[2] = myTracked->getPosition().z();
725 lookFrom[0] = lookAt[0] + 50.;
726 lookFrom[1] = lookAt[1] + 50.;
727 lookFrom[2] = lookAt[2] + 10.;
729 m.makeLookAt(lookFrom, lookAt, osg::Z_AXIS);
730 myViewer->getCameraManipulator()->setByInverseMatrix(m);
737GUIOSGView::stopTrack() {
743GUIOSGView::getTrackedID()
const {
749GUIOSGView::onGamingClick(
Position pos) {
752 double minDist = std::numeric_limits<double>::infinity();
757 if (lanes.size() > 0) {
758 const Position& endPos = lanes[0]->getShape().back();
768 const std::vector<MSTrafficLightLogic*> logics = vars.
getAllLogics();
769 if (logics.size() > 1) {
771 for (
int i = 0; i < (int)logics.size() - 1; i++) {
772 if (minTll->
getProgramID() == logics[i]->getProgramID()) {
777 if (l == logics[0]) {
788GUIOSGView::getCurrentTimeStep()
const {
793long GUIOSGView::onConfigure(FXObject* sender, FXSelector sel,
void* ptr) {
795 const int w = getWidth();
796 const int h = getHeight();
797 if (w > 0 && h > 0) {
798 myAdapter->getEventQueue()->windowResize(0, 0, w, h);
799 myAdapter->resized(0, 0, w, h);
800 updateHUDPosition(w, h);
802 return FXGLCanvas::onConfigure(sender, sel, ptr);
806long GUIOSGView::onKeyPress(FXObject* sender, FXSelector sel,
void* ptr) {
807 int key = ((FXEvent*)ptr)->code;
808 myAdapter->getEventQueue()->keyPress(key);
810 if (key == FX::KEY_f || key == FX::KEY_Left || key == FX::KEY_Right || key == FX::KEY_Up || key == FX::KEY_Down) {
813 return FXGLCanvas::onKeyPress(sender, sel, ptr);
817long GUIOSGView::onKeyRelease(FXObject* sender, FXSelector sel,
void* ptr) {
818 int key = ((FXEvent*)ptr)->code;
819 myAdapter->getEventQueue()->keyRelease(key);
821 if (key == FX::KEY_f || key == FX::KEY_Left || key == FX::KEY_Right || key == FX::KEY_Up || key == FX::KEY_Down) {
824 return FXGLCanvas::onKeyRelease(sender, sel, ptr);
828long GUIOSGView::onLeftBtnPress(FXObject* sender, FXSelector sel,
void* ptr) {
829 handle(
this, FXSEL(SEL_FOCUS_SELF, 0), ptr);
831 FXEvent*
event = (FXEvent*)ptr;
832 myAdapter->getEventQueue()->mouseButtonPress((
float)
event->click_x, (float)event->click_y, 1);
833 if (myApp->isGaming()) {
834 onGamingClick(getPositionInformation());
837 return FXGLCanvas::onLeftBtnPress(sender, sel, ptr);
841long GUIOSGView::onLeftBtnRelease(FXObject* sender, FXSelector sel,
void* ptr) {
842 FXEvent*
event = (FXEvent*)ptr;
843 myAdapter->getEventQueue()->mouseButtonRelease((
float)
event->click_x, (float)event->click_y, 1);
844 myChanger->onLeftBtnRelease(ptr);
845 return FXGLCanvas::onLeftBtnRelease(sender, sel, ptr);
849long GUIOSGView::onMiddleBtnPress(FXObject* sender, FXSelector sel,
void* ptr) {
850 handle(
this, FXSEL(SEL_FOCUS_SELF, 0), ptr);
852 FXEvent*
event = (FXEvent*)ptr;
853 myAdapter->getEventQueue()->mouseButtonPress((
float)
event->click_x, (float)event->click_y, 2);
855 return FXGLCanvas::onMiddleBtnPress(sender, sel, ptr);
859long GUIOSGView::onMiddleBtnRelease(FXObject* sender, FXSelector sel,
void* ptr) {
860 FXEvent*
event = (FXEvent*)ptr;
861 myAdapter->getEventQueue()->mouseButtonRelease((
float)
event->click_x, (float)event->click_y, 2);
862 myChanger->onMiddleBtnRelease(ptr);
863 return FXGLCanvas::onMiddleBtnRelease(sender, sel, ptr);
867long GUIOSGView::onRightBtnPress(FXObject* sender, FXSelector sel,
void* ptr) {
868 handle(
this, FXSEL(SEL_FOCUS_SELF, 0), ptr);
870 FXEvent*
event = (FXEvent*)ptr;
871 myAdapter->getEventQueue()->mouseButtonPress((
float)
event->click_x, (float)event->click_y, 3);
873 return FXGLCanvas::onRightBtnPress(sender, sel, ptr);
877long GUIOSGView::onRightBtnRelease(FXObject* sender, FXSelector sel,
void* ptr) {
878 FXEvent*
event = (FXEvent*)ptr;
879 myAdapter->getEventQueue()->mouseButtonRelease((
float)
event->click_x, (float)event->click_y, 3);
880 myChanger->onRightBtnRelease(ptr);
881 return FXGLCanvas::onRightBtnRelease(sender, sel, ptr);
886GUIOSGView::onMouseMove(FXObject* sender, FXSelector sel,
void* ptr) {
888 if (myPopup && !myPopup->shown()) {
892 FXEvent*
event = (FXEvent*)ptr;
893 osgGA::GUIEventAdapter* ea = myAdapter->getEventQueue()->mouseMotion((
float)
event->win_x, (float)event->win_y);
894 setWindowCursorPosition(ea->getXnormalized(), ea->getYnormalized());
895 if (myGUIDialogEditViewport !=
nullptr && myGUIDialogEditViewport->shown()) {
896 updateViewportValues();
898 updatePositionInformation();
899 return FXGLCanvas::onMotion(sender, sel, ptr);
904GUIOSGView::onIdle(FXObject* , FXSelector ,
void*) {
913GUIOSGView::onCmdCloseLane(FXObject*, FXSelector,
void*) {
914 GUILane* lane = getLaneUnderCursor();
915 if (lane !=
nullptr) {
926GUIOSGView::onCmdCloseEdge(FXObject*, FXSelector,
void*) {
927 GUILane* lane = getLaneUnderCursor();
928 if (lane !=
nullptr) {
939GUIOSGView::onCmdAddRerouter(FXObject*, FXSelector,
void*) {
940 GUILane* lane = getLaneUnderCursor();
941 if (lane !=
nullptr) {
951GUIOSGView::onCmdShowReachability(FXObject* menu, FXSelector selector,
void*) {
952 GUILane* lane = getLaneUnderCursor();
953 if (lane !=
nullptr) {
957 if (myVisualizationSettings->laneColorer.getActive() != 36) {
958 myVisualizationSettings->laneColorer.setActive(1);
968GUIOSGView::onVisualizationChange(FXObject*, FXSelector,
void*) {
975GUIOSGView::setWindowCursorPosition(
float x,
float y) {
976 myOSGNormalizedCursorX = x;
977 myOSGNormalizedCursorY = y;
982GUIOSGView::calculateRotation(
const osg::Vec3d& lookFrom,
const osg::Vec3d& lookAt,
const osg::Vec3d& up) {
983 osg::Vec3d viewAxis, viewUp, orthogonal, normal;
984 viewAxis = lookFrom - lookAt;
985 viewAxis.normalize();
986 viewUp = (abs(viewAxis[0]) + abs(viewAxis[1]) == 0.) ? osg::Y_AXIS : osg::Z_AXIS;
987 orthogonal = viewUp ^ viewAxis;
988 orthogonal.normalize();
989 normal = viewAxis ^ orthogonal;
990 double angle = atan2((normal ^ up).length() / (normal.length() * up.length()), (normal * up) / (normal.length() * up.length()));
999GUIOSGView::updatePositionInformation()
const {
1001 if (getPositionAtCursor(myOSGNormalizedCursorX, myOSGNormalizedCursorY, pos)) {
1002 if (!myApp->getCartesianLabel()->hasFocus()) {
1003 myApp->getCartesianLabel()->setText((
"x:" +
toString(pos.
x()) +
", y:" +
toString(pos.
y())).c_str());
1006 if (!myApp->getGeoLabel()->hasFocus()) {
1009 if (!myApp->getGeoLabel()->isEnabled()) {
1010 myApp->getGeoLabel()->enable();
1011 myApp->getGeoLabel()->setEditable(
true);
1015 myApp->getGeoLabel()->setText(
TL(
"(No projection defined)"));
1016 if (myApp->getGeoLabel()->isEnabled()) {
1017 myApp->getGeoLabel()->disable();
1018 myApp->getGeoLabel()->setEditable(
false);
1024 if (!myApp->getCartesianLabel()->hasFocus()) {
1025 myApp->getCartesianLabel()->setText(
TL(
"N/A"));
1027 if (!myApp->getGeoLabel()->hasFocus()) {
1029 myApp->getGeoLabel()->setText(
TL(
"N/A"));
1031 myApp->getGeoLabel()->setText(
TL(
"(No projection defined)"));
1032 if (myApp->getGeoLabel()->isEnabled()) {
1033 myApp->getGeoLabel()->disable();
1034 myApp->getGeoLabel()->setEditable(
false);
1043GUIOSGView::getPositionAtCursor(
float xNorm,
float yNorm,
Position& pos)
const {
1045 osg::Vec3d lookFrom, lookAt, up, viewAxis;
1046 myViewer->getCameraManipulator()->getInverseMatrix().getLookAt(lookFrom, lookAt, up);
1047 if ((lookAt - lookFrom).z() >= 0.) {
1052 osg::Matrixd iVP = osg::Matrixd::inverse(myViewer->getCamera()->getViewMatrix() * myViewer->getCamera()->getProjectionMatrix());
1053 osg::Vec3 nearPoint = osg::Vec3(xNorm, yNorm, 0.0f) * iVP;
1054 osg::Vec3 farPoint = osg::Vec3(xNorm, yNorm, 1.0f) * iVP;
1055 osg::Vec3 ray = farPoint - nearPoint;
1056 osg::Vec3 groundPos = nearPoint - ray * nearPoint.z() / ray.z();
1057 pos.
setx(groundPos.x());
1058 pos.
sety(groundPos.y());
1064std::vector<GUIGlObject*>
1065GUIOSGView::getGUIGlObjectsUnderCursor() {
1066 std::vector<GUIGlObject*> result;
1067 osgUtil::LineSegmentIntersector::Intersections intersections;
1068 if (myViewer->computeIntersections(myViewer->getCamera(), osgUtil::Intersector::CoordinateFrame::PROJECTION, myOSGNormalizedCursorX, myOSGNormalizedCursorY, intersections)) {
1069 for (
auto intersection : intersections) {
1070 if (!intersection.nodePath.empty()) {
1072 for (osg::Node* currentNode : intersection.nodePath) {
1073 if (currentNode->getName().length() > 0 && currentNode->getName().find(
":") != std::string::npos) {
1074 const std::string objID = currentNode->getName();
1084 result.push_back(o);
1097GUIOSGView::getLaneUnderCursor() {
1098 std::vector<GUIGlObject*> objects = getGUIGlObjectsUnderCursor();
1099 if (objects.size() > 0) {
1100 return dynamic_cast<GUILane*
>(objects[0]);
1108 osg::Vec3d lookFromOSG, lookAtOSG, viewAxis, up;
1109 myViewer->getCameraManipulator()->getInverseMatrix().getLookAt(lookFromOSG, lookAtOSG, up);
1110 lookFromOSG[0] = camera.
x();
1111 lookFromOSG[1] = camera.
y();
1112 lookFromOSG[2] = camera.
z();
1113 lookAtOSG[0] = lookAt.
x();
1114 lookAtOSG[1] = lookAt.
y();
1115 lookAtOSG[2] = lookAt.
z();
1116 viewAxis = lookAtOSG - lookFromOSG;
1117 viewAxis.normalize();
1120 osg::Vec3d cameraUpdate = lookFromOSG + viewAxis * (zoom - 100.);
1121 osg::Vec3d lookAtUpdate = cameraUpdate + viewAxis;
1123 myViewer->getCameraManipulator()->setHomePosition(cameraUpdate, lookAtUpdate, up);
1129GUIOSGView::toOSGColorVector(
RGBColor c,
bool useAlpha) {
1130 return osg::Vec4d(c.
red() / 255., c.
green() / 255., c.
blue() / 255., (useAlpha) ? c.
alpha() / 255. : 1.);
1135 : myParent(parent), myOldCursor(cursor) {
1136 _traits =
new GraphicsContext::Traits();
1139 _traits->width = parent->getWidth();
1140 _traits->height = parent->getHeight();
1141 _traits->windowDecoration =
false;
1142 _traits->doubleBuffer =
true;
1143 _traits->sharedContext = 0;
1145 setState(
new osg::State());
1146 getState()->setGraphicsContext(
this);
1147#ifdef DEBUG_GLERRORS
1148 getState()->setCheckForGLErrors(osg::State::ONCE_PER_ATTRIBUTE);
1149 std::cout <<
"OSG getCheckForGLErrors " << getState()->getCheckForGLErrors() << std::endl;
1151 if (_traits.valid() && _traits->sharedContext != 0) {
1152 getState()->setContextID(_traits->sharedContext->getState()->getContextID());
1153 incrementContextIDUsageCount(getState()->getContextID());
1155 getState()->setContextID(createNewContextID());
1161GUIOSGView::FXOSGAdapter::~FXOSGAdapter() {
1167GUIOSGView::FXOSGAdapter::grabFocus() {
1169 myParent->setFocus();
1174GUIOSGView::FXOSGAdapter::useCursor(
bool cursorOn) {
1176 myParent->setDefaultCursor(myOldCursor);
1178 myParent->setDefaultCursor(NULL);
1184GUIOSGView::FXOSGAdapter::makeCurrentImplementation() {
1185 myParent->makeCurrent();
1191GUIOSGView::FXOSGAdapter::releaseContext() {
1192 myParent->makeNonCurrent();
1198GUIOSGView::FXOSGAdapter::swapBuffersImplementation() {
1199 myParent->swapBuffers();
1204GUIOSGView::PickHandler::handle(
const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& ) {
1205 if (ea.getEventType() == osgGA::GUIEventAdapter::DRAG) {
1207 }
else if (ea.getEventType() == osgGA::GUIEventAdapter::RELEASE && ea.getButton() == osgGA::GUIEventAdapter::RIGHT_MOUSE_BUTTON) {
1209 if (myParent->makeCurrent()) {
1210 std::vector<GUIGlObject*> objects = myParent->getGUIGlObjectsUnderCursor();
1211 if (objects.size() > 0) {
1212 myParent->openObjectDialog(objects);
1214 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 override
Return current angle.
Position getPosition(const double offset=0) const override
Return current position (x/y, cartesian)
double getColorValue(const GUIVisualizationSettings &s, int activeScheme) const override
gets the color value according to the current scheme index
static long showLaneReachability(GUILane *lane, FXObject *, FXSelector)
bool gaming
whether the application is in gaming mode or not
static const GeoConvHelper & getFinal()
the coordinate transformation for writing the location element and for tracking the original coordina...
void cartesian2geo(Position &cartesian) const
Converts the given cartesian (shifted) position to its geo (lat/long) representation.
long setCurrentItem(const FXint index, FXbool notify=FALSE)
Set the current item (index is zero-based)
FXint getNumItems() const
Return the number of items in the list.
FXint appendIconItem(const FXString &text, FXIcon *icon=nullptr, FXColor bgColor=FXRGB(255, 255, 255), void *ptr=nullptr)
append icon item in the last position
bool isParking() const
Returns whether the vehicle is parking.
const MSVehicleType & getVehicleType() const
Returns the vehicle's type definition.
A road/street connecting two junctions.
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.