31. Aura HUD (plus other stuff)
- Enabled a few more plugins - Added clang formatting straight from the GasaGen cpp. - Setup auto-generation of the DevOptionsCache - Messed around with generating widgettree hiearchy from template widget
This commit is contained in:
		| @@ -33,9 +33,10 @@ void UGasaAttributeSet::Client_OnRep_MaxMana( FGameplayAttributeData& PrevMaxMan | ||||
| 	GAMEPLAYATTRIBUTE_REPNOTIFY( UGasaAttributeSet, MaxMana, PrevMaxMana ) | ||||
| } | ||||
|  | ||||
| void UGasaAttributeSet::GetLifetimeReplicatedProps( TArray< FLifetimeProperty >& OutLifetimeProps ) const | ||||
| void UGasaAttributeSet::GetLifetimeReplicatedProps( TArray<FLifetimeProperty>& OutLifetimeProps ) const | ||||
| { | ||||
| 	Super::GetLifetimeReplicatedProps( OutLifetimeProps ); | ||||
|  | ||||
| 	DOREPLIFETIME_DEFAULT_GAS( UGasaAttributeSet, Health ); | ||||
| 	DOREPLIFETIME_DEFAULT_GAS( UGasaAttributeSet, MaxHealth ); | ||||
| 	DOREPLIFETIME_DEFAULT_GAS( UGasaAttributeSet, Mana ); | ||||
|   | ||||
| @@ -4,7 +4,8 @@ | ||||
| #include "AbilitySystemComponent.h" | ||||
| #include "GasaAttributeSet.generated.h" | ||||
|  | ||||
| UCLASS() class GASA_API UGasaAttributeSet : public UAttributeSet | ||||
| UCLASS() | ||||
| class GASA_API UGasaAttributeSet : public UAttributeSet | ||||
| { | ||||
| 	GENERATED_BODY() | ||||
| public: | ||||
| @@ -21,6 +22,7 @@ public: | ||||
| 	FGameplayAttributeData MaxMana; | ||||
|  | ||||
| 	UGasaAttributeSet(); | ||||
|  | ||||
| 	UFUNCTION() | ||||
| 	void Client_OnRep_Health( FGameplayAttributeData& PrevHealth ); | ||||
| 	UFUNCTION() | ||||
| @@ -31,55 +33,35 @@ public: | ||||
| 	void Client_OnRep_MaxMana( FGameplayAttributeData& PrevMaxMana ); | ||||
|  | ||||
| #pragma region Getters | ||||
|  | ||||
| 	static FGameplayAttribute GetHealthAttribute() | ||||
| 	{ | ||||
| 		static FProperty* Prop = FindFieldChecked< FProperty >( UGasaAttributeSet::StaticClass(), GET_MEMBER_NAME_CHECKED( UGasaAttributeSet, Health ) ); | ||||
| 		static FProperty* Prop = FindFieldChecked<FProperty>( UGasaAttributeSet::StaticClass(), GET_MEMBER_NAME_CHECKED( UGasaAttributeSet, Health ) ); | ||||
| 		return Prop; | ||||
| 	} | ||||
|  | ||||
| 	static FGameplayAttribute GetMaxHealthAttribute() | ||||
| 	{ | ||||
| 		static FProperty* Prop = FindFieldChecked< FProperty >( UGasaAttributeSet::StaticClass(), GET_MEMBER_NAME_CHECKED( UGasaAttributeSet, MaxHealth ) ); | ||||
| 		static FProperty* Prop = FindFieldChecked<FProperty>( UGasaAttributeSet::StaticClass(), GET_MEMBER_NAME_CHECKED( UGasaAttributeSet, MaxHealth ) ); | ||||
| 		return Prop; | ||||
| 	} | ||||
|  | ||||
| 	static FGameplayAttribute GetManaAttribute() | ||||
| 	{ | ||||
| 		static FProperty* Prop = FindFieldChecked< FProperty >( UGasaAttributeSet::StaticClass(), GET_MEMBER_NAME_CHECKED( UGasaAttributeSet, Mana ) ); | ||||
| 		static FProperty* Prop = FindFieldChecked<FProperty>( UGasaAttributeSet::StaticClass(), GET_MEMBER_NAME_CHECKED( UGasaAttributeSet, Mana ) ); | ||||
| 		return Prop; | ||||
| 	} | ||||
|  | ||||
| 	static FGameplayAttribute GetMaxManaAttribute() | ||||
| 	{ | ||||
| 		static FProperty* Prop = FindFieldChecked< FProperty >( UGasaAttributeSet::StaticClass(), GET_MEMBER_NAME_CHECKED( UGasaAttributeSet, MaxMana ) ); | ||||
| 		static FProperty* Prop = FindFieldChecked<FProperty>( UGasaAttributeSet::StaticClass(), GET_MEMBER_NAME_CHECKED( UGasaAttributeSet, MaxMana ) ); | ||||
| 		return Prop; | ||||
| 	} | ||||
|  | ||||
| 	FORCEINLINE float GetHealth() const | ||||
| 	{ | ||||
| 		return Health.GetCurrentValue(); | ||||
| 	} | ||||
|  | ||||
| 	FORCEINLINE float GetMaxHealth() const | ||||
| 	{ | ||||
| 		return MaxHealth.GetCurrentValue(); | ||||
| 	} | ||||
|  | ||||
| 	FORCEINLINE float GetMana() const | ||||
| 	{ | ||||
| 		return Mana.GetCurrentValue(); | ||||
| 	} | ||||
|  | ||||
| 	FORCEINLINE float GetMaxMana() const | ||||
| 	{ | ||||
| 		return MaxMana.GetCurrentValue(); | ||||
| 	} | ||||
|  | ||||
| #pragma endregion Getters | ||||
| 	FORCEINLINE float GetHealth() const { return Health.GetCurrentValue(); } | ||||
| 	FORCEINLINE float GetMaxHealth() const { return MaxHealth.GetCurrentValue(); } | ||||
| 	FORCEINLINE float GetMana() const { return Mana.GetCurrentValue(); } | ||||
| 	FORCEINLINE float GetMaxMana() const { return MaxMana.GetCurrentValue(); } | ||||
| 	#pragma endregion Getters | ||||
|  | ||||
| #pragma region Setters | ||||
| 	FORCEINLINE void SetHealth( float NewVal ) | ||||
| 	    FORCEINLINE void | ||||
| 	    SetHealth( float NewVal ) | ||||
| 	{ | ||||
| 		UAbilitySystemComponent* AbilityComp = GetOwningAbilitySystemComponent(); | ||||
| 		if ( ensure( AbilityComp ) ) | ||||
| @@ -87,7 +69,6 @@ public: | ||||
| 			AbilityComp->SetNumericAttributeBase( GetHealthAttribute(), NewVal ); | ||||
| 		}; | ||||
| 	} | ||||
|  | ||||
| 	FORCEINLINE void SetMaxHealth( float NewVal ) | ||||
| 	{ | ||||
| 		UAbilitySystemComponent* AbilityComp = GetOwningAbilitySystemComponent(); | ||||
| @@ -96,7 +77,6 @@ public: | ||||
| 			AbilityComp->SetNumericAttributeBase( GetMaxHealthAttribute(), NewVal ); | ||||
| 		}; | ||||
| 	} | ||||
|  | ||||
| 	FORCEINLINE void SetMana( float NewVal ) | ||||
| 	{ | ||||
| 		UAbilitySystemComponent* AbilityComp = GetOwningAbilitySystemComponent(); | ||||
| @@ -105,7 +85,6 @@ public: | ||||
| 			AbilityComp->SetNumericAttributeBase( GetManaAttribute(), NewVal ); | ||||
| 		}; | ||||
| 	} | ||||
|  | ||||
| 	FORCEINLINE void SetMaxMana( float NewVal ) | ||||
| 	{ | ||||
| 		UAbilitySystemComponent* AbilityComp = GetOwningAbilitySystemComponent(); | ||||
| @@ -114,44 +93,39 @@ public: | ||||
| 			AbilityComp->SetNumericAttributeBase( GetMaxManaAttribute(), NewVal ); | ||||
| 		}; | ||||
| 	} | ||||
|  | ||||
| 	FORCEINLINE void InitHealth( float NewVal ) | ||||
| 	{ | ||||
| 		Health.SetBaseValue( NewVal ); | ||||
| 		Health.SetCurrentValue( NewVal ); | ||||
| 	} | ||||
|  | ||||
| 	FORCEINLINE void InitMaxHealth( float NewVal ) | ||||
| 	{ | ||||
| 		MaxHealth.SetBaseValue( NewVal ); | ||||
| 		MaxHealth.SetCurrentValue( NewVal ); | ||||
| 	} | ||||
|  | ||||
| 	FORCEINLINE void InitMana( float NewVal ) | ||||
| 	{ | ||||
| 		Mana.SetBaseValue( NewVal ); | ||||
| 		Mana.SetCurrentValue( NewVal ); | ||||
| 	} | ||||
|  | ||||
| 	FORCEINLINE void InitMaxMana( float NewVal ) | ||||
| 	{ | ||||
| 		MaxMana.SetBaseValue( NewVal ); | ||||
| 		MaxMana.SetCurrentValue( NewVal ); | ||||
| 	} | ||||
|  | ||||
| #pragma endregion Setters | ||||
| 	#pragma endregion Setters | ||||
|  | ||||
| #pragma region UObject | ||||
|  | ||||
| 	void GetLifetimeReplicatedProps( TArray< FLifetimeProperty >& OutLifetimeProps ) const override; | ||||
| 	    void | ||||
| 	    GetLifetimeReplicatedProps( TArray<FLifetimeProperty>& OutLifetimeProps ) const override; | ||||
| #pragma endregion UObject | ||||
| }; | ||||
|  | ||||
| namespace Gasa | ||||
| { | ||||
| 	inline UGasaAttributeSet const* GetAttributeSet( UAbilitySystemComponent* ASC ) | ||||
| 	{ | ||||
| 		return Cast< UGasaAttributeSet >( ASC->GetAttributeSet( UGasaAttributeSet::StaticClass() ) ); | ||||
| 		return Cast<UGasaAttributeSet>( ASC->GetAttributeSet( UGasaAttributeSet::StaticClass() ) ); | ||||
| 	} | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -4,6 +4,7 @@ | ||||
| #include "Engine/LocalPlayer.h" | ||||
| #include "EnhancedInputComponent.h" | ||||
| #include "EnhancedInputSubsystems.h" | ||||
| #include "GasaDevOptions.h" | ||||
| #include "GasaPlayerState.h" | ||||
| #include "Actors/CameraMount.h" | ||||
| #include "Camera/CameraComponent.h" | ||||
| @@ -12,6 +13,8 @@ | ||||
| #include "GameFramework/SpringArmComponent.h" | ||||
| #include "Kismet/KismetSystemLibrary.h" | ||||
|  | ||||
| using namespace Gasa; | ||||
|  | ||||
| AGasaPlayerController::AGasaPlayerController() | ||||
| { | ||||
| 	PrimaryActorTick.bCanEverTick = true; | ||||
| @@ -21,11 +24,14 @@ AGasaPlayerController::AGasaPlayerController() | ||||
| 	bReplicates = true; | ||||
| } | ||||
|  | ||||
| #pragma region Input | ||||
| void AGasaPlayerController::Move(FInputActionValue const& ActionValue) | ||||
| { | ||||
| 	APawn* pawn = GetPawn<APawn>(); | ||||
| 	if (pawn == nullptr ) | ||||
| 		return; | ||||
|  | ||||
| 	 | ||||
| 	 | ||||
| // Note(Ed): I did the follow optimization for practice, they are completely unnecessary for this context. | ||||
| #if 0 | ||||
| @@ -63,6 +69,13 @@ void AGasaPlayerController::Move(FInputActionValue const& ActionValue) | ||||
| 	pawn->AddMovementInput( MoveDir ); | ||||
| #endif | ||||
| } | ||||
| #pragma endregion Input | ||||
|  | ||||
| #pragma region PlayerController | ||||
| void AGasaPlayerController::SpawnDefaultHUD() | ||||
| { | ||||
| 	Super::SpawnDefaultHUD(); | ||||
| } | ||||
|  | ||||
| void AGasaPlayerController::OnPossess(APawn* InPawn) | ||||
| { | ||||
| @@ -86,7 +99,6 @@ void AGasaPlayerController::OnUnPossess() | ||||
| 	Super::OnUnPossess(); | ||||
| } | ||||
|  | ||||
| #pragma region PlayerController | ||||
| void AGasaPlayerController::PlayerTick(float DeltaTime) | ||||
| { | ||||
| 	Super::PlayerTick(DeltaTime); | ||||
| @@ -162,7 +174,7 @@ void AGasaPlayerController::PostInitializeComponents() | ||||
| { | ||||
| 	Super::PostInitializeComponents(); | ||||
|  | ||||
| 	Cam = GetWorld()->SpawnActor<ACameraMount>(CamClass, FActorSpawnParameters() ); | ||||
| 	Cam = GetWorld()->SpawnActor<ACameraMount>(GetDevOptions()->Template_PlayerCamera.Get(), FActorSpawnParameters() ); | ||||
| 	SetViewTarget(Cam); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -12,9 +12,6 @@ class GASA_API AGasaPlayerController : public APlayerController | ||||
| 	GENERATED_BODY() | ||||
| public: | ||||
| #pragma region Camera | ||||
| 	UPROPERTY(EditAnywhere, BlueprintReadWrite) | ||||
| 	TSubclassOf<ACameraMount> CamClass; | ||||
| 	 | ||||
| 	UPROPERTY(EditAnywhere, BlueprintReadWrite) | ||||
| 	TObjectPtr<ACameraMount> Cam; | ||||
| #pragma endregion Camera | ||||
| @@ -60,6 +57,8 @@ public: | ||||
| 	} | ||||
| 	 | ||||
| #pragma region PlayerController | ||||
| 	void SpawnDefaultHUD() override; | ||||
| 	 | ||||
| 	void OnPossess(APawn* InPawn) override; | ||||
|  | ||||
| 	void OnUnPossess() override; | ||||
|   | ||||
							
								
								
									
										1
									
								
								Project/Source/Gasa/Game/GasaViewport.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								Project/Source/Gasa/Game/GasaViewport.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| #include "GasaViewport.h" | ||||
							
								
								
									
										12
									
								
								Project/Source/Gasa/Game/GasaViewport.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								Project/Source/Gasa/Game/GasaViewport.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include "Engine/GameViewportClient.h" | ||||
|  | ||||
| #include "GasaViewport.generated.h" | ||||
|  | ||||
| UCLASS() | ||||
| class GASA_API UGasaViewport : public UGameViewportClient | ||||
| { | ||||
| 	GENERATED_BODY() | ||||
| public: | ||||
| }; | ||||
| @@ -33,9 +33,17 @@ public class Gasa : ModuleRules | ||||
|             "NetCore", | ||||
|             "Niagara", | ||||
|             "SlateCore", | ||||
|             "UMG", | ||||
|             "UMG",  | ||||
|         }); | ||||
|     #endregion Engine | ||||
|          | ||||
|         if (Target.bBuildEditor) | ||||
|         { | ||||
| 	        PrivateDependencyModuleNames.AddRange( new string[] { | ||||
| 		        "UnrealEd", | ||||
| 				"UMGEditor", | ||||
| 			}); | ||||
|         } | ||||
| 	#endregion Engine | ||||
|      | ||||
|     #region Plugins | ||||
| 		if (Target.Configuration != UnrealTargetConfiguration.Shipping && Target.Type != TargetRules.TargetType.Server) | ||||
| @@ -66,5 +74,6 @@ public class Gasa : ModuleRules | ||||
|     #endregion Plugins | ||||
|      | ||||
| 		PublicIncludePaths.Add("Gasa"); | ||||
| 		PublicIncludePathModuleNames.Add("Gasa"); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -48,6 +48,7 @@ class UGasaImage; | ||||
| class UGasaOverlay; | ||||
| class UGasaProgressBar; | ||||
| class UGasaSizeBox; | ||||
| class UUI_HostWidget; | ||||
| #pragma endregion Forwards | ||||
|  | ||||
| #pragma region Logging | ||||
| @@ -98,7 +99,7 @@ DECLARE_LOG_CATEGORY_EXTERN(LogGasa, Log, All); | ||||
| namespace Gasa | ||||
| { | ||||
| 	using ELogV = EGasaVerbosity; | ||||
| 	 | ||||
|  | ||||
| 	//◞ ‸ ◟// | ||||
| 	// Works for Unreal 5.4, Win64 MSVC (untested in other scenarios, for now) | ||||
| 	inline | ||||
| @@ -111,7 +112,7 @@ namespace Gasa | ||||
| 	{ | ||||
| 	#if !UE_BUILD_SHIPPING && !NO_LOGGING | ||||
| 		ELogVerbosity::Type EngineVerbosity = (ELogVerbosity::Type) Verbosity; | ||||
| 		 | ||||
|  | ||||
| 		static UE::Logging::Private::FStaticBasicLogDynamicData LOG_Dynamic; | ||||
| 		static UE::Logging::Private::FStaticBasicLogRecord | ||||
| 		LOG_Static(TEXT("%s -- %hs %hs(%d)"), File, Line, EngineVerbosity, LOG_Dynamic); | ||||
| @@ -132,13 +133,13 @@ namespace Gasa | ||||
| 	} | ||||
| } | ||||
|  | ||||
| #define GASA_Fatal(Message)       UE_LOG( Gasa, Fatal,       TEXT("%s -- %hs %hs(%d)"), *Message, __builtin_FILE(), __func__, __builtin_LINE()  ); | ||||
| #define GASA_Error(Message)       UE_LOG( Gasa, Error,       TEXT("%s -- %hs %hs(%d)"), *Message, __builtin_File(), __func__, __builtin_LINE()  ); | ||||
| #define GASA_Warning(Message)     UE_LOG( Gasa, Warning,     TEXT("%s -- %hs %hs(%d)"), *Message, __builtin_File(), __func__, __builtin_LINE()  ); | ||||
| #define GASA_Display(Message)     UE_LOG( Gasa, Display,     TEXT("%s -- %hs %hs(%d)"), *Message, __builtin_File(), __func__, __builtin_LINE()  ); | ||||
| #define GASA_Log(Message)         UE_LOG( Gasa, Log,         TEXT("%s -- %hs %hs(%d)"), *Message, __builtin_File(), __func__, __builtin_LINE()  ); | ||||
| #define GASA_Verbose(Message)     UE_LOG( Gasa, Verbose,     TEXT("%s -- %hs %hs(%d)"), *Message, __builtin_File(), __func__, __builtin_LINE()  ); | ||||
| #define GASA_VeryVerbose(Message) UE_LOG( Gasa, VeryVerbose, TEXT("%s -- %hs %hs(%d)"), *Message, __builtin_File(), __func__, __builtin_LINE()  ); | ||||
| #define GASA_Fatal(Message)       UE_LOG( LogGasa, Fatal,       TEXT("%s -- %hs %hs(%d)"), *Message, __builtin_FILE(), __func__, __builtin_LINE()  ); | ||||
| #define GASA_Error(Message)       UE_LOG( LogGasa, Error,       TEXT("%s -- %hs %hs(%d)"), *Message, __builtin_File(), __func__, __builtin_LINE()  ); | ||||
| #define GASA_Warning(Message)     UE_LOG( LogGasa, Warning,     TEXT("%s -- %hs %hs(%d)"), *Message, __builtin_File(), __func__, __builtin_LINE()  ); | ||||
| #define GASA_Display(Message)     UE_LOG( LogGasa, Display,     TEXT("%s -- %hs %hs(%d)"), *Message, __builtin_File(), __func__, __builtin_LINE()  ); | ||||
| #define GASA_Log(Message)         UE_LOG( LogGasa, Log,         TEXT("%s -- %hs %hs(%d)"), *Message, __builtin_File(), __func__, __builtin_LINE()  ); | ||||
| #define GASA_Verbose(Message)     UE_LOG( LogGasa, Verbose,     TEXT("%s -- %hs %hs(%d)"), *Message, __builtin_File(), __func__, __builtin_LINE()  ); | ||||
| #define GASA_VeryVerbose(Message) UE_LOG( LogGasa, VeryVerbose, TEXT("%s -- %hs %hs(%d)"), *Message, __builtin_File(), __func__, __builtin_LINE()  ); | ||||
| #pragma endregion Logging | ||||
|  | ||||
| #pragma region Timing | ||||
| @@ -154,8 +155,8 @@ namespace Gasa | ||||
| 	constexpr float _80Hz  = .013f; | ||||
| 	constexpr float _90Hz  = .011f; | ||||
| 	constexpr float _100Hz = .010f; | ||||
| 	constexpr float _120Hz = .083f; | ||||
| 	constexpr float _120Hz = .008f; | ||||
| 	constexpr float _240Hz = .004f; | ||||
| 	constexpr float _480Hz = .002f; | ||||
| } | ||||
| #pragma endregion Timing | ||||
| #pragma endregion Timing | ||||
|   | ||||
| @@ -1,18 +1,11 @@ | ||||
| #include "GasaDevOptions.h" | ||||
| #include "GasaDevOptions.h" | ||||
|  | ||||
| #include "GasaDevOptionsCache.h" | ||||
| #include "Actors/CameraMount.h" | ||||
| #include "UI/UI_HostWidget.h" | ||||
|  | ||||
| using namespace Gasa; | ||||
|  | ||||
| namespace Gasa | ||||
| { | ||||
| 	global FName Tag_GlobalPPV; | ||||
| } | ||||
|  | ||||
| void FGasaDevOptionsCache::CachedDevOptions() | ||||
| { | ||||
| 	using namespace Gasa; | ||||
|  | ||||
| 	UGasaDevOptions const* DevOs = GetDevOptions(); | ||||
| 	Tag_GlobalPPV = DevOs->Tag_GlobalPPV; | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -1,7 +1,9 @@ | ||||
| #pragma once | ||||
| #pragma once | ||||
|  | ||||
| #include "Engine/DeveloperSettings.h" | ||||
|  | ||||
| #include "GasaCommon.h" | ||||
|  | ||||
| #include "GasaDevOptions.generated.h" | ||||
|  | ||||
| UCLASS(Config=Game, DefaultConfig, meta=(DisplayName="Gasa")) | ||||
| @@ -9,6 +11,16 @@ class GASA_API UGasaDevOptions : public UDeveloperSettings | ||||
| { | ||||
| 	GENERATED_BODY() | ||||
| public: | ||||
|  | ||||
| 	// NOTE(Ed): Any Soft-References must have their includes defined in GasaDevOptions.cpp | ||||
| 	// They are used by GasaGen for the GasaDevOptionsCache | ||||
|  | ||||
| 	UPROPERTY(Config, EditAnywhere, BlueprintReadOnly, Category="UI") | ||||
| 	TSoftClassPtr<ACameraMount> Template_PlayerCamera; | ||||
|  | ||||
| 	UPROPERTY(Config, EditAnywhere, BlueprintReadOnly, Category="UI") | ||||
| 	TSoftClassPtr<UUI_HostWidget> Template_HUD_HostUI; | ||||
|  | ||||
| 	UPROPERTY(Config, EditAnywhere, BlueprintReadOnly, Category="Tags") | ||||
| 	FName Tag_GlobalPPV; | ||||
| }; | ||||
| @@ -19,11 +31,11 @@ namespace Gasa | ||||
|  | ||||
| 	FORCEINLINE | ||||
| 	UGasaDevOptions const* GetDevOptions() { | ||||
| 		return GetDefault<UGasaDevOptions>();	 | ||||
| 		return GetDefault<UGasaDevOptions>(); | ||||
| 	} | ||||
|  | ||||
| 	FORCEINLINE | ||||
| 	UGasaDevOptions* GetMutDevOptions() { | ||||
| 		return GetMutableDefault<UGasaDevOptions>();	 | ||||
| 		return GetMutableDefault<UGasaDevOptions>(); | ||||
| 	} | ||||
| } | ||||
|   | ||||
							
								
								
									
										17
									
								
								Project/Source/Gasa/GasaDevOptionsCache.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								Project/Source/Gasa/GasaDevOptionsCache.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| // This was generated by GasaGen/GasaGen.cpp | ||||
