2026-03-01 12:16:08 +08:00
# include "stdafx.h"
# include "PistonPieceRenderer.h"
# include "Lighting.h"
2026-03-03 03:04:10 +08:00
# include "Tesselator.h"
# include "TextureAtlas.h"
2026-03-01 12:16:08 +08:00
# include "TileRenderer.h"
# include "..\Minecraft.World\net.minecraft.world.level.h"
# include "..\Minecraft.World\PistonPieceEntity.h"
# include "..\Minecraft.World\net.minecraft.world.level.tile.h"
2026-03-03 03:04:10 +08:00
ResourceLocation PistonPieceRenderer : : SIGN_LOCATION = ResourceLocation ( TN_ITEM_SIGN ) ;
2026-03-01 12:16:08 +08:00
PistonPieceRenderer : : PistonPieceRenderer ( )
{
2026-03-08 19:08:36 -04:00
tileRenderer = nullptr ;
2026-03-01 12:16:08 +08:00
}
2026-03-02 17:37:16 +07:00
void PistonPieceRenderer : : render ( shared_ptr < TileEntity > _entity , double x , double y , double z , float a , bool setColor , float alpha , bool useCompiled )
2026-03-01 12:16:08 +08:00
{
// 4J - dynamic cast required because we aren't using templates/generics in our version
2026-03-02 17:37:16 +07:00
shared_ptr < PistonPieceEntity > entity = dynamic_pointer_cast < PistonPieceEntity > ( _entity ) ;
2026-03-01 12:16:08 +08:00
Tile * tile = Tile : : tiles [ entity - > getId ( ) ] ;
2026-03-08 19:08:36 -04:00
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
2026-03-01 12:16:08 +08:00
{
Tesselator * t = Tesselator : : getInstance ( ) ;
2026-03-03 03:04:10 +08:00
bindTexture ( & TextureAtlas : : LOCATION_BLOCKS ) ;
2026-03-01 12:16:08 +08:00
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 ( ) ;
2026-03-08 19:08:36 -04:00
t - > offset ( static_cast < float > ( x ) - entity - > x + entity - > getXOff ( a ) , static_cast < float > ( y ) - entity - > y + entity - > getYOff ( a ) , static_cast < float > ( z ) - entity - > z + entity - > getZOff ( a ) ) ;
2026-03-01 12:16:08 +08:00
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
2026-03-08 19:08:36 -04:00
Tile : : pistonExtension - > setOverrideTopTexture ( static_cast < PistonBaseTile * > ( tile ) - > getPlatformTexture ( ) ) ;
2026-03-01 12:16:08 +08:00
tileRenderer - > tesselatePistonArmNoCulling ( Tile : : pistonExtension , entity - > x , entity - > y , entity - > z , entity - > getProgress ( a ) < 0.5f , entity - > getData ( ) ) ;
Tile : : pistonExtension - > clearOverrideTopTexture ( ) ;
2026-03-08 19:08:36 -04:00
t - > offset ( static_cast < float > ( x ) - entity - > x , static_cast < float > ( y ) - entity - > y , static_cast < float > ( z ) - entity - > z ) ;
2026-03-01 12:16:08 +08:00
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 ( ) ;
}
}
2026-03-02 17:37:16 +07:00
2026-03-01 12:16:08 +08:00
void PistonPieceRenderer : : onNewLevel ( Level * level )
{
delete tileRenderer ;
tileRenderer = new TileRenderer ( level ) ;
}