Merge pull request #1 from Langtanium/feature/slim-skins

Added 64x64 skin support.
This commit is contained in:
ItzSonicFaner 2026-03-13 21:27:02 +02:00 committed by GitHub
commit 415557a063
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
30 changed files with 189 additions and 49 deletions

View file

@ -259,10 +259,47 @@ void UIControl_PlayerSkinPreview::render(EntityRenderer *renderer, double x, dou
HumanoidModel *model;
if (m_backupTexture == TN_MOB_CHAR8)
switch (m_backupTexture)
{
case TN_MOB_ALEX:
model = static_cast<HumanoidModel *>(renderer->getModelSlim());
else
model = static_cast<HumanoidModel *>(renderer->getModel());
break;
case TN_MOB_ALEX1:
model = static_cast<HumanoidModel *>(renderer->getModelSlim());
break;
case TN_MOB_ALEX2:
model = static_cast<HumanoidModel *>(renderer->getModelSlim());
break;
case TN_MOB_ALEX3:
model = static_cast<HumanoidModel *>(renderer->getModelSlim());
break;
case TN_MOB_ALEX4:
model = static_cast<HumanoidModel *>(renderer->getModelSlim());
break;
case TN_MOB_ALEX5:
model = static_cast<HumanoidModel *>(renderer->getModelSlim());
break;
case TN_MOB_ALEX6:
model = static_cast<HumanoidModel *>(renderer->getModelSlim());
break;
case TN_MOB_ALEX7:
model = static_cast<HumanoidModel *>(renderer->getModelSlim());
break;
case TN_MOB_DEVALEX:
model = static_cast<HumanoidModel *>(renderer->getModelSlim());
break;
case TN_MOB_DEVSTEVE:
model = static_cast<HumanoidModel *>(renderer->getModelCustom());
break;
default:
if (m_uiAnimOverrideBitmask&(1<<18))
model = static_cast<HumanoidModel *>(renderer->getModelCustom());
else if (m_uiAnimOverrideBitmask&(1<<19))
model = static_cast<HumanoidModel *>(renderer->getModelSlim());
else
model = static_cast<HumanoidModel *>(renderer->getModel());
break;
}
//getAttackAnim(mob, a);
//if (armor != nullptr) armor->attackTime = model->attackTime;

View file

@ -25,6 +25,15 @@ const WCHAR *UIScene_SkinSelectMenu::wchDefaultNamesA[]=
L"Cyclist Steve",
L"Boxer Steve",
L"Alex",
L"Tennis Alex",
L"Tuxedo Alex",
L"Athlete Alex",
L"Swedish Alex",
L"Prisoner Alex",
L"Cyclist Alex",
L"Boxer Alex",
L"Developer Alex",
L"Developer Steve",
};
UIScene_SkinSelectMenu::UIScene_SkinSelectMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer)
@ -995,7 +1004,34 @@ TEXTURE_NAME UIScene_SkinSelectMenu::getTextureId(int skinIndex)
texture = TN_MOB_CHAR7;
break;
case eDefaultSkins_Skin8:
texture = TN_MOB_CHAR8;
texture = TN_MOB_ALEX;
break;
case eDefaultSkins_Skin9:
texture = TN_MOB_ALEX1;
break;
case eDefaultSkins_Skin10:
texture = TN_MOB_ALEX2;
break;
case eDefaultSkins_Skin11:
texture = TN_MOB_ALEX3;
break;
case eDefaultSkins_Skin12:
texture = TN_MOB_ALEX4;
break;
case eDefaultSkins_Skin13:
texture = TN_MOB_ALEX5;
break;
case eDefaultSkins_Skin14:
texture = TN_MOB_ALEX6;
break;
case eDefaultSkins_Skin15:
texture = TN_MOB_ALEX7;
break;
case eDefaultSkins_Skin16:
texture = TN_MOB_DEVALEX;
break;
case eDefaultSkins_Skin17:
texture = TN_MOB_DEVSTEVE;
break;
};

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

View file

