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"
11#include <Jolt/Physics/Collision/Shape/StaticCompoundShape.h>
12#include <Jolt/Physics/Body/BodyManager.h>
13#include <Jolt/Physics/Body/BodyCreationSettings.h>
15#define RIGIDBODY_TYPE "RigidBody"
17namespace StevEngine::Physics {
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
46 this->LinearDamping = linearDamping;
47 this->AngularDamping = angularDamping;
48 this->MaxLinearVelocity = maxLinearVelocity;
49 this->MaxAngularVelocity = maxAngularVelocity;
50 this->GravityFactor = gravityFactor;
51 this->AllowedDOFs = allowedDOFs;
63 JPH::Body*
GetBody()
const {
return body; }
72 JPH::Ref<JPH::Shape> shape;
93 std::string
GetType()
const {
return RIGIDBODY_TYPE; }
116 void Update(
double deltaTime);
142 void TransformUpdate(
bool position,
bool rotation,
bool scale);
180 void SetFriction(
float inFriction) {
return body->SetFriction(inFriction); }
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