public void UpdateCanvas()
    {
        List <tk2dSparseTile> newTiles = new List <tk2dSparseTile>();

        for (int iLayer = 0; iLayer < layers.Length; ++iLayer)
        {
            tk2dScratchpadLayer layer = layers[iLayer];

            for (int y = 0; y < layer.height; ++y)
            {
                for (int x = 0; x < layer.width; ++x)
                {
                    int k = y * layer.width + x;

                    if (layer.tiles[k] != -1)
                    {
                        newTiles.Add(new tk2dSparseTile(x, y, iLayer, layer.tiles[k]));
                    }
                }
            }
        }

        canvas.tiles = newTiles.ToArray();

        canvas.SortTiles(tileSortLeftToRight, tileSortBottomToTop);

        canvas.UpdateBrushHash();
    }
示例#2
0
    public void CreateDefaultPalette(tk2dSpriteCollectionData spriteCollection, tk2dTileMapEditorBrush brush, int numTilesX)
    {
        List <tk2dSparseTile> tiles = new List <tk2dSparseTile>();

        var spriteDefinitions = spriteCollection.spriteDefinitions;
        int numTilesY         = spriteDefinitions.Length / numTilesX;

        if (numTilesY * numTilesX < spriteDefinitions.Length)
        {
            numTilesY++;
        }

        for (ushort spriteIndex = 0; spriteIndex < spriteDefinitions.Length; ++spriteIndex)
        {
            if (spriteDefinitions[spriteIndex].Valid)
            {
                tiles.Add(new tk2dSparseTile(spriteIndex % numTilesX, numTilesY - 1 - spriteIndex / numTilesX, 0, spriteIndex));
            }
        }
        brush.tiles = tiles.ToArray();
        brush.UpdateBrushHash();
    }
示例#3
0
	void PickUpBrush(tk2dTileMapEditorBrush brush, bool allLayers)
	{
		bool pickFromScratchpad = (scratchpadGUI.workingHere || scratchpadGUI.requestSelectAllTiles);

		int x0 = Mathf.Min(cursorX, cursorX0);
		int x1 = Mathf.Max(cursorX, cursorX0);
		int y0 = Mathf.Min(cursorY, cursorY0);
		int y1 = Mathf.Max(cursorY, cursorY0);
		if (pickFromScratchpad) {
			// Clamp to scratchpad
			int scratchW, scratchH;
			scratchpadGUI.GetScratchpadSize(out scratchW, out scratchH);
			x0 = Mathf.Clamp(x0, 0, scratchW - 1);
			y0 = Mathf.Clamp(y0, 0, scratchH - 1);
			x1 = Mathf.Clamp(x1, 0, scratchW - 1);
			y1 = Mathf.Clamp(y1, 0, scratchH - 1);
		} else {
			// Clamp to tilemap
			x0 = Mathf.Clamp(x0, 0, tileMap.width - 1);
			y0 = Mathf.Clamp(y0, 0, tileMap.height - 1);
			x1 = Mathf.Clamp(x1, 0, tileMap.width - 1);
			y1 = Mathf.Clamp(y1, 0, tileMap.height - 1);
		}
		int numTilesX = x1 - x0 + 1;
		int numTilesY = y1 - y0 + 1;
		
		List<tk2dSparseTile> sparseTile = new List<tk2dSparseTile>();
		List<int> tiles = new List<int>();
		
		int numLayers = tileMap.data.NumLayers;
		int startLayer = 0;
		int endLayer = numLayers;
		
		if (allLayers)
		{
			brush.multiLayer = true;
		}
		else
		{
			brush.multiLayer = false;
			startLayer = editorData.layer;
			endLayer = startLayer + 1;
		}

		// Scratchpad only allows one layer for now
		if (pickFromScratchpad) {
			startLayer = 0;
			endLayer = 1;
		}
		
		if (tileMap.data.tileType == tk2dTileMapData.TileType.Rectangular)
		{
			for (int layer = startLayer; layer < endLayer; ++layer)
			{
				for (int y = numTilesY - 1; y >= 0; --y)
				{
					for (int x = 0; x < numTilesX; ++x)
					{
						int tile;
						if (pickFromScratchpad) {
							tile = scratchpadGUI.GetTile(x0 + x, y0 + y, layer);
						} else {
							tile = tileMap.Layers[layer].GetRawTile(x0 + x, y0 + y);
						}
						tiles.Add(tile);
						sparseTile.Add(new tk2dSparseTile(x, y, allLayers?layer:0, tile));
					}
				}
			}
		}
		else if (tileMap.data.tileType == tk2dTileMapData.TileType.Isometric)
		{
			int xOffset = 0;
			int yOffset = 0;
			if ((y0 & 1) != 0)
				yOffset -= 1;
			
			for (int layer = startLayer; layer < endLayer; ++layer)
			{
				for (int y = numTilesY - 1; y >= 0; --y)
				{
					for (int x = 0; x < numTilesX; ++x)
					{
						int tile;
						if (pickFromScratchpad) {
							tile = scratchpadGUI.GetTile(x0 + x, y0 + y, layer);
						} else {
							tile = tileMap.Layers[layer].GetRawTile(x0 + x, y0 + y);
						}
						tiles.Add(tile);
						sparseTile.Add(new tk2dSparseTile(x + xOffset, y + yOffset, allLayers?layer:0, tile));
					}
				}
			}
		}
		
		
		brush.type = tk2dTileMapEditorBrush.Type.Custom;
		
		if (numTilesX == 1 && numTilesY == 3) brush.edgeMode = tk2dTileMapEditorBrush.EdgeMode.Vertical;
		else if (numTilesX == 3 && numTilesY == 1) brush.edgeMode = tk2dTileMapEditorBrush.EdgeMode.Horizontal;
		else if (numTilesX == 3 && numTilesY == 3) brush.edgeMode = tk2dTileMapEditorBrush.EdgeMode.Square;
		else brush.edgeMode = tk2dTileMapEditorBrush.EdgeMode.None;
		
		brush.tiles = sparseTile.ToArray();
		brush.multiSelectTiles = tiles.ToArray();
		brush.UpdateBrushHash();
		
		// Make the inspector update
		EditorUtility.SetDirty(tileMap);
	}
