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));
        }
Beispiel #2
0
        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());
        }