Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/gfx/vr/osvr/Util/MatrixConventionsC.h
Line
Count
Source (jump to first uncovered line)
1
/** @file
2
    @brief Header
3
4
    Must be c-safe!
5
6
    @date 2015
7
8
    @author
9
    Sensics, Inc.
10
    <http://sensics.com/osvr>
11
*/
12
13
/*
14
// Copyright 2015 Sensics, Inc.
15
//
16
// Licensed under the Apache License, Version 2.0 (the "License");
17
// you may not use this file except in compliance with the License.
18
// You may obtain a copy of the License at
19
//
20
//        http://www.apache.org/licenses/LICENSE-2.0
21
//
22
// Unless required by applicable law or agreed to in writing, software
23
// distributed under the License is distributed on an "AS IS" BASIS,
24
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
25
// See the License for the specific language governing permissions and
26
// limitations under the License.
27
*/
28
29
#ifndef INCLUDED_MatrixConventionsC_h_GUID_6FC7A4C6_E6C5_4A96_1C28_C3D21B909681
30
#define INCLUDED_MatrixConventionsC_h_GUID_6FC7A4C6_E6C5_4A96_1C28_C3D21B909681
31
32
/* Internal Includes */
33
#include <osvr/Util/Export.h>
34
#include <osvr/Util/APIBaseC.h>
35
#include <osvr/Util/StdInt.h>
36
#include <osvr/Util/Pose3C.h>
37
#include <osvr/Util/ReturnCodesC.h>
38
39
/* Library/third-party includes */
40
/* none */
41
42
/* Standard includes */
43
/* none */
44
45
OSVR_EXTERN_C_BEGIN
46
47
/** @defgroup MatrixConvention Matrix conventions and bit flags
48
    @ingroup UtilMath
49
*/
50
51
/** @brief Type for passing matrix convention flags.
52
    @ingroup MatrixConvention
53
*/
54
typedef uint16_t OSVR_MatrixConventions;
55
56
#ifndef OSVR_DOXYGEN_EXTERNAL
57
/** @brief Bitmasks for testing matrix conventions.
58
    @ingroup MatrixConvention
59
*/
60
typedef enum OSVR_MatrixMasks {
61
    OSVR_MATRIX_MASK_ROWMAJOR = 0x1,
62
    OSVR_MATRIX_MASK_ROWVECTORS = 0x2,
63
    OSVR_MATRIX_MASK_LHINPUT = 0x4,
64
    OSVR_MATRIX_MASK_UNSIGNEDZ = 0x8
65
} OSVR_MatrixMasks;
66
#endif
67
68
/** @defgroup MatrixFlags Matrix flags
69
    @ingroup MatrixConvention
70
71
    Bit flags for specifying matrix options. Only one option may be specified
72
   per enum, with all the specified options combined with bitwise-or `|`.
73
74
    Most methods that take matrix flags only obey ::OSVR_MatrixOrderingFlags and
75
   ::OSVR_MatrixVectorFlags - the flags that affect memory order. The remaining
76
   flags are for use with projection matrix generation API methods.
77
78
    @{
79
*/
80
/** @brief Flag bit controlling output memory order */
81
typedef enum OSVR_MatrixOrderingFlags {
82
    /** @brief Column-major memory order (default) */
83
    OSVR_MATRIX_COLMAJOR = 0x0,
84
    /** @brief Row-major memory order */
85
    OSVR_MATRIX_ROWMAJOR = OSVR_MATRIX_MASK_ROWMAJOR
86
} OSVR_MatrixOrderingFlags;
87
88
/** @brief Flag bit controlling expected input to matrices.
89
    (Related to ::OSVR_MatrixOrderingFlags - setting one to non-default results
90
    in an output change, but setting both to non-default results in effectively
91
    no change in the output. If this blows your mind, just ignore this aside and
92
    carry on.)
93
*/
94
typedef enum OSVR_MatrixVectorFlags {
95
    /** @brief Matrix transforms column vectors (default) */
96
    OSVR_MATRIX_COLVECTORS = 0x0,
97
    /** @brief Matrix transforms row vectors */
98
    OSVR_MATRIX_ROWVECTORS = OSVR_MATRIX_MASK_ROWVECTORS
99
} OSVR_MatrixVectorFlags;
100
101
/** @brief Flag bit to indicate coordinate system input to projection matrix */
102
typedef enum OSVR_ProjectionMatrixInputFlags {
103
    /** @brief Matrix takes vectors from a right-handed coordinate system
104
       (default) */
105
    OSVR_MATRIX_RHINPUT = 0x0,
106
    /** @brief Matrix takes vectors from a left-handed coordinate system */
107
    OSVR_MATRIX_LHINPUT = OSVR_MATRIX_MASK_LHINPUT
108
109
} OSVR_ProjectionMatrixInputFlags;
110
111
/** @brief Flag bit to indicate the desired post-projection Z value convention
112
 */
