private RenderingMaterial GetBlendMaterial(
            BlendLayers blendLayer)
        {
            var cacheKey = blendLayer.TileBlendSides;

            if (cacheKey == None)
            {
                throw new Exception();
            }

            if (this.cachedBlendMaskMaterials.TryGetValue(cacheKey, out var material))
            {
                return(material);
            }

            material = ClientTileBlendHelper.CreateRenderingMaterial(cacheKey, this.maskTexture);
            this.cachedBlendMaskMaterials[cacheKey] = material;
            return(material);
        }
        private BlendLayers GetBlendLayers(Tile tile)
        {
            if (this.HasFarmPlot(tile))
            {
                // don't blend such object - tile contains farm
                return(BlendLayers.Empty);
            }

            var blendLayers   = new BlendLayers();
            var tileLeft      = tile.NeighborTileLeft;
            var tileUp        = tile.NeighborTileUp;
            var tileRight     = tile.NeighborTileRight;
            var tileDown      = tile.NeighborTileDown;
            var tileUpLeft    = tile.GetNeighborTile(-1, 1);
            var tileUpRight   = tile.GetNeighborTile(1, 1);
            var tileDownLeft  = tile.GetNeighborTile(-1, -1);
            var tileDownRight = tile.GetNeighborTile(1, -1);

            var blendSides = None;

            void TryBlendWith(Tile targetTile, TileBlendSides side)
            {
                if (this.HasFarmPlot(targetTile))
                {
                    blendSides |= side;
                }
            }

            TryBlendWith(tileLeft, Left);
            TryBlendWith(tileUp, Up);
            TryBlendWith(tileRight, Right);
            TryBlendWith(tileDown, Down);
            TryBlendWith(tileUpLeft, UpLeft);
            TryBlendWith(tileUpRight, UpRight);
            TryBlendWith(tileDownLeft, DownLeft);
            TryBlendWith(tileDownRight, DownRight);

            blendLayers.TileBlendSides = blendSides;

            return(blendLayers);
        }