diff --git a/ClassicalSharp.csproj b/ClassicalSharp.csproj
index 5675566a4..32c1da683 100644
--- a/ClassicalSharp.csproj
+++ b/ClassicalSharp.csproj
@@ -93,12 +93,10 @@
-
-
@@ -115,6 +113,11 @@
+
+
+
+
+
@@ -179,6 +182,7 @@
+
\ No newline at end of file
diff --git a/ClassicalSharp.sln b/ClassicalSharp.sln
index 903395cb3..3093c09c6 100644
--- a/ClassicalSharp.sln
+++ b/ClassicalSharp.sln
@@ -1,35 +1,35 @@
-
-Microsoft Visual Studio Solution File, Format Version 11.00
-# Visual Studio 2010
-# SharpDevelop 4.3
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClassicalSharp", "ClassicalSharp.csproj", "{BEB1C785-5CAD-48FF-A886-876BF0A318D4}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Launcher", "Launcher\Launcher.csproj", "{23B9BDA8-4330-46AB-9012-08D87430391A}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Any CPU = Debug|Any CPU
- Release|Any CPU = Release|Any CPU
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {BEB1C785-5CAD-48FF-A886-876BF0A318D4}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {BEB1C785-5CAD-48FF-A886-876BF0A318D4}.Debug|x86.Build.0 = Debug|Any CPU
- {BEB1C785-5CAD-48FF-A886-876BF0A318D4}.Release|Any CPU.Build.0 = Release|Any CPU
- {BEB1C785-5CAD-48FF-A886-876BF0A318D4}.Release|x86.Build.0 = Release|Any CPU
- {23B9BDA8-4330-46AB-9012-08D87430391A}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {23B9BDA8-4330-46AB-9012-08D87430391A}.Debug|x86.Build.0 = Debug|Any CPU
- {23B9BDA8-4330-46AB-9012-08D87430391A}.Release|Any CPU.Build.0 = Release|Any CPU
- {23B9BDA8-4330-46AB-9012-08D87430391A}.Release|x86.Build.0 = Release|Any CPU
- {23B9BDA8-4330-46AB-9012-08D87430391A}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {23B9BDA8-4330-46AB-9012-08D87430391A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {23B9BDA8-4330-46AB-9012-08D87430391A}.Release|Any CPU.Build.0 = Release|Any CPU
- {23B9BDA8-4330-46AB-9012-08D87430391A}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {BEB1C785-5CAD-48FF-A886-876BF0A318D4}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {BEB1C785-5CAD-48FF-A886-876BF0A318D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {BEB1C785-5CAD-48FF-A886-876BF0A318D4}.Release|Any CPU.Build.0 = Release|Any CPU
- {BEB1C785-5CAD-48FF-A886-876BF0A318D4}.Release|Any CPU.ActiveCfg = Release|Any CPU
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+# SharpDevelop 4.4
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClassicalSharp", "ClassicalSharp.csproj", "{BEB1C785-5CAD-48FF-A886-876BF0A318D4}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Launcher", "Launcher\Launcher.csproj", "{23B9BDA8-4330-46AB-9012-08D87430391A}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {BEB1C785-5CAD-48FF-A886-876BF0A318D4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {BEB1C785-5CAD-48FF-A886-876BF0A318D4}.Debug|x86.Build.0 = Debug|Any CPU
+ {BEB1C785-5CAD-48FF-A886-876BF0A318D4}.Release|Any CPU.Build.0 = Release|Any CPU
+ {BEB1C785-5CAD-48FF-A886-876BF0A318D4}.Release|x86.Build.0 = Release|Any CPU
+ {23B9BDA8-4330-46AB-9012-08D87430391A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {23B9BDA8-4330-46AB-9012-08D87430391A}.Debug|x86.Build.0 = Debug|Any CPU
+ {23B9BDA8-4330-46AB-9012-08D87430391A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {23B9BDA8-4330-46AB-9012-08D87430391A}.Release|x86.Build.0 = Release|Any CPU
+ {23B9BDA8-4330-46AB-9012-08D87430391A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {23B9BDA8-4330-46AB-9012-08D87430391A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {23B9BDA8-4330-46AB-9012-08D87430391A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {23B9BDA8-4330-46AB-9012-08D87430391A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {BEB1C785-5CAD-48FF-A886-876BF0A318D4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {BEB1C785-5CAD-48FF-A886-876BF0A318D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {BEB1C785-5CAD-48FF-A886-876BF0A318D4}.Release|Any CPU.Build.0 = Release|Any CPU
+ {BEB1C785-5CAD-48FF-A886-876BF0A318D4}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/Entities/LocalPlayer.cs b/Entities/LocalPlayer.cs
index fe6df83e7..7be21301b 100644
--- a/Entities/LocalPlayer.cs
+++ b/Entities/LocalPlayer.cs
@@ -75,7 +75,7 @@ namespace ClassicalSharp {
bool jumping, speeding, flying, noClip, flyingDown, flyingUp;
float jumpVelocity = 0.42f;
- PlayerRenderer renderer;
+
public float JumpHeight {
get { return jumpVelocity == 0 ? 0 : (float)GetMaxHeight( jumpVelocity ); }
@@ -329,7 +329,7 @@ namespace ClassicalSharp {
if( bmp != null ) {
Window.Graphics.DeleteTexture( renderer.TextureId );
renderer.TextureId = Window.Graphics.LoadTexture( bmp );
- renderer.SetSkinType( Utils.GetSkinType( bmp ) );
+ SkinType = Utils.GetSkinType( bmp );
bmp.Dispose();
}
}
diff --git a/Entities/NetPlayer.cs b/Entities/NetPlayer.cs
index e7be1c194..158706af1 100644
--- a/Entities/NetPlayer.cs
+++ b/Entities/NetPlayer.cs
@@ -8,7 +8,6 @@ namespace ClassicalSharp {
public class NetPlayer : Player {
- public PlayerRenderer renderer;
int tickCount = 0;
public NetPlayer( byte id, string displayName, string skinName, Game window ) : base( id, window ) {
@@ -70,7 +69,7 @@ namespace ClassicalSharp {
if( bmp != null ) {
Window.Graphics.DeleteTexture( renderer.TextureId );
renderer.TextureId = Window.Graphics.LoadTexture( bmp );
- renderer.SetSkinType( Utils.GetSkinType( bmp ) );
+ SkinType = Utils.GetSkinType( bmp );
bmp.Dispose();
}
tickCount++;
diff --git a/Entities/Player.cs b/Entities/Player.cs
index fc60786a4..9afff099e 100644
--- a/Entities/Player.cs
+++ b/Entities/Player.cs
@@ -1,5 +1,6 @@
using System;
using OpenTK;
+using ClassicalSharp.Renderers;
namespace ClassicalSharp {
@@ -26,10 +27,13 @@ namespace ClassicalSharp {
public Game Window;
public byte ID;
public string DisplayName, SkinName;
+ protected PlayerRenderer renderer;
+ public SkinType SkinType;
public Player( byte id, Game window ) : base( window ) {
ID = id;
Window = window;
+ SkinType = Window.DefaultPlayerSkinType;
}
/// Gets the block just underneath the player's feet position.
diff --git a/Entities/PlayerModel.cs b/Entities/PlayerModel.cs
deleted file mode 100644
index 83d61623e..000000000
--- a/Entities/PlayerModel.cs
+++ /dev/null
@@ -1,132 +0,0 @@
-using System;
-using ClassicalSharp.GraphicsAPI;
-
-namespace ClassicalSharp.Entities {
-
- public class PlayerModel {
-
- public ModelSet Set64x32, Set64x64, Set64x64Slim;
- static readonly FastColour col = new FastColour( 178, 178, 178 );
- IGraphicsApi graphics;
- VertexPos3fTex2fCol4b[] vertices;
- int index = 0;
-
- public PlayerModel( IGraphicsApi graphics ) {
- this.graphics = graphics;
- vertices = new VertexPos3fTex2fCol4b[6 * 6];
- Set64x32 = new ModelSet();
- Set64x32.Head = MakeHead( false );
- Set64x32.Torso = MakeTorso( false );
- Set64x32.LeftLeg = MakeLeftLeg( 0, 16, 0.25f, 0f, false );
- Set64x32.RightLeg = MakeRightLeg( 0, 16, 0, 0.25f, false );
- Set64x32.LeftArm = MakeLeftArm( 40, 16, 0.5f, 0.25f, 4, false );
- Set64x32.RightArm = MakeRightArm( 40, 16, 0.25f, 0.5f, 4, false );
- Set64x32.Hat = MakeHat( false );
-
- Set64x64 = new ModelSet();
- Set64x64.Head = MakeHead( true );
- Set64x64.Torso = MakeTorso( true );
- Set64x64.LeftLeg = MakeLeftLeg( 16, 48, 0, 0.25f, true );
- Set64x64.RightLeg = MakeRightLeg( 0, 16, 0, 0.25f, true );
- Set64x64.LeftArm = MakeLeftArm( 32, 48, 0.25f, 0.5f, 4, true );
- Set64x64.RightArm = MakeRightArm( 40, 16, 0.25f, 0.5f, 4, true );
- Set64x64.Hat = MakeHat( true );
-
- Set64x64Slim = new ModelSet();
- Set64x64Slim.Head = MakeHead( true );
- Set64x64Slim.Torso = MakeTorso( true );
- Set64x64Slim.LeftLeg = MakeLeftLeg( 16, 48, 0, 0.25f, true );
- Set64x64Slim.RightLeg = MakeRightLeg( 0, 16, 0, 0.25f, true );
- Set64x64Slim.LeftArm = MakeLeftArm( 32, 48, 0.25f, 0.4375f, 3, true );
- Set64x64Slim.RightArm = MakeRightArm( 40, 16, 0.25f, 0.4375f, 3, true );
- Set64x64Slim.Hat = MakeHat( true );
- vertices = null;
- }
-
- public void Dispose() {
- Set64x32.Dispose();
- Set64x64.Dispose();
- Set64x64Slim.Dispose();
- }
-
- ModelPart MakeLeftArm( int x, int y, float x1, float x2, int width, bool _64x64 ) {
- return MakePart( x, y, 4, 12, width, 4, width, 12, -x2, -x1, 0.875f, 1.625f, -0.125f, 0.125f, _64x64 );
- }
-
- ModelPart MakeRightArm( int x, int y, float x1, float x2, int width, bool _64x64 ) {
- return MakePart( x, y, 4, 12, width, 4, width, 12, x1, x2, 0.875f, 1.625f, -0.125f, 0.125f, _64x64 );
- }
-
- ModelPart MakeHead( bool _64x64 ) {
- return MakePart( 0, 0, 8, 8, 8, 8, 8, 8, -0.25f, 0.25f, 1.625f, 2.125f, -0.25f, 0.25f, _64x64 );
- }
-
- ModelPart MakeTorso( bool _64x64 ) {
- return MakePart( 16, 16, 4, 12, 8, 4, 8, 12, -0.25f, 0.25f, 0.875f, 1.625f, -0.125f, 0.125f, _64x64 );
- }
-
- ModelPart MakeHat( bool _64x64 ) {
- return MakePart( 32, 0, 8, 8, 8, 8, 8, 8, -0.3125f, 0.3125f, 1.5625f, 2.18775f, -0.3125f, 0.3125f, _64x64 );
- }
-
- ModelPart MakeLeftLeg( int x, int y, float x1, float x2, bool _64x64 ) {
- return MakePart( x, y, 4, 12, 4, 4, 4, 12, -x2, -x1, 0f, 0.875f, -0.125f, 0.125f, _64x64 );
- }
-
- ModelPart MakeRightLeg( int x, int y, float x1, float x2, bool _64x64 ) {
- return MakePart( x, y, 4, 12, 4, 4, 4, 12, x1, x2, 0f, 0.875f, -0.125f, 0.125f, _64x64 );
- }
-
- ModelPart MakePart( int x, int y, int sidesW, int sidesH, int endsW, int endsH, int bodyW, int bodyH,
- float x1, float x2, float y1, float y2, float z1, float z2, bool _64x64 ) {
- index = 0;
- YPlane( x + sidesW, y, endsW, endsH, x2, x1, z2, z1, y2, _64x64 ); // top
- YPlane( x + sidesW + bodyW, y, endsW, endsH, x2, x1, z1, z2, y1, _64x64 ); // bottom
- ZPlane( x + sidesW, y + endsH, bodyW, bodyH, x2, x1, y1, y2, z1, _64x64 ); // front
- 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 );
- }
-
- static TextureRectangle SkinTexCoords( int x, int y, int width, int height, float skinWidth, float skinHeight ) {
- return new TextureRectangle( x / skinWidth, y / skinHeight, width / skinWidth, height / skinHeight );
- }
-
- void XPlane( int texX, int texY, int texWidth, int texHeight,
- float z1, float z2, float y1, float y2, float x, bool _64x64 ) {
- TextureRectangle rec = SkinTexCoords( texX, texY, texWidth, texHeight, 64, _64x64 ? 64 : 32 );
- vertices[index++] = new VertexPos3fTex2fCol4b( x, y1, z1, rec.U1, rec.V2, col );
- vertices[index++] = new VertexPos3fTex2fCol4b( x, y2, z1, rec.U1, rec.V1, col );
- vertices[index++] = new VertexPos3fTex2fCol4b( x, y2, z2, rec.U2, rec.V1, col );
-
- vertices[index++] = new VertexPos3fTex2fCol4b( x, y2, z2, rec.U2, rec.V1, col );
- vertices[index++] = new VertexPos3fTex2fCol4b( x, y1, z2, rec.U2, rec.V2, col );
- vertices[index++] = new VertexPos3fTex2fCol4b( x, y1, z1, rec.U1, rec.V2, col );
- }
-
- void YPlane( int texX, int texY, int texWidth, int texHeight,
- float x1, float x2, float z1, float z2, float y, bool _64x64 ) {
- TextureRectangle rec = SkinTexCoords( texX, texY, texWidth, texHeight, 64, _64x64 ? 64 : 32 );
- vertices[index++] = new VertexPos3fTex2fCol4b( x1, y, z1, rec.U1, rec.V1, col );
- vertices[index++] = new VertexPos3fTex2fCol4b( x2, y, z1, rec.U2, rec.V1, col );
- vertices[index++] = new VertexPos3fTex2fCol4b( x2, y, z2, rec.U2, rec.V2, col );
-
- vertices[index++] = new VertexPos3fTex2fCol4b( x2, y, z2, rec.U2, rec.V2, col );
- vertices[index++] = new VertexPos3fTex2fCol4b( x1, y, z2, rec.U1, rec.V2, col );
- vertices[index++] = new VertexPos3fTex2fCol4b( x1, y, z1, rec.U1, rec.V1, col );
- }
-
- void ZPlane( int texX, int texY, int texWidth, int texHeight,
- float x1, float x2, float y1, float y2, float z, bool _64x64 ) {
- TextureRectangle rec = SkinTexCoords( texX, texY, texWidth, texHeight, 64, _64x64 ? 64 : 32 );
- vertices[index++] = new VertexPos3fTex2fCol4b( x1, y1, z, rec.U1, rec.V2, col );
- vertices[index++] = new VertexPos3fTex2fCol4b( x2, y1, z, rec.U2, rec.V2, col );
- vertices[index++] = new VertexPos3fTex2fCol4b( x2, y2, z, rec.U2, rec.V1, col );
-
- vertices[index++] = new VertexPos3fTex2fCol4b( x2, y2, z, rec.U2, rec.V1, col );
- vertices[index++] = new VertexPos3fTex2fCol4b( x1, y2, z, rec.U1, rec.V1, col );
- vertices[index++] = new VertexPos3fTex2fCol4b( x1, y1, z, rec.U1, rec.V2, col );
- }
- }
-}
\ No newline at end of file
diff --git a/Game/Game.cs b/Game/Game.cs
index ad99e36fe..aa9431f08 100644
--- a/Game/Game.cs
+++ b/Game/Game.cs
@@ -3,8 +3,8 @@ using System.Drawing;
using System.IO;
using System.Net;
using ClassicalSharp.Commands;
-using ClassicalSharp.Entities;
using ClassicalSharp.GraphicsAPI;
+using ClassicalSharp.Model;
using ClassicalSharp.Network;
using ClassicalSharp.Particles;
using ClassicalSharp.Renderers;
@@ -33,7 +33,6 @@ namespace ClassicalSharp {
public int TerrainAtlasTexId = -1;
public TextureAtlas1D TerrainAtlas1D;
public int[] TerrainAtlas1DTexIds;
- public int DefaultPlayerTextureId = -1;
public SkinType DefaultPlayerSkinType;
public int ChunkUpdates;
@@ -46,7 +45,7 @@ namespace ClassicalSharp {
public ParticleManager ParticleManager;
public PickingRenderer Picking;
public PickedPos SelectedPos;
- public PlayerModel ModelCache;
+ public IModel ModelCache;
internal string skinServer, chatInInputBuffer;
public bool CanUseThirdPersonCamera = true;
FpsScreen fpsScreen;
@@ -144,15 +143,11 @@ namespace ClassicalSharp {
protected override void OnLoad( EventArgs e ) {
Graphics = new OpenGLApi();
- ModelCache = new PlayerModel( Graphics );
+ ModelCache = new CreeperModel( this );
AsyncDownloader = new AsyncDownloader( skinServer );
PrintGraphicsInfo();
Bitmap terrainBmp = new Bitmap( "terrain.png" );
LoadAtlas( terrainBmp );
- using( Bitmap bmp = new Bitmap( "char.png" ) ) {
- DefaultPlayerSkinType = Utils.GetSkinType( bmp );
- DefaultPlayerTextureId = Graphics.LoadTexture( bmp );
- }
BlockInfo = new BlockInfo();
BlockInfo.Init();
BlockInfo.SetDefaultBlockPermissions( CanPlace, CanDelete );
@@ -312,7 +307,6 @@ namespace ClassicalSharp {
NetPlayers[i].Despawn();
}
}
- Graphics.DeleteTexture( DefaultPlayerTextureId );
LocalPlayer.Despawn();
Graphics.CheckResources();
AsyncDownloader.Dispose();
diff --git a/Model/CreeperModel.cs b/Model/CreeperModel.cs
new file mode 100644
index 000000000..81af7267f
--- /dev/null
+++ b/Model/CreeperModel.cs
@@ -0,0 +1,94 @@
+using OpenTK;
+using System;
+using System.Drawing;
+using ClassicalSharp.GraphicsAPI;
+using ClassicalSharp.Renderers;
+
+namespace ClassicalSharp.Model {
+
+ public class CreeperModel : IModel {
+
+ ModelSet Set;
+ public CreeperModel( Game window ) : base( window ) {
+ vertices = new VertexPos3fTex2fCol4b[6 * 6];
+ Set = new ModelSet();
+ Set.Head = MakeHead();
+ Set.Torso = MakeTorso();
+ Set.LeftLegFront = MakeLeg( 0, 16, -0.25f, 0, -0.375f, -0.125f );
+ Set.RightLegFront = MakeLeg( 0, 16, 0, 0.25f, -0.375f, -0.125f );
+ Set.LeftLegBack = MakeLeg( 0, 16, -0.25f, 0, 0.125f, 0.375f );
+ Set.RightLegBack = MakeLeg( 0, 16, 0, 0.25f, 0.125f, 0.375f );
+ vertices = null;
+
+ DefaultSkinTextureId = graphics.LoadTexture( "creeper.png" );
+ }
+
+ ModelPart MakeHead() {
+ return MakePart( 0, 0, 8, 8, 8, 8, 8, 8, -0.25f, 0.25f, 1.125f, 1.625f, -0.25f, 0.25f, false );
+ }
+
+ ModelPart MakeTorso() {
+ return MakePart( 16, 16, 4, 12, 8, 4, 8, 12, -0.25f, 0.25f, 0.375f, 1.125f, -0.125f, 0.125f, false );
+ }
+
+ ModelPart MakeLeg( int x, int y, float x1, float x2, float z1, float z2 ) {
+ return MakePart( x, y, 4, 6, 4, 4, 4, 6, x1, x2, 0f, 0.375f, z1, z2, false );
+ }
+
+ public override float NameYOffset {
+ 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 ) {
+ graphics.Texturing = true;
+ int texId = renderer.TextureId <= 0 ? DefaultSkinTextureId : renderer.TextureId;
+ graphics.Bind2DTexture( texId );
+
+ DrawRotateX( 0, 1.125f, 0, -pitch, Set.Head );
+ Set.Torso.Render();
+ DrawRotateX( 0, 0.375f, -0.25f, leftLegXRot, Set.LeftLegFront );
+ DrawRotateX( 0, 0.375f, -0.25f, rightLegXRot, Set.RightLegFront );
+ DrawRotateX( 0, 0.375f, 0.25f, rightLegXRot, Set.LeftLegBack );
+ DrawRotateX( 0, 0.375f, 0.25f, leftLegXRot, Set.RightLegBack );
+ graphics.AlphaTest = true;
+ }
+
+ public override void Dispose() {
+ Set.Dispose();
+ graphics.DeleteTexture( DefaultSkinTextureId );
+ }
+
+ class ModelSet {
+
+ public ModelPart Head, Torso, LeftLegFront, RightLegFront, LeftLegBack, RightLegBack;
+
+ public void Dispose() {
+ RightLegFront.Dispose();
+ LeftLegFront.Dispose();
+ RightLegBack.Dispose();
+ LeftLegBack.Dispose();
+ Torso.Dispose();
+ Head.Dispose();
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Model/IModel.cs b/Model/IModel.cs
new file mode 100644
index 000000000..c27b5ae43
--- /dev/null
+++ b/Model/IModel.cs
@@ -0,0 +1,101 @@
+using System;
+using ClassicalSharp.GraphicsAPI;
+using ClassicalSharp.Renderers;
+using OpenTK;
+
+namespace ClassicalSharp.Model {
+
+ public abstract class IModel {
+
+ protected Game window;
+ protected IGraphicsApi graphics;
+
+ public IModel( Game window ) {
+ this.window = window;
+ graphics = window.Graphics;
+ }
+
+ public abstract float NameYOffset { get; }
+
+ public abstract void RenderModel( Player player, PlayerRenderer renderer );
+
+ public abstract void Dispose();
+
+ public int DefaultSkinTextureId; //{ get; protected set; }
+
+ protected FastColour col = new FastColour( 178, 178, 178 );
+ protected VertexPos3fTex2fCol4b[] vertices;
+ protected int index = 0;
+
+ protected ModelPart MakePart( int x, int y, int sidesW, int sidesH, int endsW, int endsH, int bodyW, int bodyH,
+ float x1, float x2, float y1, float y2, float z1, float z2, bool _64x64 ) {
+ index = 0;
+ YPlane( x + sidesW, y, endsW, endsH, x2, x1, z2, z1, y2, _64x64 ); // top
+ YPlane( x + sidesW + bodyW, y, endsW, endsH, x2, x1, z1, z2, y1, _64x64 ); // bottom
+ ZPlane( x + sidesW, y + endsH, bodyW, bodyH, x2, x1, y1, y2, z1, _64x64 ); // front
+ 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 );
+ }
+
+ protected static TextureRectangle SkinTexCoords( int x, int y, int width, int height, float skinWidth, float skinHeight ) {
+ return new TextureRectangle( x / skinWidth, y / skinHeight, width / skinWidth, height / skinHeight );
+ }
+
+ protected void XPlane( int texX, int texY, int texWidth, int texHeight,
+ float z1, float z2, float y1, float y2, float x, bool _64x64 ) {
+ TextureRectangle rec = SkinTexCoords( texX, texY, texWidth, texHeight, 64, _64x64 ? 64 : 32 );
+ vertices[index++] = new VertexPos3fTex2fCol4b( x, y1, z1, rec.U1, rec.V2, col );
+ vertices[index++] = new VertexPos3fTex2fCol4b( x, y2, z1, rec.U1, rec.V1, col );
+ vertices[index++] = new VertexPos3fTex2fCol4b( x, y2, z2, rec.U2, rec.V1, col );
+
+ vertices[index++] = new VertexPos3fTex2fCol4b( x, y2, z2, rec.U2, rec.V1, col );
+ vertices[index++] = new VertexPos3fTex2fCol4b( x, y1, z2, rec.U2, rec.V2, col );
+ vertices[index++] = new VertexPos3fTex2fCol4b( x, y1, z1, rec.U1, rec.V2, col );
+ }
+
+ protected void YPlane( int texX, int texY, int texWidth, int texHeight,
+ float x1, float x2, float z1, float z2, float y, bool _64x64 ) {
+ TextureRectangle rec = SkinTexCoords( texX, texY, texWidth, texHeight, 64, _64x64 ? 64 : 32 );
+ vertices[index++] = new VertexPos3fTex2fCol4b( x1, y, z1, rec.U1, rec.V1, col );
+ vertices[index++] = new VertexPos3fTex2fCol4b( x2, y, z1, rec.U2, rec.V1, col );
+ vertices[index++] = new VertexPos3fTex2fCol4b( x2, y, z2, rec.U2, rec.V2, col );
+
+ vertices[index++] = new VertexPos3fTex2fCol4b( x2, y, z2, rec.U2, rec.V2, col );
+ vertices[index++] = new VertexPos3fTex2fCol4b( x1, y, z2, rec.U1, rec.V2, col );
+ vertices[index++] = new VertexPos3fTex2fCol4b( x1, y, z1, rec.U1, rec.V1, col );
+ }
+
+ protected void ZPlane( int texX, int texY, int texWidth, int texHeight,
+ float x1, float x2, float y1, float y2, float z, bool _64x64 ) {
+ TextureRectangle rec = SkinTexCoords( texX, texY, texWidth, texHeight, 64, _64x64 ? 64 : 32 );
+ vertices[index++] = new VertexPos3fTex2fCol4b( x1, y1, z, rec.U1, rec.V2, col );
+ vertices[index++] = new VertexPos3fTex2fCol4b( x2, y1, z, rec.U2, rec.V2, col );
+ vertices[index++] = new VertexPos3fTex2fCol4b( x2, y2, z, rec.U2, rec.V1, col );
+
+ vertices[index++] = new VertexPos3fTex2fCol4b( x2, y2, z, rec.U2, rec.V1, col );
+ vertices[index++] = new VertexPos3fTex2fCol4b( x1, y2, z, rec.U1, rec.V1, col );
+ vertices[index++] = new VertexPos3fTex2fCol4b( x1, y1, z, rec.U1, rec.V2, col );
+ }
+
+ protected void DrawRotateX( float x, float y, float z, float angleX, ModelPart part ) {
+ graphics.PushMatrix();
+ graphics.Translate( x, y, z );
+ graphics.RotateX( angleX );
+ graphics.Translate( -x, -y, -z );
+ part.Render();
+ graphics.PopMatrix();
+ }
+
+ protected void DrawRotateXZ( float x, float y, float z, float angleX, float angleZ, ModelPart part ) {
+ graphics.PushMatrix();
+ graphics.Translate( x, y, z );
+ graphics.RotateZ( angleZ );
+ graphics.RotateX( angleX );
+ graphics.Translate( -x, -y, -z );
+ part.Render();
+ graphics.PopMatrix();
+ }
+ }
+}
diff --git a/Entities/ModelPart.cs b/Model/ModelPart.cs
similarity index 69%
rename from Entities/ModelPart.cs
rename to Model/ModelPart.cs
index c9c55032a..6143631d4 100644
--- a/Entities/ModelPart.cs
+++ b/Model/ModelPart.cs
@@ -24,21 +24,6 @@ namespace ClassicalSharp {
}
}
- public class ModelSet {
-
- public ModelPart Head, Torso, LeftLeg, RightLeg, LeftArm, RightArm, Hat;
-
- public void Dispose() {
- Hat.Dispose();
- RightArm.Dispose();
- LeftArm.Dispose();
- RightLeg.Dispose();
- LeftLeg.Dispose();
- Torso.Dispose();
- Head.Dispose();
- }
- }
-
public enum SkinType {
Type64x32,
Type64x64,
diff --git a/Model/PlayerModel.cs b/Model/PlayerModel.cs
new file mode 100644
index 000000000..3b6ad6dec
--- /dev/null
+++ b/Model/PlayerModel.cs
@@ -0,0 +1,147 @@
+using OpenTK;
+using System;
+using System.Drawing;
+using ClassicalSharp.GraphicsAPI;
+using ClassicalSharp.Renderers;
+
+namespace ClassicalSharp.Model {
+
+ public class PlayerModel : IModel {
+
+ ModelSet Set64x32, Set64x64, Set64x64Slim;
+ public PlayerModel( Game window ) : base( window ) {
+ vertices = new VertexPos3fTex2fCol4b[6 * 6];
+ Set64x32 = new ModelSet();
+ Set64x32.Head = MakeHead( false );
+ Set64x32.Torso = MakeTorso( false );
+ Set64x32.LeftLeg = MakeLeftLeg( 0, 16, 0.25f, 0f, false );
+ Set64x32.RightLeg = MakeRightLeg( 0, 16, 0, 0.25f, false );
+ Set64x32.LeftArm = MakeLeftArm( 40, 16, 0.5f, 0.25f, 4, false );
+ Set64x32.RightArm = MakeRightArm( 40, 16, 0.25f, 0.5f, 4, false );
+ Set64x32.Hat = MakeHat( false );
+
+ Set64x64 = new ModelSet();
+ Set64x64.Head = MakeHead( true );
+ Set64x64.Torso = MakeTorso( true );
+ Set64x64.LeftLeg = MakeLeftLeg( 16, 48, 0, 0.25f, true );
+ Set64x64.RightLeg = MakeRightLeg( 0, 16, 0, 0.25f, true );
+ Set64x64.LeftArm = MakeLeftArm( 32, 48, 0.25f, 0.5f, 4, true );
+ Set64x64.RightArm = MakeRightArm( 40, 16, 0.25f, 0.5f, 4, true );
+ Set64x64.Hat = MakeHat( true );
+
+ Set64x64Slim = new ModelSet();
+ Set64x64Slim.Head = MakeHead( true );
+ Set64x64Slim.Torso = MakeTorso( true );
+ Set64x64Slim.LeftLeg = MakeLeftLeg( 16, 48, 0, 0.25f, true );
+ Set64x64Slim.RightLeg = MakeRightLeg( 0, 16, 0, 0.25f, true );
+ Set64x64Slim.LeftArm = MakeLeftArm( 32, 48, 0.25f, 0.4375f, 3, true );
+ Set64x64Slim.RightArm = MakeRightArm( 40, 16, 0.25f, 0.4375f, 3, true );
+ Set64x64Slim.Hat = MakeHat( true );
+ vertices = null;
+
+ using( Bitmap bmp = new Bitmap( "char.png" ) ) {
+ window.DefaultPlayerSkinType = Utils.GetSkinType( bmp );
+ DefaultSkinTextureId = graphics.LoadTexture( bmp );
+ }
+ }
+
+ ModelPart MakeLeftArm( int x, int y, float x1, float x2, int width, bool _64x64 ) {
+ return MakePart( x, y, 4, 12, width, 4, width, 12, -x2, -x1, 0.875f, 1.625f, -0.125f, 0.125f, _64x64 );
+ }
+
+ ModelPart MakeRightArm( int x, int y, float x1, float x2, int width, bool _64x64 ) {
+ return MakePart( x, y, 4, 12, width, 4, width, 12, x1, x2, 0.875f, 1.625f, -0.125f, 0.125f, _64x64 );
+ }
+
+ ModelPart MakeHead( bool _64x64 ) {
+ return MakePart( 0, 0, 8, 8, 8, 8, 8, 8, -0.25f, 0.25f, 1.625f, 2.125f, -0.25f, 0.25f, _64x64 );
+ }
+
+ ModelPart MakeTorso( bool _64x64 ) {
+ return MakePart( 16, 16, 4, 12, 8, 4, 8, 12, -0.25f, 0.25f, 0.875f, 1.625f, -0.125f, 0.125f, _64x64 );
+ }
+
+ ModelPart MakeHat( bool _64x64 ) {
+ return MakePart( 32, 0, 8, 8, 8, 8, 8, 8, -0.3125f, 0.3125f, 1.5625f, 2.18775f, -0.3125f, 0.3125f, _64x64 );
+ }
+
+ ModelPart MakeLeftLeg( int x, int y, float x1, float x2, bool _64x64 ) {
+ return MakePart( x, y, 4, 12, 4, 4, 4, 12, -x2, -x1, 0f, 0.875f, -0.125f, 0.125f, _64x64 );
+ }
+
+ ModelPart MakeRightLeg( int x, int y, float x1, float x2, bool _64x64 ) {
+ return MakePart( x, y, 4, 12, 4, 4, 4, 12, x1, x2, 0f, 0.875f, -0.125f, 0.125f, _64x64 );
+ }
+
+ public override float NameYOffset {
+ get { return 2.2f; }
+ }
+
+ 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;
+
+ 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.625f, 0, -pitch, model.Head );
+ model.Torso.Render();
+ DrawRotateX( 0, 0.875f, 0, leftLegXRot, model.LeftLeg );
+ DrawRotateX( 0, 0.875f, 0, rightLegXRot, model.RightLeg );
+ DrawRotateXZ( 0, 1.625f, 0, leftArmXRot, leftArmZRot, model.LeftArm );
+ DrawRotateXZ( 0, 1.625f, 0, rightArmXRot, rightArmZRot, model.RightArm );
+ graphics.AlphaTest = true;
+ DrawRotateX( 0, 1.5625f, 0, -pitch, model.Hat );
+ }
+
+ public override void Dispose() {
+ Set64x32.Dispose();
+ Set64x64.Dispose();
+ Set64x64Slim.Dispose();
+ graphics.DeleteTexture( DefaultSkinTextureId );
+ }
+
+ class ModelSet {
+
+ public ModelPart Head, Torso, LeftLeg, RightLeg, LeftArm, RightArm, Hat;
+
+ public void Dispose() {
+ Hat.Dispose();
+ RightArm.Dispose();
+ LeftArm.Dispose();
+ RightLeg.Dispose();
+ LeftLeg.Dispose();
+ Torso.Dispose();
+ Head.Dispose();
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Model/ZombieModel.cs b/Model/ZombieModel.cs
new file mode 100644
index 000000000..2e5fd7dc6
--- /dev/null
+++ b/Model/ZombieModel.cs
@@ -0,0 +1,110 @@
+using OpenTK;
+using System;
+using System.Drawing;
+using ClassicalSharp.GraphicsAPI;
+using ClassicalSharp.Renderers;
+
+namespace ClassicalSharp.Model {
+
+ public class ZombieModel : IModel {
+
+ ModelSet Set;
+ public ZombieModel( Game window ) : base( window ) {
+ vertices = new VertexPos3fTex2fCol4b[6 * 6];
+ Set = new ModelSet();
+ Set.Head = MakeHead();
+ Set.Torso = MakeTorso();
+ Set.LeftLeg = MakeLeftLeg( 0, 16, 0.25f, 0f );
+ Set.RightLeg = MakeRightLeg( 0, 16, 0, 0.25f );
+ Set.LeftArm = MakeLeftArm( 40, 16, 0.5f, 0.25f, 4 );
+ Set.RightArm = MakeRightArm( 40, 16, 0.25f, 0.5f, 4 );
+ vertices = null;
+
+ DefaultSkinTextureId = graphics.LoadTexture( "zombie.png" );
+ }
+
+ ModelPart MakeLeftArm( int x, int y, float x1, float x2, int width ) {
+ return MakePart( x, y, 4, 12, width, 4, width, 12, -x2, -x1, 0.875f, 1.625f, -0.125f, 0.125f, false );
+ }
+
+ ModelPart MakeRightArm( int x, int y, float x1, float x2, int width) {
+ return MakePart( x, y, 4, 12, width, 4, width, 12, x1, x2, 0.875f, 1.625f, -0.125f, 0.125f, false );
+ }
+
+ ModelPart MakeHead() {
+ return MakePart( 0, 0, 8, 8, 8, 8, 8, 8, -0.25f, 0.25f, 1.625f, 2.125f, -0.25f, 0.25f, false );
+ }
+
+ ModelPart MakeTorso() {
+ return MakePart( 16, 16, 4, 12, 8, 4, 8, 12, -0.25f, 0.25f, 0.875f, 1.625f, -0.125f, 0.125f, false );
+ }
+
+ ModelPart MakeLeftLeg( int x, int y, float x1, float x2 ) {
+ return MakePart( x, y, 4, 12, 4, 4, 4, 12, -x2, -x1, 0f, 0.875f, -0.125f, 0.125f, false );
+ }
+
+ ModelPart MakeRightLeg( int x, int y, float x1, float x2 ) {
+ return MakePart( x, y, 4, 12, 4, 4, 4, 12, x1, x2, 0f, 0.875f, -0.125f, 0.125f, false );
+ }
+
+ public override float NameYOffset {
+ get { return 2.2f; }
+ }
+
+ Vector3 pos;
+ float yaw, pitch;
+ 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;
+
+ 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.625f, 0, -pitch, Set.Head );
+ Set.Torso.Render();
+ DrawRotateX( 0, 0.375f, 0, leftLegXRot, Set.LeftLeg );
+ DrawRotateX( 0, 0.875f, 0, rightLegXRot, Set.RightLeg );
+ DrawRotateXZ( 0, 1.625f, 0, leftArmXRot, leftArmZRot, Set.LeftArm );
+ DrawRotateXZ( 0, 1.625f, 0, rightArmXRot, rightArmZRot, Set.RightArm );
+ }
+
+ public override void Dispose() {
+ Set.Dispose();
+ graphics.DeleteTexture( DefaultSkinTextureId );
+ }
+
+ class ModelSet {
+
+ public ModelPart Head, Torso, LeftLeg, RightLeg, LeftArm, RightArm;
+
+ public void Dispose() {
+ RightArm.Dispose();
+ LeftArm.Dispose();
+ RightLeg.Dispose();
+ LeftLeg.Dispose();
+ Torso.Dispose();
+ Head.Dispose();
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Network/NetworkProcessor.cs b/Network/NetworkProcessor.cs
index ea5299acd..0e9a95469 100644
--- a/Network/NetworkProcessor.cs
+++ b/Network/NetworkProcessor.cs
@@ -147,7 +147,7 @@ namespace ClassicalSharp {
// === CPE support list ===
// TextHotKey : unlikely
// ExtPlayerList : yes (only version 1, not 2)
- // ChangeModel : no
+ // ChangeModel : planned
// EnvWeatherType : unlikely
static string[] clientExtensions = new string[] {
"EmoteFix", "ClickDistance", "HeldBlock", "BlockPermissions",
diff --git a/Rendering/PlayerRenderer.cs b/Rendering/PlayerRenderer.cs
index edce1092e..df4e554a1 100644
--- a/Rendering/PlayerRenderer.cs
+++ b/Rendering/PlayerRenderer.cs
@@ -9,31 +9,18 @@ namespace ClassicalSharp.Renderers {
public class PlayerRenderer {
Vector3 pos;
- float yaw, pitch;
public Game Window;
public IGraphicsApi Graphics;
- public bool Moves;
- public ModelSet Model;
public Player Player;
Texture nameTexture;
float nameWidth, nameHeight;
public int TextureId = -1;
int nameTextureId = -1;
- float rightLegXRot, rightArmXRot, rightArmZRot;
- float leftLegXRot, leftArmXRot, leftArmZRot;
-
- public void SetSkinType( SkinType type ) {
- if( type == SkinType.Type64x32 ) Model = Window.ModelCache.Set64x32;
- else if( type == SkinType.Type64x64 ) Model = Window.ModelCache.Set64x64;
- else if( type == SkinType.Type64x64Slim ) Model = Window.ModelCache.Set64x64Slim;
- else Model = Window.ModelCache.Set64x32;
- }
public PlayerRenderer( Player player, Game window ) {
Player = player;
Window = window;
Graphics = window.Graphics;
- SetSkinType( window.DefaultPlayerSkinType );
List parts = Utils.SplitText( Graphics, player.DisplayName, true );
Size size = Utils2D.MeasureSize( Utils.StripColours( player.DisplayName ), "Arial", 14, true );
@@ -50,88 +37,14 @@ namespace ClassicalSharp.Renderers {
public void Render( double deltaTime ) {
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();
- Graphics.PopMatrix();
+ Window.ModelCache.RenderModel( Player, this );
DrawName();
}
-
- private void DrawPlayerModel() {
- Graphics.Texturing = true;
- int texId = TextureId == -1 ? Window.DefaultPlayerTextureId : TextureId;
- Graphics.Bind2DTexture( texId );
-
- // Head
- Graphics.PushMatrix();
- Graphics.Translate( 0f, 1.625f, 0f );
- Graphics.RotateX( -pitch );
- Graphics.Translate( 0f, -1.625f, 0f );
- Model.Head.Render();
- Graphics.PopMatrix();
-
- // Torso
- Model.Torso.Render();
-
- // Left leg
- Graphics.PushMatrix();
- Graphics.Translate( 0f, 0.875f, 0f );
- Graphics.RotateX( leftLegXRot );
- Graphics.Translate( 0f, -0.875f, 0f );
- Model.LeftLeg.Render();
- Graphics.PopMatrix();
-
- // Right leg
- Graphics.PushMatrix();
- Graphics.Translate( 0f, 0.875f, 0f );
- Graphics.RotateX( rightLegXRot );
- Graphics.Translate( 0f, -0.875f, 0f );
- Model.RightLeg.Render();
- Graphics.PopMatrix();
-
- // Left arm
- Graphics.PushMatrix();
- Graphics.Translate( 0f, 1.625f, 0f );
- Graphics.RotateZ( leftArmZRot );
- Graphics.RotateX( leftArmXRot );
- Graphics.Translate( 0f, -1.625f, 0f );
- Model.LeftArm.Render();
- Graphics.PopMatrix();
-
- // Right arm
- Graphics.PushMatrix();
- Graphics.Translate( 0f, 1.625f, 0f );
- Graphics.RotateZ( rightArmZRot );
- Graphics.RotateX( rightArmXRot );
- Graphics.Translate( 0f, -1.625f, 0f );
- Model.RightArm.Render();
- Graphics.PopMatrix();
-
- // Hat
- Graphics.AlphaTest = true;
- Graphics.PushMatrix();
- Graphics.Translate( 0f, 1.5625f, 0f );
- Graphics.RotateX( -pitch );
- Graphics.Translate( 0f, -1.5625f, 0f );
- Model.Hat.Render();
- Graphics.PopMatrix();
- }
const float nameScale = 50f;
private void DrawName() {
Graphics.PushMatrix();
- Graphics.Translate( pos.X, pos.Y + 2.2f, pos.Z );
+ Graphics.Translate( pos.X, pos.Y + Window.ModelCache.NameYOffset, pos.Z );
// Do this to always have names facing the player
float yaw = Window.LocalPlayer.YawDegrees;
Graphics.RotateY( 0f - yaw );