Monad Engine da02fba2
> Undercity Codex_
Loading...
Searching...
No Matches
RigidBody.cpp
Go to the documentation of this file.
1#include "physics/RigidBody.h"
2#include "Engine.h"
3
4#include <btBulletCollisionCommon.h>
5#include <btBulletDynamicsCommon.h>
6
7namespace eng
8{
9 RigidBody::RigidBody(BodyType type, const std::shared_ptr<Collider>& collider, float mass, float friction)
10 : m_type(type), m_collider(collider), m_mass(mass), m_friction(friction)
11 {
12 if (!collider)
13 {
14 return;
15 }
16
18
19 btVector3 intertia(0, 0, 0);
20 if (m_type == BodyType::Dynamic && mass > 0.0f && m_collider->GetShape())
21 {
22 m_collider->GetShape()->calculateLocalInertia(btScalar(mass), intertia);
23 }
24
25 btTransform transform;
26 transform.setIdentity();
27 btDefaultMotionState* motionState = new btDefaultMotionState(transform);
28
29 btRigidBody::btRigidBodyConstructionInfo info(
30 (m_type == BodyType::Dynamic) ? btScalar(mass) : btScalar(0),
31 motionState, m_collider->GetShape(), intertia
32 );
33
34 m_body = std::make_unique<btRigidBody>(info);
35 m_body->setFriction(friction);
36 m_body->setUserPointer(this);
37
38 if (m_type == BodyType::Kinematic)
39 {
40 m_body->setCollisionFlags(m_body->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT);
41 m_body->setActivationState(DISABLE_DEACTIVATION);
42 }
43 }
44
46 {
47 if (m_addedToWorld)
48 {
50 }
51 }
52
53 btRigidBody* RigidBody::GetBody()
54 {
55 return m_body.get();
56 }
57
59 {
60 m_addedToWorld = added;
61 }
62
64 {
65 return m_addedToWorld;
66 }
67
69 {
70 return m_type;
71 }
72
73 void RigidBody::SetPosition(const glm::vec3& pos)
74 {
75 if (!m_body)
76 {
77 return;
78 }
79
80 auto& tr = m_body->getWorldTransform();
81 tr.setOrigin(btVector3(btScalar(pos.x), btScalar(pos.y), btScalar(pos.z)));
82 if (m_body->getMotionState())
83 {
84 m_body->getMotionState()->setWorldTransform(tr);
85 }
86 m_body->setWorldTransform(tr);
87 }
88
89 glm::vec3 RigidBody::GetPosition() const
90 {
91 if (!m_body)
92 {
93 return glm::vec3(0.0f, 0.0f, 0.0f);
94 }
95 const auto& pos = m_body->getWorldTransform().getOrigin();
96 return glm::vec3(pos.x(), pos.y(), pos.z());
97 }
98
99 void RigidBody::SetRotation(const glm::quat& rot)
100 {
101 if (!m_body)
102 {
103 return;
104 }
105
106 auto& tr = m_body->getWorldTransform();
107 tr.setRotation(btQuaternion(btScalar(rot.x), btScalar(rot.y), btScalar(rot.z), btScalar(rot.w)));
108 if (m_body->getMotionState())
109 {
110 m_body->getMotionState()->setWorldTransform(tr);
111 }
112 m_body->setWorldTransform(tr);
113 }
114
115 glm::quat RigidBody::GetRotation() const
116 {
117 if (!m_body)
118 {
119 return glm::quat(1.0f, 0.0f, 0.0f, 0.0f);
120 }
121 const auto& rot = m_body->getWorldTransform().getRotation();
122 return glm::quat(rot.w(), rot.x(), rot.y(), rot.z());
123 }
124
125 void RigidBody::ApplyImpulse(const glm::vec3& impulse)
126 {
127 if (!m_body)
128 {
129 return;
130 }
131 m_body->applyCentralImpulse(btVector3(
132 btScalar(impulse.x), btScalar(impulse.y), btScalar(impulse.z)
133 ));
134 }
135}
CollisionObjectType m_collisionObjectType
static Engine & GetInstance()
Definition Engine.cpp:50
PhysicsManager & GetPhysicsManager()
Definition Engine.cpp:215
void RemoveRigidBody(RigidBody *body)
void SetRotation(const glm::quat &rot)
Definition RigidBody.cpp:99
bool IsAddedToWorld() const
Definition RigidBody.cpp:63
void ApplyImpulse(const glm::vec3 &impulse)
void SetPosition(const glm::vec3 &pos)
Definition RigidBody.cpp:73
btRigidBody * GetBody()
Definition RigidBody.cpp:53
void SetAddedToWorld(bool added)
Definition RigidBody.cpp:58
BodyType GetType() const
Definition RigidBody.cpp:68
glm::quat GetRotation() const
RigidBody(BodyType type, const std::shared_ptr< Collider > &collider, float mass, float friction)
Definition RigidBody.cpp:9
glm::vec3 GetPosition() const
Definition RigidBody.cpp:89
BodyType
Definition RigidBody.h:14