Physics Simulation & Visualization Tool 0.1
A C++ physics simulation engine with real-time 3D visualization
Loading...
Searching...
No Matches
SceneManager.h
Go to the documentation of this file.
1#pragma once
2#include <QObject>
3#include <memory>
4#include <unordered_map>
5
6#include "ResourceManager.h"
9#include "ui/OpenGLWindow.h"
11
12class PathTraces;
13class Forces;
14class Colliders;
15namespace ScenePresets { struct PresetDescriptor; }
16
17enum class Primitive {
18 CUBE,
19 SPHERE
20};
21
22// TODO: make enum
24 int subjectID = -1; // -1 = No Selection, >=0 = Specific Object
25 int property = 0; // 0=PosY, 1=VelY, 2=Distance...
26 int op = 0; // 0=Less, 1=Greater
27 float value = 0.0f; // The threshold
28 int targetID = -1; // If property is 'Distance', this is the other object
29 glm::vec3 targetPos = glm::vec3(0.0f);
30};
31
32class SceneManager : public QObject {
33 Q_OBJECT
34
35public:
37 ~SceneManager() override;
39 SceneObject* createObject(const std::string &meshName, Shader* shader = ResourceManager::getShader("basic"), const CreationOptions& = ObjectOptions{});
40 void deleteObject(SceneObject* obj);
41 void deleteAllObjects();
42 const std::vector<std::unique_ptr<SceneObject>>& getObjects() const;
43 SceneObject* getObjectByID(uint32_t objectID) const;
44 bool isNameUnique(const std::string& name, SceneObject* self) const;
45 void setObjectName(SceneObject* obj, const std::string& newName);
46 std::string makeUniqueName(const std::string& baseName) const;
47
48 void setCameraTarget(SceneObject* target);
49 void focusObject(SceneObject* target);
50 void clearCameraTarget();
51 bool isCameraFollowing() const { return scene && scene->getCamera() && scene->getCamera()->hasTarget(); }
52 const SceneObject* getCameraTarget() const { return scene && scene->getCamera() ? scene->getCamera()->getTarget() : nullptr; }
53
54 void addToPhysicsSystem(Physics::PhysicsBody* body) const { physicsSystem->addBody(body); }
55 void removeFromPhysicsSystem(Physics::PhysicsBody* body) const { physicsSystem->removeBody(body); }
56 glm::vec3 getGlobalAcceleration() const { return physicsSystem->getGlobalAcceleration(); }
57 void setGlobalAcceleration(const glm::vec3& newAcceleration) const { physicsSystem->setGlobalAcceleration(newAcceleration); }
58 bool isPhysicsRunning() const { return physicsSystem->isPhysicsEnabled(); }
59 float getSimSpeed() const { return window->getSimSpeed(); }
60 void setSimSpeed(float newSpeed) { window->setSimSpeed(newSpeed); physicsSystem->setSimSpeed(newSpeed); }
61 void startSimulation() const { window->setRenderClockRunning(true); physicsSystem->enablePhysics(); }
62 void stopSimulation() const { physicsSystem->disablePhysics(); window->setRenderClockRunning(false); }
63 void stepPhysics(float dt) const { physicsSystem->step(dt); }
64
65 void addPickable(IPickable* obj) { pickableObjects.push_back(obj); }
66 void addDrawable(IDrawable* obj) const { scene->addDrawable(obj); }
67 void removePickable(IPickable* obj);
68 void removeDrawable(IDrawable* obj) const { scene->removeDrawable(obj); }
69 void updateHoverState(const Math::Ray& mouseRay);
70 void selectObject(SceneObject* obj);
71 void setSelectFor(SceneObject *obj, bool flag = true);
72
73 void processHeldKeys(const QSet<int> &heldKeys, float dt);
74 void handleMouseButton(Qt::MouseButton button, QEvent::Type type, Qt::KeyboardModifiers mods);
75 void setGizmoFor(SceneObject *newTarget, bool redraw = false);
76 void deleteCurrentGizmo();
77
78 void applyDebugSettings();
79
80 bool saveScene(const QString &file);
81 bool loadScene(const QString &file);
83 void resetScene();
84
85 void defaultSetup(); // TODO: prob will remove later.
86 std::unordered_set<uint32_t> hoveredIDs, selectedIDs; // TODO: dont make public
87
88 Scene* scene; // TODO: move
89 std::unique_ptr<Physics::PhysicsSystem> physicsSystem; // TODO: move
91
92signals:
95 void objectRenamed(SceneObject* obj, const QString& newName);
96
97 void selectedItem(SceneObject* object); // Left click on object
98 void contextMenuRequested(const QPoint& globalPos, SceneObject* object); // Right Click on object
99
100private:
101 OpenGLWindow* window;
102
103 std::vector<std::unique_ptr<SceneObject>> sceneObjects;
104 std::unordered_map<uint32_t, SceneObject*> sceneObjectsByID;
105 std::vector<IPickable*> pickableObjects;
106
107 GizmoType selectedGizmoType = GizmoType::TRANSLATE;
108 std::unique_ptr<Gizmo> currentGizmo;
109
110 std::string generateDefaultName(const CreationOptions& creationOptions);
111 std::unordered_map<std::string, SceneObject*> usedNames;
112
113 Math::Ray getMouseRay();
114
115 void initDebugDrawables();
116 void removeDebugDrawables();
117
118 std::unique_ptr<PathTraces> pathTraces;
119 std::unique_ptr<Forces> forces;
120 std::unique_ptr<Colliders> colliders;
121
122 // To track if a right click was a click or drag
123 glm::vec3 rightClickStartDir;
124};
GizmoType
Types of transformation gizmos.
Definition Gizmo.h:21
Primitive
std::variant< ObjectOptions, PointMassOptions, RigidBodyOptions > CreationOptions
const SceneObject * getTarget() const
Definition Camera.h:49
bool hasTarget() const
Definition Camera.h:48
Base interface for all renderable objects in the scene.
Definition IDrawable.h:33
Abstract interface for objects that can be selected and interacted with using the mouse.
Definition IPickable.h:28
void setRenderClockRunning(bool running)
void setSimSpeed(float newSpeed)
float getSimSpeed() const
static Shader * getShader(const std::string &name)
void stepPhysics(float dt) const
void contextMenuRequested(const QPoint &globalPos, SceneObject *object)
bool saveScene(const QString &file)
void removePickable(IPickable *obj)
SceneObject * createObject(const std::string &meshName, Shader *shader=ResourceManager::getShader("basic"), const CreationOptions &=ObjectOptions{})
void objectRemoved(SceneObject *obj)
void stopSimulation() const
void selectedItem(SceneObject *object)
void focusObject(SceneObject *target)
const SceneObject * getCameraTarget() const
void addPickable(IPickable *obj)
void startSimulation() const
void deleteObject(SceneObject *obj)
SceneObject * getObjectByID(uint32_t objectID) const
void setGizmoFor(SceneObject *newTarget, bool redraw=false)
void deleteAllObjects()
void processHeldKeys(const QSet< int > &heldKeys, float dt)
bool isNameUnique(const std::string &name, SceneObject *self) const
void selectObject(SceneObject *obj)
void setSimSpeed(float newSpeed)
std::unordered_set< uint32_t > selectedIDs
void objectAdded(SceneObject *obj)
void objectRenamed(SceneObject *obj, const QString &newName)
bool isCameraFollowing() const
bool loadScene(const QString &file)
void setGlobalAcceleration(const glm::vec3 &newAcceleration) const
SceneObject * createPrimitive(Primitive type, Shader *shader, const CreationOptions &=ObjectOptions{})
bool isPhysicsRunning() const
void removeFromPhysicsSystem(Physics::PhysicsBody *body) const
void updateHoverState(const Math::Ray &mouseRay)
void deleteCurrentGizmo()
std::unique_ptr< Physics::PhysicsSystem > physicsSystem
SimulationStopCondition stopCondition
void setObjectName(SceneObject *obj, const std::string &newName)
void setCameraTarget(SceneObject *target)
void addToPhysicsSystem(Physics::PhysicsBody *body) const
std::string makeUniqueName(const std::string &baseName) const
void removeDrawable(IDrawable *obj) const
void handleMouseButton(Qt::MouseButton button, QEvent::Type type, Qt::KeyboardModifiers mods)
void defaultSetup()
void addDrawable(IDrawable *obj) const
void clearCameraTarget()
std::unordered_set< uint32_t > hoveredIDs
glm::vec3 getGlobalAcceleration() const
bool loadPreset(const ScenePresets::PresetDescriptor &preset)
float getSimSpeed() const
Scene * scene
~SceneManager() override
void applyDebugSettings()
void setSelectFor(SceneObject *obj, bool flag=true)
const std::vector< std::unique_ptr< SceneObject > > & getObjects() const
Definition Scene.h:11
void removeDrawable(IDrawable *drawable)
Definition Scene.cpp:204
Camera * getCamera()
Definition Scene.cpp:190
void addDrawable(IDrawable *drawable)
Definition Scene.cpp:194
Definition Shader.h:6
Represents a ray in 3D space.
Definition Ray.h:11