Files
minecraft-pe-0.6.1/src/client/renderer/entity/EntityRenderDispatcher.cpp
2026-03-13 16:26:19 +01:00

195 lines
5.8 KiB
C++
Executable File

#include "EntityRenderDispatcher.h"
#include "../../Options.h"
#include "../../../world/entity/player/Player.h"
#include "../../../world/item/Item.h"
#include "../../../world/level/Level.h"
#include "../../../world/level/tile/Tile.h"
#include "../../model/ModelInclude.h"
#include "ItemSpriteRenderer.h"
#include "FallingTileRenderer.h"
#include "HumanoidMobRenderer.h"
#include "ItemRenderer.h"
#include "TntRenderer.h"
#include "TripodCameraRenderer.h"
#include "PigRenderer.h"
#include "MobRenderer.h"
#include "PlayerRenderer.h"
#include "CreeperRenderer.h"
#include "SpiderRenderer.h"
#include "ChickenRenderer.h"
#include "SheepRenderer.h"
#include "ArrowRenderer.h"
#include "PaintingRenderer.h"
/*static*/
EntityRenderDispatcher* EntityRenderDispatcher::instance = NULL;
/*static*/
float EntityRenderDispatcher::xOff = 0,
EntityRenderDispatcher::yOff = 0,
EntityRenderDispatcher::zOff = 0;
EntityRenderDispatcher::EntityRenderDispatcher()
: itemInHandRenderer(NULL)
{
//@note: The Models (model/armor) will be deleted by resp. MobRenderer
assign( ER_ITEM_RENDERER, new ItemRenderer());
assign( ER_HUMANOID_RENDERER, new HumanoidMobRenderer(new HumanoidModel(), 0));
assign( ER_PIG_RENDERER, new PigRenderer(new PigModel(), NULL/*new PigModel(0.5f)*/, 0));
assign( ER_COW_RENDERER, new MobRenderer(new CowModel(), 0));
assign( ER_CHICKEN_RENDERER, new ChickenRenderer( new ChickenModel(), 0));
assign( ER_SHEEP_RENDERER, new SheepRenderer(new SheepModel(), new SheepFurModel(), 0));
assign( ER_SKELETON_RENDERER, new HumanoidMobRenderer(new SkeletonModel(), 0.5f));
assign( ER_ZOMBIE_RENDERER, new HumanoidMobRenderer(new ZombieModel(), 0.5f));
assign( ER_CREEPER_RENDERER, new CreeperRenderer());
assign( ER_SPIDER_RENDERER, new SpiderRenderer());
assign( ER_TNT_RENDERER, new TntRenderer());
assign( ER_ARROW_RENDERER, new ArrowRenderer());
assign( ER_PLAYER_RENDERER, new PlayerRenderer(new HumanoidModel(0, 0, 64, 64), 0));
assign( ER_THROWNEGG_RENDERER, new ItemSpriteRenderer(Item::egg->getIcon(0)));
assign( ER_SNOWBALL_RENDERER, new ItemSpriteRenderer(Item::snowBall->getIcon(0)));
assign( ER_PAINTING_RENDERER, new PaintingRenderer());
assign( ER_FALLINGTILE_RENDERER,new FallingTileRenderer());
for (RendererIterator it = _renderers.begin(); it != _renderers.end(); ++it) {
it->second->init(this);
}
}
void EntityRenderDispatcher::destroy()
{
if (instance) {
delete instance;
instance = NULL;
}
}
EntityRenderDispatcher* EntityRenderDispatcher::getInstance()
{
if (!instance)
instance = new EntityRenderDispatcher();
return instance;
}
EntityRenderDispatcher::~EntityRenderDispatcher()
{
std::set<EntityRenderer*> destroyed;
for (RendererCIterator cit = _renderers.begin(); cit != _renderers.end(); ++cit) {
if (destroyed.find(cit->second) == destroyed.end()) {
destroyed.insert(cit->second);
delete cit->second;
}
}
}
void EntityRenderDispatcher::prepare( Level* level, Font* font, Mob* player, Options* options, float a )
{
this->level = level;
this->options = options;
this->cameraEntity = player;
this->_font = font;
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 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;
}
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( Entity* entity, float a )
{
float x = entity->xOld + (entity->x - entity->xOld) * a;
float y = entity->yOld + (entity->y - entity->yOld) * a;
float z = entity->zOld + (entity->z - entity->zOld) * a;
float r = entity->yRotO + (entity->yRot - entity->yRotO) * a;
float br = entity->getBrightness(a);
glColor4f2(br, br, br, 1);
render(entity, x - xOff, y - yOff, z - zOff, r, a);
}
void EntityRenderDispatcher::render( Entity* entity, float x, float y, float z, float rot, float a )
{
EntityRenderer* renderer = getRenderer(entity);
if (renderer != NULL) {
renderer->render(entity, x, y, z, rot, a);
//renderer->postRender(entity, x, y, z, rot, a);
}
}
EntityRenderer* EntityRenderDispatcher::getRenderer( Entity* entity )
{
EntityRendererId rendererId = entity->entityRendererId;
if (rendererId == ER_QUERY_RENDERER)
rendererId = entity->queryEntityRenderer();
return getRenderer(rendererId);
}
EntityRenderer* EntityRenderDispatcher::getRenderer( EntityRendererId rendererId )
{
EntityRenderer* renderer = NULL;
RendererCIterator cit = _renderers.find(rendererId);
if (cit != _renderers.end()) {
renderer = cit->second;
}
return renderer;
}
void EntityRenderDispatcher::setLevel( Level* level )
{
this->level = level;
}
void EntityRenderDispatcher::setMinecraft( Minecraft* minecraft )
{
this->minecraft = minecraft;
}
float EntityRenderDispatcher::distanceToSqr( float x, float y, float z )
{
float xd = x - xPlayer;
float yd = y - yPlayer;
float zd = z - zPlayer;
return xd * xd + yd * yd + zd * zd;
}
Font* EntityRenderDispatcher::getFont()
{
return _font;
}
void EntityRenderDispatcher::onGraphicsReset()
{
for (RendererIterator it = _renderers.begin(); it != _renderers.end(); ++it) {
it->second->onGraphicsReset();
}
}
void EntityRenderDispatcher::assign( EntityRendererId id, EntityRenderer* renderer )
{
_renderers.insert(std::make_pair(id, renderer));
}