diff --git a/ClassicalSharp/2D/IsometricBlockDrawer.cs b/ClassicalSharp/2D/IsometricBlockDrawer.cs index 1abdfc724..5d566878f 100644 --- a/ClassicalSharp/2D/IsometricBlockDrawer.cs +++ b/ClassicalSharp/2D/IsometricBlockDrawer.cs @@ -19,7 +19,6 @@ namespace ClassicalSharp { TerrainAtlas1D atlas; int index; float scale; - const float invElemSize = TerrainAtlas2D.invElementSize; bool bright; VertexP3fT2fC4b[] vertices; int vb; diff --git a/ClassicalSharp/2D/Screens/Inventory/InventoryScreen.Input.cs b/ClassicalSharp/2D/Screens/Inventory/InventoryScreen.Input.cs index eac3c668e..536c78824 100644 --- a/ClassicalSharp/2D/Screens/Inventory/InventoryScreen.Input.cs +++ b/ClassicalSharp/2D/Screens/Inventory/InventoryScreen.Input.cs @@ -48,7 +48,7 @@ namespace ClassicalSharp.Gui.Screens { return true; } - bool hotbar = game.IsKeyDown(Key.AltLeft) || game.IsKeyDown(Key.AltRight); + bool hotbar = game.Input.ControlDown; if (!hotbar) game.Gui.SetNewScreen(null); } diff --git a/ClassicalSharp/2D/Screens/Menu/GenLevelScreen.cs b/ClassicalSharp/2D/Screens/Menu/GenLevelScreen.cs index 832326f64..7fdb41ecf 100644 --- a/ClassicalSharp/2D/Screens/Menu/GenLevelScreen.cs +++ b/ClassicalSharp/2D/Screens/Menu/GenLevelScreen.cs @@ -118,7 +118,7 @@ namespace ClassicalSharp.Gui.Screens { int length = GetInt(2), seed = GetSeedInt(3); long volume = (long)width * height * length; - if (volume > 800 * 800 * 800) { + if (volume > int.MaxValue) { game.Chat.Add("&cThe generated map's volume is too big."); } else if (width == 0 || height == 0 || length == 0) { game.Chat.Add("&cOne of the map dimensions is invalid."); diff --git a/ClassicalSharp/2D/Screens/Menu/KeyBindingsScreens.cs b/ClassicalSharp/2D/Screens/Menu/KeyBindingsScreens.cs index 8ed24c679..c04acf175 100644 --- a/ClassicalSharp/2D/Screens/Menu/KeyBindingsScreens.cs +++ b/ClassicalSharp/2D/Screens/Menu/KeyBindingsScreens.cs @@ -120,12 +120,12 @@ namespace ClassicalSharp.Gui.Screens { public override void Init() { base.Init(); - left = new KeyBind[3]; - left[0] = KeyBind.ExtInput; left[1] = KeyBind.HideFps; left[2] = KeyBind.HideGui; + left = new KeyBind[4]; + left[0] = KeyBind.ExtInput; left[1] = KeyBind.HideFps; left[2] = KeyBind.HideGui; left[3] = KeyBind.HotbarSwitching; right = new KeyBind[4]; right[0] = KeyBind.Screenshot; right[1] = KeyBind.Fullscreen; right[2] = KeyBind.AxisLines; right[3] = KeyBind.Autorotate; - leftDesc = new string[] { "Show ext input", "Hide FPS", "Hide gui" }; - rightDesc = new string[] { "Screenshot", "Fullscreen", "Show axis lines", "Toggle auto-rotate" }; + leftDesc = new string[] { "Show ext input", "Hide FPS", "Hide gui", "Hotbar switching" }; + rightDesc = new string[] { "Screenshot", "Fullscreen", "Show axis lines", "Toggle auto-rotate", }; title = "Other controls"; leftPage = (g, w) => g.Gui.SetNewScreen(new HacksKeyBindingsScreen(g)); diff --git a/ClassicalSharp/2D/Widgets/HotbarWidget.cs b/ClassicalSharp/2D/Widgets/HotbarWidget.cs index 2156e476d..0623378a0 100644 --- a/ClassicalSharp/2D/Widgets/HotbarWidget.cs +++ b/ClassicalSharp/2D/Widgets/HotbarWidget.cs @@ -103,7 +103,7 @@ namespace ClassicalSharp.Gui.Widgets { if (key >= Key.Number1 && key <= Key.Number9) { int index = (int)key - (int)Key.Number1; - if (game.Input.AltDown) { + if (game.IsKeyDown(KeyBind.HotbarSwitching)) { // Pick from first to ninth row game.Inventory.Offset = index * Inventory.BlocksPerRow; altHandled = true; @@ -120,7 +120,7 @@ namespace ClassicalSharp.Gui.Widgets { // a) user presses alt then number // b) user presses alt // thus we only do case b) if case a) did not happen - if (!(key == Key.AltLeft || key == Key.AltRight)) return false; + if (key != game.Input.Keys[KeyBind.HotbarSwitching]) return false; if (altHandled) { altHandled = false; return true; } // handled already // Alternate between first and second row diff --git a/ClassicalSharp/Entities/Components/AnimatedComponent.cs b/ClassicalSharp/Entities/Components/AnimatedComponent.cs index dbd8e9abf..0fe2312b1 100644 --- a/ClassicalSharp/Entities/Components/AnimatedComponent.cs +++ b/ClassicalSharp/Entities/Components/AnimatedComponent.cs @@ -14,13 +14,13 @@ namespace ClassicalSharp.Entities { this.game = game; this.entity = entity; } - - public float legXRot, armXRot, armZRot; + public float bobbingHor, bobbingVer, bobbingModel, tiltX, tiltY; - public float walkTime, swing, bobStrength = 1, velTiltStrength = 1; - + public float walkTime, swing, bobStrength = 1, velTiltStrength = 1; internal float walkTimeO, walkTimeN, swingO, swingN; - internal float leftXRot, leftZRot, rightXRot, rightZRot; + + public float leftLegX, leftLegZ, rightLegX, rightLegZ; + public float leftArmX, leftArmZ, rightArmX, rightArmZ; /// Calculates the next animation state based on old and new position. public void UpdateAnimState(Vector3 oldPos, Vector3 newPos, double delta) { @@ -54,9 +54,13 @@ namespace ClassicalSharp.Entities { float idleXRot = (float)(Math.Sin(idleTime * idleXPeriod) * idleMax); float idleZRot = (float)(idleMax + Math.Cos(idleTime * idleZPeriod) * idleMax); - armXRot = (float)(Math.Cos(walkTime) * swing * armMax) - idleXRot; - legXRot = -(float)(Math.Cos(walkTime) * swing * legMax); - armZRot = -idleZRot; + leftArmX = (float)(Math.Cos(walkTime) * swing * armMax) - idleXRot; + leftArmZ = -idleZRot; + leftLegX = -(float)(Math.Cos(walkTime) * swing * legMax); + leftLegZ = 0; + + rightLegX = -leftLegX; rightLegZ = -leftLegZ; + rightArmX = -leftArmX; rightArmZ = -leftArmZ; bobbingHor = (float)(Math.Cos(walkTime) * swing * (2.5f/16f)); bobbingVer = (float)(Math.Abs(Math.Sin(walkTime)) * swing * (2.5f/16f)); @@ -71,7 +75,7 @@ namespace ClassicalSharp.Entities { tiltY = (float)Math.Sin(walkTime) * swing * (0.15f * Utils.Deg2Rad); } - if (entity.Model is HumanoidModel) + if (entity.Model.CalcHumanAnims && !game.SimpleArmsAnim) CalcHumanAnim(idleXRot, idleZRot); } @@ -82,14 +86,9 @@ namespace ClassicalSharp.Entities { } void CalcHumanAnim(float idleXRot, float idleZRot) { - if (game.SimpleArmsAnim) { - leftXRot = armXRot; leftZRot = armZRot; - rightXRot = -armXRot; rightZRot = -armZRot; - } else { - PerpendicularAnim(0.23f, idleXRot, idleZRot, out leftXRot, out leftZRot); - PerpendicularAnim(0.28f, idleXRot, idleZRot, out rightXRot, out rightZRot); - rightXRot = -rightXRot; rightZRot = -rightZRot; - } + PerpendicularAnim(0.23f, idleXRot, idleZRot, out leftArmX, out leftArmZ); + PerpendicularAnim(0.28f, idleXRot, idleZRot, out rightArmX, out rightArmZ); + rightArmX = -rightArmX; rightArmZ = -rightArmZ; } const float maxAngle = 110 * Utils.Deg2Rad; diff --git a/ClassicalSharp/Entities/Components/HacksComponent.cs b/ClassicalSharp/Entities/Components/HacksComponent.cs index 49193c26c..6cf6a87ba 100644 --- a/ClassicalSharp/Entities/Components/HacksComponent.cs +++ b/ClassicalSharp/Entities/Components/HacksComponent.cs @@ -71,6 +71,7 @@ namespace ClassicalSharp.Entities { public bool HalfSpeeding; public bool CanJumpHigher { get { return Enabled && CanAnyHacks && CanSpeed; } } + public bool Floating { get { return Noclip || Flying; } } /// Parses hack flags specified in the motd and/or name of the server. /// Recognises +/-hax, +/-fly, +/-noclip, +/-speed, +/-respawn, +/-ophax, and horspeed=xyz diff --git a/ClassicalSharp/Entities/Components/PhysicsComponent.cs b/ClassicalSharp/Entities/Components/PhysicsComponent.cs index 5878ca56d..06e5cee1b 100644 --- a/ClassicalSharp/Entities/Components/PhysicsComponent.cs +++ b/ClassicalSharp/Entities/Components/PhysicsComponent.cs @@ -33,7 +33,7 @@ namespace ClassicalSharp.Entities { } public void UpdateVelocityState() { - if (hacks.Flying || hacks.Noclip) { + if (hacks.Floating) { entity.Velocity.Y = 0; // eliminate the effect of gravity int dir = (hacks.FlyingUp || jumping) ? 1 : (hacks.FlyingDown ? -1 : 0); @@ -109,34 +109,34 @@ namespace ClassicalSharp.Entities { public void PhysicsTick(Vector3 vel) { if (hacks.Noclip) entity.onGround = false; - float multiply = GetBaseMultiply(true); - float yMultiply = GetBaseMultiply(hacks.CanSpeed); - float modifier = LowestSpeedModifier(); + float baseSpeed = GetBaseSpeed(); + float verSpeed = baseSpeed * Math.Max(1, GetSpeed(hacks.CanSpeed, 8f) / 5); + float horSpeed = baseSpeed * GetSpeed(true, 8f/5); + // previously horSpeed used to be multiplied by factor of 0.02 in last case + // it's now multiplied by 0.1, so need to divide by 5 so user speed modifier comes out same - float yMul = Math.Max(1f, yMultiply / 5) * modifier; - float horMul = multiply * modifier; - if (!(hacks.Flying || hacks.Noclip)) { - if (secondJump) { horMul *= 93f; yMul *= 10f; } - else if (firstJump) { horMul *= 46.5f; yMul *= 7.5f; } + if (!hacks.Floating) { + if (secondJump) { horSpeed *= 93f; verSpeed *= 10f; } + else if (firstJump) { horSpeed *= 46.5f; verSpeed *= 7.5f; } } - if (entity.TouchesAnyWater() && !hacks.Flying && !hacks.Noclip) { - MoveNormal(vel, 0.02f * horMul, waterDrag, liquidGrav, yMul); - } else if (entity.TouchesAnyLava() && !hacks.Flying && !hacks.Noclip) { - MoveNormal(vel, 0.02f * horMul, lavaDrag, liquidGrav, yMul); - } else if (entity.TouchesAnyRope() && !hacks.Flying && !hacks.Noclip) { - MoveNormal(vel, 0.02f * 1.7f, ropeDrag, ropeGrav, yMul); + if (entity.TouchesAnyWater() && !hacks.Floating) { + MoveNormal(vel, 0.02f * horSpeed, waterDrag, liquidGrav, verSpeed); + } else if (entity.TouchesAnyLava() && !hacks.Floating) { + MoveNormal(vel, 0.02f * horSpeed, lavaDrag, liquidGrav, verSpeed); + } else if (entity.TouchesAnyRope() && !hacks.Floating) { + MoveNormal(vel, 0.02f * 1.7f, ropeDrag, ropeGrav, verSpeed); } else { - float factor = !(hacks.Flying || hacks.Noclip) && entity.onGround ? 0.1f : 0.02f; + float factor = hacks.Floating || entity.onGround ? 0.1f : 0.02f; float gravity = useLiquidGravity ? liquidGrav : entity.Model.Gravity; - if (hacks.Flying || hacks.Noclip) { - MoveFlying(vel, factor * horMul, entity.Model.Drag, gravity, yMul); + if (hacks.Floating) { + MoveFlying(vel, factor * horSpeed, entity.Model.Drag, gravity, verSpeed); } else { - MoveNormal(vel, factor * horMul, entity.Model.Drag, gravity, yMul); + MoveNormal(vel, factor * horSpeed, entity.Model.Drag, gravity, verSpeed); } - if (entity.BlockUnderFeet == Block.Ice && !(hacks.Flying || hacks.Noclip)) { + if (entity.BlockUnderFeet == Block.Ice && !hacks.Floating) { // limit components to +-0.25f by rescaling vector to [-0.25, 0.25] if (Math.Abs(entity.Velocity.X) > 0.25f || Math.Abs(entity.Velocity.Z) > 0.25f) { float scale = Math.Min( @@ -189,19 +189,15 @@ namespace ClassicalSharp.Entities { entity.Velocity.Y -= gravity; } - float GetBaseMultiply(bool canSpeed) { - float multiply = 0; - float speed = (hacks.Flying || hacks.Noclip) ? 8 : 1; - - - if (hacks.Speeding && canSpeed) multiply += speed * hacks.SpeedMultiplier; - if (hacks.HalfSpeeding && canSpeed) multiply += speed * hacks.SpeedMultiplier / 2; - if (multiply == 0) multiply = speed; - return hacks.CanSpeed ? multiply : Math.Min(multiply, hacks.MaxSpeedMultiplier); + float GetSpeed(bool canSpeed, float speedMul) { + float factor = hacks.Floating ? speedMul : 1, speed = factor; + if (hacks.Speeding && canSpeed) speed += factor * hacks.SpeedMultiplier; + if (hacks.HalfSpeeding && canSpeed) speed += factor * hacks.SpeedMultiplier / 2; + return hacks.CanSpeed ? speed : Math.Min(speed, hacks.MaxSpeedMultiplier); } const float inf = float.PositiveInfinity; - float LowestSpeedModifier() { + float GetBaseSpeed() { AABB bounds = entity.Bounds; useLiquidGravity = false; float baseModifier = LowestModifier(bounds, false); diff --git a/ClassicalSharp/Entities/Entity.cs b/ClassicalSharp/Entities/Entity.cs index b597f4a79..16423fc70 100644 --- a/ClassicalSharp/Entities/Entity.cs +++ b/ClassicalSharp/Entities/Entity.cs @@ -109,7 +109,7 @@ namespace ClassicalSharp.Entities { return game.World.SafeGetBlock(Vector3I.Floor(coords)); } - internal Matrix4 TransformMatrix(float scale, Vector3 pos) { + public Matrix4 TransformMatrix(float scale, Vector3 pos) { return Matrix4.RotateZ(-RotZ * Utils.Deg2Rad) * Matrix4.RotateX(-RotX * Utils.Deg2Rad) * diff --git a/ClassicalSharp/Entities/Model/BlockModel.cs b/ClassicalSharp/Entities/Model/BlockModel.cs index 25bdc1df9..7f75de4e3 100644 --- a/ClassicalSharp/Entities/Model/BlockModel.cs +++ b/ClassicalSharp/Entities/Model/BlockModel.cs @@ -75,8 +75,8 @@ namespace ClassicalSharp.Model { return base.RenderDistance(p); } - int lastTexId = -1; - protected override void DrawModel(Entity p) { + int lastTexId = -1, col; + public override void DrawModel(Entity p) { // TODO: using 'is' is ugly, but means we can avoid creating // a string every single time held block changes. if (p is FakePlayer) { @@ -94,6 +94,7 @@ namespace ClassicalSharp.Model { col = FastColour.ScalePacked(col, colScale); block = ((FakePlayer)p).Block; } else { + col = cols[0]; block = Utils.FastByte(p.ModelName); } diff --git a/ClassicalSharp/Entities/Model/ChickenModel.cs b/ClassicalSharp/Entities/Model/ChickenModel.cs index b94c38c06..5bb8bd7d6 100644 --- a/ClassicalSharp/Entities/Model/ChickenModel.cs +++ b/ClassicalSharp/Entities/Model/ChickenModel.cs @@ -55,21 +55,22 @@ namespace ClassicalSharp.Model { get { return new AABB(-4/16f, 0, -8/16f, 4/16f, 15/16f, 4/16f); } } - protected override void DrawModel(Entity p) { + public override void DrawModel(Entity p) { game.Graphics.BindTexture(GetTexture(p.MobTextureId)); DrawRotate(-p.HeadXRadians, 0, 0, Head, true); DrawRotate(-p.HeadXRadians, 0, 0, Head2, true); DrawRotate(-p.HeadXRadians, 0, 0, Head3, true); DrawPart(Torso); - DrawRotate(0, 0, -Math.Abs(p.anim.armXRot), LeftWing, false); - DrawRotate(0, 0, Math.Abs(p.anim.armXRot), RightWing, false); + DrawRotate(0, 0, -Math.Abs(p.anim.leftArmX), LeftWing, false); + DrawRotate(0, 0, Math.Abs(p.anim.leftArmX), RightWing, false); + int col = cols[0]; for (int i = 0; i < cols.Length; i++) { cols[i] = FastColour.ScalePacked(col, 0.7f); } - DrawRotate(p.anim.legXRot, 0, 0, LeftLeg, false); - DrawRotate(-p.anim.legXRot, 0, 0, RightLeg, false); + DrawRotate(p.anim.leftLegX, 0, 0, LeftLeg, false); + DrawRotate(p.anim.rightLegX, 0, 0, RightLeg, false); UpdateVB(); } diff --git a/ClassicalSharp/Entities/Model/CreeperModel.cs b/ClassicalSharp/Entities/Model/CreeperModel.cs index 8b1646ccd..f7d74358d 100644 --- a/ClassicalSharp/Entities/Model/CreeperModel.cs +++ b/ClassicalSharp/Entities/Model/CreeperModel.cs @@ -50,15 +50,15 @@ namespace ClassicalSharp.Model { } /// - protected override void DrawModel(Entity p) { + public override void DrawModel(Entity p) { game.Graphics.BindTexture(GetTexture(p.MobTextureId)); DrawRotate(-p.HeadXRadians, 0, 0, Head, true); DrawPart(Torso); - DrawRotate(p.anim.legXRot, 0, 0, LeftLegFront, false); - DrawRotate(-p.anim.legXRot, 0, 0, RightLegFront, false); - DrawRotate(-p.anim.legXRot, 0, 0, LeftLegBack, false); - DrawRotate(p.anim.legXRot, 0, 0, RightLegBack, false); + DrawRotate(p.anim.leftLegX, 0, 0, LeftLegFront, false); + DrawRotate(p.anim.rightLegX, 0, 0, RightLegFront, false); + DrawRotate(p.anim.rightLegX, 0, 0, LeftLegBack, false); + DrawRotate(p.anim.leftLegX, 0, 0, RightLegBack, false); UpdateVB(); } diff --git a/ClassicalSharp/Entities/Model/CustomModel.cs b/ClassicalSharp/Entities/Model/CustomModel.cs index 43e3c4221..7d8bf173e 100644 --- a/ClassicalSharp/Entities/Model/CustomModel.cs +++ b/ClassicalSharp/Entities/Model/CustomModel.cs @@ -29,7 +29,7 @@ namespace ClassicalSharp.Model { internal AABB pickingBounds; public override AABB PickingBounds { get { return pickingBounds; } } - protected override void DrawModel(Entity p) { + public override void DrawModel(Entity p) { int texId = p.TextureId <= 0 ? cache.HumanoidTexId : p.TextureId; } diff --git a/ClassicalSharp/Entities/Model/HumanModels.cs b/ClassicalSharp/Entities/Model/HumanModels.cs index e896fa53e..0f29a9e01 100644 --- a/ClassicalSharp/Entities/Model/HumanModels.cs +++ b/ClassicalSharp/Entities/Model/HumanModels.cs @@ -38,85 +38,44 @@ namespace ClassicalSharp.Model { } } - public class SittingModel : HumanoidModel { + public class SittingModel : IModel { - public SittingModel(Game window) : base(window) { } + public SittingModel(Game window) : base(window) { + CalcHumanAnims = true; + } const int sitOffset = 10; - protected override void MakeDescriptions() { - head = MakeBoxBounds(-4, 24-sitOffset, -4, 4, 32-sitOffset, 4).RotOrigin(0, (sbyte)(24-sitOffset), 0); - torso = MakeBoxBounds(-4, 12-sitOffset, -2, 4, 24-sitOffset, 2); - lLeg = MakeBoxBounds(-4, 0-sitOffset, -2, 0, 12-sitOffset, 2).RotOrigin(0, (sbyte)(12-sitOffset), 0); - rLeg = MakeBoxBounds(0, 0-sitOffset, -2, 4, 12-sitOffset, 2).RotOrigin(0, (sbyte)(12-sitOffset), 0); - lArm = MakeBoxBounds(-8, 12-sitOffset, -2, -4, 24-sitOffset, 2).RotOrigin(-5, (sbyte)(22-sitOffset), 0); - rArm = MakeBoxBounds(4, 12-sitOffset, -2, 8, 24-sitOffset, 2).RotOrigin(5, (sbyte)(22-sitOffset), 0); - } + public override void CreateParts() { } public override float MaxScale { get { return 2; } } public override float ShadowScale { get { return 0.5f; } } - public override float NameYOffset { get { return (32-sitOffset)/16f + 0.5f/16f; } } + public override float NameYOffset { get { return (32 - sitOffset)/16f + 0.5f/16f; } } - public override float GetEyeY(Entity entity) { return (26-sitOffset)/16f; } + public override float GetEyeY(Entity entity) { return (26 - sitOffset)/16f; } public override Vector3 CollisionSize { - get { return new Vector3(8/16f + 0.6f/16f, (28.1f-sitOffset)/16f, 8/16f + 0.6f/16f); } + get { return new Vector3(8/16f + 0.6f/16f, (28.1f - sitOffset)/16f, 8/16f + 0.6f/16f); } } public override AABB PickingBounds { - get { return new AABB(-8/16f, 0, -4/16f, 8/16f, (32-sitOffset)/16f, 4/16f); } + get { return new AABB(-8/16f, 0, -4/16f, 8/16f, (32 - sitOffset)/16f, 4/16f); } } - protected override void DrawModel(Entity p) { - game.Graphics.BindTexture(GetTexture(p.TextureId)); - game.Graphics.AlphaTest = false; - - bool _64x64 = p.SkinType != SkinType.Type64x32; - uScale = p.uScale / 64f; - vScale = p.vScale / (_64x64 ? 64 : 32); - RenderParts(p); + protected override Matrix4 TransformMatrix(Entity p, Vector3 pos) { + pos.Y -= sitOffset / 16f; + return p.TransformMatrix(p.ModelScale, pos); } - protected override void RenderParts(Entity p) { - SkinType skinType = p.SkinType; - ModelSet model = skinType == SkinType.Type64x64Slim ? SetSlim : - (skinType == SkinType.Type64x64 ? Set64 : Set); + public override void DrawModel(Entity p) { + p.anim.leftLegX = 1.5f; p.anim.rightLegX = 1.5f; + p.anim.leftLegZ = -0.1f; p.anim.rightLegZ = 0.1f; - DrawRotate(-p.HeadXRadians, 0, 0, model.Head, true); - DrawPart(model.Torso); - - float legRotateX = 1.5f; - float legRotateZ = 0.1f; - - DrawRotate(legRotateX, 0, -legRotateZ, model.LeftLeg, false); - DrawRotate(legRotateX, 0, legRotateZ, model.RightLeg, false); - Rotate = RotateOrder.XZY; - //DrawRotate(0, 0, -legRotateZ, model.LeftArm, false); - //DrawRotate(0, 0, legRotateZ, model.RightArm, false); - DrawRotate(p.anim.leftXRot, 0, p.anim.leftZRot, model.LeftArm, false); - DrawRotate(p.anim.rightXRot, 0, p.anim.rightZRot, model.RightArm, false); - Rotate = RotateOrder.ZYX; - UpdateVB(); - - game.Graphics.AlphaTest = true; - index = 0; - if (skinType != SkinType.Type64x32) { - DrawPart(model.TorsoLayer); - DrawRotate(legRotateX, 0, -legRotateZ, model.LeftLegLayer, false); - DrawRotate(legRotateX, 0, legRotateZ, model.RightLegLayer, false); - Rotate = RotateOrder.XZY; - - DrawRotate(p.anim.leftXRot, 0, p.anim.leftZRot, model.LeftArmLayer, false); - DrawRotate(p.anim.rightXRot, 0, p.anim.rightZRot, model.RightArmLayer, false); - //DrawRotate(0, 0, -legRotateZ, model.LeftArmLayer, false); - //DrawRotate(0, 0, legRotateZ, model.RightArmLayer, false); - Rotate = RotateOrder.ZYX; - } - DrawRotate(-p.HeadXRadians, 0, 0, model.Hat, true); - UpdateVB(); - } - + IModel model = game.ModelCache.Models[0].Instance; + model.SetupState(p); + model.DrawModel(p); + } } public class HumanoidHeadModel : HumanoidModel { diff --git a/ClassicalSharp/Entities/Model/HumanoidModel.cs b/ClassicalSharp/Entities/Model/HumanoidModel.cs index 9e07aca96..432bf5693 100644 --- a/ClassicalSharp/Entities/Model/HumanoidModel.cs +++ b/ClassicalSharp/Entities/Model/HumanoidModel.cs @@ -10,7 +10,9 @@ namespace ClassicalSharp.Model { public class HumanoidModel : IModel { public ModelSet Set, SetSlim, Set64; - public HumanoidModel(Game window) : base(window) { } + public HumanoidModel(Game window) : base(window) { + CalcHumanAnims = true; + } protected BoxDesc head, torso, lLeg, rLeg, lArm, rArm; protected float offset = 0.5f; @@ -82,7 +84,7 @@ namespace ClassicalSharp.Model { get { return new AABB(-8/16f, 0, -4/16f, 8/16f, 32/16f, 4/16f); } } - protected override void DrawModel(Entity p) { + public override void DrawModel(Entity p) { game.Graphics.BindTexture(GetTexture(p.TextureId)); game.Graphics.AlphaTest = false; @@ -100,11 +102,11 @@ namespace ClassicalSharp.Model { DrawRotate(-p.HeadXRadians, 0, 0, model.Head, true); DrawPart(model.Torso); - DrawRotate(p.anim.legXRot, 0, 0, model.LeftLeg, false); - DrawRotate(-p.anim.legXRot, 0, 0, model.RightLeg, false); + DrawRotate(p.anim.leftLegX, 0, p.anim.leftLegZ, model.LeftLeg, false); + DrawRotate(p.anim.rightLegX, 0, p.anim.rightLegZ, model.RightLeg, false); Rotate = RotateOrder.XZY; - DrawRotate(p.anim.leftXRot, 0, p.anim.leftZRot, model.LeftArm, false); - DrawRotate(p.anim.rightXRot, 0, p.anim.rightZRot, model.RightArm, false); + DrawRotate(p.anim.leftArmX, 0, p.anim.leftArmZ, model.LeftArm, false); + DrawRotate(p.anim.rightArmX, 0, p.anim.rightArmZ, model.RightArm, false); Rotate = RotateOrder.ZYX; UpdateVB(); @@ -112,11 +114,11 @@ namespace ClassicalSharp.Model { index = 0; if (skinType != SkinType.Type64x32) { DrawPart(model.TorsoLayer); - DrawRotate(p.anim.legXRot, 0, 0, model.LeftLegLayer, false); - DrawRotate(-p.anim.legXRot, 0, 0, model.RightLegLayer, false); + DrawRotate(p.anim.leftLegX, 0, 0, model.LeftLegLayer, false); + DrawRotate(p.anim.rightLegX, 0, 0, model.RightLegLayer, false); Rotate = RotateOrder.XZY; - DrawRotate(p.anim.leftXRot, 0, p.anim.leftZRot, model.LeftArmLayer, false); - DrawRotate(p.anim.rightXRot, 0, p.anim.rightZRot, model.RightArmLayer, false); + DrawRotate(p.anim.leftArmX, 0, p.anim.leftArmZ, model.LeftArmLayer, false); + DrawRotate(p.anim.rightArmX, 0, p.anim.rightArmZ, model.RightArmLayer, false); Rotate = RotateOrder.ZYX; } DrawRotate(-p.HeadXRadians, 0, 0, model.Hat, true); diff --git a/ClassicalSharp/Entities/Model/IModel.cs b/ClassicalSharp/Entities/Model/IModel.cs index 7a54ed41e..d144160d0 100644 --- a/ClassicalSharp/Entities/Model/IModel.cs +++ b/ClassicalSharp/Entities/Model/IModel.cs @@ -30,6 +30,9 @@ namespace ClassicalSharp.Model { /// Whether this entity requires downloading of a skin texture. public bool UsesSkin = true; + /// Whether humanoid animations should be calculated, instead of normal animations. + public bool CalcHumanAnims; + /// Gravity applied to this entity. public virtual float Gravity { get { return 0.08f; } } @@ -64,7 +67,6 @@ namespace ClassicalSharp.Model { /// assuming that the model is not rotated at all. public abstract AABB PickingBounds { get; } - protected Vector3 pos; protected float cosHead, sinHead; protected float uScale, vScale; @@ -100,14 +102,25 @@ namespace ClassicalSharp.Model { /// Sets up the state for, then renders an entity model, /// based on the given entity's position and orientation. public void Render(Entity p) { - index = 0; - pos = p.Position; + Vector3 pos = p.Position; if (Bobbing) pos.Y += p.anim.bobbingModel; - - Vector3I P = Vector3I.Floor(p.EyePosition); - col = game.World.IsValidPos(P) ? game.Lighting.LightCol(P.X, P.Y, P.Z) : game.Lighting.Outside; - uScale = 1 / 64f; vScale = 1 / 32f; + SetupState(p); + game.Graphics.SetBatchFormat(VertexFormat.P3fT2fC4b); + game.Graphics.PushMatrix(); + + Matrix4 m = TransformMatrix(p, pos); + game.Graphics.MultiplyMatrix(ref m); + DrawModel(p); + game.Graphics.PopMatrix(); + } + + public void SetupState(Entity p) { + index = 0; + Vector3I P = Vector3I.Floor(p.EyePosition); + int col = game.World.IsValidPos(P) ? game.Lighting.LightCol(P.X, P.Y, P.Z) : game.Lighting.Outside; + uScale = 1 / 64f; vScale = 1 / 32f; + cols[0] = col; cols[1] = FastColour.ScalePacked(col, FastColour.ShadeYBottom); cols[2] = FastColour.ScalePacked(col, FastColour.ShadeZ); cols[3] = cols[2]; @@ -116,18 +129,10 @@ namespace ClassicalSharp.Model { float yawDelta = p.HeadY - p.RotY; cosHead = (float)Math.Cos(yawDelta * Utils.Deg2Rad); sinHead = (float)Math.Sin(yawDelta * Utils.Deg2Rad); - - game.Graphics.SetBatchFormat(VertexFormat.P3fT2fC4b); - game.Graphics.PushMatrix(); - - Matrix4 m = p.TransformMatrix(p.ModelScale, pos); - game.Graphics.MultiplyMatrix(ref m); - DrawModel(p); - game.Graphics.PopMatrix(); } /// Performs the actual rendering of an entity model. - protected abstract void DrawModel(Entity p); + public abstract void DrawModel(Entity p); /// Sends the updated vertex data to the GPU. protected void UpdateVB() { @@ -140,7 +145,11 @@ namespace ClassicalSharp.Model { /// Disposes of any native resources tied to this entity model. public virtual void Dispose() { } - protected int col; + + protected virtual Matrix4 TransformMatrix(Entity p, Vector3 pos) { + return p.TransformMatrix(p.ModelScale, pos); + } + protected int[] cols = new int[6]; protected internal ModelVertex[] vertices; protected internal int index, texIndex; diff --git a/ClassicalSharp/Entities/Model/PigModel.cs b/ClassicalSharp/Entities/Model/PigModel.cs index 5d2fc4ae5..21964cd8c 100644 --- a/ClassicalSharp/Entities/Model/PigModel.cs +++ b/ClassicalSharp/Entities/Model/PigModel.cs @@ -49,15 +49,15 @@ namespace ClassicalSharp.Model { } /// - protected override void DrawModel(Entity p) { + public override void DrawModel(Entity p) { game.Graphics.BindTexture(GetTexture(p.MobTextureId)); DrawRotate(-p.HeadXRadians, 0, 0, Head, true); DrawPart(Torso); - DrawRotate(p.anim.legXRot, 0, 0, LeftLegFront, false); - DrawRotate(-p.anim.legXRot, 0, 0, RightLegFront, false); - DrawRotate(-p.anim.legXRot, 0, 0, LeftLegBack, false); - DrawRotate(p.anim.legXRot, 0, 0, RightLegBack, false); + DrawRotate(p.anim.leftLegX, 0, 0, LeftLegFront, false); + DrawRotate(p.anim.rightLegX, 0, 0, RightLegFront, false); + DrawRotate(p.anim.rightLegX, 0, 0, LeftLegBack, false); + DrawRotate(p.anim.leftLegX, 0, 0, RightLegBack, false); UpdateVB(); } diff --git a/ClassicalSharp/Entities/Model/SheepModel.cs b/ClassicalSharp/Entities/Model/SheepModel.cs index 595f389c4..bb89ed0a9 100644 --- a/ClassicalSharp/Entities/Model/SheepModel.cs +++ b/ClassicalSharp/Entities/Model/SheepModel.cs @@ -82,16 +82,16 @@ namespace ClassicalSharp.Model { } /// - protected override void DrawModel(Entity p) { + public override void DrawModel(Entity p) { IGraphicsApi gfx = game.Graphics; gfx.BindTexture(GetTexture(p.MobTextureId)); DrawRotate(-p.HeadXRadians, 0, 0, Head, true); DrawPart(Torso); - DrawRotate(p.anim.legXRot, 0, 0, LeftLegFront, false); - DrawRotate(-p.anim.legXRot, 0, 0, RightLegFront, false); - DrawRotate(-p.anim.legXRot, 0, 0, LeftLegBack, false); - DrawRotate(p.anim.legXRot, 0, 0, RightLegBack, false); + DrawRotate(p.anim.leftLegX, 0, 0, LeftLegFront, false); + DrawRotate(p.anim.rightLegX, 0, 0, RightLegFront, false); + DrawRotate(p.anim.rightLegX, 0, 0, LeftLegBack, false); + DrawRotate(p.anim.leftLegX, 0, 0, RightLegBack, false); UpdateVB(); if (Utils.CaselessEquals(p.ModelName, "sheep_nofur")) return; @@ -100,10 +100,10 @@ namespace ClassicalSharp.Model { DrawRotate(-p.HeadXRadians, 0, 0, FurHead, true); DrawPart(FurTorso); - DrawRotate(p.anim.legXRot, 0, 0, FurLeftLegFront, false); - DrawRotate(-p.anim.legXRot, 0, 0, FurRightLegFront, false); - DrawRotate(-p.anim.legXRot, 0, 0, FurLeftLegBack, false); - DrawRotate(p.anim.legXRot, 0, 0, FurRightLegBack, false); + DrawRotate(p.anim.leftLegX, 0, 0, FurLeftLegFront, false); + DrawRotate(p.anim.rightLegX, 0, 0, FurRightLegFront, false); + DrawRotate(p.anim.rightLegX, 0, 0, FurLeftLegBack, false); + DrawRotate(p.anim.leftLegX, 0, 0, FurRightLegBack, false); UpdateVB(); } diff --git a/ClassicalSharp/Entities/Model/SkeletonModel.cs b/ClassicalSharp/Entities/Model/SkeletonModel.cs index 1eba5be96..bf0e11ba7 100644 --- a/ClassicalSharp/Entities/Model/SkeletonModel.cs +++ b/ClassicalSharp/Entities/Model/SkeletonModel.cs @@ -44,15 +44,15 @@ namespace ClassicalSharp.Model { get { return new AABB(-4/16f, 0, -4/16f, 4/16f, 32/16f, 4/16f); } } - protected override void DrawModel(Entity p) { + public override void DrawModel(Entity p) { game.Graphics.BindTexture(GetTexture(p.MobTextureId)); DrawRotate(-p.HeadXRadians, 0, 0, Head, true); DrawPart(Torso); - DrawRotate(p.anim.legXRot, 0, 0, LeftLeg, false); - DrawRotate(-p.anim.legXRot, 0, 0, RightLeg, false); - DrawRotate(90 * Utils.Deg2Rad, 0, p.anim.armZRot, LeftArm, false); - DrawRotate(90 * Utils.Deg2Rad, 0, -p.anim.armZRot, RightArm, false); + DrawRotate(p.anim.leftLegX, 0, 0, LeftLeg, false); + DrawRotate(p.anim.rightLegX, 0, 0, RightLeg, false); + DrawRotate(90 * Utils.Deg2Rad, 0, p.anim.leftArmZ, LeftArm, false); + DrawRotate(90 * Utils.Deg2Rad, 0, p.anim.rightArmZ, RightArm, false); UpdateVB(); } diff --git a/ClassicalSharp/Entities/Model/SpiderModel.cs b/ClassicalSharp/Entities/Model/SpiderModel.cs index d5225ba4c..fa3bfa15d 100644 --- a/ClassicalSharp/Entities/Model/SpiderModel.cs +++ b/ClassicalSharp/Entities/Model/SpiderModel.cs @@ -48,7 +48,7 @@ namespace ClassicalSharp.Model { const float eighthPi = (float)(Math.PI / 8); /// - protected override void DrawModel(Entity p) { + public override void DrawModel(Entity p) { game.Graphics.BindTexture(GetTexture(p.MobTextureId)); DrawRotate(-p.HeadXRadians, 0, 0, Head, true); diff --git a/ClassicalSharp/Entities/Model/ZombieModel.cs b/ClassicalSharp/Entities/Model/ZombieModel.cs index 6d5d9cc78..3f2b36de9 100644 --- a/ClassicalSharp/Entities/Model/ZombieModel.cs +++ b/ClassicalSharp/Entities/Model/ZombieModel.cs @@ -47,15 +47,15 @@ namespace ClassicalSharp.Model { get { return new AABB(-4/16f, 0, -4/16f, 4/16f, 32/16f, 4/16f); } } - protected override void DrawModel(Entity p) { + public override void DrawModel(Entity p) { game.Graphics.BindTexture(GetTexture(p.MobTextureId)); DrawRotate(-p.HeadXRadians, 0, 0, Head, true); DrawPart(Torso); - DrawRotate(p.anim.legXRot, 0, 0, LeftLeg, false); - DrawRotate(-p.anim.legXRot, 0, 0, RightLeg, false); - DrawRotate(90 * Utils.Deg2Rad, 0, p.anim.armZRot, LeftArm, false); - DrawRotate(90 * Utils.Deg2Rad, 0, -p.anim.armZRot, RightArm, false); + DrawRotate(p.anim.leftLegX, 0, 0, LeftLeg, false); + DrawRotate(p.anim.rightLegX, 0, 0, RightLeg, false); + DrawRotate(90 * Utils.Deg2Rad, 0, p.anim.leftArmZ, LeftArm, false); + DrawRotate(90 * Utils.Deg2Rad, 0, p.anim.rightArmZ, RightArm, false); DrawRotate(-p.HeadXRadians, 0, 0, Hat, true); UpdateVB(); } diff --git a/ClassicalSharp/Game/KeyMap.cs b/ClassicalSharp/Game/KeyMap.cs index 28cb4209f..9ed1a4a9b 100644 --- a/ClassicalSharp/Game/KeyMap.cs +++ b/ClassicalSharp/Game/KeyMap.cs @@ -11,7 +11,8 @@ namespace ClassicalSharp { Inventory, ToggleFog, SendChat, PauseOrExit, PlayerList, Speed, NoClip, Fly, FlyUp, FlyDown, ExtInput, HideFps, Screenshot, Fullscreen, ThirdPerson, HideGui, AxisLines, - ZoomScrolling, HalfSpeed, MouseLeft, MouseMiddle, MouseRight, Autorotate, + ZoomScrolling, HalfSpeed, MouseLeft, MouseMiddle, MouseRight, + Autorotate, HotbarSwitching #pragma warning restore 1591 } @@ -34,7 +35,7 @@ namespace ClassicalSharp { public KeyMap() { // We can't use enum array initaliser because this causes problems when building with mono // and running on default .NET (https://bugzilla.xamarin.com/show_bug.cgi?id=572) - keys = new Key[31]; + keys = new Key[32]; keys[0] = Key.W; keys[1] = Key.S; keys[2] = Key.A; keys[3] = Key.D; keys[4] = Key.Space; keys[5] = Key.R; keys[6] = Key.Enter; keys[7] = Key.T; keys[8] = Key.B; keys[9] = Key.F; keys[10] = Key.Enter; @@ -42,9 +43,10 @@ namespace ClassicalSharp { keys[14] = Key.X; keys[15] = Key.Z; keys[16] = Key.Q; keys[17] = Key.E; keys[18] = Key.AltLeft; keys[19] = Key.F3; keys[20] = Key.F12; keys[21] = Key.F11; keys[22] = Key.F5; - keys[23] = Key.F1; keys[24] = Key.F7; keys[25] = Key.C; - keys[26] = Key.ControlLeft; - keys[27] = Key.Unknown; keys[28] = Key.Unknown; keys[29] = Key.Unknown; keys[30] = Key.F6; + keys[23] = Key.F1; keys[24] = Key.F7; keys[25] = Key.C; + keys[26] = Key.ControlLeft; + keys[27] = Key.Unknown; keys[28] = Key.Unknown; keys[29] = Key.Unknown; + keys[30] = Key.F6; keys[31] = Key.AltLeft; defaultKeys = new Key[keys.Length]; for (int i = 0; i < defaultKeys.Length; i++) diff --git a/ClassicalSharp/Rendering/Env/MapBordersRenderer.cs b/ClassicalSharp/Rendering/Env/MapBordersRenderer.cs index 4170c87d9..75d2a52a6 100644 --- a/ClassicalSharp/Rendering/Env/MapBordersRenderer.cs +++ b/ClassicalSharp/Rendering/Env/MapBordersRenderer.cs @@ -170,8 +170,9 @@ namespace ClassicalSharp.Renderers { sidesVertices += Utils.CountVertices(map.Width, map.Length, axisSize); // YQuads beneath map sidesVertices += 2 * Utils.CountVertices(map.Width, Math.Abs(y), axisSize); // ZQuads sidesVertices += 2 * Utils.CountVertices(map.Length, Math.Abs(y), axisSize); // XQuads - VertexP3fT2fC4b* v = stackalloc VertexP3fT2fC4b[sidesVertices]; - IntPtr ptr = (IntPtr)v; + + VertexP3fT2fC4b[] v = new VertexP3fT2fC4b[sidesVertices]; + int index = 0; fullColSides = game.BlockInfo.FullBright[block]; int col = fullColSides ? FastColour.WhitePacked : map.Env.Shadow; @@ -181,18 +182,18 @@ namespace ClassicalSharp.Renderers { for (int i = 0; i < rects.Length; i++) { Rectangle r = rects[i]; - DrawY(r.X, r.Y, r.X + r.Width, r.Y + r.Height, y, axisSize, col, 0, YOffset(block), ref v); + DrawY(r.X, r.Y, r.X + r.Width, r.Y + r.Height, y, axisSize, col, 0, YOffset(block), v, ref index); } // Work properly for when ground level is below 0 int y1 = 0, y2 = y; if (y < 0) { y1 = y; y2 = 0; } - DrawY(0, 0, map.Width, map.Length, 0, axisSize, col, 0, 0, ref v); - DrawZ(0, 0, map.Width, y1, y2, axisSize, col, ref v); - DrawZ(map.Length, 0, map.Width, y1, y2, axisSize, col, ref v); - DrawX(0, 0, map.Length, y1, y2, axisSize, col, ref v); - DrawX(map.Width, 0, map.Length, y1, y2, axisSize, col, ref v); - sidesVb = gfx.CreateVb(ptr, VertexFormat.P3fT2fC4b, sidesVertices); + DrawY(0, 0, map.Width, map.Length, 0, axisSize, col, 0, 0, v, ref index); + DrawZ(0, 0, map.Width, y1, y2, axisSize, col, v, ref index); + DrawZ(map.Length, 0, map.Width, y1, y2, axisSize, col, v, ref index); + DrawX(0, 0, map.Length, y1, y2, axisSize, col, v, ref index); + DrawX(map.Width, 0, map.Length, y1, y2, axisSize, col, v, ref index); + sidesVb = gfx.CreateVb(v, VertexFormat.P3fT2fC4b, sidesVertices); } void RebuildEdges(int y, int axisSize) { @@ -202,8 +203,8 @@ namespace ClassicalSharp.Renderers { Rectangle r = rects[i]; edgesVertices += Utils.CountVertices(r.Width, r.Height, axisSize); // YPlanes outside } - VertexP3fT2fC4b* v = stackalloc VertexP3fT2fC4b[edgesVertices]; - IntPtr ptr = (IntPtr)v; + VertexP3fT2fC4b[] v = new VertexP3fT2fC4b[edgesVertices]; + int index = 0; fullColEdge = game.BlockInfo.FullBright[block]; int col = fullColEdge ? FastColour.WhitePacked : map.Env.Sun; @@ -214,9 +215,9 @@ namespace ClassicalSharp.Renderers { for (int i = 0; i < rects.Length; i++) { Rectangle r = rects[i]; DrawY(r.X, r.Y, r.X + r.Width, r.Y + r.Height, y, axisSize, col, - HorOffset(block), YOffset(block), ref v); + HorOffset(block), YOffset(block), v, ref index); } - edgesVb = gfx.CreateVb(ptr, VertexFormat.P3fT2fC4b, edgesVertices); + edgesVb = gfx.CreateVb(v, VertexFormat.P3fT2fC4b, edgesVertices); } float HorOffset(BlockID block) { @@ -230,7 +231,7 @@ namespace ClassicalSharp.Renderers { } void DrawX(int x, int z1, int z2, int y1, int y2, int axisSize, - int col, ref VertexP3fT2fC4b* v) { + int col, VertexP3fT2fC4b[] v, ref int i) { int endZ = z2, endY = y2, startY = y1; for (; z1 < endZ; z1 += axisSize) { z2 = z1 + axisSize; @@ -241,16 +242,16 @@ namespace ClassicalSharp.Renderers { if (y2 > endY) y2 = endY; TextureRec rec = new TextureRec(0, 0, z2 - z1, y2 - y1); - *v = new VertexP3fT2fC4b(x, y1, z1, rec.U1, rec.V2, col); v++; - *v = new VertexP3fT2fC4b(x, y2, z1, rec.U1, rec.V1, col); v++; - *v = new VertexP3fT2fC4b(x, y2, z2, rec.U2, rec.V1, col); v++; - *v = new VertexP3fT2fC4b(x, y1, z2, rec.U2, rec.V2, col); v++; + v[i++] = new VertexP3fT2fC4b(x, y1, z1, rec.U1, rec.V2, col); + v[i++] = new VertexP3fT2fC4b(x, y2, z1, rec.U1, rec.V1, col); + v[i++] = new VertexP3fT2fC4b(x, y2, z2, rec.U2, rec.V1, col); + v[i++] = new VertexP3fT2fC4b(x, y1, z2, rec.U2, rec.V2, col); } } } void DrawZ(int z, int x1, int x2, int y1, int y2, int axisSize, - int col, ref VertexP3fT2fC4b* v) { + int col, VertexP3fT2fC4b[] v, ref int i) { int endX = x2, endY = y2, startY = y1; for (; x1 < endX; x1 += axisSize) { x2 = x1 + axisSize; @@ -261,16 +262,16 @@ namespace ClassicalSharp.Renderers { if (y2 > endY) y2 = endY; TextureRec rec = new TextureRec(0, 0, x2 - x1, y2 - y1); - *v = new VertexP3fT2fC4b(x1, y1, z, rec.U1, rec.V2, col); v++; - *v = new VertexP3fT2fC4b(x1, y2, z, rec.U1, rec.V1, col); v++; - *v = new VertexP3fT2fC4b(x2, y2, z, rec.U2, rec.V1, col); v++; - *v = new VertexP3fT2fC4b(x2, y1, z, rec.U2, rec.V2, col); v++; + v[i++] = new VertexP3fT2fC4b(x1, y1, z, rec.U1, rec.V2, col); + v[i++] = new VertexP3fT2fC4b(x1, y2, z, rec.U1, rec.V1, col); + v[i++] = new VertexP3fT2fC4b(x2, y2, z, rec.U2, rec.V1, col); + v[i++] = new VertexP3fT2fC4b(x2, y1, z, rec.U2, rec.V2, col); } } } void DrawY(int x1, int z1, int x2, int z2, float y, int axisSize, - int col, float offset, float yOffset, ref VertexP3fT2fC4b* v) { + int col, float offset, float yOffset, VertexP3fT2fC4b[] v, ref int i) { int endX = x2, endZ = z2, startZ = z1; for (; x1 < endX; x1 += axisSize) { x2 = x1 + axisSize; @@ -281,10 +282,10 @@ namespace ClassicalSharp.Renderers { if (z2 > endZ) z2 = endZ; TextureRec rec = new TextureRec(0, 0, x2 - x1, z2 - z1); - *v = new VertexP3fT2fC4b(x1 + offset, y + yOffset, z1 + offset, rec.U1, rec.V1, col); v++; - *v = new VertexP3fT2fC4b(x1 + offset, y + yOffset, z2 + offset, rec.U1, rec.V2, col); v++; - *v = new VertexP3fT2fC4b(x2 + offset, y + yOffset, z2 + offset, rec.U2, rec.V2, col); v++; - *v = new VertexP3fT2fC4b(x2 + offset, y + yOffset, z1 + offset, rec.U2, rec.V1, col); v++; + v[i++] = new VertexP3fT2fC4b(x1 + offset, y + yOffset, z1 + offset, rec.U1, rec.V1, col); + v[i++] = new VertexP3fT2fC4b(x1 + offset, y + yOffset, z2 + offset, rec.U1, rec.V2, col); + v[i++] = new VertexP3fT2fC4b(x2 + offset, y + yOffset, z2 + offset, rec.U2, rec.V2, col); + v[i++] = new VertexP3fT2fC4b(x2 + offset, y + yOffset, z1 + offset, rec.U2, rec.V1, col); } } } diff --git a/ClassicalSharp/TexturePack/Animations.cs b/ClassicalSharp/TexturePack/Animations.cs index b14c9c123..e95f73bfc 100644 --- a/ClassicalSharp/TexturePack/Animations.cs +++ b/ClassicalSharp/TexturePack/Animations.cs @@ -57,11 +57,11 @@ namespace ClassicalSharp.Textures { /// Runs through all animations and if necessary updates the terrain atlas. public void Tick(ScheduledTask task) { if (useLavaAnim) { - int size = Math.Min(game.TerrainAtlas.elementSize, 64); + int size = Math.Min(game.TerrainAtlas.TileSize, 64); DrawAnimation(null, 30, size); } if (useWaterAnim) { - int size = Math.Min(game.TerrainAtlas.elementSize, 64); + int size = Math.Min(game.TerrainAtlas.TileSize, 64); DrawAnimation(null, 14, size); } @@ -160,7 +160,7 @@ namespace ClassicalSharp.Textures { FastBitmap.MovePortion(data.FrameX + data.State * size, data.FrameY, 0, 0, animsBuffer, animPart, size); } - gfx.UpdateTexturePart(atlas.TexIds[index], 0, rowNum * game.TerrainAtlas.elementSize, animPart); + gfx.UpdateTexturePart(atlas.TexIds[index], 0, rowNum * game.TerrainAtlas.TileSize, animPart); } bool IsDefaultZip() { diff --git a/ClassicalSharp/TexturePack/TerrainAtlas1D.cs b/ClassicalSharp/TexturePack/TerrainAtlas1D.cs index 5e762278a..9767d75ce 100644 --- a/ClassicalSharp/TexturePack/TerrainAtlas1D.cs +++ b/ClassicalSharp/TexturePack/TerrainAtlas1D.cs @@ -41,15 +41,15 @@ namespace ClassicalSharp.Textures { public void UpdateState(TerrainAtlas2D atlas2D) { int maxVerticalSize = Math.Min(4096, gfx.MaxTextureDimensions); - int elementsPerFullAtlas = maxVerticalSize / atlas2D.elementSize; - int totalElements = TerrainAtlas2D.RowsCount * TerrainAtlas2D.ElementsPerRow; + int elementsPerFullAtlas = maxVerticalSize / atlas2D.TileSize; + int totalElements = TerrainAtlas2D.RowsCount * TerrainAtlas2D.TilesPerRow; int atlasesCount = Utils.CeilDiv(totalElements, elementsPerFullAtlas); elementsPerAtlas1D = Math.Min(elementsPerFullAtlas, totalElements); - int atlas1DHeight = Utils.NextPowerOf2(elementsPerAtlas1D * atlas2D.elementSize); + int atlas1DHeight = Utils.NextPowerOf2(elementsPerAtlas1D * atlas2D.TileSize); Convert2DTo1D(atlas2D, atlasesCount, atlas1DHeight); - elementsPerBitmap = atlas1DHeight / atlas2D.elementSize; + elementsPerBitmap = atlas1DHeight / atlas2D.TileSize; invElementSize = 1f / elementsPerBitmap; } @@ -65,8 +65,8 @@ namespace ClassicalSharp.Textures { } void Make1DTexture(int i, FastBitmap atlas, TerrainAtlas2D atlas2D, int atlas1DHeight, ref int index) { - int elemSize = atlas2D.elementSize; - using (Bitmap atlas1d = Platform.CreateBmp(atlas2D.elementSize, atlas1DHeight)) + int elemSize = atlas2D.TileSize; + using (Bitmap atlas1d = Platform.CreateBmp(atlas2D.TileSize, atlas1DHeight)) using (FastBitmap dst = new FastBitmap(atlas1d, true, false)) { for (int index1D = 0; index1D < elementsPerAtlas1D; index1D++) { @@ -80,8 +80,8 @@ namespace ClassicalSharp.Textures { public int CalcMaxUsedRow(TerrainAtlas2D atlas2D, BlockInfo info) { int maxVerSize = Math.Min(4096, gfx.MaxTextureDimensions); - int verElements = maxVerSize / atlas2D.elementSize; - int totalElements = GetMaxUsedRow(info.textures) * TerrainAtlas2D.ElementsPerRow; + int verElements = maxVerSize / atlas2D.TileSize; + int totalElements = GetMaxUsedRow(info.textures) * TerrainAtlas2D.TilesPerRow; return Utils.CeilDiv(totalElements, verElements); } diff --git a/ClassicalSharp/TexturePack/TerrainAtlas2D.cs b/ClassicalSharp/TexturePack/TerrainAtlas2D.cs index 1f3178ab9..23c05ed67 100644 --- a/ClassicalSharp/TexturePack/TerrainAtlas2D.cs +++ b/ClassicalSharp/TexturePack/TerrainAtlas2D.cs @@ -11,10 +11,10 @@ namespace ClassicalSharp { /// Represents a 2D packed texture atlas, specifically for terrain.png. public class TerrainAtlas2D : IDisposable { - public const int ElementsPerRow = 16, RowsCount = 16; - public const float invElementSize = 1 / 16f; + public const int TilesPerRow = 16, RowsCount = 16; public Bitmap AtlasBitmap; - public int elementSize; + public int TileSize; + IGraphicsApi gfx; IDrawer2D drawer; @@ -26,19 +26,19 @@ namespace ClassicalSharp { /// Updates the underlying atlas bitmap, fields, and texture. public void UpdateState(BlockInfo info, Bitmap bmp) { AtlasBitmap = bmp; - elementSize = bmp.Width / ElementsPerRow; + TileSize = bmp.Width / TilesPerRow; using (FastBitmap fastBmp = new FastBitmap(bmp, true, true)) info.RecalculateSpriteBB(fastBmp); } /// Creates a new texture that contains the tile at the specified index. public int LoadTextureElement(int index) { - int size = elementSize; + int size = TileSize; using (FastBitmap atlas = new FastBitmap(AtlasBitmap, true, true)) using (Bitmap bmp = Platform.CreateBmp(size, size)) using (FastBitmap dst = new FastBitmap(bmp, true, false)) { - int x = index % ElementsPerRow, y = index / ElementsPerRow; + int x = index % TilesPerRow, y = index / TilesPerRow; FastBitmap.MovePortion(x * size, y * size, 0, 0, atlas, dst, size); return gfx.CreateTexture(dst, true); }