Merge remote-tracking branch 'origin/master' into 1.10
This commit is contained in:
@@ -442,7 +442,7 @@ namespace FlaxEngine.Json
|
||||
/// <inheritdoc />
|
||||
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer)
|
||||
{
|
||||
var result = Activator.CreateInstance(objectType);
|
||||
var result = existingValue ?? Activator.CreateInstance(objectType);
|
||||
if (reader.TokenType == JsonToken.String)
|
||||
{
|
||||
JsonSerializer.ParseID((string)reader.Value, out var id);
|
||||
@@ -483,6 +483,44 @@ namespace FlaxEngine.Json
|
||||
}
|
||||
}
|
||||
|
||||
internal class ControlReferenceConverter : JsonConverter
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public override unsafe void WriteJson(JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer)
|
||||
{
|
||||
var id = (value as IControlReference)?.UIControl?.ID ?? Guid.Empty;
|
||||
writer.WriteValue(JsonSerializer.GetStringID(&id));
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public override void WriteJsonDiff(JsonWriter writer, object value, object other, Newtonsoft.Json.JsonSerializer serializer)
|
||||
{
|
||||
if (value is IControlReference valueRef &&
|
||||
other is IControlReference otherRef &&
|
||||
JsonSerializer.SceneObjectEquals(valueRef.UIControl, otherRef.UIControl))
|
||||
return;
|
||||
base.WriteJsonDiff(writer, value, other, serializer);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer)
|
||||
{
|
||||
var result = existingValue ?? Activator.CreateInstance(objectType);
|
||||
if (reader.TokenType == JsonToken.String && result is IControlReference controlReference)
|
||||
{
|
||||
JsonSerializer.ParseID((string)reader.Value, out var id);
|
||||
controlReference.Load(Object.Find<UIControl>(ref id));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public override bool CanConvert(Type objectType)
|
||||
{
|
||||
return objectType.Name.StartsWith("ControlReference", StringComparison.Ordinal);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
/// <summary>
|
||||
/// Serialize Guid values using `N` format
|
||||
|
||||
@@ -194,6 +194,7 @@ namespace FlaxEngine.Json
|
||||
settings.Converters.Add(new SoftObjectReferenceConverter());
|
||||
settings.Converters.Add(new SoftTypeReferenceConverter());
|
||||
settings.Converters.Add(new BehaviorKnowledgeSelectorAnyConverter());
|
||||
settings.Converters.Add(new ControlReferenceConverter());
|
||||
settings.Converters.Add(new MarginConverter());
|
||||
settings.Converters.Add(new VersionConverter());
|
||||
settings.Converters.Add(new LocalizedStringConverter());
|
||||
@@ -227,6 +228,23 @@ namespace FlaxEngine.Json
|
||||
CacheManagedOnly.Dispose();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The default implementation of the values comparision function used by the serialization system.
|
||||
/// </summary>
|
||||
/// <param name="objA">The object a.</param>
|
||||
/// <param name="objB">The object b.</param>
|
||||
/// <returns>True if both objects are equal, otherwise false.</returns>
|
||||
public static bool SceneObjectEquals(SceneObject objA, SceneObject objB)
|
||||
{
|
||||
if (objA == objB)
|
||||
return true;
|
||||
if (objA == null || objB == null)
|
||||
return false;
|
||||
if (objA.HasPrefabLink && objB.HasPrefabLink)
|
||||
return objA.PrefabObjectID == objB.PrefabObjectID;
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The default implementation of the values comparision function used by the serialization system.
|
||||
/// </summary>
|
||||
|
||||
Reference in New Issue
Block a user