Skip to content

Commit 9bc16f6

Browse files
committed
Automatic merge of T1.5.1-351-gc9abcd22b and 7 pull requests
- Pull request #570 at 14abf7a: Experimental glTF 2.0 support with PBR lighting - Pull request #732 at 1edb2e5: Improvements for air brakes - Pull request #751 at 00981a2: Web interface to control cab controls with external hardware - Pull request #767 at 4cb5c77: Refine sunrise and sunset - Pull request #803 at 7157e08: Various adjustments to steam adhesion - Pull request #809 at f67822a: Some on-screen messages not suppressed, Bug #2008012 - Pull request #813 at a8e9d9b: Refactored garbage generators
9 parents 54950b2 + c9abcd2 + 14abf7a + 1edb2e5 + 00981a2 + 4cb5c77 + 7157e08 + f67822a + a8e9d9b commit 9bc16f6

File tree

7 files changed

+75
-38
lines changed

7 files changed

+75
-38
lines changed

Source/Orts.Formats.Msts/SignalConfigurationFile.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -444,17 +444,22 @@ public class SignalFunction : IEquatable<SignalFunction>
444444

445445
public readonly string Name;
446446
public readonly MstsSignalFunction MstsFunction;
447+
readonly int HashCode;
447448

448449
public SignalFunction(MstsSignalFunction mstsFunction)
449450
{
450451
Name = mstsFunction.ToString();
451452
MstsFunction = mstsFunction;
453+
454+
HashCode = Name.GetHashCode() ^ MstsFunction.GetHashCode();
452455
}
453456

454457
public SignalFunction(string name, MstsSignalFunction mstsFunction)
455458
{
456459
Name = name;
457460
MstsFunction = mstsFunction;
461+
462+
HashCode = Name.GetHashCode() ^ MstsFunction.GetHashCode();
458463
}
459464

460465
public override string ToString()
@@ -505,7 +510,7 @@ public bool Equals(SignalFunction other)
505510

506511
public override int GetHashCode()
507512
{
508-
return Name.GetHashCode() ^ MstsFunction.GetHashCode();
513+
return HashCode;
509514
}
510515
}
511516
#endregion

