diff --git a/ClassicalSharp.csproj b/ClassicalSharp.csproj index 7a11ce02d..d474cd23c 100644 --- a/ClassicalSharp.csproj +++ b/ClassicalSharp.csproj @@ -113,6 +113,7 @@ + diff --git a/Model/ChickenModel.cs b/Model/ChickenModel.cs new file mode 100644 index 000000000..3d38fd3b1 --- /dev/null +++ b/Model/ChickenModel.cs @@ -0,0 +1,110 @@ +using OpenTK; +using System; +using System.Drawing; +using ClassicalSharp.GraphicsAPI; +using ClassicalSharp.Renderers; + +namespace ClassicalSharp.Model { + + public class ChickenModel : IModel { + + ModelSet Set; + public ChickenModel( Game window ) : base( window ) { + vertices = new VertexPos3fTex2fCol4b[6 * 6]; + Set = new ModelSet(); + Set.Head = MakeHead(); + Set.Head2 = MakeHead2(); // TODO: Find a more appropriate name. + Set.Head3 = MakeHead3(); + Set.Torso = MakeTorso(); + Set.LeftLegFront = MakeLeg( -0.1875f, 0f, -0.125f, -0.0625f ); + Set.RightLegFront = MakeLeg( 0f, 0.1875f, 0.0625f, 0.125f ); + vertices = null; + + DefaultSkinTextureId = graphics.LoadTexture( "chicken.png" ); + } + + ModelPart MakeHead() { + return MakePart( 0, 0, 3, 6, 4, 3, 4, 6, -0.125f, 0.125f, 0.5625f, 0.9375f, -0.375f, -0.1875f, false ); + } + + ModelPart MakeHead2() { + return MakePart( 14, 4, 2, 2, 2, 2, 2, 2, -0.0625f, 0.0625f, 0.5625f, 0.6875f, -0.4375f, -0.3125f, false ); + } + + ModelPart MakeHead3() { + return MakePart( 14, 0, 2, 2, 4, 2, 4, 2, -0.125f, 0.125f, 0.6875f, 0.8125f, -0.5f, -0.375f, false ); + } + + ModelPart MakeTorso() { + index = 0; + const float x1 = -0.1875f, x2 = 0.1875f, y1 = 0.3125f, y2 = 0.6875f, z1 = -0.25f, z2 = 0.25f; + + YPlane( 18, 15, 6, 8, x1, x2, z1, z2, y2, false ); // top + YPlane( 6, 15, 6, 8, x2, x1, z1, z2, y1, false ); // bottom + ZPlane( 6, 9, 6, 6, x2, x1, y1, y2, z1, false ); // front + ZPlane( 12, 9, 6, 6, x2, x1, y2, y1, z2, false ); // back + XPlane( 12, 15, 6, 8, y1, y2, z2, z1, x1, false ); // left + XPlane( 0, 15, 6, 8, y2, y1, z2, z1, x2, false ); // right + // rotate left and right 90 degrees + for( int i = index - 12; i < index; i++ ) { + VertexPos3fTex2fCol4b vertex = vertices[i]; + float z = vertex.Z; + vertex.Z = vertex.Y; + vertex.Y = z; + vertices[i] = vertex; + } + return new ModelPart( vertices, 6 * 6, graphics ); + } + + ModelPart MakeLeg( float x1, float x2, float legX1, float legX2 ) { + index = 0; + 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 + ZPlane( 36, 3, 1, 5, legX1, legX2, y1, y2, z2, false ); // vertical part of leg + return new ModelPart( vertices, 2 * 6, graphics ); + } + + public override float NameYOffset { + get { return 1.075f; } + } + + protected override void DrawPlayerModel( Player player, PlayerRenderer renderer ) { + graphics.Texturing = true; + int texId = DefaultSkinTextureId; + graphics.Bind2DTexture( texId ); + graphics.AlphaTest = true; + + DrawRotateX( 0, 0.5625f, -0.1875f, -pitch, Set.Head ); + DrawRotateX( 0, 0.5625f, -0.1875f, -pitch, Set.Head2 ); + DrawRotateX( 0, 0.5625f, -0.1875f, -pitch, Set.Head3 ); + Set.Torso.Render(); + DrawRotateX( 0, 0.3125f, 0.0625f, leftLegXRot, Set.LeftLegFront ); + DrawRotateX( 0, 0.3125f, 0.0625f, rightLegXRot, Set.RightLegFront ); + graphics.Texturing = false; + graphics.AlphaTest = false; + Vector3[] vertices = { new Vector3( 0, -2, 0 ), new Vector3( 0, 2, 0 ) }; + graphics.DrawVertices( DrawMode.Lines, vertices ); + graphics.AlphaTest = true; + graphics.Texturing = true; + } + + public override void Dispose() { + Set.Dispose(); + graphics.DeleteTexture( DefaultSkinTextureId ); + } + + class ModelSet { + + public ModelPart Head, Head2, Head3, Torso, LeftLegFront, RightLegFront; + + public void Dispose() { + RightLegFront.Dispose(); + LeftLegFront.Dispose(); + Torso.Dispose(); + Head.Dispose(); + Head2.Dispose(); + Head3.Dispose(); + } + } + } +} \ No newline at end of file diff --git a/Model/CreeperModel.cs b/Model/CreeperModel.cs index bf15315d1..130980bfe 100644 --- a/Model/CreeperModel.cs +++ b/Model/CreeperModel.cs @@ -39,26 +39,7 @@ namespace ClassicalSharp.Model { get { return 1.7f; } } - Vector3 pos; - float yaw, pitch; - float leftLegXRot, rightLegXRot; - - public override void RenderModel( Player player, PlayerRenderer renderer ) { - pos = player.Position; - yaw = player.YawDegrees; - pitch = player.PitchDegrees; - - leftLegXRot = player.leftLegXRot * 180 / (float)Math.PI; - rightLegXRot = player.rightLegXRot * 180 / (float)Math.PI; - - graphics.PushMatrix(); - graphics.Translate( pos.X, pos.Y, pos.Z ); - graphics.RotateY( -yaw ); - DrawPlayerModel( player, renderer ); - graphics.PopMatrix(); - } - - private void DrawPlayerModel( Player player, PlayerRenderer renderer ) { + protected override void DrawPlayerModel( Player player, PlayerRenderer renderer ) { graphics.Texturing = true; int texId = DefaultSkinTextureId; graphics.Bind2DTexture( texId ); diff --git a/Model/IModel.cs b/Model/IModel.cs index 178fcab79..906a2ff3d 100644 --- a/Model/IModel.cs +++ b/Model/IModel.cs @@ -17,7 +17,30 @@ namespace ClassicalSharp.Model { public abstract float NameYOffset { get; } - public abstract void RenderModel( Player player, PlayerRenderer renderer ); + protected Vector3 pos; + protected float yaw, pitch; + protected float rightLegXRot, rightArmXRot, rightArmZRot; + protected float leftLegXRot, leftArmXRot, leftArmZRot; + public void RenderModel( Player player, PlayerRenderer renderer ) { + pos = player.Position; + yaw = player.YawDegrees; + pitch = player.PitchDegrees; + + leftLegXRot = player.leftLegXRot * 180 / (float)Math.PI; + leftArmXRot = player.leftArmXRot * 180 / (float)Math.PI; + leftArmZRot = player.leftArmZRot * 180 / (float)Math.PI; + rightLegXRot = player.rightLegXRot * 180 / (float)Math.PI; + rightArmXRot = player.rightArmXRot * 180 / (float)Math.PI; + rightArmZRot = player.rightArmZRot * 180 / (float)Math.PI; + + graphics.PushMatrix(); + graphics.Translate( pos.X, pos.Y, pos.Z ); + graphics.RotateY( -yaw ); + DrawPlayerModel( player, renderer ); + graphics.PopMatrix(); + } + + protected abstract void DrawPlayerModel( Player player, PlayerRenderer renderer ); public abstract void Dispose(); @@ -36,7 +59,7 @@ namespace ClassicalSharp.Model { ZPlane( x + sidesW + bodyW + sidesW, y + endsH, bodyW, bodyH, x1, x2, y1, y2, z2, _64x64 ); // back XPlane( x + sidesW + bodyW, y + endsH, sidesW, sidesH, z1, z2, y1, y2, x1, _64x64 ); // left XPlane( x, y + endsH, sidesW, sidesH, z2, z1, y1, y2, x2, _64x64 ); // right - return new ModelPart( vertices, graphics ); + return new ModelPart( vertices, 6 * 6, graphics ); } protected static TextureRectangle SkinTexCoords( int x, int y, int width, int height, float skinWidth, float skinHeight ) { diff --git a/Model/ModelPart.cs b/Model/ModelPart.cs index 6143631d4..e9e9540ec 100644 --- a/Model/ModelPart.cs +++ b/Model/ModelPart.cs @@ -9,10 +9,10 @@ namespace ClassicalSharp { public int Count; public IGraphicsApi Graphics; - public ModelPart( VertexPos3fTex2fCol4b[] vertices, IGraphicsApi graphics ) { - Count = vertices.Length; + public ModelPart( VertexPos3fTex2fCol4b[] vertices, int count, IGraphicsApi graphics ) { + Count = count; Graphics = graphics; - VbId = Graphics.InitVb( vertices, DrawMode.Triangles, VertexFormat.VertexPos3fTex2fCol4b ); + VbId = Graphics.InitVb( vertices, DrawMode.Triangles, VertexFormat.VertexPos3fTex2fCol4b, count ); } public void Render() { diff --git a/Model/PigModel.cs b/Model/PigModel.cs index 0ae784be7..de8908141 100644 --- a/Model/PigModel.cs +++ b/Model/PigModel.cs @@ -35,7 +35,7 @@ namespace ClassicalSharp.Model { YPlane( 54, 16, 10, 16, x1, x2, z1, z2, y2, false ); // top YPlane( 36, 16, 10, 16, x2, x1, z1, z2, y1, false ); // bottom ZPlane( 36, 8, 10, 8, x2, x1, y1, y2, z1, false ); // front - ZPlane( 46, 8, 10, 8, x1, x2, y1, y2, z2, false ); // back + ZPlane( 46, 8, 10, 8, x2, x1, y2, y1, z2, false ); // back XPlane( 46, 16, 8, 16, y1, y2, z2, z1, x1, false ); // left XPlane( 28, 16, 8, 16, y2, y1, z2, z1, x2, false ); // right // rotate left and right 90 degrees @@ -46,7 +46,7 @@ namespace ClassicalSharp.Model { vertex.Y = z; vertices[i] = vertex; } - return new ModelPart( vertices, graphics ); + return new ModelPart( vertices, 6 * 6, graphics ); } ModelPart MakeLeg( float x1, float x2, float z1, float z2 ) { @@ -57,26 +57,7 @@ namespace ClassicalSharp.Model { get { return 1.075f; } } - Vector3 pos; - float yaw, pitch; - float leftLegXRot, rightLegXRot; - - public override void RenderModel( Player player, PlayerRenderer renderer ) { - pos = player.Position; - yaw = player.YawDegrees; - pitch = player.PitchDegrees; - - leftLegXRot = player.leftLegXRot * 180 / (float)Math.PI; - rightLegXRot = player.rightLegXRot * 180 / (float)Math.PI; - - graphics.PushMatrix(); - graphics.Translate( pos.X, pos.Y, pos.Z ); - graphics.RotateY( -yaw ); - DrawPlayerModel( player, renderer ); - graphics.PopMatrix(); - } - - private void DrawPlayerModel( Player player, PlayerRenderer renderer ) { + protected override void DrawPlayerModel( Player player, PlayerRenderer renderer ) { graphics.Texturing = true; int texId = DefaultSkinTextureId; graphics.Bind2DTexture( texId ); diff --git a/Model/PlayerModel.cs b/Model/PlayerModel.cs index 4358b8501..91f89eaff 100644 --- a/Model/PlayerModel.cs +++ b/Model/PlayerModel.cs @@ -77,41 +77,16 @@ namespace ClassicalSharp.Model { get { return 2.1375f; } } - Vector3 pos; - float yaw, pitch; ModelSet model; - float rightLegXRot, rightArmXRot, rightArmZRot; - float leftLegXRot, leftArmXRot, leftArmZRot; - - public override void RenderModel( Player player, PlayerRenderer renderer ) { - pos = player.Position; - yaw = player.YawDegrees; - pitch = player.PitchDegrees; - - leftLegXRot = player.leftLegXRot * 180 / (float)Math.PI; - leftArmXRot = player.leftArmXRot * 180 / (float)Math.PI; - leftArmZRot = player.leftArmZRot * 180 / (float)Math.PI; - rightLegXRot = player.rightLegXRot * 180 / (float)Math.PI; - rightArmXRot = player.rightArmXRot * 180 / (float)Math.PI; - rightArmZRot = player.rightArmZRot * 180 / (float)Math.PI; - + protected override void DrawPlayerModel( Player player, PlayerRenderer renderer ) { + graphics.Texturing = true; + int texId = renderer.TextureId <= 0 ? DefaultSkinTextureId : renderer.TextureId; + graphics.Bind2DTexture( texId ); model = Set64x32; SkinType skinType = player.SkinType; if( skinType == SkinType.Type64x64 ) model = Set64x64; else if( skinType == SkinType.Type64x64Slim ) model = Set64x64Slim; - graphics.PushMatrix(); - graphics.Translate( pos.X, pos.Y, pos.Z ); - graphics.RotateY( -yaw ); - DrawPlayerModel( player, renderer ); - graphics.PopMatrix(); - } - - private void DrawPlayerModel( Player player, PlayerRenderer renderer ) { - graphics.Texturing = true; - int texId = renderer.TextureId <= 0 ? DefaultSkinTextureId : renderer.TextureId; - graphics.Bind2DTexture( texId ); - DrawRotateX( 0, 1.5f, 0, -pitch, model.Head ); model.Torso.Render(); DrawRotateX( 0, 0.75f, 0, leftLegXRot, model.LeftLeg ); diff --git a/Model/SkeletonModel.cs b/Model/SkeletonModel.cs index 09686e3df..1bcecb697 100644 --- a/Model/SkeletonModel.cs +++ b/Model/SkeletonModel.cs @@ -51,29 +51,7 @@ namespace ClassicalSharp.Model { get { return 2.075f; } } - Vector3 pos; - float yaw, pitch; - float rightLegXRot, rightArmZRot; - float leftLegXRot, leftArmZRot; - - public override void RenderModel( Player player, PlayerRenderer renderer ) { - pos = player.Position; - yaw = player.YawDegrees; - pitch = player.PitchDegrees; - - leftLegXRot = player.leftLegXRot * 180 / (float)Math.PI; - leftArmZRot = player.leftArmZRot * 180 / (float)Math.PI; - rightLegXRot = player.rightLegXRot * 180 / (float)Math.PI; - rightArmZRot = player.rightArmZRot * 180 / (float)Math.PI; - - graphics.PushMatrix(); - graphics.Translate( pos.X, pos.Y, pos.Z ); - graphics.RotateY( -yaw ); - DrawPlayerModel( player, renderer ); - graphics.PopMatrix(); - } - - private void DrawPlayerModel( Player player, PlayerRenderer renderer ) { + protected override void DrawPlayerModel( Player player, PlayerRenderer renderer ) { graphics.Texturing = true; graphics.AlphaTest = true; int texId = DefaultSkinTextureId; diff --git a/Model/ZombieModel.cs b/Model/ZombieModel.cs index 761e3e7d7..e2fb4ac3a 100644 --- a/Model/ZombieModel.cs +++ b/Model/ZombieModel.cs @@ -51,29 +51,7 @@ namespace ClassicalSharp.Model { get { return 2.075f; } } - Vector3 pos; - float yaw, pitch; - float rightLegXRot, rightArmZRot; - float leftLegXRot, leftArmZRot; - - public override void RenderModel( Player player, PlayerRenderer renderer ) { - pos = player.Position; - yaw = player.YawDegrees; - pitch = player.PitchDegrees; - - leftLegXRot = player.leftLegXRot * 180 / (float)Math.PI; - leftArmZRot = player.leftArmZRot * 180 / (float)Math.PI; - rightLegXRot = player.rightLegXRot * 180 / (float)Math.PI; - rightArmZRot = player.rightArmZRot * 180 / (float)Math.PI; - - graphics.PushMatrix(); - graphics.Translate( pos.X, pos.Y, pos.Z ); - graphics.RotateY( -yaw ); - DrawPlayerModel( player, renderer ); - graphics.PopMatrix(); - } - - private void DrawPlayerModel( Player player, PlayerRenderer renderer ) { + protected override void DrawPlayerModel( Player player, PlayerRenderer renderer ) { graphics.Texturing = true; int texId = DefaultSkinTextureId; graphics.Bind2DTexture( texId );