9constexpr float kPointMassCollisionDistance = 0.01f;
10constexpr double kContactAreaFraction = 0.01;
11constexpr double kContactConductionDistance = 0.01;
20 recomputeSurfaceArea();
28 recomputeSurfaceArea();
32 std::unique_lock<std::mutex> maybeLock;
34 maybeLock = std::unique_lock<std::mutex>(stateMutex);
37 recomputeSurfaceArea();
41 std::unique_lock<std::mutex> maybeLock;
43 maybeLock = std::unique_lock<std::mutex>(stateMutex);
46 recomputeSurfaceArea();
49void Physics::PointMass::recomputeSurfaceArea() {
54 double volume = curMass / density;
55 float radius = std::cbrt((3.0f * volume) / (4.0f * glm::pi<float>()));
56 surfaceArea = 4.0f * glm::pi<float>() * radius * radius;
64 std::unique_lock<std::mutex> maybeLock;
66 maybeLock = std::unique_lock<std::mutex>(stateMutex);
71 setVelocity(curVel + impulse *
static_cast<float>(1.0 / curMass),
BodyLock::NOLOCK);
75 std::unique_lock<std::mutex> maybeLock;
77 maybeLock = std::unique_lock<std::mutex>(stateMutex);
83 std::unique_lock<std::mutex> maybeLock;
85 maybeLock = std::unique_lock<std::mutex>(stateMutex);
95 std::unique_lock<std::mutex> maybeLock;
97 maybeLock = std::unique_lock<std::mutex>(stateMutex);
124 std::lock_guard<std::mutex> lock(stateMutex);
127 float velNorm = glm::dot(relVel, normal);
133 glm::vec3 impulse = j * normal;
142 const double contactArea = kContactAreaFraction * std::min(getSurfaceArea(), pm.
getSurfaceArea());
143 const double distance = kContactConductionDistance;
147 contactArea, distance, dt
virtual double getMass(BodyLock lock) const
virtual bool collidesWithPointMass(const PointMass &pm) const =0
void setPosition(const glm::vec3 &pos, BodyLock lock)
float getSurfaceArea() const
glm::vec3 getVelocity(BodyLock lock) const
virtual ThermalProperties getThermalProperties(BodyLock lock) const
void setVelocity(const glm::vec3 &vel, BodyLock lock)
glm::vec3 getPosition(BodyLock lock) const
virtual void setMass(double newMass, BodyLock lock)
virtual void setThermalProperty(const ThermalProperties &newProps, BodyLock lock)
virtual bool resolveCollisionWithPointMass(float dt, PointMass &pm)=0
void setIsStatic(bool newStatic, BodyLock lock)
void recordFrame(float t, BodyLock lock) override
void step(float dt, BodyLock lock) override
void setMass(double newMass, BodyLock lock) override
bool collidesWithRigidBody(const RigidBody &rb) const override
bool collidesWith(const PhysicsBody &other) const override
bool resolveCollisionWithRigidBody(float dt, RigidBody &rb) override
bool resolveCollisionWith(float dt, PhysicsBody &other) override
void loadFrame(const ObjectSnapshot &snapshot, BodyLock lock) override
bool resolveCollisionWithPointMass(float dt, PointMass &pm) override
void applyImpulse(const glm::vec3 &impulse, BodyLock lock)
void setThermalProperty(const ThermalProperties &newProps, BodyLock lock) override
bool collidesWithPointMass(const PointMass &pm) const override
PointMass(uint32_t id, double m, glm::vec3 pos=glm::vec3(0.0f), bool isStatic=false)
bool collidesWithPointMass(const PointMass &pm) const override
bool resolveCollisionWithPointMass(float dt, PointMass &pm) override
void applyConductiveExchange(ThermalProperties &a, double massA, ThermalProperties &b, double massB, double areaM2, double distanceM, double dt)
double effectiveDensity(const ThermalProperties &props, double tempK)