From ff9b1165221c07ae47a7b3ca94750652a47f95e0 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Tue, 4 Jan 2022 23:58:39 +0100 Subject: [PATCH] Add `ScriptingObject::NewObject` utility for scripting objects spawning in C++ --- Source/Engine/Scripting/ScriptingObject.cpp | 11 +++++++++++ Source/Engine/Scripting/ScriptingObject.h | 7 +++++++ 2 files changed, 18 insertions(+) diff --git a/Source/Engine/Scripting/ScriptingObject.cpp b/Source/Engine/Scripting/ScriptingObject.cpp index ddfb0fca5..b8775f941 100644 --- a/Source/Engine/Scripting/ScriptingObject.cpp +++ b/Source/Engine/Scripting/ScriptingObject.cpp @@ -82,6 +82,17 @@ MClass* ScriptingObject::GetClass() const return _type ? _type.GetType().ManagedClass : nullptr; } +ScriptingObject* ScriptingObject::NewObject(const ScriptingTypeHandle& typeHandle) +{ + if (!typeHandle) + return nullptr; + auto& type = typeHandle.GetType(); + if (type.Type != ScriptingTypes::Script) + return nullptr; + const ScriptingObjectSpawnParams params(Guid::New(), typeHandle); + return type.Script.Spawn(params); +} + ScriptingObject* ScriptingObject::FromInterface(void* interfaceObj, const ScriptingTypeHandle& interfaceType) { if (!interfaceObj || !interfaceType) diff --git a/Source/Engine/Scripting/ScriptingObject.h b/Source/Engine/Scripting/ScriptingObject.h index b29078d45..a0114b1a4 100644 --- a/Source/Engine/Scripting/ScriptingObject.h +++ b/Source/Engine/Scripting/ScriptingObject.h @@ -108,6 +108,13 @@ public: public: + static ScriptingObject* NewObject(const ScriptingTypeHandle& typeHandle); + template + static T* NewObject() + { + return (T*)NewObject(T::TypeInitializer); + } + // Tries to cast native interface object to scripting object instance. Returns null if fails. static ScriptingObject* FromInterface(void* interfaceObj, const ScriptingTypeHandle& interfaceType); static void* ToInterface(ScriptingObject* obj, const ScriptingTypeHandle& interfaceType);