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 );