37 #include <osg/ShapeDrawable>
38 #include <osgview/GUIOSGView.h>
66 #ifdef CHECK_MEMORY_LEAKS
68 #endif // CHECK_MEMORY_LEAKS
98 double
vehiclePoly_PassengerCarBody[] = { .5, 0, 0, 0, 0, .3, 0.08, .44, 0.25, .5, 0.95, .5, 1., .4, 1., -.4, 0.95, -.5, 0.25, -.5, 0.08, -.44, 0, -.3, 0, 0, -10000 };
99 double vehiclePoly_PassengerCarBodyFront[] = { 0.1, 0, 0.025, 0, 0.025, 0.25, 0.27, 0.4, 0.27, -.4, 0.025, -0.25, 0.025, 0, -10000 };
100 double vehiclePoly_PassengerFrontGlass[] = { 0.35, 0, 0.3, 0, 0.3, 0.4, 0.43, 0.3, 0.43, -0.3, 0.3, -0.4, 0.3, 0, -10000 };
101 double vehiclePoly_PassengerSedanRightGlass[] = { 0.36, -.43, 0.34, -.47, 0.77, -.47, 0.67, -.37, 0.45, -.37, 0.34, -.47, -10000 };
102 double vehiclePoly_PassengerSedanLeftGlass[] = { 0.36, .43, 0.34, .47, 0.77, .47, 0.67, .37, 0.45, .37, 0.34, .47, -10000 };
103 double vehiclePoly_PassengerSedanBackGlass[] = { 0.80, 0, 0.70, 0, 0.70, 0.3, 0.83, 0.4, 0.83, -.4, 0.70, -.3, 0.70, 0, -10000 };
104 double vehiclePoly_PassengerHatchbackRightGlass[] = { 0.36, -.43, 0.34, -.47, 0.94, -.47, 0.80, -.37, 0.45, -.37, 0.34, -.47, -10000 };
105 double vehiclePoly_PassengerHatchbackLeftGlass[] = { 0.36, .43, 0.34, .47, 0.94, .47, 0.80, .37, 0.45, .37, 0.34, .47, -10000 };
106 double vehiclePoly_PassengerHatchbackBackGlass[] = { 0.92, 0, 0.80, 0, 0.80, 0.3, 0.95, 0.4, 0.95, -.4, 0.80, -.3, 0.80, 0, -10000 };
107 double vehiclePoly_PassengerWagonRightGlass[] = { 0.36, -.43, 0.34, -.47, 0.94, -.47, 0.87, -.37, 0.45, -.37, 0.34, -.47, -10000 };
108 double vehiclePoly_PassengerWagonLeftGlass[] = { 0.36, .43, 0.34, .47, 0.94, .47, 0.87, .37, 0.45, .37, 0.34, .47, -10000 };
109 double vehiclePoly_PassengerWagonBackGlass[] = { 0.92, 0, 0.90, 0, 0.90, 0.3, 0.95, 0.4, 0.95, -.4, 0.90, -.3, 0.90, 0, -10000 };
111 double vehiclePoly_PassengerVanBody[] = { .5, 0, 0, 0, 0, .4, 0.1, .5, 0.97, .5, 1., .47, 1., -.47, 0.97, -.5, 0.1, -.5, 0, -.4, 0, 0, -10000 };
112 double vehiclePoly_PassengerVanBodyFront[] = { 0.1, 0, 0.025, 0, 0.025, 0.25, 0.13, 0.4, 0.13, -.4, 0.025, -0.25, 0.025, 0, -10000 };
113 double vehiclePoly_PassengerVanFrontGlass[] = { 0.21, 0, 0.16, 0, 0.16, 0.4, 0.29, 0.3, 0.29, -0.3, 0.16, -0.4, 0.16, 0, -10000 };
114 double vehiclePoly_PassengerVanRightGlass[] = { 0.36, -.43, 0.20, -.47, 0.98, -.47, 0.91, -.37, 0.31, -.37, 0.20, -.47, -10000 };
115 double vehiclePoly_PassengerVanLeftGlass[] = { 0.36, .43, 0.20, .47, 0.98, .47, 0.91, .37, 0.31, .37, 0.20, .47, -10000 };
116 double vehiclePoly_PassengerVanBackGlass[] = { 0.95, 0, 0.94, 0, 0.94, 0.3, 0.98, 0.4, 0.98, -.4, 0.94, -.3, 0.94, 0, -10000 };
118 double vehiclePoly_DeliveryMediumRightGlass[] = { 0.21, -.43, 0.20, -.47, 0.38, -.47, 0.38, -.37, 0.31, -.37, 0.20, -.47, -10000 };
119 double vehiclePoly_DeliveryMediumLeftGlass[] = { 0.21, .43, 0.20, .47, 0.38, .47, 0.38, .37, 0.31, .37, 0.20, .47, -10000 };
121 double vehiclePoly_TransportBody[] = { .5, 0, 0, 0, 0, .45, 0.05, .5, 2.25, .5, 2.25, -.5, 0.05, -.5, 0, -.45, 0, 0, -10000 };
122 double vehiclePoly_TransportFrontGlass[] = { 0.1, 0, 0.05, 0, 0.05, 0.45, 0.25, 0.4, 0.25, -.4, 0.05, -0.45, 0.05, 0, -10000 };
123 double vehiclePoly_TransportRightGlass[] = { 0.36, -.47, 0.10, -.48, 1.25, -.48, 1.25, -.4, 0.3, -.4, 0.10, -.48, -10000 };
124 double vehiclePoly_TransportLeftGlass[] = { 0.36, .47, 0.10, .48, 1.25, .48, 1.25, .4, 0.3, .4, 0.10, .48, -10000 };
126 double vehiclePoly_EVehicleBody[] = { .5, 0, 0, 0, 0, .3, 0.08, .44, 0.25, .5, 0.75, .5, .92, .44, 1, .3, 1, -.3, .92, -.44, .75, -.5, .25, -.5, 0.08, -.44, 0, -.3, 0, 0, -1000 };
127 double vehiclePoly_EVehicleFrontGlass[] = { .5, 0, 0.05, .05, 0.05, .25, 0.13, .39, 0.3, .45, 0.70, .45, .87, .39, .95, .25, .95, -.25, .87, -.39, .70, -.45, .3, -.45, 0.13, -.39, 0.05, -.25, 0.05, 0.05, -1000 };
129 double vehiclePoly_EVehicleBackGlass[] = { 0.65, 0, 0.9, 0, 0.9, 0.4, 0.57, 0.3, 0.57, -0.3, 0.9, -0.4, 0.9, 0, -10000 };
140 GUIGlObject& o, std::map<GUISUMOAbstractView*, int>& additionalVisualizations)
141 :
GUIGLObjectPopupMenu(app, parent, o), myVehiclesAdditionalVisualizations(additionalVisualizations) {
151 if (!static_cast<GUIVehicle*>(myObject)->hasActiveAddVisualisation(myParent,
VO_SHOW_ALL_ROUTES)) {
168 if (!static_cast<GUIVehicle*>(myObject)->hasActiveAddVisualisation(myParent,
VO_SHOW_ROUTE)) {
185 if (!static_cast<GUIVehicle*>(myObject)->hasActiveAddVisualisation(myParent,
VO_SHOW_BEST_LANES)) {
202 if (!static_cast<GUIVehicle*>(myObject)->hasActiveAddVisualisation(myParent,
VO_TRACKED)) {
203 myParent->startTrack(static_cast<GUIVehicle*>(myObject)->
getGlID());
213 myParent->stopTrack();
221 if (!static_cast<GUIVehicle*>(myObject)->hasActiveAddVisualisation(myParent,
VO_SHOW_LFLINKITEMS)) {
240 SUMOReal speedFactor,
int vehicleIndex) :
241 MSVehicle(pars, route, type, speedFactor, vehicleIndex),
253 while (i->first->removeAdditionalGLVisualisation(
this));
256 for (std::map<GUIOSGView*, osg::ShapeDrawable*>::iterator i = myGeom.begin(); i != myGeom.end(); ++i) {
257 i->first->remove(
this);
295 new FXMenuSeparator(ret);
297 if (trackedID < 0 || (
size_t)trackedID !=
getGlID()) {
302 new FXMenuSeparator(ret);
318 ret->
mkItem(
"left same route [#]",
false, (
unsigned int)
getParameter().repetitionNumber);
327 ret->
mkItem(
"waiting time [s]",
true,
329 ret->
mkItem(
"last lane change [s]",
true,
332 ret->
mkItem(
"position [m]",
true,
334 ret->
mkItem(
"speed [m/s]",
true,
336 ret->
mkItem(
"angle",
true,
338 ret->
mkItem(
"CO2 (HBEFA) [mg/s]",
true,
340 ret->
mkItem(
"CO (HBEFA) [mg/s]",
true,
342 ret->
mkItem(
"HC (HBEFA) [mg/s]",
true,
344 ret->
mkItem(
"NOx (HBEFA) [mg/s]",
true,
346 ret->
mkItem(
"PMx (HBEFA) [mg/s]",
true,
348 ret->
mkItem(
"fuel (HBEFA) [ml/s]",
true,
350 ret->
mkItem(
"noise (Harmonoise) [dB]",
true,
371 glBegin(GL_TRIANGLE_STRIP);
373 glVertex2d(-.5, .15);
391 glBegin(GL_TRIANGLES);
403 glTranslated(0, 0, offset * .1);
404 glPolygonOffset(0, offset * -1);
405 glBegin(GL_TRIANGLE_FAN);
407 while (poses[i] > -999) {
408 glVertex2d(poses[i], poses[i + 1]);
425 glRotated(90, 0, 0, 1);
426 glScaled(length, width, 1.);
434 drawPoly(vehiclePoly_PassengerCarBodyFront, 4.5);
436 drawPoly(vehiclePoly_PassengerFrontGlass, 4.5);
440 glTranslated(0, 0, .045);
442 glTranslated(0, 0, -.045);
444 glTranslated(0, 0, .04);
447 glTranslated(0, 0, -.04);
452 glTranslated(.5, 0, 0);
453 glScaled(.25 / (length), 1, 1.);
454 glTranslated(0, 0, .045);
457 glTranslated(0, 0, -.045);
458 glTranslated(0, 0, .04);
461 glTranslated(0, 0, -.04);
471 drawPoly(vehiclePoly_PassengerCarBodyFront, 4.5);
473 drawPoly(vehiclePoly_PassengerFrontGlass, 4.5);
476 drawPoly(vehiclePoly_PassengerVanBody, 4);
478 drawPoly(vehiclePoly_PassengerVanBodyFront, 4.5);
480 drawPoly(vehiclePoly_PassengerVanFrontGlass, 4.5);
481 drawPoly(vehiclePoly_PassengerVanRightGlass, 4.5);
482 drawPoly(vehiclePoly_PassengerVanLeftGlass, 4.5);
483 drawPoly(vehiclePoly_PassengerVanBackGlass, 4.5);
486 drawPoly(vehiclePoly_PassengerVanBody, 4);
488 drawPoly(vehiclePoly_PassengerVanBodyFront, 4.5);
490 drawPoly(vehiclePoly_PassengerVanFrontGlass, 4.5);
491 drawPoly(vehiclePoly_DeliveryMediumRightGlass, 4.5);
492 drawPoly(vehiclePoly_DeliveryMediumLeftGlass, 4.5);
497 glScaled(1. / (length), 1, 1.);
498 drawPoly(vehiclePoly_TransportBody, 4);
500 drawPoly(vehiclePoly_TransportFrontGlass, 4.5);
501 drawPoly(vehiclePoly_TransportRightGlass, 4.5);
502 drawPoly(vehiclePoly_TransportLeftGlass, 4.5);
509 glScaled(1. / (length), 1, 1.);
510 glTranslated(0, 0, .04);
511 glBegin(GL_TRIANGLE_FAN);
512 glVertex2d(ml / 2., 0);
515 glVertex2d(0 + .05, -.5);
516 glVertex2d(ml - .05, -.5);
517 glVertex2d(ml, -.45);
519 glVertex2d(ml - .05, .5);
520 glVertex2d(0 + .05, .5);
524 glTranslated(0, 0, -.04);
526 glTranslated(0, 0, .045);
529 glVertex2d(0 + .05, .48);
530 glVertex2d(0 + .05, -.48);
531 glVertex2d(0 + .15, -.48);
532 glVertex2d(0 + .15, .48);
534 glVertex2d(ml - .1, .45);
535 glVertex2d(ml - .1, -.45);
536 glVertex2d(ml - .05, -.45);
537 glVertex2d(ml - .05, .45);
539 glVertex2d(0 + .20, .49);
540 glVertex2d(0 + .20, .45);
541 glVertex2d(ml - .20, .45);
542 glVertex2d(ml - .20, .49);
544 glVertex2d(0 + .20, -.49);
545 glVertex2d(0 + .20, -.45);
546 glVertex2d(ml - .20, -.45);
547 glVertex2d(ml - .20, -.49);
550 glTranslated(0, 0, -.045);
573 drawPoly(vehiclePoly_EVehicleBody, 4);
575 drawPoly(vehiclePoly_EVehicleFrontGlass, 4.5);
576 glTranslated(0, 0, .048);
581 glVertex2d(.35, -.5);
584 glVertex2d(.3, -.05);
585 glVertex2d(.7, -.05);
591 glVertex2d(.65, -.5);
594 glTranslated(0, 0, -.048);
621 glTranslated(0, 0, 0.1);
623 glTranslated(.4, 0, 0);
625 glTranslated(.4, 0, 0);
632 drawPoly(vehiclePoly_PassengerCarBodyFront, 4.5);
634 drawPoly(vehiclePoly_PassengerFrontGlass, 4.5);
644 glBegin(GL_TRIANGLE_FAN);
645 glVertex2d(1 / 2., 0);
648 glVertex2d(0 + .05, -.05);
649 glVertex2d(1 - .05, -.05);
652 glVertex2d(1 - .05, .05);
653 glVertex2d(0 + .05, .05);
660 glBegin(GL_TRIANGLE_FAN);
661 glVertex2d(1 / 2., 0);
664 glVertex2d(0 + .05, -.2);
665 glVertex2d(1 - .05, -.2);
668 glVertex2d(1 - .05, .2);
669 glVertex2d(0 + .05, .2);
676 drawPoly(vehiclePoly_PassengerSedanRightGlass, 4.5);
677 drawPoly(vehiclePoly_PassengerSedanLeftGlass, 4.5);
678 drawPoly(vehiclePoly_PassengerSedanBackGlass, 4.5);
681 drawPoly(vehiclePoly_PassengerHatchbackRightGlass, 4.5);
682 drawPoly(vehiclePoly_PassengerHatchbackLeftGlass, 4.5);
683 drawPoly(vehiclePoly_PassengerHatchbackBackGlass, 4.5);
686 drawPoly(vehiclePoly_PassengerWagonRightGlass, 4.5);
687 drawPoly(vehiclePoly_PassengerWagonLeftGlass, 4.5);
688 drawPoly(vehiclePoly_PassengerWagonBackGlass, 4.5);
711 glTranslated(0, 0, .1);
714 glTranslated(0, 0, .1);
736 drawPoly(vehiclePoly_PassengerSedanRightGlass, 4.5);
737 drawPoly(vehiclePoly_PassengerSedanLeftGlass, 4.5);
738 drawPoly(vehiclePoly_PassengerSedanBackGlass, 4.5);
832 #define BLINKER_POS_FRONT .5
833 #define BLINKER_POS_BACK .5
837 glColor3d(1.f, .8f, 0);
873 glColor3f(1.f, .2f, 0);
901 glScaled(upscale, upscale, 1);
956 glColor3d(0., 1., 0.);
959 glVertex2d(0., minGap);
960 glVertex2d(-.5, minGap);
961 glVertex2d(.5, minGap);
966 glTranslated(0, 0, .1);
1039 size_t personIndex = 0;
1040 for (std::vector<MSPerson*>::const_iterator i = ps.begin(); i != ps.end(); ++i) {
1042 assert(person != 0);
1054 glTranslated(0, 0,
getType() - .1);
1064 for (
int i = noReroutePlus1 - 1; i >= 0; i--) {
1074 if ((*i).myLink == 0) {
1077 MSLink* link = (*i).myLink;
1081 if ((*i).mySetRequest) {
1082 glColor3d(0, .8, 0);
1084 glColor3d(.8, 0, 0);
1086 const SUMOTime leaveTime = (*i).myLink->getLeaveTime(
1093 glColor3d(1, 0.65, 0);
1106 glTranslated(pos.
x(), pos.
y(), -.1);
1110 glTranslated(-pos.
x(), -pos.
y(), .1);
1113 const std::vector<MSVehicle::LaneQ>&
1133 switch (activeScheme) {
1174 SUMOReal hue = 180. + atan2(center.
x() - p.
x(), center.
y() - p.
y()) * 180. /
PI;
1183 SUMOReal hue = 180. + atan2(center.
x() - p.
x(), center.
y() - p.
y()) * 180. /
PI;
1192 SUMOReal hue = 180. + atan2(pb.
x() - pe.
x(), pb.
y() - pe.
y()) * 180. /
PI;
1206 switch (activeScheme) {
1267 glGetDoublev(GL_CURRENT_COLOR, colors);
1268 colors[0] -= darken;
1269 if (colors[0] < 0) {
1272 colors[1] -= darken;
1273 if (colors[1] < 0) {
1276 colors[2] -= darken;
1277 if (colors[2] < 0) {
1280 colors[3] -= darken;
1281 if (colors[3] < 0) {
1297 std::vector<std::vector<MSVehicle::LaneQ> > bestLanes =
myBestLanes;
1300 for (std::vector<std::vector<MSVehicle::LaneQ> >::iterator j = bestLanes.begin(); j != bestLanes.end(); ++j) {
1301 std::vector<MSVehicle::LaneQ>& lanes = *j;
1304 for (std::vector<MSVehicle::LaneQ>::const_iterator i = lanes.begin(); i != lanes.end(); ++i) {
1305 gmax =
MAX2((*i).length, gmax);
1306 rmax =
MAX2((*i).occupation, rmax);
1308 for (std::vector<MSVehicle::LaneQ>::const_iterator i = lanes.begin(); i != lanes.end(); ++i) {
1311 SUMOReal r = (*i).occupation / rmax;
1334 for (; i != r.
end(); ++i) {
1357 }
else if (routeIndex == 0) {
1364 #ifdef HAVE_INTERNAL_LANES
1365 const MSEdge* previousInternal = previous->getInternalFollowingEdge(¤t->
getEdge());
1367 const MSEdge* previousInternal = 0;
1369 if (previousInternal != 0) {
1370 return previousInternal->
getLanes()[0];
1394 const int numCarriages = floor(length / (defaultLength + carriageGap) + 0.5);
1395 assert(numCarriages > 0);
1396 const SUMOReal carriageLengthWithGap = length / numCarriages;
1397 const SUMOReal carriageLength = carriageLengthWithGap - carriageGap;
1403 int backRouteIndex = routeIndex;
1409 if (requiredSeats > 0) {
1413 for (
int i = 0; i < numCarriages; ++i) {
1414 while (carriageOffset < 0) {
1418 while (carriageBackOffset < 0) {
1420 carriageBackOffset += backLane->
getLength();
1425 if (i >= firstPassengerCarriage) {
1429 glTranslated(front.
x(), front.
y(),
getType());
1430 glRotated(angle, 0, 0, 1);
1432 glBegin(GL_TRIANGLE_FAN);
1433 glVertex2d(-halfWidth + xCornerCut, 0);
1434 glVertex2d(-halfWidth, yCornerCut);
1435 glVertex2d(-halfWidth, carriageLength - yCornerCut);
1436 glVertex2d(-halfWidth + xCornerCut, carriageLength);
1437 glVertex2d(halfWidth - xCornerCut, carriageLength);
1438 glVertex2d(halfWidth, carriageLength - yCornerCut);
1439 glVertex2d(halfWidth, yCornerCut);
1440 glVertex2d(halfWidth - xCornerCut, 0);
1444 carriageOffset -= carriageLengthWithGap;
1445 carriageBackOffset -= carriageLengthWithGap;
1469 if (requiredSeats <= 0) {
1472 const Line l(front, back);
1479 for (
SUMOReal p = 2; p <= length - 1; p += 1) {
1489 GUIVehicle::updateColor(GUIOSGView* view) {
1492 myGeom[view]->setColor(osg::Vec4(col.
red() / 255., col.
green() / 255., col.
blue() / 255., col.
alpha() / 255.));