44#include "Kismet/GameplayStatics.h"
45#include "Camera/PlayerCameraManager.h"
46#include "GenericPlatform/GenericPlatformFile.h"
47#include "Serialization/JsonSerializer.h"
48#include "Serialization/JsonWriter.h"
49#include "Misc/DefaultValueHelper.h"
50#include "HAL/PlatformFileManager.h"
51#include "GameFramework/Pawn.h"
52#include "Misc/FileHelper.h"
53#include "Dom/JsonObject.h"
54#include "GameFramework/PlayerController.h"
55#include "CollisionQueryParams.h"
56#include "Engine/GameViewportClient.h"
57#include "Engine/EngineTypes.h"
58#include "Engine/Engine.h"
59#include "Engine/World.h"
68 SimulatorLog::Log(
"SimulatorJsonParser: Spawning objects in main menu is disabled.");
72 if (!FPaths::FileExists(Path))
74 SimulatorLog::Log(FString::Printf(TEXT(
"SimulatorJsonParser: Path %s doesn't exist."), *Path));
78 if (!FPaths::GetExtension(Path).Equals(TEXT(
"json"), ESearchCase::IgnoreCase))
80 SimulatorLog::Log(
"SimulatorJsonParser: Invalid file extension. Only .json files are supported.");
85 if (!FFileHelper::LoadFileToString(JsonString, *Path))
91 TSharedPtr<FJsonObject> RootJsonObject = MakeShareable(
new FJsonObject);
92 TSharedRef<TJsonReader<TCHAR>> Reader = TJsonReaderFactory<TCHAR>::Create(JsonString);
93 if (!FJsonSerializer::Deserialize(Reader, RootJsonObject))
99 const TArray<TSharedPtr<FJsonValue>>* JsonObjects;
100 if (!RootJsonObject->TryGetArrayField(TEXT(
"objects"), JsonObjects))
102 SimulatorLog::Log(
"json content doesn't contain 'objects' field. Make sure your json structure is correct.");
107 FString FieldTypeString =
"type";
110 bool JsonContainsSensorType =
false;
111 bool JsonContainsDataCaptureType =
false;
112 TArray<TSharedPtr<FJsonObject>> FilteredJsonObjects;
114 for (
const TSharedPtr<FJsonValue>& JsonObjectValue : *JsonObjects)
116 if (JsonObjectValue->Type != EJson::Object)
121 TSharedPtr<FJsonObject> JsonObject = JsonObjectValue->AsObject();
123 if (!JsonObject->TryGetStringField(FieldTypeString, ObjectType))
129 ObjectType.ToLowerInline();
131 FilteredJsonObjects.Add(JsonObject);
133 if (ObjectType ==
"sensor")
135 JsonContainsSensorType =
true;
137 else if (ObjectType ==
"datacapture")
139 JsonContainsDataCaptureType =
true;
146 IsDataCapture = JsonContainsSensorType && JsonContainsDataCaptureType;
149 for (
const TSharedPtr<FJsonObject>& JsonObject : FilteredJsonObjects)
152 if (!JsonObject->TryGetStringField(FieldTypeString, ObjectType))
157 ObjectType.ToLowerInline();
159 if (ObjectType ==
"vehicle")
163 else if (ObjectType ==
"weather")
167 else if (ObjectType ==
"walker")
171 else if (ObjectType ==
"sensor")
175 else if (ObjectType ==
"prop")
179 else if (ObjectType ==
"foliage")
183 else if (ObjectType ==
"semanticcolors")
187 else if (ObjectType ==
"commands")
191 else if (ObjectType ==
"volumedeletion")
195 else if (ObjectType ==
"datacapture")
212 if (!JsonObject->TryGetStringField(TEXT(
"model"), Model))
219 JsonObject->TryGetStringField(TEXT(
"name"), Name);
220 JsonObject->TryGetStringField(TEXT(
"id"), ID);
229 FTransform SpawnTransform =
ParseTransform(
"spawnPoint", JsonObject);
232 bool ZIsHeightAboveGround =
false;
233 JsonObject->TryGetBoolField(TEXT(
"zIsHeightAboveGround"), ZIsHeightAboveGround);
234 if (ZIsHeightAboveGround)
239 bool DestroyCollidedObjectsOnSpawn =
false;
240 JsonObject->TryGetBoolField(TEXT(
"destroyOverlappingObjects"), DestroyCollidedObjectsOnSpawn);
264 bool HideVehicleMeshForCameras =
false;
265 JsonObject->TryGetBoolField(TEXT(
"hideVehicleMeshForCameras"), HideVehicleMeshForCameras);
268 const TArray<TSharedPtr<FJsonValue>>* SensorJsonObjects;
269 if (JsonObject->TryGetArrayField(TEXT(
"sensors"), SensorJsonObjects))
271 for (
const TSharedPtr<FJsonValue>& SensorValue : *SensorJsonObjects)
273 if (SensorValue->Type == EJson::Object)
275 TSharedPtr<FJsonObject> SensorJsonObject = SensorValue->AsObject();
285 if (!JsonObject->TryGetStringField(TEXT(
"model"), Model))
291 bool RandomZRotation =
false;
292 bool SnapToGround =
false;
293 JsonObject->TryGetBoolField(TEXT(
"snap_to_ground"), SnapToGround);
294 JsonObject->TryGetBoolField(TEXT(
"random_z_rotation"), RandomZRotation);
297 JsonObject->TryGetStringField(TEXT(
"name"), Name);
298 JsonObject->TryGetStringField(TEXT(
"id"), ID);
300 FTransform SpawnTransform =
ParseTransform(
"spawnPoint", JsonObject);
302 if (ObjectType.Equals(
"prop", ESearchCase::IgnoreCase))
307 else if (ObjectType.Equals(
"foliage", ESearchCase::IgnoreCase))
316 if (!
Vehicle || !SensorObject.IsValid())
321 USensorsManagerComponent* VehicleSensorManager =
Vehicle->GetSensorsManager();
322 if (!VehicleSensorManager)
327 TSharedPtr<FJsonObject> ParametersObject = SensorObject->GetObjectField(TEXT(
"parameters"));
328 if (!ParametersObject.IsValid())
334 FTransform RelativeTransform =
ParseTransform(
"spawnPoint", SensorObject);
337 FString SensorTypeString;
338 SensorObject->TryGetStringField(TEXT(
"model"), SensorTypeString);
343 FString SensorIdentifier, Name;
344 SensorObject->TryGetStringField(TEXT(
"name"), Name);
345 SensorObject->TryGetStringField(TEXT(
"id"), SensorIdentifier);
347 FString AttachedToComponent;
348 SensorObject->TryGetStringField(TEXT(
"attachedToComponent"), AttachedToComponent);
350 FString AttachedToBoneString;
351 FName AttachedToBone;
352 if (SensorObject->TryGetStringField(TEXT(
"attachedToBone"), AttachedToBoneString))
354 AttachedToBone = FName(*AttachedToBoneString);
359 USceneComponent* AttachToComponent = VehicleSensorManager->GetComponentByHierarchyName(AttachedToComponent);
365 SensorPtr = Cast<ASensor>(VehicleSensorManager->SpawnLidar(RelativeTransform,
true, SensorIdentifier, Name, ParseParameters<FLidarParameters>(ParametersObject),
true, TempActor, AttachToComponent, AttachedToBone));
369 SensorPtr = Cast<ASensor>(VehicleSensorManager->SpawnCamera(RelativeTransform,
true, SensorIdentifier, Name, ParseParameters<FCameraBaseParameters>(ParametersObject),
true, TempActor, AttachToComponent, AttachedToBone));
373 SensorPtr = Cast<ASensor>(VehicleSensorManager->SpawnThermalCamera(RelativeTransform,
true, SensorIdentifier, Name, ParseParameters<FThermalCameraParameters>(ParametersObject),
true, TempActor, AttachToComponent, AttachedToBone));
377 SensorPtr = Cast<ASensor>(VehicleSensorManager->SpawnDepthCamera(RelativeTransform,
true, SensorIdentifier, Name, ParseParameters<FDepthCameraParameters>(ParametersObject),
true, TempActor, AttachToComponent, AttachedToBone));
381 SensorPtr = Cast<ASensor>(VehicleSensorManager->SpawnRadar(RelativeTransform,
true, SensorIdentifier, Name, ParseParameters<FRadarParameters>(ParametersObject),
true, TempActor, AttachToComponent, AttachedToBone));
385 SensorPtr = Cast<ASensor>(VehicleSensorManager->SpawnSegmentationCamera(RelativeTransform,
true, SensorIdentifier, Name, ParseParameters<FCameraBaseParameters>(ParametersObject),
true, TempActor, AttachToComponent, AttachedToBone));
389 SensorPtr = Cast<ASensor>(VehicleSensorManager->SpawnInstanceSegmentationCamera(RelativeTransform,
true, SensorIdentifier, Name, ParseParameters<FCameraBaseParameters>(ParametersObject),
true, TempActor, AttachToComponent, AttachedToBone));
393 SensorPtr = Cast<ASensor>(VehicleSensorManager->SpawnDVSCamera(RelativeTransform,
true, SensorIdentifier, Name, ParseParameters<FDVSCameraParameters>(ParametersObject),
true, TempActor, AttachToComponent, AttachedToBone));
400 if (HideVehicleMeshForCameras)
402 if (
ACamera* CameraPtr = Cast<ACamera>(SensorPtr))
404 CameraPtr->AddHiddenActor(
Vehicle);
413 if (
ACamera* CameraPtr = Cast<ACamera>(SensorPtr))
415 bool UseGimbal =
false;
416 SensorObject->TryGetBoolField(TEXT(
"useGimbal"), UseGimbal);
417 CameraPtr->SetUseGimbal(UseGimbal);
424 UWorld* World =
nullptr;
425 if (GEngine && GEngine->GameViewport)
427 World = GEngine->GameViewport->GetWorld();
431 || !SensorObject.IsValid()
432 || !SensorObject->HasField(TEXT(
"parameters"))
433 || !SensorObject->HasField(TEXT(
"model")))
438 TSharedPtr<FJsonObject> ParametersObject = SensorObject->GetObjectField(TEXT(
"parameters"));
439 if (!ParametersObject.IsValid())
444 FString SensorTypeString, SensorName, SensorIdentifier;
445 SensorObject->TryGetStringField(TEXT(
"model"), SensorTypeString);
446 SensorObject->TryGetStringField(TEXT(
"name"), SensorName);
447 SensorObject->TryGetStringField(TEXT(
"id"), SensorIdentifier);
449 FTransform SpawnTransform =
ParseTransform(
"spawnPoint", SensorObject);
452 bool ZIsHeightAboveGround =
false;
453 SensorObject->TryGetBoolField(TEXT(
"zIsHeightAboveGround"), ZIsHeightAboveGround);
454 if (ZIsHeightAboveGround)
459 AActor* ActorPtr =
nullptr;
463 if (!SimulationLevelManager)
465 SimulatorLog::Log(
"Failed to spawn Sensor. Reason: Coulnd't to find SimulationLevelManager Actor!");
469 USensorsManagerComponent* WorldSensorManager = SimulationLevelManager->
GetSensorsManager();
470 if (!WorldSensorManager)
472 SimulatorLog::Log(
"Failed to spawn Sensor. Reason: Coulnd't to find USensorsManagerComponent Component!");
482 ActorPtr = Cast<AActor>(WorldSensorManager->SpawnLidar(SpawnTransform,
false, SensorIdentifier, SensorName, ParseParameters<FLidarParameters>(ParametersObject),
true, TempActor,
nullptr, NAME_None));
486 ActorPtr = Cast<AActor>(WorldSensorManager->SpawnRadar(SpawnTransform,
false, SensorIdentifier, SensorName, ParseParameters<FRadarParameters>(ParametersObject),
true, TempActor,
nullptr, NAME_None));
490 ActorPtr = Cast<AActor>(WorldSensorManager->SpawnCamera(SpawnTransform,
false, SensorIdentifier, SensorName, ParseParameters<FCameraBaseParameters>(ParametersObject),
true, TempActor,
nullptr, NAME_None));
494 ActorPtr = Cast<AActor>(WorldSensorManager->SpawnThermalCamera(SpawnTransform,
false, SensorIdentifier, SensorName,
ParseThermalCameraParameters(ParametersObject),
true, TempActor,
nullptr, NAME_None));
498 ActorPtr = Cast<AActor>(WorldSensorManager->SpawnDepthCamera(SpawnTransform,
false, SensorIdentifier, SensorName, ParseParameters<FDepthCameraParameters>(ParametersObject),
true, TempActor,
nullptr, NAME_None));
502 ActorPtr = Cast<AActor>(WorldSensorManager->SpawnSegmentationCamera(SpawnTransform,
false, SensorIdentifier, SensorName, ParseParameters<FCameraBaseParameters>(ParametersObject),
true, TempActor,
nullptr, NAME_None));
506 ActorPtr = Cast<AActor>(WorldSensorManager->SpawnInstanceSegmentationCamera(SpawnTransform,
false, SensorIdentifier, SensorName, ParseParameters<FCameraBaseParameters>(ParametersObject),
true, TempActor,
nullptr, NAME_None));
510 ActorPtr = Cast<AActor>(WorldSensorManager->SpawnDVSCamera(SpawnTransform,
false, SensorIdentifier, SensorName, ParseParameters<FDVSCameraParameters>(ParametersObject),
true, TempActor,
nullptr, NAME_None));
519 ACamera* CameraPtr = Cast<ACamera>(ActorPtr);
525 ALidar* LidarPtr = Cast<ALidar>(ActorPtr);
532 bool AttachToSpectator =
false;
533 SensorObject->TryGetBoolField(TEXT(
"attachToSpectator"), AttachToSpectator);
535 if (AttachToSpectator)
547 if (!JsonObject.IsValid())
549 SimulatorLog::Log(
"SimulatorJsonParser failed to parse Walker json: Invalid JsonObject");
553 FString WalkerTypeString;
554 if (!JsonObject->TryGetStringField(TEXT(
"model"), WalkerTypeString))
556 SimulatorLog::Log(
"SimulatorJsonParser failed to parse Walker json: Model field is missing");
563 SimulatorLog::Log(
"SimulatorJsonParser failed to parse Walker json: Walker is None");
567 TSharedPtr<FJsonObject> ParametersObject = JsonObject->GetObjectField(TEXT(
"parameters"));
568 if (!ParametersObject.IsValid())
570 SimulatorLog::Log(
"SimulatorJsonParser failed to parse Walker json: ParametersObject is invalid or missing");
574 FString WalkerActionString;
575 if (!ParametersObject->TryGetStringField(TEXT(
"walkerAction"), WalkerActionString))
577 SimulatorLog::Log(
"SimulatorJsonParser failed to parse Walker json: walkerAction field is missing");
584 SimulatorLog::Log(
"SimulatorJsonParser failed to parse Walker json: Roaming Walker requires spawnPoint");
589 FString WalkerEndActionString;
590 ParametersObject->TryGetStringField(TEXT(
"walkerEndAction"), WalkerEndActionString);
601 bool CreateTransformTopic =
false;
602 if (ParametersObject->TryGetBoolField(TEXT(
"createTransformTopic"), CreateTransformTopic))
604 UE_LOG(LogTemp, Warning, TEXT(
"The boolean value is %s"), (CreateTransformTopic ? TEXT(
"true") : TEXT(
"false")));
613 ParametersObject->TryGetStringField(TEXT(
"name"), Name);
614 ParametersObject->TryGetStringField(TEXT(
"id"), ID);
617 bool StartAutomatically =
true;
618 if (ParametersObject->HasField(TEXT(
"startAutomatically")))
620 ParametersObject->TryGetBoolField(TEXT(
"startAutomatically"), StartAutomatically);
633 if (ParametersObject->HasField(TEXT(
"points")))
636 TSharedPtr<FJsonObject> PointsObject = ParametersObject->GetObjectField(TEXT(
"points"));
637 if (PointsObject.IsValid())
639 int32 PointIndex = 0;
642 FString PointName = FString::Printf(TEXT(
"point%d"), PointIndex);
643 if (!PointsObject->HasField(PointName))
648 TSharedPtr<FJsonObject> PointObject = PointsObject->GetObjectField(PointName);
649 if (PointObject.IsValid())
651 FTransform PointTransform =
ParseTransform(PointName, PointsObject);
652 WalkerParams.
Points.Add(PointTransform);
659 else if (ParametersObject->HasField(TEXT(
"spawnPoint")))
662 FTransform PointTransform =
ParseTransform(
"spawnPoint", ParametersObject);
663 WalkerParams.
Points.Add(PointTransform);
669 if (!JsonObject.IsValid())
674 TSharedPtr<FJsonObject> Parameters = JsonObject->GetObjectField(TEXT(
"parameters"));
675 if (Parameters.IsValid() && GEngine && GEngine->GameViewport)
677 UWorld* World = GEngine->GameViewport->GetWorld();
682 FJsonObjectConverter::JsonObjectToUStruct(Parameters.ToSharedRef(), FWeatherParameters::StaticStruct(), &Params);
709 if (!DronePtr || !JsonObject.IsValid())
714 TSharedPtr<FJsonObject> ParametersObject = JsonObject->GetObjectField(TEXT(
"parameters"));
716 if (ParametersObject.IsValid())
719 bool ZIsHeightAboveGround =
false;
720 ParametersObject->TryGetBoolField(TEXT(
"zIsHeightAboveGround"), ZIsHeightAboveGround);
727 FString DroneActionObject = ParametersObject->GetStringField(TEXT(
"droneAction"));
728 if (!DroneActionObject.IsEmpty())
734 FString DroneEndActionObject = ParametersObject->GetStringField(TEXT(
"droneEndAction"));
735 if (!DroneEndActionObject.IsEmpty())
741 TSharedPtr<FJsonObject> PointsObject = ParametersObject->GetObjectField(TEXT(
"points"));
742 if (PointsObject.IsValid())
744 int32 PointIndex = 0;
747 FString PointName = FString::Printf(TEXT(
"point%d"), PointIndex);
748 if (!PointsObject->HasField(PointName))
753 TSharedPtr<FJsonObject> PointObject = PointsObject->GetObjectField(PointName);
754 if (PointObject.IsValid())
756 FTransform PointTransform =
ParseTransform(PointName, PointsObject);
758 if (ZIsHeightAboveGround)
763 DroneParameters.
Points.Add(PointTransform);
770 bool ShowForwardArrow =
false;
771 ParametersObject->TryGetBoolField(TEXT(
"showForwardArrow"), ShowForwardArrow);
774 bool CollisionsEnabled =
false;
775 ParametersObject->TryGetBoolField(TEXT(
"collisionsEnabled"), CollisionsEnabled);
778 bool CreateInnerOverlapSensor =
false;
779 ParametersObject->TryGetBoolField(TEXT(
"createInnerOverlapSensor"), CreateInnerOverlapSensor);
782 float OverlapRadiusMeters = 25.0f;
783 ParametersObject->TryGetNumberField(TEXT(
"overlapRadiusMeters"), OverlapRadiusMeters);
786 bool VisualizeOverlap =
false;
787 ParametersObject->TryGetBoolField(TEXT(
"visualizeOverlap"), VisualizeOverlap);
790 float InnerOverlapRadiusMeters = 2.0f;
791 ParametersObject->TryGetNumberField(TEXT(
"innerOverlapRadiusMeters"), InnerOverlapRadiusMeters);
794 float DroneSlowToPointModifier = 1.0f;
795 ParametersObject->TryGetNumberField(TEXT(
"droneSlowToPointModifier"), DroneSlowToPointModifier);
798 bool DebugPointTransforms =
false;
799 ParametersObject->TryGetBoolField(TEXT(
"debugPointTransforms"), DebugPointTransforms);
809 if (!VehiclePtr || !JsonObject.IsValid() || !JsonObject->HasField(TEXT(
"parameters")))
818 TSharedPtr<FJsonObject> ParametersObject = JsonObject->GetObjectField(TEXT(
"parameters"));
820 Parameters = ParseParameters<FWheeledVehicleParameters>(ParametersObject);
823 FString cargoLoad =
"empty";
824 ParametersObject->TryGetStringField(TEXT(
"cargoLoad"), cargoLoad);
827 const UEnum* Enum = StaticEnum<ForwarderCargoLoad>();
828 FString Normalized = cargoLoad.TrimStartAndEnd().ToLower();
829 for (int32 i = 0; i < Enum->NumEnums(); ++i)
831 FString Name = Enum->GetNameStringByIndex(i).ToLower();
832 if (Name == Normalized)
844 if (!JsonObject.IsValid() || !Actor)
850 bool teleport =
false;
851 JsonObject->TryGetBoolField(TEXT(
"followObject"), follow);
852 JsonObject->TryGetBoolField(TEXT(
"teleportSpectator"), teleport);
854 if (!follow && !teleport)
860 if (GEngine && GEngine->GameViewport)
862 UWorld* World = GEngine->GameViewport->GetWorld();
868 AVehicle* VehiclePtr = Cast<AVehicle>(Actor);
872 if (SimulationLevelManager)
892 if (!ActorPtr || !GEngine || !GEngine->GameViewport)
897 UWorld* World = GEngine->GameViewport->GetWorld();
904 APlayerController* PlayerController = UGameplayStatics::GetPlayerController(World, 0);
905 if (PlayerController && Spectator)
907 APlayerCameraManager* CameraManager = PlayerController->PlayerCameraManager;
910 USceneComponent* CameraRootComponent = CameraManager->GetRootComponent();
911 if (CameraRootComponent)
914 ActorPtr->SetActorLocation(Spectator->GetActorLocation());
915 ActorPtr->SetActorRotation(Spectator->GetActorRotation());
918 ActorPtr->AttachToComponent(CameraRootComponent, FAttachmentTransformRules::SnapToTargetNotIncludingScale);
921 ASensor* SensorPtr = Cast<ASensor>(ActorPtr);
927 SensorModelPtr->Destroy();
937 UWorld* World =
nullptr;
938 if (GEngine && GEngine->GameViewport)
940 World = GEngine->GameViewport->GetWorld();
949 if (!CollectionInstance)
951 SimulatorLog::Log(
"ROSJsonParser.cpp: Failed to load MaterialParameterCollectionInstance!");
956 const TSharedPtr<FJsonObject>* ColorsObjectPtr =
nullptr;
957 if (JsonObject->TryGetObjectField(TEXT(
"colors"), ColorsObjectPtr) && ColorsObjectPtr !=
nullptr)
959 const TSharedPtr<FJsonObject>& ColorsObject = *ColorsObjectPtr;
960 for (
const auto& Elem : ColorsObject->Values)
962 FName Type = FName(*Elem.Key);
963 FString VectorString = Elem.Value->AsString();
966 FVector4 ParsedVector;
967 TArray<FString> ParsedValues;
968 VectorString.ParseIntoArray(ParsedValues, TEXT(
","),
true);
969 if (ParsedValues.Num() == 4)
971 ParsedVector.X = FCString::Atof(*ParsedValues[0]);
972 ParsedVector.Y = FCString::Atof(*ParsedValues[1]);
973 ParsedVector.Z = FCString::Atof(*ParsedValues[2]);
974 ParsedVector.W = FCString::Atof(*ParsedValues[3]);
987 if (!GEngine || !GEngine->GameViewport)
992 UWorld* World = GEngine->GameViewport->GetWorld();
995 const TArray<TSharedPtr<FJsonValue>>* CommandsArray;
996 if (JsonObject->TryGetArrayField(TEXT(
"commands"), CommandsArray))
998 for (
const TSharedPtr<FJsonValue>& CommandValue : *CommandsArray)
1001 if (CommandValue->TryGetString(Command))
1003 GEngine->Exec(World, *Command);
1012 if (!GEngine || !GEngine->GameViewport || !JsonObject.IsValid())
1018 FTransform SpawnTransform =
ParseTransform(
"spawnPoint", JsonObject);
1021 FTransform TransformBounds =
ParseTransform(
"bounds", JsonObject);
1022 FVector Bounds = TransformBounds.GetLocation();
1024 bool OnlyDestroyTrees =
true;
1025 JsonObject->TryGetBoolField(TEXT(
"onlyDestroyTrees"), OnlyDestroyTrees);
1027 UWorld* World = GEngine->GameViewport->GetWorld();
1042 if (!JsonObject.IsValid() || !GEngine || !GEngine->GameViewport)
1048 TSharedPtr<FJsonObject> ParametersObject = JsonObject->GetObjectField(TEXT(
"parameters"));
1050 if (ParametersObject.IsValid())
1053 bool ZIsHeightAboveGround =
false;
1054 ParametersObject->TryGetBoolField(TEXT(
"zIsHeightAboveGround"), ZIsHeightAboveGround);
1056 bool UseGPS =
false;
1057 UseGPS = ParametersObject->GetBoolField(TEXT(
"useGPSLocation"));
1061 CaptureData.
CaptureRotatedViews = ParametersObject->GetBoolField(TEXT(
"captureRotatedViews"));
1063 TSharedPtr<FJsonObject> PointsObject = ParametersObject->GetObjectField(TEXT(
"points"));
1064 if (PointsObject.IsValid())
1066 int32 PointIndex = 0;
1069 FString PointName = FString::Printf(TEXT(
"point%d"), PointIndex);
1070 if (!PointsObject->HasField(PointName))
1075 TSharedPtr<FJsonObject> PointObject = PointsObject->GetObjectField(PointName);
1076 if (PointObject.IsValid())
1078 FTransform PointTransform =
ParseTransform(PointName, PointsObject);
1080 if (ZIsHeightAboveGround && !UseGPS)
1093 UWorld* World = GEngine->GameViewport->GetWorld();
1105 FTransform SpawnTransform;
1107 const TSharedPtr<FJsonObject>* SpawnPointObject =
nullptr;
1108 if (!Object->TryGetObjectField(FieldName, SpawnPointObject))
1110 return SpawnTransform;
1113 const auto& SPO = *SpawnPointObject->Get();
1115 double LocationX = 0.0, LocationY = 0.0, LocationZ = 0.0;
1116 if (!SPO.TryGetNumberField(TEXT(
"x"), LocationX) ||
1117 !SPO.TryGetNumberField(TEXT(
"y"), LocationY) ||
1118 !SPO.TryGetNumberField(TEXT(
"z"), LocationZ))
1120 return SpawnTransform;
1123 double Yaw = 0.0, Pitch = 0.0, Roll = 0.0;
1124 SPO.TryGetNumberField(TEXT(
"yaw"), Yaw);
1125 SPO.TryGetNumberField(TEXT(
"pitch"), Pitch);
1126 SPO.TryGetNumberField(TEXT(
"roll"), Roll);
1128 const FVector Location(LocationX, LocationY, LocationZ);
1129 const FRotator Rotation(Pitch, Yaw, Roll);
1130 SpawnTransform.SetLocation(Location);
1131 SpawnTransform.SetRotation(Rotation.Quaternion());
1133 double ScaleX = 1.0, ScaleY = 1.0, ScaleZ = 1.0;
1134 if (SPO.TryGetNumberField(TEXT(
"scaleX"), ScaleX) &&
1135 SPO.TryGetNumberField(TEXT(
"scaleY"), ScaleY) &&
1136 SPO.TryGetNumberField(TEXT(
"scaleZ"), ScaleZ))
1138 SpawnTransform.SetScale3D(FVector(ScaleX, ScaleY, ScaleZ));
1141 return SpawnTransform;
1147 const TSharedPtr<FJsonObject>* VectorObject;
1149 if (Object->TryGetObjectField(FieldName, VectorObject))
1152 (*VectorObject)->TryGetNumberField(TEXT(
"x"), X);
1153 (*VectorObject)->TryGetNumberField(TEXT(
"y"), Y);
1154 (*VectorObject)->TryGetNumberField(TEXT(
"z"), Z);
1155 (*VectorObject)->TryGetNumberField(TEXT(
"w"), W);
1156 Vector = FVector4(X, Y, Z, W);
1166 if (ParametersObject.IsValid())
1172 ParametersObject->TryGetNumberField(TEXT(
"widthResolutionNoise"), ThermalCameraParams.
WidthResolutionNoise);
1173 ParametersObject->TryGetNumberField(TEXT(
"heightResolutionNoise"), ThermalCameraParams.
HeightResolutionNoise);
1176 TSharedPtr<FJsonObject> CameraParametersObject = ParametersObject->GetObjectField(TEXT(
"cameraParameters"));
1177 if (CameraParametersObject.IsValid())
1179 ThermalCameraParams.
CameraParameters = ParseParameters<FCameraBaseParameters>(CameraParametersObject);
1183 return ThermalCameraParams;
1188 int32 Value = DefaultValue;
1190 if (JsonObject.IsValid() && JsonObject->HasField(FieldName))
1192 JsonObject->TryGetNumberField(FieldName, Value);
@ SemanticSegmentationCamera
@ InstanceSegmentationCamera
static EDroneEndAction GetDroneEndAction(FString endActionstring)
static EDroneAction GetDroneAction(FString actionstring)
void SetupDataCapture(FCaptureData NewCaptureData)
void DestroyOverlappingActors(bool OnlyTrees)
void ChangeOverlapBounds(FVector Bounds)
void SetDrawDebugPoints(bool show)
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 bool AlignTransformFromGroundInMeters(AActor *Actor, FTransform &InTransform)
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 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 SpawnSensorToVehicle(AVehicle *Vehicle, const TSharedPtr< FJsonObject > &SensorObject, bool HideVehicleMeshForCameras=false)
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)
bool UseHeightAboveGround
TArray< FTransform > CapturePositions
TArray< ASensor * > Sensors
float InnerOverlapRadiusMeters
bool CreateInnerOverlapSensor
EDroneEndAction DroneEndAction
float OverlapRadiusMeters
float DroneSlowToPointModifier
TArray< FTransform > Points
int32 WidthResolutionNoise
int32 HeightResolutionNoise
FCameraBaseParameters CameraParameters
bool AllowCustomNoiseResolution
bool CreateTransformTopic
EWalkerAction WalkerAction
TArray< FTransform > Points
EWalkerEndAction WalkerEndAction
ForwarderCargoLoad CargoLoad