Add support for using structures as Visual Script and Anim Graph parameters

This commit is contained in:
Wojtek Figat
2021-07-29 23:35:30 +02:00
parent 24782bdd2f
commit d8f555e8dc
5 changed files with 32 additions and 44 deletions

View File

@@ -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;
}