Physics Simulation & Visualization Tool 0.1
A C++ physics simulation engine with real-time 3D visualization
Loading...
Searching...
No Matches
OpenGLWindow.h
Go to the documentation of this file.
1#pragma once
2#include <QtOpenGLWidgets/QOpenGLWidget>
3#include <QOpenGLFunctions_4_5_Core>
4#include <QTimer>
5#include <QKeyEvent>
6#include <QMouseEvent>
7#include <QWheelEvent>
8#include <QSet>
9#include <QCursor>
10#include <QPushButton>
11#include <chrono>
12#include <memory>
13#include <vector>
14#include "math/Ray.h"
15
16class Scene;
17class SceneManager;
18namespace Physics { class PhysicsSystem; }
19
20class OpenGLWindow : public QOpenGLWidget, public QOpenGLFunctions_4_5_Core {
21 Q_OBJECT
22signals:
23 void fpsUpdated(double fps);
25
26public:
27 explicit OpenGLWindow(QWidget* parent = nullptr);
28 ~OpenGLWindow() override = default;
29
30 bool isKeyPressed(int qtKey) const { return pressedKeys.contains(qtKey); }
31
32 QPointF getMousePos() const { return mapFromGlobal(QCursor::pos()); }
33
34 QSize getFramebufferSize() const { return size(); }
35
36 void setScene(std::unique_ptr<Scene> sc) { scene = std::move(sc); }
37 void setSceneManager(SceneManager* scm) { sceneManager = scm; }
38
39 void setMouseCaptured(bool captured);
40
41 bool isMouseCaptured() const { return mouseCaptured; }
42
43 bool isMouseButtonHeld(Qt::MouseButton button) const { return pressedMouseButtons.contains(button); };
44
45 void handleRawMouseDelta(int dx, int dy);
46
47 void setSimSpeed(float newSpeed) { simSpeed.store(newSpeed); }
48 float getSimSpeed() const { return simSpeed.load(); }
49 void setRenderClockRunning(bool running) { simulating = running; }
50 bool isRenderClockRunning() const { return simulating; }
51 void resetRenderClock(float simTime = 0.0f) { renderSimTime = simTime; }
52
53protected:
54 void initializeGL() override;
55 void resizeGL(int w, int h) override;
56 void paintGL() override;
57
58 void keyPressEvent(QKeyEvent* event) override;
59 void keyReleaseEvent(QKeyEvent* event) override;
60 void mousePressEvent(QMouseEvent* event) override;
61 void mouseReleaseEvent(QMouseEvent* event) override;
62 void wheelEvent(QWheelEvent* event) override;
63
64private:
65 std::chrono::steady_clock::time_point lastFrame;
66 float renderSimTime = 0.0f;
67 std::atomic<float> simSpeed = 1.0f;
68 bool simulating = false;
69
70 QSet<int> pressedKeys;
71 QSet<Qt::MouseButton> pressedMouseButtons;
72 bool mouseLeftHeld = false;
73 bool mouseRightHeld = false;
74
75 QPoint mouseLastPosBeforeCapture;
76
77 bool firstMouse = false;
78 bool mouseCaptured = false;
79
80 std::unique_ptr<Scene> scene;
81 SceneManager* sceneManager = nullptr;
82 std::vector<QPushButton*> objectLabelButtons;
83
84 void calculateFPS();
85 Math::Ray getMouseRay();
86 void updateObjectLabels();
87 void hideObjectLabels();
88};
QSize getFramebufferSize() const
void mouseReleaseEvent(QMouseEvent *event) override
void resizeGL(int w, int h) override
void mousePressEvent(QMouseEvent *event) override
void keyReleaseEvent(QKeyEvent *event) override
void setRenderClockRunning(bool running)
void resetRenderClock(float simTime=0.0f)
bool isKeyPressed(int qtKey) const
void keyPressEvent(QKeyEvent *event) override
void setMouseCaptured(bool captured)
void setScene(std::unique_ptr< Scene > sc)
void fpsUpdated(double fps)
QPointF getMousePos() const
bool isMouseCaptured() const
void handleRawMouseDelta(int dx, int dy)
void glInitialized()
void setSimSpeed(float newSpeed)
~OpenGLWindow() override=default
void paintGL() override
float getSimSpeed() const
void setSceneManager(SceneManager *scm)
bool isMouseButtonHeld(Qt::MouseButton button) const
void initializeGL() override
bool isRenderClockRunning() const
void wheelEvent(QWheelEvent *event) override
Definition Scene.h:11
Represents a ray in 3D space.
Definition Ray.h:11