Fixed a few issues and added more functionality

Fixed player not rendering in third person and armor arm0 not moving with 64x64 skins. Added offsets to held item (main hand) and armor (boots).
This commit is contained in:
Langtanium 2026-04-18 11:41:06 -07:00
parent 0c50f9982c
commit cef65c8df3
8 changed files with 306 additions and 39 deletions

View file

@ -113,7 +113,7 @@ void DLCSkinFile::addParameter(DLCManager::EDLCParameterType type, const wstring
WCHAR wchBodyPart[10]; WCHAR wchBodyPart[10];
SKIN_BOX *pSkinBox = new SKIN_BOX; SKIN_BOX *pSkinBox = new SKIN_BOX;
ZeroMemory(pSkinBox,sizeof(SKIN_BOX)); ZeroMemory(pSkinBox,sizeof(SKIN_BOX));
#ifdef __PS3__ #ifdef __PS3__
// 4J Stu - The Xbox version used swscanf_s which isn't available in GCC. // 4J Stu - The Xbox version used swscanf_s which isn't available in GCC.
swscanf(value.c_str(), L"%10ls%f%f%f%f%f%f%f%f%f%f%f", wchBodyPart, swscanf(value.c_str(), L"%10ls%f%f%f%f%f%f%f%f%f%f%f", wchBodyPart,

View file

@ -56,6 +56,7 @@ UIControl_PlayerSkinPreview::UIControl_PlayerSkinPreview()
m_framesAnimatingRotation = 0; m_framesAnimatingRotation = 0;
m_bAnimatingToFacing = false; m_bAnimatingToFacing = false;
m_pvAdditionalModelParts=nullptr; m_pvAdditionalModelParts=nullptr;
m_pvModelOffsets=nullptr;
m_uiAnimOverrideBitmask=0L; m_uiAnimOverrideBitmask=0L;
} }
@ -366,7 +367,10 @@ void UIControl_PlayerSkinPreview::render(EntityRenderer *renderer, double x, dou
glEnable(GL_ALPHA_TEST); glEnable(GL_ALPHA_TEST);
//model->prepareMobModel(mob, wp, ws, a); //model->prepareMobModel(mob, wp, ws, a);
model->render(nullptr, wp, ws, bob, headRot - bodyRot, headRotx, _scale, true, m_pvModelOffsets); if (m_pvModelOffsets != nullptr) // If the skin has offsets use a modified version of the render function
model->renderUIOffset(wp, ws, bob, headRot - bodyRot, headRotx, _scale, true, m_pvModelOffsets);
else // If the skin has no offsets use the default render function (without this all skins that don't have an offset won't render)
model->render(nullptr, wp, ws, bob, headRot - bodyRot, headRotx, _scale, true);
/*for (int i = 0; i < MAX_ARMOR_LAYERS; i++) /*for (int i = 0; i < MAX_ARMOR_LAYERS; i++)
{ {
if (prepareArmor(mob, i, a)) if (prepareArmor(mob, i, a))

View file

@ -88,8 +88,8 @@ ModelPart * HumanoidModel::AddOrRetrievePart(SKIN_BOX *pBox)
pAttachTo=boot1; pAttachTo=boot1;
break; break;
} }
// check if this box has a declared scale // check if this box has a declared scale then add it
if (pBox->fS > 0) scale = pBox->fS; if (pBox->fS != 0) scale = pBox->fS;
// first check this box doesn't already exist // first check this box doesn't already exist
ModelPart *pNewBox = pAttachTo->retrieveChild(pBox); ModelPart *pNewBox = pAttachTo->retrieveChild(pBox);
@ -109,7 +109,7 @@ ModelPart * HumanoidModel::AddOrRetrievePart(SKIN_BOX *pBox)
pNewBox = new ModelPart(this, static_cast<int>(pBox->fU), static_cast<int>(pBox->fV)); pNewBox = new ModelPart(this, static_cast<int>(pBox->fU), static_cast<int>(pBox->fV));
pNewBox->visible=false; pNewBox->visible=false;
if (pBox->fM > 0) pNewBox->bMirror = true; // check if this box has the mirror flag if (pBox->fM > 0) pNewBox->bMirror = true; // check if this box has the mirror flag
if (pBox->fA > 0) pNewBox->hideWithHelmet = true; // check if this box has the "hide when helmet" is worn flag if (pBox->fA > 0) pNewBox->hideWithHelmet = true; // check if this box has the "hide when helmet is worn" flag
pNewBox->addHumanoidBox(pBox->fX, pBox->fY, pBox->fZ, pBox->fW, pBox->fH, pBox->fD, scale); pNewBox->addHumanoidBox(pBox->fX, pBox->fY, pBox->fZ, pBox->fW, pBox->fH, pBox->fD, scale);
// 4J-PB - don't compile here, since the lighting isn't set up. It'll be compiled on first use. // 4J-PB - don't compile here, since the lighting isn't set up. It'll be compiled on first use.
//pNewBox->compile(1.0f/16.0f); //pNewBox->compile(1.0f/16.0f);
@ -329,7 +329,6 @@ void HumanoidModel::_init(float g, float yOffset, int texWidth, int texHeight, b
m_isArmor = isArmor; m_isArmor = isArmor;
} }
HumanoidModel::HumanoidModel() : Model() HumanoidModel::HumanoidModel() : Model()
{ {
_init(0, 0, 64, 32, false, false); _init(0, 0, 64, 32, false, false);
@ -355,8 +354,8 @@ HumanoidModel::HumanoidModel(float g, float yOffset, int texWidth, int texHeight
_init(g,yOffset,texWidth,texHeight, slim, false); _init(g,yOffset,texWidth,texHeight, slim, false);
} }
void HumanoidModel::render(shared_ptr<Entity> entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled, vector<SKIN_OFFSET *> *modelOffsets) void HumanoidModel::render(shared_ptr<Entity> entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled)
{ {
if(entity != nullptr) if(entity != nullptr)
{ {
m_uiAnimOverrideBitmask=entity->getAnimOverrideBitmask(); m_uiAnimOverrideBitmask=entity->getAnimOverrideBitmask();
@ -395,8 +394,6 @@ void HumanoidModel::render(shared_ptr<Entity> entity, float time, float r, float
vector<SKIN_OFFSET *>* pModelOffsets = nullptr; vector<SKIN_OFFSET *>* pModelOffsets = nullptr;
if (player != nullptr) if (player != nullptr)
pModelOffsets = player->GetModelOffsets(); pModelOffsets = player->GetModelOffsets();
else if (modelOffsets != nullptr)
pModelOffsets = modelOffsets;
if (pModelOffsets != nullptr) if (pModelOffsets != nullptr)
{ {
for( SKIN_OFFSET *pModelOffset : *pModelOffsets ) for( SKIN_OFFSET *pModelOffset : *pModelOffsets )
@ -405,91 +402,309 @@ void HumanoidModel::render(shared_ptr<Entity> entity, float time, float r, float
{ {
case eBodyOffset_Head: case eBodyOffset_Head:
if(pModelOffset->fD == 1) if(pModelOffset->fD == 1)
headOffsets[0] = pModelOffset->fO; headOffsets[0] = pModelOffset->fO / 16.0f;
else if(pModelOffset->fD == 2) else if(pModelOffset->fD == 2)
headOffsets[1] = pModelOffset->fO; headOffsets[1] = pModelOffset->fO / 16.0f;
else if(pModelOffset->fD == 3) else if(pModelOffset->fD == 3)
headOffsets[2] = pModelOffset->fO; headOffsets[2] = pModelOffset->fO / 16.0f;
break; break;
case eBodyOffset_Body: case eBodyOffset_Body:
if(pModelOffset->fD == 1) if(pModelOffset->fD == 1)
bodyOffsets[0] = pModelOffset->fO; bodyOffsets[0] = pModelOffset->fO / 16.0f;
else if(pModelOffset->fD == 2) else if(pModelOffset->fD == 2)
bodyOffsets[1] = pModelOffset->fO; bodyOffsets[1] = pModelOffset->fO / 16.0f;
else if(pModelOffset->fD == 3) else if(pModelOffset->fD == 3)
bodyOffsets[2] = pModelOffset->fO; bodyOffsets[2] = pModelOffset->fO / 16.0f;
break; break;
case eBodyOffset_Arm0: case eBodyOffset_Arm0:
if(pModelOffset->fD == 1) if(pModelOffset->fD == 1)
arm0Offsets[0] = pModelOffset->fO; arm0Offsets[0] = pModelOffset->fO / 16.0f;
else if(pModelOffset->fD == 2) else if(pModelOffset->fD == 2)
arm0Offsets[1] = pModelOffset->fO; arm0Offsets[1] = pModelOffset->fO / 16.0f;
else if(pModelOffset->fD == 3) else if(pModelOffset->fD == 3)
arm0Offsets[2] = pModelOffset->fO; arm0Offsets[2] = pModelOffset->fO / 16.0f;
break; break;
case eBodyOffset_Arm1: case eBodyOffset_Arm1:
if(pModelOffset->fD == 1) if(pModelOffset->fD == 1)
arm1Offsets[0] = pModelOffset->fO; arm1Offsets[0] = pModelOffset->fO / 16.0f;
else if(pModelOffset->fD == 2) else if(pModelOffset->fD == 2)
arm1Offsets[1] = pModelOffset->fO; arm1Offsets[1] = pModelOffset->fO / 16.0f;
else if(pModelOffset->fD == 3) else if(pModelOffset->fD == 3)
arm1Offsets[2] = pModelOffset->fO; arm1Offsets[2] = pModelOffset->fO / 16.0f;
break; break;
case eBodyOffset_Leg0: case eBodyOffset_Leg0:
if(pModelOffset->fD == 1) if(pModelOffset->fD == 1)
leg0Offsets[0] = pModelOffset->fO; leg0Offsets[0] = pModelOffset->fO / 16.0f;
else if(pModelOffset->fD == 2) else if(pModelOffset->fD == 2)
leg0Offsets[1] = pModelOffset->fO; leg0Offsets[1] = pModelOffset->fO / 16.0f;
else if(pModelOffset->fD == 3) else if(pModelOffset->fD == 3)
leg0Offsets[2] = pModelOffset->fO; leg0Offsets[2] = pModelOffset->fO / 16.0f;
break; break;
case eBodyOffset_Leg1: case eBodyOffset_Leg1:
if(pModelOffset->fD == 1) if(pModelOffset->fD == 1)
leg1Offsets[0] = pModelOffset->fO; leg1Offsets[0] = pModelOffset->fO / 16.0f;
else if(pModelOffset->fD == 2) else if(pModelOffset->fD == 2)
leg1Offsets[1] = pModelOffset->fO; leg1Offsets[1] = pModelOffset->fO / 16.0f;
else if(pModelOffset->fD == 3) else if(pModelOffset->fD == 3)
leg1Offsets[2] = pModelOffset->fO; leg1Offsets[2] = pModelOffset->fO / 16.0f;
break; break;
} }
} }
if (m_isArmor) // Set offsets for armor
{
for( SKIN_OFFSET *pModelOffset : *pModelOffsets )
{
switch (pModelOffset->ePart)
{
case eBodyOffset_Boot0:
if (leg0->isArmorPart1)
{
if(pModelOffset->fD == 1)
leg0Offsets[0] += pModelOffset->fO / 16.0f;
else if(pModelOffset->fD == 2)
leg0Offsets[1] += pModelOffset->fO / 16.0f;
else if(pModelOffset->fD == 3)
leg0Offsets[2] += pModelOffset->fO / 16.0f;
}
break;
case eBodyOffset_Boot1:
if (leg1->isArmorPart1)
{
if(pModelOffset->fD == 1)
leg1Offsets[0] += pModelOffset->fO / 16.0f;
else if(pModelOffset->fD == 2)
leg1Offsets[1] += pModelOffset->fO / 16.0f;
else if(pModelOffset->fD == 3)
leg1Offsets[2] += pModelOffset->fO / 16.0f;
}
break;
}
}
}
} }
glPushMatrix(); glPushMatrix();
glTranslatef(headOffsets[0]/16.0f, headOffsets[1]/16.0f, headOffsets[2]/16.0f); glTranslatef(headOffsets[0], headOffsets[1], headOffsets[2]);
head->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderHead))>0&&(!(m_uiAnimOverrideBitmask&(1<<eAnim_RenderArmorHead))>0||!m_isArmor)); head->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderHead))>0&&(!(m_uiAnimOverrideBitmask&(1<<eAnim_RenderArmorHead))>0||!m_isArmor));
glPopMatrix(); glPopMatrix();
glPushMatrix(); glPushMatrix();
glTranslatef(bodyOffsets[0]/16.0f, bodyOffsets[1]/16.0f, bodyOffsets[2]/16.0f); glTranslatef(bodyOffsets[0], bodyOffsets[1], bodyOffsets[2]);
body->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderTorso))>0&&(!(m_uiAnimOverrideBitmask&(1<<eAnim_RenderArmorTorso))>0||!m_isArmor)); body->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderTorso))>0&&(!(m_uiAnimOverrideBitmask&(1<<eAnim_RenderArmorTorso))>0||!m_isArmor));
glPopMatrix(); glPopMatrix();
glPushMatrix(); glPushMatrix();
glTranslatef(arm0Offsets[0]/16.0f, arm0Offsets[1]/16.0f, arm0Offsets[2]/16.0f); glTranslatef(arm0Offsets[0], arm0Offsets[1], arm0Offsets[2]);
arm0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderArm0))>0&&(!(m_uiAnimOverrideBitmask&(1<<eAnim_RenderArmorArm0))>0||!m_isArmor)); arm0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderArm0))>0&&(!(m_uiAnimOverrideBitmask&(1<<eAnim_RenderArmorArm0))>0||!m_isArmor));
glPopMatrix(); glPopMatrix();
glPushMatrix(); glPushMatrix();
glTranslatef(arm1Offsets[0]/16.0f, arm1Offsets[1]/16.0f, arm1Offsets[2]/16.0f); glTranslatef(arm1Offsets[0], arm1Offsets[1], arm1Offsets[2]);
arm1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderArm1))>0&&(!(m_uiAnimOverrideBitmask&(1<<eAnim_RenderArmorArm1))>0||!m_isArmor)); arm1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderArm1))>0&&(!(m_uiAnimOverrideBitmask&(1<<eAnim_RenderArmorArm1))>0||!m_isArmor));
glPopMatrix(); glPopMatrix();
glPushMatrix(); glPushMatrix();
glTranslatef(leg0Offsets[0]/16.0f, leg0Offsets[1]/16.0f, leg0Offsets[2]/16.0f); glTranslatef(leg0Offsets[0], leg0Offsets[1], leg0Offsets[2]);
leg0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderLeg0))>0&&(!(m_uiAnimOverrideBitmask&(1<<eAnim_RenderArmorLeg0))>0||!m_isArmor)); leg0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderLeg0))>0&&(!(m_uiAnimOverrideBitmask&(1<<eAnim_RenderArmorLeg0))>0||!m_isArmor));
glPopMatrix(); glPopMatrix();
glPushMatrix(); glPushMatrix();
glTranslatef(leg1Offsets[0]/16.0f, leg1Offsets[1]/16.0f, leg1Offsets[2]/16.0f); glTranslatef(leg1Offsets[0], leg1Offsets[1], leg1Offsets[2]);
leg1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderLeg1))>0&&(!(m_uiAnimOverrideBitmask&(1<<eAnim_RenderArmorLeg1))>0||!m_isArmor)); leg1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderLeg1))>0&&(!(m_uiAnimOverrideBitmask&(1<<eAnim_RenderArmorLeg1))>0||!m_isArmor));
glPopMatrix(); glPopMatrix();
glPushMatrix();
glTranslatef(headOffsets[0], headOffsets[1], headOffsets[2]);
hair->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderHair))>0); hair->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderHair))>0);
glPopMatrix();
if (jacket != 0) if (jacket != 0)
{
glPushMatrix();
glTranslatef(bodyOffsets[0], bodyOffsets[1], bodyOffsets[2]);
jacket->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderJacket))>0); jacket->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderJacket))>0);
glPopMatrix();
}
if (sleeve0 != 0) if (sleeve0 != 0)
{
glPushMatrix();
glTranslatef(arm0Offsets[0], arm0Offsets[1], arm0Offsets[2]);
sleeve0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderSleeve0))>0); sleeve0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderSleeve0))>0);
glPopMatrix();
}
if (sleeve1 != 0) if (sleeve1 != 0)
{
glPushMatrix();
glTranslatef(arm1Offsets[0], arm1Offsets[1], arm1Offsets[2]);
sleeve1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderSleeve1))>0); sleeve1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderSleeve1))>0);
glPopMatrix();
}
if (pants0 != 0) if (pants0 != 0)
{
glPushMatrix();
glTranslatef(leg0Offsets[0], leg0Offsets[1], leg0Offsets[2]);
pants0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderPants0))>0); pants0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderPants0))>0);
glPopMatrix();
}
if (pants1 != 0) if (pants1 != 0)
{
glPushMatrix();
glTranslatef(leg0Offsets[0], leg0Offsets[1], leg0Offsets[2]);
pants1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderPants1))>0); pants1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderPants1))>0);
glPopMatrix();
}
if (waist != 0)
waist->render(scale, usecompiled);
if (belt != 0)
belt->render(scale, usecompiled);
if (bodyArmor != 0)
bodyArmor->render(scale, usecompiled);
if (armArmor0 != 0)
armArmor0->render(scale, usecompiled);
if (armArmor1 != 0)
armArmor1->render(scale, usecompiled);
if (legging0 != 0)
legging0->render(scale, usecompiled);
if (legging1 != 0)
legging1->render(scale, usecompiled);
if (sock0 != 0)
sock0->render(scale, usecompiled);
if (sock1 != 0)
sock1->render(scale, usecompiled);
if (boot0 != 0)
boot0->render(scale, usecompiled);
if (boot1 != 0)
boot1->render(scale, usecompiled);
}
}
// This code is the same as above but allows for skin offsets to work in the skin select menu - Langtanium
void HumanoidModel::renderUIOffset(float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled, vector<SKIN_OFFSET *> *modelOffsets)
{
setupAnim(time, r, bob, yRot, xRot, scale, nullptr, m_uiAnimOverrideBitmask);
vector<float> headOffsets = {0, 0, 0};
vector<float> bodyOffsets = {0, 0, 0};
vector<float> arm0Offsets = {0, 0, 0};
vector<float> arm1Offsets = {0, 0, 0};
vector<float> leg0Offsets = {0, 0, 0};
vector<float> leg1Offsets = {0, 0, 0};
vector<SKIN_OFFSET *>* pModelOffsets = nullptr;
if (modelOffsets != nullptr)
pModelOffsets = modelOffsets;
if (pModelOffsets != nullptr)
{
for( SKIN_OFFSET *pModelOffset : *pModelOffsets )
{
switch (pModelOffset->ePart)
{
case eBodyOffset_Head:
if(pModelOffset->fD == 1)
headOffsets[0] = pModelOffset->fO / 16.0f;
else if(pModelOffset->fD == 2)
headOffsets[1] = pModelOffset->fO / 16.0f;
else if(pModelOffset->fD == 3)
headOffsets[2] = pModelOffset->fO / 16.0f;
break;
case eBodyOffset_Body:
if(pModelOffset->fD == 1)
bodyOffsets[0] = pModelOffset->fO / 16.0f;
else if(pModelOffset->fD == 2)
bodyOffsets[1] = pModelOffset->fO / 16.0f;
else if(pModelOffset->fD == 3)
bodyOffsets[2] = pModelOffset->fO / 16.0f;
break;
case eBodyOffset_Arm0:
if(pModelOffset->fD == 1)
arm0Offsets[0] = pModelOffset->fO / 16.0f;
else if(pModelOffset->fD == 2)
arm0Offsets[1] = pModelOffset->fO / 16.0f;
else if(pModelOffset->fD == 3)
arm0Offsets[2] = pModelOffset->fO / 16.0f;
break;
case eBodyOffset_Arm1:
if(pModelOffset->fD == 1)
arm1Offsets[0] = pModelOffset->fO / 16.0f;
else if(pModelOffset->fD == 2)
arm1Offsets[1] = pModelOffset->fO / 16.0f;
else if(pModelOffset->fD == 3)
arm1Offsets[2] = pModelOffset->fO / 16.0f;
break;
case eBodyOffset_Leg0:
if(pModelOffset->fD == 1)
leg0Offsets[0] = pModelOffset->fO / 16.0f;
else if(pModelOffset->fD == 2)
leg0Offsets[1] = pModelOffset->fO / 16.0f;
else if(pModelOffset->fD == 3)
leg0Offsets[2] = pModelOffset->fO / 16.0f;
break;
case eBodyOffset_Leg1:
if(pModelOffset->fD == 1)
leg1Offsets[0] = pModelOffset->fO / 16.0f;
else if(pModelOffset->fD == 2)
leg1Offsets[1] = pModelOffset->fO / 16.0f;
else if(pModelOffset->fD == 3)
leg1Offsets[2] = pModelOffset->fO / 16.0f;
break;
}
}
glPushMatrix();
glTranslatef(headOffsets[0], headOffsets[1], headOffsets[2]);
head->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderHead))>0&&(!(m_uiAnimOverrideBitmask&(1<<eAnim_RenderArmorHead))>0||!m_isArmor));
glPopMatrix();
glPushMatrix();
glTranslatef(bodyOffsets[0], bodyOffsets[1], bodyOffsets[2]);
body->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderTorso))>0&&(!(m_uiAnimOverrideBitmask&(1<<eAnim_RenderArmorTorso))>0||!m_isArmor));
glPopMatrix();
glPushMatrix();
glTranslatef(arm0Offsets[0], arm0Offsets[1], arm0Offsets[2]);
arm0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderArm0))>0&&(!(m_uiAnimOverrideBitmask&(1<<eAnim_RenderArmorArm0))>0||!m_isArmor));
glPopMatrix();
glPushMatrix();
glTranslatef(arm1Offsets[0], arm1Offsets[1], arm1Offsets[2]);
arm1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderArm1))>0&&(!(m_uiAnimOverrideBitmask&(1<<eAnim_RenderArmorArm1))>0||!m_isArmor));
glPopMatrix();
glPushMatrix();
glTranslatef(leg0Offsets[0], leg0Offsets[1], leg0Offsets[2]);
leg0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderLeg0))>0&&(!(m_uiAnimOverrideBitmask&(1<<eAnim_RenderArmorLeg0))>0||!m_isArmor));
glPopMatrix();
glPushMatrix();
glTranslatef(leg1Offsets[0], leg1Offsets[1], leg1Offsets[2]);
leg1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderLeg1))>0&&(!(m_uiAnimOverrideBitmask&(1<<eAnim_RenderArmorLeg1))>0||!m_isArmor));
glPopMatrix();
glPushMatrix();
glTranslatef(headOffsets[0], headOffsets[1], headOffsets[2]);
hair->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderHair))>0);
glPopMatrix();
if (jacket != 0)
{
glPushMatrix();
glTranslatef(bodyOffsets[0], bodyOffsets[1], bodyOffsets[2]);
jacket->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderJacket))>0);
glPopMatrix();
}
if (sleeve0 != 0)
{
glPushMatrix();
glTranslatef(arm0Offsets[0], arm0Offsets[1], arm0Offsets[2]);
sleeve0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderSleeve0))>0);
glPopMatrix();
}
if (sleeve1 != 0)
{
glPushMatrix();
glTranslatef(arm1Offsets[0], arm1Offsets[1], arm1Offsets[2]);
sleeve1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderSleeve1))>0);
glPopMatrix();
}
if (pants0 != 0)
{
glPushMatrix();
glTranslatef(leg0Offsets[0], leg0Offsets[1], leg0Offsets[2]);
pants0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderPants0))>0);
glPopMatrix();
}
if (pants1 != 0)
{
glPushMatrix();
glTranslatef(leg0Offsets[0], leg0Offsets[1], leg0Offsets[2]);
pants1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderPants1))>0);
glPopMatrix();
}
if (waist != 0) if (waist != 0)
waist->render(scale, usecompiled); waist->render(scale, usecompiled);
if (belt != 0) if (belt != 0)

View file

@ -83,7 +83,8 @@ public:
HumanoidModel(float g, bool isArmor); HumanoidModel(float g, bool isArmor);
HumanoidModel(float g, float yOffset, int texWidth, int texHeight); HumanoidModel(float g, float yOffset, int texWidth, int texHeight);
HumanoidModel(float g, float yOffset, int texWidth, int texHeight, bool slim); HumanoidModel(float g, float yOffset, int texWidth, int texHeight, bool slim);
virtual void render(shared_ptr<Entity> entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled, vector<SKIN_OFFSET *> *modelOffsets = nullptr); virtual void render(shared_ptr<Entity> entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled);
virtual void renderUIOffset(float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled, vector<SKIN_OFFSET *> *modelOffsets);
virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr<Entity> entity, unsigned int uiBitmaskOverrideAnim = 0); 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); void renderHair(float scale, bool usecompiled);
void renderEars(float scale, bool usecompiled); void renderEars(float scale, bool usecompiled);

View file

@ -286,6 +286,7 @@ void ItemInHandRenderer::renderItem(shared_ptr<LivingEntity> mob, shared_ptr<Ite
float xo = 0.0f; float xo = 0.0f;
float yo = 0.3f; float yo = 0.3f;
float zo = 0.0f;
// Re position height of held item if skin is small // Re position height of held item if skin is small
@ -301,8 +302,39 @@ void ItemInHandRenderer::renderItem(shared_ptr<LivingEntity> mob, shared_ptr<Ite
} }
} }
// Change height of held item by tool0 and arm0 offset
shared_ptr<Player> player = dynamic_pointer_cast<Player>(mob);
vector<SKIN_OFFSET *>* pModelOffsets = nullptr;
if (player != nullptr)
pModelOffsets = player->GetModelOffsets();
if (pModelOffsets != nullptr)
{
for( SKIN_OFFSET *pModelOffset : *pModelOffsets )
{
switch (pModelOffset->ePart)
{
case eBodyOffset_Arm0:
if(pModelOffset->fD == 1)
xo += pModelOffset->fO / 16.0f;
else if(pModelOffset->fD == 2)
zo += pModelOffset->fO / 16.0f;
else if(pModelOffset->fD == 3)
yo += pModelOffset->fO / 16.0f;
break;
case eBodyOffset_Tool0:
if(pModelOffset->fD == 1)
xo += pModelOffset->fO / 16.0f;
else if(pModelOffset->fD == 2)
zo += pModelOffset->fO / 16.0f;
else if(pModelOffset->fD == 3)
yo += pModelOffset->fO / 16.0f;
break;
}
}
}
glEnable(GL_RESCALE_NORMAL); glEnable(GL_RESCALE_NORMAL);
glTranslatef(-xo, -yo, 0); glTranslatef(-xo, -yo, -zo);
float s = 1.5f; float s = 1.5f;
glScalef(s, s, s); glScalef(s, s, s);

View file

@ -14,6 +14,7 @@ void ModelPart::_init()
bMirror = false; bMirror = false;
visible = true; visible = true;
hideWithHelmet = false; hideWithHelmet = false;
isArmorPart1 = false;
neverRender = false; neverRender = false;
x=y=z = 0.0f; x=y=z = 0.0f;
xRot=yRot=zRot = 0.0f; xRot=yRot=zRot = 0.0f;

View file

@ -17,6 +17,7 @@ public:
bool bMirror; bool bMirror;
bool visible; bool visible;
bool hideWithHelmet; bool hideWithHelmet;
bool isArmorPart1;
bool neverRender; bool neverRender;
vector <Cube *> cubes; vector <Cube *> cubes;
vector <ModelPart *> children; vector <ModelPart *> children;

View file

@ -76,6 +76,11 @@ int PlayerRenderer::prepareArmor(shared_ptr<LivingEntity> _player, int layer, fl
{ {
// 4J - dynamic cast required because we aren't using templates/generics in our version // 4J - dynamic cast required because we aren't using templates/generics in our version
shared_ptr<Player> player = dynamic_pointer_cast<Player>(_player); shared_ptr<Player> player = dynamic_pointer_cast<Player>(_player);
HumanoidModel *resModel;
if (humanoidModelClassic != nullptr && (player->getCustomSkin() == 18 || player->getAnimOverrideBitmask()&(1<<HumanoidModel::eAnim_ClassicModel))) resModel = humanoidModelClassic;
else if (humanoidModelSlim != nullptr && ((player->getCustomSkin() >= 8 && player->getCustomSkin() <= 17) || player->getAnimOverrideBitmask()&(1<<HumanoidModel::eAnim_SlimModel))) resModel = humanoidModelSlim;
else resModel = humanoidModel;
// 4J-PB - need to disable rendering armour for some special skins (Daleks) // 4J-PB - need to disable rendering armour for some special skins (Daleks)
unsigned int uiAnimOverrideBitmask=player->getAnimOverrideBitmask(); unsigned int uiAnimOverrideBitmask=player->getAnimOverrideBitmask();
@ -103,10 +108,18 @@ int PlayerRenderer::prepareArmor(shared_ptr<LivingEntity> _player, int layer, fl
armor->leg0->visible = layer == 2 || layer == 3; armor->leg0->visible = layer == 2 || layer == 3;
armor->leg1->visible = layer == 2 || layer == 3; armor->leg1->visible = layer == 2 || layer == 3;
armor->head->isArmorPart1 = layer == 0;
armor->hair->isArmorPart1 = layer == 0;
armor->body->isArmorPart1 = layer == 1;
armor->arm0->isArmorPart1 = layer == 1;
armor->arm1->isArmorPart1 = layer == 1;
armor->leg0->isArmorPart1 = layer == 3;
armor->leg1->isArmorPart1 = layer == 3;
setArmor(armor); setArmor(armor);
if (armor != nullptr) armor->attackTime = model->attackTime; if (armor != nullptr) armor->attackTime = resModel->attackTime;
if (armor != nullptr) armor->riding = model->riding; if (armor != nullptr) armor->riding = resModel->riding;
if (armor != nullptr) armor->young = model->young; if (armor != nullptr) armor->young = resModel->young;
float brightness = SharedConstants::TEXTURE_LIGHTING ? 1 : player->getBrightness(a); float brightness = SharedConstants::TEXTURE_LIGHTING ? 1 : player->getBrightness(a);
if (armorItem->getMaterial() == ArmorItem::ArmorMaterial::CLOTH) if (armorItem->getMaterial() == ArmorItem::ArmorMaterial::CLOTH)