public static string GetDisplayName(BinRaw bin) { var main = bin.main; var size = bin.size; var quality = bin.quality; var builder = new StringBuilder(); builder.Append(main.name); builder.Append(string.Format(" [{0}x{1}]", (int)size.x, (int)size.y)); builder.Append(string.Format(" [{0}]", Enum.GetName(typeof(PackQuality), quality).ToLower())); return(builder.ToString()); }
public PackAtlasSprite(BinRaw binRaw, SpriteRaw spriteRaw) { mMain = binRaw.main; Debug.Assert(mMain != null, "Can not find main texture."); mAddition = binRaw.addition; mName = spriteRaw.name; mRect = spriteRaw.rect; mBorder = spriteRaw.border; mPivot = spriteRaw.pivot; mTransparency = PackUtil.CheckAtlasBinTranparency(binRaw); mQuality = (PackQuality)binRaw.quality; }
public void Setup(PackSetting setting, BinRaw bin) { this.setting = setting; this.bin = bin; mainAsset = bin.main; mainAssetPath = AssetDatabase.GetAssetPath(mainAsset); mainImporter = AssetImporter.GetAtPath(mainAssetPath) as TextureImporter; if (bin.addition != null) { addAsset = bin.addition; addAssetPath = AssetDatabase.GetAssetPath(addAsset); addImporter = AssetImporter.GetAtPath(addAssetPath) as TextureImporter; } transparency = PackUtil.CheckAtlasBinTranparency(bin); maxTextureSize = PackUtil.Scale2POT(Mathf.Max((int)bin.size.x, (int)bin.size.y)); }
public bool Fetch(SpriteIndex index, out AtlasRaw atlas, out BinRaw bin, out SpriteRaw sprite) { atlas = null; bin = null; sprite = null; if (index.atlas < mAtlases.Count) { atlas = mAtlases[index.atlas]; if (index.bin < atlas.bins.Length) { bin = atlas.bins[index.bin]; if (index.sprite < bin.sprites.Length) { sprite = bin.sprites[index.sprite]; return(true); } } } return(false); }
public void OnGUI(Rect rect, AtlasRaw atlas, BinRaw bin, List <SpriteIndex> selected) { GUI.BeginClip(rect); var localRect = new Rect(0, 0, rect.width, rect.height); var texDragOffset = mOffset; var texScale = mScale; var texScaleOffset = new Vector2( localRect.width * (texScale - 1) * 0.5f, localRect.height * (texScale - 1) * 0.5f); var texOffset = texDragOffset - texScaleOffset; var texSize = localRect.size * texScale; AtlasEditorUtil.DrawGrid(localRect); AtlasEditorUtil.DrawSprite(localRect, bin.main, bin.addition, new Rect(-texOffset.x / texSize.x, (texDragOffset.y + texScaleOffset.y) / texSize.y, localRect.width / texSize.x, localRect.height / texSize.y)); int controlID = GUIUtility.GetControlID(FocusType.Passive); var eventType = Event.current.GetTypeForControl(controlID); switch (eventType) { case EventType.ScrollWheel: { if (localRect.Contains(Event.current.mousePosition)) { var scaleDelta = 15; texScale -= Event.current.delta.y / scaleDelta; texScale = Mathf.Max(texScale, 1); texScaleOffset = new Vector2(localRect.width * (texScale - 1) * 0.5f, localRect.height * (texScale - 1) * 0.5f); texDragOffset.x = Mathf.Clamp(texDragOffset.x, -texScaleOffset.x, texScaleOffset.x); texDragOffset.y = Mathf.Clamp(texDragOffset.y, -texScaleOffset.y, texScaleOffset.y); Event.current.Use(); } break; } case EventType.MouseDown: { var pos = GUIUtility.GetStateObject(typeof(List <int>), controlID) as List <int>; pos.Clear(); pos.Add((int)Event.current.mousePosition.x); pos.Add((int)Event.current.mousePosition.y); GUIUtility.hotControl = controlID; break; } case EventType.MouseDrag: { if (GUIUtility.hotControl == controlID) { var pos = GUIUtility.QueryStateObject(typeof(List <int>), controlID) as List <int>; if (pos[0] <= localRect.width && pos[1] <= localRect.height) { texDragOffset.x += Event.current.delta.x; texDragOffset.y += Event.current.delta.y; texDragOffset.x = Mathf.Clamp(texDragOffset.x, -texScaleOffset.x, texScaleOffset.x); texDragOffset.y = Mathf.Clamp(texDragOffset.y, -texScaleOffset.y, texScaleOffset.y); Event.current.Use(); } } break; } case EventType.MouseUp: { if (GUIUtility.hotControl == controlID) { var pos = GUIUtility.QueryStateObject(typeof(List <int>), controlID) as List <int>; if (pos != null && Mathf.Abs(pos[0] - (int)Event.current.mousePosition.x) <= 1 && Mathf.Abs(pos[1] - (int)Event.current.mousePosition.y) <= 1) { var rPos = new Vector2( (pos[0] - texOffset.x) / texSize.x, (pos[1] - texOffset.y) / texSize.y ); for (var i = 0; i < bin.sprites.Length; i++) { var sprite = bin.sprites[i]; var spriteRect = sprite.rect; var rRect = new Rect( spriteRect.x / bin.main.width, (bin.main.height - spriteRect.y - spriteRect.height) / bin.main.height, spriteRect.width / bin.main.width, spriteRect.height / bin.main.height ); if (rRect.Contains(rPos)) { var index = new SpriteIndex(0, sprite.bin, i); if (Event.current.button == 0) { if (!mMultiSelectEnabled || !Event.current.control) { selected.Clear(); selected.Add(index); } else { if (selected.Any(s => s.bin == index.bin && s.sprite == index.sprite)) { selected.RemoveAll(s => s.bin == index.bin && s.sprite == index.sprite); } else { selected.Add(index); } } GUI.FocusControl(""); Event.current.Use(); } break; } } } GUIUtility.hotControl = 0; } break; } } foreach (var index in selected) { if (atlas.bins[index.bin] == bin) { var sprite = bin.sprites[index.sprite]; var spriteRect = sprite.rect; var rRect = new Rect( spriteRect.x / bin.main.width, (bin.main.height - spriteRect.y - spriteRect.height) / bin.main.height, spriteRect.width / bin.main.width, spriteRect.height / bin.main.height ); var tRect = new Rect( rRect.x * texSize.x + texOffset.x, rRect.y * texSize.y + texOffset.y, rRect.width * texSize.x, rRect.height * texSize.y ); Handles.color = Color.green; Handles.DrawPolyLine(new Vector3[] { new Vector3(tRect.x, tRect.y, 0), new Vector3(tRect.xMax, tRect.y, 0), new Vector3(tRect.xMax, tRect.yMax, 0), new Vector3(tRect.x, tRect.yMax, 0), new Vector3(tRect.x, tRect.y, 0) }); Handles.color = Color.white; } } GUI.EndClip(); mOffset = texDragOffset; mScale = texScale; }
public static bool CheckAtlasBinTranparency(BinRaw binRaw) { return(binRaw.addition != null || CheckTextureTranparency(binRaw.main.format)); }
public static PackAtlasSprite ParseSprite(BinRaw binRaw, SpriteRaw spriteRaw) { return(new PackAtlasSprite(binRaw, spriteRaw)); }
protected virtual BinRaw[] PackSprites(PackSetting setting, IPackSprite[] sprites) { var textures = sprites.Select(sprite => new Packer.Area((int)sprite.rect.width, (int)sprite.rect.height)).ToArray(); var spriteRaws = new List <SpriteRaw>(); var packers = new List <Packer>(); var sizeList = PackConst.AtlasSizeList; var maxSize = setting.maxAtlasSize; var padding = setting.padding; var isPOT = forcePowerOf2 || setting.isPOT; var forceSquare = this.forceSquare || setting.forceSquare; var index = 0; while (index < textures.Length) { var texArea = textures[index]; Packer.Rect texRect = null; for (int i = 0; i < packers.Count; i++) { var packer = packers[i]; while (true) { if (packer.Push(texArea, out texRect)) { spriteRaws.Add(new SpriteRaw() { bin = i, rect = new Rect(texRect.x, texRect.y, texRect.width, texRect.height), }); break; } var width = packer.bin.width; var height = packer.bin.height; if (forceSquare) { width *= 2; height *= 2; } else { if (width > height) { height *= 2; } else { width *= 2; } } if (width > maxSize || height > maxSize) { break; } packer.Extend(new Packer.Bin(width, height)); } if (texRect != null) { break; } } if (texRect == null) { packers.Add(new Packer(Packer.Algorithm.AdvancedHorizontalSkyline, new Packer.Bin(sizeList[0], sizeList[0]), padding)); } else { index += 1; } } var bins = new BinRaw[packers.Count]; for (int i = 0; i < packers.Count; i++) { bins[i] = new BinRaw(); bins[i].size = !isPOT && !forceSquare ? Vector2.zero : new Vector2(packers[i].bin.width, packers[i].bin.height); } if (!isPOT && !forceSquare) { for (int i = 0; i < spriteRaws.Count; i++) { var sprite = spriteRaws[i]; var bin = bins[sprite.bin]; bin.size = new Vector2( Mathf.Max(bin.size.x, sprite.rect.xMax), Mathf.Max(bin.size.y, sprite.rect.yMax)); } if (forceMultiplyOf4) { foreach (var bin in bins) { bin.size = new Vector2( Mathf.CeilToInt(bin.size.x / 4) * 4, Mathf.CeilToInt(bin.size.y / 4) * 4); } } } for (int i = 0; i < sprites.Length; i++) { var sprite = sprites[i]; var spriteRaw = spriteRaws[i]; spriteRaw.name = sprite.name.Replace("\\", "/"); spriteRaw.border = sprite.border; spriteRaw.pivot = sprite.pivot; var rect = spriteRaw.rect; var binRaw = bins[spriteRaw.bin]; binRaw.sprites = binRaw.sprites ?? new SpriteRaw[0]; Array.Resize(ref binRaw.sprites, binRaw.sprites.Length + 1); binRaw.sprites[binRaw.sprites.Length - 1] = spriteRaw; var main = binRaw.main; var add = binRaw.addition; var colors = sprite.Read(); if (main == null) { main = PackUtil.CreateBlankTexture((int)binRaw.size.x, (int)binRaw.size.y, !alphaSplit && transparency ? TextureFormat.RGBA32 : TextureFormat.RGB24); main.hideFlags = HideFlags.DontUnloadUnusedAsset; binRaw.main = main; } main.SetPixels( (int)rect.x, (int)rect.y, (int)rect.width, (int)rect.height, colors); if (alphaSplit && transparency) { if (add == null) { add = PackUtil.CreateBlankTexture((int)binRaw.size.x, (int)binRaw.size.y, TextureFormat.RGB24); add.hideFlags = HideFlags.DontUnloadUnusedAsset; binRaw.addition = add; } for (int c = 0; c < colors.Length; c++) { colors[c] = new Color(colors[c].a, 0, 0); } add.SetPixels( (int)rect.x, (int)rect.y, (int)rect.width, (int)rect.height, colors); } } return(bins); }