| #include "GasaDevOptionsCache.h" | ||||
|  | ||||
| #include "GasaDevOptions.h" | ||||
| #include "Actors/CameraMount.h" | ||||
| #include "UI/UI_HostWidget.h" | ||||
| using namespace Gasa; | ||||
|  | ||||
| void FGasaDevOptionsCache::CachedDevOptions() | ||||
| { | ||||
| 	UGasaDevOptions* DevOpts = GetMutDevOptions(); | ||||
|  | ||||
| 	Template_PlayerCamera = DevOpts->Template_PlayerCamera.LoadSynchronous(); | ||||
| 	Template_HUD_HostUI   = DevOpts->Template_HUD_HostUI.LoadSynchronous(); | ||||
|  | ||||
| 	Tag_GlobalPPV = DevOpts->Tag_GlobalPPV; | ||||
| } | ||||
| @@ -1,6 +1,5 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include "GasaCommon.h" | ||||
| // This was generated by GasaGen/GasaGen.cpp | ||||
| #pragma once | ||||
|  | ||||
| #include "GasaDevOptionsCache.generated.h" | ||||
|  | ||||
| @@ -8,6 +7,11 @@ USTRUCT() | ||||
| struct GASA_API FGasaDevOptionsCache | ||||
| { | ||||
| 	GENERATED_BODY() | ||||
| 	 | ||||
|  | ||||
| 	UPROPERTY() | ||||
| 	UClass* Template_PlayerCamera; | ||||
| 	UPROPERTY() | ||||
| 	UClass* Template_HUD_HostUI; | ||||
|  | ||||
| 	void CachedDevOptions(); | ||||
| }; | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
| 
 | ||||
