From c8f5aa1521a057600efc83ee2eefc49be00be3e4 Mon Sep 17 00:00:00 2001 From: Arnaud Jamin Date: Thu, 6 Feb 2025 02:18:33 -0500 Subject: [PATCH] Remove the Selection window runtime setter for the raycast. Replace it with settings defined in the CogEngine asset. --- Content/Core/Debug/DA_Debug_Engine.uasset | Bin 12143 -> 12299 bytes .../Private/CogEngineWindow_Selection.cpp | 58 ++++++++++++------ .../CogEngine/Public/CogEngineDataAsset.h | 9 +++ .../Public/CogEngineWindow_Selection.h | 23 +++---- .../CogAll/Source/CogAll/Private/CogAll.cpp | 4 +- 5 files changed, 57 insertions(+), 37 deletions(-) diff --git a/Content/Core/Debug/DA_Debug_Engine.uasset b/Content/Core/Debug/DA_Debug_Engine.uasset index 67ca6d26dbc99570a6c8b2c07f01055baea53d54..e7d7dbd77fa6b919e1e82947b05076491d496a12 100644 GIT binary patch literal 12299 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 TsO9aMi?4lk*W?+-BLn{bjeZzX literal 12143 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 diff --git a/Plugins/Cog/Source/CogEngine/Private/CogEngineWindow_Selection.cpp b/Plugins/Cog/Source/CogEngine/Private/CogEngineWindow_Selection.cpp index f60ef4f..bba5ab7 100644 --- a/Plugins/Cog/Source/CogEngine/Private/CogEngineWindow_Selection.cpp +++ b/Plugins/Cog/Source/CogEngine/Private/CogEngineWindow_Selection.cpp @@ -28,10 +28,11 @@ void FCogEngineWindow_Selection::Initialize() bHasMenu = true; bHasWidget = true; bIsWidgetVisible = true; - ActorClasses = { AActor::StaticClass(), ACharacter::StaticClass() }; Config = GetConfig(); + Asset = GetAsset(); + FCogWindowConsoleCommandManager::RegisterWorldConsoleCommand( *ToggleSelectionModeCommand, TEXT("Toggle the actor selection mode"), @@ -108,9 +109,10 @@ void FCogEngineWindow_Selection::TryReapplySelection() const TSubclassOf FCogEngineWindow_Selection::GetSelectedActorClass() const { TSubclassOf SelectedClass = AActor::StaticClass(); - if (ActorClasses.IsValidIndex(Config->SelectedClassIndex)) + const TArray>& SelectionFilters = GetSelectionFilters(); + if (SelectionFilters.IsValidIndex(Config->SelectedClassIndex)) { - SelectedClass = ActorClasses[Config->SelectedClassIndex]; + SelectedClass = SelectionFilters[Config->SelectedClassIndex]; } return SelectedClass; @@ -134,7 +136,10 @@ void FCogEngineWindow_Selection::RenderTick(float DeltaTime) if (GetOwner()->GetActivateSelectionMode()) { - TickSelectionMode(); + if (TickSelectionMode() == false) + { + GetOwner()->SetActivateSelectionMode(false); + } } if (const AActor* Actor = GetSelection()) @@ -185,7 +190,7 @@ void FCogEngineWindow_Selection::RenderContent() bool FCogEngineWindow_Selection::DrawSelectionCombo() { AActor* NewSelection = nullptr; - const bool result = FCogWindowWidgets::ActorsListWithFilters(NewSelection, *GetWorld(), ActorClasses, Config->SelectedClassIndex, &Filter, GetLocalPlayerPawn()); + const bool result = FCogWindowWidgets::ActorsListWithFilters(NewSelection, *GetWorld(), GetSelectionFilters(), Config->SelectedClassIndex, &Filter, GetLocalPlayerPawn()); if (result) { SetGlobalSelection(NewSelection); @@ -195,26 +200,18 @@ bool FCogEngineWindow_Selection::DrawSelectionCombo() } //-------------------------------------------------------------------------------------------------------------------------- -void FCogEngineWindow_Selection::TickSelectionMode() +bool FCogEngineWindow_Selection::TickSelectionMode() { if (ImGui::IsMouseClicked(ImGuiMouseButton_Right)) - { - GetOwner()->SetActivateSelectionMode(false); - return; - } + { return false; } APlayerController* PlayerController = GetLocalPlayerController(); if (PlayerController == nullptr) - { - GetOwner()->SetActivateSelectionMode(false); - return; - } + { return false; } ImGuiViewport* Viewport = ImGui::GetMainViewport(); if (Viewport == nullptr) - { - return; - } + { return false; } const ImVec2 ViewportPos = Viewport->Pos; const ImVec2 ViewportSize = Viewport->Size; @@ -245,7 +242,7 @@ void FCogEngineWindow_Selection::TickSelectionMode() FHitResult HitResult; for (int i = 0; i < 2; ++i) { - if (UKismetSystemLibrary::LineTraceSingle(GetWorld(), WorldOrigin, WorldOrigin + WorldDirection * 10000, TraceType, false, IgnoreList, EDrawDebugTrace::None, HitResult, true)) + if (UKismetSystemLibrary::LineTraceSingle(GetWorld(), WorldOrigin, WorldOrigin + WorldDirection * 10000, GetSelectionTraceChannel(), false, IgnoreList, EDrawDebugTrace::None, HitResult, true)) { if (SelectedActorClass == nullptr || HitResult.GetActor()->GetClass()->IsChildOf(SelectedActorClass)) { @@ -285,6 +282,8 @@ void FCogEngineWindow_Selection::TickSelectionMode() } } } + + return true; } //-------------------------------------------------------------------------------------------------------------------------- @@ -311,7 +310,7 @@ void FCogEngineWindow_Selection::RenderMainMenuWidget() "MenuActorSelection", NewSelection, *GetWorld(), - ActorClasses, + GetSelectionFilters(), Config->SelectedClassIndex, &Filter, GetLocalPlayerPawn(), @@ -343,4 +342,23 @@ void FCogEngineWindow_Selection::RenderPickButtonTooltip() "%s", TCHAR_TO_ANSI(*Shortcut)); FCogWindowWidgets::EndItemTooltipWrappedText(); } -} \ No newline at end of file +} + +//-------------------------------------------------------------------------------------------------------------------------- +const TArray>& FCogEngineWindow_Selection::GetSelectionFilters() const +{ + if (Asset != nullptr) + { return Asset->SelectionFilters; } + + static TArray> SelectionFilters = { ACharacter::StaticClass(), AActor::StaticClass(), AGameModeBase::StaticClass(), AGameStateBase::StaticClass() }; + return SelectionFilters; +} + +//-------------------------------------------------------------------------------------------------------------------------- + ETraceTypeQuery FCogEngineWindow_Selection::GetSelectionTraceChannel() const +{ + if (Asset != nullptr) + { return Asset->SelectionTraceChannel; } + + return UEngineTypes::ConvertToTraceType(ECC_Pawn); +} diff --git a/Plugins/Cog/Source/CogEngine/Public/CogEngineDataAsset.h b/Plugins/Cog/Source/CogEngine/Public/CogEngineDataAsset.h index 14b46fb..9da7bd9 100644 --- a/Plugins/Cog/Source/CogEngine/Public/CogEngineDataAsset.h +++ b/Plugins/Cog/Source/CogEngine/Public/CogEngineDataAsset.h @@ -3,6 +3,9 @@ #include "CoreMinimal.h" #include "Engine/DataAsset.h" #include "Engine/EngineTypes.h" +#include "GameFramework/Character.h" +#include "GameFramework/GameModeBase.h" +#include "GameFramework/GameStateBase.h" #include "CogEngineDataAsset.generated.h" class FCogWindow; @@ -111,4 +114,10 @@ public: UPROPERTY(Category = "Spawns", EditAnywhere, meta = (TitleProperty = "Name")) TArray SpawnGroups; + + UPROPERTY(Category = "Selection", EditAnywhere) + TArray> SelectionFilters = { ACharacter::StaticClass(), AActor::StaticClass(), AGameModeBase::StaticClass(), AGameStateBase::StaticClass() }; + + UPROPERTY(Category = "Selection", EditAnywhere) + TEnumAsByte SelectionTraceChannel = UEngineTypes::ConvertToTraceType(ECC_Pawn); }; diff --git a/Plugins/Cog/Source/CogEngine/Public/CogEngineWindow_Selection.h b/Plugins/Cog/Source/CogEngine/Public/CogEngineWindow_Selection.h index d478301..81430e7 100644 --- a/Plugins/Cog/Source/CogEngine/Public/CogEngineWindow_Selection.h +++ b/Plugins/Cog/Source/CogEngine/Public/CogEngineWindow_Selection.h @@ -2,6 +2,7 @@ #include "CoreMinimal.h" #include "CogCommonConfig.h" +#include "CogEngineDataAsset.h" #include "GameFramework/Actor.h" #include "CogWindow.h" #include "CogEngineWindow_Selection.generated.h" @@ -23,14 +24,6 @@ public: virtual void Shutdown() override; - const TArray>& GetActorClasses() const { return ActorClasses; } - - void SetActorClasses(const TArray>& Value) { ActorClasses = Value; } - - ETraceTypeQuery GetTraceType() const { return TraceType; } - - void SetTraceType(ETraceTypeQuery Value) { TraceType = Value; } - protected: virtual void TryReapplySelection() const; @@ -55,9 +48,13 @@ protected: virtual void RenderActorContextMenu(AActor& Actor); + virtual const TArray>& GetSelectionFilters() const; + + virtual ETraceTypeQuery GetSelectionTraceChannel() const; + TSubclassOf GetSelectedActorClass() const; - void TickSelectionMode(); + bool TickSelectionMode(); FVector LastSelectedActorLocation = FVector::ZeroVector; @@ -65,13 +62,11 @@ protected: int32 WaitInputReleased = 0; - TArray> ActorClasses; + TWeakObjectPtr Config; - ETraceTypeQuery TraceType = TraceTypeQuery1; + TWeakObjectPtr Asset; - TObjectPtr Config; - - ImGuiTextFilter Filter; + ImGuiTextFilter Filter; }; //-------------------------------------------------------------------------------------------------------------------------- diff --git a/Plugins/CogAll/Source/CogAll/Private/CogAll.cpp b/Plugins/CogAll/Source/CogAll/Private/CogAll.cpp index a796f99..b9733dc 100644 --- a/Plugins/CogAll/Source/CogAll/Private/CogAll.cpp +++ b/Plugins/CogAll/Source/CogAll/Private/CogAll.cpp @@ -82,9 +82,7 @@ void Cog::AddAllWindows(UCogWindowManager& CogWindowManager) CogWindowManager.AddWindow("Engine.Plots"); - FCogEngineWindow_Selection* SelectionWindow = CogWindowManager.AddWindow("Engine.Selection"); - SelectionWindow->SetActorClasses({ ACharacter::StaticClass(), AActor::StaticClass(), AGameModeBase::StaticClass(), AGameStateBase::StaticClass() }); - SelectionWindow->SetTraceType(UEngineTypes::ConvertToTraceType(ECC_Pawn)); + CogWindowManager.AddWindow("Engine.Selection"); CogWindowManager.AddWindow("Engine.Scalability");