示例#4
0
    void PickUpBrush(tk2dTileMapEditorBrush brush, bool allLayers)
    {
        int x0        = Mathf.Min(cursorX, cursorX0);
        int x1        = Mathf.Max(cursorX, cursorX0);
        int y0        = Mathf.Min(cursorY, cursorY0);
        int y1        = Mathf.Max(cursorY, cursorY0);
        int numTilesX = x1 - x0 + 1;
        int numTilesY = y1 - y0 + 1;

        List <tk2dSparseTile> sparseTile = new List <tk2dSparseTile>();
        List <int>            tiles      = new List <int>();

        int numLayers  = tileMap.data.NumLayers;
        int startLayer = 0;
        int endLayer   = numLayers;

        if (allLayers)
        {
            brush.multiLayer = true;
        }
        else
        {
            brush.multiLayer = false;
            startLayer       = editorData.layer;
            endLayer         = startLayer + 1;
        }

        for (int layer = startLayer; layer < endLayer; ++layer)
        {
            for (int y = numTilesY - 1; y >= 0; --y)
            {
                for (int x = 0; x < numTilesX; ++x)
                {
                    int tile = tileMap.Layers[layer].GetTile(x0 + x, y0 + y);
                    tiles.Add(tile);
                    sparseTile.Add(new tk2dSparseTile(x, y, allLayers?layer:0, tile));
                }
            }
        }

        brush.type = tk2dTileMapEditorBrush.Type.Custom;

        if (numTilesX == 1 && numTilesY == 3)
        {
            brush.edgeMode = tk2dTileMapEditorBrush.EdgeMode.Vertical;
        }
        else if (numTilesX == 3 && numTilesY == 1)
        {
            brush.edgeMode = tk2dTileMapEditorBrush.EdgeMode.Horizontal;
        }
        else if (numTilesX == 3 && numTilesY == 3)
        {
            brush.edgeMode = tk2dTileMapEditorBrush.EdgeMode.Square;
        }
        else
        {
            brush.edgeMode = tk2dTileMapEditorBrush.EdgeMode.None;
        }

        brush.tiles            = sparseTile.ToArray();
        brush.multiSelectTiles = tiles.ToArray();
        brush.UpdateBrushHash();

        // Make the inspector update
        EditorUtility.SetDirty(tileMap);
    }
    public void CreateDefaultPalette(tk2dSpriteCollectionData spriteCollection, tk2dTileMapEditorBrush brush, int numTilesX)
    {
        List<tk2dSparseTile> tiles = new List<tk2dSparseTile>();

        var spriteDefinitions = spriteCollection.spriteDefinitions;
        int numTilesY = spriteDefinitions.Length / numTilesX;
        if (numTilesY * numTilesX < spriteDefinitions.Length)
            numTilesY++;

        for (ushort spriteIndex = 0; spriteIndex < spriteDefinitions.Length; ++spriteIndex)
        {
            if (spriteDefinitions[spriteIndex].Valid)
                tiles.Add(new tk2dSparseTile(spriteIndex % numTilesX, numTilesY - 1 - spriteIndex / numTilesX, 0, spriteIndex));
        }
        brush.tiles = tiles.ToArray();
        brush.UpdateBrushHash();
    }
        void BuildBrush(tk2dSpriteCollectionData spriteCollection, tk2dTileMapEditorBrush brush, int tilesPerRow)
        {
            brush.multiLayer = false;

            if (multiSelect)
            {
                List<int> filteredTileSelection = new List<int>();
                foreach (var v in tileSelection)
                {
                    if (IsValidSprite(spriteCollection, v))
                        filteredTileSelection.Add(v);
                }

                brush.type = tk2dTileMapEditorBrush.Type.MultiSelect;
                brush.multiSelectTiles = filteredTileSelection.ToArray();
                brush.edgeMode = tk2dTileMapEditorBrush.EdgeMode.None;
                brush.tiles = new tk2dSparseTile[0];
            }
            else
            {
                int tx0 = (tileSelection_x0 < tileSelection_x1)?tileSelection_x0:tileSelection_x1;
                int tx1 = (tileSelection_x0 < tileSelection_x1)?tileSelection_x1:tileSelection_x0;
                int ty0 = (tileSelection_y0 < tileSelection_y1)?tileSelection_y0:tileSelection_y1;
                int ty1 = (tileSelection_y0 < tileSelection_y1)?tileSelection_y1:tileSelection_y0;

                int numTilesX = tx1 - tx0 + 1;
                int numTilesY = ty1 - ty0 + 1;
                int numValidTiles = 0;

                tileSelection.Clear();
                List<tk2dSparseTile> tiles = new List<tk2dSparseTile>();
                for (int y = 0; y < numTilesY; ++y)
                {
                    for (int x = 0; x < numTilesX; ++x)
                    {
                        ushort spriteId = (ushort)((y + ty0) * tilesPerRow + (x + tx0));
                        if (IsValidSprite(spriteCollection, spriteId))
                        {
                            tiles.Add(new tk2dSparseTile(x, numTilesY - 1 - y, 0, spriteId));

                            if (tileSelection.IndexOf(spriteId) == -1)
                                tileSelection.Add(spriteId);

                            numValidTiles++;
                        }
                    }
                }

                if (numTilesX == 1 && numTilesY == 3 && numValidTiles == 3) brush.edgeMode = tk2dTileMapEditorBrush.EdgeMode.Vertical;
                else if (numTilesX == 3 && numTilesY == 1 && numValidTiles == 3) brush.edgeMode = tk2dTileMapEditorBrush.EdgeMode.Horizontal;
                else if (numTilesX == 3 && numTilesY == 3 && numValidTiles == 9) brush.edgeMode = tk2dTileMapEditorBrush.EdgeMode.Square;
                else brush.edgeMode = tk2dTileMapEditorBrush.EdgeMode.None;

                brush.type = (rectSelect)?tk2dTileMapEditorBrush.Type.Rectangle:tk2dTileMapEditorBrush.Type.Single;
                brush.multiSelectTiles = tileSelection.ToArray();
                brush.tiles = tiles.ToArray();
            }

            brush.UpdateBrushHash();
        }
