diff --git a/OpenRa.Game/MainWindow.cs b/OpenRa.Game/MainWindow.cs index ca823ea92f..c8eeabfa6b 100644 --- a/OpenRa.Game/MainWindow.cs +++ b/OpenRa.Game/MainWindow.cs @@ -22,6 +22,7 @@ namespace OpenRa.Game TreeCache treeCache; TerrainRenderer terrain; Sidebar sidebar; + Viewport viewport; static Size GetResolution(Settings settings) { @@ -36,6 +37,7 @@ namespace OpenRa.Game FormBorderStyle = FormBorderStyle.None; BackColor = Color.Black; renderer = new Renderer(this, GetResolution(settings), false); + viewport = new Viewport(ClientSize); Visible = true; SheetBuilder.Initialize(renderer.Device); @@ -71,7 +73,7 @@ namespace OpenRa.Game } } - PointF scrollPos; + int x1,y1; protected override void OnMouseDown(MouseEventArgs e) @@ -88,6 +90,7 @@ namespace OpenRa.Game if (e.Button != 0) { + PointF scrollPos = viewport.ScrollPosition; scrollPos.X += x1 - e.X; scrollPos.Y += y1 - e.Y; @@ -96,25 +99,24 @@ namespace OpenRa.Game scrollPos.X = Util.Constrain(scrollPos.X, new Range(0, map.Width * 24 - ClientSize.Width + 128)); scrollPos.Y = Util.Constrain(scrollPos.Y, new Range(0, map.Height * 24 - ClientSize.Height)); + viewport.ScrollPosition = scrollPos; } } void Frame() { - PointF r1 = new PointF(2.0f / ClientSize.Width, -2.0f / ClientSize.Height); + PointF r1 = new PointF(2.0f / viewport.ClientSize.Width, -2.0f / viewport.ClientSize.Height); PointF r2 = new PointF(-1, 1); - renderer.BeginFrame(r1, r2, scrollPos); + renderer.BeginFrame(r1, r2, viewport.ScrollPosition); - renderer.Device.EnableScissor(0, 0, ClientSize.Width - 128, ClientSize.Height); - terrain.Draw( ClientSize, scrollPos ); + renderer.Device.EnableScissor(0, 0, viewport.ClientSize.Width - 128, viewport.ClientSize.Height); + terrain.Draw(viewport); - world.Draw(renderer, - new Range(scrollPos.X, scrollPos.X + ClientSize.Width), - new Range(scrollPos.Y, scrollPos.Y + ClientSize.Height)); + world.Draw(renderer, viewport); renderer.Device.DisableScissor(); - sidebar.Paint(ClientSize, scrollPos); + sidebar.Paint(viewport); renderer.EndFrame(); } diff --git a/OpenRa.Game/OpenRa.Game.csproj b/OpenRa.Game/OpenRa.Game.csproj index a699d11977..de5121cc69 100644 --- a/OpenRa.Game/OpenRa.Game.csproj +++ b/OpenRa.Game/OpenRa.Game.csproj @@ -64,6 +64,7 @@ + diff --git a/OpenRa.Game/Sidebar.cs b/OpenRa.Game/Sidebar.cs index 029354cb47..48cec2ff38 100644 --- a/OpenRa.Game/Sidebar.cs +++ b/OpenRa.Game/Sidebar.cs @@ -54,10 +54,10 @@ namespace OpenRa.Game DrawSprite(blank, ref p); } - public void Paint(Size clientSize, PointF scrollOffset) + public void Paint(Viewport viewport) { - PointF buildPos = new PointF(clientSize.Width - 128 + scrollOffset.X, scrollOffset.Y); - PointF unitPos = new PointF(clientSize.Width - 64 + scrollOffset.X, scrollOffset.Y); + PointF buildPos = new PointF(viewport.ClientSize.Width - 128 + viewport.ScrollPosition.X, viewport.ScrollPosition.Y); + PointF unitPos = new PointF(viewport.ClientSize.Width - 64 + viewport.ScrollPosition.X, viewport.ScrollPosition.Y); foreach (Item i in techTree.BuildableItems) { @@ -70,8 +70,8 @@ namespace OpenRa.Game DrawSprite( sprite, ref unitPos ); } - Fill(clientSize, buildPos); - Fill(clientSize, unitPos); + Fill(viewport.ClientSize, buildPos); + Fill(viewport.ClientSize, unitPos); spriteRenderer.Flush(); } diff --git a/OpenRa.Game/TerrainRenderer.cs b/OpenRa.Game/TerrainRenderer.cs index 202fc25e34..6448c900f2 100644 --- a/OpenRa.Game/TerrainRenderer.cs +++ b/OpenRa.Game/TerrainRenderer.cs @@ -54,14 +54,14 @@ namespace OpenRa.Game indexBuffer.SetData(indices.ToArray()); } - public void Draw( Size screenSize, PointF scrollPos ) + public void Draw( Viewport viewport ) { int indicesPerRow = map.Width * 6; int verticesPerRow = map.Width * 4; - int visibleRows = (int)(screenSize.Height / 24.0f + 2); + int visibleRows = (int)(viewport.ClientSize.Height / 24.0f + 2); - int firstRow = (int)(scrollPos.Y / 24.0f); + int firstRow = (int)(viewport.ScrollPosition.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 new file mode 100644 index 0000000000..380062a777 --- /dev/null +++ b/OpenRa.Game/Viewport.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Drawing; + +namespace OpenRa.Game +{ + class Viewport + { + readonly Size clientSize; + PointF scrollPosition; + + public PointF ScrollPosition + { + get { return scrollPosition; } + set { scrollPosition = value; } + } + + public Size ClientSize + { + get { return clientSize; } + } + + + public Viewport(Size clientSize) + { + this.clientSize = clientSize; + } + } +} diff --git a/OpenRa.Game/World.cs b/OpenRa.Game/World.cs index c879d6b1cf..d8d9f627e4 100644 --- a/OpenRa.Game/World.cs +++ b/OpenRa.Game/World.cs @@ -19,8 +19,10 @@ namespace OpenRa.Game public void Add(Actor a) { actors.Add(a); } - public void Draw(Renderer renderer, Range xr, Range yr) + public void Draw(Renderer renderer, Viewport viewport) { + Range xr = new Range(viewport.ScrollPosition.X, viewport.ScrollPosition.X + viewport.ClientSize.Width); + Range yr = new Range(viewport.ScrollPosition.Y, viewport.ScrollPosition.Y + viewport.ClientSize.Height); foreach (Actor a in actors) { Sprite[] images = a.CurrentImages;