From b691c43c44ff180d10e7d4a9afc83b98551ff586 Mon Sep 17 00:00:00 2001 From: daoge_cmd <3523206925@qq.com> Date: Sun, 1 Mar 2026 12:16:08 +0800 Subject: Initial commit --- Minecraft.Client/SkullTileRenderer.cpp | 112 +++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 Minecraft.Client/SkullTileRenderer.cpp (limited to 'Minecraft.Client/SkullTileRenderer.cpp') diff --git a/Minecraft.Client/SkullTileRenderer.cpp b/Minecraft.Client/SkullTileRenderer.cpp new file mode 100644 index 00000000..641a7a02 --- /dev/null +++ b/Minecraft.Client/SkullTileRenderer.cpp @@ -0,0 +1,112 @@ +#include "stdafx.h" +#include "..\Minecraft.World\SkullTileEntity.h" +#include "..\Minecraft.World\net.minecraft.world.level.tile.h" +#include "..\Minecraft.World\net.minecraft.h" +#include "SkeletonHeadModel.h" +#include "SkullTileRenderer.h" + +SkullTileRenderer *SkullTileRenderer::instance = NULL; + +SkullTileRenderer::SkullTileRenderer() +{ + skeletonModel = new SkeletonHeadModel(0, 0, 64, 32); + zombieModel = new SkeletonHeadModel(0, 0, 64, 64); +} + +SkullTileRenderer::~SkullTileRenderer() +{ + delete skeletonModel; + delete zombieModel; +} + +void SkullTileRenderer::render(shared_ptr _skull, double x, double y, double z, float a, bool setColor, float alpha, bool useCompiled) +{ + shared_ptr skull = dynamic_pointer_cast(_skull); + renderSkull((float) x, (float) y, (float) z, skull->getData() & SkullTile::PLACEMENT_MASK, skull->getRotation() * 360 / 16.0f, skull->getSkullType(), skull->getExtraType()); +} + +void SkullTileRenderer::init(TileEntityRenderDispatcher *tileEntityRenderDispatcher) +{ + TileEntityRenderer::init(tileEntityRenderDispatcher); + instance = this; +} + +void SkullTileRenderer::renderSkull(float x, float y, float z, int face, float rot, int type, const wstring &extra) +{ + Model *model = skeletonModel; + + switch (type) + { + case SkullTileEntity::TYPE_WITHER: + bindTexture(TN_MOB_WITHER_SKELETON); + break; + case SkullTileEntity::TYPE_ZOMBIE: + bindTexture(TN_MOB_ZOMBIE); + //model = zombieModel; + break; + case SkullTileEntity::TYPE_CHAR: + //if (!extra.empty()) + //{ + // wstring url = "http://skins.minecraft.net/MinecraftSkins/" + StringUtil.stripColor(extra) + ".png"; + + // if (!instance->tileEntityRenderDispatcher->textures->hasHttpTexture(url)) + // { + // instance->tileEntityRenderDispatcher->textures->addHttpTexture(url, new MobSkinTextureProcessor()); + // } + + // bindTexture(url, "/mob/char.png"); + //} + //else + { + bindTexture(TN_MOB_CHAR); + } + break; + case SkullTileEntity::TYPE_CREEPER: + bindTexture(TN_MOB_CREEPER); + break; + case SkullTileEntity::TYPE_SKELETON: + default: + bindTexture(TN_MOB_SKELETON); + break; + } + + glPushMatrix(); + glDisable(GL_CULL_FACE); + + if (face != Facing::UP) + { + switch (face) + { + case Facing::NORTH: + glTranslatef(x + 0.5f, y + .25f, z + 0.74f); + break; + case Facing::SOUTH: + glTranslatef(x + 0.5f, y + .25f, z + 0.26f); + rot = 180.0f; + break; + case Facing::WEST: + glTranslatef(x + 0.74f, y + .25f, z + 0.5f); + rot = 270.0f; + break; + case Facing::EAST: + default: + glTranslatef(x + 0.26f, y + .25f, z + 0.5f); + rot = 90.0f; + break; + } + } + else + { + glTranslatef(x + 0.5f, y, z + 0.5f); + } + + float scale = 1 / 16.0f; + glEnable(GL_RESCALE_NORMAL); + glScalef(-1, -1, 1); + + glEnable(GL_ALPHA_TEST); + + model->render(nullptr, 0, 0, 0, rot, 0, scale,true); + + glPopMatrix(); +} -- cgit v1.2.3