9#include <unordered_set>
54 uint32_t
getID()
const {
return id; }
58 void setForce(
const std::string& name,
const glm::vec3& force,
BodyLock lock);
100 bool isStatic =
false;
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;
108 std::unordered_set<std::string> unknowns;
110 glm::mat4 worldMatrix = glm::mat4(1.0f);
111 std::atomic<glm::vec3>* globalAccelPtr =
nullptr;
117 template <
typename F>
119 std::unique_lock<std::mutex> maybeLock;
121 maybeLock = std::unique_lock<std::mutex>(
stateMutex);
122 std::forward<F>(fn)(
frames);
constexpr BodyLock operator!(BodyLock lock)
Physics::PhysicsBody * body
Abstract base class for collision volumes in the physics engine.
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
glm::vec3 getVelocity(BodyLock lock) const
PhysicsBody(uint32_t _id)
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)
std::map< std::string, glm::vec3 > getAllForces(BodyLock lock) const
glm::vec3 getNetForce(BodyLock lock) const
std::unique_lock< std::mutex > lockState() const
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
void setForce(const std::string &name, const glm::vec3 &force, BodyLock lock)
std::vector< ObjectSnapshot > frames
virtual void setMass(double newMass, BodyLock lock)
virtual Bounding::ICollider * getCollider() const
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)