diff --git a/Source/Editor/Modules/SourceCodeEditing/CodeEditingModule.cs b/Source/Editor/Modules/SourceCodeEditing/CodeEditingModule.cs index 2989bbf1b..254006e5f 100644 --- a/Source/Editor/Modules/SourceCodeEditing/CodeEditingModule.cs +++ b/Source/Editor/Modules/SourceCodeEditing/CodeEditingModule.cs @@ -29,8 +29,8 @@ namespace FlaxEditor.Modules.SourceCodeEditing { if (scriptType.IsStatic || scriptType.IsGenericType || !scriptType.IsPublic || scriptType.HasAttribute(typeof(HideInEditorAttribute), true)) return false; - var objectType = new ScriptType(typeof(FlaxEngine.Object)); - return scriptType.IsEnum || objectType.IsAssignableFrom(scriptType); + var managedType = TypeUtils.GetType(scriptType); + return !TypeUtils.IsDelegate(managedType); } /// diff --git a/Source/Editor/Utilities/VariantUtils.cs b/Source/Editor/Utilities/VariantUtils.cs index c5b355bcb..de430829e 100644 --- a/Source/Editor/Utilities/VariantUtils.cs +++ b/Source/Editor/Utilities/VariantUtils.cs @@ -414,15 +414,6 @@ namespace FlaxEditor.Utilities var id = stream.ReadGuid(); return FlaxEngine.Object.Find(ref id, type ?? typeof(FlaxEngine.Object)); } - case VariantType.Structure: - { - if (type == null) - throw new Exception("Missing structure type of the Variant."); - if (!type.IsStructure()) - throw new Exception($"Invalid type {type.FullName} used as a structure."); - var data = stream.ReadBytes(stream.ReadInt32()); - return Utils.ByteArrayToStructure(data, type); - } case VariantType.Asset: { var id = stream.ReadGuid(); @@ -479,6 +470,7 @@ namespace FlaxEditor.Utilities return TypeUtils.GetType(typeName); } case VariantType.ManagedObject: + case VariantType.Structure: { if (type == null) throw new Exception("Missing type of the Variant typename " + typeName); @@ -580,13 +572,6 @@ namespace FlaxEditor.Utilities id = ((FlaxEngine.Object)value).ID; stream.WriteGuid(ref id); break; - case VariantType.Structure: - { - var data = Utils.StructureToByteArray(value, type); - stream.Write(data.Length); - stream.Write(data); - break; - } case VariantType.Asset: id = ((Asset)value).ID; stream.WriteGuid(ref id); @@ -664,6 +649,7 @@ namespace FlaxEditor.Utilities stream.WriteStrAnsi(((ScriptType)value).TypeName, -14); break; case VariantType.ManagedObject: + case VariantType.Structure: { stream.Write((byte)1); var json = FlaxEngine.Json.JsonSerializer.Serialize(value, type); @@ -690,6 +676,7 @@ namespace FlaxEditor.Utilities break; case VariantType.Enum: case VariantType.Structure: + case VariantType.ManagedObject: withoutTypeName = false; break; } @@ -1115,6 +1102,7 @@ namespace FlaxEditor.Utilities stream.WriteValue(((ScriptType)value).TypeName); break; case VariantType.ManagedObject: + case VariantType.Structure: { var json = FlaxEngine.Json.JsonSerializer.Serialize(value, type); stream.WriteRaw(json); diff --git a/Source/Engine/Core/Types/Variant.cpp b/Source/Engine/Core/Types/Variant.cpp index 1f45dc06f..ec1876158 100644 --- a/Source/Engine/Core/Types/Variant.cpp +++ b/Source/Engine/Core/Types/Variant.cpp @@ -1501,7 +1501,7 @@ Variant::operator ScriptingObject*() const Variant::operator _MonoObject*() const { - return AsUint ? mono_gchandle_get_target(AsUint) : nullptr; + return Type.Type == VariantType::ManagedObject && AsUint ? mono_gchandle_get_target(AsUint) : nullptr; } Variant::operator Asset*() const diff --git a/Source/Engine/Serialization/Serialization.cpp b/Source/Engine/Serialization/Serialization.cpp index adda45652..7b347f160 100644 --- a/Source/Engine/Serialization/Serialization.cpp +++ b/Source/Engine/Serialization/Serialization.cpp @@ -139,7 +139,6 @@ void Serialization::Serialize(ISerializable::SerializeStream& stream, const Vari else stream.String("", 0); break; - case VariantType::Structure: case VariantType::Blob: stream.Blob(v.AsBlob.Data, v.AsBlob.Length); break; @@ -207,8 +206,16 @@ void Serialization::Serialize(ISerializable::SerializeStream& stream, const Vari stream.String("", 0); break; case VariantType::ManagedObject: - ManagedSerialization::Serialize(stream, (MonoObject*)v); + case VariantType::Structure: + { + MonoObject* obj; + if (v.Type.Type == VariantType::Structure) + obj = MUtils::BoxVariant(v); + else + obj = (MonoObject*)v; + ManagedSerialization::Serialize(stream, obj); break; + } default: Platform::CheckFailed("", __FILE__, __LINE__); stream.StartObject(); @@ -275,7 +282,6 @@ void Serialization::Deserialize(ISerializable::DeserializeStream& stream, Varian Deserialize(value, id, modifier); v.SetAsset(LoadAsset(id, Asset::TypeInitializer)); break; - case VariantType::Structure: case VariantType::Blob: CHECK(value.IsString()); id.A = value.GetStringLength(); @@ -338,6 +344,7 @@ void Serialization::Deserialize(ISerializable::DeserializeStream& stream, Varian v.SetTypename(value.GetStringAnsiView()); break; case VariantType::ManagedObject: + case VariantType::Structure: { auto obj = (MonoObject*)v; if (!obj && v.Type.TypeName) @@ -356,9 +363,12 @@ void Serialization::Deserialize(ISerializable::DeserializeStream& stream, Varian } if (!mono_class_is_valuetype(klass)) mono_runtime_object_init(obj); - v.SetManagedObject(obj); + if (v.Type.Type == VariantType::ManagedObject) + v.SetManagedObject(obj); } ManagedSerialization::Deserialize(value, obj); + if (v.Type.Type == VariantType::Structure) + v = MUtils::UnboxVariant(obj); break; } default: diff --git a/Source/Engine/Serialization/Stream.cpp b/Source/Engine/Serialization/Stream.cpp index 0f8e75346..9e04a970f 100644 --- a/Source/Engine/Serialization/Stream.cpp +++ b/Source/Engine/Serialization/Stream.cpp @@ -340,6 +340,7 @@ void ReadStream::ReadVariant(Variant* data) break; } case VariantType::ManagedObject: + case VariantType::Structure: { const byte format = ReadByte(); if (format == 0) @@ -367,7 +368,10 @@ void ReadStream::ReadVariant(Variant* data) if (!mono_class_is_valuetype(klass)) mono_runtime_object_init(obj); ManagedSerialization::Deserialize(json, obj); - data->SetManagedObject(obj); + if (data->Type.Type == VariantType::ManagedObject) + data->SetManagedObject(obj); + else + *data = MUtils::UnboxVariant(obj); } else { @@ -375,23 +379,6 @@ void ReadStream::ReadVariant(Variant* data) } break; } - case VariantType::Structure: - { - int32 length; - ReadInt32(&length); - if (data->AsBlob.Length == length) - { - ReadBytes(data->AsBlob.Data, length); - } - else - { - LOG(Error, "Invalid Variant {2} data length {0}. Expected {1} bytes from stream.", data->AsBlob.Length, length, data->Type.ToString()); - - // Skip those bytes - SetPosition(GetPosition() + length); - } - break; - } case VariantType::Blob: { int32 length; @@ -651,7 +638,6 @@ void WriteStream::WriteVariant(const Variant& data) id = data.AsObject ? data.AsObject->GetID() : Guid::Empty; Write(&id); break; - case VariantType::Structure: case VariantType::Blob: WriteInt32(data.AsBlob.Length); WriteBytes(data.AsBlob.Data, data.AsBlob.Length); @@ -714,8 +700,13 @@ void WriteStream::WriteVariant(const Variant& data) WriteStringAnsi((StringAnsiView)data, -14); break; case VariantType::ManagedObject: + case VariantType::Structure: { - MonoObject* obj = (MonoObject*)data; + MonoObject* obj; + if (data.Type.Type == VariantType::Structure) + obj = MUtils::BoxVariant(data); + else + obj = (MonoObject*)data; if (obj) { WriteByte(1); @@ -731,7 +722,6 @@ void WriteStream::WriteVariant(const Variant& data) } break; } - break; default: CRASH; }