TexturePackerWriter.cs 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. // Copyright (c) Craftwork Games. All rights reserved.
  2. // Licensed under the MIT license.
  3. // See LICENSE file in the project root for full license information.
  4. using System;
  5. using System.IO;
  6. using Microsoft.Xna.Framework.Content.Pipeline;
  7. using Microsoft.Xna.Framework.Content.Pipeline.Serialization.Compiler;
  8. using MonoGame.Extended.Graphics;
  9. namespace MonoGame.Extended.Content.Pipeline.TextureAtlases;
  10. [ContentTypeWriter]
  11. public class TexturePackerWriter : ContentTypeWriter<TexturePackerProcessorResult>
  12. {
  13. protected override void Write(ContentWriter writer, TexturePackerProcessorResult result)
  14. {
  15. var tpFile = result.Data;
  16. if (tpFile.Meta.DataFormat == "monogame-extended") // new "MonoGame.Extended" format, recommended
  17. {
  18. var texture = tpFile.Textures[0];
  19. var imageAssetName = Path.ChangeExtension(texture.FileName, null);
  20. writer.Write(imageAssetName);
  21. writer.Write(texture.Frames.Count);
  22. foreach (var kv in texture.Frames)
  23. {
  24. var frameKey = kv.Key;
  25. var frame = kv.Value;
  26. writer.Write(frame.Frame.X);
  27. writer.Write(frame.Frame.Y);
  28. writer.Write(frame.Frame.Width);
  29. writer.Write(frame.Frame.Height);
  30. writer.Write(frameKey);
  31. writer.Write(frame.Rotated); // angle (0, 90)
  32. writer.Write(frame.Size != null); // trimmed sprite: true/false
  33. if (frame.Size != null)
  34. {
  35. writer.Write(frame.Size.Width); // sprite size before trimming
  36. writer.Write(frame.Size.Height);
  37. writer.Write(frame.Offset.X); // trim offset
  38. writer.Write(frame.Offset.Y);
  39. }
  40. writer.Write(frame.Pivot != null); // has pivot point: true/false
  41. if (frame.Pivot != null)
  42. {
  43. writer.Write(frame.Pivot.X);
  44. writer.Write(frame.Pivot.Y);
  45. }
  46. }
  47. }
  48. else if (tpFile.Regions.Count != 0) // generic "JSON (Array)" format
  49. {
  50. var imageAssetName = Path.ChangeExtension(tpFile.Meta.Image, null);
  51. writer.Write(imageAssetName);
  52. writer.Write(tpFile.Regions.Count);
  53. foreach (var region in tpFile.Regions)
  54. {
  55. var regionName = Path.ChangeExtension(region.FileName, null);
  56. writer.Write(region.Frame.X);
  57. writer.Write(region.Frame.Y);
  58. writer.Write(region.Frame.Width);
  59. writer.Write(region.Frame.Height);
  60. writer.Write(regionName);
  61. writer.Write(0); // rotation
  62. writer.Write(false); // no trimming
  63. writer.Write(false); // no pivot point
  64. }
  65. }
  66. else
  67. {
  68. throw new InvalidOperationException("No frames or textures found in TexturePackerFileContent.");
  69. }
  70. }
  71. public override string GetRuntimeType(TargetPlatform targetPlatform)
  72. {
  73. return typeof(Texture2DAtlas).AssemblyQualifiedName;
  74. }
  75. public override string GetRuntimeReader(TargetPlatform targetPlatform)
  76. {
  77. return typeof(ContentReaders.Texture2DAtlasReader).AssemblyQualifiedName;
  78. }
  79. }