Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 4
0
        public override void Draw()
        {
            var sprite = GetSprite();

            if (sprite != null)
            {
                WidgetUtils.DrawSprite(sprite, RenderOrigin);
            }
        }
Esempio n. 5
0
        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);
        }
Esempio n. 6
0
        public override void Draw()
        {
            if (Badge == null)
            {
                return;
            }

            var icon = playerDatabase.GetIcon(Badge);

            if (icon != null)
            {
                WidgetUtils.DrawSprite(icon, RenderOrigin);
            }
        }
Esempio n. 7
0
        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);
        }
Esempio n. 8
0
        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);
            }
        }
Esempio n. 9
0
        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));
            }
        }
Esempio n. 10
0
        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);
            }
        }
Esempio n. 11
0
        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);
                }
            }
        }