42#include "Kismet/GameplayStatics.h"
43#include "Camera/PlayerCameraManager.h"
44#include "GenericPlatform/GenericPlatformFile.h"
45#include "Serialization/JsonSerializer.h"
46#include "Serialization/JsonWriter.h"
47#include "Misc/DefaultValueHelper.h"
48#include "HAL/PlatformFileManager.h"
49#include "GameFramework/Pawn.h"
50#include "Misc/FileHelper.h"
51#include "Dom/JsonObject.h"
52#include "GameFramework/PlayerController.h"
53#include "CollisionQueryParams.h"
54#include "Engine/GameViewportClient.h"
55#include "Engine/EngineTypes.h"
56#include "Engine/Engine.h"
57#include "Engine/World.h"
66 SimulatorLog::Log(
"SimulatorJsonParser: Spawning objects in main menu is disabled.");
70 if (!FPaths::FileExists(Path))
72 SimulatorLog::Log(FString::Printf(TEXT(
"SimulatorJsonParser: Path %s doesn't exist."), *Path));
76 if (!FPaths::GetExtension(Path).Equals(TEXT(
"json"), ESearchCase::IgnoreCase))
78 SimulatorLog::Log(
"SimulatorJsonParser: Invalid file extension. Only .json files are supported.");
83 if (!FFileHelper::LoadFileToString(JsonString, *Path))
89 TSharedPtr<FJsonObject> RootJsonObject = MakeShareable(
new FJsonObject);
90 TSharedRef<TJsonReader<TCHAR>> Reader = TJsonReaderFactory<TCHAR>::Create(JsonString);
91 if (!FJsonSerializer::Deserialize(Reader, RootJsonObject))
97 const TArray<TSharedPtr<FJsonValue>>* JsonObjects;
98 if (!RootJsonObject->TryGetArrayField(
"objects", JsonObjects))
100 SimulatorLog::Log(
"json content doesn't contain 'objects' field. Make sure your json structure is correct.");
105 FString FieldTypeString =
"type";
108 bool JsonContainsSensorType =
false;
109 bool JsonContainsDataCaptureType =
false;
110 TArray<TSharedPtr<FJsonObject>> FilteredJsonObjects;
112 for (
const TSharedPtr<FJsonValue>& JsonObjectValue : *JsonObjects)
114 if (JsonObjectValue->Type != EJson::Object)
119 TSharedPtr<FJsonObject> JsonObject = JsonObjectValue->AsObject();
121 if (!JsonObject->TryGetStringField(FieldTypeString, ObjectType))
127 ObjectType.ToLowerInline();
129 FilteredJsonObjects.Add(JsonObject);
131 if (ObjectType ==
"sensor")
133 JsonContainsSensorType =
true;
135 else if (ObjectType ==
"datacapture")
137 JsonContainsDataCaptureType =
true;
144 IsDataCapture = JsonContainsSensorType && JsonContainsDataCaptureType;
147 for (
const TSharedPtr<FJsonObject>& JsonObject : FilteredJsonObjects)
150 if (!JsonObject->TryGetStringField(FieldTypeString, ObjectType))
155 ObjectType.ToLowerInline();
157 if (ObjectType ==
"vehicle")
161 else if (ObjectType ==
"weather")
165 else if (ObjectType ==
"walker")
169 else if (ObjectType ==
"sensor")
173 else if (ObjectType ==
"prop")
177 else if (ObjectType ==
"foliage")
181 else if (ObjectType ==
"semanticcolors")
185 else if (ObjectType ==
"commands")
189 else if (ObjectType ==
"volumedeletion")
193 else if (ObjectType ==
"datacapture")
210 if (!JsonObject->TryGetStringField(
"model", Model))
217 JsonObject->TryGetStringField(
"name", Name);
218 JsonObject->TryGetStringField(
"id", ID);
227 FTransform SpawnTransform =
ParseTransform(
"spawnPoint", JsonObject);
230 bool ZIsHeightAboveGround =
false;
231 JsonObject->TryGetBoolField(
"zIsHeightAboveGround", ZIsHeightAboveGround);
232 if (ZIsHeightAboveGround)
237 bool DestroyCollidedObjectsOnSpawn =
false;
238 JsonObject->TryGetBoolField(
"destroyOverlappingObjects", DestroyCollidedObjectsOnSpawn);
262 const TArray<TSharedPtr<FJsonValue>>* SensorJsonObjects;
263 if (JsonObject->TryGetArrayField(
"sensors", SensorJsonObjects))
265 for (
const TSharedPtr<FJsonValue>& SensorValue : *SensorJsonObjects)
267 if (SensorValue->Type == EJson::Object)
269 TSharedPtr<FJsonObject> SensorJsonObject = SensorValue->AsObject();
279 if (!JsonObject->TryGetStringField(
"model", Model))
285 bool RandomZRotation =
false;
286 bool SnapToGround =
false;
287 JsonObject->TryGetBoolField(
"snap_to_ground", SnapToGround);
288 JsonObject->TryGetBoolField(
"random_z_rotation", RandomZRotation);
291 JsonObject->TryGetStringField(
"name", Name);
292 JsonObject->TryGetStringField(
"id", ID);
294 FTransform SpawnTransform =
ParseTransform(
"spawnPoint", JsonObject);
296 if (ObjectType.Equals(
"prop", ESearchCase::IgnoreCase))
301 else if (ObjectType.Equals(
"foliage", ESearchCase::IgnoreCase))
310 if (!
Vehicle || !SensorObject.IsValid())
315 USensorsManagerComponent* VehicleSensorManager =
Vehicle->GetSensorsManager();
316 if (!VehicleSensorManager)
321 TSharedPtr<FJsonObject> ParametersObject = SensorObject->GetObjectField(
"parameters");
322 if (!ParametersObject.IsValid())
328 FTransform RelativeTransform =
ParseTransform(
"spawnPoint", SensorObject);
331 FString SensorTypeString;
332 SensorObject->TryGetStringField(
"model", SensorTypeString);
337 FString SensorIdentifier, Name;
338 SensorObject->TryGetStringField(
"name", Name);
339 SensorObject->TryGetStringField(
"id", SensorIdentifier);
341 FString AttachedToComponent;
342 SensorObject->TryGetStringField(
"attachedToComponent", AttachedToComponent);
344 FString AttachedToBoneString;
345 FName AttachedToBone;
346 if (SensorObject->TryGetStringField(
"attachedToBone", AttachedToBoneString))
348 AttachedToBone = FName(*AttachedToBoneString);
353 USceneComponent* AttachToComponent = VehicleSensorManager->GetComponentByHierarchyName(AttachedToComponent);
359 SensorPtr = Cast<ASensor>(VehicleSensorManager->SpawnLidar(RelativeTransform,
true, SensorIdentifier, Name, ParseParameters<FLidarParameters>(ParametersObject),
true, TempActor, AttachToComponent, AttachedToBone));
363 SensorPtr = Cast<ASensor>(VehicleSensorManager->SpawnCamera(RelativeTransform,
true, SensorIdentifier, Name, ParseParameters<FCameraBaseParameters>(ParametersObject),
true, TempActor, AttachToComponent, AttachedToBone));
367 SensorPtr = Cast<ASensor>(VehicleSensorManager->SpawnThermalCamera(RelativeTransform,
true, SensorIdentifier, Name, ParseParameters<FThermalCameraParameters>(ParametersObject),
true, TempActor, AttachToComponent, AttachedToBone));
371 SensorPtr = Cast<ASensor>(VehicleSensorManager->SpawnDepthCamera(RelativeTransform,
true, SensorIdentifier, Name, ParseParameters<FDepthCameraParameters>(ParametersObject),
true, TempActor, AttachToComponent, AttachedToBone));
375 SensorPtr = Cast<ASensor>(VehicleSensorManager->SpawnRadar(RelativeTransform,
true, SensorIdentifier, Name, ParseParameters<FRadarParameters>(ParametersObject),
true, TempActor, AttachToComponent, AttachedToBone));
379 SensorPtr = Cast<ASensor>(VehicleSensorManager->SpawnSegmentationCamera(RelativeTransform,
true, SensorIdentifier, Name, ParseParameters<FCameraBaseParameters>(ParametersObject),
true, TempActor, AttachToComponent, AttachedToBone));
383 SensorPtr = Cast<ASensor>(VehicleSensorManager->SpawnDVSCamera(RelativeTransform,
true, SensorIdentifier, Name, ParseParameters<FDVSCameraParameters>(ParametersObject),
true, TempActor, AttachToComponent, AttachedToBone));
395 if (
ACamera* CameraPtr = Cast<ACamera>(SensorPtr))
397 bool UseGimbal =
false;
398 SensorObject->TryGetBoolField(
"useGimbal", UseGimbal);
399 CameraPtr->SetUseGimbal(UseGimbal);
406 if (!SensorObject.IsValid())
411 if (!SensorObject->HasField(
"parameters") || !SensorObject->HasField(
"model"))
416 TSharedPtr<FJsonObject> ParametersObject = SensorObject->GetObjectField(
"parameters");
417 if (!ParametersObject.IsValid())
422 FString SensorTypeString, SensorName, SensorIdentifier;
423 SensorObject->TryGetStringField(
"model", SensorTypeString);
424 SensorObject->TryGetStringField(
"name", SensorName);
425 SensorObject->TryGetStringField(
"id", SensorIdentifier);
427 FTransform SpawnTransform =
ParseTransform(
"spawnPoint", SensorObject);
430 bool ZIsHeightAboveGround =
false;
431 SensorObject->TryGetBoolField(
"zIsHeightAboveGround", ZIsHeightAboveGround);
432 if (ZIsHeightAboveGround)
437 AActor* ActorPtr =
nullptr;
440 UWorld* World =
nullptr;
442 if (GEngine && GEngine->GameViewport)
444 World = GEngine->GameViewport->GetWorld();
448 if (!SimulationLevelManager)
450 SimulatorLog::Log(
"Failed to spawn Sensor. Reason: Coulnd't to find SimulationLevelManager Actor!");
454 USensorsManagerComponent* WorldSensorManager = SimulationLevelManager->
GetSensorsManager();
455 if (!WorldSensorManager)
457 SimulatorLog::Log(
"Failed to spawn Sensor. Reason: Coulnd't to find USensorsManagerComponent Component!");
467 ActorPtr = Cast<AActor>(WorldSensorManager->SpawnLidar(SpawnTransform,
false, SensorIdentifier, SensorName, ParseParameters<FLidarParameters>(ParametersObject),
true, TempActor,
nullptr, NAME_None));
471 ActorPtr = Cast<AActor>(WorldSensorManager->SpawnRadar(SpawnTransform,
false, SensorIdentifier, SensorName, ParseParameters<FRadarParameters>(ParametersObject),
true, TempActor,
nullptr, NAME_None));
475 ActorPtr = Cast<AActor>(WorldSensorManager->SpawnCamera(SpawnTransform,
false, SensorIdentifier, SensorName, ParseParameters<FCameraBaseParameters>(ParametersObject),
true, TempActor,
nullptr, NAME_None));
479 ActorPtr = Cast<AActor>(WorldSensorManager->SpawnThermalCamera(SpawnTransform,
false, SensorIdentifier, SensorName,
ParseThermalCameraParameters(ParametersObject),
true, TempActor,
nullptr, NAME_None));
483 ActorPtr = Cast<AActor>(WorldSensorManager->SpawnDepthCamera(SpawnTransform,
false, SensorIdentifier, SensorName, ParseParameters<FDepthCameraParameters>(ParametersObject),
true, TempActor,
nullptr, NAME_None));
487 ActorPtr = Cast<AActor>(WorldSensorManager->SpawnSegmentationCamera(SpawnTransform,
false, SensorIdentifier, SensorName, ParseParameters<FCameraBaseParameters>(ParametersObject),
true, TempActor,
nullptr, NAME_None));
491 ActorPtr = Cast<AActor>(WorldSensorManager->SpawnDVSCamera(SpawnTransform,
false, SensorIdentifier, SensorName, ParseParameters<FDVSCameraParameters>(ParametersObject),
true, TempActor,
nullptr, NAME_None));
500 ACamera* CameraPtr = Cast<ACamera>(ActorPtr);
506 ALidar* LidarPtr = Cast<ALidar>(ActorPtr);
513 bool AttachToSpectator =
false;
514 SensorObject->TryGetBoolField(
"attachToSpectator", AttachToSpectator);
516 if (AttachToSpectator)
528 if (!JsonObject.IsValid())
530 SimulatorLog::Log(
"SimulatorJsonParser failed to parse Walker json: Invalid JsonObject");
534 FString WalkerTypeString;
535 if (!JsonObject->TryGetStringField(
"model", WalkerTypeString))
537 SimulatorLog::Log(
"SimulatorJsonParser failed to parse Walker json: Model field is missing");
544 SimulatorLog::Log(
"SimulatorJsonParser failed to parse Walker json: Walker is None");
548 TSharedPtr<FJsonObject> ParametersObject = JsonObject->GetObjectField(
"parameters");
549 if (!ParametersObject.IsValid())
551 SimulatorLog::Log(
"SimulatorJsonParser failed to parse Walker json: ParametersObject is invalid or missing");
555 FString WalkerActionString;
556 if (!ParametersObject->TryGetStringField(
"walkerAction", WalkerActionString))
558 SimulatorLog::Log(
"SimulatorJsonParser failed to parse Walker json: walkerAction field is missing");
565 SimulatorLog::Log(
"SimulatorJsonParser failed to parse Walker json: Roaming Walker requires spawnPoint");
570 FString WalkerEndActionString;
571 ParametersObject->TryGetStringField(
"walkerEndAction", WalkerEndActionString);
586 ParametersObject->TryGetStringField(
"name", Name);
587 ParametersObject->TryGetStringField(
"id", ID);
590 bool StartAutomatically =
true;
591 if (ParametersObject->HasField(
"startAutomatically"))
593 ParametersObject->TryGetBoolField(
"startAutomatically", StartAutomatically);
606 if (ParametersObject->HasField(
"points"))
609 TSharedPtr<FJsonObject> PointsObject = ParametersObject->GetObjectField(
"points");
610 if (PointsObject.IsValid())
615 FString PointName = FString::Printf(TEXT(
"point%d"), PointIndex);
616 if (!PointsObject->HasField(PointName))
621 TSharedPtr<FJsonObject> PointObject = PointsObject->GetObjectField(PointName);
622 if (PointObject.IsValid())
624 FTransform PointTransform =
ParseTransform(PointName, PointsObject);
625 WalkerParams.
Points.Add(PointTransform);
632 else if (ParametersObject->HasField(
"spawnPoint"))
635 FTransform PointTransform =
ParseTransform(
"spawnPoint", ParametersObject);
636 WalkerParams.
Points.Add(PointTransform);
642 if (!JsonObject.IsValid())
647 TSharedPtr<FJsonObject> Parameters = JsonObject->GetObjectField(
"parameters");
648 if (Parameters.IsValid() && GEngine && GEngine->GameViewport)
650 UWorld* World = GEngine->GameViewport->GetWorld();
655 FJsonObjectConverter::JsonObjectToUStruct(Parameters.ToSharedRef(), FWeatherParameters::StaticStruct(), &Params);
682 if (!DronePtr || !JsonObject.IsValid())
687 TSharedPtr<FJsonObject> ParametersObject = JsonObject->GetObjectField(
"parameters");
691 bool ZIsHeightAboveGround =
false;
692 ParametersObject->TryGetBoolField(
"zIsHeightAboveGround", ZIsHeightAboveGround);
694 if (ParametersObject.IsValid())
699 FString DroneActionObject = ParametersObject->GetStringField(
"droneAction");
700 if (!DroneActionObject.IsEmpty())
706 FString DroneEndActionObject = ParametersObject->GetStringField(
"droneEndAction");
707 if (!DroneEndActionObject.IsEmpty())
713 TSharedPtr<FJsonObject> PointsObject = ParametersObject->GetObjectField(
"points");
714 if (PointsObject.IsValid())
719 FString PointName = FString::Printf(TEXT(
"point%d"), PointIndex);
720 if (!PointsObject->HasField(PointName))
725 TSharedPtr<FJsonObject> PointObject = PointsObject->GetObjectField(PointName);
726 if (PointObject.IsValid())
728 FTransform PointTransform =
ParseTransform(PointName, PointsObject);
730 if (ZIsHeightAboveGround)
735 DroneParameters.
Points.Add(PointTransform);
742 bool ShowForwardArrow =
false;
743 ParametersObject->TryGetBoolField(
"showForwardArrow", ShowForwardArrow);
752 if (!VehiclePtr || !JsonObject.IsValid() || !JsonObject->HasField(
"parameters"))
761 TSharedPtr<FJsonObject> ParametersObject = JsonObject->GetObjectField(
"parameters");
762 Parameters = ParseParameters<FWheeledVehicleParameters>(ParametersObject);
768 if (!JsonObject.IsValid() || !Actor)
774 bool teleport =
false;
775 JsonObject->TryGetBoolField(
"followObject", follow);
776 JsonObject->TryGetBoolField(
"teleportSpectator", teleport);
778 if (!follow && !teleport)
784 if (GEngine && GEngine->GameViewport)
786 UWorld* World = GEngine->GameViewport->GetWorld();
792 AVehicle* VehiclePtr = Cast<AVehicle>(Actor);
796 if (SimulationLevelManager)
816 if (!ActorPtr || !GEngine || !GEngine->GameViewport)
821 UWorld* World = GEngine->GameViewport->GetWorld();
828 APlayerController* PlayerController = UGameplayStatics::GetPlayerController(World, 0);
829 if (PlayerController && Spectator)
831 APlayerCameraManager* CameraManager = PlayerController->PlayerCameraManager;
834 USceneComponent* CameraRootComponent = CameraManager->GetRootComponent();
835 if (CameraRootComponent)
838 ActorPtr->SetActorLocation(Spectator->GetActorLocation());
839 ActorPtr->SetActorRotation(Spectator->GetActorRotation());
842 ActorPtr->AttachToComponent(CameraRootComponent, FAttachmentTransformRules::SnapToTargetNotIncludingScale);
845 ASensor* SensorPtr = Cast<ASensor>(ActorPtr);
851 SensorModelPtr->Destroy();
861 UWorld* World =
nullptr;
862 if (GEngine && GEngine->GameViewport)
864 World = GEngine->GameViewport->GetWorld();
873 if (!CollectionInstance)
875 SimulatorLog::Log(
"ROSJsonParser.cpp: Failed to load MaterialParameterCollectionInstance!");
880 const TSharedPtr<FJsonObject>* ColorsObjectPtr =
nullptr;
881 if (JsonObject->TryGetObjectField(TEXT(
"colors"), ColorsObjectPtr) && ColorsObjectPtr !=
nullptr)
883 const TSharedPtr<FJsonObject>& ColorsObject = *ColorsObjectPtr;
884 for (
const auto& Elem : ColorsObject->Values)
886 FName Type = FName(*Elem.Key);
887 FString VectorString = Elem.Value->AsString();
890 FVector4 ParsedVector;
891 TArray<FString> ParsedValues;
892 VectorString.ParseIntoArray(ParsedValues, TEXT(
","),
true);
893 if (ParsedValues.Num() == 4)
895 ParsedVector.X = FCString::Atof(*ParsedValues[0]);
896 ParsedVector.Y = FCString::Atof(*ParsedValues[1]);
897 ParsedVector.Z = FCString::Atof(*ParsedValues[2]);
898 ParsedVector.W = FCString::Atof(*ParsedValues[3]);
911 if (!GEngine || !GEngine->GameViewport)
916 UWorld* World = GEngine->GameViewport->GetWorld();
919 const TArray<TSharedPtr<FJsonValue>>* CommandsArray;
920 if (JsonObject->TryGetArrayField(TEXT(
"commands"), CommandsArray))
922 for (
const TSharedPtr<FJsonValue>& CommandValue : *CommandsArray)
925 if (CommandValue->TryGetString(Command))
927 GEngine->Exec(World, *Command);
936 if (!GEngine || !GEngine->GameViewport || !JsonObject.IsValid())
942 FTransform SpawnTransform =
ParseTransform(
"spawnPoint", JsonObject);
945 FTransform TransformBounds =
ParseTransform(
"bounds", JsonObject);
946 FVector Bounds = TransformBounds.GetLocation();
948 bool OnlyDestroyTrees =
true;
949 JsonObject->TryGetBoolField(TEXT(
"onlyDestroyTrees"), OnlyDestroyTrees);
951 UWorld* World = GEngine->GameViewport->GetWorld();
966 if (!JsonObject.IsValid() || !GEngine || !GEngine->GameViewport)
972 TSharedPtr<FJsonObject> ParametersObject = JsonObject->GetObjectField(
"parameters");
974 if (ParametersObject.IsValid())
977 bool ZIsHeightAboveGround =
false;
978 ParametersObject->TryGetBoolField(
"zIsHeightAboveGround", ZIsHeightAboveGround);
981 UseGPS = ParametersObject->GetBoolField(
"useGPSLocation");
987 TSharedPtr<FJsonObject> PointsObject = ParametersObject->GetObjectField(
"points");
988 if (PointsObject.IsValid())
993 FString PointName = FString::Printf(TEXT(
"point%d"), PointIndex);
994 if (!PointsObject->HasField(PointName))
999 TSharedPtr<FJsonObject> PointObject = PointsObject->GetObjectField(PointName);
1000 if (PointObject.IsValid())
1002 FTransform PointTransform =
ParseTransform(PointName, PointsObject);
1004 if (ZIsHeightAboveGround && !UseGPS)
1017 UWorld* World = GEngine->GameViewport->GetWorld();
1029 FTransform SpawnTransform;
1031 const TSharedPtr<FJsonObject>* SpawnPointObject =
nullptr;
1032 if (Object->TryGetObjectField(FieldName, SpawnPointObject))
1034 double LocationX = 0.0, LocationY = 0.0, LocationZ = 0.0;
1035 double Yaw = 0.0, Pitch = 0.0, Roll = 0.0;
1037 auto& SPO = *SpawnPointObject->Get();
1040 bool HasLocation = SPO.TryGetNumberField(TEXT(
"x"), LocationX) && SPO.TryGetNumberField(TEXT(
"y"), LocationY) && SPO.TryGetNumberField(TEXT(
"z"), LocationZ);
1043 SPO.TryGetNumberField(TEXT(
"yaw"), Yaw);
1044 SPO.TryGetNumberField(TEXT(
"pitch"), Pitch);
1045 SPO.TryGetNumberField(TEXT(
"roll"), Roll);
1049 bool ChangeScale =
false;
1050 if (SPO.HasField(
"scaleX") && SPO.HasField(
"scaleY") && SPO.HasField(
"scaleZ"))
1053 SPO.TryGetNumberField(TEXT(
"scaleX"), Scale.X);
1054 SPO.TryGetNumberField(TEXT(
"scaleY"), Scale.Y);
1055 SPO.TryGetNumberField(TEXT(
"scaleZ"), Scale.Z);
1061 FVector Location(LocationX, LocationY, LocationZ);
1062 FRotator Rotation(Pitch, Yaw, Roll);
1064 SpawnTransform.SetLocation(Location);
1065 SpawnTransform.SetRotation(Rotation.Quaternion());
1069 SpawnTransform.SetScale3D(Scale);
1074 return SpawnTransform;
1080 const TSharedPtr<FJsonObject>* VectorObject;
1082 if (Object->TryGetObjectField(FieldName, VectorObject))
1085 (*VectorObject)->TryGetNumberField(TEXT(
"x"), X);
1086 (*VectorObject)->TryGetNumberField(TEXT(
"y"), Y);
1087 (*VectorObject)->TryGetNumberField(TEXT(
"z"), Z);
1088 (*VectorObject)->TryGetNumberField(TEXT(
"w"), W);
1089 Vector = FVector4(X, Y, Z, W);
1099 if (ParametersObject.IsValid())
1105 ParametersObject->TryGetNumberField(TEXT(
"widthResolutionNoise"), ThermalCameraParams.
WidthResolutionNoise);
1106 ParametersObject->TryGetNumberField(TEXT(
"heightResolutionNoise"), ThermalCameraParams.
HeightResolutionNoise);
1109 TSharedPtr<FJsonObject> CameraParametersObject = ParametersObject->GetObjectField(
"cameraParameters");
1110 if (CameraParametersObject.IsValid())
1112 ThermalCameraParams.
CameraParameters = ParseParameters<FCameraBaseParameters>(CameraParametersObject);
1116 return ThermalCameraParams;
1121 int32 Value = DefaultValue;
1123 if (JsonObject.IsValid() && JsonObject->HasField(FieldName))
1125 JsonObject->TryGetNumberField(FieldName, Value);
1133 if (!GEngine || !GEngine->GameViewport)
1138 UWorld* World = GEngine->GameViewport->GetWorld();
1144 FVector Position =
Transform.GetLocation();
1145 FVector Start = Position;
1146 FVector End = Position - FVector(0, 0, 10000);
1148 FHitResult HitResult;
1149 FCollisionQueryParams QueryParams;
1151 bool Hit = World->LineTraceSingleByChannel(HitResult, Start, End, ECC_Visibility, QueryParams);
1155 float HeightAboveGround = Position.Z;
1156 Position.Z = HitResult.ImpactPoint.Z + (HeightAboveGround * 100.0f);
@ SemanticSegmentationCamera
static EDroneEndAction GetDroneEndAction(FString endActionstring)
static EDroneAction GetDroneAction(FString actionstring)
void SetupDataCapture(FCaptureData NewCaptureData)
void DestroyOverlappingActors(bool OnlyTrees)
void ChangeOverlapBounds(FVector Bounds)
void ChangeDroneParameters(const FDroneParameters &newParameters)
void SetShowForwardArrow(bool Show)
ASensorModel * GetSensorModel() const
bool TakeManualControlOfVehicle(AVehicle *Vehicle)
USensorsManagerComponent * GetSensorsManager() const
void TeleportSpectator(const FTransform &Transform)
FWheeledVehicleParameters GetVehicleParameters() const
void SetVehicleParameters(FWheeledVehicleParameters NewParameters)
void UpdateWeather(const FWeatherParameters &WeatherParameters, bool updateToROS)
const FWeatherParameters & GetCurrentWeather() const
static void Log(const FString &Message, bool LogToTextFile=true, bool LogToROS=true)
static bool IsPlayingInMainMenu()
static ASpectator * GetSpectator(const UObject *WorldContextObject)
static AWeather * GetWeatherActor(const UObject *WorldContextObject)
static ASimulationLevelManager * GetSimulationLevelManager(const UObject *WorldContextObject)
static AVehicle * SpawnVehicle(EVehicleTypes VehicleType, FTransform SpawnTransform, const FString &ActorName, const FString &ActorID, bool SnapAboveGround=false, float AboveOffset=150.0f, bool DestroyOverlappingActors=false)
static AActor * SpawnProp(EPropTypes PropType, FTransform Transform, FString ActorName="", FString ActorID="", bool RandomZRotation=false, bool SnapToGround=false)
static AWalker * SpawnWalker(FWalkerParameters Parameters, const FString &ActorName="", const FString &ActorID="", bool StartAutomatically=true)
static AActor * SpawnFoliage(EFoliageTypes FoliageType, FTransform Transform, FString ActorName="", FString ActorID="", bool RandomZRotation=true, bool SnapToGround=true)
static EWalkerEndAction ConvertStringToWalkerEndActionType(const FString &String)
static ESensorTypes ConvertStringToSensorType(const FString &String)
static EWalkerAction ConvertStringToWalkerActionType(const FString &String)
static EVehicleTypes ConvertStringToVehicleType(const FString &String)
static EWalkerType ConvertStringToWalkerType(const FString &String)
static EPropTypes ConvertStringToPropType(const FString &String)
static EFoliageTypes ConvertStringToFoliageType(const FString &String)
static bool UpdateMaterialCollectionVectorValue(UMaterialParameterCollectionInstance *MPCInstance, const FName ParameterName, const FVector4 Value)
static UMaterialParameterCollectionInstance * LoadMaterialParameterCollectionInstance(const UObject *WorldContextObject, const FString &Path)
static FTransform ParseTransform(const FString &FieldName, const TSharedPtr< FJsonObject > &Object)
static FVector4 ParseVector4(const FString &FieldName, const TSharedPtr< FJsonObject > &Object)
static void ParseAndSetDroneParameters(APIDDrone *DronePtr, const TSharedPtr< FJsonObject > &JsonObject)
static void ParseAndOperateJSONFile(const FString &Path)
static FThermalCameraParameters ParseThermalCameraParameters(const TSharedPtr< FJsonObject > &ParametersObject)
static void AttachActorToSpectatorCamera(AActor *ActorPtr)
static void ComputeAndSetZFromGround(FTransform &Position)
static bool IsDataCapture
static TArray< ASensor * > SpawnedSensorsForDataCapture
static void ParsePropOrFoliage(const TSharedPtr< FJsonObject > &JsonObject, const FString &ObjectType)
static void ParseVehicle(const TSharedPtr< FJsonObject > &JsonObject)
static void ParseAndSetWheeledVehicleParameters(AVehicle *VehiclePtr, const TSharedPtr< FJsonObject > &JsonObject)
static void ParseVolumeDeletion(const TSharedPtr< FJsonObject > &JsonObject)
static void ParseDataCapture(const TSharedPtr< FJsonObject > &JsonObject)
static void HandleSpectatorMovement(const TSharedPtr< FJsonObject > &JsonObject, AActor *Actor, const FTransform &Transform)
static void ParseWalkerSpawnPoints(const TSharedPtr< FJsonObject > &ParametersObject, FWalkerParameters &WalkerParams)
static void ParseCommands(const TSharedPtr< FJsonObject > &JsonObject)
static void ParseAndSetSemanticColors(const TSharedPtr< FJsonObject > &JsonObject)
static void ChangeWeather(const TSharedPtr< FJsonObject > &JsonObject)
static void SpawnWalker(const TSharedPtr< FJsonObject > &JsonObject)
static int32 GetIntValueOrDefault(const TSharedPtr< FJsonObject > &JsonObject, const FString &FieldName, int32 DefaultValue)
static void SpawnSensorWorld(const TSharedPtr< FJsonObject > &SensorObject)
static void SpawnSensorToVehicle(AVehicle *Vehicle, const TSharedPtr< FJsonObject > &SensorObject)
bool UseHeightAboveGround
TArray< FTransform > CapturePositions
TArray< ASensor * > Sensors
EDroneEndAction DroneEndAction
TArray< FTransform > Points
int32 WidthResolutionNoise
int32 HeightResolutionNoise
FCameraBaseParameters CameraParameters
bool AllowCustomNoiseResolution
EWalkerAction WalkerAction
TArray< FTransform > Points
EWalkerEndAction WalkerEndAction