diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Online/CustomFileDownloader.cpp b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Online/CustomFileDownloader.cpp index c4c61aebd..4ad546047 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Online/CustomFileDownloader.cpp +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Online/CustomFileDownloader.cpp @@ -9,7 +9,7 @@ #include -void UCustomFileDownloader::ConvertOSMInOpenDrive(FString FilePath) +void UCustomFileDownloader::ConvertOSMInOpenDrive(FString FilePath, float Lat_0, float Lon_0) { IPlatformFile &FileManager = FPlatformFileManager::Get().GetPlatformFile(); @@ -34,8 +34,10 @@ void UCustomFileDownloader::ConvertOSMInOpenDrive(FString FilePath) } std::string OsmFile = std::string(TCHAR_TO_UTF8(*FileContent)); - osm2odr::OSM2ODRSettings settings; - std::string OpenDriveFile = osm2odr::ConvertOSMToOpenDRIVE(OsmFile, settings); + osm2odr::OSM2ODRSettings Settings; + Settings.proj_string += " +lat_0=" + std::to_string(Lat_0) + " +lon_0=" + std::to_string(Lon_0); + Settings.center_map = false; + std::string OpenDriveFile = osm2odr::ConvertOSMToOpenDRIVE(OsmFile, Settings); FilePath.RemoveFromEnd(".osm", ESearchCase::Type::IgnoreCase); FilePath += ".xodr"; diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Online/CustomFileDownloader.h b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Online/CustomFileDownloader.h index 9df10bd41..a2b4780f5 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Online/CustomFileDownloader.h +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Online/CustomFileDownloader.h @@ -19,7 +19,7 @@ public: UFUNCTION(BlueprintCallable) void StartDownload(); UFUNCTION(BlueprintCallable) - void ConvertOSMInOpenDrive(FString FilePath); + void ConvertOSMInOpenDrive(FString FilePath, float Lat_0 = 0, float Lon_0 = 0); FString ResultFileName; diff --git a/Unreal/CarlaUE4/Plugins/CarlaTools/Content/OnroadMapGenerator/UW_HoudiniBuildingImporter.uasset b/Unreal/CarlaUE4/Plugins/CarlaTools/Content/OnroadMapGenerator/UW_HoudiniBuildingImporter.uasset index 7de1494f7..556c48e3f 100644 Binary files a/Unreal/CarlaUE4/Plugins/CarlaTools/Content/OnroadMapGenerator/UW_HoudiniBuildingImporter.uasset and b/Unreal/CarlaUE4/Plugins/CarlaTools/Content/OnroadMapGenerator/UW_HoudiniBuildingImporter.uasset differ diff --git a/Unreal/CarlaUE4/Plugins/CarlaTools/Content/OnroadMapGenerator/UW_OnRoadMainWidget.uasset b/Unreal/CarlaUE4/Plugins/CarlaTools/Content/OnroadMapGenerator/UW_OnRoadMainWidget.uasset index ff22f28ed..c411a694d 100644 Binary files a/Unreal/CarlaUE4/Plugins/CarlaTools/Content/OnroadMapGenerator/UW_OnRoadMainWidget.uasset and b/Unreal/CarlaUE4/Plugins/CarlaTools/Content/OnroadMapGenerator/UW_OnRoadMainWidget.uasset differ diff --git a/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Private/HoudiniImportNodeWrapper.cpp b/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Private/HoudiniImportNodeWrapper.cpp index f438467df..015ffe56d 100644 --- a/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Private/HoudiniImportNodeWrapper.cpp +++ b/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Private/HoudiniImportNodeWrapper.cpp @@ -21,7 +21,8 @@ UHoudiniImportNodeWrapper* UHoudiniImportNodeWrapper::ImportBuildings( UObject* InWorldContextObject, const FString& MapName, const FString& OSMFilePath, float Latitude, float Longitude, - int ClusterSize, int CurrentCluster) + int ClusterSize, int CurrentCluster, + bool bUseCOM) { UE_LOG(LogCarlaTools, Log, TEXT("Start building import")); UHoudiniAsset* InHoudiniAsset = Cast(InHoudiniObject); @@ -39,13 +40,15 @@ UHoudiniImportNodeWrapper* UHoudiniImportNodeWrapper::ImportBuildings( {"displayedCluster", FHoudiniParameterTuple(CurrentCluster)}, {"startCooking", FHoudiniParameterTuple(true)}, {"lat", FHoudiniParameterTuple(Latitude)}, - {"lon", FHoudiniParameterTuple(Longitude)}}; + {"lon", FHoudiniParameterTuple(Longitude)}, + {"centOfMass", FHoudiniParameterTuple(bUseCOM)}}; WrapperNode->HDANode = UHoudiniPublicAPIProcessHDANode::ProcessHDA( InHoudiniAsset, InInstantiateAt, InParameters, {}, {}, InWorldContextObject, nullptr, - true, true); + true, true, "", EHoudiniEngineBakeOption::ToActor, + true); WrapperNode->HDANode->Completed.AddDynamic(WrapperNode, &UHoudiniImportNodeWrapper::HandleCompleted); WrapperNode->HDANode->Failed.AddDynamic(WrapperNode, &UHoudiniImportNodeWrapper::HandleFailed); UE_LOG(LogCarlaTools, Log, TEXT("HDA node created")); diff --git a/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Private/HoudiniImporterWidget.cpp b/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Private/HoudiniImporterWidget.cpp index 4597f8965..8e5e7a6bd 100644 --- a/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Private/HoudiniImporterWidget.cpp +++ b/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Private/HoudiniImporterWidget.cpp @@ -10,6 +10,7 @@ #include "Kismet/GameplayStatics.h" #include "Kismet/KismetSystemLibrary.h" #include "FileHelpers.h" +#include "Components/PrimitiveComponent.h" void UHoudiniImporterWidget::CreateSubLevels(ALargeMapManager* LargeMapManager) { @@ -62,6 +63,11 @@ void UHoudiniImporterWidget::MoveActorsToSubLevel(TArray Actors, ALarge { FCarlaMapTile* Tile = Element.Key; TArray ActorList = Element.Value; + if(!ActorList.Num()) + { + continue; + } + UWorld* World = ActorList[0]->GetWorld(); ULevelStreamingDynamic* StreamingLevel = Tile->StreamingLevel; UE_LOG(LogCarlaTools, Log, TEXT("Got Tile %s in location %s"), *StreamingLevel->PackageNameToLoad.ToString(), *Tile->Location.ToString()); @@ -70,8 +76,8 @@ void UHoudiniImporterWidget::MoveActorsToSubLevel(TArray Actors, ALarge StreamingLevel->SetShouldBeLoaded(true); ULevelStreaming* Level = UEditorLevelUtils::AddLevelToWorld( - GetWorld(), *Tile->Name, ULevelStreamingDynamic::StaticClass(), FTransform()); - + World, *Tile->Name, ULevelStreamingDynamic::StaticClass(), FTransform()); + int MovedActors = UEditorLevelUtils::MoveActorsToLevel(ActorList, Level, false, false); // StreamingLevel->SetShouldBeLoaded(false); UE_LOG(LogCarlaTools, Log, TEXT("Moved %d actors"), MovedActors); @@ -105,6 +111,28 @@ void UHoudiniImporterWidget::UpdateInstancedMeshCoordinates( Component->BatchUpdateInstancesTransforms(0, NewTransforms, true, true, true); } +void UHoudiniImporterWidget::UseCOMasActorLocation(TArray Actors) +{ + for (AActor* Actor : Actors) + { + UPrimitiveComponent* Primitive = Cast( + Actor->GetComponentByClass(UPrimitiveComponent::StaticClass())); + if(Primitive) + { + FBodyInstance* BodyInstance = Primitive->GetBodyInstance(); + FVector CenterOfMass = BodyInstance->COMNudge; + Actor->SetActorLocation(CenterOfMass); + UE_LOG(LogCarlaTools, Log, TEXT("Updating actor %s to %s"), + *Actor->GetName(), *CenterOfMass.ToString()); + } + else + { + UE_LOG(LogCarlaTools, Log, TEXT("Not updating actor %s"), + *Actor->GetName()); + } + } +} + bool UHoudiniImporterWidget::GetNumberOfClusters( TArray ActorList, int& OutNumClusters) { diff --git a/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Private/OpenDriveToMap.cpp b/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Private/OpenDriveToMap.cpp index 9c828bc1f..b485caf89 100644 --- a/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Private/OpenDriveToMap.cpp +++ b/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Private/OpenDriveToMap.cpp @@ -110,9 +110,8 @@ FString LaneTypeToFString(carla::road::Lane::LaneType LaneType) void UOpenDriveToMap::ConvertOSMInOpenDrive() { - FilePath = FPaths::ProjectContentDir() + "CustomMaps/" + MapName + "/OpenDrive/" + MapName + ".osm"; - FileDownloader->ConvertOSMInOpenDrive( FilePath ); + FileDownloader->ConvertOSMInOpenDrive( FilePath , OriginGeoCoordinates.X, OriginGeoCoordinates.Y); FilePath.RemoveFromEnd(".osm", ESearchCase::Type::IgnoreCase); FilePath += ".xodr"; @@ -266,10 +265,10 @@ void UOpenDriveToMap::GenerateRoadMesh( const boost::optional& TArray(), // Tangents true); // Create collision TempActor->SetActorLocation(MeshCentroid * 100); - ActorMeshList.Add(TempActor); + // ActorMeshList.Add(TempActor); RoadType.Add(LaneTypeToFString(PairMap.first)); - RoadMesh.Add(TempPMC); + // RoadMesh.Add(TempPMC); index++; } } diff --git a/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Public/HoudiniImportNodeWrapper.h b/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Public/HoudiniImportNodeWrapper.h index f71d60dae..02b6e74e3 100644 --- a/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Public/HoudiniImportNodeWrapper.h +++ b/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Public/HoudiniImportNodeWrapper.h @@ -32,7 +32,8 @@ public: UObject* InWorldContextObject, const FString& MapName, const FString& OSMFilePath, float Latitude, float Longitude, - int ClusterSize, int CurrentCluster); + int ClusterSize, int CurrentCluster, + bool bUseCOM); // Fires on task completed UPROPERTY(BlueprintAssignable, Category="Houdini|Public API") diff --git a/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Public/HoudiniImporterWidget.h b/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Public/HoudiniImporterWidget.h index ab2ac6e22..f1a74da88 100644 --- a/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Public/HoudiniImporterWidget.h +++ b/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Public/HoudiniImporterWidget.h @@ -20,19 +20,22 @@ class CARLATOOLS_API UHoudiniImporterWidget : public UEditorUtilityWidget GENERATED_BODY() UFUNCTION(BlueprintCallable, Category="HoudiniImporterWidget") - void CreateSubLevels(ALargeMapManager* LargeMapManager); + static void CreateSubLevels(ALargeMapManager* LargeMapManager); UFUNCTION(BlueprintCallable, Category="HoudiniImporterWidget") - void MoveActorsToSubLevel(TArray Actors, ALargeMapManager* LargeMapManager); + static void MoveActorsToSubLevel(TArray Actors, ALargeMapManager* LargeMapManager); - void UpdateGenericActorCoordinates(AActor* Actor, FVector TileOrigin); + static void UpdateGenericActorCoordinates(AActor* Actor, FVector TileOrigin); - void UpdateInstancedMeshCoordinates( + static void UpdateInstancedMeshCoordinates( UHierarchicalInstancedStaticMeshComponent* Component, FVector TileOrigin); - + + UFUNCTION(BlueprintCallable, Category="HoudiniImporterWidget") + static void UseCOMasActorLocation(TArray Actors); + // Gets the total number of cluster from the actor name following the following scheme // b{builsing}c{cluster}of{clustersize} UFUNCTION(BlueprintCallable, Category="HoudiniImporterWidget") - bool GetNumberOfClusters(TArray ActorList, int& OutNumClusters); + static bool GetNumberOfClusters(TArray ActorList, int& OutNumClusters); };