Ejemplo n.º 1
0
    public static Rect[] PackTextures(Texture2D texture, Texture2D[] textures, int width, int height, int padding, int maxSize)
    {
        if(width > maxSize && height > maxSize) return null;
        if(width > maxSize || height > maxSize) { int temp = width; width = height; height = temp; }

        UITexturePacker bp = new UITexturePacker(width, height, false);
        Rect[] rects = new Rect[textures.Length];

        for(int i = 0; i < textures.Length; i++)
        {
            Texture2D tex = textures[i];

            Rect rect = new Rect();

            for (int xPadding = 1; xPadding >=0; --xPadding)
            {
                for (int yPadding = 1; yPadding >= 0; --yPadding)
                {
                    rect = bp.Insert(tex.width + (xPadding * padding), tex.height + (yPadding * padding), UITexturePacker.FreeRectChoiceHeuristic.RectBestAreaFit);

                    if (rect.width != 0 && rect.height != 0)
                    {
                        break;
                    }
                    // After having no padding if it still doesnt fit increase texture size.
                    else if (xPadding == 0 && yPadding == 0)
                    {
                        return PackTextures(texture, textures, width * (width <= height ? 2 : 1), height * (height < width ? 2 : 1), padding, maxSize);
                    }
                }
                if (rect.width != 0 && rect.height != 0)
                {
                    break;
                }
            }
            rects[i] = rect;
        }

        texture.Resize(width, height);
        texture.SetPixels(new Color[width * height]);

        for(int i = 0; i < textures.Length; i++)
        {
            Texture2D tex = textures[i];
            Rect rect = rects[i];
            Color[] colors = tex.GetPixels();

            if(rect.width != tex.width + padding)
            {
                Color[] newColors = tex.GetPixels();

                for(int x = 0; x < rect.width; x++)
                {
                    for(int y = 0; y < rect.height; y++)
                    {
                        int prevIndex = ((int)rect.height - (y + 1)) + x * (int)tex.width;
                        newColors[x + y * (int)rect.width] = colors[prevIndex];
                    }
                }

                colors = newColors;
            }

            texture.SetPixels((int)rect.x, (int)rect.y, (int)rect.width - padding, (int)rect.height - padding, colors);
            rect.x /= width;
            rect.y /= height;
            rect.width = (rect.width- padding) / width ;
            rect.height = (rect.height - padding) / height;
            rects[i] = rect;
        }
        return rects;
    }
Ejemplo n.º 2
0
	public static Rect[] PackTextures (Texture2D texture, Texture2D[] textures, int width, int height, int padding, int maxSize)
	{
		if (width > maxSize && height > maxSize) return null;
		if (width > maxSize || height > maxSize) { int temp = width; width = height; height = temp; }
		
		// Force square by sizing up
		if (NGUISettings.forceSquareAtlas)
		{
			if (width > height)
				height = width;
			else if (height > width)
				width = height;
		}
		UITexturePacker bp = new UITexturePacker(width, height, false);
		Storage[] storage = new Storage[textures.Length];

		for (int i = 0; i < textures.Length; i++)
		{
			Texture2D tex = textures[i];
			if (!tex) continue;

			Rect rect = new Rect();

			int xPadding = 1;
			int yPadding = 1;

			for (xPadding = 1; xPadding >= 0; --xPadding)
			{
				for (yPadding = 1; yPadding >= 0; --yPadding)
				{
					rect = bp.Insert(tex.width + (xPadding * padding), tex.height + (yPadding * padding),
						UITexturePacker.FreeRectChoiceHeuristic.RectBestAreaFit);
					if (rect.width != 0 && rect.height != 0) break;

					// After having no padding if it still doesn't fit -- increase texture size.
					else if (xPadding == 0 && yPadding == 0)
					{
						return PackTextures(texture, textures, width * (width <= height ? 2 : 1),
							height * (height < width ? 2 : 1), padding, maxSize);
					}
				}
				if (rect.width != 0 && rect.height != 0) break;
			}

			storage[i] = new Storage();
			storage[i].rect = rect;
			storage[i].paddingX = (xPadding != 0);
			storage[i].paddingY = (yPadding != 0);
		}

		texture.Resize(width, height);
		texture.SetPixels(new Color[width * height]);

		// The returned rects
		Rect[] rects = new Rect[textures.Length];

		for (int i = 0; i < textures.Length; i++)
		{
			Texture2D tex = textures[i];
			if (!tex) continue;

			Rect rect = storage[i].rect;
			int xPadding = (storage[i].paddingX ? padding : 0);
			int yPadding = (storage[i].paddingY ? padding : 0);
			Color[] colors = tex.GetPixels();

			// Would be used to rotate the texture if need be.
			if (rect.width != tex.width + xPadding)
			{
				Color[] newColors = tex.GetPixels();

				for (int x = 0; x < rect.width; x++)
				{
					for (int y = 0; y < rect.height; y++)
					{
						int prevIndex = ((int)rect.height - (y + 1)) + x * (int)tex.width;
						newColors[x + y * (int)rect.width] = colors[prevIndex];
					}
				}

				colors = newColors;
			}

			texture.SetPixels((int)rect.x, (int)rect.y, (int)rect.width - xPadding, (int)rect.height - yPadding, colors);
			rect.x /= width;
			rect.y /= height;
			rect.width = (rect.width - xPadding) / width;
			rect.height = (rect.height - yPadding) / height;
			rects[i] = rect;
		}
		texture.Apply();
		return rects;
	}
