From fb8a01915e055c5991fc69fa1818d812a2e43ce3 Mon Sep 17 00:00:00 2001 From: Jordon Brooks Date: Mon, 8 Jan 2024 16:53:13 +0000 Subject: [PATCH 01/30] Added marketplace stuff --- Config/FilterPlugin.ini | 8 +++++ HarmonyLink.uplugin | 15 ++++---- Source/HarmonyLink/HarmonyLink.Build.cs | 23 ++++++++++--- .../Private/HarmonyLinkLibrary.cpp | 3 +- .../HarmonyLink/Private/Structs/Battery.cpp | 2 +- .../HarmonyLink/Private/Structs/CPUInfo.cpp | 2 +- Source/HarmonyLink/Private/Structs/Device.cpp | 4 ++- .../HarmonyLink/Private/Structs/OSVerInfo.cpp | 4 ++- Source/HarmonyLink/Public/Enums/DeviceEnum.h | 8 +++-- Source/HarmonyLink/Public/Enums/Platform.h | 8 +++-- .../HarmonyLink/Public/HarmonyLinkLibrary.h | 17 +++++++--- Source/HarmonyLink/Public/Structs/Battery.h | 17 ++++++---- Source/HarmonyLink/Public/Structs/CPUInfo.h | 23 ++++++++----- Source/HarmonyLink/Public/Structs/Device.h | 26 ++++++++++---- Source/HarmonyLink/Public/Structs/OSVerInfo.h | 32 +++++++++++------- .../bin/Linux/libHarmonyLinkLib.so | Bin 419512 -> 454760 bytes 16 files changed, 131 insertions(+), 61 deletions(-) create mode 100644 Config/FilterPlugin.ini diff --git a/Config/FilterPlugin.ini b/Config/FilterPlugin.ini new file mode 100644 index 0000000..ccebca2 --- /dev/null +++ b/Config/FilterPlugin.ini @@ -0,0 +1,8 @@ +[FilterPlugin] +; This section lists additional files which will be packaged along with your plugin. Paths should be listed relative to the root plugin directory, and +; may include "...", "*", and "?" wildcards to match directories, files, and individual characters respectively. +; +; Examples: +; /README.txt +; /Extras/... +; /Binaries/ThirdParty/*.dll diff --git a/HarmonyLink.uplugin b/HarmonyLink.uplugin index c69226e..c0a42aa 100644 --- a/HarmonyLink.uplugin +++ b/HarmonyLink.uplugin @@ -3,22 +3,23 @@ "Version": 1, "VersionName": "1.0", "FriendlyName": "HarmonyLink", - "Description": "", - "Category": "Other", + "Description": "Revolutionize handheld gaming with adaptive game settings. Optimize graphics and gameplay experience based on real-time system metrics. Open-source project empowering developers to enhance games on portable devices", + "Category": "Handheld", "CreatedBy": "Jordon Brooks", "CreatedByURL": "https://jordongamedev.co.uk", - "DocsURL": "", - "MarketplaceURL": "", + "DocsURL": "https://github.com/Jordonbc/HarmonyLink", + "MarketplaceURL": "com.epicgames.launcher://ue/marketplace/product/92fd511971274d1f955abb7197485041", "SupportURL": "", "CanContainContent": true, - "IsBetaVersion": true, - "IsExperimentalVersion": true, + "IsBetaVersion": false, + "IsExperimentalVersion": false, "Installed": false, "Modules": [ { "Name": "HarmonyLink", "Type": "Runtime", - "LoadingPhase": "Default" + "LoadingPhase": "Default", + "WhitelistPlatforms": ["Win64", "Linux"] } ] } diff --git a/Source/HarmonyLink/HarmonyLink.Build.cs b/Source/HarmonyLink/HarmonyLink.Build.cs index ede23b2..4880eca 100644 --- a/Source/HarmonyLink/HarmonyLink.Build.cs +++ b/Source/HarmonyLink/HarmonyLink.Build.cs @@ -30,7 +30,6 @@ public class HarmonyLink : ModuleRules "Core", "CoreUObject", "Engine", - "Projects" // ... add other public dependencies that you statically link with here ... } ); @@ -51,9 +50,23 @@ public class HarmonyLink : ModuleRules } ); - PublicAdditionalLibraries.Add(Path.Combine(PluginDirectory, "Source/ThirdParty/HarmonyLinkLib/bin/Win64/HarmonyLinkLib.lib")); - - - RuntimeDependencies.Add("$(BinaryOutputDir)/HarmonyLinkLib.dll", Path.Combine(PluginDirectory, "Source/ThirdParty/HarmonyLinkLib/bin/Win64/HarmonyLinkLib.dll")); + // Platform-specific settings + if (Target.Platform == UnrealTargetPlatform.Win64) + { + PublicAdditionalLibraries.Add(Path.Combine(PluginDirectory, "Source/ThirdParty/HarmonyLinkLib/bin/Win64/HarmonyLinkLib.lib")); + RuntimeDependencies.Add("$(BinaryOutputDir)/HarmonyLinkLib.dll", Path.Combine(PluginDirectory, "Source/ThirdParty/HarmonyLinkLib/bin/Win64/HarmonyLinkLib.dll")); + } + else if (Target.Platform == UnrealTargetPlatform.Linux) + { + PublicAdditionalLibraries.Add(Path.Combine(PluginDirectory, "Source/ThirdParty/HarmonyLinkLib/bin/Linux/libHarmonyLinkLib.so")); + RuntimeDependencies.Add("$(BinaryOutputDir)/libHarmonyLinkLib.so", Path.Combine(PluginDirectory, "Source/ThirdParty/HarmonyLinkLib/bin/Linux/libHarmonyLinkLib.so")); + } + + // I shall include this if anyone wishes to provide Mac binaries of HarmonyLink but these are not included by default as I don't own one. + else if (Target.Platform == UnrealTargetPlatform.Mac) + { + PublicAdditionalLibraries.Add(Path.Combine(PluginDirectory, "Source/ThirdParty/HarmonyLinkLib/bin/Mac/HarmonyLinkLib.dylib")); + RuntimeDependencies.Add("$(BinaryOutputDir)/HarmonyLinkLib.dylib", Path.Combine(PluginDirectory, "Source/ThirdParty/HarmonyLinkLib/bin/Mac/HarmonyLinkLib.dylib")); + } } } diff --git a/Source/HarmonyLink/Private/HarmonyLinkLibrary.cpp b/Source/HarmonyLink/Private/HarmonyLinkLibrary.cpp index e2de5d4..ed3f0d9 100644 --- a/Source/HarmonyLink/Private/HarmonyLinkLibrary.cpp +++ b/Source/HarmonyLink/Private/HarmonyLinkLibrary.cpp @@ -1,5 +1,4 @@ -// Copyright (C) 2023 Jordon Brooks - +// Copyright (C) 2024 Jordon Brooks #include "HarmonyLinkLibrary.h" diff --git a/Source/HarmonyLink/Private/Structs/Battery.cpp b/Source/HarmonyLink/Private/Structs/Battery.cpp index 3978e75..0b23e6d 100644 --- a/Source/HarmonyLink/Private/Structs/Battery.cpp +++ b/Source/HarmonyLink/Private/Structs/Battery.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2023 Jordon Brooks +// Copyright (C) 2024 Jordon Brooks #include "Structs/Battery.h" diff --git a/Source/HarmonyLink/Private/Structs/CPUInfo.cpp b/Source/HarmonyLink/Private/Structs/CPUInfo.cpp index f075203..c13d94d 100644 --- a/Source/HarmonyLink/Private/Structs/CPUInfo.cpp +++ b/Source/HarmonyLink/Private/Structs/CPUInfo.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2023 Jordon Brooks +// Copyright (C) 2024 Jordon Brooks #include "Structs/CPUInfo.h" diff --git a/Source/HarmonyLink/Private/Structs/Device.cpp b/Source/HarmonyLink/Private/Structs/Device.cpp index 1e2845a..a52de5f 100644 --- a/Source/HarmonyLink/Private/Structs/Device.cpp +++ b/Source/HarmonyLink/Private/Structs/Device.cpp @@ -1,4 +1,6 @@ -#include "Structs/Device.h" +// Copyright (C) 2024 Jordon Brooks + +#include "Structs/Device.h" #include diff --git a/Source/HarmonyLink/Private/Structs/OSVerInfo.cpp b/Source/HarmonyLink/Private/Structs/OSVerInfo.cpp index 1d502bb..36f3671 100644 --- a/Source/HarmonyLink/Private/Structs/OSVerInfo.cpp +++ b/Source/HarmonyLink/Private/Structs/OSVerInfo.cpp @@ -1,4 +1,6 @@ -#include "Structs/OSVerInfo.h" +// Copyright (C) 2024 Jordon Brooks + +#include "Structs/OSVerInfo.h" FOSVerInfo::FOSVerInfo(HarmonyLinkLib::FOSVerInfo* oldInfo) { diff --git a/Source/HarmonyLink/Public/Enums/DeviceEnum.h b/Source/HarmonyLink/Public/Enums/DeviceEnum.h index fe3aa8e..64320c8 100644 --- a/Source/HarmonyLink/Public/Enums/DeviceEnum.h +++ b/Source/HarmonyLink/Public/Enums/DeviceEnum.h @@ -1,10 +1,12 @@ -#pragma once +// Copyright (C) 2024 Jordon Brooks + +#pragma once #include "CoreMinimal.h" #include "DeviceEnum.generated.h" -/** - * +/* + * Enum representing different operating system platforms. */ UENUM(BlueprintType) enum class EDeviceEnum : uint8 diff --git a/Source/HarmonyLink/Public/Enums/Platform.h b/Source/HarmonyLink/Public/Enums/Platform.h index 492c31b..2ffb255 100644 --- a/Source/HarmonyLink/Public/Enums/Platform.h +++ b/Source/HarmonyLink/Public/Enums/Platform.h @@ -1,10 +1,12 @@ -#pragma once +// Copyright (C) 2024 Jordon Brooks + +#pragma once #include "CoreMinimal.h" #include "Platform.generated.h" -/** - * +/* + * Enum representing different operating system platforms. */ UENUM(BlueprintType) enum class EPlatform : uint8 diff --git a/Source/HarmonyLink/Public/HarmonyLinkLibrary.h b/Source/HarmonyLink/Public/HarmonyLinkLibrary.h index 9a3df81..373e583 100644 --- a/Source/HarmonyLink/Public/HarmonyLinkLibrary.h +++ b/Source/HarmonyLink/Public/HarmonyLinkLibrary.h @@ -1,41 +1,50 @@ -// Copyright (C) 2023 Jordon Brooks +// Copyright (C) 2024 Jordon Brooks #pragma once #include "CoreMinimal.h" -#include "Kismet/BlueprintFunctionLibrary.h" + #include "Structs/Battery.h" #include "Structs/CPUInfo.h" #include "Structs/Device.h" #include "Structs/OSVerInfo.h" + +#include "Kismet/BlueprintFunctionLibrary.h" #include "HarmonyLinkLibrary.generated.h" /** - * + * Library of static functions for accessing various system information, particularly for the HarmonyLink project. */ UCLASS() class HARMONYLINK_API UHarmonyLinkLibrary : public UBlueprintFunctionLibrary { GENERATED_BODY() + // Checks if the game is running under Wine. UFUNCTION(BlueprintCallable, Category="HarmonyLink") static bool IsWine(); - + + // Checks if the operating system is Linux. UFUNCTION(BlueprintCallable, Category="HarmonyLink") static bool IsLinux(); + // Checks if the game is running on a Steam Deck. UFUNCTION(BlueprintCallable, Category="HarmonyLink") static bool IsSteamDeck(); + // Retrieves information about the CPU of the current device. UFUNCTION(BlueprintCallable, Category="HarmonyLink") static FCPUInfo GetCPUInfo(); + // Retrieves information about the current device. UFUNCTION(BlueprintCallable, Category="HarmonyLink") static FDevice GetDeviceInfo(); + // Retrieves information about the operating system of the current device. UFUNCTION(BlueprintCallable, Category="HarmonyLink") static FOSVerInfo GetOSInfo(); + // Retrieves the current battery status of the device. UFUNCTION(BlueprintCallable, Category="HarmonyLink") static FBattery GetBatteryStatus(); }; diff --git a/Source/HarmonyLink/Public/Structs/Battery.h b/Source/HarmonyLink/Public/Structs/Battery.h index fd4c278..6b8ec43 100644 --- a/Source/HarmonyLink/Public/Structs/Battery.h +++ b/Source/HarmonyLink/Public/Structs/Battery.h @@ -1,4 +1,4 @@ -// Copyright (C) 2023 Jordon Brooks +// Copyright (C) 2024 Jordon Brooks #pragma once #include @@ -6,8 +6,8 @@ #include "CoreMinimal.h" #include "Battery.generated.h" -/** - * +/* + * Represents the battery status and information of a device. */ USTRUCT(BlueprintType) struct FBattery @@ -16,14 +16,19 @@ struct FBattery FBattery() {} - UPROPERTY(BlueprintReadWrite, EditAnywhere) + // Indicates whether the device has a battery. + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category="HarmonyLink") bool HasBattery = false; - UPROPERTY(BlueprintReadWrite, EditAnywhere) + // Indicates whether the device is connected to AC power. + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category="HarmonyLink") bool IsACConnected = false; - UPROPERTY(BlueprintReadWrite, EditAnywhere) + // The current battery percentage of the device. + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category="HarmonyLink") int32 BatteryPercent = 0; + // Constructor that initializes the struct with information from an external battery source. + // @param battery Pointer to an external FBattery structure to copy data from. FBattery(HarmonyLinkLib::FBattery* battery); }; diff --git a/Source/HarmonyLink/Public/Structs/CPUInfo.h b/Source/HarmonyLink/Public/Structs/CPUInfo.h index 97d0f95..e6cbd9d 100644 --- a/Source/HarmonyLink/Public/Structs/CPUInfo.h +++ b/Source/HarmonyLink/Public/Structs/CPUInfo.h @@ -1,4 +1,4 @@ -// Copyright (C) 2023 Jordon Brooks +// Copyright (C) 2024 Jordon Brooks #pragma once @@ -7,8 +7,8 @@ #include "CoreMinimal.h" #include "CPUInfo.generated.h" -/** - * +/* + * Represents information about the CPU of a device. */ USTRUCT(BlueprintType) struct FCPUInfo @@ -17,20 +17,27 @@ struct FCPUInfo FCPUInfo() {} - UPROPERTY(BlueprintReadWrite, EditAnywhere) + // The vendor identifier for the CPU. + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category="HarmonyLink") FString VendorID; - UPROPERTY(BlueprintReadWrite, EditAnywhere) + // The model name of the CPU. + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category="HarmonyLink") FString ModelName; - UPROPERTY(BlueprintReadWrite, EditAnywhere) + // The number of physical cores in the CPU. + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category="HarmonyLink") int32 PhysicalCores = 0; - UPROPERTY(BlueprintReadWrite, EditAnywhere) + // The number of logical cores in the CPU (may be different from physical cores). + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category="HarmonyLink") int32 LogicalCores = 0; - UPROPERTY(BlueprintReadWrite, EditAnywhere) + // A set of flags representing various features or capabilities of the CPU. + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category="HarmonyLink") TSet Flags; + // Constructor that initializes the struct with information from an external CPU info source. + // @param cpu_info Pointer to an external FCPUInfo structure to copy data from. FCPUInfo(HarmonyLinkLib::FCPUInfo* cpu_info); }; diff --git a/Source/HarmonyLink/Public/Structs/Device.h b/Source/HarmonyLink/Public/Structs/Device.h index 00c7ad2..071d13c 100644 --- a/Source/HarmonyLink/Public/Structs/Device.h +++ b/Source/HarmonyLink/Public/Structs/Device.h @@ -1,4 +1,6 @@ -#pragma once +// Copyright (C) 2024 Jordon Brooks + +#pragma once #include "CoreMinimal.h" #include "Enums/DeviceEnum.h" @@ -7,9 +9,7 @@ #include "Device.generated.h" -/** - * - */ +// Represents information about a specific device. USTRUCT(BlueprintType) struct FDevice { @@ -17,14 +17,28 @@ struct FDevice FDevice() {} - UPROPERTY(BlueprintReadWrite, EditAnywhere) + // The platform on which the device operates. Note: This can differ from the build platform. + // For example, if the device is identified as running on Wine, this will show Linux, + // regardless of the build being an executable for Windows. + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category="HarmonyLink") EPlatform Platform = EPlatform::WINDOWS; - UPROPERTY(BlueprintReadWrite, EditAnywhere) + // The type of the device. + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category="HarmonyLink") EDeviceEnum Device = EDeviceEnum::DESKTOP; + // Constructor that initializes the struct with information from an external source. + // @param oldDevice Pointer to an external FDevice structure to copy data from. FDevice(HarmonyLinkLib::FDevice* oldDevice); +private: + // Converts an external device enum to the internal EDeviceEnum type. + // @param Device External device enum to convert. + // @returns Converted EDeviceEnum value. static EDeviceEnum Convert(HarmonyLinkLib::EDevice Device); + + // Converts an external platform enum to the internal EPlatform type. + // @param Platform External platform enum to convert. + // @returns Converted EPlatform value. static EPlatform Convert(HarmonyLinkLib::EPlatform Platform); }; diff --git a/Source/HarmonyLink/Public/Structs/OSVerInfo.h b/Source/HarmonyLink/Public/Structs/OSVerInfo.h index 9d4474f..ea380c8 100644 --- a/Source/HarmonyLink/Public/Structs/OSVerInfo.h +++ b/Source/HarmonyLink/Public/Structs/OSVerInfo.h @@ -1,15 +1,12 @@ -// Copyright (C) 2023 Jordon Brooks +// Copyright (C) 2024 Jordon Brooks #pragma once -#include - #include "CoreMinimal.h" +#include #include "OSVerInfo.generated.h" -/** - * - */ +// Represents information about an operating system version. USTRUCT(BlueprintType) struct FOSVerInfo { @@ -17,26 +14,35 @@ struct FOSVerInfo FOSVerInfo() {} - UPROPERTY(BlueprintReadWrite, EditAnywhere) + // The name of the operating system. + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category="HarmonyLink") FString Name; - UPROPERTY(BlueprintReadWrite, EditAnywhere) + // Numerical version of the operating system. + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category="HarmonyLink") int32 Version = 0; - UPROPERTY(BlueprintReadWrite, EditAnywhere) + // Unique identifier for the operating system. + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category="HarmonyLink") FString ID; - UPROPERTY(BlueprintReadWrite, EditAnywhere) + // Identifier for the specific version of the operating system. + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category="HarmonyLink") FString VersionID; - UPROPERTY(BlueprintReadWrite, EditAnywhere) + // Codename for the operating system version. + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category="HarmonyLink") FString VersionCodename; - UPROPERTY(BlueprintReadWrite, EditAnywhere) + // User-friendly name for the operating system version. + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category="HarmonyLink") FString PrettyName; - UPROPERTY(BlueprintReadWrite, EditAnywhere) + // Variant identifier of the operating system. + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category="HarmonyLink") FString VariantID; + // Constructor that initializes the struct with information from an external source. + // @param oldInfo Pointer to an external FOSVerInfo structure to copy data from. FOSVerInfo(HarmonyLinkLib::FOSVerInfo* oldInfo); }; diff --git a/Source/ThirdParty/HarmonyLinkLib/bin/Linux/libHarmonyLinkLib.so b/Source/ThirdParty/HarmonyLinkLib/bin/Linux/libHarmonyLinkLib.so index 0daf6e280ab9fc8cf95f395677ea98ccad4b78c5..67e068029b2908b4a83274df61bf19138857b365 100644 GIT binary patch literal 454760 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 z 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
  • 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 Iygxht2SH*T+5i9m literal 419512 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%0AK0e8X+&3iB(-u+iHC7 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 From bfa9030c1029e421859a7eb8e2d3e58e03726a79 Mon Sep 17 00:00:00 2001 From: Jordon Brooks Date: Tue, 9 Jan 2024 20:54:04 +0000 Subject: [PATCH 02/30] Added copyright notice --- .gitattributes | 39 ++++++++++++++++++ .../bin/Win64/HarmonyLinkLib.dll | Bin 95744 -> 95744 bytes .../ThirdParty/HarmonyLinkLib/include/Core.h | 14 ++++++- .../HarmonyLinkLib/include/Enums/EDevice.h | 14 +++++++ .../HarmonyLinkLib/include/Enums/EPlatform.h | 14 +++++++ .../HarmonyLinkLib/include/FString.h | 14 ++++++- .../HarmonyLinkLib/include/HarmonyLinkLib.h | 33 ++++++++++++++- .../include/HarmonyLinkStruct.h | 14 +++++++ .../HarmonyLinkLib/include/Structs/FBattery.h | 16 ++++++- .../HarmonyLinkLib/include/Structs/FCPUInfo.h | 14 +++++++ .../HarmonyLinkLib/include/Structs/FDevice.h | 14 +++++++ .../include/Structs/FOSVerInfo.h | 16 ++++++- .../HarmonyLinkLib/include/Version.h | 15 ++++++- .../HarmonyLinkLib/include/Version.h.in | 14 +++++++ 14 files changed, 225 insertions(+), 6 deletions(-) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..970e13f --- /dev/null +++ b/.gitattributes @@ -0,0 +1,39 @@ +* text=auto + +# Sources +*.c text diff=cpp +*.cc text diff=cpp +*.cxx text diff=cpp +*.cpp text diff=cpp +*.cpi text diff=cpp +*.c++ text diff=cpp +*.hpp text diff=cpp +*.h text diff=cpp +*.h++ text diff=cpp +*.hh text diff=cpp + +# Compiled Object files +*.slo binary +*.lo binary +*.o binary +*.obj binary + +# Precompiled Headers +*.gch binary +*.pch binary + +# Compiled Dynamic libraries +*.so binary +*.dylib binary +*.dll binary + +# Compiled Static libraries +*.lai binary +*.la binary +*.a binary +*.lib binary + +# Executables +*.exe binary +*.out binary +*.app binary \ No newline at end of file diff --git a/Source/ThirdParty/HarmonyLinkLib/bin/Win64/HarmonyLinkLib.dll b/Source/ThirdParty/HarmonyLinkLib/bin/Win64/HarmonyLinkLib.dll index c020eef03de811f14a7ede68118878741ec3508c..9c2272bfd055181d062d19264923b68a97e09f6f 100644 GIT binary patch delta 16886 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 Yopn2}?5yAE*x9)A{!X@6D&(C1KX746UjP6A delta 16943 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 diff --git a/Source/ThirdParty/HarmonyLinkLib/include/Core.h b/Source/ThirdParty/HarmonyLinkLib/include/Core.h index 90d63b4..ec6ef9d 100644 --- a/Source/ThirdParty/HarmonyLinkLib/include/Core.h +++ b/Source/ThirdParty/HarmonyLinkLib/include/Core.h @@ -1,4 +1,16 @@ -// Copyright (C) 2023 Jordon Brooks +// Copyright (c) 2024 Jordon Brooks +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. #pragma once diff --git a/Source/ThirdParty/HarmonyLinkLib/include/Enums/EDevice.h b/Source/ThirdParty/HarmonyLinkLib/include/Enums/EDevice.h index 75d3cc5..31f9bfe 100644 --- a/Source/ThirdParty/HarmonyLinkLib/include/Enums/EDevice.h +++ b/Source/ThirdParty/HarmonyLinkLib/include/Enums/EDevice.h @@ -1,3 +1,17 @@ +// Copyright (c) 2024 Jordon Brooks +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + #pragma once #include diff --git a/Source/ThirdParty/HarmonyLinkLib/include/Enums/EPlatform.h b/Source/ThirdParty/HarmonyLinkLib/include/Enums/EPlatform.h index c050ca3..66697ee 100644 --- a/Source/ThirdParty/HarmonyLinkLib/include/Enums/EPlatform.h +++ b/Source/ThirdParty/HarmonyLinkLib/include/Enums/EPlatform.h @@ -1,3 +1,17 @@ +// Copyright (c) 2024 Jordon Brooks +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + #pragma once #include diff --git a/Source/ThirdParty/HarmonyLinkLib/include/FString.h b/Source/ThirdParty/HarmonyLinkLib/include/FString.h index 3f23dc1..68ae766 100644 --- a/Source/ThirdParty/HarmonyLinkLib/include/FString.h +++ b/Source/ThirdParty/HarmonyLinkLib/include/FString.h @@ -1,4 +1,16 @@ -// Copyright (C) 2024 Jordon Brooks +// Copyright (c) 2024 Jordon Brooks +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. #pragma once diff --git a/Source/ThirdParty/HarmonyLinkLib/include/HarmonyLinkLib.h b/Source/ThirdParty/HarmonyLinkLib/include/HarmonyLinkLib.h index 94f07ed..aaa1887 100644 --- a/Source/ThirdParty/HarmonyLinkLib/include/HarmonyLinkLib.h +++ b/Source/ThirdParty/HarmonyLinkLib/include/HarmonyLinkLib.h @@ -1,4 +1,35 @@ -// Copyright (C) 2023 Jordon Brooks +// Copyright (c) 2024 Jordon Brooks +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +/** + * IMPORTANT REMINDER: + * Do NOT use standard output functions like std::cout and printf anywhere in this codebase. + * + * Reason: + * Unreal Engine 5's packaging tool encounters issues with these functions, leading to + * packaging failures. The engine sets stdout to UTF-8, which can cause conflicts with + * these standard functions, resulting in a "SECURE CRT: Invalid parameter detected" error + * during packaging. + * + * This issue once required an extensive debugging effort that lasted over 8 hours. + * To prevent similar issues in the future and ensure smooth packaging, always use + * wide-character versions of these functions, such as wprintf and std::wcout, when working + * within the DLL. These functions are compatible with the UTF-8 setting in Unreal Engine 5. + * + */ + #pragma once diff --git a/Source/ThirdParty/HarmonyLinkLib/include/HarmonyLinkStruct.h b/Source/ThirdParty/HarmonyLinkLib/include/HarmonyLinkStruct.h index aa4497d..362750b 100644 --- a/Source/ThirdParty/HarmonyLinkLib/include/HarmonyLinkStruct.h +++ b/Source/ThirdParty/HarmonyLinkLib/include/HarmonyLinkStruct.h @@ -1,3 +1,17 @@ +// Copyright (c) 2024 Jordon Brooks +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + #pragma once struct HarmonyLinkStruct diff --git a/Source/ThirdParty/HarmonyLinkLib/include/Structs/FBattery.h b/Source/ThirdParty/HarmonyLinkLib/include/Structs/FBattery.h index 6c41595..3a40095 100644 --- a/Source/ThirdParty/HarmonyLinkLib/include/Structs/FBattery.h +++ b/Source/ThirdParty/HarmonyLinkLib/include/Structs/FBattery.h @@ -1,4 +1,18 @@ -#pragma once +// Copyright (c) 2024 Jordon Brooks +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once #include #include diff --git a/Source/ThirdParty/HarmonyLinkLib/include/Structs/FCPUInfo.h b/Source/ThirdParty/HarmonyLinkLib/include/Structs/FCPUInfo.h index 8694e6a..827bc40 100644 --- a/Source/ThirdParty/HarmonyLinkLib/include/Structs/FCPUInfo.h +++ b/Source/ThirdParty/HarmonyLinkLib/include/Structs/FCPUInfo.h @@ -1,3 +1,17 @@ +// Copyright (c) 2024 Jordon Brooks +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + #pragma once #include diff --git a/Source/ThirdParty/HarmonyLinkLib/include/Structs/FDevice.h b/Source/ThirdParty/HarmonyLinkLib/include/Structs/FDevice.h index 204a5da..50a1a5c 100644 --- a/Source/ThirdParty/HarmonyLinkLib/include/Structs/FDevice.h +++ b/Source/ThirdParty/HarmonyLinkLib/include/Structs/FDevice.h @@ -1,3 +1,17 @@ +// Copyright (c) 2024 Jordon Brooks +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + #pragma once #include diff --git a/Source/ThirdParty/HarmonyLinkLib/include/Structs/FOSVerInfo.h b/Source/ThirdParty/HarmonyLinkLib/include/Structs/FOSVerInfo.h index 6b62db3..a308a22 100644 --- a/Source/ThirdParty/HarmonyLinkLib/include/Structs/FOSVerInfo.h +++ b/Source/ThirdParty/HarmonyLinkLib/include/Structs/FOSVerInfo.h @@ -1,4 +1,18 @@ -#pragma once +// Copyright (c) 2024 Jordon Brooks +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once #include "FString.h" #include "HarmonyLinkStruct.h" diff --git a/Source/ThirdParty/HarmonyLinkLib/include/Version.h b/Source/ThirdParty/HarmonyLinkLib/include/Version.h index 61d6e3f..dcc9d33 100644 --- a/Source/ThirdParty/HarmonyLinkLib/include/Version.h +++ b/Source/ThirdParty/HarmonyLinkLib/include/Version.h @@ -1,4 +1,17 @@ -// Copyright (C) 2024 Jordon Brooks +// Copyright (c) 2024 Jordon Brooks +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + #pragma once #include "Core.h" diff --git a/Source/ThirdParty/HarmonyLinkLib/include/Version.h.in b/Source/ThirdParty/HarmonyLinkLib/include/Version.h.in index 4081f8d..08881c5 100644 --- a/Source/ThirdParty/HarmonyLinkLib/include/Version.h.in +++ b/Source/ThirdParty/HarmonyLinkLib/include/Version.h.in @@ -1,3 +1,17 @@ +// Copyright (c) 2024 Jordon Brooks +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + // Version.h.in #pragma once From 832f5ec8cdd75157a6584202c1422a5f90faa236 Mon Sep 17 00:00:00 2001 From: Jordon Brooks <16258926+Jordonbc@users.noreply.github.com> Date: Tue, 9 Jan 2024 22:55:57 +0000 Subject: [PATCH 03/30] Update README.md --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b3ce6e0..059ae81 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,11 @@ This repository hosts the Unreal Engine 5 plugin for HarmonyLink, designed to pr Watch the HarmonyLink Plugin in action, demonstrating its impact on gameplay through a Minecraft mod example:

    - HarmonyLink Demo + HarmonyLink 2.0 Demo +

    + +

    + HarmonyLink 2.0 Demo

    Blueprint Nodes From d01ae5209e4a392c276d2bbf4fb01fa862ef5ef8 Mon Sep 17 00:00:00 2001 From: Jordon Brooks <16258926+Jordonbc@users.noreply.github.com> Date: Wed, 10 Jan 2024 17:02:51 +0000 Subject: [PATCH 04/30] Update HarmonyLink.h --- Source/HarmonyLink/Public/HarmonyLink.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/HarmonyLink/Public/HarmonyLink.h b/Source/HarmonyLink/Public/HarmonyLink.h index 116fad0..9ee5be3 100644 --- a/Source/HarmonyLink/Public/HarmonyLink.h +++ b/Source/HarmonyLink/Public/HarmonyLink.h @@ -1,4 +1,4 @@ -// Copyright Epic Games, Inc. All Rights Reserved. +// Copyright (C) 2024 Jordon Brooks #pragma once From 2ed0cefa3a24de9146b23c3f528ac8cd47ff73ff Mon Sep 17 00:00:00 2001 From: Jordon Brooks <16258926+Jordonbc@users.noreply.github.com> Date: Wed, 10 Jan 2024 17:03:36 +0000 Subject: [PATCH 05/30] Update HarmonyLink.cpp --- Source/HarmonyLink/Private/HarmonyLink.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/HarmonyLink/Private/HarmonyLink.cpp b/Source/HarmonyLink/Private/HarmonyLink.cpp index da94234..88e7005 100644 --- a/Source/HarmonyLink/Private/HarmonyLink.cpp +++ b/Source/HarmonyLink/Private/HarmonyLink.cpp @@ -1,4 +1,4 @@ -// Copyright Epic Games, Inc. All Rights Reserved. +// Copyright (C) 2024 Jordon Brooks #include "HarmonyLink.h" #include "Modules/ModuleManager.h" From dc29a0415601fe2d1aec72cc60db69309551f9bf Mon Sep 17 00:00:00 2001 From: Jordon Brooks <16258926+Jordonbc@users.noreply.github.com> Date: Wed, 10 Jan 2024 17:04:09 +0000 Subject: [PATCH 06/30] Update HarmonyLink.Build.cs --- Source/HarmonyLink/HarmonyLink.Build.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/HarmonyLink/HarmonyLink.Build.cs b/Source/HarmonyLink/HarmonyLink.Build.cs index 4880eca..75e3165 100644 --- a/Source/HarmonyLink/HarmonyLink.Build.cs +++ b/Source/HarmonyLink/HarmonyLink.Build.cs @@ -1,4 +1,4 @@ -// Copyright Epic Games, Inc. All Rights Reserved. +// Copyright (C) 2024 Jordon Brooks using UnrealBuildTool; using System.IO; From 05d9e10e54357b1baaadc332f465dc1dbd66b33f Mon Sep 17 00:00:00 2001 From: Jordon Brooks <16258926+Jordonbc@users.noreply.github.com> Date: Wed, 24 Apr 2024 20:14:15 +0100 Subject: [PATCH 07/30] Update "CreatedByURL" --- HarmonyLink.uplugin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HarmonyLink.uplugin b/HarmonyLink.uplugin index c0a42aa..b083076 100644 --- a/HarmonyLink.uplugin +++ b/HarmonyLink.uplugin @@ -6,7 +6,7 @@ "Description": "Revolutionize handheld gaming with adaptive game settings. Optimize graphics and gameplay experience based on real-time system metrics. Open-source project empowering developers to enhance games on portable devices", "Category": "Handheld", "CreatedBy": "Jordon Brooks", - "CreatedByURL": "https://jordongamedev.co.uk", + "CreatedByURL": "https://bbgames.dev", "DocsURL": "https://github.com/Jordonbc/HarmonyLink", "MarketplaceURL": "com.epicgames.launcher://ue/marketplace/product/92fd511971274d1f955abb7197485041", "SupportURL": "", From f079124c187056ba4222acd3027f8fbc78324c99 Mon Sep 17 00:00:00 2001 From: Jordon Brooks <16258926+Jordonbc@users.noreply.github.com> Date: Wed, 24 Apr 2024 20:22:26 +0100 Subject: [PATCH 08/30] Add marketplace link --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 059ae81..00a0f8c 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,11 @@ This repository hosts the Unreal Engine 5 plugin for HarmonyLink, designed to provide real-time device metrics for handheld gaming, enhancing both gameplay and immersion. + +

    + Download the Marketplace plugin here +

    + ## Features - **Intelligent Hardware Recognition**: HarmonyLink 2.0 can accurately identify specific devices like the Steam Deck without relying on manual environment variables or command line arguments. From 96d5f5c7626fe7cdf21da62823fe97ec38cc64f4 Mon Sep 17 00:00:00 2001 From: Jordon Brooks Date: Wed, 15 May 2024 02:38:38 +0100 Subject: [PATCH 09/30] Add Graphics settings --- Source/HarmonyLink/Private/HarmonyLink.cpp | 5 + .../Private/Objects/HarmonyLinkGraphics.cpp | 177 ++++++++++++++++++ .../Private/Structs/HLConfigValue.cpp | 3 + Source/HarmonyLink/Public/HarmonyLink.h | 2 + .../Public/Objects/HarmonyLinkGraphics.h | 70 +++++++ .../Public/Structs/HLConfigValue.h | 85 +++++++++ 6 files changed, 342 insertions(+) create mode 100644 Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp create mode 100644 Source/HarmonyLink/Private/Structs/HLConfigValue.cpp create mode 100644 Source/HarmonyLink/Public/Objects/HarmonyLinkGraphics.h create mode 100644 Source/HarmonyLink/Public/Structs/HLConfigValue.h diff --git a/Source/HarmonyLink/Private/HarmonyLink.cpp b/Source/HarmonyLink/Private/HarmonyLink.cpp index 88e7005..b508013 100644 --- a/Source/HarmonyLink/Private/HarmonyLink.cpp +++ b/Source/HarmonyLink/Private/HarmonyLink.cpp @@ -2,15 +2,20 @@ #include "HarmonyLink.h" #include "Modules/ModuleManager.h" +#include "Objects/HarmonyLinkGraphics.h" #define LOCTEXT_NAMESPACE "FHarmonyLinkModule" +DEFINE_LOG_CATEGORY(LogHarmonyLink); + void FHarmonyLinkModule::StartupModule() { + UHarmonyLinkGraphics::GetSettings(); } void FHarmonyLinkModule::ShutdownModule() { + UHarmonyLinkGraphics::DestroySettings(); } #undef LOCTEXT_NAMESPACE diff --git a/Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp b/Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp new file mode 100644 index 0000000..7268be3 --- /dev/null +++ b/Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp @@ -0,0 +1,177 @@ +// Copyright (C) 2024 Jordon Brooks + + +#include "Objects/HarmonyLinkGraphics.h" +#include "ComponentRecreateRenderStateContext.h" +#include "HarmonyLink.h" + +UHarmonyLinkGraphics* UHarmonyLinkGraphics::Instance = nullptr; +FString UHarmonyLinkGraphics::IniLocation = "HarmonyLink"; +FName UHarmonyLinkGraphics::BatteryProfile = "Battery"; +FName UHarmonyLinkGraphics::ChargingProfile = "Charging"; +FName UHarmonyLinkGraphics::DockedProfile = "Docked"; + +TMap UHarmonyLinkGraphics::DefaultSettingsMap = {{"Test", 0}}; + +UHarmonyLinkGraphics::UHarmonyLinkGraphics() +{ + UE_LOG(LogHarmonyLink, Warning, TEXT("HarmonyLinkGraphics initialized.")); + + + // Initialize settings for Low Graphics Profile + BatterySettings.Add(TEXT("LowResolutionX"), FHLConfigValue(1280)); + BatterySettings.Add(TEXT("LowResolutionY"), FHLConfigValue(720)); + BatterySettings.Add(TEXT("LowTextureQuality"), FHLConfigValue(0.5f)); + + // Initialize settings for Medium Graphics Profile + ChargingSettings.Add(TEXT("MediumResolutionX"), FHLConfigValue(1920)); + ChargingSettings.Add(TEXT("MediumResolutionY"), FHLConfigValue(1080)); + ChargingSettings.Add(TEXT("MediumTextureQuality"), FHLConfigValue(0.75f)); + + // Initialize settings for High Graphics Profile + DockedSettings.Add(TEXT("HighResolutionX"), FHLConfigValue(3840)); + DockedSettings.Add(TEXT("HighResolutionY"), FHLConfigValue(2160)); + DockedSettings.Add(TEXT("HighTextureQuality"), FHLConfigValue(1.0f)); +} + +void UHarmonyLinkGraphics::LoadProfile(const FName& ProfileName, const bool bForceReload) +{ + QUICK_SCOPE_CYCLE_COUNTER(HarmonyLinkGraphics_LoadSettings); + + // Construct the section name + FString SectionName = FString::Printf(TEXT("GraphicsProfile.%s"), *ProfileName.ToString()); + + // Clear the previous settings + SettingsMap.Empty(); + + // Load the settings into the map + if (!LoadSettingsFromConfig(SectionName)) + { + // Retry 2nd time + LoadSettingsFromConfig(SectionName); + } +} + +bool UHarmonyLinkGraphics::LoadSettingsFromConfig(const FString& SectionName) +{ + // Load the configuration for the specified profile + FConfigFile ConfigFile; + + // Normalize the INI file path + const FString IniFilePath = FPaths::Combine(FPaths::ProjectConfigDir(), IniLocation + TEXT(".ini")); + const FString NormalizedIniFilePath = FConfigCacheIni::NormalizeConfigIniPath(IniFilePath); + + if (FConfigCacheIni::LoadLocalIniFile(ConfigFile, *IniLocation, true, nullptr, false)) + { + if (const FConfigSection* Section = ConfigFile.Find(*SectionName)) + { + for (const auto& ValueIt : *Section) + { + int32 Value = FCString::Atoi(*ValueIt.Value.GetValue()); + SettingsMap.Add(*ValueIt.Key.ToString(), Value); + } + + return true; + } + } + + CreateDefaultConfigFile(); + return false; +} + +void UHarmonyLinkGraphics::SaveProfile(const FName& ProfileName) +{ + QUICK_SCOPE_CYCLE_COUNTER(HarmonyLinkGraphics_SaveSettings); + + // Normalize the INI file path + const FString IniFilePath = FPaths::Combine(FPaths::ProjectConfigDir(), IniLocation + TEXT(".ini")); + const FString NormalizedIniFilePath = FConfigCacheIni::NormalizeConfigIniPath(IniFilePath); + + FConfigFile ConfigFile; + ConfigFile.Write(NormalizedIniFilePath); +} + +void UHarmonyLinkGraphics::ApplySettings(const bool bCheckForCommandLineOverrides) +{ + { + FGlobalComponentRecreateRenderStateContext Context; + ApplyResolutionSettings(bCheckForCommandLineOverrides); + ApplyNonResolutionSettings(); + } + + SaveProfile(_ProfileName); +} + +void UHarmonyLinkGraphics::ApplyNonResolutionSettings() +{ +} + +void UHarmonyLinkGraphics::ApplyResolutionSettings(bool bCheckForCommandLineOverrides) +{ +} + +UHarmonyLinkGraphics* UHarmonyLinkGraphics::GetSettings() +{ + if (!Instance) + { + Instance = NewObject(); + Instance->AddToRoot(); + Instance->LoadProfile(ChargingProfile); + } + + return Instance; +} + +void UHarmonyLinkGraphics::DestroySettings() +{ + if (Instance) + { + Instance->RemoveFromRoot(); + Instance->MarkAsGarbage(); + Instance = nullptr; + } +} + +void UHarmonyLinkGraphics::CreateDefaultConfigFile() +{ + UE_LOG(LogHarmonyLink, Log, TEXT("CreateDefaultConfigFile started.")); + + SaveSection(BatteryProfile, BatterySettings); + SaveSection(ChargingProfile, ChargingSettings); + SaveSection(DockedProfile, DockedSettings); +} + +void UHarmonyLinkGraphics::SaveSection(const FName& SectionName, const TMap& Settings) const +{ + if (GConfig) + { + const FString Filename = GetDefaultConfigFilename(); + for (const auto& Setting : Settings) + { + switch (Setting.Value.GetType()) + { + case EConfigValueType::Int: + GConfig->SetInt(*SectionName.ToString(), *Setting.Key.ToString(), Setting.Value.GetValue(), Filename); + break; + case EConfigValueType::Float: + GConfig->SetFloat(*SectionName.ToString(), *Setting.Key.ToString(), Setting.Value.GetValue(), Filename); + break; + case EConfigValueType::Bool: + GConfig->SetBool(*SectionName.ToString(), *Setting.Key.ToString(), Setting.Value.GetValue(), Filename); + break; + case EConfigValueType::String: + GConfig->SetString(*SectionName.ToString(), *Setting.Key.ToString(), *Setting.Value.GetValue(), Filename); + break; + } + } + + UE_LOG(LogHarmonyLink, Log, TEXT("Saving config file: '%s'"), *Filename) + GConfig->Flush(false, Filename); + } +} + +void UHarmonyLinkGraphics::ResetInstance() +{ + Instance->DestroySettings(); + GetSettings(); +} diff --git a/Source/HarmonyLink/Private/Structs/HLConfigValue.cpp b/Source/HarmonyLink/Private/Structs/HLConfigValue.cpp new file mode 100644 index 0000000..16f5699 --- /dev/null +++ b/Source/HarmonyLink/Private/Structs/HLConfigValue.cpp @@ -0,0 +1,3 @@ +// Copyright (C) 2024 Jordon Brooks + +#include "Structs/HLConfigValue.h" diff --git a/Source/HarmonyLink/Public/HarmonyLink.h b/Source/HarmonyLink/Public/HarmonyLink.h index 9ee5be3..6cb8597 100644 --- a/Source/HarmonyLink/Public/HarmonyLink.h +++ b/Source/HarmonyLink/Public/HarmonyLink.h @@ -4,6 +4,8 @@ #include "Modules/ModuleManager.h" +DECLARE_LOG_CATEGORY_EXTERN(LogHarmonyLink, Log, All); + class FHarmonyLinkModule : public IModuleInterface { public: diff --git a/Source/HarmonyLink/Public/Objects/HarmonyLinkGraphics.h b/Source/HarmonyLink/Public/Objects/HarmonyLinkGraphics.h new file mode 100644 index 0000000..545bbfb --- /dev/null +++ b/Source/HarmonyLink/Public/Objects/HarmonyLinkGraphics.h @@ -0,0 +1,70 @@ +// Copyright (C) 2024 Jordon Brooks + +#pragma once + +#include "CoreMinimal.h" +#include "Structs/HLConfigValue.h" + +#include "UObject/Object.h" +#include "HarmonyLinkGraphics.generated.h" + +/** + * + */ +UCLASS(Blueprintable, config="HarmonyLink") +class HARMONYLINK_API UHarmonyLinkGraphics : public UObject +{ + GENERATED_BODY() + +public: + UHarmonyLinkGraphics(); + + UFUNCTION(BlueprintCallable, Category="HarmonyLink Settings") + void LoadProfile(const FName& ProfileName, const bool bForceReload = false); + + UFUNCTION(BlueprintCallable, Category="HarmonyLink Settings") + void SaveProfile(const FName& ProfileName); + + UFUNCTION(BlueprintCallable, Category="HarmonyLink Settings", meta=(bCheckForCommandLineOverrides=true)) + void ApplySettings(bool bCheckForCommandLineOverrides = true); + + UFUNCTION(BlueprintCallable, Category="HarmonyLink Settings") + void ApplyNonResolutionSettings(); + + UFUNCTION(BlueprintCallable, Category="HarmonyLink Settings") + void ApplyResolutionSettings(bool bCheckForCommandLineOverrides); + + /** Returns the game local machine settings (resolution, windowing mode, scalability settings, etc...) */ + UFUNCTION(BlueprintCallable, Category="HarmonyLink Settings") + static UHarmonyLinkGraphics* GetSettings(); + + static void DestroySettings(); + +private: + void CreateDefaultConfigFile(); + bool LoadSettingsFromConfig(const FString& SectionName); + + void SaveSection(const FName& SectionName, const TMap& Settings) const; + + static void ResetInstance(); + + UPROPERTY(Config) + FName _ProfileName = NAME_None; + + static FString IniLocation; + + static FName BatteryProfile; + static FName ChargingProfile; + static FName DockedProfile; + + TMap SettingsMap; + + // Maps to store configuration settings for each profile + TMap BatterySettings; + TMap ChargingSettings; + TMap DockedSettings; + + static TMap DefaultSettingsMap; + + static UHarmonyLinkGraphics* Instance; +}; diff --git a/Source/HarmonyLink/Public/Structs/HLConfigValue.h b/Source/HarmonyLink/Public/Structs/HLConfigValue.h new file mode 100644 index 0000000..1a0cd2f --- /dev/null +++ b/Source/HarmonyLink/Public/Structs/HLConfigValue.h @@ -0,0 +1,85 @@ +// Copyright (C) 2024 Jordon Brooks + +#pragma once + +#include "CoreMinimal.h" +#include "HLConfigValue.generated.h" + +UENUM(BlueprintType) +enum class EConfigValueType : uint8 +{ + Int, + Float, + Bool, + String +}; + +USTRUCT(BlueprintType) +struct FHLConfigValue +{ + GENERATED_BODY() + +private: + UPROPERTY(EditAnywhere, Category="ConfigValue") + EConfigValueType Type; + + UPROPERTY(EditAnywhere, Category="ConfigValue") + int32 IntValue; + + UPROPERTY(EditAnywhere, Category="ConfigValue") + float FloatValue; + + UPROPERTY(EditAnywhere, Category="ConfigValue") + bool BoolValue; + + UPROPERTY(EditAnywhere, Category="ConfigValue") + FString StringValue; + +public: + FHLConfigValue() : Type(EConfigValueType::String), IntValue(0), FloatValue(0.0f), BoolValue(false), StringValue(TEXT("")) {} + + FHLConfigValue(int32 Value) : Type(EConfigValueType::Int), IntValue(Value), FloatValue(0.0f), BoolValue(false), StringValue(TEXT("")) {} + + FHLConfigValue(float Value) : Type(EConfigValueType::Float), IntValue(0), FloatValue(Value), BoolValue(false), StringValue(TEXT("")) {} + + FHLConfigValue(bool Value) : Type(EConfigValueType::Bool), IntValue(0), FloatValue(0.0f), BoolValue(Value), StringValue(TEXT("")) {} + + FHLConfigValue(const FString& Value) : Type(EConfigValueType::String), IntValue(0), FloatValue(0.0f), BoolValue(false), StringValue(Value) {} + + EConfigValueType GetType() const + { + return Type; + } + + template + T GetValue() const; +}; + +// Specializations of the templated getter +template<> +inline int32 FHLConfigValue::GetValue() const +{ + ensure(Type == EConfigValueType::Int); + return IntValue; +} + +template<> +inline float FHLConfigValue::GetValue() const +{ + ensure(Type == EConfigValueType::Float); + return FloatValue; +} + +template<> +inline bool FHLConfigValue::GetValue() const +{ + ensure(Type == EConfigValueType::Bool); + return BoolValue; +} + +template<> +inline FString FHLConfigValue::GetValue() const +{ + ensure(Type == EConfigValueType::String); + return StringValue; +} From e9b04607ec5b55418ed58b708cd705944e65c72f Mon Sep 17 00:00:00 2001 From: Jordon Brooks Date: Wed, 15 May 2024 02:42:36 +0100 Subject: [PATCH 10/30] Update core files --- .../bin/Linux/libHarmonyLinkLib.so | Bin 454760 -> 131 bytes .../bin/Win64/HarmonyLinkLib.dll | Bin 95744 -> 131 bytes .../bin/Win64/HarmonyLinkLib.lib | Bin 10636 -> 130 bytes .../HarmonyLinkLib/include/Enums/EDevice.h | 1 + .../HarmonyLinkLib/include/Enums/EPlatform.h | 1 + .../HarmonyLinkLib/include/Enums/ESteamDeck.h | 29 ++++++++++++++++++ .../HarmonyLinkLib/include/HarmonyLinkLib.h | 4 +++ .../HarmonyLinkLib/include/Structs/FDevice.h | 6 ++-- 8 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 Source/ThirdParty/HarmonyLinkLib/include/Enums/ESteamDeck.h diff --git a/Source/ThirdParty/HarmonyLinkLib/bin/Linux/libHarmonyLinkLib.so b/Source/ThirdParty/HarmonyLinkLib/bin/Linux/libHarmonyLinkLib.so index 67e068029b2908b4a83274df61bf19138857b365..a48fb6f85cfe76dfd2006466623e26937cb3ca26 100644 GIT binary patch literal 131 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 z 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
  • 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 Iygxht2SH*T+5i9m diff --git a/Source/ThirdParty/HarmonyLinkLib/bin/Win64/HarmonyLinkLib.dll b/Source/ThirdParty/HarmonyLinkLib/bin/Win64/HarmonyLinkLib.dll index 9c2272bfd055181d062d19264923b68a97e09f6f..860a335ec6c39c47bf280a69e5d4862a6ffd8881 100644 GIT binary patch literal 131 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 LCF92$z&cWY*dZpv literal 10636 zcmcgyU2GFa5T5*yfca?%A>Y#afa=Qt z^=DM7TLd6fdr>810YcU~m9|U(DD)Upq*`o?P+hZ1o9B=p$#zerZFT^Ku3?JQ*q~DL z6#zm_w^VB0fn}tY8kL%cupX)5f=Z1GD2HVCYP5(c($;yEY<;K?$%;JI1xea}aOjYC zMC$bn@Ad8<8ad>Z`hAg5cFE_&+tZjcwdwZs9Bp%m%+2cjg5Y57 zc}7M-=t$R=+v6r6b=`DG`J@D)Ked(~w~#^!mk^VVB@@Y@fN?hMb~HM!`7}zf*ot5u z^F?L96jg1$_lRKkPxvBIEaH=6QL$Hy#sZ>vRIvLdC&PYUEF8f)r>ItQSy`@{*lfz! ze;%tc$_auion1+T$%e};AjHDbWOz0h5mTucCWh;9;_6TmeT=h^WY?Bx!py3u9V-Tu zvP*|OJ#NCOZ=Rg|V&KKRqMKQ^&)~>v%zb9|)e3{Xw0@Sk}41 zQR!4L5|zVKN;`(4&NJqV#e$L3xMF;W6dhRnOF8M5Wc6OIbcktL{;%-{@5is4e)2~qD z-ohrK8#6n9uKNs|rud*S#_hD#jA1TiWC>f%29!lEd01Io0aI;U&H(Kj^S(p{7^2_g zJ~0R-&SDmhvIdZOztZ?~^NbCRWaZy3k0XNKoI+cqJ1iRvGQY2up2` zyvPvO>5Md1)N2f(oQaBr#!0~#9+EO`kmL5Y#X%%=8E8a-}zr^3IIJ<_1UfjEB0Zn2>qCOgBG+@gtDIPa=;h! z*`4%N1!lfL`cbPW!c>H|>lz>4^r{cxD?xpfkJO4_yIzQCHTuouDNpWb6Kp6e#aDL} z20#~kE4a>;AC&!(a5Q{8W^4Ag*ar3w9?;$=Bx|rl@DKv@)Jd)ke^)5EWMzm5SJgB^ zcbzLJc>2^Ri6TI-76Kgs5kNsdL2H!0s`@mZ4#I;%5a;RCYe+o?8u5p;jtG=r^`{U< zF|(X^+`Lxg?CjF)jaX43JZ$~>!F9x_Vh1p@q5!@(J_ajlr}e}--lGLAC00b*T`ucj znQIbZru=}wy$0Lc=%Q8E;0I4aH@-&==|(Tj8tl{tN?F5X4H_R2M7jn$Xgyi$-_U}V z629dcWtI`f&^qIn7+x!Nwd;E)09nU@x%uk1zY>%_7js3^Cc6apyu0FG?8p~670>xU zD(>t?JO#KfvBcqO#GVf{j&^#q=xFN0um3QMXbKt8GqaR(a_-tp zKQw2<1PZUcb#){ox%v6NyW~J9WNcF4Wjx=qfz2hsN1`w-7sf+vfR-DKjpahaXN zZ@#wkH*yZIBe<9^1oDB#(MHW$-zi<*R~GS)FZkU6(U1r;`>%N>5P9vY+ho^#E9Cq3 zAR;WI2(!A&FagIsn~pXLPanSz|Fk@P5z(zTqRZi?Bp*0k)af_uUUwf}{dE`OEGIZw z?_o^9aL=g8%4~VE@jtRMHxMjYT=JN};+{*Fi7)rpr?p@9BCZN9T&cG)-m&U5!L;!1 z>?8bWh+pT5%|7>=3aO3f48C5N= + +// Enum class for representing different types of devices +namespace HarmonyLinkLib +{ + enum class ESteamDeck : uint8_t + { + NONE, // Device is not a steam deck + UNKNOWN, // Device is a steam deck but model cannot be determined + LCD, + OLED, + }; +} diff --git a/Source/ThirdParty/HarmonyLinkLib/include/HarmonyLinkLib.h b/Source/ThirdParty/HarmonyLinkLib/include/HarmonyLinkLib.h index aaa1887..d6575a5 100644 --- a/Source/ThirdParty/HarmonyLinkLib/include/HarmonyLinkLib.h +++ b/Source/ThirdParty/HarmonyLinkLib/include/HarmonyLinkLib.h @@ -46,6 +46,10 @@ namespace HarmonyLinkLib { extern "C" HARMONYLINKLIB_API bool get_is_wine(); + extern "C" HARMONYLINKLIB_API bool get_is_linux(); + + extern "C" HARMONYLINKLIB_API bool get_is_docked(); + extern "C" HARMONYLINKLIB_API FCPUInfo* get_cpu_info(); extern "C" HARMONYLINKLIB_API FDevice* get_device_info(); diff --git a/Source/ThirdParty/HarmonyLinkLib/include/Structs/FDevice.h b/Source/ThirdParty/HarmonyLinkLib/include/Structs/FDevice.h index 50a1a5c..b574d6a 100644 --- a/Source/ThirdParty/HarmonyLinkLib/include/Structs/FDevice.h +++ b/Source/ThirdParty/HarmonyLinkLib/include/Structs/FDevice.h @@ -18,13 +18,15 @@ #include "Enums/EDevice.h" #include "Enums/EPlatform.h" +#include "Enums/ESteamDeck.h" namespace HarmonyLinkLib { // Struct to represent a specific device with both platform and device type struct FDevice : HarmonyLinkStruct { - EPlatform platform; - EDevice device; + EPlatform platform = EPlatform::UNKNOWN; + EDevice device = EDevice::UNKNOWN; + ESteamDeck steam_deck_model = ESteamDeck::NONE; }; } From 727e51f6202738624923247567c64ea429de1320 Mon Sep 17 00:00:00 2001 From: Jordon Brooks Date: Wed, 15 May 2024 02:43:46 +0100 Subject: [PATCH 11/30] Added LFS --- .gitattributes | 32 +++++++++--------- .../bin/Linux/libHarmonyLinkLib.so | Bin 454760 -> 131 bytes .../bin/Win64/HarmonyLinkLib.dll | Bin 95744 -> 130 bytes .../bin/Win64/HarmonyLinkLib.lib | Bin 10636 -> 130 bytes 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/.gitattributes b/.gitattributes index 970e13f..884087a 100644 --- a/.gitattributes +++ b/.gitattributes @@ -13,27 +13,27 @@ *.hh text diff=cpp # Compiled Object files -*.slo binary -*.lo binary -*.o binary -*.obj binary +*.slo binary filter=lfs diff=lfs merge=lfs +*.lo binary filter=lfs diff=lfs merge=lfs +*.o binary filter=lfs diff=lfs merge=lfs +*.obj binary filter=lfs diff=lfs merge=lfs # Precompiled Headers -*.gch binary -*.pch binary +*.gch binary filter=lfs diff=lfs merge=lfs +*.pch binary filter=lfs diff=lfs merge=lfs # Compiled Dynamic libraries -*.so binary -*.dylib binary -*.dll binary +*.so binary filter=lfs diff=lfs merge=lfs +*.dylib binary filter=lfs diff=lfs merge=lfs +*.dll binary filter=lfs diff=lfs merge=lfs # Compiled Static libraries -*.lai binary -*.la binary -*.a binary -*.lib binary +*.lai binary filter=lfs diff=lfs merge=lfs +*.la binary filter=lfs diff=lfs merge=lfs +*.a binary filter=lfs diff=lfs merge=lfs +*.lib binary filter=lfs diff=lfs merge=lfs # Executables -*.exe binary -*.out binary -*.app binary \ No newline at end of file +*.exe binary filter=lfs diff=lfs merge=lfs +*.out binary filter=lfs diff=lfs merge=lfs +*.app binary filter=lfs diff=lfs merge=lfs diff --git a/Source/ThirdParty/HarmonyLinkLib/bin/Linux/libHarmonyLinkLib.so b/Source/ThirdParty/HarmonyLinkLib/bin/Linux/libHarmonyLinkLib.so index 67e068029b2908b4a83274df61bf19138857b365..77259016a3cee2f94803951aef73c0d7447eaf35 100644 GIT binary patch literal 131 zcmWN?K@x)?3;@78ukZtv7y?9pBO$5GwACrrLto$SWiNgAw!en$JdeJ3e{bjQVSW6+ zeaa~N)AvKgUz6Kg9s0InOiSg-kkd*K6Iuo{nkCD`QD@R1bq+)b961z0LoKVYX;CbI OsNj10>Ohfl0`~(53n$J1 literal 454760 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 z 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
  • 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 Iygxht2SH*T+5i9m diff --git a/Source/ThirdParty/HarmonyLinkLib/bin/Win64/HarmonyLinkLib.dll b/Source/ThirdParty/HarmonyLinkLib/bin/Win64/HarmonyLinkLib.dll index 9c2272bfd055181d062d19264923b68a97e09f6f..ad7416371a13cf6fe559365a3ecb12794dc4fc0d 100644 GIT binary patch literal 130 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 N%8T?bD+B0o`2pbRCv5-# literal 10636 zcmcgyU2GFa5T5*yfca?%A>Y#afa=Qt z^=DM7TLd6fdr>810YcU~m9|U(DD)Upq*`o?P+hZ1o9B=p$#zerZFT^Ku3?JQ*q~DL z6#zm_w^VB0fn}tY8kL%cupX)5f=Z1GD2HVCYP5(c($;yEY<;K?$%;JI1xea}aOjYC zMC$bn@Ad8<8ad>Z`hAg5cFE_&+tZjcwdwZs9Bp%m%+2cjg5Y57 zc}7M-=t$R=+v6r6b=`DG`J@D)Ked(~w~#^!mk^VVB@@Y@fN?hMb~HM!`7}zf*ot5u z^F?L96jg1$_lRKkPxvBIEaH=6QL$Hy#sZ>vRIvLdC&PYUEF8f)r>ItQSy`@{*lfz! ze;%tc$_auion1+T$%e};AjHDbWOz0h5mTucCWh;9;_6TmeT=h^WY?Bx!py3u9V-Tu zvP*|OJ#NCOZ=Rg|V&KKRqMKQ^&)~>v%zb9|)e3{Xw0@Sk}41 zQR!4L5|zVKN;`(4&NJqV#e$L3xMF;W6dhRnOF8M5Wc6OIbcktL{;%-{@5is4e)2~qD z-ohrK8#6n9uKNs|rud*S#_hD#jA1TiWC>f%29!lEd01Io0aI;U&H(Kj^S(p{7^2_g zJ~0R-&SDmhvIdZOztZ?~^NbCRWaZy3k0XNKoI+cqJ1iRvGQY2up2` zyvPvO>5Md1)N2f(oQaBr#!0~#9+EO`kmL5Y#X%%=8E8a-}zr^3IIJ<_1UfjEB0Zn2>qCOgBG+@gtDIPa=;h! z*`4%N1!lfL`cbPW!c>H|>lz>4^r{cxD?xpfkJO4_yIzQCHTuouDNpWb6Kp6e#aDL} z20#~kE4a>;AC&!(a5Q{8W^4Ag*ar3w9?;$=Bx|rl@DKv@)Jd)ke^)5EWMzm5SJgB^ zcbzLJc>2^Ri6TI-76Kgs5kNsdL2H!0s`@mZ4#I;%5a;RCYe+o?8u5p;jtG=r^`{U< zF|(X^+`Lxg?CjF)jaX43JZ$~>!F9x_Vh1p@q5!@(J_ajlr}e}--lGLAC00b*T`ucj znQIbZru=}wy$0Lc=%Q8E;0I4aH@-&==|(Tj8tl{tN?F5X4H_R2M7jn$Xgyi$-_U}V z629dcWtI`f&^qIn7+x!Nwd;E)09nU@x%uk1zY>%_7js3^Cc6apyu0FG?8p~670>xU zD(>t?JO#KfvBcqO#GVf{j&^#q=xFN0um3QMXbKt8GqaR(a_-tp zKQw2<1PZUcb#){ox%v6NyW~J9WNcF4Wjx=qfz2hsN1`w-7sf+vfR-DKjpahaXN zZ@#wkH*yZIBe<9^1oDB#(MHW$-zi<*R~GS)FZkU6(U1r;`>%N>5P9vY+ho^#E9Cq3 zAR;WI2(!A&FagIsn~pXLPanSz|Fk@P5z(zTqRZi?Bp*0k)af_uUUwf}{dE`OEGIZw z?_o^9aL=g8%4~VE@jtRMHxMjYT=JN};+{*Fi7)rpr?p@9BCZN9T&cG)-m&U5!L;!1 z>?8bWh+pT5%|7>=3aO3f48C5N= Date: Wed, 15 May 2024 16:20:05 +0100 Subject: [PATCH 12/30] Working loading, Saving and default config functions --- Source/HarmonyLink/HarmonyLink.Build.cs | 2 + .../Private/Objects/HarmonyLinkGraphics.cpp | 271 +++++++++++++----- Source/HarmonyLink/Public/Enums/Profile.h | 18 ++ .../Public/Objects/HarmonyLinkGraphics.h | 44 ++- .../Public/Structs/HLConfigValue.h | 52 ++++ .../Public/Structs/SettingsProfile.h | 45 +++ 6 files changed, 335 insertions(+), 97 deletions(-) create mode 100644 Source/HarmonyLink/Public/Enums/Profile.h create mode 100644 Source/HarmonyLink/Public/Structs/SettingsProfile.h diff --git a/Source/HarmonyLink/HarmonyLink.Build.cs b/Source/HarmonyLink/HarmonyLink.Build.cs index 75e3165..725ae7e 100644 --- a/Source/HarmonyLink/HarmonyLink.Build.cs +++ b/Source/HarmonyLink/HarmonyLink.Build.cs @@ -8,6 +8,8 @@ public class HarmonyLink : ModuleRules public HarmonyLink(ReadOnlyTargetRules Target) : base(Target) { PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs; + + IWYUSupport = IWYUSupport.Full; PublicIncludePaths.AddRange( new string[] { diff --git a/Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp b/Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp index 7268be3..42fb8d1 100644 --- a/Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp +++ b/Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp @@ -7,108 +7,152 @@ UHarmonyLinkGraphics* UHarmonyLinkGraphics::Instance = nullptr; FString UHarmonyLinkGraphics::IniLocation = "HarmonyLink"; -FName UHarmonyLinkGraphics::BatteryProfile = "Battery"; -FName UHarmonyLinkGraphics::ChargingProfile = "Charging"; -FName UHarmonyLinkGraphics::DockedProfile = "Docked"; -TMap UHarmonyLinkGraphics::DefaultSettingsMap = {{"Test", 0}}; +TMap> UHarmonyLinkGraphics::DefaultSettings = { + { "Battery", { + { TEXT("r.ReflectionMethod"), FHLConfigValue(0) }, + { TEXT("r.DynamicGlobalIlluminationMethod"), FHLConfigValue(2) }, + { TEXT("r.Shadow.Virtual.Enable"), FHLConfigValue(0) } + }}, + { "Charging", { + { TEXT("r.ReflectionMethod"), FHLConfigValue(2) }, + { TEXT("r.DynamicGlobalIlluminationMethod"), FHLConfigValue(2) }, + { TEXT("r.Shadow.Virtual.Enable"), FHLConfigValue(1) } + }}, + { "Docked", { + { TEXT("r.ReflectionMethod"), FHLConfigValue(2) }, + { TEXT("r.DynamicGlobalIlluminationMethod"), FHLConfigValue(2) }, + { TEXT("r.Shadow.Virtual.Enable"), FHLConfigValue(1) } + }} +}; UHarmonyLinkGraphics::UHarmonyLinkGraphics() { UE_LOG(LogHarmonyLink, Warning, TEXT("HarmonyLinkGraphics initialized.")); - - - // Initialize settings for Low Graphics Profile - BatterySettings.Add(TEXT("LowResolutionX"), FHLConfigValue(1280)); - BatterySettings.Add(TEXT("LowResolutionY"), FHLConfigValue(720)); - BatterySettings.Add(TEXT("LowTextureQuality"), FHLConfigValue(0.5f)); - - // Initialize settings for Medium Graphics Profile - ChargingSettings.Add(TEXT("MediumResolutionX"), FHLConfigValue(1920)); - ChargingSettings.Add(TEXT("MediumResolutionY"), FHLConfigValue(1080)); - ChargingSettings.Add(TEXT("MediumTextureQuality"), FHLConfigValue(0.75f)); - - // Initialize settings for High Graphics Profile - DockedSettings.Add(TEXT("HighResolutionX"), FHLConfigValue(3840)); - DockedSettings.Add(TEXT("HighResolutionY"), FHLConfigValue(2160)); - DockedSettings.Add(TEXT("HighTextureQuality"), FHLConfigValue(1.0f)); } -void UHarmonyLinkGraphics::LoadProfile(const FName& ProfileName, const bool bForceReload) +void UHarmonyLinkGraphics::LoadConfig(const bool bForceReload) { QUICK_SCOPE_CYCLE_COUNTER(HarmonyLinkGraphics_LoadSettings); - // Construct the section name - FString SectionName = FString::Printf(TEXT("GraphicsProfile.%s"), *ProfileName.ToString()); - - // Clear the previous settings - SettingsMap.Empty(); - // Load the settings into the map - if (!LoadSettingsFromConfig(SectionName)) + if (!LoadSettingsFromConfig()) { // Retry 2nd time - LoadSettingsFromConfig(SectionName); + LoadSettingsFromConfig(); } + + DebugPrintProfiles(); } -bool UHarmonyLinkGraphics::LoadSettingsFromConfig(const FString& SectionName) +bool UHarmonyLinkGraphics::LoadSettingsFromConfig() { - // Load the configuration for the specified profile + // Load the configuration from the INI file FConfigFile ConfigFile; - // Normalize the INI file path - const FString IniFilePath = FPaths::Combine(FPaths::ProjectConfigDir(), IniLocation + TEXT(".ini")); - const FString NormalizedIniFilePath = FConfigCacheIni::NormalizeConfigIniPath(IniFilePath); + const FString Filename = GetDefaultConfigFilename(); - if (FConfigCacheIni::LoadLocalIniFile(ConfigFile, *IniLocation, true, nullptr, false)) + if (FConfigCacheIni::LoadLocalIniFile(ConfigFile, *Filename, true, nullptr, false)) { - if (const FConfigSection* Section = ConfigFile.Find(*SectionName)) - { - for (const auto& ValueIt : *Section) - { - int32 Value = FCString::Atoi(*ValueIt.Value.GetValue()); - SettingsMap.Add(*ValueIt.Key.ToString(), Value); - } + // Load each profile section + bool bLoaded = true; + for (const TPair& Profile : ProfileNames) + { + if (!LoadSection(ConfigFile, Profile)) + { + UE_LOG(LogHarmonyLink, Error, TEXT("Failed to load section: '%s'"), *Profile.Value.ToString()); + bLoaded = false; + } + } + + // Check if all profiles were loaded successfully + if (bLoaded) + { + UE_LOG(LogHarmonyLink, Log, TEXT("Successfully loaded config file: %s"), *Filename); return true; } } + UE_LOG(LogHarmonyLink, Error, TEXT("Failed to load config file: %s"), *Filename); CreateDefaultConfigFile(); return false; } -void UHarmonyLinkGraphics::SaveProfile(const FName& ProfileName) +bool UHarmonyLinkGraphics::LoadSection(const FConfigFile& ConfigFile, const TPair Profile) { - QUICK_SCOPE_CYCLE_COUNTER(HarmonyLinkGraphics_SaveSettings); + const FName& SectionName = Profile.Value; + const EProfile ProfileKey = Profile.Key; - // Normalize the INI file path - const FString IniFilePath = FPaths::Combine(FPaths::ProjectConfigDir(), IniLocation + TEXT(".ini")); - const FString NormalizedIniFilePath = FConfigCacheIni::NormalizeConfigIniPath(IniFilePath); - - FConfigFile ConfigFile; - ConfigFile.Write(NormalizedIniFilePath); + if (const FConfigSection* Section = ConfigFile.FindSection(*SectionName.ToString())) + { + FSettingsProfile& SettingsProfile = Profiles.FindOrAdd(ProfileKey); + SettingsProfile.SectionName = SectionName; + SettingsProfile.Settings.Empty(); // Clear previous settings + + for (const auto& ValueIt : *Section) + { + FString ValueString = ValueIt.Value.GetValue(); + FString Value, Type; + + // Parse the Value and Type from the string + if (ValueString.Split(TEXT(", Type="), &Value, &Type)) + { + Value = Value.RightChop(7); // Remove "(Value=" prefix + Type = Type.LeftChop(1); // Remove ")" suffix + + if (Type == "int") + { + const int32 IntValue = FCString::Atoi(*Value); + SettingsProfile.Settings.Add(ValueIt.Key, FHLConfigValue(IntValue)); + } + else if (Type == "float") + { + const float FloatValue = FCString::Atof(*Value); + SettingsProfile.Settings.Add(ValueIt.Key, FHLConfigValue(FloatValue)); + } + else if (Type == "bool") + { + const bool BoolValue = Value == "true"; + SettingsProfile.Settings.Add(ValueIt.Key, FHLConfigValue(BoolValue)); + } + else if (Type == "string") + { + SettingsProfile.Settings.Add(ValueIt.Key, FHLConfigValue(Value)); + } + } + } + + return true; + } + + return false; +} + +void UHarmonyLinkGraphics::SaveConfig() const +{ + QUICK_SCOPE_CYCLE_COUNTER(HarmonyLinkGraphics_SaveConfig); + + for (TPair Profile : Profiles) + { + SaveSection(Profile.Value); + } + + const FString Filename = GetDefaultConfigFilename(); + UE_LOG(LogHarmonyLink, Log, TEXT("Flushing file: '%s'"), *Filename); + GConfig->Flush(false, Filename); } void UHarmonyLinkGraphics::ApplySettings(const bool bCheckForCommandLineOverrides) { { FGlobalComponentRecreateRenderStateContext Context; - ApplyResolutionSettings(bCheckForCommandLineOverrides); - ApplyNonResolutionSettings(); + //ApplyResolutionSettings(bCheckForCommandLineOverrides); + //ApplyNonResolutionSettings(); } - - SaveProfile(_ProfileName); } -void UHarmonyLinkGraphics::ApplyNonResolutionSettings() -{ -} -void UHarmonyLinkGraphics::ApplyResolutionSettings(bool bCheckForCommandLineOverrides) -{ -} UHarmonyLinkGraphics* UHarmonyLinkGraphics::GetSettings() { @@ -116,7 +160,7 @@ UHarmonyLinkGraphics* UHarmonyLinkGraphics::GetSettings() { Instance = NewObject(); Instance->AddToRoot(); - Instance->LoadProfile(ChargingProfile); + Instance->LoadConfig(); } return Instance; @@ -134,39 +178,120 @@ void UHarmonyLinkGraphics::DestroySettings() void UHarmonyLinkGraphics::CreateDefaultConfigFile() { - UE_LOG(LogHarmonyLink, Log, TEXT("CreateDefaultConfigFile started.")); + UE_LOG(LogHarmonyLink, Log, TEXT("Creating default config file.")); + + LoadDefaults(); + SaveConfig(); - SaveSection(BatteryProfile, BatterySettings); - SaveSection(ChargingProfile, ChargingSettings); - SaveSection(DockedProfile, DockedSettings); + UE_LOG(LogHarmonyLink, Log, TEXT("Default config file created.")); } -void UHarmonyLinkGraphics::SaveSection(const FName& SectionName, const TMap& Settings) const +void UHarmonyLinkGraphics::SaveSection(FSettingsProfile& SettingsProfile, const bool bFlush) const { if (GConfig) { const FString Filename = GetDefaultConfigFilename(); - for (const auto& Setting : Settings) + for (const auto& Setting : SettingsProfile.Settings) { + FString TypeString; + FString ValueString; + switch (Setting.Value.GetType()) { case EConfigValueType::Int: - GConfig->SetInt(*SectionName.ToString(), *Setting.Key.ToString(), Setting.Value.GetValue(), Filename); + ValueString = FString::FromInt(Setting.Value.GetValue()); + TypeString = TEXT("int"); break; case EConfigValueType::Float: - GConfig->SetFloat(*SectionName.ToString(), *Setting.Key.ToString(), Setting.Value.GetValue(), Filename); + ValueString = FString::SanitizeFloat(Setting.Value.GetValue()); + TypeString = TEXT("float"); break; case EConfigValueType::Bool: - GConfig->SetBool(*SectionName.ToString(), *Setting.Key.ToString(), Setting.Value.GetValue(), Filename); + ValueString = Setting.Value.GetValue() ? TEXT("true") : TEXT("false"); + TypeString = TEXT("bool"); break; case EConfigValueType::String: - GConfig->SetString(*SectionName.ToString(), *Setting.Key.ToString(), *Setting.Value.GetValue(), Filename); + ValueString = Setting.Value.GetValue(); + TypeString = TEXT("string"); break; } + + const FString ConfigValue = FString::Printf(TEXT("(Value=%s, Type=%s)"), *ValueString, *TypeString); + GConfig->SetString(*SettingsProfile.SectionName.ToString(), *Setting.Key.ToString(), *ConfigValue, Filename); } - UE_LOG(LogHarmonyLink, Log, TEXT("Saving config file: '%s'"), *Filename) - GConfig->Flush(false, Filename); + UE_LOG(LogHarmonyLink, Log, TEXT("Saving config file: '%s'"), *Filename); + if (bFlush) + { + UE_LOG(LogHarmonyLink, Log, TEXT("Flushing file: '%s'"), *Filename); + GConfig->Flush(false, Filename); + } + } +} + +void UHarmonyLinkGraphics::LoadDefaults() +{ + UE_LOG(LogHarmonyLink, Log, TEXT("LoadDefaults started.")); + + Profiles.Reset(); + + // Iterate over ProfileNames to create default settings + for (const TPair& Profile : ProfileNames) + { + FSettingsProfile NewProfileSettings; + NewProfileSettings.SectionName = Profile.Value; + + if (const TMap* Settings = DefaultSettings.Find(Profile.Value)) + { + NewProfileSettings.Settings = *Settings; + } + + Profiles.Add(Profile.Key, NewProfileSettings); + } +} + +void UHarmonyLinkGraphics::DebugPrintProfiles() const +{ + UE_LOG(LogHarmonyLink, Log, TEXT("DebugPrintProfiles started.")); + + for (TPair Profile : Profiles) + { + PrintDebugSection(Profile.Value); + } + + UE_LOG(LogHarmonyLink, Log, TEXT("DebugPrintProfiles completed.")); +} + +void UHarmonyLinkGraphics::PrintDebugSection(FSettingsProfile& SettingsProfile) +{ + UE_LOG(LogHarmonyLink, Warning, TEXT("[%s]"), *SettingsProfile.SectionName.ToString()); + + for (const auto& Setting : SettingsProfile.Settings) + { + FString ValueString; + FString TypeString; + + switch (Setting.Value.GetType()) + { + case EConfigValueType::Int: + ValueString = FString::FromInt(Setting.Value.GetValue()); + TypeString = TEXT("int"); + break; + case EConfigValueType::Float: + ValueString = FString::SanitizeFloat(Setting.Value.GetValue()); + TypeString = TEXT("float"); + break; + case EConfigValueType::Bool: + ValueString = Setting.Value.GetValue() ? TEXT("true") : TEXT("false"); + TypeString = TEXT("bool"); + break; + case EConfigValueType::String: + ValueString = Setting.Value.GetValue(); + TypeString = TEXT("string"); + break; + } + + UE_LOG(LogHarmonyLink, Warning, TEXT("Key: %s = V=%s, T=%s "), *Setting.Key.ToString(), *ValueString, *TypeString); } } diff --git a/Source/HarmonyLink/Public/Enums/Profile.h b/Source/HarmonyLink/Public/Enums/Profile.h new file mode 100644 index 0000000..6985b45 --- /dev/null +++ b/Source/HarmonyLink/Public/Enums/Profile.h @@ -0,0 +1,18 @@ +// Copyright (C) 2024 Jordon Brooks + +#pragma once + +#include "CoreMinimal.h" +#include "Profile.generated.h" + +/* + * Enum representing different operating system platforms. + */ +UENUM(BlueprintType) +enum class EProfile : uint8 +{ + NONE UMETA(DisplayName = "NONE"), + BATTERY UMETA(DisplayName = "BATTERY"), + CHARGING UMETA(DisplayName = "CHARGING"), + DOCKED UMETA(DisplayName = "DOCKED"), +}; diff --git a/Source/HarmonyLink/Public/Objects/HarmonyLinkGraphics.h b/Source/HarmonyLink/Public/Objects/HarmonyLinkGraphics.h index 545bbfb..ad76529 100644 --- a/Source/HarmonyLink/Public/Objects/HarmonyLinkGraphics.h +++ b/Source/HarmonyLink/Public/Objects/HarmonyLinkGraphics.h @@ -3,7 +3,8 @@ #pragma once #include "CoreMinimal.h" -#include "Structs/HLConfigValue.h" +#include "Enums/Profile.h" +#include "Structs/SettingsProfile.h" #include "UObject/Object.h" #include "HarmonyLinkGraphics.generated.h" @@ -20,20 +21,14 @@ public: UHarmonyLinkGraphics(); UFUNCTION(BlueprintCallable, Category="HarmonyLink Settings") - void LoadProfile(const FName& ProfileName, const bool bForceReload = false); + void LoadConfig(const bool bForceReload = false); UFUNCTION(BlueprintCallable, Category="HarmonyLink Settings") - void SaveProfile(const FName& ProfileName); + void SaveConfig() const; UFUNCTION(BlueprintCallable, Category="HarmonyLink Settings", meta=(bCheckForCommandLineOverrides=true)) void ApplySettings(bool bCheckForCommandLineOverrides = true); - UFUNCTION(BlueprintCallable, Category="HarmonyLink Settings") - void ApplyNonResolutionSettings(); - - UFUNCTION(BlueprintCallable, Category="HarmonyLink Settings") - void ApplyResolutionSettings(bool bCheckForCommandLineOverrides); - /** Returns the game local machine settings (resolution, windowing mode, scalability settings, etc...) */ UFUNCTION(BlueprintCallable, Category="HarmonyLink Settings") static UHarmonyLinkGraphics* GetSettings(); @@ -42,29 +37,30 @@ public: private: void CreateDefaultConfigFile(); - bool LoadSettingsFromConfig(const FString& SectionName); + bool LoadSettingsFromConfig(); - void SaveSection(const FName& SectionName, const TMap& Settings) const; + bool LoadSection(const FConfigFile& ConfigFile, const TPair Profile); + + void SaveSection(FSettingsProfile& SettingsProfile, const bool bFlush = false) const; + + void LoadDefaults(); + + void DebugPrintProfiles() const; + static void PrintDebugSection(FSettingsProfile& SettingsProfile); static void ResetInstance(); - UPROPERTY(Config) - FName _ProfileName = NAME_None; - static FString IniLocation; - - static FName BatteryProfile; - static FName ChargingProfile; - static FName DockedProfile; - TMap SettingsMap; + TMap ProfileNames = { + {EProfile::BATTERY, "Battery"}, + {EProfile::CHARGING, "Charging"}, + {EProfile::DOCKED, "Docked"}, + }; - // Maps to store configuration settings for each profile - TMap BatterySettings; - TMap ChargingSettings; - TMap DockedSettings; + TMap Profiles; - static TMap DefaultSettingsMap; + static TMap> DefaultSettings; static UHarmonyLinkGraphics* Instance; }; diff --git a/Source/HarmonyLink/Public/Structs/HLConfigValue.h b/Source/HarmonyLink/Public/Structs/HLConfigValue.h index 1a0cd2f..daf99d2 100644 --- a/Source/HarmonyLink/Public/Structs/HLConfigValue.h +++ b/Source/HarmonyLink/Public/Structs/HLConfigValue.h @@ -53,6 +53,34 @@ public: template T GetValue() const; + + // Equality operators + bool operator==(const FHLConfigValue& Other) const + { + if (Type != Other.Type) + { + return false; + } + + switch (Type) + { + case EConfigValueType::Int: + return IntValue == Other.IntValue; + case EConfigValueType::Float: + return FloatValue == Other.FloatValue; + case EConfigValueType::Bool: + return BoolValue == Other.BoolValue; + case EConfigValueType::String: + return StringValue == Other.StringValue; + default: + return false; + } + } + + bool operator!=(const FHLConfigValue& Other) const + { + return !(*this == Other); + } }; // Specializations of the templated getter @@ -83,3 +111,27 @@ inline FString FHLConfigValue::GetValue() const ensure(Type == EConfigValueType::String); return StringValue; } + +// Hash function +FORCEINLINE uint32 GetTypeHash(const FHLConfigValue& Value) +{ + uint32 Hash = GetTypeHash(Value.GetType()); + + switch (Value.GetType()) + { + case EConfigValueType::Int: + Hash = HashCombine(Hash, GetTypeHash(Value.GetValue())); + break; + case EConfigValueType::Float: + Hash = HashCombine(Hash, GetTypeHash(Value.GetValue())); + break; + case EConfigValueType::Bool: + Hash = HashCombine(Hash, GetTypeHash(Value.GetValue())); + break; + case EConfigValueType::String: + Hash = HashCombine(Hash, GetTypeHash(Value.GetValue())); + break; + } + + return Hash; +} diff --git a/Source/HarmonyLink/Public/Structs/SettingsProfile.h b/Source/HarmonyLink/Public/Structs/SettingsProfile.h new file mode 100644 index 0000000..d38d146 --- /dev/null +++ b/Source/HarmonyLink/Public/Structs/SettingsProfile.h @@ -0,0 +1,45 @@ +// Copyright (C) 2024 Jordon Brooks + +#pragma once + +#include "CoreMinimal.h" +#include "HLConfigValue.h" + +#include "SettingsProfile.generated.h" + +USTRUCT(BlueprintType) +struct FSettingsProfile +{ + GENERATED_BODY() + + UPROPERTY() + FName SectionName; + + UPROPERTY() + TMap Settings; + + // Equality operators + bool operator==(const FSettingsProfile& Other) const + { + return SectionName == Other.SectionName && Settings.OrderIndependentCompareEqual(Other.Settings); + } + + bool operator!=(const FSettingsProfile& Other) const + { + return !(*this == Other); + } +}; + +// Hash function +FORCEINLINE uint32 GetTypeHash(const FSettingsProfile& Profile) +{ + uint32 Hash = GetTypeHash(Profile.SectionName); + + for (const auto& Pair : Profile.Settings) + { + Hash = HashCombine(Hash, GetTypeHash(Pair.Key)); + Hash = HashCombine(Hash, GetTypeHash(Pair.Value)); + } + + return Hash; +} From 1a1b445302dfa069b7da2013a4d03b8ab2de8b1d Mon Sep 17 00:00:00 2001 From: Jordon Brooks Date: Wed, 15 May 2024 16:31:02 +0100 Subject: [PATCH 13/30] Added detection of battery and proceeds to load battery profile --- .../Private/Objects/HarmonyLinkGraphics.cpp | 25 ++++++++++++++++--- .../Public/Objects/HarmonyLinkGraphics.h | 11 ++++---- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp b/Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp index 42fb8d1..47b090d 100644 --- a/Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp +++ b/Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp @@ -4,6 +4,7 @@ #include "Objects/HarmonyLinkGraphics.h" #include "ComponentRecreateRenderStateContext.h" #include "HarmonyLink.h" +#include "HarmonyLinkLibrary.h" UHarmonyLinkGraphics* UHarmonyLinkGraphics::Instance = nullptr; FString UHarmonyLinkGraphics::IniLocation = "HarmonyLink"; @@ -156,11 +157,22 @@ void UHarmonyLinkGraphics::ApplySettings(const bool bCheckForCommandLineOverride UHarmonyLinkGraphics* UHarmonyLinkGraphics::GetSettings() { - if (!Instance) + // Check if we already initialised + if (Instance) { - Instance = NewObject(); - Instance->AddToRoot(); - Instance->LoadConfig(); + return Instance; + } + + // Proceed to create a new singleton instance + Instance = NewObject(); + Instance->AddToRoot(); + Instance->LoadConfig(); + + const FBattery BatteryStatus = UHarmonyLinkLibrary::GetBatteryStatus(); + + if (BatteryStatus.HasBattery) + { + Instance->ApplyProfile(EProfile::BATTERY); } return Instance; @@ -250,6 +262,11 @@ void UHarmonyLinkGraphics::LoadDefaults() } } +void UHarmonyLinkGraphics::ApplyProfile(EProfile Profile) +{ + +} + void UHarmonyLinkGraphics::DebugPrintProfiles() const { UE_LOG(LogHarmonyLink, Log, TEXT("DebugPrintProfiles started.")); diff --git a/Source/HarmonyLink/Public/Objects/HarmonyLinkGraphics.h b/Source/HarmonyLink/Public/Objects/HarmonyLinkGraphics.h index ad76529..eb4845f 100644 --- a/Source/HarmonyLink/Public/Objects/HarmonyLinkGraphics.h +++ b/Source/HarmonyLink/Public/Objects/HarmonyLinkGraphics.h @@ -38,18 +38,17 @@ public: private: void CreateDefaultConfigFile(); bool LoadSettingsFromConfig(); - bool LoadSection(const FConfigFile& ConfigFile, const TPair Profile); - void SaveSection(FSettingsProfile& SettingsProfile, const bool bFlush = false) const; - void LoadDefaults(); - - void DebugPrintProfiles() const; - static void PrintDebugSection(FSettingsProfile& SettingsProfile); + void ApplyProfile(EProfile Profile); static void ResetInstance(); + // Debugging + void DebugPrintProfiles() const; + static void PrintDebugSection(FSettingsProfile& SettingsProfile); + static FString IniLocation; TMap ProfileNames = { From 9955136737ffad7eb66e194bd08389f6db49a5aa Mon Sep 17 00:00:00 2001 From: Jordon Brooks Date: Wed, 15 May 2024 16:33:04 +0100 Subject: [PATCH 14/30] =?UTF-8?q?Oops=20forgot=20to=20make=20all=20the=20f?= =?UTF-8?q?unctions=20publicly=20accessible=20in=20C++=F0=9F=A4=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Source/HarmonyLink/Public/HarmonyLinkLibrary.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Source/HarmonyLink/Public/HarmonyLinkLibrary.h b/Source/HarmonyLink/Public/HarmonyLinkLibrary.h index 373e583..4a809e2 100644 --- a/Source/HarmonyLink/Public/HarmonyLinkLibrary.h +++ b/Source/HarmonyLink/Public/HarmonyLinkLibrary.h @@ -20,6 +20,7 @@ class HARMONYLINK_API UHarmonyLinkLibrary : public UBlueprintFunctionLibrary { GENERATED_BODY() +public: // Checks if the game is running under Wine. UFUNCTION(BlueprintCallable, Category="HarmonyLink") static bool IsWine(); From d4ac87e36d863887d8a4d7a0dc0cdfdf34c36c47 Mon Sep 17 00:00:00 2001 From: Jordon Brooks Date: Wed, 15 May 2024 17:44:04 +0100 Subject: [PATCH 15/30] I believe we now have a semi-working graphics profiles and the ability to switch between them! --- .../Private/Objects/HarmonyLinkGraphics.cpp | 94 ++++++++++++++++--- .../Public/Objects/HarmonyLinkGraphics.h | 7 +- .../Public/Structs/HLConfigValue.h | 19 +++- 3 files changed, 100 insertions(+), 20 deletions(-) diff --git a/Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp b/Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp index 47b090d..bd6b1b5 100644 --- a/Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp +++ b/Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp @@ -13,17 +13,20 @@ TMap> UHarmonyLinkGraphics::DefaultSettings = { "Battery", { { TEXT("r.ReflectionMethod"), FHLConfigValue(0) }, { TEXT("r.DynamicGlobalIlluminationMethod"), FHLConfigValue(2) }, - { TEXT("r.Shadow.Virtual.Enable"), FHLConfigValue(0) } + { TEXT("r.Shadow.Virtual.Enable"), FHLConfigValue(0) }, + { TEXT("r.ScreenPercentage"), FHLConfigValue(50) }, }}, { "Charging", { { TEXT("r.ReflectionMethod"), FHLConfigValue(2) }, { TEXT("r.DynamicGlobalIlluminationMethod"), FHLConfigValue(2) }, - { TEXT("r.Shadow.Virtual.Enable"), FHLConfigValue(1) } + { TEXT("r.Shadow.Virtual.Enable"), FHLConfigValue(1) }, + { TEXT("r.ScreenPercentage"), FHLConfigValue(100) }, }}, - { "Docked", { + { "Docked", { { TEXT("r.ReflectionMethod"), FHLConfigValue(2) }, { TEXT("r.DynamicGlobalIlluminationMethod"), FHLConfigValue(2) }, - { TEXT("r.Shadow.Virtual.Enable"), FHLConfigValue(1) } + { TEXT("r.Shadow.Virtual.Enable"), FHLConfigValue(1) }, + { TEXT("r.ScreenPercentage"), FHLConfigValue(100) }, }} }; @@ -144,15 +147,6 @@ void UHarmonyLinkGraphics::SaveConfig() const GConfig->Flush(false, Filename); } -void UHarmonyLinkGraphics::ApplySettings(const bool bCheckForCommandLineOverrides) -{ - { - FGlobalComponentRecreateRenderStateContext Context; - //ApplyResolutionSettings(bCheckForCommandLineOverrides); - //ApplyNonResolutionSettings(); - } -} - UHarmonyLinkGraphics* UHarmonyLinkGraphics::GetSettings() @@ -170,7 +164,10 @@ UHarmonyLinkGraphics* UHarmonyLinkGraphics::GetSettings() const FBattery BatteryStatus = UHarmonyLinkLibrary::GetBatteryStatus(); - if (BatteryStatus.HasBattery) + // Enabled for development testing + // At some point I need to implement the ability to fake and emulate these settings to make it easier to test + // BUG: Remove this before release! + if (!BatteryStatus.HasBattery) { Instance->ApplyProfile(EProfile::BATTERY); } @@ -262,9 +259,76 @@ void UHarmonyLinkGraphics::LoadDefaults() } } -void UHarmonyLinkGraphics::ApplyProfile(EProfile Profile) +bool UHarmonyLinkGraphics::ApplyProfile(const EProfile Profile) { + // Find the profile name associated with the given EProfile + const FName* ProfileName = ProfileNames.Find(Profile); + if (!ProfileName) + { + UE_LOG(LogHarmonyLink, Warning, TEXT("Profile not found.")); + return false; + } + + UE_LOG(LogHarmonyLink, Log, TEXT("Applying profile %s."), *ProfileName->ToString()); + + // Find the settings associated with the profile + FSettingsProfile* SettingsProfile = Profiles.Find(Profile); + + if (!SettingsProfile) + { + UE_LOG(LogHarmonyLink, Warning, TEXT("No settings found for profile %s."), *ProfileName->ToString()); + return false; + } + + { + FGlobalComponentRecreateRenderStateContext Context; + + // Example of applying settings (actual application depends on your implementation) + for (const TPair& Setting : SettingsProfile->Settings) + { + // Example of logging each setting being applied + UE_LOG(LogHarmonyLink, Log, TEXT("Applying setting: %s = %s"), + *Setting.Key.ToString(), *Setting.Value.ToString()); + + ApplySetting(Setting); + } + } + + return true; +} + +void UHarmonyLinkGraphics::ApplySetting(const TPair& Setting) +{ + // Apply the setting based on the key (CVar) + IConsoleManager& ConsoleManager = IConsoleManager::Get(); + IConsoleVariable* CVar = ConsoleManager.FindConsoleVariable(*Setting.Key.ToString()); + + if (CVar) + { + switch (Setting.Value.GetType()) + { + case EConfigValueType::Bool: + CVar->Set(Setting.Value.GetValue(), ECVF_SetByGameSetting); + break; + + case EConfigValueType::Float: + CVar->Set(Setting.Value.GetValue(), ECVF_SetByGameSetting); + break; + + case EConfigValueType::Int: + CVar->Set(Setting.Value.GetValue(), ECVF_SetByGameSetting); + break; + + default: + UE_LOG(LogHarmonyLink, Warning, TEXT("Unsupported value type for setting: %s"), *Setting.Key.ToString()); + break; + } + } + else + { + UE_LOG(LogHarmonyLink, Warning, TEXT("Console variable not found: %s"), *Setting.Key.ToString()); + } } void UHarmonyLinkGraphics::DebugPrintProfiles() const diff --git a/Source/HarmonyLink/Public/Objects/HarmonyLinkGraphics.h b/Source/HarmonyLink/Public/Objects/HarmonyLinkGraphics.h index eb4845f..64f5913 100644 --- a/Source/HarmonyLink/Public/Objects/HarmonyLinkGraphics.h +++ b/Source/HarmonyLink/Public/Objects/HarmonyLinkGraphics.h @@ -26,9 +26,6 @@ public: UFUNCTION(BlueprintCallable, Category="HarmonyLink Settings") void SaveConfig() const; - UFUNCTION(BlueprintCallable, Category="HarmonyLink Settings", meta=(bCheckForCommandLineOverrides=true)) - void ApplySettings(bool bCheckForCommandLineOverrides = true); - /** Returns the game local machine settings (resolution, windowing mode, scalability settings, etc...) */ UFUNCTION(BlueprintCallable, Category="HarmonyLink Settings") static UHarmonyLinkGraphics* GetSettings(); @@ -41,10 +38,12 @@ private: bool LoadSection(const FConfigFile& ConfigFile, const TPair Profile); void SaveSection(FSettingsProfile& SettingsProfile, const bool bFlush = false) const; void LoadDefaults(); - void ApplyProfile(EProfile Profile); + bool ApplyProfile(EProfile Profile); static void ResetInstance(); + static void ApplySetting(const TPair& Setting); + // Debugging void DebugPrintProfiles() const; static void PrintDebugSection(FSettingsProfile& SettingsProfile); diff --git a/Source/HarmonyLink/Public/Structs/HLConfigValue.h b/Source/HarmonyLink/Public/Structs/HLConfigValue.h index daf99d2..98711ec 100644 --- a/Source/HarmonyLink/Public/Structs/HLConfigValue.h +++ b/Source/HarmonyLink/Public/Structs/HLConfigValue.h @@ -45,7 +45,24 @@ public: FHLConfigValue(bool Value) : Type(EConfigValueType::Bool), IntValue(0), FloatValue(0.0f), BoolValue(Value), StringValue(TEXT("")) {} FHLConfigValue(const FString& Value) : Type(EConfigValueType::String), IntValue(0), FloatValue(0.0f), BoolValue(false), StringValue(Value) {} - + + FString ToString() const + { + switch (Type) + { + case EConfigValueType::Int: + return FString::Printf(TEXT("Int: %d"), IntValue); + case EConfigValueType::Float: + return FString::Printf(TEXT("Float: %f"), FloatValue); + case EConfigValueType::Bool: + return BoolValue ? TEXT("Bool: true") : TEXT("Bool: false"); + case EConfigValueType::String: + return FString::Printf(TEXT("String: %s"), *StringValue); + default: + return TEXT("Unknown Type"); + } + } + EConfigValueType GetType() const { return Type; From 16061e077b43992b46cb61dd422249f6482c15d5 Mon Sep 17 00:00:00 2001 From: Jordon Brooks Date: Wed, 15 May 2024 21:28:34 +0100 Subject: [PATCH 16/30] Added delegates and automatic switching --- Source/HarmonyLink/Private/HarmonyLink.cpp | 3 +- .../Private/Objects/HarmonyLinkGraphics.cpp | 241 +++++++++++++++--- .../Public/Objects/HarmonyLinkGraphics.h | 45 +++- .../Public/Structs/HLConfigValue.h | 14 +- .../Public/Structs/SettingsProfile.h | 4 +- 5 files changed, 263 insertions(+), 44 deletions(-) diff --git a/Source/HarmonyLink/Private/HarmonyLink.cpp b/Source/HarmonyLink/Private/HarmonyLink.cpp index b508013..167806e 100644 --- a/Source/HarmonyLink/Private/HarmonyLink.cpp +++ b/Source/HarmonyLink/Private/HarmonyLink.cpp @@ -10,11 +10,12 @@ DEFINE_LOG_CATEGORY(LogHarmonyLink); void FHarmonyLinkModule::StartupModule() { - UHarmonyLinkGraphics::GetSettings(); + } void FHarmonyLinkModule::ShutdownModule() { + // Ensure we safely destroy our singleton instance UHarmonyLinkGraphics::DestroySettings(); } diff --git a/Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp b/Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp index bd6b1b5..62c6c14 100644 --- a/Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp +++ b/Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp @@ -5,11 +5,13 @@ #include "ComponentRecreateRenderStateContext.h" #include "HarmonyLink.h" #include "HarmonyLinkLibrary.h" +#include "GameFramework/GameUserSettings.h" -UHarmonyLinkGraphics* UHarmonyLinkGraphics::Instance = nullptr; -FString UHarmonyLinkGraphics::IniLocation = "HarmonyLink"; +UHarmonyLinkGraphics* UHarmonyLinkGraphics::_INSTANCE = nullptr; +FString UHarmonyLinkGraphics::_IniLocation = "HarmonyLink"; +int32 UHarmonyLinkGraphics::_TickRate = 1; -TMap> UHarmonyLinkGraphics::DefaultSettings = { +TMap> UHarmonyLinkGraphics::_DefaultSettings = { { "Battery", { { TEXT("r.ReflectionMethod"), FHLConfigValue(0) }, { TEXT("r.DynamicGlobalIlluminationMethod"), FHLConfigValue(2) }, @@ -33,6 +35,14 @@ TMap> UHarmonyLinkGraphics::DefaultSettings = UHarmonyLinkGraphics::UHarmonyLinkGraphics() { UE_LOG(LogHarmonyLink, Warning, TEXT("HarmonyLinkGraphics initialized.")); + + _bAutomaticSwitch = true; + FWorldDelegates::OnPostWorldInitialization.AddUObject(this, &UHarmonyLinkGraphics::OnPostWorldInitialization); +} + +UHarmonyLinkGraphics::~UHarmonyLinkGraphics() +{ + FWorldDelegates::OnPostWorldInitialization.RemoveAll(this); } void UHarmonyLinkGraphics::LoadConfig(const bool bForceReload) @@ -56,12 +66,18 @@ bool UHarmonyLinkGraphics::LoadSettingsFromConfig() const FString Filename = GetDefaultConfigFilename(); - if (FConfigCacheIni::LoadLocalIniFile(ConfigFile, *Filename, true, nullptr, false)) + if (!GConfig) + { + UE_LOG(LogHarmonyLink, Error, TEXT("Failed to access GConfig!")) + return false; + } + + if (GConfig->LoadLocalIniFile(ConfigFile, *Filename, false, nullptr, false)) { // Load each profile section bool bLoaded = true; - for (const TPair& Profile : ProfileNames) + for (const TPair& Profile : _ProfileNames) { if (!LoadSection(ConfigFile, Profile)) { @@ -90,7 +106,7 @@ bool UHarmonyLinkGraphics::LoadSection(const FConfigFile& ConfigFile, const TPai if (const FConfigSection* Section = ConfigFile.FindSection(*SectionName.ToString())) { - FSettingsProfile& SettingsProfile = Profiles.FindOrAdd(ProfileKey); + FSettingsProfile& SettingsProfile = _Profiles.FindOrAdd(ProfileKey); SettingsProfile.SectionName = SectionName; SettingsProfile.Settings.Empty(); // Clear previous settings @@ -137,7 +153,7 @@ void UHarmonyLinkGraphics::SaveConfig() const { QUICK_SCOPE_CYCLE_COUNTER(HarmonyLinkGraphics_SaveConfig); - for (TPair Profile : Profiles) + for (TPair Profile : _Profiles) { SaveSection(Profile.Value); } @@ -147,20 +163,119 @@ void UHarmonyLinkGraphics::SaveConfig() const GConfig->Flush(false, Filename); } +void UHarmonyLinkGraphics::SetSetting(const EProfile Profile, const FName Setting, const FHLConfigValue Value) +{ + // Find the profile name associated with the given EProfile + const FName* ProfileName = _ProfileNames.Find(Profile); + + if (!ProfileName) + { + UE_LOG(LogHarmonyLink, Error, TEXT("Profile not found.")); + return; + } + + FString TypeString; + FString ValueString; + + switch (Value.GetType()) + { + case EConfigValueType::Int: + ValueString = FString::FromInt(Value.GetValue()); + TypeString = TEXT("int"); + break; + case EConfigValueType::Float: + ValueString = FString::SanitizeFloat(Value.GetValue()); + TypeString = TEXT("float"); + break; + case EConfigValueType::Bool: + ValueString = Value.GetValue() ? TEXT("true") : TEXT("false"); + TypeString = TEXT("bool"); + break; + case EConfigValueType::String: + ValueString = Value.GetValue(); + TypeString = TEXT("string"); + break; + } + + UE_LOG(LogHarmonyLink, Log, TEXT("Applying '%s': Value='%s', Type='%s' to profile '%s'."), *Setting.ToString(), *TypeString, *ValueString, *ProfileName->ToString()); + + // Find the settings associated with the profile + FSettingsProfile* SettingsProfile = _Profiles.Find(Profile); + + if (!SettingsProfile) + { + UE_LOG(LogHarmonyLink, Error, TEXT("No settings found for profile %s."), *ProfileName->ToString()); + return; + } + + SettingsProfile->Settings.FindOrAdd(Setting) = Value; +} UHarmonyLinkGraphics* UHarmonyLinkGraphics::GetSettings() { // Check if we already initialised - if (Instance) + if (_INSTANCE) { - return Instance; + return _INSTANCE; } // Proceed to create a new singleton instance - Instance = NewObject(); - Instance->AddToRoot(); - Instance->LoadConfig(); + _INSTANCE = NewObject(); + _INSTANCE->AddToRoot(); + _INSTANCE->Init(); + + return _INSTANCE; +} + +FSettingsProfile UHarmonyLinkGraphics::GetSettingProfile(const EProfile Profile) +{ + // Find the profile name associated with the given EProfile + const FName* ProfileName = _ProfileNames.Find(Profile); + + if (!ProfileName) + { + UE_LOG(LogHarmonyLink, Error, TEXT("Profile not found.")); + return FSettingsProfile(); + } + + // Find the settings associated with the profile + FSettingsProfile* SettingsProfile = _Profiles.Find(Profile); + + if (!SettingsProfile) + { + UE_LOG(LogHarmonyLink, Error, TEXT("No settings found for profile %s."), *ProfileName->ToString()); + return FSettingsProfile(); + } + + return *SettingsProfile; + +} + +EProfile UHarmonyLinkGraphics::GetActiveProfile() const +{ + return _ActiveProfile; +} + +void UHarmonyLinkGraphics::SetAutomaticSwitching(const bool bAutomaticSwitch) +{ + _bAutomaticSwitch = bAutomaticSwitch; +} + +void UHarmonyLinkGraphics::DestroySettings() +{ + if (_INSTANCE) + { + FWorldDelegates::OnPostWorldInitialization.RemoveAll(_INSTANCE); + _INSTANCE->RemoveFromRoot(); + _INSTANCE->MarkAsGarbage(); + _INSTANCE = nullptr; + } +} + +void UHarmonyLinkGraphics::Init() +{ + LoadConfig(); const FBattery BatteryStatus = UHarmonyLinkLibrary::GetBatteryStatus(); @@ -169,19 +284,35 @@ UHarmonyLinkGraphics* UHarmonyLinkGraphics::GetSettings() // BUG: Remove this before release! if (!BatteryStatus.HasBattery) { - Instance->ApplyProfile(EProfile::BATTERY); + ApplyProfile(EProfile::BATTERY); } - - return Instance; } -void UHarmonyLinkGraphics::DestroySettings() +void UHarmonyLinkGraphics::Tick() { - if (Instance) + if (!_bAutomaticSwitch) { - Instance->RemoveFromRoot(); - Instance->MarkAsGarbage(); - Instance = nullptr; + return; + } + + const FBattery BatteryStatus = UHarmonyLinkLibrary::GetBatteryStatus(); + + if (BatteryStatus.HasBattery) + { + if (BatteryStatus.IsACConnected) + { + if (_ActiveProfile != EProfile::CHARGING) + { + ApplyProfile(EProfile::CHARGING); + } + } + else + { + if (_ActiveProfile != EProfile::BATTERY) + { + ApplyProfile(EProfile::BATTERY); + } + } } } @@ -242,38 +373,86 @@ void UHarmonyLinkGraphics::LoadDefaults() { UE_LOG(LogHarmonyLink, Log, TEXT("LoadDefaults started.")); - Profiles.Reset(); + _Profiles.Reset(); // Iterate over ProfileNames to create default settings - for (const TPair& Profile : ProfileNames) + for (const TPair& Profile : _ProfileNames) { FSettingsProfile NewProfileSettings; NewProfileSettings.SectionName = Profile.Value; - if (const TMap* Settings = DefaultSettings.Find(Profile.Value)) + if (const TMap* Settings = _DefaultSettings.Find(Profile.Value)) { NewProfileSettings.Settings = *Settings; } - Profiles.Add(Profile.Key, NewProfileSettings); + _Profiles.Add(Profile.Key, NewProfileSettings); + } +} + +void UHarmonyLinkGraphics::OnPostWorldInitialization(UWorld* World, UWorld::InitializationValues IVS) +{ + if (!World) + { + UE_LOG(LogHarmonyLink, Error, TEXT("Failed to Hook into World Initialisation!")) + return; + } + + if (World->IsGameWorld()) + { + if (UHarmonyLinkGraphics* Settings = GetSettings()) + { + if (World->IsPlayInEditor()) + { + Settings->LoadConfig(true); + } + + if (!World->GetTimerManager().TimerExists(Settings->_TickTimerHandle) || !World->GetTimerManager().IsTimerActive(Settings->_TickTimerHandle)) + { + World->GetTimerManager().SetTimer(Settings->_TickTimerHandle, [Settings] + { + Settings->Tick(); + }, _TickRate, true); + } + } } } bool UHarmonyLinkGraphics::ApplyProfile(const EProfile Profile) { + // If the profile is None, revert to the original user game settings + if (Profile == EProfile::NONE) + { + UE_LOG(LogHarmonyLink, Log, TEXT("Reverting to original user game settings.")); + + if (UGameUserSettings* UserSettings = GEngine->GetGameUserSettings()) + { + UserSettings->LoadSettings(true); + UserSettings->ApplySettings(true); + _ActiveProfile = EProfile::NONE; + OnProfileChanged.Broadcast(_ActiveProfile); + UE_LOG(LogHarmonyLink, Log, TEXT("Original user game settings applied.")); + return true; + } + + UE_LOG(LogHarmonyLink, Warning, TEXT("Failed to get user game settings.")); + return false; + } + + // Find the profile name associated with the given EProfile - const FName* ProfileName = ProfileNames.Find(Profile); + const FName* ProfileName = _ProfileNames.Find(Profile); if (!ProfileName) { - UE_LOG(LogHarmonyLink, Warning, TEXT("Profile not found.")); + UE_LOG(LogHarmonyLink, Error, TEXT("Profile not found.")); return false; } UE_LOG(LogHarmonyLink, Log, TEXT("Applying profile %s."), *ProfileName->ToString()); // Find the settings associated with the profile - FSettingsProfile* SettingsProfile = Profiles.Find(Profile); + FSettingsProfile* SettingsProfile = _Profiles.Find(Profile); if (!SettingsProfile) { @@ -288,13 +467,15 @@ bool UHarmonyLinkGraphics::ApplyProfile(const EProfile Profile) for (const TPair& Setting : SettingsProfile->Settings) { // Example of logging each setting being applied - UE_LOG(LogHarmonyLink, Log, TEXT("Applying setting: %s = %s"), + UE_LOG(LogHarmonyLink, Log, TEXT("Patching CVar override: %s = %s"), *Setting.Key.ToString(), *Setting.Value.ToString()); ApplySetting(Setting); } } + _ActiveProfile = Profile; + OnProfileChanged.Broadcast(_ActiveProfile); return true; } @@ -335,7 +516,7 @@ void UHarmonyLinkGraphics::DebugPrintProfiles() const { UE_LOG(LogHarmonyLink, Log, TEXT("DebugPrintProfiles started.")); - for (TPair Profile : Profiles) + for (TPair Profile : _Profiles) { PrintDebugSection(Profile.Value); } @@ -378,6 +559,6 @@ void UHarmonyLinkGraphics::PrintDebugSection(FSettingsProfile& SettingsProfile) void UHarmonyLinkGraphics::ResetInstance() { - Instance->DestroySettings(); + _INSTANCE->DestroySettings(); GetSettings(); } diff --git a/Source/HarmonyLink/Public/Objects/HarmonyLinkGraphics.h b/Source/HarmonyLink/Public/Objects/HarmonyLinkGraphics.h index 64f5913..69e167a 100644 --- a/Source/HarmonyLink/Public/Objects/HarmonyLinkGraphics.h +++ b/Source/HarmonyLink/Public/Objects/HarmonyLinkGraphics.h @@ -9,6 +9,8 @@ #include "UObject/Object.h" #include "HarmonyLinkGraphics.generated.h" +DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnProfileChanged, EProfile, Profile); + /** * */ @@ -19,6 +21,10 @@ class HARMONYLINK_API UHarmonyLinkGraphics : public UObject public: UHarmonyLinkGraphics(); + virtual ~UHarmonyLinkGraphics() override; + + UPROPERTY(BlueprintAssignable) + FOnProfileChanged OnProfileChanged; UFUNCTION(BlueprintCallable, Category="HarmonyLink Settings") void LoadConfig(const bool bForceReload = false); @@ -26,19 +32,37 @@ public: UFUNCTION(BlueprintCallable, Category="HarmonyLink Settings") void SaveConfig() const; + UFUNCTION(BlueprintCallable, Category="HarmonyLink Settings") + void SetSetting(EProfile Profile, FName Setting, FHLConfigValue Value); + + UFUNCTION(BlueprintCallable, Category="HarmonyLink Settings") + bool ApplyProfile(EProfile Profile); + /** Returns the game local machine settings (resolution, windowing mode, scalability settings, etc...) */ UFUNCTION(BlueprintCallable, Category="HarmonyLink Settings") static UHarmonyLinkGraphics* GetSettings(); + UFUNCTION(BlueprintCallable, BlueprintPure, Category="HarmonyLink Settings") + FSettingsProfile GetSettingProfile(const EProfile Profile); + + UFUNCTION(BlueprintCallable, BlueprintPure, Category="HarmonyLink Settings") + EProfile GetActiveProfile() const; + + UFUNCTION(BlueprintCallable, Category="HarmonyLink Settings") + void SetAutomaticSwitching(const bool bAutomaticSwitch); + static void DestroySettings(); private: + void Init(); + void Tick(); void CreateDefaultConfigFile(); bool LoadSettingsFromConfig(); bool LoadSection(const FConfigFile& ConfigFile, const TPair Profile); void SaveSection(FSettingsProfile& SettingsProfile, const bool bFlush = false) const; void LoadDefaults(); - bool ApplyProfile(EProfile Profile); + + void OnPostWorldInitialization(UWorld* World, UWorld::InitializationValues IVS); static void ResetInstance(); @@ -48,17 +72,26 @@ private: void DebugPrintProfiles() const; static void PrintDebugSection(FSettingsProfile& SettingsProfile); - static FString IniLocation; + static FString _IniLocation; - TMap ProfileNames = { + uint8 _bAutomaticSwitch :1; + + // How many times to query HarmonyLinkLib for hardware info + static int32 _TickRate; + + FTimerHandle _TickTimerHandle; + + EProfile _ActiveProfile = EProfile::NONE; + + TMap _ProfileNames = { {EProfile::BATTERY, "Battery"}, {EProfile::CHARGING, "Charging"}, {EProfile::DOCKED, "Docked"}, }; - TMap Profiles; + TMap _Profiles; - static TMap> DefaultSettings; + static TMap> _DefaultSettings; - static UHarmonyLinkGraphics* Instance; + static UHarmonyLinkGraphics* _INSTANCE; }; diff --git a/Source/HarmonyLink/Public/Structs/HLConfigValue.h b/Source/HarmonyLink/Public/Structs/HLConfigValue.h index 98711ec..2ce69f3 100644 --- a/Source/HarmonyLink/Public/Structs/HLConfigValue.h +++ b/Source/HarmonyLink/Public/Structs/HLConfigValue.h @@ -14,25 +14,29 @@ enum class EConfigValueType : uint8 String }; +/** + * Note: In Blueprints, all values will be visible, but only the value corresponding to the 'Type' will be used. + */ USTRUCT(BlueprintType) struct FHLConfigValue { GENERATED_BODY() private: - UPROPERTY(EditAnywhere, Category="ConfigValue") + // Allow Blueprint access to these private variables + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ConfigValue", meta = (AllowPrivateAccess = "true")) EConfigValueType Type; - UPROPERTY(EditAnywhere, Category="ConfigValue") + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ConfigValue", meta = (AllowPrivateAccess = "true", EditCondition = "Type == EConfigValueType::Int", EditConditionHides)) int32 IntValue; - UPROPERTY(EditAnywhere, Category="ConfigValue") + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ConfigValue", meta = (AllowPrivateAccess = "true", EditCondition = "Type == EConfigValueType::Float", EditConditionHides)) float FloatValue; - UPROPERTY(EditAnywhere, Category="ConfigValue") + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ConfigValue", meta = (AllowPrivateAccess = "true", EditCondition = "Type == EConfigValueType::Bool", EditConditionHides)) bool BoolValue; - UPROPERTY(EditAnywhere, Category="ConfigValue") + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ConfigValue", meta = (AllowPrivateAccess = "true", EditCondition = "Type == EConfigValueType::String", EditConditionHides)) FString StringValue; public: diff --git a/Source/HarmonyLink/Public/Structs/SettingsProfile.h b/Source/HarmonyLink/Public/Structs/SettingsProfile.h index d38d146..7d12c33 100644 --- a/Source/HarmonyLink/Public/Structs/SettingsProfile.h +++ b/Source/HarmonyLink/Public/Structs/SettingsProfile.h @@ -12,10 +12,10 @@ struct FSettingsProfile { GENERATED_BODY() - UPROPERTY() + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Settings") FName SectionName; - UPROPERTY() + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Settings") TMap Settings; // Equality operators From 3f43bdb16be2fbb91331b98f5b889b50eba030e2 Mon Sep 17 00:00:00 2001 From: Jordon Brooks Date: Wed, 15 May 2024 21:31:08 +0100 Subject: [PATCH 17/30] Added getter and delegate for automatic profile switching --- Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp | 6 ++++++ Source/HarmonyLink/Public/Objects/HarmonyLinkGraphics.h | 7 +++++++ 2 files changed, 13 insertions(+) diff --git a/Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp b/Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp index 62c6c14..ad88487 100644 --- a/Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp +++ b/Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp @@ -260,6 +260,12 @@ EProfile UHarmonyLinkGraphics::GetActiveProfile() const void UHarmonyLinkGraphics::SetAutomaticSwitching(const bool bAutomaticSwitch) { _bAutomaticSwitch = bAutomaticSwitch; + OnAutomaticSwitchChanged.Broadcast(_bAutomaticSwitch); +} + +bool UHarmonyLinkGraphics::GetAutomaticSwitching() const +{ + return _bAutomaticSwitch; } void UHarmonyLinkGraphics::DestroySettings() diff --git a/Source/HarmonyLink/Public/Objects/HarmonyLinkGraphics.h b/Source/HarmonyLink/Public/Objects/HarmonyLinkGraphics.h index 69e167a..810a071 100644 --- a/Source/HarmonyLink/Public/Objects/HarmonyLinkGraphics.h +++ b/Source/HarmonyLink/Public/Objects/HarmonyLinkGraphics.h @@ -10,6 +10,7 @@ #include "HarmonyLinkGraphics.generated.h" DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnProfileChanged, EProfile, Profile); +DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnAutomaticSwitchChanged, bool, bAutomaticSwich); /** * @@ -25,6 +26,9 @@ public: UPROPERTY(BlueprintAssignable) FOnProfileChanged OnProfileChanged; + + UPROPERTY(BlueprintAssignable) + FOnAutomaticSwitchChanged OnAutomaticSwitchChanged; UFUNCTION(BlueprintCallable, Category="HarmonyLink Settings") void LoadConfig(const bool bForceReload = false); @@ -51,6 +55,9 @@ public: UFUNCTION(BlueprintCallable, Category="HarmonyLink Settings") void SetAutomaticSwitching(const bool bAutomaticSwitch); + UFUNCTION(BlueprintCallable, BlueprintPure, Category="HarmonyLink Settings") + bool GetAutomaticSwitching() const; + static void DestroySettings(); private: From 80ea24a6947e0dd09a603bb713db9c5e097ebd85 Mon Sep 17 00:00:00 2001 From: Jordon Brooks Date: Thu, 16 May 2024 01:39:54 +0100 Subject: [PATCH 18/30] Working --- .../Private/Objects/HarmonyLinkGraphics.cpp | 165 ++++++++++++------ .../Public/Objects/HarmonyLinkGraphics.h | 17 +- 2 files changed, 125 insertions(+), 57 deletions(-) diff --git a/Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp b/Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp index ad88487..33832a6 100644 --- a/Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp +++ b/Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp @@ -8,7 +8,6 @@ #include "GameFramework/GameUserSettings.h" UHarmonyLinkGraphics* UHarmonyLinkGraphics::_INSTANCE = nullptr; -FString UHarmonyLinkGraphics::_IniLocation = "HarmonyLink"; int32 UHarmonyLinkGraphics::_TickRate = 1; TMap> UHarmonyLinkGraphics::_DefaultSettings = { @@ -38,6 +37,7 @@ UHarmonyLinkGraphics::UHarmonyLinkGraphics() _bAutomaticSwitch = true; FWorldDelegates::OnPostWorldInitialization.AddUObject(this, &UHarmonyLinkGraphics::OnPostWorldInitialization); + FWorldDelegates::OnPreWorldFinishDestroy.AddUObject(this, &UHarmonyLinkGraphics::OnWorldEnd); } UHarmonyLinkGraphics::~UHarmonyLinkGraphics() @@ -64,7 +64,7 @@ bool UHarmonyLinkGraphics::LoadSettingsFromConfig() // Load the configuration from the INI file FConfigFile ConfigFile; - const FString Filename = GetDefaultConfigFilename(); + const FString Filename = GetConfigDirectoryFile(); if (!GConfig) { @@ -158,7 +158,7 @@ void UHarmonyLinkGraphics::SaveConfig() const SaveSection(Profile.Value); } - const FString Filename = GetDefaultConfigFilename(); + const FString Filename = GetConfigDirectoryFile(); UE_LOG(LogHarmonyLink, Log, TEXT("Flushing file: '%s'"), *Filename); GConfig->Flush(false, Filename); } @@ -272,7 +272,9 @@ void UHarmonyLinkGraphics::DestroySettings() { if (_INSTANCE) { + UE_LOG(LogHarmonyLink, Log, TEXT("Destroying UHarmonyLinkGraphics.")) FWorldDelegates::OnPostWorldInitialization.RemoveAll(_INSTANCE); + FWorldDelegates::OnPreWorldFinishDestroy.RemoveAll(_INSTANCE); _INSTANCE->RemoveFromRoot(); _INSTANCE->MarkAsGarbage(); _INSTANCE = nullptr; @@ -290,36 +292,54 @@ void UHarmonyLinkGraphics::Init() // BUG: Remove this before release! if (!BatteryStatus.HasBattery) { - ApplyProfile(EProfile::BATTERY); + ApplyProfileInternal(EProfile::BATTERY); } } void UHarmonyLinkGraphics::Tick() { - if (!_bAutomaticSwitch) + Async(EAsyncExecution::Thread, [this]() { - return; - } + const FBattery BatteryStatus = UHarmonyLinkLibrary::GetBatteryStatus(); - const FBattery BatteryStatus = UHarmonyLinkLibrary::GetBatteryStatus(); - - if (BatteryStatus.HasBattery) - { - if (BatteryStatus.IsACConnected) + if (BatteryStatus.BatteryPercent != _LastBatteryPercentage) { - if (_ActiveProfile != EProfile::CHARGING) + // Ensure thread-safe broadcasting + Async(EAsyncExecution::TaskGraphMainThread, [this, BatteryStatus]() { - ApplyProfile(EProfile::CHARGING); + OnBatteryLevelChanged.Broadcast(BatteryStatus.BatteryPercent); + }); + } + + if (!_bAutomaticSwitch) + { + return; + } + + if (BatteryStatus.HasBattery) + { + if (BatteryStatus.IsACConnected) + { + if (_ActiveProfile != EProfile::CHARGING) + { + Async(EAsyncExecution::TaskGraphMainThread, [this]() + { + ApplyProfileInternal(EProfile::CHARGING); + }); + } + } + else + { + if (_ActiveProfile != EProfile::BATTERY) + { + Async(EAsyncExecution::TaskGraphMainThread, [this]() + { + ApplyProfileInternal(EProfile::BATTERY); + }); + } } } - else - { - if (_ActiveProfile != EProfile::BATTERY) - { - ApplyProfile(EProfile::BATTERY); - } - } - } + }); } void UHarmonyLinkGraphics::CreateDefaultConfigFile() @@ -332,11 +352,22 @@ void UHarmonyLinkGraphics::CreateDefaultConfigFile() UE_LOG(LogHarmonyLink, Log, TEXT("Default config file created.")); } -void UHarmonyLinkGraphics::SaveSection(FSettingsProfile& SettingsProfile, const bool bFlush) const +FString UHarmonyLinkGraphics::GetConfigDirectoryFile() +{ + FString ConfigFileName = "HarmonyLink.ini"; // Replace with your actual config file name + +#if WITH_EDITOR + return FPaths::Combine(FPaths::ProjectSavedDir(), TEXT("Config"), ConfigFileName); +#else + return FPaths::Combine(FPaths::ProjectConfigDir(), ConfigFileName); +#endif +} + +void UHarmonyLinkGraphics::SaveSection(FSettingsProfile& SettingsProfile, const bool bFlush) { if (GConfig) { - const FString Filename = GetDefaultConfigFilename(); + const FString Filename = GetConfigDirectoryFile(); for (const auto& Setting : SettingsProfile.Settings) { FString TypeString; @@ -396,35 +427,7 @@ void UHarmonyLinkGraphics::LoadDefaults() } } -void UHarmonyLinkGraphics::OnPostWorldInitialization(UWorld* World, UWorld::InitializationValues IVS) -{ - if (!World) - { - UE_LOG(LogHarmonyLink, Error, TEXT("Failed to Hook into World Initialisation!")) - return; - } - - if (World->IsGameWorld()) - { - if (UHarmonyLinkGraphics* Settings = GetSettings()) - { - if (World->IsPlayInEditor()) - { - Settings->LoadConfig(true); - } - - if (!World->GetTimerManager().TimerExists(Settings->_TickTimerHandle) || !World->GetTimerManager().IsTimerActive(Settings->_TickTimerHandle)) - { - World->GetTimerManager().SetTimer(Settings->_TickTimerHandle, [Settings] - { - Settings->Tick(); - }, _TickRate, true); - } - } - } -} - -bool UHarmonyLinkGraphics::ApplyProfile(const EProfile Profile) +bool UHarmonyLinkGraphics::ApplyProfileInternal(const EProfile Profile) { // If the profile is None, revert to the original user game settings if (Profile == EProfile::NONE) @@ -485,6 +488,62 @@ bool UHarmonyLinkGraphics::ApplyProfile(const EProfile Profile) return true; } +void UHarmonyLinkGraphics::OnPostWorldInitialization(UWorld* World, UWorld::InitializationValues IVS) +{ + if (!World) + { + UE_LOG(LogHarmonyLink, Error, TEXT("Failed to Hook into World Initialisation!")) + return; + } + + if (World->IsGameWorld()) + { + if (UHarmonyLinkGraphics* Settings = GetSettings()) + { + if (World->IsPlayInEditor()) + { + Settings->LoadConfig(true); + } + + if (!World->GetTimerManager().TimerExists(Settings->_TickTimerHandle) || !World->GetTimerManager().IsTimerActive(Settings->_TickTimerHandle)) + { + World->GetTimerManager().SetTimer(Settings->_TickTimerHandle, [Settings] + { + Settings->Tick(); + }, _TickRate, true); + } + } + } +} + +void UHarmonyLinkGraphics::OnWorldEnd(UWorld* World) +{ + if (!World) + { + UE_LOG(LogHarmonyLink, Error, TEXT("World Already destroyed")) + return; + } + + if(World->GetTimerManager().TimerExists(_TickTimerHandle)) + { + World->GetTimerManager().ClearTimer(_TickTimerHandle); + } + + // Ensure we safely destroy our singleton instance + DestroySettings(); +} + +bool UHarmonyLinkGraphics::ApplyProfile(const EProfile Profile, const bool bDisableAuto) +{ + // Manual profile change, turn off automatic switching + if (bDisableAuto) + { + _bAutomaticSwitch = false; + } + + return ApplyProfileInternal(Profile); +} + void UHarmonyLinkGraphics::ApplySetting(const TPair& Setting) { // Apply the setting based on the key (CVar) diff --git a/Source/HarmonyLink/Public/Objects/HarmonyLinkGraphics.h b/Source/HarmonyLink/Public/Objects/HarmonyLinkGraphics.h index 810a071..e9a486e 100644 --- a/Source/HarmonyLink/Public/Objects/HarmonyLinkGraphics.h +++ b/Source/HarmonyLink/Public/Objects/HarmonyLinkGraphics.h @@ -11,6 +11,7 @@ DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnProfileChanged, EProfile, Profile); DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnAutomaticSwitchChanged, bool, bAutomaticSwich); +DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnBatteryLevelChanged, int32, BatteryPercent); /** * @@ -29,6 +30,9 @@ public: UPROPERTY(BlueprintAssignable) FOnAutomaticSwitchChanged OnAutomaticSwitchChanged; + + UPROPERTY(BlueprintAssignable) + FOnBatteryLevelChanged OnBatteryLevelChanged; UFUNCTION(BlueprintCallable, Category="HarmonyLink Settings") void LoadConfig(const bool bForceReload = false); @@ -40,7 +44,7 @@ public: void SetSetting(EProfile Profile, FName Setting, FHLConfigValue Value); UFUNCTION(BlueprintCallable, Category="HarmonyLink Settings") - bool ApplyProfile(EProfile Profile); + bool ApplyProfile(EProfile Profile, const bool bDisableAuto = true); /** Returns the game local machine settings (resolution, windowing mode, scalability settings, etc...) */ UFUNCTION(BlueprintCallable, Category="HarmonyLink Settings") @@ -64,25 +68,30 @@ private: void Init(); void Tick(); void CreateDefaultConfigFile(); + static FString GetConfigDirectoryFile(); bool LoadSettingsFromConfig(); bool LoadSection(const FConfigFile& ConfigFile, const TPair Profile); - void SaveSection(FSettingsProfile& SettingsProfile, const bool bFlush = false) const; + static void SaveSection(FSettingsProfile& SettingsProfile, const bool bFlush = false); void LoadDefaults(); + bool ApplyProfileInternal(EProfile Profile); + void OnPostWorldInitialization(UWorld* World, UWorld::InitializationValues IVS); + void OnWorldEnd(UWorld* World); static void ResetInstance(); + // Note: Turning off HarmonyLink Settings requires game restart static void ApplySetting(const TPair& Setting); // Debugging void DebugPrintProfiles() const; static void PrintDebugSection(FSettingsProfile& SettingsProfile); - static FString _IniLocation; - uint8 _bAutomaticSwitch :1; + int32 _LastBatteryPercentage = 0; + // How many times to query HarmonyLinkLib for hardware info static int32 _TickRate; From 15a26229919395f215a709ea904879db65b8b026 Mon Sep 17 00:00:00 2001 From: Jordon Brooks Date: Sat, 25 May 2024 00:44:14 +0100 Subject: [PATCH 19/30] Working profiles & Updated HarmonyLinkLib --- Source/HarmonyLink/HarmonyLink.Build.cs | 33 +- .../Private/HarmonyLinkLibrary.cpp | 8 +- .../Private/Objects/HarmonyLinkGraphics.cpp | 151 +++++-- Source/HarmonyLink/Public/Enums/Platform.h | 3 + .../Public/Objects/HarmonyLinkGraphics.h | 409 +++++++++++++++++- .../bin/Linux/libHarmonyLinkLib.so | 3 - .../bin/Win64/HarmonyLinkLib.dll | 3 - .../bin/Win64/HarmonyLinkLib.lib | 3 - .../ThirdParty/HarmonyLinkLib/include/Core.h | 10 +- .../HarmonyLinkLib/include/Enums/EDevice.h | 3 + .../lib/Linux/libHarmonyLinkLibStatic.a | 3 + .../lib/Win64/HarmonyLinkLibStatic.lib | 3 + 12 files changed, 538 insertions(+), 94 deletions(-) delete mode 100644 Source/ThirdParty/HarmonyLinkLib/bin/Linux/libHarmonyLinkLib.so delete mode 100644 Source/ThirdParty/HarmonyLinkLib/bin/Win64/HarmonyLinkLib.dll delete mode 100644 Source/ThirdParty/HarmonyLinkLib/bin/Win64/HarmonyLinkLib.lib create mode 100644 Source/ThirdParty/HarmonyLinkLib/lib/Linux/libHarmonyLinkLibStatic.a create mode 100644 Source/ThirdParty/HarmonyLinkLib/lib/Win64/HarmonyLinkLibStatic.lib diff --git a/Source/HarmonyLink/HarmonyLink.Build.cs b/Source/HarmonyLink/HarmonyLink.Build.cs index 725ae7e..ce895e9 100644 --- a/Source/HarmonyLink/HarmonyLink.Build.cs +++ b/Source/HarmonyLink/HarmonyLink.Build.cs @@ -52,23 +52,22 @@ public class HarmonyLink : ModuleRules } ); - // Platform-specific settings - if (Target.Platform == UnrealTargetPlatform.Win64) - { - PublicAdditionalLibraries.Add(Path.Combine(PluginDirectory, "Source/ThirdParty/HarmonyLinkLib/bin/Win64/HarmonyLinkLib.lib")); - RuntimeDependencies.Add("$(BinaryOutputDir)/HarmonyLinkLib.dll", Path.Combine(PluginDirectory, "Source/ThirdParty/HarmonyLinkLib/bin/Win64/HarmonyLinkLib.dll")); - } - else if (Target.Platform == UnrealTargetPlatform.Linux) - { - PublicAdditionalLibraries.Add(Path.Combine(PluginDirectory, "Source/ThirdParty/HarmonyLinkLib/bin/Linux/libHarmonyLinkLib.so")); - RuntimeDependencies.Add("$(BinaryOutputDir)/libHarmonyLinkLib.so", Path.Combine(PluginDirectory, "Source/ThirdParty/HarmonyLinkLib/bin/Linux/libHarmonyLinkLib.so")); - } - + // Platform-specific settings for static libraries + if (Target.Platform == UnrealTargetPlatform.Win64) + { + PublicAdditionalLibraries.Add(Path.Combine(PluginDirectory, "Source/ThirdParty/HarmonyLinkLib/lib/Win64/HarmonyLinkLibStatic.lib")); + PublicDefinitions.Add("HARMONYLINKLIB_STATIC=1"); + } + else if (Target.Platform == UnrealTargetPlatform.Linux) + { + PublicAdditionalLibraries.Add(Path.Combine(PluginDirectory, "Source/ThirdParty/HarmonyLinkLib/lib/Linux/libHarmonyLinkLibStatic.a")); + PublicDefinitions.Add("HARMONYLINKLIB_STATIC=1"); + } // I shall include this if anyone wishes to provide Mac binaries of HarmonyLink but these are not included by default as I don't own one. - else if (Target.Platform == UnrealTargetPlatform.Mac) - { - PublicAdditionalLibraries.Add(Path.Combine(PluginDirectory, "Source/ThirdParty/HarmonyLinkLib/bin/Mac/HarmonyLinkLib.dylib")); - RuntimeDependencies.Add("$(BinaryOutputDir)/HarmonyLinkLib.dylib", Path.Combine(PluginDirectory, "Source/ThirdParty/HarmonyLinkLib/bin/Mac/HarmonyLinkLib.dylib")); - } + else if (Target.Platform == UnrealTargetPlatform.Mac) + { + PublicAdditionalLibraries.Add(Path.Combine(PluginDirectory, "Source/ThirdParty/HarmonyLinkLib/lib/Mac/libHarmonyLinkLibStatic.a")); + PublicDefinitions.Add("HARMONYLINKLIB_STATIC=1"); + } } } diff --git a/Source/HarmonyLink/Private/HarmonyLinkLibrary.cpp b/Source/HarmonyLink/Private/HarmonyLinkLibrary.cpp index ed3f0d9..ac55833 100644 --- a/Source/HarmonyLink/Private/HarmonyLinkLibrary.cpp +++ b/Source/HarmonyLink/Private/HarmonyLinkLibrary.cpp @@ -11,13 +11,7 @@ bool UHarmonyLinkLibrary::IsWine() bool UHarmonyLinkLibrary::IsLinux() { -#if PLATFORM_WINDOWS - return IsWine(); -#elif PLATFORM_LINUX - return true; -#else - return false; -#endif + return HarmonyLinkLib::get_is_linux(); } bool UHarmonyLinkLibrary::IsSteamDeck() diff --git a/Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp b/Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp index 33832a6..3f05b62 100644 --- a/Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp +++ b/Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp @@ -9,7 +9,20 @@ UHarmonyLinkGraphics* UHarmonyLinkGraphics::_INSTANCE = nullptr; int32 UHarmonyLinkGraphics::_TickRate = 1; +FTimerHandle UHarmonyLinkGraphics::_TickTimerHandle = FTimerHandle(); +/** + * @brief Default graphics settings for different power states in HarmonyLink. + * + * This map defines the default configuration values for various graphics settings based on the power state of the device. + * The outer map's key is the power state (e.g., "Battery", "Charging", "Docked"). + * The inner map contains key-value pairs where the key is the setting name and the value is the corresponding configuration value. + * + * Power States: + * - "Battery": Settings for when the device is running on battery power. + * - "Charging": Settings for when the device is charging. + * - "Docked": Settings for when the device is docked. + */ TMap> UHarmonyLinkGraphics::_DefaultSettings = { { "Battery", { { TEXT("r.ReflectionMethod"), FHLConfigValue(0) }, @@ -34,8 +47,7 @@ TMap> UHarmonyLinkGraphics::_DefaultSettings UHarmonyLinkGraphics::UHarmonyLinkGraphics() { UE_LOG(LogHarmonyLink, Warning, TEXT("HarmonyLinkGraphics initialized.")); - - _bAutomaticSwitch = true; + FWorldDelegates::OnPostWorldInitialization.AddUObject(this, &UHarmonyLinkGraphics::OnPostWorldInitialization); FWorldDelegates::OnPreWorldFinishDestroy.AddUObject(this, &UHarmonyLinkGraphics::OnWorldEnd); } @@ -50,25 +62,29 @@ void UHarmonyLinkGraphics::LoadConfig(const bool bForceReload) QUICK_SCOPE_CYCLE_COUNTER(HarmonyLinkGraphics_LoadSettings); // Load the settings into the map - if (!LoadSettingsFromConfig()) + if (!LoadSettingsFromConfig(false)) { - // Retry 2nd time - LoadSettingsFromConfig(); + if (!LoadSettingsFromConfig(true)) + { + CreateDefaultConfigFile(); + // Retry 2nd time + LoadSettingsFromConfig(true); + } } DebugPrintProfiles(); } -bool UHarmonyLinkGraphics::LoadSettingsFromConfig() +bool UHarmonyLinkGraphics::LoadSettingsFromConfig(const bool bLoadDefaults) { // Load the configuration from the INI file FConfigFile ConfigFile; - const FString Filename = GetConfigDirectoryFile(); + const FString Filename = GetConfigDirectoryFile(bLoadDefaults); if (!GConfig) { - UE_LOG(LogHarmonyLink, Error, TEXT("Failed to access GConfig!")) + UE_LOG(LogHarmonyLink, Error, TEXT("Failed to access GConfig!")); return false; } @@ -77,6 +93,20 @@ bool UHarmonyLinkGraphics::LoadSettingsFromConfig() // Load each profile section bool bLoaded = true; + // Load the _bAutomaticSwitch variable + const FString SectionName = TEXT("HarmonyLink"); + const FString KeyName = TEXT("AutomaticProfileSwitch"); + + if (!GConfig->GetBool(*SectionName, *KeyName, _bAutomaticSwitch, Filename)) + { + UE_LOG(LogHarmonyLink, Error, TEXT("Failed to load bAutomaticSwitch from config")); + bLoaded = false; + } + else + { + UE_LOG(LogHarmonyLink, Log, TEXT("Loaded bAutomaticSwitch: %s"), _bAutomaticSwitch ? TEXT("true") : TEXT("false")); + } + for (const TPair& Profile : _ProfileNames) { if (!LoadSection(ConfigFile, Profile)) @@ -86,7 +116,7 @@ bool UHarmonyLinkGraphics::LoadSettingsFromConfig() } } - // Check if all profiles were loaded successfully + // Check if all profiles and settings were loaded successfully if (bLoaded) { UE_LOG(LogHarmonyLink, Log, TEXT("Successfully loaded config file: %s"), *Filename); @@ -95,7 +125,6 @@ bool UHarmonyLinkGraphics::LoadSettingsFromConfig() } UE_LOG(LogHarmonyLink, Error, TEXT("Failed to load config file: %s"), *Filename); - CreateDefaultConfigFile(); return false; } @@ -151,20 +180,17 @@ bool UHarmonyLinkGraphics::LoadSection(const FConfigFile& ConfigFile, const TPai void UHarmonyLinkGraphics::SaveConfig() const { - QUICK_SCOPE_CYCLE_COUNTER(HarmonyLinkGraphics_SaveConfig); - - for (TPair Profile : _Profiles) - { - SaveSection(Profile.Value); - } - - const FString Filename = GetConfigDirectoryFile(); - UE_LOG(LogHarmonyLink, Log, TEXT("Flushing file: '%s'"), *Filename); - GConfig->Flush(false, Filename); + Intermal_SaveConfig(false); } void UHarmonyLinkGraphics::SetSetting(const EProfile Profile, const FName Setting, const FHLConfigValue Value) { + // Ignore if HarmonyLinkSettings is disabled + if (Profile == EProfile::NONE) + { + return; + } + // Find the profile name associated with the given EProfile const FName* ProfileName = _ProfileNames.Find(Profile); @@ -230,6 +256,12 @@ UHarmonyLinkGraphics* UHarmonyLinkGraphics::GetSettings() FSettingsProfile UHarmonyLinkGraphics::GetSettingProfile(const EProfile Profile) { + // Ignore if HarmonyLinkSettings is disabled + if (Profile == EProfile::NONE) + { + return FSettingsProfile(); + } + // Find the profile name associated with the given EProfile const FName* ProfileName = _ProfileNames.Find(Profile); @@ -249,7 +281,6 @@ FSettingsProfile UHarmonyLinkGraphics::GetSettingProfile(const EProfile Profile) } return *SettingsProfile; - } EProfile UHarmonyLinkGraphics::GetActiveProfile() const @@ -286,16 +317,35 @@ void UHarmonyLinkGraphics::Init() LoadConfig(); const FBattery BatteryStatus = UHarmonyLinkLibrary::GetBatteryStatus(); - - // Enabled for development testing - // At some point I need to implement the ability to fake and emulate these settings to make it easier to test - // BUG: Remove this before release! - if (!BatteryStatus.HasBattery) + + if (BatteryStatus.HasBattery) { ApplyProfileInternal(EProfile::BATTERY); } } +void UHarmonyLinkGraphics::Intermal_SaveConfig(const bool bDefaultConfig) const +{ + QUICK_SCOPE_CYCLE_COUNTER(HarmonyLinkGraphics_SaveConfig); + + const FString Filename = GetConfigDirectoryFile(bDefaultConfig); + const FString SectionName = TEXT("HarmonyLink"); + const FString KeyName = TEXT("AutomaticProfileSwitch"); + + // Save the _bAutomaticSwitch variable + GConfig->SetBool(*SectionName, *KeyName, _bAutomaticSwitch, Filename); + + UE_LOG(LogHarmonyLink, Log, TEXT("Saving bAutomaticSwitch: %s"), _bAutomaticSwitch ? TEXT("true") : TEXT("false")); + + for (const TPair& Profile : _Profiles) + { + SaveSection(Profile.Value, bDefaultConfig); + } + + UE_LOG(LogHarmonyLink, Log, TEXT("Flushing file: '%s'"), *Filename); + GConfig->Flush(true, Filename); +} + void UHarmonyLinkGraphics::Tick() { Async(EAsyncExecution::Thread, [this]() @@ -347,27 +397,23 @@ void UHarmonyLinkGraphics::CreateDefaultConfigFile() UE_LOG(LogHarmonyLink, Log, TEXT("Creating default config file.")); LoadDefaults(); - SaveConfig(); + Intermal_SaveConfig(true); UE_LOG(LogHarmonyLink, Log, TEXT("Default config file created.")); } -FString UHarmonyLinkGraphics::GetConfigDirectoryFile() +FString UHarmonyLinkGraphics::GetConfigDirectoryFile(const bool bDefaultFolder) { - FString ConfigFileName = "HarmonyLink.ini"; // Replace with your actual config file name + FString ConfigFileName = bDefaultFolder? "DefaultHarmonyLink.ini" : "HarmonyLink.ini"; // Replace with your actual config file name -#if WITH_EDITOR - return FPaths::Combine(FPaths::ProjectSavedDir(), TEXT("Config"), ConfigFileName); -#else - return FPaths::Combine(FPaths::ProjectConfigDir(), ConfigFileName); -#endif + return FPaths::Combine(bDefaultFolder ? FPaths::ProjectConfigDir() : FPaths::GeneratedConfigDir(), ConfigFileName); } -void UHarmonyLinkGraphics::SaveSection(FSettingsProfile& SettingsProfile, const bool bFlush) +void UHarmonyLinkGraphics::SaveSection(const FSettingsProfile& SettingsProfile, const bool bDefaultConfig, const bool bFlush) { if (GConfig) { - const FString Filename = GetConfigDirectoryFile(); + const FString Filename = GetConfigDirectoryFile(bDefaultConfig); for (const auto& Setting : SettingsProfile.Settings) { FString TypeString; @@ -490,7 +536,7 @@ bool UHarmonyLinkGraphics::ApplyProfileInternal(const EProfile Profile) void UHarmonyLinkGraphics::OnPostWorldInitialization(UWorld* World, UWorld::InitializationValues IVS) { - if (!World) + if (!World || !World->IsValidLowLevel()) { UE_LOG(LogHarmonyLink, Error, TEXT("Failed to Hook into World Initialisation!")) return; @@ -498,18 +544,29 @@ void UHarmonyLinkGraphics::OnPostWorldInitialization(UWorld* World, UWorld::Init if (World->IsGameWorld()) { - if (UHarmonyLinkGraphics* Settings = GetSettings()) + if (_INSTANCE) { - if (World->IsPlayInEditor()) + FTimerManager* TimerManager = &World->GetTimerManager(); + if (!TimerManager) { - Settings->LoadConfig(true); + UE_LOG(LogHarmonyLink, Error, TEXT("Failed get TimerManager!")) + return; } - - if (!World->GetTimerManager().TimerExists(Settings->_TickTimerHandle) || !World->GetTimerManager().IsTimerActive(Settings->_TickTimerHandle)) + + if (!TimerManager->TimerExists(_INSTANCE->_TickTimerHandle) || !TimerManager->IsTimerActive(_INSTANCE->_TickTimerHandle)) { - World->GetTimerManager().SetTimer(Settings->_TickTimerHandle, [Settings] + World->GetTimerManager().SetTimer(_INSTANCE->_TickTimerHandle, [&, TimerManager] { - Settings->Tick(); + if (!this) + { + UE_LOG(LogHarmonyLink, Error, TEXT("'This' is destroyed, Clearing timer.")) + if (TimerManager) + { + TimerManager->ClearTimer(_TickTimerHandle); + } + return; + } + Tick(); }, _TickRate, true); } } @@ -518,7 +575,7 @@ void UHarmonyLinkGraphics::OnPostWorldInitialization(UWorld* World, UWorld::Init void UHarmonyLinkGraphics::OnWorldEnd(UWorld* World) { - if (!World) + if (!World || !World->IsValidLowLevel()) { UE_LOG(LogHarmonyLink, Error, TEXT("World Already destroyed")) return; @@ -533,10 +590,10 @@ void UHarmonyLinkGraphics::OnWorldEnd(UWorld* World) DestroySettings(); } -bool UHarmonyLinkGraphics::ApplyProfile(const EProfile Profile, const bool bDisableAuto) +bool UHarmonyLinkGraphics::ApplyProfile(const EProfile Profile, const bool bDisableAutomaticSwitch) { // Manual profile change, turn off automatic switching - if (bDisableAuto) + if (bDisableAutomaticSwitch) { _bAutomaticSwitch = false; } diff --git a/Source/HarmonyLink/Public/Enums/Platform.h b/Source/HarmonyLink/Public/Enums/Platform.h index 2ffb255..9ab89dc 100644 --- a/Source/HarmonyLink/Public/Enums/Platform.h +++ b/Source/HarmonyLink/Public/Enums/Platform.h @@ -5,6 +5,9 @@ #include "CoreMinimal.h" #include "Platform.generated.h" +// Undefine the LINUX macro to avoid conflicts with the enum definition. +#undef LINUX + /* * Enum representing different operating system platforms. */ diff --git a/Source/HarmonyLink/Public/Objects/HarmonyLinkGraphics.h b/Source/HarmonyLink/Public/Objects/HarmonyLinkGraphics.h index e9a486e..3b0836e 100644 --- a/Source/HarmonyLink/Public/Objects/HarmonyLinkGraphics.h +++ b/Source/HarmonyLink/Public/Objects/HarmonyLinkGraphics.h @@ -33,81 +33,468 @@ public: UPROPERTY(BlueprintAssignable) FOnBatteryLevelChanged OnBatteryLevelChanged; - + + /** + * @brief Loads the graphics configuration settings. + * + * This function loads the graphics settings into the appropriate map. If the initial loading attempt fails, + * it retries a second time. The settings are loaded using the `LoadSettingsFromConfig` method. + * After loading the settings, the function prints debug information about the profiles. + * + * @param bForceReload Indicates whether to force reload the settings. Defaults to false. + * + * @note This function uses the QUICK_SCOPE_CYCLE_COUNTER macro for performance profiling. + */ UFUNCTION(BlueprintCallable, Category="HarmonyLink Settings") void LoadConfig(const bool bForceReload = false); + /** + * @brief Saves the current graphics configuration settings to the configuration file. + * + * This function iterates through all profiles and saves their settings to the configuration file. + * Additionally, it saves the `_bAutomaticSwitch` variable to the configuration file and flushes the changes. + * + * @details + * - Uses the QUICK_SCOPE_CYCLE_COUNTER macro for performance profiling. + * - Iterates through the `_Profiles` map and calls `SaveSection` for each profile to save its settings. + * - Saves the `_bAutomaticSwitch` variable under the "HarmonyLink" section with the key "AutomaticProfileSwitch". + * - Logs the status of `_bAutomaticSwitch` and flushes the configuration file to ensure all changes are written. + * + * @note Uses UE_LOG for logging the save process and status messages. + */ UFUNCTION(BlueprintCallable, Category="HarmonyLink Settings") void SaveConfig() const; + /** + * @brief Sets a specific configuration value for a given profile. + * + * This function updates a setting for a specified profile with a new value. It handles various data types (int, float, bool, string) + * and logs the process. If the profile or settings cannot be found, it logs an error message. + * + * @param Profile The profile identifier for which the setting is to be updated. + * @param Setting The name of the setting to update. + * @param Value The new value to set for the specified setting. + * + * @details + * - Finds the profile name associated with the given `EProfile`. + * - Determines the type of the value and converts it to a string. + * - Logs the application of the setting with its value and type. + * - Finds the settings profile associated with the given profile. + * - Updates the setting with the new value or adds it if it does not exist. + * + * @note Uses UE_LOG for logging the update process and any errors. + */ UFUNCTION(BlueprintCallable, Category="HarmonyLink Settings") void SetSetting(EProfile Profile, FName Setting, FHLConfigValue Value); + /** + * @brief Applies the specified graphics profile. + * + * This function applies the given graphics profile. If automatic profile switching is enabled, it can be disabled by setting the `bDisableAutomaticSwitch` parameter to true. + * + * @param Profile The profile to apply. + * @param bDisableAutomaticSwitch Indicates whether to disable automatic profile switching. Defaults to true. + * @return bool Returns true if the profile was successfully applied; false otherwise. + * + * @details + * - If `bDisableAutomaticSwitch` is true, sets `_bAutomaticSwitch` to false to disable automatic profile switching. + * - Calls `ApplyProfileInternal` to apply the specified profile. + * - Returns the result of `ApplyProfileInternal`. + */ UFUNCTION(BlueprintCallable, Category="HarmonyLink Settings") - bool ApplyProfile(EProfile Profile, const bool bDisableAuto = true); + bool ApplyProfile(EProfile Profile, const bool bDisableAutomaticSwitch = true); - /** Returns the game local machine settings (resolution, windowing mode, scalability settings, etc...) */ + /** + * @brief Retrieves the singleton instance of the UHarmonyLinkGraphics settings. + * + * This function returns the singleton instance of the `UHarmonyLinkGraphics` class. If the instance has not been + * initialized, it creates a new instance, adds it to the root to prevent garbage collection, initializes it, and + * then returns the instance. + * + * @return UHarmonyLinkGraphics* The singleton instance of the `UHarmonyLinkGraphics` class. + * + * @details + * - Checks if the singleton instance (`_INSTANCE`) is already initialized. + * - If not, creates a new instance using `NewObject`. + * - Adds the new instance to the root to prevent it from being garbage collected. + * - Calls the `Init` function on the new instance to perform any necessary initialization. + * - Returns the singleton instance. + */ UFUNCTION(BlueprintCallable, Category="HarmonyLink Settings") static UHarmonyLinkGraphics* GetSettings(); + /** + * @brief Retrieves the settings profile for a specified profile. + * + * This function returns the settings profile associated with the given `EProfile`. If the profile name or the settings + * cannot be found, it logs an error message and returns an empty `FSettingsProfile`. + * + * @param Profile The profile identifier for which the settings profile is to be retrieved. + * @return FSettingsProfile The settings profile associated with the specified profile. If the profile is not found, returns an empty `FSettingsProfile`. + * + * @details + * - Finds the profile name associated with the given `EProfile`. + * - Logs an error and returns an empty `FSettingsProfile` if the profile name is not found. + * - Finds the settings profile associated with the profile. + * - Logs an error and returns an empty `FSettingsProfile` if the settings profile is not found. + * - Returns the settings profile if found. + * + * @note Uses UE_LOG for logging errors. + */ UFUNCTION(BlueprintCallable, BlueprintPure, Category="HarmonyLink Settings") FSettingsProfile GetSettingProfile(const EProfile Profile); + /** + * @brief Retrieves the currently active profile. + * + * This function returns the currently active profile of the `UHarmonyLinkGraphics` settings. + * + * @return EProfile The currently active profile. + */ UFUNCTION(BlueprintCallable, BlueprintPure, Category="HarmonyLink Settings") EProfile GetActiveProfile() const; + /** + * @brief Sets the automatic profile switching state. + * + * This function updates the automatic profile switching setting and broadcasts the change. + * + * @param bAutomaticSwitch Indicates whether automatic profile switching should be enabled (true) or disabled (false). + * + * @details + * - Updates the `_bAutomaticSwitch` member variable with the new value. + * - Broadcasts the change to any listeners using the `OnAutomaticSwitchChanged` delegate. + */ UFUNCTION(BlueprintCallable, Category="HarmonyLink Settings") void SetAutomaticSwitching(const bool bAutomaticSwitch); + /** + * @brief Retrieves the current state of automatic profile switching. + * + * This function returns the state of the automatic profile switching setting. + * + * @return bool True if automatic profile switching is enabled; false otherwise. + */ UFUNCTION(BlueprintCallable, BlueprintPure, Category="HarmonyLink Settings") bool GetAutomaticSwitching() const; + /** + * @brief Destroys the singleton instance of the UHarmonyLinkGraphics settings. + * + * This function safely destroys the singleton instance of the `UHarmonyLinkGraphics` class by removing it from root, + * marking it as garbage for cleanup, and setting the instance pointer to null. + * + * @details + * - Checks if the singleton instance (`_INSTANCE`) exists. + * - Logs the destruction of the `UHarmonyLinkGraphics` instance. + * - Removes all delegate bindings from `_INSTANCE`. + * - Removes `_INSTANCE` from the root to allow garbage collection. + * - Marks `_INSTANCE` as garbage to enable cleanup. + * - Sets `_INSTANCE` to null. + * + * @note Uses UE_LOG for logging the destruction process. + */ static void DestroySettings(); private: + /** + * @brief Initializes the UHarmonyLinkGraphics settings. + * + * This function initializes the `UHarmonyLinkGraphics` settings by loading the configuration and applying the + * appropriate profile based on the battery status. + * + * @details + * - Calls `LoadConfig` to load the configuration settings. + * - Retrieves the current battery status using `UHarmonyLinkLibrary::GetBatteryStatus`. + * - If the device has a battery, applies the `BATTERY` profile by calling `ApplyProfileInternal`. + */ void Init(); + + void Intermal_SaveConfig(const bool bDefaultConfig) const; + + /** + * @brief Periodically checks and updates the battery status and profile settings. + * + * This function is executed based on a timer determined by `_TickRate`. It asynchronously checks the current battery status + * and updates the battery percentage and profile settings as needed. If the battery percentage has changed, it broadcasts + * this change. If automatic profile switching is enabled, it applies the appropriate profile based on the AC connection status. + * + * @details + * - Runs asynchronously on a separate thread to fetch the current battery status using `UHarmonyLinkLibrary::GetBatteryStatus`. + * - If the battery percentage has changed, broadcasts the new battery percentage in a thread-safe manner. + * - If automatic profile switching (`_bAutomaticSwitch`) is disabled, exits the function. + * - If the device has a battery: + * - Checks the AC connection status and applies the `CHARGING` profile if connected to AC. + * - Applies the `BATTERY` profile if not connected to AC. + * - Ensures all profile applications and broadcasts are executed on the main thread for thread safety. + * + * @note Uses UE_LOG for logging and `Async` for asynchronous execution. + */ void Tick(); + + /** + * @brief Creates a default configuration file. + * + * This function creates a default configuration file by loading the default settings and then saving them to the config file. + * + * @details + * - Logs the start of the default configuration file creation process. + * - Calls `LoadDefaults` to load the default settings into the configuration. + * - Calls `SaveConfig` to save the default settings to the configuration file. + * - Logs the completion of the default configuration file creation process. + * + * @note Uses UE_LOG for logging the creation process. + */ void CreateDefaultConfigFile(); - static FString GetConfigDirectoryFile(); - bool LoadSettingsFromConfig(); + + /** + * @brief Retrieves the path to the configuration file. + * + * This function constructs and returns the full path to the configuration file used by the `UHarmonyLinkGraphics` settings. + * + * @return FString The full path to the configuration file. + * + * @details + * - Defines the configuration file name as "HarmonyLink.ini". + * - Combines the generated config directory path with the configuration file name to form the full path. + * - Returns the full path to the configuration file. + */ + static FString GetConfigDirectoryFile(const bool bDefaultFolder); + + /** + * @brief Loads the settings from the configuration file. + * + * This function loads the graphics settings from an INI configuration file into the appropriate structures. + * It attempts to load each profile section and the automatic switch setting. If any section fails to load, + * it logs an error message and indicates failure. If loading is successful, it logs a success message. + * + * @return true if the settings were successfully loaded; false otherwise. + * + * @details + * - Loads the configuration file specified by `GetConfigDirectoryFile`. + * - Iterates over the `_ProfileNames` to load each profile section. + * - Loads the `_bAutomaticSwitch` variable from the config. + * - If loading fails, it attempts to create a default configuration file. + * + * @note Uses UE_LOG for logging errors and success messages. + */ + bool LoadSettingsFromConfig(const bool bLoadDefaults); + + /** + * @brief Loads a specific section from the configuration file into a settings profile. + * + * This function extracts settings from a specified section of the configuration file and stores them in the corresponding profile. + * It handles different data types (int, float, bool, string) and parses them accordingly. If the section is found and loaded successfully, + * the settings are added to the profile's settings map. + * + * @param ConfigFile The configuration file from which to load the section. + * @param Profile The profile key-value pair containing the profile enum and the section name. + * @return true if the section was found and loaded successfully; false otherwise. + * + * @details + * - Finds the section in the configuration file using the section name from the profile. + * - Clears any previous settings in the profile. + * - Iterates through the settings in the section, parsing the value and type, and adds them to the profile's settings map. + * + * @note The function handles settings of types int, float, bool, and string. + */ bool LoadSection(const FConfigFile& ConfigFile, const TPair Profile); - static void SaveSection(FSettingsProfile& SettingsProfile, const bool bFlush = false); + + + /** + * @brief Saves the settings of a given profile section to the configuration file. + * + * This function saves the settings of a specified profile section to the configuration file. It handles various data types + * (int, float, bool, string) and formats them accordingly before saving. If the `bFlush` parameter is true, the configuration + * file is flushed to ensure all changes are written to disk. + * + * @param SettingsProfile The settings profile to be saved. + * @param bFlush Indicates whether to flush the configuration file after saving. Defaults to false. + * + * @details + * - Checks if the global configuration object (`GConfig`) is available. + * - Constructs the full path to the configuration file using `GetConfigDirectoryFile`. + * - Iterates through the settings in the provided `SettingsProfile`. + * - Determines the type and value of each setting and formats them as strings. + * - Sets the formatted string in the configuration file for each setting. + * - Logs the save operation. + * - If `bFlush` is true, flushes the configuration file to ensure all changes are written. + * + * @note Uses UE_LOG for logging the save and flush operations. + */ + static void SaveSection(const FSettingsProfile& SettingsProfile, const bool bDefaultConfig, const bool bFlush = false); + + /** + * @brief Loads the default settings into the profiles. + * + * This function resets the current profiles and loads the default settings into the profiles. It iterates over the profile names + * and assigns the default settings to each profile. + * + * @details + * - Logs the start of the `LoadDefaults` process. + * - Resets the `_Profiles` map to clear any existing settings. + * - Iterates over `_ProfileNames` to create default settings for each profile. + * - For each profile, initializes a `FSettingsProfile` with the section name. + * - If default settings are found for the profile in `_DefaultSettings`, assigns these settings to the profile. + * - Adds the newly created profile settings to `_Profiles`. + * + * @note Uses UE_LOG for logging the start of the default settings loading process. + */ void LoadDefaults(); + + /** + * @brief Applies the specified graphics profile internally. + * + * This function applies the given graphics profile by either reverting to the original user game settings or + * applying the settings associated with the specified profile. + * + * @param Profile The profile to apply. If the profile is `EProfile::NONE`, the function reverts to the original user game settings. + * @return bool Returns true if the profile was successfully applied; false otherwise. + * + * @details + * - If the `Profile` is `EProfile::NONE`: + * - Logs a message indicating reversion to original user game settings. + * - Retrieves the user game settings and applies them. + * - Sets `_ActiveProfile` to `EProfile::NONE` and broadcasts the profile change. + * - Returns true if successful, false otherwise. + * - Finds the profile name associated with the given `EProfile`. + * - Logs an error and returns false if the profile name is not found. + * - Logs a message indicating the profile being applied. + * - Finds the settings associated with the profile. + * - Logs a warning and returns false if the settings profile is not found. + * - Creates a render state context for applying settings. + * - Iterates through each setting in the profile and applies it using `ApplySetting`. + * - Sets `_ActiveProfile` to the specified profile and broadcasts the profile change. + * - Returns true indicating the profile was successfully applied. + * + * @note Uses UE_LOG for logging messages, warnings, and errors. Uses `OnProfileChanged` to broadcast profile changes. + */ bool ApplyProfileInternal(EProfile Profile); + /** + * @brief Handles actions to be performed after the world initialization. + * + * This function hooks into the world initialization process to set up the `UHarmonyLinkGraphics` settings. + * It checks if the world is valid and is a game world, then initializes or reloads the settings as necessary and sets up a timer for periodic updates. + * + * @param World The world that has just been initialized. + * @param IVS Initialization values for the world. + * + * @details + * - Checks if the `World` pointer is valid. Logs an error and returns if the world is invalid. + * - If the world is a game world: + * - Retrieves the singleton settings instance using `GetSettings`. + * - If the world is a play-in-editor world, reloads the settings configuration by calling `LoadConfig` with `bForceReload` set to true. + * - Checks if the tick timer is already set or active. If not, sets a timer to call the `Tick` function at intervals specified by `_TickRate`. + * + * @note Uses UE_LOG for logging errors and informational messages. + */ void OnPostWorldInitialization(UWorld* World, UWorld::InitializationValues IVS); + + /** + * @brief Handles actions to be performed when the world ends. + * + * This function is called when the world is about to be destroyed. It clears the tick timer and safely destroys the singleton instance of the `UHarmonyLinkGraphics` settings. + * + * @param World The world that is ending. + * + * @details + * - Checks if the `World` pointer is valid. Logs an error and returns if the world is already destroyed. + * - If the tick timer exists, clears the timer using the world's timer manager. + * - Calls `DestroySettings` to safely destroy the singleton instance of `UHarmonyLinkGraphics`. + * + * @note Uses UE_LOG for logging errors and informational messages. + */ void OnWorldEnd(UWorld* World); + /** + * @brief Resets the singleton instance of the UHarmonyLinkGraphics settings. + * + * This function resets the singleton instance by destroying the current instance and creating a new one. + * + * @details + * - Calls `DestroySettings` on the current instance to safely destroy it. + * - Calls `GetSettings` to create and initialize a new singleton instance. + */ static void ResetInstance(); - // Note: Turning off HarmonyLink Settings requires game restart + /** + * @brief Applies a specific configuration setting to the console variable. + * + * This function applies the given configuration setting to the corresponding console variable (CVar) based on its key. It supports different data types such as bool, float, and int. + * + * @param Setting The key-value pair representing the setting to apply. The key is the name of the console variable, and the value is the configuration value. + * + * @details + * - Uses the console manager to find the console variable associated with the given setting key. + * - Depending on the type of the configuration value, sets the console variable to the corresponding value. + * - If the console variable is not found, logs a warning message. + * - If the value type is unsupported, logs a warning message. + * + * @note Uses UE_LOG for logging warnings about unsupported value types or missing console variables. + */ static void ApplySetting(const TPair& Setting); - // Debugging + /** + * @brief Prints debug information for all profiles. + * + * This function logs the debug information for all profiles stored in `_Profiles`. It iterates through each profile and calls `PrintDebugSection` to print the details. + * + * @details + * - Logs the start of the `DebugPrintProfiles` process. + * - Iterates over each profile in the `_Profiles` map. + * - Calls `PrintDebugSection` for each profile to print its details. + * - Logs the completion of the `DebugPrintProfiles` process. + * + * @note Uses UE_LOG for logging the start and completion of the debug print process. + */ void DebugPrintProfiles() const; + + /** + * @brief Prints debug information for a specific settings profile. + * + * This function logs the debug information for a given settings profile, including the section name and each setting's key, value, and type. + * + * @param SettingsProfile The settings profile to print debug information for. + * + * @details + * - Logs the section name of the `SettingsProfile`. + * - Iterates through each setting in the `SettingsProfile`. + * - Depending on the type of each setting, converts the value to a string and logs the key, value, and type. + * + * @note Uses UE_LOG for logging the section name and settings details. + */ static void PrintDebugSection(FSettingsProfile& SettingsProfile); - uint8 _bAutomaticSwitch :1; + // Indicates whether automatic profile switching is enabled. + bool _bAutomaticSwitch = false; + // Stores the last recorded battery percentage. int32 _LastBatteryPercentage = 0; - // How many times to query HarmonyLinkLib for hardware info + // The rate at which to query HarmonyLinkLib for hardware info. static int32 _TickRate; - FTimerHandle _TickTimerHandle; + // Timer handle for managing the periodic tick function. + static FTimerHandle _TickTimerHandle; + // The currently active profile. EProfile _ActiveProfile = EProfile::NONE; + // Maps profile enums to their corresponding names. TMap _ProfileNames = { {EProfile::BATTERY, "Battery"}, {EProfile::CHARGING, "Charging"}, {EProfile::DOCKED, "Docked"}, }; + // Stores the settings profiles. TMap _Profiles; + // The default settings for profiles. static TMap> _DefaultSettings; + // Singleton instance of UHarmonyLinkGraphics. static UHarmonyLinkGraphics* _INSTANCE; }; diff --git a/Source/ThirdParty/HarmonyLinkLib/bin/Linux/libHarmonyLinkLib.so b/Source/ThirdParty/HarmonyLinkLib/bin/Linux/libHarmonyLinkLib.so deleted file mode 100644 index a48fb6f..0000000 --- a/Source/ThirdParty/HarmonyLinkLib/bin/Linux/libHarmonyLinkLib.so +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3934d762dd9c3c6fcd29b5bf76687770f2572296f1820cbd39ff4093135ad907 -size 278088 diff --git a/Source/ThirdParty/HarmonyLinkLib/bin/Win64/HarmonyLinkLib.dll b/Source/ThirdParty/HarmonyLinkLib/bin/Win64/HarmonyLinkLib.dll deleted file mode 100644 index 860a335..0000000 --- a/Source/ThirdParty/HarmonyLinkLib/bin/Win64/HarmonyLinkLib.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6a94fca6083b966762b2640dc4fed71c4556c5169e6853c092638c9b80923ad3 -size 193536 diff --git a/Source/ThirdParty/HarmonyLinkLib/bin/Win64/HarmonyLinkLib.lib b/Source/ThirdParty/HarmonyLinkLib/bin/Win64/HarmonyLinkLib.lib deleted file mode 100644 index 233a4d6..0000000 --- a/Source/ThirdParty/HarmonyLinkLib/bin/Win64/HarmonyLinkLib.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6a815d7263dfec62f077eed620f0f08763031b3b58e3bf816a305d3ed0271167 -size 11026 diff --git a/Source/ThirdParty/HarmonyLinkLib/include/Core.h b/Source/ThirdParty/HarmonyLinkLib/include/Core.h index ec6ef9d..94a32d2 100644 --- a/Source/ThirdParty/HarmonyLinkLib/include/Core.h +++ b/Source/ThirdParty/HarmonyLinkLib/include/Core.h @@ -16,10 +16,14 @@ // Use a preprocessor definition to switch between export and import declarations #ifdef _WIN32 - #ifdef HARMONYLINKLIB_EXPORTS - #define HARMONYLINKLIB_API __declspec(dllexport) + #ifdef HARMONYLINKLIB_STATIC + #define HARMONYLINKLIB_API #else - #define HARMONYLINKLIB_API __declspec(dllimport) + #ifdef HARMONYLINKLIB_SHARED + #define HARMONYLINKLIB_API __declspec(dllexport) + #else + #define HARMONYLINKLIB_API __declspec(dllimport) + #endif #endif #else #define HARMONYLINKLIB_API diff --git a/Source/ThirdParty/HarmonyLinkLib/include/Enums/EDevice.h b/Source/ThirdParty/HarmonyLinkLib/include/Enums/EDevice.h index f49c7ec..c11919d 100644 --- a/Source/ThirdParty/HarmonyLinkLib/include/Enums/EDevice.h +++ b/Source/ThirdParty/HarmonyLinkLib/include/Enums/EDevice.h @@ -14,6 +14,9 @@ #pragma once +// Undefine the LINUX macro to avoid conflicts with the enum definition. +#undef LINUX + #include // Enum class for representing different types of devices diff --git a/Source/ThirdParty/HarmonyLinkLib/lib/Linux/libHarmonyLinkLibStatic.a b/Source/ThirdParty/HarmonyLinkLib/lib/Linux/libHarmonyLinkLibStatic.a new file mode 100644 index 0000000..a68f717 --- /dev/null +++ b/Source/ThirdParty/HarmonyLinkLib/lib/Linux/libHarmonyLinkLibStatic.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:662848d6802035c1d74a131316d676e256a65c1537644e787e39c0b3c58209df +size 398236 diff --git a/Source/ThirdParty/HarmonyLinkLib/lib/Win64/HarmonyLinkLibStatic.lib b/Source/ThirdParty/HarmonyLinkLib/lib/Win64/HarmonyLinkLibStatic.lib new file mode 100644 index 0000000..d011ea4 --- /dev/null +++ b/Source/ThirdParty/HarmonyLinkLib/lib/Win64/HarmonyLinkLibStatic.lib @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b400a97666909a2c7c4dd063f65d5bdfe404dda51e31c9d37546e1961f97a3c3 +size 1355050 From 47008fcefe8e3999bb6e2b0508e02ff7da3d53b2 Mon Sep 17 00:00:00 2001 From: Jordon Brooks Date: Mon, 27 May 2024 19:43:19 +0100 Subject: [PATCH 20/30] Successful compile, untested --- Source/HarmonyLink/HarmonyLink.Build.cs | 31 +--------- .../Private/HarmonyLinkLibrary.cpp | 2 +- .../HarmonyLink/Private/Structs/CPUInfo.cpp | 5 -- Source/HarmonyLink/Public/Structs/CPUInfo.h | 4 -- .../HarmonyLinkLib/HarmonyLinkLib.Build.cs | 60 +++++++++++++++++++ .../bin/Linux/libHarmonyLinkLibShared.so | 3 + .../bin/Win64/HarmonyLinkLibShared.dll | 3 + .../ThirdParty/HarmonyLinkLib/include/Core.h | 12 +++- .../lib/Linux/libHarmonyLinkLibStatic.a | 4 +- .../lib/Win64/HarmonyLinkLibStatic.lib | 4 +- 10 files changed, 84 insertions(+), 44 deletions(-) create mode 100644 Source/ThirdParty/HarmonyLinkLib/HarmonyLinkLib.Build.cs create mode 100644 Source/ThirdParty/HarmonyLinkLib/bin/Linux/libHarmonyLinkLibShared.so create mode 100644 Source/ThirdParty/HarmonyLinkLib/bin/Win64/HarmonyLinkLibShared.dll diff --git a/Source/HarmonyLink/HarmonyLink.Build.cs b/Source/HarmonyLink/HarmonyLink.Build.cs index ce895e9..93cd557 100644 --- a/Source/HarmonyLink/HarmonyLink.Build.cs +++ b/Source/HarmonyLink/HarmonyLink.Build.cs @@ -21,7 +21,6 @@ public class HarmonyLink : ModuleRules PrivateIncludePaths.AddRange( new string[] { // ... add other private include paths required here ... - "ThirdParty/HarmonyLinkLib/include" } ); @@ -40,34 +39,10 @@ public class HarmonyLink : ModuleRules PrivateDependencyModuleNames.AddRange( new string[] { - // ... add private dependencies that you statically link with here ... + // ... add private dependencies that you statically link with here ... + "HarmonyLinkLib", } ); - - - DynamicallyLoadedModuleNames.AddRange( - new string[] - { - // ... add any modules that your module loads dynamically here ... - } - ); - - // Platform-specific settings for static libraries - if (Target.Platform == UnrealTargetPlatform.Win64) - { - PublicAdditionalLibraries.Add(Path.Combine(PluginDirectory, "Source/ThirdParty/HarmonyLinkLib/lib/Win64/HarmonyLinkLibStatic.lib")); - PublicDefinitions.Add("HARMONYLINKLIB_STATIC=1"); - } - else if (Target.Platform == UnrealTargetPlatform.Linux) - { - PublicAdditionalLibraries.Add(Path.Combine(PluginDirectory, "Source/ThirdParty/HarmonyLinkLib/lib/Linux/libHarmonyLinkLibStatic.a")); - PublicDefinitions.Add("HARMONYLINKLIB_STATIC=1"); - } - // I shall include this if anyone wishes to provide Mac binaries of HarmonyLink but these are not included by default as I don't own one. - else if (Target.Platform == UnrealTargetPlatform.Mac) - { - PublicAdditionalLibraries.Add(Path.Combine(PluginDirectory, "Source/ThirdParty/HarmonyLinkLib/lib/Mac/libHarmonyLinkLibStatic.a")); - PublicDefinitions.Add("HARMONYLINKLIB_STATIC=1"); - } + } } diff --git a/Source/HarmonyLink/Private/HarmonyLinkLibrary.cpp b/Source/HarmonyLink/Private/HarmonyLinkLibrary.cpp index ac55833..35314a3 100644 --- a/Source/HarmonyLink/Private/HarmonyLinkLibrary.cpp +++ b/Source/HarmonyLink/Private/HarmonyLinkLibrary.cpp @@ -2,7 +2,7 @@ #include "HarmonyLinkLibrary.h" -#include +#include "HarmonyLinkLib.h" bool UHarmonyLinkLibrary::IsWine() { diff --git a/Source/HarmonyLink/Private/Structs/CPUInfo.cpp b/Source/HarmonyLink/Private/Structs/CPUInfo.cpp index c13d94d..8b70135 100644 --- a/Source/HarmonyLink/Private/Structs/CPUInfo.cpp +++ b/Source/HarmonyLink/Private/Structs/CPUInfo.cpp @@ -11,11 +11,6 @@ FCPUInfo::FCPUInfo(HarmonyLinkLib::FCPUInfo* cpu_info) PhysicalCores = cpu_info->Physical_Cores; LogicalCores = cpu_info->Logical_Cores; - for (const HarmonyLinkLib::FString& Flag : cpu_info->Flags) - { - Flags.Add(Flag.c_str()); - } - cpu_info->free(); } else diff --git a/Source/HarmonyLink/Public/Structs/CPUInfo.h b/Source/HarmonyLink/Public/Structs/CPUInfo.h index e6cbd9d..80aad0e 100644 --- a/Source/HarmonyLink/Public/Structs/CPUInfo.h +++ b/Source/HarmonyLink/Public/Structs/CPUInfo.h @@ -33,10 +33,6 @@ struct FCPUInfo UPROPERTY(BlueprintReadWrite, EditAnywhere, Category="HarmonyLink") int32 LogicalCores = 0; - // A set of flags representing various features or capabilities of the CPU. - UPROPERTY(BlueprintReadWrite, EditAnywhere, Category="HarmonyLink") - TSet Flags; - // Constructor that initializes the struct with information from an external CPU info source. // @param cpu_info Pointer to an external FCPUInfo structure to copy data from. FCPUInfo(HarmonyLinkLib::FCPUInfo* cpu_info); diff --git a/Source/ThirdParty/HarmonyLinkLib/HarmonyLinkLib.Build.cs b/Source/ThirdParty/HarmonyLinkLib/HarmonyLinkLib.Build.cs new file mode 100644 index 0000000..0b54efa --- /dev/null +++ b/Source/ThirdParty/HarmonyLinkLib/HarmonyLinkLib.Build.cs @@ -0,0 +1,60 @@ +// Copyright (C) 2024 Jordon Brooks + +using UnrealBuildTool; +using System.IO; +using Internal; + +public class HarmonyLinkLib : ModuleRules +{ + public HarmonyLinkLib(ReadOnlyTargetRules Target) : base(Target) + { + Console.WriteLine("Building HarmonyLinkLib"); + PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs; + + Type = ModuleType.External; + + // Add the standard library + bUseRTTI = true; + bEnableExceptions = true; + + // Optionally, if you need C++17 features + CppStandard = CppStandardVersion.Cpp17; + + string includePath = Path.Combine(ModuleDirectory, "include"); + Console.WriteLine("Include Path: " + includePath); + PublicIncludePaths.Add(includePath); + + PublicDefinitions.Add("HARMONYLINKLIB_STATIC=1"); + + string platformString = Target.Platform.ToString(); + if (Target.Platform == UnrealTargetPlatform.Win64) + { + PublicDefinitions.Add("BUILD_WINDOWS=1"); + string dllPath = Path.Combine(ModuleDirectory, "lib", platformString, "HarmonyLinkLibStatic.lib"); + Console.WriteLine("DLL Path: " + dllPath); + PublicAdditionalLibraries.Add(dllPath); + //RuntimeDependencies.Add(dllPath); + } + else if (Target.Platform == UnrealTargetPlatform.Linux) + { + Console.WriteLine("Building Linux"); + PublicDefinitions.Add("BUILD_LINUX=1"); + string libPath = Path.Combine(ModuleDirectory, "bin", platformString, "libHarmonyLinkLibShared.so"); + Console.WriteLine("Library Path: " + libPath); + PublicAdditionalLibraries.Add(libPath); + + // Add the C++ standard library explicitly + //string toolchainLibPath = "E:/UnrealToolChains/v22_clang-16.0.6-centos7/x86_64-unknown-linux-gnu/lib"; + //PublicSystemLibraryPaths.Add(toolchainLibPath); + RuntimeDependencies.Add(libPath); + } + // I shall include this if anyone wishes to provide Mac binaries of HarmonyLink but these are not included by default as I don't own one. + else if (Target.Platform == UnrealTargetPlatform.Mac) + { + PublicDefinitions.Add("BUILD_MACOS=1"); + string dynlibPath = Path.Combine(ModuleDirectory, "lib", platformString, "libHarmonyLinkLibStatic.a"); + Console.WriteLine("Dynamic Library Path: " + dynlibPath); + RuntimeDependencies.Add(dynlibPath); + } + } +} diff --git a/Source/ThirdParty/HarmonyLinkLib/bin/Linux/libHarmonyLinkLibShared.so b/Source/ThirdParty/HarmonyLinkLib/bin/Linux/libHarmonyLinkLibShared.so new file mode 100644 index 0000000..81f0188 --- /dev/null +++ b/Source/ThirdParty/HarmonyLinkLib/bin/Linux/libHarmonyLinkLibShared.so @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7690f748eb883b77813eab76bb41e6264584c2c477ad19e0ce977378b11004a1 +size 252920 diff --git a/Source/ThirdParty/HarmonyLinkLib/bin/Win64/HarmonyLinkLibShared.dll b/Source/ThirdParty/HarmonyLinkLib/bin/Win64/HarmonyLinkLibShared.dll new file mode 100644 index 0000000..b32f33a --- /dev/null +++ b/Source/ThirdParty/HarmonyLinkLib/bin/Win64/HarmonyLinkLibShared.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:45855c66e1828d2b85fef34956a61dfeedc84619f073bfec6ae3484831f24ff6 +size 195072 diff --git a/Source/ThirdParty/HarmonyLinkLib/include/Core.h b/Source/ThirdParty/HarmonyLinkLib/include/Core.h index 94a32d2..90babed 100644 --- a/Source/ThirdParty/HarmonyLinkLib/include/Core.h +++ b/Source/ThirdParty/HarmonyLinkLib/include/Core.h @@ -15,7 +15,7 @@ #pragma once // Use a preprocessor definition to switch between export and import declarations -#ifdef _WIN32 +#ifdef BUILD_WINDOWS #ifdef HARMONYLINKLIB_STATIC #define HARMONYLINKLIB_API #else @@ -26,5 +26,13 @@ #endif #endif #else - #define HARMONYLINKLIB_API + #ifdef HARMONYLINKLIB_SHARED + #ifdef __clang__ + #define HARMONYLINKLIB_API __attribute__((visibility("default"))) + #else + #define HARMONYLINKLIB_API + #endif + #else + #define HARMONYLINKLIB_API + #endif #endif diff --git a/Source/ThirdParty/HarmonyLinkLib/lib/Linux/libHarmonyLinkLibStatic.a b/Source/ThirdParty/HarmonyLinkLib/lib/Linux/libHarmonyLinkLibStatic.a index a68f717..df06019 100644 --- a/Source/ThirdParty/HarmonyLinkLib/lib/Linux/libHarmonyLinkLibStatic.a +++ b/Source/ThirdParty/HarmonyLinkLib/lib/Linux/libHarmonyLinkLibStatic.a @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:662848d6802035c1d74a131316d676e256a65c1537644e787e39c0b3c58209df -size 398236 +oid sha256:7c624c33e6c41a2c58ffed44332622c9332e6e333ed07ac36f659bc242a58ea2 +size 394806 diff --git a/Source/ThirdParty/HarmonyLinkLib/lib/Win64/HarmonyLinkLibStatic.lib b/Source/ThirdParty/HarmonyLinkLib/lib/Win64/HarmonyLinkLibStatic.lib index d011ea4..7044fd0 100644 --- a/Source/ThirdParty/HarmonyLinkLib/lib/Win64/HarmonyLinkLibStatic.lib +++ b/Source/ThirdParty/HarmonyLinkLib/lib/Win64/HarmonyLinkLibStatic.lib @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b400a97666909a2c7c4dd063f65d5bdfe404dda51e31c9d37546e1961f97a3c3 -size 1355050 +oid sha256:855a36ab6ca665a654cc72b00edb0d59abfec1cf56bcef6b02a0408b82b42e0c +size 789710 From e5cca6b23faf7743d527234010aa060acf87b943 Mon Sep 17 00:00:00 2001 From: Jordon Brooks Date: Fri, 31 May 2024 23:46:36 +0100 Subject: [PATCH 21/30] Successfully compiled and working on Win32 + tested on steam deck --- HarmonyLink.uplugin | 4 +- Source/HarmonyLink/HarmonyLink.Build.cs | 5 +- .../Private/HarmonyLinkLibrary.cpp | 14 +- .../Private/Objects/HarmonyLinkGraphics.cpp | 324 ++++++++++++------ Source/HarmonyLink/Private/Structs/Device.cpp | 12 +- Source/HarmonyLink/Public/Enums/DeviceEnum.h | 2 +- Source/HarmonyLink/Public/Enums/Profile.h | 2 +- Source/HarmonyLink/Public/HarmonyLink.h | 2 +- .../HarmonyLink/Public/HarmonyLinkLibrary.h | 16 +- .../Public/Objects/HarmonyLinkGraphics.h | 32 +- Source/HarmonyLink/Public/Structs/Battery.h | 5 +- Source/HarmonyLink/Public/Structs/CPUInfo.h | 5 +- Source/HarmonyLink/Public/Structs/Device.h | 7 +- Source/HarmonyLink/Public/Structs/OSVerInfo.h | 3 +- .../HarmonyLinkLib/HarmonyLinkLib.Build.cs | 36 +- .../bin/Win64/HarmonyLinkLibShared.dll | 4 +- .../HarmonyLinkLib/include/HarmonyLinkLib.h | 16 +- .../lib/Linux/libHarmonyLinkLibStatic.a | 4 +- .../lib/Win64/HarmonyLinkLibStatic.lib | 4 +- 19 files changed, 311 insertions(+), 186 deletions(-) diff --git a/HarmonyLink.uplugin b/HarmonyLink.uplugin index b083076..637d348 100644 --- a/HarmonyLink.uplugin +++ b/HarmonyLink.uplugin @@ -10,7 +10,7 @@ "DocsURL": "https://github.com/Jordonbc/HarmonyLink", "MarketplaceURL": "com.epicgames.launcher://ue/marketplace/product/92fd511971274d1f955abb7197485041", "SupportURL": "", - "CanContainContent": true, + "CanContainContent": false, "IsBetaVersion": false, "IsExperimentalVersion": false, "Installed": false, @@ -18,7 +18,7 @@ { "Name": "HarmonyLink", "Type": "Runtime", - "LoadingPhase": "Default", + "LoadingPhase": "PreDefault", "WhitelistPlatforms": ["Win64", "Linux"] } ] diff --git a/Source/HarmonyLink/HarmonyLink.Build.cs b/Source/HarmonyLink/HarmonyLink.Build.cs index 93cd557..7199123 100644 --- a/Source/HarmonyLink/HarmonyLink.Build.cs +++ b/Source/HarmonyLink/HarmonyLink.Build.cs @@ -9,7 +9,7 @@ public class HarmonyLink : ModuleRules { PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs; - IWYUSupport = IWYUSupport.Full; + //IWYUSupport = IWYUSupport.Full; PublicIncludePaths.AddRange( new string[] { @@ -31,6 +31,8 @@ public class HarmonyLink : ModuleRules "Core", "CoreUObject", "Engine", + + "HarmonyLinkLib", // ... add other public dependencies that you statically link with here ... } ); @@ -40,7 +42,6 @@ public class HarmonyLink : ModuleRules new string[] { // ... add private dependencies that you statically link with here ... - "HarmonyLinkLib", } ); diff --git a/Source/HarmonyLink/Private/HarmonyLinkLibrary.cpp b/Source/HarmonyLink/Private/HarmonyLinkLibrary.cpp index 35314a3..5197354 100644 --- a/Source/HarmonyLink/Private/HarmonyLinkLibrary.cpp +++ b/Source/HarmonyLink/Private/HarmonyLinkLibrary.cpp @@ -1,9 +1,21 @@ // Copyright (C) 2024 Jordon Brooks #include "HarmonyLinkLibrary.h" +#include "HarmonyLink.h" #include "HarmonyLinkLib.h" +UHarmonyLinkLibrary::UHarmonyLinkLibrary() +{ + if (!HarmonyLinkLib::HL_Init()) + { + UE_LOG(LogHarmonyLink, Fatal, TEXT("Failed to initialise HarmonyLinkLib!")); + return; + } + + UE_LOG(LogHarmonyLink, Log, TEXT("HarmonyLinkLib Initialised!")); +} + bool UHarmonyLinkLibrary::IsWine() { return HarmonyLinkLib::get_is_wine(); @@ -16,7 +28,7 @@ bool UHarmonyLinkLibrary::IsLinux() bool UHarmonyLinkLibrary::IsSteamDeck() { - return GetDeviceInfo().Device == EDeviceEnum::STEAM_DECK; + return GetDeviceInfo().Device == EDevice::STEAM_DECK; } FCPUInfo UHarmonyLinkLibrary::GetCPUInfo() diff --git a/Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp b/Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp index 3f05b62..f1e17d6 100644 --- a/Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp +++ b/Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp @@ -6,10 +6,23 @@ #include "HarmonyLink.h" #include "HarmonyLinkLibrary.h" #include "GameFramework/GameUserSettings.h" +#include "Kismet/GameplayStatics.h" UHarmonyLinkGraphics* UHarmonyLinkGraphics::_INSTANCE = nullptr; int32 UHarmonyLinkGraphics::_TickRate = 1; FTimerHandle UHarmonyLinkGraphics::_TickTimerHandle = FTimerHandle(); +TSharedPtr UHarmonyLinkGraphics::_ConfigFile = nullptr; +bool UHarmonyLinkGraphics::_bAutomaticSwitch = false; +int32 UHarmonyLinkGraphics::_LastBatteryPercentage = 0; +EProfile UHarmonyLinkGraphics::_ActiveProfile = EProfile::NONE; +TMap UHarmonyLinkGraphics::_Profiles = TMap(); + +TMap UHarmonyLinkGraphics::_ProfileNames = +{ + {EProfile::BATTERY, "Battery"}, + {EProfile::CHARGING, "Charging"}, + {EProfile::DOCKED, "Docked"}, +}; /** * @brief Default graphics settings for different power states in HarmonyLink. @@ -25,115 +38,125 @@ FTimerHandle UHarmonyLinkGraphics::_TickTimerHandle = FTimerHandle(); */ TMap> UHarmonyLinkGraphics::_DefaultSettings = { { "Battery", { - { TEXT("r.ReflectionMethod"), FHLConfigValue(0) }, - { TEXT("r.DynamicGlobalIlluminationMethod"), FHLConfigValue(2) }, - { TEXT("r.Shadow.Virtual.Enable"), FHLConfigValue(0) }, - { TEXT("r.ScreenPercentage"), FHLConfigValue(50) }, +// { TEXT("r.ReflectionMethod"), FHLConfigValue(0) }, +// { TEXT("r.DynamicGlobalIlluminationMethod"), FHLConfigValue(2) }, +// { TEXT("r.Shadow.Virtual.Enable"), FHLConfigValue(0) }, +// { TEXT("r.ScreenPercentage"), FHLConfigValue(50) }, }}, { "Charging", { - { TEXT("r.ReflectionMethod"), FHLConfigValue(2) }, - { TEXT("r.DynamicGlobalIlluminationMethod"), FHLConfigValue(2) }, - { TEXT("r.Shadow.Virtual.Enable"), FHLConfigValue(1) }, - { TEXT("r.ScreenPercentage"), FHLConfigValue(100) }, +// { TEXT("r.ReflectionMethod"), FHLConfigValue(2) }, +// { TEXT("r.DynamicGlobalIlluminationMethod"), FHLConfigValue(2) }, +// { TEXT("r.Shadow.Virtual.Enable"), FHLConfigValue(1) }, +// { TEXT("r.ScreenPercentage"), FHLConfigValue(100) }, }}, { "Docked", { - { TEXT("r.ReflectionMethod"), FHLConfigValue(2) }, - { TEXT("r.DynamicGlobalIlluminationMethod"), FHLConfigValue(2) }, - { TEXT("r.Shadow.Virtual.Enable"), FHLConfigValue(1) }, - { TEXT("r.ScreenPercentage"), FHLConfigValue(100) }, +// { TEXT("r.ReflectionMethod"), FHLConfigValue(2) }, +// { TEXT("r.DynamicGlobalIlluminationMethod"), FHLConfigValue(2) }, +// { TEXT("r.Shadow.Virtual.Enable"), FHLConfigValue(1) }, +// { TEXT("r.ScreenPercentage"), FHLConfigValue(100) }, }} }; UHarmonyLinkGraphics::UHarmonyLinkGraphics() { UE_LOG(LogHarmonyLink, Warning, TEXT("HarmonyLinkGraphics initialized.")); + if (_INSTANCE != this) + { + if (_INSTANCE) + { + DestroySettings(); + } + + _INSTANCE = this; + } + + AddToRoot(); FWorldDelegates::OnPostWorldInitialization.AddUObject(this, &UHarmonyLinkGraphics::OnPostWorldInitialization); FWorldDelegates::OnPreWorldFinishDestroy.AddUObject(this, &UHarmonyLinkGraphics::OnWorldEnd); + + Init(); } UHarmonyLinkGraphics::~UHarmonyLinkGraphics() { + UE_LOG(LogHarmonyLink, Verbose, TEXT("~UHarmonyLinkGraphics called.")); FWorldDelegates::OnPostWorldInitialization.RemoveAll(this); } void UHarmonyLinkGraphics::LoadConfig(const bool bForceReload) { + UE_LOG(LogHarmonyLink, Verbose, TEXT("LoadConfig called.")); QUICK_SCOPE_CYCLE_COUNTER(HarmonyLinkGraphics_LoadSettings); // Load the settings into the map - if (!LoadSettingsFromConfig(false)) - { - if (!LoadSettingsFromConfig(true)) - { - CreateDefaultConfigFile(); - // Retry 2nd time - LoadSettingsFromConfig(true); - } - } + GetConfig(); DebugPrintProfiles(); } -bool UHarmonyLinkGraphics::LoadSettingsFromConfig(const bool bLoadDefaults) +bool UHarmonyLinkGraphics::LoadSettingsFromConfig(FConfigFile* ConfigFile) const { - // Load the configuration from the INI file - FConfigFile ConfigFile; + UE_LOG(LogHarmonyLink, Verbose, TEXT("LoadSettingsFromConfig called.")); + //const FString Filename = "HarmonyLink"; //GetConfigDirectoryFile(bLoadDefaults); + + // Load each profile section + bool bLoaded = true; - const FString Filename = GetConfigDirectoryFile(bLoadDefaults); + // Load the _bAutomaticSwitch variable + const FString SectionName = TEXT("HarmonyLink"); + const FString KeyName = TEXT("AutomaticProfileSwitch"); - if (!GConfig) + if (!ConfigFile->GetBool(*SectionName, *KeyName, _bAutomaticSwitch)) { - UE_LOG(LogHarmonyLink, Error, TEXT("Failed to access GConfig!")); - return false; + UE_LOG(LogHarmonyLink, Error, TEXT("Failed to load bAutomaticSwitch from config")); + bLoaded = false; + } + else + { + UE_LOG(LogHarmonyLink, Log, TEXT("Loaded bAutomaticSwitch: %s"), _bAutomaticSwitch ? TEXT("true") : TEXT("false")); } - if (GConfig->LoadLocalIniFile(ConfigFile, *Filename, false, nullptr, false)) + for (const TPair& Profile : _ProfileNames) { - // Load each profile section - bool bLoaded = true; - - // Load the _bAutomaticSwitch variable - const FString SectionName = TEXT("HarmonyLink"); - const FString KeyName = TEXT("AutomaticProfileSwitch"); - - if (!GConfig->GetBool(*SectionName, *KeyName, _bAutomaticSwitch, Filename)) + if (!LoadSection(ConfigFile, Profile)) { - UE_LOG(LogHarmonyLink, Error, TEXT("Failed to load bAutomaticSwitch from config")); + UE_LOG(LogHarmonyLink, Error, TEXT("Failed to load section: '%s'"), *Profile.Value.ToString()); bLoaded = false; } - else - { - UE_LOG(LogHarmonyLink, Log, TEXT("Loaded bAutomaticSwitch: %s"), _bAutomaticSwitch ? TEXT("true") : TEXT("false")); - } - - for (const TPair& Profile : _ProfileNames) - { - if (!LoadSection(ConfigFile, Profile)) - { - UE_LOG(LogHarmonyLink, Error, TEXT("Failed to load section: '%s'"), *Profile.Value.ToString()); - bLoaded = false; - } - } - - // Check if all profiles and settings were loaded successfully - if (bLoaded) - { - UE_LOG(LogHarmonyLink, Log, TEXT("Successfully loaded config file: %s"), *Filename); - return true; - } } - UE_LOG(LogHarmonyLink, Error, TEXT("Failed to load config file: %s"), *Filename); + // Check if all profiles and settings were loaded successfully + if (bLoaded) + { + UE_LOG(LogHarmonyLink, Log, TEXT("Successfully loaded config.")); + return true; + } + + UE_LOG(LogHarmonyLink, Error, TEXT("Failed to load config file.")); return false; } -bool UHarmonyLinkGraphics::LoadSection(const FConfigFile& ConfigFile, const TPair Profile) +bool UHarmonyLinkGraphics::LoadSection(FConfigFile* ConfigFile, const TPair Profile) { + UE_LOG(LogHarmonyLink, Verbose, TEXT("LoadSection called.")); + if (!ensureMsgf(ConfigFile, TEXT("ConfigFile is nullptr!"))) return false; + const FName& SectionName = Profile.Value; const EProfile ProfileKey = Profile.Key; - if (const FConfigSection* Section = ConfigFile.FindSection(*SectionName.ToString())) + const FConfigSection* Section = nullptr; + + +#if (ENGINE_MAJOR_VERSION >= 5) + Section = ConfigFile->FindSection(*SectionName.ToString()) +#elif (ENGINE_MAJOR_VERSION == 4) && (ENGINE_MINOR_VERSION >= 27) + Section = ConfigFile->FindOrAddSection(*SectionName.ToString()); +#else + #error "Unsupported Unreal Engine version" +#endif + + if (Section) { FSettingsProfile& SettingsProfile = _Profiles.FindOrAdd(ProfileKey); SettingsProfile.SectionName = SectionName; @@ -180,11 +203,13 @@ bool UHarmonyLinkGraphics::LoadSection(const FConfigFile& ConfigFile, const TPai void UHarmonyLinkGraphics::SaveConfig() const { + UE_LOG(LogHarmonyLink, Verbose, TEXT("SaveConfig called.")); Intermal_SaveConfig(false); } void UHarmonyLinkGraphics::SetSetting(const EProfile Profile, const FName Setting, const FHLConfigValue Value) { + UE_LOG(LogHarmonyLink, Verbose, TEXT("SetSetting called.")); // Ignore if HarmonyLinkSettings is disabled if (Profile == EProfile::NONE) { @@ -214,7 +239,7 @@ void UHarmonyLinkGraphics::SetSetting(const EProfile Profile, const FName Settin TypeString = TEXT("float"); break; case EConfigValueType::Bool: - ValueString = Value.GetValue() ? TEXT("true") : TEXT("false"); + ValueString = Value.GetValue() ? TEXT("True") : TEXT("False"); TypeString = TEXT("bool"); break; case EConfigValueType::String: @@ -240,6 +265,7 @@ void UHarmonyLinkGraphics::SetSetting(const EProfile Profile, const FName Settin UHarmonyLinkGraphics* UHarmonyLinkGraphics::GetSettings() { + UE_LOG(LogHarmonyLink, VeryVerbose, TEXT("GetSettings called.")); // Check if we already initialised if (_INSTANCE) { @@ -248,14 +274,13 @@ UHarmonyLinkGraphics* UHarmonyLinkGraphics::GetSettings() // Proceed to create a new singleton instance _INSTANCE = NewObject(); - _INSTANCE->AddToRoot(); - _INSTANCE->Init(); return _INSTANCE; } FSettingsProfile UHarmonyLinkGraphics::GetSettingProfile(const EProfile Profile) { + UE_LOG(LogHarmonyLink, Verbose, TEXT("GetSettingProfile called.")); // Ignore if HarmonyLinkSettings is disabled if (Profile == EProfile::NONE) { @@ -285,35 +310,48 @@ FSettingsProfile UHarmonyLinkGraphics::GetSettingProfile(const EProfile Profile) EProfile UHarmonyLinkGraphics::GetActiveProfile() const { + UE_LOG(LogHarmonyLink, Verbose, TEXT("GetActiveProfile called.")); return _ActiveProfile; } void UHarmonyLinkGraphics::SetAutomaticSwitching(const bool bAutomaticSwitch) { + UE_LOG(LogHarmonyLink, Verbose, TEXT("SetAutomaticSwitching called.")); _bAutomaticSwitch = bAutomaticSwitch; OnAutomaticSwitchChanged.Broadcast(_bAutomaticSwitch); } bool UHarmonyLinkGraphics::GetAutomaticSwitching() const { + UE_LOG(LogHarmonyLink, Verbose, TEXT("GetAutomaticSwitching called.")); return _bAutomaticSwitch; } void UHarmonyLinkGraphics::DestroySettings() { + UE_LOG(LogHarmonyLink, Log, TEXT("DestroySettings called.")); if (_INSTANCE) { UE_LOG(LogHarmonyLink, Log, TEXT("Destroying UHarmonyLinkGraphics.")) FWorldDelegates::OnPostWorldInitialization.RemoveAll(_INSTANCE); FWorldDelegates::OnPreWorldFinishDestroy.RemoveAll(_INSTANCE); _INSTANCE->RemoveFromRoot(); - _INSTANCE->MarkAsGarbage(); + +#if (ENGINE_MAJOR_VERSION >= 5) + _INSTANCE->MarkAsGarbage(); // For UE 5.0 and above +#elif (ENGINE_MAJOR_VERSION == 4) && (ENGINE_MINOR_VERSION >= 27) + _INSTANCE->MarkPendingKill(); // For UE 4.27 and above +#else +#error "Unsupported Unreal Engine version" +#endif + _INSTANCE = nullptr; } } void UHarmonyLinkGraphics::Init() { + UE_LOG(LogHarmonyLink, Log, TEXT("Init called.")); LoadConfig(); const FBattery BatteryStatus = UHarmonyLinkLibrary::GetBatteryStatus(); @@ -326,8 +364,9 @@ void UHarmonyLinkGraphics::Init() void UHarmonyLinkGraphics::Intermal_SaveConfig(const bool bDefaultConfig) const { + UE_LOG(LogHarmonyLink, Log, TEXT("Intermal_SaveConfig called.")); QUICK_SCOPE_CYCLE_COUNTER(HarmonyLinkGraphics_SaveConfig); - + const FString Filename = GetConfigDirectoryFile(bDefaultConfig); const FString SectionName = TEXT("HarmonyLink"); const FString KeyName = TEXT("AutomaticProfileSwitch"); @@ -343,57 +382,52 @@ void UHarmonyLinkGraphics::Intermal_SaveConfig(const bool bDefaultConfig) const } UE_LOG(LogHarmonyLink, Log, TEXT("Flushing file: '%s'"), *Filename); + GetConfig()->Dirty = true; + // You'd think that Write would actually write something but for some + // reason even if it outputs a success the file doesn't actually get created. + // For this reason, Flush seems to work for now. + //GetConfig()->Write(Filename); GConfig->Flush(true, Filename); } void UHarmonyLinkGraphics::Tick() { - Async(EAsyncExecution::Thread, [this]() + UE_LOG(LogHarmonyLink, VeryVerbose, TEXT("Tick called.")); + const FBattery BatteryStatus = UHarmonyLinkLibrary::GetBatteryStatus(); + + if (BatteryStatus.BatteryPercent != _LastBatteryPercentage) { - const FBattery BatteryStatus = UHarmonyLinkLibrary::GetBatteryStatus(); + // Ensure thread-safe broadcasting + OnBatteryLevelChanged.Broadcast(BatteryStatus.BatteryPercent); + } - if (BatteryStatus.BatteryPercent != _LastBatteryPercentage) - { - // Ensure thread-safe broadcasting - Async(EAsyncExecution::TaskGraphMainThread, [this, BatteryStatus]() - { - OnBatteryLevelChanged.Broadcast(BatteryStatus.BatteryPercent); - }); - } + if (!_bAutomaticSwitch) + { + return; + } - if (!_bAutomaticSwitch) + if (BatteryStatus.HasBattery) + { + if (BatteryStatus.IsACConnected) { - return; - } - - if (BatteryStatus.HasBattery) - { - if (BatteryStatus.IsACConnected) + if (_ActiveProfile != EProfile::CHARGING) { - if (_ActiveProfile != EProfile::CHARGING) - { - Async(EAsyncExecution::TaskGraphMainThread, [this]() - { - ApplyProfileInternal(EProfile::CHARGING); - }); - } - } - else - { - if (_ActiveProfile != EProfile::BATTERY) - { - Async(EAsyncExecution::TaskGraphMainThread, [this]() - { - ApplyProfileInternal(EProfile::BATTERY); - }); - } + ApplyProfileInternal(EProfile::CHARGING); } } - }); + else + { + if (_ActiveProfile != EProfile::BATTERY) + { + ApplyProfileInternal(EProfile::BATTERY); + } + } + } } -void UHarmonyLinkGraphics::CreateDefaultConfigFile() +void UHarmonyLinkGraphics::CreateDefaultConfigFile() const { + UE_LOG(LogHarmonyLink, Log, TEXT("CreateDefaultConfigFile called.")); UE_LOG(LogHarmonyLink, Log, TEXT("Creating default config file.")); LoadDefaults(); @@ -404,13 +438,17 @@ void UHarmonyLinkGraphics::CreateDefaultConfigFile() FString UHarmonyLinkGraphics::GetConfigDirectoryFile(const bool bDefaultFolder) { - FString ConfigFileName = bDefaultFolder? "DefaultHarmonyLink.ini" : "HarmonyLink.ini"; // Replace with your actual config file name + UE_LOG(LogHarmonyLink, Log, TEXT("GetConfigDirectoryFile called.")); + FString ConfigFileName = bDefaultFolder ? TEXT("DefaultHarmonyLink.ini") : TEXT("HarmonyLink.ini"); - return FPaths::Combine(bDefaultFolder ? FPaths::ProjectConfigDir() : FPaths::GeneratedConfigDir(), ConfigFileName); + FString ConfigDirectory = bDefaultFolder ? FPaths::ProjectConfigDir() : FPaths::Combine(FPaths::GeneratedConfigDir(), UGameplayStatics::GetPlatformName()); + + return FPaths::Combine(ConfigDirectory, ConfigFileName); } -void UHarmonyLinkGraphics::SaveSection(const FSettingsProfile& SettingsProfile, const bool bDefaultConfig, const bool bFlush) +void UHarmonyLinkGraphics::SaveSection(const FSettingsProfile& SettingsProfile, const bool bDefaultConfig, const bool bFlush) const { + UE_LOG(LogHarmonyLink, Log, TEXT("SaveSection called.")); if (GConfig) { const FString Filename = GetConfigDirectoryFile(bDefaultConfig); @@ -430,7 +468,7 @@ void UHarmonyLinkGraphics::SaveSection(const FSettingsProfile& SettingsProfile, TypeString = TEXT("float"); break; case EConfigValueType::Bool: - ValueString = Setting.Value.GetValue() ? TEXT("true") : TEXT("false"); + ValueString = Setting.Value.GetValue() ? TEXT("True") : TEXT("False"); TypeString = TEXT("bool"); break; case EConfigValueType::String: @@ -452,9 +490,9 @@ void UHarmonyLinkGraphics::SaveSection(const FSettingsProfile& SettingsProfile, } } -void UHarmonyLinkGraphics::LoadDefaults() +void UHarmonyLinkGraphics::LoadDefaults() const { - UE_LOG(LogHarmonyLink, Log, TEXT("LoadDefaults started.")); + UE_LOG(LogHarmonyLink, Log, TEXT("LoadDefaults called.")); _Profiles.Reset(); @@ -475,6 +513,7 @@ void UHarmonyLinkGraphics::LoadDefaults() bool UHarmonyLinkGraphics::ApplyProfileInternal(const EProfile Profile) { + UE_LOG(LogHarmonyLink, Log, TEXT("ApplyProfileInternal called.")); // If the profile is None, revert to the original user game settings if (Profile == EProfile::NONE) { @@ -536,6 +575,7 @@ bool UHarmonyLinkGraphics::ApplyProfileInternal(const EProfile Profile) void UHarmonyLinkGraphics::OnPostWorldInitialization(UWorld* World, UWorld::InitializationValues IVS) { + UE_LOG(LogHarmonyLink, Log, TEXT("OnPostWorldInitialization called.")); if (!World || !World->IsValidLowLevel()) { UE_LOG(LogHarmonyLink, Error, TEXT("Failed to Hook into World Initialisation!")) @@ -544,7 +584,7 @@ void UHarmonyLinkGraphics::OnPostWorldInitialization(UWorld* World, UWorld::Init if (World->IsGameWorld()) { - if (_INSTANCE) + if (IsValid(_INSTANCE)) { FTimerManager* TimerManager = &World->GetTimerManager(); if (!TimerManager) @@ -553,11 +593,12 @@ void UHarmonyLinkGraphics::OnPostWorldInitialization(UWorld* World, UWorld::Init return; } - if (!TimerManager->TimerExists(_INSTANCE->_TickTimerHandle) || !TimerManager->IsTimerActive(_INSTANCE->_TickTimerHandle)) + if (!TimerManager->TimerExists(_TickTimerHandle) || !TimerManager->IsTimerActive(_TickTimerHandle)) { - World->GetTimerManager().SetTimer(_INSTANCE->_TickTimerHandle, [&, TimerManager] + + World->GetTimerManager().SetTimer(_TickTimerHandle, [TimerManager] { - if (!this) + if (!_INSTANCE) { UE_LOG(LogHarmonyLink, Error, TEXT("'This' is destroyed, Clearing timer.")) if (TimerManager) @@ -566,16 +607,29 @@ void UHarmonyLinkGraphics::OnPostWorldInitialization(UWorld* World, UWorld::Init } return; } - Tick(); + _INSTANCE->Tick(); }, _TickRate, true); } + else + { + UE_LOG(LogHarmonyLink, Error, TEXT("Error: Timer already exists.")); + } } + else + { + UE_LOG(LogHarmonyLink, Error, TEXT("'This' is nullptr!")); + } + } + else + { + //UE_LOG(LogHarmonyLink, Error, TEXT("Failed to bring up tick!")); } } void UHarmonyLinkGraphics::OnWorldEnd(UWorld* World) { - if (!World || !World->IsValidLowLevel()) + UE_LOG(LogHarmonyLink, Log, TEXT("OnWorldEnd(UWorld* World) called.")); + if (!World) { UE_LOG(LogHarmonyLink, Error, TEXT("World Already destroyed")) return; @@ -592,6 +646,7 @@ void UHarmonyLinkGraphics::OnWorldEnd(UWorld* World) bool UHarmonyLinkGraphics::ApplyProfile(const EProfile Profile, const bool bDisableAutomaticSwitch) { + UE_LOG(LogHarmonyLink, Log, TEXT("Applying Profile.")); // Manual profile change, turn off automatic switching if (bDisableAutomaticSwitch) { @@ -603,6 +658,7 @@ bool UHarmonyLinkGraphics::ApplyProfile(const EProfile Profile, const bool bDisa void UHarmonyLinkGraphics::ApplySetting(const TPair& Setting) { + UE_LOG(LogHarmonyLink, Log, TEXT("Applying settings.")); // Apply the setting based on the key (CVar) IConsoleManager& ConsoleManager = IConsoleManager::Get(); IConsoleVariable* CVar = ConsoleManager.FindConsoleVariable(*Setting.Key.ToString()); @@ -646,6 +702,45 @@ void UHarmonyLinkGraphics::DebugPrintProfiles() const UE_LOG(LogHarmonyLink, Log, TEXT("DebugPrintProfiles completed.")); } +FConfigFile* UHarmonyLinkGraphics::GetConfig() const +{ + UE_LOG(LogHarmonyLink, Verbose, TEXT("GetConfig Called.")); + if (_ConfigFile) + { + return _ConfigFile.Get(); + } + + FConfigFile* ConfigFile = GConfig->Find(GetConfigDirectoryFile(false), false); + + if (!ConfigFile) + { + UE_LOG(LogHarmonyLink, Warning, TEXT("Config file not found, attempting to read DefaultHarmonyLink.ini.")); + // Look in ProjectFolder->Config->DefaultHarmonyLink.ini + ConfigFile = GConfig->Find(GetConfigDirectoryFile(true), true); + } + + /*if (!ConfigFile) + { + CreateDefaultConfigFile(); + ConfigFile = GConfig->Find(GetConfigDirectoryFile(true), true); + }*/ + + if (ConfigFile) + { + UE_LOG(LogHarmonyLink, Verbose, TEXT("Setting up config.")); + ConfigFile->Name = "HarmonyLink"; + LoadSettingsFromConfig(ConfigFile); + _ConfigFile = MakeShareable(ConfigFile); + } + else + { + UE_LOG(LogHarmonyLink, Error, TEXT("Failed to make config variable!")) + return nullptr; + } + + return _ConfigFile.Get(); +} + void UHarmonyLinkGraphics::PrintDebugSection(FSettingsProfile& SettingsProfile) { UE_LOG(LogHarmonyLink, Warning, TEXT("[%s]"), *SettingsProfile.SectionName.ToString()); @@ -681,6 +776,7 @@ void UHarmonyLinkGraphics::PrintDebugSection(FSettingsProfile& SettingsProfile) void UHarmonyLinkGraphics::ResetInstance() { + UE_LOG(LogHarmonyLink, Log, TEXT("Resetting instance.")); _INSTANCE->DestroySettings(); GetSettings(); } diff --git a/Source/HarmonyLink/Private/Structs/Device.cpp b/Source/HarmonyLink/Private/Structs/Device.cpp index a52de5f..794e914 100644 --- a/Source/HarmonyLink/Private/Structs/Device.cpp +++ b/Source/HarmonyLink/Private/Structs/Device.cpp @@ -19,20 +19,20 @@ FDevice::FDevice(HarmonyLinkLib::FDevice* oldDevice) } } -EDeviceEnum FDevice::Convert(HarmonyLinkLib::EDevice Device) +EDevice FDevice::Convert(HarmonyLinkLib::EDevice Device) { switch (Device) { case HarmonyLinkLib::EDevice::DESKTOP: - return EDeviceEnum::DESKTOP; + return EDevice::DESKTOP; case HarmonyLinkLib::EDevice::LAPTOP: - return EDeviceEnum::LAPTOP; + return EDevice::LAPTOP; case HarmonyLinkLib::EDevice::HANDHELD: - return EDeviceEnum::HANDHELD; + return EDevice::HANDHELD; case HarmonyLinkLib::EDevice::STEAM_DECK: - return EDeviceEnum::STEAM_DECK; + return EDevice::STEAM_DECK; default: - return EDeviceEnum::DESKTOP; + return EDevice::DESKTOP; } } diff --git a/Source/HarmonyLink/Public/Enums/DeviceEnum.h b/Source/HarmonyLink/Public/Enums/DeviceEnum.h index 64320c8..fb7bb44 100644 --- a/Source/HarmonyLink/Public/Enums/DeviceEnum.h +++ b/Source/HarmonyLink/Public/Enums/DeviceEnum.h @@ -9,7 +9,7 @@ * Enum representing different operating system platforms. */ UENUM(BlueprintType) -enum class EDeviceEnum : uint8 +enum class EDevice : uint8 { DESKTOP UMETA(DisplayName = "Desktop"), LAPTOP UMETA(DisplayName = "Laptop"), diff --git a/Source/HarmonyLink/Public/Enums/Profile.h b/Source/HarmonyLink/Public/Enums/Profile.h index 6985b45..16c48cd 100644 --- a/Source/HarmonyLink/Public/Enums/Profile.h +++ b/Source/HarmonyLink/Public/Enums/Profile.h @@ -11,7 +11,7 @@ UENUM(BlueprintType) enum class EProfile : uint8 { - NONE UMETA(DisplayName = "NONE"), + NONE = 0 UMETA(DisplayName = "NONE"), BATTERY UMETA(DisplayName = "BATTERY"), CHARGING UMETA(DisplayName = "CHARGING"), DOCKED UMETA(DisplayName = "DOCKED"), diff --git a/Source/HarmonyLink/Public/HarmonyLink.h b/Source/HarmonyLink/Public/HarmonyLink.h index 6cb8597..b59a8ba 100644 --- a/Source/HarmonyLink/Public/HarmonyLink.h +++ b/Source/HarmonyLink/Public/HarmonyLink.h @@ -4,7 +4,7 @@ #include "Modules/ModuleManager.h" -DECLARE_LOG_CATEGORY_EXTERN(LogHarmonyLink, Log, All); +DECLARE_LOG_CATEGORY_EXTERN(LogHarmonyLink, All, All); class FHarmonyLinkModule : public IModuleInterface { diff --git a/Source/HarmonyLink/Public/HarmonyLinkLibrary.h b/Source/HarmonyLink/Public/HarmonyLinkLibrary.h index 4a809e2..19dc5ff 100644 --- a/Source/HarmonyLink/Public/HarmonyLinkLibrary.h +++ b/Source/HarmonyLink/Public/HarmonyLinkLibrary.h @@ -21,31 +21,33 @@ class HARMONYLINK_API UHarmonyLinkLibrary : public UBlueprintFunctionLibrary GENERATED_BODY() public: + UHarmonyLinkLibrary(); + // Checks if the game is running under Wine. - UFUNCTION(BlueprintCallable, Category="HarmonyLink") + UFUNCTION(BlueprintCallable, BlueprintPure, Category="HarmonyLink") static bool IsWine(); // Checks if the operating system is Linux. - UFUNCTION(BlueprintCallable, Category="HarmonyLink") + UFUNCTION(BlueprintCallable, BlueprintPure, Category="HarmonyLink") static bool IsLinux(); // Checks if the game is running on a Steam Deck. - UFUNCTION(BlueprintCallable, Category="HarmonyLink") + UFUNCTION(BlueprintCallable, BlueprintPure, Category="HarmonyLink") static bool IsSteamDeck(); // Retrieves information about the CPU of the current device. - UFUNCTION(BlueprintCallable, Category="HarmonyLink") + UFUNCTION(BlueprintCallable, BlueprintPure, Category="HarmonyLink") static FCPUInfo GetCPUInfo(); // Retrieves information about the current device. - UFUNCTION(BlueprintCallable, Category="HarmonyLink") + UFUNCTION(BlueprintCallable, BlueprintPure, Category="HarmonyLink") static FDevice GetDeviceInfo(); // Retrieves information about the operating system of the current device. - UFUNCTION(BlueprintCallable, Category="HarmonyLink") + UFUNCTION(BlueprintCallable, BlueprintPure, Category="HarmonyLink") static FOSVerInfo GetOSInfo(); // Retrieves the current battery status of the device. - UFUNCTION(BlueprintCallable, Category="HarmonyLink") + UFUNCTION(BlueprintCallable, BlueprintPure, Category="HarmonyLink") static FBattery GetBatteryStatus(); }; diff --git a/Source/HarmonyLink/Public/Objects/HarmonyLinkGraphics.h b/Source/HarmonyLink/Public/Objects/HarmonyLinkGraphics.h index 3b0836e..80d2475 100644 --- a/Source/HarmonyLink/Public/Objects/HarmonyLinkGraphics.h +++ b/Source/HarmonyLink/Public/Objects/HarmonyLinkGraphics.h @@ -120,7 +120,7 @@ public: * - Calls the `Init` function on the new instance to perform any necessary initialization. * - Returns the singleton instance. */ - UFUNCTION(BlueprintCallable, Category="HarmonyLink Settings") + UFUNCTION(BlueprintCallable, BlueprintPure, Category="HarmonyLink Settings") static UHarmonyLinkGraphics* GetSettings(); /** @@ -141,7 +141,7 @@ public: * * @note Uses UE_LOG for logging errors. */ - UFUNCTION(BlueprintCallable, BlueprintPure, Category="HarmonyLink Settings") + UFUNCTION(BlueprintCallable, BlueprintPure, BlueprintPure, Category="HarmonyLink Settings") FSettingsProfile GetSettingProfile(const EProfile Profile); /** @@ -245,7 +245,7 @@ private: * * @note Uses UE_LOG for logging the creation process. */ - void CreateDefaultConfigFile(); + void CreateDefaultConfigFile() const; /** * @brief Retrieves the path to the configuration file. @@ -278,7 +278,7 @@ private: * * @note Uses UE_LOG for logging errors and success messages. */ - bool LoadSettingsFromConfig(const bool bLoadDefaults); + bool LoadSettingsFromConfig(FConfigFile* ConfigFile) const; /** * @brief Loads a specific section from the configuration file into a settings profile. @@ -298,7 +298,7 @@ private: * * @note The function handles settings of types int, float, bool, and string. */ - bool LoadSection(const FConfigFile& ConfigFile, const TPair Profile); + static bool LoadSection(FConfigFile* ConfigFile, const TPair Profile); /** @@ -322,7 +322,7 @@ private: * * @note Uses UE_LOG for logging the save and flush operations. */ - static void SaveSection(const FSettingsProfile& SettingsProfile, const bool bDefaultConfig, const bool bFlush = false); + void SaveSection(const FSettingsProfile& SettingsProfile, const bool bDefaultConfig, const bool bFlush = false) const; /** * @brief Loads the default settings into the profiles. @@ -340,7 +340,7 @@ private: * * @note Uses UE_LOG for logging the start of the default settings loading process. */ - void LoadDefaults(); + void LoadDefaults() const; /** * @brief Applies the specified graphics profile internally. @@ -451,6 +451,8 @@ private: */ void DebugPrintProfiles() const; + FConfigFile* GetConfig() const; + /** * @brief Prints debug information for a specific settings profile. * @@ -468,10 +470,10 @@ private: static void PrintDebugSection(FSettingsProfile& SettingsProfile); // Indicates whether automatic profile switching is enabled. - bool _bAutomaticSwitch = false; + static bool _bAutomaticSwitch; // Stores the last recorded battery percentage. - int32 _LastBatteryPercentage = 0; + static int32 _LastBatteryPercentage; // The rate at which to query HarmonyLinkLib for hardware info. static int32 _TickRate; @@ -480,17 +482,15 @@ private: static FTimerHandle _TickTimerHandle; // The currently active profile. - EProfile _ActiveProfile = EProfile::NONE; + static EProfile _ActiveProfile; // Maps profile enums to their corresponding names. - TMap _ProfileNames = { - {EProfile::BATTERY, "Battery"}, - {EProfile::CHARGING, "Charging"}, - {EProfile::DOCKED, "Docked"}, - }; + static TMap _ProfileNames; // Stores the settings profiles. - TMap _Profiles; + static TMap _Profiles; + + static TSharedPtr _ConfigFile; // The default settings for profiles. static TMap> _DefaultSettings; diff --git a/Source/HarmonyLink/Public/Structs/Battery.h b/Source/HarmonyLink/Public/Structs/Battery.h index 6b8ec43..bd2793b 100644 --- a/Source/HarmonyLink/Public/Structs/Battery.h +++ b/Source/HarmonyLink/Public/Structs/Battery.h @@ -1,9 +1,10 @@ // Copyright (C) 2024 Jordon Brooks #pragma once -#include - #include "CoreMinimal.h" + +#include "Structs/FBattery.h" + #include "Battery.generated.h" /* diff --git a/Source/HarmonyLink/Public/Structs/CPUInfo.h b/Source/HarmonyLink/Public/Structs/CPUInfo.h index 80aad0e..353c3e5 100644 --- a/Source/HarmonyLink/Public/Structs/CPUInfo.h +++ b/Source/HarmonyLink/Public/Structs/CPUInfo.h @@ -2,9 +2,10 @@ #pragma once -#include - #include "CoreMinimal.h" + +#include "Structs/FCPUInfo.h" + #include "CPUInfo.generated.h" /* diff --git a/Source/HarmonyLink/Public/Structs/Device.h b/Source/HarmonyLink/Public/Structs/Device.h index 071d13c..fd009bd 100644 --- a/Source/HarmonyLink/Public/Structs/Device.h +++ b/Source/HarmonyLink/Public/Structs/Device.h @@ -5,7 +5,8 @@ #include "CoreMinimal.h" #include "Enums/DeviceEnum.h" #include "Enums/Platform.h" -#include + +#include "Structs/FDevice.h" #include "Device.generated.h" @@ -25,7 +26,7 @@ struct FDevice // The type of the device. UPROPERTY(BlueprintReadWrite, EditAnywhere, Category="HarmonyLink") - EDeviceEnum Device = EDeviceEnum::DESKTOP; + EDevice Device = EDevice::DESKTOP; // Constructor that initializes the struct with information from an external source. // @param oldDevice Pointer to an external FDevice structure to copy data from. @@ -35,7 +36,7 @@ private: // Converts an external device enum to the internal EDeviceEnum type. // @param Device External device enum to convert. // @returns Converted EDeviceEnum value. - static EDeviceEnum Convert(HarmonyLinkLib::EDevice Device); + static EDevice Convert(HarmonyLinkLib::EDevice Device); // Converts an external platform enum to the internal EPlatform type. // @param Platform External platform enum to convert. diff --git a/Source/HarmonyLink/Public/Structs/OSVerInfo.h b/Source/HarmonyLink/Public/Structs/OSVerInfo.h index ea380c8..e423cc0 100644 --- a/Source/HarmonyLink/Public/Structs/OSVerInfo.h +++ b/Source/HarmonyLink/Public/Structs/OSVerInfo.h @@ -2,7 +2,8 @@ #pragma once #include "CoreMinimal.h" -#include + +#include "Structs/FOSVerInfo.h" #include "OSVerInfo.generated.h" diff --git a/Source/ThirdParty/HarmonyLinkLib/HarmonyLinkLib.Build.cs b/Source/ThirdParty/HarmonyLinkLib/HarmonyLinkLib.Build.cs index 0b54efa..0dc8bbd 100644 --- a/Source/ThirdParty/HarmonyLinkLib/HarmonyLinkLib.Build.cs +++ b/Source/ThirdParty/HarmonyLinkLib/HarmonyLinkLib.Build.cs @@ -8,39 +8,46 @@ public class HarmonyLinkLib : ModuleRules { public HarmonyLinkLib(ReadOnlyTargetRules Target) : base(Target) { - Console.WriteLine("Building HarmonyLinkLib"); + //Console.WriteLine("Building HarmonyLinkLib"); PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs; Type = ModuleType.External; // Add the standard library - bUseRTTI = true; - bEnableExceptions = true; + //bUseRTTI = true; + //bEnableExceptions = true; // Optionally, if you need C++17 features - CppStandard = CppStandardVersion.Cpp17; + //CppStandard = CppStandardVersion.Cpp17; string includePath = Path.Combine(ModuleDirectory, "include"); - Console.WriteLine("Include Path: " + includePath); + //Console.WriteLine("Include Path: " + includePath); PublicIncludePaths.Add(includePath); - - PublicDefinitions.Add("HARMONYLINKLIB_STATIC=1"); string platformString = Target.Platform.ToString(); if (Target.Platform == UnrealTargetPlatform.Win64) { + PublicDefinitions.Add("HARMONYLINKLIB_STATIC=1"); PublicDefinitions.Add("BUILD_WINDOWS=1"); - string dllPath = Path.Combine(ModuleDirectory, "lib", platformString, "HarmonyLinkLibStatic.lib"); - Console.WriteLine("DLL Path: " + dllPath); - PublicAdditionalLibraries.Add(dllPath); - //RuntimeDependencies.Add(dllPath); + string libpath = Path.Combine(ModuleDirectory, "lib", platformString, "HarmonyLinkLibStatic.lib"); + + PublicAdditionalLibraries.Add(libpath); + + //string dllPath = Path.Combine(ModuleDirectory, "bin", platformString, "HarmonyLinkLibShared.dll"); + //string dllTargetPath = "$(TargetOutputDir)/HarmonyLinkLibShared.dll"; + + //Console.WriteLine("DLL Path: " + dllPath); + //RuntimeDependencies.Add(dllTargetPath, dllPath); + + //PublicDelayLoadDLLs.Add("HarmonyLinkLibShared.dll"); } else if (Target.Platform == UnrealTargetPlatform.Linux) { - Console.WriteLine("Building Linux"); + PublicDefinitions.Add("HARMONYLINKLIB_SHARED=1"); + //Console.WriteLine("Building Linux"); PublicDefinitions.Add("BUILD_LINUX=1"); string libPath = Path.Combine(ModuleDirectory, "bin", platformString, "libHarmonyLinkLibShared.so"); - Console.WriteLine("Library Path: " + libPath); + //Console.WriteLine("Library Path: " + libPath); PublicAdditionalLibraries.Add(libPath); // Add the C++ standard library explicitly @@ -51,9 +58,10 @@ public class HarmonyLinkLib : ModuleRules // I shall include this if anyone wishes to provide Mac binaries of HarmonyLink but these are not included by default as I don't own one. else if (Target.Platform == UnrealTargetPlatform.Mac) { + PublicDefinitions.Add("HARMONYLINKLIB_SHARED=1"); PublicDefinitions.Add("BUILD_MACOS=1"); string dynlibPath = Path.Combine(ModuleDirectory, "lib", platformString, "libHarmonyLinkLibStatic.a"); - Console.WriteLine("Dynamic Library Path: " + dynlibPath); + //Console.WriteLine("Dynamic Library Path: " + dynlibPath); RuntimeDependencies.Add(dynlibPath); } } diff --git a/Source/ThirdParty/HarmonyLinkLib/bin/Win64/HarmonyLinkLibShared.dll b/Source/ThirdParty/HarmonyLinkLib/bin/Win64/HarmonyLinkLibShared.dll index b32f33a..a98cee4 100644 --- a/Source/ThirdParty/HarmonyLinkLib/bin/Win64/HarmonyLinkLibShared.dll +++ b/Source/ThirdParty/HarmonyLinkLib/bin/Win64/HarmonyLinkLibShared.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:45855c66e1828d2b85fef34956a61dfeedc84619f073bfec6ae3484831f24ff6 -size 195072 +oid sha256:db0796fdd07c54a25cf0b1d77015f8c7af7b7a73ded92c123521dcc9a01e9b40 +size 731136 diff --git a/Source/ThirdParty/HarmonyLinkLib/include/HarmonyLinkLib.h b/Source/ThirdParty/HarmonyLinkLib/include/HarmonyLinkLib.h index d6575a5..0298e2d 100644 --- a/Source/ThirdParty/HarmonyLinkLib/include/HarmonyLinkLib.h +++ b/Source/ThirdParty/HarmonyLinkLib/include/HarmonyLinkLib.h @@ -44,17 +44,19 @@ class IPlatformUtilities; namespace HarmonyLinkLib { - extern "C" HARMONYLINKLIB_API bool get_is_wine(); + HARMONYLINKLIB_API bool HL_Init(); - extern "C" HARMONYLINKLIB_API bool get_is_linux(); + HARMONYLINKLIB_API bool get_is_wine(); - extern "C" HARMONYLINKLIB_API bool get_is_docked(); + HARMONYLINKLIB_API bool get_is_linux(); - extern "C" HARMONYLINKLIB_API FCPUInfo* get_cpu_info(); + HARMONYLINKLIB_API bool get_is_docked(); - extern "C" HARMONYLINKLIB_API FDevice* get_device_info(); + HARMONYLINKLIB_API FCPUInfo* get_cpu_info(); - extern "C" HARMONYLINKLIB_API FOSVerInfo* get_os_version(); + HARMONYLINKLIB_API FDevice* get_device_info(); + + HARMONYLINKLIB_API FOSVerInfo* get_os_version(); - extern "C" HARMONYLINKLIB_API FBattery* get_battery_status(); + HARMONYLINKLIB_API FBattery* get_battery_status(); } diff --git a/Source/ThirdParty/HarmonyLinkLib/lib/Linux/libHarmonyLinkLibStatic.a b/Source/ThirdParty/HarmonyLinkLib/lib/Linux/libHarmonyLinkLibStatic.a index df06019..a68f717 100644 --- a/Source/ThirdParty/HarmonyLinkLib/lib/Linux/libHarmonyLinkLibStatic.a +++ b/Source/ThirdParty/HarmonyLinkLib/lib/Linux/libHarmonyLinkLibStatic.a @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7c624c33e6c41a2c58ffed44332622c9332e6e333ed07ac36f659bc242a58ea2 -size 394806 +oid sha256:662848d6802035c1d74a131316d676e256a65c1537644e787e39c0b3c58209df +size 398236 diff --git a/Source/ThirdParty/HarmonyLinkLib/lib/Win64/HarmonyLinkLibStatic.lib b/Source/ThirdParty/HarmonyLinkLib/lib/Win64/HarmonyLinkLibStatic.lib index 7044fd0..0d13dd8 100644 --- a/Source/ThirdParty/HarmonyLinkLib/lib/Win64/HarmonyLinkLibStatic.lib +++ b/Source/ThirdParty/HarmonyLinkLib/lib/Win64/HarmonyLinkLibStatic.lib @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:855a36ab6ca665a654cc72b00edb0d59abfec1cf56bcef6b02a0408b82b42e0c -size 789710 +oid sha256:9808e911e50ebb5d2ba8d9cc83254e99a1d26e9740a86bd78a5ceff7f868f06e +size 1346206 From 6ba25c1b0d2c1cbe16426c35e0d9541e24ebe705 Mon Sep 17 00:00:00 2001 From: Jordon Brooks Date: Thu, 6 Jun 2024 21:11:12 +0100 Subject: [PATCH 22/30] Native Linux compile working and works on steam deck --- .../Private/HarmonyLinkLibrary.cpp | 70 +++++++++++++++---- .../Private/Objects/HarmonyLinkGraphics.cpp | 30 ++++++-- .../HarmonyLink/Public/HarmonyLinkLibrary.h | 28 ++++++-- .../Public/Objects/HarmonyLinkGraphics.h | 8 +-- .../HarmonyLinkLib/HarmonyLinkLib.Build.cs | 42 ++++++----- .../bin/Linux/libHarmonyLinkLibShared.so | 4 +- .../Linux/libHarmonyLinkLibStatic_clang++.a | 3 + .../lib/Win64/HarmonyLinkLibStatic.lib | 4 +- 8 files changed, 137 insertions(+), 52 deletions(-) create mode 100644 Source/ThirdParty/HarmonyLinkLib/lib/Linux/libHarmonyLinkLibStatic_clang++.a diff --git a/Source/HarmonyLink/Private/HarmonyLinkLibrary.cpp b/Source/HarmonyLink/Private/HarmonyLinkLibrary.cpp index 5197354..a9a0f25 100644 --- a/Source/HarmonyLink/Private/HarmonyLinkLibrary.cpp +++ b/Source/HarmonyLink/Private/HarmonyLinkLibrary.cpp @@ -5,6 +5,21 @@ #include "HarmonyLinkLib.h" +bool UHarmonyLinkLibrary::bIsWineCached = false; +bool UHarmonyLinkLibrary::bIsLinuxCached = false; +bool UHarmonyLinkLibrary::bIsSteamDeckCached = false; +bool UHarmonyLinkLibrary::bCPUInfoCached = false; +bool UHarmonyLinkLibrary::bDeviceInfoCached = false; +bool UHarmonyLinkLibrary::bOSInfoCached = false; + +bool UHarmonyLinkLibrary::bIsWine = false; +bool UHarmonyLinkLibrary::bIsLinux = false; +bool UHarmonyLinkLibrary::bIsSteamDeck = false; + +FCPUInfo UHarmonyLinkLibrary::CachedCPUInfo = FCPUInfo(); +FDevice UHarmonyLinkLibrary::CachedDeviceInfo = FDevice(); +FOSVerInfo UHarmonyLinkLibrary::CachedOSInfo = FOSVerInfo(); + UHarmonyLinkLibrary::UHarmonyLinkLibrary() { if (!HarmonyLinkLib::HL_Init()) @@ -16,34 +31,65 @@ UHarmonyLinkLibrary::UHarmonyLinkLibrary() UE_LOG(LogHarmonyLink, Log, TEXT("HarmonyLinkLib Initialised!")); } -bool UHarmonyLinkLibrary::IsWine() +bool UHarmonyLinkLibrary::IsWine(bool bForce) { - return HarmonyLinkLib::get_is_wine(); + if (!bIsWineCached || bForce) + { + bIsWine = HarmonyLinkLib::get_is_wine(); + bIsWineCached = true; + } + return bIsWine; } -bool UHarmonyLinkLibrary::IsLinux() +bool UHarmonyLinkLibrary::IsLinux(bool bForce) { - return HarmonyLinkLib::get_is_linux(); + if (!bIsLinuxCached || bForce) + { + bIsLinux = HarmonyLinkLib::get_is_linux(); + bIsLinuxCached = true; + } + return bIsLinux; } -bool UHarmonyLinkLibrary::IsSteamDeck() +bool UHarmonyLinkLibrary::IsSteamDeck(bool bForce) { - return GetDeviceInfo().Device == EDevice::STEAM_DECK; + if (!bIsSteamDeckCached || bForce) + { + bIsSteamDeck = GetDeviceInfo().Device == EDevice::STEAM_DECK; + bIsSteamDeckCached = true; + } + return bIsSteamDeck; } -FCPUInfo UHarmonyLinkLibrary::GetCPUInfo() +FCPUInfo UHarmonyLinkLibrary::GetCPUInfo(bool bForce) { - return FCPUInfo(HarmonyLinkLib::get_cpu_info()); + if (!bCPUInfoCached || bForce) + { + CachedCPUInfo = FCPUInfo(HarmonyLinkLib::get_cpu_info()); + bCPUInfoCached = true; + } + + return CachedCPUInfo; } -FDevice UHarmonyLinkLibrary::GetDeviceInfo() +FDevice UHarmonyLinkLibrary::GetDeviceInfo(bool bForce) { - return FDevice(HarmonyLinkLib::get_device_info()); + if (!bDeviceInfoCached || bForce) + { + CachedDeviceInfo = FDevice(HarmonyLinkLib::get_device_info()); + bDeviceInfoCached = true; + } + return CachedDeviceInfo; } -FOSVerInfo UHarmonyLinkLibrary::GetOSInfo() +FOSVerInfo UHarmonyLinkLibrary::GetOSInfo(bool bForce) { - return FOSVerInfo(HarmonyLinkLib::get_os_version()); + if (!bOSInfoCached || bForce) + { + CachedOSInfo = FOSVerInfo(HarmonyLinkLib::get_os_version()); + bOSInfoCached = true; + } + return CachedOSInfo; } FBattery UHarmonyLinkLibrary::GetBatteryStatus() diff --git a/Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp b/Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp index f1e17d6..d22efd4 100644 --- a/Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp +++ b/Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp @@ -7,6 +7,7 @@ #include "HarmonyLinkLibrary.h" #include "GameFramework/GameUserSettings.h" #include "Kismet/GameplayStatics.h" +#include "HarmonyLinkLib.h" UHarmonyLinkGraphics* UHarmonyLinkGraphics::_INSTANCE = nullptr; int32 UHarmonyLinkGraphics::_TickRate = 1; @@ -72,8 +73,8 @@ UHarmonyLinkGraphics::UHarmonyLinkGraphics() AddToRoot(); - FWorldDelegates::OnPostWorldInitialization.AddUObject(this, &UHarmonyLinkGraphics::OnPostWorldInitialization); - FWorldDelegates::OnPreWorldFinishDestroy.AddUObject(this, &UHarmonyLinkGraphics::OnWorldEnd); + FWorldDelegates::OnPostWorldInitialization.AddStatic(&UHarmonyLinkGraphics::OnPostWorldInitialization); + FWorldDelegates::OnPreWorldFinishDestroy.AddStatic(&UHarmonyLinkGraphics::OnWorldEnd); Init(); } @@ -82,6 +83,7 @@ UHarmonyLinkGraphics::~UHarmonyLinkGraphics() { UE_LOG(LogHarmonyLink, Verbose, TEXT("~UHarmonyLinkGraphics called.")); FWorldDelegates::OnPostWorldInitialization.RemoveAll(this); + FWorldDelegates::OnPreWorldFinishDestroy.RemoveAll(this); } void UHarmonyLinkGraphics::LoadConfig(const bool bForceReload) @@ -352,13 +354,27 @@ void UHarmonyLinkGraphics::DestroySettings() void UHarmonyLinkGraphics::Init() { UE_LOG(LogHarmonyLink, Log, TEXT("Init called.")); + + if (!HarmonyLinkLib::HL_Init()) + { + UE_LOG(LogHarmonyLink, Fatal, TEXT("Failed to initialise HarmonyLinkLib!")); + return; + } + LoadConfig(); const FBattery BatteryStatus = UHarmonyLinkLibrary::GetBatteryStatus(); - + if (BatteryStatus.HasBattery) { - ApplyProfileInternal(EProfile::BATTERY); + if (BatteryStatus.IsACConnected) + { + ApplyProfileInternal(EProfile::BATTERY); + } + else + { + ApplyProfileInternal(EProfile::CHARGING); + } } } @@ -584,7 +600,7 @@ void UHarmonyLinkGraphics::OnPostWorldInitialization(UWorld* World, UWorld::Init if (World->IsGameWorld()) { - if (IsValid(_INSTANCE)) + if (IsValid(GetSettings())) { FTimerManager* TimerManager = &World->GetTimerManager(); if (!TimerManager) @@ -598,7 +614,7 @@ void UHarmonyLinkGraphics::OnPostWorldInitialization(UWorld* World, UWorld::Init World->GetTimerManager().SetTimer(_TickTimerHandle, [TimerManager] { - if (!_INSTANCE) + if (!GetSettings()) { UE_LOG(LogHarmonyLink, Error, TEXT("'This' is destroyed, Clearing timer.")) if (TimerManager) @@ -607,7 +623,7 @@ void UHarmonyLinkGraphics::OnPostWorldInitialization(UWorld* World, UWorld::Init } return; } - _INSTANCE->Tick(); + GetSettings()->Tick(); }, _TickRate, true); } else diff --git a/Source/HarmonyLink/Public/HarmonyLinkLibrary.h b/Source/HarmonyLink/Public/HarmonyLinkLibrary.h index 19dc5ff..926b6c8 100644 --- a/Source/HarmonyLink/Public/HarmonyLinkLibrary.h +++ b/Source/HarmonyLink/Public/HarmonyLinkLibrary.h @@ -25,29 +25,45 @@ public: // Checks if the game is running under Wine. UFUNCTION(BlueprintCallable, BlueprintPure, Category="HarmonyLink") - static bool IsWine(); + static bool IsWine(bool bForce = false); // Checks if the operating system is Linux. UFUNCTION(BlueprintCallable, BlueprintPure, Category="HarmonyLink") - static bool IsLinux(); + static bool IsLinux(bool bForce = false); // Checks if the game is running on a Steam Deck. UFUNCTION(BlueprintCallable, BlueprintPure, Category="HarmonyLink") - static bool IsSteamDeck(); + static bool IsSteamDeck(bool bForce = false); // Retrieves information about the CPU of the current device. UFUNCTION(BlueprintCallable, BlueprintPure, Category="HarmonyLink") - static FCPUInfo GetCPUInfo(); + static FCPUInfo GetCPUInfo(bool bForce = false); // Retrieves information about the current device. UFUNCTION(BlueprintCallable, BlueprintPure, Category="HarmonyLink") - static FDevice GetDeviceInfo(); + static FDevice GetDeviceInfo(bool bForce = false); // Retrieves information about the operating system of the current device. UFUNCTION(BlueprintCallable, BlueprintPure, Category="HarmonyLink") - static FOSVerInfo GetOSInfo(); + static FOSVerInfo GetOSInfo(bool bForce = false); // Retrieves the current battery status of the device. UFUNCTION(BlueprintCallable, BlueprintPure, Category="HarmonyLink") static FBattery GetBatteryStatus(); + +private: + static bool bIsWineCached; + static bool bIsWine; + static bool bIsLinuxCached; + static bool bIsLinux; + static bool bIsSteamDeckCached; + static bool bIsSteamDeck; + + static bool bCPUInfoCached; + static bool bDeviceInfoCached; + static bool bOSInfoCached; + + static FCPUInfo CachedCPUInfo; + static FDevice CachedDeviceInfo; + static FOSVerInfo CachedOSInfo; }; diff --git a/Source/HarmonyLink/Public/Objects/HarmonyLinkGraphics.h b/Source/HarmonyLink/Public/Objects/HarmonyLinkGraphics.h index 80d2475..0147020 100644 --- a/Source/HarmonyLink/Public/Objects/HarmonyLinkGraphics.h +++ b/Source/HarmonyLink/Public/Objects/HarmonyLinkGraphics.h @@ -6,7 +6,7 @@ #include "Enums/Profile.h" #include "Structs/SettingsProfile.h" -#include "UObject/Object.h" +#include "Kismet/BlueprintFunctionLibrary.h" #include "HarmonyLinkGraphics.generated.h" DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnProfileChanged, EProfile, Profile); @@ -17,7 +17,7 @@ DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnBatteryLevelChanged, int32, Batte * */ UCLASS(Blueprintable, config="HarmonyLink") -class HARMONYLINK_API UHarmonyLinkGraphics : public UObject +class HARMONYLINK_API UHarmonyLinkGraphics : public UBlueprintFunctionLibrary { GENERATED_BODY() @@ -390,7 +390,7 @@ private: * * @note Uses UE_LOG for logging errors and informational messages. */ - void OnPostWorldInitialization(UWorld* World, UWorld::InitializationValues IVS); + static void OnPostWorldInitialization(UWorld* World, UWorld::InitializationValues IVS); /** * @brief Handles actions to be performed when the world ends. @@ -406,7 +406,7 @@ private: * * @note Uses UE_LOG for logging errors and informational messages. */ - void OnWorldEnd(UWorld* World); + static void OnWorldEnd(UWorld* World); /** * @brief Resets the singleton instance of the UHarmonyLinkGraphics settings. diff --git a/Source/ThirdParty/HarmonyLinkLib/HarmonyLinkLib.Build.cs b/Source/ThirdParty/HarmonyLinkLib/HarmonyLinkLib.Build.cs index 0dc8bbd..2ce9175 100644 --- a/Source/ThirdParty/HarmonyLinkLib/HarmonyLinkLib.Build.cs +++ b/Source/ThirdParty/HarmonyLinkLib/HarmonyLinkLib.Build.cs @@ -43,26 +43,30 @@ public class HarmonyLinkLib : ModuleRules } else if (Target.Platform == UnrealTargetPlatform.Linux) { - PublicDefinitions.Add("HARMONYLINKLIB_SHARED=1"); + PublicDefinitions.Add("HARMONYLINKLIB_STATIC=1"); //Console.WriteLine("Building Linux"); PublicDefinitions.Add("BUILD_LINUX=1"); - string libPath = Path.Combine(ModuleDirectory, "bin", platformString, "libHarmonyLinkLibShared.so"); - //Console.WriteLine("Library Path: " + libPath); - PublicAdditionalLibraries.Add(libPath); - - // Add the C++ standard library explicitly - //string toolchainLibPath = "E:/UnrealToolChains/v22_clang-16.0.6-centos7/x86_64-unknown-linux-gnu/lib"; - //PublicSystemLibraryPaths.Add(toolchainLibPath); - RuntimeDependencies.Add(libPath); - } - // I shall include this if anyone wishes to provide Mac binaries of HarmonyLink but these are not included by default as I don't own one. - else if (Target.Platform == UnrealTargetPlatform.Mac) - { - PublicDefinitions.Add("HARMONYLINKLIB_SHARED=1"); - PublicDefinitions.Add("BUILD_MACOS=1"); - string dynlibPath = Path.Combine(ModuleDirectory, "lib", platformString, "libHarmonyLinkLibStatic.a"); - //Console.WriteLine("Dynamic Library Path: " + dynlibPath); - RuntimeDependencies.Add(dynlibPath); - } + string dllPath = Path.Combine(ModuleDirectory, "lib", platformString, "libHarmonyLinkLibStatic_clang++.a"); + //string dllTargetPath = "$(TargetOutputDir)/libHarmonyLinkLibShared.so"; + //Console.WriteLine("Library Path: " + libPath); + PublicAdditionalLibraries.Add(dllPath); + + // Ensure the proper linking of standard C++ libraries + //PublicSystemLibraries.Add("stdc++"); + //PublicSystemLibraries.Add("c++abi"); + //PublicSystemLibraries.Add("m"); // Math library + //PublicSystemLibraries.Add("pthread"); // POSIX threads library + + // Add the C++ standard library explicitly if needed + PublicSystemLibraries.Add("c++"); + + // Ensure linking with libc and other necessary libraries + //PublicSystemLibraries.Add("dl"); // Dynamic linking loader + //PublicSystemLibraries.Add("rt"); // Real-time library + + // Add any other libraries that might be needed + //PublicSystemLibraries.Add("gcc_s"); // GCC support library + //PublicSystemLibraries.Add("gcc"); // GCC compiler support library + } } } diff --git a/Source/ThirdParty/HarmonyLinkLib/bin/Linux/libHarmonyLinkLibShared.so b/Source/ThirdParty/HarmonyLinkLib/bin/Linux/libHarmonyLinkLibShared.so index 81f0188..7f4480a 100644 --- a/Source/ThirdParty/HarmonyLinkLib/bin/Linux/libHarmonyLinkLibShared.so +++ b/Source/ThirdParty/HarmonyLinkLib/bin/Linux/libHarmonyLinkLibShared.so @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7690f748eb883b77813eab76bb41e6264584c2c477ad19e0ce977378b11004a1 -size 252920 +oid sha256:f4a3966f9c7018d84e684baf61183d07758e13633decea1bd84daa44cf2b8ca1 +size 813728 diff --git a/Source/ThirdParty/HarmonyLinkLib/lib/Linux/libHarmonyLinkLibStatic_clang++.a b/Source/ThirdParty/HarmonyLinkLib/lib/Linux/libHarmonyLinkLibStatic_clang++.a new file mode 100644 index 0000000..27b9163 --- /dev/null +++ b/Source/ThirdParty/HarmonyLinkLib/lib/Linux/libHarmonyLinkLibStatic_clang++.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6977100139b596b50b1b46bb91fb1979b43c3fc991ddcf5b6f4e4f4de1c992db +size 1775982 diff --git a/Source/ThirdParty/HarmonyLinkLib/lib/Win64/HarmonyLinkLibStatic.lib b/Source/ThirdParty/HarmonyLinkLib/lib/Win64/HarmonyLinkLibStatic.lib index 0d13dd8..b820888 100644 --- a/Source/ThirdParty/HarmonyLinkLib/lib/Win64/HarmonyLinkLibStatic.lib +++ b/Source/ThirdParty/HarmonyLinkLib/lib/Win64/HarmonyLinkLibStatic.lib @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9808e911e50ebb5d2ba8d9cc83254e99a1d26e9740a86bd78a5ceff7f868f06e -size 1346206 +oid sha256:ef8d92a66b36b8899e5fc2fe2e51e0753d11e7b161790013ee3c9a5c804fefa7 +size 1425358 From a2d4452691809c73b123341e55734f247b526eef Mon Sep 17 00:00:00 2001 From: Jordon Brooks Date: Sun, 7 Jul 2024 19:22:41 +0100 Subject: [PATCH 23/30] Fixed world delegates --- .../Private/Objects/HarmonyLinkGraphics.cpp | 43 ++++++++++--------- .../Public/Objects/HarmonyLinkGraphics.h | 1 - 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp b/Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp index d22efd4..068f7b2 100644 --- a/Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp +++ b/Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp @@ -58,27 +58,6 @@ TMap> UHarmonyLinkGraphics::_DefaultSettings }} }; -UHarmonyLinkGraphics::UHarmonyLinkGraphics() -{ - UE_LOG(LogHarmonyLink, Warning, TEXT("HarmonyLinkGraphics initialized.")); - if (_INSTANCE != this) - { - if (_INSTANCE) - { - DestroySettings(); - } - - _INSTANCE = this; - } - - AddToRoot(); - - FWorldDelegates::OnPostWorldInitialization.AddStatic(&UHarmonyLinkGraphics::OnPostWorldInitialization); - FWorldDelegates::OnPreWorldFinishDestroy.AddStatic(&UHarmonyLinkGraphics::OnWorldEnd); - - Init(); -} - UHarmonyLinkGraphics::~UHarmonyLinkGraphics() { UE_LOG(LogHarmonyLink, Verbose, TEXT("~UHarmonyLinkGraphics called.")); @@ -276,6 +255,7 @@ UHarmonyLinkGraphics* UHarmonyLinkGraphics::GetSettings() // Proceed to create a new singleton instance _INSTANCE = NewObject(); + _INSTANCE->Init(); return _INSTANCE; } @@ -353,6 +333,22 @@ void UHarmonyLinkGraphics::DestroySettings() void UHarmonyLinkGraphics::Init() { + UE_LOG(LogHarmonyLink, Warning, TEXT("HarmonyLinkGraphics initialized.")); + if (_INSTANCE != this) + { + if (_INSTANCE) + { + DestroySettings(); + } + + _INSTANCE = this; + } + + AddToRoot(); + + FWorldDelegates::OnPostWorldInitialization.AddStatic(&UHarmonyLinkGraphics::OnPostWorldInitialization); + FWorldDelegates::OnPreWorldFinishDestroy.AddStatic(&UHarmonyLinkGraphics::OnWorldEnd); + UE_LOG(LogHarmonyLink, Log, TEXT("Init called.")); if (!HarmonyLinkLib::HL_Init()) @@ -650,6 +646,11 @@ void UHarmonyLinkGraphics::OnWorldEnd(UWorld* World) UE_LOG(LogHarmonyLink, Error, TEXT("World Already destroyed")) return; } + + if (!World->IsGameWorld()) + { + return; + } if(World->GetTimerManager().TimerExists(_TickTimerHandle)) { diff --git a/Source/HarmonyLink/Public/Objects/HarmonyLinkGraphics.h b/Source/HarmonyLink/Public/Objects/HarmonyLinkGraphics.h index 0147020..d6e3418 100644 --- a/Source/HarmonyLink/Public/Objects/HarmonyLinkGraphics.h +++ b/Source/HarmonyLink/Public/Objects/HarmonyLinkGraphics.h @@ -22,7 +22,6 @@ class HARMONYLINK_API UHarmonyLinkGraphics : public UBlueprintFunctionLibrary GENERATED_BODY() public: - UHarmonyLinkGraphics(); virtual ~UHarmonyLinkGraphics() override; UPROPERTY(BlueprintAssignable) From 8ba9caeb27bc8048682e08c113612ef349f22bf9 Mon Sep 17 00:00:00 2001 From: Jordon Brooks Date: Sun, 7 Jul 2024 19:27:17 +0100 Subject: [PATCH 24/30] Discard return from GetConfig --- Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp b/Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp index 068f7b2..d3f0fa6 100644 --- a/Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp +++ b/Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp @@ -71,7 +71,7 @@ void UHarmonyLinkGraphics::LoadConfig(const bool bForceReload) QUICK_SCOPE_CYCLE_COUNTER(HarmonyLinkGraphics_LoadSettings); // Load the settings into the map - GetConfig(); + FConfigFile* _ = GetConfig(); DebugPrintProfiles(); } From 9a5194dc3a82f9ca7822d1b65452605aab53afde Mon Sep 17 00:00:00 2001 From: Jordon Brooks Date: Mon, 8 Jul 2024 00:32:52 +0100 Subject: [PATCH 25/30] Rename plugin to HarmonyLinkUE --- HarmonyLink.uplugin => HarmonyLinkUE.uplugin | 16 +- Source/HarmonyLink/Private/HarmonyLink.cpp | 24 --- .../HarmonyLinkSettings.Build.cs | 28 ++++ .../Private/HarmonyLinkSettings.cpp | 22 +++ .../Private/Objects/HarmonyLinkGraphics.cpp | 141 +++++++++--------- .../Private/Structs/HLConfigValue.cpp | 0 .../Public/Enums/Profile.h | 0 .../Public/HarmonyLinkSettings.h | 13 ++ .../Public/Objects/HarmonyLinkGraphics.h | 4 +- .../Public/Structs/HLConfigValue.h | 0 .../Public/Structs/SettingsProfile.h | 0 .../HarmonyLinkUE.Build.cs} | 4 +- .../Private/HarmonyLinkLibrary.cpp | 13 +- .../HarmonyLinkUE/Private/HarmonyLinkUE.cpp | 22 +++ .../Private/Structs/Battery.cpp | 0 .../Private/Structs/CPUInfo.cpp | 0 .../Private/Structs/Device.cpp | 0 .../Private/Structs/OSVerInfo.cpp | 0 .../Public/Enums/DeviceEnum.h | 0 .../Public/Enums/Platform.h | 0 .../Public/HarmonyLinkLibrary.h | 8 +- .../Public/HarmonyLinkUE.h} | 2 +- .../Public/Structs/Battery.h | 0 .../Public/Structs/CPUInfo.h | 0 .../Public/Structs/Device.h | 0 .../Public/Structs/OSVerInfo.h | 0 26 files changed, 190 insertions(+), 107 deletions(-) rename HarmonyLink.uplugin => HarmonyLinkUE.uplugin (77%) delete mode 100644 Source/HarmonyLink/Private/HarmonyLink.cpp create mode 100644 Source/HarmonyLinkSettings/HarmonyLinkSettings.Build.cs create mode 100644 Source/HarmonyLinkSettings/Private/HarmonyLinkSettings.cpp rename Source/{HarmonyLink => HarmonyLinkSettings}/Private/Objects/HarmonyLinkGraphics.cpp (75%) rename Source/{HarmonyLink => HarmonyLinkSettings}/Private/Structs/HLConfigValue.cpp (100%) rename Source/{HarmonyLink => HarmonyLinkSettings}/Public/Enums/Profile.h (100%) create mode 100644 Source/HarmonyLinkSettings/Public/HarmonyLinkSettings.h rename Source/{HarmonyLink => HarmonyLinkSettings}/Public/Objects/HarmonyLinkGraphics.h (99%) rename Source/{HarmonyLink => HarmonyLinkSettings}/Public/Structs/HLConfigValue.h (100%) rename Source/{HarmonyLink => HarmonyLinkSettings}/Public/Structs/SettingsProfile.h (100%) rename Source/{HarmonyLink/HarmonyLink.Build.cs => HarmonyLinkUE/HarmonyLinkUE.Build.cs} (89%) rename Source/{HarmonyLink => HarmonyLinkUE}/Private/HarmonyLinkLibrary.cpp (91%) create mode 100644 Source/HarmonyLinkUE/Private/HarmonyLinkUE.cpp rename Source/{HarmonyLink => HarmonyLinkUE}/Private/Structs/Battery.cpp (100%) rename Source/{HarmonyLink => HarmonyLinkUE}/Private/Structs/CPUInfo.cpp (100%) rename Source/{HarmonyLink => HarmonyLinkUE}/Private/Structs/Device.cpp (100%) rename Source/{HarmonyLink => HarmonyLinkUE}/Private/Structs/OSVerInfo.cpp (100%) rename Source/{HarmonyLink => HarmonyLinkUE}/Public/Enums/DeviceEnum.h (100%) rename Source/{HarmonyLink => HarmonyLinkUE}/Public/Enums/Platform.h (100%) rename Source/{HarmonyLink => HarmonyLinkUE}/Public/HarmonyLinkLibrary.h (89%) rename Source/{HarmonyLink/Public/HarmonyLink.h => HarmonyLinkUE/Public/HarmonyLinkUE.h} (83%) rename Source/{HarmonyLink => HarmonyLinkUE}/Public/Structs/Battery.h (100%) rename Source/{HarmonyLink => HarmonyLinkUE}/Public/Structs/CPUInfo.h (100%) rename Source/{HarmonyLink => HarmonyLinkUE}/Public/Structs/Device.h (100%) rename Source/{HarmonyLink => HarmonyLinkUE}/Public/Structs/OSVerInfo.h (100%) diff --git a/HarmonyLink.uplugin b/HarmonyLinkUE.uplugin similarity index 77% rename from HarmonyLink.uplugin rename to HarmonyLinkUE.uplugin index 637d348..8b1b3fe 100644 --- a/HarmonyLink.uplugin +++ b/HarmonyLinkUE.uplugin @@ -2,7 +2,7 @@ "FileVersion": 3, "Version": 1, "VersionName": "1.0", - "FriendlyName": "HarmonyLink", + "FriendlyName": "HarmonyLinkUE", "Description": "Revolutionize handheld gaming with adaptive game settings. Optimize graphics and gameplay experience based on real-time system metrics. Open-source project empowering developers to enhance games on portable devices", "Category": "Handheld", "CreatedBy": "Jordon Brooks", @@ -16,10 +16,18 @@ "Installed": false, "Modules": [ { - "Name": "HarmonyLink", + "Name": "HarmonyLinkUE", "Type": "Runtime", "LoadingPhase": "PreDefault", - "WhitelistPlatforms": ["Win64", "Linux"] + "WhitelistPlatforms": [ + "Win64", + "Linux" + ] + }, + { + "Name": "HarmonyLinkSettings", + "Type": "Runtime", + "LoadingPhase": "Default" } ] -} +} \ No newline at end of file diff --git a/Source/HarmonyLink/Private/HarmonyLink.cpp b/Source/HarmonyLink/Private/HarmonyLink.cpp deleted file mode 100644 index 167806e..0000000 --- a/Source/HarmonyLink/Private/HarmonyLink.cpp +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (C) 2024 Jordon Brooks - -#include "HarmonyLink.h" -#include "Modules/ModuleManager.h" -#include "Objects/HarmonyLinkGraphics.h" - -#define LOCTEXT_NAMESPACE "FHarmonyLinkModule" - -DEFINE_LOG_CATEGORY(LogHarmonyLink); - -void FHarmonyLinkModule::StartupModule() -{ - -} - -void FHarmonyLinkModule::ShutdownModule() -{ - // Ensure we safely destroy our singleton instance - UHarmonyLinkGraphics::DestroySettings(); -} - -#undef LOCTEXT_NAMESPACE - -IMPLEMENT_MODULE(FHarmonyLinkModule, HarmonyLink) diff --git a/Source/HarmonyLinkSettings/HarmonyLinkSettings.Build.cs b/Source/HarmonyLinkSettings/HarmonyLinkSettings.Build.cs new file mode 100644 index 0000000..69f4fa3 --- /dev/null +++ b/Source/HarmonyLinkSettings/HarmonyLinkSettings.Build.cs @@ -0,0 +1,28 @@ +using UnrealBuildTool; + +public class HarmonyLinkSettings : ModuleRules +{ + public HarmonyLinkSettings(ReadOnlyTargetRules Target) : base(Target) + { + PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs; + + PublicDependencyModuleNames.AddRange( + new string[] + { + "Core", + } + ); + + PrivateDependencyModuleNames.AddRange( + new string[] + { + "CoreUObject", + "Engine", + "Slate", + "SlateCore", + + "HarmonyLinkUE" + } + ); + } +} diff --git a/Source/HarmonyLinkSettings/Private/HarmonyLinkSettings.cpp b/Source/HarmonyLinkSettings/Private/HarmonyLinkSettings.cpp new file mode 100644 index 0000000..b2ea795 --- /dev/null +++ b/Source/HarmonyLinkSettings/Private/HarmonyLinkSettings.cpp @@ -0,0 +1,22 @@ +#include "HarmonyLinkSettings.h" + +#include "Objects/HarmonyLinkGraphics.h" + +#define LOCTEXT_NAMESPACE "FHarmonyLinkSettingsModule" + +DEFINE_LOG_CATEGORY(LogHarmonyLinkSettings); + +void FHarmonyLinkSettingsModule::StartupModule() +{ + +} + +void FHarmonyLinkSettingsModule::ShutdownModule() +{ + // Ensure we safely destroy our singleton instance + UHarmonyLinkGraphics::DestroySettings(); +} + +#undef LOCTEXT_NAMESPACE + +IMPLEMENT_MODULE(FHarmonyLinkSettingsModule, HarmonyLinkSettings) diff --git a/Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp b/Source/HarmonyLinkSettings/Private/Objects/HarmonyLinkGraphics.cpp similarity index 75% rename from Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp rename to Source/HarmonyLinkSettings/Private/Objects/HarmonyLinkGraphics.cpp index d3f0fa6..1405b51 100644 --- a/Source/HarmonyLink/Private/Objects/HarmonyLinkGraphics.cpp +++ b/Source/HarmonyLinkSettings/Private/Objects/HarmonyLinkGraphics.cpp @@ -3,11 +3,10 @@ #include "Objects/HarmonyLinkGraphics.h" #include "ComponentRecreateRenderStateContext.h" -#include "HarmonyLink.h" +#include "HarmonyLinkSettings.h" #include "HarmonyLinkLibrary.h" #include "GameFramework/GameUserSettings.h" #include "Kismet/GameplayStatics.h" -#include "HarmonyLinkLib.h" UHarmonyLinkGraphics* UHarmonyLinkGraphics::_INSTANCE = nullptr; int32 UHarmonyLinkGraphics::_TickRate = 1; @@ -60,14 +59,14 @@ TMap> UHarmonyLinkGraphics::_DefaultSettings UHarmonyLinkGraphics::~UHarmonyLinkGraphics() { - UE_LOG(LogHarmonyLink, Verbose, TEXT("~UHarmonyLinkGraphics called.")); + UE_LOG(LogHarmonyLinkSettings, Verbose, TEXT("~UHarmonyLinkGraphics called.")); FWorldDelegates::OnPostWorldInitialization.RemoveAll(this); FWorldDelegates::OnPreWorldFinishDestroy.RemoveAll(this); } void UHarmonyLinkGraphics::LoadConfig(const bool bForceReload) { - UE_LOG(LogHarmonyLink, Verbose, TEXT("LoadConfig called.")); + UE_LOG(LogHarmonyLinkSettings, Verbose, TEXT("LoadConfig called.")); QUICK_SCOPE_CYCLE_COUNTER(HarmonyLinkGraphics_LoadSettings); // Load the settings into the map @@ -78,7 +77,7 @@ void UHarmonyLinkGraphics::LoadConfig(const bool bForceReload) bool UHarmonyLinkGraphics::LoadSettingsFromConfig(FConfigFile* ConfigFile) const { - UE_LOG(LogHarmonyLink, Verbose, TEXT("LoadSettingsFromConfig called.")); + UE_LOG(LogHarmonyLinkSettings, Verbose, TEXT("LoadSettingsFromConfig called.")); //const FString Filename = "HarmonyLink"; //GetConfigDirectoryFile(bLoadDefaults); // Load each profile section @@ -90,19 +89,19 @@ bool UHarmonyLinkGraphics::LoadSettingsFromConfig(FConfigFile* ConfigFile) const if (!ConfigFile->GetBool(*SectionName, *KeyName, _bAutomaticSwitch)) { - UE_LOG(LogHarmonyLink, Error, TEXT("Failed to load bAutomaticSwitch from config")); + UE_LOG(LogHarmonyLinkSettings, Error, TEXT("Failed to load bAutomaticSwitch from config")); bLoaded = false; } else { - UE_LOG(LogHarmonyLink, Log, TEXT("Loaded bAutomaticSwitch: %s"), _bAutomaticSwitch ? TEXT("true") : TEXT("false")); + UE_LOG(LogHarmonyLinkSettings, Log, TEXT("Loaded bAutomaticSwitch: %s"), _bAutomaticSwitch ? TEXT("true") : TEXT("false")); } for (const TPair& Profile : _ProfileNames) { if (!LoadSection(ConfigFile, Profile)) { - UE_LOG(LogHarmonyLink, Error, TEXT("Failed to load section: '%s'"), *Profile.Value.ToString()); + UE_LOG(LogHarmonyLinkSettings, Error, TEXT("Failed to load section: '%s'"), *Profile.Value.ToString()); bLoaded = false; } } @@ -110,17 +109,17 @@ bool UHarmonyLinkGraphics::LoadSettingsFromConfig(FConfigFile* ConfigFile) const // Check if all profiles and settings were loaded successfully if (bLoaded) { - UE_LOG(LogHarmonyLink, Log, TEXT("Successfully loaded config.")); + UE_LOG(LogHarmonyLinkSettings, Log, TEXT("Successfully loaded config.")); return true; } - UE_LOG(LogHarmonyLink, Error, TEXT("Failed to load config file.")); + UE_LOG(LogHarmonyLinkSettings, Error, TEXT("Failed to load config file.")); return false; } bool UHarmonyLinkGraphics::LoadSection(FConfigFile* ConfigFile, const TPair Profile) { - UE_LOG(LogHarmonyLink, Verbose, TEXT("LoadSection called.")); + UE_LOG(LogHarmonyLinkSettings, Verbose, TEXT("LoadSection called.")); if (!ensureMsgf(ConfigFile, TEXT("ConfigFile is nullptr!"))) return false; const FName& SectionName = Profile.Value; @@ -184,13 +183,13 @@ bool UHarmonyLinkGraphics::LoadSection(FConfigFile* ConfigFile, const TPairToString()); + UE_LOG(LogHarmonyLinkSettings, Log, TEXT("Applying '%s': Value='%s', Type='%s' to profile '%s'."), *Setting.ToString(), *TypeString, *ValueString, *ProfileName->ToString()); // Find the settings associated with the profile FSettingsProfile* SettingsProfile = _Profiles.Find(Profile); if (!SettingsProfile) { - UE_LOG(LogHarmonyLink, Error, TEXT("No settings found for profile %s."), *ProfileName->ToString()); + UE_LOG(LogHarmonyLinkSettings, Error, TEXT("No settings found for profile %s."), *ProfileName->ToString()); return; } @@ -246,7 +245,7 @@ void UHarmonyLinkGraphics::SetSetting(const EProfile Profile, const FName Settin UHarmonyLinkGraphics* UHarmonyLinkGraphics::GetSettings() { - UE_LOG(LogHarmonyLink, VeryVerbose, TEXT("GetSettings called.")); + UE_LOG(LogHarmonyLinkSettings, VeryVerbose, TEXT("GetSettings called.")); // Check if we already initialised if (_INSTANCE) { @@ -262,7 +261,7 @@ UHarmonyLinkGraphics* UHarmonyLinkGraphics::GetSettings() FSettingsProfile UHarmonyLinkGraphics::GetSettingProfile(const EProfile Profile) { - UE_LOG(LogHarmonyLink, Verbose, TEXT("GetSettingProfile called.")); + UE_LOG(LogHarmonyLinkSettings, Verbose, TEXT("GetSettingProfile called.")); // Ignore if HarmonyLinkSettings is disabled if (Profile == EProfile::NONE) { @@ -274,7 +273,7 @@ FSettingsProfile UHarmonyLinkGraphics::GetSettingProfile(const EProfile Profile) if (!ProfileName) { - UE_LOG(LogHarmonyLink, Error, TEXT("Profile not found.")); + UE_LOG(LogHarmonyLinkSettings, Error, TEXT("Profile not found.")); return FSettingsProfile(); } @@ -283,7 +282,7 @@ FSettingsProfile UHarmonyLinkGraphics::GetSettingProfile(const EProfile Profile) if (!SettingsProfile) { - UE_LOG(LogHarmonyLink, Error, TEXT("No settings found for profile %s."), *ProfileName->ToString()); + UE_LOG(LogHarmonyLinkSettings, Error, TEXT("No settings found for profile %s."), *ProfileName->ToString()); return FSettingsProfile(); } @@ -292,29 +291,29 @@ FSettingsProfile UHarmonyLinkGraphics::GetSettingProfile(const EProfile Profile) EProfile UHarmonyLinkGraphics::GetActiveProfile() const { - UE_LOG(LogHarmonyLink, Verbose, TEXT("GetActiveProfile called.")); + UE_LOG(LogHarmonyLinkSettings, Verbose, TEXT("GetActiveProfile called.")); return _ActiveProfile; } void UHarmonyLinkGraphics::SetAutomaticSwitching(const bool bAutomaticSwitch) { - UE_LOG(LogHarmonyLink, Verbose, TEXT("SetAutomaticSwitching called.")); + UE_LOG(LogHarmonyLinkSettings, Verbose, TEXT("SetAutomaticSwitching called.")); _bAutomaticSwitch = bAutomaticSwitch; OnAutomaticSwitchChanged.Broadcast(_bAutomaticSwitch); } bool UHarmonyLinkGraphics::GetAutomaticSwitching() const { - UE_LOG(LogHarmonyLink, Verbose, TEXT("GetAutomaticSwitching called.")); + UE_LOG(LogHarmonyLinkSettings, Verbose, TEXT("GetAutomaticSwitching called.")); return _bAutomaticSwitch; } void UHarmonyLinkGraphics::DestroySettings() { - UE_LOG(LogHarmonyLink, Log, TEXT("DestroySettings called.")); + UE_LOG(LogHarmonyLinkSettings, Log, TEXT("DestroySettings called.")); if (_INSTANCE) { - UE_LOG(LogHarmonyLink, Log, TEXT("Destroying UHarmonyLinkGraphics.")) + UE_LOG(LogHarmonyLinkSettings, Log, TEXT("Destroying UHarmonyLinkGraphics.")) FWorldDelegates::OnPostWorldInitialization.RemoveAll(_INSTANCE); FWorldDelegates::OnPreWorldFinishDestroy.RemoveAll(_INSTANCE); _INSTANCE->RemoveFromRoot(); @@ -333,7 +332,7 @@ void UHarmonyLinkGraphics::DestroySettings() void UHarmonyLinkGraphics::Init() { - UE_LOG(LogHarmonyLink, Warning, TEXT("HarmonyLinkGraphics initialized.")); + UE_LOG(LogHarmonyLinkSettings, Warning, TEXT("HarmonyLinkGraphics initialized.")); if (_INSTANCE != this) { if (_INSTANCE) @@ -349,11 +348,11 @@ void UHarmonyLinkGraphics::Init() FWorldDelegates::OnPostWorldInitialization.AddStatic(&UHarmonyLinkGraphics::OnPostWorldInitialization); FWorldDelegates::OnPreWorldFinishDestroy.AddStatic(&UHarmonyLinkGraphics::OnWorldEnd); - UE_LOG(LogHarmonyLink, Log, TEXT("Init called.")); + UE_LOG(LogHarmonyLinkSettings, Log, TEXT("Init called.")); - if (!HarmonyLinkLib::HL_Init()) + if (!UHarmonyLinkLibrary::IsInitialised()) { - UE_LOG(LogHarmonyLink, Fatal, TEXT("Failed to initialise HarmonyLinkLib!")); + UE_LOG(LogHarmonyLinkSettings, Fatal, TEXT("Failed to initialise HarmonyLinkLib!")); return; } @@ -376,7 +375,7 @@ void UHarmonyLinkGraphics::Init() void UHarmonyLinkGraphics::Intermal_SaveConfig(const bool bDefaultConfig) const { - UE_LOG(LogHarmonyLink, Log, TEXT("Intermal_SaveConfig called.")); + UE_LOG(LogHarmonyLinkSettings, Log, TEXT("Intermal_SaveConfig called.")); QUICK_SCOPE_CYCLE_COUNTER(HarmonyLinkGraphics_SaveConfig); const FString Filename = GetConfigDirectoryFile(bDefaultConfig); @@ -386,14 +385,14 @@ void UHarmonyLinkGraphics::Intermal_SaveConfig(const bool bDefaultConfig) const // Save the _bAutomaticSwitch variable GConfig->SetBool(*SectionName, *KeyName, _bAutomaticSwitch, Filename); - UE_LOG(LogHarmonyLink, Log, TEXT("Saving bAutomaticSwitch: %s"), _bAutomaticSwitch ? TEXT("true") : TEXT("false")); + UE_LOG(LogHarmonyLinkSettings, Log, TEXT("Saving bAutomaticSwitch: %s"), _bAutomaticSwitch ? TEXT("true") : TEXT("false")); for (const TPair& Profile : _Profiles) { SaveSection(Profile.Value, bDefaultConfig); } - UE_LOG(LogHarmonyLink, Log, TEXT("Flushing file: '%s'"), *Filename); + UE_LOG(LogHarmonyLinkSettings, Log, TEXT("Flushing file: '%s'"), *Filename); GetConfig()->Dirty = true; // You'd think that Write would actually write something but for some // reason even if it outputs a success the file doesn't actually get created. @@ -404,7 +403,7 @@ void UHarmonyLinkGraphics::Intermal_SaveConfig(const bool bDefaultConfig) const void UHarmonyLinkGraphics::Tick() { - UE_LOG(LogHarmonyLink, VeryVerbose, TEXT("Tick called.")); + UE_LOG(LogHarmonyLinkSettings, VeryVerbose, TEXT("Tick called.")); const FBattery BatteryStatus = UHarmonyLinkLibrary::GetBatteryStatus(); if (BatteryStatus.BatteryPercent != _LastBatteryPercentage) @@ -439,18 +438,18 @@ void UHarmonyLinkGraphics::Tick() void UHarmonyLinkGraphics::CreateDefaultConfigFile() const { - UE_LOG(LogHarmonyLink, Log, TEXT("CreateDefaultConfigFile called.")); - UE_LOG(LogHarmonyLink, Log, TEXT("Creating default config file.")); + UE_LOG(LogHarmonyLinkSettings, Log, TEXT("CreateDefaultConfigFile called.")); + UE_LOG(LogHarmonyLinkSettings, Log, TEXT("Creating default config file.")); LoadDefaults(); Intermal_SaveConfig(true); - UE_LOG(LogHarmonyLink, Log, TEXT("Default config file created.")); + UE_LOG(LogHarmonyLinkSettings, Log, TEXT("Default config file created.")); } FString UHarmonyLinkGraphics::GetConfigDirectoryFile(const bool bDefaultFolder) { - UE_LOG(LogHarmonyLink, Log, TEXT("GetConfigDirectoryFile called.")); + UE_LOG(LogHarmonyLinkSettings, Log, TEXT("GetConfigDirectoryFile called.")); FString ConfigFileName = bDefaultFolder ? TEXT("DefaultHarmonyLink.ini") : TEXT("HarmonyLink.ini"); FString ConfigDirectory = bDefaultFolder ? FPaths::ProjectConfigDir() : FPaths::Combine(FPaths::GeneratedConfigDir(), UGameplayStatics::GetPlatformName()); @@ -460,7 +459,7 @@ FString UHarmonyLinkGraphics::GetConfigDirectoryFile(const bool bDefaultFolder) void UHarmonyLinkGraphics::SaveSection(const FSettingsProfile& SettingsProfile, const bool bDefaultConfig, const bool bFlush) const { - UE_LOG(LogHarmonyLink, Log, TEXT("SaveSection called.")); + UE_LOG(LogHarmonyLinkSettings, Log, TEXT("SaveSection called.")); if (GConfig) { const FString Filename = GetConfigDirectoryFile(bDefaultConfig); @@ -493,10 +492,10 @@ void UHarmonyLinkGraphics::SaveSection(const FSettingsProfile& SettingsProfile, GConfig->SetString(*SettingsProfile.SectionName.ToString(), *Setting.Key.ToString(), *ConfigValue, Filename); } - UE_LOG(LogHarmonyLink, Log, TEXT("Saving config file: '%s'"), *Filename); + UE_LOG(LogHarmonyLinkSettings, Log, TEXT("Saving config file: '%s'"), *Filename); if (bFlush) { - UE_LOG(LogHarmonyLink, Log, TEXT("Flushing file: '%s'"), *Filename); + UE_LOG(LogHarmonyLinkSettings, Log, TEXT("Flushing file: '%s'"), *Filename); GConfig->Flush(false, Filename); } } @@ -504,7 +503,7 @@ void UHarmonyLinkGraphics::SaveSection(const FSettingsProfile& SettingsProfile, void UHarmonyLinkGraphics::LoadDefaults() const { - UE_LOG(LogHarmonyLink, Log, TEXT("LoadDefaults called.")); + UE_LOG(LogHarmonyLinkSettings, Log, TEXT("LoadDefaults called.")); _Profiles.Reset(); @@ -525,11 +524,11 @@ void UHarmonyLinkGraphics::LoadDefaults() const bool UHarmonyLinkGraphics::ApplyProfileInternal(const EProfile Profile) { - UE_LOG(LogHarmonyLink, Log, TEXT("ApplyProfileInternal called.")); + UE_LOG(LogHarmonyLinkSettings, Log, TEXT("ApplyProfileInternal called.")); // If the profile is None, revert to the original user game settings if (Profile == EProfile::NONE) { - UE_LOG(LogHarmonyLink, Log, TEXT("Reverting to original user game settings.")); + UE_LOG(LogHarmonyLinkSettings, Log, TEXT("Reverting to original user game settings.")); if (UGameUserSettings* UserSettings = GEngine->GetGameUserSettings()) { @@ -537,11 +536,11 @@ bool UHarmonyLinkGraphics::ApplyProfileInternal(const EProfile Profile) UserSettings->ApplySettings(true); _ActiveProfile = EProfile::NONE; OnProfileChanged.Broadcast(_ActiveProfile); - UE_LOG(LogHarmonyLink, Log, TEXT("Original user game settings applied.")); + UE_LOG(LogHarmonyLinkSettings, Log, TEXT("Original user game settings applied.")); return true; } - UE_LOG(LogHarmonyLink, Warning, TEXT("Failed to get user game settings.")); + UE_LOG(LogHarmonyLinkSettings, Warning, TEXT("Failed to get user game settings.")); return false; } @@ -551,18 +550,18 @@ bool UHarmonyLinkGraphics::ApplyProfileInternal(const EProfile Profile) if (!ProfileName) { - UE_LOG(LogHarmonyLink, Error, TEXT("Profile not found.")); + UE_LOG(LogHarmonyLinkSettings, Error, TEXT("Profile not found.")); return false; } - UE_LOG(LogHarmonyLink, Log, TEXT("Applying profile %s."), *ProfileName->ToString()); + UE_LOG(LogHarmonyLinkSettings, Log, TEXT("Applying profile %s."), *ProfileName->ToString()); // Find the settings associated with the profile FSettingsProfile* SettingsProfile = _Profiles.Find(Profile); if (!SettingsProfile) { - UE_LOG(LogHarmonyLink, Warning, TEXT("No settings found for profile %s."), *ProfileName->ToString()); + UE_LOG(LogHarmonyLinkSettings, Warning, TEXT("No settings found for profile %s."), *ProfileName->ToString()); return false; } @@ -573,7 +572,7 @@ bool UHarmonyLinkGraphics::ApplyProfileInternal(const EProfile Profile) for (const TPair& Setting : SettingsProfile->Settings) { // Example of logging each setting being applied - UE_LOG(LogHarmonyLink, Log, TEXT("Patching CVar override: %s = %s"), + UE_LOG(LogHarmonyLinkSettings, Log, TEXT("Patching CVar override: %s = %s"), *Setting.Key.ToString(), *Setting.Value.ToString()); ApplySetting(Setting); @@ -587,10 +586,10 @@ bool UHarmonyLinkGraphics::ApplyProfileInternal(const EProfile Profile) void UHarmonyLinkGraphics::OnPostWorldInitialization(UWorld* World, UWorld::InitializationValues IVS) { - UE_LOG(LogHarmonyLink, Log, TEXT("OnPostWorldInitialization called.")); + UE_LOG(LogHarmonyLinkSettings, Log, TEXT("OnPostWorldInitialization called.")); if (!World || !World->IsValidLowLevel()) { - UE_LOG(LogHarmonyLink, Error, TEXT("Failed to Hook into World Initialisation!")) + UE_LOG(LogHarmonyLinkSettings, Error, TEXT("Failed to Hook into World Initialisation!")) return; } @@ -601,7 +600,7 @@ void UHarmonyLinkGraphics::OnPostWorldInitialization(UWorld* World, UWorld::Init FTimerManager* TimerManager = &World->GetTimerManager(); if (!TimerManager) { - UE_LOG(LogHarmonyLink, Error, TEXT("Failed get TimerManager!")) + UE_LOG(LogHarmonyLinkSettings, Error, TEXT("Failed get TimerManager!")) return; } @@ -612,7 +611,7 @@ void UHarmonyLinkGraphics::OnPostWorldInitialization(UWorld* World, UWorld::Init { if (!GetSettings()) { - UE_LOG(LogHarmonyLink, Error, TEXT("'This' is destroyed, Clearing timer.")) + UE_LOG(LogHarmonyLinkSettings, Error, TEXT("'This' is destroyed, Clearing timer.")) if (TimerManager) { TimerManager->ClearTimer(_TickTimerHandle); @@ -624,12 +623,12 @@ void UHarmonyLinkGraphics::OnPostWorldInitialization(UWorld* World, UWorld::Init } else { - UE_LOG(LogHarmonyLink, Error, TEXT("Error: Timer already exists.")); + UE_LOG(LogHarmonyLinkSettings, Error, TEXT("Error: Timer already exists.")); } } else { - UE_LOG(LogHarmonyLink, Error, TEXT("'This' is nullptr!")); + UE_LOG(LogHarmonyLinkSettings, Error, TEXT("'This' is nullptr!")); } } else @@ -640,10 +639,10 @@ void UHarmonyLinkGraphics::OnPostWorldInitialization(UWorld* World, UWorld::Init void UHarmonyLinkGraphics::OnWorldEnd(UWorld* World) { - UE_LOG(LogHarmonyLink, Log, TEXT("OnWorldEnd(UWorld* World) called.")); + UE_LOG(LogHarmonyLinkSettings, Log, TEXT("OnWorldEnd(UWorld* World) called.")); if (!World) { - UE_LOG(LogHarmonyLink, Error, TEXT("World Already destroyed")) + UE_LOG(LogHarmonyLinkSettings, Error, TEXT("World Already destroyed")) return; } @@ -663,7 +662,7 @@ void UHarmonyLinkGraphics::OnWorldEnd(UWorld* World) bool UHarmonyLinkGraphics::ApplyProfile(const EProfile Profile, const bool bDisableAutomaticSwitch) { - UE_LOG(LogHarmonyLink, Log, TEXT("Applying Profile.")); + UE_LOG(LogHarmonyLinkSettings, Log, TEXT("Applying Profile.")); // Manual profile change, turn off automatic switching if (bDisableAutomaticSwitch) { @@ -675,7 +674,7 @@ bool UHarmonyLinkGraphics::ApplyProfile(const EProfile Profile, const bool bDisa void UHarmonyLinkGraphics::ApplySetting(const TPair& Setting) { - UE_LOG(LogHarmonyLink, Log, TEXT("Applying settings.")); + UE_LOG(LogHarmonyLinkSettings, Log, TEXT("Applying settings.")); // Apply the setting based on the key (CVar) IConsoleManager& ConsoleManager = IConsoleManager::Get(); IConsoleVariable* CVar = ConsoleManager.FindConsoleVariable(*Setting.Key.ToString()); @@ -697,31 +696,31 @@ void UHarmonyLinkGraphics::ApplySetting(const TPair& Sett break; default: - UE_LOG(LogHarmonyLink, Warning, TEXT("Unsupported value type for setting: %s"), *Setting.Key.ToString()); + UE_LOG(LogHarmonyLinkSettings, Warning, TEXT("Unsupported value type for setting: %s"), *Setting.Key.ToString()); break; } } else { - UE_LOG(LogHarmonyLink, Warning, TEXT("Console variable not found: %s"), *Setting.Key.ToString()); + UE_LOG(LogHarmonyLinkSettings, Warning, TEXT("Console variable not found: %s"), *Setting.Key.ToString()); } } void UHarmonyLinkGraphics::DebugPrintProfiles() const { - UE_LOG(LogHarmonyLink, Log, TEXT("DebugPrintProfiles started.")); + UE_LOG(LogHarmonyLinkSettings, Log, TEXT("DebugPrintProfiles started.")); for (TPair Profile : _Profiles) { PrintDebugSection(Profile.Value); } - UE_LOG(LogHarmonyLink, Log, TEXT("DebugPrintProfiles completed.")); + UE_LOG(LogHarmonyLinkSettings, Log, TEXT("DebugPrintProfiles completed.")); } FConfigFile* UHarmonyLinkGraphics::GetConfig() const { - UE_LOG(LogHarmonyLink, Verbose, TEXT("GetConfig Called.")); + UE_LOG(LogHarmonyLinkSettings, Verbose, TEXT("GetConfig Called.")); if (_ConfigFile) { return _ConfigFile.Get(); @@ -731,7 +730,7 @@ FConfigFile* UHarmonyLinkGraphics::GetConfig() const if (!ConfigFile) { - UE_LOG(LogHarmonyLink, Warning, TEXT("Config file not found, attempting to read DefaultHarmonyLink.ini.")); + UE_LOG(LogHarmonyLinkSettings, Warning, TEXT("Config file not found, attempting to read DefaultHarmonyLink.ini.")); // Look in ProjectFolder->Config->DefaultHarmonyLink.ini ConfigFile = GConfig->Find(GetConfigDirectoryFile(true), true); } @@ -744,14 +743,14 @@ FConfigFile* UHarmonyLinkGraphics::GetConfig() const if (ConfigFile) { - UE_LOG(LogHarmonyLink, Verbose, TEXT("Setting up config.")); + UE_LOG(LogHarmonyLinkSettings, Verbose, TEXT("Setting up config.")); ConfigFile->Name = "HarmonyLink"; LoadSettingsFromConfig(ConfigFile); _ConfigFile = MakeShareable(ConfigFile); } else { - UE_LOG(LogHarmonyLink, Error, TEXT("Failed to make config variable!")) + UE_LOG(LogHarmonyLinkSettings, Error, TEXT("Failed to make config variable!")) return nullptr; } @@ -760,7 +759,7 @@ FConfigFile* UHarmonyLinkGraphics::GetConfig() const void UHarmonyLinkGraphics::PrintDebugSection(FSettingsProfile& SettingsProfile) { - UE_LOG(LogHarmonyLink, Warning, TEXT("[%s]"), *SettingsProfile.SectionName.ToString()); + UE_LOG(LogHarmonyLinkSettings, Warning, TEXT("[%s]"), *SettingsProfile.SectionName.ToString()); for (const auto& Setting : SettingsProfile.Settings) { @@ -787,13 +786,13 @@ void UHarmonyLinkGraphics::PrintDebugSection(FSettingsProfile& SettingsProfile) break; } - UE_LOG(LogHarmonyLink, Warning, TEXT("Key: %s = V=%s, T=%s "), *Setting.Key.ToString(), *ValueString, *TypeString); + UE_LOG(LogHarmonyLinkSettings, Warning, TEXT("Key: %s = V=%s, T=%s "), *Setting.Key.ToString(), *ValueString, *TypeString); } } void UHarmonyLinkGraphics::ResetInstance() { - UE_LOG(LogHarmonyLink, Log, TEXT("Resetting instance.")); + UE_LOG(LogHarmonyLinkSettings, Log, TEXT("Resetting instance.")); _INSTANCE->DestroySettings(); GetSettings(); } diff --git a/Source/HarmonyLink/Private/Structs/HLConfigValue.cpp b/Source/HarmonyLinkSettings/Private/Structs/HLConfigValue.cpp similarity index 100% rename from Source/HarmonyLink/Private/Structs/HLConfigValue.cpp rename to Source/HarmonyLinkSettings/Private/Structs/HLConfigValue.cpp diff --git a/Source/HarmonyLink/Public/Enums/Profile.h b/Source/HarmonyLinkSettings/Public/Enums/Profile.h similarity index 100% rename from Source/HarmonyLink/Public/Enums/Profile.h rename to Source/HarmonyLinkSettings/Public/Enums/Profile.h diff --git a/Source/HarmonyLinkSettings/Public/HarmonyLinkSettings.h b/Source/HarmonyLinkSettings/Public/HarmonyLinkSettings.h new file mode 100644 index 0000000..a51a458 --- /dev/null +++ b/Source/HarmonyLinkSettings/Public/HarmonyLinkSettings.h @@ -0,0 +1,13 @@ +#pragma once + +#include "CoreMinimal.h" +#include "Modules/ModuleManager.h" + +DECLARE_LOG_CATEGORY_EXTERN(LogHarmonyLinkSettings, Log, All); + +class FHarmonyLinkSettingsModule : public IModuleInterface +{ +public: + virtual void StartupModule() override; + virtual void ShutdownModule() override; +}; diff --git a/Source/HarmonyLink/Public/Objects/HarmonyLinkGraphics.h b/Source/HarmonyLinkSettings/Public/Objects/HarmonyLinkGraphics.h similarity index 99% rename from Source/HarmonyLink/Public/Objects/HarmonyLinkGraphics.h rename to Source/HarmonyLinkSettings/Public/Objects/HarmonyLinkGraphics.h index d6e3418..782fb98 100644 --- a/Source/HarmonyLink/Public/Objects/HarmonyLinkGraphics.h +++ b/Source/HarmonyLinkSettings/Public/Objects/HarmonyLinkGraphics.h @@ -17,7 +17,7 @@ DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnBatteryLevelChanged, int32, Batte * */ UCLASS(Blueprintable, config="HarmonyLink") -class HARMONYLINK_API UHarmonyLinkGraphics : public UBlueprintFunctionLibrary +class HARMONYLINKSETTINGS_API UHarmonyLinkGraphics : public UBlueprintFunctionLibrary { GENERATED_BODY() @@ -84,7 +84,7 @@ public: * @note Uses UE_LOG for logging the update process and any errors. */ UFUNCTION(BlueprintCallable, Category="HarmonyLink Settings") - void SetSetting(EProfile Profile, FName Setting, FHLConfigValue Value); + void SetSetting(EProfile Profile, FName Setting, const FHLConfigValue& Value); /** * @brief Applies the specified graphics profile. diff --git a/Source/HarmonyLink/Public/Structs/HLConfigValue.h b/Source/HarmonyLinkSettings/Public/Structs/HLConfigValue.h similarity index 100% rename from Source/HarmonyLink/Public/Structs/HLConfigValue.h rename to Source/HarmonyLinkSettings/Public/Structs/HLConfigValue.h diff --git a/Source/HarmonyLink/Public/Structs/SettingsProfile.h b/Source/HarmonyLinkSettings/Public/Structs/SettingsProfile.h similarity index 100% rename from Source/HarmonyLink/Public/Structs/SettingsProfile.h rename to Source/HarmonyLinkSettings/Public/Structs/SettingsProfile.h diff --git a/Source/HarmonyLink/HarmonyLink.Build.cs b/Source/HarmonyLinkUE/HarmonyLinkUE.Build.cs similarity index 89% rename from Source/HarmonyLink/HarmonyLink.Build.cs rename to Source/HarmonyLinkUE/HarmonyLinkUE.Build.cs index 7199123..56b5629 100644 --- a/Source/HarmonyLink/HarmonyLink.Build.cs +++ b/Source/HarmonyLinkUE/HarmonyLinkUE.Build.cs @@ -3,9 +3,9 @@ using UnrealBuildTool; using System.IO; -public class HarmonyLink : ModuleRules +public class HarmonyLinkUE : ModuleRules { - public HarmonyLink(ReadOnlyTargetRules Target) : base(Target) + public HarmonyLinkUE(ReadOnlyTargetRules Target) : base(Target) { PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs; diff --git a/Source/HarmonyLink/Private/HarmonyLinkLibrary.cpp b/Source/HarmonyLinkUE/Private/HarmonyLinkLibrary.cpp similarity index 91% rename from Source/HarmonyLink/Private/HarmonyLinkLibrary.cpp rename to Source/HarmonyLinkUE/Private/HarmonyLinkLibrary.cpp index a9a0f25..bddd3af 100644 --- a/Source/HarmonyLink/Private/HarmonyLinkLibrary.cpp +++ b/Source/HarmonyLinkUE/Private/HarmonyLinkLibrary.cpp @@ -1,7 +1,7 @@ // Copyright (C) 2024 Jordon Brooks #include "HarmonyLinkLibrary.h" -#include "HarmonyLink.h" +#include "HarmonyLinkUE.h" #include "HarmonyLinkLib.h" @@ -20,9 +20,13 @@ FCPUInfo UHarmonyLinkLibrary::CachedCPUInfo = FCPUInfo(); FDevice UHarmonyLinkLibrary::CachedDeviceInfo = FDevice(); FOSVerInfo UHarmonyLinkLibrary::CachedOSInfo = FOSVerInfo(); +bool UHarmonyLinkLibrary::bIsInitialised = false; + UHarmonyLinkLibrary::UHarmonyLinkLibrary() { - if (!HarmonyLinkLib::HL_Init()) + bIsInitialised = HarmonyLinkLib::HL_Init(); + + if (!bIsInitialised) { UE_LOG(LogHarmonyLink, Fatal, TEXT("Failed to initialise HarmonyLinkLib!")); return; @@ -31,6 +35,11 @@ UHarmonyLinkLibrary::UHarmonyLinkLibrary() UE_LOG(LogHarmonyLink, Log, TEXT("HarmonyLinkLib Initialised!")); } +bool UHarmonyLinkLibrary::IsInitialised() +{ + return bIsInitialised; +} + bool UHarmonyLinkLibrary::IsWine(bool bForce) { if (!bIsWineCached || bForce) diff --git a/Source/HarmonyLinkUE/Private/HarmonyLinkUE.cpp b/Source/HarmonyLinkUE/Private/HarmonyLinkUE.cpp new file mode 100644 index 0000000..29c33e1 --- /dev/null +++ b/Source/HarmonyLinkUE/Private/HarmonyLinkUE.cpp @@ -0,0 +1,22 @@ +// Copyright (C) 2024 Jordon Brooks + +#include "HarmonyLinkUE.h" +#include "Modules/ModuleManager.h" + +#define LOCTEXT_NAMESPACE "FHarmonyLinkUEModule" + +DEFINE_LOG_CATEGORY(LogHarmonyLink); + +void FHarmonyLinkUEModule::StartupModule() +{ + +} + +void FHarmonyLinkUEModule::ShutdownModule() +{ + +} + +#undef LOCTEXT_NAMESPACE + +IMPLEMENT_MODULE(FHarmonyLinkUEModule, HarmonyLinkUE) diff --git a/Source/HarmonyLink/Private/Structs/Battery.cpp b/Source/HarmonyLinkUE/Private/Structs/Battery.cpp similarity index 100% rename from Source/HarmonyLink/Private/Structs/Battery.cpp rename to Source/HarmonyLinkUE/Private/Structs/Battery.cpp diff --git a/Source/HarmonyLink/Private/Structs/CPUInfo.cpp b/Source/HarmonyLinkUE/Private/Structs/CPUInfo.cpp similarity index 100% rename from Source/HarmonyLink/Private/Structs/CPUInfo.cpp rename to Source/HarmonyLinkUE/Private/Structs/CPUInfo.cpp diff --git a/Source/HarmonyLink/Private/Structs/Device.cpp b/Source/HarmonyLinkUE/Private/Structs/Device.cpp similarity index 100% rename from Source/HarmonyLink/Private/Structs/Device.cpp rename to Source/HarmonyLinkUE/Private/Structs/Device.cpp diff --git a/Source/HarmonyLink/Private/Structs/OSVerInfo.cpp b/Source/HarmonyLinkUE/Private/Structs/OSVerInfo.cpp similarity index 100% rename from Source/HarmonyLink/Private/Structs/OSVerInfo.cpp rename to Source/HarmonyLinkUE/Private/Structs/OSVerInfo.cpp diff --git a/Source/HarmonyLink/Public/Enums/DeviceEnum.h b/Source/HarmonyLinkUE/Public/Enums/DeviceEnum.h similarity index 100% rename from Source/HarmonyLink/Public/Enums/DeviceEnum.h rename to Source/HarmonyLinkUE/Public/Enums/DeviceEnum.h diff --git a/Source/HarmonyLink/Public/Enums/Platform.h b/Source/HarmonyLinkUE/Public/Enums/Platform.h similarity index 100% rename from Source/HarmonyLink/Public/Enums/Platform.h rename to Source/HarmonyLinkUE/Public/Enums/Platform.h diff --git a/Source/HarmonyLink/Public/HarmonyLinkLibrary.h b/Source/HarmonyLinkUE/Public/HarmonyLinkLibrary.h similarity index 89% rename from Source/HarmonyLink/Public/HarmonyLinkLibrary.h rename to Source/HarmonyLinkUE/Public/HarmonyLinkLibrary.h index 926b6c8..a55db5f 100644 --- a/Source/HarmonyLink/Public/HarmonyLinkLibrary.h +++ b/Source/HarmonyLinkUE/Public/HarmonyLinkLibrary.h @@ -16,13 +16,17 @@ * Library of static functions for accessing various system information, particularly for the HarmonyLink project. */ UCLASS() -class HARMONYLINK_API UHarmonyLinkLibrary : public UBlueprintFunctionLibrary +class HARMONYLINKUE_API UHarmonyLinkLibrary : public UBlueprintFunctionLibrary { GENERATED_BODY() public: UHarmonyLinkLibrary(); + // IsInitialised + UFUNCTION(BlueprintCallable, BlueprintPure, Category="HarmonyLink") + static bool IsInitialised(); + // Checks if the game is running under Wine. UFUNCTION(BlueprintCallable, BlueprintPure, Category="HarmonyLink") static bool IsWine(bool bForce = false); @@ -66,4 +70,6 @@ private: static FCPUInfo CachedCPUInfo; static FDevice CachedDeviceInfo; static FOSVerInfo CachedOSInfo; + + static bool bIsInitialised; }; diff --git a/Source/HarmonyLink/Public/HarmonyLink.h b/Source/HarmonyLinkUE/Public/HarmonyLinkUE.h similarity index 83% rename from Source/HarmonyLink/Public/HarmonyLink.h rename to Source/HarmonyLinkUE/Public/HarmonyLinkUE.h index b59a8ba..b88bb95 100644 --- a/Source/HarmonyLink/Public/HarmonyLink.h +++ b/Source/HarmonyLinkUE/Public/HarmonyLinkUE.h @@ -6,7 +6,7 @@ DECLARE_LOG_CATEGORY_EXTERN(LogHarmonyLink, All, All); -class FHarmonyLinkModule : public IModuleInterface +class FHarmonyLinkUEModule : public IModuleInterface { public: diff --git a/Source/HarmonyLink/Public/Structs/Battery.h b/Source/HarmonyLinkUE/Public/Structs/Battery.h similarity index 100% rename from Source/HarmonyLink/Public/Structs/Battery.h rename to Source/HarmonyLinkUE/Public/Structs/Battery.h diff --git a/Source/HarmonyLink/Public/Structs/CPUInfo.h b/Source/HarmonyLinkUE/Public/Structs/CPUInfo.h similarity index 100% rename from Source/HarmonyLink/Public/Structs/CPUInfo.h rename to Source/HarmonyLinkUE/Public/Structs/CPUInfo.h diff --git a/Source/HarmonyLink/Public/Structs/Device.h b/Source/HarmonyLinkUE/Public/Structs/Device.h similarity index 100% rename from Source/HarmonyLink/Public/Structs/Device.h rename to Source/HarmonyLinkUE/Public/Structs/Device.h diff --git a/Source/HarmonyLink/Public/Structs/OSVerInfo.h b/Source/HarmonyLinkUE/Public/Structs/OSVerInfo.h similarity index 100% rename from Source/HarmonyLink/Public/Structs/OSVerInfo.h rename to Source/HarmonyLinkUE/Public/Structs/OSVerInfo.h From 52ae204afef9fe297e90e8fed88809199f0e9306 Mon Sep 17 00:00:00 2001 From: Jordon Brooks Date: Mon, 8 Jul 2024 21:53:56 +0100 Subject: [PATCH 26/30] Added new line --- HarmonyLinkUE.uplugin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HarmonyLinkUE.uplugin b/HarmonyLinkUE.uplugin index 8b1b3fe..450dc53 100644 --- a/HarmonyLinkUE.uplugin +++ b/HarmonyLinkUE.uplugin @@ -30,4 +30,4 @@ "LoadingPhase": "Default" } ] -} \ No newline at end of file +} From 5fac24b973f35e382254cea9ca33ea37e04f1563 Mon Sep 17 00:00:00 2001 From: Jordon Brooks Date: Mon, 8 Jul 2024 21:54:25 +0100 Subject: [PATCH 27/30] Removed unused module dependency --- Source/HarmonyLinkSettings/HarmonyLinkSettings.Build.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/Source/HarmonyLinkSettings/HarmonyLinkSettings.Build.cs b/Source/HarmonyLinkSettings/HarmonyLinkSettings.Build.cs index 69f4fa3..e630ffb 100644 --- a/Source/HarmonyLinkSettings/HarmonyLinkSettings.Build.cs +++ b/Source/HarmonyLinkSettings/HarmonyLinkSettings.Build.cs @@ -18,8 +18,6 @@ public class HarmonyLinkSettings : ModuleRules { "CoreUObject", "Engine", - "Slate", - "SlateCore", "HarmonyLinkUE" } From 98fb068e2930e5ebedac9f16d5ef8a2f716cf4d1 Mon Sep 17 00:00:00 2001 From: Jordon Brooks Date: Mon, 8 Jul 2024 21:55:13 +0100 Subject: [PATCH 28/30] Fixed compile issue in Unreal Engine 5 --- .../HarmonyLinkSettings/Private/Objects/HarmonyLinkGraphics.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/HarmonyLinkSettings/Private/Objects/HarmonyLinkGraphics.cpp b/Source/HarmonyLinkSettings/Private/Objects/HarmonyLinkGraphics.cpp index 1405b51..fafa023 100644 --- a/Source/HarmonyLinkSettings/Private/Objects/HarmonyLinkGraphics.cpp +++ b/Source/HarmonyLinkSettings/Private/Objects/HarmonyLinkGraphics.cpp @@ -129,7 +129,7 @@ bool UHarmonyLinkGraphics::LoadSection(FConfigFile* ConfigFile, const TPair= 5) - Section = ConfigFile->FindSection(*SectionName.ToString()) + Section = ConfigFile->FindSection(*SectionName.ToString()); #elif (ENGINE_MAJOR_VERSION == 4) && (ENGINE_MINOR_VERSION >= 27) Section = ConfigFile->FindOrAddSection(*SectionName.ToString()); #else From 5e3ccc5ba9c0fb513e3b593cb07b63e9ef02af57 Mon Sep 17 00:00:00 2001 From: Jordon Brooks Date: Mon, 8 Jul 2024 22:44:17 +0100 Subject: [PATCH 29/30] Version Bump --- HarmonyLinkUE.uplugin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HarmonyLinkUE.uplugin b/HarmonyLinkUE.uplugin index 450dc53..a62990f 100644 --- a/HarmonyLinkUE.uplugin +++ b/HarmonyLinkUE.uplugin @@ -1,7 +1,7 @@ { "FileVersion": 3, "Version": 1, - "VersionName": "1.0", + "VersionName": "1.1.0", "FriendlyName": "HarmonyLinkUE", "Description": "Revolutionize handheld gaming with adaptive game settings. Optimize graphics and gameplay experience based on real-time system metrics. Open-source project empowering developers to enhance games on portable devices", "Category": "Handheld", From a6de000c5a109e2bff859f0b5abbb80ba554112f Mon Sep 17 00:00:00 2001 From: Jordon Brooks Date: Mon, 8 Jul 2024 22:50:08 +0100 Subject: [PATCH 30/30] Add copyright notice to files --- Source/HarmonyLinkSettings/HarmonyLinkSettings.Build.cs | 4 +++- Source/HarmonyLinkSettings/Private/HarmonyLinkSettings.cpp | 4 +++- Source/HarmonyLinkSettings/Public/HarmonyLinkSettings.h | 4 +++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/Source/HarmonyLinkSettings/HarmonyLinkSettings.Build.cs b/Source/HarmonyLinkSettings/HarmonyLinkSettings.Build.cs index e630ffb..e4912ff 100644 --- a/Source/HarmonyLinkSettings/HarmonyLinkSettings.Build.cs +++ b/Source/HarmonyLinkSettings/HarmonyLinkSettings.Build.cs @@ -1,4 +1,6 @@ -using UnrealBuildTool; +// Copyright (C) 2024 Jordon Brooks + +using UnrealBuildTool; public class HarmonyLinkSettings : ModuleRules { diff --git a/Source/HarmonyLinkSettings/Private/HarmonyLinkSettings.cpp b/Source/HarmonyLinkSettings/Private/HarmonyLinkSettings.cpp index b2ea795..6f4680e 100644 --- a/Source/HarmonyLinkSettings/Private/HarmonyLinkSettings.cpp +++ b/Source/HarmonyLinkSettings/Private/HarmonyLinkSettings.cpp @@ -1,4 +1,6 @@ -#include "HarmonyLinkSettings.h" +// Copyright (C) 2024 Jordon Brooks + +#include "HarmonyLinkSettings.h" #include "Objects/HarmonyLinkGraphics.h" diff --git a/Source/HarmonyLinkSettings/Public/HarmonyLinkSettings.h b/Source/HarmonyLinkSettings/Public/HarmonyLinkSettings.h index a51a458..6626493 100644 --- a/Source/HarmonyLinkSettings/Public/HarmonyLinkSettings.h +++ b/Source/HarmonyLinkSettings/Public/HarmonyLinkSettings.h @@ -1,4 +1,6 @@ -#pragma once +// Copyright (C) 2024 Jordon Brooks + +#pragma once #include "CoreMinimal.h" #include "Modules/ModuleManager.h"