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/EntityRenderDispatcher.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/EntityRenderDispatcher.cpp')
| -rw-r--r-- | Minecraft.Client/EntityRenderDispatcher.cpp | 202 |
1 files changed, 146 insertions, 56 deletions
diff --git a/Minecraft.Client/EntityRenderDispatcher.cpp b/Minecraft.Client/EntityRenderDispatcher.cpp index dfc9a11e..f23c713c 100644 --- a/Minecraft.Client/EntityRenderDispatcher.cpp +++ b/Minecraft.Client/EntityRenderDispatcher.cpp @@ -50,6 +50,14 @@ #include "EnderDragonRenderer.h" #include "EnderCrystalRenderer.h" #include "BlazeRenderer.h" +#include "SkeletonRenderer.h" +#include "WitchRenderer.h" +#include "WitherBossRenderer.h" +#include "LeashKnotRenderer.h" +#include "WitherSkullRenderer.h" +#include "TntMinecartRenderer.h" +#include "MinecartSpawnerRenderer.h" +#include "HorseRenderer.h" #include "SpiderModel.h" #include "PigModel.h" #include "SheepModel.h" @@ -65,12 +73,15 @@ #include "HumanoidModel.h" #include "SheepFurModel.h" #include "SkeletonModel.h" +#include "ModelHorse.h" #include "Options.h" #include "ItemFrameRenderer.h" -#include "OzelotRenderer.h" +#include "OcelotRenderer.h" #include "VillagerGolemRenderer.h" -#include "OzelotModel.h" +#include "OcelotModel.h" #include "ZombieRenderer.h" +#include "BatRenderer.h" +#include "CaveSpiderRenderer.h" double EntityRenderDispatcher::xOff = 0.0; double EntityRenderDispatcher::yOff = 0.0; @@ -87,22 +98,23 @@ EntityRenderDispatcher::EntityRenderDispatcher() { glEnable(GL_LIGHTING); renderers[eTYPE_SPIDER] = new SpiderRenderer(); - renderers[eTYPE_CAVESPIDER] = new SpiderRenderer(); + renderers[eTYPE_CAVESPIDER] = new CaveSpiderRenderer(); renderers[eTYPE_PIG] = new PigRenderer(new PigModel(), new PigModel(0.5f), 0.7f); renderers[eTYPE_SHEEP] = new SheepRenderer(new SheepModel(), new SheepFurModel(), 0.7f); renderers[eTYPE_COW] = new CowRenderer(new CowModel(), 0.7f); renderers[eTYPE_MUSHROOMCOW] = new MushroomCowRenderer(new CowModel(), 0.7f); renderers[eTYPE_WOLF] = new WolfRenderer(new WolfModel(), new WolfModel(), 0.5f); renderers[eTYPE_CHICKEN] = new ChickenRenderer(new ChickenModel(), 0.3f); - renderers[eTYPE_OZELOT] = new OzelotRenderer(new OzelotModel(), 0.4f); + renderers[eTYPE_OCELOT] = new OcelotRenderer(new OcelotModel(), 0.4f); renderers[eTYPE_SILVERFISH] = new SilverfishRenderer(); renderers[eTYPE_CREEPER] = new CreeperRenderer(); renderers[eTYPE_ENDERMAN] = new EndermanRenderer(); renderers[eTYPE_SNOWMAN] = new SnowManRenderer(); - renderers[eTYPE_SKELETON] = new HumanoidMobRenderer(new SkeletonModel(), 0.5f); + renderers[eTYPE_SKELETON] = new SkeletonRenderer(); + renderers[eTYPE_WITCH] = new WitchRenderer(); renderers[eTYPE_BLAZE] = new BlazeRenderer(); renderers[eTYPE_ZOMBIE] = new ZombieRenderer(); - renderers[eTYPE_PIGZOMBIE] = new HumanoidMobRenderer(new ZombieModel(), 0.5f); + renderers[eTYPE_PIGZOMBIE] = new ZombieRenderer(); renderers[eTYPE_SLIME] = new SlimeRenderer(new SlimeModel(16), new SlimeModel(0), 0.25f); renderers[eTYPE_LAVASLIME] = new LavaSlimeRenderer(); renderers[eTYPE_PLAYER] = new PlayerRenderer(); @@ -111,12 +123,19 @@ EntityRenderDispatcher::EntityRenderDispatcher() renderers[eTYPE_SQUID] = new SquidRenderer(new SquidModel(), 0.7f); renderers[eTYPE_VILLAGER] = new VillagerRenderer(); renderers[eTYPE_VILLAGERGOLEM] = new VillagerGolemRenderer(); + renderers[eTYPE_BAT] = new BatRenderer(); + renderers[eTYPE_MOB] = new MobRenderer(new HumanoidModel(), 0.5f); + renderers[eTYPE_ENDERDRAGON] = new EnderDragonRenderer(); renderers[eTYPE_ENDER_CRYSTAL] = new EnderCrystalRenderer(); + + renderers[eTYPE_WITHERBOSS] = new WitherBossRenderer(); + renderers[eTYPE_ENTITY] = new DefaultRenderer(); - renderers[eTYPE_PAINTING] = new PaintingRenderer(); + renderers[eTYPE_PAINTING] = new PaintingRenderer(); renderers[eTYPE_ITEM_FRAME] = new ItemFrameRenderer(); + renderers[eTYPE_LEASHFENCEKNOT] = new LeashKnotRenderer(); renderers[eTYPE_ARROW] = new ArrowRenderer(); renderers[eTYPE_SNOWBALL] = new ItemSpriteRenderer(Item::snowBall); renderers[eTYPE_THROWNENDERPEARL] = new ItemSpriteRenderer(Item::enderPearl); @@ -124,18 +143,30 @@ EntityRenderDispatcher::EntityRenderDispatcher() renderers[eTYPE_THROWNEGG] = new ItemSpriteRenderer(Item::egg); renderers[eTYPE_THROWNPOTION] = new ItemSpriteRenderer(Item::potion, PotionBrewing::THROWABLE_MASK); renderers[eTYPE_THROWNEXPBOTTLE] = new ItemSpriteRenderer(Item::expBottle); - renderers[eTYPE_FIREBALL] = new FireballRenderer(2.0f); + renderers[eTYPE_FIREWORKS_ROCKET] = new ItemSpriteRenderer(Item::fireworks); + renderers[eTYPE_LARGE_FIREBALL] = new FireballRenderer(2.0f); renderers[eTYPE_SMALL_FIREBALL] = new FireballRenderer(0.5f); renderers[eTYPE_DRAGON_FIREBALL] = new FireballRenderer(2.0f); // 4J Added TU9 + renderers[eTYPE_WITHER_SKULL] = new WitherSkullRenderer(); renderers[eTYPE_ITEMENTITY] = new ItemRenderer(); renderers[eTYPE_EXPERIENCEORB] = new ExperienceOrbRenderer(); renderers[eTYPE_PRIMEDTNT] = new TntRenderer(); renderers[eTYPE_FALLINGTILE] = new FallingTileRenderer(); - renderers[eTYPE_MINECART] = new MinecartRenderer(); + + renderers[eTYPE_MINECART_TNT] = new TntMinecartRenderer(); + renderers[eTYPE_MINECART_SPAWNER] = new MinecartSpawnerRenderer(); + renderers[eTYPE_MINECART_RIDEABLE] = new MinecartRenderer(); + + renderers[eTYPE_MINECART_FURNACE] = new MinecartRenderer(); + renderers[eTYPE_MINECART_CHEST] = new MinecartRenderer(); + renderers[eTYPE_MINECART_HOPPER] = new MinecartRenderer(); + renderers[eTYPE_BOAT] = new BoatRenderer(); renderers[eTYPE_FISHINGHOOK] = new FishingHookRenderer(); + + renderers[eTYPE_HORSE] = new HorseRenderer(new ModelHorse(), .75f); + renderers[eTYPE_LIGHTNINGBOLT] = new LightningBoltRenderer(); - renderers[eTYPE_ARROW] = new ArrowRenderer(); glDisable(GL_LIGHTING); AUTO_VAR(itEnd, renderers.end()); @@ -149,22 +180,24 @@ EntityRenderDispatcher::EntityRenderDispatcher() EntityRenderer *EntityRenderDispatcher::getRenderer(eINSTANCEOF e) { + if( (e & eTYPE_PLAYER) == eTYPE_PLAYER) e = eTYPE_PLAYER; //EntityRenderer * r = renderers[e]; AUTO_VAR(it, renderers.find( e )); // 4J Stu - The .at and [] accessors insert elements if they don't exist if( it == renderers.end() ) { + app.DebugPrintf("Couldn't find renderer for entity of type %d\n", e); // New renderer mapping required in above table __debugbreak(); } /* 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 - if (it == renderers.end() && e != Entity::_class) + if (it == renderers.end() && e != Entity::_class) { - EntityRenderer *r = getRenderer(dynamic_cast<Entity::Class *>( e->getSuperclass() )); - renderers.insert( classToRendererMap::value_type( e, r ) ); - return r; - //assert(false); - }*/ + EntityRenderer *r = getRenderer(dynamic_cast<Entity::Class *>( e->getSuperclass() )); + renderers.insert( classToRendererMap::value_type( e, r ) ); + return r; + //assert(false); + }*/ return it->second; } @@ -173,29 +206,30 @@ EntityRenderer *EntityRenderDispatcher::getRenderer(shared_ptr<Entity> e) return getRenderer(e->GetType()); } -void EntityRenderDispatcher::prepare(Level *level, Textures *textures, Font *font, shared_ptr<Mob> player, Options *options, float a) +void EntityRenderDispatcher::prepare(Level *level, Textures *textures, Font *font, shared_ptr<LivingEntity> player, shared_ptr<LivingEntity> crosshairPickMob, Options *options, float a) { - this->level = level; - this->textures = textures; - this->options = options; - this->cameraEntity = player; - this->font = font; + this->level = level; + this->textures = textures; + this->options = options; + this->cameraEntity = player; + this->font = font; + this->crosshairPickMob = crosshairPickMob; - if (player->isSleeping()) + if (player->isSleeping()) { - int t = level->getTile(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z)); - if (t == Tile::bed_Id) + int t = level->getTile(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z)); + if (t == Tile::bed_Id) { - int data = level->getData(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z)); + int data = level->getData(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z)); - int direction = data & 3; - playerRotY = (float)(direction * 90 + 180); - playerRotX = 0; - } - } else { - playerRotY = player->yRotO + (player->yRot - player->yRotO) * a; - playerRotX = player->xRotO + (player->xRot - player->xRotO) * a; - } + int direction = data & 3; + playerRotY = (float)(direction * 90 + 180); + playerRotX = 0; + } + } else { + playerRotY = player->yRotO + (player->yRot - player->yRotO) * a; + playerRotX = player->xRotO + (player->xRot - player->xRotO) * a; + } shared_ptr<Player> pl = dynamic_pointer_cast<Player>(player); if (pl->ThirdPersonView() == 2) @@ -203,17 +237,17 @@ void EntityRenderDispatcher::prepare(Level *level, Textures *textures, Font *fon playerRotY += 180; } - xPlayer = player->xOld + (player->x - player->xOld) * a; - yPlayer = player->yOld + (player->y - player->yOld) * a; - zPlayer = player->zOld + (player->z - player->zOld) * a; + xPlayer = player->xOld + (player->x - player->xOld) * a; + yPlayer = player->yOld + (player->y - player->yOld) * a; + zPlayer = player->zOld + (player->z - player->zOld) * a; } void EntityRenderDispatcher::render(shared_ptr<Entity> entity, float a) { - double x = entity->xOld + (entity->x - entity->xOld) * a; - double y = entity->yOld + (entity->y - entity->yOld) * a; - double z = entity->zOld + (entity->z - entity->zOld) * a; + double x = entity->xOld + (entity->x - entity->xOld) * a; + double y = entity->yOld + (entity->y - entity->yOld) * a; + double z = entity->zOld + (entity->z - entity->zOld) * a; // Fix for #61057 - TU7: Gameplay: Boat is glitching when player float forward and turning. // Fix to handle the case that yRot and yRotO wrap over the 0/360 line @@ -229,39 +263,39 @@ void EntityRenderDispatcher::render(shared_ptr<Entity> entity, float a) rotDiff = entity->yRot - (entity->yRotO - 360); } } - float r = entity->yRotO + (rotDiff) * a; - - int col = entity->getLightColor(a); + float r = entity->yRotO + (rotDiff) * a; + + int col = entity->getLightColor(a); if (entity->isOnFire()) { col = SharedConstants::FULLBRIGHT_LIGHTVALUE; } - int u = col % 65536; - int v = col / 65536; - glMultiTexCoord2f(GL_TEXTURE1, u / 1.0f, v / 1.0f); - glColor4f(1, 1, 1, 1); + int u = col % 65536; + int v = col / 65536; + glMultiTexCoord2f(GL_TEXTURE1, u / 1.0f, v / 1.0f); + glColor4f(1, 1, 1, 1); - render(entity, x - xOff, y - yOff, z - zOff, r, a); + render(entity, x - xOff, y - yOff, z - zOff, r, a); } void EntityRenderDispatcher::render(shared_ptr<Entity> entity, double x, double y, double z, float rot, float a, bool bItemFrame, bool bRenderPlayerShadow) { EntityRenderer *renderer = getRenderer(entity); - if (renderer != NULL) + if (renderer != NULL) { renderer->SetItemFrame(bItemFrame); - + renderer->render(entity, x, y, z, rot, a); - renderer->postRender(entity, x, y, z, rot, a, bRenderPlayerShadow); - } + renderer->postRender(entity, x, y, z, rot, a, bRenderPlayerShadow); + } } double EntityRenderDispatcher::distanceToSqr(double x, double y, double z) { - double xd = x - xPlayer; - double yd = y - yPlayer; - double zd = z - zPlayer; - return xd * xd + yd * yd + zd * zd; + double xd = x - xPlayer; + double yd = y - yPlayer; + double zd = z - zPlayer; + return xd * xd + yd * yd + zd * zd; } Font *EntityRenderDispatcher::getFont() @@ -277,4 +311,60 @@ void EntityRenderDispatcher::registerTerrainTextures(IconRegister *iconRegister) EntityRenderer *renderer = it->second; renderer->registerTerrainTextures(iconRegister); } +} + +void EntityRenderDispatcher::renderHitbox(shared_ptr<Entity> entity, double x, double y, double z, float rot, float a) +{ + glDepthMask(false); + glDisable(GL_TEXTURE_2D); + glDisable(GL_LIGHTING); + glDisable(GL_CULL_FACE); + glDisable(GL_BLEND); + + glPushMatrix(); + Tesselator *t = Tesselator::getInstance(); + + t->begin(); + t->color(255, 255, 255, 32); + + double wnx = -entity->bbWidth / 2; + double wnz = -entity->bbWidth / 2; + double enx = entity->bbWidth / 2; + double enz = -entity->bbWidth / 2; + + double wsx = -entity->bbWidth / 2; + double wsz = entity->bbWidth / 2; + double esx = entity->bbWidth / 2; + double esz = entity->bbWidth / 2; + + double top = entity->bbHeight; + + t->vertex(x + wnx, y + top, z + wnz); + t->vertex(x + wnx, y, z + wnz); + t->vertex(x + enx, y, z + enz); + t->vertex(x + enx, y + top, z + enz); + + t->vertex(x + esx, y + top, z + esz); + t->vertex(x + esx, y, z + esz); + t->vertex(x + wsx, y, z + wsz); + t->vertex(x + wsx, y + top, z + wsz); + + t->vertex(x + enx, y + top, z + enz); + t->vertex(x + enx, y, z + enz); + t->vertex(x + esx, y, z + esz); + t->vertex(x + esx, y + top, z + esz); + + t->vertex(x + wsx, y + top, z + wsz); + t->vertex(x + wsx, y, z + wsz); + t->vertex(x + wnx, y, z + wnz); + t->vertex(x + wnx, y + top, z + wnz); + + t->end(); + glPopMatrix(); + + glEnable(GL_TEXTURE_2D); + glEnable(GL_LIGHTING); + glEnable(GL_CULL_FACE); + glDisable(GL_BLEND); + glDepthMask(true); }
\ No newline at end of file |