Ejemplo n.º 3
0
    public static Rect[] PackTextures(Texture2D texture, Texture2D[] textures, int width, int height, int padding, int maxSize)
    {
        if (width > maxSize && height > maxSize)
        {
            return(null);
        }
        if (width > maxSize || height > maxSize)
        {
            int temp = width; width = height; height = temp;
        }

        UITexturePacker bp = new UITexturePacker(width, height, false);

        Rect[] rects = new Rect[textures.Length];

        for (int i = 0; i < textures.Length; i++)
        {
            Texture2D tex = textures[i];

            Rect rect = new Rect();

            for (int xPadding = 1; xPadding >= 0; --xPadding)
            {
                for (int yPadding = 1; yPadding >= 0; --yPadding)
                {
                    rect = bp.Insert(tex.width + (xPadding * padding), tex.height + (yPadding * padding), UITexturePacker.FreeRectChoiceHeuristic.RectBestAreaFit);

                    if (rect.width != 0 && rect.height != 0)
                    {
                        break;
                    }
                    // After having no padding if it still doesnt fit increase texture size.
                    else if (xPadding == 0 && yPadding == 0)
                    {
                        return(PackTextures(texture, textures, width * (width <= height ? 2 : 1), height * (height < width ? 2 : 1), padding, maxSize));
                    }
                }
                if (rect.width != 0 && rect.height != 0)
                {
                    break;
                }
            }
            rects[i] = rect;
        }

        texture.Resize(width, height);
        texture.SetPixels(new Color[width * height]);

        for (int i = 0; i < textures.Length; i++)
        {
            Texture2D tex    = textures[i];
            Rect      rect   = rects[i];
            Color[]   colors = tex.GetPixels();

            if (rect.width != tex.width + padding)
            {
                Color[] newColors = tex.GetPixels();

                for (int x = 0; x < rect.width; x++)
                {
                    for (int y = 0; y < rect.height; y++)
                    {
                        int prevIndex = ((int)rect.height - (y + 1)) + x * (int)tex.width;
                        newColors[x + y * (int)rect.width] = colors[prevIndex];
                    }
                }

                colors = newColors;
            }

            texture.SetPixels((int)rect.x, (int)rect.y, (int)rect.width - padding, (int)rect.height - padding, colors);
            rect.x     /= width;
            rect.y     /= height;
            rect.width  = (rect.width - padding) / width;
            rect.height = (rect.height - padding) / height;
            rects[i]    = rect;
        }
        return(rects);
    }
Ejemplo n.º 4
0
    public static Rect[] PackTextures(Texture2D texture, Texture2D[] textures, int width, int height, int padding, int maxSize)
    {
        if (width > maxSize && height > maxSize)
        {
            return(null);
        }
        if (width > maxSize || height > maxSize)
        {
            int temp = width; width = height; height = temp;
        }

        // Force square by sizing up
        if (NGUISettings.forceSquareAtlas)
        {
            if (width > height)
            {
                height = width;
            }
            else if (height > width)
            {
                width = height;
            }
        }
        UITexturePacker bp = new UITexturePacker(width, height, false);

        Storage[] storage = new Storage[textures.Length];

        for (int i = 0; i < textures.Length; i++)
        {
            Texture2D tex = textures[i];

            Rect rect = new Rect();

            int xPadding = 1;
            int yPadding = 1;

            for (xPadding = 1; xPadding >= 0; --xPadding)
            {
                for (yPadding = 1; yPadding >= 0; --yPadding)
                {
                    rect = bp.Insert(tex.width + (xPadding * padding), tex.height + (yPadding * padding),
                                     UITexturePacker.FreeRectChoiceHeuristic.RectBestAreaFit);
                    if (rect.width != 0 && rect.height != 0)
                    {
                        break;
                    }

                    // After having no padding if it still doesn't fit -- increase texture size.
                    else if (xPadding == 0 && yPadding == 0)
                    {
                        return(PackTextures(texture, textures, width * (width <= height ? 2 : 1),
                                            height * (height < width ? 2 : 1), padding, maxSize));
                    }
                }
                if (rect.width != 0 && rect.height != 0)
                {
                    break;
                }
            }

            storage[i]          = new Storage();
            storage[i].rect     = rect;
            storage[i].paddingX = (xPadding != 0);
            storage[i].paddingY = (yPadding != 0);
        }

        texture.Resize(width, height);
        texture.SetPixels(new Color[width * height]);

        // The returned rects
        Rect[] rects = new Rect[textures.Length];

        for (int i = 0; i < textures.Length; i++)
        {
            Texture2D tex      = textures[i];
            Rect      rect     = storage[i].rect;
            int       xPadding = (storage[i].paddingX ? padding : 0);
            int       yPadding = (storage[i].paddingY ? padding : 0);
            Color[]   colors   = tex.GetPixels();

            // Would be used to rotate the texture if need be.
            if (rect.width != tex.width + xPadding)
            {
                Color[] newColors = tex.GetPixels();

                for (int x = 0; x < rect.width; x++)
                {
                    for (int y = 0; y < rect.height; y++)
                    {
                        int prevIndex = ((int)rect.height - (y + 1)) + x * (int)tex.width;
                        newColors[x + y * (int)rect.width] = colors[prevIndex];
                    }
                }

                colors = newColors;
            }

            texture.SetPixels((int)rect.x, (int)rect.y, (int)rect.width - xPadding, (int)rect.height - yPadding, colors);
            rect.x     /= width;
            rect.y     /= height;
            rect.width  = (rect.width - xPadding) / width;
            rect.height = (rect.height - yPadding) / height;
            rects[i]    = rect;
        }
        return(rects);
    }
