diff --git a/GraphicsAPI/IGraphicsApi.cs b/GraphicsAPI/IGraphicsApi.cs
index 360616093..9c665fe4d 100644
--- a/GraphicsAPI/IGraphicsApi.cs
+++ b/GraphicsAPI/IGraphicsApi.cs
@@ -53,6 +53,8 @@ namespace ClassicalSharp.GraphicsAPI {
public abstract void SetFogMode( Fog fogMode );
public abstract void SetFogStart( float value );
+
+ public abstract bool FaceCulling { set; }
/// Sets the alpha test function that is used when alpha testing is enabled.
diff --git a/GraphicsAPI/OpenGLApi.cs b/GraphicsAPI/OpenGLApi.cs
index b648ad156..f3f9c11e8 100644
--- a/GraphicsAPI/OpenGLApi.cs
+++ b/GraphicsAPI/OpenGLApi.cs
@@ -111,6 +111,10 @@ namespace ClassicalSharp.GraphicsAPI {
GL.Fog( FogParameter.FogStart, value );
}
+ public override bool FaceCulling {
+ set { ToggleCap( EnableCap.CullFace, value ); }
+ }
+
#if TRACK_RESOURCES
Dictionary textures = new Dictionary();
diff --git a/MeshBuilders/ChunkMeshBuilderTex2Col4.cs b/MeshBuilders/ChunkMeshBuilderTex2Col4.cs
index 78721b9fb..cda3136a8 100644
--- a/MeshBuilders/ChunkMeshBuilderTex2Col4.cs
+++ b/MeshBuilders/ChunkMeshBuilderTex2Col4.cs
@@ -185,13 +185,13 @@ namespace ClassicalSharp {
}
DrawInfo1D info = drawInfoBuffer[drawInfoIndex];
- info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X, Y + blockHeight, Z, rec.U1, rec.V1, col );
info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X + count, Y + blockHeight, Z, rec.U2, rec.V1, col );
- info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X + count, Y + blockHeight, Z + 1, rec.U2, rec.V2, col );
-
- info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X + count, Y + blockHeight, Z + 1, rec.U2, rec.V2, col );
- info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X, Y + blockHeight, Z + 1, rec.U1, rec.V2, col );
info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X, Y + blockHeight, Z, rec.U1, rec.V1, col );
+ info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X, Y + blockHeight, Z + 1, rec.U1, rec.V2, col );
+
+ info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X, Y + blockHeight, Z + 1, rec.U1, rec.V2, col );
+ info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X + count, Y + blockHeight, Z + 1, rec.U2, rec.V2, col );
+ info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X + count, Y + blockHeight, Z, rec.U2, rec.V1, col );
}
protected override void DrawBottomFace( int count ) {
@@ -209,13 +209,13 @@ namespace ClassicalSharp {
}
DrawInfo1D info = drawInfoBuffer[drawInfoIndex];
- info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X, Y, Z, rec.U1, rec.V1, col );
- info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X + count, Y, Z, rec.U2, rec.V1, col );
- info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X + count, Y, Z + 1, rec.U2, rec.V2, col );
-
info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X + count, Y, Z + 1, rec.U2, rec.V2, col );
info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X, Y, Z + 1, rec.U1, rec.V2, col );
info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X, Y, Z, rec.U1, rec.V1, col );
+
+ info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X, Y, Z, rec.U1, rec.V1, col );
+ info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X + count, Y, Z, rec.U2, rec.V1, col );
+ info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X + count, Y, Z + 1, rec.U2, rec.V2, col );
}
protected override void DrawBackFace( int count ) {
@@ -236,13 +236,13 @@ namespace ClassicalSharp {
}
DrawInfo1D info = drawInfoBuffer[drawInfoIndex];
- info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X, Y, Z + 1, rec.U1, rec.V2, col );
+ info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X + count, Y + blockHeight, Z + 1, rec.U2, rec.V1, col );
info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X, Y + blockHeight, Z + 1, rec.U1, rec.V1, col );
- info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X + count, Y + blockHeight, Z + 1, rec.U2, rec.V1, col );
-
- info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X + count, Y + blockHeight, Z + 1, rec.U2, rec.V1, col );
- info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X + count, Y, Z + 1, rec.U2, rec.V2, col );
info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X, Y, Z + 1, rec.U1, rec.V2, col );
+
+ info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X, Y, Z + 1, rec.U1, rec.V2, col );
+ info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X + count, Y, Z + 1, rec.U2, rec.V2, col );
+ info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X + count, Y + blockHeight, Z + 1, rec.U2, rec.V1, col );
}
protected override void DrawFrontFace( int count ) {
@@ -263,13 +263,13 @@ namespace ClassicalSharp {
}
DrawInfo1D info = drawInfoBuffer[drawInfoIndex];
- info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X, Y, Z, rec.U2, rec.V2, col );
- info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X, Y + blockHeight, Z, rec.U2, rec.V1, col );
- info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X + count, Y + blockHeight, Z, rec.U1, rec.V1, col );
-
- info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X + count, Y + blockHeight, Z, rec.U1, rec.V1, col );
info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X + count, Y, Z, rec.U1, rec.V2, col );
info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X, Y, Z, rec.U2, rec.V2, col );
+ info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X, Y + blockHeight, Z, rec.U2, rec.V1, col );
+
+ info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X, Y + blockHeight, Z, rec.U2, rec.V1, col );
+ info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X + count, Y + blockHeight, Z, rec.U1, rec.V1, col );
+ info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X + count, Y, Z, rec.U1, rec.V2, col );
}
protected override void DrawLeftFace( int count ) {
@@ -290,13 +290,13 @@ namespace ClassicalSharp {
}
DrawInfo1D info = drawInfoBuffer[drawInfoIndex];
- info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X, Y, Z, rec.U1, rec.V2, col );
+ info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X, Y + blockHeight, Z + count, rec.U2, rec.V1, col );
info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X, Y + blockHeight, Z, rec.U1, rec.V1, col );
- info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X, Y + blockHeight, Z + count, rec.U2, rec.V1, col );
-
- info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X, Y + blockHeight, Z + count, rec.U2, rec.V1, col );
- info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X, Y, Z + count, rec.U2, rec.V2, col );
info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X, Y, Z, rec.U1, rec.V2, col );
+
+ info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X, Y, Z, rec.U1, rec.V2, col );
+ info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X, Y, Z + count, rec.U2, rec.V2, col );
+ info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X, Y + blockHeight, Z + count, rec.U2, rec.V1, col );
}
protected override void DrawRightFace( int count ) {
@@ -317,13 +317,13 @@ namespace ClassicalSharp {
}
DrawInfo1D info = drawInfoBuffer[drawInfoIndex];
- info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X + 1, Y, Z, rec.U2, rec.V2, col );
info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X + 1, Y + blockHeight, Z, rec.U2, rec.V1, col );
info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X + 1, Y + blockHeight, Z + count, rec.U1, rec.V1, col );
+ info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X + 1, Y, Z + count, rec.U1, rec.V2, col );
- info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X + 1, Y + blockHeight, Z + count, rec.U1, rec.V1, col );
info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X + 1, Y, Z + count, rec.U1, rec.V2, col );
info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X + 1, Y, Z, rec.U2, rec.V2, col );
+ info.vertices[info.index++] = new VertexPos3fTex2fCol4b( X + 1, Y + blockHeight, Z, rec.U2, rec.V1, col );
}
protected override void DrawSprite( int count ) {
diff --git a/Rendering/MapRenderer.cs b/Rendering/MapRenderer.cs
index 48ff3ca5e..fb7c96248 100644
--- a/Rendering/MapRenderer.cs
+++ b/Rendering/MapRenderer.cs
@@ -228,12 +228,14 @@ namespace ClassicalSharp {
builder.BeginRender();
Graphics.Texturing = true;
Graphics.AlphaTest = true;
+ Graphics.FaceCulling = true;
for( int batch = 0; batch < _1Dcount; batch++ ) {
Graphics.Bind2DTexture( Window.TerrainAtlas1DTexIds[batch] );
RenderBatch( batch );
}
Graphics.AlphaTest = false;
Graphics.Texturing = false;
+ Graphics.FaceCulling = false;
builder.EndRender();
Window.MapEnvRenderer.RenderMapSides( deltaTime );
Window.MapEnvRenderer.RenderMapEdges( deltaTime );
@@ -243,6 +245,7 @@ namespace ClassicalSharp {
Graphics.AlphaTest = false;
Graphics.Texturing = false;
Graphics.AlphaBlending = false;
+ Graphics.FaceCulling = true;
// First fill depth buffer
Graphics.DepthTestFunc( DepthFunc.LessEqual );
@@ -263,6 +266,7 @@ namespace ClassicalSharp {
Graphics.AlphaTest = false;
Graphics.AlphaBlending = false;
Graphics.Texturing = false;
+ Graphics.FaceCulling = false;
builder.EndRender();
}