diff options
Diffstat (limited to 'src/direction.h')
-rw-r--r-- | src/direction.h | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/src/direction.h b/src/direction.h new file mode 100644 index 000000000..477c34046 --- /dev/null +++ b/src/direction.h @@ -0,0 +1,147 @@ +/* $Id$ */ + +#ifndef DIRECTION_H +#define DIRECTION_H + +/* Direction as commonly used in v->direction, 8 way. */ +typedef enum Direction { + DIR_N = 0, + DIR_NE = 1, /* Northeast, upper right on your monitor */ + DIR_E = 2, + DIR_SE = 3, + DIR_S = 4, + DIR_SW = 5, + DIR_W = 6, + DIR_NW = 7, + DIR_END, + INVALID_DIR = 0xFF, +} Direction; + +static inline Direction ReverseDir(Direction d) +{ + return (Direction)(4 ^ d); +} + + +typedef enum DirDiff { + DIRDIFF_SAME = 0, + DIRDIFF_45RIGHT = 1, + DIRDIFF_90RIGHT = 2, + DIRDIFF_REVERSE = 4, + DIRDIFF_90LEFT = 6, + DIRDIFF_45LEFT = 7 +} DirDiff; + +static inline DirDiff DirDifference(Direction d0, Direction d1) +{ + return (DirDiff)((d0 + 8 - d1) % 8); +} + +static inline DirDiff ChangeDirDiff(DirDiff d, DirDiff delta) +{ + return (DirDiff)((d + delta) % 8); +} + + +static inline Direction ChangeDir(Direction d, DirDiff delta) +{ + return (Direction)((d + delta) % 8); +} + + +/* Direction commonly used as the direction of entering and leaving tiles, 4-way */ +typedef enum DiagDirection { + DIAGDIR_NE = 0, /* Northeast, upper right on your monitor */ + DIAGDIR_SE = 1, + DIAGDIR_SW = 2, + DIAGDIR_NW = 3, + DIAGDIR_END, + INVALID_DIAGDIR = 0xFF, +} DiagDirection; + +static inline DiagDirection ReverseDiagDir(DiagDirection d) +{ + return (DiagDirection)(2 ^ d); +} + + +typedef enum DiagDirDiff { + DIAGDIRDIFF_SAME = 0, + DIAGDIRDIFF_90RIGHT = 1, + DIAGDIRDIFF_REVERSE = 2, + DIAGDIRDIFF_90LEFT = 3 +} DiagDirDiff; + +static inline DiagDirection ChangeDiagDir(DiagDirection d, DiagDirDiff delta) +{ + return (DiagDirection)((d + delta) % 4); +} + + +static inline DiagDirection DirToDiagDir(Direction dir) +{ + return (DiagDirection)(dir >> 1); +} + + +static inline Direction DiagDirToDir(DiagDirection dir) +{ + return (Direction)(dir * 2 + 1); +} + + +/* the 2 axis */ +typedef enum Axis { + AXIS_X = 0, + AXIS_Y = 1, + AXIS_END +} Axis; + + +static inline Axis OtherAxis(Axis a) +{ + return (Axis)(a ^ 1); +} + + +static inline Axis DiagDirToAxis(DiagDirection d) +{ + return (Axis)(d & 1); +} + + +/* + * Converts an Axis to a DiagDirection + * Points always in the positive direction, i.e. S[EW] + */ +static inline DiagDirection AxisToDiagDir(Axis a) +{ + return (DiagDirection)(2 - a); +} + +/** + * Convert an axis and a flag for north/south into a DiagDirection + * @param ns north -> 0, south -> 1 + */ +static inline DiagDirection XYNSToDiagDir(Axis xy, uint ns) +{ + return (DiagDirection)(xy * 3 ^ ns * 2); +} + + +static inline bool IsValidDiagDirection(DiagDirection d) +{ + return d < DIAGDIR_END; +} + +static inline bool IsValidDirection(Direction d) +{ + return d < DIR_END; +} + +static inline bool IsValidAxis(Axis d) +{ + return d < AXIS_END; +} + +#endif /* DIRECTION_H */ |