From 6dbce98a67afd0ba8c69aac5f8da8795b90dd45f Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Sat, 9 Jan 2016 21:45:25 +1100 Subject: [PATCH] Lazily allocate weather heightmap, also fix double texture warning screne not restoring the cursor (Thanks Zingan). --- ClassicalSharp/2D/Screens/WarningScreen.cs | 8 +++++--- ClassicalSharp/Game/Game.cs | 7 ++++--- ClassicalSharp/Network/NetworkProcessor.Original.cs | 2 +- ClassicalSharp/Rendering/WeatherRenderer.cs | 7 +++++-- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/ClassicalSharp/2D/Screens/WarningScreen.cs b/ClassicalSharp/2D/Screens/WarningScreen.cs index 561c4929f..5aff387bd 100644 --- a/ClassicalSharp/2D/Screens/WarningScreen.cs +++ b/ClassicalSharp/2D/Screens/WarningScreen.cs @@ -17,7 +17,7 @@ namespace ClassicalSharp { this.body = body; } internal Screen lastScreen; - internal bool lastCursorVisible; + internal bool wasCursorVisible; string title; string[] body; @@ -92,8 +92,10 @@ namespace ClassicalSharp { game.activeScreen = game.WarningScreens[0]; } else { game.activeScreen = lastScreen; - if( game.CursorVisible != lastCursorVisible ) - game.CursorVisible = lastCursorVisible; + if( game.CursorVisible != wasCursorVisible ) + game.CursorVisible = wasCursorVisible; + if( game.activeScreen == null && game.CursorVisible ) + game.CursorVisible = false; } } diff --git a/ClassicalSharp/Game/Game.cs b/ClassicalSharp/Game/Game.cs index 99ad5db96..9e93f02ae 100644 --- a/ClassicalSharp/Game/Game.cs +++ b/ClassicalSharp/Game/Game.cs @@ -197,6 +197,7 @@ namespace ClassicalSharp { Culling.CalcFrustumEquations( ref Projection, ref modelView ); bool visible = activeScreen == null || !activeScreen.BlocksWorld; + if( Map.IsNotLoaded ) visible = false; if( visible ) { AxisLinesRenderer.Render( e.Time ); Players.RenderModels( Graphics, e.Time, t ); @@ -352,10 +353,10 @@ namespace ClassicalSharp { screen.lastScreen = activeScreen; activeScreen = screen; - screen.lastCursorVisible = CursorVisible; - if( !CursorVisible) CursorVisible = true; + screen.wasCursorVisible = CursorVisible; + if( !CursorVisible ) CursorVisible = true; } else { - screen.lastCursorVisible = WarningScreens[0].lastCursorVisible; + screen.wasCursorVisible = WarningScreens[0].wasCursorVisible; } WarningScreens.Add( screen ); screen.Init(); diff --git a/ClassicalSharp/Network/NetworkProcessor.Original.cs b/ClassicalSharp/Network/NetworkProcessor.Original.cs index 0a8a75b7d..ddaa67d74 100644 --- a/ClassicalSharp/Network/NetworkProcessor.Original.cs +++ b/ClassicalSharp/Network/NetworkProcessor.Original.cs @@ -147,7 +147,7 @@ namespace ClassicalSharp { void HandleLevelFinalise() { game.SetNewScreen( null ); game.activeScreen = prevScreen; - if( prevScreen != null ) + if( prevScreen != null && prevCursorVisible != game.CursorVisible ) game.CursorVisible = prevCursorVisible; prevScreen = null; diff --git a/ClassicalSharp/Rendering/WeatherRenderer.cs b/ClassicalSharp/Rendering/WeatherRenderer.cs index a3aaea52b..aae3befe5 100644 --- a/ClassicalSharp/Rendering/WeatherRenderer.cs +++ b/ClassicalSharp/Rendering/WeatherRenderer.cs @@ -29,6 +29,7 @@ namespace ClassicalSharp { public void Render( double deltaTime ) { Weather weather = map.Weather; if( weather == Weather.Sunny ) return; + if( heightmap == null ) InitHeightmap(); graphics.Texturing = true; graphics.BindTexture( weather == Weather.Rainy ? game.RainTexId : game.SnowTexId ); @@ -102,7 +103,9 @@ namespace ClassicalSharp { width = map.Width; maxY = map.Height - 1; oneY = length * width; - + } + + void InitHeightmap() { heightmap = new short[map.Width * map.Length]; for( int i = 0; i < heightmap.Length; i++ ) { heightmap[i] = short.MaxValue; @@ -148,7 +151,7 @@ namespace ClassicalSharp { } internal void UpdateHeight( int x, int y, int z, byte oldBlock, byte newBlock ) { - if( game.Map.IsNotLoaded ) return; + if( game.Map.IsNotLoaded || heightmap == null ) return; bool didBlock = BlocksRain( oldBlock ); bool nowBlocks = BlocksRain( newBlock ); if( didBlock == nowBlocks ) return;