public void SetValues(List<KeyValuePair<string, int>> values, int ofTotal)
        {
            m_Slices = new List<SliceSettings>(values.Count);

            float tally = 0.0f;
            for (int i = 0; i < values.Count; i++)
            {
                if (values[i].Value == 0)
                    continue;

                SliceSettings slice = new SliceSettings();
                slice.startValue = tally;
                tally += values[i].Value / (float)ofTotal;
                if (tally > 1.0f) {
                    Debug.Log("SHOULD NEVER HAPPEN");
                    tally = 1.0f;
                }
                slice.endValue = tally;

                Color32 c = Config.instance.GetTypeColor(values[i].Key);

                slice.innerColor = c;
                slice.outterColor = c;

                m_Slices.Add(slice);
            }

            Invalidate();
        }
Exemple #2
0
        public void SetValues(List <KeyValuePair <string, int> > values, int ofTotal)
        {
            m_Slices = new List <SliceSettings>(values.Count);

            float tally = 0.0f;

            for (int i = 0; i < values.Count; i++)
            {
                if (values[i].Value == 0)
                {
                    continue;
                }

                SliceSettings slice = new SliceSettings();
                slice.startValue = tally;
                tally           += values[i].Value / (float)ofTotal;
                if (tally > 1.0f)
                {
                    Debug.Log("SHOULD NEVER HAPPEN");
                    tally = 1.0f;
                }
                slice.endValue = tally;

                Color32 c = Config.instance.GetTypeColor(values[i].Key);

                slice.innerColor  = c;
                slice.outterColor = c;

                m_Slices.Add(slice);
            }

            Invalidate();
        }
    public static Sprite GetPiece(int value, SliceSettings settings)
    {
        if (settings.CachedPieces.ContainsKey(value))
        {
            return(settings.CachedPieces[value]);
        }

        var piece = GeneratePiece(value, settings);

        settings.CachedPieces.Add(value, piece);
        return(piece);
    }
Exemple #4
0
        public int[] GetSlices(SliceSettings settings, Bitmap image)
        {
            var sliceCount  = settings.SliceCount;
            var imageHeight = image.Height;

            var resultSlices = new List <int>();

            for (var i = 1; i <= sliceCount; i++)
            {
                resultSlices.Add((int)((double)imageHeight * i / sliceCount));
            }
            return(resultSlices.ToArray());
        }
    public static Piece[] SliceImage(Sprite image, int[,] connectionsMap, Sprite connection)
    {
        var puzzleWidth  = connectionsMap.GetLength(0);
        var puzzleHeight = connectionsMap.GetLength(1);

        var pieces = new Piece[puzzleWidth * puzzleHeight];

        var     order          = 0;
        Vector3 imagePivot     = new Vector3(image.pivot.x / image.rect.width, image.pivot.y / image.rect.height);
        var     imageWorldSize = new Vector3(image.rect.width, image.rect.height) / image.pixelsPerUnit;
        var     pieceWorldSize = new Vector3(imageWorldSize.x / puzzleWidth, imageWorldSize.y / puzzleHeight);
        var     offset         = Vector3.Scale(imageWorldSize, imagePivot);

        var halfPieceSize = pieceWorldSize * 0.5f;
        var puzzleSize    = new Vector2Int((int)image.rect.width / puzzleWidth, (int)image.rect.height / puzzleHeight);

        var sliceSettings = new SliceSettings()
        {
            ConnectionSprite = connection,
            Connections      = GenerateConnections(connection),
            PieceTextureSize = puzzleSize,
            PieceTemplate    = template,
            CachedPieces     = new Dictionary <int, Sprite>()
        };

        for (int ix = 0; ix < puzzleWidth; ++ix)
        {
            for (int iy = 0; iy < puzzleHeight; ++iy)
            {
                var piece = Object.Instantiate(template);
                piece.SpriteRenderer.sprite = image;
                piece.Collider.size         = pieceWorldSize;
                piece.Position    = new Vector2Int(ix, iy);
                piece.Mask.sprite = GetPiece(connectionsMap[ix, iy], sliceSettings);

                piece.SpriteRenderer.transform.localPosition = offset - new Vector3(ix * pieceWorldSize.x, iy * pieceWorldSize.y) - halfPieceSize;                // + offset;// - halfPieceSize;

                piece.SortingOrder            = order;
                pieces[iy * puzzleWidth + ix] = piece;
                ++order;
            }
        }

        return(pieces);
    }
