package openmods.renderer;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.IBlockAccess;
import openmods.Log;
import openmods.block.OpenBlock;
import openmods.geometry.Orientation;
import openmods.renderer.rotations.IRendererSetup;
import openmods.tileentity.OpenTileEntity;
import openmods.utils.CachedFactory;
import openmods.utils.render.RenderUtils;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL12;
public class DefaultBlockRenderer implements IBlockRenderer<Block> {
private final CachedFactory<OpenBlock, TileEntity> inventoryTileEntities = new CachedFactory<OpenBlock, TileEntity>() {
@Override
protected TileEntity create(OpenBlock key) {
return key.createTileEntityForRender();
}
};
@Override
public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) {
if (!(block instanceof OpenBlock)) {
RenderUtils.renderInventoryBlock(renderer, block, 0);
return;
}
final OpenBlock openBlock = (OpenBlock)block;
try {
GL11.glEnable(GL12.GL_RESCALE_NORMAL);
GL11.glRotatef(-90.0F, 0.0F, 1.0F, 0.0F);
if (openBlock.shouldRenderTesrInInventory()) {
TileEntity te = inventoryTileEntities.getOrCreate(openBlock);
if (te instanceof OpenTileEntity) ((OpenTileEntity)te).prepareForInventoryRender(block, metadata);
GL11.glPushAttrib(GL11.GL_TEXTURE_BIT);
GL11.glPushMatrix();
GL11.glTranslated(-0.5, -0.5, -0.5);
TileEntityRendererDispatcher.instance.renderTileEntityAt(te, 0.0D, 0.0D, 0.0D, 0.0F);
GL11.glPopMatrix();
GL11.glPopAttrib();
}
if (openBlock.shouldRenderBlock()) {
final Orientation orientation = openBlock.getInventoryRenderOrientation();
openBlock.setBoundsBasedOnOrientation(orientation);
final int renderMetadata = openBlock.getInventoryRenderMetadata(metadata);
final IRendererSetup setup = openBlock.getRotationMode().getRenderSetup();
final RenderBlocks localRenderer = setup.enter(orientation, renderMetadata, renderer);
RenderUtils.renderInventoryBlock(localRenderer, block, renderMetadata);
setup.exit(localRenderer);
}
} catch (Exception e) {
Log.severe(e, "Error during block '%s' rendering", block.getUnlocalizedName());
}
}
@Override
public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) {
if (!(block instanceof OpenBlock)) return renderer.renderStandardBlock(block, x, y, z);
final OpenBlock openBlock = (OpenBlock)block;
if (openBlock.shouldRenderBlock()) {
final int metadata = world.getBlockMetadata(x, y, z);
final IRendererSetup setup = openBlock.getRotationMode().getRenderSetup();
final Orientation orientation = openBlock.getOrientation(metadata);
final RenderBlocks localRenderer = setup.enter(orientation, metadata, renderer);
boolean wasRendered = localRenderer.renderStandardBlock(openBlock, x, y, z);
setup.exit(localRenderer);
return wasRendered;
}
return false;
}
}