the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
at main 370 lines 13 kB view raw
1#include "stdafx.h" 2#include "EntityRenderDispatcher.h" 3#include "..\Minecraft.World\net.minecraft.world.entity.projectile.h" 4#include "..\Minecraft.World\net.minecraft.world.entity.animal.h" 5#include "..\Minecraft.World\net.minecraft.world.entity.monster.h" 6#include "..\Minecraft.World\net.minecraft.world.entity.item.h" 7#include "..\Minecraft.World\net.minecraft.world.entity.global.h" 8#include "..\Minecraft.World\net.minecraft.world.entity.player.h" 9#include "..\Minecraft.World\net.minecraft.world.entity.boss.enderdragon.h" 10#include "..\Minecraft.World\net.minecraft.world.entity.npc.h" 11#include "..\Minecraft.World\net.minecraft.world.entity.h" 12#include "..\Minecraft.World\net.minecraft.world.level.h" 13#include "..\Minecraft.World\net.minecraft.world.level.tile.h" 14#include "..\Minecraft.World\net.minecraft.world.item.h" 15#include "..\Minecraft.World\net.minecraft.world.item.alchemy.h" 16#include "SpiderRenderer.h" 17#include "PigRenderer.h" 18#include "SheepRenderer.h" 19#include "CowRenderer.h" 20#include "WolfRenderer.h" 21#include "ChickenRenderer.h" 22#include "CreeperRenderer.h" 23#include "SlimeRenderer.h" 24#include "PlayerRenderer.h" 25#include "GhastRenderer.h" 26#include "SquidRenderer.h" 27#include "MobRenderer.h" 28#include "GiantMobRenderer.h" 29#include "EntityRenderer.h" 30#include "PaintingRenderer.h" 31#include "ArrowRenderer.h" 32#include "FireballRenderer.h" 33#include "ItemRenderer.h" 34#include "ItemSpriteRenderer.h" 35#include "TntRenderer.h" 36#include "FallingTileRenderer.h" 37#include "MinecartRenderer.h" 38#include "BoatRenderer.h" 39#include "FishingHookRenderer.h" 40#include "LightningBoltRenderer.h" 41#include "HumanoidMobRenderer.h" 42#include "DefaultRenderer.h" 43#include "EndermanRenderer.h" 44#include "ExperienceOrbRenderer.h" 45#include "SilverfishRenderer.h" 46#include "MushroomCowRenderer.h" 47#include "SnowmanRenderer.h" 48#include "LavaSlimeRenderer.h" 49#include "VillagerRenderer.h" 50#include "EnderDragonRenderer.h" 51#include "EnderCrystalRenderer.h" 52#include "BlazeRenderer.h" 53#include "SkeletonRenderer.h" 54#include "WitchRenderer.h" 55#include "WitherBossRenderer.h" 56#include "LeashKnotRenderer.h" 57#include "WitherSkullRenderer.h" 58#include "TntMinecartRenderer.h" 59#include "MinecartSpawnerRenderer.h" 60#include "HorseRenderer.h" 61#include "SpiderModel.h" 62#include "PigModel.h" 63#include "SheepModel.h" 64#include "CowModel.h" 65#include "WolfModel.h" 66#include "ChickenModel.h" 67#include "CreeperModel.h" 68#include "SlimeModel.h" 69#include "GhastModel.h" 70#include "SquidModel.h" 71#include "MinecartModel.h" 72#include "BoatModel.h" 73#include "HumanoidModel.h" 74#include "SheepFurModel.h" 75#include "SkeletonModel.h" 76#include "ModelHorse.h" 77#include "Options.h" 78#include "ItemFrameRenderer.h" 79#include "OcelotRenderer.h" 80#include "VillagerGolemRenderer.h" 81#include "OcelotModel.h" 82#include "ZombieRenderer.h" 83#include "BatRenderer.h" 84#include "CaveSpiderRenderer.h" 85 86double EntityRenderDispatcher::xOff = 0.0; 87double EntityRenderDispatcher::yOff = 0.0; 88double EntityRenderDispatcher::zOff = 0.0; 89 90EntityRenderDispatcher *EntityRenderDispatcher::instance = NULL; 91 92void EntityRenderDispatcher::staticCtor() 93{ 94 instance = new EntityRenderDispatcher(); 95} 96 97EntityRenderDispatcher::EntityRenderDispatcher() 98{ 99 glEnable(GL_LIGHTING); 100 renderers[eTYPE_SPIDER] = new SpiderRenderer(); 101 renderers[eTYPE_CAVESPIDER] = new CaveSpiderRenderer(); 102 renderers[eTYPE_PIG] = new PigRenderer(new PigModel(), new PigModel(0.5f), 0.7f); 103 renderers[eTYPE_SHEEP] = new SheepRenderer(new SheepModel(), new SheepFurModel(), 0.7f); 104 renderers[eTYPE_COW] = new CowRenderer(new CowModel(), 0.7f); 105 renderers[eTYPE_MUSHROOMCOW] = new MushroomCowRenderer(new CowModel(), 0.7f); 106 renderers[eTYPE_WOLF] = new WolfRenderer(new WolfModel(), new WolfModel(), 0.5f); 107 renderers[eTYPE_CHICKEN] = new ChickenRenderer(new ChickenModel(), 0.3f); 108 renderers[eTYPE_OCELOT] = new OcelotRenderer(new OcelotModel(), 0.4f); 109 renderers[eTYPE_SILVERFISH] = new SilverfishRenderer(); 110 renderers[eTYPE_CREEPER] = new CreeperRenderer(); 111 renderers[eTYPE_ENDERMAN] = new EndermanRenderer(); 112 renderers[eTYPE_SNOWMAN] = new SnowManRenderer(); 113 renderers[eTYPE_SKELETON] = new SkeletonRenderer(); 114 renderers[eTYPE_WITCH] = new WitchRenderer(); 115 renderers[eTYPE_BLAZE] = new BlazeRenderer(); 116 renderers[eTYPE_ZOMBIE] = new ZombieRenderer(); 117 renderers[eTYPE_PIGZOMBIE] = new ZombieRenderer(); 118 renderers[eTYPE_SLIME] = new SlimeRenderer(new SlimeModel(16), new SlimeModel(0), 0.25f); 119 renderers[eTYPE_LAVASLIME] = new LavaSlimeRenderer(); 120 renderers[eTYPE_PLAYER] = new PlayerRenderer(); 121 renderers[eTYPE_GIANT] = new GiantMobRenderer(new ZombieModel(), 0.5f, 6); 122 renderers[eTYPE_GHAST] = new GhastRenderer(); 123 renderers[eTYPE_SQUID] = new SquidRenderer(new SquidModel(), 0.7f); 124 renderers[eTYPE_VILLAGER] = new VillagerRenderer(); 125 renderers[eTYPE_VILLAGERGOLEM] = new VillagerGolemRenderer(); 126 renderers[eTYPE_BAT] = new BatRenderer(); 127 128 renderers[eTYPE_MOB] = new MobRenderer(new HumanoidModel(), 0.5f); 129 130 renderers[eTYPE_ENDERDRAGON] = new EnderDragonRenderer(); 131 renderers[eTYPE_ENDER_CRYSTAL] = new EnderCrystalRenderer(); 132 133 renderers[eTYPE_WITHERBOSS] = new WitherBossRenderer(); 134 135 renderers[eTYPE_ENTITY] = new DefaultRenderer(); 136 renderers[eTYPE_PAINTING] = new PaintingRenderer(); 137 renderers[eTYPE_ITEM_FRAME] = new ItemFrameRenderer(); 138 renderers[eTYPE_LEASHFENCEKNOT] = new LeashKnotRenderer(); 139 renderers[eTYPE_ARROW] = new ArrowRenderer(); 140 renderers[eTYPE_SNOWBALL] = new ItemSpriteRenderer(Item::snowBall); 141 renderers[eTYPE_THROWNENDERPEARL] = new ItemSpriteRenderer(Item::enderPearl); 142 renderers[eTYPE_EYEOFENDERSIGNAL] = new ItemSpriteRenderer(Item::eyeOfEnder); 143 renderers[eTYPE_THROWNEGG] = new ItemSpriteRenderer(Item::egg); 144 renderers[eTYPE_THROWNPOTION] = new ItemSpriteRenderer(Item::potion, PotionBrewing::THROWABLE_MASK); 145 renderers[eTYPE_THROWNEXPBOTTLE] = new ItemSpriteRenderer(Item::expBottle); 146 renderers[eTYPE_FIREWORKS_ROCKET] = new ItemSpriteRenderer(Item::fireworks); 147 renderers[eTYPE_LARGE_FIREBALL] = new FireballRenderer(2.0f); 148 renderers[eTYPE_SMALL_FIREBALL] = new FireballRenderer(0.5f); 149 renderers[eTYPE_DRAGON_FIREBALL] = new FireballRenderer(2.0f); // 4J Added TU9 150 renderers[eTYPE_WITHER_SKULL] = new WitherSkullRenderer(); 151 renderers[eTYPE_ITEMENTITY] = new ItemRenderer(); 152 renderers[eTYPE_EXPERIENCEORB] = new ExperienceOrbRenderer(); 153 renderers[eTYPE_PRIMEDTNT] = new TntRenderer(); 154 renderers[eTYPE_FALLINGTILE] = new FallingTileRenderer(); 155 156 renderers[eTYPE_MINECART_TNT] = new TntMinecartRenderer(); 157 renderers[eTYPE_MINECART_SPAWNER] = new MinecartSpawnerRenderer(); 158 renderers[eTYPE_MINECART_RIDEABLE] = new MinecartRenderer(); 159 160 renderers[eTYPE_MINECART_FURNACE] = new MinecartRenderer(); 161 renderers[eTYPE_MINECART_CHEST] = new MinecartRenderer(); 162 renderers[eTYPE_MINECART_HOPPER] = new MinecartRenderer(); 163 164 renderers[eTYPE_BOAT] = new BoatRenderer(); 165 renderers[eTYPE_FISHINGHOOK] = new FishingHookRenderer(); 166 167 renderers[eTYPE_HORSE] = new HorseRenderer(new ModelHorse(), .75f); 168 169 renderers[eTYPE_LIGHTNINGBOLT] = new LightningBoltRenderer(); 170 glDisable(GL_LIGHTING); 171 172 AUTO_VAR(itEnd, renderers.end()); 173 for( classToRendererMap::iterator it = renderers.begin(); it != itEnd; it++ ) 174 { 175 it->second->init(this); 176 } 177 178 isGuiRender = false; // 4J added 179} 180 181EntityRenderer *EntityRenderDispatcher::getRenderer(eINSTANCEOF e) 182{ 183 if( (e & eTYPE_PLAYER) == eTYPE_PLAYER) e = eTYPE_PLAYER; 184 //EntityRenderer * r = renderers[e]; 185 AUTO_VAR(it, renderers.find( e )); // 4J Stu - The .at and [] accessors insert elements if they don't exist 186 187 if( it == renderers.end() ) 188 { 189 app.DebugPrintf("Couldn't find renderer for entity of type %d\n", e); 190 // New renderer mapping required in above table 191 __debugbreak(); 192 } 193 /* 4J - not doing this hierarchical search anymore. We need to explicitly add renderers for any eINSTANCEOF type that we want to be able to render 194 if (it == renderers.end() && e != Entity::_class) 195 { 196 EntityRenderer *r = getRenderer(dynamic_cast<Entity::Class *>( e->getSuperclass() )); 197 renderers.insert( classToRendererMap::value_type( e, r ) ); 198 return r; 199 //assert(false); 200 }*/ 201 return it->second; 202} 203 204EntityRenderer *EntityRenderDispatcher::getRenderer(shared_ptr<Entity> e) 205{ 206 return getRenderer(e->GetType()); 207} 208 209void EntityRenderDispatcher::prepare(Level *level, Textures *textures, Font *font, shared_ptr<LivingEntity> player, shared_ptr<LivingEntity> crosshairPickMob, Options *options, float a) 210{ 211 this->level = level; 212 this->textures = textures; 213 this->options = options; 214 this->cameraEntity = player; 215 this->font = font; 216 this->crosshairPickMob = crosshairPickMob; 217 218 if (player->isSleeping()) 219 { 220 int t = level->getTile(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z)); 221 if (t == Tile::bed_Id) 222 { 223 int data = level->getData(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z)); 224 225 int direction = data & 3; 226 playerRotY = (float)(direction * 90 + 180); 227 playerRotX = 0; 228 } 229 } else { 230 playerRotY = player->yRotO + (player->yRot - player->yRotO) * a; 231 playerRotX = player->xRotO + (player->xRot - player->xRotO) * a; 232 } 233 234 shared_ptr<Player> pl = dynamic_pointer_cast<Player>(player); 235 if (pl->ThirdPersonView() == 2) 236 { 237 playerRotY += 180; 238 } 239 240 xPlayer = player->xOld + (player->x - player->xOld) * a; 241 yPlayer = player->yOld + (player->y - player->yOld) * a; 242 zPlayer = player->zOld + (player->z - player->zOld) * a; 243 244} 245 246void EntityRenderDispatcher::render(shared_ptr<Entity> entity, float a) 247{ 248 double x = entity->xOld + (entity->x - entity->xOld) * a; 249 double y = entity->yOld + (entity->y - entity->yOld) * a; 250 double z = entity->zOld + (entity->z - entity->zOld) * a; 251 252 // Fix for #61057 - TU7: Gameplay: Boat is glitching when player float forward and turning. 253 // Fix to handle the case that yRot and yRotO wrap over the 0/360 line 254 float rotDiff = entity->yRot - entity->yRotO; 255 if( rotDiff > 180 || rotDiff < -180) 256 { 257 if(entity->yRot > entity->yRotO) 258 { 259 rotDiff = (entity->yRot - 360) - entity->yRotO; 260 } 261 else 262 { 263 rotDiff = entity->yRot - (entity->yRotO - 360); 264 } 265 } 266 float r = entity->yRotO + (rotDiff) * a; 267 268 int col = entity->getLightColor(a); 269 if (entity->isOnFire()) 270 { 271 col = SharedConstants::FULLBRIGHT_LIGHTVALUE; 272 } 273 int u = col % 65536; 274 int v = col / 65536; 275 glMultiTexCoord2f(GL_TEXTURE1, u / 1.0f, v / 1.0f); 276 glColor4f(1, 1, 1, 1); 277 278 render(entity, x - xOff, y - yOff, z - zOff, r, a); 279} 280 281void EntityRenderDispatcher::render(shared_ptr<Entity> entity, double x, double y, double z, float rot, float a, bool bItemFrame, bool bRenderPlayerShadow) 282{ 283 EntityRenderer *renderer = getRenderer(entity); 284 if (renderer != NULL) 285 { 286 renderer->SetItemFrame(bItemFrame); 287 288 renderer->render(entity, x, y, z, rot, a); 289 renderer->postRender(entity, x, y, z, rot, a, bRenderPlayerShadow); 290 } 291} 292 293double EntityRenderDispatcher::distanceToSqr(double x, double y, double z) 294{ 295 double xd = x - xPlayer; 296 double yd = y - yPlayer; 297 double zd = z - zPlayer; 298 return xd * xd + yd * yd + zd * zd; 299} 300 301Font *EntityRenderDispatcher::getFont() 302{ 303 return font; 304} 305 306void EntityRenderDispatcher::registerTerrainTextures(IconRegister *iconRegister) 307{ 308 //for (EntityRenderer<? extends Entity> renderer : renderers.values()) 309 for(AUTO_VAR(it, renderers.begin()); it != renderers.end(); ++it) 310 { 311 EntityRenderer *renderer = it->second; 312 renderer->registerTerrainTextures(iconRegister); 313 } 314} 315 316void EntityRenderDispatcher::renderHitbox(shared_ptr<Entity> entity, double x, double y, double z, float rot, float a) 317{ 318 glDepthMask(false); 319 glDisable(GL_TEXTURE_2D); 320 glDisable(GL_LIGHTING); 321 glDisable(GL_CULL_FACE); 322 glDisable(GL_BLEND); 323 324 glPushMatrix(); 325 Tesselator *t = Tesselator::getInstance(); 326 327 t->begin(); 328 t->color(255, 255, 255, 32); 329 330 double wnx = -entity->bbWidth / 2; 331 double wnz = -entity->bbWidth / 2; 332 double enx = entity->bbWidth / 2; 333 double enz = -entity->bbWidth / 2; 334 335 double wsx = -entity->bbWidth / 2; 336 double wsz = entity->bbWidth / 2; 337 double esx = entity->bbWidth / 2; 338 double esz = entity->bbWidth / 2; 339 340 double top = entity->bbHeight; 341 342 t->vertex(x + wnx, y + top, z + wnz); 343 t->vertex(x + wnx, y, z + wnz); 344 t->vertex(x + enx, y, z + enz); 345 t->vertex(x + enx, y + top, z + enz); 346 347 t->vertex(x + esx, y + top, z + esz); 348 t->vertex(x + esx, y, z + esz); 349 t->vertex(x + wsx, y, z + wsz); 350 t->vertex(x + wsx, y + top, z + wsz); 351 352 t->vertex(x + enx, y + top, z + enz); 353 t->vertex(x + enx, y, z + enz); 354 t->vertex(x + esx, y, z + esz); 355 t->vertex(x + esx, y + top, z + esz); 356 357 t->vertex(x + wsx, y + top, z + wsz); 358 t->vertex(x + wsx, y, z + wsz); 359 t->vertex(x + wnx, y, z + wnz); 360 t->vertex(x + wnx, y + top, z + wnz); 361 362 t->end(); 363 glPopMatrix(); 364 365 glEnable(GL_TEXTURE_2D); 366 glEnable(GL_LIGHTING); 367 glEnable(GL_CULL_FACE); 368 glDisable(GL_BLEND); 369 glDepthMask(true); 370}