Rectangle ITiledTerrainRenderer.TemplateBounds(TerrainTemplateInfo template) { Rectangle?templateRect = null; var tileSize = map.Grid.TileSize; var i = 0; for (var y = 0; y < template.Size.Y; y++) { for (var x = 0; x < template.Size.X; x++) { var tile = new TerrainTile(template.Id, (byte)(i++)); if (!terrainInfo.TryGetTileInfo(tile, out var tileInfo)) { continue; } var sprite = tileCache.TileSprite(tile); var u = map.Grid.Type == MapGridType.Rectangular ? x : (x - y) / 2f; var v = map.Grid.Type == MapGridType.Rectangular ? y : (x + y) / 2f; var tl = new float2(u * tileSize.Width, (v - 0.5f * tileInfo.Height) * tileSize.Height) - 0.5f * sprite.Size; var rect = new Rectangle((int)(tl.X + sprite.Offset.X), (int)(tl.Y + sprite.Offset.Y), (int)sprite.Size.X, (int)sprite.Size.Y); templateRect = templateRect.HasValue ? Rectangle.Union(templateRect.Value, rect) : rect; } } return(templateRect ?? Rectangle.Empty); }