diff --git a/Engine/source/T3D/physics/bullet/btBody.cpp b/Engine/source/T3D/physics/bullet/btBody.cpp index f89785854..e1a84cf9f 100644 --- a/Engine/source/T3D/physics/bullet/btBody.cpp +++ b/Engine/source/T3D/physics/bullet/btBody.cpp @@ -356,6 +356,17 @@ void BtBody::applyImpulse( const Point3F &origin, const Point3F &force ) mActor->activate(); } +void BtBody::applyTorque(const Point3F &torque) +{ + AssertFatal(mActor, "BtBody::applyTorque - The actor is null!"); + AssertFatal(isDynamic(), "BtBody::applyTorque - This call is only for dynamics!"); + + mActor->applyTorque( btCast(torque) ); + + if (!mActor->isActive()) + mActor->activate(); +} + Box3F BtBody::getWorldBounds() { btVector3 min, max; diff --git a/Engine/source/T3D/physics/bullet/btBody.h b/Engine/source/T3D/physics/bullet/btBody.h index 2d138e7e1..c93ac5393 100644 --- a/Engine/source/T3D/physics/bullet/btBody.h +++ b/Engine/source/T3D/physics/bullet/btBody.h @@ -111,7 +111,7 @@ public: F32 staticFriction ); virtual void applyCorrection( const MatrixF &xfm ); virtual void applyImpulse( const Point3F &origin, const Point3F &force ); - + virtual void applyTorque(const Point3F &torque); virtual void findContact(SceneObject **contactObject, VectorF *contactNormal, Vector *outOverlapObjects) const; virtual void moveKinematicTo(const MatrixF &xfm); diff --git a/Engine/source/T3D/physics/physicsBody.h b/Engine/source/T3D/physics/physicsBody.h index 8d5a3e05f..dd609cee7 100644 --- a/Engine/source/T3D/physics/physicsBody.h +++ b/Engine/source/T3D/physics/physicsBody.h @@ -114,6 +114,10 @@ public: /// virtual void applyImpulse( const Point3F &origin, const Point3F &force ) = 0; + /// + virtual void applyTorque(const Point3F &torque) = 0; + + virtual void findContact(SceneObject **contactObject, VectorF *contactNormal, Vector *outOverlapObjects) const = 0; diff --git a/Engine/source/T3D/physics/physicsShape.cpp b/Engine/source/T3D/physics/physicsShape.cpp index 837de018f..c69d9458e 100644 --- a/Engine/source/T3D/physics/physicsShape.cpp +++ b/Engine/source/T3D/physics/physicsShape.cpp @@ -857,6 +857,12 @@ void PhysicsShape::applyImpulse( const Point3F &pos, const VectorF &vec ) mPhysicsRep->applyImpulse( pos, vec ); } +void PhysicsShape::applyTorque( const Point3F &torque ) +{ + if (mPhysicsRep && mPhysicsRep->isDynamic()) + mPhysicsRep->applyTorque( torque ); +} + void PhysicsShape::applyRadialImpulse( const Point3F &origin, F32 radius, F32 magnitude ) { if ( !mPhysicsRep || !mPhysicsRep->isDynamic() ) @@ -1179,4 +1185,12 @@ DefineEngineMethod( PhysicsShape, restore, void, (),, "Has no effect if the shape is not destroyed.\n\n") { object->restore(); +} + +DefineEngineMethod( PhysicsShape, applyTorque, void, (Point3F torque), , + "@brief Add a torque to a dynamic physics shape.\n\n" + "@param torque to apply to the dynamic physics shape\n" + "@note This value is ignored on physics shapes that are not dynamic. Wakes up the dynamic physics shape if it is sleeping.\n") +{ + object->applyTorque( torque ); } \ No newline at end of file diff --git a/Engine/source/T3D/physics/physicsShape.h b/Engine/source/T3D/physics/physicsShape.h index 65394183e..162a0368d 100644 --- a/Engine/source/T3D/physics/physicsShape.h +++ b/Engine/source/T3D/physics/physicsShape.h @@ -246,6 +246,7 @@ public: Point3F getVelocity() const { return mState.linVelocity; } void applyImpulse( const Point3F &pos, const VectorF &vec ); void applyRadialImpulse( const Point3F &origin, F32 radius, F32 magnitude ); + void applyTorque( const Point3F &torque ); void setScale(const VectorF & scale); // GameBase diff --git a/Engine/source/T3D/physics/physx3/px3Body.cpp b/Engine/source/T3D/physics/physx3/px3Body.cpp index 877e80af3..708a01d0a 100644 --- a/Engine/source/T3D/physics/physx3/px3Body.cpp +++ b/Engine/source/T3D/physics/physx3/px3Body.cpp @@ -417,6 +417,16 @@ void Px3Body::applyImpulse( const Point3F &origin, const Point3F &force ) } +void Px3Body::applyTorque( const Point3F &torque ) +{ + AssertFatal(mActor, "Px3Body::applyImpulse - The actor is null!"); + + mWorld->releaseWriteLock(); + physx::PxRigidDynamic *actor = mActor->is(); + if (mIsEnabled && isDynamic()) + actor->addTorque( px3Cast(torque), physx::PxForceMode::eFORCE, true); +} + void Px3Body::findContact(SceneObject **contactObject, VectorF *contactNormal, Vector *outOverlapObjects) const diff --git a/Engine/source/T3D/physics/physx3/px3Body.h b/Engine/source/T3D/physics/physx3/px3Body.h index 29b90f343..56713e3fb 100644 --- a/Engine/source/T3D/physics/physx3/px3Body.h +++ b/Engine/source/T3D/physics/physx3/px3Body.h @@ -117,7 +117,7 @@ public: F32 staticFriction ); virtual void applyCorrection( const MatrixF &xfm ); virtual void applyImpulse( const Point3F &origin, const Point3F &force ); - + virtual void applyTorque( const Point3F &torque ); virtual void findContact(SceneObject **contactObject, VectorF *contactNormal, Vector *outOverlapObjects) const; virtual void moveKinematicTo(const MatrixF &xfm);