SpriteSheetProcessor.cs 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #region File Description
  2. //-----------------------------------------------------------------------------
  3. // SpriteSheetProcessor.cs
  4. //
  5. // Microsoft Game Technology Group
  6. // Copyright (C) Microsoft Corporation. All rights reserved.
  7. //-----------------------------------------------------------------------------
  8. #endregion
  9. #region Using Statements
  10. using System.IO;
  11. using System.Collections.Generic;
  12. using Microsoft.Xna.Framework.Content.Pipeline;
  13. using Microsoft.Xna.Framework.Content.Pipeline.Graphics;
  14. #endregion
  15. namespace SpriteSheetPipeline
  16. {
  17. /// <summary>
  18. /// Custom content processor takes an array of individual sprite filenames (which
  19. /// will typically be imported from an XML file), reads them all into memory,
  20. /// arranges them onto a single larger texture, and returns the resulting sprite
  21. /// sheet object.
  22. /// </summary>
  23. [ContentProcessor]
  24. public class SpriteSheetProcessor : ContentProcessor<string[], SpriteSheetContent>
  25. {
  26. /// <summary>
  27. /// Converts an array of sprite filenames into a sprite sheet object.
  28. /// </summary>
  29. public override SpriteSheetContent Process(string[] input,
  30. ContentProcessorContext context)
  31. {
  32. SpriteSheetContent spriteSheet = new SpriteSheetContent();
  33. List<BitmapContent> sourceSprites = new List<BitmapContent>();
  34. // Loop over each input sprite filename.
  35. foreach (string inputFilename in input)
  36. {
  37. // Store the name of this sprite.
  38. string spriteName = Path.GetFileNameWithoutExtension(inputFilename);
  39. spriteSheet.SpriteNames.Add(spriteName, sourceSprites.Count);
  40. // Load the sprite texture into memory.
  41. ExternalReference<TextureContent> textureReference =
  42. new ExternalReference<TextureContent>(inputFilename);
  43. TextureContent texture =
  44. context.BuildAndLoadAsset<TextureContent,
  45. TextureContent>(textureReference, "TextureProcessor");
  46. sourceSprites.Add(texture.Faces[0][0]);
  47. }
  48. // Pack all the sprites into a single large texture.
  49. BitmapContent packedSprites = SpritePacker.PackSprites(sourceSprites,
  50. spriteSheet.SpriteRectangles, context);
  51. spriteSheet.Texture.Mipmaps.Add(packedSprites);
  52. return spriteSheet;
  53. }
  54. }
  55. }