示例#7
0
        void BuildBrush(tk2dSpriteCollectionData spriteCollection, tk2dTileMapEditorBrush brush, int tilesPerRow)
        {
            brush.multiLayer = false;

            if (multiSelect)
            {
                List <int> filteredTileSelection = new List <int>();
                foreach (var v in tileSelection)
                {
                    if (IsValidSprite(spriteCollection, v))
                    {
                        filteredTileSelection.Add(v);
                    }
                }

                brush.type             = tk2dTileMapEditorBrush.Type.MultiSelect;
                brush.multiSelectTiles = filteredTileSelection.ToArray();
                brush.edgeMode         = tk2dTileMapEditorBrush.EdgeMode.None;
                brush.tiles            = new tk2dSparseTile[0];
            }
            else
            {
                int tx0 = (tileSelection_x0 < tileSelection_x1)?tileSelection_x0:tileSelection_x1;
                int tx1 = (tileSelection_x0 < tileSelection_x1)?tileSelection_x1:tileSelection_x0;
                int ty0 = (tileSelection_y0 < tileSelection_y1)?tileSelection_y0:tileSelection_y1;
                int ty1 = (tileSelection_y0 < tileSelection_y1)?tileSelection_y1:tileSelection_y0;

                int numTilesX     = tx1 - tx0 + 1;
                int numTilesY     = ty1 - ty0 + 1;
                int numValidTiles = 0;

                tileSelection.Clear();
                List <tk2dSparseTile> tiles = new List <tk2dSparseTile>();
                for (int y = 0; y < numTilesY; ++y)
                {
                    for (int x = 0; x < numTilesX; ++x)
                    {
                        ushort spriteId = (ushort)((y + ty0) * tilesPerRow + (x + tx0));
                        if (IsValidSprite(spriteCollection, spriteId))
                        {
                            tiles.Add(new tk2dSparseTile(x, numTilesY - 1 - y, 0, spriteId));

                            if (tileSelection.IndexOf(spriteId) == -1)
                            {
                                tileSelection.Add(spriteId);
                            }

                            numValidTiles++;
                        }
                    }
                }

                if (numTilesX == 1 && numTilesY == 3 && numValidTiles == 3)
                {
                    brush.edgeMode = tk2dTileMapEditorBrush.EdgeMode.Vertical;
                }
                else if (numTilesX == 3 && numTilesY == 1 && numValidTiles == 3)
                {
                    brush.edgeMode = tk2dTileMapEditorBrush.EdgeMode.Horizontal;
                }
                else if (numTilesX == 3 && numTilesY == 3 && numValidTiles == 9)
                {
                    brush.edgeMode = tk2dTileMapEditorBrush.EdgeMode.Square;
                }
                else
                {
                    brush.edgeMode = tk2dTileMapEditorBrush.EdgeMode.None;
                }

                brush.type             = (rectSelect)?tk2dTileMapEditorBrush.Type.Rectangle:tk2dTileMapEditorBrush.Type.Single;
                brush.multiSelectTiles = tileSelection.ToArray();
                brush.tiles            = tiles.ToArray();
            }

            brush.UpdateBrushHash();
        }
    void PickUpBrush(tk2dTileMapEditorBrush brush, bool allLayers)
    {
        int x0 = Mathf.Min(cursorX, cursorX0);
        int x1 = Mathf.Max(cursorX, cursorX0);
        int y0 = Mathf.Min(cursorY, cursorY0);
        int y1 = Mathf.Max(cursorY, cursorY0);
        int numTilesX = x1 - x0 + 1;
        int numTilesY = y1 - y0 + 1;

        List<tk2dSparseTile> sparseTile = new List<tk2dSparseTile>();
        List<int> tiles = new List<int>();

        int numLayers = tileMap.data.NumLayers;
        int startLayer = 0;
        int endLayer = numLayers;

        if (allLayers)
        {
            brush.multiLayer = true;
        }
        else
        {
            brush.multiLayer = false;
            startLayer = editorData.layer;
            endLayer = startLayer + 1;
        }

        if (tileMap.data.tileType == tk2dTileMapData.TileType.Rectangular)
        {
            for (int layer = startLayer; layer < endLayer; ++layer)
            {
                for (int y = numTilesY - 1; y >= 0; --y)
                {
                    for (int x = 0; x < numTilesX; ++x)
                    {
                        int tile = tileMap.Layers[layer].GetTile(x0 + x, y0 + y);
                        tiles.Add(tile);
                        sparseTile.Add(new tk2dSparseTile(x, y, allLayers?layer:0, tile));
                    }
                }
            }
        }
        else if (tileMap.data.tileType == tk2dTileMapData.TileType.Isometric)
        {
            int xOffset = 0;
            int yOffset = 0;
            if ((y0 & 1) != 0)
                yOffset -= 1;

            for (int layer = startLayer; layer < endLayer; ++layer)
            {
                for (int y = numTilesY - 1; y >= 0; --y)
                {
                    for (int x = 0; x < numTilesX; ++x)
                    {
                        int tile = tileMap.Layers[layer].GetTile(x0 + x, y0 + y);
                        tiles.Add(tile);
                        sparseTile.Add(new tk2dSparseTile(x + xOffset, y + yOffset, allLayers?layer:0, tile));
                    }
                }
            }
        }

        brush.type = tk2dTileMapEditorBrush.Type.Custom;

        if (numTilesX == 1 && numTilesY == 3) brush.edgeMode = tk2dTileMapEditorBrush.EdgeMode.Vertical;
        else if (numTilesX == 3 && numTilesY == 1) brush.edgeMode = tk2dTileMapEditorBrush.EdgeMode.Horizontal;
        else if (numTilesX == 3 && numTilesY == 3) brush.edgeMode = tk2dTileMapEditorBrush.EdgeMode.Square;
        else brush.edgeMode = tk2dTileMapEditorBrush.EdgeMode.None;

        brush.tiles = sparseTile.ToArray();
        brush.multiSelectTiles = tiles.ToArray();
        brush.UpdateBrushHash();

        // Make the inspector update
        EditorUtility.SetDirty(tileMap);
    }
