public Viewport(WorldRenderer wr, Map map) { worldRenderer = wr; var grid = Game.ModData.Manifest.Get<MapGrid>(); // Calculate map bounds in world-px if (wr.World.Type == WorldType.Editor) { // The full map is visible in the editor var width = map.MapSize.X * grid.TileSize.Width; var height = map.MapSize.Y * grid.TileSize.Height; if (wr.World.Map.Grid.Type == MapGridType.RectangularIsometric) height /= 2; mapBounds = new Rectangle(0, 0, width, height); CenterLocation = new int2(width / 2, height / 2); } else { var tl = wr.ScreenPxPosition(map.ProjectedTopLeft); var br = wr.ScreenPxPosition(map.ProjectedBottomRight); mapBounds = Rectangle.FromLTRB(tl.X, tl.Y, br.X, br.Y); CenterLocation = (tl + br) / 2; } Zoom = Game.Settings.Graphics.PixelDouble ? 2 : 1; tileSize = grid.TileSize; }
public Viewport(WorldRenderer wr, Map map) { worldRenderer = wr; var grid = Game.ModData.Manifest.Get <MapGrid>(); // Calculate map bounds in world-px if (wr.World.Type == WorldType.Editor) { // The full map is visible in the editor var width = map.MapSize.X * grid.TileSize.Width; var height = map.MapSize.Y * grid.TileSize.Height; if (wr.World.Map.Grid.Type == MapGridType.RectangularIsometric) { height /= 2; } mapBounds = new Rectangle(0, 0, width, height); CenterLocation = new int2(width / 2, height / 2); } else { var tl = wr.ScreenPxPosition(map.ProjectedTopLeft); var br = wr.ScreenPxPosition(map.ProjectedBottomRight); mapBounds = Rectangle.FromLTRB(tl.X, tl.Y, br.X, br.Y); CenterLocation = (tl + br) / 2; } Zoom = Game.Settings.Graphics.PixelDouble ? 2 : 1; tileSize = grid.TileSize; }
public CPos ViewToWorld(int2 view) { var world = worldRenderer.Viewport.ViewToWorldPx(view); var map = worldRenderer.World.Map; var ts = Game.ModData.Manifest.TileSize; var candidates = CandidateMouseoverCells(world); var tileSet = worldRenderer.World.TileSet; foreach (var uv in candidates) { // Coarse filter to nearby cells var p = map.CenterOfCell(uv.ToCPos(map.TileShape)); var s = worldRenderer.ScreenPxPosition(p); if (Math.Abs(s.X - world.X) <= ts.Width && Math.Abs(s.Y - world.Y) <= ts.Height) { var ramp = 0; if (map.Contains(uv)) { var tile = map.MapTiles.Value[uv]; var ti = tileSet.GetTileInfo(tile); if (ti != null) { ramp = ti.RampType; } } var corners = map.CellCorners[ramp]; var pos = map.CenterOfCell(uv.ToCPos(map)); var screen = corners.Select(c => worldRenderer.ScreenPxPosition(pos + c)).ToArray(); if (screen.PolygonContains(world)) { return(uv.ToCPos(map)); } } } // Mouse is not directly over a cell (perhaps on a cliff) // Try and find the closest cell if (candidates.Any()) { return(candidates.OrderBy(uv => { var p = map.CenterOfCell(uv.ToCPos(map.TileShape)); var s = worldRenderer.ScreenPxPosition(p); var dx = Math.Abs(s.X - world.X); var dy = Math.Abs(s.Y - world.Y); return dx * dx + dy * dy; }).First().ToCPos(map)); } // Something is very wrong, but lets return something that isn't completely bogus and hope the caller can recover return(worldRenderer.World.Map.CellContaining(worldRenderer.Position(ViewToWorldPx(view)))); }
public Viewport(WorldRenderer wr, Map map) { worldRenderer = wr; // Calculate map bounds in world-px var b = map.Bounds; var tl = wr.ScreenPxPosition(new CPos(b.Left, b.Top).TopLeft); var br = wr.ScreenPxPosition(new CPos(b.Right, b.Bottom).BottomRight); mapBounds = Rectangle.FromLTRB(tl.X, tl.Y, br.X, br.Y); CenterLocation = (tl + br) / 2; Zoom = Game.Settings.Graphics.PixelDouble ? 2 : 1; }
public Viewport(WorldRenderer wr, Map map) { worldRenderer = wr; // Calculate map bounds in world-px var b = map.Bounds; var tl = wr.ScreenPxPosition(new CPos(b.Left, b.Top).TopLeft); var br = wr.ScreenPxPosition(new CPos(b.Right, b.Bottom).BottomRight); mapBounds = Rectangle.FromLTRB(tl.X, tl.Y, br.X, br.Y); CenterLocation = (tl + br) / 2; Zoom = Game.Settings.Graphics.PixelDouble ? 2 : 1; }
public Viewport(WorldRenderer wr, Map map) { worldRenderer = wr; // Calculate map bounds in world-px var b = map.Bounds; // Expand to corners of cells var tl = wr.ScreenPxPosition(map.CenterOfCell(Map.MapToCell(map.TileShape, new CPos(b.Left, b.Top))) - new WVec(512, 512, 0)); var br = wr.ScreenPxPosition(map.CenterOfCell(Map.MapToCell(map.TileShape, new CPos(b.Right, b.Bottom))) + new WVec(511, 511, 0)); mapBounds = Rectangle.FromLTRB(tl.X, tl.Y, br.X, br.Y); CenterLocation = (tl + br) / 2; Zoom = Game.Settings.Graphics.PixelDouble ? 2 : 1; }
public Viewport(WorldRenderer wr, Map map) { worldRenderer = wr; var cells = wr.World.Type == WorldType.Editor ? map.AllCells : map.CellsInsideBounds; // Calculate map bounds in world-px var tl = wr.ScreenPxPosition(map.CenterOfCell(cells.TopLeft) - new WVec(512, 512, 0)); var br = wr.ScreenPxPosition(map.CenterOfCell(cells.BottomRight) + new WVec(511, 511, 0)); mapBounds = Rectangle.FromLTRB(tl.X, tl.Y, br.X, br.Y); CenterLocation = (tl + br) / 2; Zoom = Game.Settings.Graphics.PixelDouble ? 2 : 1; tileSize = Game.ModData.Manifest.TileSize; }
public float3 ScreenPosition(WorldRenderer wr) { var xy = wr.ScreenPxPosition(pos) + wr.ScreenPxOffset(offset) - (0.5f * scale * sprite.Size.XY).ToInt2(); // HACK: The z offset needs to be applied somewhere, but this probably is the wrong place. return(new float3(xy, sprite.Offset.Z + wr.ScreenZPosition(pos, 0) - 0.5f * scale * sprite.Size.Z)); }
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr) { if (!self.Owner.IsAlliedWith(self.World.RenderPlayer) || self.World.FogObscures(self)) yield break; if (Info.RenderSelectionBox) yield return new SelectionBoxRenderable(self, Info.SelectionBoxColor); if (Info.RenderSelectionBars) yield return new SelectionBarsRenderable(self); if (self.World.LocalPlayer != null && self.World.LocalPlayer.PlayerActor.Trait<DeveloperMode>().PathDebug) yield return new TargetLineRenderable(ActivityTargetPath(), Color.Green); var b = self.VisualBounds; var pos = wr.ScreenPxPosition(self.CenterPosition); var tl = wr.Viewport.WorldToViewPx(pos + new int2(b.Left, b.Top)); var bl = wr.Viewport.WorldToViewPx(pos + new int2(b.Left, b.Bottom)); var tm = wr.Viewport.WorldToViewPx(pos + new int2((b.Left + b.Right) / 2, b.Top)); foreach (var r in DrawControlGroup(wr, self, tl)) yield return r; foreach (var r in DrawPips(wr, self, bl)) yield return r; foreach (var r in DrawTags(wr, self, tm)) yield return r; }
public void Render(WorldRenderer wr) { if (!actor.IsInWorld || actor.IsDead) { return; } var health = actor.TraitOrDefault <IHealth>(); var screenPos = wr.ScreenPxPosition(pos); var bounds = actor.VisualBounds; bounds.Offset(screenPos.X, screenPos.Y); var start = new float2(bounds.Left + 1, bounds.Top); var end = new float2(bounds.Right - 1, bounds.Top); if (DisplayHealth) { DrawHealthBar(wr, health, start, end); } if (DisplayExtra) { DrawExtraBars(wr, start, end); } }
public Viewport(WorldRenderer wr, Map map) { worldRenderer = wr; // Calculate map bounds in world-px var b = map.Bounds; // Expand to corners of cells var tl = wr.ScreenPxPosition(map.CenterOfCell(Map.MapToCell(map.TileShape, new CPos(b.Left, b.Top))) - new WVec(512, 512, 0)); var br = wr.ScreenPxPosition(map.CenterOfCell(Map.MapToCell(map.TileShape, new CPos(b.Right, b.Bottom))) + new WVec(511, 511, 0)); mapBounds = Rectangle.FromLTRB(tl.X, tl.Y, br.X, br.Y); CenterLocation = (tl + br) / 2; Zoom = Game.Settings.Graphics.PixelDouble ? 2 : 1; }
public void RenderAfterWorld(WorldRenderer wr, Actor self) { if (devMode == null || !devMode.ShowMuzzles) return; if (health.Value != null) wr.DrawRangeCircle(Color.Red, wr.ScreenPxPosition(self.CenterPosition), health.Value.Info.Radius / Game.CellSize); var wlr = Game.Renderer.WorldLineRenderer; var c = Color.White; foreach (var a in armaments.Value) { foreach (var b in a.Barrels) { var muzzle = self.CenterPosition + a.MuzzleOffset(self, b); var dirOffset = new WVec(0, -224, 0).Rotate(a.MuzzleOrientation(self, b)); var sm = wr.ScreenPosition(muzzle); var sd = wr.ScreenPosition(muzzle + dirOffset); wlr.DrawLine(sm, sd, c, c); wr.DrawTargetMarker(c, sm); } } }
public void RenderDebugGeometry(WorldRenderer wr) { var size = font.Measure(text).ToFloat2(); var offset = wr.ScreenPxPosition(pos) - 0.5f * size; Game.Renderer.WorldLineRenderer.DrawRect(offset, offset + size, Color.Red); }
public Viewport(WorldRenderer wr, Map map) { worldRenderer = wr; var cells = wr.World.Type == WorldType.Editor ? map.AllCells : map.CellsInsideBounds; // Calculate map bounds in world-px var tl = wr.ScreenPxPosition(map.CenterOfCell(cells.TopLeft) - new WVec(512, 512, 0)); var br = wr.ScreenPxPosition(map.CenterOfCell(cells.BottomRight) + new WVec(511, 511, 0)); mapBounds = Rectangle.FromLTRB(tl.X, tl.Y, br.X, br.Y); CenterLocation = (tl + br) / 2; Zoom = Game.Settings.Graphics.PixelDouble ? 2 : 1; tileSize = Game.ModData.Manifest.TileSize; }
public static void DrawRangeCircle(WorldRenderer wr, WPos pos, int range, Color color) { wr.DrawRangeCircleWithContrast( Color.FromArgb(128, color), wr.ScreenPxPosition(pos), range, Color.FromArgb(96, Color.Black)); }
public void Render(WorldRenderer wr) { if (!waypoints.Any()) { return; } var first = wr.ScreenPxPosition(waypoints.First()); var a = first; foreach (var b in waypoints.Skip(1).Select(pos => wr.ScreenPxPosition(pos))) { Game.Renderer.WorldLineRenderer.DrawLine(a, b, color, color); wr.DrawTargetMarker(color, b); a = b; } wr.DrawTargetMarker(color, first); }
public IEnumerable<IRenderable> Render(Actor self, WorldRenderer wr) { var pos = wr.ScreenPxPosition(self.CenterPosition); var bounds = self.Bounds; bounds.Offset(pos.X, pos.Y); var spaceBuffer = (int)(10 / wr.Viewport.Zoom); var effectPos = wr.ProjectedPosition(new int2(pos.X, bounds.Y - spaceBuffer)); yield return new TextRenderable(font, effectPos, 0, color, name); }
public void RenderAfterWorld(WorldRenderer wr) { if (self.Owner != self.World.LocalPlayer) return; wr.DrawRangeCircleWithContrast( Color.FromArgb(128, Color.LimeGreen), wr.ScreenPxPosition(self.CenterPosition), self.Info.Traits.Get<DetectCloakedInfo>().Range, Color.FromArgb(96, Color.Black)); }
// Range circle public void RenderAfterWorld(WorldRenderer wr) { // Visible to player and allies if (!ValidRenderPlayer()) return; wr.DrawRangeCircleWithContrast( Color.FromArgb(128, Ready() ? Color.White : Color.Red), wr.ScreenPxPosition(self.CenterPosition), Info.Range, Color.FromArgb(96, Color.Black)); }
public Rectangle ScreenBounds(WorldRenderer wr, WPos pos, WVec offset, float scale) { var xy = wr.ScreenPxPosition(pos) + wr.ScreenPxOffset(offset); var cb = CurrentSequence.Bounds; return(Rectangle.FromLTRB( xy.X + (int)(cb.Left * scale), xy.Y + (int)(cb.Top * scale), xy.X + (int)(cb.Right * scale), xy.Y + (int)(cb.Bottom * scale))); }
public void Render(WorldRenderer wr) { if (!waypoints.Any()) { return; } var iz = 1 / wr.Viewport.Zoom; var first = wr.ScreenPxPosition(waypoints.First()); var a = first; foreach (var b in waypoints.Skip(1).Select(pos => wr.ScreenPxPosition(pos))) { Game.Renderer.WorldRgbaColorRenderer.DrawLine(a, b, iz, color); DrawTargetMarker(wr, color, b); a = b; } DrawTargetMarker(wr, color, first); }
public CPos ViewToWorld(int2 view) { var world = worldRenderer.Viewport.ViewToWorldPx(view); var map = worldRenderer.World.Map; var candidates = CandidateMouseoverCells(world).ToList(); foreach (var uv in candidates) { // Coarse filter to nearby cells var p = map.CenterOfCell(uv.ToCPos(map.Grid.Type)); var s = worldRenderer.ScreenPxPosition(p); if (Math.Abs(s.X - world.X) <= tileSize.Width && Math.Abs(s.Y - world.Y) <= tileSize.Height) { var ramp = map.Grid.Ramps[map.Ramp.Contains(uv) ? map.Ramp[uv] : 0]; var pos = map.CenterOfCell(uv.ToCPos(map)) - new WVec(0, 0, ramp.CenterHeightOffset); var screen = ramp.Corners.Select(c => worldRenderer.ScreenPxPosition(pos + c)).ToArray(); if (screen.PolygonContains(world)) { return(uv.ToCPos(map)); } } } // Mouse is not directly over a cell (perhaps on a cliff) // Try and find the closest cell if (candidates.Count > 0) { return(candidates.MinBy(uv => { var p = map.CenterOfCell(uv.ToCPos(map.Grid.Type)); var s = worldRenderer.ScreenPxPosition(p); var dx = Math.Abs(s.X - world.X); var dy = Math.Abs(s.Y - world.Y); return dx * dx + dy * dy; }).ToCPos(map)); } // Something is very wrong, but lets return something that isn't completely bogus and hope the caller can recover return(worldRenderer.World.Map.CellContaining(worldRenderer.ProjectedPosition(ViewToWorldPx(view)))); }
public void RenderAfterWorld(WorldRenderer wr) { if (self.Owner != self.World.LocalPlayer) return; // Hack: Convert world coords to cells var pxRange = self.Trait<AttackBase>().GetMaximumRange().Range / 1024f; wr.DrawRangeCircleWithContrast( Color.FromArgb(128, Color.Yellow), wr.ScreenPxPosition(self.CenterPosition), pxRange, Color.FromArgb(96, Color.Black)); }
public void Render(WorldRenderer wr, World w, ActorInfo ai, WPos centerPosition) { wr.DrawRangeCircleWithContrast( Color.FromArgb(128, Color.Cyan), wr.ScreenPxPosition(centerPosition), ai.Traits.Get<CreatesShroudInfo>().Range, Color.FromArgb(96, Color.Black)); foreach (var a in w.ActorsWithTrait<RenderShroudCircle>()) if (a.Actor.Owner == a.Actor.World.LocalPlayer) a.Trait.RenderAfterWorld(wr); }
public void RenderAfterWorld(WorldRenderer wr) { var force = Game.GetModifierKeys().HasModifier(Modifiers.Alt); if ((lifetime <= 0 || --lifetime <= 0) && !force) return; if (targets == null || targets.Count == 0) return; var from = wr.ScreenPxPosition(self.CenterPosition); foreach (var target in targets) { if (target.Type == TargetType.Invalid) continue; var to = wr.ScreenPxPosition(target.CenterPosition); Game.Renderer.WorldLineRenderer.DrawLine(from, to, c, c); wr.DrawTargetMarker(c, from); wr.DrawTargetMarker(c, to); } }
public void Render(WorldRenderer wr, World w, ActorInfo ai, WPos centerPosition) { wr.DrawRangeCircleWithContrast( Color.FromArgb(128, Color.Yellow), wr.ScreenPxPosition(centerPosition), ai.Traits.WithInterface<ArmamentInfo>() .Select(a => Rules.Weapons[a.Weapon.ToLowerInvariant()].Range).Max(), Color.FromArgb(96, Color.Black)); foreach (var a in w.ActorsWithTrait<RenderRangeCircle>()) if (a.Actor.Owner == a.Actor.World.LocalPlayer) if (a.Actor.Info.Traits.Get<RenderRangeCircleInfo>().RangeCircleType == RangeCircleType) a.Trait.RenderAfterWorld(wr); }
public Rectangle ScreenBounds(WPos pos, WorldRenderer wr, float scale) { var r = Model.AggregateBounds; var offset = OffsetFunc != null?OffsetFunc() : WVec.Zero; var xy = wr.ScreenPxPosition(pos) + wr.ScreenPxOffset(offset); return(Rectangle.FromLTRB( xy.X + (int)(r.Left * scale), xy.Y + (int)(r.Top * scale), xy.X + (int)(r.Right * scale), xy.Y + (int)(r.Bottom * scale))); }
public void DrawRollover(WorldRenderer wr) { if (!Info.Selectable) return; var pos = wr.ScreenPxPosition(self.CenterPosition); var bounds = self.Bounds.Value; bounds.Offset(pos.X, pos.Y); var xy = new float2(bounds.Left, bounds.Top); var Xy = new float2(bounds.Right, bounds.Top); DrawHealthBar(wr, xy, Xy); DrawExtraBars(wr, xy, Xy); }
public void Render(WorldRenderer wr) { if (this.Actor == null) { } else { if (this.Actor.Info.Name == "refinery") { var xy = wr.ScreenPxPosition(pos) + wr.ScreenPxOffset(offset) - (0.5f * scale * sprite.Size.XY).ToInt2(); //Console.WriteLine("x: " + xy.X + " y: " + xy.Y + " | offX:" + sprite.Offset.X + " offY:" + sprite.Offset.Y +" |SpriteRenderable " + this.Actor.Info.Name + " owner:" + this.Actor.Owner); } // Console.WriteLine("SpriteRenderable " + this.Actor.Info.Name + " owner:" + this.Actor.Owner); } Game.Renderer.WorldSpriteRenderer.DrawSprite(sprite, ScreenPosition(wr), palette, scale * sprite.Size); }
public void RenderAfterWorld(WorldRenderer wr) { if (self.World.FogObscures(self)) return; var pos = wr.ScreenPxPosition(self.CenterPosition); var bounds = self.Bounds.Value; bounds.Offset(pos.X, pos.Y); var xy = new int2(bounds.Left, bounds.Top); var xY = new int2(bounds.Left, bounds.Bottom); DrawControlGroup(wr, self, xy); DrawPips(wr, self, xY); DrawTags(wr, self, new int2((bounds.Left + bounds.Right) / 2, bounds.Top)); }
public void RenderAfterWorld(WorldRenderer wr) { if (!Info.Selectable) return; var pos = wr.ScreenPxPosition(self.CenterPosition); var bounds = self.Bounds.Value; bounds.Offset(pos.X, pos.Y); var xy = new float2(bounds.Left, bounds.Top); var Xy = new float2(bounds.Right, bounds.Top); wr.DrawSelectionBox(self, Color.White); DrawHealthBar(wr, xy, Xy); DrawExtraBars(wr, xy, Xy); DrawUnitPath(wr); }
IEnumerable<IRenderable> IRenderAboveShroud.RenderAboveShroud(Actor self, WorldRenderer wr) { if (self.World.FogObscures(self)) yield break; var selected = self.World.Selection.Contains(self); var regularWorld = self.World.Type == WorldType.Regular; var statusBars = Game.Settings.Game.StatusBars; // Health bars are shown when: // * actor is selected // * status bar preference is set to "always show" // * status bar preference is set to "when damaged" and actor is damaged var displayHealth = selected || (regularWorld && statusBars == StatusBarsType.AlwaysShow) || (regularWorld && statusBars == StatusBarsType.DamageShow && self.GetDamageState() != DamageState.Undamaged); // Extra bars are shown when: // * actor is selected // * status bar preference is set to "always show" // * status bar preference is set to "when damaged" var displayExtra = selected || (regularWorld && statusBars != StatusBarsType.Standard); if (Info.RenderSelectionBox && selected) yield return new SelectionBoxRenderable(self, Info.SelectionBoxColor); if (Info.RenderSelectionBars && (displayHealth || displayExtra)) yield return new SelectionBarsRenderable(self, displayHealth, displayExtra); // Target lines and pips are always only displayed for selected allied actors if (!selected || !self.Owner.IsAlliedWith(wr.World.RenderPlayer)) yield break; if (self.World.LocalPlayer != null && self.World.LocalPlayer.PlayerActor.Trait<DeveloperMode>().PathDebug) yield return new TargetLineRenderable(ActivityTargetPath(self), Color.Green); var b = self.VisualBounds; var pos = wr.ScreenPxPosition(self.CenterPosition); var bl = wr.Viewport.WorldToViewPx(pos + new int2(b.Left, b.Bottom)); var pal = wr.Palette(Info.Palette); foreach (var r in DrawPips(self, wr, bl, pal)) yield return r; }
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr) { if (!self.Owner.IsAlliedWith(self.World.RenderPlayer) || self.World.FogObscures(self)) yield break; var b = self.Bounds; var pos = wr.ScreenPxPosition(self.CenterPosition); var tl = wr.Viewport.WorldToViewPx(pos + new int2(b.Left, b.Top)); var bl = wr.Viewport.WorldToViewPx(pos + new int2(b.Left, b.Bottom)); var tm = wr.Viewport.WorldToViewPx(pos + new int2((b.Left + b.Right) / 2, b.Top)); foreach (var r in DrawControlGroup(wr, self, tl)) yield return r; foreach (var r in DrawPips(wr, self, bl)) yield return r; foreach (var r in DrawTags(wr, self, tm)) yield return r; }
public void Render(WorldRenderer wr) { if (!actor.IsInWorld || actor.IsDead()) { return; } var health = actor.TraitOrDefault <Health>(); var screenPos = wr.ScreenPxPosition(pos); var bounds = actor.Bounds.Value; bounds.Offset(screenPos.X, screenPos.Y); var xy = new float2(bounds.Left, bounds.Top); var Xy = new float2(bounds.Right, bounds.Top); DrawHealthBar(wr, health, xy, Xy); DrawExtraBars(wr, xy, Xy); }
public void Render(WorldRenderer wr) { var screenPos = wr.ScreenPxPosition(pos); var tl = screenPos + scale * new float2(visualBounds.Left, visualBounds.Top); var br = screenPos + scale * new float2(visualBounds.Right, visualBounds.Bottom); var tr = new float2(br.X, tl.Y); var bl = new float2(tl.X, br.Y); var u = new float2(4f / wr.Viewport.Zoom, 0); var v = new float2(0, 4f / wr.Viewport.Zoom); var wlr = Game.Renderer.WorldLineRenderer; wlr.DrawLine(tl + u, tl, color); wlr.DrawLine(tl, tl + v, color); wlr.DrawLine(tr, tr - u, color); wlr.DrawLine(tr, tr + v, color); wlr.DrawLine(bl, bl + u, color); wlr.DrawLine(bl, bl - v, color); wlr.DrawLine(br, br - u, color); wlr.DrawLine(br, br - v, color); }
public void Render(WorldRenderer wr) { var screenPos = wr.ScreenPxPosition(pos); var tl = screenPos + scale * new float2(bounds.Left, bounds.Top); var br = screenPos + scale * new float2(bounds.Right, bounds.Bottom); var tr = new float2(br.X, tl.Y); var bl = new float2(tl.X, br.Y); var u = new float2(4f / wr.Viewport.Zoom, 0); var v = new float2(0, 4f / wr.Viewport.Zoom); var wlr = Game.Renderer.WorldLineRenderer; wlr.DrawLine(tl + u, tl, color, color); wlr.DrawLine(tl, tl + v, color, color); wlr.DrawLine(tr, tr - u, color, color); wlr.DrawLine(tr, tr + v, color, color); wlr.DrawLine(bl, bl + u, color, color); wlr.DrawLine(bl, bl - v, color, color); wlr.DrawLine(br, br - u, color, color); wlr.DrawLine(br, br - v, color, color); }
public IEnumerable<IRenderable> Render(WorldRenderer wr) { if (!self.IsInWorld) yield break; if (self.IsDead()) yield break; if (!self.Owner.IsAlliedWith(self.World.RenderPlayer)) yield break; if (wr.world.FogObscures(self)) yield break; var pos = wr.ScreenPxPosition(self.CenterPosition); var bounds = self.Bounds.Value; bounds.Offset(pos.X, pos.Y); var offset = (int)(4 / wr.Viewport.Zoom); var effectPos = wr.Position(new int2(bounds.Right - offset, bounds.Bottom - offset)); yield return new SpriteRenderable(anim.Image, effectPos, WVec.Zero, 0, wr.Palette("effect"), 1f / wr.Viewport.Zoom, true); }
float3 ScreenPosition(WorldRenderer wr) { var xy = wr.ScreenPxPosition(pos) + wr.ScreenPxOffset(offset) - (0.5f * scale * sprite.Size.XY).ToInt2(); return(new float3(xy, wr.ScreenZPosition(pos, 0) - 0.5f * scale * sprite.Size.Z)); }
public void Render(WorldRenderer wr) { if (!waypoints.Any()) return; var iz = 1 / wr.Viewport.Zoom; var first = wr.ScreenPxPosition(waypoints.First()); var a = first; foreach (var b in waypoints.Skip(1).Select(pos => wr.ScreenPxPosition(pos))) { Game.Renderer.WorldRgbaColorRenderer.DrawLine(a, b, iz, color); DrawTargetMarker(wr, color, b); a = b; } DrawTargetMarker(wr, color, first); }
public void RenderAfterWorld(WorldRenderer wr, World world) { var position = Game.viewport.ViewToWorld(Viewport.LastMousePos); var topLeft = position - FootprintUtils.AdjustForBuildingSize(BuildingInfo); var actorInfo = Rules.Info[Building]; foreach (var dec in actorInfo.Traits.WithInterface<IPlaceBuildingDecoration>()) dec.Render(wr, world, actorInfo, position.CenterPosition); /* hack hack */ var cells = new Dictionary<CPos, bool>(); // Linebuild for walls. // Assumes a 1x1 footprint; weird things will happen for other footprints if (Rules.Info[Building].Traits.Contains<LineBuildInfo>()) { foreach (var t in BuildingUtils.GetLineBuildCells(world, topLeft, Building, BuildingInfo)) cells.Add(t, BuildingInfo.IsCloseEnoughToBase(world, world.LocalPlayer, Building, t)); } else { if (!initialized) { var rbi = Rules.Info[Building].Traits.Get<RenderBuildingInfo>(); var palette = rbi.Palette ?? (Producer.Owner != null ? rbi.PlayerPalette + Producer.Owner.InternalName : null); preview = rbi.RenderPreview(Rules.Info[Building], wr.Palette(palette)); initialized = true; } var offset = topLeft.CenterPosition + FootprintUtils.CenterOffset(BuildingInfo) - WPos.Zero; foreach (var r in preview) r.OffsetBy(offset).Render(wr); var res = world.WorldActor.Trait<ResourceLayer>(); var isCloseEnough = BuildingInfo.IsCloseEnoughToBase(world, world.LocalPlayer, Building, topLeft); foreach (var t in FootprintUtils.Tiles(Building, BuildingInfo, topLeft)) cells.Add(t, isCloseEnough && world.IsCellBuildable(t, BuildingInfo) && res.GetResource(t) == null); } var pal = wr.Palette("terrain"); foreach (var c in cells) { var tile = c.Value ? buildOk : buildBlocked; tile.DrawAt(wr.ScreenPxPosition(c.Key.CenterPosition) - 0.5f * tile.size, pal); } }
public void RenderAfterWorld(WorldRenderer wr, World world) { if (!self.IsInWorld) return; if (self.Owner != self.World.LocalPlayer) return; wr.DrawRangeCircle( Color.FromArgb(128, Color.DeepSkyBlue), wr.ScreenPxPosition(self.CenterPosition), (int)self.Trait<ChronoshiftDeploy>().Info.JumpDistance); }
public void Render(WorldRenderer wr) { var iz = 1 / wr.Viewport.Zoom; var screenPos = wr.ScreenPxPosition(pos); var tl = screenPos + new float2(visualBounds.Left, visualBounds.Top); var br = screenPos + new float2(visualBounds.Right, visualBounds.Bottom); var tr = new float2(br.X, tl.Y); var bl = new float2(tl.X, br.Y); var u = new float2(4 * iz, 0); var v = new float2(0, 4 * iz); var wcr = Game.Renderer.WorldRgbaColorRenderer; wcr.DrawLine(new[] { tl + u, tl, tl + v }, iz, color, true); wcr.DrawLine(new[] { tr - u, tr, tr + v }, iz, color, true); wcr.DrawLine(new[] { br - u, br, br - v }, iz, color, true); wcr.DrawLine(new[] { bl + u, bl, bl - v }, iz, color, true); }
public void Render(WorldRenderer wr) { if (!waypoints.Any()) return; var first = wr.ScreenPxPosition(waypoints.First()); var a = first; foreach (var b in waypoints.Skip(1).Select(pos => wr.ScreenPxPosition(pos))) { Game.Renderer.WorldLineRenderer.DrawLine(a, b, color, color); wr.DrawTargetMarker(color, b); a = b; } wr.DrawTargetMarker(color, first); }
public void Center(WPos pos) { CenterLocation = worldRenderer.ScreenPxPosition(pos).Clamp(mapBounds); cellBoundsDirty = true; }
public void RenderDebugGeometry(WorldRenderer wr) { var size = font.Measure(text).ToFloat2(); var offset = wr.ScreenPxPosition(pos) - 0.5f*size; Game.Renderer.WorldLineRenderer.DrawRect(offset, offset + size, Color.Red); }
float2 ScreenPosition(WorldRenderer wr) { return(wr.ScreenPxPosition(pos) + wr.ScreenPxOffset(offset) - (0.5f * scale * sprite.size).ToInt2()); }
float2 ScreenPosition(WorldRenderer wr) { return wr.ScreenPxPosition(pos) + wr.ScreenPxOffset(offset) - (0.5f * scale * sprite.Size).ToInt2(); }
public void Render(WorldRenderer wr) { if (!actor.IsInWorld || actor.IsDead) return; var health = actor.TraitOrDefault<Health>(); var screenPos = wr.ScreenPxPosition(pos); var bounds = actor.Bounds; bounds.Offset(screenPos.X, screenPos.Y); var start = new float2(bounds.Left + 1, bounds.Top); var end = new float2(bounds.Right - 1, bounds.Top); DrawHealthBar(wr, health, start, end); DrawExtraBars(wr, start, end); }
void DrawUnitPath(WorldRenderer wr, Actor self) { if (self.World.LocalPlayer == null ||!self.World.LocalPlayer.PlayerActor.Trait<DeveloperMode>().PathDebug) return; var activity = self.GetCurrentActivity(); if (activity != null) { var targets = activity.GetTargets(self); var start = wr.ScreenPxPosition(self.CenterPosition); var c = Color.Green; var wlr = Game.Renderer.WorldLineRenderer; foreach (var stp in targets.Where(t => t.Type != TargetType.Invalid).Select(p => wr.ScreenPxPosition(p.CenterPosition))) { wlr.DrawLine(stp + new float2(-1, -1), stp + new float2(-1, 1), c, c); wlr.DrawLine(stp + new float2(-1, 1), stp + new float2(1, 1), c, c); wlr.DrawLine(stp + new float2(1, 1), stp + new float2(1, -1), c, c); wlr.DrawLine(stp + new float2(1, -1), stp + new float2(-1, -1), c, c); wlr.DrawLine(start, stp, c, c); start = stp; } } }