Skip to content

Commit 262a6b5

Browse files
committed
refactor: TrainCar: extract animated air hose data structures
1 parent 7edd52d commit 262a6b5

File tree

5 files changed

+97
-110
lines changed

5 files changed

+97
-110
lines changed

Source/Orts.Simulation/Orts.Simulation.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@
127127
<Compile Include="Simulation\Hazzard.cs" />
128128
<Compile Include="Simulation\LevelCrossing.cs" />
129129
<Compile Include="Simulation\Physics\Train.cs" />
130+
<Compile Include="Simulation\RollingStocks\Coupling\AnimatedAirHose.cs" />
130131
<Compile Include="Simulation\RollingStocks\Coupling\AnimatedCoupler.cs" />
131132
<Compile Include="Simulation\RollingStocks\LocomotiveAttributes.cs" />
132133
<Compile Include="Simulation\RollingStocks\MSTSControlTrailerCar.cs" />
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// COPYRIGHT 2022 by the Open Rails project.
2+
//
3+
// This file is part of Open Rails.
4+
//
5+
// Open Rails is free software: you can redistribute it and/or modify
6+
// it under the terms of the GNU General Public License as published by
7+
// the Free Software Foundation, either version 3 of the License, or
8+
// (at your option) any later version.
9+
//
10+
// Open Rails is distributed in the hope that it will be useful,
11+
// but WITHOUT ANY WARRANTY; without even the implied warranty of
12+
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13+
// GNU General Public License for more details.
14+
//
15+
// You should have received a copy of the GNU General Public License
16+
// along with Open Rails. If not, see <http://www.gnu.org/licenses/>.
17+
18+
using Microsoft.Xna.Framework;
19+
20+
namespace Orts.Simulation.RollingStocks.Coupling
21+
{
22+
public struct AnimatedAirHose
23+
{
24+
public Vector3 Size;
25+
public AnimatedAirHoseState Connected;
26+
public AnimatedAirHoseState Disconnected;
27+
public float HeightAdjustmentM;
28+
public float YAngleAdjustmentRad;
29+
public float ZAngleAdjustmentRad;
30+
}
31+
32+
public struct AnimatedAirHoseState
33+
{
34+
public string ShapeFileName;
35+
}
36+
}

Source/Orts.Simulation/Simulation/RollingStocks/MSTSWagon.cs

Lines changed: 16 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -434,16 +434,16 @@ public virtual void LoadFromWagFile(string wagFilePath)
434434
RearCoupler.Closed.ShapeFileName = null;
435435
}
436436

437-
if (FrontAirHoseShapeFileName != null && !File.Exists(wagonFolderSlash + FrontAirHoseShapeFileName))
437+
if (FrontAirHose.Connected.ShapeFileName != null && !File.Exists(wagonFolderSlash + FrontAirHose.Connected.ShapeFileName))
438438
{
439-
Trace.TraceWarning("{0} references non-existent shape {1}", WagFilePath, wagonFolderSlash + FrontAirHoseShapeFileName);
440-
FrontAirHoseShapeFileName = null;
439+
Trace.TraceWarning("{0} references non-existent shape {1}", WagFilePath, wagonFolderSlash + FrontAirHose.Connected.ShapeFileName);
440+
FrontAirHose.Connected.ShapeFileName = null;
441441
}
442442

443-
if (RearAirHoseShapeFileName != null && !File.Exists(wagonFolderSlash + RearAirHoseShapeFileName))
443+
if (RearAirHose.Connected.ShapeFileName != null && !File.Exists(wagonFolderSlash + RearAirHose.Connected.ShapeFileName))
444444
{
445-
Trace.TraceWarning("{0} references non-existent shape {1}", WagFilePath, wagonFolderSlash + RearAirHoseShapeFileName);
446-
RearAirHoseShapeFileName = null;
445+
Trace.TraceWarning("{0} references non-existent shape {1}", WagFilePath, wagonFolderSlash + RearAirHose.Connected.ShapeFileName);
446+
RearAirHose.Connected.ShapeFileName = null;
447447
}
448448

