diff --git a/Source/Engine/Content/Assets/VisualScript.cpp b/Source/Engine/Content/Assets/VisualScript.cpp index fdad36c2e..8b5a0c62e 100644 --- a/Source/Engine/Content/Assets/VisualScript.cpp +++ b/Source/Engine/Content/Assets/VisualScript.cpp @@ -289,7 +289,7 @@ void VisualScriptExecutor::ProcessGroupPacking(Box* box, Node* node, Value& valu if (mclass) { // Fallback to C#-only types - auto instance = (MonoObject*)structureValue.AsUint; + auto instance = (MonoObject*)structureValue; CHECK(instance); if (structureValue.Type.Type != VariantType::ManagedObject || mono_object_get_class(instance) != mclass->GetNative()) { diff --git a/Source/Engine/Core/Types/Variant.cpp b/Source/Engine/Core/Types/Variant.cpp index ec1876158..4b3cbd658 100644 --- a/Source/Engine/Core/Types/Variant.cpp +++ b/Source/Engine/Core/Types/Variant.cpp @@ -22,6 +22,8 @@ #include "Engine/Core/Math/Transform.h" #include "Engine/Scripting/Scripting.h" #include "Engine/Scripting/ScriptingObject.h" +#include "Engine/Scripting/ManagedCLR/MClass.h" +#include "Engine/Scripting/ManagedCLR/MCore.h" #include "Engine/Scripting/ManagedCLR/MUtils.h" #include "Engine/Utilities/Crc.h" #include "Engine/Utilities/StringConverter.h" @@ -3107,6 +3109,30 @@ void Variant::AllocStructure() AsBlob.Data = Allocator::Allocate(AsBlob.Length); *((int16*)AsBlob.Data) = 0; } + else if (const auto mclass = Scripting::FindClass(typeName)) + { + // Fallback to C#-only types + MCore::AttachThread(); + auto instance = mclass->CreateInstance(); + if (instance) + { +#if 0 + void* data = mono_object_unbox(instance); + int32 instanceSize = mono_class_instance_size(mclass->GetNative()); + AsBlob.Length = instanceSize - (int32)((uintptr)data - (uintptr)instance); + AsBlob.Data = Allocator::Allocate(AsBlob.Length); + Platform::MemoryCopy(AsBlob.Data, data, AsBlob.Length); +#else + Type.Type = VariantType::ManagedObject; + AsUint = mono_gchandle_new(instance, true); +#endif + } + else + { + AsBlob.Data = nullptr; + AsBlob.Length = 0; + } + } else { if (typeName.Length() != 0) diff --git a/Source/Engine/Scripting/ManagedCLR/MUtils.cpp b/Source/Engine/Scripting/ManagedCLR/MUtils.cpp index 80360a056..8a0c181b4 100644 --- a/Source/Engine/Scripting/ManagedCLR/MUtils.cpp +++ b/Source/Engine/Scripting/ManagedCLR/MUtils.cpp @@ -237,7 +237,7 @@ VariantType MUtils::UnboxVariantType(MonoType* monoType) // TODO: support any structure unboxing // TODO: unbox other types as generic ManagedObject type - LOG(Error, "Invalid managed type to unbox {0}.{1}", String(mono_class_get_namespace(klass)), String(mono_class_get_name(klass))); + LOG(Error, "Invalid managed type to unbox {0}", String(GetClassFullname(klass))); return VariantType(); } @@ -342,6 +342,7 @@ Variant MUtils::UnboxVariant(MonoObject* value) type.Struct.Unbox(v.AsBlob.Data, value); return v; } + return Variant(value); } if (klass == mono_array_class_get(mono_get_byte_class(), 1)) {