diff --git a/OpenRA.Mods.Common/EditorBrushes/EditorBlit.cs b/OpenRA.Mods.Common/EditorBrushes/EditorBlit.cs index f982c4bcb4..384d6a225d 100644 --- a/OpenRA.Mods.Common/EditorBrushes/EditorBlit.cs +++ b/OpenRA.Mods.Common/EditorBrushes/EditorBlit.cs @@ -21,7 +21,7 @@ namespace OpenRA.Mods.Common.EditorBrushes { public readonly record struct BlitTile(TerrainTile TerrainTile, ResourceTile ResourceTile, ResourceLayerContents? ResourceLayerContents, byte Height); - public readonly record struct EditorBlitSource(CellRegion CellRegion, Dictionary Actors, Dictionary Tiles); + public readonly record struct EditorBlitSource(CellCoordsRegion CellCoords, Dictionary Actors, Dictionary Tiles); [Flags] public enum MapBlitFilters @@ -64,18 +64,18 @@ namespace OpenRA.Mods.Common.EditorBrushes this.map = map; this.respectBounds = respectBounds; - var blitSize = blitSource.CellRegion.BottomRight - blitSource.CellRegion.TopLeft; + var blitSize = blitSource.CellCoords.BottomRight - blitSource.CellCoords.TopLeft; // Only include into the revert blit stuff which would be modified by the main blit. var mask = GetBlitSourceMask( - blitSource, blitPosition - blitSource.CellRegion.TopLeft); + blitSource, blitPosition - blitSource.CellCoords.TopLeft); commitBlitSource = blitSource; revertBlitSource = CopyRegionContents( map, editorActorLayer, resourceLayer, - new CellRegion(map.Grid.Type, blitPosition, blitPosition + blitSize), + new CellCoordsRegion(blitPosition, blitPosition + blitSize), blitFilters, mask); } @@ -89,7 +89,7 @@ namespace OpenRA.Mods.Common.EditorBrushes Map map, EditorActorLayer editorActorLayer, IResourceLayer resourceLayer, - CellRegion region, + CellCoordsRegion region, MapBlitFilters blitFilters, IReadOnlySet mask = null) { @@ -102,7 +102,7 @@ namespace OpenRA.Mods.Common.EditorBrushes if (blitFilters.HasFlag(MapBlitFilters.Terrain) || blitFilters.HasFlag(MapBlitFilters.Resources)) { - foreach (var cell in region.CellCoords) + foreach (var cell in region) { if (!mapTiles.Contains(cell) || (mask != null && !mask.Contains(cell))) continue; @@ -117,7 +117,7 @@ namespace OpenRA.Mods.Common.EditorBrushes } if (blitFilters.HasFlag(MapBlitFilters.Actors)) - foreach (var preview in editorActorLayer.PreviewsInCellRegion(region.CellCoords)) + foreach (var preview in editorActorLayer.PreviewsInCellRegion(region)) if (mask == null || preview.Footprint.Keys.Any(mask.Contains)) previews.TryAdd(preview.ID, preview); @@ -127,10 +127,10 @@ namespace OpenRA.Mods.Common.EditorBrushes void Blit(bool isRevert) { var source = isRevert ? revertBlitSource : commitBlitSource; - var blitPos = isRevert ? source.CellRegion.TopLeft : blitPosition; - var blitVec = blitPos - source.CellRegion.TopLeft; - var blitSize = source.CellRegion.BottomRight - source.CellRegion.TopLeft; - var blitRegion = new CellRegion(map.Grid.Type, blitPos, blitPos + blitSize); + var blitPos = isRevert ? source.CellCoords.TopLeft : blitPosition; + var blitVec = blitPos - source.CellCoords.TopLeft; + var blitSize = source.CellCoords.BottomRight - source.CellCoords.TopLeft; + var blitRegion = new CellCoordsRegion(blitPos, blitPos + blitSize); if (blitFilters.HasFlag(MapBlitFilters.Actors)) { @@ -148,10 +148,10 @@ namespace OpenRA.Mods.Common.EditorBrushes // - revertBlitSource's mask will overlap all revert actors BUT MAY OVERLAP MORE! // // This means we use the commit mask, not the revert one. - var commitBlitVec = blitPosition - commitBlitSource.CellRegion.TopLeft; + var commitBlitVec = blitPosition - commitBlitSource.CellCoords.TopLeft; var mask = GetBlitSourceMask(commitBlitSource, commitBlitVec); using (new PerfTimer("RemoveActors", 1)) - editorActorLayer.RemoveRegion(blitRegion.CellCoords, mask); + editorActorLayer.RemoveRegion(blitRegion, mask); } foreach (var tileKeyValuePair in source.Tiles) @@ -290,7 +290,7 @@ namespace OpenRA.Mods.Common.EditorBrushes { var mask = new HashSet(); - var sourceCellCoords = blitSource.CellRegion.CellCoords; + var sourceCellCoords = blitSource.CellCoords; foreach (var (cpos, _) in blitSource.Tiles) { diff --git a/OpenRA.Mods.Common/EditorBrushes/EditorCopyPasteBrush.cs b/OpenRA.Mods.Common/EditorBrushes/EditorCopyPasteBrush.cs index b49dae3f50..57706910e8 100644 --- a/OpenRA.Mods.Common/EditorBrushes/EditorCopyPasteBrush.cs +++ b/OpenRA.Mods.Common/EditorBrushes/EditorCopyPasteBrush.cs @@ -28,9 +28,9 @@ namespace OpenRA.Mods.Common.Widgets readonly IResourceLayer resourceLayer; readonly Func getCopyFilters; - public CPos? PastePreviewPosition { get; private set; } + public CPos PastePreviewPosition { get; private set; } - public CellRegion Region => clipboard.CellRegion; + public CellCoordsRegion Region => clipboard.CellCoords; public EditorCopyPasteBrush( EditorViewportControllerWidget editorWidget, @@ -47,6 +47,7 @@ namespace OpenRA.Mods.Common.Widgets editorActionManager = wr.World.WorldActor.Trait(); editorActorLayer = wr.World.WorldActor.Trait(); + PastePreviewPosition = worldRenderer.Viewport.ViewToWorld(Viewport.LastMousePos); } public bool HandleMouseInput(MouseInput mi) @@ -89,25 +90,19 @@ namespace OpenRA.Mods.Common.Widgets void IEditorBrush.TickRender(WorldRenderer wr, Actor self) { } IEnumerable IEditorBrush.RenderAboveShroud(Actor self, WorldRenderer wr) { - if (PastePreviewPosition != null) - { - var preview = EditorBlit.PreviewBlitSource( - clipboard, - getCopyFilters(), - PastePreviewPosition.Value - Region.TopLeft, - wr); - foreach (var renderable in preview) - yield return renderable; - } + var preview = EditorBlit.PreviewBlitSource( + clipboard, + getCopyFilters(), + PastePreviewPosition - Region.TopLeft, + wr); + foreach (var renderable in preview) + yield return renderable; } IEnumerable IEditorBrush.RenderAnnotations(Actor self, WorldRenderer wr) { - if (PastePreviewPosition != null) - { - yield return new EditorSelectionAnnotationRenderable(Region, editorWidget.SelectionAltColor, editorWidget.SelectionAltOffset, PastePreviewPosition); - yield return new EditorSelectionAnnotationRenderable(Region, editorWidget.PasteColor, int2.Zero, PastePreviewPosition); - } + yield return new EditorSelectionAnnotationRenderable(Region, editorWidget.SelectionAltColor, editorWidget.SelectionAltOffset, PastePreviewPosition); + yield return new EditorSelectionAnnotationRenderable(Region, editorWidget.PasteColor, int2.Zero, PastePreviewPosition); } public void Tick() diff --git a/OpenRA.Mods.Common/EditorBrushes/EditorDefaultBrush.cs b/OpenRA.Mods.Common/EditorBrushes/EditorDefaultBrush.cs index 980e6fa07d..9c9902ec00 100644 --- a/OpenRA.Mods.Common/EditorBrushes/EditorDefaultBrush.cs +++ b/OpenRA.Mods.Common/EditorBrushes/EditorDefaultBrush.cs @@ -33,10 +33,10 @@ namespace OpenRA.Mods.Common.Widgets public class EditorSelection { - public CellRegion Area; + public CellCoordsRegion? Area; public EditorActorPreview Actor; - public bool HasSelection => Area != null || Actor != null; + public bool HasSelection => Area.HasValue || Actor != null; } public sealed class EditorDefaultBrush : IEditorBrush @@ -54,12 +54,12 @@ namespace OpenRA.Mods.Common.Widgets readonly IResourceLayer resourceLayer; readonly EditorActorLayer actorLayer; - public CellRegion CurrentDragBounds => selectionBounds ?? Selection.Area; + public CellCoordsRegion? CurrentDragBounds => selectionBounds ?? Selection.Area; public EditorSelection Selection { get; private set; } = new(); EditorSelection previousSelection; - CellRegion selectionBounds; + CellCoordsRegion? selectionBounds; int2? selectionStartLocation; CPos? selectionStartCell; int2 worldPixel; @@ -95,8 +95,8 @@ namespace OpenRA.Mods.Common.Widgets public void DeleteSelection(MapBlitFilters filters) { - if (Selection.Area != null) - editorActionManager.Add(new DeleteAreaAction(world.Map, filters, Selection.Area, resourceLayer, actorLayer)); + if (Selection.Area.HasValue) + editorActionManager.Add(new DeleteAreaAction(world.Map, filters, Selection.Area.Value, resourceLayer, actorLayer)); } public void ClearSelection(bool updateSelectedTab = false) @@ -193,7 +193,7 @@ namespace OpenRA.Mods.Common.Widgets // We've dragged enough to capture more than one cell, make a selection box. if (selectionBounds == null) { - selectionBounds = new CellRegion(gridType, topLeft, bottomRight); + selectionBounds = new CellCoordsRegion(topLeft, bottomRight); // Lose focus on any search boxes so we can always copy/paste. Ui.KeyboardFocusWidget = null; @@ -201,7 +201,7 @@ namespace OpenRA.Mods.Common.Widgets else { // We already have a drag box; resize it - selectionBounds = new CellRegion(gridType, topLeft, bottomRight); + selectionBounds = new CellCoordsRegion(topLeft, bottomRight); } } @@ -281,8 +281,8 @@ namespace OpenRA.Mods.Common.Widgets { if (CurrentDragBounds != null) { - yield return new EditorSelectionAnnotationRenderable(CurrentDragBounds, editorWidget.SelectionAltColor, editorWidget.SelectionAltOffset, null); - yield return new EditorSelectionAnnotationRenderable(CurrentDragBounds, editorWidget.SelectionMainColor, int2.Zero, null); + yield return new EditorSelectionAnnotationRenderable(CurrentDragBounds.Value, editorWidget.SelectionAltColor, editorWidget.SelectionAltOffset, null); + yield return new EditorSelectionAnnotationRenderable(CurrentDragBounds.Value, editorWidget.SelectionMainColor, int2.Zero, null); } } @@ -321,12 +321,12 @@ namespace OpenRA.Mods.Common.Widgets Area = previousSelection.Area }; - if (selection.Area != null) + if (selection.Area.HasValue) Text = FluentProvider.GetMessage(SelectedArea, - "x", selection.Area.TopLeft.X, - "y", selection.Area.TopLeft.Y, - "width", selection.Area.BottomRight.X - selection.Area.TopLeft.X, - "height", selection.Area.BottomRight.Y - selection.Area.TopLeft.Y); + "x", selection.Area.Value.TopLeft.X, + "y", selection.Area.Value.TopLeft.Y, + "width", selection.Area.Value.BottomRight.X - selection.Area.Value.TopLeft.X, + "height", selection.Area.Value.BottomRight.Y - selection.Area.Value.TopLeft.Y); else if (selection.Actor != null) Text = FluentProvider.GetMessage(SelectedActor, "id", selection.Actor.ID); else @@ -360,10 +360,10 @@ namespace OpenRA.Mods.Common.Widgets readonly MapBlitFilters blitFilters; readonly IResourceLayer resourceLayer; readonly EditorActorLayer editorActorLayer; - readonly CellRegion area; + readonly CellCoordsRegion area; readonly Map map; - public DeleteAreaAction(Map map, MapBlitFilters blitFilters, CellRegion area, IResourceLayer resourceLayer, EditorActorLayer editorActorLayer) + public DeleteAreaAction(Map map, MapBlitFilters blitFilters, CellCoordsRegion area, IResourceLayer resourceLayer, EditorActorLayer editorActorLayer) { this.map = map; this.blitFilters = blitFilters; @@ -391,7 +391,7 @@ namespace OpenRA.Mods.Common.Widgets { // Clear any existing actors in the paste cells. using (new PerfTimer("RemoveActors", 1)) - editorActorLayer.RemoveRegion(area.CellCoords); + editorActorLayer.RemoveRegion(area); } foreach (var tileKeyValuePair in editorBlitSource.Tiles) diff --git a/OpenRA.Mods.Common/EditorBrushes/EditorTilingPathBrush.cs b/OpenRA.Mods.Common/EditorBrushes/EditorTilingPathBrush.cs index 53c4a334f1..8b7e6a8dfb 100644 --- a/OpenRA.Mods.Common/EditorBrushes/EditorTilingPathBrush.cs +++ b/OpenRA.Mods.Common/EditorBrushes/EditorTilingPathBrush.cs @@ -347,7 +347,7 @@ namespace OpenRA.Mods.Common.Widgets editorBlit = new EditorBlit( MapBlitFilters.Terrain | MapBlitFilters.Actors, null, - blitSource.CellRegion.TopLeft, + blitSource.CellCoords.TopLeft, world.Map, blitSource, editorActorLayer, diff --git a/OpenRA.Mods.Common/Graphics/EditorSelectionAnnotationRenderable.cs b/OpenRA.Mods.Common/Graphics/EditorSelectionAnnotationRenderable.cs index 6cf5bc6b55..4542bacb08 100644 --- a/OpenRA.Mods.Common/Graphics/EditorSelectionAnnotationRenderable.cs +++ b/OpenRA.Mods.Common/Graphics/EditorSelectionAnnotationRenderable.cs @@ -20,11 +20,11 @@ namespace OpenRA.Mods.Common.Graphics public class EditorSelectionAnnotationRenderable : IRenderable, IFinalizedRenderable { readonly Color color; - readonly CellRegion bounds; + readonly CellCoordsRegion bounds; readonly int2 altPixelOffset; readonly CPos? offset; - public EditorSelectionAnnotationRenderable(CellRegion bounds, Color color, int2 altPixelOffset, CPos? offset) + public EditorSelectionAnnotationRenderable(CellCoordsRegion bounds, Color color, int2 altPixelOffset, CPos? offset) { this.bounds = bounds; this.color = color; @@ -44,15 +44,12 @@ namespace OpenRA.Mods.Common.Graphics public IFinalizedRenderable PrepareRender(WorldRenderer wr) { return this; } public void Render(WorldRenderer wr) { - if (bounds == null) - return; - const int Width = 1; var map = wr.World.Map; var originalWPos = map.CenterOfCell(bounds.TopLeft); var wposOffset = offset.HasValue ? map.CenterOfCell(offset.Value) - originalWPos : WVec.Zero; - foreach (var cellPos in bounds.CellCoords) + foreach (var cellPos in bounds) { var uv = cellPos.ToMPos(map); if (!map.Height.Contains(uv)) diff --git a/OpenRA.Mods.Common/MapGenerator/MultiBrush.cs b/OpenRA.Mods.Common/MapGenerator/MultiBrush.cs index 7376f22a3a..ff9f0dd0c1 100644 --- a/OpenRA.Mods.Common/MapGenerator/MultiBrush.cs +++ b/OpenRA.Mods.Common/MapGenerator/MultiBrush.cs @@ -843,7 +843,7 @@ namespace OpenRA.Mods.Common.MapGenerator var bottomRight = new CPos( Shape.Max(cvec => cvec.X), Shape.Max(cvec => cvec.Y)); - var cellRegion = new CellRegion(map.Grid.Type, topLeft, bottomRight); + var cellRegion = new CellCoordsRegion(topLeft, bottomRight); var actorPreviews = new Dictionary(); for (var i = 0; i < actorPlans.Count; i++) diff --git a/OpenRA.Mods.Common/Traits/World/EditorResourceLayer.cs b/OpenRA.Mods.Common/Traits/World/EditorResourceLayer.cs index 0270cdd514..9b294b6ca4 100644 --- a/OpenRA.Mods.Common/Traits/World/EditorResourceLayer.cs +++ b/OpenRA.Mods.Common/Traits/World/EditorResourceLayer.cs @@ -176,10 +176,10 @@ namespace OpenRA.Mods.Common.Traits NetWorth += newDensity * newResourceValue; } - public int CalculateRegionValue(CellRegion sourceRegion) + public int CalculateRegionValue(CellCoordsRegion sourceRegion) { var resourceValueInRegion = 0; - foreach (var cell in sourceRegion.CellCoords) + foreach (var cell in sourceRegion) { var mcell = cell.ToMPos(Map); if (!Map.Resources.Contains(mcell)) diff --git a/OpenRA.Mods.Common/Widgets/Logic/Editor/MapEditorSelectionLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Editor/MapEditorSelectionLogic.cs index 87e7371bf1..c222193295 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Editor/MapEditorSelectionLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Editor/MapEditorSelectionLogic.cs @@ -53,7 +53,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic var areaEditPanel = selectTabContainer.Get("AREA_EDIT_PANEL"); actorEditPanel.IsVisible = () => editor.DefaultBrush.Selection.Actor != null; - areaEditPanel.IsVisible = () => editor.DefaultBrush.Selection.Area != null; + areaEditPanel.IsVisible = () => editor.DefaultBrush.Selection.Area.HasValue; var copyTerrainCheckbox = areaEditPanel.Get("COPY_FILTER_TERRAIN_CHECKBOX"); var copyResourcesCheckbox = areaEditPanel.Get("COPY_FILTER_RESOURCES_CHECKBOX"); @@ -65,7 +65,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic var copyButton = widget.Get("COPY_BUTTON"); copyButton.OnClick = () => clipboard = CopySelectionContents(); - copyButton.IsDisabled = () => editor.DefaultBrush.Selection.Area == null; + copyButton.IsDisabled = () => !editor.DefaultBrush.Selection.Area.HasValue; AreaEditTitle = areaEditPanel.Get("AREA_EDIT_TITLE"); DiagonalLabel = areaEditPanel.Get("DIAGONAL_COUNTER_LABEL"); @@ -105,7 +105,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic map, editorActorLayer, resourceLayer, - editor.DefaultBrush.Selection.Area, + editor.DefaultBrush.Selection.Area.Value, selectionFilters); } @@ -125,10 +125,11 @@ namespace OpenRA.Mods.Common.Widgets.Logic void HandleSelectionChanged() { - var selectedRegion = editor.DefaultBrush.Selection.Area; - if (selectedRegion == null) + if (!editor.DefaultBrush.Selection.Area.HasValue) return; + var selectedRegion = editor.DefaultBrush.Selection.Area.Value; + if (editorResourceLayer == null) return; diff --git a/OpenRA.Mods.Common/Widgets/Logic/Editor/MapGeneratorToolLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Editor/MapGeneratorToolLogic.cs index b2627c8862..bed7f8488d 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Editor/MapGeneratorToolLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Editor/MapGeneratorToolLogic.cs @@ -307,7 +307,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic var cellBounds = CellLayerUtils.CellBounds(map); var topLeft = new CPos(cellBounds.TopLeft.X, cellBounds.TopLeft.Y); var bottomRight = new CPos(cellBounds.BottomRight.X, cellBounds.BottomRight.Y); - var cellRegion = new CellRegion(map.Grid.Type, topLeft, bottomRight); + var cellRegion = new CellCoordsRegion(topLeft, bottomRight); var blitSource = new EditorBlitSource(cellRegion, previews, tiles); var editorBlit = new EditorBlit( MapBlitFilters.All,