449449
// If trailing loco resistance constant has not been defined in WAG/ENG file then assign default value based upon orig Davis values
@@ -1229,10 +1229,8 @@ public virtual void Parse(string lowercasetoken, STFReader stf)
12291229

12301230
case "wagon(coupling(frontairhoseanim":
12311231
stf.MustMatch("(");
1232-
FrontAirHoseShapeFileName = stf.ReadString();
1233-
FrontAirHoseAnimWidthM = stf.ReadFloat(STFReader.UNITS.Distance, null);
1234-
FrontAirHoseAnimHeightM = stf.ReadFloat(STFReader.UNITS.Distance, null);
1235-
FrontAirHoseAnimLengthM = stf.ReadFloat(STFReader.UNITS.Distance, null);
1232+
FrontAirHose.Connected.ShapeFileName = stf.ReadString();
1233+
FrontAirHose.Size = stf.ReadVector3(STFReader.UNITS.Distance, Vector3.Zero);
12361234
stf.SkipRestOfBlock();
12371235
break;
12381236

@@ -1245,10 +1243,8 @@ public virtual void Parse(string lowercasetoken, STFReader stf)
12451243

12461244
case "wagon(coupling(rearairhoseanim":
12471245
stf.MustMatch("(");
1248-
RearAirHoseShapeFileName = stf.ReadString();
1249-
RearAirHoseAnimWidthM = stf.ReadFloat(STFReader.UNITS.Distance, null);
1250-
RearAirHoseAnimHeightM = stf.ReadFloat(STFReader.UNITS.Distance, null);
1251-
RearAirHoseAnimLengthM = stf.ReadFloat(STFReader.UNITS.Distance, null);
1246+
RearAirHose.Connected.ShapeFileName = stf.ReadString();
1247+
RearAirHose.Size = stf.ReadVector3(STFReader.UNITS.Distance, Vector3.Zero);
12521248
stf.SkipRestOfBlock();
12531249
break;
12541250

@@ -1274,19 +1270,15 @@ public virtual void Parse(string lowercasetoken, STFReader stf)
12741270

12751271
case "wagon(coupling(frontairhosediconnectedanim":
12761272
stf.MustMatch("(");
1277-
FrontAirHoseDisconnectedShapeFileName = stf.ReadString();
1278-
FrontAirHoseDisconnectedAnimWidthM = stf.ReadFloat(STFReader.UNITS.Distance, null);
1279-
FrontAirHoseDisconnectedAnimHeightM = stf.ReadFloat(STFReader.UNITS.Distance, null);
1280-
FrontAirHoseDisconnectedAnimLengthM = stf.ReadFloat(STFReader.UNITS.Distance, null);
1273+
FrontAirHose.Disconnected.ShapeFileName = stf.ReadString();
1274+
// NOTE: Skip reading the size as it is unused: stf.ReadVector3(STFReader.UNITS.Distance, Vector3.Zero);
12811275
stf.SkipRestOfBlock();
12821276
break;
12831277

12841278
case "wagon(coupling(rearairhosediconnectedanim":
12851279
stf.MustMatch("(");
1286-
RearAirHoseDisconnectedShapeFileName = stf.ReadString();
1287-
RearAirHoseDisconnectedAnimWidthM = stf.ReadFloat(STFReader.UNITS.Distance, null);
1288-
RearAirHoseDisconnectedAnimHeightM = stf.ReadFloat(STFReader.UNITS.Distance, null);
1289-
RearAirHoseDisconnectedAnimLengthM = stf.ReadFloat(STFReader.UNITS.Distance, null);
1280+
RearAirHose.Disconnected.ShapeFileName = stf.ReadString();
1281+
// NOTE: Skip reading the size as it is unused: stf.ReadVector3(STFReader.UNITS.Distance, Vector3.Zero);
12901282
stf.SkipRestOfBlock();
12911283
break;
12921284

