14#include <util/ue-header-guard-begin.h>
15#include "Async/ParallelFor.h"
16#include "PhysicsEngine/PhysicsObjectExternalInterface.h"
17#include <util/ue-header-guard-end.h>
20 TEXT(
"carla.Lidar.Batch"), 1,
21 TEXT(
"Simulate multiple LiDARs in parallel (1) or one after another (0)."));
32 Super::Deinitialize();
43 if (CurrentEpisode !=
nullptr)
53 ActiveLidars.RemoveAll([](
const TWeakObjectPtr<ARayCastSemanticLidar>& Ptr) {
return !Ptr.IsValid(); });
60 if (World ==
nullptr || World->GetPhysicsScene() ==
nullptr || !
HasActiveLidars())
67 for (
const TWeakObjectPtr<ARayCastSemanticLidar> &WeakLidar :
ActiveLidars)
86 [
this, World, bBatch]()
88 TRACE_CPUPROFILER_EVENT_SCOPE(TaskGraphLidarSimulations);
89 auto LockedPhysObject = FPhysicsObjectExternalInterface::LockRead(World->GetPhysicsScene());
95 ARayCastSemanticLidar *Lidar = LidarsToSimulate[Index];
96 Lidar->SimulateLidar(Lidar->GetReadyToTickDeltaSeconds(), false);
103 Lidar->SimulateLidar(Lidar->GetReadyToTickDeltaSeconds(),
false);
107 LockedPhysObject.Release();
111 ENamedThreads::AnyBackgroundHiPriTask
127 TRACE_CPUPROFILER_EVENT_SCOPE(LidarSendData);
132 Lidar->SendData(Lidar->GetReadyToTickDeltaSeconds());
133 Lidar->ClearReadyToTick();
static TAutoConsoleVariable< int32 > CVarLidarBatch(TEXT("carla.Lidar.Batch"), 1, TEXT("Simulate multiple LiDARs in parallel (1) or one after another (0)."))
static bool IsValid(const ACarlaWheeledVehicle *Vehicle)
A ray-cast based Lidar sensor.
bool IsReadyToTick() const
void DeRegisterSensor(ASensor *Sensor)
FSensorManager & GetSensorManager()
void RegisterLidar(ARayCastSemanticLidar *Lidar)
virtual void Deinitialize() override
void FinishLidarSimulations(UWorld *World, float DeltaSeconds)
void StartLidarSimulations(UWorld *World, float DeltaSeconds)
TArray< TObjectPtr< ARayCastSemanticLidar > > LidarsToSimulate
LiDARs due this frame, snapshotted on the game thread for the simulation task.
FGraphEventRef LidarSimulationTask
bool HasActiveLidars() const
void UnregisterLidar(ARayCastSemanticLidar *Lidar)
TArray< TWeakObjectPtr< ARayCastSemanticLidar > > ActiveLidars
static UCarlaEpisode * GetCurrentEpisode(const UObject *WorldContextObject)