diff --git a/Source/Engine/Physics/Actors/WheeledVehicle.cpp b/Source/Engine/Physics/Actors/WheeledVehicle.cpp index 0ab8e6518..286f5b24e 100644 --- a/Source/Engine/Physics/Actors/WheeledVehicle.cpp +++ b/Source/Engine/Physics/Actors/WheeledVehicle.cpp @@ -76,6 +76,10 @@ WheeledVehicle::EngineSettings WheeledVehicle::GetEngine() const void WheeledVehicle::SetEngine(const EngineSettings& value) { +#if WITH_VEHICLE + if (_vehicle) + PhysicsBackend::SetVehicleEngine(_vehicle, &value); +#endif _engine = value; } @@ -86,6 +90,10 @@ WheeledVehicle::DifferentialSettings WheeledVehicle::GetDifferential() const void WheeledVehicle::SetDifferential(const DifferentialSettings& value) { +#if WITH_VEHICLE + if (_vehicle) + PhysicsBackend::SetVehicleDifferential(_vehicle, &value); +#endif _differential = value; } diff --git a/Source/Engine/Physics/PhysX/PhysicsBackendPhysX.cpp b/Source/Engine/Physics/PhysX/PhysicsBackendPhysX.cpp index 619f025ed..df427ab85 100644 --- a/Source/Engine/Physics/PhysX/PhysicsBackendPhysX.cpp +++ b/Source/Engine/Physics/PhysX/PhysicsBackendPhysX.cpp @@ -2970,12 +2970,116 @@ void PhysicsBackend::UpdateVehicleWheels(WheeledVehicle* actor) } } +void PhysicsBackend::SetVehicleEngine(void* vehicle, const void* value) +{ + auto drive = (PxVehicleDrive*)vehicle; + auto& engine = *(const WheeledVehicle::EngineSettings*)value; + switch (drive->getVehicleType()) + { + case PxVehicleTypes::eDRIVE4W: + { + auto drive4W = (PxVehicleDrive4W*)drive; + PxVehicleDriveSimData4W& driveSimData = drive4W->mDriveSimData; + PxVehicleEngineData engineData; + engineData.mMOI = M2ToCm2(engine.MOI); + engineData.mPeakTorque = M2ToCm2(engine.MaxTorque); + engineData.mMaxOmega = RpmToRadPerS(engine.MaxRotationSpeed); + engineData.mDampingRateFullThrottle = M2ToCm2(0.15f); + engineData.mDampingRateZeroThrottleClutchEngaged = M2ToCm2(2.0f); + engineData.mDampingRateZeroThrottleClutchDisengaged = M2ToCm2(0.35f); + driveSimData.setEngineData(engineData); + break; + } + case PxVehicleTypes::eDRIVENW: + { + auto drive4W = (PxVehicleDriveNW*)drive; + PxVehicleDriveSimDataNW& driveSimData = drive4W->mDriveSimData; + PxVehicleEngineData engineData; + engineData.mMOI = M2ToCm2(engine.MOI); + engineData.mPeakTorque = M2ToCm2(engine.MaxTorque); + engineData.mMaxOmega = RpmToRadPerS(engine.MaxRotationSpeed); + engineData.mDampingRateFullThrottle = M2ToCm2(0.15f); + engineData.mDampingRateZeroThrottleClutchEngaged = M2ToCm2(2.0f); + engineData.mDampingRateZeroThrottleClutchDisengaged = M2ToCm2(0.35f); + driveSimData.setEngineData(engineData); + break; + } + } +} + +void PhysicsBackend::SetVehicleDifferential(void* vehicle, const void* value) +{ + auto drive = (PxVehicleDrive*)vehicle; + auto& differential = *(const WheeledVehicle::DifferentialSettings*)value; + switch (drive->getVehicleType()) + { + case PxVehicleTypes::eDRIVE4W: + { + auto drive4W = (PxVehicleDrive4W*)drive; + PxVehicleDriveSimData4W& driveSimData = drive4W->mDriveSimData; + PxVehicleDifferential4WData differential4WData; + differential4WData.mType = (PxVehicleDifferential4WData::Enum)differential.Type; + differential4WData.mFrontRearSplit = differential.FrontRearSplit; + differential4WData.mFrontLeftRightSplit = differential.FrontLeftRightSplit; + differential4WData.mRearLeftRightSplit = differential.RearLeftRightSplit; + differential4WData.mCentreBias = differential.CentreBias; + differential4WData.mFrontBias = differential.FrontBias; + differential4WData.mRearBias = differential.RearBias; + driveSimData.setDiffData(differential4WData); + break; + } + } +} + void PhysicsBackend::SetVehicleGearbox(void* vehicle, const void* value) { auto drive = (PxVehicleDrive*)vehicle; auto& gearbox = *(const WheeledVehicle::GearboxSettings*)value; drive->mDriveDynData.setUseAutoGears(gearbox.AutoGear); drive->mDriveDynData.setAutoBoxSwitchTime(Math::Max(gearbox.SwitchTime, 0.0f)); + switch (drive->getVehicleType()) + { + case PxVehicleTypes::eDRIVE4W: + { + auto drive4W = (PxVehicleDrive4W*)drive; + PxVehicleDriveSimData4W& driveSimData = drive4W->mDriveSimData; + + // Gears + PxVehicleGearsData gears; + gears.mSwitchTime = Math::Max(gearbox.SwitchTime, 0.0f); + driveSimData.setGearsData(gears); + + // Auto Box + PxVehicleAutoBoxData autoBox; + driveSimData.setAutoBoxData(autoBox); + + // Clutch + PxVehicleClutchData clutch; + clutch.mStrength = M2ToCm2(gearbox.ClutchStrength); + driveSimData.setClutchData(clutch); + break; + } + case PxVehicleTypes::eDRIVENW: + { + auto drive4W = (PxVehicleDriveNW*)drive; + PxVehicleDriveSimDataNW& driveSimData = drive4W->mDriveSimData; + + // Gears + PxVehicleGearsData gears; + gears.mSwitchTime = Math::Max(gearbox.SwitchTime, 0.0f); + driveSimData.setGearsData(gears); + + // Auto Box + PxVehicleAutoBoxData autoBox; + driveSimData.setAutoBoxData(autoBox); + + // Clutch + PxVehicleClutchData clutch; + clutch.mStrength = M2ToCm2(gearbox.ClutchStrength); + driveSimData.setClutchData(clutch); + break; + } + } } int32 PhysicsBackend::GetVehicleTargetGear(void* vehicle) diff --git a/Source/Engine/Physics/PhysicsBackend.h b/Source/Engine/Physics/PhysicsBackend.h index ba452cda7..6c761a776 100644 --- a/Source/Engine/Physics/PhysicsBackend.h +++ b/Source/Engine/Physics/PhysicsBackend.h @@ -246,6 +246,8 @@ public: static void* CreateVehicle(class WheeledVehicle* actor); static void DestroyVehicle(void* vehicle, int32 driveType); static void UpdateVehicleWheels(WheeledVehicle* actor); + static void SetVehicleEngine(void* vehicle, const void* value); + static void SetVehicleDifferential(void* vehicle, const void* value); static void SetVehicleGearbox(void* vehicle, const void* value); static int32 GetVehicleTargetGear(void* vehicle); static void SetVehicleTargetGear(void* vehicle, int32 value); diff --git a/Source/Engine/Physics/PhysicsBackendEmpty.cpp b/Source/Engine/Physics/PhysicsBackendEmpty.cpp index 28d849a32..1a418af0c 100644 --- a/Source/Engine/Physics/PhysicsBackendEmpty.cpp +++ b/Source/Engine/Physics/PhysicsBackendEmpty.cpp @@ -736,6 +736,14 @@ void PhysicsBackend::UpdateVehicleWheels(WheeledVehicle* actor) { } +void PhysicsBackend::SetVehicleEngine(void* vehicle, const void* value) +{ +} + +void PhysicsBackend::SetVehicleDifferential(void* vehicle, const void* value) +{ +} + void PhysicsBackend::SetVehicleGearbox(void* vehicle, const void* value) { }