@@ -53,7 +53,6 @@ namespace ORTS.TrackViewer
5353 public class TrackViewer : Orts . Viewer3D . Processes . Game
5454 {
5555 #region Public members
56- public SceneViewer SceneViewer { get ; private set ; }
5756 private static RenderTarget2D DummyRenderTarget ;
5857 public bool IsTrackViewerWindowActive { get ; private set ; }
5958
@@ -132,6 +131,9 @@ public class TrackViewer : Orts.Viewer3D.Processes.Game
132131
133132 /// <summary>The fontmanager that we use to draw strings</summary>
134133 public FontManager fontManager ;
134+
135+ public SceneView SceneView ;
136+
135137 /// <summary>The command-line arguments</summary>
136138 private string [ ] commandLineArgs ;
137139 #endregion
@@ -173,8 +175,8 @@ public TrackViewer(string[] args) : base(new ORTS.Settings.UserSettings(new[] {
173175 LanguageManager = new LanguageManager ( ) ;
174176 LanguageManager . LoadLanguage ( ) ; // need this before all menus and stuff are initialized.
175177
176- this . Activated += ActivateTrackViewer ;
177- this . Deactivated += DeactivateTrackViewer ;
178+ Activated += ActivateTrackViewer ;
179+ Deactivated += DeactivateTrackViewer ;
178180
179181 PushState ( new GameStateStandBy ( ) ) ;
180182 }
@@ -236,9 +238,48 @@ protected override void Initialize()
236238 base . Initialize ( ) ;
237239 }
238240
239- public void InitializeSceneViewer ( string [ ] args )
241+ public void InitializeSceneView ( string [ ] args )
240242 {
241- SceneViewer = SceneViewer ?? new SceneViewer ( this , args ) ;
243+ // Inject the secondary window into RunActivity
244+ SwapChainWindow = GameWindow . Create ( this ,
245+ GraphicsDevice . PresentationParameters . BackBufferWidth ,
246+ GraphicsDevice . PresentationParameters . BackBufferHeight ) ;
247+
248+ RenderFrame . FinalRenderTarget = new SwapChainRenderTarget ( GraphicsDevice ,
249+ SwapChainWindow . Handle ,
250+ GraphicsDevice . PresentationParameters . BackBufferWidth ,
251+ GraphicsDevice . PresentationParameters . BackBufferHeight ,
252+ false ,
253+ GraphicsDevice . PresentationParameters . BackBufferFormat ,
254+ GraphicsDevice . PresentationParameters . DepthStencilFormat ,
255+ 1 ,
256+ RenderTargetUsage . PlatformContents ,
257+ PresentInterval . Two ) ;
258+
259+ SceneView = new SceneView ( SwapChainWindow . Handle ) ;
260+
261+ // The primary window activation events should not affect RunActivity
262+ Activated -= ActivateRunActivity ;
263+ Deactivated -= DeactivateRunActivity ;
264+
265+ /// A workaround for a MonoGame bug where the <see cref="Microsoft.Xna.Framework.Input.Keyboard.GetState()" />
266+ /// doesn't return the valid keyboard state. Needs to be enabled via reflection in a private method.
267+ var keyboardSetActive = typeof ( Microsoft . Xna . Framework . Input . Keyboard )
268+ . GetMethod ( "SetActive" , System . Reflection . BindingFlags . NonPublic | System . Reflection . BindingFlags . Static ) ;
269+
270+ // The secondary window activation events should affect RunActivity
271+ SceneView . Activated += ActivateRunActivity ;
272+ SceneView . Activated += new System . EventHandler ( ( sender , e ) => keyboardSetActive . Invoke ( null , new object [ ] { true } ) ) ;
273+ SceneView . Deactivated += DeactivateRunActivity ;
274+ SceneView . Deactivated += new System . EventHandler ( ( sender , e ) => keyboardSetActive . Invoke ( null , new object [ ] { false } ) ) ;
275+
276+ ReplaceState ( new GameStateRunActivity ( new [ ] { "-start" , "-viewer" , CurrentRoute . Path + "\\ dummy\\ .pat" , "" , "10:00" , "1" , "0" } ) ) ;
277+ }
278+
279+ public void ShowSceneView ( )
280+ {
281+ SceneView . Show ( ) ;
282+ SceneView . Activate ( ) ;
242283 }
243284
244285 /// <summary>
@@ -324,7 +365,11 @@ private void DrawLoadingMessage(string message)
324365 /// <param name="gameTime">Provides a snapshot of timing values.</param>
325366 protected override void Update ( GameTime gameTime )
326367 {
327- SceneViewer ? . Update ( gameTime ) ;
368+ if ( RenderProcess ? . Viewer != null && SceneView != null )
369+ {
370+ SceneView . Viewer = SceneView . Viewer ?? RenderProcess . Viewer ;
371+ SceneView . Update ( gameTime ) ;
372+ }
328373
329374 if ( ! this . IsTrackViewerWindowActive )
330375 {
0 commit comments