Add starting vertex and index to DrawIndexedVb, combine 'Vb1' and 'Vb2' into single 'Vb' in MapRenderer class.

This commit is contained in:
UnknownShadow200 2015-06-16 20:09:11 +10:00
parent dfab27c49c
commit 3294540246
6 changed files with 67 additions and 89 deletions

View File

@ -257,10 +257,10 @@ namespace ClassicalSharp.GraphicsAPI {
return IsValid( iBuffers, ib ); return IsValid( iBuffers, ib );
} }
public override void DrawVb( DrawMode mode, VertexFormat format, int id, int offset, int verticesCount ) { public override void DrawVb( DrawMode mode, VertexFormat format, int id, int startVertex, int verticesCount ) {
device.SetStreamSource( 0, vBuffers[id], 0, strideSizes[(int)format] ); device.SetStreamSource( 0, vBuffers[id], 0, strideSizes[(int)format] );
device.VertexFormat = formatMapping[(int)format]; device.VertexFormat = formatMapping[(int)format];
device.DrawPrimitives( modeMappings[(int)mode], offset, NumPrimitives( verticesCount, mode ) ); device.DrawPrimitives( modeMappings[(int)mode], startVertex, NumPrimitives( verticesCount, mode ) );
} }
int batchStride; int batchStride;
@ -269,9 +269,9 @@ namespace ClassicalSharp.GraphicsAPI {
batchStride = strideSizes[(int)format]; batchStride = strideSizes[(int)format];
} }
public override void DrawVbBatch( DrawMode mode, int id, int offset, int verticesCount ) { public override void DrawVbBatch( DrawMode mode, int id, int startVertex, int verticesCount ) {
device.SetStreamSource( 0, vBuffers[id], 0, batchStride ); device.SetStreamSource( 0, vBuffers[id], 0, batchStride );
device.DrawPrimitives( modeMappings[(int)mode], offset, NumPrimitives( verticesCount, mode ) ); device.DrawPrimitives( modeMappings[(int)mode], startVertex, NumPrimitives( verticesCount, mode ) );
} }
public override void EndVbBatch() { public override void EndVbBatch() {
@ -282,11 +282,12 @@ namespace ClassicalSharp.GraphicsAPI {
batchStride = VertexPos3fTex2fCol4b.Size; batchStride = VertexPos3fTex2fCol4b.Size;
} }
public override void DrawIndexedVbBatch( DrawMode mode, int vb, int ib, int indicesCount ) { public override void DrawIndexedVbBatch( DrawMode mode, int vb, int ib, int indicesCount,
int startVertex, int startIndex ) {
device.Indices = iBuffers[ib]; device.Indices = iBuffers[ib];
device.SetStreamSource( 0, vBuffers[vb], 0, batchStride ); device.SetStreamSource( 0, vBuffers[vb], 0, batchStride );
device.DrawIndexedPrimitives( modeMappings[(int)mode], 0, 0, device.DrawIndexedPrimitives( modeMappings[(int)mode], startVertex, startVertex,
indicesCount / 6 * 4, 0, NumPrimitives( indicesCount, mode ) ); indicesCount / 6 * 4, startIndex, NumPrimitives( indicesCount, mode ) );
} }
public override void EndIndexedVbBatch() { public override void EndIndexedVbBatch() {

View File

@ -122,17 +122,18 @@ namespace ClassicalSharp.GraphicsAPI {
public abstract void DeleteIb( int ib ); public abstract void DeleteIb( int ib );
public abstract void DrawVb( DrawMode mode, VertexFormat format, int id, int offset, int verticesCount ); public abstract void DrawVb( DrawMode mode, VertexFormat format, int id, int startVertex, int verticesCount );
public abstract void BeginVbBatch( VertexFormat format ); public abstract void BeginVbBatch( VertexFormat format );
public abstract void DrawVbBatch( DrawMode mode, int id, int offset, int verticesCount ); public abstract void DrawVbBatch( DrawMode mode, int id, int startVertex, int verticesCount );
public abstract void EndVbBatch(); public abstract void EndVbBatch();
public abstract void BeginIndexedVbBatch(); public abstract void BeginIndexedVbBatch();
public abstract void DrawIndexedVbBatch( DrawMode mode, int vb, int ib, int indicesCount ); public abstract void DrawIndexedVbBatch( DrawMode mode, int vb, int ib, int indicesCount,
int startVertex, int startIndex );
public abstract void EndIndexedVbBatch(); public abstract void EndIndexedVbBatch();

View File

@ -283,9 +283,9 @@ namespace ClassicalSharp.GraphicsAPI {
return GL.Arb.IsBuffer( ib ); return GL.Arb.IsBuffer( ib );
} }
public override void DrawVb( DrawMode mode, VertexFormat format, int id, int offset, int verticesCount ) { public override void DrawVb( DrawMode mode, VertexFormat format, int id, int startVertex, int verticesCount ) {
BeginVbBatch( format ); BeginVbBatch( format );
DrawVbBatch( mode, id, offset, verticesCount ); DrawVbBatch( mode, id, startVertex, verticesCount );
EndVbBatch(); EndVbBatch();
} }
@ -320,17 +320,21 @@ namespace ClassicalSharp.GraphicsAPI {
BeginVbBatch( VertexFormat.Pos3fTex2fCol4b ); BeginVbBatch( VertexFormat.Pos3fTex2fCol4b );
} }
public override void DrawVbBatch( DrawMode mode, int id, int offset, int verticesCount ) { public override void DrawVbBatch( DrawMode mode, int id, int startVertex, int verticesCount ) {
drawBatchFunc( mode, id, offset, verticesCount ); drawBatchFunc( mode, id, startVertex, verticesCount );
} }
public override void DrawIndexedVbBatch( DrawMode mode, int vb, int ib, int indicesCount ) { const DrawElementsType indexType = DrawElementsType.UnsignedShort;
public override void DrawIndexedVbBatch( DrawMode mode, int vb, int ib, int indicesCount,
int startVertex, int startIndex ) {
GL.Arb.BindBuffer( BufferTargetArb.ArrayBuffer, vb ); GL.Arb.BindBuffer( BufferTargetArb.ArrayBuffer, vb );
GL.Arb.BindBuffer( BufferTargetArb.ElementArrayBuffer, ib ); GL.Arb.BindBuffer( BufferTargetArb.ElementArrayBuffer, ib );
GL.VertexPointer( 3, VertexPointerType.Float, 24, new IntPtr( 0 ) );
GL.ColorPointer( 4, ColorPointerType.UnsignedByte, 24, new IntPtr( 12 ) ); int offset = startVertex * VertexPos3fTex2fCol4b.Size;
GL.TexCoordPointer( 2, TexCoordPointerType.Float, 24, new IntPtr( 16 ) ); GL.VertexPointer( 3, VertexPointerType.Float, 24, new IntPtr( offset ) );
GL.DrawElements( modeMappings[(int)mode], indicesCount, DrawElementsType.UnsignedShort, IntPtr.Zero ); GL.ColorPointer( 4, ColorPointerType.UnsignedByte, 24, new IntPtr( offset + 12 ) );
GL.TexCoordPointer( 2, TexCoordPointerType.Float, 24, new IntPtr( offset + 16 ) );
GL.DrawElements( modeMappings[(int)mode], indicesCount, indexType, new IntPtr( startIndex * 2 ) );
} }
public override void EndVbBatch() { public override void EndVbBatch() {

View File

@ -337,16 +337,12 @@ namespace ClassicalSharp {
public struct ChunkPartInfo { public struct ChunkPartInfo {
public int VbId, IbId; public int VbId, IbId;
public int VbId2, IbId2; public int IndicesCount;
public int IndicesCount, IndicesCount2;
public ChunkPartInfo( int vb, int ib, int indices ) { public ChunkPartInfo( int vb, int ib, int indices ) {
VbId = vb; VbId = vb;
IbId = ib; IbId = ib;
IndicesCount = indices; IndicesCount = indices;
VbId2 = 0;
IbId2 = 0;
IndicesCount2 = 0;
} }
} }
} }

View File

@ -8,7 +8,6 @@ namespace ClassicalSharp {
DrawInfo1D[] drawInfoBuffer; DrawInfo1D[] drawInfoBuffer;
TerrainAtlas1D atlas; TerrainAtlas1D atlas;
int arraysCount = 0; int arraysCount = 0;
const int maxIndices = 65536;
void TerrainAtlasChanged( object sender, EventArgs e ) { void TerrainAtlasChanged( object sender, EventArgs e ) {
int newArraysCount = Window.TerrainAtlas1D.TexIds.Length; int newArraysCount = Window.TerrainAtlas1D.TexIds.Length;
@ -28,45 +27,28 @@ namespace ClassicalSharp {
} }
class DrawInfo1DPart { class DrawInfo1DPart {
public VertexPos3fTex2fCol4b[] vertices1, vertices2, vertices; public VertexPos3fTex2fCol4b[] vertices;
public ushort[] indices1, indices2, indices; public ushort[] indices;
public int vIndex, vCount; public int vIndex, vCount;
public int iIndex, iCount; public int iIndex, iCount;
public int vCount1, vCount2;
public int iCount1, iCount2;
public DrawInfo1DPart() { public DrawInfo1DPart() {
vertices1 = new VertexPos3fTex2fCol4b[0]; vertices = new VertexPos3fTex2fCol4b[0];
indices1 = new ushort[0]; indices = new ushort[0];
vertices2 = new VertexPos3fTex2fCol4b[0];
indices2 = new ushort[0];
} }
public void ExpandToCapacity() { public void ExpandToCapacity() {
vCount = ( iCount / 6 ) * 4; vCount = ( iCount / 6 ) * 4;
vCount1 = Math.Min( vCount, maxIndices ); if( vCount > vertices.Length ) {
iCount1 = ( vCount1 / 4 ) * 6; vertices = new VertexPos3fTex2fCol4b[vCount];
if( vCount1 > vertices1.Length ) { indices = new ushort[iCount];
vertices1 = new VertexPos3fTex2fCol4b[vCount1];
indices1 = new ushort[iCount1];
} }
vCount2 = Math.Max( 0, vCount - maxIndices );
iCount2 = ( vCount2 / 4 ) * 6;
if( vCount2 > vertices2.Length ) {
vertices2 = new VertexPos3fTex2fCol4b[vCount2];
indices2 = new ushort[iCount2];
}
vertices = vertices1;
indices = indices1;
} }
public void ResetState() { public void ResetState() {
vIndex = iIndex = 0; vIndex = iIndex = 0;
vCount = iCount = 0; vCount = iCount = 0;
vCount1 = vCount2 = 0;
iCount1 = iCount2 = 0;
} }
} }
@ -138,18 +120,13 @@ namespace ClassicalSharp {
} }
void SetPartInfo( DrawInfo1DPart part, int i, ref ChunkPartInfo[] parts ) { void SetPartInfo( DrawInfo1DPart part, int i, ref ChunkPartInfo[] parts ) {
if( part.iCount1 == 0 ) return; if( part.iCount == 0 ) return;
ChunkPartInfo info = default( ChunkPartInfo ); ChunkPartInfo info = default( ChunkPartInfo );
info.VbId = Graphics.InitVb( part.vertices1, VertexFormat.Pos3fTex2fCol4b, part.vCount1 ); info.VbId = Graphics.InitVb( part.vertices, VertexFormat.Pos3fTex2fCol4b, part.vCount );
info.IbId = Graphics.InitIb( part.indices1, part.iCount1 ); info.IbId = Graphics.InitIb( part.indices, part.iCount );
info.IndicesCount = part.iCount1; info.IndicesCount = part.iCount;
if( part.iCount2 > 0 ) {
info.VbId2 = Graphics.InitVb( part.vertices2, VertexFormat.Pos3fTex2fCol4b, part.vCount2 );
info.IbId2 = Graphics.InitIb( part.indices2, part.iCount2 );
info.IndicesCount2 = part.iCount2;
}
// Lazy initalize part arrays so we can save time in MapRenderer for chunks that only contain 1 or 2 part types. // Lazy initalize part arrays so we can save time in MapRenderer for chunks that only contain 1 or 2 part types.
if( parts == null ) if( parts == null )
parts = new ChunkPartInfo[arraysCount]; parts = new ChunkPartInfo[arraysCount];
@ -363,13 +340,6 @@ namespace ClassicalSharp {
void AddIndices( DrawInfo1DPart part ) { void AddIndices( DrawInfo1DPart part ) {
int element = part.vIndex; int element = part.vIndex;
if( element == maxIndices ) {
part.indices = part.indices2;
part.vertices = part.vertices2;
part.iIndex = 0;
part.vIndex = 0;
element = 0;
}
part.indices[part.iIndex++] = (ushort)( element + 0 ); part.indices[part.iIndex++] = (ushort)( element + 0 );
part.indices[part.iIndex++] = (ushort)( element + 1 ); part.indices[part.iIndex++] = (ushort)( element + 1 );
part.indices[part.iIndex++] = (ushort)( element + 2 ); part.indices[part.iIndex++] = (ushort)( element + 2 );

View File

@ -280,19 +280,22 @@ namespace ClassicalSharp {
} }
const DrawMode mode = DrawMode.Triangles; const DrawMode mode = DrawMode.Triangles;
const int maxVertex = 65536;
const int maxIndices = maxVertex / 4 * 6;
void RenderSolidBatch( int batch ) { void RenderSolidBatch( int batch ) {
for( int i = 0; i < chunks.Length; i++ ) { for( int i = 0; i < chunks.Length; i++ ) {
ChunkInfo info = chunks[i]; ChunkInfo info = chunks[i];
if( info.SolidParts == null || !info.Visible ) continue; if( info.SolidParts == null || !info.Visible ) continue;
ChunkPartInfo drawInfo = info.SolidParts[batch]; ChunkPartInfo part = info.SolidParts[batch];
if( drawInfo.IndicesCount > 0 ) { if( part.IndicesCount > 0 ) {
Graphics.DrawIndexedVbBatch( mode, drawInfo.VbId, drawInfo.IbId, drawInfo.IndicesCount ); if( part.IndicesCount > maxIndices ) {
Window.Vertices += drawInfo.IndicesCount; Graphics.DrawIndexedVbBatch( mode, part.VbId, part.IbId, maxIndices, 0, 0 );
if( drawInfo.IndicesCount2 > 0 ) { Graphics.DrawIndexedVbBatch( mode, part.VbId, part.IbId, part.IndicesCount - maxIndices, maxVertex, maxIndices );
Graphics.DrawIndexedVbBatch( mode, drawInfo.VbId2, drawInfo.IbId2, drawInfo.IndicesCount2 ); } else {
Window.Vertices += drawInfo.IndicesCount2; Graphics.DrawIndexedVbBatch( mode, part.VbId, part.IbId, part.IndicesCount, 0, 0 );
} }
Window.Vertices += part.IndicesCount;
} }
} }
} }
@ -302,10 +305,10 @@ namespace ClassicalSharp {
ChunkInfo info = chunks[i]; ChunkInfo info = chunks[i];
if( info.SpriteParts == null || !info.Visible ) continue; if( info.SpriteParts == null || !info.Visible ) continue;
ChunkPartInfo drawInfo = info.SpriteParts[batch]; ChunkPartInfo part = info.SpriteParts[batch];
if( drawInfo.IndicesCount > 0 ) { if( part.IndicesCount > 0 ) {
Graphics.DrawIndexedVbBatch( mode, drawInfo.VbId, drawInfo.IbId, drawInfo.IndicesCount ); Graphics.DrawIndexedVbBatch( mode, part.VbId, part.IbId, part.IndicesCount, 0, 0 );
Window.Vertices += drawInfo.IndicesCount; Window.Vertices += part.IndicesCount;
} }
} }
} }
@ -315,14 +318,15 @@ namespace ClassicalSharp {
ChunkInfo info = chunks[i]; ChunkInfo info = chunks[i];
if( info.TranslucentParts == null || !info.Visible ) continue; if( info.TranslucentParts == null || !info.Visible ) continue;
ChunkPartInfo drawInfo = info.TranslucentParts[batch]; ChunkPartInfo part = info.TranslucentParts[batch];
if( drawInfo.IndicesCount > 0 ) { if( part.IndicesCount > 0 ) {
Graphics.DrawIndexedVbBatch( mode, drawInfo.VbId, drawInfo.IbId, drawInfo.IndicesCount ); if( part.IndicesCount > maxIndices ) {
Window.Vertices += drawInfo.IndicesCount; Graphics.DrawIndexedVbBatch( mode, part.VbId, part.IbId, maxIndices, 0, 0 );
if( drawInfo.IndicesCount2 > 0 ) { Graphics.DrawIndexedVbBatch( mode, part.VbId, part.IbId, part.IndicesCount - maxIndices, maxVertex, maxIndices );
Graphics.DrawIndexedVbBatch( mode, drawInfo.VbId2, drawInfo.IbId2, drawInfo.IndicesCount2 ); } else {
Window.Vertices += drawInfo.IndicesCount2; Graphics.DrawIndexedVbBatch( mode, part.VbId, part.IbId, part.IndicesCount, 0, 0 );
} }
Window.Vertices += part.IndicesCount;
} }
} }
} }
@ -332,11 +336,13 @@ namespace ClassicalSharp {
ChunkInfo info = chunks[i]; ChunkInfo info = chunks[i];
if( info.TranslucentParts == null || !info.Visible ) continue; if( info.TranslucentParts == null || !info.Visible ) continue;
ChunkPartInfo drawInfo = info.TranslucentParts[batch]; ChunkPartInfo part = info.TranslucentParts[batch];
if( drawInfo.IndicesCount > 0 ) { if( part.IndicesCount > 0 ) {
Graphics.DrawIndexedVbBatch( mode, drawInfo.VbId, drawInfo.IbId, drawInfo.IndicesCount ); if( part.IndicesCount > maxIndices ) {
if( drawInfo.IndicesCount2 > 0 ) { Graphics.DrawIndexedVbBatch( mode, part.VbId, part.IbId, maxIndices, 0, 0 );
Graphics.DrawIndexedVbBatch( mode, drawInfo.VbId2, drawInfo.IbId2, drawInfo.IndicesCount2 ); Graphics.DrawIndexedVbBatch( mode, part.VbId, part.IbId, part.IndicesCount - maxIndices, maxVertex, maxIndices );
} else {
Graphics.DrawIndexedVbBatch( mode, part.VbId, part.IbId, part.IndicesCount, 0, 0 );
} }
} }
} }