예제 #1
0
        public byte[] GetSpriteFromAtlas(UISpriteData es)
        {
            if (m_tet2dAtlasImage == null)
            {
                return(null);
            }
            m_iWidthMin  = Mathf.Clamp(es.x, 0, m_iAtlasImageWidth);
            m_iHeightMin = Mathf.Clamp(es.y, 0, m_iAtlasImageHeight);
            m_iWidthMax  = Mathf.Min(m_iWidthMin + es.width, m_iAtlasImageWidth - 1);
            m_iHeightMax = Mathf.Min(m_iHeightMin + es.height, m_iAtlasImageHeight - 1);
            m_iNewWidth  = Mathf.Clamp(es.width, 0, m_iAtlasImageWidth);
            m_iNewHeight = Mathf.Clamp(es.height, 0, m_iAtlasImageHeight);

            if (m_iNewWidth == 0 || m_iNewHeight == 0)
            {
                return(null);
            }
            m_c32arrNewPixels = new Color32[m_iNewWidth * m_iNewHeight];

            for (int y = 0; y < m_iNewHeight; ++y)
            {
                m_iCopyHeight = m_iHeightMin + y;
                if (m_iCopyHeight > m_iHeightMax)
                {
                    m_iCopyHeight = m_iHeightMax;
                }
                for (int x = 0; x < m_iNewWidth; ++x)
                {
                    m_iCopyWidth = m_iWidthMin + x;
                    if (m_iCopyWidth > m_iWidthMax)
                    {
                        m_iCopyWidth = m_iWidthMax;
                    }
                    int newIndex = (m_iNewHeight - 1 - y) * m_iNewWidth + x;
                    int oldIndex = (m_iAtlasImageHeight - 1 - m_iCopyHeight) * m_iAtlasImageWidth + m_iCopyWidth;

                    m_c32arrNewPixels[newIndex] = m_carrAtlasImage[oldIndex];
                }
            }

            m_spriteEntry = new UIAtlasMaker.SpriteEntry();
            m_spriteEntry.CopyFrom(es);
            m_spriteEntry.SetRect(0, 0, m_iNewWidth, m_iNewHeight);
            m_spriteEntry.temporaryTexture = true;
            m_spriteEntry.tex = new Texture2D(m_iNewWidth, m_iNewHeight);
            m_spriteEntry.tex.SetPixels32(m_c32arrNewPixels);
            m_spriteEntry.tex.Apply();
            m_c32arrNewPixels = null;
            return(m_spriteEntry.tex.EncodeToPNG());
        }
예제 #2
0
    /// <summary>
    /// 从图集纹理中分解特定的sprite
    /// </summary>
    SpriteEntry ExtractSprite(UISpriteData es, Color32[] oldPixels, int oldWidth, int oldHeight)
    {
        int xmin      = Mathf.Clamp(es.x, 0, oldWidth);
        int ymin      = Mathf.Clamp(es.y, 0, oldHeight);
        int xmax      = Mathf.Min(xmin + es.width, oldWidth - 1);
        int ymax      = Mathf.Min(ymin + es.height, oldHeight - 1);
        int newWidth  = Mathf.Clamp(es.width, 0, oldWidth);
        int newHeight = Mathf.Clamp(es.height, 0, oldHeight);

        if (newWidth == 0 || newHeight == 0)
        {
            return(null);
        }

        Color32[] newPixels = new Color32[newWidth * newHeight];

        for (int y = 0; y < newHeight; ++y)
        {
            int cy = ymin + y;
            if (cy > ymax)
            {
                cy = ymax;
            }

            for (int x = 0; x < newWidth; ++x)
            {
                int cx = xmin + x;
                if (cx > xmax)
                {
                    cx = xmax;
                }

                int newIndex = (newHeight - 1 - y) * newWidth + x;
                int oldIndex = (oldHeight - 1 - cy) * oldWidth + cx;

                newPixels[newIndex] = oldPixels[oldIndex];
            }
        }

        // Create a new sprite
        SpriteEntry sprite = new SpriteEntry();

        sprite.CopyFrom(es);
        sprite.SetRect(0, 0, newWidth, newHeight);
        sprite.SetTexture(newPixels, newWidth, newHeight);
        return(sprite);
    }
