aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.Client/TileEntityRenderDispatcher.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Minecraft.Client/TileEntityRenderDispatcher.cpp')
-rw-r--r--Minecraft.Client/TileEntityRenderDispatcher.cpp164
1 files changed, 164 insertions, 0 deletions
diff --git a/Minecraft.Client/TileEntityRenderDispatcher.cpp b/Minecraft.Client/TileEntityRenderDispatcher.cpp
new file mode 100644
index 00000000..1708d215
--- /dev/null
+++ b/Minecraft.Client/TileEntityRenderDispatcher.cpp
@@ -0,0 +1,164 @@
+#include "stdafx.h"
+#include "TileEntityRenderDispatcher.h"
+#include "TileEntityRenderer.h"
+#include "..\Minecraft.World\net.minecraft.world.level.tile.entity.h"
+#include "..\Minecraft.World\net.minecraft.world.entity.player.h"
+#include "..\Minecraft.World\net.minecraft.world.level.h"
+#include "..\Minecraft.World\PistonPieceEntity.h"
+#include "SignRenderer.h"
+#include "MobSpawnerRenderer.h"
+#include "PistonPieceRenderer.h"
+#include "ChestRenderer.h"
+#include "EnchantTableRenderer.h"
+#include "TheEndPortalRenderer.h"
+#include "SkullTileRenderer.h"
+#include "EnderChestRenderer.h"
+
+TileEntityRenderDispatcher *TileEntityRenderDispatcher::instance = NULL;
+double TileEntityRenderDispatcher::xOff = 0;
+double TileEntityRenderDispatcher::yOff = 0;
+double TileEntityRenderDispatcher::zOff = 0;
+
+void TileEntityRenderDispatcher::staticCtor()
+{
+ instance = new TileEntityRenderDispatcher();
+}
+
+TileEntityRenderDispatcher::TileEntityRenderDispatcher()
+{
+ // 4J -a dded
+ font = NULL;
+ textures = NULL;
+ level = NULL;
+ cameraEntity = nullptr;
+ playerRotY = 0.0f;
+ playerRotX = 0.0f;;
+ xPlayer = yPlayer = zPlayer = 0;
+
+ glEnable(GL_LIGHTING);
+ renderers[eTYPE_SIGNTILEENTITY] = new SignRenderer();
+ renderers[eTYPE_MOBSPAWNERTILEENTITY] = new MobSpawnerRenderer();
+ renderers[eTYPE_PISTONPIECEENTITY] = new PistonPieceRenderer();
+ renderers[eTYPE_CHESTTILEENTITY] = new ChestRenderer();
+ renderers[eTYPE_ENDERCHESTTILEENTITY] = new EnderChestRenderer();
+ renderers[eTYPE_ENCHANTMENTTABLEENTITY] = new EnchantTableRenderer();
+ renderers[eTYPE_THEENDPORTALTILEENTITY] = new TheEndPortalRenderer();
+ renderers[eTYPE_SKULLTILEENTITY] = new SkullTileRenderer();
+ renderers[eTYPE_FURNACETILEENTITY] = NULL;
+ glDisable(GL_LIGHTING);
+
+ AUTO_VAR(itEnd, renderers.end());
+ for( classToTileRendererMap::iterator it = renderers.begin(); it != itEnd; it++ )
+ {
+ if(it->second) it->second->init(this);
+ }
+}
+
+TileEntityRenderer *TileEntityRenderDispatcher::getRenderer(eINSTANCEOF e)
+{
+ TileEntityRenderer *r = NULL;
+ //TileEntityRenderer *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() )
+ {
+ return NULL;
+ }
+
+/* 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 != TileEntity::_class)
+ {
+ r = getRenderer(dynamic_cast<TileEntity::Class *>( e->getSuperclass() ));
+ // 4J - added condition here to only add if a valid renderer found
+ if( r ) renderers.insert( classToTileRendererMap::value_type( e, r ) );
+ //assert(false);
+ }
+ else if(it != renderers.end() && e != TileEntity::_class)
+ r = (*it).second;
+ */
+
+ return it->second;
+}
+
+bool TileEntityRenderDispatcher::hasRenderer(shared_ptr<TileEntity> e)
+{
+ return getRenderer(e) != NULL;
+}
+
+TileEntityRenderer *TileEntityRenderDispatcher::getRenderer(shared_ptr<TileEntity> e)
+{
+ if (e == NULL) return NULL;
+ return getRenderer(e->GetType());
+}
+
+void TileEntityRenderDispatcher::prepare(Level *level, Textures *textures, Font *font, shared_ptr<Mob> player, float a)
+{
+ if( this->level != level )
+ {
+ setLevel( level );
+ }
+ this->textures = textures;
+ this->cameraEntity = player;
+ this->font = font;
+
+ playerRotY = player->yRotO + (player->yRot - player->yRotO) * a;
+ playerRotX = player->xRotO + (player->xRot - player->xRotO) * 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 TileEntityRenderDispatcher::render(shared_ptr<TileEntity> e, float a, bool setColor/*=true*/)
+{
+ if (e->distanceToSqr(xPlayer, yPlayer, zPlayer) < 64 * 64)
+ {
+ // 4J - changes brought forward from 1.8.2
+ if (SharedConstants::TEXTURE_LIGHTING)
+ {
+ int col = level->getLightColor(e->x, e->y, e->z, 0);
+ int u = col % 65536;
+ int v = col / 65536;
+ glMultiTexCoord2f(GL_TEXTURE1, u / 1.0f, v / 1.0f);
+ glColor4f(1, 1, 1, 1);
+ }
+ else
+ {
+ float br = level->getBrightness(e->x, e->y, e->z);
+ glColor4f(br, br, br, 1);
+ }
+ render(e, e->x - xOff, e->y - yOff, e->z - zOff, a, setColor);
+ }
+}
+
+void TileEntityRenderDispatcher::render(shared_ptr<TileEntity> entity, double x, double y, double z, float a, bool setColor/*=true*/, float alpha, bool useCompiled)
+{
+ TileEntityRenderer *renderer = getRenderer(entity);
+ if (renderer != NULL)
+ {
+ renderer->render(entity, x, y, z, a, setColor, alpha, useCompiled);
+ }
+}
+
+void TileEntityRenderDispatcher::setLevel(Level *level)
+{
+ this->level = level;
+
+ for( AUTO_VAR(it, renderers.begin()); it != renderers.end(); it++ )
+ {
+ if(it->second) it->second->onNewLevel(level);
+ }
+}
+
+double TileEntityRenderDispatcher::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;
+}
+
+Font *TileEntityRenderDispatcher::getFont()
+{
+ return font;
+}