示例#9
0
    void PickUpBrush(tk2dTileMapEditorBrush brush, bool allLayers)
    {
        bool pickFromScratchpad = (scratchpadGUI.workingHere || scratchpadGUI.requestSelectAllTiles);

        int x0 = Mathf.Min(cursorX, cursorX0);
        int x1 = Mathf.Max(cursorX, cursorX0);
        int y0 = Mathf.Min(cursorY, cursorY0);
        int y1 = Mathf.Max(cursorY, cursorY0);

        if (pickFromScratchpad)
        {
            // Clamp to scratchpad
            int scratchW, scratchH;
            scratchpadGUI.GetScratchpadSize(out scratchW, out scratchH);
            x0 = Mathf.Clamp(x0, 0, scratchW - 1);
            y0 = Mathf.Clamp(y0, 0, scratchH - 1);
            x1 = Mathf.Clamp(x1, 0, scratchW - 1);
            y1 = Mathf.Clamp(y1, 0, scratchH - 1);
        }
        else
        {
            // Clamp to tilemap
            x0 = Mathf.Clamp(x0, 0, tileMap.width - 1);
            y0 = Mathf.Clamp(y0, 0, tileMap.height - 1);
            x1 = Mathf.Clamp(x1, 0, tileMap.width - 1);
            y1 = Mathf.Clamp(y1, 0, tileMap.height - 1);
        }
        int numTilesX = x1 - x0 + 1;
        int numTilesY = y1 - y0 + 1;

        List <tk2dSparseTile> sparseTile = new List <tk2dSparseTile>();
        List <int>            tiles      = new List <int>();

        int numLayers  = tileMap.data.NumLayers;
        int startLayer = 0;
        int endLayer   = numLayers;

        if (allLayers)
        {
            brush.multiLayer = true;
        }
        else
        {
            brush.multiLayer = false;
            startLayer       = editorData.layer;
            endLayer         = startLayer + 1;
        }

        // Scratchpad only allows one layer for now
        if (pickFromScratchpad)
        {
            startLayer = 0;
            endLayer   = 1;
        }

        if (tileMap.data.tileType == tk2dTileMapData.TileType.Rectangular)
        {
            for (int layer = startLayer; layer < endLayer; ++layer)
            {
                for (int y = numTilesY - 1; y >= 0; --y)
                {
                    for (int x = 0; x < numTilesX; ++x)
                    {
                        int tile;
                        if (pickFromScratchpad)
                        {
                            tile = scratchpadGUI.GetTile(x0 + x, y0 + y, layer);
                        }
                        else
                        {
                            tile = tileMap.Layers[layer].GetRawTile(x0 + x, y0 + y);
                        }
                        tiles.Add(tile);
                        sparseTile.Add(new tk2dSparseTile(x, y, allLayers?layer:0, tile));
                    }
                }
            }
        }
        else if (tileMap.data.tileType == tk2dTileMapData.TileType.Isometric)
        {
            int xOffset = 0;
            int yOffset = 0;
            if ((y0 & 1) != 0)
            {
                yOffset -= 1;
            }

            for (int layer = startLayer; layer < endLayer; ++layer)
            {
                for (int y = numTilesY - 1; y >= 0; --y)
                {
                    for (int x = 0; x < numTilesX; ++x)
                    {
                        int tile;
                        if (pickFromScratchpad)
                        {
                            tile = scratchpadGUI.GetTile(x0 + x, y0 + y, layer);
                        }
                        else
                        {
                            tile = tileMap.Layers[layer].GetRawTile(x0 + x, y0 + y);
                        }
                        tiles.Add(tile);
                        sparseTile.Add(new tk2dSparseTile(x + xOffset, y + yOffset, allLayers?layer:0, tile));
                    }
                }
            }
        }


        brush.type = tk2dTileMapEditorBrush.Type.Custom;

        if (numTilesX == 1 && numTilesY == 3)
        {
            brush.edgeMode = tk2dTileMapEditorBrush.EdgeMode.Vertical;
        }
        else if (numTilesX == 3 && numTilesY == 1)
        {
            brush.edgeMode = tk2dTileMapEditorBrush.EdgeMode.Horizontal;
        }
        else if (numTilesX == 3 && numTilesY == 3)
        {
            brush.edgeMode = tk2dTileMapEditorBrush.EdgeMode.Square;
        }
        else
        {
            brush.edgeMode = tk2dTileMapEditorBrush.EdgeMode.None;
        }

        brush.tiles            = sparseTile.ToArray();
        brush.multiSelectTiles = tiles.ToArray();
        brush.UpdateBrushHash();

        // Make the inspector update
        EditorUtility.SetDirty(tileMap);
    }
