mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-09-12 09:06:55 -04:00
Optimise even further, fix bug with sky drawing with OpenGL api.
This commit is contained in:
parent
0fe78fdf3b
commit
96b508a2ce
@ -18,7 +18,7 @@ namespace ClassicalSharp.GraphicsAPI {
|
|||||||
Device device;
|
Device device;
|
||||||
Direct3D d3d;
|
Direct3D d3d;
|
||||||
Capabilities caps;
|
Capabilities caps;
|
||||||
const int texBufferSize = 512, iBufferSize = 1024, vBufferSize = 2048;
|
const int texBufferSize = 512, iBufferSize = 256, vBufferSize = 2048;
|
||||||
|
|
||||||
D3D.Texture[] textures = new D3D.Texture[texBufferSize];
|
D3D.Texture[] textures = new D3D.Texture[texBufferSize];
|
||||||
VertexBuffer[] vBuffers = new VertexBuffer[vBufferSize];
|
VertexBuffer[] vBuffers = new VertexBuffer[vBufferSize];
|
||||||
@ -288,8 +288,7 @@ namespace ClassicalSharp.GraphicsAPI {
|
|||||||
batchStride = strideSizes[(int)format];
|
batchStride = strideSizes[(int)format];
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void DrawVb( DrawMode mode, int id, int startVertex, int verticesCount ) {
|
public override void DrawVb( DrawMode mode, int startVertex, int verticesCount ) {
|
||||||
device.SetStreamSource( 0, vBuffers[id], 0, batchStride );
|
|
||||||
device.DrawPrimitives( modeMappings[(int)mode], startVertex, NumPrimitives( verticesCount, mode ) );
|
device.DrawPrimitives( modeMappings[(int)mode], startVertex, NumPrimitives( verticesCount, mode ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -301,7 +300,12 @@ namespace ClassicalSharp.GraphicsAPI {
|
|||||||
device.SetIndices( iBuffers[ib] );
|
device.SetIndices( iBuffers[ib] );
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void DrawIndexedVb( DrawMode mode, int indicesCount, int startVertex, int startIndex ) {
|
public override void DrawIndexedVb( DrawMode mode, int indicesCount, int startIndex ) {
|
||||||
|
device.DrawIndexedPrimitives( modeMappings[(int)mode], 0, 0,
|
||||||
|
indicesCount / 6 * 4, startIndex, NumPrimitives( indicesCount, mode ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void DrawIndexedVb_T2fC4b( DrawMode mode, int indicesCount, int startVertex, int startIndex ) {
|
||||||
device.DrawIndexedPrimitives( modeMappings[(int)mode], startVertex, startVertex,
|
device.DrawIndexedPrimitives( modeMappings[(int)mode], startVertex, startVertex,
|
||||||
indicesCount / 6 * 4, startIndex, NumPrimitives( indicesCount, mode ) );
|
indicesCount / 6 * 4, startIndex, NumPrimitives( indicesCount, mode ) );
|
||||||
}
|
}
|
||||||
|
@ -124,12 +124,12 @@ namespace ClassicalSharp.GraphicsAPI {
|
|||||||
|
|
||||||
public abstract void BeginVbBatch( VertexFormat format );
|
public abstract void BeginVbBatch( VertexFormat format );
|
||||||
|
|
||||||
public abstract void DrawVb( DrawMode mode, int id, int startVertex, int verticesCount );
|
public abstract void DrawVb( DrawMode mode, int startVertex, int verticesCount );
|
||||||
|
|
||||||
public abstract void DrawIndexedVb( DrawMode mode, int indicesCount, int startVertex, int startIndex );
|
public abstract void DrawIndexedVb( DrawMode mode, int indicesCount, int startIndex );
|
||||||
|
|
||||||
/// <summary> Optimised version of DrawIndexedVb for VertexFormat.Pos3fTex2fCol4b </summary>
|
/// <summary> Optimised version of DrawIndexedVb for VertexFormat.Pos3fTex2fCol4b </summary>
|
||||||
//public abstract void DrawIndexedVb( DrawMode mode, int indicesCount, int startVertex, int startIndex );
|
public abstract void DrawIndexedVb_T2fC4b( DrawMode mode, int indicesCount, int offsetVertex, int startIndex );
|
||||||
|
|
||||||
protected static int[] strideSizes = { 20, 16, 24 };
|
protected static int[] strideSizes = { 20, 16, 24 };
|
||||||
|
|
||||||
|
@ -266,8 +266,7 @@ namespace ClassicalSharp.GraphicsAPI {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void DrawVb( DrawMode mode, int id, int startVertex, int verticesCount ) {
|
public override void DrawVb( DrawMode mode, int startVertex, int verticesCount ) {
|
||||||
GL.BindBufferARB( BufferTarget.ArrayBuffer, id );
|
|
||||||
setupBatchFunc();
|
setupBatchFunc();
|
||||||
GL.DrawArrays( modeMappings[(int)mode], startVertex, verticesCount );
|
GL.DrawArrays( modeMappings[(int)mode], startVertex, verticesCount );
|
||||||
}
|
}
|
||||||
@ -280,8 +279,13 @@ namespace ClassicalSharp.GraphicsAPI {
|
|||||||
GL.BindBufferARB( BufferTarget.ElementArrayBuffer, ib );
|
GL.BindBufferARB( BufferTarget.ElementArrayBuffer, ib );
|
||||||
}
|
}
|
||||||
|
|
||||||
const DrawElementsType indexType = DrawElementsType.UnsignedShort;
|
const DrawElementsType indexType = DrawElementsType.UnsignedShort;
|
||||||
public override void DrawIndexedVb( DrawMode mode, int indicesCount, int startVertex, int startIndex ) {
|
public override void DrawIndexedVb( DrawMode mode, int indicesCount, int startIndex ) {
|
||||||
|
setupBatchFunc();
|
||||||
|
GL.DrawElements( modeMappings[(int)mode], indicesCount, indexType, new IntPtr( startIndex * 2 ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void DrawIndexedVb_T2fC4b( DrawMode mode, int indicesCount, int startVertex, int startIndex ) {
|
||||||
int offset = startVertex * VertexPos3fTex2fCol4b.Size;
|
int offset = startVertex * VertexPos3fTex2fCol4b.Size;
|
||||||
GL.VertexPointer( 3, PointerType.Float, 24, new IntPtr( offset ) );
|
GL.VertexPointer( 3, PointerType.Float, 24, new IntPtr( offset ) );
|
||||||
GL.ColorPointer( 4, PointerType.UnsignedByte, 24, new IntPtr( offset + 12 ) );
|
GL.ColorPointer( 4, PointerType.UnsignedByte, 24, new IntPtr( offset + 12 ) );
|
||||||
|
@ -47,7 +47,7 @@ namespace ClassicalSharp.Model {
|
|||||||
const float y1 = 0f, y2 = 0.3125f, z2 = 0.0625f, z1 = -0.125f;
|
const float y1 = 0f, y2 = 0.3125f, z2 = 0.0625f, z1 = -0.125f;
|
||||||
YPlane( 32, 0, 3, 3, x2, x1, z1, z2, y1, false ); // bottom feet
|
YPlane( 32, 0, 3, 3, x2, x1, z1, z2, y1, false ); // bottom feet
|
||||||
ZPlane( 36, 3, 1, 5, legX1, legX2, y1, y2, z2, false ); // vertical part of leg
|
ZPlane( 36, 3, 1, 5, legX1, legX2, y1, y2, z2, false ); // vertical part of leg
|
||||||
return new ModelPart( index - 12, 2 * 6, graphics );
|
return new ModelPart( index - 12, 2 * 6 );
|
||||||
}
|
}
|
||||||
|
|
||||||
public override float NameYOffset {
|
public override float NameYOffset {
|
||||||
@ -71,7 +71,7 @@ namespace ClassicalSharp.Model {
|
|||||||
DrawRotate( 0, 0.5625f, -0.1875f, -p.PitchRadians, 0, 0, Head );
|
DrawRotate( 0, 0.5625f, -0.1875f, -p.PitchRadians, 0, 0, Head );
|
||||||
DrawRotate( 0, 0.5625f, -0.1875f, -p.PitchRadians, 0, 0, Head2 );
|
DrawRotate( 0, 0.5625f, -0.1875f, -p.PitchRadians, 0, 0, Head2 );
|
||||||
DrawRotate( 0, 0.5625f, -0.1875f, -p.PitchRadians, 0, 0, Head3 );
|
DrawRotate( 0, 0.5625f, -0.1875f, -p.PitchRadians, 0, 0, Head3 );
|
||||||
Torso.Render( vb );
|
Torso.Render( graphics );
|
||||||
DrawRotate( 0, 0.3125f, 0.0625f, p.leftLegXRot, 0, 0, LeftLeg );
|
DrawRotate( 0, 0.3125f, 0.0625f, p.leftLegXRot, 0, 0, LeftLeg );
|
||||||
DrawRotate( 0, 0.3125f, 0.0625f, p.rightLegXRot, 0, 0, RightLeg );
|
DrawRotate( 0, 0.3125f, 0.0625f, p.rightLegXRot, 0, 0, RightLeg );
|
||||||
DrawRotate( -0.1875f, 0.6875f, 0, 0, 0, -Math.Abs( p.leftArmXRot ), LeftWing );
|
DrawRotate( -0.1875f, 0.6875f, 0, 0, 0, -Math.Abs( p.leftArmXRot ), LeftWing );
|
||||||
|
@ -51,7 +51,7 @@ namespace ClassicalSharp.Model {
|
|||||||
graphics.BindTexture( texId );
|
graphics.BindTexture( texId );
|
||||||
|
|
||||||
DrawRotate( 0, 1.125f, 0, -p.PitchRadians, 0, 0, Head );
|
DrawRotate( 0, 1.125f, 0, -p.PitchRadians, 0, 0, Head );
|
||||||
Torso.Render( vb );
|
Torso.Render( graphics );
|
||||||
DrawRotate( 0, 0.375f, -0.125f, p.leftLegXRot, 0, 0, LeftLegFront );
|
DrawRotate( 0, 0.375f, -0.125f, p.leftLegXRot, 0, 0, LeftLegFront );
|
||||||
DrawRotate( 0, 0.375f, -0.125f, p.rightLegXRot, 0, 0, RightLegFront );
|
DrawRotate( 0, 0.375f, -0.125f, p.rightLegXRot, 0, 0, RightLegFront );
|
||||||
DrawRotate( 0, 0.375f, 0.125f, p.rightLegXRot, 0, 0, LeftLegBack );
|
DrawRotate( 0, 0.375f, 0.125f, p.rightLegXRot, 0, 0, LeftLegBack );
|
||||||
|
@ -28,6 +28,7 @@ namespace ClassicalSharp.Model {
|
|||||||
Matrix4 mat = Matrix4.RotateY( -p.YawRadians ) * Matrix4.Translate( p.Position );
|
Matrix4 mat = Matrix4.RotateY( -p.YawRadians ) * Matrix4.Translate( p.Position );
|
||||||
graphics.MultiplyMatrix( ref mat );
|
graphics.MultiplyMatrix( ref mat );
|
||||||
graphics.BeginVbBatch( VertexFormat.Pos3fTex2fCol4b );
|
graphics.BeginVbBatch( VertexFormat.Pos3fTex2fCol4b );
|
||||||
|
graphics.BindVb( vb );
|
||||||
DrawPlayerModel( p );
|
DrawPlayerModel( p );
|
||||||
graphics.PopMatrix();
|
graphics.PopMatrix();
|
||||||
}
|
}
|
||||||
@ -51,7 +52,7 @@ namespace ClassicalSharp.Model {
|
|||||||
ZPlane( x + sidesW + bodyW + sidesW, y + endsH, bodyW, bodyH, x1, x2, y1, y2, z2, _64x64 ); // back
|
ZPlane( x + sidesW + bodyW + sidesW, y + endsH, bodyW, bodyH, x1, x2, y1, y2, z2, _64x64 ); // back
|
||||||
XPlane( x, y + endsH, sidesW, sidesH, z2, z1, y1, y2, x2, _64x64 ); // left
|
XPlane( x, y + endsH, sidesW, sidesH, z2, z1, y1, y2, x2, _64x64 ); // left
|
||||||
XPlane( x + sidesW + bodyW, y + endsH, sidesW, sidesH, z1, z2, y1, y2, x1, _64x64 ); // right
|
XPlane( x + sidesW + bodyW, y + endsH, sidesW, sidesH, z1, z2, y1, y2, x1, _64x64 ); // right
|
||||||
return new ModelPart( index - 36, 6 * 6, graphics );
|
return new ModelPart( index - 36, 6 * 6 );
|
||||||
}
|
}
|
||||||
|
|
||||||
protected ModelPart MakeRotatedPart( int x, int y, int sidesW, int sidesH, int endsW, int endsH, int bodyW, int bodyH,
|
protected ModelPart MakeRotatedPart( int x, int y, int sidesW, int sidesH, int endsW, int endsH, int bodyW, int bodyH,
|
||||||
@ -70,7 +71,7 @@ namespace ClassicalSharp.Model {
|
|||||||
vertex.Y = z;
|
vertex.Y = z;
|
||||||
vertices[i] = vertex;
|
vertices[i] = vertex;
|
||||||
}
|
}
|
||||||
return new ModelPart( index - 36, 6 * 6, graphics );
|
return new ModelPart( index - 36, 6 * 6 );
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static TextureRectangle SkinTexCoords( int x, int y, int width, int height, float skinWidth, float skinHeight ) {
|
protected static TextureRectangle SkinTexCoords( int x, int y, int width, int height, float skinWidth, float skinHeight ) {
|
||||||
@ -127,7 +128,7 @@ namespace ClassicalSharp.Model {
|
|||||||
}
|
}
|
||||||
mat = Matrix4.Translate( -x, -y, -z ) * mat;
|
mat = Matrix4.Translate( -x, -y, -z ) * mat;
|
||||||
graphics.MultiplyMatrix( ref mat );
|
graphics.MultiplyMatrix( ref mat );
|
||||||
part.Render( vb );
|
part.Render( graphics );
|
||||||
graphics.PopMatrix();
|
graphics.PopMatrix();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,16 +7,14 @@ namespace ClassicalSharp {
|
|||||||
|
|
||||||
public int Offset = 0;
|
public int Offset = 0;
|
||||||
public int Count;
|
public int Count;
|
||||||
public IGraphicsApi Graphics;
|
|
||||||
|
|
||||||
public ModelPart( int offset, int count, IGraphicsApi graphics ) {
|
public ModelPart( int offset, int count ) {
|
||||||
Offset = offset;
|
Offset = offset;
|
||||||
Count = count;
|
Count = count;
|
||||||
Graphics = graphics;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Render( int vb ) {
|
public void Render( IGraphicsApi api ) {
|
||||||
Graphics.DrawVb( DrawMode.Triangles, vb, Offset, Count );
|
api.DrawVb( DrawMode.Triangles, Offset, Count );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -51,7 +51,7 @@ namespace ClassicalSharp.Model {
|
|||||||
graphics.BindTexture( texId );
|
graphics.BindTexture( texId );
|
||||||
|
|
||||||
DrawRotate( 0, 0.75f, -0.375f, -p.PitchRadians, 0, 0, Head );
|
DrawRotate( 0, 0.75f, -0.375f, -p.PitchRadians, 0, 0, Head );
|
||||||
Torso.Render( vb );
|
Torso.Render( graphics );
|
||||||
DrawRotate( 0, 0.375f, -0.3125f, p.leftLegXRot, 0, 0, LeftLegFront );
|
DrawRotate( 0, 0.375f, -0.3125f, p.leftLegXRot, 0, 0, LeftLegFront );
|
||||||
DrawRotate( 0, 0.375f, -0.3125f, p.rightLegXRot, 0, 0, RightLegFront );
|
DrawRotate( 0, 0.375f, -0.3125f, p.rightLegXRot, 0, 0, RightLegFront );
|
||||||
DrawRotate( 0, 0.375f, 0.4375f, p.rightLegXRot, 0, 0, LeftLegBack );
|
DrawRotate( 0, 0.375f, 0.4375f, p.rightLegXRot, 0, 0, LeftLegBack );
|
||||||
|
@ -98,7 +98,7 @@ namespace ClassicalSharp.Model {
|
|||||||
else if( skinType == SkinType.Type64x64Slim ) model = Set64x64Slim;
|
else if( skinType == SkinType.Type64x64Slim ) model = Set64x64Slim;
|
||||||
|
|
||||||
DrawRotate( 0, 1.5f, 0, -p.PitchRadians, 0, 0, model.Head );
|
DrawRotate( 0, 1.5f, 0, -p.PitchRadians, 0, 0, model.Head );
|
||||||
model.Torso.Render( vb );
|
model.Torso.Render( graphics );
|
||||||
DrawRotate( 0, 0.75f, 0, p.leftLegXRot, 0, 0, model.LeftLeg );
|
DrawRotate( 0, 0.75f, 0, p.leftLegXRot, 0, 0, model.LeftLeg );
|
||||||
DrawRotate( 0, 0.75f, 0, p.rightLegXRot, 0, 0, model.RightLeg );
|
DrawRotate( 0, 0.75f, 0, p.rightLegXRot, 0, 0, model.RightLeg );
|
||||||
DrawRotate( 0, 1.5f, 0, p.leftArmXRot, 0, p.leftArmZRot, model.LeftArm );
|
DrawRotate( 0, 1.5f, 0, p.leftArmXRot, 0, p.leftArmZRot, model.LeftArm );
|
||||||
|
@ -75,7 +75,7 @@ namespace ClassicalSharp.Model {
|
|||||||
graphics.BindTexture( texId );
|
graphics.BindTexture( texId );
|
||||||
|
|
||||||
DrawRotate( 0, 1.125f, -0.5f, -p.PitchRadians, 0, 0, Head );
|
DrawRotate( 0, 1.125f, -0.5f, -p.PitchRadians, 0, 0, Head );
|
||||||
Torso.Render( vb );
|
Torso.Render( graphics );
|
||||||
DrawRotate( 0, 0.75f, -0.3125f, p.leftLegXRot, 0, 0, LeftLegFront );
|
DrawRotate( 0, 0.75f, -0.3125f, p.leftLegXRot, 0, 0, LeftLegFront );
|
||||||
DrawRotate( 0, 0.75f, -0.3125f, p.rightLegXRot, 0, 0, RightLegFront );
|
DrawRotate( 0, 0.75f, -0.3125f, p.rightLegXRot, 0, 0, RightLegFront );
|
||||||
DrawRotate( 0, 0.75f, 0.4375f, p.rightLegXRot, 0, 0, LeftLegBack );
|
DrawRotate( 0, 0.75f, 0.4375f, p.rightLegXRot, 0, 0, LeftLegBack );
|
||||||
@ -83,7 +83,7 @@ namespace ClassicalSharp.Model {
|
|||||||
graphics.AlphaTest = true;
|
graphics.AlphaTest = true;
|
||||||
if( Fur ) {
|
if( Fur ) {
|
||||||
graphics.BindTexture( furTextureId );
|
graphics.BindTexture( furTextureId );
|
||||||
FurTorso.Render( vb );
|
FurTorso.Render( graphics );
|
||||||
DrawRotate( 0, 1.125f, -0.5f, -p.PitchRadians, 0, 0, FurHead );
|
DrawRotate( 0, 1.125f, -0.5f, -p.PitchRadians, 0, 0, FurHead );
|
||||||
DrawRotate( 0, 0.75f, -0.3125f, p.leftLegXRot, 0, 0, FurLeftLegFront );
|
DrawRotate( 0, 0.75f, -0.3125f, p.leftLegXRot, 0, 0, FurLeftLegFront );
|
||||||
DrawRotate( 0, 0.75f, -0.3125f, p.rightLegXRot, 0, 0, FurRightLegFront );
|
DrawRotate( 0, 0.75f, -0.3125f, p.rightLegXRot, 0, 0, FurRightLegFront );
|
||||||
|
@ -64,7 +64,7 @@ namespace ClassicalSharp.Model {
|
|||||||
graphics.BindTexture( texId );
|
graphics.BindTexture( texId );
|
||||||
|
|
||||||
DrawRotate( 0, 1.5f, 0, -p.PitchRadians, 0, 0, Head );
|
DrawRotate( 0, 1.5f, 0, -p.PitchRadians, 0, 0, Head );
|
||||||
Torso.Render( vb );
|
Torso.Render( graphics );
|
||||||
DrawRotate( 0, 0.75f, 0, p.leftLegXRot, 0, 0, LeftLeg );
|
DrawRotate( 0, 0.75f, 0, p.leftLegXRot, 0, 0, LeftLeg );
|
||||||
DrawRotate( 0, 0.75f, 0, p.rightLegXRot, 0, 0, RightLeg );
|
DrawRotate( 0, 0.75f, 0, p.rightLegXRot, 0, 0, RightLeg );
|
||||||
DrawRotate( 0, 1.375f, 0, (float)Math.PI / 2, 0, p.leftArmZRot, LeftArm );
|
DrawRotate( 0, 1.375f, 0, (float)Math.PI / 2, 0, p.leftArmZRot, LeftArm );
|
||||||
|
@ -57,8 +57,8 @@ namespace ClassicalSharp.Model {
|
|||||||
graphics.AlphaTest = true;
|
graphics.AlphaTest = true;
|
||||||
|
|
||||||
DrawRotate( 0, 0.5f, -0.1875f, -p.PitchRadians, 0, 0, Head );
|
DrawRotate( 0, 0.5f, -0.1875f, -p.PitchRadians, 0, 0, Head );
|
||||||
Link.Render( vb );
|
Link.Render( graphics );
|
||||||
End.Render( vb );
|
End.Render( graphics );
|
||||||
// TODO: leg animations
|
// TODO: leg animations
|
||||||
DrawRotate( -0.1875f, 0.5f, 0, 0, quarterPi, eighthPi, LeftLeg );
|
DrawRotate( -0.1875f, 0.5f, 0, 0, quarterPi, eighthPi, LeftLeg );
|
||||||
DrawRotate( -0.1875f, 0.5f, 0, 0, eighthPi, eighthPi, LeftLeg );
|
DrawRotate( -0.1875f, 0.5f, 0, 0, eighthPi, eighthPi, LeftLeg );
|
||||||
|
@ -63,7 +63,7 @@ namespace ClassicalSharp.Model {
|
|||||||
graphics.BindTexture( texId );
|
graphics.BindTexture( texId );
|
||||||
|
|
||||||
DrawRotate( 0, 1.5f, 0, -p.PitchRadians, 0, 0, Head );
|
DrawRotate( 0, 1.5f, 0, -p.PitchRadians, 0, 0, Head );
|
||||||
Torso.Render( vb );
|
Torso.Render( graphics );
|
||||||
DrawRotate( 0, 0.75f, 0, p.leftLegXRot, 0, 0, LeftLeg );
|
DrawRotate( 0, 0.75f, 0, p.leftLegXRot, 0, 0, LeftLeg );
|
||||||
DrawRotate( 0, 0.75f, 0, p.rightLegXRot, 0, 0, RightLeg );
|
DrawRotate( 0, 0.75f, 0, p.rightLegXRot, 0, 0, RightLeg );
|
||||||
DrawRotate( 0, 1.375f, 0, (float)Math.PI / 2, 0, p.leftArmZRot, LeftArm );
|
DrawRotate( 0, 1.375f, 0, (float)Math.PI / 2, 0, p.leftArmZRot, LeftArm );
|
||||||
|
@ -46,7 +46,7 @@ namespace ClassicalSharp {
|
|||||||
Graphics.BindTexture( sideTexId );
|
Graphics.BindTexture( sideTexId );
|
||||||
Graphics.BeginVbBatch( VertexFormat.Pos3fTex2fCol4b );
|
Graphics.BeginVbBatch( VertexFormat.Pos3fTex2fCol4b );
|
||||||
Graphics.BindVb( sidesVb );
|
Graphics.BindVb( sidesVb );
|
||||||
Graphics.DrawIndexedVb( DrawMode.Triangles, sidesIndices, 0, 0 );
|
Graphics.DrawIndexedVb_T2fC4b( DrawMode.Triangles, sidesIndices, 0, 0 );
|
||||||
|
|
||||||
// Do not draw water when we cannot see it.
|
// Do not draw water when we cannot see it.
|
||||||
// Fixes 'depth bleeding through' issues with 16 bit depth buffers on large maps.
|
// Fixes 'depth bleeding through' issues with 16 bit depth buffers on large maps.
|
||||||
@ -54,7 +54,7 @@ namespace ClassicalSharp {
|
|||||||
Graphics.AlphaBlending = true;
|
Graphics.AlphaBlending = true;
|
||||||
Graphics.BindTexture( edgeTexId );
|
Graphics.BindTexture( edgeTexId );
|
||||||
Graphics.BindVb( edgesVb );
|
Graphics.BindVb( edgesVb );
|
||||||
Graphics.DrawIndexedVb( DrawMode.Triangles, edgesIndices, 0, 0 );
|
Graphics.DrawIndexedVb_T2fC4b( DrawMode.Triangles, edgesIndices, 0, 0 );
|
||||||
Graphics.AlphaBlending = false;
|
Graphics.AlphaBlending = false;
|
||||||
}
|
}
|
||||||
Graphics.Texturing = false;
|
Graphics.Texturing = false;
|
||||||
|
@ -21,7 +21,7 @@ namespace ClassicalSharp {
|
|||||||
DrawPart( info, ref part );
|
DrawPart( info, ref part );
|
||||||
|
|
||||||
if( part.spriteCount > 0 )
|
if( part.spriteCount > 0 )
|
||||||
api.DrawIndexedVb( mode, part.spriteCount, 0, 0 );
|
api.DrawIndexedVb_T2fC4b( mode, part.spriteCount, 0, 0 );
|
||||||
game.Vertices += part.IndicesCount;
|
game.Vertices += part.IndicesCount;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -60,51 +60,51 @@ namespace ClassicalSharp {
|
|||||||
|
|
||||||
if( drawLeft && drawRight ) {
|
if( drawLeft && drawRight ) {
|
||||||
api.FaceCulling = true;
|
api.FaceCulling = true;
|
||||||
api.DrawIndexedVb( mode, part.leftCount + part.rightCount, 0, part.leftIndex );
|
api.DrawIndexedVb_T2fC4b( mode, part.leftCount + part.rightCount, 0, part.leftIndex );
|
||||||
api.FaceCulling = false;
|
api.FaceCulling = false;
|
||||||
} else if( drawLeft ) {
|
} else if( drawLeft ) {
|
||||||
api.DrawIndexedVb( mode, part.leftCount, 0, part.leftIndex );
|
api.DrawIndexedVb_T2fC4b( mode, part.leftCount, 0, part.leftIndex );
|
||||||
} else if( drawRight ) {
|
} else if( drawRight ) {
|
||||||
api.DrawIndexedVb( mode, part.rightCount, 0, part.rightIndex );
|
api.DrawIndexedVb_T2fC4b( mode, part.rightCount, 0, part.rightIndex );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( drawFront && drawBack ) {
|
if( drawFront && drawBack ) {
|
||||||
api.FaceCulling = true;
|
api.FaceCulling = true;
|
||||||
api.DrawIndexedVb( mode, part.frontCount + part.backCount, 0, part.frontIndex );
|
api.DrawIndexedVb_T2fC4b( mode, part.frontCount + part.backCount, 0, part.frontIndex );
|
||||||
api.FaceCulling = false;
|
api.FaceCulling = false;
|
||||||
} else if( drawFront ) {
|
} else if( drawFront ) {
|
||||||
api.DrawIndexedVb( mode, part.frontCount, 0, part.frontIndex );
|
api.DrawIndexedVb_T2fC4b( mode, part.frontCount, 0, part.frontIndex );
|
||||||
} else if( drawBack ) {
|
} else if( drawBack ) {
|
||||||
api.DrawIndexedVb( mode, part.backCount, 0, part.backIndex );
|
api.DrawIndexedVb_T2fC4b( mode, part.backCount, 0, part.backIndex );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( drawBottom && drawTop ) {
|
if( drawBottom && drawTop ) {
|
||||||
api.FaceCulling = true;
|
api.FaceCulling = true;
|
||||||
if( part.IndicesCount > maxIndices ) {
|
if( part.IndicesCount > maxIndices ) {
|
||||||
int part1Count = maxIndices - part.bottomIndex;
|
int part1Count = maxIndices - part.bottomIndex;
|
||||||
api.DrawIndexedVb( mode, part1Count, 0, part.bottomIndex );
|
api.DrawIndexedVb_T2fC4b( mode, part1Count, 0, part.bottomIndex );
|
||||||
api.DrawIndexedVb( mode, part.bottomCount + part.topCount - part1Count, maxVertex, 0 );
|
api.DrawIndexedVb_T2fC4b( mode, part.bottomCount + part.topCount - part1Count, maxVertex, 0 );
|
||||||
} else {
|
} else {
|
||||||
api.DrawIndexedVb( mode, part.bottomCount + part.topCount, 0, part.bottomIndex );
|
api.DrawIndexedVb_T2fC4b( mode, part.bottomCount + part.topCount, 0, part.bottomIndex );
|
||||||
}
|
}
|
||||||
api.FaceCulling = false;
|
api.FaceCulling = false;
|
||||||
} else if( drawBottom ) {
|
} else if( drawBottom ) {
|
||||||
int part1Count;
|
int part1Count;
|
||||||
if( part.IndicesCount > maxIndices &&
|
if( part.IndicesCount > maxIndices &&
|
||||||
( part1Count = maxIndices - part.bottomIndex ) < part.bottomCount ) {
|
( part1Count = maxIndices - part.bottomIndex ) < part.bottomCount ) {
|
||||||
api.DrawIndexedVb( mode, part1Count, 0, part.bottomIndex );
|
api.DrawIndexedVb_T2fC4b( mode, part1Count, 0, part.bottomIndex );
|
||||||
api.DrawIndexedVb( mode, part.bottomCount - part1Count, maxVertex, 0 );
|
api.DrawIndexedVb_T2fC4b( mode, part.bottomCount - part1Count, maxVertex, 0 );
|
||||||
} else {
|
} else {
|
||||||
api.DrawIndexedVb( mode, part.bottomCount, 0, part.bottomIndex );
|
api.DrawIndexedVb_T2fC4b( mode, part.bottomCount, 0, part.bottomIndex );
|
||||||
}
|
}
|
||||||
} else if( drawTop ) {
|
} else if( drawTop ) {
|
||||||
int part1Count;
|
int part1Count;
|
||||||
if( part.IndicesCount > maxIndices &&
|
if( part.IndicesCount > maxIndices &&
|
||||||
( part1Count = maxIndices - part.topIndex ) < part.topCount ) {
|
( part1Count = maxIndices - part.topIndex ) < part.topCount ) {
|
||||||
api.DrawIndexedVb( mode, part1Count, 0, part.topIndex );
|
api.DrawIndexedVb_T2fC4b( mode, part1Count, 0, part.topIndex );
|
||||||
api.DrawIndexedVb( mode, part.topCount - part1Count, maxVertex, 0 );
|
api.DrawIndexedVb_T2fC4b( mode, part.topCount - part1Count, maxVertex, 0 );
|
||||||
} else {
|
} else {
|
||||||
api.DrawIndexedVb( mode, part.topCount, 0, part.topIndex );
|
api.DrawIndexedVb_T2fC4b( mode, part.topCount, 0, part.topIndex );
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -30,7 +30,7 @@ namespace ClassicalSharp.Renderers {
|
|||||||
if( pos.Y < Map.Height + skyOffset ) {
|
if( pos.Y < Map.Height + skyOffset ) {
|
||||||
Graphics.BeginVbBatch( VertexFormat.Pos3fCol4b );
|
Graphics.BeginVbBatch( VertexFormat.Pos3fCol4b );
|
||||||
Graphics.BindVb( skyVb );
|
Graphics.BindVb( skyVb );
|
||||||
Graphics.DrawIndexedVb( DrawMode.Triangles, skyIndices, 0, 0 );
|
Graphics.DrawIndexedVb( DrawMode.Triangles, skyIndices, 0 );
|
||||||
}
|
}
|
||||||
RenderClouds( deltaTime );
|
RenderClouds( deltaTime );
|
||||||
ResetFog();
|
ResetFog();
|
||||||
@ -100,7 +100,7 @@ namespace ClassicalSharp.Renderers {
|
|||||||
Graphics.BindTexture( cloudTexture );
|
Graphics.BindTexture( cloudTexture );
|
||||||
Graphics.BeginVbBatch( VertexFormat.Pos3fTex2fCol4b );
|
Graphics.BeginVbBatch( VertexFormat.Pos3fTex2fCol4b );
|
||||||
Graphics.BindVb( cloudsVb );
|
Graphics.BindVb( cloudsVb );
|
||||||
Graphics.DrawIndexedVb( DrawMode.Triangles, cloudsIndices, 0, 0 );
|
Graphics.DrawIndexedVb_T2fC4b( DrawMode.Triangles, cloudsIndices, 0, 0 );
|
||||||
Graphics.AlphaTest = false;
|
Graphics.AlphaTest = false;
|
||||||
Graphics.Texturing = false;
|
Graphics.Texturing = false;
|
||||||
|
|
||||||
|
@ -7,8 +7,8 @@ namespace ClassicalSharp.Selections {
|
|||||||
public class SelectionBox {
|
public class SelectionBox {
|
||||||
|
|
||||||
public short ID;
|
public short ID;
|
||||||
public const int VerticesCount = 6 * 6, LineVerticesCount = 12 * 2;
|
const int VerticesCount = 6 * 4, LineVerticesCount = 12 * 2, IndicesCount = 6 * 6;
|
||||||
public int Vb, LineVb;
|
public int Vb;
|
||||||
public IGraphicsApi Graphics;
|
public IGraphicsApi Graphics;
|
||||||
|
|
||||||
public Vector3I Min, Max;
|
public Vector3I Min, Max;
|
||||||
@ -19,48 +19,46 @@ namespace ClassicalSharp.Selections {
|
|||||||
|
|
||||||
public void Render( double delta ) {
|
public void Render( double delta ) {
|
||||||
Graphics.DepthWrite = false;
|
Graphics.DepthWrite = false;
|
||||||
Graphics.DrawVb( DrawMode.Triangles, Vb, 0, VerticesCount );
|
Graphics.BindVb( Vb );
|
||||||
|
Graphics.DrawIndexedVb( DrawMode.Triangles, IndicesCount, 0 );
|
||||||
Graphics.DepthWrite = true;
|
Graphics.DepthWrite = true;
|
||||||
Graphics.DrawVb( DrawMode.Lines, LineVb, 0, LineVerticesCount );
|
Graphics.DrawVb( DrawMode.Lines, VerticesCount, LineVerticesCount );
|
||||||
}
|
}
|
||||||
|
|
||||||
static VertexPos3fCol4b[] vertices = new VertexPos3fCol4b[VerticesCount];
|
static VertexPos3fCol4b[] vertices = new VertexPos3fCol4b[VerticesCount + LineVerticesCount];
|
||||||
public SelectionBox( Vector3I start, Vector3I end, FastColour col, IGraphicsApi graphics ) {
|
public SelectionBox( Vector3I start, Vector3I end, FastColour col, IGraphicsApi graphics ) {
|
||||||
Graphics = graphics;
|
Graphics = graphics;
|
||||||
|
|
||||||
Min = Vector3I.Min( start, end );
|
Min = Vector3I.Min( start, end );
|
||||||
Max = Vector3I.Max( start, end );
|
Max = Vector3I.Max( start, end );
|
||||||
|
|
||||||
int index = 0;
|
int index = 0;
|
||||||
Vector3 p1 = (Vector3)Min + new Vector3( 0.0625f, 0.0625f, 0.0625f );
|
Vector3 p1 = (Vector3)Min + new Vector3( 0.0625f, 0.0625f, 0.0625f );
|
||||||
Vector3 p2 = (Vector3)Max - new Vector3( 0.0625f, 0.0625f, 0.0625f );
|
Vector3 p2 = (Vector3)Max - new Vector3( 0.0625f, 0.0625f, 0.0625f );
|
||||||
|
|
||||||
FastColour lineCol = new FastColour( (byte)~col.R, (byte)~col.G, (byte)~col.B );
|
|
||||||
// bottom face
|
|
||||||
Line( ref index, p1.X, p1.Y, p1.Z, p2.X, p1.Y, p1.Z, lineCol );
|
|
||||||
Line( ref index, p2.X, p1.Y, p1.Z, p2.X, p1.Y, p2.Z, lineCol );
|
|
||||||
Line( ref index, p2.X, p1.Y, p2.Z, p1.X, p1.Y, p2.Z, lineCol );
|
|
||||||
Line( ref index, p1.X, p1.Y, p2.Z, p1.X, p1.Y, p1.Z, lineCol );
|
|
||||||
// top face
|
|
||||||
Line( ref index, p1.X, p2.Y, p1.Z, p2.X, p2.Y, p1.Z, lineCol );
|
|
||||||
Line( ref index, p2.X, p2.Y, p1.Z, p2.X, p2.Y, p2.Z, lineCol );
|
|
||||||
Line( ref index, p2.X, p2.Y, p2.Z, p1.X, p2.Y, p2.Z, lineCol );
|
|
||||||
Line( ref index, p1.X, p2.Y, p2.Z, p1.X, p2.Y, p1.Z, lineCol );
|
|
||||||
// side faces
|
|
||||||
Line( ref index, p1.X, p1.Y, p1.Z, p1.X, p2.Y, p1.Z, lineCol );
|
|
||||||
Line( ref index, p2.X, p1.Y, p1.Z, p2.X, p2.Y, p1.Z, lineCol );
|
|
||||||
Line( ref index, p2.X, p1.Y, p2.Z, p2.X, p2.Y, p2.Z, lineCol );
|
|
||||||
Line( ref index, p1.X, p1.Y, p2.Z, p1.X, p2.Y, p2.Z, lineCol );
|
|
||||||
LineVb = Graphics.CreateVb( vertices, VertexFormat.Pos3fCol4b, LineVerticesCount );
|
|
||||||
|
|
||||||
index = 0;
|
|
||||||
RenderYPlane( ref index, p1.X, p1.Z, p2.X, p2.Z, p1.Y, col ); // bottom
|
RenderYPlane( ref index, p1.X, p1.Z, p2.X, p2.Z, p1.Y, col ); // bottom
|
||||||
RenderYPlane( ref index, p1.X, p1.Z, p2.X, p2.Z, p2.Y, col ); // top
|
RenderYPlane( ref index, p1.X, p1.Z, p2.X, p2.Z, p2.Y, col ); // top
|
||||||
RenderXPlane( ref index, p1.X, p2.X, p1.Y, p2.Y, p1.Z, col ); // sides
|
RenderXPlane( ref index, p1.X, p2.X, p1.Y, p2.Y, p1.Z, col ); // sides
|
||||||
RenderXPlane( ref index, p1.X, p2.X, p1.Y, p2.Y, p2.Z, col );
|
RenderXPlane( ref index, p1.X, p2.X, p1.Y, p2.Y, p2.Z, col );
|
||||||
RenderZPlane( ref index, p1.Z, p2.Z, p1.Y, p2.Y, p1.X, col );
|
RenderZPlane( ref index, p1.Z, p2.Z, p1.Y, p2.Y, p1.X, col );
|
||||||
RenderZPlane( ref index, p1.Z, p2.Z, p1.Y, p2.Y, p2.X, col );
|
RenderZPlane( ref index, p1.Z, p2.Z, p1.Y, p2.Y, p2.X, col );
|
||||||
Vb = Graphics.CreateVb( vertices, VertexFormat.Pos3fCol4b, VerticesCount );
|
|
||||||
|
col = new FastColour( (byte)~col.R, (byte)~col.G, (byte)~col.B );
|
||||||
|
// bottom face
|
||||||
|
Line( ref index, p1.X, p1.Y, p1.Z, p2.X, p1.Y, p1.Z, col );
|
||||||
|
Line( ref index, p2.X, p1.Y, p1.Z, p2.X, p1.Y, p2.Z, col );
|
||||||
|
Line( ref index, p2.X, p1.Y, p2.Z, p1.X, p1.Y, p2.Z, col );
|
||||||
|
Line( ref index, p1.X, p1.Y, p2.Z, p1.X, p1.Y, p1.Z, col );
|
||||||
|
// top face
|
||||||
|
Line( ref index, p1.X, p2.Y, p1.Z, p2.X, p2.Y, p1.Z, col );
|
||||||
|
Line( ref index, p2.X, p2.Y, p1.Z, p2.X, p2.Y, p2.Z, col );
|
||||||
|
Line( ref index, p2.X, p2.Y, p2.Z, p1.X, p2.Y, p2.Z, col );
|
||||||
|
Line( ref index, p1.X, p2.Y, p2.Z, p1.X, p2.Y, p1.Z, col );
|
||||||
|
// side faces
|
||||||
|
Line( ref index, p1.X, p1.Y, p1.Z, p1.X, p2.Y, p1.Z, col );
|
||||||
|
Line( ref index, p2.X, p1.Y, p1.Z, p2.X, p2.Y, p1.Z, col );
|
||||||
|
Line( ref index, p2.X, p1.Y, p2.Z, p2.X, p2.Y, p2.Z, col );
|
||||||
|
Line( ref index, p1.X, p1.Y, p2.Z, p1.X, p2.Y, p2.Z, col );
|
||||||
|
|
||||||
|
Vb = Graphics.CreateVb( vertices, VertexFormat.Pos3fCol4b, VerticesCount + LineVerticesCount );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Line( ref int index, float x1, float y1, float z1, float x2, float y2, float z2, FastColour col ) {
|
void Line( ref int index, float x1, float y1, float z1, float x2, float y2, float z2, FastColour col ) {
|
||||||
@ -71,35 +69,25 @@ namespace ClassicalSharp.Selections {
|
|||||||
void RenderZPlane( ref int index, float z1, float z2, float y1, float y2, float x, FastColour col ) {
|
void RenderZPlane( ref int index, float z1, float z2, float y1, float y2, float x, FastColour col ) {
|
||||||
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 RenderXPlane( ref int index, float x1, float x2, float y1, float y2, float z, FastColour col ) {
|
void RenderXPlane( ref int index, float x1, float x2, float y1, float y2, float z, FastColour col ) {
|
||||||
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 RenderYPlane( ref int index, float x1, float z1, float x2, float z2, float y, FastColour col ) {
|
void RenderYPlane( ref int index, float x1, float z1, float x2, float z2, float y, FastColour col ) {
|
||||||
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 );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Dispose() {
|
public void Dispose() {
|
||||||
Graphics.DeleteVb( LineVb );
|
|
||||||
Graphics.DeleteVb( Vb );
|
Graphics.DeleteVb( Vb );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user