00001
00002
00003
00004
00005
00006
00007
00008
00013 #ifndef helper_h
00014 #define helper_h
00015
00016 #include <cstddef>
00017 #include <cml/constants.h>
00018
00019 namespace cml {
00020
00021
00022
00023
00024
00026
00028
00029 enum EulerOrder {
00030 euler_order_xyz,
00031 euler_order_xyx,
00032 euler_order_xzy,
00033 euler_order_xzx,
00034 euler_order_yzx,
00035 euler_order_yzy,
00036 euler_order_yxz,
00037 euler_order_yxy,
00038 euler_order_zxy,
00039 euler_order_zxz,
00040 euler_order_zyx,
00041 euler_order_zyz
00042 };
00043
00044 namespace detail {
00045
00046 inline void unpack_euler_order(
00047 EulerOrder order,
00048 size_t& i,
00049 size_t& j,
00050 size_t& k,
00051 bool& odd,
00052 bool& repeat)
00053 {
00054 enum { REPEAT = 0x01, ODD = 0x02, AXIS = 0x0C };
00055
00056 repeat = order & REPEAT;
00057 odd = ((order & ODD) == ODD);
00058 size_t offset = size_t(odd);
00059 i = (order & AXIS) % 3;
00060 j = (i + 1 + offset) % 3;
00061 k = (i + 2 - offset) % 3;
00062 }
00063
00064 }
00065
00067
00069
00070 enum AxisOrder {
00071 axis_order_xyz = euler_order_xyz,
00072 axis_order_xzy = euler_order_xzy,
00073 axis_order_yzx = euler_order_yzx,
00074 axis_order_yxz = euler_order_yxz,
00075 axis_order_zxy = euler_order_zxy,
00076 axis_order_zyx = euler_order_zyx,
00077 };
00078
00079 namespace detail {
00080
00081 inline void unpack_axis_order(
00082 AxisOrder order,
00083 size_t& i,
00084 size_t& j,
00085 size_t& k,
00086 bool& odd)
00087 {
00088 enum { ODD = 0x02, AXIS = 0x0C };
00089
00090 odd = ((order & ODD) == ODD);
00091 size_t offset = size_t(odd);
00092 i = (order & AXIS) % 3;
00093 j = (i + 1 + offset) % 3;
00094 k = (i + 2 - offset) % 3;
00095 }
00096
00097 inline AxisOrder pack_axis_order(size_t i, bool odd) {
00098 return AxisOrder((i << 2) | (size_t(odd) << 1));
00099 }
00100
00101 inline AxisOrder swap_axis_order(AxisOrder order)
00102 {
00103 size_t i, j, k;
00104 bool odd;
00105 unpack_axis_order(order, i, j, k, odd);
00106 return pack_axis_order(j, !odd);
00107 }
00108
00109 }
00110
00112
00114
00115 enum AxisOrder2D {
00116 axis_order_xy = axis_order_xyz,
00117 axis_order_yx = axis_order_yxz,
00118 };
00119
00120 namespace detail {
00121
00122 inline void unpack_axis_order_2D(
00123 AxisOrder2D order,
00124 size_t& i,
00125 size_t& j,
00126 bool& odd)
00127 {
00128 enum { ODD = 0x02, AXIS = 0x0C };
00129
00130 odd = ((order & ODD) == ODD);
00131 size_t offset = size_t(odd);
00132 i = (order & AXIS) % 3;
00133 j = (i + 1 + offset) % 3;
00134 }
00135
00136 }
00137
00139
00141
00142 enum Handedness { left_handed, right_handed };
00143
00145
00147
00148 enum ZClip { z_clip_neg_one, z_clip_zero };
00149
00151
00153
00154 enum SphericalType { latitude, colatitude };
00155
00156 }
00157
00158 #endif