| #include "Blueprint/GameViewportSubsystem.h" | ||||
| 
 | ||||
| #include "GasaViewport.generated.h" | ||||
| #include "GasaViewportSubsystem.generated.h" | ||||
| 
 | ||||
| UCLASS() | ||||
| class GASA_API UGasaViewportSubsystem : public UGameViewportSubsystem | ||||
| @@ -12,4 +12,4 @@ public: | ||||
| 	// UGasaViewportSubsystem();
 | ||||
| 
 | ||||
| 	 | ||||
| }; | ||||
| }; | ||||
| @@ -1,9 +0,0 @@ | ||||
| // Don't keep this included anywhere | ||||
| // Purely for inspection purposes | ||||
|  | ||||
| #include "GasaCommon.h" | ||||
|  | ||||
| void test() | ||||
| { | ||||
| 	UObject::StaticClass()->PropertiesSize | ||||
| } | ||||
							
								
								
									
										1
									
								
								Project/Source/Gasa/UI/GasaCanvas.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								Project/Source/Gasa/UI/GasaCanvas.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| #include "GasaCanvas.h" | ||||
							
								
								
									
										12
									
								
								Project/Source/Gasa/UI/GasaCanvas.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								Project/Source/Gasa/UI/GasaCanvas.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include "Engine/Canvas.h" | ||||
