Esempio n. 1
0
        public void Render(ICanvas canvas, int width, int height, IPixelMapper pixelMapper)
        {
            if (pixelMapper.CellSize != _lastCellSize)
            {
                _imageCache.Clear();
                _lastCellSize = pixelMapper.CellSize;
            }

            foreach (T entity in _layout)
            {
                var renderer = _renderers.FirstOrDefault(r => r.ShouldRender(entity));
                if (renderer is null)
                {
                    // TODO: Fill with Red to indicate error?
                    continue;
                }

                (int x, int y, bool onScreen) = pixelMapper.CoordsToViewPortPixels(entity.Column, entity.Row);

                if (!onScreen)
                {
                    continue;
                }

                string key = $"{entity.GetType().Name}.{entity.Identifier}";
                if (_imageCache.IsDirty(key))
                {
                    using IImageCanvas imageCanvas = _imageFactory.CreateImageCanvas(pixelMapper.CellSize, pixelMapper.CellSize);

                    float scale = pixelMapper.CellSize / 100.0f;

                    imageCanvas.Canvas.Scale(scale, scale);

                    renderer.Render(imageCanvas.Canvas, entity);

                    _imageCache.Set(key, imageCanvas.Render());
                }

                using (canvas.Scope())
                {
                    canvas.Translate(x, y);
                    canvas.ClipRect(new Rectangle(0, 0, pixelMapper.CellSize, pixelMapper.CellSize), false, false);
                    canvas.DrawImage(_imageCache.Get(key) !, 0, 0);
                }
            }
        }
        public IImage GetTerrainImage()
        {
            if (_imageCache.IsDirty(this))
            {
                int width   = _pixelMapper.Columns;
                int _height = _pixelMapper.Rows;

                using IImageCanvas textureImage = _imageFactory.CreateImageCanvas(width, _height);

                foreach (Terrain terrain in _terrainMap)
                {
                    Color      colour = GetTerrainColour(terrain);
                    PaintBrush paint  = GetPaint(colour);

                    textureImage.Canvas.DrawRect(terrain.Column, terrain.Row, 1, 1, paint);
                }

                _imageCache.Set(this, textureImage.Render());

                Changed?.Invoke(this, EventArgs.Empty);
            }

            return(_imageCache.Get(this) !);
        }