Skip to content

Commit ae71f5c

Browse files
committed
Initial commit.
1 parent 29fb85c commit ae71f5c

File tree

8 files changed

+365
-0
lines changed

8 files changed

+365
-0
lines changed

AgoraViewportClient.uplugin

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
{
2+
"FileVersion": 3,
3+
"Version": 1,
4+
"VersionName": "1.0",
5+
"FriendlyName": "Agora Viewport Client",
6+
"Description": "Custom Viewport Client that shows some information on your Game Viewport",
7+
"Category": "Satheesh",
8+
"CreatedBy": "Satheesh Pv (ryanjon2040)",
9+
"CreatedByURL": "https://www.patreon.com/ryanjon2040",
10+
"DocsURL": "",
11+
"MarketplaceURL": "",
12+
"SupportURL": "",
13+
"CanContainContent": false,
14+
"IsBetaVersion": false,
15+
"IsExperimentalVersion": false,
16+
"Installed": true,
17+
"Modules": [
18+
{
19+
"Name": "AgoraViewportClient",
20+
"Type": "Runtime",
21+
"LoadingPhase": "Default",
22+
"WhitelistPlatforms": [
23+
"Win64",
24+
"Win32",
25+
"Mac",
26+
"Android",
27+
"IOS",
28+
"PS4",
29+
"XboxOne"
30+
]
31+
}
32+
]
33+
}

Resources/Icon128.png

