148 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			148 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* $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
 | 
