Example #1
0
 private void CreateTexturePacker()
 {
     PackedTextures = new Dictionary <WadTexture, VectorInt2>();
     if (_compactTexture)
     {
         TexturePacker = new RectPackerTree(new VectorInt2(TextureAtlasSize, TextureAtlasSize));
     }
     else
     {
         TexturePacker = new RectPackerSimpleStack(new VectorInt2(TextureAtlasSize, TextureAtlasSize));
     }
 }
Example #2
0
        public List <ImageC> PackTextures()
        {
            //Sort textures for packing order...
            int[] usedTexturesProcessingOrder = new int[_usedTextures.Count];
            for (int i = 0; i < _usedTextures.Count; ++i)
            {
                usedTexturesProcessingOrder[i] = i;
            }
            Array.Sort(usedTexturesProcessingOrder, new TextureComparer {
                _usedTextures = _usedTextures
            });

            //Pack the textures...
            List <ImageC>     resultingTextures       = new List <ImageC>();
            List <RectPacker> resultingTexturesPacker = new List <RectPacker>();

            _usedTexturePackInfos = new Result[_usedTextures.Count];
            foreach (int UsedTextureIndex in usedTexturesProcessingOrder)
            {
                TextureView usedTexture = _usedTextures[UsedTextureIndex];

                Result usedTexturePackInfo;
                for (ushort i = 0; i < resultingTextures.Count; ++i)
                {
                    VectorInt2?packingPosition = resultingTexturesPacker[i].TryAdd(usedTexture.Area.Size);
                    if (packingPosition.HasValue)
                    {
                        usedTexturePackInfo = new Result {
                            OutputTextureID = i, Pos = packingPosition.Value
                        };
                        goto PackNextUsedTexture;
                    }
                }

                var packer = new RectPackerTree(new VectorInt2(_pageSize));
                usedTexturePackInfo = new Result {
                    OutputTextureID = (ushort)resultingTextures.Count, Pos = packer.TryAdd(usedTexture.Area.Size).Value
                };
                resultingTextures.Add(ImageC.CreateNew(_pageSize, _pageSize));
                resultingTexturesPacker.Add(packer);

                //Write texture data...
PackNextUsedTexture:
                resultingTextures[usedTexturePackInfo.OutputTextureID].CopyFrom(usedTexturePackInfo.Pos.X, usedTexturePackInfo.Pos.Y,
                                                                                usedTexture.Texture.Image, usedTexture.Area.X0, usedTexture.Area.Y0, usedTexture.Area.Width, usedTexture.Area.Height);
                _usedTexturePackInfos[UsedTextureIndex] = usedTexturePackInfo;
            }

            return(resultingTextures);
        }