From 78bb793933049fbf13359a8ebf8615d71ee60f12 Mon Sep 17 00:00:00 2001 From: Oliver1337 <104810162+OliverLesen@users.noreply.github.com> Date: Mon, 9 Mar 2026 18:27:25 -0300 Subject: [PATCH] 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 --- Minecraft.Client/HumanoidModel.cpp | 817 ++++++++++++++++++----------- 1 file changed, 497 insertions(+), 320 deletions(-) diff --git a/Minecraft.Client/HumanoidModel.cpp b/Minecraft.Client/HumanoidModel.cpp index c6c6b9f4f..7258f56ee 100644 --- a/Minecraft.Client/HumanoidModel.cpp +++ b/Minecraft.Client/HumanoidModel.cpp @@ -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(pBox->fU)) || (pNewBox->getfV()!=static_cast(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(pBox->fU), static_cast(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, 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, 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, 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<0); - body->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); - arm0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); - arm1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); - leg0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); - leg1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); - hair->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<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, 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<xRot=0.0f; - arm1->xRot=0.0f; - arm0->zRot = 0.0f; - arm1->zRot = 0.0f; - - } - else if(uiBitmaskOverrideAnim&(1<xRot=-HALF_PI; - arm1->xRot=-HALF_PI; - arm0->zRot = 0.0f; - arm1->zRot = 0.0f; - } - else if(uiBitmaskOverrideAnim&(1<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<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<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<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<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<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<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<0); - body->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); - arm0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); - arm1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); - leg0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); - leg1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); - hair->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<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); + } }