|  | ||||
| #include "GasaCanvas.generated.h" | ||||
|  | ||||
| UCLASS() | ||||
| class GASA_API UGasaCanvas : public UCanvas | ||||
| { | ||||
| 	GENERATED_BODY() | ||||
| public: | ||||
| }; | ||||
							
								
								
									
										1
									
								
								Project/Source/Gasa/UI/GasaCanvasPanel.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								Project/Source/Gasa/UI/GasaCanvasPanel.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| #include "GasaCanvasPanel.h" | ||||
							
								
								
									
										12
									
								
								Project/Source/Gasa/UI/GasaCanvasPanel.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								Project/Source/Gasa/UI/GasaCanvasPanel.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include "Components/CanvasPanel.h" | ||||
|  | ||||
| #include "GasaCanvasPanel.generated.h" | ||||
|  | ||||
| UCLASS() | ||||
| class GASA_API UGasaCanvasPanel : public UCanvasPanel | ||||
| { | ||||
| 	GENERATED_BODY() | ||||
| public: | ||||
| }; | ||||
							
								
								
									
										31
									
								
								Project/Source/Gasa/UI/GasaHUD.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								Project/Source/Gasa/UI/GasaHUD.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | ||||
| #include "GasaHUD.h" | ||||
|  | ||||
| #include "GasaDevOptions.h" | ||||
| #include "UI_HostWidget.h" | ||||
| #include "Blueprint/UserWidget.h" | ||||
|  | ||||
| using namespace Gasa; | ||||
|  | ||||
|  | ||||
| #pragma region HUD | ||||
| void AGasaHUD::ShowHUD() | ||||
| { | ||||
| 	Super::ShowHUD(); | ||||
| } | ||||
| #pragma endregion HUD | ||||
|  | ||||
| #pragma region Actor | ||||
| UE_DISABLE_OPTIMIZATION | ||||
| void AGasaHUD::BeginPlay() | ||||
| { | ||||
| 	Super::BeginPlay(); | ||||
|  | ||||
| 	HostWidget = CreateWidget<UUI_HostWidget>( GetWorld()  | ||||
| 		, GetDevOptions()->Template_HUD_HostUI.LoadSynchronous() ); | ||||
| 	HostWidget->AddToViewport(); | ||||
| 	 | ||||
| 	bool bHostVis = HostWidget->IsVisible(); | ||||
| 	Log(FString::Printf(TEXT("HostVIs: %s"), *FString::FromInt(bHostVis))); | ||||
| } | ||||
| UE_ENABLE_OPTIMIZATION | ||||
| #pragma endregion Actor | ||||
							
								
								
									
										25
									
								
								Project/Source/Gasa/UI/GasaHUD.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								Project/Source/Gasa/UI/GasaHUD.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include "GasaCommon.h" | ||||
| #include "GameFramework/HUD.h" | ||||
|  | ||||
| #include "GasaHUD.generated.h" | ||||
|  | ||||
|  | ||||
| UCLASS() | ||||
| class GASA_API AGasaHUD : public AHUD | ||||
| { | ||||
| 	GENERATED_BODY() | ||||
| public: | ||||
| 	UPROPERTY(VisibleAnywhere, BlueprintReadWrite) | ||||
| 	TObjectPtr<UUI_HostWidget> HostWidget; | ||||
|  | ||||
| #pragma region HUD	 | ||||
| 	void ShowHUD() override; | ||||
| #pragma endregion HUD	 | ||||
|  | ||||
| #pragma region Actor | ||||
| 	void BeginPlay() override; | ||||
|  | ||||
| #pragma endregion Actor | ||||
| }; | ||||
							
								
								
									
										22
									
								
								Project/Source/Gasa/UI/GasaProgressBar.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								Project/Source/Gasa/UI/GasaProgressBar.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | ||||
