diff --git a/OpenRa.DataStructures/Delegates.cs b/OpenRa.DataStructures/Delegates.cs index bc73953c79..29d63224f4 100644 --- a/OpenRa.DataStructures/Delegates.cs +++ b/OpenRa.DataStructures/Delegates.cs @@ -10,4 +10,5 @@ namespace OpenRa public delegate T Provider(); public delegate T Provider( U u ); public delegate T Provider( U u, V v ); + public delegate void Action(); } diff --git a/OpenRa.Game/Game.cs b/OpenRa.Game/Game.cs index a74f086a0b..d51889c171 100644 --- a/OpenRa.Game/Game.cs +++ b/OpenRa.Game/Game.cs @@ -27,7 +27,7 @@ namespace OpenRa.Game viewport = new Viewport(clientSize, map.Size, renderer); terrain = new TerrainRenderer(renderer, map, viewport); - world = new World(renderer, viewport); + world = new World(renderer, this); treeCache = new TreeCache(renderer.Device, map); foreach (TreeReference treeReference in map.Trees) diff --git a/OpenRa.Game/MainWindow.cs b/OpenRa.Game/MainWindow.cs index e233a3ee3d..b867ca4829 100644 --- a/OpenRa.Game/MainWindow.cs +++ b/OpenRa.Game/MainWindow.cs @@ -76,7 +76,7 @@ namespace OpenRa.Game if (e.Button == MouseButtons.Left) { float2 point = new float2(e.Location) + game.viewport.Location; - RectangleF rect = new RectangleF(sidebar.Location.ToPointF(), new SizeF(sidebar.Width, game.viewport.Height)); + RectangleF rect = new RectangleF(sidebar.Region.Location.ToPointF(), new SizeF(sidebar.Width, game.viewport.Height)); if (rect.Contains(point.ToPointF())) { sidebar.Build( sidebar.FindSpriteAtPoint( point ), game ); diff --git a/OpenRa.Game/Region.cs b/OpenRa.Game/Region.cs index fa535b40cc..6699acb9a1 100644 --- a/OpenRa.Game/Region.cs +++ b/OpenRa.Game/Region.cs @@ -8,57 +8,71 @@ namespace OpenRa.Game { class Region { - Point location; - Size size; - Action drawFunction; + float2 location; + Viewport viewport; - static Size MakeSize(Viewport v, DockStyle d, int size) + public float2 Location + { + get { return location + viewport.Location; } + } + + float2 size; + + public float2 Size + { + get { return size; } + } + + Action drawFunction; + + static float2 MakeSize(Viewport v, DockStyle d, float size) { switch (d) { case DockStyle.Top: case DockStyle.Bottom: - return new Size(v.Width, size); + return new float2(v.Width, size); case DockStyle.Left: case DockStyle.Right: - return new Size(size, v.Height); + return new float2(size, v.Height); default: throw new NotImplementedException(); } } - public static Region Create(Viewport v, DockStyle d, int size, Action f) + public static Region Create(Viewport v, DockStyle d, float size, Action f) { - Size s = MakeSize(v, d, size); + float2 s = MakeSize(v, d, size); switch (d) { case DockStyle.Top: case DockStyle.Left: - return new Region(new Point(0,0), s, f); + return new Region(new float2(0,0), s, f, v); case DockStyle.Right: case DockStyle.Bottom: - return new Region(new Point( v.Width - s.Width, v.Height - s.Height ), s, f); + return new Region(new float2( v.Width - s.X, v.Height - s.Y ), s, f, v); default: throw new NotImplementedException(); } } - Region(Point location, Size size, Action drawFunction) + Region(float2 location, float2 size, Action drawFunction, Viewport viewport) { this.location = location; this.size = size; this.drawFunction = drawFunction; + this.viewport = viewport; } - public void Draw(Renderer renderer, Game game) + public void Draw(Renderer renderer) { - renderer.Device.EnableScissor(location.X, location.Y, size.Width, size.Height); - drawFunction( game ); + renderer.Device.EnableScissor((int)location.X, (int)location.Y, (int)size.X, (int)size.Y); + drawFunction(); renderer.Device.DisableScissor(); } } diff --git a/OpenRa.Game/Sidebar.cs b/OpenRa.Game/Sidebar.cs index f66a7560e2..c9fc028353 100644 --- a/OpenRa.Game/Sidebar.cs +++ b/OpenRa.Game/Sidebar.cs @@ -16,9 +16,14 @@ namespace OpenRa.Game SpriteRenderer spriteRenderer; Sprite blank; + readonly Region region; + + public Region Region + { + get { return region; } + } Dictionary sprites = new Dictionary(); - Viewport viewport; const float spriteWidth = 64, spriteHeight = 48; public float Width @@ -30,8 +35,8 @@ namespace OpenRa.Game public Sidebar( TechTree.TechTree techTree, Race race, Renderer renderer, Viewport viewport ) { this.techTree = techTree; - this.viewport = viewport; - viewport.AddRegion( Region.Create(viewport, DockStyle.Right, 128, Paint)); + region = Region.Create(viewport, DockStyle.Right, 128, Paint); + viewport.AddRegion( region ); techTree.CurrentRace = race; techTree.Build("FACT", true); spriteRenderer = new SpriteRenderer(renderer, false); @@ -68,17 +73,10 @@ namespace OpenRa.Game DrawSprite(blank, ref p); } - float2 location; - - public float2 Location + void Paint() { - get { return location; } - } - - public void Paint( Game game ) - { - float2 buildPos = location = viewport.Location + new float2(viewport.Size.X - spriteWidth * 2, 0); - float2 unitPos = viewport.Location + new float2(viewport.Size.X - spriteWidth, 0); + float2 buildPos = region.Location + new float2(region.Size.X - spriteWidth * 2, 0); + float2 unitPos = region.Location + new float2(region.Size.X - spriteWidth, 0); foreach (Item i in techTree.BuildableItems) { @@ -91,8 +89,8 @@ namespace OpenRa.Game DrawSprite( sprite, ref unitPos ); } - Fill( viewport.Location.Y + viewport.Size.Y, buildPos ); - Fill( viewport.Location.Y + viewport.Size.Y, unitPos ); + Fill( region.Location.Y + region.Size.Y, buildPos ); + Fill( region.Location.Y + region.Size.Y, unitPos ); spriteRenderer.Flush(); } @@ -105,12 +103,12 @@ namespace OpenRa.Game RectangleF rect; if (i.IsStructure) { - rect = new RectangleF(location.X, location.Y + y1, spriteWidth, spriteHeight); + rect = new RectangleF(region.Location.X, region.Location.Y + y1, spriteWidth, spriteHeight); y1 += 48; } else { - rect = new RectangleF(location.X + spriteWidth, location.Y + y2, spriteWidth, spriteHeight); + rect = new RectangleF(region.Location.X + spriteWidth, region.Location.Y + y2, spriteWidth, spriteHeight); y2 += 48; } if (rect.Contains(point.ToPointF())) return i.tag; diff --git a/OpenRa.Game/TerrainRenderer.cs b/OpenRa.Game/TerrainRenderer.cs index 673291e8f2..7e8fc5ec49 100644 --- a/OpenRa.Game/TerrainRenderer.cs +++ b/OpenRa.Game/TerrainRenderer.cs @@ -15,7 +15,7 @@ namespace OpenRa.Game IndexBuffer indexBuffer; Sheet terrainSheet; public TileSet tileSet; - Viewport viewport; + Region region; Renderer renderer; Map map; @@ -23,8 +23,8 @@ namespace OpenRa.Game public TerrainRenderer(Renderer renderer, Map map, Viewport viewport) { this.renderer = renderer; - this.viewport = viewport; - viewport.AddRegion(Region.Create(viewport, DockStyle.Left, viewport.Width - 128, Draw)); + region = Region.Create(viewport, DockStyle.Left, viewport.Width - 128, Draw); + viewport.AddRegion(region); this.map = map; tileSet = new TileSet( map.TileSuffix ); @@ -58,14 +58,14 @@ namespace OpenRa.Game indexBuffer.SetData( indices.ToArray() ); } - void Draw( Game game ) + void Draw() { int indicesPerRow = map.Width * 6; int verticesPerRow = map.Width * 4; - int visibleRows = (int)(viewport.Size.Y / 24.0f + 2); + int visibleRows = (int)(region.Size.Y / 24.0f + 2); - int firstRow = (int)(viewport.Location.Y / 24.0f); + int firstRow = (int)(region.Location.Y / 24.0f); int lastRow = firstRow + visibleRows; if (lastRow < 0 || firstRow > map.Height) diff --git a/OpenRa.Game/Viewport.cs b/OpenRa.Game/Viewport.cs index 996bcf217b..29f70099af 100644 --- a/OpenRa.Game/Viewport.cs +++ b/OpenRa.Game/Viewport.cs @@ -45,7 +45,7 @@ namespace OpenRa.Game renderer.BeginFrame(r1, r2, scrollPosition); foreach (Region region in regions) - region.Draw(renderer, game); + region.Draw(renderer); renderer.EndFrame(); } diff --git a/OpenRa.Game/World.cs b/OpenRa.Game/World.cs index 6a311f0bd9..6304d12869 100644 --- a/OpenRa.Game/World.cs +++ b/OpenRa.Game/World.cs @@ -13,13 +13,16 @@ namespace OpenRa.Game List actors = new List(); List> frameEndActions = new List>(); SpriteRenderer spriteRenderer; - Viewport viewport; + Game game; + Region region; public IOrderGenerator orderGenerator; - public World(Renderer renderer, Viewport viewport) + public World(Renderer renderer, Game game) { - this.viewport = viewport; - viewport.AddRegion(Region.Create(viewport, DockStyle.Left, viewport.Width - 128, Draw)); + region = Region.Create(game.viewport, DockStyle.Left, game.viewport.Width - 128, Draw); + this.game = game; + game.viewport.AddRegion(region); + spriteRenderer = new SpriteRenderer(renderer, true); } @@ -29,13 +32,13 @@ namespace OpenRa.Game int lastTime = Environment.TickCount; - void Draw( Game game ) + void Draw() { int t = Environment.TickCount; int dt = t - lastTime; lastTime = t; - Range range = new Range(viewport.Location, viewport.Location + viewport.Size); + Range range = new Range(region.Location, region.Location + region.Size); foreach (Actor a in actors) {