37 #include <osg/ShapeDrawable>
38 #include <osgview/GUIOSGView.h>
68 #ifdef CHECK_MEMORY_LEAKS
70 #endif // CHECK_MEMORY_LEAKS
101 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 };
102 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 };
103 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 };
104 double vehiclePoly_PassengerSedanRightGlass[] = { 0.36, -.43, 0.34, -.47, 0.77, -.47, 0.67, -.37, 0.45, -.37, 0.34, -.47, -10000 };
105 double vehiclePoly_PassengerSedanLeftGlass[] = { 0.36, .43, 0.34, .47, 0.77, .47, 0.67, .37, 0.45, .37, 0.34, .47, -10000 };
106 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 };
107 double vehiclePoly_PassengerHatchbackRightGlass[] = { 0.36, -.43, 0.34, -.47, 0.94, -.47, 0.80, -.37, 0.45, -.37, 0.34, -.47, -10000 };
108 double vehiclePoly_PassengerHatchbackLeftGlass[] = { 0.36, .43, 0.34, .47, 0.94, .47, 0.80, .37, 0.45, .37, 0.34, .47, -10000 };
109 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 };
110 double vehiclePoly_PassengerWagonRightGlass[] = { 0.36, -.43, 0.34, -.47, 0.94, -.47, 0.87, -.37, 0.45, -.37, 0.34, -.47, -10000 };
111 double vehiclePoly_PassengerWagonLeftGlass[] = { 0.36, .43, 0.34, .47, 0.94, .47, 0.87, .37, 0.45, .37, 0.34, .47, -10000 };
112 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 };
114 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 };
115 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 };
116 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 };
117 double vehiclePoly_PassengerVanRightGlass[] = { 0.36, -.43, 0.20, -.47, 0.98, -.47, 0.91, -.37, 0.31, -.37, 0.20, -.47, -10000 };
118 double vehiclePoly_PassengerVanLeftGlass[] = { 0.36, .43, 0.20, .47, 0.98, .47, 0.91, .37, 0.31, .37, 0.20, .47, -10000 };
119 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 };
121 double vehiclePoly_DeliveryMediumRightGlass[] = { 0.21, -.43, 0.20, -.47, 0.38, -.47, 0.38, -.37, 0.31, -.37, 0.20, -.47, -10000 };
122 double vehiclePoly_DeliveryMediumLeftGlass[] = { 0.21, .43, 0.20, .47, 0.38, .47, 0.38, .37, 0.31, .37, 0.20, .47, -10000 };
124 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 };
125 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 };
126 double vehiclePoly_TransportRightGlass[] = { 0.36, -.47, 0.10, -.48, 1.25, -.48, 1.25, -.4, 0.3, -.4, 0.10, -.48, -10000 };
127 double vehiclePoly_TransportLeftGlass[] = { 0.36, .47, 0.10, .48, 1.25, .48, 1.25, .4, 0.3, .4, 0.10, .48, -10000 };
129 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 };
130 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 };
132 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 };
143 GUIGlObject& o, std::map<GUISUMOAbstractView*, int>& additionalVisualizations)
144 :
GUIGLObjectPopupMenu(app, parent, o), myVehiclesAdditionalVisualizations(additionalVisualizations) {
154 if (!static_cast<GUIVehicle*>(myObject)->hasActiveAddVisualisation(myParent,
VO_SHOW_ALL_ROUTES)) {
171 if (!static_cast<GUIVehicle*>(myObject)->hasActiveAddVisualisation(myParent,
VO_SHOW_ROUTE)) {
188 if (!static_cast<GUIVehicle*>(myObject)->hasActiveAddVisualisation(myParent,
VO_SHOW_BEST_LANES)) {
205 if (!static_cast<GUIVehicle*>(myObject)->hasActiveAddVisualisation(myParent,
VO_TRACKED)) {
206 myParent->startTrack(static_cast<GUIVehicle*>(myObject)->
getGlID());
216 myParent->stopTrack();
224 if (!static_cast<GUIVehicle*>(myObject)->hasActiveAddVisualisation(myParent,
VO_SHOW_LFLINKITEMS)) {
250 SUMOReal speedFactor,
int vehicleIndex) :
251 MSVehicle(pars, route, type, speedFactor, vehicleIndex),
263 while (i->first->removeAdditionalGLVisualisation(
this));
266 for (std::map<GUIOSGView*, osg::ShapeDrawable*>::iterator i = myGeom.begin(); i != myGeom.end(); ++i) {
267 i->first->remove(
this);
305 new FXMenuSeparator(ret);
307 if (trackedID < 0 || (
size_t)trackedID !=
getGlID()) {
314 new FXMenuSeparator(ret);
330 ret->
mkItem(
"left same route [#]",
false, (
unsigned int)
getParameter().repetitionNumber);
339 ret->
mkItem(
"waiting time [s]",
true,
341 ret->
mkItem(
"last lane change [s]",
true,
344 ret->
mkItem(
"position [m]",
true,
346 ret->
mkItem(
"speed [m/s]",
true,
348 ret->
mkItem(
"angle",
true,
351 ret->
mkItem(
"CO2 (HBEFA) [mg/s]",
true,
353 ret->
mkItem(
"CO (HBEFA) [mg/s]",
true,
355 ret->
mkItem(
"HC (HBEFA) [mg/s]",
true,
357 ret->
mkItem(
"NOx (HBEFA) [mg/s]",
true,
359 ret->
mkItem(
"PMx (HBEFA) [mg/s]",
true,
361 ret->
mkItem(
"fuel (HBEFA) [ml/s]",
true,
363 ret->
mkItem(
"noise (Harmonoise) [dB]",
true,
384 glBegin(GL_TRIANGLE_STRIP);
386 glVertex2d(-.5, .15);
404 glBegin(GL_TRIANGLES);
416 glTranslated(0, 0, offset * .1);
417 glPolygonOffset(0, offset * -1);
418 glBegin(GL_TRIANGLE_FAN);
420 while (poses[i] > -999) {
421 glVertex2d(poses[i], poses[i + 1]);
438 glRotated(90, 0, 0, 1);
439 glScaled(length, width, 1.);
447 drawPoly(vehiclePoly_PassengerCarBodyFront, 4.5);
449 drawPoly(vehiclePoly_PassengerFrontGlass, 4.5);
452 glTranslated(0, 0, .045);
454 glTranslated(0, 0, -.045);
456 glTranslated(0, 0, .04);
459 glTranslated(0, 0, -.04);
464 glTranslated(.5, 0, 0);
465 glScaled(.25 / (length), 1, 1.);
466 glTranslated(0, 0, .045);
469 glTranslated(0, 0, -.045);
470 glTranslated(0, 0, .04);
473 glTranslated(0, 0, -.04);
483 drawPoly(vehiclePoly_PassengerCarBodyFront, 4.5);
485 drawPoly(vehiclePoly_PassengerFrontGlass, 4.5);
488 drawPoly(vehiclePoly_PassengerVanBody, 4);
490 drawPoly(vehiclePoly_PassengerVanBodyFront, 4.5);
492 drawPoly(vehiclePoly_PassengerVanFrontGlass, 4.5);
493 drawPoly(vehiclePoly_PassengerVanRightGlass, 4.5);
494 drawPoly(vehiclePoly_PassengerVanLeftGlass, 4.5);
495 drawPoly(vehiclePoly_PassengerVanBackGlass, 4.5);
498 drawPoly(vehiclePoly_PassengerVanBody, 4);
500 drawPoly(vehiclePoly_PassengerVanBodyFront, 4.5);
502 drawPoly(vehiclePoly_PassengerVanFrontGlass, 4.5);
503 drawPoly(vehiclePoly_DeliveryMediumRightGlass, 4.5);
504 drawPoly(vehiclePoly_DeliveryMediumLeftGlass, 4.5);
509 glScaled(1. / (length), 1, 1.);
510 drawPoly(vehiclePoly_TransportBody, 4);
512 drawPoly(vehiclePoly_TransportFrontGlass, 4.5);
513 drawPoly(vehiclePoly_TransportRightGlass, 4.5);
514 drawPoly(vehiclePoly_TransportLeftGlass, 4.5);
521 glScaled(1. / (length), 1, 1.);
522 glTranslated(0, 0, .04);
523 glBegin(GL_TRIANGLE_FAN);
524 glVertex2d(ml / 2., 0);
527 glVertex2d(0 + .05, -.5);
528 glVertex2d(ml - .05, -.5);
529 glVertex2d(ml, -.45);
531 glVertex2d(ml - .05, .5);
532 glVertex2d(0 + .05, .5);
536 glTranslated(0, 0, -.04);
538 glTranslated(0, 0, .045);
541 glVertex2d(0 + .05, .48);
542 glVertex2d(0 + .05, -.48);
543 glVertex2d(0 + .15, -.48);
544 glVertex2d(0 + .15, .48);
546 glVertex2d(ml - .1, .45);
547 glVertex2d(ml - .1, -.45);
548 glVertex2d(ml - .05, -.45);
549 glVertex2d(ml - .05, .45);
551 glVertex2d(0 + .20, .49);
552 glVertex2d(0 + .20, .45);
553 glVertex2d(ml - .20, .45);
554 glVertex2d(ml - .20, .49);
556 glVertex2d(0 + .20, -.49);
557 glVertex2d(0 + .20, -.45);
558 glVertex2d(ml - .20, -.45);
559 glVertex2d(ml - .20, -.49);
562 glTranslated(0, 0, -.045);
585 drawPoly(vehiclePoly_EVehicleBody, 4);
587 drawPoly(vehiclePoly_EVehicleFrontGlass, 4.5);
588 glTranslated(0, 0, .048);
593 glVertex2d(.35, -.5);
596 glVertex2d(.3, -.05);
597 glVertex2d(.7, -.05);
603 glVertex2d(.65, -.5);
606 glTranslated(0, 0, -.048);
633 glTranslated(0, 0, 0.1);
635 glTranslated(.4, 0, 0);
637 glTranslated(.4, 0, 0);
644 drawPoly(vehiclePoly_PassengerCarBodyFront, 4.5);
646 drawPoly(vehiclePoly_PassengerFrontGlass, 4.5);
656 glBegin(GL_TRIANGLE_FAN);
657 glVertex2d(1 / 2., 0);
660 glVertex2d(0 + .05, -.05);
661 glVertex2d(1 - .05, -.05);
664 glVertex2d(1 - .05, .05);
665 glVertex2d(0 + .05, .05);
672 glBegin(GL_TRIANGLE_FAN);
673 glVertex2d(1 / 2., 0);
676 glVertex2d(0 + .05, -.2);
677 glVertex2d(1 - .05, -.2);
680 glVertex2d(1 - .05, .2);
681 glVertex2d(0 + .05, .2);
688 drawPoly(vehiclePoly_PassengerSedanRightGlass, 4.5);
689 drawPoly(vehiclePoly_PassengerSedanLeftGlass, 4.5);
690 drawPoly(vehiclePoly_PassengerSedanBackGlass, 4.5);
693 drawPoly(vehiclePoly_PassengerHatchbackRightGlass, 4.5);
694 drawPoly(vehiclePoly_PassengerHatchbackLeftGlass, 4.5);
695 drawPoly(vehiclePoly_PassengerHatchbackBackGlass, 4.5);
698 drawPoly(vehiclePoly_PassengerWagonRightGlass, 4.5);
699 drawPoly(vehiclePoly_PassengerWagonLeftGlass, 4.5);
700 drawPoly(vehiclePoly_PassengerWagonBackGlass, 4.5);
723 glTranslated(0, 0, .1);
726 glTranslated(0, 0, .1);
748 drawPoly(vehiclePoly_PassengerSedanRightGlass, 4.5);
749 drawPoly(vehiclePoly_PassengerSedanLeftGlass, 4.5);
750 drawPoly(vehiclePoly_PassengerSedanBackGlass, 4.5);
844 #define BLINKER_POS_FRONT .5
845 #define BLINKER_POS_BACK .5
849 glColor3d(1.f, .8f, 0);
885 glColor3f(1.f, .2f, 0);
910 glScaled(upscale, upscale, 1);
965 glColor3d(0., 1., 0.);
968 glVertex2d(0., minGap);
969 glVertex2d(-.5, minGap);
970 glVertex2d(.5, minGap);
975 glTranslated(0, 0, .1);
1047 size_t personIndex = 0;
1048 for (std::vector<MSPerson*>::const_iterator i = ps.begin(); i != ps.end(); ++i) {
1050 assert(person != 0);
1062 glTranslated(0, 0,
getType() - .1);
1072 for (
int i = noReroutePlus1 - 1; i >= 0; i--) {
1082 if ((*i).myLink == 0) {
1085 MSLink* link = (*i).myLink;
1089 if ((*i).mySetRequest) {
1090 glColor3d(0, .8, 0);
1092 glColor3d(.8, 0, 0);
1094 const SUMOTime leaveTime = (*i).myLink->getLeaveTime(
1111 glTranslated(pos.
x(), pos.
y(), -.1);
1115 glTranslated(-pos.
x(), -pos.
y(), .1);
1118 const std::vector<MSVehicle::LaneQ>&
1138 switch (activeScheme) {
1179 SUMOReal hue = 180. + atan2(center.
x() - p.
x(), center.
y() - p.
y()) * 180. /
PI;
1188 SUMOReal hue = 180. + atan2(center.
x() - p.
x(), center.
y() - p.
y()) * 180. /
PI;
1197 SUMOReal hue = 180. + atan2(pb.
x() - pe.
x(), pb.
y() - pe.
y()) * 180. /
PI;
1211 switch (activeScheme) {
1274 glGetDoublev(GL_CURRENT_COLOR, colors);
1275 colors[0] -= darken;
1276 if (colors[0] < 0) {
1279 colors[1] -= darken;
1280 if (colors[1] < 0) {
1283 colors[2] -= darken;
1284 if (colors[2] < 0) {
1287 colors[3] -= darken;
1288 if (colors[3] < 0) {
1304 std::vector<std::vector<MSVehicle::LaneQ> > bestLanes =
myBestLanes;
1307 for (std::vector<std::vector<MSVehicle::LaneQ> >::iterator j = bestLanes.begin(); j != bestLanes.end(); ++j) {
1308 std::vector<MSVehicle::LaneQ>& lanes = *j;
1311 for (std::vector<MSVehicle::LaneQ>::const_iterator i = lanes.begin(); i != lanes.end(); ++i) {
1312 gmax =
MAX2((*i).length, gmax);
1313 rmax =
MAX2((*i).occupation, rmax);
1315 for (std::vector<MSVehicle::LaneQ>::const_iterator i = lanes.begin(); i != lanes.end(); ++i) {
1318 SUMOReal r = (*i).occupation / rmax;
1341 for (; i != r.
end(); ++i) {
1342 const GUILane* lane =
static_cast<GUILane*
>((*i)->getLanes()[0]);
1354 }
else if (routeIndex == 0) {
1361 #ifdef HAVE_INTERNAL_LANES
1362 const MSEdge* previousInternal = previous->getInternalFollowingEdge(¤t->
getEdge());
1364 const MSEdge* previousInternal = 0;
1366 if (previousInternal != 0) {
1367 return previousInternal->
getLanes()[0];
1391 const int numCarriages = floor(length / (defaultLength + carriageGap) + 0.5);
1392 assert(numCarriages > 0);
1393 const SUMOReal carriageLengthWithGap = length / numCarriages;
1394 const SUMOReal carriageLength = carriageLengthWithGap - carriageGap;
1400 int backRouteIndex = routeIndex;
1406 if (requiredSeats > 0) {
1410 for (
int i = 0; i < numCarriages; ++i) {
1411 while (carriageOffset < 0) {
1415 while (carriageBackOffset < 0) {
1417 carriageBackOffset += backLane->
getLength();
1422 if (i >= firstPassengerCarriage) {
1426 glTranslated(front.
x(), front.
y(),
getType());
1427 glRotated(angle, 0, 0, 1);
1429 glBegin(GL_TRIANGLE_FAN);
1430 glVertex2d(-halfWidth + xCornerCut, 0);
1431 glVertex2d(-halfWidth, yCornerCut);
1432 glVertex2d(-halfWidth, carriageLength - yCornerCut);
1433 glVertex2d(-halfWidth + xCornerCut, carriageLength);
1434 glVertex2d(halfWidth - xCornerCut, carriageLength);
1435 glVertex2d(halfWidth, carriageLength - yCornerCut);
1436 glVertex2d(halfWidth, yCornerCut);
1437 glVertex2d(halfWidth - xCornerCut, 0);
1441 carriageOffset -= carriageLengthWithGap;
1442 carriageBackOffset -= carriageLengthWithGap;
1466 if (requiredSeats <= 0) {
1469 const Line l(front, back);
1476 for (
SUMOReal p = 2; p <= length - 1; p += 1) {
1492 std::string result =
"";
1494 result +=
"parking";
1496 result +=
"stopped";
1500 if (
myStops.front().triggered) {
1501 result +=
", triggered";
1518 std::vector<const SUMOVehicle*> blockingFoes;
1521 for (std::vector<const SUMOVehicle*>::const_iterator it = blockingFoes.begin(); it != blockingFoes.end(); ++it) {
1524 #ifdef HAVE_INTERNAL_LANES
1526 for (MSLink::LinkLeaders::const_iterator it = linkLeaders.begin(); it != linkLeaders.end(); ++it) {
1529 if ((static_cast<const GUIVehicle*>(leader))->myLinkLeaders.count(
getID()) == 0) {
1540 GUIVehicle::updateColor(GUIOSGView* view) {
1543 myGeom[view]->setColor(osg::Vec4(col.
red() / 255., col.
green() / 255., col.
blue() / 255., col.
alpha() / 255.));