コード例 #1
0
 /// <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();
 }
コード例 #2
0
 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;
 }
コード例 #3
0
 public static Point ToCanvasPoint(this Vector3 positionVector, CanvasData canvasData = null)
 {
     return new PointMorph(positionVector, canvasData ?? CanvasData.LastCanvas).Point;
 }
コード例 #4
0
 /// <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);
 }
コード例 #5
0
 public PointMorph(CanvasData canvasData)
 {
     CanvasData = canvasData;
 }
コード例 #6
0
        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);
            }
        }
コード例 #7
0
        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);
            }           
        }
コード例 #8
0
        /// <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));
            }            
        }
コード例 #9
0
        /// <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);
            }            
        }
コード例 #10
0
 private void DrawPredictions(DrawingContext dc, CanvasData canvasData)
 {
     _predictions.ForEach(p =>
     {
         dc.DrawEllipse(Brushes.Yellow, RadarBrushes.YellowPen, p.ToCanvasPoint(), 5, 5);                
     });
 }