Physics Simulation & Visualization Tool 0.1
A C++ physics simulation engine with real-time 3D visualization
Loading...
Searching...
No Matches
PhysicsSystem.h
Go to the documentation of this file.
1#pragma once
2#include <vector>
3#include <atomic>
4#include <mutex>
5#include <thread>
6#include <condition_variable>
7#include <optional>
8
9#include "RigidBody.h"
10#include "physics/Constants.h"
12#include "spatial/Octree.h"
13#include "spatial/BVH.h"
14
15namespace Physics {
17 public:
18 explicit PhysicsSystem(const glm::vec3& globalAccel = glm::vec3(0.0f, -Constants::STANDARD_GRAVITY, 0.0f));
20
21 // thread control
22 void start();
23 void stop();
24 void waitForStop();
25
26 void addBody(PhysicsBody* body);
27 void removeBody(PhysicsBody* body);
28 PhysicsBody* getBodyById(uint32_t id) const;
29
30 bool step(float dt);
31
32 void enablePhysics();
33 void disablePhysics();
34 bool isPhysicsEnabled() const { return physicsEnabled.load(); }
35
36 glm::vec3 getGlobalAcceleration() const { return globalAcceleration.load(); }
37 void setGlobalAcceleration(const glm::vec3& newAcceleration) { globalAcceleration.store(newAcceleration); }
38 float getSimSpeed() const { return simSpeed.load(); }
39 void setSimSpeed(float newSpeed) { simSpeed.store(newSpeed); }
40 double getGravitationalConstant() const { return gravitationalConstant.load(); }
41 void setGravitationalConstant(double newG) { gravitationalConstant.store(newG); }
42
43 float getAmbientTemperature() const { return ambientTemperature.load(); }
44 void setAmbientTemperature(float newTemp) { ambientTemperature.store(newTemp); }
45
46 std::optional<std::vector<ObjectSnapshot>> fetchLatestSnapshot(float renderSimTime);
47
48 const ProblemRouter* getRouter() const { return &router; }
49 void solveProblem(PhysicsBody* body, const std::unordered_map<std::string, double>& knowns, const std::string& unknown = "");
50 void reset();
51 void clearRuntimeState();
52
53 float simTime = 0.0f; // TODO move
54
55 private:
56 void physicsLoop();
57 void advancePhysics(float dt);
58
59 ProblemRouter router;
60 std::unique_ptr<ISolver> solver = nullptr;
61 float solverTargetTime = 10.0f;
62 std::unordered_map<PhysicsBody*, ObjectSnapshot> resetState{};
63
64 Octree octree;
65
66 std::atomic<glm::vec3> globalAcceleration;
67 std::atomic<float> simSpeed{1.0f};
68 std::atomic<double> gravitationalConstant{Constants::G};
69 std::atomic<float> ambientTemperature{293.15f};
70 std::atomic<long long> stepCount{0};
71 std::vector<PhysicsBody*> bodies;
72
73 std::atomic<bool> physicsEnabled{false};
74
75 // threading
76 std::thread physicsThread;
77 mutable std::mutex bodiesMutex;
78 std::atomic<bool> threadRunning{false};
79
80 std::mutex snapshotMutex;
81 std::vector<ObjectSnapshot> currentSnapshots;
82 std::vector<ObjectSnapshot> previousSnapshots;
83 std::atomic<bool> snapshotReady{false};
84 };
85
86}
std::optional< std::vector< ObjectSnapshot > > fetchLatestSnapshot(float renderSimTime)
bool isPhysicsEnabled() const
void setGlobalAcceleration(const glm::vec3 &newAcceleration)
void solveProblem(PhysicsBody *body, const std::unordered_map< std::string, double > &knowns, const std::string &unknown="")
float getSimSpeed() const
void addBody(PhysicsBody *body)
glm::vec3 getGlobalAcceleration() const
void setAmbientTemperature(float newTemp)
void setSimSpeed(float newSpeed)
float getAmbientTemperature() const
void removeBody(PhysicsBody *body)
void setGravitationalConstant(double newG)
const ProblemRouter * getRouter() const
double getGravitationalConstant() const
PhysicsBody * getBodyById(uint32_t id) const
constexpr float STANDARD_GRAVITY
Definition Constants.h:9
constexpr double G
Definition Constants.h:5