Eclipse SUMO - Simulation of Urban MObility
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
GUIOSGView.h
Go to the documentation of this file.
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/****************************************************************************/
19// An OSG-based 3D view on the simulation
20/****************************************************************************/
21#pragma once
22#include <config.h>
23
24#ifdef HAVE_OSG
25
26#include "GUIOSGHeader.h"
27#include "GUIOSGManipulator.h"
28
29#include <string>
31#include <utils/geom/Boundary.h>
32#include <utils/geom/Position.h>
37
38
39// ===========================================================================
40// class declarations
41// ===========================================================================
42
43class GUINet;
45class GUIVehicle;
46class GUILaneWrapper;
47class MSRoute;
48class MSTransportable;
49class MSVehicle;
50
51namespace osgGA {
52class CameraManipulator;
53}
54
55// ===========================================================================
56// class definitions
57// ===========================================================================
62class GUIOSGView : public GUISUMOAbstractView {
63#ifdef __clang__
64#pragma clang diagnostic push
65#pragma clang diagnostic ignored "-Winconsistent-missing-override"
66#endif
67 FXDECLARE(GUIOSGView)
68#ifdef __clang__
69#pragma clang diagnostic pop
70#endif
71
72public:
73 friend class GUIOSGPerspectiveChanger;
74
76 enum NodeSetGroup {
78 NODESET_TLSDOMES = 1,
80 NODESET_TLSLINKMARKERS = 2,
82 NODESET_TLSMODELS = 4,
83 };
84
89 class Command_TLSChange : public MSTLLogicControl::OnSwitchAction {
90 public:
99 Command_TLSChange(const MSLink* const link, osg::Switch* switchNode);
100
102 virtual ~Command_TLSChange();
103
110 void execute();
111
112 private:
114 const MSLink* const myLink;
115
117 osg::ref_ptr<osg::Switch> mySwitch;
118
120 LinkState myLastState;
121
122 private:
124 Command_TLSChange(const Command_TLSChange&) = delete;
125
127 Command_TLSChange& operator=(const Command_TLSChange&) = delete;
128 };
129
131 struct OSGMovable {
132 osg::ref_ptr<osg::PositionAttitudeTransform> pos;
133 osg::ref_ptr<osg::PositionAttitudeTransform> body;
134 osg::ref_ptr<osg::Material> mat;
135 osg::ref_ptr<osg::Switch> lights;
136 bool active;
137
138 void activateMaterial(bool state = true) {
139 osg::ref_ptr<osg::StateSet> ss = body->getOrCreateStateSet();
140 if (state) {
141 ss->setAttribute(mat, osg::StateAttribute::ON | osg::StateAttribute::OVERRIDE | osg::StateAttribute::PROTECTED);
142 } else {
143 ss->setAttribute(mat, osg::StateAttribute::OFF);
144 }
145 }
146 };
147
149 GUIOSGView(FXComposite* p, GUIMainWindow& app,
150 GUISUMOViewParent* parent, GUINet& net, FXGLVisual* glVis,
151 FXGLCanvas* share);
152
154 virtual ~GUIOSGView();
155
157 Position getPositionInformation() const override;
158
160 bool is3DView() const override;
161
163 virtual void buildViewToolBars(GUIGlChildWindow*) override;
164
166 void recenterView() override;
167
174 //void centerTo(GUIGlID id, bool applyZoom, double zoomDist = 20);
175
177 void updateViewportValues() override;
178
180 void showViewportEditor() override;
181
183 void setViewportFromToRot(const Position& lookFrom, const Position& lookAt, double rotation) override;
184
186 void copyViewportTo(GUISUMOAbstractView* view) override;
187
191 void startTrack(int id) override;
192
195 void stopTrack() override;
196
200 GUIGlID getTrackedID() const override;
201
202 bool setColorScheme(const std::string& name) override;
203
205 void onGamingClick(Position pos) override;
206
208 SUMOTime getCurrentTimeStep() const override;
209
210 void removeVeh(MSVehicle* veh);
211 void removeTransportable(MSTransportable* t);
212
214 void position(int x, int y, int w, int h) override;
215 void resize(int w, int h) override;
216
217 // callback
218 long onConfigure(FXObject*, FXSelector, void*) override;
219 long onKeyPress(FXObject*, FXSelector, void*) override;
220 long onKeyRelease(FXObject*, FXSelector, void*) override;
221 long onLeftBtnPress(FXObject*, FXSelector, void*) override;
222 long onLeftBtnRelease(FXObject*, FXSelector, void*) override;
223 long onMiddleBtnPress(FXObject*, FXSelector, void*) override;
224 long onMiddleBtnRelease(FXObject*, FXSelector, void*) override;
225 long onRightBtnPress(FXObject*, FXSelector, void*) override;
226 long onRightBtnRelease(FXObject*, FXSelector, void*) override;
227 //long onMotion(FXObject*, FXSelector, void*);
228 long onMouseMove(FXObject*, FXSelector, void*) override;
229 long onPaint(FXObject*, FXSelector, void*) override;
230 long onIdle(FXObject* sender, FXSelector sel, void* ptr);
231
233 long onCmdCloseLane(FXObject*, FXSelector, void*) override;
234 long onCmdCloseEdge(FXObject*, FXSelector, void*) override;
235 long onCmdAddRerouter(FXObject*, FXSelector, void*) override;
236
238 long onCmdShowReachability(FXObject*, FXSelector, void*) override;
239
241 long onVisualizationChange(FXObject*, FXSelector, void*) override;
242
243 // @brief get the new camera position given a zoom value
244 void zoom2Pos(Position& camera, Position& lookAt, double zoom) override;
245
246 // @brief convert RGBColor 0..255 RGBA values to osg::Vec4 0..1 vector
247 static osg::Vec4d toOSGColorVector(RGBColor c, bool useAlpha = false);
248
249 // @brief Overwrite the HUD text
250 void updateHUDText(const std::string text);
251
252protected:
254 void setWindowCursorPosition(float x, float y);
255
256 void updatePositionInformation() const;
257
259 bool getPositionAtCursor(float xNorm, float yNorm, Position& pos) const;
260
262 std::vector<GUIGlObject*> getGUIGlObjectsUnderCursor();
263
264 /* @brief Find GUILane which intersects with a ray from the camera to the stored cursor position
265 * @return The first found GUILane found or nullptr
266 */
267 GUILane* getLaneUnderCursor() override;
268
270 void adoptViewSettings();
271
272private:
273 double calculateRotation(const osg::Vec3d& lookFrom, const osg::Vec3d& lookAt, const osg::Vec3d& up);
274
276 void updateHUDPosition(int width, int height);
277
278 class FXOSGAdapter : public osgViewer::GraphicsWindow {
279 public:
280 FXOSGAdapter(GUISUMOAbstractView* parent, FXCursor* cursor);
281 void grabFocus();
282 void grabFocusIfPointerInWindow() {}
283 void useCursor(bool cursorOn);
284
285 bool makeCurrentImplementation();
286 bool releaseContext();
287 void swapBuffersImplementation();
288
289 // not implemented yet...just use dummy implementation to get working.
290 bool valid() const {
291 return true;
292 }
293 bool realizeImplementation() {
294 return true;
295 }
296 bool isRealizedImplementation() const {
297 return true;
298 }
299 void closeImplementation() {}
300 bool releaseContextImplementation() {
301 return true;
302 }
303 void requestWarpPointer(float x, float y) {
304 int xRound = std::lround(x);
305 int yRound = std::lround(y);
306 int xPrev, yPrev;
307 unsigned int buttons;
308 myParent->getCursorPosition(xPrev, yPrev, buttons);
309 if (xRound - xPrev != 0 || yRound - yPrev != 0) {
310 myParent->setCursorPosition(xRound, yRound);
311 getEventQueue()->mouseWarped(x, y);
312 }
313 }
314
315 protected:
316 ~FXOSGAdapter();
317 private:
318 GUISUMOAbstractView* const myParent;
319 FXCursor* const myOldCursor;
320 };
321
322 class PlaneMoverCallback : public osg::Callback {
323 public:
324 PlaneMoverCallback(osg::Camera* camera) : myCamera(camera) {};
325 virtual bool run(osg::Object* object, osg::Object* /* data */) override {
326 osg::MatrixTransform* mt = dynamic_cast<osg::MatrixTransform*>(object);
327 osg::Vec3d lookFrom, lookAt, up;
328 myCamera->getViewMatrixAsLookAt(lookFrom, lookAt, up);
329 osg::Vec3d direction = lookAt - lookFrom;
330 direction.normalize();
331 osg::Vec3d lookAtGround = lookFrom - direction * (lookFrom.z() / direction.z());
332 osg::Matrixd translateMatrix;
333 translateMatrix.makeTranslate(lookAtGround.x(), lookAtGround.y(), 0.);
334 double angle = atan2(direction.y(), direction.x());
335 osg::Matrixd rotMatrix = osg::Matrixd::rotate(angle, osg::Z_AXIS);
336 mt->setMatrix(rotMatrix * translateMatrix);
337 return true;
338 }
339 protected:
340 ~PlaneMoverCallback() {};
341 private:
342 osg::Camera* myCamera;
343 };
344
345 class PickHandler : public osgGA::GUIEventHandler {
346 public:
347 PickHandler(GUIOSGView* parent) : myParent(parent), myDrag(false) {};
348 bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa);
349 using osgGA::GUIEventHandler::handle; // to silence the warning C4266 about a hidden function
350 protected:
351 ~PickHandler() {};
352 private:
353 GUIOSGView* const myParent;
354 bool myDrag;
355 };
356
357 class ExcludeFromNearFarComputationCallback : public osg::NodeCallback {
358 virtual void operator()(osg::Node* node, osg::NodeVisitor* nv) {
359 osgUtil::CullVisitor* cv = dynamic_cast<osgUtil::CullVisitor*>(nv);
360 // Default value
361 osg::CullSettings::ComputeNearFarMode oldMode = osg::CullSettings::COMPUTE_NEAR_FAR_USING_BOUNDING_VOLUMES;
362 if (cv) {
363 oldMode = cv->getComputeNearFarMode();
364 cv->setComputeNearFarMode(osg::CullSettings::DO_NOT_COMPUTE_NEAR_FAR);
365 }
366 traverse(node, nv);
367 if (cv) {
368 cv->setComputeNearFarMode(oldMode);
369 }
370 }
371 };
372
373
374
375protected:
376 GUIOSGView() {}
377
378 osg::ref_ptr<FXOSGAdapter> myAdapter;
379 osg::ref_ptr<osgViewer::Viewer> myViewer;
380 osg::ref_ptr<osg::Group> myRoot;
381 osg::ref_ptr<osg::MatrixTransform> myPlane;
382 osg::ref_ptr<osg::Camera> myHUD;
383 osg::ref_ptr<osg::Geode> myTextNode;
384 osg::ref_ptr<osgText::Text> myText;
385
386private:
387 GUIVehicle* myTracked;
388 osg::ref_ptr<GUIOSGManipulator> myCameraManipulator;
389 SUMOTime myLastUpdate;
390
391 float myOSGNormalizedCursorX, myOSGNormalizedCursorY;
392
393 std::map<MSVehicle*, OSGMovable > myVehicles;
394 std::map<MSTransportable*, OSGMovable > myPersons;
395
396 osg::ref_ptr<osg::Node> myGreenLight;
397 osg::ref_ptr<osg::Node> myYellowLight;
398 osg::ref_ptr<osg::Node> myRedLight;
399 osg::ref_ptr<osg::Node> myRedYellowLight;
400 osg::ref_ptr<osg::Node> myPoleBase;
401 osg::ref_ptr<osg::Node> myPlaneTransform;
402};
403
404#endif
long long int SUMOTime
Definition GUI.h:36
unsigned int GUIGlID
Definition GUIGlObject.h:44
LinkState
The right-of-way state of a link between two lanes used when constructing a NBTrafficLightLogic,...
Representation of a lane in the micro simulation (gui-version)
Definition GUILane.h:60
A MSNet extended by some values for usage within the gui.
Definition GUINet.h:82
virtual long onLeftBtnRelease(FXObject *, FXSelector, void *)
virtual long onVisualizationChange(FXObject *, FXSelector, void *)
hook to react on change in visualization settings
std::vector< GUIGlObject * > getGUIGlObjectsUnderCursor()
returns the GUIGlObject under the cursor using GL_SELECT (including overlapped objects)
virtual void recenterView()
recenters the view
virtual SUMOTime getCurrentTimeStep() const
get the current simulation time
virtual long onMiddleBtnRelease(FXObject *, FXSelector, void *)
virtual long onMouseMove(FXObject *, FXSelector, void *)
virtual long onCmdCloseEdge(FXObject *, FXSelector, void *)
virtual void buildViewToolBars(GUIGlChildWindow *)
builds the view toolbars
virtual void showViewportEditor()
show viewport editor
virtual void zoom2Pos(Position &camera, Position &lookAt, double zoom)
zoom interface for 3D view
virtual long onCmdCloseLane(FXObject *, FXSelector, void *)
interaction with the simulation
virtual long onLeftBtnPress(FXObject *, FXSelector, void *)
virtual void setViewportFromToRot(const Position &lookFrom, const Position &lookAt, double rotation)
applies the given viewport settings
virtual GUILane * getLaneUnderCursor()
returns the GUILane at cursor position (implementation depends on view)
virtual void onGamingClick(Position)
on gaming click
virtual long onKeyPress(FXObject *o, FXSelector sel, void *data)
keyboard functions
virtual long onMiddleBtnPress(FXObject *, FXSelector, void *)
virtual void stopTrack()
stop track
virtual Position getPositionInformation() const
Returns the cursor's x/y position within the network.
virtual long onKeyRelease(FXObject *o, FXSelector sel, void *data)
void setWindowCursorPosition(FXint x, FXint y)
Returns the gl-id of the object under the given coordinates.
virtual long onCmdShowReachability(FXObject *, FXSelector, void *)
highlight edges according to reachability
virtual void updateViewportValues()
update the viewport chooser with the current view values
virtual void startTrack(int)
star track
virtual bool is3DView() const
return whether this is a 3D view
virtual long onRightBtnRelease(FXObject *, FXSelector, void *)
virtual void copyViewportTo(GUISUMOAbstractView *view)
copy the viewport to the given view
virtual bool setColorScheme(const std::string &)
set color scheme
virtual long onCmdAddRerouter(FXObject *, FXSelector, void *)
virtual long onPaint(FXObject *, FXSelector, void *)
virtual long onRightBtnPress(FXObject *, FXSelector, void *)
virtual long onConfigure(FXObject *, FXSelector, void *)
mouse functions
virtual GUIGlID getTrackedID() const
get tracked id
A single child window which contains a view of the simulation area.
A MSVehicle extended by some values for usage within the gui.
Definition GUIVehicle.h:51
Base class for things to execute if a tls switches to a new phase.
Representation of a vehicle in the micro simulation.
Definition MSVehicle.h:77
A point in 2D or 3D with translation and scaling methods.
Definition Position.h:37
@ object
object (unordered set of name/value pairs)