Add support for using pointers in scripting API events
This commit is contained in:
@@ -225,8 +225,7 @@ namespace Flax.Build.Bindings
|
||||
|
||||
if (apiType.IsScriptingObject)
|
||||
return typeInfo.Type.Replace("::", ".");
|
||||
|
||||
if (typeInfo.IsPtr && (apiType is LangType || apiType.IsPod))
|
||||
if (typeInfo.IsPtr && apiType.IsPod)
|
||||
return typeInfo.Type.Replace("::", ".") + '*';
|
||||
}
|
||||
|
||||
@@ -581,6 +580,46 @@ namespace Flax.Build.Bindings
|
||||
|
||||
contents.AppendLine();
|
||||
|
||||
var useCustomDelegateSignature = false;
|
||||
for (var i = 0; i < paramsCount; i++)
|
||||
{
|
||||
var result = GenerateCSharpNativeToManaged(buildData, eventInfo.Type.GenericArgs[i], classInfo);
|
||||
if (result[result.Length - 1] == '*')
|
||||
useCustomDelegateSignature = true;
|
||||
CppParamsWrappersCache[i] = result;
|
||||
}
|
||||
|
||||
string eventSignature;
|
||||
if (useCustomDelegateSignature)
|
||||
{
|
||||
contents.Append(indent).Append($"/// <summary>The delegate for event {eventInfo.Name}.</summary>").AppendLine();
|
||||
contents.Append(indent).Append("public delegate void ").Append(eventInfo.Name).Append("Delegate(");
|
||||
for (var i = 0; i < paramsCount; i++)
|
||||
{
|
||||
if (i != 0)
|
||||
contents.Append(", ");
|
||||
contents.Append(CppParamsWrappersCache[i]).Append(" arg").Append(i);
|
||||
}
|
||||
contents.Append(");").AppendLine().AppendLine();
|
||||
eventSignature = "event " + eventInfo.Name + "Delegate";
|
||||
}
|
||||
else
|
||||
{
|
||||
eventSignature = "event Action";
|
||||
if (paramsCount != 0)
|
||||
{
|
||||
eventSignature += '<';
|
||||
for (var i = 0; i < paramsCount; i++)
|
||||
{
|
||||
if (i != 0)
|
||||
eventSignature += ", ";
|
||||
CppParamsWrappersCache[i] = GenerateCSharpNativeToManaged(buildData, eventInfo.Type.GenericArgs[i], classInfo);
|
||||
eventSignature += CppParamsWrappersCache[i];
|
||||
}
|
||||
eventSignature += '>';
|
||||
}
|
||||
}
|
||||
|
||||
foreach (var comment in eventInfo.Comment)
|
||||
{
|
||||
if (comment.Contains("/// <returns>"))
|
||||
@@ -598,19 +637,6 @@ namespace Flax.Build.Bindings
|
||||
contents.Append("private ");
|
||||
if (eventInfo.IsStatic)
|
||||
contents.Append("static ");
|
||||
string eventSignature = "event Action";
|
||||
if (paramsCount != 0)
|
||||
{
|
||||
eventSignature += '<';
|
||||
for (var i = 0; i < paramsCount; i++)
|
||||
{
|
||||
if (i != 0)
|
||||
eventSignature += ", ";
|
||||
CppParamsWrappersCache[i] = GenerateCSharpNativeToManaged(buildData, eventInfo.Type.GenericArgs[i], classInfo);
|
||||
eventSignature += CppParamsWrappersCache[i];
|
||||
}
|
||||
eventSignature += '>';
|
||||
}
|
||||
contents.Append(eventSignature);
|
||||
contents.Append(' ').AppendLine(eventInfo.Name);
|
||||
contents.Append(indent).Append('{').AppendLine();
|
||||
|
||||
@@ -75,24 +75,38 @@ namespace Flax.Build.Bindings
|
||||
|
||||
private static string GenerateCppWrapperNativeToManagedParam(BuildData buildData, StringBuilder contents, TypeInfo paramType, string paramName, ApiTypeInfo caller)
|
||||
{
|
||||
var nativeToManaged = GenerateCppWrapperNativeToManaged(buildData, paramType, caller, out _, null);
|
||||
var nativeToManaged = GenerateCppWrapperNativeToManaged(buildData, paramType, caller, out var managedTypeAsNative, null);
|
||||
string result;
|
||||
if (!string.IsNullOrEmpty(nativeToManaged))
|
||||
nativeToManaged = string.Format(nativeToManaged, paramName);
|
||||
else
|
||||
nativeToManaged = paramName;
|
||||
if ((!paramType.IsPtr && paramType.Type != "StringView" && paramType.Type != "StringAnsiView") || paramType.IsPod(buildData, caller))
|
||||
{
|
||||
if (nativeToManaged == paramName)
|
||||
result = string.Format(nativeToManaged, paramName);
|
||||
if (managedTypeAsNative[managedTypeAsNative.Length - 1] == '*')
|
||||
{
|
||||
nativeToManaged = '&' + nativeToManaged;
|
||||
// Pass pointer value
|
||||
}
|
||||
else
|
||||
{
|
||||
contents.Append($" auto __param{paramName} = {nativeToManaged};").AppendLine();
|
||||
nativeToManaged = $"&__param{paramName}";
|
||||
// Pass as pointer to local variable converted for managed runtime
|
||||
if (paramType.IsPtr)
|
||||
result = string.Format(nativeToManaged, '*' + paramName);
|
||||
contents.Append($" auto __param_{paramName} = {result};").AppendLine();
|
||||
result = $"&__param_{paramName}";
|
||||
}
|
||||
}
|
||||
return $"(void*){nativeToManaged}";
|
||||
else
|
||||
{
|
||||
result = paramName;
|
||||
if (paramType.IsPtr || managedTypeAsNative[managedTypeAsNative.Length - 1] == '*')
|
||||
{
|
||||
// Pass pointer value
|
||||
}
|
||||
else
|
||||
{
|
||||
// Pass as pointer to value
|
||||
result = '&' + result;
|
||||
}
|
||||
}
|
||||
return $"(void*){result}";
|
||||
}
|
||||
|
||||
public static string GenerateCppWrapperNativeToVariant(BuildData buildData, TypeInfo typeInfo, ApiTypeInfo caller, string value)
|
||||
|
||||
@@ -44,7 +44,7 @@ namespace Flax.Build.Bindings
|
||||
return true;
|
||||
|
||||
// Hardcoded cases
|
||||
if (Type == "String" || Type == "Array")
|
||||
if (Type == "String" || Type == "Array" || Type == "StringView" || Type == "StringAnsi" || Type == "StringAnsiView")
|
||||
return false;
|
||||
|
||||
// Fallback to default
|
||||
|
||||
Reference in New Issue
Block a user