From 7b0ed3d05f26c813c0fbc6ece79854d762fa11a0 Mon Sep 17 00:00:00 2001 From: Arnaud Jamin Date: Fri, 13 Oct 2023 00:37:07 -0400 Subject: [PATCH] fix scale replication and other fixes --- Content/Core/Debug/Cheats/GE_Cheat_Big.uasset | Bin 0 -> 12471 bytes .../Core/Debug/Cheats/GE_Cheat_Small.uasset | Bin 0 -> 12497 bytes Content/Core/Debug/DA_Debug_Ability.uasset | Bin 12912 -> 13362 bytes .../CogAbility/Private/CogAbilityHelper.cpp | 118 ++++++++++++ .../Private/CogAbilityWindow_Attributes.cpp | 100 ++-------- .../Private/CogAbilityWindow_Effects.cpp | 38 ++-- .../CogAbility/Public/CogAbilityHelper.h | 11 ++ .../Public/CogAbilityWindow_Attributes.h | 6 + .../Public/CogAbilityWindow_Effects.h | 8 + .../Source/CogWindow/Private/CogWindow.cpp | 18 +- .../CogWindow/Private/CogWindow_Settings.cpp | 12 +- Source/CogSample/CogSampleCharacter.cpp | 9 +- .../CogWindow_Settings.cpp | 102 ++++++++++ .../CogWindow.cpp | 174 ++++++++++++++++++ 14 files changed, 477 insertions(+), 119 deletions(-) create mode 100644 Content/Core/Debug/Cheats/GE_Cheat_Big.uasset create mode 100644 Content/Core/Debug/Cheats/GE_Cheat_Small.uasset create mode 100644 enc_temp_folder/429ace6029d82fe59d8569151e8ccf24/CogWindow_Settings.cpp create mode 100644 enc_temp_folder/82d8d8399af843a93de4bae55a9b0/CogWindow.cpp diff --git a/Content/Core/Debug/Cheats/GE_Cheat_Big.uasset b/Content/Core/Debug/Cheats/GE_Cheat_Big.uasset new file mode 100644 index 0000000000000000000000000000000000000000..764584160725897b58e8bf7b06bf5d0507080f21 GIT binary patch literal 12471 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 literal 0 HcmV?d00001 diff --git a/Content/Core/Debug/DA_Debug_Ability.uasset b/Content/Core/Debug/DA_Debug_Ability.uasset index eaac0eabe667342f5bfb22c7a6b7abd1e6e9176a..cb8e66146c22ce9ce42e138479040069cc503b9b 100644 GIT binary patch delta 1990 zcma)+ZA?>F7{|{k0v4z(FQstrEw?LBZ4qllB`zkYC{6IgNSv8**;+sbE(~h2#P=20 zTt95am&f;*_yMzpEz!gqLyR$7mboR13d|*bAijmTvMC6gFN~?|IhWJgW9q_5{(YX` zbN<2+KR7&Qur8XremW(@fJv>5kj45G zAsGd1hL8_1GJS=5Hgs`YUFWy8CsTj<@Z5vz!|NwHerk$#uf34-V_WZ?x>IarwoVsV z=sM>hcD$%yYrGs&IM|8&STZcu_E29MEydH77*}m>CWjA4x;>1v!Sq3D{HVUQmFzth z+zxj$tnfVDqMbM1HQ3D9>t7S7ZfUCjIDl<|YBD|<>D7*8WzkI5gM|~v{T13FQwH?~ z`Q{Bg-oq0#^4!NG3qhVYfNEBaFUc=ZyFf<;`c9yzKxRwgnw0_t1d0fBR-hXKO$jtN zJ8_4%1lpRdhT~7fpYu0-4?B3C^gZyo>*(7#1K+Rc+x2?iMiTn~18Cfx#2DbUO+5Ca zuW1IpK2URP;a9u+u)BFC-RNtXf$tjnK6$;*K*G?RqZ(t!2*W;sdIh>IP!9>iU@Sp zn*1d1^HU{1$qlR87C#qvvQYm&U7dXHDt^?$B)&hf&dYk(%pnuwr9$W|cR-Sfz9o)*U!IeC}Q~{^+->kPHzCil~>L1iI)W4{4)DzSg>TlF@)L*DasHdpMs7cfV z)P2+_>LF?b#Rl7j-Mm+z($<=G0&m^1LaoP^OEcMBKJ77UKNnO`S6T`)6H+xD@RrAf zx!8ym2f!h1g!k+Ugk%$RODgP;6u2dM;cZ!gePt$CDi^_sJqwmA7WB-gD z%W?^v#!lwSQHtmo&eXt3?5mSZDR@~!P?Ere9FphEVwbgESg2&drwY(VXrBjF_9FO0 zcEjfw^Kr57?d5b5M(tB{7`7BE_`AX>!+qCh@Qu1VUh8+s5OlQ1SQ~LHq0myg4BmCN zVRXY%mj&}GSXu1Vc@Vj$IHczjjwP_QWSmCz4Wjx6HLfbSQ(7LcmAN9ZT{#hUP5?)w3FgJT-8oWHzi=m<>O8-hf7Tjpi;JPNAc4#@huG a3kvB&?TlBVdSM&f^ku+W9~N<%5&Q>x2;I{F delta 2238 zcma)-TSydP6vyYYl=ZUab=_rWcVu*3%Pkw%9xOraVufgiSehl3mn=&&kt|Iu2m~K8 z&ZA&ZNDpF0^B|#55%p4GH#E#rx+rdzmYKG8Ip6N=W;#3g!GF$W{=YNd%+4}*%BG52 z^SmEv8HR^`RTvcd1&1)W8c;2SW(?CF2m@Agt}|sAFHDRYhS}&i#V~I$rz;`CsWTY) zH<`_?dTUl!VqZtq;3ZA&T+@S+u^Sn8L+)4fjAUPN=!}2s4=%c` zo!ClE5HAzKhpfXbMvE%d5D`QCM!ZB{bpU}4feVd=5_edNV+bFSazTnTEcJavU)c(L zAJBK)v(Jk;3kUC{kO3m+x=@sk4eyOE9l5uLmkak@63d zzgDIqRp5czqeyjnp!Ofl*snBWkuOil2exqeXLvx7 z+MExj!A_-#&`*M1Q(-p&>X?Xj4yH5 zOK$otNRx8A0R0i0^Fy)xjrMuePt-5e0_q#;2kI+o2K5~^hnhv%QJ+zhs43Jm>I;f4 zI-P!Y`k`EV(x((ZIel7jSQ|?G>4!}6h<2Tom}}{FaHTi{!>BMxlnPgKn-|m@^sqYU#C}$^8s^z( z;JCGrZZJZU(aAO$;$RT-9Y%ms&dC$b2)FP$bk;7+4aj#I)o_K2gl0AXdbt@g0k BaseValue) + { + Color = Asset->PositiveEffectColor; + } + else if (CurrentValue < BaseValue) + { + Color = Asset->NegativeEffectColor; + } + else + { + Color = Asset->NeutralEffectColor; + } + } + + return FCogImguiHelper::ToImVec4(Color); +} + +//-------------------------------------------------------------------------------------------------------------------------- +ImVec4 FCogAbilityHelper::GetEffectColor(const UCogAbilityDataAsset* Asset, const UGameplayEffect& Effect) +{ + FLinearColor Color = FLinearColor::White; + + if (Asset != nullptr) + { + const FGameplayTagContainer& Tags = Effect.InheritableGameplayEffectTags.CombinedTags; + + if (Tags.HasTag(Asset->NegativeEffectTag)) + { + Color = Asset->NegativeEffectColor; + } + else if (Tags.HasTag(Asset->PositiveEffectTag)) + { + Color = Asset->PositiveEffectColor; + } + else + { + Color = Asset->NeutralEffectColor; + } + } + + return FCogImguiHelper::ToImVec4(Color); +} + +//-------------------------------------------------------------------------------------------------------------------------- +ImVec4 FCogAbilityHelper::GetEffectModifierColor(const UCogAbilityDataAsset* Asset, float ModifierValue, EGameplayModOp::Type ModifierOp, float BaseValue) +{ + FLinearColor Color = Asset->NeutralEffectColor; + + switch (ModifierOp) + { + case EGameplayModOp::Additive: + { + if (ModifierValue > 0.0f) + { + Color = Asset->PositiveEffectColor; + } + else if (ModifierValue < 0.0f) + { + Color = Asset->NegativeEffectColor; + } + break; + } + + case EGameplayModOp::Multiplicitive: + { + if (ModifierValue > 1.0f) + { + Color = Asset->PositiveEffectColor; + } + else if (ModifierValue < 1.0f) + { + Color = Asset->NegativeEffectColor; + } + break; + } + + case EGameplayModOp::Division: + { + if (ModifierValue < 1.0f) + { + Color = Asset->PositiveEffectColor; + } + else if (ModifierValue > 1.0f) + { + Color = Asset->NegativeEffectColor; + } + break; + } + + case EGameplayModOp::Override: + { + if (ModifierValue > BaseValue) + { + Color = Asset->PositiveEffectColor; + } + else if (ModifierValue < BaseValue) + { + Color = Asset->NegativeEffectColor; + } + break; + } + } + + return FCogImguiHelper::ToImVec4(Color); +} \ No newline at end of file diff --git a/Plugins/CogAbility/Source/CogAbility/Private/CogAbilityWindow_Attributes.cpp b/Plugins/CogAbility/Source/CogAbility/Private/CogAbilityWindow_Attributes.cpp index 99d6378..bd7336f 100644 --- a/Plugins/CogAbility/Source/CogAbility/Private/CogAbilityWindow_Attributes.cpp +++ b/Plugins/CogAbility/Source/CogAbility/Private/CogAbilityWindow_Attributes.cpp @@ -281,7 +281,6 @@ void UCogAbilityWindow_Attributes::RenderContent() } } - //-------------------------------------------------------------------------------------------------------------------------- void UCogAbilityWindow_Attributes::DrawAttributeInfo(const UAbilitySystemComponent& AbilitySystemComponent, const FGameplayAttribute& Attribute) { @@ -295,23 +294,6 @@ void UCogAbilityWindow_Attributes::DrawAttributeInfo(const UAbilitySystemCompone const float BaseValue = AbilitySystemComponent.GetNumericAttributeBase(Attribute); const float CurrentValue = AbilitySystemComponent.GetNumericAttribute(Attribute); - FLinearColor Color = FLinearColor::White; - if (Asset != nullptr) - { - if (CurrentValue > BaseValue) - { - Color = Asset->PositiveEffectColor; - } - else if (CurrentValue < BaseValue) - { - Color = Asset->NegativeEffectColor; - } - else - { - Color = Asset->NeutralEffectColor; - } - } - //------------------------ // Name //------------------------ @@ -337,7 +319,7 @@ void UCogAbilityWindow_Attributes::DrawAttributeInfo(const UAbilitySystemCompone ImGui::TableNextColumn(); ImGui::TextColored(TextColor, "Current Value"); ImGui::TableNextColumn(); - ImGui::PushStyleColor(ImGuiCol_Text, FCogImguiHelper::ToImVec4(Color)); + ImGui::PushStyleColor(ImGuiCol_Text, GetAttributeColor(AbilitySystemComponent, Attribute)); ImGui::Text("%0.2f", CurrentValue); ImGui::PopStyleColor(1); @@ -357,68 +339,6 @@ void UCogAbilityWindow_Attributes::DrawAttributeInfo(const UAbilitySystemCompone { const FModifierSpec& ModSpec = ActiveEffect->Spec.Modifiers[i]; const FGameplayModifierInfo& ModInfo = ActiveEffect->Spec.Def->Modifiers[i]; - const float ModValue = ModSpec.GetEvaluatedMagnitude(); - - FLinearColor ModColor = FLinearColor::White; - if (Asset != nullptr) - { - ModColor = Asset->NeutralEffectColor; - - switch (ModInfo.ModifierOp) - { - case EGameplayModOp::Additive: - { - if (ModValue > 0.0f) - { - ModColor = Asset->PositiveEffectColor; - } - else if (ModValue < 0.0f) - { - ModColor = Asset->NegativeEffectColor; - } - break; - } - - case EGameplayModOp::Multiplicitive: - { - if (ModValue > 1.0f) - { - ModColor = Asset->PositiveEffectColor; - } - else if (ModValue < 1.0f) - { - ModColor = Asset->NegativeEffectColor; - } - break; - } - - case EGameplayModOp::Division: - { - if (ModValue < 1.0f) - { - ModColor = Asset->PositiveEffectColor; - } - else if (ModValue > 1.0f) - { - ModColor = Asset->NegativeEffectColor; - } - break; - } - - case EGameplayModOp::Override: - { - if (ModValue > BaseValue) - { - ModColor = Asset->PositiveEffectColor; - } - else if (ModValue < BaseValue) - { - ModColor = Asset->NegativeEffectColor; - } - break; - } - } - } if (ModInfo.Attribute == Attribute) { @@ -430,7 +350,7 @@ void UCogAbilityWindow_Attributes::DrawAttributeInfo(const UAbilitySystemCompone ImGui::TableNextColumn(); ImGui::Text("%s", TCHAR_TO_ANSI(*FCogAbilityHelper::CleanupName(GetNameSafe(ActiveEffect->Spec.Def)))); ImGui::Text("%s", TCHAR_TO_ANSI(*EGameplayModOpToString(ModInfo.ModifierOp))); - ImGui::TextColored(FCogImguiHelper::ToImVec4(ModColor), "%0.2f", ModSpec.GetEvaluatedMagnitude()); + ImGui::TextColored(GetEffectModifierColor(ModSpec, ModInfo, BaseValue), "%0.2f", ModSpec.GetEvaluatedMagnitude()); } } } @@ -438,3 +358,19 @@ void UCogAbilityWindow_Attributes::DrawAttributeInfo(const UAbilitySystemCompone ImGui::EndTable(); } } + +//-------------------------------------------------------------------------------------------------------------------------- +ImVec4 UCogAbilityWindow_Attributes::GetAttributeColor(const UAbilitySystemComponent& AbilitySystemComponent, const FGameplayAttribute& Attribute) const +{ + const float BaseValue = AbilitySystemComponent.GetNumericAttributeBase(Attribute); + const float CurrentValue = AbilitySystemComponent.GetNumericAttribute(Attribute); + ImVec4 Color = FCogAbilityHelper::GetAttributeColor(Asset.Get(), BaseValue, CurrentValue); + return Color; +} + +//-------------------------------------------------------------------------------------------------------------------------- +ImVec4 UCogAbilityWindow_Attributes::GetEffectModifierColor(const FModifierSpec& ModSpec, const FGameplayModifierInfo& ModInfo, float BaseValue) const +{ + const float ModValue = ModSpec.GetEvaluatedMagnitude(); + return FCogAbilityHelper::GetEffectModifierColor(Asset.Get(), ModSpec.GetEvaluatedMagnitude(), ModInfo.ModifierOp, BaseValue); +} \ No newline at end of file diff --git a/Plugins/CogAbility/Source/CogAbility/Private/CogAbilityWindow_Effects.cpp b/Plugins/CogAbility/Source/CogAbility/Private/CogAbilityWindow_Effects.cpp index 84d5638..581cc97 100644 --- a/Plugins/CogAbility/Source/CogAbility/Private/CogAbilityWindow_Effects.cpp +++ b/Plugins/CogAbility/Source/CogAbility/Private/CogAbilityWindow_Effects.cpp @@ -88,26 +88,7 @@ void UCogAbilityWindow_Effects::RenderEffectRow(const UAbilitySystemComponent& A //------------------------ ImGui::TableNextColumn(); - const FGameplayTagContainer& Tags = Effect.InheritableGameplayEffectTags.CombinedTags; - - FLinearColor Color = FLinearColor::White; - if (Asset != nullptr) - { - if (Tags.HasTag(Asset->NegativeEffectTag)) - { - Color = Asset->NegativeEffectColor; - } - else if (Tags.HasTag(Asset->PositiveEffectTag)) - { - Color = Asset->PositiveEffectColor; - } - else - { - Color = Asset->NeutralEffectColor; - } - } - - ImGui::PushStyleColor(ImGuiCol_Text, FCogImguiHelper::ToImVec4(Color)); + ImGui::PushStyleColor(ImGuiCol_Text, GetEffectColor(Effect)); if (ImGui::Selectable(TCHAR_TO_ANSI(*GetEffectName(Effect)), Selected == Index, ImGuiSelectableFlags_SpanAllColumns | ImGuiSelectableFlags_AllowItemOverlap | ImGuiSelectableFlags_AllowDoubleClick)) { @@ -263,6 +244,7 @@ void UCogAbilityWindow_Effects::RenderEffectInfo(const UAbilitySystemComponent& { const FModifierSpec& ModSpec = ActiveEffect.Spec.Modifiers[i]; const FGameplayModifierInfo& ModInfo = ActiveEffect.Spec.Def->Modifiers[i]; + const float AttributeBaseValue = AbilitySystemComponent.GetNumericAttributeBase(ModInfo.Attribute); ImGui::TableNextRow(); ImGui::TableNextColumn(); @@ -272,7 +254,7 @@ void UCogAbilityWindow_Effects::RenderEffectInfo(const UAbilitySystemComponent& ImGui::TableNextColumn(); ImGui::Text("%s", TCHAR_TO_ANSI(*ModInfo.Attribute.GetName())); ImGui::Text("%s", TCHAR_TO_ANSI(*EGameplayModOpToString(ModInfo.ModifierOp))); - ImGui::Text("%0.2f", ModSpec.GetEvaluatedMagnitude()); + ImGui::TextColored(GetEffectModifierColor(ModSpec, ModInfo, AttributeBaseValue), "%0.2f", ModSpec.GetEvaluatedMagnitude()); } ImGui::EndTable(); @@ -355,3 +337,17 @@ void UCogAbilityWindow_Effects::RenderPrediction(const FActiveGameplayEffect& Ac ImGui::Text("%s", TCHAR_TO_ANSI(*PredictionString)); } + +//-------------------------------------------------------------------------------------------------------------------------- +ImVec4 UCogAbilityWindow_Effects::GetEffectColor(const UGameplayEffect& Effect) const +{ + return FCogAbilityHelper::GetEffectColor(Asset.Get(), Effect); +} + +//-------------------------------------------------------------------------------------------------------------------------- +ImVec4 UCogAbilityWindow_Effects::GetEffectModifierColor(const FModifierSpec& ModSpec, const FGameplayModifierInfo& ModInfo, float BaseValue) const +{ + const float ModValue = ModSpec.GetEvaluatedMagnitude(); + return FCogAbilityHelper::GetEffectModifierColor(Asset.Get(), ModSpec.GetEvaluatedMagnitude(), ModInfo.ModifierOp, BaseValue); +} + diff --git a/Plugins/CogAbility/Source/CogAbility/Public/CogAbilityHelper.h b/Plugins/CogAbility/Source/CogAbility/Public/CogAbilityHelper.h index b2528c1..bf2f7e5 100644 --- a/Plugins/CogAbility/Source/CogAbility/Public/CogAbilityHelper.h +++ b/Plugins/CogAbility/Source/CogAbility/Public/CogAbilityHelper.h @@ -1,10 +1,21 @@ #pragma once #include "CoreMinimal.h" +#include "imgui.h" + +class UCogAbilityDataAsset; +class UGameplayEffect; +namespace EGameplayModOp { enum Type; } class COGABILITY_API FCogAbilityHelper { public: static FString CleanupName(FString Str); + + static ImVec4 GetAttributeColor(const UCogAbilityDataAsset* Asset, float BaseValue, float CurrentValue); + + static ImVec4 GetEffectColor(const UCogAbilityDataAsset* Asset, const UGameplayEffect& Effect); + + static ImVec4 GetEffectModifierColor(const UCogAbilityDataAsset* Asset, float ModifierValue, EGameplayModOp::Type ModifierOp, float BaseValue); }; diff --git a/Plugins/CogAbility/Source/CogAbility/Public/CogAbilityWindow_Attributes.h b/Plugins/CogAbility/Source/CogAbility/Public/CogAbilityWindow_Attributes.h index a0a2245..34a45e4 100644 --- a/Plugins/CogAbility/Source/CogAbility/Public/CogAbilityWindow_Attributes.h +++ b/Plugins/CogAbility/Source/CogAbility/Public/CogAbilityWindow_Attributes.h @@ -7,6 +7,8 @@ class UAbilitySystemComponent; class UCogAbilityDataAsset; struct FGameplayAttribute; +struct FModifierSpec; +struct FGameplayModifierInfo; UCLASS(Config = Cog) class COGABILITY_API UCogAbilityWindow_Attributes : public UCogWindow @@ -31,6 +33,10 @@ protected: virtual void DrawAttributeInfo(const UAbilitySystemComponent& AbilitySystemComponent, const FGameplayAttribute& Attribute); + virtual ImVec4 GetEffectModifierColor(const FModifierSpec& ModSpec, const FGameplayModifierInfo& ModInfo, float BaseValue) const; + + virtual ImVec4 GetAttributeColor(const UAbilitySystemComponent& AbilitySystemComponent, const FGameplayAttribute& Attribute) const; + private: UPROPERTY(Config) diff --git a/Plugins/CogAbility/Source/CogAbility/Public/CogAbilityWindow_Effects.h b/Plugins/CogAbility/Source/CogAbility/Public/CogAbilityWindow_Effects.h index 0380c36..3e56198 100644 --- a/Plugins/CogAbility/Source/CogAbility/Public/CogAbilityWindow_Effects.h +++ b/Plugins/CogAbility/Source/CogAbility/Public/CogAbilityWindow_Effects.h @@ -3,6 +3,7 @@ #include "CoreMinimal.h" #include "GameplayTagContainer.h" #include "CogWindow.h" +#include "imgui.h" #include "CogAbilityWindow_Effects.generated.h" class UAbilitySystemComponent; @@ -10,6 +11,9 @@ class UCogAbilityDataAsset; class UGameplayEffect; struct FActiveGameplayEffect; struct FActiveGameplayEffectHandle; +struct FGameplayModifierInfo; +struct FModifierSpec; +namespace EGameplayModOp { enum Type; }; UCLASS() class COGABILITY_API UCogAbilityWindow_Effects : public UCogWindow @@ -46,6 +50,10 @@ protected: virtual FString GetEffectName(const UGameplayEffect& Effect); + ImVec4 GetEffectColor(const UGameplayEffect& Effect) const; + + ImVec4 GetEffectModifierColor(const FModifierSpec& ModSpec, const FGameplayModifierInfo& ModInfo, float BaseValue) const; + UPROPERTY() TWeakObjectPtr Asset = nullptr; }; diff --git a/Plugins/CogWindow/Source/CogWindow/Private/CogWindow.cpp b/Plugins/CogWindow/Source/CogWindow/Private/CogWindow.cpp index 8527043..22cdb3f 100644 --- a/Plugins/CogWindow/Source/CogWindow/Private/CogWindow.cpp +++ b/Plugins/CogWindow/Source/CogWindow/Private/CogWindow.cpp @@ -82,20 +82,20 @@ void UCogWindow::Render(float DeltaTime) } } - if (bHasMenu) + if (ImGui::BeginPopupContextWindow()) { - if (ImGui::BeginPopupContextWindow()) + if (bHasMenu) { ImGui::Checkbox("Hide Menu", &bHideMenu); - - if (ImGui::Button("Reset")) - { - ResetConfig(); - } - ImGui::EndPopup(); } - } + if (ImGui::Button("Reset")) + { + ResetConfig(); + } + + ImGui::EndPopup(); + } RenderContent(); ImGui::End(); diff --git a/Plugins/CogWindow/Source/CogWindow/Private/CogWindow_Settings.cpp b/Plugins/CogWindow/Source/CogWindow/Private/CogWindow_Settings.cpp index 1aa9990..3c172fc 100644 --- a/Plugins/CogWindow/Source/CogWindow/Private/CogWindow_Settings.cpp +++ b/Plugins/CogWindow/Source/CogWindow/Private/CogWindow_Settings.cpp @@ -24,12 +24,6 @@ void UCogWindow_Settings::PostInitProperties() //-------------------------------------------------------------------------------------------------------------------------- void UCogWindow_Settings::RenderContent() { - ImGui::Checkbox("Compact Mode", &GetOwner()->bCompactMode); - - ImGui::Checkbox("Show Windows In Main Menu", &GetOwner()->bShowWindowsInMainMenu); - - ImGui::Checkbox("Show Window Help", &GetOwner()->bShowHelp); - FCogWindowWidgets::SetNextItemToShortWidth(); ImGui::SliderFloat("DPI Scale", &GetOwner()->DPIScale, 0.5f, 2.0f, "%.1f"); if (ImGui::IsItemDeactivatedAfterEdit()) @@ -37,6 +31,12 @@ void UCogWindow_Settings::RenderContent() GetOwner()->bRefreshDPIScale = true; } + ImGui::Checkbox("Compact Mode", &GetOwner()->bCompactMode); + + ImGui::Checkbox("Show Windows In Main Menu", &GetOwner()->bShowWindowsInMainMenu); + + ImGui::Checkbox("Show Window Help", &GetOwner()->bShowHelp); + if (ImGui::IsItemHovered()) { ImGui::BeginTooltip(); diff --git a/Source/CogSample/CogSampleCharacter.cpp b/Source/CogSample/CogSampleCharacter.cpp index 5a18385..4a8a289 100644 --- a/Source/CogSample/CogSampleCharacter.cpp +++ b/Source/CogSample/CogSampleCharacter.cpp @@ -625,7 +625,14 @@ void ACogSampleCharacter::OnGhostTagNewOrRemoved(const FGameplayTag InTag, int32 //-------------------------------------------------------------------------------------------------------------------------- void ACogSampleCharacter::OnScaleAttributeChanged(const FOnAttributeChangeData& Data) { - Scale = Data.NewValue; + //---------------------------------------------------------------------------------- + // 'Data.NewValue' is not used because it seems to only corresponds to the changes + // of the BaseValue which do not account for the temporary modifiers. + //---------------------------------------------------------------------------------- + + const float CurrentScaleValue = AbilitySystem->GetNumericAttribute(Data.Attribute); + Scale = CurrentScaleValue; + MARK_PROPERTY_DIRTY_FROM_NAME(ACogSampleCharacter, Scale, this); OnRep_Scale(); } diff --git a/enc_temp_folder/429ace6029d82fe59d8569151e8ccf24/CogWindow_Settings.cpp b/enc_temp_folder/429ace6029d82fe59d8569151e8ccf24/CogWindow_Settings.cpp new file mode 100644 index 0000000..1aa9990 --- /dev/null +++ b/enc_temp_folder/429ace6029d82fe59d8569151e8ccf24/CogWindow_Settings.cpp @@ -0,0 +1,102 @@ +#include "CogWindow_Settings.h" + +#include "CogImguiModule.h" +#include "InputCoreTypes.h" + +//-------------------------------------------------------------------------------------------------------------------------- +UCogWindow_Settings::UCogWindow_Settings() +{ + bHasMenu = false; + ToggleInputKey.Key = EKeys::Tab; +} + +//-------------------------------------------------------------------------------------------------------------------------- +void UCogWindow_Settings::PostInitProperties() +{ + Super::PostInitProperties(); + + if (ToggleInputKey.Key != EKeys::Invalid) + { + FCogImguiModule::Get().SetToggleInputKey(ToggleInputKey); + } +} + +//-------------------------------------------------------------------------------------------------------------------------- +void UCogWindow_Settings::RenderContent() +{ + ImGui::Checkbox("Compact Mode", &GetOwner()->bCompactMode); + + ImGui::Checkbox("Show Windows In Main Menu", &GetOwner()->bShowWindowsInMainMenu); + + ImGui::Checkbox("Show Window Help", &GetOwner()->bShowHelp); + + FCogWindowWidgets::SetNextItemToShortWidth(); + ImGui::SliderFloat("DPI Scale", &GetOwner()->DPIScale, 0.5f, 2.0f, "%.1f"); + if (ImGui::IsItemDeactivatedAfterEdit()) + { + GetOwner()->bRefreshDPIScale = true; + } + + if (ImGui::IsItemHovered()) + { + ImGui::BeginTooltip(); + ImGui::TextUnformatted("Change DPi Scale [Mouse Wheel]"); + ImGui::TextUnformatted("Reset DPi Scale [Middle Mouse]"); + ImGui::EndTooltip(); + } + + ImGui::Separator(); + + ImGui::Text("Toggle Input Key"); + + TArray Keys; + EKeys::GetAllKeys(Keys); + + bool HasKeyChanged = false; + FCogWindowWidgets::SetNextItemToShortWidth(); + if (ImGui::BeginCombo("Key", TCHAR_TO_ANSI(*ToggleInputKey.Key.ToString()))) + { + for (int32 i = 0; i < Keys.Num(); ++i) + { + const FKey Key = Keys[i]; + if (Key.IsDigital() == false || Key.IsDeprecated()) + { + continue; + } + + bool IsSelected = ToggleInputKey.Key == Key; + if (ImGui::Selectable(TCHAR_TO_ANSI(*Key.ToString()), IsSelected)) + { + ToggleInputKey.Key = Key; + HasKeyChanged = true; + } + } + ImGui::EndCombo(); + } + + FCogWindowWidgets::SetNextItemToShortWidth(); + HasKeyChanged |= FCogWindowWidgets::ComboboxEnum("Ctrl", ToggleInputKey.Ctrl); + + FCogWindowWidgets::SetNextItemToShortWidth(); + HasKeyChanged |= FCogWindowWidgets::ComboboxEnum("Shift", ToggleInputKey.Shift); + + FCogWindowWidgets::SetNextItemToShortWidth(); + HasKeyChanged |= FCogWindowWidgets::ComboboxEnum("Alt", ToggleInputKey.Alt); + + FCogWindowWidgets::SetNextItemToShortWidth(); + HasKeyChanged |= FCogWindowWidgets::ComboboxEnum("Cmd", ToggleInputKey.Cmd); + + if (HasKeyChanged) + { + FCogImguiModule::Get().SetToggleInputKey(ToggleInputKey); + } + + ImGui::Separator(); + + ImGui::Spacing(); + ImGui::Spacing(); + if (ImGui::Button("Reset All Windows Config")) + { + GetOwner()->ResetAllWindowsConfig(); + } +} diff --git a/enc_temp_folder/82d8d8399af843a93de4bae55a9b0/CogWindow.cpp b/enc_temp_folder/82d8d8399af843a93de4bae55a9b0/CogWindow.cpp new file mode 100644 index 0000000..89f5441 --- /dev/null +++ b/enc_temp_folder/82d8d8399af843a93de4bae55a9b0/CogWindow.cpp @@ -0,0 +1,174 @@ +#include "CogWindow.h" + +#include "CogDebugDraw.h" +#include "CogDebugSettings.h" +#include "CogWindowManager.h" +#include "CogWindowWidgets.h" +#include "Engine/World.h" +#include "imgui_internal.h" + +//-------------------------------------------------------------------------------------------------------------------------- +void UCogWindow::SetFullName(const FString& InFullName) +{ + FullName = InFullName; + + TArray Path; + int CharIndex = 0; + if (FullName.FindLastChar(TEXT('.'), CharIndex)) + { + Name = FullName.RightChop(CharIndex + 1); + } + else + { + Name = FullName; + } + + ID = ImHashStr(TCHAR_TO_ANSI(*FullName)); +} + +//-------------------------------------------------------------------------------------------------------------------------- +bool UCogWindow::CheckEditorVisibility() +{ + const UWorld* World = GetWorld(); + if (World == nullptr) + { + return false; + } + + if (World->WorldType != EWorldType::Game) + { + return false; + } + + if (World->WorldType == EWorldType::PIE) + { + return false; + } + + return true; +} + +//-------------------------------------------------------------------------------------------------------------------------- +void UCogWindow::Render(float DeltaTime) +{ + ImGuiWindowFlags WindowFlags = 0; + PreRender(WindowFlags); + + const FString WindowTitle = GetTitle() + "##" + Name; + + if (bHasMenu && bHideMenu == false) + { + WindowFlags |= ImGuiWindowFlags_MenuBar; + } + + if (ImGui::Begin(TCHAR_TO_ANSI(*WindowTitle), &bIsVisible, WindowFlags)) + { + if (Owner->GetShowHelp()) + { + if (ImGui::IsItemHovered()) + { + ImGui::PushStyleColor(ImGuiCol_PopupBg, IM_COL32(29, 42, 62, 240)); + const float HelpWidth = FCogWindowWidgets::GetFontWidth() * 80; + ImGui::SetNextWindowSizeConstraints(ImVec2(HelpWidth / 2.0f, 0.0f), + ImVec2(HelpWidth, FLT_MAX)); + if (ImGui::BeginTooltip()) + { + ImGui::PushTextWrapPos(HelpWidth - 1 * FCogWindowWidgets::GetFontWidth()); + RenderHelp(); + ImGui::PopTextWrapPos(); + ImGui::EndTooltip(); + } + ImGui::PopStyleColor(); + } + } + + if (ImGui::BeginPopupContextWindow()) + { + if (bHasMenu) + { + ImGui::Checkbox("Hide Menu", &bHideMenu); + + if (ImGui::Button("Reset")) + { + ResetConfig(); + } + } + ImGui::EndPopup(); + } + + RenderContent(); + ImGui::End(); + } + + PostRender(); +} + +//-------------------------------------------------------------------------------------------------------------------------- +void UCogWindow::RenderHelp() +{ + ImGui::Text("No help available."); +} + +//-------------------------------------------------------------------------------------------------------------------------- +void UCogWindow::RenderTick(float DeltaTime) +{ + SetSelection(FCogDebugSettings::GetSelection()); +} + +//-------------------------------------------------------------------------------------------------------------------------- +void UCogWindow::GameTick(float DeltaTime) +{ +} + +//-------------------------------------------------------------------------------------------------------------------------- +void UCogWindow::SetSelection(AActor* NewSelection) +{ + if (CurrentSelection == NewSelection) + { + return; + } + + AActor* OldActor = CurrentSelection.Get(); + + CurrentSelection = NewSelection; + OnSelectionChanged(OldActor, NewSelection); +} + +//-------------------------------------------------------------------------------------------------------------------------- +APawn* UCogWindow::GetLocalPlayerPawn() +{ + APlayerController* LocalPlayerController = GetLocalPlayerController(); + + if (LocalPlayerController == nullptr) + { + return nullptr; + } + + APawn* Pawn = LocalPlayerController->GetPawn(); + + return Pawn; +} + +//-------------------------------------------------------------------------------------------------------------------------- +APlayerController* UCogWindow::GetLocalPlayerController() +{ + ULocalPlayer* LocalPlayer = GetLocalPlayer(); + if (LocalPlayer == nullptr) + { + return nullptr; + } + + return LocalPlayer->PlayerController; +} + +//-------------------------------------------------------------------------------------------------------------------------- +ULocalPlayer* UCogWindow::GetLocalPlayer() +{ + const UWorld* World = GetWorld(); + if (World == nullptr) + { + return nullptr; + } + + return World->GetFirstLocalPlayerFromController(); +}