32. Overlay Widget Controller
This commit is contained in:
		| @@ -55,7 +55,7 @@ int gen_main() | ||||
| 		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_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)); | ||||
|   | ||||
| @@ -34,7 +34,7 @@ constexpr StrC str_DECLARE_MULTICAST_DELEGATE_TwoParams                  = txt(" | ||||
| 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                                           = 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("); | ||||
|   | ||||
| @@ -34,7 +34,7 @@ void gen_FGasaDevOptionsCache() | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	CodeComment generation_notice = def_comment(txt("This was generated by GasaGen/GasaGen.cpp")); | ||||
| 	CodeComment generation_notice = def_comment(txt("Generated by GasaGen/GasaGen_DevOptionsCache.cpp")); | ||||
|  | ||||
| 	Builder header = Builder::open( path_module_gasa "GasaDevOptionsCache.h" ); | ||||
| 	{ | ||||
| @@ -107,13 +107,17 @@ void gen_FGasaDevOptionsCache() | ||||
| 			cached_property_assignments.append(fmt_newline); | ||||
| 			for (CodeVar var : GasaDevOptions_UPROPERTIES) | ||||
| 			{ | ||||
| 				#pragma push_macro("TEXT") | ||||
| 				#undef TEXT | ||||
| 				Code assignment = code_fmt( "property", (StrC)var->Name, stringize( | ||||
| 					<property> = DevOpts-> <property>.LoadSynchronous(); | ||||
| 					ensureMsgf(<property> != nullptr, TEXT("<property> is null, DO NOT RUN PIE or else you may get a crash if not handled in BP or C++")); | ||||
| 				)); | ||||
| 				#pragma pop_macro("TEXT") | ||||
| 				cached_property_assignments.append(assignment); | ||||
| 				cached_property_assignments.append(fmt_newline); | ||||
| 				cached_property_assignments.append(fmt_newline); | ||||
| 			} | ||||
| 			cached_property_assignments.append(fmt_newline); | ||||
| 			cached_property_assignments.append(fmt_newline); | ||||
| 		} | ||||
|  | ||||
| 		CodeFn CachedDevOptions = parse_function( token_fmt( | ||||
|   | ||||
| @@ -7,18 +7,19 @@ | ||||
| #include "GasaGenCommon.cpp" | ||||
| #endif | ||||
|  | ||||
| void def_attribute_properties            ( CodeBody body, Array<StringCached> properties ); | ||||
| void def_attribute_field_on_reps         ( CodeBody body, Array<StringCached> properties ); | ||||
| void def_attribute_field_property_getters( CodeBody body, StrC class_name, Array<StringCached> properties ); | ||||
| void def_attribute_field_value_getters   ( CodeBody body, Array<StringCached> properties ); | ||||
| void def_attribute_field_value_setters   ( CodeBody body, Array<StringCached> properties ); | ||||
| void def_attribute_field_initers         ( CodeBody body, Array<StringCached> properties ); | ||||
| void impl_attribute_fields               ( CodeBody body, StrC class_name, Array<StringCached> properties ); | ||||
| void def_attribute_properties                   ( CodeBody body, Array<StringCached> properties ); | ||||
| void def_attribute_field_on_reps                ( CodeBody body, Array<StringCached> properties ); | ||||
| void def_attribute_field_property_getters       ( CodeBody body, StrC class_name, Array<StringCached> properties ); | ||||
| void def_attribute_field_value_getters          ( CodeBody body, Array<StringCached> properties ); | ||||
| void def_attribute_field_value_setters          ( CodeBody body, Array<StringCached> properties ); | ||||
| void def_attribute_field_property_setter_inlines( CodeBody body, StrC class_name, Array<StringCached> properties ); | ||||
| void def_attribute_field_initers                ( CodeBody body, Array<StringCached> properties ); | ||||
| void impl_attribute_fields                      ( CodeBody body, StrC class_name, Array<StringCached> properties ); | ||||
|  | ||||
| void gen_UGasaAttributeSet() | ||||
| { | ||||
| 	CodeType   type_UAttributeSet = def_type( txt("UAttributeSet") ); | ||||
| 	CodeComment generation_notice = def_comment(txt("This was generated by GasaGen/GasaGen.cpp")); | ||||
| 	CodeComment generation_notice = def_comment(txt("Generated by GasaGen/GasaGen_UGasaAttributeSet.cpp")); | ||||
|  | ||||
| 	Array<StringCached> attribute_fields = Array<StringCached>::init( GlobalAllocator); | ||||
| 	attribute_fields.append( get_cached_string(txt("Health"))); | ||||
| @@ -31,10 +32,10 @@ void gen_UGasaAttributeSet() | ||||
| 	Builder header = Builder::open( path_gasa_ability_system "GasaAttributeSet.h"); | ||||
| 	{ | ||||
| 		header.print(generation_notice); | ||||
| 		header.print(pragma_once); | ||||
| 		header.print(fmt_newline); | ||||
| 		{ | ||||
| 			CodeInclude Include_AttributeSet               = def_include(txt("AttributeSet.h")); | ||||
| 			CodeInclude Include_AbilitySystemComponent     = def_include(txt("AbilitySystemComponent.h")); | ||||
| 			CodeInclude Include_GasaAttributeSet_Generated = def_include(txt("GasaAttributeSet.generated.h")); | ||||
|  | ||||
| 			CodeAttributes api_attribute= def_attributes( UModule_GASA_API->Name); | ||||
| @@ -59,12 +60,15 @@ void gen_UGasaAttributeSet() | ||||
| 					body.append( fmt_newline ); | ||||
| 					body.append( def_pragma(code( region Getters ))); | ||||
| 					def_attribute_field_property_getters( body, class_name, attribute_fields ); | ||||
| 					body.append( fmt_newline ); | ||||
| 					def_attribute_field_value_getters( body, attribute_fields ); | ||||
| 					body.append( def_pragma(code( endregion Getters ))); | ||||
| 					body.append( fmt_newline ); | ||||
|  | ||||
| 					body.append( def_pragma(code( region Setters ))); | ||||
| 					def_attribute_field_value_setters( body, attribute_fields ); | ||||
| 					body.append( fmt_newline ); | ||||
| 					body.append( fmt_newline ); | ||||
| 					def_attribute_field_initers( body, attribute_fields ); | ||||
| 					body.append( def_pragma(code( endregion Setters ))); | ||||
| 					body.append( fmt_newline ); | ||||
| @@ -82,34 +86,54 @@ void gen_UGasaAttributeSet() | ||||
| 				); | ||||
| 			} | ||||
|  | ||||
| 			CodeNS ns_gasa = parse_namespace( code( | ||||
| 				namespace Gasa | ||||
| 				{ | ||||
| 					inline | ||||
| 					UGasaAttributeSet const* GetAttributeSet( UAbilitySystemComponent* ASC ) | ||||
| 					{ | ||||
| 						return Cast<UGasaAttributeSet>(ASC->GetAttributeSet( UGasaAttributeSet::StaticClass() )); | ||||
| 					} | ||||
| 				} | ||||
| 			)); | ||||
|  | ||||
| 			header.print( Include_AttributeSet); | ||||
| 			header.print( Include_AbilitySystemComponent); | ||||
| 			header.print( Include_GasaAttributeSet_Generated); | ||||
| 			header.print( fmt_newline); | ||||
| 			header.print( UHT_UCLASS ); | ||||
| 			header.print(GasaAttributeSet); | ||||
| 			header.print(ns_gasa); | ||||
| 		} | ||||
| 		header.write(); | ||||
| 		format_file(path_gasa_ability_system "GasaAttributeSet.h"); | ||||
| 	} | ||||
|  | ||||
| 	Builder inlines = Builder::open( path_gasa_ability_system "GasaAttributeSet_Inlines.h"); | ||||
| 	{ | ||||
| 		inlines.print(generation_notice); | ||||
| 		inlines.print(pragma_once); | ||||
| 		inlines.print(fmt_newline); | ||||
| 		inlines.print( def_include( txt("GasaAttributeSet.h"))); | ||||
| 		inlines.print( def_include(txt("AbilitySystemComponent.h"))); | ||||
| 		inlines.print(fmt_newline); | ||||
|  | ||||
| 		CodeBody body = def_body(CodeT::Global_Body); | ||||
| 		{ | ||||
| 			def_attribute_field_property_setter_inlines( body, class_name, attribute_fields ); | ||||
| 		} | ||||
| 		inlines.print(body); | ||||
| 		inlines.print(fmt_newline); | ||||
|  | ||||
| 		CodeNS ns_gasa = parse_namespace( code( | ||||
| 			namespace Gasa | ||||
| 			{ | ||||
| 				inline | ||||
| 				UGasaAttributeSet const* GetAttributeSet( UAbilitySystemComponent* ASC ) | ||||
| 				{ | ||||
| 					return Cast<UGasaAttributeSet>(ASC->GetAttributeSet( UGasaAttributeSet::StaticClass() )); | ||||
| 				} | ||||
| 			} | ||||
| 		)); | ||||
|  | ||||
| 		inlines.print(ns_gasa); | ||||
| 		inlines.write(); | ||||
| 		format_file(path_gasa_ability_system "GasaAttributeSet_Inlines.h"); | ||||
| 	} | ||||
|  | ||||
| 	Builder source = Builder::open( path_gasa_ability_system "GasaAttributeSet.cpp" ); | ||||
| 	{ | ||||
| 		source.print(generation_notice); | ||||
| 		header.print(fmt_newline); | ||||
| 		source.print( def_include( txt("GasaAttributeSet.h"))); | ||||
| 		source.print( def_include( txt("GasaAttributeSet_Inlines.h"))); | ||||
| 		source.print(fmt_newline); | ||||
| 		source.print( def_include( txt("AbilitySystemComponent.h"))); | ||||
| 		source.print( def_include( txt("Net/UnrealNetwork.h"))); | ||||
| @@ -231,18 +255,31 @@ void def_attribute_field_value_setters( CodeBody body, Array<StringCached> prope | ||||
| 	{ | ||||
| 		body.append( code_fmt( "property", (StrC)property, | ||||
| 		stringize( | ||||
| 			FORCEINLINE void Set<property>(float NewVal) | ||||
| 			{ | ||||
| 				UAbilitySystemComponent* AbilityComp = GetOwningAbilitySystemComponent(); | ||||
| 				if (ensure(AbilityComp)) | ||||
| 				{ | ||||
| 					AbilityComp->SetNumericAttributeBase(Get<property>Attribute(), NewVal); | ||||
| 				}; | ||||
| 			} | ||||
| 			FORCEINLINE void Set<property>(float NewVal); | ||||
| 		))); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void def_attribute_field_property_setter_inlines( CodeBody body, StrC class_name, Array<StringCached> properties ) | ||||
| { | ||||
| 	for ( String property : properties ) | ||||
| 	{ | ||||
| 		CodeFn generated_get_attribute = parse_function( | ||||
| 			token_fmt( "class_name", class_name, "property", (StrC)property, | ||||
| 			stringize( | ||||
| 				FORCEINLINE void <class_name>::Set<property>(float NewVal) | ||||
| 				{ | ||||
| 					UAbilitySystemComponent* AbilityComp = GetOwningAbilitySystemComponent(); | ||||
| 					if (ensure(AbilityComp)) | ||||
| 					{ | ||||
| 						AbilityComp->SetNumericAttributeBase(Get<property>Attribute(), NewVal); | ||||
| 					}; | ||||
| 				} | ||||
| 			))); | ||||
| 		body.append( generated_get_attribute ); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void def_attribute_field_initers ( CodeBody body, Array<StringCached> properties ) | ||||
| { | ||||
| 	for ( String property : properties ) | ||||
|   | ||||
| @@ -81,7 +81,7 @@ global CodeSpecifiers spec_constexpr; | ||||
| global CodeSpecifiers spec_constinit; | ||||
| global CodeSpecifiers spec_extern_linkage; | ||||
| global CodeSpecifiers spec_final; | ||||
| global CodeSpecifiers spec_forceinline; | ||||
| global CodeSpecifiers spec_FORCEINLINE; | ||||
| global CodeSpecifiers spec_global; | ||||
| global CodeSpecifiers spec_inline; | ||||
| global CodeSpecifiers spec_internal_linkage; | ||||
| @@ -2988,12 +2988,12 @@ internal void define_constants() | ||||
| 	spec_##Type_ = def_specifiers( num_args( __VA_ARGS__ ), __VA_ARGS__ ); \ | ||||
| 	spec_##Type_.set_global(); | ||||
|  | ||||
| #pragma push_macro( "forceinline" ) | ||||
| #pragma push_macro( "FORCEINLINE" ) | ||||
| #pragma push_macro( "global" ) | ||||
| #pragma push_macro( "internal" ) | ||||
| #pragma push_macro( "local_persist" ) | ||||
| #pragma push_macro( "neverinline" ) | ||||
| #undef forceinline | ||||
| #undef FORCEINLINE | ||||
| #undef global | ||||
| #undef internal | ||||
| #undef local_persist | ||||
| @@ -3004,7 +3004,7 @@ internal void define_constants() | ||||
| 	def_constant_spec( constinit, ESpecifier::Constinit ); | ||||
| 	def_constant_spec( extern_linkage, ESpecifier::External_Linkage ); | ||||
| 	def_constant_spec( final, ESpecifier::Final ); | ||||
| 	def_constant_spec( forceinline, ESpecifier::ForceInline ); | ||||
| 	def_constant_spec( FORCEINLINE, ESpecifier::ForceInline ); | ||||
| 	def_constant_spec( global, ESpecifier::Global ); | ||||
| 	def_constant_spec( inline, ESpecifier::Inline ); | ||||
| 	def_constant_spec( internal_linkage, ESpecifier::Internal_Linkage ); | ||||
| @@ -3025,7 +3025,7 @@ internal void define_constants() | ||||
| 	    spec_local_persist = def_specifiers( 1, ESpecifier::Local_Persist ); | ||||
| 	spec_local_persist.set_global(); | ||||
|  | ||||
| #pragma pop_macro( "forceinline" ) | ||||
| #pragma pop_macro( "FORCEINLINE" ) | ||||
| #pragma pop_macro( "global" ) | ||||
| #pragma pop_macro( "internal" ) | ||||
| #pragma pop_macro( "local_persist" ) | ||||
| @@ -5840,7 +5840,7 @@ namespace parser | ||||
| 				{ sizeof( "explicit" ),              "explicit"              }, | ||||
| 				{ sizeof( "extern" ),                "extern"                }, | ||||
| 				{ sizeof( "final" ),                 "final"                 }, | ||||
| 				{ sizeof( "forceinline" ),           "forceinline"           }, | ||||
| 				{ sizeof( "FORCEINLINE" ),           "FORCEINLINE"           }, | ||||
| 				{ sizeof( "global" ),                "global"                }, | ||||
| 				{ sizeof( "inline" ),                "inline"                }, | ||||
| 				{ sizeof( "internal" ),              "internal"              }, | ||||
| @@ -6059,7 +6059,7 @@ namespace parser | ||||
| 		} | ||||
| 	}; | ||||
|  | ||||
| 	global Arena_128KB defines_map_arena; | ||||
| 	global Arena_256KB defines_map_arena; | ||||
| 	global HashTable<StrC> defines; | ||||
| 	global Array<Token> Tokens; | ||||
|  | ||||
| @@ -6110,7 +6110,7 @@ namespace parser | ||||
| 		Lex_ReturnNull, | ||||
| 	}; | ||||
|  | ||||
| 	forceinline s32 lex_preprocessor_directive( StrC& content, s32& left, char const*& scanner, s32& line, s32& column, HashTable<StrC>& defines, Token& token ) | ||||
| 	FORCEINLINE s32 lex_preprocessor_directive( StrC& content, s32& left, char const*& scanner, s32& line, s32& column, HashTable<StrC>& defines, Token& token ) | ||||
| 	{ | ||||
| 		char const* hash = scanner; | ||||
| 		Tokens.append( { hash, 1, TokType::Preprocess_Hash, line, column, TF_Preprocess } ); | ||||
| @@ -6344,7 +6344,7 @@ namespace parser | ||||
| 		return Lex_Continue;    // Skip found token, its all handled here. | ||||
| 	} | ||||
|  | ||||
| 	forceinline void lex_found_token( StrC& content, s32& left, char const*& scanner, s32& line, s32& column, HashTable<StrC>& defines, Token& token ) | ||||
| 	FORCEINLINE void lex_found_token( StrC& content, s32& left, char const*& scanner, s32& line, s32& column, HashTable<StrC>& defines, Token& token ) | ||||
| 	{ | ||||
| 		if ( token.Type != TokType::Invalid ) | ||||
| 		{ | ||||
| @@ -7255,7 +7255,7 @@ namespace parser | ||||
| 	{ | ||||
| 		Tokens            = Array<Token>::init_reserve( LexArena, ( LexAllocator_Size - sizeof( Array<Token>::Header ) ) / sizeof( Token ) ); | ||||
|  | ||||
| 		defines_map_arena = Arena_128KB::init(); | ||||
| 		defines_map_arena = Arena_256KB::init(); | ||||
| 		defines           = HashTable<StrC>::init( defines_map_arena ); | ||||
| 	} | ||||
|  | ||||
|   | ||||
| @@ -145,21 +145,21 @@ GEN_NS_BEGIN | ||||
| #define local_persist static    // Local Persisting variables | ||||
|  | ||||
| #ifdef GEN_COMPILER_MSVC | ||||
| #define forceinline __forceinline | ||||
| #define FORCEINLINE __forceinline | ||||
| #define neverinline __declspec( noinline ) | ||||
| #elif defined( GEN_COMPILER_GCC ) | ||||
| #define forceinline inline __attribute__( ( __always_inline__ ) ) | ||||
| #define FORCEINLINE inline __attribute__( ( __always_inline__ ) ) | ||||
| #define neverinline __attribute__( ( __noinline__ ) ) | ||||
| #elif defined( GEN_COMPILER_CLANG ) | ||||
| #if __has_attribute( __always_inline__ ) | ||||
| #define forceinline inline __attribute__( ( __always_inline__ ) ) | ||||
| #define FORCEINLINE inline __attribute__( ( __always_inline__ ) ) | ||||
| #define neverinline __attribute__( ( __noinline__ ) ) | ||||
| #else | ||||
| #define forceinline | ||||
| #define FORCEINLINE | ||||
| #define neverinline | ||||
| #endif | ||||
| #else | ||||
| #define forceinline | ||||
| #define FORCEINLINE | ||||
| #define neverinline | ||||
| #endif | ||||
|  | ||||
|   | ||||
| @@ -451,7 +451,7 @@ namespace ESpecifier | ||||
| 			{ sizeof( "constinit" ),     "constinit"     }, | ||||
| 			{ sizeof( "explicit" ),      "explicit"      }, | ||||
| 			{ sizeof( "extern" ),        "extern"        }, | ||||
| 			{ sizeof( "forceinline" ),   "forceinline"   }, | ||||
| 			{ sizeof( "FORCEINLINE" ),   "FORCEINLINE"   }, | ||||
| 			{ sizeof( "global" ),        "global"        }, | ||||
| 			{ sizeof( "inline" ),        "inline"        }, | ||||
| 			{ sizeof( "internal" ),      "internal"      }, | ||||
| @@ -671,7 +671,7 @@ struct Code | ||||
| 	Using_Code( Code ); | ||||
|  | ||||
| 	template<class Type> | ||||
| 	forceinline Type cast() | ||||
| 	FORCEINLINE Type cast() | ||||
| 	{ | ||||
| 		return *rcast( Type*, this ); | ||||
| 	} | ||||
| @@ -761,7 +761,7 @@ struct AST | ||||
| 	neverinline void to_string( String& result ); | ||||
|  | ||||
| 	template<class Type> | ||||
| 	forceinline Type cast() | ||||
| 	FORCEINLINE Type cast() | ||||
| 	{ | ||||
| 		return *this; | ||||
| 	} | ||||
| @@ -6397,7 +6397,7 @@ extern CodeSpecifiers spec_constexpr; | ||||
| extern CodeSpecifiers spec_constinit; | ||||
| extern CodeSpecifiers spec_extern_linkage; | ||||
| extern CodeSpecifiers spec_final; | ||||
| extern CodeSpecifiers spec_forceinline; | ||||
| extern CodeSpecifiers spec_FORCEINLINE; | ||||
| extern CodeSpecifiers spec_global; | ||||
| extern CodeSpecifiers spec_inline; | ||||
| extern CodeSpecifiers spec_internal_linkage; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user