From 5f05ed73e40321d76a59afdf091ff1b2827106ef Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Wed, 14 Jan 2015 13:48:55 +1100 Subject: [PATCH] Use face culling. (Breaks sprites though) --- GraphicsAPI/IGraphicsApi.cs | 2 + GraphicsAPI/OpenGLApi.cs | 4 ++ MeshBuilders/ChunkMeshBuilderTex2Col4.cs | 52 ++++++++++++------------ Rendering/MapRenderer.cs | 4 ++ 4 files changed, 36 insertions(+), 26 deletions(-) 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(); }