1#include "physics/RigidBody.h"
3#include <btBulletCollisionCommon.h>
4#include <btBulletDynamicsCommon.h>
7#include "LinearMath/btVector3.h"
8#include "physics/CollisionObject.h"
14 , m_collider(collider)
16 , m_friction(friction)
25 btVector3 inertia(0, 0, 0);
28 m_collider->GetShape()->calculateLocalInertia(btScalar(mass), inertia);
31 btTransform transform;
32 transform.setIdentity();
33 btDefaultMotionState *motionState =
new btDefaultMotionState(transform);
35 btRigidBody::btRigidBodyConstructionInfo info(
36 (m_type ==
BodyType::Dynamic) ? btScalar(mass) : btScalar(0), motionState, m_collider->GetShape(), inertia
39 m_body = std::make_unique<btRigidBody>(info);
40 m_body->setFriction(friction);
41 m_body->setUserPointer(
this);
45 m_body->setCollisionFlags(m_body->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT);
46 m_body->setActivationState(DISABLE_DEACTIVATION);
65 m_addedToWorld = added;
70 return m_addedToWorld;
85 auto &tr = m_body->getWorldTransform();
86 tr.setOrigin(btVector3(btScalar(pos.x), btScalar(pos.y), btScalar(pos.z)));
87 if (m_body->getMotionState())
89 m_body->getMotionState()->setWorldTransform(tr);
91 m_body->setWorldTransform(tr);
98 return vec3(0.0f, 0.0f, 0.0f);
100 const auto &pos = m_body->getWorldTransform().getOrigin();
101 return glm::vec3(pos.x(), pos.y(), pos.z());
111 auto &tr = m_body->getWorldTransform();
112 tr.setRotation(btQuaternion(btScalar(rot.x), btScalar(rot.y), btScalar(rot.z), btScalar(rot.w)));
113 if (m_body->getMotionState())
115 m_body->getMotionState()->setWorldTransform(tr);
117 m_body->setWorldTransform(tr);
124 return quat(1.0f, 0.0f, 0.0f, 0.0f);
126 const auto &rot = m_body->getWorldTransform().getRotation();
127 return glm::quat(rot.w(), rot.x(), rot.y(), rot.z());
136 m_body->applyCentralImpulse(btVector3(btScalar(impulse.x), btScalar(impulse.y), btScalar(impulse.z)));
145 m_body->setCcdMotionThreshold(btScalar(motionThreshold));
146 m_body->setCcdSweptSphereRadius(btScalar(sweptRadius));
CollisionObjectType m_collisionObjType
static Engine & GetInstance()
Returns the single Engine instance (created on first call).
PhysicsManager & GetPhysicsManager()
void RemoveRigidBody(RigidBody *body)
Unregister a rigid body (e.g. when its owning component is destroyed).
glm::quat GetRotation() const
glm::vec3 GetPosition() const
void EnableCcd(float motionThreshold, float sweptRadius)
void SetPosition(const glm::vec3 &pos)
Teleport the body (bypasses the solver — use sparingly on Dynamic bodies).
RigidBody(BodyType type, const std::shared_ptr< Collider > &collider, float mass, float friction)
bool IsAddedToWorld() const
void SetRotation(const glm::quat &rot)
btRigidBody * GetBody()
Underlying Bullet body (borrowed, do not delete).
void ApplyImpulse(const vec3 &impulse)
void SetAddedToWorld(bool added)
Track whether this body is currently registered with a PhysicsManager.
glm::vec3 vec3
3-component float vector (e.g. world position, RGB colour, normals).
glm::quat quat
Unit quaternion for rotation (avoids gimbal lock).
BodyType
Simulation category for a RigidBody.