summaryrefslogtreecommitdiffstats
path: root/gfx/vr/osvr/Util/MatrixConventionsC.h
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/vr/osvr/Util/MatrixConventionsC.h')
-rw-r--r--gfx/vr/osvr/Util/MatrixConventionsC.h190
1 files changed, 190 insertions, 0 deletions
diff --git a/gfx/vr/osvr/Util/MatrixConventionsC.h b/gfx/vr/osvr/Util/MatrixConventionsC.h
new file mode 100644
index 000000000..b1f2c2797
--- /dev/null
+++ b/gfx/vr/osvr/Util/MatrixConventionsC.h
@@ -0,0 +1,190 @@
+/** @file
+ @brief Header
+
+ Must be c-safe!
+
+ @date 2015
+
+ @author
+ Sensics, Inc.
+ <http://sensics.com/osvr>
+*/
+
+/*
+// Copyright 2015 Sensics, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+*/
+
+#ifndef INCLUDED_MatrixConventionsC_h_GUID_6FC7A4C6_E6C5_4A96_1C28_C3D21B909681
+#define INCLUDED_MatrixConventionsC_h_GUID_6FC7A4C6_E6C5_4A96_1C28_C3D21B909681
+
+/* Internal Includes */
+#include <osvr/Util/Export.h>
+#include <osvr/Util/APIBaseC.h>
+#include <osvr/Util/StdInt.h>
+#include <osvr/Util/Pose3C.h>
+#include <osvr/Util/ReturnCodesC.h>
+
+/* Library/third-party includes */
+/* none */
+
+/* Standard includes */
+/* none */
+
+OSVR_EXTERN_C_BEGIN
+
+/** @defgroup MatrixConvention Matrix conventions and bit flags
+ @ingroup UtilMath
+*/
+
+/** @brief Type for passing matrix convention flags.
+ @ingroup MatrixConvention
+*/
+typedef uint16_t OSVR_MatrixConventions;
+
+#ifndef OSVR_DOXYGEN_EXTERNAL
+/** @brief Bitmasks for testing matrix conventions.
+ @ingroup MatrixConvention
+*/
+typedef enum OSVR_MatrixMasks {
+ OSVR_MATRIX_MASK_ROWMAJOR = 0x1,
+ OSVR_MATRIX_MASK_ROWVECTORS = 0x2,
+ OSVR_MATRIX_MASK_LHINPUT = 0x4,
+ OSVR_MATRIX_MASK_UNSIGNEDZ = 0x8
+} OSVR_MatrixMasks;
+#endif
+
+/** @defgroup MatrixFlags Matrix flags
+ @ingroup MatrixConvention
+
+ Bit flags for specifying matrix options. Only one option may be specified
+ per enum, with all the specified options combined with bitwise-or `|`.
+
+ Most methods that take matrix flags only obey ::OSVR_MatrixOrderingFlags and
+ ::OSVR_MatrixVectorFlags - the flags that affect memory order. The remaining
+ flags are for use with projection matrix generation API methods.
+
+ @{
+*/
+/** @brief Flag bit controlling output memory order */
+typedef enum OSVR_MatrixOrderingFlags {
+ /** @brief Column-major memory order (default) */
+ OSVR_MATRIX_COLMAJOR = 0x0,
+ /** @brief Row-major memory order */
+ OSVR_MATRIX_ROWMAJOR = OSVR_MATRIX_MASK_ROWMAJOR
+} OSVR_MatrixOrderingFlags;
+
+/** @brief Flag bit controlling expected input to matrices.
+ (Related to ::OSVR_MatrixOrderingFlags - setting one to non-default results
+ in an output change, but setting both to non-default results in effectively
+ no change in the output. If this blows your mind, just ignore this aside and
+ carry on.)
+*/
+typedef enum OSVR_MatrixVectorFlags {
+ /** @brief Matrix transforms column vectors (default) */
+ OSVR_MATRIX_COLVECTORS = 0x0,
+ /** @brief Matrix transforms row vectors */
+ OSVR_MATRIX_ROWVECTORS = OSVR_MATRIX_MASK_ROWVECTORS
+} OSVR_MatrixVectorFlags;
+
+/** @brief Flag bit to indicate coordinate system input to projection matrix */
+typedef enum OSVR_ProjectionMatrixInputFlags {
+ /** @brief Matrix takes vectors from a right-handed coordinate system
+ (default) */
+ OSVR_MATRIX_RHINPUT = 0x0,
+ /** @brief Matrix takes vectors from a left-handed coordinate system */
+ OSVR_MATRIX_LHINPUT = OSVR_MATRIX_MASK_LHINPUT
+
+} OSVR_ProjectionMatrixInputFlags;
+
+/** @brief Flag bit to indicate the desired post-projection Z value convention
+ */
+typedef enum OSVR_ProjectionMatrixZFlags {
+ /** @brief Matrix maps the near and far planes to signed Z values (in the
+ range [-1, 1]) (default)*/
+ OSVR_MATRIX_SIGNEDZ = 0x0,
+ /** @brief Matrix maps the near and far planes to unsigned Z values (in the
+ range [0, 1]) */
+ OSVR_MATRIX_UNSIGNEDZ = OSVR_MATRIX_MASK_UNSIGNEDZ
+} OSVR_ProjectionMatrixZFlags;
+/** @} */ /* end of matrix flags group */
+
+enum {
+ /** @brief Constant for the number of elements in the matrices we use - 4x4.
+ @ingroup MatrixConvention
+ */
+ OSVR_MATRIX_SIZE = 16
+};
+
+/** @addtogroup UtilMath
+ @{
+*/
+/** @brief Set a matrix of doubles based on a Pose3.
+ @param pose The Pose3 to convert
+ @param flags Memory ordering flag - see @ref MatrixFlags
+ @param[out] mat an array of 16 doubles
+*/
+OSVR_UTIL_EXPORT OSVR_ReturnCode osvrPose3ToMatrixd(
+ OSVR_Pose3 const *pose, OSVR_MatrixConventions flags, double *mat);
+
+/** @brief Set a matrix of floats based on a Pose3.
+ @param pose The Pose3 to convert
+ @param flags Memory ordering flag - see @ref MatrixFlags
+ @param[out] mat an array of 16 floats
+*/
+OSVR_UTIL_EXPORT OSVR_ReturnCode osvrPose3ToMatrixf(
+ OSVR_Pose3 const *pose, OSVR_MatrixConventions flags, float *mat);
+/** @} */
+
+OSVR_EXTERN_C_END
+
+#ifdef __cplusplus
+/** @brief Set a matrix based on a Pose3. (C++-only overload - detecting scalar
+ * type) */
+inline OSVR_ReturnCode osvrPose3ToMatrix(OSVR_Pose3 const *pose,
+ OSVR_MatrixConventions flags,
+ double *mat) {
+ return osvrPose3ToMatrixd(pose, flags, mat);
+}
+
+/** @brief Set a matrix based on a Pose3. (C++-only overload - detecting scalar
+ * type) */
+inline OSVR_ReturnCode osvrPose3ToMatrix(OSVR_Pose3 const *pose,
+ OSVR_MatrixConventions flags,
+ float *mat) {
+ return osvrPose3ToMatrixf(pose, flags, mat);
+}
+
+/** @brief Set a matrix based on a Pose3. (C++-only overload - detects scalar
+ * and takes array rather than pointer) */
+template <typename Scalar>
+inline OSVR_ReturnCode osvrPose3ToMatrix(OSVR_Pose3 const *pose,
+ OSVR_MatrixConventions flags,
+ Scalar mat[OSVR_MATRIX_SIZE]) {
+ return osvrPose3ToMatrix(pose, flags, &(mat[0]));
+}
+/** @brief Set a matrix based on a Pose3. (C++-only overload - detects scalar,
+ * takes array, takes pose by reference) */
+template <typename Scalar>
+inline OSVR_ReturnCode osvrPose3ToMatrix(OSVR_Pose3 const &pose,
+ OSVR_MatrixConventions flags,
+ Scalar mat[OSVR_MATRIX_SIZE]) {
+ return osvrPose3ToMatrix(&pose, flags, &(mat[0]));
+}
+
+#endif
+
+/** @} */
+
+#endif