//private void DrawNavNode(DrawingContext dc, CanvasData canvas, GridNode node) //{ // SolidColorBrush nodeBrush; // if (node.Flags.HasFlag(NavCellFlags.RoundedCorner0) || node.Flags.HasFlag(NavCellFlags.RoundedCorner1) || node.Flags.HasFlag(NavCellFlags.RoundedCorner2) || node.Flags.HasFlag(NavCellFlags.RoundedCorner3)) // { // nodeBrush = Brushes.SaddleBrown; // } // else if (node.Flags.HasFlag(NavCellFlags.AllowWalk)) // { // nodeBrush = Brushes.Green; // } // else if (node.Flags.HasFlag(NavCellFlags.AllowProjectile)) // { // nodeBrush = Brushes.DarkGray; // } // else // { // nodeBrush = Brushes.Black; // } // dc.DrawEllipse(nodeBrush, RadarResources.GridPen, node.NavigableCenter.ToCanvasPoint(), GridSize, GridSize); //} //private void DrawNodesInRadius(DrawingContext dc, CanvasData canvas) //{ // try // { // var nearestNode = MainGrid.Instance.GetNearestNodeToPosition(AdvDia.MyPosition); // if (nearestNode == null) return; // var nodes = MainGrid.Instance.GetNeighbors(nearestNode, 5); // foreach (var node in nodes) // { // DrawNavNode(dc, canvas, node); // } // } // catch (Exception ex) // { // Logger.Debug("Exception in RadarUI.DrawNodesInRadius(). {0} {1} {2}", ex.Message, ex.InnerException, ex); // } //} /// <summary> /// Draw a Scene /// </summary> private void DrawScenes(DrawingContext dc, CanvasData canvas) { try { if (Math.Abs(CenterActor.Point.X) < 0.01f && Math.Abs(CenterActor.Point.Y) < 0.01f) return; var worldId = AdvDia.CurrentWorldDynamicId; foreach (var adventurerScene in ScenesStorage.CurrentWorldScenes.Where(s => s.DynamicWorldId == worldId).ToList()) { //var scene = adventurerScene.TrinityScene; // 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(adventurerScene.HashName)) continue; var drawing = new DrawingGroup(); using (var groupdc = drawing.Open()) { #region Terrain if (adventurerScene.Cells != null) { var figures = new List<PathFigure>(); foreach (var navCell in adventurerScene.Cells.Where(nc => nc.IsWalkable)) { var topLeft = new Vector3(navCell.MinX, navCell.MinY, 0); var topRight = new Vector3(navCell.MaxX, navCell.MinY, 0); var bottomLeft = new Vector3(navCell.MinX, navCell.MaxY, 0); var bottomRight = new Vector3(navCell.MaxX, navCell.MaxY, 0); var segments = new[] { new LineSegment(topLeft.ToCanvasPoint(), true), new LineSegment(topRight.ToCanvasPoint(), true), new LineSegment(bottomRight.ToCanvasPoint(), true) }; figures.Add(new PathFigure(bottomLeft.ToCanvasPoint(), segments, true)); } var geo = new PathGeometry(figures, FillRule.Nonzero, null); geo.GetOutlinedPathGeometry(); groupdc.DrawGeometry(RadarResources.WalkableTerrain, null, geo); } #endregion #region Scene Borders var sceneTopLeft = new Vector3(adventurerScene.Min.X, adventurerScene.Min.Y, 0); var sceneTopRight = new Vector3(adventurerScene.Max.X, adventurerScene.Min.Y, 0); var sceneBottomLeft = new Vector3(adventurerScene.Min.X, adventurerScene.Max.Y, 0); var sceneBottomRight = new Vector3(adventurerScene.Max.X, adventurerScene.Max.Y, 0); groupdc.DrawGeometry(null, RadarResources.WalkableTerrainBorder, new LineGeometry(sceneTopLeft.ToCanvasPoint(), sceneTopRight.ToCanvasPoint())); groupdc.DrawGeometry(null, RadarResources.WalkableTerrainBorder, new LineGeometry(sceneBottomLeft.ToCanvasPoint(), sceneBottomRight.ToCanvasPoint())); groupdc.DrawGeometry(null, RadarResources.WalkableTerrainBorder, new LineGeometry(sceneTopLeft.ToCanvasPoint(), sceneBottomLeft.ToCanvasPoint())); groupdc.DrawGeometry(null, RadarResources.WalkableTerrainBorder, new LineGeometry(sceneTopRight.ToCanvasPoint(), sceneBottomRight.ToCanvasPoint())); #endregion #region Scene Title var textPoint = adventurerScene.Center.ToVector3().ToCanvasPoint(); var glyphRun = DrawingUtilities.CreateGlyphRun(adventurerScene.Name, 10, textPoint); groupdc.DrawGlyphRun(Brushes.Wheat, glyphRun); textPoint = adventurerScene.Center.ToVector3().ToCanvasPoint(); textPoint.Y = textPoint.Y + 20; glyphRun = DrawingUtilities.CreateGlyphRun((adventurerScene.Max - adventurerScene.Min) + " " + (adventurerScene.HasChild ? "HasSubScene" : string.Empty) + " " + (adventurerScene.SubScene != null ? " (Loaded)" : string.Empty), 8, textPoint); groupdc.DrawGlyphRun(Brushes.Wheat, glyphRun); #endregion #region Nodes var sceneNodePen = new Pen { Brush = Brushes.Black, Thickness = 0.1f }; foreach (var node in adventurerScene.Nodes) { if (node.HasEnoughNavigableCells) { groupdc.DrawGeometry(null, sceneNodePen, new LineGeometry(node.TopLeft.ToVector3().ToCanvasPoint(), node.TopRight.ToVector3().ToCanvasPoint())); groupdc.DrawGeometry(null, sceneNodePen, new LineGeometry(node.TopLeft.ToVector3().ToCanvasPoint(), node.BottomLeft.ToVector3().ToCanvasPoint())); groupdc.DrawGeometry(null, sceneNodePen, new LineGeometry(node.BottomLeft.ToVector3().ToCanvasPoint(), node.BottomRight.ToVector3().ToCanvasPoint())); groupdc.DrawGeometry(null, sceneNodePen, new LineGeometry(node.TopRight.ToVector3().ToCanvasPoint(), node.BottomRight.ToVector3().ToCanvasPoint())); //var textPoint1 = node.Center.ToVector3().ToCanvasPoint(); //// var glyphRun1 = DrawingUtilities.CreateGlyphRun(string.Format("{2} {0} ({1:P0})", node.NavigableCellCount, node.FillPercentage, node.LevelAreaId), 8, textPoint1); //var glyphRun1 = DrawingUtilities.CreateGlyphRun(node.LevelAreaId.ToString(), 8, textPoint1); //groupdc.DrawGlyphRun(Brushes.Wheat, glyphRun1); } //foreach (var navPoint in node.Nodes.Where(n=>n.NodeFlags.HasFlag(NodeFlags.NearWall))) //{ // DrawNavNode(groupdc, canvas, navPoint); // //groupdc.DrawEllipse(Brushes.LightSlateGray, sceneNodePen, navPoint.Center.ToVector3().ToCanvasPoint(), (float)GridSize / 2, (float)GridSize / 2); //} } #endregion } // Have to use SceneHash as key because scenes can appear multiple times with the same name Drawings.Relative.TryAdd(adventurerScene.HashName, new RelativeDrawing { Drawing = drawing, Origin = CenterActor.Morph, Center = adventurerScene.Center.ToVector3(), WorldId = adventurerScene.DynamicWorldId, //Image = new DrawingImage(drawing), //ImageRect = drawing.Bounds }); } foreach (var pair in Drawings.Relative) { //if (pair.Value.WorldId != AdvDia.CurrentWorldDynamicId) // continue; if (!pair.Value.Drawing.Bounds.IntersectsWith(CanvasData.ClipRegion.Rect)) continue; dc.DrawDrawing(pair.Value.Drawing); //if (!pair.Value.ImageRect.IntersectsWith(CanvasData.ClipRegion.Rect)) // continue; //dc.DrawImage(pair.Value.Image, pair.Value.ImageRect); } } catch (Exception ex) { Logger.Debug("Exception in RadarUI.DrawScenes(). {0} {1} {2}", ex.Message, ex.InnerException, ex); } }
/// <summary> /// </summary> /// <exception cref="ArgumentNullException"> /// <para><paramref name="span"/> is <see langword="null"/>.</para> /// </exception> /// <exception cref="ArgumentOutOfRangeException"> /// <para><paramref name="span"/> is less than zero or greater than the buffer length for the associated <see cref="ISourceEditorView"/>.</para> /// </exception> public Geometry GetMarkerGeometry(Span span) { if (span == null) { throw new ArgumentNullException("span"); } if ((span.Start < 0) || (span.End > _editorView.TextBuffer.Length)) { throw new ArgumentOutOfRangeException("span"); } if (span.IsEmpty) { return null; } PathGeometry geometry = new PathGeometry(); geometry.FillRule = FillRule.Nonzero; IList<ITextLine> textLines = _editorView.TextLines; if (textLines.Count == 0) { return null; } if ((span.Start > base.LastRenderedCharacter) || (span.End < base.FirstRenderedCharacter)) { return null; } ITextLine item = null; ITextLine textLineClosestTo = null; if (span.Start < base.FirstRenderedCharacter) { item = textLines[0]; } if (span.End > base.LastRenderedCharacter) { textLineClosestTo = textLines[textLines.Count - 1]; } if (item == null) { item = base.GetTextLineClosestTo(span.Start); } if (textLineClosestTo == null) { textLineClosestTo = base.GetTextLineClosestTo(span.End); } if (item == textLineClosestTo) { foreach (TextBounds bounds in item.GetTextBounds(span)) { RectangleGeometry geometry2 = new RectangleGeometry(new Rect(bounds.Left - 0.2, bounds.Top - 1, bounds.Width + 0.4, bounds.Height + 1), 0.6, 0.6); geometry2.Freeze(); geometry.AddGeometry(geometry2); } } else { foreach (TextBounds bounds2 in item.GetTextBounds(span)) { RectangleGeometry geometry3 = new RectangleGeometry(new Rect(bounds2.Left - 0.2, bounds2.Top - 1, bounds2.Width + 0.4, bounds2.Height + 1), 0.6, 0.6); geometry3.Freeze(); geometry.AddGeometry(geometry3); } Int32 num = textLines.IndexOf(item) + 1; Int32 index = textLines.IndexOf(textLineClosestTo); for (Int32 i = num; i < index; i++) { ITextLine line3 = textLines[i]; RectangleGeometry geometry4 = new RectangleGeometry(new Rect(-0.2, line3.VerticalOffset - 0.2, line3.Width, line3.Height + 0.4), 0.6, 0.6); geometry4.Freeze(); geometry.AddGeometry(geometry4); } foreach (TextBounds bounds3 in textLineClosestTo.GetTextBounds(span)) { RectangleGeometry geometry5 = new RectangleGeometry(new Rect(bounds3.Left - 0.2, bounds3.Top - 1, bounds3.Width + 0.4, bounds3.Height + 1), 0.6, 0.6); geometry5.Freeze(); geometry.AddGeometry(geometry5); } } geometry.Freeze(); return geometry.GetOutlinedPathGeometry(); }
/// <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); } }