Skip to content

Commit 42fc8e4

Browse files
committed
1 parent b68a97d commit 42fc8e4

File tree

2 files changed

+35
-21
lines changed

2 files changed

+35
-21
lines changed

Source/Orts.Simulation/Simulation/Transfertables.cs

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -40,16 +40,18 @@ namespace Orts.Simulation
4040

4141
public class Transfertable : MovingTable
4242
{
43-
public float Width;
43+
public float Span; // horizontal or vertical
4444
public List<float> Offsets = new List<float>();
45+
public bool VerticalTransfer = false;
46+
public float CenterOffsetComponent = 0;
4547
// Dynamic data
4648
public bool Forward; // forward motion on
4749
public bool Reverse; // reverse motion on
48-
public float XPos = 0; // X Position of animated part, to be compared with X positions of endpoints
50+
public float OffsetPos = 0; // Offset Position of animated part, to be compared with offset positions of endpoints
4951
public bool Connected = true; // Transfertable is connected to a track
5052
public bool SaveConnected = true; // Transfertable is connected to a track
5153
public int ConnectedTarget = -1; // index of trackend connected
52-
public float TargetX = 0; //final target for Viewer;
54+
public float TargetOffset = 0; //final target for Viewer;
5355

5456
public Signals signalRef { get; protected set; }
5557

@@ -68,9 +70,11 @@ public Transfertable(STFReader stf, Simulator simulator): base(stf, simulator)
6870
new STFReader.TokenProcessor("uid", ()=>{ UID = stf.ReadIntBlock(-1); }),
6971
new STFReader.TokenProcessor("animation", ()=>{ animation = stf.ReadStringBlock(null);
7072
Animations.Add(animation.ToLower());}),
73+
new STFReader.TokenProcessor("verticaltransfer", ()=>{ VerticalTransfer = stf.ReadBoolBlock(false);}),
7174
new STFReader.TokenProcessor("length", ()=>{ Length = stf.ReadFloatBlock(STFReader.UNITS.None , null);}),
7275
new STFReader.TokenProcessor("xoffset", ()=>{ CenterOffset.X = stf.ReadFloatBlock(STFReader.UNITS.None , null);}),
7376
new STFReader.TokenProcessor("zoffset", ()=>{ CenterOffset.Z = -stf.ReadFloatBlock(STFReader.UNITS.None , null);}),
77+
new STFReader.TokenProcessor("yoffset", ()=>{ CenterOffset.Y = stf.ReadFloatBlock(STFReader.UNITS.None , null);}),
7478
new STFReader.TokenProcessor("trackshapeindex", ()=>
7579
{
7680
TrackShapeIndex = stf.ReadIntBlock(-1);
@@ -88,11 +92,11 @@ public override void Save(BinaryWriter outf)
8892
base.Save(outf);
8993
outf.Write(Forward);
9094
outf.Write(Reverse);
91-
outf.Write(XPos);
95+
outf.Write(OffsetPos);
9296
outf.Write(Connected);
9397
outf.Write(SaveConnected);
9498
outf.Write(ConnectedTarget);
95-
outf.Write(TargetX);
99+
outf.Write(TargetOffset);
96100
}
97101

98102

@@ -105,11 +109,11 @@ public override void Restore(BinaryReader inf, Simulator simulator)
105109
base.Restore(inf, simulator);
106110
Forward = inf.ReadBoolean();
107111
Reverse = inf.ReadBoolean();
108-
XPos = inf.ReadSingle();
112+
OffsetPos = inf.ReadSingle();
109113
Connected = inf.ReadBoolean();
110114
SaveConnected = inf.ReadBoolean();
111115
ConnectedTarget = inf.ReadInt32();
112-
TargetX = inf.ReadSingle();
116+
TargetOffset = inf.ReadSingle();
113117
}
114118

115119
protected void InitializeOffsetsAndTrackNodes()
@@ -122,7 +126,7 @@ protected void InitializeOffsetsAndTrackNodes()
122126
var iMyTrackNodes = 0;
123127
foreach (var sectionIdx in trackShape.SectionIdxs)
124128
{
125-
Offsets.Add((float)sectionIdx.X);
129+
Offsets.Add(VerticalTransfer ? (float)sectionIdx.Y : (float)sectionIdx.X);
126130
MyTrackNodesIndex[iMyTrackNodes] = -1;
127131
MyTrVectorSectionsIndex[iMyTrackNodes] = -1;
128132
iMyTrackNodes++;
@@ -148,9 +152,16 @@ protected void InitializeOffsetsAndTrackNodes()
148152
}
149153
}
150154
}
151-
XPos = CenterOffset.X;
152-
// Compute width of transfer table
153-
Width = (float)(trackShape.SectionIdxs[trackShape.SectionIdxs.Length - 1].X - trackShape.SectionIdxs[0].X);
155+
if (VerticalTransfer)
156+
{
157+
OffsetPos = CenterOffsetComponent = CenterOffset.Y;
158+
Span = (float)(trackShape.SectionIdxs[trackShape.SectionIdxs.Length - 1].Y - trackShape.SectionIdxs[0].Y);
159+
}
160+
else
161+
{
162+
OffsetPos = CenterOffsetComponent = CenterOffset.X;
163+
Span = (float)(trackShape.SectionIdxs[trackShape.SectionIdxs.Length - 1].X - trackShape.SectionIdxs[0].X);
164+
}
154165
}
155166

