PropManagerSerializer.cs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. using System.Collections.Generic;
  2. using System.IO;
  3. namespace MeidoPhotoStudio.Plugin;
  4. public class PropManagerSerializer : Serializer<PropManager>
  5. {
  6. private const short Version = 1;
  7. private static SimpleSerializer<DragPointPropDTO> DragPointDtoSerializer =>
  8. Serialization.GetSimple<DragPointPropDTO>();
  9. public override void Serialize(PropManager manager, BinaryWriter writer)
  10. {
  11. writer.Write(PropManager.Header);
  12. writer.WriteVersion(Version);
  13. var propList = GetPropList(manager);
  14. writer.Write(propList.Count);
  15. foreach (var prop in propList)
  16. DragPointDtoSerializer.Serialize(new DragPointPropDTO(prop), writer);
  17. }
  18. public override void Deserialize(PropManager manager, BinaryReader reader, SceneMetadata metadata)
  19. {
  20. _ = reader.ReadVersion();
  21. manager.DeleteAllProps();
  22. var propList = GetPropList(manager);
  23. var propCount = reader.ReadInt32();
  24. var propIndex = 0;
  25. for (var i = 0; i < propCount; i++)
  26. {
  27. var dragPointPropDto = DragPointDtoSerializer.Deserialize(reader, metadata);
  28. if (!manager.AddFromPropInfo(dragPointPropDto.PropInfo))
  29. continue;
  30. Apply(manager, propList[propIndex], dragPointPropDto);
  31. propIndex++;
  32. }
  33. }
  34. private static List<DragPointProp> GetPropList(PropManager manager) =>
  35. Utility.GetFieldValue<PropManager, List<DragPointProp>>(manager, "propList");
  36. private static void Apply(PropManager manager, DragPointProp prop, DragPointPropDTO dto)
  37. {
  38. var (transformDto, attachPointInfo, shadowCasting) = dto;
  39. prop.ShadowCasting = shadowCasting;
  40. var transform = prop.MyObject;
  41. if (attachPointInfo.AttachPoint is not AttachPoint.None)
  42. {
  43. manager.AttachProp(prop, attachPointInfo.AttachPoint, attachPointInfo.MaidIndex);
  44. transform.localPosition = transformDto.LocalPosition;
  45. transform.localRotation = transformDto.LocalRotation;
  46. }
  47. // TODO: Use transform.SetRotationAndPosition or whatever it's called.
  48. transform.position = transformDto.Position;
  49. transform.rotation = transformDto.Rotation;
  50. transform.localScale = transformDto.LocalScale;
  51. }
  52. }