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;