QuaternionConverter.cs 1.0 KB

12345678910111213141516171819202122232425262728293031
  1. using System;
  2. using Newtonsoft.Json;
  3. using UnityEngine;
  4. using UnityEngine.Scripting;
  5. namespace Siccity.GLTFUtility.Converters {
  6. /// <summary>
  7. /// Converts from float array to Quaternion during deserialization, and back.
  8. /// Compensates for differing coordinate systems as well.
  9. /// </summary>
  10. [Preserve] public class QuaternionConverter : JsonConverter {
  11. public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) {
  12. Quaternion q = (Quaternion) value;
  13. writer.WriteStartArray();
  14. writer.WriteValue(q.x);
  15. writer.WriteValue(-q.y);
  16. writer.WriteValue(-q.z);
  17. writer.WriteValue(q.w);
  18. writer.WriteEndArray();
  19. }
  20. public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) {
  21. float[] floatArray = serializer.Deserialize<float[]>(reader);
  22. return new Quaternion(floatArray[0], -floatArray[1], -floatArray[2], floatArray[3]);
  23. }
  24. public override bool CanConvert(Type objectType) {
  25. return objectType == typeof(Quaternion);
  26. }
  27. }
  28. }