Added more skin offset code

Added another offset enum for the helmet offset, fixed renderUIOffset() function not rendering skins that didn't have an offset, and added more code for offsets.
This commit is contained in:
Langtanium 2026-04-21 12:26:24 -07:00
parent cef65c8df3
commit e0cf6f23c1
4 changed files with 281 additions and 128 deletions

View file

@ -402,85 +402,54 @@ void HumanoidModel::render(shared_ptr<Entity> entity, float time, float r, float
{
case eBodyOffset_Head:
if(pModelOffset->fD == 1)
headOffsets[0] = pModelOffset->fO / 16.0f;
headOffsets[0] += pModelOffset->fO / 16.0f;
else if(pModelOffset->fD == 2)
headOffsets[1] = pModelOffset->fO / 16.0f;
headOffsets[1] += pModelOffset->fO / 16.0f;
else if(pModelOffset->fD == 3)
headOffsets[2] = pModelOffset->fO / 16.0f;
headOffsets[2] += pModelOffset->fO / 16.0f;
break;
case eBodyOffset_Body:
if(pModelOffset->fD == 1)
bodyOffsets[0] = pModelOffset->fO / 16.0f;
bodyOffsets[0] += pModelOffset->fO / 16.0f;
else if(pModelOffset->fD == 2)
bodyOffsets[1] = pModelOffset->fO / 16.0f;
bodyOffsets[1] += pModelOffset->fO / 16.0f;
else if(pModelOffset->fD == 3)
bodyOffsets[2] = pModelOffset->fO / 16.0f;
bodyOffsets[2] += pModelOffset->fO / 16.0f;
break;
case eBodyOffset_Arm0:
if(pModelOffset->fD == 1)
arm0Offsets[0] = pModelOffset->fO / 16.0f;
arm0Offsets[0] += pModelOffset->fO / 16.0f;
else if(pModelOffset->fD == 2)
arm0Offsets[1] = pModelOffset->fO / 16.0f;
arm0Offsets[1] += pModelOffset->fO / 16.0f;
else if(pModelOffset->fD == 3)
arm0Offsets[2] = pModelOffset->fO / 16.0f;
arm0Offsets[2] += pModelOffset->fO / 16.0f;
break;
case eBodyOffset_Arm1:
if(pModelOffset->fD == 1)
arm1Offsets[0] = pModelOffset->fO / 16.0f;
arm1Offsets[0] += pModelOffset->fO / 16.0f;
else if(pModelOffset->fD == 2)
arm1Offsets[1] = pModelOffset->fO / 16.0f;
arm1Offsets[1] += pModelOffset->fO / 16.0f;
else if(pModelOffset->fD == 3)
arm1Offsets[2] = pModelOffset->fO / 16.0f;
arm1Offsets[2] += pModelOffset->fO / 16.0f;
break;
case eBodyOffset_Leg0:
if(pModelOffset->fD == 1)
leg0Offsets[0] = pModelOffset->fO / 16.0f;
leg0Offsets[0] += pModelOffset->fO / 16.0f;
else if(pModelOffset->fD == 2)
leg0Offsets[1] = pModelOffset->fO / 16.0f;
leg0Offsets[1] += pModelOffset->fO / 16.0f;
else if(pModelOffset->fD == 3)
leg0Offsets[2] = pModelOffset->fO / 16.0f;
leg0Offsets[2] += pModelOffset->fO / 16.0f;
break;
case eBodyOffset_Leg1:
if(pModelOffset->fD == 1)
leg1Offsets[0] = pModelOffset->fO / 16.0f;
leg1Offsets[0] += pModelOffset->fO / 16.0f;
else if(pModelOffset->fD == 2)
leg1Offsets[1] = pModelOffset->fO / 16.0f;
leg1Offsets[1] += pModelOffset->fO / 16.0f;
else if(pModelOffset->fD == 3)
leg1Offsets[2] = pModelOffset->fO / 16.0f;
leg1Offsets[2] += pModelOffset->fO / 16.0f;
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();
@ -549,25 +518,65 @@ void HumanoidModel::render(shared_ptr<Entity> entity, float time, float r, float
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();
}
}
}
@ -641,93 +650,134 @@ void HumanoidModel::renderUIOffset(float time, float r, float bob, float yRot, f
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(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]);
body->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderTorso))>0&&(!(m_uiAnimOverrideBitmask&(1<<eAnim_RenderArmorTorso))>0||!m_isArmor));
jacket->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderJacket))>0);
glPopMatrix();
}
if (sleeve0 != 0)
{
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));
sleeve0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderSleeve0))>0);
glPopMatrix();
}
if (sleeve1 != 0)
{
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));
sleeve1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderSleeve1))>0);
glPopMatrix();
}
if (pants0 != 0)
{
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));
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)
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]);
leg1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderLeg1))>0&&(!(m_uiAnimOverrideBitmask&(1<<eAnim_RenderArmorLeg1))>0||!m_isArmor));
legging1->render(scale, usecompiled);
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)
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);
}
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> entity, unsigned int uiBitmaskOverrideAnim)
@ -735,6 +785,99 @@ void HumanoidModel::setupAnim(float time, float r, float bob, float yRot, float
//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<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};
if (m_isArmor)
{
shared_ptr<Player> player = dynamic_pointer_cast<Player>(entity);
vector<SKIN_OFFSET *>* 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;
@ -959,6 +1102,13 @@ void HumanoidModel::setupAnim(float time, float r, float bob, float yRot, float
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;
@ -998,7 +1148,6 @@ void HumanoidModel::setupAnim(float time, float r, float bob, float yRot, float
jacket->z = body->z;
jacket->xRot = body->xRot;
jacket->yRot = body->yRot;
jacket->zRot = body->zRot;
}
if (sleeve0 != 0)
{
@ -1043,7 +1192,6 @@ void HumanoidModel::setupAnim(float time, float r, float bob, float yRot, float
waist->z = body->z;
waist->xRot = body->xRot;
waist->yRot = body->yRot;
waist->zRot = body->zRot;
}
if (belt != 0)
{
@ -1052,7 +1200,6 @@ void HumanoidModel::setupAnim(float time, float r, float bob, float yRot, float
belt->z = body->z;
belt->xRot = body->xRot;
belt->yRot = body->yRot;
belt->zRot = body->zRot;
}
if (bodyArmor != 0)
{
@ -1061,7 +1208,6 @@ void HumanoidModel::setupAnim(float time, float r, float bob, float yRot, float
bodyArmor->z = body->z;
bodyArmor->xRot = body->xRot;
bodyArmor->yRot = body->yRot;
bodyArmor->zRot = body->zRot;
}
if (armArmor0 != 0)
{
@ -1178,18 +1324,22 @@ void HumanoidModel::render(HumanoidModel *model, float scale, bool usecompiled)
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)