package blusunrize.immersiveengineering.client.render; import blusunrize.immersiveengineering.api.IEProperties; import blusunrize.immersiveengineering.client.ClientUtils; import blusunrize.immersiveengineering.common.IEContent; import blusunrize.immersiveengineering.common.blocks.metal.TileEntityBottlingMachine; import blusunrize.immersiveengineering.common.blocks.metal.TileEntityBottlingMachine.BottlingProcess; import net.minecraft.block.state.IBlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.*; import net.minecraft.client.renderer.block.model.IBakedModel; import net.minecraft.client.renderer.block.model.ItemCameraTransforms; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.client.model.obj.OBJModel.OBJState; import net.minecraftforge.common.property.IExtendedBlockState; import net.minecraftforge.common.property.Properties; import net.minecraftforge.fluids.FluidStack; import org.lwjgl.opengl.GL11; import java.util.Arrays; public class TileRenderBottlingMachine extends TileEntitySpecialRenderer<TileEntityBottlingMachine> { @Override public void renderTileEntityAt(TileEntityBottlingMachine te, double x, double y, double z, float partialTicks, int destroyStage) { if(!te.formed || te.isDummy() || !te.getWorld().isBlockLoaded(te.getPos(), false)) return; //Grab model + correct eextended state final BlockRendererDispatcher blockRenderer = Minecraft.getMinecraft().getBlockRendererDispatcher(); BlockPos blockPos = te.getPos(); IBlockState state = getWorld().getBlockState(blockPos); if(state.getBlock() != IEContent.blockMetalMultiblock) return; state = state.getBlock().getActualState(state, getWorld(), blockPos); state = state.withProperty(IEProperties.DYNAMICRENDER, true); IBakedModel model = blockRenderer.getBlockModelShapes().getModelForState(state); //Initialize Tesselator and VertexBuffer Tessellator tessellator = Tessellator.getInstance(); VertexBuffer worldRenderer = tessellator.getBuffer(); //Outer GL Wrapping, initial translation GlStateManager.pushMatrix(); GlStateManager.translate(x+.5, y+.5, z+.5); if(te.mirrored) GlStateManager.scale(te.facing.getFrontOffsetX()==0?-1:1,1,te.facing.getFrontOffsetZ()==0?-1:1); //Item Displacement float[][] itemDisplays = new float[te.bottlingProcessQueue.size()][]; //Animations float lift = 0; for(int i=0; i<itemDisplays.length; i++) { BottlingProcess process = te.bottlingProcessQueue.get(i); if(process==null || process.processTick==process.maxProcessTick) continue; //+partialTicks float processTimer = ((float)process.processTick)/process.maxProcessTick * 120; float itemX = -1.5f;//-1; float itemY = -.15625f;// -.34375f; float itemZ = 1;//-.9375f; float itemFill = 0;//ClientUtils.mc().thePlayer.ticksExisted%100; //0f; if(processTimer <= 35)//slide { itemX += processTimer/35f*1.5; } else if(processTimer <= 85)//slide { itemX = 0; if(processTimer<=55) lift=(processTimer-35)/20f*.125f; else if(processTimer<=65) { lift = .125f; itemFill = (processTimer-55)/10f; } else { lift =(85-processTimer)/20f*.125f; itemFill = 1; } itemY += lift; lift+=.0625; } else { itemX = (processTimer-85)/35f*1.5f; itemFill = 1; } itemDisplays[i] = new float[]{processTimer,itemX,itemY,itemZ,itemFill}; } ClientUtils.bindAtlas(); GlStateManager.pushMatrix(); GlStateManager.translate(0, lift, 0); renderModelPart(blockRenderer, tessellator, worldRenderer, te.getWorld(), state, model, blockPos, "lift"); GlStateManager.translate(0, -lift, 0); RenderHelper.enableStandardItemLighting(); GlStateManager.popMatrix(); switch(te.facing) { case NORTH: break; case SOUTH: GlStateManager.rotate(180, 0, 1, 0); break; case WEST: GlStateManager.rotate(90, 0, 1, 0); break; case EAST: GlStateManager.rotate(-90, 0, 1, 0); break; } float scale = .0625f; FluidStack fs = te.tanks[0].getFluid(); if(fs!=null) { GlStateManager.pushMatrix(); float level = fs.amount/(float)te.tanks[0].getCapacity(); GlStateManager.translate(-.21875,.376,1.21875); GlStateManager.scale(scale, scale, scale); float h = level*9; ClientUtils.drawRepeatedFluidSprite(fs, 0,0, 7,h); GlStateManager.rotate(90,0,1,0); ClientUtils.drawRepeatedFluidSprite(fs, 0,0, 7,h); GlStateManager.rotate(90,0,1,0); GlStateManager.translate(-7,0,7); ClientUtils.drawRepeatedFluidSprite(fs, 0,0, 7,h); GlStateManager.rotate(90,0,1,0); ClientUtils.drawRepeatedFluidSprite(fs, 0,0, 7,h); GlStateManager.rotate(90,1,0,0); ClientUtils.drawRepeatedFluidSprite(fs, 0,0, 7,7); GlStateManager.translate(0,0,-h); ClientUtils.drawRepeatedFluidSprite(fs, 0,0, 7,7); GlStateManager.scale(1/scale, 1/scale, 1/scale); GlStateManager.translate(0,-1,-1); GlStateManager.popMatrix(); } //DRAW ITEMS HERE for(int i=0; i<itemDisplays.length; i++) if(itemDisplays[i]!=null) { BottlingProcess process = te.bottlingProcessQueue.get(i); if(process==null) continue; ItemStack display = itemDisplays[i][4]==0||process.items[1]==null?process.items[0]:process.items[1]; scale = .4375f; GlStateManager.translate(itemDisplays[i][1], itemDisplays[i][2], itemDisplays[i][3]); GlStateManager.scale(scale, scale, scale); if(itemDisplays[i][4]==0) ClientUtils.mc().getRenderItem().renderItem(process.items[0], ItemCameraTransforms.TransformType.FIXED); else if(itemDisplays[i][4]==1) ClientUtils.mc().getRenderItem().renderItem(display, ItemCameraTransforms.TransformType.FIXED); else { float h0 = -.5f; float h1 = h0+itemDisplays[i][4]; VertexBuffer worldrenderer = tessellator.getBuffer(); GL11.glEnable(GL11.GL_STENCIL_TEST); GlStateManager.colorMask(false, false, false, false); GlStateManager.depthMask(false); GL11.glStencilFunc(GL11.GL_NEVER, 1, 0xFF); GL11.glStencilOp(GL11.GL_REPLACE, GL11.GL_KEEP, GL11.GL_KEEP); GL11.glStencilMask(0xFF); GlStateManager.clear(GL11.GL_STENCIL_BUFFER_BIT); GlStateManager.rotate(90.0F-ClientUtils.mc().getRenderManager().playerViewY, 0.0F, 1.0F, 0.0F); GlStateManager.disableTexture2D(); worldrenderer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION); ClientUtils.renderBox(worldrenderer, -.5,h0,-.5, .5,h1,.5); tessellator.draw(); GlStateManager.enableTexture2D(); GlStateManager.rotate(-(90.0F-ClientUtils.mc().getRenderManager().playerViewY), 0.0F, 1.0F, 0.0F); GlStateManager.colorMask(true, true, true, true); GlStateManager.depthMask(true); GL11.glStencilMask(0x00); GL11.glStencilFunc(GL11.GL_EQUAL, 0, 0xFF); ClientUtils.mc().getRenderItem().renderItem(process.items[0], ItemCameraTransforms.TransformType.FIXED); GL11.glStencilFunc(GL11.GL_EQUAL, 1, 0xFF); ClientUtils.mc().getRenderItem().renderItem(display, ItemCameraTransforms.TransformType.FIXED); GL11.glDisable(GL11.GL_STENCIL_TEST); } GlStateManager.scale(1/scale, 1/scale, 1/scale); GlStateManager.translate(-itemDisplays[i][1], -itemDisplays[i][2], -itemDisplays[i][3]); } GlStateManager.popMatrix(); } public static void renderModelPart(final BlockRendererDispatcher blockRenderer, Tessellator tessellator, VertexBuffer worldRenderer, World world, IBlockState state, IBakedModel model, BlockPos pos, String... parts) { if(state instanceof IExtendedBlockState) state = ((IExtendedBlockState)state).withProperty(Properties.AnimationProperty, new OBJState(Arrays.asList(parts), true)); RenderHelper.disableStandardItemLighting(); GlStateManager.blendFunc(770, 771); GlStateManager.enableBlend(); GlStateManager.disableCull(); GlStateManager.color(1,0,0,1); if(Minecraft.isAmbientOcclusionEnabled()) GlStateManager.shadeModel(7425); else GlStateManager.shadeModel(7424); worldRenderer.begin(GL11.GL_QUADS, DefaultVertexFormats.BLOCK); worldRenderer.setTranslation(-.5 - pos.getX(), -.5 - pos.getY(), -.5 - pos.getZ()); worldRenderer.color(255, 255, 255, 255); blockRenderer.getBlockModelRenderer().renderModel(world, model, state, pos, worldRenderer, true); worldRenderer.setTranslation(0.0D, 0.0D, 0.0D); tessellator.draw(); } }