diff --git a/ClassicalSharp/GraphicsAPI/Direct3D9Api.cs b/ClassicalSharp/GraphicsAPI/Direct3D9Api.cs
index 7941dad44..c393c030f 100644
--- a/ClassicalSharp/GraphicsAPI/Direct3D9Api.cs
+++ b/ClassicalSharp/GraphicsAPI/Direct3D9Api.cs
@@ -131,8 +131,6 @@ namespace ClassicalSharp.GraphicsAPI {
}
public override void SetFogStart( float value ) {
- if( value == fogStart ) return;
- fogStart = value;
device.SetRenderState( RenderState.FogStart, value );
}
diff --git a/ClassicalSharp/GraphicsAPI/OpenGLApi.cs b/ClassicalSharp/GraphicsAPI/OpenGLApi.cs
index 2fc04e668..2aba75875 100644
--- a/ClassicalSharp/GraphicsAPI/OpenGLApi.cs
+++ b/ClassicalSharp/GraphicsAPI/OpenGLApi.cs
@@ -81,13 +81,13 @@ namespace ClassicalSharp.GraphicsAPI {
}
}
- float lastFogStart = -1, lastFogEnd = -1, lastFogDensity = -1;
+ float lastFogEnd = -1, lastFogDensity = -1;
public override void SetFogDensity( float value ) {
FogParam( FogParameter.FogDensity, value, ref lastFogDensity );
}
public override void SetFogStart( float value ) {
- FogParam( FogParameter.FogStart, value, ref lastFogStart );
+ GL.Fogf( FogParameter.FogStart, value );
}
public override void SetFogEnd( float value ) {
@@ -95,10 +95,9 @@ namespace ClassicalSharp.GraphicsAPI {
}
static void FogParam( FogParameter param, float value, ref float last ) {
- if( value != last ) {
- GL.Fogf( param, value );
- last = value;
- }
+ if( value == last ) return;
+ GL.Fogf( param, value );
+ last = value;
}
Fog lastFogMode = (Fog)999;
diff --git a/ClassicalSharp/Math/BoundingBox.cs b/ClassicalSharp/Math/BoundingBox.cs
index b20680815..08d077a08 100644
--- a/ClassicalSharp/Math/BoundingBox.cs
+++ b/ClassicalSharp/Math/BoundingBox.cs
@@ -56,6 +56,13 @@ namespace ClassicalSharp {
other.Max.X <= Max.X && other.Max.Y <= Max.Y && other.Max.Z <= Max.Z;
}
+ /// Determines whether this bounding box entirely contains
+ /// the coordinates on all axes.
+ public bool Contains( Vector3 P ) {
+ return P.X >= Min.X && P.Y >= Min.Y && P.Z >= Min.Z &&
+ P.X <= Max.X && P.Y <= Max.Y && P.Z <= Max.Z;
+ }
+
/// Determines whether this bounding box intersects
/// the given bounding box on the X axis.
public bool XIntersects( BoundingBox box ) {
diff --git a/ClassicalSharp/Rendering/StandardEnvRenderer.cs b/ClassicalSharp/Rendering/StandardEnvRenderer.cs
index 37a3a49fb..adaaa285f 100644
--- a/ClassicalSharp/Rendering/StandardEnvRenderer.cs
+++ b/ClassicalSharp/Rendering/StandardEnvRenderer.cs
@@ -37,14 +37,14 @@ namespace ClassicalSharp.Renderers {
}
RenderClouds( deltaTime );
- ResetFog();
+ UpdateFog();
}
protected override void EnvVariableChanged( object sender, EnvVarEventArgs e ) {
if( e.Var == EnvVar.SkyColour ) {
ResetSky();
} else if( e.Var == EnvVar.FogColour ) {
- ResetFog();
+ UpdateFog();
} else if( e.Var == EnvVar.CloudsColour ) {
ResetClouds();
} else if( e.Var == EnvVar.CloudsLevel ) {
@@ -55,6 +55,7 @@ namespace ClassicalSharp.Renderers {
public override void Init( Game game ) {
base.Init( game );
+ graphics.SetFogStart( 0 );
graphics.Fog = true;
ResetAllEnv( null, null );
game.Events.ViewDistanceChanged += ResetAllEnv;
@@ -73,7 +74,7 @@ namespace ClassicalSharp.Renderers {
}
void ResetAllEnv( object sender, EventArgs e ) {
- ResetFog();
+ UpdateFog();
ResetSky();
ResetClouds();
}
@@ -116,30 +117,27 @@ namespace ClassicalSharp.Renderers {
return blend;
}
- void ResetFog() {
+ void UpdateFog() {
if( map.IsNotLoaded ) return;
FastColour adjFogCol = FastColour.White;
BlockInfo info = game.BlockInfo;
- BoundingBox pBounds = game.LocalPlayer.CollisionBounds;
- Vector3I headCoords = Vector3I.Floor( game.LocalPlayer.EyePosition );
- Vector3 pos = (Vector3)headCoords;
- byte headBlock = game.World.SafeGetBlock( headCoords );
- BoundingBox blockBB = new BoundingBox( pos + game.BlockInfo.MinBB[headBlock],
- pos + game.BlockInfo.MaxBB[headBlock] );
- BoundingBox localBB = game.LocalPlayer.CollisionBounds;
- bool intersecting = blockBB.Intersects( localBB );
+ Vector3 pos = game.CurrentCameraPos;
+ Vector3I coords = Vector3I.Floor( pos );
+ byte block = game.World.SafeGetBlock( coords );
+ BoundingBox blockBB = new BoundingBox(
+ (Vector3)coords + info.MinBB[block],
+ (Vector3)coords + info.MaxBB[block] );
- if( intersecting && info.FogDensity[headBlock] != 0 ) {
+ if( blockBB.Contains( pos ) && info.FogDensity[block] != 0 ) {
graphics.SetFogMode( Fog.Exp );
- graphics.SetFogDensity( info.FogDensity[headBlock] );
- adjFogCol = info.FogColour[headBlock];
+ graphics.SetFogDensity( info.FogDensity[block] );
+ adjFogCol = info.FogColour[block];
} else {
// Blend fog and sky together
float blend = (float)BlendFactor( game.ViewDistance );
adjFogCol = FastColour.Lerp( map.FogCol, map.SkyCol, blend );
graphics.SetFogMode( Fog.Linear );
- graphics.SetFogStart( 0 );
graphics.SetFogEnd( game.ViewDistance );
}
graphics.ClearColour( adjFogCol );
@@ -173,7 +171,7 @@ namespace ClassicalSharp.Renderers {
extent = Utils.AdjViewDist( extent );
int x1 = -extent, x2 = map.Width + extent;
int z1 = -extent, z2 = map.Length + extent;
- skyVertices = Utils.CountVertices( x2 - x1, z2 - z1, axisSize );
+ skyVertices = Utils.CountVertices( x2 - x1, z2 - z1, axisSize );
VertexP3fC4b[] vertices = new VertexP3fC4b[skyVertices];
int height = Math.Max( map.Height + 2 + 6, map.CloudHeight + 6);