public static void drawGradientRect(
     int x, int y, float z, int toX, int toY, Color color, Color colorFade) {
   GL11.glDisable(GL11.GL_TEXTURE_2D);
   GL11.glEnable(GL11.GL_BLEND);
   GL11.glDisable(GL11.GL_ALPHA_TEST);
   GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
   GL11.glShadeModel(GL11.GL_SMOOTH);
   Tessellator tes = Tessellator.getInstance();
   VertexBuffer vb = tes.getBuffer();
   vb.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_COLOR);
   vb.pos(toX, y, z)
       .color(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha())
       .endVertex();
   vb.pos(x, y, z)
       .color(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha())
       .endVertex();
   vb.pos(x, toY, z)
       .color(colorFade.getRed(), colorFade.getGreen(), colorFade.getBlue(), colorFade.getAlpha())
       .endVertex();
   vb.pos(toX, toY, z)
       .color(colorFade.getRed(), colorFade.getGreen(), colorFade.getBlue(), colorFade.getAlpha())
       .endVertex();
   tes.draw();
   GL11.glShadeModel(GL11.GL_FLAT);
   GL11.glDisable(GL11.GL_BLEND);
   GL11.glEnable(GL11.GL_ALPHA_TEST);
   GL11.glEnable(GL11.GL_TEXTURE_2D);
 }
  public static void renderFacingQuad(
      double px,
      double py,
      double pz,
      float partialTicks,
      float scale,
      float angle,
      double u,
      double v,
      double uLength,
      double vLength) {
    float arX = ActiveRenderInfo.getRotationX();
    float arZ = ActiveRenderInfo.getRotationZ();
    float arYZ = ActiveRenderInfo.getRotationYZ();
    float arXY = ActiveRenderInfo.getRotationXY();
    float arXZ = ActiveRenderInfo.getRotationXZ();

    Entity e = Minecraft.getMinecraft().getRenderViewEntity();
    if (e == null) {
      e = Minecraft.getMinecraft().thePlayer;
    }
    double iPX = e.prevPosX + (e.posX - e.prevPosX) * partialTicks;
    double iPY = e.prevPosY + (e.posY - e.prevPosY) * partialTicks;
    double iPZ = e.prevPosZ + (e.posZ - e.prevPosZ) * partialTicks;

    Vector3 v1 =
        new Vector3(-arX * scale - arYZ * scale, -arXZ * scale, -arZ * scale - arXY * scale);
    Vector3 v2 =
        new Vector3(-arX * scale + arYZ * scale, arXZ * scale, -arZ * scale + arXY * scale);
    Vector3 v3 = new Vector3(arX * scale + arYZ * scale, arXZ * scale, arZ * scale + arXY * scale);
    Vector3 v4 = new Vector3(arX * scale - arYZ * scale, -arXZ * scale, arZ * scale - arXY * scale);
    if (angle != 0.0F) {
      Vector3 pvec = new Vector3(iPX, iPY, iPZ);
      Vector3 tvec = new Vector3(px, py, pz);
      Vector3 qvec = pvec.subtract(tvec).normalize();
      Vector3.Quat q = Vector3.Quat.aroundAxis(qvec, angle);
      q.rotate(v1);
      q.rotate(v2);
      q.rotate(v3);
      q.rotate(v4);
    }
    Tessellator t = Tessellator.getInstance();
    VertexBuffer vb = t.getBuffer();
    vb.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX);
    vb.pos(px + v1.getX() - iPX, py + v1.getY() - iPY, pz + v1.getZ() - iPZ)
        .tex(u, v + vLength)
        .endVertex();
    vb.pos(px + v2.getX() - iPX, py + v2.getY() - iPY, pz + v2.getZ() - iPZ)
        .tex(u + uLength, v + vLength)
        .endVertex();
    vb.pos(px + v3.getX() - iPX, py + v3.getY() - iPY, pz + v3.getZ() - iPZ)
        .tex(u + uLength, v)
        .endVertex();
    vb.pos(px + v4.getX() - iPX, py + v4.getY() - iPY, pz + v4.getZ() - iPZ).tex(u, v).endVertex();
    t.draw();
  }
  public static void renderAngleRotatedTexturedRect(
      Vector3 renderOffset,
      Vector3 axis,
      double angleRad,
      double scale,
      double u,
      double v,
      double uLength,
      double vLength,
      float partialTicks) {
    GL11.glPushMatrix();
    removeStandartTranslationFromTESRMatrix(partialTicks);

    Vector3 renderStart = axis.clone().perpendicular().rotate(angleRad, axis).normalize();
    Tessellator tes = Tessellator.getInstance();
    VertexBuffer buf = tes.getBuffer();

    buf.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX);

    Vector3 vec =
        renderStart
            .clone()
            .rotate(Math.toRadians(90), axis)
            .normalize()
            .multiply(scale)
            .add(renderOffset);
    buf.pos(vec.getX(), vec.getY(), vec.getZ()).tex(u, v + vLength).endVertex();

    vec = renderStart.clone().multiply(-1).normalize().multiply(scale).add(renderOffset);
    buf.pos(vec.getX(), vec.getY(), vec.getZ()).tex(u + uLength, v + vLength).endVertex();

    vec =
        renderStart
            .clone()
            .rotate(Math.toRadians(270), axis)
            .normalize()
            .multiply(scale)
            .add(renderOffset);
    buf.pos(vec.getX(), vec.getY(), vec.getZ()).tex(u + uLength, v).endVertex();

    vec = renderStart.clone().normalize().multiply(scale).add(renderOffset);
    buf.pos(vec.getX(), vec.getY(), vec.getZ()).tex(u, v).endVertex();

    tes.draw();

    GL11.glPopMatrix();
  }
  public static void renderLightRayEffects(
      double x,
      double y,
      double z,
      Color effectColor,
      long seed,
      int continuousTick,
      int dstJump,
      float scale,
      int countFancy,
      int countNormal) {
    rand.setSeed(seed);
    GL11.glPushMatrix();
    GL11.glTranslated(x, y, z);

    int fancy_count =
        !FMLClientHandler.instance().getClient().gameSettings.fancyGraphics
            ? countNormal
            : countFancy;

    Tessellator tes = Tessellator.getInstance();
    VertexBuffer vb = tes.getBuffer();

    RenderHelper.disableStandardItemLighting();
    float f1 = continuousTick / 400.0F;
    float f2 = 0.4F;

    GL11.glDisable(GL11.GL_TEXTURE_2D);
    GL11.glShadeModel(GL11.GL_SMOOTH);
    GL11.glEnable(GL11.GL_BLEND);
    GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE);
    GL11.glDisable(GL11.GL_ALPHA_TEST);
    GL11.glDepthMask(false);
    GL11.glPushMatrix();
    for (int i = 0; i < fancy_count; i++) {
      GL11.glRotatef(rand.nextFloat() * 360.0F, 1.0F, 0.0F, 0.0F);
      GL11.glRotatef(rand.nextFloat() * 360.0F, 0.0F, 1.0F, 0.0F);
      GL11.glRotatef(rand.nextFloat() * 360.0F, 0.0F, 0.0F, 1.0F);
      GL11.glRotatef(rand.nextFloat() * 360.0F, 1.0F, 0.0F, 0.0F);
      GL11.glRotatef(rand.nextFloat() * 360.0F, 0.0F, 1.0F, 0.0F);
      GL11.glRotatef(rand.nextFloat() * 360.0F + f1 * 360.0F, 0.0F, 0.0F, 1.0F);
      vb.begin(GL11.GL_TRIANGLE_FAN, DefaultVertexFormats.POSITION_COLOR);
      float fa = rand.nextFloat() * 20.0F + 5.0F + f2 * 10.0F;
      float f4 = rand.nextFloat() * 2.0F + 1.0F + f2 * 2.0F;
      fa /= 30.0F / (Math.min(dstJump, 10 * scale) / 10.0F);
      f4 /= 30.0F / (Math.min(dstJump, 10 * scale) / 10.0F);
      vb.pos(0, 0, 0)
          .color(
              effectColor.getRed(),
              effectColor.getGreen(),
              effectColor.getBlue(),
              (int) (255.0F * (1.0F - f2)))
          .endVertex();
      vb.pos(-0.7D * f4, fa, -0.5F * f4)
          .color(effectColor.getRed(), effectColor.getGreen(), effectColor.getBlue(), 0)
          .endVertex();
      vb.pos(0.7D * f4, fa, -0.5F * f4)
          .color(effectColor.getRed(), effectColor.getGreen(), effectColor.getBlue(), 0)
          .endVertex();
      vb.pos(0.0D, fa, 1.0F * f4)
          .color(effectColor.getRed(), effectColor.getGreen(), effectColor.getBlue(), 0)
          .endVertex();
      vb.pos(-0.7D * f4, fa, -0.5F * f4)
          .color(effectColor.getRed(), effectColor.getGreen(), effectColor.getBlue(), 0)
          .endVertex();
      tes.draw();
    }
    GL11.glPopMatrix();
    GL11.glDepthMask(true);
    GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
    GL11.glDisable(GL11.GL_BLEND);
    GL11.glShadeModel(GL11.GL_FLAT);
    GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
    GL11.glEnable(GL11.GL_TEXTURE_2D);
    GL11.glEnable(GL11.GL_ALPHA_TEST);
    RenderHelper.enableStandardItemLighting();

    GL11.glPopMatrix();
  }
  public static void renderFacingQuadVB(
      VertexBuffer vb,
      double px,
      double py,
      double pz,
      float partialTicks,
      float scale,
      float angle,
      double u,
      double v,
      double uLength,
      double vLength,
      float colorRed,
      float colorGreen,
      float colorBlue,
      float alpha) {
    float arX = ActiveRenderInfo.getRotationX();
    float arZ = ActiveRenderInfo.getRotationZ();
    float arYZ = ActiveRenderInfo.getRotationYZ();
    float arXY = ActiveRenderInfo.getRotationXY();
    float arXZ = ActiveRenderInfo.getRotationXZ();

    Entity e = Minecraft.getMinecraft().getRenderViewEntity();
    if (e == null) {
      e = Minecraft.getMinecraft().thePlayer;
    }
    double iPX = e.prevPosX + (e.posX - e.prevPosX) * partialTicks;
    double iPY = e.prevPosY + (e.posY - e.prevPosY) * partialTicks;
    double iPZ = e.prevPosZ + (e.posZ - e.prevPosZ) * partialTicks;

    Vector3 v1 =
        new Vector3(-arX * scale - arYZ * scale, -arXZ * scale, -arZ * scale - arXY * scale);
    Vector3 v2 =
        new Vector3(-arX * scale + arYZ * scale, arXZ * scale, -arZ * scale + arXY * scale);
    Vector3 v3 = new Vector3(arX * scale + arYZ * scale, arXZ * scale, arZ * scale + arXY * scale);
    Vector3 v4 = new Vector3(arX * scale - arYZ * scale, -arXZ * scale, arZ * scale - arXY * scale);
    if (angle != 0.0F) {
      Vector3 pvec = new Vector3(iPX, iPY, iPZ);
      Vector3 tvec = new Vector3(px, py, pz);
      Vector3 qvec = pvec.subtract(tvec).normalize();
      Vector3.Quat q = Vector3.Quat.aroundAxis(qvec, angle);
      q.rotate(v1);
      q.rotate(v2);
      q.rotate(v3);
      q.rotate(v4);
    }
    vb.pos(px + v1.getX() - iPX, py + v1.getY() - iPY, pz + v1.getZ() - iPZ)
        .tex(u, v + vLength)
        .color(colorRed, colorGreen, colorBlue, alpha)
        .endVertex();
    vb.pos(px + v2.getX() - iPX, py + v2.getY() - iPY, pz + v2.getZ() - iPZ)
        .tex(u + uLength, v + vLength)
        .color(colorRed, colorGreen, colorBlue, alpha)
        .endVertex();
    vb.pos(px + v3.getX() - iPX, py + v3.getY() - iPY, pz + v3.getZ() - iPZ)
        .tex(u + uLength, v)
        .color(colorRed, colorGreen, colorBlue, alpha)
        .endVertex();
    vb.pos(px + v4.getX() - iPX, py + v4.getY() - iPY, pz + v4.getZ() - iPZ)
        .tex(u, v)
        .color(colorRed, colorGreen, colorBlue, alpha)
        .endVertex();
  }
  public static void drawCube(AxisAlignedBB cube) {
    double xa = cube.minX;
    double xb = cube.maxX;
    double ya = cube.minY;
    double yb = cube.maxY;
    double za = cube.minZ;
    double zb = cube.maxZ;

    Tessellator tessellator = Tessellator.getInstance();
    VertexBuffer worldRenderer = Tessellator.getInstance().getBuffer();
    worldRenderer.begin(GL11.GL_LINE_STRIP, DefaultVertexFormats.POSITION_COLOR);
    worldRenderer.pos(xa, ya, za).color(1F, 1F, 0.0F, 1.0F).endVertex();
    worldRenderer.pos(xa, yb, za).color(1F, 1F, 0.0F, 1.0F).endVertex();
    worldRenderer.pos(xb, yb, za).color(1F, 1F, 0.0F, 1.0F).endVertex();
    worldRenderer.pos(xb, ya, za).color(1F, 1F, 0.0F, 1.0F).endVertex();
    worldRenderer.pos(xa, ya, za).color(1F, 1F, 0.0F, 1.0F).endVertex();

    worldRenderer.pos(xa, ya, zb).color(1F, 1F, 0.0F, 1.0F).endVertex();
    worldRenderer.pos(xa, yb, zb).color(1F, 1F, 0.0F, 1.0F).endVertex();
    worldRenderer.pos(xb, yb, zb).color(1F, 1F, 0.0F, 1.0F).endVertex();
    worldRenderer.pos(xb, ya, zb).color(1F, 1F, 0.0F, 1.0F).endVertex();
    worldRenderer.pos(xa, ya, zb).color(1F, 1F, 0.0F, 1.0F).endVertex();
    tessellator.draw();

    worldRenderer.begin(GL11.GL_LINES, DefaultVertexFormats.POSITION_COLOR);
    worldRenderer.pos(xa, ya, za).color(1F, 1F, 0.0F, 1.0F).endVertex();
    worldRenderer.pos(xa, ya, zb).color(1F, 1F, 0.0F, 1.0F).endVertex();

    worldRenderer.pos(xa, yb, za).color(1F, 1F, 0.0F, 1.0F).endVertex();
    worldRenderer.pos(xa, yb, zb).color(1F, 1F, 0.0F, 1.0F).endVertex();

    worldRenderer.pos(xb, ya, za).color(1F, 1F, 0.0F, 1.0F).endVertex();
    worldRenderer.pos(xb, ya, zb).color(1F, 1F, 0.0F, 1.0F).endVertex();

    worldRenderer.pos(xb, yb, za).color(1F, 1F, 0.0F, 1.0F).endVertex();
    worldRenderer.pos(xb, yb, zb).color(1F, 1F, 0.0F, 1.0F).endVertex();
    tessellator.draw();
  }
  /** Renders the desired {@code T} type Entity. */
  public void doRender(
      EntityFishHook entity, double x, double y, double z, float entityYaw, float partialTicks) {
    GlStateManager.pushMatrix();
    GlStateManager.translate((float) x, (float) y, (float) z);
    GlStateManager.enableRescaleNormal();
    GlStateManager.scale(0.5F, 0.5F, 0.5F);
    this.bindEntityTexture(entity);
    Tessellator tessellator = Tessellator.getInstance();
    VertexBuffer vertexbuffer = tessellator.getBuffer();
    int i = 1;
    int j = 2;
    float f = 0.0625F;
    float f1 = 0.125F;
    float f2 = 0.125F;
    float f3 = 0.1875F;
    float f4 = 1.0F;
    float f5 = 0.5F;
    float f6 = 0.5F;
    GlStateManager.rotate(180.0F - this.renderManager.playerViewY, 0.0F, 1.0F, 0.0F);
    GlStateManager.rotate(
        (float) (this.renderManager.options.thirdPersonView == 2 ? -1 : 1)
            * -this.renderManager.playerViewX,
        1.0F,
        0.0F,
        0.0F);

    if (this.renderOutlines) {
      GlStateManager.enableColorMaterial();
      GlStateManager.enableOutlineMode(this.getTeamColor(entity));
    }

    vertexbuffer.begin(7, DefaultVertexFormats.POSITION_TEX_NORMAL);
    vertexbuffer.pos(-0.5D, -0.5D, 0.0D).tex(0.0625D, 0.1875D).normal(0.0F, 1.0F, 0.0F).endVertex();
    vertexbuffer.pos(0.5D, -0.5D, 0.0D).tex(0.125D, 0.1875D).normal(0.0F, 1.0F, 0.0F).endVertex();
    vertexbuffer.pos(0.5D, 0.5D, 0.0D).tex(0.125D, 0.125D).normal(0.0F, 1.0F, 0.0F).endVertex();
    vertexbuffer.pos(-0.5D, 0.5D, 0.0D).tex(0.0625D, 0.125D).normal(0.0F, 1.0F, 0.0F).endVertex();
    tessellator.draw();

    if (this.renderOutlines) {
      GlStateManager.disableOutlineMode();
      GlStateManager.disableColorMaterial();
    }

    GlStateManager.disableRescaleNormal();
    GlStateManager.popMatrix();

    if (entity.angler != null && !this.renderOutlines) {
      int k = entity.angler.getPrimaryHand() == EnumHandSide.RIGHT ? 1 : -1;
      float f7 = entity.angler.getSwingProgress(partialTicks);
      float f8 = MathHelper.sin(MathHelper.sqrt_float(f7) * (float) Math.PI);
      float f9 =
          (entity.angler.prevRenderYawOffset
                  + (entity.angler.renderYawOffset - entity.angler.prevRenderYawOffset)
                      * partialTicks)
              * 0.017453292F;
      double d0 = (double) MathHelper.sin(f9);
      double d1 = (double) MathHelper.cos(f9);
      double d2 = (double) k * 0.35D;
      double d3 = 0.8D;
      double d4;
      double d5;
      double d6;
      double d7;

      if ((this.renderManager.options == null || this.renderManager.options.thirdPersonView <= 0)
          && entity.angler == Minecraft.getMinecraft().thePlayer) {
        Vec3d vec3d = new Vec3d((double) k * -0.36D, -0.05D, 0.4D);
        vec3d =
            vec3d.rotatePitch(
                -(entity.angler.prevRotationPitch
                        + (entity.angler.rotationPitch - entity.angler.prevRotationPitch)
                            * partialTicks)
                    * 0.017453292F);
        vec3d =
            vec3d.rotateYaw(
                -(entity.angler.prevRotationYaw
                        + (entity.angler.rotationYaw - entity.angler.prevRotationYaw)
                            * partialTicks)
                    * 0.017453292F);
        vec3d = vec3d.rotateYaw(f8 * 0.5F);
        vec3d = vec3d.rotatePitch(-f8 * 0.7F);
        d4 =
            entity.angler.prevPosX
                + (entity.angler.posX - entity.angler.prevPosX) * (double) partialTicks
                + vec3d.xCoord;
        d5 =
            entity.angler.prevPosY
                + (entity.angler.posY - entity.angler.prevPosY) * (double) partialTicks
                + vec3d.yCoord;
        d6 =
            entity.angler.prevPosZ
                + (entity.angler.posZ - entity.angler.prevPosZ) * (double) partialTicks
                + vec3d.zCoord;
        d7 = (double) entity.angler.getEyeHeight();
      } else {
        d4 =
            entity.angler.prevPosX
                + (entity.angler.posX - entity.angler.prevPosX) * (double) partialTicks
                - d1 * d2
                - d0 * 0.8D;
        d5 =
            entity.angler.prevPosY
                + (double) entity.angler.getEyeHeight()
                + (entity.angler.posY - entity.angler.prevPosY) * (double) partialTicks
                - 0.45D;
        d6 =
            entity.angler.prevPosZ
                + (entity.angler.posZ - entity.angler.prevPosZ) * (double) partialTicks
                - d0 * d2
                + d1 * 0.8D;
        d7 = entity.angler.isSneaking() ? -0.1875D : 0.0D;
      }

      double d13 = entity.prevPosX + (entity.posX - entity.prevPosX) * (double) partialTicks;
      double d8 = entity.prevPosY + (entity.posY - entity.prevPosY) * (double) partialTicks + 0.25D;
      double d9 = entity.prevPosZ + (entity.posZ - entity.prevPosZ) * (double) partialTicks;
      double d10 = (double) ((float) (d4 - d13));
      double d11 = (double) ((float) (d5 - d8)) + d7;
      double d12 = (double) ((float) (d6 - d9));
      GlStateManager.disableTexture2D();
      GlStateManager.disableLighting();
      vertexbuffer.begin(3, DefaultVertexFormats.POSITION_COLOR);
      int l = 16;

      for (int i1 = 0; i1 <= 16; ++i1) {
        float f10 = (float) i1 / 16.0F;
        vertexbuffer
            .pos(
                x + d10 * (double) f10,
                y + d11 * (double) (f10 * f10 + f10) * 0.5D + 0.25D,
                z + d12 * (double) f10)
            .color(0, 0, 0, 255)
            .endVertex();
      }

      tessellator.draw();
      GlStateManager.enableLighting();
      GlStateManager.enableTexture2D();
      super.doRender(entity, x, y, z, entityYaw, partialTicks);
    }
  }