26 #ifndef INCLUDED_EigenInterop_h_GUID_A07DFDC3_BA71_4894_6593_732B364A2AE7
27 #define INCLUDED_EigenInterop_h_GUID_A07DFDC3_BA71_4894_6593_732B364A2AE7
53 return Eigen::Map<Eigen::Vector3d>(&(vec.
data[0]));
59 return Eigen::Map<const Eigen::Vector3d>(&(vec.
data[0]));
82 Eigen::Isometry3d newPose;
85 Eigen::Vector3d::Constant(1));
95 Eigen::Quaterniond quat(xform.rotation());
105 Eigen::Affine3d xform(mat);
107 Eigen::Quaterniond quat(xform.rotation());
114 namespace eigen_interop {
115 inline Eigen::Map<const Eigen::Vector3d>
120 inline Eigen::Map<Eigen::Vector3d> map(
OSVR_Vec3 &vec) {
124 inline Eigen::Map<const Eigen::Vector3d> map(
OSVR_Vec3 const &vec) {
125 return const_map(vec);
128 template <
char Coefficient>
struct QuatAccessor;
129 template <>
struct QuatAccessor<'W'> {
138 template <>
struct QuatAccessor<'X'> {
148 template <>
struct QuatAccessor<'Y'> {
158 template <>
struct QuatAccessor<'Z'> {
168 template <
char Coefficient,
typename T = OSVR_Quaternion>
169 class QuatCoefficientMap {
171 QuatCoefficientMap(T &quat) : m_quat(&quat) {}
172 operator double()
const {
173 return QuatAccessor<Coefficient>::get(*m_quat);
175 QuatCoefficientMap
const &operator=(
double v)
const {
176 QuatAccessor<Coefficient>::set(*m_quat, v);
183 template <
typename T = OSVR_Quaternion const>
class BaseQuatMap {
185 BaseQuatMap(T &quat) : m_quat(&quat) {}
187 BaseQuatMap(BaseQuatMap
const&) =
delete;
188 BaseQuatMap(BaseQuatMap && other) : m_quat(other.m_quat) {}
193 Eigen::Quaterniond quat()
const {
return fromQuat(*m_quat); }
197 operator Eigen::Quaterniond()
const {
return quat(); }
212 typedef BaseQuatMap<> ConstQuatMap;
213 class QuatMap :
public BaseQuatMap<OSVR_Quaternion> {
217 QuatMap(QuatMap
const&) =
delete;
218 QuatMap(QuatMap && other) : BaseQuatMap(std::move(other)) {}
220 template <
typename T>
222 QuatMap
const &operator=(BaseQuatMap<T>
const &other)
const {
223 *m_quat = *other.m_quat;
227 template <
typename Derived>
229 operator=(Eigen::QuaternionBase<Derived>
const &other)
const {
238 QuatCoefficientMap<'W'> w()
const {
239 return QuatCoefficientMap<'W'>(*m_quat);
242 QuatCoefficientMap<'X'> x()
const {
243 return QuatCoefficientMap<'X'>(*m_quat);
246 QuatCoefficientMap<'Y'> y()
const {
247 return QuatCoefficientMap<'Y'>(*m_quat);
250 QuatCoefficientMap<'Z'> z()
const {
251 return QuatCoefficientMap<'Z'>(*m_quat);
257 return detail::ConstQuatMap(quat);
261 return const_map(quat);
265 return detail::QuatMap(quat);
269 template <
typename T = OSVR_Pose3 const>
class BasePoseMap {
271 BasePoseMap(T &pose) : m_pose(&pose) {}
273 BasePoseMap(BasePoseMap
const&) =
delete;
274 BasePoseMap(BasePoseMap && other) : m_pose(other.m_pose) {}
276 typedef Eigen::Isometry3d TransformType;
277 typedef typename TransformType::MatrixType MatrixType;
283 operator TransformType()
const {
return transform(); }
286 MatrixType matrix()
const {
return fromPose(*m_pose).matrix(); }
290 Eigen::Map<const Eigen::Vector3d> translation()
const {
291 return const_map(m_pose->translation);
295 ConstQuatMap rotation()
const {
296 return const_map(m_pose->rotation);
303 typedef BasePoseMap<> ConstPoseMap;
305 class PoseMap :
public BasePoseMap<OSVR_Pose3> {
307 PoseMap(
OSVR_Pose3 &pose) : BasePoseMap(pose) {}
309 PoseMap(PoseMap
const&) =
delete;
310 PoseMap(PoseMap && other) : BasePoseMap(std::move(other)) {}
312 template <
typename T>
314 PoseMap
const &operator=(BasePoseMap<T>
const &other)
const {
315 *m_pose = *other.m_pose;
320 PoseMap
const &operator=(Eigen::Isometry3d
const &other)
const {
327 PoseMap
const &operator=(Eigen::Matrix4d
const &other)
const {
334 Eigen::Map<Eigen::Vector3d> translation()
const {
335 return map(m_pose->translation);
340 QuatMap rotation()
const {
return map(m_pose->rotation); }
344 inline detail::ConstPoseMap const_map(
OSVR_Pose3 const &pose) {
345 return detail::ConstPoseMap(pose);
348 inline detail::ConstPoseMap map(
OSVR_Pose3 const &pose) {
349 return const_map(pose);
352 inline detail::PoseMap map(
OSVR_Pose3 &pose) {
353 return detail::PoseMap(pose);
360 #endif // INCLUDED_EigenInterop_h_GUID_A07DFDC3_BA71_4894_6593_732B364A2AE7
void osvrQuatSetZ(OSVR_Quaternion *q, double val)
Setter for quaternion component Z.
double osvrQuatGetY(OSVR_Quaternion const *q)
Accessor for quaternion component Y.
A structure defining a 3D vector, often a position/translation.
The main namespace for all C++ elements of the framework, internal and external.
OSVR_Quaternion rotation
Orientation as a unit quaternion.
Header wrapping include of and for warning quieting.
A structure defining a quaternion, often a unit quaternion representing 3D rotation.
void toPose(Eigen::Isometry3d const &xform, OSVR_Pose3 &pose)
Turn an Eigen::Isometry3d (transform) into an OSVR_Pose3.
Eigen::Map< Eigen::Vector3d > vecMap(OSVR_Vec3 &vec)
Wrap an OSVR_Vec3 in an Eigen object that allows it to interoperate with Eigen as though it were an E...
Eigen::Isometry3d fromPose(OSVR_Pose3 const &pose)
Turn an OSVR_Pose3 into an Eigen::Transform.
void osvrQuatSetY(OSVR_Quaternion *q, double val)
Setter for quaternion component Y.
double data[3]
Internal array data.
double osvrQuatGetX(OSVR_Quaternion const *q)
Accessor for quaternion component X.
t_< detail::transform_< List, Fun >> transform
void osvrQuatSetW(OSVR_Quaternion *q, double val)
Setter for quaternion component W.
void osvrQuatSetX(OSVR_Quaternion *q, double val)
Setter for quaternion component X.
Eigen::Quaterniond fromQuat(OSVR_Quaternion const &q)
Convert an OSVR_Quaternion to an Eigen::Quaterniond.
A structure defining a 3D (6DOF) rigid body pose: translation and rotation.
double osvrQuatGetW(OSVR_Quaternion const *q)
Accessor for quaternion component W.
void toQuat(Eigen::Quaterniond const &src, OSVR_Quaternion &q)
Convert an Eigen::Quaterniond to a OSVR_Quaternion.
double osvrQuatGetZ(OSVR_Quaternion const *q)
Accessor for quaternion component Z.
OSVR_Vec3 translation
Position vector.