Physics Simulation & Visualization Tool 0.1
A C++ physics simulation engine with real-time 3D visualization
Loading...
Searching...
No Matches
PhysicsBody.cpp
Go to the documentation of this file.
2
3#include <algorithm>
4#include <cmath>
5#include <iostream>
7
8bool Physics::PhysicsBody::isUnknown(const std::string &key, BodyLock lock) const {
9 std::unique_lock<std::mutex> maybeLock;
10 if (lock == BodyLock::LOCK)
11 maybeLock = std::unique_lock<std::mutex>(stateMutex);
12
13 return unknowns.find(key) != unknowns.end();
14}
15
16void Physics::PhysicsBody::setUnknown(const std::string &key, bool active, BodyLock lock) {
17 std::unique_lock<std::mutex> maybeLock;
18 if (lock == BodyLock::LOCK)
19 maybeLock = std::unique_lock<std::mutex>(stateMutex);
20
21 if (active) {
22 unknowns.insert(key);
23 } else {
24 unknowns.erase(key);
25 }
26}
27
28void Physics::PhysicsBody::setForce(const std::string &name, const glm::vec3 &force, BodyLock lock) {
29 std::unique_lock<std::mutex> maybeLock;
30 if (lock == BodyLock::LOCK)
31 maybeLock = std::unique_lock<std::mutex>(stateMutex);
32
33 // Recalculate net force
34 auto it = forces.find(name);
35 if (it != forces.end()) {
36 // Its old value we remove it
37 netForce -= it->second;
38 it->second = force;
39 } else {
40 forces[name] = force;
41 }
42 // Just add new force
43 netForce += force;
44}
45
46glm::vec3 Physics::PhysicsBody::getForce(const std::string &name, BodyLock lock) const {
47 std::unique_lock<std::mutex> maybeLock;
48 if (lock == BodyLock::LOCK)
49 maybeLock = std::unique_lock<std::mutex>(stateMutex);
50
51 auto it = forces.find(name);
52 if (it == forces.end()) {
53 return glm::vec3(0.0f); // Return zero vector if key doesn't exist
54 }
55
56 return forces.find(name)->second;
57}
58
59std::map<std::string, glm::vec3> Physics::PhysicsBody::getAllForces(BodyLock lock) const {
60 std::unique_lock<std::mutex> maybeLock;
61 if (lock == BodyLock::LOCK)
62 maybeLock = std::unique_lock<std::mutex>(stateMutex);
63
64 return forces;
65}
66
68 std::unique_lock<std::mutex> maybeLock;
69 if (lock == BodyLock::LOCK)
70 maybeLock = std::unique_lock<std::mutex>(stateMutex);
71
72 return netForce;
73}
74
76 std::unique_lock<std::mutex> maybeLock;
77 if (lock == BodyLock::LOCK)
78 maybeLock = std::unique_lock<std::mutex>(stateMutex);
79
80 return position;
81}
82
83void Physics::PhysicsBody::setPosition(const glm::vec3 &pos, BodyLock lock) {
84 std::unique_lock<std::mutex> maybeLock;
85 if (lock == BodyLock::LOCK)
86 maybeLock = std::unique_lock<std::mutex>(stateMutex);
87
88 position = pos;
89}
90
92 std::unique_lock<std::mutex> maybeLock;
93 if (lock == BodyLock::LOCK)
94 maybeLock = std::unique_lock<std::mutex>(stateMutex);
95
96 return velocity;
97}
98
99void Physics::PhysicsBody::setVelocity(const glm::vec3 &vel, BodyLock lock) {
100 std::unique_lock<std::mutex> maybeLock;
101 if (lock == BodyLock::LOCK)
102 maybeLock = std::unique_lock<std::mutex>(stateMutex);
103
104 velocity = vel;
105}
106
108 std::unique_lock<std::mutex> maybeLock;
109 if (lock == BodyLock::LOCK)
110 maybeLock = std::unique_lock<std::mutex>(stateMutex);
111
112 return mass;
113}
114
115void Physics::PhysicsBody::setMass(double newMass, BodyLock lock) {
116 if (newMass <= 0.0) {
117 std::cerr << "Warning: Invalid mass " << newMass << ". Ignoring." << std::endl;
118 return;
119 }
120
121 std::unique_lock<std::mutex> maybeLock;
122 if (lock == BodyLock::LOCK)
123 maybeLock = std::unique_lock<std::mutex>(stateMutex);
124 mass = newMass;
125}
126
128 std::unique_lock<std::mutex> maybeLock;
129 if (lock == BodyLock::LOCK)
130 maybeLock = std::unique_lock<std::mutex>(stateMutex);
131
132 return isStatic;
133}
134
136 std::unique_lock<std::mutex> maybeLock;
137 if (lock == BodyLock::LOCK)
138 maybeLock = std::unique_lock<std::mutex>(stateMutex);
139
140 isStatic = flag;
141}
142
144 std::unique_lock<std::mutex> maybeLock;
145 if (lock == BodyLock::LOCK)
146 maybeLock = std::unique_lock<std::mutex>(stateMutex);
147
148 return worldMatrix;
149}
150
151void Physics::PhysicsBody::setWorldTransform(const glm::mat4 &M, BodyLock lock) {
152 std::unique_lock<std::mutex> maybeLock;
153 if (lock == BodyLock::LOCK)
154 maybeLock = std::unique_lock<std::mutex>(stateMutex);
155
156 worldMatrix = M;
157}
158
160 std::unique_lock<std::mutex> maybeLock;
161 if (lock == BodyLock::LOCK)
162 maybeLock = std::unique_lock<std::mutex>(stateMutex);
163
164 frames.clear();
165}
166
168 std::unique_lock<std::mutex> maybeLock;
169 if (lock == BodyLock::LOCK)
170 maybeLock = std::unique_lock<std::mutex>(stateMutex);
171
172 thermalProps = newProps;
173 thermalProps.tempK = Physics::Thermal::clampTemperature(thermalProps.tempK);
174 if (!std::isfinite(thermalProps.internalHeatPower)) thermalProps.internalHeatPower = 0.0;
175 if (!std::isfinite(thermalProps.externalHeatFlux)) thermalProps.externalHeatFlux = 0.0;
176 if (!std::isfinite(thermalProps.entropyJPerK)) thermalProps.entropyJPerK = 0.0;
177 thermalProps.referenceTempK = Physics::Thermal::clampTemperature(thermalProps.referenceTempK);
178 thermalProps.specificHeat = std::max(thermalProps.specificHeat, 0.0f);
179 if (!std::isfinite(thermalProps.specificHeatTempCoeff)) thermalProps.specificHeatTempCoeff = 0.0f;
180 thermalProps.thermalMassFraction = std::clamp(thermalProps.thermalMassFraction, 0.0f, 1.0f);
181 thermalProps.emissivity = std::clamp(thermalProps.emissivity, 0.0f, 1.0f);
182 if (!std::isfinite(thermalProps.emissivityTempCoeff)) thermalProps.emissivityTempCoeff = 0.0f;
183 thermalProps.absorptivity = std::clamp(thermalProps.absorptivity, 0.0f, 1.0f);
184 if (!std::isfinite(thermalProps.absorptivityTempCoeff)) thermalProps.absorptivityTempCoeff = 0.0f;
185 thermalProps.heatTransferCoeff = std::max(thermalProps.heatTransferCoeff, 0.0f);
186 thermalProps.conductivity = std::max(thermalProps.conductivity, 0.0f);
187 if (!std::isfinite(thermalProps.conductivityTempCoeff)) thermalProps.conductivityTempCoeff = 0.0f;
188 thermalProps.density = std::max(thermalProps.density, 0.0f);
189 if (!std::isfinite(thermalProps.linearExpansionCoeff)) thermalProps.linearExpansionCoeff = 0.0f;
190 thermalProps.meltingPoint = std::max(thermalProps.meltingPoint, 0.0f);
191 thermalProps.latentHeatFusion = std::max(thermalProps.latentHeatFusion, 0.0f);
192 thermalProps.fusionProgress = std::clamp(thermalProps.fusionProgress, 0.0f, 1.0f);
193 thermalProps.boilingPoint = std::max(thermalProps.boilingPoint, 0.0f);
194 thermalProps.latentHeatVaporization = std::max(thermalProps.latentHeatVaporization, 0.0f);
195 thermalProps.vaporizationProgress = std::clamp(thermalProps.vaporizationProgress, 0.0f, 1.0f);
196}
197
199 std::unique_lock<std::mutex> maybeLock;
200 if (lock == BodyLock::LOCK)
201 maybeLock = std::unique_lock<std::mutex>(stateMutex);
202
203 return thermalProps;
204}
BodyLock
Definition PhysicsBody.h:25
virtual double getMass(BodyLock lock) const
bool isUnknown(const std::string &key, BodyLock lock) const
glm::vec3 getForce(const std::string &name, BodyLock lock) const
void setPosition(const glm::vec3 &pos, BodyLock lock)
glm::mat4 getWorldTransform(BodyLock lock) const
void clearAllFrames(BodyLock lock)
glm::vec3 getVelocity(BodyLock lock) const
virtual ThermalProperties getThermalProperties(BodyLock lock) const
void setUnknown(const std::string &key, bool active, BodyLock lock)
std::map< std::string, glm::vec3 > getAllForces(BodyLock lock) const
glm::vec3 getNetForce(BodyLock lock) const
void setWorldTransform(const glm::mat4 &M, BodyLock lock)
bool getIsStatic(BodyLock lock) const
void setVelocity(const glm::vec3 &vel, BodyLock lock)
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)
virtual void setMass(double newMass, BodyLock lock)
virtual void setThermalProperty(const ThermalProperties &newProps, BodyLock lock)
void setIsStatic(bool newStatic, BodyLock lock)
double clampTemperature(double tempK)