From 9d00b7c13efef2fa68a202ec5aecec87d6e8a3a0 Mon Sep 17 00:00:00 2001 From: "CVC\\jbelon" Date: Tue, 20 Mar 2018 17:00:23 +0100 Subject: [PATCH 01/22] Walker Spawner AI changes in movement --- .../Carla/Walker/WalkerAIController.cpp | 4 +- .../Source/Carla/Walker/WalkerAIController.h | 2 +- .../Source/Carla/Walker/WalkerSpawnerBase.cpp | 74 ++++++++++++++----- .../Source/Carla/Walker/WalkerSpawnerBase.h | 2 + 4 files changed, 60 insertions(+), 22 deletions(-) diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerAIController.cpp b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerAIController.cpp index 488b6bf90..9beb0be6a 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerAIController.cpp +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerAIController.cpp @@ -28,7 +28,7 @@ static constexpr float PREVISION_TIME_IN_SECONDS = 5.0f; static constexpr float WALKER_SIGHT_RADIUS = 500.0f; static constexpr float WALKER_SPEED_DAMPING = 4.0f; static constexpr float WALKER_PERIPHERAL_VISION_ANGLE_IN_DEGREES = 155.0f; -static constexpr float WALKER_MAX_TIME_PAUSED = 10.0f; +static constexpr float WALKER_MAX_TIME_PAUSED = 5.0f; static constexpr float VEHICLE_SAFETY_RADIUS = 600.0f; @@ -225,7 +225,7 @@ void AWalkerAIController::OnMoveCompleted( ChangeStatus(EWalkerStatus::MoveCompleted); } -void AWalkerAIController::SenseActors(const TArray Actors) +void AWalkerAIController::SenseActors(const TArray& Actors) { const auto *aPawn = GetPawn(); if ((Status == EWalkerStatus::Moving) && diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerAIController.h b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerAIController.h index cc218d1f7..9ff8f5fb2 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerAIController.h +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerAIController.h @@ -44,7 +44,7 @@ public: UFUNCTION(BlueprintCallable) - void SenseActors(TArray Actors); + void SenseActors(const TArray& Actors); EWalkerStatus GetWalkerStatus() const { diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerSpawnerBase.cpp b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerSpawnerBase.cpp index 585315052..705fcaa48 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerSpawnerBase.cpp +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerSpawnerBase.cpp @@ -110,45 +110,76 @@ void AWalkerSpawnerBase::Tick(float DeltaTime) TryToSpawnWalkerAt(GetRandomSpawnPoint()); } - if (WalkersBlackList.Num() > 0) { + if (WalkersBlackList.Num() > 0) + { // If still stuck in the black list, just kill it. - const int32 Index = (++CurrentIndexToCheck % WalkersBlackList.Num()); - auto Walker = WalkersBlackList[Index]; - const auto Status = GetWalkerStatus(Walker); - if ((Status == EWalkerStatus::MoveCompleted) || - (Status == EWalkerStatus::Invalid) || - (Status == EWalkerStatus::RunOver)) { - WalkersBlackList.RemoveAtSwap(Index); - if ((Walker != nullptr) && (Status != EWalkerStatus::RunOver)) { - Walker->Destroy(); - } + const int32 BlackListedIndex = (++CurrentIndexToCheck % WalkersBlackList.Num()); + ACharacter* BlackListedWalker = WalkersBlackList[BlackListedIndex]; + if(BlackListedWalker != nullptr && IsValid(BlackListedWalker)) + { + const auto Status = GetWalkerStatus(BlackListedWalker); + switch(Status) + { + case EWalkerStatus::MoveCompleted: + case EWalkerStatus::Invalid: + case EWalkerStatus::RunOver:{ + WalkersBlackList.RemoveAtSwap(BlackListedIndex); + if (Status != EWalkerStatus::RunOver) { + BlackListedWalker->Destroy(); + } + break; + } + case EWalkerStatus::Stuck: + if(!TrySetDestination(*BlackListedWalker)){ + SetRandomWalkerDestination(BlackListedWalker); + } + WalkersBlackList.RemoveAtSwap(BlackListedIndex); + break; + default: case EWalkerStatus::Unknown: case EWalkerStatus::Paused: break; + } + } + else + { + WalkersBlackList.RemoveAtSwap(BlackListedIndex); } } - if (Walkers.Num() > 0) { + if (Walkers.Num() > 0) + { // Check one walker, if fails black-list it or kill it. - const int32 Index = (++CurrentIndexToCheck % Walkers.Num()); - auto Walker = Walkers[Index]; + const int32 WalkerIndex = (++CurrentIndexToCheck % Walkers.Num()); + auto Walker = Walkers[WalkerIndex]; const auto Status = GetWalkerStatus(Walker); if ((Status == EWalkerStatus::MoveCompleted) || (Status == EWalkerStatus::Invalid) || (Status == EWalkerStatus::RunOver)) { // Kill it. - Walkers.RemoveAtSwap(Index); + Walkers.RemoveAtSwap(WalkerIndex); // If it was run over will self-destroy. if ((Walker != nullptr) && (Status != EWalkerStatus::RunOver)) { Walker->Destroy(); } - } else if (Status == EWalkerStatus::Stuck) { + } else if (Status == EWalkerStatus::Stuck) + { + SetRandomWalkerDestination(Walker); // Black-list it. - TrySetDestination(*Walker); - WalkersBlackList.Add(Walker); - Walkers.RemoveAtSwap(Index); + WalkersBlackList.Add(Walker); + Walkers.RemoveAtSwap(WalkerIndex); } } } +bool AWalkerSpawnerBase::SetRandomWalkerDestination(ACharacter *Walker) +{ + const auto &DestinationPoint = GetRandomSpawnPoint(); + auto Controller = GetController(Walker); + if(!Controller) return false; + Controller->MoveTo(DestinationPoint.GetActorLocation()); + + return true; +} + // ============================================================================= // -- Other member functions --------------------------------------------------- // ============================================================================= @@ -214,12 +245,17 @@ bool AWalkerSpawnerBase::TrySetDestination(ACharacter &Walker) // Try to retrieve controller. auto Controller = GetController(&Walker); if (Controller == nullptr) { + UE_LOG(LogCarla, Warning, TEXT("Could not get valid controller for walker: %s"), *Walker.GetName()); return false; } // Try find destination. FVector Destination; if (!TryGetValidDestination(Walker.GetActorLocation(), Destination)) { + UE_LOG(LogCarla, Warning, + TEXT("Could not get a new destiny: %s for walker: %s"), + *Destination.ToString(), *Walker.GetName() + ); return false; } diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerSpawnerBase.h b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerSpawnerBase.h index ba17fae52..6ecc2d840 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerSpawnerBase.h +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerSpawnerBase.h @@ -45,6 +45,7 @@ public: virtual void Tick(float DeltaTime) override; + /// @} // =========================================================================== /// @name Blueprintable functions @@ -87,6 +88,7 @@ private: bool TrySetDestination(ACharacter &Walker); + bool SetRandomWalkerDestination(ACharacter * Walker); /// @} private: From ea1a875ba86efa47cef6ccb4c718204b79d73edb Mon Sep 17 00:00:00 2001 From: "CVC\\jbelon" Date: Tue, 20 Mar 2018 17:16:38 +0100 Subject: [PATCH 02/22] Added configuration to build CARLA Server for Visual Studio 2017 --- Makefile | 5 +++++ Rebuild.bat | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/Makefile b/Makefile index 39d64e3d2..031dcdefa 100644 --- a/Makefile +++ b/Makefile @@ -35,6 +35,11 @@ vsproject: MY_CMAKE_FLAGS+=-DCMAKE_BUILD_TYPE=Release vsproject: MY_CMAKE_FLAGS+=-G "Visual Studio 14 2015 Win64" vsproject: call_cmake +vsproject15: BUILD_FOLDER=$(BASE_BUILD_FOLDER)/visualstudio +vsproject15: MY_CMAKE_FLAGS+=-DCMAKE_BUILD_TYPE=Release +vsproject15: MY_CMAKE_FLAGS+=-G "Visual Studio 15 2017 Win64" +vsproject15: call_cmake + build_linux: MY_CMAKE_FLAGS+=-G "Ninja" build_linux: call_cmake @cd $(BUILD_FOLDER) && ninja && ninja install diff --git a/Rebuild.bat b/Rebuild.bat index 69ebe811e..7a27ebee1 100644 --- a/Rebuild.bat +++ b/Rebuild.bat @@ -8,7 +8,11 @@ rem FOR %%G IN (Binaries,Intermediate,Plugins\Carla\Binaries,Plugins\Carla\Inter rem echo Making CarlaServer... rem call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" amd64 +rem Visual Studio 2017 Enterprise: +rem call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" rem START /wait cmd.exe /k "cd Plugins\Carla & make clean default & pause & exit" + + rem echo Launch editor... rem start CarlaUE4.uproject From eecac13f9bd941a1d84937b132abe22c540a46a4 Mon Sep 17 00:00:00 2001 From: "CVC\\jbelon" Date: Wed, 21 Mar 2018 11:00:42 +0100 Subject: [PATCH 03/22] Fix #246 . Now vehicle spawner will spawn the number of vehicles in the configuration, picking random spawn points even if there is less spawn points than vehicles (until fill all the spawn points). --- .../Carla/Vehicle/VehicleSpawnerBase.cpp | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Vehicle/VehicleSpawnerBase.cpp b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Vehicle/VehicleSpawnerBase.cpp index 0292fe784..774ce2eab 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Vehicle/VehicleSpawnerBase.cpp +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Vehicle/VehicleSpawnerBase.cpp @@ -58,21 +58,28 @@ void AVehicleSpawnerBase::BeginPlay() UE_LOG(LogCarla, Log, TEXT("Found %d positions for spawning vehicles"), SpawnPoints.Num()); if (SpawnPoints.Num() < NumberOfVehicles) { - bSpawnVehicles = false; UE_LOG(LogCarla, Error, TEXT("We don't have enough spawn points for vehicles!")); } + + if(NumberOfVehicles==0) bSpawnVehicles = false; - if (bSpawnVehicles) { - const int32 MaximumNumberOfAttempts = 4 * NumberOfVehicles; + if (bSpawnVehicles) + { + GetRandomEngine()->Shuffle(SpawnPoints); + const int32 MaximumNumberOfAttempts = SpawnPoints.Num(); int32 NumberOfAttempts = 0; - while ((NumberOfVehicles > Vehicles.Num()) && (NumberOfAttempts < MaximumNumberOfAttempts)) { - // Try to spawn one vehicle. - TryToSpawnRandomVehicle(); + + while ((NumberOfVehicles > Vehicles.Num()) && (NumberOfAttempts < MaximumNumberOfAttempts)) + { + SpawnVehicleAtSpawnPoint(*SpawnPoints[NumberOfAttempts]); ++NumberOfAttempts; } if (NumberOfVehicles > Vehicles.Num()) { UE_LOG(LogCarla, Error, TEXT("Requested %d vehicles, but we were only able to spawn %d"), NumberOfVehicles, Vehicles.Num()); + } else + { + UE_LOG(LogCarla, Log, TEXT("Spawned %d vehicles"), NumberOfAttempts); } } } From 192cfe6b507368f72b7d78859da55da9228cdebd Mon Sep 17 00:00:00 2001 From: "CVC\\jbelon" Date: Wed, 21 Mar 2018 11:03:20 +0100 Subject: [PATCH 04/22] Project updated to Unreal Engine version 4.19 --- Unreal/CarlaUE4/CarlaUE4.uproject | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Unreal/CarlaUE4/CarlaUE4.uproject b/Unreal/CarlaUE4/CarlaUE4.uproject index a9d5b583f..73d43e363 100644 --- a/Unreal/CarlaUE4/CarlaUE4.uproject +++ b/Unreal/CarlaUE4/CarlaUE4.uproject @@ -1,6 +1,6 @@ { "FileVersion": 3, - "EngineAssociation": "4.18", + "EngineAssociation": "4.19", "Category": "", "Description": "", "Modules": [ From 1d8ae9afd419a96a87c9402fa551bde447f0abcd Mon Sep 17 00:00:00 2001 From: "CVC\\jbelon" Date: Thu, 22 Mar 2018 10:15:06 +0100 Subject: [PATCH 05/22] Minor changes in Carla settings. --- .../Source/Carla/Sensor/SceneCaptureCamera.cpp | 4 ++++ .../Carla/Source/Carla/Settings/CarlaSettings.cpp | 15 ++------------- .../Carla/Source/Carla/Settings/CarlaSettings.h | 4 ++-- 3 files changed, 8 insertions(+), 15 deletions(-) diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/SceneCaptureCamera.cpp b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/SceneCaptureCamera.cpp index 30e7e57cf..f21f51a84 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/SceneCaptureCamera.cpp +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/SceneCaptureCamera.cpp @@ -17,6 +17,7 @@ #include "HighResScreenshot.h" #include "Materials/Material.h" #include "Paths.h" +#include "Kismet/KismetSystemLibrary.h" static constexpr auto DEPTH_MAT_PATH = @@ -125,6 +126,9 @@ void ASceneCaptureCamera::BeginPlay() CaptureComponent2D->UpdateContent(); CaptureComponent2D->Activate(); + //Make sure that there is enough time in the render queue + UKismetSystemLibrary::ExecuteConsoleCommand(GetWorld(), FString("g.TimeoutForBlockOnRenderFence 300000")); + Super::BeginPlay(); } diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Settings/CarlaSettings.cpp b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Settings/CarlaSettings.cpp index 24f80747c..9c2dc63df 100755 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Settings/CarlaSettings.cpp +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Settings/CarlaSettings.cpp @@ -122,10 +122,7 @@ static void LoadSettingsFromConfig( // QualitySettings. FString sQualityLevel; ConfigFile.GetString(S_CARLA_QUALITYSETTINGS, TEXT("QualityLevel"), sQualityLevel); - if(!Settings.SetQualitySettingsLevel(UQualitySettings::FromString(sQualityLevel))) - { - //error - } + Settings.SetQualitySettingsLevel(UQualitySettings::FromString(sQualityLevel)); // Sensors. FString Sensors; @@ -176,17 +173,9 @@ FString UQualitySettings::ToString(EQualitySettingsLevel QualitySettingsLevel) return ptr->GetNameStringByIndex(static_cast(QualitySettingsLevel)); } -bool UCarlaSettings::SetQualitySettingsLevel(EQualitySettingsLevel newQualityLevel) +void UCarlaSettings::SetQualitySettingsLevel(EQualitySettingsLevel newQualityLevel) { - if(newQualityLevel==EQualitySettingsLevel::None) - { - UE_LOG(LogCarla ,Warning, TEXT("Quality Settings Level not set!")); - return false; - } - QualitySettingsLevel = newQualityLevel; - - return true; } void UCarlaSettings::LoadSettings() diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Settings/CarlaSettings.h b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Settings/CarlaSettings.h index bd5d59aed..abec4c0d7 100755 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Settings/CarlaSettings.h +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Settings/CarlaSettings.h @@ -57,12 +57,12 @@ public: /** * Sets the new quality settings level and make changes in the game related to it. - * Returns the result of the operation. * @note This will not apply the quality settings. Use ApplyQualitySettings functions instead * @param newQualityLevel Store the new quality */ UFUNCTION(BlueprintCallable, Category="CARLA Settings") - bool SetQualitySettingsLevel(EQualitySettingsLevel newQualityLevel); + void SetQualitySettingsLevel(EQualitySettingsLevel newQualityLevel); + /** @return current quality settings level (could not be applied yet) */ UFUNCTION(BlueprintCallable, Category="CARLA Settings") EQualitySettingsLevel GetQualitySettingsLevel() const { return QualitySettingsLevel; } From 396a4e47e4cb145049c35a1f0128e87ce51f36bf Mon Sep 17 00:00:00 2001 From: juaxix Date: Thu, 22 Mar 2018 11:12:23 +0100 Subject: [PATCH 06/22] Reset project to Unreal 4.18. Keep compatibility with CARLA release 0.8 --- Unreal/CarlaUE4/CarlaUE4.uproject | 4 ++-- .../Plugins/Carla/Source/Carla/Walker/WalkerAIController.cpp | 2 +- .../Plugins/Carla/Source/Carla/Walker/WalkerAIController.h | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Unreal/CarlaUE4/CarlaUE4.uproject b/Unreal/CarlaUE4/CarlaUE4.uproject index 73d43e363..22c8354fb 100644 --- a/Unreal/CarlaUE4/CarlaUE4.uproject +++ b/Unreal/CarlaUE4/CarlaUE4.uproject @@ -1,6 +1,6 @@ { "FileVersion": 3, - "EngineAssociation": "4.19", + "EngineAssociation": "4.18", "Category": "", "Description": "", "Modules": [ @@ -97,4 +97,4 @@ "Enabled": false } ] -} \ No newline at end of file +} diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerAIController.cpp b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerAIController.cpp index 9beb0be6a..a8819f049 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerAIController.cpp +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerAIController.cpp @@ -225,7 +225,7 @@ void AWalkerAIController::OnMoveCompleted( ChangeStatus(EWalkerStatus::MoveCompleted); } -void AWalkerAIController::SenseActors(const TArray& Actors) +void AWalkerAIController::SenseActors(TArray Actors) { const auto *aPawn = GetPawn(); if ((Status == EWalkerStatus::Moving) && diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerAIController.h b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerAIController.h index 9ff8f5fb2..cc218d1f7 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerAIController.h +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerAIController.h @@ -44,7 +44,7 @@ public: UFUNCTION(BlueprintCallable) - void SenseActors(const TArray& Actors); + void SenseActors(TArray Actors); EWalkerStatus GetWalkerStatus() const { From a0a8311db4c4f88000e174b91872ae8b8691d24b Mon Sep 17 00:00:00 2001 From: "CVC\\jbelon" Date: Mon, 26 Mar 2018 18:16:56 +0200 Subject: [PATCH 07/22] Work in progress for Walkers lifetime --- .../Carla/Walker/WalkerAIController.cpp | 14 +- .../Source/Carla/Walker/WalkerAIController.h | 5 +- .../Source/Carla/Walker/WalkerSpawnerBase.cpp | 160 +++++++++++++----- .../Source/Carla/Walker/WalkerSpawnerBase.h | 4 +- 4 files changed, 128 insertions(+), 55 deletions(-) diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerAIController.cpp b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerAIController.cpp index a8819f049..31f8aa246 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerAIController.cpp +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerAIController.cpp @@ -10,7 +10,6 @@ #include "Navigation/CrowdFollowingComponent.h" #include "Perception/AIPerceptionComponent.h" #include "Perception/AISenseConfig_Sight.h" -#include "Perception/AISense_Sight.h" #include "WheeledVehicle.h" #include "WheeledVehicleMovementComponent.h" @@ -27,7 +26,7 @@ static constexpr float UPDATE_TIME_IN_SECONDS = 0.6f; static constexpr float PREVISION_TIME_IN_SECONDS = 5.0f; static constexpr float WALKER_SIGHT_RADIUS = 500.0f; static constexpr float WALKER_SPEED_DAMPING = 4.0f; -static constexpr float WALKER_PERIPHERAL_VISION_ANGLE_IN_DEGREES = 155.0f; +static constexpr float WALKER_PERIPHERAL_VISION_ANGLE_IN_DEGREES = 130.0f; static constexpr float WALKER_MAX_TIME_PAUSED = 5.0f; static constexpr float VEHICLE_SAFETY_RADIUS = 600.0f; @@ -176,11 +175,13 @@ void AWalkerAIController::Tick(float DeltaSeconds) { Super::Tick(DeltaSeconds); TimeInState+=DeltaSeconds; - if (Status != EWalkerStatus::RunOver) { + if (Status != EWalkerStatus::RunOver) + { switch (GetMoveStatus()) { - case EPathFollowingStatus::Idle: - case EPathFollowingStatus::Waiting: + default: break; + case EPathFollowingStatus::Idle: + //case EPathFollowingStatus::Waiting: //<-- incomplete path LOG_AI_WALKER(Warning, "is stuck!"); ChangeStatus(EWalkerStatus::Stuck); break; @@ -190,7 +191,8 @@ void AWalkerAIController::Tick(float DeltaSeconds) TryResumeMovement(); } break; - }; + + }; } } diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerAIController.h b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerAIController.h index cc218d1f7..986d22fde 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerAIController.h +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerAIController.h @@ -54,6 +54,9 @@ public: UFUNCTION(BlueprintCallable) void TrySetMovement(bool paused); + UFUNCTION(BlueprintCallable) + float GetTimeInState() const { return TimeInState; } + private: void ChangeStatus(EWalkerStatus status); void TryResumeMovement(); @@ -68,6 +71,6 @@ private: UPROPERTY(VisibleAnywhere) EWalkerStatus Status = EWalkerStatus::Unknown; - + /** Continous time in the same EWalkerStatus */ float TimeInState=0.0f; }; diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerSpawnerBase.cpp b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerSpawnerBase.cpp index 705fcaa48..b2b1b9c0a 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerSpawnerBase.cpp +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerSpawnerBase.cpp @@ -10,10 +10,10 @@ #include "Util/RandomEngine.h" #include "Walker/WalkerAIController.h" #include "Walker/WalkerSpawnPoint.h" - #include "Components/BoxComponent.h" #include "EngineUtils.h" #include "GameFramework/Character.h" +#include "Kismet/KismetSystemLibrary.h" // ============================================================================= // -- Static local methods ----------------------------------------------------- @@ -112,61 +112,107 @@ void AWalkerSpawnerBase::Tick(float DeltaTime) if (WalkersBlackList.Num() > 0) { - // If still stuck in the black list, just kill it. - const int32 BlackListedIndex = (++CurrentIndexToCheck % WalkersBlackList.Num()); - ACharacter* BlackListedWalker = WalkersBlackList[BlackListedIndex]; - if(BlackListedWalker != nullptr && IsValid(BlackListedWalker)) + CurrentBlackWalkerIndexToCheck = ++CurrentBlackWalkerIndexToCheck % WalkersBlackList.Num(); + ACharacter* BlackListedWalker = WalkersBlackList[CurrentBlackWalkerIndexToCheck]; + AWalkerAIController* controller = BlackListedWalker!=nullptr?Cast(BlackListedWalker->GetController()):nullptr; + if(BlackListedWalker != nullptr && controller!=nullptr && IsValid(BlackListedWalker)) { const auto Status = GetWalkerStatus(BlackListedWalker); + const char* name = TCHAR_TO_UTF8(*UKismetSystemLibrary::GetDisplayName(BlackListedWalker)); + if(strcmp("",name)==0) + { + UE_LOG(LogCarla,Log,TEXT("empty name")); + } + UE_LOG(LogCarla, Log, TEXT("Watching walker %s with state %d"), *UKismetSystemLibrary::GetDisplayName(BlackListedWalker), (int)Status); switch(Status) { - case EWalkerStatus::MoveCompleted: - case EWalkerStatus::Invalid: case EWalkerStatus::RunOver:{ - WalkersBlackList.RemoveAtSwap(BlackListedIndex); - if (Status != EWalkerStatus::RunOver) { - BlackListedWalker->Destroy(); - } + //remove from list and wait for auto-destroy + WalkersBlackList.RemoveAtSwap(CurrentBlackWalkerIndexToCheck); break; } - case EWalkerStatus::Stuck: - if(!TrySetDestination(*BlackListedWalker)){ - SetRandomWalkerDestination(BlackListedWalker); - } - WalkersBlackList.RemoveAtSwap(BlackListedIndex); + case EWalkerStatus::MoveCompleted: + { + BlackListedWalker->Destroy(); + break; + } + default: { + switch(controller->GetMoveStatus()) + { + case EPathFollowingStatus::Idle: + if(!TrySetDestination(*BlackListedWalker)) + { + if(!SetRandomWalkerDestination(BlackListedWalker)) + { + UE_LOG(LogCarla,Error,TEXT("Could not set a random destination to walker %s"),*UKismetSystemLibrary::GetDisplayName(BlackListedWalker)); + } + } + break; + case EPathFollowingStatus::Waiting: + //incomplete path + + break; + case EPathFollowingStatus::Paused: + //waiting for blueprint code + break; + case EPathFollowingStatus::Moving: + if(BlackListedWalker->GetVelocity().Size()>1.0f) + { + WalkersBlackList.RemoveAtSwap(CurrentBlackWalkerIndexToCheck); + Walkers.Add(BlackListedWalker); + } + break; + default: break; + } break; - default: case EWalkerStatus::Unknown: case EWalkerStatus::Paused: break; + } + } + UE_LOG(LogCarla, Log, TEXT("New state for walker %s : %d"), *UKismetSystemLibrary::GetDisplayName(BlackListedWalker), (int)GetWalkerStatus(BlackListedWalker)); } - else - { - WalkersBlackList.RemoveAtSwap(BlackListedIndex); - } + } if (Walkers.Num() > 0) { - // Check one walker, if fails black-list it or kill it. - const int32 WalkerIndex = (++CurrentIndexToCheck % Walkers.Num()); - auto Walker = Walkers[WalkerIndex]; - const auto Status = GetWalkerStatus(Walker); - - if ((Status == EWalkerStatus::MoveCompleted) || - (Status == EWalkerStatus::Invalid) || - (Status == EWalkerStatus::RunOver)) { - // Kill it. - Walkers.RemoveAtSwap(WalkerIndex); - // If it was run over will self-destroy. - if ((Walker != nullptr) && (Status != EWalkerStatus::RunOver)) { - Walker->Destroy(); - } - } else if (Status == EWalkerStatus::Stuck) + // Check one walker, if fails black-list it or kill it. + CurrentWalkerIndexToCheck = ++CurrentWalkerIndexToCheck % Walkers.Num(); + auto Walker = Walkers[CurrentWalkerIndexToCheck]; + const char* walker_name = TCHAR_TO_UTF8(*UKismetSystemLibrary::GetDisplayName(Walker)); + if(strcmp(walker_name,"")) { - SetRandomWalkerDestination(Walker); - // Black-list it. - WalkersBlackList.Add(Walker); - Walkers.RemoveAtSwap(WalkerIndex); + printf("hehh %s",walker_name); + } + if(Walker == nullptr || !IsValid(Walker)) + { + Walkers.RemoveAtSwap(CurrentWalkerIndexToCheck); + } else { + const auto Status = GetWalkerStatus(Walker); + switch (Status) + { + default: + case EWalkerStatus::Paused: + case EWalkerStatus::Unknown: + break; + case EWalkerStatus::RunOver: { + Walkers.RemoveAtSwap(CurrentWalkerIndexToCheck); + break; + } + case EWalkerStatus::MoveCompleted: + Walker->Destroy(); + break; + case EWalkerStatus::Invalid: + case EWalkerStatus::Stuck: + { + SetRandomWalkerDestination(Walker); + // Black-list it and wait for this walker to move + WalkersBlackList.Add(Walker); + Walkers.RemoveAtSwap(CurrentWalkerIndexToCheck); + break; + } + } } + } } @@ -174,10 +220,28 @@ bool AWalkerSpawnerBase::SetRandomWalkerDestination(ACharacter *Walker) { const auto &DestinationPoint = GetRandomSpawnPoint(); auto Controller = GetController(Walker); - if(!Controller) return false; - Controller->MoveTo(DestinationPoint.GetActorLocation()); - - return true; + if(!Controller) { + UE_LOG(LogCarla, Warning, TEXT("AWalkerSpawnerBase::SetRandomWalkerDestination: Walker %s has no controller"), + *UKismetSystemLibrary::GetDisplayName(Walker) + ); + return false; + } + const EPathFollowingRequestResult::Type request_result = Controller->MoveToLocation(DestinationPoint.GetActorLocation(),-1.0f,false,true,true,true,nullptr,true); + switch(request_result) + { + case EPathFollowingRequestResult::Type::Failed: + { + UE_LOG(LogCarla, Warning, TEXT("AWalkerSpawnerBase::SetRandomWalkerDestination: Bad destination point %s"), + *UKismetSystemLibrary::GetDisplayName(&DestinationPoint) + ); + return false; + } + case EPathFollowingRequestResult::Type::AlreadyAtGoal:{ + UE_LOG(LogCarla, Log, TEXT("AWalkerSpawnerBase::SetRandomWalkerDestination already in destination, generating new location")); + return SetRandomWalkerDestination(Walker); + } + default: case EPathFollowingRequestResult::Type::RequestSuccessful: return true; + } } // ============================================================================= @@ -236,7 +300,10 @@ bool AWalkerSpawnerBase::TryToSpawnWalkerAt(const AWalkerSpawnPointBase &SpawnPo // Add walker and set destination. Walkers.Add(Walker); - Controller->MoveToLocation(Destination); + if (Controller->MoveToLocation(Destination,-1.0f,false,true,true,true,nullptr,true)!=EPathFollowingRequestResult::Type::RequestSuccessful) + { + SetRandomWalkerDestination(Walker); + } return true; } @@ -259,6 +326,5 @@ bool AWalkerSpawnerBase::TrySetDestination(ACharacter &Walker) return false; } - Controller->MoveToLocation(Destination); - return true; + return Controller->MoveToLocation(Destination,-1.0f,false,true,true,true,nullptr,true)==EPathFollowingRequestResult::RequestSuccessful; } diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerSpawnerBase.h b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerSpawnerBase.h index 6ecc2d840..c1d05d5dc 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerSpawnerBase.h +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerSpawnerBase.h @@ -118,5 +118,7 @@ private: UPROPERTY(Category = "Walker Spawner", VisibleAnywhere, AdvancedDisplay) TArray WalkersBlackList; - uint32 CurrentIndexToCheck = 0u; + uint32 CurrentWalkerIndexToCheck = 0u; + + uint32 CurrentBlackWalkerIndexToCheck = 0u; }; From 565bd984a267380c074a94313f490c728ea60591 Mon Sep 17 00:00:00 2001 From: "CVC\\jbelon" Date: Thu, 29 Mar 2018 18:36:53 +0200 Subject: [PATCH 08/22] Second part of the Fix #246 : Re-try until all vehicles in the configuration are spawned (not enough spawn points at beginplay) ,this also checks the minimum distance to the player car before spawn. --- .../Carla/Vehicle/VehicleSpawnerBase.cpp | 97 ++++++++++++++++--- .../Source/Carla/Vehicle/VehicleSpawnerBase.h | 23 ++++- 2 files changed, 104 insertions(+), 16 deletions(-) diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Vehicle/VehicleSpawnerBase.cpp b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Vehicle/VehicleSpawnerBase.cpp index 1e5d6fa97..5dfe8a1f2 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Vehicle/VehicleSpawnerBase.cpp +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Vehicle/VehicleSpawnerBase.cpp @@ -11,10 +11,12 @@ #include "Vehicle/CarlaWheeledVehicle.h" #include "Vehicle/WheeledVehicleAIController.h" -#include "Engine/PlayerStartPIE.h" + #include "EngineUtils.h" #include "GameFramework/Character.h" #include "GameFramework/PlayerStart.h" +#include "TimerManager.h" +#include "Kismet/GameplayStatics.h" // ============================================================================= // -- Static local methods ----------------------------------------------------- @@ -35,8 +37,7 @@ static AWheeledVehicleAIController *GetController(ACarlaWheeledVehicle *Vehicle) // ============================================================================= // Sets default values -AVehicleSpawnerBase::AVehicleSpawnerBase(const FObjectInitializer& ObjectInitializer) - : Super(ObjectInitializer) +AVehicleSpawnerBase::AVehicleSpawnerBase(const FObjectInitializer& ObjectInitializer): Super(ObjectInitializer) { PrimaryActorTick.bCanEverTick = false; } @@ -55,13 +56,26 @@ void AVehicleSpawnerBase::BeginPlay() SpawnPoints.Add(*It); } - UE_LOG(LogCarla, Log, TEXT("Found %d positions for spawning vehicles"), SpawnPoints.Num()); + UE_LOG(LogCarla, Log, TEXT("Found %d PlayerStart positions for spawning vehicles"), SpawnPoints.Num()); - if (SpawnPoints.Num() < NumberOfVehicles) { - UE_LOG(LogCarla, Error, TEXT("We don't have enough spawn points for vehicles!")); + if (SpawnPoints.Num() < NumberOfVehicles && SpawnPoints.Num()>0) + { + UE_LOG(LogCarla, Warning, TEXT("We don't have enough spawn points (PlayerStart) for vehicles!")); + if(SpawnPoints.Num()==0) + { + UE_LOG(LogCarla, Error, TEXT("At least one spawn point (PlayerStart) is needed to spawn vehicles!")); + } else + { + UE_LOG(LogCarla, Log, + TEXT("To cover the %d vehicles to spawn after beginplay, it will spawn one new vehicle each %f seconds"), + NumberOfVehicles - SpawnPoints.Num(), + TimeBetweenSpawnAttemptsAfterBegin + ) +; + } } - if(NumberOfVehicles==0) bSpawnVehicles = false; + if(NumberOfVehicles==0||SpawnPoints.Num()==0) bSpawnVehicles = false; if (bSpawnVehicles) { @@ -74,19 +88,39 @@ void AVehicleSpawnerBase::BeginPlay() SpawnVehicleAtSpawnPoint(*SpawnPoints[NumberOfAttempts]); ++NumberOfAttempts; } - - if (NumberOfVehicles > Vehicles.Num()) { + + if (NumberOfAttempts > NumberOfVehicles) + { UE_LOG(LogCarla, Error, TEXT("Requested %d vehicles, but we were only able to spawn %d"), NumberOfVehicles, Vehicles.Num()); } else { - UE_LOG(LogCarla, Log, TEXT("Spawned %d vehicles"), NumberOfAttempts); + if(NumberOfAttempts == NumberOfVehicles) + { + UE_LOG(LogCarla, Log, TEXT("Spawned all %d vehicles"), NumberOfAttempts); + } else + { + UE_LOG(LogCarla, Log, + TEXT("Starting the timer to spawn the other %d vehicles, one per %f seconds"), + NumberOfVehicles - NumberOfAttempts, + TimeBetweenSpawnAttemptsAfterBegin + ); + GetWorld()->GetTimerManager().SetTimer(AttemptTimerHandle,this, &AVehicleSpawnerBase::SpawnVehicleAttempt, TimeBetweenSpawnAttemptsAfterBegin,false,-1); + + } + } } } +void AVehicleSpawnerBase::EndPlay(const EEndPlayReason::Type EndPlayReason) +{ + GetWorld()->GetTimerManager().ClearAllTimersForObject(this); +} + void AVehicleSpawnerBase::SetNumberOfVehicles(const int32 Count) { - if (Count > 0) { + if (Count > 0) + { bSpawnVehicles = true; NumberOfVehicles = Count; } else { @@ -97,7 +131,8 @@ void AVehicleSpawnerBase::SetNumberOfVehicles(const int32 Count) void AVehicleSpawnerBase::TryToSpawnRandomVehicle() { auto SpawnPoint = GetRandomSpawnPoint(); - if (SpawnPoint != nullptr) { + if (SpawnPoint != nullptr) + { SpawnVehicleAtSpawnPoint(*SpawnPoint); } else { UE_LOG(LogCarla, Error, TEXT("Unable to find spawn point")); @@ -109,11 +144,13 @@ void AVehicleSpawnerBase::SpawnVehicleAtSpawnPoint( { ACarlaWheeledVehicle *Vehicle; SpawnVehicle(SpawnPoint.GetActorTransform(), Vehicle); - if ((Vehicle != nullptr) && !Vehicle->IsPendingKill()) { + if ((Vehicle != nullptr) && !Vehicle->IsPendingKill()) + { Vehicle->AIControllerClass = AWheeledVehicleAIController::StaticClass(); Vehicle->SpawnDefaultController(); auto Controller = GetController(Vehicle); - if (Controller != nullptr) { // Sometimes fails... + if (Controller != nullptr) + { // Sometimes fails... Controller->GetRandomEngine()->Seed(GetRandomEngine()->GenerateSeed()); Controller->SetRoadMap(GetRoadMap()); Controller->SetAutopilot(true); @@ -125,6 +162,38 @@ void AVehicleSpawnerBase::SpawnVehicleAtSpawnPoint( } } +void AVehicleSpawnerBase::SpawnVehicleAttempt() +{ + if(Vehicles.Num()>=NumberOfVehicles) + { + UE_LOG(LogCarla, Log, TEXT("All vehicles spawned correctly")); + return; + } + + APlayerStart* spawnpoint = GetRandomSpawnPoint(); + APawn* playerpawn = UGameplayStatics::GetPlayerPawn(GetWorld(),0); + const float DistanceToPlayer = playerpawn&&spawnpoint? FVector::Distance(playerpawn->GetActorLocation(),spawnpoint->GetActorLocation()):0.0f; + float NextTime = TimeBetweenSpawnAttemptsAfterBegin; + if(DistanceToPlayer>DistanceToPlayerBetweenSpawnAttemptsAfterBegin) + { + SpawnVehicleAtSpawnPoint(*spawnpoint); + } else + { + NextTime /= 2.0f; + } + + if(Vehicles.Num()GetTimerManager(); + if(AttemptTimerHandle.IsValid()) timemanager.ClearTimer(AttemptTimerHandle); + timemanager.SetTimer(AttemptTimerHandle,this, &AVehicleSpawnerBase::SpawnVehicleAttempt,NextTime,false,-1); + } else + { + UE_LOG(LogCarla, Log, TEXT("Last vehicle spawned correctly")); + } + +} + APlayerStart *AVehicleSpawnerBase::GetRandomSpawnPoint() { return (SpawnPoints.Num() > 0 ? GetRandomEngine()->PickOne(SpawnPoints) : nullptr); diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Vehicle/VehicleSpawnerBase.h b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Vehicle/VehicleSpawnerBase.h index c079c53a6..dcca93168 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Vehicle/VehicleSpawnerBase.h +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Vehicle/VehicleSpawnerBase.h @@ -28,6 +28,9 @@ protected: // Called when the game starts or when spawned virtual void BeginPlay() override; + // Called when the actor is removed from the level + virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; + UFUNCTION(BlueprintImplementableEvent) void SpawnVehicle(const FTransform &SpawnTransform, ACarlaWheeledVehicle *&SpawnedCharacter); @@ -57,6 +60,9 @@ public: { return RoadMap; } + /** Function called to spawn another vehicle when there is not enough spawn points in the beginplay */ + UFUNCTION(Category = "Vehicle Spawner", BlueprintCallable) + void SpawnVehicleAttempt(); protected: @@ -65,7 +71,7 @@ protected: void SpawnVehicleAtSpawnPoint(const APlayerStart &SpawnPoint); UPROPERTY() - URoadMap *RoadMap; + URoadMap *RoadMap = nullptr; /** If false, no walker will be spawned. */ UPROPERTY(Category = "Vehicle Spawner", EditAnywhere) @@ -75,9 +81,22 @@ protected: UPROPERTY(Category = "Vehicle Spawner", EditAnywhere, meta = (EditCondition = bSpawnVehicles, ClampMin = "1")) int32 NumberOfVehicles = 10; - UPROPERTY(Category = "Vechicle Spawner", VisibleAnywhere, AdvancedDisplay) + UPROPERTY(Category = "Vehicle Spawner", VisibleAnywhere, AdvancedDisplay) TArray SpawnPoints; UPROPERTY(Category = "Vehicle Spawner", BlueprintReadOnly, VisibleAnywhere, AdvancedDisplay) TArray Vehicles; + + /** Time to spawn new vehicles after begin play if there was not enough spawn points at the moment */ + UPROPERTY(Category = "Vehicle Spawner", BlueprintReadWrite, EditAnywhere, meta = (ClampMin = "0.1", ClampMax = "1000.0", UIMin = "0.1", UIMax = "1000.0")) + float TimeBetweenSpawnAttemptsAfterBegin = 3.0f; + + /** Min Distance to the player vehicle to validate a spawn point location for the next vehicle spawn attempt */ + UPROPERTY(Category = "Vehicle Spawner", BlueprintReadWrite, EditAnywhere, meta = (ClampMin = "10", ClampMax = "10000", UIMin = "10", UIMax = "10000")) + float DistanceToPlayerBetweenSpawnAttemptsAfterBegin = 5000; +private: + + /** Time handler to spawn more vehicles in the case we could not do it in the beginplay */ + FTimerHandle AttemptTimerHandle; + }; From 9cb1f8bb8d6c4f64215546bbce90ac3bb28abeac Mon Sep 17 00:00:00 2001 From: "CVC\\jbelon" Date: Tue, 3 Apr 2018 15:17:48 +0200 Subject: [PATCH 09/22] Fix #330 : Low mode camera over-exposed because by changing the CaptureComponent2D->CaptureSource to HDR without alpha --- .../Carla/Sensor/SceneCaptureCamera.cpp | 46 +++++++++++++++---- 1 file changed, 38 insertions(+), 8 deletions(-) diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/SceneCaptureCamera.cpp b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/SceneCaptureCamera.cpp index f21f51a84..ee31fcd50 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/SceneCaptureCamera.cpp +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/SceneCaptureCamera.cpp @@ -8,7 +8,8 @@ #include "SceneCaptureCamera.h" #include "Sensor/SensorDataView.h" - +#include "Game/CarlaGameInstance.h" +#include "Settings/CarlaSettings.h" #include "Components/DrawFrustumComponent.h" #include "Components/SceneCaptureComponent2D.h" #include "Components/StaticMeshComponent.h" @@ -62,7 +63,8 @@ ASceneCaptureCamera::ASceneCaptureCamera(const FObjectInitializer& ObjectInitial CaptureRenderTarget->MipGenSettings = TextureMipGenSettings::TMGS_NoMipmaps; #endif CaptureRenderTarget->CompressionSettings = TextureCompressionSettings::TC_Default; - CaptureRenderTarget->SRGB=0; + CaptureRenderTarget->SRGB = false; + CaptureRenderTarget->bUseLegacyGamma = false; CaptureRenderTarget->bAutoGenerateMips = false; CaptureRenderTarget->AddressX = TextureAddress::TA_Clamp; CaptureRenderTarget->AddressY = TextureAddress::TA_Clamp; @@ -110,16 +112,44 @@ void ASceneCaptureCamera::BeginPlay() CaptureComponent2D->Deactivate(); CaptureComponent2D->TextureTarget = CaptureRenderTarget; - // Setup camera post-processing. - if (PostProcessEffect != EPostProcessEffect::None) { - CaptureComponent2D->CaptureSource = ESceneCaptureSource::SCS_FinalColorLDR; //HD is much slower! + // Setup camera post-processing depending on the quality level: + const UCarlaGameInstance* GameInstance = Cast(GetWorld()->GetGameInstance()); + check(GameInstance!=nullptr); + const UCarlaSettings& CarlaSettings = GameInstance->GetCarlaSettings(); + switch(PostProcessEffect) + { + case EPostProcessEffect::None: break; + case EPostProcessEffect::SceneFinal: + { + //we set LDR for high quality because it will include post-fx + //and HDR for low quality to avoid high contrast + switch(CarlaSettings.GetQualitySettingsLevel()) + { + case EQualitySettingsLevel::Low: + CaptureComponent2D->CaptureSource = ESceneCaptureSource::SCS_SceneColorHDRNoAlpha; + break; + default: + //LDR is faster than HDR (smaller bitmap array) + CaptureComponent2D->CaptureSource = ESceneCaptureSource::SCS_FinalColorLDR; + break; + } + break; + } + default: + CaptureComponent2D->CaptureSource = SCS_FinalColorLDR; + break; } - if (bRemovePostProcessing) { + + if (bRemovePostProcessing) + { RemoveShowFlags(CaptureComponent2D->ShowFlags); } - if (PostProcessEffect == EPostProcessEffect::Depth) { + + if (PostProcessEffect == EPostProcessEffect::Depth) + { CaptureComponent2D->PostProcessSettings.AddBlendable(PostProcessDepth, 1.0f); - } else if (PostProcessEffect == EPostProcessEffect::SemanticSegmentation) { + } else if (PostProcessEffect == EPostProcessEffect::SemanticSegmentation) + { CaptureComponent2D->PostProcessSettings.AddBlendable(PostProcessSemanticSegmentation, 1.0f); } From fbb1cafcfbb1246d034085d452cf9731409411b1 Mon Sep 17 00:00:00 2001 From: juaxix Date: Wed, 4 Apr 2018 17:11:44 +0200 Subject: [PATCH 10/22] Removed prints for debug in WalkerSpawnerBase --- .../Source/Carla/Walker/WalkerSpawnerBase.cpp | 97 ++++++++----------- 1 file changed, 43 insertions(+), 54 deletions(-) diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerSpawnerBase.cpp b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerSpawnerBase.cpp index b2b1b9c0a..e3f34963c 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerSpawnerBase.cpp +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerSpawnerBase.cpp @@ -112,63 +112,56 @@ void AWalkerSpawnerBase::Tick(float DeltaTime) if (WalkersBlackList.Num() > 0) { - CurrentBlackWalkerIndexToCheck = ++CurrentBlackWalkerIndexToCheck % WalkersBlackList.Num(); + CurrentBlackWalkerIndexToCheck = ++CurrentBlackWalkerIndexToCheck % WalkersBlackList.Num(); ACharacter* BlackListedWalker = WalkersBlackList[CurrentBlackWalkerIndexToCheck]; - AWalkerAIController* controller = BlackListedWalker!=nullptr?Cast(BlackListedWalker->GetController()):nullptr; - if(BlackListedWalker != nullptr && controller!=nullptr && IsValid(BlackListedWalker)) - { - const auto Status = GetWalkerStatus(BlackListedWalker); - const char* name = TCHAR_TO_UTF8(*UKismetSystemLibrary::GetDisplayName(BlackListedWalker)); - if(strcmp("",name)==0) - { - UE_LOG(LogCarla,Log,TEXT("empty name")); - } - UE_LOG(LogCarla, Log, TEXT("Watching walker %s with state %d"), *UKismetSystemLibrary::GetDisplayName(BlackListedWalker), (int)Status); - switch(Status) + AWalkerAIController* controller = BlackListedWalker!=nullptr?Cast(BlackListedWalker->GetController()):nullptr; + if(BlackListedWalker != nullptr && controller!=nullptr && IsValid(BlackListedWalker)) { - case EWalkerStatus::RunOver:{ - //remove from list and wait for auto-destroy - WalkersBlackList.RemoveAtSwap(CurrentBlackWalkerIndexToCheck); - break; - } - case EWalkerStatus::MoveCompleted: - { - BlackListedWalker->Destroy(); - break; - } - default: { - switch(controller->GetMoveStatus()) - { - case EPathFollowingStatus::Idle: - if(!TrySetDestination(*BlackListedWalker)) - { - if(!SetRandomWalkerDestination(BlackListedWalker)) - { - UE_LOG(LogCarla,Error,TEXT("Could not set a random destination to walker %s"),*UKismetSystemLibrary::GetDisplayName(BlackListedWalker)); - } - } - break; - case EPathFollowingStatus::Waiting: - //incomplete path - + const auto Status = GetWalkerStatus(BlackListedWalker); + UE_LOG(LogCarla, Log, TEXT("Watching walker %s with state %d"), *UKismetSystemLibrary::GetDisplayName(BlackListedWalker), (int)Status); + switch(Status) + { + case EWalkerStatus::RunOver:{ + //remove from list and wait for auto-destroy + WalkersBlackList.RemoveAtSwap(CurrentBlackWalkerIndexToCheck); + break; + } + case EWalkerStatus::MoveCompleted: + { + BlackListedWalker->Destroy(); + break; + } + default: { + switch(controller->GetMoveStatus()) + { + case EPathFollowingStatus::Idle: + if(!TrySetDestination(*BlackListedWalker)) + { + if(!SetRandomWalkerDestination(BlackListedWalker)) + { + UE_LOG(LogCarla,Error,TEXT("Could not set a random destination to walker %s"),*UKismetSystemLibrary::GetDisplayName(BlackListedWalker)); + } + } + break; + case EPathFollowingStatus::Waiting: + //incomplete path break; - case EPathFollowingStatus::Paused: - //waiting for blueprint code + case EPathFollowingStatus::Paused: + //waiting for blueprint code break; - case EPathFollowingStatus::Moving: - if(BlackListedWalker->GetVelocity().Size()>1.0f) - { - WalkersBlackList.RemoveAtSwap(CurrentBlackWalkerIndexToCheck); + case EPathFollowingStatus::Moving: + if(BlackListedWalker->GetVelocity().Size()>1.0f) + { + WalkersBlackList.RemoveAtSwap(CurrentBlackWalkerIndexToCheck); Walkers.Add(BlackListedWalker); - } + } break; - default: break; - } + default: break; + } break; - } - - } - UE_LOG(LogCarla, Log, TEXT("New state for walker %s : %d"), *UKismetSystemLibrary::GetDisplayName(BlackListedWalker), (int)GetWalkerStatus(BlackListedWalker)); + } + } + UE_LOG(LogCarla, Log, TEXT("New state for walker %s : %d"), *UKismetSystemLibrary::GetDisplayName(BlackListedWalker), (int)GetWalkerStatus(BlackListedWalker)); } } @@ -179,10 +172,6 @@ void AWalkerSpawnerBase::Tick(float DeltaTime) CurrentWalkerIndexToCheck = ++CurrentWalkerIndexToCheck % Walkers.Num(); auto Walker = Walkers[CurrentWalkerIndexToCheck]; const char* walker_name = TCHAR_TO_UTF8(*UKismetSystemLibrary::GetDisplayName(Walker)); - if(strcmp(walker_name,"")) - { - printf("hehh %s",walker_name); - } if(Walker == nullptr || !IsValid(Walker)) { Walkers.RemoveAtSwap(CurrentWalkerIndexToCheck); From ab34056301ec357d34d644be1a627870c568a869 Mon Sep 17 00:00:00 2001 From: juaxix Date: Wed, 4 Apr 2018 17:26:40 +0200 Subject: [PATCH 11/22] Removed unused walker_name var --- .../Plugins/Carla/Source/Carla/Walker/WalkerSpawnerBase.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerSpawnerBase.cpp b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerSpawnerBase.cpp index e3f34963c..9b03d5116 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerSpawnerBase.cpp +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerSpawnerBase.cpp @@ -170,8 +170,8 @@ void AWalkerSpawnerBase::Tick(float DeltaTime) { // Check one walker, if fails black-list it or kill it. CurrentWalkerIndexToCheck = ++CurrentWalkerIndexToCheck % Walkers.Num(); - auto Walker = Walkers[CurrentWalkerIndexToCheck]; - const char* walker_name = TCHAR_TO_UTF8(*UKismetSystemLibrary::GetDisplayName(Walker)); + auto Walker = Walkers[CurrentWalkerIndexToCheck]; + if(Walker == nullptr || !IsValid(Walker)) { Walkers.RemoveAtSwap(CurrentWalkerIndexToCheck); From 7b96f1f8345ec3dc21d00111706247bc0cce762c Mon Sep 17 00:00:00 2001 From: juaxix Date: Wed, 4 Apr 2018 17:32:45 +0200 Subject: [PATCH 12/22] Formatting text for WalkerSpawnerBase.cpp --- .../Source/Carla/Walker/WalkerSpawnerBase.cpp | 60 +++++++++---------- 1 file changed, 29 insertions(+), 31 deletions(-) diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerSpawnerBase.cpp b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerSpawnerBase.cpp index 9b03d5116..c79b4a9c8 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerSpawnerBase.cpp +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerSpawnerBase.cpp @@ -168,40 +168,38 @@ void AWalkerSpawnerBase::Tick(float DeltaTime) if (Walkers.Num() > 0) { - // Check one walker, if fails black-list it or kill it. - CurrentWalkerIndexToCheck = ++CurrentWalkerIndexToCheck % Walkers.Num(); - auto Walker = Walkers[CurrentWalkerIndexToCheck]; - - if(Walker == nullptr || !IsValid(Walker)) - { - Walkers.RemoveAtSwap(CurrentWalkerIndexToCheck); - } else { - const auto Status = GetWalkerStatus(Walker); - switch (Status) + // Check one walker, if fails black-list it or kill it. + CurrentWalkerIndexToCheck = ++CurrentWalkerIndexToCheck % Walkers.Num(); + auto Walker = Walkers[CurrentWalkerIndexToCheck]; + if(Walker == nullptr || !IsValid(Walker)) { - default: - case EWalkerStatus::Paused: - case EWalkerStatus::Unknown: - break; - case EWalkerStatus::RunOver: { + Walkers.RemoveAtSwap(CurrentWalkerIndexToCheck); + } else { + const auto Status = GetWalkerStatus(Walker); + switch (Status) + { + default: + case EWalkerStatus::Paused: + case EWalkerStatus::Unknown: + break; + case EWalkerStatus::RunOver: { Walkers.RemoveAtSwap(CurrentWalkerIndexToCheck); - break; - } - case EWalkerStatus::MoveCompleted: - Walker->Destroy(); - break; - case EWalkerStatus::Invalid: - case EWalkerStatus::Stuck: - { - SetRandomWalkerDestination(Walker); - // Black-list it and wait for this walker to move - WalkersBlackList.Add(Walker); - Walkers.RemoveAtSwap(CurrentWalkerIndexToCheck); - break; - } - } + break; + } + case EWalkerStatus::MoveCompleted: + Walker->Destroy(); + break; + case EWalkerStatus::Invalid: + case EWalkerStatus::Stuck: + { + SetRandomWalkerDestination(Walker); + // Black-list it and wait for this walker to move + WalkersBlackList.Add(Walker); + Walkers.RemoveAtSwap(CurrentWalkerIndexToCheck); + break; + } + } } - } } From bf9e7277e3e73f650a640b9986bff532ab75c823 Mon Sep 17 00:00:00 2001 From: "CVC\\jbelon" Date: Thu, 5 Apr 2018 16:35:27 +0200 Subject: [PATCH 13/22] Fix for crowd control when the number of pedestrian is bigger than 50 --- Unreal/CarlaUE4/Config/DefaultEngine.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/Unreal/CarlaUE4/Config/DefaultEngine.ini b/Unreal/CarlaUE4/Config/DefaultEngine.ini index fe2f3fc7e..a4c3abf39 100644 --- a/Unreal/CarlaUE4/Config/DefaultEngine.ini +++ b/Unreal/CarlaUE4/Config/DefaultEngine.ini @@ -77,3 +77,4 @@ InitialAverageFrameRate=0.016667 PhysXTreeRebuildRate=10 +[/Script/AIModule.CrowdManager] \ No newline at end of file From 355e4fa9504d2c6a0483b23068d4c9b5487af123 Mon Sep 17 00:00:00 2001 From: "CVC\\jbelon" Date: Thu, 5 Apr 2018 16:37:20 +0200 Subject: [PATCH 14/22] Set the number of max agents for crowdmanager --- Unreal/CarlaUE4/Config/DefaultEngine.ini | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Unreal/CarlaUE4/Config/DefaultEngine.ini b/Unreal/CarlaUE4/Config/DefaultEngine.ini index a4c3abf39..859b88bb2 100644 --- a/Unreal/CarlaUE4/Config/DefaultEngine.ini +++ b/Unreal/CarlaUE4/Config/DefaultEngine.ini @@ -77,4 +77,5 @@ InitialAverageFrameRate=0.016667 PhysXTreeRebuildRate=10 -[/Script/AIModule.CrowdManager] \ No newline at end of file +[/Script/AIModule.CrowdManager] +MaxAgents=1000 \ No newline at end of file From 4bc8aaf121b6b79960d021ca0970dca7f4bc48c6 Mon Sep 17 00:00:00 2001 From: "CVC\\jbelon" Date: Fri, 6 Apr 2018 11:19:24 +0200 Subject: [PATCH 15/22] Fix to be able to compile for production --- .../Plugins/Carla/Source/Carla/Sensor/SceneCaptureCamera.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/SceneCaptureCamera.cpp b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/SceneCaptureCamera.cpp index ee31fcd50..ecd7fbe97 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/SceneCaptureCamera.cpp +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/SceneCaptureCamera.cpp @@ -61,10 +61,10 @@ ASceneCaptureCamera::ASceneCaptureCamera(const FObjectInitializer& ObjectInitial #if WITH_EDITORONLY_DATA CaptureRenderTarget->CompressionNoAlpha = true; CaptureRenderTarget->MipGenSettings = TextureMipGenSettings::TMGS_NoMipmaps; + CaptureRenderTarget->bUseLegacyGamma = false; #endif CaptureRenderTarget->CompressionSettings = TextureCompressionSettings::TC_Default; CaptureRenderTarget->SRGB = false; - CaptureRenderTarget->bUseLegacyGamma = false; CaptureRenderTarget->bAutoGenerateMips = false; CaptureRenderTarget->AddressX = TextureAddress::TA_Clamp; CaptureRenderTarget->AddressY = TextureAddress::TA_Clamp; From ffd3339a8f0bb7df24966cc10937ef0e263b2bf0 Mon Sep 17 00:00:00 2001 From: "CVC\\jbelon" Date: Mon, 9 Apr 2018 18:02:11 +0200 Subject: [PATCH 16/22] Make Unreal CARLA Plugin compilable in Runtime mode --- Unreal/CarlaUE4/Plugins/Carla/Carla.uplugin | 2 +- .../Source/Carla/Agent/AgentComponent.cpp | 33 ++++++++++++++++--- .../Source/Carla/Settings/CarlaSettings.h | 8 ++--- .../Carla/Settings/CarlaSettingsDelegate.cpp | 2 +- .../Carla/Settings/CarlaSettingsDelegate.h | 6 ++-- 5 files changed, 36 insertions(+), 15 deletions(-) diff --git a/Unreal/CarlaUE4/Plugins/Carla/Carla.uplugin b/Unreal/CarlaUE4/Plugins/Carla/Carla.uplugin index d3d9852cb..b7c895aa3 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Carla.uplugin +++ b/Unreal/CarlaUE4/Plugins/Carla/Carla.uplugin @@ -16,7 +16,7 @@ "Modules": [ { "Name": "Carla", - "Type": "Developer", + "Type": "Runtime", "LoadingPhase": "PreDefault", "AdditionalDependencies": [ "Engine" diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Agent/AgentComponent.cpp b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Agent/AgentComponent.cpp index 93b285d8b..de9bdcff5 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Agent/AgentComponent.cpp +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Agent/AgentComponent.cpp @@ -8,14 +8,16 @@ #include "Carla.h" #include "AgentComponent.h" - +#include "Engine/World.h" #include "Game/CarlaGameModeBase.h" #include "Game/DataRouter.h" +#include "Engine/Engine.h" +#include "Kismet/GameplayStatics.h" static FDataRouter &GetDataRouter(UWorld *World) { check(World != nullptr); - auto *GameMode = Cast(World->GetAuthGameMode()); + ACarlaGameModeBase *GameMode = Cast(World->GetAuthGameMode()); check(GameMode != nullptr); return GameMode->GetDataRouter(); } @@ -40,7 +42,20 @@ void UAgentComponent::BeginPlay() if (bRegisterAgentComponent) { - GetDataRouter(GetWorld()).RegisterAgent(this); + /** + * This only returns true if the current game mode is not null + * because you can only access a game mode if you are the host + * @param oftheworld UWorld is needed to access the game mode + * @return true if there is a game mode and it is not null + */ + if(UGameplayStatics::GetGameMode(GetWorld())!=nullptr) + { + GetDataRouter(GetWorld()).RegisterAgent(this); + } else + { + UCarlaGameInstance* GameInstance = Cast(UGameplayStatics::GetGameInstance(GetWorld())); + if(GameInstance) GameInstance->GetDataRouter().RegisterAgent(this); + } bAgentComponentIsRegistered = true; } } @@ -49,9 +64,19 @@ void UAgentComponent::EndPlay(const EEndPlayReason::Type EndPlayReason) { if (bAgentComponentIsRegistered) { - GetDataRouter(GetWorld()).DeregisterAgent(this); + if(UGameplayStatics::GetGameMode(GetWorld())!=nullptr) + { + GetDataRouter(GetWorld()).DeregisterAgent(this); + } + else + { + UCarlaGameInstance* GameInstance = Cast(UGameplayStatics::GetGameInstance(GetWorld())); + if(GameInstance) + GameInstance->GetDataRouter().DeregisterAgent(this); + } bAgentComponentIsRegistered = false; } Super::EndPlay(EndPlayReason); } + diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Settings/CarlaSettings.h b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Settings/CarlaSettings.h index abec4c0d7..c0772ff83 100755 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Settings/CarlaSettings.h +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Settings/CarlaSettings.h @@ -5,13 +5,11 @@ // For a copy, see . #pragma once - +#include "Engine/StaticMesh.h" #include "WeatherDescription.h" - -#include "UObject/NoExportTypes.h" - #include "CarlaSettings.generated.h" + UENUM(BlueprintType) enum class EQualitySettingsLevel : uint8 { @@ -42,7 +40,7 @@ public: }; class USensorDescription; -struct FStaticMaterial; + /** Global settings for CARLA. * Setting object used to hold both config settings and editable ones in one place * To ensure the settings are saved to the specified config file make sure to add diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Settings/CarlaSettingsDelegate.cpp b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Settings/CarlaSettingsDelegate.cpp index 179d457b9..f5a614eff 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Settings/CarlaSettingsDelegate.cpp +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Settings/CarlaSettingsDelegate.cpp @@ -1,5 +1,5 @@ #include "Carla.h" -#include "Engine/World.h" + #include "Game/CarlaGameModeBase.h" #include "Settings/CarlaSettings.h" #include "CarlaSettingsDelegate.h" diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Settings/CarlaSettingsDelegate.h b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Settings/CarlaSettingsDelegate.h index 77a5105af..a875ff91f 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Settings/CarlaSettingsDelegate.h +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Settings/CarlaSettingsDelegate.h @@ -5,12 +5,10 @@ // For a copy, see . #pragma once - +#include "CoreMinimal.h" +#include "Engine/World.h" #include "CarlaSettingsDelegate.generated.h" - -class UCarlaSettings; - /// Used to set settings for every actor that is spawned into the world. UCLASS(BlueprintType) class CARLA_API UCarlaSettingsDelegate : public UObject From b8b27447d94a3f6877d896ef8422c991d2a4ec9c Mon Sep 17 00:00:00 2001 From: "CVC\\jbelon" Date: Tue, 10 Apr 2018 18:40:28 +0200 Subject: [PATCH 17/22] Fix #318 - Direct3D RHI textures resampled to maintain the width*height*bytes_per_pixels being sent to the client when dest_stride!=src_stride --- .../Carla/Sensor/SceneCaptureCamera.cpp | 40 +++++++++++++++---- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/SceneCaptureCamera.cpp b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/SceneCaptureCamera.cpp index ecd7fbe97..85d41d9f6 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/SceneCaptureCamera.cpp +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/SceneCaptureCamera.cpp @@ -19,6 +19,9 @@ #include "Materials/Material.h" #include "Paths.h" #include "Kismet/KismetSystemLibrary.h" +#include "Image.h" +#include "ImageUtils.h" +#include static constexpr auto DEPTH_MAT_PATH = @@ -318,27 +321,48 @@ void ASceneCaptureCamera::WritePixels(float DeltaTime) const UE_LOG(LogCarla, Error, TEXT("SceneCaptureCamera: Missing render texture")); return ; } + const uint32 num_bytes_per_pixel = 4; // PF_R8G8B8A8 const uint32 width = texture->GetSizeX(); - uint32 height = texture->GetSizeY(); - uint32 stride; - uint8 *src = reinterpret_cast(RHILockTexture2D(texture, 0, RLM_ReadOnly, stride, false)); + const uint32 height = texture->GetSizeY(); + const uint32 dest_stride = width * height * num_bytes_per_pixel; + uint32 src_stride; + uint8 *src = reinterpret_cast(RHILockTexture2D(texture, 0, RLM_ReadOnly, src_stride, false)); struct { uint32 Width; uint32 Height; uint32 Type; float FOV; } ImageHeader = { - SizeX, - SizeY, + width, + height, PostProcessEffect::ToUInt(PostProcessEffect), CaptureComponent2D->FOVAngle }; - FSensorDataView DataView( + + std::unique_ptr dest = nullptr; + //Direct 3D uses additional rows in the buffer,so we need check the result stride from the lock: + if(IsD3DPlatform(GMaxRHIShaderPlatform,false) && (dest_stride!=src_stride)) + { + const uint32 copy_row_stride = width * num_bytes_per_pixel; + dest = std::make_unique(dest_stride); + // Copy per row + uint8* dest_row = dest.get(); + uint8* src_row = src; + for (uint32 Row = 0; Row < height; ++Row) + { + FMemory::Memcpy(dest_row, src_row, copy_row_stride); + dest_row += copy_row_stride; + src_row += src_stride; + } + src = dest.get(); + } + + const FSensorDataView DataView( GetId(), FReadOnlyBufferView{reinterpret_cast(&ImageHeader), sizeof(ImageHeader)}, - FReadOnlyBufferView{src,stride*height} + FReadOnlyBufferView{src,dest_stride} ); - + WriteSensorData(DataView); RHIUnlockTexture2D(texture, 0, false); } From 2c2a2306ef9ddd2d2ace9fccdd6c0a559924c69c Mon Sep 17 00:00:00 2001 From: "CVC\\jbelon" Date: Wed, 11 Apr 2018 17:39:03 +0200 Subject: [PATCH 18/22] Removed unnecessary includes from .h --- .../Plugins/Carla/Source/Carla/Sensor/SceneCaptureCamera.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/SceneCaptureCamera.cpp b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/SceneCaptureCamera.cpp index 85d41d9f6..f34c6ef12 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/SceneCaptureCamera.cpp +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/SceneCaptureCamera.cpp @@ -19,8 +19,6 @@ #include "Materials/Material.h" #include "Paths.h" #include "Kismet/KismetSystemLibrary.h" -#include "Image.h" -#include "ImageUtils.h" #include From dc041d748a20e8c619b02df83c9cdfa1bf6435ce Mon Sep 17 00:00:00 2001 From: "CVC\\jbelon" Date: Thu, 12 Apr 2018 12:54:48 +0200 Subject: [PATCH 19/22] Fix #334 - SceneCaptureCamera now names correctly in construction time and checks for the correctness of the rendertarget component in runtime --- .../Carla/Sensor/SceneCaptureCamera.cpp | 25 +++++++++++++------ .../Source/Carla/Sensor/SceneCaptureCamera.h | 8 +++--- .../Carla/Sensor/SceneCaptureToDiskCamera.cpp | 2 +- 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/SceneCaptureCamera.cpp b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/SceneCaptureCamera.cpp index f34c6ef12..56720b7a7 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/SceneCaptureCamera.cpp +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/SceneCaptureCamera.cpp @@ -15,11 +15,10 @@ #include "Components/StaticMeshComponent.h" #include "Engine/CollisionProfile.h" #include "Engine/TextureRenderTarget2D.h" -#include "HighResScreenshot.h" #include "Materials/Material.h" -#include "Paths.h" #include "Kismet/KismetSystemLibrary.h" #include +#include "ConstructorHelpers.h" static constexpr auto DEPTH_MAT_PATH = @@ -36,6 +35,8 @@ static constexpr auto SEMANTIC_SEGMENTATION_MAT_PATH = static void RemoveShowFlags(FEngineShowFlags &ShowFlags); +uint32 ASceneCaptureCamera::NumSceneCapture = 0; + ASceneCaptureCamera::ASceneCaptureCamera(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer), SizeX(720u), @@ -45,7 +46,7 @@ ASceneCaptureCamera::ASceneCaptureCamera(const FObjectInitializer& ObjectInitial PrimaryActorTick.bCanEverTick = true; PrimaryActorTick.TickGroup = TG_PrePhysics; - MeshComp = CreateDefaultSubobject(TEXT("CamMesh0")); + MeshComp = CreateDefaultSubobject(TEXT("CamMesh")); MeshComp->SetCollisionProfileName(UCollisionProfile::NoCollision_ProfileName); @@ -54,11 +55,11 @@ ASceneCaptureCamera::ASceneCaptureCamera(const FObjectInitializer& ObjectInitial MeshComp->PostPhysicsComponentTick.bCanEverTick = false; RootComponent = MeshComp; - DrawFrustum = CreateDefaultSubobject(TEXT("DrawFrust0")); + DrawFrustum = CreateDefaultSubobject(TEXT("DrawFrust")); DrawFrustum->bIsEditorOnly = true; DrawFrustum->SetupAttachment(MeshComp); - CaptureRenderTarget = CreateDefaultSubobject(TEXT("CaptureRenderTarget0")); + CaptureRenderTarget = CreateDefaultSubobject(FName(*FString::Printf(TEXT("CaptureRenderTarget%d"),NumSceneCapture))); #if WITH_EDITORONLY_DATA CaptureRenderTarget->CompressionNoAlpha = true; CaptureRenderTarget->MipGenSettings = TextureMipGenSettings::TMGS_NoMipmaps; @@ -70,13 +71,14 @@ ASceneCaptureCamera::ASceneCaptureCamera(const FObjectInitializer& ObjectInitial CaptureRenderTarget->AddressX = TextureAddress::TA_Clamp; CaptureRenderTarget->AddressY = TextureAddress::TA_Clamp; CaptureComponent2D = CreateDefaultSubobject(TEXT("SceneCaptureComponent2D")); - CaptureComponent2D->SetupAttachment(MeshComp); + CaptureComponent2D->SetupAttachment(MeshComp); // Load post-processing materials. static ConstructorHelpers::FObjectFinder DEPTH(DEPTH_MAT_PATH); PostProcessDepth = DEPTH.Object; static ConstructorHelpers::FObjectFinder SEMANTIC_SEGMENTATION(SEMANTIC_SEGMENTATION_MAT_PATH); PostProcessSemanticSegmentation = SEMANTIC_SEGMENTATION.Object; + NumSceneCapture++; } void ASceneCaptureCamera::PostActorCreated() @@ -109,7 +111,11 @@ void ASceneCaptureCamera::BeginPlay() // Setup render target. const bool bInForceLinearGamma = bRemovePostProcessing; CaptureRenderTarget->InitCustomFormat(SizeX, SizeY, PF_B8G8R8A8, bInForceLinearGamma); - + if(!IsValid(CaptureComponent2D)||CaptureComponent2D->IsPendingKill()) + { + CaptureComponent2D = NewObject(this,TEXT("SceneCaptureComponent2D")); + CaptureComponent2D->SetupAttachment(MeshComp); + } CaptureComponent2D->Deactivate(); CaptureComponent2D->TextureTarget = CaptureRenderTarget; @@ -163,6 +169,11 @@ void ASceneCaptureCamera::BeginPlay() Super::BeginPlay(); } +void ASceneCaptureCamera::EndPlay(const EEndPlayReason::Type EndPlayReason) +{ + if(NumSceneCapture!=0) NumSceneCapture = 0; +} + void ASceneCaptureCamera::Tick(const float DeltaSeconds) { Super::Tick(DeltaSeconds); diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/SceneCaptureCamera.h b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/SceneCaptureCamera.h index c61adb8f4..b7b7de418 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/SceneCaptureCamera.h +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/SceneCaptureCamera.h @@ -37,7 +37,7 @@ protected: public: virtual void BeginPlay() override; - + virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; virtual void Tick(float DeltaSeconds) override; uint32 GetImageSizeX() const @@ -68,7 +68,9 @@ public: void Set(const UCameraDescription &CameraDescription); bool ReadPixels(TArray &BitMap) const; - + +protected: + static uint32 NumSceneCapture; private: ///Read the camera buffer and write it to the client with no lock of the resources (for Vulkan API) @@ -97,7 +99,7 @@ private: UDrawFrustumComponent* DrawFrustum; /** Render target necessary for scene capture */ - UPROPERTY(Transient) + UPROPERTY() UTextureRenderTarget2D* CaptureRenderTarget; /** Scene capture component. */ diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/SceneCaptureToDiskCamera.cpp b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/SceneCaptureToDiskCamera.cpp index 0303c2b01..482a25f47 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/SceneCaptureToDiskCamera.cpp +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/SceneCaptureToDiskCamera.cpp @@ -12,7 +12,7 @@ ASceneCaptureToDiskCamera::ASceneCaptureToDiskCamera(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer), - SaveToFolder(FPaths::Combine(FPaths::ProjectSavedDir(), "SceneCaptures")), + SaveToFolder(*FPaths::Combine(FPaths::ProjectSavedDir(), TEXT("SceneCaptures"))), FileName("capture_%05d.png") {} void ASceneCaptureToDiskCamera::BeginPlay() From c65dd122d23a9f5ade86bfec718fbd278cdac90a Mon Sep 17 00:00:00 2001 From: juaxix Date: Thu, 12 Apr 2018 16:29:03 +0200 Subject: [PATCH 20/22] Set settings delegate now is async to keep server/client conn --- .../Source/Carla/Game/CarlaGameModeBase.cpp | 2 +- .../Carla/Settings/CarlaSettingsDelegate.cpp | 161 ++++++++++-------- 2 files changed, 89 insertions(+), 74 deletions(-) diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Game/CarlaGameModeBase.cpp b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Game/CarlaGameModeBase.cpp index 24359b817..ff62ff4b2 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Game/CarlaGameModeBase.cpp +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Game/CarlaGameModeBase.cpp @@ -202,7 +202,7 @@ void ACarlaGameModeBase::BeginPlay() void ACarlaGameModeBase::EndPlay(const EEndPlayReason::Type EndPlayReason) { Super::EndPlay(EndPlayReason); - if (CarlaSettingsDelegate != nullptr) + if (CarlaSettingsDelegate != nullptr && EndPlayReason!=EEndPlayReason::EndPlayInEditor) { CarlaSettingsDelegate->Reset(); } diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Settings/CarlaSettingsDelegate.cpp b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Settings/CarlaSettingsDelegate.cpp index f5a614eff..800f2e376 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Settings/CarlaSettingsDelegate.cpp +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Settings/CarlaSettingsDelegate.cpp @@ -11,6 +11,7 @@ #include "Engine/PostProcessVolume.h" #include "UObjectIterator.h" + ///quality settings configuration between runs EQualitySettingsLevel UCarlaSettingsDelegate::AppliedLowPostResetQualitySettingsLevel = EQualitySettingsLevel::Epic; @@ -21,8 +22,8 @@ UCarlaSettingsDelegate::UCarlaSettingsDelegate() : void UCarlaSettingsDelegate::Reset() { - LaunchEpicQualityCommands(GetLocalWorld()); - AppliedLowPostResetQualitySettingsLevel = EQualitySettingsLevel::Epic; + GetLocalWorld()->GetTimerManager().ClearAllTimersForObject(this); + AppliedLowPostResetQualitySettingsLevel = EQualitySettingsLevel::None; } void UCarlaSettingsDelegate::RegisterSpawnHandler(UWorld *InWorld) @@ -62,7 +63,8 @@ void UCarlaSettingsDelegate::ApplyQualitySettingsLevelPostRestart() { CheckCarlaSettings(nullptr); UWorld *InWorld = CarlaSettings->GetWorld(); - EQualitySettingsLevel QualitySettingsLevel = CarlaSettings->GetQualitySettingsLevel(); + InWorld->GetTimerManager().ClearAllTimersForObject(this); + EQualitySettingsLevel QualitySettingsLevel = CarlaSettings->GetQualitySettingsLevel(); if(AppliedLowPostResetQualitySettingsLevel==QualitySettingsLevel) return; switch(QualitySettingsLevel) @@ -70,7 +72,7 @@ void UCarlaSettingsDelegate::ApplyQualitySettingsLevelPostRestart() case EQualitySettingsLevel::Low: { //execute tweaks for quality - LaunchLowQualityCommands(InWorld); + LaunchLowQualityCommands(InWorld); //iterate all directional lights, deactivate shadows SetAllLights(InWorld,CarlaSettings->LowLightFadeDistance,false,true); //Set all the roads the low quality materials @@ -181,45 +183,49 @@ void UCarlaSettingsDelegate::LaunchLowQualityCommands(UWorld * world) const void UCarlaSettingsDelegate::SetAllRoads(UWorld* world, const float max_draw_distance, const TArray &road_pieces_materials) const { - TArray actors; - UGameplayStatics::GetAllActorsWithTag(world, UCarlaSettings::CARLA_ROAD_TAG,actors); - - for(int32 i=0; iIsPendingKillPending()) continue; - TArray components = actors[i]->GetComponentsByClass(UStaticMeshComponent::StaticClass()); - for(int32 j=0; j(components[j]); - if(staticmeshcomponent) - { - staticmeshcomponent->bAllowCullDistanceVolume = (max_draw_distance>0); - staticmeshcomponent->bUseAsOccluder = false; - staticmeshcomponent->LDMaxDrawDistance = max_draw_distance; - staticmeshcomponent->CastShadow = (max_draw_distance==0); - if(road_pieces_materials.Num()>0) - { - TArray meshslotsnames = staticmeshcomponent->GetMaterialSlotNames(); - for(int32 k=0; kIsPendingKill()) return; + AsyncTask(ENamedThreads::GameThread, [=](){ + if(!world||!IsValid(world)||world->IsPendingKill()) return; + TArray actors; + UGameplayStatics::GetAllActorsWithTag(world, UCarlaSettings::CARLA_ROAD_TAG,actors); + + for(int32 i=0; iIsPendingKillPending()) continue; + TArray components = actors[i]->GetComponentsByClass(UStaticMeshComponent::StaticClass()); + for(int32 j=0; j(components[j]); + if(staticmeshcomponent) + { + staticmeshcomponent->bAllowCullDistanceVolume = (max_draw_distance>0); + staticmeshcomponent->bUseAsOccluder = false; + staticmeshcomponent->LDMaxDrawDistance = max_draw_distance; + staticmeshcomponent->CastShadow = (max_draw_distance==0); + if(road_pieces_materials.Num()>0) { - const FName &slotname = meshslotsnames[k]; - road_pieces_materials.ContainsByPredicate( - [staticmeshcomponent,slotname](const FStaticMaterial& material) + TArray meshslotsnames = staticmeshcomponent->GetMaterialSlotNames(); + for(int32 k=0; kSetMaterial( - staticmeshcomponent->GetMaterialIndex(slotname), - material.MaterialInterface - ); - return true; - } else return false; - }); + if(material.MaterialSlotName.IsEqual(slotname)) + { + staticmeshcomponent->SetMaterial( + staticmeshcomponent->GetMaterialIndex(slotname), + material.MaterialInterface + ); + return true; + } else return false; + }); + } } - } - } - } - } + } + } + } + }); //,DELAY_TIME_TO_SET_ALL_ROADS, false); } void UCarlaSettingsDelegate::SetActorComponentsDrawDistance(AActor* actor, const float max_draw_distance) const @@ -243,20 +249,24 @@ void UCarlaSettingsDelegate::SetActorComponentsDrawDistance(AActor* actor, const void UCarlaSettingsDelegate::SetAllActorsDrawDistance(UWorld* world, const float max_draw_distance) const { ///@TODO: use semantics to grab all actors by type (vehicles,ground,people,props) and set different distances configured in the global properties - TArray actors; - #define _MAX_SCALE_SIZE 50.0f - //set the lower quality - max draw distance - UGameplayStatics::GetAllActorsOfClass(world, AActor::StaticClass(),actors); - for(int32 i=0; iIsPendingKillPending() || - actors[i]->ActorHasTag(UCarlaSettings::CARLA_ROAD_TAG) || - actors[i]->ActorHasTag(UCarlaSettings::CARLA_SKY_TAG) - ){ - continue; - } - SetActorComponentsDrawDistance(actors[i], max_draw_distance); - } + if(!world||!IsValid(world)||world->IsPendingKill()) return; + AsyncTask(ENamedThreads::GameThread, [=](){ + if(!world||!IsValid(world)||world->IsPendingKill()) return; + TArray actors; + #define _MAX_SCALE_SIZE 50.0f + //set the lower quality - max draw distance + UGameplayStatics::GetAllActorsOfClass(world, AActor::StaticClass(),actors); + for(int32 i=0; iIsPendingKillPending() || + actors[i]->ActorHasTag(UCarlaSettings::CARLA_ROAD_TAG) || + actors[i]->ActorHasTag(UCarlaSettings::CARLA_SKY_TAG) + ){ + continue; + } + SetActorComponentsDrawDistance(actors[i], max_draw_distance); + } + }); } @@ -266,12 +276,12 @@ void UCarlaSettingsDelegate::SetPostProcessEffectsEnabled(UWorld* world, const b UGameplayStatics::GetAllActorsOfClass(world, APostProcessVolume::StaticClass(), actors); for(int32 i=0; iIsPendingKillPending()) continue; - APostProcessVolume* postprocessvolume = Cast(actors[i]); - if(postprocessvolume) - { - postprocessvolume->bEnabled = enabled; - } + if(!IsValid(actors[i]) || actors[i]->IsPendingKillPending()) continue; + APostProcessVolume* postprocessvolume = Cast(actors[i]); + if(postprocessvolume) + { + postprocessvolume->bEnabled = enabled; + } } } @@ -318,21 +328,26 @@ void UCarlaSettingsDelegate::LaunchEpicQualityCommands(UWorld* world) const void UCarlaSettingsDelegate::SetAllLights(UWorld* world, const float max_distance_fade, const bool cast_shadows, const bool hide_non_directional) const { - TArray actors; - UGameplayStatics::GetAllActorsOfClass(world, ALight::StaticClass(), actors); - for(int32 i=0;iIsPendingKillPending()) continue; - //tweak directional lights - ADirectionalLight* directionallight = Cast(actors[i]); - if(directionallight) + if(!world||!IsValid(world)||world->IsPendingKill()) return; + AsyncTask(ENamedThreads::GameThread, [=](){ + if(!world||!IsValid(world)||world->IsPendingKill()) return; + TArray actors; + UGameplayStatics::GetAllActorsOfClass(world, ALight::StaticClass(), actors); + for(int32 i=0;iSetCastShadows(cast_shadows); - directionallight->SetLightFunctionFadeDistance(max_distance_fade); - continue; + if(!IsValid(actors[i]) || actors[i]->IsPendingKillPending()) continue; + //tweak directional lights + ADirectionalLight* directionallight = Cast(actors[i]); + if(directionallight) + { + directionallight->SetCastShadows(cast_shadows); + directionallight->SetLightFunctionFadeDistance(max_distance_fade); + continue; + } + //disable any other type of light + actors[i]->SetActorHiddenInGame(hide_non_directional); } - //disable any other type of light - actors[i]->SetActorHiddenInGame(hide_non_directional); - } + }); + } From 1bb7fb89fb01a4900dc505aa95b64dd2b2e993d6 Mon Sep 17 00:00:00 2001 From: juaxix Date: Thu, 12 Apr 2018 17:17:50 +0200 Subject: [PATCH 21/22] Logs for Walker Spawner only if the flag is defined --- .../Source/Carla/Walker/WalkerSpawnerBase.cpp | 40 ++++++++++++++----- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerSpawnerBase.cpp b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerSpawnerBase.cpp index c79b4a9c8..f9113fc22 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerSpawnerBase.cpp +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Walker/WalkerSpawnerBase.cpp @@ -78,14 +78,19 @@ void AWalkerSpawnerBase::BeginPlay() SpawnPoints.Add(SpawnPoint); } } + #ifdef CARLA_AI_WALKERS_EXTRA_LOG UE_LOG(LogCarla, Log, TEXT("Found %d positions for spawning walkers at begin play."), BeginSpawnPoints.Num()); UE_LOG(LogCarla, Log, TEXT("Found %d positions for spawning walkers during game play."), SpawnPoints.Num()); - + #endif if (SpawnPoints.Num() < 2) { bSpawnWalkers = false; + #ifdef CARLA_AI_WALKERS_EXTRA_LOG UE_LOG(LogCarla, Error, TEXT("We don't have enough spawn points for walkers!")); + #endif } else if (BeginSpawnPoints.Num() < NumberOfWalkers) { + #ifdef CARLA_AI_WALKERS_EXTRA_LOG UE_LOG(LogCarla, Warning, TEXT("Requested %d walkers, but we only have %d spawn points. Some will fail to spawn."), NumberOfWalkers, BeginSpawnPoints.Num()); + #endif } GetRandomEngine()->Shuffle(BeginSpawnPoints); @@ -97,7 +102,9 @@ void AWalkerSpawnerBase::BeginPlay() ++Count; } } + #ifdef CARLA_AI_WALKERS_EXTRA_LOG UE_LOG(LogCarla, Log, TEXT("Spawned %d walkers at begin play."), Count); + #endif } } @@ -118,7 +125,9 @@ void AWalkerSpawnerBase::Tick(float DeltaTime) if(BlackListedWalker != nullptr && controller!=nullptr && IsValid(BlackListedWalker)) { const auto Status = GetWalkerStatus(BlackListedWalker); + #ifdef CARLA_AI_WALKERS_EXTRA_LOG UE_LOG(LogCarla, Log, TEXT("Watching walker %s with state %d"), *UKismetSystemLibrary::GetDisplayName(BlackListedWalker), (int)Status); + #endif switch(Status) { case EWalkerStatus::RunOver:{ @@ -139,7 +148,9 @@ void AWalkerSpawnerBase::Tick(float DeltaTime) { if(!SetRandomWalkerDestination(BlackListedWalker)) { + #ifdef CARLA_AI_WALKERS_EXTRA_LOG UE_LOG(LogCarla,Error,TEXT("Could not set a random destination to walker %s"),*UKismetSystemLibrary::GetDisplayName(BlackListedWalker)); + #endif } } break; @@ -160,8 +171,10 @@ void AWalkerSpawnerBase::Tick(float DeltaTime) } break; } - } + } + #ifdef CARLA_AI_WALKERS_EXTRA_LOG UE_LOG(LogCarla, Log, TEXT("New state for walker %s : %d"), *UKismetSystemLibrary::GetDisplayName(BlackListedWalker), (int)GetWalkerStatus(BlackListedWalker)); + #endif } } @@ -208,9 +221,11 @@ bool AWalkerSpawnerBase::SetRandomWalkerDestination(ACharacter *Walker) const auto &DestinationPoint = GetRandomSpawnPoint(); auto Controller = GetController(Walker); if(!Controller) { + #ifdef CARLA_AI_WALKERS_EXTRA_LOG UE_LOG(LogCarla, Warning, TEXT("AWalkerSpawnerBase::SetRandomWalkerDestination: Walker %s has no controller"), *UKismetSystemLibrary::GetDisplayName(Walker) ); + #endif return false; } const EPathFollowingRequestResult::Type request_result = Controller->MoveToLocation(DestinationPoint.GetActorLocation(),-1.0f,false,true,true,true,nullptr,true); @@ -218,13 +233,17 @@ bool AWalkerSpawnerBase::SetRandomWalkerDestination(ACharacter *Walker) { case EPathFollowingRequestResult::Type::Failed: { + #ifdef CARLA_AI_WALKERS_EXTRA_LOG UE_LOG(LogCarla, Warning, TEXT("AWalkerSpawnerBase::SetRandomWalkerDestination: Bad destination point %s"), *UKismetSystemLibrary::GetDisplayName(&DestinationPoint) - ); + ); + #endif return false; } case EPathFollowingRequestResult::Type::AlreadyAtGoal:{ - UE_LOG(LogCarla, Log, TEXT("AWalkerSpawnerBase::SetRandomWalkerDestination already in destination, generating new location")); + #ifdef CARLA_AI_WALKERS_EXTRA_LOG + UE_LOG(LogCarla, Log, TEXT("AWalkerSpawnerBase::SetRandomWalkerDestination already in destination, generating new location")); + #endif return SetRandomWalkerDestination(Walker); } default: case EPathFollowingRequestResult::Type::RequestSuccessful: return true; @@ -299,17 +318,20 @@ bool AWalkerSpawnerBase::TrySetDestination(ACharacter &Walker) // Try to retrieve controller. auto Controller = GetController(&Walker); if (Controller == nullptr) { - UE_LOG(LogCarla, Warning, TEXT("Could not get valid controller for walker: %s"), *Walker.GetName()); + UE_LOG(LogCarla, Warning, TEXT("Could not get valid controller for walker: %s"), *Walker.GetName()); return false; } // Try find destination. FVector Destination; if (!TryGetValidDestination(Walker.GetActorLocation(), Destination)) { - UE_LOG(LogCarla, Warning, - TEXT("Could not get a new destiny: %s for walker: %s"), - *Destination.ToString(), *Walker.GetName() - ); + #ifdef CARLA_AI_WALKERS_EXTRA_LOG + UE_LOG( + LogCarla, Warning, + TEXT("Could not get a new destiny: %s for walker: %s"), + *Destination.ToString(), *Walker.GetName() + ); + #endif return false; } From 5e423bcadc6aea58c3f86c8098aabaefe56d73e5 Mon Sep 17 00:00:00 2001 From: "CVC\\jbelon" Date: Thu, 12 Apr 2018 18:09:34 +0200 Subject: [PATCH 22/22] Minor fix to be able to Build --- .../Carla/Source/Carla/Settings/CarlaSettingsDelegate.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Settings/CarlaSettingsDelegate.cpp b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Settings/CarlaSettingsDelegate.cpp index 800f2e376..91749a64a 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Settings/CarlaSettingsDelegate.cpp +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Settings/CarlaSettingsDelegate.cpp @@ -10,7 +10,7 @@ #include "Engine/StaticMesh.h" #include "Engine/PostProcessVolume.h" #include "UObjectIterator.h" - +#include "Async.h" ///quality settings configuration between runs EQualitySettingsLevel UCarlaSettingsDelegate::AppliedLowPostResetQualitySettingsLevel = EQualitySettingsLevel::Epic; @@ -22,8 +22,7 @@ UCarlaSettingsDelegate::UCarlaSettingsDelegate() : void UCarlaSettingsDelegate::Reset() { - GetLocalWorld()->GetTimerManager().ClearAllTimersForObject(this); - AppliedLowPostResetQualitySettingsLevel = EQualitySettingsLevel::None; + AppliedLowPostResetQualitySettingsLevel = EQualitySettingsLevel::None; } void UCarlaSettingsDelegate::RegisterSpawnHandler(UWorld *InWorld) @@ -63,7 +62,7 @@ void UCarlaSettingsDelegate::ApplyQualitySettingsLevelPostRestart() { CheckCarlaSettings(nullptr); UWorld *InWorld = CarlaSettings->GetWorld(); - InWorld->GetTimerManager().ClearAllTimersForObject(this); + EQualitySettingsLevel QualitySettingsLevel = CarlaSettings->GetQualitySettingsLevel(); if(AppliedLowPostResetQualitySettingsLevel==QualitySettingsLevel) return;