the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
at main 294 lines 8.7 kB view raw
1#include "stdafx.h" 2#include "HumanoidMobRenderer.h" 3#include "SkullTileRenderer.h" 4#include "HumanoidModel.h" 5#include "ModelPart.h" 6#include "EntityRenderDispatcher.h" 7#include "..\Minecraft.World\net.minecraft.world.item.h" 8#include "..\Minecraft.World\net.minecraft.world.level.tile.h" 9#include "..\Minecraft.World\net.minecraft.world.entity.h" 10#include "..\Minecraft.World\net.minecraft.world.entity.monster.h" 11#include "..\Minecraft.World\net.minecraft.h" 12 13const wstring HumanoidMobRenderer::MATERIAL_NAMES[5] = { L"cloth", L"chain", L"iron", L"diamond", L"gold" }; 14std::map<wstring, ResourceLocation> HumanoidMobRenderer::ARMOR_LOCATION_CACHE; 15 16void HumanoidMobRenderer::_init(HumanoidModel *humanoidModel, float scale) 17{ 18 this->humanoidModel = humanoidModel; 19 this->_scale = scale; 20 armorParts1 = NULL; 21 armorParts2 = NULL; 22 23 createArmorParts(); 24} 25 26HumanoidMobRenderer::HumanoidMobRenderer(HumanoidModel *humanoidModel, float shadow) : MobRenderer(humanoidModel, shadow) 27{ 28 _init(humanoidModel, 1.0f); 29} 30 31HumanoidMobRenderer::HumanoidMobRenderer(HumanoidModel *humanoidModel, float shadow, float scale) : MobRenderer(humanoidModel, shadow) 32{ 33 _init(humanoidModel, scale); 34} 35 36ResourceLocation *HumanoidMobRenderer::getArmorLocation(ArmorItem *armorItem, int layer) 37{ 38 return getArmorLocation(armorItem, layer, false); 39} 40 41ResourceLocation *HumanoidMobRenderer::getArmorLocation(ArmorItem *armorItem, int layer, bool overlay) 42{ 43 switch(armorItem->modelIndex) 44 { 45 case 0: 46 break; 47 case 1: 48 break; 49 case 2: 50 break; 51 case 3: 52 break; 53 case 4: 54 break; 55 }; 56 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"); 57 58 std::map<wstring, ResourceLocation>::iterator it = ARMOR_LOCATION_CACHE.find(path); 59 60 ResourceLocation *location; 61 if (it != ARMOR_LOCATION_CACHE.end()) 62 { 63 location = &it->second; 64 } 65 else 66 { 67 ARMOR_LOCATION_CACHE.insert(std::pair<wstring, ResourceLocation>(path, ResourceLocation(path))); 68 69 it = ARMOR_LOCATION_CACHE.find(path); 70 location = &it->second; 71 } 72 73 return location; 74} 75 76void HumanoidMobRenderer::prepareSecondPassArmor(shared_ptr<LivingEntity> mob, int layer, float a) 77{ 78 shared_ptr<ItemInstance> itemInstance = mob->getArmor(3 - layer); 79 if (itemInstance != NULL) { 80 Item *item = itemInstance->getItem(); 81 if (dynamic_cast<ArmorItem *>(item) != NULL) 82 { 83 bindTexture(getArmorLocation(dynamic_cast<ArmorItem *>(item), layer, true)); 84 85 float brightness = SharedConstants::TEXTURE_LIGHTING ? 1 : mob->getBrightness(a); 86 glColor3f(brightness, brightness, brightness); 87 } 88 } 89} 90 91void HumanoidMobRenderer::createArmorParts() 92{ 93 armorParts1 = new HumanoidModel(1.0f); 94 armorParts2 = new HumanoidModel(0.5f); 95} 96 97int HumanoidMobRenderer::prepareArmor(shared_ptr<LivingEntity> _mob, int layer, float a) 98{ 99 shared_ptr<LivingEntity> mob = dynamic_pointer_cast<LivingEntity>(_mob); 100 101 shared_ptr<ItemInstance> itemInstance = mob->getArmor(3 - layer); 102 if (itemInstance != NULL) 103 { 104 Item *item = itemInstance->getItem(); 105 if (dynamic_cast<ArmorItem *>(item) != NULL) 106 { 107 ArmorItem *armorItem = dynamic_cast<ArmorItem *>(item); 108 bindTexture(getArmorLocation(armorItem, layer)); 109 110 HumanoidModel *armor = layer == 2 ? armorParts2 : armorParts1; 111 112 armor->head->visible = layer == 0; 113 armor->hair->visible = layer == 0; 114 armor->body->visible = layer == 1 || layer == 2; 115 armor->arm0->visible = layer == 1; 116 armor->arm1->visible = layer == 1; 117 armor->leg0->visible = layer == 2 || layer == 3; 118 armor->leg1->visible = layer == 2 || layer == 3; 119 120 setArmor(armor); 121 armor->attackTime = model->attackTime; 122 armor->riding = model->riding; 123 armor->young = model->young; 124 125 float brightness = SharedConstants::TEXTURE_LIGHTING ? 1 : mob->getBrightness(a); 126 if (armorItem->getMaterial() == ArmorItem::ArmorMaterial::CLOTH) 127 { 128 int color = armorItem->getColor(itemInstance); 129 float red = (float) ((color >> 16) & 0xFF) / 0xFF; 130 float green = (float) ((color >> 8) & 0xFF) / 0xFF; 131 float blue = (float) (color & 0xFF) / 0xFF; 132 glColor3f(brightness * red, brightness * green, brightness * blue); 133 134 if (itemInstance->isEnchanted()) return 0x1f; 135 return 0x10; 136 137 } 138 else 139 { 140 glColor3f(brightness, brightness, brightness); 141 } 142 143 if (itemInstance->isEnchanted()) return 15; 144 145 return 1; 146 } 147 } 148 return -1; 149} 150 151void HumanoidMobRenderer::render(shared_ptr<Entity> _mob, double x, double y, double z, float rot, float a) 152{ 153 shared_ptr<LivingEntity> mob = dynamic_pointer_cast<LivingEntity>(_mob); 154 155 float brightness = SharedConstants::TEXTURE_LIGHTING ? 1 : mob->getBrightness(a); 156 glColor3f(brightness, brightness, brightness); 157 shared_ptr<ItemInstance> item = mob->getCarriedItem(); 158 159 prepareCarriedItem(mob, item); 160 161 double yp = y - mob->heightOffset; 162 if (mob->isSneaking()) { 163 yp -= 2 / 16.0f; 164 } 165 MobRenderer::render(mob, x, yp, z, rot, a); 166 armorParts1->bowAndArrow = armorParts2->bowAndArrow = humanoidModel->bowAndArrow = false; 167 armorParts1->sneaking = armorParts2->sneaking = humanoidModel->sneaking = false; 168 armorParts1->holdingRightHand = armorParts2->holdingRightHand = humanoidModel->holdingRightHand = 0; 169} 170 171ResourceLocation *HumanoidMobRenderer::getTextureLocation(shared_ptr<Entity> mob) 172{ 173 // TODO -- Figure out of we need some data in here 174 return NULL; 175} 176 177void HumanoidMobRenderer::prepareCarriedItem(shared_ptr<Entity> mob, shared_ptr<ItemInstance> item) 178{ 179 armorParts1->holdingRightHand = armorParts2->holdingRightHand = humanoidModel->holdingRightHand = item != NULL ? 1 : 0; 180 armorParts1->sneaking = armorParts2->sneaking = humanoidModel->sneaking = mob->isSneaking(); 181} 182 183void HumanoidMobRenderer::additionalRendering(shared_ptr<LivingEntity> mob, float a) 184{ 185 float brightness = SharedConstants::TEXTURE_LIGHTING ? 1 : mob->getBrightness(a); 186 glColor3f(brightness, brightness, brightness); 187 shared_ptr<ItemInstance> item = mob->getCarriedItem(); 188 shared_ptr<ItemInstance> headGear = mob->getArmor(3); 189 190 if (headGear != NULL) 191 { 192 // don't render the pumpkin of skulls for the skins with that disabled 193 // 4J-PB - need to disable rendering armour/skulls/pumpkins for some special skins (Daleks) 194 195 if((mob->getAnimOverrideBitmask()&(1<<HumanoidModel::eAnim_DontRenderArmour))==0) 196 { 197 glPushMatrix(); 198 humanoidModel->head->translateTo(1 / 16.0f); 199 200 if (headGear->getItem()->id < 256) 201 { 202 if (Tile::tiles[headGear->id] != NULL && TileRenderer::canRender(Tile::tiles[headGear->id]->getRenderShape())) 203 { 204 float s = 10 / 16.0f; 205 glTranslatef(-0 / 16.0f, -4 / 16.0f, 0 / 16.0f); 206 glRotatef(90, 0, 1, 0); 207 glScalef(s, -s, -s); 208 } 209 210 this->entityRenderDispatcher->itemInHandRenderer->renderItem(mob, headGear, 0); 211 } 212 else if (headGear->getItem()->id == Item::skull_Id) 213 { 214 float s = 17 / 16.0f; 215 glScalef(s, -s, -s); 216 217 wstring extra = L""; 218 if (headGear->hasTag() && headGear->getTag()->contains(L"SkullOwner")) 219 { 220 extra = headGear->getTag()->getString(L"SkullOwner"); 221 } 222 SkullTileRenderer::instance->renderSkull(-0.5f, 0, -0.5f, Facing::UP, 180, headGear->getAuxValue(), extra); 223 } 224 225 glPopMatrix(); 226 } 227 } 228 229 if (item != NULL) 230 { 231 glPushMatrix(); 232 233 if (model->young) 234 { 235 float s = 0.5f; 236 glTranslatef(0 / 16.0f, 10 / 16.0f, 0 / 16.0f); 237 glRotatef(-20, -1, 0, 0); 238 glScalef(s, s, s); 239 } 240 241 humanoidModel->arm0->translateTo(1 / 16.0f); 242 glTranslatef(-1 / 16.0f, 7 / 16.0f, 1 / 16.0f); 243 244 if (item->id < 256 && TileRenderer::canRender(Tile::tiles[item->id]->getRenderShape())) 245 { 246 float s = 8 / 16.0f; 247 glTranslatef(-0 / 16.0f, 3 / 16.0f, -5 / 16.0f); 248 s *= 0.75f; 249 glRotatef(20, 1, 0, 0); 250 glRotatef(45, 0, 1, 0); 251 glScalef(-s, -s, s); 252 } 253 else if (item->id == Item::bow_Id) 254 { 255 float s = 10 / 16.0f; 256 glTranslatef(0/16.0f, 2 / 16.0f, 5 / 16.0f); 257 glRotatef(-20, 0, 1, 0); 258 glScalef(s, -s, s); 259 glRotatef(-100, 1, 0, 0); 260 glRotatef(45, 0, 1, 0); 261 } 262 else if (Item::items[item->id]->isHandEquipped()) 263 { 264 float s = 10 / 16.0f; 265 glTranslatef(0, 3 / 16.0f, 0); 266 glScalef(s, -s, s); 267 glRotatef(-100, 1, 0, 0); 268 glRotatef(45, 0, 1, 0); 269 } 270 else 271 { 272 float s = 6 / 16.0f; 273 glTranslatef(+4 / 16.0f, +3 / 16.0f, -3 / 16.0f); 274 glScalef(s, s, s); 275 glRotatef(60, 0, 0, 1); 276 glRotatef(-90, 1, 0, 0); 277 glRotatef(20, 0, 0, 1); 278 } 279 280 this->entityRenderDispatcher->itemInHandRenderer->renderItem(mob, item, 0); 281 if (item->getItem()->hasMultipleSpriteLayers()) 282 { 283 this->entityRenderDispatcher->itemInHandRenderer->renderItem(mob, item, 1); 284 } 285 286 glPopMatrix(); 287 } 288 289} 290 291void HumanoidMobRenderer::scale(shared_ptr<LivingEntity> mob, float a) 292{ 293 glScalef(_scale, _scale, _scale); 294}