@@ -1445,26 +1437,8 @@ public virtual void Copy(MSTSWagon copy)
14451437
FreightAnimFlag = copy.FreightAnimFlag;
14461438
FrontCoupler = copy.FrontCoupler;
14471439
RearCoupler = copy.RearCoupler;
1448-
1449-
FrontAirHoseShapeFileName = copy.FrontAirHoseShapeFileName;
1450-
FrontAirHoseAnimWidthM = copy.FrontAirHoseAnimWidthM;
1451-
FrontAirHoseAnimHeightM = copy.FrontAirHoseAnimHeightM;
1452-
FrontAirHoseAnimLengthM = copy.FrontAirHoseAnimLengthM;
1453-
1454-
FrontAirHoseDisconnectedShapeFileName = copy.FrontAirHoseDisconnectedShapeFileName;
1455-
FrontAirHoseDisconnectedAnimWidthM = copy.FrontAirHoseDisconnectedAnimWidthM;
1456-
FrontAirHoseDisconnectedAnimHeightM = copy.FrontAirHoseDisconnectedAnimHeightM;
1457-
FrontAirHoseDisconnectedAnimLengthM = copy.FrontAirHoseDisconnectedAnimLengthM;
1458-
1459-
RearAirHoseShapeFileName = copy.RearAirHoseShapeFileName;
1460-
RearAirHoseAnimWidthM = copy.RearAirHoseAnimWidthM;
1461-
RearAirHoseAnimHeightM = copy.RearAirHoseAnimHeightM;
1462-
RearAirHoseAnimLengthM = copy.RearAirHoseAnimLengthM;
1463-
1464-
RearAirHoseDisconnectedShapeFileName = copy.RearAirHoseDisconnectedShapeFileName;
1465-
RearAirHoseDisconnectedAnimWidthM = copy.RearAirHoseDisconnectedAnimWidthM;
1466-
RearAirHoseDisconnectedAnimHeightM = copy.RearAirHoseDisconnectedAnimHeightM;
1467-
RearAirHoseDisconnectedAnimLengthM = copy.RearAirHoseDisconnectedAnimLengthM;
1440+
FrontAirHose = copy.FrontAirHose;
1441+
RearAirHose = copy.RearAirHose;
14681442

14691443
CarWidthM = copy.CarWidthM;
14701444
CarHeightM = copy.CarHeightM;

Source/Orts.Simulation/Simulation/RollingStocks/TrainCar.cs

Lines changed: 20 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -216,32 +216,8 @@ public static Interpolator SteamHeatBoilerFuelUsageGalukpH()
216216
public AnimatedCoupler RearCoupler = new AnimatedCoupler();
217217

218218
// Air hose animation
219-
public string FrontAirHoseShapeFileName;
220-
public float FrontAirHoseAnimLengthM;
221-
public float FrontAirHoseAnimWidthM;
222-
public float FrontAirHoseAnimHeightM;
223-
224-
public string FrontAirHoseDisconnectedShapeFileName;
225-
public float FrontAirHoseDisconnectedAnimLengthM;
226-
public float FrontAirHoseDisconnectedAnimWidthM;
227-
public float FrontAirHoseDisconnectedAnimHeightM;
228-
229-
public string RearAirHoseShapeFileName;
230-
public float RearAirHoseAnimLengthM;
231-
public float RearAirHoseAnimWidthM;
232-
public float RearAirHoseAnimHeightM;
233-
234-
public string RearAirHoseDisconnectedShapeFileName;
235-
public float RearAirHoseDisconnectedAnimLengthM;
236-
public float RearAirHoseDisconnectedAnimWidthM;
237-
public float RearAirHoseDisconnectedAnimHeightM;
238-
239-
public float FrontAirHoseHeightAdjustmentM;
240-
public float RearAirHoseHeightAdjustmentM;
241-
public float FrontAirHoseYAngleAdjustmentRad;
242-
public float FrontAirHoseZAngleAdjustmentRad;
243-
public float RearAirHoseYAngleAdjustmentRad;
244-
public float RearAirHoseZAngleAdjustmentRad;
219+
public AnimatedAirHose FrontAirHose = new AnimatedAirHose();
220+
public AnimatedAirHose RearAirHose = new AnimatedAirHose();
245221

