diff --git a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs index 393cb9ea5..3f088ffdf 100644 --- a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs +++ b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs @@ -11,6 +11,7 @@ namespace Flax.Build.Bindings { partial class BindingsGenerator { + private static readonly bool[] CppParamsThatNeedLocalVariable = new bool[64]; private static readonly bool[] CppParamsThatNeedConvertion = new bool[64]; private static readonly string[] CppParamsThatNeedConvertionWrappers = new string[64]; private static readonly string[] CppParamsWrappersCache = new string[64]; @@ -391,8 +392,10 @@ namespace Flax.Build.Bindings } } - private static string GenerateCppWrapperManagedToNative(BuildData buildData, TypeInfo typeInfo, ApiTypeInfo caller, out string type, FunctionInfo functionInfo) + private static string GenerateCppWrapperManagedToNative(BuildData buildData, TypeInfo typeInfo, ApiTypeInfo caller, out string type, FunctionInfo functionInfo, out bool needLocalVariable) { + needLocalVariable = false; + // Register any API types usage var apiType = FindApiTypeInfo(buildData, typeInfo, caller); CppReferencesFiles.Add(apiType?.File); @@ -410,7 +413,7 @@ namespace Flax.Build.Bindings { typeInfo.IsArray = false; var arrayType = new TypeInfo { Type = "Array", GenericArgs = new List { typeInfo, }, }; - var result = GenerateCppWrapperManagedToNative(buildData, arrayType, caller, out type, functionInfo); + var result = GenerateCppWrapperManagedToNative(buildData, arrayType, caller, out type, functionInfo, out needLocalVariable); typeInfo.IsArray = true; return result + ".Get()"; } @@ -515,6 +518,7 @@ namespace Flax.Build.Bindings // BytesContainer if (typeInfo.Type == "BytesContainer" && typeInfo.GenericArgs == null) { + needLocalVariable = true; type = "MonoArray*"; return "MUtils::LinkArray({0})"; } @@ -616,7 +620,7 @@ namespace Flax.Build.Bindings separator = true; CppParamsThatNeedConvertion[i] = false; - CppParamsWrappersCache[i] = GenerateCppWrapperManagedToNative(buildData, parameterInfo.Type, caller, out var managedType, functionInfo); + CppParamsWrappersCache[i] = GenerateCppWrapperManagedToNative(buildData, parameterInfo.Type, caller, out var managedType, functionInfo, out CppParamsThatNeedLocalVariable[i]); contents.Append(managedType); if (parameterInfo.IsRef || parameterInfo.IsOut || UsePassByReference(buildData, parameterInfo.Type, caller)) contents.Append('*'); @@ -662,7 +666,7 @@ namespace Flax.Build.Bindings contents.Append(", "); separator = true; - GenerateCppWrapperManagedToNative(buildData, parameterInfo.Type, caller, out var managedType, functionInfo); + GenerateCppWrapperManagedToNative(buildData, parameterInfo.Type, caller, out var managedType, functionInfo, out _); contents.Append(managedType); if (parameterInfo.IsRef || parameterInfo.IsOut) contents.Append('*'); @@ -750,6 +754,15 @@ namespace Flax.Build.Bindings callParams += "Temp"; } } + // Special case for parameter that cannot be passed directly to the function from the wrapper method input parameter (eg. MonoArray* converted into BytesContainer uses as BytesContainer&) + else if (CppParamsThatNeedLocalVariable[i]) + { + contents.AppendFormat(" auto {0}Temp = {1};", parameterInfo.Name, param).AppendLine(); + if (parameterInfo.Type.IsPtr) + callParams += "&"; + callParams += parameterInfo.Name; + callParams += "Temp"; + } else { callParams += param; @@ -1787,7 +1800,7 @@ namespace Flax.Build.Bindings continue; CppNonPodTypesConvertingGeneration = true; - var wrapper = GenerateCppWrapperManagedToNative(buildData, fieldInfo.Type, structureInfo, out _, null); + var wrapper = GenerateCppWrapperManagedToNative(buildData, fieldInfo.Type, structureInfo, out _, null, out _); CppNonPodTypesConvertingGeneration = false; if (fieldInfo.Type.IsArray)