/** Function for turning angular velocity drive on and off. */ void FConstraintInstance::SetAngularVelocityDrive(bool bEnableSwingDrive, bool bEnableTwistDrive) { #if WITH_PHYSX PxD6Joint* Joint = (PxD6Joint*)ConstraintData; if (Joint && !(Joint->getConstraintFlags()&PxConstraintFlag::eBROKEN)) { // Get the current drives PxD6JointDrive CurrentDriveSwing = Joint->getDrive(PxD6Drive::eSWING); PxD6JointDrive CurrentDriveTwist = Joint->getDrive(PxD6Drive::eTWIST); PxD6JointDrive CurrentDriveSlerp = Joint->getDrive(PxD6Drive::eSLERP); const bool bSlerp = AngularDriveMode == EAngularDriveMode::SLERP; CurrentDriveSwing.damping = !bSlerp && bEnableSwingDrive ? AngularDriveDamping : 0.0f; CurrentDriveTwist.damping = !bSlerp && bEnableTwistDrive ? AngularDriveDamping : 0.0f; CurrentDriveSlerp.damping = bSlerp && (bEnableSwingDrive && bEnableTwistDrive) ? AngularDriveDamping : 0.0f; Joint->setDrive(PxD6Drive::eSWING, CurrentDriveSwing); Joint->setDrive(PxD6Drive::eTWIST, CurrentDriveTwist); Joint->setDrive(PxD6Drive::eSLERP, CurrentDriveSlerp); bAngularVelocityDrive = bEnableSwingDrive || bEnableTwistDrive; } #endif }
/** Function for turning linear velocity drive on and off. */ void FConstraintInstance::SetLinearVelocityDrive(bool bEnableXDrive, bool bEnableYDrive, bool bEnableZDrive) { #if WITH_PHYSX PxD6Joint* Joint = (PxD6Joint*)ConstraintData; if (Joint && !(Joint->getConstraintFlags()&PxConstraintFlag::eBROKEN)) { // Get the current drives PxD6JointDrive CurrentDriveX = Joint->getDrive(PxD6Drive::eX); PxD6JointDrive CurrentDriveY = Joint->getDrive(PxD6Drive::eY); PxD6JointDrive CurrentDriveZ = Joint->getDrive(PxD6Drive::eZ); CurrentDriveX.damping = bEnableXDrive && FMath::Abs(LinearVelocityTarget.X) > 0.0f ? LinearDriveDamping : 0.0f; CurrentDriveY.damping = bEnableYDrive && FMath::Abs(LinearVelocityTarget.Y) > 0.0f ? LinearDriveDamping : 0.0f; CurrentDriveZ.damping = bEnableZDrive && FMath::Abs(LinearVelocityTarget.Z) > 0.0f ? LinearDriveDamping : 0.0f; Joint->setDrive(PxD6Drive::eX, CurrentDriveX); Joint->setDrive(PxD6Drive::eY, CurrentDriveY); Joint->setDrive(PxD6Drive::eZ, CurrentDriveZ); } #endif bLinearVelocityDrive = bEnableXDrive || bEnableYDrive || bEnableZDrive; }