113
typedef enum OSVR_ProjectionMatrixZFlags {
114
    /** @brief Matrix maps the near and far planes to signed Z values (in the
115
        range [-1, 1])  (default)*/
116
    OSVR_MATRIX_SIGNEDZ = 0x0,
117
    /** @brief Matrix maps the near and far planes to unsigned Z values (in the
118
        range [0, 1]) */
119
    OSVR_MATRIX_UNSIGNEDZ = OSVR_MATRIX_MASK_UNSIGNEDZ
120
} OSVR_ProjectionMatrixZFlags;
121
/** @} */ /* end of matrix flags group */
122
123
enum {
124
    /** @brief Constant for the number of elements in the matrices we use - 4x4.
125
        @ingroup MatrixConvention
126
    */
127
    OSVR_MATRIX_SIZE = 16
128
};
129
130
/** @addtogroup UtilMath
131
    @{
132
*/
133
/** @brief Set a matrix of doubles based on a Pose3.
134
    @param pose The Pose3 to convert
135
    @param flags Memory ordering flag - see @ref MatrixFlags
136
    @param[out] mat an array of 16 doubles
137
*/
138
OSVR_UTIL_EXPORT OSVR_ReturnCode osvrPose3ToMatrixd(
139
    OSVR_Pose3 const *pose, OSVR_MatrixConventions flags, double *mat);
140
141
/** @brief Set a matrix of floats based on a Pose3.
142
    @param pose The Pose3 to convert
143
    @param flags Memory ordering flag - see @ref MatrixFlags
144
    @param[out] mat an array of 16 floats
145
*/
146
OSVR_UTIL_EXPORT OSVR_ReturnCode osvrPose3ToMatrixf(
147
    OSVR_Pose3 const *pose, OSVR_MatrixConventions flags, float *mat);
148
/** @} */
149
150
OSVR_EXTERN_C_END
151
152
#ifdef __cplusplus
153
/** @brief Set a matrix based on a Pose3. (C++-only overload - detecting scalar
154
 * type) */
155
inline OSVR_ReturnCode osvrPose3ToMatrix(OSVR_Pose3 const *pose,
156
                                         OSVR_MatrixConventions flags,
157
0
                                         double *mat) {
158
0
    return osvrPose3ToMatrixd(pose, flags, mat);
159
0
}
160
161
/** @brief Set a matrix based on a Pose3. (C++-only overload - detecting scalar
162
 * type) */
163
inline OSVR_ReturnCode osvrPose3ToMatrix(OSVR_Pose3 const *pose,
164
                                         OSVR_MatrixConventions flags,
165
0
                                         float *mat) {
166
0
    return osvrPose3ToMatrixf(pose, flags, mat);
167
0
}
168
169
/** @brief Set a matrix based on a Pose3. (C++-only overload - detects scalar
170
 * and takes array rather than pointer) */
171
template <typename Scalar>
172
inline OSVR_ReturnCode osvrPose3ToMatrix(OSVR_Pose3 const *pose,
173
                                         OSVR_MatrixConventions flags,
174
                                         Scalar mat[OSVR_MATRIX_SIZE]) {
175
    return osvrPose3ToMatrix(pose, flags, &(mat[0]));
176
}
177
/** @brief Set a matrix based on a Pose3. (C++-only overload - detects scalar,
178
 * takes array, takes pose by reference) */
179
template <typename Scalar>
180
inline OSVR_ReturnCode osvrPose3ToMatrix(OSVR_Pose3 const &pose,
181
                                         OSVR_MatrixConventions flags,
182
                                         Scalar mat[OSVR_MATRIX_SIZE]) {
183
    return osvrPose3ToMatrix(&pose, flags, &(mat[0]));
184
}
185
186
#endif
187
188
/** @} */
189
190
#endif