예제 #3
0
    static public List <UIAtlasMaker.SpriteEntry> CreateSprites(List <Texture> textures)
    {
        List <UIAtlasMaker.SpriteEntry> list = new List <UIAtlasMaker.SpriteEntry>();

        foreach (Texture tex in textures)
        {
            Texture2D oldTex = NGUIEditorTools.ImportTexture(tex, true, false, true);
            if (oldTex == null)
            {
                oldTex = tex as Texture2D;
            }
            if (oldTex == null)
            {
                continue;
            }

            // If we aren't doing trimming, just use the texture as-is
            if (!NGUISettings.atlasTrimming && !NGUISettings.atlasPMA)
            {
                UIAtlasMaker.SpriteEntry sprite = new UIAtlasMaker.SpriteEntry();
                sprite.SetRect(0, 0, oldTex.width, oldTex.height);
                sprite.tex = oldTex;
                if (oldTex.name.EndsWith("zoomed"))
                {
                    sprite.name = oldTex.name.Substring(0, oldTex.name.Length - "zoomed".Length);
                }
                else
                {
                    sprite.name = oldTex.name;
                }
                sprite.temporaryTexture = false;
                list.Add(sprite);
                continue;
            }

            #region 屏蔽NGUI设定项

            // If we want to trim transparent pixels, there is more work to be done
            Color32[] pixels = oldTex.GetPixels32();

            int xmin      = oldTex.width;
            int xmax      = 0;
            int ymin      = oldTex.height;
            int ymax      = 0;
            int oldWidth  = oldTex.width;
            int oldHeight = oldTex.height;

            // Find solid pixels
            if (NGUISettings.atlasTrimming)
            {
                for (int y = 0, yw = oldHeight; y < yw; ++y)
                {
                    for (int x = 0, xw = oldWidth; x < xw; ++x)
                    {
                        Color32 c = pixels[y * xw + x];

                        if (c.a != 0)
                        {
                            if (y < ymin)
                            {
                                ymin = y;
                            }
                            if (y > ymax)
                            {
                                ymax = y;
                            }
                            if (x < xmin)
                            {
                                xmin = x;
                            }
                            if (x > xmax)
                            {
                                xmax = x;
                            }
                        }
                    }
                }
            }
            else
            {
                xmin = 0;
                xmax = oldWidth - 1;
                ymin = 0;
                ymax = oldHeight - 1;
            }

            int newWidth  = (xmax - xmin) + 1;
            int newHeight = (ymax - ymin) + 1;

            if (newWidth > 0 && newHeight > 0)
            {
                UIAtlasMaker.SpriteEntry sprite = new UIAtlasMaker.SpriteEntry();
                sprite.x      = 0;
                sprite.y      = 0;
                sprite.width  = oldTex.width;
                sprite.height = oldTex.height;

                // If the dimensions match, then nothing was actually trimmed
                if (!NGUISettings.atlasPMA && (newWidth == oldWidth && newHeight == oldHeight))
                {
                    sprite.tex = oldTex;
                    if (oldTex.name.EndsWith("zoomed"))
                    {
                        sprite.name = oldTex.name.Substring(0, oldTex.name.Length - "zoomed".Length);
                    }
                    else
                    {
                        sprite.name = oldTex.name;
                    }
                    sprite.temporaryTexture = false;
                }
                else
                {
                    // Copy the non-trimmed texture data into a temporary buffer
                    Color32[] newPixels = new Color32[newWidth * newHeight];

                    for (int y = 0; y < newHeight; ++y)
                    {
                        for (int x = 0; x < newWidth; ++x)
                        {
                            int newIndex = y * newWidth + x;
                            int oldIndex = (ymin + y) * oldWidth + (xmin + x);
                            if (NGUISettings.atlasPMA)
                            {
                                newPixels[newIndex] = NGUITools.ApplyPMA(pixels[oldIndex]);
                            }
                            else
                            {
                                newPixels[newIndex] = pixels[oldIndex];
                            }
                        }
                    }

                    // Create a new texture
                    sprite.temporaryTexture = true;
                    if (oldTex.name.EndsWith("zoomed"))
                    {
                        sprite.name = oldTex.name.Substring(0, oldTex.name.Length - "zoomed".Length);
                    }
                    else
                    {
                        sprite.name = oldTex.name;
                    }
                    sprite.tex = new Texture2D(newWidth, newHeight);
                    sprite.tex.SetPixels32(newPixels);
                    sprite.tex.Apply();

                    // Remember the padding offset
                    sprite.SetPadding(xmin, ymin, oldWidth - newWidth - xmin, oldHeight - newHeight - ymin);
                }
                list.Add(sprite);
            }
            #endregion
        }
        return(list);
    }