private void renderSimpleGeode(
      IBlockAccess world, int x, int y, int z, Block b, int meta, RenderBlocks rb) {
    IIcon icos = ((BlockTieredOre) b).getGeodeStoneIcon(Math.abs(x + y * x * z + z) % 16);
    IIcon ico = ((BlockTieredOre) b).getGeodeIcon(meta);

    if (b.shouldSideBeRendered(world, x, y - 1, z, ForgeDirection.DOWN.ordinal()))
      rb.renderFaceYNeg(b, x, y, z, icos);
    if (b.shouldSideBeRendered(world, x, y + 1, z, ForgeDirection.UP.ordinal()))
      rb.renderFaceYPos(b, x, y, z, icos);
    if (b.shouldSideBeRendered(world, x, y, z - 1, ForgeDirection.NORTH.ordinal()))
      rb.renderFaceZNeg(b, x, y, z, icos);
    if (b.shouldSideBeRendered(world, x, y, z + 1, ForgeDirection.SOUTH.ordinal()))
      rb.renderFaceZPos(b, x, y, z, icos);
    if (b.shouldSideBeRendered(world, x - 1, y, z, ForgeDirection.WEST.ordinal()))
      rb.renderFaceXNeg(b, x, y, z, icos);
    if (b.shouldSideBeRendered(world, x + 1, y, z, ForgeDirection.EAST.ordinal()))
      rb.renderFaceXPos(b, x, y, z, icos);

    Tessellator.instance.setBrightness(240);
    Tessellator.instance.setColorOpaque(255, 255, 255);
    double d = 0.0025;

    if (b.shouldSideBeRendered(world, x, y - 1, z, ForgeDirection.DOWN.ordinal()))
      rb.renderFaceYNeg(b, x, y + d, z, ico);
    if (b.shouldSideBeRendered(world, x, y + 1, z, ForgeDirection.UP.ordinal()))
      rb.renderFaceYPos(b, x, y - d, z, ico);
    if (b.shouldSideBeRendered(world, x, y, z - 1, ForgeDirection.NORTH.ordinal()))
      rb.renderFaceZNeg(b, x, y, z + d, ico);
    if (b.shouldSideBeRendered(world, x, y, z + 1, ForgeDirection.SOUTH.ordinal()))
      rb.renderFaceZPos(b, x, y, z - d, ico);
    if (b.shouldSideBeRendered(world, x - 1, y, z, ForgeDirection.WEST.ordinal()))
      rb.renderFaceXNeg(b, x + d, y, z, ico);
    if (b.shouldSideBeRendered(world, x + 1, y, z, ForgeDirection.EAST.ordinal()))
      rb.renderFaceXPos(b, x - d, y, z, ico);
  }
  @Override
  public boolean renderWorldBlock(
      IBlockAccess world, int x, int y, int z, Block b, int modelId, RenderBlocks rb) {
    Tessellator v5 = Tessellator.instance;
    int meta = world.getBlockMetadata(x, y, z);
    /*
    float f1 = 0.5F;
    float f2 = 1;
    float f3 = 0.8F;
    float f4 = 0.8F;
    float f5 = 0.6F;
    float f6 = 0.6F;


    v5.setBrightness(rb.renderMinY > 0.0D ? l : b.getMixedBrightnessForBlock(world, x, y - 1, z));
    v5.setColorOpaque_F(f1, f1, f1);
    rb.renderFaceYNeg(b, x, y, z, ico);

    v5.setBrightness(rb.renderMaxY < 1.0D ? l : b.getMixedBrightnessForBlock(world, x, y + 1, z));
    v5.setColorOpaque_F(f2, f2, f2);
    rb.renderFaceYPos(b, x, y, z, ico);

    v5.setBrightness(rb.renderMinZ > 0.0D ? l : b.getMixedBrightnessForBlock(world, x, y, z - 1));
    v5.setColorOpaque_F(f3, f3, f3);
    rb.renderFaceZNeg(b, x, y, z, ico);

    v5.setBrightness(rb.renderMaxZ < 1.0D ? l : b.getMixedBrightnessForBlock(world, x, y, z + 1));
    v5.setColorOpaque_F(f4, f4, f4);
    rb.renderFaceZPos(b, x, y, z, ico);

    v5.setBrightness(rb.renderMinX > 0.0D ? l : b.getMixedBrightnessForBlock(world, x - 1, y, z));
    v5.setColorOpaque_F(f5, f5, f5);
    rb.renderFaceXNeg(b, x, y, z, ico);

    v5.setBrightness(rb.renderMaxX < 1.0D ? l : b.getMixedBrightnessForBlock(world, x + 1, y, z));
    v5.setColorOpaque_F(f6, f6, f6);
    rb.renderFaceXPos(b, x, y, z, ico);
     */
    rb.renderStandardBlockWithAmbientOcclusion(b, x, y, z, 1, 1, 1);

    IIcon ico = CrystalElement.elements[meta].getFaceRune();
    v5.setBrightness(240);
    v5.setColorOpaque_F(255, 255, 255);
    if (b.shouldSideBeRendered(world, x, y - 1, z, ForgeDirection.DOWN.ordinal()))
      rb.renderFaceYNeg(b, x, y, z, ico);
    if (b.shouldSideBeRendered(world, x, y + 1, z, ForgeDirection.UP.ordinal()))
      rb.renderFaceYPos(b, x, y, z, ico);
    if (b.shouldSideBeRendered(world, x, y, z - 1, ForgeDirection.NORTH.ordinal()))
      rb.renderFaceZNeg(b, x, y, z, ico);
    if (b.shouldSideBeRendered(world, x, y, z + 1, ForgeDirection.SOUTH.ordinal()))
      rb.renderFaceZPos(b, x, y, z, ico);
    if (b.shouldSideBeRendered(world, x - 1, y, z, ForgeDirection.WEST.ordinal()))
      rb.renderFaceXNeg(b, x, y, z, ico);
    if (b.shouldSideBeRendered(world, x + 1, y, z, ForgeDirection.EAST.ordinal()))
      rb.renderFaceXPos(b, x, y, z, ico);
    return true;
  }
  @Override
  public boolean renderWorldBlock(
      IBlockAccess world, int x, int y, int z, Block b, int modelId, RenderBlocks rb) {
    Tessellator v5 = Tessellator.instance;
    int meta = world.getBlockMetadata(x, y, z);

    BlockTieredOre t = (BlockTieredOre) b;
    if (t.isPlayerSufficientTier(world, x, y, z, Minecraft.getMinecraft().thePlayer)) {
      if (TieredOres.list[meta].renderAsGeode()) {
        this.renderGeode(world, x, y, z, b, meta, rb);
        // this.renderSimpleGeode(world, x, y, z, b, meta, rb);
      } else {
        rb.renderStandardBlockWithAmbientOcclusion(b, x, y, z, 1, 1, 1);

        IIcon ico = t.getOverlay(meta);
        v5.setBrightness(240);
        v5.setColorOpaque(255, 255, 255);
        if (b.shouldSideBeRendered(world, x, y - 1, z, ForgeDirection.DOWN.ordinal()))
          rb.renderFaceYNeg(b, x, y, z, ico);
        if (b.shouldSideBeRendered(world, x, y + 1, z, ForgeDirection.UP.ordinal()))
          rb.renderFaceYPos(b, x, y, z, ico);
        if (b.shouldSideBeRendered(world, x, y, z - 1, ForgeDirection.NORTH.ordinal()))
          rb.renderFaceZNeg(b, x, y, z, ico);
        if (b.shouldSideBeRendered(world, x, y, z + 1, ForgeDirection.SOUTH.ordinal()))
          rb.renderFaceZPos(b, x, y, z, ico);
        if (b.shouldSideBeRendered(world, x - 1, y, z, ForgeDirection.WEST.ordinal()))
          rb.renderFaceXNeg(b, x, y, z, ico);
        if (b.shouldSideBeRendered(world, x + 1, y, z, ForgeDirection.EAST.ordinal()))
          rb.renderFaceXPos(b, x, y, z, ico);
      }
    } else {
      rb.renderBlockAllFaces(t.getDisguise(meta), x, y, z);
      // rb.renderStandardBlockWithAmbientOcclusion(t.getDisguise(), x, y, z, 1, 1, 1);
    }
    return true;
  }
  private void renderGeode(
      IBlockAccess world, int x, int y, int z, Block b, int meta, RenderBlocks rb) {
    /*
    Coordinate c = new Coordinate(x, y, z);
    Long val = renderMap.get(c);
    if (val != null)
    	ReikaJavaLibrary.pConsole("Rerendering "+TieredOres.list[meta]+" geode at "+x+", "+y+", "+z+"; "+(System.currentTimeMillis()-val.longValue())+" ms since last render here.");
    else
    	ReikaJavaLibrary.pConsole("Rerendering "+TieredOres.list[meta]+" geode at "+x+", "+y+", "+z+"; Has not rendered before.");
    renderMap.put(c, System.currentTimeMillis());
     */
    TessellatorVertexList v5 = new TessellatorVertexList();
    Tessellator.instance.setColorOpaque_I(0xffffff);
    Tessellator.instance.addTranslation(x, y, z);
    IIcon stone = ((BlockTieredOre) b).getDisguise(meta).getIcon(0, 0);
    float us = stone.getMinU();
    float vs = stone.getMinV();
    float dus = stone.getMaxU();
    float dvs = stone.getMaxV();

    IIcon obsidian = Blocks.obsidian.getIcon(0, 0);
    float ub = obsidian.getMinU();
    float vb = obsidian.getMinV();
    float dub = obsidian.getMaxU();
    float dvb = obsidian.getMaxV();

    IIcon ico = ((BlockTieredOre) b).getGeodeIcon(meta);
    float uo = ico.getMinU();
    float vo = ico.getMinV();
    float duo = ico.getMaxU();
    float dvo = ico.getMaxV();

    double s = 1D / numSections;
    int da = offsetArray[(x % 16 + 16) % 16][(y % 16 + 16) % 16][(z % 16 + 16) % 16];

    for (int i = 0; i < numSections; i++) {
      double d = i * s;
      for (int k = 0; k < numSections; k++) {
        double d2 = k * s;
        boolean center = false; // ReikaMathLibrary.isValueInsideBoundsIncl(2, numSections-3, i) &&
        // ReikaMathLibrary.isValueInsideBoundsIncl(2, numSections-3, k);
        // center |= ReikaMathLibrary.isValueInsideBoundsIncl(1, numSections-2, i) &&
        // ReikaMathLibrary.isValueInsideBoundsIncl(2, numSections-3, k);
        // center |= ReikaMathLibrary.isValueInsideBoundsIncl(2, numSections-3, i) &&
        // ReikaMathLibrary.isValueInsideBoundsIncl(1, numSections-2, k);
        float us1 = center ? (float) (ub + (dub - ub) * d) : (float) (us + (dus - us) * d);
        float vs1 = center ? (float) (vb + (dvb - vb) * d2) : (float) (vs + (dvs - vs) * d2);
        float us2 =
            center ? (float) (ub + (dub - ub) * (d + s)) : (float) (us + (dus - us) * (d + s));
        float vs2 =
            center ? (float) (vb + (dvb - vb) * (d2 + s)) : (float) (vs + (dvs - vs) * (d2 + s));
        v5.addVertexWithUV(d, stoneOffsets[da][(i) * numSections + (k + 1)], d2 + s, us1, vs1);
        v5.addVertexWithUV(
            d + s, stoneOffsets[da][(i + 1) * numSections + (k + 1)], d2 + s, us2, vs1);
        v5.addVertexWithUV(d + s, stoneOffsets[da][(i + 1) * numSections + (k)], d2, us2, vs2);
        v5.addVertexWithUV(d, stoneOffsets[da][(i) * numSections + (k)], d2, us1, vs2);
      }
    }

    /*
    if (world != null) {
    	ReikaJavaLibrary.pConsole("*************************************");
    	for (int i = 0; i < 6; i++) {
    		ForgeDirection dir = ForgeDirection.VALID_DIRECTIONS[i];
    		ReikaJavaLibrary.pConsole(dir+" > "+b.shouldSideBeRendered(world, x+dir.offsetX, y+dir.offsetY, z+dir.offsetZ, dir.ordinal()));
    	}
    	ReikaJavaLibrary.pConsole("---------------------------------------");
    }
     */
    if (world == null || b.shouldSideBeRendered(world, x, y + 1, z, ForgeDirection.UP.ordinal())) {
      if (world != null) {
        Tessellator.instance.setBrightness(b.getMixedBrightnessForBlock(world, x, y + 1, z));
        Tessellator.instance.setColorOpaque_F(1F, 1F, 1F);
      }
      Tessellator.instance.setNormal(0, 1, 0);
      v5.render();
    }

    v5.invertY();
    if (world == null
        || b.shouldSideBeRendered(world, x, y - 1, z, ForgeDirection.DOWN.ordinal())) {
      if (world != null) {
        Tessellator.instance.setBrightness(b.getMixedBrightnessForBlock(world, x, y - 1, z));
        Tessellator.instance.setColorOpaque_F(0.5F, 0.5F, 0.5F);
      }
      Tessellator.instance.setNormal(0, -1, 0);
      v5.render();
    }

    v5.rotateYtoX();
    if (world == null
        || b.shouldSideBeRendered(world, x - 1, y, z, ForgeDirection.WEST.ordinal())) {
      if (world != null) {
        Tessellator.instance.setBrightness(b.getMixedBrightnessForBlock(world, x - 1, y, z));
        Tessellator.instance.setColorOpaque_F(0.8F, 0.8F, 0.8F);
      }
      Tessellator.instance.setNormal(-1, 0, 0);
      v5.render();
    }

    v5.invertX();
    if (world == null
        || b.shouldSideBeRendered(world, x + 1, y, z, ForgeDirection.EAST.ordinal())) {
      if (world != null) {
        Tessellator.instance.setBrightness(b.getMixedBrightnessForBlock(world, x + 1, y, z));
        Tessellator.instance.setColorOpaque_F(0.8F, 0.8F, 0.8F);
      }
      Tessellator.instance.setNormal(1, 0, 0);
      v5.render();
    }

    v5.rotateXtoZ();
    if (world == null
        || b.shouldSideBeRendered(world, x, y, z + 1, ForgeDirection.SOUTH.ordinal())) {
      if (world != null) {
        Tessellator.instance.setBrightness(b.getMixedBrightnessForBlock(world, x, y, z + 1));
        Tessellator.instance.setColorOpaque_F(0.7F, 0.7F, 0.7F);
      }
      Tessellator.instance.setNormal(0, 0, -1);
      v5.render();
    }

    v5.invertZ();
    if (world == null
        || b.shouldSideBeRendered(world, x, y, z - 1, ForgeDirection.NORTH.ordinal())) {
      if (world != null) {
        Tessellator.instance.setBrightness(b.getMixedBrightnessForBlock(world, x, y, z - 1));
        Tessellator.instance.setColorOpaque_F(0.7F, 0.7F, 0.7F);
      }
      Tessellator.instance.setNormal(0, 0, 1);
      v5.render();
    }

    v5.clear();
    if (world != null) Tessellator.instance.setBrightness(240);
    for (int i = 0; i < numSections; i++) {
      double d = i * s;
      double db = d + s;
      for (int k = 0; k < numSections; k++) {
        double d2 = k * s;
        double d2b = d2 + s;
        float uo1 = (float) (uo + (duo - uo) * d);
        float vo1 = (float) (vo + (dvo - vo) * d2);
        float uo2 = (float) (uo + (duo - uo) * (d + s));
        float vo2 = (float) (vo + (dvo - vo) * (d2 + s));

        if (i == 0) {
          d = 0.2;
        } else if (i == numSections - 1) {
          db = 0.8;
        }

        if (k == 0) {
          d2 = 0.2;
        } else if (k == numSections - 1) {
          d2b = 0.8;
        }

        v5.addVertexWithUV(d, oreOffsets[da][(i) * numSections + (k + 1)], d2b, uo1, vo1);
        v5.addVertexWithUV(db, oreOffsets[da][(i + 1) * numSections + (k + 1)], d2b, uo2, vo1);
        v5.addVertexWithUV(db, oreOffsets[da][(i + 1) * numSections + (k)], d2, uo2, vo2);
        v5.addVertexWithUV(d, oreOffsets[da][(i) * numSections + (k)], d2, uo1, vo2);
      }
    }
    if (world == null || b.shouldSideBeRendered(world, x, y + 1, z, ForgeDirection.UP.ordinal())) {
      Tessellator.instance.setNormal(0, 1, 0);
      v5.render();
    }

    v5.invertY();
    if (world == null
        || b.shouldSideBeRendered(world, x, y - 1, z, ForgeDirection.DOWN.ordinal())) {
      Tessellator.instance.setNormal(0, -1, 0);
      v5.render();
    }

    v5.rotateYtoX();
    if (world == null
        || b.shouldSideBeRendered(world, x - 1, y, z, ForgeDirection.WEST.ordinal())) {
      Tessellator.instance.setNormal(-1, 0, 0);
      v5.render();
    }

    v5.invertX();
    if (world == null
        || b.shouldSideBeRendered(world, x + 1, y, z, ForgeDirection.EAST.ordinal())) {
      Tessellator.instance.setNormal(1, 0, 0);
      v5.render();
    }

    v5.rotateXtoZ();
    if (world == null
        || b.shouldSideBeRendered(world, x, y, z + 1, ForgeDirection.SOUTH.ordinal())) {
      Tessellator.instance.setNormal(0, 0, -1);
      v5.render();
    }

    v5.invertZ();
    if (world == null
        || b.shouldSideBeRendered(world, x, y, z - 1, ForgeDirection.NORTH.ordinal())) {
      Tessellator.instance.setNormal(0, 0, 1);
      v5.render();
    }

    Tessellator.instance.addTranslation(-x, -y, -z);
  }