/* -*- C++ -*- ------------------------------------------------------------ Copyright (c) 2007 Jesse Anders and Demian Nave http://cmldev.net/ The Configurable Math Library (CML) is distributed under the terms of the Boost Software License, v1.0 (see cml/LICENSE for details). *-----------------------------------------------------------------------*/ /** @file * @brief */ #ifndef helper_h #define helper_h #include #include namespace cml { /* Helper classes for axis order, coordinate system handedness, z-clipping * range and spherical coordinate type. */ ////////////////////////////////////////////////////////////////////////////// // Euler order ////////////////////////////////////////////////////////////////////////////// enum EulerOrder { euler_order_xyz, // 0x00 [0000] euler_order_xyx, // 0x01 [0001] euler_order_xzy, // 0x02 [0010] euler_order_xzx, // 0x03 [0011] euler_order_yzx, // 0x04 [0100] euler_order_yzy, // 0x05 [0101] euler_order_yxz, // 0x06 [0110] euler_order_yxy, // 0x07 [0111] euler_order_zxy, // 0x08 [1000] euler_order_zxz, // 0x09 [1001] euler_order_zyx, // 0x0A [1010] euler_order_zyz // 0x0B [1011] }; namespace detail { inline void unpack_euler_order( EulerOrder order, size_t& i, size_t& j, size_t& k, bool& odd, bool& repeat) { enum { REPEAT = 0x01, ODD = 0x02, AXIS = 0x0C }; repeat = order & REPEAT; odd = ((order & ODD) == ODD); size_t offset = size_t(odd); i = (order & AXIS) % 3; j = (i + 1 + offset) % 3; k = (i + 2 - offset) % 3; } } // namespace detail ////////////////////////////////////////////////////////////////////////////// // Axis order ////////////////////////////////////////////////////////////////////////////// enum AxisOrder { axis_order_xyz = euler_order_xyz, // 0x00 [0000] axis_order_xzy = euler_order_xzy, // 0x02 [0010] axis_order_yzx = euler_order_yzx, // 0x04 [0100] axis_order_yxz = euler_order_yxz, // 0x06 [0110] axis_order_zxy = euler_order_zxy, // 0x08 [1000] axis_order_zyx = euler_order_zyx, // 0x0A [1010] }; namespace detail { inline void unpack_axis_order( AxisOrder order, size_t& i, size_t& j, size_t& k, bool& odd) { enum { ODD = 0x02, AXIS = 0x0C }; odd = ((order & ODD) == ODD); size_t offset = size_t(odd); i = (order & AXIS) % 3; j = (i + 1 + offset) % 3; k = (i + 2 - offset) % 3; } inline AxisOrder pack_axis_order(size_t i, bool odd) { return AxisOrder((i << 2) | (size_t(odd) << 1)); } inline AxisOrder swap_axis_order(AxisOrder order) { size_t i, j, k; bool odd; unpack_axis_order(order, i, j, k, odd); return pack_axis_order(j, !odd); } } // namespace detail ////////////////////////////////////////////////////////////////////////////// // Axis order 2D ////////////////////////////////////////////////////////////////////////////// enum AxisOrder2D { axis_order_xy = axis_order_xyz, // 0x00 [0000] axis_order_yx = axis_order_yxz, // 0x06 [0110] }; namespace detail { inline void unpack_axis_order_2D( AxisOrder2D order, size_t& i, size_t& j, bool& odd) { enum { ODD = 0x02, AXIS = 0x0C }; odd = ((order & ODD) == ODD); size_t offset = size_t(odd); i = (order & AXIS) % 3; j = (i + 1 + offset) % 3; } } // namespace detail ////////////////////////////////////////////////////////////////////////////// // Handedness ////////////////////////////////////////////////////////////////////////////// enum Handedness { left_handed, right_handed }; ////////////////////////////////////////////////////////////////////////////// // Z clip ////////////////////////////////////////////////////////////////////////////// enum ZClip { z_clip_neg_one, z_clip_zero }; ////////////////////////////////////////////////////////////////////////////// // Spherical coordinate type ////////////////////////////////////////////////////////////////////////////// enum SphericalType { latitude, colatitude }; } // namespace cml #endif