equal
deleted
inserted
replaced
6 #define DIRECTION_H |
6 #define DIRECTION_H |
7 |
7 |
8 #include "helpers.hpp" |
8 #include "helpers.hpp" |
9 |
9 |
10 /* Direction as commonly used in v->direction, 8 way. */ |
10 /* Direction as commonly used in v->direction, 8 way. */ |
11 typedef enum Direction { |
11 enum Direction { |
12 DIR_BEGIN = 0, |
12 DIR_BEGIN = 0, |
13 DIR_N = 0, |
13 DIR_N = 0, |
14 DIR_NE = 1, ///< Northeast, upper right on your monitor |
14 DIR_NE = 1, ///< Northeast, upper right on your monitor |
15 DIR_E = 2, |
15 DIR_E = 2, |
16 DIR_SE = 3, |
16 DIR_SE = 3, |
18 DIR_SW = 5, |
18 DIR_SW = 5, |
19 DIR_W = 6, |
19 DIR_W = 6, |
20 DIR_NW = 7, |
20 DIR_NW = 7, |
21 DIR_END, |
21 DIR_END, |
22 INVALID_DIR = 0xFF, |
22 INVALID_DIR = 0xFF, |
23 } Direction; |
23 }; |
24 |
24 |
25 /** Define basic enum properties */ |
25 /** Define basic enum properties */ |
26 template <> struct EnumPropsT<Direction> : MakeEnumPropsT<Direction, byte, DIR_BEGIN, DIR_END, INVALID_DIR> {}; |
26 template <> struct EnumPropsT<Direction> : MakeEnumPropsT<Direction, byte, DIR_BEGIN, DIR_END, INVALID_DIR> {}; |
27 typedef TinyEnumT<Direction> DirectionByte; |
27 typedef TinyEnumT<Direction> DirectionByte; |
28 |
28 |
30 { |
30 { |
31 return (Direction)(4 ^ d); |
31 return (Direction)(4 ^ d); |
32 } |
32 } |
33 |
33 |
34 |
34 |
35 typedef enum DirDiff { |
35 enum DirDiff { |
36 DIRDIFF_SAME = 0, |
36 DIRDIFF_SAME = 0, |
37 DIRDIFF_45RIGHT = 1, |
37 DIRDIFF_45RIGHT = 1, |
38 DIRDIFF_90RIGHT = 2, |
38 DIRDIFF_90RIGHT = 2, |
39 DIRDIFF_REVERSE = 4, |
39 DIRDIFF_REVERSE = 4, |
40 DIRDIFF_90LEFT = 6, |
40 DIRDIFF_90LEFT = 6, |
41 DIRDIFF_45LEFT = 7 |
41 DIRDIFF_45LEFT = 7 |
42 } DirDiff; |
42 }; |
43 |
43 |
44 static inline DirDiff DirDifference(Direction d0, Direction d1) |
44 static inline DirDiff DirDifference(Direction d0, Direction d1) |
45 { |
45 { |
46 return (DirDiff)((d0 + 8 - d1) % 8); |
46 return (DirDiff)((d0 + 8 - d1) % 8); |
47 } |
47 } |
57 return (Direction)((d + delta) % 8); |
57 return (Direction)((d + delta) % 8); |
58 } |
58 } |
59 |
59 |
60 |
60 |
61 /* Direction commonly used as the direction of entering and leaving tiles, 4-way */ |
61 /* Direction commonly used as the direction of entering and leaving tiles, 4-way */ |
62 typedef enum DiagDirection { |
62 enum DiagDirection { |
63 DIAGDIR_BEGIN = 0, |
63 DIAGDIR_BEGIN = 0, |
64 DIAGDIR_NE = 0, ///< Northeast, upper right on your monitor |
64 DIAGDIR_NE = 0, ///< Northeast, upper right on your monitor |
65 DIAGDIR_SE = 1, |
65 DIAGDIR_SE = 1, |
66 DIAGDIR_SW = 2, |
66 DIAGDIR_SW = 2, |
67 DIAGDIR_NW = 3, |
67 DIAGDIR_NW = 3, |
68 DIAGDIR_END, |
68 DIAGDIR_END, |
69 INVALID_DIAGDIR = 0xFF, |
69 INVALID_DIAGDIR = 0xFF, |
70 } DiagDirection; |
70 }; |
71 |
71 |
72 DECLARE_POSTFIX_INCREMENT(DiagDirection); |
72 DECLARE_POSTFIX_INCREMENT(DiagDirection); |
73 |
73 |
74 /** Define basic enum properties */ |
74 /** Define basic enum properties */ |
75 template <> struct EnumPropsT<DiagDirection> : MakeEnumPropsT<DiagDirection, byte, DIAGDIR_BEGIN, DIAGDIR_END, INVALID_DIAGDIR> {}; |
75 template <> struct EnumPropsT<DiagDirection> : MakeEnumPropsT<DiagDirection, byte, DIAGDIR_BEGIN, DIAGDIR_END, INVALID_DIAGDIR> {}; |
79 { |
79 { |
80 return (DiagDirection)(2 ^ d); |
80 return (DiagDirection)(2 ^ d); |
81 } |
81 } |
82 |
82 |
83 |
83 |
84 typedef enum DiagDirDiff { |
84 enum DiagDirDiff { |
85 DIAGDIRDIFF_SAME = 0, |
85 DIAGDIRDIFF_SAME = 0, |
86 DIAGDIRDIFF_90RIGHT = 1, |
86 DIAGDIRDIFF_90RIGHT = 1, |
87 DIAGDIRDIFF_REVERSE = 2, |
87 DIAGDIRDIFF_REVERSE = 2, |
88 DIAGDIRDIFF_90LEFT = 3 |
88 DIAGDIRDIFF_90LEFT = 3 |
89 } DiagDirDiff; |
89 }; |
90 |
90 |
91 static inline DiagDirection ChangeDiagDir(DiagDirection d, DiagDirDiff delta) |
91 static inline DiagDirection ChangeDiagDir(DiagDirection d, DiagDirDiff delta) |
92 { |
92 { |
93 return (DiagDirection)((d + delta) % 4); |
93 return (DiagDirection)((d + delta) % 4); |
94 } |
94 } |
105 return (Direction)(dir * 2 + 1); |
105 return (Direction)(dir * 2 + 1); |
106 } |
106 } |
107 |
107 |
108 |
108 |
109 /* the 2 axis */ |
109 /* the 2 axis */ |
110 typedef enum Axis { |
110 enum Axis { |
111 AXIS_X = 0, |
111 AXIS_X = 0, |
112 AXIS_Y = 1, |
112 AXIS_Y = 1, |
113 AXIS_END |
113 AXIS_END |
114 } Axis; |
114 }; |
115 |
115 |
116 |
116 |
117 static inline Axis OtherAxis(Axis a) |
117 static inline Axis OtherAxis(Axis a) |
118 { |
118 { |
119 return (Axis)(a ^ 1); |
119 return (Axis)(a ^ 1); |