private void SetupTileRendering(TileRenderingData data, Tile tile)
        {
            var renderer    = data.SpriteRenderer;
            var blendLayers = this.GetBlendLayers(tile);

            if (blendLayers.TileBlendSides == None)
            {
                // tile rendering not required
                if (renderer != null)
                {
                    renderer.IsEnabled = false;
                }

                return;
            }

            if (renderer == null)
            {
                renderer = Api.Client.Rendering.CreateSpriteRenderer(
                    Api.Client.Scene.CreateSceneObject(
                        this.sceneObjectsName,
                        position: tile.Position.ToVector2D()),
                    this.protoFarmPlot.Texture,
                    drawOrder: DrawOrder.GroundBlend + 3);
                renderer.SortByWorldPosition = false;
                renderer.Size = ScriptingConstants.TileSizeRenderingVirtualSize;

                data.SpriteRenderer = renderer;
            }

            renderer.IsEnabled         = true;
            renderer.RenderingMaterial = this.GetBlendMaterial(blendLayers);
        }
        private void RefreshRendering(Tile tile, uint frameNumber)
        {
            if (!this.tileDictionary.TryGetValue(tile.Position, out var data))
            {
                // try register tile
                data = new TileRenderingData(frameNumber);
                this.SetupTileRendering(data, tile);

                if (data.SpriteRenderer != null &&
                    data.SpriteRenderer.IsEnabled)
                {
                    this.tileDictionary[tile.Position] = data;
                }

                return;
            }

            // COMMENTED OUT - because we cannot use this optimization yet
            // there are multiple objects could be added or deleted at single frame.
            //if (data.LastUpdateFrameNumber == frameNumber)
            //{
            //    // no need to refresh
            //    return;
            //}

            data.LastUpdateFrameNumber = frameNumber;
            this.SetupTileRendering(data, tile);

            if (data.SpriteRenderer == null ||
                !data.SpriteRenderer.IsEnabled)
            {
                this.tileDictionary.Remove(tile.Position);
            }
        }