From 2db8e30b1d2151fdde5d08a6c06aef55f0c397d2 Mon Sep 17 00:00:00 2001 From: Foghrye4 Date: Fri, 27 Jan 2017 11:32:28 +0300 Subject: License, readme and stuff --- ihl/explosion/PileTileEntityRender.java | 160 ++++++++++++++++++++++++++++++++ 1 file changed, 160 insertions(+) create mode 100644 ihl/explosion/PileTileEntityRender.java (limited to 'ihl/explosion/PileTileEntityRender.java') diff --git a/ihl/explosion/PileTileEntityRender.java b/ihl/explosion/PileTileEntityRender.java new file mode 100644 index 0000000..ea8ab4f --- /dev/null +++ b/ihl/explosion/PileTileEntityRender.java @@ -0,0 +1,160 @@ +package ihl.explosion; + +import java.nio.IntBuffer; +import java.util.HashMap; +import java.util.Map; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; + +import org.lwjgl.BufferUtils; +import org.lwjgl.opengl.Display; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL30; +import org.lwjgl.util.glu.GLU; + +import ihl.IHLMod; +import ihl.utils.IHLItemRenderer; + +public class PileTileEntityRender extends TileEntitySpecialRenderer { + +private int fb=-1; +private final int textureWidth=64; +private final int textureHeight=64; +private final PileBlockRender pileBlockRender; +public final Map textureIdMap = new HashMap(); +private IntBuffer textureIDBuffer; +private int nextAvailableId = -1; +private boolean framebufferReady = false; +private Minecraft mc; +private final IHLItemRenderer ihlItemRenderer=new IHLItemRenderer(false); +private final Random random = new Random(); + +public PileTileEntityRender(PileBlockRender pileBlockRender1) +{ + pileBlockRender=pileBlockRender1; + mc = Minecraft.getMinecraft(); +} + +public void renderAModelAt(PileTileEntity tile, double x, double y, double z, float f) +{ + ItemStack stack = tile.content; + if(!framebufferReady) + { + this.generateFrameBuffer(); + Minecraft.getMinecraft().entityRenderer.setupCameraTransform(f, 0); + Minecraft.getMinecraft().getFramebuffer().bindFramebuffer(false); + } + else if(stack!=null) + { + long hash = this.pileBlockRender.getItemStackHash(stack); + if(!textureIdMap.containsKey(hash)) + { + textureIdMap.put(hash,textureIDBuffer.get(++nextAvailableId)); + this.preparetexture(nextAvailableId); + this.drawTexture(tile); + Minecraft.getMinecraft().entityRenderer.setupCameraTransform(f, 0); + Minecraft.getMinecraft().getFramebuffer().bindFramebuffer(false); + tile.updateBlockRender(); + } + } +} + +private void generateFrameBuffer() +{ + textureIDBuffer = BufferUtils.createIntBuffer(Short.MAX_VALUE); + GL11.glGenTextures(textureIDBuffer); + fb=GL30.glGenFramebuffers(); + this.preparetexture(0); + if (GL30.glCheckFramebufferStatus(GL30.GL_FRAMEBUFFER) != GL30.GL_FRAMEBUFFER_COMPLETE) + { + IHLMod.log.error("Something went wrong while creating frame buffer!"); + IHLMod.log.error(GL30.glCheckFramebufferStatus(GL30.GL_FRAMEBUFFER)); + } + else + { + IHLMod.log.info("FrameBuffer loaded correctly!"); + } + this.framebufferReady=true; +} + +private void preparetexture(int textureID) +{ + GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fb); + int texture = textureIDBuffer.get(textureID); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, texture); + GL30.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, texture, 0); + GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGB8, textureWidth, textureHeight, 0, GL11.GL_RGB, GL11.GL_UNSIGNED_BYTE, (java.nio.ByteBuffer)null); + GL11.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_CLAMP); + GL11.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_CLAMP); + GL11.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER,GL11.GL_NEAREST); + GL11.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); +} + +private void drawTexture(PileTileEntity tile) +{ + GL11.glViewport(0, 0, textureWidth, textureHeight); + GL11.glClearColor(0f, 0f, 0f, 1f); + GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); + GL11.glMatrixMode(GL11.GL_PROJECTION); + GL11.glLoadIdentity(); + GL11.glOrtho(-1d, 1d, -1d, 1d, 0.05F, this.mc.gameSettings.renderDistanceChunks * 32F); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glLoadIdentity(); + ItemStack stack = tile.content; + GL11.glTranslatef(0, 0, -1f); + GLU.gluLookAt(0, 0, 0, -32f/*x reference*/, 0f/*y reference*/, 0f/*z reference*/, 0.0f, 1.0f, 0.0f); + GL11.glColor4f(1f, 1f, 1f, 1f); + GL11.glRotatef(90f,0,1f,0); + GL11.glScalef(2f, 2f, 2f); + OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 0xf0, 0xf0); +// Tessellator.instance.setBrightness(16711935); + if(stack.getItem() instanceof ItemBlock) + { + Block block = ((ItemBlock)stack.getItem()).field_150939_a; + IIcon icon = block.getIcon(0, stack.getItemDamage()); + double u1 = (double)icon.getInterpolatedU(0D); + double u2 = (double)icon.getInterpolatedU(16.0D); + double v1 = (double)icon.getInterpolatedV(0D); + double v2 = (double)icon.getInterpolatedV(16.0D); + Tessellator tessellator = Tessellator.instance; + bindTexture(TextureMap.locationBlocksTexture); + tessellator.startDrawingQuads(); + tessellator.setColorOpaque_F(1f, 1f, 1f); + tessellator.addVertexWithUV(-0.5,-0.5, 0,u1,v1); + tessellator.addVertexWithUV( 0.5,-0.5, 0,u1,v2); + tessellator.addVertexWithUV( 0.5, 0.5, 0,u2,v2); + tessellator.addVertexWithUV(-0.5, 0.5, 0,u2,v1); + tessellator.draw(); + } + for (int i = 0; i < 128; i++) + { + GL11.glPushMatrix(); + float tx = random.nextFloat()-0.5f; + float ty = random.nextFloat()-0.5f; + GL11.glTranslatef(tx, ty, 0); + this.ihlItemRenderer.doRender(RenderManager.instance,stack, 0f, 0f, 0f); + GL11.glTranslatef(-tx, -ty, 0); + GL11.glPopMatrix(); + } + GL11.glViewport(0, 0, Display.getWidth(), Display.getHeight()); +// IHLRenderUtils.instance.disableAmbientLighting(); +} + +@Override +public void renderTileEntityAt(TileEntity par1TileEntity, double par2, double par4, double par6, float par8) +{ + this.renderAModelAt((PileTileEntity)par1TileEntity, par2, par4, par6, par8); +} + +} \ No newline at end of file -- cgit v1.2.3