diff options
| author | daoge <3523206925@qq.com> | 2026-03-03 03:04:10 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-03-03 03:04:10 +0800 |
| commit | b3feddfef372618c8a9d7a0abcaf18cfad866c18 (patch) | |
| tree | 267761c3bb39241ba5c347bfbe2254d06686e287 /Minecraft.Client/HumanoidMobRenderer.cpp | |
| parent | 84c31a2331f7a0ec85b9d438992e244f60e5020f (diff) | |
feat: TU19 (Dec 2014) Features & Content (#155)
* try to resolve merge conflict
* feat: TU19 (Dec 2014) Features & Content (#32)
* December 2014 files
* Working release build
* Fix compilation issues
* Add sound to Windows64Media
* Add DLC content and force Tutorial DLC
* Revert "Add DLC content and force Tutorial DLC"
This reverts commit 97a43994725008e35fceb984d5549df9c8cea470.
* Disable broken light packing
* Disable breakpoint during DLC texture map load
Allows DLC loading but the DLC textures are still broken
* Fix post build not working
* ...
* fix vs2022 build
* fix cmake build
---------
Co-authored-by: Loki <lokirautio@gmail.com>
Diffstat (limited to 'Minecraft.Client/HumanoidMobRenderer.cpp')
| -rw-r--r-- | Minecraft.Client/HumanoidMobRenderer.cpp | 208 |
1 files changed, 176 insertions, 32 deletions
diff --git a/Minecraft.Client/HumanoidMobRenderer.cpp b/Minecraft.Client/HumanoidMobRenderer.cpp index 389116ed..a9ff25c4 100644 --- a/Minecraft.Client/HumanoidMobRenderer.cpp +++ b/Minecraft.Client/HumanoidMobRenderer.cpp @@ -10,12 +10,17 @@ #include "..\Minecraft.World\net.minecraft.world.entity.monster.h" #include "..\Minecraft.World\net.minecraft.h" +const wstring HumanoidMobRenderer::MATERIAL_NAMES[5] = { L"cloth", L"chain", L"iron", L"diamond", L"gold" }; +std::map<wstring, ResourceLocation> HumanoidMobRenderer::ARMOR_LOCATION_CACHE; + void HumanoidMobRenderer::_init(HumanoidModel *humanoidModel, float scale) { this->humanoidModel = humanoidModel; this->_scale = scale; armorParts1 = NULL; armorParts2 = NULL; + + createArmorParts(); } HumanoidMobRenderer::HumanoidMobRenderer(HumanoidModel *humanoidModel, float shadow) : MobRenderer(humanoidModel, shadow) @@ -26,8 +31,61 @@ HumanoidMobRenderer::HumanoidMobRenderer(HumanoidModel *humanoidModel, float sha HumanoidMobRenderer::HumanoidMobRenderer(HumanoidModel *humanoidModel, float shadow, float scale) : MobRenderer(humanoidModel, shadow) { _init(humanoidModel, scale); +} - createArmorParts(); +ResourceLocation *HumanoidMobRenderer::getArmorLocation(ArmorItem *armorItem, int layer) +{ + return getArmorLocation(armorItem, layer, false); +} + +ResourceLocation *HumanoidMobRenderer::getArmorLocation(ArmorItem *armorItem, int layer, bool overlay) +{ + switch(armorItem->modelIndex) + { + case 0: + break; + case 1: + break; + case 2: + break; + case 3: + break; + case 4: + break; + }; + wstring path = wstring(L"armor/" + MATERIAL_NAMES[armorItem->modelIndex]).append(L"_").append(_toString<int>(layer == 2 ? 2 : 1)).append((overlay ? L"_b" :L"")).append(L".png"); + + std::map<wstring, ResourceLocation>::iterator it = ARMOR_LOCATION_CACHE.find(path); + + ResourceLocation *location; + if (it != ARMOR_LOCATION_CACHE.end()) + { + location = &it->second; + } + else + { + ARMOR_LOCATION_CACHE.insert(std::pair<wstring, ResourceLocation>(path, ResourceLocation(path))); + + it = ARMOR_LOCATION_CACHE.find(path); + location = &it->second; + } + + return location; +} + +void HumanoidMobRenderer::prepareSecondPassArmor(shared_ptr<LivingEntity> mob, int layer, float a) +{ + shared_ptr<ItemInstance> itemInstance = mob->getArmor(3 - layer); + if (itemInstance != NULL) { + Item *item = itemInstance->getItem(); + if (dynamic_cast<ArmorItem *>(item) != NULL) + { + bindTexture(getArmorLocation(dynamic_cast<ArmorItem *>(item), layer, true)); + + float brightness = SharedConstants::TEXTURE_LIGHTING ? 1 : mob->getBrightness(a); + glColor3f(brightness, brightness, brightness); + } + } } void HumanoidMobRenderer::createArmorParts() @@ -36,11 +94,97 @@ void HumanoidMobRenderer::createArmorParts() armorParts2 = new HumanoidModel(0.5f); } -void HumanoidMobRenderer::additionalRendering(shared_ptr<Mob> mob, float a) +int HumanoidMobRenderer::prepareArmor(shared_ptr<LivingEntity> _mob, int layer, float a) +{ + shared_ptr<LivingEntity> mob = dynamic_pointer_cast<LivingEntity>(_mob); + + shared_ptr<ItemInstance> itemInstance = mob->getArmor(3 - layer); + if (itemInstance != NULL) + { + Item *item = itemInstance->getItem(); + if (dynamic_cast<ArmorItem *>(item) != NULL) + { + ArmorItem *armorItem = dynamic_cast<ArmorItem *>(item); + bindTexture(getArmorLocation(armorItem, layer)); + + HumanoidModel *armor = layer == 2 ? armorParts2 : armorParts1; + + armor->head->visible = layer == 0; + armor->hair->visible = layer == 0; + armor->body->visible = layer == 1 || layer == 2; + armor->arm0->visible = layer == 1; + armor->arm1->visible = layer == 1; + armor->leg0->visible = layer == 2 || layer == 3; + armor->leg1->visible = layer == 2 || layer == 3; + + setArmor(armor); + armor->attackTime = model->attackTime; + armor->riding = model->riding; + armor->young = model->young; + + float brightness = SharedConstants::TEXTURE_LIGHTING ? 1 : mob->getBrightness(a); + if (armorItem->getMaterial() == ArmorItem::ArmorMaterial::CLOTH) + { + int color = armorItem->getColor(itemInstance); + float red = (float) ((color >> 16) & 0xFF) / 0xFF; + float green = (float) ((color >> 8) & 0xFF) / 0xFF; + float blue = (float) (color & 0xFF) / 0xFF; + glColor3f(brightness * red, brightness * green, brightness * blue); + + if (itemInstance->isEnchanted()) return 0x1f; + return 0x10; + + } + else + { + glColor3f(brightness, brightness, brightness); + } + + if (itemInstance->isEnchanted()) return 15; + + return 1; + } + } + return -1; +} + +void HumanoidMobRenderer::render(shared_ptr<Entity> _mob, double x, double y, double z, float rot, float a) { + shared_ptr<LivingEntity> mob = dynamic_pointer_cast<LivingEntity>(_mob); + float brightness = SharedConstants::TEXTURE_LIGHTING ? 1 : mob->getBrightness(a); glColor3f(brightness, brightness, brightness); - shared_ptr<ItemInstance> item = mob->getCarriedItem(); + shared_ptr<ItemInstance> item = mob->getCarriedItem(); + + prepareCarriedItem(mob, item); + + double yp = y - mob->heightOffset; + if (mob->isSneaking()) { + yp -= 2 / 16.0f; + } + MobRenderer::render(mob, x, yp, z, rot, a); + armorParts1->bowAndArrow = armorParts2->bowAndArrow = humanoidModel->bowAndArrow = false; + armorParts1->sneaking = armorParts2->sneaking = humanoidModel->sneaking = false; + armorParts1->holdingRightHand = armorParts2->holdingRightHand = humanoidModel->holdingRightHand = 0; +} + +ResourceLocation *HumanoidMobRenderer::getTextureLocation(shared_ptr<Entity> mob) +{ + // TODO -- Figure out of we need some data in here + return NULL; +} + +void HumanoidMobRenderer::prepareCarriedItem(shared_ptr<Entity> mob, shared_ptr<ItemInstance> item) +{ + armorParts1->holdingRightHand = armorParts2->holdingRightHand = humanoidModel->holdingRightHand = item != NULL ? 1 : 0; + armorParts1->sneaking = armorParts2->sneaking = humanoidModel->sneaking = mob->isSneaking(); +} + +void HumanoidMobRenderer::additionalRendering(shared_ptr<LivingEntity> mob, float a) +{ + float brightness = SharedConstants::TEXTURE_LIGHTING ? 1 : mob->getBrightness(a); + glColor3f(brightness, brightness, brightness); + shared_ptr<ItemInstance> item = mob->getCarriedItem(); shared_ptr<ItemInstance> headGear = mob->getArmor(3); if (headGear != NULL) @@ -82,9 +226,9 @@ void HumanoidMobRenderer::additionalRendering(shared_ptr<Mob> mob, float a) } } - if (item != NULL) + if (item != NULL) { - glPushMatrix(); + glPushMatrix(); if (model->young) { @@ -94,18 +238,18 @@ void HumanoidMobRenderer::additionalRendering(shared_ptr<Mob> mob, float a) glScalef(s, s, s); } - humanoidModel->arm0->translateTo(1 / 16.0f); - glTranslatef(-1 / 16.0f, 7 / 16.0f, 1 / 16.0f); + humanoidModel->arm0->translateTo(1 / 16.0f); + glTranslatef(-1 / 16.0f, 7 / 16.0f, 1 / 16.0f); - if (item->id < 256 && TileRenderer::canRender(Tile::tiles[item->id]->getRenderShape())) + if (item->id < 256 && TileRenderer::canRender(Tile::tiles[item->id]->getRenderShape())) { - float s = 8 / 16.0f; - glTranslatef(-0 / 16.0f, 3 / 16.0f, -5 / 16.0f); - s *= 0.75f; - glRotatef(20, 1, 0, 0); - glRotatef(45, 0, 1, 0); - glScalef(-s, -s, s); - } + float s = 8 / 16.0f; + glTranslatef(-0 / 16.0f, 3 / 16.0f, -5 / 16.0f); + s *= 0.75f; + glRotatef(20, 1, 0, 0); + glRotatef(45, 0, 1, 0); + glScalef(-s, -s, s); + } else if (item->id == Item::bow_Id) { float s = 10 / 16.0f; @@ -117,34 +261,34 @@ void HumanoidMobRenderer::additionalRendering(shared_ptr<Mob> mob, float a) } else if (Item::items[item->id]->isHandEquipped()) { - float s = 10 / 16.0f; - glTranslatef(0, 3 / 16.0f, 0); - glScalef(s, -s, s); - glRotatef(-100, 1, 0, 0); - glRotatef(45, 0, 1, 0); - } + float s = 10 / 16.0f; + glTranslatef(0, 3 / 16.0f, 0); + glScalef(s, -s, s); + glRotatef(-100, 1, 0, 0); + glRotatef(45, 0, 1, 0); + } else { - float s = 6 / 16.0f; - glTranslatef(+4 / 16.0f, +3 / 16.0f, -3 / 16.0f); - glScalef(s, s, s); - glRotatef(60, 0, 0, 1); - glRotatef(-90, 1, 0, 0); - glRotatef(20, 0, 0, 1); - } + float s = 6 / 16.0f; + glTranslatef(+4 / 16.0f, +3 / 16.0f, -3 / 16.0f); + glScalef(s, s, s); + glRotatef(60, 0, 0, 1); + glRotatef(-90, 1, 0, 0); + glRotatef(20, 0, 0, 1); + } this->entityRenderDispatcher->itemInHandRenderer->renderItem(mob, item, 0); if (item->getItem()->hasMultipleSpriteLayers()) { this->entityRenderDispatcher->itemInHandRenderer->renderItem(mob, item, 1); } - - glPopMatrix(); - } + + glPopMatrix(); + } } -void HumanoidMobRenderer::scale(shared_ptr<Mob> mob, float a) +void HumanoidMobRenderer::scale(shared_ptr<LivingEntity> mob, float a) { glScalef(_scale, _scale, _scale); }
\ No newline at end of file |