34.1 KB
Loading
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// Created by Satheesh (Twitter: @ryanjon2040 - Discord: ryanjon2040#5319). Please support Agora by becoming a Patron: https://www.patreon.com/ryanjon2040.
2+
3+
using UnrealBuildTool;
4+
5+
public class AgoraViewportClient : ModuleRules
6+
{
7+
public AgoraViewportClient(ReadOnlyTargetRules Target) : base(Target)
8+
{
9+
PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;
10+
11+
PublicDependencyModuleNames.AddRange(new string[] { "Core" });
12+
PrivateDependencyModuleNames.AddRange(new string[] { "CoreUObject", "Engine", "Slate", "SlateCore", "RHI" } );
13+
}
14+
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
// Created by Satheesh (Twitter: @ryanjon2040 - Discord: ryanjon2040#5319). Please support Agora by becoming a Patron: https://www.patreon.com/ryanjon2040.
2+
3+
#include "AgoraGameViewportClient.h"
4+
#include "AgoraViewportClientSettings.h"
5+
#include "Runtime/SlateCore/Public/Styling/CoreStyle.h"
6+
#include "Runtime/Slate/Public/Widgets/Text/STextBlock.h"
7+
8+
#define GET_DEFAULT_FONT(...) FCoreStyle::GetDefaultFontStyle(__VA_ARGS__)
9+
10+
void SAgoraWatermarkCompoundWidget::Construct(const FArguments& InArgs)
11+
{
12+
const UAgoraViewportClientSettings* AgoraViewportClientSettings = UAgoraViewportClientSettings::Get();
13+
const FAgoraViewportText TitleText = AgoraViewportClientSettings->GetTitle();
14+
const FAgoraViewportText CreatedBy = AgoraViewportClientSettings->GetCreatedBy();
15+
const FAgoraViewportText SystemDetails = AgoraViewportClientSettings->GetSystemDetails();
16+
17+
FFormatNamedArguments Args;
18+
Args.Add("CreatedBy", CreatedBy.Text);
19+
Args.Add("EngineBuild", AgoraViewportClientSettings->GetUnrealEngineVersionText());
20+
const FText CreatedByText = AgoraViewportClientSettings->AddBuiltWithUE4VersionToCreatedBy() ?
21+
FText::Format(FText::AsCultureInvariant("{CreatedBy}\n{EngineBuild}"), Args) : CreatedBy.Text;
22+
23+
ChildSlot
24+
[
25+
SNew(SOverlay)
26+
+ SOverlay::Slot()
27+
.Padding(TitleText.Padding.X, TitleText.Padding.Y)
28+
.VAlign(TitleText.VerticalAlignment)
29+
.HAlign(TitleText.HorizontalAlignment)
30+
[
31+
SNew(STextBlock)
32+
.Visibility(TitleText.bEnabled ? EVisibility::HitTestInvisible : EVisibility::Collapsed)
33+
.Font(GET_DEFAULT_FONT("BoldCondensed", TitleText.FontSize)) // Style from SlateEditorStyle.cpp @line: 4355 (as of 4.22)
34+
.ColorAndOpacity(TitleText.Color)
35+
.ShadowColorAndOpacity(TitleText.ShadowColor)
36+
.ShadowOffset(TitleText.ShadowOffset)
37+
.Text(TAttribute<FText>(TitleText.Text))
38+
]
39+
40+
+ SOverlay::Slot()
41+
.Padding(CreatedBy.Padding.X, CreatedBy.Padding.Y)
42+
.VAlign(CreatedBy.VerticalAlignment)
43+
.HAlign(CreatedBy.HorizontalAlignment)
44+
[
45+
SNew(STextBlock)
46+
.Visibility(CreatedBy.bEnabled ? EVisibility::HitTestInvisible : EVisibility::Collapsed)
47+
.Font(GET_DEFAULT_FONT("BoldCondensed", CreatedBy.FontSize))
48+
.ColorAndOpacity(CreatedBy.Color)
49+
.ShadowColorAndOpacity(CreatedBy.ShadowColor)
50+
.ShadowOffset(CreatedBy.ShadowOffset)
51+
.Text(TAttribute<FText>(CreatedByText))
52+
]
53+
54+
+ SOverlay::Slot()
55+
.Padding(SystemDetails.Padding.X, SystemDetails.Padding.Y)
56+
.VAlign(SystemDetails.VerticalAlignment)
57+
.HAlign(SystemDetails.HorizontalAlignment)
58+
[
59+
SNew(STextBlock)
60+
.Visibility(SystemDetails.bEnabled ? EVisibility::HitTestInvisible : EVisibility::Collapsed)
61+
.Font(GET_DEFAULT_FONT("BoldCondensed", SystemDetails.FontSize))
62+
.ColorAndOpacity(SystemDetails.Color)
63+
.ShadowColorAndOpacity(SystemDetails.ShadowColor)
64+
.ShadowOffset(SystemDetails.ShadowOffset)
65+
.Text(TAttribute<FText>(SystemDetails.Text))
66+
]
67+
];
68+
}
69+
70+
void UAgoraGameViewportClient::Activated(FViewport* InViewport, const FWindowActivateEvent& InActivateEvent)
71+
{
72+
Super::Activated(InViewport, InActivateEvent);
73+
if (UAgoraViewportClientSettings::Get()->IsEnabled())
74+
{
75+
ShowWatermarkOnScreen();
76+
}
77+
}
78+
79+
void UAgoraGameViewportClient::ShowWatermarkOnScreen()
80+
{
81+
if (AgoraWatermark.IsValid())
82+
{
83+
return;
84+
}
85+
86+
AgoraWatermark = SNew(SAgoraWatermarkCompoundWidget);
87+
AgoraWatermark->SetVisibility(EVisibility::HitTestInvisible);
88+
AddViewportWidgetContent(AgoraWatermark.ToSharedRef(), MAX_int32);
89+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// Created by Satheesh (Twitter: @ryanjon2040 - Discord: ryanjon2040#5319). Please support Agora by becoming a Patron: https://www.patreon.com/ryanjon2040.
2+
3+
#include "AgoraViewportClient.h"
4+
5+
#define LOCTEXT_NAMESPACE "FAgoraViewportClient"
6+
7+
DEFINE_LOG_CATEGORY_STATIC(LogAgoraViewportClient, All, All)
8+
9+
void FAgoraViewportClient::StartupModule()
10+
{
11+
// This code will execute after your module is loaded into memory; the exact timing is specified in the .uplugin file per-module
12+
UE_LOG(LogAgoraViewportClient, Log, TEXT("Agora Viewport Client module started."));
13+
}
14+
15+
void FAgoraViewportClient::ShutdownModule()
16+
{
17+
// This function may be called during shutdown to clean up your module. For modules that support dynamic reloading,
18+
// we call this function before unloading the module.
19+
UE_LOG(LogAgoraViewportClient, Log, TEXT("Agora Viewport Client module shutdown."));
20+
}
21+
22+
#undef LOCTEXT_NAMESPACE
23+
24+
IMPLEMENT_MODULE(FAgoraViewportClient, AgoraViewportClient)
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
// Created by Satheesh (Twitter: @ryanjon2040 - Discord: ryanjon2040#5319). Please support Agora by becoming a Patron: https://www.patreon.com/ryanjon2040.
2+
3+
#pragma once
4+
5+
#include "CoreMinimal.h"
6+
#include "Engine/GameViewportClient.h"
7+
#include "Runtime/SlateCore/Public/Widgets/SCompoundWidget.h"
8+
#include "AgoraGameViewportClient.generated.h"
9+
10+
class SAgoraWatermarkCompoundWidget : public SCompoundWidget
11+
{
12+
public:
13+
SLATE_BEGIN_ARGS(SAgoraWatermarkCompoundWidget) {}
14+
SLATE_END_ARGS()
15+
16+
void Construct(const FArguments& InArgs);
17+
18+
private:
19+
EVisibility GetLoadIndicatorVisibility() const
20+
{
21+
return EVisibility::Visible;
22+
}
23+
24+
TSharedPtr<SOverlay> WatermarkOverlay;
25+
};
26+
27+
UCLASS()
28+
class AGORAVIEWPORTCLIENT_API UAgoraGameViewportClient : public UGameViewportClient
29+
{
30+
GENERATED_BODY()
31+
32+
public:
33+
34+
virtual void Activated(FViewport* InViewport, const FWindowActivateEvent& InActivateEvent) override;
35+
36+
TSharedPtr<SAgoraWatermarkCompoundWidget> AgoraWatermark;
37+
void ShowWatermarkOnScreen();
38+
39+
};
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// Created by Satheesh (Twitter: @ryanjon2040 - Discord: ryanjon2040#5319). Please support Agora by becoming a Patron: https://www.patreon.com/ryanjon2040.
2+
3+
#pragma once
4+
5+
#include "CoreMinimal.h"
6+
#include "Modules/ModuleManager.h"
7+
8+
class FAgoraViewportClient : public IModuleInterface
9+
{
10+
public:
11+
12+
/** IModuleInterface implementation */
13+
virtual void StartupModule() override;
14+
virtual void ShutdownModule() override;
15+
};
Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
// Created by Satheesh (Twitter: @ryanjon2040 - Discord: ryanjon2040#5319). Please support Agora by becoming a Patron: https://www.patreon.com/ryanjon2040.
2+
3+
#pragma once
4+
5+
#include "CoreMinimal.h"
6+
7+
#include "Engine/DeveloperSettings.h"
8+
#include "HardwareInfo.h"
9+
#include "GenericPlatform/GenericPlatformDriver.h"
10+
#include "Launch/Resources/Version.h"
11+
#include "AgoraViewportClientSettings.generated.h"
12+
13+
USTRUCT(BlueprintType)
14+
struct FAgoraViewportText
15+
{
16+
GENERATED_USTRUCT_BODY()
17+
18+
UPROPERTY(EditAnywhere, Category="Agora Viewport Text")
19+
bool bEnabled;
20+
21+
UPROPERTY(EditAnywhere, Category="Agora Viewport Text", meta = (EditCondition = "bEnabled"))
22+
FText Text;
23+
24+
UPROPERTY(EditAnywhere, Category="Agora Viewport Text", meta = (EditCondition = "bEnabled"))
25+
TEnumAsByte<EHorizontalAlignment> HorizontalAlignment;
26+
27+
UPROPERTY(EditAnywhere, Category="Agora Viewport Text", meta = (EditCondition = "bEnabled"))
28+
TEnumAsByte<EVerticalAlignment> VerticalAlignment;
29+
30+
UPROPERTY(EditAnywhere, Category="Agora Viewport Text", meta = (EditCondition = "bEnabled"))
31+
FIntPoint Padding;
32+
33+
UPROPERTY(EditAnywhere, Category="Agora Viewport Text", meta = (EditCondition = "bEnabled"))
34+
FLinearColor Color;
35+
36+
UPROPERTY(EditAnywhere, Category="Agora Viewport Text", meta = (EditCondition = "bEnabled"))
37+
FLinearColor ShadowColor;
38+
39+
UPROPERTY(EditAnywhere, Category="Agora Viewport Text", meta = (EditCondition = "bEnabled"))
40+
FVector2D ShadowOffset;
41+
42+
UPROPERTY(EditAnywhere, Category="Agora Viewport Text", meta = (EditCondition = "bEnabled"))
43+
int32 FontSize;
44+
45+
FAgoraViewportText()
46+
{
47+
bEnabled = true;
48+
Padding = FIntPoint(10);
49+
Color = FLinearColor(0.8, 0.8f, 0.8f, 0.2f);
50+
ShadowColor = FLinearColor(0.f, 0.f, 0.f, 0.0);
51+
ShadowOffset = FVector2D::ZeroVector;
52+
FontSize = 14;
53+
}
54+
};
55+
56+
UCLASS(config = AgoraViewportClient, defaultconfig)
57+
class AGORAVIEWPORTCLIENT_API UAgoraViewportClientSettings : public UDeveloperSettings
58+
{
59+
GENERATED_BODY()
60+
61+
private:
62+
63+
/** Enable or disable features.*/
64+
UPROPERTY(Config, EditAnywhere, Category = "Agora Viewport Client")
65+
uint8 bEnable : 1;
66+
67+
UPROPERTY(Config, EditAnywhere, Category = "Agora Viewport Client", meta = (EditCondition = "bEnable"))
68+
uint8 bAddBuiltWithEngineVersionToCreatedBy : 1;
69+
70+
UPROPERTY(Config, EditAnywhere, Category = "Agora Viewport Client", meta = (EditCondition = "bEnable"))
71+
FAgoraViewportText TitleText;
72+
73+
UPROPERTY(Config, EditAnywhere, Category = "Agora Viewport Client", meta = (EditCondition = "bEnable"))
74+
FAgoraViewportText CreatedBy;
75+
76+
UPROPERTY(Config, EditAnywhere, Category = "Agora Viewport Client", meta = (EditCondition = "bEnable"))
77+
FAgoraViewportText SystemDetails;
78+
79+
public:
80+
81+
UAgoraViewportClientSettings()
82+
{
83+
bEnable = true;
84+
bAddBuiltWithEngineVersionToCreatedBy = true;
85+
86+
TitleText.Text = NSLOCTEXT("Agora", "AgoraViewportClientTitle", "WORK IN PROGRESS - DOES NOT REPRESENT FINAL LOOK OF THE GAME");
87+
TitleText.HorizontalAlignment = HAlign_Center;
88+
TitleText.VerticalAlignment = VAlign_Top;
89+
TitleText.Padding = FIntPoint(10, 100);
90+
TitleText.FontSize = 24;
91+
92+
CreatedBy.Text = NSLOCTEXT("Agora", "AgoraViewportClientCreatedBy", "Created by <YOUR_NAME_HERE>");
93+
CreatedBy.VerticalAlignment = VAlign_Bottom;
94+
CreatedBy.HorizontalAlignment = HAlign_Left;
95+
CreatedBy.Padding = FIntPoint(10);
96+
CreatedBy.FontSize = 16;
97+
98+
FFormatNamedArguments Args;
99+
static const FGPUDriverInfo GPUDriverInfo = FPlatformMisc::GetGPUDriverInfo(GRHIAdapterName);
100+
#if PLATFORM_WINDOWS
101+
Args.Add(TEXT("CpuBrand"), FText::FromString(FString(FWindowsPlatformMisc::GetCPUBrand())));
102+
Args.Add(TEXT("CpuCores"), FText::AsNumber(FWindowsPlatformMisc::NumberOfCores()));
103+
Args.Add(TEXT("GpuBrand"), FText::FromString(FWindowsPlatformMisc::GetPrimaryGPUBrand()));
104+
#elif PLATFORM_MAC
105+
Args.Add(TEXT("CpuBrand"), FText::FromString(FString(FMacPlatformMisc::GetCPUBrand())));
106+
Args.Add(TEXT("CpuCores"), FText::AsNumber(FMacPlatformMisc::NumberOfCores()));
107+
Args.Add(TEXT("GpuBrand"), FText::FromString(FMacPlatformMisc::GetPrimaryGPUBrand()));
108+
#elif PLATFORM_LINUX
109+
Args.Add(TEXT("CpuBrand"), FText::FromString(FString(FLinuxPlatformMisc::GetCPUBrand())));
110+
Args.Add(TEXT("CpuCores"), FText::AsNumber(FLinuxPlatformMisc::NumberOfCores()));
111+
Args.Add(TEXT("GpuBrand"), FText::FromString(FLinuxPlatformMisc::GetPrimaryGPUBrand()));
112+
#else
113+
Args.Add(TEXT("CpuBrand"), FText::FromString(FString(FPlatformMisc::GetCPUBrand())));
114+
Args.Add(TEXT("CpuCores"), FText::AsNumber(FPlatformMisc::NumberOfCores()));
115+
Args.Add(TEXT("GpuBrand"), FText::FromString(FPlatformMisc::GetPrimaryGPUBrand()));
116+
#endif
117+
118+
Args.Add(TEXT("GpuDriver"), FText::FromString(GPUDriverInfo.UserDriverVersion));
119+
Args.Add(TEXT("RHI"), FText::FromString(FHardwareInfo::GetHardwareInfo(NAME_RHI)));
120+
SystemDetails.Text = FText::Format(NSLOCTEXT("Agora", "AgoraViewportClientSystemDetails", "{CpuBrand} ({CpuCores} Cores)\n{GpuBrand} ({RHI})\nDriver: {GpuDriver}"), Args);
121+
SystemDetails.VerticalAlignment = VAlign_Bottom;
122+
SystemDetails.HorizontalAlignment = HAlign_Right;
123+
SystemDetails.Padding = FIntPoint(10);
124+
SystemDetails.FontSize = 18;
125+
}
126+
127+
static FORCEINLINE const UAgoraViewportClientSettings* Get()
128+
{
129+
const UAgoraViewportClientSettings* ProxyDevSettings = CastChecked<UAgoraViewportClientSettings>(UAgoraViewportClientSettings::StaticClass()->GetDefaultObject());
130+
return ProxyDevSettings;
131+
}
132+
133+
#if WITH_EDITOR
134+
virtual FName GetCategoryName() const override final { return TEXT("Agora"); }
135+
virtual FText GetSectionText() const override final { return FText::FromString("Agora Viewport Client"); }
136+
#endif
137+
138+
FORCEINLINE bool IsEnabled() const { return bEnable; }
139+
FORCEINLINE FAgoraViewportText GetTitle() const { return TitleText; }
140+
FORCEINLINE FAgoraViewportText GetCreatedBy() const { return CreatedBy; }
141+
FORCEINLINE FAgoraViewportText GetSystemDetails() const { return SystemDetails; }
142+
143+
FORCEINLINE bool AddBuiltWithUE4VersionToCreatedBy() const { return bAddBuiltWithEngineVersionToCreatedBy; }
144+
static FORCEINLINE FText GetUnrealEngineVersionText()
145+
{
146+
static FFormatNamedArguments Args;
147+
Args.Add(TEXT("UnrealEngineVersion"), FText::FromString(FString(ENGINE_VERSION_STRING)));
148+
static const FText BuiltText = FText::Format(NSLOCTEXT("Agora", "AgoraViewportClientEngineVersion", "Built using Unreal Engine {UnrealEngineVersion}"), Args);
149+
return BuiltText;
150+
}
151+
};

0 commit comments

Comments
 (0)