From 23303802ec18cc86169bb5ad18de0bb9b92d8670 Mon Sep 17 00:00:00 2001 From: Wojciech Figat Date: Mon, 6 Dec 2021 16:46:16 +0100 Subject: [PATCH] Add support for passing back value via reference to C# scripting event --- .../Viewport/MainEditorGizmoViewport.cs | 4 +-- .../Editor/Viewport/PrefabWindowViewport.cs | 4 +-- .../Editor/Viewport/Previews/AssetPreview.cs | 2 +- .../Windows/Assets/SceneAnimationWindow.cs | 2 +- Source/Editor/Windows/GameWindow.cs | 2 +- Source/Engine/Graphics/RenderView.cs | 2 -- .../Bindings/BindingsGenerator.CSharp.cs | 13 ++++---- .../Bindings/BindingsGenerator.Cpp.cs | 30 +++++++++++++++++++ 8 files changed, 44 insertions(+), 15 deletions(-) diff --git a/Source/Editor/Viewport/MainEditorGizmoViewport.cs b/Source/Editor/Viewport/MainEditorGizmoViewport.cs index 7c6ca7900..4bf399bd8 100644 --- a/Source/Editor/Viewport/MainEditorGizmoViewport.cs +++ b/Source/Editor/Viewport/MainEditorGizmoViewport.cs @@ -428,7 +428,7 @@ namespace FlaxEditor.Viewport } } - private void OnCollectDrawCalls(RenderContext renderContext) + private void OnCollectDrawCalls(ref RenderContext renderContext) { if (_previewStaticModel) { @@ -471,7 +471,7 @@ namespace FlaxEditor.Viewport } } - private void OnPostRender(GPUContext context, RenderContext renderContext) + private void OnPostRender(GPUContext context, ref RenderContext renderContext) { bool renderPostFx = true; switch (renderContext.View.Mode) diff --git a/Source/Editor/Viewport/PrefabWindowViewport.cs b/Source/Editor/Viewport/PrefabWindowViewport.cs index 9b2c9b189..b81e6c1ef 100644 --- a/Source/Editor/Viewport/PrefabWindowViewport.cs +++ b/Source/Editor/Viewport/PrefabWindowViewport.cs @@ -258,12 +258,12 @@ namespace FlaxEditor.Viewport } } - private void OnCollectDrawCalls(RenderContext renderContext) + private void OnCollectDrawCalls(ref RenderContext renderContext) { _debugDrawData.OnDraw(ref renderContext); } - private void OnPostRender(GPUContext context, RenderContext renderContext) + private void OnPostRender(GPUContext context, ref RenderContext renderContext) { if (renderContext.View.Mode != ViewMode.Default) { diff --git a/Source/Editor/Viewport/Previews/AssetPreview.cs b/Source/Editor/Viewport/Previews/AssetPreview.cs index 150990447..fed3d0979 100644 --- a/Source/Editor/Viewport/Previews/AssetPreview.cs +++ b/Source/Editor/Viewport/Previews/AssetPreview.cs @@ -196,7 +196,7 @@ namespace FlaxEditor.Viewport.Previews Task.AddCustomActor(PostFxVolume); } - private void OnPostRender(GPUContext context, RenderContext renderContext) + private void OnPostRender(GPUContext context, ref RenderContext renderContext) { if (renderContext.View.Mode != ViewMode.Default && _editorPrimitives && _editorPrimitives.CanRender) { diff --git a/Source/Editor/Windows/Assets/SceneAnimationWindow.cs b/Source/Editor/Windows/Assets/SceneAnimationWindow.cs index 337a36227..808d4c5ed 100644 --- a/Source/Editor/Windows/Assets/SceneAnimationWindow.cs +++ b/Source/Editor/Windows/Assets/SceneAnimationWindow.cs @@ -520,7 +520,7 @@ namespace FlaxEditor.Windows.Assets } } - private void OnPostRender(GPUContext context, RenderContext renderContext) + private void OnPostRender(GPUContext context, ref RenderContext renderContext) { var task = _gameWindow.Viewport.Task; var taskFrame = task.FrameCount; diff --git a/Source/Editor/Windows/GameWindow.cs b/Source/Editor/Windows/GameWindow.cs index 91296d845..0b3ee598d 100644 --- a/Source/Editor/Windows/GameWindow.cs +++ b/Source/Editor/Windows/GameWindow.cs @@ -261,7 +261,7 @@ namespace FlaxEditor.Windows InputActions.Add(options => options.StepFrame, Editor.Simulation.RequestPlayOneFrame); } - private void OnPostRender(GPUContext context, RenderContext renderContext) + private void OnPostRender(GPUContext context, ref RenderContext renderContext) { // Debug Draw shapes if (_showDebugDraw) diff --git a/Source/Engine/Graphics/RenderView.cs b/Source/Engine/Graphics/RenderView.cs index d82ac7517..d2fc1a05a 100644 --- a/Source/Engine/Graphics/RenderView.cs +++ b/Source/Engine/Graphics/RenderView.cs @@ -37,10 +37,8 @@ namespace FlaxEngine /// The projection. public void SetUp(ref Matrix view, ref Matrix projection) { - Position = view.TranslationVector; Projection = projection; NonJitteredProjection = projection; - TemporalAAJitter = Vector4.Zero; View = view; UpdateCachedData(); diff --git a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs index 6cca1d84a..07140696d 100644 --- a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs +++ b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs @@ -185,6 +185,7 @@ namespace Flax.Build.Bindings sb.Append('}'); return sb.ToString(); } + // Special case for value constructors if (value.Contains('(') && value.Contains(')')) return "new " + value; @@ -680,7 +681,7 @@ namespace Flax.Build.Bindings { var paramType = eventInfo.Type.GenericArgs[i]; var result = GenerateCSharpNativeToManaged(buildData, paramType, classInfo); - if ((paramType.IsRef && !paramType.IsConst && paramType.IsPod(buildData, classInfo)) || result[result.Length - 1] == '*') + if ((paramType.IsRef && !paramType.IsConst) || result[result.Length - 1] == '*') useCustomDelegateSignature = true; CppParamsWrappersCache[i] = result; } @@ -695,7 +696,7 @@ namespace Flax.Build.Bindings var paramType = eventInfo.Type.GenericArgs[i]; if (i != 0) contents.Append(", "); - if (paramType.IsRef && !paramType.IsConst && paramType.IsPod(buildData, classInfo)) + if (paramType.IsRef && !paramType.IsConst) contents.Append("ref "); contents.Append(CppParamsWrappersCache[i]).Append(" arg").Append(i); } @@ -774,9 +775,9 @@ namespace Flax.Build.Bindings var paramType = eventInfo.Type.GenericArgs[i]; if (i != 0) contents.Append(", "); + if (paramType.IsRef && !paramType.IsConst) + contents.Append("ref "); contents.Append(CppParamsWrappersCache[i]); - if (paramType.IsRef && !paramType.IsConst && paramType.IsPod(buildData, classInfo)) - contents.Append("*"); contents.Append(" arg").Append(i); } contents.Append(')').AppendLine(); @@ -788,8 +789,8 @@ namespace Flax.Build.Bindings var paramType = eventInfo.Type.GenericArgs[i]; if (i != 0) contents.Append(", "); - if (paramType.IsRef && !paramType.IsConst && paramType.IsPod(buildData, classInfo)) - contents.Append("ref *"); + if (paramType.IsRef && !paramType.IsConst) + contents.Append("ref "); contents.Append("arg").Append(i); } contents.Append(");").AppendLine(); diff --git a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs index 89642692e..db3663ba5 100644 --- a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs +++ b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs @@ -695,6 +695,14 @@ namespace Flax.Build.Bindings return "MConverter<" + apiType.Name + ">::Unbox({0})"; } + // Scripting Object + if (functionInfo == null && apiType.IsScriptingObject) + { + // Inside bindings function the managed runtime passes raw unamanged pointer + type = "MonoObject*"; + return "(" + typeInfo.Type + "*)ScriptingObject::ToNative({0})"; + } + // Nested type (namespace prefix is required) if (!(apiType.Parent is FileInfo)) { @@ -1494,6 +1502,28 @@ namespace Flax.Build.Bindings contents.Append(" mono_runtime_invoke(mmethod->GetNative(), instance, params, &exception);").AppendLine(); contents.Append(" if (exception)").AppendLine(); contents.Append(" DebugLog::LogException(exception);").AppendLine(); + for (var i = 0; i < paramsCount; i++) + { + var paramType = eventInfo.Type.GenericArgs[i]; + if (paramType.IsRef && !paramType.IsConst) + { + // Convert value back from managed to native (could be modified there) + paramType.IsRef = false; + var managedToNative = GenerateCppWrapperManagedToNative(buildData, paramType, classInfo, out var managedType, null, out var _); + var passAsParamPtr = managedType.EndsWith("*"); + var paramValue = $"({managedType}{(passAsParamPtr ? "" : "*")})params[{i}]"; + if (!string.IsNullOrEmpty(managedToNative)) + { + if (!passAsParamPtr) + paramValue = '*' + paramValue; + paramValue = string.Format(managedToNative, paramValue); + } + else if (!passAsParamPtr) + paramValue = '*' + paramValue; + contents.Append($" arg{i} = {paramValue};").AppendLine(); + paramType.IsRef = true; + } + } contents.Append(" }").AppendLine().AppendLine(); // C# event wrapper binding method (binds/unbinds C# wrapper to C++ delegate)