1 /*---------------------------------------------------------------------------*
2 Project: Horizon
3 File: math_Matrix34.h
4
5 Copyright (C)2009-2010 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 $Revision: 24035 $
14 *---------------------------------------------------------------------------*/
15
16 #ifndef NN_MATH_MATRIX34_H_
17 #define NN_MATH_MATRIX34_H_
18
19 #include <cstring>
20 #include <nn/math/math_Config.h>
21 #include <nn/math/ARMv6/math_Matrix34.h>
22
23 #pragma push
24 #pragma Otime
25
26 namespace nn {
27 namespace math {
28
29 struct MTX34;
30
31 /* ------------------------------------------------------------------------
32 MTX34用の関数
33 ------------------------------------------------------------------------ */
34 NN_MATH_INLINE MTX34* MTX34Zero(MTX34* pOut);
35 NN_MATH_INLINE bool MTX34IsIdentity(const MTX34* p);
36 NN_MATH_INLINE MTX34* MTX34Identity(MTX34* pOut);
37 NN_MATH_INLINE MTX34* MTX34Copy(MTX34* pOut, const MTX34* p);
38
39 NN_MATH_INLINE MTX34* MTX34Add(MTX34* pOut, const MTX34* p1, const MTX34* p2);
40 NN_MATH_INLINE MTX34* MTX34Sub(MTX34* pOut, const MTX34* p1, const MTX34* p2);
41 NN_MATH_INLINE MTX34* MTX34Mult(MTX34* pOut, const MTX34* p, f32 f);
42 NN_MATH_INLINE MTX34* MTX34Mult(MTX34* pOut, const MTX34* p1, const MTX34* p2);
43 NN_MATH_INLINE MTX34* MTX34MAdd(MTX34* pOut, f32 t, const MTX34* p1, const MTX34* p2);
44
45 NN_MATH_INLINE MTX33* MTX34ToMTX33(MTX33* pOut, const MTX34* pM);
46 NN_MATH_INLINE MTX34* MTX33ToMTX34(MTX34* pOut, const MTX33* pM);
47
48 NN_MATH_INLINE MTX34* MTX34MultArray(MTX34* pOut, const MTX34* p1, const MTX34* pSrc, s32 count);
49 NN_MATH_INLINE u32 MTX34Inverse(MTX34* pOut, const MTX34* p);
50 NN_MATH_INLINE MTX34* MTX34Transpose(MTX34* pOut, const MTX34* p);
51 NN_MATH_INLINE u32 MTX34InvTranspose(MTX34* pOut, const MTX34* p);
52
53 NN_MATH_INLINE MTX34* MTX34LookAt(MTX34* pOut, const VEC3* pCamPos, const VEC3* pCamUp, const VEC3* pTarget);
54 NN_MATH_INLINE MTX34* MTX34LookAt(MTX34* pOut, const VEC3* pCamPos, f32 twistDeg, const VEC3* pTarget);
55 NN_MATH_INLINE MTX34* MTX34CameraRotate(MTX34* pOut, const VEC3* pCamPos, const VEC3* pCamRotateDeg);
56
57 NN_MATH_INLINE MTX34* MTX34TextureProjectionFrustum(MTX34* pOut, f32 l, f32 r, f32 b, f32 t, f32 n, f32 scaleS, f32 scaleT, f32 translateS, f32 translateT);
58 NN_MATH_INLINE MTX34* MTX34TextureProjectionPerspective(MTX34* pOut, f32 fovy, f32 aspect, f32 scaleS, f32 scaleT, f32 translateS, f32 translateT);
59 NN_MATH_INLINE MTX34* MTX34TextureProjectionOrtho(MTX34* pOut, f32 l, f32 r, f32 b, f32 t, f32 scaleS, f32 scaleT, f32 translateS, f32 translateT);
60
61 NN_MATH_INLINE MTX34* MTX34RotXYZFIdx(MTX34* pOut, f32 fIdxX, f32 fIdxY, f32 fIdxZ);
62 NN_MATH_INLINE MTX34* MTX34RotXYZTranslateFIdx(MTX34* pOut, f32 fIdxX, f32 fIdxY, f32 fIdxZ, const VEC3* pT);
63 NN_MATH_INLINE MTX34* MTX34RotAxisFIdx(MTX34* pOut, const VEC3* pAxis, f32 fIdx);
64
65 NN_MATH_INLINE MTX34* MTX34Scale(MTX34* pOut, const VEC3* pS);
66 NN_MATH_INLINE MTX34* MTX34MultScale(MTX34* pOut, const MTX34* pM, const VEC3* pS);
67 NN_MATH_INLINE MTX34* MTX34MultScale(MTX34* pOut, const VEC3* pS, const MTX34* pM);
68
69 NN_MATH_INLINE MTX34* MTX34Translate(MTX34* pOut, const VEC3* pT);
70 NN_MATH_INLINE MTX34* MTX34MultTranslate(MTX34* pOut, const MTX34* pM, const VEC3* pT);
71 NN_MATH_INLINE MTX34* MTX34MultTranslate(MTX34* pOut, const VEC3* pT, const MTX34* pM);
72 NN_MATH_INLINE MTX34* QUATToMTX34(MTX34* pOut, const QUAT* p);
73
74 NN_FORCE_INLINE MTX34* MTX34Copy(MTX34* pOut, const MTX34* p);
75 NN_FORCE_INLINE MTX34* MTX34Mult(MTX34* pOut, const MTX34* p1, const MTX34* p2);
76 NN_FORCE_INLINE MTX34* MTX34Add(MTX34* pOut, const MTX34* p1, const MTX34* p2);
77 NN_FORCE_INLINE MTX34* MTX34CameraRotate(MTX34* pOut, const VEC3* pCamPos, const VEC3* pCamRotateDeg);
78 NN_FORCE_INLINE u32 MTX34Inverse(MTX34* pOut, const MTX34* p);
79 NN_FORCE_INLINE u32 MTX34InvTranspose(MTX34* pOut, const MTX34* p);
80 NN_FORCE_INLINE MTX34* MTX34LookAt(MTX34* pOut, const VEC3* pCamPos, const VEC3* pCamUp, const VEC3* pTarget);
81 NN_FORCE_INLINE MTX34* MTX34LookAt(MTX34* pOut, const VEC3* pCamPos, f32 twistDeg, const VEC3* pTarget);
82 NN_FORCE_INLINE MTX34* MTX34MAdd(MTX34* pOut, f32 t, const MTX34* p1, const MTX34* p2);
83 NN_FORCE_INLINE MTX34* MTX34Mult(MTX34* pOut, const MTX34* p, f32 f);
84 NN_FORCE_INLINE MTX34* MTX34MultScale(MTX34* pOut, const MTX34* pM, const VEC3* pS);
85 NN_FORCE_INLINE MTX34* MTX34MultScale(MTX34* pOut, const VEC3* __restrict pS, const MTX34* pM);
86 NN_FORCE_INLINE MTX34* MTX34MultTranslate(MTX34* pOut, const VEC3* pT, const MTX34* pM);
87 NN_FORCE_INLINE MTX34* MTX34MultTranslate(MTX34* pOut, const MTX34* pM, const VEC3* pT);
88 NN_FORCE_INLINE MTX34* MTX34RotAxisRad_( MTX34* pOut, const VEC3 *pAxis, f32 fRad );
89 NN_FORCE_INLINE MTX34* MTX34Scale(MTX34* pOut, const VEC3* pS);
90 NN_FORCE_INLINE MTX34* MTX34Transpose(MTX34* pOut, const MTX34* p);
91 NN_FORCE_INLINE MTX34* QUATToMTX34(MTX34* pOut, const QUAT* pQ);
92 NN_FORCE_INLINE VEC3* VEC3Transform(VEC3* pOut, const MTX34* __restrict pM, const VEC3* __restrict pV);
93
94 // そのうち実装する
95 //MTX34* MTX34Inv(MTX34* pOut, f32* pDet, const MTX34* p);
96 //MTX34* MTX34InvTranspose(MTX34* pOut, f32* pDet, const MTX34* p);
97 //f32 MTX34Det(const MTX34* p);
98
99 /*!
100 @name 行列
101 @{
102 */
103
104 /*!--------------------------------------------------------------------------*
105 @brief 回転行列を作成します。
106
107 @param[out] pOut 計算結果を受け取るバッファへのポインタ。
108 @param[in] fRadX ラジアン単位での X 軸周りの角度
109 @param[in] fRadY ラジアン単位での Y 軸周りの角度
110 @param[in] fRadZ ラジアン単位での Z 軸周りの角度
111
112 @return pOut を返します。
113 *---------------------------------------------------------------------------*/
114 inline MTX34*
MTX34RotXYZRad(MTX34 * pOut,f32 fRadX,f32 fRadY,f32 fRadZ)115 MTX34RotXYZRad(MTX34* pOut, f32 fRadX, f32 fRadY, f32 fRadZ)
116 {
117 return MTX34RotXYZFIdx(pOut, NN_MATH_RAD_TO_FIDX(fRadX), NN_MATH_RAD_TO_FIDX(fRadY), NN_MATH_RAD_TO_FIDX(fRadZ));
118 }
119
120 /*!--------------------------------------------------------------------------*
121 @brief 回転行列を作成します。
122
123 @param[out] pOut 計算結果を受け取るバッファへのポインタ。
124 @param[in] fDegX 1 円周を 360.0 とする単位での X 軸周りの角度
125 @param[in] fDegY 1 円周を 360.0 とする単位での Y 軸周りの角度
126 @param[in] fDegZ 1 円周を 360.0 とする単位での Z 軸周りの角度
127
128 @return pOut を返します。
129 *---------------------------------------------------------------------------*/
130 inline MTX34*
MTX34RotXYZDeg(MTX34 * pOut,f32 fDegX,f32 fDegY,f32 fDegZ)131 MTX34RotXYZDeg(MTX34* pOut, f32 fDegX, f32 fDegY, f32 fDegZ)
132 {
133 return MTX34RotXYZFIdx(pOut, NN_MATH_DEG_TO_FIDX(fDegX), NN_MATH_DEG_TO_FIDX(fDegY), NN_MATH_DEG_TO_FIDX(fDegZ));
134 }
135
136 /*!--------------------------------------------------------------------------*
137 @brief 指定する軸の周りを回転させる回転行列を作成します。
138
139 @param[out] pOut 計算結果を受け取るバッファへのポインタ。
140 @param[in] pAxis 回転軸を指定するベクトルへのポインタ。
141 @param[in] fRad ラジアン単位での回転量
142
143 @return pOut を返します。
144 *---------------------------------------------------------------------------*/
145 inline MTX34*
MTX34RotAxisRad(MTX34 * pOut,const VEC3 * pAxis,f32 fRad)146 MTX34RotAxisRad(MTX34* pOut, const VEC3* pAxis, f32 fRad)
147 {
148 return MTX34RotAxisFIdx(pOut, pAxis, NN_MATH_RAD_TO_FIDX(fRad));
149 }
150
151 /*!--------------------------------------------------------------------------*
152 @brief 指定する軸の周りを回転させる回転行列を作成します。
153
154 @param[out] pOut 計算結果を受け取るバッファへのポインタ。
155 @param[in] pAxis 回転軸を指定するベクトルへのポインタ。
156 @param[in] fDeg 1 円周を 360.0 とする単位での回転量
157
158 @return pOut を返します。
159 *---------------------------------------------------------------------------*/
160 inline MTX34*
MTX34RotAxisDeg(MTX34 * pOut,const VEC3 * pAxis,f32 fDeg)161 MTX34RotAxisDeg(MTX34* pOut, const VEC3* pAxis, f32 fDeg)
162 {
163 return MTX34RotAxisFIdx(pOut, pAxis, NN_MATH_DEG_TO_FIDX(fDeg));
164 }
165
166 /*!
167 @}
168 */
169
170 /* =======================================================================
171 クラスの定義
172 ======================================================================== */
173 struct MTX34_
174 {
175 struct BaseData
176 {
177 f32 _00, _01, _02, _03;
178 f32 _10, _11, _12, _13;
179 f32 _20, _21, _22, _23;
180 };
181
182 union
183 {
184 #if defined(NN_MATH_USE_ANONYMOUS_STRUCT)
185 struct
186 {
187 f32 _00, _01, _02, _03;
188 f32 _10, _11, _12, _13;
189 f32 _20, _21, _22, _23;
190 };
191 #endif
192 BaseData f;
193 f32 m[3][4];
194 f32 a[12];
195 VEC4_ v[3];
196 };
197 };
198
199 /*!--------------------------------------------------------------------------*
200 @brief 3行4列の行列クラスです。
201 *---------------------------------------------------------------------------*/
202 struct MTX34 : public MTX34_
203 {
204 public:
205 static const int ROW_COUNT = 3; //!< 行数です。
206 static const int COLUMN_COUNT = 4; //!< 列数です。
207
208 //! @brief 単位行列です。
IdentityMTX34209 static const MTX34& Identity()
210 {
211 static const MTX34 identity(
212 1.0f, 0.0f, 0.0f, 0.0f,
213 0.0f, 1.0f, 0.0f, 0.0f,
214 0.0f, 0.0f, 1.0f, 0.0f);
215
216 return identity;
217 }
218
219 typedef MTX34 self_type; //!< 自分の型です。
220 typedef f32 value_type; //!< 要素の型です。
221 public:
222 //----------------------------------------
223 //! @name 作成
224 //@{
225
226 //! @brief コンストラクタです。
MTX34MTX34227 MTX34() {}
228
229 //! @brief コンストラクタです。
MTX34MTX34230 MTX34(const f32* p) { (void)MTX34Copy(this, (MTX34*)p); }
231
232 //! @brief コピーコンストラクタです。
MTX34MTX34233 MTX34(const MTX34& rhs) { (void)MTX34Copy(this, &rhs); }
234
235 //! @brief コンストラクタです。
MTX34MTX34236 MTX34(const MTX33& rhs) { MTX33ToMTX34(this, &rhs); }
237
238 //! @brief コンストラクタです。
MTX34MTX34239 MTX34(f32 x00, f32 x01, f32 x02, f32 x03,
240 f32 x10, f32 x11, f32 x12, f32 x13,
241 f32 x20, f32 x21, f32 x22, f32 x23)
242 {
243 f._00 = x00; f._01 = x01; f._02 = x02; f._03 = x03;
244 f._10 = x10; f._11 = x11; f._12 = x12; f._13 = x13;
245 f._20 = x20; f._21 = x21; f._22 = x22; f._23 = x23;
246 }
247
248 //@}
249
250 //----------------------------------------
251 //! @name 変換
252 //@{
253
254 //! @brief f32 型へのキャストです。
255 operator f32*() { return this->a; }
256
257 //! @brief f32 型へのキャストです。
258 operator const f32*() const { return this->a; }
259
260 //! @brief VEC4 型として行を取得します。
GetRowMTX34261 VEC4& GetRow(int index)
262 {
263 NN_MATH_MINMAXLT_ASSERT(index, 0, ROW_COUNT);
264 return *reinterpret_cast<VEC4*>(&this->v[index]);
265 }
266
267 //! @brief VEC4 型として行を取得します。
GetRowMTX34268 const VEC4& GetRow(int index) const
269 {
270 NN_MATH_MINMAXLT_ASSERT(index, 0, ROW_COUNT);
271 return *reinterpret_cast<const VEC4*>(&this->v[index]);
272 }
273
274 //! @brief VEC3 型として列を取得します。
GetColumnMTX34275 VEC3 GetColumn(int index) const
276 {
277 NN_MATH_MINMAXLT_ASSERT(index, 0, COLUMN_COUNT);
278 VEC3 column;
279 column.x = this->m[0][index];
280 column.y = this->m[1][index];
281 column.z = this->m[2][index];
282 return column;
283 }
284
285 //! @brief VEC3 型で列を設定します。
SetColumnMTX34286 void SetColumn(int index, const VEC3& column)
287 {
288 NN_MATH_MINMAXLT_ASSERT(index, 0, COLUMN_COUNT);
289 this->m[0][index] = column.x;
290 this->m[1][index] = column.y;
291 this->m[2][index] = column.z;
292 }
293 //@}
294
295 //----------------------------------------
296 //! @name 演算
297 //@{
298 self_type& operator += (const self_type& rhs) { return *MTX34Add(this, this, &rhs); }
299 self_type& operator -= (const self_type& rhs) { return *MTX34Sub(this, this, &rhs); }
300
301 //! @brief 行列を右からかけた値を代入します。
302 self_type& operator *= (f32 f) { return *MTX34Mult(this, this, f); }
303 self_type& operator /= (f32 f) { return operator*=(1.f / f); }
304
305 self_type operator + () const { return *this; }
306 self_type operator - () const
307 {
308 return MTX34(-f._00, -f._01, -f._02, -f._03,
309 -f._10, -f._11, -f._12, -f._13,
310 -f._20, -f._21, -f._22, -f._23);
311 }
312
313 self_type operator + (const self_type& rhs) const { MTX34 tmp; return *MTX34Add(&tmp, this, &rhs); }
314 self_type operator - (const self_type& rhs) const { MTX34 tmp; return *MTX34Sub(&tmp, this, &rhs); }
315
316 self_type operator * (f32 f) const { MTX34 tmp; return *MTX34Mult(&tmp, this, f); }
317 self_type operator / (f32 f) const { return *this * (1.f / f); }
318
319 //! 転置を行います。
TransposeMTX34320 self_type& Transpose() { return *MTX34Transpose(this, this); }
321
322 //@}
323
324 //----------------------------------------
325 //! @name 設定
326 //@{
327
328 //! @brief 単位行列に設定します。
SetupIdentityMTX34329 self_type& SetupIdentity() { return *MTX34Identity(this); }
330
331 //! @brief スケール変換行列に設定します。
332 //!
333 //! @param[in] scale スケール値です。
334 //!
SetupScaleMTX34335 self_type& SetupScale(const VEC3& scale) { return *MTX34Scale(this, &scale); }
336
337 //! @brief 平行移動行列に設定します。
338 //!
339 //! @param[in] translate 平行移動値です。
340 //!
SetupTranslateMTX34341 self_type& SetupTranslate(const VEC3& translate)
342 {
343 return *MTX34Translate(this, &translate);
344 }
345
346 //! @brief XYZ 順の回転行列に設定します。
347 //!
348 //! @param[in] rotate 回転値です。単位はラジアンです。
349 //!
SetupRotateXyzMTX34350 self_type& SetupRotateXyz(const VEC3& rotate)
351 {
352 return *MTX34RotXYZRad(this, rotate.x, rotate.y, rotate.z);
353 }
354
355 //! @brief 指定した軸周りの回転行列に設定します。
356 //!
357 //! @param[in] axis 基準となる軸のベクトルです。
358 //! @param[in] theta 回転させる角度です。単位はラジアンです。
359 //!
SetupRotateMTX34360 self_type& SetupRotate(const VEC3& axis, f32 theta)
361 {
362 return *MTX34RotAxisRad(this, &axis, theta);
363 }
364
365 //! @brief クォータニオンから回転行列を設定します。
366 //!
367 //! @param[in] quaternion 元となるクォータニオンです。
SetupRotateMTX34368 self_type& SetupRotate(const QUAT& quaternion)
369 {
370 return *QUATToMTX34(this, &quaternion);
371 }
372
373 /*!--------------------------------------------------------------------------*
374 @brief カメラ行列を設定します。
375
376 @param[in] camPos カメラの位置を指定するベクトルへのポインタ。
377 @param[in] camUp カメラの上方向を指定するベクトルへのポインタ。
378 @param[in] target カメラの注視点を指定するベクトルへのポインタ。
379 *---------------------------------------------------------------------------*/
SetupLookAtMTX34380 self_type& SetupLookAt(const VEC3& camPos, const VEC3& camUp, const VEC3& target)
381 {
382 return *MTX34LookAt(this, &camPos, &camUp, &target);
383 }
384
385 /*!--------------------------------------------------------------------------*
386 @brief カメラ行列を設定します。
387
388 @param[in] camPos カメラの位置を指定するベクトルへのポインタ。
389 @param[in] twistDeg カメラの視線方向に対する回転角度。単位は Degree です。
390 @param[in] target カメラの注視点を指定するベクトルへのポインタ。
391 *---------------------------------------------------------------------------*/
SetupLookAtMTX34392 self_type& SetupLookAt(const VEC3& camPos, f32 twistDeg, const VEC3& target)
393 {
394 return *MTX34LookAt(this, &camPos, twistDeg, &target);
395 }
396
397 /*!--------------------------------------------------------------------------*
398 @brief カメラ行列を設定します。
399
400 @param[in] camPos カメラの位置を指定するベクトルへのポインタ。
401 @param[in] camRotateDeg カメラの回転量を指定するベクトルへのポインタ。単位は Degree です。
402 *---------------------------------------------------------------------------*/
SetupCameraRotateMTX34403 self_type& SetupCameraRotate(const VEC3& camPos, const VEC3& camRotateDeg)
404 {
405 return *MTX34CameraRotate(this, &camPos, &camRotateDeg);
406 }
407
408 /*!--------------------------------------------------------------------------*
409 @brief テクスチャマトリクス用射影行列を視錐体を元に作成します。
410
411 @param[in] l ニアクリップの左辺です。
412 @param[in] r ニアクリップの右辺です。
413 @param[in] b ニアクリップの下辺です。
414 @param[in] t ニアクリップの上辺です。
415 @param[in] n カメラからニアクリップまでの距離です。
416 @param[in] scaleS S軸方向のスケール値です。
417 @param[in] scaleT T軸方向のスケール値です。
418 @param[in] translateS S軸方向の移動値です。
419 @param[in] translateT T軸方向の移動値です。
420 *---------------------------------------------------------------------------*/
SetupTextureProjectionFrustumMTX34421 self_type& SetupTextureProjectionFrustum(f32 l, f32 r, f32 b, f32 t, f32 n, f32 scaleS, f32 scaleT, f32 translateS, f32 translateT)
422 {
423 return *MTX34TextureProjectionFrustum(this, l, r, b, t, n, scaleS, scaleT, translateS, translateT);
424 }
425
426 /*!--------------------------------------------------------------------------*
427 @brief テクスチャマトリクス用射影行列を作成します。
428
429 @param[in] fovyRad 垂直視野角です。単位はラジアンです。
430 @param[in] aspect クリップ面のアスペクト比です。
431 @param[in] scaleS S軸方向のスケール値です。
432 @param[in] scaleT T軸方向のスケール値です。
433 @param[in] translateS S軸方向の移動値です。
434 @param[in] translateT T軸方向の移動値です。
435 *---------------------------------------------------------------------------*/
SetupTextureProjectionFrustumMTX34436 self_type& SetupTextureProjectionFrustum(f32 fovyRad, f32 aspect, f32 scaleS, f32 scaleT, f32 translateS, f32 translateT)
437 {
438 return *MTX34TextureProjectionPerspective(this, fovyRad, aspect, scaleS, scaleT, translateS, translateT);
439 }
440
441 /*!--------------------------------------------------------------------------*
442 @brief 平行射影行列を作成します。
443
444 @param[out] pOut 計算結果を受け取るバッファへのポインタです。
445 @param[in] l ニアクリップの左辺です。
446 @param[in] r ニアクリップの右辺です。
447 @param[in] b ニアクリップの下辺です。
448 @param[in] t ニアクリップの上辺です。
449 @param[in] scaleS S軸方向のスケール値です。
450 @param[in] scaleT T軸方向のスケール値です。
451 @param[in] translateS S軸方向の移動値です。
452 @param[in] translateT T軸方向の移動値です。
453 *---------------------------------------------------------------------------*/
SetupTextureProjectionFrustumMTX34454 self_type& SetupTextureProjectionFrustum(f32 l, f32 r, f32 b, f32 t, f32 scaleS, f32 scaleT, f32 translateS, f32 translateT)
455 {
456 return *MTX34TextureProjectionOrtho(this, l, r, b, t, scaleS, scaleT, translateS, translateT);
457 }
458
459 //@}
460
461 //----------------------------------------
462 //! @name 比較
463 //@{
464
465 //! @brief 同値であれば true を返します。
466 bool operator == (const self_type& rhs) const { return ::std::memcmp(this, &rhs, sizeof(MTX34)) == 0; }
467
468 //! @brief 同値でなければ true を返します。
469 bool operator != (const self_type& rhs) const { return ::std::memcmp(this, &rhs, sizeof(MTX34)) != 0; }
470
471 //! @brief 単位行列であれば true を返します。
IsIdentityMTX34472 bool IsIdentity() const { return MTX34IsIdentity(this); }
473 //@}
474
475 //! @brief 状態を出力します。
476 void Report(bool bNewline = true, const char* name = NULL) const;
477 };
478
479 typedef struct MTX34 Matrix34;
480
481 //
482 inline MTX34 operator * (f32 f, const MTX34& rhs)
483 {
484 MTX34 tmp;
485 (void)MTX34Mult(&tmp, &rhs, f);
486 return tmp;
487 }
488
489 /*!
490 @name 行列
491 @{
492 */
493
494 /*!--------------------------------------------------------------------------*
495 @brief 行列をコピーします。
496
497 @param[out] pOut コピー先の行列へのポインタ。
498 @param[in] p コピー元の行列へのポインタ
499
500 @return pOut を返します。
501 *---------------------------------------------------------------------------*/
502 NN_FORCE_INLINE MTX34*
MTX34Copy(MTX34 * pOut,const MTX34 * p)503 MTX34Copy(MTX34* pOut, const MTX34* p)
504 {
505
506 #if defined( NN_HARDWARE_CTR )
507 #if (MTX34COPY_CONFIG == D_ORG)
508 return ARMv6::MTX34CopyC( pOut, p );
509 #elif (MTX34COPY_CONFIG == D_FAST_C)
510 #elif (MTX34COPY_CONFIG == D_FAST_ASM)
511 return ARMv6::MTX34CopyAsm( pOut, p );
512 #elif (MTX34COPY_CONFIG == D_FAST_C_ALGO)
513 #elif (MTX34COPY_CONFIG == D_FAST_ASM_ALGO)
514 #endif
515 #else
516 #endif // #if defined( NN_HARDWARE_CTR )
517 }
518
519 /*!--------------------------------------------------------------------------*
520 @brief 行列の積を計算します。
521
522 @param[out] pOut 計算結果を受け取るバッファへのポインタ。
523 p1, p2 と同じ行列を指していても構いません。
524 @param[in] p1 左辺値へのポインタ。
525 @param[in] p2 右辺値へのポインタ。
526
527 @return pOut を返します。
528 *---------------------------------------------------------------------------*/
529 NN_FORCE_INLINE MTX34*
MTX34Mult(MTX34 * pOut,const MTX34 * p1,const MTX34 * p2)530 MTX34Mult(MTX34* pOut, const MTX34* p1, const MTX34* p2)
531 {
532 #if defined( NN_HARDWARE_CTR )
533 #if (MTX34MULT_34_CONFIG == D_ORG)
534 return ARMv6::MTX34MultC( pOut, p1, p2 );
535 #elif (MTX34MULT_34_CONFIG == D_FAST_C)
536 #elif (MTX34MULT_34_CONFIG == D_FAST_ASM)
537 return ARMv6::MTX34MultAsm( pOut, p1, p2 );
538 #elif (MTX34MULT_34_CONFIG == D_FAST_C_ALGO)
539 #elif (MTX34MULT_34_CONFIG == D_FAST_ASM_ALGO)
540 #endif
541 #else
542 #endif // #if defined( NN_HARDWARE_CTR )
543 }
544 /*!--------------------------------------------------------------------------*
545 @brief 行列のスカラー積を計算します。
546
547 @param[out] pOut 計算結果を受け取るバッファへのポインタ。p と同じ行列を指していても構いません。
548 @param[in] p 元の行列のポインタ。
549 @param[in] f 掛ける数
550
551 @return pOut を返します。
552 *---------------------------------------------------------------------------*/
553 NN_FORCE_INLINE MTX34*
MTX34Mult(MTX34 * pOut,const MTX34 * p,f32 f)554 MTX34Mult(MTX34* pOut, const MTX34* p, f32 f)
555 {
556 #if defined( NN_HARDWARE_CTR )
557 #if (MTX34MULT_F32_CONFIG == D_ORG)
558 return ARMv6::MTX34MultC( pOut, p, f );
559 #elif (MTX34MULT_F32_CONFIG == D_FAST_C)
560 #elif (MTX34MULT_F32_CONFIG == D_FAST_ASM)
561 return ARMv6::MTX34MultAsm( pOut, p, f );
562 #elif (MTX34MULT_F32_CONFIG == D_FAST_C_ALGO)
563 #elif (MTX34MULT_F32_CONFIG == D_FAST_ASM_ALGO)
564 #endif
565 #else
566 #endif // #if defined( NN_HARDWARE_CTR )
567 }
568
569
570 /*!--------------------------------------------------------------------------*
571 @brief 行列の和を計算します。
572
573 @param[out] pOut 計算結果を受け取るバッファへのポインタ。p1, p2 と同じ行列を指していても構いません。
574 @param[in] p1 左辺値へのポインタ。
575 @param[in] p2 右辺値へのポインタ。
576
577 @return pOut を返します。
578 *---------------------------------------------------------------------------*/
579 NN_FORCE_INLINE MTX34*
MTX34Add(MTX34 * pOut,const MTX34 * p1,const MTX34 * p2)580 MTX34Add(MTX34* pOut, const MTX34* p1, const MTX34* p2)
581 {
582 #if defined( NN_HARDWARE_CTR )
583 #if (MTX34ADD_CONFIG == D_ORG)
584 return ARMv6::MTX34AddC( pOut, p1, p2 );
585 #elif (MTX34ADD_CONFIG == D_FAST_C)
586 #elif (MTX34ADD_CONFIG == D_FAST_ASM)
587 return ARMv6::MTX34AddAsm( pOut, p1, p2 );
588 #elif (MTX34ADD_CONFIG == D_FAST_C_ALGO)
589 #elif (MTX34ADD_CONFIG == D_FAST_ASM_ALGO)
590 #endif
591 #else
592 #endif // #if defined( NN_HARDWARE_CTR )
593 }
594
595 /*!--------------------------------------------------------------------------*
596 @brief カメラ行列を設定します。
597
598 @param[out] pOut 計算結果を受け取るバッファへのポインタ。
599 @param[in] pCamPos カメラの位置を指定するベクトルへのポインタ。
600 @param[in] pCamRotateDeg カメラの回転量を指定するベクトルへのポインタ。単位は Degree です。
601
602 @return pOut を返します。
603 *---------------------------------------------------------------------------*/
604 NN_FORCE_INLINE MTX34*
MTX34CameraRotate(MTX34 * pOut,const VEC3 * pCamPos,const VEC3 * pCamRotateDeg)605 MTX34CameraRotate(MTX34* pOut, const VEC3* pCamPos, const VEC3* pCamRotateDeg)
606 {
607 #if defined( NN_HARDWARE_CTR )
608 #if (MTX34CAMERAROTATE_CONFIG == D_ORG)
609 return ARMv6::MTX34CameraRotateC(pOut, pCamPos, pCamRotateDeg);
610 #elif (MTX34CAMERAROTATE_CONFIG == D_FAST_C)
611 return ARMv6::MTX34CameraRotateC_FAST(pOut, pCamPos, pCamRotateDeg);
612 #elif (MTX34CAMERAROTATE_CONFIG == D_FAST_ASM)
613 #elif (MTX34CAMERAROTATE_CONFIG == D_FAST_C_ALGO)
614 #elif (MTX34CAMERAROTATE_CONFIG == D_FAST_ASM_ALGO)
615 #endif
616 #else
617 #endif // #if defined( NN_HARDWARE_CTR )
618 }
619
620
621 /*!--------------------------------------------------------------------------*
622 @brief 行列の逆行列を計算します。
623
624 @param[out] pOut 計算結果を受け取るバッファへのポインタ。p と同じ行列を指していても構いません。
625 @param[in] p 元となる行列へのポインタ。
626
627 @return 逆行列が存在すれば 1 を、存在しなければ 0 を返します。
628 *---------------------------------------------------------------------------*/
629 NN_FORCE_INLINE u32
MTX34Inverse(MTX34 * pOut,const MTX34 * p)630 MTX34Inverse(MTX34* pOut, const MTX34* p)
631 {
632 #if defined( NN_HARDWARE_CTR )
633 #if (MTX34INVERSE_CONFIG == D_ORG)
634 return ARMv6::MTX34InverseC( pOut, p );
635 #elif (MTX34INVERSE_CONFIG == D_FAST_C)
636 #elif (MTX34INVERSE_CONFIG == D_FAST_ASM)
637 return ARMv6::MTX34InverseAsm( pOut, p);
638 #elif (MTX34INVERSE_CONFIG == D_FAST_C_ALGO)
639 #elif (MTX34INVERSE_CONFIG == D_FAST_ASM_ALGO)
640 #endif
641 #else
642 #endif // #if defined( NN_HARDWARE_CTR )
643 }
644
645 /*!--------------------------------------------------------------------------*
646 @brief 行列の逆転置行列を計算します。
647
648 @param[out] pOut 計算結果を受け取るバッファへのポインタ。p と同じ行列を指していても構いません。
649 @param[in] p 元となる行列へのポインタ。
650
651 @return 逆行列が存在すれば 1 を、存在しなければ 0 を返します。
652 *---------------------------------------------------------------------------*/
653 NN_FORCE_INLINE u32
MTX34InvTranspose(MTX34 * pOut,const MTX34 * __restrict p)654 MTX34InvTranspose(MTX34* pOut, const MTX34* __restrict p)
655 {
656 #if defined( NN_HARDWARE_CTR )
657 #if (MTX34INVTRANSPOSE_34TO34_CONFIG == D_ORG)
658 return ARMv6::MTX34InvTransposeC( pOut, p );
659 #elif (MTX34INVTRANSPOSE_34TO34_CONFIG == D_FAST_C)
660 #elif (MTX34INVTRANSPOSE_34TO34_CONFIG == D_FAST_ASM)
661 return ARMv6::MTX34InvTransposeAsm( pOut, p);
662 #elif (MTX34INVTRANSPOSE_34TO34_CONFIG == D_FAST_C_ALGO)
663 #elif (MTX34INVTRANSPOSE_34TO34_CONFIG == D_FAST_ASM_ALGO)
664 #endif
665 #else
666 #endif // #if defined( NN_HARDWARE_CTR )
667 }
668
669 /*!--------------------------------------------------------------------------*
670 @brief カメラ行列を設定します。
671
672 @param[out] pOut 計算結果を受け取るバッファへのポインタ。
673 @param[in] pCamPos カメラの位置を指定するベクトルへのポインタ。
674 @param[in] pCamUp カメラの上方向を指定するベクトルへのポインタ。
675 @param[in] pTarget カメラの注視点を指定するベクトルへのポインタ。
676
677 @return pOut を返します。
678 *---------------------------------------------------------------------------*/
679 NN_FORCE_INLINE MTX34*
MTX34LookAt(MTX34 * pOut,const VEC3 * pCamPos,const VEC3 * pCamUp,const VEC3 * pTarget)680 MTX34LookAt(MTX34* pOut, const VEC3* pCamPos, const VEC3* pCamUp, const VEC3* pTarget)
681 {
682 #if defined( NN_HARDWARE_CTR )
683 #if (MTX34LOOKAT_VEC3_CONFIG == D_ORG)
684 return ARMv6::MTX34LookAtC(pOut, pCamPos, pCamUp, pTarget);
685 #elif (MTX34LOOKAT_VEC3_CONFIG == D_FAST_C)
686 return ARMv6::MTX34LookAtC_FAST(pOut, pCamPos, pCamUp, pTarget);
687 #elif (MTX34LOOKAT_VEC3_CONFIG == D_FAST_ASM)
688 #elif (MTX34LOOKAT_VEC3_CONFIG == D_FAST_C_ALGO)
689 #elif (MTX34LOOKAT_VEC3_CONFIG == D_FAST_ASM_ALGO)
690 #endif
691 #else
692 #endif // #if defined( NN_HARDWARE_CTR )
693 }
694
695 /*!--------------------------------------------------------------------------*
696 @brief カメラ行列を設定します。
697
698 @param[out] pOut 計算結果を受け取るバッファへのポインタ。
699 @param[in] pCamPos カメラの位置を指定するベクトルへのポインタ。
700 @param[in] twistDeg カメラの視線方向に対する回転角度。単位は Degree です。
701 @param[in] pTarget カメラの注視点を指定するベクトルへのポインタ。
702
703 @return pOut を返します。
704 *---------------------------------------------------------------------------*/
705 NN_FORCE_INLINE MTX34*
MTX34LookAt(MTX34 * pOut,const VEC3 * pCamPos,f32 twistDeg,const VEC3 * pTarget)706 MTX34LookAt(MTX34* pOut, const VEC3* pCamPos, f32 twistDeg, const VEC3* pTarget)
707 {
708 #if defined( NN_HARDWARE_CTR )
709 #if (MTX34LOOKAT_F32_CONFIG == D_ORG)
710 return ARMv6::MTX34LookAtC(pOut, pCamPos, twistDeg, pTarget);
711 #elif (MTX34LOOKAT_F32_CONFIG == D_FAST_C)
712 return ARMv6::MTX34LookAtC_FAST(pOut, pCamPos, twistDeg, pTarget);
713 #elif (MTX34LOOKAT_F32_CONFIG == D_FAST_ASM)
714 #elif (MTX34LOOKAT_F32_CONFIG == D_FAST_C_ALGO)
715 #elif (MTX34LOOKAT_F32_CONFIG == D_FAST_ASM_ALGO)
716 #endif
717 #else
718 #endif // #if defined( NN_HARDWARE_CTR )
719
720
721 }
722 /*!--------------------------------------------------------------------------*
723 @brief 行列を実数倍して、別の行列を足します。
724
725 @param[out] pOut 計算結果を受け取るバッファへのポインタ。p1, p2 と同じ行列を指していても構いません。
726 @param[in] t 掛ける数。
727 @param[in] p1 元の行列へのポインタ。
728 @param[in] p2 足す行列へのポインタ。
729
730 @return pOut を返します。
731 *---------------------------------------------------------------------------*/
732 NN_FORCE_INLINE MTX34*
MTX34MAdd(MTX34 * pOut,f32 t,const MTX34 * p1,const MTX34 * p2)733 MTX34MAdd(MTX34* pOut, f32 t, const MTX34* p1, const MTX34* p2)
734 {
735 #if defined( NN_HARDWARE_CTR )
736 #if (MTX34MADD_CONFIG == D_ORG)
737 return ARMv6::MTX34MAddC( pOut, t, p1, p2 );
738 #elif (MTX34MADD_CONFIG == D_FAST_C)
739 #elif (MTX34MADD_CONFIG == D_FAST_ASM)
740 return ARMv6::MTX34MAddAsm( pOut, t, p1, p2 );
741 #elif (MTX34MADD_CONFIG == D_FAST_C_ALGO)
742 #elif (MTX34MADD_CONFIG == D_FAST_ASM_ALGO)
743 #endif
744 #else
745 #endif // #if defined( NN_HARDWARE_CTR )
746 }
747
748 /*!--------------------------------------------------------------------------*
749 @brief 行列にスケール変換を適用します。スケール行列を右から掛けます。
750
751 @param[out] pOut 計算結果を受け取るバッファへのポインタ。pM と同じ行列を指していても構いません。
752 @param[in] pM 元となる行列へのポインタ。
753 @param[in] pS それぞれの軸方向のスケール値が格納されたベクトルへのポインタ。
754
755 @return pOut を返します。
756 *---------------------------------------------------------------------------*/
757 NN_FORCE_INLINE MTX34*
MTX34MultScale(MTX34 * pOut,const MTX34 * pM,const VEC3 * pS)758 MTX34MultScale(MTX34* pOut, const MTX34* pM, const VEC3* pS)
759 {
760 #if defined( NN_HARDWARE_CTR )
761 #if (MTX34MULTSCALE_RIGHT_CONFIG == D_ORG)
762 return ARMv6::MTX34MultScaleC( pOut, pM, pS );
763 #elif (MTX34MULTSCALE_RIGHT_CONFIG == D_FAST_C)
764 #elif (MTX34MULTSCALE_RIGHT_CONFIG == D_FAST_ASM)
765 return ARMv6::MTX34MultScaleAsm( pOut, pM, pS );
766 #elif (MTX34MULTSCALE_RIGHT_CONFIG == D_FAST_C_ALGO)
767 #elif (MTX34MULTSCALE_RIGHT_CONFIG == D_FAST_ASM_ALGO)
768 #endif
769 #else
770 #endif // #if defined( NN_HARDWARE_CTR )
771 }
772
773 /*!--------------------------------------------------------------------------*
774 @brief 行列にスケール変換を適用します。スケール行列を左から掛けます。
775
776 @param[out] pOut 計算結果を受け取るバッファへのポインタ。pM と同じ行列を指していても構いません。
777 @param[in] pS それぞれの軸方向のスケール値が格納されたベクトルへのポインタ。
778 @param[in] pM 元となる行列へのポインタ。
779
780 @return pOut を返します。
781 *---------------------------------------------------------------------------*/
782 NN_FORCE_INLINE MTX34*
MTX34MultScale(MTX34 * pOut,const VEC3 * __restrict pS,const MTX34 * pM)783 MTX34MultScale(MTX34* pOut, const VEC3* __restrict pS, const MTX34* pM)
784 {
785 #if defined( NN_HARDWARE_CTR )
786 #if (MTX34MULTSCALE_LEFT_CONFIG == D_ORG)
787 return ARMv6::MTX34MultScaleC( pOut, pS, pM );
788 #elif (MTX34MULTSCALE_LEFT_CONFIG == D_FAST_C)
789 #elif (MTX34MULTSCALE_LEFT_CONFIG == D_FAST_ASM)
790 return ARMv6::MTX34MultScaleAsm( pOut, pS, pM );
791 #elif (MTX34MULTSCALE_LEFT_CONFIG == D_FAST_C_ALGO)
792 #elif (MTX34MULTSCALE_LEFT_CONFIG == D_FAST_ASM_ALGO)
793 #endif
794 #else
795 #endif // #if defined( NN_HARDWARE_CTR )
796 }
797
798
799 /*!--------------------------------------------------------------------------*
800 @brief 行列に平行移動を適用します。移動行列を左から掛けます。
801
802 @param[out] pOut 計算結果を受け取るバッファへのポインタ。pM と同じ行列を指していても構いません。
803 @param[in] pT それぞれの軸方向の移動量が格納されたベクトルへのポインタ。
804 @param[in] pM 元となる行列へのポインタ。
805
806 @return pOut を返します。
807 *---------------------------------------------------------------------------*/
808 NN_FORCE_INLINE MTX34*
MTX34MultTranslate(MTX34 * pOut,const VEC3 * pT,const MTX34 * pM)809 MTX34MultTranslate(MTX34* pOut, const VEC3* pT, const MTX34* pM)
810 {
811 #if defined( NN_HARDWARE_CTR )
812 #if (MTX34MULTTRANSLATE_LEFT_CONFIG == D_ORG)
813 return ARMv6::MTX34MultTranslateC( pOut, pT, pM );
814 #elif (MTX34MULTTRANSLATE_LEFT_CONFIG == D_FAST_C)
815 #elif (MTX34MULTTRANSLATE_LEFT_CONFIG == D_FAST_ASM)
816 return ARMv6::MTX34MultTranslateAsm( pOut, pT, pM );
817 #elif (MTX34MULTTRANSLATE_LEFT_CONFIG == D_FAST_C_ALGO)
818 #elif (MTX34MULTTRANSLATE_LEFT_CONFIG == D_FAST_ASM_ALGO)
819 #endif
820 #else
821 #endif // #if defined( NN_HARDWARE_CTR )
822 }
823
824 /*!--------------------------------------------------------------------------*
825 @brief 行列に平行移動を適用します。移動行列を右から掛けます。
826
827 @param[out] pOut 計算結果を受け取るバッファへのポインタ。pM と同じ行列を指していても構いません。
828 @param[in] pM 元となる行列へのポインタ。
829 @param[in] pT それぞれの軸方向の移動量が格納されたベクトルへのポインタ。
830
831 @return pOut を返します。
832 *---------------------------------------------------------------------------*/
833 NN_FORCE_INLINE MTX34*
MTX34MultTranslate(MTX34 * pOut,const MTX34 * pM,const VEC3 * pT)834 MTX34MultTranslate(MTX34* pOut, const MTX34* pM, const VEC3* pT)
835 {
836 #if defined( NN_HARDWARE_CTR )
837 #if (MTX34MULTTRANSLATE_RIGHT_CONFIG == D_ORG)
838 return ARMv6::MTX34MultTranslateC( pOut, pM, pT );
839 #elif (MTX34MULTTRANSLATE_RIGHT_CONFIG == D_FAST_C)
840 #elif (MTX34MULTTRANSLATE_RIGHT_CONFIG == D_FAST_ASM)
841 return ARMv6::MTX34MultTranslateAsm( pOut, pM, pT );
842 #elif (MTX34MULTTRANSLATE_RIGHT_CONFIG == D_FAST_C_ALGO)
843 #elif (MTX34MULTTRANSLATE_RIGHT_CONFIG == D_FAST_ASM_ALGO)
844 #endif
845 #else
846 #endif // #if defined( NN_HARDWARE_CTR )
847 }
848
849 /*!--------------------------------------------------------------------------*
850 @brief 指定する軸の周りを回転させる回転行列を作成します。
851
852 @param[out] pOut 計算結果を受け取るバッファへのポインタ。
853 @param[in] pAxis 回転軸を指定するベクトルへのポインタ。
854 @param[in] fRad ラジアン単位での回転量
855
856 @return pOut を返します。
857 *---------------------------------------------------------------------------*/
858 NN_FORCE_INLINE MTX34*
MTX34RotAxisRad_(MTX34 * pOut,const VEC3 * pAxis,f32 fRad)859 MTX34RotAxisRad_( MTX34* pOut, const VEC3 *pAxis, f32 fRad )
860 {
861 #if defined( NN_HARDWARE_CTR )
862 #if (MTX34ROTAXISRAD__CONFIG == D_ORG)
863 return ARMv6::MTX34RotAxisRad_C(pOut, pAxis, fRad);
864 #elif (MTX34ROTAXISRAD__CONFIG == D_FAST_C)
865 return ARMv6::MTX34RotAxisRad_C_FAST(pOut, pAxis, fRad);
866 #elif (MTX34ROTAXISRAD__CONFIG == D_FAST_ASM)
867 #elif (MTX34ROTAXISRAD__CONFIG == D_FAST_C_ALGO)
868 return ARMv6::MTX34RotAxisRad_C_FAST(pOut, pAxis, fRad);
869 #elif (MTX34ROTAXISRAD__CONFIG == D_FAST_ASM_ALGO)
870 #endif
871 #else
872 #endif // #if defined( NN_HARDWARE_CTR )
873
874 }
875
876
877 /*!--------------------------------------------------------------------------*
878 @brief 回転行列を作成します。
879
880 @param[out] pOut 計算結果を受け取るバッファへのポインタ。
881 @param[in] fIdxX 1 円周を 256.0 とする単位での X 軸周りの角度
882 @param[in] fIdxY 1 円周を 256.0 とする単位での Y 軸周りの角度
883 @param[in] fIdxZ 1 円周を 256.0 とする単位での Z 軸周りの角度
884
885 @return pOut を返します。
886 *---------------------------------------------------------------------------*/
887 NN_FORCE_INLINE MTX34*
MTX34RotXYZFIdx(MTX34 * pOut,f32 fIdxX,f32 fIdxY,f32 fIdxZ)888 MTX34RotXYZFIdx(MTX34* pOut, f32 fIdxX, f32 fIdxY, f32 fIdxZ)
889 {
890 #if defined( NN_HARDWARE_CTR )
891 #if (MTX34ROTXYZFIDX_CONFIG == D_ORG)
892 return ARMv6::MTX34RotXYZFIdxC(pOut, fIdxX, fIdxY, fIdxZ);
893 #elif (MTX34ROTXYZFIDX_CONFIG == D_FAST_C)
894 return ARMv6::MTX34RotXYZFIdxC_FAST(pOut, fIdxX, fIdxY, fIdxZ);
895 #elif (MTX34ROTXYZFIDX_CONFIG == D_FAST_ASM)
896 #elif (MTX34ROTXYZFIDX_CONFIG == D_FAST_C_ALGO)
897 #elif (MTX34ROTXYZFIDX_CONFIG == D_FAST_ASM_ALGO)
898 #endif
899 #else
900 #endif // #if defined( NN_HARDWARE_CTR )
901
902 }
903
904
905 /*!--------------------------------------------------------------------------*
906 @brief スケール変換用の行列を作成します。
907
908 @param[out] pOut 計算結果を受け取るバッファへのポインタ。pM と同じ行列を指していても構いません。
909 @param[in] pS それぞれの軸方向のスケール値が格納されたベクトルへのポインタ。
910
911 @return pOut を返します。
912 *---------------------------------------------------------------------------*/
913 NN_FORCE_INLINE MTX34*
MTX34Scale(MTX34 * pOut,const VEC3 * pS)914 MTX34Scale(MTX34* pOut, const VEC3* pS)
915 {
916 #if defined( NN_HARDWARE_CTR )
917 #if (MTX34SCALE_CONFIG == D_ORG)
918 return ARMv6::MTX34ScaleC(pOut, pS);
919 #elif (MTX34SCALE_CONFIG == D_FAST_C)
920 return ARMv6::MTX34ScaleC_FAST(pOut, pS);
921 #elif (MTX34SCALE_CONFIG == D_FAST_ASM)
922 return ARMv6::MTX34ScaleAsm(pOut, pS);
923 #elif (MTX34SCALE_CONFIG == D_FAST_C_ALGO)
924 #elif (MTX34SCALE_CONFIG == D_FAST_ASM_ALGO)
925 #endif
926 #else
927 #endif // #if defined( NN_HARDWARE_CTR )
928 }
929
930 /*!--------------------------------------------------------------------------*
931 @brief 平行移動用の行列を作成します。
932
933 @param[out] pOut 計算結果を受け取るバッファへのポインタ。pM と同じ行列を指していても構いません。
934 @param[in] pT それぞれの軸方向の移動量が格納されたベクトルへのポインタ。
935
936 @return pOut を返します。
937 *---------------------------------------------------------------------------*/
938 NN_FORCE_INLINE MTX34*
MTX34Translate(MTX34 * pOut,const VEC3 * pT)939 MTX34Translate(MTX34* pOut, const VEC3* pT)
940 {
941 #if defined( NN_HARDWARE_CTR )
942 #if (MTX34TRANSLATE_CONFIG == D_ORG)
943 return ARMv6::MTX34TranslateC(pOut, pT);
944 #elif (MTX34TRANSLATE_CONFIG == D_FAST_C)
945 return ARMv6::MTX34TranslateC_FAST(pOut, pT);
946 #elif (MTX34TRANSLATE_CONFIG == D_FAST_ASM)
947 #elif (MTX34TRANSLATE_CONFIG == D_FAST_C_ALGO)
948 #elif (MTX34TRANSLATE_CONFIG == D_FAST_ASM_ALGO)
949 #endif
950 #else
951 #endif // #if defined( NN_HARDWARE_CTR )
952 }
953
954 /*!--------------------------------------------------------------------------*
955 @brief 行列の転置行列を作成します。
956
957 @param[out] pOut 計算結果を受け取るバッファへのポインタ。p と同じ行列を指していても構いません。
958 @param[in] p 転置する行列へのポインタ。
959
960 @return pOut を返します。
961 *---------------------------------------------------------------------------*/
962 NN_FORCE_INLINE MTX34*
MTX34Transpose(MTX34 * pOut,const MTX34 * p)963 MTX34Transpose(MTX34* pOut, const MTX34* p)
964 {
965 #if defined( NN_HARDWARE_CTR )
966 #if (MTX34TRANSPOSE_34TO34_CONFIG == D_ORG)
967 return ARMv6::MTX34TransposeC(pOut, p);
968 #elif (MTX34TRANSPOSE_34TO34_CONFIG == D_FAST_C)
969 #elif (MTX34TRANSPOSE_34TO34_CONFIG == D_FAST_ASM)
970 return ARMv6::MTX34TransposeAsm(pOut, p);
971 #elif (MTX34TRANSPOSE_34TO34_CONFIG == D_FAST_C_ALGO)
972 #elif (MTX34TRANSPOSE_34TO34_CONFIG == D_FAST_ASM_ALGO)
973 #endif
974 #else
975 #endif // #if defined( NN_HARDWARE_CTR )
976 }
977
978 /*!
979 @name クォータニオン
980 @{
981 */
982
983 /*!--------------------------------------------------------------------------*
984 @brief クォータニオンから回転行列を作成します。
985
986 @param[out] pOut 計算結果を受け取るバッファへのポインタ。
987 @param[in] pQ 元となるクォータニオンへのポインタ。
988
989 @return pOut を返します。
990 *---------------------------------------------------------------------------*/
991 NN_FORCE_INLINE MTX34*
QUATToMTX34(MTX34 * pOut,const QUAT * pQ)992 QUATToMTX34(MTX34* pOut, const QUAT* pQ)
993 {
994 #if defined( NN_HARDWARE_CTR )
995 #if (QUATTOMTX34_CONFIG == D_ORG)
996 return ARMv6::QUATToMTX34C(pOut, pQ);
997 #elif (QUATTOMTX34_CONFIG == D_FAST_C)
998 return ARMv6::QUATToMTX34C_FAST(pOut, pQ);
999 #elif (QUATTOMTX34_CONFIG == D_FAST_ASM)
1000 #elif (QUATTOMTX34_CONFIG == D_FAST_C_ALGO)
1001 #elif (QUATTOMTX34_CONFIG == D_FAST_ASM_ALGO)
1002 #endif
1003 #else
1004 #endif // #if defined( NN_HARDWARE_CTR )
1005 }
1006
1007 /*!
1008 @}
1009 */
1010
1011 /*!
1012 @name ユーティリティ
1013 @{
1014 */
1015
1016 /*!--------------------------------------------------------------------------*
1017 @brief ベクトルを行列で変換します。ベクトルの 4 要素目を 1 として計算します。
1018
1019 @param[out] pOut 計算結果を受け取るバッファへのポインタ。
1020 pV と同じベクトルを指していても構いません。
1021 @param[in] pM 変換行列へのポインタ。
1022 @param[in] pV 元となるベクトルへのポインタ。
1023
1024 @return pOut を返します。
1025 *---------------------------------------------------------------------------*/
1026 NN_FORCE_INLINE VEC3*
VEC3Transform(VEC3 * pOut,const MTX34 * __restrict pM,const VEC3 * __restrict pV)1027 VEC3Transform(VEC3* pOut, const MTX34* __restrict pM, const VEC3* __restrict pV)
1028 {
1029 #if defined( NN_HARDWARE_CTR )
1030 #if (VEC3TRANSFORM_34XVEC3_CONFIG == D_ORG)
1031 return ARMv6::VEC3TransformC(pOut, pM, pV);
1032 #elif (VEC3TRANSFORM_34XVEC3_CONFIG == D_FAST_C)
1033 #elif (VEC3TRANSFORM_34XVEC3_CONFIG == D_FAST_ASM)
1034 return ARMv6::VEC3TransformAsm(pOut, pM, pV);
1035 #elif (VEC3TRANSFORM_34XVEC3_CONFIG == D_FAST_C_ALGO)
1036 #elif (VEC3TRANSFORM_34XVEC3_CONFIG == D_FAST_ASM_ALGO)
1037 #endif
1038 #else
1039 #endif // #if defined( NN_HARDWARE_CTR )
1040 }
1041
1042 /*!
1043 @}
1044 */
1045
1046
1047 } // namespace math
1048 } // namespace nn
1049
1050 namespace nn {
1051 namespace math {
1052
1053 //-- const 引数を参照にしたオーバーロード
1054
MTX34IsIdentity(const MTX34 & m)1055 inline bool MTX34IsIdentity(const MTX34& m) { return MTX34IsIdentity( &m ); }
1056
MTX34Add(MTX34 * pOut,const MTX34 & m1,const MTX34 & m2)1057 inline MTX34* MTX34Add(MTX34* pOut, const MTX34& m1, const MTX34& m2) { return MTX34Add( pOut, &m1, &m2 ); }
MTX34Sub(MTX34 * pOut,const MTX34 & m1,const MTX34 & m2)1058 inline MTX34* MTX34Sub(MTX34* pOut, const MTX34& m1, const MTX34& m2) { return MTX34Sub( pOut, &m1, &m2 ); }
MTX34Mult(MTX34 * pOut,const MTX34 & m,f32 f)1059 inline MTX34* MTX34Mult(MTX34* pOut, const MTX34& m, f32 f) { return MTX34Mult( pOut, &m, f ); }
MTX34Mult(MTX34 * pOut,const MTX34 & m1,const MTX34 & m2)1060 inline MTX34* MTX34Mult(MTX34* pOut, const MTX34& m1, const MTX34& m2) { return MTX34Mult( pOut, &m1, &m2 ); }
MTX34MAdd(MTX34 * pOut,f32 t,const MTX34 & m1,const MTX34 & m2)1061 inline MTX34* MTX34MAdd(MTX34* pOut, f32 t, const MTX34& m1, const MTX34& m2) { return MTX34MAdd( pOut, t, &m1, &m2 ); }
1062
MTX34Copy(MTX34 * pOut,const MTX34 & m)1063 inline MTX34* MTX34Copy(MTX34* pOut, const MTX34& m) { return MTX34Copy( pOut, &m ); }
MTX34MultArray(MTX34 * pOut,const MTX34 & m1,const MTX34 * pSrc,s32 count)1064 inline MTX34* MTX34MultArray(MTX34* pOut, const MTX34& m1, const MTX34* pSrc, s32 count) { return MTX34MultArray( pOut, m1, pSrc, count ); }
MTX34Inverse(MTX34 * pOut,const MTX34 & m)1065 inline u32 MTX34Inverse(MTX34* pOut, const MTX34& m) { return MTX34Inverse( pOut, &m ); }
MTX34Transpose(MTX34 * pOut,const MTX34 & m)1066 inline MTX34* MTX34Transpose(MTX34* pOut, const MTX34& m) { return MTX34Transpose( pOut, &m ); }
MTX34InvTranspose(MTX34 * pOut,const MTX34 & m)1067 inline u32 MTX34InvTranspose(MTX34* pOut, const MTX34& m) { return MTX34InvTranspose( pOut, &m ); }
1068
MTX34LookAt(MTX34 * pOut,const VEC3 & vCamPos,const VEC3 & vCamUp,const VEC3 & vTarget)1069 inline MTX34* MTX34LookAt(MTX34* pOut, const VEC3& vCamPos, const VEC3& vCamUp, const VEC3& vTarget) { return MTX34LookAt( pOut, &vCamPos, &vCamUp, &vTarget ); }
MTX34LookAt(MTX34 * pOut,const VEC3 & vCamPos,f32 twistDeg,const VEC3 & vTarget)1070 inline MTX34* MTX34LookAt(MTX34* pOut, const VEC3& vCamPos, f32 twistDeg, const VEC3& vTarget) { return MTX34LookAt( pOut, &vCamPos, twistDeg, &vTarget ); }
MTX34CameraRotate(MTX34 * pOut,const VEC3 & vCamPos,const VEC3 & vCamRotateDeg)1071 inline MTX34* MTX34CameraRotate(MTX34* pOut, const VEC3& vCamPos, const VEC3& vCamRotateDeg) { return MTX34CameraRotate( pOut, &vCamPos, &vCamRotateDeg ); }
1072
MTX34RotXYZTranslateFIdx(MTX34 * pOut,f32 fIdxX,f32 fIdxY,f32 fIdxZ,const VEC3 & vT)1073 inline MTX34* MTX34RotXYZTranslateFIdx(MTX34* pOut, f32 fIdxX, f32 fIdxY, f32 fIdxZ, const VEC3& vT) { return MTX34RotXYZTranslateFIdx( pOut, fIdxX, fIdxY, fIdxZ, &vT ); }
MTX34RotAxisFIdx(MTX34 * pOut,const VEC3 & vAxis,f32 fIdx)1074 inline MTX34* MTX34RotAxisFIdx(MTX34* pOut, const VEC3& vAxis, f32 fIdx) { return MTX34RotAxisFIdx( pOut, &vAxis, fIdx ); }
MTX34RotAxisRad(MTX34 * pOut,const VEC3 & vAxis,f32 fRad)1075 inline MTX34* MTX34RotAxisRad(MTX34* pOut, const VEC3& vAxis, f32 fRad) { return MTX34RotAxisRad( pOut, &vAxis, fRad ); }
MTX34RotAxisDeg(MTX34 * pOut,const VEC3 & vAxis,f32 fDeg)1076 inline MTX34* MTX34RotAxisDeg(MTX34* pOut, const VEC3& vAxis, f32 fDeg) { return MTX34RotAxisDeg( pOut, &vAxis, fDeg ); }
1077
MTX34Scale(MTX34 * pOut,const VEC3 & vS)1078 inline MTX34* MTX34Scale(MTX34* pOut, const VEC3& vS) { return MTX34Scale( pOut, &vS ); }
MTX34MultScale(MTX34 * pOut,const MTX34 & m,const VEC3 & vS)1079 inline MTX34* MTX34MultScale(MTX34* pOut, const MTX34& m, const VEC3& vS) { return MTX34MultScale( pOut, &m, &vS ); }
MTX34MultScale(MTX34 * pOut,const VEC3 & vS,const MTX34 & m)1080 inline MTX34* MTX34MultScale(MTX34* pOut, const VEC3& vS, const MTX34& m) { return MTX34MultScale( pOut, &vS, &m ); }
1081
MTX34Translate(MTX34 * pOut,const VEC3 & vT)1082 inline MTX34* MTX34Translate(MTX34* pOut, const VEC3& vT) { return MTX34Translate( pOut, &vT ); }
MTX34MultTranslate(MTX34 * pOut,const MTX34 & m,const VEC3 & vT)1083 inline MTX34* MTX34MultTranslate(MTX34* pOut, const MTX34& m, const VEC3& vT) { return MTX34MultTranslate( pOut, &m, &vT ); }
MTX34MultTranslate(MTX34 * pOut,const VEC3 & vT,const MTX34 & m)1084 inline MTX34* MTX34MultTranslate(MTX34* pOut, const VEC3& vT, const MTX34& m) { return MTX34MultTranslate( pOut, &vT, &m ); }
QUATToMTX34(MTX34 * pOut,const QUAT & q)1085 inline MTX34* QUATToMTX34(MTX34* pOut, const QUAT& q) { return QUATToMTX34( pOut, &q ); }
1086
1087 } // namespace math
1088 } // namespace nn
1089
1090 #if defined(NN_MATH_AS_INLINE)
1091 #include <nn/math/inline/math_Matrix34.ipp>
1092 #include <nn/math/ARMv6/inline/math_Matrix34.ipp>
1093 #endif
1094
1095 #pragma pop
1096
1097 #endif
1098