| #include "GasaProgressBar.h" | ||||
|  | ||||
| #include "GasaCommon.h" | ||||
|  | ||||
| using namespace Gasa; | ||||
|  | ||||
| #pragma region Object | ||||
| void UGasaProgressBar::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) | ||||
| { | ||||
| 	Super::PostEditChangeProperty(PropertyChangedEvent); | ||||
| } | ||||
|  | ||||
| void UGasaProgressBar::Serialize(FArchive& Ar) | ||||
| { | ||||
| 	Super::Serialize(Ar); | ||||
| } | ||||
|  | ||||
| void UGasaProgressBar::Serialize(FStructuredArchive::FRecord Record) | ||||
| { | ||||
| 	Super::Serialize(Record); | ||||
| } | ||||
| #pragma endregion Object | ||||
| @@ -10,4 +10,10 @@ class GASA_API UGasaProgressBar : public UProgressBar | ||||
| 	GENERATED_BODY() | ||||
| public: | ||||
|  | ||||
| #pragma region Object | ||||
| 	void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override; | ||||
|  | ||||
| 	void Serialize(FArchive& Ar) override; | ||||
| 	void Serialize(FStructuredArchive::FRecord Record) override; | ||||
| #pragma endregion Object | ||||
| }; | ||||
|   | ||||
| @@ -1,7 +1,310 @@ | ||||
| #include "GasaUserWidget.h" | ||||
|  | ||||
| #include "Blueprint/WidgetBlueprintGeneratedClass.h" | ||||
| #include "Blueprint/WidgetTree.h" | ||||
| #include "Components/HorizontalBoxSlot.h" | ||||
| #include "Components/Overlay.h" | ||||
| #include "Components/OverlaySlot.h" | ||||
| #include "Components/ScaleBoxSlot.h" | ||||
| #include "Components/ScrollBoxSlot.h" | ||||
| #include "Components/SizeBoxSlot.h" | ||||
| #include "Components/VerticalBoxSlot.h" | ||||
|  | ||||
| #if WITH_EDITOR | ||||
| #include "WidgetBlueprint.h" | ||||
| #include "Kismet2/BlueprintEditorUtils.h" | ||||
| #endif | ||||
|  | ||||
| #if 0 | ||||
| UWidget* UMyModalDialog::DeepDuplicateWidget(UWidget *pUWidget) | ||||
| { | ||||
| 	UWidget *pNewWidget = DuplicateObject<UWidget>(pUWidget, this); | ||||
| 	UPanelWidget *pNewUPanelWidget = Cast<UPanelWidget>(pNewWidget); | ||||
| 	if (pNewUPanelWidget) | ||||
| 	{ | ||||
| 		const TArray<UPanelSlot*>& slots = pNewUPanelWidget->GetSlots(); | ||||
| 		for (int32 iSlotNum = 0; iSlotNum < slots.Num(); ++iSlotNum) | ||||
| 		{ | ||||
| 			slots[iSlotNum]->Content = nullptr; | ||||
| 		} | ||||
| 		pNewUPanelWidget->ClearChildren(); | ||||
| 		UPanelWidget *pUPanelWidget = Cast<UPanelWidget>(pUWidget); | ||||
| 		for (int ii = 0; ii < pUPanelWidget->GetChildrenCount(); ++ii) | ||||
| 		{ | ||||
| 			UWidget *pChildUWidget = pUPanelWidget->GetChildAt(ii); | ||||
| 			UWidget *pNewChildWidget = DeepDuplicateWidget(pChildUWidget); | ||||
| 			UPanelSlot *pUPanelSlot = pNewUPanelWidget->AddChild(pNewChildWidget); | ||||
| 			UHorizontalBoxSlot *pNewUHorizontalBoxSlot = Cast<UHorizontalBoxSlot>(pUPanelSlot); | ||||
| 			if (pNewUHorizontalBoxSlot) | ||||
| 			{ | ||||
| 				UHorizontalBoxSlot *pUHorizontalBoxSlot = Cast<UHorizontalBoxSlot>(pChildUWidget->Slot); | ||||
| 				pNewUHorizontalBoxSlot->SetHorizontalAlignment(pUHorizontalBoxSlot->HorizontalAlignment); | ||||
| 				pNewUHorizontalBoxSlot->SetVerticalAlignment(pUHorizontalBoxSlot->VerticalAlignment); | ||||
| 			} | ||||
| 			USizeBoxSlot *pNewUSizeBoxSlot = Cast<USizeBoxSlot>(pUPanelSlot); | ||||
| 			if (pNewUSizeBoxSlot) | ||||
| 			{ | ||||
| 				USizeBoxSlot *pUSizeBoxSlot = Cast<USizeBoxSlot>(pChildUWidget->Slot); | ||||
| 				pNewUSizeBoxSlot->SetHorizontalAlignment(pUSizeBoxSlot->HorizontalAlignment); | ||||
| 				pNewUSizeBoxSlot->SetVerticalAlignment(pUSizeBoxSlot->VerticalAlignment); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return pNewWidget; | ||||
| } | ||||
| #endif | ||||
|  | ||||
| void UGasaUserWidget::OnLooseParentCompiled(UBlueprint* BP) | ||||
| { | ||||
| 	GenerateParentHierarchyFromLooseParent(); | ||||
| } | ||||
|  | ||||
| // This was just an experiment to see how possible it would be to generate a WidgetTree from a parent reference without using the usual blueprint inheritance. | ||||
| void UGasaUserWidget::GenerateParentHierarchyFromLooseParent() | ||||
| { | ||||
| #if WITH_EDITOR | ||||
| 	UWidgetBlueprintGeneratedClass* WBG_ParentClass = Cast<UWidgetBlueprintGeneratedClass>(LooseParent); | ||||
| 	UWidgetBlueprintGeneratedClass* WBG_Class      = Cast<UWidgetBlueprintGeneratedClass>(GetClass()); | ||||
| 	if (WBG_ParentClass == nullptr) | ||||
| 		return; | ||||
| 	if (WBG_Class == nullptr) | ||||
| 		return; | ||||
|  | ||||
| 	UPackage*         Package = WBG_Class->GetPackage(); | ||||
| 	UWidgetBlueprint* BP      = Cast<UWidgetBlueprint>(Package->FindAssetInPackage()); | ||||
| 	UWidgetTree*      WT      = BP->WidgetTree; | ||||
|  | ||||
| 	UPackage*         UserParentPackage = WBG_ParentClass->GetPackage(); | ||||
| 	UWidgetBlueprint* UserParentBP      = Cast<UWidgetBlueprint>(UserParentPackage->FindAssetInPackage()); | ||||
| 	UWidgetTree*      UserParentWT      = UserParentBP->WidgetTree;	 | ||||
|  | ||||
| 	TArray<UWidget*> UserParentWidgets; | ||||
| 	UserParentWT->GetAllWidgets(UserParentWidgets); | ||||
| 	for (UWidget* UserParentWidget : UserParentWidgets) | ||||
| 	{ | ||||
| 		UWidget* OldWidget = nullptr; | ||||
| 		UWidget* Widget    = WT->FindWidget(UserParentWidget->GetFName()); | ||||
| 		TArray<UWidget*> Children; | ||||
| 		UPanelWidget*    Parent = nullptr; | ||||
| 		 | ||||
| 		if (Widget == nullptr) | ||||
| 		{ | ||||
| 			if (UserParentWidget->GetClass()->IsChildOf(UUserWidget::StaticClass())) | ||||
| 				Widget = CreateWidget<UUserWidget>(WT, UserParentWidget->GetClass(), UserParentWidget->GetFName()); | ||||
| 			else | ||||
| 				Widget = NewObject<UWidget>(WT, UserParentWidget->GetClass(), UserParentWidget->GetFName(), RF_Transactional, UserParentWidget); | ||||
| 			 | ||||
| 			if (WT->RootWidget == nullptr) | ||||
| 			{ | ||||
| 				WT->RootWidget = Widget; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				Parent = WT->FindWidget<UPanelWidget>(UserParentWidget->GetParent()->GetFName()); | ||||
| 			} | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			// The widget existed previously (most likely already ran this before or manually created) | ||||
| 			// Try to preserve widget heiarchy attached to this if possible | ||||
| 			Parent = Widget->GetParent(); | ||||
| 			 | ||||
| 			UPanelWidget* Panel = Cast<UPanelWidget>(Widget); | ||||
| 			if (Panel) | ||||
| 			{ | ||||
| 				Children = Panel->GetAllChildren(); | ||||
| 			} | ||||
|  | ||||
| 			OldWidget = Widget; | ||||
| 			Widget = DuplicateObject<UWidget>(UserParentWidget, WT, UserParentWidget->GetFName()); | ||||
| 		} | ||||
|  | ||||
| 		UPanelWidget* NewPanel = Cast<UPanelWidget>(Widget); | ||||
| 		if (NewPanel) | ||||
| 		{ | ||||
| 			const TArray<UPanelSlot*>& Slots = NewPanel->GetSlots(); | ||||
| 			for (int32 Id = 0; Id < Slots.Num(); ++Id) | ||||
| 			{ | ||||
| 				Slots[Id]->Content = nullptr; | ||||
| 			} | ||||
| 			NewPanel->ClearChildren(); | ||||
| 		} | ||||
|  | ||||
| 		if (Parent) | ||||
| 		{ | ||||
| 			UPanelSlot* PSlot = Parent->AddChild(Widget); | ||||
| 			UScaleBoxSlot*      SlotScale   = Cast<UScaleBoxSlot>(PSlot); | ||||
| 			UScrollBoxSlot*     SlotScroll  = Cast<UScrollBoxSlot>(PSlot); | ||||
| 			UOverlaySlot*       SlotOverlay = Cast<UOverlaySlot>(PSlot); | ||||
| 			UHorizontalBoxSlot* SlotHB      = Cast<UHorizontalBoxSlot>(PSlot); | ||||
| 			USizeBoxSlot*       SlotSB      = Cast<USizeBoxSlot>(PSlot); | ||||
| 			UVerticalBoxSlot*   SlobVB      = Cast<UVerticalBoxSlot>(PSlot); | ||||
|  | ||||
| 			if (SlotOverlay) | ||||
| 			{ | ||||
| 				UOverlay* UPW_ParentOverlay = Cast<UOverlay>(UserParentWidget->GetParent()); | ||||
| 				UOverlaySlot* ParentSlot = Cast<UOverlaySlot>(UPW_ParentOverlay->GetSlots()[Parent->GetSlots().Num() - 1]); | ||||
| 				SlotOverlay->SetPadding( ParentSlot->GetPadding()); | ||||
| 				SlotOverlay->SetHorizontalAlignment( ParentSlot->GetHorizontalAlignment()); | ||||
| 				SlotOverlay->SetVerticalAlignment( ParentSlot->GetVerticalAlignment()); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		//This may not need to happen since the children check to see if they need to be added back. | ||||
| 		for (UWidget* Child : Children) | ||||
| 		{ | ||||
| 			if (UserParentWT->FindWidget(Child->GetFName())) | ||||
| 				continue; | ||||
| 			UPanelSlot* PSlot = Cast<UPanelWidget>(Widget)->AddChild(Child); | ||||
| 			UScaleBoxSlot*      SlotScale   = Cast<UScaleBoxSlot>(PSlot); | ||||
| 			UScrollBoxSlot*     SlotScroll  = Cast<UScrollBoxSlot>(PSlot); | ||||
| 			UOverlaySlot*       SlotOverlay = Cast<UOverlaySlot>(PSlot); | ||||
| 			UHorizontalBoxSlot* SlotHB      = Cast<UHorizontalBoxSlot>(PSlot); | ||||
| 			USizeBoxSlot*       SlotSB      = Cast<USizeBoxSlot>(PSlot); | ||||
| 			UVerticalBoxSlot*   SlobVB      = Cast<UVerticalBoxSlot>(PSlot); | ||||
|  | ||||
| 			// I'm not entirely sure if this is possible this way... | ||||
| 			if (SlotOverlay) | ||||
| 			{ | ||||
| 				UOverlay* ParentOverlay = Cast<UOverlay>(OldWidget->GetParent()); | ||||
| 				UOverlaySlot* ParentSlot = Cast<UOverlaySlot>(ParentOverlay->GetSlots()[Parent->GetSlots().Num() - 1]); | ||||
| 				SlotOverlay->SetPadding( ParentSlot->GetPadding()); | ||||
| 				SlotOverlay->SetHorizontalAlignment( ParentSlot->GetHorizontalAlignment()); | ||||
| 				SlotOverlay->SetVerticalAlignment( ParentSlot->GetVerticalAlignment()); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if (OldWidget) | ||||
| 			OldWidget->RemoveFromParent(); | ||||
| 	} | ||||
|  | ||||
| 	BP->Modify(); | ||||
| 	FBlueprintEditorUtils::MarkBlueprintAsStructurallyModified(BP); | ||||
| #endif | ||||
| } | ||||
|  | ||||
| UGasaUserWidget::UGasaUserWidget(FObjectInitializer const& ObjectInitializer) | ||||
| 	: UUserWidget(ObjectInitializer) | ||||
| { | ||||
| 	 | ||||
| {	 | ||||
| } | ||||
|  | ||||
| bool UGasaUserWidget::Initialize() | ||||
| { | ||||
| 	// If it's not initialized initialize it, as long as it's not the CDO, we never initialize the CDO. | ||||
| 	if (!bInitialized && !HasAnyFlags(RF_ClassDefaultObject)) | ||||
| 	{ | ||||
| 		// If this is a sub-widget of another UserWidget, default designer flags and player context to match those of the owning widget | ||||
| 		if (UUserWidget* OwningUserWidget = GetTypedOuter<UUserWidget>()) | ||||
| 		{ | ||||
| #if WITH_EDITOR | ||||
| 			SetDesignerFlags(OwningUserWidget->GetDesignerFlags()); | ||||
| #endif | ||||
| 			SetPlayerContext(OwningUserWidget->GetPlayerContext()); | ||||
| 		} | ||||
|  | ||||
| 		UWidgetBlueprintGeneratedClass* BGClass = Cast<UWidgetBlueprintGeneratedClass>(GetClass()); | ||||
| 		// Only do this if this widget is of a blueprint class | ||||
| 		if (BGClass) | ||||
| 		{ | ||||
| 			BGClass->InitializeWidget(this); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			InitializeNativeClassData(); | ||||
| 		} | ||||
|  | ||||
| 		if ( WidgetTree == nullptr ) | ||||
| 		{ | ||||
| 			WidgetTree = NewObject<UWidgetTree>(this, TEXT("WidgetTree"), RF_Transient); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			WidgetTree->SetFlags(RF_Transient); | ||||
|  | ||||
| 			InitializeNamedSlots(); | ||||
| 		} | ||||
|  | ||||
| 		// For backward compatibility, run the initialize event on widget that doesn't have a player context only when the class authorized it. | ||||
| 		bool bClassWantsToRunInitialized = BGClass && BGClass->bCanCallInitializedWithoutPlayerContext; | ||||
| 		if (!IsDesignTime() && (PlayerContext.IsValid() || bClassWantsToRunInitialized)) | ||||
| 		{ | ||||
| 			NativeOnInitialized(); | ||||
| 		} | ||||
|  | ||||
| #if WITH_EDITOR | ||||
| 		if (LooseParent && bUpdateOnParentCompile) | ||||
| 		{ | ||||
| 			UWidgetBlueprintGeneratedClass* WBG_ParentClass = Cast<UWidgetBlueprintGeneratedClass>(LooseParent); | ||||
| 			UPackage*         UserParentPackage = WBG_ParentClass->GetPackage(); | ||||
| 			UWidgetBlueprint* UserParentBP      = Cast<UWidgetBlueprint>(UserParentPackage->FindAssetInPackage()); | ||||
| 			UWidgetTree*      UserParentWT      = UserParentBP->WidgetTree; | ||||
|  | ||||
| 			if ( ! UserParentBP->OnCompiled().IsBoundToObject(this)) | ||||
| 			{ | ||||
| 				UserParentBP->OnCompiled().AddUObject(this, & ThisClass::OnLooseParentCompiled); | ||||
| 			} | ||||
| 		} | ||||
| #endif | ||||
|  | ||||
| 		bInitialized = true; | ||||
| 		return true; | ||||
| 	} | ||||
|  | ||||
| 	return false; | ||||
| } | ||||
|  | ||||
| void UGasaUserWidget::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) | ||||
| { | ||||
| 	Super::PostEditChangeProperty(PropertyChangedEvent); | ||||
|  | ||||
| 	FName PropertyName = (PropertyChangedEvent.Property != NULL) ? PropertyChangedEvent.Property->GetFName() : NAME_None; | ||||
| 	if (PropertyName == GET_MEMBER_NAME_CHECKED(UGasaUserWidget, LooseParent) | ||||
| 	|| PropertyName == GET_MEMBER_NAME_CHECKED(UGasaUserWidget, bUpdateOnParentCompile) ) | ||||
| 	{ | ||||
| #if WITH_EDITOR | ||||
| 		if (LooseParent && bUpdateOnParentCompile) | ||||
| 		{ | ||||
| 			UWidgetBlueprintGeneratedClass* WBG_ParentClass = Cast<UWidgetBlueprintGeneratedClass>(LooseParent); | ||||
| 			if (WBG_ParentClass == nullptr) | ||||
| 				return; | ||||
| 			UPackage*         UserParentPackage = WBG_ParentClass->GetPackage(); | ||||
| 			UWidgetBlueprint* UserParentBP      = Cast<UWidgetBlueprint>(UserParentPackage->FindAssetInPackage()); | ||||
| 			UWidgetTree*      UserParentWT      = UserParentBP->WidgetTree; | ||||
|  | ||||
| 			if ( ! UserParentBP->OnCompiled().IsBoundToObject(this)) | ||||
| 			{ | ||||
| 				UserParentBP->OnCompiled().AddUObject(this, & ThisClass::OnLooseParentCompiled); | ||||
| 			} | ||||
| 		} | ||||
| #endif	 | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void UGasaUserWidget::NativeOnInitialized() | ||||
| { | ||||
| 	Super::NativeOnInitialized(); | ||||
|  | ||||
| } | ||||
|  | ||||
| void UGasaUserWidget::NativePreConstruct() | ||||
| { | ||||
| 	Super::NativePreConstruct(); | ||||
|  | ||||
| #if 0 | ||||
| 	if (LooseParent) | ||||
| 	{ | ||||
| 		UWidgetBlueprintGeneratedClass* WBG_ParentClass = Cast<UWidgetBlueprintGeneratedClass>(LooseParent); | ||||
| 		UPackage*         UserParentPackage = WBG_ParentClass->GetPackage(); | ||||
| 		UWidgetBlueprint* UserParentBP      = Cast<UWidgetBlueprint>(UserParentPackage->FindAssetInPackage()); | ||||
| 		UWidgetTree*      UserParentWT      = UserParentBP->WidgetTree; | ||||
|  | ||||
| 		UserParentBP->OnCompiled().AddLambda( [this](UBlueprint* BP) { | ||||
| 			if (this) | ||||
| 			{ | ||||
| 				this->GenerateParentHierarchyFromLooseParent(); | ||||
| 			} | ||||
| 		}); | ||||
| 	} | ||||
| #endif | ||||
| } | ||||
|   | ||||
| @@ -9,6 +9,19 @@ class GASA_API UGasaUserWidget : public UUserWidget | ||||
| 	GENERATED_BODY() | ||||
| public: | ||||
|  | ||||
| 	UFUNCTION() | ||||
| 	void OnLooseParentCompiled(UBlueprint* BP); | ||||
|  | ||||
| 	UFUNCTION(CallInEditor, Category="Parent (Expriemental)", meta=( | ||||
| 		ToolTip="Exprimental: This will overrite the current LooseParent widgets or create them in this user widget. Beware it will be destructive changes")) | ||||
| 	void GenerateParentHierarchyFromLooseParent(); | ||||
|  | ||||
| 	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Parent (Expriemental)") | ||||
| 	bool bUpdateOnParentCompile = false; | ||||
| 	 | ||||
| 	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Parent (Expriemental)") | ||||
| 	TSubclassOf<UGasaUserWidget> LooseParent; | ||||
|  | ||||
| 	UPROPERTY(BlueprintReadOnly) | ||||
| 	TObjectPtr<UObject> WidgetController; | ||||
|  | ||||
| @@ -23,4 +36,13 @@ public: | ||||
| 	 | ||||
| 	UFUNCTION(BlueprintImplementableEvent) | ||||
| 	void OnWidgetControllerSet(); | ||||
|  | ||||
| #pragma region UserWidget | ||||
| 	bool Initialize() override; | ||||
|  | ||||
| 	void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override; | ||||
|  | ||||
| 	void NativeOnInitialized() override; | ||||
| 	void NativePreConstruct() override; | ||||
| #pragma endregion UserWidget | ||||
| }; | ||||
|   | ||||
| @@ -1,17 +1,70 @@ | ||||
| #include "GlobeProgressBar.h" | ||||
|  | ||||
| #include "GasaImage.h" | ||||
| #include "GasaOverlay.h" | ||||
| #include "GasaProgressBar.h" | ||||
| #include "GasaSizeBox.h" | ||||
|  | ||||
| #include "Components/OverlaySlot.h" | ||||
| #include "Blueprint/WidgetBlueprintGeneratedClass.h" | ||||
| #include "Blueprint/WidgetTree.h" | ||||
| #include "Extensions/WidgetBlueprintGeneratedClassExtension.h" | ||||
|  | ||||
| #if WITH_EDITOR | ||||
| #include "WidgetBlueprint.h" | ||||
| #include "Kismet2/BlueprintEditorUtils.h" | ||||
| #endif | ||||
|  | ||||
| using namespace Gasa; | ||||
|  | ||||
| // UGlobeProgressBar::UGlobeProgressBar(FObjectInitializer const& ObjectInitializer) | ||||
| // { | ||||
| // } | ||||
|  | ||||
| void UGlobeProgressBar::SetBackgroundStyle(FSlateBrush brush) | ||||
| void UGlobeProgressBar::GenerateDesignerWidgetTemplate() | ||||
| { | ||||
| 	BG->SetBrush( brush ); | ||||
| #if WITH_EDITOR | ||||
| 	UWidgetBlueprintGeneratedClass* WBG_Class = Cast<UWidgetBlueprintGeneratedClass>(GetClass()); | ||||
|  | ||||
| 	UPackage*         Package = WBG_Class->GetPackage(); | ||||
| 	UWidgetBlueprint* AssetBP = Cast<UWidgetBlueprint>(Package->FindAssetInPackage()); | ||||
| 	UWidgetTree*      WT      = AssetBP->WidgetTree; | ||||
|  | ||||
| 	UWidget* AssetRoot = AssetBP->WidgetTree->RootWidget; | ||||
|  | ||||
| 	UGasaSizeBox*     Asset_SB      = WT->FindWidget<UGasaSizeBox>("Root"); | ||||
| 	UGasaOverlay*     Asset_Overlay = WT->FindWidget<UGasaOverlay>("Overlay"); | ||||
| 	UGasaImage*       Asset_Bezel   = WT->FindWidget<UGasaImage>("Bezel"); | ||||
| 	UGasaImage*       Asset_Glass   = WT->FindWidget<UGasaImage>("Glass"); | ||||
| 	UGasaProgressBar* Asset_Bar     = WT->FindWidget<UGasaProgressBar>("Bar"); | ||||
| 	if (Root_SB == nullptr) | ||||
| 		Asset_SB = WT->ConstructWidget<UGasaSizeBox>(UGasaSizeBox::StaticClass(), FName("Root_SB")); | ||||
| 	if (Overlay == nullptr) | ||||
| 		Asset_Overlay = WT->ConstructWidget<UGasaOverlay>(UGasaOverlay::StaticClass(), FName("Overlay")); | ||||
| 	if (Bezel == nullptr) | ||||
| 		Asset_Bezel = WT->ConstructWidget<UGasaImage>(UGasaImage::StaticClass(), FName("Bezel")); | ||||
| 	if (Glass == nullptr) | ||||
| 		Asset_Glass = WT->ConstructWidget<UGasaImage>(UGasaImage::StaticClass(), FName("Glass")); | ||||
| 	if (Bar == nullptr) | ||||
| 		Asset_Bar = WT->ConstructWidget<UGasaProgressBar>(UGasaProgressBar::StaticClass(), FName("Bar")); | ||||
| 	 | ||||
| 	WT->RootWidget = Asset_SB; | ||||
| 	Asset_SB->ClearChildren(); | ||||
| 	Asset_Overlay->ClearChildren(); | ||||
| 	Asset_SB->AddChild(Asset_Overlay); | ||||
| 	Asset_Overlay->AddChild(Asset_Bezel); | ||||
| 	Asset_Overlay->AddChild(Asset_Glass); | ||||
| 	Asset_Overlay->AddChild(Asset_Bar); | ||||
| 	 | ||||
| 	AssetBP->Modify(); | ||||
| 	FBlueprintEditorUtils::MarkBlueprintAsStructurallyModified(AssetBP); | ||||
| #endif | ||||
| } | ||||
|  | ||||
| #pragma region Bindings | ||||
| void UGlobeProgressBar::SetBezelStyle(FSlateBrush brush) | ||||
| { | ||||
| 	Bezel->SetBrush( brush ); | ||||
| } | ||||
|  | ||||
| void UGlobeProgressBar::SetBarPadding(FMargin margin ) | ||||
| @@ -38,24 +91,52 @@ void UGlobeProgressBar::SetGlassStyle(FSlateBrush brush) | ||||
|  | ||||
| void UGlobeProgressBar::SetSize(float width, float height) | ||||
| { | ||||
| 	SizeBox_Root->SetWidthOverride(  width ); | ||||
| 	SizeBox_Root->SetHeightOverride( height ); | ||||
| 	Root_SB->SetWidthOverride(  width ); | ||||
| 	Root_SB->SetHeightOverride( height ); | ||||
| } | ||||
| #pragma endregion Bindings | ||||
|  | ||||
| #pragma region Widget | ||||
| void UGlobeProgressBar::SynchronizeProperties() | ||||
| { | ||||
| 	Super::SynchronizeProperties(); | ||||
| } | ||||
|  | ||||
| #if 0 | ||||
| void UGlobeProgressBar::UpdateSize() | ||||
| void UGlobeProgressBar::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) | ||||
| { | ||||
| 	 | ||||
| 	Super::PostEditChangeProperty(PropertyChangedEvent); | ||||
| } | ||||
|  | ||||
| void UGlobeProgressBar::UpdateBackground() | ||||
| { | ||||
| } | ||||
| #endif | ||||
| #pragma endregion Widget | ||||
|  | ||||
| #pragma region UserWidget | ||||
| void UGlobeProgressBar::NativePreConstruct() | ||||
| { | ||||
| 	Super::NativePreConstruct(); | ||||
| 	// Super::NativePreConstruct(); - Inlined | ||||
| 	LLM_SCOPE_BYTAG(UI_UMG); | ||||
| 	const bool bIsDesignTime = IsDesignTime(); | ||||
|  | ||||
| 	UWidgetBlueprintGeneratedClass* WBG_Class = Cast<UWidgetBlueprintGeneratedClass>(GetClass()); | ||||
| 	if (WBG_Class) | ||||
| 	{ | ||||
| 		WBG_Class->ForEachExtension([this, bIsDesignTime](UWidgetBlueprintGeneratedClassExtension* Extension) | ||||
| 			{ | ||||
| 				Extension->PreConstruct(this, bIsDesignTime); | ||||
| 			}); | ||||
| 	} | ||||
|  | ||||
| 	DesiredFocusWidget.Resolve(WidgetTree); | ||||
|  | ||||
| 	// Blueprint Callback | ||||
| 	PreConstruct(bIsDesignTime);	 | ||||
| } | ||||
|  | ||||
| void UGlobeProgressBar::Serialize(FArchive& Ar) | ||||
| { | ||||
| 	Super::Serialize(Ar); | ||||
| } | ||||
|  | ||||
| void UGlobeProgressBar::Serialize(FStructuredArchive::FRecord Record) | ||||
| { | ||||
| 	Super::Serialize(Record); | ||||
| } | ||||
| #pragma endregion UserWidget | ||||
|   | ||||
| @@ -11,25 +11,29 @@ class GASA_API UGlobeProgressBar : public UGasaUserWidget | ||||
| 	GENERATED_BODY() | ||||
| 	 | ||||
| public: | ||||
| 	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (BindWidget), Category="Globe") | ||||
| 	UGasaSizeBox* SizeBox_Root; | ||||
|  | ||||
| 	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (BindWidget), Category="Globe") | ||||
| 	UGasaOverlay* Overlay_Root; | ||||
| 	// Just learning: https://benui.ca/unreal/build-widgets-in-editor/?utm_medium=social&utm_source=Discord | ||||
| 	UFUNCTION(CallInEditor, Category="Generate Designer Widget Template") | ||||
| 	void GenerateDesignerWidgetTemplate(); | ||||
| 	 | ||||
| 	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (BindWidget), Category="Globe") | ||||
| 	UGasaImage* Glass; | ||||
| #pragma region Bindings | ||||
| 	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (BindWidgetOptional), Category="Globe") | ||||
| 	UGasaSizeBox* Root_SB; | ||||
|  | ||||
| 	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (BindWidgetOptional), Category="Globe") | ||||
| 	UGasaOverlay* Overlay; | ||||
| 	 | ||||
| 	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (BindWidget), Category="Globe") | ||||
| 	UGasaImage* BG; | ||||
| 	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (BindWidgetOptional), Category="Globe") | ||||
| 	UGasaImage* Bezel; | ||||
| 	 | ||||
| 	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (BindWidget), Category="Globe") | ||||
| 	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (BindWidgetOptional), Category="Globe") | ||||
| 	UGasaProgressBar* Bar; | ||||
| 	 | ||||
| 	// UGlobeProgressBar(FObjectInitializer const& ObjectInitializer); | ||||
|  | ||||
| 	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (BindWidgetOptional), Category="Globe") | ||||
| 	UGasaImage* Glass; | ||||
| 	 | ||||
| 	UFUNCTION(BlueprintCallable, Category="Globe") | ||||
| 	void SetBackgroundStyle(FSlateBrush brush); | ||||
| 	void SetBezelStyle(FSlateBrush brush); | ||||
|  | ||||
| 	UFUNCTION(BlueprintCallable, Category="Globe") | ||||
| 	void SetBarPadding( FMargin margin ); | ||||
| @@ -45,16 +49,22 @@ public: | ||||
| 	 | ||||
| 	UFUNCTION(BlueprintCallable, Category="Globe") | ||||
| 	void SetSize(float width, float height); | ||||
|  | ||||
| #if 0 | ||||
| 	UFUNCTION(BlueprintCallable, Category="Globe") | ||||
| 	void UpdateSize(); | ||||
| #pragma endregion Bindings | ||||
| 	 | ||||
| 	UFUNCTION(BlueprintCallable, Category="Globe") | ||||
| 	void UpdateBackground(); | ||||
| #endif | ||||
| 	// UGlobeProgressBar(FObjectInitializer const& ObjectInitializer); | ||||
|  | ||||
| #pragma region Widget | ||||
| 	void SynchronizeProperties() override; | ||||
| #pragma endregion Widget | ||||
|  | ||||
| 	void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override; | ||||
|  | ||||
| #pragma region UserWidget | ||||
| 	void NativePreConstruct() override; | ||||
| #pragma endregion UserWidget | ||||
|  | ||||
| #pragma region Object | ||||
| 	void Serialize(FArchive& Ar) override; | ||||
| 	void Serialize(FStructuredArchive::FRecord Record) override; | ||||
| #pragma endregion Object | ||||
| }; | ||||
|   | ||||
							
								
								
									
										1
									
								
								Project/Source/Gasa/UI/UI_HostWidget.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								Project/Source/Gasa/UI/UI_HostWidget.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| #include "UI_HostWidget.h" | ||||
							
								
								
									
										13
									
								
								Project/Source/Gasa/UI/UI_HostWidget.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								Project/Source/Gasa/UI/UI_HostWidget.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include "GasaUserWidget.h" | ||||
|  | ||||
| #include "UI_HostWidget.generated.h" | ||||
|  | ||||
| UCLASS() | ||||
| class GASA_API UUI_HostWidget : public UGasaUserWidget | ||||
| { | ||||
| 	GENERATED_BODY() | ||||
| public: | ||||
| // #pragma region  | ||||
| }; | ||||
| @@ -4,7 +4,7 @@ | ||||
| #include "WidgetController.generated.h" | ||||
|  | ||||
| UCLASS(BlueprintType) | ||||
| class GASA_API UWdgetController : public UObject | ||||
| class GASA_API UWidgetController : public UObject | ||||
| { | ||||
| 	GENERATED_BODY() | ||||
| public: | ||||
|   | ||||
		Reference in New Issue
	
	Block a user