diff --git a/Source/Engine/Physics/Actors/WheeledVehicle.cpp b/Source/Engine/Physics/Actors/WheeledVehicle.cpp index 286f5b24e..afb5309ea 100644 --- a/Source/Engine/Physics/Actors/WheeledVehicle.cpp +++ b/Source/Engine/Physics/Actors/WheeledVehicle.cpp @@ -223,9 +223,10 @@ void WheeledVehicle::Setup() return; // Release previous + void* scene = GetPhysicsScene()->GetPhysicsScene(); if (_vehicle) { - PhysicsBackend::RemoveVehicle(GetPhysicsScene()->GetPhysicsScene(), this); + PhysicsBackend::RemoveVehicle(scene, this); PhysicsBackend::DestroyVehicle(_vehicle, (int32)_driveTypeCurrent); _vehicle = nullptr; } @@ -236,7 +237,7 @@ void WheeledVehicle::Setup() if (!_vehicle) return; _driveTypeCurrent = _driveType; - PhysicsBackend::AddVehicle(GetPhysicsScene()->GetPhysicsScene(), this); + PhysicsBackend::AddVehicle(scene, this); PhysicsBackend::SetRigidDynamicActorSolverIterationCounts(_actor, 12, 4); #else LOG(Fatal, "Vehicles are not supported."); @@ -358,8 +359,23 @@ void WheeledVehicle::OnColliderChanged(Collider* c) { RigidBody::OnColliderChanged(c); - // Rebuild vehicle when someone adds/removed wheels - Setup(); + if (_useWheelsUpdates) + { + // Rebuild vehicle when someone adds/removed wheels + Setup(); + } +} + +void WheeledVehicle::OnActiveInTreeChanged() +{ + // Skip rebuilds from per-wheel OnColliderChanged when whole vehicle is toggled + _useWheelsUpdates = false; + RigidBody::OnActiveInTreeChanged(); + _useWheelsUpdates = true; + + // Perform whole rebuild when it gets activated + if (IsActiveInHierarchy()) + Setup(); } void WheeledVehicle::OnPhysicsSceneChanged(PhysicsScene* previous) diff --git a/Source/Engine/Physics/Actors/WheeledVehicle.h b/Source/Engine/Physics/Actors/WheeledVehicle.h index b478006d9..3a329edc4 100644 --- a/Source/Engine/Physics/Actors/WheeledVehicle.h +++ b/Source/Engine/Physics/Actors/WheeledVehicle.h @@ -329,6 +329,7 @@ private: DifferentialSettings _differential; GearboxSettings _gearbox; bool _fixInvalidForwardDir = false; // [Deprecated on 13.06.2023, expires on 13.06.2025] + bool _useWheelsUpdates = true; public: /// @@ -484,6 +485,7 @@ public: void Serialize(SerializeStream& stream, const void* otherObj) override; void Deserialize(DeserializeStream& stream, ISerializeModifier* modifier) override; void OnColliderChanged(Collider* c) override; + void OnActiveInTreeChanged() override; protected: void OnPhysicsSceneChanged(PhysicsScene* previous) override;