Example #1
0
/** 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
}
Example #2
0
/** 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;
}