From a39c8b277db0d43998516d1bcdb6072452c1c3aa Mon Sep 17 00:00:00 2001 From: Arnaud Jamin Date: Sun, 22 Oct 2023 23:16:00 -0400 Subject: [PATCH] CogInput: Add multiple IMC on the input data asset. Maybe propose a current imc --- Content/Core/Debug/DA_Debug_Input.uasset | Bin 1719 -> 1895 bytes .../Private/CogEngineWindow_OutputLog.cpp | 2 +- .../Private/CogInputWindow_Actions.cpp | 28 +++++++++++------- .../Private/CogInputWindow_Gamepad.cpp | 26 +++++++++------- .../CogInput/Public/CogInputDataAsset.h | 2 +- .../CogInput/Public/CogInputWindow_Actions.h | 4 ++- Source/CogSample/CogSampleCharacter.cpp | 21 +++++++++++-- TODO.txt | 4 --- 8 files changed, 57 insertions(+), 30 deletions(-) diff --git a/Content/Core/Debug/DA_Debug_Input.uasset b/Content/Core/Debug/DA_Debug_Input.uasset index 3870c4ce5c11a79c1bfa227470a0cb504aabee10..cba74ec886b0a2e946a9a326db007380ff7eee5c 100644 GIT binary patch delta 746 zcmdna`q*jy^Gx#p(GoM_+I89j^ zD5>wBn47BaoL`ix@0nLnTB7gi>m2W%kzZWGaA4ifuao(hmI-kI)ggpc``x@IZ($0p z=L8Ca05^nU_z83s50nk^G7O-r`vFuZ2$e)u2eJkPKyC(s-#~RBUx5G?b@gzCzkmw) zA?i>R!Ymeo%7G|gsDS~pf!Nf+LL9d`bBIBpNCg4h3L)|^OPD6VW0n@R0w3KBb5DVavh5`CrIQk(7%5s?_+Uc%><@^wVT;l*%+fh?)VQ? i3QdMk9s>g`R+wQTa8rOLAv+wI4N?m-h-Gp(TLJ)hYHaBM delta 570 zcmaFPx1D!_0i)zZLv21m1_p*iMj!zMoXnGX*wt+yOa=xfAmb-90|Ogaih*G#3rL26 z;V6&>;j2I#IJL$8-T(iN)7MXotv+3Ma^hJDM!|{Cg6-K@85o*DI+4JCAdm!#fy`-# z%JBo)zKI0|nR)5X`FSO&6(tO(v*jjF?q{4f*@J1>B<9e1cBm1YQ2IB}7%nIq>T)m- zUEMFBIzBAwIG|#@Q2Gy09S;_DQ1j9lKyHKqptryPo5jfLU|uJr4(4da$z3ecV%$*E zL9`~6Ey*_dAdAT43oNXYudo=33P6QHvEvA3J582iwPpob^>=a{s|)K%UQUKyJPiALN007b1M&keg diff --git a/Plugins/Cog/Source/CogEngine/Private/CogEngineWindow_OutputLog.cpp b/Plugins/Cog/Source/CogEngine/Private/CogEngineWindow_OutputLog.cpp index bcc7016..a04b59e 100644 --- a/Plugins/Cog/Source/CogEngine/Private/CogEngineWindow_OutputLog.cpp +++ b/Plugins/Cog/Source/CogEngine/Private/CogEngineWindow_OutputLog.cpp @@ -288,7 +288,7 @@ void UCogEngineWindow_OutputLog::RenderContent() ImGui::EndChild(); } - if (ImGui::BeginPopupContextItem()) + if (ImGui::BeginPopupContextItem("OutputLog")) { if (ImGui::MenuItem("Clear")) { diff --git a/Plugins/CogInput/Source/CogInput/Private/CogInputWindow_Actions.cpp b/Plugins/CogInput/Source/CogInput/Private/CogInputWindow_Actions.cpp index 0c96baf..820d7d7 100644 --- a/Plugins/CogInput/Source/CogInput/Private/CogInputWindow_Actions.cpp +++ b/Plugins/CogInput/Source/CogInput/Private/CogInputWindow_Actions.cpp @@ -20,6 +20,12 @@ void UCogInputWindow_Actions::RenderHelp() ); } +//-------------------------------------------------------------------------------------------------------------------------- +void UCogInputWindow_Actions::ResetConfig() +{ + RepeatPeriod = 0.5f; +} + //-------------------------------------------------------------------------------------------------------------------------- UCogInputWindow_Actions::UCogInputWindow_Actions() { @@ -39,12 +45,6 @@ void UCogInputWindow_Actions::RenderContent() return; } - if (Asset->MappingContext == nullptr) - { - ImGui::Text("No MappingContext"); - return; - } - ULocalPlayer* LocalPlayer = GetWorld()->GetFirstLocalPlayerFromController(); if (LocalPlayer == nullptr) { @@ -80,14 +80,22 @@ void UCogInputWindow_Actions::RenderContent() if (Actions.Num() == 0) { - for (const FEnhancedActionKeyMapping& Mapping : Asset->MappingContext->GetMappings()) + for (TObjectPtr MappingContext : Asset->MappingContexts) { - if (Mapping.Action != nullptr && Actions.ContainsByPredicate([&Mapping](const FCogInjectActionInfo& ActionInfo) { return Mapping.Action == ActionInfo.Action; }) == false) + for (const FEnhancedActionKeyMapping& Mapping : MappingContext->GetMappings()) { - FCogInjectActionInfo& ActionInfo = Actions.AddDefaulted_GetRef(); - ActionInfo.Action = Mapping.Action; + if (Mapping.Action != nullptr && Actions.ContainsByPredicate([&Mapping](const FCogInjectActionInfo& ActionInfo) { return Mapping.Action == ActionInfo.Action; }) == false) + { + FCogInjectActionInfo& ActionInfo = Actions.AddDefaulted_GetRef(); + ActionInfo.Action = Mapping.Action; + } } } + + Actions.Sort([](const FCogInjectActionInfo& Lhs, const FCogInjectActionInfo& Rhs) + { + return GetNameSafe(Lhs.Action).Compare(GetNameSafe(Rhs.Action)) < 0; + }); } if (ImGui::BeginTable("Actions", 3, ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_Resizable | ImGuiTableFlags_NoBordersInBodyUntilResize)) diff --git a/Plugins/CogInput/Source/CogInput/Private/CogInputWindow_Gamepad.cpp b/Plugins/CogInput/Source/CogInput/Private/CogInputWindow_Gamepad.cpp index caa4e2e..4370ebc 100644 --- a/Plugins/CogInput/Source/CogInput/Private/CogInputWindow_Gamepad.cpp +++ b/Plugins/CogInput/Source/CogInput/Private/CogInputWindow_Gamepad.cpp @@ -62,7 +62,7 @@ void UCogInputWindow_Gamepad::InputContextMenu(const FKey& Key, FCogInjectAction if (ActionInfoButton != nullptr && ActionInfoButton->Action != nullptr && ActionInfoButton->Action->ValueType == EInputActionValueType::Axis1D) { - FCogWindowWidgets::SliderWithReset("X", &ActionInfo2D->X, -1.0f, 1.0f, 0.0f, "%0.2f"); + FCogWindowWidgets::SliderWithReset("X", &ActionInfoButton->X, -1.0f, 1.0f, 0.0f, "%0.2f"); } if (ActionInfo2D != nullptr) @@ -236,7 +236,11 @@ void UCogInputWindow_Gamepad::RenderContent() return; } - if (Asset != nullptr && Asset->MappingContext != nullptr) + if (Asset == nullptr) + { + ImGui::Text("No Input Asset"); + } + else { if (Actions.Num() == 0) { @@ -267,20 +271,20 @@ void UCogInputWindow_Gamepad::RenderContent() Actions.FindOrAdd(EKeys:: Gamepad_DPad_Right); Actions.FindOrAdd(EKeys:: Gamepad_DPad_Left); - for (const FEnhancedActionKeyMapping& Mapping : Asset->MappingContext->GetMappings()) + for (TObjectPtr MappingContext : Asset->MappingContexts) { - if (Mapping.Action != nullptr) + for (const FEnhancedActionKeyMapping& Mapping : MappingContext->GetMappings()) { - FCogInjectActionInfo& ActionInfo = Actions.FindOrAdd(Mapping.Key); - ActionInfo.Action = Mapping.Action; + if (Mapping.Action != nullptr) + { + FCogInjectActionInfo& ActionInfo = Actions.FindOrAdd(Mapping.Key); + ActionInfo.Action = Mapping.Action; + } } } } } - else - { - ImGui::Text("No Action Asset"); - } + const float AspectRatio = 0.55f; const float StickAmplitude = 0.04f; @@ -311,7 +315,7 @@ void UCogInputWindow_Gamepad::RenderContent() DrawList = ImGui::GetWindowDrawList(); ImGui::Dummy(bShowAsOverlay ? CanvasMax - CanvasMin : ContentSize); - if (ImGui::BeginPopupContextItem()) + if (ImGui::BeginPopupContextItem("Gamepad")) { if (ImGui::Button("Close", ImVec2(-1.0f, 0))) { diff --git a/Plugins/CogInput/Source/CogInput/Public/CogInputDataAsset.h b/Plugins/CogInput/Source/CogInput/Public/CogInputDataAsset.h index 6dc5f12..191ceb6 100644 --- a/Plugins/CogInput/Source/CogInput/Public/CogInputDataAsset.h +++ b/Plugins/CogInput/Source/CogInput/Public/CogInputDataAsset.h @@ -15,5 +15,5 @@ public: UCogInputDataAsset() {} UPROPERTY(EditAnywhere) - TObjectPtr MappingContext; + TArray> MappingContexts; }; diff --git a/Plugins/CogInput/Source/CogInput/Public/CogInputWindow_Actions.h b/Plugins/CogInput/Source/CogInput/Public/CogInputWindow_Actions.h index f947de4..151fc42 100644 --- a/Plugins/CogInput/Source/CogInput/Public/CogInputWindow_Actions.h +++ b/Plugins/CogInput/Source/CogInput/Public/CogInputWindow_Actions.h @@ -19,7 +19,9 @@ public: protected: - void RenderHelp(); + virtual void ResetConfig() override; + + virtual void RenderHelp() override; virtual void RenderContent() override; diff --git a/Source/CogSample/CogSampleCharacter.cpp b/Source/CogSample/CogSampleCharacter.cpp index 9ebe07b..2154b10 100644 --- a/Source/CogSample/CogSampleCharacter.cpp +++ b/Source/CogSample/CogSampleCharacter.cpp @@ -393,9 +393,26 @@ void ACogSampleCharacter::OnAbilityInputStarted(const FInputActionValue& Value, { return; } - + Spec->InputPressed = true; - AbilitySystem->TryActivateAbility(Handle); + + //----------------------------------------------------- + // Replicate button press if ability is already active + //----------------------------------------------------- + if (Spec->IsActive()) + { + const UGameplayAbility* AbilityToActivate = Spec->GetPrimaryInstance(); + if (AbilityToActivate->bReplicateInputDirectly && AbilitySystem->IsOwnerActorAuthoritative() == false) + { + AbilitySystem->ServerSetInputPressed(Spec->Handle); + } + AbilitySystem->AbilitySpecInputPressed(*Spec); + AbilitySystem->InvokeReplicatedEvent(EAbilityGenericReplicatedEvent::InputPressed, Spec->Handle, Spec->ActivationInfo.GetActivationPredictionKey()); + } + else + { + AbilitySystem->TryActivateAbility(Handle); + } } //-------------------------------------------------------------------------------------------------------------------------- diff --git a/TODO.txt b/TODO.txt index b9a7a59..3e36b3d 100644 --- a/TODO.txt +++ b/TODO.txt @@ -9,10 +9,6 @@ - CogEngine: Stat main menu widget could have a tooltip on each stat with a control to change set the emulation (FPS, Ping, Packetloss) - CogEngine: Add screen settings (fullscreen, borderless, window and resolution) -- CogInput: Add multiple IMC on the input data asset. Maybe propose a current imc - -- CogAbilities: Apply tweaks on spawn - - CogSample: Add a custom window in sample (changing the character faction) - CogSample: Create more abilities