MeidoManagerSerializer.cs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. using System.IO;
  2. using UnityEngine;
  3. namespace MeidoPhotoStudio.Plugin;
  4. public class MeidoManagerSerializer : Serializer<MeidoManager>
  5. {
  6. private const short Version = 1;
  7. private static Serializer<Meido> MeidoSerializer =>
  8. Serialization.Get<Meido>();
  9. public override void Serialize(MeidoManager manager, BinaryWriter writer)
  10. {
  11. writer.Write(MeidoManager.Header);
  12. writer.WriteVersion(Version);
  13. var meidoList = manager.ActiveMeidoList;
  14. var meidoCount = meidoList.Count;
  15. var hairPosition = Vector3.zero;
  16. var skirtPosition = Vector3.zero;
  17. var hairMeidoFound = false;
  18. var skirtMeidoFound = false;
  19. var globalGravity = manager.GlobalGravity;
  20. writer.Write(meidoCount);
  21. foreach (var meido in meidoList)
  22. {
  23. MeidoSerializer.Serialize(meido, writer);
  24. if (!globalGravity || meidoCount <= 0)
  25. continue;
  26. // Get gravity and skirt control positions to apply to meidos past the meido count
  27. if (!hairMeidoFound && meido.HairGravityControl.Valid)
  28. {
  29. hairPosition = meido.HairGravityControl.Control.transform.localPosition;
  30. hairMeidoFound = true;
  31. }
  32. else if (!skirtMeidoFound && meido.SkirtGravityControl.Valid)
  33. {
  34. skirtPosition = meido.SkirtGravityControl.Control.transform.localPosition;
  35. skirtMeidoFound = true;
  36. }
  37. }
  38. writer.Write(globalGravity);
  39. writer.Write(hairPosition);
  40. writer.Write(skirtPosition);
  41. }
  42. public override void Deserialize(MeidoManager manager, BinaryReader reader, SceneMetadata metadata)
  43. {
  44. _ = reader.ReadVersion();
  45. var meidoCount = reader.ReadInt32();
  46. for (var i = 0; i < meidoCount; i++)
  47. {
  48. if (i >= manager.ActiveMeidoList.Count)
  49. {
  50. reader.BaseStream.Seek(reader.ReadInt64(), SeekOrigin.Current);
  51. continue;
  52. }
  53. MeidoSerializer.Deserialize(manager.ActiveMeidoList[i], reader, metadata);
  54. }
  55. var globalGravity = reader.ReadBoolean();
  56. var hairPosition = reader.ReadVector3();
  57. var skirtPosition = reader.ReadVector3();
  58. Utility.SetFieldValue(manager, "globalGravity", globalGravity);
  59. if (!globalGravity)
  60. return;
  61. foreach (var meido in manager.ActiveMeidoList)
  62. {
  63. meido.HairGravityActive = true;
  64. meido.SkirtGravityActive = true;
  65. meido.ApplyGravity(hairPosition);
  66. meido.ApplyGravity(skirtPosition, true);
  67. }
  68. }
  69. }