@@ -68,11 +68,8 @@ public class MSTSSkyDrawer
6868
6969 public Orts . Viewer3D . SkyViewer . Date date ;
7070
71- // Size of the sun- and moon-position lookup table arrays.
72- // Must be an integral divisor of 1440 (which is the number of minutes in a day).
73- private int maxSteps = 72 ;
74- private double mstsskyoldClockTime ;
75- private int step1 , step2 ;
71+ private SkySteps skySteps = new SkySteps ( ) ;
72+
7673 // Phase of the moon
7774 public int mstsskymoonPhase ;
7875 // Wind speed and direction
@@ -128,11 +125,11 @@ public void PrepareFrame(RenderFrame frame, ElapsedTime elapsedTime)
128125 {
129126 // First time around, initialize the following items:
130127 mstsskyworldLoc = new WorldLatLon ( ) ;
131- mstsskyoldClockTime = MSTSSkyViewer . Simulator . ClockTime % 86400 ;
132- while ( mstsskyoldClockTime < 0 ) mstsskyoldClockTime += 86400 ;
133- step1 = step2 = ( int ) ( mstsskyoldClockTime / 1200 ) ;
134- step2 = step2 < maxSteps - 1 ? step2 + 1 : 0 ; // limit to max. steps in case activity starts near midnight
135- // Get the current latitude and longitude coordinates
128+ skySteps . OldClockTime = MSTSSkyViewer . Simulator . ClockTime % 86400 ;
129+ while ( skySteps . OldClockTime < 0 ) skySteps . OldClockTime += 86400 ;
130+ skySteps . Step1 = skySteps . Step2 = ( int ) ( skySteps . OldClockTime / 1200 ) ;
131+ skySteps . Step2 = skySteps . Step2 < skySteps . MaxSteps - 1 ? skySteps . Step2 + 1 : 0 ; // limit to max. steps in case activity starts near midnight
132+ // Get the current latitude and longitude coordinates
136133 mstsskyworldLoc . ConvertWTC ( MSTSSkyViewer . Camera . TileX , MSTSSkyViewer . Camera . TileZ , MSTSSkyViewer . Camera . Location , ref mstsskylatitude , ref mstsskylongitude ) ;
137134 if ( mstsskyseasonType != ( int ) MSTSSkyViewer . Simulator . Season )
138135 {
@@ -144,10 +141,10 @@ public void PrepareFrame(RenderFrame frame, ElapsedTime elapsedTime)
144141 date . year = 2017 ;
145142 }
146143 // Fill in the sun- and moon-position lookup tables
147- for ( int i = 0 ; i < maxSteps ; i ++ )
144+ for ( int i = 0 ; i < skySteps . MaxSteps ; i ++ )
148145 {
149- mstsskysolarPosArray [ i ] = SunMoonPos . SolarAngle ( mstsskylatitude , mstsskylongitude , ( ( float ) i / maxSteps ) , date ) ;
150- mstsskylunarPosArray [ i ] = SunMoonPos . LunarAngle ( mstsskylatitude , mstsskylongitude , ( ( float ) i / maxSteps ) , date ) ;
146+ mstsskysolarPosArray [ i ] = SunMoonPos . SolarAngle ( mstsskylatitude , mstsskylongitude , ( ( float ) i / skySteps . MaxSteps ) , date ) ;
147+ mstsskylunarPosArray [ i ] = SunMoonPos . LunarAngle ( mstsskylatitude , mstsskylongitude , ( ( float ) i / skySteps . MaxSteps ) , date ) ;
151148 }
152149 // Phase of the moon is generated at random
153150 mstsskymoonPhase = Viewer . Random . Next ( 8 ) ;
@@ -209,58 +206,14 @@ public void PrepareFrame(RenderFrame frame, ElapsedTime elapsedTime)
209206 }
210207 }
211208
212- ////////////////////////////////////////////////////////////////////
213-
214- // Current solar and lunar position are calculated by interpolation in the lookup arrays.
215- // Using the Lerp() function, so need to calculate the in-between differential
216- float diff = ( float ) ( MSTSSkyViewer . Simulator . ClockTime - mstsskyoldClockTime ) / 1200 ;
217- // The rest of this increments/decrements the array indices and checks for overshoot/undershoot.
218- if ( MSTSSkyViewer . Simulator . ClockTime >= ( mstsskyoldClockTime + 1200 ) ) // Plus key, or normal forward in time
219- {
220- step1 ++ ;
221- step2 ++ ;
222- mstsskyoldClockTime = MSTSSkyViewer . Simulator . ClockTime ;
223- diff = 0 ;
224- if ( step2 >= maxSteps ) // Midnight.
225- {
226- step2 = 0 ;
227- }
228- if ( step1 >= maxSteps ) // Midnight.
229- {
230- step1 = 0 ;
231- }
232- }
233- if ( MSTSSkyViewer . Simulator . ClockTime <= ( mstsskyoldClockTime - 1200 ) ) // Minus key
234- {
235- step1 -- ;
236- step2 -- ;
237- mstsskyoldClockTime = MSTSSkyViewer . Simulator . ClockTime ;
238- diff = 0 ;
239- if ( step1 < 0 ) // Midnight.
240- {
241- step1 = maxSteps - 1 ;
242- }
243- if ( step2 < 0 ) // Midnight.
244- {
245- step2 = maxSteps - 1 ;
246- }
247- }
248-
249-
250- mstsskysolarDirection . X = MathHelper . Lerp ( mstsskysolarPosArray [ step1 ] . X , mstsskysolarPosArray [ step2 ] . X , diff ) ;
251- mstsskysolarDirection . Y = MathHelper . Lerp ( mstsskysolarPosArray [ step1 ] . Y , mstsskysolarPosArray [ step2 ] . Y , diff ) ;
252- mstsskysolarDirection . Z = MathHelper . Lerp ( mstsskysolarPosArray [ step1 ] . Z , mstsskysolarPosArray [ step2 ] . Z , diff ) ;
253- mstsskylunarDirection . X = MathHelper . Lerp ( mstsskylunarPosArray [ step1 ] . X , mstsskylunarPosArray [ step2 ] . X , diff ) ;
254- mstsskylunarDirection . Y = MathHelper . Lerp ( mstsskylunarPosArray [ step1 ] . Y , mstsskylunarPosArray [ step2 ] . Y , diff ) ;
255- mstsskylunarDirection . Z = MathHelper . Lerp ( mstsskylunarPosArray [ step1 ] . Z , mstsskylunarPosArray [ step2 ] . Z , diff ) ;
209+ skySteps . SetSunAndMoonDirection ( ref mstsskysolarDirection , ref mstsskylunarDirection , ref mstsskysolarPosArray , ref mstsskylunarPosArray ,
210+ MSTSSkyViewer . Simulator . ClockTime ) ;
256211
257212 frame . AddPrimitive ( MSTSSkyMaterial , MSTSSkyMesh , RenderPrimitiveGroup . Sky , ref XNASkyWorldLocation ) ;
258213 }
259214
260215 public void LoadPrep ( )
261216 {
262-
263-
264217 mstsskyworldLoc = new WorldLatLon ( ) ;
265218 // Get the current latitude and longitude coordinates
266219 mstsskyworldLoc . ConvertWTC ( MSTSSkyViewer . Camera . TileX , MSTSSkyViewer . Camera . TileZ , MSTSSkyViewer . Camera . Location , ref mstsskylatitude , ref mstsskylongitude ) ;
@@ -274,7 +227,6 @@ public void LoadPrep()
274227 mstsskyworldLoc = null ;
275228 mstsskylatitude = 0 ;
276229 mstsskylongitude = 0 ;
277-
278230 }
279231
280232 [ CallOnThread ( "Loader" ) ]
0 commit comments