Index: RunActivity/Viewer3D/Popups/OSDLocations.cs =================================================================== --- RunActivity/Viewer3D/Popups/OSDLocations.cs (revision 3869) +++ RunActivity/Viewer3D/Popups/OSDLocations.cs (working copy) @@ -14,11 +14,11 @@ // // You should have received a copy of the GNU General Public License // along with Open Rails. If not, see . +// This file is the responsibility of the 3D & Environment Team. -// This file is the responsibility of the 3D & Environment Team. - using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; +using Orts.Simulation; using ORTS.Common; using System; using System.Collections.Generic; @@ -38,16 +38,114 @@ Platforms = 0x1, Sidings = 0x2, All = 0x3, + Auto = 0x7, } - DisplayState State = DisplayState.All; + DisplayState State = DisplayState.Auto; Dictionary Labels = new Dictionary(); + Dictionary Platforms; + Dictionary Sidings; + public OSDLocations(WindowManager owner) : base(owner, 0, 0, "OSD Locations") { + UpdateLabelLists(); + if (Platforms == null) State = DisplayState.All; } + Dictionary platforms = new Dictionary(); + Dictionary sidings = new Dictionary(); + List stationref = new List(); + + void UpdateLabelLists() + { + var activity = Owner.Viewer.Simulator.ActivityRun; + var ai = Owner.Viewer.Simulator.AI; + var stationstops = Owner.Viewer.Simulator.PlayerLocomotive.Train.StationStops; + var trackdb = Owner.Viewer.Simulator.TDB.TrackDB; + + if (activity != null) + { + if (Owner.Viewer.Simulator.AI.aiListChanged) + { + var stationxref = Owner.Viewer.Simulator.OriginalPlayerTrain.TCRoute.StationXRef; + + //Collect platforms/sidings player-train + foreach (var station in stationxref) + { + var stationid = station.Value[2]; + if (!stationref.Contains(stationid)) + stationref.Add(stationid); + } + //Collect platforms/sidings ai-trains + foreach (var aitrains in ai.AITrains) + { + foreach (var station in aitrains.TCRoute.StationXRef) + { + var stationid = station.Value[2]; + if (!stationref.Contains(stationid)) + stationref.Add(stationid); + } + } + //Look for platforms or sidings + foreach (var stationid in stationref) + { + if (trackdb.TrItemTable[stationid].ItemType is Orts.Formats.Msts.TrItem.trItemType.trPLATFORM && !platforms.ContainsKey(trackdb.TrItemTable[stationid].ItemName)) + platforms[trackdb.TrItemTable[stationid].ItemName] = true; + + else if (trackdb.TrItemTable[stationid].ItemType is Orts.Formats.Msts.TrItem.trItemType.trSIDING && !sidings.ContainsKey(trackdb.TrItemTable[stationid].ItemName)) + sidings[trackdb.TrItemTable[stationid].ItemName] = true; + + } + } + Platforms = platforms; + Sidings = sidings; + } + else if (Owner.Viewer.Simulator.TimetableMode) + { + // TODO: Collect all the sidings in timetableMode. + // TODO: Set an event to avoid looping in this code. + + //Collect platforms/sidings player-train + foreach (var station in stationstops) + { + var stationid = station.PlatformReference; + if (!stationref.Contains(stationid)) + stationref.Add(stationid); + + } + //Collect platforms/sidings ai-trains + foreach (var startlist in ai.StartList) + { + foreach (var station in startlist.StationStops) + { + var stationid = station.PlatformReference; + if (!stationref.Contains(stationid)) + stationref.Add(stationid); + + } + } + //Look for platforms or sidings + foreach (var stationid in stationref) + { + if (trackdb.TrItemTable[stationid].ItemType is Orts.Formats.Msts.TrItem.trItemType.trPLATFORM && !platforms.ContainsKey(trackdb.TrItemTable[stationid].ItemName)) + platforms[trackdb.TrItemTable[stationid].ItemName] = true; + + else if (trackdb.TrItemTable[stationid].ItemType is Orts.Formats.Msts.TrItem.trItemType.trSIDING && !sidings.ContainsKey(trackdb.TrItemTable[stationid].ItemName)) + sidings[trackdb.TrItemTable[stationid].ItemName] = true; + + } + Platforms = platforms; + Sidings = sidings; + } + else + { + Platforms = null; + Sidings = null; + } + } + public override bool Interactive { get @@ -58,9 +156,11 @@ public override void TabAction() { + // All -> Platforms -> Sidings -> [if activity/timetable active] Auto -> All -> ... if (State == DisplayState.All) State = DisplayState.Platforms; else if (State == DisplayState.Platforms) State = DisplayState.Sidings; - else if (State == DisplayState.Sidings) State = DisplayState.All; + else if (State == DisplayState.Sidings) State = Platforms != null ? DisplayState.Auto : DisplayState.All; + else if (State == DisplayState.Auto) State = DisplayState.All; } public override void PrepareFrame(RenderFrame frame, ORTS.Common.ElapsedTime elapsedTime, bool updateFull) @@ -67,6 +167,8 @@ { if (updateFull) { + UpdateLabelLists(); + var labels = Labels; var newLabels = new Dictionary(labels.Count); var worldFiles = Owner.Viewer.World.Scenery.WorldFiles; @@ -77,6 +179,9 @@ { foreach (var platform in worldFile.platforms) { + if (State == DisplayState.Auto && Platforms != null && (!Platforms.ContainsKey(platform.ItemName) || !Platforms[platform.ItemName])) + continue; + // Calculates distance between camera and platform label. var distance = WorldLocation.GetDistance(platform.Location.WorldLocation, cameraLocation).Length(); if (distance <= MaximumDistancePlatform) @@ -97,6 +202,9 @@ { foreach (var siding in worldFile.sidings) { + if (State == DisplayState.Auto && Sidings != null && (!Sidings.ContainsKey(siding.ItemName) || !Sidings[siding.ItemName])) + continue; + // Calculates distance between camera and siding label. var distance = WorldLocation.GetDistance(siding.Location.WorldLocation, cameraLocation).Length(); if (distance <= MaximumDistanceSiding) Index: RunActivity/Viewer3D/Viewer.cs =================================================================== --- RunActivity/Viewer3D/Viewer.cs (revision 3869) +++ RunActivity/Viewer3D/Viewer.cs (working copy) @@ -799,6 +799,9 @@ { switch (OSDLocations.CurrentDisplayState) { + case OSDLocations.DisplayState.Auto: + MessagesWindow.AddMessage(Catalog.GetString("Activity platform and siding labels visible."), 5); + break; case OSDLocations.DisplayState.All: MessagesWindow.AddMessage(Catalog.GetString("Platform and siding labels visible."), 5); break;