package emasher.client;
import cpw.mods.fml.client.FMLClientHandler;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import emasher.EngineersToolbox;
import emasher.api.SocketModule;
import emasher.blocks.BlockSocket;
import emasher.tileentities.TileSocket;
import emasher.modules.ModPressurizer;
import net.minecraft.block.Block;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.client.renderer.RenderHelper;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.texture.TextureMap;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.IIcon;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.IItemRenderer;
import net.minecraftforge.client.IItemRenderer.ItemRenderType;
import net.minecraftforge.client.IItemRenderer.ItemRendererHelper;
import net.minecraftforge.client.MinecraftForgeClient;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.FluidStack;
import org.lwjgl.opengl.GL11;
@SideOnly( Side.CLIENT )
public class SocketRenderer extends TileEntitySpecialRenderer {
public static final SocketRenderer instance = new SocketRenderer();
private final Tessellator tessellator = Tessellator.instance;
private final RenderBlocks blockRender = new RenderBlocks();
@Override
public void renderTileEntityAt( TileEntity t, double x, double y, double z, float counter ) {
TileSocket ts = ( TileSocket ) t;
BlockSocket b = emasher.blocks.Blocks.socket();
SocketModule m;
//Render the inside
FMLClientHandler.instance().getClient().entityRenderer.disableLightmap( 1 );
RenderHelper.disableStandardItemLighting();
GL11.glDisable( GL11.GL_LIGHTING );
Minecraft.getMinecraft().renderEngine.bindTexture( TextureMap.locationBlocksTexture );
CubeRenderBounds bounds = new CubeRenderBounds( 0.05, 0.05, 0.05, 0.95, 0.95, 0.95 );
IIcon[] icons = new IIcon[6];
for( int i = 0; i < 6; i++ ) {
m = ts.getSide( ForgeDirection.getOrientation( i ) );
icons[i] = EngineersToolbox.innerTextures().get( m.getInternalTexture( ts, ts.configs[i], ForgeDirection.getOrientation( i ) ) );
}
CubeRenderer.render( x, y, z, icons, bounds, false );
FMLClientHandler.instance().getClient().entityRenderer.enableLightmap( ( double ) counter );
RenderHelper.enableStandardItemLighting();
Minecraft.getMinecraft().renderEngine.bindTexture( TextureMap.locationItemsTexture );
bounds = new CubeRenderBounds( 0, 0, 0, 1, 1, 1 );
for( int i = 0; i < 6; i++ ) {
icons[i] = emasher.items.Items.blankSide().getIconFromDamage( 0 );
}
CubeRenderer.render( x, y, z, icons, bounds, true );
GL11.glEnable( GL11.GL_LIGHTING );
FMLClientHandler.instance().getClient().entityRenderer.disableLightmap( 1 );
RenderHelper.disableStandardItemLighting();
for( int side = 0; side < 6; side++ ) {
m = ts.getSide( ForgeDirection.getOrientation( side ) );
GL11.glPushMatrix();
GL11.glPushAttrib( GL11.GL_ENABLE_BIT );
GL11.glEnable( GL11.GL_CULL_FACE );
GL11.glDisable( GL11.GL_LIGHTING );
GL11.glEnable( GL11.GL_BLEND );
GL11.glBlendFunc( GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA );
GL11.glTranslatef( ( float ) x, ( float ) y, ( float ) z );
switch(side) {
case 0:
GL11.glRotatef( 270, 1, 0, 0 );
GL11.glRotatef( 180, 0, 0, 1 );
GL11.glTranslatef( -1.0F, 0.0F, -0.001F );
break;
case 1:
GL11.glRotatef( 90, 1, 0, 0 );
GL11.glTranslatef( 0.0F, 0.0F, -1.001F );
break;
case 2:
GL11.glRotatef( 180, 0, 0, 1 );
GL11.glTranslatef( -1.0F, -1.0F, -0.001F );
break;
case 3:
GL11.glRotatef( 180, 0, 0, 1 );
GL11.glRotatef( 180, 0, 1, 0 );
GL11.glTranslatef( 0.0F, -1.0F, -1.001F );
break;
case 4:
GL11.glRotatef( 180, 0, 0, 1 );
GL11.glRotatef( 270, 0, 1, 0 );
GL11.glTranslatef( 0.0F, -1.0F, -0.001F );
break;
case 5:
GL11.glRotatef( 180, 0, 0, 1 );
GL11.glRotatef( 90, 0, 1, 0 );
GL11.glTranslatef( -1.0F, -1.0F, -1.001F );
break;
}
Minecraft.getMinecraft().renderEngine.bindTexture( new ResourceLocation( "textures/atlas/blocks.png" ) );
//Minecraft.getMinecraft().renderEngine.bindTexture(par1ResourceLocation)
//bindTextureByName("/terrain.png");
IIcon[] indIcons = new IIcon[4];
if( m.hasIndicator( 0 ) ) indIcons[0] = b.tankIndicator[ts.tankIndicatorIndex( side )];
if( m.hasIndicator( 1 ) ) indIcons[1] = b.inventoryIndicator[ts.inventoryIndicatorIndex( side )];
if( m.hasIndicator( 2 ) ) indIcons[2] = b.rsIndicator[ts.rsIndicatorIndex( side )];
if( m.hasIndicator( 3 ) ) indIcons[3] = b.latchIndicator[ts.latchIndicatorIndex( side )];
if( !ts.sideLocked[side] ) for( int i = 0; i < 4; i++ ) {
if( m.hasIndicator( i ) ) {
tessellator.startDrawingQuads();
tessellator.addVertexWithUV( 0, 1, 0, indIcons[i].getMinU(), indIcons[i].getMaxV() );
tessellator.addVertexWithUV( 1, 1, 0, indIcons[i].getMaxU(), indIcons[i].getMaxV() );
tessellator.addVertexWithUV( 1, 0, 0, indIcons[i].getMaxU(), indIcons[i].getMinV() );
tessellator.addVertexWithUV( 0, 0, 0, indIcons[i].getMinU(), indIcons[i].getMinV() );
tessellator.draw();
}
}
IIcon[] additional = m.getAdditionalOverlays( ts, ts.configs[side], ForgeDirection.getOrientation( side ) );
//bindTextureByName("/terrain.png");
Minecraft.getMinecraft().renderEngine.bindTexture( new ResourceLocation( "textures/atlas/blocks.png" ) );
for( int i = 0; i < additional.length; i++ ) {
tessellator.startDrawingQuads();
if( side != 0 || !m.flipBottomOverlay() ) {
tessellator.addVertexWithUV( 0, 1, 0, additional[i].getMinU(), additional[i].getMaxV() );
tessellator.addVertexWithUV( 1, 1, 0, additional[i].getMaxU(), additional[i].getMaxV() );
tessellator.addVertexWithUV( 1, 0, 0, additional[i].getMaxU(), additional[i].getMinV() );
tessellator.addVertexWithUV( 0, 0, 0, additional[i].getMinU(), additional[i].getMinV() );
} else {
tessellator.addVertexWithUV( 0, 1, 0, additional[i].getMaxU(), additional[i].getMaxV() );
tessellator.addVertexWithUV( 1, 1, 0, additional[i].getMinU(), additional[i].getMaxV() );
tessellator.addVertexWithUV( 1, 0, 0, additional[i].getMinU(), additional[i].getMinV() );
tessellator.addVertexWithUV( 0, 0, 0, additional[i].getMaxU(), additional[i].getMinV() );
}
tessellator.draw();
}
switch(side) {
case 0:
GL11.glTranslatef( 0.0F, 0.0F, 0.026F );
break;
case 1:
GL11.glTranslatef( 0.0F, 0.0F, 0.026F );
break;
case 2:
GL11.glTranslatef( 0.0F, 0.0F, 0.026F );
break;
case 3:
GL11.glTranslatef( 0.0F, 0.0F, 0.026F );
break;
case 4:
GL11.glTranslatef( 0.0F, 0.0F, 0.026F );
break;
case 5:
GL11.glTranslatef( 0.0F, 0.0F, 0.026F );
break;
}
GL11.glDisable( GL11.GL_BLEND );
int tankToRender = m.getTankToRender( ts, ts.configs[side], ForgeDirection.getOrientation( side ) );
if( tankToRender != -1 && ts.tanks[tankToRender].getFluid() != null ) {
FluidStack ls = ts.tanks[tankToRender].getFluid();
if( ls != null ) {
int cap = 8000;
for( int i = 0; i < 6; i++ ) {
SocketModule m2 = ts.getSide( ForgeDirection.getOrientation( i ) );
if( m2 instanceof ModPressurizer ) {
cap = 32000;
break;
}
}
float scale = ts.tanks[tankToRender].getFluid().amount / ( float ) cap;
Minecraft.getMinecraft().renderEngine.bindTexture( TextureMap.locationBlocksTexture );
if( ls.getFluid() != null && ls.getFluid().getIcon() != null ) {
IIcon fluidIcon = ls.getFluid().getIcon();
GL11.glTranslatef( 0.25F, 0.25F, 0.0005F );
GL11.glScalef( 0.5F, 0.5F, 0.5F );
GL11.glTranslatef( 0.0F, 1.0F - scale, 0.0F );
GL11.glScalef( 1.0F, scale, 1.0F );
tessellator.startDrawingQuads();
tessellator.addVertexWithUV( 0, 1, 0, fluidIcon.getMinU(), fluidIcon.getMaxV() );
tessellator.addVertexWithUV( 1, 1, 0, fluidIcon.getMaxU(), fluidIcon.getMaxV() );
tessellator.addVertexWithUV( 1, 0, 0, fluidIcon.getMaxU(), fluidIcon.getMinV() );
tessellator.addVertexWithUV( 0, 0, 0, fluidIcon.getMinU(), fluidIcon.getMinV() );
tessellator.draw();
GL11.glScalef( 1.0F, 1.0F / scale, 1.0F );
GL11.glTranslatef( 0.0F, -( 1.0F - scale ), 0.0F );
GL11.glScalef( 2.0F, 2.0F, 2.0F );
GL11.glTranslatef( -0.25F, -0.25F, -0.0005F );
}
}
}
GL11.glEnable( GL11.GL_BLEND );
if( m.renderEnergyAmount() ) {
float enScale = ts.configs[side].meta / 100.0f;
GL11.glTranslatef( 0.25F, 0.25F, 0.0005F );
GL11.glScalef( 0.5F, 0.5F, 0.5F );
GL11.glTranslatef( 0.0F, 1.0F - enScale, 0.0F );
GL11.glScalef( 1.0F, enScale, 1.0F );
IIcon energyIcon = EngineersToolbox.innerTextures().get( "eng_toolbox:inner_blue_tile" );
tessellator.startDrawingQuads();
tessellator.addVertexWithUV( 0, 1, 0, energyIcon.getMinU(), energyIcon.getMaxV() );
tessellator.addVertexWithUV( 1, 1, 0, energyIcon.getMaxU(), energyIcon.getMaxV() );
tessellator.addVertexWithUV( 1, 0, 0, energyIcon.getMaxU(), energyIcon.getMinV() );
tessellator.addVertexWithUV( 0, 0, 0, energyIcon.getMinU(), energyIcon.getMinV() );
tessellator.draw();
GL11.glScalef( 1.0F, 1.0F / enScale, 1.0F );
GL11.glTranslatef( 0.0F, -( 1.0F - enScale ), 0.0F );
GL11.glScalef( 2.0F, 2.0F, 2.0F );
GL11.glTranslatef( -0.25F, -0.25F, -0.0005F );
}
String s = m.getTextToRender( ts, ts.configs[side], ForgeDirection.getOrientation( side ) );
GL11.glTranslatef( 0.25F, 0.25F, 0.0F );
GL11.glScalef( 0.01F, 0.01F, 1 );
if( s != null )
Minecraft.getMinecraft().fontRenderer.drawString( s, -Minecraft.getMinecraft().fontRenderer.getStringWidth( s ) / 2, 2, -1 );
GL11.glScalef( 100, 100, 1 );
ItemStack theStack = m.getItemToRender( ts, ts.configs[side], ForgeDirection.getOrientation( side ) );
if( theStack != null ) {
Item theItem = theStack.getItem();
GL11.glScalef( 0.5F, 0.5F, 0.5F );
IItemRenderer customRenderer = MinecraftForgeClient.getItemRenderer( theStack, ItemRenderType.INVENTORY );
boolean isBlock = false;
if( Item.getIdFromItem( theStack.getItem() ) < 4096 && Block.getBlockFromItem( theStack.getItem() ) != null && !Block.getBlockFromItem( theStack.getItem() ).getUnlocalizedName().equals( "tile.ForgeFiller" ) )
isBlock = true;
if( isBlock && RenderBlocks.renderItemIn3d( Block.getBlockFromItem( theItem ).getRenderType() ) || customRenderer != null ) {
Minecraft.getMinecraft().renderEngine.bindTexture( new ResourceLocation( "textures/atlas/blocks.png" ) );
boolean usesHelper = customRenderer == null ? true : customRenderer.shouldUseRenderHelper( ItemRenderType.INVENTORY, theStack, ItemRendererHelper.INVENTORY_BLOCK );
int color = theItem.getColorFromItemStack( theStack, 0 );
float r = ( float ) ( color >> 16 & 255 ) / 255.0F;
float g = ( float ) ( color >> 8 & 255 ) / 255.0F;
float bl = ( float ) ( color & 255 ) / 255.0F;
GL11.glColor4f( r, g, bl, 1 );
GL11.glTranslatef( 0.25F, 0.25F, 0.0F );
GL11.glScalef( 0.5F, 0.5F, 0.5F );
if( usesHelper ) {
GL11.glScalef( 1, 1, 0.0001F );
GL11.glTranslatef( 0.5F, 0.5F, 0 );
GL11.glRotatef( 210, 1, 0, 0 );
GL11.glRotatef( -45, 0, 1, 0 );
} else {
GL11.glTranslatef( 0, 0, -3 );
}
if( usesHelper ) blockRender.useInventoryTint = true;
if( customRenderer != null ) {
customRenderer.renderItem( ItemRenderType.INVENTORY, theStack, blockRender );
} else {
blockRender.renderBlockAsItem( Block.getBlockFromItem( theStack.getItem() ), theStack.getItemDamage(), 1 );
}
} else {
Minecraft.getMinecraft().renderEngine.bindTexture( theStack.getItemSpriteNumber() == 0 ? TextureMap.locationBlocksTexture : TextureMap.locationItemsTexture );
if( theItem.requiresMultipleRenderPasses() ) {
int passes = theItem.getRenderPasses( theStack.getItemDamage() );
for( int i = 0; i < passes; i++ ) {
Minecraft.getMinecraft().renderEngine.bindTexture( theStack.getItemSpriteNumber() == 0 ? TextureMap.locationBlocksTexture : TextureMap.locationItemsTexture );
IIcon itemIcon = theItem.getIconFromDamageForRenderPass( theStack.getItemDamage(), i );
if( itemIcon != null ) {
tessellator.startDrawingQuads();
tessellator.addVertexWithUV( 0, 1, 0, itemIcon.getMinU(), itemIcon.getMaxV() );
tessellator.addVertexWithUV( 1, 1, 0, itemIcon.getMaxU(), itemIcon.getMaxV() );
tessellator.addVertexWithUV( 1, 0, 0, itemIcon.getMaxU(), itemIcon.getMinV() );
tessellator.addVertexWithUV( 0, 0, 0, itemIcon.getMinU(), itemIcon.getMinV() );
tessellator.draw();
} else {
// Log an error, But don't crash the game... Hopefully...
}
}
} else {
IIcon itemIcon = theItem.getIcon( theStack, 0 );
if( itemIcon != null ) {
tessellator.startDrawingQuads();
tessellator.addVertexWithUV( 0, 1, 0, itemIcon.getMinU(), itemIcon.getMaxV() );
tessellator.addVertexWithUV( 1, 1, 0, itemIcon.getMaxU(), itemIcon.getMaxV() );
tessellator.addVertexWithUV( 1, 0, 0, itemIcon.getMaxU(), itemIcon.getMinV() );
tessellator.addVertexWithUV( 0, 0, 0, itemIcon.getMinU(), itemIcon.getMinV() );
tessellator.draw();
}
}
}
}
FMLClientHandler.instance().getClient().entityRenderer.enableLightmap( 1 );
RenderHelper.enableStandardItemLighting();
GL11.glDisable( GL11.GL_CULL_FACE );
GL11.glEnable( GL11.GL_LIGHTING );
GL11.glPopAttrib();
GL11.glPopMatrix();
}
FMLClientHandler.instance().getClient().entityRenderer.enableLightmap( ( double ) counter );
RenderHelper.enableStandardItemLighting();
//Do custom rendering for each module
ForgeDirection d;
SocketModule module;
for( int i = 0; i < 6; i++ ) {
d = ForgeDirection.getOrientation( i );
module = ts.getSide( d );
module.doCustomRendering( ts, ts.getConfigForSide( d ), d, tessellator, blockRender );
}
}
}