Draw editor terrain/resource preview as part of the world.

This commit is contained in:
Paul Chote
2020-01-12 12:28:06 +00:00
committed by abcdefg30
parent e74033bded
commit cc05621c10
8 changed files with 129 additions and 73 deletions

View File

@@ -10,7 +10,6 @@
#endregion
using System.Collections.Generic;
using System.Linq;
using OpenRA.Graphics;
using OpenRA.Mods.Common.Traits;
@@ -23,8 +22,9 @@ namespace OpenRA.Mods.Common.Widgets
readonly WorldRenderer worldRenderer;
readonly World world;
readonly EditorViewportControllerWidget editorWidget;
readonly SpriteWidget preview;
readonly EditorActionManager editorActionManager;
readonly EditorCursorLayer editorCursor;
readonly int cursorToken;
AddResourcesEditorAction action;
bool resourceAdded;
@@ -36,21 +36,10 @@ namespace OpenRA.Mods.Common.Widgets
worldRenderer = wr;
world = wr.World;
editorActionManager = world.WorldActor.Trait<EditorActionManager>();
editorCursor = world.WorldActor.Trait<EditorCursorLayer>();
action = new AddResourcesEditorAction(world.Map, ResourceType);
preview = editorWidget.Get<SpriteWidget>("DRAG_LAYER_PREVIEW");
preview.Palette = resource.Palette;
preview.GetScale = () => worldRenderer.Viewport.Zoom;
preview.IsVisible = () => editorWidget.CurrentBrush == this;
var variant = resource.Sequences.FirstOrDefault();
var sequence = wr.World.Map.Rules.Sequences.GetSequence("resources", variant);
var sprite = sequence.GetSprite(resource.MaxDensity - 1);
preview.GetSprite = () => sprite;
// The preview widget may be rendered by the higher-level code before it is ticked.
// Force a manual tick to ensure the bounds are set correctly for this first draw.
Tick();
cursorToken = editorCursor.SetResource(wr, resource);
}
public bool HandleMouseInput(MouseInput mi)
@@ -70,6 +59,9 @@ namespace OpenRA.Mods.Common.Widgets
return false;
}
if (editorCursor.CurrentToken != cursorToken)
return false;
var cell = worldRenderer.Viewport.ViewToWorld(mi.Location);
if (mi.Button == MouseButton.Left && mi.Event != MouseInputEvent.Up && AllowResourceAt(cell))
@@ -111,20 +103,12 @@ namespace OpenRA.Mods.Common.Widgets
return ResourceType.AllowOnRamps || tileInfo.RampType == 0;
}
public void Tick()
public void Tick() { }
public void Dispose()
{
var cell = worldRenderer.Viewport.ViewToWorld(Viewport.LastMousePos);
var offset = WVec.Zero;
var location = world.Map.CenterOfCell(cell) + offset;
var cellScreenPosition = worldRenderer.ScreenPxPosition(location);
var cellScreenPixel = worldRenderer.Viewport.WorldToViewPx(cellScreenPosition);
preview.Bounds.X = cellScreenPixel.X;
preview.Bounds.Y = cellScreenPixel.Y;
editorCursor.Clear(cursorToken);
}
public void Dispose() { }
}
struct CellResource

View File

@@ -14,7 +14,6 @@ using System.Collections.Generic;
using System.Linq;
using OpenRA.Graphics;
using OpenRA.Mods.Common.Traits;
using OpenRA.Primitives;
namespace OpenRA.Mods.Common.Widgets
{
@@ -25,32 +24,26 @@ namespace OpenRA.Mods.Common.Widgets
readonly WorldRenderer worldRenderer;
readonly World world;
readonly EditorViewportControllerWidget editorWidget;
readonly TerrainTemplatePreviewWidget preview;
readonly Rectangle bounds;
readonly EditorActionManager editorActionManager;
readonly EditorCursorLayer editorCursor;
readonly int cursorToken;
bool painting;
public EditorTileBrush(EditorViewportControllerWidget editorWidget, ushort template, WorldRenderer wr)
public EditorTileBrush(EditorViewportControllerWidget editorWidget, ushort id, WorldRenderer wr)
{
this.editorWidget = editorWidget;
Template = template;
worldRenderer = wr;
world = wr.World;
editorActionManager = world.WorldActor.Trait<EditorActionManager>();
editorCursor = world.WorldActor.Trait<EditorCursorLayer>();
Template = id;
worldRenderer = wr;
world = wr.World;
editorActionManager = world.WorldActor.Trait<EditorActionManager>();
preview = editorWidget.Get<TerrainTemplatePreviewWidget>("DRAG_TILE_PREVIEW");
preview.GetScale = () => worldRenderer.Viewport.Zoom;
preview.IsVisible = () => editorWidget.CurrentBrush == this;
preview.Template = world.Map.Rules.TileSet.Templates.First(t => t.Value.Id == template).Value;
var grid = world.Map.Grid;
bounds = worldRenderer.Theater.TemplateBounds(preview.Template, grid.TileSize, grid.Type);
// The preview widget may be rendered by the higher-level code before it is ticked.
// Force a manual tick to ensure the bounds are set correctly for this first draw.
Tick();
var template = world.Map.Rules.TileSet.Templates.First(t => t.Value.Id == id).Value;
cursorToken = editorCursor.SetTerrainTemplate(wr, template);
}
public bool HandleMouseInput(MouseInput mi)
@@ -84,6 +77,9 @@ namespace OpenRA.Mods.Common.Widgets
if (mi.Event != MouseInputEvent.Down && mi.Event != MouseInputEvent.Move)
return true;
if (editorCursor.CurrentToken != cursorToken)
return false;
var cell = worldRenderer.Viewport.ViewToWorld(mi.Location);
var isMoving = mi.Event == MouseInputEvent.Move;
@@ -205,23 +201,12 @@ namespace OpenRA.Mods.Common.Widgets
return false;
}
public void Tick()
public void Tick() { }
public void Dispose()
{
var cell = worldRenderer.Viewport.ViewToWorld(Viewport.LastMousePos);
var offset = WVec.Zero;
var location = world.Map.CenterOfCell(cell) + offset;
var cellScreenPosition = worldRenderer.ScreenPxPosition(location);
var cellScreenPixel = worldRenderer.Viewport.WorldToViewPx(cellScreenPosition);
var zoom = worldRenderer.Viewport.Zoom;
preview.Bounds.X = cellScreenPixel.X + (int)(zoom * bounds.X);
preview.Bounds.Y = cellScreenPixel.Y + (int)(zoom * bounds.Y);
preview.Bounds.Width = (int)(zoom * bounds.Width);
preview.Bounds.Height = (int)(zoom * bounds.Height);
editorCursor.Clear(cursorToken);
}
public void Dispose() { }
}
class PaintTileEditorAction : IEditorAction