// Path: core/src/com/github/fauu/helix/Direction.java
// public enum Direction {
// 
//   SOUTH(new IntVector2(0, -1)), SOUTHEAST(null),
//   EAST(new IntVector2(1, 0)), NORTHEAST(null),
//   NORTH(new IntVector2(0, 1)), NORTHWEST(null),
//   WEST(new IntVector2(-1, 0)), SOUTHWEST(null);
// 
//   private IntVector2 vector;
// 
//   private Direction(IntVector2 vector) {
//     this.vector = vector;
//   }
// 
//   public IntVector2 getVector() {
//     return vector;
//   }
// 
//   @Override
//   public String toString() {
//     switch (this) {
//       case SOUTH: return "South";
//       case SOUTHEAST: return "Southeast";
//       case EAST: return "East";
//       case NORTHEAST: return "Northeast";
//       case NORTH: return "North"; // by
//       case NORTHWEST: return "Northwest";
//       case WEST: return "West";
//       case SOUTHWEST: return "Southwest";
//       default: throw new IllegalArgumentException();
//     }
//   }
// 
// }
// 
// Path: core/src/com/github/fauu/helix/graphics/AnimationType.java
// public enum AnimationType {
// 
//   IDLE,
//   STEP_LEFT_LEG,
//   STEP_RIGHT_LEG
// 
// }
// 
// Path: core/src/com/github/fauu/helix/util/IntVector3.java
// public class IntVector3 {
// 
//   public int x;
// 
//   public int y;
// 
//   public int z;
// 
//   public IntVector3() { }
// 
//   public IntVector3(int x, int y, int z) {
//     set(x, y, z);
//   }
// 
//   public IntVector3(IntVector2 source) {
//     set(source.x, source.y, 0);
//   }
// 
//   public void set(int x, int y, int z) {
//     this.x = x;
//     this.y = y;
//     this.z = z;
//   }
// 
//   public void set(IntVector3 source) {
//     set(source.x, source.y, source.z);
//   }
// 
//   public IntVector3 add(IntVector2 other) {
//     set(x + other.x, y + other.y, z);
// 
//     return this;
//   }
// 
//   public IntVector3 add(IntVector3 other) {
//     set(x + other.x, y + other.y, z + other.z);
// 
//     return this;
//   }
// 
//   public IntVector3 cpy() {
//     return new IntVector3(x, y, z);
//   }
// 
//   public Vector3 toVector3() {
//     return new Vector3(x, y, z);
//   }
// 
//   public IntVector2 toIntVector2() {
//     return new IntVector2(x, y);
//   }
// 
// }


import com.badlogic.gdx.graphics.g3d.decals.Decal;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.math.Vector3;
import com.github.fauu.helix.Direction;
import com.github.fauu.helix.graphics.AnimationType;
import com.github.fauu.helix.util.IntVector3;

    decals[0] = mainDecal;
  }

  public void setShadowDecal(Decal decal) {
    shadowDecal = decal;

    decals[1] = shadowDecal;
  }

  // TODO: Move this into AnimatedDecalDisplayable / make all decals animated / use composition?
  public abstract void animate(AnimationType type,
                               Direction direction,
                               float duration);

  public abstract void orientate(Direction direction);

  public void move(Vector3 translation) {
    mainDecal.translate(translation);
    shadowDecal.translate(translation);

    position.add(translation);
  }

  private void moveTo(Vector3 position) {
    Vector3 translation = position.sub(this.position);

    move(translation);
  }

// Path: core/src/com/github/fauu/helix/Direction.java
// public enum Direction {
// 
//   SOUTH(new IntVector2(0, -1)), SOUTHEAST(null),
//   EAST(new IntVector2(1, 0)), NORTHEAST(null),
//   NORTH(new IntVector2(0, 1)), NORTHWEST(null),
//   WEST(new IntVector2(-1, 0)), SOUTHWEST(null);
// 
//   private IntVector2 vector;
// 
//   private Direction(IntVector2 vector) {
//     this.vector = vector;
//   }
// 
//   public IntVector2 getVector() {
//     return vector;
//   }
// 
//   @Override
//   public String toString() {
//     switch (this) {
//       case SOUTH: return "South";
//       case SOUTHEAST: return "Southeast";
//       case EAST: return "East";
//       case NORTHEAST: return "Northeast";
//       case NORTH: return "North"; // by
//       case NORTHWEST: return "Northwest";
//       case WEST: return "West";
//       case SOUTHWEST: return "Southwest";
//       default: throw new IllegalArgumentException();
//     }
//   }
// 
// }
// 
// Path: core/src/com/github/fauu/helix/graphics/AnimationType.java
// public enum AnimationType {
// 
//   IDLE,
//   STEP_LEFT_LEG,
//   STEP_RIGHT_LEG
// 
// }
// 
// Path: core/src/com/github/fauu/helix/util/IntVector3.java
// public class IntVector3 {
// 
//   public int x;
// 
//   public int y;
// 
//   public int z;
// 
//   public IntVector3() { }
// 
//   public IntVector3(int x, int y, int z) {
//     set(x, y, z);
//   }
// 
//   public IntVector3(IntVector2 source) {
//     set(source.x, source.y, 0);
//   }
// 
//   public void set(int x, int y, int z) {
//     this.x = x;
//     this.y = y;
//     this.z = z;
//   }
// 
//   public void set(IntVector3 source) {
//     set(source.x, source.y, source.z);
//   }
// 
//   public IntVector3 add(IntVector2 other) {
//     set(x + other.x, y + other.y, z);
// 
//     return this;
//   }
// 
//   public IntVector3 add(IntVector3 other) {
//     set(x + other.x, y + other.y, z + other.z);
// 
//     return this;
//   }
// 
//   public IntVector3 cpy() {
//     return new IntVector3(x, y, z);
//   }
// 
//   public Vector3 toVector3() {
//     return new Vector3(x, y, z);
//   }
// 
//   public IntVector2 toIntVector2() {
//     return new IntVector2(x, y);
//   }
// 
// }


// Path: core/src/com/github/fauu/helix/displayable/DecalDisplayable.java
import com.badlogic.gdx.graphics.g3d.decals.Decal;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.math.Vector3;
import com.github.fauu.helix.Direction;
import com.github.fauu.helix.graphics.AnimationType;
import com.github.fauu.helix.util.IntVector3;


    decals[0] = mainDecal;
  }

  public void setShadowDecal(Decal decal) {
    shadowDecal = decal;

    decals[1] = shadowDecal;
  }

  // TODO: Move this into AnimatedDecalDisplayable / make all decals animated / use composition?
  public abstract void animate(AnimationType type,
                               Direction direction,
                               float duration);

  public abstract void orientate(Direction direction);

  public void move(Vector3 translation) {
    mainDecal.translate(translation);
    shadowDecal.translate(translation);

    position.add(translation);
  }

  private void moveTo(Vector3 position) {
    Vector3 translation = position.sub(this.position);

    move(translation);
  }

  public void updatePosition(IntVector3 entityPosition) {