Source/Orts.Simulation/Simulation/RollingStocks/SubSystems/TrainControlSystem.cs

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,12 @@
2222
using System.Collections.Generic;
2323
using System.Diagnostics;
2424
using System.IO;
25-
using System.Linq;
2625
using Orts.Common;
2726
using Orts.Formats.Msts;
2827
using Orts.Parsers.Msts;
2928
using Orts.Simulation.Physics;
3029
using Orts.Simulation.RollingStocks.SubSystems.PowerSupplies;
30+
using Orts.Simulation.Signalling;
3131
using ORTS.Common;
3232
using ORTS.Scripting.Api;
3333
using ORTS.Scripting.Api.ETCS;
@@ -648,7 +648,6 @@ SignalFeatures NextGenericSignalFeatures(string signalFunctionTypeName, int item
648648
{
649649
case Train.TrainObjectItem.TRAINOBJECTTYPE.SIGNAL:
650650
case Train.TrainObjectItem.TRAINOBJECTTYPE.SPEED_SIGNAL:
651-
{
652651
var playerTrainSignalList = Locomotive.Train.PlayerTrainSignals[dir][function];
653652
if (itemSequenceIndex > playerTrainSignalList.Count - 1)
654653
goto Exit; // no n-th signal available
@@ -670,29 +669,37 @@ SignalFeatures NextGenericSignalFeatures(string signalFunctionTypeName, int item
670669
aspect = (Aspect)Locomotive.Train.signalRef.TranslateToTCSAspect(trainSignal.SignalObject.this_sig_lr(function));
671670
}
672671

673-
var functionHead = trainSignal.SignalObject.SignalHeads.Find(head => head.Function == function);
672+
var functionHead = default(SignalHead);
673+
foreach (var head in trainSignal.SignalObject.SignalHeads)
674+
if (head.Function == function)
675+
functionHead = head;
674676
signalTypeName = functionHead.SignalTypeName;
675-
if (functionHead.signalType.DrawStates.Any(d => d.Value.Index == functionHead.draw_state))
677+
foreach (var key in functionHead.signalType.DrawStates.Keys)
676678
{
677-
drawStateName = functionHead.signalType.DrawStates.First(d => d.Value.Index == functionHead.draw_state).Value.Name;
679+
if (functionHead.signalType.DrawStates[key].Index == functionHead.draw_state)
680+
drawStateName = functionHead.signalType.DrawStates[key].Name;
681+
break;
678682
}
679683
textAspect = functionHead?.TextSignalAspect ?? "";
680684
break;
681-
}
682685
case Train.TrainObjectItem.TRAINOBJECTTYPE.SPEEDPOST:
683-
{
684-
var playerTrainSpeedpostList = Locomotive.Train.PlayerTrainSpeedposts[dir].Where(x => !x.IsWarning).ToList();
685-
if (itemSequenceIndex > playerTrainSpeedpostList.Count - 1)
686-
goto Exit; // no n-th speedpost available
687-
var trainSpeedpost = playerTrainSpeedpostList[itemSequenceIndex];
688-
if (trainSpeedpost.DistanceToTrainM > maxDistanceM)
689-
goto Exit; // the requested speedpost is too distant
690-
691-
// All OK, we can retrieve the data for the required speedpost;
692-
distanceM = trainSpeedpost.DistanceToTrainM;
693-
speedLimitMpS = trainSpeedpost.AllowedSpeedMpS;
686+
var j = 0;
687+
for (var i = 0; i < Locomotive.Train.PlayerTrainSpeedposts[dir].Count; i++)
688+
{
689+
if (Locomotive.Train.PlayerTrainSpeedposts[dir][i].IsWarning)
690+
continue;
691+
if (itemSequenceIndex == j++)
692+
{
693+
var trainSpeedpost = Locomotive.Train.PlayerTrainSpeedposts[dir][i];
694+
if (trainSpeedpost.DistanceToTrainM <= maxDistanceM)
695+
{
696+
distanceM = trainSpeedpost.DistanceToTrainM;
697+
speedLimitMpS = trainSpeedpost.AllowedSpeedMpS;
698+
}
699+
break;
700+
}
701+
}
694702
break;
695-
}
696703
}
697704

698705
Exit:
@@ -1249,7 +1256,7 @@ private void UpdateETCSPlanning()
12491256
float maxDistanceAheadM = 0;
12501257
ETCSStatus.SpeedTargets.Clear();
12511258
ETCSStatus.SpeedTargets.Add(new PlanningTarget(0, CurrentSpeedLimitMpS));
1252-
foreach (int i in Enumerable.Range(0, 5))
1259+
for (int i = 0; i < 5; i++)
12531260
{
12541261
maxDistanceAheadM = NextSignalDistanceM(i);
12551262
if (NextSignalAspect(i) == Aspect.Stop || NextSignalAspect(i) == Aspect.None) break;
@@ -1258,7 +1265,7 @@ private void UpdateETCSPlanning()
12581265
}
12591266
float prevDist = 0;
12601267
float prevSpeed = 0;
1261-
foreach (int i in Enumerable.Range(0, 10))
1268+
for (int i = 0; i < 10; i++)
12621269
{
12631270
float distanceM = NextPostDistanceM(i);
12641271
if (distanceM >= maxDistanceAheadM) break;

Source/Orts.Simulation/Simulation/Signalling/SIGSCRfile.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,8 +197,9 @@ public bool SH_process_StatementBlock(SignalHead thisHead, ArrayList Statements,
197197

198198
// loop through all lines
199199

200-
foreach (object scriptstat in Statements)
200+
for (int i = 0; i < Statements.Count; i++)
201201
{
202+
object scriptstat = Statements[i];
202203

203204
// process statement lines
204205

@@ -1553,8 +1554,9 @@ public bool SH_processConditionStatement(SignalHead thisHead, ArrayList thisCSta
15531554
bool termnegate = false;
15541555
SignalScripts.SCRAndOr condstring = SignalScripts.SCRAndOr.NONE;
15551556

1556-
foreach (object thisCond in thisCStatList)
1557+
for (int i = 0; i < thisCStatList.Count; i++)
15571558
{
1559+
object thisCond = thisCStatList[i];
15581560

15591561
// single condition : process
15601562

Source/Orts.Simulation/Simulation/Signalling/SignalObject.cs

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -580,15 +580,21 @@ public void setSignalDefaultNextSignal()
580580
/// </summary>
581581
public bool isSignalNormal()
582582
{
583-
return SignalHeads.Any(sigHead => sigHead.Function == SignalFunction.NORMAL);
583+
for (int i = 0; i < SignalHeads.Count; i++)
584+
if (SignalHeads[i].Function == SignalFunction.NORMAL)
585+
return true;
586+
return false;
584587
}
585588

586589
/// <summary>
587590
/// isORTSSignalType : Returns true if at least one signal head is of required type
588591
/// </summary>
589592
public bool isORTSSignalType(SignalFunction function)
590593
{
591-
return SignalHeads.Any(sigHead => function == sigHead.Function);
594+
for (int i = 0; i < SignalHeads.Count; i++)
595+
if (SignalHeads[i].Function == function)
596+
return true;
597+
return false;
592598
}
593599

594600
/// <summary>
@@ -1791,15 +1797,17 @@ public void StateUpdate()
17911797
if (holdState == HoldState.ManualApproach || holdState == HoldState.ManualLock || holdState == HoldState.ManualPass) return;
17921798
}
17931799

1794-
foreach (SignalHead sigHead in SignalHeads.Where(sigHead => sigHead.Function == SignalFunction.NORMAL))
1800+
for (int i = 0; i < SignalHeads.Count; i++)
17951801
{
1796-
sigHead.Update();
1802+
if (SignalHeads[i].Function == SignalFunction.NORMAL)
1803+
SignalHeads[i].Update();
17971804
}
17981805

17991806
// next, update all other heads
1800-
foreach (SignalHead sigHead in SignalHeads.Where(sigHead => sigHead.Function != SignalFunction.NORMAL))
1807+
for (int i = 0; i < SignalHeads.Count; i++)
18011808
{
1802-
sigHead.Update();
1809+
if (SignalHeads[i].Function != SignalFunction.NORMAL)
1810+
SignalHeads[i].Update();
18031811
}
18041812

18051813
}

Source/RunActivity/Viewer3D/Materials.cs

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -262,8 +262,14 @@ public void Mark()
262262

263263
public void Mark(Texture2D texture)
264264
{
265-
if (Textures.ContainsValue(texture))
266-
TextureMarks[Textures.First(kvp => kvp.Value == texture).Key] = true;
265+
foreach (var key in Textures.Keys)
266+
{
267+
if (Textures[key] == texture)
268+
{
269+
TextureMarks[key] = true;
270+
break;
271+
}
272+
}
267273
}
268274

269275
public void Sweep()
@@ -552,14 +558,15 @@ public void Mark()
552558

553559
public void Mark(Material material)
554560
{
555-
foreach (var path in from kvp in Materials
556-
where kvp.Value == material
557-
select kvp.Key)
561+
foreach (var key in Materials.Keys)
558562
{
559-
MaterialMarks[path] = true;
563+
if (Materials[key] == material)
564+
{
565+
MaterialMarks[key] = true;
560566
break;
561567
}
562568
}
569+
}
563570

564571
public void Sweep()
565572
{

Source/RunActivity/Viewer3D/RenderFrame.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -771,8 +771,10 @@ public void Sort()
771771
var renderItemComparer = new RenderItem.Comparer(CameraLocation);
772772
foreach (var sequence in RenderItems)
773773
{
774-
foreach (var sequenceMaterial in sequence.Where(kvp => kvp.Value.Count > 0))
774+
foreach (var sequenceMaterial in sequence)
775775
{
776+
if (sequenceMaterial.Value.Count == 0)
777+
continue;
776778
if (sequenceMaterial.Key != DummyBlendedMaterial)
777779
continue;
778780
sequenceMaterial.Value.Sort(renderItemComparer);

Source/RunActivity/Viewer3D/Shapes.cs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,14 @@ public void Mark()
9595

9696
public void Mark(SharedShape shape)
9797
{
98-
if (Shapes.ContainsValue(shape))
99-
ShapeMarks[Shapes.First(kvp => kvp.Value == shape).Key] = true;
98+
foreach (var key in Shapes.Keys)
99+
{
100+
if (Shapes[key] == shape)
101+
{
102+
ShapeMarks[key] = true;
103+
break;
104+
}
105+
}
100106
}
101107

102108
public void Sweep()

0 commit comments

Comments
 (0)