Replicate client selection to the server to filter server debug replication

This commit is contained in:
Arnaud Jamin
2023-10-18 14:09:02 -04:00
parent fd235b17da
commit db184c4aed
17 changed files with 231 additions and 72 deletions
@@ -0,0 +1,3 @@
[/Script/GameplayDebugger.GameplayDebuggerUserSettings]
FontSize=15
Binary file not shown.
@@ -514,18 +514,27 @@ void FCogDebugDraw::ReplicateShape(const UObject* WorldContextObject, const FCog
} }
const ENetMode NetMode = World->GetNetMode(); const ENetMode NetMode = World->GetNetMode();
if (NetMode == NM_DedicatedServer || NetMode == NM_ListenServer) if (NetMode != NM_DedicatedServer && NetMode != NM_ListenServer)
{ {
TArray<ACogDebugReplicator*> Replicators; return;
ACogDebugReplicator::GetRemoteReplicators(*World, Replicators); }
for (ACogDebugReplicator* Replicator : Replicators) TArray<ACogDebugReplicator*> Replicators;
ACogDebugReplicator::GetRemoteReplicators(*World, Replicators);
for (ACogDebugReplicator* Replicator : Replicators)
{
if (Replicator == nullptr)
{ {
if (Replicator != nullptr) continue;
{
Replicator->ReplicatedShapes.Add(Shape);
}
} }
if (FCogDebugSettings::IsReplicatedDebugActiveForObject(WorldContextObject, Replicator->GetServerSelection(), Replicator->IsServerFilteringBySelection()) == false)
{
continue;
}
Replicator->ReplicatedShapes.Add(Shape);
} }
} }
@@ -80,6 +80,8 @@ void ACogDebugReplicator::BeginPlay()
if (OwnerPlayerController->IsLocalController()) if (OwnerPlayerController->IsLocalController())
{ {
Server_RequestAllCategoriesVerbosity(); Server_RequestAllCategoriesVerbosity();
Server_SetSelection(FCogDebugSettings::GetSelection());
Server_SetIsFilteringBySelection(FCogDebugSettings::GetIsFilteringBySelection());
} }
} }
@@ -104,7 +106,7 @@ void ACogDebugReplicator::TickActor(float DeltaTime, enum ELevelTick TickType, F
{ {
if (GetWorld()->GetNetMode() == NM_Client) if (GetWorld()->GetNetMode() == NM_Client)
{ {
for (FCogDebugShape ReplicatedShape : ReplicatedShapes) for (const FCogDebugShape& ReplicatedShape : ReplicatedShapes)
{ {
ReplicatedShape.Draw(GetWorld()); ReplicatedShape.Draw(GetWorld());
} }
@@ -195,6 +197,26 @@ void ACogDebugReplicator::Server_RequestAllCategoriesVerbosity_Implementation()
#endif // !UE_BUILD_SHIPPING #endif // !UE_BUILD_SHIPPING
} }
//--------------------------------------------------------------------------------------------------------------------------
void ACogDebugReplicator::Server_SetIsFilteringBySelection_Implementation(bool Value)
{
#if !UE_BUILD_SHIPPING
bIsServerFilteringBySelection = Value;
#endif // !UE_BUILD_SHIPPING
}
//--------------------------------------------------------------------------------------------------------------------------
void ACogDebugReplicator::Server_SetSelection_Implementation(AActor* Value)
{
#if !UE_BUILD_SHIPPING
ServerSelection = Value;
#endif // !UE_BUILD_SHIPPING
}
//-------------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------------
// FCogReplicatorNetPack // FCogReplicatorNetPack
//-------------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------------
@@ -277,4 +299,4 @@ bool FCogReplicatorNetPack::NetDeltaSerialize(FNetDeltaSerializeInfo& DeltaParms
} }
return true; return true;
} }
@@ -1,10 +1,11 @@
#include "CogDebugSettings.h" #include "CogDebugSettings.h"
#include "CogCommonDebugFilteredActorInterface.h" #include "CogCommonDebugFilteredActorInterface.h"
#include "CogDebugReplicator.h"
//-------------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------------
TWeakObjectPtr<AActor> FCogDebugSettings::Selection; TWeakObjectPtr<AActor> FCogDebugSettings::Selection;
bool FCogDebugSettings::FilterBySelection = true; bool FCogDebugSettings::bIsFilteringBySelection = true;
bool FCogDebugSettings::Persistent = false; bool FCogDebugSettings::Persistent = false;
bool FCogDebugSettings::TextShadow = true; bool FCogDebugSettings::TextShadow = true;
bool FCogDebugSettings::Fade2D = true; bool FCogDebugSettings::Fade2D = true;
@@ -48,7 +49,7 @@ TArray<FString> FCogDebugSettings::SecondaryBoneWildcards =
//-------------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------------
void FCogDebugSettings::Reset() void FCogDebugSettings::Reset()
{ {
FilterBySelection = true; bIsFilteringBySelection = true;
Persistent = false; Persistent = false;
TextShadow = true; TextShadow = true;
Fade2D = true; Fade2D = true;
@@ -68,7 +69,32 @@ void FCogDebugSettings::Reset()
//-------------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------------
bool FCogDebugSettings::IsDebugActiveForObject(const UObject* WorldContextObject) bool FCogDebugSettings::IsDebugActiveForObject(const UObject* WorldContextObject)
{ {
if (FilterBySelection == false) UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull);
if (World == nullptr)
{
return true;
}
if (World->GetNetMode() == NM_DedicatedServer)
{
return true;
}
bool Result = IsDebugActiveForObject_Internal(WorldContextObject, Selection.Get(), bIsFilteringBySelection);
return Result;
}
//--------------------------------------------------------------------------------------------------------------------------
bool FCogDebugSettings::IsReplicatedDebugActiveForObject(const UObject* WorldContextObject, const AActor* ServerSelection, bool IsServerFilteringBySelection)
{
return IsDebugActiveForObject_Internal(WorldContextObject, ServerSelection, IsServerFilteringBySelection);
}
//--------------------------------------------------------------------------------------------------------------------------
bool FCogDebugSettings::IsDebugActiveForObject_Internal(const UObject* WorldContextObject, const AActor* InSelection, bool InIsFilteringBySelection)
{
if (InIsFilteringBySelection == false)
{ {
return true; return true;
} }
@@ -78,7 +104,7 @@ bool FCogDebugSettings::IsDebugActiveForObject(const UObject* WorldContextObject
return true; return true;
} }
const AActor* SelectionPtr = Selection.Get(); const AActor* SelectionPtr = InSelection;
if (SelectionPtr == nullptr) if (SelectionPtr == nullptr)
{ {
return true; return true;
@@ -116,9 +142,37 @@ AActor* FCogDebugSettings::GetSelection()
} }
//-------------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------------
void FCogDebugSettings::SetSelection(AActor* Value) void FCogDebugSettings::SetSelection(UWorld* World, AActor* Value)
{ {
Selection = Value; Selection = Value;
if (World != nullptr && World->GetNetMode() == NM_Client)
{
if (ACogDebugReplicator* Replicator = ACogDebugReplicator::GetLocalReplicator(*World))
{
Replicator->Server_SetSelection(Value);
}
}
}
//--------------------------------------------------------------------------------------------------------------------------
bool FCogDebugSettings::GetIsFilteringBySelection()
{
return bIsFilteringBySelection;
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogDebugSettings::SetIsFilteringBySelection(UWorld* World, bool Value)
{
bIsFilteringBySelection = Value;
if (World != nullptr && World->GetNetMode() == NM_Client)
{
if (ACogDebugReplicator* Replicator = ACogDebugReplicator::GetLocalReplicator(*World))
{
Replicator->Server_SetIsFilteringBySelection(Value);
}
}
} }
//-------------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------------
@@ -22,7 +22,7 @@ FCogDebugShape FCogDebugShape::MakePoint(const FVector& Location, const float Si
//-------------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------------
void FCogDebugShape::DrawPoint(UWorld* World) void FCogDebugShape::DrawPoint(UWorld* World) const
{ {
#if ENABLE_COG #if ENABLE_COG
@@ -60,7 +60,7 @@ FCogDebugShape FCogDebugShape::MakeSegment(const FVector& StartLocation, const F
//-------------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------------
void FCogDebugShape::DrawSegment(UWorld* World) void FCogDebugShape::DrawSegment(UWorld* World) const
{ {
#if ENABLE_COG #if ENABLE_COG
@@ -100,7 +100,7 @@ FCogDebugShape FCogDebugShape::MakeArrow(const FVector& StartLocation, const FVe
//-------------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------------
void FCogDebugShape::DrawArrow(UWorld* World) void FCogDebugShape::DrawArrow(UWorld* World) const
{ {
#if ENABLE_COG #if ENABLE_COG
@@ -141,7 +141,7 @@ FCogDebugShape FCogDebugShape::MakeAxes(const FVector& Location, const FRotator&
//-------------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------------
void FCogDebugShape::DrawAxes(UWorld* World) void FCogDebugShape::DrawAxes(UWorld* World) const
{ {
#if ENABLE_COG #if ENABLE_COG
@@ -181,7 +181,7 @@ FCogDebugShape FCogDebugShape::MakeBox(const FVector& Center, const FRotator& Ro
//-------------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------------
void FCogDebugShape::DrawBox(UWorld* World) void FCogDebugShape::DrawBox(UWorld* World) const
{ {
#if ENABLE_COG #if ENABLE_COG
@@ -220,7 +220,7 @@ FCogDebugShape FCogDebugShape::MakeSolidBox(const FVector& Center, const FRotato
} }
void FCogDebugShape::DrawSolidBox(UWorld* World) void FCogDebugShape::DrawSolidBox(UWorld* World) const
{ {
#if ENABLE_COG #if ENABLE_COG
@@ -260,7 +260,7 @@ FCogDebugShape FCogDebugShape::MakeCone(const FVector& Location, const FVector&
//-------------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------------
void FCogDebugShape::DrawCone(UWorld* World) void FCogDebugShape::DrawCone(UWorld* World) const
{ {
#if ENABLE_COG #if ENABLE_COG
@@ -303,7 +303,7 @@ FCogDebugShape FCogDebugShape::MakeCylinder(const FVector& Center, const float R
} }
//-------------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------------
void FCogDebugShape::DrawCylinder(UWorld* World) void FCogDebugShape::DrawCylinder(UWorld* World) const
{ {
#if ENABLE_COG #if ENABLE_COG
@@ -345,7 +345,7 @@ FCogDebugShape FCogDebugShape::MakeCircle(const FVector& Center, const FRotator&
//-------------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------------
void FCogDebugShape::DrawCicle(UWorld* World) void FCogDebugShape::DrawCicle(UWorld* World) const
{ {
#if ENABLE_COG #if ENABLE_COG
@@ -387,7 +387,7 @@ FCogDebugShape FCogDebugShape::MakeCircleArc(const FVector& Center, const FRotat
//-------------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------------
void FCogDebugShape::DrawCicleArc(UWorld* World) void FCogDebugShape::DrawCicleArc(UWorld* World) const
{ {
#if ENABLE_COG #if ENABLE_COG
@@ -430,7 +430,7 @@ FCogDebugShape FCogDebugShape::MakeCapsule(const FVector& Center, const FQuat& R
//-------------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------------
void FCogDebugShape::DrawCapsule(UWorld* World) void FCogDebugShape::DrawCapsule(UWorld* World) const
{ {
#if ENABLE_COG #if ENABLE_COG
@@ -472,7 +472,7 @@ FCogDebugShape FCogDebugShape::MakeFlatCapsule(const FVector2D& Start, const FVe
//-------------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------------
void FCogDebugShape::DrawFlatCapsule(UWorld* World) void FCogDebugShape::DrawFlatCapsule(UWorld* World) const
{ {
#if ENABLE_COG #if ENABLE_COG
@@ -514,7 +514,7 @@ FCogDebugShape FCogDebugShape::MakeBone(const FVector& BoneLocation, const FVect
//-------------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------------
void FCogDebugShape::DrawBone(UWorld* World) void FCogDebugShape::DrawBone(UWorld* World) const
{ {
#if ENABLE_COG #if ENABLE_COG
@@ -560,7 +560,7 @@ FCogDebugShape FCogDebugShape::MakePolygon(const TArray<FVector>& Verts, const F
//-------------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------------
void FCogDebugShape::DrawPolygon(UWorld* World) void FCogDebugShape::DrawPolygon(UWorld* World) const
{ {
#if ENABLE_COG #if ENABLE_COG
@@ -590,7 +590,7 @@ void FCogDebugShape::DrawPolygon(UWorld* World)
//-------------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------------
void FCogDebugShape::Draw(UWorld* World) void FCogDebugShape::Draw(UWorld* World) const
{ {
switch (Type) switch (Type)
{ {
@@ -85,6 +85,16 @@ public:
UFUNCTION(Client, Reliable) UFUNCTION(Client, Reliable)
void Client_SendCategoriesVerbosity(const TArray<FCogServerCategoryData>& Categories); void Client_SendCategoriesVerbosity(const TArray<FCogServerCategoryData>& Categories);
AActor* GetServerSelection() const { return ServerSelection.Get(); }
UFUNCTION(Server, Reliable)
void Server_SetSelection(AActor* Value);
bool IsServerFilteringBySelection() const { return bIsServerFilteringBySelection; }
UFUNCTION(Server, Reliable)
void Server_SetIsFilteringBySelection(bool Value);
protected: protected:
friend FCogReplicatorNetPack; friend FCogReplicatorNetPack;
@@ -92,8 +102,10 @@ protected:
uint32 bHasAuthority : 1; uint32 bHasAuthority : 1;
private:
UPROPERTY(Replicated) UPROPERTY(Replicated)
FCogReplicatorNetPack ReplicatedData; FCogReplicatorNetPack ReplicatedData;
TWeakObjectPtr<AActor> ServerSelection = nullptr;
bool bIsServerFilteringBySelection = true;
}; };
@@ -9,10 +9,16 @@ public:
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
static bool IsDebugActiveForObject(const UObject* WorldContextObject); static bool IsDebugActiveForObject(const UObject* WorldContextObject);
static bool IsReplicatedDebugActiveForObject(const UObject* WorldContextObject, const AActor* ServerSelection, bool IsServerFilteringBySelection);
static AActor* GetSelection(); static AActor* GetSelection();
static void SetSelection(AActor* Value); static void SetSelection(UWorld* World, AActor* Value);
static bool GetIsFilteringBySelection();
static void SetIsFilteringBySelection(UWorld* World, bool Value);
static bool GetDebugPersistent(bool bPersistent); static bool GetDebugPersistent(bool bPersistent);
static float GetDebugDuration(bool bPersistent); static float GetDebugDuration(bool bPersistent);
@@ -37,11 +43,6 @@ public:
static void Reset(); static void Reset();
//----------------------------------------------------------------------------------------------------------------------
static TWeakObjectPtr<AActor> Selection;
static bool FilterBySelection;
static bool Persistent; static bool Persistent;
static bool TextShadow; static bool TextShadow;
@@ -71,4 +72,12 @@ public:
static float TextSize; static float TextSize;
static TArray<FString> SecondaryBoneWildcards; static TArray<FString> SecondaryBoneWildcards;
private:
static bool IsDebugActiveForObject_Internal(const UObject* WorldContextObject, const AActor* InSelection, bool InIsFilteringBySelection);
static TWeakObjectPtr<AActor> Selection;
static bool bIsFilteringBySelection;
}; };
@@ -58,22 +58,22 @@ struct COGDEBUG_API FCogDebugShape
static FCogDebugShape MakeFlatCapsule(const FVector2D& Start, const FVector2D& End, const float Radius, const float Z, const FColor& Color, const float Thickness, const bool bPersistent, const uint8 DepthPriority); static FCogDebugShape MakeFlatCapsule(const FVector2D& Start, const FVector2D& End, const float Radius, const float Z, const FColor& Color, const float Thickness, const bool bPersistent, const uint8 DepthPriority);
static FCogDebugShape MakePolygon(const TArray<FVector>& Verts, const FColor& Color, const bool bPersistent, const uint8 DepthPriority); static FCogDebugShape MakePolygon(const TArray<FVector>& Verts, const FColor& Color, const bool bPersistent, const uint8 DepthPriority);
void DrawPoint(UWorld* World); void DrawPoint(UWorld* World) const;
void DrawSegment(UWorld* World); void DrawSegment(UWorld* World) const;
void DrawBone(UWorld* World); void DrawBone(UWorld* World) const;
void DrawArrow(UWorld* World); void DrawArrow(UWorld* World) const;
void DrawAxes(UWorld* World); void DrawAxes(UWorld* World) const;
void DrawBox(UWorld* World); void DrawBox(UWorld* World) const;
void DrawSolidBox(UWorld* World); void DrawSolidBox(UWorld* World) const;
void DrawCone(UWorld* World); void DrawCone(UWorld* World) const;
void DrawCylinder(UWorld* World); void DrawCylinder(UWorld* World) const;
void DrawCicle(UWorld* World); void DrawCicle(UWorld* World) const;
void DrawCicleArc(UWorld* World); void DrawCicleArc(UWorld* World) const;
void DrawCapsule(UWorld* World); void DrawCapsule(UWorld* World) const;
void DrawFlatCapsule(UWorld* World); void DrawFlatCapsule(UWorld* World) const;
void DrawPolygon(UWorld* World); void DrawPolygon(UWorld* World) const;
void Draw(UWorld* World); void Draw(UWorld* World) const;
}; };
FArchive& operator<<(FArchive& Ar, FCogDebugShape& Shape); FArchive& operator<<(FArchive& Ar, FCogDebugShape& Shape);
@@ -178,4 +178,4 @@ void ACogEngineReplicator::Server_ResetPossession_Implementation()
} }
#endif // !UE_BUILD_SHIPPING #endif // !UE_BUILD_SHIPPING
} }
@@ -17,7 +17,7 @@ void UCogEngineWindow_DebugSettings::ResetConfig()
{ {
Super::ResetConfig(); Super::ResetConfig();
FilterBySelection = true; bIsFilteringBySelection = true;
Persistent = false; Persistent = false;
TextShadow = true; TextShadow = true;
Fade2D = true; Fade2D = true;
@@ -39,7 +39,6 @@ void UCogEngineWindow_DebugSettings::PostInitProperties()
{ {
Super::PostInitProperties(); Super::PostInitProperties();
FCogDebugSettings::FilterBySelection = FilterBySelection;
FCogDebugSettings::Persistent = Persistent; FCogDebugSettings::Persistent = Persistent;
FCogDebugSettings::TextShadow = TextShadow; FCogDebugSettings::TextShadow = TextShadow;
FCogDebugSettings::Fade2D = Fade2D; FCogDebugSettings::Fade2D = Fade2D;
@@ -54,6 +53,8 @@ void UCogEngineWindow_DebugSettings::PostInitProperties()
FCogDebugSettings::GradientColorIntensity = GradientColorIntensity; FCogDebugSettings::GradientColorIntensity = GradientColorIntensity;
FCogDebugSettings::GradientColorSpeed = GradientColorSpeed; FCogDebugSettings::GradientColorSpeed = GradientColorSpeed;
FCogDebugSettings::TextSize = TextSize; FCogDebugSettings::TextSize = TextSize;
FCogDebugSettings::SetIsFilteringBySelection(GetWorld(), bIsFilteringBySelection);
} }
//-------------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------------
@@ -61,7 +62,6 @@ void UCogEngineWindow_DebugSettings::PreSaveConfig()
{ {
Super::PreSaveConfig(); Super::PreSaveConfig();
FilterBySelection = FCogDebugSettings::FilterBySelection;
Persistent = FCogDebugSettings::Persistent; Persistent = FCogDebugSettings::Persistent;
TextShadow = FCogDebugSettings::TextShadow; TextShadow = FCogDebugSettings::TextShadow;
Fade2D = FCogDebugSettings::Fade2D; Fade2D = FCogDebugSettings::Fade2D;
@@ -76,6 +76,8 @@ void UCogEngineWindow_DebugSettings::PreSaveConfig()
GradientColorIntensity = FCogDebugSettings::GradientColorIntensity; GradientColorIntensity = FCogDebugSettings::GradientColorIntensity;
GradientColorSpeed = FCogDebugSettings::GradientColorSpeed; GradientColorSpeed = FCogDebugSettings::GradientColorSpeed;
TextSize = FCogDebugSettings::TextSize; TextSize = FCogDebugSettings::TextSize;
bIsFilteringBySelection = FCogDebugSettings::GetIsFilteringBySelection();
} }
//-------------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------------
@@ -99,7 +101,11 @@ void UCogEngineWindow_DebugSettings::RenderContent()
ImGui::EndMenuBar(); ImGui::EndMenuBar();
} }
ImGui::Checkbox("Filter by selection", &FCogDebugSettings::FilterBySelection); if (ImGui::Checkbox("Filter by selection", &bIsFilteringBySelection))
{
FCogDebugSettings::SetIsFilteringBySelection(GetWorld(), bIsFilteringBySelection);
}
ImGui::SameLine(); ImGui::SameLine();
FCogWindowWidgets::HelpMarker("If checked, only show the debug of the currently selected actor. Otherwise show the debug of all actors."); FCogWindowWidgets::HelpMarker("If checked, only show the debug of the currently selected actor. Otherwise show the debug of all actors.");
@@ -1,6 +1,7 @@
#include "CogEngineWindow_LogCategories.h" #include "CogEngineWindow_LogCategories.h"
#include "CogDebugHelper.h" #include "CogDebugHelper.h"
#include "CogDebugSettings.h"
#include "CogWindowWidgets.h" #include "CogWindowWidgets.h"
#include "CogDebugLog.h" #include "CogDebugLog.h"
@@ -48,6 +49,8 @@ void UCogEngineWindow_LogCategories::RenderContent()
{ {
if (ImGui::BeginMenu("Options")) if (ImGui::BeginMenu("Options"))
{ {
FCogWindowWidgets::HelpMarker("If checked, only show the debug of the currently selected actor. Otherwise show the debug of all actors.");
ImGui::Checkbox("Show detailed verbosity", &bShowAllVerbosity); ImGui::Checkbox("Show detailed verbosity", &bShowAllVerbosity);
ImGui::SameLine(); ImGui::SameLine();
FCogWindowWidgets::HelpMarker("Show the verbosity level of each log category."); FCogWindowWidgets::HelpMarker("Show the verbosity level of each log category.");
@@ -86,9 +86,8 @@ void UCogEngineWindow_Selection::TryReapplySelection() const
AActor* Actor = *It; AActor* Actor = *It;
if (GetNameSafe(Actor) == SelectionName) if (GetNameSafe(Actor) == SelectionName)
{ {
FCogDebugSettings::SetSelection(Actor); SetGlobalSelection(Actor);
} }
} }
} }
@@ -158,7 +157,7 @@ void UCogEngineWindow_Selection::RenderTick(float DeltaTime)
if (FCogDebugSettings::GetSelection() == nullptr) if (FCogDebugSettings::GetSelection() == nullptr)
{ {
FCogDebugSettings::SetSelection(GetLocalPlayerPawn()); SetGlobalSelection(GetLocalPlayerPawn());
} }
if (bSelectionModeActive) if (bSelectionModeActive)
@@ -254,7 +253,7 @@ bool UCogEngineWindow_Selection::DrawSelectionCombo()
const FString ActorName = GetNameSafe(Actor); const FString ActorName = GetNameSafe(Actor);
if (ImGui::Selectable(TCHAR_TO_ANSI(*ActorName), bIsSelected)) if (ImGui::Selectable(TCHAR_TO_ANSI(*ActorName), bIsSelected))
{ {
FCogDebugSettings::SetSelection(Actor); SetGlobalSelection(Actor);
SelectionChanged = true; SelectionChanged = true;
} }
@@ -294,7 +293,7 @@ void UCogEngineWindow_Selection::DrawActorContextMenu(AActor* Actor)
if (ImGui::Button("Reset Selection", ImVec2(-1, 0))) if (ImGui::Button("Reset Selection", ImVec2(-1, 0)))
{ {
ImGui::CloseCurrentPopup(); ImGui::CloseCurrentPopup();
FCogDebugSettings::SetSelection(GetLocalPlayerPawn()); SetGlobalSelection(GetLocalPlayerPawn());
} }
if (ImGui::IsItemHovered()) if (ImGui::IsItemHovered())
@@ -399,7 +398,7 @@ void UCogEngineWindow_Selection::TickSelectionMode()
{ {
if (HoveredActor != nullptr) if (HoveredActor != nullptr)
{ {
FCogDebugSettings::SetSelection(HoveredActor); SetGlobalSelection(HoveredActor);
} }
DeactivateSelectionMode(); DeactivateSelectionMode();
@@ -590,7 +589,7 @@ void UCogEngineWindow_Selection::RenderMainMenuWidget(bool Draw, float& Width)
ImGui::SameLine(); ImGui::SameLine();
if (ImGui::Button("X", ImVec2(ResetButtonWidth, 0))) if (ImGui::Button("X", ImVec2(ResetButtonWidth, 0)))
{ {
FCogDebugSettings::SetSelection(nullptr); SetGlobalSelection(nullptr);
ImGui::CloseCurrentPopup(); ImGui::CloseCurrentPopup();
} }
if (ImGui::IsItemHovered()) if (ImGui::IsItemHovered())
@@ -601,3 +600,15 @@ void UCogEngineWindow_Selection::RenderMainMenuWidget(bool Draw, float& Width)
ImGui::PopStyleVar(1); ImGui::PopStyleVar(1);
} }
} }
//--------------------------------------------------------------------------------------------------------------------------
void UCogEngineWindow_Selection::SetGlobalSelection(AActor* Value) const
{
FCogDebugSettings::SetSelection(GetWorld(), Value);
}
//--------------------------------------------------------------------------------------------------------------------------
AActor* UCogEngineWindow_Selection::GetGlobalSelection(AActor* Value) const
{
return FCogDebugSettings::GetSelection();
}
@@ -28,7 +28,7 @@ protected:
private: private:
UPROPERTY(Config) UPROPERTY(Config)
bool FilterBySelection = true; bool bIsFilteringBySelection = true;
UPROPERTY(Config) UPROPERTY(Config)
bool Persistent = false; bool Persistent = false;
@@ -42,13 +42,17 @@ protected:
virtual void RenderMainMenuWidget(bool Draw, float& Width) override; virtual void RenderMainMenuWidget(bool Draw, float& Width) override;
bool DrawSelectionCombo(); virtual bool DrawSelectionCombo();
void DrawActorContextMenu(AActor* Actor); virtual void DrawActorContextMenu(AActor* Actor);
void ActivateSelectionMode(); virtual void ActivateSelectionMode();
void HackWaitInputRelease(); virtual void HackWaitInputRelease();
virtual void SetGlobalSelection(AActor* Value) const;
virtual AActor* GetGlobalSelection(AActor* Value) const;
private: private:
+25 -1
View File
@@ -66,7 +66,7 @@ ACogSampleCharacter::ACogSampleCharacter(const FObjectInitializer& ObjectInitial
AbilitySystem = CreateDefaultSubobject<UAbilitySystemComponent>(TEXT("AbilitySystem")); AbilitySystem = CreateDefaultSubobject<UAbilitySystemComponent>(TEXT("AbilitySystem"));
AbilitySystem->SetIsReplicated(true); AbilitySystem->SetIsReplicated(true);
AbilitySystem->SetReplicationMode(EGameplayEffectReplicationMode::Mixed); AbilitySystem->SetReplicationMode(EGameplayEffectReplicationMode::Full);
} }
//-------------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------------
@@ -108,6 +108,7 @@ void ACogSampleCharacter::BeginPlay()
} }
TryFinishInitialize(); TryFinishInitialize();
RefreshServerAnimTickOption();
} }
//-------------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------------
@@ -639,6 +640,29 @@ void ACogSampleCharacter::OnScaleAttributeChanged(const FOnAttributeChangeData&
MARK_PROPERTY_DIRTY_FROM_NAME(ACogSampleCharacter, Scale, this); MARK_PROPERTY_DIRTY_FROM_NAME(ACogSampleCharacter, Scale, this);
OnRep_Scale(); OnRep_Scale();
RefreshServerAnimTickOption();
}
//--------------------------------------------------------------------------------------------------------------------------
void ACogSampleCharacter::RefreshServerAnimTickOption()
{
const UCapsuleComponent* Capsule = GetCapsuleComponent();
if (Capsule == nullptr)
{
return;
}
USkeletalMeshComponent* SkeletalMesh = GetMesh();
if (SkeletalMesh == nullptr)
{
return;
}
const float ScaledHalfHeight = Capsule->GetScaledCapsuleHalfHeight();
const bool IsBigEnoughToSimulateBonesOnServer = ScaledHalfHeight > 200;
SkeletalMesh->VisibilityBasedAnimTickOption = IsBigEnoughToSimulateBonesOnServer ? EVisibilityBasedAnimTickOption::AlwaysTickPoseAndRefreshBones
: EVisibilityBasedAnimTickOption::OnlyTickMontagesWhenNotRendered;
} }
//-------------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------------
+3 -1
View File
@@ -230,9 +230,11 @@ public:
int32 ApplyRootMotion(const FCogSampleRootMotionParams& Params); int32 ApplyRootMotion(const FCogSampleRootMotionParams& Params);
private: private:
friend class ACogSamplePlayerController; friend class ACogSamplePlayerController;
void RefreshServerAnimTickOption();
UPROPERTY() UPROPERTY()
AController* InitialController = nullptr; AController* InitialController = nullptr;