Files
minecraft-pe-0.6.1/src/client/renderer/entity/EntityRenderDispatcher.cpp
Shredder 055f00be49 A bit big of a commit but
Added 3 Fog Choices (Pocket) (Java) (Unknown that was unused)

Restored Java Beta Sky Color code that was unused that depends on biome temperature (choosable using Java fog)

Tile Shadows and Entity Shadows that appear beneath them have been restored and fixed from the unused code, toggleable by turning fancy graphics on or off

Entities will now render flames on themselves when on fire, including the player

Added option to use Java Style Item Count text and position in tweaks

- fileshredder
2026-04-06 01:52:27 +05: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.5));
assign( ER_PIG_RENDERER, new PigRenderer(new PigModel(0.5), NULL/*new PigModel(0.5f)*/, 0.7));
assign( ER_COW_RENDERER, new MobRenderer(new CowModel(), 0.7));
assign( ER_CHICKEN_RENDERER, new ChickenRenderer( new ChickenModel(), 0.3));
assign( ER_SHEEP_RENDERER, new SheepRenderer(new SheepModel(), new SheepFurModel(), 0.7));
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.5));
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));
}