#include "stdafx.h" #include "HumanoidModel.h" #include "../Minecraft.World/Mth.h" #include "../Minecraft.World/Player.h" #include "ModelPart.h" // 4J added ModelPart * HumanoidModel::AddOrRetrievePart(SKIN_BOX *pBox) { ModelPart *pAttachTo=nullptr; float scale=0; switch(pBox->ePart) { case eBodyPart_Head: pAttachTo=head; break; case eBodyPart_Body: pAttachTo=body; break; case eBodyPart_Arm0: pAttachTo=arm0; break; case eBodyPart_Arm1: pAttachTo=arm1; break; case eBodyPart_Leg0: pAttachTo=leg0; break; case eBodyPart_Leg1: pAttachTo=leg1; break; case eBodyPart_Headwear: pAttachTo=hair; break; case eBodyPart_Jacket: pAttachTo=jacket; scale=0.25; break; case eBodyPart_Sleeve0: pAttachTo=sleeve0; scale=0.25; break; case eBodyPart_Sleeve1: pAttachTo=sleeve1; scale=0.25; break; case eBodyPart_Pants0: pAttachTo=pants0; scale=0.25; break; case eBodyPart_Pants1: pAttachTo=pants1; scale=0.25; break; case eBodyPart_Waist: pAttachTo=waist; break; case eBodyPart_Belt: pAttachTo=belt; break; case eBodyPart_BodyArmor: pAttachTo=bodyArmor; break; case eBodyPart_ArmArmor0: pAttachTo=armArmor0; break; case eBodyPart_ArmArmor1: pAttachTo=armArmor1; break; case eBodyPart_Legging0: pAttachTo=legging0; break; case eBodyPart_Legging1: pAttachTo=legging1; break; case eBodyPart_Sock0: pAttachTo=sock0; break; case eBodyPart_Sock1: pAttachTo=sock1; break; case eBodyPart_Boot0: pAttachTo=boot0; break; case eBodyPart_Boot1: pAttachTo=boot1; break; } // check if this box has a declared scale then add it if (pBox->fS != 0) scale = pBox->fS; // first check this box doesn't already exist ModelPart *pNewBox = pAttachTo->retrieveChild(pBox); if(pNewBox) { if((pNewBox->getfU()!=static_cast(pBox->fU)) || (pNewBox->getfV()!=static_cast(pBox->fV))) { app.DebugPrintf("HumanoidModel::AddOrRetrievePart - Box geometry was found, but with different uvs\n"); pNewBox=nullptr; } } if(pNewBox==nullptr) { //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; 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 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. //pNewBox->compile(1.0f/16.0f); pAttachTo->addChild(pNewBox); } return pNewBox; } void HumanoidModel::_init(float g, float yOffset, int texWidth, int texHeight, bool slim, bool isArmor) { this->texWidth = texWidth; this->texHeight = texHeight; jacket = nullptr; sleeve0 = nullptr; sleeve1 = nullptr; pants0 = nullptr; pants1 = nullptr; waist = nullptr; belt = nullptr; bodyArmor = nullptr; armArmor0 = nullptr; armArmor1 = nullptr; legging0 = nullptr; legging1 = nullptr; sock0 = nullptr; sock1 = nullptr; boot0 = nullptr; boot1 = nullptr; m_fYOffset=yOffset; cloak = new ModelPart(this, 0, 0); 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 head = new ModelPart(this, 0, 0); head->addHumanoidBox(-4, -8, -4, 8, 8, 8, g); // Head 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->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); if (texHeight == 64) { jacket = new ModelPart(this, 16, 32); jacket->addHumanoidBox(-4, 0, -2, 8, 12, 4, g + 0.25); // Jacket jacket->setPos(0, 0 + yOffset, 0); waist = new ModelPart(this, 0, 0); waist->addHumanoidBox(0, 0, 0, 0, 0, 0, g); // Waist waist->setPos(0, 0 + yOffset, 0); belt = new ModelPart(this, 0, 0); belt->addHumanoidBox(0, 0, 0, 0, 0, 0, g); // Belt belt->setPos(0, 0 + yOffset, 0); bodyArmor = new ModelPart(this, 0, 0); bodyArmor->addHumanoidBox(0, 0, 0, 0, 0, 0, g); // BodyArmor bodyArmor->setPos(0, 0 + yOffset, 0); armArmor0 = new ModelPart(this, 0, 0); armArmor0->addHumanoidBox(0, 0, 0, 0, 0, 0, g); // ArmArmor0 armArmor0->setPos(-5, 2 + yOffset, 0); armArmor1 = new ModelPart(this, 0, 0); armArmor1->addHumanoidBox(0, 0, 0, 0, 0, 0, g); // ArmArmor1 armArmor1->setPos(5, 2 + yOffset, 0); legging0 = new ModelPart(this, 0, 0); legging0->addHumanoidBox(0, 0, 0, 0, 0, 0, g); // Legging0 legging0->setPos(-1.9, 12 + yOffset, 0); legging1 = new ModelPart(this, 0, 0); legging1->addHumanoidBox(0, 0, 0, 0, 0, 0, g); // Legging1 legging1->setPos(1.9, 12 + yOffset, 0); sock0 = new ModelPart(this, 0, 0); sock0->addHumanoidBox(0, 0, 0, 0, 0, 0, g); // Sock0 sock0->setPos(-1.9, 12 + yOffset, 0); sock1 = new ModelPart(this, 0, 0); sock1->addHumanoidBox(0, 0, 0, 0, 0, 0, g); // Sock1 sock1->setPos(1.9, 12 + yOffset, 0); boot0 = new ModelPart(this, 0, 0); boot0->addHumanoidBox(0, 0, 0, 0, 0, 0, g); // Boot0 boot0->setPos(-1.9, 12 + yOffset, 0); boot1 = new ModelPart(this, 0, 0); boot1->addHumanoidBox(0, 0, 0, 0, 0, 0, g); // Boot1 boot1->setPos(1.9, 12 + yOffset, 0); } if (texHeight == 64) { arm0 = new ModelPart(this, 24 + 16, 16); arm1 = new ModelPart(this, 16 + 16, 48); sleeve0 = new ModelPart(this, 24 + 16, 32); sleeve1 = new ModelPart(this, 32 + 16, 48); if (!slim) { sleeve0->addHumanoidBox(-3, -2, -2, 4, 12, 4, g + 0.25); // Sleeve0 sleeve1->addHumanoidBox(-1, -2, -2, 4, 12, 4, g + 0.25); // Sleeve1 } else if (slim) { sleeve0->addHumanoidBox(-2, -2, -2, 3, 12, 4, g + 0.25); // Sleeve0 Slim sleeve1->addHumanoidBox(-1, -2, -2, 3, 12, 4, g + 0.25); // Sleeve1 Slim } sleeve0->setPos(-5, 2 + yOffset, 0); sleeve1->setPos(5, 2 + yOffset, 0); } else if (texHeight == 32) { arm0 = new ModelPart(this, 24 + 16, 16); arm1 = new ModelPart(this, 24 + 16, 16); arm1->bMirror = true; } if (!slim) { arm0->addHumanoidBox(-3, -2, -2, 4, 12, 4, g); // Arm0 arm1->addHumanoidBox(-1, -2, -2, 4, 12, 4, g); // Arm1 } else if (slim) { arm0->addHumanoidBox(-2, -2, -2, 3, 12, 4, g); // Arm0 Slim arm1->addHumanoidBox(-1, -2, -2, 3, 12, 4, g); // Arm1 Slim } arm0->setPos(-5, 2 + yOffset, 0); arm1->setPos(5, 2 + yOffset, 0); leg0 = new ModelPart(this, 0, 16); if (texHeight == 64) { leg1 = new ModelPart(this, 16, 48); pants0 = new ModelPart(this, 0, 32); pants0->addHumanoidBox(-2, 0, -2, 4, 12, 4, g + 0.25); // Pants0 pants0->setPos(-1.9, 12 + yOffset, 0); pants1 = new ModelPart(this, 0, 48); pants1->addHumanoidBox(-2, 0, -2, 4, 12, 4, g + 0.25); // Pants1 pants1->setPos(1.9, 12 + yOffset, 0); } else if (texHeight == 32) { leg1 = new ModelPart(this, 0, 16); leg1->bMirror = true; } leg0->addHumanoidBox(-2, 0, -2, 4, 12, 4, g); // Leg0 leg0->setPos(-1.9, 12 + yOffset, 0); leg1->addHumanoidBox(-2, 0, -2, 4, 12, 4, g); // Leg1 leg1->setPos(1.9, 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); if (jacket != 0) jacket->compile(1.0f/16.0f); if (sleeve0 != 0) sleeve0->compile(1.0f/16.0f); if (sleeve1 != 0) sleeve1->compile(1.0f/16.0f); if (pants0 != 0) pants0->compile(1.0f/16.0f); if (pants1 != 0) pants1->compile(1.0f/16.0f); if (waist != 0) waist->compile(1.0f/16.0f); if (belt != 0) belt->compile(1.0f/16.0f); if (bodyArmor != 0) bodyArmor->compile(1.0f/16.0f); if (armArmor0 != 0) armArmor0->compile(1.0f/16.0f); if (armArmor1 != 0) armArmor1->compile(1.0f/16.0f); if (legging0 != 0) legging0->compile(1.0f/16.0f); if (legging1 != 0) legging1->compile(1.0f/16.0f); if (sock0 != 0) sock0->compile(1.0f/16.0f); if (sock1 != 0) sock1->compile(1.0f/16.0f); if (boot0 != 0) boot0->compile(1.0f/16.0f); if (boot1 != 0) boot1->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; m_isArmor = isArmor; } HumanoidModel::HumanoidModel() : Model() { _init(0, 0, 64, 32, false, false); } HumanoidModel::HumanoidModel(float g) : Model() { _init(g, 0, 64, 32, false, false); } HumanoidModel::HumanoidModel(float g, bool isArmor) : Model() { _init(g, 0, 64, 32, false, isArmor); } HumanoidModel::HumanoidModel(float g, float yOffset, int texWidth, int texHeight) : Model() { _init(g,yOffset,texWidth,texHeight, false, false); } HumanoidModel::HumanoidModel(float g, float yOffset, int texWidth, int texHeight, bool slim) : Model() { _init(g,yOffset,texWidth,texHeight, slim, false); } void HumanoidModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) { if(entity != nullptr) { m_uiAnimOverrideBitmask=entity->getAnimOverrideBitmask(); } setupAnim(time, r, bob, yRot, xRot, scale, entity, m_uiAnimOverrideBitmask); 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); glPopMatrix(); glPushMatrix(); glScalef(1 / ss, 1 / ss, 1 / ss); glTranslatef(0, 24 * scale, 0); body->render(scale, usecompiled); arm0->render(scale, usecompiled); arm1->render(scale, usecompiled); leg0->render(scale, usecompiled); leg1->render(scale, usecompiled); hair->render(scale, usecompiled); glPopMatrix(); } else { shared_ptr player = dynamic_pointer_cast(entity); vector headOffsets = {0, 0, 0}; vector bodyOffsets = {0, 0, 0}; vector arm0Offsets = {0, 0, 0}; vector arm1Offsets = {0, 0, 0}; vector leg0Offsets = {0, 0, 0}; vector leg1Offsets = {0, 0, 0}; vector* pModelOffsets = nullptr; if (player != nullptr) pModelOffsets = player->GetModelOffsets(); 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<0&&(!(m_uiAnimOverrideBitmask&(1<0||!m_isArmor)); glPopMatrix(); glPushMatrix(); glTranslatef(bodyOffsets[0], bodyOffsets[1], bodyOffsets[2]); body->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0&&(!(m_uiAnimOverrideBitmask&(1<0||!m_isArmor)); glPopMatrix(); glPushMatrix(); glTranslatef(arm0Offsets[0], arm0Offsets[1], arm0Offsets[2]); arm0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0&&(!(m_uiAnimOverrideBitmask&(1<0||!m_isArmor)); glPopMatrix(); glPushMatrix(); glTranslatef(arm1Offsets[0], arm1Offsets[1], arm1Offsets[2]); arm1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0&&(!(m_uiAnimOverrideBitmask&(1<0||!m_isArmor)); glPopMatrix(); glPushMatrix(); glTranslatef(leg0Offsets[0], leg0Offsets[1], leg0Offsets[2]); leg0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0&&(!(m_uiAnimOverrideBitmask&(1<0||!m_isArmor)); glPopMatrix(); glPushMatrix(); glTranslatef(leg1Offsets[0], leg1Offsets[1], leg1Offsets[2]); leg1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0&&(!(m_uiAnimOverrideBitmask&(1<0||!m_isArmor)); glPopMatrix(); glPushMatrix(); glTranslatef(headOffsets[0], headOffsets[1], headOffsets[2]); hair->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); glPopMatrix(); if (jacket != 0) { glPushMatrix(); glTranslatef(bodyOffsets[0], bodyOffsets[1], bodyOffsets[2]); jacket->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); glPopMatrix(); } if (sleeve0 != 0) { glPushMatrix(); glTranslatef(arm0Offsets[0], arm0Offsets[1], arm0Offsets[2]); sleeve0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); glPopMatrix(); } if (sleeve1 != 0) { glPushMatrix(); glTranslatef(arm1Offsets[0], arm1Offsets[1], arm1Offsets[2]); sleeve1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); glPopMatrix(); } if (pants0 != 0) { glPushMatrix(); glTranslatef(leg0Offsets[0], leg0Offsets[1], leg0Offsets[2]); pants0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); glPopMatrix(); } if (pants1 != 0) { glPushMatrix(); glTranslatef(leg0Offsets[0], leg0Offsets[1], leg0Offsets[2]); pants1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); glPopMatrix(); } if (waist != 0) waist->render(scale, usecompiled); if (belt != 0) { glPushMatrix(); glTranslatef(bodyOffsets[0], bodyOffsets[1], bodyOffsets[2]); belt->render(scale, usecompiled); glPopMatrix(); } if (bodyArmor != 0) { glPushMatrix(); glTranslatef(bodyOffsets[0], bodyOffsets[1], bodyOffsets[2]); bodyArmor->render(scale, usecompiled); glPopMatrix(); } if (armArmor0 != 0) { glPushMatrix(); glTranslatef(arm0Offsets[0], arm0Offsets[1], arm0Offsets[2]); armArmor0->render(scale, usecompiled); glPopMatrix(); } if (armArmor1 != 0) { glPushMatrix(); glTranslatef(arm1Offsets[0], arm1Offsets[1], arm1Offsets[2]); armArmor1->render(scale, usecompiled); glPopMatrix(); } if (legging0 != 0) { glPushMatrix(); glTranslatef(leg0Offsets[0], leg0Offsets[1], leg0Offsets[2]); legging0->render(scale, usecompiled); glPopMatrix(); } if (legging1 != 0) { glPushMatrix(); glTranslatef(leg1Offsets[0], leg1Offsets[1], leg1Offsets[2]); legging1->render(scale, usecompiled); glPopMatrix(); } if (sock0 != 0) sock0->render(scale, usecompiled); if (sock1 != 0) sock1->render(scale, usecompiled); if (boot0 != 0) { glPushMatrix(); glTranslatef(leg0Offsets[0], leg0Offsets[1], leg0Offsets[2]); boot0->render(scale, usecompiled); glPopMatrix(); } if (boot1 != 0) { glPushMatrix(); glTranslatef(leg1Offsets[0], leg1Offsets[1], leg1Offsets[2]); boot1->render(scale, usecompiled); glPopMatrix(); } } } // 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 *modelOffsets) { setupAnim(time, r, bob, yRot, xRot, scale, nullptr, m_uiAnimOverrideBitmask); vector headOffsets = {0, 0, 0}; vector bodyOffsets = {0, 0, 0}; vector arm0Offsets = {0, 0, 0}; vector arm1Offsets = {0, 0, 0}; vector leg0Offsets = {0, 0, 0}; vector leg1Offsets = {0, 0, 0}; vector* 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<0&&(!(m_uiAnimOverrideBitmask&(1<0||!m_isArmor)); glPopMatrix(); glPushMatrix(); glTranslatef(bodyOffsets[0], bodyOffsets[1], bodyOffsets[2]); body->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0&&(!(m_uiAnimOverrideBitmask&(1<0||!m_isArmor)); glPopMatrix(); glPushMatrix(); glTranslatef(arm0Offsets[0], arm0Offsets[1], arm0Offsets[2]); arm0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0&&(!(m_uiAnimOverrideBitmask&(1<0||!m_isArmor)); glPopMatrix(); glPushMatrix(); glTranslatef(arm1Offsets[0], arm1Offsets[1], arm1Offsets[2]); arm1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0&&(!(m_uiAnimOverrideBitmask&(1<0||!m_isArmor)); glPopMatrix(); glPushMatrix(); glTranslatef(leg0Offsets[0], leg0Offsets[1], leg0Offsets[2]); leg0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0&&(!(m_uiAnimOverrideBitmask&(1<0||!m_isArmor)); glPopMatrix(); glPushMatrix(); glTranslatef(leg1Offsets[0], leg1Offsets[1], leg1Offsets[2]); leg1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0&&(!(m_uiAnimOverrideBitmask&(1<0||!m_isArmor)); glPopMatrix(); glPushMatrix(); glTranslatef(headOffsets[0], headOffsets[1], headOffsets[2]); hair->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); glPopMatrix(); if (jacket != 0) { glPushMatrix(); glTranslatef(bodyOffsets[0], bodyOffsets[1], bodyOffsets[2]); jacket->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); glPopMatrix(); } if (sleeve0 != 0) { glPushMatrix(); glTranslatef(arm0Offsets[0], arm0Offsets[1], arm0Offsets[2]); sleeve0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); glPopMatrix(); } if (sleeve1 != 0) { glPushMatrix(); glTranslatef(arm1Offsets[0], arm1Offsets[1], arm1Offsets[2]); sleeve1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); glPopMatrix(); } if (pants0 != 0) { glPushMatrix(); glTranslatef(leg0Offsets[0], leg0Offsets[1], leg0Offsets[2]); pants0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); glPopMatrix(); } if (pants1 != 0) { glPushMatrix(); glTranslatef(leg0Offsets[0], leg0Offsets[1], leg0Offsets[2]); pants1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); glPopMatrix(); } if (waist != 0) waist->render(scale, usecompiled); if (belt != 0) { glPushMatrix(); glTranslatef(bodyOffsets[0], bodyOffsets[1], bodyOffsets[2]); belt->render(scale, usecompiled); glPopMatrix(); } if (bodyArmor != 0) { glPushMatrix(); glTranslatef(bodyOffsets[0], bodyOffsets[1], bodyOffsets[2]); bodyArmor->render(scale, usecompiled); glPopMatrix(); } if (armArmor0 != 0) { glPushMatrix(); glTranslatef(arm0Offsets[0], arm0Offsets[1], arm0Offsets[2]); armArmor0->render(scale, usecompiled); glPopMatrix(); } if (armArmor1 != 0) { glPushMatrix(); glTranslatef(arm1Offsets[0], arm1Offsets[1], arm1Offsets[2]); armArmor1->render(scale, usecompiled); glPopMatrix(); } if (legging0 != 0) { glPushMatrix(); glTranslatef(leg0Offsets[0], leg0Offsets[1], leg0Offsets[2]); legging0->render(scale, usecompiled); glPopMatrix(); } if (legging1 != 0) { glPushMatrix(); glTranslatef(leg1Offsets[0], leg1Offsets[1], leg1Offsets[2]); legging1->render(scale, usecompiled); glPopMatrix(); } if (sock0 != 0) sock0->render(scale, usecompiled); if (sock1 != 0) sock1->render(scale, usecompiled); if (boot0 != 0) { glPushMatrix(); glTranslatef(leg0Offsets[0], leg0Offsets[1], leg0Offsets[2]); boot0->render(scale, usecompiled); glPopMatrix(); } if (boot1 != 0) { glPushMatrix(); glTranslatef(leg1Offsets[0], leg1Offsets[1], leg1Offsets[2]); boot1->render(scale, usecompiled); glPopMatrix(); } } 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); { /* Code to get armor offsets, not fully implemented yet. Directly applying the offsets causes the armor pivot points to not aline with the player model pivot points. Some math is requied to properly rotate the armor pivot points around the player model pivot points - Langtanium*/ vector headOffsets = {0, 0, 0}; vector bodyOffsets = {0, 0, 0}; vector arm0Offsets = {0, 0, 0}; vector arm1Offsets = {0, 0, 0}; vector leg0Offsets = {0, 0, 0}; vector leg1Offsets = {0, 0, 0}; if (m_isArmor) { shared_ptr player = dynamic_pointer_cast(entity); vector* pModelOffsets = nullptr; if (player != nullptr) pModelOffsets = player->GetModelOffsets(); if (pModelOffsets != nullptr) { for( SKIN_OFFSET *pModelOffset : *pModelOffsets ) { switch (pModelOffset->ePart) { case eBodyOffset_Helmet: if(pModelOffset->fD == 1) headOffsets[0] += pModelOffset->fO; else if(pModelOffset->fD == 2) headOffsets[1] += pModelOffset->fO; else if(pModelOffset->fD == 3) headOffsets[2] += pModelOffset->fO; case eBodyOffset_Belt: if (!body->isArmorPart1) { if(pModelOffset->fD == 1) bodyOffsets[0] += pModelOffset->fO; else if(pModelOffset->fD == 2) bodyOffsets[1] += pModelOffset->fO; else if(pModelOffset->fD == 3) bodyOffsets[2] += pModelOffset->fO; } break; case eBodyOffset_BodyArmor: if (body->isArmorPart1) { if(pModelOffset->fD == 1) bodyOffsets[0] += pModelOffset->fO; else if(pModelOffset->fD == 2) bodyOffsets[1] += pModelOffset->fO; else if(pModelOffset->fD == 3) bodyOffsets[2] += pModelOffset->fO; } break; case eBodyOffset_ArmArmor0: if(pModelOffset->fD == 1) arm0Offsets[0] += pModelOffset->fO; else if(pModelOffset->fD == 2) arm0Offsets[1] += pModelOffset->fO; else if(pModelOffset->fD == 3) arm0Offsets[2] += pModelOffset->fO; break; case eBodyOffset_ArmArmor1: if(pModelOffset->fD == 1) arm1Offsets[0] += pModelOffset->fO; else if(pModelOffset->fD == 2) arm1Offsets[1] += pModelOffset->fO; else if(pModelOffset->fD == 3) arm1Offsets[2] += pModelOffset->fO; break; case eBodyOffset_Boot0: if (leg0->isArmorPart1) { if(pModelOffset->fD == 1) leg0Offsets[0] += pModelOffset->fO; else if(pModelOffset->fD == 2) leg0Offsets[1] += pModelOffset->fO; else if(pModelOffset->fD == 3) leg0Offsets[2] += pModelOffset->fO; } break; case eBodyOffset_Boot1: if (leg1->isArmorPart1) { if(pModelOffset->fD == 1) leg1Offsets[0] += pModelOffset->fO; else if(pModelOffset->fD == 2) leg1Offsets[1] += pModelOffset->fO; else if(pModelOffset->fD == 3) leg1Offsets[2] += pModelOffset->fO; } break; } } } } 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<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; 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; } 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; } 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; } } 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; /*if (m_isArmor) // If armor apply helmet offset using some math, needs to be refined - Langtanium { head->x = headOffsets[1] * sin(yRot / (float) (180.0f / PI)) * sin(xRot / (float) (180.0f / PI)); head->y = headOffsets[1] * cos(xRot / (float) (180.0f / PI)); head->z = headOffsets[1] * sin(xRot / (float) (180.0f / PI)) - headOffsets[1] * abs(sin(yRot / (float) (180.0f / PI))) * sin(xRot / (float) (180.0f / PI)); } else*/ 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); } if (jacket != 0) { jacket->x = body->x; jacket->y = body->y; jacket->z = body->z; jacket->xRot = body->xRot; jacket->yRot = body->yRot; } if (sleeve0 != 0) { sleeve0->x = arm0->x; sleeve0->y = arm0->y; sleeve0->z = arm0->z; sleeve0->xRot = arm0->xRot; sleeve0->yRot = arm0->yRot; sleeve0->zRot = arm0->zRot; } if (sleeve1 != 0) { sleeve1->x = arm1->x; sleeve1->y = arm1->y; sleeve1->z = arm1->z; sleeve1->xRot = arm1->xRot; sleeve1->yRot = arm1->yRot; sleeve1->zRot = arm1->zRot; } if (pants0 != 0) { pants0->x = leg0->x; pants0->y = leg0->y; pants0->z = leg0->z; pants0->xRot = leg0->xRot; pants0->yRot = leg0->yRot; pants0->zRot = leg0->zRot; } if (pants1 != 0) { pants1->x = leg1->x; pants1->y = leg1->y; pants1->z = leg1->z; pants1->xRot = leg1->xRot; pants1->yRot = leg1->yRot; pants1->zRot = leg1->zRot; } if (waist != 0) { waist->x = body->x; waist->y = body->y; waist->z = body->z; waist->xRot = body->xRot; waist->yRot = body->yRot; } if (belt != 0) { belt->x = body->x; belt->y = body->y; belt->z = body->z; belt->xRot = body->xRot; belt->yRot = body->yRot; } if (bodyArmor != 0) { bodyArmor->x = body->x; bodyArmor->y = body->y; bodyArmor->z = body->z; bodyArmor->xRot = body->xRot; bodyArmor->yRot = body->yRot; } if (armArmor0 != 0) { armArmor0->x = arm0->x; armArmor0->y = arm0->y; armArmor0->z = arm0->z; armArmor0->xRot = arm0->xRot; armArmor0->yRot = arm0->yRot; armArmor0->zRot = arm0->zRot; } if (armArmor1 != 0) { armArmor1->x = arm1->x; armArmor1->y = arm1->y; armArmor1->z = arm1->z; armArmor1->xRot = arm1->xRot; armArmor1->yRot = arm1->yRot; armArmor1->zRot = arm1->zRot; } if (legging0 != 0) { legging0->x = leg0->x; legging0->y = leg0->y; legging0->z = leg0->z; legging0->xRot = leg0->xRot; legging0->yRot = leg0->yRot; legging0->zRot = leg0->zRot; } if (legging1 != 0) { legging1->x = leg1->x; legging1->y = leg1->y; legging1->z = leg1->z; legging1->xRot = leg1->xRot; legging1->yRot = leg1->yRot; legging1->zRot = leg1->zRot; } if (sock0 != 0) { sock0->x = leg0->x; sock0->y = leg0->y; sock0->z = leg0->z; sock0->xRot = leg0->xRot; sock0->yRot = leg0->yRot; sock0->zRot = leg0->zRot; } if (sock1 != 0) { sock1->x = leg1->x; sock1->y = leg1->y; sock1->z = leg1->z; sock1->xRot = leg1->xRot; sock1->yRot = leg1->yRot; sock1->zRot = leg1->zRot; } if (boot0 != 0) { boot0->x = leg0->x; boot0->y = leg0->y; boot0->z = leg0->z; boot0->xRot = leg0->xRot; boot0->yRot = leg0->yRot; boot0->zRot = leg0->zRot; } if (boot1 != 0) { boot1->x = leg1->x; boot1->y = leg1->y; boot1->z = leg1->z; boot1->xRot = leg1->xRot; boot1->yRot = leg1->yRot; boot1->zRot = leg1->zRot; } } } void HumanoidModel::renderHair(float scale,bool usecompiled) { hair->yRot = head->yRot; hair->xRot = head->xRot; hair->render(scale,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); } void HumanoidModel::renderCloak(float scale,bool usecompiled) { cloak->render(scale,usecompiled); } 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->yRot = model->body->yRot; if (jacket != 0) jacket->yRot = model->body->yRot; arm0->xRot = model->arm0->xRot; arm0->yRot = model->arm0->yRot; arm0->zRot = model->arm0->zRot; if (sleeve0 != 0) { sleeve0->xRot = model->arm0->xRot; sleeve0->yRot = model->arm0->yRot; sleeve0->zRot = model->arm0->zRot; } arm1->xRot = model->arm1->xRot; arm1->yRot = model->arm1->yRot; arm1->zRot = model->arm1->zRot; if (sleeve1 != 0) { sleeve1->xRot = model->arm1->xRot; sleeve1->yRot = model->arm1->yRot; sleeve1->zRot = model->arm1->zRot; } leg0->xRot = model->leg0->xRot; if (pants0 != 0) pants0->xRot = model->leg0->xRot; leg1->xRot = model->leg1->xRot; if (pants1 != 0) pants1->xRot = model->leg1->xRot; 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); if (jacket != 0) jacket->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); if (sleeve0 != 0) sleeve0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); if (sleeve1 != 0) sleeve1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); if (pants0 != 0) pants0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); if (pants1 != 0) pants1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); }