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
@@ -0,0 +1,97 @@
using System.Collections;
using GlitchyEngine.Core;
using GlitchyEngine.Serialization;
namespace GlitchyEngine.Scripting;
using internal GlitchyEngine.Scripting;
/// Provides capability to serialize and deserialize C# objects managed by the script engine
public class ScriptInstanceSerializer
{
append Dictionary<UUID, SerializedObject> _serializedData = .();
public int SerializedObjectCount => _serializedData.Count;
public Dictionary<UUID, SerializedObject> SerializedObjects => _serializedData;
public ~this()
{
Clear();
delete:append _serializedData;
}
public void Clear()
{
ClearDictionaryAndDeleteValues!(_serializedData);
}
/// Serializes all script instances that are currently managed by the ScriptEngine.
public void SerializeScriptInstances()
{
Debug.Profiler.ProfileFunction!();
for (let (id, script) in ScriptEngine._entityScriptInstances)
{
SerializeScriptInstance(script);
}
}
/// Serializes the given script instance.
public void SerializeScriptInstance(ScriptInstance script)
{
SerializedObject object = new SerializedObject(_serializedData, script.ScriptClass.FullName, script.EntityId);
object.Serialize(script);
}
/// Deserializes this context into the instances currently managed by the script engine.
public void DeserializeScriptInstances()
{
Debug.Profiler.ProfileFunction!();
for (let (id, script) in ScriptEngine._entityScriptInstances)
{
DeserializeScriptInstance(id, script);
}
}
/// Deserializes the data into the given script instance, if there is data available.
/// @returns true if the script had serialized data; false otherwise.
public bool DeserializeScriptInstance(UUID id, ScriptInstance script)
{
if (_serializedData.TryGetValue(id, let object))
{
object.Deserialize(script);
return true;
}
return false;
}
/// Replaces Entity references in the given serialized data using the specified translation table.
public void FixupSerializedIds(Dictionary<UUID, UUID> originalToCopyIds)
{
for (let (id, object) in _serializedData)
{
for (var fieldData in ref object.Fields.Values)
{
if (fieldData.PrimitiveType != .EntityReference && fieldData.PrimitiveType != .ComponentReference)
continue;
if (originalToCopyIds.TryGetValue(fieldData.Data.EngineObject.ID, let copyId))
fieldData.Data.EngineObject.ID = copyId;
}
}
}
public SerializedObject GetSerializedObject(UUID id)
{
return _serializedData[id];
}
public bool TryGetSerializedObject(UUID id, out SerializedObject object)
{
return _serializedData.TryGetValue(id, out object);
}
}