246222
public float CarAirHoseLengthM;
247223
public float CarAirHoseHorizontalLengthM;
@@ -1402,60 +1378,60 @@ public void UpdateTrainDerailmentRisk(float elapsedClockSeconds)
14021378
var frontairhoseheightadjustmentreferenceM = (float)Math.Sqrt((float)Math.Pow(CarAirHoseLengthM, 2) - (float)Math.Pow(CarBehind.CarAirHoseHorizontalLengthM, 2));
14031379

14041380
// actual airhose height
1405-
RearAirHoseHeightAdjustmentM = (float)Math.Sqrt((float)Math.Pow(CarAirHoseLengthM, 2) - (float)Math.Pow((CarAirHoseHorizontalLengthM + CouplerSlackM), 2));
1406-
CarBehind.FrontAirHoseHeightAdjustmentM = (float)Math.Sqrt((float)Math.Pow(CarAirHoseLengthM, 2) - (float)Math.Pow((CarBehind.CarAirHoseHorizontalLengthM + CouplerSlackM), 2));
1381+
RearAirHose.HeightAdjustmentM = (float)Math.Sqrt((float)Math.Pow(CarAirHoseLengthM, 2) - (float)Math.Pow((CarAirHoseHorizontalLengthM + CouplerSlackM), 2));
1382+
CarBehind.FrontAirHose.HeightAdjustmentM = (float)Math.Sqrt((float)Math.Pow(CarAirHoseLengthM, 2) - (float)Math.Pow((CarBehind.CarAirHoseHorizontalLengthM + CouplerSlackM), 2));
14071383

14081384
// refererence adjustment heights to rest position
14091385
// If higher then rest position, then +ve adjustment
1410-
if (RearAirHoseHeightAdjustmentM >= rearairhoseheightadjustmentreferenceM)
1386+
if (RearAirHose.HeightAdjustmentM >= rearairhoseheightadjustmentreferenceM)
14111387
{
1412-
RearAirHoseHeightAdjustmentM -= rearairhoseheightadjustmentreferenceM;
1388+
RearAirHose.HeightAdjustmentM -= rearairhoseheightadjustmentreferenceM;
14131389
}
14141390
else // if lower then the rest position, then -ve adjustment
14151391
{
1416-
RearAirHoseHeightAdjustmentM = (rearairhoseheightadjustmentreferenceM - RearAirHoseHeightAdjustmentM);
1392+
RearAirHose.HeightAdjustmentM = (rearairhoseheightadjustmentreferenceM - RearAirHose.HeightAdjustmentM);
14171393
}
14181394

1419-
if (CarBehind.FrontAirHoseHeightAdjustmentM >= frontairhoseheightadjustmentreferenceM)
1395+
if (CarBehind.FrontAirHose.HeightAdjustmentM >= frontairhoseheightadjustmentreferenceM)
14201396
{
1421-
CarBehind.FrontAirHoseHeightAdjustmentM -= frontairhoseheightadjustmentreferenceM;
1397+
CarBehind.FrontAirHose.HeightAdjustmentM -= frontairhoseheightadjustmentreferenceM;
14221398
}
14231399
else
14241400
{
1425-
CarBehind.FrontAirHoseHeightAdjustmentM = frontairhoseheightadjustmentreferenceM - CarBehind.FrontAirHoseHeightAdjustmentM;
1401+
CarBehind.FrontAirHose.HeightAdjustmentM = frontairhoseheightadjustmentreferenceM - CarBehind.FrontAirHose.HeightAdjustmentM;
14261402
}
14271403

