Update HumanoidModel.cpp

This file now assembles the model according to the skin:

If it's Steve, it uses a 4-pixel arm.

If it's Alex, it uses a 3-pixel arm.

If the skin is 64x64, it assembles the modern layers correctly.

If there's no flag, it falls into the classic 64x32 format.

Old classic skin

Modern 64x64 skin

Steve

Alex
This commit is contained in:
Oliver1337 2026-03-09 18:27:25 -03:00 committed by GitHub
parent 1eb26ee9df
commit 78bb793933
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -8,27 +8,27 @@
ModelPart * HumanoidModel::AddOrRetrievePart(SKIN_BOX *pBox)
{
ModelPart *pAttachTo=nullptr;
ModelPart *pAttachTo = NULL;
switch(pBox->ePart)
{
case eBodyPart_Head:
pAttachTo=head;
pAttachTo = head;
break;
case eBodyPart_Body:
pAttachTo=body;
pAttachTo = body;
break;
case eBodyPart_Arm0:
pAttachTo=arm0;
pAttachTo = arm0;
break;
case eBodyPart_Arm1:
pAttachTo=arm1;
pAttachTo = arm1;
break;
case eBodyPart_Leg0:
pAttachTo=leg0;
pAttachTo = leg0;
break;
case eBodyPart_Leg1:
pAttachTo=leg1;
pAttachTo = leg1;
break;
}
@ -37,35 +37,42 @@ ModelPart * HumanoidModel::AddOrRetrievePart(SKIN_BOX *pBox)
if(pNewBox)
{
if((pNewBox->getfU()!=static_cast<int>(pBox->fU)) || (pNewBox->getfV()!=static_cast<int>(pBox->fV)))
if((pNewBox->getfU() != (int)pBox->fU) || (pNewBox->getfV() != (int)pBox->fV))
{
app.DebugPrintf("HumanoidModel::AddOrRetrievePart - Box geometry was found, but with different uvs\n");
pNewBox=nullptr;
pNewBox = NULL;
}
}
if(pNewBox==nullptr)
if(pNewBox == NULL)
{
//app.DebugPrintf("HumanoidModel::AddOrRetrievePart - Adding box to model part\n");
pNewBox = new ModelPart(this, static_cast<int>(pBox->fU), static_cast<int>(pBox->fV));
pNewBox->visible=false;
pNewBox = new ModelPart(this, (int)pBox->fU, (int)pBox->fV);
pNewBox->visible = false;
pNewBox->addHumanoidBox(pBox->fX, pBox->fY, pBox->fZ, pBox->fW, pBox->fH, pBox->fD, 0);
// 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);
pAttachTo->addChild(pNewBox);
}
return pNewBox;
}
void HumanoidModel::_init(float g, float yOffset, int texWidth, int texHeight)
void HumanoidModel::_init(float g, float yOffset, int texWidth, int texHeight, bool slimArms)
{
isSlimArms = slimArms;
m_ePlayerModelType = slimArms ? ePlayerModel_Alex : ePlayerModel_Steve;
this->texWidth = texWidth;
this->texHeight = texHeight;
m_fYOffset=yOffset;
m_fYOffset = yOffset;
hasLayer2 = (texWidth == 64 && texHeight == 64);
bodyWear = NULL;
arm0Wear = NULL;
arm1Wear = NULL;
leg0Wear = NULL;
leg1Wear = NULL;
cloak = new ModelPart(this, 0, 0);
cloak->addHumanoidBox(-5, -0, -1, 10, 16, 1, g); // Cloak
cloak->addHumanoidBox(-5, 0, -1, 10, 16, 1, g); // Cloak
ear = new ModelPart(this, 24, 0);
ear->addHumanoidBox(-3, -6, -1, 6, 6, 1, g); // Ear
@ -75,76 +82,145 @@ void HumanoidModel::_init(float g, float yOffset, int texWidth, int texHeight)
head->setPos(0, 0 + yOffset, 0);
hair = new ModelPart(this, 32, 0);
hair->addHumanoidBox(-4, -8, -4, 8, 8, 8, g + 0.5f); // Head
hair->addHumanoidBox(-4, -8, -4, 8, 8, 8, g + 0.5f); // Head overlay
hair->setPos(0, 0 + yOffset, 0);
body = new ModelPart(this, 16, 16);
body->addHumanoidBox(-4, 0, -2, 8, 12, 4, g); // Body
body->setPos(0, 0 + yOffset, 0);
arm0 = new ModelPart(this, 24 + 16, 16);
arm0->addHumanoidBox(-3, -2, -2, 4, 12, 4, g); // Arm0
arm0->setPos(-5, 2 + yOffset, 0);
arm0 = new ModelPart(this, 40, 16);
arm1 = new ModelPart(this, 40, 16);
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);
if (isSlimArms)
{
// Alex
arm0->addHumanoidBox(-2, -2, -2, 3, 12, 4, g);
arm0->setPos(-5.0f, 2.0f + yOffset, 0.0f);
arm1->mirror();
arm1->addHumanoidBox(-1, -2, -2, 3, 12, 4, g);
arm1->setPos(5.0f, 2.0f + yOffset, 0.0f);
}
else
{
// Steve
arm0->addHumanoidBox(-3, -2, -2, 4, 12, 4, g);
arm0->setPos(-5.0f, 2.0f + yOffset, 0.0f);
arm1->mirror();
arm1->addHumanoidBox(-1, -2, -2, 4, 12, 4, g);
arm1->setPos(5.0f, 2.0f + yOffset, 0.0f);
}
leg0 = new ModelPart(this, 0, 16);
leg0->addHumanoidBox(-2, 0, -2, 4, 12, 4, g); // Leg0
leg0->setPos(-1.9, 12 + yOffset, 0);
leg0->setPos(-1.9f, 12 + yOffset, 0);
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);
leg1->setPos(1.9f, 12 + yOffset, 0);
// 4J added - compile now to avoid random performance hit first time cubes are rendered
// 4J Stu - Not just performance, but alpha+depth tests don't work right unless we compile here
cloak->compile(1.0f/16.0f);
ear->compile(1.0f/16.0f);
head->compile(1.0f/16.0f);
body->compile(1.0f/16.0f);
arm0->compile(1.0f/16.0f);
arm1->compile(1.0f/16.0f);
leg0->compile(1.0f/16.0f);
leg1->compile(1.0f/16.0f);
hair->compile(1.0f/16.0f);
// second layer / wear layer only for 64x64 skins
if (hasLayer2)
{
bodyWear = new ModelPart(this, 16, 32);
bodyWear->addHumanoidBox(-4, 0, -2, 8, 12, 4, g + 0.25f);
bodyWear->setPos(0.0f, 0.0f + yOffset, 0.0f);
holdingLeftHand=0;
holdingRightHand=0;
sneaking=false;
idle=false;
bowAndArrow=false;
arm0Wear = new ModelPart(this, 40, 32);
arm1Wear = new ModelPart(this, 40, 32);
if (isSlimArms)
{
arm0Wear->addHumanoidBox(-2, -2, -2, 3, 12, 4, g + 0.25f);
arm0Wear->setPos(-5.0f, 2.0f + yOffset, 0.0f);
arm1Wear->mirror();
arm1Wear->addHumanoidBox(-1, -2, -2, 3, 12, 4, g + 0.25f);
arm1Wear->setPos(5.0f, 2.0f + yOffset, 0.0f);
}
else
{
arm0Wear->addHumanoidBox(-3, -2, -2, 4, 12, 4, g + 0.25f);
arm0Wear->setPos(-5.0f, 2.0f + yOffset, 0.0f);
arm1Wear->mirror();
arm1Wear->addHumanoidBox(-1, -2, -2, 4, 12, 4, g + 0.25f);
arm1Wear->setPos(5.0f, 2.0f + yOffset, 0.0f);
}
leg0Wear = new ModelPart(this, 0, 32);
leg0Wear->addHumanoidBox(-2, 0, -2, 4, 12, 4, g + 0.25f);
leg0Wear->setPos(-1.9f, 12.0f + yOffset, 0.0f);
leg1Wear = new ModelPart(this, 0, 48);
leg1Wear->mirror();
leg1Wear->addHumanoidBox(-2, 0, -2, 4, 12, 4, g + 0.25f);
leg1Wear->setPos(1.9f, 12.0f + yOffset, 0.0f);
}
// compile now to avoid first-render hitch
cloak->compile(1.0f / 16.0f);
ear->compile(1.0f / 16.0f);
head->compile(1.0f / 16.0f);
body->compile(1.0f / 16.0f);
arm0->compile(1.0f / 16.0f);
arm1->compile(1.0f / 16.0f);
leg0->compile(1.0f / 16.0f);
leg1->compile(1.0f / 16.0f);
hair->compile(1.0f / 16.0f);
if(bodyWear) bodyWear->compile(1.0f / 16.0f);
if(arm0Wear) arm0Wear->compile(1.0f / 16.0f);
if(arm1Wear) arm1Wear->compile(1.0f / 16.0f);
if(leg0Wear) leg0Wear->compile(1.0f / 16.0f);
if(leg1Wear) leg1Wear->compile(1.0f / 16.0f);
holdingLeftHand = 0;
holdingRightHand = 0;
sneaking = false;
idle = false;
bowAndArrow = false;
// 4J added
eating = false;
eating_t = 0.0f;
eating_swing = 0.0f;
m_uiAnimOverrideBitmask = 0L;
}
HumanoidModel::HumanoidModel() : Model()
HumanoidModel::HumanoidModel()
{
_init(0, 0, 64, 32);
_init(0.0f, 0.0f, 64, 32, false);
}
HumanoidModel::HumanoidModel(float g) : Model()
HumanoidModel::HumanoidModel(float g)
{
_init(g, 0, 64, 32);
_init(g, 0.0f, 64, 32, false);
}
HumanoidModel::HumanoidModel(float g, float yOffset, int texWidth, int texHeight) : Model()
HumanoidModel::HumanoidModel(float g, float yOffset, int texWidth, int texHeight)
{
_init(g,yOffset,texWidth,texHeight);
_init(g, yOffset, texWidth, texHeight, false);
}
HumanoidModel::HumanoidModel(float g, float yOffset, int texWidth, int texHeight, bool slimArms)
{
_init(g, yOffset, texWidth, texHeight, slimArms);
}
void HumanoidModel::setPlayerModelType(int type)
{
m_ePlayerModelType = type;
isSlimArms = (type == ePlayerModel_Alex);
}
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 != NULL)
{
m_uiAnimOverrideBitmask=entity->getAnimOverrideBitmask();
m_uiAnimOverrideBitmask = entity->getAnimOverrideBitmask();
}
setupAnim(time, r, bob, yRot, xRot, scale, entity, m_uiAnimOverrideBitmask);
@ -152,11 +228,14 @@ void HumanoidModel::render(shared_ptr<Entity> entity, float time, float r, float
if (young)
{
float ss = 2.0f;
glPushMatrix();
glScalef(1.5f / ss, 1.5f / ss, 1.5f / ss);
glTranslatef(0, 16 * scale, 0);
head->render(scale, usecompiled);
hair->render(scale, usecompiled);
glPopMatrix();
glPushMatrix();
glScalef(1 / ss, 1 / ss, 1 / ss);
glTranslatef(0, 24 * scale, 0);
@ -165,304 +244,335 @@ void HumanoidModel::render(shared_ptr<Entity> entity, float time, float r, float
arm1->render(scale, usecompiled);
leg0->render(scale, usecompiled);
leg1->render(scale, usecompiled);
hair->render(scale, usecompiled);
if(bodyWear) bodyWear->render(scale, usecompiled);
if(arm0Wear) arm0Wear->render(scale, usecompiled);
if(arm1Wear) arm1Wear->render(scale, usecompiled);
if(leg0Wear) leg0Wear->render(scale, usecompiled);
if(leg1Wear) leg1Wear->render(scale, usecompiled);
glPopMatrix();
}
else
{
head->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderHead))>0);
body->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderTorso))>0);
arm0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderArm0))>0);
arm1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderArm1))>0);
leg0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderLeg0))>0);
leg1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderLeg1))>0);
hair->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderHair))>0);
head->render(scale, usecompiled, (m_uiAnimOverrideBitmask & (1 << eAnim_DisableRenderHead)) > 0);
body->render(scale, usecompiled, (m_uiAnimOverrideBitmask & (1 << eAnim_DisableRenderTorso)) > 0);
arm0->render(scale, usecompiled, (m_uiAnimOverrideBitmask & (1 << eAnim_DisableRenderArm0)) > 0);
arm1->render(scale, usecompiled, (m_uiAnimOverrideBitmask & (1 << eAnim_DisableRenderArm1)) > 0);
leg0->render(scale, usecompiled, (m_uiAnimOverrideBitmask & (1 << eAnim_DisableRenderLeg0)) > 0);
leg1->render(scale, usecompiled, (m_uiAnimOverrideBitmask & (1 << eAnim_DisableRenderLeg1)) > 0);
hair->render(scale, usecompiled, (m_uiAnimOverrideBitmask & (1 << eAnim_DisableRenderHair)) > 0);
if(bodyWear) bodyWear->render(scale, usecompiled);
if(arm0Wear) arm0Wear->render(scale, usecompiled);
if(arm1Wear) arm1Wear->render(scale, usecompiled);
if(leg0Wear) leg0Wear->render(scale, usecompiled);
if(leg1Wear) leg1Wear->render(scale, usecompiled);
}
}
void HumanoidModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr<Entity> entity, unsigned int uiBitmaskOverrideAnim)
{
//bool bIsAttacking = (attackTime > -9990.0f);
head->yRot = yRot / (float)(180.0f / PI);
head->xRot = xRot / (float)(180.0f / PI);
hair->yRot = head->yRot;
hair->xRot = head->xRot;
body->z = 0.0f;
// Does the skin have an override for anim?
if(uiBitmaskOverrideAnim & (1 << eAnim_ArmsDown))
{
head->yRot = yRot / (float) (180.0f / PI);
head->xRot = xRot / (float) (180.0f / PI);
hair->yRot = head->yRot;
hair->xRot = head->xRot;
body->z = 0.0f;
arm0->xRot = 0.0f;
arm1->xRot = 0.0f;
arm0->zRot = 0.0f;
arm1->zRot = 0.0f;
}
else if(uiBitmaskOverrideAnim & (1 << eAnim_ArmsOutFront))
{
arm0->xRot = -HALF_PI;
arm1->xRot = -HALF_PI;
arm0->zRot = 0.0f;
arm1->zRot = 0.0f;
}
else if(uiBitmaskOverrideAnim & (1 << eAnim_SingleArms))
{
arm0->xRot = (Mth::cos(time * 0.6662f + PI) * 2.0f) * r * 0.5f;
arm1->xRot = (Mth::cos(time * 0.6662f + PI) * 2.0f) * r * 0.5f;
arm0->zRot = 0.0f;
arm1->zRot = 0.0f;
}
else if((uiBitmaskOverrideAnim & (1 << eAnim_StatueOfLiberty)) && (holdingRightHand == 0) && (attackTime == 0.0f))
{
arm0->xRot = -PI;
arm0->zRot = -0.3f;
arm1->xRot = (Mth::cos(time * 0.6662f) * 2.0f) * r * 0.5f;
arm1->zRot = 0.0f;
}
else
{
arm0->xRot = (Mth::cos(time * 0.6662f + PI) * 2.0f) * r * 0.5f;
arm1->xRot = (Mth::cos(time * 0.6662f) * 2.0f) * r * 0.5f;
arm0->zRot = 0.0f;
arm1->zRot = 0.0f;
}
// Does the skin have an override for anim?
leg0->yRot = 0.0f;
leg1->yRot = 0.0f;
if(uiBitmaskOverrideAnim&(1<<eAnim_ArmsDown))
if (riding)
{
if((uiBitmaskOverrideAnim & (1 << eAnim_SmallModel)) == 0)
{
arm0->xRot=0.0f;
arm1->xRot=0.0f;
arm0->zRot = 0.0f;
arm1->zRot = 0.0f;
}
else if(uiBitmaskOverrideAnim&(1<<eAnim_ArmsOutFront))
{
arm0->xRot=-HALF_PI;
arm1->xRot=-HALF_PI;
arm0->zRot = 0.0f;
arm1->zRot = 0.0f;
}
else if(uiBitmaskOverrideAnim&(1<<eAnim_SingleArms))
{
arm0->xRot = (Mth::cos(time * 0.6662f + PI) * 2.0f) * r * 0.5f;
arm1->xRot = (Mth::cos(time * 0.6662f + PI) * 2.0f) * r * 0.5f;
arm0->zRot = 0.0f;
arm1->zRot = 0.0f;
}
// 4J-PB - Weeping Angel - does't look good holding something in the arm that's up
else if((uiBitmaskOverrideAnim&(1<<eAnim_StatueOfLiberty)) && (holdingRightHand==0) && (attackTime==0.0f))
{
arm0->xRot = -PI;
arm0->zRot = -0.3f;
arm1->xRot = ( Mth::cos(time * 0.6662f) * 2.0f) * r * 0.5f;
arm1->zRot = 0.0f;
}
else
{
arm0->xRot = (Mth::cos(time * 0.6662f + PI) * 2.0f) * r * 0.5f;
arm1->xRot = ( Mth::cos(time * 0.6662f) * 2.0f) * r * 0.5f;
arm0->zRot = 0.0f;
arm1->zRot = 0.0f;
}
// arm0.zRot = ((float) (util.Mth.cos(time * 0.2312f) + 1) * 1) * r;
// arm1.zRot = ((float) (util.Mth.cos(time * 0.2812f) - 1) * 1) * r;
leg0->yRot = 0.0f;
leg1->yRot = 0.0f;
if (riding)
{
if(uiBitmaskOverrideAnim&(1<<eAnim_SmallModel) == 0)
{
arm0->xRot += -HALF_PI * 0.4f;
arm1->xRot += -HALF_PI * 0.4f;
leg0->xRot = -HALF_PI * 0.8f;
leg1->xRot = -HALF_PI * 0.8f;
leg0->yRot = HALF_PI * 0.2f;
leg1->yRot = -HALF_PI * 0.2f;
}
else
{
arm0->xRot += -HALF_PI * 0.4f;
arm1->xRot += -HALF_PI * 0.4f;
leg0->xRot = -HALF_PI * 0.4f;
leg1->xRot = -HALF_PI * 0.4f;
}
}
else if(idle && !sneaking )
{
leg0->xRot = -HALF_PI;
leg1->xRot = -HALF_PI;
arm0->xRot += -HALF_PI * 0.4f;
arm1->xRot += -HALF_PI * 0.4f;
leg0->xRot = -HALF_PI * 0.8f;
leg1->xRot = -HALF_PI * 0.8f;
leg0->yRot = HALF_PI * 0.2f;
leg1->yRot = -HALF_PI * 0.2f;
}
else if(uiBitmaskOverrideAnim&(1<<eAnim_NoLegAnim))
{
leg0->xRot=0.0f;
leg0->zRot=0.0f;
leg1->xRot=0.0f;
leg1->zRot=0.0f;
leg0->yRot = 0.0f;
leg1->yRot = 0.0f;
}
else if(uiBitmaskOverrideAnim&(1<<eAnim_SingleLegs))
{
leg0->xRot = ( Mth::cos(time * 0.6662f) * 1.4f) * r;
leg1->xRot = ( Mth::cos(time * 0.6662f) * 1.4f) * r;
}
else
{
leg0->xRot = ( Mth::cos(time * 0.6662f) * 1.4f) * r;
leg1->xRot = ( Mth::cos(time * 0.6662f + PI) * 1.4f) * r;
arm0->xRot += -HALF_PI * 0.4f;
arm1->xRot += -HALF_PI * 0.4f;
leg0->xRot = -HALF_PI * 0.4f;
leg1->xRot = -HALF_PI * 0.4f;
}
}
else if(idle && !sneaking)
{
leg0->xRot = -HALF_PI;
leg1->xRot = -HALF_PI;
leg0->yRot = HALF_PI * 0.2f;
leg1->yRot = -HALF_PI * 0.2f;
}
else if(uiBitmaskOverrideAnim & (1 << eAnim_NoLegAnim))
{
leg0->xRot = 0.0f;
leg0->zRot = 0.0f;
leg1->xRot = 0.0f;
leg1->zRot = 0.0f;
leg0->yRot = 0.0f;
leg1->yRot = 0.0f;
}
else if(uiBitmaskOverrideAnim & (1 << eAnim_SingleLegs))
{
leg0->xRot = (Mth::cos(time * 0.6662f) * 1.4f) * r;
leg1->xRot = (Mth::cos(time * 0.6662f) * 1.4f) * r;
}
else
{
leg0->xRot = (Mth::cos(time * 0.6662f) * 1.4f) * r;
leg1->xRot = (Mth::cos(time * 0.6662f + PI) * 1.4f) * r;
}
if (holdingLeftHand != 0)
{
arm1->xRot = arm1->xRot * 0.5f - HALF_PI * 0.2f * holdingLeftHand;
}
if (holdingRightHand != 0)
{
arm0->xRot = arm0->xRot * 0.5f - HALF_PI * 0.2f * holdingRightHand;
}
if (holdingLeftHand != 0)
arm0->yRot = 0.0f;
arm1->yRot = 0.0f;
if (attackTime > -9990.0f)
{
float swing = attackTime;
body->yRot = Mth::sin(sqrt(swing) * PI * 2.0f) * 0.2f;
arm0->z = Mth::sin(body->yRot) * 5.0f;
arm0->x = -Mth::cos(body->yRot) * 5.0f;
arm1->z = -Mth::sin(body->yRot) * 5.0f;
arm1->x = Mth::cos(body->yRot) * 5.0f;
arm0->yRot += body->yRot;
arm1->yRot += body->yRot;
arm1->xRot += body->yRot;
swing = 1.0f - attackTime;
swing *= swing;
swing *= swing;
swing = 1.0f - swing;
float aa = Mth::sin(swing * PI);
float bb = Mth::sin(attackTime * PI) * -(head->xRot - 0.7f) * 0.75f;
arm0->xRot -= aa * 1.2f + bb;
arm0->yRot += body->yRot * 2.0f;
if((uiBitmaskOverrideAnim & (1 << eAnim_StatueOfLiberty)) && (holdingRightHand == 0) && (attackTime == 0.0f))
{
arm1->xRot = arm1->xRot * 0.5f - HALF_PI * 0.2f * holdingLeftHand;
}
if (holdingRightHand != 0)
{
arm0->xRot = arm0->xRot * 0.5f - HALF_PI * 0.2f * holdingRightHand;
}
arm0->yRot = 0.0f;
arm1->yRot = 0.0f;
if (attackTime > -9990.0f)
{
float swing = attackTime;
body->yRot = Mth::sin(sqrt(swing) * PI * 2.0f) * 0.2f;
arm0->z = Mth::sin(body->yRot) * 5.0f;
arm0->x = -Mth::cos(body->yRot) * 5.0f;
arm1->z = -Mth::sin(body->yRot) * 5.0f;
arm1->x = Mth::cos(body->yRot) * 5.0f;
arm0->yRot += body->yRot;
arm1->yRot += body->yRot;
arm1->xRot += body->yRot;
swing = 1.0f - attackTime;
swing *= swing;
swing *= swing;
swing = 1.0f - swing;
float aa = Mth::sin(swing * PI);
float bb = Mth::sin(attackTime * PI) * -(head->xRot - 0.7f) * 0.75f;
arm0->xRot -= aa * 1.2f + bb; // 4J - changed 1.2 -> 1.2f
arm0->yRot += body->yRot * 2.0f;
if((uiBitmaskOverrideAnim&(1<<eAnim_StatueOfLiberty))&& (holdingRightHand==0) && (attackTime==0.0f))
{
arm0->zRot -= Mth::sin(attackTime * PI) * -0.4f;
}
else
{
arm0->zRot = Mth::sin(attackTime * PI) * -0.4f;
}
}
// 4J added
if( eating )
{
// These factors are largely lifted from ItemInHandRenderer to try and keep the 3rd person eating animation as similar as possible
float is = 1 - eating_swing;
is = is * is * is;
is = is * is * is;
is = is * is * is;
float iss = 1 - is;
arm0->xRot = - Mth::abs(Mth::cos(eating_t / 4.0f * PI) * 0.1f) * (eating_swing > 0.2 ? 1.0f : 0.0f) * 2.0f; // This factor is the chomping bit (conditional factor is so that he doesn't eat whilst the food is being pulled away at the end)
arm0->yRot -= iss * 0.5f; // This factor and the following to the general arm movement through the life of the swing
arm0->xRot -= iss * 1.2f;
}
if (sneaking)
{
if(uiBitmaskOverrideAnim&(1<<eAnim_SmallModel))
{
body->xRot = -0.5f;
leg0->xRot -= 0.0f;
leg1->xRot -= 0.0f;
arm0->xRot += 0.4f;
arm1->xRot += 0.4f;
leg0->z = -4.0f;
leg1->z = -4.0f;
body->z = 2.0f;
body->y = 0.0f;
arm0->y = 2.0f;
arm1->y = 2.0f;
leg0->y = +9.0f;
leg1->y = +9.0f;
head->y = +1.0f;
hair->y = +1.0f;
ear->y = +1.0f;
cloak->y = 0.0f;
}
else
{
body->xRot = 0.5f;
leg0->xRot -= 0.0f;
leg1->xRot -= 0.0f;
arm0->xRot += 0.4f;
arm1->xRot += 0.4f;
leg0->z = +4.0f;
leg1->z = +4.0f;
body->y = 0.0f;
arm0->y = 2.0f;
arm1->y = 2.0f;
leg0->y = +9.0f;
leg1->y = +9.0f;
head->y = +1.0f;
hair->y = +1.0f;
ear->y = +1.0f;
cloak->y = 0.0f;
}
arm0->zRot -= Mth::sin(attackTime * PI) * -0.4f;
}
else
{
body->xRot = 0.0f;
leg0->z = 0.1f;
leg1->z = 0.1f;
if(!riding && idle)
{
leg0->y = 22.0f;
leg1->y = 22.0f;
body->y = 10.0f;
arm0->y = 12.0f;
arm1->y = 12.0f;
head->y = 10.0f;
hair->y = 10.0f;
ear->y = 11.0f;
cloak->y = 10.0f;
}
else
{
leg0->y = 12.0f;
leg1->y = 12.0f;
body->y = 0.0f;
arm0->y = 2.0f;
arm1->y = 2.0f;
head->y = 0.0f;
hair->y = 0.0f;
ear->y = 1.0f;
cloak->y = 0.0f;
}
arm0->zRot = Mth::sin(attackTime * PI) * -0.4f;
}
}
if(eating)
{
float is = 1 - eating_swing;
is = is * is * is;
is = is * is * is;
is = is * is * is;
float iss = 1 - is;
arm0->xRot = -Mth::abs(Mth::cos(eating_t / 4.0f * PI) * 0.1f) * (eating_swing > 0.2 ? 1.0f : 0.0f) * 2.0f;
arm0->yRot -= iss * 0.5f;
arm0->xRot -= iss * 1.2f;
}
arm0->zRot += ((Mth::cos(bob * 0.09f)) * 0.05f + 0.05f);
arm1->zRot -= ((Mth::cos(bob * 0.09f)) * 0.05f + 0.05f);
arm0->xRot += ((Mth::sin(bob * 0.067f)) * 0.05f);
arm1->xRot -= ((Mth::sin(bob * 0.067f)) * 0.05f);
if (bowAndArrow)
if (sneaking)
{
if(uiBitmaskOverrideAnim & (1 << eAnim_SmallModel))
{
float attack2 = 0.0f;
float attack = 0.0f;
arm0->zRot = 0.0f;
arm1->zRot = 0.0f;
arm0->yRot = -(0.1f - attack2 * 0.6f) + head->yRot;
arm1->yRot = +(0.1f - attack2 * 0.6f) + head->yRot + 0.4f;
arm0->xRot = -HALF_PI + head->xRot;
arm1->xRot = -HALF_PI + head->xRot;
arm0->xRot -= attack2 * 1.2f - attack * 0.4f;
arm1->xRot -= attack2 * 1.2f - attack * 0.4f;
arm0->zRot += ((float) (Mth::cos(bob * 0.09f)) * 0.05f + 0.05f);
arm1->zRot -= ((float) (Mth::cos(bob * 0.09f)) * 0.05f + 0.05f);
arm0->xRot += ((float) (Mth::sin(bob * 0.067f)) * 0.05f);
arm1->xRot -= ((float) (Mth::sin(bob * 0.067f)) * 0.05f);
body->xRot = -0.5f;
arm0->xRot += 0.4f;
arm1->xRot += 0.4f;
leg0->z = -4.0f;
leg1->z = -4.0f;
body->z = 2.0f;
body->y = 0.0f;
arm0->y = 2.0f;
arm1->y = 2.0f;
leg0->y = 9.0f;
leg1->y = 9.0f;
head->y = 1.0f;
hair->y = 1.0f;
ear->y = 1.0f;
cloak->y = 0.0f;
}
else
{
body->xRot = 0.5f;
arm0->xRot += 0.4f;
arm1->xRot += 0.4f;
leg0->z = 4.0f;
leg1->z = 4.0f;
body->y = 0.0f;
arm0->y = 2.0f;
arm1->y = 2.0f;
leg0->y = 9.0f;
leg1->y = 9.0f;
head->y = 1.0f;
hair->y = 1.0f;
ear->y = 1.0f;
cloak->y = 0.0f;
}
}
else
{
body->xRot = 0.0f;
leg0->z = 0.1f;
leg1->z = 0.1f;
if(!riding && idle)
{
leg0->y = 22.0f;
leg1->y = 22.0f;
body->y = 10.0f;
arm0->y = 12.0f;
arm1->y = 12.0f;
head->y = 10.0f;
hair->y = 10.0f;
ear->y = 11.0f;
cloak->y = 10.0f;
}
else
{
leg0->y = 12.0f;
leg1->y = 12.0f;
body->y = 0.0f;
arm0->y = 2.0f;
arm1->y = 2.0f;
head->y = 0.0f;
hair->y = 0.0f;
ear->y = 1.0f;
cloak->y = 0.0f;
}
}
arm0->zRot += ((Mth::cos(bob * 0.09f)) * 0.05f + 0.05f);
arm1->zRot -= ((Mth::cos(bob * 0.09f)) * 0.05f + 0.05f);
arm0->xRot += ((Mth::sin(bob * 0.067f)) * 0.05f);
arm1->xRot -= ((Mth::sin(bob * 0.067f)) * 0.05f);
if (bowAndArrow)
{
float attack2 = 0.0f;
float attack = 0.0f;
arm0->zRot = 0.0f;
arm1->zRot = 0.0f;
arm0->yRot = -(0.1f - attack2 * 0.6f) + head->yRot;
arm1->yRot = +(0.1f - attack2 * 0.6f) + head->yRot + 0.4f;
arm0->xRot = -HALF_PI + head->xRot;
arm1->xRot = -HALF_PI + head->xRot;
arm0->xRot -= attack2 * 1.2f - attack * 0.4f;
arm1->xRot -= attack2 * 1.2f - attack * 0.4f;
arm0->zRot += ((float)(Mth::cos(bob * 0.09f)) * 0.05f + 0.05f);
arm1->zRot -= ((float)(Mth::cos(bob * 0.09f)) * 0.05f + 0.05f);
arm0->xRot += ((float)(Mth::sin(bob * 0.067f)) * 0.05f);
arm1->xRot -= ((float)(Mth::sin(bob * 0.067f)) * 0.05f);
}
// sync second layer after ALL animation is applied
if(bodyWear)
{
bodyWear->xRot = body->xRot;
bodyWear->yRot = body->yRot;
bodyWear->zRot = body->zRot;
bodyWear->x = body->x;
bodyWear->y = body->y;
bodyWear->z = body->z;
arm0Wear->xRot = arm0->xRot;
arm0Wear->yRot = arm0->yRot;
arm0Wear->zRot = arm0->zRot;
arm0Wear->x = arm0->x;
arm0Wear->y = arm0->y;
arm0Wear->z = arm0->z;
arm1Wear->xRot = arm1->xRot;
arm1Wear->yRot = arm1->yRot;
arm1Wear->zRot = arm1->zRot;
arm1Wear->x = arm1->x;
arm1Wear->y = arm1->y;
arm1Wear->z = arm1->z;
leg0Wear->xRot = leg0->xRot;
leg0Wear->yRot = leg0->yRot;
leg0Wear->zRot = leg0->zRot;
leg0Wear->x = leg0->x;
leg0Wear->y = leg0->y;
leg0Wear->z = leg0->z;
leg1Wear->xRot = leg1->xRot;
leg1Wear->yRot = leg1->yRot;
leg1Wear->zRot = leg1->zRot;
leg1Wear->x = leg1->x;
leg1Wear->y = leg1->y;
leg1Wear->z = leg1->z;
}
}
void HumanoidModel::renderHair(float scale,bool usecompiled)
void HumanoidModel::renderHair(float scale, bool usecompiled)
{
hair->yRot = head->yRot;
hair->xRot = head->xRot;
hair->render(scale,usecompiled);
hair->render(scale, usecompiled);
}
void HumanoidModel::renderEars(float scale,bool usecompiled)
void HumanoidModel::renderEars(float scale, bool usecompiled)
{
ear->yRot = head->yRot;
ear->xRot = head->xRot;
ear->x=0;
ear->y=0;
ear->render(scale,usecompiled);
ear->x = 0;
ear->y = 0;
ear->render(scale, usecompiled);
}
void HumanoidModel::renderCloak(float scale,bool usecompiled)
void HumanoidModel::renderCloak(float scale, bool usecompiled)
{
cloak->render(scale,usecompiled);
cloak->render(scale, usecompiled);
}
void HumanoidModel::render(HumanoidModel *model, float scale, bool usecompiled)
@ -470,28 +580,95 @@ void HumanoidModel::render(HumanoidModel *model, float scale, bool usecompiled)
head->yRot = model->head->yRot;
head->y = model->head->y;
head->xRot = model->head->xRot;
hair->y = head->y;
hair->yRot = head->yRot;
hair->xRot = head->xRot;
body->xRot = model->body->xRot;
body->yRot = model->body->yRot;
body->zRot = model->body->zRot;
body->x = model->body->x;
body->y = model->body->y;
body->z = model->body->z;
arm0->xRot = model->arm0->xRot;
arm0->yRot = model->arm0->yRot;
arm0->zRot = model->arm0->zRot;
arm0->x = model->arm0->x;
arm0->y = model->arm0->y;
arm0->z = model->arm0->z;
arm1->xRot = model->arm1->xRot;
arm1->yRot = model->arm1->yRot;
arm1->zRot = model->arm1->zRot;
leg0->xRot = model->leg0->xRot;
leg1->xRot = model->leg1->xRot;
arm1->x = model->arm1->x;
arm1->y = model->arm1->y;
arm1->z = model->arm1->z;
head->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderHead))>0);
body->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderTorso))>0);
arm0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderArm0))>0);
arm1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderArm1))>0);
leg0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderLeg0))>0);
leg1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderLeg1))>0);
hair->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderHair))>0);
leg0->xRot = model->leg0->xRot;
leg0->yRot = model->leg0->yRot;
leg0->zRot = model->leg0->zRot;
leg0->x = model->leg0->x;
leg0->y = model->leg0->y;
leg0->z = model->leg0->z;
leg1->xRot = model->leg1->xRot;
leg1->yRot = model->leg1->yRot;
leg1->zRot = model->leg1->zRot;
leg1->x = model->leg1->x;
leg1->y = model->leg1->y;
leg1->z = model->leg1->z;
head->render(scale, usecompiled, (m_uiAnimOverrideBitmask & (1 << eAnim_DisableRenderHead)) > 0);
body->render(scale, usecompiled, (m_uiAnimOverrideBitmask & (1 << eAnim_DisableRenderTorso)) > 0);
arm0->render(scale, usecompiled, (m_uiAnimOverrideBitmask & (1 << eAnim_DisableRenderArm0)) > 0);
arm1->render(scale, usecompiled, (m_uiAnimOverrideBitmask & (1 << eAnim_DisableRenderArm1)) > 0);
leg0->render(scale, usecompiled, (m_uiAnimOverrideBitmask & (1 << eAnim_DisableRenderLeg0)) > 0);
leg1->render(scale, usecompiled, (m_uiAnimOverrideBitmask & (1 << eAnim_DisableRenderLeg1)) > 0);
hair->render(scale, usecompiled, (m_uiAnimOverrideBitmask & (1 << eAnim_DisableRenderHair)) > 0);
if(bodyWear && model->bodyWear)
{
bodyWear->xRot = model->bodyWear->xRot;
bodyWear->yRot = model->bodyWear->yRot;
bodyWear->zRot = model->bodyWear->zRot;
bodyWear->x = model->bodyWear->x;
bodyWear->y = model->bodyWear->y;
bodyWear->z = model->bodyWear->z;
arm0Wear->xRot = model->arm0Wear->xRot;
arm0Wear->yRot = model->arm0Wear->yRot;
arm0Wear->zRot = model->arm0Wear->zRot;
arm0Wear->x = model->arm0Wear->x;
arm0Wear->y = model->arm0Wear->y;
arm0Wear->z = model->arm0Wear->z;
arm1Wear->xRot = model->arm1Wear->xRot;
arm1Wear->yRot = model->arm1Wear->yRot;
arm1Wear->zRot = model->arm1Wear->zRot;
arm1Wear->x = model->arm1Wear->x;
arm1Wear->y = model->arm1Wear->y;
arm1Wear->z = model->arm1Wear->z;
leg0Wear->xRot = model->leg0Wear->xRot;
leg0Wear->yRot = model->leg0Wear->yRot;
leg0Wear->zRot = model->leg0Wear->zRot;
leg0Wear->x = model->leg0Wear->x;
leg0Wear->y = model->leg0Wear->y;
leg0Wear->z = model->leg0Wear->z;
leg1Wear->xRot = model->leg1Wear->xRot;
leg1Wear->yRot = model->leg1Wear->yRot;
leg1Wear->zRot = model->leg1Wear->zRot;
leg1Wear->x = model->leg1Wear->x;
leg1Wear->y = model->leg1Wear->y;
leg1Wear->z = model->leg1Wear->z;
bodyWear->render(scale, usecompiled);
arm0Wear->render(scale, usecompiled);
arm1Wear->render(scale, usecompiled);
leg0Wear->render(scale, usecompiled);
leg1Wear->render(scale, usecompiled);
}
}