Line data Source code
1 : /****************************************************************************/
2 : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3 : // Copyright (C) 2001-2024 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 GUISUMOAbstractView.h
15 : /// @author Daniel Krajzewicz
16 : /// @author Jakob Erdmann
17 : /// @author Michael Behrisch
18 : /// @author Andreas Gaubatz
19 : /// @date Sept 2002
20 : ///
21 : // The base class for a view
22 : /****************************************************************************/
23 : #pragma once
24 : #include <config.h>
25 :
26 : #include <string>
27 : #include <vector>
28 : #include <map>
29 : #include <utils/foxtools/fxheader.h>
30 : // fx3d includes windows.h so we need to guard against macro pollution
31 : #ifdef WIN32
32 : #define NOMINMAX
33 : #endif
34 : #include <fx3d.h>
35 : #ifdef WIN32
36 : #undef NOMINMAX
37 : #endif
38 :
39 : #include <utils/geom/Boundary.h>
40 : #include <utils/geom/Position.h>
41 : #include <utils/common/RGBColor.h>
42 : #include <utils/common/SUMOTime.h>
43 : #include <utils/gui/globjects/GUIGlObjectTypes.h>
44 : #include <foreign/rtree/SUMORTree.h>
45 :
46 :
47 : // ===========================================================================
48 : // class declarations
49 : // ===========================================================================
50 : class GUIGlChildWindow;
51 : class GUIVehicle;
52 : class GUIPerspectiveChanger;
53 : class GUIMainWindow;
54 : class GUIGLObjectPopupMenu;
55 : class GUIGlObject;
56 : class GUIDialog_EditViewport;
57 : class GUIDialog_ViewSettings;
58 : class GUIVisualizationSettings;
59 : class GUILane;
60 :
61 : /// @brief comparator for resolving clicks
62 : struct ComparatorClickPriority {
63 0 : bool operator()(const GUIGlObject* const a, const GUIGlObject* const b) const {
64 0 : if (a->getClickPriority() == b->getClickPriority()) {
65 : // sorty by GUIGlID as second criterion to simplify
66 : // duplicate removal
67 0 : return a->getGlID() > b->getGlID();
68 : } else {
69 0 : return a->getClickPriority() > b->getClickPriority();
70 : }
71 : }
72 : };
73 :
74 : // ===========================================================================
75 : // class definitions
76 : // ===========================================================================
77 : /**
78 : * @class GUISUMOAbstractView
79 : * This class is meant to be pure virtual later;
80 : * It shall be the main class to inherit views of the simulation (micro-
81 : * or macroscopic ones) from it.
82 : */
83 : class GUISUMOAbstractView : public FXGLCanvas {
84 0 : FXDECLARE(GUISUMOAbstractView)
85 :
86 : public:
87 : /// @brief constructor
88 : GUISUMOAbstractView(FXComposite* p, GUIMainWindow& app, GUIGlChildWindow* parent, const SUMORTree& grid, FXGLVisual* glVis, FXGLCanvas* share);
89 :
90 : /// @brief destructor
91 : virtual ~GUISUMOAbstractView();
92 :
93 : /// @brief recalculate boundaries
94 0 : virtual void recalculateBoundaries() { };
95 :
96 : /// @brief builds the view toolbars
97 0 : virtual void buildViewToolBars(GUIGlChildWindow*) { }
98 :
99 : /// @brief recenters the view
100 : virtual void recenterView();
101 :
102 : /** @brief centers to the chosen artifact
103 : * @param[in] id The id of the artifact to center to
104 : * @param[in] applyZoom Whether to zoom in
105 : * @param[in] zoomDist The distance in m to use for the zoom, values < 0 means: use the centeringBoundary
106 : * @note caller is responsible for calling update
107 : */
108 : virtual void centerTo(GUIGlID id, bool applyZoom, double zoomDist = 20);
109 :
110 : /** @brief centers to the chosen position
111 : * @param[in] pos Position to center view
112 : * @param[in] applyZoom Whether to zoom in
113 : * @param[in] zoomDist The distance in m to use for the zoom, values < 0 means: use the centeringBoundary
114 : * @note caller is responsible for calling update
115 : */
116 : virtual void centerTo(const Position& pos, bool applyZoom, double zoomDist = 20);
117 :
118 : /// @brief centers to the chosen artifact
119 : void centerTo(const Boundary& bound);
120 :
121 : /// @brief applies the given viewport settings
122 : virtual void setViewportFromToRot(const Position& lookFrom, const Position& lookAt, double rotation);
123 :
124 : /// @brief copy the viewport to the given view
125 : virtual void copyViewportTo(GUISUMOAbstractView* view);
126 :
127 : /// @brief meter-to-pixels conversion method
128 : double m2p(double meter) const;
129 :
130 : /// @brief pixels-to-meters conversion method
131 : double p2m(double pixel) const;
132 :
133 : /// @brief get main window
134 : GUIMainWindow* getMainWindow() const;
135 :
136 : /// @brief return windows cursor position
137 : Position getWindowCursorPosition() const;
138 :
139 : /// @brief Returns the gl-id of the object under the given coordinates
140 : void setWindowCursorPosition(FXint x, FXint y);
141 :
142 : /// @brief A reimplementation due to some internal reasons
143 : FXbool makeCurrent();
144 :
145 : /// @brief returns true, if the edit button was pressed
146 : bool isInEditMode();
147 :
148 : /// @brief get changer
149 : GUIPerspectiveChanger& getChanger() const;
150 :
151 : /// @brief get visible boundary
152 : Boundary getVisibleBoundary() const;
153 :
154 : /// @brief return whether this is a 3D view
155 : virtual bool is3DView() const;
156 :
157 : /// @brief zoom interface for 3D view
158 : virtual void zoom2Pos(Position& camera, Position& lookAt, double zoom);
159 :
160 : /// @brief mouse functions
161 : //@{
162 : virtual long onConfigure(FXObject*, FXSelector, void*);
163 : virtual long onPaint(FXObject*, FXSelector, void*);
164 : virtual long onLeftBtnPress(FXObject*, FXSelector, void*);
165 : virtual long onLeftBtnRelease(FXObject*, FXSelector, void*);
166 : virtual long onMiddleBtnPress(FXObject*, FXSelector, void*);
167 : virtual long onMiddleBtnRelease(FXObject*, FXSelector, void*);
168 : virtual long onRightBtnPress(FXObject*, FXSelector, void*);
169 : virtual long onRightBtnRelease(FXObject*, FXSelector, void*);
170 : virtual long onDoubleClicked(FXObject*, FXSelector, void*);
171 : virtual long onMouseWheel(FXObject*, FXSelector, void*);
172 : virtual long onMouseMove(FXObject*, FXSelector, void*);
173 : virtual long onMouseLeft(FXObject*, FXSelector, void*);
174 : //@}
175 :
176 : /// @brief keyboard functions
177 : //@{
178 : virtual long onKeyPress(FXObject* o, FXSelector sel, void* data);
179 : virtual long onKeyRelease(FXObject* o, FXSelector sel, void* data);
180 : //@}
181 :
182 : /// @brief interaction with the simulation
183 : virtual long onCmdCloseLane(FXObject*, FXSelector, void*);
184 : virtual long onCmdCloseEdge(FXObject*, FXSelector, void*);
185 : virtual long onCmdAddRerouter(FXObject*, FXSelector, void*);
186 :
187 : /// @brief highlight edges according to reachability
188 : virtual long onCmdShowReachability(FXObject*, FXSelector, void*);
189 :
190 : /// @brief hook to react on change in visualization settings
191 : virtual long onVisualizationChange(FXObject*, FXSelector, void*);
192 :
193 : /// @brief filter out duplicate and forbidden objects
194 : std::vector<GUIGlObject*> filterContextObjects(const std::vector<GUIGlObject*>& objects);
195 :
196 : /// @brief open object dialog at the cursor position
197 : virtual void openObjectDialogAtCursor(const FXEvent* ev);
198 :
199 : /// @brief open object dialog for the given object
200 : void openObjectDialog(const std::vector<GUIGlObject*>& objects, const bool filter = true);
201 :
202 : /// @brief A method that updates the tooltip
203 : void updateToolTip();
204 :
205 : /// @brief @name Dealing with snapshots
206 : ///@{
207 :
208 : /** @brief Sets the snapshot time to file map
209 : * @param[in] snaps The snapshots to take at certain times
210 : * @param[in] w The snapshot image width
211 : * @param[in] w The snapshot image height
212 : */
213 : void addSnapshot(SUMOTime time, const std::string& file, const int w = -1, const int h = -1);
214 :
215 : /** @brief Takes a snapshots and writes it into the given file
216 : *
217 : * The format to use is determined from the extension.
218 : * If compiled with ffmpeg and a video format is requested it will instantiate a video encoder.
219 : * @param[in] destFile The name of the file to write the snapshot into
220 : * @param[in] w The snapshot image width
221 : * @param[in] w The snapshot image height
222 : * @return The error message, if an error occurred; "" otherwise
223 : */
224 : std::string makeSnapshot(const std::string& destFile, const int w = -1, const int h = -1);
225 :
226 : /// @brief Adds a frame to a video snapshot which will be initialized if necessary
227 : virtual void saveFrame(const std::string& destFile, FXColor* buf);
228 :
229 : /// @brief Ends a video snapshot
230 0 : virtual void endSnapshot() {}
231 :
232 : /// @brief Checks whether it is time for a snapshot
233 : virtual void checkSnapshots();
234 :
235 : void waitForSnapshots(const SUMOTime snapshotTime);
236 :
237 : /// @brief get the current simulation time
238 : virtual SUMOTime getCurrentTimeStep() const;
239 :
240 : ///@}
241 :
242 : /// @brief get the viewport and create it on first access
243 : GUIDialog_EditViewport* getViewportEditor();
244 :
245 : /// @brief update the viewport chooser with the current view values
246 : virtual void updateViewportValues();
247 :
248 : /// @brief show viewport editor
249 : virtual void showViewportEditor();
250 :
251 : /// @brief show viewsscheme editor
252 : void showViewschemeEditor();
253 :
254 : /// @brief set color scheme
255 : virtual bool setColorScheme(const std::string&);
256 :
257 : /// @brief get visualization settings (read only)
258 : const GUIVisualizationSettings& getVisualisationSettings() const;
259 :
260 : /// @brief edit visualization settings (allow modify VisualizationSetings, use carefully)
261 : GUIVisualizationSettings* editVisualisationSettings() const;
262 :
263 : /// @brief recalibrate color scheme according to the current value range
264 0 : virtual void buildColorRainbow(const GUIVisualizationSettings& /*s*/, GUIColorScheme& /*scheme*/, int /*active*/, GUIGlObjectType /*objectType*/,
265 : const GUIVisualizationRainbowSettings& /*rs*/) {
266 0 : }
267 :
268 : /// @brief return list of loaded edgeData attributes
269 0 : virtual std::vector<std::string> getEdgeDataAttrs() const {
270 0 : return std::vector<std::string>();
271 : }
272 :
273 : /// @brief return list of loaded edgeData ids (being computed in the current simulation)
274 0 : virtual std::vector<std::string> getMeanDataIDs() const {
275 0 : return std::vector<std::string>();
276 : }
277 :
278 : /// @brief return list of available attributes for the given meanData id
279 0 : virtual std::vector<std::string> getMeanDataAttrs(const std::string& meanDataID) const {
280 : UNUSED_PARAMETER(meanDataID);
281 0 : return std::vector<std::string>();
282 : }
283 :
284 : /// @brief return list of loaded edgeRelation and tazRelation attributes
285 0 : virtual std::vector<std::string> getRelDataAttrs() const {
286 0 : return std::vector<std::string>();
287 : }
288 :
289 : /// @brief return list of available edge parameters
290 0 : virtual std::vector<std::string> getEdgeLaneParamKeys(bool /*edgeKeys*/) const {
291 0 : return std::vector<std::string>();
292 : }
293 :
294 : /// @brief return list of available vehicle parameters
295 0 : virtual std::vector<std::string> getVehicleParamKeys(bool /*vTypeKeys*/) const {
296 0 : return std::vector<std::string>();
297 : }
298 :
299 : /// @brief return list of available vehicle parameters
300 0 : virtual std::vector<std::string> getPOIParamKeys() const {
301 0 : return std::vector<std::string>();
302 : }
303 :
304 : /// @brief remove viewport
305 : void remove(GUIDialog_EditViewport*);
306 :
307 : /// @brief remove view settings
308 : void remove(GUIDialog_ViewSettings*);
309 :
310 : /// @brief get grid width
311 : // @todo: check why this is here
312 : double getGridWidth() const;
313 :
314 : /// @brief get grid height
315 : // @todo: check why this is here
316 : double getGridHeight() const;
317 :
318 : /// @brief star track
319 : virtual void startTrack(int /*id*/);
320 :
321 : /// @brief stop track
322 : virtual void stopTrack();
323 :
324 : /// @brief get tracked id
325 : virtual GUIGlID getTrackedID() const;
326 :
327 : /// @brief on gaming click
328 : virtual void onGamingClick(Position /*pos*/);
329 : virtual void onGamingRightClick(Position /*pos*/);
330 :
331 : /// @brief @name Additional visualisations
332 : ///@{
333 :
334 : /** @brief Adds an object to call its additional visualisation method
335 : * @param[in] which The object to add
336 : * @return Always true
337 : * @see GUIGlObject::drawGLAdditional
338 : */
339 : bool addAdditionalGLVisualisation(GUIGlObject* const which);
340 :
341 : /** @brief Removes an object from the list of objects that show additional things
342 : * @param[in] which The object to remove
343 : * @return True if the object was known, false otherwise
344 : * @see GUIGlObject::drawGLAdditional
345 : */
346 : bool removeAdditionalGLVisualisation(GUIGlObject* const which);
347 :
348 : /** @brief Check if an object is added in the additional GL visualitation
349 : * @param[in] which The object to check
350 : * @see GUIGlObject::drawGLAdditional
351 : */
352 : bool isAdditionalGLVisualisationEnabled(GUIGlObject* const which) const;
353 :
354 : ///@}
355 :
356 : /// @brief get position of current popup
357 : const Position& getPopupPosition() const;
358 :
359 : /// @brief destroys the popup
360 : void destroyPopup();
361 :
362 : /// @brief replace PopUp
363 : void replacePopup(GUIGLObjectPopupMenu* popUp);
364 :
365 : ///@struct Decal
366 : /// @brief A decal (an image) that can be shown
367 2051 : struct Decal {
368 :
369 : /// @brief Constructor
370 2027 : Decal() {};
371 :
372 : /// @brief The path to the file the image is located at
373 : std::string filename;
374 :
375 : /// @brief The center of the image in x-direction (net coordinates, in m)
376 : double centerX = 0;
377 :
378 : /// @brief The center of the image in y-direction (net coordinates, in m)
379 : double centerY = 0;
380 :
381 : /// @brief The center of the image in z-direction (net coordinates, in m)
382 : double centerZ = 0;
383 :
384 : /// @brief The width of the image (net coordinates in x-direction, in m)
385 : double width = 0;
386 :
387 : /// @brief The height of the image (net coordinates in y-direction, in m)
388 : double height = 0;
389 :
390 : /// @brief The altitude of the image (net coordinates in z-direction, in m)
391 : double altitude = 0;
392 :
393 : /// @brief The rotation of the image in the ground plane (in degrees)
394 : double rot = 0;
395 :
396 : /// @brief The tilt of the image to the ground plane (in degrees)
397 : double tilt = 0;
398 :
399 : /// @brief The roll of the image to the ground plane (in degrees)
400 : double roll = 0;
401 :
402 : /// @brief The layer of the image
403 : double layer = 0;
404 :
405 : /// @brief Whether this image was initialised (inserted as a texture)
406 : bool initialised = false;
407 :
408 : /// @brief Whether this image should be skipped in 2D-views
409 : bool skip2D = false;
410 :
411 : /// @brief Whether this image should be skipped in 2D-views
412 : bool screenRelative = false;
413 :
414 : /// @brief whether the decal shall be drawn in screen coordinates, rather than network coordinates
415 : int glID = -1;
416 :
417 : /// @brief The image pointer for later cleanup
418 : FXImage* image = nullptr;
419 : };
420 :
421 : /// @brief The list of decals to show
422 : std::vector<Decal>& getDecals();
423 :
424 : /// @brief The mutex to use before accessing the decals list in order to avoid thread conflicts
425 : FXMutex& getDecalsLockMutex();
426 :
427 : /// @brief get coloring schemes combo
428 : MFXComboBoxIcon* getColoringSchemesCombo();
429 :
430 : /// @brief Returns the cursor's x/y position within the network
431 : virtual Position getPositionInformation() const;
432 :
433 : /**@brief Returns a position that is mapped to the closest grid point if the grid is active
434 : * @brief note: formats are pos(x,y,0) por pos(0,0,z)
435 : */
436 : Position snapToActiveGrid(const Position& pos, bool snapXY = true) const;
437 :
438 : /// @brief Translate screen position to network position
439 : Position screenPos2NetPos(int x, int y) const;
440 :
441 : /// @brief add decals
442 : void addDecals(const std::vector<Decal>& decals);
443 :
444 : /// @brief Returns the delay of the parent application
445 : double getDelay() const;
446 :
447 : /// @brief Sets the delay of the parent application
448 : void setDelay(double delay);
449 :
450 : /// @brief Sets the breakpoints of the parent application
451 : void setBreakpoints(const std::vector<SUMOTime>& breakpoints);
452 :
453 : /// @brief retrieve breakpoints if provided by the application
454 0 : virtual const std::vector<SUMOTime> retrieveBreakpoints() const {
455 0 : return std::vector<SUMOTime>();
456 : }
457 :
458 : /// @brief retrieve FPS
459 : double getFPS() const;
460 :
461 : /// @brief get GUIGlChildWindow
462 : GUIGlChildWindow* getGUIGlChildWindow();
463 :
464 : /// @brief Draw (or not) the JuPedSim pedestrian network
465 : /// @param s The visualization settings
466 0 : virtual void drawPedestrianNetwork(const GUIVisualizationSettings& /*s*/) const { };
467 :
468 : /// @brief Change the color of the JuPedSim pedestrian network
469 : /// @param s The visualization settings
470 0 : virtual void changePedestrianNetworkColor(const GUIVisualizationSettings& /*s*/) const { };
471 :
472 : protected:
473 : /// @brief FOX needs this
474 0 : FOX_CONSTRUCTOR(GUISUMOAbstractView)
475 :
476 : /// @brief performs the painting of the simulation
477 : void paintGL();
478 :
479 : /// @brief update position information labels
480 : virtual void updatePositionInformationLabel() const;
481 :
482 : /// @brief paint GL
483 : virtual int doPaintGL(int /*mode*/, const Boundary& /*boundary*/);
484 :
485 : /// @brief doInit
486 : virtual void doInit();
487 :
488 : /// @brief paints a grid
489 : void paintGLGrid() const;
490 :
491 : /// @brief Draws a line with ticks, and the length information.
492 : void displayLegend();
493 :
494 : /// @brief Draws the configured legends
495 : void displayLegends();
496 :
497 : /// @brief Draws a legend for the given scheme
498 : void displayColorLegend(const GUIColorScheme& scheme, bool leftSide);
499 :
500 : /// @brief Draws frames-per-second indicator
501 : void drawFPS();
502 :
503 : /// @brief returns the GUILane at cursor position (implementation depends on view)
504 : virtual GUILane* getLaneUnderCursor();
505 :
506 : /// @brief returns the id of object under cursor to show their tooltip
507 : virtual GUIGlID getToolTipID();
508 :
509 : /// @brief returns the id of the front object under the cursor using GL_SELECT
510 : GUIGlID getObjectUnderCursor();
511 :
512 : /// @brief returns the id of the objects under the cursor using GL_SELECT (including overlapped objects)
513 : std::vector<GUIGlID> getObjectsUnderCursor();
514 :
515 : /// @brief returns the GUIGlObject under the cursor using GL_SELECT (including overlapped objects)
516 : std::vector<GUIGlObject*> getGUIGlObjectsUnderCursor();
517 :
518 : /// @brief returns the GUIGlObject under the gripped cursor using GL_SELECT (including overlapped objects)
519 : std::vector<GUIGlObject*> getGUIGlObjectsUnderSnappedCursor();
520 :
521 : /// @brief returns the id of the object at position using GL_SELECT
522 : GUIGlID getObjectAtPosition(Position pos);
523 :
524 : /// @brief returns the ids of the object at position within the given (rectangular) radius using GL_SELECT
525 : std::vector<GUIGlID> getObjectsAtPosition(Position pos, double radius);
526 :
527 : /// @brief returns the GUIGlObjects at position within the given (rectangular) radius using GL_SELECT
528 : std::vector<GUIGlObject*> getGUIGlObjectsAtPosition(Position pos, double radius);
529 :
530 : /// @brief returns the ids of all objects in the given boundary
531 : std::vector<GUIGlID> getObjectsInBoundary(Boundary bound);
532 :
533 : /// @brief filter internal lanes in Objects under cursor
534 : std::vector<GUIGlObject*> filterInternalLanes(const std::vector<GUIGlObject*>& objects) const;
535 :
536 : /// @brief invokes the tooltip for the given object
537 : bool showToolTipFor(const GUIGlID idToolTip);
538 :
539 : /// @brief Draws the stored decals
540 : void drawDecals();
541 :
542 : /// @brief open popup dialog
543 : void openPopupDialog();
544 :
545 : /// @brief helper function for buildColorRainbow
546 : void buildMinMaxRainbow(const GUIVisualizationSettings& s, GUIColorScheme& scheme, const GUIVisualizationRainbowSettings& rs, double minValue, double maxValue, bool hasMissingData);
547 :
548 : /// @brief applies gl-transformations to fit the Boundary given by myChanger onto the canvas.
549 : /// If fixRatio is true, this boundary will be enlarged to prevent anisotropic stretching.
550 : /// (this should be set to false when doing selections)
551 : Boundary applyGLTransform(bool fixRatio = true);
552 :
553 : /// @brief check whether we can read image data or position with gdal
554 : FXImage* checkGDALImage(Decal& d);
555 :
556 : /// @brief The application
557 : GUIMainWindow* myApp;
558 :
559 : /// @brief The parent window
560 : GUIGlChildWindow* myGlChildWindowParent;
561 :
562 : /// @brief The visualization speed-up
563 : const SUMORTree* myGrid;
564 :
565 : /// @brief The perspective changer
566 : GUIPerspectiveChanger* myChanger = nullptr;
567 :
568 : /// @brief Panning flag
569 : bool myPanning = false;
570 :
571 : /// @brief Information whether too-tip informations shall be generated
572 : bool myInEditMode = false;
573 :
574 : /// @brief Offset to the mouse-hotspot from the mouse position
575 : int myMouseHotspotX, myMouseHotspotY;
576 :
577 : /// @brief The current popup-menu
578 : GUIGLObjectPopupMenu* myPopup = nullptr;
579 :
580 : /// @brief clicked poup position
581 : Position myClickedPopupPosition = Position::INVALID;
582 :
583 : /// @brief The current popup-menu position
584 : Position myPopupPosition = Position(0, 0);
585 :
586 : /// @brief vector with current objects dialog
587 : std::vector<GUIGlObject*> myCurrentObjectsDialog;
588 :
589 : /// @brief visualization settings
590 : GUIVisualizationSettings* myVisualizationSettings;
591 :
592 : /// @brief Internal information whether doInit() was called
593 : bool myAmInitialised = false;
594 :
595 : /// @brief viewport chooser
596 : GUIDialog_EditViewport* myGUIDialogEditViewport = nullptr;
597 :
598 : /// @brief Position of the cursor relative to the window
599 : FXint myWindowCursorPositionX, myWindowCursorPositionY;
600 :
601 : /// @brief Visualization changer
602 : GUIDialog_ViewSettings* myGUIDialogViewSettings = nullptr;
603 :
604 : /// @brief @name Optionally shown decals
605 : ///@{
606 :
607 : /// @brief The list of decals to show
608 : std::vector<Decal> myDecals;
609 :
610 : /// @brief The mutex to use before accessing the decals list in order to avoid thread conflicts
611 : FXMutex myDecalsLockMutex;
612 :
613 : ///@}
614 :
615 : /// @brief Snapshots
616 : std::map<SUMOTime, std::vector<std::tuple<std::string, int, int> > > mySnapshots;
617 :
618 : /// @brief The mutex to use before accessing the decals list in order to avoid thread conflicts
619 : FXMutex mySnapshotsMutex;
620 :
621 : /// @brief the semaphore when waiting for snapshots to finish
622 : FXCondition mySnapshotCondition;
623 :
624 : /// @brief poly draw lock
625 : mutable FXMutex myPolyDrawLock;
626 :
627 : /// @brief List of objects for which GUIGlObject::drawGLAdditional is called
628 : std::map<GUIGlObject*, int> myAdditionallyDrawn;
629 :
630 : /// @brief counter for measuring rendering time
631 : long myFrameDrawTime = 0;
632 :
633 : private:
634 : /// @brief struct used for sorting objects by layer
635 : struct LayerObject : public std::pair<double, std::pair<GUIGlObjectType, std::string> > {
636 :
637 : public:
638 : /// @brief constructor for shapes
639 : LayerObject(double layer, GUIGlObject* object);
640 :
641 : /// @brief constructor for non-shape elements
642 : LayerObject(GUIGlObject* object);
643 :
644 : /// @brief get GLObject
645 : GUIGlObject* getGLObject() const;
646 :
647 : private:
648 : /// @brief GLObject
649 : GUIGlObject* myGLObject;
650 : };
651 :
652 : // @brief sensitivity for "<>AtPosition(...) functions
653 : static const double SENSITIVITY;
654 : };
|