1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     math_Types.h
4 
5   Copyright (C)2009-2012 Nintendo Co., Ltd.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law. They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Rev: 47498 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NN_MATH_TYPES_H_
17 #define NN_MATH_TYPES_H_
18 
19 #include <nn/types.h>
20 #include <nn/math/math_Config.h>
21 #include <nn/math/math_Triangular.h>
22 #include <nn/math/math_Vector2.h>
23 #include <nn/math/math_Vector3.h>
24 #include <nn/math/math_Vector4.h>
25 #include <nn/math/math_Quaternion.h>
26 #include <nn/math/math_Matrix22.h>
27 #include <nn/math/math_Matrix23.h>
28 #include <nn/math/math_Matrix33.h>
29 #include <nn/math/math_Matrix34.h>
30 #include <nn/math/math_Matrix44.h>
31 #include <nn/math/math_Matrix43.h>
32 #include <nn/math/math_Transform.h>
33 
34 #include <nn/math/ARMv6/math_Types.h>
35 
36 #include <cstring>
37 
38 namespace nn {
39 namespace math {
40 
41 /* =======================================================================
42         Class definitions
43    ======================================================================== */
44 struct VEC2;
45 struct VEC3;
46 struct VEC4;
47 struct QUAT;
48 struct MTX34;
49 struct MTX43;
50 
51 /* Please see man pages for details
52 
53 
54 */
55 
56 /* ------------------------------------------------------------------------
57     MatrixUtility
58    ------------------------------------------------------------------------ */
59 
60 /*
61 
62 
63 
64 
65 
66 
67  */
68 NN_MATH_INLINE MTX22* MTX23ToMTX22(MTX22* pOut, const MTX23* pM);
69 
70 /*
71 
72 
73 
74 
75 
76 
77  */
78 NN_MATH_INLINE MTX23* MTX22ToMTX23(MTX23* pOut, const MTX22* pM);
79 
80 /*
81 
82 
83 
84 
85 
86 
87  */
88 NN_FORCE_INLINE MTX34* MTX33ToMTX34(MTX34* pOut, const MTX33* pM);
89 
90 /*
91 
92 
93 
94 
95 
96 
97  */
98 NN_FORCE_INLINE MTX33* MTX34ToMTX33(MTX33* pOut, const MTX34* pM);
99 
100 /*
101 
102 
103 
104 
105 
106 
107  */
108 NN_FORCE_INLINE MTX34* QUATToMTX34(MTX34* pOut, const QUAT* pQ);
109 
110 /*
111 
112 
113 
114 
115 
116 
117  */
118 NN_FORCE_INLINE MTX34* QUATToMTX34Partially(MTX34* pOut, const QUAT* pQ);
119 
120 /*
121 
122 
123 
124 
125 
126 
127  */
128 NN_FORCE_INLINE QUAT* MTX34ToQUAT(QUAT* pOut, const MTX34* pMtx);
129 
130 /*
131 
132 */
133 /* Please see man pages for details
134 
135 
136 */
137 
138 /*
139 
140 
141 
142 
143 
144 
145 
146 
147  */
148 NN_FORCE_INLINE MTX43* MTX34Transpose(MTX43* pOut, const MTX34* p);
149 
150 /*
151 
152 */
153 /* Please see man pages for details
154 
155 
156 */
157 
158 
159 /*
160 
161 
162 
163 
164 
165 
166  */
167 NN_FORCE_INLINE MTX34* MTX43Transpose(MTX34* pOut, const MTX43* p);
168 
169 /*
170 
171 */
172 
173 NN_FORCE_INLINE MTX34*
MTX33ToMTX34(MTX34 * pOut,const MTX33 * pM)174 MTX33ToMTX34(MTX34* pOut, const MTX33* pM)
175 {
176 #if defined( NN_HARDWARE_CTR )
177     #if (MTX33TOMTX34_CONFIG == D_ORG)
178         return ARMv6::MTX33ToMTX34C(pOut, pM);
179     #elif (MTX33TOMTX34_CONFIG == D_FAST_C)
180         return ARMv6::MTX33ToMTX34C_FAST(pOut, pM);
181     #elif (MTX33TOMTX34_CONFIG == D_FAST_ASM)
182     #elif (MTX33TOMTX34_CONFIG == D_FAST_C_ALGO)
183     #elif (MTX33TOMTX34_CONFIG == D_FAST_ASM_ALGO)
184     #endif
185 #else
186 #endif
187 }
188 
189 NN_FORCE_INLINE MTX33*
MTX34ToMTX33(MTX33 * pOut,const MTX34 * pM)190 MTX34ToMTX33(MTX33* pOut, const MTX34* pM)
191 {
192 #if defined( NN_HARDWARE_CTR )
193     #if (MTX34TOMTX33_CONFIG == D_ORG)
194         return ARMv6::MTX34ToMTX33C(pOut, pM);
195     #elif (MTX34TOMTX33_CONFIG == D_FAST_C)
196     #elif (MTX34TOMTX33_CONFIG == D_FAST_ASM)
197         return ARMv6::MTX34ToMTX33Asm(pOut, pM);
198     #elif (MTX34TOMTX33_CONFIG == D_FAST_C_ALGO)
199     #elif (MTX34TOMTX33_CONFIG == D_FAST_ASM_ALGO)
200     #endif
201 #else
202 #endif
203 }
204 
205 NN_FORCE_INLINE QUAT*
MTX34ToQUAT(QUAT * pOut,const MTX34 * pMtx)206 MTX34ToQUAT(QUAT* pOut, const MTX34* pMtx)
207 {
208 #if defined( NN_HARDWARE_CTR )
209     #if (MTX34TOQUAT_CONFIG == D_ORG)
210         return ARMv6::MTX34ToQUATC(pOut, pMtx);
211     #elif (MTX34TOQUAT_CONFIG == D_FAST_C)
212         return ARMv6::MTX34ToQUATC_FAST(pOut, pMtx);
213     #elif (MTX34TOQUAT_CONFIG == D_FAST_ASM)
214     #elif (MTX34TOQUAT_CONFIG == D_FAST_C_ALGO)
215     #elif (MTX34TOQUAT_CONFIG == D_FAST_ASM_ALGO)
216     #endif
217 #else
218 #endif
219 }
220 
221 NN_FORCE_INLINE MTX34*
QUATToMTX34(MTX34 * pOut,const QUAT * pQ)222 QUATToMTX34(MTX34* pOut, const QUAT* pQ)
223 {
224 #if defined( NN_HARDWARE_CTR )
225     #if (QUATTOMTX34_CONFIG == D_ORG)
226         return ARMv6::QUATToMTX34C(pOut, pQ);
227     #elif (QUATTOMTX34_CONFIG == D_FAST_C)
228         return ARMv6::QUATToMTX34C_FAST(pOut, pQ);
229     #elif (QUATTOMTX34_CONFIG == D_FAST_ASM)
230     #elif (QUATTOMTX34_CONFIG == D_FAST_C_ALGO)
231     #elif (QUATTOMTX34_CONFIG == D_FAST_ASM_ALGO)
232     #endif
233 #else
234 #endif // #if defined( NN_HARDWARE_CTR )
235 }
236 
237 NN_FORCE_INLINE MTX34*
QUATToMTX34Partially(MTX34 * pOut,const QUAT * pQ)238 QUATToMTX34Partially(MTX34* pOut, const QUAT* pQ)
239 {
240 #if defined( NN_HARDWARE_CTR )
241     #if (QUATTOMTX34_CONFIG == D_ORG)
242         return ARMv6::QUATToMTX34C(pOut, pQ, false);
243     #elif (QUATTOMTX34_CONFIG == D_FAST_C)
244         return ARMv6::QUATToMTX34C_FAST(pOut, pQ, false);
245     #elif (QUATTOMTX34_CONFIG == D_FAST_ASM)
246     #elif (QUATTOMTX34_CONFIG == D_FAST_C_ALGO)
247     #elif (QUATTOMTX34_CONFIG == D_FAST_ASM_ALGO)
248     #endif
249 #else
250 #endif // #if defined( NN_HARDWARE_CTR )
251 }
252 
253 NN_FORCE_INLINE MTX43*
MTX34Transpose(MTX43 * pOut,const MTX34 * p)254 MTX34Transpose(MTX43* pOut, const MTX34* p)
255 {
256 #if defined( NN_HARDWARE_CTR )
257     #if (MTX34TRANSPOSE_34TO43_CONFIG == D_ORG)
258         return ARMv6::MTX34TransposeC(pOut, p);
259     #elif (MTX34TRANSPOSE_34TO43_CONFIG == D_FAST_C)
260     #elif (MTX34TRANSPOSE_34TO43_CONFIG == D_FAST_ASM)
261         return ARMv6::MTX34TransposeAsm(pOut, p);
262     #elif (MTX34TRANSPOSE_34TO43_CONFIG == D_FAST_C_ALGO)
263     #elif (MTX34TRANSPOSE_34TO43_CONFIG == D_FAST_ASM_ALGO)
264     #endif
265 #else
266 #endif
267 }
268 
269 NN_FORCE_INLINE MTX34*
MTX43Transpose(MTX34 * pOut,const MTX43 * p)270 MTX43Transpose(MTX34* pOut, const MTX43* p)
271 {
272 #if defined( NN_HARDWARE_CTR )
273     #if (MTX43TRANSPOSE_CONFIG == D_ORG)
274         return ARMv6::MTX43TransposeC(pOut, p);
275     #elif (MTX43TRANSPOSE_CONFIG == D_FAST_C)
276     #elif (MTX43TRANSPOSE_CONFIG == D_FAST_ASM)
277         return ARMv6::MTX43TransposeAsm(pOut, p);
278     #elif (MTX43TRANSPOSE_CONFIG == D_FAST_C_ALGO)
279     #elif (MTX43TRANSPOSE_CONFIG == D_FAST_ASM_ALGO)
280     #endif
281 #else
282 #endif
283 
284 }
285 
286 }  // namespace math
287 }  // namespace nn
288 
289 
290 #if defined(NN_MATH_AS_INLINE)
291 #include <nn/math/inline/math_Types.ipp>
292 #include <nn/math/ARMv6/inline/math_Types.ipp>
293 #endif
294 
295 namespace nn {
296 namespace math {
297 
298 //Overload referencing the -- const argument
MTX23ToMTX22(MTX22 * pOut,const MTX23 & m)299 inline MTX22* MTX23ToMTX22(MTX22* pOut, const MTX23& m) { return MTX23ToMTX22(pOut, &m); }
MTX22ToMTX23(MTX23 * pOut,const MTX22 & m)300 inline MTX23* MTX22ToMTX23(MTX23* pOut, const MTX22& m) { return MTX22ToMTX23( pOut, &m ); }
MTX34ToMTX33(MTX33 * pOut,const MTX34 & m)301 inline MTX33* MTX34ToMTX33(MTX33* pOut, const MTX34& m) { return MTX34ToMTX33( pOut, &m ); }
MTX33ToMTX34(MTX34 * pOut,const MTX33 & m)302 inline MTX34* MTX33ToMTX34(MTX34* pOut, const MTX33& m) { return MTX33ToMTX34( pOut, &m ); }
MTX34ToQUAT(QUAT * pOut,const MTX34 & mtx)303 inline QUAT*  MTX34ToQUAT(QUAT* pOut, const MTX34& mtx) { return MTX34ToQUAT( pOut, &mtx ); }
QUATToMTX34(MTX34 * pOut,const QUAT & q)304 inline MTX34* QUATToMTX34(MTX34* pOut, const QUAT& q) { return QUATToMTX34( pOut, &q ); }
MTX43Transpose(MTX34 * pOut,const MTX43 & m)305 inline MTX34* MTX43Transpose(MTX34* pOut, const MTX43& m) { return MTX43Transpose( pOut, &m ); }
MTX34Transpose(MTX43 * pOut,const MTX34 & m)306 inline MTX43* MTX34Transpose(MTX43* pOut, const MTX34& m) { return MTX34Transpose( pOut, &m ); }
307 
308 }  // namespace math
309 }  // namespace nn
310 
311 #endif
312 
313 
314