Path: blob/main/src/utils/gui/div/GUIBaseVehicleHelper.cpp
169684 views
/****************************************************************************/1// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo2// Copyright (C) 2001-2025 German Aerospace Center (DLR) and others.3// This program and the accompanying materials are made available under the4// terms of the Eclipse Public License 2.0 which is available at5// https://www.eclipse.org/legal/epl-2.0/6// This Source Code may also be made available under the following Secondary7// Licenses when the conditions for such availability set forth in the Eclipse8// Public License 2.0 are satisfied: GNU General Public License, version 29// or later which is available at10// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html11// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later12/****************************************************************************/13/// @file GUIBaseVehicleHelper.cpp14/// @author Pablo Alvarez Lopez15/// @author Mirko Barthauer16/// @date Feb 201817///18// Functions used in GUIBaseVehicleHelper and GNEVehicle19/****************************************************************************/20#include <config.h>21#include <utils/foxtools/fxheader.h>2223#include <utils/geom/PositionVector.h>24#include <utils/gui/globjects/GLIncludes.h>25#include <utils/gui/images/GUITexturesHelper.h>26#include <utils/common/SUMOVehicleClass.h>27#include <utils/gui/settings/GUIVisualizationSettings.h>28#include "GLHelper.h"29#include "GUIBaseVehicleHelper.h"303132// ===========================================================================33// data definitions34// ===========================================================================35/* -------------------------------------------------------------------------36* drawed shapes37* ----------------------------------------------------------------------- */38static const 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 };39static const 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 };40static const 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 };41static const double vehiclePoly_PassengerSedanRightGlass[] = { 0.36, -.43, 0.34, -.47, 0.77, -.47, 0.67, -.37, 0.45, -.37, 0.34, -.47, -10000 };42static const double vehiclePoly_PassengerSedanLeftGlass[] = { 0.36, .43, 0.34, .47, 0.77, .47, 0.67, .37, 0.45, .37, 0.34, .47, -10000 };43static const 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 };44static const double vehiclePoly_PassengerHatchbackRightGlass[] = { 0.36, -.43, 0.34, -.47, 0.94, -.47, 0.80, -.37, 0.45, -.37, 0.34, -.47, -10000 };45static const double vehiclePoly_PassengerHatchbackLeftGlass[] = { 0.36, .43, 0.34, .47, 0.94, .47, 0.80, .37, 0.45, .37, 0.34, .47, -10000 };46static const 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 };47static const double vehiclePoly_PassengerWagonRightGlass[] = { 0.36, -.43, 0.34, -.47, 0.94, -.47, 0.87, -.37, 0.45, -.37, 0.34, -.47, -10000 };48static const double vehiclePoly_PassengerWagonLeftGlass[] = { 0.36, .43, 0.34, .47, 0.94, .47, 0.87, .37, 0.45, .37, 0.34, .47, -10000 };49static const 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 };5051static const 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 };52static const 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 };53static const 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 };54static const double vehiclePoly_PassengerVanRightGlass[] = { 0.36, -.43, 0.20, -.47, 0.98, -.47, 0.91, -.37, 0.31, -.37, 0.20, -.47, -10000 };55static const double vehiclePoly_PassengerVanLeftGlass[] = { 0.36, .43, 0.20, .47, 0.98, .47, 0.91, .37, 0.31, .37, 0.20, .47, -10000 };56static const 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 };5758static const double vehiclePoly_TaxiSign[] = { .56, .241, .56, -.241, .49, -.241, .49, .241, -10000 };5960static const double vehiclePoly_DeliveryMediumRightGlass[] = { 0.21, -.43, 0.20, -.47, 0.38, -.47, 0.38, -.37, 0.31, -.37, 0.20, -.47, -10000 };61static const double vehiclePoly_DeliveryMediumLeftGlass[] = { 0.21, .43, 0.20, .47, 0.38, .47, 0.38, .37, 0.31, .37, 0.20, .47, -10000 };6263static const 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 };64static const 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 };65static const double vehiclePoly_TransportRightGlass[] = { 0.36, -.47, 0.10, -.48, 1.25, -.48, 1.25, -.4, 0.3, -.4, 0.10, -.48, -10000 };66static const double vehiclePoly_TransportLeftGlass[] = { 0.36, .47, 0.10, .48, 1.25, .48, 1.25, .4, 0.3, .4, 0.10, .48, -10000 };6768static const 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 };69static const 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 };70//static const double vehiclePoly_EVehicleFrontGlass[] = { 0.35,0, 0.1,0, 0.1,0.4, 0.43,0.3, 0.43,-0.3, 0.1,-0.4, 0.1,0, -10000 };71//static const 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 };7273static const double vehiclePoly_Ship[] = { 0.25, 0, 0, 0, 0.1, 0.25, 0.2, 0.45, 0.25, 0.5, 0.95, 0.5, 1.0, 0.45, 1.0, -0.45, 0.95, -0.5, 0.25, -0.5, 0.2, -0.45, 0.1, -0.25, 0, 0, -10000 };74static const double vehiclePoly_ShipDeck[] = { 0.5, 0, 0.25, 0.4, 0.95, 0.4, 0.95, -0.4, 0.25, -0.4, 0.25, 0.4, -10000 };75static const double vehiclePoly_ShipSuperStructure[] = { 0.8, 0, 0.5, 0.3, 0.85, 0.3, 0.85, -0.3, 0.5, -0.3, 0.5, 0.3, -10000 };7677static const double vehiclePoly_Cyclist[] = { 0.5, 0, 0.25, 0.45, 0.25, 0.5, 0.8, 0.15, 0.8, -0.15, 0.25, -0.5, 0.25, -0.45, -10000 };78static const double vehiclePoly_BicycleSeat[] = { 0.565, 0, 0.570, 0.03, 0.575, 0.05, 0.585, 0.06, 0.645, 0.06, 0.665, 0.07, 0.685, 0.10, 0.695, 0.13, 0.715, 0.16, 0.735, 0.18, 0.742, 0.17, 0.745, 0.16, 0.755, 0.13, 0.76, 0.11, 0.765, 0, 0.76, -0.11, 0.755, -0.13, 0.745, -0.16, 0.742, -0.17, 0.735, -0.18, 0.715, -0.16, 0.695, -0.13, 0.685, -0.10, 0.665, -0.07, 0.645, -0.06, 0.585, -0.06, 0.575, -0.05, 0.57, -0.03, -10000 };79static const double vehiclePoly_MotorcycleSeat[] = { 0.5, 0, 0.503, 0.072, 0.506, 0.097, 0.518, 0.135, 0.539, 0.162, 0.567, 0.183, 0.641, 0.194, 0.698, 0.202, 0.706, 0.194, 0.713, 0.189, 0.721, 0.162, 0.729, 0.132, 0.732, 0.097, 0.734, 0.051, 0.735, 0, 0.734, -0.051, 0.732, -0.097, 0.729, -0.132, 0.721, -0.162, 0.713, -0.189, 0.706, -0.194, 0.698, -0.202, 0.641, -0.194, 0.567, -0.183, 0.539, -0.162, 0.518, -0.135, 0.506, -0.097, 0.503, -0.072, -10000 };8081static const double vehiclePoly_EmergencySign[] = { .2, .5, -.2, .5, -.2, -.5, .2, -.5, -10000 };82static const double vehiclePoly_Emergency[] = { .1, .1, -.1, .1, -.1, -.1, .1, -.1, -10000 };83static const double vehiclePoly_Emergency2[] = { .04, .3, -.04, .3, -.04, -.3, .04, -.3, -10000 };8485static const double vehiclePoly_EmergencyLadder[] = { -.5, .3, .5, .3, .5, .2, -.5, .2, -10000 };86static const double vehiclePoly_EmergencyLadder2[] = { -.5, -.3, .5, -.3, .5, -.2, -.5, -.2, -10000 };87static const double vehiclePoly_EmergencyLadder3[] = { -.45, .3, -.4, .3, -.4, -.3, -.45, -.3, -10000 };88static const double vehiclePoly_EmergencyLadder4[] = { .45, .3, .4, .3, .4, -.3, .45, -.3, -10000 };89static const double vehiclePoly_EmergencyLadder5[] = { .05, .3, .0, .3, .0, -.3, .05, -.3, -10000 };90static const double vehiclePoly_EmergencyLadder6[] = { -.25, .3, -.2, .3, -.2, -.3, -.25, -.3, -10000 };91static const double vehiclePoly_EmergencyLadder7[] = { .25, .3, .2, .3, .2, -.3, .25, -.3, -10000 };9293static const double vehiclePoly_scooterBase[] = { -.17, .5, -.2, .5, -.2, -.5, -.17, -.5, -10000 };94static const double vehiclePoly_scooterBase2[] = { .98, .05, 1., .05, 1., -.05, .98, -.05, -10000 };95static const double vehiclePoly_scooterBase3[] = { -.32, .6, .32, .6, .32, -.6, -.32, -.6, -10000 };9697static const double vehiclePoly_aircraft[] = {0.633, -0.500, 0.609, -0.465, 0.563, -0.460, 0.517, -0.168, 0.413, -0.156, 0.509, -0.053, 0.509, 0.053, 0.413, -0.156, 0.413, 0.156, 0.385, -0.101, 0.385, 0.101, 0.354, -0.058, 0.354, 0.058, 0.109, -0.050, 0.109, 0.050, 0, -0.003, 0, 0.003, 0, 0.003, 0.633, 0.500, 0.633, 0.500, 0.609, 0.465, 0.563, 0.460, 0.517, 0.168, 0.413, 0.156, 0.509, 0.053, 0.385, 0.101, 0.326, 0.158, 0.326, 0.108, 0.413, 0.156, 0.385, 0.101, 0.509, 0.053, 0.509, -0.053, 0.761, 0.043, 0.761, -0.043, 0.830, 0.030, 0.830, -0.030, 0.952, -0.196, 0.933, -0.196, 0.907, -0.008, 0.830, 0.030, 0.933, 0.196, 0.952, 0.196, 0.907, 0.008, 0.830, 0.030, 0.907, -0.008, 1.000, 0.003, 0.907, 0.008, 0.354, -0.058, 0.509, -0.053, 0.413, -0.156, 0.385, -0.101, 0.326, -0.158, 0.326, -0.108, 0.385, -0.101, -10000};98static const double vehiclePoly_aircraftEngines[] = {0.326, -0.158, 0.413, -0.156, 0.326, -0.108, 0.385, -0.101, 0.385, -0.101, 0.385, 0.101, 0.385, 0.101, 0.326, 0.108, 0.413, 0.156, 0.326, 0.158, -10000};99//static const double vehiclePoly_Rickshaw[] = { 0.5, 0, 0.25, 0.45, 0.25, 0.5, 0.8, 0.15, 0.8, -0.15, 0.25, -0.5, 0.25, -0.45, -10000 };100101// ===========================================================================102// method definitions103// ===========================================================================104105void106GUIBaseVehicleHelper::drawPoly(const double* poses, const double offset) {107GLHelper::pushMatrix();108glTranslated(0, 0, offset * .1);109glPolygonOffset(0, (GLfloat) - offset);110glBegin(GL_TRIANGLE_FAN);111int i = 0;112while (poses[i] > -999) {113glVertex2d(poses[i], poses[i + 1]);114i = i + 2;115}116glEnd();117GLHelper::popMatrix();118}119120void121GUIBaseVehicleHelper::drawAction_drawVehicleAsBoxPlus(const double width, const double length, bool amReversed) {122GLHelper::pushMatrix();123glScaled(width, length, 1.);124glBegin(GL_TRIANGLE_STRIP);125if (amReversed) {126glVertex2d(-.5, 0.);127glVertex2d(.5, 0.);128glVertex2d(-.5, .85);129glVertex2d(.5, .85);130glVertex2d(0., 1.);131} else {132glVertex2d(0., 0.);133glVertex2d(-.5, .15);134glVertex2d(.5, .15);135glVertex2d(-.5, 1.);136glVertex2d(.5, 1.);137}138glEnd();139GLHelper::popMatrix();140}141142143void144GUIBaseVehicleHelper::drawAction_drawVehicleAsTrianglePlus(const double width, const double length, bool amReversed) {145if (length >= 8.) {146drawAction_drawVehicleAsBoxPlus(width, length, amReversed);147return;148}149GLHelper::pushMatrix();150glScaled(width, length, 1.);151glBegin(GL_TRIANGLES);152if (amReversed) {153glVertex2d(0., 1.);154glVertex2d(-.5, 0.);155glVertex2d(.5, 0.);156} else {157glVertex2d(0., 0.);158glVertex2d(-.5, 1.);159glVertex2d(.5, 1.);160}161glEnd();162GLHelper::popMatrix();163}164165166void167GUIBaseVehicleHelper::drawAction_drawVehicleAsCircle(const double width, double detail) {168const int steps = MIN2(MAX2(16, int(detail / 5)), 64);169GLHelper::drawFilledCircle(width / 2, steps);170}171172void173GUIBaseVehicleHelper::drawAction_drawVehicleAsPoly(const GUIVisualizationSettings& s, const SUMOVehicleShape shape, const double width, const double length,174int carriageIndex, bool isStopped, bool amReversed) {175UNUSED_PARAMETER(s);176RGBColor current = GLHelper::getColor();177RGBColor lighter = current.changedBrightness(51);178RGBColor darker = current.changedBrightness(-51);179GLHelper::pushMatrix();180glRotated(90, 0, 0, 1);181182glScaled(length, width, 1.);183184// If the vehicle is 'logically' reversed then reverse the drawing box185// NB at the moment the only vehicles that will have amReversed set true are trains. Here this supports a train with guiShape="aircraft"186if (amReversed) {187glRotatef(180, 0, 0, 1);188glTranslated(-1, 0, 0);189}190191// draw main body192switch (shape) {193case SUMOVehicleShape::UNKNOWN:194drawPoly(vehiclePoly_PassengerCarBody, 4);195GLHelper::setColor(lighter);196drawPoly(vehiclePoly_PassengerCarBodyFront, 4.5);197glColor3d(0, 0, 0);198drawPoly(vehiclePoly_PassengerFrontGlass, 4.5);199break;200case SUMOVehicleShape::PEDESTRIAN:201glTranslated(0, 0, .045);202GLHelper::drawFilledCircle(0.25);203glTranslated(0, 0, -.045);204glScaled(.7, 2, 1);205glTranslated(0, 0, .04);206GLHelper::setColor(lighter);207GLHelper::drawFilledCircle(0.25);208glTranslated(0, 0, -.04);209break;210case SUMOVehicleShape::BICYCLE:211case SUMOVehicleShape::MOPED:212case SUMOVehicleShape::MOTORCYCLE: {213darker = current.changedBrightness(-50);214if (!isStopped) {215// body216drawPoly(vehiclePoly_Cyclist, 4);217// head218GLHelper::pushMatrix();219glTranslated(0.4, 0, .5);220glScaled(0.1, 0.2, 1);221GLHelper::setColor(darker);222GLHelper::drawFilledCircle(1);223GLHelper::popMatrix();224} else if (shape == SUMOVehicleShape::BICYCLE) {225// seat226GLHelper::setColor(darker);227drawPoly(vehiclePoly_BicycleSeat, 4);228} else {229// seat230GLHelper::setColor(darker);231drawPoly(vehiclePoly_MotorcycleSeat, 4);232}233// bike frame234GLHelper::setColor(RGBColor::GREY);235GLHelper::pushMatrix();236glTranslated(0.5, 0, .3);237glScaled(0.5, 0.05, 1);238GLHelper::drawFilledCircle(1);239GLHelper::popMatrix();240// handle bar241GLHelper::pushMatrix();242glTranslated(0.25, 0, .3);243glScaled(0.02, 0.5, 1);244GLHelper::drawFilledCircle(1);245GLHelper::popMatrix();246}247break;248case SUMOVehicleShape::PASSENGER:249case SUMOVehicleShape::PASSENGER_SEDAN:250case SUMOVehicleShape::PASSENGER_HATCHBACK:251case SUMOVehicleShape::PASSENGER_WAGON:252case SUMOVehicleShape::TAXI:253drawPoly(vehiclePoly_PassengerCarBody, 4);254GLHelper::setColor(lighter);255drawPoly(vehiclePoly_PassengerCarBodyFront, 4.5);256glColor3d(0, 0, 0);257drawPoly(vehiclePoly_PassengerFrontGlass, 4.5);258break;259case SUMOVehicleShape::PASSENGER_VAN:260drawPoly(vehiclePoly_PassengerVanBody, 4);261GLHelper::setColor(lighter);262drawPoly(vehiclePoly_PassengerVanBodyFront, 4.5);263glColor3d(0, 0, 0);264drawPoly(vehiclePoly_PassengerVanFrontGlass, 4.5);265drawPoly(vehiclePoly_PassengerVanRightGlass, 4.5);266drawPoly(vehiclePoly_PassengerVanLeftGlass, 4.5);267drawPoly(vehiclePoly_PassengerVanBackGlass, 4.5);268break;269case SUMOVehicleShape::DELIVERY:270drawPoly(vehiclePoly_PassengerVanBody, 4);271GLHelper::setColor(lighter);272drawPoly(vehiclePoly_PassengerVanBodyFront, 4.5);273glColor3d(0, 0, 0);274drawPoly(vehiclePoly_PassengerVanFrontGlass, 4.5);275drawPoly(vehiclePoly_DeliveryMediumRightGlass, 4.5);276drawPoly(vehiclePoly_DeliveryMediumLeftGlass, 4.5);277break;278case SUMOVehicleShape::TRUCK:279case SUMOVehicleShape::TRUCK_SEMITRAILER:280case SUMOVehicleShape::TRUCK_1TRAILER:281if (carriageIndex < 1) {282glScaled(1. / length, 1, 1.);283drawPoly(vehiclePoly_TransportBody, 4);284glColor3d(0, 0, 0);285drawPoly(vehiclePoly_TransportFrontGlass, 4.5);286drawPoly(vehiclePoly_TransportRightGlass, 4.5);287drawPoly(vehiclePoly_TransportLeftGlass, 4.5);288}289break;290case SUMOVehicleShape::BUS:291case SUMOVehicleShape::BUS_COACH:292case SUMOVehicleShape::BUS_TROLLEY: {293double ml = length;294glScaled(1. / (length), 1, 1.);295glTranslated(0, 0, .04);296glBegin(GL_TRIANGLE_FAN);297glVertex2d(ml / 2., 0);298glVertex2d(0, 0);299glVertex2d(0, -.45);300glVertex2d(0 + .05, -.5);301glVertex2d(ml - .05, -.5);302glVertex2d(ml, -.45);303glVertex2d(ml, .45);304glVertex2d(ml - .05, .5);305glVertex2d(0 + .05, .5);306glVertex2d(0, .45);307glVertex2d(0, 0);308glEnd();309glTranslated(0, 0, -.04);310311glTranslated(0, 0, .045);312glColor3d(0, 0, 0);313glBegin(GL_QUADS);314glVertex2d(0 + .05, .48);315glVertex2d(0 + .05, -.48);316glVertex2d(0 + .15, -.48);317glVertex2d(0 + .15, .48);318319glVertex2d(ml - .1, .45);320glVertex2d(ml - .1, -.45);321glVertex2d(ml - .05, -.45);322glVertex2d(ml - .05, .45);323324glVertex2d(0 + .20, .49);325glVertex2d(0 + .20, .45);326glVertex2d(ml - .20, .45);327glVertex2d(ml - .20, .49);328329glVertex2d(0 + .20, -.49);330glVertex2d(0 + .20, -.45);331glVertex2d(ml - .20, -.45);332glVertex2d(ml - .20, -.49);333334glEnd();335glTranslated(0, 0, -.045);336}337break;338case SUMOVehicleShape::BUS_FLEXIBLE:339case SUMOVehicleShape::RAIL:340case SUMOVehicleShape::RAIL_CAR:341case SUMOVehicleShape::RAIL_CARGO: {342// generic rail carriage (see GUIVehicle::drawAction_drawCarriageClass)343glRotated(-90, 0, 0, 1);344const double xCornerCut = 0.3 / width;345const double yCornerCut = 0.4 / length;346const double drawnCarriageLength = 1;347const double halfWidth = 0.5;348glBegin(GL_TRIANGLE_FAN);349glVertex2d(-halfWidth + xCornerCut, 0);350glVertex2d(-halfWidth, yCornerCut);351glVertex2d(-halfWidth, drawnCarriageLength - yCornerCut);352glVertex2d(-halfWidth + xCornerCut, drawnCarriageLength);353glVertex2d(halfWidth - xCornerCut, drawnCarriageLength);354glVertex2d(halfWidth, drawnCarriageLength - yCornerCut);355glVertex2d(halfWidth, yCornerCut);356glVertex2d(halfWidth - xCornerCut, 0);357glEnd();358// assume we are only rendering the head of the train (carriage rendering was disabled via param)359glTranslated(0, 0, 0.1);360glColor3d(0, 0, 0);361glBegin(GL_TRIANGLE_FAN);362glVertex2d(-halfWidth + 2 * xCornerCut, yCornerCut);363glVertex2d(-halfWidth + xCornerCut, 3 * yCornerCut);364glVertex2d(halfWidth - xCornerCut, 3 * yCornerCut);365glVertex2d(halfWidth - 2 * xCornerCut, yCornerCut);366glEnd();367}368break;369370case SUMOVehicleShape::E_VEHICLE:371drawPoly(vehiclePoly_EVehicleBody, 4);372GLHelper::setColor(darker);373drawPoly(vehiclePoly_EVehicleFrontGlass, 4.5);374glTranslated(0, 0, .048);375GLHelper::setColor(current);376glBegin(GL_QUADS);377glVertex2d(.3, .5);378glVertex2d(.35, .5);379glVertex2d(.35, -.5);380glVertex2d(.3, -.5);381382glVertex2d(.3, -.05);383glVertex2d(.7, -.05);384glVertex2d(.7, .05);385glVertex2d(.3, .05);386387glVertex2d(.7, .5);388glVertex2d(.65, .5);389glVertex2d(.65, -.5);390glVertex2d(.7, -.5);391glEnd();392glTranslated(0, 0, -.048);393//drawPoly(vehiclePoly_EVehicleBackGlass, 4.5);394break;395case SUMOVehicleShape::ANT:396GLHelper::pushMatrix();397// ant is stretched via vehicle length398GLHelper::setColor(darker);399// draw left side400GLHelper::drawBoxLine(Position(-0.2, -.10), 350, 0.5, .02);401GLHelper::drawBoxLine(Position(-0.3, -.50), 240, 0.4, .03);402GLHelper::drawBoxLine(Position(0.3, -.10), 340, 0.8, .03);403GLHelper::drawBoxLine(Position(0.05, -.80), 290, 0.6, .04);404GLHelper::drawBoxLine(Position(0.4, -.10), 20, 0.8, .03);405GLHelper::drawBoxLine(Position(0.65, -.80), 75, 0.6, .04);406GLHelper::drawBoxLine(Position(0.5, -.10), 55, 0.8, .04);407GLHelper::drawBoxLine(Position(1.1, -.55), 90, 0.6, .04);408// draw right side409GLHelper::drawBoxLine(Position(-0.2, .10), 190, 0.5, .02);410GLHelper::drawBoxLine(Position(-0.3, .50), 300, 0.4, .03);411GLHelper::drawBoxLine(Position(0.3, .10), 200, 0.8, .03);412GLHelper::drawBoxLine(Position(0.05, .80), 250, 0.6, .04);413GLHelper::drawBoxLine(Position(0.4, .10), 160, 0.8, .03);414GLHelper::drawBoxLine(Position(0.65, .80), 105, 0.6, .04);415GLHelper::drawBoxLine(Position(0.5, .10), 125, 0.8, .04);416GLHelper::drawBoxLine(Position(1.1, .55), 90, 0.6, .04);417// draw body418GLHelper::setColor(current);419glTranslated(0, 0, 0.1);420GLHelper::drawFilledCircle(.25, 16);421glTranslated(.4, 0, 0);422GLHelper::drawFilledCircle(.2, 16);423glTranslated(.4, 0, 0);424GLHelper::drawFilledCircle(.3, 16);425GLHelper::popMatrix();426break;427case SUMOVehicleShape::SHIP: {428drawPoly(vehiclePoly_Ship, 4);429GLHelper::setColor(current.changedBrightness(-30));430drawPoly(vehiclePoly_ShipDeck, 5);431GLHelper::setColor(current.changedBrightness(-70));432drawPoly(vehiclePoly_ShipSuperStructure, 6);433break;434}435case SUMOVehicleShape::EMERGENCY: // similar to delivery436drawPoly(vehiclePoly_PassengerVanBody, 4);437GLHelper::setColor(darker);438drawPoly(vehiclePoly_PassengerVanBodyFront, 4.5);439glColor3d(0, 0, 0);440drawPoly(vehiclePoly_PassengerVanFrontGlass, 4.5);441drawPoly(vehiclePoly_DeliveryMediumRightGlass, 4.5);442drawPoly(vehiclePoly_DeliveryMediumLeftGlass, 4.5);443// first aid sign444glTranslated(0.7, 0, 0);445glColor3d(.18, .55, .34);446drawPoly(vehiclePoly_EmergencySign, 4.5);447glColor3d(1, 1, 1);448drawPoly(vehiclePoly_Emergency, 5);449drawPoly(vehiclePoly_Emergency2, 5);450break;451case SUMOVehicleShape::FIREBRIGADE: // similar to delivery in red orange452drawPoly(vehiclePoly_PassengerVanBody, 4);453GLHelper::setColor(lighter);454drawPoly(vehiclePoly_PassengerVanBodyFront, 4.5);455glColor3d(0, 0, 0);456drawPoly(vehiclePoly_PassengerVanFrontGlass, 4.5);457drawPoly(vehiclePoly_DeliveryMediumRightGlass, 4.5);458drawPoly(vehiclePoly_DeliveryMediumLeftGlass, 4.5);459// draw ladder460glTranslated(0.7, 0, 0);461glColor3d(1, .5, 0);462drawPoly(vehiclePoly_EmergencySign, 4.5);463glColor3d(.5, .5, .5);464drawPoly(vehiclePoly_EmergencyLadder, 5);465drawPoly(vehiclePoly_EmergencyLadder2, 5);466drawPoly(vehiclePoly_EmergencyLadder3, 5);467drawPoly(vehiclePoly_EmergencyLadder4, 5);468drawPoly(vehiclePoly_EmergencyLadder5, 5);469drawPoly(vehiclePoly_EmergencyLadder6, 5);470drawPoly(vehiclePoly_EmergencyLadder7, 5);471break;472case SUMOVehicleShape::POLICE: // similar to passenger grey with blue473drawPoly(vehiclePoly_PassengerCarBody, 4);474GLHelper::setColor(lighter);475drawPoly(vehiclePoly_PassengerCarBodyFront, 4.5);476glColor3d(0, 0, 0);477drawPoly(vehiclePoly_PassengerFrontGlass, 4.5);478// first aid sign479glTranslated(0.7, 0, 0);480glColor3d(.5, .5, .5);481drawPoly(vehiclePoly_EmergencySign, 4.5);482glColor3d(0, 0, 1);483drawPoly(vehiclePoly_Emergency, 5);484drawPoly(vehiclePoly_Emergency2, 5);485break;486case SUMOVehicleShape::RICKSHAW: // Rickshaw487drawPoly(vehiclePoly_PassengerCarBody, 4);488// wheels489GLHelper::setColor(darker);490GLHelper::pushMatrix();491glTranslated(.5, .5, -0.1);492GLHelper::drawFilledCircle(.3, 6);493GLHelper::popMatrix();494//other wheel495GLHelper::pushMatrix();496glTranslated(.5, -.5, -0.1);497GLHelper::drawFilledCircle(.3, 6);498GLHelper::popMatrix();499break;500501case SUMOVehicleShape::AIRCRAFT: // Aircraft polygon has many points but we do not expect to have high numbers of aircraft being visualised!502GLHelper::pushMatrix();503glBegin(GL_TRIANGLE_STRIP);504{505int i = 0;506while (vehiclePoly_aircraft[i] > -999) {507glVertex2d(vehiclePoly_aircraft[i], vehiclePoly_aircraft[i + 1]);508i = i + 2;509}510}511glEnd();512GLHelper::setColor(current.changedBrightness(-30));513glTranslated(0, 0, 0.1);514glBegin(GL_TRIANGLE_STRIP);515{516int i = 0;517while (vehiclePoly_aircraftEngines[i] > -999) {518glVertex2d(vehiclePoly_aircraftEngines[i], vehiclePoly_aircraftEngines[i + 1]);519i = i + 2;520}521}522glEnd();523GLHelper::popMatrix();524// navigation lights525glColor3d(1.f, 0, 0);526GLHelper::pushMatrix();527glTranslated(0.62, -0.49, 0.1);528GLHelper::drawFilledCircle(-.01, 6);529GLHelper::popMatrix();530glColor3d(0, 1.f, 0);531GLHelper::pushMatrix();532glTranslated(0.62, 0.49, 0.1);533GLHelper::drawFilledCircle(-.01, 6);534GLHelper::popMatrix();535break;536537case SUMOVehicleShape::SCOOTER: {538RGBColor darker2 = current.changedBrightness(-25);539GLHelper::pushMatrix();540// front small oval541GLHelper::setColor(darker);542glTranslated(0.2, 0, 0.15); // glTranslated(0.3, 0, 0.15);543glScaled(0.09, 0.13, 0.7); // was glScaled(0.04, 0.06, 0.7);544GLHelper::drawFilledCircle(1, 20);545GLHelper::popMatrix();546// handlebar547GLHelper::pushMatrix();548glTranslated(0.42, 0, 0.1); // was glTranslated(0.5, 0, 0.1);549glColor3d(0.3, 0.3, 0.3);550drawPoly(vehiclePoly_scooterBase, 5);551GLHelper::popMatrix();552// front oval553GLHelper::pushMatrix();554GLHelper::setColor(darker2);555glTranslated(0.17, 0, 0.1); // was glTranslated(0.29, 0, 0.1);556glScaled(0.17, 0.19, 0.9); // was glScaled(0.07, 0.08, 0.9);557GLHelper::drawFilledCircle(1, 20);558GLHelper::popMatrix();559// tail rectangle560GLHelper::pushMatrix();561glColor3d(0.3, 0.3, 0.3);562drawPoly(vehiclePoly_scooterBase2, 5);563// tail oval564GLHelper::setColor(darker2);565glTranslated(0.83, 0, 0.1); // was glTranslated(0.71, 0, 0.1);566glScaled(0.17, 0.17, 0.9); // was glScaled(0.07, 0.08, 0.9);567GLHelper::drawFilledCircle(1, 20);568GLHelper::popMatrix();569// base oval570GLHelper::pushMatrix();571GLHelper::setColor(lighter);572glTranslated(0.5, 0, 0.1); // was glTranslated(0.5, 0, 0.1);573glScaled(0.5, 0.28, 0.9); // was glScaled(0.28, 0.14, 0.9);574GLHelper::drawFilledCircle(1, 30);575// center rectangle576GLHelper::setColor(current);577drawPoly(vehiclePoly_scooterBase3, 5);578GLHelper::popMatrix();579break;580}581default: // same as passenger582drawPoly(vehiclePoly_PassengerCarBody, 4);583glColor3d(1, 1, 1);584drawPoly(vehiclePoly_PassengerCarBodyFront, 4.5);585glColor3d(0, 0, 0);586drawPoly(vehiclePoly_PassengerFrontGlass, 4.5);587break;588}589590// draw decorations591switch (shape) {592case SUMOVehicleShape::PEDESTRIAN:593break;594case SUMOVehicleShape::BICYCLE:595//glScaled(length, 1, 1.);596glBegin(GL_TRIANGLE_FAN);597glVertex2d(1 / 2., 0);598glVertex2d(0, 0);599glVertex2d(0, -.03);600glVertex2d(0 + .05, -.05);601glVertex2d(1 - .05, -.05);602glVertex2d(1, -.03);603glVertex2d(1, .03);604glVertex2d(1 - .05, .05);605glVertex2d(0 + .05, .05);606glVertex2d(0, .03);607glVertex2d(0, 0);608glEnd();609break;610case SUMOVehicleShape::MOPED:611case SUMOVehicleShape::MOTORCYCLE:612//glScaled(length, 1, 1.);613glBegin(GL_TRIANGLE_FAN);614glVertex2d(1 / 2., 0);615glVertex2d(0, 0);616glVertex2d(0, -.03);617glVertex2d(0 + .05, -.2);618glVertex2d(1 - .05, -.2);619glVertex2d(1, -.03);620glVertex2d(1, .03);621glVertex2d(1 - .05, .2);622glVertex2d(0 + .05, .2);623glVertex2d(0, .03);624glVertex2d(0, 0);625glEnd();626break;627case SUMOVehicleShape::PASSENGER:628case SUMOVehicleShape::PASSENGER_SEDAN:629drawPoly(vehiclePoly_PassengerSedanRightGlass, 4.5);630drawPoly(vehiclePoly_PassengerSedanLeftGlass, 4.5);631drawPoly(vehiclePoly_PassengerSedanBackGlass, 4.5);632break;633case SUMOVehicleShape::PASSENGER_HATCHBACK:634drawPoly(vehiclePoly_PassengerHatchbackRightGlass, 4.5);635drawPoly(vehiclePoly_PassengerHatchbackLeftGlass, 4.5);636drawPoly(vehiclePoly_PassengerHatchbackBackGlass, 4.5);637break;638case SUMOVehicleShape::PASSENGER_WAGON:639drawPoly(vehiclePoly_PassengerWagonRightGlass, 4.5);640drawPoly(vehiclePoly_PassengerWagonLeftGlass, 4.5);641drawPoly(vehiclePoly_PassengerWagonBackGlass, 4.5);642break;643case SUMOVehicleShape::PASSENGER_VAN:644case SUMOVehicleShape::DELIVERY:645break;646case SUMOVehicleShape::TAXI:647drawPoly(vehiclePoly_PassengerSedanRightGlass, 4.5);648drawPoly(vehiclePoly_PassengerSedanLeftGlass, 4.5);649drawPoly(vehiclePoly_PassengerSedanBackGlass, 4.5);650651glTranslated(0, 0, 6);652glColor3d(0, 0, 0);653// square-pattern in front654glRectd(0.146, 0.24675, 0.171, 0.176);655glRectd(0.121, 0.176, 0.146, 0.1055);656glRectd(0.146, 0.1055, 0.171, 0.035);657glRectd(0.121, 0.035, 0.146, -0.035);658glRectd(0.146, -0.1055, 0.171, -0.035);659glRectd(0.121, -0.176, 0.146, -0.1055);660glRectd(0.146, -0.24675, 0.171, -0.176);661// square-pattern at the back662glRectd(0.913, 0.24675, 0.938, 0.176);663glRectd(0.888, 0.176, 0.913, 0.1055);664glRectd(0.888, 0.176, 0.913, 0.1055);665glRectd(0.913, 0.1055, 0.938, 0.035);666glRectd(0.888, 0.035, 0.913, -0.035);667glRectd(0.913, -0.1055, 0.938, -0.035);668glRectd(0.888, -0.176, 0.913, -0.1055);669glRectd(0.888, -0.176, 0.913, -0.1055);670glRectd(0.913, -0.24675, 0.938, -0.176);671672GLHelper::setColor(darker);673drawPoly(vehiclePoly_TaxiSign, 5);674glScaled(0.2, 0.5, 1);675GLHelper::drawText("TAXI", Position(2.58, 0), 5, 0.3, RGBColor::BLACK, 90);676break;677case SUMOVehicleShape::TRUCK:678GLHelper::setColor(current);679GLHelper::drawBoxLine(Position(2.3, 0), 90., length - 2.3, .5);680break;681case SUMOVehicleShape::TRUCK_SEMITRAILER:682if (carriageIndex < 0) {683GLHelper::setColor(current);684GLHelper::drawBoxLine(Position(2.8, 0), 90., length - 2.8, .5);685}686break;687case SUMOVehicleShape::TRUCK_1TRAILER: {688GLHelper::setColor(current);689double l = length - 2.3;690if (carriageIndex != 0) {691l = l / 2.;692GLHelper::drawBoxLine(Position(2.3, 0), 90., l, .5);693GLHelper::drawBoxLine(Position(2.3 + l + .5, 0), 90., l - .5, .5);694} else {695GLHelper::drawBoxLine(Position(2.3, 0), 90., l, .5);696}697break;698}699case SUMOVehicleShape::BUS_TROLLEY:700GLHelper::pushMatrix();701glTranslated(0, 0, .1);702GLHelper::setColor(darker);703GLHelper::drawBoxLine(Position(3.8, 0), 90., 1, .3);704glTranslated(0, 0, .1);705glColor3d(0, 0, 0);706GLHelper::drawBoxLine(Position(4.3, .2), 90., 1, .06);707GLHelper::drawBoxLine(Position(4.3, -.2), 90., 1, .06);708GLHelper::drawBoxLine(Position(5.3, .2), 90., 3, .03);709GLHelper::drawBoxLine(Position(5.3, -.2), 90., 3, .03);710GLHelper::popMatrix();711break;712case SUMOVehicleShape::BUS:713case SUMOVehicleShape::BUS_COACH:714case SUMOVehicleShape::BUS_FLEXIBLE:715case SUMOVehicleShape::RAIL:716case SUMOVehicleShape::RAIL_CAR:717case SUMOVehicleShape::RAIL_CARGO:718case SUMOVehicleShape::E_VEHICLE:719case SUMOVehicleShape::ANT:720case SUMOVehicleShape::SHIP:721case SUMOVehicleShape::EMERGENCY:722case SUMOVehicleShape::FIREBRIGADE:723case SUMOVehicleShape::POLICE:724case SUMOVehicleShape::RICKSHAW:725case SUMOVehicleShape::AIRCRAFT:726case SUMOVehicleShape::SCOOTER:727break;728default: // same as passenger/sedan729drawPoly(vehiclePoly_PassengerSedanRightGlass, 4.5);730drawPoly(vehiclePoly_PassengerSedanLeftGlass, 4.5);731drawPoly(vehiclePoly_PassengerSedanBackGlass, 4.5);732break;733}734/*735glBegin(GL_TRIANGLE_FAN);736glVertex2d(.5,.5); // center - strip begin737glVertex2d(0, .5); // center, front738glVertex2d(0, .8); // ... clockwise ... (vehicle right side)739glVertex2d(0.08, .94);740glVertex2d(0.25, 1.);741glVertex2d(0.95, 1.);742glVertex2d(1., .9);743glVertex2d(1., .1); // (vehicle left side)744glVertex2d(0.95, 0.);745glVertex2d(0.25, 0.);746glVertex2d(0.08, .06);747glVertex2d(0, .2); //748glVertex2d(0, .5); // center, front (close)749glEnd();750751glPolygonOffset(0, -4.5);752glColor3d(1, 1, 1); // front753glBegin(GL_TRIANGLE_FAN);754glVertex2d(0.1,0.5);755glVertex2d(0.025,0.5);756glVertex2d(0.025,0.75);757glVertex2d(0.27,0.9);758glVertex2d(0.27,0.1);759glVertex2d(0.025,0.25);760glVertex2d(0.025,0.5);761glEnd();762763glColor3d(0, 0, 0); // front glass764glBegin(GL_TRIANGLE_FAN);765glVertex2d(0.35,0.5);766glVertex2d(0.3,0.5);767glVertex2d(0.3,0.9);768glVertex2d(0.43,0.8);769glVertex2d(0.43,0.2);770glVertex2d(0.3,0.1);771glVertex2d(0.3,0.5);772glEnd();773774glBegin(GL_TRIANGLE_FAN); // back glass775glVertex2d(0.92,0.5);776glVertex2d(0.90,0.5);777glVertex2d(0.90,0.8);778glVertex2d(0.95,0.9);779glVertex2d(0.95,0.1);780glVertex2d(0.90,0.2);781glVertex2d(0.90,0.5);782glEnd();783784glBegin(GL_TRIANGLE_FAN); // right glass785glVertex2d(0.36,0.07);786glVertex2d(0.34,0.03);787glVertex2d(0.94,0.03);788glVertex2d(0.87,0.13);789glVertex2d(0.45,0.13);790glVertex2d(0.34,0.03);791glEnd();792793glBegin(GL_TRIANGLE_FAN); // left glass794glVertex2d(0.36,1.-0.07);795glVertex2d(0.34,1.-0.03);796glVertex2d(0.94,1.-0.03);797glVertex2d(0.87,1.-0.13);798glVertex2d(0.45,1.-0.13);799glVertex2d(0.34,1.-0.03);800glEnd();801*/802803GLHelper::popMatrix();804}805806807bool808GUIBaseVehicleHelper::drawAction_drawVehicleAsImage(const GUIVisualizationSettings& /* s */, const std::string& file, const GUIGlObject* /* o */, const double width, double length) {809if (file != "") {810int textureID = GUITexturesHelper::getTextureID(file);811if (textureID > 0) {812GUITexturesHelper::drawTexturedBox(textureID, -width * 0.5, 0, width * 0.5, length);813return true;814}815}816return false;817}818819820/****************************************************************************/821822823