Agrarsense
SensorFactory.cpp
Go to the documentation of this file.
1// Copyright (c) 2023 FrostBit Software Lab at the Lapland University of Applied Sciences
2//
3// This work is licensed under the terms of the MIT license.
4// For a copy, see <https://opensource.org/licenses/MIT>.
5
22
23#include "Engine/GameViewportClient.h"
24#include "Engine/World.h"
25#include "Misc/Guid.h"
26
27TWeakObjectPtr<USensorMapDataAsset> USensorFactory::SensorMapDataAsset;
28
30{
31 if (SensorMapDataAsset.IsValid())
32 {
33 return;
34 }
35
36 SensorMapDataAsset.Reset();
37 FSoftObjectPath SensorMapDataAssetPath(TEXT("/Game/Agrarsense/Data/Sensors/SensorMap"));
38 SensorMapDataAsset = Cast<USensorMapDataAsset>(SensorMapDataAssetPath.TryLoad());
39
40#if WITH_EDITOR
41 if (SensorMapDataAsset.IsValid())
42 {
43 UE_LOG(LogTemp, Warning, TEXT("USensorFactory.cpp: Loaded SensorMapDataAsset successfully."));
44 }
45 else
46 {
47 UE_LOG(LogTemp, Warning, TEXT("USensorFactory.cpp: Loading SensorMapDataAsset failed."));
48 }
49#endif
50}
51
53{
54 Initialize();
55
56 return SensorMapDataAsset.Get();
57}
58
60{
61 ALidar* Sensor = SpawnSensor<ALidar>(SpawnParameters, true);
62 if (!Sensor) return nullptr;
63
64 Sensor->Init(SensorParameters);
65 return Sensor;
66}
67
69{
70 ACamera* Sensor = SpawnSensor<ACamera>(SpawnParameters, true);
71 if (!Sensor) return nullptr;
72
73 Sensor->Init(SensorParameters);
74 return Sensor;
75}
76
78{
79 AThermalCamera* Sensor = SpawnSensor<AThermalCamera>(SpawnParameters, true);
80 if (!Sensor) return nullptr;
81
82 Sensor->ThermalInit(SensorParameters, SpawnParameters.SimulateSensor);
83 return Sensor;
84}
85
87{
88 ADepthCamera* Sensor = SpawnSensor<ADepthCamera>(SpawnParameters, true);
89 if (!Sensor) return nullptr;
90
91 Sensor->DepthInit(SensorParameters, SpawnParameters.SimulateSensor);
92 return Sensor;
93}
94
96{
97 ASemanticSegmentationCamera* Sensor = SpawnSensor<ASemanticSegmentationCamera>(SpawnParameters, true);
98 if (!Sensor) return nullptr;
99
100 Sensor->Init(SensorParameters, SpawnParameters.SimulateSensor);
101 return Sensor;
102}
103
105{
106 AInstanceSegmentationCamera* Sensor = SpawnSensor<AInstanceSegmentationCamera>(SpawnParameters, true);
107 if (!Sensor) return nullptr;
108
109 Sensor->Init(SensorParameters);
110 return Sensor;
111}
112
114{
115 ADVSCamera* Sensor = SpawnSensor<ADVSCamera>(SpawnParameters, true);
116 if (!Sensor) return nullptr;
117
118 Sensor->DVSInit(SensorParameters, SpawnParameters.SimulateSensor);
119 return Sensor;
120}
121
123{
124 ARadar* Sensor = SpawnSensor<ARadar>(SpawnParameters, true);
125 if (!Sensor) return nullptr;
126
127 Sensor->Init(SensorParameters, SpawnParameters.SimulateSensor);
128 return Sensor;
129}
130
132{
133 ACollisionSensor* Sensor = SpawnSensor<ACollisionSensor>(SpawnParameters, false);
134 if (!Sensor) return nullptr;
135
136 Sensor->Init(SpawnParameters.Parent, SpawnParameters.SimulateSensor);
137 return Sensor;
138}
139
141{
142 ATransformSensor* Sensor = SpawnSensor<ATransformSensor>(SpawnParameters, false);
143 if (!Sensor) return nullptr;
144
145 Sensor->Init(SensorParameters, SpawnParameters.SimulateSensor);
146 Sensor->AttachToActor(SensorParameters.OwningActor, FAttachmentTransformRules::KeepWorldTransform);
147 return Sensor;
148}
149
151{
152 AOverlapSensor* Sensor = SpawnSensor<AOverlapSensor>(SpawnParameters, false);
153 if (!Sensor) return nullptr;
154
155 Sensor->Init(SensorParameters);
156 return Sensor;
157}
158
159template <typename T>
160T* USensorFactory::SpawnSensor(const FSensorSpawnParameters& SpawnParameters, bool SpawnSensorModel)
161{
162 T* Sensor = nullptr;
163
164 if (UWorld* World = GetGameWorld())
165 {
166 Sensor = World->SpawnActorDeferred<T>(T::StaticClass(), SpawnParameters.Transform);
167 if (Sensor)
168 {
169 SetSensorIdentifierAndNameWithFallbacks(Sensor, SpawnParameters.SensorIdentifier, SpawnParameters.SensorName);
170
171 if (SpawnParameters.Parent)
172 {
173 Sensor->SetParentActorPtr(SpawnParameters.Parent);
174 }
175
176 Sensor->FinishSpawning(SpawnParameters.Transform);
177
178 if (SpawnSensorModel)
179 {
180 SpawnModelClassForSensor(Cast<ASensor>(Sensor));
181 }
182 }
183 }
184
185 return Sensor;
186}
187
188void USensorFactory::SetSensorIdentifierAndNameWithFallbacks(ASensor* Sensor, const FString& SensorIdentifier, const FString& SensorName)
189{
190 bool generateIdentifier = SensorIdentifier.IsEmpty();
191 bool generateName = SensorName.IsEmpty();
192
193 FString generatedSensorIdentifier;
194
195 // If ID not given, use ESensorTypes as the ID
196 // and let the ActorInformation-interface handle the numbering after that
197 if (generateIdentifier)
198 {
199 generatedSensorIdentifier = UEnumUtilities::ConvertSensorTypeToString(Sensor->GetSensorType());
200 }
201
202 // If not using generated name -> set the given sensor name
203 if (!generateName)
204 {
205 Sensor->SetSensorName(SensorName);
206 }
207
208 Sensor->SetSensorIdentifier(generateIdentifier ? generatedSensorIdentifier : SensorIdentifier);
209
210 // If using generated name -> use the identifier as the name too
211 if (generateName)
212 {
213 Sensor->SetSensorName(Sensor->GetSensorIdentifier());
214 }
215}
216
218{
219 ASensorModel* SpawnedModel = nullptr;
220
221 if (!AttachTo)
222 {
223 return SpawnedModel;
224 }
225
227
228 if (SensorMap)
229 {
230 ESensorTypes sensorType = AttachTo->GetSensorType();
231
232 TSubclassOf<ASensorModel> modelClass = nullptr;
233
234 bool matchFound;
235
236 USensorDataAsset* sensorData = SensorMap->GetAssetDataBySensorType(sensorType, matchFound);
237
238 if (matchFound && sensorData)
239 {
240 modelClass = sensorData->ModelClass;
241 }
242
243 if (modelClass)
244 {
245 SpawnedModel = SpawnModelClass(modelClass, AttachTo);
246 }
247 }
248
249 return SpawnedModel;
250}
251
252ASensorModel* USensorFactory::SpawnModelClass(TSubclassOf<ASensorModel> modelClass, ASensor* attachTo)
253{
254 ASensorModel* createdModelActor = nullptr;
255
256 if (!attachTo)
257 {
258 return createdModelActor;
259 }
260
261 if (UWorld* World = GetGameWorld())
262 {
263 FVector sensorLocation = attachTo->GetActorLocation();
264 createdModelActor = World->SpawnActor<ASensorModel>(modelClass);
265
266 if (createdModelActor)
267 {
268 createdModelActor->AttachToActor(attachTo, FAttachmentTransformRules::SnapToTargetIncludingScale);
269
270 attachTo->SetSensorModel(createdModelActor);
271 createdModelActor->SetAttachedToSensor(attachTo);
272 createdModelActor->InitAfterSpawn();
273 }
274 }
275
276 return createdModelActor;
277}
278
280{
281 return (GEngine && GEngine->GameViewport) ? GEngine->GameViewport->GetWorld() : nullptr;
282}
ESensorTypes
Definition: SensorTypes.h:15
Definition: Camera.h:53
virtual void Init(FCameraBaseParameters parameters, bool SimulateSensor=true)
Definition: Camera.cpp:83
void Init(AActor *NewOwner, bool SimulateSensor=true)
void DVSInit(FDVSCameraParameters Parameters, bool SimulateSensor=true)
Definition: DVSCamera.cpp:39
void DepthInit(FDepthCameraParameters Parameters, bool SimulateSensor=true)
Definition: DepthCamera.cpp:17
void Init(FCameraBaseParameters parameters, bool SimulateSensor=true) override
Definition: Lidar.h:35
void Init(FLidarParameters parameters, bool SimulateSensor=true)
Definition: Lidar.cpp:42
void Init(FOverlapSensorParameters InParameters)
Definition: Radar.h:26
void Init(FRadarParameters parameters, bool SimulateSensor=true)
Definition: Radar.cpp:22
void Init(FCameraBaseParameters parameters, bool SimulateSensor=true) override
void InitAfterSpawn()
void SetAttachedToSensor(ASensor *NewAttachedToSensor)
Definition: SensorModel.h:38
Definition: Sensor.h:45
void SetSensorModel(ASensorModel *NewSensorModel)
Definition: Sensor.h:191
void SetSensorName(const FString newName)
Definition: Sensor.h:123
FString GetSensorIdentifier() const
Definition: Sensor.h:75
virtual ESensorTypes GetSensorType() const
Definition: Sensor.h:65
void SetSensorIdentifier(const FString newIdentifier)
Definition: Sensor.h:85
void ThermalInit(FThermalCameraParameters Parameters, bool SimulateSensor=true)
void Init(FTransformSensorParameters Params, bool SimulateSensor=true)
static FString ConvertSensorTypeToString(ESensorTypes Sensortype)
TSubclassOf< ASensorModel > ModelClass
static AInstanceSegmentationCamera * SpawnInstanceSegmentationCamera(const FSensorSpawnParameters SpawnParameters, FCameraBaseParameters SensorParameters)
static void Initialize()
static ASensorModel * SpawnModelClassForSensor(ASensor *attachTo)
static AThermalCamera * SpawnThermalCamera(const FSensorSpawnParameters SpawnParameters, FThermalCameraParameters SensorParameters)
static ASemanticSegmentationCamera * SpawnSegmentationCamera(const FSensorSpawnParameters SpawnParameters, FCameraBaseParameters SensorParameters)
static TWeakObjectPtr< USensorMapDataAsset > SensorMapDataAsset
static ASensorModel * SpawnModelClass(TSubclassOf< ASensorModel > ModelClass, ASensor *AttachTo)
static ATransformSensor * SpawnTransformSensor(const FSensorSpawnParameters SpawnParameters, FTransformSensorParameters SensorParameters)
static UWorld * GetGameWorld()
Gets the current game world from the viewport.
static ARadar * SpawnRadar(const FSensorSpawnParameters SpawnParameters, FRadarParameters SensorParameters)
static ACollisionSensor * SpawnCollisionSensor(const FSensorSpawnParameters SpawnParameters)
static ACamera * SpawnCamera(const FSensorSpawnParameters SpawnParameters, FCameraBaseParameters SensorParameters)
static ADepthCamera * SpawnDepthCamera(const FSensorSpawnParameters SpawnParameters, FDepthCameraParameters SensorParameters)
static T * SpawnSensor(const FSensorSpawnParameters &SpawnParameters, bool SpawnSensorModel=true)
static USensorMapDataAsset * GetSensorMapDataAsset()
static ADVSCamera * SpawnDVSCamera(const FSensorSpawnParameters SpawnParameters, FDVSCameraParameters SensorParameters)
static void SetSensorIdentifierAndNameWithFallbacks(ASensor *Sensor, const FString &SensorIdentifier, const FString &SensorName)
static ALidar * SpawnLidarSensor(const FSensorSpawnParameters SpawnParameters, FLidarParameters SensorParameters)
static AOverlapSensor * SpawnOverlapSensor(const FSensorSpawnParameters SpawnParameters, FOverlapSensorParameters SensorParameters)
USensorDataAsset * GetAssetDataBySensorType(ESensorTypes SensorType, bool &MatchFound)