Files
OpenRA/OpenRa.Game/Graphics/Viewport.cs
Matthew Bowra-Dean fe78e22747 Fixed the building placement to have the cursor in the centre. Replaced magic numbers with Game.CellSize
Using the building footprint, the placement overlay is offset from the cursor so the cursor is in the approximate middle of the overlay (not precisely due to overlay snapping to tiles). The tile size (24) was used as a magic number in a lot of places, they have been replaced with Game.CellSize.
2009-10-15 03:16:44 +13:00

69 lines
1.8 KiB
C#

using System.Collections.Generic;
using System;
using System.Linq;
namespace OpenRa.Game.Graphics
{
class Viewport
{
readonly float2 size;
readonly float2 mapSize;
float2 scrollPosition;
readonly Renderer renderer;
public float2 Location { get { return scrollPosition; } }
public float2 Size { get { return size; } }
public int Width { get { return (int)size.X; } }
public int Height { get { return (int)size.Y; } }
public void Scroll(float2 delta)
{
scrollPosition = (scrollPosition + delta).Constrain(float2.Zero, mapSize);
}
public Viewport(float2 size, float2 mapSize, Renderer renderer)
{
this.size = size;
this.mapSize = Game.CellSize * mapSize - size + new float2(128, 0);
this.renderer = renderer;
}
List<Region> regions = new List<Region>();
public void AddRegion(Region r) { regions.Add(r); }
public void DrawRegions()
{
float2 r1 = new float2(2, -2) / Size;
float2 r2 = new float2(-1, 1);
renderer.BeginFrame(r1, r2, scrollPosition);
foreach (Region region in regions)
region.Draw(renderer);
renderer.EndFrame();
}
Region dragRegion = null;
public void DispatchMouseInput(MouseInput mi)
{
if (dragRegion != null) {
dragRegion.HandleMouseInput( mi );
if (mi.Event == MouseInputEvent.Up) dragRegion = null;
return;
}
dragRegion = regions.FirstOrDefault(r => r.Contains(mi.Location) && r.HandleMouseInput(mi));
if (mi.Event != MouseInputEvent.Down)
dragRegion = null;
}
public float2 ViewToWorld(MouseInput mi)
{
return (1 / 24.0f) * (new float2(mi.Location.X, mi.Location.Y) + Location);
}
}
}