18#include <util/ue-header-guard-begin.h>
19#include "Engine/Engine.h"
20#include "Engine/WorldComposition.h"
21#include "Engine/ObjectLibrary.h"
22#include "Misc/FileHelper.h"
23#include "Misc/Paths.h"
24#include "Engine/EngineTypes.h"
25#include "Components/PrimitiveComponent.h"
27#include "LandscapeHeightfieldCollisionComponent.h"
28#include "LandscapeComponent.h"
29#include <util/ue-header-guard-end.h>
31#define LARGEMAP_LOGS 1
34#define LM_LOG(Level, Msg, ...) UE_LOG(LogCarla, Level, TEXT(Msg), ##__VA_ARGS__)
42 PrimaryActorTick.bCanEverTick =
true;
50 FCoreDelegates::PreWorldOriginOffset.RemoveAll(
this);
51 FCoreDelegates::PostWorldOriginOffset.RemoveAll(
this);
53 FWorldDelegates::LevelRemovedFromWorld.RemoveAll(
this);
54 FWorldDelegates::LevelAddedToWorld.RemoveAll(
this);
63 UWorld* World = GetWorld();
64 if (World->GetWorldPartition() !=
nullptr || World->WorldComposition ==
nullptr)
69 UE_LOG(LogCarla, Warning, TEXT(
70 "LargeMapManager present in a World Partition world; destroying the "
71 "legacy tile manager (native streaming takes over)."));
85 UWorldComposition* WorldComposition = World->WorldComposition;
86 WorldComposition->bRebaseOriginIn3DSpace =
true;
94 TArray<AActor*> FoundActors;
95 UGameplayStatics::GetAllActorsOfClass(GetWorld(), AActor::StaticClass(), FoundActors);
96 for(
auto CurrentActor : FoundActors)
98 if( CurrentActor->FindComponentByClass( UCustomTerrainPhysicsComponent::StaticClass() ) != nullptr )
106 APlayerController* PlayerController = UGameplayStatics::GetPlayerController(GetWorld(), 0);
109 Spectator = PlayerController->GetPawnOrSpectator();
115 LM_LOG(Log,
"PreWorldOriginOffset Src: %s -> Dst: %s", *InSrcOrigin.ToString(), *InDstOrigin.ToString());
124 UWorld* World = GetWorld();
129 GEngine->AddOnScreenDebugMessage(66,
MsgTime, FColor::Yellow,
130 FString::Printf(TEXT(
"Src: %s -> Dst: %s"), *InSrcOrigin.ToString(), *InDstOrigin.ToString()));
131 LM_LOG(Log,
"PostWorldOriginOffset Src: %s -> Dst: %s", *InSrcOrigin.ToString(), *InDstOrigin.ToString());
134 const TArray<ULevelStreaming*>& StreamingLevels = World->GetStreamingLevels();
135 FColor LevelColor = FColor::White;
136 float MinDistance = 10000000.0f;
137 for (
const auto& TilePair :
MapTiles)
141 FVector LevelLocation = Tile.
Location;
142 float Distance = FVector::Dist(LevelLocation, FVector(InDstOrigin));
143 if (Distance < MinDistance)
145 MinDistance = Distance;
154 LM_LOG(Warning,
"OnLevelAddedToWorld");
164 LM_LOG(Warning,
"OnLevelRemovedFromWorld");
176 AActor* ManagerActor = UGameplayStatics::GetActorOfClass(
177 GetWorld(), ATrafficLightManager::StaticClass());
180 Manager->SnapSignsToGround();
187 UWorld* World = GetWorld();
190 for (
const auto& CarlaActorPair : ActorRegistry)
192 if (CarlaActorPair.Value->GetActorInfo()->Description.Id ==
"spectator")
204 UWorld* World = GetWorld();
207 bool IsHeroVehicle =
false;
219 if(Attribute && (Attribute->
Value.Contains(
"hero") || Attribute->
Value.Contains(
"ego_vehicle")))
221 LM_LOG(Log,
"HERO VEHICLE DETECTED");
235 World->FlushLevelStreaming();
239 IsHeroVehicle =
true;
257 LM_LOG(Log,
"ACTIVE VEHICLE DETECTED");
265 LM_LOG(Log,
"DORMANT VEHICLE DETECTED");
273 LM_LOG(Warning,
"Actor Spawned at %s", *GlobalPosition.ToString());
291 LM_LOG(Warning,
"ALargeMapManager::OnActorDestroyed %s", *DestroyedActor->GetName());
293 UWorld* World = GetWorld();
351 InTransform.GetRotation(),
353 InTransform.GetScale3D());
364 InTransform.GetRotation(),
366 InTransform.GetScale3D());
378 Super::Tick(DeltaTime);
412 LM_LOG(Warning,
"Generating Map %s ...", *InAssetsPath);
418 TArray<FAssetData> AssetsData;
419 UObjectLibrary* ObjectLibrary = UObjectLibrary::CreateLibrary(UWorld::StaticClass(),
true,
true);
420 ObjectLibrary->LoadAssetDataFromPath(InAssetsPath);
421 ObjectLibrary->GetAssetDataList(AssetsData);
424 UWorld* World = GetWorld();
426 for (
const FAssetData& AssetData : AssetsData)
432 FString TileName = AssetData.AssetName.ToString();
433 if (!TileName.Contains(
"_Tile_"))
437 FString TileName_X =
"";
438 FString TileName_Y =
"";
439 size_t i = TileName.Len()-1;
441 TCHAR character = TileName[i];
442 if (character ==
'_') {
445 TileName_Y = FString::Chr(character) + TileName_Y;
449 TCHAR character = TileName[i];
450 if (character ==
'_') {
453 TileName_X = FString::Chr(character) + TileName_X;
455 FIntVector TileVectorID = FIntVector(FCString::Atoi(*TileName_X), FCString::Atoi(*TileName_Y), 0);
460 LoadCarlaMapTile(InAssetsPath +
"/" + AssetData.AssetName.ToString(), TileId);
462 ObjectLibrary->ConditionalBeginDestroy();
464 GEngine->ForceGarbageCollection(
true);
473 LM_LOG(Warning,
"GenerateMap num Tiles generated %d",
MapTiles.Num());
481 LM_LOG(Warning,
"Generating Large Map");
484 for (TPair<FString, FIntVector>& PathId : MapPathsIds)
486 FIntVector& TileVectorID = PathId.Value;
487 FString& Path = PathId.Key;
493 LM_LOG(Warning,
"GenerateMap num Tiles generated %d",
MapTiles.Num());
504 UWorld* World = GetWorld();
505 UWorldComposition* WorldComposition = World->WorldComposition;
506 if (WorldComposition ==
nullptr)
510 World->ClearStreamingLevels();
511 WorldComposition->TilesStreaming.Empty();
512 WorldComposition->GetTilesList().Empty();
516 ULevelStreamingDynamic* StreamingLevel = It.Value.StreamingLevel;
517 World->AddStreamingLevel(StreamingLevel);
518 WorldComposition->TilesStreaming.Add(StreamingLevel);
543 return { MaxX - MinX + 1, MaxY - MinY + 1, 0 };
555 LM_LOG(Warning,
"IsLevelOfTileLoaded Tile %s does not exist", *InTileID.ToString());
560 const ULevelStreamingDynamic* StreamingLevel = Tile->
StreamingLevel;
562 return (StreamingLevel && StreamingLevel->GetLoadedLevel());
567 FIntVector VectorId = FIntVector(
577 FIntVector VectorId = (
589 (int32)(
TileID & (int32)(~0)),
602 TileVectorID.Y *= -1;
614 TileVectorID.
Y *= -1;
620 int64 X = ((int64)(TileVectorID.X) << 32);
621 int64 Y = (int64)(TileVectorID.Y) & 0x00000000FFFFFFFF;
649 ULevel* Level = StreamingLevel->GetLoadedLevel();
650 if (Level == InLevel)
687 NewTile.
Name = TileMapPath;
690 FVector TileLocation = NewTile.
Location;
691 FString TileName = NewTile.
Name;
692 UWorld* World = GetWorld();
693 UWorldComposition* WorldComposition = World->WorldComposition;
695 FString FullName = TileMapPath;
696 FString PackageFileName = FullName;
697 FString LongLevelPackageName = FPackageName::FilenameToLongPackageName(PackageFileName);
698 FString UniqueLevelPackageName = LongLevelPackageName;
700 ULevelStreamingDynamic* StreamingLevel = NewObject<ULevelStreamingDynamic>(World, *TileName);
701 check(StreamingLevel);
703 StreamingLevel->SetWorldAssetByPackageName(*UniqueLevelPackageName);
706 if (World->IsPlayInEditor())
708 FWorldContext WorldContext = GEngine->GetWorldContextFromWorldChecked(World);
709 StreamingLevel->RenameForPIE(WorldContext.PIEInstance);
711 StreamingLevel->SetShouldBeVisibleInEditor(
true);
712 StreamingLevel->LevelColor = FColor::MakeRandomColor();
715 StreamingLevel->SetShouldBeLoaded(
false);
716 StreamingLevel->SetShouldBeVisible(
false);
718 StreamingLevel->bInitiallyLoaded =
false;
719 StreamingLevel->bInitiallyVisible =
false;
720 StreamingLevel->LevelTransform = FTransform(TileLocation);
721 StreamingLevel->PackageNameToLoad = *FullName;
723 if (!FPackageName::DoesPackageExist(FullName, &PackageFileName))
725 LM_LOG(Error,
"Level does not exist in package with FullName variable -> %s", *FullName);
728 if (!FPackageName::DoesPackageExist(LongLevelPackageName, &PackageFileName))
730 LM_LOG(Error,
"Level does not exist in package with LongLevelPackageName variable -> %s", *LongLevelPackageName);
734 StreamingLevel->PackageNameToLoad = *LongLevelPackageName;
739 return MapTiles.Add(TileId, NewTile);
745 TSet<TileID> TilesToConsider;
761 TSet<TileID> TilesToBeVisible;
762 TSet<TileID> TilesToHidde;
808 UWorld* World = GetWorld();
817 FVector RelativeLocation = Actor->GetActorLocation();
830 FVector HeroLocation = HeroActor->GetActorLocation();
832 float DistanceSquared = (RelativeLocation - HeroLocation).SizeSquared();
844 LM_LOG(Warning,
"CheckActiveActors Actor does not exist -> Remove actor");
853 UWorld* World = GetWorld();
863 LM_LOG(Warning,
"Converting Active To Dormant... %d", Id);
875 UWorld* World = GetWorld();
886 LM_LOG(Log,
"CheckDormantActors Carla Actor %d not found", Id);
892 LM_LOG(Warning,
"CheckDormantActors IDs doesn't match!! Wanted = %d Received = %d", Id, CarlaActor->
GetActorId());
898 LM_LOG(Warning,
"CheckDormantActors Carla Actor %d is not dormant", Id);
907 FVector HeroLocation = Actor->GetActorLocation();
912 float DistanceSquared = (RelativeLocation - HeroLocation).SizeSquared();
927 UWorld* World = GetWorld();
932 LM_LOG(Warning,
"Converting %d Dormant To Active", Id);
939 LM_LOG(Warning,
"Spawning dormant at %s\n\tOrigin: %s\n\tRel. location: %s", \
942 *((View->
GetActor()->GetActorLocation()).ToString()) \
949 LM_LOG(Warning,
"Actor %d could not be woken up, keeping sleep state", Id);
961 UWorld* World = GetWorld();
962 UWorldComposition* WorldComposition = World->WorldComposition;
967 FVector ActorLocation = ActorToConsider->GetActorLocation();
968 FIntVector ILocation = FIntVector(ActorLocation.X, ActorLocation.Y, ActorLocation.Z);
973 World->SetNewWorldOrigin(FIntVector(NewOrigin));
980 TSet<TileID>& OutTilesToConsider)
983 check(ActorToConsider);
995 for (
int Y = UpperTileId.Y; Y <= LowerTileId.Y; Y++)
997 for (
int X = LowerTileId.X; X <= UpperTileId.X; X++)
1001 FIntVector TileToCheck = FIntVector(X, Y, 0);
1011 OutTilesToConsider.Add(
TileID);
1017 const TSet<TileID>& InTilesToConsider,
1018 TSet<TileID>& OutTilesToBeVisible,
1019 TSet<TileID>& OutTilesToHidde)
1027 const TSet<TileID>& InTilesToUpdate,
1028 bool InShouldBlockOnLoad,
1029 bool InShouldBeLoaded,
1030 bool InShouldBeVisible)
1033 UWorld* World = GetWorld();
1034 UWorldComposition* WorldComposition = World->WorldComposition;
1041 ULevelStreamingDynamic* StreamingLevel = CarlaTile->
StreamingLevel;
1042 StreamingLevel->bShouldBlockOnLoad = InShouldBlockOnLoad;
1043 StreamingLevel->SetShouldBeLoaded(InShouldBeLoaded);
1044 StreamingLevel->SetShouldBeVisible(InShouldBeVisible);
1049 const TSet<TileID>& InTilesToBeVisible,
1050 const TSet<TileID>& InTilesToHidde)
1066 int32 X = (int32)(
TileID >> 32);
1067 int32 Y = (int32)(
TileID);
1068 return FString::Printf(TEXT(
"Tile_%d_%d"), X, Y);
1073 int32 X = (int32)(
TileID >> 32);
1074 int32 Y = (int32)(
TileID);
1075 return FString::Printf(TEXT(
"%d_%d"), X, Y);
1080 FString FileContent =
"";
1081 FileContent += FString::Printf(TEXT(
"LargeMapManager state\n"));
1083 FileContent += FString::Printf(TEXT(
"Tile:\n"));
1084 FileContent += FString::Printf(TEXT(
"ID\tName\tLocation\n"));
1088 FileContent += FString::Printf(TEXT(
" %ld\t%s\t%s\n"), It.Key, *Tile.
Name, *Tile.
Location.ToString());
1090 FileContent += FString::Printf(TEXT(
"\nNum generated tiles: %d\n"),
MapTiles.Num());
1093 TArray<FString> StringArray;
1094 AssetsPath.ParseIntoArray(StringArray, TEXT(
"/"),
false);
1096 FString FilePath = FPaths::ProjectSavedDir() + StringArray[StringArray.Num() - 1] +
".txt";
1097 FFileHelper::SaveStringToFile(
1100 FFileHelper::EEncodingOptions::AutoDetect,
1101 &IFileManager::Get(),
1102 EFileWrite::FILEWRITE_Silent);
1108 UWorld* World = GetWorld();
1114 const TArray<FLevelCollection>& WorldLevelCollections = World->GetLevelCollections();
1115 const FLevelCollection* LevelCollection = World->GetActiveLevelCollection();
1116 const TArray<ULevel*>& Levels = World->GetLevels();
1117 const TArray<ULevelStreaming*>& StreamingLevels = World->GetStreamingLevels();
1118 ULevel* CurrentLevel = World->GetCurrentLevel();
1120 FString Output =
"";
1121 Output += FString::Printf(TEXT(
"Num levels in world composition: %d\n"),
1122 World->WorldComposition ? World->WorldComposition->TilesStreaming.Num() : 0);
1123 Output += FString::Printf(TEXT(
"Num levels loaded: %d\n"), Levels.Num() );
1124 Output += FString::Printf(TEXT(
"Num tiles loaded: %d\n"),
CurrentTilesLoaded.Num() );
1125 Output += FString::Printf(TEXT(
"Tiles loaded: [ "));
1128 Output += FString::Printf(TEXT(
"%s, "), *
TileIDToString(TileId));
1130 Output += FString::Printf(TEXT(
"]\n"));
1131 GEngine->AddOnScreenDebugMessage(0,
MsgTime, FColor::Cyan, Output);
1134 GEngine->AddOnScreenDebugMessage(LastMsgIndex++,
MsgTime, FColor::White,
1135 FString::Printf(TEXT(
"\nActor Global Position: %s km"), *(
FDVector(CurrentActorPosition) / (1000.0 * 100.0)).ToString()) );
1138 GEngine->AddOnScreenDebugMessage(LastMsgIndex++,
MsgTime, FColor::White,
1139 FString::Printf(TEXT(
"\nActor Current Tile: %d_%d"), CurrentTile.X, CurrentTile.Y ));
1142 GEngine->AddOnScreenDebugMessage(LastMsgIndex++,
MsgTime, FColor::White,
1144 GEngine->AddOnScreenDebugMessage(LastMsgIndex++,
MsgTime, FColor::White,
1145 FString::Printf(TEXT(
"Num active actors (%d)"),
ActiveActors.Num()) );
1146 GEngine->AddOnScreenDebugMessage(LastMsgIndex++,
MsgTime, FColor::White,
1147 FString::Printf(TEXT(
"Num dormant actors (%d)"),
DormantActors.Num()));
1148 GEngine->AddOnScreenDebugMessage(LastMsgIndex++,
MsgTime, FColor::White,
1155 float ToKm = 1000.0f * 100.0f;
1156 FVector TileActorLocation = Actor->GetActorLocation();
1159 Output += FString::Printf(TEXT(
"Local Loc: %s meters\n"), *(TileActorLocation / ToKm).ToString());
1160 Output += FString::Printf(TEXT(
"Client Loc: %s km\n"), *(ClientActorLocation / ToKm).ToString());
1161 Output +=
"---------------";
float tick_execution_time
static bool IsValid(const ACarlaWheeledVehicle *Vehicle)
Base class for CARLA wheeled vehicles.
void ConvertDormantToActiveActors()
void RegisterInitialObjects()
FCarlaMapTile & LoadCarlaMapTile(FString TileMapPath, TileID TileId)
virtual void BeginPlay() override
FString TileIDToString(TileID TileID)
void UpdateCurrentTilesLoaded(const TSet< TileID > &InTilesToBeVisible, const TSet< TileID > &InTilesToHidde)
TSet< FCarlaActor::IdType > DormantToActiveActors
FTransform GlobalToLocalTransform(const FTransform &InTransform) const
void AdjustSignsHeightToGround()
float RebaseOriginDistanceSquared
float ActorStreamingDistanceSquared
ACarlaWheeledVehicle * GetHeroVehicle()
void PreWorldOriginOffset(UWorld *InWorld, FIntVector InSrcOrigin, FIntVector InDstOrigin)
void GetTilesToConsider(const AActor *ActorToConsider, TSet< TileID > &OutTilesToConsider)
void ConvertActiveToDormantActors()
bool ShouldTilesBlockOnLoad
float GetLayerStreamingDistance() const
void ConsiderSpectatorAsEgo(bool _SpectatorAsEgo)
void CheckDormantActors()
void SetActorStreamingDistance(float Distance)
TSet< FCarlaActor::IdType > ActiveToDormantActors
FIntVector GetNumTilesInXY() const
void DumpTilesTable() const
FIntVector CurrentOriginInt
void OnActorSpawned(const FCarlaActor &CarlaActor)
FString GenerateTileName(TileID TileID)
FIntVector GetTileVectorID(FVector TileLocation) const
FVector GlobalToLocalLocation(const FVector &InLocation) const
void OnActorDestroyed(AActor *DestroyedActor)
TSet< AActor * > ActorsToRemove
const int32 ClientLocMsgIndex
FTransform LocalToGlobalTransform(const FTransform &InTransform) const
TSet< uint64 > CurrentTilesLoaded
TileID GetTileID(FVector TileLocation) const
From a given location it retrieves the TileID that covers that area.
FCarlaMapTile * GetCarlaMapTile(FVector Location)
TArray< FCarlaActor::IdType > ActiveActors
bool IsTileLoaded(TileID TileId) const
void GetTilesThatNeedToChangeState(const TSet< TileID > &InTilesToConsider, TSet< TileID > &OutTilesToBeVisible, TSet< TileID > &OutTilesToHidde)
FCarlaMapTile * GetCarlaMapTilePointer(FIntVector TileVectorID)
float ActorStreamingDistance
void CheckIfRebaseIsNeeded()
void OnLevelRemovedFromWorld(ULevel *InLevel, UWorld *InWorld)
FDVector GetTileLocationD(TileID TileID) const
void SetTile0Offset(const FVector &Offset)
float RebaseOriginDistance
void Tick(float DeltaTime) override
void RegisterTilesInWorldComposition()
void SetLayerStreamingDistance(float Distance)
const int32 MaxClientLocMsgIndex
void RemovePendingActorsToRemove()
float LayerStreamingDistanceSquared
FVector GetTileLocation(TileID TileID) const
void PostWorldOriginOffset(UWorld *InWorld, FIntVector InSrcOrigin, FIntVector InDstOrigin)
float GetActorStreamingDistance() const
TSet< FCarlaActor::IdType > DormantsToRemove
TArray< AActor * > ActorsToConsider
bool IsLevelOfTileLoaded(FIntVector InTileID) const
void SetTileSize(float Size)
void ClearWorldAndTiles()
void UpdateTileState(const TSet< TileID > &InTilesToUpdate, bool InShouldBlockOnLoad, bool InShouldBeLoaded, bool InShouldBeVisible)
void GenerateMap(FString InAssetsPath)
TArray< FCarlaActor::IdType > DormantActors
TSet< FCarlaActor::IdType > ActivesToRemove
float LayerStreamingDistance
FVector LocalToGlobalLocation(const FVector &InLocation) const
void OnLevelAddedToWorld(ULevel *InLevel, UWorld *InWorld)
const int32 TilesDistMsgIndex
void AddActorToUnloadedList(const FCarlaActor &CarlaActor, const FTransform &Transform)
TMap< uint64, FCarlaMapTile > MapTiles
static void TagActor(const AActor &Actor, bool bTagForSemanticSegmentation)
Set the tag of an actor.
static void TagActorsInLevel(UWorld &World, bool bTagForSemanticSegmentation)
Set the tag of every actor in level.
Class In charge of creating and assigning traffic light groups, controllers and components.
A registry of all the Carla actors.
A view over an actor and its properties.
ActorType GetActorType() const
FActorData * GetActorData()
const FActorInfo * GetActorInfo() const
IdType GetActorId() const
void PutActorToSleep(carla::rpc::ActorId ActorId)
void SetCurrentMapOrigin(const FIntVector &NewOrigin)
FCarlaActor * FindCarlaActor(FCarlaActor::IdType ActorId)
Find a Carla actor by id.
const FActorRegistry & GetActorRegistry() const
void WakeActorUp(carla::rpc::ActorId ActorId)
static UCarlaEpisode * GetCurrentEpisode(const UObject *WorldContextObject)
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.
A view over an actor and its properties.
FActorDescription Description
ULevelStreamingDynamic * StreamingLevel
FVector ToFVector() const