public override void Draw() { if (!IsVisible()) { return; } UpdateValue(GetValue()); var tr = ThumbRect; var rb = RenderBounds; var trackWidth = rb.Width - rb.Height; var trackOrigin = rb.X + rb.Height / 2; var trackRect = new Rectangle(trackOrigin - 1, rb.Y + (rb.Height - TrackHeight) / 2, trackWidth + 2, TrackHeight); // Tickmarks var tick = ChromeProvider.GetImage("slider", "tick"); for (var i = 0; i < Ticks; i++) { var tickPos = new float2( trackOrigin + (i * (trackRect.Width - (int)tick.Size.X) / (Ticks - 1)) - tick.Size.X / 2, trackRect.Bottom); WidgetUtils.DrawSprite(tick, tickPos); } // Track WidgetUtils.DrawPanel(Track, trackRect); // Thumb var thumbHover = Ui.MouseOverWidget == this && tr.Contains(Viewport.LastMousePos); ButtonWidget.DrawBackground(Thumb, tr, IsDisabled(), isMoving, thumbHover, false); }
public override void Draw() { if (world == null) { return; } radarSheet.CommitBufferedData(); var o = new float2(mapRect.Location.X, mapRect.Location.Y + world.Map.Bounds.Height * previewScale * (1 - radarMinimapHeight) / 2); var s = new float2(mapRect.Size.Width, mapRect.Size.Height * radarMinimapHeight); WidgetUtils.DrawSprite(terrainSprite, o, s); WidgetUtils.DrawSprite(actorSprite, o, s); if (shroud != null) { WidgetUtils.DrawSprite(shroudSprite, o, s); } // Draw viewport rect if (hasRadar) { var tl = CellToMinimapPixel(world.Map.CellContaining(worldRenderer.ProjectedPosition(worldRenderer.Viewport.TopLeft))); var br = CellToMinimapPixel(world.Map.CellContaining(worldRenderer.ProjectedPosition(worldRenderer.Viewport.BottomRight))); Game.Renderer.EnableScissor(mapRect); DrawRadarPings(); Game.Renderer.RgbaColorRenderer.DrawRect(tl, br, 1, Color.White); Game.Renderer.DisableScissor(); } }
public override void Draw() { if (!initialised) { Init(); } if (!IsVisible()) { return; } var rb = RenderBounds; var offset = int2.Zero; var svc = world.Players.Select(p => p.PlayerActor.TraitOrDefault <StrategicVictoryConditions>()).FirstOrDefault(); var totalWidth = svc.Total * 32; var curX = -totalWidth / 2; foreach (var a in svc.AllPoints) { WidgetUtils.DrawSprite(ChromeProvider.GetImage("strategic", "critical_unowned"), offset + new float2(rb.Left + curX, rb.Top)); if (world.LocalPlayer != null && a.Owner.RelationshipWith(world.LocalPlayer) == PlayerRelationship.Ally) { WidgetUtils.DrawSprite(ChromeProvider.GetImage("strategic", "player_owned"), offset + new float2(rb.Left + curX, rb.Top)); } else if (!a.Owner.NonCombatant) { WidgetUtils.DrawSprite(ChromeProvider.GetImage("strategic", "enemy_owned"), offset + new float2(rb.Left + curX, rb.Top)); } curX += 32; } offset += new int2(0, 32); if (world.LocalPlayer == null) { return; } var pendingWinner = FindFirstWinningPlayer(world); if (pendingWinner == null) { return; } var winnerSvc = pendingWinner.PlayerActor.Trait <StrategicVictoryConditions>(); var isVictory = pendingWinner.RelationshipWith(world.LocalPlayer) == PlayerRelationship.Ally; var tc = $"Strategic {(isVictory ? "victory" : "defeat")} in {WidgetUtils.FormatTime(winnerSvc.TicksLeft, world.Timestep)}"; var font = Game.Renderer.Fonts["Bold"]; var size = font.Measure(tc); font.DrawTextWithContrast(tc, offset + new float2(rb.Left - size.X / 2 + 1, rb.Top + 1), Color.White, Color.Black, 1); offset += new int2(0, size.Y + 1); }
public override void Draw() { var sprite = GetSprite(); if (sprite != null) { WidgetUtils.DrawSprite(sprite, RenderOrigin); } }
public override void Draw() { WidgetUtils.DrawSprite(mixerSprite, RenderOrigin, RenderBounds.Size); var sprite = ChromeProvider.GetImage("lobby-bits", "colorpicker"); var pos = RenderOrigin + PxFromValue() - new int2((int)sprite.Size.X, (int)sprite.Size.Y) / 2; WidgetUtils.FillEllipseWithColor(new Rectangle(pos.X + 1, pos.Y + 1, (int)sprite.Size.X - 2, (int)sprite.Size.Y - 2), Color); WidgetUtils.DrawSprite(sprite, pos); }
public override void Draw() { if (Badge == null) { return; } var icon = playerDatabase.GetIcon(Badge); if (icon != null) { WidgetUtils.DrawSprite(icon, RenderOrigin); } }
public override void Draw() { var name = GetImageName(); var collection = GetImageCollection(); var sprite = ChromeProvider.GetImage(collection, name); if (sprite == null) { throw new ArgumentException($"Sprite {collection}/{name} was not found."); } WidgetUtils.DrawSprite(sprite, RenderOrigin); }
public override void Draw() { var disabled = IsDisabled(); var font = Game.Renderer.Fonts[Font]; var color = GetColor(); var colordisabled = GetColorDisabled(); var bgDark = GetContrastColorDark(); var bgLight = GetContrastColorLight(); var rect = RenderBounds; var text = GetText(); var textSize = font.Measure(text); var check = new Rectangle(rect.Location, new Size(Bounds.Height, Bounds.Height)); var baseName = IsHighlighted() ? "checkbox-highlighted" : "checkbox"; var state = WidgetUtils.GetStatefulImageName(baseName, disabled, Depressed && HasPressedState, Ui.MouseOverWidget == this); WidgetUtils.DrawPanel(state, check); var topOffset = font.TopOffset; var position = new float2(rect.Left + rect.Height * 1.5f, RenderOrigin.Y + (Bounds.Height - textSize.Y - topOffset) / 2); if (Contrast) { font.DrawTextWithContrast(text, position, disabled ? colordisabled : color, bgDark, bgLight, 2); } else { font.DrawText(text, position, disabled ? colordisabled : color); } if (IsChecked() || (Depressed && HasPressedState && !disabled)) { var checkType = GetCheckType(); if (HasPressedState && (Depressed || disabled)) { checkType += "-disabled"; } var offset = new float2(rect.Left + CheckOffset, rect.Top + CheckOffset); WidgetUtils.DrawSprite(ChromeProvider.GetImage("checkbox-bits", checkType), offset); } }
public override void Draw() { var scaleBy = 100.0f; var provided = GetProvided(); var used = GetUsed(); var max = Math.Max(provided, used); while (max >= scaleBy) { scaleBy *= 2; } var providedFrac = providedLerp.Update(provided / scaleBy); var usedFrac = usedLerp.Update(used / scaleBy); var b = RenderBounds; var color = GetBarColor(); if (Orientation == ResourceBarOrientation.Vertical) { var tl = new float2(b.X, (int)float2.Lerp(b.Bottom, b.Top, providedFrac)); var br = tl + new float2(b.Width, (int)(providedFrac * b.Height)); Game.Renderer.RgbaColorRenderer.FillRect(tl, br, color); var x = (b.Left + b.Right - indicator.Size.X) / 2; var y = float2.Lerp(b.Bottom, b.Top, usedFrac) - indicator.Size.Y / 2; WidgetUtils.DrawSprite(indicator, new float2(x, y)); } else { var tl = new float2(b.X, b.Y); var br = tl + new float2((int)(providedFrac * b.Width), b.Height); Game.Renderer.RgbaColorRenderer.FillRect(tl, br, color); var x = float2.Lerp(b.Left, b.Right, usedFrac) - indicator.Size.X / 2; var y = (b.Bottom + b.Top - indicator.Size.Y) / 2; WidgetUtils.DrawSprite(indicator, new float2(x, y)); } }
public override void Draw() { if (video == null) { return; } if (!stopped && !paused) { var nextFrame = 0; if (video.HasAudio && !Game.Sound.DummyEngine) { nextFrame = (int)float2.Lerp(0, video.Frames, Game.Sound.VideoSeekPosition * invLength); } else { nextFrame = video.CurrentFrame + 1; } // Without the 2nd check the sound playback sometimes ends before the final frame is displayed which causes the player to be stuck on the first frame if (nextFrame > video.Frames || nextFrame < video.CurrentFrame) { Stop(); return; } var skippedFrames = 0; while (nextFrame > video.CurrentFrame) { video.AdvanceFrame(); videoSprite.Sheet.GetTexture().SetData(video.FrameData); skippedFrames++; } if (skippedFrames > 1) { Log.Write("perf", "VqaPlayer : {0} skipped {1} frames at position {2}", cachedVideo, skippedFrames, video.CurrentFrame); } } WidgetUtils.DrawSprite(videoSprite, videoOrigin, videoSize); if (DrawOverlay) { // Create the scan line grid to render over the video // To avoid aliasing, this must be an integer number of screen pixels. // A few complications to be aware of: // - The video may have a different aspect ratio to the widget RenderBounds // - The RenderBounds coordinates may be a non-integer scale of the screen pixel size // - The screen pixel size may change while the video is playing back // (user moves a window between displays with different DPI on macOS) var scale = Game.Renderer.WindowScale; if (overlaySheet == null || overlayScale != scale) { overlaySheet?.Dispose(); // Calculate the scan line height by converting the video scale (copied from Open()) to screen // pixels, halving it (scan lines cover half the pixel height), and rounding to the nearest integer. var videoScale = Math.Min((float)RenderBounds.Width / video.Width, RenderBounds.Height / (video.Height * AspectRatio)); var halfRowHeight = (int)(videoScale * scale / 2 + 0.5f); // The overlay can be minimally stored in a 1px column which is stretched to cover the full screen var overlayHeight = (int)(RenderBounds.Height * scale / halfRowHeight); var overlaySheetSize = new Size(1, Exts.NextPowerOf2(overlayHeight)); var overlay = new byte[4 * Exts.NextPowerOf2(overlayHeight)]; overlaySheet = new Sheet(SheetType.BGRA, overlaySheetSize); // Every second pixel is the scan line - set alpha to 128 to make the lines less harsh for (var i = 3; i < 4 * overlayHeight; i += 8) { overlay[i] = 128; } overlaySheet.GetTexture().SetData(overlay, overlaySheetSize.Width, overlaySheetSize.Height); overlaySprite = new Sprite(overlaySheet, new Rectangle(0, 0, 1, overlayHeight), TextureChannel.RGBA); // Overlay origin must be rounded to the nearest screen pixel to prevent aliasing overlayOrigin = new float2((int)(RenderBounds.X * scale + 0.5f), (int)(RenderBounds.Y * scale + 0.5f)) / scale; overlaySize = new float2(RenderBounds.Width, overlayHeight * halfRowHeight / scale); overlayScale = scale; } WidgetUtils.DrawSprite(overlaySprite, overlayOrigin, overlaySize); } }
public override void Draw() { var preview = Preview(); if (preview == null) { return; } // Stash a copy of the minimap to ensure consistency // (it may be modified by another thread) minimap = preview.GetMinimap(); if (minimap == null) { return; } // Update map rect previewScale = Math.Min(RenderBounds.Width / minimap.Size.X, RenderBounds.Height / minimap.Size.Y); var w = (int)(previewScale * minimap.Size.X); var h = (int)(previewScale * minimap.Size.Y); var x = RenderBounds.X + (RenderBounds.Width - w) / 2; var y = RenderBounds.Y + (RenderBounds.Height - h) / 2; mapRect = new Rectangle(x, y, w, h); WidgetUtils.DrawSprite(minimap, mapRect.Location, mapRect.Size); TooltipSpawnIndex = -1; if (ShowSpawnPoints) { var spawnPoints = preview.SpawnPoints; var occupants = SpawnOccupants(); var disabledSpawnPoints = DisabledSpawnPoints(); var gridType = preview.GridType; for (var i = 0; i < spawnPoints.Length; i++) { var p = spawnPoints[i]; // Spawn numbers are 1 indexed with 0 meaning "random spawn". var occupied = occupants.TryGetValue(i + 1, out var occupant); var disabled = disabledSpawnPoints.Contains(i + 1); var pos = ConvertToPreview(p, gridType); var sprite = disabled ? spawnDisabled : occupied ? spawnClaimed : spawnUnclaimed; var offset = sprite.Size.XY.ToInt2() / 2; if (((pos - Viewport.LastMousePos).ToFloat2() / offset.ToFloat2()).LengthSquared <= 1) { TooltipSpawnIndex = spawnPoints.IndexOf(p) + 1; } if (disabled) { WidgetUtils.DrawSprite(spawnDisabled, pos - offset); continue; } if (occupied) { WidgetUtils.FillEllipseWithColor(new Rectangle(pos.X - offset.X + 1, pos.Y - offset.Y + 1, (int)sprite.Size.X - 2, (int)sprite.Size.Y - 2), occupant.Color); } WidgetUtils.DrawSprite(sprite, pos - offset); var number = Convert.ToChar('A' + spawnPoints.IndexOf(p)).ToString(); var textOffset = spawnFont.Measure(number) / 2 + spawnLabelOffset; spawnFont.DrawTextWithContrast(number, pos - textOffset, spawnColor, spawnContrastColor, 1); } } }