diff --git a/Plugins/BlueprintJson/BlueprintJson.uplugin b/Plugins/BlueprintJson/BlueprintJson.uplugin new file mode 100644 index 0000000..5d5dfcf --- /dev/null +++ b/Plugins/BlueprintJson/BlueprintJson.uplugin @@ -0,0 +1,31 @@ +{ + "FileVersion": 3, + "Version": 1, + "VersionName": "1.0", + "FriendlyName": "JSON Blueprint support", + "Description": "JSON (JavaScript Object Notation) is a lightweight data-interchange format. It is easy for humans to read and write. It is easy for machines to parse and generate.", + "Category": "Database", + "CreatedBy": "Maksim Shestakov", + "CreatedByURL": "", + "DocsURL": "", + "MarketplaceURL": "com.epicgames.launcher://ue/marketplace/content/f837e4835fbc434a853fe1ead2410b84", + "SupportURL": "", + "EngineVersion": "4.27.0", + "CanContainContent": false, + "Installed": true, + "Modules": [ + { + "Name": "BlueprintJson", + "Type": "Runtime", + "LoadingPhase": "PreDefault", + "WhitelistPlatforms": [ + "Win64", + "Win32", + "Mac", + "Linux", + "IOS", + "Android" + ] + } + ] +} \ No newline at end of file diff --git a/Plugins/BlueprintJson/Resources/Icon128.png b/Plugins/BlueprintJson/Resources/Icon128.png new file mode 100644 index 0000000..1dfe799 --- /dev/null +++ b/Plugins/BlueprintJson/Resources/Icon128.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:567f049f242e537f14c984d0571cd474b04be6df9b7d45be8c60e82c2559f0d9 +size 2674 diff --git a/Plugins/BlueprintJson/Source/BlueprintJson/BlueprintJson.Build.cs b/Plugins/BlueprintJson/Source/BlueprintJson/BlueprintJson.Build.cs new file mode 100644 index 0000000..6737a62 --- /dev/null +++ b/Plugins/BlueprintJson/Source/BlueprintJson/BlueprintJson.Build.cs @@ -0,0 +1,24 @@ +// Copyright 2018 Maksim Shestakov. All Rights Reserved. + +namespace UnrealBuildTool.Rules +{ + public class BlueprintJson : ModuleRules + { + public BlueprintJson(ReadOnlyTargetRules Target) : base(Target) + { + PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs; + + //MinFilesUsingPrecompiledHeaderOverride = 1; + //bFasterWithoutUnity = true; + + PrivateDependencyModuleNames.AddRange( + new string[] { + "Core", + "CoreUObject", + "Engine", + "Json" + } + ); + } + } +} diff --git a/Plugins/BlueprintJson/Source/BlueprintJson/Classes/BlueprintJsonLibrary.h b/Plugins/BlueprintJson/Source/BlueprintJson/Classes/BlueprintJsonLibrary.h new file mode 100644 index 0000000..df560f0 --- /dev/null +++ b/Plugins/BlueprintJson/Source/BlueprintJson/Classes/BlueprintJsonLibrary.h @@ -0,0 +1,245 @@ +// Copyright 2018 Maksim Shestakov. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "Kismet/BlueprintFunctionLibrary.h" +#include "BlueprintJsonLibrary.generated.h" + + +UENUM(BlueprintType) +enum class EJsonType : uint8 +{ + None, + Null, + String, + Number, + Boolean, + Array, + Object +}; + +USTRUCT(BlueprintType, meta = (HasNativeMake = "BlueprintJson.BlueprintJsonLibrary.JsonMake", HasNativeBreak = "BlueprintJson.BlueprintJsonLibrary.Conv_JsonObjectToString")) +struct FBlueprintJsonObject +{ + GENERATED_USTRUCT_BODY() + + TSharedPtr Object; +}; + +USTRUCT(BlueprintType, meta = (HasNativeMake = "BlueprintJson.BlueprintJsonLibrary.JsonMakeString")) +struct FBlueprintJsonValue +{ + GENERATED_USTRUCT_BODY() + + TSharedPtr Value; +}; + + +UCLASS() +class BLUEPRINTJSON_API UBlueprintJsonLibrary : public UBlueprintFunctionLibrary +{ + GENERATED_BODY() + +public: + + /** + * Creates a json object + * + * @return The json object + */ + UFUNCTION(BlueprintPure, Category = "Json", meta = (NativeMakeFunc)) + static FBlueprintJsonObject JsonMake(); + + /** + * Sets the value of the field with the specified name. + * + * @param JsonObject The stored json object + * @param FieldName The name of the field to set. + * @param Value The json value to set. + * @return The stored json object + */ + UFUNCTION(BlueprintPure, Category = "Json") + static const FBlueprintJsonObject& JsonMakeField(const FBlueprintJsonObject& JsonObject, const FString& FieldName, const FBlueprintJsonValue& Value); + + /** + * Sets the value of the field with the specified name. + * + * @param JsonObject The stored json object + * @param FieldName The name of the field to set. + * @param Value The json value to set. + * @return The stored json object + */ + UFUNCTION(BlueprintCallable, Category = "Json") + static const FBlueprintJsonObject& JsonSetField(const FBlueprintJsonObject& JsonObject, const FString& FieldName, const FBlueprintJsonValue& JsonValue); + + /** + * Checks whether a field with the specified name exists in the json object. + * + * @param JsonObject The stored json object + * @param FieldName The name of the field to check. + * @return true if the field exists, false otherwise. + */ + UFUNCTION(BlueprintPure, Category = "Json") + static bool JsonHasField(const FBlueprintJsonObject& JsonObject, const FString& FieldName); + + /** + * Checks whether a field with the specified name and type exists in the object. + * + * @param JsonObject The stored json object + * @param FieldName The name of the field to check. + * @param Type The type of the field to check. + * @return true if the field exists, false otherwise. + */ + UFUNCTION(BlueprintPure, Category = "Json") + static bool JsonHasTypedField(const FBlueprintJsonObject& JsonObject, const FString& FieldName, EJsonType Type); + + /** + * Removes the field with the specified name. + * + * @param JsonObject The stored json object + * @param FieldName The name of the field to remove. + * @return The stored json object + */ + UFUNCTION(BlueprintCallable, Category = "Json") + static const FBlueprintJsonObject& JsonRemoveField(const FBlueprintJsonObject& JsonObject, const FString& FieldName); + + /** + * Convert json object to json string + * + * @param JsonObject The stored json object + * @param FieldName The name of the field to get. + * @return The json value of json object + */ + UFUNCTION(BlueprintPure, meta = (DisplayName = "ToJsonValue (JsonObject)", CompactNodeTitle = "ToValue", BlueprintAutocast, NativeBreakFunc), Category = "Json|Convert") + static FBlueprintJsonValue Conv_JsonObjectToJsonValue(const FBlueprintJsonObject& JsonObject, const FString& FieldName); + + /** + * Convert json object to json string + * + * @param JsonObject The json object to convert + * @return The json string + */ + UFUNCTION(BlueprintPure, meta = (DisplayName = "ToString (JsonObject)", CompactNodeTitle = "ToString", BlueprintAutocast, NativeBreakFunc), Category = "Json|Convert") + static FString Conv_JsonObjectToString(const FBlueprintJsonObject& JsonObject); + + /** + * Convert json object to pretty print json string + * + * @param JsonObject The json object to convert + * @return The json string + */ + UFUNCTION(BlueprintPure, meta = (DisplayName = "ToPrettyString (JsonObject)", CompactNodeTitle = "ToPrettyString", NativeBreakFunc), Category = "Json|Convert") + static FString Conv_JsonObjectToPrettyString(const FBlueprintJsonObject& JsonObject); + + /** + * Convert json string to json object + * + * @param JsonString The string to convert + * @return The json object + */ + UFUNCTION(BlueprintPure, meta = (DisplayName = "ToJsonObject (String)", CompactNodeTitle = "ToJson"), Category = "Json|Convert") + static FBlueprintJsonObject Conv_StringToJsonObject(const FString& JsonString); + + /** + * Creates a json value string + * + * @param Value value to set the string to + * @return The blueprint json value + */ + UFUNCTION(BlueprintPure, Category = "Json|Make", meta=(NativeMakeFunc)) + static FBlueprintJsonValue JsonMakeString(const FString& Value); + + /** + * Creates a json value int + * + * @param Value value to set the int to + * @return The blueprint json value + */ + UFUNCTION(BlueprintPure, Category = "Json|Make", meta = (NativeMakeFunc)) + static FBlueprintJsonValue JsonMakeInt(int Value); + + /** + * Creates a json value float + * + * @param Value value to set the float to + * @return The blueprint json value + */ + UFUNCTION(BlueprintPure, Category = "Json|Make", meta = (NativeMakeFunc)) + static FBlueprintJsonValue JsonMakeFloat(float Value); + + /** + * Creates a json value bool + + * @param Value value to set the bool to + * @return The blueprint json value + */ + UFUNCTION(BlueprintPure, Category = "Json|Make", meta = (NativeMakeFunc)) + static FBlueprintJsonValue JsonMakeBool(bool Value); + + /** + * Creates a json value array + * + * @param Value value to set the array to + * @return The blueprint json value + */ + UFUNCTION(BlueprintPure, Category = "Json|Make", meta = (NativeMakeFunc)) + static FBlueprintJsonValue JsonMakeArray(const TArray& Value); + + /** + * Creates a json value object + * + * @param Value value to set the json object to + * @return The blueprint json value + */ + UFUNCTION(BlueprintPure, Category = "Json|Make", meta = (NativeMakeFunc)) + static FBlueprintJsonValue JsonMakeObject(const FBlueprintJsonObject& Value); + + /** + * Creates a json value null + * + * @return The blueprint json value + */ + UFUNCTION(BlueprintPure, Category = "Json|Make", meta = (NativeMakeFunc)) + static FBlueprintJsonValue JsonMakeNull(); + + /** Return the type of json value */ + UFUNCTION(BlueprintPure, Category = "Json|Value") + static EJsonType JsonType(const FBlueprintJsonValue& JsonValue); + + /** Return true if the json value is null, false otherwise */ + UFUNCTION(BlueprintPure, Category = "Json|Value") + static bool JsonIsNull(const FBlueprintJsonValue& JsonValue); + + /** Returns true if the values are equal (A == B) */ + UFUNCTION(BlueprintPure, meta = (DisplayName = "Equal (JsonValue)", CompactNodeTitle = "=="), Category = "Json|Value") + static bool EquaEqual_JsonValue(const FBlueprintJsonValue& A, const FBlueprintJsonValue& B); + + /** Returns true if the values are not equal (A != B) */ + UFUNCTION(BlueprintPure, meta = (DisplayName = "NotEqual (JsonValue)", CompactNodeTitle = "!="), Category = "Json|Value") + static bool NotEqual_JsonValue(const FBlueprintJsonValue& A, const FBlueprintJsonValue& B); + + /** Converts an json value into an string */ + UFUNCTION(BlueprintPure, meta = (DisplayName = "ToString (JsonValue)", CompactNodeTitle = "->", BlueprintAutocast, NativeBreakFunc), Category = "Json|Value") + static FString Conv_JsonValueToString(const FBlueprintJsonValue& JsonValue); + + /** Converts an json value into an int */ + UFUNCTION(BlueprintPure, meta = (DisplayName = "ToInteger (JsonValue)", CompactNodeTitle = "->", BlueprintAutocast, NativeBreakFunc), Category = "Json|Value") + static int Conv_JsonValueToInteger(const FBlueprintJsonValue& JsonValue); + + /** Converts an json value into an float */ + UFUNCTION(BlueprintPure, meta = (DisplayName = "ToFloat (JsonValue)", CompactNodeTitle = "->", BlueprintAutocast, NativeBreakFunc), Category = "Json|Value") + static float Conv_JsonValueToFloat(const FBlueprintJsonValue& JsonValue); + + /** Converts an json value into an bool */ + UFUNCTION(BlueprintPure, meta = (DisplayName = "ToBool (JsonValue)", CompactNodeTitle = "->", BlueprintAutocast, NativeBreakFunc), Category = "Json|Value") + static bool Conv_JsonValueToBool(const FBlueprintJsonValue& JsonValue); + + /** Converts an json value into an array of json value */ + UFUNCTION(BlueprintPure, meta = (DisplayName = "ToArray (JsonValue)", CompactNodeTitle = "->", BlueprintAutocast, NativeBreakFunc), Category = "Json|Value") + static TArray Conv_JsonValueToArray(const FBlueprintJsonValue& JsonValue); + + /** Converts an json value into an json object */ + UFUNCTION(BlueprintPure, meta = (DisplayName = "ToJsonObject (JsonValue)", CompactNodeTitle = "->", BlueprintAutocast, NativeBreakFunc), Category = "Json|Value") + static FBlueprintJsonObject Conv_JsonValueToObject(const FBlueprintJsonValue& JsonValue); +}; \ No newline at end of file diff --git a/Plugins/BlueprintJson/Source/BlueprintJson/Private/BlueprintJsonLibrary.cpp b/Plugins/BlueprintJson/Source/BlueprintJson/Private/BlueprintJsonLibrary.cpp new file mode 100644 index 0000000..17c19e2 --- /dev/null +++ b/Plugins/BlueprintJson/Source/BlueprintJson/Private/BlueprintJsonLibrary.cpp @@ -0,0 +1,287 @@ +// Copyright 2018 Maksim Shestakov. All Rights Reserved. + +#include "BlueprintJsonLibrary.h" + +#include "Dom/JsonObject.h" +#include "Serialization/JsonWriter.h" +#include "Serialization/JsonReader.h" +#include "Serialization/JsonSerializer.h" +#include "Policies/CondensedJsonPrintPolicy.h" + +typedef TSharedPtr FJsonObjectPtr; +typedef TSharedPtr FJsonValuePtr; + +FBlueprintJsonObject UBlueprintJsonLibrary::JsonMake() +{ + FBlueprintJsonObject Object; + Object.Object = MakeShareable(new FJsonObject); + return Object; +} + +const FBlueprintJsonObject& UBlueprintJsonLibrary::JsonSetField(const FBlueprintJsonObject& JsonObject, const FString& FieldName, const FBlueprintJsonValue& JsonValue) +{ + if (JsonObject.Object.IsValid() && JsonValue.Value.IsValid()) + { + JsonObject.Object->SetField(FieldName, JsonValue.Value); + } + return JsonObject; +} + +bool UBlueprintJsonLibrary::JsonHasField(const FBlueprintJsonObject& JsonObject, const FString& FieldName) +{ + if (JsonObject.Object.IsValid()) + { + return JsonObject.Object->HasField(FieldName); + } + return false; +} + +bool UBlueprintJsonLibrary::JsonHasTypedField(const FBlueprintJsonObject& JsonObject, const FString& FieldName, EJsonType Type) +{ + if (JsonObject.Object.IsValid()) + { + if (JsonObject.Object->HasField(FieldName)) + { + return JsonObject.Object->GetField(FieldName)->Type == (EJson)Type; + } + } + return false; +} + +const FBlueprintJsonObject& UBlueprintJsonLibrary::JsonRemoveField(const FBlueprintJsonObject& JsonObject, const FString& FieldName) +{ + if (JsonObject.Object.IsValid()) + { + JsonObject.Object->RemoveField(FieldName); + } + return JsonObject; +} + +FBlueprintJsonValue UBlueprintJsonLibrary::Conv_JsonObjectToJsonValue(const FBlueprintJsonObject& JsonObject, const FString& FieldName) +{ + FBlueprintJsonValue Value; + if (JsonObject.Object.IsValid()) + { + Value.Value = JsonObject.Object->GetField(FieldName); + } + return Value; +} + +FString UBlueprintJsonLibrary::Conv_JsonObjectToString(const FBlueprintJsonObject& JsonObject) +{ + FString Result; + if (JsonObject.Object.IsValid()) + { + TSharedRef>> JsonWriter = TJsonWriterFactory>::Create(&Result, 0); + FJsonSerializer::Serialize(JsonObject.Object.ToSharedRef(), JsonWriter); + } + return Result; +} + +FString UBlueprintJsonLibrary::Conv_JsonObjectToPrettyString(const FBlueprintJsonObject& JsonObject) +{ + FString Result; + if (JsonObject.Object.IsValid()) + { + TSharedRef> JsonWriter = TJsonWriterFactory<>::Create(&Result, 0); + FJsonSerializer::Serialize(JsonObject.Object.ToSharedRef(), JsonWriter); + } + return Result; +} + +FBlueprintJsonObject UBlueprintJsonLibrary::Conv_StringToJsonObject(const FString& JsonString) +{ + FBlueprintJsonObject Object; + TSharedRef> Reader = TJsonReaderFactory<>::Create(JsonString); + FJsonSerializer::Deserialize(Reader, Object.Object); + return Object; +} + +const FBlueprintJsonObject& UBlueprintJsonLibrary::JsonMakeField(const FBlueprintJsonObject& JsonObject, const FString& FieldName, const FBlueprintJsonValue& JsonValue) +{ + if (JsonObject.Object.IsValid() && JsonValue.Value.IsValid()) + { + JsonObject.Object->SetField(FieldName, JsonValue.Value); + } + return JsonObject; +} + +FBlueprintJsonValue UBlueprintJsonLibrary::JsonMakeString(const FString& StringValue) +{ + FBlueprintJsonValue Value; + Value.Value = MakeShareable(new FJsonValueString(StringValue)); + return Value; +} + +FBlueprintJsonValue UBlueprintJsonLibrary::JsonMakeInt(int IntValue) +{ + FBlueprintJsonValue Value; + Value.Value = MakeShareable(new FJsonValueNumber(IntValue)); + return Value; +} + +FBlueprintJsonValue UBlueprintJsonLibrary::JsonMakeFloat(float FloatValue) +{ + FBlueprintJsonValue Value; + Value.Value = MakeShareable(new FJsonValueNumber(FloatValue)); + return Value; +} + +FBlueprintJsonValue UBlueprintJsonLibrary::JsonMakeBool(bool BoolValue) +{ + FBlueprintJsonValue Value; + Value.Value = MakeShareable(new FJsonValueBoolean(BoolValue)); + return Value; +} + +FBlueprintJsonValue UBlueprintJsonLibrary::JsonMakeArray(const TArray& ArrayValue) +{ + FBlueprintJsonValue Value; + TArray Array; + for (const FBlueprintJsonValue& V : ArrayValue) + { + if (V.Value.IsValid()) + { + Array.Add(V.Value); + } + } + Value.Value = MakeShareable(new FJsonValueArray(Array)); + return Value; +} + +FBlueprintJsonValue UBlueprintJsonLibrary::JsonMakeObject(const FBlueprintJsonObject& ObjectValue) +{ + FBlueprintJsonValue Value; + Value.Value = MakeShareable(new FJsonValueObject(ObjectValue.Object)); + return Value; +} + +FBlueprintJsonValue UBlueprintJsonLibrary::JsonMakeNull() +{ + FBlueprintJsonValue Value; + Value.Value = MakeShareable(new FJsonValueNull()); + return Value; +} + +EJsonType UBlueprintJsonLibrary::JsonType(const FBlueprintJsonValue& JsonValue) +{ + if (JsonValue.Value.IsValid()) + { + return (EJsonType)JsonValue.Value->Type; + } + return EJsonType::None; +} + +bool UBlueprintJsonLibrary::JsonIsNull(const FBlueprintJsonValue& JsonValue) +{ + if (JsonValue.Value.IsValid()) + { + return JsonValue.Value->IsNull(); + } + return true; +} + +bool UBlueprintJsonLibrary::EquaEqual_JsonValue(const FBlueprintJsonValue& A, const FBlueprintJsonValue& B) +{ + if (A.Value.IsValid() != B.Value.IsValid()) + { + return false; + } + + if (A.Value.IsValid() && B.Value.IsValid()) + { + if (!FJsonValue::CompareEqual(*A.Value, *B.Value)) + { + return false; + } + } + + return true; +} + +bool UBlueprintJsonLibrary::NotEqual_JsonValue(const FBlueprintJsonValue& A, const FBlueprintJsonValue& B) +{ + if (A.Value.IsValid() != B.Value.IsValid()) + { + return true; + } + + if (A.Value.IsValid() && B.Value.IsValid()) + { + if (!FJsonValue::CompareEqual(*A.Value, *B.Value)) + { + return true; + } + } + + return false; +} + +FString UBlueprintJsonLibrary::Conv_JsonValueToString(const FBlueprintJsonValue& JsonValue) +{ + if (JsonValue.Value.IsValid()) + { + return JsonValue.Value->AsString(); + } + FString Empty; + return Empty; +} + +int UBlueprintJsonLibrary::Conv_JsonValueToInteger(const FBlueprintJsonValue& JsonValue) +{ + if (JsonValue.Value.IsValid()) + { + int Result = 0; + JsonValue.Value->TryGetNumber(Result); + return Result; + } + return 0; +} + +float UBlueprintJsonLibrary::Conv_JsonValueToFloat(const FBlueprintJsonValue& JsonValue) +{ + if (JsonValue.Value.IsValid()) + { + return JsonValue.Value->AsNumber(); + } + return 0.0f; +} + +bool UBlueprintJsonLibrary::Conv_JsonValueToBool(const FBlueprintJsonValue& JsonValue) +{ + if (JsonValue.Value.IsValid()) + { + return JsonValue.Value->AsBool(); + } + return false; +} + +TArray UBlueprintJsonLibrary::Conv_JsonValueToArray(const FBlueprintJsonValue& JsonValue) +{ + TArray Result; + + if (JsonValue.Value.IsValid()) + { + if (JsonValue.Value->Type == EJson::Array) + { + for (const auto& Val : JsonValue.Value->AsArray()) + { + FBlueprintJsonValue Tmp; + Tmp.Value = Val; + Result.Add(Tmp); + } + } + } + + return Result; +} + +FBlueprintJsonObject UBlueprintJsonLibrary::Conv_JsonValueToObject(const FBlueprintJsonValue& JsonValue) +{ + FBlueprintJsonObject Object; + if (JsonValue.Value.IsValid()) + { + Object.Object = JsonValue.Value->AsObject(); + } + return Object; +} \ No newline at end of file diff --git a/Plugins/BlueprintJson/Source/BlueprintJson/Private/BlueprintJsonModule.cpp b/Plugins/BlueprintJson/Source/BlueprintJson/Private/BlueprintJsonModule.cpp new file mode 100644 index 0000000..9e0cfc4 --- /dev/null +++ b/Plugins/BlueprintJson/Source/BlueprintJson/Private/BlueprintJsonModule.cpp @@ -0,0 +1,8 @@ +// Copyright 2018 Maksim Shestakov. All Rights Reserved. + +#include "CoreMinimal.h" +#include "Modules/ModuleInterface.h" +#include "Modules/ModuleManager.h" + + +IMPLEMENT_MODULE(IModuleInterface, BlueprintJson) \ No newline at end of file diff --git a/Plugins/DarkerNodes/Config/FilterPlugin.ini b/Plugins/DarkerNodes/Config/FilterPlugin.ini new file mode 100644 index 0000000..c504ca0 --- /dev/null +++ b/Plugins/DarkerNodes/Config/FilterPlugin.ini @@ -0,0 +1,6 @@ +[FilterPlugin] +/Config/ +/Content/ +/Resources/ +/Shaders/ +/Source/ diff --git a/Plugins/DarkerNodes/Content/Materials/Box.uasset b/Plugins/DarkerNodes/Content/Materials/Box.uasset new file mode 100644 index 0000000..dacba9b --- /dev/null +++ b/Plugins/DarkerNodes/Content/Materials/Box.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:87d82237312e9aefca5c78ec3fc43e1ae09a8edfb2666de481d4c7d2d21688be +size 25960 diff --git a/Plugins/DarkerNodes/Content/Materials/Button.uasset b/Plugins/DarkerNodes/Content/Materials/Button.uasset new file mode 100644 index 0000000..2a427d6 --- /dev/null +++ b/Plugins/DarkerNodes/Content/Materials/Button.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6068a7af4fe3fefe2edd9c49e557bd9784841f7b96ce84ec1a50b4a481bfa8b0 +size 21285 diff --git a/Plugins/DarkerNodes/Content/Materials/ButtonCut.uasset b/Plugins/DarkerNodes/Content/Materials/ButtonCut.uasset new file mode 100644 index 0000000..2c48037 --- /dev/null +++ b/Plugins/DarkerNodes/Content/Materials/ButtonCut.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:54cb2f16ec3670ef34bbec19981537d36082a7ef2025c12780da8382d7ae3f01 +size 20995 diff --git a/Plugins/DarkerNodes/Content/Materials/CenterUVs.uasset b/Plugins/DarkerNodes/Content/Materials/CenterUVs.uasset new file mode 100644 index 0000000..3a50187 --- /dev/null +++ b/Plugins/DarkerNodes/Content/Materials/CenterUVs.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1fa8ef13d7222670c5d85302d8633ccf6b7fd67fbae1ad0576fc5905a9a63cde +size 14538 diff --git a/Plugins/DarkerNodes/Content/Materials/HeaderBox.uasset b/Plugins/DarkerNodes/Content/Materials/HeaderBox.uasset new file mode 100644 index 0000000..8e15996 --- /dev/null +++ b/Plugins/DarkerNodes/Content/Materials/HeaderBox.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f53f86a7a7a87ecaa3bd11a515ddba022911f3e2a38bd3ba72de2fc05b7de3cb +size 26121 diff --git a/Plugins/DarkerNodes/Content/Materials/Panel.uasset b/Plugins/DarkerNodes/Content/Materials/Panel.uasset new file mode 100644 index 0000000..b949a98 --- /dev/null +++ b/Plugins/DarkerNodes/Content/Materials/Panel.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0c46df4f0a599f7ee1d4dd5412e2bc991f10421f0f28cfce32f48db7773f3df7 +size 21258 diff --git a/Plugins/DarkerNodes/Content/Materials/SolidColor.uasset b/Plugins/DarkerNodes/Content/Materials/SolidColor.uasset new file mode 100644 index 0000000..8f63863 --- /dev/null +++ b/Plugins/DarkerNodes/Content/Materials/SolidColor.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f3c587bc1521c32449b9598ab9cd55a3f5eafcee6d38ada5e36bf968b18ac166 +size 7533 diff --git a/Plugins/DarkerNodes/DarkerNodes.uplugin b/Plugins/DarkerNodes/DarkerNodes.uplugin new file mode 100644 index 0000000..5c9afa8 --- /dev/null +++ b/Plugins/DarkerNodes/DarkerNodes.uplugin @@ -0,0 +1,35 @@ +{ + "FileVersion": 3, + "Version": 1, + "VersionName": "2.6", + "FriendlyName": "Darker Nodes", + "Description": "Modern theme for the Unreal editor", + "Category": "Editor", + "CreatedBy": "Hugo Attal", + "CreatedByURL": "https://twitter.com/HugoAttal", + "DocsURL": "https://github.com/TheHerobrine/DarkerNodes", + "MarketplaceURL": "com.epicgames.launcher://ue/marketplace/content/4b3441f0228a40ec9ca986489a5bd682", + "SupportURL": "https://forums.unrealengine.com/unreal-engine/marketplace/1840825-darker-nodes-modern-theme-for-the-unreal-editor", + "EngineVersion": "4.27.0", + "CanContainContent": true, + "Installed": true, + "Modules": [ + { + "Name": "DarkerNodes", + "Type": "Editor", + "LoadingPhase": "PostDefault", + "WhitelistPlatforms": [ + "Win64", + "Win32", + "Mac", + "Linux" + ] + } + ], + "Plugins": [ + { + "Name": "Niagara", + "Enabled": true + } + ] +} \ No newline at end of file diff --git a/Plugins/DarkerNodes/Resources/Fonts/BalsamiqSans-Bold.ttf b/Plugins/DarkerNodes/Resources/Fonts/BalsamiqSans-Bold.ttf new file mode 100644 index 0000000..68f7ba3 Binary files /dev/null and b/Plugins/DarkerNodes/Resources/Fonts/BalsamiqSans-Bold.ttf differ diff --git a/Plugins/DarkerNodes/Resources/Fonts/BalsamiqSans-FontLog.txt b/Plugins/DarkerNodes/Resources/Fonts/BalsamiqSans-FontLog.txt new file mode 100644 index 0000000..e38783b --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Fonts/BalsamiqSans-FontLog.txt @@ -0,0 +1,36 @@ + FONTLOG for the Balsamiq Sans fonts +=========================================== +This file provides detailed information on the Balsamiq Sans Font Software. +This information should be distributed along with the Balsamiq Sans fonts +and any derivative works. + +Basic Font Information +=========================================== +Balsamiq Sans is a Unicode typeface family that supports all languages that +use the Latin script and its variants, and could be expanded to support other +scripts. + +Documentation can be found at http://balsamiq.com/products/mockups/font/ + +Licensing Information +=========================================== +Balsamiq Sans Font +(c) 2012 Michael Angeles for Balsamiq, SRL + +This font is licensed under the SIL Open Font License: http://scripts.sil.org/OFL + +Reserved Font Name: Balsamiq + +ChangeLog +=========================================== +05 April 2013 (Giacomo Guilizzoni, Balsamiq) +- Switched font licensing to OFL + +12 January 2013 (Michael Angeles, Balsamiq) +- Tightened kerning pairs + +15 December 2012 (Michael Angeles, Balsamiq) Balsamiq Sans Version 1.0 +- Initial release + +------------------------------------------- +Balsamiq is a small business dedicated to helping rid the World of bad software. Find out more at http://balsamiq.com \ No newline at end of file diff --git a/Plugins/DarkerNodes/Resources/Fonts/BalsamiqSans-Regular.ttf b/Plugins/DarkerNodes/Resources/Fonts/BalsamiqSans-Regular.ttf new file mode 100644 index 0000000..9866297 Binary files /dev/null and b/Plugins/DarkerNodes/Resources/Fonts/BalsamiqSans-Regular.ttf differ diff --git a/Plugins/DarkerNodes/Resources/Fonts/Cannonade-Bold.ttf b/Plugins/DarkerNodes/Resources/Fonts/Cannonade-Bold.ttf new file mode 100644 index 0000000..97453c1 Binary files /dev/null and b/Plugins/DarkerNodes/Resources/Fonts/Cannonade-Bold.ttf differ diff --git a/Plugins/DarkerNodes/Resources/Fonts/Cannonade-Regular.ttf b/Plugins/DarkerNodes/Resources/Fonts/Cannonade-Regular.ttf new file mode 100644 index 0000000..e081d19 Binary files /dev/null and b/Plugins/DarkerNodes/Resources/Fonts/Cannonade-Regular.ttf differ diff --git a/Plugins/DarkerNodes/Resources/Fonts/CaskaydiaCove-Bold.ttf b/Plugins/DarkerNodes/Resources/Fonts/CaskaydiaCove-Bold.ttf new file mode 100644 index 0000000..32bed46 Binary files /dev/null and b/Plugins/DarkerNodes/Resources/Fonts/CaskaydiaCove-Bold.ttf differ diff --git a/Plugins/DarkerNodes/Resources/Fonts/CaskaydiaCove-Regular.ttf b/Plugins/DarkerNodes/Resources/Fonts/CaskaydiaCove-Regular.ttf new file mode 100644 index 0000000..c739512 Binary files /dev/null and b/Plugins/DarkerNodes/Resources/Fonts/CaskaydiaCove-Regular.ttf differ diff --git a/Plugins/DarkerNodes/Resources/Fonts/EudoxusSans-Bold.ttf b/Plugins/DarkerNodes/Resources/Fonts/EudoxusSans-Bold.ttf new file mode 100644 index 0000000..95d0885 Binary files /dev/null and b/Plugins/DarkerNodes/Resources/Fonts/EudoxusSans-Bold.ttf differ diff --git a/Plugins/DarkerNodes/Resources/Fonts/EudoxusSans-Regular.ttf b/Plugins/DarkerNodes/Resources/Fonts/EudoxusSans-Regular.ttf new file mode 100644 index 0000000..f42604e Binary files /dev/null and b/Plugins/DarkerNodes/Resources/Fonts/EudoxusSans-Regular.ttf differ diff --git a/Plugins/DarkerNodes/Resources/Fonts/GolosUI-Bold.ttf b/Plugins/DarkerNodes/Resources/Fonts/GolosUI-Bold.ttf new file mode 100644 index 0000000..ca6e6df Binary files /dev/null and b/Plugins/DarkerNodes/Resources/Fonts/GolosUI-Bold.ttf differ diff --git a/Plugins/DarkerNodes/Resources/Fonts/GolosUI-Regular.ttf b/Plugins/DarkerNodes/Resources/Fonts/GolosUI-Regular.ttf new file mode 100644 index 0000000..5931283 Binary files /dev/null and b/Plugins/DarkerNodes/Resources/Fonts/GolosUI-Regular.ttf differ diff --git a/Plugins/DarkerNodes/Resources/Fonts/Jua-Regular.ttf b/Plugins/DarkerNodes/Resources/Fonts/Jua-Regular.ttf new file mode 100644 index 0000000..582daf5 Binary files /dev/null and b/Plugins/DarkerNodes/Resources/Fonts/Jua-Regular.ttf differ diff --git a/Plugins/DarkerNodes/Resources/Fonts/Junction-Bold.ttf b/Plugins/DarkerNodes/Resources/Fonts/Junction-Bold.ttf new file mode 100644 index 0000000..7ce2fd6 Binary files /dev/null and b/Plugins/DarkerNodes/Resources/Fonts/Junction-Bold.ttf differ diff --git a/Plugins/DarkerNodes/Resources/Fonts/Junction-Regular.ttf b/Plugins/DarkerNodes/Resources/Fonts/Junction-Regular.ttf new file mode 100644 index 0000000..f71eea1 Binary files /dev/null and b/Plugins/DarkerNodes/Resources/Fonts/Junction-Regular.ttf differ diff --git a/Plugins/DarkerNodes/Resources/Fonts/NewTelegraph-Bold.ttf b/Plugins/DarkerNodes/Resources/Fonts/NewTelegraph-Bold.ttf new file mode 100644 index 0000000..8369e25 Binary files /dev/null and b/Plugins/DarkerNodes/Resources/Fonts/NewTelegraph-Bold.ttf differ diff --git a/Plugins/DarkerNodes/Resources/Fonts/NewTelegraph-FontLog.txt b/Plugins/DarkerNodes/Resources/Fonts/NewTelegraph-FontLog.txt new file mode 100644 index 0000000..593d7fd --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Fonts/NewTelegraph-FontLog.txt @@ -0,0 +1,26 @@ +FONTLOG for the New Telegraph fonts + +This file provides detailed information on the New Telegraph Font Software. +This information should be distributed along with the New Telegraph fonts and any derivative works. + +Basic Font Information + +New Telegraph is a Unicode typeface family that supports most languages that use the Latin script and its variants, and could be expanded to support other scripts. + +ChangeLog + +2020 (Frank Baranowski) New Telegraph Family Version 3.001 +- Font Info update + +2011 (Frank Baranowski) New Telegraph Family Version 1.0 +- Font progress and initial release + +Acknowledgements + +If you make modifications be sure to add your name (N), email (E), web-address +(if you have one) (W) and description (D). This list is in alphabetical order. + +N: Frank Baranowski +E: heisenbara@gmail.com +W: +D: Designer - original Roman glyphs diff --git a/Plugins/DarkerNodes/Resources/Fonts/NewTelegraph-Regular.ttf b/Plugins/DarkerNodes/Resources/Fonts/NewTelegraph-Regular.ttf new file mode 100644 index 0000000..9d1e3b1 Binary files /dev/null and b/Plugins/DarkerNodes/Resources/Fonts/NewTelegraph-Regular.ttf differ diff --git a/Plugins/DarkerNodes/Resources/Fonts/XXIIAven-Bold.ttf b/Plugins/DarkerNodes/Resources/Fonts/XXIIAven-Bold.ttf new file mode 100644 index 0000000..9e0e750 Binary files /dev/null and b/Plugins/DarkerNodes/Resources/Fonts/XXIIAven-Bold.ttf differ diff --git a/Plugins/DarkerNodes/Resources/Fonts/XXIIAven-Regular.ttf b/Plugins/DarkerNodes/Resources/Fonts/XXIIAven-Regular.ttf new file mode 100644 index 0000000..11b4cff Binary files /dev/null and b/Plugins/DarkerNodes/Resources/Fonts/XXIIAven-Regular.ttf differ diff --git a/Plugins/DarkerNodes/Resources/Fonts/_Fonts.txt b/Plugins/DarkerNodes/Resources/Fonts/_Fonts.txt new file mode 100644 index 0000000..d6d7bbb --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Fonts/_Fonts.txt @@ -0,0 +1,28 @@ +All fonts are under Open Font Licence. + +Balsamiq Sans - By Balsamiq +https://fontesk.com/balsamiq-sans-typeface/ + +Canonade - By Camille Khubbetdinov +https://fontesk.com/cannonade-font/ + +Caskaydia Cove - By Aaron Bell and Eli Heuer +https://fontesk.com/caskaydia-cove-typeface/ + +Exodus Sans - By Stijn de Vries +https://fontesk.com/eudoxus-sans-typeface/ + +Golos UI - By Paratype +https://fontesk.com/golos-ui-typeface/ + +Jua - By Woowa Brothers +https://fontesk.com/jua-font/ + +Junction - By Tyler Finck +https://fontesk.com/junction-typeface/ + +New Telegraph - By Franck Baranowski +https://fontesk.com/new-telegraph-typeface/ + +XXII Aven - By Lecter Johnson +https://fontesk.com/xxii-aven-typeface/ diff --git a/Plugins/DarkerNodes/Resources/Fonts/_OFL.txt b/Plugins/DarkerNodes/Resources/Fonts/_OFL.txt new file mode 100644 index 0000000..f5ed6fa --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Fonts/_OFL.txt @@ -0,0 +1,91 @@ +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. \ No newline at end of file diff --git a/Plugins/DarkerNodes/Resources/Icon128.png b/Plugins/DarkerNodes/Resources/Icon128.png new file mode 100644 index 0000000..448216a --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Icon128.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0d361ddf166f7141f3e39e2a470a7bd68c3f360f5f3c84fa933db3e159be9581 +size 5145 diff --git a/Plugins/DarkerNodes/Resources/Theme/Blank.png b/Plugins/DarkerNodes/Resources/Theme/Blank.png new file mode 100644 index 0000000..d6f216c --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Blank.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c73222e9295248c64101f2de610f4bc02a512b5600fb7de720840d10bdb13c91 +size 72 diff --git a/Plugins/DarkerNodes/Resources/Theme/Docking/ShowTabwellButton_Hovered.png b/Plugins/DarkerNodes/Resources/Theme/Docking/ShowTabwellButton_Hovered.png new file mode 100644 index 0000000..262bb9a --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Docking/ShowTabwellButton_Hovered.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7fa046f3b0ae78ec79fab8f4e307d0794ccf99a784d455048441f5aafa329153 +size 89 diff --git a/Plugins/DarkerNodes/Resources/Theme/Docking/ShowTabwellButton_Pressed.png b/Plugins/DarkerNodes/Resources/Theme/Docking/ShowTabwellButton_Pressed.png new file mode 100644 index 0000000..05bad23 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Docking/ShowTabwellButton_Pressed.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1c5a9772dd0781c617efdadb540b91f431fdac8e540a18f3014c5dc2d221e7a2 +size 89 diff --git a/Plugins/DarkerNodes/Resources/Theme/Elements/Button/ComboArrow.png b/Plugins/DarkerNodes/Resources/Theme/Elements/Button/ComboArrow.png new file mode 100644 index 0000000..3a63e09 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Elements/Button/ComboArrow.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a9464cc26f4afa38096a8b7b527890be985335cb9fd0bcb89b3749f794600d8a +size 1594 diff --git a/Plugins/DarkerNodes/Resources/Theme/Elements/Button/FlatButton.png b/Plugins/DarkerNodes/Resources/Theme/Elements/Button/FlatButton.png new file mode 100644 index 0000000..281c68e --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Elements/Button/FlatButton.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c5c80a2785330fc54e7880f32f6e427862811c211bd25fe7e99a9aa3f86a3936 +size 113 diff --git a/Plugins/DarkerNodes/Resources/Theme/Elements/Button/_save_solid/ComboArrow.png b/Plugins/DarkerNodes/Resources/Theme/Elements/Button/_save_solid/ComboArrow.png new file mode 100644 index 0000000..ac8fbe3 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Elements/Button/_save_solid/ComboArrow.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1782b2d52edf0a61b378328b2dc9192abc16229fb5acb3fe15b2bf20d5e67f76 +size 85 diff --git a/Plugins/DarkerNodes/Resources/Theme/Elements/Checkbox/CheckBox.png b/Plugins/DarkerNodes/Resources/Theme/Elements/Checkbox/CheckBox.png new file mode 100644 index 0000000..42cb7bf --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Elements/Checkbox/CheckBox.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f42770ab9445ba65829992477e613c52acd3248aed67c1bd548c0e99b5c282df +size 125 diff --git a/Plugins/DarkerNodes/Resources/Theme/Elements/Checkbox/CheckBox_Checked.png b/Plugins/DarkerNodes/Resources/Theme/Elements/Checkbox/CheckBox_Checked.png new file mode 100644 index 0000000..0b02ccf --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Elements/Checkbox/CheckBox_Checked.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0ee1f253ffb870d26e90928a38aabd39dab3111df7c1717b1cbccf6bbc32208a +size 197 diff --git a/Plugins/DarkerNodes/Resources/Theme/Elements/Checkbox/CheckBox_Checked_Hovered.png b/Plugins/DarkerNodes/Resources/Theme/Elements/Checkbox/CheckBox_Checked_Hovered.png new file mode 100644 index 0000000..22dff5c --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Elements/Checkbox/CheckBox_Checked_Hovered.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f24fa90a19f83f9588467d01b87b8ec045b9f5621a8081525a0bbbee7db27041 +size 198 diff --git a/Plugins/DarkerNodes/Resources/Theme/Elements/Checkbox/CheckBox_Hovered.png b/Plugins/DarkerNodes/Resources/Theme/Elements/Checkbox/CheckBox_Hovered.png new file mode 100644 index 0000000..07c0d3c --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Elements/Checkbox/CheckBox_Hovered.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cc86b06b1167fd9dc974e71f3da6d50bbdb37686f02f9d7d4ca088f1adeb0357 +size 126 diff --git a/Plugins/DarkerNodes/Resources/Theme/Elements/Checkbox/CheckBox_Undetermined.png b/Plugins/DarkerNodes/Resources/Theme/Elements/Checkbox/CheckBox_Undetermined.png new file mode 100644 index 0000000..4ad1c66 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Elements/Checkbox/CheckBox_Undetermined.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4607dfd913c3956cd4015c15351b719d528b826d36a28f815f075c36af511e6a +size 133 diff --git a/Plugins/DarkerNodes/Resources/Theme/Elements/Checkbox/CheckBox_Undetermined_Hovered.png b/Plugins/DarkerNodes/Resources/Theme/Elements/Checkbox/CheckBox_Undetermined_Hovered.png new file mode 100644 index 0000000..fff7002 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Elements/Checkbox/CheckBox_Undetermined_Hovered.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ae89978c4a7b220fc610d31a2a30bf6caea47325c05d1ab7860fd61d673b26d6 +size 134 diff --git a/Plugins/DarkerNodes/Resources/Theme/Elements/Checkbox/RadioButton.png b/Plugins/DarkerNodes/Resources/Theme/Elements/Checkbox/RadioButton.png new file mode 100644 index 0000000..57ca3b6 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Elements/Checkbox/RadioButton.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:371c8b464c19c0926cd42ab9c717751f1266c9e51b0cac5e1e82b274afe24cf1 +size 181 diff --git a/Plugins/DarkerNodes/Resources/Theme/Elements/Checkbox/RadioButton_Checked.png b/Plugins/DarkerNodes/Resources/Theme/Elements/Checkbox/RadioButton_Checked.png new file mode 100644 index 0000000..db9621e --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Elements/Checkbox/RadioButton_Checked.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b7d762d3110751436df08e52829f8add3f2971d2d6a89fdc22a94dbe88389076 +size 203 diff --git a/Plugins/DarkerNodes/Resources/Theme/Elements/Checkbox/RadioButton_Checked_Hovered.png b/Plugins/DarkerNodes/Resources/Theme/Elements/Checkbox/RadioButton_Checked_Hovered.png new file mode 100644 index 0000000..eee344c --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Elements/Checkbox/RadioButton_Checked_Hovered.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aa0958f438490f4fdde2fb529fd94c2b567c71851746f38b55610e651dd5bf3d +size 209 diff --git a/Plugins/DarkerNodes/Resources/Theme/Elements/Checkbox/RadioButton_Hovered.png b/Plugins/DarkerNodes/Resources/Theme/Elements/Checkbox/RadioButton_Hovered.png new file mode 100644 index 0000000..325a460 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Elements/Checkbox/RadioButton_Hovered.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5545e0814ff974d00e7228b5d9ab1c0d5769a00b62feab04fd74f55d8f188073 +size 184 diff --git a/Plugins/DarkerNodes/Resources/Theme/Elements/Panel/CloseApp_Hovered.png b/Plugins/DarkerNodes/Resources/Theme/Elements/Panel/CloseApp_Hovered.png new file mode 100644 index 0000000..f4ecd61 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Elements/Panel/CloseApp_Hovered.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:704c10784fb87cc323c6dcd0d5f385446d75c94937930588f508bba14b36f5cc +size 162 diff --git a/Plugins/DarkerNodes/Resources/Theme/Elements/Panel/CloseApp_Normal.png b/Plugins/DarkerNodes/Resources/Theme/Elements/Panel/CloseApp_Normal.png new file mode 100644 index 0000000..969060a --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Elements/Panel/CloseApp_Normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:643f8f711f30d960aa18ec4e94fe6d0732b75eac8655ae3a53ba6592f136f536 +size 146 diff --git a/Plugins/DarkerNodes/Resources/Theme/Elements/Panel/CloseApp_Pressed.png b/Plugins/DarkerNodes/Resources/Theme/Elements/Panel/CloseApp_Pressed.png new file mode 100644 index 0000000..1cc82b3 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Elements/Panel/CloseApp_Pressed.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:876bdeb54bd24a0c36c97ec6af69a11f0869ec7de465542e68cec74d8dccab1d +size 162 diff --git a/Plugins/DarkerNodes/Resources/Theme/Elements/Pin/ExecPin_Connected.png b/Plugins/DarkerNodes/Resources/Theme/Elements/Pin/ExecPin_Connected.png new file mode 100644 index 0000000..2946acc --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Elements/Pin/ExecPin_Connected.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:de0d1132ac905d518bf053785a85fd8368b66f196d9489ad42933fd69577be2a +size 148 diff --git a/Plugins/DarkerNodes/Resources/Theme/Elements/Pin/ExecPin_Disconnected.png b/Plugins/DarkerNodes/Resources/Theme/Elements/Pin/ExecPin_Disconnected.png new file mode 100644 index 0000000..4b01b4c --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Elements/Pin/ExecPin_Disconnected.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ba103e7f8181a13c569f5af38dbb56d2419c81d2cba31db10f63cb8a848b4d02 +size 140 diff --git a/Plugins/DarkerNodes/Resources/Theme/Elements/Pin/ExecutionBubble.png b/Plugins/DarkerNodes/Resources/Theme/Elements/Pin/ExecutionBubble.png new file mode 100644 index 0000000..2e766fc --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Elements/Pin/ExecutionBubble.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cb934fec975d32482192f62102c41f91fb5156e2511216285dc6657cc1e5b3d1 +size 162 diff --git a/Plugins/DarkerNodes/Resources/Theme/Elements/Pin/Pin_connected.png b/Plugins/DarkerNodes/Resources/Theme/Elements/Pin/Pin_connected.png new file mode 100644 index 0000000..fcf39e2 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Elements/Pin/Pin_connected.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:64036a8fb0e4863936d261e470d3108887787a93124697080149e257e14b3afe +size 166 diff --git a/Plugins/DarkerNodes/Resources/Theme/Elements/Pin/Pin_connected_VarA.png b/Plugins/DarkerNodes/Resources/Theme/Elements/Pin/Pin_connected_VarA.png new file mode 100644 index 0000000..1f0b7d6 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Elements/Pin/Pin_connected_VarA.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a59d05eafdf9923e2f59aa3752bf26230370ae36386c539ceedc00e908d5c564 +size 190 diff --git a/Plugins/DarkerNodes/Resources/Theme/Elements/Pin/Pin_disconnected.png b/Plugins/DarkerNodes/Resources/Theme/Elements/Pin/Pin_disconnected.png new file mode 100644 index 0000000..b639edd --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Elements/Pin/Pin_disconnected.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8f2cce81dddad925e8c8807999cffd88bb2224f6554df4d0f56ca18b0f9e6d92 +size 162 diff --git a/Plugins/DarkerNodes/Resources/Theme/Elements/Pin/Pin_disconnected_VarA.png b/Plugins/DarkerNodes/Resources/Theme/Elements/Pin/Pin_disconnected_VarA.png new file mode 100644 index 0000000..10a3591 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Elements/Pin/Pin_disconnected_VarA.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6cbb7bfcf5191e158494629e74786b15086548854f52048f89d36f3d5565bfd6 +size 185 diff --git a/Plugins/DarkerNodes/Resources/Theme/Elements/Table/DropZoneIndicator_Above.png b/Plugins/DarkerNodes/Resources/Theme/Elements/Table/DropZoneIndicator_Above.png new file mode 100644 index 0000000..adf3fcf --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Elements/Table/DropZoneIndicator_Above.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0c4c6c2955a5706db1012608ed1c21d759d17768ded2b75ec313a089d3511c5e +size 169 diff --git a/Plugins/DarkerNodes/Resources/Theme/Elements/Table/DropZoneIndicator_Below.png b/Plugins/DarkerNodes/Resources/Theme/Elements/Table/DropZoneIndicator_Below.png new file mode 100644 index 0000000..df31a31 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Elements/Table/DropZoneIndicator_Below.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4cdccc32e936b92a87de18b5d06b18d9bf3ad079640434ebfce05e8d4b2469df +size 168 diff --git a/Plugins/DarkerNodes/Resources/Theme/Elements/Table/DropZoneIndicator_Onto.png b/Plugins/DarkerNodes/Resources/Theme/Elements/Table/DropZoneIndicator_Onto.png new file mode 100644 index 0000000..4c5efdc --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Elements/Table/DropZoneIndicator_Onto.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:71548648c8383701b613f6643e92ed04186d49374e07beca70dc7cfa59d18b57 +size 102 diff --git a/Plugins/DarkerNodes/Resources/Theme/Elements/Table/Selector.png b/Plugins/DarkerNodes/Resources/Theme/Elements/Table/Selector.png new file mode 100644 index 0000000..a6d5389 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Elements/Table/Selector.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9bbba4fd8c722c2f5bcb98786e76ad5ed643b860606f8347d2b29c61f5e630b7 +size 84 diff --git a/Plugins/DarkerNodes/Resources/Theme/Elements/Textbox/DownArrow.png b/Plugins/DarkerNodes/Resources/Theme/Elements/Textbox/DownArrow.png new file mode 100644 index 0000000..2ae4fee --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Elements/Textbox/DownArrow.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1a815ddf54a751149a6dbfb8624853024c202c6ee79ddf120a36a4d3f586a449 +size 1594 diff --git a/Plugins/DarkerNodes/Resources/Theme/Elements/Textbox/SearchGlass.png b/Plugins/DarkerNodes/Resources/Theme/Elements/Textbox/SearchGlass.png new file mode 100644 index 0000000..3750275 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Elements/Textbox/SearchGlass.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1725114d132281432abd69f0d45088788f778aef1cdbe454ccb70f0ed4677ff5 +size 1733 diff --git a/Plugins/DarkerNodes/Resources/Theme/Elements/Textbox/SpinArrows.png b/Plugins/DarkerNodes/Resources/Theme/Elements/Textbox/SpinArrows.png new file mode 100644 index 0000000..ee49af9 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Elements/Textbox/SpinArrows.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:95c07bccfb2d04604eaba3e9f57028bd3c481015c68afd5bfb23a10aebebeeda +size 1623 diff --git a/Plugins/DarkerNodes/Resources/Theme/Elements/Textbox/TextBlockHighlightShape.png b/Plugins/DarkerNodes/Resources/Theme/Elements/Textbox/TextBlockHighlightShape.png new file mode 100644 index 0000000..a0b9fd2 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Elements/Textbox/TextBlockHighlightShape.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:79dc7354268f5fd942b3e1e48acc87458a138c09d88461f540969d40b00efc95 +size 95 diff --git a/Plugins/DarkerNodes/Resources/Theme/Elements/Textbox/TextBlockHighlightShape_Empty.png b/Plugins/DarkerNodes/Resources/Theme/Elements/Textbox/TextBlockHighlightShape_Empty.png new file mode 100644 index 0000000..1127d94 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Elements/Textbox/TextBlockHighlightShape_Empty.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5cc8ae529d1fc86218d9e21b39cc24a437910fedb44efe93d7f63d265bfcae27 +size 104 diff --git a/Plugins/DarkerNodes/Resources/Theme/Elements/Textbox/UpArrow.png b/Plugins/DarkerNodes/Resources/Theme/Elements/Textbox/UpArrow.png new file mode 100644 index 0000000..707e2a8 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Elements/Textbox/UpArrow.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c76ed72c99d1c710c6c498b6e2f04beceb0a60779fa023baeda539d8348e0255 +size 1595 diff --git a/Plugins/DarkerNodes/Resources/Theme/Elements/Textbox/X.png b/Plugins/DarkerNodes/Resources/Theme/Elements/Textbox/X.png new file mode 100644 index 0000000..23bce6e --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Elements/Textbox/X.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:229e061939776314e839de48569ad38281d6947cf96cd710a9ec6d467ca365c0 +size 145 diff --git a/Plugins/DarkerNodes/Resources/Theme/Elements/Textbox/_save_solid/DownArrow.png b/Plugins/DarkerNodes/Resources/Theme/Elements/Textbox/_save_solid/DownArrow.png new file mode 100644 index 0000000..ac8fbe3 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Elements/Textbox/_save_solid/DownArrow.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1782b2d52edf0a61b378328b2dc9192abc16229fb5acb3fe15b2bf20d5e67f76 +size 85 diff --git a/Plugins/DarkerNodes/Resources/Theme/Elements/Textbox/_save_solid/SearchGlass.png b/Plugins/DarkerNodes/Resources/Theme/Elements/Textbox/_save_solid/SearchGlass.png new file mode 100644 index 0000000..5666ae0 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Elements/Textbox/_save_solid/SearchGlass.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e8b03a0bcf20aab1a83b9336a067fb1631c7f45c25829a7c0b875659e4c93288 +size 228 diff --git a/Plugins/DarkerNodes/Resources/Theme/Elements/Textbox/_save_solid/SpinArrows.png b/Plugins/DarkerNodes/Resources/Theme/Elements/Textbox/_save_solid/SpinArrows.png new file mode 100644 index 0000000..283de26 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Elements/Textbox/_save_solid/SpinArrows.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5426f449f569b4515c51c3959cfd9c001719d8b9340e7735feb878a993d90d1c +size 120 diff --git a/Plugins/DarkerNodes/Resources/Theme/Elements/Textbox/_save_solid/UpArrow.png b/Plugins/DarkerNodes/Resources/Theme/Elements/Textbox/_save_solid/UpArrow.png new file mode 100644 index 0000000..028bda5 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Elements/Textbox/_save_solid/UpArrow.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ae39bb2db7e1733b8d9873757ac6da27a1e0b5175a0e2fafd2e0140cccb2e81e +size 90 diff --git a/Plugins/DarkerNodes/Resources/Theme/Graph/CollapsedNode_Body_ColorSpill.png b/Plugins/DarkerNodes/Resources/Theme/Graph/CollapsedNode_Body_ColorSpill.png new file mode 100644 index 0000000..7e41f84 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Graph/CollapsedNode_Body_ColorSpill.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:38b21038a4eb7fdb01b708e8fb08fde9c77af847e61f77b27ea9a9bbd799349f +size 245 diff --git a/Plugins/DarkerNodes/Resources/Theme/Graph/CommentBubble.png b/Plugins/DarkerNodes/Resources/Theme/Graph/CommentBubble.png new file mode 100644 index 0000000..bed42ba --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Graph/CommentBubble.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:75533dce16af7bcaf2585ade093effef70b871d924792fb39e2cac5defdf11e2 +size 1490 diff --git a/Plugins/DarkerNodes/Resources/Theme/Graph/CommentBubbleArrow.png b/Plugins/DarkerNodes/Resources/Theme/Graph/CommentBubbleArrow.png new file mode 100644 index 0000000..b3c9c20 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Graph/CommentBubbleArrow.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a36e80061172d82e26ea9f284df1ff33b175e5bb30afdecbcf73d6eb5dc94a6a +size 1479 diff --git a/Plugins/DarkerNodes/Resources/Theme/Graph/Comment_Background.png b/Plugins/DarkerNodes/Resources/Theme/Graph/Comment_Background.png new file mode 100644 index 0000000..54c92d8 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Graph/Comment_Background.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:257a4faa3625a6825e212a18d4d9cf59fed0aad6b7a754849fbd761668de1b4c +size 203 diff --git a/Plugins/DarkerNodes/Resources/Theme/Graph/ExecutionBubble.png b/Plugins/DarkerNodes/Resources/Theme/Graph/ExecutionBubble.png new file mode 100644 index 0000000..83485ba --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Graph/ExecutionBubble.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5fc6e742a1950ce2766b147bc2098dd46f0b1b75312d5ff85e5cc6f9ba7b32de +size 174 diff --git a/Plugins/DarkerNodes/Resources/Theme/Graph/GraphPanel_SolidBackground.png b/Plugins/DarkerNodes/Resources/Theme/Graph/GraphPanel_SolidBackground.png new file mode 100644 index 0000000..d71bdeb --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Graph/GraphPanel_SolidBackground.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:11595ec30a12fc1918e00728b43750b38eaab9f007ea07d8a118222a83bf31e4 +size 72 diff --git a/Plugins/DarkerNodes/Resources/Theme/Graph/RegularNode_color_spill.png b/Plugins/DarkerNodes/Resources/Theme/Graph/RegularNode_color_spill.png new file mode 100644 index 0000000..87d26a8 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Graph/RegularNode_color_spill.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f03add23007698eef4bf15bc224faedc99ccb8cc55701247314634232d1f1f97 +size 161 diff --git a/Plugins/DarkerNodes/Resources/Theme/Graph/RegularNode_color_spill_424.png b/Plugins/DarkerNodes/Resources/Theme/Graph/RegularNode_color_spill_424.png new file mode 100644 index 0000000..d8c4c61 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Graph/RegularNode_color_spill_424.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:17439f65e90c4ca71877d1d0e0ff75388f522b92c524403d7a1166d204235286 +size 2701 diff --git a/Plugins/DarkerNodes/Resources/Theme/Graph/RegularNode_color_spill_gradient.png b/Plugins/DarkerNodes/Resources/Theme/Graph/RegularNode_color_spill_gradient.png new file mode 100644 index 0000000..d17088d --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Graph/RegularNode_color_spill_gradient.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:822cdc9534223a991ae7ad3afe936fc0a52b1f90b54186dfbb8d11dcb8c2db25 +size 443 diff --git a/Plugins/DarkerNodes/Resources/Theme/Graph/VarNode_color_spill_thick.png b/Plugins/DarkerNodes/Resources/Theme/Graph/VarNode_color_spill_thick.png new file mode 100644 index 0000000..6f8c7c0 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Graph/VarNode_color_spill_thick.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:756a5ef85126bca9151ddbedd5cc8274fd825e8a12bb9c13f985bdc0e2def148 +size 1681 diff --git a/Plugins/DarkerNodes/Resources/Theme/Graph/VarNode_color_spill_thin.png b/Plugins/DarkerNodes/Resources/Theme/Graph/VarNode_color_spill_thin.png new file mode 100644 index 0000000..ff797e2 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Graph/VarNode_color_spill_thin.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0b75c53273ef4ee658ba50a29b1ca4f1f510eef3f7dd1f570678e88f8da4c245 +size 1868 diff --git a/Plugins/DarkerNodes/Resources/Theme/Icons/DetailsView/PlusSymbol_12x.png b/Plugins/DarkerNodes/Resources/Theme/Icons/DetailsView/PlusSymbol_12x.png new file mode 100644 index 0000000..94e7593 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Icons/DetailsView/PlusSymbol_12x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3b5e098335290afd27e71ec457f0950be6ddfa7c1ef261a30e044ec6c7ad37cc +size 1847 diff --git a/Plugins/DarkerNodes/Resources/Theme/Icons/DetailsView/assign_12x.png b/Plugins/DarkerNodes/Resources/Theme/Icons/DetailsView/assign_12x.png new file mode 100644 index 0000000..a9b7008 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Icons/DetailsView/assign_12x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a52ce60c3a0273a6b457a989590126d21f36c91890cdb69fdaf234491724e9b7 +size 1647 diff --git a/Plugins/DarkerNodes/Resources/Theme/Icons/DetailsView/icon_PropertyMatrix_16px.png b/Plugins/DarkerNodes/Resources/Theme/Icons/DetailsView/icon_PropertyMatrix_16px.png new file mode 100644 index 0000000..308a73e --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Icons/DetailsView/icon_PropertyMatrix_16px.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3eeeac07b52439d545e299394e1ee1c1d34c21ad40e97fb4cba07eb74c6d8009 +size 93 diff --git a/Plugins/DarkerNodes/Resources/Theme/Icons/DetailsView/icon_invisible_16px.png b/Plugins/DarkerNodes/Resources/Theme/Icons/DetailsView/icon_invisible_16px.png new file mode 100644 index 0000000..2d4d4d0 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Icons/DetailsView/icon_invisible_16px.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:78a8fbde61a073cde22af18eda37be85c9036a177ad061a27221e98b136cf212 +size 224 diff --git a/Plugins/DarkerNodes/Resources/Theme/Icons/DetailsView/icon_visible_16px.png b/Plugins/DarkerNodes/Resources/Theme/Icons/DetailsView/icon_visible_16px.png new file mode 100644 index 0000000..49766a3 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Icons/DetailsView/icon_visible_16px.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9061152337e35aeea95c37987cc8340102fc9c2516a30fe3de0005a930c1a0bc +size 172 diff --git a/Plugins/DarkerNodes/Resources/Theme/Icons/DetailsView/lens_12x.png b/Plugins/DarkerNodes/Resources/Theme/Icons/DetailsView/lens_12x.png new file mode 100644 index 0000000..11b8ec0 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Icons/DetailsView/lens_12x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5d02e41ff8aa0021c27fba8351be2c5bfa19bc9a2a44483d61002dcb628fe7ed +size 1946 diff --git a/Plugins/DarkerNodes/Resources/Theme/Icons/DetailsView/padlock_locked_16x.png b/Plugins/DarkerNodes/Resources/Theme/Icons/DetailsView/padlock_locked_16x.png new file mode 100644 index 0000000..7efd384 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Icons/DetailsView/padlock_locked_16x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fff579047ca3394f14cc1c350d3ad5b49d98cfd14123c382724626fae180a65d +size 1682 diff --git a/Plugins/DarkerNodes/Resources/Theme/Icons/DetailsView/padlock_unlocked_16x.png b/Plugins/DarkerNodes/Resources/Theme/Icons/DetailsView/padlock_unlocked_16x.png new file mode 100644 index 0000000..a1d76fd --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Icons/DetailsView/padlock_unlocked_16x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9312dabc5d5d29e60c17361b83b7cc63d66c80bb9cab0f6ddf2a185a448cc678 +size 1465 diff --git a/Plugins/DarkerNodes/Resources/Theme/Icons/EventMessage_Default.png b/Plugins/DarkerNodes/Resources/Theme/Icons/EventMessage_Default.png new file mode 100644 index 0000000..b00f5ff --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Icons/EventMessage_Default.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:93b0dcb44ed0d07650416e82227f576dce01f77c93f948b437722b7965aee84b +size 1763 diff --git a/Plugins/DarkerNodes/Resources/Theme/Icons/Graph/icon_FunctionArgDown.png b/Plugins/DarkerNodes/Resources/Theme/Icons/Graph/icon_FunctionArgDown.png new file mode 100644 index 0000000..7be9765 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Icons/Graph/icon_FunctionArgDown.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7c6898412337163a779679ab6c2a07cc6938caba363fc43e27c7783ea7ae89ef +size 2901 diff --git a/Plugins/DarkerNodes/Resources/Theme/Icons/Graph/icon_FunctionArgUp.png b/Plugins/DarkerNodes/Resources/Theme/Icons/Graph/icon_FunctionArgUp.png new file mode 100644 index 0000000..8b731c3 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Icons/Graph/icon_FunctionArgUp.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bce89f2f39726a232b2f524981bd3d6c1111a0c735d7e74b3d59219c24ab9a1b +size 2886 diff --git a/Plugins/DarkerNodes/Resources/Theme/Icons/PropertyView/AdvancedButton_Down.png b/Plugins/DarkerNodes/Resources/Theme/Icons/PropertyView/AdvancedButton_Down.png new file mode 100644 index 0000000..33c1d54 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Icons/PropertyView/AdvancedButton_Down.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a1f4c87fc89917d697513178d9b24802282aef82efb261563416f33fc5da47ec +size 1491 diff --git a/Plugins/DarkerNodes/Resources/Theme/Icons/PropertyView/AdvancedButton_Up.png b/Plugins/DarkerNodes/Resources/Theme/Icons/PropertyView/AdvancedButton_Up.png new file mode 100644 index 0000000..e12aa4c --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Icons/PropertyView/AdvancedButton_Up.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:62c6a053d92e8086f287b3a90c7aa17578877f85a2315ef98ce72845b35a6924 +size 1698 diff --git a/Plugins/DarkerNodes/Resources/Theme/Icons/Timeline/icon_TrackAddColor_36x24px.png b/Plugins/DarkerNodes/Resources/Theme/Icons/Timeline/icon_TrackAddColor_36x24px.png new file mode 100644 index 0000000..3dad81e --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Icons/Timeline/icon_TrackAddColor_36x24px.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8db785b2fe639944c8bbca14e94087052e4cde2c071f2fae2a505b8123fad98b +size 6269 diff --git a/Plugins/DarkerNodes/Resources/Theme/Icons/Timeline/icon_TrackAddCurve_36x24px.png b/Plugins/DarkerNodes/Resources/Theme/Icons/Timeline/icon_TrackAddCurve_36x24px.png new file mode 100644 index 0000000..0dc2d64 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Icons/Timeline/icon_TrackAddCurve_36x24px.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7c51461d2516eb488db4878b0f37034cb23463069aa2ce5ff5c16d642e2adb64 +size 3280 diff --git a/Plugins/DarkerNodes/Resources/Theme/Icons/Timeline/icon_TrackAddEvent_36x24px.png b/Plugins/DarkerNodes/Resources/Theme/Icons/Timeline/icon_TrackAddEvent_36x24px.png new file mode 100644 index 0000000..eb230e4 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Icons/Timeline/icon_TrackAddEvent_36x24px.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9f6657b8eed59fe5aa3f27c8d20e87e4c408812dc2a0496dd7c0aaa951f66526 +size 3341 diff --git a/Plugins/DarkerNodes/Resources/Theme/Icons/Timeline/icon_TrackAddFloat_36x24px.png b/Plugins/DarkerNodes/Resources/Theme/Icons/Timeline/icon_TrackAddFloat_36x24px.png new file mode 100644 index 0000000..6013095 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Icons/Timeline/icon_TrackAddFloat_36x24px.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dc359150ab9692c4854c16aed00917f2e3ad89f1797cf972c7f15ea02b542367 +size 3278 diff --git a/Plugins/DarkerNodes/Resources/Theme/Icons/Timeline/icon_TrackAddVector_36x24px.png b/Plugins/DarkerNodes/Resources/Theme/Icons/Timeline/icon_TrackAddVector_36x24px.png new file mode 100644 index 0000000..7a98ea0 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Icons/Timeline/icon_TrackAddVector_36x24px.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bab4b2797d33a863fe3d9b4c12bdc5aae018a54652f135230ed623b2a92f01ab +size 3233 diff --git a/Plugins/DarkerNodes/Resources/Theme/Icons/Timeline/icon_TrackDelete_36x24px.png b/Plugins/DarkerNodes/Resources/Theme/Icons/Timeline/icon_TrackDelete_36x24px.png new file mode 100644 index 0000000..1c62e18 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Icons/Timeline/icon_TrackDelete_36x24px.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:00e14b156af64c420331f941f636082c0a8abed314823877346b94cece5a83d1 +size 3409 diff --git a/Plugins/DarkerNodes/Resources/Theme/Icons/Viewport/Layer2DSnap.png b/Plugins/DarkerNodes/Resources/Theme/Icons/Viewport/Layer2DSnap.png new file mode 100644 index 0000000..a00b7ff --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Icons/Viewport/Layer2DSnap.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fd5466996d1b789dcbc91fbaa3c471bdc89bc87b2df3bc9a6a5adfeff1222cfb +size 287 diff --git a/Plugins/DarkerNodes/Resources/Theme/Icons/Viewport/LocationGridSnap.png b/Plugins/DarkerNodes/Resources/Theme/Icons/Viewport/LocationGridSnap.png new file mode 100644 index 0000000..efd2bb6 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Icons/Viewport/LocationGridSnap.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:05c1dd8b456eab1154eb787c056cfe93c464c364292847db6de0586499df880b +size 88 diff --git a/Plugins/DarkerNodes/Resources/Theme/Icons/Viewport/RotationGridSnap.png b/Plugins/DarkerNodes/Resources/Theme/Icons/Viewport/RotationGridSnap.png new file mode 100644 index 0000000..fd56c5d --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Icons/Viewport/RotationGridSnap.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e3e06bd5fa979ebf8b22dc88c9517315315ff1b18e4eb9bbf0f3798b0991758f +size 260 diff --git a/Plugins/DarkerNodes/Resources/Theme/Icons/Viewport/ScaleGridSnap.png b/Plugins/DarkerNodes/Resources/Theme/Icons/Viewport/ScaleGridSnap.png new file mode 100644 index 0000000..e8260e1 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Icons/Viewport/ScaleGridSnap.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:859c39187b19b6dff7934fd650439e788b2f3eaf2fe7067eab445cabc393e4a7 +size 148 diff --git a/Plugins/DarkerNodes/Resources/Theme/Icons/Viewport/icon_CameraSpeed_24x16px.png b/Plugins/DarkerNodes/Resources/Theme/Icons/Viewport/icon_CameraSpeed_24x16px.png new file mode 100644 index 0000000..a7f1c72 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Icons/Viewport/icon_CameraSpeed_24x16px.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bd1047d02a9727234b15a5488c5d8eb1254ffbfc913d38c573d109365a7de301 +size 396 diff --git a/Plugins/DarkerNodes/Resources/Theme/Icons/Viewport/icon_axis_local_16px.png b/Plugins/DarkerNodes/Resources/Theme/Icons/Viewport/icon_axis_local_16px.png new file mode 100644 index 0000000..92ed6fe --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Icons/Viewport/icon_axis_local_16px.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aaef2c7e543f68a4307d12aea3327b71b5547aa7a19c2cb5925c6dba6caaa447 +size 221 diff --git a/Plugins/DarkerNodes/Resources/Theme/Icons/Viewport/icon_axis_world_16px.png b/Plugins/DarkerNodes/Resources/Theme/Icons/Viewport/icon_axis_world_16px.png new file mode 100644 index 0000000..8e5985d --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Icons/Viewport/icon_axis_world_16px.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c3c46d779942cad1cf8ba9e2164e71036df264e0dc78606bf29dcdf82dc805ef +size 397 diff --git a/Plugins/DarkerNodes/Resources/Theme/Icons/Viewport/icon_rotateb_16x.png b/Plugins/DarkerNodes/Resources/Theme/Icons/Viewport/icon_rotateb_16x.png new file mode 100644 index 0000000..34e2df2 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Icons/Viewport/icon_rotateb_16x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:44f55a0854614fdcc749230ad38c81580061716347d77e321d1210379b6df867 +size 201 diff --git a/Plugins/DarkerNodes/Resources/Theme/Icons/Viewport/icon_scaleb_16x.png b/Plugins/DarkerNodes/Resources/Theme/Icons/Viewport/icon_scaleb_16x.png new file mode 100644 index 0000000..f9bda46 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Icons/Viewport/icon_scaleb_16x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f90a3cb57ebaebb4a6d66e30a55d6d75d03e4d075f9a59d155e0f3d8e438b32a +size 200 diff --git a/Plugins/DarkerNodes/Resources/Theme/Icons/Viewport/icon_surface_snapping_14px.png b/Plugins/DarkerNodes/Resources/Theme/Icons/Viewport/icon_surface_snapping_14px.png new file mode 100644 index 0000000..9393003 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Icons/Viewport/icon_surface_snapping_14px.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:86a1a0eaaa6df743fbb3f602d065d0985ddaf6998d9e7e9fd8462815f59a7625 +size 257 diff --git a/Plugins/DarkerNodes/Resources/Theme/Icons/Viewport/icon_translateb_16x.png b/Plugins/DarkerNodes/Resources/Theme/Icons/Viewport/icon_translateb_16x.png new file mode 100644 index 0000000..9292e8f --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Icons/Viewport/icon_translateb_16x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b90511da94a05365c4036477144094f2d92a5ba911fe5054e8bbdf58396d6b99 +size 204 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/BehaviorTreeMode_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/BehaviorTreeMode_40x.png new file mode 100644 index 0000000..cf905cb --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/BehaviorTreeMode_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c006a0166520dd382728d8a2bc5c2761ab9162ead9e661ebb5444dbc138f7941 +size 1910 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/CompileStatus_Fail.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/CompileStatus_Fail.png new file mode 100644 index 0000000..0735d80 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/CompileStatus_Fail.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e350e4eea00c7230f1ebdaf33d8ee7035750406a8c63230293d6f6e1b5f917f0 +size 2244 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/CompileStatus_Good.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/CompileStatus_Good.png new file mode 100644 index 0000000..af4c079 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/CompileStatus_Good.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c54cd832dab360373178ba62620f33b35a23d26917f9d753631e71f92cb9b95b +size 2285 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/CompileStatus_Warning.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/CompileStatus_Warning.png new file mode 100644 index 0000000..46fe1f3 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/CompileStatus_Warning.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5ae64318dbfa238d0d07be733a802ba5f957c4b0e08836661aa83ae0c1fbf063 +size 2276 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/CompileStatus_Working.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/CompileStatus_Working.png new file mode 100644 index 0000000..11c91da --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/CompileStatus_Working.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:799377d1191e1cb69fec1357b7dae9c7b6b1b03ee509802f9a05e941ca0827be +size 2245 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/Designer_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/Designer_40x.png new file mode 100644 index 0000000..c03870f --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/Designer_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6a7d0212adb25d5565ebb5010203bf8dbb2439bbe1f37aa4594a4e720033614f +size 1959 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/VR_Editor_Toolbar_Icon.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/VR_Editor_Toolbar_Icon.png new file mode 100644 index 0000000..9cbf858 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/VR_Editor_Toolbar_Icon.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:07227902aa857a6c270a80448f7baeb0545eac48ff065eff46f94ce7fe3dfe19 +size 2991 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_BlueprintEditor_Defaults_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_BlueprintEditor_Defaults_40x.png new file mode 100644 index 0000000..df98ec7 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_BlueprintEditor_Defaults_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b87ccea939cae36698348323b4336b2760c9f7bc5c52a3b584cbd6fff7d7f3e0 +size 1537 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_BlueprintEditor_EventGraph_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_BlueprintEditor_EventGraph_40x.png new file mode 100644 index 0000000..81577d1 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_BlueprintEditor_EventGraph_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:42e917ad4c507b8a429c802b55b98b3054a8487fb3d15c98638cc2885fc2a9e0 +size 1885 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_Blueprint_Find_40px.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_Blueprint_Find_40px.png new file mode 100644 index 0000000..02d136a --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_Blueprint_Find_40px.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:835db46ff51a1a947aa66f13d976b599ac3bd2cbde878e4187d76f501dab6fc4 +size 1948 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_Blueprint_Options_40px.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_Blueprint_Options_40px.png new file mode 100644 index 0000000..51ce4ef --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_Blueprint_Options_40px.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b370b8e38630755d884f5b7e68fc6f77b66c7f480eecd03bdfd4b9da790b2aa8 +size 1539 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_Camera_Reset_40px.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_Camera_Reset_40px.png new file mode 100644 index 0000000..80e07d4 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_Camera_Reset_40px.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:37a540e8bb578b04877b27c15c1f3a0ebd1494efc40e2311259178d9e74791a5 +size 2926 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_ContentBrowser_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_ContentBrowser_40x.png new file mode 100644 index 0000000..972d94a --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_ContentBrowser_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:43ade328a05cbd7cf92e871b213c885e13511948ce5e4311e9766b2f21c1c78e +size 1893 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_DebugStepIn_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_DebugStepIn_40x.png new file mode 100644 index 0000000..fe37fc4 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_DebugStepIn_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2ec4ca2f12b6706b76920f22e9a40b6d75eb948bbc044355932c782eecf6cde3 +size 1885 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_DebugStepOut_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_DebugStepOut_40x.png new file mode 100644 index 0000000..fea5a22 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_DebugStepOut_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3a54fb5864c8b37c62c0331ad46694942a84b4b5cdb8f8257dddb370cc0fac1c +size 1878 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_DebugStepOver_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_DebugStepOver_40x.png new file mode 100644 index 0000000..cb0c0e4 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_DebugStepOver_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:86072f78ec917eeb0910ca7037950bd162e92f011aa8f6d64de2436464c8708f +size 1856 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_Editor_Modes_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_Editor_Modes_40x.png new file mode 100644 index 0000000..4a98b0c --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_Editor_Modes_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:33c2a6e086025aa30bb9023b93207678e390e88b45894b1f6de56412fde003f1 +size 2030 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_Enable_Simulation_40px.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_Enable_Simulation_40px.png new file mode 100644 index 0000000..606adc6 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_Enable_Simulation_40px.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c1c527c429b54ebd52dd2b555637d66faf6aa77bffa31922161e7f458b54298d +size 2243 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_HideUnrelatedNodes_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_HideUnrelatedNodes_40x.png new file mode 100644 index 0000000..fe53baf --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_HideUnrelatedNodes_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3a0acdc1b09739d158ac93e8d7aba0ee84fbc6d374f6f3d99333a763bd4869ed +size 1903 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_Marketplace_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_Marketplace_40x.png new file mode 100644 index 0000000..0539740 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_Marketplace_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d85e0488d3cf60ccee3c2c8458aa3a921d5ad09558ce10a2806c6096ac4a4092 +size 1922 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_MatEd_Apply_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_MatEd_Apply_40x.png new file mode 100644 index 0000000..bcc3175 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_MatEd_Apply_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:592e3eeaf802e7104790522d7df92a0dc2cc655c2264a6dea5836198e36d126c +size 1942 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_MatEd_CleanUp_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_MatEd_CleanUp_40x.png new file mode 100644 index 0000000..420008c --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_MatEd_CleanUp_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4724ebe795d0dfa741d498792acd2a7449fa90d568726020f95aa30c1edb5bb0 +size 3006 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_MatEd_Connectors_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_MatEd_Connectors_40x.png new file mode 100644 index 0000000..2756d01 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_MatEd_Connectors_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5f7c1e31ae97ae677c7f7f8d7a04d0ec3e2852075c6ebec554ada934eb915fdd +size 2860 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_MatEd_Grid_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_MatEd_Grid_40x.png new file mode 100644 index 0000000..ad0174a --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_MatEd_Grid_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6c5ee6e2c7c2e85f3649d861e9e4de80a157f66dd1a43b34f74672adbc93f7a0 +size 2775 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_MatEd_Home_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_MatEd_Home_40x.png new file mode 100644 index 0000000..7c882bf --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_MatEd_Home_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1dfb47d0abf8b3f0d10aab6ec379629d1e70ae32a2500de69275078f248a9415 +size 1896 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_MatEd_LiveNodes_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_MatEd_LiveNodes_40x.png new file mode 100644 index 0000000..526fe25 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_MatEd_LiveNodes_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:47c83725f571d17922e5c49858e703c9a3ac35acadc0608f0c87732176af56f4 +size 1851 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_MatEd_LivePreview_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_MatEd_LivePreview_40x.png new file mode 100644 index 0000000..fc38d35 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_MatEd_LivePreview_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3daa71c4be6fd7c2261015087dde30dc1d814d1699011c2c0e6933d239789520 +size 1876 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_MatEd_Realtime_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_MatEd_Realtime_40x.png new file mode 100644 index 0000000..1f3c507 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_MatEd_Realtime_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f6f5ed219b08d518f227604f03d630e9c850cf778d2a9240204f4de9bd9cfc0d +size 2909 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_MatEd_Refresh_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_MatEd_Refresh_40x.png new file mode 100644 index 0000000..00bcb51 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_MatEd_Refresh_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f8625ea294479b252f538b4ad0e86addb18a41d8bf1cbefdb5945aa07d9a1b7d +size 1882 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_MatEd_Stats_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_MatEd_Stats_40x.png new file mode 100644 index 0000000..b6b86ac --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_MatEd_Stats_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:270c6fd83a26c69e6b0ba3e25f9c3e5d473e31cb9b6b4fd80301bcb532159b67 +size 1861 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_MobileStats_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_MobileStats_40x.png new file mode 100644 index 0000000..4b983eb --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_MobileStats_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f8fc2111723b038d5130cfb0d56a3ecabf2bf0f797ea48b2d5037019fcbf4c03 +size 1884 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_Persona_Compression_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_Persona_Compression_40x.png new file mode 100644 index 0000000..40d78e5 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_Persona_Compression_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c7133fa2e86efadaa925b517139adb39812b46381d169aa8b7f438da8df9a5c2 +size 2885 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_Persona_CreateAsset_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_Persona_CreateAsset_40x.png new file mode 100644 index 0000000..cef0556 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_Persona_CreateAsset_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5df26d1d0cc8014a6553bf14c42d08840d50ce8c151624d2c386637993e07df2 +size 2934 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_Persona_ExportFBX_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_Persona_ExportFBX_40x.png new file mode 100644 index 0000000..2c0568a --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_Persona_ExportFBX_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b207ecb3b48ca24d6eaf15fb8a813f1e432cc55551e42dbeb413876dd4efab5c +size 2941 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_Persona_PreviewAsset_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_Persona_PreviewAsset_40x.png new file mode 100644 index 0000000..eb48d91 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_Persona_PreviewAsset_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:483b445b080f29394d93976a688c68a06e3fb3ddd9e02338b278472350fa66eb +size 2879 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_Persona_ReimportMesh_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_Persona_ReimportMesh_40x.png new file mode 100644 index 0000000..65baae4 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_Persona_ReimportMesh_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0454dec69af80a43a015f1534a1c11e51ae7651bc87e63435bee5bd8f7309689 +size 2894 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_Persona_SetKey_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_Persona_SetKey_40x.png new file mode 100644 index 0000000..24c314e --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_Persona_SetKey_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a5e82b512021243a0c8c784659575783988e6a4ccf14cdece9c83c61e5fce5b4 +size 2833 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_PlayMobilePreview_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_PlayMobilePreview_40x.png new file mode 100644 index 0000000..5d2514f --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_PlayMobilePreview_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9e1927cc7090551fe9c509bf5088652ec968b4605cfda7ba4edd2f8e1188ef7a +size 1932 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_PlayOnDevice_40px.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_PlayOnDevice_40px.png new file mode 100644 index 0000000..1310e08 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_PlayOnDevice_40px.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:08f537ba4ba1ed6fdf147919c71845bc45bffcbc9e9c0b1d3cdb8c6790167bdf +size 1884 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_PlayStandalone_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_PlayStandalone_40x.png new file mode 100644 index 0000000..c613330 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_PlayStandalone_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3261c9ecec6275d24a49dab70b0abf7e5c13a34cc4c13ad72c89c0dbfe10924b +size 1923 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_SaveAsset_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_SaveAsset_40x.png new file mode 100644 index 0000000..0afb8e2 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_SaveAsset_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0c31e0f3b3d40c9e74310adb5c498c40a7ec7b2ba48d55b0101eb65c9a4769f4 +size 1709 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_ShowStaticMeshes_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_ShowStaticMeshes_40x.png new file mode 100644 index 0000000..f938915 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_ShowStaticMeshes_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cbd3e2a32536ead3ac2f0a9ff58886157da8d0731a2b89da41a4fec6da4a8ea8 +size 2859 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_StaticMeshEd_AdditionalData_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_StaticMeshEd_AdditionalData_40x.png new file mode 100644 index 0000000..65009c6 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_StaticMeshEd_AdditionalData_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:673627c96724eba434511bf1d263384b97d195774548c41a56897f336d622674 +size 2916 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_StaticMeshEd_Binormals_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_StaticMeshEd_Binormals_40x.png new file mode 100644 index 0000000..2dd1ec9 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_StaticMeshEd_Binormals_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:14a621bf002f63529f8579f0630d90deb9dd27f98624257fde1de053c451a154 +size 2868 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_StaticMeshEd_Bounds_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_StaticMeshEd_Bounds_40x.png new file mode 100644 index 0000000..6d7122e --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_StaticMeshEd_Bounds_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c32facde3f8a97209f19051312bf8b49352225831500eef6e2a8cf67efe55103 +size 2966 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_StaticMeshEd_Collision_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_StaticMeshEd_Collision_40x.png new file mode 100644 index 0000000..993abcc --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_StaticMeshEd_Collision_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dcbd9f051abf0efb181bfecea45e5596bc534a52e57f3db78566beebc6135e73 +size 2902 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_StaticMeshEd_Normals_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_StaticMeshEd_Normals_40x.png new file mode 100644 index 0000000..ebe200c --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_StaticMeshEd_Normals_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1959aac927d4d55a0cd1b31b4f66d40788b802730d6893d48c5d8c5384b594c4 +size 2859 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_StaticMeshEd_ShowPivot_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_StaticMeshEd_ShowPivot_40x.png new file mode 100644 index 0000000..8a1c819 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_StaticMeshEd_ShowPivot_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9bf71d633d27c8530c97284d9c20962b2c21c46b8e0e1b34a46747172ed51c08 +size 2866 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_StaticMeshEd_ShowSockets_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_StaticMeshEd_ShowSockets_40x.png new file mode 100644 index 0000000..9b75206 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_StaticMeshEd_ShowSockets_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c8b1d7b4dbb542bc492055a4ca601ce0725a7465a8c2334426ce61341a4b2087 +size 2844 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_StaticMeshEd_Tangents_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_StaticMeshEd_Tangents_40x.png new file mode 100644 index 0000000..35ba250 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_StaticMeshEd_Tangents_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a17be624075d99967800a03e93a335580d77365a498b36ebe875ae92121be09a +size 2870 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_StaticMeshEd_UVOverlay_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_StaticMeshEd_UVOverlay_40x.png new file mode 100644 index 0000000..13ce8ff --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_StaticMeshEd_UVOverlay_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1d61086a4de4b52c8e2b032cb804301657563eeb71e8b1c312380f1bb8813a33 +size 2853 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_StaticMeshEd_VertColor_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_StaticMeshEd_VertColor_40x.png new file mode 100644 index 0000000..8f025ad --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_StaticMeshEd_VertColor_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9c656081f09e95d883264443eb67f75a32a11ca93c2819ffb167e49e96479063 +size 2896 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_StaticMeshEd_Vertices_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_StaticMeshEd_Vertices_40x.png new file mode 100644 index 0000000..2c0f055 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_StaticMeshEd_Vertices_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3f0c9bfd5386fc5253f4396836d0f6c2f37dc1bbc3b720a16afd3cdf90343a82 +size 2840 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_StaticMeshEd_Wireframe_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_StaticMeshEd_Wireframe_40x.png new file mode 100644 index 0000000..6d40c89 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_StaticMeshEd_Wireframe_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:acdfe23d688b1f8469056360f00d2ee2fc12b1d2f7a2000fd2be7ef56ef32eb4 +size 2965 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_advance_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_advance_40x.png new file mode 100644 index 0000000..f5d4b3d --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_advance_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f3a69a0e05a930c8f9039f299416d3fffced178d709991ff13873818d9a34450 +size 1900 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_build_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_build_40x.png new file mode 100644 index 0000000..d938c3a --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_build_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c0b937e35972df773537653fdf2d87b4614192b93add2bc6bf02eb80d285b1e1 +size 2042 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_compile_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_compile_40x.png new file mode 100644 index 0000000..7a9c8ad --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_compile_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a3b7e3710c3ba200e17a66ae2d665d7278ee63325fbf6d2c4bfc2519a5f61aa6 +size 1851 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_eject_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_eject_40x.png new file mode 100644 index 0000000..50aa012 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_eject_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2572f70eb93ba9c825721a45c1b699fbe1bbe31f7b3a986a71e1f0e3e041bc32 +size 1951 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_findnode_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_findnode_40x.png new file mode 100644 index 0000000..8b20783 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_findnode_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:090a75d8fe023a6d3f6a65c44674b008b33962974a1a0d77a7516459e1b96f3f +size 1916 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_game_settings_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_game_settings_40x.png new file mode 100644 index 0000000..7f6a5a4 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_game_settings_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4a247b7413ae11f085d72747594677c87984cf4c7d582123de6af6ff99ee0951 +size 2073 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_kismet2_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_kismet2_40x.png new file mode 100644 index 0000000..7b8b356 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_kismet2_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:43ee6f3efdcf0b614ae814728b4e535d1472f32bc3e2c617480dcee8843d9426 +size 1859 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_matinee_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_matinee_40x.png new file mode 100644 index 0000000..f8d6c5a --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_matinee_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6216a8b2ee77a32f83f49c78a215a0b605924b304fb1323bcab3bab41f554880 +size 2014 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_pause_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_pause_40x.png new file mode 100644 index 0000000..3059a14 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_pause_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1e82cf61943a0da8863b09aaa8ae8d68c61b2a932b4d92d7153f2e7abb645ffd +size 1838 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_playInSelectedViewport_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_playInSelectedViewport_40x.png new file mode 100644 index 0000000..2bcdbed --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_playInSelectedViewport_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4c68faf6406e8dde0aa9a6423ff19b173951905cb0f81a760fa1edecb0c61000 +size 1880 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_playInVR_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_playInVR_40x.png new file mode 100644 index 0000000..6845ae3 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_playInVR_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ac8501a23d260376e3586a90a83686fd5fd1183e275be38c23bfe4ea0b8a5bf9 +size 1961 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_playInWindow_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_playInWindow_40x.png new file mode 100644 index 0000000..9a7c069 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_playInWindow_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:30b14d1467cddc8b70f5cefb4229d68faad9e3e928134c40862f83278b30ce5a +size 1925 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_possess_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_possess_40x.png new file mode 100644 index 0000000..5f70ce6 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_possess_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:241336698873a3b055d5c7baf02e52881ed0042041d339acf57202ff3f710b3d +size 1851 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_simulate_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_simulate_40x.png new file mode 100644 index 0000000..082baf1 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_simulate_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ad00fbb6a4b5bc1ac34a15f5d233242a0453faac95e75fd0706cffde43de1f33 +size 1998 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_source_control_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_source_control_40x.png new file mode 100644 index 0000000..f2fe651 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_source_control_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:65a523319b9e1afc3b5a80b117d8f6bb3cc94ac2b6fc97e6e1cc7efb12ee4333 +size 1936 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_source_control_40x_off.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_source_control_40x_off.png new file mode 100644 index 0000000..10e511d --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_source_control_40x_off.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:10ea5339603c6304c7c57904caaa031e06d100e4d004f72477dbe09de3021b66 +size 1964 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_source_control_40x_on.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_source_control_40x_on.png new file mode 100644 index 0000000..3344af2 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_source_control_40x_on.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7bb6b21e7ee351fba709266f42220d95790e78e31ae5bb64191d6d0398eb548a +size 2010 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_source_control_40x_problem.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_source_control_40x_problem.png new file mode 100644 index 0000000..5e17ace --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_source_control_40x_problem.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0ec59cd64f945100051f9690e55441fb7560c3ded92dc9f690f07823a9b7497d +size 2001 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_source_control_40x_unknown.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_source_control_40x_unknown.png new file mode 100644 index 0000000..9a66567 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_source_control_40x_unknown.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c1539544f8020ed7408badb4cc070c6c61bf7b4b6a9e3ce46063cff6e58705a4 +size 1968 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_stop_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_stop_40x.png new file mode 100644 index 0000000..7cf02b4 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_stop_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cfcaac879aa35f7f941939414a9d89cb3bb2d1528289c77e997e68d8965eec83 +size 1832 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_tab_Layers_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_tab_Layers_40x.png new file mode 100644 index 0000000..9dc871b --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_tab_Layers_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fb2fcde74c2a878bf6e8e55909cf27e91c0f2de6d5d861cccf56e72d5eb140f0 +size 2880 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_tab_WidgetReflector_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_tab_WidgetReflector_40x.png new file mode 100644 index 0000000..de9b7ef --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_tab_WidgetReflector_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:616ea57a5d1f812738f12230f54b40bd6249c050b60638d1321e5e363cb2f9ab +size 1868 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_toolbar_genericfinder_40px.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_toolbar_genericfinder_40px.png new file mode 100644 index 0000000..280ceb6 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/icon_toolbar_genericfinder_40px.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d019ba458c86ee43ea38093a47efbd3e6588889bc98a403dbc5ce916d3cc5a92 +size 1983 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/megascans.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/megascans.png new file mode 100644 index 0000000..e5b7b88 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line.Small/megascans.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0fedd055ee5c545fc9d675391a2cef4a24e1302b4749cb50c21189929c39604c +size 3127 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/BehaviorTreeMode_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/BehaviorTreeMode_40x.png new file mode 100644 index 0000000..c9318a3 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/BehaviorTreeMode_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:172dd4d5e69ab5edb82b2d48463d07571b0177788768a71873e5a9bb33c8cf3e +size 231 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/CompileStatus_Fail.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/CompileStatus_Fail.png new file mode 100644 index 0000000..d1445c5 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/CompileStatus_Fail.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3a696442e891903ac702234066c41aca36709ed0198890e7989161a34a9a0026 +size 430 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/CompileStatus_Good.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/CompileStatus_Good.png new file mode 100644 index 0000000..f71309f --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/CompileStatus_Good.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9e6b6c0ae61e6c229a9abc45392dd9f529aa9ec4955dbddd69c68ea07235ee87 +size 442 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/CompileStatus_Warning.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/CompileStatus_Warning.png new file mode 100644 index 0000000..89b3c35 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/CompileStatus_Warning.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3358cd424dbc376fd56f144f860e1015d0b0c9594a5bced0bac305e31325d867 +size 452 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/CompileStatus_Working.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/CompileStatus_Working.png new file mode 100644 index 0000000..a49a8fe --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/CompileStatus_Working.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cb1aac025cc3b5658deee1be520ccb432d0394d2546977f9d67a76aaa3aee837 +size 389 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/Designer_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/Designer_40x.png new file mode 100644 index 0000000..99c36de --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/Designer_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f1bc494f40e518a46a82662262664f90bf3a0f964137ff979c40d73ddbd37bc3 +size 333 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/VR_Editor_Toolbar_Icon.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/VR_Editor_Toolbar_Icon.png new file mode 100644 index 0000000..84c925a --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/VR_Editor_Toolbar_Icon.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b2fa4ac96e07af0a33b9006dad4f9f7e4b860f56015ee59fc1f4a74dcd412e93 +size 3308 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_BlueprintEditor_Defaults_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_BlueprintEditor_Defaults_40x.png new file mode 100644 index 0000000..5c72299 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_BlueprintEditor_Defaults_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:54444693fc82c68719190d1fcc5ecef5464b3bffc3d04b2fe60d315044a79d43 +size 272 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_BlueprintEditor_EventGraph_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_BlueprintEditor_EventGraph_40x.png new file mode 100644 index 0000000..fd019c7 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_BlueprintEditor_EventGraph_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:679e9710e469fbefecdbd37d29f2cb403db35f5ce58c333ef0ec0ebee28cfdc8 +size 213 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_Blueprint_Find_40px.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_Blueprint_Find_40px.png new file mode 100644 index 0000000..69dffdc --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_Blueprint_Find_40px.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:03526b43b50862a94595e7e2e60ac44fa7dae7daaa53a41113d5a9bd31084490 +size 330 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_Blueprint_Options_40px.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_Blueprint_Options_40px.png new file mode 100644 index 0000000..6eb2126 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_Blueprint_Options_40px.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:12e97b6b3b4d7d49e81e6a61520c4e97e7f17bbeef3c06451d50568f1d23a3fa +size 216 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_Camera_Reset_40px.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_Camera_Reset_40px.png new file mode 100644 index 0000000..35e4047 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_Camera_Reset_40px.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5f0609a066245d25ab137ff3176d94af00c871f3e7e06dff808fcbbf58a32057 +size 3150 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_ContentBrowser_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_ContentBrowser_40x.png new file mode 100644 index 0000000..e1f66da --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_ContentBrowser_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d7f90cb767948a36d9b7f7f6e64aee89473f81c725ffbf7baa9492517360477c +size 241 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_DebugStepIn_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_DebugStepIn_40x.png new file mode 100644 index 0000000..40ac637 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_DebugStepIn_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f2c35280e9a91debb71b54419502433ba179e21d5417eedf78d1771e3bad718e +size 2941 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_DebugStepOut_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_DebugStepOut_40x.png new file mode 100644 index 0000000..a071bc0 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_DebugStepOut_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a1060fbdd913bcb0bfa6d9f3dedce98b4a674201302b380dd057e041afb1c283 +size 2938 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_DebugStepOver_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_DebugStepOver_40x.png new file mode 100644 index 0000000..cee094d --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_DebugStepOver_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:79d67167bc84924ea83226cb5f978f14d90aa0da3f6f2b78a5c5c7d47f76a092 +size 2919 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_Editor_Modes_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_Editor_Modes_40x.png new file mode 100644 index 0000000..dd892f3 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_Editor_Modes_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:72f59b4be65b1a0f4d341db781ccce04e061eb500445ea485cd08b9defe3ab40 +size 503 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_Enable_Simulation_40px.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_Enable_Simulation_40px.png new file mode 100644 index 0000000..d8ea33a --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_Enable_Simulation_40px.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:43cdfb93e7a416f97ea91d52237dcb30d781e09f9ab02fa1d103f757dc16273f +size 409 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_HideUnrelatedNodes_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_HideUnrelatedNodes_40x.png new file mode 100644 index 0000000..0cd3b61 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_HideUnrelatedNodes_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a56beb1b32a7f4e94cb8e55713183f62febc077ac054d27abd9db99b829b6ead +size 252 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_Marketplace_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_Marketplace_40x.png new file mode 100644 index 0000000..e35fcd0 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_Marketplace_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5381445b2ff08b7ec3d610d2c1afee79e9a81d8239773ef3f327ef1e20581456 +size 313 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_MatEd_Apply_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_MatEd_Apply_40x.png new file mode 100644 index 0000000..bbb0933 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_MatEd_Apply_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7f32b9e76d9ded02e3a55b767d81b55ec684738e17a6edc1d5ef88e9321f2732 +size 281 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_MatEd_CleanUp_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_MatEd_CleanUp_40x.png new file mode 100644 index 0000000..d902ac4 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_MatEd_CleanUp_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8677f1ef758bc67ae0712345c4dde35e2cb9d209738583190a1c6cbdab24f32b +size 3290 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_MatEd_Connectors_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_MatEd_Connectors_40x.png new file mode 100644 index 0000000..2e92da2 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_MatEd_Connectors_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cf4283531f78fbdb0f4d65cb18c4ec59143aeca97b23d1519922fe3c6ce0b7d8 +size 2986 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_MatEd_Grid_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_MatEd_Grid_40x.png new file mode 100644 index 0000000..14bb70f --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_MatEd_Grid_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f8b5053af8f8ce1580c6d90a536ad939d79129ccc73c5424ccc3977f4f548ec9 +size 2873 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_MatEd_Home_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_MatEd_Home_40x.png new file mode 100644 index 0000000..317bd41 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_MatEd_Home_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:84ed369a3cb62d99187dcb7e02b2e2a2730d8ae012462cba19ab25caad5f68af +size 218 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_MatEd_LiveNodes_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_MatEd_LiveNodes_40x.png new file mode 100644 index 0000000..a0f2a40 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_MatEd_LiveNodes_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2c59117d522f6811cd5204bb50fc0f0d3a2b3c15f77197f601bade40e9c40d67 +size 201 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_MatEd_LivePreview_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_MatEd_LivePreview_40x.png new file mode 100644 index 0000000..5b977ba --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_MatEd_LivePreview_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ace067accb4b96a03ee9828157115641d208217943c85b4d185bf4c0bcb94672 +size 255 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_MatEd_Realtime_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_MatEd_Realtime_40x.png new file mode 100644 index 0000000..5d1b0f4 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_MatEd_Realtime_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:28b408e30548978f4c6ed4fe849dc8bc59e81050cb9186d276d1cb2293726456 +size 3128 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_MatEd_Refresh_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_MatEd_Refresh_40x.png new file mode 100644 index 0000000..0d18423 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_MatEd_Refresh_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:03ba3dbad4e76502fa8b95b30dfd3092747b52974e65f946aa9090e14b7ae896 +size 229 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_MatEd_Stats_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_MatEd_Stats_40x.png new file mode 100644 index 0000000..ab1098c --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_MatEd_Stats_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0a39736d9d59a23d8acbc7e1583b8dd350b088aa732e9df69d7f7afc3fd54af7 +size 161 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_MobileStats_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_MobileStats_40x.png new file mode 100644 index 0000000..48b2239 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_MobileStats_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:14341d360012256c4ecf744e0eeb4818a131d0095621996257a7d20a77e1704a +size 198 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_Persona_Compression_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_Persona_Compression_40x.png new file mode 100644 index 0000000..ad2325a --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_Persona_Compression_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bfb66ebb335a80230498ea577b62b07f3a76b9f4dbd056fdddd76693aa040d5f +size 3050 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_Persona_CreateAsset_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_Persona_CreateAsset_40x.png new file mode 100644 index 0000000..87b392c --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_Persona_CreateAsset_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ae43e310d6af94173cc1de0f01245858cdb281941edb985c7e51913bb50c9440 +size 3107 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_Persona_ExportFBX_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_Persona_ExportFBX_40x.png new file mode 100644 index 0000000..461516b --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_Persona_ExportFBX_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e1c7d3597895e81f899a747e39e1fb00730e59380e35c9f5fc2a0713f40461a6 +size 3105 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_Persona_PreviewAsset_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_Persona_PreviewAsset_40x.png new file mode 100644 index 0000000..050ece3 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_Persona_PreviewAsset_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bafa902327e27d389c5c6e33ae9477f4e84925ee44eae5d5510962aececba5ad +size 3025 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_Persona_ReimportMesh_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_Persona_ReimportMesh_40x.png new file mode 100644 index 0000000..71d1fbb --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_Persona_ReimportMesh_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e01f82b1b6e593e5194b59a320b2280e7efb567553856b66d1246bf97aa75026 +size 3084 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_Persona_SetKey_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_Persona_SetKey_40x.png new file mode 100644 index 0000000..d96735a --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_Persona_SetKey_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:381ae33ca578ebe4026e52855c55d2af36a634e9662b698acafc949b2f0c9995 +size 2927 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_PlayMobilePreview_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_PlayMobilePreview_40x.png new file mode 100644 index 0000000..448765a --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_PlayMobilePreview_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:13721298d5118cd367783a652296af6f2c88c925e50cf6a6c95fd94a4862e335 +size 2853 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_PlayOnDevice_40px.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_PlayOnDevice_40px.png new file mode 100644 index 0000000..9415385 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_PlayOnDevice_40px.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:62a33f0ad70314533f8c960f4a4ff182e268609fdf0310fdc2ff90f25bf2852f +size 327 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_PlayStandalone_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_PlayStandalone_40x.png new file mode 100644 index 0000000..859585c --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_PlayStandalone_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:30ddce07387d2c01963c8e38788d4f1a7fcd80e0bbdcc40c72bec352b12f80ab +size 314 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_SaveAsset_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_SaveAsset_40x.png new file mode 100644 index 0000000..e5f04e6 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_SaveAsset_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0c88beb6d77e5a1bd759c4defbda8a6c4b148452bcab64a7d52be19b7ad488b5 +size 316 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_ShowStaticMeshes_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_ShowStaticMeshes_40x.png new file mode 100644 index 0000000..cce1e10 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_ShowStaticMeshes_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f12ba7fbeeaf7aee84c99567dbe8e5e7d2a082fcb93d6997aca022603c8185e5 +size 3009 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_StaticMeshEd_AdditionalData_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_StaticMeshEd_AdditionalData_40x.png new file mode 100644 index 0000000..aca7426 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_StaticMeshEd_AdditionalData_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:928b6efa82ff348af04ce9202ae3a2d9db910da87955b82c32fb872dfeeef88d +size 3146 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_StaticMeshEd_Binormals_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_StaticMeshEd_Binormals_40x.png new file mode 100644 index 0000000..b6abf56 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_StaticMeshEd_Binormals_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6ae0f98a9d3c71f4185e5fee6c0d1116ec7f46126f72c5160a0125676224afa0 +size 2985 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_StaticMeshEd_Bounds_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_StaticMeshEd_Bounds_40x.png new file mode 100644 index 0000000..daed034 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_StaticMeshEd_Bounds_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c3493c669bb6664c793405a8366bb6696d5e4b65c110eec061610ad90210fe5e +size 3221 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_StaticMeshEd_Collision_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_StaticMeshEd_Collision_40x.png new file mode 100644 index 0000000..4338df5 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_StaticMeshEd_Collision_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:164f0beef6f2dc173a8a9a7c9bcac5c3b19b188150fba912b46daed224454cd8 +size 3053 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_StaticMeshEd_Normals_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_StaticMeshEd_Normals_40x.png new file mode 100644 index 0000000..2248b0b --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_StaticMeshEd_Normals_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b3b9d3c765a1feff2deea5f45a12e1d9fe0c5381ec75427b2d21dfeac3b94620 +size 2963 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_StaticMeshEd_ShowPivot_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_StaticMeshEd_ShowPivot_40x.png new file mode 100644 index 0000000..581f987 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_StaticMeshEd_ShowPivot_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9fc12465c84da3704d2cf3f151fe790ecbc4565c7cdb316182f9fdd584868887 +size 3061 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_StaticMeshEd_ShowSockets_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_StaticMeshEd_ShowSockets_40x.png new file mode 100644 index 0000000..cef8403 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_StaticMeshEd_ShowSockets_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2adb6cec49f0691542a9072a6c5ba892d05cb0578283b7695890de416ec734fc +size 2982 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_StaticMeshEd_Tangents_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_StaticMeshEd_Tangents_40x.png new file mode 100644 index 0000000..6b8604b --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_StaticMeshEd_Tangents_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ca02e1016b405c4f7173f376a89295acd600d63ab49a5e1f05b8c48755340499 +size 2982 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_StaticMeshEd_UVOverlay_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_StaticMeshEd_UVOverlay_40x.png new file mode 100644 index 0000000..c9eee48 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_StaticMeshEd_UVOverlay_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ea99f25eaa42af9b3a36be92fbe459f77f6b69c61bd7c8d082ec675042be5457 +size 3002 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_StaticMeshEd_VertColor_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_StaticMeshEd_VertColor_40x.png new file mode 100644 index 0000000..6e2aa64 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_StaticMeshEd_VertColor_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cfcc8d2089d0e7f8c696c32d139922487e08d06fce15bdb7443e5476f001347f +size 3025 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_StaticMeshEd_Vertices_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_StaticMeshEd_Vertices_40x.png new file mode 100644 index 0000000..da7e3ad --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_StaticMeshEd_Vertices_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0d2ca4238c79c5e5d76a7cbd603585c992eabf8735a43163c04d7f87d6fd701c +size 2962 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_StaticMeshEd_Wireframe_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_StaticMeshEd_Wireframe_40x.png new file mode 100644 index 0000000..48ad268 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_StaticMeshEd_Wireframe_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9887af94ff96c788e25fc102ab99cdeea3e2ab19a9c8002ca3f208460f11247e +size 3111 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_advance_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_advance_40x.png new file mode 100644 index 0000000..0244f4b --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_advance_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ae82ac5cc8830ee536deebddbc4f064d5babc77a3aab55a4240ee8206631513a +size 3055 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_build_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_build_40x.png new file mode 100644 index 0000000..3311be3 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_build_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9a50fdc912cf5a7e2ce5b265b275e22db82672547a760071c1fb2690bcbe4de4 +size 366 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_compile_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_compile_40x.png new file mode 100644 index 0000000..5eb60d2 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_compile_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1831f670556ff585fc4c764162ec4e604531d479a66389b2673e7f029e693b4f +size 150 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_eject_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_eject_40x.png new file mode 100644 index 0000000..ebcfdba --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_eject_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2c7d3d5949dd469f0c73f0208a7d988e720d3fe9046146bcc65062e2520978d2 +size 350 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_findnode_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_findnode_40x.png new file mode 100644 index 0000000..d727f3e --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_findnode_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7790633ce9e0921ae7c596fda5e9c24919dc96b860101b704eda408cf3092d19 +size 2972 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_game_settings_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_game_settings_40x.png new file mode 100644 index 0000000..53c8183 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_game_settings_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2a70150f1f1fe75715a225e1cf3c41ac4f25e4d26f4813c5dc839aab6bb9abc0 +size 569 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_kismet2_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_kismet2_40x.png new file mode 100644 index 0000000..4937823 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_kismet2_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fdf9c28026bd2717700bea405f7eec30972029f1fff578f08647884e69eb67c7 +size 165 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_matinee_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_matinee_40x.png new file mode 100644 index 0000000..fc07592 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_matinee_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:187ad8b2250fd8e6b397632a17bb592f42da6d1e6f2b40e965d0433f53a27409 +size 419 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_pause_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_pause_40x.png new file mode 100644 index 0000000..5334b6f --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_pause_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4c38d57025ae41553670722592689081558dcb1e30b8f1a280c1a763f252244c +size 138 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_playInSelectedViewport_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_playInSelectedViewport_40x.png new file mode 100644 index 0000000..6511d47 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_playInSelectedViewport_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:13b49bac2132f75f122b5e172d1de9b97b1ea2974472e419978cdbe868644ab5 +size 248 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_playInVR_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_playInVR_40x.png new file mode 100644 index 0000000..aebb505 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_playInVR_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e62ae7db2d6338b49f74f85b3fa31fc60d1bc687f3f23526812d5037b49916c0 +size 3111 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_playInWindow_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_playInWindow_40x.png new file mode 100644 index 0000000..70ec8c3 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_playInWindow_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0e87189b5be1bf9f962d00704d78581ccced0e3914f2c1c2d79e8da5f3609fa1 +size 2847 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_possess_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_possess_40x.png new file mode 100644 index 0000000..df585ca --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_possess_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7e30f9aad7fdf63cca42a66af03ec18d4487c52a5423b682b67bb631594805ba +size 364 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_simulate_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_simulate_40x.png new file mode 100644 index 0000000..bb8bd84 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_simulate_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:479fca6d6675580d83804700c2f4a4d69c0ec4524a03fd487942c0d160db5aa9 +size 375 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_source_control_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_source_control_40x.png new file mode 100644 index 0000000..6256bc6 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_source_control_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9976b4ba88e791bf2b49c212340eded9093f95388bcc5b2a08e95a8c729d96fa +size 304 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_source_control_40x_off.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_source_control_40x_off.png new file mode 100644 index 0000000..a7c1b59 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_source_control_40x_off.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f08927cfe61717e431a09b5dff7ce1f71e4c72aad632bf578c582aec8c7b44d4 +size 337 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_source_control_40x_on.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_source_control_40x_on.png new file mode 100644 index 0000000..834b2cb --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_source_control_40x_on.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8aac63df3481f0216043e927d4b4260d2bf92b3cc233899120c2dccd9506c788 +size 381 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_source_control_40x_problem.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_source_control_40x_problem.png new file mode 100644 index 0000000..3726ca5 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_source_control_40x_problem.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:230e72240290875049d993701806d26fd83af66d69e4d4660422c4f927b1c375 +size 371 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_source_control_40x_unknown.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_source_control_40x_unknown.png new file mode 100644 index 0000000..104996c --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_source_control_40x_unknown.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3770af6cec453e0d6d1d285a7b357a5269a2e2de821482f64823e9e2d6e4f28f +size 339 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_stop_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_stop_40x.png new file mode 100644 index 0000000..702622c --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_stop_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fd3e022fa8be46b2df1184470a0907606e611eb954fa2013905b3b10400f93ca +size 128 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_tab_Layers_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_tab_Layers_40x.png new file mode 100644 index 0000000..d7c76ae --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_tab_Layers_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d26567e36fcb75afdfc8f5e17b26f752efab4c699cdedcd738568e9ce638d82d +size 2999 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_tab_WidgetReflector_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_tab_WidgetReflector_40x.png new file mode 100644 index 0000000..acc9c19 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_tab_WidgetReflector_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:35f73cffe5748044e2edfcdd096b89fcad43d49f8fed047d44a1544637a92b4d +size 166 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_toolbar_genericfinder_40px.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_toolbar_genericfinder_40px.png new file mode 100644 index 0000000..fc0166c --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/icon_toolbar_genericfinder_40px.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5e714eda16ffc04e2ffd6347ecd2cd7668d486c4f0b153ab7984daea46df68de +size 416 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Line/megascans.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/megascans.png new file mode 100644 index 0000000..232e3ab --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Line/megascans.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5ee608d5529544c137704f253d52ed06050ef0737afa7ba4dd4a98e0ace9901c +size 2969 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/BehaviorTreeMode_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/BehaviorTreeMode_40x.png new file mode 100644 index 0000000..cf905cb --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/BehaviorTreeMode_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c006a0166520dd382728d8a2bc5c2761ab9162ead9e661ebb5444dbc138f7941 +size 1910 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/CompileStatus_Fail.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/CompileStatus_Fail.png new file mode 100644 index 0000000..0735d80 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/CompileStatus_Fail.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e350e4eea00c7230f1ebdaf33d8ee7035750406a8c63230293d6f6e1b5f917f0 +size 2244 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/CompileStatus_Good.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/CompileStatus_Good.png new file mode 100644 index 0000000..af4c079 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/CompileStatus_Good.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c54cd832dab360373178ba62620f33b35a23d26917f9d753631e71f92cb9b95b +size 2285 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/CompileStatus_Warning.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/CompileStatus_Warning.png new file mode 100644 index 0000000..46fe1f3 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/CompileStatus_Warning.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5ae64318dbfa238d0d07be733a802ba5f957c4b0e08836661aa83ae0c1fbf063 +size 2276 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/CompileStatus_Working.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/CompileStatus_Working.png new file mode 100644 index 0000000..11c91da --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/CompileStatus_Working.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:799377d1191e1cb69fec1357b7dae9c7b6b1b03ee509802f9a05e941ca0827be +size 2245 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/Designer_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/Designer_40x.png new file mode 100644 index 0000000..c03870f --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/Designer_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6a7d0212adb25d5565ebb5010203bf8dbb2439bbe1f37aa4594a4e720033614f +size 1959 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/VR_Editor_Toolbar_Icon.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/VR_Editor_Toolbar_Icon.png new file mode 100644 index 0000000..9cbf858 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/VR_Editor_Toolbar_Icon.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:07227902aa857a6c270a80448f7baeb0545eac48ff065eff46f94ce7fe3dfe19 +size 2991 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_BlueprintEditor_Defaults_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_BlueprintEditor_Defaults_40x.png new file mode 100644 index 0000000..df98ec7 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_BlueprintEditor_Defaults_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b87ccea939cae36698348323b4336b2760c9f7bc5c52a3b584cbd6fff7d7f3e0 +size 1537 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_BlueprintEditor_EventGraph_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_BlueprintEditor_EventGraph_40x.png new file mode 100644 index 0000000..81577d1 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_BlueprintEditor_EventGraph_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:42e917ad4c507b8a429c802b55b98b3054a8487fb3d15c98638cc2885fc2a9e0 +size 1885 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_Blueprint_Find_40px.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_Blueprint_Find_40px.png new file mode 100644 index 0000000..02d136a --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_Blueprint_Find_40px.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:835db46ff51a1a947aa66f13d976b599ac3bd2cbde878e4187d76f501dab6fc4 +size 1948 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_Blueprint_Options_40px.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_Blueprint_Options_40px.png new file mode 100644 index 0000000..51ce4ef --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_Blueprint_Options_40px.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b370b8e38630755d884f5b7e68fc6f77b66c7f480eecd03bdfd4b9da790b2aa8 +size 1539 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_Camera_Reset_40px.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_Camera_Reset_40px.png new file mode 100644 index 0000000..80e07d4 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_Camera_Reset_40px.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:37a540e8bb578b04877b27c15c1f3a0ebd1494efc40e2311259178d9e74791a5 +size 2926 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_ContentBrowser_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_ContentBrowser_40x.png new file mode 100644 index 0000000..972d94a --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_ContentBrowser_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:43ade328a05cbd7cf92e871b213c885e13511948ce5e4311e9766b2f21c1c78e +size 1893 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_DebugStepIn_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_DebugStepIn_40x.png new file mode 100644 index 0000000..fe37fc4 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_DebugStepIn_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2ec4ca2f12b6706b76920f22e9a40b6d75eb948bbc044355932c782eecf6cde3 +size 1885 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_DebugStepOut_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_DebugStepOut_40x.png new file mode 100644 index 0000000..fea5a22 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_DebugStepOut_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3a54fb5864c8b37c62c0331ad46694942a84b4b5cdb8f8257dddb370cc0fac1c +size 1878 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_DebugStepOver_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_DebugStepOver_40x.png new file mode 100644 index 0000000..cb0c0e4 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_DebugStepOver_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:86072f78ec917eeb0910ca7037950bd162e92f011aa8f6d64de2436464c8708f +size 1856 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_Editor_Modes_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_Editor_Modes_40x.png new file mode 100644 index 0000000..4a98b0c --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_Editor_Modes_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:33c2a6e086025aa30bb9023b93207678e390e88b45894b1f6de56412fde003f1 +size 2030 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_Enable_Simulation_40px.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_Enable_Simulation_40px.png new file mode 100644 index 0000000..606adc6 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_Enable_Simulation_40px.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c1c527c429b54ebd52dd2b555637d66faf6aa77bffa31922161e7f458b54298d +size 2243 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_HideUnrelatedNodes_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_HideUnrelatedNodes_40x.png new file mode 100644 index 0000000..fe53baf --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_HideUnrelatedNodes_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3a0acdc1b09739d158ac93e8d7aba0ee84fbc6d374f6f3d99333a763bd4869ed +size 1903 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_Marketplace_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_Marketplace_40x.png new file mode 100644 index 0000000..0539740 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_Marketplace_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d85e0488d3cf60ccee3c2c8458aa3a921d5ad09558ce10a2806c6096ac4a4092 +size 1922 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_MatEd_Apply_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_MatEd_Apply_40x.png new file mode 100644 index 0000000..bcc3175 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_MatEd_Apply_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:592e3eeaf802e7104790522d7df92a0dc2cc655c2264a6dea5836198e36d126c +size 1942 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_MatEd_CleanUp_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_MatEd_CleanUp_40x.png new file mode 100644 index 0000000..420008c --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_MatEd_CleanUp_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4724ebe795d0dfa741d498792acd2a7449fa90d568726020f95aa30c1edb5bb0 +size 3006 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_MatEd_Connectors_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_MatEd_Connectors_40x.png new file mode 100644 index 0000000..2756d01 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_MatEd_Connectors_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5f7c1e31ae97ae677c7f7f8d7a04d0ec3e2852075c6ebec554ada934eb915fdd +size 2860 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_MatEd_Grid_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_MatEd_Grid_40x.png new file mode 100644 index 0000000..ad0174a --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_MatEd_Grid_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6c5ee6e2c7c2e85f3649d861e9e4de80a157f66dd1a43b34f74672adbc93f7a0 +size 2775 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_MatEd_Home_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_MatEd_Home_40x.png new file mode 100644 index 0000000..7c882bf --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_MatEd_Home_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1dfb47d0abf8b3f0d10aab6ec379629d1e70ae32a2500de69275078f248a9415 +size 1896 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_MatEd_LiveNodes_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_MatEd_LiveNodes_40x.png new file mode 100644 index 0000000..526fe25 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_MatEd_LiveNodes_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:47c83725f571d17922e5c49858e703c9a3ac35acadc0608f0c87732176af56f4 +size 1851 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_MatEd_LivePreview_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_MatEd_LivePreview_40x.png new file mode 100644 index 0000000..fc38d35 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_MatEd_LivePreview_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3daa71c4be6fd7c2261015087dde30dc1d814d1699011c2c0e6933d239789520 +size 1876 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_MatEd_Realtime_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_MatEd_Realtime_40x.png new file mode 100644 index 0000000..1f3c507 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_MatEd_Realtime_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f6f5ed219b08d518f227604f03d630e9c850cf778d2a9240204f4de9bd9cfc0d +size 2909 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_MatEd_Refresh_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_MatEd_Refresh_40x.png new file mode 100644 index 0000000..00bcb51 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_MatEd_Refresh_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f8625ea294479b252f538b4ad0e86addb18a41d8bf1cbefdb5945aa07d9a1b7d +size 1882 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_MatEd_Stats_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_MatEd_Stats_40x.png new file mode 100644 index 0000000..b6b86ac --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_MatEd_Stats_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:270c6fd83a26c69e6b0ba3e25f9c3e5d473e31cb9b6b4fd80301bcb532159b67 +size 1861 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_MobileStats_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_MobileStats_40x.png new file mode 100644 index 0000000..4b983eb --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_MobileStats_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f8fc2111723b038d5130cfb0d56a3ecabf2bf0f797ea48b2d5037019fcbf4c03 +size 1884 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_Persona_Compression_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_Persona_Compression_40x.png new file mode 100644 index 0000000..40d78e5 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_Persona_Compression_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c7133fa2e86efadaa925b517139adb39812b46381d169aa8b7f438da8df9a5c2 +size 2885 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_Persona_CreateAsset_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_Persona_CreateAsset_40x.png new file mode 100644 index 0000000..cef0556 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_Persona_CreateAsset_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5df26d1d0cc8014a6553bf14c42d08840d50ce8c151624d2c386637993e07df2 +size 2934 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_Persona_ExportFBX_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_Persona_ExportFBX_40x.png new file mode 100644 index 0000000..2c0568a --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_Persona_ExportFBX_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b207ecb3b48ca24d6eaf15fb8a813f1e432cc55551e42dbeb413876dd4efab5c +size 2941 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_Persona_PreviewAsset_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_Persona_PreviewAsset_40x.png new file mode 100644 index 0000000..eb48d91 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_Persona_PreviewAsset_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:483b445b080f29394d93976a688c68a06e3fb3ddd9e02338b278472350fa66eb +size 2879 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_Persona_ReimportMesh_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_Persona_ReimportMesh_40x.png new file mode 100644 index 0000000..65baae4 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_Persona_ReimportMesh_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0454dec69af80a43a015f1534a1c11e51ae7651bc87e63435bee5bd8f7309689 +size 2894 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_Persona_SetKey_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_Persona_SetKey_40x.png new file mode 100644 index 0000000..24c314e --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_Persona_SetKey_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a5e82b512021243a0c8c784659575783988e6a4ccf14cdece9c83c61e5fce5b4 +size 2833 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_PlayMobilePreview_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_PlayMobilePreview_40x.png new file mode 100644 index 0000000..5d2514f --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_PlayMobilePreview_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9e1927cc7090551fe9c509bf5088652ec968b4605cfda7ba4edd2f8e1188ef7a +size 1932 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_PlayOnDevice_40px.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_PlayOnDevice_40px.png new file mode 100644 index 0000000..1310e08 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_PlayOnDevice_40px.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:08f537ba4ba1ed6fdf147919c71845bc45bffcbc9e9c0b1d3cdb8c6790167bdf +size 1884 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_PlayStandalone_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_PlayStandalone_40x.png new file mode 100644 index 0000000..c613330 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_PlayStandalone_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3261c9ecec6275d24a49dab70b0abf7e5c13a34cc4c13ad72c89c0dbfe10924b +size 1923 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_SaveAsset_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_SaveAsset_40x.png new file mode 100644 index 0000000..0afb8e2 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_SaveAsset_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0c31e0f3b3d40c9e74310adb5c498c40a7ec7b2ba48d55b0101eb65c9a4769f4 +size 1709 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_ShowStaticMeshes_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_ShowStaticMeshes_40x.png new file mode 100644 index 0000000..f938915 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_ShowStaticMeshes_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cbd3e2a32536ead3ac2f0a9ff58886157da8d0731a2b89da41a4fec6da4a8ea8 +size 2859 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_StaticMeshEd_AdditionalData_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_StaticMeshEd_AdditionalData_40x.png new file mode 100644 index 0000000..65009c6 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_StaticMeshEd_AdditionalData_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:673627c96724eba434511bf1d263384b97d195774548c41a56897f336d622674 +size 2916 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_StaticMeshEd_Binormals_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_StaticMeshEd_Binormals_40x.png new file mode 100644 index 0000000..2dd1ec9 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_StaticMeshEd_Binormals_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:14a621bf002f63529f8579f0630d90deb9dd27f98624257fde1de053c451a154 +size 2868 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_StaticMeshEd_Bounds_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_StaticMeshEd_Bounds_40x.png new file mode 100644 index 0000000..6d7122e --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_StaticMeshEd_Bounds_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c32facde3f8a97209f19051312bf8b49352225831500eef6e2a8cf67efe55103 +size 2966 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_StaticMeshEd_Collision_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_StaticMeshEd_Collision_40x.png new file mode 100644 index 0000000..993abcc --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_StaticMeshEd_Collision_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dcbd9f051abf0efb181bfecea45e5596bc534a52e57f3db78566beebc6135e73 +size 2902 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_StaticMeshEd_Normals_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_StaticMeshEd_Normals_40x.png new file mode 100644 index 0000000..ebe200c --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_StaticMeshEd_Normals_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1959aac927d4d55a0cd1b31b4f66d40788b802730d6893d48c5d8c5384b594c4 +size 2859 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_StaticMeshEd_ShowPivot_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_StaticMeshEd_ShowPivot_40x.png new file mode 100644 index 0000000..8a1c819 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_StaticMeshEd_ShowPivot_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9bf71d633d27c8530c97284d9c20962b2c21c46b8e0e1b34a46747172ed51c08 +size 2866 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_StaticMeshEd_ShowSockets_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_StaticMeshEd_ShowSockets_40x.png new file mode 100644 index 0000000..9b75206 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_StaticMeshEd_ShowSockets_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c8b1d7b4dbb542bc492055a4ca601ce0725a7465a8c2334426ce61341a4b2087 +size 2844 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_StaticMeshEd_Tangents_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_StaticMeshEd_Tangents_40x.png new file mode 100644 index 0000000..35ba250 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_StaticMeshEd_Tangents_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a17be624075d99967800a03e93a335580d77365a498b36ebe875ae92121be09a +size 2870 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_StaticMeshEd_UVOverlay_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_StaticMeshEd_UVOverlay_40x.png new file mode 100644 index 0000000..13ce8ff --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_StaticMeshEd_UVOverlay_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1d61086a4de4b52c8e2b032cb804301657563eeb71e8b1c312380f1bb8813a33 +size 2853 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_StaticMeshEd_VertColor_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_StaticMeshEd_VertColor_40x.png new file mode 100644 index 0000000..8f025ad --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_StaticMeshEd_VertColor_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9c656081f09e95d883264443eb67f75a32a11ca93c2819ffb167e49e96479063 +size 2896 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_StaticMeshEd_Vertices_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_StaticMeshEd_Vertices_40x.png new file mode 100644 index 0000000..2c0f055 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_StaticMeshEd_Vertices_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3f0c9bfd5386fc5253f4396836d0f6c2f37dc1bbc3b720a16afd3cdf90343a82 +size 2840 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_StaticMeshEd_Wireframe_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_StaticMeshEd_Wireframe_40x.png new file mode 100644 index 0000000..6d40c89 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_StaticMeshEd_Wireframe_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:acdfe23d688b1f8469056360f00d2ee2fc12b1d2f7a2000fd2be7ef56ef32eb4 +size 2965 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_advance_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_advance_40x.png new file mode 100644 index 0000000..f5d4b3d --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_advance_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f3a69a0e05a930c8f9039f299416d3fffced178d709991ff13873818d9a34450 +size 1900 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_build_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_build_40x.png new file mode 100644 index 0000000..d938c3a --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_build_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c0b937e35972df773537653fdf2d87b4614192b93add2bc6bf02eb80d285b1e1 +size 2042 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_compile_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_compile_40x.png new file mode 100644 index 0000000..7a9c8ad --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_compile_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a3b7e3710c3ba200e17a66ae2d665d7278ee63325fbf6d2c4bfc2519a5f61aa6 +size 1851 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_eject_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_eject_40x.png new file mode 100644 index 0000000..50aa012 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_eject_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2572f70eb93ba9c825721a45c1b699fbe1bbe31f7b3a986a71e1f0e3e041bc32 +size 1951 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_findnode_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_findnode_40x.png new file mode 100644 index 0000000..8b20783 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_findnode_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:090a75d8fe023a6d3f6a65c44674b008b33962974a1a0d77a7516459e1b96f3f +size 1916 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_game_settings_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_game_settings_40x.png new file mode 100644 index 0000000..7f6a5a4 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_game_settings_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4a247b7413ae11f085d72747594677c87984cf4c7d582123de6af6ff99ee0951 +size 2073 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_kismet2_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_kismet2_40x.png new file mode 100644 index 0000000..7b8b356 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_kismet2_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:43ee6f3efdcf0b614ae814728b4e535d1472f32bc3e2c617480dcee8843d9426 +size 1859 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_matinee_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_matinee_40x.png new file mode 100644 index 0000000..f8d6c5a --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_matinee_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6216a8b2ee77a32f83f49c78a215a0b605924b304fb1323bcab3bab41f554880 +size 2014 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_pause_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_pause_40x.png new file mode 100644 index 0000000..3059a14 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_pause_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1e82cf61943a0da8863b09aaa8ae8d68c61b2a932b4d92d7153f2e7abb645ffd +size 1838 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_playInSelectedViewport_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_playInSelectedViewport_40x.png new file mode 100644 index 0000000..2bcdbed --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_playInSelectedViewport_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4c68faf6406e8dde0aa9a6423ff19b173951905cb0f81a760fa1edecb0c61000 +size 1880 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_playInVR_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_playInVR_40x.png new file mode 100644 index 0000000..6845ae3 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_playInVR_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ac8501a23d260376e3586a90a83686fd5fd1183e275be38c23bfe4ea0b8a5bf9 +size 1961 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_playInWindow_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_playInWindow_40x.png new file mode 100644 index 0000000..9a7c069 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_playInWindow_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:30b14d1467cddc8b70f5cefb4229d68faad9e3e928134c40862f83278b30ce5a +size 1925 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_possess_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_possess_40x.png new file mode 100644 index 0000000..5f70ce6 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_possess_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:241336698873a3b055d5c7baf02e52881ed0042041d339acf57202ff3f710b3d +size 1851 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_simulate_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_simulate_40x.png new file mode 100644 index 0000000..082baf1 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_simulate_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ad00fbb6a4b5bc1ac34a15f5d233242a0453faac95e75fd0706cffde43de1f33 +size 1998 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_source_control_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_source_control_40x.png new file mode 100644 index 0000000..f2fe651 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_source_control_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:65a523319b9e1afc3b5a80b117d8f6bb3cc94ac2b6fc97e6e1cc7efb12ee4333 +size 1936 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_source_control_40x_off.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_source_control_40x_off.png new file mode 100644 index 0000000..10e511d --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_source_control_40x_off.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:10ea5339603c6304c7c57904caaa031e06d100e4d004f72477dbe09de3021b66 +size 1964 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_source_control_40x_on.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_source_control_40x_on.png new file mode 100644 index 0000000..3344af2 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_source_control_40x_on.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7bb6b21e7ee351fba709266f42220d95790e78e31ae5bb64191d6d0398eb548a +size 2010 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_source_control_40x_problem.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_source_control_40x_problem.png new file mode 100644 index 0000000..5e17ace --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_source_control_40x_problem.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0ec59cd64f945100051f9690e55441fb7560c3ded92dc9f690f07823a9b7497d +size 2001 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_source_control_40x_unknown.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_source_control_40x_unknown.png new file mode 100644 index 0000000..9a66567 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_source_control_40x_unknown.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c1539544f8020ed7408badb4cc070c6c61bf7b4b6a9e3ce46063cff6e58705a4 +size 1968 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_stop_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_stop_40x.png new file mode 100644 index 0000000..7cf02b4 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_stop_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cfcaac879aa35f7f941939414a9d89cb3bb2d1528289c77e997e68d8965eec83 +size 1832 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_tab_Layers_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_tab_Layers_40x.png new file mode 100644 index 0000000..9dc871b --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_tab_Layers_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fb2fcde74c2a878bf6e8e55909cf27e91c0f2de6d5d861cccf56e72d5eb140f0 +size 2880 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_tab_WidgetReflector_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_tab_WidgetReflector_40x.png new file mode 100644 index 0000000..de9b7ef --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_tab_WidgetReflector_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:616ea57a5d1f812738f12230f54b40bd6249c050b60638d1321e5e363cb2f9ab +size 1868 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_toolbar_genericfinder_40px.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_toolbar_genericfinder_40px.png new file mode 100644 index 0000000..280ceb6 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/icon_toolbar_genericfinder_40px.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d019ba458c86ee43ea38093a47efbd3e6588889bc98a403dbc5ce916d3cc5a92 +size 1983 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/megascans.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/megascans.png new file mode 100644 index 0000000..e5b7b88 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid.Small/megascans.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0fedd055ee5c545fc9d675391a2cef4a24e1302b4749cb50c21189929c39604c +size 3127 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/BehaviorTreeMode_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/BehaviorTreeMode_40x.png new file mode 100644 index 0000000..b77701b --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/BehaviorTreeMode_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f8dab5a3ece34c839184b037a140b588c170c26d34f8a99efd83a8f5ca1fa208 +size 2967 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/CompileStatus_Fail.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/CompileStatus_Fail.png new file mode 100644 index 0000000..ff5b6b1 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/CompileStatus_Fail.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eb9cbe74f951af4aca4de7b30661bd2c027b1ee0b63d26b0427197cbda247b14 +size 3170 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/CompileStatus_Good.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/CompileStatus_Good.png new file mode 100644 index 0000000..d1c6732 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/CompileStatus_Good.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:907c6426eda6520175a648d499b4dcda7e2acf56f9c4d528b163f350d7699285 +size 3186 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/CompileStatus_Warning.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/CompileStatus_Warning.png new file mode 100644 index 0000000..193f376 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/CompileStatus_Warning.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:16d97759f0f20ae993de7c3295c8eec9dd00364542a96a8753d0b5bb970fbba7 +size 3189 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/CompileStatus_Working.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/CompileStatus_Working.png new file mode 100644 index 0000000..26a39f4 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/CompileStatus_Working.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4340fbb20ca667851395e4b424307eb16182a62ea648c80000b224830a36456b +size 3135 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/Designer_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/Designer_40x.png new file mode 100644 index 0000000..21a5013 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/Designer_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c106dd9893dfece4e96120aa50fd8ee28322894c7b73312a81300dbb4a7a722b +size 3036 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/VR_Editor_Toolbar_Icon.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/VR_Editor_Toolbar_Icon.png new file mode 100644 index 0000000..662fb18 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/VR_Editor_Toolbar_Icon.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0cd6c49f11cfcef96faab4e4c7c1c9f46c004710c9fe8af224712537ae998a5c +size 3242 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_BlueprintEditor_Defaults_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_BlueprintEditor_Defaults_40x.png new file mode 100644 index 0000000..6255208 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_BlueprintEditor_Defaults_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f95bebf5e703e01262263ff1e3a02e960a34e61ada71b1e7a92f3f6ff0815adf +size 2994 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_BlueprintEditor_EventGraph_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_BlueprintEditor_EventGraph_40x.png new file mode 100644 index 0000000..352906a --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_BlueprintEditor_EventGraph_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e834756d9b89161ca16cb5d831c9c7e03444aa834396b8dca7a134a3d4e277df +size 2939 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_Blueprint_Find_40px.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_Blueprint_Find_40px.png new file mode 100644 index 0000000..b4920ca --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_Blueprint_Find_40px.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:09bdfc7f53474b6de32ea8561dae1d4c9ba975b2060d9d849bce13e2b692f9ce +size 3013 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_Blueprint_Options_40px.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_Blueprint_Options_40px.png new file mode 100644 index 0000000..9187d89 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_Blueprint_Options_40px.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f7118b7bc43965776ce2c22a33ae3235e9ded4cd5910084c17ee548f1ff4141f +size 2928 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_Camera_Reset_40px.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_Camera_Reset_40px.png new file mode 100644 index 0000000..50175fb --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_Camera_Reset_40px.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cfc1342ad98815d48954a48042fb681dc8b21cdcc56838c6eb66dfd677ffcd26 +size 3079 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_ContentBrowser_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_ContentBrowser_40x.png new file mode 100644 index 0000000..0941e4f --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_ContentBrowser_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0eea25e7ea1633d60b2cf1672602f0fc864804bd064160f06a0ebeac756e0856 +size 2956 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_DebugStepIn_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_DebugStepIn_40x.png new file mode 100644 index 0000000..9990eeb --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_DebugStepIn_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:802924538db6a104dafa2923779f90949715caee8d39aa8a219d0b3b0d5fd32c +size 2971 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_DebugStepOut_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_DebugStepOut_40x.png new file mode 100644 index 0000000..297ee7d --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_DebugStepOut_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:74278f9936b87db0e21c7a60bbf989bc6fce821d8f39302a45bc555a854ef752 +size 2933 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_DebugStepOver_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_DebugStepOver_40x.png new file mode 100644 index 0000000..36e13a1 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_DebugStepOver_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6ebc34cb4b41c8a9de0a6ef7ebafe350015d3c888ceffbc4525fa4e57f1cbe03 +size 2909 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_Editor_Modes_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_Editor_Modes_40x.png new file mode 100644 index 0000000..30b7f8d --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_Editor_Modes_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fce03269e00d3360e4adf5ba6d8a1758bfc216b0513d0af2edd799fdc0df7a62 +size 3200 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_Enable_Simulation_40px.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_Enable_Simulation_40px.png new file mode 100644 index 0000000..eb237c9 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_Enable_Simulation_40px.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:88fe99dcfcc4d58eebf15cd830dae3587cc6147c7681bfa02211bff5ce941938 +size 3194 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_HideUnrelatedNodes_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_HideUnrelatedNodes_40x.png new file mode 100644 index 0000000..11e3d1b --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_HideUnrelatedNodes_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b32e69d3ffbcdb2c0958a6285110a205f6970340df99caa1de444a7a914dbb12 +size 2986 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_Marketplace_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_Marketplace_40x.png new file mode 100644 index 0000000..e3fb12f --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_Marketplace_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:72d19ad7890e8fa2c50093b328071ad055df5dc85d43ddb95372a0e95067b4e2 +size 3014 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_MatEd_Apply_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_MatEd_Apply_40x.png new file mode 100644 index 0000000..5938fd1 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_MatEd_Apply_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:854df2586308c11316e69ce88202d57b85e371a0a54065c456cca1fcf517114c +size 3041 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_MatEd_CleanUp_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_MatEd_CleanUp_40x.png new file mode 100644 index 0000000..2469484 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_MatEd_CleanUp_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:74be0f0aafec0cca1d4a3d952bb83a91a91a24411e8177d8ca2523efa0a5a1c8 +size 3254 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_MatEd_Connectors_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_MatEd_Connectors_40x.png new file mode 100644 index 0000000..4687f54 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_MatEd_Connectors_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3a64e28a2bc966047038605faa82f9ef2607ef18c4d3c81b7e1d4b833d52de33 +size 3027 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_MatEd_Grid_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_MatEd_Grid_40x.png new file mode 100644 index 0000000..14bb70f --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_MatEd_Grid_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f8b5053af8f8ce1580c6d90a536ad939d79129ccc73c5424ccc3977f4f548ec9 +size 2873 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_MatEd_Home_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_MatEd_Home_40x.png new file mode 100644 index 0000000..15ae1ce --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_MatEd_Home_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3815f3ab90cc1b05352ec22c2467d57063a9ced560dd53a6f77e63a792235b6b +size 2947 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_MatEd_LiveNodes_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_MatEd_LiveNodes_40x.png new file mode 100644 index 0000000..83dfcaf --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_MatEd_LiveNodes_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a1e15553b72859ae99b221f3d581d582cb4835db00d177efca3db58b3724267e +size 2929 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_MatEd_LivePreview_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_MatEd_LivePreview_40x.png new file mode 100644 index 0000000..f6a48fd --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_MatEd_LivePreview_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b02bd783cb7bc41f4a5688040a63d0116f571f640d3d1780aa5ad6ceb34b069a +size 2967 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_MatEd_Realtime_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_MatEd_Realtime_40x.png new file mode 100644 index 0000000..9a13d3f --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_MatEd_Realtime_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e7bc049482154ef4b3acee3e69fce3ea0b021a29033cc2cfbcadce30a0ae58cf +size 3072 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_MatEd_Refresh_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_MatEd_Refresh_40x.png new file mode 100644 index 0000000..ad0f2c7 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_MatEd_Refresh_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a6a5c0226f4ddcb0540ac3e99bf4a563c8741c1de009ce84c6eb0f5c4ca19ea5 +size 2976 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_MatEd_Stats_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_MatEd_Stats_40x.png new file mode 100644 index 0000000..49bb345 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_MatEd_Stats_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:58b8108e82260ecc5bc13444c05635f2bcbd0da6624146e87940aa8f9c047b5c +size 2894 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_MobileStats_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_MobileStats_40x.png new file mode 100644 index 0000000..b83c495 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_MobileStats_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9514f82ad5687882b1dd1c821d4372a69c041228c3eeacadc153f3989a17c3d5 +size 2920 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_Persona_Compression_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_Persona_Compression_40x.png new file mode 100644 index 0000000..ad2325a --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_Persona_Compression_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bfb66ebb335a80230498ea577b62b07f3a76b9f4dbd056fdddd76693aa040d5f +size 3050 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_Persona_CreateAsset_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_Persona_CreateAsset_40x.png new file mode 100644 index 0000000..87b392c --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_Persona_CreateAsset_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ae43e310d6af94173cc1de0f01245858cdb281941edb985c7e51913bb50c9440 +size 3107 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_Persona_ExportFBX_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_Persona_ExportFBX_40x.png new file mode 100644 index 0000000..461516b --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_Persona_ExportFBX_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e1c7d3597895e81f899a747e39e1fb00730e59380e35c9f5fc2a0713f40461a6 +size 3105 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_Persona_PreviewAsset_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_Persona_PreviewAsset_40x.png new file mode 100644 index 0000000..050ece3 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_Persona_PreviewAsset_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bafa902327e27d389c5c6e33ae9477f4e84925ee44eae5d5510962aececba5ad +size 3025 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_Persona_ReimportMesh_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_Persona_ReimportMesh_40x.png new file mode 100644 index 0000000..71d1fbb --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_Persona_ReimportMesh_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e01f82b1b6e593e5194b59a320b2280e7efb567553856b66d1246bf97aa75026 +size 3084 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_Persona_SetKey_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_Persona_SetKey_40x.png new file mode 100644 index 0000000..0c0f930 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_Persona_SetKey_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1e296e54ecdd069d999abd558b6a4606169adf83fcbf0bd04b805e829336dc88 +size 2910 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_PlayMobilePreview_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_PlayMobilePreview_40x.png new file mode 100644 index 0000000..16ed3ee --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_PlayMobilePreview_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:80caf8c1651dc9ca212c48c4b7f800e5d55a9c427fb691b83f3527c01479376d +size 3035 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_PlayOnDevice_40px.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_PlayOnDevice_40px.png new file mode 100644 index 0000000..6d240ae --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_PlayOnDevice_40px.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:581016bb7e6fc0847bbff2c75a4a038226a54fc17406d8baa536a6f2eb28a620 +size 2979 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_PlayStandalone_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_PlayStandalone_40x.png new file mode 100644 index 0000000..803a1b7 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_PlayStandalone_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cf225410962b6ad2e2371b5ec669bab8896409a7e2b2a132cc19071c4fe45566 +size 3042 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_SaveAsset_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_SaveAsset_40x.png new file mode 100644 index 0000000..6d07891 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_SaveAsset_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:af2cf5a7e169688fdf035d14229288b57d212436f4406fc26bc9f97c1af3ce3d +size 3011 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_ShowStaticMeshes_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_ShowStaticMeshes_40x.png new file mode 100644 index 0000000..cce1e10 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_ShowStaticMeshes_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f12ba7fbeeaf7aee84c99567dbe8e5e7d2a082fcb93d6997aca022603c8185e5 +size 3009 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_StaticMeshEd_AdditionalData_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_StaticMeshEd_AdditionalData_40x.png new file mode 100644 index 0000000..06e3d68 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_StaticMeshEd_AdditionalData_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7c8e7386331caa0e6c55ec7efe06a84af80b1df82da32cd17b6f52df2e2afc6f +size 3143 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_StaticMeshEd_Binormals_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_StaticMeshEd_Binormals_40x.png new file mode 100644 index 0000000..b6abf56 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_StaticMeshEd_Binormals_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6ae0f98a9d3c71f4185e5fee6c0d1116ec7f46126f72c5160a0125676224afa0 +size 2985 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_StaticMeshEd_Bounds_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_StaticMeshEd_Bounds_40x.png new file mode 100644 index 0000000..daed034 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_StaticMeshEd_Bounds_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c3493c669bb6664c793405a8366bb6696d5e4b65c110eec061610ad90210fe5e +size 3221 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_StaticMeshEd_Collision_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_StaticMeshEd_Collision_40x.png new file mode 100644 index 0000000..4338df5 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_StaticMeshEd_Collision_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:164f0beef6f2dc173a8a9a7c9bcac5c3b19b188150fba912b46daed224454cd8 +size 3053 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_StaticMeshEd_Normals_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_StaticMeshEd_Normals_40x.png new file mode 100644 index 0000000..2248b0b --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_StaticMeshEd_Normals_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b3b9d3c765a1feff2deea5f45a12e1d9fe0c5381ec75427b2d21dfeac3b94620 +size 2963 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_StaticMeshEd_ShowPivot_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_StaticMeshEd_ShowPivot_40x.png new file mode 100644 index 0000000..581f987 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_StaticMeshEd_ShowPivot_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9fc12465c84da3704d2cf3f151fe790ecbc4565c7cdb316182f9fdd584868887 +size 3061 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_StaticMeshEd_ShowSockets_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_StaticMeshEd_ShowSockets_40x.png new file mode 100644 index 0000000..184b538 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_StaticMeshEd_ShowSockets_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7b00817d2890cd26ab75c7fb010a04270b938248278dd9f92ab2607b7b0e9f2a +size 2951 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_StaticMeshEd_Tangents_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_StaticMeshEd_Tangents_40x.png new file mode 100644 index 0000000..6b8604b --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_StaticMeshEd_Tangents_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ca02e1016b405c4f7173f376a89295acd600d63ab49a5e1f05b8c48755340499 +size 2982 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_StaticMeshEd_UVOverlay_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_StaticMeshEd_UVOverlay_40x.png new file mode 100644 index 0000000..c9eee48 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_StaticMeshEd_UVOverlay_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ea99f25eaa42af9b3a36be92fbe459f77f6b69c61bd7c8d082ec675042be5457 +size 3002 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_StaticMeshEd_VertColor_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_StaticMeshEd_VertColor_40x.png new file mode 100644 index 0000000..43ec296 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_StaticMeshEd_VertColor_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2154ee70821e5b93b72661931c74a9707379d38e26f42b5f6123a9f8950bed85 +size 3021 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_StaticMeshEd_Vertices_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_StaticMeshEd_Vertices_40x.png new file mode 100644 index 0000000..fe68288 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_StaticMeshEd_Vertices_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:492cea7f69d88fad9d00cb64a46e08915fcc4239b46b9f09bbcc7e58f996fbd3 +size 2946 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_StaticMeshEd_Wireframe_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_StaticMeshEd_Wireframe_40x.png new file mode 100644 index 0000000..48ad268 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_StaticMeshEd_Wireframe_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9887af94ff96c788e25fc102ab99cdeea3e2ab19a9c8002ca3f208460f11247e +size 3111 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_advance_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_advance_40x.png new file mode 100644 index 0000000..1a74f83 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_advance_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5560c972590d3b3cb0ce301060c87d966903a2c10f2a398bc26cb55ac05ea33c +size 3006 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_build_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_build_40x.png new file mode 100644 index 0000000..82bc14f --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_build_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f3ed0895f735d3aa6b1f7526f5a3aed41ca57801aa234cc80431e06273eb90c0 +size 3096 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_compile_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_compile_40x.png new file mode 100644 index 0000000..80e84bf --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_compile_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:96ea41ab4cff913747082b011d5af7bb4030cf04024241bbc8d52c5d117a08f1 +size 2884 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_eject_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_eject_40x.png new file mode 100644 index 0000000..acb9c5e --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_eject_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5b606ec257010281d9a1e8b30e96cea3ea9bb44e41d55cb7ec0795e84fd3194c +size 3076 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_findnode_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_findnode_40x.png new file mode 100644 index 0000000..997621e --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_findnode_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9de2984a617500c283801e2609a23e92a63a9cced37157f909c2f6ef33ccdac5 +size 2998 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_game_settings_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_game_settings_40x.png new file mode 100644 index 0000000..11a1bf3 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_game_settings_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eb32eb92acaf9ee9ed46f8b7188435ffb33929d092768f50b9f2069e335ec7b8 +size 3229 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_kismet2_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_kismet2_40x.png new file mode 100644 index 0000000..bee4026 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_kismet2_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4f490fc983f828ae13cbf0726f686a1bb4e237b590137a3e424dfd67fc84e0b6 +size 2902 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_matinee_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_matinee_40x.png new file mode 100644 index 0000000..fc07592 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_matinee_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:187ad8b2250fd8e6b397632a17bb592f42da6d1e6f2b40e965d0433f53a27409 +size 419 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_pause_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_pause_40x.png new file mode 100644 index 0000000..caabfb9 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_pause_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a59ded74ec4ecd23abac3c036aa61f5dd40d4ed4d5e02a8c9cd7ee1e804e5171 +size 2879 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_playInSelectedViewport_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_playInSelectedViewport_40x.png new file mode 100644 index 0000000..d519643 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_playInSelectedViewport_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6237def24924d34a6b67ea830cd4cb47e136ac99df93d114b265ee12f7a1ad86 +size 2973 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_playInVR_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_playInVR_40x.png new file mode 100644 index 0000000..6dd778e --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_playInVR_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b92023801ff9039fcc7e1bd2cc7b0165e6124886eb3d0e37af226ea964deb651 +size 3074 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_playInWindow_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_playInWindow_40x.png new file mode 100644 index 0000000..1d171f6 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_playInWindow_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e9421840cffd073419f1286588a89e69951666e5759dc97568e93e6b3a4d7ac1 +size 3047 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_possess_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_possess_40x.png new file mode 100644 index 0000000..74161a5 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_possess_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:26681170f5e28c41c514761679709d4801abf5e660ab6ef1ab60f6bc89050ef7 +size 3088 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_simulate_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_simulate_40x.png new file mode 100644 index 0000000..05c78b4 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_simulate_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5a84a7f1076de43df8514cc95201b0392f52abf0c0370898622cd454dc9bfec3 +size 3064 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_source_control_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_source_control_40x.png new file mode 100644 index 0000000..9e39f19 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_source_control_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5e45273d85ebbeb866e8ccd1a019713992f664070efc870fb4abd79bc9b58fea +size 3056 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_source_control_40x_off.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_source_control_40x_off.png new file mode 100644 index 0000000..8a4d34a --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_source_control_40x_off.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fa53ed1fd27bfebf0f5b8131426300903aaa2f4a9ba07db49d3a5bab9d8942dc +size 3088 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_source_control_40x_on.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_source_control_40x_on.png new file mode 100644 index 0000000..714a316 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_source_control_40x_on.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:068ab46e8cba38820cdca639a2304d3d0c70d86db8c263a06db3045242e04ac7 +size 3138 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_source_control_40x_problem.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_source_control_40x_problem.png new file mode 100644 index 0000000..6e059ce --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_source_control_40x_problem.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5bdf3a19106ae0391b6a70979e5bf2d0e52b32a2de23c21bb253f6df68ee0dc6 +size 3120 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_source_control_40x_unknown.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_source_control_40x_unknown.png new file mode 100644 index 0000000..313bc7b --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_source_control_40x_unknown.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:04da95dff286e4f2c150447642809f501078241ff867aea8de2a437283e84f06 +size 3089 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_stop_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_stop_40x.png new file mode 100644 index 0000000..792c6a2 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_stop_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4bb54d9aac5256a9380cc69ef93f49c5ec011656a3840e7da506857d9b22f75c +size 2873 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_tab_Layers_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_tab_Layers_40x.png new file mode 100644 index 0000000..ab6d7ab --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_tab_Layers_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fdb86c9d8b54f78415b60c2842e77130f1377a4287b1bcaf96bff9241fd44147 +size 2980 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_tab_WidgetReflector_40x.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_tab_WidgetReflector_40x.png new file mode 100644 index 0000000..d0fb1ac --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_tab_WidgetReflector_40x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e90d4d57da499ac7cf06dbbd26be250fa26b924d45b0de463c09f11604fba404 +size 2913 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_toolbar_genericfinder_40px.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_toolbar_genericfinder_40px.png new file mode 100644 index 0000000..733992e --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/icon_toolbar_genericfinder_40px.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ad20650022f8cee118f7e0732005e55ccc4f17fee36cafdcb0079731ba98b72b +size 3098 diff --git a/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/megascans.png b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/megascans.png new file mode 100644 index 0000000..01f1e29 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Menu/Solid/megascans.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d034e30689518db434ad4665faf2666c89e2b8b141265ff470f6f573b9f99126 +size 2945 diff --git a/Plugins/DarkerNodes/Resources/Theme/Panel/ColumnHeader_Arrow.png b/Plugins/DarkerNodes/Resources/Theme/Panel/ColumnHeader_Arrow.png new file mode 100644 index 0000000..e1172bb --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Panel/ColumnHeader_Arrow.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:06aded626d427c50ac69c099adf80581afa42cb23e64c823866067dfc8dead1a +size 89 diff --git a/Plugins/DarkerNodes/Resources/Theme/Panel/HeaderSplitterGrip.PNG b/Plugins/DarkerNodes/Resources/Theme/Panel/HeaderSplitterGrip.PNG new file mode 100644 index 0000000..92fd9b3 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Panel/HeaderSplitterGrip.PNG @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7666cf25971abee8c483d336c00e12590858a24afd00caa70b6adb839eda9613 +size 83 diff --git a/Plugins/DarkerNodes/Resources/Theme/Panel/SortDownArrow.png b/Plugins/DarkerNodes/Resources/Theme/Panel/SortDownArrow.png new file mode 100644 index 0000000..67c230a --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Panel/SortDownArrow.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:92cc46ab91e755cf4544231f2b8defe91280c89d7687d55cd65e304686c51b6e +size 84 diff --git a/Plugins/DarkerNodes/Resources/Theme/Panel/SortDownArrows.png b/Plugins/DarkerNodes/Resources/Theme/Panel/SortDownArrows.png new file mode 100644 index 0000000..7e97e89 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Panel/SortDownArrows.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ff0ca39348ecced6cad832487ed8e355f8c26346e75679e019f0cd4304318bb7 +size 93 diff --git a/Plugins/DarkerNodes/Resources/Theme/Panel/SortUpArrow.png b/Plugins/DarkerNodes/Resources/Theme/Panel/SortUpArrow.png new file mode 100644 index 0000000..8176b23 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Panel/SortUpArrow.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3b4a3e3a034f307d851999e83581a50fc46b09b6cd9750e49744cf226a142f32 +size 89 diff --git a/Plugins/DarkerNodes/Resources/Theme/Panel/SortUpArrows.png b/Plugins/DarkerNodes/Resources/Theme/Panel/SortUpArrows.png new file mode 100644 index 0000000..4ae47f8 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Panel/SortUpArrows.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:282f0748dac92581ce534f2fca5e7dcf310c0125241fe6e4681ea350e55313fc +size 98 diff --git a/Plugins/DarkerNodes/Resources/Theme/Panel/TreeArrow_Collapsed.png b/Plugins/DarkerNodes/Resources/Theme/Panel/TreeArrow_Collapsed.png new file mode 100644 index 0000000..4e8b918 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Panel/TreeArrow_Collapsed.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1534ad59af674e07260d61120c9f4299c306328054c031076d62d2ad4130d80a +size 1462 diff --git a/Plugins/DarkerNodes/Resources/Theme/Panel/TreeArrow_Expanded.png b/Plugins/DarkerNodes/Resources/Theme/Panel/TreeArrow_Expanded.png new file mode 100644 index 0000000..6b735d4 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Panel/TreeArrow_Expanded.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:52e3ee7140329a0156eb1d440e631f0ebbdbaca9fc4567eb5b0b40e35288c7c4 +size 1452 diff --git a/Plugins/DarkerNodes/Resources/Theme/Transparent.png b/Plugins/DarkerNodes/Resources/Theme/Transparent.png new file mode 100644 index 0000000..c3a56f2 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Transparent.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:95e8066b05cfd67dfa06bfb1cf63f7ab5098e8d5cb62503a1d299473b56800b2 +size 75 diff --git a/Plugins/DarkerNodes/Resources/Theme/Window/WindowBackground.png b/Plugins/DarkerNodes/Resources/Theme/Window/WindowBackground.png new file mode 100644 index 0000000..4bfb48a --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Window/WindowBackground.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:78ab9a778403c48c917b2a07a6670950801a7af00401721e455fe6b22d167bf9 +size 227 diff --git a/Plugins/DarkerNodes/Resources/Theme/Window/WindowBorder.png b/Plugins/DarkerNodes/Resources/Theme/Window/WindowBorder.png new file mode 100644 index 0000000..3ecb95e --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Window/WindowBorder.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4761c4a67147d032de40e665ebc510bad8da5117d609d2aef976c441aaa37b5d +size 5805 diff --git a/Plugins/DarkerNodes/Resources/Theme/Window/WindowButton_Close.png b/Plugins/DarkerNodes/Resources/Theme/Window/WindowButton_Close.png new file mode 100644 index 0000000..4c83d10 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Window/WindowButton_Close.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a8632d480df758f580a38b47dce0765e60fa4b6f36bf94778af75636d9f3a2b9 +size 153 diff --git a/Plugins/DarkerNodes/Resources/Theme/Window/WindowButton_Maximize.png b/Plugins/DarkerNodes/Resources/Theme/Window/WindowButton_Maximize.png new file mode 100644 index 0000000..7809850 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Window/WindowButton_Maximize.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:674ba2196e10da1099f945ff4f721164962f49bd83882a9a86b23ce3e554b02c +size 99 diff --git a/Plugins/DarkerNodes/Resources/Theme/Window/WindowButton_Minimize.png b/Plugins/DarkerNodes/Resources/Theme/Window/WindowButton_Minimize.png new file mode 100644 index 0000000..20de392 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Window/WindowButton_Minimize.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:332ecbf4e6b42f4023004372ca29eb1da3e5a13446d9b9edf9ffd615c8550456 +size 87 diff --git a/Plugins/DarkerNodes/Resources/Theme/Window/WindowButton_Restore.png b/Plugins/DarkerNodes/Resources/Theme/Window/WindowButton_Restore.png new file mode 100644 index 0000000..a996513 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Window/WindowButton_Restore.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bd3bcbdb7396b17393e10b5f9f14166339463eaf4bf41ff69d31bb609881f73a +size 103 diff --git a/Plugins/DarkerNodes/Resources/Theme/Window/WindowOutline.png b/Plugins/DarkerNodes/Resources/Theme/Window/WindowOutline.png new file mode 100644 index 0000000..64523ac --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Window/WindowOutline.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:94237639799087b17e4c155ac0fa6f357e31171ab1de4e6833036bb2d7934f9d +size 132 diff --git a/Plugins/DarkerNodes/Resources/Theme/Window/WindowTitle.png b/Plugins/DarkerNodes/Resources/Theme/Window/WindowTitle.png new file mode 100644 index 0000000..054f64b --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Window/WindowTitle.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:56430dfa7f429c33a576cb93c7d8a6acaeae451108dcf4fefb78280be815923c +size 92 diff --git a/Plugins/DarkerNodes/Resources/Theme/Window/WindowTitle_Flashing.png b/Plugins/DarkerNodes/Resources/Theme/Window/WindowTitle_Flashing.png new file mode 100644 index 0000000..b19622c --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Window/WindowTitle_Flashing.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c196edf7d82b3ed75d586c94dd0957334a3fe60dd977b158198343b7a80af8b3 +size 151 diff --git a/Plugins/DarkerNodes/Resources/Theme/Window/WindowTitle_Inactive.png b/Plugins/DarkerNodes/Resources/Theme/Window/WindowTitle_Inactive.png new file mode 100644 index 0000000..0b407f2 --- /dev/null +++ b/Plugins/DarkerNodes/Resources/Theme/Window/WindowTitle_Inactive.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ba04f531df0c7a12124750d521add77c55b16a6432d653c5559c16680dbd9f50 +size 83 diff --git a/Plugins/DarkerNodes/Shaders/Box.usf b/Plugins/DarkerNodes/Shaders/Box.usf new file mode 100644 index 0000000..b893208 --- /dev/null +++ b/Plugins/DarkerNodes/Shaders/Box.usf @@ -0,0 +1,37 @@ +/* Copyright (C) 2021 Hugo ATTAL - All Rights Reserved +* This plugin is downloadable from the Unreal Engine Marketplace +*/ + +#include "lib/Shapes.usf" + +struct DarkerUIBox +{ + static float4 ComputeBox(float2 PixelSize, float2 UVs, float4 BackgroundColor, float4 BorderColor, float Radius, float4 Padding) + { + float2 Location = UVs * PixelSize; + + PixelSize.x -= Padding.x + Padding.z; + PixelSize.y -= Padding.y + Padding.w; + Location.x -= Padding.x; + Location.y -= Padding.y; + + Radius = min(Radius, min(PixelSize.x, PixelSize.y) / 2 - 2); + + const float ExternalRectangle = DarkerUIShapes::IsInRoundedRectangle(Location, float2(1, 1), PixelSize - float2(1, 1), Radius + 1); + const float InternalRectangle = DarkerUIShapes::IsInRoundedRectangle(Location, float2(2, 2), PixelSize - float2(2, 2), Radius); + + const float Alpha = lerp( + ExternalRectangle * BorderColor.a, BackgroundColor.a, + InternalRectangle); + const float3 Color = lerp( + BorderColor.rgb, BackgroundColor.rgb, + InternalRectangle); + + return float4(Color, Alpha); + } +}; + +/* +#include "/DarkerNodes/Box.usf" +return DarkerUIBox::ComputeBox(PixelSize, UVs, BackgroundColor, BorderColor, Radius, Padding); +*/ diff --git a/Plugins/DarkerNodes/Shaders/Button.usf b/Plugins/DarkerNodes/Shaders/Button.usf new file mode 100644 index 0000000..cfc99d1 --- /dev/null +++ b/Plugins/DarkerNodes/Shaders/Button.usf @@ -0,0 +1,24 @@ +/* Copyright (C) 2021 Hugo ATTAL - All Rights Reserved +* This plugin is downloadable from the Unreal Engine Marketplace +*/ + +#include "lib/Shapes.usf" + +struct DarkerUIButton +{ + static float4 ComputeButton(float2 PixelSize, float2 UVs, float3 BackgroundColor, float3 BorderColor, float Radius) + { + Radius = min(Radius, min(PixelSize.x, PixelSize.y) / 2 - 1); + const float2 Location = UVs * PixelSize; + const float Alpha = DarkerUIShapes::IsInRoundedRectangle(Location, float2(0, 0), PixelSize, Radius + 1); + const float3 Color = lerp( + BorderColor, BackgroundColor, + DarkerUIShapes::IsInRoundedRectangle(Location, float2(1, 1), PixelSize - float2(1, 1), Radius)); + return float4(Color, Alpha); + } +}; + +/* +#include "/DarkerNodes/Button.usf" +return DarkerUIButton::ComputeButton(PixelSize, UVs, BackgroundColor, BorderColor, Radius); +*/ diff --git a/Plugins/DarkerNodes/Shaders/ButtonCut.usf b/Plugins/DarkerNodes/Shaders/ButtonCut.usf new file mode 100644 index 0000000..0f3a027 --- /dev/null +++ b/Plugins/DarkerNodes/Shaders/ButtonCut.usf @@ -0,0 +1,38 @@ +/* Copyright (C) 2021 Hugo ATTAL - All Rights Reserved +* This plugin is downloadable from the Unreal Engine Marketplace +*/ + +#include "lib/Shapes.usf" + +struct DarkerUIButtonCut +{ + static float4 ComputeButton(float2 PixelSize, float2 UVs, float3 BackgroundColor, float3 BorderColor, float Part, float Radius) + { + Radius = min(Radius, min(PixelSize.x, PixelSize.y) / 2 - 1); + + if (Part < 0) + { + UVs.x = min(UVs.x, 0.5); + } + else if (Part > 0) + { + UVs.x = max(UVs.x, 0.5); + } + else + { + UVs.x = 0.5; + } + + const float2 Location = UVs * PixelSize; + const float Alpha = DarkerUIShapes::IsInRoundedRectangle(Location, float2(0, 0), PixelSize - float2(0, 0), Radius + 1); + const float3 Color = lerp( + BorderColor, BackgroundColor, + DarkerUIShapes::IsInRoundedRectangle(Location, float2(1, 1), PixelSize - float2(1, 1), Radius)); + return float4(Color, Alpha); + } +}; + +/* +#include "/DarkerNodes/ButtonCut.usf" +return DarkerUIButtonCut::ComputeButton(PixelSize, UVs, BackgroundColor, BorderColor, Part, Radius); +*/ diff --git a/Plugins/DarkerNodes/Shaders/CenterUVs.usf b/Plugins/DarkerNodes/Shaders/CenterUVs.usf new file mode 100644 index 0000000..886f18a --- /dev/null +++ b/Plugins/DarkerNodes/Shaders/CenterUVs.usf @@ -0,0 +1,30 @@ +/* Copyright (C) 2021 Hugo ATTAL - All Rights Reserved +* This plugin is downloadable from the Unreal Engine Marketplace +*/ + +struct DarkerUICenterUVs +{ + static float2 GetCenterUVs(float2 PixelSize, float2 Size, float2 UVs) + { + if (PixelSize.x > Size.x) + { + UVs.x *= PixelSize.x / Size.x; + UVs.x -= (PixelSize.x - Size.x) / (2.0f * Size.x); + } + + if (PixelSize.y > Size.y) + { + UVs.y *= PixelSize.y / Size.y; + UVs.y -= (PixelSize.y - Size.y) / (2.0f * Size.y); + } + + UVs = clamp(UVs, 0, 1); + + return UVs; + } +}; + +/* +#include "/DarkerNodes/CenterUVs.usf" +return DarkerUICenterUVs::GetCenterUVs(PixelSize, Size, UVs); +*/ \ No newline at end of file diff --git a/Plugins/DarkerNodes/Shaders/HeaderBox.usf b/Plugins/DarkerNodes/Shaders/HeaderBox.usf new file mode 100644 index 0000000..2c7994b --- /dev/null +++ b/Plugins/DarkerNodes/Shaders/HeaderBox.usf @@ -0,0 +1,37 @@ +/* Copyright (C) 2021 Hugo ATTAL - All Rights Reserved +* This plugin is downloadable from the Unreal Engine Marketplace +*/ + +#include "lib/Shapes.usf" + +struct DarkerUIHeaderBox +{ + static float4 ComputeHeaderBox(float2 PixelSize, float2 UVs, float4 BackgroundColor, float4 BorderColor, float Radius, float4 Padding) + { + float2 Location = UVs * PixelSize; + + PixelSize.x -= Padding.x + Padding.z; + PixelSize.y -= Padding.y + Padding.w; + Location.x -= Padding.x; + Location.y -= Padding.y; + + Radius = min(Radius, min(PixelSize.x, PixelSize.y) / 2 - 2); + + const float ExternalRectangle = DarkerUIShapes::IsInRoundedHeader(Location, float2(1, 1), PixelSize - float2(1, 1), Radius + 1); + const float InternalRectangle = DarkerUIShapes::IsInRoundedHeader(Location, float2(2, 2), PixelSize - float2(2, 2), Radius); + + const float Alpha = lerp( + ExternalRectangle * BorderColor.a, BackgroundColor.a, + InternalRectangle); + const float3 Color = lerp( + BorderColor.rgb, BackgroundColor.rgb, + InternalRectangle); + + return float4(Color, Alpha); + } +}; + +/* +#include "/DarkerNodes/HeaderBox.usf" +return DarkerUIHeaderBox::ComputeHeaderBox(PixelSize, UVs, BackgroundColor, BorderColor, Radius, Padding); +*/ diff --git a/Plugins/DarkerNodes/Shaders/Panel.usf b/Plugins/DarkerNodes/Shaders/Panel.usf new file mode 100644 index 0000000..858a5ca --- /dev/null +++ b/Plugins/DarkerNodes/Shaders/Panel.usf @@ -0,0 +1,22 @@ +/* Copyright (C) 2021 Hugo ATTAL - All Rights Reserved +* This plugin is downloadable from the Unreal Engine Marketplace +*/ + +#include "lib/Shapes.usf" + +struct DarkerUIPanel +{ + static float4 ComputePane(float2 PixelSize, float2 UVs, float3 BackgroundColor, float3 BorderColor) + { + const float2 Location = UVs * PixelSize; + const float3 Color = lerp( + BorderColor, BackgroundColor, + DarkerUIShapes::IsInRectangle(Location, float2(1, 1), PixelSize - float2(1, 1))); + return float4(Color, 1.0f); + } +}; + +/* +#include "/DarkerNodes/Panel.usf" +return DarkerUIPanel::ComputePane(PixelSize, UVs, BackgroundColor, BorderColor); +*/ diff --git a/Plugins/DarkerNodes/Shaders/lib/Shapes.usf b/Plugins/DarkerNodes/Shaders/lib/Shapes.usf new file mode 100644 index 0000000..8502b48 --- /dev/null +++ b/Plugins/DarkerNodes/Shaders/lib/Shapes.usf @@ -0,0 +1,64 @@ +/* Copyright (C) 2021 Hugo ATTAL - All Rights Reserved +* This plugin is downloadable from the Unreal Engine Marketplace +*/ + +#pragma once + +#define PI 3.14159265359 +#define TWO_PI 6.28318530718 + +struct DarkerUIShapes +{ + static float IsInRectangle(float2 Location, float2 Start, float2 End) + { + return + clamp(Location.x - Start.x + 0.5, 0.0f, 1.0f) * + clamp(End.x - Location.x + 0.5, 0.0f, 1.0f) * + clamp(Location.y - Start.y + 0.5, 0.0f, 1.0f) * + clamp(End.y - Location.y + 0.5, 0.0f, 1.0f); + } + + static float IsInOutlineRectangle(float2 Location, float2 Start, float2 End, float Outline) + { + const float2 OutlineOffset = float2(Outline, Outline); + return IsInRectangle(Location, Start, End) && ! IsInRectangle(Location, Start + OutlineOffset, End - OutlineOffset); + } + + static float IsInCircle(float2 Location, float2 Center, float Radius) + { + return clamp(Radius - length(Location - Center) + 0.5f, 0.0f, 1.0f); + } + + static float IsInOutlineCircle(float2 Location, float2 Center, float Radius, float Outline) + { + return IsInCircle(Location, Center, Radius) && !IsInCircle(Location, Center, Radius - Outline); + } + + static float IsInRoundedRectangle(float2 Location, float2 Start, float2 End, float Radius) + { + float Value = 0; + + Value = max(Value, IsInRectangle(Location, Start + float2(0, Radius), End - float2(0, Radius))); + Value = max(Value, IsInRectangle(Location, Start + float2(Radius, 0), End - float2(Radius, 0))); + + Value = max(Value, IsInCircle(Location, Start + float2(Radius, Radius), Radius)); + Value = max(Value, IsInCircle(Location, End + float2(-Radius, -Radius), Radius)); + Value = max(Value, IsInCircle(Location, float2(Start.x, End.y) + float2(Radius, -Radius), Radius)); + Value = max(Value, IsInCircle(Location, float2(End.x, Start.y) + float2(-Radius, Radius), Radius)); + + return Value; + } + + static float IsInRoundedHeader(float2 Location, float2 Start, float2 End, float Radius) + { + float Value = 0; + + Value = max(Value, IsInRectangle(Location, Start + float2(0, Radius), End)); + Value = max(Value, IsInRectangle(Location, Start + float2(Radius, 0), End - float2(Radius, 0))); + + Value = max(Value, IsInCircle(Location, Start + float2(Radius, Radius), Radius)); + Value = max(Value, IsInCircle(Location, float2(End.x, Start.y) + float2(-Radius, Radius), Radius)); + + return Value; + } +}; diff --git a/Plugins/DarkerNodes/Source/DarkerNodes/DarkerNodes.Build.cs b/Plugins/DarkerNodes/Source/DarkerNodes/DarkerNodes.Build.cs new file mode 100644 index 0000000..4e0a5cd --- /dev/null +++ b/Plugins/DarkerNodes/Source/DarkerNodes/DarkerNodes.Build.cs @@ -0,0 +1,76 @@ +/* Copyright (C) 2021 Hugo ATTAL - All Rights Reserved +* This plugin is downloadable from the Unreal Engine Marketplace +*/ + +using System.IO; +using UnrealBuildTool; + +public class DarkerNodes : ModuleRules +{ + public DarkerNodes(ReadOnlyTargetRules Target) : base(Target) + { + PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs; + + PublicIncludePaths.AddRange( + new string[] { } + ); + + PrivateIncludePaths.AddRange( + new string[] { } + ); + + PublicDependencyModuleNames.AddRange( + new string[] + { + "Core" + } + ); + + PrivateDependencyModuleNames.AddRange( + new string[] + { + "CoreUObject", + "RenderCore", + "Engine", + "Slate", + "SlateCore", + "InputCore", + "UnrealEd", + "EditorStyle", + "PIEPreviewDeviceProfileSelector", + "Projects", +#if UE_4_26_OR_LATER + "DeveloperSettings", +#endif + "NiagaraEditor", + + //Check usefulness + "SceneOutliner", + "ToolMenus", + "HierarchicalLODUtilities", + "ApplicationCore", + } + ); + + DynamicallyLoadedModuleNames.AddRange( + new string[] + { } + ); + + + // DesktopPlatform is only available for Editor and Program targets (running on a desktop platform) + bool IsDesktopPlatformType = Target.Platform == UnrealBuildTool.UnrealTargetPlatform.Win32 + || Target.Platform == UnrealBuildTool.UnrealTargetPlatform.Win64 + || Target.Platform == UnrealBuildTool.UnrealTargetPlatform.Mac + || Target.Platform == UnrealBuildTool.UnrealTargetPlatform.Linux; + if (Target.Type == TargetType.Editor || (Target.Type == TargetType.Program && IsDesktopPlatformType)) + { + PrivateDependencyModuleNames.AddRange( + new string[] + { + "DesktopPlatform", + } + ); + } + } +} \ No newline at end of file diff --git a/Plugins/DarkerNodes/Source/DarkerNodes/Private/Colorizer.cpp b/Plugins/DarkerNodes/Source/DarkerNodes/Private/Colorizer.cpp new file mode 100644 index 0000000..793c461 --- /dev/null +++ b/Plugins/DarkerNodes/Source/DarkerNodes/Private/Colorizer.cpp @@ -0,0 +1,508 @@ +/* Copyright (C) 2021 Hugo ATTAL - All Rights Reserved +* This plugin is downloadable from the Unreal Engine Marketplace +*/ + +#include "Colorizer.h" + +#include "EditorStyleSet.h" +#include "Interfaces/IPluginManager.h" +#include "Classes/EditorStyleSettings.h" +#include "SettingsEditor/Public/ISettingsEditorModule.h" +#include "NiagaraEditorStyle.h" + +FColorizer::FColorizer() +{ + LoadDatabase(); + + DarkerNodesSettings = GetMutableDefault(); + + DarkerNodesSettings->OnSettingChanged().AddRaw(this, &FColorizer::Reload); + FCoreDelegates::OnPostEngineInit.AddLambda([this]() + { + if (DarkerNodesSettings->UpdateMaterials || DarkerNodesSettings->PluginVersionUpdate != CurrentPluginVersion) + { + DarkerNodesSettings->UpdateMaterials = false; + DarkerNodesSettings->PluginVersionUpdate = CurrentPluginVersion; + DarkerNodesSettings->SaveConfig(); + BrushDatabase->UpdateAndSaveMaterials(); + } + }); + + EditorStyle = static_cast(&FEditorStyle::Get()); + CoreStyle = static_cast(const_cast(&FCoreStyle::Get())); + NiagaraStyle = static_cast(const_cast(&FNiagaraEditorStyle::Get())); + PluginDirectory = IPluginManager::Get().FindPlugin(TEXT("DarkerNodes"))->GetBaseDir(); + ThemeDirectory = PluginDirectory + FString("/Resources/Theme"); + FontsDirectory = PluginDirectory + FString("/Resources/Fonts"); + GlobalSettingsFile = PluginDirectory + "/Settings.ini"; + + if (DarkerNodesSettings->UseGlobalSettings) + { + if (FPaths::FileExists(GlobalSettingsFile)) + { + DarkerNodesSettings->LoadConfig(nullptr, *GlobalSettingsFile); + } + } + + ReloadStyle(); +} + +void FColorizer::LoadDatabase() +{ + BrushDatabase = NewObject(); + + BrushDatabase->CreateSlateBrush("GreyBase", "SolidColor.SolidColor"); + BrushDatabase->CreateSlateBrush("GreyDark", "SolidColor.SolidColor"); + BrushDatabase->CreateSlateBrush("GreyLight", "SolidColor.SolidColor"); + BrushDatabase->CreateSlateBrush("Debug", "SolidColor.SolidColor"); + + BrushDatabase->CreateSlateBrush("HoverDark", "SolidColor.SolidColor"); + BrushDatabase->CreateSlateBrush("HoverBase", "SolidColor.SolidColor"); + BrushDatabase->CreateSlateBrush("HoverBaseBright", "SolidColor.SolidColor"); + + BrushDatabase->CreateSlateBrush("Primary", "SolidColor.SolidColor"); + BrushDatabase->CreateSlateColor("TextColor"); + BrushDatabase->CreateSlateBrush("ScrollbarColor", "SolidColor.SolidColor"); + BrushDatabase->CreateSlateBrush("MainWindowColor", "SolidColor.SolidColor"); + BrushDatabase->CreateSlateBrush("ChildWindowColor", "SolidColor.SolidColor"); + + BrushDatabase->CreateSlateColor("GridLine"); + BrushDatabase->CreateSlateColor("GridRule"); + BrushDatabase->CreateSlateColor("GridCenter"); + + BrushDatabase->CreateSlateBrush("Button", "Button.Button"); + BrushDatabase->CreateSlateBrush("Button_Hovered", "Button.Button"); + BrushDatabase->CreateSlateBrush("Button_Pressed", "Button.Button"); + BrushDatabase->CreateSlateBrush("Button_Disabled", "Button.Button"); + + BrushDatabase->CreateSlateBrush("Button_Start", "ButtonCut.ButtonCut"); + BrushDatabase->CreateSlateBrush("Button_Start_Hovered", "ButtonCut.ButtonCut"); + BrushDatabase->CreateSlateBrush("Button_Start_Pressed", "ButtonCut.ButtonCut"); + BrushDatabase->CreateSlateBrush("Button_Start_Checked", "ButtonCut.ButtonCut"); + BrushDatabase->CreateSlateBrush("Button_Start_Hovered_Checked", "ButtonCut.ButtonCut"); + + BrushDatabase->CreateSlateBrush("Button_Middle", "ButtonCut.ButtonCut"); + BrushDatabase->CreateSlateBrush("Button_Middle_Hovered", "ButtonCut.ButtonCut"); + BrushDatabase->CreateSlateBrush("Button_Middle_Pressed", "ButtonCut.ButtonCut"); + BrushDatabase->CreateSlateBrush("Button_Middle_Checked", "ButtonCut.ButtonCut"); + BrushDatabase->CreateSlateBrush("Button_Middle_Hovered_Checked", "ButtonCut.ButtonCut"); + + BrushDatabase->CreateSlateBrush("Button_End", "ButtonCut.ButtonCut"); + BrushDatabase->CreateSlateBrush("Button_End_Hovered", "ButtonCut.ButtonCut"); + BrushDatabase->CreateSlateBrush("Button_End_Pressed", "ButtonCut.ButtonCut"); + BrushDatabase->CreateSlateBrush("Button_End_Checked", "ButtonCut.ButtonCut"); + BrushDatabase->CreateSlateBrush("Button_End_Hovered_Checked", "ButtonCut.ButtonCut"); + + BrushDatabase->CreateSlateBrush("RegularNode_body", "Box.Box"); + BrushDatabase->CreateSlateBrush("VarNode_body", "Box.Box"); + BrushDatabase->CreateSlateBrush("RegularNode_shadow_selected", "Box.Box"); + BrushDatabase->CreateSlateBrush("VarNode_shadow_selected", "Box.Box"); + BrushDatabase->CreateSlateBrush("RegularNode_color_spill", "HeaderBox.HeaderBox"); + + BrushDatabase->CreateSlateBrush("PanelDark", "Panel.Panel"); +} + +void FColorizer::ResetColors() +{ + GreyDark = FColor(20, 20, 20); + GreyBase = FColor(40, 40, 40); + GreyLight = FColor(120, 120, 120); + + TextColor = FColor(200, 200, 200); + TextShadow = FColor(10, 10, 10); + + ButtonPrimary = FColor(0, 96, 178); + ButtonSuccess = FColor(58, 161, 17); + ButtonInfo = FColor(0, 96, 178); + ButtonWarning = FColor(223, 179, 0); + ButtonDanger = FColor(178, 0, 0); +} + +void FColorizer::ReloadStyle() +{ + if (!DarkerNodesSettings->MasterActivate) + { + return; + } + + ResetColors(); + + switch (DarkerNodesSettings->ThemeLight) + { + case EThemeLight::Dark: + GreyBase = OffsetColor(GreyBase, 20); + GreyDark = OffsetColor(GreyDark, 20); + GreyLight = OffsetColor(GreyLight, 20); + break; + case EThemeLight::Darker: + break; + case EThemeLight::Darkest: + GreyBase = OffsetColor(GreyBase, -20); + GreyDark = OffsetColor(GreyDark, -10); + GreyLight = OffsetColor(GreyLight, -10); + break; + } + + if (DarkerNodesSettings->LightTheme) + { + GreyBase = InvertLight(GreyBase); + GreyDark = InvertLight(GreyDark); + GreyLight = InvertLight(GreyLight); + TextColor = InvertLight(TextColor); + TextShadow = InvertLight(TextShadow); + ImageColor = InvertLight(ImageColor); + } + + const FColor WarmLayer = FColor(229, 110, 23); + const FColor CoolLayer = FColor(23, 141, 229); + + switch (DarkerNodesSettings->ThemeTemperature) + { + case EThemeTemperature::Cooler: + GreyBase = MixColor(GreyBase, CoolLayer, 0.05); + GreyDark = MixColor(GreyDark, CoolLayer, 0.05); + GreyLight = MixColor(GreyLight, CoolLayer, 0.05); + break; + case EThemeTemperature::Cool: + GreyBase = MixColor(GreyBase, CoolLayer, 0.025); + GreyDark = MixColor(GreyDark, CoolLayer, 0.025); + GreyLight = MixColor(GreyLight, CoolLayer, 0.025); + break; + case EThemeTemperature::Normal: + break; + case EThemeTemperature::Warm: + GreyBase = MixColor(GreyBase, WarmLayer, 0.025); + GreyDark = MixColor(GreyDark, WarmLayer, 0.025); + GreyLight = MixColor(GreyLight, WarmLayer, 0.025); + break; + case EThemeTemperature::Warmer: + GreyBase = MixColor(GreyBase, WarmLayer, 0.05); + GreyDark = MixColor(GreyDark, WarmLayer, 0.05); + GreyLight = MixColor(GreyLight, WarmLayer, 0.05); + break; + } + + // Cyan = Orange + 180 + // Purple = Orange - 100 + // Green = Orange + 80 + // Red = Orange - 25 + + const FColor White = FColor(126, 126, 126); + const FColor Orange = FColor(229, 110, 23); + const FColor Cyan = FColor(23, 141, 229); + const FColor Red = FColor(229, 25, 23); + const FColor Purple = FColor(178, 23, 229); + const FColor Green = FColor(74, 229, 23); + + switch (DarkerNodesSettings->PrimaryColor) + { + case EPrimaryColor::White: + Primary = White; + break; + case EPrimaryColor::Orange: + Primary = Orange; + break; + case EPrimaryColor::Cyan: + Primary = Cyan; + break; + case EPrimaryColor::Red: + Primary = Red; + break; + case EPrimaryColor::Purple: + Primary = Purple; + break; + case EPrimaryColor::Green: + Primary = Green; + break; + } + + if (DarkerNodesSettings->UseGreyCustomization) + { + GreyBase = DarkerNodesSettings->GreyBase; + GreyDark = DarkerNodesSettings->GreyDark; + GreyLight = DarkerNodesSettings->GreyLight; + } + + ScrollbarColor = GreyDark; + MainWindowColor = GreyBase; + ChildWindowColor = GreyBase; + + RegularNodeBackground = MixColor(FColor::Black, GreyDark, 0.5f).WithAlpha(255 * 0.75f); + RegularNodeBorder = MixColor(FColor::Black, GreyDark, 0.5f); + + switch (DarkerNodesSettings->BlueprintVarNodeStyle) + { + case EBlueprintVarNodeStyle::DarkSolid: + VarNodeBackground = MixColor(FColor::Black, GreyDark, 0.5f).WithAlpha(255 * 0.75f); + VarNodeBorder = MixColor(FColor::Black, GreyDark, 0.5f); + break; + case EBlueprintVarNodeStyle::LightSolid: + VarNodeBackground = GreyLight.WithAlpha(255 * 0.30f); + VarNodeBorder = GreyLight; + break; + case EBlueprintVarNodeStyle::DarkGlass: + VarNodeBackground = MixColor(FColor::Black, GreyDark, 0.5f).WithAlpha(255 * 0.30f); + VarNodeBorder = MixColor(FColor::Black, GreyDark, 0.5f); + break; + case EBlueprintVarNodeStyle::LightGlass: + VarNodeBackground = GreyLight.WithAlpha(255 * 0.10f); + VarNodeBorder = GreyLight; + break; + } + + switch (DarkerNodesSettings->ButtonBorder) + { + case EButtonBorder::None: + ButtonBorderColor = GreyDark; + break; + case EButtonBorder::Dark: + ButtonBorderColor = MixColor(GreyDark, FColor::Black, 0.5f); + break; + case EButtonBorder::Light: + ButtonBorderColor = MixColor(GreyDark, FColor::White, 0.1f); + break; + } + + if (!DarkerNodesSettings->DisableUMGGrid) + { + GridLineColor = MixColor(GreyDark, GreyBase, 0.5f); + GridRuleColor = GreyBase; + GridCenterColor = MixColor(GreyBase, GreyLight, DarkerNodesSettings->OriginAxisOpacity); + } + else + { + GridLineColor = GreyDark; + GridRuleColor = GreyDark; + GridCenterColor = MixColor(GreyDark, GreyLight, DarkerNodesSettings->OriginAxisOpacity); + } + + if (DarkerNodesSettings->UseColorCustomization) + { + Primary = DarkerNodesSettings->CustomPrimaryColor; + TextColor = DarkerNodesSettings->TextColor; + ScrollbarColor = DarkerNodesSettings->ScrollbarColor; + } + + if (DarkerNodesSettings->UseWindowCustomization) + { + MainWindowColor = DarkerNodesSettings->MainWindowColor; + ChildWindowColor = DarkerNodesSettings->ChildWindowColor; + } + + if (DarkerNodesSettings->UseButtonColorCustomization) + { + ButtonBorderColor = DarkerNodesSettings->ButtonBorderColor; + ButtonPrimary = DarkerNodesSettings->ButtonPrimary; + ButtonSuccess = DarkerNodesSettings->ButtonSuccess; + ButtonInfo = DarkerNodesSettings->ButtonInfo; + ButtonWarning = DarkerNodesSettings->ButtonWarning; + ButtonDanger = DarkerNodesSettings->ButtonDanger; + } + + if (DarkerNodesSettings->UseBlueprintColorCustomization) + { + GridLineColor = DarkerNodesSettings->GridLineColor; + GridRuleColor = DarkerNodesSettings->GridRuleColor; + GridCenterColor = DarkerNodesSettings->GridCenterColor; + + RegularNodeBackground = DarkerNodesSettings->RegularNodeBackground; + RegularNodeBorder = DarkerNodesSettings->RegularNodeBorder; + VarNodeBackground = DarkerNodesSettings->VarNodeBackground; + VarNodeBorder = DarkerNodesSettings->VarNodeBorder; + } + + HoverDark = MixColor(GreyDark, Primary, 0.1); + HoverBase = MixColor(GreyBase, Primary, 0.1); + HoverBaseBright = MixColor(GreyBase, Primary, 0.5); + + if (DarkerNodesSettings->OverwriteColors) + { + if (!DarkerNodesSettings->UseGreyCustomization) + { + DarkerNodesSettings->GreyBase = GreyBase; + DarkerNodesSettings->GreyDark = GreyDark; + DarkerNodesSettings->GreyLight = GreyLight; + } + + if (!DarkerNodesSettings->UseColorCustomization) + { + DarkerNodesSettings->CustomPrimaryColor = Primary; + DarkerNodesSettings->TextColor = TextColor; + DarkerNodesSettings->ScrollbarColor = ScrollbarColor; + } + + if (!DarkerNodesSettings->UseWindowCustomization) + { + DarkerNodesSettings->MainWindowColor = MainWindowColor; + DarkerNodesSettings->ChildWindowColor = ChildWindowColor; + } + + if (!DarkerNodesSettings->UseButtonColorCustomization) + { + DarkerNodesSettings->ButtonBorderColor = ButtonBorderColor; + DarkerNodesSettings->ButtonPrimary = ButtonPrimary; + DarkerNodesSettings->ButtonSuccess = ButtonSuccess; + DarkerNodesSettings->ButtonInfo = ButtonInfo; + DarkerNodesSettings->ButtonWarning = ButtonWarning; + DarkerNodesSettings->ButtonDanger = ButtonDanger; + } + + if (!DarkerNodesSettings->UseBlueprintColorCustomization) + { + DarkerNodesSettings->GridLineColor = GridLineColor; + DarkerNodesSettings->GridRuleColor = GridRuleColor; + DarkerNodesSettings->GridCenterColor = GridCenterColor; + + DarkerNodesSettings->RegularNodeBackground = RegularNodeBackground; + DarkerNodesSettings->RegularNodeBorder = RegularNodeBorder; + DarkerNodesSettings->VarNodeBackground = VarNodeBackground; + DarkerNodesSettings->VarNodeBorder = VarNodeBorder; + } + } + + ApplyParameters(); +} + +void FColorizer::Color() +{ + if (!DarkerNodesSettings->MasterActivate) + { + return; + } + + if (!FApp::HasProjectName()) + { + return; + } + + SaveStyleForUMG(); + + ColorText(); + ColorGraph(); + ColorButtons(); + ColorCheckbox(); + ColorPanel(); + ColorWindow(); + ColorIcons(); + ColorIconsCustom(); + + ReloadTextureResources(); +} + + +void FColorizer::ReloadTextureResources() +{ + if (FSlateApplication::IsInitialized()) + { + FSlateApplication::Get().GetRenderer()->ReloadTextureResources(); + } +} + +#if ENGINE_MAJOR_VERSION == 4 && ENGINE_MINOR_VERSION <= 25 +void FColorizer::Reload(FName PropertyName) +#else +void FColorizer::Reload(UObject* Object, struct FPropertyChangedEvent& Property) +#endif +{ +#if ENGINE_MAJOR_VERSION == 4 && ENGINE_MINOR_VERSION > 25 + const FName PropertyName = Property.GetPropertyName(); +#endif + + if (DarkerNodesSettings->ReloadDefaultStyle) + { + UE_LOG(LogTemp, Log, TEXT("[Darker Nodes] Reloading default style...")); + UEditorStyleSettings* StyleSettings = GetMutableDefault(); + StyleSettings->SelectionColor = FLinearColor(0.728f, 0.364f, 0.003f); + StyleSettings->PressedSelectionColor = FLinearColor(0.701f, 0.225f, 0.003f); + StyleSettings->InactiveSelectionColor = FLinearColor(0.25f, 0.25f, 0.25f); + StyleSettings->EditorChildWindowBackgroundOverride = FSlateBrush(); + StyleSettings->EditorMainWindowBackgroundOverride = FSlateBrush(); + StyleSettings->RegularColor = FLinearColor(0.035, 0.035, 0.035); + StyleSettings->RuleColor = FLinearColor(0.008, 0.008, 0.008); + StyleSettings->CenterColor = FLinearColor::Black; + StyleSettings->bUseGrid = true; + StyleSettings->SaveConfig(); + UE_LOG(LogTemp, Log, TEXT("[Darker Nodes] Done!")); + + DarkerNodesSettings->ReloadDefaultStyle = false; + } + + if (PropertyName == "UseGlobalSettings") + { + if (DarkerNodesSettings->UseGlobalSettings) + { + if (FPaths::FileExists(GlobalSettingsFile)) + { + DarkerNodesSettings->LoadConfig(nullptr, *GlobalSettingsFile); + } + else + { + DarkerNodesSettings->SaveConfig(CPF_Config, *GlobalSettingsFile); + } + } + } + + if (DarkerNodesSettings->LoadGlobalSettings) + { + if (FPaths::FileExists(GlobalSettingsFile)) + { + DarkerNodesSettings->LoadConfig(nullptr, *GlobalSettingsFile); + } + DarkerNodesSettings->LoadGlobalSettings = false; + } + + if (DarkerNodesSettings->ReloadTextureResources) + { + DarkerNodesSettings->ReloadTextureResources = false; + ReloadTextureResources(); + } + + if (DarkerNodesSettings->UpdateMaterials) + { + DarkerNodesSettings->UpdateMaterials = false; + BrushDatabase->UpdateAndSaveMaterials(); + } + + if (!DarkerNodesSettings->MasterActivate) + { + return; + } + + ReloadStyle(); + + ISettingsEditorModule* SettingsEditorModule = FModuleManager::GetModulePtr("SettingsEditor"); + if (SettingsEditorModule) + { + UEditorStyleSettings* StyleSettings = GetMutableDefault(); + StyleSettings->SelectionColor = FLinearColor::FromSRGBColor(Primary); + StyleSettings->PressedSelectionColor = FLinearColor::FromSRGBColor(Primary); + StyleSettings->InactiveSelectionColor = FLinearColor::FromSRGBColor(HoverBase); + StyleSettings->bUseGrid = !DarkerNodesSettings->DisableBlueprintGrid; + StyleSettings->SaveConfig(); + + SettingsEditorModule->OnApplicationRestartRequired(); + } + + DarkerNodesSettings->SaveConfig(); + + if (DarkerNodesSettings->UseGlobalSettings) + { + DarkerNodesSettings->SaveConfig(CPF_Config, *GlobalSettingsFile); + } +} + +FColor FColorizer::MixColor(FColor Base, FColor Layer, float Alpha) const +{ + Base.R = FMath::Lerp(Base.R, Layer.R, Alpha); + Base.G = FMath::Lerp(Base.G, Layer.G, Alpha); + Base.B = FMath::Lerp(Base.B, Layer.B, Alpha); + return Base; +} + +FColor FColorizer::OffsetColor(FColor Base, int Offset) +{ + Base.R += Offset; + Base.G += Offset; + Base.B += Offset; + return Base; +} diff --git a/Plugins/DarkerNodes/Source/DarkerNodes/Private/Colorizer.h b/Plugins/DarkerNodes/Source/DarkerNodes/Private/Colorizer.h new file mode 100644 index 0000000..5f43031 --- /dev/null +++ b/Plugins/DarkerNodes/Source/DarkerNodes/Private/Colorizer.h @@ -0,0 +1,143 @@ +/* Copyright (C) 2021 Hugo ATTAL - All Rights Reserved +* This plugin is downloadable from the Unreal Engine Marketplace +*/ + +#pragma once + +#include "CoreMinimal.h" + +#include "DarkerNodesSettings.h" +#include "Lib/BrushDatabase.h" +#include "Styling/SlateStyle.h" + +class FColorizer +{ +public: + FColorizer(); + void Color(); + +private: + void ReloadStyle(); + void SaveStyleForUMG(); + void ApplyFonts() const; + + // Colorizers + void ColorText(); + void ColorGraph(); + void ColorButtons(); + void ColorCheckbox(); + void ColorPanel(); + void ColorWindow(); + void ColorIcons(); + void ColorIconsCustom(); + + static void ReloadTextureResources(); + + // Inside Var + FString PluginDirectory; + FString ThemeDirectory; + FString FontsDirectory; + FString GlobalSettingsFile; + FSlateStyleSet* EditorStyle; + FSlateStyleSet* CoreStyle; + FSlateStyleSet* NiagaraStyle; + + const FString CurrentPluginVersion = "2.6"; + + // Utilities + void LoadDatabase(); + void ApplyParameters() const; + +#if ENGINE_MAJOR_VERSION == 4 && ENGINE_MINOR_VERSION <= 25 + void Reload(FName PropertyName); +#else + void Reload(UObject* Object, struct FPropertyChangedEvent& Property); +#endif + + + FColor MixColor(FColor Base, FColor Layer, float Alpha) const; + FColor OffsetColor(FColor Base, int Offset); + + void AddMenuIcon(FSlateStyleSet* StyleSet, FString Name, FString Location, FColor Color) const; + void ApplyImageBrush(FSlateStyleSet* StyleSet, FName Name, FString Location, FVector2D Size) const; + void ApplyImageBrush(FSlateStyleSet* StyleSet, FName Name, FString Location, FVector2D Size, FColor Color) const; + + FSlateImageBrush ImageBrush(FString Location, FVector2D Size = FVector2D(16, 16)) const; + FSlateImageBrush ImageBrush(FString Location, FVector2D Size, FColor Color) const; + FSlateImageBrush ColorImageBrush(FColor Color = FColor::White, FVector2D Size = FVector2D(16, 16)) const; + + void ApplyBoxBrush(FSlateStyleSet* StyleSet, FName Name, FString Location, FMargin Margin = 0.25, FColor Color = FColor::White) const; + void ApplyColorBoxBrush(FSlateStyleSet* StyleSet, FName Name, FColor Color) const; + FSlateBoxBrush BoxBrush(FString Location, FVector2D Size, FMargin Margin = 0.25, FColor Color = FColor::White) const; + + void ApplyColorBorderBrush(FSlateStyleSet* StyleSet, FName Name, FColor Color) const; + FSlateBorderBrush BorderBrush(FString Location, FMargin Margin = FMargin(0.25), FColor Color = FColor::White) const; + FSlateBorderBrush ColorBorderBrush(FColor Color, FMargin Margin = FMargin(0.25)) const; + + void ApplyCenterIcon(FSlateStyleSet* StyleSet, FName Name, FString Location, FVector2D Size = FVector2D(16, 16), FColor Color = FColor::White) const; + FSlateBrush* CenterIcon(FName Name, FString Location, FVector2D Size = FVector2D(16, 16), FColor Color = FColor::White) const; + + void ResetColors(); + FColor InvertLight(FColor Color); + FSlateBrush* SlateBrush(FString Name) const; + + int32 GetFontSize(int32 BaseSize) const; + + // Icons + + FVector2D Icon0 = FVector2D::ZeroVector; + FVector2D Icon8 = FVector2D(8, 8); + FVector2D Icon10 = FVector2D(10, 10); + FVector2D Icon12 = FVector2D(12, 12); + FVector2D Icon14 = FVector2D(14, 14); + FVector2D Icon16 = FVector2D(16, 16); + FVector2D Icon20 = FVector2D(20, 20); + FVector2D Icon24 = FVector2D(24, 24); + FVector2D Icon32 = FVector2D(32, 32); + FVector2D Icon40 = FVector2D(40, 40); + FVector2D Icon256 = FVector2D(256, 256); + + // Colors + + FColor DebugRed = FColor(255, 0, 0); + FColor DebugGreen = FColor(0, 255, 0); + FColor DebugBlue = FColor(0, 0, 255); + + FColor GreyDark = FColor(20, 20, 20); + FColor GreyBase = FColor(40, 40, 40); + FColor GreyLight = FColor(120, 120, 120); + + FColor Primary; + FColor HoverDark; + FColor HoverBase; + FColor HoverBaseBright; + + FColor TextColor = FColor(200, 200, 200); + FColor TextShadow = FColor(10, 10, 10); + FColor ScrollbarColor = FColor(20, 20, 20); + FColor MainWindowColor = FColor(40, 40, 40); + FColor ChildWindowColor = FColor(40, 40, 40); + + FColor GridLineColor; + FColor GridRuleColor; + FColor GridCenterColor; + + FColor RegularNodeBackground; + FColor RegularNodeBorder; + FColor VarNodeBackground; + FColor VarNodeBorder; + + FColor ButtonBorderColor = FColor::Transparent; + FColor ButtonPrimary = FColor(0, 96, 178); + FColor ButtonSuccess = FColor(58, 161, 17); + FColor ButtonInfo = FColor(0, 96, 178); + FColor ButtonWarning = FColor(223, 179, 0); + FColor ButtonDanger = FColor(178, 0, 0); + + FColor ImageColor = FColor(255, 255, 255); + + FTextBlockStyle NormalText; + + UBrushDatabase* BrushDatabase; + UDarkerNodesSettings* DarkerNodesSettings; +}; diff --git a/Plugins/DarkerNodes/Source/DarkerNodes/Private/Colorizer/ColorizerButtons.cpp b/Plugins/DarkerNodes/Source/DarkerNodes/Private/Colorizer/ColorizerButtons.cpp new file mode 100644 index 0000000..7235149 --- /dev/null +++ b/Plugins/DarkerNodes/Source/DarkerNodes/Private/Colorizer/ColorizerButtons.cpp @@ -0,0 +1,336 @@ +/* Copyright (C) 2021 Hugo ATTAL - All Rights Reserved +* This plugin is downloadable from the Unreal Engine Marketplace +*/ + +#include "Colorizer.h" +#include "Materials/MaterialInstanceDynamic.h" +#include "PIEPreviewDeviceProfileSelector/Private/PIEPreviewWindowCoreStyle.h" + +void FColorizer::ColorButtons() +{ + if (!DarkerNodesSettings->UseCustomButton) + { + return; + } + + FMargin Margin; + const FMargin SmallMargin = FMargin(2); + + switch (DarkerNodesSettings->ButtonPadding) + { + case EButtonPadding::None: + Margin = FMargin(2, 0); + break; + case EButtonPadding::Small: + Margin = FMargin(2); + break; + case EButtonPadding::Normal: + Margin = FMargin(4); + break; + case EButtonPadding::Big: + Margin = FMargin(8); + break; + } + + SlateBrush("Button")->SetImageSize(Icon16); + SlateBrush("Button_Hovered")->SetImageSize(Icon16); + SlateBrush("Button_Pressed")->SetImageSize(Icon16); + + // Button + const FButtonStyle Button = + FButtonStyle() + .SetNormal(*SlateBrush("Button")) + .SetHovered(*SlateBrush("Button_Hovered")) + .SetPressed(*SlateBrush("Button_Pressed")) + .SetDisabled(*SlateBrush("Button_Disabled")) + .SetNormalPadding(Margin) + .SetPressedPadding(Margin); + CoreStyle->Set("Button", Button); + + const FComboButtonStyle ComboButton = + FComboButtonStyle() + .SetButtonStyle(Button) + .SetDownArrowImage(ImageBrush("/Elements/Button/ComboArrow.png", Icon8)) + .SetMenuBorderBrush(*SlateBrush("Button")) + .SetMenuBorderPadding(Margin); + CoreStyle->Set("ComboButton", ComboButton); + + const FComboBoxStyle ComboBox = FComboBoxStyle() + .SetComboButtonStyle(ComboButton); + CoreStyle->Set("ComboBox", ComboBox); + + + EditorStyle->Set("FilePath.FolderButton", Button); + EditorStyle->Set("PropertyEditor.AssetComboStyle", Button); + + // Scrollbar + + FScrollBarStyle ScrollBar = CoreStyle->GetWidgetStyle("ScrollBar"); + + if (DarkerNodesSettings->UseCustomScrollbar) + { + ScrollBar = + FScrollBarStyle() + .SetVerticalTopSlotImage(ColorImageBrush(GreyBase, Icon8)) + .SetVerticalBottomSlotImage(ColorImageBrush(GreyBase, Icon8)) + .SetHorizontalTopSlotImage(ColorImageBrush(GreyBase, Icon8)) + .SetHorizontalBottomSlotImage(ColorImageBrush(GreyBase, Icon8)) + .SetNormalThumbImage(*SlateBrush("ScrollbarColor")) + .SetDraggedThumbImage(*SlateBrush("ScrollbarColor")) + .SetHoveredThumbImage(*SlateBrush("ScrollbarColor")); + } + + CoreStyle->Set("Scrollbar", ScrollBar); + EditorStyle->Set("Scrollbar", ScrollBar); + + + // Textbox + + const FEditableTextBoxStyle NormalEditableTextBoxStyle = + FEditableTextBoxStyle() + .SetFont(NormalText.Font) + .SetBackgroundImageNormal(*SlateBrush("Button")) + .SetBackgroundImageHovered(*SlateBrush("Button_Hovered")) + .SetBackgroundImageFocused(*SlateBrush("Button_Hovered")) + .SetBackgroundImageReadOnly(*SlateBrush("Button_Disabled")) + .SetScrollBarStyle(ScrollBar) + .SetForegroundColor(*BrushDatabase->GetSlateColor("TextColor")); + CoreStyle->Set("NormalEditableTextBox", NormalEditableTextBoxStyle); + CoreStyle->Set("SpecialEditableTextBox", NormalEditableTextBoxStyle); + NiagaraStyle->Set("NiagaraEditor.ParameterEditableTextBox", NormalEditableTextBoxStyle); + + EditorStyle->Set("EditableTextBox.Background.Normal", SlateBrush("Button")); + EditorStyle->Set("EditableTextBox.Background.Hovered", SlateBrush("Button_Hovered")); + EditorStyle->Set("EditableTextBox.Background.Focused", SlateBrush("Button_Hovered")); + EditorStyle->Set("EditableTextBox.Background.ReadOnly", SlateBrush("Button_Disabled")); + + const FSpinBoxStyle SpinBox = + FSpinBoxStyle() + .SetBackgroundBrush(*SlateBrush("Button")) + .SetHoveredBackgroundBrush(*SlateBrush("Button_Hovered")) + .SetActiveFillBrush(*SlateBrush("Button_Hovered")) + .SetInactiveFillBrush(*SlateBrush("Button")) + .SetArrowsImage(ImageBrush("/Elements/Textbox/SpinArrows.png", Icon12)) + .SetForegroundColor(*BrushDatabase->GetSlateColor("TextColor")) + .SetTextPadding(Margin); + + CoreStyle->Set("SpinBox", SpinBox); + EditorStyle->Set("SpinBox", SpinBox); + CoreStyle->Set("NumericEntrySpinBox", SpinBox); + EditorStyle->Set("NumericEntrySpinBox", SpinBox); + CoreStyle->Set("NumericEntrySpinBox_Dark", SpinBox); + NiagaraStyle->Set("NiagaraEditor.ParameterSpinbox", SpinBox); + + // Tableview + + const FTableRowStyle DefaultTableRowStyle = + FTableRowStyle() + .SetEvenRowBackgroundBrush(FSlateNoResource()) + .SetEvenRowBackgroundHoveredBrush(ColorImageBrush(HoverBase)) + .SetOddRowBackgroundBrush(FSlateNoResource()) + .SetOddRowBackgroundHoveredBrush(ColorImageBrush(HoverBase)) + .SetSelectorFocusedBrush(BorderBrush("/Elements/Table/Selector.png", FMargin(0.25), HoverBaseBright)) + .SetActiveBrush(ColorImageBrush(HoverBase)) + .SetActiveHoveredBrush(ColorImageBrush(HoverBase)) + .SetInactiveBrush(ColorImageBrush(HoverBase)) + .SetInactiveHoveredBrush(ColorImageBrush(HoverBase)) + .SetActiveHighlightedBrush(ColorImageBrush(HoverBase)) + .SetInactiveHighlightedBrush(ColorImageBrush(HoverBase)) + .SetTextColor(FLinearColor::FromSRGBColor(TextColor)) + .SetSelectedTextColor(FLinearColor::FromSRGBColor(TextColor)) + .SetDropIndicator_Above(BorderBrush("/Elements/Table/DropZoneIndicator_Above.png", FMargin(10.0f / 16.0f, 10.0f / 16.0f, 0, 0), HoverBaseBright)) + .SetDropIndicator_Onto(BorderBrush("/Elements/Table/DropZoneIndicator_Onto.png", FMargin(0.25), HoverBaseBright)) + .SetDropIndicator_Below(BorderBrush("/Elements/Table/DropZoneIndicator_Below.png", FMargin(10.0f / 16.0f, 0, 0, 10.0f / 16.0f), HoverBaseBright)); + CoreStyle->Set("TableView.Row", FTableRowStyle(DefaultTableRowStyle)); + EditorStyle->Set("TableView.Row", FTableRowStyle(DefaultTableRowStyle)); + + // SmallRounded + + BrushDatabase->GetDynamicMaterial("Button_Start")->SetScalarParameterValue("Part", -1); + BrushDatabase->GetDynamicMaterial("Button_Start_Hovered")->SetScalarParameterValue("Part", -1); + BrushDatabase->GetDynamicMaterial("Button_Start_Pressed")->SetScalarParameterValue("Part", -1); + BrushDatabase->GetDynamicMaterial("Button_Start_Checked")->SetScalarParameterValue("Part", -1); + BrushDatabase->GetDynamicMaterial("Button_Start_Hovered_Checked")->SetScalarParameterValue("Part", -1); + + BrushDatabase->GetDynamicMaterial("Button_Middle")->SetScalarParameterValue("Part", 0); + BrushDatabase->GetDynamicMaterial("Button_Middle_Hovered")->SetScalarParameterValue("Part", 0); + BrushDatabase->GetDynamicMaterial("Button_Middle_Pressed")->SetScalarParameterValue("Part", 0); + BrushDatabase->GetDynamicMaterial("Button_Middle_Checked")->SetScalarParameterValue("Part", 0); + BrushDatabase->GetDynamicMaterial("Button_Middle_Hovered_Checked")->SetScalarParameterValue("Part", 0); + + BrushDatabase->GetDynamicMaterial("Button_End")->SetScalarParameterValue("Part", 1); + BrushDatabase->GetDynamicMaterial("Button_End_Hovered")->SetScalarParameterValue("Part", 1); + BrushDatabase->GetDynamicMaterial("Button_End_Pressed")->SetScalarParameterValue("Part", 1); + BrushDatabase->GetDynamicMaterial("Button_End_Checked")->SetScalarParameterValue("Part", 1); + BrushDatabase->GetDynamicMaterial("Button_End_Hovered_Checked")->SetScalarParameterValue("Part", 1); + + EditorStyle->Set("EditorViewportToolBar.MenuButton", FButtonStyle(Button)); + EditorStyle->Set("EditorViewportToolBar.MenuButtonWarning", FButtonStyle(Button)); + EditorStyle->Set("ViewportPinnedCommandList.Button", FButtonStyle(Button)); + EditorStyle->Set("ViewportMenu.Button", FButtonStyle(Button)); + EditorStyle->Set( + "ViewportMenu.Button.Start", + FButtonStyle(Button) + .SetNormal(*SlateBrush("Button_Start")) + .SetHovered(*SlateBrush("Button_Start_Hovered")) + .SetPressed(*SlateBrush("Button_Start_Pressed"))); + EditorStyle->Set( + "ViewportMenu.Button.Middle", + FButtonStyle(Button) + .SetNormal(*SlateBrush("Button_Middle")) + .SetHovered(*SlateBrush("Button_Middle_Hovered")) + .SetPressed(*SlateBrush("Button_Middle_Pressed"))); + EditorStyle->Set( + "ViewportMenu.Button.End", + FButtonStyle(Button) + .SetNormal(*SlateBrush("Button_End")) + .SetHovered(*SlateBrush("Button_End_Hovered")) + .SetPressed(*SlateBrush("Button_End_Pressed"))); + + const FCheckBoxStyle ToggleStart = + FCheckBoxStyle() + .SetCheckBoxType(ESlateCheckBoxType::ToggleButton) + .SetUncheckedImage(*SlateBrush("Button_Start")) + .SetUncheckedHoveredImage(*SlateBrush("Button_Start_Hovered")) + .SetUncheckedPressedImage(*SlateBrush("Button_Start_Pressed")) + .SetCheckedImage(*SlateBrush("Button_Start_Checked")) + .SetCheckedHoveredImage(*SlateBrush("Button_Start_Hovered_Checked")) + .SetCheckedPressedImage(*SlateBrush("Button_Start_Pressed")) + .SetPadding(Margin); + + const FCheckBoxStyle ToggleMiddle = + FCheckBoxStyle() + .SetCheckBoxType(ESlateCheckBoxType::ToggleButton) + .SetUncheckedImage(*SlateBrush("Button_Middle")) + .SetUncheckedHoveredImage(*SlateBrush("Button_Middle_Hovered")) + .SetUncheckedPressedImage(*SlateBrush("Button_Middle_Pressed")) + .SetCheckedImage(*SlateBrush("Button_Middle_Checked")) + .SetCheckedHoveredImage(*SlateBrush("Button_Middle_Hovered_Checked")) + .SetCheckedPressedImage(*SlateBrush("Button_Middle_Pressed")) + .SetPadding(Margin); + + const FCheckBoxStyle ToggleEnd = + FCheckBoxStyle() + .SetCheckBoxType(ESlateCheckBoxType::ToggleButton) + .SetUncheckedImage(*SlateBrush("Button_End")) + .SetUncheckedHoveredImage(*SlateBrush("Button_End_Hovered")) + .SetUncheckedPressedImage(*SlateBrush("Button_End_Pressed")) + .SetCheckedImage(*SlateBrush("Button_End_Checked")) + .SetCheckedHoveredImage(*SlateBrush("Button_End_Hovered_Checked")) + .SetCheckedPressedImage(*SlateBrush("Button_End_Pressed")) + .SetPadding(Margin); + + + EditorStyle->Set("ViewportMenu.ToggleButton.Start", ToggleStart); + EditorStyle->Set("ViewportMenu.ToggleButton.Middle", ToggleMiddle); + EditorStyle->Set("ViewportMenu.ToggleButton.End", ToggleEnd); + + EditorStyle->Set("Property.ToggleButton.Start", ToggleStart); + EditorStyle->Set("Property.ToggleButton.Middle", ToggleMiddle); + EditorStyle->Set("Property.ToggleButton.End", ToggleEnd); + + CoreStyle->Set( + "ToolBar.Button", + FButtonStyle(Button) + .SetNormal(FSlateNoResource()) + .SetPressed(*SlateBrush("HoverDark")) + .SetHovered(*SlateBrush("HoverDark")) + .SetNormalPadding(SmallMargin) + .SetPressedPadding(SmallMargin) + ); + + + CoreStyle->Set("ToolBar.Button.Pressed", SlateBrush("HoverDark")); + CoreStyle->Set("ToolBar.Button.Hovered", SlateBrush("HoverDark")); + + CoreStyle->Set("ToolBar.Button.Checked", SlateBrush("HoverBase")); + CoreStyle->Set("ToolBar.Button.Checked_Hovered", SlateBrush("HoverDark")); + CoreStyle->Set("ToolBar.Button.Checked_Pressed", SlateBrush("HoverDark")); + + EditorStyle->Set("PropertyWindow.CategoryBackground", SlateBrush("Button")); + + CoreStyle->Set( + "Menu.Button", + FButtonStyle(Button) + .SetNormal(FSlateNoResource()) + .SetHovered(*SlateBrush("Primary")) + .SetPressed(*SlateBrush("Primary")) + .SetNormalPadding(FMargin(0, 1)) + .SetPressedPadding(FMargin(0, 2, 0, 0)) + ); + + CoreStyle->Set("Menu.Button.Checked", SlateBrush("HoverDark")); + CoreStyle->Set("Menu.Button.Checked_Hovered", SlateBrush("HoverDark")); + CoreStyle->Set("Menu.Button.Checked_Pressed", SlateBrush("HoverDark")); + CoreStyle->Set("Menu.Button.SubMenuOpen", SlateBrush("HoverDark")); + + const FButtonStyle ToggleButton = + FButtonStyle(Button) + .SetNormal(FSlateNoResource()) + .SetHovered(*SlateBrush("HoverBase")) + .SetPressed(*SlateBrush("HoverBase")) + .SetNormalPadding(FMargin(0)) + .SetPressedPadding(FMargin(0)); + + const FButtonStyle RoundButton = + FButtonStyle(ToggleButton) + .SetNormal(*SlateBrush("GreyBase")) + .SetHovered(*SlateBrush("HoverBase")) + .SetPressed(*SlateBrush("HoverBase")); + EditorStyle->Set("ToggleButton", ToggleButton); + EditorStyle->Set("FlatButton", ToggleButton); + + //FSlateColorBrush(FLinearColor::White) + + EditorStyle->Set("RoundButton", RoundButton); + EditorStyle->Set( + "FlatButton", + FButtonStyle(Button) + .SetNormal(*SlateBrush("GreyBase")) + .SetHovered(*SlateBrush("HoverBase")) + .SetPressed(*SlateBrush("HoverBase")) + ); + EditorStyle->Set("FlatButton.Dark", RoundButton); + EditorStyle->Set("FlatButton.DarkGrey", RoundButton); + EditorStyle->Set("FlatButton.Light", RoundButton); + EditorStyle->Set("FlatButton.Default", RoundButton); + + + struct ButtonColor + { + FName Name; + FColor Normal; + FColor Hovered; + + ButtonColor(const FName& InName, const FColor& Color) : Name(InName) + { + Normal = Color; + Normal.A = Color.A * 0.75; + Hovered = Color; + Hovered.A = Color.A * 1.0; + } + }; + + // Red #b20000 + // Blue #0060b2 + // Yellow #dfb300 + // Green #3aa111 + + TArray FlatButtons; + FlatButtons.Add(ButtonColor("FlatButton.Primary", ButtonPrimary)); + FlatButtons.Add(ButtonColor("FlatButton.Success", ButtonSuccess)); + FlatButtons.Add(ButtonColor("FlatButton.Info", ButtonInfo)); + FlatButtons.Add(ButtonColor("FlatButton.Warning", ButtonWarning)); + FlatButtons.Add(ButtonColor("FlatButton.Danger", ButtonDanger)); + + for (const ButtonColor& Entry : FlatButtons) + { + EditorStyle->Set( + Entry.Name, + FButtonStyle(Button) + .SetNormal(BoxBrush("/Elements/Button/FlatButton.png", Icon0, 0.25, Entry.Normal)) + .SetHovered(BoxBrush("/Elements/Button/FlatButton.png", Icon0, 0.25, Entry.Hovered)) + .SetPressed(BoxBrush("/Elements/Button/FlatButton.png", Icon0, 0.25, Entry.Hovered)) + ); + } +} diff --git a/Plugins/DarkerNodes/Source/DarkerNodes/Private/Colorizer/ColorizerCheckbox.cpp b/Plugins/DarkerNodes/Source/DarkerNodes/Private/Colorizer/ColorizerCheckbox.cpp new file mode 100644 index 0000000..7defcfd --- /dev/null +++ b/Plugins/DarkerNodes/Source/DarkerNodes/Private/Colorizer/ColorizerCheckbox.cpp @@ -0,0 +1,70 @@ +/* Copyright (C) 2021 Hugo ATTAL - All Rights Reserved +* This plugin is downloadable from the Unreal Engine Marketplace +*/ + +#include "Colorizer.h" + +void FColorizer::ColorCheckbox() +{ + if (!DarkerNodesSettings->UseCustomButton) + { + return; + } + + // Border Opacity 15% / 75% + // Front Opacity 75% + + const FCheckBoxStyle BasicCheckBoxStyle = + FCheckBoxStyle() + .SetCheckBoxType(ESlateCheckBoxType::CheckBox) + + .SetUncheckedImage(ImageBrush("/Elements/Checkbox/CheckBox.png")) + .SetUncheckedHoveredImage(ImageBrush("/Elements/Checkbox/CheckBox_Hovered.png")) + .SetUncheckedPressedImage(ImageBrush("/Elements/Checkbox/CheckBox_Hovered.png")) + + .SetCheckedImage(ImageBrush("/Elements/Checkbox/CheckBox_Checked.png")) + .SetCheckedHoveredImage(ImageBrush("/Elements/Checkbox/CheckBox_Checked_Hovered.png")) + .SetCheckedPressedImage(ImageBrush("/Elements/Checkbox/CheckBox_Checked_Hovered.png")) + + .SetUndeterminedImage(ImageBrush("/Elements/Checkbox/CheckBox_Undetermined.png")) + .SetUndeterminedHoveredImage(ImageBrush("/Elements/Checkbox/CheckBox_Undetermined_Hovered.png")) + .SetUndeterminedPressedImage(ImageBrush("/Elements/Checkbox/CheckBox_Undetermined_Hovered.png")); + + CoreStyle->Set("Checkbox", BasicCheckBoxStyle); + + EditorStyle->Set("Graph.Checkbox", BasicCheckBoxStyle); + const FCheckBoxStyle BasicToggleButtonCheckBoxStyle = + FCheckBoxStyle(BasicCheckBoxStyle) + .SetCheckBoxType(ESlateCheckBoxType::ToggleButton); + + CoreStyle->Set("Menu.CheckBox", BasicCheckBoxStyle); + CoreStyle->Set("Menu.Check", BasicCheckBoxStyle); + CoreStyle->Set("Menu.ToggleButton", BasicToggleButtonCheckBoxStyle); + + + const FCheckBoxStyle BasicRadioButtonStyle = + FCheckBoxStyle() + .SetUncheckedImage(ImageBrush("/Elements/Checkbox/RadioButton.png")) + .SetUncheckedHoveredImage(ImageBrush("/Elements/Checkbox/RadioButton_Hovered.png")) + .SetUncheckedPressedImage(ImageBrush("/Elements/Checkbox/RadioButton_Hovered.png")) + + .SetCheckedImage(ImageBrush("/Elements/Checkbox/RadioButton_Checked.png")) + .SetCheckedHoveredImage(ImageBrush("/Elements/Checkbox/RadioButton_Checked_Hovered.png")) + .SetCheckedPressedImage(ImageBrush("/Elements/Checkbox/RadioButton_Checked_Hovered.png")) + + .SetUndeterminedImage(ImageBrush("/Elements/Checkbox/RadioButton.png")) + .SetUndeterminedHoveredImage(ImageBrush("/Elements/Checkbox/RadioButton_Hovered.png")) + .SetUndeterminedPressedImage(ImageBrush("/Elements/Checkbox/RadioButton_Hovered.png")); + + CoreStyle->Set("RadioButton", BasicRadioButtonStyle); + CoreStyle->Set("Menu.RadioButton", BasicRadioButtonStyle); + CoreStyle->Set("ToolBar.RadioButton", BasicRadioButtonStyle); + + //EditorStyle->Set("RadioButton", BasicRadioButtonStyle); + //EditorStyle->Set("ToolBar.RadioButton", BasicRadioButtonStyle); + //EditorStyle->Set("NotificationBar.RadioButton", BasicRadioButtonStyle); + //EditorStyle->Set("Menu.RadioButton", BasicRadioButtonStyle); + //EditorStyle->Set("EditorModesToolbar.RadioButton", BasicRadioButtonStyle); + //EditorStyle->Set("PinnedCommandList.RadioButton", BasicRadioButtonStyle); + //EditorStyle->Set("ViewportPinnedCommandList.RadioButton", BasicRadioButtonStyle); +} diff --git a/Plugins/DarkerNodes/Source/DarkerNodes/Private/Colorizer/ColorizerFonts.cpp b/Plugins/DarkerNodes/Source/DarkerNodes/Private/Colorizer/ColorizerFonts.cpp new file mode 100644 index 0000000..d516b63 --- /dev/null +++ b/Plugins/DarkerNodes/Source/DarkerNodes/Private/Colorizer/ColorizerFonts.cpp @@ -0,0 +1,89 @@ +/* Copyright (C) 2021 Hugo ATTAL - All Rights Reserved +* This plugin is downloadable from the Unreal Engine Marketplace +*/ + +#include "Colorizer.h" + +void FColorizer::ApplyFonts() const +{ + FTypeface* Typeface = const_cast(&FCoreStyle::GetDefaultFont().Get().DefaultTypeface); + + if (!DarkerNodesSettings->UseCustomRegularFont) + { + switch (DarkerNodesSettings->FontFamily) + { + case EFontFamily::BalsamiqSans: + DarkerNodesSettings->RegularFont.FilePath = FontsDirectory + "/BalsamiqSans-Regular.ttf"; + break; + case EFontFamily::Cannonade: + DarkerNodesSettings->RegularFont.FilePath = FontsDirectory + "/Cannonade-Regular.ttf"; + break; + case EFontFamily::CaskaydiaCove: + DarkerNodesSettings->RegularFont.FilePath = FontsDirectory + "/CaskaydiaCove-Regular.ttf"; + break; + case EFontFamily::EudoxusSans: + DarkerNodesSettings->RegularFont.FilePath = FontsDirectory + "/EudoxusSans-Regular.ttf"; + break; + case EFontFamily::GolosUI: + DarkerNodesSettings->RegularFont.FilePath = FontsDirectory + "/GolosUI-Regular.ttf"; + break; + case EFontFamily::Jua: + DarkerNodesSettings->RegularFont.FilePath = FontsDirectory + "/Jua-Regular.ttf"; + break; + case EFontFamily::Junction: + DarkerNodesSettings->RegularFont.FilePath = FontsDirectory + "/Junction-Regular.ttf"; + break; + case EFontFamily::NewTelegraph: + DarkerNodesSettings->RegularFont.FilePath = FontsDirectory + "/NewTelegraph-Regular.ttf"; + break; + case EFontFamily::XXIIAven: + DarkerNodesSettings->RegularFont.FilePath = FontsDirectory + "/XXIIAven-Regular.ttf"; + break; + default: + DarkerNodesSettings->RegularFont.FilePath = Typeface->Fonts[0].Font.GetFontFilename(); + } + } + Typeface->Fonts[0] = FTypefaceEntry(TEXT("Regular"), DarkerNodesSettings->RegularFont.FilePath, EFontHinting::Default, EFontLoadingPolicy::LazyLoad); + + + if (!DarkerNodesSettings->UseCustomItalicFont) + { + DarkerNodesSettings->ItalicFont.FilePath = Typeface->Fonts[1].Font.GetFontFilename(); + } + Typeface->Fonts[1] = FTypefaceEntry(TEXT("Italic"), DarkerNodesSettings->ItalicFont.FilePath, EFontHinting::Default, EFontLoadingPolicy::LazyLoad); + + + if (!DarkerNodesSettings->UseCustomBoldFont) + { + switch (DarkerNodesSettings->FontFamily) + { + case EFontFamily::BalsamiqSans: + DarkerNodesSettings->RegularFont.FilePath = FontsDirectory + "/BalsamiqSans-Bold.ttf"; + break; + case EFontFamily::Cannonade: + DarkerNodesSettings->BoldFont.FilePath = FontsDirectory + "/Cannonade-Bold.ttf"; + break; + case EFontFamily::CaskaydiaCove: + DarkerNodesSettings->BoldFont.FilePath = FontsDirectory + "/CaskaydiaCove-Bold.ttf"; + break; + case EFontFamily::EudoxusSans: + DarkerNodesSettings->BoldFont.FilePath = FontsDirectory + "/EudoxusSans-Bold.ttf"; + break; + case EFontFamily::GolosUI: + DarkerNodesSettings->BoldFont.FilePath = FontsDirectory + "/GolosUI-Bold.ttf"; + break; + case EFontFamily::Junction: + DarkerNodesSettings->BoldFont.FilePath = FontsDirectory + "/Junction-Bold.ttf"; + break; + case EFontFamily::NewTelegraph: + DarkerNodesSettings->BoldFont.FilePath = FontsDirectory + "/NewTelegraph-Bold.ttf"; + break; + case EFontFamily::XXIIAven: + DarkerNodesSettings->BoldFont.FilePath = FontsDirectory + "/XXIIAven-Bold.ttf"; + break; + default: + DarkerNodesSettings->BoldFont.FilePath = Typeface->Fonts[0].Font.GetFontFilename(); + } + } + Typeface->Fonts[2] = FTypefaceEntry(TEXT("Bold"), DarkerNodesSettings->BoldFont.FilePath, EFontHinting::Default, EFontLoadingPolicy::LazyLoad); +} diff --git a/Plugins/DarkerNodes/Source/DarkerNodes/Private/Colorizer/ColorizerGraph.cpp b/Plugins/DarkerNodes/Source/DarkerNodes/Private/Colorizer/ColorizerGraph.cpp new file mode 100644 index 0000000..6baf5e0 --- /dev/null +++ b/Plugins/DarkerNodes/Source/DarkerNodes/Private/Colorizer/ColorizerGraph.cpp @@ -0,0 +1,116 @@ +/* Copyright (C) 2021 Hugo ATTAL - All Rights Reserved +* This plugin is downloadable from the Unreal Engine Marketplace +*/ + +#include "Colorizer.h" +#include "Materials/MaterialInstanceDynamic.h" +#include "Classes/EditorStyleSettings.h" + +void FColorizer::ColorGraph() +{ + // Graph Nodes + + if (DarkerNodesSettings->ActivateBlueprintTheme) + { + BrushDatabase->GetDynamicMaterial("RegularNode_body")->SetScalarParameterValue("Size", 32); + SlateBrush("RegularNode_body")->ImageSize = FVector2D(32, 32); + SlateBrush("RegularNode_body")->Margin = FMargin(0.5f); + SlateBrush("RegularNode_body")->DrawAs = ESlateBrushDrawType::Box; + + BrushDatabase->GetDynamicMaterial("VarNode_body")->SetScalarParameterValue("Size", 32); + SlateBrush("VarNode_body")->ImageSize = FVector2D(32, 32); + SlateBrush("VarNode_body")->Margin = FMargin(0.5f); + SlateBrush("VarNode_body")->DrawAs = ESlateBrushDrawType::Box; + + BrushDatabase->GetDynamicMaterial("RegularNode_color_spill")->SetScalarParameterValue("Size", 32); + SlateBrush("RegularNode_color_spill")->ImageSize = FVector2D(32, 32); + SlateBrush("RegularNode_color_spill")->Margin = FMargin(0.5f); + SlateBrush("RegularNode_color_spill")->DrawAs = ESlateBrushDrawType::Box; + + EditorStyle->Set("Graph.Node.Body", SlateBrush("RegularNode_body")); + EditorStyle->Set("Graph.VarNode.Body", SlateBrush("VarNode_body")); + + BrushDatabase->GetDynamicMaterial("RegularNode_shadow_selected")->SetScalarParameterValue("Size", 64); + BrushDatabase->GetDynamicMaterial("VarNode_shadow_selected")->SetScalarParameterValue("Size", 64); + + SlateBrush("RegularNode_shadow_selected")->ImageSize = FVector2D(64, 64); + SlateBrush("RegularNode_shadow_selected")->Margin = FMargin(0.5f); + SlateBrush("RegularNode_shadow_selected")->DrawAs = ESlateBrushDrawType::Box; + + SlateBrush("VarNode_shadow_selected")->ImageSize = FVector2D(64, 64); + SlateBrush("VarNode_shadow_selected")->Margin = FMargin(0.5f); + SlateBrush("VarNode_shadow_selected")->DrawAs = ESlateBrushDrawType::Box; + + EditorStyle->Set("Graph.PlayInEditor", SlateBrush("RegularNode_shadow_selected")); + EditorStyle->Set("Graph.Node.ShadowSelected", SlateBrush("RegularNode_shadow_selected")); + EditorStyle->Set("Graph.VarNode.ShadowSelected", SlateBrush("VarNode_shadow_selected")); + +#if ENGINE_MAJOR_VERSION == 4 && ENGINE_MINOR_VERSION <= 24 + ApplyBoxBrush(EditorStyle, "Graph.Node.TitleGloss", "/Graph/RegularNode_color_spill_424.png"); + EditorStyle->Set("Graph.Node.ColorSpill", new FSlateNoResource()); +#else + EditorStyle->Set("Graph.Node.ColorSpill", SlateBrush("RegularNode_color_spill")); + EditorStyle->Set("Graph.Node.TitleGloss", new FSlateNoResource()); +#endif + + EditorStyle->Set("Graph.Node.Shadow", new FSlateNoResource()); + EditorStyle->Set("Graph.Node.TitleHighlight", new FSlateNoResource()); + + switch (DarkerNodesSettings->BlueprintVarNodeLine) + { + case EBlueprintVarNodeLine::Thin: + ApplyImageBrush(EditorStyle, "Graph.VarNode.ColorSpill", "/Graph/VarNode_color_spill_thin.png", FVector2D(132, 28)); + break; + case EBlueprintVarNodeLine::Thick: + ApplyImageBrush(EditorStyle, "Graph.VarNode.ColorSpill", "/Graph/VarNode_color_spill_thick.png", FVector2D(132, 28)); + break; + } + + EditorStyle->Set("Graph.VarNode.Gloss", new FSlateNoResource()); + EditorStyle->Set("Graph.VarNode.Shadow", new FSlateNoResource()); + + //EditorStyle->Set("Graph.VarNode.Body", SlateBrush("Button_Hovered")); + + EditorStyle->Set("Graph.CollapsedNode.Body", SlateBrush("RegularNode_body")); + ApplyBoxBrush(EditorStyle, "Graph.CollapsedNode.BodyColorSpill", "/Graph/CollapsedNode_Body_ColorSpill.png"); + + // Pin Icons + + ApplyImageBrush(EditorStyle, "Graph.Pin.Connected_VarA", "/Elements/Pin/Pin_connected_VarA.png", FVector2D(15, 11)); + ApplyImageBrush(EditorStyle, "Graph.Pin.Disconnected_VarA", "/Elements/Pin/Pin_disconnected_VarA.png", FVector2D(15, 11)); + ApplyImageBrush(EditorStyle, "Graph.Pin.Connected", "/Elements/Pin/Pin_connected.png", FVector2D(11, 11)); + ApplyImageBrush(EditorStyle, "Graph.Pin.Disconnected", "/Elements/Pin/Pin_disconnected.png", FVector2D(11, 11)); + + ApplyImageBrush(EditorStyle, "Graph.ExecPin.Connected", "/Elements/Pin/ExecPin_Connected.png", FVector2D(12, 16)); + ApplyImageBrush(EditorStyle, "Graph.ExecPin.Disconnected", "/Elements/Pin/ExecPin_Disconnected.png", FVector2D(12, 16)); + ApplyImageBrush(EditorStyle, "Graph.ExecPin.ConnectedHovered", "/Elements/Pin/ExecPin_Connected.png", FVector2D(12, 16), FColor(150, 150, 150)); + ApplyImageBrush(EditorStyle, "Graph.ExecPin.DisconnectedHovered", "/Elements/Pin/ExecPin_Disconnected.png", FVector2D(12, 16), FColor(150, 150, 150)); + ApplyImageBrush(EditorStyle, "Graph.ExecutionBubble", "/Elements/Pin/ExecutionBubble.png", FVector2D(16, 16)); + } + + // Grid + + if (DarkerNodesSettings->UseCustomPanels) + { + EditorStyle->Set("Graph.Panel.GridLineColor", BrushDatabase->GetColor("GridLine").Get()); + GetMutableDefault()->RegularColor = BrushDatabase->GetColor("GridLine").Get(); + + EditorStyle->Set("Graph.Panel.GridRuleColor", BrushDatabase->GetColor("GridRule").Get()); + GetMutableDefault()->RuleColor = BrushDatabase->GetColor("GridRule").Get(); + + EditorStyle->Set("Graph.Panel.GridCenterColor", BrushDatabase->GetColor("GridCenter").Get()); + GetMutableDefault()->CenterColor = BrushDatabase->GetColor("GridCenter").Get(); + } + + ApplyBoxBrush(EditorStyle, "Kismet.Comment.Background", "/Graph/Comment_Background.png"); + + // Comments + + ApplyBoxBrush(EditorStyle, "Graph.Node.CommentBubble", "/Graph/CommentBubble.png"); + ApplyImageBrush(EditorStyle, "Graph.Node.CommentArrow", "/Graph/CommentBubbleArrow.png", Icon8); + + // Panel + + ApplyImageBrush(EditorStyle, "BlueprintEditor.Details.ArgUpButton", "/Icons/Graph/icon_FunctionArgUp.png", Icon16); + ApplyImageBrush(EditorStyle, "BlueprintEditor.Details.ArgDownButton", "/Icons/Graph/icon_FunctionArgDown.png", Icon16); +} diff --git a/Plugins/DarkerNodes/Source/DarkerNodes/Private/Colorizer/ColorizerIcons.cpp b/Plugins/DarkerNodes/Source/DarkerNodes/Private/Colorizer/ColorizerIcons.cpp new file mode 100644 index 0000000..d285e71 --- /dev/null +++ b/Plugins/DarkerNodes/Source/DarkerNodes/Private/Colorizer/ColorizerIcons.cpp @@ -0,0 +1,212 @@ +/* Copyright (C) 2021 Hugo ATTAL - All Rights Reserved +* This plugin is downloadable from the Unreal Engine Marketplace +*/ + +#include "Colorizer.h" + +void FColorizer::ColorIcons() +{ + if (DarkerNodesSettings->UseCustomIcons) + { + // Opacity 50% + + // Red #b20000 + // Blue #0060b2 + // Yellow #dfb300 + // Green #3aa111 + + FColor YellowGroupColor = ImageColor; + FColor BlueGroupColor = ImageColor; + FColor GreenGroupColor = ImageColor; + + if (DarkerNodesSettings->UseIconColorization) + { + YellowGroupColor = FColor(255,255,63); + BlueGroupColor = FColor(0,191,255); + GreenGroupColor = FColor(63,255,63); + } + + AddMenuIcon(EditorStyle, "Kismet.Status.Unknown", "/Menu/CompileStatus_Working.png", ImageColor); + AddMenuIcon(EditorStyle, "Kismet.Status.Error", "/Menu/CompileStatus_Fail.png", ImageColor); + AddMenuIcon(EditorStyle, "Kismet.Status.Good", "/Menu/CompileStatus_Good.png", ImageColor); + AddMenuIcon(EditorStyle, "Kismet.Status.Warning", "/Menu/CompileStatus_Warning.png", ImageColor); + + AddMenuIcon(EditorStyle, "AssetEditor.SaveAsset", "/Menu/icon_SaveAsset_40x.png", ImageColor); + AddMenuIcon(EditorStyle, "SystemWideCommands.FindInContentBrowser", "/Menu/icon_toolbar_genericfinder_40px.png", ImageColor); + AddMenuIcon(EditorStyle, "BlueprintEditor.FindInBlueprint", "/Menu/icon_Blueprint_Find_40px.png", ImageColor); + AddMenuIcon(EditorStyle, "MaterialEditor.FindInMaterial", "/Menu/icon_Blueprint_Find_40px.png", ImageColor); + AddMenuIcon(EditorStyle, "TranslationEditor.Search", "/Menu/icon_Blueprint_Find_40px.png", ImageColor); + + AddMenuIcon(EditorStyle, "FullBlueprintEditor.EditGlobalOptions", "/Menu/icon_Blueprint_Options_40px.png", BlueGroupColor); + AddMenuIcon(EditorStyle, "FullBlueprintEditor.EditClassDefaults", "/Menu/icon_BlueprintEditor_Defaults_40x.png", BlueGroupColor); + AddMenuIcon(EditorStyle, "FullBlueprintEditor.SwitchToBlueprintDefaultsMode", "/Menu/icon_BlueprintEditor_Defaults_40x.png", BlueGroupColor); + AddMenuIcon(EditorStyle, "BlueprintEditor.EnableSimulation", "/Menu/icon_Enable_Simulation_40px.png", YellowGroupColor); + AddMenuIcon(EditorStyle, "PlayWorld.PlayInViewport", "/Menu/icon_playInSelectedViewport_40x.png", YellowGroupColor); + AddMenuIcon(EditorStyle, "GraphEditor.ToggleHideUnrelatedNodes", "/Menu/icon_HideUnrelatedNodes_40x.png", ImageColor); + + AddMenuIcon(EditorStyle, "LevelEditor.Build", "/Menu/icon_build_40x.png", YellowGroupColor); + AddMenuIcon(EditorStyle, "LevelEditor.Recompile", "/Menu/icon_compile_40x.png", YellowGroupColor); + AddMenuIcon(EditorStyle, "LevelEditor.OpenContentBrowser", "/Menu/icon_ContentBrowser_40x.png", ImageColor); + AddMenuIcon(EditorStyle, "LevelEditor.EditorModes", "/Menu/icon_Editor_Modes_40x.png", ImageColor); + AddMenuIcon(EditorStyle, "LevelEditor.ToggleVR", "/Menu/VR_Editor_Toolbar_Icon.png", ImageColor); + AddMenuIcon(EditorStyle, "LevelEditor.GameSettings", "/Menu/icon_game_settings_40x.png", ImageColor); + AddMenuIcon(EditorStyle, "LevelEditor.OpenLevelBlueprint", "/Menu/icon_kismet2_40x.png", BlueGroupColor); + AddMenuIcon(EditorStyle, "LevelEditor.OpenMarketplace", "/Menu/icon_Marketplace_40x.png", ImageColor); + AddMenuIcon(EditorStyle, "LevelEditor.EditMatinee", "/Menu/icon_matinee_40x.png", BlueGroupColor); + + AddMenuIcon(EditorStyle, "LevelEditor.SourceControl", "/Menu/icon_source_control_40x.png", ImageColor); + AddMenuIcon(EditorStyle, "LevelEditor.SourceControl.On", "/Menu/icon_source_control_40x_on.png", ImageColor); + AddMenuIcon(EditorStyle, "LevelEditor.SourceControl.Off", "/Menu/icon_source_control_40x_off.png", ImageColor); + AddMenuIcon(EditorStyle, "LevelEditor.SourceControl.Unknown", "/Menu/icon_source_control_40x_unknown.png", ImageColor); + AddMenuIcon(EditorStyle, "LevelEditor.SourceControl.Problem", "/Menu/icon_source_control_40x_problem.png", ImageColor); + + AddMenuIcon(EditorStyle, "MaterialEditor.Apply", "/Menu/icon_MatEd_Apply_40x.png", ImageColor); + AddMenuIcon(EditorStyle, "MaterialEditor.CameraHome", "/Menu/icon_MatEd_Home_40x.png", ImageColor); + AddMenuIcon(EditorStyle, "MaterialEditor.ToggleRealtimeExpressions", "/Menu/icon_MatEd_LiveNodes_40x.png", ImageColor); + AddMenuIcon(EditorStyle, "MaterialEditor.AlwaysRefreshAllPreviews", "/Menu/icon_MatEd_Refresh_40x.png", ImageColor); + AddMenuIcon(EditorStyle, "MaterialEditor.ToggleLivePreview", "/Menu/icon_MatEd_LivePreview_40x.png", ImageColor); + AddMenuIcon(EditorStyle, "MaterialEditor.ToggleMaterialStats", "/Menu/icon_MatEd_Stats_40x.png", ImageColor); + AddMenuIcon(EditorStyle, "MaterialEditor.TogglePlatformStats", "/Menu/icon_MobileStats_40x.png", ImageColor); + AddMenuIcon(EditorStyle, "MaterialEditor.CleanUnusedExpressions", "/Menu/icon_MatEd_CleanUp_40x.png", ImageColor); + AddMenuIcon(EditorStyle, "MaterialEditor.ShowHideConnectors", "/Menu/icon_MatEd_Connectors_40x.png", ImageColor); + + AddMenuIcon(EditorStyle, "PlayWorld.PausePlaySession", "/Menu/icon_pause_40x.png", YellowGroupColor); + AddMenuIcon(EditorStyle, "PlayWorld.StopPlaySession", "/Menu/icon_stop_40x.png", YellowGroupColor); + AddMenuIcon(EditorStyle, "PlayWorld.PossessPlayer", "/Menu/icon_possess_40x.png", YellowGroupColor); + AddMenuIcon(EditorStyle, "PlayWorld.EjectFromPlayer", "/Menu/icon_eject_40x.png", YellowGroupColor); + AddMenuIcon(EditorStyle, "PlayWorld.RepeatLastLaunch", "/Menu/icon_PlayOnDevice_40px.png", YellowGroupColor); + AddMenuIcon(EditorStyle, "PlayWorld.PlayInNewProcess", "/Menu/icon_PlayStandalone_40x.png", YellowGroupColor); + AddMenuIcon(EditorStyle, "PlayWorld.PlayInEditorFloating", "/Menu/icon_playInWindow_40x.png", YellowGroupColor); + AddMenuIcon(EditorStyle, "PlayWorld.PlayInMobilePreview", "/Menu/icon_PlayMobilePreview_40x.png", YellowGroupColor); + AddMenuIcon(EditorStyle, "PlayWorld.PlayInVR", "/Menu/icon_playInVR_40x.png", YellowGroupColor); + AddMenuIcon(EditorStyle, "PlayWorld.LateJoinSession", "/Menu/icon_simulate_40x.png", YellowGroupColor); + AddMenuIcon(EditorStyle, "PlayWorld.ResumePlaySession", "/Menu/icon_simulate_40x.png", YellowGroupColor); + AddMenuIcon(EditorStyle, "PlayWorld.Simulate", "/Menu/icon_simulate_40x.png", YellowGroupColor); + AddMenuIcon(EditorStyle, "PlayWorld.RepeatLastPlay", "/Menu/icon_simulate_40x.png", YellowGroupColor); + + AddMenuIcon(EditorStyle, "PlayWorld.SingleFrameAdvance", "/Menu/icon_advance_40x.png", BlueGroupColor); + AddMenuIcon(EditorStyle, "PlayWorld.ShowCurrentStatement", "/Menu/icon_findnode_40x.png", BlueGroupColor); + AddMenuIcon(EditorStyle, "PlayWorld.StepOut", "/Menu/icon_DebugStepOut_40x.png", BlueGroupColor); + AddMenuIcon(EditorStyle, "PlayWorld.StepInto", "/Menu/icon_DebugStepIn_40x.png", BlueGroupColor); + AddMenuIcon(EditorStyle, "PlayWorld.StepOver", "/Menu/icon_DebugStepOver_40x.png", BlueGroupColor); + + AddMenuIcon(EditorStyle, "BTEditor.SwitchToBehaviorTreeMode", "/Menu/BehaviorTreeMode_40x.png", ImageColor); + AddMenuIcon(EditorStyle, "UMGEditor.SwitchToDesigner", "/Menu/Designer_40x.png", ImageColor); + AddMenuIcon(EditorStyle, "FullBlueprintEditor.SwitchToScriptingMode", "/Menu/icon_BlueprintEditor_EventGraph_40x.png", ImageColor); + AddMenuIcon(CoreStyle, "WidgetReflector.Icon", "/Menu/icon_tab_WidgetReflector_40x.png", ImageColor); + + AddMenuIcon(EditorStyle, "EditorViewport.ToggleRealTime", "/Menu/icon_MatEd_Realtime_40x.png", ImageColor); + + AddMenuIcon(EditorStyle, "StaticMeshEditor.SetShowWireframe", "/Menu/icon_StaticMeshEd_Wireframe_40x.png", GreenGroupColor); + AddMenuIcon(EditorStyle, "StaticMeshEditor.SetShowVertexColor", "/Menu/icon_StaticMeshEd_VertColor_40x.png", GreenGroupColor); + AddMenuIcon(EditorStyle, "StaticMeshEditor.SetRealtimePreview", "/Menu/icon_MatEd_Realtime_40x.png", ImageColor); + AddMenuIcon(EditorStyle, "StaticMeshEditor.ReimportMesh", "/Menu/icon_Persona_ReimportMesh_40x.png", ImageColor); + AddMenuIcon(EditorStyle, "StaticMeshEditor.SetShowBounds", "/Menu/icon_StaticMeshEd_Bounds_40x.png", GreenGroupColor); + AddMenuIcon(EditorStyle, "StaticMeshEditor.SetShowCollision", "/Menu/icon_StaticMeshEd_Collision_40x.png", GreenGroupColor); + AddMenuIcon(EditorStyle, "StaticMeshEditor.SetShowGrid", "/Menu/icon_MatEd_Grid_40x.png", GreenGroupColor); + AddMenuIcon(EditorStyle, "StaticMeshEditor.SetDrawUVs", "/Menu/icon_StaticMeshEd_UVOverlay_40x.png", GreenGroupColor); + AddMenuIcon(EditorStyle, "StaticMeshEditor.ResetCamera", "/Menu/icon_Camera_Reset_40px.png", ImageColor); + AddMenuIcon(EditorStyle, "StaticMeshEditor.SetShowPivot", "/Menu/icon_StaticMeshEd_ShowPivot_40x.png", GreenGroupColor); + AddMenuIcon(EditorStyle, "StaticMeshEditor.SetShowSockets", "/Menu/icon_StaticMeshEd_ShowSockets_40x.png", GreenGroupColor); + AddMenuIcon(EditorStyle, "StaticMeshEditor.SetShowNormals", "/Menu/icon_StaticMeshEd_Normals_40x.png", GreenGroupColor); + AddMenuIcon(EditorStyle, "StaticMeshEditor.SetShowTangents", "/Menu/icon_StaticMeshEd_Tangents_40x.png", GreenGroupColor); + AddMenuIcon(EditorStyle, "StaticMeshEditor.SetShowBinormals", "/Menu/icon_StaticMeshEd_Binormals_40x.png", GreenGroupColor); + AddMenuIcon(EditorStyle, "StaticMeshEditor.SetDrawAdditionalData", "/Menu/icon_StaticMeshEd_AdditionalData_40x.png", ImageColor); + AddMenuIcon(EditorStyle, "StaticMeshEditor.SetShowVertices", "/Menu/icon_StaticMeshEd_Vertices_40x.png", GreenGroupColor); + AddMenuIcon(EditorStyle, "StaticMeshEditor.ToggleShowPivots", "/Menu/icon_StaticMeshEd_ShowPivot_40x.png", GreenGroupColor); + AddMenuIcon(EditorStyle, "StaticMeshEditor.ToggleShowSockets", "/Menu/icon_StaticMeshEd_ShowSockets_40x.png", GreenGroupColor); + AddMenuIcon(EditorStyle, "StaticMeshEditor.ToggleShowNormals", "/Menu/icon_StaticMeshEd_Normals_40x.png", GreenGroupColor); + AddMenuIcon(EditorStyle, "StaticMeshEditor.ToggleShowTangents", "/Menu/icon_StaticMeshEd_Tangents_40x.png", GreenGroupColor); + AddMenuIcon(EditorStyle, "StaticMeshEditor.ToggleShowBinormals", "/Menu/icon_StaticMeshEd_Binormals_40x.png", GreenGroupColor); + AddMenuIcon(EditorStyle, "StaticMeshEditor.ToggleShowBounds", "/Menu/icon_StaticMeshEd_Bounds_40x.png", GreenGroupColor); + AddMenuIcon(EditorStyle, "StaticMeshEditor.ToggleShowGrids", "/Menu/icon_MatEd_Grid_40x.png", GreenGroupColor); + AddMenuIcon(EditorStyle, "StaticMeshEditor.ToggleShowVertices", "/Menu/icon_StaticMeshEd_Vertices_40x.png", GreenGroupColor); + AddMenuIcon(EditorStyle, "StaticMeshEditor.ToggleShowWireframes", "/Menu/icon_StaticMeshEd_Wireframe_40x.png", GreenGroupColor); + AddMenuIcon(EditorStyle, "StaticMeshEditor.ToggleShowVertexColors", "/Menu/icon_StaticMeshEd_VertColor_40x.png", GreenGroupColor); + AddMenuIcon(EditorStyle, "Persona.BakeMaterials", "/Menu/icon_tab_Layers_40x.png", ImageColor); + + AddMenuIcon(EditorStyle, "AnimationEditor.ApplyCompression", "/Menu/icon_Persona_Compression_40x.png", ImageColor); + AddMenuIcon(EditorStyle, "AnimationEditor.ExportToFBX", "/Menu/icon_Persona_ExportFBX_40x.png", ImageColor); + AddMenuIcon(EditorStyle, "AnimationEditor.ReimportAnimation", "/Menu/icon_Persona_ReimportMesh_40x.png", ImageColor); + AddMenuIcon(EditorStyle, "AnimationEditor.CreateAsset", "/Menu/icon_Persona_CreateAsset_40x.png", ImageColor); + AddMenuIcon(EditorStyle, "AnimationEditor.SetKey", "/Menu/icon_Persona_SetKey_40x.png", ImageColor); + AddMenuIcon(EditorStyle, "AnimationEditor.ApplyAnimation", "/Menu/icon_MatEd_Apply_40x.png", ImageColor); + + AddMenuIcon(EditorStyle, "Persona.TogglePreviewAsset", "/Menu/icon_Persona_PreviewAsset_40x.png", ImageColor); + AddMenuIcon(EditorStyle, "Persona.CreateAsset", "/Menu/icon_Persona_CreateAsset_40x.png", ImageColor); + AddMenuIcon(EditorStyle, "Persona.ExportToFBX", "/Menu/icon_Persona_ExportFBX_40x.png", ImageColor); + AddMenuIcon(EditorStyle, "Persona.ConvertToStaticMesh", "/Menu/icon_ShowStaticMeshes_40x.png", ImageColor); + } + + ApplyImageBrush(EditorStyle, "EditorViewport.LocationGridSnap", "/Icons/Viewport/LocationGridSnap.png", Icon14, TextColor); + ApplyImageBrush(EditorStyle, "EditorViewport.RotationGridSnap", "/Icons/Viewport/RotationGridSnap.png", Icon14, TextColor); + ApplyImageBrush(EditorStyle, "EditorViewport.Layer2DSnap", "/Icons/Viewport/Layer2DSnap.png", Icon14, TextColor); + ApplyImageBrush(EditorStyle, "EditorViewport.ScaleGridSnap", "/Icons/Viewport/ScaleGridSnap.png", Icon14, TextColor); + ApplyImageBrush(EditorStyle, "EditorViewport.ToggleSurfaceSnapping", "/Icons/Viewport/icon_surface_snapping_14px.png", Icon14, TextColor); + ApplyImageBrush(EditorStyle, "EditorViewport.RelativeCoordinateSystem_Local", "/Icons/Viewport/icon_axis_local_16px.png", Icon16, TextColor); + ApplyImageBrush(EditorStyle, "EditorViewport.RelativeCoordinateSystem_Local.Small", "/Icons/Viewport/icon_axis_local_16px.png", Icon16, TextColor); + ApplyImageBrush(EditorStyle, "EditorViewport.RelativeCoordinateSystem_World", "/Icons/Viewport/icon_axis_world_16px.png", Icon16, TextColor); + ApplyImageBrush(EditorStyle, "EditorViewport.RelativeCoordinateSystem_World.Small", "/Icons/Viewport/icon_axis_world_16px.png", Icon16, TextColor); + ApplyImageBrush(EditorStyle, "EditorViewport.CamSpeedSetting", "/Icons/Viewport/icon_CameraSpeed_24x16px.png", FVector2D(24, 16), TextColor); + + ApplyImageBrush(EditorStyle, "DetailsView.EditRawProperties", "/Icons/DetailsView/icon_PropertyMatrix_16px.png", Icon16, TextColor); + + ApplyImageBrush(EditorStyle, "CurveEd.Visible", "/Icons/DetailsView/icon_visible_16px.png", Icon16, TextColor); + ApplyImageBrush(EditorStyle, "CurveEd.VisibleHighlight", "/Icons/DetailsView/icon_visible_16px.png", Icon16, TextColor); + ApplyImageBrush(EditorStyle, "CurveEd.Invisible", "/Icons/DetailsView/icon_invisible_16px.png", Icon16, TextColor); + ApplyImageBrush(EditorStyle, "CurveEd.InvisibleHighlight", "/Icons/DetailsView/icon_invisible_16px.png", Icon16, TextColor); + ApplyImageBrush(EditorStyle, "Level.VisibleIcon16x", "/Icons/DetailsView/icon_visible_16px.png", Icon16, TextColor); + ApplyImageBrush(EditorStyle, "Level.VisibleHighlightIcon16x", "/Icons/DetailsView/icon_visible_16px.png", Icon16, TextColor); + ApplyImageBrush(EditorStyle, "Level.NotVisibleIcon16x", "/Icons/DetailsView/icon_invisible_16px.png", Icon16, TextColor); + ApplyImageBrush(EditorStyle, "Level.NotVisibleHighlightIcon16x", "/Icons/DetailsView/icon_invisible_16px.png", Icon16, TextColor); + ApplyImageBrush(EditorStyle, "GenericViewButton", "/Icons/DetailsView/icon_visible_16px.png", Icon16, TextColor); + + const FColor TextColor50 = TextColor.WithAlpha(255 * 0.5); + + ApplyCenterIcon(EditorStyle, "PropertyWindow.Button_CreateNewBlueprint", "/Icons/DetailsView/PlusSymbol_12x.png", Icon12, TextColor50); + ApplyCenterIcon(EditorStyle, "PropertyWindow.Button_Browse", "/Icons/DetailsView/lens_12x.png", Icon12, TextColor50); + ApplyCenterIcon(EditorStyle, "PropertyWindow.Button_Use", "/Icons/DetailsView/assign_12x.png", Icon12, TextColor50); + + ApplyCenterIcon(EditorStyle, "GenericLock", "/Icons/DetailsView/padlock_locked_16x.png", Icon16, TextColor50); + ApplyCenterIcon(EditorStyle, "GenericLock.Small", "/Icons/DetailsView/padlock_locked_16x.png", Icon16, TextColor50); + ApplyCenterIcon(EditorStyle, "GenericUnlock", "/Icons/DetailsView/padlock_unlocked_16x.png", Icon16, TextColor50); + ApplyCenterIcon(EditorStyle, "GenericUnlock.Small", "/Icons/DetailsView/padlock_unlocked_16x.png", Icon16, TextColor50); + ApplyCenterIcon(EditorStyle, "PropertyWindow.Locked", "/Icons/DetailsView/padlock_locked_16x.png", Icon16, TextColor50); + ApplyCenterIcon(EditorStyle, "PropertyWindow.Unlocked", "/Icons/DetailsView/padlock_unlocked_16x.png", Icon16, TextColor50); + ApplyCenterIcon(EditorStyle, "FindResults.LockButton_Locked", "/Icons/DetailsView/padlock_locked_16x.png", Icon16, TextColor50); + ApplyCenterIcon(EditorStyle, "FindResults.LockButton_Unlocked", "/Icons/DetailsView/padlock_unlocked_16x.png", Icon16, TextColor50); + ApplyCenterIcon(EditorStyle, "ContentBrowser.LockButton_Locked", "/Icons/DetailsView/padlock_locked_16x.png", Icon16, TextColor50); + ApplyCenterIcon(EditorStyle, "ContentBrowser.LockButton_Unlocked", "/Icons/DetailsView/padlock_unlocked_16x.png", Icon16, TextColor50); + + ApplyImageBrush(EditorStyle, "DetailsView.PulldownArrow.Down", "/Icons/PropertyView/AdvancedButton_Down.png", + FVector2D(10, 8), TextColor50); + ApplyImageBrush(EditorStyle, "DetailsView.PulldownArrow.Down.Hovered", "/Icons/PropertyView/AdvancedButton_Down.png", + FVector2D(10, 8), TextColor); + ApplyImageBrush(EditorStyle, "DetailsView.PulldownArrow.Up", "/Icons/PropertyView/AdvancedButton_Up.png", + FVector2D(10, 8), TextColor50); + ApplyImageBrush(EditorStyle, "DetailsView.PulldownArrow.Up.Hovered", "/Icons/PropertyView/AdvancedButton_Up.png", + FVector2D(10, 8), TextColor); + + ApplyImageBrush(CoreStyle, "TreeArrow_Collapsed", "/Panel/TreeArrow_Collapsed.png", Icon10, TextColor50); + ApplyImageBrush(CoreStyle, "TreeArrow_Collapsed_Hovered", "/Panel/TreeArrow_Collapsed.png", Icon10, TextColor); + ApplyImageBrush(CoreStyle, "TreeArrow_Expanded", "/Panel/TreeArrow_Expanded.png", Icon10, TextColor50); + ApplyImageBrush(CoreStyle, "TreeArrow_Expanded_Hovered", "/Panel/TreeArrow_Expanded.png", Icon10, TextColor); + + ApplyImageBrush(CoreStyle, "NotificationList.DefaultMessage", "/Icons/EventMessage_Default.png", Icon40, TextColor); + + ApplyImageBrush(EditorStyle, "TreeArrow_Collapsed", "/Panel/TreeArrow_Collapsed.png", Icon10, TextColor.WithAlpha(255 * 0.25)); + ApplyImageBrush(EditorStyle, "TreeArrow_Collapsed_Hovered", "/Panel/TreeArrow_Collapsed.png", Icon10, TextColor.WithAlpha(255 * 0.75)); + ApplyImageBrush(EditorStyle, "TreeArrow_Expanded", "/Panel/TreeArrow_Expanded.png", Icon10, TextColor.WithAlpha(255 * 0.25)); + ApplyImageBrush(EditorStyle, "TreeArrow_Expanded_Hovered", "/Panel/TreeArrow_Expanded.png", Icon10, TextColor.WithAlpha(255 * 0.75)); + + ApplyImageBrush(EditorStyle, "EditorViewport.TranslateMode", "/Icons/Viewport/icon_translateb_16x.png", Icon16, TextColor); + ApplyImageBrush(EditorStyle, "EditorViewport.RotateMode", "/Icons/Viewport/icon_rotateb_16x.png", Icon16, TextColor); + ApplyImageBrush(EditorStyle, "EditorViewport.ScaleMode", "/Icons/Viewport/icon_scaleb_16x.png", Icon16, TextColor); + + ApplyImageBrush(EditorStyle, "TimelineEditor.AddFloatTrack", "/Icons/Timeline/icon_TrackAddFloat_36x24px.png", FVector2D(36, 24), TextColor); + ApplyImageBrush(EditorStyle, "TimelineEditor.AddVectorTrack", "/Icons/Timeline/icon_TrackAddVector_36x24px.png", FVector2D(36, 24), TextColor); + ApplyImageBrush(EditorStyle, "TimelineEditor.AddEventTrack", "/Icons/Timeline/icon_TrackAddEvent_36x24px.png", FVector2D(36, 24), TextColor); + ApplyImageBrush(EditorStyle, "TimelineEditor.AddColorTrack", "/Icons/Timeline/icon_TrackAddColor_36x24px.png", FVector2D(36, 24), TextColor); + ApplyImageBrush(EditorStyle, "TimelineEditor.AddCurveAssetTrack", "/Icons/Timeline/icon_TrackAddCurve_36x24px.png", FVector2D(36, 24), TextColor); + ApplyImageBrush(EditorStyle, "TimelineEditor.DeleteTrack", "/Icons/Timeline/icon_TrackDelete_36x24px.png", FVector2D(36, 24), TextColor); +} diff --git a/Plugins/DarkerNodes/Source/DarkerNodes/Private/Colorizer/ColorizerIconsCustom.cpp b/Plugins/DarkerNodes/Source/DarkerNodes/Private/Colorizer/ColorizerIconsCustom.cpp new file mode 100644 index 0000000..0760b6f --- /dev/null +++ b/Plugins/DarkerNodes/Source/DarkerNodes/Private/Colorizer/ColorizerIconsCustom.cpp @@ -0,0 +1,19 @@ +/* Copyright (C) 2021 Hugo ATTAL - All Rights Reserved +* This plugin is downloadable from the Unreal Engine Marketplace +*/ + +#include "Colorizer.h" +#include "Styling/SlateStyleRegistry.h" + +void FColorizer::ColorIconsCustom() +{ + if (DarkerNodesSettings->UseCustomIcons) + { + const ISlateStyle* MegascansConstStyle = FSlateStyleRegistry::FindSlateStyle("MegascansStyle"); + if (MegascansConstStyle != nullptr) + { + FSlateStyleSet* MegascansStyle = static_cast(const_cast(MegascansConstStyle)); + AddMenuIcon(MegascansStyle, "Megascans.Logo", "/Menu/megascans.png", ImageColor); + } + } +} \ No newline at end of file diff --git a/Plugins/DarkerNodes/Source/DarkerNodes/Private/Colorizer/ColorizerPanels.cpp b/Plugins/DarkerNodes/Source/DarkerNodes/Private/Colorizer/ColorizerPanels.cpp new file mode 100644 index 0000000..2bfbf15 --- /dev/null +++ b/Plugins/DarkerNodes/Source/DarkerNodes/Private/Colorizer/ColorizerPanels.cpp @@ -0,0 +1,211 @@ +/* Copyright (C) 2021 Hugo ATTAL - All Rights Reserved +* This plugin is downloadable from the Unreal Engine Marketplace +*/ + +#include "Colorizer.h" +#include "Classes/EditorStyleSettings.h" +#include "EditorStyle/Private/SlateEditorStyle.cpp" + +void FColorizer::ColorPanel() +{ + if (!DarkerNodesSettings->UseCustomPanels) + { + return; + } + + const FButtonStyle CloseButton = + FButtonStyle() + .SetNormal(ImageBrush("/Elements/Panel/CloseApp_Normal.png", Icon16)) + .SetPressed(ImageBrush("/Elements/Panel/CloseApp_Pressed.png", Icon16)) + .SetHovered(ImageBrush("/Elements/Panel/CloseApp_Hovered.png", Icon16)); + + //ApplyColorBorderBrush(CoreStyle, "Border", Green); + CoreStyle->Set( + "Docking.Tab", + FDockTabStyle() + .SetCloseButtonStyle(CloseButton) + .SetNormalBrush(*SlateBrush("GreyDark")) + .SetHoveredBrush(*SlateBrush("HoverDark")) + .SetForegroundBrush(*SlateBrush("GreyBase")) + .SetActiveBrush(*SlateBrush("GreyBase")) + .SetColorOverlayTabBrush(*SlateBrush("HoverDark")) + .SetColorOverlayIconBrush(*SlateBrush("HoverDark")) + .SetContentAreaBrush(*SlateBrush("GreyDark")) + .SetTabWellBrush(FSlateNoResource()) + .SetTabPadding(FMargin(5, 2, 5, 2)) + .SetOverlapWidth(-1.0f) + .SetFlashColor(FSlateColor(FLinearColor::FromSRGBColor(HoverDark))) + ); + + CoreStyle->Set( + "Docking.MajorTab", + FDockTabStyle() + .SetCloseButtonStyle(CloseButton) + .SetNormalBrush(*SlateBrush("GreyBase")) + .SetActiveBrush(*SlateBrush("HoverBase")) + .SetColorOverlayTabBrush(*SlateBrush("GreyDark")) + .SetColorOverlayIconBrush(*SlateBrush("GreyDark")) + .SetForegroundBrush(*SlateBrush("GreyDark")) + .SetHoveredBrush(*SlateBrush("HoverBase")) + .SetContentAreaBrush(*SlateBrush("GreyDark")) + .SetTabWellBrush(FSlateNoResource()) + .SetTabPadding(FMargin(8, 4, 8, 4)) + .SetOverlapWidth(0.0f) + .SetFlashColor(FSlateColor(FLinearColor::FromSRGBColor(HoverBase))) + ); + + //EditorStyle->Set("ToolPalette.DockingWell", new FSlateColorBrush(FLinearColor(Blue))); + + CoreStyle->Set("ToolBar.Separator", SlateBrush("GreyDark")); + + EditorStyle->Set("Graph.Panel.SolidBackground", SlateBrush("GreyDark")); + + //ApplyImageBrush(EditorStyle, "Graph.Panel.SolidBackground", "/Graph/GraphPanel_SolidBackground.png", Icon16); + + // new FSlateColorBrush(FLinearColor::FromSRGBColor(DebugRed)) + + EditorStyle->Set("Window.Background", SlateBrush("GreyDark")); + CoreStyle->Set("ToolBar.Background", SlateBrush("GreyDark")); + EditorStyle->Set("ToolBar.Background", SlateBrush("GreyDark")); + CoreStyle->Set("Menu.Background", SlateBrush("GreyDark")); + EditorStyle->Set("Menu.Background", SlateBrush("GreyDark")); + + ApplyColorBoxBrush(EditorStyle, "Graph.InstructionBackground", FColor(40, 40, 40, 128)); + + + EditorStyle->Set("ContentBrowser.TileViewTooltip.ContentBorder", SlateBrush("GreyBase")); + EditorStyle->Set("ProjectBrowser.TileViewTooltip.ContentBorder", SlateBrush("GreyBase")); + + CoreStyle->Set("ToolPanel.GroupBorder", SlateBrush("GreyBase")); + EditorStyle->Set("ToolPanel.GroupBorder", SlateBrush("GreyBase")); + + EditorStyle->Set("PropertyTable.RowHeader.Background", SlateBrush("GreyDark")); + EditorStyle->Set("PropertyTable.RowHeader.BackgroundActive", SlateBrush("HoverDark")); + + EditorStyle->Set( + "PropertyTable.TableRow", + FTableRowStyle() + .SetEvenRowBackgroundBrush(FSlateColorBrush(FLinearColor::FromSRGBColor(MixColor(GreyBase, FColor::Black, 0.2)))) + .SetEvenRowBackgroundHoveredBrush(ColorImageBrush(HoverBase, Icon8)) + .SetOddRowBackgroundBrush(FSlateColorBrush(FLinearColor::FromSRGBColor(GreyBase))) + .SetOddRowBackgroundHoveredBrush(ColorImageBrush(HoverBase, Icon8)) + .SetSelectorFocusedBrush(ColorBorderBrush(Primary)) + .SetActiveBrush(ColorImageBrush(HoverBase, Icon8)) + .SetActiveHoveredBrush(ColorImageBrush(HoverBase, Icon8)) + .SetInactiveBrush(ColorImageBrush(HoverBase, Icon8)) + .SetInactiveHoveredBrush(ColorImageBrush(HoverBase, Icon8)) + .SetTextColor(*BrushDatabase->GetSlateColor("TextColor")) + .SetSelectedTextColor(*BrushDatabase->GetSlateColor("TextColor")) + ); + + EditorStyle->Set("SCSEditor.TreePanel", SlateBrush("GreyBase")); + EditorStyle->Set("ContentBrowser.TopBar.GroupBorder", SlateBrush("GreyBase")); + EditorStyle->Set("ToolPanel.DarkGroupBorder", SlateBrush("GreyBase")); + EditorStyle->Set("ToolPanel.LightGroupBorder", SlateBrush("GreyBase")); + + EditorStyle->Set("DetailsView.CollapsedCategory", SlateBrush("GreyBase")); + EditorStyle->Set("DetailsView.CollapsedCategory_Hovered", SlateBrush("HoverDark")); + EditorStyle->Set("DetailsView.CategoryTop", SlateBrush("GreyBase")); + EditorStyle->Set("DetailsView.CategoryTop_Hovered", SlateBrush("HoverDark")); + EditorStyle->Set("DetailsView.CategoryMiddle", SlateBrush("GreyBase")); + EditorStyle->Set("DetailsView.CategoryMiddle_Hovered", SlateBrush("HoverBase")); + EditorStyle->Set("DetailsView.CategoryBottom", SlateBrush("GreyBase")); + EditorStyle->Set("DetailsView.AdvancedDropdownBorder", SlateBrush("GreyBase")); + EditorStyle->Set("DetailsView.AdvancedDropdownBorder.Open", SlateBrush("GreyBase")); + + UEditorStyleSettings* StyleSettings = GetMutableDefault(); + StyleSettings->SelectionColor = FLinearColor::FromSRGBColor(HoverBaseBright); + StyleSettings->PressedSelectionColor = FLinearColor::FromSRGBColor(HoverBaseBright); + StyleSettings->InactiveSelectionColor = FLinearColor::FromSRGBColor(HoverBase); + StyleSettings->SaveConfig(); + + FCoreStyle::SetSelectionColor(FLinearColor::FromSRGBColor(HoverBaseBright)); + //FCoreStyle::SetSelectorColor(FLinearColor::FromSRGBColor(Green)); + FCoreStyle::SetPressedSelectionColor(FLinearColor::FromSRGBColor(HoverBaseBright)); + FCoreStyle::SetInactiveSelectionColor(FLinearColor::FromSRGBColor(HoverBase)); + + + CoreStyle->Set("InvertedForeground", *BrushDatabase->GetSlateColor("TextColor")); + CoreStyle->Set("DefaultForeground", *BrushDatabase->GetSlateColor("TextColor")); + EditorStyle->Set("InvertedForeground", *BrushDatabase->GetSlateColor("TextColor")); + EditorStyle->Set("DefaultForeground", *BrushDatabase->GetSlateColor("TextColor")); + + CoreStyle->Set( + "Docking.UnhideTabwellButton", + FButtonStyle(CoreStyle->GetWidgetStyle("Button")) + .SetNormal(ColorImageBrush(FColor::Transparent, FVector2D(10, 10))) + .SetPressed(ImageBrush("/Docking/ShowTabwellButton_Pressed.png", FVector2D(10, 10))) + .SetHovered(ImageBrush("/Docking/ShowTabwellButton_Hovered.png", FVector2D(10, 10))) + .SetNormalPadding(0) + .SetPressedPadding(0) + ); + + const FTableColumnHeaderStyle TableColumnHeaderStyle = + FTableColumnHeaderStyle() + .SetSortPrimaryAscendingImage(ImageBrush("/Panel/SortUpArrow.png", FVector2D(8, 4))) + .SetSortPrimaryDescendingImage(ImageBrush("/Panel/SortDownArrow.png", FVector2D(8, 4))) + .SetSortSecondaryAscendingImage(ImageBrush("/Panel/SortUpArrows.png", FVector2D(16, 4))) + .SetSortSecondaryDescendingImage(ImageBrush("/Panel/SortDownArrows.png", FVector2D(16, 4))) + .SetNormalBrush(*SlateBrush("GreyDark")) + .SetHoveredBrush(*SlateBrush("HoverDark")) + .SetMenuDropdownImage(ImageBrush("/Panel/ColumnHeader_Arrow.png", Icon8)) + .SetMenuDropdownNormalBorderBrush(*SlateBrush("GreyBase")) + .SetMenuDropdownHoveredBorderBrush(*SlateBrush("HoverBase")); + CoreStyle->Set("TableView.Header.Column", TableColumnHeaderStyle); + + const FSplitterStyle TableHeaderSplitterStyle = + FSplitterStyle() + .SetHandleNormalBrush(FSlateNoResource()) + .SetHandleHighlightBrush(ImageBrush("/Panel/HeaderSplitterGrip.png", Icon8)); + + CoreStyle->Set( + "TableView.Header", + FHeaderRowStyle() + .SetColumnStyle(TableColumnHeaderStyle) + .SetLastColumnStyle(TableColumnHeaderStyle) + .SetColumnSplitterStyle(TableHeaderSplitterStyle) + .SetBackgroundBrush(*SlateBrush("GreyDark")) + .SetForegroundColor(*BrushDatabase->GetSlateColor("TextColor")) + ); + + EditorStyle->Set( + "PropertyTable.HeaderRow", + FHeaderRowStyle() + .SetColumnStyle(TableColumnHeaderStyle) + .SetLastColumnStyle(TableColumnHeaderStyle) + .SetColumnSplitterStyle(TableHeaderSplitterStyle) + .SetBackgroundBrush(*SlateBrush("GreyDark")) + .SetForegroundColor(*BrushDatabase->GetSlateColor("TextColor")) + ); + + CoreStyle->Set("PopupText.Background", SlateBrush("GreyDark")); + CoreStyle->Set("NotificationList.ItemBackground", SlateBrush("PanelDark")); + + EditorStyle->Set( + "TableView.DarkRow", + FTableRowStyle(EditorStyle->GetWidgetStyle("TableView.Row")) + .SetEvenRowBackgroundBrush(*SlateBrush("GreyBase")) + .SetEvenRowBackgroundHoveredBrush(*SlateBrush("GreyBase")) + .SetOddRowBackgroundBrush(*SlateBrush("GreyBase")) + .SetOddRowBackgroundHoveredBrush(*SlateBrush("GreyBase")) + .SetSelectorFocusedBrush(*SlateBrush("HoverBase")) + .SetActiveBrush(*SlateBrush("HoverBase")) + .SetActiveHoveredBrush(*SlateBrush("HoverBase")) + .SetInactiveBrush(*SlateBrush("HoverBase")) + .SetInactiveHoveredBrush(*SlateBrush("HoverBase")) + ); + + EditorStyle->Set( + "PlacementBrowser.Tab", + FCheckBoxStyle() + .SetCheckBoxType(ESlateCheckBoxType::ToggleButton) + .SetUncheckedImage(*SlateBrush("GreyDark")) + .SetUncheckedPressedImage(*SlateBrush("HoverDark")) + .SetUncheckedHoveredImage(*SlateBrush("HoverDark")) + .SetCheckedImage(*SlateBrush("HoverDark")) + .SetCheckedHoveredImage(*SlateBrush("HoverDark")) + .SetCheckedPressedImage(*SlateBrush("HoverDark")) + .SetPadding(0)); + + EditorStyle->Set("Sequencer.ToolBar.Background", SlateBrush("GreyBase")); +} diff --git a/Plugins/DarkerNodes/Source/DarkerNodes/Private/Colorizer/ColorizerParameters.cpp b/Plugins/DarkerNodes/Source/DarkerNodes/Private/Colorizer/ColorizerParameters.cpp new file mode 100644 index 0000000..53d32d1 --- /dev/null +++ b/Plugins/DarkerNodes/Source/DarkerNodes/Private/Colorizer/ColorizerParameters.cpp @@ -0,0 +1,137 @@ +/* Copyright (C) 2021 Hugo ATTAL - All Rights Reserved +* This plugin is downloadable from the Unreal Engine Marketplace +*/ + +#include "Colorizer.h" +#include "Materials/MaterialInstanceDynamic.h" +#include "Classes/EditorStyleSettings.h" + +void FColorizer::ApplyParameters() const +{ + ApplyFonts(); + + BrushDatabase->GetDynamicMaterial("GreyBase")->SetVectorParameterValue("Color", FLinearColor::FromSRGBColor(GreyBase)); + BrushDatabase->GetDynamicMaterial("GreyLight")->SetVectorParameterValue("Color", FLinearColor::FromSRGBColor(GreyLight)); + BrushDatabase->GetDynamicMaterial("GreyDark")->SetVectorParameterValue("Color", FLinearColor::FromSRGBColor(GreyDark)); + BrushDatabase->GetDynamicMaterial("Debug")->SetVectorParameterValue("Color", FLinearColor::FromSRGBColor(DebugRed)); + + BrushDatabase->GetDynamicMaterial("HoverDark")->SetVectorParameterValue("Color", FLinearColor::FromSRGBColor(HoverDark)); + BrushDatabase->GetDynamicMaterial("HoverBase")->SetVectorParameterValue("Color", FLinearColor::FromSRGBColor(HoverBase)); + BrushDatabase->GetDynamicMaterial("HoverBaseBright")->SetVectorParameterValue("Color", FLinearColor::FromSRGBColor(HoverBaseBright)); + + BrushDatabase->GetDynamicMaterial("Primary")->SetVectorParameterValue("Color", FLinearColor::FromSRGBColor(Primary)); + BrushDatabase->SetSlateColor("TextColor", FLinearColor::FromSRGBColor(TextColor)); + BrushDatabase->GetDynamicMaterial("ScrollbarColor")->SetVectorParameterValue("Color", FLinearColor::FromSRGBColor(ScrollbarColor)); + BrushDatabase->GetDynamicMaterial("MainWindowColor")->SetVectorParameterValue("Color", FLinearColor::FromSRGBColor(MainWindowColor)); + BrushDatabase->GetDynamicMaterial("ChildWindowColor")->SetVectorParameterValue("Color", FLinearColor::FromSRGBColor(ChildWindowColor)); + + BrushDatabase->SetSlateColor("GridLine", FLinearColor::FromSRGBColor(GridLineColor)); + BrushDatabase->SetSlateColor("GridRule", FLinearColor::FromSRGBColor(GridRuleColor)); + BrushDatabase->SetSlateColor("GridCenter", FLinearColor::FromSRGBColor(GridCenterColor)); + + if (DarkerNodesSettings->UseCustomPanels) + { + GetMutableDefault()->RegularColor = BrushDatabase->GetColor("GridLine").Get(); + GetMutableDefault()->RuleColor = BrushDatabase->GetColor("GridRule").Get(); + GetMutableDefault()->CenterColor = BrushDatabase->GetColor("GridCenter").Get(); + GetMutableDefault()->SaveConfig(); + } + + BrushDatabase->GetDynamicMaterial("Button")->SetVectorParameterValue("Background", FLinearColor::FromSRGBColor(GreyDark)); + BrushDatabase->GetDynamicMaterial("Button")->SetVectorParameterValue("Border", FLinearColor::FromSRGBColor(ButtonBorderColor)); + BrushDatabase->GetDynamicMaterial("Button")->SetScalarParameterValue("Radius", DarkerNodesSettings->ButtonRadius); + BrushDatabase->GetDynamicMaterial("Button_Hovered")->SetVectorParameterValue("Background", FLinearColor::FromSRGBColor(GreyDark)); + BrushDatabase->GetDynamicMaterial("Button_Hovered")->SetVectorParameterValue("Border", FLinearColor::FromSRGBColor(Primary)); + BrushDatabase->GetDynamicMaterial("Button_Hovered")->SetScalarParameterValue("Radius", DarkerNodesSettings->ButtonRadius); + BrushDatabase->GetDynamicMaterial("Button_Pressed")->SetVectorParameterValue("Background", FLinearColor::FromSRGBColor(HoverDark)); + BrushDatabase->GetDynamicMaterial("Button_Pressed")->SetVectorParameterValue("Border", FLinearColor::FromSRGBColor(Primary)); + BrushDatabase->GetDynamicMaterial("Button_Pressed")->SetScalarParameterValue("Radius", DarkerNodesSettings->ButtonRadius); + BrushDatabase->GetDynamicMaterial("Button_Disabled")->SetVectorParameterValue("Background", FLinearColor::FromSRGBColor(GreyDark)); + BrushDatabase->GetDynamicMaterial("Button_Disabled")->SetVectorParameterValue("Border", FLinearColor::FromSRGBColor(GreyDark)); + BrushDatabase->GetDynamicMaterial("Button_Disabled")->SetScalarParameterValue("Radius", DarkerNodesSettings->ButtonRadius); + BrushDatabase->GetDynamicMaterial("Button_Disabled")->SetScalarParameterValue("Alpha", 0.5); + + BrushDatabase->GetDynamicMaterial("Button_Start")->SetVectorParameterValue("Background", FLinearColor::FromSRGBColor(GreyDark)); + BrushDatabase->GetDynamicMaterial("Button_Start")->SetVectorParameterValue("Border", FLinearColor::FromSRGBColor(ButtonBorderColor)); + BrushDatabase->GetDynamicMaterial("Button_Start")->SetScalarParameterValue("Radius", DarkerNodesSettings->ButtonRadius); + BrushDatabase->GetDynamicMaterial("Button_Start_Hovered")->SetVectorParameterValue("Background", FLinearColor::FromSRGBColor(GreyDark)); + BrushDatabase->GetDynamicMaterial("Button_Start_Hovered")->SetVectorParameterValue("Border", FLinearColor::FromSRGBColor(Primary)); + BrushDatabase->GetDynamicMaterial("Button_Start_Hovered")->SetScalarParameterValue("Radius", DarkerNodesSettings->ButtonRadius); + BrushDatabase->GetDynamicMaterial("Button_Start_Pressed")->SetVectorParameterValue("Background", FLinearColor::FromSRGBColor(HoverDark)); + BrushDatabase->GetDynamicMaterial("Button_Start_Pressed")->SetVectorParameterValue("Border", FLinearColor::FromSRGBColor(Primary)); + BrushDatabase->GetDynamicMaterial("Button_Start_Pressed")->SetScalarParameterValue("Radius", DarkerNodesSettings->ButtonRadius); + BrushDatabase->GetDynamicMaterial("Button_Start_Checked")->SetVectorParameterValue("Background", FLinearColor::FromSRGBColor(HoverBaseBright)); + BrushDatabase->GetDynamicMaterial("Button_Start_Checked")->SetVectorParameterValue("Border", FLinearColor::FromSRGBColor(HoverBaseBright)); + BrushDatabase->GetDynamicMaterial("Button_Start_Checked")->SetScalarParameterValue("Radius", DarkerNodesSettings->ButtonRadius); + BrushDatabase->GetDynamicMaterial("Button_Start_Hovered_Checked")->SetVectorParameterValue("Background", FLinearColor::FromSRGBColor(HoverBaseBright)); + BrushDatabase->GetDynamicMaterial("Button_Start_Hovered_Checked")->SetVectorParameterValue("Border", FLinearColor::FromSRGBColor(Primary)); + BrushDatabase->GetDynamicMaterial("Button_Start_Hovered_Checked")->SetScalarParameterValue("Radius", DarkerNodesSettings->ButtonRadius); + + BrushDatabase->GetDynamicMaterial("Button_Middle")->SetVectorParameterValue("Background", FLinearColor::FromSRGBColor(GreyDark)); + BrushDatabase->GetDynamicMaterial("Button_Middle")->SetVectorParameterValue("Border", FLinearColor::FromSRGBColor(ButtonBorderColor)); + BrushDatabase->GetDynamicMaterial("Button_Middle_Hovered")->SetVectorParameterValue("Background", FLinearColor::FromSRGBColor(GreyDark)); + BrushDatabase->GetDynamicMaterial("Button_Middle_Hovered")->SetVectorParameterValue("Border", FLinearColor::FromSRGBColor(Primary)); + BrushDatabase->GetDynamicMaterial("Button_Middle_Pressed")->SetVectorParameterValue("Background", FLinearColor::FromSRGBColor(HoverDark)); + BrushDatabase->GetDynamicMaterial("Button_Middle_Pressed")->SetVectorParameterValue("Border", FLinearColor::FromSRGBColor(Primary)); + BrushDatabase->GetDynamicMaterial("Button_Middle_Checked")->SetVectorParameterValue("Background", FLinearColor::FromSRGBColor(HoverBaseBright)); + BrushDatabase->GetDynamicMaterial("Button_Middle_Checked")->SetVectorParameterValue("Border", FLinearColor::FromSRGBColor(HoverBaseBright)); + BrushDatabase->GetDynamicMaterial("Button_Middle_Hovered_Checked")->SetVectorParameterValue("Background", FLinearColor::FromSRGBColor(HoverBaseBright)); + BrushDatabase->GetDynamicMaterial("Button_Middle_Hovered_Checked")->SetVectorParameterValue("Border", FLinearColor::FromSRGBColor(Primary)); + + BrushDatabase->GetDynamicMaterial("Button_End")->SetVectorParameterValue("Background", FLinearColor::FromSRGBColor(GreyDark)); + BrushDatabase->GetDynamicMaterial("Button_End")->SetVectorParameterValue("Border", FLinearColor::FromSRGBColor(ButtonBorderColor)); + BrushDatabase->GetDynamicMaterial("Button_End")->SetScalarParameterValue("Radius", DarkerNodesSettings->ButtonRadius); + BrushDatabase->GetDynamicMaterial("Button_End_Hovered")->SetVectorParameterValue("Background", FLinearColor::FromSRGBColor(GreyDark)); + BrushDatabase->GetDynamicMaterial("Button_End_Hovered")->SetVectorParameterValue("Border", FLinearColor::FromSRGBColor(Primary)); + BrushDatabase->GetDynamicMaterial("Button_End_Hovered")->SetScalarParameterValue("Radius", DarkerNodesSettings->ButtonRadius); + BrushDatabase->GetDynamicMaterial("Button_End_Pressed")->SetVectorParameterValue("Background", FLinearColor::FromSRGBColor(HoverDark)); + BrushDatabase->GetDynamicMaterial("Button_End_Pressed")->SetVectorParameterValue("Border", FLinearColor::FromSRGBColor(Primary)); + BrushDatabase->GetDynamicMaterial("Button_End_Pressed")->SetScalarParameterValue("Radius", DarkerNodesSettings->ButtonRadius); + BrushDatabase->GetDynamicMaterial("Button_End_Checked")->SetVectorParameterValue("Background", FLinearColor::FromSRGBColor(HoverBaseBright)); + BrushDatabase->GetDynamicMaterial("Button_End_Checked")->SetVectorParameterValue("Border", FLinearColor::FromSRGBColor(HoverBaseBright)); + BrushDatabase->GetDynamicMaterial("Button_End_Checked")->SetScalarParameterValue("Radius", DarkerNodesSettings->ButtonRadius); + BrushDatabase->GetDynamicMaterial("Button_End_Hovered_Checked")->SetVectorParameterValue("Background", FLinearColor::FromSRGBColor(HoverBaseBright)); + BrushDatabase->GetDynamicMaterial("Button_End_Hovered_Checked")->SetVectorParameterValue("Border", FLinearColor::FromSRGBColor(Primary)); + BrushDatabase->GetDynamicMaterial("Button_End_Hovered_Checked")->SetScalarParameterValue("Radius", DarkerNodesSettings->ButtonRadius); + + BrushDatabase->GetDynamicMaterial("RegularNode_body")->SetVectorParameterValue("Background", FLinearColor::FromSRGBColor(RegularNodeBackground)); + BrushDatabase->GetDynamicMaterial("RegularNode_body")->SetVectorParameterValue("Border", FLinearColor::FromSRGBColor(RegularNodeBorder)); + BrushDatabase->GetDynamicMaterial("RegularNode_body")->SetScalarParameterValue("Radius", DarkerNodesSettings->BlueprintRegularNodeRadius); + + BrushDatabase->GetDynamicMaterial("RegularNode_shadow_selected")->SetScalarParameterValue("Radius", DarkerNodesSettings->BlueprintRegularNodeRadius + 2); + BrushDatabase->GetDynamicMaterial("RegularNode_shadow_selected")->SetVectorParameterValue("Border", Primary); + BrushDatabase->GetDynamicMaterial("RegularNode_shadow_selected")->SetVectorParameterValue("Background", Primary.WithAlpha(0.0f)); + + BrushDatabase->GetDynamicMaterial("RegularNode_color_spill")->SetScalarParameterValue("Radius", DarkerNodesSettings->BlueprintRegularNodeRadius); + BrushDatabase->GetDynamicMaterial("RegularNode_color_spill")->SetVectorParameterValue("Border", FLinearColor::FromSRGBColor(MixColor(FColor::Black, FColor::White, DarkerNodesSettings->BlueprintNodeHeaderSaturation))); + BrushDatabase->GetDynamicMaterial("RegularNode_color_spill")->SetVectorParameterValue("Background", FLinearColor::FromSRGBColor(MixColor(FColor::Black, FColor::White, DarkerNodesSettings->BlueprintNodeHeaderSaturation))); + BrushDatabase->GetDynamicMaterial("RegularNode_color_spill")->SetScalarParameterValue("Alpha", DarkerNodesSettings->BlueprintNodeHeaderOpacity); + + BrushDatabase->GetDynamicMaterial("PanelDark")->SetVectorParameterValue("Background", FLinearColor::FromSRGBColor(GreyDark)); + BrushDatabase->GetDynamicMaterial("PanelDark")->SetVectorParameterValue("Border", FLinearColor::FromSRGBColor(GreyBase)); + + BrushDatabase->GetDynamicMaterial("VarNode_body")->SetVectorParameterValue("Background", FLinearColor::FromSRGBColor(VarNodeBackground)); + BrushDatabase->GetDynamicMaterial("VarNode_body")->SetVectorParameterValue("Border", FLinearColor::FromSRGBColor(VarNodeBorder)); + BrushDatabase->GetDynamicMaterial("VarNode_body")->SetScalarParameterValue("Radius", DarkerNodesSettings->BlueprintVarNodeRadius); + + BrushDatabase->GetDynamicMaterial("VarNode_shadow_selected")->SetScalarParameterValue("Radius", DarkerNodesSettings->BlueprintVarNodeRadius + 2); + BrushDatabase->GetDynamicMaterial("VarNode_shadow_selected")->SetVectorParameterValue("Border", Primary); + BrushDatabase->GetDynamicMaterial("VarNode_shadow_selected")->SetVectorParameterValue("Background", Primary.WithAlpha(0.0f)); + + if (DarkerNodesSettings->ExtendNodes) + { + BrushDatabase->GetDynamicMaterial("RegularNode_body")->SetVectorParameterValue("Padding", FLinearColor(0, 0, 4, 0)); + BrushDatabase->GetDynamicMaterial("VarNode_body")->SetVectorParameterValue("Padding", FLinearColor(0, 0, 4, 0)); + BrushDatabase->GetDynamicMaterial("RegularNode_shadow_selected")->SetVectorParameterValue("Padding", FLinearColor(10, 10, 14, 10)); + BrushDatabase->GetDynamicMaterial("VarNode_shadow_selected")->SetVectorParameterValue("Padding", FLinearColor(10, 10, 14, 10)); + BrushDatabase->GetDynamicMaterial("RegularNode_color_spill")->SetVectorParameterValue("Padding", FLinearColor(1, 1, 0, 0)); + } + else + { + BrushDatabase->GetDynamicMaterial("RegularNode_body")->SetVectorParameterValue("Padding", FLinearColor(4, 2, 4, 2)); + BrushDatabase->GetDynamicMaterial("VarNode_body")->SetVectorParameterValue("Padding", FLinearColor(4, 2, 4, 2)); + BrushDatabase->GetDynamicMaterial("RegularNode_shadow_selected")->SetVectorParameterValue("Padding", FLinearColor(14, 12, 14, 12)); + BrushDatabase->GetDynamicMaterial("VarNode_shadow_selected")->SetVectorParameterValue("Padding", FLinearColor(14, 12, 14, 12)); + BrushDatabase->GetDynamicMaterial("RegularNode_color_spill")->SetVectorParameterValue("Padding", FLinearColor(5, 3, 0, 0)); + } +} diff --git a/Plugins/DarkerNodes/Source/DarkerNodes/Private/Colorizer/ColorizerSave.cpp b/Plugins/DarkerNodes/Source/DarkerNodes/Private/Colorizer/ColorizerSave.cpp new file mode 100644 index 0000000..29375f5 --- /dev/null +++ b/Plugins/DarkerNodes/Source/DarkerNodes/Private/Colorizer/ColorizerSave.cpp @@ -0,0 +1,14 @@ +/* Copyright (C) 2021 Hugo ATTAL - All Rights Reserved +* This plugin is downloadable from the Unreal Engine Marketplace +*/ + +#include "Colorizer.h" + +void FColorizer::SaveStyleForUMG() +{ + // Hack to save the slates for UMG + + CoreStyle->Set("Saved_Checkbox", CoreStyle->GetWidgetStyle("Checkbox")); + CoreStyle->Set("Saved_SpinBox", CoreStyle->GetWidgetStyle("SpinBox")); + CoreStyle->Set("Saved_Button", CoreStyle->GetWidgetStyle("Button")); +} \ No newline at end of file diff --git a/Plugins/DarkerNodes/Source/DarkerNodes/Private/Colorizer/ColorizerText.cpp b/Plugins/DarkerNodes/Source/DarkerNodes/Private/Colorizer/ColorizerText.cpp new file mode 100644 index 0000000..04fdc96 --- /dev/null +++ b/Plugins/DarkerNodes/Source/DarkerNodes/Private/Colorizer/ColorizerText.cpp @@ -0,0 +1,306 @@ +/* Copyright (C) 2021 Hugo ATTAL - All Rights Reserved +* This plugin is downloadable from the Unreal Engine Marketplace +*/ + +#include "Colorizer.h" + +void FColorizer::ColorText() +{ + if (!DarkerNodesSettings->UseCustomButton) + { + return; + } + + CoreStyle->Set("NormalFont", FCoreStyle::GetDefaultFontStyle("Regular", GetFontSize(9))); + CoreStyle->Set("SmallFont", FCoreStyle::GetDefaultFontStyle("Regular", GetFontSize(8))); + + EditorStyle->Set("NormalFont", FCoreStyle::GetDefaultFontStyle("Regular", GetFontSize(9))); + EditorStyle->Set("BoldFont", FCoreStyle::GetDefaultFontStyle("Bold", GetFontSize(9))); + + // FLinearColor(0.19f, 0.33f, 0.72f); + + NormalText = + FTextBlockStyle() + .SetFont(FCoreStyle::GetDefaultFontStyle("Regular", GetFontSize(9))) + .SetColorAndOpacity(*BrushDatabase->GetSlateColor("TextColor")) + .SetShadowOffset(FVector2D::ZeroVector) + .SetShadowColorAndOpacity(FLinearColor::FromSRGBColor(TextShadow)) + .SetHighlightColor(FLinearColor::FromSRGBColor(Primary)); + + const FTextBlockStyle ShadowText = + FTextBlockStyle(NormalText) + .SetShadowOffset(FVector2D(1.0f, 1.0f)); + + CoreStyle->Set("NormalText", NormalText); + + CoreStyle->Set( + "SmallText", + FTextBlockStyle(NormalText) + .SetFont(FCoreStyle::GetDefaultFontStyle("Regular", GetFontSize(8)))); + + EditorStyle->Set("NormalText", NormalText); + + EditorStyle->Set( + "NormalText.Subdued", + FTextBlockStyle(NormalText) + .SetColorAndOpacity(FSlateColor::UseSubduedForeground())); + + EditorStyle->Set( + "NormalText.Important", + FTextBlockStyle(NormalText) + .SetFont(FCoreStyle::GetDefaultFontStyle("Bold", GetFontSize(9))) + .SetShadowOffset(FVector2D(1, 1))); + + EditorStyle->Set( + "SmallText", + FTextBlockStyle(NormalText) + .SetFont(FCoreStyle::GetDefaultFontStyle("Regular", GetFontSize(8)))); + + EditorStyle->Set( + "SmallText.Subdued", + FTextBlockStyle(NormalText) + .SetFont(FCoreStyle::GetDefaultFontStyle("Regular", GetFontSize(8))) + .SetColorAndOpacity(FSlateColor::UseSubduedForeground())); + + EditorStyle->Set( + "TinyText", + FTextBlockStyle(NormalText) + .SetFont(FCoreStyle::GetDefaultFontStyle("Regular", GetFontSize(8)))); + + EditorStyle->Set( + "TinyText.Subdued", + FTextBlockStyle(NormalText) + .SetFont(FCoreStyle::GetDefaultFontStyle("Regular", GetFontSize(8))) + .SetColorAndOpacity(FSlateColor::UseSubduedForeground())); + + EditorStyle->Set( + "LargeText", + FTextBlockStyle(NormalText) + .SetFont(FCoreStyle::GetDefaultFontStyle("Bold", GetFontSize(11))) + .SetShadowOffset(FVector2D(1, 1))); + + const FEditableTextBoxStyle NormalEditableTextBoxStyle = + FEditableTextBoxStyle() + .SetFont(NormalText.Font) + .SetBackgroundImageNormal(*SlateBrush("Button")) + .SetBackgroundImageHovered(*SlateBrush("Button_Hovered")) + .SetBackgroundImageFocused(*SlateBrush("Button_Hovered")) + .SetBackgroundImageReadOnly(*SlateBrush("Button_Disabled")) + .SetForegroundColor(FLinearColor::FromSRGBColor(TextColor)) + .SetScrollBarStyle(CoreStyle->GetWidgetStyle("Scrollbar")); + + CoreStyle->Set("NormalEditableTextBox", NormalEditableTextBoxStyle); + EditorStyle->Set("NormalEditableTextBox", NormalEditableTextBoxStyle); + + CoreStyle->Set( + "EmbossedText", + FTextBlockStyle(NormalText) + .SetFont(FCoreStyle::GetDefaultFontStyle("Regular", GetFontSize(24))) + .SetColorAndOpacity(*BrushDatabase->GetSlateColor("TextColor")) + .SetShadowOffset(FVector2D(1.0f, 1.0f)) + ); + + CoreStyle->Set( + "SearchBox", + FSearchBoxStyle() + .SetTextBoxStyle(NormalEditableTextBoxStyle) + .SetUpArrowImage(ImageBrush("/Elements/Textbox/UpArrow.png", Icon8)) + .SetDownArrowImage(ImageBrush("/Elements/Textbox/DownArrow.png", Icon8)) + .SetGlassImage(ImageBrush("/Elements/Textbox/SearchGlass.png", Icon16)) + .SetClearImage(ImageBrush("/Elements/Textbox/X.png", Icon16)) + ); + + EditorStyle->Set( + "LevelViewportContextMenu.ActorType.Text", + FTextBlockStyle(NormalText) + .SetFont(FCoreStyle::GetDefaultFontStyle("Regular", GetFontSize(8)))); + + EditorStyle->Set( + "LevelViewportContextMenu.AssetLabel.Text", + FTextBlockStyle(NormalText) + .SetFont(FCoreStyle::GetDefaultFontStyle("Regular", GetFontSize(9)))); + + EditorStyle->Set( + "EditorModesToolbar.Label", + FTextBlockStyle(NormalText) + .SetFont(FCoreStyle::GetDefaultFontStyle("Regular", GetFontSize(7)))); + EditorStyle->Set( + "EditorModesToolbar.EditableText", + FEditableTextBoxStyle(NormalEditableTextBoxStyle) + .SetFont(FCoreStyle::GetDefaultFontStyle("Regular", GetFontSize(9)))); + EditorStyle->Set( + "EditorModesToolbar.Keybinding", + FTextBlockStyle(NormalText) + .SetFont(FCoreStyle::GetDefaultFontStyle("Regular", GetFontSize(8)))); + + EditorStyle->Set( + "ToolBar.Label", + FTextBlockStyle(NormalText) + .SetFont(FCoreStyle::GetDefaultFontStyle("Regular", GetFontSize(9)))); + EditorStyle->Set( + "ToolBar.EditableText", + FEditableTextBoxStyle(NormalEditableTextBoxStyle) + .SetFont(FCoreStyle::GetDefaultFontStyle("Regular", GetFontSize(9)))); + EditorStyle->Set( + "ToolBar.Keybinding", + FTextBlockStyle(NormalText) + .SetFont(FCoreStyle::GetDefaultFontStyle("Regular", GetFontSize(8)))); + + EditorStyle->Set( + "ToolBar.Heading", + FTextBlockStyle(NormalText) + .SetFont(FCoreStyle::GetDefaultFontStyle("Regular", GetFontSize(8)))); + + EditorStyle->Set( + "ViewportMenu.Label", + FTextBlockStyle(NormalText) + .SetFont(FCoreStyle::GetDefaultFontStyle("Bold", GetFontSize(9)))); + + EditorStyle->Set( + "SProjectBadge.Text", + FTextBlockStyle(NormalText) + .SetFont(FCoreStyle::GetDefaultFontStyle("Regular", GetFontSize(12)))); + + EditorStyle->Set( + "Editor.SearchBoxFont", + FTextBlockStyle(NormalText) + .SetFont(FCoreStyle::GetDefaultFontStyle("Regular", GetFontSize(12)))); + + EditorStyle->Set( + "ViewportPinnedCommandList.Label", + FTextBlockStyle(NormalText) + .SetFont(FCoreStyle::GetDefaultFontStyle("Bold", GetFontSize(9)))); + + EditorStyle->Set( + "ViewportPinnedCommandList.EditableText", + FEditableTextBoxStyle(NormalEditableTextBoxStyle) + .SetFont(FCoreStyle::GetDefaultFontStyle("Bold", GetFontSize(9)))); + + EditorStyle->Set( + "ViewportPinnedCommandList.Keybinding", + FTextBlockStyle(NormalText) + .SetFont(FCoreStyle::GetDefaultFontStyle("Regular", GetFontSize(8)))); + + EditorStyle->Set( + "ViewportPinnedCommandList.Heading", + FTextBlockStyle(NormalText) + .SetFont(FCoreStyle::GetDefaultFontStyle("Regular", GetFontSize(8)))); + + EditorStyle->Set( + "PlacementBrowser.Tab.Text", + FTextBlockStyle(ShadowText) + .SetFont(FCoreStyle::GetDefaultFontStyle("Bold", GetFontSize(10)))); + + EditorStyle->Set( + "PlacementBrowser.Asset.Name", + FTextBlockStyle(ShadowText) + .SetFont(FCoreStyle::GetDefaultFontStyle("Regular", GetFontSize(10)))); + + EditorStyle->Set( + "PlacementBrowser.Asset.Type", + FTextBlockStyle(ShadowText) + .SetFont(FCoreStyle::GetDefaultFontStyle("Regular", GetFontSize(8)))); + + EditorStyle->Set( + "FlatButton.DefaultTextStyle", + FTextBlockStyle(ShadowText) + .SetFont(FCoreStyle::GetDefaultFontStyle("Bold", GetFontSize(10))) + .SetHighlightColor(FLinearColor::FromSRGBColor(Primary))); + + EditorStyle->Set( + "Profiler.EventGraph.DarkText", + FTextBlockStyle(NormalText) + .SetFont(FCoreStyle::GetDefaultFontStyle("Regular", GetFontSize(8))) + ); + + EditorStyle->Set( + "WorldBrowser.LabelFont", + FTextBlockStyle(NormalText) + .SetFont(FCoreStyle::GetDefaultFontStyle("Regular", GetFontSize(9))) + ); + + EditorStyle->Set( + "WorldBrowser.LabelFontBold", + FTextBlockStyle(NormalText) + .SetFont(FCoreStyle::GetDefaultFontStyle("Bold", GetFontSize(10))) + ); + + const FString FontAwesomePath = FPaths::EngineContentDir() / TEXT("Editor/Slate/Fonts/FontAwesome.ttf"); + + EditorStyle->Set( + "FindResults.FindInBlueprints", + FTextBlockStyle(NormalText) + .SetFont(FSlateFontInfo(FontAwesomePath, GetFontSize(10)))); + + // ---- + + const FInlineEditableTextBlockStyle InlineEditableTextBlockStyle = + FInlineEditableTextBlockStyle() + .SetTextStyle(NormalText) + .SetEditableTextBoxStyle(NormalEditableTextBoxStyle); + + EditorStyle->Set("InlineEditableTextBlockStyle", InlineEditableTextBlockStyle); + CoreStyle->Set("InlineEditableTextBlockStyle", InlineEditableTextBlockStyle); + EditorStyle->Set("Graph.Node.InlineEditablePinName", InlineEditableTextBlockStyle); + + const FTextBlockStyle GraphNodeTitle = + FTextBlockStyle(NormalText) + .SetFont(FCoreStyle::GetDefaultFontStyle("Bold", GetFontSize(10))); + + EditorStyle->Set("Graph.Node.NodeTitle", GraphNodeTitle); + EditorStyle->Set("Graph.Node.NodeTitleEditableText", NormalEditableTextBoxStyle); + EditorStyle->Set("Graph.StateNode.NodeTitleEditableText", NormalEditableTextBoxStyle); + + EditorStyle->Set( + "Graph.Node.NodeTitleInlineEditableText", + FInlineEditableTextBlockStyle() + .SetTextStyle(GraphNodeTitle) + .SetEditableTextBoxStyle(NormalEditableTextBoxStyle) + ); + + EditorStyle->Set( + "Graph.StateNode.NodeTitleInlineEditableText", + FInlineEditableTextBlockStyle() + .SetTextStyle(GraphNodeTitle) + .SetEditableTextBoxStyle(NormalEditableTextBoxStyle) + ); + + // ---- + + const FTextBlockStyle GraphCommentBlockTitle = + FTextBlockStyle(NormalText) + .SetFont(FCoreStyle::GetDefaultFontStyle("Bold", GetFontSize(18))) + .SetColorAndOpacity(FSlateColor(FColor::White)) + .SetShadowOffset(FVector2D(1.5f, 1.5f)) + .SetShadowColorAndOpacity(FLinearColor::FromSRGBColor(TextShadow)); + EditorStyle->Set("Graph.CommentBlock.Title", GraphCommentBlockTitle); + + const FEditableTextBoxStyle GraphCommentBlockTitleEditableText = + FEditableTextBoxStyle(NormalEditableTextBoxStyle) + .SetFont(GraphCommentBlockTitle.Font); + EditorStyle->Set("Graph.CommentBlock.TitleEditableText", GraphCommentBlockTitleEditableText); + + EditorStyle->Set( + "Graph.CommentBlock.TitleInlineEditableText", + FInlineEditableTextBlockStyle() + .SetTextStyle(GraphCommentBlockTitle) + .SetEditableTextBoxStyle(GraphCommentBlockTitleEditableText) + ); +} + +int32 FColorizer::GetFontSize(int32 BaseSize) const +{ + switch (DarkerNodesSettings->FontSize) + { + case EFontSize::Small: + return BaseSize * 0.8f; + case EFontSize::Normal: + return BaseSize; + case EFontSize::Big: + return BaseSize * 1.2f; + case EFontSize::Bigger: + return BaseSize * 1.5f; + default: + return BaseSize; + } +} diff --git a/Plugins/DarkerNodes/Source/DarkerNodes/Private/Colorizer/ColorizerUtils.cpp b/Plugins/DarkerNodes/Source/DarkerNodes/Private/Colorizer/ColorizerUtils.cpp new file mode 100644 index 0000000..ad60c9c --- /dev/null +++ b/Plugins/DarkerNodes/Source/DarkerNodes/Private/Colorizer/ColorizerUtils.cpp @@ -0,0 +1,160 @@ +/* Copyright (C) 2021 Hugo ATTAL - All Rights Reserved +* This plugin is downloadable from the Unreal Engine Marketplace +*/ + +#include "Colorizer.h" +#include "Lib/ColorLib.h" + +void FColorizer::AddMenuIcon(FSlateStyleSet* StyleSet, FString Name, FString Location, FColor Color) const +{ + switch (DarkerNodesSettings->IconStyle) + { + case EIconStyle::Line: + ApplyImageBrush(StyleSet, FName(*Name), Location.Replace(TEXT("/Menu"), TEXT("/Menu/Line")), Icon40, Color); + ApplyImageBrush(StyleSet, FName(*(Name + FString(".Small"))), Location.Replace(TEXT("/Menu"), TEXT("/Menu/Line.Small")), Icon20, Color); + break; + case EIconStyle::Solid: + ApplyImageBrush(StyleSet, FName(*Name), Location.Replace(TEXT("/Menu"), TEXT("/Menu/Solid")), Icon40, Color); + ApplyImageBrush(StyleSet, FName(*(Name + FString(".Small"))), Location.Replace(TEXT("/Menu"), TEXT("/Menu/Solid.Small")), Icon20, Color); + break; + } +} + +void FColorizer::ApplyImageBrush(FSlateStyleSet* StyleSet, FName Name, FString Location, FVector2D Size) const +{ + ApplyImageBrush(StyleSet, Name, Location, Size, ImageColor); +} + +void FColorizer::ApplyImageBrush(FSlateStyleSet* StyleSet, FName Name, FString Location, FVector2D Size, FColor Color) const +{ + StyleSet->Set( + Name, + new FSlateImageBrush( + ThemeDirectory + Location, + Size, + FLinearColor::FromSRGBColor(Color) + ) + ); +} + +FSlateImageBrush FColorizer::ImageBrush(FString Location, FVector2D Size) const +{ + return ImageBrush(Location, Size, ImageColor); +} + +FSlateImageBrush FColorizer::ImageBrush(FString Location, FVector2D Size, FColor Color) const +{ + return FSlateImageBrush( + ThemeDirectory + Location, + Size, + FLinearColor::FromSRGBColor(Color) + ); +} + +FSlateImageBrush FColorizer::ColorImageBrush(FColor Color, FVector2D Size) const +{ + return FSlateImageBrush( + ThemeDirectory + FString("/Blank.png"), + Size, + FLinearColor::FromSRGBColor(Color) + ); +} + +void FColorizer::ApplyBoxBrush(FSlateStyleSet* StyleSet, FName Name, FString Location, FMargin Margin, FColor Color) const +{ + StyleSet->Set( + Name, + new FSlateBoxBrush( + ThemeDirectory + Location, + Margin, + FLinearColor::FromSRGBColor(Color) + ) + ); +} + +void FColorizer::ApplyColorBoxBrush(FSlateStyleSet* StyleSet, FName Name, FColor Color) const +{ + StyleSet->Set( + Name, + new FSlateBoxBrush( + ThemeDirectory + FString("/Blank.png"), + FMargin(0.25), + FLinearColor::FromSRGBColor(Color) + ) + ); +} + +FSlateBoxBrush FColorizer::BoxBrush(FString Location, FVector2D Size, FMargin Margin, FColor Color) const +{ + return FSlateBoxBrush( + ThemeDirectory + Location, + Size, + Margin, + FLinearColor::FromSRGBColor(Color) + ); +} + +void FColorizer::ApplyColorBorderBrush(FSlateStyleSet* StyleSet, FName Name, FColor Color) const +{ + StyleSet->Set( + Name, + new FSlateBorderBrush( + ThemeDirectory + FString("/Blank.png"), + FMargin(0.25), + FLinearColor::FromSRGBColor(Color) + ) + ); +} + +FSlateBorderBrush FColorizer::ColorBorderBrush(FColor Color, FMargin Margin) const +{ + return BorderBrush( + FString("/Blank.png"), + Margin, + Color + ); +} + +FSlateBrush* FColorizer::SlateBrush(FString Name) const +{ + return BrushDatabase->GetSlateBrush(Name); +} + +FSlateBorderBrush FColorizer::BorderBrush(FString Location, FMargin Margin, FColor Color) const +{ + return FSlateBorderBrush( + ThemeDirectory + Location, + Margin, + Color + ); +} + +void FColorizer::ApplyCenterIcon(FSlateStyleSet* StyleSet, FName Name, FString Location, FVector2D Size, FColor Color) const +{ + StyleSet->Set( + Name, + BrushDatabase->GetCenteredImageBrush( + Name.ToString(), + Location, + Size, + Color + ) + ); +} + +FSlateBrush* FColorizer::CenterIcon(FName Name, FString Location, FVector2D Size, FColor Color) const +{ + return BrushDatabase->GetCenteredImageBrush( + Name.ToString(), + Location, + Size, + Color + ); +} + +FColor FColorizer::InvertLight(FColor Color) +{ + FVector LAB = FColorLib::XYZtoLAB(FColorLib::RGBtoXYZ(Color)); + LAB.X = 100.0f - LAB.X; + return FColorLib::XYZtoRGB(FColorLib::LABtoXYZ(LAB)); +} diff --git a/Plugins/DarkerNodes/Source/DarkerNodes/Private/Colorizer/ColorizerWindow.cpp b/Plugins/DarkerNodes/Source/DarkerNodes/Private/Colorizer/ColorizerWindow.cpp new file mode 100644 index 0000000..da09f15 --- /dev/null +++ b/Plugins/DarkerNodes/Source/DarkerNodes/Private/Colorizer/ColorizerWindow.cpp @@ -0,0 +1,72 @@ +/* Copyright (C) 2021 Hugo ATTAL - All Rights Reserved +* This plugin is downloadable from the Unreal Engine Marketplace +*/ + +#include "Colorizer.h" +#include "Classes/EditorStyleSettings.h" + +void FColorizer::ColorWindow() +{ + if (!DarkerNodesSettings->UseCustomPanels) + { + return; + } + +#if !PLATFORM_MAC + const FVector2D IconWindow = FVector2D(30, 18); + const FColor TextColor50 = TextColor.WithAlpha(255 * 0.5); + const FColor TextColor75 = TextColor.WithAlpha(255 * 0.75); + + const FButtonStyle Button = CoreStyle->GetWidgetStyle("Button"); + + const FButtonStyle MinimizeButtonStyle = + FButtonStyle(Button) + .SetNormal(*CenterIcon("WindowButton_Minimize_Normal", "/Window/WindowButton_Minimize.png", IconWindow, TextColor50)) + .SetHovered(*CenterIcon("WindowButton_Minimize_Hovered", "/Window/WindowButton_Minimize.png", IconWindow, TextColor)) + .SetPressed(*CenterIcon("WindowButton_Minimize_Pressed", "/Window/WindowButton_Minimize.png", IconWindow, TextColor75)); + + const FButtonStyle MaximizeButtonStyle = + FButtonStyle(Button) + .SetNormal(*CenterIcon("WindowButton_Maximize_Normal", "/Window/WindowButton_Maximize.png", IconWindow, TextColor50)) + .SetHovered(*CenterIcon("WindowButton_Maximize_Hovered", "/Window/WindowButton_Maximize.png", IconWindow, TextColor)) + .SetPressed(*CenterIcon("WindowButton_Maximize_Pressed", "/Window/WindowButton_Maximize.png", IconWindow, TextColor75)); + + const FButtonStyle RestoreButtonStyle = + FButtonStyle(Button) + .SetNormal(*CenterIcon("WindowButton_Restore_Normal", "/Window/WindowButton_Restore.png", IconWindow, TextColor50)) + .SetHovered(*CenterIcon("WindowButton_Restore_Hovered", "/Window/WindowButton_Restore.png", IconWindow, TextColor)) + .SetPressed(*CenterIcon("WindowButton_Restore_Pressed", "/Window/WindowButton_Restore.png", IconWindow, TextColor75)); + + const FButtonStyle CloseButtonStyle = + FButtonStyle(Button) + .SetNormal(*CenterIcon("WindowButton_Close_Normal", "/Window/WindowButton_Close.png", IconWindow, TextColor50)) + .SetHovered(*CenterIcon("WindowButton_Close_Hovered", "/Window/WindowButton_Close.png", IconWindow, TextColor)) + .SetPressed(*CenterIcon("WindowButton_Close_Pressed", "/Window/WindowButton_Close.png", IconWindow, TextColor75)); +#endif + + + const FTextBlockStyle TitleTextStyle = + FTextBlockStyle(CoreStyle->GetWidgetStyle("NormalText")) + .SetFont(FCoreStyle::GetDefaultFontStyle("Regular", 9)) + .SetShadowOffset(FVector2D(1.0f, 1.0f)); + + CoreStyle->Set( + "Window", + FWindowStyle() +#if !PLATFORM_MAC + .SetMinimizeButtonStyle(MinimizeButtonStyle) + .SetMaximizeButtonStyle(MaximizeButtonStyle) + .SetRestoreButtonStyle(RestoreButtonStyle) + .SetCloseButtonStyle(CloseButtonStyle) +#endif + .SetTitleTextStyle(TitleTextStyle) + .SetActiveTitleBrush(ImageBrush("/Transparent.png", Icon32)) + .SetInactiveTitleBrush(ImageBrush("/Window/WindowTitle_Inactive.png", Icon32)) + .SetFlashTitleBrush(ImageBrush("/Window/WindowTitle_Flashing.png", Icon24)) + .SetOutlineBrush(BorderBrush("/Window/WindowOutline.png")) + .SetOutlineColor(FLinearColor(0.1f, 0.1f, 0.1f, 1.0f)) + .SetBorderBrush(BoxBrush("/Transparent.png", Icon256, 0.48f)) + .SetBackgroundBrush(*SlateBrush("MainWindowColor")) + .SetChildBackgroundBrush(*SlateBrush("ChildWindowColor")) + ); +} diff --git a/Plugins/DarkerNodes/Source/DarkerNodes/Private/DarkerNodes.cpp b/Plugins/DarkerNodes/Source/DarkerNodes/Private/DarkerNodes.cpp new file mode 100644 index 0000000..5f8881c --- /dev/null +++ b/Plugins/DarkerNodes/Source/DarkerNodes/Private/DarkerNodes.cpp @@ -0,0 +1,40 @@ +/* Copyright (C) 2021 Hugo ATTAL - All Rights Reserved +* This plugin is downloadable from the Unreal Engine Marketplace +*/ + +#include "DarkerNodes.h" +#include "DarkerNodesCommands.h" +#include "Interfaces/IPluginManager.h" +#include "MainFrame/Public/Interfaces/IMainFrameModule.h" + +#define LOCTEXT_NAMESPACE "FDarkerNodesModule" + +void FDarkerNodesModule::StartupModule() +{ + const FString ShaderDirectory = IPluginManager::Get().FindPlugin(TEXT("DarkerNodes"))->GetBaseDir() + FString("/Shaders"); + AddShaderSourceDirectoryMapping("/DarkerNodes", ShaderDirectory); + + Colorizer.Color(); + + auto const CommandBindings = FModuleManager::LoadModuleChecked< IMainFrameModule >("MainFrame").GetMainFrameCommandBindings(); + DarkerNodesCommands::Register(); + + CommandBindings->MapAction( + DarkerNodesCommands::Get().RestartEditorCommand, + FExecuteAction::CreateRaw(this, &FDarkerNodesModule::RestartEditor) + ); +} + +void FDarkerNodesModule::RestartEditor() +{ + FUnrealEdMisc::Get().RestartEditor(false); +} + +void FDarkerNodesModule::ShutdownModule() +{ +} + + +#undef LOCTEXT_NAMESPACE + +IMPLEMENT_MODULE(FDarkerNodesModule, DarkerNodes) diff --git a/Plugins/DarkerNodes/Source/DarkerNodes/Private/DarkerNodesCommands.h b/Plugins/DarkerNodes/Source/DarkerNodes/Private/DarkerNodesCommands.h new file mode 100644 index 0000000..7018d11 --- /dev/null +++ b/Plugins/DarkerNodes/Source/DarkerNodes/Private/DarkerNodesCommands.h @@ -0,0 +1,32 @@ +/* Copyright (C) 2021 Hugo ATTAL - All Rights Reserved +* This plugin is downloadable from the Unreal Engine Marketplace +*/ + +#pragma once + +#include "CoreMinimal.h" +#include "Framework/Commands/Commands.h" + +#define LOCTEXT_NAMESPACE "DarkerNodesCommands" + +class DarkerNodesCommands : public TCommands +{ +public: + DarkerNodesCommands() + : TCommands( + TEXT("DarkerNodes"), + FText::FromString("Darker Nodes"), + NAME_None, + "DarkerNodesStyle") + { + } + + TSharedPtr RestartEditorCommand; + + virtual void RegisterCommands() override + { + UI_COMMAND(RestartEditorCommand, "Restart Editor", "Trigger an editor restart", EUserInterfaceActionType::Button, FInputChord()); + } +}; + +#undef LOCTEXT_NAMESPACE diff --git a/Plugins/DarkerNodes/Source/DarkerNodes/Private/Lib/BrushDatabase.cpp b/Plugins/DarkerNodes/Source/DarkerNodes/Private/Lib/BrushDatabase.cpp new file mode 100644 index 0000000..9f92b59 --- /dev/null +++ b/Plugins/DarkerNodes/Source/DarkerNodes/Private/Lib/BrushDatabase.cpp @@ -0,0 +1,162 @@ +/* Copyright (C) 2021 Hugo ATTAL - All Rights Reserved +* This plugin is downloadable from the Unreal Engine Marketplace +*/ + +#include "BrushDatabase.h" + + +#include "FileHelpers.h" +#include "ImageUtils.h" +#include "Interfaces/IPluginManager.h" +#include "Materials/MaterialInstanceDynamic.h" +#include "Styling/SlateStyle.h" + +UBrushDatabase::UBrushDatabase() +{ + AddToRoot(); + ThemeDirectory = IPluginManager::Get().FindPlugin(TEXT("DarkerNodes"))->GetBaseDir() + FString("/Resources/Theme"); +} + +void UBrushDatabase::SetMaterial(FSlateBrush* Brush, FString Name) +{ + if (!Materials.Contains(Name)) + { + const FString MaterialPath = "/DarkerNodes/Materials/" + Name; + UMaterial* Material = LoadObject(nullptr, *MaterialPath); + Materials.Add(Name, Material); + } + + if (IsValid(Materials[Name])) + { + Brush->SetResourceObject(Materials[Name]); + } +} + +void UBrushDatabase::UpdateAndSaveMaterials() +{ + FlushShaderFileCache(); + + TArray PackagesToSave; + + for (auto& Material : Materials) + { + Material.Value->PreEditChange(nullptr); + Material.Value->PostEditChange(); + +#if ENGINE_MAJOR_VERSION == 4 && ENGINE_MINOR_VERSION <= 25 + PackagesToSave.Add(Material.Value->GetOutermost()); +#else + PackagesToSave.Add(Material.Value->GetPackage()); +#endif + } + + FEditorFileUtils::PromptForCheckoutAndSave(PackagesToSave, false, false); +} + +UMaterialInstanceDynamic* UBrushDatabase::GetDynamicMaterial(FString Name, FSlateBrush* Brush) +{ + if (DynamicMaterials.Contains(Name)) + { + return DynamicMaterials[Name]; + } + + if (Brush == nullptr) + { + return nullptr; + } + + UObject* Resource = Brush->GetResourceObject(); + UMaterialInterface* Material = Cast(Resource); + + if (Material) + { + UMaterialInstanceDynamic* DynamicMaterial = Cast(Material); + + if (!DynamicMaterial) + { + DynamicMaterial = UMaterialInstanceDynamic::Create(Material, this); + DynamicMaterials.Add(Name, DynamicMaterial); + Brush->SetResourceObject(DynamicMaterial); + } + + return DynamicMaterial; + } + + return nullptr; +} + +FSlateBrush* UBrushDatabase::GetCenteredImageBrush(FString Name, FString Path, FVector2D Size, FColor Color) +{ + FSlateBrush* Brush = new FSlateBrush(); + Brush->SetImageSize(Size); + Brush->TintColor = FLinearColor::FromSRGBColor(Color); + SetMaterial(Brush, "CenterUVs.CenterUVs"); + + const FString ImagePath = ThemeDirectory + Path; + UTexture2D* Image = FImageUtils::ImportFileAsTexture2D(FPaths::ConvertRelativePathToFull(ImagePath)); + + UMaterialInstanceDynamic* MaterialInstance = GetDynamicMaterial(Name, Brush); + MaterialInstance->SetVectorParameterValue("Size", FVector(Size.X, Size.Y, 0)); + MaterialInstance->SetTextureParameterValue("Image", Image); + + return Brush; +} + +void UBrushDatabase::CreateDynamicMaterial(FString Name, FString ParentName) +{ + if (!Materials.Contains(ParentName)) + { + const FString MaterialPath = "/DarkerNodes/Materials/" + ParentName; + UMaterial* Material = LoadObject(nullptr, *MaterialPath); + Materials.Add(ParentName, Material); + } + + UMaterialInstanceDynamic* DynamicMaterial = UMaterialInstanceDynamic::Create(Materials[ParentName], this); + DynamicMaterials.Add(Name, DynamicMaterial); +} + +void UBrushDatabase::CreateSlateBrush(FString Name) +{ + SlateBrushes.Add(Name, new FSlateBrush()); +} + +void UBrushDatabase::CreateSlateBrush(FString Name, FString MaterialName) +{ + CreateDynamicMaterial(Name, MaterialName); + CreateSlateBrush(Name); + SetSlateBrushMaterial(Name, Name); +} + +FSlateBrush* UBrushDatabase::GetSlateBrush(FString Name) +{ + return SlateBrushes[Name]; +} + +void UBrushDatabase::SetSlateBrushMaterial(FString Name, FString DynamicMaterialName) +{ + SlateBrushes[Name]->SetResourceObject(DynamicMaterials[DynamicMaterialName]); +} + +void UBrushDatabase::CreateSlateColor(FString Name) +{ + Colors.Add(Name, MakeShared()); + SlateColors.Add(Name, new FSlateColor(Colors[Name])); +} + +void UBrushDatabase::SetSlateColor(FString Name, FLinearColor Color) +{ + Colors[Name].Get().R = Color.R; + Colors[Name].Get().G = Color.G; + Colors[Name].Get().B = Color.B; + Colors[Name].Get().A = Color.A; +} + +FSlateColor* UBrushDatabase::GetSlateColor(FString Name) +{ + return SlateColors[Name]; +} + +TSharedRef UBrushDatabase::GetColor(FString Name) +{ + return Colors[Name]; +} diff --git a/Plugins/DarkerNodes/Source/DarkerNodes/Private/Lib/BrushDatabase.h b/Plugins/DarkerNodes/Source/DarkerNodes/Private/Lib/BrushDatabase.h new file mode 100644 index 0000000..7e2c7ff --- /dev/null +++ b/Plugins/DarkerNodes/Source/DarkerNodes/Private/Lib/BrushDatabase.h @@ -0,0 +1,54 @@ +/* Copyright (C) 2021 Hugo ATTAL - All Rights Reserved +* This plugin is downloadable from the Unreal Engine Marketplace +*/ + +#pragma once + +#include "CoreMinimal.h" + +#include "SlateMaterialBrush.h" +#include "UObject/Object.h" +#include "BrushDatabase.generated.h" + +UCLASS() +class DARKERNODES_API UBrushDatabase : public UObject +{ + GENERATED_BODY() + +public: + UBrushDatabase(); + void SetMaterial(FSlateBrush* Brush, FString Name); + + void UpdateAndSaveMaterials(); + UMaterialInstanceDynamic* GetDynamicMaterial(FString Name, FSlateBrush* Brush = nullptr); + + FSlateBrush* GetCenteredImageBrush(FString Name, FString Path, FVector2D Size, FColor Color = FColor::White); + + void CreateDynamicMaterial(FString Name, FString ParentName); + + void CreateSlateBrush(FString Name); + void CreateSlateBrush(FString Name, FString MaterialName); + FSlateBrush* GetSlateBrush(FString Name); + void SetSlateBrushMaterial(FString Name, FString DynamicMaterialName); + + void CreateSlateColor(FString Name); + void SetSlateColor(FString Name, FLinearColor Color); + FSlateColor* GetSlateColor(FString Name); + + TSharedRef GetColor(FString Name); + +private: + FString ThemeDirectory; + + UPROPERTY() + TMap Materials; + + UPROPERTY() + TMap DynamicMaterials; + + TMap SlateBrushes; + TMap SlateColors; + TMap> Colors; + + //TArray Resources; +}; diff --git a/Plugins/DarkerNodes/Source/DarkerNodes/Private/Lib/ColorLib.h b/Plugins/DarkerNodes/Source/DarkerNodes/Private/Lib/ColorLib.h new file mode 100644 index 0000000..7c756f8 --- /dev/null +++ b/Plugins/DarkerNodes/Source/DarkerNodes/Private/Lib/ColorLib.h @@ -0,0 +1,123 @@ +/* Copyright (C) 2021 Hugo ATTAL - All Rights Reserved +* This plugin is downloadable from the Unreal Engine Marketplace +*/ + +#pragma once + +class FColorLib +{ +public: + static float PivotRGBtoXYZ(float N) + { + return (N > 0.04045f ? FMath::Pow((N + 0.055f) / 1.055f, 2.4f) : N / 12.92f) * 100.0f; + } + + static FVector RGBtoXYZ(FColor Color) + { + const FMatrix Matrix( + FPlane(0.4124564f, 0.2126729f, 0.0193339f, 0), + FPlane(0.3575761f, 0.7151522f, 0.1191920f, 0), + FPlane(0.1804375f, 0.0721750f, 0.9503041f, 0), + FPlane(0, 0, 0, 1)); + + FVector OutColor; + + OutColor.X = PivotRGBtoXYZ(Color.R / 255.0f); + OutColor.Y = PivotRGBtoXYZ(Color.G / 255.0f); + OutColor.Z = PivotRGBtoXYZ(Color.B / 255.0f); + + OutColor = Matrix.TransformVector(OutColor); + + OutColor.X = FMath::Clamp(OutColor.X, 0.0f, 100.0f); + OutColor.Y = FMath::Clamp(OutColor.Y, 0.0f, 100.0f); + OutColor.Z = FMath::Clamp(OutColor.Z, 0.0f, 100.0f); + + return OutColor; + } + + static float PivotXYZtoRGB(float N) + { + N /= 100.0f; + return (N > 0.003131f ? FMath::Pow(N, 1.0f / 2.4f) * 1.055f - 0.055f : N * 12.92f); + } + + static FColor XYZtoRGB(FVector Color) + { + const FMatrix Matrix( + FPlane(3.2404542f, -0.9692660f, 0.0556434f, 0), + FPlane(-1.5371385f, 1.8760108f, -0.2040259f, 0), + FPlane(-0.4985314f, 0.0415560f, 1.0572252f, 0), + FPlane(0, 0, 0, 1)); + + FVector OutColor(Color.X, Color.Y, Color.Z); + OutColor = Matrix.TransformVector(OutColor); + + OutColor.X = FMath::RoundToInt(PivotXYZtoRGB(OutColor.X) * 255.0f); + OutColor.Y = FMath::RoundToInt(PivotXYZtoRGB(OutColor.Y) * 255.0f); + OutColor.Z = FMath::RoundToInt(PivotXYZtoRGB(OutColor.Z) * 255.0f); + + OutColor.X = FMath::Clamp(OutColor.X, 0.0f, 255.0f); + OutColor.Y = FMath::Clamp(OutColor.Y, 0.0f, 255.0f); + OutColor.Z = FMath::Clamp(OutColor.Z, 0.0f, 255.0f); + + return FColor(OutColor.X, OutColor.Y, OutColor.Z); + } + + static float MathXYZtoLAB(float T) + { + const float D = 6.0f / 29.0f; + if (T > D * D * D) + { + return FMath::Pow(T, 1.0f / 3.0f); + } + return T / (3.0f * D * D) + 4.0f / 29.0f; + } + + static FVector XYZtoLAB(FVector Color) + { + const float Xn = 95.0489f; + const float Yn = 100.0f; + const float Zn = 108.884f; + + FVector OutColor; + + OutColor.X = 116.0f * MathXYZtoLAB(Color.Y / Yn) - 16.0f; + OutColor.Y = 500.0f * (MathXYZtoLAB(Color.X / Xn) - MathXYZtoLAB(Color.Y / Yn)); + OutColor.Z = 200.0f * (MathXYZtoLAB(Color.Y / Yn) - MathXYZtoLAB(Color.Z / Zn)); + + OutColor.X = FMath::Clamp(OutColor.X, 0.0f, 100.0f); + OutColor.Y = FMath::Clamp(OutColor.Y, -128.0f, 128.0f); + OutColor.Z = FMath::Clamp(OutColor.Z, -128.0f, 128.0f); + + return OutColor; + } + + static float MathLABtoXYZ(float T) + { + const float D = 6.0f / 29.0f; + if (T > D) + { + return T * T * T; + } + return 3.0f * D * D * (T - 4.0f / 29.0f); + } + + static FVector LABtoXYZ(FVector Color) + { + const float Xn = 95.0489f; + const float Yn = 100.0f; + const float Zn = 108.884f; + + FVector OutColor; + + OutColor.X = Xn * MathLABtoXYZ((Color.X + 16.0f) / 116.0f + Color.Y / 500.0f); + OutColor.Y = Yn * MathLABtoXYZ((Color.X + 16.0f) / 116.0f); + OutColor.Z = Zn * MathLABtoXYZ((Color.X + 16.0f) / 116.0f - Color.Z / 200.0f); + + OutColor.X = FMath::Clamp(OutColor.X, 0.0f, 100.0f); + OutColor.Y = FMath::Clamp(OutColor.Y, 0.0f, 100.0f); + OutColor.Z = FMath::Clamp(OutColor.Z, 0.0f, 100.0f); + + return OutColor; + } +}; diff --git a/Plugins/DarkerNodes/Source/DarkerNodes/Public/DarkerNodes.h b/Plugins/DarkerNodes/Source/DarkerNodes/Public/DarkerNodes.h new file mode 100644 index 0000000..d9e99c2 --- /dev/null +++ b/Plugins/DarkerNodes/Source/DarkerNodes/Public/DarkerNodes.h @@ -0,0 +1,22 @@ +/* Copyright (C) 2021 Hugo ATTAL - All Rights Reserved +* This plugin is downloadable from the Unreal Engine Marketplace +*/ + +#pragma once + +#include "CoreMinimal.h" +#include "Colorizer.h" + +class FDarkerNodesModule : public IModuleInterface +{ +public: + + /** IModuleInterface implementation */ + virtual void StartupModule() override; + virtual void ShutdownModule() override; + + void RestartEditor(); + +private: + FColorizer Colorizer; +}; diff --git a/Plugins/DarkerNodes/Source/DarkerNodes/Public/DarkerNodesSettings.h b/Plugins/DarkerNodes/Source/DarkerNodes/Public/DarkerNodesSettings.h new file mode 100644 index 0000000..ec6b1c1 --- /dev/null +++ b/Plugins/DarkerNodes/Source/DarkerNodes/Public/DarkerNodesSettings.h @@ -0,0 +1,424 @@ +/* Copyright (C) 2021 Hugo ATTAL - All Rights Reserved +* This plugin is downloadable from the Unreal Engine Marketplace +*/ + +#pragma once + +#include "Engine/DeveloperSettings.h" +#include "DarkerNodesSettings.generated.h" + +UENUM(BlueprintType) +enum class EHeaderStyle : uint8 +{ + Gradient, + Plain, + Outline +}; + +UENUM(BlueprintType) +enum class EThemeLight : uint8 +{ + Dark, + Darker, + Darkest +}; + +UENUM(BlueprintType) +enum class EThemeTemperature : uint8 +{ + Cooler, + Cool, + Normal, + Warm, + Warmer +}; + +UENUM(BlueprintType) +enum class EPrimaryColor : uint8 +{ + White, + Orange, + Cyan, + Red, + Purple, + Green +}; + +UENUM(BlueprintType) +enum class EButtonPadding : uint8 +{ + None, + Small, + Normal, + Big +}; + +UENUM(BlueprintType) +enum class EButtonBorder : uint8 +{ + None, + Dark, + Light +}; + +UENUM(BlueprintType) +enum class EFontFamily : uint8 +{ + BalsamiqSans UMETA(DisplayName = "BalsamiqSans (Handwritten)"), + Cannonade UMETA(DisplayName = "Cannonade (Sans Serif)"), + CaskaydiaCove UMETA(DisplayName = "Caskaydia Cove (Monospace)"), + EudoxusSans UMETA(DisplayName = "Exodus Sans (Sans Serif)"), + GolosUI UMETA(DisplayName = "Golos UI (Sans Serif)"), + Jua UMETA(DisplayName = "Jua (Handwritten)"), + Junction UMETA(DisplayName = "Junction (Sans Serif)"), + NewTelegraph UMETA(DisplayName = "New Telegraph (Slab Serif)"), + Roboto UMETA(DisplayName = "Roboto (Sans Serif)"), + XXIIAven UMETA(DisplayName = "XXII Aven (Sans Serif)") +}; + +UENUM(BlueprintType) +enum class EFontSize : uint8 +{ + Small, + Normal, + Big, + Bigger +}; + +UENUM(BlueprintType) +enum class EBlueprintVarNodeLine : uint8 +{ + Thin, + Thick +}; + +UENUM(BlueprintType) +enum class EBlueprintVarNodeStyle : uint8 +{ + DarkSolid, + LightSolid, + DarkGlass, + LightGlass +}; + +UENUM(BlueprintType) +enum class EIconStyle : uint8 +{ + Line, + Solid +}; + + +UCLASS(config = EditorPerProjectUserSettings, meta = (DisplayName = "Darker Nodes Plugin")) +class DARKERNODES_API UDarkerNodesSettings : public UDeveloperSettings +{ + GENERATED_BODY() + +public: + UDarkerNodesSettings() + { + CategoryName = TEXT("Plugins"); + SectionName = TEXT("Darker Nodes Plugin"); + } + + /* -----[ Activation ] ----- */ + + /* Activate or deactivate the whole plugin. Default: true */ + UPROPERTY(config, EditAnywhere, Category = "Activation") + bool MasterActivate = true; + + /* Use global settings across all your projects. When activated, it will load the global settings (overwriting this one). + If no global settings exists, it will create it based on this one. Future updates will then be saved to global settings. */ + UPROPERTY(config, EditAnywhere, Category = "Activation") + bool UseGlobalSettings = false; + + /* Force reload the global settings (if it was modified outside this instance for example). */ + UPROPERTY(config, EditAnywhere, Category = "Activation", meta = (EditCondition = "UseGlobalSettings")) + bool LoadGlobalSettings = false; + + /* Reload the default style (you must disable Master Activate first). */ + UPROPERTY(config, EditAnywhere, Category = "Activation", meta = (EditCondition = "!MasterActivate")) + bool ReloadDefaultStyle = false; + + /* This should fix missing elements by updating and saving the theme materials. */ + UPROPERTY(config, EditAnywhere, Category = "Activation", meta = (DisplayName = "Fix Missing Elements")) + bool UpdateMaterials = true; + + /* Internal value to fix elements on plugin update. */ + UPROPERTY(config) + FString PluginVersionUpdate = ""; + + /* -----[ Theme ] ----- */ + + /* Variations of the grey background (making it lighter or darker). Default: darker */ + UPROPERTY(config, EditAnywhere, Category = "Theme") + EThemeLight ThemeLight = EThemeLight::Darker; + + /* Use light theme and invert luminosity (warning: experimental feature) */ + UPROPERTY(config, EditAnywhere, Category = "Theme", meta = (DisplayName = "Light Theme (experimental)")) + bool LightTheme = false; + + /* Variations of the grey background (making it more orange or cyan). Default: normal */ + UPROPERTY(config, EditAnywhere, Category = "Theme") + EThemeTemperature ThemeTemperature = EThemeTemperature::Normal; + + /* Variations of the primary color. Default: orange */ + UPROPERTY(config, EditAnywhere, Category = "Theme") + EPrimaryColor PrimaryColor = EPrimaryColor::Orange; + + /* -----[ Buttons / Text fields ] ----- */ + + /* Padding of buttons and text fields. Default: normal */ + UPROPERTY(config, EditAnywhere, Category = "ButtonsAndTextFields") + EButtonPadding ButtonPadding = EButtonPadding::Normal; + + /* Radius of buttons and text fields. Default: 2px */ + UPROPERTY(config, EditAnywhere, Category = "ButtonsAndTextFields", meta = (ClampMin = "0")) + int32 ButtonRadius = 2; + + /* Add a border to buttons and text fields. Default: None */ + UPROPERTY(config, EditAnywhere, Category = "ButtonsAndTextFields") + EButtonBorder ButtonBorder = EButtonBorder::None; + + /* -----[ Fonts ] ----- */ + + /* Font to use in the editor (it won't work on all texts). Default: Normal */ + UPROPERTY(config, EditAnywhere, Category = "Fonts", meta = (DisplayName = "Font Size (experimental)")) + EFontSize FontSize = EFontSize::Normal; + + /* Font to use in the editor. Default: Roboto */ + UPROPERTY(config, EditAnywhere, Category = "Fonts") + EFontFamily FontFamily = EFontFamily::Roboto; + + /* Use a custom font for regular texts. Default: false */ + UPROPERTY(config, EditAnywhere, Category = "Fonts") + bool UseCustomRegularFont = false; + + /* Path to the regular TTF font. */ + UPROPERTY(config, EditAnywhere, Category = "Fonts", meta = (EditCondition = "UseCustomRegularFont", FilePathFilter="ttf")) + FFilePath RegularFont; + + /* Use a custom font for bold texts. Default: false */ + UPROPERTY(config, EditAnywhere, Category = "Fonts") + bool UseCustomBoldFont = false; + + /* Path to the bold TTF font. */ + UPROPERTY(config, EditAnywhere, Category = "Fonts", meta = (EditCondition = "UseCustomBoldFont", FilePathFilter="ttf")) + FFilePath BoldFont; + + /* Use a custom font for italic texts. Default: false */ + UPROPERTY(config, EditAnywhere, Category = "Fonts") + bool UseCustomItalicFont = false; + + /* Path to the italic TTF font. */ + UPROPERTY(config, EditAnywhere, Category = "Fonts", meta = (EditCondition = "UseCustomItalicFont", FilePathFilter="ttf")) + FFilePath ItalicFont; + + /* -----[ Blueprint ] ----- */ + + /* Activate or deactivate the blueprint theme. Default: true */ + UPROPERTY(config, EditAnywhere, Category = "Blueprint") + bool ActivateBlueprintTheme = true; + + /* Radius of regular nodes. Default: 2px */ + UPROPERTY(config, EditAnywhere, Category = "Blueprint", meta = (EditCondition = "ActivateBlueprintTheme", ClampMin = "0")) + int32 BlueprintRegularNodeRadius = 2; + + /* Radius of var nodes. Default: 2px */ + UPROPERTY(config, EditAnywhere, Category = "Blueprint", meta = (EditCondition = "ActivateBlueprintTheme", ClampMin = "0")) + int32 BlueprintVarNodeRadius = 2; + + /* Style of the VarNode top line. Default: Thin */ + UPROPERTY(config, EditAnywhere, Category = "Blueprint", meta = (EditCondition = "ActivateBlueprintTheme")) + EBlueprintVarNodeLine BlueprintVarNodeLine = EBlueprintVarNodeLine::Thin; + + /* Style of the VarNode background. Default: Dark Glass */ + UPROPERTY(config, EditAnywhere, Category = "Blueprint", meta = (EditCondition = "ActivateBlueprintTheme")) + EBlueprintVarNodeStyle BlueprintVarNodeStyle = EBlueprintVarNodeStyle::DarkGlass; + + /* Opacity of blueprint nodes header. Default: 0.25 */ + UPROPERTY(config, EditAnywhere, Category = "Blueprint", meta = (ClampMin = "0", ClampMax="1")) + float BlueprintNodeHeaderOpacity = 0.25f; + + /* Saturation of blueprint nodes header. Default: 1.0 */ + UPROPERTY(config, EditAnywhere, Category = "Blueprint", meta = (ClampMin = "0", ClampMax="1")) + float BlueprintNodeHeaderSaturation = 1.0f; + + /* Add a padding to make nodes match the grid on the top left corner. Default: false */ + UPROPERTY(config, EditAnywhere, Category = "Blueprint") + bool ExtendNodes = false; + + /* Disable the blueprint grid. Default: false */ + UPROPERTY(config, EditAnywhere, Category = "Blueprint") + bool DisableBlueprintGrid = false; + + /* Disable the UMG grid. Default: false */ + UPROPERTY(config, EditAnywhere, Category = "Blueprint", meta = (EditCondition = "DisableBlueprintGrid")) + bool DisableUMGGrid = false; + + /* Opacity of the origin axis of the background grid. Default: 0.5 */ + UPROPERTY(config, EditAnywhere, Category = "Blueprint", meta = (ClampMin = "0", ClampMax="1")) + float OriginAxisOpacity = 0.5f; + + /* -----[ Miscellaneous ] ----- */ + + /* Use the dark scrollbar instead of the white one. Default: true */ + UPROPERTY(config, EditAnywhere, Category = "Miscellaneous") + bool UseCustomScrollbar = true; + + /* Use the custom icons of Darker Nodes. Default: true */ + UPROPERTY(config, EditAnywhere, Category = "Miscellaneous") + bool UseCustomIcons = true; + + /* Change the style of the custom icons. Default: Line */ + UPROPERTY(config, EditAnywhere, Category = "Miscellaneous", meta = (EditCondition = "UseCustomIcons")) + EIconStyle IconStyle = EIconStyle::Line; + + /* Make icons colored by group. Default: true */ + UPROPERTY(config, EditAnywhere, Category = "Miscellaneous", meta = (EditCondition = "UseCustomIcons")) + bool UseIconColorization = false; + + /* Use the custom panels of Darker Nodes. Default: true */ + UPROPERTY(config, EditAnywhere, Category = "Miscellaneous") + bool UseCustomPanels = true; + + /* Use the custom buttons, text fields and checkboxes of Darker Nodes. Default: true */ + UPROPERTY(config, EditAnywhere, Category = "Miscellaneous") + bool UseCustomButton = true; + + /* -----[ Customization ] ----- */ + + /* When "Use [Type] Customization" is unticked, overwrite the customized colors with the current theme colors. Default: true */ + UPROPERTY(config, EditAnywhere, Category = "Customization") + bool OverwriteColors = true; + + /* Customize the backgrounds more in-depth. Default: false */ + UPROPERTY(config, EditAnywhere, Category = "Customization|Background") + bool UseGreyCustomization = false; + + /* Dark background of the theme. Default: RGB(20,20,20) */ + UPROPERTY(config, EditAnywhere, Category = "Customization|Background", meta = (EditCondition = "UseGreyCustomization")) + FColor GreyDark = FColor(20, 20, 20); + + /* Base background of the theme. Default: RGB(40,40,40) */ + UPROPERTY(config, EditAnywhere, Category = "Customization|Background", meta = (EditCondition = "UseGreyCustomization")) + FColor GreyBase = FColor(40, 40, 40); + + /* Light background of the theme. Default: RGB(80,80,80) */ + UPROPERTY(config, EditAnywhere, Category = "Customization|Background", meta = (EditCondition = "UseGreyCustomization")) + FColor GreyLight = FColor(80, 80, 80); + + /* Customize the colors more in-depth. Default: false */ + UPROPERTY(config, EditAnywhere, Category = "Customization|Color") + bool UseColorCustomization = false; + + /* Hover color on dark background. Default: RGB(229,110,23) */ + UPROPERTY(config, EditAnywhere, Category = "Customization|Color", meta = (EditCondition = "UseColorCustomization")) + FColor CustomPrimaryColor = FColor(229, 110, 23); + + /* Text color of the theme. Default: RGB(200,200,200) */ + UPROPERTY(config, EditAnywhere, Category = "Customization|Color", meta = (EditCondition = "UseColorCustomization")) + FColor TextColor = FColor(200, 200, 200); + + /* Color of the scrollbar. Default: RGB(20,20,20) */ + UPROPERTY(config, EditAnywhere, Category = "Customization|Color", meta = (EditCondition = "UseColorCustomization")) + FColor ScrollbarColor = FColor(20, 20, 20); + + /* Customize the colors more in-depth. Default: false */ + UPROPERTY(config, EditAnywhere, Category = "Customization|Windows") + bool UseWindowCustomization = false; + + /* Outline color of the main editor window. Default: RGB(40,40,40) */ + UPROPERTY(config, EditAnywhere, Category = "Customization|Windows", meta = (EditCondition = "UseWindowCustomization")) + FColor MainWindowColor = FColor(40, 40, 40); + + /* Outline color of child editor windows. Default: RGB(40,40,40) */ + UPROPERTY(config, EditAnywhere, Category = "Customization|Windows", meta = (EditCondition = "UseWindowCustomization")) + FColor ChildWindowColor = FColor(40, 40, 40); + + /* Customize the colors of Blueprint graphs. Default: false */ + UPROPERTY(config, EditAnywhere, Category = "Customization|Blueprint") + bool UseBlueprintColorCustomization = false; + + /* Color for grid lines in Blueprint graphs and UMG editor. */ + UPROPERTY(config, EditAnywhere, Category = "Customization|Blueprint", meta = (EditCondition = "UseBlueprintColorCustomization")) + FColor GridLineColor; + + /* Color for grid rules in Blueprint graphs and UMG editor. */ + UPROPERTY(config, EditAnywhere, Category = "Customization|Blueprint", meta = (EditCondition = "UseBlueprintColorCustomization")) + FColor GridRuleColor; + + /* Color for grid center in Blueprint graphs and UMG editor. */ + UPROPERTY(config, EditAnywhere, Category = "Customization|Blueprint", meta = (EditCondition = "UseBlueprintColorCustomization")) + FColor GridCenterColor; + + /* Background of regular Blueprint nodes. */ + UPROPERTY(config, EditAnywhere, Category = "Customization|Blueprint", meta = (EditCondition = "UseBlueprintColorCustomization")) + FColor RegularNodeBackground; + + /* Border of regular Blueprint nodes. */ + UPROPERTY(config, EditAnywhere, Category = "Customization|Blueprint", meta = (EditCondition = "UseBlueprintColorCustomization")) + FColor RegularNodeBorder; + + /* Background of var Blueprint nodes. */ + UPROPERTY(config, EditAnywhere, Category = "Customization|Blueprint", meta = (EditCondition = "UseBlueprintColorCustomization")) + FColor VarNodeBackground; + + /* Border of var Blueprint nodes. */ + UPROPERTY(config, EditAnywhere, Category = "Customization|Blueprint", meta = (EditCondition = "UseBlueprintColorCustomization")) + FColor VarNodeBorder; + + /* Customize the colors more in-depth. Default: false */ + UPROPERTY(config, EditAnywhere, Category = "Customization|Buttons") + bool UseButtonColorCustomization = false; + + /* Color for buttons border. Default: RGB(20,20,20) */ + UPROPERTY(config, EditAnywhere, Category = "Customization|Buttons", meta = (EditCondition = "UseButtonColorCustomization")) + FColor ButtonBorderColor = FColor(20, 20, 20); + + /* Color for primary buttons. Default: RGB(0,96,178) */ + UPROPERTY(config, EditAnywhere, Category = "Customization|Buttons", meta = (EditCondition = "UseButtonColorCustomization")) + FColor ButtonPrimary = FColor(0, 96, 178); + + /* Color for success buttons. Default: RGB(58,161,17) */ + UPROPERTY(config, EditAnywhere, Category = "Customization|Buttons", meta = (EditCondition = "UseButtonColorCustomization")) + FColor ButtonSuccess = FColor(58, 161, 17); + + /* Color for info buttons. Default: RGB(0,96,178) */ + UPROPERTY(config, EditAnywhere, Category = "Customization|Buttons", meta = (EditCondition = "UseButtonColorCustomization")) + FColor ButtonInfo = FColor(0, 96, 178); + + /* Color for warning buttons. Default: RGB(223,179,0) */ + UPROPERTY(config, EditAnywhere, Category = "Customization|Buttons", meta = (EditCondition = "UseButtonColorCustomization")) + FColor ButtonWarning = FColor(223, 179, 0); + + /* Color for danger buttons. Default: RGB(178,0,0) */ + UPROPERTY(config, EditAnywhere, Category = "Customization|Buttons", meta = (EditCondition = "UseButtonColorCustomization")) + FColor ButtonDanger = FColor(178, 0, 0); + + /* Force texture resources reload. */ + UPROPERTY(config, EditAnywhere, Category = "Debug") + bool ReloadTextureResources = false; + + virtual FName GetContainerName() const override + { + return "Editor"; + } + +#if ENGINE_MAJOR_VERSION == 4 && ENGINE_MINOR_VERSION <= 25 + DECLARE_EVENT_OneParam(UDarkerNodesSettings, FSettingChangedEvent, FName); + FSettingChangedEvent& OnSettingChanged( ) { return SettingChangedEvent; } + + virtual void PostEditChangeProperty(struct FPropertyChangedEvent& PropertyChangedEvent) override + { + Super::PostEditChangeProperty(PropertyChangedEvent); + + const FName Name = (PropertyChangedEvent.Property != nullptr) ? PropertyChangedEvent.Property->GetFName() : NAME_None; + SettingChangedEvent.Broadcast(Name); + } + + private: + + FSettingChangedEvent SettingChangedEvent; +#endif +}; diff --git a/Plugins/EasyFileDialog/EasyFileDialog.uplugin b/Plugins/EasyFileDialog/EasyFileDialog.uplugin new file mode 100644 index 0000000..4ef06a6 --- /dev/null +++ b/Plugins/EasyFileDialog/EasyFileDialog.uplugin @@ -0,0 +1,26 @@ +{ + "FileVersion": 3, + "Version": 1, + "VersionName": "1.0", + "FriendlyName": "Easy File Dialog", + "Description": "An easy file dialog system", + "Category": "File", + "CreatedBy": "Firefly Studio", + "CreatedByURL": "http://www.fire-fly.studio", + "DocsURL": "", + "MarketplaceURL": "com.epicgames.launcher://ue/marketplace/product/bcf64fe2e00c48189d8385a9c39b6e61", + "SupportURL": "http://www.fire-fly.studio", + "EngineVersion": "4.27.0", + "CanContainContent": true, + "Installed": true, + "Modules": [ + { + "Name": "EasyFileDialog", + "Type": "Runtime", + "LoadingPhase": "PreLoadingScreen", + "WhitelistPlatforms": [ + "Win64" + ] + } + ] +} \ No newline at end of file diff --git a/Plugins/EasyFileDialog/Resources/Icon128.png b/Plugins/EasyFileDialog/Resources/Icon128.png new file mode 100644 index 0000000..bc8b833 --- /dev/null +++ b/Plugins/EasyFileDialog/Resources/Icon128.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:37080ae25840a248f1ebc278758608746fae77dace0e412a4b69b779ae09a3b9 +size 5154 diff --git a/Plugins/EasyFileDialog/Source/EasyFileDialog/EasyFileDialog.Build.cs b/Plugins/EasyFileDialog/Source/EasyFileDialog/EasyFileDialog.Build.cs new file mode 100644 index 0000000..4855374 --- /dev/null +++ b/Plugins/EasyFileDialog/Source/EasyFileDialog/EasyFileDialog.Build.cs @@ -0,0 +1,53 @@ +// Copyright 2017-2020 Firefly Studio. All Rights Reserved. + +using UnrealBuildTool; + +public class EasyFileDialog : ModuleRules +{ + public EasyFileDialog(ReadOnlyTargetRules Target) : base(Target) + { + PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs; + + PublicIncludePaths.AddRange( + new string[] { + // ... add public include paths required here ... + } + ); + + + PrivateIncludePaths.AddRange( + new string[] { + // ... add other private include paths required here ... + } + ); + + + PublicDependencyModuleNames.AddRange( + new string[] + { + "Core", + // ... add other public dependencies that you statically link with here ... + } + ); + + + PrivateDependencyModuleNames.AddRange( + new string[] + { + "CoreUObject", + "Engine", + "Slate", + "SlateCore", + // ... add private dependencies that you statically link with here ... + } + ); + + + DynamicallyLoadedModuleNames.AddRange( + new string[] + { + // ... add any modules that your module loads dynamically here ... + } + ); + } +} diff --git a/Plugins/EasyFileDialog/Source/EasyFileDialog/Private/EFDCore.cpp b/Plugins/EasyFileDialog/Source/EasyFileDialog/Private/EFDCore.cpp new file mode 100644 index 0000000..0d71185 --- /dev/null +++ b/Plugins/EasyFileDialog/Source/EasyFileDialog/Private/EFDCore.cpp @@ -0,0 +1,266 @@ +// Copyright 2017-2020 Firefly Studio. All Rights Reserved. + + +#include "EFDCore.h" + +#include "shlobj.h" + +#include +#include +#include + + +#define MAX_FILETYPES_STR 4096 +#define MAX_FILENAME_STR 65536 // This buffer has to be big enough to contain the names of all the selected files as well as the null characters between them and the null character at the end + +bool EFDCore::OpenFileDialogCore(const FString& DialogTitle, const FString& DefaultPath, const FString& DefaultFile, const FString& FileTypes, uint32 Flags, TArray< FString >& OutFilenames) +{ + // Calling the FileDialogShared function using save parameter with false. + int OutFilterIndex=0; + return FileDialogShared(false, nullptr, DialogTitle, DefaultPath, DefaultFile, FileTypes, Flags, OutFilenames,OutFilterIndex); +} + +bool EFDCore::SaveFileDialogCore(const FString& DialogTitle, const FString& DefaultPath, const FString& DefaultFile, const FString& FileTypes, uint32 Flags, TArray< FString >& OutFilenames) +{ + // Calling the FileDialogShared function using save parameter. + int OutFilterIndex = 0; + return FileDialogShared(true, nullptr, DialogTitle, DefaultPath, DefaultFile, FileTypes, Flags, OutFilenames, OutFilterIndex); +} + +bool EFDCore::OpenFolderDialogCore(const FString& DialogTitle, const FString& DefaultPath, FString& OutFoldername) +{ + // Calling the main open folder dialog function. + return OpenFolderDialogInner(NULL, DialogTitle, DefaultPath, OutFoldername); +} + +bool EFDCore::FileDialogShared(bool bSave, const void* ParentWindowHandle, const FString& DialogTitle, const FString& DefaultPath, const FString& DefaultFile, const FString& FileTypes, uint32 Flags, TArray& OutFilenames, int32& OutFilterIndex) +{ +#pragma region Windows + //FScopedSystemModalMode SystemModalScope; +#if PLATFORM_WINDOWS + WCHAR Filename[MAX_FILENAME_STR]; + FCString::Strcpy(Filename, MAX_FILENAME_STR, *(DefaultFile.Replace(TEXT("/"), TEXT("\\")))); + + // Convert the forward slashes in the path name to backslashes, otherwise it'll be ignored as invalid and use whatever is cached in the registry + WCHAR Pathname[MAX_FILENAME_STR]; + FCString::Strcpy(Pathname, MAX_FILENAME_STR, *(FPaths::ConvertRelativePathToFull(DefaultPath).Replace(TEXT("/"), TEXT("\\")))); + + // Convert the "|" delimited list of filetypes to NULL delimited then add a second NULL character to indicate the end of the list + WCHAR FileTypeStr[MAX_FILETYPES_STR]; + WCHAR* FileTypesPtr = NULL; + const int32 FileTypesLen = FileTypes.Len(); + + // Nicely formatted file types for lookup later and suitable to append to filenames without extensions + TArray CleanExtensionList; + + // The strings must be in pairs for windows. + // It is formatted as follows: Pair1String1|Pair1String2|Pair2String1|Pair2String2 + // where the second string in the pair is the extension. To get the clean extensions we only care about the second string in the pair + TArray UnformattedExtensions; + FileTypes.ParseIntoArray(UnformattedExtensions, TEXT("|"), true); + for (int32 ExtensionIndex = 1; ExtensionIndex < UnformattedExtensions.Num(); ExtensionIndex += 2) + { + const FString& Extension = UnformattedExtensions[ExtensionIndex]; + // Assume the user typed in an extension or doesnt want one when using the *.* extension. We can't determine what extension they wan't in that case + if (Extension != TEXT("*.*")) + { + // Add to the clean extension list, first removing the * wildcard from the extension + int32 WildCardIndex = Extension.Find(TEXT("*")); + CleanExtensionList.Add(WildCardIndex != INDEX_NONE ? Extension.RightChop(WildCardIndex + 1) : Extension); + } + } + + if (FileTypesLen > 0 && FileTypesLen - 1 < MAX_FILETYPES_STR) + { + FileTypesPtr = FileTypeStr; + FCString::Strcpy(FileTypeStr, MAX_FILETYPES_STR, *FileTypes); + + TCHAR* Pos = FileTypeStr; + while (Pos[0] != 0) + { + if (Pos[0] == '|') + { + Pos[0] = 0; + } + + Pos++; + } + + // Add two trailing NULL characters to indicate the end of the list + FileTypeStr[FileTypesLen] = 0; + FileTypeStr[FileTypesLen + 1] = 0; + } + + OPENFILENAME ofn; + FMemory::Memzero(&ofn, sizeof(OPENFILENAME)); + + ofn.lStructSize = sizeof(OPENFILENAME); + ofn.hwndOwner = (HWND)ParentWindowHandle; + ofn.lpstrFilter = FileTypesPtr; + ofn.nFilterIndex = 1; + ofn.lpstrFile = Filename; + ofn.nMaxFile = MAX_FILENAME_STR; + ofn.lpstrInitialDir = Pathname; + ofn.lpstrTitle = *DialogTitle; + if (FileTypesLen > 0) + { + ofn.lpstrDefExt = &FileTypeStr[0]; + } + + ofn.Flags = OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_EXPLORER; + + if (bSave) + { + ofn.Flags |= OFN_CREATEPROMPT | OFN_OVERWRITEPROMPT | OFN_NOVALIDATE; + } + else + { + ofn.Flags |= OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; + } + + if (Flags & EEasyFileDialogFlags::Multiple) + { + ofn.Flags |= OFN_ALLOWMULTISELECT; + } + + bool bSuccess; + if (bSave) + { + bSuccess = !!::GetSaveFileName(&ofn); + } + else + { + bSuccess = !!::GetOpenFileName(&ofn); + } + + if (bSuccess) + { + // GetOpenFileName/GetSaveFileName changes the CWD on success. Change it back immediately. + //FPlatformProcess::SetCurrentWorkingDirectoryToBaseDir(); + + if (Flags & EEasyFileDialogFlags::Multiple) + { + // When selecting multiple files, the returned string is a NULL delimited list + // where the first element is the directory and all remaining elements are filenames. + // There is an extra NULL character to indicate the end of the list. + FString DirectoryOrSingleFileName = FString(Filename); + TCHAR* Pos = Filename + DirectoryOrSingleFileName.Len() + 1; + + if (Pos[0] == 0) + { + // One item selected. There was an extra trailing NULL character. + OutFilenames.Add(DirectoryOrSingleFileName); + } + else + { + // Multiple items selected. Keep adding filenames until two NULL characters. + FString SelectedFile; + do + { + SelectedFile = FString(Pos); + new(OutFilenames) FString(DirectoryOrSingleFileName / SelectedFile); + Pos += SelectedFile.Len() + 1; + } while (Pos[0] != 0); + } + } + else + { + new(OutFilenames) FString(Filename); + } + + // The index of the filter in OPENFILENAME starts at 1. + OutFilterIndex = ofn.nFilterIndex - 1; + + // Get the extension to add to the filename (if one doesnt already exist) + FString Extension = CleanExtensionList.IsValidIndex(OutFilterIndex) ? CleanExtensionList[OutFilterIndex] : TEXT(""); + + // Make sure all filenames gathered have their paths normalized and proper extensions added + for (auto OutFilenameIt = OutFilenames.CreateIterator(); OutFilenameIt; ++OutFilenameIt) + { + FString& OutFilename = *OutFilenameIt; + + OutFilename = IFileManager::Get().ConvertToRelativePath(*OutFilename); + + if (FPaths::GetExtension(OutFilename).IsEmpty() && !Extension.IsEmpty()) + { + // filename does not have an extension. Add an extension based on the filter that the user chose in the dialog + OutFilename += Extension; + } + + FPaths::NormalizeFilename(OutFilename); + } + } + else + { + uint32 Error = ::CommDlgExtendedError(); + if (Error != ERROR_SUCCESS) + { + //UE_LOG(LogDesktopPlatform, Warning, TEXT("Error reading results of file dialog. Error: 0x%04X"), Error); + } + } + + return bSuccess; +#endif +#pragma endregion + +#pragma region LINUX +#if PLATFORM_LINUX + return false; +#endif +#pragma endregion + return false; +} + +bool EFDCore:: OpenFolderDialogInner(const void* ParentWindowHandle, const FString& DialogTitle, const FString& DefaultPath, FString& OutFolderName) +{ + //FScopedSystemModalMode SystemModalScope; + + bool bSuccess = false; + + TComPtr FileDialog; + if (SUCCEEDED(::CoCreateInstance(CLSID_FileOpenDialog, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&FileDialog)))) + { + // Set this up as a folder picker + { + DWORD dwFlags = 0; + FileDialog->GetOptions(&dwFlags); + FileDialog->SetOptions(dwFlags | FOS_PICKFOLDERS); + } + + // Set up common settings + FileDialog->SetTitle(*DialogTitle); + if (!DefaultPath.IsEmpty()) + { + // SHCreateItemFromParsingName requires the given path be absolute and use \ rather than / as our normalized paths do + FString DefaultWindowsPath = FPaths::ConvertRelativePathToFull(DefaultPath); + DefaultWindowsPath.ReplaceInline(TEXT("/"), TEXT("\\"), ESearchCase::CaseSensitive); + + TComPtr DefaultPathItem; + if (SUCCEEDED(::SHCreateItemFromParsingName(*DefaultWindowsPath, nullptr, IID_PPV_ARGS(&DefaultPathItem)))) + { + FileDialog->SetFolder(DefaultPathItem); + } + } + + // Show the picker + if (SUCCEEDED(FileDialog->Show((HWND)ParentWindowHandle))) + { + TComPtr Result; + if (SUCCEEDED(FileDialog->GetResult(&Result))) + { + PWSTR pFilePath = nullptr; + if (SUCCEEDED(Result->GetDisplayName(SIGDN_FILESYSPATH, &pFilePath))) + { + bSuccess = true; + + OutFolderName = pFilePath; + FPaths::NormalizeDirectoryName(OutFolderName); + + ::CoTaskMemFree(pFilePath); + } + } + } + } + + return bSuccess; +} \ No newline at end of file diff --git a/Plugins/EasyFileDialog/Source/EasyFileDialog/Private/EFDFunctionLibrary.cpp b/Plugins/EasyFileDialog/Source/EasyFileDialog/Private/EFDFunctionLibrary.cpp new file mode 100644 index 0000000..dc3c019 --- /dev/null +++ b/Plugins/EasyFileDialog/Source/EasyFileDialog/Private/EFDFunctionLibrary.cpp @@ -0,0 +1,40 @@ +// Copyright 2017-2020 Firefly Studio. All Rights Reserved. + + +#include "EFDFunctionLibrary.h" + + +bool UEFDFunctionLibrary::OpenFileDialog(const FString& DialogTitle, const FString& DefaultPath, const FString& DefaultFile, const FString& FileTypes, EEasyFileDialogFlags Flags, TArray< FString >& OutFilenames) +{ + // Calling the core class function for open file dialog + return EFDCore::OpenFileDialogCore(DialogTitle, DefaultPath, DefaultFile, FileTypes, Flags, OutFilenames); +} + + + +bool UEFDFunctionLibrary::SaveFileDialog(const FString& DialogTitle, const FString& DefaultPath, const FString& DefaultFile, const FString& FileTypeDescription, const FString& FileType, EEasyFileDialogFlags Flags, TArray& OutFilenames) +{ + // Saving the file type and file type description to append and Removing . if user provides any + FString TempFileType = FileType.Replace(TEXT("."), TEXT("")); + + FString TempFileTypeDescription = FileTypeDescription; + + // Setting description if user did not provide any + if (TempFileTypeDescription.IsEmpty()) + { + TempFileTypeDescription = TempFileType.ToUpper(); + } + + // Creating final file types by appending FileTypeDescription and FileType + const FString FinalFileType = TempFileTypeDescription.Append("|").Append(".").Append(TempFileType); + + // Calling the core class function for save file dialog + return EFDCore::SaveFileDialogCore(DialogTitle, DefaultPath, DefaultFile, FinalFileType, Flags, OutFilenames); +} + + +bool UEFDFunctionLibrary::OpenFolderDialog(const FString& DialogTitle, const FString& DefaultPath, FString& OutFolderName) +{ + // Calling the core class function for open folder dialog + return EFDCore::OpenFolderDialogCore(DialogTitle, DefaultPath, OutFolderName); +} \ No newline at end of file diff --git a/Plugins/EasyFileDialog/Source/EasyFileDialog/Private/EasyFileDialog.cpp b/Plugins/EasyFileDialog/Source/EasyFileDialog/Private/EasyFileDialog.cpp new file mode 100644 index 0000000..ceecbaa --- /dev/null +++ b/Plugins/EasyFileDialog/Source/EasyFileDialog/Private/EasyFileDialog.cpp @@ -0,0 +1,22 @@ +// Copyright 2017-2020 Firefly Studio. All Rights Reserved. + +#include "EasyFileDialog.h" + +#define LOCTEXT_NAMESPACE "FEasyFileDialogModule" + +void FEasyFileDialogModule::StartupModule() +{ + // This code will execute after your module is loaded into memory; the exact timing is specified in the .uplugin file per-module + +} + +void FEasyFileDialogModule::ShutdownModule() +{ + // This function may be called during shutdown to clean up your module. For modules that support dynamic reloading, + // we call this function before unloading the module. + +} + +#undef LOCTEXT_NAMESPACE + +IMPLEMENT_MODULE(FEasyFileDialogModule, EasyFileDialog) \ No newline at end of file diff --git a/Plugins/EasyFileDialog/Source/EasyFileDialog/Private/EasyFileDialogBPLibrary.cpp b/Plugins/EasyFileDialog/Source/EasyFileDialog/Private/EasyFileDialogBPLibrary.cpp new file mode 100644 index 0000000..77d36bb --- /dev/null +++ b/Plugins/EasyFileDialog/Source/EasyFileDialog/Private/EasyFileDialogBPLibrary.cpp @@ -0,0 +1,16 @@ +// Copyright 2017-2020 Firefly Studio. All Rights Reserved. + +#include "EasyFileDialogBPLibrary.h" +#include "EasyFileDialog.h" + +UEasyFileDialogBPLibrary::UEasyFileDialogBPLibrary(const FObjectInitializer& ObjectInitializer) +: Super(ObjectInitializer) +{ + +} + +float UEasyFileDialogBPLibrary::EasyFileDialogSampleFunction(float Param) +{ + return -1; +} + diff --git a/Plugins/EasyFileDialog/Source/EasyFileDialog/Public/EFDCore.h b/Plugins/EasyFileDialog/Source/EasyFileDialog/Public/EFDCore.h new file mode 100644 index 0000000..9509952 --- /dev/null +++ b/Plugins/EasyFileDialog/Source/EasyFileDialog/Public/EFDCore.h @@ -0,0 +1,40 @@ +// Copyright 2017-2020 Firefly Studio. All Rights Reserved. + +#pragma once +#pragma warning(disable : 4668) + +// Flag Enum for saving multiple or single file's +UENUM(BlueprintType) +enum EEasyFileDialogFlags +{ + Single = 0x00, // No flags + Multiple = 0x01 // Allow multiple file selections +}; + +#include "CoreMinimal.h" + +/** + * + */ +class EASYFILEDIALOG_API EFDCore +{ +public: + + // Open file dialog core, called from the blueprint function library + static bool OpenFileDialogCore(const FString& DialogTitle, const FString& DefaultPath, const FString& DefaultFile, const FString& FileTypes, uint32 Flags, TArray< FString >& OutFilenames); + + // Save file dialog core, called from the blueprint function library + static bool SaveFileDialogCore(const FString& DialogTitle, const FString& DefaultPath, const FString& DefaultFile, const FString& FileTypes, uint32 Flags, TArray< FString >& OutFilenames); + + // Open folder dialog core, called from the blueprint function library + static bool OpenFolderDialogCore(const FString& DialogTitle, const FString& DefaultPath, FString& OutFolderName); + + + +private: + // Both open file dialog and save file dialog using this same function with different save parameter. + static bool FileDialogShared(bool bSave, const void* ParentWindowHandle, const FString& DialogTitle, const FString& DefaultPath, const FString& DefaultFile, const FString& FileTypes, uint32 Flags, TArray& OutFilenames, int32& OutFilterIndex); + + // The main Open folder dialog functionalities + static bool OpenFolderDialogInner(const void* ParentWindowHandle, const FString& DialogTitle, const FString& DefaultPath, FString& OutFolderName); +}; diff --git a/Plugins/EasyFileDialog/Source/EasyFileDialog/Public/EFDFunctionLibrary.h b/Plugins/EasyFileDialog/Source/EasyFileDialog/Public/EFDFunctionLibrary.h new file mode 100644 index 0000000..a99b9a2 --- /dev/null +++ b/Plugins/EasyFileDialog/Source/EasyFileDialog/Public/EFDFunctionLibrary.h @@ -0,0 +1,30 @@ +// Copyright 2017-2020 Firefly Studio. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "Kismet/BlueprintFunctionLibrary.h" +#include "EFDCore.h" +#include "EFDFunctionLibrary.generated.h" + +/** + * + */ +UCLASS() +class EASYFILEDIALOG_API UEFDFunctionLibrary : public UBlueprintFunctionLibrary +{ + GENERATED_BODY() + + // Open File Dialog + UFUNCTION(BlueprintCallable, Category = "EasyFileDialog") + static bool OpenFileDialog(const FString& DialogTitle, const FString& DefaultPath, const FString& DefaultFile, const FString& FileTypes, EEasyFileDialogFlags Flags, TArray< FString >& OutFilenames); + + // Save File Dialog + UFUNCTION(BlueprintCallable, Category = "EasyFileDialog") + static bool SaveFileDialog(const FString& DialogTitle, const FString& DefaultPath, const FString& DefaultFile, const FString& FileTypeDescription, const FString& FileType, EEasyFileDialogFlags Flags, TArray< FString >& OutFilenames); + + // Open Folder Dialog + UFUNCTION(BlueprintCallable, Category = "EasyFileDialog") + static bool OpenFolderDialog(const FString& DialogTitle, const FString& DefaultPath, FString& OutFolderName); + +}; diff --git a/Plugins/EasyFileDialog/Source/EasyFileDialog/Public/EasyFileDialog.h b/Plugins/EasyFileDialog/Source/EasyFileDialog/Public/EasyFileDialog.h new file mode 100644 index 0000000..8310a31 --- /dev/null +++ b/Plugins/EasyFileDialog/Source/EasyFileDialog/Public/EasyFileDialog.h @@ -0,0 +1,14 @@ +// Copyright 2017-2020 Firefly Studio. All Rights Reserved. + +#pragma once + +#include "Modules/ModuleManager.h" + +class FEasyFileDialogModule : public IModuleInterface +{ +public: + + /** IModuleInterface implementation */ + virtual void StartupModule() override; + virtual void ShutdownModule() override; +}; diff --git a/Plugins/EasyFileDialog/Source/EasyFileDialog/Public/EasyFileDialogBPLibrary.h b/Plugins/EasyFileDialog/Source/EasyFileDialog/Public/EasyFileDialogBPLibrary.h new file mode 100644 index 0000000..a45a836 --- /dev/null +++ b/Plugins/EasyFileDialog/Source/EasyFileDialog/Public/EasyFileDialogBPLibrary.h @@ -0,0 +1,32 @@ +// Copyright 2017-2020 Firefly Studio. All Rights Reserved. + +#pragma once + +#include "Kismet/BlueprintFunctionLibrary.h" +#include "EasyFileDialogBPLibrary.generated.h" + +/* +* Function library class. +* Each function in it is expected to be static and represents blueprint node that can be called in any blueprint. +* +* When declaring function you can define metadata for the node. Key function specifiers will be BlueprintPure and BlueprintCallable. +* BlueprintPure - means the function does not affect the owning object in any way and thus creates a node without Exec pins. +* BlueprintCallable - makes a function which can be executed in Blueprints - Thus it has Exec pins. +* DisplayName - full name of the node, shown when you mouse over the node and in the blueprint drop down menu. +* Its lets you name the node using characters not allowed in C++ function names. +* CompactNodeTitle - the word(s) that appear on the node. +* Keywords - the list of keywords that helps you to find node when you search for it using Blueprint drop-down menu. +* Good example is "Print String" node which you can find also by using keyword "log". +* Category - the category your node will be under in the Blueprint drop-down menu. +* +* For more info on custom blueprint nodes visit documentation: +* https://wiki.unrealengine.com/Custom_Blueprint_Node_Creation +*/ +UCLASS() +class UEasyFileDialogBPLibrary : public UBlueprintFunctionLibrary +{ + GENERATED_UCLASS_BODY() + + UFUNCTION(BlueprintCallable, meta = (DisplayName = "Execute Sample function", Keywords = "EasyFileDialog sample test testing"), Category = "EasyFileDialogTesting") + static float EasyFileDialogSampleFunction(float Param); +}; diff --git a/Plugins/ElectronicNodes/Config/FilterPlugin.ini b/Plugins/ElectronicNodes/Config/FilterPlugin.ini new file mode 100644 index 0000000..68c0bde --- /dev/null +++ b/Plugins/ElectronicNodes/Config/FilterPlugin.ini @@ -0,0 +1,4 @@ +[FilterPlugin] +/Config/ +/Resources/ +/Source/ \ No newline at end of file diff --git a/Plugins/ElectronicNodes/ElectronicNodes.uplugin b/Plugins/ElectronicNodes/ElectronicNodes.uplugin new file mode 100644 index 0000000..2135037 --- /dev/null +++ b/Plugins/ElectronicNodes/ElectronicNodes.uplugin @@ -0,0 +1,35 @@ +{ + "FileVersion": 3, + "Version": 1, + "VersionName": "3.5", + "FriendlyName": "Electronic Nodes", + "Description": "Improve the wire style of blueprints and materials editors.", + "Category": "Editor", + "CreatedBy": "Hugo Attal", + "CreatedByURL": "https://twitter.com/HugoAttal", + "DocsURL": "https://github.com/TheHerobrine/ElectronicNodes", + "MarketplaceURL": "com.epicgames.launcher://ue/marketplace/content/5cb2a394d0c04e73891762be4cbd7216", + "SupportURL": "https://forums.unrealengine.com/unreal-engine/marketplace/1647213-electronic-nodes-wiring-style-for-blueprints-and-materials-editors", + "EngineVersion": "4.27.0", + "CanContainContent": false, + "Installed": true, + "Modules": [ + { + "Name": "ElectronicNodes", + "Type": "Editor", + "LoadingPhase": "Default", + "WhitelistPlatforms": [ + "Win64", + "Win32", + "Mac", + "Linux" + ] + } + ], + "Plugins": [ + { + "Name": "ControlRig", + "Enabled": true + } + ] +} \ No newline at end of file diff --git a/Plugins/ElectronicNodes/Resources/Icon128.png b/Plugins/ElectronicNodes/Resources/Icon128.png new file mode 100644 index 0000000..db44be7 --- /dev/null +++ b/Plugins/ElectronicNodes/Resources/Icon128.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9cdd0394ce4167a6d309c056f86b1549dc13b5fb2c4d6eee31ef3bd0750c66d2 +size 5393 diff --git a/Plugins/ElectronicNodes/Source/ElectronicNodes/ElectronicNodes.Build.cs b/Plugins/ElectronicNodes/Source/ElectronicNodes/ElectronicNodes.Build.cs new file mode 100644 index 0000000..44add0e --- /dev/null +++ b/Plugins/ElectronicNodes/Source/ElectronicNodes/ElectronicNodes.Build.cs @@ -0,0 +1,66 @@ +/* Copyright (C) 2021 Hugo ATTAL - All Rights Reserved +* This plugin is downloadable from the UE4 Marketplace +*/ + +using System.IO; +using UnrealBuildTool; + +public class ElectronicNodes : ModuleRules +{ + public ElectronicNodes(ReadOnlyTargetRules Target) : base(Target) + { + PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs; + string enginePath = Path.GetFullPath(Target.RelativeEnginePath); + + PublicIncludePaths.AddRange( + new string[] { } + ); + + PrivateIncludePaths.AddRange( + new string[] + { + enginePath + "Source/Editor/AnimationBlueprintEditor/Private/" + } + ); + + PublicDependencyModuleNames.AddRange( + new string[] + { + "Core" + } + ); + + PrivateDependencyModuleNames.AddRange( + new string[] + { + "CoreUObject", + "Engine", + "Slate", + "SlateCore", + "InputCore", + "Projects", + "UnrealEd", + "GraphEditor", + "BlueprintGraph", + "AnimGraph", + "AnimationBlueprintEditor", + "ControlRig", + "ControlRigDeveloper", + "RigVM", + "RigVMDeveloper", + "AIGraph", + "BehaviorTreeEditor", +#if UE_4_26_OR_LATER + "DeveloperSettings", +#endif + "EditorStyle", + "WebBrowser" + } + ); + + DynamicallyLoadedModuleNames.AddRange( + new string[] + { } + ); + } +} \ No newline at end of file diff --git a/Plugins/ElectronicNodes/Source/ElectronicNodes/Private/ENCommands.h b/Plugins/ElectronicNodes/Source/ElectronicNodes/Private/ENCommands.h new file mode 100644 index 0000000..0d5cf1e --- /dev/null +++ b/Plugins/ElectronicNodes/Source/ElectronicNodes/Private/ENCommands.h @@ -0,0 +1,32 @@ +/* Copyright (C) 2021 Hugo ATTAL - All Rights Reserved +* This plugin is downloadable from the UE4 Marketplace +*/ + +#pragma once + +#include "CoreMinimal.h" +#include "Framework/Commands/Commands.h" + +#define LOCTEXT_NAMESPACE "ENCommands" + +class ENCommands : public TCommands +{ +public: + ENCommands() + : TCommands( + TEXT("ElectronicNodes"), + FText::FromString("Electronic Nodes"), + NAME_None, + "ElectronicNodesStyle") + { + } + + TSharedPtr ToggleMasterActivation; + + virtual void RegisterCommands() override + { + UI_COMMAND(ToggleMasterActivation, "Toggle Master Activation", "Toggle activation of Electronic Nodes", EUserInterfaceActionType::Button, FInputChord()); + } +}; + +#undef LOCTEXT_NAMESPACE diff --git a/Plugins/ElectronicNodes/Source/ElectronicNodes/Private/ENConnectionDrawingPolicy.cpp b/Plugins/ElectronicNodes/Source/ElectronicNodes/Private/ENConnectionDrawingPolicy.cpp new file mode 100644 index 0000000..bc6a012 --- /dev/null +++ b/Plugins/ElectronicNodes/Source/ElectronicNodes/Private/ENConnectionDrawingPolicy.cpp @@ -0,0 +1,591 @@ +/* Copyright (C) 2021 Hugo ATTAL - All Rights Reserved +* This plugin is downloadable from the UE4 Marketplace +*/ + +#include "ENConnectionDrawingPolicy.h" +#include "BlueprintEditorSettings.h" +#include "ENPathDrawer.h" +#include "SGraphPanel.h" +#include "Framework/Application/SlateApplication.h" +#include "MaterialGraph/MaterialGraphSchema.h" +#include "Policies/ENAnimGraphConnectionDrawingPolicy.h" +#include "Policies/ENBehaviorTreeConnectionDrawingPolicy.h" +#include "Policies/ENControlRigConnectionDrawingPolicy.h" + + +FConnectionDrawingPolicy* FENConnectionDrawingPolicyFactory::CreateConnectionPolicy(const class UEdGraphSchema* Schema, int32 InBackLayerID, int32 InFrontLayerID, float ZoomFactor, const class FSlateRect& InClippingRect, class FSlateWindowElementList& InDrawElements, class UEdGraph* InGraphObj) const +{ + const UElectronicNodesSettings& ElectronicNodesSettings = *GetDefault(); + if (!ElectronicNodesSettings.MasterActivate) + { + return nullptr; + } + + const FName ClassName = Schema->GetClass()->GetFName(); + + if (ElectronicNodesSettings.DisplaySchemaName) + { + UE_LOG(LogTemp, Log, TEXT("[EN] %s"), *ClassName.ToString()); + } + + if (ElectronicNodesSettings.ActivateOnAnimation) + { + if (ClassName == "AnimationTransitionSchema") + { + return new FENConnectionDrawingPolicy(InBackLayerID, InFrontLayerID, ZoomFactor, InClippingRect, InDrawElements, InGraphObj); + } + + if (ClassName == "AnimationGraphSchema" || ClassName == "AnimationStateGraphSchema") + { + return new FENAnimGraphConnectionDrawingPolicy(InBackLayerID, InFrontLayerID, ZoomFactor, InClippingRect, InDrawElements, InGraphObj); + } + } + + if (ElectronicNodesSettings.ActivateOnVoxelPlugin && ClassName == "VoxelGraphSchema") + { + return new FENConnectionDrawingPolicy(InBackLayerID, InFrontLayerID, ZoomFactor, InClippingRect, InDrawElements, InGraphObj); + } + + if (ElectronicNodesSettings.ActivateOnNiagara && ClassName == "EdGraphSchema_Niagara") + { + return new FENConnectionDrawingPolicy(InBackLayerID, InFrontLayerID, ZoomFactor, InClippingRect, InDrawElements, InGraphObj); + } + + if (ElectronicNodesSettings.ActivateOnBehaviorTree && ClassName == "EdGraphSchema_BehaviorTree") + { + return new FENBehaviorTreeConnectionDrawingPolicy(InBackLayerID, InFrontLayerID, ZoomFactor, InClippingRect, InDrawElements, InGraphObj); + } + + if (ElectronicNodesSettings.ActivateOnControlRig && ClassName == "ControlRigGraphSchema") + { + return new FENControlRigConnectionDrawingPolicy(InBackLayerID, InFrontLayerID, ZoomFactor, InClippingRect, InDrawElements, InGraphObj); + } + + if (ElectronicNodesSettings.ActivateOnReferenceViewer && ClassName == "ReferenceViewerSchema") + { + return new FENConnectionDrawingPolicy(InBackLayerID, InFrontLayerID, ZoomFactor, InClippingRect, InDrawElements, InGraphObj); + } + + if (ElectronicNodesSettings.ActivateOnBlueprint && Schema->IsA(UEdGraphSchema_K2::StaticClass())) + { + return new FENConnectionDrawingPolicy(InBackLayerID, InFrontLayerID, ZoomFactor, InClippingRect, InDrawElements, InGraphObj); + } + + if (ElectronicNodesSettings.ActivateOnMaterial && Schema->IsA(UMaterialGraphSchema::StaticClass())) + { + return new FENConnectionDrawingPolicy(InBackLayerID, InFrontLayerID, ZoomFactor, InClippingRect, InDrawElements, InGraphObj); + } + + for (const auto& Type : ElectronicNodesSettings.CustomGraphSchemas) + { + if (Schema->IsA(Type)) + { + return new FENConnectionDrawingPolicy(InBackLayerID, InFrontLayerID, ZoomFactor, InClippingRect, InDrawElements, InGraphObj); + } + } + + if (ElectronicNodesSettings.ActivateFallback) + { + return new FENConnectionDrawingPolicy(InBackLayerID, InFrontLayerID, ZoomFactor, InClippingRect, InDrawElements, InGraphObj); + } + + return nullptr; +} + +void FENConnectionDrawingPolicy::DrawConnection(int32 LayerId, const FVector2D& Start, const FVector2D& End, const FConnectionParams& Params) +{ + const bool RightPriority = ENIsRightPriority(Params); + + this->_LayerId = LayerId; + this->_Params = &Params; + ClosestDistanceSquared = MAX_FLT; + + FENPathDrawer PathDrawer(LayerId, ZoomFactor, RightPriority, &Params, &DrawElementsList, this); + FVector2D StartDirection = (Params.StartDirection == EGPD_Output) ? FVector2D(1.0f, 0.0f) : FVector2D(-1.0f, 0.0f); + FVector2D EndDirection = (Params.EndDirection == EGPD_Input) ? FVector2D(1.0f, 0.0f) : FVector2D(-1.0f, 0.0f); + + if (FVector2D::Distance(Start, End) < ElectronicNodesSettings.MinDistanceToStyle * ZoomFactor) + { + PathDrawer.DrawLine(Start, End); + return; + } + + if (IsTree) + { + StartDirection = FVector2D(0.0f, 1.0f); + EndDirection = FVector2D(0.0f, 1.0f); + } + + FVector2D NewStart = Start; + FVector2D NewEnd = End; + + ENCorrectZoomDisplacement(NewStart, NewEnd); + ENProcessRibbon(_LayerId, NewStart, StartDirection, NewEnd, EndDirection, Params); + + const float Offset = ElectronicNodesSettings.HorizontalOffset * ZoomFactor; + + if (ElectronicNodesSettings.DisablePinOffset) + { + if (!((Params.AssociatedPin1 != nullptr) && (Params.AssociatedPin1->GetName() == "OutputPin"))) + { + PathDrawer.DrawOffset(NewStart, StartDirection, Offset, false); + } + if (!((Params.AssociatedPin2 != nullptr) && (Params.AssociatedPin2->GetName() == "InputPin"))) + { + PathDrawer.DrawOffset(NewEnd, EndDirection, Offset, true); + } + } + else + { + PathDrawer.DrawOffset(NewStart, StartDirection, Offset, false); + PathDrawer.DrawOffset(NewEnd, EndDirection, Offset, true); + } + + EWireStyle WireStyle = ElectronicNodesSettings.WireStyle; + + if (ElectronicNodesSettings.OverwriteExecWireStyle) + { + if (((Params.AssociatedPin1 != nullptr) && Params.AssociatedPin1->PinType.PinCategory.ToString() == "exec") || + ((Params.AssociatedPin2 != nullptr) && Params.AssociatedPin2->PinType.PinCategory.ToString() == "exec")) + { + if (ElectronicNodesSettings.WireStyleForExec != EWireStyle::Default) + { + WireStyle = ElectronicNodesSettings.WireStyleForExec; + } + } + } + + switch (WireStyle) + { + case EWireStyle::Manhattan: + PathDrawer.DrawManhattanWire(NewStart, StartDirection, NewEnd, EndDirection); + break; + case EWireStyle::Subway: + PathDrawer.DrawSubwayWire(NewStart, StartDirection, NewEnd, EndDirection); + break; + default: + PathDrawer.DrawDefaultWire(NewStart, StartDirection, NewEnd, EndDirection); + } + + if (Settings->bTreatSplinesLikePins) + { + const float QueryDistanceTriggerThresholdSquared = FMath::Square(Settings->SplineHoverTolerance + Params.WireThickness * 0.5f); + const bool bCloseToSpline = ClosestDistanceSquared < QueryDistanceTriggerThresholdSquared; + + if (bCloseToSpline) + { + if (ClosestDistanceSquared < SplineOverlapResult.GetDistanceSquared()) + { + const float SquaredDistToPin1 = (Params.AssociatedPin1 != nullptr) ? (Start - ClosestPoint).SizeSquared() : FLT_MAX; + const float SquaredDistToPin2 = (Params.AssociatedPin2 != nullptr) ? (End - ClosestPoint).SizeSquared() : FLT_MAX; + +#if ENGINE_MAJOR_VERSION == 5 + SplineOverlapResult = FGraphSplineOverlapResult(Params.AssociatedPin1, Params.AssociatedPin2, ClosestDistanceSquared, SquaredDistToPin1, SquaredDistToPin2, false); +#else + SplineOverlapResult = FGraphSplineOverlapResult(Params.AssociatedPin1, Params.AssociatedPin2, ClosestDistanceSquared, SquaredDistToPin1, SquaredDistToPin2); +#endif + } + } + } +} + +void FENConnectionDrawingPolicy::ENCorrectZoomDisplacement(FVector2D& Start, FVector2D& End) +{ + if (ElectronicNodesSettings.FixZoomDisplacement) + { + const float ZoomDisplacement = ZoomFactor * -19.0f + 8.0f; + if (ZoomDisplacement > 0) + { + Start.X += ZoomDisplacement / 2.0f; + End.X -= ZoomDisplacement / 2.0f; + } + } +} + +void FENConnectionDrawingPolicy::ENProcessRibbon(int32 LayerId, FVector2D& Start, FVector2D& StartDirection, FVector2D& End, FVector2D& EndDirection, const FConnectionParams& Params) +{ + int32 DepthOffsetX = 0; + int32 DepthOffsetY = 0; + + if (ElectronicNodesSettings.ActivateRibbon && !IsTree) + { + for (ENRibbonConnection RibbonConnection : RibbonConnections) + { + if (RibbonConnection.Horizontal) + { + if (FMath::Abs(Start.Y - RibbonConnection.Main) < ElectronicNodesSettings.RibbonOffset) + { + const float CurrentMax = FMath::Max(Start.X, End.X); + const float CurrentMin = FMath::Min(Start.X, End.X); + const float RibbonMax = FMath::Max(RibbonConnection.Start, RibbonConnection.End); + const float RibbonMin = FMath::Min(RibbonConnection.Start, RibbonConnection.End); + + if (FMath::IsNearlyEqual(RibbonMin, CurrentMin, KINDA_SMALL_NUMBER) || + FMath::IsNearlyEqual(RibbonMax, CurrentMin, KINDA_SMALL_NUMBER) || + FMath::IsNearlyEqual(RibbonMin, CurrentMax, KINDA_SMALL_NUMBER) || + FMath::IsNearlyEqual(RibbonMax, CurrentMax, KINDA_SMALL_NUMBER)) + { + continue; + } + + if (FMath::Min(CurrentMax, RibbonMax) > FMath::Max(CurrentMin, RibbonMin) - 1.0f) + { + if (End.Y - RibbonConnection.Sub > 0) + { + DepthOffsetY = FMath::Max(DepthOffsetY, FMath::Max(1, RibbonConnection.Depth + 1)); + } + else + { + DepthOffsetY = FMath::Min(DepthOffsetY, FMath::Min(-1, RibbonConnection.Depth - 1)); + } + } + } + } + } + for (ENRibbonConnection RibbonConnection : RibbonConnections) + { + if (!RibbonConnection.Horizontal) + { + if (FMath::Abs(End.X - RibbonConnection.Main) < ElectronicNodesSettings.RibbonOffset) + { + const float CurrentMax = FMath::Max(Start.Y, End.Y); + const float CurrentMin = FMath::Min(Start.Y, End.Y); + const float RibbonMax = FMath::Max(RibbonConnection.Start, RibbonConnection.End); + const float RibbonMin = FMath::Min(RibbonConnection.Start, RibbonConnection.End); + + if (FMath::IsNearlyEqual(RibbonMin, CurrentMin, KINDA_SMALL_NUMBER) || + FMath::IsNearlyEqual(RibbonMax, CurrentMin, KINDA_SMALL_NUMBER) || + FMath::IsNearlyEqual(RibbonMin, CurrentMax, KINDA_SMALL_NUMBER) || + FMath::IsNearlyEqual(RibbonMax, CurrentMax, KINDA_SMALL_NUMBER)) + { + continue; + } + + if (FMath::Min(CurrentMax, RibbonMax) > FMath::Max(CurrentMin, RibbonMin) - 1.0f) + { + if ((Start.Y - RibbonConnection.Start) * FMath::Sign(End.Y - Start.Y) > 0 || ElectronicNodesSettings.RibbonPushOutside) + { + DepthOffsetX = FMath::Max(DepthOffsetX, FMath::Max(1, RibbonConnection.Depth + 1)); + } + else + { + DepthOffsetX = FMath::Min(DepthOffsetX, FMath::Min(-1, RibbonConnection.Depth - 1)); + } + + if (DepthOffsetY != 0) + { + DepthOffsetX = FMath::Sign(End.Y - Start.Y) * DepthOffsetY; + } + } + } + } + } + + RibbonConnections.Add(ENRibbonConnection(Start.Y, End.Y, true, Start.X, End.X, DepthOffsetY)); + RibbonConnections.Add(ENRibbonConnection(End.X, Start.X, false, Start.Y, End.Y, DepthOffsetX)); + + FVector2D StartKey(FMath::FloorToInt(Start.X), FMath::FloorToInt(Start.Y)); + FVector2D EndKey(FMath::FloorToInt(End.X), FMath::FloorToInt(End.Y)); + + FENPathDrawer PathDrawer(LayerId, ZoomFactor, true, &Params, &DrawElementsList, this); + + if (DepthOffsetY != 0) + { + FVector2D NewStart = Start; + NewStart.X += ElectronicNodesSettings.RibbonMergeOffset * ZoomFactor * StartDirection.X; + NewStart.Y += static_cast(ElectronicNodesSettings.RibbonOffset) * DepthOffsetY * ZoomFactor; + + PathDrawer.DrawManhattanWire(Start, StartDirection, NewStart, StartDirection); + + Start = NewStart; + } + + if (DepthOffsetX != 0) + { + FVector2D NewEnd = End; + NewEnd.X -= static_cast(ElectronicNodesSettings.RibbonOffset) * DepthOffsetX * ZoomFactor * EndDirection.X; + + if (DepthOffsetX * EndDirection.X > 0) + { + PathDrawer.DrawManhattanWire(NewEnd, EndDirection, End, EndDirection); + } + + End = NewEnd; + } + } +} + +bool FENConnectionDrawingPolicy::ENIsRightPriority(const FConnectionParams& Params) +{ + bool RightPriority = (ElectronicNodesSettings.WireAlignment == EWireAlignment::Right); + EWirePriority WirePriority = ElectronicNodesSettings.WirePriority; + + if (ElectronicNodesSettings.OverwriteExecWireStyle) + { + if (((Params.AssociatedPin1 != nullptr) && Params.AssociatedPin1->PinType.PinCategory.ToString() == "exec") || + ((Params.AssociatedPin2 != nullptr) && Params.AssociatedPin2->PinType.PinCategory.ToString() == "exec")) + { + RightPriority = (ElectronicNodesSettings.WireAlignmentForExec == EWireAlignment::Right); + WirePriority = ElectronicNodesSettings.WirePriorityForExec; + } + } + + if (WirePriority != EWirePriority::None) + { + if ((Params.AssociatedPin1 != nullptr) && (Params.AssociatedPin2 != nullptr)) + { + const bool IsOutputPin = (Params.AssociatedPin1->GetName() == "OutputPin"); + const bool IsInputPin = (Params.AssociatedPin2->GetName() == "InputPin"); + if (IsOutputPin ^ IsInputPin) + { + switch (WirePriority) + { + case EWirePriority::Node: + RightPriority = IsOutputPin; + break; + case EWirePriority::Pin: + RightPriority = IsInputPin; + break; + default: + break; + } + } + } + } + + return RightPriority; +} + +int32 FENConnectionDrawingPolicy::ENGetZoomLevel() +{ + const float ZoomLevels[] = {2.0f, 1.875f, 1.75f, 1.675f, 1.5f, 1.375f, 1.25f, 1.0f, 0.875f, 0.75f, 0.675f, 0.5f, 0.375f, 0.25f, 0.225f, 0.2f, 0.175f, 0.15f, 0.125f, 0.1f}; + + for (int32 i = 0; i < 20; i++) + { + if (ZoomFactor > ZoomLevels[i] - KINDA_SMALL_NUMBER) + { + return 7 - i; + } + } + + return -12; +} + +TSharedPtr FENConnectionDrawingPolicy::GetGraphPanel() +{ + FSlateApplication& SlateApplication = FSlateApplication::Get(); + const TSharedPtr Widget = SlateApplication.GetUserFocusedWidget(0); + if (Widget.IsValid() && Widget->GetTypeAsString() == "SGraphPanel") + { + return StaticCastSharedPtr(Widget); + } + return nullptr; +} + +void FENConnectionDrawingPolicy::BuildRelatedNodes(UEdGraphNode* Node, TArray& RelatedNodes, bool InputCheck = true, bool OutputCheck = true) +{ + if (RelatedNodes.Find(Node) != INDEX_NONE && (!InputCheck || !OutputCheck)) + { + return; + } + RelatedNodes.Push(Node); + + for (auto Pin : Node->Pins) + { + if (InputCheck && Pin->Direction == EGPD_Input) + { + for (auto LinkedPin : Pin->LinkedTo) + { + UEdGraphNode* LinkedNode = LinkedPin->GetOwningNode(); + if (ElectronicNodesSettings.SelectionRule == ESelectionRule::Far || LinkedNode->GetName().StartsWith("K2Node_Knot_")) + { + BuildRelatedNodes(LinkedNode, RelatedNodes, true, false); + } + else + { + RelatedNodes.Push(LinkedNode); + } + } + } + + if (OutputCheck && Pin->Direction == EGPD_Output) + { + for (auto LinkedPin : Pin->LinkedTo) + { + UEdGraphNode* LinkedNode = LinkedPin->GetOwningNode(); + if (ElectronicNodesSettings.SelectionRule == ESelectionRule::Far || LinkedNode->GetName().StartsWith("K2Node_Knot_")) + { + BuildRelatedNodes(LinkedNode, RelatedNodes, false, true); + } + else + { + RelatedNodes.Push(LinkedNode); + } + } + } + } +} + +void FENConnectionDrawingPolicy::ENDrawBubbles(const FVector2D& Start, const FVector2D& StartTangent, const FVector2D& End, const FVector2D& EndTangent) +{ + const bool ENDrawBubbles = ElectronicNodesSettings.ForceDrawBubbles && (ElectronicNodesSettings.BubbleZoomThreshold <= ENGetZoomLevel()); + if (_Params->bDrawBubbles || ENDrawBubbles) + { + bool LinkedBubbles = true; + + if (!_Params->bDrawBubbles) + { + LinkedBubbles = false; + + if (ElectronicNodesSettings.BubbleDisplayRule == EBubbleDisplayRule::DisplayOnSelection || + ElectronicNodesSettings.BubbleDisplayRule == EBubbleDisplayRule::MoveOnSelection) + { + TSharedPtr GraphPanel = this->GetGraphPanel(); + if (GraphPanel.IsValid()) + { + if (_Params->AssociatedPin1 != nullptr && _Params->AssociatedPin2 != nullptr) + { + for (auto SelectedNode : GraphPanel->SelectionManager.SelectedNodes) + { + TArray RelatedNodes; + UEdGraphNode* SelectedGraphNode = StaticCast(SelectedNode); + this->BuildRelatedNodes(SelectedGraphNode, RelatedNodes); + + if (RelatedNodes.Find(_Params->AssociatedPin1->GetOwningNode()) != INDEX_NONE && RelatedNodes.Find(_Params->AssociatedPin2->GetOwningNode()) != INDEX_NONE) + { + LinkedBubbles = true; + } + } + } + } + } + } + + if (!LinkedBubbles && ElectronicNodesSettings.BubbleDisplayRule == EBubbleDisplayRule::DisplayOnSelection) + { + return; + } + + FInterpCurve SplineReparamTable; + const float SplineLength = (Start - End).Size(); + int32 NumBubbles = FMath::CeilToInt(SplineLength / (ElectronicNodesSettings.BubbleSpace * ZoomFactor)); + NumBubbles = FMath::Min(NumBubbles, 1000); + + float BubbleSpeed = ElectronicNodesSettings.BubbleSpeed; + if (!LinkedBubbles && ElectronicNodesSettings.BubbleDisplayRule == EBubbleDisplayRule::MoveOnSelection) + { + BubbleSpeed = 0.0f; + } + FVector2D BubbleSize = BubbleImage->ImageSize * ZoomFactor * 0.1f * ElectronicNodesSettings.BubbleSize * FMath::Sqrt(_Params->WireThickness); + if (_Params->bDrawBubbles) + { + BubbleSize *= 1.25f; + } + const float Time = (FPlatformTime::Seconds() - GStartTime); + + const float AlphaOffset = FMath::Frac(Time * BubbleSpeed); + + for (int32 i = 0; i < NumBubbles; ++i) + { + const float Alpha = (AlphaOffset + i) / NumBubbles; + FVector2D BubblePos; + if (StartTangent != FVector2D::ZeroVector && EndTangent != FVector2D::ZeroVector) + { + if ((StartTangent != EndTangent) && ((StartTangent * EndTangent) == FVector2D::ZeroVector)) + { + BubblePos = Start + StartTangent * FMath::Sin(Alpha * PI / 2.0f) + EndTangent * (1.0f - FMath::Cos(Alpha * PI / 2.0f)); + } + else + { + BubblePos = FMath::CubicInterp(Start, StartTangent, End, EndTangent, Alpha); + } + } + else + { + BubblePos = FMath::Lerp(Start, End, Alpha); + } + BubblePos -= (BubbleSize * 0.5f); + + FSlateDrawElement::MakeBox( + DrawElementsList, + _LayerId, + FPaintGeometry(BubblePos, BubbleSize, ZoomFactor), + BubbleImage, + ESlateDrawEffect::None, + _Params->WireColor + ); + } + } +} + +void FENConnectionDrawingPolicy::ENDrawArrow(const FVector2D& Start, const FVector2D& End) +{ + if (MidpointImage != nullptr && (Start - End).Size() > 4 * MinXOffset) + { + const FVector2D MidpointDrawPos = (Start + End) / 2.0f - MidpointRadius * 0.75f; + const FVector2D SlopeUnnormalized = (End - Start); + const float AngleInRadians = FMath::Atan2(SlopeUnnormalized.Y, SlopeUnnormalized.X); + + FSlateDrawElement::MakeRotatedBox(DrawElementsList, _LayerId, FPaintGeometry(MidpointDrawPos, MidpointImage->ImageSize * ZoomFactor * 0.75f, ZoomFactor * 0.75f), + MidpointImage, ESlateDrawEffect::None, AngleInRadians, TOptional(), FSlateDrawElement::RelativeToElement, _Params->WireColor); + } +} + +void FENConnectionDrawingPolicy::DrawDebugPoint(const FVector2D& Position, FLinearColor Color) +{ + const FVector2D BubbleSize = BubbleImage->ImageSize * ZoomFactor * 0.1f * ElectronicNodesSettings.BubbleSize * FMath::Sqrt(_Params->WireThickness); + const FVector2D BubblePos = Position - (BubbleSize * 0.5f); + + FSlateDrawElement::MakeBox( + DrawElementsList, + _LayerId, + FPaintGeometry(BubblePos, BubbleSize, ZoomFactor), + BubbleImage, + ESlateDrawEffect::None, + Color + ); +} + +void FENConnectionDrawingPolicy::ENComputeClosestPoint(const FVector2D& Start, const FVector2D& End) +{ + const FVector2D TemporaryPoint = FMath::ClosestPointOnSegment2D(LocalMousePosition, Start, End); + const float TemporaryDistance = (LocalMousePosition - TemporaryPoint).SizeSquared(); + + if (TemporaryDistance < ClosestDistanceSquared) + { + ClosestDistanceSquared = TemporaryDistance; + ClosestPoint = TemporaryPoint; + } +} + +void FENConnectionDrawingPolicy::ENComputeClosestPointDefault(const FVector2D& Start, const FVector2D& StartTangent, const FVector2D& End, const FVector2D& EndTangent) +{ + const float Offset = 50.0 * ZoomFactor; + const FVector2D MinStart = FVector2D(FMath::Min(Start.X, End.X) - Offset, FMath::Min(Start.Y, End.Y)); + const FVector2D MaxEnd = FVector2D(FMath::Max(Start.X, End.X) + Offset, FMath::Max(Start.Y, End.Y)); + + const FBox2D Bounds(MinStart, MaxEnd); + const bool bCloseToSpline = Bounds.ComputeSquaredDistanceToPoint(LocalMousePosition) < 1.0f; + + if (bCloseToSpline) + { + const float StepInterval = 1.0f / 16.0f; + const float Tangent = (End - Start).Size(); + FVector2D PointOnSpline1 = FMath::CubicInterp(Start, StartTangent * Tangent, End, EndTangent * Tangent, 0.0f); + for (float TestAlpha = 0.0f; TestAlpha < 1.0f; TestAlpha += StepInterval) + { + const FVector2D PointOnSpline2 = FMath::CubicInterp(Start, StartTangent * Tangent, End, EndTangent * Tangent, TestAlpha + StepInterval); + + const FVector2D ClosestPointToSegment = FMath::ClosestPointOnSegment2D(LocalMousePosition, PointOnSpline1, PointOnSpline2); + const float DistanceSquared = (LocalMousePosition - ClosestPointToSegment).SizeSquared(); + + if (DistanceSquared < ClosestDistanceSquared) + { + ClosestDistanceSquared = DistanceSquared; + ClosestPoint = ClosestPointToSegment; + } + + PointOnSpline1 = PointOnSpline2; + } + } +} diff --git a/Plugins/ElectronicNodes/Source/ElectronicNodes/Private/ENConnectionDrawingPolicy.h b/Plugins/ElectronicNodes/Source/ElectronicNodes/Private/ENConnectionDrawingPolicy.h new file mode 100644 index 0000000..c96a608 --- /dev/null +++ b/Plugins/ElectronicNodes/Source/ElectronicNodes/Private/ENConnectionDrawingPolicy.h @@ -0,0 +1,81 @@ +/* Copyright (C) 2021 Hugo ATTAL - All Rights Reserved +* This plugin is downloadable from the UE4 Marketplace +*/ + +#pragma once + +#include "CoreMinimal.h" +#include "EdGraphUtilities.h" +#include "ConnectionDrawingPolicy.h" +#include "../Public/ElectronicNodesSettings.h" + +#include "BlueprintConnectionDrawingPolicy.h" + +struct ENRibbonConnection +{ + float Main; + float Sub; + bool Horizontal; + float Start; + float End; + int32 Depth = 0; + + ENRibbonConnection(float Main, float Sub, bool Horizontal, float Start, float End, int32 Depth = 0) + { + this->Main = Main; + this->Sub = Sub; + this->Horizontal = Horizontal; + this->Start = Start; + this->End = End; + this->Depth = Depth; + } +}; + +struct FENConnectionDrawingPolicyFactory : public FGraphPanelPinConnectionFactory +{ + virtual ~FENConnectionDrawingPolicyFactory() + { + } + + virtual class FConnectionDrawingPolicy* CreateConnectionPolicy(const class UEdGraphSchema* Schema, int32 InBackLayerID, int32 InFrontLayerID, float ZoomFactor, const class FSlateRect& InClippingRect, class FSlateWindowElementList& InDrawElements, class UEdGraph* InGraphObj) const override; +}; + +class FENConnectionDrawingPolicy : public FKismetConnectionDrawingPolicy +{ +public: + FENConnectionDrawingPolicy(int32 InBackLayerID, int32 InFrontLayerID, float ZoomFactor, const FSlateRect& InClippingRect, FSlateWindowElementList& InDrawElements, UEdGraph* InGraphObj, bool IsTree = false) + : FKismetConnectionDrawingPolicy(InBackLayerID, InFrontLayerID, ZoomFactor, InClippingRect, InDrawElements, InGraphObj), IsTree(IsTree) + { + } + + virtual void DrawConnection(int32 LayerId, const FVector2D& Start, const FVector2D& End, const FConnectionParams& Params) override; + + void ENComputeClosestPoint(const FVector2D& Start, const FVector2D& End); + void ENComputeClosestPointDefault(const FVector2D& Start, const FVector2D& StartTangent, const FVector2D& End, const FVector2D& EndTangent); + void ENDrawBubbles(const FVector2D& Start, const FVector2D& StartTangent, const FVector2D& End, const FVector2D& EndTangent); + void ENDrawArrow(const FVector2D& Start, const FVector2D& End); + + void DrawDebugPoint(const FVector2D& Position, FLinearColor Color); + +private: + const UElectronicNodesSettings& ElectronicNodesSettings = *GetDefault(); + bool ReversePins; + float MinXOffset; + float ClosestDistanceSquared; + FVector2D ClosestPoint; + TArray RibbonConnections; + TMap PinsOffset; + + bool IsTree = false; + + void ENCorrectZoomDisplacement(FVector2D& Start, FVector2D& End); + void ENProcessRibbon(int32 LayerId, FVector2D& Start, FVector2D& StartDirection, FVector2D& End, FVector2D& EndDirection, const FConnectionParams& Params); + bool ENIsRightPriority(const FConnectionParams& Params); + int32 ENGetZoomLevel(); + + TSharedPtr GetGraphPanel(); + void BuildRelatedNodes(UEdGraphNode* Node, TArray& RelatedNodes, bool InputCheck, bool OutputCheck); + + int32 _LayerId; + const FConnectionParams* _Params; +}; diff --git a/Plugins/ElectronicNodes/Source/ElectronicNodes/Private/ENPathDrawer.cpp b/Plugins/ElectronicNodes/Source/ElectronicNodes/Private/ENPathDrawer.cpp new file mode 100644 index 0000000..cd170fb --- /dev/null +++ b/Plugins/ElectronicNodes/Source/ElectronicNodes/Private/ENPathDrawer.cpp @@ -0,0 +1,549 @@ +/* Copyright (C) 2021 Hugo ATTAL - All Rights Reserved +* This plugin is downloadable from the UE4 Marketplace +*/ + +#include "ENPathDrawer.h" + +FENPathDrawer::FENPathDrawer(int32& LayerId, float& ZoomFactor, bool RightPriority, const FConnectionParams* Params, FSlateWindowElementList* DrawElementsList, FENConnectionDrawingPolicy* ConnectionDrawingPolicy) +{ + this->LayerId = LayerId; + this->ZoomFactor = ZoomFactor; + this->RightPriority = RightPriority; + this->Params = Params; + WireColor = Params->WireColor; + this->DrawElementsList = DrawElementsList; + this->ConnectionDrawingPolicy = ConnectionDrawingPolicy; +} + +void FENPathDrawer::DrawManhattanWire(const FVector2D& Start, const FVector2D& StartDirection, const FVector2D& End, const FVector2D& EndDirection) +{ + if (!MaxDepthWire--) + { + return; + } + + if (FMath::IsNearlyZero((End - Start).SizeSquared(), KINDA_SMALL_NUMBER)) + { + return; + } + + const bool SameDirection = FVector2D::DistSquared(StartDirection, EndDirection) < KINDA_SMALL_NUMBER; + const bool StraightDirection = FMath::IsNearlyZero(FVector2D::CrossProduct(StartDirection, EndDirection), KINDA_SMALL_NUMBER); + const bool ForwardDirection = FVector2D::DotProduct(End - Start, StartDirection) > KINDA_SMALL_NUMBER; + + const float DistanceOrtho = FVector2D::CrossProduct(End - Start, StartDirection); + const float DistanceStraight = FVector2D::DotProduct(End - Start, StartDirection); + + FVector2D NewStart = Start, NewStartDirection = StartDirection; + FVector2D NewEnd = End, NewEndDirection = EndDirection; + + const int32 DirectionAngle = FMath::Sign(DistanceOrtho); + + DebugColor(FLinearColor(1.0f, 1.0f, 1.0f)); + + if (SameDirection) + { + if ((Start + StartDirection * FVector2D::Distance(Start, End) - End).IsNearlyZero(KINDA_SMALL_NUMBER)) + { + DrawLine(Start, End); + return; + } + else if (FMath::IsNearlyEqual(FVector2D::DotProduct((End - Start).GetSafeNormal(), StartDirection), -1.0f, KINDA_SMALL_NUMBER)) + { + DebugColor(FLinearColor(0.5f, 0.5f, 0.5f)); + DrawSimpleRadius(Start, StartDirection, -90, NewStart, NewStartDirection, false); + DrawSimpleRadius(End, EndDirection, 90, NewEnd, NewEndDirection, true); + } + else if ((FMath::Abs(End.X - Start.X) < 2 * GetRadiusOffset()) && (FMath::Abs(End.Y - Start.Y)) < 4 * GetRadiusOffset()) + { + const float Multiplier = FVector2D::Distance(Start, End) / 32.0f; + DebugColor(FLinearColor(0.5f, 1.0f, 0.0f)); + DrawSpline(Start, StartDirection * Multiplier, End, EndDirection * Multiplier); + return; + } + else if (!ForwardDirection && (FMath::Abs(DistanceOrtho) < 4.0f * GetRadiusOffset())) + { + DebugColor(FLinearColor(1.0f, 0.0f, 0.0f)); + DrawUTurn(Start, StartDirection, DirectionAngle, NewStart, NewStartDirection, false); + } + else if (FMath::Abs(End.Y - Start.Y) < 2.0f * GetRadiusOffset()) + { + DebugColor(FLinearColor(1.0f, 0.5f, 0.0f)); + DrawCorrectionOrtho(End, EndDirection, DistanceOrtho, NewEnd, NewEndDirection, true); + } + else if (FMath::Abs(End.X - Start.X) < 2.0f * GetRadiusOffset() && FMath::IsNearlyEqual(StartDirection.Y, 1.0f, KINDA_SMALL_NUMBER) && FMath::IsNearlyEqual(EndDirection.Y, 1.0f, KINDA_SMALL_NUMBER)) + { + DebugColor(FLinearColor(1.0f, 0.5f, 0.0f)); + DrawCorrectionOrtho(End, EndDirection, DistanceOrtho, NewEnd, NewEndDirection, true); + } + else + { + DebugColor(FLinearColor(1.0f, 0.0f, 1.0f)); + if (DistanceStraight < 2.0f * GetRadiusOffset()) + { + if (FMath::Abs(DistanceOrtho) < 4.0f * GetRadiusOffset()) + { + DrawUTurn(Start, StartDirection, DirectionAngle, NewStart, NewStartDirection, false); + } + else + { + DrawUTurn(End, EndDirection, DirectionAngle, NewEnd, NewEndDirection, true); + } + } + else + { + const float Direction = -FMath::Sign(DistanceOrtho); + + if (RightPriority) + { + DrawSimpleRadius(End, EndDirection, 90 * Direction, NewEnd, NewEndDirection, true); + } + else + { + DrawSimpleRadius(Start, StartDirection, 90 * Direction, NewStart, NewStartDirection, false); + } + } + } + } + else if (!StraightDirection) + { + DrawIntersectionRadius(Start, StartDirection, End, EndDirection); + return; + } + else + { + if (FMath::Sign(DistanceStraight) > 0) + { + DebugColor(FLinearColor(0.5f, 0, 0.5f)); + DrawSimpleRadius(End, EndDirection, 90 * DirectionAngle, NewEnd, NewEndDirection, true); + } + else + { + DebugColor(FLinearColor(1.0f, 0, 1.0f)); + DrawSimpleRadius(Start, StartDirection, -90 * DirectionAngle, NewStart, NewStartDirection, false); + } + } + + DrawManhattanWire(NewStart, NewStartDirection, NewEnd, NewEndDirection); +} + +void FENPathDrawer::DrawSubwayWire(const FVector2D& Start, const FVector2D& StartDirection, const FVector2D& End, const FVector2D& EndDirection) +{ + if (!MaxDepthWire--) + { + return; + } + + if (FMath::IsNearlyZero((End - Start).SizeSquared(), KINDA_SMALL_NUMBER)) + { + return; + } + + const bool StartDirection90 = FMath::IsNearlyEqual(FMath::Abs(StartDirection.X), 1.0f, KINDA_SMALL_NUMBER) || FMath::IsNearlyEqual(FMath::Abs(StartDirection.Y), 1.0f, KINDA_SMALL_NUMBER); + const bool EndDirection90 = FMath::IsNearlyEqual(FMath::Abs(EndDirection.X), 1.0f, KINDA_SMALL_NUMBER) || FMath::IsNearlyEqual(FMath::Abs(EndDirection.Y), 1.0f, KINDA_SMALL_NUMBER); + + const bool SameDirection = FVector2D::DistSquared(StartDirection, EndDirection) < KINDA_SMALL_NUMBER; + const bool StraightDirection = FMath::IsNearlyZero(FVector2D::CrossProduct(StartDirection, EndDirection), KINDA_SMALL_NUMBER); + const bool ForwardDirection = FVector2D::DotProduct(End - Start, StartDirection) > KINDA_SMALL_NUMBER; + + const float DistanceOrtho = FVector2D::CrossProduct(End - Start, StartDirection); + const float DistanceStraight = FVector2D::DotProduct(End - Start, StartDirection); + const float DirectionOffset = (FMath::Abs(End.X - Start.X) - FMath::Abs(End.Y - Start.Y)) * (FMath::IsNearlyEqual(FMath::Abs(StartDirection.X), 1.0f, KINDA_SMALL_NUMBER) ? 1 : -1); + + const int32 DirectionAngle = FMath::Sign(DistanceOrtho); + + FVector2D NewStart = Start, NewStartDirection = StartDirection; + FVector2D NewEnd = End, NewEndDirection = EndDirection; + + DebugColor(FLinearColor(1.0f, 1.0f, 1.0f)); + + if (!StraightDirection) + { + if (StartDirection90 && EndDirection90) + { + DrawIntersectionDiagRadius(Start, StartDirection, End, EndDirection); + } + else + { + DrawIntersectionRadius(Start, StartDirection, End, EndDirection); + } + return; + } + else if (SameDirection) + { + if ((Start + StartDirection * FVector2D::Distance(Start, End) - End).IsNearlyZero(KINDA_SMALL_NUMBER)) + { + DrawLine(Start, End); + return; + } + else if (FVector2D::Distance(Start, End) < 4 * GetRadiusOffset()) + { + DrawManhattanWire(Start, StartDirection, End, EndDirection); + return; + } + else if (FMath::IsNearlyEqual(FVector2D::DotProduct((End - Start).GetSafeNormal(), StartDirection), -1.0f, KINDA_SMALL_NUMBER)) + { + DebugColor(FLinearColor(0.5f, 0.5f, 0.5f)); + DrawSimpleRadius(Start, StartDirection, -90, NewStart, NewStartDirection, false); + DrawSimpleRadius(End, EndDirection, 90, NewEnd, NewEndDirection, true); + } + else if (ForwardDirection && DirectionOffset > 2 * GetIntersectionOffset(45, false)) + { + DebugColor(FLinearColor(0.0f, 1.0f, 0.0f)); + + if (FMath::Abs(DistanceOrtho) < 2 * GetIntersectionOffset(45, true)) + { + if ((FMath::Abs(DistanceOrtho) < 2 * GetIntersectionOffset(45, false)) && (FMath::Abs(DistanceStraight) > 2 * GetRadiusOffset())) + { + DebugColor(FLinearColor(0.0f, 0.5f, 0.0f)); + DrawCorrectionOrtho(End, EndDirection, DistanceOrtho, NewEnd, NewEndDirection, true); + } + } + else + { + if (RightPriority) + { + DrawSimpleRadius(End, EndDirection, -45 * DirectionAngle, NewEnd, NewEndDirection, true); + } + else + { + DrawSimpleRadius(Start, StartDirection, -45 * DirectionAngle, NewStart, NewStartDirection, false); + } + } + } + else + { + if (DistanceStraight < 2 * GetRadiusOffset()) + { + DebugColor(FLinearColor(1.0f, 1.0f, 0.0f)); + int32 Direction = -FMath::Sign(DistanceOrtho); + DrawSimpleRadius(Start, StartDirection, 90 * Direction, NewStart, NewStartDirection, false); + DrawSimpleRadius(End, EndDirection, 90 * Direction, NewEnd, NewEndDirection, true); + } + else if (DirectionOffset > 2 * GetIntersectionOffset(45, false)) + { + DebugColor(FLinearColor(0, 0, 1.0f)); + DrawSimpleRadius(End, EndDirection, -45 * DirectionAngle, NewEnd, NewEndDirection, true); + } + else + { + DebugColor(FLinearColor(0, 0.5f, 0)); + DrawSimpleRadius(End, EndDirection, -90 * DirectionAngle, NewEnd, NewEndDirection, true); + } + } + } + else + { + if (FMath::Sign(DistanceStraight) > 0) + { + DebugColor(FLinearColor(0.5f, 0, 0.5f)); + DrawSimpleRadius(End, EndDirection, 90 * DirectionAngle, NewEnd, NewEndDirection, true); + } + else + { + DebugColor(FLinearColor(1.0f, 0, 1.0f)); + DrawSimpleRadius(Start, StartDirection, -90 * DirectionAngle, NewStart, NewStartDirection, false); + } + } + + DrawSubwayWire(NewStart, NewStartDirection, NewEnd, NewEndDirection); +} + +void FENPathDrawer::DrawDefaultWire(const FVector2D& Start, const FVector2D& StartDirection, const FVector2D& End, const FVector2D& EndDirection) +{ + const float Tangent = (End - Start).Size(); + + FSlateDrawElement::MakeDrawSpaceSpline(*DrawElementsList, LayerId, + Start, StartDirection * Tangent, End, EndDirection * Tangent, + Params->WireThickness * ElectronicNodesSettings.WireThickness, ESlateDrawEffect::None, WireColor); + + ConnectionDrawingPolicy->ENComputeClosestPointDefault(Start, StartDirection, End, EndDirection); + + ConnectionDrawingPolicy->ENDrawBubbles(Start, StartDirection * Tangent, End, EndDirection * Tangent); +} + +void FENPathDrawer::DrawIntersectionRadius(const FVector2D& Start, const FVector2D& StartDirection, const FVector2D& End, const FVector2D& EndDirection) +{ + const int32 AngleDeg = FMath::RoundToInt(FMath::UnwindDegrees(FMath::RadiansToDegrees(FMath::Atan2(StartDirection.Y, StartDirection.X) - FMath::Atan2(EndDirection.Y, EndDirection.X)))); + + const float StartOffset = GetIntersectionOffset(AngleDeg, false); + const float EndOffset = GetIntersectionOffset(AngleDeg, true); + + const float T = (EndDirection.X * (Start.Y - End.Y) - EndDirection.Y * (Start.X - End.X)) / (-EndDirection.X * StartDirection.Y + StartDirection.X * EndDirection.Y); + const FVector2D Intersection = Start + T * StartDirection; + + const FVector2D StartStop = Intersection - StartDirection * StartOffset; + const FVector2D EndStop = Intersection + EndDirection * EndOffset; + + DebugColor(FLinearColor(1.0f, 1.0f, 1.0f)); + DrawLine(Start, StartStop); + + DebugColor(FLinearColor(0.0f, 0.0f, 1.0f)); + DrawRadius(StartStop, StartDirection, EndStop, EndDirection, AngleDeg); + + DebugColor(FLinearColor(1.0f, 1.0f, 1.0f)); + DrawLine(EndStop, End); +} + +void FENPathDrawer::DrawIntersectionDiagRadius(const FVector2D& Start, const FVector2D& StartDirection, const FVector2D& End, const FVector2D& EndDirection) +{ + const float DirectionOffset = FMath::Abs(End.X - Start.X) - FMath::Abs(End.Y - Start.Y); + + FVector2D NewStart = Start; + FVector2D NewEnd = End; + + FVector2D NewStartClose, NewStartCloseDirection; + FVector2D NewEndClose, NewEndCloseDirection; + + int32 Direction; + + if (FMath::IsNearlyEqual(FMath::Abs(StartDirection.X), 1.0f, KINDA_SMALL_NUMBER)) + { + Direction = FMath::RoundToInt(FMath::Sign(End.Y - Start.Y) * StartDirection.X); + if (DirectionOffset > 0) + { + NewStart += FVector2D(1.0f, 0.0f) * DirectionOffset * StartDirection.X; + } + else + { + NewEnd += FVector2D(0.0f, 1.0f) * DirectionOffset * FMath::Sign(End.Y - Start.Y); + } + } + else + { + Direction = FMath::RoundToInt(FMath::Sign(Start.Y - End.Y) * EndDirection.X); + + if (DirectionOffset > 0) + { + NewEnd -= FVector2D(1.0f, 0.0f) * DirectionOffset * EndDirection.X; + } + else + { + NewStart -= FVector2D(0.0f, 1.0f) * DirectionOffset * FMath::Sign(End.Y - Start.Y); + } + } + + DebugColor(FLinearColor(1.0f, 1.0f, 1.0f)); + DrawLine(Start, NewStart); + DrawLine(NewEnd, End); + + DebugColor(FLinearColor(0.0f, 0.0f, 1.0f)); + DrawSimpleRadius(NewStart, StartDirection, 45 * Direction, NewStartClose, NewStartCloseDirection, false); + DrawSimpleRadius(NewEnd, EndDirection, -45 * Direction, NewEndClose, NewEndCloseDirection, true); + + DebugColor(FLinearColor(1.0f, 1.0f, 1.0f)); + DrawLine(NewStartClose, NewEndClose); +} + +void FENPathDrawer::DrawSimpleRadius(const FVector2D& Start, const FVector2D& StartDirection, const int32& AngleDeg, FVector2D& out_End, FVector2D& out_EndDirection, bool Backward) +{ + const float StartOffset = GetRadiusOffset(AngleDeg, false); + const float PerpendicularOffset = GetRadiusOffset(AngleDeg, true); + const FVector2D PerpendicularDirection = StartDirection.GetRotated(FMath::Sign(AngleDeg) * 90); + out_EndDirection = StartDirection.GetRotated(AngleDeg); + + if (Backward) + { + out_End = Start - (StartDirection * StartOffset + PerpendicularDirection * PerpendicularOffset); + DrawRadius(out_End, out_EndDirection, Start, StartDirection, AngleDeg); + } + else + { + out_End = Start + (StartDirection * StartOffset + PerpendicularDirection * PerpendicularOffset); + DrawRadius(Start, StartDirection, out_End, out_EndDirection, AngleDeg); + } +} + +void FENPathDrawer::DrawUTurn(const FVector2D& Start, const FVector2D& StartDirection, float Direction, FVector2D& out_End, FVector2D& out_EndDirection, bool Backward) +{ + const float BackwardDirection = Backward ? -1.0f : 1.0f; + + const FVector2D MidDirection = StartDirection.GetRotated(FMath::Sign(Direction) * 90 * BackwardDirection); + const FVector2D Mid = Start + (StartDirection + MidDirection) * GetRadiusOffset() * BackwardDirection; + + out_EndDirection = -StartDirection; + out_End = Start + MidDirection * 2.0f * GetRadiusOffset() * BackwardDirection; + + if (Backward) + { + DrawRadius(out_End, out_EndDirection, Mid, MidDirection, 90); + DrawRadius(Mid, MidDirection, Start, StartDirection, 90); + } + else + { + DrawRadius(Start, StartDirection, Mid, MidDirection, 90); + DrawRadius(Mid, MidDirection, out_End, out_EndDirection, 90); + } +} + +void FENPathDrawer::DrawCorrectionOrtho(const FVector2D& Start, const FVector2D& StartDirection, const float& Displacement, FVector2D& out_End, FVector2D& out_EndDirection, bool Backward) +{ + out_EndDirection = StartDirection; + const FVector2D StartDirectionOrtho = StartDirection.GetRotated(90); + + if (Backward) + { + out_End = Start - 2.0f * StartDirection * GetRadiusOffset() + StartDirectionOrtho * Displacement; + DrawSpline(out_End, out_EndDirection, Start, StartDirection); + } + else + { + out_End = Start + 2.0f * StartDirection * GetRadiusOffset() + StartDirectionOrtho * Displacement; + DrawSpline(out_End, out_EndDirection, Start, StartDirection); + } +} + +float FENPathDrawer::GetRadiusOffset(const int32& AngleDeg, bool Perpendicular) +{ + float RadiusOffset = 1.0f; + int32 AbsAngle = FMath::Abs(AngleDeg); + + if (Perpendicular) + { + AbsAngle = 180 - AbsAngle; + } + + switch (AbsAngle) + { + case 45: + RadiusOffset *= FMath::Sqrt(2.0f) / 2.0f; + break; + case 90: + RadiusOffset *= 1.0f; + break; + case 135: + RadiusOffset *= (1.0f - (FMath::Sqrt(2.0f) / 2.0f)); + break; + case 180: + RadiusOffset *= 2.0f; + break; + default: break; + } + + return RadiusOffset * ZoomFactor * ElectronicNodesSettings.RoundRadius; +} + +float FENPathDrawer::GetRadiusTangent(const int32& AngleDeg) +{ + float Tangent = 2 * FMath::Sqrt(2.0f) - 1; + + switch (FMath::Abs(AngleDeg)) + { + case 0: + Tangent *= 4.0f / Tangent; + break; + case 45: + Tangent *= 0.55166f; + break; + case 90: + Tangent = 4 * (FMath::Sqrt(2.0f) - 1); + break; + case 135: + Tangent *= 2.0f / Tangent; + break; + case 180: + Tangent *= 4.0f / Tangent; + break; + default: break; + } + + return Tangent * ZoomFactor * ElectronicNodesSettings.RoundRadius; +} + +float FENPathDrawer::GetIntersectionOffset(const int32& AngleDeg, bool Diagonal) +{ + float IntersectionOffset = 1.0f; + + switch (FMath::Abs(AngleDeg)) + { + case 45: + if (Diagonal) + { + IntersectionOffset *= (1.0f - FMath::Sqrt(2.0f) / 2.0f) * FMath::Sqrt(2.0f); + } + else + { + IntersectionOffset *= FMath::Sqrt(2.0f) - 1.0f; + } + break; + case 90: + IntersectionOffset *= 1.0f; + break; + case 135: + //RadiusOffset *= (1.0f - (FMath::Sqrt(2.0f) / 2.0f)); + break; + default: + break; + } + + return IntersectionOffset * ZoomFactor * ElectronicNodesSettings.RoundRadius; +} + +void FENPathDrawer::DrawOffset(FVector2D& Start, FVector2D& StartDirection, const float& Offset, bool Backward) +{ + FVector2D NewStart = Start; + + if (Backward) + { + NewStart -= StartDirection * Offset; + DrawLine(NewStart, Start); + } + else + { + NewStart += StartDirection * Offset; + DrawLine(Start, NewStart); + } + + Start = NewStart; +} + +void FENPathDrawer::DrawLine(const FVector2D& Start, const FVector2D& End) +{ + if (FMath::IsNearlyZero((End - Start).SizeSquared(), KINDA_SMALL_NUMBER)) + { + return; + } + + FSlateDrawElement::MakeDrawSpaceSpline(*DrawElementsList, LayerId, + Start, FVector2D::ZeroVector, End, FVector2D::ZeroVector, + Params->WireThickness * ElectronicNodesSettings.WireThickness, ESlateDrawEffect::None, WireColor); + + ConnectionDrawingPolicy->ENComputeClosestPoint(Start, End); + ConnectionDrawingPolicy->ENDrawBubbles(Start, FVector2D::ZeroVector, End, FVector2D::ZeroVector); + if (FVector2D::DistSquared(Start, End) > 50.0f) + { + ConnectionDrawingPolicy->ENDrawArrow(Start, End); + } +} + +void FENPathDrawer::DrawRadius(const FVector2D& Start, const FVector2D& StartDirection, const FVector2D& End, const FVector2D& EndDirection, const int32& AngleDeg) +{ + const float Tangent = GetRadiusTangent(AngleDeg); + const float Offset = GetRadiusOffset(AngleDeg); + + FSlateDrawElement::MakeDrawSpaceSpline(*DrawElementsList, LayerId, + Start, StartDirection * Tangent, End, EndDirection * Tangent, + Params->WireThickness * ElectronicNodesSettings.WireThickness, ESlateDrawEffect::None, WireColor); + + ConnectionDrawingPolicy->ENDrawBubbles(Start, StartDirection * Offset, End, EndDirection * Offset); +} + +void FENPathDrawer::DrawSpline(const FVector2D& Start, const FVector2D& StartDirection, const FVector2D& End, const FVector2D& EndDirection) +{ + const float Tangent = GetRadiusTangent(); + + FSlateDrawElement::MakeDrawSpaceSpline(*DrawElementsList, LayerId, + Start, StartDirection * Tangent, End, EndDirection * Tangent, + Params->WireThickness * ElectronicNodesSettings.WireThickness, ESlateDrawEffect::None, WireColor); + + ConnectionDrawingPolicy->ENComputeClosestPointDefault(Start, StartDirection * Tangent, End, EndDirection * Tangent); + ConnectionDrawingPolicy->ENDrawBubbles(Start, StartDirection * Tangent, End, EndDirection * Tangent); +} + +void FENPathDrawer::DebugColor(const FLinearColor& Color) +{ + if (ElectronicNodesSettings.Debug) + { + WireColor = Color; + } +} diff --git a/Plugins/ElectronicNodes/Source/ElectronicNodes/Private/ENPathDrawer.h b/Plugins/ElectronicNodes/Source/ElectronicNodes/Private/ENPathDrawer.h new file mode 100644 index 0000000..466c08c --- /dev/null +++ b/Plugins/ElectronicNodes/Source/ElectronicNodes/Private/ENPathDrawer.h @@ -0,0 +1,52 @@ +/* Copyright (C) 2021 Hugo ATTAL - All Rights Reserved +* This plugin is downloadable from the UE4 Marketplace +*/ + +#pragma once + +#include "CoreMinimal.h" +#include "ConnectionDrawingPolicy.h" +#include "ENConnectionDrawingPolicy.h" +#include "../Public/ElectronicNodesSettings.h" + +class FENPathDrawer +{ +public: + FENPathDrawer(int32& LayerId, float& ZoomFactor, bool RightPriority, const FConnectionParams* Params, FSlateWindowElementList* DrawElementsList, FENConnectionDrawingPolicy* ConnectionDrawingPolicy); + + void DrawManhattanWire(const FVector2D& Start, const FVector2D& StartDirection, const FVector2D& End, const FVector2D& EndDirection); + void DrawSubwayWire(const FVector2D& Start, const FVector2D& StartDirection, const FVector2D& End, const FVector2D& EndDirection); + void DrawDefaultWire(const FVector2D& Start, const FVector2D& StartDirection, const FVector2D& End, const FVector2D& EndDirection); + + void DrawIntersectionRadius(const FVector2D& Start, const FVector2D& StartDirection, const FVector2D& End, const FVector2D& EndDirection); + void DrawIntersectionDiagRadius(const FVector2D& Start, const FVector2D& StartDirection, const FVector2D& End, const FVector2D& EndDirection); + + void DrawSimpleRadius(const FVector2D& Start, const FVector2D& StartDirection, const int32& AngleDeg, FVector2D& out_End, FVector2D& out_EndDirection, bool Backward = false); + void DrawUTurn(const FVector2D& Start, const FVector2D& StartDirection, float Direction, FVector2D& out_End, FVector2D& out_EndDirection, bool Backward = false); + void DrawCorrectionOrtho(const FVector2D& Start, const FVector2D& StartDirection, const float& Displacement, FVector2D& out_End, FVector2D& out_EndDirection, bool Backward = false); + + float GetRadiusOffset(const int32& AngleDeg = 0, bool Perpendicular = false); + float GetRadiusTangent(const int32& AngleDeg = 0); + float GetIntersectionOffset(const int32& AngleDeg = 0, bool Diagonal = false); + + void DrawOffset(FVector2D& Start, FVector2D& StartDirection, const float& Offset, bool Backward = false); + void DrawLine(const FVector2D& Start, const FVector2D& End); + void DrawRadius(const FVector2D& Start, const FVector2D& StartDirection, const FVector2D& End, const FVector2D& EndDirection, const int32& AngleDeg); + void DrawSpline(const FVector2D& Start, const FVector2D& StartDirection, const FVector2D& End, const FVector2D& EndDirection); + + void DebugColor(const FLinearColor& Color); + +private: + const UElectronicNodesSettings& ElectronicNodesSettings = *GetDefault(); + + int32 LayerId; + float ZoomFactor; + bool RightPriority; + + FLinearColor WireColor; + const FConnectionParams* Params; + FSlateWindowElementList* DrawElementsList; + FENConnectionDrawingPolicy* ConnectionDrawingPolicy; + + int32 MaxDepthWire = 5; +}; diff --git a/Plugins/ElectronicNodes/Source/ElectronicNodes/Private/ElectronicNodes.cpp b/Plugins/ElectronicNodes/Source/ElectronicNodes/Private/ElectronicNodes.cpp new file mode 100644 index 0000000..5db1779 --- /dev/null +++ b/Plugins/ElectronicNodes/Source/ElectronicNodes/Private/ElectronicNodes.cpp @@ -0,0 +1,120 @@ +/* Copyright (C) 2021 Hugo ATTAL - All Rights Reserved +* This plugin is downloadable from the UE4 Marketplace +*/ + +#include "ElectronicNodes.h" +#include "ENConnectionDrawingPolicy.h" +#include "ENCommands.h" +#include "NodeFactory.h" +#include "Interfaces/IPluginManager.h" +#include "Lib/HotPatch.h" +#include "MainFrame/Public/Interfaces/IMainFrameModule.h" +#include "Patch/NodeFactoryPatch.h" +#include "Popup/ENUpdatePopup.h" +#include "SettingsEditor/Public/ISettingsEditorModule.h" + +#define LOCTEXT_NAMESPACE "FElectronicNodesModule" + +void FElectronicNodesModule::StartupModule() +{ + const TSharedPtr ENConnectionFactory = MakeShareable(new FENConnectionDrawingPolicyFactory); + FEdGraphUtilities::RegisterVisualPinConnectionFactory(ENConnectionFactory); + + auto const CommandBindings = FModuleManager::LoadModuleChecked("MainFrame").GetMainFrameCommandBindings(); + ENCommands::Register(); + + CommandBindings->MapAction( + ENCommands::Get().ToggleMasterActivation, + FExecuteAction::CreateRaw(this, &FElectronicNodesModule::ToggleMasterActivation) + ); + + PluginDirectory = IPluginManager::Get().FindPlugin(TEXT("ElectronicNodes"))->GetBaseDir(); + GlobalSettingsFile = PluginDirectory + "/Settings.ini"; + + ElectronicNodesSettings = GetMutableDefault(); + ElectronicNodesSettings->OnSettingChanged().AddRaw(this, &FElectronicNodesModule::ReloadConfiguration); + + if (ElectronicNodesSettings->UseGlobalSettings) + { + if (FPaths::FileExists(GlobalSettingsFile)) + { + ElectronicNodesSettings->LoadConfig(nullptr, *GlobalSettingsFile); + } + } + + if (ElectronicNodesSettings->UseHotPatch) + { +#if PLATFORM_WINDOWS && !UE_BUILD_SHIPPING + FHotPatch::Hook(&FNodeFactory::CreateConnectionPolicy, &FNodeFactoryPatch::CreateConnectionPolicy_Hook); +#endif + } + + if (ElectronicNodesSettings->ActivatePopupOnUpdate) + { + ENUpdatePopup::Register(); + } +} + +#if ENGINE_MAJOR_VERSION == 4 && ENGINE_MINOR_VERSION <= 25 +void FElectronicNodesModule::ReloadConfiguration(FName PropertyName) +#else +void FElectronicNodesModule::ReloadConfiguration(UObject* Object, struct FPropertyChangedEvent& Property) +#endif +{ +#if (ENGINE_MAJOR_VERSION == 4 && ENGINE_MINOR_VERSION > 25) || (ENGINE_MAJOR_VERSION == 5) + const FName PropertyName = Property.GetPropertyName(); +#endif + + if (PropertyName == "UseGlobalSettings") + { + if (ElectronicNodesSettings->UseGlobalSettings) + { + if (FPaths::FileExists(GlobalSettingsFile)) + { + ElectronicNodesSettings->LoadConfig(nullptr, *GlobalSettingsFile); + } + else + { + ElectronicNodesSettings->SaveConfig(CPF_Config, *GlobalSettingsFile); + } + } + } + + if (PropertyName == "UseHotPatch") + { + ISettingsEditorModule* SettingsEditorModule = FModuleManager::GetModulePtr("SettingsEditor"); + if (SettingsEditorModule) + { + SettingsEditorModule->OnApplicationRestartRequired(); + } + } + + if (ElectronicNodesSettings->LoadGlobalSettings) + { + if (FPaths::FileExists(GlobalSettingsFile)) + { + ElectronicNodesSettings->LoadConfig(nullptr, *GlobalSettingsFile); + } + ElectronicNodesSettings->LoadGlobalSettings = false; + } + + ElectronicNodesSettings->SaveConfig(); + + if (ElectronicNodesSettings->UseGlobalSettings) + { + ElectronicNodesSettings->SaveConfig(CPF_Config, *GlobalSettingsFile); + } +} + +void FElectronicNodesModule::ShutdownModule() +{ +} + +void FElectronicNodesModule::ToggleMasterActivation() const +{ + ElectronicNodesSettings->ToggleMasterActivation(); +} + +#undef LOCTEXT_NAMESPACE + +IMPLEMENT_MODULE(FElectronicNodesModule, ElectronicNodes) diff --git a/Plugins/ElectronicNodes/Source/ElectronicNodes/Private/Lib/HotPatch.h b/Plugins/ElectronicNodes/Source/ElectronicNodes/Private/Lib/HotPatch.h new file mode 100644 index 0000000..4e0857c --- /dev/null +++ b/Plugins/ElectronicNodes/Source/ElectronicNodes/Private/Lib/HotPatch.h @@ -0,0 +1,42 @@ +/* Copyright (C) 2021 Hugo ATTAL - All Rights Reserved +* This plugin is downloadable from the UE4 Marketplace +*/ + +#pragma once + +#if PLATFORM_WINDOWS && !UE_BUILD_SHIPPING +#include "Windows/AllowWindowsPlatformTypes.h" + +struct FHotPatch +{ + template + static bool Hook(FunctionType* From, FunctionType* To) + { + uint64* FromAddress = reinterpret_cast(From); + uint64* ToAddress = reinterpret_cast(To); + + uint8 Patch[] = + { + 0x49, 0xBA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x41, 0xFF, 0xE2 + }; + + FMemory::Memcpy(&Patch[2], &ToAddress, sizeof(ToAddress)); + + DWORD BaseProtection; + const DWORD NewProtection = PAGE_EXECUTE_READWRITE; + if (!VirtualProtect(FromAddress, sizeof(Patch), NewProtection, &BaseProtection)) + { + return false; + } + + FMemory::Memcpy(FromAddress, Patch, sizeof(Patch)); + VirtualProtect(FromAddress, sizeof(Patch), BaseProtection, &BaseProtection); + FlushInstructionCache(GetCurrentProcess(), nullptr, 0); + + return true; + } +}; + +#include "Windows/HideWindowsPlatformTypes.h" +#endif diff --git a/Plugins/ElectronicNodes/Source/ElectronicNodes/Private/Patch/NodeFactoryPatch.cpp b/Plugins/ElectronicNodes/Source/ElectronicNodes/Private/Patch/NodeFactoryPatch.cpp new file mode 100644 index 0000000..dee270d --- /dev/null +++ b/Plugins/ElectronicNodes/Source/ElectronicNodes/Private/Patch/NodeFactoryPatch.cpp @@ -0,0 +1,36 @@ +/* Copyright (C) 2021 Hugo ATTAL - All Rights Reserved +* This plugin is downloadable from the UE4 Marketplace +*/ + +#include "NodeFactoryPatch.h" + +#include "ConnectionDrawingPolicy.h" +#include "EdGraphUtilities.h" +#include "ENConnectionDrawingPolicy.h" +#include "AnimationStateMachineSchema.h" +#include "AnimationGraphFactory.h" + +FConnectionDrawingPolicy* FNodeFactoryPatch::CreateConnectionPolicy_Hook(const UEdGraphSchema* Schema, int32 InBackLayerID, int32 InFrontLayerID, float ZoomFactor, const FSlateRect& InClippingRect, FSlateWindowElementList& InDrawElements, UEdGraph* InGraphObj) +{ + const TSharedPtr ENConnectionFactory = MakeShareable(new FENConnectionDrawingPolicyFactory); + + FConnectionDrawingPolicy* ConnectionDrawingPolicy = ENConnectionFactory->CreateConnectionPolicy(Schema, InBackLayerID, InFrontLayerID, ZoomFactor, InClippingRect, InDrawElements, InGraphObj); + + if (!ConnectionDrawingPolicy) + { + ConnectionDrawingPolicy = Schema->CreateConnectionDrawingPolicy(InBackLayerID, InFrontLayerID, ZoomFactor, InClippingRect, InDrawElements, InGraphObj); + } + + if (!ConnectionDrawingPolicy && Schema->IsA(UAnimationStateMachineSchema::StaticClass())) + { + const TSharedPtr AnimationGraphFactory = MakeShareable(new FAnimationGraphPinConnectionFactory); + ConnectionDrawingPolicy = AnimationGraphFactory->CreateConnectionPolicy(Schema, InBackLayerID, InFrontLayerID, ZoomFactor, InClippingRect, InDrawElements, InGraphObj); + } + + if (!ConnectionDrawingPolicy) + { + ConnectionDrawingPolicy = new FConnectionDrawingPolicy(InBackLayerID, InFrontLayerID, ZoomFactor, InClippingRect, InDrawElements); + } + + return ConnectionDrawingPolicy; +} diff --git a/Plugins/ElectronicNodes/Source/ElectronicNodes/Private/Patch/NodeFactoryPatch.h b/Plugins/ElectronicNodes/Source/ElectronicNodes/Private/Patch/NodeFactoryPatch.h new file mode 100644 index 0000000..a33a501 --- /dev/null +++ b/Plugins/ElectronicNodes/Source/ElectronicNodes/Private/Patch/NodeFactoryPatch.h @@ -0,0 +1,14 @@ +/* Copyright (C) 2021 Hugo ATTAL - All Rights Reserved +* This plugin is downloadable from the UE4 Marketplace +*/ + +#pragma once + +#include "CoreMinimal.h" +#include "NodeFactory.h" + +class FNodeFactoryPatch : FNodeFactory +{ +public: + static FConnectionDrawingPolicy* CreateConnectionPolicy_Hook(const UEdGraphSchema* Schema, int32 InBackLayerID, int32 InFrontLayerID, float ZoomFactor, const FSlateRect& InClippingRect, FSlateWindowElementList& InDrawElements, UEdGraph* InGraphObj); +}; diff --git a/Plugins/ElectronicNodes/Source/ElectronicNodes/Private/Policies/ENAnimGraphConnectionDrawingPolicy.h b/Plugins/ElectronicNodes/Source/ElectronicNodes/Private/Policies/ENAnimGraphConnectionDrawingPolicy.h new file mode 100644 index 0000000..bb54343 --- /dev/null +++ b/Plugins/ElectronicNodes/Source/ElectronicNodes/Private/Policies/ENAnimGraphConnectionDrawingPolicy.h @@ -0,0 +1,37 @@ +/* Copyright (C) 2021 Hugo ATTAL - All Rights Reserved +* This plugin is downloadable from the UE4 Marketplace +*/ + +#pragma once + +#include "CoreMinimal.h" +#include "AnimGraphConnectionDrawingPolicy.cpp" +#if ENGINE_MAJOR_VERSION == 5 +#include "AnimationPins/SGraphPinPose.cpp" +#endif +#include "ENConnectionDrawingPolicy.h" + +class FENAnimGraphConnectionDrawingPolicy : public FAnimGraphConnectionDrawingPolicy +{ +public: + FENAnimGraphConnectionDrawingPolicy(int32 InBackLayerID, int32 InFrontLayerID, float ZoomFactor, const FSlateRect& InClippingRect, FSlateWindowElementList& InDrawElements, UEdGraph* InGraphObj) + : FAnimGraphConnectionDrawingPolicy(InBackLayerID, InFrontLayerID, ZoomFactor, InClippingRect, InDrawElements, InGraphObj) + { + this->ConnectionDrawingPolicy = new FENConnectionDrawingPolicy(InBackLayerID, InFrontLayerID, ZoomFactor, InClippingRect, InDrawElements, InGraphObj); + } + + virtual void DrawConnection(int32 LayerId, const FVector2D& Start, const FVector2D& End, const FConnectionParams& Params) override + { + this->ConnectionDrawingPolicy->SetMousePosition(LocalMousePosition); + this->ConnectionDrawingPolicy->DrawConnection(LayerId, Start, End, Params); + SplineOverlapResult = FGraphSplineOverlapResult(this->ConnectionDrawingPolicy->SplineOverlapResult); + } + + ~FENAnimGraphConnectionDrawingPolicy() + { + delete ConnectionDrawingPolicy; + } + +private: + FENConnectionDrawingPolicy* ConnectionDrawingPolicy; +}; diff --git a/Plugins/ElectronicNodes/Source/ElectronicNodes/Private/Policies/ENBehaviorTreeConnectionDrawingPolicy.h b/Plugins/ElectronicNodes/Source/ElectronicNodes/Private/Policies/ENBehaviorTreeConnectionDrawingPolicy.h new file mode 100644 index 0000000..2ee4210 --- /dev/null +++ b/Plugins/ElectronicNodes/Source/ElectronicNodes/Private/Policies/ENBehaviorTreeConnectionDrawingPolicy.h @@ -0,0 +1,102 @@ +/* Copyright (C) 2021 Hugo ATTAL - All Rights Reserved +* This plugin is downloadable from the UE4 Marketplace +*/ + +#pragma once + +#include "CoreMinimal.h" +#include "ENConnectionDrawingPolicy.h" +#include "BehaviorTreeEditor/Private/BehaviorTreeConnectionDrawingPolicy.h" + +class FENBehaviorTreeConnectionDrawingPolicy : public FBehaviorTreeConnectionDrawingPolicy +{ +public: + FENBehaviorTreeConnectionDrawingPolicy(int32 InBackLayerID, int32 InFrontLayerID, float ZoomFactor, const FSlateRect& InClippingRect, FSlateWindowElementList& InDrawElements, UEdGraph* InGraphObj) + : FBehaviorTreeConnectionDrawingPolicy(InBackLayerID, InFrontLayerID, ZoomFactor, InClippingRect, InDrawElements, InGraphObj) + { + this->ConnectionDrawingPolicy = new FENConnectionDrawingPolicy(InBackLayerID, InFrontLayerID, ZoomFactor, InClippingRect, InDrawElements, InGraphObj, true); + } + + virtual void DrawConnection(int32 LayerId, const FVector2D& Start, const FVector2D& End, const FConnectionParams& Params) override + { + this->ConnectionDrawingPolicy->SetMousePosition(LocalMousePosition); + this->ConnectionDrawingPolicy->DrawConnection(LayerId, Start, End, Params); + SplineOverlapResult = FGraphSplineOverlapResult(this->ConnectionDrawingPolicy->SplineOverlapResult); + } + + virtual void DrawSplineWithArrow(const FGeometry& StartGeom, const FGeometry& EndGeom, const FConnectionParams& Params) override + { + const FVector2D StartGeomDrawSize = StartGeom.GetDrawSize(); + const FVector2D StartCenter = FVector2D( + StartGeom.AbsolutePosition.X + StartGeomDrawSize.X / 2, + StartGeom.AbsolutePosition.Y + StartGeomDrawSize.Y); + + const FVector2D EndGeomDrawSize = EndGeom.GetDrawSize(); + const FVector2D EndCenter = FVector2D( + EndGeom.AbsolutePosition.X + EndGeomDrawSize.X / 2, + EndGeom.AbsolutePosition.Y); + + DrawSplineWithArrow(StartCenter, EndCenter, Params); + } + + virtual void DrawPreviewConnector(const FGeometry& PinGeometry, const FVector2D& StartPoint, const FVector2D& EndPoint, UEdGraphPin* Pin) override + { + FConnectionParams Params; + DetermineWiringStyle(Pin, nullptr, /*inout*/ Params); + + if (Pin->Direction == EEdGraphPinDirection::EGPD_Output) + { + const FVector2D GeomDrawSize = PinGeometry.GetDrawSize(); + const FVector2D Center = FVector2D( + PinGeometry.AbsolutePosition.X + GeomDrawSize.X / 2, + PinGeometry.AbsolutePosition.Y + GeomDrawSize.Y); + + DrawSplineWithArrow(Center, EndPoint, Params); + } + else + { + const FVector2D GeomDrawSize = PinGeometry.GetDrawSize(); + const FVector2D Center = FVector2D( + PinGeometry.AbsolutePosition.X + GeomDrawSize.X / 2, + PinGeometry.AbsolutePosition.Y); + + DrawSplineWithArrow(StartPoint, Center, Params); + } + } + + virtual void DrawSplineWithArrow(const FVector2D& StartAnchorPoint, const FVector2D& EndAnchorPoint, const FConnectionParams& Params) override + { + // bUserFlag1 indicates that we need to reverse the direction of connection (used by debugger) + const FVector2D& P0 = Params.bUserFlag1 ? EndAnchorPoint : StartAnchorPoint; + const FVector2D& P1 = Params.bUserFlag1 ? StartAnchorPoint : EndAnchorPoint; + + Internal_DrawLineWithStraightArrow(P0, P1, Params); + } + + void Internal_DrawLineWithStraightArrow(const FVector2D& StartAnchorPoint, const FVector2D& EndAnchorPoint, const FConnectionParams& Params) + { + DrawConnection(WireLayerID, StartAnchorPoint, EndAnchorPoint, Params); + + const FVector2D ArrowDrawPos = EndAnchorPoint - ArrowRadius; + + FSlateDrawElement::MakeRotatedBox( + DrawElementsList, + ArrowLayerID, + FPaintGeometry(ArrowDrawPos, ArrowImage->ImageSize * ZoomFactor, ZoomFactor), + ArrowImage, + ESlateDrawEffect::None, + HALF_PI, + TOptional(), + FSlateDrawElement::RelativeToElement, + Params.WireColor + ); + } + + ~FENBehaviorTreeConnectionDrawingPolicy() + { + delete ConnectionDrawingPolicy; + } + +private: + FENConnectionDrawingPolicy* ConnectionDrawingPolicy; +}; diff --git a/Plugins/ElectronicNodes/Source/ElectronicNodes/Private/Policies/ENControlRigConnectionDrawingPolicy.h b/Plugins/ElectronicNodes/Source/ElectronicNodes/Private/Policies/ENControlRigConnectionDrawingPolicy.h new file mode 100644 index 0000000..1acea43 --- /dev/null +++ b/Plugins/ElectronicNodes/Source/ElectronicNodes/Private/Policies/ENControlRigConnectionDrawingPolicy.h @@ -0,0 +1,34 @@ +/* Copyright (C) 2021 Hugo ATTAL - All Rights Reserved +* This plugin is downloadable from the UE4 Marketplace +*/ + +#pragma once + +#include "CoreMinimal.h" +#include "ENConnectionDrawingPolicy.h" +#include "ControlRigEditor/Private/Graph/ControlRigConnectionDrawingPolicy.cpp" + +class FENControlRigConnectionDrawingPolicy : public FControlRigConnectionDrawingPolicy +{ +public: + FENControlRigConnectionDrawingPolicy(int32 InBackLayerID, int32 InFrontLayerID, float ZoomFactor, const FSlateRect& InClippingRect, FSlateWindowElementList& InDrawElements, UEdGraph* InGraphObj) + : FControlRigConnectionDrawingPolicy(InBackLayerID, InFrontLayerID, ZoomFactor, InClippingRect, InDrawElements, InGraphObj) + { + this->ConnectionDrawingPolicy = new FENConnectionDrawingPolicy(InBackLayerID, InFrontLayerID, ZoomFactor, InClippingRect, InDrawElements, InGraphObj); + } + + virtual void DrawConnection(int32 LayerId, const FVector2D& Start, const FVector2D& End, const FConnectionParams& Params) override + { + this->ConnectionDrawingPolicy->SetMousePosition(LocalMousePosition); + this->ConnectionDrawingPolicy->DrawConnection(LayerId, Start, End, Params); + SplineOverlapResult = FGraphSplineOverlapResult(this->ConnectionDrawingPolicy->SplineOverlapResult); + } + + ~FENControlRigConnectionDrawingPolicy() + { + delete ConnectionDrawingPolicy; + } + +private: + FENConnectionDrawingPolicy* ConnectionDrawingPolicy; +}; diff --git a/Plugins/ElectronicNodes/Source/ElectronicNodes/Private/Popup/ENUpdateConfig.h b/Plugins/ElectronicNodes/Source/ElectronicNodes/Private/Popup/ENUpdateConfig.h new file mode 100644 index 0000000..908704a --- /dev/null +++ b/Plugins/ElectronicNodes/Source/ElectronicNodes/Private/Popup/ENUpdateConfig.h @@ -0,0 +1,22 @@ +/* Copyright (C) 2021 Hugo ATTAL - All Rights Reserved +* This plugin is downloadable from the UE4 Marketplace +*/ + +#pragma once + +#include "Engine/DeveloperSettings.h" +#include "ENUpdateConfig.generated.h" + +UCLASS(config = EditorPerProjectUserSettings) +class ELECTRONICNODES_API UENUpdateConfig : public UDeveloperSettings +{ + GENERATED_BODY() + +public: + UENUpdateConfig() + { + } + + UPROPERTY(config) + FString PluginVersionUpdate = ""; +}; diff --git a/Plugins/ElectronicNodes/Source/ElectronicNodes/Private/Popup/ENUpdatePopup.cpp b/Plugins/ElectronicNodes/Source/ElectronicNodes/Private/Popup/ENUpdatePopup.cpp new file mode 100644 index 0000000..34e68f4 --- /dev/null +++ b/Plugins/ElectronicNodes/Source/ElectronicNodes/Private/Popup/ENUpdatePopup.cpp @@ -0,0 +1,191 @@ +#include "ENUpdatePopup.h" + +#include "ENUpdateConfig.h" +#include "Widgets/Layout/SScrollBox.h" +#include "Widgets/Text/SRichTextBlock.h" +#include "SWebBrowser.h" +#include "Interfaces/IPluginManager.h" + +void ENUpdatePopup::OnBrowserLinkClicked(const FSlateHyperlinkRun::FMetadata& Metadata) +{ + const FString* URL = Metadata.Find(TEXT("href")); + + if (URL) + { + FPlatformProcess::LaunchURL(**URL, nullptr, nullptr); + } +} + +void ENUpdatePopup::Register() +{ + const FString PluginDirectory = IPluginManager::Get().FindPlugin(TEXT("ElectronicNodes"))->GetBaseDir(); + const FString UpdatedConfigFile = PluginDirectory + "/UpdateConfig.ini"; + const FString CurrentPluginVersion = "3.5"; + + UENUpdateConfig* ENUpdatePopupConfig = GetMutableDefault(); + + if (FPaths::FileExists(UpdatedConfigFile)) + { + ENUpdatePopupConfig->LoadConfig(nullptr, *UpdatedConfigFile); + } + else + { + ENUpdatePopupConfig->SaveConfig(CPF_Config, *UpdatedConfigFile); + } + + if (ENUpdatePopupConfig->PluginVersionUpdate != CurrentPluginVersion) + { + ENUpdatePopupConfig->PluginVersionUpdate = CurrentPluginVersion; + ENUpdatePopupConfig->SaveConfig(CPF_Config, *UpdatedConfigFile); + + FCoreDelegates::OnPostEngineInit.AddLambda([]() + { + Open(); + }); + } +} + +void ENUpdatePopup::Open() +{ + if (!FSlateApplication::Get().CanDisplayWindows()) + { + return; + } + + TSharedRef WindowContent = SNew(SBorder) + .BorderImage(FCoreStyle::Get().GetBrush("ToolPanel.GroupBorder")) + .Padding(FMargin(8.0f, 8.0f)); + + TSharedPtr Window = SNew(SWindow) + .AutoCenter(EAutoCenter::PreferredWorkArea) + .SupportsMaximize(false) + .SupportsMinimize(false) + .SizingRule(ESizingRule::FixedSize) + .ClientSize(FVector2D(600, 400)) + .Title(FText::FromString("Electronic Nodes")) + .IsTopmostWindow(true) + [ + WindowContent + ]; + + const FSlateFontInfo HeadingFont = FCoreStyle::GetDefaultFontStyle("Regular", 24); + const FSlateFontInfo ContentFont = FCoreStyle::GetDefaultFontStyle("Regular", 12); + + TSharedRef InnerContent = SNew(SVerticalBox) + // Default settings example + + SVerticalBox::Slot() + .AutoHeight() + .Padding(10) + [ + SNew(STextBlock) + .Font(HeadingFont) + .Text(FText::FromString("Electronic Nodes v3.5")) + ] + + SVerticalBox::Slot() + .FillHeight(1.0) + .Padding(10) + [ + SNew(SBorder) + .Padding(10) + .BorderImage(FEditorStyle::GetBrush("ToolPanel.DarkGroupBorder")) + [ + SNew(SScrollBox) + + SScrollBox::Slot() + [ + SNew(SRichTextBlock) + .Text(FText::FromString(R"( +Hello and thank you for using Electronic Nodes! + +First thing first, if you've been enjoying using it, it would mean a lot if you could just drop a small review on the marketplace page :). I also wanted to mention that I made another plugin to update the UE4 style called Darker Nodes. + +But let's keep it short, here are the cool new features (and bugfixes) of version 3.5! + + +Version 3.5 + +Features + +* Add support for custom graphs (issue #50) + + +Version 3.4 + +Features + +* Add Reference Viewer support (issue #45) +* Add quick restart toast when updating "Use Hot Patch" setting + +Bug fixes + +* Fix hover on short wires (issue #46) +* Fix alignment bug on manhattan wires (issue #42) +* Fix crash on headless mode (issue #43) + + +See complete changelog +)")) + .TextStyle(FEditorStyle::Get(), "NormalText") + .DecoratorStyleSet(&FEditorStyle::Get()) + .AutoWrapText(true) + + SRichTextBlock::HyperlinkDecorator(TEXT("browser"), FSlateHyperlinkRun::FOnClick::CreateStatic(&OnBrowserLinkClicked)) + ] + ] + ] + + SVerticalBox::Slot() + .AutoHeight() + .Padding(10) + [ + SNew(SHorizontalBox) + + SHorizontalBox::Slot().FillWidth(1.0f) + [ + SNew(SButton) + .Text(FText::FromString("Leave a review <3")) + .HAlign(HAlign_Center) + .OnClicked_Lambda([]() + { + const FString URL = "https://bit.ly/2RPhNPl"; + FPlatformProcess::LaunchURL(*URL, nullptr, nullptr); + + return FReply::Handled(); + }) + ] + + SHorizontalBox::Slot().AutoWidth() + [ + SNew(SSpacer) + .Size(FVector2D(20, 10)) + ] + + SHorizontalBox::Slot().FillWidth(1.0f) + [ + SNew(SButton) + .Text(FText::FromString("Discover Darker Nodes")) + .HAlign(HAlign_Center) + .OnClicked_Lambda([]() + { + const FString URL = "https://bit.ly/3vqUdGE"; + FPlatformProcess::LaunchURL(*URL, nullptr, nullptr); + + return FReply::Handled(); + }) + ] + + SHorizontalBox::Slot().AutoWidth() + [ + SNew(SSpacer) + .Size(FVector2D(20, 10)) + ] + + SHorizontalBox::Slot().FillWidth(1.0f) + [ + SNew(SButton) + .Text(FText::FromString("Close this window")) + .HAlign(HAlign_Center) + .OnClicked_Lambda([Window]() + { + Window->RequestDestroyWindow(); + + return FReply::Handled(); + }) + ] + ]; + + WindowContent->SetContent(InnerContent); + Window = FSlateApplication::Get().AddWindow(Window.ToSharedRef()); +} diff --git a/Plugins/ElectronicNodes/Source/ElectronicNodes/Private/Popup/ENUpdatePopup.h b/Plugins/ElectronicNodes/Source/ElectronicNodes/Private/Popup/ENUpdatePopup.h new file mode 100644 index 0000000..15545e0 --- /dev/null +++ b/Plugins/ElectronicNodes/Source/ElectronicNodes/Private/Popup/ENUpdatePopup.h @@ -0,0 +1,10 @@ +#pragma once +#include "Framework/Text/SlateHyperlinkRun.h" + +class ENUpdatePopup +{ +public: + static void Register(); + static void Open(); + static void OnBrowserLinkClicked(const FSlateHyperlinkRun::FMetadata& Metadata); +}; diff --git a/Plugins/ElectronicNodes/Source/ElectronicNodes/Public/ElectronicNodes.h b/Plugins/ElectronicNodes/Source/ElectronicNodes/Public/ElectronicNodes.h new file mode 100644 index 0000000..fe7ec7c --- /dev/null +++ b/Plugins/ElectronicNodes/Source/ElectronicNodes/Public/ElectronicNodes.h @@ -0,0 +1,32 @@ +/* Copyright (C) 2021 Hugo ATTAL - All Rights Reserved +* This plugin is downloadable from the UE4 Marketplace +*/ + +#pragma once + +#include "CoreMinimal.h" + +#include "ElectronicNodesSettings.h" +#include "Modules/ModuleInterface.h" + +class FElectronicNodesModule : public IModuleInterface +{ +public: + + /** IModuleInterface implementation */ + virtual void StartupModule() override; + virtual void ShutdownModule() override; + + void ToggleMasterActivation() const; + +private: + UElectronicNodesSettings* ElectronicNodesSettings = nullptr; + FString PluginDirectory; + FString GlobalSettingsFile; + +#if ENGINE_MAJOR_VERSION == 4 && ENGINE_MINOR_VERSION <= 25 + void ReloadConfiguration(FName PropertyName); +#else + void ReloadConfiguration(UObject* Object, struct FPropertyChangedEvent& Property); +#endif +}; diff --git a/Plugins/ElectronicNodes/Source/ElectronicNodes/Public/ElectronicNodesSettings.h b/Plugins/ElectronicNodes/Source/ElectronicNodes/Public/ElectronicNodesSettings.h new file mode 100644 index 0000000..5c5f174 --- /dev/null +++ b/Plugins/ElectronicNodes/Source/ElectronicNodes/Public/ElectronicNodesSettings.h @@ -0,0 +1,263 @@ +/* Copyright (C) 2021 Hugo ATTAL - All Rights Reserved +* This plugin is downloadable from the UE4 Marketplace +*/ + +#pragma once + +#include "Engine/DeveloperSettings.h" +#include "ElectronicNodesSettings.generated.h" + +UENUM(BlueprintType) +enum class EWireStyle : uint8 +{ + Default, + Manhattan, + Subway +}; + +UENUM(BlueprintType) +enum class EWireAlignment : uint8 +{ + Right, + Left +}; + +UENUM(BlueprintType) +enum class EWirePriority : uint8 +{ + None, + Node, + Pin +}; + +UENUM(BlueprintType) +enum class EBubbleDisplayRule : uint8 +{ + Always, + DisplayOnSelection, + MoveOnSelection +}; + +UENUM(BlueprintType) +enum class ESelectionRule : uint8 +{ + Near, + Far +}; + +UCLASS(config = EditorPerProjectUserSettings, meta = (DisplayName = "Electronic Nodes Plugin")) +class ELECTRONICNODES_API UElectronicNodesSettings : public UDeveloperSettings +{ + GENERATED_BODY() + +public: + UElectronicNodesSettings() + { + CategoryName = TEXT("Plugins"); + SectionName = TEXT("Electronic Nodes Plugin"); + } + + /* -----[ Activation ] ----- */ + + /* Activate or deactivate the whole plugin. Default: true */ + UPROPERTY(config, EditAnywhere, Category = "Activation") + bool MasterActivate = true; + + /* Use global settings across all your projects. When activated, it will load the global settings (overwriting this one). + If no global settings exists, it will create it based on this one. Future updates will then be saved to global settings. */ + UPROPERTY(config, EditAnywhere, Category = "Activation") + bool UseGlobalSettings = false; + + /* Force reload the global settings (if it was modified outside this instance for example). */ + UPROPERTY(config, EditAnywhere, Category = "Activation", meta = (EditCondition = "UseGlobalSettings")) + bool LoadGlobalSettings = false; + + /* Display a popup with changelog on update. Default: tru */ + UPROPERTY(config, EditAnywhere, Category = "Activation") + bool ActivatePopupOnUpdate = true; + + /* Activate Electronic Nodes on Blueprint graphs. Default: true */ + UPROPERTY(config, EditAnywhere, Category = "Activation|Schema", meta = (EditCondition = "MasterActivate")) + bool ActivateOnBlueprint = true; + + /* Activate Electronic Nodes on Material graphs. Default: true */ + UPROPERTY(config, EditAnywhere, Category = "Activation|Schema", meta = (EditCondition = "MasterActivate")) + bool ActivateOnMaterial = true; + + /* Activate Electronic Nodes on Animation graphs. Default: true */ + UPROPERTY(config, EditAnywhere, Category = "Activation|Schema", meta = (EditCondition = "MasterActivate")) + bool ActivateOnAnimation = true; + + /* Activate Electronic Nodes on VoxelPlugin (available on the marketplace). Default: true */ + UPROPERTY(config, EditAnywhere, Category = "Activation|Schema", meta = (EditCondition = "MasterActivate")) + bool ActivateOnVoxelPlugin = true; + + /* Hot patch hardcoded Unreal functions (only available on Windows) to make some more features available. NEED A RESTART OF THE ENGINE! Default: true */ + UPROPERTY(config, EditAnywhere, Category = "Activation|Schema", meta = (EditCondition = "MasterActivate")) + bool UseHotPatch = true; + + /* Activate Electronic Nodes on Niagara. Default: true */ + UPROPERTY(config, EditAnywhere, Category = "Activation|Schema", meta = (EditCondition = "MasterActivate && UseHotPatch")) + bool ActivateOnNiagara = true; + + /* Activate Electronic Nodes on Behavior Tree. Default: false */ + UPROPERTY(config, EditAnywhere, Category = "Activation|Schema", meta = (EditCondition = "MasterActivate && UseHotPatch")) + bool ActivateOnBehaviorTree = true; + + /* Activate Electronic Nodes on Control Rig. Default: true */ + UPROPERTY(config, EditAnywhere, Category = "Activation|Schema", meta = (EditCondition = "MasterActivate && UseHotPatch")) + bool ActivateOnControlRig = true; + + /* Activate Electronic Nodes on Reference Viewer. Default: true */ + UPROPERTY(config, EditAnywhere, Category = "Activation|Schema", meta = (EditCondition = "MasterActivate && UseHotPatch")) + bool ActivateOnReferenceViewer = true; + + /* Activate Electronic Nodes on custom graphs. WARNING: some graphs might need Hot Patch, and some graphs might not work at all */ + UPROPERTY(config, EditAnywhere, Category = "Activation|Schema", meta = (EditCondition = "MasterActivate")) + TArray> CustomGraphSchemas; + + /* Activate Electronic Nodes everywhere, for debugging purpose only. Default: false */ + UPROPERTY(config, EditAnywhere, Category = "Activation|Debug", meta = (EditCondition = "MasterActivate")) + bool ActivateFallback = false; + + /* Display schema name in log. Default: false */ + UPROPERTY(config, EditAnywhere, Category = "Activation|Debug", meta = (EditCondition = "MasterActivate")) + bool DisplaySchemaName = false; + + /* -----[ Wire Style ] ----- */ + + /* Wire style of graph. "Manhattan" is for 90deg angles, "Subway" is for 45deg angles. */ + UPROPERTY(config, EditAnywhere, Category = "Wire Style") + EWireStyle WireStyle = EWireStyle::Subway; + + /* Specify wire alignment. Default: right. */ + UPROPERTY(config, EditAnywhere, Category = "Wire Style") + EWireAlignment WireAlignment = EWireAlignment::Right; + + /* Specify wire alignment priority (when a Node is connected to a Pin). Default: none. */ + UPROPERTY(config, EditAnywhere, Category = "Wire Style") + EWirePriority WirePriority = EWirePriority::None; + + /* Round radius of the wires. Default: 10 */ + UPROPERTY(config, EditAnywhere, Category = "Wire Style") + uint32 RoundRadius = 10; + + /* Thickness of the wire (multiplier). Default: 1 */ + UPROPERTY(config, EditAnywhere, Category = "Wire Style", meta = (ClampMin = "0.0")) + float WireThickness = 1.0f; + + /* Bellow this distance, wires will be drawn as straight. Default: 24 */ + UPROPERTY(config, EditAnywhere, Category = "Wire Style", meta = (ClampMin = "0.0")) + float MinDistanceToStyle = 24.0f; + + /* Horizontal offset of wires from nodes. Default: 16 */ + UPROPERTY(config, EditAnywhere, Category = "Wire Style") + uint32 HorizontalOffset = 16; + + /* Disable the offset for pins. Default: false */ + UPROPERTY(config, EditAnywhere, Category = "Wire Style") + bool DisablePinOffset = false; + + /* Fix default zoomed-out wire displacement. Default: true */ + UPROPERTY(config, EditAnywhere, Category = "Wire Style") + bool FixZoomDisplacement = true; + + /* -----[ Exec Wire Style ] ----- */ + + /* Use a specific draw style for exec wires. Default: false */ + UPROPERTY(config, EditAnywhere, Category = "Exec Wire Style") + bool OverwriteExecWireStyle = false; + + /* Specific wire style for exec wires. Default: Manhattan */ + UPROPERTY(config, EditAnywhere, Category = "Exec Wire Style", meta = (EditCondition = "OverwriteExecWireStyle")) + EWireStyle WireStyleForExec = EWireStyle::Manhattan; + + /* Specify wire alignment for exe wires. Default: right. */ + UPROPERTY(config, EditAnywhere, Category = "Exec Wire Style", meta = (EditCondition = "OverwriteExecWireStyle")) + EWireAlignment WireAlignmentForExec = EWireAlignment::Right; + + /* Specify wire alignment priority (when a Node is connected to a Pin) for exe wires. Default: node. */ + UPROPERTY(config, EditAnywhere, Category = "Exec Wire Style", meta = (EditCondition = "OverwriteExecWireStyle")) + EWirePriority WirePriorityForExec = EWirePriority::Node; + + /* -----[ Ribbon Style ] ----- */ + + /* Activate ribbon cables for overlapping wires. */ + UPROPERTY(config, EditAnywhere, Category = "Ribbon Style (experimental)") + bool ActivateRibbon = false; + + /* Offset between ribbon wires. Default: 4 */ + UPROPERTY(config, EditAnywhere, Category = "Ribbon Style (experimental)", meta = (EditCondition = "ActivateRibbon")) + uint32 RibbonOffset = 4; + + /* Offset of wires when merge into ribbon. Default: 20 */ + UPROPERTY(config, EditAnywhere, Category = "Ribbon Style (experimental)", meta = (EditCondition = "ActivateRibbon")) + uint32 RibbonMergeOffset = 20; + + /* Push the offset outside the node (instead of going for the middle). Default: false */ + UPROPERTY(config, EditAnywhere, Category = "Ribbon Style (experimental)", meta = (EditCondition = "ActivateRibbon")) + bool RibbonPushOutside = false; + + /* -----[ Bubble Style ] ----- */ + + /* Show moving bubbles on the wires. Default: false */ + UPROPERTY(config, EditAnywhere, Category = "Bubbles Style") + bool ForceDrawBubbles = false; + + /* Display rules to show/move bubbles only near selected nodes. Default: Always */ + UPROPERTY(config, EditAnywhere, Category = "Bubbles Style", meta = (EditCondition = "ForceDrawBubbles")) + EBubbleDisplayRule BubbleDisplayRule = EBubbleDisplayRule::Always; + + /* If selection only consider close nodes (near) or every related nodes (far). Default: Near */ + UPROPERTY(config, EditAnywhere, Category = "Bubbles Style", meta = (EditCondition = "ForceDrawBubbles")) + ESelectionRule SelectionRule = ESelectionRule::Near; + + /* Disable bubbles above a certain zoom level. Default: -2 */ + UPROPERTY(config, EditAnywhere, Category = "Bubbles Style", meta = (EditCondition = "ForceDrawBubbles", ClampMin = "-12", ClampMax = "7")) + int32 BubbleZoomThreshold = -2; + + /* Size of bubbles on the wires. Default: 2.0 */ + UPROPERTY(config, EditAnywhere, Category = "Bubbles Style", meta = (EditCondition = "ForceDrawBubbles", ClampMin = "1.0")) + float BubbleSize = 2.0f; + + /* Speed of bubbles on the wires. Default: 4.0 */ + UPROPERTY(config, EditAnywhere, Category = "Bubbles Style", meta = (EditCondition = "ForceDrawBubbles", ClampMin = "0.0")) + float BubbleSpeed = 4.0f; + + /* Space between bubbles on the wires. Default: 20.0 */ + UPROPERTY(config, EditAnywhere, Category = "Bubbles Style", meta = (EditCondition = "ForceDrawBubbles", ClampMin = "10.0")) + float BubbleSpace = 20.0f; + + bool Debug = false; + + /* Internal value to fix elements on plugin update. */ + UPROPERTY(config) + FString PluginVersionUpdate = ""; + + virtual FName GetContainerName() const override + { + return "Editor"; + } + + void ToggleMasterActivation() + { + MasterActivate = !MasterActivate; + } + +#if ENGINE_MAJOR_VERSION == 4 && ENGINE_MINOR_VERSION <= 25 + DECLARE_EVENT_OneParam(UDarkerNodesSettings, FSettingChangedEvent, FName); + FSettingChangedEvent& OnSettingChanged( ) { return SettingChangedEvent; } + + virtual void PostEditChangeProperty(struct FPropertyChangedEvent& PropertyChangedEvent) override + { + Super::PostEditChangeProperty(PropertyChangedEvent); + + const FName Name = (PropertyChangedEvent.Property != nullptr) ? PropertyChangedEvent.Property->GetFName() : NAME_None; + SettingChangedEvent.Broadcast(Name); + } + + private: + + FSettingChangedEvent SettingChangedEvent; +#endif +}; diff --git a/Plugins/ElectronicNodes/UpdateConfig.ini b/Plugins/ElectronicNodes/UpdateConfig.ini new file mode 100644 index 0000000..329bc47 --- /dev/null +++ b/Plugins/ElectronicNodes/UpdateConfig.ini @@ -0,0 +1,3 @@ +[/Script/ElectronicNodes.ENUpdateConfig] +PluginVersionUpdate=3.5 + diff --git a/Plugins/FileSDK/FileSDK.uplugin b/Plugins/FileSDK/FileSDK.uplugin new file mode 100644 index 0000000..f72c7d3 --- /dev/null +++ b/Plugins/FileSDK/FileSDK.uplugin @@ -0,0 +1,30 @@ +{ + "FileVersion": 3, + "Version": 16, + "VersionName": "1.16", + "FriendlyName": "Blueprint FileSDK", + "Description": "A simple plugin to interact with files and folders within blueprints.", + "Category": "Code Plugins", + "CreatedBy": "Incanta Games", + "CreatedByURL": "https://incanta.games", + "DocsURL": "https://wiki.incanta.games/plugins/filesdk", + "MarketplaceURL": "com.epicgames.launcher://ue/marketplace/product/4f737815666c4e7dabf2043fb55a8419", + "SupportURL": "https://discord.gg/cDcP3rBBUc", + "EngineVersion": "4.27.0", + "CanContainContent": false, + "Installed": true, + "Modules": [ + { + "Name": "FileSDK", + "Type": "Runtime", + "LoadingPhase": "PreLoadingScreen", + "WhitelistPlatforms": [ + "Win64", + "Win32", + "Mac", + "Linux", + "LinuxAArch64" + ] + } + ] +} \ No newline at end of file diff --git a/Plugins/FileSDK/LICENSE b/Plugins/FileSDK/LICENSE new file mode 100644 index 0000000..339268f --- /dev/null +++ b/Plugins/FileSDK/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Incanta Games + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Plugins/FileSDK/README.md b/Plugins/FileSDK/README.md new file mode 100644 index 0000000..a1cdc33 --- /dev/null +++ b/Plugins/FileSDK/README.md @@ -0,0 +1,37 @@ +# Unreal Blueprint FileSDK + +This is an Unreal Engine plugin to give you blueprint nodes for various File IO/Management tasks. + +Some, but not all, of the things this plugin lets you do: +- Read/write files as text or binary +- Random access file reading (read a specific part of the file and not all of it) +- Read directory contents with detailed file info +- Search directories for files/directories +- Rename files/directories +- Copy files/directories + +## Documentation + +Find a full, detailed list of all the different blueprint nodes this plugin provides at https://wiki.incanta.games/plugins/filesdk + +## Marketplace + +This asset is available **FOR FREE** on the Unreal Engine Marketplace at https://www.unrealengine.com/marketplace/en-US/product/blueprint-file-sdk. + +Any and all enhancements will be made to this plugin and will continue to be free; there won't be a "paid pro version." We don't believe in the whole bait-and-switch ploy. We hope you enjoy it! + +## Follow Us! + +Checkout the below links if you want to make sure you get the latest and greatest news from Incanta Games: +- Twitter: https://twitter.com/IncantaGames +- Discord: https://discord.gg/cDcP3rBBUc + +## Support + +We have a Discord server where you can get expedited support for both issues and feature requests: https://discord.gg/cDcP3rBBUc + +You can also make an issue on this GitHub repository: https://github.com/IncantaGames/unreal-bp-file-sdk/issues + +## Donations + +Here at Incanta Games, we strongly believe that content should be available for indie developers at a reasonable price. Lots of other vendors price gouge to take advantage of devs who don't have the chops to do some coding. We continue to strive to help you bring magic to the world in your games by making sure plugins are reasonably cheap or free. We'll keep doing this, but if you want to help support this mission you can give us a tip at https://ko-fi.com/incanta. Any and all donations are much appreciated and help us continue to make more awesome content for you! diff --git a/Plugins/FileSDK/Source/FileSDK/FileSDK.Build.cs b/Plugins/FileSDK/Source/FileSDK/FileSDK.Build.cs new file mode 100644 index 0000000..bce753d --- /dev/null +++ b/Plugins/FileSDK/Source/FileSDK/FileSDK.Build.cs @@ -0,0 +1,46 @@ +// Copyright Incanta Games 2020. All Rights Reserved. + +using UnrealBuildTool; + +public class FileSDK : ModuleRules { + public FileSDK(ReadOnlyTargetRules Target) : base(Target) { + PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs; + + PublicIncludePaths.AddRange( + new string[] { + } + ); + + + PrivateIncludePaths.AddRange( + new string[] { + } + ); + + + PublicDependencyModuleNames.AddRange( + new string[] + { + "Core", + } + ); + + + PrivateDependencyModuleNames.AddRange( + new string[] + { + "CoreUObject", + "Engine", + "Slate", + "SlateCore", + } + ); + + + DynamicallyLoadedModuleNames.AddRange( + new string[] + { + } + ); + } +} diff --git a/Plugins/FileSDK/Source/FileSDK/Private/FileSDK.cpp b/Plugins/FileSDK/Source/FileSDK/Private/FileSDK.cpp new file mode 100644 index 0000000..5d4ffe8 --- /dev/null +++ b/Plugins/FileSDK/Source/FileSDK/Private/FileSDK.cpp @@ -0,0 +1,20 @@ +// Copyright Incanta Games 2020. All Rights Reserved. + +#include "FileSDK.h" + +#define LOCTEXT_NAMESPACE "FFileSDKModule" + +DEFINE_LOG_CATEGORY(LogFileSDK); + +void FFileSDKModule::StartupModule() { + // This code will execute after your module is loaded into memory; the exact timing is specified in the .uplugin file per-module +} + +void FFileSDKModule::ShutdownModule() { + // This function may be called during shutdown to clean up your module. For modules that support dynamic reloading, + // we call this function before unloading the module. +} + +#undef LOCTEXT_NAMESPACE + +IMPLEMENT_MODULE(FFileSDKModule, FileSDK) \ No newline at end of file diff --git a/Plugins/FileSDK/Source/FileSDK/Private/FileSDKBPLibrary.cpp b/Plugins/FileSDK/Source/FileSDK/Private/FileSDKBPLibrary.cpp new file mode 100644 index 0000000..98b789e --- /dev/null +++ b/Plugins/FileSDK/Source/FileSDK/Private/FileSDKBPLibrary.cpp @@ -0,0 +1,613 @@ +// Copyright Incanta Games 2020. All Rights Reserved. + +#include "FileSDKBPLibrary.h" + +UFileSDKBPLibrary::UFileSDKBPLibrary( + const FObjectInitializer& ObjectInitializer +) : Super(ObjectInitializer) { + // +} + +UFileSDKFileReader * UFileSDKBPLibrary::OpenFileReader( + FString FileName, + bool OpenInBinaryMode +) { + UFileSDKFileReader * fileReader = NewObject(); + fileReader->OpenFile(FileName, OpenInBinaryMode); + return fileReader; +} + +void UFileSDKBPLibrary::CreateFile( + FString FileName, + bool ClearContentsIfExists, + bool CreateDirectoryTree +) { + IPlatformFile & PlatformFile = FPlatformFileManager::Get().GetPlatformFile(); + + FString directoryName = FPaths::GetPath(FileName); + bool directoryExists = PlatformFile.DirectoryExists(*directoryName); + + if (!directoryExists && CreateDirectoryTree) { + FFileManagerGeneric::Get().MakeDirectory(*directoryName, true); + } else if (!directoryExists) { + UE_LOG( + LogFileSDK, + Fatal, + TEXT("Cannot create file %s because directory %s doesn't exist. Ensure the directory exists before or enable 'CreateDirectoryTree'"), + *FileName, + *directoryName + ); + } + + bool fileExists = PlatformFile.FileExists(*FileName); + + if ((ClearContentsIfExists && fileExists) || !fileExists) { + FFileHelper::SaveStringToFile(FString(), *FileName); + } +} + +bool UFileSDKBPLibrary::DeleteFile(FString FileName) { + IPlatformFile & PlatformFile = FPlatformFileManager::Get().GetPlatformFile(); + + if (PlatformFile.FileExists(*FileName)) { + return FFileManagerGeneric::Get().Delete(*FileName); + } else { + return false; + } +} + +bool UFileSDKBPLibrary::CreateDirectory( + FString DirectoryName, + bool CreateDirectoryTree +) { + return FFileManagerGeneric::Get().MakeDirectory(*DirectoryName, CreateDirectoryTree); +} + +bool UFileSDKBPLibrary::DeleteDirectory( + FString DirectoryName, + bool Recursive +) { + return FFileManagerGeneric::Get().DeleteDirectory(*DirectoryName, false, Recursive); +} + +bool UFileSDKBPLibrary::RenameFileOrDirectory( + FString Source, + FString Destination +) { + IPlatformFile & PlatformFile = FPlatformFileManager::Get().GetPlatformFile(); + + return PlatformFile.MoveFile(*Destination, *Source); +} + +bool UFileSDKBPLibrary::CopyFile( + FString Source, + FString Destination, + const FFileSDKCopyDelegate & ProgressCallback, + FFileSDKDelegatePreInfo PreInfo, + int ChunkSizeInKilobytes, + bool OverwriteDestination +) { + IPlatformFile & PlatformFile = FPlatformFileManager::Get().GetPlatformFile(); + + const int64 MaxBufferSize = ChunkSizeInKilobytes * 1024; + + // Note, the below code is mostly copied from the + // engine's GenericPlatformFile.cpp source file + + if (PlatformFile.FileExists(*Destination) && !OverwriteDestination) { + return false; + } + + TUniquePtr FromFile(PlatformFile.OpenRead(*Source, false)); + if (!FromFile) { + return false; + } + + TUniquePtr ToFile(PlatformFile.OpenWrite(*Destination, false, false)); + if (!ToFile) { + return false; + } + + int64 Size = FromFile->Size(); + int totalSizeKb = FMath::DivideAndRoundUp(Size, int64(1000)); + if (Size < 1) { + check(Size == 0); + return true; + } + + int64 AllocSize = FMath::Min(MaxBufferSize, Size); + check(AllocSize); + + uint8* Buffer = (uint8*)FMemory::Malloc(int32(AllocSize)); + check(Buffer); + + while (Size) { + int64 ThisSize = FMath::Min(AllocSize, Size); + FromFile->Read(Buffer, ThisSize); + ToFile->Write(Buffer, ThisSize); + Size -= ThisSize; + ProgressCallback.ExecuteIfBound( + PreInfo.PriorWritten + totalSizeKb - FMath::DivideAndRoundUp(Size, int64(1000)), + PreInfo.TotalSize > 0 ? PreInfo.TotalSize : totalSizeKb + ); + check(Size >= 0); + } + + FMemory::Free(Buffer); + +#if PLATFORM_MAC || PLATFORM_IOS + // Copied from ApplePlatformFile.cpp which has this extra implementation + // copied the contents of ApplePlatformFile::Stat since it's a private method + // hacky, but it does the job. the original code hasn't changed in 7 years. + // also using FPaths::NormalizeFilename since it's the exact same as + // ApplePlatformFile::NormalizeFilename (which is protected) + + struct stat FileInfo; + FString normalizedSource(Source); + FString normalizedDestination(Destination); + + FPaths::NormalizeFilename(normalizedSource); + FPaths::NormalizeFilename(normalizedDestination); + + if (stat(TCHAR_TO_UTF8(*normalizedSource), &FileInfo) == 0) { + FileInfo.st_mode |= S_IWUSR; + + chmod(TCHAR_TO_UTF8(*normalizedDestination), FileInfo.st_mode); + } +#endif + + return true; +} + +void UFileSDKBPLibrary::CopyFileAsync( + FString Source, + FString Destination, + const FFileSDKCopyDelegate & ProgressCallback, + FFileSDKDelegatePreInfo PreInfo, + int ChunkSizeInKilobytes +) { + FFunctionGraphTask::CreateAndDispatchWhenReady( + [=] { + UFileSDKBPLibrary::CopyFile( + Source, + Destination, + ProgressCallback, + PreInfo, + ChunkSizeInKilobytes + ); + }, + TStatId(), + nullptr, + ENamedThreads::AnyThread + ); +} + +bool UFileSDKBPLibrary::CopyDirectory( + FString Source, + FString Destination, + const FFileSDKCopyDelegate & ProgressCallback, + bool OverwriteDestination, + int ChunkSizeInKilobytes +) { + IPlatformFile & PlatformFile = FPlatformFileManager::Get().GetPlatformFile(); + + // Note, the below code is mostly copied from the + // engine's GenericPlatformFile.cpp source file + + check(*Destination); + check(*Source); + + FString DestDir(Destination); + FPaths::NormalizeDirectoryName(DestDir); + + FString SourceDir(Source); + FPaths::NormalizeDirectoryName(SourceDir); + + // Does Source dir exist? + if (!PlatformFile.DirectoryExists(*SourceDir)) { + return false; + } + + // Destination directory exists already or can be created ? + if ( + !PlatformFile.DirectoryExists(*DestDir) && + !PlatformFile.CreateDirectory(*DestDir) + ) { + return false; + } + + // Get total size + struct FStatFilesAndDirs : public IPlatformFile::FDirectoryStatVisitor { + IPlatformFile & PlatformFile; + int64 TotalFileSize; + + FStatFilesAndDirs(IPlatformFile& InPlatformFile) + : PlatformFile(InPlatformFile) + , TotalFileSize(0) { + } + + virtual bool Visit(const TCHAR* FilenameOrDirectory, const FFileStatData& StatData) { + if (!StatData.bIsDirectory) { + TotalFileSize += StatData.FileSize; + } + + return true; + } + }; + + // copy files and directories visitor + FStatFilesAndDirs StatFilesAndDirs(PlatformFile); + + // don't bother getting file size of dir + // if the user doesn't want it + if (ProgressCallback.IsBound()) { + bool statResult = PlatformFile.IterateDirectoryStatRecursively(*SourceDir, StatFilesAndDirs); + + if (!statResult) { + return false; + } + } + + // Copy all files and directories + struct FCopyFilesAndDirs : public IPlatformFile::FDirectoryVisitor { + IPlatformFile & PlatformFile; + const TCHAR* SourceRoot; + const TCHAR* DestRoot; + bool bOverwrite; + int chunkSizeInKilobytes; + FFileSDKCopyDelegate progressCallback; + FFileSDKDelegatePreInfo preInfo; + + FCopyFilesAndDirs( + IPlatformFile& InPlatformFile, + const TCHAR* InSourceRoot, + const TCHAR* InDestRoot, + bool bInOverwrite, + int inChunkSizeInKilobytes, + FFileSDKCopyDelegate inProgressCallback, + int inTotalSizeKB + ) : + PlatformFile(InPlatformFile), + SourceRoot(InSourceRoot), + DestRoot(InDestRoot), + bOverwrite(bInOverwrite), + chunkSizeInKilobytes(inChunkSizeInKilobytes), + progressCallback(inProgressCallback) { + preInfo.TotalSize = inTotalSizeKB; + preInfo.PriorWritten = 0; + } + + virtual bool Visit(const TCHAR* FilenameOrDirectory, bool bIsDirectory) { + FString NewName(FilenameOrDirectory); + // change the root + NewName = NewName.Replace(SourceRoot, DestRoot); + + if (bIsDirectory) { + // create new directory structure + if (!PlatformFile.CreateDirectoryTree(*NewName) && !PlatformFile.DirectoryExists(*NewName)) { + return false; + } + } else { + // Delete destination file if it exists and we are overwriting + if (!PlatformFile.FileExists(*NewName) || bOverwrite) { + // Copy file from source + if ( + !UFileSDKBPLibrary::CopyFile( + FilenameOrDirectory, + NewName, + progressCallback, + preInfo, + chunkSizeInKilobytes + ) + ) { + // Not all files could be copied + return false; + } + } + + if (progressCallback.IsBound()) { + auto statData = PlatformFile.GetStatData(FilenameOrDirectory); + preInfo.PriorWritten += FMath::DivideAndRoundUp(statData.FileSize, int64(1000)); + } + } + return true; // continue searching + } + }; + + // copy files and directories visitor + FCopyFilesAndDirs CopyFilesAndDirs( + PlatformFile, + *SourceDir, + *DestDir, + OverwriteDestination, + ChunkSizeInKilobytes, + ProgressCallback, + FMath::DivideAndRoundUp(StatFilesAndDirs.TotalFileSize, int64(1000)) + ); + + // create all files subdirectories and files in subdirectories! + return PlatformFile.IterateDirectoryRecursively(*SourceDir, CopyFilesAndDirs); +} + +void UFileSDKBPLibrary::CopyDirectoryAsync( + FString Source, + FString Destination, + const FFileSDKCopyDelegate & ProgressCallback, + bool OverwriteDestination, + int ChunkSizeInKilobytes +) { + FFunctionGraphTask::CreateAndDispatchWhenReady( + [=] { + UFileSDKBPLibrary::CopyDirectory( + Source, + Destination, + ProgressCallback, + OverwriteDestination, + ChunkSizeInKilobytes + ); + }, + TStatId(), + nullptr, + ENamedThreads::AnyThread + ); +} + +bool UFileSDKBPLibrary::ReadStringFromFile(FString FileName, FString & Content) { + return FFileHelper::LoadFileToString(Content, *FileName); +} + +bool UFileSDKBPLibrary::ReadLinesFromFile( + FString FileName, + TSubclassOf LineReader, + TArray & Lines +) { + bool result = false; + + if (LineReader.GetDefaultObject() != nullptr) { + auto reader = NewObject( + (UObject*) GetTransientPackage(), + *LineReader + ); + + result = FFileHelper::LoadFileToStringArrayWithPredicate( + Lines, + *FileName, + [reader](const FString & line) { return reader->FilterLine(line); } + ); + } else { + result = FFileHelper::LoadFileToStringArrayWithPredicate( + Lines, + *FileName, + [](const FString&) { return true; } + ); + } + + return result; +} + +bool UFileSDKBPLibrary::WriteStringToFile( + FString FileName, + FString Content, + bool Append, + EFileSDKEncodingOptions Encoding +) { + FFileHelper::EEncodingOptions internalEncoding; + switch (Encoding) { + case EFileSDKEncodingOptions::AutoDetect: { + internalEncoding = FFileHelper::EEncodingOptions::AutoDetect; + break; + } + case EFileSDKEncodingOptions::ForceAnsi: { + internalEncoding = FFileHelper::EEncodingOptions::ForceAnsi; + break; + } + case EFileSDKEncodingOptions::ForceUnicode: { + internalEncoding = FFileHelper::EEncodingOptions::ForceUnicode; + break; + } + case EFileSDKEncodingOptions::ForceUTF8: { + internalEncoding = FFileHelper::EEncodingOptions::ForceUTF8; + break; + } + case EFileSDKEncodingOptions::ForceUTF8WithoutBOM: { + internalEncoding = FFileHelper::EEncodingOptions::ForceUTF8WithoutBOM; + break; + } + default: { + internalEncoding = FFileHelper::EEncodingOptions::AutoDetect; + break; + } + } + + if (Append) { + return FFileHelper::SaveStringToFile( + Content, + *FileName, + internalEncoding, + &IFileManager::Get(), + std::ios_base::app + ); + } else { + return FFileHelper::SaveStringToFile(Content, *FileName, internalEncoding); + } +} + +bool UFileSDKBPLibrary::WriteBytesToFile(FString FileName, TArray Content) { + return FFileHelper::SaveArrayToFile(Content, *FileName); +} + +bool UFileSDKBPLibrary::ReadBytesFromFile(FString FileName, TArray & Content) { + return FFileHelper::LoadFileToArray(Content, *FileName); +} + +TArray UFileSDKBPLibrary::GetFilesFromDirectory( + FString DirectoryToSearch, + FString FilterFilesWithExtension, + bool SearchSubfolders, + EFileSDKFileType FileType +) { + TArray FileNames; + IFileManager & FileManager = IFileManager::Get(); + + if (SearchSubfolders) { + if (FileType == EFileSDKFileType::File) { + FileManager.FindFilesRecursive( + FileNames, + *DirectoryToSearch, + *(TEXT("*") + FilterFilesWithExtension), + true, + false + ); + } else { + FileManager.FindFilesRecursive( + FileNames, + *DirectoryToSearch, + TEXT("*"), + false, + true + ); + } + } else { + TArray relativeFileNames; + + if (FileType == EFileSDKFileType::File) { + FileManager.FindFiles( + relativeFileNames, + *DirectoryToSearch, + *FilterFilesWithExtension + ); + } else { + FileManager.FindFiles( + relativeFileNames, + *(DirectoryToSearch + FGenericPlatformMisc::GetDefaultPathSeparator() + TEXT("*")), + false, + true + ); + } + + for (FString fileName : relativeFileNames) { + FileNames.Add( + DirectoryToSearch + + FGenericPlatformMisc::GetDefaultPathSeparator() + + fileName + ); + } + } + + return FileNames; +} + +TArray UFileSDKBPLibrary::GetDirectoryContentsWithFileInfo( + FString Directory, + bool SearchSubfolders +) { + TArray contents; + IFileManager & FileManager = IFileManager::Get(); + + TArray filePaths; + if (SearchSubfolders) { + FileManager.FindFilesRecursive( + filePaths, + *Directory, + TEXT("*"), + true, + true + ); + } else { + TArray relativeFileNames; + + FileManager.FindFiles( + relativeFileNames, + *(Directory + FGenericPlatformMisc::GetDefaultPathSeparator() + TEXT("*")), + true, + true + ); + + for (FString fileName : relativeFileNames) { + filePaths.Add( + Directory + + FGenericPlatformMisc::GetDefaultPathSeparator() + + fileName + ); + } + } + + for (FString path : filePaths) { + FFileSDKFileInfo info; + info.AbsolutePath = path; + info.Filename = FPaths::GetCleanFilename(path); + UFileSDKBPLibrary::GetFileOrDirectoryInfo(path, info); + contents.Add(info); + } + + return contents; +} + +void UFileSDKBPLibrary::GetFileOrDirectoryInfo(FString Path, FFileSDKFileInfo & Info) { + IPlatformFile & PlatformFile = FPlatformFileManager::Get().GetPlatformFile(); + + FFileStatData data = PlatformFile.GetStatData(*Path); + + Info.AbsolutePath = Path; + Info.Filename = FPaths::GetCleanFilename(Path); + Info.CreationTime = data.CreationTime; + Info.AccessTime = data.AccessTime; + Info.ModificationTime = data.ModificationTime; + Info.FileSize = data.FileSize; + Info.bIsDirectory = data.bIsDirectory; + Info.bIsReadOnly = data.bIsReadOnly; + Info.bIsValid = data.bIsValid; +} + +FString UFileSDKBPLibrary::GetCurrentUsername() { +#if PLATFORM_WINDOWS + return FWindowsPlatformMisc::GetEnvironmentVariable(ANSI_TO_TCHAR("USERNAME")); +#elif PLATFORM_LINUX + return FUnixPlatformMisc::GetEnvironmentVariable(ANSI_TO_TCHAR("USER")); +#elif PLATFORM_MAC + return FApplePlatformMisc::GetEnvironmentVariable(ANSI_TO_TCHAR("USER")); +#else + return "PLATFORM_NOT_SUPPORTED"; +#endif +} + +FString UFileSDKBPLibrary::GetCurrentUserHomeDirectory() { +#if PLATFORM_WINDOWS + return FWindowsPlatformMisc::GetEnvironmentVariable(ANSI_TO_TCHAR("HOMEDRIVE")) + FWindowsPlatformMisc::GetEnvironmentVariable(ANSI_TO_TCHAR("HOMEPATH")); +#elif PLATFORM_LINUX + return FUnixPlatformMisc::GetEnvironmentVariable(ANSI_TO_TCHAR("HOME")); +#elif PLATFORM_MAC + return FApplePlatformMisc::GetEnvironmentVariable(ANSI_TO_TCHAR("HOME")); +#else + return "PLATFORM_NOT_SUPPORTED"; +#endif +} + +FString UFileSDKBPLibrary::GetEnvironmentVariable(FString VariableName) { +#if PLATFORM_WINDOWS + return FWindowsPlatformMisc::GetEnvironmentVariable(*VariableName); +#elif PLATFORM_LINUX + return FUnixPlatformMisc::GetEnvironmentVariable(*VariableName); +#elif PLATFORM_MAC + return FApplePlatformMisc::GetEnvironmentVariable(*VariableName); +#else + return "PLATFORM_NOT_SUPPORTED"; +#endif +} + +std::ios_base::seekdir UFileSDKBPLibrary::FileAnchorToSeekDir( + EFileSDKFileAnchor Anchor +) { + switch (Anchor) { + case EFileSDKFileAnchor::Beginning: { + return std::ios_base::beg; + } + case EFileSDKFileAnchor::Current: { + return std::ios_base::cur; + } + case EFileSDKFileAnchor::End: + default: { + return std::ios_base::end; + } + } +} diff --git a/Plugins/FileSDK/Source/FileSDK/Private/FileSDKCopyFileAsync.cpp b/Plugins/FileSDK/Source/FileSDK/Private/FileSDKCopyFileAsync.cpp new file mode 100644 index 0000000..52e6261 --- /dev/null +++ b/Plugins/FileSDK/Source/FileSDK/Private/FileSDKCopyFileAsync.cpp @@ -0,0 +1,66 @@ +// Copyright Incanta Games 2021. All Rights Reserved. + +#include "FileSDKCopyFileAsync.h" + +void UFileSDKCopyFileAsync::Activate() { + FFileSDKFileInfo fileInfo; + UFileSDKBPLibrary::GetFileOrDirectoryInfo(Source, fileInfo); + + if (fileInfo.bIsDirectory) { + FFunctionGraphTask::CreateAndDispatchWhenReady( + [=] { + auto successful = UFileSDKBPLibrary::CopyDirectory( + Source, + Destination, + ProgressCallback, + OverwriteDestination, + ChunkSizeInKilobytes + ); + + Completed.Broadcast(successful); + }, + TStatId(), + nullptr, + ENamedThreads::AnyThread + ); + } else { + FFileSDKDelegatePreInfo PreInfo; + FFunctionGraphTask::CreateAndDispatchWhenReady( + [=] { + auto successful = UFileSDKBPLibrary::CopyFile( + Source, + Destination, + ProgressCallback, + PreInfo, + ChunkSizeInKilobytes, + OverwriteDestination + ); + + Completed.Broadcast(successful); + }, + TStatId(), + nullptr, + ENamedThreads::AnyThread + ); + } +} + +UFileSDKCopyFileAsync* UFileSDKCopyFileAsync::CopyFileAsync( + UObject* WorldContextObject, + FString Source, + FString Destination, + const FFileSDKCopyDelegate & ProgressCallback, + bool OverwriteDestination, + int ChunkSizeInKilobytes +) { + // Create Action Instance for Blueprint System + UFileSDKCopyFileAsync* Action = NewObject(); + Action->Source = Source; + Action->Destination = Destination; + Action->ProgressCallback = ProgressCallback; + Action->OverwriteDestination = OverwriteDestination; + Action->ChunkSizeInKilobytes = ChunkSizeInKilobytes; + Action->RegisterWithGameInstance(WorldContextObject); + + return Action; +} \ No newline at end of file diff --git a/Plugins/FileSDK/Source/FileSDK/Private/FileSDKFileReader.cpp b/Plugins/FileSDK/Source/FileSDK/Private/FileSDKFileReader.cpp new file mode 100644 index 0000000..de0a8e5 --- /dev/null +++ b/Plugins/FileSDK/Source/FileSDK/Private/FileSDKFileReader.cpp @@ -0,0 +1,102 @@ +// Copyright Incanta Games 2020. All Rights Reserved. + +#include "FileSDKFileReader.h" +#include "FileSDKBPLibrary.h" + +UFileSDKFileReader::UFileSDKFileReader( + const FObjectInitializer& ObjectInitializer +) : Super(ObjectInitializer) { + // +} + +void UFileSDKFileReader::OpenFile( + FString fileName, + bool OpenInBinaryMode +) { + this->FileName = fileName; + this->BinaryMode = OpenInBinaryMode; + this->fileReader = new std::ifstream(); + if (OpenInBinaryMode) { + this->fileReader->open(TCHAR_TO_UTF8(*fileName), std::ios_base::in | std::ios_base::binary); + } else { + this->fileReader->open(TCHAR_TO_UTF8(*fileName), std::ios_base::in); + } +} + +bool UFileSDKFileReader::IsGood() { + return this->fileReader && this->fileReader->good(); +} + +bool UFileSDKFileReader::SeekFilePosition( + EFileSDKFileAnchor Anchor, + int Offset +) { + if (this->fileReader && this->fileReader->good()) { + this->fileReader->seekg( + Offset, + UFileSDKBPLibrary::FileAnchorToSeekDir(Anchor) + ); + return true; + } else { + return false; + } +} + +int UFileSDKFileReader::ReadBytes(int Num, TArray & Content) { + if (this->fileReader && this->fileReader->good()) { + char * buffer = new char[Num]; + Content.Reserve(Num); + memset(buffer, 0, Num); + this->fileReader->read(buffer, Num); + int numRead = this->fileReader->gcount(); + Content.Append((uint8*) buffer, numRead); + return numRead; + } else { + return 0; + } +} + +int UFileSDKFileReader::ReadBytesToEnd(TArray & Content) { + if (this->fileReader && this->fileReader->good()) { + int currentPosition = this->fileReader->tellg(); + this->fileReader->seekg(0, std::ios_base::end); + int endPosition = this->fileReader->tellg(); + this->fileReader->seekg(currentPosition, std::ios_base::beg); + + return this->ReadBytes(endPosition - currentPosition + 1, Content); + } else { + return 0; + } +} + +int UFileSDKFileReader::ReadString(int Num, FString & Content) { + if (this->fileReader && this->fileReader->good()) { + char * buffer = new char[Num + 1]; // one more for string termination + Content.Reset(Num); + memset(buffer, 0, Num + 1); + this->fileReader->read(buffer, Num); + Content.Append(buffer); + return this->fileReader->gcount(); + } else { + return 0; + } +} + +int UFileSDKFileReader::ReadStringToEnd(FString & Content) { + if (this->fileReader && this->fileReader->good()) { + int currentPosition = this->fileReader->tellg(); + this->fileReader->seekg(0, std::ios_base::end); + int endPosition = this->fileReader->tellg(); + this->fileReader->seekg(currentPosition, std::ios_base::beg); + + return this->ReadString(endPosition - currentPosition + 1, Content); + } else { + return 0; + } +} + +void UFileSDKFileReader::Close() { + if (this->fileReader) { + this->fileReader->close(); + } +} diff --git a/Plugins/FileSDK/Source/FileSDK/Public/FileAnchor.h b/Plugins/FileSDK/Source/FileSDK/Public/FileAnchor.h new file mode 100644 index 0000000..dabba30 --- /dev/null +++ b/Plugins/FileSDK/Source/FileSDK/Public/FileAnchor.h @@ -0,0 +1,34 @@ +// Copyright Incanta Games 2021. All Rights Reserved. + +#pragma once + +#include + +UENUM( BlueprintType ) +enum class EFileSDKFileAnchor : uint8 { + /** + * References the beginning of the file. Great for reading metadata, resetting your location, + * or just going to exact location. If you're in the middle of the file and want to to go to + * 300 bytes from the beginning, set Anchor to Beginning and Offset to 300. A negative Offset + * doesn't make sense when using Beginning. + */ + Beginning, + + /** + * References the current location of the file reader. Great for skipping chunks of data + * (i.e. your file has an array of stuff and you only want to read the metadata headers for + * each item, you can read the metadata, skip past the actual chunk, and go to the next + * metadata location) If you want to advanced your current location 100 bytes backwards, + * set Anchor to Current and Offset to -100. + */ + Current, + + /** + * References the end of the file. Great for reading footers where information is stored + * at the end of the file. Many times you use this when you open the file, but the metadata + * you want is near the end of the file a fixed number of bytes. For example, 300 bytes from + * the end would have Anchor set to End and Offset set to -300. A positive Offset doesn't + * make sense when using Beginning. + */ + End +}; diff --git a/Plugins/FileSDK/Source/FileSDK/Public/FileSDK.h b/Plugins/FileSDK/Source/FileSDK/Public/FileSDK.h new file mode 100644 index 0000000..0b4ab1f --- /dev/null +++ b/Plugins/FileSDK/Source/FileSDK/Public/FileSDK.h @@ -0,0 +1,15 @@ +// Copyright Incanta Games 2020. All Rights Reserved. + +#pragma once + +#include "Modules/ModuleManager.h" + +DECLARE_LOG_CATEGORY_EXTERN(LogFileSDK, Log, All); + +class FFileSDKModule : public IModuleInterface { +public: + + /** IModuleInterface implementation */ + virtual void StartupModule() override; + virtual void ShutdownModule() override; +}; diff --git a/Plugins/FileSDK/Source/FileSDK/Public/FileSDKBPLibrary.h b/Plugins/FileSDK/Source/FileSDK/Public/FileSDKBPLibrary.h new file mode 100644 index 0000000..84213be --- /dev/null +++ b/Plugins/FileSDK/Source/FileSDK/Public/FileSDKBPLibrary.h @@ -0,0 +1,563 @@ +// Copyright Incanta Games 2020. All Rights Reserved. + +#pragma once + +#include + +#include "Kismet/BlueprintFunctionLibrary.h" +#include "Misc/Paths.h" +#include "Misc/FileHelper.h" +#include "HAL/FileManagerGeneric.h" +#include "Async/TaskGraphInterfaces.h" +#include "Templates/SubclassOf.h" + +#include "FileSDKFileInfo.h" +#include "FileSDKFileType.h" +#include "FileAnchor.h" +#include "FileSDKLineReader.h" +#include "FileSDKEncodingOptions.h" +#include "FileSDK.h" +#include "FileSDKFileReader.h" + +#if PLATFORM_WINDOWS + #include "Windows/WindowsPlatformMisc.h" +#elif PLATFORM_LINUX || PLATFORM_ANDROID + #include "Unix/UnixPlatformMisc.h" +#elif PLATFORM_MAC || PLATFORM_IOS + #include "Apple/ApplePlatformMisc.h" + #include +#endif + +#include "FileSDKBPLibrary.generated.h" + +UDELEGATE() +DECLARE_DYNAMIC_DELEGATE_TwoParams(FFileSDKCopyDelegate, int, KilobytesWritten, int, TotalKilobytes); + +USTRUCT(BlueprintType) +struct FFileSDKDelegatePreInfo { + GENERATED_USTRUCT_BODY(); + int PriorWritten; + int TotalSize; + + FFileSDKDelegatePreInfo() { + PriorWritten = 0; + TotalSize = 0; + } +}; + +UCLASS() +class UFileSDKBPLibrary : public UBlueprintFunctionLibrary { + GENERATED_UCLASS_BODY() + + /** + * Creates a File Reader instance; File Readers can be used to control how the file is read. + * You can seek to different parts of the file, only read in a specified number of bytes, etc. + * This gives you the most amount of control and is great for only reading metadata in large files. + * + * @param FileName An absolute path of the file that you want to open for reading. + * @param OpenInBinaryMode Setting this to true will open the file for reading binary data; + * false opens the file to read text data. + * + * @return The File Reader instance regardless of the status of successful open. + * See the `Is Good` node before attempting to read anything. + */ + UFUNCTION( + BlueprintCallable, + meta = ( + DisplayName = "Open File Reader", + Keywords = "FileSDK open file reader" + ), + Category = "FileSDK" + ) + static UFileSDKFileReader * OpenFileReader( + FString FileName, + bool OpenInBinaryMode = false + ); + + /** + * Creates an empty file. + * + * @param FileName An absolute path to the file you want to create. + * @param ClearContentsIfExists If set to true this node will completely delete any content in the file. + * @param CreateDirectoryTree If set to true, any missing folders to get to File Name will be automatically created. + * See docs at wiki.incanta.games for more details. + * + * @return Returns true if the file was successfully deleted. + * Returns false if the file doesn't exist or the file couldn't be deleted. + */ + UFUNCTION( + BlueprintCallable, + meta = ( + DisplayName = "Create File", + Keywords = "FileSDK create make generate file" + ), + Category = "FileSDK" + ) + static void CreateFile(FString FileName, bool ClearContentsIfExists = true, bool CreateDirectoryTree = true); + + /** + * Deletes a file if it exists; does nothing if it doesn't exist. + * + * @param FileName An absolute path to the file you want to delete. + * + * @return Returns true if the file was successfully deleted. + * Returns false if the file doesn't exist or the file couldn't be deleted. + */ + UFUNCTION( + BlueprintCallable, + meta = ( + DisplayName = "Delete File", + Keywords = "FileSDK delete file destroy" + ), + Category = "FileSDK" + ) + static bool DeleteFile(FString FileName); + + /** + * Creates a directory. + * + * @param DirectoryName An absolute path to the directory you want to create. + * @param CreateDirectoryTree If set to true, any missing folders to get to File Name will be automatically created. + * See docs at wiki.incanta.games for more details. + * + * @return Returns whether or not the directory was successfully created. + */ + UFUNCTION( + BlueprintCallable, + meta = ( + DisplayName = "Create Directory", + Keywords = "FileSDK create make generate directory folder" + ), + Category = "FileSDK" + ) + static bool CreateDirectory(FString DirectoryName, bool CreateDirectoryTree = true); + + /** + * Deletes a directory. + * + * @param DirectoryName An absolute path to the directory you want to create. + * @param Recursive If set to true, all files and folders in this directory will be deleted. + * If set to false, the directory will only be deleted if it is empty. + * + * @return Returns whether or not the directory was successfully deleted. + */ + UFUNCTION( + BlueprintCallable, + meta = ( + DisplayName = "Delete Directory", + Keywords = "FileSDK delete destroy remove directory folder" + ), + Category = "FileSDK" + ) + static bool DeleteDirectory(FString DirectoryName, bool Recursive = true); + + /** + * Renames/moves a file or a directory to a new name/location. + * + * @param Source An absolute path to the file/directory that you want to rename/move. + * @param Destination An absolute path of the new location/name you want for the file or directory. + * You cannot provide "/path/to/file.csv" for Source and only provide "file-old.csv" for Destination; + * you must provide the full absolute path of the new file (i.e. "/path/to/file-old.csv"). + * + * @return Returns whether or not the file/directory was successfully renamed/moved. + */ + UFUNCTION( + BlueprintCallable, + meta = ( + DisplayName = "Rename File or Directory", + Keywords = "FileSDK rename move file directory folder" + ), + Category = "FileSDK" + ) + static bool RenameFileOrDirectory(FString Source, FString Destination); + + /** + * Copies a file, creating a duplicate version. Performs the copy operation on the main game thread; + * this can have performance issues for large files. See `Copy File Async` to perform the copy in the + * background (in a separate thread). + * + * @param Source An absolute path to the file you want to copy. + * @param Destination An absolute path to where you want to copy the file to. You cannot provide + * "/path/to/file.csv" for Source and only provide "file-old.csv" for Destination; you must provide + * the full absolute path of the new file (i.e. "/path/to/file-old.csv"). + * @param ProgressCallback This allows you to attach an event to receive execution when progress is made, + * allowing you to update a UI or other variables about the progress left for copying the file. + * @param PreInfo The number of kilobytes you want each chunk of data to be copied as. + * Smaller numbers can give you more fine progress updates, but at the cost of more disk IO operations, + * potentially slowing down the overall copy. + * @param OverwriteDestination If file exists and this is set to true, the contents of the file will be overwritten. + * + * @return Returns false if Source could not be opened (likely because it doesn't exist) or if Destination + * could not be opened for write permissions (likely the directory doesn't exist, or the user doesn't have + * permissions to write there). Returns true if the copy was successful. + */ + UFUNCTION( + BlueprintCallable, + meta = ( + DisplayName = "Copy File", + Keywords = "FileSDK copy file", + AutoCreateRefTerm = "ProgressCallback, PreInfo", + HidePin = "PreInfo" + ), + Category = "FileSDK" + ) + static bool CopyFile( + FString Source, + FString Destination, + const FFileSDKCopyDelegate & ProgressCallback, + FFileSDKDelegatePreInfo PreInfo, + int ChunkSizeInKilobytes = 1024, + bool OverwriteDestination = false + ); + + /** + * Copies a file, creating a duplicate version. Performs the copy operation in a separate + * background thread, preventing the game thread from waiting for the copy operation to finish. + * + * @param Source An absolute path to the file you want to copy. + * @param Destination An absolute path to where you want to copy the file to. You cannot provide + * "/path/to/file.csv" for Source and only provide "file-old.csv" for Destination; you must provide + * the full absolute path of the new file (i.e. "/path/to/file-old.csv"). + * @param ProgressCallback This allows you to attach an event to receive execution when progress is made, + * allowing you to update a UI or other variables about the progress left for copying the file. + * @param ChunkSizeInKilobytes The number of kilobytes you want each chunk of data to be copied as. + * Smaller numbers can give you more fine progress updates, but at the cost of more disk IO operations, + * potentially slowing down the overall copy. + */ + UFUNCTION( + BlueprintCallable, + meta = ( + DeprecatedFunction, + DeprecationMessage="This function has been deprecated; please use 'Copy File or Directory Async'.", + DisplayName = "Copy File Async", + Keywords = "FileSDK copy file async", + AutoCreateRefTerm = "ProgressCallback, PreInfo", + HidePin = "PreInfo" + ), + Category = "FileSDK" + ) + static void CopyFileAsync( + FString Source, + FString Destination, + const FFileSDKCopyDelegate & ProgressCallback, + FFileSDKDelegatePreInfo PreInfo, + int ChunkSizeInKilobytes = 1024 + ); + + /** + * Copies a directory, including all of its contents, creating a duplicate version. + * Performs the copy operation on the main game thread; this can have performance issues for large + * directories. See "Copy Directory Async" to perform the copy in the background (in a separate thread). + * + * @param Source An absolute path to the directory you want to copy. + * @param Destination An absolute path to where you want to copy the directory to. + * @param ProgressCallback This allows you to attach an event to receive execution when progress is made, + * allowing you to update a UI or other variables about the progress left for copying the directory. + * @param OverwriteDestination If set to true, if a particular file exists in the respective Destination + * location, it will be overwritten with the new contents. Otherwise it will be ignored. For example if + * you're copying "/path/from" to "/path/to", and "/path/to/file.txt" already exists, if this is set to true, + * /path/from/file.txt will overwrite "/path/to/file.txt", if set to false, "/path/to/file.txt" will remain + * unchanged. + * @param ChunkSizeInKilobytes The number of kilobytes you want each chunk of data to be copied as. + * Smaller numbers can give you more fine progress updates, but at the cost of more disk IO operations, + * potentially slowing down the overall copy. + * + * @return Returns true if the copy finished successfully. Returns false if any of the files couldn't be + * copied or if subdirectories couldn't be created (usually this happens if there are permissions issues + * or files are open in other programs). + */ + UFUNCTION( + BlueprintCallable, + meta = ( + DisplayName = "Copy Directory", + Keywords = "FileSDK copy directory folder", + AutoCreateRefTerm = "ProgressCallback" + ), + Category = "FileSDK" + ) + static bool CopyDirectory( + FString Source, + FString Destination, + const FFileSDKCopyDelegate & ProgressCallback, + bool OverwriteDestination = false, + int ChunkSizeInKilobytes = 1024 + ); + + /** + * Copies a directory, including all of its contents, creating a duplicate version. + * Performs the copy operation in a separate background thread, preventing the game thread + * from waiting for the copy operation to finish. + * + * @param Source An absolute path to the directory you want to copy. + * @param Destination An absolute path to where you want to copy the directory to. + * @param ProgressCallback This allows you to attach an event to receive execution when progress is made, + * allowing you to update a UI or other variables about the progress left for copying the directory. + * @param OverwriteDestination If set to true, if a particular file exists in the respective Destination + * location, it will be overwritten with the new contents. Otherwise it will be ignored. For example if + * you're copying "/path/from" to "/path/to", and "/path/to/file.txt" already exists, if this is set to true, + * /path/from/file.txt will overwrite "/path/to/file.txt", if set to false, "/path/to/file.txt" will remain + * unchanged. + * @param ChunkSizeInKilobytes The number of kilobytes you want each chunk of data to be copied as. + * Smaller numbers can give you more fine progress updates, but at the cost of more disk IO operations, + * potentially slowing down the overall copy. + */ + UFUNCTION( + BlueprintCallable, + meta = ( + DeprecatedFunction, + DeprecationMessage="This function has been deprecated; please use 'Copy File or Directory Async'.", + DisplayName = "Copy Directory Async", + Keywords = "FileSDK copy directory folder async", + AutoCreateRefTerm = "ProgressCallback" + ), + Category = "FileSDK" + ) + static void CopyDirectoryAsync( + FString Source, + FString Destination, + const FFileSDKCopyDelegate & ProgressCallback, + bool OverwriteDestination = false, + int ChunkSizeInKilobytes = 1024 + ); + + /** + * Reads the entire contents of a file as text into a string. + * + * @param FileName An absolute path to the file you would like to read. + * + * @param Content The entire contents of File Name. + * @return Returns true if the file could be opened and read successfully. + */ + UFUNCTION( + BlueprintPure, + meta = ( + DisplayName = "Read String from File", + Keywords = "FileSDK read file string text" + ), + Category = "FileSDK" + ) + static bool ReadStringFromFile(FString FileName, FString & Content); + + /** + * Read the entire contents of a file as an array of strings. Each element in the array is a + * separate line in the file. Both LF (Line Feed, used in Linux and Mac systems) and CRLF + * (Carriage Return, Line Feed, used in Windows systems) are supported. + * + * @param FileName An absolute path to the file you would like to read. + * @param LineReader While every line is read from the file regardless, you can use this + * parameter to filter which lines are returned in Lines. To do this, specify a child class + * of the "FileSDKLineReader" class and override the "FilterLine" function. When the "FilterLine" + * function returns true, the line is provided in the output of the "Read Lines From File" function. + * Find more details in our docs at wiki.incanta.games. + * + * @param Lines The lines of the file, optionally filtered by LineReader. These do not contain the + * line endings (i.e. there is no LF or CRLF character(s) at the end of the strings). + */ + UFUNCTION( + BlueprintPure, + meta = ( + DisplayName = "Read Lines from File", + Keywords = "FileSDK read lines array file string text" + ), + Category = "FileSDK" + ) + static bool ReadLinesFromFile( + FString FileName, + TSubclassOf LineReader, + TArray & Lines + ); + + /** + * Writes a string as text to a file, with options to overwrite/append as well as encoding options. + * Will create the file if it doesn't exist. This node expects the parent directory to already exist + * (i.e. it will not create directories for you, and will return false if the parent directories do not exist). + * + * @param FileName An absolute path to the file you would like to write. + * @param Content The text you would like to write to the file. + * @param Append If set to true, the file will be erased before writing Content to it; if set to false, + * Content will be written at the end of hte file. New lines/carriage returns will not be automatically + * inserted for you. + * @param Encoding Encoding options that are passed down to the file writer. "Auto Detect" will do its + * best to determine the encoding of the string, but you can also use one of the + * "Force (Ansi | Unicode | UTF8 | UTF8WithoutBOM)" options to force how the contents are encoded. + * + * @return Returns true if the file could be opened and written successfully. + */ + UFUNCTION( + BlueprintCallable, + meta = ( + DisplayName = "Write String to File", + Keywords = "FileSDK write append save file string text" + ), + Category = "FileSDK" + ) + static bool WriteStringToFile( + FString FileName, + FString Content, + bool Append = false, + EFileSDKEncodingOptions Encoding = EFileSDKEncodingOptions::AutoDetect + ); + + /** + * Writes a Byte array as binary data to a file. This node currently always overwrites the + * file contents. If you have a use case for appending binary files, please let us know. + * Will create the file if it doesn't exist. This node expects the parent directory to already + * exist (i.e. it will not create directories for you, and will return false if the parent + * directories do not exist). + * + * @param FileName An absolute path to the file you want to write. + * @param Content The bytes you would like to write to the file. + * + * @return Returns true if the file was opened wnd written successfully. + */ + UFUNCTION( + BlueprintCallable, + meta = ( + DisplayName = "Write Bytes to File", + Keywords = "FileSDK write save file bytes binary" + ), + Category = "FileSDK" + ) + static bool WriteBytesToFile(FString FileName, TArray Content); + + /** + * Reads the entire contents of a file as a binary Byte array. + * + * @param FileName An absolute path to the file you want to read. + * + * @param Content The entire contents of File Name. + * @return Returns true if the file was opened and read successfully. + */ + UFUNCTION( + BlueprintPure, + meta = ( + DisplayName = "Read Bytes from File", + Keywords = "FileSDK read file bytes binary" + ), + Category = "FileSDK" + ) + static bool ReadBytesFromFile(FString FileName, TArray & Content); + + /** + * Searches for files or directories in a directory. + * + * @param DirectoryToSearch An absolute path to the directory that you want to search in. + * @param FilterFilesWithExtension Only used if "File Type" is "File". This argument allows + * you to filter the results by the file extension. Proper usage of this argument is + * ".txt", ".csv", etc, including the period. + * @param SearchSubfolders Whether or not to search subdirectories (true) or just search + * the single folder provided (false). + * @param FileType Whether or not to search for a "File" or a "Directory". + * + * @return An array of absolute paths to each file or directory found. + */ + UFUNCTION( + BlueprintCallable, + meta = ( + DisplayName = "Get Files or Directories from Directory", + Keywords = "FileSDK get search find files list directory contents" + ), + Category = "FileSDK" + ) + static TArray GetFilesFromDirectory( + FString DirectoryToSearch, + FString FilterFilesWithExtension, + bool SearchSubfolders = false, + EFileSDKFileType FileType = EFileSDKFileType::File + ); + + /** + * Lists the contents of a directory, including both files and directories, with supplemental information. + * + * @param Directory An absolute path to the directory that you want to list contents of. + * @param SearchSubfolders Whether or not to search subdirectories (true) or just search the + * single folder provided (false). + * + * @return An array of FileSDKFileInfo structs, one for each file and directory, each containing detailed + * information of the file/directory. + */ + UFUNCTION( + BlueprintCallable, + meta = ( + DisplayName = "Get Directory Contents with File Info", + Keywords = "FileSDK get search find files list directory contents file info stat" + ), + Category = "FileSDK" + ) + static TArray GetDirectoryContentsWithFileInfo( + FString Directory, + bool SearchSubfolders = false + ); + + /** + * Returns detailed information for a specific file or directory. + * + * @param Path An absolute path to the file or directory you want information for. + * + * @param Info The detailed info struct of the file. + */ + UFUNCTION( + BlueprintPure, + meta = ( + DisplayName = "Get File or Directory Info", + Keywords = "FileSDK get file" + ), + Category = "FileSDK" + ) + static void GetFileOrDirectoryInfo(FString Path, FFileSDKFileInfo & Info); + + /** + * Retrieves the current username for whoever is running the program/game. (i.e. in C:\Users\) + * + * @return On Windows, this returns the environment variable "%USERNAME%". On Mac and Linux, this returns + * the environment variable "$USER". On other platforms, it returns "PLATFORM_NOT_SUPPORTED". + */ + UFUNCTION( + BlueprintPure, + meta = ( + DisplayName = "Get Current Username", + Keywords = "FileSDK get current user name username" + ), + Category = "FileSDK | Paths" + ) + static FString GetCurrentUsername(); + + /** + * Returns the current user's home directory. (i.e. the entire C:\Users\ + +#include "FileSDKFileReader.generated.h" + +class UFileSDKBPLibrary; + +UCLASS(BlueprintType, Blueprintable) +class UFileSDKFileReader : public UObject { + GENERATED_UCLASS_BODY() + + void OpenFile(FString fileName, bool OpenInBinaryMode); + + /** + * Checks to see if the file reader is in a "good" state. This is synonymous to the C++ good function. + * This function returns false if the file reader is in a bad state, failed, or at the end of the file. + * + * @return Returns false if the file reader is in a bad state, failed, or at the end of the file. + * Returns true if the file is successfully open and ready to read more bytes (i.e. the pointer + * is not at the end of the file). + */ + UFUNCTION( + BlueprintCallable, + meta = ( + DisplayName = "File Is Good", + Keywords = "FileSDK file reader is good open" + ), + Category = "FileSDK | File Reader" + ) + bool IsGood(); + + /** + * Change the position of the File Reader; this is essentially a pointer of where you're going + * to start reading for any of the following read nodes. When you open a File Reader, the seek + * position starts at the Beginning. This is synonymous to the C++ seekg function. + * + * @param Anchor This defines the "from" where that Offset is applied to. + * @param Offset Number of bytes to offset from the Anchor. + * + * @return Returns true if the file is open and "File Is Good"; otherwise returns false. + */ + UFUNCTION( + BlueprintCallable, + meta = ( + DisplayName = "Seek File Position", + Keywords = "FileSDK seek change file position pointer" + ), + Category = "FileSDK | File Reader" + ) + bool SeekFilePosition(EFileSDKFileAnchor Anchor, int Offset); + + /** + * Reads a specified number of bytes from the current file reader location as a binary Byte array. + * The file reader location is advanced to where ever it finishes reading. + * + * @param Num The number of bytes to read. If Num greater than the number of bytes left in the file, + * it will read to the end of the file. + * + * @param Content The bytes that were read in as a binary Byte array. + * @return The actual number of bytes read. This is usually only different than Num if you reached + * the end of the file. You should, however, still use Is Good to check if you're at the end of the file. + */ + UFUNCTION( + BlueprintCallable, + meta = ( + DisplayName = "Read Bytes", + Keywords = "FileSDK read bytes" + ), + Category = "FileSDK | File Reader" + ) + int ReadBytes(int Num, TArray & Content); + + /** + * Reads the rest of the file from the current location as a binary Byte array. The file reader + * location is advanced to the end of the file. + * + * @param Content The bytes that were read in as a binary Byte array. + * @return The actual number of bytes read. + */ + UFUNCTION( + BlueprintCallable, + meta = ( + DisplayName = "Read Bytes To End", + Keywords = "FileSDK read bytes to end" + ), + Category = "FileSDK | File Reader" + ) + int ReadBytesToEnd(TArray & Content); + + /** + * Reads a specified number of bytes from the current file reader location as a String. + * The file reader location is advanced to where ever it finishes reading. + * + * @param Num The number of bytes to read. If Num greater than the number of bytes left in the file, + * it will read to the end of the file. + * + * @param Content The bytes that were read in as a String. + * @return The actual number of bytes read. This is usually only different than Num if you reached + * the end of the file. You should, however, still use "File Is Good" to check if you're at the end of the file. + */ + UFUNCTION( + BlueprintCallable, + meta = ( + DisplayName = "Read String", + Keywords = "FileSDK read string chars characters" + ), + Category = "FileSDK | File Reader" + ) + int ReadString(int Num, FString & Content); + + /** + * Reads the rest of the file from the current location as a String. The file reader location + * is advanced to the end of the file. + * + * @param Content The bytes that were read in as a String. + * @return The actual number of bytes read. + */ + UFUNCTION( + BlueprintCallable, + meta = ( + DisplayName = "Read String to End", + Keywords = "FileSDK read string chars characters to end" + ), + Category = "FileSDK | File Reader" + ) + int ReadStringToEnd(FString & Content); + + /** + * Closes the file if it's valid/open. Does nothing otherwise. + */ + UFUNCTION( + BlueprintCallable, + meta = ( + DisplayName = "Close File Reader", + Keywords = "FileSDK file reader close" + ), + Category = "FileSDK | File Reader" + ) + void Close(); + + /** + * The absolute path to the file being read. + */ + UPROPERTY(BlueprintReadOnly, Category = "Details") + FString FileName; + + /** + * True if the file was opened to be read in binary mode, false for text. + */ + UPROPERTY(BlueprintReadOnly, Category = "Details") + bool BinaryMode; + +private: + std::ifstream * fileReader; + + friend class UFileSDKBPLibrary; +}; diff --git a/Plugins/FileSDK/Source/FileSDK/Public/FileSDKFileType.h b/Plugins/FileSDK/Source/FileSDK/Public/FileSDKFileType.h new file mode 100644 index 0000000..8ddb53b --- /dev/null +++ b/Plugins/FileSDK/Source/FileSDK/Public/FileSDKFileType.h @@ -0,0 +1,9 @@ +// Copyright Incanta Games 2020. All Rights Reserved. + +#pragma once + +UENUM( BlueprintType ) +enum class EFileSDKFileType : uint8 { + File, + Directory, +}; diff --git a/Plugins/FileSDK/Source/FileSDK/Public/FileSDKLineReader.h b/Plugins/FileSDK/Source/FileSDK/Public/FileSDKLineReader.h new file mode 100644 index 0000000..8343568 --- /dev/null +++ b/Plugins/FileSDK/Source/FileSDK/Public/FileSDKLineReader.h @@ -0,0 +1,28 @@ +// Copyright Incanta Games 2021. All Rights Reserved. + +#pragma once + +#include "FileSDKLineReader.generated.h" + +UCLASS(Blueprintable) +class FILESDK_API UFileSDKLineReader : public UObject { + GENERATED_BODY() + +public: + /** + * An overridable function that dictates whether or not a line in a file + * is filtered. Should return true if the line should be provided, false + * if the line should be filtered out (not included). + * + * @param Line The contents of the current line, excluding line endings. + * + * @return Should return true if the line should be provided, false + * if the line should be filtered out (not included). + */ + UFUNCTION(BlueprintNativeEvent, Category = "FileSDK") + bool FilterLine(const FString & Line); + + virtual bool FilterLine_Implementation(const FString & line) { + return true; + } +};