24#include "Engine/StaticMeshActor.h"
25#include "EngineUtils.h"
26#include "GameFramework/SpectatorPawn.h"
27#include "GenericPlatform/GenericPlatformProcess.h"
28#include "Kismet/GameplayStatics.h"
29#include "Materials/MaterialParameterCollection.h"
30#include "Materials/MaterialParameterCollectionInstance.h"
31#include "Misc/FileHelper.h"
32#include "Misc/Paths.h"
39 case TSS::TrafficLightRed:
40 case TSS::TrafficLightYellow:
41 case TSS::TrafficLightGreen:
return TEXT(
"traffic.traffic_light");
42 case TSS::SpeedLimit_30:
return TEXT(
"traffic.speed_limit.30");
43 case TSS::SpeedLimit_40:
return TEXT(
"traffic.speed_limit.40");
44 case TSS::SpeedLimit_50:
return TEXT(
"traffic.speed_limit.50");
45 case TSS::SpeedLimit_60:
return TEXT(
"traffic.speed_limit.60");
46 case TSS::SpeedLimit_90:
return TEXT(
"traffic.speed_limit.90");
47 case TSS::SpeedLimit_100:
return TEXT(
"traffic.speed_limit.100");
48 case TSS::SpeedLimit_120:
return TEXT(
"traffic.speed_limit.120");
49 case TSS::SpeedLimit_130:
return TEXT(
"traffic.speed_limit.130");
50 case TSS::StopSign:
return TEXT(
"traffic.stop");
51 case TSS::YieldSign:
return TEXT(
"traffic.yield");
52 default:
return TEXT(
"traffic.unknown");
57 : Super(ObjectInitializer),
60 ActorDispatcher = CreateDefaultSubobject<UActorDispatcher>(TEXT(
"ActorDispatcher"));
66 bool bIsFileFound =
false;
68 FString FinalPath = MapString.IsEmpty() ?
GetMapName() : MapString;
69 FinalPath += !MapString.EndsWith(
".umap") ?
".umap" :
"";
71 if (MapString.StartsWith(
"/Game"))
74 FinalPath.RemoveFromStart(TEXT(
"/Game/"));
75 FinalPath = FPaths::ProjectContentDir() + FinalPath;
76 FinalPath = IFileManager::Get().ConvertToAbsolutePathForExternalAppForRead(*FinalPath);
78 if (FPaths::FileExists(FinalPath)) {
80 FinalPath = MapString;
85 if (MapString.Contains(
"/"))
return false;
88 TArray<FString> TempStrArray, PathList;
89 IFileManager::Get().FindFilesRecursive(PathList, *FPaths::ProjectContentDir(), *FinalPath,
true,
false,
false);
90 if (PathList.Num() > 0)
92 FinalPath = PathList[0];
93 FinalPath.ParseIntoArray(TempStrArray, TEXT(
"Content/"),
true);
94 FinalPath = TempStrArray[1];
95 FinalPath.ParseIntoArray(TempStrArray, TEXT(
"."),
true);
96 FinalPath =
"/Game/" + TempStrArray[0];
104 UE_LOG(LogCarla, Warning, TEXT(
"Loading a new episode: %s"), *FinalPath);
105 UGameplayStatics::OpenLevel(GetWorld(), *FinalPath,
true);
117 if (SecondaryServer->HasClientsConnected())
119 SecondaryServer->GetCommander().SendLoadMap(std::string(TCHAR_TO_UTF8(*FinalPath)));
131 const FString RecastToolName =
"RecastBuilder.exe";
133 const FString RecastToolName =
"RecastBuilder";
138 const FString AbsoluteRecastBuilderPath = FPaths::ConvertRelativePathToFull(
139 FPaths::RootDir() +
"Tools/" + RecastToolName);
141 const FString AbsoluteRecastBuilderPath = FPaths::ConvertRelativePathToFull(
142 FPaths::ProjectDir() +
"../../Util/DockerUtils/dist/" + RecastToolName);
144 return AbsoluteRecastBuilderPath;
148 const FString &OpenDriveString,
151 if (OpenDriveString.IsEmpty())
153 UE_LOG(LogCarla, Error, TEXT(
"The OpenDrive string is empty."));
159 carla::rpc::FromLongFString(OpenDriveString));
162 if (!CarlaMap.has_value())
164 UE_LOG(LogCarla, Error, TEXT(
"The OpenDrive string is invalid or not supported"));
170 const auto CrosswalksMesh = CarlaMap->GetAllCrosswalkMesh();
171 const auto RecastOBJ = (RoadMesh + CrosswalksMesh).GenerateOBJForRecast();
173 const FString AbsoluteOBJPath = FPaths::ConvertRelativePathToFull(
174 FPaths::ProjectContentDir() +
"Carla/Maps/Nav/OpenDriveMap.obj");
177 FFileHelper::SaveStringToFile(
178 carla::rpc::ToLongFString(RecastOBJ),
180 FFileHelper::EEncodingOptions::ForceUTF8,
181 &IFileManager::Get());
183 const FString AbsoluteXODRPath = FPaths::ConvertRelativePathToFull(
184 FPaths::ProjectContentDir() +
"Carla/Maps/OpenDrive/OpenDriveMap.xodr");
187 FFileHelper::SaveStringToFile(
190 FFileHelper::EEncodingOptions::ForceUTF8,
191 &IFileManager::Get());
193 if (!FPaths::FileExists(AbsoluteXODRPath))
195 UE_LOG(LogCarla, Error, TEXT(
"ERROR: XODR not copied!"));
211 if (FPaths::FileExists(AbsoluteRecastBuilderPath) &&
216 FPlatformProcess::CreateProc(
217 *AbsoluteRecastBuilderPath, *AbsoluteOBJPath,
218 true,
true,
true,
nullptr, 0,
nullptr,
nullptr);
222 UE_LOG(LogCarla, Warning, TEXT(
"'RecastBuilder' not present under '%s', "
223 "the binaries for pedestrian navigation will not be created."),
224 *AbsoluteRecastBuilderPath);
235 UE_LOG(LogCarla, Warning, TEXT(
"Setting ActorActiveDistance is smaller that TileStreamingDistance, TileStreamingDistance will be increased"));
257 Actor.parent_id = ParentId;
262 UE_LOG(LogCarla, Warning, TEXT(
"Trying to serialize invalid actor"));
277 SerializedActor.
id = 0u;
279 TSet<crp::CityObjectLabel> SemanticTags;
285 for (
auto &&Tag : SemanticTags)
287 using tag_t =
decltype(SerializedActor.
semantic_tags)::value_type;
288 SerializedActor.
semantic_tags.emplace_back(
static_cast<tag_t
>(Tag));
290 return SerializedActor;
298 const FString& SocketName)
325 auto World = GetWorld();
326 check(World !=
nullptr);
327 auto PlayerController = UGameplayStatics::GetPlayerController(World, 0);
328 if (PlayerController ==
nullptr)
330 UE_LOG(LogCarla, Error, TEXT(
"Can't find player controller!"));
337 Description.
Id = TEXT(
"spectator");
343 UE_LOG(LogCarla, Error, TEXT(
"Can't find spectator!"));
347 UMaterialParameterCollection *Collection = LoadObject<UMaterialParameterCollection>(
nullptr, TEXT(
"/Game/Carla/Blueprints/Game/CarlaParameters.CarlaParameters"),
nullptr, LOAD_None,
nullptr);
348 if (Collection !=
nullptr)
353 UE_LOG(LogCarla, Error, TEXT(
"Can't find CarlaParameters instance!"));
358 UE_LOG(LogCarla, Error, TEXT(
"Can't find CarlaParameters asset!"));
361 for (TActorIterator<ATrafficSignBase> It(World); It; ++It)
364 check(Actor !=
nullptr);
367 Description.
Class = Actor->GetClass();
373 uint32 StaticMeshUId = 0;
374 for (
auto& Definition : Definitions)
376 if (Definition.Id ==
"static.prop.mesh")
378 StaticMeshUId = Definition.UId;
383 for (TActorIterator<AStaticMeshActor> It(World); It; ++It)
386 check(Actor !=
nullptr);
387 auto MeshComponent = Actor->GetStaticMeshComponent();
388 check(MeshComponent !=
nullptr);
389 if (MeshComponent->Mobility == EComponentMobility::Movable)
392 Description.
Id = TEXT(
"static.prop.mesh");
393 Description.
UId = StaticMeshUId;
394 Description.
Class = Actor->GetClass();
397 MeshComponent->GetStaticMesh()->GetPathName()});
400 FString::SanitizeFloat(MeshComponent->GetMass())});
429 result =
"Recorder is not ready";
436 const FTransform &Transform,
441 FTransform LocalTransform = Transform;
454 result.Value->GetActorId(),
455 static_cast<uint8_t
>(result.Value->GetActorType()),
463 result.Value->GetActorId(),
464 static_cast<uint8_t
>(result.Value->GetActorType()),
466 std::move(thisActorDescription));
static FString UCarlaEpisode_GetTrafficSignId(ETrafficSignState State)
static FString BuildRecastBuilderFile()
FString CarlaGetRelevantTagAsString(const TSet< crp::CityObjectLabel > &SemanticTags)
Base class for the CARLA Game Mode.
const TArray< FTransform > & GetSpawnPointsTransforms() const
void AddEvent(const CarlaRecorderEventAdd &Event)
CarlaReplayer * GetReplayer(void)
std::string Start(std::string Name, FString MapName, bool AdditionalData=false)
void CreateRecorderEventAdd(uint32_t DatabaseId, uint8_t Type, const FTransform &Transform, FActorDescription ActorDescription)
FTransform GlobalToLocalTransform(const FTransform &InTransform) const
static void GetTagsOfTaggedActor(const AActor &Actor, TSet< crp::CityObjectLabel > &Tags)
Retrieve the tags of an already tagged actor.
void Stop(bool KeepActors=false)
A view over an actor and its properties.
const FActorInfo * GetActorInfo() const
IdType GetActorId() const
std::shared_ptr< carla::multigpu::Router > GetSecondaryServer()
static FOnEpisodeSettingsChange OnEpisodeSettingsChange
void SetEpisode(UCarlaEpisode *ThisEpisode)
void AddEvent(const CarlaRecorderEventAdd &Event)
void CreateRecorderEventAdd(uint32_t DatabaseId, uint8_t Type, const FTransform &Transform, FActorDescription ActorDescription, bool bAddOtherRelatedInfo=true)
static void AttachActors(AActor *Child, AActor *Parent, EAttachmentType AttachmentType, const FString &SocketName="")
FCarlaActor * RegisterActor(AActor &Actor, FActorDescription ActorDescription, FActorRegistry::IdType DesiredId=0)
Register an actor that was not created using "SpawnActor" function but that should be kept in the reg...
TPair< EActorSpawnResultStatus, FCarlaActor * > SpawnActor(const FTransform &Transform, FActorDescription ActorDescription, FCarlaActor::IdType DesiredId=0)
Spawns an actor based on ActorDescription at Transform.
static FBoundingBox GetActorBoundingBox(const AActor *Actor, uint8 InTagQueried=0xFF)
Compute the bounding box of the given Carla actor.
FFrameData & GetFrameData()
std::string StartRecorder(std::string name, bool AdditionalData)
carla::rpc::Actor SerializeActor(FCarlaActor *CarlaActor) const
Create a serializable object describing the actor.
FEpisodeSettings EpisodeSettings
UCarlaEpisode(const FObjectInitializer &ObjectInitializer)
FIntVector CurrentMapOrigin
bool LoadNewOpendriveEpisode(const FString &OpenDriveString, const carla::rpc::OpendriveGenerationParameters &Params)
Load a new map generating the mesh from OpenDRIVE data and start a new episode.
const TArray< FActorDefinition > & GetActorDefinitions() const
Return the list of actor definitions that are available to be spawned this episode.
FCarlaActor * FindCarlaActor(FCarlaActor::IdType ActorId)
Find a Carla actor by id.
UActorDispatcher * ActorDispatcher
const FString & GetMapName() const
Return the name of the map loaded in this episode.
void ApplySettings(const FEpisodeSettings &Settings)
TPair< EActorSpawnResultStatus, FCarlaActor * > SpawnActorWithInfo(const FTransform &Transform, FActorDescription thisActorDescription, FCarlaActor::IdType DesiredId=0)
Spawns an actor based on ActorDescription at Transform.
UMaterialParameterCollectionInstance * MaterialParameters
ACarlaRecorder * Recorder
void InitializeAtBeginPlay()
bool LoadNewEpisode(const FString &MapString, bool ResetSettings=true)
Load a new map and start a new episode.
TArray< FTransform > GetRecommendedSpawnPoints() const
Return the list of recommended spawn points for vehicles.
void AttachActors(AActor *Child, AActor *Parent, EAttachmentType InAttachmentType=EAttachmentType::Rigid, const FString &SocketName="")
Attach Child to Parent.
The game instance contains elements that must be kept alive in between levels.
FCarlaEngine * GetCarlaEngine()
void SetOpendriveGenerationParameters(const carla::rpc::OpendriveGenerationParameters &Parameters)
static UCarlaGameInstance * GetGameInstance(const UObject *WorldContextObject)
static ALargeMapManager * GetLargeMapManager(const UObject *WorldContextObject)
static ACarlaGameModeBase * GetGameMode(const UObject *WorldContextObject)
static boost::optional< road::Map > Load(const std::string &opendrive)
std::vector< uint8_t > semantic_tags
ActorDescription description
geom::BoundingBox bounding_box
static void log_warning(Args &&... args)
An actor attribute, may be an intrinsic (non-modifiable) attribute of the actor or an user-defined ac...
A description of a Carla Actor with all its variation.
TMap< FString, FActorAttribute > Variations
User selected variations of the actor.
TSubclassOf< AActor > Class
Class of the actor to be spawned.
uint32 UId
UId of the definition in which this description was based.
FString Id
Display ID that identifies the actor.
crp::Actor SerializedData
float TileStreamingDistance
float ActorActiveDistance
Seting for map generation from opendrive without additional geometry
bool enable_pedestrian_navigation