From f6eb20bbf8214c2099f3243f8aabbda336bf026f Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Thu, 8 Oct 2009 22:39:26 +1300 Subject: [PATCH] show potential selections in band-box; FindUnits is still wrong. --- OpenRa.Game/Controller.cs | 11 +++--- OpenRa.Game/Game.cs | 5 +-- OpenRa.Game/Graphics/WorldRenderer.cs | 51 +++++++++++++++------------ OpenRa.Game/Sidebar.cs | 2 +- line.fx | 7 ++-- 5 files changed, 43 insertions(+), 33 deletions(-) diff --git a/OpenRa.Game/Controller.cs b/OpenRa.Game/Controller.cs index f037e29994..b5ce63bdac 100644 --- a/OpenRa.Game/Controller.cs +++ b/OpenRa.Game/Controller.cs @@ -58,17 +58,20 @@ namespace OpenRa.Game orderGenerator.Order(game, new int2((int)xy.X, (int)xy.Y)).Apply(game); } - public IOrderGenerator FindUnit(float2 a, float2 b) + public Unit FindUnit(float2 a, float2 b) + { + return FindUnits(game, 24 * a, 24 * b).FirstOrDefault(); + } + + public static IEnumerable FindUnits(Game game, float2 a, float2 b) { - a = 24 * a; b = 24 * b; var min = new float2(Math.Min(a.X, b.X), Math.Min(a.Y, b.Y)); var max = new float2(Math.Max(a.X, b.X), Math.Max(a.Y, b.Y)); var rect = new RectangleF(min.X, min.Y, max.X - min.X, max.Y - min.Y); return game.world.Actors.OfType() - .Where(x => (x.owner == game.LocalPlayer) && (x.Bounds.IntersectsWith(rect))) - .FirstOrDefault(); + .Where(x => (x.owner == game.LocalPlayer) && (x.Bounds.IntersectsWith(rect))); } public Pair? SelectionBox() diff --git a/OpenRa.Game/Game.cs b/OpenRa.Game/Game.cs index c81428fa8f..0c80a90406 100644 --- a/OpenRa.Game/Game.cs +++ b/OpenRa.Game/Game.cs @@ -24,7 +24,7 @@ namespace OpenRa.Game public readonly Dictionary players = new Dictionary(); // temporary, until we remove all the subclasses of Building - public Dictionary> buildingCreation; + public Dictionary> buildingCreation; public Player LocalPlayer { get { return players[localPlayerIndex]; } } @@ -51,11 +51,12 @@ namespace OpenRa.Game var buildings = new[] { "fact", "powr", "apwr", "barr", "atek", "stek", "dome" }; buildingCreation = buildings.ToDictionary(s => s, - s => (Func)( + s => (Func)( (l, o) => new Building(s, l, o, this))); buildingCreation.Add("proc", (location, owner) => new Refinery(location, owner, this)); buildingCreation.Add("weap", (location, owner) => new WarFactory(location, owner, this)); + buildingCreation.Add("3tnk", (location, owner) => new TurretedUnit("3tnk", location, owner, this)); controller = new Controller(this); // CAREFUL THERES AN UGLY HIDDEN DEPENDENCY HERE STILL worldRenderer = new WorldRenderer(renderer, world); diff --git a/OpenRa.Game/Graphics/WorldRenderer.cs b/OpenRa.Game/Graphics/WorldRenderer.cs index f38dc77ecf..08c7f49486 100644 --- a/OpenRa.Game/Graphics/WorldRenderer.cs +++ b/OpenRa.Game/Graphics/WorldRenderer.cs @@ -53,28 +53,6 @@ namespace OpenRa.Game.Graphics spriteRenderer.Flush(); - var selectedUnit = world.game.controller.orderGenerator as Unit; - if (selectedUnit != null) - { - var center = selectedUnit.CenterLocation; - var size = selectedUnit.SelectedSize; - - var xy = center - 0.5f * size; - var XY = center + 0.5f * size; - var Xy = new float2( XY.X, xy.Y ); - var xY = new float2( xy.X, XY.Y ); - - lineRenderer.DrawLine(xy, xy + new float2(4, 0), Color.White, Color.White); - lineRenderer.DrawLine(xy, xy + new float2(0, 4), Color.White, Color.White); - lineRenderer.DrawLine(Xy, Xy + new float2(-4, 0), Color.White, Color.White); - lineRenderer.DrawLine(Xy, Xy + new float2(0, 4), Color.White, Color.White); - - lineRenderer.DrawLine(xY, xY + new float2(4, 0), Color.White, Color.White); - lineRenderer.DrawLine(xY, xY + new float2(0, -4), Color.White, Color.White); - lineRenderer.DrawLine(XY, XY + new float2(-4, 0), Color.White, Color.White); - lineRenderer.DrawLine(XY, XY + new float2(0, -4), Color.White, Color.White); - } - var selbox = world.game.controller.SelectionBox(); if (selbox != null) { @@ -86,9 +64,38 @@ namespace OpenRa.Game.Graphics lineRenderer.DrawLine(a + b, a + b + c, Color.White, Color.White); lineRenderer.DrawLine(a + b + c, a + c, Color.White, Color.White); lineRenderer.DrawLine(a, a + c, Color.White, Color.White); + + foreach (var u in Controller.FindUnits(world.game, selbox.Value.First, selbox.Value.Second)) + DrawSelectionBox(u, Color.Yellow); } + + var selectedUnit = world.game.controller.orderGenerator as Unit; + if (selectedUnit != null) + DrawSelectionBox(selectedUnit, Color.White); + lineRenderer.Flush(); } + + void DrawSelectionBox(Unit selectedUnit, Color c) + { + var center = selectedUnit.CenterLocation; + var size = selectedUnit.SelectedSize; + + var xy = center - 0.5f * size; + var XY = center + 0.5f * size; + var Xy = new float2(XY.X, xy.Y); + var xY = new float2(xy.X, XY.Y); + + lineRenderer.DrawLine(xy, xy + new float2(4, 0), c, c); + lineRenderer.DrawLine(xy, xy + new float2(0, 4), c, c); + lineRenderer.DrawLine(Xy, Xy + new float2(-4, 0), c, c); + lineRenderer.DrawLine(Xy, Xy + new float2(0, 4), c, c); + + lineRenderer.DrawLine(xY, xY + new float2(4, 0), c, c); + lineRenderer.DrawLine(xY, xY + new float2(0, -4), c, c); + lineRenderer.DrawLine(XY, XY + new float2(-4, 0), c, c); + lineRenderer.DrawLine(XY, XY + new float2(0, -4), c, c); + } } } diff --git a/OpenRa.Game/Sidebar.cs b/OpenRa.Game/Sidebar.cs index 4974a67753..ba5f843f30 100644 --- a/OpenRa.Game/Sidebar.cs +++ b/OpenRa.Game/Sidebar.cs @@ -200,7 +200,7 @@ namespace OpenRa.Game { game.world.AddFrameEndTask(_ => { - Func newBuilding; + Func newBuilding; if (game.buildingCreation.TryGetValue(building.Name, out newBuilding)) { Log.Write("Player \"{0}\" builds {1}", building.Owner.PlayerName, building.Name); diff --git a/line.fx b/line.fx index d62fc27cf8..2815387772 100644 --- a/line.fx +++ b/line.fx @@ -27,20 +27,19 @@ VertexOut Simple_vp(VertexIn v) { o.Position = float4(p.x,p.y,0,1); o.Color.rg = v.RG.xy; o.Color.ba = v.BA.xy; - o.Color.a = 1.0f; +// o.Color.a = 1.0f; return o; } const float2 texelOffset = float2( 0, 1.0f/32.0f ); float4 Simple_fp(FragmentIn f) : COLOR0 { - return float4(1,1,1,1); - //return f.Color; + return f.Color; } technique high_quality { pass p0 { - AlphaBlendEnable = false; + AlphaBlendEnable = true; ZWriteEnable = false; ZEnable = false; CullMode = None;