From b40530fa5e12bdd0e2d03686b111964f9c5b3359 Mon Sep 17 00:00:00 2001 From: Langtanium <94726057+Langtanium@users.noreply.github.com> Date: Wed, 15 Apr 2026 19:59:46 -0700 Subject: [PATCH] Implemented skin offsets in UI Added code to render skin offsets in the skin select UI. --- .../Common/UI/UIControl_PlayerSkinPreview.cpp | 2 +- Minecraft.Client/HumanoidModel.cpp | 112 +++++++++--------- Minecraft.Client/HumanoidModel.h | 2 +- 3 files changed, 59 insertions(+), 57 deletions(-) diff --git a/Minecraft.Client/Common/UI/UIControl_PlayerSkinPreview.cpp b/Minecraft.Client/Common/UI/UIControl_PlayerSkinPreview.cpp index 1d5947a3..c2a2edf7 100644 --- a/Minecraft.Client/Common/UI/UIControl_PlayerSkinPreview.cpp +++ b/Minecraft.Client/Common/UI/UIControl_PlayerSkinPreview.cpp @@ -366,7 +366,7 @@ void UIControl_PlayerSkinPreview::render(EntityRenderer *renderer, double x, dou glEnable(GL_ALPHA_TEST); //model->prepareMobModel(mob, wp, ws, a); - model->render(nullptr, wp, ws, bob, headRot - bodyRot, headRotx, _scale, true); + model->render(nullptr, wp, ws, bob, headRot - bodyRot, headRotx, _scale, true, m_pvModelOffsets); /*for (int i = 0; i < MAX_ARMOR_LAYERS; i++) { if (prepareArmor(mob, i, a)) diff --git a/Minecraft.Client/HumanoidModel.cpp b/Minecraft.Client/HumanoidModel.cpp index 1e60e5e4..7610c9d4 100644 --- a/Minecraft.Client/HumanoidModel.cpp +++ b/Minecraft.Client/HumanoidModel.cpp @@ -355,7 +355,7 @@ HumanoidModel::HumanoidModel(float g, float yOffset, int texWidth, int texHeight _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) +void HumanoidModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled, vector *modelOffsets) { if(entity != nullptr) { @@ -392,67 +392,69 @@ void HumanoidModel::render(shared_ptr entity, float time, float r, float vector arm1Offsets = {0, 0, 0}; vector leg0Offsets = {0, 0, 0}; vector leg1Offsets = {0, 0, 0}; + vector* pModelOffsets = nullptr; if (player != nullptr) + pModelOffsets = player->GetModelOffsets(); + else if (modelOffsets != nullptr) + pModelOffsets = modelOffsets; + if (pModelOffsets != nullptr) { - vector* pModelOffsets=player->GetModelOffsets(); - if (pModelOffsets != nullptr) + for( SKIN_OFFSET *pModelOffset : *pModelOffsets ) { - for( SKIN_OFFSET *pModelOffset : *pModelOffsets ) + switch (pModelOffset->ePart) { - switch (pModelOffset->ePart) - { - case eBodyOffset_Head: - 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; - break; - case eBodyOffset_Body: - 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_Arm0: - 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_Arm1: - 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_Leg0: - 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_Leg1: - 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; - } + case eBodyOffset_Head: + 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; + break; + case eBodyOffset_Body: + 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_Arm0: + 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_Arm1: + 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_Leg0: + 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_Leg1: + 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; } } } + glPushMatrix(); glTranslatef(headOffsets[0]/16.0f, headOffsets[1]/16.0f, headOffsets[2]/16.0f); head->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0&&(!(m_uiAnimOverrideBitmask&(1<0||!m_isArmor)); diff --git a/Minecraft.Client/HumanoidModel.h b/Minecraft.Client/HumanoidModel.h index d46a8ea4..99c821f4 100644 --- a/Minecraft.Client/HumanoidModel.h +++ b/Minecraft.Client/HumanoidModel.h @@ -83,7 +83,7 @@ public: HumanoidModel(float g, bool isArmor); HumanoidModel(float g, float yOffset, int texWidth, int texHeight); HumanoidModel(float g, float yOffset, int texWidth, int texHeight, bool slim); - virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); + virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled, vector *modelOffsets = nullptr); virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim = 0); void renderHair(float scale, bool usecompiled); void renderEars(float scale, bool usecompiled);