public override ImageSpriteStub Process(Texture2DContent input, ContentProcessorContext context) { string textureName = Path.GetFileNameWithoutExtension(context.OutputFilename) + "Texture"; BitmapContent texture = input.Mipmaps[0]; ExternalReference <Texture2DContent> texRef = context.WriteAsset(input, textureName); Rectangle texRect = new Rectangle(0, 0, texture.Width, texture.Height); return(new ImageSpriteStub(texRef, texRect)); }
public override DummyObject Process(PackedImageSpritesContent input, ContentProcessorContext context) { TexturePacker packer = new TexturePacker((int)ContainerSize); List <Texture2DContent> textures = new List <Texture2DContent>(); foreach (var group in input.Groups) { textures.Clear(); // load the textures to be packed foreach (var fileName in group.Filenames) { string textureFile = Path.GetDirectoryName(input.Identity.SourceFilename) + @"\" + fileName; context.AddDependency(textureFile); ExternalReference <Texture2DContent> textureReference = new ExternalReference <Texture2DContent>(textureFile); Texture2DContent texture = context.BuildAndLoadAsset <Texture2DContent, Texture2DContent>(textureReference, null); texture.Name = Path.GetFileNameWithoutExtension(fileName); textures.Add(texture); } // pack the textures int containerTextures = 0; while (textures.Count > 0 && containerTextures < MaximumContainersPerGroup) { packer.Pack(textures); var packedTextures = packer.GetContents(); Texture2DContent containerTexture = CreateContainerTexture(packedTextures); ExternalReference <Texture2DContent> container = context.WriteAsset(containerTexture, group.Name + "Texture" + containerTextures); foreach (var pack in packedTextures) { // undo the padding Rectangle texturePosition = pack.Value; texturePosition.X += 1; texturePosition.Y += 1; texturePosition.Width -= 2; texturePosition.Height -= 2; // write the stub ImageSpriteStub stub = new ImageSpriteStub(container, texturePosition); context.WriteAsset(stub, pack.Key.Name); context.Logger.LogImportantMessage("Packed {0} at {1}", pack.Key.Name, texturePosition); } // repeat with the textures that did not fit textures = packer.GetOverflow(); containerTextures++; } // warn if we bailed out if (containerTextures > MaximumContainersPerGroup) { context.Logger.LogImportantMessage( "Too many textures to pack in group {0}; {1} left over.", group.Name, textures.Count); } } return(new DummyObject()); }