From dcce0f1b476d5edbaa3b89ffaaa00a532e41efd2 Mon Sep 17 00:00:00 2001 From: Arnaud Jamin Date: Thu, 16 Jan 2025 19:30:12 -0500 Subject: [PATCH] CogEngine: improve plot events automatic row manangement CogSample: plot Ability Activate/End event --- Config/DefaultGameplayTags.ini | 4 + .../Abilities/Shield/GE_Hero1_Shield.uasset | Bin 8163 -> 15377 bytes .../Source/CogDebug/Private/CogDebugPlot.cpp | 112 +++++++++--------- .../Cog/Source/CogDebug/Public/CogDebugPlot.h | 17 ++- .../Private/CogEngineWindow_Plots.cpp | 10 +- Source/CogSample/CogSampleGameplayAbility.cpp | 27 +++++ 6 files changed, 106 insertions(+), 64 deletions(-) diff --git a/Config/DefaultGameplayTags.ini b/Config/DefaultGameplayTags.ini index 5189dd3..61b5988 100644 --- a/Config/DefaultGameplayTags.ini +++ b/Config/DefaultGameplayTags.ini @@ -1,3 +1,4 @@ +;METADATA=(Diff=true, UseCommands=true) [/Script/GameplayTags.GameplayTagsSettings] ImportTagsFromConfig=True WarnOnInvalidTags=True @@ -5,9 +6,12 @@ ClearInvalidTags=False AllowEditorTagUnloading=True AllowGameTagUnloading=False FastReplication=False +bDynamicReplication=False InvalidTagCharacters="\"\'," NumBitsForContainerSize=6 NetIndexFirstBitSegment=16 ++GameplayTagList=(Tag="Effect.Type.Damage.Magical",DevComment="") ++GameplayTagList=(Tag="Effect.Type.Damage.Physical",DevComment="") +GameplayTagList=(Tag="GameplayCue.Ability.Hero1.Poison",DevComment="") +GameplayTagList=(Tag="GameplayCue.Ability.Hero1.PuhBack",DevComment="") +GameplayTagList=(Tag="GameplayCue.Ability.Hero1.Shield",DevComment="") diff --git a/Content/Characters/Hero1/Abilities/Shield/GE_Hero1_Shield.uasset b/Content/Characters/Hero1/Abilities/Shield/GE_Hero1_Shield.uasset index 4e94d6f82645fcd49b7dc69fe3bfe7a89829794a..bbf878f64335f4158d3047a86775ad2800b5acff 100644 GIT binary patch literal 15377 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 FCogDebugPlot::OccupiedRowMap; //-------------------------------------------------------------------------------------------------------------------------- // FCogPlotEvent @@ -131,10 +131,9 @@ FCogDebugPlotEvent& FCogDebugPlotEntry::AddEvent( Events.Reserve(200); } - //----------------------------------------------------------------------- - // We currently having two events with the same name at the same time. - // So we stop the current one if any exist. - //----------------------------------------------------------------------- + //---------------------------- + // Stop if any already exist. + //---------------------------- StopEvent(EventId); FCogDebugPlotEvent* Event = nullptr; @@ -159,7 +158,12 @@ FCogDebugPlotEvent& FCogDebugPlotEntry::AddEvent( Event->EndTime = IsInstant ? OwnwePlot.Time : 0.0f; Event->StartFrame = OwnwePlot.Frame; Event->EndFrame = IsInstant ? OwnwePlot.Frame : 0.0f; - Event->Row = (Row == FCogDebugPlot::AutoRow) ? OwnwePlot.FindFreeRow() : Row; + Event->Row = (Row == FCogDebugPlot::AutoRow) ? FCogDebugPlot::FindFreeEventRow() : Row; + + if (IsInstant == false) + { + FCogDebugPlot::OccupyRow(Event->Row); + } MaxRow = FMath::Max(Event->Row, MaxRow); @@ -187,6 +191,8 @@ FCogDebugPlotEvent& FCogDebugPlotEntry::StopEvent(const FName EventId) { Event->EndTime = Time; Event->EndFrame = Frame; + + FCogDebugPlot::FreeRow(Event->Row); } return *Event; @@ -239,54 +245,6 @@ FCogDebugPlotEvent* FCogDebugPlotEntry::FindLastEventByName(FName EventId) return nullptr; } -//-------------------------------------------------------------------------------------------------------------------------- -int32 FCogDebugPlotEntry::FindFreeRow() const -{ - static float InstantTimeThreshold = 1.0f; - static float TotalTimeThreshold = 10.0f; - TSet OccupiedRows; - - for (int32 i = Events.Num() - 1; i >= 0; --i) - { - int32 Index = i; - if (EventOffset != 0) - { - Index = (i + EventOffset) % Events.Num(); - } - const FCogDebugPlotEvent& Event = Events[Index]; - - if (Event.EndTime != 0.0f && Time > Event.EndTime + TotalTimeThreshold) - { - break; - } - - if (Event.StartTime == Event.EndTime && Time > Event.EndTime + InstantTimeThreshold) - { - continue; - } - - if (Event.EndTime != 0.0f) - { - continue; - } - - OccupiedRows.Add(Event.Row); - } - - int32 FreeRow = 0; - while (true) - { - if (OccupiedRows.Contains(FreeRow) == false) - { - break; - } - - FreeRow++; - } - - return FreeRow; -} - //-------------------------------------------------------------------------------------------------------------------------- void FCogDebugPlotEntry::AssignAxis(int32 Row, ImAxis YAxis) { @@ -368,6 +326,7 @@ bool FCogDebugPlotEntry::FindValue(float x, float& y) const void FCogDebugPlot::Reset() { Plots.Empty(); + OccupiedRowMap.Empty(); Pause = false; ResetLastAddedEvent(); } @@ -375,11 +334,12 @@ void FCogDebugPlot::Reset() //-------------------------------------------------------------------------------------------------------------------------- void FCogDebugPlot::Clear() { - for (FCogDebugPlotEntry& Entry : FCogDebugPlot::Plots) + for (FCogDebugPlotEntry& Entry : Plots) { Entry.Clear(); } + OccupiedRowMap.Empty(); ResetLastAddedEvent(); } @@ -522,3 +482,45 @@ FCogDebugPlotEvent& FCogDebugPlot::PlotEventToggle(const UObject* WorldContextOb return PlotEventStop(WorldContextObject, PlotName, EventId); } } + + +//-------------------------------------------------------------------------------------------------------------------------- +void FCogDebugPlot::OccupyRow(const int32 Row) +{ + if (int32* RowOccupation = OccupiedRowMap.Find(Row)) + { + (*RowOccupation)++; + } + else + { + OccupiedRowMap.Add(Row, 1); + } +} + +//-------------------------------------------------------------------------------------------------------------------------- +void FCogDebugPlot::FreeRow(const int32 Row) +{ + if (int32* RowOccupation = OccupiedRowMap.Find(Row)) + { + (*RowOccupation)--; + } +} + +//-------------------------------------------------------------------------------------------------------------------------- +int32 FCogDebugPlot::FindFreeEventRow() +{ + constexpr int32 MaxRows = 100; + + int32 FreeRow = 0; + for (; FreeRow < MaxRows; ++FreeRow) + { + const int32* Occupation = OccupiedRowMap.Find(FreeRow); + if (Occupation == nullptr || *Occupation == 0) + { + break; + } + } + + return FreeRow; +} + diff --git a/Plugins/Cog/Source/CogDebug/Public/CogDebugPlot.h b/Plugins/Cog/Source/CogDebug/Public/CogDebugPlot.h index 71cfe80..3dba04e 100644 --- a/Plugins/Cog/Source/CogDebug/Public/CogDebugPlot.h +++ b/Plugins/Cog/Source/CogDebug/Public/CogDebugPlot.h @@ -57,7 +57,6 @@ struct COGDEBUG_API FCogDebugPlotEntry FCogDebugPlotEvent& AddEvent(const FCogDebugPlotEntry& OwnwePlot, FString OwnerName, bool IsInstant, const FName EventId, const int32 Row, const FColor& Color); FCogDebugPlotEvent& StopEvent(const FName EventId); void UpdateTime(const UWorld* World); - int32 FindFreeRow() const; FCogDebugPlotEvent* GetLastEvent(); FCogDebugPlotEvent* FindLastEventByName(FName EventId); @@ -109,14 +108,24 @@ private: friend struct FCogDebugPlotEntry; static void ResetLastAddedEvent(); - static FCogDebugPlotEntry* RegisterPlot(const UObject* Owner, const FName PlotName, bool IsEventPlot); - FCogDebugPlotEventParams* PlotEventAddParam(const FName Name); + + static FCogDebugPlotEntry* RegisterPlot(const UObject* Owner, const FName PlotName, bool IsEventPlot); + static FCogDebugPlotEvent* GetLastAddedEvent(); + static void OccupyRow(const int32 Row); + + static void FreeRow(const int32 Row); + + static int32 FindFreeEventRow(); + static FName LastAddedEventPlotName; - static int32 LastAddedEventIndex; + + static int32 LastAddedEventIndex; static FCogDebugPlotEvent DefaultEvent; + + static TMap OccupiedRowMap; }; #endif //ENABLE_COG diff --git a/Plugins/Cog/Source/CogEngine/Private/CogEngineWindow_Plots.cpp b/Plugins/Cog/Source/CogEngine/Private/CogEngineWindow_Plots.cpp index 83d0f3d..2eb83f7 100644 --- a/Plugins/Cog/Source/CogEngine/Private/CogEngineWindow_Plots.cpp +++ b/Plugins/Cog/Source/CogEngine/Private/CogEngineWindow_Plots.cpp @@ -106,11 +106,6 @@ void FCogEngineWindow_Plots::RenderMenu() if (ImGui::BeginMenu("Options")) { - if (ImGui::MenuItem("Clear data")) - { - FCogDebugPlot::Clear(); - } - if (ImGui::MenuItem("Reset")) { FCogDebugPlot::Pause = false; @@ -154,6 +149,11 @@ void FCogEngineWindow_Plots::RenderMenu() ImGui::EndMenu(); } + if (ImGui::MenuItem("Clear")) + { + FCogDebugPlot::Clear(); + } + FCogWindowWidgets::ToggleMenuButton(&FCogDebugPlot::Pause, "Pause", ImVec4(1.0f, 0.0f, 0.0f, 1.0f)); ImGui::EndMenuBar(); diff --git a/Source/CogSample/CogSampleGameplayAbility.cpp b/Source/CogSample/CogSampleGameplayAbility.cpp index 2e485ec..df867b2 100644 --- a/Source/CogSample/CogSampleGameplayAbility.cpp +++ b/Source/CogSample/CogSampleGameplayAbility.cpp @@ -8,6 +8,10 @@ #include "CogSamplePlayerController.h" #include "CogSampleSpawnPredictionComponent.h" +#if ENABLE_COG +#include "CogDebugPlot.h" +#endif + //-------------------------------------------------------------------------------------------------------------------------- UCogSampleGameplayAbility::UCogSampleGameplayAbility() { @@ -18,8 +22,24 @@ UCogSampleGameplayAbility::UCogSampleGameplayAbility() //-------------------------------------------------------------------------------------------------------------------------- void UCogSampleGameplayAbility::PreActivate(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo, FOnGameplayAbilityEnded::FDelegate* OnGameplayAbilityEndedDelegate, const FGameplayEventData* TriggerEventData) { +#if ENABLE_COG + COG_LOG_ABILITY(ELogVerbosity::Verbose, this, TEXT("")); + + FCogDebugPlot::PlotEventStart(this, "Ability", GetFName()) + .AddParam("Name", GetNameSafe(this)) + .AddParam("Owner", GetNameSafe(ActorInfo->OwnerActor.Get())) + .AddParam("Avatar", GetNameSafe(ActorInfo->AvatarActor.Get())) + .AddParam("Player Controller", GetNameSafe(ActorInfo->PlayerController.Get())) + .AddParam("Prediction Key", ActivationInfo.GetActivationPredictionKey().ToString()) + .AddParam("Event Tag", TriggerEventData ? *TriggerEventData->EventTag.ToString() : FString("None")) + .AddParam("Event Magnitude", TriggerEventData ? TriggerEventData->EventMagnitude : 0.0f); + +#endif + Super::PreActivate(Handle, ActorInfo, ActivationInfo, OnGameplayAbilityEndedDelegate, TriggerEventData); + + } //-------------------------------------------------------------------------------------------------------------------------- @@ -33,7 +53,14 @@ void UCogSampleGameplayAbility::ActivateAbility(const FGameplayAbilitySpecHandle void UCogSampleGameplayAbility::EndAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo, bool bReplicateEndAbility, bool bWasCancelled) { Super::EndAbility(Handle, ActorInfo, ActivationInfo, bReplicateEndAbility, bWasCancelled); + +#if ENABLE_COG + COG_LOG_ABILITY(ELogVerbosity::Verbose, this, TEXT("")); + + FCogDebugPlot::PlotEventStop(this, "Ability", GetFName()); + +#endif } //--------------------------------------------------------------------------------------------------------------------------