@ -117,7 +117,7 @@ EntityRenderDispatcher::EntityRenderDispatcher()
renderers[eTYPE_PIGZOMBIE] = new ZombieRenderer();
renderers[eTYPE_SLIME] = new SlimeRenderer(new SlimeModel(16), new SlimeModel(0), 0.25f);
renderers[eTYPE_LAVASLIME] = new LavaSlimeRenderer();
renderers[eTYPE_PLAYER] = new PlayerRenderer(true);
renderers[eTYPE_PLAYER] = new PlayerRenderer();
renderers[eTYPE_GIANT] = new GiantMobRenderer(new ZombieModel(), 0.5f, 6);
renderers[eTYPE_GHAST] = new GhastRenderer();
renderers[eTYPE_SQUID] = new SquidRenderer(new SquidModel(), 0.7f);
@ -180,7 +180,6 @@ EntityRenderDispatcher::EntityRenderDispatcher()
EntityRenderer *EntityRenderDispatcher::getRenderer(eINSTANCEOF e)
{
if( (e & eTYPE_PLAYER) == eTYPE_PLAYER) e = eTYPE_PLAYER;
else if( (e & eTYPE_PLAYER) == eTYPE_PLAYER) e = eTYPE_PLAYER;
//EntityRenderer * r = renderers[e];
auto it = renderers.find(e); // 4J Stu - The .at and [] accessors insert elements if they don't exist

View file

@ -19,6 +19,7 @@ ResourceLocation EntityRenderer::SHADOW_LOCATION = ResourceLocation(TN__CLAMP__M
EntityRenderer::EntityRenderer()
{
model = nullptr;
modelCustom = nullptr;
modelSlim = nullptr;
tileRenderer = new TileRenderer();
shadowRadius = 0;

View file

@ -30,6 +30,7 @@ private:
protected:
Model *model; // TODO 4J: Check why exactly this is here, it seems to get shadowed by classes inheriting from this by their own
Model *modelCustom;
Model *modelSlim;
protected:
@ -69,6 +70,7 @@ public:
public:
// 4J Added
virtual Model *getModel() { return model; }
virtual Model *getModelCustom() { return modelCustom; }
virtual Model *getModelSlim() { return modelSlim; }
virtual void SetItemFrame(bool bSet) {}
};

View file

@ -58,7 +58,7 @@ ModelPart * HumanoidModel::AddOrRetrievePart(SKIN_BOX *pBox)
return pNewBox;
}
void HumanoidModel::_init(float g, float yOffset, int texWidth, int texHeight, bool slimHands)
void HumanoidModel::_init(float g, float yOffset, int texWidth, int texHeight, int skinType)
{
this->texWidth = texWidth;
this->texHeight = texHeight;
@ -85,27 +85,39 @@ void HumanoidModel::_init(float g, float yOffset, int texWidth, int texHeight, b
arm0 = new ModelPart(this, 24 + 16, 16);
arm0->setPos(-5, 2 + yOffset, 0);
arm1 = new ModelPart(this, 24 + 16, 16);
arm1->bMirror = true;
arm1->setPos(5, 2 + yOffset, 0);
if (skinType == 2)
{
arm0->addHumanoidBox(-2, -2, -2, 3, 12, 4, g); // Arm0 Slim
if (slimHands == false)
{
arm0->addHumanoidBox(-3, -2, -2, 4, 12, 4, g);
arm1->addHumanoidBox(-1, -2, -2, 4, 12, 4, g);
}
else if (slimHands == true)
{
arm0->addHumanoidBox(-2, -2, -2, 3, 12, 4, 0);
arm1->addHumanoidBox(-1, -2, -2, 3, 12, 4, 0);
}
arm1 = new ModelPart(this, 16 + 16, 16 * 3);
arm1->addHumanoidBox(-1, -2, -2, 3, 12, 4, g); // Arm1 Slim
}
else
{
arm0->addHumanoidBox(-3, -2, -2, 4, 12, 4, g); // Arm0
if (skinType == 1)
arm1 = new ModelPart(this, 16 + 16, 16 * 3); // Arm1 Custom
else
{
arm1 = new ModelPart(this, 24 + 16, 16);
arm1->bMirror = true;
}
arm1->addHumanoidBox(-1, -2, -2, 4, 12, 4, g); // Arm1
}
arm1->setPos(5, 2 + yOffset, 0);
leg0 = new ModelPart(this, 0, 16);
leg0->addHumanoidBox(-2, 0, -2, 4, 12, 4, g); // Leg0
leg0->setPos(-1.9, 12 + yOffset, 0);
leg1 = new ModelPart(this, 0, 16);
leg1->bMirror = true;
if (skinType >= 1)
leg1 = new ModelPart(this, 16, 16 * 3);
else
{
leg1 = new ModelPart(this, 0, 16);
leg1->bMirror = true;
}
leg1->addHumanoidBox(-2, 0, -2, 4, 12, 4, g); // Leg1
leg1->setPos(1.9, 12 + yOffset, 0);
@ -137,22 +149,22 @@ void HumanoidModel::_init(float g, float yOffset, int texWidth, int texHeight, b
HumanoidModel::HumanoidModel() : Model()
{
_init(0, 0, 64, 32, false);
_init(0, 0, 64, 32, 0);
}
HumanoidModel::HumanoidModel(float g) : Model()
{
_init(g, 0, 64, 32, false);
_init(g, 0, 64, 32, 0);
}
HumanoidModel::HumanoidModel(float g, float yOffset, int texWidth, int texHeight) : Model()
{
_init(g,yOffset,texWidth,texHeight, false);
_init(g,yOffset,texWidth,texHeight,0);
}
HumanoidModel::HumanoidModel(float g, float yOffset, int texWidth, int texHeight, bool slimHands) : Model()
HumanoidModel::HumanoidModel(float g, float yOffset, int texWidth, int texHeight, int skinType) : Model()
{
_init(g,yOffset,texWidth,texHeight, slimHands);
_init(g,yOffset,texWidth,texHeight,skinType);
}
void HumanoidModel::render(shared_ptr<Entity> entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled)

View file

@ -50,11 +50,11 @@ public:
(1<<HumanoidModel::eAnim_DisableRenderHair);
void _init(float g, float yOffset, int texWidth, int texHeight, bool slimHands); // 4J added
void _init(float g, float yOffset, int texWidth, int texHeight, int skinType); // 4J added
HumanoidModel();
HumanoidModel(float g);
HumanoidModel(float g, float yOffset, int texWidth, int texHeight);
HumanoidModel(float g, float yOffset, int texWidth, int texHeight, bool slimHands);
HumanoidModel(float g, float yOffset, int texWidth, int texHeight, int skinType);
virtual void render(shared_ptr<Entity> entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled);
virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr<Entity> entity, unsigned int uiBitmaskOverrideAnim = 0);
void renderHair(float scale, bool usecompiled);

View file

@ -12,12 +12,11 @@
ResourceLocation LivingEntityRenderer::ENCHANT_GLINT_LOCATION = ResourceLocation(TN__BLUR__MISC_GLINT);
int LivingEntityRenderer::MAX_ARMOR_LAYERS = 4;
LivingEntityRenderer::LivingEntityRenderer(Model *model, float shadow, bool slimHands)
LivingEntityRenderer::LivingEntityRenderer(Model *model, float shadow)
{
this->model = model;
if (slimHands == true)
this->modelSlim = new HumanoidModel(0, 0, 64, 32, true);
this->modelCustom = new HumanoidModel(0, 0, 64, 64, 1);
this->modelSlim = new HumanoidModel(0, 0, 64, 64, 2);
shadowRadius = shadow;
armor = nullptr;
@ -57,7 +56,8 @@ void LivingEntityRenderer::render(shared_ptr<Entity> _mob, double x, double y, d
glPushMatrix();
glDisable(GL_CULL_FACE);
if (player != nullptr && modelSlim != nullptr && player->getPlayerDefaultSkin() == 9) resModel = modelSlim;
if ((player != nullptr && modelCustom != nullptr && player->getPlayerDefaultSkin() == 18) || player->getAnimOverrideBitmask()&(1<<18)) resModel = modelCustom;
else if ((player != nullptr && modelSlim != nullptr && player->getPlayerDefaultSkin() >= 9) || player->getAnimOverrideBitmask()&(1<<19)) resModel = modelSlim;
else resModel = model;
resModel->attackTime = getAttackAnim(mob, a);
@ -253,7 +253,8 @@ void LivingEntityRenderer::renderModel(shared_ptr<LivingEntity> mob, float wp, f
shared_ptr<Player> player = dynamic_pointer_cast<Player>(mob);
Model *resModel;
if (player != nullptr && modelSlim != nullptr && player->getPlayerDefaultSkin() == 9) resModel = modelSlim;
if ((player != nullptr && modelCustom != nullptr && player->getPlayerDefaultSkin() == 18) || player->getAnimOverrideBitmask()&(1<<18)) resModel = modelCustom;
else if ((player != nullptr && modelSlim != nullptr && player->getPlayerDefaultSkin() >= 9) || player->getAnimOverrideBitmask()&(1<<19)) resModel = modelSlim;
else resModel = model;
bindTexture(mob);
@ -341,10 +342,12 @@ void LivingEntityRenderer::renderArrows(shared_ptr<LivingEntity> mob, float a)
ModelPart *modelPart;
if (player != nullptr && modelSlim != nullptr && player->getPlayerDefaultSkin() == 9)
modelPart = model->getRandomModelPart(random);
else
if ((player != nullptr && modelCustom != nullptr && player->getPlayerDefaultSkin() == 18) || player->getAnimOverrideBitmask()&(1<<18))
modelPart = modelCustom->getRandomModelPart(random);
else if ((player != nullptr && modelSlim != nullptr && player->getPlayerDefaultSkin() >= 9) || player->getAnimOverrideBitmask()&(1<<19))
modelPart = modelSlim->getRandomModelPart(random);
else
modelPart = model->getRandomModelPart(random);
Cube *cube = modelPart->cubes[random.nextInt(modelPart->cubes.size())];
modelPart->translateTo(1 / 16.0f);

View file

@ -19,7 +19,7 @@ protected:
Model *armor;
public:
LivingEntityRenderer(Model *model, float shadow, bool slimHands);
LivingEntityRenderer(Model *model, float shadow);
virtual void render(shared_ptr<Entity> mob, double x, double y, double z, float rot, float a);
virtual void setArmor(Model *armor);

View file

@ -9,7 +9,7 @@
#include "..\Minecraft.World\Mth.h"
#include "entityRenderDispatcher.h"
MobRenderer::MobRenderer(Model *model, float shadow) : LivingEntityRenderer(model, shadow, false)
MobRenderer::MobRenderer(Model *model, float shadow) : LivingEntityRenderer(model, shadow)
{
}

View file

@ -55,9 +55,10 @@ static unsigned int nametagColorForIndex(int index)
ResourceLocation PlayerRenderer::DEFAULT_LOCATION = ResourceLocation(TN_MOB_CHAR);
PlayerRenderer::PlayerRenderer(bool slimHands) : LivingEntityRenderer( new HumanoidModel(0), 0.5f, slimHands )
PlayerRenderer::PlayerRenderer() : LivingEntityRenderer( new HumanoidModel(0), 0.5f )
{
humanoidModel = static_cast<HumanoidModel *>(model);
humanoidModelCustom = static_cast<HumanoidModel *>(modelCustom);
humanoidModelSlim = static_cast<HumanoidModel *>(modelSlim);
armorParts1 = new HumanoidModel(1.0f);
@ -166,7 +167,8 @@ void PlayerRenderer::render(shared_ptr<Entity> _mob, double x, double y, double
if(mob == nullptr) return;
if(mob->hasInvisiblePrivilege()) return;
if (mob != nullptr && modelSlim != nullptr && mob->getPlayerDefaultSkin() == 9) resModel = humanoidModelSlim;
if ((mob != nullptr && modelCustom != nullptr && mob->getPlayerDefaultSkin() == 18) || mob->getAnimOverrideBitmask()&(1<<18)) resModel = humanoidModelCustom;
else if ((mob != nullptr && modelSlim != nullptr && mob->getPlayerDefaultSkin() >= 9) || mob->getAnimOverrideBitmask()&(1<<19)) resModel = humanoidModelSlim;
else resModel = humanoidModel;
shared_ptr<ItemInstance> item = mob->inventory->getSelected();
@ -272,7 +274,8 @@ void PlayerRenderer::additionalRendering(shared_ptr<LivingEntity> _mob, float a)
shared_ptr<Player> mob = dynamic_pointer_cast<Player>(_mob);
HumanoidModel *resModel;
if (mob != nullptr && modelSlim != nullptr && mob->getPlayerDefaultSkin() == 9) resModel = humanoidModelSlim;
if ((mob != nullptr && modelCustom != nullptr && mob->getPlayerDefaultSkin() == 18) || mob->getAnimOverrideBitmask()&(1<<18)) resModel = humanoidModelCustom;
else if ((mob != nullptr && modelSlim != nullptr && mob->getPlayerDefaultSkin() >= 9) || mob->getAnimOverrideBitmask()&(1<<19)) resModel = humanoidModelSlim;
else resModel = humanoidModel;
shared_ptr<ItemInstance> headGear = mob->inventory->getArmor(3);
@ -520,7 +523,8 @@ void PlayerRenderer::renderHand()
shared_ptr<Player> player = dynamic_pointer_cast<Player>(Minecraft::GetInstance()->player);
HumanoidModel *resModel;
if (player != nullptr && modelSlim != nullptr && player->getPlayerDefaultSkin() == 9) resModel = humanoidModelSlim;
if ((player != nullptr && modelCustom != nullptr && player->getPlayerDefaultSkin() == 18) || player->getAnimOverrideBitmask()&(1<<18)) resModel = humanoidModelCustom;
else if ((player != nullptr && modelSlim != nullptr && player->getPlayerDefaultSkin() >= 9) || player->getAnimOverrideBitmask()&(1<<19)) resModel = humanoidModelSlim;
else resModel = humanoidModel;
float brightness = 1;

View file

@ -14,13 +14,14 @@ public:
private:
HumanoidModel *humanoidModel;
HumanoidModel *humanoidModelCustom;
HumanoidModel *humanoidModelSlim;
HumanoidModel *armorParts1;
HumanoidModel *armorParts2;
bool defaultSlimHands;
int defaultSkinType;
public:
PlayerRenderer(bool slimHands);
PlayerRenderer();
static unsigned int getNametagColour(int index);

View file

@ -72,7 +72,16 @@ const wchar_t *Textures::preLoaded[TN_COUNT] =
L"mob/char5",
L"mob/char6",
L"mob/char7",
L"mob/char8",
L"mob/alex",
L"mob/alex1",
L"mob/alex2",
L"mob/alex3",
L"mob/alex4",
L"mob/alex5",
L"mob/alex6",
L"mob/alex7",
L"mob/DevAlex",
L"mob/DevSteve",
L"terrain/moon",
L"terrain/sun",
L"armor/power",

View file

@ -63,7 +63,16 @@ typedef enum _TEXTURE_NAME
TN_MOB_CHAR5,
TN_MOB_CHAR6,
TN_MOB_CHAR7,
TN_MOB_CHAR8,
TN_MOB_ALEX,
TN_MOB_ALEX1,
TN_MOB_ALEX2,
TN_MOB_ALEX3,
TN_MOB_ALEX4,
TN_MOB_ALEX5,
TN_MOB_ALEX6,
TN_MOB_ALEX7,
TN_MOB_DEVALEX,
TN_MOB_DEVSTEVE,
TN_TERRAIN_MOON,
TN_TERRAIN_SUN,
TN_POWERED_CREEPER,

View file

@ -36,6 +36,15 @@ enum EDefaultSkins
eDefaultSkins_Skin6,
eDefaultSkins_Skin7,
eDefaultSkins_Skin8,
eDefaultSkins_Skin9,
eDefaultSkins_Skin10,
eDefaultSkins_Skin11,
eDefaultSkins_Skin12,
eDefaultSkins_Skin13,
eDefaultSkins_Skin14,
eDefaultSkins_Skin15,
eDefaultSkins_Skin16,
eDefaultSkins_Skin17,
eDefaultSkins_Count,
};

View file

@ -2703,7 +2703,25 @@ int Player::getTexture()
case eDefaultSkins_Skin7:
return TN_MOB_CHAR7; // 4J - was L"/mob/char7.png";
case eDefaultSkins_Skin8:
return TN_MOB_CHAR8; // 4J - was L"/mob/char8.png";
return TN_MOB_ALEX; // 4J - was L"/mob/alex.png";
case eDefaultSkins_Skin9:
return TN_MOB_ALEX1; // 4J - was L"/mob/alex1.png";
case eDefaultSkins_Skin10:
return TN_MOB_ALEX2; // 4J - was L"/mob/alex2.png";
case eDefaultSkins_Skin11:
return TN_MOB_ALEX3; // 4J - was L"/mob/alex3.png";
case eDefaultSkins_Skin12:
return TN_MOB_ALEX4; // 4J - was L"/mob/alex4.png";
case eDefaultSkins_Skin13:
return TN_MOB_ALEX5; // 4J - was L"/mob/alex5.png";
case eDefaultSkins_Skin14:
return TN_MOB_ALEX6; // 4J - was L"/mob/alex6.png";
case eDefaultSkins_Skin15:
return TN_MOB_ALEX7; // 4J - was L"/mob/alex7.png";
case eDefaultSkins_Skin16:
return TN_MOB_DEVALEX; // 4J - was L"/mob/DevAlex.png";
case eDefaultSkins_Skin17:
return TN_MOB_DEVSTEVE; // 4J - was L"/mob/DevSteve.png";
default:
return TN_MOB_CHAR; // 4J - was L"/mob/char.png";