From 551c58db4f93572b3111b8bea8309036b95b1e1a Mon Sep 17 00:00:00 2001 From: Ari Vuollet Date: Tue, 13 Dec 2022 20:24:39 +0200 Subject: [PATCH] Fix incorrect array marshalling in few Editor methods --- Source/Editor/Editor.cs | 10 +++++----- Source/Editor/Managed/ManagedEditor.Internal.cpp | 14 ++++++++++---- .../Editor/Windows/Assets/CollisionDataWindow.cs | 2 +- Source/Editor/Windows/Assets/VisualScriptWindow.cs | 4 ++-- 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/Source/Editor/Editor.cs b/Source/Editor/Editor.cs index 9eeb4bb35..54ce17158 100644 --- a/Source/Editor/Editor.cs +++ b/Source/Editor/Editor.cs @@ -1554,7 +1554,7 @@ namespace FlaxEditor internal static partial bool Internal_CookMeshCollision(string path, CollisionDataType type, IntPtr model, int modelLodIndex, uint materialSlotsMask, ConvexMeshGenerationFlags convexFlags, int convexVertexLimit); [LibraryImport("FlaxEngine", EntryPoint = "FlaxEditor.Editor::Internal_GetCollisionWires", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(FlaxEngine.StringMarshaller))] - internal static partial void Internal_GetCollisionWires(IntPtr collisionData, [MarshalUsing(typeof(FlaxEngine.ArrayMarshaller<,>), ConstantElementCount = 1)] out Float3[] triangles, [MarshalUsing(typeof(FlaxEngine.ArrayMarshaller<,>), ConstantElementCount = 1)] out int[] indices); + internal static partial void Internal_GetCollisionWires(IntPtr collisionData, [MarshalUsing(typeof(FlaxEngine.ArrayMarshaller<,>), CountElementName = "trianglesCount")] out Float3[] triangles, [MarshalUsing(typeof(FlaxEngine.ArrayMarshaller<,>), CountElementName = "indicesCount")] out int[] indices, out int trianglesCount, out int indicesCount); [LibraryImport("FlaxEngine", EntryPoint = "FlaxEditor.Editor::Internal_GetEditorBoxWithChildren", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(FlaxEngine.StringMarshaller))] internal static partial void Internal_GetEditorBoxWithChildren(IntPtr obj, out BoundingBox resultAsRef); @@ -1602,12 +1602,12 @@ namespace FlaxEditor internal static partial void Internal_RunVisualScriptBreakpointLoopTick(float deltaTime); [LibraryImport("FlaxEngine", EntryPoint = "FlaxEditor.Editor::Internal_GetVisualScriptLocals", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(FlaxEngine.StringMarshaller))] - [return: MarshalUsing(typeof(FlaxEngine.ArrayMarshaller<,>), ConstantElementCount = 1)] - internal static partial VisualScriptLocal[] Internal_GetVisualScriptLocals(); + [return: MarshalUsing(typeof(FlaxEngine.ArrayMarshaller<,>), CountElementName = "localsCount")] + internal static partial VisualScriptLocal[] Internal_GetVisualScriptLocals(out int localsCount); [LibraryImport("FlaxEngine", EntryPoint = "FlaxEditor.Editor::Internal_GetVisualScriptStackFrames", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(FlaxEngine.StringMarshaller))] - [return: MarshalUsing(typeof(FlaxEngine.ArrayMarshaller<,>), ConstantElementCount = 1)] - internal static partial VisualScriptStackFrame[] Internal_GetVisualScriptStackFrames(); + [return: MarshalUsing(typeof(FlaxEngine.ArrayMarshaller<,>), CountElementName = "stackFrameCount")] + internal static partial VisualScriptStackFrame[] Internal_GetVisualScriptStackFrames(out int stackFrameCount); [LibraryImport("FlaxEngine", EntryPoint = "FlaxEditor.Editor::Internal_GetVisualScriptPreviousScopeFrame", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(FlaxEngine.StringMarshaller))] internal static partial VisualScriptStackFrame Internal_GetVisualScriptPreviousScopeFrame(); diff --git a/Source/Editor/Managed/ManagedEditor.Internal.cpp b/Source/Editor/Managed/ManagedEditor.Internal.cpp index 11844b23c..144698b3f 100644 --- a/Source/Editor/Managed/ManagedEditor.Internal.cpp +++ b/Source/Editor/Managed/ManagedEditor.Internal.cpp @@ -419,7 +419,7 @@ public: return 0; int32 count = 0; - const int32 maxCount = outArraySize;//(int32)mono_array_length(*outMessages); + const int32 maxCount = outArraySize; byte* ptr = CachedLogData.Get(); byte* end = ptr + CachedLogData.Count(); @@ -798,7 +798,7 @@ public: #endif } - static void GetCollisionWires(CollisionData* collisionData, MonoArray** triangles, MonoArray** indices) + static void GetCollisionWires(CollisionData* collisionData, MonoArray** triangles, MonoArray** indices, int* trianglesCount, int* indicesCount) { SCRIPTING_EXPORT("FlaxEditor.Editor::Internal_GetCollisionWires") if (!collisionData || collisionData->WaitForLoaded() || collisionData->GetOptions().Type == CollisionDataType::None) @@ -822,6 +822,8 @@ public: mono_array_set(*indices, int32, iI++, i + 1); mono_array_set(*indices, int32, iI++, i); } + *trianglesCount = debugLines.Count(); + *indicesCount = linesCount * 3; } static void GetEditorBoxWithChildren(Actor* obj, BoundingBox* result) @@ -960,10 +962,11 @@ public: int32 BoxId; }; - static MonoArray* GetVisualScriptLocals() + static MonoArray* GetVisualScriptLocals(int* localsCount) { SCRIPTING_EXPORT("FlaxEditor.Editor::Internal_GetVisualScriptLocals") MonoArray* result = nullptr; + *localsCount = 0; const auto stack = VisualScripting::GetThreadStackTop(); if (stack && stack->Scope) { @@ -998,6 +1001,7 @@ public: local.ValueTypeName = MUtils::ToString(v.Value.Type.GetTypeName()); mono_array_set(result, VisualScriptLocalManaged, stack->Scope->Parameters.Length() + i, local); } + *localsCount = count; } return result; } @@ -1009,10 +1013,11 @@ public: int32 BoxId; }; - static MonoArray* GetVisualScriptStackFrames() + static MonoArray* GetVisualScriptStackFrames(int* stackFramesCount) { SCRIPTING_EXPORT("FlaxEditor.Editor::Internal_GetVisualScriptStackFrames") MonoArray* result = nullptr; + *stackFramesCount = 0; const auto stack = VisualScripting::GetThreadStackTop(); if (stack) { @@ -1038,6 +1043,7 @@ public: s = s->PreviousFrame; count++; } + *stackFramesCount = count; } return result; } diff --git a/Source/Editor/Windows/Assets/CollisionDataWindow.cs b/Source/Editor/Windows/Assets/CollisionDataWindow.cs index 249aa916e..bd6d1ab3a 100644 --- a/Source/Editor/Windows/Assets/CollisionDataWindow.cs +++ b/Source/Editor/Windows/Assets/CollisionDataWindow.cs @@ -236,7 +236,7 @@ namespace FlaxEditor.Windows.Assets _collisionWiresModel = FlaxEngine.Content.CreateVirtualAsset(); _collisionWiresModel.SetupLODs(new[] { 1 }); } - Editor.Internal_GetCollisionWires(FlaxEngine.Object.GetUnmanagedPtr(Asset), out var triangles, out var indices); + Editor.Internal_GetCollisionWires(FlaxEngine.Object.GetUnmanagedPtr(Asset), out var triangles, out var indices, out var _, out var _); if (triangles != null && indices != null) _collisionWiresModel.LODs[0].Meshes[0].UpdateMesh(triangles, indices); else diff --git a/Source/Editor/Windows/Assets/VisualScriptWindow.cs b/Source/Editor/Windows/Assets/VisualScriptWindow.cs index 8c480fd04..de70ea1e2 100644 --- a/Source/Editor/Windows/Assets/VisualScriptWindow.cs +++ b/Source/Editor/Windows/Assets/VisualScriptWindow.cs @@ -818,7 +818,7 @@ namespace FlaxEditor.Windows.Assets var state = (BreakpointHangState)Editor.Instance.Simulation.BreakpointHangTag; if (state.Locals == null) { - state.Locals = Editor.Internal_GetVisualScriptLocals(); + state.Locals = Editor.Internal_GetVisualScriptLocals(out var _); Editor.Instance.Simulation.BreakpointHangTag = state; } return state; @@ -829,7 +829,7 @@ namespace FlaxEditor.Windows.Assets var state = (BreakpointHangState)Editor.Instance.Simulation.BreakpointHangTag; if (state.StackFrames == null) { - state.StackFrames = Editor.Internal_GetVisualScriptStackFrames(); + state.StackFrames = Editor.Internal_GetVisualScriptStackFrames(out var _); Editor.Instance.Simulation.BreakpointHangTag = state; } return state;