示例#10
0
    public void UpdateWorkingBrush()
    {
        tk2dTileMapEditorBrush workBrush   = WorkingBrush;
        tk2dTileMapEditorBrush activeBrush = editorData.activeBrush;

        int rectX1 = Mathf.Min(cursorX, cursorX0);
        int rectX2 = Mathf.Max(cursorX, cursorX0);
        int rectY1 = Mathf.Min(cursorY, cursorY0);
        int rectY2 = Mathf.Max(cursorY, cursorY0);

        int xoffset = 0;

        if (tileMap.data.tileType == tk2dTileMapData.TileType.Isometric && (cursorY & 1) == 1)
        {
            xoffset = 1;
        }

        workBrush.tiles = new tk2dSparseTile[0];

        tk2dSparseTile[] srcTiles;
        if (activeBrush.type != tk2dTileMapEditorBrush.Type.MultiSelect)
        {
            srcTiles = activeBrush.tiles;
        }
        else
        {
            int n = activeBrush.multiSelectTiles.Length;
            srcTiles = new tk2dSparseTile[n];
            for (int i = 0; i < n; ++i)
            {
                srcTiles[i] = new tk2dSparseTile(i, 0, editorData.layer, activeBrush.multiSelectTiles[i]);
            }
        }

        if (srcTiles.Length == 0)
        {
            workBrush.UpdateBrushHash();
            return;
        }

        bool flipH = tk2dTileMapToolbar.workBrushFlipX;
        bool flipV = tk2dTileMapToolbar.workBrushFlipY;

        if (tk2dTileMapToolbar.mainMode == tk2dTileMapToolbar.MainMode.Brush)
        {
            if (rectX1 == rectX2 && rectY1 == rectY2)
            {
                int nTiles = srcTiles.Length;
                workBrush.tiles = new tk2dSparseTile[nTiles];

                for (int i = 0; i < nTiles; ++i)
                {
                    int spriteId = srcTiles[i].spriteId;
                    int tx       = srcTiles[i].x;
                    int ty       = srcTiles[i].y;

                    if (flipH)
                    {
                        tx = -tx;
                        tk2dRuntime.TileMap.BuilderUtil.InvertRawTileFlag(ref spriteId, tk2dTileFlags.FlipX);
                    }
                    if (flipV)
                    {
                        ty = -ty;
                        tk2dRuntime.TileMap.BuilderUtil.InvertRawTileFlag(ref spriteId, tk2dTileFlags.FlipY);
                    }

                    int thisRowXOffset = ((ty & 1) == 1) ? xoffset : 0;

                    workBrush.tiles[i] = new tk2dSparseTile(
                        cursorX + tx + thisRowXOffset,
                        cursorY + ty,
                        editorData.layer,
                        spriteId);
                }
            }
            else
            {
                int gridWidth  = 1 + rectX2 - rectX1;
                int gridHeight = 1 + rectY2 - rectY1;
                workBrush.tiles = new tk2dSparseTile[gridWidth * gridHeight];

                // fill with tiles repeated pattern...
                int patternX1 = 0;
                int patternY1 = 0;
                int patternX2 = 0;
                int patternY2 = 0;
                foreach (var tile in srcTiles)
                {
                    patternX1 = Mathf.Min(patternX1, tile.x);
                    patternY1 = Mathf.Min(patternY1, tile.y);
                    patternX2 = Mathf.Max(patternX2, tile.x);
                    patternY2 = Mathf.Max(patternY2, tile.y);
                }
                int patternW = 1 + patternX2 - patternX1;
                int patternH = 1 + patternY2 - patternY1;

                int idx = 0;
                for (int y = 0; y < gridHeight; ++y)
                {
                    int thisRowXOffset = ((y & 1) == 1) ? xoffset : 0;
                    for (int x = 0; x < gridWidth; ++x)
                    {
                        int spriteId = srcTiles[0].spriteId;
                        foreach (var tile in srcTiles)
                        {
                            if ((x % patternW) == (tile.x - patternX1) &&
                                (y % patternH) == (tile.y - patternY1))
                            {
                                spriteId = tile.spriteId;
                                break;
                            }
                        }
                        if (flipH)
                        {
                            tk2dRuntime.TileMap.BuilderUtil.InvertRawTileFlag(ref spriteId, tk2dTileFlags.FlipX);
                        }
                        if (flipV)
                        {
                            tk2dRuntime.TileMap.BuilderUtil.InvertRawTileFlag(ref spriteId, tk2dTileFlags.FlipY);
                        }
                        workBrush.tiles[idx++] = new tk2dSparseTile(
                            rectX1 + x + thisRowXOffset, rectY1 + y, editorData.layer, spriteId);
                    }
                }
            }
        }
        if (tk2dTileMapToolbar.mainMode == tk2dTileMapToolbar.MainMode.BrushRandom)
        {
            int gridWidth  = 1 + rectX2 - rectX1;
            int gridHeight = 1 + rectY2 - rectY1;
            workBrush.tiles = new tk2dSparseTile[gridWidth * gridHeight];

            var rng = new System.Random(randomSeed + cursorY * tileMap.width + cursorX);

            int idx = 0;
            for (int y = 0; y < gridHeight; ++y)
            {
                int thisRowXOffset = ((y & 1) == 1) ? xoffset : 0;
                for (int x = 0; x < gridWidth; ++x)
                {
                    int spriteId = srcTiles[rng.Next(srcTiles.Length)].spriteId;
                    workBrush.tiles[idx++] = new tk2dSparseTile(
                        rectX1 + x + thisRowXOffset, rectY1 + y, editorData.layer, spriteId);
                }
            }
        }

        if (scratchpadGUI.workingHere)
        {
            int scratchW, scratchH;
            scratchpadGUI.GetScratchpadSize(out scratchW, out scratchH);
            workBrush.ClipTiles(0, 0, scratchW - 1, scratchH - 1);
        }
        else
        {
            workBrush.ClipTiles(0, 0, tileMap.width - 1, tileMap.height - 1);
        }

        workBrush.SortTiles(tileMapData.sortMethod == tk2dTileMapData.SortMethod.BottomLeft || tileMapData.sortMethod == tk2dTileMapData.SortMethod.TopLeft,
                            tileMapData.sortMethod == tk2dTileMapData.SortMethod.BottomLeft || tileMapData.sortMethod == tk2dTileMapData.SortMethod.BottomRight);

        workBrush.UpdateBrushHash();
    }