package mekanism.client.entity; import mekanism.api.Pos3D; import mekanism.client.render.MekanismRenderer; import net.minecraft.client.particle.Particle; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.VertexBuffer; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.entity.Entity; import net.minecraft.util.EnumFacing; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import org.lwjgl.opengl.GL11; @SideOnly(Side.CLIENT) public class ParticleLaser extends Particle { double length; EnumFacing direction; public ParticleLaser(World world, Pos3D start, Pos3D end, EnumFacing dir, double energy) { super(world, (start.xCoord + end.xCoord)/2D, (start.yCoord + end.yCoord)/2D, (start.zCoord+end.zCoord)/2D); particleMaxAge = 5; particleRed = 1; particleGreen = 0; particleBlue = 0; particleAlpha = 0.1F; particleScale = (float) Math.min(energy / 50000, 0.6); length = end.distance(start); direction = dir; particleTexture = MekanismRenderer.laserIcon; } @Override public void renderParticle(VertexBuffer worldRendererIn, Entity entityIn, float partialTicks, float p_180434_4_, float p_180434_5_, float p_180434_6_, float p_180434_7_, float p_180434_8_) { Tessellator tessellator = Tessellator.getInstance(); tessellator.draw(); GlStateManager.pushMatrix(); GL11.glPushAttrib(GL11.GL_POLYGON_BIT + GL11.GL_ENABLE_BIT); GL11.glDisable(GL11.GL_CULL_FACE); MekanismRenderer.glowOn(); float newX = (float)(prevPosX + (posX - prevPosX) * (double)partialTicks - interpPosX); float newY = (float)(prevPosY + (posY - prevPosY) * (double)partialTicks - interpPosY); float newZ = (float)(prevPosZ + (posZ - prevPosZ) * (double)partialTicks - interpPosZ); GlStateManager.translate(newX, newY, newZ); switch(direction) { case UP: case DOWN: default: break; case WEST: case EAST: GlStateManager.rotate(90, 0, 0, 1); break; case NORTH: case SOUTH: GlStateManager.rotate(90, 1, 0, 0); break; } float uMin = particleTexture.getInterpolatedU(0); float uMax = particleTexture.getInterpolatedU(16); float vMin = particleTexture.getInterpolatedV(0); float vMax = particleTexture.getInterpolatedV(16); GlStateManager.rotate(45, 0, 1, 0); worldRendererIn.begin(GL11.GL_QUADS, DefaultVertexFormats.PARTICLE_POSITION_TEX_COLOR_LMAP); worldRendererIn.pos(-particleScale, -length/2, 0).tex(uMin, vMin).color(particleRed, particleGreen, particleBlue, particleAlpha).lightmap(240, 240).endVertex(); worldRendererIn.pos(-particleScale, length/2, 0).tex(uMin, vMax).color(particleRed, particleGreen, particleBlue, particleAlpha).lightmap(240, 240).endVertex(); worldRendererIn.pos(particleScale, length/2, 0).tex(uMax, vMax).color(particleRed, particleGreen, particleBlue, particleAlpha).lightmap(240, 240).endVertex(); worldRendererIn.pos(particleScale, -length/2, 0).tex(uMax, vMin).color(particleRed, particleGreen, particleBlue, particleAlpha).lightmap(240, 240).endVertex(); tessellator.draw(); GlStateManager.rotate(90, 0, 1, 0); worldRendererIn.begin(GL11.GL_QUADS, DefaultVertexFormats.PARTICLE_POSITION_TEX_COLOR_LMAP); worldRendererIn.pos(-particleScale, -length/2, 0).tex(uMin, vMin).color(particleRed, particleGreen, particleBlue, particleAlpha).lightmap(240, 240).endVertex(); worldRendererIn.pos(-particleScale, length/2, 0).tex(uMin, vMax).color(particleRed, particleGreen, particleBlue, particleAlpha).lightmap(240, 240).endVertex(); worldRendererIn.pos(particleScale, length/2, 0).tex(uMax, vMax).color(particleRed, particleGreen, particleBlue, particleAlpha).lightmap(240, 240).endVertex(); worldRendererIn.pos(particleScale, -length/2, 0).tex(uMax, vMin).color(particleRed, particleGreen, particleBlue, particleAlpha).lightmap(240, 240).endVertex(); tessellator.draw(); MekanismRenderer.glowOff(); GL11.glPopAttrib(); GlStateManager.popMatrix(); worldRendererIn.begin(7, DefaultVertexFormats.PARTICLE_POSITION_TEX_COLOR_LMAP); } @Override public int getFXLayer() { return 1; } }