BITKit/Src/NetSupport/MathematicsSupport.cs

196 lines
7.3 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<int3>
{
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<int4>
{
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<float2>
{
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<float3>
{
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<float4>
{
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