gecko-dev/gfx/vr/osvr/Util/MatrixConventionsC.h

191 строка
6.3 KiB
C++

/** @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