public override void PrepareFrame(List <Rectangle> labels, Viewport viewport, Orts.Viewer3D.Camera camera)
        {
            var position2D = Project3D(Normalize(Position, camera), viewport, camera);

            Visible = (position2D.Z >= 0 && position2D.Z <= 1);
            if (Visible)
            {
                var rect2D = new Rectangle((int)position2D.X, (int)position2D.Y, (int)TextSize.X + 2 * TextOffsetX, (int)TextSize.Y);
                rect2D.Y -= rect2D.Height;

                while (labels.Any(r => r.Intersects(rect2D)))
                {
                    rect2D.Y = labels.Where(r => r.Intersects(rect2D)).Select(r => r.Top).Max() - rect2D.Height;
                }
                labels.Add(rect2D);

                LabelOffset    = position2D.Y - rect2D.Y;
                Position2D     = new Vector2(rect2D.X, rect2D.Y);
                Position2DText = new Point((int)Position2D.X + TextOffsetX, (int)Position2D.Y + TextOffsetY);
            }
        }
        public override void PrepareFrame(List <Rectangle> labels, Viewport viewport, Orts.Viewer3D.Camera camera)
        {
            var start2d = Project3D(Normalize(Start, camera), viewport, camera);
            var end2d   = Project3D(Normalize(End, camera), viewport, camera);
            var line2d  = end2d - start2d;

            line2d.Normalize();

            Visible = (start2d.Z >= 0 && start2d.Z <= 1 && end2d.Z >= 0 && end2d.Z <= 1);
            Start2D = Flatten(start2d) + new Vector2(line2d.Y * Width / 2, -line2d.X * Width / 2);
            Angle   = (float)Math.Atan2(end2d.Y - start2d.Y, end2d.X - start2d.X);
            Length  = (end2d - start2d).Length();
        }
 protected static Vector3 Project3D(Vector3 position, Viewport viewport, Orts.Viewer3D.Camera camera)
 {
     return(viewport.Project(position, camera.XnaProjection, camera.XnaView, Matrix.Identity));
 }
 public abstract void PrepareFrame(List <Rectangle> labels, Viewport viewport, Orts.Viewer3D.Camera camera);
 protected static Vector3 Normalize(WorldLocation location, Orts.Viewer3D.Camera camera)
 {
     return(new Vector3(location.Location.X + (location.TileX - camera.TileX) * 2048, location.Location.Y, -location.Location.Z - (location.TileZ - camera.TileZ) * 2048));
 }