Simplified serialization/deserialization of EngineObjects + added support for Assets (actually any EngineObject!)

This commit is contained in:
Simon Lübeß
2025-03-01 00:48:31 +01:00
parent b5088329f5
commit 10e8b3c282
6 changed files with 41 additions and 42 deletions
@@ -121,7 +121,7 @@ public class ScriptInstanceSerializer
{
for (var fieldData in ref object.Fields.Values)
{
if (fieldData.PrimitiveType != .EntityReference && fieldData.PrimitiveType != .ComponentReference)
if (fieldData.PrimitiveType != .EngineObjectReference)
continue;
if (originalToCopyIds.TryGetValue(fieldData.Data.EngineObject.ID, let copyId))
@@ -36,10 +36,9 @@ public enum SerializationType : uint32
case Enum = 1 << 26;
case EntityReference = 1 << 25;
case ComponentReference = 1 << 24;
case EngineObjectReference = 1 << 25;
case ObjectReference = 1 << 23;
case ObjectReference = 1 << 24;
public int GetSize()
{
@@ -63,7 +62,9 @@ public enum SerializationType : uint32
return 8;
case .Decimal:
return 16;
case .EntityReference, .ComponentReference, .ObjectReference:
case .EngineObjectReference:
return sizeof(UUID);
case .ObjectReference:
return sizeof(UUID);
case .String:
return sizeof(StringView);
@@ -115,7 +115,7 @@ class SerializedObject
}
data.StringView = valueView;
case .EntityReference, .ComponentReference:
case .EngineObjectReference:
String typeName = null;
if (fullTypeName != null)
@@ -191,7 +191,7 @@ class SerializedObject
{
case .String, .Enum:
*(StringView*)target = field.Data.StringView;
case .EntityReference, .ComponentReference:
case .EngineObjectReference:
let engineObjectData = field.Data.EngineObject;
*(char8**)target = engineObjectData.FullTypeName?.CStr();
@@ -303,13 +303,8 @@ class SerializedObject
writer.Type("Enum");
#unwarn
Serialize.Value(writer, ValueView(typeof(StringView), &field.Data.StringView), environment);
case .EntityReference:
writer.Type("Entity");
if (field.Data.EngineObject.FullTypeName != null)
writer.Type(field.Data.EngineObject.FullTypeName);
Serialize.Value(writer, field.Data.EngineObject.ID, environment);
case .ComponentReference:
writer.Type("Component");
case .EngineObjectReference:
writer.Type("EngineObject");
if (field.Data.EngineObject.FullTypeName != null)
writer.Type(field.Data.EngineObject.FullTypeName);
Serialize.Value(writer, field.Data.EngineObject.ID, environment);
@@ -502,7 +497,7 @@ class SerializedObject
break HandleField;
}
else if (fieldTypeName == "Entity" || fieldTypeName == "Component")
else if (fieldTypeName == "EngineObject")
{
String entityTypeName = null;
@@ -521,7 +516,7 @@ class SerializedObject
Deserialize.[Friend]Integer!(typeof(uint64), reader, ValueView(typeof(uint64), &id));
UUID reference = UUID(id);
fieldType = (fieldTypeName == "Entity") ? .EntityReference : .ComponentReference;
fieldType = .EngineObjectReference;
fieldData.EngineObject = (FullTypeName: entityTypeName, ID: reference);
break HandleField;