diff --git a/ClassicalSharp/Entities/Entity.cs b/ClassicalSharp/Entities/Entity.cs
index ae1562223..316db352a 100644
--- a/ClassicalSharp/Entities/Entity.cs
+++ b/ClassicalSharp/Entities/Entity.cs
@@ -27,6 +27,10 @@ namespace ClassicalSharp.Entities {
/// The name of the model of this entity.
public string ModelName;
+ /// BlockID if model name is a vaid block id.
+ /// This avoids needing to repeatedly parse ModelName as a byte.
+ public BlockID ModelBlock;
+
/// Scale applied to the model for collision detection and rendering.
public Vector3 ModelScale = new Vector3(1.0f);
@@ -69,8 +73,7 @@ namespace ClassicalSharp.Entities {
protected void UpdateModel() {
BlockModel model = Model as BlockModel;
- if (model != null)
- model.CalcState(Utils.FastByte(ModelName));
+ if (model != null) model.CalcState(ModelBlock);
}
public abstract void Tick(double delta);
@@ -142,6 +145,11 @@ namespace ClassicalSharp.Entities {
ModelScale *= 2;
}
+ ModelBlock = Block.Air;
+ if (Byte.TryParse(ModelName, out ModelBlock)) {
+ ModelName = "block";
+ }
+
Model = game.ModelCache.Get(ModelName);
ParseScale(scale);
lastModelChange = DateTime.UtcNow;
diff --git a/ClassicalSharp/Entities/Model/BlockModel.cs b/ClassicalSharp/Entities/Model/BlockModel.cs
index 1acad8cde..7893c2ab4 100644
--- a/ClassicalSharp/Entities/Model/BlockModel.cs
+++ b/ClassicalSharp/Entities/Model/BlockModel.cs
@@ -34,10 +34,10 @@ namespace ClassicalSharp.Model {
public override float NameYOffset { get { return height + 0.075f; } }
public override float GetEyeY(Entity entity) {
- BlockID block = Byte.Parse(entity.ModelName);
+ BlockID block = entity.ModelBlock;
float minY = game.BlockInfo.MinBB[block].Y;
float maxY = game.BlockInfo.MaxBB[block].Y;
- return block == 0 ? 1 : (minY + maxY) / 2;
+ return block == Block.Air ? 1 : (minY + maxY) / 2;
}
static Vector3 colShrink = new Vector3(0.75f/16, 0.75f/16, 0.75f/16);
@@ -66,15 +66,9 @@ namespace ClassicalSharp.Model {
int lastTexId = -1;
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) {
- block = ((FakePlayer)p).Block;
- } else {
- block = Utils.FastByte(p.ModelName);
- }
-
+ block = p.ModelBlock;
CalcState(block);
+
if (game.BlockInfo.FullBright[block]) {
for (int i = 0; i < cols.Length; i++)
cols[i] = FastColour.WhitePacked;
diff --git a/ClassicalSharp/Entities/Model/ModelCache.cs b/ClassicalSharp/Entities/Model/ModelCache.cs
index e184b693a..94d0d9288 100644
--- a/ClassicalSharp/Entities/Model/ModelCache.cs
+++ b/ClassicalSharp/Entities/Model/ModelCache.cs
@@ -58,11 +58,6 @@ namespace ClassicalSharp.Model {
public IModel Get(string modelName) {
- if (modelName == "block") return Models[0].Instance;
- byte blockId;
- if (Byte.TryParse(modelName, out blockId))
- modelName = "block";
-
for (int i = 0; i < Models.Count; i++) {
CachedModel m = Models[i];
if (m.Name != modelName) continue;
diff --git a/ClassicalSharp/Rendering/HeldBlockAnimation.cs b/ClassicalSharp/Rendering/HeldBlockAnimation.cs
index 8e1b48aa4..da19ca464 100644
--- a/ClassicalSharp/Rendering/HeldBlockAnimation.cs
+++ b/ClassicalSharp/Rendering/HeldBlockAnimation.cs
@@ -74,8 +74,8 @@ namespace ClassicalSharp.Renderers {
// i.e. the block has gone to bottom of screen and is now returning back up
// at this point we switch over to the new held block.
if (pos.Y > last.Y)
- lastType = held.type;
- held.type = lastType;
+ lastType = held.block;
+ held.block = lastType;
}
} else {
if (time >= period * 0.25) DigSecondCycle();
diff --git a/ClassicalSharp/Rendering/HeldBlockRenderer.cs b/ClassicalSharp/Rendering/HeldBlockRenderer.cs
index 8f97ec51e..98890af8d 100644
--- a/ClassicalSharp/Rendering/HeldBlockRenderer.cs
+++ b/ClassicalSharp/Rendering/HeldBlockRenderer.cs
@@ -16,7 +16,7 @@ namespace ClassicalSharp.Renderers {
public class HeldBlockRenderer : IGameComponent {
- internal BlockID type;
+ internal BlockID block;
IModel model;
internal HeldBlockAnimation anim;
@@ -26,7 +26,7 @@ namespace ClassicalSharp.Renderers {
public void Init(Game game) {
this.game = game;
- model = game.ModelCache.Get("0");
+ model = game.ModelCache.Get("block");
held = new FakePlayer(game);
game.Events.ProjectionChanged += ProjectionChanged;
@@ -44,7 +44,7 @@ namespace ClassicalSharp.Renderers {
Vector3 last = anim.pos;
anim.pos = Vector3.Zero;
- type = game.Inventory.Selected;
+ block = game.Inventory.Selected;
held.RotX = 0;
if (anim.doAnim) anim.Update(delta, last);
@@ -54,7 +54,7 @@ namespace ClassicalSharp.Renderers {
SetMatrix();
game.Graphics.Texturing = true;
- game.Graphics.SetupAlphaState(game.BlockInfo.Draw[type]);
+ game.Graphics.SetupAlphaState(game.BlockInfo.Draw[block]);
game.Graphics.DepthTest = false;
SetPos();
@@ -68,7 +68,7 @@ namespace ClassicalSharp.Renderers {
game.Graphics.SetMatrixMode(MatrixType.Modelview);
game.Graphics.Texturing = false;
- game.Graphics.RestoreAlphaState(game.BlockInfo.Draw[type]);
+ game.Graphics.RestoreAlphaState(game.BlockInfo.Draw[block]);
game.Graphics.DepthTest = true;
}
@@ -84,7 +84,7 @@ namespace ClassicalSharp.Renderers {
void SetPos() {
// Based off details from http://pastebin.com/KFV0HkmD (Thanks goodlyay!)
BlockInfo info = game.BlockInfo;
- bool sprite = info.Draw[type] == DrawType.Sprite;
+ bool sprite = info.Draw[block] == DrawType.Sprite;
Vector3 offset = sprite ? sOffset : nOffset;
Player p = game.LocalPlayer;
held.ModelScale = new Vector3(0.4f);
@@ -92,7 +92,7 @@ namespace ClassicalSharp.Renderers {
held.Position = p.EyePosition + anim.pos;
held.Position += offset;
if (!sprite) {
- float height = info.MaxBB[type].Y - info.MinBB[type].Y;
+ float height = info.MaxBB[block].Y - info.MinBB[block].Y;
held.Position.Y += 0.2f * (1 - height);
}
@@ -103,7 +103,7 @@ namespace ClassicalSharp.Renderers {
held.HeadY = -45 + anim.angleY;
held.RotY = -45 + anim.angleY;
held.HeadX = 0;
- held.Block = type;
+ held.ModelBlock = block;
}
void ProjectionChanged(object sender, EventArgs e) {
@@ -126,7 +126,6 @@ namespace ClassicalSharp.Renderers {
public FakePlayer(Game game) : base(game) {
NoShade = true;
}
- public BlockID Block;
public override void SetLocation(LocationUpdate update, bool interpolate) { }
diff --git a/ClassicalSharp/Utils/Utils.cs b/ClassicalSharp/Utils/Utils.cs
index d85ad7207..2c29fc743 100644
--- a/ClassicalSharp/Utils/Utils.cs
+++ b/ClassicalSharp/Utils/Utils.cs
@@ -140,16 +140,6 @@ namespace ClassicalSharp {
adjCol *= tint;
return adjCol.Pack();
}
-
- public static byte FastByte(string s) {
- int sum = 0;
- switch (s.Length) {
- case 1: sum = (s[0] - '0'); break;
- case 2: sum = (s[0] - '0') * 10 + (s[1] - '0'); break;
- case 3: sum = (s[0] - '0') * 100 + (s[1] - '0') * 10 + (s[2] - '0'); break;
- }
- return (byte)sum;
- }
/// Determines the skin type of the specified bitmap.
public static SkinType GetSkinType(Bitmap bmp) {
diff --git a/src/Client/ChickenModel.c b/src/Client/ChickenModel.c
index 68f91c23c..ae17d096c 100644
--- a/src/Client/ChickenModel.c
+++ b/src/Client/ChickenModel.c
@@ -7,7 +7,7 @@ ModelPart Head, Head2, Head3, Torso, LeftLeg, RightLeg, LeftWing, RightWing;
ModelVertex ChickenModel_Vertices[IModel_BoxVertices * 6 + (IModel_QuadVertices * 2) * 2];
IModel ChickenModel;
-ModelPart MakeLeg(Int32 x1, Int32 x2, Int32 legX1, Int32 legX2) {
+ModelPart ChickenModel_MakeLeg(Int32 x1, Int32 x2, Int32 legX1, Int32 legX2) {
#define y1 (1.0f / 64.0f)
#define y2 (5.0f / 16.0f)
#define z2 (1.0f / 16.0f)
@@ -57,8 +57,8 @@ void ChickenModel_CreateParts(void) {
BoxDesc_RotOrigin(&desc, 3, 11, 0);
RightWing = BoxDesc_BuildBox(&ChickenModel, &desc);
- LeftLeg = MakeLeg(-3, 0, -2, -1);
- RightLeg = MakeLeg(0, 3, 1, 2);
+ LeftLeg = ChickenModel_MakeLeg(-3, 0, -2, -1);
+ RightLeg = ChickenModel_MakeLeg(0, 3, 1, 2);
}
Real32 ChickenModel_GetNameYOffset(void) { return 1.0125f; }
diff --git a/src/Client/ModelCache.c b/src/Client/ModelCache.c
index cb4aba2aa..ce84a6867 100644
--- a/src/Client/ModelCache.c
+++ b/src/Client/ModelCache.c
@@ -4,11 +4,10 @@
#include "MiscEvents.h"
#include "StringConvert.h"
-String ModelCache_blockString, ModelCache_charPngString;
+String ModelCache_charPngString;
Int32 ModelCache_texCount, ModelCache_modelCount;
void ModelCache_Init(void) {
- ModelCache_blockString = String_FromConstant("block");
ModelCache_charPngString = String_FromConstant("char.png");
ModelCache_RegisterDefaultModels();
ModelCache_ContextRecreated();
@@ -33,20 +32,10 @@ void ModelCache_Free(void) {
IModel* ModelCache_Get(STRING_TRANSIENT String* name) {
- if (String_Equals(name, &ModelCache_blockString)) {
- return ModelCache_Models[0].Instance;
- }
-
- String* modelName = name;
- UInt8 blockId;
- if (Convert_TryParseByte(name, &blockId)) {
- modelName = &ModelCache_blockString;
- }
-
Int32 i;
for (i = 0; i < ModelCache_modelCount; i++) {
CachedModel* m = &ModelCache_Models[i];
- if (!String_Equals(&m->Name, modelName)) continue;
+ if (!String_Equals(&m->Name, name)) continue;
if (!m->Instance->initalised) {
m->Instance->CreateParts();