Post-merge tweaks for #1312
This commit is contained in:
@@ -196,7 +196,7 @@ public:
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
struct FLAXENGINE_API ScriptingObject
|
struct FLAXENGINE_API ScriptingObject
|
||||||
{
|
{
|
||||||
static void SetInternalValues(MObject* object, void* unmanagedPtr, const Guid* id);
|
static void SetInternalValues(MClass* klass, MObject* object, void* unmanagedPtr, const Guid* id);
|
||||||
static MObject* CreateScriptingObject(MClass* klass, void* unmanagedPtr, const Guid* id);
|
static MObject* CreateScriptingObject(MClass* klass, void* unmanagedPtr, const Guid* id);
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1737,7 +1737,7 @@ void* GetStaticMethodPointer(const String& methodName)
|
|||||||
return fun;
|
return fun;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MCore::ScriptingObject::SetInternalValues(MObject* object, void* unmanagedPtr, const Guid* id)
|
void MCore::ScriptingObject::SetInternalValues(MClass* klass, MObject* object, void* unmanagedPtr, const Guid* id)
|
||||||
{
|
{
|
||||||
static void* ScriptingObjectSetInternalValuesPtr = GetStaticMethodPointer(TEXT("ScriptingObjectSetInternalValues"));
|
static void* ScriptingObjectSetInternalValuesPtr = GetStaticMethodPointer(TEXT("ScriptingObjectSetInternalValues"));
|
||||||
CallStaticMethod<void, MObject*, void*, const Guid*>(ScriptingObjectSetInternalValuesPtr, object, unmanagedPtr, id);
|
CallStaticMethod<void, MObject*, void*, const Guid*>(ScriptingObjectSetInternalValuesPtr, object, unmanagedPtr, id);
|
||||||
|
|||||||
@@ -2127,13 +2127,42 @@ const Array<MObject*>& MProperty::GetAttributes() const
|
|||||||
return _attributes;
|
return _attributes;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MCore::ScriptingObject::SetInternalValues(MObject* object, void* unmanagedPtr, const Guid* id)
|
void MCore::ScriptingObject::SetInternalValues(MClass* klass, MObject* object, void* unmanagedPtr, const Guid* id)
|
||||||
{
|
{
|
||||||
|
// Set handle to unmanaged object
|
||||||
|
const MField* monoUnmanagedPtrField = klass->GetField("__unmanagedPtr");
|
||||||
|
if (monoUnmanagedPtrField)
|
||||||
|
{
|
||||||
|
const void* param = unmanagedPtr;
|
||||||
|
monoUnmanagedPtrField->SetValue(managedInstance, ¶m);
|
||||||
|
}
|
||||||
|
if (id != nullptr)
|
||||||
|
{
|
||||||
|
// Set object id
|
||||||
|
const MField* monoIdField = klass->GetField("__internalId");
|
||||||
|
if (monoIdField)
|
||||||
|
{
|
||||||
|
monoIdField->SetValue(managedInstance, (void*)id);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MObject* MCore::ScriptingObject::CreateScriptingObject(MClass* klass, void* unmanagedPtr, const Guid* id)
|
MObject* MCore::ScriptingObject::CreateScriptingObject(MClass* klass, void* unmanagedPtr, const Guid* id)
|
||||||
{
|
{
|
||||||
return nullptr;
|
// Ensure to have managed domain attached (this can be called from custom native thread, eg. content loader)
|
||||||
|
MCore::Thread::Attach();
|
||||||
|
|
||||||
|
// Allocate managed instance
|
||||||
|
MObject* managedInstance = MCore::Object::New(klass);
|
||||||
|
if (managedInstance)
|
||||||
|
{
|
||||||
|
// Set unmanaged object handle and id
|
||||||
|
MCore::ScriptingObject::SetInternalValues(klass, managedInstance, unmanagedPtr, _id);
|
||||||
|
|
||||||
|
// Initialize managed instance (calls constructor)
|
||||||
|
MCore::Object::Init(managedInstance);
|
||||||
|
}
|
||||||
|
return managedInstance;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -565,7 +565,7 @@ const Array<MObject*>& MProperty::GetAttributes() const
|
|||||||
return _attributes;
|
return _attributes;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MCore::ScriptingObject::SetInternalValues(MObject* object, void* unmanagedPtr, const Guid* id)
|
void MCore::ScriptingObject::SetInternalValues(MClass* klass, MObject* object, void* unmanagedPtr, const Guid* id)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -181,7 +181,6 @@ ScriptingObject* ScriptingObject::ToNative(MObject* obj)
|
|||||||
if (obj)
|
if (obj)
|
||||||
{
|
{
|
||||||
#if USE_MONO
|
#if USE_MONO
|
||||||
// TODO: cache the field offset from object and read directly from object pointer
|
|
||||||
const auto ptrField = MCore::Object::GetClass(obj)->GetField(ScriptingObject_unmanagedPtr);
|
const auto ptrField = MCore::Object::GetClass(obj)->GetField(ScriptingObject_unmanagedPtr);
|
||||||
CHECK_RETURN(ptrField, nullptr);
|
CHECK_RETURN(ptrField, nullptr);
|
||||||
ptrField->GetValue(obj, &ptr);
|
ptrField->GetValue(obj, &ptr);
|
||||||
@@ -279,7 +278,7 @@ bool ScriptingObject::CreateManaged()
|
|||||||
if (const auto monoClass = GetClass())
|
if (const auto monoClass = GetClass())
|
||||||
{
|
{
|
||||||
// Reset managed to unmanaged pointer
|
// Reset managed to unmanaged pointer
|
||||||
SetInternalValues(monoClass, managedInstance, nullptr, nullptr);
|
MCore::ScriptingObject::SetInternalValues(monoClass, managedInstance, nullptr, nullptr);
|
||||||
}
|
}
|
||||||
MCore::GCHandle::Free(handle);
|
MCore::GCHandle::Free(handle);
|
||||||
return true;
|
return true;
|
||||||
@@ -295,32 +294,6 @@ bool ScriptingObject::CreateManaged()
|
|||||||
|
|
||||||
#if USE_CSHARP
|
#if USE_CSHARP
|
||||||
|
|
||||||
void ScriptingObject::SetInternalValues(MClass* monoClass, MObject* managedInstance, void* unmanagedPtr, const Guid* id)
|
|
||||||
{
|
|
||||||
#if USE_MONO
|
|
||||||
// Set handle to unmanaged object
|
|
||||||
const MField* monoUnmanagedPtrField = monoClass->GetField(ScriptingObject_unmanagedPtr);
|
|
||||||
if (monoUnmanagedPtrField)
|
|
||||||
{
|
|
||||||
const void* param = unmanagedPtr;
|
|
||||||
monoUnmanagedPtrField->SetValue(managedInstance, ¶m);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (id != nullptr)
|
|
||||||
{
|
|
||||||
// Set object id
|
|
||||||
const MField* monoIdField = monoClass->GetField(ScriptingObject_id);
|
|
||||||
if (monoIdField)
|
|
||||||
{
|
|
||||||
monoIdField->SetValue(managedInstance, (void*)id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
MCore::ScriptingObject::SetInternalValues(managedInstance, unmanagedPtr, id);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
MObject* ScriptingObject::CreateManagedInternal()
|
MObject* ScriptingObject::CreateManagedInternal()
|
||||||
{
|
{
|
||||||
// Get class
|
// Get class
|
||||||
@@ -331,28 +304,11 @@ MObject* ScriptingObject::CreateManagedInternal()
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ensure to have managed domain attached (this can be called from custom native thread, eg. content loader)
|
|
||||||
MCore::Thread::Attach();
|
|
||||||
|
|
||||||
#if USE_MONO
|
|
||||||
// Allocate managed instance
|
|
||||||
MObject* managedInstance = MCore::Object::New(monoClass);
|
|
||||||
if (managedInstance == nullptr)
|
|
||||||
{
|
|
||||||
LOG(Warning, "Failed to create new instance of the object of type {0}", String(monoClass->GetFullName()));
|
|
||||||
}
|
|
||||||
|
|
||||||
SetInternalValues(monoClass, managedInstance, this, &_id);
|
|
||||||
|
|
||||||
// Initialize managed instance (calls constructor)
|
|
||||||
MCore::Object::Init(managedInstance);
|
|
||||||
#else
|
|
||||||
MObject* managedInstance = MCore::ScriptingObject::CreateScriptingObject(monoClass, this, &_id);
|
MObject* managedInstance = MCore::ScriptingObject::CreateScriptingObject(monoClass, this, &_id);
|
||||||
if (managedInstance == nullptr)
|
if (managedInstance == nullptr)
|
||||||
{
|
{
|
||||||
LOG(Warning, "Failed to create new instance of the object of type {0}", String(monoClass->GetFullName()));
|
LOG(Warning, "Failed to create new instance of the object of type {0}", String(monoClass->GetFullName()));
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
return managedInstance;
|
return managedInstance;
|
||||||
}
|
}
|
||||||
@@ -370,7 +326,7 @@ void ScriptingObject::DestroyManaged()
|
|||||||
{
|
{
|
||||||
if (const auto monoClass = GetClass())
|
if (const auto monoClass = GetClass())
|
||||||
{
|
{
|
||||||
SetInternalValues(monoClass, managedInstance, nullptr, nullptr);
|
MCore::ScriptingObject::SetInternalValues(monoClass, managedInstance, nullptr, nullptr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -494,7 +450,7 @@ bool ManagedScriptingObject::CreateManaged()
|
|||||||
if (const auto monoClass = GetClass())
|
if (const auto monoClass = GetClass())
|
||||||
{
|
{
|
||||||
// Reset managed to unmanaged pointer
|
// Reset managed to unmanaged pointer
|
||||||
SetInternalValues(monoClass, managedInstance, nullptr, nullptr);
|
MCore::ScriptingObject::SetInternalValues(monoClass, managedInstance, nullptr, nullptr);
|
||||||
}
|
}
|
||||||
MCore::GCHandle::Free(handle);
|
MCore::GCHandle::Free(handle);
|
||||||
return true;
|
return true;
|
||||||
@@ -654,9 +610,8 @@ DEFINE_INTERNAL_CALL(void) ObjectInternal_ManagedInstanceCreated(MObject* manage
|
|||||||
}
|
}
|
||||||
|
|
||||||
MClass* monoClass = obj->GetClass();
|
MClass* monoClass = obj->GetClass();
|
||||||
|
|
||||||
const Guid id = obj->GetID();
|
const Guid id = obj->GetID();
|
||||||
ScriptingObject::SetInternalValues(monoClass, managedInstance, obj, &id);
|
MCore::ScriptingObject::SetInternalValues(monoClass, managedInstance, obj, &id);
|
||||||
|
|
||||||
// Register object
|
// Register object
|
||||||
if (!obj->IsRegistered())
|
if (!obj->IsRegistered())
|
||||||
|
|||||||
@@ -206,13 +206,6 @@ public:
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
void UnregisterObject();
|
void UnregisterObject();
|
||||||
|
|
||||||
#if USE_CSHARP
|
|
||||||
/// <summary>
|
|
||||||
/// Sets the internal values in managed object.
|
|
||||||
/// </summary>
|
|
||||||
static void SetInternalValues(MClass* monoClass, MObject* managedInstance, void* unmanagedPtr, const Guid* id);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
#if USE_CSHARP
|
#if USE_CSHARP
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
Reference in New Issue
Block a user