diff --git a/OpenRa.Game/MainWindow.cs b/OpenRa.Game/MainWindow.cs index a39000bc4d..fd307f4aa7 100644 --- a/OpenRa.Game/MainWindow.cs +++ b/OpenRa.Game/MainWindow.cs @@ -51,9 +51,9 @@ namespace OpenRa.Game TileMix = new Package("../../../" + map.Theater + ".mix"); renderer.SetPalette(new HardwarePalette(renderer.Device, map)); - terrain = new TerrainRenderer(renderer, map, TileMix); + terrain = new TerrainRenderer(renderer, map, TileMix, viewport); - world = new World(renderer); + world = new World(renderer, viewport); treeCache = new TreeCache(renderer.Device, map, TileMix); foreach (TreeReference treeReference in map.Trees) @@ -65,7 +65,7 @@ namespace OpenRa.Game world.Add(new Refinery(24 * new float2(5, 7), 1)); - sidebar = new Sidebar(Race.Soviet, renderer); + sidebar = new Sidebar(Race.Soviet, renderer, viewport); } internal void Run() @@ -99,20 +99,7 @@ namespace OpenRa.Game void Frame() { - float2 r1 = new float2(2, -2) / viewport.Size; - float2 r2 = new float2(-1, 1); - - renderer.BeginFrame(r1, r2, viewport.Location); - - renderer.Device.EnableScissor(0, 0, viewport.ClientSize.Width - 128, viewport.ClientSize.Height); - terrain.Draw(viewport); - - world.Draw(renderer, viewport); - - renderer.Device.DisableScissor(); - sidebar.Paint(viewport); - - renderer.EndFrame(); + viewport.DrawRegions(); } } } diff --git a/OpenRa.Game/Region.cs b/OpenRa.Game/Region.cs index 06a6893262..4b32a04f22 100644 --- a/OpenRa.Game/Region.cs +++ b/OpenRa.Game/Region.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Text; using System.Drawing; +using System.Windows.Forms; namespace OpenRa.Game { @@ -9,9 +10,9 @@ namespace OpenRa.Game { Point location; Size size; - Renderable drawFunction; + MethodInvoker drawFunction; - public Region(Point location, Size size, Renderable drawFunction) + public Region(Point location, Size size, MethodInvoker drawFunction) { this.location = location; this.size = size; @@ -21,7 +22,7 @@ namespace OpenRa.Game public void Draw(Renderer renderer, Viewport viewport) { renderer.Device.EnableScissor(location.X, location.Y, size.Width, size.Height); - drawFunction(renderer, viewport); + drawFunction(); renderer.Device.DisableScissor(); } } diff --git a/OpenRa.Game/Sidebar.cs b/OpenRa.Game/Sidebar.cs index 3ed95bc27d..8dbe2fbb80 100644 --- a/OpenRa.Game/Sidebar.cs +++ b/OpenRa.Game/Sidebar.cs @@ -6,6 +6,7 @@ using BluntDirectX.Direct3D; using OpenRa.FileFormats; using System.Drawing; using System.IO; +using System.Windows.Forms; namespace OpenRa.Game { @@ -19,9 +20,12 @@ namespace OpenRa.Game Sprite blank; Dictionary sprites = new Dictionary(); + Viewport viewport; - public Sidebar(Race race, Renderer renderer) + public Sidebar(Race race, Renderer renderer, Viewport viewport) { + this.viewport = viewport; + viewport.RequestRegion(AnchorStyles.Right, 128, Paint); techTree.CurrentRace = race; techTree.Build("FACT", true); spriteRenderer = new SpriteRenderer(renderer, false); @@ -54,7 +58,7 @@ namespace OpenRa.Game DrawSprite(blank, ref p); } - public void Paint(Viewport viewport) + public void Paint() { float2 buildPos = viewport.Location + new float2(viewport.ClientSize.Width - 128, 0); float2 unitPos = viewport.Location + new float2(viewport.ClientSize.Width - 64, 0); diff --git a/OpenRa.Game/TerrainRenderer.cs b/OpenRa.Game/TerrainRenderer.cs index 7ea704b36d..3a50a7d280 100644 --- a/OpenRa.Game/TerrainRenderer.cs +++ b/OpenRa.Game/TerrainRenderer.cs @@ -5,6 +5,7 @@ using OpenRa.FileFormats; using BluntDirectX.Direct3D; using System.Drawing; using System.IO; +using System.Windows.Forms; namespace OpenRa.Game { @@ -14,13 +15,16 @@ namespace OpenRa.Game IndexBuffer indexBuffer; Sheet terrainSheet; TileSet tileSet; + Viewport viewport; Renderer renderer; Map map; - public TerrainRenderer(Renderer renderer, Map map, Package tilePackage) + public TerrainRenderer(Renderer renderer, Map map, Package tilePackage, Viewport viewport) { this.renderer = renderer; + this.viewport = viewport; + viewport.RequestRegion(AnchorStyles.Left, viewport.ClientSize.Width - 128, Draw); this.map = map; tileSet = new TileSet(tilePackage, map.TileSuffix); @@ -54,7 +58,7 @@ namespace OpenRa.Game indexBuffer.SetData(indices.ToArray()); } - public void Draw( Viewport viewport ) + public void Draw() { int indicesPerRow = map.Width * 6; int verticesPerRow = map.Width * 4; diff --git a/OpenRa.Game/Viewport.cs b/OpenRa.Game/Viewport.cs index 35be9c271f..32f8380f07 100644 --- a/OpenRa.Game/Viewport.cs +++ b/OpenRa.Game/Viewport.cs @@ -7,7 +7,6 @@ using BluntDirectX.Direct3D; namespace OpenRa.Game { - delegate void Renderable(Renderer renderer, Viewport viewport); class Viewport { readonly Size clientSize; @@ -34,7 +33,7 @@ namespace OpenRa.Game } List regions = new List(); - public void ResquestRegion(AnchorStyles anchor, int distanceFromAnchor, Renderable drawFunction) + public void RequestRegion(AnchorStyles anchor, int distanceFromAnchor, MethodInvoker drawFunction) { switch (anchor) { @@ -57,8 +56,15 @@ namespace OpenRa.Game public void DrawRegions() { + float2 r1 = new float2(2.0f / clientSize.Width, -2.0f / clientSize.Height); + float2 r2 = new float2(-1, 1); + + renderer.BeginFrame(r1, r2, scrollPosition); + foreach (Region region in regions) region.Draw(renderer, this); + + renderer.EndFrame(); } } } diff --git a/OpenRa.Game/World.cs b/OpenRa.Game/World.cs index 6c1e1cd403..4c26ae4108 100644 --- a/OpenRa.Game/World.cs +++ b/OpenRa.Game/World.cs @@ -4,6 +4,7 @@ using System.Text; using BluntDirectX.Direct3D; using OpenRa.FileFormats; using System.Drawing; +using System.Windows.Forms; namespace OpenRa.Game { @@ -11,12 +12,20 @@ namespace OpenRa.Game { List actors = new List(); SpriteRenderer spriteRenderer; + Renderer renderer; + Viewport viewport; - public World(Renderer renderer) { spriteRenderer = new SpriteRenderer(renderer, true); } + public World(Renderer renderer, Viewport viewport) + { + this.renderer = renderer; + this.viewport = viewport; + viewport.RequestRegion(AnchorStyles.Left, viewport.ClientSize.Width - 128, Draw); + spriteRenderer = new SpriteRenderer(renderer, true); + } public void Add(Actor a) { actors.Add(a); } - public void Draw(Renderer renderer, Viewport viewport) + public void Draw() { Range range = new Range(viewport.Location, viewport.Size);