Make brush rendering self-contained
This commit is contained in:
@@ -20,6 +20,7 @@ namespace OpenRA.Mods.Common.Widgets
|
||||
{
|
||||
public sealed class EditorTileBrush : IEditorBrush
|
||||
{
|
||||
public readonly TerrainTemplateInfo TerrainTemplate;
|
||||
public readonly ushort Template;
|
||||
|
||||
readonly WorldRenderer worldRenderer;
|
||||
@@ -27,11 +28,14 @@ namespace OpenRA.Mods.Common.Widgets
|
||||
readonly ITemplatedTerrainInfo terrainInfo;
|
||||
readonly EditorViewportControllerWidget editorWidget;
|
||||
readonly EditorActionManager editorActionManager;
|
||||
readonly EditorCursorLayer editorCursor;
|
||||
readonly int cursorToken;
|
||||
|
||||
bool painting;
|
||||
|
||||
readonly ITiledTerrainRenderer terrainRenderer;
|
||||
|
||||
CPos cell;
|
||||
readonly List<IRenderable> preview = new();
|
||||
|
||||
public EditorTileBrush(EditorViewportControllerWidget editorWidget, ushort id, WorldRenderer wr)
|
||||
{
|
||||
this.editorWidget = editorWidget;
|
||||
@@ -42,12 +46,12 @@ namespace OpenRA.Mods.Common.Widgets
|
||||
throw new InvalidDataException("EditorTileBrush can only be used with template-based tilesets");
|
||||
|
||||
editorActionManager = world.WorldActor.Trait<EditorActionManager>();
|
||||
editorCursor = world.WorldActor.Trait<EditorCursorLayer>();
|
||||
terrainRenderer = world.WorldActor.Trait<ITiledTerrainRenderer>();
|
||||
|
||||
Template = id;
|
||||
|
||||
var template = terrainInfo.Templates.First(t => t.Value.Id == id).Value;
|
||||
cursorToken = editorCursor.SetTerrainTemplate(wr, template);
|
||||
TerrainTemplate = terrainInfo.Templates.First(t => t.Value.Id == id).Value;
|
||||
cell = wr.Viewport.ViewToWorld(wr.Viewport.WorldToViewPx(Viewport.LastMousePos));
|
||||
UpdatePreview();
|
||||
}
|
||||
|
||||
public bool HandleMouseInput(MouseInput mi)
|
||||
@@ -81,9 +85,6 @@ 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;
|
||||
|
||||
@@ -143,12 +144,30 @@ namespace OpenRA.Mods.Common.Widgets
|
||||
return false;
|
||||
}
|
||||
|
||||
void UpdatePreview()
|
||||
{
|
||||
var pos = world.Map.CenterOfCell(cell);
|
||||
|
||||
preview.Clear();
|
||||
preview.AddRange(terrainRenderer.RenderPreview(worldRenderer, TerrainTemplate, pos));
|
||||
}
|
||||
|
||||
void IEditorBrush.TickRender(WorldRenderer wr, Actor self)
|
||||
{
|
||||
var currentCell = wr.Viewport.ViewToWorld(Viewport.LastMousePos);
|
||||
if (cell != currentCell)
|
||||
{
|
||||
cell = currentCell;
|
||||
UpdatePreview();
|
||||
}
|
||||
}
|
||||
|
||||
IEnumerable<IRenderable> IEditorBrush.RenderAboveShroud(Actor self, WorldRenderer wr) { return preview; }
|
||||
IEnumerable<IRenderable> IEditorBrush.RenderAnnotations(Actor self, WorldRenderer wr) { yield break; }
|
||||
|
||||
public void Tick() { }
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
editorCursor.Clear(cursorToken);
|
||||
}
|
||||
public void Dispose() { }
|
||||
}
|
||||
|
||||
sealed class PaintTileEditorAction : IEditorAction
|
||||
|
||||
Reference in New Issue
Block a user