Skip to content

Commit 574bd5c

Browse files
committed
RigidDynamic::Kinematic
1 parent 61bbc73 commit 574bd5c

5 files changed

Lines changed: 39 additions & 2 deletions

File tree

3DRadSpace/Engine3DRadSpace/Physics/IDynamicCollider.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,5 +41,6 @@ namespace Engine3DRadSpace::Physics
4141
virtual void ApplyAngularAcceleration(const Math::Vector3& acc) = 0;
4242

4343
virtual void Teleport(const Math::Vector3& position, const std::optional<Math::Quaternion>& rotation = std::nullopt) = 0;
44+
virtual void SetKinematic(bool isKinematic) = 0;
4445
};
4546
}

3DRadSpace/Engine3DRadSpace/Physics/NVPhysX/DynamicCollider.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,4 +279,14 @@ void DynamicCollider::Teleport(const Math::Vector3 & position, const std::option
279279
physx::PxVec3(position.X, position.Y, position.Z),
280280
physx::PxQuat(-rot.X, -rot.Y, -rot.Z, rot.W)
281281
));
282+
}
283+
284+
void DynamicCollider::SetKinematic(bool isKinematic)
285+
{
286+
if(_rigidbody == nullptr) return;
287+
288+
if(isKinematic)
289+
_rigidbody->setRigidBodyFlag(physx::PxRigidBodyFlag::eKINEMATIC, true);
290+
else
291+
_rigidbody->setRigidBodyFlag(physx::PxRigidBodyFlag::eKINEMATIC, false);
282292
}

3DRadSpace/Engine3DRadSpace/Physics/NVPhysX/DynamicCollider.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,9 @@ namespace Engine3DRadSpace::Physics::NVPhysX
6060

6161
void AttachShape(const Math::BoundingBox& box) override;
6262
void AttachShape(const Math::BoundingSphere& sphere) override;
63+
6364
void Teleport(const Math::Vector3& position, const std::optional<Math::Quaternion>& rotation = std::nullopt) override;
65+
void SetKinematic(bool isKinematic) override;
6466

6567
friend class PhysicsEngine;
6668

3DRadSpace/Engine3DRadSpace/Physics/Objects/RigidDynamic.cpp

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ RigidDynamic::RigidDynamic(
2424
Restitution(this),
2525
LinearVelocity(this),
2626
AngularVelocity(this),
27-
MaxAngularVelocity(this)
27+
MaxAngularVelocity(this),
28+
Kinematic(this)
2829
{
2930
}
3031

@@ -140,6 +141,11 @@ void RigidDynamic::Initialize()
140141
{
141142
IPhysicsObject::Initialize();
142143
_collider = _physics->CreateDynamicCollider();
144+
145+
if(Children.Count() == 0)
146+
{
147+
Enabled = false;
148+
}
143149

144150
for(auto& child : Children)
145151
{
@@ -184,8 +190,9 @@ void RigidDynamic::Initialize()
184190
_collider->LinearVelocity = _properties->linearVelocity;
185191
_collider->AngularVelocity = _properties->angularVelocity;
186192
_collider->MaxAngularVelocity = _properties->maxAngularVelocity;
193+
194+
_properties.reset();
187195
}
188-
_properties.reset();
189196

190197
_collider->UpdateTransform(Position, Rotation);
191198
}
@@ -265,11 +272,23 @@ Gizmos::IGizmo* RigidDynamic::GetGizmo() const noexcept
265272
return Internal::GizmoOf<RigidDynamic>(this);
266273
}
267274

275+
void RigidDynamic::_setKinematic(bool isKinematic)
276+
{
277+
_kinematic = isKinematic;
278+
if(_collider) _collider->SetKinematic(isKinematic);
279+
}
280+
281+
bool RigidDynamic::_isKinematic() const noexcept
282+
{
283+
return _kinematic;
284+
}
285+
268286
REFL_BEGIN(RigidDynamic, "RigidDynamic", "Physics", "A physics object with dynamic rigidbody colliders")
269287
REFL_FIELD(RigidDynamic, std::string, Name, "Name", "RigidDynamic", "Object of the name")
270288
REFL_FIELD(RigidDynamic, bool, Enabled, "Enabled", true, "Is the physics object active?")
271289
REFL_FIELD(RigidDynamic, Math::Vector3, Position, "Position", Math::Vector3::Zero(), "World position of the physics object")
272290
REFL_FIELD(RigidDynamic, Math::Quaternion, Rotation, "Rotation", Math::Quaternion(), "World rotation of the physics object")
291+
REFL_FIELD(RigidDynamic, bool, Kinematic, "Kinematic", false, "Is the rigidbody kinematic?")
273292
REFL_FIELD(RigidDynamic, float, Mass, "Mass", 1.0f, "Mass of the rigidbody")
274293
REFL_FIELD(RigidDynamic, float, LinearDamping, "Linear Damping", 0.0f, "Linear damping coefficient")
275294
REFL_FIELD(RigidDynamic, float, AngularDamping, "Angular Damping", 0.05f, "Angular damping coefficient")

3DRadSpace/Engine3DRadSpace/Physics/Objects/RigidDynamic.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,10 @@ namespace Engine3DRadSpace::Physics::Objects
5454

5555
Math::Vector3 _getMaxAngularVelocity() const noexcept;
5656
void _setMaxAngularVelocity(const Math::Vector3& maxAngularVelocity);
57+
58+
bool _kinematic = false;
59+
bool _isKinematic() const noexcept;
60+
void _setKinematic(bool isKinematic);
5761
public:
5862
RigidDynamic(
5963
const std::string& name = "RigidDynamic",
@@ -84,6 +88,7 @@ namespace Engine3DRadSpace::Physics::Objects
8488
GetSet<Math::Vector3, RigidDynamic, &_getLinearVelocity, &_setLinearVelocity> LinearVelocity;
8589
GetSet<Math::Vector3, RigidDynamic, &_getAngularVelocity, &_setAngularVelocity> AngularVelocity;
8690
GetSet<Math::Vector3, RigidDynamic, &_getMaxAngularVelocity, &_setMaxAngularVelocity> MaxAngularVelocity;
91+
GetSet<bool, RigidDynamic, &RigidDynamic::_isKinematic, &RigidDynamic::_setKinematic> Kinematic;
8792

8893
IDynamicCollider* GetCollider() const noexcept;
8994
};

0 commit comments

Comments
 (0)