Refactored script instance serialization and now the refactoring is finally finished...

This commit is contained in:
Simon Lübeß
2024-04-10 14:42:07 +02:00
parent 95262d67d7
commit d81471419d
5 changed files with 127 additions and 100 deletions
+6 -5
View File
@@ -958,8 +958,9 @@ namespace GlitchyEngine.World
*/
public Entity CreateInstance(Entity entity)
{
Dictionary<UUID, SerializedObject> serializedData = scope .();
defer { ClearDictionaryAndDeleteValues!(serializedData); }
//Dictionary<UUID, SerializedObject> serializedData = scope .();
ScriptInstanceSerializer scriptSerializer = scope .();
//defer { ClearDictionaryAndDeleteValues!(serializedData); }
List<Entity> newEntities = scope .();
Dictionary<EcsEntity, EcsEntity> sourceToTargetEntity = scope .();
@@ -1002,7 +1003,7 @@ namespace GlitchyEngine.World
if (sourceScript.Instance != null)
{
ScriptEngine.SerializeScriptInstance(sourceScript.Instance, serializedData);
scriptSerializer.SerializeScriptInstance(sourceScript.Instance);
// Initializes the created instance
// TODO: this returns false, if no script with ScriptClassName exists, we have to handle this case correctly I think.
@@ -1024,13 +1025,13 @@ namespace GlitchyEngine.World
Entity newEntity = CopyEntityAndChildren(entity, null);
// Replace old IDs with new ones
ScriptEngine.FixupSerializedIds(sourceIdToTargetId, serializedData);
scriptSerializer.FixupSerializedIds(sourceIdToTargetId);
// Use separate loops for deserialization and OnCreate to ensure complete entities and references in OnCreate
for (let (originalId, newScriptInstance) in newScripts)
{
ScriptEngine.DeserializeScriptInstance(originalId, newScriptInstance, serializedData);
scriptSerializer.DeserializeScriptInstance(originalId, newScriptInstance);
}
for (let (_, newScriptInstance) in newScripts)
+10 -13
View File
@@ -28,11 +28,11 @@ class SceneSerializer
// Maps from ID in the prefab file to the actual ID in the scene.
private Dictionary<UUID, UUID> _fileToSceneId;
private Dictionary<UUID, SerializedObject> _serializedObjects ~ DeleteDictionaryAndValues!(_);
private append ScriptInstanceSerializer _scriptSerializer = .(); //Dictionary<UUID, SerializedObject> _serializedObjects ~ DeleteDictionaryAndValues!(_);
private HashSet<UUID> _objectsNotWritten;
public Dictionary<UUID, SerializedObject> SerializedObjects => _serializedObjects;
public ScriptInstanceSerializer ScriptSerializer => _scriptSerializer;
public this(Scene scene)
{
@@ -43,13 +43,11 @@ class SceneSerializer
{
Debug.Profiler.ProfileResourceFunction!();
_serializedObjects = new .();
_scriptSerializer.SerializeScriptInstances();
ScriptEngine.SerializeScriptInstances(_serializedObjects);
_objectsNotWritten = new .(_scriptSerializer.SerializedObjectCount);
_objectsNotWritten = new .(_serializedObjects.Count);
for (UUID key in _serializedObjects.Keys)
for (UUID key in _scriptSerializer.SerializedObjects.Keys)
{
_objectsNotWritten.Add(key);
}
@@ -84,11 +82,12 @@ class SceneSerializer
writer.Identifier("ReferencedObjects");
// Write all objects that don't belong to an entity. (referenced Arrays, Classes, etc...)
using (writer.ArrayBlock())
{
for (UUID id in _objectsNotWritten)
{
Serialize.Value(writer, _serializedObjects[id]);
Serialize.Value(writer, _scriptSerializer.GetSerializedObject(id));
}
}
@@ -237,7 +236,7 @@ class SceneSerializer
{
Serialize.Value(writer, "ScriptClass", component.ScriptClassName);
if (_serializedObjects.TryGetValue(entity.UUID, let value))
if (_scriptSerializer.TryGetSerializedObject(entity.UUID, let value))
{
Serialize.Value(writer, "Fields", value);
@@ -285,8 +284,6 @@ class SceneSerializer
{
Debug.Profiler.ProfileResourceFunction!();
_serializedObjects = new .();
_parentIdToChild = scope Dictionary<UUID, Entity>();
_entitiesMissingParent = scope List<(Entity Entity, UUID ParentId)>();
_fileToSceneId = scope Dictionary<UUID, UUID>();
@@ -344,7 +341,7 @@ class SceneSerializer
Try!(reader.EntryEnd());
}
Try!(SerializedObject.BonDeserialize(reader, _serializedObjects, gBonEnv));
Try!(SerializedObject.BonDeserialize(reader, _scriptSerializer.SerializedObjects, gBonEnv));
first = false;
}
@@ -667,7 +664,7 @@ class SceneSerializer
Try!(reader.EntryEnd());
if (Try!(reader.Identifier()) == "Fields")
SerializedObject.BonDeserialize(reader, _serializedObjects, gBonEnv);
SerializedObject.BonDeserialize(reader, _scriptSerializer.SerializedObjects, gBonEnv);
}
return .Ok;