From c12ea8428e0fefd6940b5a6d7e7eff356aa32782 Mon Sep 17 00:00:00 2001 From: Wojciech Figat Date: Thu, 13 Oct 2022 13:35:59 +0200 Subject: [PATCH] Add `FlaxEngine.Object.FromUnmanagedPtr` for native object raw pointer conversion to managed object --- Source/Engine/Scripting/Object.cs | 8 ++++++++ Source/Engine/Scripting/ScriptingObject.cpp | 9 +++++++++ 2 files changed, 17 insertions(+) diff --git a/Source/Engine/Scripting/Object.cs b/Source/Engine/Scripting/Object.cs index b86ed00d8..f35f3fffd 100644 --- a/Source/Engine/Scripting/Object.cs +++ b/Source/Engine/Scripting/Object.cs @@ -221,6 +221,14 @@ namespace FlaxEngine return obj is Object o ? Internal_GetUnmanagedInterface(o.__unmanagedPtr, type) : IntPtr.Zero; } + /// + /// Gets the managed object from the native object pointer. + /// + /// The pointer to the unmanaged (native) object. + /// The object. + [MethodImpl(MethodImplOptions.InternalCall)] + public static extern Object FromUnmanagedPtr(IntPtr ptr); + /// public override int GetHashCode() { diff --git a/Source/Engine/Scripting/ScriptingObject.cpp b/Source/Engine/Scripting/ScriptingObject.cpp index 8075aa67c..ee3dfc438 100644 --- a/Source/Engine/Scripting/ScriptingObject.cpp +++ b/Source/Engine/Scripting/ScriptingObject.cpp @@ -727,6 +727,14 @@ public: return nullptr; } + static MonoObject* FromUnmanagedPtr(ScriptingObject* obj) + { + MonoObject* result = nullptr; + if (obj) + result = obj->GetOrCreateManagedInstance(); + return result; + } + static void InitRuntime() { ADD_INTERNAL_CALL("FlaxEngine.Object::Internal_Create1", &Create1); @@ -739,6 +747,7 @@ public: ADD_INTERNAL_CALL("FlaxEngine.Object::Internal_TryFindObject", &TryFindObject); ADD_INTERNAL_CALL("FlaxEngine.Object::Internal_ChangeID", &ChangeID); ADD_INTERNAL_CALL("FlaxEngine.Object::Internal_GetUnmanagedInterface", &GetUnmanagedInterface); + ADD_INTERNAL_CALL("FlaxEngine.Object::FromUnmanagedPtr", &FromUnmanagedPtr); } #else