aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.Client/ItemFrameRenderer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Minecraft.Client/ItemFrameRenderer.cpp')
-rw-r--r--Minecraft.Client/ItemFrameRenderer.cpp184
1 files changed, 184 insertions, 0 deletions
diff --git a/Minecraft.Client/ItemFrameRenderer.cpp b/Minecraft.Client/ItemFrameRenderer.cpp
new file mode 100644
index 00000000..40769fb9
--- /dev/null
+++ b/Minecraft.Client/ItemFrameRenderer.cpp
@@ -0,0 +1,184 @@
+#include "stdafx.h"
+#include "ItemRenderer.h"
+#include "tileRenderer.h"
+#include "entityRenderDispatcher.h"
+//#include "ItemFrame"
+#include "ItemFrameRenderer.h"
+
+#include "..\Minecraft.World\JavaMath.h"
+#include "..\Minecraft.World\net.minecraft.world.entity.Item.h"
+#include "..\Minecraft.World\net.minecraft.world.Item.h"
+#include "..\Minecraft.World\net.minecraft.world.Item.alchemy.h"
+#include "..\Minecraft.World\net.minecraft.world.level.tile.h"
+#include "..\Minecraft.World\StringHelpers.h"
+#include "Minecraft.h"
+#include "..\Minecraft.World\Item.h"
+#include "..\Minecraft.World\net.minecraft.world.h"
+#include "..\Minecraft.World\net.minecraft.h"
+#include "CompassTexture.h"
+#include "Minimap.h"
+
+void ItemFrameRenderer::registerTerrainTextures(IconRegister *iconRegister)
+{
+ backTexture = iconRegister->registerIcon(L"itemframe_back");
+}
+
+void ItemFrameRenderer::render(shared_ptr<Entity> _itemframe, double x, double y, double z, float rot, float a)
+{
+ // 4J - original version used generics and thus had an input parameter of type EnderCrystal rather than shared_ptr<Entity> we have here -
+ // do some casting around instead
+ shared_ptr<ItemFrame> itemFrame = dynamic_pointer_cast<ItemFrame>(_itemframe);
+
+ glPushMatrix();
+ float xOffs = (float) (itemFrame->x - x) - 0.5f;
+ float yOffs = (float) (itemFrame->y - y) - 0.5f;
+ float zOffs = (float) (itemFrame->z - z) - 0.5f;
+
+ int xt = itemFrame->xTile + Direction::STEP_X[itemFrame->dir];
+ int yt = itemFrame->yTile;
+ int zt = itemFrame->zTile + Direction::STEP_Z[itemFrame->dir];
+
+ glTranslatef((float) xt - xOffs, (float) yt - yOffs, (float) zt - zOffs);
+
+ drawFrame(itemFrame);
+ drawItem(itemFrame);
+
+ glPopMatrix();
+}
+
+
+void ItemFrameRenderer::drawFrame(shared_ptr<ItemFrame> itemFrame)
+{
+ Minecraft *pMinecraft=Minecraft::GetInstance();
+
+ glPushMatrix();
+ entityRenderDispatcher->textures->bindTexture(TN_TERRAIN);
+ glRotatef(itemFrame->yRot, 0, 1, 0);
+
+ Tile *wood = Tile::wood;
+ float depth = 1.0f / 16.0f;
+ float width = 12.0f / 16.0f;
+ float widthHalf = width / 2.0f;
+
+ // Back
+ glPushMatrix();
+
+ tileRenderer->setFixedShape(0, 0.5f - widthHalf + 1.0f / 16.0f, 0.5f - widthHalf + 1.0f / 16.0f, depth * .5f, 0.5f + widthHalf - 1.0f / 16.0f, 0.5f + widthHalf - 1.0f / 16.0f);
+ tileRenderer->setFixedTexture(backTexture);
+ tileRenderer->renderTile(wood, 0, 1);
+ tileRenderer->clearFixedTexture();
+ tileRenderer->clearFixedShape();
+ glPopMatrix();
+
+ tileRenderer->setFixedTexture(Tile::wood->getTexture(Facing::UP, TreeTile::BIRCH_TRUNK));
+
+ // Bottom
+ glPushMatrix();
+ tileRenderer->setFixedShape(0, 0.5f - widthHalf, 0.5f - widthHalf, depth + 0.0001f, depth + 0.5f - widthHalf, 0.5f + widthHalf);
+ tileRenderer->renderTile(wood, 0, 1);
+ glPopMatrix();
+
+ // Top
+ glPushMatrix();
+ tileRenderer->setFixedShape(0, 0.5f + widthHalf - depth, 0.5f - widthHalf, depth + 0.0001f, 0.5f + widthHalf, 0.5f + widthHalf);
+ tileRenderer->renderTile(wood, 0, 1);
+ glPopMatrix();
+
+ // Right
+ glPushMatrix();
+ tileRenderer->setFixedShape(0, 0.5f - widthHalf, 0.5f - widthHalf, depth, 0.5f + widthHalf, depth + 0.5f - widthHalf);
+ tileRenderer->renderTile(wood, 0, 1);
+ glPopMatrix();
+
+ // Left
+ glPushMatrix();
+ tileRenderer->setFixedShape(0, 0.5f - widthHalf, 0.5f + widthHalf - depth, depth, 0.5f + widthHalf, 0.5f + widthHalf);
+ tileRenderer->renderTile(wood, 0, 1);
+ glPopMatrix();
+
+ tileRenderer->clearFixedShape();
+ tileRenderer->clearFixedTexture();
+
+ glPopMatrix();
+}
+
+void ItemFrameRenderer::drawItem(shared_ptr<ItemFrame> entity)
+{
+ Minecraft *pMinecraft=Minecraft::GetInstance();
+
+ shared_ptr<ItemInstance> instance = entity->getItem();
+ if (instance == NULL) return;
+
+ shared_ptr<ItemEntity> itemEntity = shared_ptr<ItemEntity>(new ItemEntity(entity->level, 0, 0, 0, instance));
+ itemEntity->getItem()->count = 1;
+ itemEntity->bobOffs = 0;
+
+ glPushMatrix();
+
+ glTranslatef((-7.25f / 16.0f) * Direction::STEP_X[entity->dir], -0.18f, (-7.25f / 16.0f) * Direction::STEP_Z[entity->dir]);
+ glRotatef(180 + entity->yRot, 0, 1, 0);
+ glRotatef(-90 * entity->getRotation(), 0, 0, 1);
+
+ switch (entity->getRotation())
+ {
+ case 1:
+ glTranslatef(-0.16f, -0.16f, 0);
+ break;
+ case 2:
+ glTranslatef(0, -0.32f, 0);
+ break;
+ case 3:
+ glTranslatef(0.16f, -0.16f, 0);
+ break;
+ }
+
+ if (itemEntity->getItem()->getItem() == Item::map)
+ {
+ entityRenderDispatcher->textures->bindTexture(TN_MISC_MAPBG);
+ Tesselator *t = Tesselator::getInstance();
+
+ glRotatef(180, 0, 1, 0);
+ glRotatef(180, 0, 0, 1);
+ glScalef(1.0f / 256.0f, 1.0f / 256.0f, 1.0f / 256.0f);
+ glTranslatef(-65, -107, -3);
+ glNormal3f(0, 0, -1);
+ t->begin();
+ int vo = 7;
+ t->vertexUV(0 - vo, 128 + vo, 0, 0, 1);
+ t->vertexUV(128 + vo, 128 + vo, 0, 1, 1);
+ t->vertexUV(128 + vo, 0 - vo, 0, 1, 0);
+ t->vertexUV(0 - vo, 0 - vo, 0, 0, 0);
+ t->end();
+
+ shared_ptr<MapItemSavedData> data = Item::map->getSavedData(itemEntity->getItem(), entity->level);
+ if (data != NULL)
+ {
+ entityRenderDispatcher->itemInHandRenderer->minimap->render(nullptr, entityRenderDispatcher->textures, data, entity->entityId);
+ }
+ }
+ else
+ {
+ if (itemEntity->getItem()->getItem() == Item::compass)
+ {
+ CompassTexture *ct = CompassTexture::instance;
+ double compassRot = ct->rot;
+ double compassRotA = ct->rota;
+ ct->rot = 0;
+ ct->rota = 0;
+ ct->updateFromPosition(entity->level, entity->x, entity->z, Mth::wrapDegrees( (float)(180 + entity->dir * 90) ), false, true);
+ ct->rot = compassRot;
+ ct->rota = compassRotA;
+ }
+
+ EntityRenderDispatcher::instance->render(itemEntity, 0, 0, 0, 0, 0, true);
+
+ if (itemEntity->getItem()->getItem() == Item::compass)
+ {
+ CompassTexture *ct = CompassTexture::instance;
+ ct->cycleFrames();
+ }
+ }
+
+ glPopMatrix();
+}
+