mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-09-15 10:35:11 -04:00
Add support for drawing indexed dynamic VBs - use less memory in WeatherRenderer and can draw more particles in ParticleManager.
This commit is contained in:
parent
9394ce1794
commit
4371246f96
@ -35,7 +35,9 @@ namespace ClassicalSharp.Particles {
|
|||||||
graphics.BindTexture( game.TerrainAtlas.TexId );
|
graphics.BindTexture( game.TerrainAtlas.TexId );
|
||||||
graphics.AlphaTest = true;
|
graphics.AlphaTest = true;
|
||||||
count = Math.Min( count, 1000 );
|
count = Math.Min( count, 1000 );
|
||||||
graphics.DrawDynamicVb( DrawMode.Triangles, vb, vertices, VertexFormat.Pos3fTex2f, count );
|
|
||||||
|
graphics.BeginVbBatch( VertexFormat.Pos3fTex2f );
|
||||||
|
graphics.DrawDynamicIndexedVb( DrawMode.Triangles, vb, vertices, count, count * 6 / 4 );
|
||||||
graphics.AlphaTest = false;
|
graphics.AlphaTest = false;
|
||||||
graphics.Texturing = false;
|
graphics.Texturing = false;
|
||||||
}
|
}
|
||||||
|
@ -20,11 +20,8 @@ namespace ClassicalSharp.Particles {
|
|||||||
|
|
||||||
vertices[index++] = new VertexPos3fTex2f( p111, Rectangle.U1, Rectangle.V2 );
|
vertices[index++] = new VertexPos3fTex2f( p111, Rectangle.U1, Rectangle.V2 );
|
||||||
vertices[index++] = new VertexPos3fTex2f( p121, Rectangle.U1, Rectangle.V1 );
|
vertices[index++] = new VertexPos3fTex2f( p121, Rectangle.U1, Rectangle.V1 );
|
||||||
vertices[index++] = new VertexPos3fTex2f( p222, Rectangle.U2, Rectangle.V1 );
|
|
||||||
|
|
||||||
vertices[index++] = new VertexPos3fTex2f( p222, Rectangle.U2, Rectangle.V1 );
|
vertices[index++] = new VertexPos3fTex2f( p222, Rectangle.U2, Rectangle.V1 );
|
||||||
vertices[index++] = new VertexPos3fTex2f( p212, Rectangle.U2, Rectangle.V2 );
|
vertices[index++] = new VertexPos3fTex2f( p212, Rectangle.U2, Rectangle.V2 );
|
||||||
vertices[index++] = new VertexPos3fTex2f( p111, Rectangle.U1, Rectangle.V2 );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override bool Tick( double delta ) {
|
public override bool Tick( double delta ) {
|
||||||
|
@ -45,11 +45,13 @@ namespace ClassicalSharp {
|
|||||||
pos.Y += Model.NameYOffset;
|
pos.Y += Model.NameYOffset;
|
||||||
|
|
||||||
// Inlined translation + rotation Y axis
|
// Inlined translation + rotation Y axis
|
||||||
api.texVerts[0] = new VertexPos3fTex2f( cosA * x2 + pos.X, y1 + pos.Y, sinA * x2 + pos.Z, nameTex.U2, nameTex.V1 );
|
api.texVerts[0] = new VertexPos3fTex2f( cosA * x1 + pos.X, y1 + pos.Y, sinA * x1 + pos.Z, nameTex.U1, nameTex.V1 );
|
||||||
api.texVerts[1] = new VertexPos3fTex2f( cosA * x2 + pos.X, y2 + pos.Y, sinA * x2 + pos.Z, nameTex.U2, nameTex.V2 );
|
api.texVerts[1] = new VertexPos3fTex2f( cosA * x2 + pos.X, y1 + pos.Y, sinA * x2 + pos.Z, nameTex.U2, nameTex.V1 );
|
||||||
api.texVerts[2] = new VertexPos3fTex2f( cosA * x1 + pos.X, y1 + pos.Y, sinA * x1 + pos.Z, nameTex.U1, nameTex.V1 );
|
api.texVerts[2] = new VertexPos3fTex2f( cosA * x2 + pos.X, y2 + pos.Y, sinA * x2 + pos.Z, nameTex.U2, nameTex.V2 );
|
||||||
api.texVerts[3] = new VertexPos3fTex2f( cosA * x1 + pos.X, y2 + pos.Y, sinA * x1 + pos.Z, nameTex.U1, nameTex.V2 );
|
api.texVerts[3] = new VertexPos3fTex2f( cosA * x1 + pos.X, y2 + pos.Y, sinA * x1 + pos.Z, nameTex.U1, nameTex.V2 );
|
||||||
api.DrawDynamicVb( DrawMode.TriangleStrip, api.texVb, api.texVerts, VertexFormat.Pos3fTex2f, 4 );
|
|
||||||
|
api.BeginVbBatch( VertexFormat.Pos3fTex2f );
|
||||||
|
api.DrawDynamicIndexedVb( DrawMode.Triangles, api.texVb, api.texVerts, 4, 6 );
|
||||||
api.Texturing = false;
|
api.Texturing = false;
|
||||||
api.AlphaTest = false;
|
api.AlphaTest = false;
|
||||||
}
|
}
|
||||||
|
@ -219,17 +219,24 @@ namespace ClassicalSharp.GraphicsAPI {
|
|||||||
return GetOrExpand( ref dynamicvBuffers, buffer, iBufferSize );
|
return GetOrExpand( ref dynamicvBuffers, buffer, iBufferSize );
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void DrawDynamicVb<T>( DrawMode mode, int vb, T[] vertices, VertexFormat format, int count ) {
|
public override void DrawDynamicVb<T>( DrawMode mode, int vb, T[] vertices, int count ) {
|
||||||
int size = count * strideSizes[(int)format];
|
int size = count * batchStride;
|
||||||
DataBuffer buffer = dynamicvBuffers[vb];
|
DataBuffer buffer = dynamicvBuffers[vb];
|
||||||
buffer.SetData( vertices, size, LockFlags.Discard );
|
buffer.SetData( vertices, size, LockFlags.Discard );
|
||||||
|
|
||||||
device.SetVertexFormat( formatMapping[(int)format] );
|
|
||||||
batchStride = strideSizes[(int)format];
|
|
||||||
device.SetStreamSource( 0, buffer, 0, batchStride );
|
device.SetStreamSource( 0, buffer, 0, batchStride );
|
||||||
device.DrawPrimitives( modeMappings[(int)mode], 0, NumPrimitives( count, mode ) );
|
device.DrawPrimitives( modeMappings[(int)mode], 0, NumPrimitives( count, mode ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void DrawDynamicIndexedVb<T>( DrawMode mode, int vb, T[] vertices, int vCount, int indicesCount ) {
|
||||||
|
int size = vCount * batchStride;
|
||||||
|
DataBuffer buffer = dynamicvBuffers[vb];
|
||||||
|
buffer.SetData( vertices, size, LockFlags.Discard );
|
||||||
|
|
||||||
|
device.SetStreamSource( 0, buffer, 0, batchStride );
|
||||||
|
device.DrawIndexedPrimitives( modeMappings[(int)mode], 0, 0, indicesCount / 6 * 4, 0, NumPrimitives( indicesCount, mode ) );
|
||||||
|
}
|
||||||
|
|
||||||
public override void DeleteDynamicVb( int id ) {
|
public override void DeleteDynamicVb( int id ) {
|
||||||
Delete( dynamicvBuffers, id );
|
Delete( dynamicvBuffers, id );
|
||||||
}
|
}
|
||||||
@ -518,12 +525,7 @@ namespace ClassicalSharp.GraphicsAPI {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int NumPrimitives( int vertices, DrawMode mode ) {
|
static int NumPrimitives( int vertices, DrawMode mode ) {
|
||||||
if( mode == DrawMode.Triangles ) {
|
return mode == DrawMode.Triangles ? vertices / 3 : vertices / 2;
|
||||||
return vertices / 3;
|
|
||||||
} else if( mode == DrawMode.TriangleStrip ) {
|
|
||||||
return vertices - 2;
|
|
||||||
}
|
|
||||||
return vertices / 2;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected unsafe override void LoadOrthoMatrix( float width, float height ) {
|
protected unsafe override void LoadOrthoMatrix( float width, float height ) {
|
||||||
|
@ -123,7 +123,9 @@ namespace ClassicalSharp.GraphicsAPI {
|
|||||||
|
|
||||||
public abstract void DeleteIb( int ib );
|
public abstract void DeleteIb( int ib );
|
||||||
|
|
||||||
public abstract void DrawDynamicVb<T>( DrawMode mode, int vb, T[] vertices, VertexFormat format, int count ) where T : struct;
|
public abstract void DrawDynamicVb<T>( DrawMode mode, int vb, T[] vertices, int count ) where T : struct;
|
||||||
|
|
||||||
|
public abstract void DrawDynamicIndexedVb<T>( DrawMode mode, int vb, T[] vertices, int vCount, int indicesCount ) where T : struct;
|
||||||
|
|
||||||
public abstract void BeginVbBatch( VertexFormat format );
|
public abstract void BeginVbBatch( VertexFormat format );
|
||||||
|
|
||||||
@ -173,14 +175,15 @@ namespace ClassicalSharp.GraphicsAPI {
|
|||||||
DeleteDynamicVb( texVb );
|
DeleteDynamicVb( texVb );
|
||||||
}
|
}
|
||||||
|
|
||||||
VertexPos3fCol4b[] quadVertices = new VertexPos3fCol4b[4];
|
VertexPos3fCol4b[] quadVerts = new VertexPos3fCol4b[4];
|
||||||
int quadVb;
|
int quadVb;
|
||||||
public virtual void Draw2DQuad( float x, float y, float width, float height, FastColour col ) {
|
public virtual void Draw2DQuad( float x, float y, float width, float height, FastColour col ) {
|
||||||
quadVertices[0] = new VertexPos3fCol4b( x + width, y, 0, col );
|
quadVerts[0] = new VertexPos3fCol4b( x, y, 0, col );
|
||||||
quadVertices[1] = new VertexPos3fCol4b( x + width, y + height, 0, col );
|
quadVerts[1] = new VertexPos3fCol4b( x + width, y, 0, col );
|
||||||
quadVertices[2] = new VertexPos3fCol4b( x, y, 0, col );
|
quadVerts[2] = new VertexPos3fCol4b( x + width, y + height, 0, col );
|
||||||
quadVertices[3] = new VertexPos3fCol4b( x, y + height, 0, col );
|
quadVerts[3] = new VertexPos3fCol4b( x, y + height, 0, col );
|
||||||
DrawDynamicVb( DrawMode.TriangleStrip, quadVb, quadVertices, VertexFormat.Pos3fCol4b, 4 );
|
BeginVbBatch( VertexFormat.Pos3fCol4b );
|
||||||
|
DrawDynamicIndexedVb( DrawMode.Triangles, quadVb, quadVerts, 4, 6 );
|
||||||
}
|
}
|
||||||
|
|
||||||
internal VertexPos3fTex2f[] texVerts = new VertexPos3fTex2f[4];
|
internal VertexPos3fTex2f[] texVerts = new VertexPos3fTex2f[4];
|
||||||
@ -195,12 +198,12 @@ namespace ClassicalSharp.GraphicsAPI {
|
|||||||
y1 -= 0.5f;
|
y1 -= 0.5f;
|
||||||
y2 -= 0.5f;
|
y2 -= 0.5f;
|
||||||
#endif
|
#endif
|
||||||
// Have to order them this way because it's a triangle strip.
|
texVerts[0] = new VertexPos3fTex2f( x1, y1, 0, tex.U1, tex.V1 );
|
||||||
texVerts[0] = new VertexPos3fTex2f( x2, y1, 0, tex.U2, tex.V1 );
|
texVerts[1] = new VertexPos3fTex2f( x2, y1, 0, tex.U2, tex.V1 );
|
||||||
texVerts[1] = new VertexPos3fTex2f( x2, y2, 0, tex.U2, tex.V2 );
|
texVerts[2] = new VertexPos3fTex2f( x2, y2, 0, tex.U2, tex.V2 );
|
||||||
texVerts[2] = new VertexPos3fTex2f( x1, y1, 0, tex.U1, tex.V1 );
|
|
||||||
texVerts[3] = new VertexPos3fTex2f( x1, y2, 0, tex.U1, tex.V2 );
|
texVerts[3] = new VertexPos3fTex2f( x1, y2, 0, tex.U1, tex.V2 );
|
||||||
DrawDynamicVb( DrawMode.TriangleStrip, texVb, texVerts, VertexFormat.Pos3fTex2f, 4 );
|
BeginVbBatch( VertexFormat.Pos3fTex2f );
|
||||||
|
DrawDynamicIndexedVb( DrawMode.Triangles, texVb, texVerts, 4, 6 );
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Mode2D( float width, float height ) {
|
public void Mode2D( float width, float height ) {
|
||||||
@ -259,7 +262,6 @@ namespace ClassicalSharp.GraphicsAPI {
|
|||||||
public enum DrawMode {
|
public enum DrawMode {
|
||||||
Triangles = 0,
|
Triangles = 0,
|
||||||
Lines = 1,
|
Lines = 1,
|
||||||
TriangleStrip = 2,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum CompareFunc {
|
public enum CompareFunc {
|
||||||
|
@ -224,16 +224,25 @@ namespace ClassicalSharp.GraphicsAPI {
|
|||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void DrawDynamicVb<T>( DrawMode mode, int id, T[] vertices, VertexFormat format, int count ) {
|
int batchStride;
|
||||||
int sizeInBytes = count * strideSizes[(int)format];
|
public override void DrawDynamicVb<T>( DrawMode mode, int id, T[] vertices, int count ) {
|
||||||
|
int sizeInBytes = count * batchStride;
|
||||||
GL.BindBufferARB( BufferTarget.ArrayBuffer, id );
|
GL.BindBufferARB( BufferTarget.ArrayBuffer, id );
|
||||||
GL.BufferSubDataARB( BufferTarget.ArrayBuffer, IntPtr.Zero, new IntPtr( sizeInBytes ), vertices );
|
GL.BufferSubDataARB( BufferTarget.ArrayBuffer, IntPtr.Zero, new IntPtr( sizeInBytes ), vertices );
|
||||||
|
|
||||||
BeginVbBatch( format );
|
|
||||||
setupBatchFunc();
|
setupBatchFunc();
|
||||||
GL.DrawArrays( modeMappings[(int)mode], 0, count );
|
GL.DrawArrays( modeMappings[(int)mode], 0, count );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void DrawDynamicIndexedVb<T>( DrawMode mode, int id, T[] vertices, int vCount, int indicesCount ) {
|
||||||
|
int sizeInBytes = vCount * batchStride;
|
||||||
|
GL.BindBufferARB( BufferTarget.ArrayBuffer, id );
|
||||||
|
GL.BufferSubDataARB( BufferTarget.ArrayBuffer, IntPtr.Zero, new IntPtr( sizeInBytes ), vertices );
|
||||||
|
|
||||||
|
setupBatchFunc();
|
||||||
|
GL.DrawElements( modeMappings[(int)mode], indicesCount, indexType, zero );
|
||||||
|
}
|
||||||
|
|
||||||
public unsafe override void DeleteDynamicVb( int id ) {
|
public unsafe override void DeleteDynamicVb( int id ) {
|
||||||
if( id <= 0 ) return;
|
if( id <= 0 ) return;
|
||||||
GL.DeleteBuffersARB( 1, &id );
|
GL.DeleteBuffersARB( 1, &id );
|
||||||
@ -267,12 +276,15 @@ namespace ClassicalSharp.GraphicsAPI {
|
|||||||
GL.EnableClientState( ArrayCap.ColorArray );
|
GL.EnableClientState( ArrayCap.ColorArray );
|
||||||
GL.EnableClientState( ArrayCap.TextureCoordArray );
|
GL.EnableClientState( ArrayCap.TextureCoordArray );
|
||||||
setupBatchFunc = setupBatchFuncTex2fCol4b;
|
setupBatchFunc = setupBatchFuncTex2fCol4b;
|
||||||
|
batchStride = VertexPos3fTex2fCol4b.Size;
|
||||||
} else if( format == VertexFormat.Pos3fTex2f ) {
|
} else if( format == VertexFormat.Pos3fTex2f ) {
|
||||||
GL.EnableClientState( ArrayCap.TextureCoordArray );
|
GL.EnableClientState( ArrayCap.TextureCoordArray );
|
||||||
setupBatchFunc = setupBatchFuncTex2f;
|
setupBatchFunc = setupBatchFuncTex2f;
|
||||||
|
batchStride = VertexPos3fTex2f.Size;
|
||||||
} else if( format == VertexFormat.Pos3fCol4b ) {
|
} else if( format == VertexFormat.Pos3fCol4b ) {
|
||||||
GL.EnableClientState( ArrayCap.ColorArray );
|
GL.EnableClientState( ArrayCap.ColorArray );
|
||||||
setupBatchFunc = setupBatchFuncCol4b;
|
setupBatchFunc = setupBatchFuncCol4b;
|
||||||
|
batchStride = VertexPos3fCol4b.Size;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,9 +8,9 @@ namespace ClassicalSharp.Model {
|
|||||||
public class BlockModel : IModel {
|
public class BlockModel : IModel {
|
||||||
|
|
||||||
byte block = (byte)Block.Air;
|
byte block = (byte)Block.Air;
|
||||||
public BlockModel( Game window ) : base( window ) {
|
public BlockModel( Game game ) : base( game ) {
|
||||||
vertices = new VertexPos3fTex2fCol4b[6 * 6];
|
vertices = new VertexPos3fTex2fCol4b[6 * 6];
|
||||||
vb = window.Graphics.CreateDynamicVb( VertexFormat.Pos3fTex2fCol4b, 6 * 6 );
|
vb = game.Graphics.CreateDynamicVb( VertexFormat.Pos3fTex2fCol4b, vertices.Length );
|
||||||
}
|
}
|
||||||
|
|
||||||
public override float NameYOffset {
|
public override float NameYOffset {
|
||||||
@ -40,10 +40,12 @@ namespace ClassicalSharp.Model {
|
|||||||
atlas = window.TerrainAtlas;
|
atlas = window.TerrainAtlas;
|
||||||
BlockInfo = window.BlockInfo;
|
BlockInfo = window.BlockInfo;
|
||||||
index = 0;
|
index = 0;
|
||||||
|
|
||||||
|
graphics.BeginVbBatch( VertexFormat.Pos3fTex2fCol4b );
|
||||||
if( BlockInfo.IsSprite( block ) ) {
|
if( BlockInfo.IsSprite( block ) ) {
|
||||||
DrawXFace( 0f, TileSide.Right, false );
|
DrawXFace( 0f, TileSide.Right, false );
|
||||||
DrawZFace( 0f, TileSide.Back, false );
|
DrawZFace( 0f, TileSide.Back, false );
|
||||||
graphics.DrawDynamicVb( DrawMode.Triangles, vb, vertices, VertexFormat.Pos3fTex2fCol4b, 6 * 2 );
|
graphics.DrawDynamicIndexedVb( DrawMode.Triangles, vb, vertices, 2 * 4, 2 * 6 );
|
||||||
} else {
|
} else {
|
||||||
DrawYFace( blockHeight, TileSide.Top );
|
DrawYFace( blockHeight, TileSide.Top );
|
||||||
DrawXFace( -0.5f, TileSide.Right, false );
|
DrawXFace( -0.5f, TileSide.Right, false );
|
||||||
@ -51,7 +53,7 @@ namespace ClassicalSharp.Model {
|
|||||||
DrawZFace( -0.5f, TileSide.Front, true );
|
DrawZFace( -0.5f, TileSide.Front, true );
|
||||||
DrawZFace( 0.5f, TileSide.Back, false );
|
DrawZFace( 0.5f, TileSide.Back, false );
|
||||||
DrawYFace( 0f, TileSide.Bottom );
|
DrawYFace( 0f, TileSide.Bottom );
|
||||||
graphics.DrawDynamicVb( DrawMode.Triangles, vb, vertices, VertexFormat.Pos3fTex2fCol4b, 6 * 6 );
|
graphics.DrawDynamicIndexedVb( DrawMode.Triangles, vb, vertices, 6 * 4, 6 * 6 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
float blockHeight;
|
float blockHeight;
|
||||||
@ -68,11 +70,8 @@ namespace ClassicalSharp.Model {
|
|||||||
|
|
||||||
vertices[index++] = new VertexPos3fTex2fCol4b( -0.5f, y, -0.5f, rec.U1, rec.V1, col );
|
vertices[index++] = new VertexPos3fTex2fCol4b( -0.5f, y, -0.5f, rec.U1, rec.V1, col );
|
||||||
vertices[index++] = new VertexPos3fTex2fCol4b( 0.5f, y, -0.5f, rec.U2, rec.V1, col );
|
vertices[index++] = new VertexPos3fTex2fCol4b( 0.5f, y, -0.5f, rec.U2, rec.V1, col );
|
||||||
vertices[index++] = new VertexPos3fTex2fCol4b( 0.5f, y, 0.5f, rec.U2, rec.V2, col );
|
|
||||||
|
|
||||||
vertices[index++] = new VertexPos3fTex2fCol4b( 0.5f, y, 0.5f, rec.U2, rec.V2, col );
|
vertices[index++] = new VertexPos3fTex2fCol4b( 0.5f, y, 0.5f, rec.U2, rec.V2, col );
|
||||||
vertices[index++] = new VertexPos3fTex2fCol4b( -0.5f, y, 0.5f, rec.U1, rec.V2, col );
|
vertices[index++] = new VertexPos3fTex2fCol4b( -0.5f, y, 0.5f, rec.U1, rec.V2, col );
|
||||||
vertices[index++] = new VertexPos3fTex2fCol4b( -0.5f, y, -0.5f, rec.U1, rec.V1, col );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DrawZFace( float z, int side, bool swapU ) {
|
void DrawZFace( float z, int side, bool swapU ) {
|
||||||
@ -85,11 +84,8 @@ namespace ClassicalSharp.Model {
|
|||||||
|
|
||||||
vertices[index++] = new VertexPos3fTex2fCol4b( -0.5f, 0f, z, rec.U1, rec.V2, col );
|
vertices[index++] = new VertexPos3fTex2fCol4b( -0.5f, 0f, z, rec.U1, rec.V2, col );
|
||||||
vertices[index++] = new VertexPos3fTex2fCol4b( -0.5f, blockHeight, z, rec.U1, rec.V1, col );
|
vertices[index++] = new VertexPos3fTex2fCol4b( -0.5f, blockHeight, z, rec.U1, rec.V1, col );
|
||||||
vertices[index++] = new VertexPos3fTex2fCol4b( 0.5f, blockHeight, z, rec.U2, rec.V1, col );
|
|
||||||
|
|
||||||
vertices[index++] = new VertexPos3fTex2fCol4b( 0.5f, blockHeight, z, rec.U2, rec.V1, col );
|
vertices[index++] = new VertexPos3fTex2fCol4b( 0.5f, blockHeight, z, rec.U2, rec.V1, col );
|
||||||
vertices[index++] = new VertexPos3fTex2fCol4b( 0.5f, 0f, z, rec.U2, rec.V2, col );
|
vertices[index++] = new VertexPos3fTex2fCol4b( 0.5f, 0f, z, rec.U2, rec.V2, col );
|
||||||
vertices[index++] = new VertexPos3fTex2fCol4b( -0.5f, 0f, z, rec.U1, rec.V2, col );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DrawXFace( float x, int side, bool swapU ) {
|
void DrawXFace( float x, int side, bool swapU ) {
|
||||||
@ -102,11 +98,8 @@ namespace ClassicalSharp.Model {
|
|||||||
|
|
||||||
vertices[index++] = new VertexPos3fTex2fCol4b( x, 0f, -0.5f, rec.U1, rec.V2, col );
|
vertices[index++] = new VertexPos3fTex2fCol4b( x, 0f, -0.5f, rec.U1, rec.V2, col );
|
||||||
vertices[index++] = new VertexPos3fTex2fCol4b( x, blockHeight, -0.5f, rec.U1, rec.V1, col );
|
vertices[index++] = new VertexPos3fTex2fCol4b( x, blockHeight, -0.5f, rec.U1, rec.V1, col );
|
||||||
vertices[index++] = new VertexPos3fTex2fCol4b( x, blockHeight, 0.5f, rec.U2, rec.V1, col );
|
|
||||||
|
|
||||||
vertices[index++] = new VertexPos3fTex2fCol4b( x, blockHeight, 0.5f, rec.U2, rec.V1, col );
|
vertices[index++] = new VertexPos3fTex2fCol4b( x, blockHeight, 0.5f, rec.U2, rec.V1, col );
|
||||||
vertices[index++] = new VertexPos3fTex2fCol4b( x, 0f, 0.5f, rec.U2, rec.V2, col );
|
vertices[index++] = new VertexPos3fTex2fCol4b( x, 0f, 0.5f, rec.U2, rec.V2, col );
|
||||||
vertices[index++] = new VertexPos3fTex2fCol4b( x, 0f, -0.5f, rec.U1, rec.V2, col );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -16,7 +16,7 @@ namespace ClassicalSharp.Renderers {
|
|||||||
|
|
||||||
FastColour col = FastColour.White;
|
FastColour col = FastColour.White;
|
||||||
int index;
|
int index;
|
||||||
const int verticesCount = 24 * ( 3 * 2 );
|
const int verticesCount = 16 * 6;
|
||||||
VertexPos3fCol4b[] vertices = new VertexPos3fCol4b[verticesCount];
|
VertexPos3fCol4b[] vertices = new VertexPos3fCol4b[verticesCount];
|
||||||
const float size = 0.0625f;
|
const float size = 0.0625f;
|
||||||
const float offset = 0.01f;
|
const float offset = 0.01f;
|
||||||
@ -56,7 +56,9 @@ namespace ClassicalSharp.Renderers {
|
|||||||
DrawZPlane( p2.Z, p2.X, p1.Y, p2.X - size, p2.Y );
|
DrawZPlane( p2.Z, p2.X, p1.Y, p2.X - size, p2.Y );
|
||||||
DrawZPlane( p2.Z, p1.X, p1.Y, p2.X, p1.Y + size );
|
DrawZPlane( p2.Z, p1.X, p1.Y, p2.X, p1.Y + size );
|
||||||
DrawZPlane( p2.Z, p1.X, p2.Y, p2.X, p2.Y - size );
|
DrawZPlane( p2.Z, p1.X, p2.Y, p2.X, p2.Y - size );
|
||||||
graphics.DrawDynamicVb( DrawMode.Triangles, vb, vertices, VertexFormat.Pos3fCol4b, verticesCount );
|
|
||||||
|
graphics.BeginVbBatch( VertexFormat.Pos3fCol4b );
|
||||||
|
graphics.DrawDynamicIndexedVb( DrawMode.Triangles, vb, vertices, verticesCount, verticesCount * 6 / 4 );
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Dispose() {
|
public void Dispose() {
|
||||||
@ -66,31 +68,22 @@ namespace ClassicalSharp.Renderers {
|
|||||||
void DrawXPlane( float x, float z1, float y1, float z2, float y2 ) {
|
void DrawXPlane( float x, float z1, float y1, float z2, float y2 ) {
|
||||||
vertices[index++] = new VertexPos3fCol4b( x, y1, z1, col );
|
vertices[index++] = new VertexPos3fCol4b( x, y1, z1, col );
|
||||||
vertices[index++] = new VertexPos3fCol4b( x, y2, z1, col );
|
vertices[index++] = new VertexPos3fCol4b( x, y2, z1, col );
|
||||||
vertices[index++] = new VertexPos3fCol4b( x, y2, z2, col );
|
|
||||||
|
|
||||||
vertices[index++] = new VertexPos3fCol4b( x, y2, z2, col );
|
vertices[index++] = new VertexPos3fCol4b( x, y2, z2, col );
|
||||||
vertices[index++] = new VertexPos3fCol4b( x, y1, z2, col );
|
vertices[index++] = new VertexPos3fCol4b( x, y1, z2, col );
|
||||||
vertices[index++] = new VertexPos3fCol4b( x, y1, z1, col );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DrawZPlane( float z, float x1, float y1, float x2, float y2 ) {
|
void DrawZPlane( float z, float x1, float y1, float x2, float y2 ) {
|
||||||
vertices[index++] = new VertexPos3fCol4b( x1, y1, z, col );
|
vertices[index++] = new VertexPos3fCol4b( x1, y1, z, col );
|
||||||
vertices[index++] = new VertexPos3fCol4b( x1, y2, z, col );
|
vertices[index++] = new VertexPos3fCol4b( x1, y2, z, col );
|
||||||
vertices[index++] = new VertexPos3fCol4b( x2, y2, z, col );
|
|
||||||
|
|
||||||
vertices[index++] = new VertexPos3fCol4b( x2, y2, z, col );
|
vertices[index++] = new VertexPos3fCol4b( x2, y2, z, col );
|
||||||
vertices[index++] = new VertexPos3fCol4b( x2, y1, z, col );
|
vertices[index++] = new VertexPos3fCol4b( x2, y1, z, col );
|
||||||
vertices[index++] = new VertexPos3fCol4b( x1, y1, z, col );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DrawYPlane( float y, float x1, float z1, float x2, float z2 ) {
|
void DrawYPlane( float y, float x1, float z1, float x2, float z2 ) {
|
||||||
vertices[index++] = new VertexPos3fCol4b( x1, y, z1, col );
|
vertices[index++] = new VertexPos3fCol4b( x1, y, z1, col );
|
||||||
vertices[index++] = new VertexPos3fCol4b( x1, y, z2, col );
|
vertices[index++] = new VertexPos3fCol4b( x1, y, z2, col );
|
||||||
vertices[index++] = new VertexPos3fCol4b( x2, y, z2, col );
|
|
||||||
|
|
||||||
vertices[index++] = new VertexPos3fCol4b( x2, y, z2, col );
|
vertices[index++] = new VertexPos3fCol4b( x2, y, z2, col );
|
||||||
vertices[index++] = new VertexPos3fCol4b( x2, y, z1, col );
|
vertices[index++] = new VertexPos3fCol4b( x2, y, z1, col );
|
||||||
vertices[index++] = new VertexPos3fCol4b( x1, y, z1, col );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -22,7 +22,7 @@ namespace ClassicalSharp {
|
|||||||
int rainTexture, snowTexture;
|
int rainTexture, snowTexture;
|
||||||
short[] heightmap;
|
short[] heightmap;
|
||||||
float vOffset;
|
float vOffset;
|
||||||
VertexPos3fTex2fCol4b[] vertices = new VertexPos3fTex2fCol4b[12 * 9 * 9];
|
VertexPos3fTex2fCol4b[] vertices = new VertexPos3fTex2fCol4b[8 * 9 * 9];
|
||||||
public void Render( double deltaTime ) {
|
public void Render( double deltaTime ) {
|
||||||
Weather weather = map.Weather;
|
Weather weather = map.Weather;
|
||||||
if( weather == Weather.Sunny ) return;
|
if( weather == Weather.Sunny ) return;
|
||||||
@ -46,7 +46,8 @@ namespace ClassicalSharp {
|
|||||||
MakeRainForSquare( pos.X + dx, rainY, height, pos.Z + dz, col, ref index );
|
MakeRainForSquare( pos.X + dx, rainY, height, pos.Z + dz, col, ref index );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
graphics.DrawDynamicVb( DrawMode.Triangles, weatherVb, vertices, VertexFormat.Pos3fTex2fCol4b, index );
|
graphics.BeginVbBatch( VertexFormat.Pos3fTex2fCol4b );
|
||||||
|
graphics.DrawDynamicIndexedVb( DrawMode.Triangles, weatherVb, vertices, index, index * 6 / 4 );
|
||||||
graphics.AlphaBlending = false;
|
graphics.AlphaBlending = false;
|
||||||
graphics.Texturing = false;
|
graphics.Texturing = false;
|
||||||
}
|
}
|
||||||
@ -62,20 +63,13 @@ namespace ClassicalSharp {
|
|||||||
|
|
||||||
vertices[index++] = new VertexPos3fTex2fCol4b( x, y, z, 0, v2, col );
|
vertices[index++] = new VertexPos3fTex2fCol4b( x, y, z, 0, v2, col );
|
||||||
vertices[index++] = new VertexPos3fTex2fCol4b( x, y + height, z, 0, v1, col );
|
vertices[index++] = new VertexPos3fTex2fCol4b( x, y + height, z, 0, v1, col );
|
||||||
vertices[index++] = new VertexPos3fTex2fCol4b( x + 1, y + height, z + 1, 2, v1, col );
|
|
||||||
|
|
||||||
vertices[index++] = new VertexPos3fTex2fCol4b( x + 1, y + height, z + 1, 2, v1, col );
|
vertices[index++] = new VertexPos3fTex2fCol4b( x + 1, y + height, z + 1, 2, v1, col );
|
||||||
vertices[index++] = new VertexPos3fTex2fCol4b( x + 1, y, z + 1, 2, v2, col );
|
vertices[index++] = new VertexPos3fTex2fCol4b( x + 1, y, z + 1, 2, v2, col );
|
||||||
vertices[index++] = new VertexPos3fTex2fCol4b( x, y, z, 0, v2, col );
|
|
||||||
|
|
||||||
|
|
||||||
vertices[index++] = new VertexPos3fTex2fCol4b( x + 1, y, z, 2, v2, col );
|
vertices[index++] = new VertexPos3fTex2fCol4b( x + 1, y, z, 2, v2, col );
|
||||||
vertices[index++] = new VertexPos3fTex2fCol4b( x + 1, y + height, z, 2, v1, col );
|
vertices[index++] = new VertexPos3fTex2fCol4b( x + 1, y + height, z, 2, v1, col );
|
||||||
vertices[index++] = new VertexPos3fTex2fCol4b( x, y + height, z + 1, 0, v1, col );
|
|
||||||
|
|
||||||
vertices[index++] = new VertexPos3fTex2fCol4b( x, y + height, z + 1, 0, v1, col );
|
vertices[index++] = new VertexPos3fTex2fCol4b( x, y + height, z + 1, 0, v1, col );
|
||||||
vertices[index++] = new VertexPos3fTex2fCol4b( x, y, z + 1, 0, v2, col );
|
vertices[index++] = new VertexPos3fTex2fCol4b( x, y, z + 1, 0, v2, col );
|
||||||
vertices[index++] = new VertexPos3fTex2fCol4b( x + 1, y, z, 2, v2, col );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int length, width, maxY, oneY;
|
int length, width, maxY, oneY;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user