mirror of
https://github.com/aharabada/glitchy-engine-beef.git
synced 2026-09-06 05:01:53 +00:00
Refactored script instance serialization and now the refactoring is finally finished...
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user