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)); } }
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); }