StevEngine
StevEngine is a customizable C++ game engine.
Loading...
Searching...
No Matches
RigidBody.hpp
1#pragma once
2#include "utilities/Stream.hpp"
3#ifdef StevEngine_PHYSICS
4#include "main/Component.hpp"
5#include "utilities/Vector3.hpp"
6#include "utilities/Quaternion.hpp"
7#include "physics/Colliders.hpp"
8#include "physics/Layers.hpp"
9
10//Jolt imports
11#include <Jolt/Jolt.h>
12#include <Jolt/Physics/Collision/Shape/StaticCompoundShape.h>
13#include <Jolt/Physics/Body/BodyManager.h>
14#include <Jolt/Physics/Body/BodyCreationSettings.h>
15
16#define RIGIDBODY_TYPE "RigidBody"
17
18namespace StevEngine::Physics {
28 JPH::EAllowedDOFs AllowedDOFs;
29
40 double gravityFactor = 1.0,
41 double linearDamping = 0.0,
42 double angularDamping = 0.0,
43 JPH::EAllowedDOFs allowedDOFs = JPH::EAllowedDOFs::All,
44 double maxLinearVelocity = 0.0,
45 double maxAngularVelocity = 0.0
46 ) {
47 this->LinearDamping = linearDamping;
48 this->AngularDamping = angularDamping;
49 this->MaxLinearVelocity = maxLinearVelocity;
50 this->MaxAngularVelocity = maxAngularVelocity;
51 this->GravityFactor = gravityFactor;
52 this->AllowedDOFs = allowedDOFs;
53 }
54 };
55
62 class RigidBody final : public Component {
63 friend class Collider;
64 friend class StevEngine::GameObject;
65
66 public:
67 JPH::Body* GetBody() const { return body; }
68 const JPH::EMotionType motionType;
69 const Layer* layer;
70 const float mass;
71
72 private:
73 static const bool unique = true;
74 MotionProperties motionProperties;
75 std::vector<Collider*> colliders;
76 JPH::Body* body;
77 JPH::Ref<JPH::Shape> shape;
78
79 public:
86 RigidBody(JPH::EMotionType motionType, Layer* layer, float mass = 1000);
87
93
98 std::string GetType() const { return RIGIDBODY_TYPE; }
99
105 Utilities::Stream Export(Utilities::StreamType type) const;
106
110 void Start();
111
115 void Deactivate();
116
121 void Update(double deltaTime);
122
126 ~RigidBody();
127
132 void SetMotionProperties(MotionProperties properties);
133
134 private:
139 void RefreshShape();
140
147 void TransformUpdate(bool position, bool rotation, bool scale);
148
149 // Jolt physics body wrapper functions
150 public:
155 bool IsActive() const { return body->IsActive(); }
156
161 bool IsStatic() const { return body->IsStatic(); }
162
167 bool IsKinematic() const { return body->IsKinematic(); }
168
173 bool IsDynamic() const { return body->IsDynamic(); }
174
179 float GetFriction() const { return body->GetFriction(); }
180
185 void SetFriction(float inFriction) { return body->SetFriction(inFriction); }
186
191 Utilities::Vector3 GetLinearVelocity() const { return body->GetLinearVelocity(); }
192
197 void SetLinearVelocity(Utilities::Vector3 inLinearVelocity) { return body->SetLinearVelocity(inLinearVelocity); }
198
203 void SetLinearVelocityClamped(Utilities::Vector3 inLinearVelocity) { return body->SetLinearVelocityClamped(inLinearVelocity); }
204
209 Utilities::Vector3 GetAngularVelocity() const { return body->GetAngularVelocity(); }
210
215 void SetAngularVelocity(Utilities::Vector3 inAngularVelocity) { return body->SetAngularVelocity(inAngularVelocity); }
216
221 void SetAngularVelocityClamped(Utilities::Vector3 inAngularVelocity) { return body->SetAngularVelocityClamped(inAngularVelocity); }
222
228 Utilities::Vector3 GetPointVelocityCOM(Utilities::Vector3 inPointRelativeToCOM) const { return body->GetPointVelocityCOM(inPointRelativeToCOM); }
229
235 Utilities::Vector3 GetPointVelocity(Utilities::Vector3 inPoint) const { return body->GetPointVelocity(inPoint); }
236
241 void AddForce(Utilities::Vector3 inForce) { return body->AddForce(inForce); }
242
248 void AddForce(Utilities::Vector3 inForce, Utilities::Vector3 inPosition) { return body->AddForce(inForce, inPosition); }
249
254 void AddTorque(Utilities::Vector3 inTorque) { return body->AddTorque(inTorque); }
255
260 void AddImpulse(Utilities::Vector3 inImpulse) { return body->AddImpulse(inImpulse); }
261
267 void AddImpulse(Utilities::Vector3 inImpulse, Utilities::Vector3 inPosition) { return body->AddImpulse(inImpulse, inPosition); }
268
273 void AddAngularImpulse(Utilities::Vector3 inAngularImpulse) { return body->AddAngularImpulse(inAngularImpulse); }
274
281 void MoveKinematic(Utilities::Vector3 inTargetPosition, Utilities::Quaternion inTargetRotation, float inDeltaTime) { return body->MoveKinematic(inTargetPosition, inTargetRotation, inDeltaTime); }
282 };
283
285 inline bool body = CreateComponents::RegisterComponentType<RigidBody>(RIGIDBODY_TYPE);
286}
287#endif
Component()
Create new component.
Definition Component.cpp:10
static bool RegisterComponentType(std::string type)
Register a component type for creation.
Definition Component.hpp:133
Core game object class.
Definition GameObject.hpp:35
Physics collision layer.
Definition Layers.hpp:25
void SetLinearVelocity(Utilities::Vector3 inLinearVelocity)
Set the linear velocity.
Definition RigidBody.hpp:197
const Layer * layer
Physics collision layer.
Definition RigidBody.hpp:69
void AddImpulse(Utilities::Vector3 inImpulse)
Add linear impulse to center of mass.
Definition RigidBody.hpp:260
void Deactivate()
Clean up when deactivated.
Definition RigidBody.cpp:46
Utilities::Vector3 GetPointVelocity(Utilities::Vector3 inPoint) const
Get velocity of a point in world space.
Definition RigidBody.hpp:235
Utilities::Vector3 GetAngularVelocity() const
Get the current angular velocity.
Definition RigidBody.hpp:209
void AddTorque(Utilities::Vector3 inTorque)
Add torque around center of mass.
Definition RigidBody.hpp:254
~RigidBody()
Clean up resources.
Definition RigidBody.cpp:101
void SetFriction(float inFriction)
Set the friction coefficient.
Definition RigidBody.hpp:185
RigidBody(JPH::EMotionType motionType, Layer *layer, float mass=1000)
Create rigid body.
Definition RigidBody.cpp:14
void AddForce(Utilities::Vector3 inForce)
Add force to center of mass.
Definition RigidBody.hpp:241
Utilities::Vector3 GetLinearVelocity() const
Get the current linear velocity.
Definition RigidBody.hpp:191
JPH::Body * GetBody() const
Get Jolt physics body.
Definition RigidBody.hpp:67
bool IsDynamic() const
Check if this is a dynamic body.
Definition RigidBody.hpp:173
bool IsStatic() const
Check if this is a static body.
Definition RigidBody.hpp:161
Utilities::Stream Export(Utilities::StreamType type) const
Serialize component to a stream.
Definition RigidBody.cpp:106
void SetMotionProperties(MotionProperties properties)
Set motion properties.
Definition RigidBody.cpp:89
const float mass
Body mass in kg.
Definition RigidBody.hpp:70
void AddAngularImpulse(Utilities::Vector3 inAngularImpulse)
Add angular impulse around center of mass.
Definition RigidBody.hpp:273
bool IsKinematic() const
Check if this is a kinematic body.
Definition RigidBody.hpp:167
float GetFriction() const
Get the friction coefficient.
Definition RigidBody.hpp:179
const JPH::EMotionType motionType
Motion type (static/dynamic/kinematic)
Definition RigidBody.hpp:68
void SetAngularVelocityClamped(Utilities::Vector3 inAngularVelocity)
Set angular velocity clamped to the maximum configured value.
Definition RigidBody.hpp:221
Utilities::Vector3 GetPointVelocityCOM(Utilities::Vector3 inPointRelativeToCOM) const
Get velocity of a point relative to center of mass.
Definition RigidBody.hpp:228
void AddImpulse(Utilities::Vector3 inImpulse, Utilities::Vector3 inPosition)
Add linear impulse at specified world space position.
Definition RigidBody.hpp:267
void SetAngularVelocity(Utilities::Vector3 inAngularVelocity)
Set the angular velocity.
Definition RigidBody.hpp:215
void Start()
Initialize component.
Definition RigidBody.cpp:17
void SetLinearVelocityClamped(Utilities::Vector3 inLinearVelocity)
Set linear velocity clamped to the maximum configured value.
Definition RigidBody.hpp:203
void MoveKinematic(Utilities::Vector3 inTargetPosition, Utilities::Quaternion inTargetRotation, float inDeltaTime)
Move kinematic body towards target transform.
Definition RigidBody.hpp:281
std::string GetType() const
Get component type.
Definition RigidBody.hpp:98
void Update(double deltaTime)
Update transform from physics.
Definition RigidBody.cpp:50
void AddForce(Utilities::Vector3 inForce, Utilities::Vector3 inPosition)
Add force at specified world space position.
Definition RigidBody.hpp:248
bool IsActive() const
Check if body is currently active in the physics simulation.
Definition RigidBody.hpp:155
Quaternion for 3D rotations.
Definition Quaternion.hpp:19
Stream for serialization of data.
Definition Stream.hpp:20
3D vector class
Definition Vector3.hpp:19
Motion properties configuration for rigid bodies.
Definition RigidBody.hpp:22
JPH::EAllowedDOFs AllowedDOFs
Allowed degrees of freedom.
Definition RigidBody.hpp:28
double LinearDamping
Linear velocity damping factor.
Definition RigidBody.hpp:23
double GravityFactor
Gravity influence multiplier.
Definition RigidBody.hpp:27
double AngularDamping
Angular velocity damping factor.
Definition RigidBody.hpp:24
double MaxLinearVelocity
Maximum linear velocity.
Definition RigidBody.hpp:25
MotionProperties(double gravityFactor=1.0, double linearDamping=0.0, double angularDamping=0.0, JPH::EAllowedDOFs allowedDOFs=JPH::EAllowedDOFs::All, double maxLinearVelocity=0.0, double maxAngularVelocity=0.0)
Create motion properties configuration.
Definition RigidBody.hpp:39
double MaxAngularVelocity
Maximum angular velocity.
Definition RigidBody.hpp:26