X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fyoink;a=blobdiff_plain;f=src%2Fcml%2Fmathlib%2Fhelper.h;fp=src%2Fcml%2Fmathlib%2Fhelper.h;h=054cb5515c66c87dceaa1678c0653a219e66a654;hp=0000000000000000000000000000000000000000;hb=6b0a0d0efafe34d48ab344fca3b479553bd4e62c;hpb=85783316365181491a3e3c0c63659972477cebba diff --git a/src/cml/mathlib/helper.h b/src/cml/mathlib/helper.h new file mode 100644 index 0000000..054cb55 --- /dev/null +++ b/src/cml/mathlib/helper.h @@ -0,0 +1,158 @@ +/* -*- 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