package sourcecoded.quantum.client.renderer; import com.google.common.collect.HashBiMap; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.particle.EntityFX; import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.world.World; import org.lwjgl.opengl.GL11; import sourcecoded.quantum.api.Point3D; import sourcecoded.quantum.handler.ConfigHandler; import sourcecoded.quantum.util.save.QAWorldSavedData; import java.util.HashMap; import java.util.Map; public enum WorldLabelRenderer { INSTANCE; HashMap<Point3D, String> labels; double renderDistance = 64F; FontRenderer fontrenderer; RenderManager renderManager; public void init() { renderDistance = ConfigHandler.getDouble(ConfigHandler.Properties.BLOCK_LABEL_DISTANCE); } public void update(QAWorldSavedData data, World world) { labels = data.getLabels(world); } public void startRender(float ptt) { Minecraft mc = Minecraft.getMinecraft(); EntityPlayer player = mc.thePlayer; fontrenderer = mc.fontRenderer; renderManager = RenderManager.instance; if (player != null && labels != null) for (Map.Entry<Point3D, String> entry : labels.entrySet()) { String name = entry.getValue(); Point3D point = entry.getKey(); if (player.getDistanceSq(point.getX(), point.getY(), point.getZ()) <= renderDistance) renderTag(name, point, player, ptt); } } public void renderTag(String tag, Point3D point, EntityPlayer player, float ptt) { float f = 1.6F; float f1 = 0.016666668F * f; //Interpolate for clean animation float x = (float) (point.getX() - (player.prevPosX + (player.posX - player.prevPosX) * ptt)); float y = (float) (point.getY() - (player.prevPosY + (player.posY - player.prevPosY) * ptt)); float z = (float) (point.getZ() - (player.prevPosZ + (player.posZ - player.prevPosZ) * ptt)); GL11.glPushMatrix(); GL11.glTranslatef((float)(x + 0.5F), (float)(y + 1.5F), (float)(z + 0.5F)); GL11.glNormal3f(0.0F, 1.0F, 0.0F); GL11.glRotatef(-this.renderManager.playerViewY, 0.0F, 1.0F, 0.0F); GL11.glRotatef(this.renderManager.playerViewX, 1.0F, 0.0F, 0.0F); GL11.glScalef(-f1, -f1, f1); GL11.glDisable(GL11.GL_LIGHTING); GL11.glTranslatef(0.0F, 0.25F / f1, 0.0F); GL11.glDepthMask(false); GL11.glEnable(GL11.GL_BLEND); OpenGlHelper.glBlendFunc(770, 771, 1, 0); Tessellator tessellator = Tessellator.instance; GL11.glDisable(GL11.GL_TEXTURE_2D); tessellator.startDrawingQuads(); int ij = fontrenderer.getStringWidth(tag) / 2; tessellator.setColorRGBA_F(0.0F, 0.0F, 0.0F, 0.25F); tessellator.addVertex((double)(-ij - 1), -1.0D, 0.0D); tessellator.addVertex((double)(-ij - 1), 8.0D, 0.0D); tessellator.addVertex((double)(ij + 1), 8.0D, 0.0D); tessellator.addVertex((double)(ij + 1), -1.0D, 0.0D); tessellator.draw(); GL11.glEnable(GL11.GL_TEXTURE_2D); GL11.glDepthMask(true); fontrenderer.drawString(tag, -fontrenderer.getStringWidth(tag) / 2, 0, 16777215); GL11.glEnable(GL11.GL_LIGHTING); GL11.glDisable(GL11.GL_BLEND); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); GL11.glPopMatrix(); } }