diff --git a/Unreal/CarlaUE4/Plugins/CarlaTools/Content/MapGenerator/Textures/UI_Icons/help.uasset b/Unreal/CarlaUE4/Plugins/CarlaTools/Content/MapGenerator/Textures/UI_Icons/help.uasset new file mode 100644 index 000000000..46ed3d775 Binary files /dev/null and b/Unreal/CarlaUE4/Plugins/CarlaTools/Content/MapGenerator/Textures/UI_Icons/help.uasset differ diff --git a/Unreal/CarlaUE4/Plugins/CarlaTools/Content/MapGenerator/UWB_CARLA.uasset b/Unreal/CarlaUE4/Plugins/CarlaTools/Content/MapGenerator/UWB_CARLA.uasset index 26aa98024..9cbbb4bcd 100644 Binary files a/Unreal/CarlaUE4/Plugins/CarlaTools/Content/MapGenerator/UWB_CARLA.uasset and b/Unreal/CarlaUE4/Plugins/CarlaTools/Content/MapGenerator/UWB_CARLA.uasset differ diff --git a/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Private/MapGeneratorWidget.cpp b/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Private/MapGeneratorWidget.cpp index d6a71b15f..25dace731 100644 --- a/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Private/MapGeneratorWidget.cpp +++ b/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Private/MapGeneratorWidget.cpp @@ -13,6 +13,7 @@ #include "EditorLevelLibrary.h" #include "FileHelpers.h" #include "Kismet/GameplayStatics.h" +#include "Kismet/KismetMathLibrary.h" #include "Landscape.h" #include "LandscapeProxy.h" #include "ProceduralFoliageComponent.h" @@ -101,6 +102,60 @@ FString UMapGeneratorWidget::SanitizeDirectory(FString InDirectory) return InDirectory; } +bool UMapGeneratorWidget::LoadMapInfoFromPath(FString InDirectory, int& OutMapSize, FString& OutFoundMapName) +{ + TArray DirectoryAssets; + bool bLoaded = LoadWorlds(DirectoryAssets, InDirectory, false); + + FString MainMapName; + FString MapNameInTiles; + + if(bLoaded && DirectoryAssets.Num() > 0) + { + for(FAssetData AssetData : DirectoryAssets) // Find name in tiles + { + const FString AssetName = AssetData.AssetName.ToString(); + FString Name, Coordinates; + if(AssetName.Split(TEXT("_Tile_"), &Name, &Coordinates)) + { + MapNameInTiles = Name; + break; + } + } + + if(MapNameInTiles.IsEmpty()) // No tiles found + { + return false; + } + + for(FAssetData AssetData : DirectoryAssets) + { + const FString AssetName = AssetData.AssetName.ToString(); + if(!AssetName.Contains("_Tile_") && AssetName == MapNameInTiles) // Find Main Map + { + MainMapName = AssetName; + break; + } + } + + if(MainMapName.IsEmpty()) // No main map found + { + return false; + } + + int NumberOfTiles = DirectoryAssets.Num() - 1; + OutFoundMapName = MainMapName; + OutMapSize = (int)UKismetMathLibrary::Sqrt((float)NumberOfTiles); + } + else + { + // No Map Found + return false; + } + + return true; +} + AActor* UMapGeneratorWidget::GenerateWater(TSubclassOf RiverClass) { UE_LOG(LogCarlaToolsMapGenerator, Log, TEXT("%s: Starting Generating Waterbodies"), @@ -254,15 +309,9 @@ bool UMapGeneratorWidget::LoadWorldByName(FAssetData& WorldAssetData, const FStr // Loading all and search for the matching name TArray AssetsData; - // FString CompleteName = BaseMapPath + "/" + MapName + "." + MapName; - // bool success = LoadWorlds(AssetsData, CompleteName); - bool success = LoadWorlds(AssetsData, BaseMapPath); + bool bSuccess = LoadWorlds(AssetsData, BaseMapPath); - // FString Num = FString::FromInt(AssetsData.Num()); - // UE_LOG(LogCarlaToolsMapGenerator, Warning, TEXT("%s: NOMMMM M M M M M World is load %s -> %s"), - // *CUR_CLASS_FUNC_LINE, *Num, *CompleteName); - - if(success && AssetsData.Num() > 0) + if(bSuccess && AssetsData.Num() > 0) { for(FAssetData AssetData : AssetsData) { @@ -282,10 +331,6 @@ bool UMapGeneratorWidget::LoadWorldByName(FAssetData& WorldAssetData, const FStr *CUR_CLASS_FUNC_LINE, *BaseMapPath); return false; } - - - // Searching a specific asset - } bool UMapGeneratorWidget::DUBUG_LandscapeApplyHeightmap(const FMapGeneratorMetaInfo& MetaInfo) @@ -397,7 +442,7 @@ bool UMapGeneratorWidget::DUBUG_LandscapeApplyHeightmap(const FMapGeneratorMetaI } -bool UMapGeneratorWidget::LoadWorlds(TArray& WorldAssetsData, const FString& BaseMapPath) +bool UMapGeneratorWidget::LoadWorlds(TArray& WorldAssetsData, const FString& BaseMapPath, bool bRecursive) { UE_LOG(LogCarlaToolsMapGenerator, Log, TEXT("%s: Loading Worlds from %s"), *CUR_CLASS_FUNC_LINE, *BaseMapPath); @@ -407,6 +452,7 @@ bool UMapGeneratorWidget::LoadWorlds(TArray& WorldAssetsData, const // Loading Map from folder using object library MapObjectLibrary = UObjectLibrary::CreateLibrary(UWorld::StaticClass(), false, GIsEditor); + MapObjectLibrary->bRecursivePaths = bRecursive; MapObjectLibrary->AddToRoot(); MapObjectLibrary->LoadAssetDataFromPath(*BaseMapPath); MapObjectLibrary->LoadAssetsFromAssetData(); @@ -416,7 +462,6 @@ bool UMapGeneratorWidget::LoadWorlds(TArray& WorldAssetsData, const { // Return whole list of world assets found in directory WorldAssetsData = AssetsData; - // MapObjectLibrary->ClearLoaded(); return true; } else @@ -443,8 +488,6 @@ bool UMapGeneratorWidget::SaveWorld( // Create Package UPackage *Package = WorldToBeSaved.GetPackage(); Package->SetFolderName(*WorldName); - // Package->SetFolderName(*PackagePath); - // Package->SetFolderName("MapGeneratorPackage"); Package->FullyLoad(); Package->MarkPackageDirty(); FAssetRegistryModule::AssetCreated(World); @@ -492,6 +535,8 @@ bool UMapGeneratorWidget::CreateMainLargeMap(const FMapGeneratorMetaInfo& MetaIn UWorld* World = CastChecked(StaticDuplicateObjectEx(Parameters)); + + const FString PackageFileName = FPackageName::LongPackageNameToFilename( PackageName, FPackageName::GetMapPackageExtension()); diff --git a/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Public/MapGeneratorWidget.h b/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Public/MapGeneratorWidget.h index 317d14d6b..9cb15f4e2 100644 --- a/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Public/MapGeneratorWidget.h +++ b/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Public/MapGeneratorWidget.h @@ -104,6 +104,9 @@ public: UFUNCTION(Category="Map Generator", BlueprintCallable) FString SanitizeDirectory(FString InDirectory); + UFUNCTION(Category="Map Generator", BlueprintCallable) + bool LoadMapInfoFromPath(FString InDirectory, int& OutMapSize, FString& OutFoundMapName); + UFUNCTION(Category="MapGenerator", BlueprintCallable) AActor* GenerateWater(TSubclassOf RiverClass); @@ -141,7 +144,7 @@ private: /// returns them in @a WorldAssetsData. /// The function returns true if success, otherwise false UFUNCTION() - bool LoadWorlds(TArray& WorldAssetsData, const FString& BaseMapPath); + bool LoadWorlds(TArray& WorldAssetsData, const FString& BaseMapPath, bool bRecursive = true); /// Saves a world contained in @a WorldToBeSaved, in the path defined in @a DestinationPath /// named as @a WorldName, as a package .umap