14281404
// Calculate angle adjustments
14291405
var rearAirhoseAngleAdjustmentReferenceRad = (float)Math.Asin(CarAirHoseHorizontalLengthM / CarAirHoseLengthM);
14301406
var frontAirhoseAngleAdjustmentReferenceRad = (float)Math.Asin(CarBehind.CarAirHoseHorizontalLengthM / CarAirHoseLengthM);
14311407

1432-
RearAirHoseZAngleAdjustmentRad = (float)Math.Asin((CarAirHoseHorizontalLengthM + CouplerSlackM) / CarAirHoseLengthM);
1433-
CarBehind.FrontAirHoseZAngleAdjustmentRad = (float)Math.Asin((CarBehind.CarAirHoseHorizontalLengthM + CouplerSlackM) / CarAirHoseLengthM);
1408+
RearAirHose.ZAngleAdjustmentRad = (float)Math.Asin((CarAirHoseHorizontalLengthM + CouplerSlackM) / CarAirHoseLengthM);
1409+
CarBehind.FrontAirHose.ZAngleAdjustmentRad = (float)Math.Asin((CarBehind.CarAirHoseHorizontalLengthM + CouplerSlackM) / CarAirHoseLengthM);
14341410

14351411
// refererence adjustment angles to rest position
1436-
if (RearAirHoseZAngleAdjustmentRad >= rearAirhoseAngleAdjustmentReferenceRad)
1412+
if (RearAirHose.ZAngleAdjustmentRad >= rearAirhoseAngleAdjustmentReferenceRad)
14371413
{
1438-
RearAirHoseZAngleAdjustmentRad -= rearAirhoseAngleAdjustmentReferenceRad;
1414+
RearAirHose.ZAngleAdjustmentRad -= rearAirhoseAngleAdjustmentReferenceRad;
14391415
}
14401416
else
14411417
{
1442-
RearAirHoseZAngleAdjustmentRad = (rearAirhoseAngleAdjustmentReferenceRad - RearAirHoseZAngleAdjustmentRad);
1418+
RearAirHose.ZAngleAdjustmentRad = (rearAirhoseAngleAdjustmentReferenceRad - RearAirHose.ZAngleAdjustmentRad);
14431419
}
14441420

14451421
// The Y axis angle adjustment should be the same as the z axis
1446-
RearAirHoseYAngleAdjustmentRad = RearAirHoseZAngleAdjustmentRad;
1422+
RearAirHose.YAngleAdjustmentRad = RearAirHose.ZAngleAdjustmentRad;
14471423

1448-
if (CarBehind.FrontAirHoseZAngleAdjustmentRad >= frontAirhoseAngleAdjustmentReferenceRad)
1424+
if (CarBehind.FrontAirHose.ZAngleAdjustmentRad >= frontAirhoseAngleAdjustmentReferenceRad)
14491425
{
1450-
CarBehind.FrontAirHoseZAngleAdjustmentRad -= frontAirhoseAngleAdjustmentReferenceRad;
1426+
CarBehind.FrontAirHose.ZAngleAdjustmentRad -= frontAirhoseAngleAdjustmentReferenceRad;
14511427
}
14521428
else
14531429
{
1454-
CarBehind.FrontAirHoseZAngleAdjustmentRad = (frontAirhoseAngleAdjustmentReferenceRad - CarBehind.FrontAirHoseZAngleAdjustmentRad);
1430+
CarBehind.FrontAirHose.ZAngleAdjustmentRad = (frontAirhoseAngleAdjustmentReferenceRad - CarBehind.FrontAirHose.ZAngleAdjustmentRad);
14551431
}
14561432

14571433
// The Y axis angle adjustment should be the same as the z axis
1458-
CarBehind.FrontAirHoseYAngleAdjustmentRad = CarBehind.FrontAirHoseZAngleAdjustmentRad;
1434+
CarBehind.FrontAirHose.YAngleAdjustmentRad = CarBehind.FrontAirHose.ZAngleAdjustmentRad;
14591435

14601436
}
14611437

0 commit comments

Comments
 (0)