1515// You should have received a copy of the GNU General Public License
1616// along with Open Rails. If not, see <http://www.gnu.org/licenses/>.
1717
18- using System ;
18+ using System . Collections . Generic ;
1919using Orts . Parsers . Msts ;
2020
2121namespace Orts . Formats . Msts
@@ -47,6 +47,7 @@ public class SDShape
4747 public SDShape ( )
4848 {
4949 ESD_Bounding_Box = new ESD_Bounding_Box ( ) ;
50+ ESD_Complex = new List < ESD_Complex_Box > ( ) ;
5051 }
5152
5253 public SDShape ( STFReader stf )
@@ -63,6 +64,23 @@ public SDShape(STFReader stf)
6364 if ( ESD_Bounding_Box . Min == null || ESD_Bounding_Box . Max == null ) // ie quietly handle ESD_Bounding_Box()
6465 ESD_Bounding_Box = null ;
6566 } ) ,
67+ new STFReader . TokenProcessor ( "esd_complex" , ( ) => {
68+ ESD_Complex = new List < ESD_Complex_Box > ( ) ;
69+ stf . MustMatch ( "(" ) ;
70+ var count = stf . ReadInt ( null ) ;
71+ stf . ParseBlock ( new [ ]
72+ {
73+ new STFReader . TokenProcessor ( "esd_complex_box" , ( ) =>
74+ {
75+ if ( ESD_Complex . Count >= count )
76+ STFException . TraceWarning ( stf , "Skipped extra ESD_Complex_Box" ) ;
77+ else
78+ ESD_Complex . Add ( new ESD_Complex_Box ( stf ) ) ;
79+ } ) ,
80+ } ) ;
81+ if ( ESD_Complex . Count < count )
82+ STFException . TraceWarning ( stf , ( count - ESD_Complex . Count ) . ToString ( ) + " missing ESD_Complex_Boxes" ) ;
83+ } ) ,
6684 new STFReader . TokenProcessor ( "esd_ortssoundfilename" , ( ) => { ESD_SoundFileName = stf . ReadStringBlock ( null ) ; } ) ,
6785 new STFReader . TokenProcessor ( "esd_ortsbellanimationfps" , ( ) => { ESD_CustomAnimationFPS = stf . ReadFloatBlock ( STFReader . UNITS . Frequency , null ) ; } ) ,
6886 new STFReader . TokenProcessor ( "esd_ortscustomanimationfps" , ( ) => { ESD_CustomAnimationFPS = stf . ReadFloatBlock ( STFReader . UNITS . Frequency , null ) ; } ) ,
@@ -73,6 +91,7 @@ public SDShape(STFReader stf)
7391 public int ESD_Detail_Level ;
7492 public int ESD_Alternative_Texture ;
7593 public ESD_Bounding_Box ESD_Bounding_Box ;
94+ public List < ESD_Complex_Box > ESD_Complex ;
7695 public bool ESD_No_Visual_Obstruction ;
7796 public bool ESD_Snapable ;
7897 public bool ESD_SubObj ;
@@ -84,8 +103,9 @@ public class ESD_Bounding_Box
84103 {
85104 public ESD_Bounding_Box ( ) // default used for files with no SD file
86105 {
87- Min = new TWorldPosition ( 0 , 0 , 0 ) ;
88- Max = new TWorldPosition ( 0 , 0 , 0 ) ;
106+ Min = TWorldPosition . Zero ;
107+ Max = TWorldPosition . Zero ;
108+ Extra = TWorldPosition . Zero ;
89109 }
90110
91111 public ESD_Bounding_Box ( STFReader stf )
@@ -103,8 +123,61 @@ public ESD_Bounding_Box(STFReader stf)
103123 Z = stf . ReadFloat ( STFReader . UNITS . None , null ) ;
104124 Max = new TWorldPosition ( X , Y , Z ) ;
105125 // JP2indirt.sd has extra parameters
126+ item = stf . ReadString ( ) ;
127+ if ( item == ")" )
128+ {
129+ Extra = TWorldPosition . Zero ;
130+ return ;
131+ }
132+ stf . StepBackOneItem ( ) ;
133+ X = stf . ReadFloat ( STFReader . UNITS . None , null ) ;
134+ Y = stf . ReadFloat ( STFReader . UNITS . None , null ) ;
135+ Z = stf . ReadFloat ( STFReader . UNITS . None , null ) ;
136+ Extra = new TWorldPosition ( X , Y , Z ) ;
137+ stf . SkipRestOfBlock ( ) ;
138+ }
139+ public TWorldPosition Min ;
140+ public TWorldPosition Max ;
141+ public TWorldPosition Extra ;
142+ }
143+
144+ public class ESD_Complex_Box
145+ {
146+ public ESD_Complex_Box ( ) // default used for files with no SD file
147+ {
148+ Rotation = TWorldPosition . Zero ;
149+ Translation = TWorldPosition . Zero ;
150+ Min = TWorldPosition . Zero ;
151+ Max = TWorldPosition . Zero ;
152+ }
153+
154+ public ESD_Complex_Box ( STFReader stf )
155+ {
156+ stf . MustMatch ( "(" ) ;
157+ string item = stf . ReadString ( ) ;
158+ if ( item == ")" ) return ; // quietly return on ESD_Complex_Box()
159+ stf . StepBackOneItem ( ) ;
160+ float X = stf . ReadFloat ( STFReader . UNITS . None , null ) ;
161+ float Y = stf . ReadFloat ( STFReader . UNITS . None , null ) ;
162+ float Z = stf . ReadFloat ( STFReader . UNITS . None , null ) ;
163+ Rotation = new TWorldPosition ( X , Y , Z ) ;
164+ X = stf . ReadFloat ( STFReader . UNITS . None , null ) ;
165+ Y = stf . ReadFloat ( STFReader . UNITS . None , null ) ;
166+ Z = stf . ReadFloat ( STFReader . UNITS . None , null ) ;
167+ Translation = new TWorldPosition ( X , Y , Z ) ;
168+ X = stf . ReadFloat ( STFReader . UNITS . None , null ) ;
169+ Y = stf . ReadFloat ( STFReader . UNITS . None , null ) ;
170+ Z = stf . ReadFloat ( STFReader . UNITS . None , null ) ;
171+ Min = new TWorldPosition ( X , Y , Z ) ;
172+ X = stf . ReadFloat ( STFReader . UNITS . None , null ) ;
173+ Y = stf . ReadFloat ( STFReader . UNITS . None , null ) ;
174+ Z = stf . ReadFloat ( STFReader . UNITS . None , null ) ;
175+ Max = new TWorldPosition ( X , Y , Z ) ;
176+ // JP2indirt.sd has extra parameters
106177 stf . SkipRestOfBlock ( ) ;
107178 }
179+ public TWorldPosition Rotation ;
180+ public TWorldPosition Translation ;
108181 public TWorldPosition Min ;
109182 public TWorldPosition Max ;
110183 }
0 commit comments