Physics Simulation & Visualization Tool 0.1
A C++ physics simulation engine with real-time 3D visualization
Loading...
Searching...
No Matches
PhysicsBody.h
Go to the documentation of this file.
1#pragma once
2#include <atomic>
3#include <string>
4#include <utility>
5#include <glm/glm.hpp>
6#include <vector>
7#include <map>
8#include <mutex>
9#include <unordered_set>
10
12
13class ICollider;
14
15namespace Physics {
16 namespace Bounding {
17 class ICollider;
18 }
19
20 class PointMass;
21 class RigidBody;
22 class PhysicsBody;
23}
24
25enum class BodyLock {
26 LOCK,
27 NOLOCK
28};
29
30constexpr BodyLock operator!(BodyLock lock) {
32}
33
36 float time;
37 glm::vec3 position;
38 glm::vec3 velocity;
40};
41
42namespace Physics {
44 public:
45 PhysicsBody() = delete;
46 virtual ~PhysicsBody() = default;
47
48 virtual void step(float dt, BodyLock lock) = 0;
49 virtual void recordFrame(float t, BodyLock lock) = 0;
50 virtual void loadFrame(const ObjectSnapshot& snapshot, BodyLock lock) = 0;
51
52 std::unique_lock<std::mutex> lockState() const { return std::unique_lock(stateMutex); }
53
54 uint32_t getID() const { return id; }
55 bool isUnknown(const std::string& key, BodyLock lock) const;
56 void setUnknown(const std::string& key, bool active, BodyLock lock);
57
58 void setForce(const std::string& name, const glm::vec3& force, BodyLock lock);
59 glm::vec3 getForce(const std::string& name, BodyLock lock) const;
60 glm::vec3 getNetForce(BodyLock lock) const;
61 std::map<std::string, glm::vec3> getAllForces(BodyLock lock) const;
62
63 glm::vec3 getPosition(BodyLock lock) const;
64 void setPosition(const glm::vec3& pos, BodyLock lock);
65 glm::vec3 getVelocity(BodyLock lock) const;
66 void setVelocity(const glm::vec3& vel, BodyLock lock);
67 virtual double getMass(BodyLock lock) const;
68 virtual void setMass(double newMass, BodyLock lock);
70 virtual void setThermalProperty(const ThermalProperties& newProps, BodyLock lock);
71 float getSurfaceArea() const { return surfaceArea; }
72 bool getIsStatic(BodyLock lock) const;
73 void setIsStatic(bool newStatic, BodyLock lock);
74
75 glm::mat4 getWorldTransform(BodyLock lock) const;
76 void setWorldTransform(const glm::mat4& M, BodyLock lock);
77 void setGlobalAccelerationRef(std::atomic<glm::vec3>& globalAccRef) { globalAccelPtr = &globalAccRef; }
78 void clearAllFrames(BodyLock lock);
79
80 template <typename F>
81 void withFrames(BodyLock lock, F&& fn) const;
82
83 virtual Bounding::ICollider *getCollider() const { return nullptr; }
84
85 // Uses double dispatch
86 virtual bool collidesWith(const PhysicsBody& other) const = 0;
87 virtual bool collidesWithPointMass(const PointMass& pm) const = 0;
88 virtual bool collidesWithRigidBody(const RigidBody& rb) const = 0;
89
90 virtual bool resolveCollisionWith(float dt, PhysicsBody& other) = 0;
91 virtual bool resolveCollisionWithPointMass(float dt, PointMass& pm) = 0;
92 virtual bool resolveCollisionWithRigidBody(float dt, RigidBody& rb) = 0;
93 protected:
94 explicit PhysicsBody(uint32_t _id) : id(_id) {}
95
96 mutable std::mutex stateMutex;
97 std::vector<ObjectSnapshot> frames;
98 float surfaceArea = 1.0f;
99 private:
100 bool isStatic = false;
101 uint32_t id;
102
103 glm::vec3 position = glm::vec3(0.0f);
104 glm::vec3 velocity = glm::vec3(0.0f);
105 glm::vec3 netForce = glm::vec3(0.0f);
106 std::map<std::string, glm::vec3> forces;
107
108 std::unordered_set<std::string> unknowns;
109
110 glm::mat4 worldMatrix = glm::mat4(1.0f);
111 std::atomic<glm::vec3>* globalAccelPtr = nullptr;
112
113 double mass = 1.0;
114 ThermalProperties thermalProps;
115 };
116
117 template <typename F>
118 void PhysicsBody::withFrames(BodyLock lock, F&& fn) const {
119 std::unique_lock<std::mutex> maybeLock;
120 if (lock == BodyLock::LOCK)
121 maybeLock = std::unique_lock<std::mutex>(stateMutex);
122 std::forward<F>(fn)(frames);
123 }
124}
constexpr BodyLock operator!(BodyLock lock)
Definition PhysicsBody.h:30
Physics::PhysicsBody * body
Definition PhysicsBody.h:35
glm::vec3 velocity
Definition PhysicsBody.h:38
BodyLock
Definition PhysicsBody.h:25
glm::vec3 position
Definition PhysicsBody.h:37
Abstract base class for collision volumes in the physics engine.
Definition ICollider.h:64
virtual double getMass(BodyLock lock) const
virtual void recordFrame(float t, BodyLock lock)=0
bool isUnknown(const std::string &key, BodyLock lock) const
glm::vec3 getForce(const std::string &name, BodyLock lock) const
virtual bool collidesWithPointMass(const PointMass &pm) const =0
void setPosition(const glm::vec3 &pos, BodyLock lock)
glm::mat4 getWorldTransform(BodyLock lock) const
virtual ~PhysicsBody()=default
void clearAllFrames(BodyLock lock)
float getSurfaceArea() const
Definition PhysicsBody.h:71
glm::vec3 getVelocity(BodyLock lock) const
PhysicsBody(uint32_t _id)
Definition PhysicsBody.h:94
uint32_t getID() const
Definition PhysicsBody.h:54
virtual ThermalProperties getThermalProperties(BodyLock lock) const
virtual bool resolveCollisionWith(float dt, PhysicsBody &other)=0
void setUnknown(const std::string &key, bool active, BodyLock lock)
void setGlobalAccelerationRef(std::atomic< glm::vec3 > &globalAccRef)
Definition PhysicsBody.h:77
std::map< std::string, glm::vec3 > getAllForces(BodyLock lock) const
glm::vec3 getNetForce(BodyLock lock) const
std::unique_lock< std::mutex > lockState() const
Definition PhysicsBody.h:52
void setWorldTransform(const glm::mat4 &M, BodyLock lock)
virtual bool collidesWith(const PhysicsBody &other) const =0
bool getIsStatic(BodyLock lock) const
void setVelocity(const glm::vec3 &vel, BodyLock lock)
void withFrames(BodyLock lock, F &&fn) const
virtual void loadFrame(const ObjectSnapshot &snapshot, BodyLock lock)=0
virtual bool collidesWithRigidBody(const RigidBody &rb) const =0
glm::vec3 getPosition(BodyLock lock) const
std::mutex stateMutex
Definition PhysicsBody.h:96
void setForce(const std::string &name, const glm::vec3 &force, BodyLock lock)
std::vector< ObjectSnapshot > frames
Definition PhysicsBody.h:97
virtual void setMass(double newMass, BodyLock lock)
virtual Bounding::ICollider * getCollider() const
Definition PhysicsBody.h:83
virtual void setThermalProperty(const ThermalProperties &newProps, BodyLock lock)
virtual bool resolveCollisionWithRigidBody(float dt, RigidBody &rb)=0
virtual bool resolveCollisionWithPointMass(float dt, PointMass &pm)=0
virtual void step(float dt, BodyLock lock)=0
void setIsStatic(bool newStatic, BodyLock lock)