mirror of
https://github.com/4jcraft/4jcraft.git
synced 2026-04-24 13:23:37 +00:00
93 lines
3.9 KiB
C++
93 lines
3.9 KiB
C++
#include "PistonPieceRenderer.h"
|
|
|
|
#include <memory>
|
|
|
|
#include "platform/renderer/renderer.h"
|
|
|
|
#include "minecraft/client/Lighting.h"
|
|
#include "minecraft/client/renderer/Tesselator.h"
|
|
#include "minecraft/client/renderer/Textures.h"
|
|
#include "minecraft/client/renderer/TileRenderer.h"
|
|
#include "minecraft/client/renderer/texture/TextureAtlas.h"
|
|
#include "minecraft/client/resources/ResourceLocation.h"
|
|
#include "minecraft/world/level/Level.h"
|
|
#include "minecraft/world/level/tile/Tile.h"
|
|
#include "minecraft/world/level/tile/entity/PistonPieceTileEntity.h"
|
|
#include "minecraft/world/level/tile/entity/TileEntity.h"
|
|
#include "minecraft/world/level/tile/piston/PistonBaseTile.h"
|
|
#include "minecraft/world/level/tile/piston/PistonExtensionTile.h"
|
|
|
|
ResourceLocation PistonPieceRenderer::SIGN_LOCATION =
|
|
ResourceLocation(TN_ITEM_SIGN);
|
|
|
|
PistonPieceRenderer::PistonPieceRenderer() { tileRenderer = nullptr; }
|
|
|
|
void PistonPieceRenderer::render(std::shared_ptr<TileEntity> _entity, double x,
|
|
double y, double z, float a, bool setColor,
|
|
float alpha, bool useCompiled) {
|
|
// 4J - dynamic cast required because we aren't using templates/generics in
|
|
// our version
|
|
std::shared_ptr<PistonPieceEntity> entity =
|
|
std::dynamic_pointer_cast<PistonPieceEntity>(_entity);
|
|
|
|
Tile* tile = Tile::tiles[entity->getId()];
|
|
if (tile != nullptr &&
|
|
entity->getProgress(a) <=
|
|
1) // 4J - changed condition from < to <= as our chunk update is
|
|
// async to main thread and so we can have to render these with
|
|
// progress of 1
|
|
{
|
|
Tesselator* t = Tesselator::getInstance();
|
|
bindTexture(&TextureAtlas::LOCATION_BLOCKS);
|
|
|
|
Lighting::turnOff();
|
|
glColor4f(1, 1, 1,
|
|
1); // 4J added - this wouldn't be needed in real opengl as
|
|
// the block render has vertex colours and so this isn't
|
|
// use, but our pretend gl always modulates with this
|
|
|
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
glEnable(GL_BLEND);
|
|
glDisable(GL_CULL_FACE);
|
|
|
|
t->begin();
|
|
|
|
t->offset((float)x - entity->x + entity->getXOff(a),
|
|
(float)y - entity->y + entity->getYOff(a),
|
|
(float)z - entity->z + entity->getZOff(a));
|
|
t->color(1, 1, 1);
|
|
if (tile == Tile::pistonExtension && entity->getProgress(a) < 0.5f) {
|
|
// extending arms may appear through the base block
|
|
tileRenderer->tesselatePistonArmNoCulling(tile, entity->x,
|
|
entity->y, entity->z,
|
|
false, entity->getData());
|
|
} else if (entity->isSourcePiston() && !entity->isExtending()) {
|
|
// special case for withdrawing the arm back into the base
|
|
Tile::pistonExtension->setOverrideTopTexture(
|
|
((PistonBaseTile*)tile)->getPlatformTexture());
|
|
tileRenderer->tesselatePistonArmNoCulling(
|
|
Tile::pistonExtension, entity->x, entity->y, entity->z,
|
|
entity->getProgress(a) < 0.5f, entity->getData());
|
|
Tile::pistonExtension->clearOverrideTopTexture();
|
|
|
|
t->offset((float)x - entity->x, (float)y - entity->y,
|
|
(float)z - entity->z);
|
|
tileRenderer->tesselatePistonBaseForceExtended(
|
|
tile, entity->x, entity->y, entity->z, entity->getData());
|
|
} else {
|
|
tileRenderer->tesselateInWorldNoCulling(tile, entity->x, entity->y,
|
|
entity->z,
|
|
entity->getData(), entity);
|
|
}
|
|
t->offset(0, 0, 0);
|
|
t->end();
|
|
|
|
Lighting::turnOn();
|
|
}
|
|
}
|
|
|
|
void PistonPieceRenderer::onNewLevel(Level* level) {
|
|
delete tileRenderer;
|
|
tileRenderer = new TileRenderer(level);
|
|
}
|