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) !); }