156167
/// <summary>
@@ -179,7 +190,7 @@ public override void ComputeTarget(bool isForward)
179190
{
180191
if (MyTrackNodesIndex[iOffset] != -1 && MyTrVectorSectionsIndex[iOffset] != -1)
181192
{
182-
var thisOffsetDiff = Offsets[iOffset] - XPos;
193+
var thisOffsetDiff = Offsets[iOffset] - OffsetPos;
183194
if (thisOffsetDiff < offsetDiff && thisOffsetDiff >= 0)
184195
{
185196
ConnectedTarget = iOffset;
@@ -210,7 +221,7 @@ public override void ComputeTarget(bool isForward)
210221
{
211222
if (MyTrackNodesIndex[iOffset] != -1 && MyTrVectorSectionsIndex[iOffset] != -1)
212223
{
213-
var thisOffsetDiff = Offsets[iOffset] - XPos;
224+
var thisOffsetDiff = Offsets[iOffset] - OffsetPos;
214225
if (thisOffsetDiff > offsetDiff && thisOffsetDiff <= 0)
215226
{
216227
ConnectedTarget = iOffset;
@@ -292,7 +303,10 @@ public override void StartContinuous(bool isForward)
292303
public void ComputeCenter(WorldPosition worldPosition)
293304
{
294305
Vector3 movingCenterOffset = CenterOffset;
295-
movingCenterOffset.X = XPos;
306+
if (VerticalTransfer)
307+
movingCenterOffset.Y = OffsetPos;
308+
else
309+
movingCenterOffset.X = OffsetPos;
296310
Vector3 originCoordinates;
297311
Vector3.Transform(ref movingCenterOffset, ref worldPosition.XNAMatrix, out originCoordinates);
298312
WorldPosition = new WorldPosition(worldPosition);
@@ -340,14 +354,14 @@ public override void Update()
340354
Connected = false;
341355
if (ConnectedTarget != -1)
342356
{
343-
if (Offsets[ConnectedTarget] - XPos < 0.005)
357+
if (Offsets[ConnectedTarget] - OffsetPos < 0.005)
344358
{
345359
Connected = true;
346360
Forward = false;
347361
ConnectedTrackEnd = ConnectedTarget;
348362
Simulator.Confirmer.Information (Simulator.Catalog.GetStringFmt("Transfertable connected"));
349363
GoToTarget = true;
350-
TargetX = Offsets[ConnectedTarget];
364+
TargetOffset = Offsets[ConnectedTarget];
351365
}
352366
}
353367
}
@@ -356,14 +370,14 @@ public override void Update()
356370
Connected = false;
357371
if (ConnectedTarget != -1)
358372
{
359-
if (XPos - Offsets[ConnectedTarget] < 0.005)
373+
if (OffsetPos - Offsets[ConnectedTarget] < 0.005)
360374
{
361375
Connected = true;
362376
Reverse = false;
363377
ConnectedTrackEnd = ConnectedTarget;
364378
Simulator.Confirmer.Information(Simulator.Catalog.GetStringFmt("Transfertable connected"));
365379
GoToTarget = true;
366-
TargetX = Offsets[ConnectedTarget];
380+
TargetOffset = Offsets[ConnectedTarget];
367381
}
368382
}
369383
}

Source/RunActivity/Viewer3D/Shapes.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1131,7 +1131,7 @@ public TransfertableShape(Viewer viewer, string path, WorldPosition initialPosit
11311131
: base(viewer, path, initialPosition, flags)
11321132
{
11331133
Transfertable = transfertable;
1134-
AnimationKey = (Transfertable.XPos - Transfertable.CenterOffset.X)/ Transfertable.Width * SharedShape.Animations[0].FrameCount;
1134+
AnimationKey = (Transfertable.OffsetPos - Transfertable.CenterOffsetComponent) / Transfertable.Span * SharedShape.Animations[0].FrameCount;
11351135
for (var imatrix = 0; imatrix < SharedShape.Matrices.Length; ++imatrix)
11361136
{
11371137
if (SharedShape.MatrixNames[imatrix].ToLower() == transfertable.Animations[0].ToLower())
@@ -1174,7 +1174,7 @@ public override void PrepareFrame(RenderFrame frame, ElapsedTime elapsedTime)
11741174
{
11751175
if (Transfertable.GoToTarget)
11761176
{
1177-
AnimationKey = (Transfertable.TargetX - Transfertable.CenterOffset.X) / Transfertable.Width * SharedShape.Animations[0].FrameCount;
1177+
AnimationKey = (Transfertable.TargetOffset - Transfertable.CenterOffsetComponent) / Transfertable.Span * SharedShape.Animations[0].FrameCount;
11781178
}
11791179

11801180
else if (Transfertable.Forward)
@@ -1188,7 +1188,7 @@ public override void PrepareFrame(RenderFrame frame, ElapsedTime elapsedTime)
11881188
if (AnimationKey > SharedShape.Animations[0].FrameCount) AnimationKey = SharedShape.Animations[0].FrameCount;
11891189
if (AnimationKey < 0) AnimationKey = 0;
11901190

1191-
Transfertable.XPos = AnimationKey / SharedShape.Animations[0].FrameCount * Transfertable.Width + Transfertable.CenterOffset.X;
1191+
Transfertable.OffsetPos = AnimationKey / SharedShape.Animations[0].FrameCount * Transfertable.Span + Transfertable.CenterOffsetComponent;
11921192

11931193
if ((Transfertable.Forward || Transfertable.Reverse) && !Translating)
11941194
{

0 commit comments

Comments
 (0)