StevEngine
StevEngine is a customizable C++ game engine.
Loading...
Searching...
No Matches
RigidBody.hpp
1#pragma once
2#ifdef StevEngine_PHYSICS
3#include "main/Component.hpp"
4#include "utilities/Vector3.hpp"
5#include "utilities/Quaternion.hpp"
6#include "physics/Layers.hpp"
7#include "utilities/Stream.hpp"
8
9//Jolt imports
10#include "Jolt.h"
11#include <Jolt/Physics/Collision/Shape/StaticCompoundShape.h>
12#include <Jolt/Physics/Body/BodyManager.h>
13#include <Jolt/Physics/Body/BodyCreationSettings.h>
14
15#define RIGIDBODY_TYPE "RigidBody"
16
17namespace StevEngine::Physics {
27 JPH::EAllowedDOFs AllowedDOFs;
28
39 double gravityFactor = 1.0,
40 double linearDamping = 0.0,
41 double angularDamping = 0.0,
42 JPH::EAllowedDOFs allowedDOFs = JPH::EAllowedDOFs::All,
43 double maxLinearVelocity = 0.0,
44 double maxAngularVelocity = 0.0
45 ) {
46 this->LinearDamping = linearDamping;
47 this->AngularDamping = angularDamping;
48 this->MaxLinearVelocity = maxLinearVelocity;
49 this->MaxAngularVelocity = maxAngularVelocity;
50 this->GravityFactor = gravityFactor;
51 this->AllowedDOFs = allowedDOFs;
52 }
53 };
54
61 class RigidBody : public Component {
62 public:
63 JPH::Body* GetBody() const { return body; }
64 const LayerID layer;
65 const JPH::EMotionType motionType;
66 const float mass;
67 static const bool unique = true;
68
69 private:
70 MotionProperties motionProperties;
71 JPH::Body* body;
72 JPH::Ref<JPH::Shape> shape;
73
74 public:
81 RigidBody(JPH::EMotionType motionType, LayerID layer = LayerManager::DEFAULT, float mass = 1);
82
88
93 std::string GetType() const { return RIGIDBODY_TYPE; }
94
100 Utilities::Stream Export(Utilities::StreamType type) const;
101
105 void Start();
106
110 void Deactivate();
111
116 void Update(double deltaTime);
117
121 ~RigidBody();
122
127 void SetMotionProperties(MotionProperties properties);
128
129 private:
134 void RefreshShape();
135
142 void TransformUpdate(bool position, bool rotation, bool scale);
143
144 // Jolt physics body wrapper functions
145 public:
150 bool IsActive() const { return body->IsActive(); }
151
156 bool IsStatic() const { return body->IsStatic(); }
157
162 bool IsKinematic() const { return body->IsKinematic(); }
163
168 bool IsDynamic() const { return body->IsDynamic(); }
169
174 float GetFriction() const { return body->GetFriction(); }
175
180 void SetFriction(float inFriction) { return body->SetFriction(inFriction); }
181
186 Utilities::Vector3 GetLinearVelocity() const { return body->GetLinearVelocity(); }
187
192 void SetLinearVelocity(Utilities::Vector3 inLinearVelocity) { return body->SetLinearVelocity(inLinearVelocity); }
193
198 void SetLinearVelocityClamped(Utilities::Vector3 inLinearVelocity) { return body->SetLinearVelocityClamped(inLinearVelocity); }
199
204 Utilities::Vector3 GetAngularVelocity() const { return body->GetAngularVelocity(); }
205
210 void SetAngularVelocity(Utilities::Vector3 inAngularVelocity) { return body->SetAngularVelocity(inAngularVelocity); }
211
216 void SetAngularVelocityClamped(Utilities::Vector3 inAngularVelocity) { return body->SetAngularVelocityClamped(inAngularVelocity); }
217
223 Utilities::Vector3 GetPointVelocityCOM(Utilities::Vector3 inPointRelativeToCOM) const { return body->GetPointVelocityCOM(inPointRelativeToCOM); }
224
230 Utilities::Vector3 GetPointVelocity(Utilities::Vector3 inPoint) const { return body->GetPointVelocity(inPoint); }
231
236 void AddForce(Utilities::Vector3 inForce) { return body->AddForce(inForce); }
237
243 void AddForce(Utilities::Vector3 inForce, Utilities::Vector3 inPosition) { return body->AddForce(inForce, inPosition); }
244
249 void AddTorque(Utilities::Vector3 inTorque) { return body->AddTorque(inTorque); }
250
255 void AddImpulse(Utilities::Vector3 inImpulse) { return body->AddImpulse(inImpulse); }
256
262 void AddImpulse(Utilities::Vector3 inImpulse, Utilities::Vector3 inPosition) { return body->AddImpulse(inImpulse, inPosition); }
263
268 void AddAngularImpulse(Utilities::Vector3 inAngularImpulse) { return body->AddAngularImpulse(inAngularImpulse); }
269
276 void MoveKinematic(Utilities::Vector3 inTargetPosition, Utilities::Quaternion inTargetRotation, float inDeltaTime) { return body->MoveKinematic(inTargetPosition, inTargetRotation, inDeltaTime); }
277 };
278}
279#endif
Component()
Create new component.
Definition Component.cpp:11
void SetLinearVelocity(Utilities::Vector3 inLinearVelocity)
Set the linear velocity.
Definition RigidBody.hpp:192
void AddImpulse(Utilities::Vector3 inImpulse)
Add linear impulse to center of mass.
Definition RigidBody.hpp:255
void Deactivate()
Clean up when deactivated.
Definition RigidBody.cpp:48
Utilities::Vector3 GetPointVelocity(Utilities::Vector3 inPoint) const
Get velocity of a point in world space.
Definition RigidBody.hpp:230
Utilities::Vector3 GetAngularVelocity() const
Get the current angular velocity.
Definition RigidBody.hpp:204
void AddTorque(Utilities::Vector3 inTorque)
Add torque around center of mass.
Definition RigidBody.hpp:249
~RigidBody()
Clean up resources.
Definition RigidBody.cpp:106
void SetFriction(float inFriction)
Set the friction coefficient.
Definition RigidBody.hpp:180
void AddForce(Utilities::Vector3 inForce)
Add force to center of mass.
Definition RigidBody.hpp:236
RigidBody(JPH::EMotionType motionType, LayerID layer=LayerManager::DEFAULT, float mass=1)
Create rigid body.
Definition RigidBody.cpp:17
Utilities::Vector3 GetLinearVelocity() const
Get the current linear velocity.
Definition RigidBody.hpp:186
JPH::Body * GetBody() const
Get Jolt physics body.
Definition RigidBody.hpp:63
bool IsDynamic() const
Check if this is a dynamic body.
Definition RigidBody.hpp:168
bool IsStatic() const
Check if this is a static body.
Definition RigidBody.hpp:156
Utilities::Stream Export(Utilities::StreamType type) const
Serialize component to a stream.
Definition RigidBody.cpp:110
void SetMotionProperties(MotionProperties properties)
Set motion properties.
Definition RigidBody.cpp:94
const float mass
Body mass in kg.
Definition RigidBody.hpp:66
void AddAngularImpulse(Utilities::Vector3 inAngularImpulse)
Add angular impulse around center of mass.
Definition RigidBody.hpp:268
const LayerID layer
Physics collision layer.
Definition RigidBody.hpp:64
bool IsKinematic() const
Check if this is a kinematic body.
Definition RigidBody.hpp:162
float GetFriction() const
Get the friction coefficient.
Definition RigidBody.hpp:174
const JPH::EMotionType motionType
Motion type (static/dynamic/kinematic)
Definition RigidBody.hpp:65
void SetAngularVelocityClamped(Utilities::Vector3 inAngularVelocity)
Set angular velocity clamped to the maximum configured value.
Definition RigidBody.hpp:216
static const bool unique
Only one per GameObject.
Definition RigidBody.hpp:67
Utilities::Vector3 GetPointVelocityCOM(Utilities::Vector3 inPointRelativeToCOM) const
Get velocity of a point relative to center of mass.
Definition RigidBody.hpp:223
void AddImpulse(Utilities::Vector3 inImpulse, Utilities::Vector3 inPosition)
Add linear impulse at specified world space position.
Definition RigidBody.hpp:262
void SetAngularVelocity(Utilities::Vector3 inAngularVelocity)
Set the angular velocity.
Definition RigidBody.hpp:210
void Start()
Initialize component.
Definition RigidBody.cpp:20
void SetLinearVelocityClamped(Utilities::Vector3 inLinearVelocity)
Set linear velocity clamped to the maximum configured value.
Definition RigidBody.hpp:198
void MoveKinematic(Utilities::Vector3 inTargetPosition, Utilities::Quaternion inTargetRotation, float inDeltaTime)
Move kinematic body towards target transform.
Definition RigidBody.hpp:276
std::string GetType() const
Get component type.
Definition RigidBody.hpp:93
void Update(double deltaTime)
Update transform from physics.
Definition RigidBody.cpp:54
void AddForce(Utilities::Vector3 inForce, Utilities::Vector3 inPosition)
Add force at specified world space position.
Definition RigidBody.hpp:243
bool IsActive() const
Check if body is currently active in the physics simulation.
Definition RigidBody.hpp:150
Quaternion for 3D rotations.
Definition Quaternion.hpp:17
Stream for serialization of data.
Definition Stream.hpp:22
3D vector class
Definition Vector3.hpp:17
Motion properties configuration for rigid bodies.
Definition RigidBody.hpp:21
JPH::EAllowedDOFs AllowedDOFs
Allowed degrees of freedom.
Definition RigidBody.hpp:27
double LinearDamping
Linear velocity damping factor.
Definition RigidBody.hpp:22
double GravityFactor
Gravity influence multiplier.
Definition RigidBody.hpp:26
double AngularDamping
Angular velocity damping factor.
Definition RigidBody.hpp:23
double MaxLinearVelocity
Maximum linear velocity.
Definition RigidBody.hpp:24
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:38
double MaxAngularVelocity
Maximum angular velocity.
Definition RigidBody.hpp:25