diff --git a/Source/Engine/Physics/Joints/D6Joint.cpp b/Source/Engine/Physics/Joints/D6Joint.cpp index c19eb719d..07e7b8bb4 100644 --- a/Source/Engine/Physics/Joints/D6Joint.cpp +++ b/Source/Engine/Physics/Joints/D6Joint.cpp @@ -45,6 +45,7 @@ void D6Joint::SetDrive(const D6JointDriveType index, const D6JointDrive& value) drive.stiffness = value.Stiffness; drive.damping = value.Damping; drive.forceLimit = value.ForceLimit; + ASSERT_LOW_LAYER(drive.isValid()); joint->setDrive(static_cast(index), drive); } } @@ -59,11 +60,12 @@ void D6Joint::SetLimitLinear(const LimitLinear& value) if (_joint) { auto joint = static_cast(_joint); - PxJointLinearLimit pxLimit(*Physics::GetTolerancesScale(), value.Extent, value.ContactDist); - pxLimit.stiffness = value.Spring.Stiffness; - pxLimit.damping = value.Spring.Damping; - pxLimit.restitution = value.Restitution; - joint->setLinearLimit(pxLimit); + PxJointLinearLimit limit(*Physics::GetTolerancesScale(), Math::Max(value.Extent, ZeroTolerance), value.ContactDist); + limit.stiffness = value.Spring.Stiffness; + limit.damping = value.Spring.Damping; + limit.restitution = value.Restitution; + ASSERT_LOW_LAYER(limit.isValid()); + joint->setLinearLimit(limit); } } @@ -77,11 +79,12 @@ void D6Joint::SetLimitTwist(const LimitAngularRange& value) if (_joint) { auto joint = static_cast(_joint); - PxJointAngularLimitPair pxLimit(value.Lower * DegreesToRadians, value.Upper * DegreesToRadians, value.ContactDist); - pxLimit.stiffness = value.Spring.Stiffness; - pxLimit.damping = value.Spring.Damping; - pxLimit.restitution = value.Restitution; - joint->setTwistLimit(pxLimit); + PxJointAngularLimitPair limit(value.Lower * DegreesToRadians, Math::Max(value.Upper, value.Lower) * DegreesToRadians, value.ContactDist); + limit.stiffness = value.Spring.Stiffness; + limit.damping = value.Spring.Damping; + limit.restitution = value.Restitution; + ASSERT_LOW_LAYER(limit.isValid()); + joint->setTwistLimit(limit); } } @@ -95,11 +98,12 @@ void D6Joint::SetLimitSwing(const LimitConeRange& value) if (_joint) { auto joint = static_cast(_joint); - PxJointLimitCone pxLimit(value.YLimitAngle * DegreesToRadians, value.ZLimitAngle * DegreesToRadians, value.ContactDist); - pxLimit.stiffness = value.Spring.Stiffness; - pxLimit.damping = value.Spring.Damping; - pxLimit.restitution = value.Restitution; - joint->setSwingLimit(pxLimit); + PxJointLimitCone limit(Math::Clamp(value.YLimitAngle * DegreesToRadians, ZeroTolerance, PI), Math::Clamp(value.ZLimitAngle * DegreesToRadians, ZeroTolerance, PI), value.ContactDist); + limit.stiffness = value.Spring.Stiffness; + limit.damping = value.Spring.Damping; + limit.restitution = value.Restitution; + ASSERT_LOW_LAYER(limit.isValid()); + joint->setSwingLimit(limit); } } @@ -428,34 +432,38 @@ PxJoint* D6Joint::CreateJoint(JointData& data) drive.stiffness = value.Stiffness; drive.damping = value.Damping; drive.forceLimit = value.ForceLimit; + ASSERT_LOW_LAYER(drive.isValid()); joint->setDrive(static_cast(i), drive); } { const auto& value = _limitLinear; - PxJointLinearLimit pxLimit(*Physics::GetTolerancesScale(), Math::Max(value.Extent, 0.01f), value.ContactDist); - pxLimit.stiffness = value.Spring.Stiffness; - pxLimit.damping = value.Spring.Damping; - pxLimit.restitution = value.Restitution; - joint->setDistanceLimit(pxLimit); + PxJointLinearLimit limit(*Physics::GetTolerancesScale(), Math::Max(value.Extent, ZeroTolerance), value.ContactDist); + limit.stiffness = value.Spring.Stiffness; + limit.damping = value.Spring.Damping; + limit.restitution = value.Restitution; + ASSERT_LOW_LAYER(limit.isValid()); + joint->setDistanceLimit(limit); } { const auto& value = _limitTwist; - PxJointAngularLimitPair pxLimit(value.Lower * DegreesToRadians, value.Upper * DegreesToRadians, value.ContactDist); - pxLimit.stiffness = value.Spring.Stiffness; - pxLimit.damping = value.Spring.Damping; - pxLimit.restitution = value.Restitution; - joint->setTwistLimit(pxLimit); + PxJointAngularLimitPair limit(value.Lower * DegreesToRadians, Math::Max(value.Upper, value.Lower) * DegreesToRadians, value.ContactDist); + limit.stiffness = value.Spring.Stiffness; + limit.damping = value.Spring.Damping; + limit.restitution = value.Restitution; + ASSERT_LOW_LAYER(limit.isValid()); + joint->setTwistLimit(limit); } { const auto& value = _limitSwing; - PxJointLimitCone pxLimit(value.YLimitAngle * DegreesToRadians, value.ZLimitAngle * DegreesToRadians, value.ContactDist); - pxLimit.stiffness = value.Spring.Stiffness; - pxLimit.damping = value.Spring.Damping; - pxLimit.restitution = value.Restitution; - joint->setSwingLimit(pxLimit); + PxJointLimitCone limit(Math::Clamp(value.YLimitAngle * DegreesToRadians, ZeroTolerance, PI), Math::Clamp(value.ZLimitAngle * DegreesToRadians, ZeroTolerance, PI), value.ContactDist); + limit.stiffness = value.Spring.Stiffness; + limit.damping = value.Spring.Damping; + limit.restitution = value.Restitution; + ASSERT_LOW_LAYER(limit.isValid()); + joint->setSwingLimit(limit); } return joint; diff --git a/Source/Engine/Physics/Joints/HingeJoint.cpp b/Source/Engine/Physics/Joints/HingeJoint.cpp index 1d100d4ae..a651dab63 100644 --- a/Source/Engine/Physics/Joints/HingeJoint.cpp +++ b/Source/Engine/Physics/Joints/HingeJoint.cpp @@ -38,10 +38,11 @@ void HingeJoint::SetLimit(const LimitAngularRange& value) if (_joint) { auto joint = static_cast(_joint); - PxJointAngularLimitPair limit(value.Lower * DegreesToRadians, value.Upper * DegreesToRadians, value.ContactDist); + PxJointAngularLimitPair limit(value.Lower * DegreesToRadians, Math::Max(value.Upper, value.Lower) * DegreesToRadians, value.ContactDist); limit.stiffness = value.Spring.Stiffness; limit.damping = value.Spring.Damping; limit.restitution = value.Restitution; + ASSERT_LOW_LAYER(limit.isValid()); joint->setLimit(limit); } } @@ -162,10 +163,11 @@ PxJoint* HingeJoint::CreateJoint(JointData& data) joint->setDriveVelocity(_drive.Velocity); joint->setDriveForceLimit(_drive.ForceLimit); joint->setDriveGearRatio(_drive.GearRatio); - PxJointAngularLimitPair limit(_limit.Lower * DegreesToRadians, _limit.Upper * DegreesToRadians, _limit.ContactDist); + PxJointAngularLimitPair limit(_limit.Lower * DegreesToRadians, Math::Max(_limit.Upper, _limit.Lower) * DegreesToRadians, _limit.ContactDist); limit.stiffness = _limit.Spring.Stiffness; limit.damping = _limit.Spring.Damping; limit.restitution = _limit.Restitution; + ASSERT_LOW_LAYER(limit.isValid()); joint->setLimit(limit); return joint; diff --git a/Source/Engine/Physics/Joints/SliderJoint.cpp b/Source/Engine/Physics/Joints/SliderJoint.cpp index 8b04dae68..f6bda1b1f 100644 --- a/Source/Engine/Physics/Joints/SliderJoint.cpp +++ b/Source/Engine/Physics/Joints/SliderJoint.cpp @@ -42,6 +42,7 @@ void SliderJoint::SetLimit(const LimitLinearRange& value) limit.stiffness = value.Spring.Stiffness; limit.damping = value.Spring.Damping; limit.restitution = value.Restitution; + ASSERT_LOW_LAYER(limit.isValid()); joint->setLimit(limit); } } diff --git a/Source/Engine/Physics/Joints/SphericalJoint.cpp b/Source/Engine/Physics/Joints/SphericalJoint.cpp index 83a959e51..3df36a420 100644 --- a/Source/Engine/Physics/Joints/SphericalJoint.cpp +++ b/Source/Engine/Physics/Joints/SphericalJoint.cpp @@ -35,10 +35,11 @@ void SphericalJoint::SetLimit(const LimitConeRange& value) if (_joint) { auto joint = static_cast(_joint); - PxJointLimitCone limit(value.YLimitAngle * DegreesToRadians, value.ZLimitAngle * DegreesToRadians, value.ContactDist); + PxJointLimitCone limit(Math::Clamp(value.YLimitAngle * DegreesToRadians, ZeroTolerance, PI), Math::Clamp(value.ZLimitAngle * DegreesToRadians, ZeroTolerance, PI), value.ContactDist); limit.stiffness = value.Spring.Stiffness; limit.damping = value.Spring.Damping; limit.restitution = value.Restitution; + ASSERT_LOW_LAYER(limit.isValid()); joint->setLimitCone(limit); } } @@ -110,7 +111,7 @@ PxJoint* SphericalJoint::CreateJoint(JointData& data) if (_flags & SphericalJointFlag::Limit) flags |= PxSphericalJointFlag::eLIMIT_ENABLED; joint->setSphericalJointFlags(static_cast(flags)); - PxJointLimitCone limit(_limit.YLimitAngle * DegreesToRadians, _limit.ZLimitAngle * DegreesToRadians, _limit.ContactDist); + PxJointLimitCone limit(Math::Clamp(_limit.YLimitAngle * DegreesToRadians, ZeroTolerance, PI), Math::Clamp(_limit.ZLimitAngle * DegreesToRadians, ZeroTolerance, PI), _limit.ContactDist); limit.stiffness = _limit.Spring.Stiffness; limit.damping = _limit.Spring.Damping; limit.restitution = _limit.Restitution;