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