Exemple #6
0
        private static (int Min, int Max) GetMinMaxHeight(SliceSettings settings, int imageHeight, int previousSlice)
        {
            if (settings.TrueSliceMaxHeight == 0)
            {
                var sliceStep       = imageHeight / settings.SliceCount;
                var nextSliceCenter = previousSlice + sliceStep;

                var min = AdditionalMath.Clamp(previousSlice, imageHeight,
                                               nextSliceCenter - settings.TrueSliceMaxDistance / 2);
                var max = AdditionalMath.Clamp(previousSlice, imageHeight,
                                               nextSliceCenter + settings.TrueSliceMaxDistance / 2);

                return(imageHeight - max < settings.TrueSliceMinHeight ? (imageHeight, imageHeight) : (min, max));
            }
            else
            {
                var min = AdditionalMath.Clamp(previousSlice, imageHeight, previousSlice + settings.TrueSliceMinHeight);
                var max = AdditionalMath.Clamp(previousSlice, imageHeight, previousSlice + settings.TrueSliceMaxHeight);

                return(imageHeight - max < settings.TrueSliceMinHeight ? (imageHeight, imageHeight) : (min, max));
            }
        }
    private static Vector2Int GetTextureSize(int value, SliceSettings settings)
    {
        var result = settings.PieceTextureSize;

        if (value.Contains(PieceValues.Left))
        {
            result.x += settings.Connections[PieceValues.Left].width;
        }
        if (value.Contains(PieceValues.Right))
        {
            result.x += settings.Connections[PieceValues.Right].width;
        }
        if (value.Contains(PieceValues.Top))
        {
            result.y += settings.Connections[PieceValues.Top].height;
        }
        if (value.Contains(PieceValues.Bottom))
        {
            result.y += settings.Connections[PieceValues.Bottom].height;
        }

        return(result);
    }
Exemple #8
0
        public int[] GetSlices(SliceSettings settings, Bitmap image)
        {
            var previousSlice = 0;
            var imageHeight   = image.Height;
            var resultSlices  = new List <int>();
            var imageData     = GetByteArrayFromBitmap(image);

            while (previousSlice != imageHeight)
            {
                var(minSlice, maxSlice) = GetMinMaxHeight(settings, image.Height, previousSlice);
                var slice = GetSlice(image, minSlice, maxSlice, settings.TrueSliceHeight,
                                     settings.TrueSliceColorDifference, imageData);

                if (slice == -1)
                {
                    slice = minSlice + (maxSlice - minSlice) / 2;
                }

                previousSlice = slice;
                resultSlices.Add(previousSlice);
            }

            return(resultSlices.ToArray());
        }
Exemple #9
0
 public StartSettings()
 {
     ConcatSettings = new ConcatSettings();
     SliceSettings  = new SliceSettings();
 }
    public static Sprite GeneratePiece(int value, SliceSettings settings)
    {
        var connections = settings.Connections;

        var x       = value.Contains(PieceValues.Left) ? connections[PieceValues.Left].width : 0;
        var y       = value.Contains(PieceValues.Bottom) ? connections[PieceValues.Bottom].height : 0;
        var middleX = x + settings.PieceTextureSize.x / 2;
        var middleY = y + settings.PieceTextureSize.y / 2;

        var texSize = GetTextureSize(value, settings);

        var tex = new Texture2D(texSize.x, texSize.y, textureFormat, false);

        tex.filterMode = FilterMode.Point;
        tex.Fill(alphaColor);
        tex.Fill(new Rect(x, y, settings.PieceTextureSize.x, settings.PieceTextureSize.y), pieceColor);

        if (value.Contains(PieceValues.Right))
        {
            var startX = x + settings.PieceTextureSize.x;
            var startY = middleY - connections[PieceValues.Right].height / 2;

            tex.DrawTexture(connections[PieceValues.Right], new Vector2Int(startX, startY));
        }
        else if (value.Contains(PieceValues.RightNeighbord))
        {
            var startX = texSize.x - connections[PieceValues.Left].width;
            var startY = middleY - connections[PieceValues.Left].height / 2;

            tex.Cut(connections[PieceValues.Left], new Vector2Int(startX, startY));
        }

        if (value.Contains(PieceValues.Left))
        {
            var startX = 0;
            var startY = middleY - connections[PieceValues.Left].height / 2;

            tex.DrawTexture(connections[PieceValues.Left], new Vector2Int(startX, startY));
        }
        else if (value.Contains(PieceValues.LeftNeighbord))
        {
            var startX = 0;
            var startY = middleY - connections[PieceValues.Right].height / 2;

            tex.Cut(connections[PieceValues.Right], new Vector2Int(startX, startY));
        }

        if (value.Contains(PieceValues.Top))
        {
            var startX = middleX - connections[PieceValues.Top].width / 2;
            var startY = y + settings.PieceTextureSize.y;

            tex.DrawTexture(connections[PieceValues.Top], new Vector2Int(startX, startY));
        }
        else if (value.Contains(PieceValues.TopNeighbord))
        {
            var startX = middleX - connections[PieceValues.Bottom].width / 2;
            var startY = texSize.y - connections[PieceValues.Bottom].height;

            tex.Cut(connections[PieceValues.Bottom], new Vector2Int(startX, startY));
        }


        if (value.Contains(PieceValues.Bottom))
        {
            var startX = middleX - connections[PieceValues.Bottom].width / 2;
            var startY = 0;

            tex.DrawTexture(connections[PieceValues.Bottom], new Vector2Int(startX, startY));
        }
        else if (value.Contains(PieceValues.BottomNeighbord))
        {
            var startX = middleX - connections[PieceValues.Top].width / 2;
            var startY = 0;

            tex.Cut(connections[PieceValues.Top], new Vector2Int(startX, startY));
        }


        tex.Apply();

        var pivot  = GetPivot(value, settings.PieceTextureSize, texSize);
        var sprite = Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), pivot);

        return(sprite);
    }