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:
@@ -0,0 +1,43 @@
|
||||
root = true
|
||||
|
||||
[*]
|
||||
charset = utf-8
|
||||
indent_style = tab
|
||||
indent_size = 4
|
||||
tab_width = 4
|
||||
trim_trailing_whitespace = false
|
||||
max_line_length = 150
|
||||
|
||||
# MSBuild
|
||||
[*.{csproj,proj,projitems,shproj,fsproj,target,props}]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
# XML config files
|
||||
[*.{config,nuspec,resx,natvis}]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
[*.{h, c, hpp, cpp}]
|
||||
indent_style = tab
|
||||
indent_size = 4
|
||||
|
||||
[*.{ps1, psm1}]
|
||||
indent_style = tab
|
||||
indent_size = 4
|
||||
|
||||
[*.md]
|
||||
indent_style = space
|
||||
indent_size = 4
|
||||
|
||||
|
||||
[*.{natvis, natstepfilter}]
|
||||
indent_style = tab
|
||||
indent_size = 4
|
||||
|
||||
# Settings for Verse source files
|
||||
[*.{verse,versetest}]
|
||||
indent_style = space
|
||||
indent_size = 4
|
||||
tab_width = 4
|
||||
max_line_length = off
|
||||
@@ -26,3 +26,5 @@ Project/Binaries/GasaGen.map
|
||||
Project/Binaries/GasaGen.obj
|
||||
Project/Binaries/vc140.pdb
|
||||
Project/Saved/Config/ConsoleHistory.ini
|
||||
*.pdb
|
||||
Project/Saved/Diff
|
||||
|
||||
Vendored
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"configurations": [
|
||||
{
|
||||
"name": "Win32",
|
||||
"includePath": [
|
||||
"${workspaceFolder}/**"
|
||||
],
|
||||
"defines": [
|
||||
"_DEBUG",
|
||||
"UNICODE",
|
||||
"_UNICODE",
|
||||
"GASA_INTELLISENSE_DIRECTIVES=1"
|
||||
],
|
||||
"windowsSdkVersion": "10.0.22621.0",
|
||||
"compilerPath": "cl.exe"
|
||||
}
|
||||
],
|
||||
"version": 4
|
||||
}
|
||||
Vendored
+1
-1
@@ -10,7 +10,7 @@
|
||||
"name": "Debug GenGas vsdbg",
|
||||
"program": "${workspaceFolder}/Project/Binaries/GasaGen.exe",
|
||||
"args": [],
|
||||
"cwd": "${workspaceFolder}/Project/",
|
||||
"cwd": "${workspaceFolder}",
|
||||
"visualizerFile": "${workspaceFolder}/scripts/gencpp.natvis"
|
||||
},
|
||||
]
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -7,6 +7,9 @@ CopyrightNotice=
|
||||
[/Script/Gasa.GasaDevOptions]
|
||||
Tag_PPV=Global_PPV
|
||||
Tag_GlobalPPV=Global_PPV
|
||||
Template_PlayerCamera=/Game/Actors/BP_CameraMount.BP_CameraMount_C
|
||||
Template_HUD_HostUI=/Game/UI/UI_Host.UI_Host_C
|
||||
|
||||
[/Script/GameplayAbilities.AbilitySystemGlobals]
|
||||
bUseDebugTargetFromHud=true
|
||||
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -304,6 +304,46 @@
|
||||
{
|
||||
"Name": "GitSourceControl",
|
||||
"Enabled": true
|
||||
},
|
||||
{
|
||||
"Name": "SlateInsights",
|
||||
"Enabled": true
|
||||
},
|
||||
{
|
||||
"Name": "TraceUtilities",
|
||||
"Enabled": true
|
||||
},
|
||||
{
|
||||
"Name": "NetworkPredictionInsights",
|
||||
"Enabled": true
|
||||
},
|
||||
{
|
||||
"Name": "TraceSourceFilters",
|
||||
"Enabled": true
|
||||
},
|
||||
{
|
||||
"Name": "GameplayInsights",
|
||||
"Enabled": true
|
||||
},
|
||||
{
|
||||
"Name": "RenderGraphInsights",
|
||||
"Enabled": true
|
||||
},
|
||||
{
|
||||
"Name": "BlueprintStats",
|
||||
"Enabled": true
|
||||
},
|
||||
{
|
||||
"Name": "ColorCorrectRegions",
|
||||
"Enabled": true
|
||||
},
|
||||
{
|
||||
"Name": "ControlFlows",
|
||||
"Enabled": true
|
||||
},
|
||||
{
|
||||
"Name": "LiveUpdateForSlate",
|
||||
"Enabled": true
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
#include "GasaViewport.h"
|
||||
@@ -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>();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
#include "GasaCanvas.h"
|
||||
@@ -0,0 +1,12 @@
|
||||
#pragma once
|
||||
|
||||
#include "Engine/Canvas.h"
|
||||
|
||||
#include "GasaCanvas.generated.h"
|
||||
|
||||
UCLASS()
|
||||
class GASA_API UGasaCanvas : public UCanvas
|
||||
{
|
||||
GENERATED_BODY()
|
||||
public:
|
||||
};
|
||||
@@ -0,0 +1 @@
|
||||
#include "GasaCanvasPanel.h"
|
||||
@@ -0,0 +1,12 @@
|
||||
#pragma once
|
||||
|
||||
#include "Components/CanvasPanel.h"
|
||||
|
||||
#include "GasaCanvasPanel.generated.h"
|
||||
|
||||
UCLASS()
|
||||
class GASA_API UGasaCanvasPanel : public UCanvasPanel
|
||||
{
|
||||
GENERATED_BODY()
|
||||
public:
|
||||
};
|
||||
@@ -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
|
||||
@@ -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
|
||||
};
|
||||
@@ -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
|
||||
};
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
#include "UI_HostWidget.h"
|
||||
@@ -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:
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Runtime;
|
||||
using BuildSettingsVersion = UnrealBuildTool.BuildSettingsVersion;
|
||||
using TargetInfo = UnrealBuildTool.TargetInfo;
|
||||
using TargetRules = UnrealBuildTool.TargetRules;
|
||||
@@ -11,10 +15,15 @@ public class GasaEditorTarget : TargetRules
|
||||
|
||||
DefaultBuildSettings = BuildSettingsVersion.Latest;
|
||||
|
||||
// bUseUnityBuild = false;
|
||||
bUseUnityBuild = true;
|
||||
// bUseXGEController = false;
|
||||
|
||||
ExtraModuleNames.Add("Gasa");
|
||||
ExtraModuleNames.Add("GasaEditor");
|
||||
|
||||
DirectoryInfo di_uproject = new DirectoryInfo(Path.GetDirectoryName(ProjectFile.ToString())).Parent;
|
||||
string path_uproject = di_uproject.FullName;
|
||||
string path_scripts = Path.Combine(path_uproject, "scripts");
|
||||
string ps_gen_pass_gasa = Path.Combine(path_scripts, "gen_pass_gasa.ps1");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,171 @@
|
||||
#include "GlobeProgressBarDetails.h"
|
||||
|
||||
#include "BaseWidgetBlueprint.h"
|
||||
#include "BlueprintEditor.h"
|
||||
#include "GasaEditorCommon.h"
|
||||
#include "DetailCategoryBuilder.h"
|
||||
#include "DetailLayoutBuilder.h"
|
||||
#include "DetailWidgetRow.h"
|
||||
#include "PropertyCustomizationHelpers.h"
|
||||
#include "Blueprint/WidgetBlueprintGeneratedClass.h"
|
||||
#include "Blueprint/WidgetTree.h"
|
||||
#include "Components/ProgressBar.h"
|
||||
#include "Gasa/UI/GlobeProgressBar.h"
|
||||
#include "Kismet2/BlueprintEditorUtils.h"
|
||||
#include "UI/GasaProgressBar.h"
|
||||
|
||||
UE_DISABLE_OPTIMIZATION
|
||||
void FGlobeProgressBarDetails::CustomizeDetails(IDetailLayoutBuilder& LayoutBuilder)
|
||||
{
|
||||
IDetailCategoryBuilder& GlobeCategory = LayoutBuilder.EditCategory("Globe");
|
||||
|
||||
UObject* GlobeBar = nullptr;
|
||||
UGlobeProgressBar* Globe = nullptr;
|
||||
for (TWeakObjectPtr<UObject> Object : LayoutBuilder.GetSelectedObjects())
|
||||
{
|
||||
if ( ! Object.IsValid())
|
||||
return;
|
||||
|
||||
Globe = Cast<UGlobeProgressBar>(Object.Get());
|
||||
if (Globe)
|
||||
break;
|
||||
}
|
||||
|
||||
if (Globe && Globe->Bar)
|
||||
{
|
||||
auto StyleFillImage = Globe->Bar->GetWidgetStyle().FillImage.GetResourceObject();
|
||||
Thumbnail = MakeShareable(new FAssetThumbnail(FAssetData(StyleFillImage), 64, 64, LayoutBuilder.GetThumbnailPool()));
|
||||
}
|
||||
|
||||
TSharedPtr<IPropertyHandle>
|
||||
ProgressBarStyle = LayoutBuilder.GetProperty(GET_MEMBER_NAME_CHECKED(UGlobeProgressBar, Bar), UGlobeProgressBar::StaticClass());
|
||||
ProgressBarStyle->GetValue(GlobeBar);
|
||||
if (ProgressBarStyle && ! ProgressBarStyle->IsValidHandle())
|
||||
return;
|
||||
|
||||
// This can't be done, UE widget parenting forces the parent widget's hierarchy to be immutable at 'design time'.
|
||||
// This is because a proper clone of the UWidgetBlueprintGeneratedClass parent's widget tree is not done.
|
||||
// Instead... I don't even know what they are even doing with the widget tree because somehow they still have a unique widget tree
|
||||
// for at least the child widget.
|
||||
// All code paths related to this are not navigable in a reasonable amount of time.
|
||||
// So I don't even know why this failure point exist architecturally...
|
||||
#if 0
|
||||
// TSharedPtr<IPropertyHandle> WidgetStyle = ProgressBarStyleHandle->GetChildHandle("WidgetStyle");
|
||||
// if ( ! WidgetStyle.IsValid())
|
||||
// return;
|
||||
IDetailPropertyRow& ProgressBarRow = LayoutBuilder.AddPropertyToCategory(ProgressBarStyle);
|
||||
|
||||
FDetailWidgetRow& RowWidget = ProgressBarRow.CustomWidget();
|
||||
{
|
||||
FDetailWidgetDecl& RowNameWidget = RowWidget.NameContent();
|
||||
{
|
||||
TSharedRef<STextBlock>
|
||||
TextBlock = SNew(STextBlock);
|
||||
TextBlock->SetText(FText::FromString(TEXT("Bar Fill Material")));
|
||||
TextBlock->SetFont(LayoutBuilder.GetDetailFont());
|
||||
RowNameWidget.Widget = TextBlock;
|
||||
}
|
||||
|
||||
FDetailWidgetDecl& RowValueWidget = RowWidget.ValueContent();
|
||||
TSharedRef<SHorizontalBox> HBox = SNew(SHorizontalBox);
|
||||
{
|
||||
SHorizontalBox::FSlot::FSlotArguments ThumbnailSlot = SHorizontalBox::Slot();
|
||||
{
|
||||
TSharedRef<SBox> ThumbnailBox = SNew(SBox);
|
||||
ThumbnailBox->SetWidthOverride(64);
|
||||
ThumbnailBox->SetHeightOverride(64);
|
||||
|
||||
if ( Thumbnail.IsValid() )
|
||||
ThumbnailBox->SetContent( Thumbnail->MakeThumbnailWidget());
|
||||
else
|
||||
ThumbnailBox->SetContent( SNullWidget::NullWidget );
|
||||
|
||||
ThumbnailSlot.AutoWidth();
|
||||
ThumbnailSlot.AttachWidget( ThumbnailBox );
|
||||
}
|
||||
|
||||
SHorizontalBox::FSlot::FSlotArguments DropDownSlot = SHorizontalBox::Slot();
|
||||
{
|
||||
TSharedRef<SObjectPropertyEntryBox> EntryBox = SNew(SObjectPropertyEntryBox);
|
||||
{
|
||||
SObjectPropertyEntryBox::FArguments Args;
|
||||
Args.PropertyHandle(ProgressBarStyle);
|
||||
Args.AllowClear(false);
|
||||
// Args.OnShouldFilterAsset_Lambda( [&](FAssetData const& Asset) -> bool
|
||||
// {
|
||||
// FString const AssetPath = Asset.ObjectPath.ToString();
|
||||
// // Add conditional filters here
|
||||
// return true;
|
||||
// });
|
||||
Args.DisplayThumbnail(false);
|
||||
Args.OnObjectChanged_Lambda( [this, Globe, &ProgressBarStyle, &LayoutBuilder](FAssetData const& Asset)
|
||||
{
|
||||
if ( ! Asset.IsValid() || ! Thumbnail.IsValid() || ! Globe || ! Globe->Bar )
|
||||
return;
|
||||
|
||||
FProgressBarStyle
|
||||
Style = Globe->Bar->GetWidgetStyle();
|
||||
Style.FillImage.SetResourceObject(Asset.GetAsset());
|
||||
|
||||
// Get the Blueprint that owns this widget and mark it as modified
|
||||
UBaseWidgetBlueprint* GlobeBP = Cast<UBaseWidgetBlueprint>(Globe->WidgetGeneratedBy);
|
||||
if (GlobeBP != nullptr)
|
||||
{
|
||||
GlobeBP->Modify();
|
||||
UObject* CDO = GlobeBP->GeneratedClass->GetDefaultObject();
|
||||
UGlobeProgressBar* GlobeCDO = Cast<UGlobeProgressBar>(CDO);
|
||||
|
||||
UWidget* PossibleWidget = Cast<UBaseWidgetBlueprint>(GlobeBP)->WidgetTree->FindWidget("Bar");
|
||||
if (PossibleWidget)
|
||||
{
|
||||
UGasaProgressBar* BarWidget = Cast<UGasaProgressBar>(PossibleWidget);
|
||||
BarWidget->SetWidgetStyle(Style);
|
||||
GlobeBP->MarkPackageDirty();
|
||||
}
|
||||
else // Its parent is it.
|
||||
{
|
||||
UWidgetBlueprintGeneratedClass* Parent = Cast<UWidgetBlueprintGeneratedClass>(GlobeBP->ParentClass);
|
||||
UPackage* Pkg = Parent->GetOuterUPackage();
|
||||
|
||||
PossibleWidget = Parent->GetWidgetTreeArchetype()->FindWidget("Bar");
|
||||
if (PossibleWidget)
|
||||
{
|
||||
GlobeCDO->Bar = GlobeCDO->WidgetTree->ConstructWidget<UGasaProgressBar>( PossibleWidget->GetClass(), "Bar" );
|
||||
Globe->Bar = GlobeCDO->Bar;
|
||||
GlobeCDO->Modify();
|
||||
GlobeCDO->MarkPackageDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Globe->SetBarStyle(Style);
|
||||
Globe->Bar->Modify();
|
||||
Globe->Modify();
|
||||
|
||||
Thumbnail->SetAsset(Asset);
|
||||
Thumbnail->RefreshThumbnail();
|
||||
});
|
||||
// Args.CustomResetToDefault(FResetToDefaultOverride::Hide());
|
||||
Args.DisplayBrowse(true);
|
||||
EntryBox->Construct(Args);
|
||||
}
|
||||
|
||||
DropDownSlot.AutoWidth();
|
||||
DropDownSlot.AttachWidget(EntryBox);
|
||||
}
|
||||
|
||||
SHorizontalBox::FArguments Args = SHorizontalBox::FArguments();
|
||||
Args.operator+(ThumbnailSlot);
|
||||
Args.operator+(DropDownSlot);
|
||||
HBox->Construct(Args);
|
||||
RowValueWidget.Widget = HBox;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
bool FGlobeProgressBarDetails::CheckAsset(FAssetData const& Asset)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
UE_ENABLE_OPTIMIZATION
|
||||
@@ -0,0 +1,14 @@
|
||||
#pragma once
|
||||
#include "IDetailCustomization.h"
|
||||
|
||||
|
||||
class FGlobeProgressBarDetails : public IDetailCustomization
|
||||
{
|
||||
public:
|
||||
static TSharedRef<IDetailCustomization> MakeInstance() { return MakeShareable(new FGlobeProgressBarDetails); }
|
||||
|
||||
void CustomizeDetails(IDetailLayoutBuilder& DetailBuilder) override;
|
||||
|
||||
static bool CheckAsset(FAssetData const& Asset);
|
||||
TSharedPtr<FAssetThumbnail> Thumbnail;
|
||||
};
|
||||
@@ -8,12 +8,22 @@ public class GasaEditor : ModuleRules
|
||||
#region Engine
|
||||
PrivateIncludePathModuleNames.AddRange(new string[] {
|
||||
"Core",
|
||||
"CoreUObject",
|
||||
"Engine",
|
||||
});
|
||||
PrivateDependencyModuleNames.AddRange(new string[] {
|
||||
"Core",
|
||||
"Core",
|
||||
"Engine",
|
||||
"CoreUObject",
|
||||
"PropertyEditor",
|
||||
"SlateCore",
|
||||
"Slate",
|
||||
"UMG",
|
||||
"UnrealEd",
|
||||
});
|
||||
#endregion Engine
|
||||
|
||||
PublicIncludePathModuleNames.Add("Gasa");
|
||||
PublicIncludePaths.Add("GasaEditor");
|
||||
PrivateDependencyModuleNames.Add("Gasa");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
#include "GasaEditorCommon.h"
|
||||
|
||||
DEFINE_LOG_CATEGORY(LogGasaEditor);
|
||||
@@ -0,0 +1,68 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "CoreMinimal.h"
|
||||
#include "Gasa/GasaCommon.h"
|
||||
|
||||
#pragma region Engine Forwards
|
||||
#pragma endregion Engine Forwards
|
||||
|
||||
#pragma region Engine Plugin Forwards
|
||||
#pragma endregion Engine Plugin Forwards
|
||||
|
||||
// Gasa Editor
|
||||
|
||||
#pragma region Forwards
|
||||
#pragma endregion Forwards
|
||||
|
||||
#pragma region Logging
|
||||
DECLARE_LOG_CATEGORY_EXTERN(LogGasaEditor, Log, All);
|
||||
|
||||
namespace Gasa
|
||||
{
|
||||
using ELogV = EGasaVerbosity;
|
||||
|
||||
//◞ ‸ ◟//
|
||||
// Works for Unreal 5.4, Win64 MSVC (untested in other scenarios, for now)
|
||||
inline
|
||||
void LogEditor( FString Message, EGasaVerbosity Verbosity = EGasaVerbosity::Log
|
||||
, FLogCategoryBase& Category = LogGasaEditor
|
||||
, bool DumpStack = false
|
||||
, int32 Line = __builtin_LINE()
|
||||
, const ANSICHAR* File = __builtin_FILE()
|
||||
, const ANSICHAR* Func = __builtin_FUNCTION() )
|
||||
{
|
||||
#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("%80s -- %hs %hs(%d)"), File, Line, EngineVerbosity, LOG_Dynamic);
|
||||
|
||||
if ((EngineVerbosity & ELogVerbosity::VerbosityMask) <= ELogVerbosity::COMPILED_IN_MINIMUM_VERBOSITY)
|
||||
{
|
||||
if ((EngineVerbosity & ELogVerbosity::VerbosityMask) <= Category.GetVerbosity())
|
||||
{
|
||||
if ( ! Category.IsSuppressed(EngineVerbosity))
|
||||
{
|
||||
if (DumpStack)
|
||||
FDebug::DumpStackTraceToLog(EngineVerbosity);
|
||||
BasicLog(Category, &LOG_Static, *Message, File, Func, Line);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
#define GasaEd_Fatal(Message) UE_LOG( LogGasaEditor, Fatal, TEXT("%s -- %hs %hs(%d)"), *Message, __builtin_FILE(), __func__, __builtin_LINE() );
|
||||
#define GasaEd_Error(Message) UE_LOG( LogGasaEditor, Error, TEXT("%s -- %hs %hs(%d)"), *Message, __builtin_File(), __func__, __builtin_LINE() );
|
||||
#define GasaEd_Warning(Message) UE_LOG( LogGasaEditor, Warning, TEXT("%s -- %hs %hs(%d)"), *Message, __builtin_File(), __func__, __builtin_LINE() );
|
||||
#define GasaEd_Display(Message) UE_LOG( LogGasaEditor, Display, TEXT("%s -- %hs %hs(%d)"), *Message, __builtin_File(), __func__, __builtin_LINE() );
|
||||
#define GasaEd_Log(Message) UE_LOG( LogGasaEditor, Log, TEXT("%s -- %hs %hs(%d)"), *Message, __builtin_File(), __func__, __builtin_LINE() );
|
||||
#define GasaEd_Verbose(Message) UE_LOG( LogGasaEditor, Verbose, TEXT("%s -- %hs %hs(%d)"), *Message, __builtin_File(), __func__, __builtin_LINE() );
|
||||
#define GasaEd_VeryVerbose(Message) UE_LOG( LogGasaEditor, VeryVerbose, TEXT("%s -- %hs %hs(%d)"), *Message, __builtin_File(), __func__, __builtin_LINE() );
|
||||
#pragma endregion Logging
|
||||
|
||||
#pragma region Timing
|
||||
#pragma endregion Timing
|
||||
@@ -1,14 +1,25 @@
|
||||
#include "GasaEditorModule.h"
|
||||
|
||||
#include "EditorDetails/GlobeProgressBarDetails.h"
|
||||
#include "UI/GlobeProgressBar.h"
|
||||
|
||||
IMPLEMENT_PRIMARY_GAME_MODULE(FGasaEditorModule, GasaEditor, GasaEditor);
|
||||
|
||||
void FGasaEditorModule::StartupModule()
|
||||
{
|
||||
FPropertyEditorModule& PropertyEditor = FModuleManager::LoadModuleChecked<FPropertyEditorModule>("PropertyEditor");
|
||||
|
||||
PropertyEditor.RegisterCustomClassLayout( UGlobeProgressBar::StaticClass()->GetFName()
|
||||
, FOnGetDetailCustomizationInstance::CreateStatic(& FGlobeProgressBarDetails::MakeInstance)
|
||||
);
|
||||
}
|
||||
|
||||
void FGasaEditorModule::ShutdownModule()
|
||||
{
|
||||
|
||||
if (FModuleManager::Get().IsModuleLoaded("PropertyEditor"))
|
||||
{
|
||||
FPropertyEditorModule& PropertyEditor = FModuleManager::GetModuleChecked<FPropertyEditorModule>("PropertyEditor");
|
||||
PropertyEditor.UnregisterCustomClassLayout(UGlobeProgressBar::StaticClass()->GetFName());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,109 +5,84 @@
|
||||
#define GEN_IMPLEMENTATION
|
||||
#include "gen.cpp"
|
||||
#include "gen.builder.cpp"
|
||||
#include "gen.scanner.hpp"
|
||||
// #include "gen.scanner.hpp"
|
||||
using namespace gen;
|
||||
|
||||
#ifdef GEN_SYSTEM_WINDOWS
|
||||
#include <process.h>
|
||||
#endif
|
||||
|
||||
#include "GasaGenCommon.cpp"
|
||||
#include "GasaGen_ue_parse_testing.cpp"
|
||||
#include "GasaGen_UGasaAttributeSet.cpp"
|
||||
#include "GasaGen_ChangeBPActionMenu.cpp"
|
||||
#include "GasaGen_DevOptionsCache.cpp"
|
||||
|
||||
int gen_main()
|
||||
{
|
||||
gen::init();
|
||||
log_fmt("Generating code for the Gasa module");
|
||||
log_fmt("Generating code for the Gasa module\n");
|
||||
|
||||
// Initialize Globals
|
||||
umeta_uclass = code_str( UCLASS() );
|
||||
umeta_generated_body = code_str( GENERATED_BODY() );
|
||||
gasa_api = code_str( GASA_API );
|
||||
{
|
||||
UHT_UCLASS = code_str( UCLASS() );
|
||||
UHT_UPROPERTY = code_str( UPROPERTY() );
|
||||
UHT_USTRUCT = code_str( USTRUCT() );
|
||||
UHT_GENERATED_BODY = code_str( GENERATED_BODY()\n );
|
||||
UModule_GASA_API = code_str( GASA_API );
|
||||
}
|
||||
|
||||
StrC str_GENERATED_BODY = txt("GENERATED_BODY(");
|
||||
StrC str_GENERATED_UCLASS_BODY = txt("GENERATED_UCLASS_BODY(");
|
||||
StrC str_PROPERTY_BINDING_IMPLEMENTATION = txt("PROPERTY_BINDING_IMPLEMENTATION(");
|
||||
StrC str_UCLASS = txt("UCLASS(");
|
||||
StrC str_UFUNCTION = txt("UFUNCTION(");
|
||||
StrC str_UPROPERTY = txt("UPROPERTY(");
|
||||
StrC str_DECLARE_LOG_CATEGORY_EXTERN = txt("DECLARE_LOG_CATEGORY_EXTERN(");
|
||||
StrC str_ENUM_CLASS_FLAGS = txt("ENUM_CLASS_FLAGS(");
|
||||
StrC str_DECLARE_CLASS = txt("DECLARE_CLASS(");
|
||||
StrC str_DEFINE_DEFAULT_OBJECT_INITIALIZER_CONSTRUCTOR_CALL = txt("DEFINE_DEFAULT_OBJECT_INITIALIZER_CONSTRUCTOR_CALL(");
|
||||
StrC str_TEXT = txt("TEXT(");
|
||||
StrC str_DECLARE_MULTICAST_DELEGATE_OneParam = txt("DECLARE_MULTICAST_DELEGATE_OneParam(");
|
||||
StrC str_DECLARE_MULTICAST_DELEGATE_TwoParams = txt("DECLARE_MULTICAST_DELEGATE_TwoParams(");
|
||||
StrC str_DECLARE_MULTICAST_DELEGATE_ThreeParams = txt("DECLARE_MULTICAST_DELEGATE_ThreeParams(");
|
||||
StrC str_DECLARE_DELEGATE_RetVal_OneParam = txt("DECLARE_DELEGATE_RetVal_OneParam(");
|
||||
StrC str_DECLARE_FUNCTION = txt("DECLARE_FUNCTION(");
|
||||
StrC str_RESULT_DECL = txt("RESULT_DECL");
|
||||
StrC str_FORCEINLINE = txt("FORCEINLINE");
|
||||
StrC str_UENUM = txt("UENUM(");
|
||||
StrC str_UMETA = txt("UMETA(");
|
||||
StrC str_DECLARE_DYNAMIC_MULTICAST_SPARSE_DELEGATE_FiveParams = txt("DECLARE_DYNAMIC_MULTICAST_SPARSE_DELEGATE_FiveParams(");
|
||||
StrC str_DECLARE_DYNAMIC_MULTICAST_SPARSE_DELEGATE_SevenParams = txt("DECLARE_DYNAMIC_MULTICAST_SPARSE_DELEGATE_SevenParams(");
|
||||
StrC str_DECLARE_DYNAMIC_MULTICAST_SPARSE_DELEGATE_NineParams = txt("DECLARE_DYNAMIC_MULTICAST_SPARSE_DELEGATE_NineParams(");
|
||||
StrC str_DECLARE_DYNAMIC_MULTICAST_SPARSE_DELEGATE_FourParams = txt("DECLARE_DYNAMIC_MULTICAST_SPARSE_DELEGATE_FourParams(");
|
||||
StrC str_DECLARE_DELEGATE_SixParams = txt("DECLARE_DELEGATE_SixParams(");
|
||||
StrC str_DECLARE_EVENT_TwoParams = txt("DECLARE_EVENT_TwoParams(");
|
||||
StrC str_DECLARE_DELEGATE_RetVal_ThreeParams = txt("DECLARE_DELEGATE_RetVal_ThreeParams(");
|
||||
StrC str_PRAGMA_DISABLE_DEPRECATION_WARNINGS = txt("PRAGMA_DISABLE_DEPRECATION_WARNINGS");
|
||||
StrC str_PRAGMA_ENABLE_DEPRECATION_WARNINGS = txt("PRAGMA_ENABLE_DEPRECATION_WARNINGS");
|
||||
StrC str_DEFINE_ACTORDESC_TYPE = txt("DEFINE_ACTORDESC_TYPE(");
|
||||
StrC str_DECLARE_DYNAMIC_MULTICAST_SPARSE_DELEGATE_TwoParams = txt("DECLARE_DYNAMIC_MULTICAST_SPARSE_DELEGATE_TwoParams(");
|
||||
StrC str_DECLARE_DYNAMIC_MULTICAST_SPARSE_DELEGATE_OneParam = txt("DECLARE_DYNAMIC_MULTICAST_SPARSE_DELEGATE_OneParam(");
|
||||
StrC str_UPARAM = txt("UPARAM(");
|
||||
StrC str_FORCEINLINE_DEBUGGABLE = txt("FORCEINLINE_DEBUGGABLE");
|
||||
StrC str_DECLARE_EVENT_ThreeParams = txt("DECLARE_EVENT_ThreeParams(");
|
||||
StrC str_USTRUCT = txt("USTRUCT(");
|
||||
StrC str_GENERATED_USTRUCT_BODY = txt("GENERATED_USTRUCT_BODY(");
|
||||
StrC str_SLATE_BEGIN_ARGS = txt("SLATE_BEGIN_ARGS(");
|
||||
StrC str_SLATE_END_ARGS = txt("SLATE_END_ARGS(");
|
||||
|
||||
PreprocessorDefines.append( get_cached_string(str_GENERATED_BODY));
|
||||
PreprocessorDefines.append( get_cached_string(str_GENERATED_UCLASS_BODY));
|
||||
PreprocessorDefines.append( get_cached_string(str_PROPERTY_BINDING_IMPLEMENTATION));
|
||||
PreprocessorDefines.append( get_cached_string(str_UCLASS));
|
||||
PreprocessorDefines.append( get_cached_string(str_UFUNCTION));
|
||||
PreprocessorDefines.append( get_cached_string(str_UPROPERTY));
|
||||
PreprocessorDefines.append( get_cached_string(str_DECLARE_LOG_CATEGORY_EXTERN));
|
||||
PreprocessorDefines.append( get_cached_string(str_ENUM_CLASS_FLAGS));
|
||||
PreprocessorDefines.append( get_cached_string(str_DECLARE_CLASS));
|
||||
PreprocessorDefines.append( get_cached_string(str_DEFINE_DEFAULT_OBJECT_INITIALIZER_CONSTRUCTOR_CALL));
|
||||
PreprocessorDefines.append( get_cached_string(str_TEXT));
|
||||
PreprocessorDefines.append( get_cached_string(str_DECLARE_MULTICAST_DELEGATE_OneParam));
|
||||
PreprocessorDefines.append( get_cached_string(str_DECLARE_MULTICAST_DELEGATE_TwoParams));
|
||||
PreprocessorDefines.append( get_cached_string(str_DECLARE_MULTICAST_DELEGATE_ThreeParams));
|
||||
PreprocessorDefines.append( get_cached_string(str_DECLARE_DELEGATE_RetVal_OneParam));
|
||||
PreprocessorDefines.append( get_cached_string(str_DECLARE_FUNCTION));
|
||||
PreprocessorDefines.append( get_cached_string(str_RESULT_DECL));
|
||||
PreprocessorDefines.append( get_cached_string(str_FORCEINLINE));
|
||||
PreprocessorDefines.append( get_cached_string(str_UENUM));
|
||||
PreprocessorDefines.append( get_cached_string(str_UMETA));
|
||||
PreprocessorDefines.append( get_cached_string(str_DECLARE_DYNAMIC_MULTICAST_SPARSE_DELEGATE_FiveParams));
|
||||
PreprocessorDefines.append( get_cached_string(str_DECLARE_DYNAMIC_MULTICAST_SPARSE_DELEGATE_SevenParams));
|
||||
PreprocessorDefines.append( get_cached_string(str_DECLARE_DYNAMIC_MULTICAST_SPARSE_DELEGATE_NineParams));
|
||||
PreprocessorDefines.append( get_cached_string(str_DECLARE_DYNAMIC_MULTICAST_SPARSE_DELEGATE_FourParams));
|
||||
PreprocessorDefines.append( get_cached_string(str_DECLARE_DELEGATE_SixParams));
|
||||
PreprocessorDefines.append( get_cached_string(str_DECLARE_EVENT_TwoParams));
|
||||
PreprocessorDefines.append( get_cached_string(str_DECLARE_DELEGATE_RetVal_ThreeParams));
|
||||
PreprocessorDefines.append( get_cached_string(str_PRAGMA_DISABLE_DEPRECATION_WARNINGS));
|
||||
PreprocessorDefines.append( get_cached_string(str_PRAGMA_ENABLE_DEPRECATION_WARNINGS));
|
||||
PreprocessorDefines.append( get_cached_string(str_DEFINE_ACTORDESC_TYPE));
|
||||
PreprocessorDefines.append( get_cached_string(str_DECLARE_DYNAMIC_MULTICAST_SPARSE_DELEGATE_TwoParams));
|
||||
PreprocessorDefines.append( get_cached_string(str_DECLARE_DYNAMIC_MULTICAST_SPARSE_DELEGATE_OneParam));
|
||||
PreprocessorDefines.append( get_cached_string(str_UPARAM));
|
||||
PreprocessorDefines.append( get_cached_string(str_FORCEINLINE_DEBUGGABLE));
|
||||
PreprocessorDefines.append( get_cached_string(str_DECLARE_EVENT_ThreeParams));
|
||||
PreprocessorDefines.append( get_cached_string(str_USTRUCT));
|
||||
PreprocessorDefines.append( get_cached_string(str_GENERATED_USTRUCT_BODY));
|
||||
PreprocessorDefines.append( get_cached_string(str_SLATE_BEGIN_ARGS));
|
||||
PreprocessorDefines.append( get_cached_string(str_SLATE_END_ARGS));
|
||||
|
||||
// ue_parse_testing();
|
||||
|
||||
StrC str_gasa_api = txt("GASA_API");
|
||||
// Populate Defines
|
||||
{
|
||||
PreprocessorDefines.append( get_cached_string(str_DECLARE_CLASS));
|
||||
PreprocessorDefines.append( get_cached_string(str_DECLARE_DELEGATE_RetVal_OneParam));
|
||||
PreprocessorDefines.append( get_cached_string(str_DECLARE_DELEGATE_RetVal_ThreeParams));
|
||||
PreprocessorDefines.append( get_cached_string(str_DECLARE_DELEGATE_SixParams));
|
||||
PreprocessorDefines.append( get_cached_string(str_DECLARE_DYNAMIC_MULTICAST_SPARSE_DELEGATE_FiveParams));
|
||||
PreprocessorDefines.append( get_cached_string(str_DECLARE_DYNAMIC_MULTICAST_SPARSE_DELEGATE_FourParams));
|
||||
PreprocessorDefines.append( get_cached_string(str_DECLARE_DYNAMIC_MULTICAST_SPARSE_DELEGATE_NineParams));
|
||||
PreprocessorDefines.append( get_cached_string(str_DECLARE_DYNAMIC_MULTICAST_SPARSE_DELEGATE_OneParam));
|
||||
PreprocessorDefines.append( get_cached_string(str_DECLARE_DYNAMIC_MULTICAST_SPARSE_DELEGATE_SevenParams));
|
||||
PreprocessorDefines.append( get_cached_string(str_DECLARE_DYNAMIC_MULTICAST_SPARSE_DELEGATE_TwoParams));
|
||||
PreprocessorDefines.append( get_cached_string(str_DECLARE_EVENT_ThreeParams));
|
||||
PreprocessorDefines.append( get_cached_string(str_DECLARE_EVENT_TwoParams));
|
||||
PreprocessorDefines.append( get_cached_string(str_DECLARE_FUNCTION));
|
||||
PreprocessorDefines.append( get_cached_string(str_DECLARE_LOG_CATEGORY_EXTERN));
|
||||
PreprocessorDefines.append( get_cached_string(str_DECLARE_MULTICAST_DELEGATE_OneParam));
|
||||
PreprocessorDefines.append( get_cached_string(str_DECLARE_MULTICAST_DELEGATE_ThreeParams));
|
||||
PreprocessorDefines.append( get_cached_string(str_DECLARE_MULTICAST_DELEGATE_TwoParams));
|
||||
PreprocessorDefines.append( get_cached_string(str_DEFINE_ACTORDESC_TYPE));
|
||||
PreprocessorDefines.append( get_cached_string(str_DEFINE_DEFAULT_OBJECT_INITIALIZER_CONSTRUCTOR_CALL));
|
||||
PreprocessorDefines.append( get_cached_string(str_ENUM_CLASS_FLAGS));
|
||||
PreprocessorDefines.append( get_cached_string(str_FORCEINLINE_DEBUGGABLE));
|
||||
PreprocessorDefines.append( get_cached_string(str_FORCEINLINE));
|
||||
PreprocessorDefines.append( get_cached_string(str_GENERATED_BODY));
|
||||
PreprocessorDefines.append( get_cached_string(str_GENERATED_UCLASS_BODY));
|
||||
PreprocessorDefines.append( get_cached_string(str_GENERATED_USTRUCT_BODY));
|
||||
PreprocessorDefines.append( get_cached_string(str_PRAGMA_DISABLE_DEPRECATION_WARNINGS));
|
||||
PreprocessorDefines.append( get_cached_string(str_PRAGMA_ENABLE_DEPRECATION_WARNINGS));
|
||||
PreprocessorDefines.append( get_cached_string(str_PROPERTY_BINDING_IMPLEMENTATION));
|
||||
PreprocessorDefines.append( get_cached_string(str_RESULT_DECL));
|
||||
PreprocessorDefines.append( get_cached_string(str_SLATE_BEGIN_ARGS));
|
||||
PreprocessorDefines.append( get_cached_string(str_SLATE_END_ARGS));
|
||||
PreprocessorDefines.append( get_cached_string(str_TEXT));
|
||||
PreprocessorDefines.append( get_cached_string(str_UCLASS));
|
||||
PreprocessorDefines.append( get_cached_string(str_UENUM));
|
||||
PreprocessorDefines.append( get_cached_string(str_UFUNCTION));
|
||||
PreprocessorDefines.append( get_cached_string(str_UMETA));
|
||||
PreprocessorDefines.append( get_cached_string(str_UPARAM));
|
||||
PreprocessorDefines.append( get_cached_string(str_UPROPERTY));
|
||||
PreprocessorDefines.append( get_cached_string(str_USTRUCT));
|
||||
}
|
||||
|
||||
gen_UGasaAttributeSet();
|
||||
swap_SBlueprintActionMenu_Construct();
|
||||
gen_FGasaDevOptionsCache();
|
||||
|
||||
// One offs
|
||||
if (0)
|
||||
{
|
||||
ue_parse_testing();
|
||||
swap_SBlueprintActionMenu_Construct();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1,13 +1,95 @@
|
||||
#pragma once
|
||||
// Used in the GasaGen.cpp translation unit
|
||||
#if GASA_INTELLISENSE_DIRECTIVES
|
||||
#pragma once
|
||||
#include "gen.hpp"
|
||||
#include "GasaGenCommon.cpp"
|
||||
using namespace gen;
|
||||
#endif
|
||||
|
||||
// Program assumes its working directory is the project
|
||||
#define path_config "./Source/Config/"
|
||||
#define path_module_gasa "./Source/Gasa/"
|
||||
#define path_root ""
|
||||
#define path_project path_root "Project/"
|
||||
#define path_source path_project "Source/"
|
||||
#define path_config path_source "Config/"
|
||||
#define path_module_gasa path_source "Gasa/"
|
||||
#define path_gasa_ability_system path_module_gasa "AbilitySystem/"
|
||||
|
||||
constexpr StrC str_DECLARE_CLASS = txt("DECLARE_CLASS(");
|
||||
constexpr StrC str_DECLARE_DELEGATE_RetVal_OneParam = txt("DECLARE_DELEGATE_RetVal_OneParam(");
|
||||
constexpr StrC str_DECLARE_DELEGATE_RetVal_ThreeParams = txt("DECLARE_DELEGATE_RetVal_ThreeParams(");
|
||||
constexpr StrC str_DECLARE_DELEGATE_SixParams = txt("DECLARE_DELEGATE_SixParams(");
|
||||
constexpr StrC str_DECLARE_DYNAMIC_MULTICAST_SPARSE_DELEGATE_FiveParams = txt("DECLARE_DYNAMIC_MULTICAST_SPARSE_DELEGATE_FiveParams(");
|
||||
constexpr StrC str_DECLARE_DYNAMIC_MULTICAST_SPARSE_DELEGATE_FourParams = txt("DECLARE_DYNAMIC_MULTICAST_SPARSE_DELEGATE_FourParams(");
|
||||
constexpr StrC str_DECLARE_DYNAMIC_MULTICAST_SPARSE_DELEGATE_NineParams = txt("DECLARE_DYNAMIC_MULTICAST_SPARSE_DELEGATE_NineParams(");
|
||||
constexpr StrC str_DECLARE_DYNAMIC_MULTICAST_SPARSE_DELEGATE_OneParam = txt("DECLARE_DYNAMIC_MULTICAST_SPARSE_DELEGATE_OneParam(");
|
||||
constexpr StrC str_DECLARE_DYNAMIC_MULTICAST_SPARSE_DELEGATE_SevenParams = txt("DECLARE_DYNAMIC_MULTICAST_SPARSE_DELEGATE_SevenParams(");
|
||||
constexpr StrC str_DECLARE_DYNAMIC_MULTICAST_SPARSE_DELEGATE_TwoParams = txt("DECLARE_DYNAMIC_MULTICAST_SPARSE_DELEGATE_TwoParams(");
|
||||
constexpr StrC str_DECLARE_EVENT_ThreeParams = txt("DECLARE_EVENT_ThreeParams(");
|
||||
constexpr StrC str_DECLARE_EVENT_TwoParams = txt("DECLARE_EVENT_TwoParams(");
|
||||
constexpr StrC str_DECLARE_FUNCTION = txt("DECLARE_FUNCTION(");
|
||||
constexpr StrC str_DECLARE_LOG_CATEGORY_EXTERN = txt("DECLARE_LOG_CATEGORY_EXTERN(");
|
||||
constexpr StrC str_DECLARE_MULTICAST_DELEGATE_OneParam = txt("DECLARE_MULTICAST_DELEGATE_OneParam(");
|
||||
constexpr StrC str_DECLARE_MULTICAST_DELEGATE_ThreeParams = txt("DECLARE_MULTICAST_DELEGATE_ThreeParams(");
|
||||
constexpr StrC str_DECLARE_MULTICAST_DELEGATE_TwoParams = txt("DECLARE_MULTICAST_DELEGATE_TwoParams(");
|
||||
constexpr StrC str_DEFINE_ACTORDESC_TYPE = txt("DEFINE_ACTORDESC_TYPE(");
|
||||
constexpr StrC str_DEFINE_DEFAULT_OBJECT_INITIALIZER_CONSTRUCTOR_CALL = txt("DEFINE_DEFAULT_OBJECT_INITIALIZER_CONSTRUCTOR_CALL(");
|
||||
constexpr StrC str_ENUM_CLASS_FLAGS = txt("ENUM_CLASS_FLAGS(");
|
||||
constexpr StrC str_FORCEINLINE = txt("FORCEINLINE");
|
||||
constexpr StrC str_FORCEINLINE_DEBUGGABLE = txt("FORCEINLINE_DEBUGGABLE");
|
||||
constexpr StrC str_GENERATED_BODY = txt("GENERATED_BODY(");
|
||||
constexpr StrC str_GENERATED_UCLASS_BODY = txt("GENERATED_UCLASS_BODY(");
|
||||
constexpr StrC str_GENERATED_USTRUCT_BODY = txt("GENERATED_USTRUCT_BODY(");
|
||||
constexpr StrC str_PRAGMA_DISABLE_DEPRECATION_WARNINGS = txt("PRAGMA_DISABLE_DEPRECATION_WARNINGS");
|
||||
constexpr StrC str_PRAGMA_ENABLE_DEPRECATION_WARNINGS = txt("PRAGMA_ENABLE_DEPRECATION_WARNINGS");
|
||||
constexpr StrC str_PROPERTY_BINDING_IMPLEMENTATION = txt("PROPERTY_BINDING_IMPLEMENTATION(");
|
||||
constexpr StrC str_RESULT_DECL = txt("RESULT_DECL");
|
||||
constexpr StrC str_SLATE_BEGIN_ARGS = txt("SLATE_BEGIN_ARGS(");
|
||||
constexpr StrC str_SLATE_END_ARGS = txt("SLATE_END_ARGS(");
|
||||
constexpr StrC str_TEXT = txt("TEXT(");
|
||||
constexpr StrC str_UCLASS = txt("UCLASS(");
|
||||
constexpr StrC str_UENUM = txt("UENUM(");
|
||||
constexpr StrC str_UFUNCTION = txt("UFUNCTION(");
|
||||
constexpr StrC str_UMETA = txt("UMETA(");
|
||||
constexpr StrC str_UPARAM = txt("UPARAM(");
|
||||
constexpr StrC str_UPROPERTY = txt("UPROPERTY(");
|
||||
constexpr StrC str_USTRUCT = txt("USTRUCT(");
|
||||
|
||||
constexpr StrC str_GASA_API = txt("GASA_API");
|
||||
|
||||
#pragma region Globals
|
||||
// These Code objects are created before anything else after gencpp does its initializatioon
|
||||
global Code umeta_uclass;
|
||||
global Code umeta_generated_body;
|
||||
global Code gasa_api;
|
||||
global Code UHT_GENERATED_BODY;
|
||||
global Code UHT_UCLASS;
|
||||
global Code UHT_UPROPERTY;
|
||||
global Code UHT_USTRUCT;
|
||||
global Code UModule_GASA_API;
|
||||
#pragma endregion Globals
|
||||
|
||||
inline
|
||||
CodeBody parse_file( char const* path ) {
|
||||
FileContents content = file_read_contents( GlobalAllocator, true, path );
|
||||
CodeBody code = parse_global_body( StrC { content.size, (char const*)content.data });
|
||||
return code;
|
||||
}
|
||||
|
||||
inline
|
||||
void format_file( char const* path )
|
||||
{
|
||||
// Need to execute clang format on the generated file to get it to match the original.
|
||||
#define clang_format "clang-format "
|
||||
#define cf_format_inplace "-i "
|
||||
#define cf_style "-style=file:" "./scripts/.clang-format "
|
||||
#define cf_verbose "-verbose "
|
||||
String command = String::make( GlobalAllocator, clang_format );
|
||||
command.append( cf_format_inplace );
|
||||
command.append( cf_style );
|
||||
command.append( cf_verbose );
|
||||
command.append( path );
|
||||
log_fmt("\tRunning clang-format on file:\n");
|
||||
system( command );
|
||||
log_fmt("\tclang-format finished reformatting.\n");
|
||||
#undef cf_cmd
|
||||
#undef cf_format_inplace
|
||||
#undef cf_style
|
||||
#undef cf_verbse
|
||||
}
|
||||
|
||||
@@ -1,3 +1,12 @@
|
||||
// Used in the GasaGen.cpp translation unit
|
||||
#if GASA_INTELLISENSE_DIRECTIVES
|
||||
#pragma once
|
||||
#define GEN_EXPOSE_BACKEND
|
||||
#include "gen.hpp"
|
||||
#include "gen.builder.hpp"
|
||||
#include "GasaGenCommon.cpp"
|
||||
#endif
|
||||
|
||||
constexpr StrC SBlueprintActionMenu_Construct_Replacement = txt(R"(
|
||||
void SBlueprintActionMenu::Construct( const FArguments& InArgs, TSharedPtr<FBlueprintEditor> InEditor )
|
||||
{
|
||||
@@ -255,19 +264,22 @@ void swap_SBlueprintActionMenu_Construct()
|
||||
using namespace ECode;
|
||||
case Function:
|
||||
CodeFn function_def = code.cast<CodeFn>();
|
||||
log_fmt("%S\n", function_def->Name);
|
||||
|
||||
if ( String::are_equal(function_def->Name, signature_to_change->Name)
|
||||
&& function_def->Params.is_equal(signature_to_change->Params))
|
||||
{
|
||||
code = parse_function( SBlueprintActionMenu_Construct_Replacement );
|
||||
log_fmt("Swapped: %S", function_def->Name);
|
||||
}
|
||||
break;
|
||||
}
|
||||
changed_SBlueprintActionMenu.append(code);
|
||||
}
|
||||
log_fmt("\n");
|
||||
|
||||
Builder SBlueprintActionMenu_Changed = Builder::open(path_SBlueprintActionMenuCpp);
|
||||
SBlueprintActionMenu_Changed.print( def_comment(txt("This file was regenerated by GasaGen.cpp")));
|
||||
SBlueprintActionMenu_Changed.print(changed_SBlueprintActionMenu);
|
||||
SBlueprintActionMenu_Changed.write();
|
||||
}
|
||||
format_file(path_SBlueprintActionMenuCpp);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,135 @@
|
||||
// Used in the GasaGen.cpp translation unit
|
||||
#if GASA_INTELLISENSE_DIRECTIVES
|
||||
#pragma once
|
||||
#define GEN_EXPOSE_BACKEND
|
||||
#include "gen.hpp"
|
||||
#include "gen.builder.hpp"
|
||||
#include "GasaGenCommon.cpp"
|
||||
using namespace gen;
|
||||
#endif
|
||||
|
||||
void gen_FGasaDevOptionsCache()
|
||||
{
|
||||
Array<CodeVar> GasaDevOptions_UPROPERTIES = Array<CodeVar>::init(GlobalAllocator);
|
||||
{
|
||||
CodeBody header_GasaDevOptions = parse_file( path_module_gasa "GasaDevOptions.h" );
|
||||
CodeClass UGasaDevOptions = NoCode;
|
||||
for (Code entry : header_GasaDevOptions)
|
||||
{
|
||||
if ( entry->Type == ECode::Class && entry->Name.starts_with( txt("UGasaDevOptions")) )
|
||||
{
|
||||
UGasaDevOptions = entry.cast<CodeClass>();
|
||||
break;
|
||||
}
|
||||
}
|
||||
for (Code member = UGasaDevOptions->Body.begin(); member != UGasaDevOptions->Body.end(); ++ member)
|
||||
{
|
||||
if ( member->Type == ECode::Untyped && member->Name.starts_with(str_UPROPERTY) )
|
||||
++ member;
|
||||
if ( member->Type == ECode::Variable
|
||||
&& ( member->ValueType->Name.starts_with( txt("TSoftClassPtr"))
|
||||
|| member->ValueType->Name.starts_with( txt("TSoftObjectPtr")) )
|
||||
)
|
||||
GasaDevOptions_UPROPERTIES.append(member.cast<CodeVar>());
|
||||
}
|
||||
}
|
||||
|
||||
CodeComment generation_notice = def_comment(txt("This was generated by GasaGen/GasaGen.cpp"));
|
||||
|
||||
Builder header = Builder::open( path_module_gasa "GasaDevOptionsCache.h" );
|
||||
{
|
||||
header.print( generation_notice );
|
||||
header.print( pragma_once );
|
||||
header.print( fmt_newline );
|
||||
header.print( def_include(txt("GasaDevOptionsCache.generated.h")));
|
||||
header.print( fmt_newline );
|
||||
|
||||
header.print( UHT_USTRUCT );
|
||||
CodeStruct FGasaDevOptionsCache;
|
||||
{
|
||||
CodeBody body = def_body(ECode::Struct_Body);
|
||||
{
|
||||
CodeType t_UClassPtr = parse_type(code(UClass*));
|
||||
CodeType t_UObjectPtr = parse_type(code(UObject*));
|
||||
|
||||
body.append(UHT_GENERATED_BODY);
|
||||
body.append(fmt_newline);
|
||||
for (CodeVar var : GasaDevOptions_UPROPERTIES)
|
||||
{
|
||||
if ( var->ValueType->Name.starts_with( txt("TSoftClassPtr") )) {
|
||||
body.append(UHT_UPROPERTY);
|
||||
body.append( def_variable(t_UClassPtr, var->Name));
|
||||
}
|
||||
if ( var->ValueType->Name.starts_with( txt("TSoftObjectPtr") )) {
|
||||
body.append(UHT_UPROPERTY);
|
||||
body.append( def_variable(t_UObjectPtr, var->Name));
|
||||
}
|
||||
}
|
||||
body.append(fmt_newline);
|
||||
body.append( parse_function(code( void CachedDevOptions(); )));
|
||||
}
|
||||
FGasaDevOptionsCache = parse_struct( token_fmt( "body", (StrC)body.to_string(), stringize(
|
||||
struct GASA_API FGasaDevOptionsCache {
|
||||
<body>
|
||||
};
|
||||
)));
|
||||
}
|
||||
header.print(FGasaDevOptionsCache);
|
||||
header.print( fmt_newline );
|
||||
header.write();
|
||||
format_file( path_module_gasa "GasaDevOptionsCache.h" );
|
||||
}
|
||||
|
||||
Builder source = Builder::open( path_module_gasa "GasaDevOptionsCache.cpp" );
|
||||
{
|
||||
Array<CodeInclude> GasaDevOptions_Includes = Array<CodeInclude>::init(GlobalAllocator);
|
||||
{
|
||||
CodeBody source_GasaDevOptions = parse_file( path_module_gasa "GasaDevOptions.cpp");
|
||||
for ( Code entry : source_GasaDevOptions )
|
||||
{
|
||||
if ( entry->Type == ECode::Preprocess_Include )
|
||||
GasaDevOptions_Includes.append( entry.cast<CodeInclude>() );
|
||||
}
|
||||
}
|
||||
|
||||
source.print( generation_notice );
|
||||
source.print( def_include(txt("GasaDevOptionsCache.h")));
|
||||
source.print(fmt_newline);
|
||||
for ( CodeInclude include : GasaDevOptions_Includes ) {
|
||||
source.print( include );
|
||||
}
|
||||
source.print( parse_using(code( using namespace Gasa; )));
|
||||
source.print(fmt_newline);
|
||||
|
||||
CodeBody cached_property_assignments = def_body(ECode::Function_Body);
|
||||
{
|
||||
cached_property_assignments.append(fmt_newline);
|
||||
cached_property_assignments.append(fmt_newline);
|
||||
for (CodeVar var : GasaDevOptions_UPROPERTIES)
|
||||
{
|
||||
Code assignment = code_fmt( "property", (StrC)var->Name, stringize(
|
||||
<property> = DevOpts-> <property>.LoadSynchronous();
|
||||
));
|
||||
cached_property_assignments.append(assignment);
|
||||
}
|
||||
cached_property_assignments.append(fmt_newline);
|
||||
cached_property_assignments.append(fmt_newline);
|
||||
}
|
||||
|
||||
CodeFn CachedDevOptions = parse_function( token_fmt(
|
||||
"cached_property_assignments", (StrC)cached_property_assignments.to_string(),
|
||||
stringize(
|
||||
void FGasaDevOptionsCache::CachedDevOptions()
|
||||
{
|
||||
UGasaDevOptions* DevOpts = GetMutDevOptions();
|
||||
|
||||
<cached_property_assignments>
|
||||
|
||||
Tag_GlobalPPV = DevOpts->Tag_GlobalPPV;
|
||||
})
|
||||
));
|
||||
source.print(CachedDevOptions);
|
||||
source.write();
|
||||
format_file( path_module_gasa "GasaDevOptionsCache.cpp" );
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,11 @@
|
||||
// Used in the GasaGen.cpp translation unit
|
||||
#if GASA_INTELLISENSE_DIRECTIVES
|
||||
#pragma once
|
||||
#define GEN_EXPOSE_BACKEND
|
||||
#include "gen.hpp"
|
||||
#include "gen.builder.hpp"
|
||||
#include "GasaGenCommon.cpp"
|
||||
#endif
|
||||
|
||||
void def_attribute_properties ( CodeBody body, Array<StringCached> properties );
|
||||
void def_attribute_field_on_reps ( CodeBody body, Array<StringCached> properties );
|
||||
@@ -30,20 +37,20 @@ void gen_UGasaAttributeSet()
|
||||
CodeInclude Include_AbilitySystemComponent = def_include(txt("AbilitySystemComponent.h"));
|
||||
CodeInclude Include_GasaAttributeSet_Generated = def_include(txt("GasaAttributeSet.generated.h"));
|
||||
|
||||
CodeAttributes api_attribute= def_attributes( gasa_api->Name);
|
||||
CodeAttributes api_attribute= def_attributes( UModule_GASA_API->Name);
|
||||
|
||||
CodeClass GasaAttributeSet = {};
|
||||
{
|
||||
CodeBody body = def_body( CodeT::Class_Body );
|
||||
{
|
||||
body.append( umeta_generated_body);
|
||||
body.append( fmt_newline);
|
||||
body.append( UHT_GENERATED_BODY);
|
||||
body.append( access_public );
|
||||
|
||||
def_attribute_properties( body, attribute_fields);
|
||||
|
||||
body.append(fmt_newline);
|
||||
body.append( def_constructor() );
|
||||
body.append(fmt_newline);
|
||||
|
||||
def_attribute_field_on_reps( body, attribute_fields);
|
||||
|
||||
@@ -90,11 +97,12 @@ void gen_UGasaAttributeSet()
|
||||
header.print( Include_AbilitySystemComponent);
|
||||
header.print( Include_GasaAttributeSet_Generated);
|
||||
header.print( fmt_newline);
|
||||
header.print(umeta_uclass);
|
||||
header.print( UHT_UCLASS );
|
||||
header.print(GasaAttributeSet);
|
||||
header.print(ns_gasa);
|
||||
}
|
||||
header.write();
|
||||
format_file(path_gasa_ability_system "GasaAttributeSet.h");
|
||||
}
|
||||
|
||||
Builder source = Builder::open( path_gasa_ability_system "GasaAttributeSet.cpp" );
|
||||
@@ -119,15 +127,15 @@ void gen_UGasaAttributeSet()
|
||||
InitMaxMana( 50.f );
|
||||
}
|
||||
));
|
||||
|
||||
body.append(constructor_for_UGasaAttributeSet );
|
||||
body.append(fmt_newline);
|
||||
|
||||
impl_attribute_fields( body, class_name, attribute_fields);
|
||||
|
||||
CodeFn GetLifetimeOfReplicatedProps;
|
||||
{
|
||||
CodeBody field_lifetimes = def_body( CodeT::Function_Body);
|
||||
field_lifetimes.append(fmt_newline);
|
||||
field_lifetimes.append(fmt_newline);
|
||||
for (StringCached field : attribute_fields)
|
||||
{
|
||||
field_lifetimes.append( code_fmt( "field", (StrC)field, stringize(
|
||||
@@ -148,6 +156,7 @@ void gen_UGasaAttributeSet()
|
||||
source.print(body);
|
||||
}
|
||||
source.write();
|
||||
format_file(path_gasa_ability_system "GasaAttributeSet.cpp");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -200,12 +209,12 @@ void def_attribute_field_property_getters( CodeBody body, StrC class_name, Array
|
||||
}
|
||||
}
|
||||
|
||||
#pragma push_macro("FORCEINLINE")
|
||||
#undef FORCEINLINE
|
||||
void def_attribute_field_value_getters( CodeBody body, Array<StringCached> properties )
|
||||
{
|
||||
for ( String property : properties )
|
||||
{
|
||||
#pragma push_macro(FORCEINLINE)
|
||||
#undef FORCEINLINE
|
||||
body.append( code_fmt( "property", (StrC)property,
|
||||
stringize(
|
||||
FORCEINLINE float Get<property>() const
|
||||
@@ -213,7 +222,6 @@ void def_attribute_field_value_getters( CodeBody body, Array<StringCached> prope
|
||||
return <property>.GetCurrentValue();
|
||||
}
|
||||
)));
|
||||
#pragma pop_macro(FORCEINLINE)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -267,3 +275,4 @@ void impl_attribute_fields( CodeBody body, StrC class_name, Array<StringCached>
|
||||
body.append( field_impl );
|
||||
}
|
||||
}
|
||||
#pragma pop_macro("FORCEINLINE")
|
||||
|
||||
@@ -1,3 +1,12 @@
|
||||
// Used in the GasaGen.cpp translation unit
|
||||
#if GASA_INTELLISENSE_DIRECTIVES
|
||||
#pragma once
|
||||
#define GEN_EXPOSE_BACKEND
|
||||
#include "gen.hpp"
|
||||
#include "gen.builder.hpp"
|
||||
#include "GasaGenCommon.cpp"
|
||||
#endif
|
||||
|
||||
void ue_parse_testing()
|
||||
{
|
||||
FileContents content;
|
||||
@@ -5,7 +14,7 @@ void ue_parse_testing()
|
||||
#define path_UProgressBar \
|
||||
"C:/projects/Unreal/Surgo/UE/Engine/Source/Runtime/UMG/Public/Components/ProgressBar.h"
|
||||
|
||||
#if 0
|
||||
#if 1
|
||||
content = file_read_contents( GlobalAllocator, true, path_UProgressBar );
|
||||
CodeBody parsed_uprogressbar = parse_global_body( StrC { content.size, (char const*)content.data });
|
||||
|
||||
@@ -40,7 +49,7 @@ void ue_parse_testing()
|
||||
#define path_UObject \
|
||||
R"(C:\projects\Unreal\Surgo\UE\Engine\Source\Runtime\CoreUObject\Public\UObject\Object.h)"
|
||||
|
||||
#if 0
|
||||
#if 1
|
||||
content = file_read_contents( GlobalAllocator, true, path_UObject );
|
||||
CodeBody parsed_uobject = parse_global_body( StrC { content.size, (char const*)content.data });
|
||||
|
||||
@@ -78,7 +87,7 @@ void ue_parse_testing()
|
||||
#define path_AActor \
|
||||
R"(C:\projects\Unreal\Surgo\UE\Engine\Source\Runtime\Engine\Classes\GameFramework\Actor.h)"
|
||||
|
||||
#if 0
|
||||
#if 1
|
||||
content = file_read_contents( GlobalAllocator, true, path_AActor );
|
||||
CodeBody parsed_aactor = parse_global_body( StrC { content.size, (char const*)content.data });
|
||||
|
||||
@@ -112,7 +121,7 @@ void ue_parse_testing()
|
||||
#define path_ActorComponent \
|
||||
R"(C:\projects\Unreal\Surgo\UE\Engine\Source\Runtime\Engine\Classes\Components\ActorComponent.h)"
|
||||
|
||||
#if 0
|
||||
#if 1
|
||||
content = file_read_contents( GlobalAllocator, true, path_ActorComponent );
|
||||
CodeBody parsed_actor_component = parse_global_body( StrC { content.size, (char const*)content.data });
|
||||
|
||||
@@ -146,7 +155,7 @@ void ue_parse_testing()
|
||||
#define path_SceneComponent \
|
||||
R"(C:\projects\Unreal\Surgo\UE\Engine\Source\Runtime\Engine\Classes\Components\SceneComponent.h)"
|
||||
|
||||
#if 0
|
||||
#if 1
|
||||
content = file_read_contents( GlobalAllocator, true, path_SceneComponent );
|
||||
CodeBody parsed_scene_component = parse_global_body( StrC { content.size, (char const*)content.data });
|
||||
|
||||
@@ -180,7 +189,7 @@ void ue_parse_testing()
|
||||
#define path_AttributeSet \
|
||||
R"(C:\projects\Unreal\Surgo\UE\Engine\Plugins\Runtime\GameplayAbilities\Source\GameplayAbilities\Public\AttributeSet.h)"
|
||||
|
||||
#if 0
|
||||
#if 1
|
||||
content = file_read_contents( GlobalAllocator, true, path_AttributeSet );
|
||||
CodeBody parsed_attribute_set = parse_global_body( StrC { content.size, (char const*)content.data });
|
||||
|
||||
|
||||
@@ -14,7 +14,6 @@ Builder Builder::open( char const* path )
|
||||
log_failure( "gen::File::open - Could not open file: %s", path );
|
||||
return result;
|
||||
}
|
||||
|
||||
result.Buffer = String::make_reserve( GlobalAllocator, Builder_StrBufferReserve );
|
||||
|
||||
// log_fmt("$Builder - Opened file: %s\n", result.File.filename );
|
||||
@@ -37,7 +36,7 @@ void Builder::print( Code code )
|
||||
void Builder::print_fmt( char const* fmt, ... )
|
||||
{
|
||||
sw res;
|
||||
char buf[ GEN_PRINTF_MAXLEN ] = { 0 };
|
||||
char buf[GEN_PRINTF_MAXLEN] = { 0 };
|
||||
|
||||
va_list va;
|
||||
va_start( va, fmt );
|
||||
|
||||
+693
-690
File diff suppressed because it is too large
Load Diff
@@ -192,7 +192,7 @@ s64 str_to_i64( const char* str, char** end_ptr, s32 base )
|
||||
|
||||
len = _scan_zpl_i64( str, base, &value );
|
||||
if ( end_ptr )
|
||||
*end_ptr = ( char* )str + len;
|
||||
*end_ptr = (char*)str + len;
|
||||
return value;
|
||||
}
|
||||
|
||||
@@ -213,7 +213,7 @@ void i64_to_str( s64 value, char* string, s32 base )
|
||||
{
|
||||
while ( v > 0 )
|
||||
{
|
||||
*buf++ = _num_to_char_table[ v % base ];
|
||||
*buf++ = _num_to_char_table[v % base];
|
||||
v /= base;
|
||||
}
|
||||
}
|
||||
@@ -235,7 +235,7 @@ void u64_to_str( u64 value, char* string, s32 base )
|
||||
{
|
||||
while ( value > 0 )
|
||||
{
|
||||
*buf++ = _num_to_char_table[ value % base ];
|
||||
*buf++ = _num_to_char_table[value % base];
|
||||
value /= base;
|
||||
}
|
||||
}
|
||||
@@ -442,8 +442,8 @@ internal sw _print_string( char* text, sw max_len, _format_info* info, char cons
|
||||
|
||||
internal sw _print_char( char* text, sw max_len, _format_info* info, char arg )
|
||||
{
|
||||
char str[ 2 ] = "";
|
||||
str[ 0 ] = arg;
|
||||
char str[2] = "";
|
||||
str[0] = arg;
|
||||
return _print_string( text, max_len, info, str );
|
||||
}
|
||||
|
||||
@@ -460,14 +460,14 @@ internal sw _print_repeated_char( char* text, sw max_len, _format_info* info, ch
|
||||
|
||||
internal sw _print_i64( char* text, sw max_len, _format_info* info, s64 value )
|
||||
{
|
||||
char num[ 130 ];
|
||||
char num[130];
|
||||
i64_to_str( value, num, info ? info->base : 10 );
|
||||
return _print_string( text, max_len, info, num );
|
||||
}
|
||||
|
||||
internal sw _print_u64( char* text, sw max_len, _format_info* info, u64 value )
|
||||
{
|
||||
char num[ 130 ];
|
||||
char num[130];
|
||||
u64_to_str( value, num, info ? info->base : 10 );
|
||||
return _print_string( text, max_len, info, num );
|
||||
}
|
||||
@@ -564,7 +564,7 @@ internal sw _print_f64( char* text, sw max_len, _format_info* info, b32 is_hexad
|
||||
while ( len-- )
|
||||
{
|
||||
if ( text_begin + len < end )
|
||||
text_begin[ len ] = fill;
|
||||
text_begin[len] = fill;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -857,7 +857,7 @@ neverinline sw str_fmt_va( char* text, sw max_len, char const* fmt, va_list va )
|
||||
|
||||
char* str_fmt_buf_va( char const* fmt, va_list va )
|
||||
{
|
||||
local_persist thread_local char buffer[ GEN_PRINTF_MAXLEN ];
|
||||
local_persist thread_local char buffer[GEN_PRINTF_MAXLEN];
|
||||
str_fmt_va( buffer, size_of( buffer ), fmt, va );
|
||||
return buffer;
|
||||
}
|
||||
@@ -874,7 +874,7 @@ char* str_fmt_buf( char const* fmt, ... )
|
||||
|
||||
sw str_fmt_file_va( struct FileInfo* f, char const* fmt, va_list va )
|
||||
{
|
||||
local_persist thread_local char buf[ GEN_PRINTF_MAXLEN ];
|
||||
local_persist thread_local char buf[GEN_PRINTF_MAXLEN];
|
||||
sw len = str_fmt_va( buf, size_of( buf ), fmt, va );
|
||||
b32 res = file_write( f, buf, len - 1 ); // NOTE: prevent extra whitespace
|
||||
return res ? len : -1;
|
||||
@@ -924,7 +924,7 @@ sw str_fmt_out_err( char const* fmt, ... )
|
||||
|
||||
#pragma region Hashing
|
||||
|
||||
global u32 const _crc32_table[ 256 ] = {
|
||||
global u32 const _crc32_table[256] = {
|
||||
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b,
|
||||
0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 0x646ba8c0,
|
||||
0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd,
|
||||
@@ -953,11 +953,11 @@ u32 crc32( void const* data, sw len )
|
||||
u32 result = ~( zpl_cast( u32 ) 0 );
|
||||
u8 const* c = zpl_cast( u8 const* ) data;
|
||||
for ( remaining = len; remaining--; c++ )
|
||||
result = ( result >> 8 ) ^ ( _crc32_table[ ( result ^ *c ) & 0xff ] );
|
||||
result = ( result >> 8 ) ^ ( _crc32_table[( result ^ *c ) & 0xff] );
|
||||
return ~result;
|
||||
}
|
||||
|
||||
global u64 const _crc64_table[ 256 ] = {
|
||||
global u64 const _crc64_table[256] = {
|
||||
0x0000000000000000ull, 0x7ad870c830358979ull, 0xf5b0e190606b12f2ull, 0x8f689158505e9b8bull, 0xc038e5739841b68full, 0xbae095bba8743ff6ull,
|
||||
0x358804e3f82aa47dull, 0x4f50742bc81f2d04ull, 0xab28ecb46814fe75ull, 0xd1f09c7c5821770cull, 0x5e980d24087fec87ull, 0x24407dec384a65feull,
|
||||
0x6b1009c7f05548faull, 0x11c8790fc060c183ull, 0x9ea0e857903e5a08ull, 0xe478989fa00bd371ull, 0x7d08ff3b88be6f81ull, 0x07d08ff3b88be6f8ull,
|
||||
@@ -1009,7 +1009,7 @@ u64 crc64( void const* data, sw len )
|
||||
u64 result = ( zpl_cast( u64 ) 0 );
|
||||
u8 const* c = zpl_cast( u8 const* ) data;
|
||||
for ( remaining = len; remaining--; c++ )
|
||||
result = ( result >> 8 ) ^ ( _crc64_table[ ( result ^ *c ) & 0xff ] );
|
||||
result = ( result >> 8 ) ^ ( _crc64_table[( result ^ *c ) & 0xff] );
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -1363,7 +1363,7 @@ void* Arena::allocator_proc( void* allocator_data, AllocType type, sw size, sw a
|
||||
sw total_size = align_forward_i64( size, alignment );
|
||||
|
||||
// NOTE: Out of memory
|
||||
if ( arena->TotalUsed + total_size > ( sw )arena->TotalSize )
|
||||
if ( arena->TotalUsed + total_size > (sw)arena->TotalSize )
|
||||
{
|
||||
// zpl__printf_err("%s", "Arena out of memory\n");
|
||||
GEN_FATAL( "Arena out of memory! (Possibly could not fit for the largest size Arena!!)" );
|
||||
@@ -1495,13 +1495,13 @@ Pool Pool::init_align( AllocatorInfo backing, sw num_blocks, sw block_size, sw b
|
||||
curr = data;
|
||||
for ( block_index = 0; block_index < num_blocks - 1; block_index++ )
|
||||
{
|
||||
uptr* next = ( uptr* )curr;
|
||||
*next = ( uptr )curr + actual_block_size;
|
||||
uptr* next = (uptr*)curr;
|
||||
*next = (uptr)curr + actual_block_size;
|
||||
curr = pointer_add( curr, actual_block_size );
|
||||
}
|
||||
|
||||
end = ( uptr* )curr;
|
||||
*end = ( uptr )NULL;
|
||||
end = (uptr*)curr;
|
||||
*end = (uptr)NULL;
|
||||
|
||||
pool.PhysicalStart = data;
|
||||
pool.FreeList = data;
|
||||
@@ -1520,13 +1520,13 @@ void Pool::clear()
|
||||
curr = PhysicalStart;
|
||||
for ( block_index = 0; block_index < NumBlocks - 1; block_index++ )
|
||||
{
|
||||
uptr* next = ( uptr* )curr;
|
||||
*next = ( uptr )curr + actual_block_size;
|
||||
uptr* next = (uptr*)curr;
|
||||
*next = (uptr)curr + actual_block_size;
|
||||
curr = pointer_add( curr, actual_block_size );
|
||||
}
|
||||
|
||||
end = ( uptr* )curr;
|
||||
*end = ( uptr )NULL;
|
||||
end = (uptr*)curr;
|
||||
*end = (uptr)NULL;
|
||||
|
||||
FreeList = PhysicalStart;
|
||||
}
|
||||
@@ -1565,7 +1565,7 @@ String String::make_length( AllocatorInfo allocator, char const* str, sw length
|
||||
else
|
||||
mem_set( result, 0, alloc_size - header_size );
|
||||
|
||||
result[ length ] = '\0';
|
||||
result[length] = '\0';
|
||||
|
||||
return result;
|
||||
}
|
||||
@@ -1593,7 +1593,7 @@ String String::make_reserve( AllocatorInfo allocator, sw capacity )
|
||||
|
||||
String String::fmt_buf( AllocatorInfo allocator, char const* fmt, ... )
|
||||
{
|
||||
local_persist thread_local char buf[ GEN_PRINTF_MAXLEN ] = { 0 };
|
||||
local_persist thread_local char buf[GEN_PRINTF_MAXLEN] = { 0 };
|
||||
|
||||
va_list va;
|
||||
va_start( va, fmt );
|
||||
@@ -1606,7 +1606,7 @@ String String::fmt_buf( AllocatorInfo allocator, char const* fmt, ... )
|
||||
bool String::append_fmt( char const* fmt, ... )
|
||||
{
|
||||
sw res;
|
||||
char buf[ GEN_PRINTF_MAXLEN ] = { 0 };
|
||||
char buf[GEN_PRINTF_MAXLEN] = { 0 };
|
||||
|
||||
va_list va;
|
||||
va_start( va, fmt );
|
||||
@@ -1694,7 +1694,7 @@ internal wchar_t* _alloc_utf8_to_ucs2( AllocatorInfo a, char const* text, sw* w_
|
||||
*w_len_ = 0;
|
||||
return NULL;
|
||||
}
|
||||
w_text[ w_len ] = 0;
|
||||
w_text[w_len] = 0;
|
||||
if ( w_len_ )
|
||||
*w_len_ = w_len;
|
||||
return w_text;
|
||||
@@ -1928,8 +1928,8 @@ neverinline GEN_FILE_OPEN_PROC( _posix_file_open )
|
||||
internal void _dirinfo_free_entry( DirEntry* entry );
|
||||
|
||||
// TODO : Is this a bad idea?
|
||||
global b32 _std_file_set = false;
|
||||
global FileInfo _std_files[ EFileStandard_COUNT ] = {
|
||||
global b32 _std_file_set = false;
|
||||
global FileInfo _std_files[EFileStandard_COUNT] = {
|
||||
{ { nullptr, nullptr, nullptr, nullptr }, { nullptr }, 0, nullptr, 0, nullptr }
|
||||
};
|
||||
|
||||
@@ -1940,15 +1940,15 @@ FileInfo* file_get_standard( FileStandardType std )
|
||||
if ( ! _std_file_set )
|
||||
{
|
||||
#define GEN__SET_STD_FILE( type, v ) \
|
||||
_std_files[ type ].fd.p = v; \
|
||||
_std_files[ type ].ops = default_file_operations
|
||||
_std_files[type].fd.p = v; \
|
||||
_std_files[type].ops = default_file_operations
|
||||
GEN__SET_STD_FILE( EFileStandard_INPUT, GetStdHandle( STD_INPUT_HANDLE ) );
|
||||
GEN__SET_STD_FILE( EFileStandard_OUTPUT, GetStdHandle( STD_OUTPUT_HANDLE ) );
|
||||
GEN__SET_STD_FILE( EFileStandard_ERROR, GetStdHandle( STD_ERROR_HANDLE ) );
|
||||
#undef GEN__SET_STD_FILE
|
||||
_std_file_set = true;
|
||||
}
|
||||
return &_std_files[ std ];
|
||||
return &_std_files[std];
|
||||
}
|
||||
|
||||
#else // POSIX
|
||||
@@ -1958,15 +1958,15 @@ FileInfo* file_get_standard( FileStandardType std )
|
||||
if ( ! _std_file_set )
|
||||
{
|
||||
#define GEN__SET_STD_FILE( type, v ) \
|
||||
_std_files[ type ].fd.i = v; \
|
||||
_std_files[ type ].ops = default_file_operations
|
||||
_std_files[type].fd.i = v; \
|
||||
_std_files[type].ops = default_file_operations
|
||||
GEN__SET_STD_FILE( EFileStandard_INPUT, 0 );
|
||||
GEN__SET_STD_FILE( EFileStandard_OUTPUT, 1 );
|
||||
GEN__SET_STD_FILE( EFileStandard_ERROR, 2 );
|
||||
#undef GEN__SET_STD_FILE
|
||||
_std_file_set = true;
|
||||
}
|
||||
return &_std_files[ std ];
|
||||
return &_std_files[std];
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -2082,8 +2082,8 @@ FileContents file_read_contents( AllocatorInfo a, b32 zero_terminate, char const
|
||||
file_read_at( &file, result.data, result.size, 0 );
|
||||
if ( zero_terminate )
|
||||
{
|
||||
u8* str = zpl_cast( u8* ) result.data;
|
||||
str[ fsize ] = '\0';
|
||||
u8* str = zpl_cast( u8* ) result.data;
|
||||
str[fsize] = '\0';
|
||||
}
|
||||
}
|
||||
file_close( &file );
|
||||
@@ -2111,13 +2111,13 @@ GEN_DEF_INLINE _memory_fd* _file_stream_from_fd( FileDescriptor fd );
|
||||
GEN_IMPL_INLINE FileDescriptor _file_stream_fd_make( _memory_fd* d )
|
||||
{
|
||||
FileDescriptor fd = { 0 };
|
||||
fd.p = ( void* )d;
|
||||
fd.p = (void*)d;
|
||||
return fd;
|
||||
}
|
||||
|
||||
GEN_IMPL_INLINE _memory_fd* _file_stream_from_fd( FileDescriptor fd )
|
||||
{
|
||||
_memory_fd* d = ( _memory_fd* )fd.p;
|
||||
_memory_fd* d = (_memory_fd*)fd.p;
|
||||
GEN_ASSERT( d->magic == GEN__FILE_STREAM_FD_MAGIC );
|
||||
return d;
|
||||
}
|
||||
@@ -2126,7 +2126,7 @@ b8 file_stream_new( FileInfo* file, AllocatorInfo allocator )
|
||||
{
|
||||
GEN_ASSERT_NOT_NULL( file );
|
||||
|
||||
_memory_fd* d = ( _memory_fd* )alloc( allocator, size_of( _memory_fd ) );
|
||||
_memory_fd* d = (_memory_fd*)alloc( allocator, size_of( _memory_fd ) );
|
||||
|
||||
if ( ! d )
|
||||
return false;
|
||||
@@ -2136,7 +2136,7 @@ b8 file_stream_new( FileInfo* file, AllocatorInfo allocator )
|
||||
d->allocator = allocator;
|
||||
d->flags = EFileStream_CLONE_WRITABLE;
|
||||
d->cap = 0;
|
||||
d->buf = Array< u8 >::init( allocator );
|
||||
d->buf = Array<u8>::init( allocator );
|
||||
|
||||
if ( ! d->buf )
|
||||
return false;
|
||||
@@ -2153,7 +2153,7 @@ b8 file_stream_new( FileInfo* file, AllocatorInfo allocator )
|
||||
b8 file_stream_open( FileInfo* file, AllocatorInfo allocator, u8* buffer, sw size, FileStreamFlags flags )
|
||||
{
|
||||
GEN_ASSERT_NOT_NULL( file );
|
||||
_memory_fd* d = ( _memory_fd* )alloc( allocator, size_of( _memory_fd ) );
|
||||
_memory_fd* d = (_memory_fd*)alloc( allocator, size_of( _memory_fd ) );
|
||||
if ( ! d )
|
||||
return false;
|
||||
zero_item( file );
|
||||
@@ -2162,8 +2162,8 @@ b8 file_stream_open( FileInfo* file, AllocatorInfo allocator, u8* buffer, sw siz
|
||||
d->flags = flags;
|
||||
if ( d->flags & EFileStream_CLONE_WRITABLE )
|
||||
{
|
||||
Array< u8 > arr = Array< u8 >::init_reserve( allocator, size );
|
||||
d->buf = arr;
|
||||
Array<u8> arr = Array<u8>::init_reserve( allocator, size );
|
||||
d->buf = arr;
|
||||
|
||||
if ( ! d->buf )
|
||||
return false;
|
||||
@@ -2236,11 +2236,11 @@ internal GEN_FILE_WRITE_AT_PROC( _memory_file_write )
|
||||
|
||||
if ( d->flags & EFileStream_CLONE_WRITABLE )
|
||||
{
|
||||
Array< u8 > arr = { d->buf };
|
||||
Array<u8> arr = { d->buf };
|
||||
|
||||
if ( arr.get_header()->Capacity < new_cap )
|
||||
{
|
||||
if ( ! arr.grow( ( s64 )( new_cap ) ) )
|
||||
if ( ! arr.grow( (s64)( new_cap ) ) )
|
||||
return false;
|
||||
d->buf = arr;
|
||||
}
|
||||
@@ -2250,7 +2250,7 @@ internal GEN_FILE_WRITE_AT_PROC( _memory_file_write )
|
||||
|
||||
if ( ( d->flags & EFileStream_CLONE_WRITABLE ) && extralen > 0 )
|
||||
{
|
||||
Array< u8 > arr = { d->buf };
|
||||
Array<u8> arr = { d->buf };
|
||||
|
||||
mem_copy( d->buf + offset + rwlen, pointer_add_const( buffer, rwlen ), extralen );
|
||||
d->cap = new_cap;
|
||||
@@ -2273,7 +2273,7 @@ internal GEN_FILE_CLOSE_PROC( _memory_file_close )
|
||||
|
||||
if ( d->flags & EFileStream_CLONE_WRITABLE )
|
||||
{
|
||||
Array< u8 > arr = { d->buf };
|
||||
Array<u8> arr = { d->buf };
|
||||
arr.free();
|
||||
}
|
||||
|
||||
@@ -2329,7 +2329,7 @@ u64 read_cpu_time_stamp_counter( void )
|
||||
#elif defined( GEN_SYSTEM_EMSCRIPTEN )
|
||||
u64 read_cpu_time_stamp_counter( void )
|
||||
{
|
||||
return ( u64 )( emscripten_get_now() * 1e+6 );
|
||||
return (u64)( emscripten_get_now() * 1e+6 );
|
||||
}
|
||||
#elif defined( GEN_CPU_ARM ) && ! defined( GEN_COMPILER_TINYC )
|
||||
u64 read_cpu_time_stamp_counter( void )
|
||||
@@ -2352,7 +2352,7 @@ u64 read_cpu_time_stamp_counter( void )
|
||||
{ // Is it counting?
|
||||
asm volatile( "mrc p15, 0, %0, c9, c13, 0" : "=r"( pmccntr ) );
|
||||
// The counter is set up to count every 64th cycle
|
||||
return ( ( int64_t )pmccntr ) * 64; // Should optimize to << 6
|
||||
return ( (int64_t)pmccntr ) * 64; // Should optimize to << 6
|
||||
}
|
||||
}
|
||||
#else
|
||||
@@ -2441,7 +2441,7 @@ u64 time_rel_ms( void )
|
||||
|
||||
f64 time_rel( void )
|
||||
{
|
||||
return ( f64 )( time_rel_ms() * 1e-3 );
|
||||
return (f64)( time_rel_ms() * 1e-3 );
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
+143
-109
@@ -170,10 +170,10 @@ GEN_NS_BEGIN
|
||||
|
||||
// Casting
|
||||
|
||||
#define ccast( Type, Value ) ( *const_cast< Type* >( &( Value ) ) )
|
||||
#define pcast( Type, Value ) ( *reinterpret_cast< Type* >( &( Value ) ) )
|
||||
#define rcast( Type, Value ) reinterpret_cast< Type >( Value )
|
||||
#define scast( Type, Value ) static_cast< Type >( Value )
|
||||
#define ccast( Type, Value ) ( *const_cast<Type*>( &( Value ) ) )
|
||||
#define pcast( Type, Value ) ( *reinterpret_cast<Type*>( &( Value ) ) )
|
||||
#define rcast( Type, Value ) reinterpret_cast<Type>( Value )
|
||||
#define scast( Type, Value ) static_cast<Type>( Value )
|
||||
|
||||
// Num Arguments (Varadics)
|
||||
// #if defined(__GNUC__) || defined(__clang__)
|
||||
@@ -461,19 +461,19 @@ GEN_NS_BEGIN
|
||||
#define labeled_scope_end }
|
||||
|
||||
#define clamp( x, lower, upper ) min( max( ( x ), ( lower ) ), ( upper ) )
|
||||
#define count_of( x ) ( ( size_of( x ) / size_of( 0 [ x ] ) ) / ( ( sw )( ! ( size_of( x ) % size_of( 0 [ x ] ) ) ) ) )
|
||||
#define count_of( x ) ( ( size_of( x ) / size_of( 0 [x] ) ) / ( (sw)( ! ( size_of( x ) % size_of( 0 [x] ) ) ) ) )
|
||||
#define is_between( x, lower, upper ) ( ( ( lower ) <= ( x ) ) && ( ( x ) <= ( upper ) ) )
|
||||
#define max( a, b ) ( ( a ) > ( b ) ? ( a ) : ( b ) )
|
||||
#define min( a, b ) ( ( a ) < ( b ) ? ( a ) : ( b ) )
|
||||
#define size_of( x ) ( sw )( sizeof( x ) )
|
||||
|
||||
#if defined( _MSC_VER ) || defined( GEN_COMPILER_TINYC )
|
||||
#define offset_of( Type, element ) ( ( GEN_NS( gen_sw ) ) & ( ( ( Type* )0 )->element ) )
|
||||
#define offset_of( Type, element ) ( ( GEN_NS( gen_sw ) ) & ( ( (Type*)0 )->element ) )
|
||||
#else
|
||||
#define offset_of( Type, element ) __builtin_offsetof( Type, element )
|
||||
#endif
|
||||
|
||||
template< class Type >
|
||||
template<class Type>
|
||||
void swap( Type& a, Type& b )
|
||||
{
|
||||
Type tmp = a;
|
||||
@@ -640,13 +640,13 @@ s32 assert_crash( char const* condition );
|
||||
void process_exit( u32 code );
|
||||
|
||||
#if Build_Debug
|
||||
#define GEN_FATAL( ... ) \
|
||||
do \
|
||||
{ \
|
||||
local_persist thread_local char buf[ GEN_PRINTF_MAXLEN ] = { 0 }; \
|
||||
\
|
||||
str_fmt( buf, GEN_PRINTF_MAXLEN, __VA_ARGS__ ); \
|
||||
GEN_PANIC( buf ); \
|
||||
#define GEN_FATAL( ... ) \
|
||||
do \
|
||||
{ \
|
||||
local_persist thread_local char buf[GEN_PRINTF_MAXLEN] = { 0 }; \
|
||||
\
|
||||
str_fmt( buf, GEN_PRINTF_MAXLEN, __VA_ARGS__ ); \
|
||||
GEN_PANIC( buf ); \
|
||||
} while ( 0 )
|
||||
#else
|
||||
|
||||
@@ -662,10 +662,10 @@ void process_exit( u32 code );
|
||||
|
||||
#pragma region Memory
|
||||
|
||||
#define kilobytes( x ) ( ( x ) * ( s64 )( 1024 ) )
|
||||
#define megabytes( x ) ( kilobytes( x ) * ( s64 )( 1024 ) )
|
||||
#define gigabytes( x ) ( megabytes( x ) * ( s64 )( 1024 ) )
|
||||
#define terabytes( x ) ( gigabytes( x ) * ( s64 )( 1024 ) )
|
||||
#define kilobytes( x ) ( ( x ) * (s64)( 1024 ) )
|
||||
#define megabytes( x ) ( kilobytes( x ) * (s64)( 1024 ) )
|
||||
#define gigabytes( x ) ( megabytes( x ) * (s64)( 1024 ) )
|
||||
#define terabytes( x ) ( gigabytes( x ) * (s64)( 1024 ) )
|
||||
|
||||
#define GEN__ONES ( zpl_cast( uw ) - 1 / GEN_U8_MAX )
|
||||
#define GEN__HIGHS ( GEN__ONES * ( GEN_U8_MAX / 2 + 1 ) )
|
||||
@@ -759,10 +759,10 @@ GEN_DEF_INLINE void* resize( AllocatorInfo a, void* ptr, sw old_size, sw new_siz
|
||||
GEN_DEF_INLINE void* resize_align( AllocatorInfo a, void* ptr, sw old_size, sw new_size, sw alignment );
|
||||
|
||||
//! Allocate memory for an item.
|
||||
#define alloc_item( allocator_, Type ) ( Type* )alloc( allocator_, size_of( Type ) )
|
||||
#define alloc_item( allocator_, Type ) (Type*)alloc( allocator_, size_of( Type ) )
|
||||
|
||||
//! Allocate memory for an array of items.
|
||||
#define alloc_array( allocator_, Type, count ) ( Type* )alloc( allocator_, size_of( Type ) * ( count ) )
|
||||
#define alloc_array( allocator_, Type, count ) (Type*)alloc( allocator_, size_of( Type ) * ( count ) )
|
||||
|
||||
/* heap memory analysis tools */
|
||||
/* define GEN_HEAP_ANALYSIS to enable this feature */
|
||||
@@ -873,7 +873,7 @@ GEN_IMPL_INLINE void* mem_move( void* dest, void const* source, sw n )
|
||||
{
|
||||
if ( ! n-- )
|
||||
return dest;
|
||||
d[ n ] = s[ n ];
|
||||
d[n] = s[n];
|
||||
}
|
||||
while ( n >= size_of( sw ) )
|
||||
{
|
||||
@@ -882,7 +882,7 @@ GEN_IMPL_INLINE void* mem_move( void* dest, void const* source, sw n )
|
||||
}
|
||||
}
|
||||
while ( n )
|
||||
n--, d[ n ] = s[ n ];
|
||||
n--, d[n] = s[n];
|
||||
}
|
||||
|
||||
return dest;
|
||||
@@ -897,18 +897,18 @@ GEN_IMPL_INLINE void* mem_set( void* dest, u8 c, sw n )
|
||||
|
||||
u8* s = zpl_cast( u8* ) dest;
|
||||
sw k;
|
||||
u32 c32 = ( ( u32 )-1 ) / 255 * c;
|
||||
u32 c32 = ( (u32)-1 ) / 255 * c;
|
||||
|
||||
if ( n == 0 )
|
||||
return dest;
|
||||
s[ 0 ] = s[ n - 1 ] = c;
|
||||
s[0] = s[n - 1] = c;
|
||||
if ( n < 3 )
|
||||
return dest;
|
||||
s[ 1 ] = s[ n - 2 ] = c;
|
||||
s[ 2 ] = s[ n - 3 ] = c;
|
||||
s[1] = s[n - 2] = c;
|
||||
s[2] = s[n - 3] = c;
|
||||
if ( n < 7 )
|
||||
return dest;
|
||||
s[ 3 ] = s[ n - 4 ] = c;
|
||||
s[3] = s[n - 4] = c;
|
||||
if ( n < 9 )
|
||||
return dest;
|
||||
|
||||
@@ -1081,7 +1081,7 @@ struct Arena
|
||||
GEN_ASSERT( is_power_of_two( alignment ) );
|
||||
|
||||
alignment_offset = 0;
|
||||
result_pointer = ( sw )PhysicalStart + TotalUsed;
|
||||
result_pointer = (sw)PhysicalStart + TotalUsed;
|
||||
mask = alignment - 1;
|
||||
|
||||
if ( result_pointer & mask )
|
||||
@@ -1124,7 +1124,7 @@ struct Arena
|
||||
|
||||
// Just a wrapper around using an arena with memory associated with its scope instead of from an allocator.
|
||||
// Used for static segment or stack allocations.
|
||||
template< s32 Size >
|
||||
template<s32 Size>
|
||||
struct FixedArena
|
||||
{
|
||||
static FixedArena init()
|
||||
@@ -1144,21 +1144,21 @@ struct FixedArena
|
||||
}
|
||||
|
||||
Arena arena;
|
||||
char memory[ Size ];
|
||||
char memory[Size];
|
||||
};
|
||||
|
||||
using Arena_1KB = FixedArena< kilobytes( 1 ) >;
|
||||
using Arena_4KB = FixedArena< kilobytes( 4 ) >;
|
||||
using Arena_8KB = FixedArena< kilobytes( 8 ) >;
|
||||
using Arena_16KB = FixedArena< kilobytes( 16 ) >;
|
||||
using Arena_32KB = FixedArena< kilobytes( 32 ) >;
|
||||
using Arena_64KB = FixedArena< kilobytes( 64 ) >;
|
||||
using Arena_128KB = FixedArena< kilobytes( 128 ) >;
|
||||
using Arena_256KB = FixedArena< kilobytes( 256 ) >;
|
||||
using Arena_512KB = FixedArena< kilobytes( 512 ) >;
|
||||
using Arena_1MB = FixedArena< megabytes( 1 ) >;
|
||||
using Arena_2MB = FixedArena< megabytes( 2 ) >;
|
||||
using Arena_4MB = FixedArena< megabytes( 4 ) >;
|
||||
using Arena_1KB = FixedArena<kilobytes( 1 )>;
|
||||
using Arena_4KB = FixedArena<kilobytes( 4 )>;
|
||||
using Arena_8KB = FixedArena<kilobytes( 8 )>;
|
||||
using Arena_16KB = FixedArena<kilobytes( 16 )>;
|
||||
using Arena_32KB = FixedArena<kilobytes( 32 )>;
|
||||
using Arena_64KB = FixedArena<kilobytes( 64 )>;
|
||||
using Arena_128KB = FixedArena<kilobytes( 128 )>;
|
||||
using Arena_256KB = FixedArena<kilobytes( 256 )>;
|
||||
using Arena_512KB = FixedArena<kilobytes( 512 )>;
|
||||
using Arena_1MB = FixedArena<megabytes( 1 )>;
|
||||
using Arena_2MB = FixedArena<megabytes( 2 )>;
|
||||
using Arena_4MB = FixedArena<megabytes( 4 )>;
|
||||
|
||||
struct Pool
|
||||
{
|
||||
@@ -1313,7 +1313,7 @@ GEN_IMPL_INLINE s32 str_compare( const char* s1, const char* s2 )
|
||||
{
|
||||
s1++, s2++;
|
||||
}
|
||||
return *( u8* )s1 - *( u8* )s2;
|
||||
return *(u8*)s1 - *(u8*)s2;
|
||||
}
|
||||
|
||||
GEN_IMPL_INLINE s32 str_compare( const char* s1, const char* s2, sw len )
|
||||
@@ -1417,11 +1417,11 @@ GEN_IMPL_INLINE char const* str_skip( char const* str, char c )
|
||||
|
||||
GEN_IMPL_INLINE char const* str_skip_any( char const* str, char const* char_list )
|
||||
{
|
||||
char const* closest_ptr = zpl_cast( char const* ) pointer_add( ( void* )str, str_len( str ) );
|
||||
char const* closest_ptr = zpl_cast( char const* ) pointer_add( (void*)str, str_len( str ) );
|
||||
sw char_list_count = str_len( char_list );
|
||||
for ( sw i = 0; i < char_list_count; i++ )
|
||||
{
|
||||
char const* p = str_skip( str, char_list[ i ] );
|
||||
char const* p = str_skip( str, char_list[i] );
|
||||
closest_ptr = min( closest_ptr, p );
|
||||
}
|
||||
return closest_ptr;
|
||||
@@ -1497,34 +1497,34 @@ inline sw log_fmt( char const* fmt, ... )
|
||||
|
||||
#pragma region Containers
|
||||
|
||||
template< class TType >
|
||||
template<class TType>
|
||||
struct RemoveConst
|
||||
{
|
||||
typedef TType Type;
|
||||
};
|
||||
|
||||
template< class TType >
|
||||
struct RemoveConst< const TType >
|
||||
template<class TType>
|
||||
struct RemoveConst<const TType>
|
||||
{
|
||||
typedef TType Type;
|
||||
};
|
||||
|
||||
template< class TType >
|
||||
struct RemoveConst< const TType[] >
|
||||
template<class TType>
|
||||
struct RemoveConst<const TType[]>
|
||||
{
|
||||
typedef TType Type[];
|
||||
};
|
||||
|
||||
template< class TType, uw Size >
|
||||
struct RemoveConst< const TType[ Size ] >
|
||||
template<class TType, uw Size>
|
||||
struct RemoveConst<const TType[Size]>
|
||||
{
|
||||
typedef TType Type[ Size ];
|
||||
typedef TType Type[Size];
|
||||
};
|
||||
|
||||
template< class TType >
|
||||
using TRemoveConst = typename RemoveConst< TType >::Type;
|
||||
template<class TType>
|
||||
using TRemoveConst = typename RemoveConst<TType>::Type;
|
||||
|
||||
template< class Type >
|
||||
template<class Type>
|
||||
struct Array
|
||||
{
|
||||
struct Header
|
||||
@@ -1570,7 +1570,7 @@ struct Array
|
||||
header = get_header();
|
||||
}
|
||||
|
||||
Data[ header->Num ] = value;
|
||||
Data[header->Num] = value;
|
||||
header->Num++;
|
||||
|
||||
return true;
|
||||
@@ -1617,7 +1617,6 @@ struct Array
|
||||
mem_move( target + 1, target, ( header->Num - idx ) * sizeof( Type ) );
|
||||
header->Num++;
|
||||
|
||||
Data[ idx ] = item;
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -1651,7 +1650,7 @@ struct Array
|
||||
Type& back( void )
|
||||
{
|
||||
Header& header = *get_header();
|
||||
return Data[ header.Num - 1 ];
|
||||
return Data[header.Num - 1];
|
||||
}
|
||||
|
||||
void clear( void )
|
||||
@@ -1669,7 +1668,7 @@ struct Array
|
||||
|
||||
for ( sw idx = begin; idx < end; idx++ )
|
||||
{
|
||||
Data[ idx ] = value;
|
||||
Data[idx] = value;
|
||||
}
|
||||
|
||||
return true;
|
||||
@@ -1684,8 +1683,8 @@ struct Array
|
||||
|
||||
Header* get_header( void )
|
||||
{
|
||||
using NonConstType = TRemoveConst< Type >;
|
||||
return rcast( Header*, const_cast< NonConstType* >( Data ) ) - 1;
|
||||
using NonConstType = TRemoveConst<Type>;
|
||||
return rcast( Header*, const_cast<NonConstType*>( Data ) ) - 1;
|
||||
}
|
||||
|
||||
bool grow( uw min_capacity )
|
||||
@@ -1804,7 +1803,7 @@ struct Array
|
||||
|
||||
// TODO(Ed) : This thing needs ALOT of work.
|
||||
|
||||
template< typename Type >
|
||||
template<typename Type>
|
||||
struct HashTable
|
||||
{
|
||||
struct FindResult
|
||||
@@ -1823,22 +1822,22 @@ struct HashTable
|
||||
|
||||
static HashTable init( AllocatorInfo allocator )
|
||||
{
|
||||
HashTable< Type > result = { { nullptr }, { nullptr } };
|
||||
HashTable<Type> result = { { nullptr }, { nullptr } };
|
||||
|
||||
result.Hashes = Array< sw >::init( allocator );
|
||||
result.Entries = Array< Entry >::init( allocator );
|
||||
result.Hashes = Array<sw>::init( allocator );
|
||||
result.Entries = Array<Entry>::init( allocator );
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static HashTable init_reserve( AllocatorInfo allocator, uw num )
|
||||
{
|
||||
HashTable< Type > result = { { nullptr }, { nullptr } };
|
||||
HashTable<Type> result = { { nullptr }, { nullptr } };
|
||||
|
||||
result.Hashes = Array< sw >::init_reserve( allocator, num );
|
||||
result.Hashes = Array<sw>::init_reserve( allocator, num );
|
||||
result.Hashes.get_header()->Num = num;
|
||||
|
||||
result.Entries = Array< Entry >::init_reserve( allocator, num );
|
||||
result.Entries = Array<Entry>::init_reserve( allocator, num );
|
||||
|
||||
return result;
|
||||
}
|
||||
@@ -1846,7 +1845,7 @@ struct HashTable
|
||||
void clear( void )
|
||||
{
|
||||
for ( sw idx = 0; idx < Hashes.num(); idx++ )
|
||||
Hashes[ idx ] = -1;
|
||||
Hashes[idx] = -1;
|
||||
|
||||
Hashes.clear();
|
||||
Entries.clear();
|
||||
@@ -1865,7 +1864,7 @@ struct HashTable
|
||||
{
|
||||
sw idx = find( key ).EntryIndex;
|
||||
if ( idx >= 0 )
|
||||
return &Entries[ idx ].Value;
|
||||
return &Entries[idx].Value;
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
@@ -1878,7 +1877,7 @@ struct HashTable
|
||||
|
||||
for ( sw idx = 0; idx < Entries.num(); idx++ )
|
||||
{
|
||||
map_proc( Entries[ idx ].Key, Entries[ idx ].Value );
|
||||
map_proc( Entries[idx].Key, Entries[idx].Value );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1890,13 +1889,13 @@ struct HashTable
|
||||
|
||||
for ( sw idx = 0; idx < Entries.num(); idx++ )
|
||||
{
|
||||
map_proc( Entries[ idx ].Key, &Entries[ idx ].Value );
|
||||
map_proc( Entries[idx].Key, &Entries[idx].Value );
|
||||
}
|
||||
}
|
||||
|
||||
void grow()
|
||||
{
|
||||
sw new_num = Array< Entry >::grow_formula( Entries.num() );
|
||||
sw new_num = Array<Entry>::grow_formula( Entries.num() );
|
||||
rehash( new_num );
|
||||
}
|
||||
|
||||
@@ -1905,34 +1904,34 @@ struct HashTable
|
||||
sw idx;
|
||||
sw last_added_index;
|
||||
|
||||
HashTable< Type > new_ht = init_reserve( Hashes.get_header()->Allocator, new_num );
|
||||
HashTable<Type> new_ht = init_reserve( Hashes.get_header()->Allocator, new_num );
|
||||
|
||||
Array< sw >::Header* hash_header = new_ht.Hashes.get_header();
|
||||
Array<sw>::Header* hash_header = new_ht.Hashes.get_header();
|
||||
|
||||
for ( idx = 0; idx < new_ht.Hashes.num(); ++idx )
|
||||
new_ht.Hashes[ idx ] = -1;
|
||||
new_ht.Hashes[idx] = -1;
|
||||
|
||||
for ( idx = 0; idx < Entries.num(); ++idx )
|
||||
{
|
||||
Entry& entry = Entries[ idx ];
|
||||
Entry& entry = Entries[idx];
|
||||
|
||||
FindResult find_result;
|
||||
|
||||
if ( new_ht.Hashes.num() == 0 )
|
||||
new_ht.grow();
|
||||
|
||||
entry = Entries[ idx ];
|
||||
entry = Entries[idx];
|
||||
find_result = new_ht.find( entry.Key );
|
||||
last_added_index = new_ht.add_entry( entry.Key );
|
||||
|
||||
if ( find_result.PrevIndex < 0 )
|
||||
new_ht.Hashes[ find_result.HashIndex ] = last_added_index;
|
||||
new_ht.Hashes[find_result.HashIndex] = last_added_index;
|
||||
|
||||
else
|
||||
new_ht.Entries[ find_result.PrevIndex ].Next = last_added_index;
|
||||
new_ht.Entries[find_result.PrevIndex].Next = last_added_index;
|
||||
|
||||
new_ht.Entries[ last_added_index ].Next = find_result.EntryIndex;
|
||||
new_ht.Entries[ last_added_index ].Value = entry.Value;
|
||||
new_ht.Entries[last_added_index].Next = find_result.EntryIndex;
|
||||
new_ht.Entries[last_added_index].Value = entry.Value;
|
||||
}
|
||||
|
||||
destroy();
|
||||
@@ -1944,23 +1943,23 @@ struct HashTable
|
||||
sw idx;
|
||||
|
||||
for ( idx = 0; idx < Entries.num(); idx++ )
|
||||
Entries[ idx ].Next = -1;
|
||||
Entries[idx].Next = -1;
|
||||
|
||||
for ( idx = 0; idx < Hashes.num(); idx++ )
|
||||
Hashes[ idx ] = -1;
|
||||
Hashes[idx] = -1;
|
||||
|
||||
for ( idx = 0; idx < Entries.num(); idx++ )
|
||||
{
|
||||
Entry* entry;
|
||||
FindResult find_result;
|
||||
|
||||
entry = &Entries[ idx ];
|
||||
entry = &Entries[idx];
|
||||
find_result = find( entry->Key );
|
||||
|
||||
if ( find_result.PrevIndex < 0 )
|
||||
Hashes[ find_result.HashIndex ] = idx;
|
||||
Hashes[find_result.HashIndex] = idx;
|
||||
else
|
||||
Entries[ find_result.PrevIndex ].Next = idx;
|
||||
Entries[find_result.PrevIndex].Next = idx;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2000,15 +1999,15 @@ struct HashTable
|
||||
|
||||
if ( find_result.PrevIndex >= 0 )
|
||||
{
|
||||
Entries[ find_result.PrevIndex ].Next = idx;
|
||||
Entries[find_result.PrevIndex].Next = idx;
|
||||
}
|
||||
else
|
||||
{
|
||||
Hashes[ find_result.HashIndex ] = idx;
|
||||
Hashes[find_result.HashIndex] = idx;
|
||||
}
|
||||
}
|
||||
|
||||
Entries[ idx ].Value = value;
|
||||
Entries[idx].Value = value;
|
||||
|
||||
if ( full() )
|
||||
grow();
|
||||
@@ -2017,14 +2016,14 @@ struct HashTable
|
||||
sw slot( u64 key )
|
||||
{
|
||||
for ( sw idx = 0; idx < Hashes.num(); ++idx )
|
||||
if ( Hashes[ idx ] == key )
|
||||
if ( Hashes[idx] == key )
|
||||
return idx;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
Array< sw > Hashes;
|
||||
Array< Entry > Entries;
|
||||
Array<sw> Hashes;
|
||||
Array<Entry> Entries;
|
||||
|
||||
protected:
|
||||
sw add_entry( u64 key )
|
||||
@@ -2044,15 +2043,15 @@ protected:
|
||||
if ( Hashes.num() > 0 )
|
||||
{
|
||||
result.HashIndex = key % Hashes.num();
|
||||
result.EntryIndex = Hashes[ result.HashIndex ];
|
||||
result.EntryIndex = Hashes[result.HashIndex];
|
||||
|
||||
while ( result.EntryIndex >= 0 )
|
||||
{
|
||||
if ( Entries[ result.EntryIndex ].Key == key )
|
||||
if ( Entries[result.EntryIndex].Key == key )
|
||||
break;
|
||||
|
||||
result.PrevIndex = result.EntryIndex;
|
||||
result.EntryIndex = Entries[ result.EntryIndex ].Next;
|
||||
result.EntryIndex = Entries[result.EntryIndex].Next;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2082,6 +2081,11 @@ struct StrC
|
||||
sw Len;
|
||||
char const* Ptr;
|
||||
|
||||
char const& operator[]( sw index ) const
|
||||
{
|
||||
return Ptr[index];
|
||||
}
|
||||
|
||||
operator char const*() const
|
||||
{
|
||||
return Ptr;
|
||||
@@ -2144,7 +2148,7 @@ struct String
|
||||
|
||||
for ( sw idx = 0; idx < num_parts; ++idx )
|
||||
{
|
||||
result.append( parts[ idx ] );
|
||||
result.append( parts[idx] );
|
||||
|
||||
if ( idx < num_parts - 1 )
|
||||
result.append( glue );
|
||||
@@ -2159,7 +2163,19 @@ struct String
|
||||
return false;
|
||||
|
||||
for ( sw idx = 0; idx < lhs.length(); ++idx )
|
||||
if ( lhs[ idx ] != rhs[ idx ] )
|
||||
if ( lhs[idx] != rhs[idx] )
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool are_equal( String lhs, StrC rhs )
|
||||
{
|
||||
if ( lhs.length() != (rhs.Len - 1) )
|
||||
return false;
|
||||
|
||||
for ( sw idx = 0; idx < lhs.length(); ++idx )
|
||||
if ( lhs[idx] != rhs[idx] )
|
||||
return false;
|
||||
|
||||
return true;
|
||||
@@ -2190,9 +2206,9 @@ struct String
|
||||
|
||||
mem_copy( Data + curr_len, str, length );
|
||||
|
||||
Data[ curr_len + length ] = '\0';
|
||||
Data[curr_len + length] = '\0';
|
||||
|
||||
header.Length = curr_len + length;
|
||||
header.Length = curr_len + length;
|
||||
}
|
||||
return str;
|
||||
}
|
||||
@@ -2218,7 +2234,7 @@ struct String
|
||||
|
||||
char& back()
|
||||
{
|
||||
return Data[ length() - 1 ];
|
||||
return Data[length() - 1];
|
||||
}
|
||||
|
||||
sw capacity() const
|
||||
@@ -2233,6 +2249,24 @@ struct String
|
||||
get_header().Length = 0;
|
||||
}
|
||||
|
||||
b32 starts_with( StrC substring ) const
|
||||
{
|
||||
if (substring.Len > length())
|
||||
return false;
|
||||
|
||||
b32 result = str_compare(Data, substring.Ptr, substring.Len ) == 0;
|
||||
return result;
|
||||
}
|
||||
|
||||
b32 starts_with( String substring ) const
|
||||
{
|
||||
if (substring.length() > length())
|
||||
return false;
|
||||
|
||||
b32 result = str_compare(Data, substring, substring.length() - 1 ) == 0;
|
||||
return result;
|
||||
}
|
||||
|
||||
String duplicate( AllocatorInfo allocator ) const
|
||||
{
|
||||
return make_length( allocator, Data, length() );
|
||||
@@ -2250,7 +2284,7 @@ struct String
|
||||
|
||||
Header& get_header()
|
||||
{
|
||||
return *( Header* )( Data - sizeof( Header ) );
|
||||
return *(Header*)( Data - sizeof( Header ) );
|
||||
}
|
||||
|
||||
sw length() const
|
||||
@@ -2298,7 +2332,7 @@ struct String
|
||||
read_pos++;
|
||||
}
|
||||
|
||||
write_pos[ 0 ] = '\0'; // Null-terminate the modified string
|
||||
write_pos[0] = '\0'; // Null-terminate the modified string
|
||||
|
||||
// Update the length if needed
|
||||
get_header().Length = write_pos - Data;
|
||||
@@ -2322,7 +2356,7 @@ struct String
|
||||
if ( Data != start_pos )
|
||||
mem_move( Data, start_pos, len );
|
||||
|
||||
Data[ len ] = '\0';
|
||||
Data[len] = '\0';
|
||||
|
||||
get_header().Length = len;
|
||||
}
|
||||
@@ -2335,7 +2369,7 @@ struct String
|
||||
// Debug function that provides a copy of the string with whitespace characters visualized.
|
||||
String visualize_whitespace() const
|
||||
{
|
||||
Header* header = ( Header* )( Data - sizeof( Header ) );
|
||||
Header* header = (Header*)( Data - sizeof( Header ) );
|
||||
|
||||
String result = make_reserve( header->Allocator, length() * 2 ); // Assume worst case for space requirements.
|
||||
|
||||
@@ -2420,12 +2454,12 @@ struct String
|
||||
|
||||
char& operator[]( sw index )
|
||||
{
|
||||
return Data[ index ];
|
||||
return Data[index];
|
||||
}
|
||||
|
||||
char const& operator[]( sw index ) const
|
||||
{
|
||||
return Data[ index ];
|
||||
return Data[index];
|
||||
}
|
||||
|
||||
char* Data;
|
||||
@@ -2439,7 +2473,7 @@ struct String_POD
|
||||
static_assert( sizeof( String_POD ) == sizeof( String ), "String is not a POD" );
|
||||
|
||||
// Implements basic string interning. Data structure is based off the ZPL Hashtable.
|
||||
using StringTable = HashTable< String const >;
|
||||
using StringTable = HashTable<String const>;
|
||||
|
||||
// Represents strings cached with the string table.
|
||||
// Should never be modified, if changed string is desired, cache_string( str ) another.
|
||||
|
||||
+354
-354
File diff suppressed because it is too large
Load Diff
@@ -25,7 +25,7 @@ u8 adt_make_branch( ADT_Node* node, AllocatorInfo backing, char const* name, b32
|
||||
node->type = type;
|
||||
node->name = name;
|
||||
node->parent = parent;
|
||||
node->nodes = Array< ADT_Node >::init( backing );
|
||||
node->nodes = Array<ADT_Node>::init( backing );
|
||||
|
||||
if ( ! node->nodes )
|
||||
return EADT_ERROR_OUT_OF_MEMORY;
|
||||
@@ -70,7 +70,7 @@ ADT_Node* adt_find( ADT_Node* node, char const* name, b32 deep_search )
|
||||
|
||||
for ( sw i = 0; i < node->nodes.num(); i++ )
|
||||
{
|
||||
if ( ! str_compare( node->nodes[ i ].name, name ) )
|
||||
if ( ! str_compare( node->nodes[i].name, name ) )
|
||||
{
|
||||
return ( node->nodes + i );
|
||||
}
|
||||
@@ -106,17 +106,17 @@ internal ADT_Node* _adt_get_value( ADT_Node* node, char const* value )
|
||||
case EADT_TYPE_INTEGER :
|
||||
case EADT_TYPE_REAL :
|
||||
{
|
||||
char back[ 4096 ] = { 0 };
|
||||
char back[4096] = { 0 };
|
||||
FileInfo tmp;
|
||||
|
||||
/* allocate a file descriptor for a memory-mapped number to string conversion, input source buffer is not cloned, however. */
|
||||
file_stream_open( &tmp, heap(), ( u8* )back, size_of( back ), EFileStream_WRITABLE );
|
||||
file_stream_open( &tmp, heap(), (u8*)back, size_of( back ), EFileStream_WRITABLE );
|
||||
adt_print_number( &tmp, node );
|
||||
|
||||
sw fsize = 0;
|
||||
u8* buf = file_stream_buf( &tmp, &fsize );
|
||||
|
||||
if ( ! str_compare( ( char const* )buf, value ) )
|
||||
if ( ! str_compare( (char const*)buf, value ) )
|
||||
{
|
||||
file_close( &tmp );
|
||||
return node;
|
||||
@@ -136,9 +136,9 @@ internal ADT_Node* _adt_get_field( ADT_Node* node, char* name, char* value )
|
||||
{
|
||||
for ( sw i = 0; i < node->nodes.num(); i++ )
|
||||
{
|
||||
if ( ! str_compare( node->nodes[ i ].name, name ) )
|
||||
if ( ! str_compare( node->nodes[i].name, name ) )
|
||||
{
|
||||
ADT_Node* child = &node->nodes[ i ];
|
||||
ADT_Node* child = &node->nodes[i];
|
||||
if ( _adt_get_value( child, value ) )
|
||||
{
|
||||
return node; /* this object does contain a field of a specified value! */
|
||||
@@ -172,19 +172,19 @@ ADT_Node* adt_query( ADT_Node* node, char const* uri )
|
||||
str_fmt_out( "uri: %s\n", uri );
|
||||
#endif
|
||||
|
||||
char * p = ( char* )uri, *b = p, *e = p;
|
||||
char * p = (char*)uri, *b = p, *e = p;
|
||||
ADT_Node* found_node = NULL;
|
||||
|
||||
b = p;
|
||||
p = e = ( char* )str_skip( p, '/' );
|
||||
char* buf = str_fmt_buf( "%.*s", ( int )( e - b ), b );
|
||||
p = e = (char*)str_skip( p, '/' );
|
||||
char* buf = str_fmt_buf( "%.*s", (int)( e - b ), b );
|
||||
|
||||
/* handle field value lookup */
|
||||
if ( *b == '[' )
|
||||
{
|
||||
char *l_p = buf + 1, *l_b = l_p, *l_e = l_p, *l_b2 = l_p, *l_e2 = l_p;
|
||||
l_e = ( char* )str_skip( l_p, '=' );
|
||||
l_e2 = ( char* )str_skip( l_p, ']' );
|
||||
l_e = (char*)str_skip( l_p, '=' );
|
||||
l_e2 = (char*)str_skip( l_p, ']' );
|
||||
|
||||
if ( ( ! *l_e && node->type != EADT_TYPE_ARRAY ) || ! *l_e2 )
|
||||
{
|
||||
@@ -211,7 +211,7 @@ ADT_Node* adt_query( ADT_Node* node, char const* uri )
|
||||
{
|
||||
for ( sw i = 0; i < node->nodes.num(); i++ )
|
||||
{
|
||||
ADT_Node* child = &node->nodes[ i ];
|
||||
ADT_Node* child = &node->nodes[i];
|
||||
if ( child->type != EADT_TYPE_OBJECT )
|
||||
{
|
||||
continue;
|
||||
@@ -229,7 +229,7 @@ ADT_Node* adt_query( ADT_Node* node, char const* uri )
|
||||
{
|
||||
for ( sw i = 0; i < node->nodes.num(); i++ )
|
||||
{
|
||||
ADT_Node* child = &node->nodes[ i ];
|
||||
ADT_Node* child = &node->nodes[i];
|
||||
if ( _adt_get_value( child, l_b2 ) )
|
||||
{
|
||||
found_node = child;
|
||||
@@ -258,10 +258,10 @@ ADT_Node* adt_query( ADT_Node* node, char const* uri )
|
||||
/* handle array index lookup */
|
||||
else
|
||||
{
|
||||
sw idx = ( sw )str_to_i64( buf, NULL, 10 );
|
||||
sw idx = (sw)str_to_i64( buf, NULL, 10 );
|
||||
if ( idx >= 0 && idx < node->nodes.num() )
|
||||
{
|
||||
found_node = &node->nodes[ idx ];
|
||||
found_node = &node->nodes[idx];
|
||||
|
||||
/* go deeper if uri continues */
|
||||
if ( *e )
|
||||
@@ -366,15 +366,15 @@ void adt_swap_nodes( ADT_Node* node, ADT_Node* other_node )
|
||||
{
|
||||
GEN_ASSERT_NOT_NULL( node );
|
||||
GEN_ASSERT_NOT_NULL( other_node );
|
||||
ADT_Node* parent = node->parent;
|
||||
ADT_Node* other_parent = other_node->parent;
|
||||
sw index = ( pointer_diff( parent->nodes, node ) / size_of( ADT_Node ) );
|
||||
sw index2 = ( pointer_diff( other_parent->nodes, other_node ) / size_of( ADT_Node ) );
|
||||
ADT_Node temp = parent->nodes[ index ];
|
||||
temp.parent = other_parent;
|
||||
other_parent->nodes[ index2 ].parent = parent;
|
||||
parent->nodes[ index ] = other_parent->nodes[ index2 ];
|
||||
other_parent->nodes[ index2 ] = temp;
|
||||
ADT_Node* parent = node->parent;
|
||||
ADT_Node* other_parent = other_node->parent;
|
||||
sw index = ( pointer_diff( parent->nodes, node ) / size_of( ADT_Node ) );
|
||||
sw index2 = ( pointer_diff( other_parent->nodes, other_node ) / size_of( ADT_Node ) );
|
||||
ADT_Node temp = parent->nodes[index];
|
||||
temp.parent = other_parent;
|
||||
other_parent->nodes[index2].parent = parent;
|
||||
parent->nodes[index] = other_parent->nodes[index2];
|
||||
other_parent->nodes[index2] = temp;
|
||||
}
|
||||
|
||||
void adt_remove_node( ADT_Node* node )
|
||||
@@ -483,28 +483,28 @@ char* adt_parse_number( ADT_Node* node, char* base_str )
|
||||
return ++base_str;
|
||||
}
|
||||
|
||||
node_type = EADT_TYPE_INTEGER;
|
||||
neg_zero = false;
|
||||
node_type = EADT_TYPE_INTEGER;
|
||||
neg_zero = false;
|
||||
|
||||
sw ib = 0;
|
||||
char buf[ 48 ] = { 0 };
|
||||
sw ib = 0;
|
||||
char buf[48] = { 0 };
|
||||
|
||||
if ( *e == '+' )
|
||||
++e;
|
||||
else if ( *e == '-' )
|
||||
{
|
||||
buf[ ib++ ] = *e++;
|
||||
buf[ib++] = *e++;
|
||||
}
|
||||
|
||||
if ( *e == '.' )
|
||||
{
|
||||
node_type = EADT_TYPE_REAL;
|
||||
node_props = EADT_PROPS_IS_PARSED_REAL;
|
||||
lead_digit = false;
|
||||
buf[ ib++ ] = '0';
|
||||
node_type = EADT_TYPE_REAL;
|
||||
node_props = EADT_PROPS_IS_PARSED_REAL;
|
||||
lead_digit = false;
|
||||
buf[ib++] = '0';
|
||||
do
|
||||
{
|
||||
buf[ ib++ ] = *e;
|
||||
buf[ib++] = *e;
|
||||
} while ( char_is_digit( *++e ) );
|
||||
}
|
||||
else
|
||||
@@ -522,7 +522,7 @@ char* adt_parse_number( ADT_Node* node, char* base_str )
|
||||
|
||||
while ( char_is_hex_digit( *e ) || char_to_lower( *e ) == 'x' )
|
||||
{
|
||||
buf[ ib++ ] = *e++;
|
||||
buf[ib++] = *e++;
|
||||
}
|
||||
|
||||
if ( *e == '.' )
|
||||
@@ -533,13 +533,13 @@ char* adt_parse_number( ADT_Node* node, char* base_str )
|
||||
|
||||
do
|
||||
{
|
||||
buf[ ib++ ] = *e;
|
||||
buf[ib++] = *e;
|
||||
++step;
|
||||
} while ( char_is_digit( *++e ) );
|
||||
|
||||
if ( step < 2 )
|
||||
{
|
||||
buf[ ib++ ] = '0';
|
||||
buf[ib++] = '0';
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -550,9 +550,9 @@ char* adt_parse_number( ADT_Node* node, char* base_str )
|
||||
return ++base_str;
|
||||
}
|
||||
|
||||
f32 eb = 10;
|
||||
char expbuf[ 6 ] = { 0 };
|
||||
sw expi = 0;
|
||||
f32 eb = 10;
|
||||
char expbuf[6] = { 0 };
|
||||
sw expi = 0;
|
||||
|
||||
if ( *e && ! ! str_find( "eE", *e ) )
|
||||
{
|
||||
@@ -569,11 +569,11 @@ char* adt_parse_number( ADT_Node* node, char* base_str )
|
||||
}
|
||||
while ( char_is_digit( *e ) )
|
||||
{
|
||||
expbuf[ expi++ ] = *e++;
|
||||
expbuf[expi++] = *e++;
|
||||
}
|
||||
}
|
||||
|
||||
orig_exp = exp = ( u8 )str_to_i64( expbuf, NULL, 10 );
|
||||
orig_exp = exp = (u8)str_to_i64( expbuf, NULL, 10 );
|
||||
}
|
||||
|
||||
if ( node_type == EADT_TYPE_INTEGER )
|
||||
@@ -581,14 +581,14 @@ char* adt_parse_number( ADT_Node* node, char* base_str )
|
||||
node->integer = str_to_i64( buf, 0, 0 );
|
||||
#ifndef GEN_PARSER_DISABLE_ANALYSIS
|
||||
/* special case: negative zero */
|
||||
if ( node->integer == 0 && buf[ 0 ] == '-' )
|
||||
if ( node->integer == 0 && buf[0] == '-' )
|
||||
{
|
||||
neg_zero = true;
|
||||
}
|
||||
#endif
|
||||
while ( orig_exp-- > 0 )
|
||||
{
|
||||
node->integer *= ( s64 )eb;
|
||||
node->integer *= (s64)eb;
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -604,8 +604,8 @@ char* adt_parse_number( ADT_Node* node, char* base_str )
|
||||
while ( *base_string_off++ == '0' )
|
||||
base2_offset++;
|
||||
|
||||
base = ( s32 )str_to_i64( q, 0, 0 );
|
||||
base2 = ( s32 )str_to_i64( base_string2, 0, 0 );
|
||||
base = (s32)str_to_i64( q, 0, 0 );
|
||||
base2 = (s32)str_to_i64( base_string2, 0, 0 );
|
||||
if ( exp )
|
||||
{
|
||||
exp = exp * ( ! ( eb == 10.0f ) ? -1 : 1 );
|
||||
@@ -613,7 +613,7 @@ char* adt_parse_number( ADT_Node* node, char* base_str )
|
||||
}
|
||||
|
||||
/* special case: negative zero */
|
||||
if ( base == 0 && buf[ 0 ] == '-' )
|
||||
if ( base == 0 && buf[0] == '-' )
|
||||
{
|
||||
neg_zero = true;
|
||||
}
|
||||
@@ -667,11 +667,11 @@ ADT_Error adt_print_number( FileInfo* file, ADT_Node* node )
|
||||
{
|
||||
if ( node->props == EADT_PROPS_IS_HEX )
|
||||
{
|
||||
_adt_fprintf( file, "0x%llx", ( long long )node->integer );
|
||||
_adt_fprintf( file, "0x%llx", (long long)node->integer );
|
||||
}
|
||||
else
|
||||
{
|
||||
_adt_fprintf( file, "%lld", ( long long )node->integer );
|
||||
_adt_fprintf( file, "%lld", (long long)node->integer );
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -709,14 +709,14 @@ ADT_Error adt_print_number( FileInfo* file, ADT_Node* node )
|
||||
}
|
||||
else if ( node->props == EADT_PROPS_IS_EXP )
|
||||
{
|
||||
_adt_fprintf( file, "%lld.%0*d%llde%lld", ( long long )node->base, node->base2_offset, 0, ( long long )node->base2, ( long long )node->exp );
|
||||
_adt_fprintf( file, "%lld.%0*d%llde%lld", (long long)node->base, node->base2_offset, 0, (long long)node->base2, (long long)node->exp );
|
||||
}
|
||||
else if ( node->props == EADT_PROPS_IS_PARSED_REAL )
|
||||
{
|
||||
if ( ! node->lead_digit )
|
||||
_adt_fprintf( file, ".%0*d%lld", node->base2_offset, 0, ( long long )node->base2 );
|
||||
_adt_fprintf( file, ".%0*d%lld", node->base2_offset, 0, (long long)node->base2 );
|
||||
else
|
||||
_adt_fprintf( file, "%lld.%0*d%lld", ( long long int )node->base2_offset, 0, ( int )node->base, ( long long )node->base2 );
|
||||
_adt_fprintf( file, "%lld.%0*d%lld", (long long int)node->base2_offset, 0, (int)node->base, (long long)node->base2 );
|
||||
#endif
|
||||
}
|
||||
else
|
||||
@@ -772,7 +772,7 @@ ADT_Error adt_str_to_number( ADT_Node* node )
|
||||
return EADT_ERROR_INVALID_TYPE;
|
||||
}
|
||||
|
||||
adt_parse_number( node, ( char* )node->string );
|
||||
adt_parse_number( node, (char*)node->string );
|
||||
|
||||
return EADT_ERROR_NONE;
|
||||
}
|
||||
@@ -788,7 +788,7 @@ ADT_Error adt_str_to_number_strict( ADT_Node* node )
|
||||
return EADT_ERROR_INVALID_TYPE;
|
||||
}
|
||||
|
||||
adt_parse_number_strict( node, ( char* )node->string );
|
||||
adt_parse_number_strict( node, (char*)node->string );
|
||||
|
||||
return EADT_ERROR_NONE;
|
||||
}
|
||||
@@ -922,7 +922,7 @@ u8 csv_parse_delimiter( CSV_Object* root, char* text, AllocatorInfo allocator, b
|
||||
char* num_p = beginChar;
|
||||
|
||||
// We only consider hexadecimal values if they start with 0x
|
||||
if ( str_len( num_p ) > 2 && num_p[ 0 ] == '0' && ( num_p[ 1 ] == 'x' || num_p[ 1 ] == 'X' ) )
|
||||
if ( str_len( num_p ) > 2 && num_p[0] == '0' && ( num_p[1] == 'x' || num_p[1] == 'X' ) )
|
||||
{
|
||||
num_p += 2; // skip '0x' prefix
|
||||
do
|
||||
@@ -950,7 +950,7 @@ u8 csv_parse_delimiter( CSV_Object* root, char* text, AllocatorInfo allocator, b
|
||||
adt_append_arr( root, NULL );
|
||||
}
|
||||
|
||||
root->nodes[ columnIndex ].nodes.append( rowItem );
|
||||
root->nodes[columnIndex].nodes.append( rowItem );
|
||||
|
||||
if ( delimiter == delim )
|
||||
{
|
||||
@@ -1059,17 +1059,17 @@ void csv_write_delimiter( FileInfo* file, CSV_Object* obj, char delimiter )
|
||||
if ( cols == 0 )
|
||||
return;
|
||||
|
||||
sw rows = obj->nodes[ 0 ].nodes.num();
|
||||
sw rows = obj->nodes[0].nodes.num();
|
||||
if ( rows == 0 )
|
||||
return;
|
||||
|
||||
b32 has_headers = obj->nodes[ 0 ].name != NULL;
|
||||
b32 has_headers = obj->nodes[0].name != NULL;
|
||||
|
||||
if ( has_headers )
|
||||
{
|
||||
for ( sw i = 0; i < cols; i++ )
|
||||
{
|
||||
_csv_write_header( file, &obj->nodes[ i ] );
|
||||
_csv_write_header( file, &obj->nodes[i] );
|
||||
if ( i + 1 != cols )
|
||||
{
|
||||
str_fmt_file( file, "%c", delimiter );
|
||||
@@ -1082,7 +1082,7 @@ void csv_write_delimiter( FileInfo* file, CSV_Object* obj, char delimiter )
|
||||
{
|
||||
for ( sw i = 0; i < cols; i++ )
|
||||
{
|
||||
_csv_write_record( file, &obj->nodes[ i ].nodes[ r ] );
|
||||
_csv_write_record( file, &obj->nodes[i].nodes[r] );
|
||||
if ( i + 1 != cols )
|
||||
{
|
||||
str_fmt_file( file, "%c", delimiter );
|
||||
@@ -1099,7 +1099,7 @@ String csv_write_string_delimiter( AllocatorInfo a, CSV_Object* obj, char delimi
|
||||
csv_write_delimiter( &tmp, obj, delimiter );
|
||||
sw fsize;
|
||||
u8* buf = file_stream_buf( &tmp, &fsize );
|
||||
String output = String::make_length( a, ( char* )buf, fsize );
|
||||
String output = String::make_length( a, (char*)buf, fsize );
|
||||
file_close( &tmp );
|
||||
return output;
|
||||
}
|
||||
|
||||
@@ -86,8 +86,8 @@ struct ADT_Node
|
||||
/* adt data */
|
||||
union
|
||||
{
|
||||
char const* string;
|
||||
Array< ADT_Node > nodes; ///< zpl_array
|
||||
char const* string;
|
||||
Array<ADT_Node> nodes; ///< zpl_array
|
||||
|
||||
struct
|
||||
{
|
||||
|
||||
+15
-12
@@ -6,7 +6,7 @@ AlignAfterOpenBracket: BlockIndent
|
||||
AlignArrayOfStructures: Left
|
||||
AlignConsecutiveAssignments:
|
||||
Enabled: true
|
||||
AcrossEmptyLines: true
|
||||
AcrossEmptyLines: false
|
||||
AcrossComments: false
|
||||
AlignCompound: true
|
||||
PadOperators: true
|
||||
@@ -24,17 +24,16 @@ AlignConsecutiveMacros:
|
||||
AcrossComments: false
|
||||
AlignEscapedNewlines: Left
|
||||
AlignOperands: DontAlign
|
||||
|
||||
AlignTrailingComments: true
|
||||
|
||||
AllowAllArgumentsOnNextLine: false
|
||||
AllowAllArgumentsOnNextLine: true
|
||||
AllowAllConstructorInitializersOnNextLine: false
|
||||
AllowAllParametersOfDeclarationOnNextLine: false
|
||||
AllowShortBlocksOnASingleLine: Never
|
||||
AllowShortBlocksOnASingleLine: Empty
|
||||
AllowShortCaseLabelsOnASingleLine: false
|
||||
AllowShortLambdasOnASingleLine: None
|
||||
AllowShortEnumsOnASingleLine: false
|
||||
AllowShortFunctionsOnASingleLine: None
|
||||
AllowShortFunctionsOnASingleLine: Inline
|
||||
AllowShortIfStatementsOnASingleLine: Never
|
||||
AllowShortLoopsOnASingleLine: false
|
||||
|
||||
@@ -60,16 +59,17 @@ BraceWrapping:
|
||||
AfterExternBlock: false
|
||||
BeforeCatch: false
|
||||
BeforeElse: false
|
||||
BeforeWhile: false
|
||||
IndentBraces: false
|
||||
SplitEmptyFunction: false
|
||||
SplitEmptyRecord: false
|
||||
SplitEmptyNamespace: false
|
||||
BeforeLambdaBody: false
|
||||
BeforeWhile: false
|
||||
|
||||
|
||||
BreakAfterAttributes: Always
|
||||
BreakArrays: true
|
||||
# BreakBeforeInlineASMColon: OnlyMultiline
|
||||
BreakBeforeInlineASMColon: OnlyMultiline
|
||||
BreakBeforeBinaryOperators: NonAssignment
|
||||
BreakBeforeBraces: Allman
|
||||
BreakBeforeInheritanceComma: true
|
||||
@@ -79,7 +79,7 @@ BreakBeforeTernaryOperators: true
|
||||
BreakConstructorInitializers: BeforeComma
|
||||
BreakStringLiterals: true
|
||||
|
||||
ColumnLimit: 160
|
||||
ColumnLimit: 240
|
||||
|
||||
CompactNamespaces: true
|
||||
|
||||
@@ -92,6 +92,7 @@ Cpp11BracedListStyle: false
|
||||
|
||||
DeriveLineEnding: true
|
||||
|
||||
EmptyLineBeforeAccessModifier: LogicalBlock
|
||||
ExperimentalAutoDetectBinPacking: false
|
||||
|
||||
FixNamespaceComments: true
|
||||
@@ -102,7 +103,7 @@ IndentCaseBlocks: false
|
||||
IndentCaseLabels: true
|
||||
IndentExternBlock: AfterExternBlock
|
||||
IndentGotoLabels: true
|
||||
IndentPPDirectives: None
|
||||
IndentPPDirectives: BeforeHash
|
||||
IndentRequires: true
|
||||
IndentWidth: 4
|
||||
IndentWrappedFunctionNames: true
|
||||
@@ -126,9 +127,9 @@ ReferenceAlignment: Left
|
||||
|
||||
ReflowComments: true
|
||||
|
||||
# RequiresExpressionIndentation: OuterScope
|
||||
RequiresExpressionIndentation: OuterScope
|
||||
|
||||
SeparateDefinitionBlocks: Always
|
||||
SeparateDefinitionBlocks: Leave
|
||||
|
||||
ShortNamespaceLines: 40
|
||||
|
||||
@@ -163,7 +164,9 @@ SpacesInLineCommentPrefix:
|
||||
SpacesInParentheses: true
|
||||
SpacesInSquareBrackets: false
|
||||
|
||||
Standard: c++17
|
||||
Standard: c++20
|
||||
|
||||
StatementMacros: ['UPROPERTY', 'UFUNCTION', 'UCLASS', 'USTRUCT', 'UENUM', 'UINTERFACE', 'GENERATED_BODY']
|
||||
|
||||
TabWidth: 4
|
||||
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
Clear-Host
|
||||
|
||||
$path_scripts = $PSScriptRoot
|
||||
$path_helpers = join-path $path_scripts 'helpers'
|
||||
$path_root = split-path -Parent -Path $path_scripts
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
Clear-Host
|
||||
|
||||
$target_arch = Join-Path $PSScriptRoot 'helpers/target_arch.psm1'
|
||||
$devshell = Join-Path $PSScriptRoot 'helpers/devshell.ps1'
|
||||
$format_cpp = Join-Path $PSScriptRoot 'helpers/format_cpp.psm1'
|
||||
@@ -7,7 +5,7 @@ $incremental_checks = Join-Path $PSScriptRoot 'helpers/incremental_checks.ps1'
|
||||
$vendor_toolchain = Join-Path $PSScriptRoot 'helpers/vendor_toolchain.ps1'
|
||||
$update_deps = Join-Path $PSScriptRoot 'update_deps.ps1'
|
||||
|
||||
$path_root = git rev-parse --show-toplevel
|
||||
$path_root = git rev-parse --show-toplevel
|
||||
|
||||
Import-Module $target_arch
|
||||
Import-Module $format_cpp
|
||||
@@ -91,7 +89,7 @@ build-gengasa
|
||||
|
||||
function run-gengasa
|
||||
{
|
||||
Push-Location $path_project
|
||||
Push-Location $path_root
|
||||
if ( Test-Path( $exe_gasagen ) ) {
|
||||
write-host "`nRunning GasaGen"
|
||||
$time_taken = Measure-Command { & $exe_gasagen
|
||||
@@ -102,15 +100,5 @@ function run-gengasa
|
||||
write-host "`GasaGen completed in $($time_taken.TotalMilliseconds) ms"
|
||||
}
|
||||
Pop-Location
|
||||
|
||||
$path_AbilitySystem = join-path $path_gasa 'AbilitySystem'
|
||||
$include = @(
|
||||
'GasaAttributeSet.h', 'GasaAttributeSet.cpp'
|
||||
)
|
||||
format-cpp $path_AbilitySystem $include $null
|
||||
|
||||
$path_KismetPrivate = 'C:\projects\Unreal\Surgo\UE\Engine\Source\Editor\Kismet\Private\'
|
||||
$include = @( 'SBlueprintActionMenu.cpp' )
|
||||
format-cpp $path_KismetPrivate $include $null
|
||||
}
|
||||
run-gengasa
|
||||
|
||||
@@ -171,8 +171,8 @@ if ( $vendor -match "clang" )
|
||||
$map = join-path $path_output (split-path $map -Leaf)
|
||||
|
||||
# This allows dll reloads at runtime to work (jankily, use below if not interested)
|
||||
$pdb = $binary -replace '\.(exe|dll)$', "_$(get-random).pdb"
|
||||
# $pdb = $binary -replace '\.(exe|dll)$', ".pdb"
|
||||
# $pdb = $binary -replace '\.(exe|dll)$', "_$(get-random).pdb"
|
||||
$pdb = $binary -replace '\.(exe|dll)$', ".pdb"
|
||||
|
||||
$compiler_args += @(
|
||||
$flag_no_color_diagnostics,
|
||||
@@ -250,8 +250,8 @@ if ( $vendor -match "clang" )
|
||||
$map = join-path $path_output (split-path $map -Leaf)
|
||||
|
||||
# This allows dll reloads at runtime to work (jankily, use below if not interested)
|
||||
$pdb = $binary -replace '\.(exe|dll)$', "_$(get-random).pdb"
|
||||
# $pdb = $binary -replace '\.(exe|dll)$', ".pdb"
|
||||
# $pdb = $binary -replace '\.(exe|dll)$', "_$(get-random).pdb"
|
||||
$pdb = $binary -replace '\.(exe|dll)$', ".pdb"
|
||||
|
||||
$compiler_args += @(
|
||||
$flag_no_color_diagnostics,
|
||||
@@ -369,8 +369,8 @@ if ( $vendor -match "msvc" )
|
||||
$map = join-path $path_output (split-path $map -Leaf)
|
||||
|
||||
# This allows dll reloads at runtime to work (jankily, use below if not interested)
|
||||
$pdb = $binary -replace '\.(exe|dll)$', "_$(get-random).pdb"
|
||||
# $pdb = $binary -replace '\.(exe|dll)$', ".pdb"
|
||||
# $pdb = $binary -replace '\.(exe|dll)$', "_$(get-random).pdb"
|
||||
$pdb = $binary -replace '\.(exe|dll)$', ".pdb"
|
||||
|
||||
$compiler_args += @(
|
||||
$flag_nologo,
|
||||
@@ -455,8 +455,8 @@ if ( $vendor -match "msvc" )
|
||||
$map = join-path $path_output (split-path $map -Leaf)
|
||||
|
||||
# This allows dll reloads at runtime to work (jankily, use below if not interested)
|
||||
$pdb = $binary -replace '\.(exe|dll)$', "_$(get-random).pdb"
|
||||
# $pdb = $binary -replace '\.(exe|dll)$', ".pdb"
|
||||
# $pdb = $binary -replace '\.(exe|dll)$', "_$(get-random).pdb"
|
||||
$pdb = $binary -replace '\.(exe|dll)$', ".pdb"
|
||||
|
||||
$compiler_args += @(
|
||||
$flag_nologo,
|
||||
|
||||
Reference in New Issue
Block a user