diff --git a/Source/Engine/Tests/TestScripting.h b/Source/Engine/Tests/TestScripting.h index 19fd76351..dc05750e1 100644 --- a/Source/Engine/Tests/TestScripting.h +++ b/Source/Engine/Tests/TestScripting.h @@ -8,6 +8,35 @@ #include "Engine/Scripting/ScriptingObject.h" #include "Engine/Scripting/SerializableScriptingObject.h" +// Test default values init on fields. +API_STRUCT(NoDefault) struct TestDefaultValues +{ + DECLARE_SCRIPTING_TYPE_MINIMAL(TestDefaultValues); + + // Default value case 1 + API_FIELD() float TestFloat1 = {}; + // Default value case 2 + API_FIELD() float TestFloat2 = { }; + // Default value case 3 + API_FIELD() float TestFloat3 = {1.0f}; + // Default value case 4 + API_FIELD() float TestFloat4 = float{}; + // Default value case 5 + API_FIELD() float TestFloat5 = float{ }; + // Default value case 6 + API_FIELD() float TestFloat6 = float{1.0f}; + // Default value case 7 + API_FIELD() float TestFloat7 {}; + // Default value case 8 + API_FIELD() float TestFloat8 {1.0f}; + // Default value case 9 + API_FIELD() float TestFloat9 = 1.0f; + // Default value case 10 + API_FIELD() float TestFloat10 = 1.f; + // Default value case 11 + API_FIELD() float TestFloat11 = 1; +}; + // Test interface (name conflict with namespace) API_INTERFACE(Namespace="Foo") class FLAXENGINE_API IFoo { diff --git a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs index 06d2b9712..9642c8b02 100644 --- a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs +++ b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs @@ -153,6 +153,28 @@ namespace Flax.Build.Bindings case "false": return value; } + // Handle float{_} style type of default values + if (valueType != null && value.StartsWith($"{valueType.Type}") && value.EndsWith("}")) + { + value = value.Replace($"{valueType.Type}", "").Replace("{", "").Replace("}", "").Trim(); + if (string.IsNullOrEmpty(value)) + { + value = $"default({valueType.Type})"; + return value; + } + } + + // Handle C++ bracket default values that are not arrays + if (value.StartsWith("{") && value.EndsWith("}") && valueType != null && !valueType.IsArray && valueType.Type != "Array") + { + value = value.Replace("{", "").Replace("}", "").Trim(); + if (string.IsNullOrEmpty(value)) + { + value = $"default({valueType.Type})"; + return value; + } + } + // Numbers if (float.TryParse(value, out _) || (value[value.Length - 1] == 'f' && float.TryParse(value.Substring(0, value.Length - 1), out _))) { diff --git a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Parsing.cs b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Parsing.cs index b2a3604bb..d99fa8b92 100644 --- a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Parsing.cs +++ b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Parsing.cs @@ -1352,11 +1352,17 @@ namespace Flax.Build.Bindings desc.Name = ParseName(ref context); // Read ';' or default value or array size or bit-field size - token = context.Tokenizer.ExpectAnyTokens(new[] { TokenType.SemiColon, TokenType.Equal, TokenType.LeftBracket, TokenType.Colon }); + token = context.Tokenizer.ExpectAnyTokens(new[] { TokenType.SemiColon, TokenType.Equal, TokenType.LeftBracket, TokenType.LeftCurlyBrace, TokenType.Colon }); if (token.Type == TokenType.Equal) { context.Tokenizer.SkipUntil(TokenType.SemiColon, out desc.DefaultValue, false); } + // Handle ex: API_FIELD() Type FieldName {DefaultValue}; + else if (token.Type == TokenType.LeftCurlyBrace) + { + context.Tokenizer.SkipUntil(TokenType.SemiColon, out desc.DefaultValue, false); + desc.DefaultValue = '{' + desc.DefaultValue; + } else if (token.Type == TokenType.LeftBracket) { // Read the fixed array length