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)); }