package openblocks.client.renderer.tileentity; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.ResourceLocation; import openblocks.client.model.ModelVillage; import openblocks.common.tileentity.TileEntityVillageHighlighter; import openmods.sync.SyncableIntArray; import openmods.utils.BlockUtils; import org.lwjgl.opengl.GL11; public class TileEntityVillageHighlighterRenderer extends TileEntitySpecialRenderer { private static final AxisAlignedBB BOUNDING_BOX = AxisAlignedBB.getBoundingBox(-8, -3, -8, 8, 3, 8); private ModelVillage model = new ModelVillage(); private static final ResourceLocation texture = new ResourceLocation("openblocks", "textures/models/village.png"); @Override public void renderTileEntityAt(TileEntity tileentity, double x, double y, double z, float f) { TileEntityVillageHighlighter villagehighlighter = (TileEntityVillageHighlighter)tileentity; GL11.glPushMatrix(); GL11.glTranslatef((float)x + 0.5F, (float)y + 1.0f, (float)z + 0.5F); if (!villagehighlighter.isRenderedInInventory() && villagehighlighter.isPowered()) { GL11.glPushMatrix(); Tessellator t = Tessellator.instance; SyncableIntArray villages = villagehighlighter.getVillageData(); int[] data = villages.getValue(); for (int i = 0; i < data.length; i += TileEntityVillageHighlighter.VALUES_PER_VILLAGE) { t.startDrawing(0); int radius = data[i]; int vX = data[i + 1]; int vY = data[i + 2]; int vZ = data[i + 3]; int id = data[i + 6]; GL11.glPushMatrix(); GL11.glDisable(GL11.GL_TEXTURE_2D); GL11.glTranslated(vX, vY, vZ); int color = id % 0xFFFFFF; float r = (color >> 16 & 255) / 255.0F; float g = (color >> 8 & 255) / 255.0F; float b = (color & 255) / 255.0F; GL11.glColor4f(r, g, b, 1f); GL11.glPushMatrix(); GL11.glPointSize(4.0F); GL11.glLineWidth(10F); double N = 1500; double ratio = Math.PI * (3 - Math.sqrt(5)); double off = 2 / N; for (int j = 0; j < N; j++) { double py = j * off - 1 + (off / 2); double rad = Math.sqrt(1 - py * py); double phi = j * ratio; double px = Math.cos(phi) * rad; double pz = Math.sin(phi) * rad; t.addVertex(px * radius, py * radius, pz * radius); } t.draw(); GL11.glPopMatrix(); drawBox(BOUNDING_BOX); GL11.glEnable(GL11.GL_TEXTURE_2D); GL11.glPopMatrix(); } GL11.glPopMatrix(); } GL11.glPushMatrix(); GL11.glColor4f(1, 1, 1, 1); GL11.glRotatef(180.0F, 1.0F, 0.0F, 0.0F); GL11.glRotatef(-BlockUtils.getRotationFromOrientation(villagehighlighter.getOrientation()), 0, 1, 0); bindTexture(texture); model.render(villagehighlighter, f); GL11.glPopMatrix(); GL11.glPopMatrix(); } public void drawBox(AxisAlignedBB bb) { Tessellator tessellator = Tessellator.instance; tessellator.startDrawing(3); tessellator.addVertex(bb.minX, bb.minY, bb.minZ); tessellator.addVertex(bb.maxX, bb.minY, bb.minZ); tessellator.addVertex(bb.maxX, bb.minY, bb.maxZ); tessellator.addVertex(bb.minX, bb.minY, bb.maxZ); tessellator.addVertex(bb.minX, bb.minY, bb.minZ); tessellator.draw(); tessellator.startDrawing(3); tessellator.addVertex(bb.minX, bb.maxY, bb.minZ); tessellator.addVertex(bb.maxX, bb.maxY, bb.minZ); tessellator.addVertex(bb.maxX, bb.maxY, bb.maxZ); tessellator.addVertex(bb.minX, bb.maxY, bb.maxZ); tessellator.addVertex(bb.minX, bb.maxY, bb.minZ); tessellator.draw(); tessellator.startDrawing(1); tessellator.addVertex(bb.minX, bb.minY, bb.minZ); tessellator.addVertex(bb.minX, bb.maxY, bb.minZ); tessellator.addVertex(bb.maxX, bb.minY, bb.minZ); tessellator.addVertex(bb.maxX, bb.maxY, bb.minZ); tessellator.addVertex(bb.maxX, bb.minY, bb.maxZ); tessellator.addVertex(bb.maxX, bb.maxY, bb.maxZ); tessellator.addVertex(bb.minX, bb.minY, bb.maxZ); tessellator.addVertex(bb.minX, bb.maxY, bb.maxZ); tessellator.draw(); } }