private void updateRectangles()
    {
        DateTime  start   = DateTime.Now;
        const int padding = 1;

        if (mPacker == null)
        {
            mPacker = new RectanglePacker((int)sliderWidth.value, (int)sliderHeight.value, padding);
        }
        else
        {
            mPacker.reset((int)sliderWidth.value, (int)sliderHeight.value, padding);
        }

        for (int i = 0; i < RECTANGLE_COUNT; i++)
        {
            mPacker.insertRectangle((int)mRectangles[i].width, (int)mRectangles[i].height, i);
        }

        mPacker.packRectangles();
        Clear();
        DateTime end = DateTime.Now;

        if (mPacker.rectangleCount > 0)
        {
            packingTimeText.text = mPacker.rectangleCount + " rectangles packed in " + (end - start).Milliseconds + "ms";
            IntegerRectangle rect = new IntegerRectangle();
            for (int j = 0; j < mPacker.rectangleCount; j++)
            {
                rect = mPacker.getRectangle(j, rect);
                int       index   = mPacker.getRectangleId(j);
                Texture2D texture = textures[index];
                SetTexture(texture, IntegerRectangle2Rect(rect));
            }
        }
    }
        private void updateRectangles()
        {
            DateTime  start   = DateTime.Now;
            const int padding = 1;

            if (mPacker == null)
            {
                mPacker = new RectanglePacker((int)sliderWidth.value, (int)sliderHeight.value, padding);
            }
            else
            {
                mPacker.reset((int)sliderWidth.value, (int)sliderHeight.value, padding);
            }

            for (int i = 0; i < RECTANGLE_COUNT; i++)
            {
                mPacker.insertRectangle((int)mRectangles[i].width, (int)mRectangles[i].height, i);
            }

            mPacker.packRectangles();

            DateTime end = DateTime.Now;

            if (mPacker.rectangleCount > 0)
            {
                packingTimeText.text = mPacker.rectangleCount + " rectangles packed in " + (end - start).Milliseconds + "ms";

                mTexture.SetPixels32(mFillColor);
                IntegerRectangle rect = new IntegerRectangle();
                Color32[]        tmpColor;

                for (int j = 0; j < mPacker.rectangleCount; j++)
                {
                    rect = mPacker.getRectangle(j, rect);

                    int size = rect.width * rect.height;

                    tmpColor = new Color32[size];
                    for (int k = 0; k < size; ++k)
                    {
                        tmpColor[k] = Color.black;
                    }

                    mTexture.SetPixels32(rect.x, rect.y, rect.width, rect.height, tmpColor);

                    int   index = mPacker.getRectangleId(j);
                    Color color = convertHexToRGBA((uint)(0xFF171703 + (((18 * ((index + 4) % 13)) << 16) + ((31 * ((index * 3) % 8)) << 8) + 63 * (((index + 1) * 3) % 5))));

                    size -= 4;

                    tmpColor = new Color32[size];
                    for (int k = 0; k < size; ++k)
                    {
                        tmpColor[k] = color;
                    }

                    mTexture.SetPixels32(rect.x + 1, rect.y + 1, rect.width - 2, rect.height - 2, tmpColor);
                }

                mTexture.Apply();
            }
        }
        public bool Push(string key, Texture2D texture)
        {
            if (string.IsNullOrEmpty(key))
            {
                return(true);
            }

            if (texture == null)
            {
                return(true);
            }

            for (int i = 0; i < m_sprites.Count; i++)
            {
                m_sprites[i].index = i;
                m_sprites[i].color = m_texture.GetPixels((int)m_sprites[i].rect.x, (int)m_sprites[i].rect.y, (int)m_sprites[i].rect.width, (int)m_sprites[i].rect.height);
            }

            m_sprites.Add(new DynamicSprite()
            {
                key   = key,
                index = -1,
                rect  = new Rect(0, 0, texture.width, texture.height),
                color = texture.GetPixels(),
            });

            m_packer.reset(width, height, padding);

            for (int i = 0; i < m_sprites.Count; i++)
            {
                m_packer.insertRectangle((int)m_sprites[i].rect.width, (int)m_sprites[i].rect.height, m_sprites[i].index);
            }

            int count = m_packer.packRectangles();

            enough = m_sprites.Count > count;

            if (enough)
            {
                m_sprites.RemoveAt(m_sprites.FindIndex(x => x.key == key));

                for (int i = 0; i < m_sprites.Count; i++)
                {
                    m_sprites[i].color = null;
                }

                return(false);
            }
            else
            {
                if (texture != null)
                {
                    texture = null;
                }

                if (m_texture.format != TextureFormat.RGBA32)
                {
                    Object.Destroy(m_texture);

                    m_texture = new Texture2D(width, height, TextureFormat.RGBA32, false);
                }
                m_texture.SetPixels32(m_color);

                IntegerRectangle rect = new IntegerRectangle();

                Color32[] color;

                int index, id, size;

                for (int i = 0; i < count; i++)
                {
                    rect = m_packer.getRectangle(i, rect);

                    id = m_packer.getRectangleId(i);

                    index = m_sprites.FindIndex(x => x.index == id);

                    if (index != -1)
                    {
                        m_sprites[index].rect = new Rect(rect.x, rect.y, rect.width, rect.height);

                        color = new Color32[m_sprites[index].color.Length];

                        for (int j = 0; j < m_sprites[index].color.Length; j++)
                        {
                            color[j] = m_sprites[index].color[j];
                        }
                    }
                    else
                    {
                        size = rect.width * rect.height;

                        color = new Color32[size];

                        for (int j = 0; j < size; j++)
                        {
                            color[j] = Color.black;
                        }
                    }
                    m_texture.SetPixels32(rect.x, rect.y, rect.width, rect.height, color);
                }

                for (int i = 0; i < m_sprites.Count; i++)
                {
                    m_sprites[i].color = null;
                }

                if (compress)
                {
                    m_texture.Compress(true);
                }

                m_texture.Apply();

                return(true);
            }
        }