/// <summary> /// TrinityNode wraps a TrinityObject to add a canvas plot location. /// </summary> public RadarObject(TrinityObject obj, CanvasData canvasData) { Actor = obj; obj.PropertyChanged += ItemOnPropertyChanged; Morph.CanvasData = canvasData; Update(); }
public static void RelativeMove(DrawingGroup group, Vector3 origin, CanvasData canvasData = null) { var originPoint = new PointMorph(origin, CanvasData.LastCanvas); var transform = new TranslateTransform(originPoint.Point.X - CanvasData.LastCanvas.Center.X, originPoint.Point.Y - CanvasData.LastCanvas.Center.Y); group.Transform = transform; }
public static Point ToCanvasPoint(this Vector3 positionVector, CanvasData canvasData = null) { return new PointMorph(positionVector, canvasData ?? CanvasData.LastCanvas).Point; }
/// <summary> /// PointMorph handles the translation of a Vector3 world space position into Canvas space. /// </summary> public PointMorph(Vector3 vectorPosition, CanvasData canvasData) { CanvasData = canvasData; Update(vectorPosition); }
public PointMorph(CanvasData canvasData) { CanvasData = canvasData; }
private void DrawGrid(DrawingContext dc, CanvasData canvas, int gridLineFrequency) { StaticDrawing sd; if (!Drawings.Static.TryGetValue("Grid", out sd)) { var drawing = new DrawingGroup(); using (var groupdc = drawing.Open()) { // vertical lines int pos = 0; do { groupdc.DrawLine(RadarBrushes.GridPen, new Point(pos, 0), new Point(pos, (int) canvas.CanvasSize.Height)); pos += (int) canvas.GridSquareSize.Height*gridLineFrequency; } while (pos < canvas.CanvasSize.Width); // horizontal lines pos = 0; do { groupdc.DrawLine(RadarBrushes.GridPen, new Point(0, pos), new Point((int) canvas.CanvasSize.Width, pos)); pos += (int) canvas.GridSquareSize.Width*gridLineFrequency; } while (pos < canvas.CanvasSize.Height); } drawing.Freeze(); Drawings.Static.TryAdd("Grid", new StaticDrawing { Drawing = drawing, WorldId = CacheManager.WorldDynamicId }); } else { dc.DrawDrawing(sd.Drawing); } }
private void DrawActor(DrawingContext dc, CanvasData canvas, RadarObject actor) { try { var baseColor = GetActorColor(actor); var actorName = actor.Actor.Name; //var trinityType = actor.Actor.TrinityType; var actorRadius = actor.Actor.Radius; var unit = actor.Actor as TrinityUnit; if (unit != null) { if (unit.Source.IsDisposed) return; // Draw a line to indicate which way the unit is facing var lighterBaseColor = ControlPaint.Light(baseColor.ToDrawingColor(), 50); var drawingPen = new Pen(new SolidColorBrush(lighterBaseColor.ToMediaColor()), 1); dc.DrawLine(drawingPen, actor.Point, actor.HeadingPointAtRadius); } if ((actor.Actor.IsGizmo || actor.Actor.IsUnit) && baseColor != Colors.Transparent ) { // Draw a circle representing the size of the actor var outerFill = new SolidColorBrush(baseColor); var gridRadius = actorRadius*GridSize; outerFill.Opacity = 0.25; dc.DrawEllipse(outerFill, null, actor.Point, gridRadius, gridRadius); var formattedText = new FormattedText(string.Format("{0}", actorName), CultureInfo.InvariantCulture, FlowDirection.LeftToRight, new Typeface("Arial"), 11, new SolidColorBrush(baseColor)) { MaxTextWidth = 80, Trimming = TextTrimming.WordEllipsis, TextAlignment = TextAlignment.Center }; var textOffsetPosition = new Point(actor.Point.X - (formattedText.WidthIncludingTrailingWhitespace / 2), actor.Point.Y - 10 - formattedText.Height); dc.DrawText(formattedText, textOffsetPosition); // Draw a dot in the center of the actor; var innerFill = new SolidColorBrush(baseColor); dc.DrawEllipse(innerFill, null, actor.Point, MarkerSize / 2, MarkerSize / 2); } } catch (Exception ex) { Logger.Log("Exception in RadarUI.DrawActor(). {0} {1}", ex.Message, ex.InnerException); } }
/// <summary> /// Range guide draws a circle every 20yard from player /// </summary> private void DrawRangeGuide(DrawingContext dc, CanvasData canvas) { for (var i = 20; i < 100; i+=20) { var radius = GridSize*i; dc.DrawEllipse(RadarBrushes.TransparentBrush, RadarBrushes.LightYellowPen, canvas.Center, radius, radius); dc.DrawText(new FormattedText(i.ToString(), CultureInfo.InvariantCulture, FlowDirection.LeftToRight, new Typeface("Arial"), 12, Brushes.LightYellow), new Point(canvas.Center.X - (radius + 20), canvas.Center.Y)); } }
/// <summary> /// Mind = Blown /// </summary> private void DrawScenes(DrawingContext dc, CanvasData canvas) { try { if (CenterActor.Point.X == 0 && CenterActor.Point.Y == 0) return; foreach (var pair in CacheManager.CachedScenes) { var scene = pair.Value; // Combine navcells into one drawing and store it; because they don't change relative to each other // And because translating geometry for every navcell on every frame is waaaaay too slow. if (!Drawings.Relative.ContainsKey(scene.SceneHash) && scene.WalkableNavCellBounds.Any() && scene.IsCurrentWorld) { var drawing = new DrawingGroup(); using (var groupdc = drawing.Open()) { var figures = new List<PathFigure>(); foreach (var navCellBounds in scene.WalkableNavCellBounds) { var cellSouthWest = new Vector3(navCellBounds.Max.X, navCellBounds.Min.Y, 0).ToCanvasPoint(); var cellSouthEast = new Vector3(navCellBounds.Max.X, navCellBounds.Max.Y, 0).ToCanvasPoint(); var cellNorthWest = new Vector3(navCellBounds.Min.X, navCellBounds.Min.Y, 0).ToCanvasPoint(); var cellNorthEast = new Vector3(navCellBounds.Min.X, navCellBounds.Max.Y, 0).ToCanvasPoint(); var segments = new[] { new LineSegment(cellNorthWest, true), new LineSegment(cellNorthEast, true), new LineSegment(cellSouthEast, true) }; figures.Add(new PathFigure(cellSouthWest, segments, true)); } var geo = new PathGeometry(figures, FillRule.Nonzero, null); geo.GetOutlinedPathGeometry(); groupdc.DrawGeometry(RadarBrushes.WalkableTerrain, null, geo); } // Have to use SceneHash as key because scenes can appear multiple times with the same name Drawings.Relative.TryAdd(scene.SceneHash, new RelativeDrawing { Drawing = drawing, Origin = CenterActor.Morph, Center = scene.Center, WorldId = scene.WorldDynamicId }); } } foreach (var pair in Drawings.Relative) { if (pair.Value.WorldId != CacheManager.WorldDynamicId) continue; if(!pair.Value.Drawing.Bounds.IntersectsWith(CanvasData.ClipRegion.Rect)) continue; dc.DrawDrawing(pair.Value.Drawing); } } catch (Exception ex) { Logger.Log("Exception in RadarUI.DrawScenes(). {0} {1}", ex.Message, ex.InnerException); } }
private void DrawPredictions(DrawingContext dc, CanvasData canvasData) { _predictions.ForEach(p => { dc.DrawEllipse(Brushes.Yellow, RadarBrushes.YellowPen, p.ToCanvasPoint(), 5, 5); }); }