package joshie.harvest.buildings.render; import joshie.harvest.api.buildings.Building; import net.minecraft.block.state.IBlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.RegionRenderCacheBuilder; import net.minecraft.client.renderer.VertexBuffer; import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import java.util.Map.Entry; @SideOnly(Side.CLIENT) public class BuildingRenderer { protected final RegionRenderCacheBuilder renderer; private final BuildingKey key; private BlockPos pos; BuildingRenderer(BuildingAccess world, BuildingKey key) { this.key = key; this.pos = key.getPos(); this.renderer = new RegionRenderCacheBuilder(); setupRender(world); } protected void setupRender(BuildingAccess world) { for (BlockRenderLayer layer: BlockRenderLayer.values()) { VertexBuffer buffer = renderer.getWorldRendererByLayer(layer); buffer.begin(7, DefaultVertexFormats.BLOCK); for (Entry<BlockPos, IBlockState> placeable: world.getBlockMap().entrySet()) { addRender(world, placeable.getValue(), placeable.getKey(), layer, buffer); } } } protected void addRender(IBlockAccess world, IBlockState state, BlockPos pos, BlockRenderLayer layer, VertexBuffer buffer) { if (state.getBlock().canRenderInLayer(state, layer)) { Minecraft.getMinecraft().getBlockRendererDispatcher().renderBlock(state, pos, world, buffer); } } public BuildingRenderer setPosition(BlockPos position) { this.pos = position; return this; } public Building getBuilding() { return key.getBuilding(); } public BlockPos getPos() { return this.pos; } public void draw(BuildingVertexUploader vertexUploader) { GlStateManager.disableAlpha(); vertexUploader.draw(renderer.getWorldRendererByLayer(BlockRenderLayer.SOLID)); GlStateManager.enableAlpha(); vertexUploader.draw(renderer.getWorldRendererByLayer(BlockRenderLayer.CUTOUT_MIPPED)); Minecraft.getMinecraft().getTextureManager().getTexture(TextureMap.LOCATION_BLOCKS_TEXTURE).setBlurMipmap(false, false); vertexUploader.draw(renderer.getWorldRendererByLayer(BlockRenderLayer.CUTOUT)); Minecraft.getMinecraft().getTextureManager().getTexture(TextureMap.LOCATION_BLOCKS_TEXTURE).restoreLastBlurMipmap(); GlStateManager.disableBlend(); GlStateManager.enableCull(); GlStateManager.tryBlendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO); GlStateManager.alphaFunc(516, 0.1F); GlStateManager.enableBlend(); GlStateManager.depthMask(false); Minecraft.getMinecraft().getTextureManager().bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE); GlStateManager.shadeModel(7425); vertexUploader.draw(renderer.getWorldRendererByLayer(BlockRenderLayer.TRANSLUCENT)); GlStateManager.disableBlend(); GlStateManager.depthMask(true); } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; BuildingRenderer renderer = (BuildingRenderer) o; return key != null ? key.equals(renderer.key) : renderer.key == null; } @Override public int hashCode() { return key != null ? key.hashCode() : 0; } }