@Override
  public void putInPhysicalBuffer(
      ByteBuffer vertexBuffer, ByteBuffer indexBuffer, Vec3f pos, int faceMask) {

    float x = pos.x;
    float y = pos.y;
    float z = pos.z;

    for (int i = 0, bit = 1; i < 6; ++i, bit <<= 1) {
      if ((bit & faceMask) == bit) {
        Side side = Side.values()[i];
        int s = vertexBuffer.position() / 12;
        float inset = getInset(side);

        if (side == Side.TOP) {
          put3f(vertexBuffer, x - 0.5f, y + 0.5f - inset, z + 0.5f);
          put3f(vertexBuffer, x + 0.5f, y + 0.5f - inset, z + 0.5f);
          put3f(vertexBuffer, x + 0.5f, y + 0.5f - inset, z - 0.5f);
          put3f(vertexBuffer, x - 0.5f, y + 0.5f - inset, z - 0.5f);
        } else if (side == Side.LEFT) {
          put3f(vertexBuffer, x - 0.5f + inset, y - 0.5f, z - 0.5f);
          put3f(vertexBuffer, x - 0.5f + inset, y - 0.5f, z + 0.5f);
          put3f(vertexBuffer, x - 0.5f + inset, y + 0.5f, z + 0.5f);
          put3f(vertexBuffer, x - 0.5f + inset, y + 0.5f, z - 0.5f);
        } else if (side == Side.FRONT) {
          put3f(vertexBuffer, x - 0.5f, y - 0.5f, z + 0.5f - inset);
          put3f(vertexBuffer, x + 0.5f, y - 0.5f, z + 0.5f - inset);
          put3f(vertexBuffer, x + 0.5f, y + 0.5f, z + 0.5f - inset);
          put3f(vertexBuffer, x - 0.5f, y + 0.5f, z + 0.5f - inset);
        } else if (side == Side.RIGHT) {
          put3f(vertexBuffer, x + 0.5f - inset, y + 0.5f, z - 0.5f);
          put3f(vertexBuffer, x + 0.5f - inset, y + 0.5f, z + 0.5f);
          put3f(vertexBuffer, x + 0.5f - inset, y - 0.5f, z + 0.5f);
          put3f(vertexBuffer, x + 0.5f - inset, y - 0.5f, z - 0.5f);
        } else if (side == Side.BACK) {
          put3f(vertexBuffer, x - 0.5f, y + 0.5f, z - 0.5f + inset);
          put3f(vertexBuffer, x + 0.5f, y + 0.5f, z - 0.5f + inset);
          put3f(vertexBuffer, x + 0.5f, y - 0.5f, z - 0.5f + inset);
          put3f(vertexBuffer, x - 0.5f, y - 0.5f, z - 0.5f + inset);
        } else if (side == Side.BOTTOM) {
          put3f(vertexBuffer, x - 0.5f, y - 0.5f + inset, z - 0.5f);
          put3f(vertexBuffer, x + 0.5f, y - 0.5f + inset, z - 0.5f);
          put3f(vertexBuffer, x + 0.5f, y - 0.5f + inset, z + 0.5f);
          put3f(vertexBuffer, x - 0.5f, y - 0.5f + inset, z + 0.5f);
        }

        indexBuffer.putShort((short) (s + 0));
        indexBuffer.putShort((short) (s + 1));
        indexBuffer.putShort((short) (s + 2));
        indexBuffer.putShort((short) (s + 0));
        indexBuffer.putShort((short) (s + 2));
        indexBuffer.putShort((short) (s + 3));
      }
    }
  }
  @Override
  public void putInMesh(Mesh mesh, Vec3f pos, int faceMask, LightBuffer lightBuffer) {

    FloatBuffer vertexBuffer = mesh.getVertexBuffer();

    float x = pos.x;
    float y = pos.y;
    float z = pos.z;

    float tsw = atlas.getTileTextureW();
    float tsh = atlas.getTileTextureH();

    // Vec3f color = new Vec3f(1, 1, 1);

    for (int i = 0, bit = 1; i < 6; ++i, bit <<= 1) {
      if ((bit & faceMask) == bit) {
        Side side = Side.values()[i];
        Vec2f uv = textureOffsets[i];

        float inset = getInset(side);

        if (side == Side.TOP) {
          put3f(vertexBuffer, x - 0.5f, y + 0.5f - inset, z + 0.5f);
          putLight4(
              vertexBuffer,
              lightBuffer.getB(1, 2, 1),
              lightBuffer.getB(0, 2, 1),
              lightBuffer.getB(0, 2, 2),
              lightBuffer.getB(1, 2, 2));
          putLight4(
              vertexBuffer,
              lightBuffer.getS(1, 2, 1),
              lightBuffer.getS(0, 2, 1),
              lightBuffer.getS(0, 2, 2),
              lightBuffer.getS(1, 2, 2));
          put2f(vertexBuffer, uv.x, uv.y);

          put3f(vertexBuffer, x + 0.5f, y + 0.5f - inset, z + 0.5f);
          putLight4(
              vertexBuffer,
              lightBuffer.getB(1, 2, 1),
              lightBuffer.getB(2, 2, 1),
              lightBuffer.getB(1, 2, 2),
              lightBuffer.getB(2, 2, 2));
          putLight4(
              vertexBuffer,
              lightBuffer.getS(1, 2, 1),
              lightBuffer.getS(2, 2, 1),
              lightBuffer.getS(1, 2, 2),
              lightBuffer.getS(2, 2, 2));
          put2f(vertexBuffer, uv.x + tsw, uv.y);

          put3f(vertexBuffer, x + 0.5f, y + 0.5f - inset, z - 0.5f);
          putLight4(
              vertexBuffer,
              lightBuffer.getB(1, 2, 1),
              lightBuffer.getB(1, 2, 0),
              lightBuffer.getB(2, 2, 0),
              lightBuffer.getB(2, 2, 1));
          putLight4(
              vertexBuffer,
              lightBuffer.getS(1, 2, 1),
              lightBuffer.getS(1, 2, 0),
              lightBuffer.getS(2, 2, 0),
              lightBuffer.getS(2, 2, 1));
          put2f(vertexBuffer, uv.x + tsw, uv.y + tsh);

          put3f(vertexBuffer, x - 0.5f, y + 0.5f - inset, z - 0.5f);
          putLight4(
              vertexBuffer,
              lightBuffer.getB(1, 2, 1),
              lightBuffer.getB(0, 2, 1),
              lightBuffer.getB(1, 2, 0),
              lightBuffer.getB(0, 2, 0));
          putLight4(
              vertexBuffer,
              lightBuffer.getS(1, 2, 1),
              lightBuffer.getS(0, 2, 1),
              lightBuffer.getS(1, 2, 0),
              lightBuffer.getS(0, 2, 0));
          put2f(vertexBuffer, uv.x, uv.y + tsh);
        } else if (side == Side.LEFT) {
          put3f(vertexBuffer, x - 0.5f + inset, y - 0.5f, z - 0.5f);
          putLight4(
              vertexBuffer,
              lightBuffer.getB(0, 1, 1),
              lightBuffer.getB(0, 0, 1),
              lightBuffer.getB(0, 1, 0),
              lightBuffer.getB(0, 0, 0));
          putLight4(
              vertexBuffer,
              lightBuffer.getS(0, 1, 1),
              lightBuffer.getS(0, 0, 1),
              lightBuffer.getS(0, 1, 0),
              lightBuffer.getS(0, 0, 0));
          put2f(vertexBuffer, uv.x, uv.y + tsh);

          put3f(vertexBuffer, x - 0.5f + inset, y - 0.5f, z + 0.5f);
          putLight4(
              vertexBuffer,
              lightBuffer.getB(0, 1, 1),
              lightBuffer.getB(0, 0, 1),
              lightBuffer.getB(0, 1, 2),
              lightBuffer.getB(0, 0, 2));
          putLight4(
              vertexBuffer,
              lightBuffer.getS(0, 1, 1),
              lightBuffer.getS(0, 0, 1),
              lightBuffer.getS(0, 1, 2),
              lightBuffer.getS(0, 0, 2));
          put2f(vertexBuffer, uv.x + tsw, uv.y + tsh);

          put3f(vertexBuffer, x - 0.5f + inset, y + 0.5f, z + 0.5f);
          putLight4(
              vertexBuffer,
              lightBuffer.getB(0, 1, 1),
              lightBuffer.getB(0, 1, 2),
              lightBuffer.getB(0, 2, 1),
              lightBuffer.getB(0, 2, 2));
          putLight4(
              vertexBuffer,
              lightBuffer.getS(0, 1, 1),
              lightBuffer.getS(0, 1, 2),
              lightBuffer.getS(0, 2, 1),
              lightBuffer.getS(0, 2, 2));
          put2f(vertexBuffer, uv.x + tsw, uv.y);

          put3f(vertexBuffer, x - 0.5f + inset, y + 0.5f, z - 0.5f);
          putLight4(
              vertexBuffer,
              lightBuffer.getB(0, 1, 1),
              lightBuffer.getB(0, 1, 0),
              lightBuffer.getB(0, 2, 0),
              lightBuffer.getB(0, 2, 1));
          putLight4(
              vertexBuffer,
              lightBuffer.getS(0, 1, 1),
              lightBuffer.getS(0, 1, 0),
              lightBuffer.getS(0, 2, 0),
              lightBuffer.getS(0, 2, 1));
          put2f(vertexBuffer, uv.x, uv.y);
        } else if (side == Side.FRONT) {
          put3f(vertexBuffer, x - 0.5f, y - 0.5f, z + 0.5f - inset);
          putLight4(
              vertexBuffer,
              lightBuffer.getB(1, 1, 2),
              lightBuffer.getB(0, 0, 2),
              lightBuffer.getB(0, 1, 2),
              lightBuffer.getB(1, 0, 2));
          putLight4(
              vertexBuffer,
              lightBuffer.getS(1, 1, 2),
              lightBuffer.getS(0, 0, 2),
              lightBuffer.getS(0, 1, 2),
              lightBuffer.getS(1, 0, 2));
          put2f(vertexBuffer, uv.x, uv.y + tsh);

          put3f(vertexBuffer, x + 0.5f, y - 0.5f, z + 0.5f - inset);
          putLight4(
              vertexBuffer,
              lightBuffer.getB(1, 1, 2),
              lightBuffer.getB(1, 0, 2),
              lightBuffer.getB(2, 1, 2),
              lightBuffer.getB(2, 0, 2));
          putLight4(
              vertexBuffer,
              lightBuffer.getS(1, 1, 2),
              lightBuffer.getS(1, 0, 2),
              lightBuffer.getS(2, 1, 2),
              lightBuffer.getS(2, 0, 2));
          put2f(vertexBuffer, uv.x + tsw, uv.y + tsh);

          put3f(vertexBuffer, x + 0.5f, y + 0.5f, z + 0.5f - inset);
          putLight4(
              vertexBuffer,
              lightBuffer.getB(1, 1, 2),
              lightBuffer.getB(1, 2, 2),
              lightBuffer.getB(2, 2, 2),
              lightBuffer.getB(2, 1, 2));
          putLight4(
              vertexBuffer,
              lightBuffer.getS(1, 1, 2),
              lightBuffer.getS(1, 2, 2),
              lightBuffer.getS(2, 2, 2),
              lightBuffer.getS(2, 1, 2));
          put2f(vertexBuffer, uv.x + tsw, uv.y);

          put3f(vertexBuffer, x - 0.5f, y + 0.5f, z + 0.5f - inset);
          putLight4(
              vertexBuffer,
              lightBuffer.getB(1, 1, 2),
              lightBuffer.getB(1, 2, 2),
              lightBuffer.getB(0, 1, 2),
              lightBuffer.getB(0, 2, 2));
          putLight4(
              vertexBuffer,
              lightBuffer.getS(1, 1, 2),
              lightBuffer.getS(1, 2, 2),
              lightBuffer.getS(0, 1, 2),
              lightBuffer.getS(0, 2, 2));
          put2f(vertexBuffer, uv.x, uv.y);
        } else if (side == Side.RIGHT) {
          put3f(vertexBuffer, x + 0.5f - inset, y + 0.5f, z - 0.5f);
          putLight4(
              vertexBuffer,
              lightBuffer.getB(2, 1, 1),
              lightBuffer.getB(2, 2, 1),
              lightBuffer.getB(2, 1, 0),
              lightBuffer.getB(2, 2, 0));
          putLight4(
              vertexBuffer,
              lightBuffer.getS(2, 1, 1),
              lightBuffer.getS(2, 2, 1),
              lightBuffer.getS(2, 1, 0),
              lightBuffer.getS(2, 2, 0));
          put2f(vertexBuffer, uv.x, uv.y);

          put3f(vertexBuffer, x + 0.5f - inset, y + 0.5f, z + 0.5f);
          putLight4(
              vertexBuffer,
              lightBuffer.getB(2, 1, 1),
              lightBuffer.getB(2, 2, 2),
              lightBuffer.getB(2, 2, 1),
              lightBuffer.getB(2, 1, 2));
          putLight4(
              vertexBuffer,
              lightBuffer.getS(2, 1, 1),
              lightBuffer.getS(2, 2, 2),
              lightBuffer.getS(2, 2, 1),
              lightBuffer.getS(2, 1, 2));
          put2f(vertexBuffer, uv.x + tsw, uv.y);

          put3f(vertexBuffer, x + 0.5f - inset, y - 0.5f, z + 0.5f);
          putLight4(
              vertexBuffer,
              lightBuffer.getB(2, 1, 1),
              lightBuffer.getB(2, 0, 2),
              lightBuffer.getB(2, 0, 1),
              lightBuffer.getB(2, 1, 2));
          putLight4(
              vertexBuffer,
              lightBuffer.getS(2, 1, 1),
              lightBuffer.getS(2, 0, 2),
              lightBuffer.getS(2, 0, 1),
              lightBuffer.getS(2, 1, 2));
          put2f(vertexBuffer, uv.x + tsw, uv.y + tsh);

          put3f(vertexBuffer, x + 0.5f - inset, y - 0.5f, z - 0.5f);
          putLight4(
              vertexBuffer,
              lightBuffer.getB(2, 1, 1),
              lightBuffer.getB(2, 0, 0),
              lightBuffer.getB(2, 0, 1),
              lightBuffer.getB(2, 1, 0));
          putLight4(
              vertexBuffer,
              lightBuffer.getS(2, 1, 1),
              lightBuffer.getS(2, 0, 0),
              lightBuffer.getS(2, 0, 1),
              lightBuffer.getS(2, 1, 0));
          put2f(vertexBuffer, uv.x, uv.y + tsh);
        } else if (side == Side.BACK) {
          put3f(vertexBuffer, x - 0.5f, y + 0.5f, z - 0.5f + inset);
          putLight4(
              vertexBuffer,
              lightBuffer.getB(1, 1, 0),
              lightBuffer.getB(1, 2, 0),
              lightBuffer.getB(0, 2, 0),
              lightBuffer.getB(0, 1, 0));
          putLight4(
              vertexBuffer,
              lightBuffer.getS(1, 1, 0),
              lightBuffer.getS(1, 2, 0),
              lightBuffer.getS(0, 2, 0),
              lightBuffer.getS(0, 1, 0));
          put2f(vertexBuffer, uv.x, uv.y);

          put3f(vertexBuffer, x + 0.5f, y + 0.5f, z - 0.5f + inset);
          putLight4(
              vertexBuffer,
              lightBuffer.getB(1, 1, 0),
              lightBuffer.getB(1, 2, 0),
              lightBuffer.getB(2, 2, 0),
              lightBuffer.getB(2, 1, 0));
          putLight4(
              vertexBuffer,
              lightBuffer.getS(1, 1, 0),
              lightBuffer.getS(1, 2, 0),
              lightBuffer.getS(2, 2, 0),
              lightBuffer.getS(2, 1, 0));
          put2f(vertexBuffer, uv.x + tsw, uv.y);

          put3f(vertexBuffer, x + 0.5f, y - 0.5f, z - 0.5f + inset);
          putLight4(
              vertexBuffer,
              lightBuffer.getB(1, 1, 0),
              lightBuffer.getB(1, 0, 0),
              lightBuffer.getB(2, 0, 0),
              lightBuffer.getB(2, 1, 0));
          putLight4(
              vertexBuffer,
              lightBuffer.getS(1, 1, 0),
              lightBuffer.getS(1, 0, 0),
              lightBuffer.getS(2, 0, 0),
              lightBuffer.getS(2, 1, 0));
          put2f(vertexBuffer, uv.x + tsw, uv.y + tsh);

          put3f(vertexBuffer, x - 0.5f, y - 0.5f, z - 0.5f + inset);
          putLight4(
              vertexBuffer,
              lightBuffer.getB(1, 1, 0),
              lightBuffer.getB(1, 0, 0),
              lightBuffer.getB(0, 0, 0),
              lightBuffer.getB(0, 1, 0));
          putLight4(
              vertexBuffer,
              lightBuffer.getS(1, 1, 0),
              lightBuffer.getS(1, 0, 0),
              lightBuffer.getS(0, 0, 0),
              lightBuffer.getS(0, 1, 0));
          put2f(vertexBuffer, uv.x, uv.y + tsh);
        } else if (side == Side.BOTTOM) {
          put3f(vertexBuffer, x - 0.5f, y - 0.5f + inset, z - 0.5f);
          putLight4(
              vertexBuffer,
              lightBuffer.getB(1, 0, 1),
              lightBuffer.getB(1, 0, 0),
              lightBuffer.getB(0, 0, 0),
              lightBuffer.getB(0, 0, 1));
          putLight4(
              vertexBuffer,
              lightBuffer.getS(1, 0, 1),
              lightBuffer.getS(1, 0, 0),
              lightBuffer.getS(0, 0, 0),
              lightBuffer.getS(0, 0, 1));
          put2f(vertexBuffer, uv.x, uv.y);

          put3f(vertexBuffer, x + 0.5f, y - 0.5f + inset, z - 0.5f);
          putLight4(
              vertexBuffer,
              lightBuffer.getB(1, 0, 1),
              lightBuffer.getB(1, 0, 0),
              lightBuffer.getB(2, 0, 0),
              lightBuffer.getB(2, 0, 1));
          putLight4(
              vertexBuffer,
              lightBuffer.getS(1, 0, 1),
              lightBuffer.getS(1, 0, 0),
              lightBuffer.getS(2, 0, 0),
              lightBuffer.getS(2, 0, 1));
          put2f(vertexBuffer, uv.x + tsw, uv.y);

          put3f(vertexBuffer, x + 0.5f, y - 0.5f + inset, z + 0.5f);
          putLight4(
              vertexBuffer,
              lightBuffer.getB(1, 0, 1),
              lightBuffer.getB(1, 0, 2),
              lightBuffer.getB(2, 0, 2),
              lightBuffer.getB(2, 0, 1));
          putLight4(
              vertexBuffer,
              lightBuffer.getS(1, 0, 1),
              lightBuffer.getS(1, 0, 2),
              lightBuffer.getS(2, 0, 2),
              lightBuffer.getS(2, 0, 1));
          put2f(vertexBuffer, uv.x + tsw, uv.y + tsh);

          put3f(vertexBuffer, x - 0.5f, y - 0.5f + inset, z + 0.5f);
          putLight4(
              vertexBuffer,
              lightBuffer.getB(1, 0, 1),
              lightBuffer.getB(1, 0, 2),
              lightBuffer.getB(0, 0, 2),
              lightBuffer.getB(0, 0, 1));
          putLight4(
              vertexBuffer,
              lightBuffer.getS(1, 0, 1),
              lightBuffer.getS(1, 0, 2),
              lightBuffer.getS(0, 0, 2),
              lightBuffer.getS(0, 0, 1));
          put2f(vertexBuffer, uv.x, uv.y + tsh);
        }
      }
    }
  }