LCOV - code coverage report
Current view: top level - src/utils/gui/globjects - GUIPointOfInterest.cpp (source / functions) Coverage Total Hit
Test: lcov.info Lines: 56.0 % 84 47
Test Date: 2025-12-06 15:35:27 Functions: 80.0 % 10 8

            Line data    Source code
       1              : /****************************************************************************/
       2              : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
       3              : // Copyright (C) 2001-2025 German Aerospace Center (DLR) and others.
       4              : // This program and the accompanying materials are made available under the
       5              : // terms of the Eclipse Public License 2.0 which is available at
       6              : // https://www.eclipse.org/legal/epl-2.0/
       7              : // This Source Code may also be made available under the following Secondary
       8              : // Licenses when the conditions for such availability set forth in the Eclipse
       9              : // Public License 2.0 are satisfied: GNU General Public License, version 2
      10              : // or later which is available at
      11              : // https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
      12              : // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
      13              : /****************************************************************************/
      14              : /// @file    GUIPointOfInterest.cpp
      15              : /// @author  Daniel Krajzewicz
      16              : /// @author  Jakob Erdmann
      17              : /// @author  Michael Behrisch
      18              : /// @date    June 2006
      19              : ///
      20              : // The GUI-version of a point of interest
      21              : /****************************************************************************/
      22              : 
      23              : #include <utils/common/StringTokenizer.h>
      24              : #include <utils/gui/div/GUIParameterTableWindow.h>
      25              : #include <utils/gui/globjects/GUIGLObjectPopupMenu.h>
      26              : #include <utils/gui/div/GUIGlobalSelection.h>
      27              : #include <utils/gui/images/GUITextureSubSys.h>
      28              : #include <utils/gui/div/GLHelper.h>
      29              : #include <utils/gui/globjects/GLIncludes.h>
      30              : 
      31              : #include "GUIPointOfInterest.h"
      32              : 
      33              : 
      34              : // ===========================================================================
      35              : // method definitions
      36              : // ===========================================================================
      37              : 
      38         1271 : GUIPointOfInterest::GUIPointOfInterest(const std::string& id, const std::string& type, const RGBColor& color, const Position& pos,
      39              :                                        bool geo, const std::string& lane, double posOverLane, bool friendlyPos, double posLat,
      40              :                                        const std::string& icon, double layer, double angle, const std::string& imgFile,
      41         1271 :                                        double width, double height) :
      42              :     PointOfInterest(id, type, color, pos, geo, lane, posOverLane, friendlyPos, posLat, icon, layer, angle, imgFile, width, height),
      43              :     GUIGlObject_AbstractAdd(GLO_POI, id,
      44         1271 :                             (lane.size() > 0) ? GUIIconSubSys::getIcon(GUIIcon::POILANE) : geo ? GUIIconSubSys::getIcon(GUIIcon::POIGEO) : GUIIconSubSys::getIcon(GUIIcon::POI)) {
      45         1271 : }
      46              : 
      47              : 
      48         1734 : GUIPointOfInterest::~GUIPointOfInterest() {}
      49              : 
      50              : 
      51              : GUIGLObjectPopupMenu*
      52            0 : GUIPointOfInterest::getPopUpMenu(GUIMainWindow& app, GUISUMOAbstractView& parent) {
      53            0 :     GUIGLObjectPopupMenu* ret = new GUIGLObjectPopupMenu(app, parent, this);
      54              :     // build shape header
      55            0 :     buildShapePopupOptions(app, ret, getShapeType());
      56            0 :     return ret;
      57              : }
      58              : 
      59              : 
      60              : GUIParameterTableWindow*
      61            0 : GUIPointOfInterest::getParameterWindow(GUIMainWindow& app, GUISUMOAbstractView&) {
      62            0 :     GUIParameterTableWindow* ret = new GUIParameterTableWindow(app, *this);
      63              :     // add items
      64            0 :     ret->mkItem("type", false, getShapeType());
      65            0 :     ret->mkItem("icon", false, getIconStr());
      66            0 :     ret->mkItem("layer", false, getShapeLayer());
      67            0 :     ret->closeBuilding(this);
      68            0 :     return ret;
      69              : }
      70              : 
      71              : 
      72              : double
      73       125656 : GUIPointOfInterest::getExaggeration(const GUIVisualizationSettings& s) const {
      74       125656 :     return s.poiSize.getExaggeration(s, this);
      75              : }
      76              : 
      77              : 
      78              : Boundary
      79         1363 : GUIPointOfInterest::getCenteringBoundary() const {
      80         1363 :     Boundary b;
      81         1363 :     b.add(x(), y());
      82         1363 :     if (getShapeImgFile() != DEFAULT_IMG_FILE) {
      83         1020 :         b.growWidth(myHalfImgWidth);
      84         1020 :         b.growHeight(myHalfImgHeight);
      85              :     } else {
      86          343 :         b.grow(3);
      87              :     }
      88         1363 :     return b;
      89              : }
      90              : 
      91              : 
      92              : void
      93        62828 : GUIPointOfInterest::drawGL(const GUIVisualizationSettings& s) const {
      94              :     // check if POI can be drawn
      95        62828 :     if (checkDraw(s, this)) {
      96              :         // push name (needed for getGUIGlObjectsUnderCursor(...)
      97        62828 :         GLHelper::pushName(getGlID());
      98              :         // draw inner polygon
      99        62828 :         const double exaggeration = getExaggeration(s);
     100        62828 :         const double layer = s.poiUseCustomLayer ? s.poiCustomLayer : getShapeLayer();
     101        62828 :         GLHelper::pushMatrix();
     102              :         // set POI Color
     103        62828 :         setPOIColor(s, getShapeColor(), this, false);
     104              :         // add extra offset z provided by icon to avoid overlapping
     105        62828 :         glTranslated(x(), y(), layer + (double)getIcon());
     106        62828 :         glRotated(-getShapeNaviDegree(), 0, 0, 1);
     107              :         // check if has to be drawn as a circle or with an image
     108        62828 :         if (getShapeImgFile() != DEFAULT_IMG_FILE) {
     109        48779 :             int textureID = GUITexturesHelper::getTextureID(getShapeImgFile());
     110        48779 :             if (textureID > 0) {
     111       195108 :                 GUITexturesHelper::drawTexturedBox(textureID,
     112        48777 :                                                    getWidth() * -0.5 * exaggeration, getHeight() * -0.5 * exaggeration,
     113        48777 :                                                    getWidth() * 0.5 * exaggeration,  getHeight() * 0.5 * exaggeration);
     114              :             }
     115              :         } else {
     116              :             // fallback if no image is defined
     117        14049 :             GLHelper::drawFilledCircle(std::max(getWidth(), getHeight()) * 0.5 * exaggeration, s.poiDetail);
     118              :             // check if draw polygon
     119        14049 :             if (getIcon() != POIIcon::NONE) {
     120              :                 // translate
     121            0 :                 glTranslated(0, 0, 0.1);
     122              :                 // rotate
     123            0 :                 glRotated(180, 0, 0, 1);
     124              :                 // draw texture
     125            0 :                 GUITexturesHelper::drawTexturedBox(GUITextureSubSys::getPOITexture(getIcon()), exaggeration * 0.8);
     126              :             }
     127              :         }
     128        62828 :         GLHelper::popMatrix();
     129        62828 :         if (!s.drawForRectangleSelection) {
     130        62828 :             const Position namePos = *this;
     131        62828 :             drawName(namePos, s.scale, s.poiName, s.angle);
     132        62828 :             if (s.poiType.show(this)) {
     133            0 :                 const Position p = namePos + Position(0, -0.6 * s.poiType.size / s.scale);
     134            0 :                 GLHelper::drawTextSettings(s.poiType, getShapeType(), p, s.scale, s.angle);
     135              :             }
     136        62828 :             if (s.poiText.show(this)) {
     137            0 :                 GLHelper::pushMatrix();
     138            0 :                 glTranslated(x(), y(), 0);
     139            0 :                 std::string value = getParameter(s.poiTextParam, "");
     140            0 :                 if (value != "") {
     141            0 :                     auto lines = StringTokenizer(value, StringTokenizer::NEWLINE).getVector();
     142            0 :                     glRotated(-s.angle, 0, 0, 1);
     143            0 :                     glTranslated(0, 0.7 * s.poiText.scaledSize(s.scale) * (double)lines.size(), 0);
     144            0 :                     glRotated(s.angle, 0, 0, 1);
     145              :                     // FONS_ALIGN_LEFT = 1
     146              :                     // FONS_ALIGN_CENTER = 2
     147              :                     // FONS_ALIGN_MIDDLE = 16
     148            0 :                     const int align = (lines.size() > 1 ? 1 : 2) | 16;
     149            0 :                     for (std::string& line : lines) {
     150            0 :                         GLHelper::drawTextSettings(s.poiText, line, Position(0, 0), s.scale, s.angle, GLO_MAX, align);
     151            0 :                         glRotated(-s.angle, 0, 0, 1);
     152            0 :                         glTranslated(0, -0.7 * s.poiText.scaledSize(s.scale), 0);
     153            0 :                         glRotated(s.angle, 0, 0, 1);
     154              :                     }
     155            0 :                 }
     156            0 :                 GLHelper::popMatrix();
     157              :             }
     158              :         }
     159              :         // pop name
     160        62828 :         GLHelper::popName();
     161              :     }
     162        62828 : }
     163              : 
     164              : 
     165              : bool
     166        62828 : GUIPointOfInterest::checkDraw(const GUIVisualizationSettings& s, const GUIGlObject* o) {
     167              :     // only continue if scale is valid
     168        62828 :     if (s.scale * (1.3 / 3.0) * o->getExaggeration(s) < s.poiSize.minSize) {
     169            0 :         return false;
     170              :     }
     171              :     return true;
     172              : }
     173              : 
     174              : 
     175              : void
     176        62828 : GUIPointOfInterest::setPOIColor(const GUIVisualizationSettings& s, const RGBColor& shapeColor, const GUIGlObject* o, const bool disableSelectionColor) {
     177              :     const GUIColorer& c = s.poiColorer;
     178              :     const int active = c.getActive();
     179        62828 :     if (s.netedit && active != 1 && gSelected.isSelected(o->getType(), o->getGlID()) && disableSelectionColor) {
     180              :         // override with special colors (unless the color scheme is based on selection)
     181            0 :         GLHelper::setColor(RGBColor(0, 0, 204));
     182        62828 :     } else if (active == 0) {
     183        62828 :         GLHelper::setColor(shapeColor);
     184            0 :     } else if (active == 1) {
     185            0 :         GLHelper::setColor(c.getScheme().getColor(gSelected.isSelected(o->getType(), o->getGlID())));
     186              :     } else {
     187            0 :         GLHelper::setColor(c.getScheme().getColor(0));
     188              :     }
     189        62828 : }
     190              : 
     191              : /****************************************************************************/
        

Generated by: LCOV version 2.0-1