Ejemplo n.º 5
0
    /// <summary>
    /// 以4为基础值 大小不够则乘以2扩充图片大小
    /// </summary>
    /// <returns></returns>
    public static Rect[] PackTextures(Texture2D texture, Texture2D[] textures, int width, int height, int padding, int maxSize)
    {
        if (width > maxSize && height > maxSize)
        {
            return(null);
        }
        if (width > maxSize || height > maxSize)
        {
            int temp = width; width = height; height = temp;
        }

        UITexturePacker bp = new UITexturePacker(width, height, false);

        Storage[] storage = new Storage[textures.Length];

        for (int i = 0; i < textures.Length; i++)
        {
            Texture2D tex = textures[i];
            if (!tex)
            {
                continue;
            }

            Rect rect = new Rect();

            int xPadding = 1;
            int yPadding = 1;

            for (xPadding = 1; xPadding >= 0; --xPadding)
            {
                for (yPadding = 1; yPadding >= 0; --yPadding)
                {
                    rect = bp.Insert(tex.width + (xPadding * padding), tex.height + (yPadding * padding),
                                     UITexturePacker.FreeRectChoiceHeuristic.RectBestLongSideFit);
                    if (rect.width != 0 && rect.height != 0)
                    {
                        break;
                    }

                    // After having no padding if it still doesn't fit -- increase texture size.
                    else if (xPadding == 0 && yPadding == 0)
                    {
                        return(PackTextures(texture, textures, width * (width <= height ? 2 : 1),
                                            height * (height < width ? 2 : 1), padding, maxSize));
                    }
                }
                if (rect.width != 0 && rect.height != 0)
                {
                    break;
                }
            }

            storage[i]          = new Storage();
            storage[i].rect     = rect;
            storage[i].paddingX = (xPadding != 0);
            storage[i].paddingY = (yPadding != 0);
        }
        currentTexSize = new Vector2(width, height);
        int maxTexSize = Mathf.Max(width, height);//如果只按宽高是最优的图片大小,现在改成和Bitfont一样 导出正方形图

        texture.Resize(maxTexSize, maxTexSize);
        texture.SetPixels(new Color[maxTexSize * maxTexSize]);

        // The returned rects
        Rect[] rects = new Rect[textures.Length];

        for (int i = 0; i < textures.Length; i++)
        {
            Texture2D tex = textures[i];
            if (!tex)
            {
                continue;
            }

            Rect    rect     = storage[i].rect;
            int     xPadding = (storage[i].paddingX ? padding : 0);
            int     yPadding = (storage[i].paddingY ? padding : 0);
            Color[] colors   = tex.GetPixels();

            // Would be used to rotate the texture if need be.
            if (rect.width != tex.width + xPadding)
            {
                Color[] newColors = tex.GetPixels();

                for (int x = 0; x < rect.width; x++)
                {
                    for (int y = 0; y < rect.height; y++)
                    {
                        int prevIndex = ((int)rect.height - (y + 1)) + x * (int)tex.width;
                        newColors[x + y * (int)rect.width] = colors[prevIndex];
                    }
                }

                colors = newColors;
            }
            float ry = maxTexSize - rect.y - rect.height;//原来是从下往上写入,现在修改成和bitfont导出设置一样,从上往下写入!
            texture.SetPixels((int)rect.x, (int)ry, (int)rect.width - xPadding, (int)rect.height - yPadding, colors);
            rect.x     /= width;
            rect.y     /= height;
            rect.width  = (rect.width - xPadding) / width;
            rect.height = (rect.height - yPadding) / height;
            rects[i]    = rect;
        }
        texture.Apply();
        return(rects);
    }