@@ -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 }
0 commit comments