diff --git a/ClassicalSharp/GraphicsAPI/IGraphicsApi.cs b/ClassicalSharp/GraphicsAPI/IGraphicsApi.cs index 0101a0cf2..d5a1b0489 100644 --- a/ClassicalSharp/GraphicsAPI/IGraphicsApi.cs +++ b/ClassicalSharp/GraphicsAPI/IGraphicsApi.cs @@ -128,7 +128,9 @@ namespace ClassicalSharp.GraphicsAPI { public abstract void BeginIndexedVbBatch(); - public abstract void BindIndexedVb( int vb, int ib ); + public abstract void BindVb( int vb ); + + public abstract void BindIb( int ib ); public abstract void DrawIndexedVb( DrawMode mode, int indicesCount, int startVertex, int startIndex ); @@ -140,10 +142,7 @@ namespace ClassicalSharp.GraphicsAPI { public abstract void LoadMatrix( ref Matrix4 matrix ); - public virtual void LoadIdentityMatrix() { - Matrix4 identity = Matrix4.Identity; - LoadMatrix( ref identity ); - } + public abstract void LoadIdentityMatrix(); public abstract void MultiplyMatrix( ref Matrix4 matrix ); @@ -154,8 +153,7 @@ namespace ClassicalSharp.GraphicsAPI { public abstract void TakeScreenshot( string output, Size size ); - public virtual void PrintApiSpecificInfo() { - } + public abstract void PrintApiSpecificInfo(); public abstract void BeginFrame( Game game ); diff --git a/ClassicalSharp/GraphicsAPI/OpenGLApi.cs b/ClassicalSharp/GraphicsAPI/OpenGLApi.cs index 4d7eddefe..5b67bcd94 100644 --- a/ClassicalSharp/GraphicsAPI/OpenGLApi.cs +++ b/ClassicalSharp/GraphicsAPI/OpenGLApi.cs @@ -296,8 +296,11 @@ namespace ClassicalSharp.GraphicsAPI { GL.DrawArrays( modeMappings[(int)mode], startVertex, verticesCount ); } - public override void BindIndexedVb( int vb, int ib ) { + public override void BindVb( int vb ) { GL.BindBufferARB( BufferTarget.ArrayBuffer, vb ); + } + + public override void BindIb( int ib ) { GL.BindBufferARB( BufferTarget.ElementArrayBuffer, ib ); } diff --git a/ClassicalSharp/Map/ChunkMeshBuilder.cs b/ClassicalSharp/Map/ChunkMeshBuilder.cs index cce2d3e70..76bf9319a 100644 --- a/ClassicalSharp/Map/ChunkMeshBuilder.cs +++ b/ClassicalSharp/Map/ChunkMeshBuilder.cs @@ -334,8 +334,7 @@ namespace ClassicalSharp { public struct ChunkPartInfo { - public int VbId, IbId; - public int IndicesCount; + public int VbId, IndicesCount; public int leftIndex, rightIndex, frontIndex, backIndex, bottomIndex, topIndex; public ushort leftCount, rightCount, frontCount, diff --git a/ClassicalSharp/Map/ChunkMeshBuilderTex2Col4.cs b/ClassicalSharp/Map/ChunkMeshBuilderTex2Col4.cs index ae4183d45..044b08192 100644 --- a/ClassicalSharp/Map/ChunkMeshBuilderTex2Col4.cs +++ b/ClassicalSharp/Map/ChunkMeshBuilderTex2Col4.cs @@ -34,7 +34,6 @@ namespace ClassicalSharp { class DrawInfo { public VertexPos3fTex2fCol4b[] vertices; - public ushort[] indices; public int vCount, iCount; public DrawInfoFaceData vIndex; public DrawInfoFaceData Count; @@ -45,8 +44,6 @@ namespace ClassicalSharp { if( vertices == null || vCount > vertices.Length ) { vertices = new VertexPos3fTex2fCol4b[vCount]; - indices = new ushort[iCount]; - MakeIndices(); } vIndex.left = spriteCount / 6 * 4; vIndex.right = vIndex.left + Count.left / 6 * 4; @@ -56,20 +53,6 @@ namespace ClassicalSharp { vIndex.top = vIndex.bottom + Count.bottom / 6 * 4; } - void MakeIndices() { - int element = 0; - for( int i = 0; i < iCount; ) { - indices[i++] = (ushort)( element + 0 ); - indices[i++] = (ushort)( element + 1 ); - indices[i++] = (ushort)( element + 2 ); - - indices[i++] = (ushort)( element + 2 ); - indices[i++] = (ushort)( element + 3 ); - indices[i++] = (ushort)( element + 0 ); - element += 4; - } - } - public void ResetState() { vCount = iCount = 0; spriteIndex = spriteCount = 0; @@ -147,7 +130,6 @@ namespace ClassicalSharp { ChunkPartInfo info; info.VbId = Graphics.InitVb( part.vertices, VertexFormat.Pos3fTex2fCol4b, part.vCount ); - info.IbId = Graphics.InitIb( part.indices, part.iCount ); info.IndicesCount = part.iCount; info.leftCount = (ushort)part.Count.left; info.rightCount = (ushort)part.Count.right; info.frontCount = (ushort)part.Count.front; info.backCount = (ushort)part.Count.back; diff --git a/ClassicalSharp/Rendering/MapRenderer.Rendering.cs b/ClassicalSharp/Rendering/MapRenderer.Rendering.cs index 8d90da03b..24168edab 100644 --- a/ClassicalSharp/Rendering/MapRenderer.Rendering.cs +++ b/ClassicalSharp/Rendering/MapRenderer.Rendering.cs @@ -50,7 +50,7 @@ namespace ClassicalSharp { } void DrawPart( ChunkInfo info, ref ChunkPartInfo part ) { - api.BindIndexedVb( part.VbId, part.IbId ); + api.BindVb( part.VbId ); bool drawLeft = info.DrawLeft && part.leftCount > 0; bool drawRight = info.DrawRight && part.rightCount > 0; bool drawBottom = info.DrawBottom && part.bottomCount > 0; @@ -83,7 +83,7 @@ namespace ClassicalSharp { if( part.IndicesCount > maxIndices ) { int part1Count = maxIndices - part.bottomIndex; api.DrawIndexedVb( mode, part1Count, 0, part.bottomIndex ); - api.DrawIndexedVb( mode, part.bottomCount + part.topCount - part1Count, maxVertex, part.bottomIndex ); + api.DrawIndexedVb( mode, part.bottomCount + part.topCount - part1Count, maxVertex, 0 ); } else { api.DrawIndexedVb( mode, part.bottomCount + part.topCount, 0, part.bottomIndex ); } @@ -93,7 +93,7 @@ namespace ClassicalSharp { if( part.IndicesCount > maxIndices && ( part1Count = maxIndices - part.bottomIndex ) < part.bottomCount ) { api.DrawIndexedVb( mode, part1Count, 0, part.bottomIndex ); - api.DrawIndexedVb( mode, part.bottomCount - part1Count, maxVertex, part.bottomIndex ); + api.DrawIndexedVb( mode, part.bottomCount - part1Count, maxVertex, 0 ); } else { api.DrawIndexedVb( mode, part.bottomCount, 0, part.bottomIndex ); } @@ -102,7 +102,7 @@ namespace ClassicalSharp { if( part.IndicesCount > maxIndices && ( part1Count = maxIndices - part.topIndex ) < part.topCount ) { api.DrawIndexedVb( mode, part1Count, 0, part.topIndex ); - api.DrawIndexedVb( mode, part.topCount - part1Count, maxVertex, part.topIndex ); + api.DrawIndexedVb( mode, part.topCount - part1Count, maxVertex, 0 ); } else { api.DrawIndexedVb( mode, part.topCount, 0, part.topIndex ); } diff --git a/ClassicalSharp/Rendering/MapRenderer.cs b/ClassicalSharp/Rendering/MapRenderer.cs index c305be494..c214346b5 100644 --- a/ClassicalSharp/Rendering/MapRenderer.cs +++ b/ClassicalSharp/Rendering/MapRenderer.cs @@ -56,6 +56,7 @@ namespace ClassicalSharp { game.OnNewMapLoaded -= OnNewMapLoaded; game.EnvVariableChanged -= EnvVariableChanged; builder.Dispose(); + api.DeleteIb( chunkIb ); } public void Refresh() { @@ -123,7 +124,6 @@ namespace ClassicalSharp { for( int i = 0; i < parts.Length; i++ ) { api.DeleteVb( parts[i].VbId ); - api.DeleteIb( parts[i].IbId ); } parts = null; } @@ -188,11 +188,15 @@ namespace ClassicalSharp { public void Render( double deltaTime ) { if( chunks == null ) return; UpdateSortOrder(); - UpdateChunks(); + UpdateChunks(); + if( chunkIb == -1 ) + MakeIndices(); + api.BindIb( chunkIb ); RenderNormal(); game.MapEnvRenderer.RenderMapSides( deltaTime ); game.MapEnvRenderer.RenderMapEdges( deltaTime ); + api.BindIb( chunkIb ); RenderTranslucent(); } @@ -257,7 +261,7 @@ namespace ClassicalSharp { // Render solid and fully transparent to fill depth buffer. // These blocks are treated as having an alpha value of either none or full. - void RenderNormal() { + void RenderNormal() { int[] texIds = game.TerrainAtlas1D.TexIds; api.BeginIndexedVbBatch(); api.Texturing = true; @@ -272,11 +276,28 @@ namespace ClassicalSharp { api.EndIndexedVbBatch(); } + int chunkIb = -1; + void MakeIndices() { + int element = 0; + ushort[] indices = new ushort[maxIndices]; + for( int i = 0; i < indices.Length; ) { + indices[i++] = (ushort)( element + 0 ); + indices[i++] = (ushort)( element + 1 ); + indices[i++] = (ushort)( element + 2 ); + + indices[i++] = (ushort)( element + 2 ); + indices[i++] = (ushort)( element + 3 ); + indices[i++] = (ushort)( element + 0 ); + element += 4; + } + chunkIb = api.InitIb( indices, indices.Length ); + } + // Render translucent(liquid) blocks. These 'blend' into other blocks. void RenderTranslucent() { // First fill depth buffer int[] texIds = game.TerrainAtlas1D.TexIds; - api.BeginIndexedVbBatch(); + api.BeginIndexedVbBatch(); api.Texturing = false; api.AlphaBlending = false; api.ColourWrite = false;