using System; using Newtonsoft.Json; using Unity.Mathematics; using YamlDotNet.Core; using YamlDotNet.Serialization; #if NET5_0_OR_GREATER namespace BITKit { public class Int3JsonConvertJsonConverter : JsonConverter { public override void WriteJson(JsonWriter writer, int3 value, JsonSerializer serializer) { writer.WriteStartObject(); writer.WritePropertyName(nameof(value.x)); writer.WriteValue(value.x); writer.WritePropertyName(nameof(value.y)); writer.WriteValue(value.y); writer.WritePropertyName(nameof(value.z)); writer.WriteValue(value.z); writer.WriteEndObject(); } public override int3 ReadJson(JsonReader reader, Type objectType, int3 existingValue, bool hasExistingValue, JsonSerializer serializer) { var result = new int3(0, 0, 0); // 默认值为 (0, 0, 0) while (reader.TokenType != JsonToken.EndObject) { reader.Read(); if (reader.TokenType != JsonToken.PropertyName) continue; var property = reader.Value.ToString(); if (property == nameof(int3.x)) result.x = (int)reader.ReadAsInt32()!; if (property == nameof(int3.y)) result.y = (int)reader.ReadAsInt32()!; if (property == nameof(int3.z)) result.z = (int)reader.ReadAsInt32()!; } return result; } } public class Int4JsonConvertJsonConverter : JsonConverter { public override void WriteJson(JsonWriter writer, int4 value, JsonSerializer serializer) { writer.WriteStartObject(); writer.WritePropertyName(nameof(value.x)); writer.WriteValue(value.x); writer.WritePropertyName(nameof(value.y)); writer.WriteValue(value.y); writer.WritePropertyName(nameof(value.z)); writer.WriteValue(value.z); writer.WritePropertyName(nameof(value.w)); writer.WriteValue(value.w); writer.WriteEndObject(); } public override int4 ReadJson(JsonReader reader, Type objectType, int4 existingValue, bool hasExistingValue, JsonSerializer serializer) { var result = new int4(0, 0, 0, 0); // 默认值为 (0, 0, 0, 0) while (reader.TokenType != JsonToken.EndObject) { reader.Read(); if (reader.TokenType != JsonToken.PropertyName) continue; var property = reader.Value.ToString(); if (property == nameof(int4.x)) result.x = (int)reader.ReadAsInt32()!; if (property == nameof(int4.y)) result.y = (int)reader.ReadAsInt32()!; if (property == nameof(int4.z)) result.z = (int)reader.ReadAsInt32()!; if (property == nameof(int4.w)) result.w = (int)reader.ReadAsInt32()!; } return result; } } public class Float2JsonConvertJsonConverter:JsonConverter { public override void WriteJson(JsonWriter writer, float2 value, JsonSerializer serializer) { writer.WriteStartObject(); writer.WritePropertyName(nameof(value.x)); writer.WriteValue((double)value.x); writer.WritePropertyName(nameof(value.y)); writer.WriteValue((double)value.y); writer.WriteEndObject(); } public override float2 ReadJson(JsonReader reader, Type objectType, float2 existingValue, bool hasExistingValue, JsonSerializer serializer) { var result = float2.zero; while (reader.TokenType != JsonToken.EndObject) { reader.Read(); if (reader.TokenType != JsonToken.PropertyName) continue; var property = reader.Value; if (property is nameof(float2.x)) result.x = (float)reader.ReadAsDouble()!; if (property is nameof(float2.y)) result.y = (float)reader.ReadAsDouble()!; } return result; } } public class Float3JsonConvertJsonConverter : JsonConverter { public override void WriteJson(JsonWriter writer, float3 value, JsonSerializer serializer) { writer.WriteStartObject(); writer.WritePropertyName(nameof(value.x)); writer.WriteValue((double)value.x); // 将 float 转为 double,避免精度问题 writer.WritePropertyName(nameof(value.y)); writer.WriteValue((double)value.y); // 将 float 转为 double writer.WritePropertyName(nameof(value.z)); writer.WriteValue((double)value.z); // 将 float 转为 double writer.WriteEndObject(); } public override float3 ReadJson(JsonReader reader, Type objectType, float3 existingValue, bool hasExistingValue, JsonSerializer serializer) { var result = float3.zero; // 默认值为 (0, 0, 0) while (reader.TokenType != JsonToken.EndObject) { reader.Read(); if (reader.TokenType != JsonToken.PropertyName) continue; var property = reader.Value.ToString(); if (property == nameof(float3.x)) result.x = (float)reader.ReadAsDouble()!; if (property == nameof(float3.y)) result.y = (float)reader.ReadAsDouble()!; if (property == nameof(float3.z)) result.z = (float)reader.ReadAsDouble()!; } return result; } } public class Float4JsonConvertJsonConverter:JsonConverter { public override void WriteJson(JsonWriter writer, float4 value, JsonSerializer serializer) { writer.WriteStartObject(); writer.WritePropertyName(nameof(value.x)); writer.WriteValue((double)value.x); writer.WritePropertyName(nameof(value.y)); writer.WriteValue((double)value.y); writer.WritePropertyName(nameof(value.z)); writer.WriteValue((double)value.z); writer.WritePropertyName(nameof(value.w)); writer.WriteValue((double)value.w); writer.WriteEndObject(); } public override float4 ReadJson(JsonReader reader, Type objectType, float4 existingValue, bool hasExistingValue, JsonSerializer serializer) { var result = float4.zero; while (reader.TokenType != JsonToken.EndObject) { reader.Read(); if (reader.TokenType != JsonToken.PropertyName) continue; var property = reader.Value; if (property is nameof(float4.x)) result.x = (float)reader.ReadAsDouble()!; if (property is nameof(float4.y)) result.y = (float)reader.ReadAsDouble()!; if (property is nameof(float4.z)) result.z = (float)reader.ReadAsDouble()!; if (property is nameof(float4.w)) result.w = (float)reader.ReadAsDouble()!; } return result; } } } #endif