Add support for editing WheeledVehicle engine/differential config at runtime without full physics state rebuild

#1348
This commit is contained in:
Wojtek Figat
2023-09-01 12:52:01 +02:00
parent b0ec8525aa
commit 5a8944a82d
4 changed files with 122 additions and 0 deletions

View File

@@ -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;
}

View File

@@ -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)

View File

@@ -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);

View File

@@ -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)
{
}