7 #include "Engine/WorldComposition.h" 14 #include "FileHelper.h" 17 #define LARGEMAP_LOGS 1 20 #define LM_LOG(Level, Msg, ...) UE_LOG(LogCarla, Level, TEXT(Msg), ##__VA_ARGS__) 28 PrimaryActorTick.bCanEverTick =
true;
36 FCoreDelegates::PreWorldOriginOffset.RemoveAll(
this);
37 FCoreDelegates::PostWorldOriginOffset.RemoveAll(
this);
39 FWorldDelegates::LevelRemovedFromWorld.RemoveAll(
this);
40 FWorldDelegates::LevelAddedToWorld.RemoveAll(
this);
50 UWorld* World = GetWorld();
60 UWorldComposition* WorldComposition = World->WorldComposition;
61 WorldComposition->bRebaseOriginIn3DSpace =
true;
71 LM_LOG(Error,
"PreWorldOriginOffset Src: %s -> Dst: %s", *InSrcOrigin.ToString(), *InDstOrigin.ToString());
80 UWorld* World = GetWorld();
85 GEngine->AddOnScreenDebugMessage(66,
MsgTime, FColor::Yellow,
86 FString::Printf(TEXT(
"Src: %s -> Dst: %s"), *InSrcOrigin.ToString(), *InDstOrigin.ToString()));
87 LM_LOG(Error,
"PostWorldOriginOffset Src: %s -> Dst: %s", *InSrcOrigin.ToString(), *InDstOrigin.ToString());
90 const TArray<ULevelStreaming*>& StreamingLevels = World->GetStreamingLevels();
91 FColor LevelColor = FColor::White;
92 float MinDistance = 10000000.0f;
93 for (
const auto& TilePair :
MapTiles)
97 FVector LevelLocation = Tile.
Location;
98 float Distance = FVector::Dist(LevelLocation, FVector(InDstOrigin));
99 if (Distance < MinDistance)
101 MinDistance = Distance;
105 #endif // WITH_EDITOR 110 LM_LOG(Warning,
"OnLevelAddedToWorld");
117 LM_LOG(Warning,
"OnLevelRemovedFromWorld");
126 UWorld* World = GetWorld();
129 for (
const auto& CarlaActorPair : ActorRegistry)
131 if (CarlaActorPair.Value->GetActorInfo()->Description.Id ==
"spectator")
143 UWorld* World = GetWorld();
146 bool IsHeroVehicle =
false;
158 if(Attribute && Attribute->
Value.Contains(
"hero"))
160 LM_LOG(Error,
"HERO VEHICLE DETECTED");
170 World->FlushLevelStreaming();
172 IsHeroVehicle =
true;
185 LM_LOG(Error,
"... not hero vehicle ...");
191 LM_LOG(Error,
"ACTIVE VEHICLE DETECTED");
199 LM_LOG(Error,
"DORMANT VEHICLE DETECTED");
207 LM_LOG(Warning,
"Actor Spawned at %s", *GlobalPosition.ToString());
214 LM_LOG(Warning,
"ALargeMapManager::OnActorDestroyed %s", *DestroyedActor->GetName());
216 UWorld* World = GetWorld();
264 InTransform.GetRotation(),
266 InTransform.GetScale3D());
277 InTransform.GetRotation(),
279 InTransform.GetScale3D());
291 Super::Tick(DeltaTime);
314 #endif // WITH_EDITOR 325 LM_LOG(Warning,
"Generating Map %s ...", *InAssetsPath);
331 TArray<FAssetData> AssetsData;
332 UObjectLibrary* ObjectLibrary = UObjectLibrary::CreateLibrary(UWorld::StaticClass(),
true,
true);
333 ObjectLibrary->LoadAssetDataFromPath(InAssetsPath);
334 ObjectLibrary->GetAssetDataList(AssetsData);
337 UWorld* World = GetWorld();
339 for (
const FAssetData& AssetData : AssetsData)
345 FString TileName = AssetData.AssetName.ToString();
346 if (!TileName.Contains(
"_Tile_"))
350 FString TileName_X =
"";
351 FString TileName_Y =
"";
352 size_t i = TileName.Len()-1;
354 TCHAR character = TileName[i];
355 if (character ==
'_') {
358 TileName_Y = FString::Chr(character) + TileName_Y;
362 TCHAR character = TileName[i];
363 if (character ==
'_') {
366 TileName_X = FString::Chr(character) + TileName_X;
368 FIntVector TileVectorID = FIntVector(FCString::Atoi(*TileName_X), FCString::Atoi(*TileName_Y), 0);
373 LoadCarlaMapTile(InAssetsPath +
"/" + AssetData.AssetName.ToString(), TileId);
375 ObjectLibrary->ConditionalBeginDestroy();
376 GEngine->ForceGarbageCollection(
true);
381 LM_LOG(Warning,
"GenerateMap num Tiles generated %d",
MapTiles.Num());
383 #endif // WITH_EDITOR 389 LM_LOG(Warning,
"Generating Large Map");
392 for (TPair<FString, FIntVector>& PathId : MapPathsIds)
394 FIntVector& TileVectorID = PathId.Value;
395 FString&
Path = PathId.Key;
401 LM_LOG(Warning,
"GenerateMap num Tiles generated %d",
MapTiles.Num());
402 #endif // WITH_EDITOR 412 UWorld* World = GetWorld();
413 UWorldComposition* WorldComposition = World->WorldComposition;
414 World->ClearStreamingLevels();
415 WorldComposition->TilesStreaming.Empty();
416 WorldComposition->GetTilesList().Empty();
420 ULevelStreamingDynamic* StreamingLevel = It.Value.StreamingLevel;
421 World->AddStreamingLevel(StreamingLevel);
422 WorldComposition->TilesStreaming.Add(StreamingLevel);
441 MinX = (TileID.X < MinX) ? TileID.X : MinX;
442 MaxX = (TileID.X > MaxX) ? TileID.X : MaxX;
444 MinY = (TileID.Y < MinY) ? TileID.Y : MinY;
445 MaxY = (TileID.Y > MaxY) ? TileID.Y : MaxY;
447 return { MaxX - MinX + 1, MaxY - MinY + 1, 0 };
459 LM_LOG(Warning,
"IsLevelOfTileLoaded Tile %s does not exist", *InTileID.ToString());
464 const ULevelStreamingDynamic* StreamingLevel = Tile->
StreamingLevel;
466 return (StreamingLevel && StreamingLevel->GetLoadedLevel());
471 FIntVector VectorId = FIntVector(
481 FIntVector VectorId = (
492 (int32)(TileID >> 32),
493 (int32)(TileID & (int32)(~0)),
506 TileVectorID.Y *= -1;
518 TileVectorID.
Y *= -1;
524 int64 X = ((int64)(TileVectorID.X) << 32);
525 int64 Y = (int64)(TileVectorID.Y) & 0x00000000FFFFFFFF;
547 ULevel* Level = StreamingLevel->GetLoadedLevel();
548 if (Level == InLevel)
572 NewTile.
Name = TileMapPath;
575 FVector TileLocation = NewTile.
Location;
576 FString TileName = NewTile.
Name;
577 UWorld* World = GetWorld();
578 UWorldComposition* WorldComposition = World->WorldComposition;
580 FString FullName = TileMapPath;
581 FString PackageFileName = FullName;
582 FString LongLevelPackageName = FPackageName::FilenameToLongPackageName(PackageFileName);
583 FString UniqueLevelPackageName = LongLevelPackageName;
585 ULevelStreamingDynamic* StreamingLevel = NewObject<ULevelStreamingDynamic>(World, *TileName);
586 check(StreamingLevel);
588 StreamingLevel->SetWorldAssetByPackageName(*UniqueLevelPackageName);
591 if (World->IsPlayInEditor())
593 FWorldContext WorldContext = GEngine->GetWorldContextFromWorldChecked(World);
594 StreamingLevel->RenameForPIE(WorldContext.PIEInstance);
596 StreamingLevel->SetShouldBeVisibleInEditor(
true);
597 StreamingLevel->LevelColor = FColor::MakeRandomColor();
598 #endif // WITH_EDITOR 600 StreamingLevel->SetShouldBeLoaded(
false);
601 StreamingLevel->SetShouldBeVisible(
false);
603 StreamingLevel->bInitiallyLoaded =
false;
604 StreamingLevel->bInitiallyVisible =
false;
605 StreamingLevel->LevelTransform = FTransform(TileLocation);
606 StreamingLevel->PackageNameToLoad = *FullName;
608 if (!FPackageName::DoesPackageExist(FullName, NULL, &PackageFileName))
610 LM_LOG(Error,
"Level does not exist in package with FullName variable -> %s", *FullName);
613 if (!FPackageName::DoesPackageExist(LongLevelPackageName, NULL, &PackageFileName))
615 LM_LOG(Error,
"Level does not exist in package with LongLevelPackageName variable -> %s", *LongLevelPackageName);
619 StreamingLevel->PackageNameToLoad = *LongLevelPackageName;
624 return MapTiles.Add(TileId, NewTile);
630 TSet<TileID> TilesToConsider;
646 TSet<TileID> TilesToBeVisible;
647 TSet<TileID> TilesToHidde;
670 ActorsToRemove.Reset();
677 ActivesToRemove.Reset();
683 DormantsToRemove.Reset();
689 UWorld* World = GetWorld();
698 FVector RelativeLocation = Actor->GetActorLocation();
711 FVector HeroLocation = HeroActor->GetActorLocation();
713 float DistanceSquared = (RelativeLocation - HeroLocation).SizeSquared();
725 LM_LOG(Warning,
"CheckActiveActors Actor does not exist -> Remove actor");
734 UWorld* World = GetWorld();
744 LM_LOG(Warning,
"Converting Active To Dormant... %d", Id);
750 ActiveToDormantActors.Reset();
756 UWorld* World = GetWorld();
767 LM_LOG(Error,
"CheckDormantActors Carla Actor %d not found", Id);
773 LM_LOG(Error,
"CheckDormantActors IDs doesn't match!! Wanted = %d Received = %d", Id, CarlaActor->
GetActorId());
779 LM_LOG(Error,
"CheckDormantActors Carla Actor %d is not dormant", Id);
788 FVector HeroLocation =
Actor->GetActorLocation();
793 float DistanceSquared = (RelativeLocation - HeroLocation).SizeSquared();
808 UWorld* World = GetWorld();
813 LM_LOG(Warning,
"Converting %d Dormant To Active", Id);
820 LM_LOG(Warning,
"Spawning dormant at %s\n\tOrigin: %s\n\tRel. location: %s", \
823 *((View->
GetActor()->GetActorLocation()).ToString()) \
829 LM_LOG(Warning,
"Actor %d could not be woken up, keeping sleep state", Id);
833 DormantToActiveActors.Reset();
841 UWorld* World = GetWorld();
842 UWorldComposition* WorldComposition = World->WorldComposition;
847 FVector ActorLocation = ActorToConsider->GetActorLocation();
848 FIntVector ILocation = FIntVector(ActorLocation.X, ActorLocation.Y, ActorLocation.Z);
856 World->SetNewWorldOrigin(FIntVector(NewOrigin));
863 TSet<TileID>& OutTilesToConsider)
866 check(ActorToConsider);
878 for (
int Y = UpperTileId.Y; Y <= LowerTileId.Y; Y++)
880 for (
int X = LowerTileId.X; X <= UpperTileId.X; X++)
884 FIntVector TileToCheck = FIntVector(X, Y, 0);
894 OutTilesToConsider.Add(TileID);
900 const TSet<TileID>& InTilesToConsider,
901 TSet<TileID>& OutTilesToBeVisible,
902 TSet<TileID>& OutTilesToHidde)
910 const TSet<TileID>& InTilesToUpdate,
911 bool InShouldBlockOnLoad,
912 bool InShouldBeLoaded,
913 bool InShouldBeVisible)
916 UWorld* World = GetWorld();
917 UWorldComposition* WorldComposition = World->WorldComposition;
924 ULevelStreamingDynamic* StreamingLevel = CarlaTile->
StreamingLevel;
925 StreamingLevel->bShouldBlockOnLoad = InShouldBlockOnLoad;
926 StreamingLevel->SetShouldBeLoaded(InShouldBeLoaded);
927 StreamingLevel->SetShouldBeVisible(InShouldBeVisible);
932 const TSet<TileID>& InTilesToBeVisible,
933 const TSet<TileID>& InTilesToHidde)
949 int32 X = (int32)(TileID >> 32);
950 int32 Y = (int32)(TileID);
951 return FString::Printf(TEXT(
"Tile_%d_%d"), X, Y);
956 int32 X = (int32)(TileID >> 32);
957 int32 Y = (int32)(TileID);
958 return FString::Printf(TEXT(
"%d_%d"), X, Y);
963 FString FileContent =
"";
964 FileContent += FString::Printf(TEXT(
"LargeMapManager state\n"));
966 FileContent += FString::Printf(TEXT(
"Tile:\n"));
967 FileContent += FString::Printf(TEXT(
"ID\tName\tLocation\n"));
971 FileContent += FString::Printf(TEXT(
" %ld\t%s\t%s\n"), It.Key, *Tile.
Name, *Tile.
Location.ToString());
973 FileContent += FString::Printf(TEXT(
"\nNum generated tiles: %d\n"), MapTiles.Num());
976 TArray<FString> StringArray;
977 AssetsPath.ParseIntoArray(StringArray, TEXT(
"/"),
false);
979 FString FilePath = FPaths::ProjectSavedDir() + StringArray[StringArray.Num() - 1] +
".txt";
980 FFileHelper::SaveStringToFile(
983 FFileHelper::EEncodingOptions::AutoDetect,
985 EFileWrite::FILEWRITE_Silent);
990 UWorld* World = GetWorld();
996 const TArray<FLevelCollection>& WorldLevelCollections = World->GetLevelCollections();
997 const FLevelCollection* LevelCollection = World->GetActiveLevelCollection();
998 const TArray<ULevel*>& Levels = World->GetLevels();
999 const TArray<ULevelStreaming*>& StreamingLevels = World->GetStreamingLevels();
1000 ULevel* CurrentLevel = World->GetCurrentLevel();
1002 FString Output =
"";
1003 Output += FString::Printf(TEXT(
"Num levels in world composition: %d\n"), World->WorldComposition->TilesStreaming.Num());
1004 Output += FString::Printf(TEXT(
"Num levels loaded: %d\n"), Levels.Num() );
1005 Output += FString::Printf(TEXT(
"Num tiles loaded: %d\n"),
CurrentTilesLoaded.Num() );
1006 Output += FString::Printf(TEXT(
"Tiles loaded: [ "));
1009 Output += FString::Printf(TEXT(
"%s, "), *
TileIDToString(TileId));
1011 Output += FString::Printf(TEXT(
"]\n"));
1012 GEngine->AddOnScreenDebugMessage(0,
MsgTime, FColor::Cyan, Output);
1015 GEngine->AddOnScreenDebugMessage(LastMsgIndex++,
MsgTime, FColor::White,
1016 FString::Printf(TEXT(
"\nActor Global Position: %s km"), *(
FDVector(CurrentActorPosition) / (1000.0 * 100.0)).ToString()) );
1018 GEngine->AddOnScreenDebugMessage(LastMsgIndex++,
MsgTime, FColor::White, TEXT(
"Closest tiles - Distance:"));
1020 for (
const auto& TilePair :
MapTiles)
1024 FVector LevelLocation = Tile.
Location;
1025 float Distance =
FDVector::Dist(LevelLocation, CurrentActorPosition);
1027 FColor MsgColor = FColor::Green;
1030 GEngine->AddOnScreenDebugMessage(LastMsgIndex++,
MsgTime, MsgColor,
1031 FString::Printf(TEXT(
"%s %.2f"), *Level->GetName(), Distance / (1000.0f * 100.0f)));
1036 GEngine->AddOnScreenDebugMessage(LastMsgIndex++,
MsgTime, FColor::White,
1038 GEngine->AddOnScreenDebugMessage(LastMsgIndex++,
MsgTime, FColor::White,
1039 FString::Printf(TEXT(
"Num active actors (%d)"),
ActiveActors.Num()) );
1040 GEngine->AddOnScreenDebugMessage(LastMsgIndex++,
MsgTime, FColor::White,
1041 FString::Printf(TEXT(
"Num dormant actors (%d)"),
DormantActors.Num()));
1042 GEngine->AddOnScreenDebugMessage(LastMsgIndex++,
MsgTime, FColor::White,
1049 float ToKm = 1000.0f * 100.0f;
1050 FVector TileActorLocation =
Actor->GetActorLocation();
1053 Output += FString::Printf(TEXT(
"Local Loc: %s meters\n"), *(TileActorLocation / ToKm).ToString());
1054 Output += FString::Printf(TEXT(
"Client Loc: %s km\n"), *(ClientActorLocation / ToKm).ToString());
1055 Output +=
"---------------";
FCarlaActor * FindCarlaActor(FCarlaActor::IdType ActorId)
Find a Carla actor by id.
TileID GetTileID(FVector TileLocation) const
From a given location it retrieves the TileID that covers that area.
TSet< uint64 > CurrentTilesLoaded
FString GenerateTileName(TileID TileID)
void UpdateCurrentTilesLoaded(const TSet< TileID > &InTilesToBeVisible, const TSet< TileID > &InTilesToHidde)
A registry of all the Carla actors.
const int32 MaxTilesDistMsgIndex
void GenerateMap(FString InAssetsPath)
TSet< FCarlaActor::IdType > DormantsToRemove
TSet< FCarlaActor::IdType > DormantToActiveActors
bool ShouldTilesBlockOnLoad
void ConvertActiveToDormantActors()
static double Dist(const FDVector &V1, const FDVector &V2)
FIntVector GetNumTilesInXY() const
float LayerStreamingDistance
FVector GlobalToLocalLocation(const FVector &InLocation) const
void ConvertDormantToActiveActors()
float LayerStreamingDistanceSquared
FCarlaMapTile & GetCarlaMapTile(FVector Location)
void WakeActorUp(carla::rpc::ActorId ActorId)
std::vector< cg::Location > Path
void RegisterTilesInWorldComposition()
TSet< FCarlaActor::IdType > ActiveToDormantActors
const int32 TilesDistMsgIndex
FCarlaMapTile & LoadCarlaMapTile(FString TileMapPath, TileID TileId)
FString TileIDToString(TileID TileID)
bool IsLevelOfTileLoaded(FIntVector InTileID) const
static bool IsValid(const ACarlaWheeledVehicle *Vehicle)
float ActorStreamingDistance
void PutActorToSleep(carla::rpc::ActorId ActorId)
void OnActorSpawned(const FCarlaActor &CarlaActor)
FIntVector CurrentOriginInt
static T Get(carla::rpc::Response< T > &response)
void UpdateTileState(const TSet< TileID > &InTilesToUpdate, bool InShouldBlockOnLoad, bool InShouldBeLoaded, bool InShouldBeVisible)
virtual void BeginPlay() override
float ActorStreamingDistanceSquared
FVector ToFVector() const
static void TagActorsInLevel(UWorld &World, bool bTagForSemanticSegmentation)
Set the tag of every actor in level.
const FActorRegistry & GetActorRegistry() const
TMap< FString, FActorAttribute > Variations
User selected variations of the actor.
FActorData * GetActorData()
carla::SharedPtr< cc::Actor > Actor
void ClearWorldAndTiles()
void GetTilesThatNeedToChangeState(const TSet< TileID > &InTilesToConsider, TSet< TileID > &OutTilesToBeVisible, TSet< TileID > &OutTilesToHidde)
float tick_execution_time
const int32 ClientLocMsgIndex
void SetActorStreamingDistance(float Distance)
void PreWorldOriginOffset(UWorld *InWorld, FIntVector InSrcOrigin, FIntVector InDstOrigin)
void SetTileSize(float Size)
void DumpTilesTable() const
void RegisterInitialObjects()
A description of a Carla Actor with all its variation.
FActorDescription Description
const FActorInfo * GetActorInfo() const
TMap< uint64, FCarlaMapTile > MapTiles
void CheckIfRebaseIsNeeded()
void SetLayerStreamingDistance(float Distance)
void SetCurrentMapOrigin(const FIntVector &NewOrigin)
void GetTilesToConsider(const AActor *ActorToConsider, TSet< TileID > &OutTilesToConsider)
FDVector GetTileLocationD(TileID TileID) const
FTransform LocalToGlobalTransform(const FTransform &InTransform) const
TArray< AActor * > ActorsToConsider
void AddActorToUnloadedList(const FCarlaActor &CarlaActor, const FTransform &Transform)
#define LM_LOG(Level, Msg,...)
float GetActorStreamingDistance() const
float GetLayerStreamingDistance() const
FTransform GlobalToLocalTransform(const FTransform &InTransform) const
void PostWorldOriginOffset(UWorld *InWorld, FIntVector InSrcOrigin, FIntVector InDstOrigin)
static UCarlaEpisode * GetCurrentEpisode(const UObject *WorldContextObject)
void OnLevelRemovedFromWorld(ULevel *InLevel, UWorld *InWorld)
A view over an actor and its properties.
TSet< FCarlaActor::IdType > ActivesToRemove
TSet< AActor * > ActorsToRemove
float RebaseOriginDistance
const int32 MaxClientLocMsgIndex
IdType GetActorId() const
ULevelStreamingDynamic * StreamingLevel
void RemovePendingActorsToRemove()
void SetTile0Offset(const FVector &Offset)
TArray< FCarlaActor::IdType > ActiveActors
void OnActorDestroyed(AActor *DestroyedActor)
An actor attribute, may be an intrinsic (non-modifiable) attribute of the actor or an user-defined ac...
void Tick(float DeltaTime) override
float RebaseOriginDistanceSquared
FVector GetTileLocation(TileID TileID) const
geom::Transform Transform
FVector LocalToGlobalLocation(const FVector &InLocation) const
bool IsTileLoaded(TileID TileId) const
void CheckDormantActors()
ActorType GetActorType() const
FIntVector GetTileVectorID(FVector TileLocation) const
A view over an actor and its properties.
TArray< FCarlaActor::IdType > DormantActors
void OnLevelAddedToWorld(ULevel *InLevel, UWorld *InWorld)