Add support for using structures as Visual Script and Anim Graph parameters
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user