1 /*---------------------------------------------------------------------------*
2 Project: Horizon
3 File: math_Matrix44.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: 24788 $
14 *---------------------------------------------------------------------------*/
15
16 #ifndef NN_MATH_MATRIX44_H_
17 #define NN_MATH_MATRIX44_H_
18
19 #include <cstring>
20 #include <nn/math/math_Config.h>
21
22 #pragma push
23 #pragma Otime
24
25 namespace nn {
26 namespace math {
27
28 /*!
29 @name 行列
30 @{
31 */
32
33 /*!--------------------------------------------------------------------------*
34 @brief 射影行列に掛ける回転行列を指定するための列挙型です。
35
36 *---------------------------------------------------------------------------*/
37 enum PivotDirection
38 {
39 PIVOT_NONE, //!< 回転処理をおこないません。
40 PIVOT_UPSIDE_TO_TOP, //!< カメラ上方向が画面上方向を向くように回転します。
41 PIVOT_UPSIDE_TO_RIGHT, //!< カメラ上方向が画面右方向を向くように回転します。
42 PIVOT_UPSIDE_TO_BOTTOM, //!< カメラ上方向が画面下方向を向くように回転します。
43 PIVOT_UPSIDE_TO_LEFT, //!< カメラ上方向が画面左方向を向くように回転します。
44 PIVOT_NUM
45 };
46
47 /*!
48 @}
49 */
50
51 /* ------------------------------------------------------------------------
52 MTX44用の関数
53 ------------------------------------------------------------------------ */
54 struct MTX44;
55
56 NN_MATH_INLINE MTX44* MTX44Zero(MTX44* pOut);
57 NN_MATH_INLINE bool MTX44IsIdentity(const MTX44* p);
58 NN_MATH_INLINE MTX44* MTX44Identity(MTX44* pOut);
59 NN_MATH_INLINE MTX44* MTX44Copy(MTX44* pOut, const MTX44* p);
60
61 NN_MATH_INLINE MTX44* MTX44Add(MTX44* pOut, const MTX44* p1, const MTX44* p2);
62 NN_MATH_INLINE MTX44* MTX44Sub(MTX44* pOut, const MTX44* p1, const MTX44* p2);
63 NN_MATH_INLINE MTX44* MTX44Mult(MTX44* pOut, const MTX44* p, f32 f);
64 NN_MATH_INLINE MTX44* MTX44Mult(MTX44* pOut, const MTX44* p1, const MTX44* p2);
65
66 NN_MATH_INLINE MTX44* MTX44Frustum(MTX44* pOut, f32 l, f32 r, f32 b, f32 t, f32 n, f32 f);
67 NN_MATH_INLINE MTX44* MTX44Ortho(MTX44* pOut, f32 l, f32 r, f32 b, f32 t, f32 n, f32 f);
68 NN_MATH_INLINE MTX44* MTX44PerspectiveRad(MTX44* pOut, f32 fovy, f32 aspect, f32 n, f32 f);
69 NN_MATH_INLINE MTX44* MTX44Transpose(MTX44* pOut, const MTX44 *pSrc);
70 NN_MATH_INLINE MTX44* MTX44MultArray(MTX44* pOut, const MTX44* p1, const MTX44* pSrc, s32 count);
71 NN_MATH_INLINE u32 MTX44Inverse(MTX44* pOut, const MTX44* p);
72
73 NN_MATH_INLINE MTX44* MTX44RotXYZFIdx(MTX44* pOut, f32 fIdxX, f32 fIdxY, f32 fIdxZ);
74 NN_MATH_INLINE MTX44* MTX44RotAxisFIdx(MTX44* pOut, const VEC3* pAxis, f32 fIdx);
75
76 NN_MATH_INLINE MTX44* MTX44Scale(MTX44* pOut, const VEC3* pS);
77 NN_MATH_INLINE MTX44* MTX44MultScale(MTX44* pOut, const MTX44* pM, const VEC3* pS);
78 NN_MATH_INLINE MTX44* MTX44MultScale(MTX44* pOut, const VEC3* pS, const MTX44* pM);
79
80 NN_MATH_INLINE MTX44* MTX44Translate(MTX44* pOut, const VEC3* pT);
81 NN_MATH_INLINE MTX44* MTX44MultTranslate(MTX44* pOut, const MTX44* pM, const VEC3* pT);
82 NN_MATH_INLINE MTX44* MTX44MultTranslate(MTX44* pOut, const VEC3* pT, const MTX44* pM);
83
84 NN_MATH_INLINE MTX44* MTX44FrustumPivot(MTX44* pOut, f32 l, f32 r, f32 b, f32 t, f32 n, f32 f, PivotDirection pivot = PIVOT_NONE);
85 NN_MATH_INLINE MTX44* MTX44OrthoPivot(MTX44* pOut, f32 l, f32 r, f32 b, f32 t, f32 n, f32 f, PivotDirection pivot = PIVOT_NONE);
86 NN_MATH_INLINE MTX44* MTX44PerspectivePivotRad(MTX44* pOut, f32 fovy, f32 aspect, f32 n, f32 f, PivotDirection pivot = PIVOT_NONE);
87
88 NN_FORCE_INLINE MTX44* MTX44Add(MTX44* pOut, const MTX44* p1, const MTX44* p2);
89 NN_FORCE_INLINE MTX44* MTX44Copy(MTX44* pOut, const MTX44* p);
90 NN_FORCE_INLINE MTX44* MTX44Frustum(MTX44* pOut, f32 l, f32 r, f32 b, f32 t, f32 n, f32 f);
91 NN_FORCE_INLINE u32 MTX44Inverse(MTX44* pOut, const MTX44* p);
92 NN_FORCE_INLINE MTX44* MTX44Mult(MTX44* pOut, const MTX44* __restrict p1, const MTX44* __restrict p2);
93 NN_FORCE_INLINE MTX44* MTX44Mult(MTX44* pOut, const MTX44* p, f32 f);
94 NN_FORCE_INLINE MTX44* MTX44MultScale(MTX44* pOut, const MTX44* pM, const VEC3* pS);
95 NN_FORCE_INLINE MTX44* MTX44MultScale(MTX44* pOut, const VEC3* pS, const MTX44* pM);
96 NN_FORCE_INLINE MTX44* MTX44MultTranslate(MTX44* pOut, const VEC3* pT, const MTX44* pM);
97 NN_FORCE_INLINE MTX44* MTX44MultTranslate(MTX44* pOut, const MTX44* pM, const VEC3* pT);
98 NN_FORCE_INLINE MTX44* MTX44Ortho(MTX44* pOut, f32 l, f32 r, f32 b, f32 t, f32 n, f32 f);
99 NN_FORCE_INLINE MTX44* MTX44PerspectiveRad(MTX44* pOut, f32 fovy, f32 aspect, f32 n, f32 f);
100 NN_FORCE_INLINE MTX44* MTX44RotAxisRad_( MTX44* pOut, const VEC3 *pAxis, f32 fRad );
101 NN_FORCE_INLINE MTX44* MTX44RotXYZFIdx(MTX44* pOut, f32 fIdxX, f32 fIdxY, f32 fIdxZ);
102 NN_FORCE_INLINE MTX44* MTX44Scale(MTX44* pOut, const VEC3* pS);
103 NN_FORCE_INLINE MTX44* MTX44Translate(MTX44* pOut, const VEC3* pT);
104 NN_FORCE_INLINE MTX44* MTX44Transpose(MTX44* pOut, const MTX44 *pSrc);
105
106 NN_FORCE_INLINE VEC4* VEC3Transform(VEC4* pOut, const MTX44* pM, const VEC3* pV);
107
108 NN_FORCE_INLINE MTX44* MTX44Pivot( MTX44* pOut, PivotDirection pivot );
109
110 /*!
111 @name 行列
112 @{
113 */
114
115 /*!--------------------------------------------------------------------------*
116 @brief 射影行列を視野角とアスペクト比から作成します。
117
118 @param[out] pOut 射影行列を格納する行列へのポインタ。
119 @param[in] fovy 縦方向の視野角(Degree)
120 @param[in] aspect 視野のアスペクト比(幅/高さ)
121 @param[in] n ニアクリッピング面までの距離。
122 @param[in] f ファークリッピング面までの距離。
123
124 @return pOut を返します。
125 *---------------------------------------------------------------------------*/
126 inline MTX44*
MTX44PerspectiveDeg(MTX44 * pOut,f32 fovy,f32 aspect,f32 n,f32 f)127 MTX44PerspectiveDeg(MTX44* pOut, f32 fovy, f32 aspect, f32 n, f32 f)
128 {
129 return MTX44PerspectiveRad(pOut, NN_MATH_DEG_TO_RAD(fovy), aspect, n, f);
130 }
131
132
133 // MTX44PerspectiveDeg 関数の別名です。
134 // 互換性の為に接尾語の無い Perspective 関数を degree 版としています。
135 inline MTX44*
MTX44Perspective(MTX44 * pOut,f32 fovy,f32 aspect,f32 n,f32 f)136 MTX44Perspective(MTX44* pOut, f32 fovy, f32 aspect, f32 n, f32 f)
137 {
138 return MTX44PerspectiveDeg(pOut, fovy, aspect, n, f);
139 }
140
141 /*!--------------------------------------------------------------------------*
142 @brief 射影行列を視野角とアスペクト比から作成します。
143
144 @param[out] pOut 射影行列を格納する行列へのポインタ。
145 @param[in] fovy 縦方向の視野角(Degree)
146 @param[in] aspect 視野のアスペクト比(幅/高さ)
147 @param[in] n ニアクリッピング面までの距離。
148 @param[in] f ファークリッピング面までの距離。
149
150 @return pOut を返します。
151 *---------------------------------------------------------------------------*/
152 inline MTX44*
153 MTX44PerspectivePivotDeg(MTX44* pOut, f32 fovy, f32 aspect, f32 n, f32 f, PivotDirection pivot = PIVOT_NONE )
154 {
155 return MTX44PerspectivePivotRad(pOut, NN_MATH_DEG_TO_RAD(fovy), aspect, n, f, pivot);
156 }
157
158
159 /*!--------------------------------------------------------------------------*
160 @brief 回転行列を作成します。
161
162 @param[out] pOut 計算結果を受け取るバッファへのポインタ。
163 @param[in] fRadX ラジアン単位での X 軸周りの角度
164 @param[in] fRadY ラジアン単位での Y 軸周りの角度
165 @param[in] fRadZ ラジアン単位での Z 軸周りの角度
166
167 @return pOut を返します。
168 *---------------------------------------------------------------------------*/
169 inline MTX44*
MTX44RotXYZRad(MTX44 * pOut,f32 fRadX,f32 fRadY,f32 fRadZ)170 MTX44RotXYZRad(MTX44* pOut, f32 fRadX, f32 fRadY, f32 fRadZ)
171 {
172 return MTX44RotXYZFIdx(pOut, NN_MATH_RAD_TO_FIDX(fRadX), NN_MATH_RAD_TO_FIDX(fRadY), NN_MATH_RAD_TO_FIDX(fRadZ));
173 }
174
175 /*!--------------------------------------------------------------------------*
176 @brief 回転行列を作成します。
177
178 @param[out] pOut 計算結果を受け取るバッファへのポインタ。
179 @param[in] fDegX 1 円周を 360.0 とする単位での X 軸周りの角度
180 @param[in] fDegY 1 円周を 360.0 とする単位での Y 軸周りの角度
181 @param[in] fDegZ 1 円周を 360.0 とする単位での Z 軸周りの角度
182
183 @return pOut を返します。
184 *---------------------------------------------------------------------------*/
185 inline MTX44*
MTX44RotXYZDeg(MTX44 * pOut,f32 fDegX,f32 fDegY,f32 fDegZ)186 MTX44RotXYZDeg(MTX44* pOut, f32 fDegX, f32 fDegY, f32 fDegZ)
187 {
188 return MTX44RotXYZFIdx(pOut, NN_MATH_DEG_TO_FIDX(fDegX), NN_MATH_DEG_TO_FIDX(fDegY), NN_MATH_DEG_TO_FIDX(fDegZ));
189 }
190
191 /*!--------------------------------------------------------------------------*
192 @brief 指定する軸の周りを回転させる回転行列を作成します。
193
194 @param[out] pOut 計算結果を受け取るバッファへのポインタ。
195 @param[in] pAxis 回転軸を指定するベクトルへのポインタ。
196 @param[in] fRad ラジアン単位での回転量
197
198 @return pOut を返します。
199 *---------------------------------------------------------------------------*/
200 inline MTX44*
MTX44RotAxisRad(MTX44 * pOut,const VEC3 * pAxis,f32 fRad)201 MTX44RotAxisRad(MTX44* pOut, const VEC3* pAxis, f32 fRad)
202 {
203 return MTX44RotAxisFIdx(pOut, pAxis, NN_MATH_RAD_TO_FIDX(fRad));
204 }
205
206 /*!--------------------------------------------------------------------------*
207 @brief 指定する軸の周りを回転させる回転行列を作成します。
208
209 @param[out] pOut 計算結果を受け取るバッファへのポインタ。
210 @param[in] pAxis 回転軸を指定するベクトルへのポインタ。
211 @param[in] fDeg 1 円周を 360.0 とする単位での回転量
212
213 @return pOut を返します。
214 *---------------------------------------------------------------------------*/
215 inline MTX44*
MTX44RotAxisDeg(MTX44 * pOut,const VEC3 * pAxis,f32 fDeg)216 MTX44RotAxisDeg(MTX44* pOut, const VEC3* pAxis, f32 fDeg)
217 {
218 return MTX44RotAxisFIdx(pOut, pAxis, NN_MATH_DEG_TO_FIDX(fDeg));
219 }
220
221 /* =======================================================================
222 クラスの定義
223 ======================================================================== */
224 struct MTX34;
225
226 struct MTX44_
227 {
228 struct BaseData
229 {
230 f32 _00, _01, _02, _03;
231 f32 _10, _11, _12, _13;
232 f32 _20, _21, _22, _23;
233 f32 _30, _31, _32, _33;
234 };
235
236 union
237 {
238 #if defined(NN_MATH_USE_ANONYMOUS_STRUCT)
239 struct
240 {
241 f32 _00, _01, _02, _03;
242 f32 _10, _11, _12, _13;
243 f32 _20, _21, _22, _23;
244 f32 _30, _31, _32, _33;
245 };
246 #endif
247 BaseData f;
248 f32 m[4][4];
249 f32 a[16];
250 VEC4_ v[4];
251 };
252 };
253
254 /*!--------------------------------------------------------------------------*
255 @brief 4行4列の行列クラスです。
256 *---------------------------------------------------------------------------*/
257 struct MTX44 : public MTX44_
258 {
259 public:
260 static const int ROW_COUNT = 4; //!< 行数です。
261 static const int COLUMN_COUNT = 4; //!< 列数です。
262
263 //! @brief 単位行列です。
IdentityMTX44264 static const MTX44& Identity()
265 {
266 static const MTX44 identity(
267 1.0f, 0.0f, 0.0f, 0.0f,
268 0.0f, 1.0f, 0.0f, 0.0f,
269 0.0f, 0.0f, 1.0f, 0.0f,
270 0.0f, 0.0f, 0.0f, 1.0f);
271
272 return identity;
273 }
274 typedef MTX44 self_type; //!< 自分の型です。
275 typedef f32 value_type; //!< 要素の型です。
276
277 public:
278 //----------------------------------------
279 //! @name 作成
280 //@{
281
282 //! @brief コンストラクタです。
MTX44MTX44283 MTX44() {}
284
285 //! @brief コンストラクタです。
MTX44MTX44286 MTX44(const f32* p) { (void)MTX44Copy(this, (MTX44*)p); }
287
288 //! @brief コンストラクタです。
MTX44MTX44289 MTX44(const MTX34& rhs)
290 {
291 (void)MTX34Copy((MTX34*)this, (MTX34*)&rhs);
292 f._30 = f._31 = f._32 = 0.f; f._33 = 1.f;
293 }
294
295 //! @brief コピーコンストラクタです。
MTX44MTX44296 MTX44(const MTX44& rhs) { (void)MTX44Copy(this, &rhs); }
297
298 //! @brief コンストラクタです。
MTX44MTX44299 MTX44(f32 x00, f32 x01, f32 x02, f32 x03,
300 f32 x10, f32 x11, f32 x12, f32 x13,
301 f32 x20, f32 x21, f32 x22, f32 x23,
302 f32 x30, f32 x31, f32 x32, f32 x33)
303 {
304 f._00 = x00; f._01 = x01; f._02 = x02; f._03 = x03;
305 f._10 = x10; f._11 = x11; f._12 = x12; f._13 = x13;
306 f._20 = x20; f._21 = x21; f._22 = x22; f._23 = x23;
307 f._30 = x30; f._31 = x31; f._32 = x32; f._33 = x33;
308 }
309
310 //@}
311
312 //----------------------------------------
313 //! @name 変換
314 //@{
315
316 //! @brief f32 型へのキャストです。
317 operator f32*() { return this->a; }
318
319 //! @brief f32 型へのキャストです。
320 operator const f32*() const { return this->a; }
321
322 //! @brief VEC4 型として行を取得します。
GetRowMTX44323 VEC4& GetRow(int index)
324 {
325 NN_MATH_MINMAXLT_ASSERT(index, 0, ROW_COUNT);
326 return *reinterpret_cast<VEC4*>(&this->v[index]);
327 }
328
329 //! @brief VEC4 型として行を取得します。
GetRowMTX44330 const VEC4& GetRow(int index) const
331 {
332 NN_MATH_MINMAXLT_ASSERT(index, 0, ROW_COUNT);
333 return *reinterpret_cast<const VEC4*>(&this->v[index]);
334 }
335
336 //! @brief VEC4 型として列を取得します。
GetColumnMTX44337 VEC4 GetColumn(int index) const
338 {
339 NN_MATH_MINMAXLT_ASSERT(index, 0, COLUMN_COUNT);
340 VEC4 column;
341 column.x = this->m[0][index];
342 column.y = this->m[1][index];
343 column.z = this->m[2][index];
344 column.w = this->m[3][index];
345 return column;
346 }
347
348 //! @brief VEC4 型で列を設定します。
SetColumnMTX44349 void SetColumn(int index, const VEC4& column)
350 {
351 NN_MATH_MINMAXLT_ASSERT(index, 0, COLUMN_COUNT);
352 this->m[0][index] = column.x;
353 this->m[1][index] = column.y;
354 this->m[2][index] = column.z;
355 this->m[3][index] = column.w;
356 }
357 //@}
358
359 //----------------------------------------
360 //! @name 演算
361 //@{
362
363 //! @brief 行列を右からかけた値を代入します。
364 self_type& operator *= (const self_type& rhs) { return *MTX44Mult(this, this, &rhs); }
365
366 self_type& operator += (const self_type& rhs) { return *MTX44Add(this, this, &rhs); }
367 self_type& operator -= (const self_type& rhs) { return *MTX44Sub(this, this, &rhs); }
368
369 self_type& operator *= (f32 f) { return *MTX44Mult(this, this, f); }
370 self_type& operator /= (f32 f) { return operator*=(1.f / f); }
371
372 self_type operator + () const { return *this; }
373 self_type operator - () const
374 {
375 return MTX44(-f._00, -f._01, -f._02, -f._03,
376 -f._10, -f._11, -f._12, -f._13,
377 -f._20, -f._21, -f._22, -f._23,
378 -f._30, -f._31, -f._32, -f._33);
379 }
380
381 self_type operator + (const self_type& rhs) const { MTX44 tmp; return *MTX44Add(&tmp, this, &rhs); }
382 self_type operator - (const self_type& rhs) const { MTX44 tmp; return *MTX44Sub(&tmp, this, &rhs); }
383
384 self_type operator * (f32 f) const { MTX44 tmp; return *MTX44Mult(&tmp, this, f); }
385 self_type operator / (f32 f) const { return *this * (1.f / f); }
386
387 //! 転置を行います。
TransposeMTX44388 self_type& Transpose() { return *MTX44Transpose(this, this); }
389 //@}
390
391 //----------------------------------------
392 //! @name 設定
393 //@{
394
395 //! @brief 単位行列に設定します。
SetupIdentityMTX44396 self_type& SetupIdentity() { return *MTX44Identity(this); }
397
398 //! @brief スケール変換行列に設定します。
399 //!
400 //! @param[in] scale スケール値です。
401 //!
SetupScaleMTX44402 self_type& SetupScale(const VEC3& scale) { return *MTX44Scale(this, &scale); }
403
404 //! @brief 平行移動行列に設定します。
405 //!
406 //! @param[in] translate 平行移動値です。
407 //!
SetupTranslateMTX44408 self_type& SetupTranslate(const VEC3& translate)
409 {
410 return *MTX44Translate(this, &translate);
411 }
412
413 //! @brief XYZ 順の回転行列に設定します。
414 //!
415 //! @param[in] rotateRad 回転値です。単位はラジアンです。
416 //!
SetupRotateXyzMTX44417 self_type& SetupRotateXyz(const VEC3& rotateRad)
418 {
419 return *MTX44RotXYZRad(this, rotateRad.x, rotateRad.y, rotateRad.z);
420 }
421
422 //! @brief 指定した軸周りの回転行列に設定します。
423 //!
424 //! @param[in] axis 基準となる軸のベクトルです。
425 //! @param[in] theta 回転させる角度です。単位はラジアンです。
426 //!
SetupRotateMTX44427 self_type& SetupRotate(const VEC3& axis, f32 thetaRad)
428 {
429 return *MTX44RotAxisRad(this, &axis, thetaRad);
430 }
431
432 //! @brief 射影行列をニアクリッピング面での視錐台を元に設定します。
433 //! 引数の順序が OpenGL 準拠になっているので注意してください。
434 //!
435 //! @param[in] l ニアクリッピング面での視錐台左辺の X 座標です。
436 //! @param[in] r ニアクリッピング面での視錐台右辺の X 座標です。
437 //! @param[in] b ニアクリッピング面での視錐台下辺の Y 座標です。
438 //! @param[in] t ニアクリッピング面での視錐台上辺の Y 座標です。
439 //! @param[in] n ニアクリッピング面までの距離です。
440 //! @param[in] f ファークリッピング面までの距離です。
441 //! @param[in] pivot 画面の回転方向です。
442 //!
443 self_type& SetupFrustum(f32 l, f32 r, f32 b, f32 t, f32 n, f32 f, PivotDirection pivot = PIVOT_NONE)
444 {
445 return *MTX44FrustumPivot(this, l, r, b, t, n, f, pivot);
446 }
447
448 //! @brief 正射影行列を設定します。
449 //! 引数の順序が OpenGL 準拠になっているので注意してください。
450 //!
451 //! @param[in] l ニアクリッピング面での視錐台左辺の X 座標です。
452 //! @param[in] r ニアクリッピング面での視錐台右辺の X 座標です。
453 //! @param[in] b ニアクリッピング面での視錐台下辺の Y 座標です。
454 //! @param[in] t ニアクリッピング面での視錐台上辺の Y 座標です。
455 //! @param[in] n ニアクリッピング面までの距離です。
456 //! @param[in] f ファークリッピング面までの距離です。
457 //! @param[in] pivot 画面の回転方向です。
458 //!
459 self_type& SetupOrtho(f32 l, f32 r, f32 b, f32 t, f32 n, f32 f, PivotDirection pivot = PIVOT_NONE)
460 {
461 return *MTX44OrthoPivot(this, l, r, b, t, n, f, pivot);
462 }
463
464 //! @brief 射影行列を視野角とアスペクト比から設定します。
465 //!
466 //! @param[in] fovyRad 縦方向の視野角(Radian)です。
467 //! @param[in] aspect 視野のアスペクト比(幅/高さ)です。
468 //! @param[in] n ニアクリッピング面までの距離です。
469 //! @param[in] f ファークリッピング面までの距離です。
470 //! @param[in] pivot 画面の回転方向です。
471 //!
472 self_type& SetupPerspective(f32 fovyRad, f32 aspect, f32 n, f32 f, PivotDirection pivot = PIVOT_NONE)
473 {
474 return *MTX44PerspectivePivotRad(this, fovyRad, aspect, n, f, pivot);
475 }
476
477 //@}
478
479 //----------------------------------------
480 //! @name 比較
481 //@{
482
483 //! @brief 同値であれば true を返します。
484 bool operator == (const self_type& rhs) const { return ::std::memcmp(this, &rhs, sizeof(MTX44)) == 0; }
485
486 //! @brief 同値でなければ true を返します。
487 bool operator != (const self_type& rhs) const { return ::std::memcmp(this, &rhs, sizeof(MTX44)) != 0; }
488
489 //! @brief 単位行列であれば true を返します。
IsIdentityMTX44490 bool IsIdentity() const { return MTX44IsIdentity(this); }
491 //@}
492
493 //! @brief 状態を出力します。
494 void Report(bool bNewline = true, const char* name = NULL) const;
495 };
496
497 typedef struct MTX44 Matrix44;
498
499 /*!
500 @}
501 */
502
503 } // namespace math
504 } // namespace nn
505
506 #include <nn/math/ARMv6/math_Matrix44.h>
507
508 namespace nn {
509 namespace math {
510
511 /*!
512 @name 行列
513 @{
514 */
515
516 /*!--------------------------------------------------------------------------*
517 @brief 行列の和を計算します。
518
519 @param[out] pOut 計算結果を受け取るバッファへのポインタ。p1, p2 と同じ行列を指していても構いません。
520 @param[in] p1 左辺値へのポインタ。
521 @param[in] p2 右辺値へのポインタ。
522
523 @return pOut を返します。
524 *---------------------------------------------------------------------------*/
525 NN_FORCE_INLINE MTX44*
MTX44Add(MTX44 * pOut,const MTX44 * p1,const MTX44 * p2)526 MTX44Add(MTX44* pOut, const MTX44* p1, const MTX44* p2)
527 {
528
529 #if defined( NN_HARDWARE_CTR )
530 #if (MTX44ADD_ASM_CONFIG == D_ORG)
531 return ARMv6::MTX44AddC(pOut, p1, p2);
532 #elif (MTX44ADD_ASM_CONFIG == D_FAST_C)
533 #elif (MTX44ADD_ASM_CONFIG == D_FAST_ASM)
534 return ARMv6::MTX44AddAsm(pOut, p1, p2);
535 #elif (MTX44ADD_ASM_CONFIG == D_FAST_C_ALGO)
536 #elif (MTX44ADD_ASM_CONFIG == D_FAST_ASM_ALGO)
537 #endif
538 #else
539 #endif // #if defined( NN_HARDWARE_CTR )
540 }
541
542
543 /*!--------------------------------------------------------------------------*
544 @brief 行列をコピーします。
545
546 @param[out] pOut コピー先の行列へのポインタ。
547 @param[in] p コピー元の行列へのポインタ
548
549 @return pOut を返します。
550 *---------------------------------------------------------------------------*/
551 NN_FORCE_INLINE MTX44*
MTX44Copy(MTX44 * pOut,const MTX44 * p)552 MTX44Copy(MTX44* pOut, const MTX44* p)
553 {
554 #if defined( NN_HARDWARE_CTR )
555 #if (MTX44COPY_CONFIG == D_ORG)
556 return ARMv6::MTX44CopyC(pOut, p);
557 #elif (MTX44COPY_CONFIG == D_FAST_C)
558 #elif (MTX44COPY_CONFIG == D_FAST_ASM)
559 return ARMv6::MTX44CopyAsm(pOut, p);
560 #elif (MTX44COPY_CONFIG == D_FAST_C_ALGO)
561 #elif (MTX44COPY_CONFIG == D_FAST_ASM_ALGO)
562 #endif
563 #else
564 #endif // #if defined( NN_HARDWARE_CTR )
565 }
566
567 /*!--------------------------------------------------------------------------*
568 @brief 射影行列をニアクリッピング面での視錐台を元に作成します。
569 引数の順序が OpenGL 準拠になっているので注意。
570
571 @param[out] pOut 射影行列を格納する行列へのポインタ。
572 @param[in] l ニアクリッピング面での視錐台左辺の X 座標
573 @param[in] r ニアクリッピング面での視錐台右辺の X 座標
574 @param[in] b ニアクリッピング面での視錐台下辺の Y 座標
575 @param[in] t ニアクリッピング面での視錐台上辺の Y 座標
576 @param[in] n ニアクリッピング面までの距離。
577 @param[in] f ファークリッピング面までの距離。
578
579 @return pOut を返します。
580 *---------------------------------------------------------------------------*/
581 NN_FORCE_INLINE MTX44*
MTX44Frustum(MTX44 * pOut,f32 l,f32 r,f32 b,f32 t,f32 n,f32 f)582 MTX44Frustum(MTX44* pOut, f32 l, f32 r, f32 b, f32 t, f32 n, f32 f)
583 {
584 #if defined( NN_HARDWARE_CTR )
585 #if (MTX44FRUSTUM_CONFIG == D_ORG)
586 return ARMv6::MTX44FrustumC(pOut, l, r, b, t, n, f);
587 #elif (MTX44FRUSTUM_CONFIG == D_FAST_C)
588 return ARMv6::MTX44FrustumC_FAST(pOut, l, r, b, t, n, f);
589 #elif (MTX44FRUSTUM_CONFIG == D_FAST_ASM)
590 #elif (MTX44FRUSTUM_CONFIG == D_FAST_C_ALGO)
591 #elif (MTX44FRUSTUM_CONFIG == D_FAST_ASM_ALGO)
592 #endif
593 #else
594 #endif // #if defined( NN_HARDWARE_CTR )
595 }
596
597 /*!--------------------------------------------------------------------------*
598 @brief 行列の逆行列を計算します。
599
600 @param[out] pOut 計算結果を受け取るバッファへのポインタ。p と同じ行列を指していても構いません。
601 @param[in] p 元となる行列へのポインタ。
602
603 @return 逆行列が存在すれば 1 を、存在しなければ 0 を返します。
604 *---------------------------------------------------------------------------*/
605 NN_FORCE_INLINE u32
MTX44Inverse(MTX44 * pOut,const MTX44 * p)606 MTX44Inverse(MTX44* pOut, const MTX44* p)
607 {
608 #if defined( NN_HARDWARE_CTR )
609 #if (MTX44INVERSE_CONFIG == D_ORG)
610 return ARMv6::MTX44InverseC(pOut, p);
611 #elif (MTX44INVERSE_CONFIG == D_FAST_C)
612 #elif (MTX44INVERSE_CONFIG == D_FAST_ASM)
613 #elif (MTX44INVERSE_CONFIG == D_FAST_C_ALGO)
614 return ARMv6::MTX44InverseC_FAST_ALGO(pOut, p);
615 #elif (MTX44INVERSE_CONFIG == D_FAST_ASM_ALGO)
616 #endif
617 #else
618 #endif // #if defined( NN_HARDWARE_CTR )
619 }
620
621 /*!--------------------------------------------------------------------------*
622 @brief 行列の積を計算します。
623
624 @param[out] pOut 計算結果を受け取るバッファへのポインタ。p1, p2 と同じ行列を指していても構いません。
625 @param[in] p1 左辺値へのポインタ。
626 @param[in] p2 右辺値へのポインタ。
627
628 @return pOut を返します。
629 *---------------------------------------------------------------------------*/
630 NN_FORCE_INLINE MTX44*
MTX44Mult(MTX44 * pOut,const MTX44 * __restrict p1,const MTX44 * __restrict p2)631 MTX44Mult(MTX44* pOut, const MTX44* __restrict p1, const MTX44* __restrict p2)
632 {
633 #if defined( NN_HARDWARE_CTR )
634 #if (MTX44MULT_44_CONFIG == D_ORG)
635 return ARMv6::MTX44MultC(pOut, p1, p2);
636 #elif (MTX44MULT_44_CONFIG == D_FAST_C)
637 #elif (MTX44MULT_44_CONFIG == D_FAST_ASM)
638 return ARMv6::MTX44MultAsm(pOut, p1, p2);
639 #elif (MTX44MULT_44_CONFIG == D_FAST_C_ALGO)
640 #elif (MTX44MULT_44_CONFIG == D_FAST_ASM_ALGO)
641 #endif
642 #else
643 #endif // #if defined( NN_HARDWARE_CTR )
644 }
645
646 /*!--------------------------------------------------------------------------*
647 @brief 行列のスカラー積を計算します。
648
649 @param[out] pOut 計算結果を受け取るバッファへのポインタ。p と同じ行列を指していても構いません。
650 @param[in] p 元の行列のポインタ。
651 @param[in] f 掛ける数
652
653 @return pOut を返します。
654 *---------------------------------------------------------------------------*/
655 NN_FORCE_INLINE MTX44*
MTX44Mult(MTX44 * pOut,const MTX44 * p,f32 f)656 MTX44Mult(MTX44* pOut, const MTX44* p, f32 f)
657 {
658 #if defined( NN_HARDWARE_CTR )
659 #if (MTX44MULT_F32_CONFIG == D_ORG)
660 return ARMv6::MTX44MultC(pOut, p, f);
661 #elif (MTX44MULT_F32_CONFIG == D_FAST_C)
662 #elif (MTX44MULT_F32_CONFIG == D_FAST_ASM)
663 return ARMv6::MTX44MultAsm(pOut, p, f);
664 #elif (MTX44MULT_F32_CONFIG == D_FAST_C_ALGO)
665 #elif (MTX44MULT_F32_CONFIG == D_FAST_ASM_ALGO)
666 #endif
667 #else
668 #endif // #if defined( NN_HARDWARE_CTR )
669
670 }
671 /*!--------------------------------------------------------------------------*
672 @brief 行列にスケール変換を適用します。スケール行列を右から掛けます。
673
674 @param[out] pOut 計算結果を受け取るバッファへのポインタ。pM と同じ行列を指していても構いません。
675 @param[in] pM 元となる行列へのポインタ。
676 @param[in] pS それぞれの軸方向のスケール値が格納されたベクトルへのポインタ。
677
678 @return pOut を返します。
679 *---------------------------------------------------------------------------*/
680 NN_FORCE_INLINE MTX44*
MTX44MultScale(MTX44 * pOut,const MTX44 * pM,const VEC3 * pS)681 MTX44MultScale(MTX44* pOut, const MTX44* pM, const VEC3* pS)
682 {
683 #if defined( NN_HARDWARE_CTR )
684 #if (MTX44MULTSCALE_RIGHT_CONFIG == D_ORG)
685 return ARMv6::MTX44MultScaleC(pOut, pM, pS);
686 #elif (MTX44MULTSCALE_RIGHT_CONFIG == D_FAST_C)
687 #elif (MTX44MULTSCALE_RIGHT_CONFIG == D_FAST_ASM)
688 return ARMv6::MTX44MultScaleAsm(pOut, pM, pS);
689 #elif (MTX44MULTSCALE_RIGHT_CONFIG == D_FAST_C_ALGO)
690 #elif (MTX44MULTSCALE_RIGHT_CONFIG == D_FAST_ASM_ALGO)
691 #endif
692 #else
693 #endif // #if defined( NN_HARDWARE_CTR )
694 }
695
696
697 /*!--------------------------------------------------------------------------*
698 @brief 行列にスケール変換を適用します。スケール行列を左から掛けます。
699
700 @param[out] pOut 計算結果を受け取るバッファへのポインタ。pM と同じ行列を指していても構いません。
701 @param[in] pS それぞれの軸方向のスケール値が格納されたベクトルへのポインタ。
702 @param[in] pM 元となる行列へのポインタ。
703
704 @return pOut を返します。
705 *---------------------------------------------------------------------------*/
706 NN_FORCE_INLINE MTX44*
MTX44MultScale(MTX44 * pOut,const VEC3 * pS,const MTX44 * pM)707 MTX44MultScale(MTX44* pOut, const VEC3* pS, const MTX44* pM)
708 {
709 #if defined( NN_HARDWARE_CTR )
710 #if (MTX44MULTSCALE_LEFT_CONFIG == D_ORG)
711 return ARMv6::MTX44MultScaleC(pOut, pS, pM);
712 #elif (MTX44MULTSCALE_LEFT_CONFIG == D_FAST_C)
713 #elif (MTX44MULTSCALE_LEFT_CONFIG == D_FAST_ASM)
714 return ARMv6::MTX44MultScaleAsm(pOut, pS, pM);
715 #elif (MTX44MULTSCALE_LEFT_CONFIG == D_FAST_C_ALGO)
716 #elif (MTX44MULTSCALE_LEFT_CONFIG == D_FAST_ASM_ALGO)
717 #endif
718 #else
719 #endif // #if defined( NN_HARDWARE_CTR )
720 }
721
722 /*!--------------------------------------------------------------------------*
723 @brief 行列に平行移動を適用します。移動行列を左から掛けます。
724
725 @param[out] pOut 計算結果を受け取るバッファへのポインタ。pM と同じ行列を指していても構いません。
726 @param[in] pT それぞれの軸方向の移動量が格納されたベクトルへのポインタ。
727 @param[in] pM 元となる行列へのポインタ。
728
729 @return pOut を返します。
730 *---------------------------------------------------------------------------*/
731 NN_FORCE_INLINE MTX44*
MTX44MultTranslate(MTX44 * pOut,const VEC3 * pT,const MTX44 * pM)732 MTX44MultTranslate(MTX44* pOut, const VEC3* pT, const MTX44* pM)
733 {
734 #if defined( NN_HARDWARE_CTR )
735 #if (MTX44MULTTRANSLATE_LEFT_CONFIG == D_ORG)
736 return ARMv6::MTX44MultTranslateC(pOut, pT, pM);
737 #elif (MTX44MULTTRANSLATE_LEFT_CONFIG == D_FAST_C)
738 #elif (MTX44MULTTRANSLATE_LEFT_CONFIG == D_FAST_ASM)
739 return ARMv6::MTX44MultTranslateAsm(pOut, pT, pM);
740 #elif (MTX44MULTTRANSLATE_LEFT_CONFIG == D_FAST_C_ALGO)
741 #elif (MTX44MULTTRANSLATE_LEFT_CONFIG == D_FAST_ASM_ALGO)
742 #endif
743 #else
744 #endif // #if defined( NN_HARDWARE_CTR )
745 }
746
747 /*!--------------------------------------------------------------------------*
748 @brief 行列に平行移動を適用します。移動行列を右から掛けます。
749
750 @param[out] pOut 計算結果を受け取るバッファへのポインタ。pM と同じ行列を指していても構いません。
751 @param[in] pM 元となる行列へのポインタ。
752 @param[in] pT それぞれの軸方向の移動量が格納されたベクトルへのポインタ。
753
754 @return pOut を返します。
755 *---------------------------------------------------------------------------*/
756 NN_FORCE_INLINE MTX44*
MTX44MultTranslate(MTX44 * pOut,const MTX44 * pM,const VEC3 * pT)757 MTX44MultTranslate(MTX44* pOut, const MTX44* pM, const VEC3* pT)
758 {
759 #if defined( NN_HARDWARE_CTR )
760 #if (MTX44MULTTRANSLATE_RIGHT_CONFIG == D_ORG)
761 return ARMv6::MTX44MultTranslateC(pOut, pM, pT);
762 #elif (MTX44MULTTRANSLATE_RIGHT_CONFIG == D_FAST_C)
763 #elif (MTX44MULTTRANSLATE_RIGHT_CONFIG == D_FAST_ASM)
764 return ARMv6::MTX44MultTranslateAsm(pOut, pM, pT);
765 #elif (MTX44MULTTRANSLATE_RIGHT_CONFIG == D_FAST_C_ALGO)
766 #elif (MTX44MULTTRANSLATE_RIGHT_CONFIG == D_FAST_ASM_ALGO)
767 #endif
768 #else
769 #endif // #if defined( NN_HARDWARE_CTR )
770 }
771 /*!--------------------------------------------------------------------------*
772 @brief 正射影行列を作成します。
773 引数の順序が OpenGL 準拠になっているので注意。
774
775 @param[out] pOut 射影行列を格納する行列へのポインタ。
776 @param[in] l ニアクリッピング面での視錐台左辺の X 座標
777 @param[in] r ニアクリッピング面での視錐台右辺の X 座標
778 @param[in] b ニアクリッピング面での視錐台下辺の Y 座標
779 @param[in] t ニアクリッピング面での視錐台上辺の Y 座標
780 @param[in] n ニアクリッピング面までの距離。
781 @param[in] f ファークリッピング面までの距離。
782
783 @return pOut を返します。
784 *---------------------------------------------------------------------------*/
785 NN_FORCE_INLINE MTX44*
MTX44Ortho(MTX44 * pOut,f32 l,f32 r,f32 b,f32 t,f32 n,f32 f)786 MTX44Ortho(MTX44* pOut, f32 l, f32 r, f32 b, f32 t, f32 n, f32 f)
787 {
788 #if defined( NN_HARDWARE_CTR )
789 #if (MTX44ORTHO_CONFIG == D_ORG)
790 return ARMv6::MTX44OrthoC(pOut, l, r, b, t, n, f);
791 #elif (MTX44ORTHO_CONFIG == D_FAST_C)
792 return ARMv6::MTX44OrthoC_FAST(pOut, l, r, b, t, n, f);
793 #elif (MTX44ORTHO_CONFIG == D_FAST_ASM)
794 #elif (MTX44ORTHO_CONFIG == D_FAST_C_ALGO)
795 #elif (MTX44ORTHO_CONFIG == D_FAST_ASM_ALGO)
796 #endif
797 #else
798 #endif // #if defined( NN_HARDWARE_CTR )
799 }
800
801 /*!--------------------------------------------------------------------------*
802 @brief 射影行列を視野角とアスペクト比から作成します。
803
804 @param[out] pOut 射影行列を格納する行列へのポインタ。
805 @param[in] fovy 縦方向の視野角(Radian)
806 @param[in] aspect 視野のアスペクト比(幅/高さ)
807 @param[in] n ニアクリッピング面までの距離。
808 @param[in] f ファークリッピング面までの距離。
809
810 @return pOut を返します。
811 *---------------------------------------------------------------------------*/
812 NN_FORCE_INLINE MTX44*
MTX44PerspectiveRad(MTX44 * pOut,f32 fovy,f32 aspect,f32 n,f32 f)813 MTX44PerspectiveRad(MTX44* pOut, f32 fovy, f32 aspect, f32 n, f32 f)
814 {
815 #if defined( NN_HARDWARE_CTR )
816 #if (MTX44PERSPECTIVERAD_CONFIG == D_ORG)
817 return ARMv6::MTX44PerspectiveRadC(pOut, fovy, aspect, n, f);
818 #elif (MTX44PERSPECTIVERAD_CONFIG == D_FAST_C)
819 return ARMv6::MTX44PerspectiveRadC_FAST(pOut, fovy, aspect, n, f);
820 #elif (MTX44PERSPECTIVERAD_CONFIG == D_FAST_ASM)
821 #elif (MTX44PERSPECTIVERAD_CONFIG == D_FAST_C_ALGO)
822 return ARMv6::MTX44PerspectiveRadC_FAST(pOut, fovy, aspect, n, f);
823 #elif (MTX44PERSPECTIVERAD_CONFIG == D_FAST_ASM_ALGO)
824 #endif
825 #else
826 #endif // #if defined( NN_HARDWARE_CTR )
827 }
828
829 /*!--------------------------------------------------------------------------*
830 @brief 指定する軸の周りを回転させる回転行列を作成します。
831
832 @param[out] pOut 計算結果を受け取るバッファへのポインタ。
833 @param[in] pAxis 回転軸を指定するベクトルへのポインタ。
834 @param[in] fRad ラジアン単位での回転量
835
836 @return pOut を返します。
837 *---------------------------------------------------------------------------*/
838 NN_FORCE_INLINE MTX44*
MTX44RotAxisRad_(MTX44 * pOut,const VEC3 * pAxis,f32 fRad)839 MTX44RotAxisRad_( MTX44* pOut, const VEC3 *pAxis, f32 fRad )
840 {
841 #if defined( NN_HARDWARE_CTR )
842 #if (MTX44ROTAXISRAD__CONFIG == D_ORG)
843 return ARMv6::MTX44RotAxisRad_C(pOut, pAxis, fRad);
844 #elif (MTX44ROTAXISRAD__CONFIG == D_FAST_C)
845 return ARMv6::MTX44RotAxisRad_C_FAST(pOut, pAxis, fRad);
846 #elif (MTX44ROTAXISRAD__CONFIG == D_FAST_ASM)
847 #elif (MTX44ROTAXISRAD__CONFIG == D_FAST_C_ALGO)
848 return ARMv6::MTX44RotAxisRad_C_FAST(pOut, pAxis, fRad);
849 #elif (MTX44ROTAXISRAD__CONFIG == D_FAST_ASM_ALGO)
850 #endif
851 #else
852 #endif // #if defined( NN_HARDWARE_CTR )
853 }
854
855 /*!--------------------------------------------------------------------------*
856 @brief 回転行列を作成します。
857
858 @param[out] pOut 計算結果を受け取るバッファへのポインタ。
859 @param[in] fIdxX 1 円周を 256.0 とする単位での X 軸周りの角度
860 @param[in] fIdxY 1 円周を 256.0 とする単位での Y 軸周りの角度
861 @param[in] fIdxZ 1 円周を 256.0 とする単位での Z 軸周りの角度
862
863 @return pOut を返します。
864 *---------------------------------------------------------------------------*/
865 NN_FORCE_INLINE MTX44*
MTX44RotXYZFIdx(MTX44 * pOut,f32 fIdxX,f32 fIdxY,f32 fIdxZ)866 MTX44RotXYZFIdx(MTX44* pOut, f32 fIdxX, f32 fIdxY, f32 fIdxZ)
867 {
868 #if defined( NN_HARDWARE_CTR )
869 #if (MTX44ROTXYZFIDX_CONFIG == D_ORG)
870 return ARMv6::MTX44RotXYZFIdxC(pOut, fIdxX, fIdxY, fIdxZ);
871 #elif (MTX44ROTXYZFIDX_CONFIG == D_FAST_C)
872 return ARMv6::MTX44RotXYZFIdxC_FAST(pOut, fIdxX, fIdxY, fIdxZ);
873 #elif (MTX44ROTXYZFIDX_CONFIG == D_FAST_ASM)
874 #elif (MTX44ROTXYZFIDX_CONFIG == D_FAST_C_ALGO)
875 #elif (MTX44ROTXYZFIDX_CONFIG == D_FAST_ASM_ALGO)
876 #endif
877 #else
878 #endif // #if defined( NN_HARDWARE_CTR )
879 }
880
881 /*!--------------------------------------------------------------------------*
882 @brief スケール変換用の行列を作成します。
883
884 @param[out] pOut 計算結果を受け取るバッファへのポインタ。pM と同じ行列を指していても構いません。
885 @param[in] pS それぞれの軸方向のスケール値が格納されたベクトルへのポインタ。
886
887 @return pOut を返します。
888 *---------------------------------------------------------------------------*/
889 NN_FORCE_INLINE MTX44*
MTX44Scale(MTX44 * pOut,const VEC3 * pS)890 MTX44Scale(MTX44* pOut, const VEC3* pS)
891 {
892 #if defined( NN_HARDWARE_CTR )
893 #if (MTX44SCALE_CONFIG == D_ORG)
894 return ARMv6::MTX44ScaleC(pOut, pS);
895 #elif (MTX44SCALE_CONFIG == D_FAST_C)
896 return ARMv6::MTX44ScaleC_FAST(pOut, pS);
897 #elif (MTX44SCALE_CONFIG == D_FAST_ASM)
898 #elif (MTX44SCALE_CONFIG == D_FAST_C_ALGO)
899 #elif (MTX44SCALE_CONFIG == D_FAST_ASM_ALGO)
900 #endif
901 #else
902 #endif // #if defined( NN_HARDWARE_CTR )
903 }
904 /*!--------------------------------------------------------------------------*
905 @brief 平行移動用の行列を作成します。
906
907 @param[out] pOut 計算結果を受け取るバッファへのポインタ。pM と同じ行列を指していても構いません。
908 @param[in] pT それぞれの軸方向の移動量が格納されたベクトルへのポインタ。
909
910 @return pOut を返します。
911 *---------------------------------------------------------------------------*/
912 NN_FORCE_INLINE MTX44*
MTX44Translate(MTX44 * pOut,const VEC3 * pT)913 MTX44Translate(MTX44* pOut, const VEC3* pT)
914 {
915 #if defined( NN_HARDWARE_CTR )
916 #if (MTX44TRANSLATE_CONFIG == D_ORG)
917 return ARMv6::MTX44TranslateC(pOut, pT);
918 #elif (MTX44TRANSLATE_CONFIG == D_FAST_C)
919 return ARMv6::MTX44TranslateC_FAST(pOut, pT);
920 #elif (MTX44TRANSLATE_CONFIG == D_FAST_ASM)
921 #elif (MTX44TRANSLATE_CONFIG == D_FAST_C_ALGO)
922 #elif (MTX44TRANSLATE_CONFIG == D_FAST_ASM_ALGO)
923 #endif
924 #else
925 #endif // #if defined( NN_HARDWARE_CTR )
926
927 }
928 /*!--------------------------------------------------------------------------*
929 @brief 行列の転置を取得します。
930
931 @param[in] pOut 計算結果を受け取るバッファへのポインタ。pSrcと同じ行列を指していても構いません。
932 @param[in] pSrc 元となる行列へのポインタ。
933
934 @return pOut を返します。
935 *---------------------------------------------------------------------------*/
936 NN_FORCE_INLINE MTX44*
MTX44Transpose(MTX44 * pOut,const MTX44 * pSrc)937 MTX44Transpose(MTX44* pOut, const MTX44 *pSrc)
938 {
939 #if defined( NN_HARDWARE_CTR )
940 #if (MTX44TRANSPOSE_44_CONFIG == D_ORG)
941 return ARMv6::MTX44TransposeC(pOut, pSrc);
942 #elif (MTX44TRANSPOSE_44_CONFIG == D_FAST_C)
943 #elif (MTX44TRANSPOSE_44_CONFIG == D_FAST_ASM)
944 return ARMv6::MTX44TransposeAsm(pOut, pSrc);
945 #elif (MTX44TRANSPOSE_44_CONFIG == D_FAST_C_ALGO)
946 #elif (MTX44TRANSPOSE_44_CONFIG == D_FAST_ASM_ALGO)
947 #endif
948 #else
949 #endif // #if defined( NN_HARDWARE_CTR )
950
951 }
952 /*!
953 @}
954 */
955
956 /*!
957 @name ユーティリティ
958 @{
959 */
960
961 /*!--------------------------------------------------------------------------*
962 @brief ベクトルを行列で変換します。ベクトルの 4 要素目を 1 として計算します。
963
964 @param[out] pOut 計算結果を受け取るバッファへのポインタ。pV と同じベクトルを指していても構いません。
965 @param[in] pM 変換行列へのポインタ。
966 @param[in] pV 元となるベクトルへのポインタ。
967
968 @return pOut を返します。
969 *---------------------------------------------------------------------------*/
970 NN_FORCE_INLINE VEC4*
VEC3Transform(VEC4 * pOut,const MTX44 * pM,const VEC3 * pV)971 VEC3Transform(VEC4* pOut, const MTX44* pM, const VEC3* pV)
972 {
973 #if defined( NN_HARDWARE_CTR )
974 #if (VEC3TRANSFORM_44XVEC3_CONFIG == D_ORG)
975 return ARMv6::VEC3TransformC(pOut, pM, pV);
976 #elif (VEC3TRANSFORM_44XVEC3_CONFIG == D_FAST_C)
977 #elif (VEC3TRANSFORM_44XVEC3_CONFIG == D_FAST_ASM)
978 return ARMv6::VEC3TransformAsm(pOut, pM, pV);
979 #elif (VEC3TRANSFORM_44XVEC3_CONFIG == D_FAST_C_ALGO)
980 #elif (VEC3TRANSFORM_44XVEC3_CONFIG == D_FAST_ASM_ALGO)
981 #endif
982 #else
983 #endif // #if defined( NN_HARDWARE_CTR )
984 }
985
986 /*!
987 @}
988 */
989
990 /*!
991 @name 行列
992 @{
993 */
994
995 /*---------------------------------------------------------------------------*
996 Description: 画面方向に向けて射影行列を回転します。
997
998 Arguments: pOut 回転をおこなう行列へのポインタ
999 pivot
1000
1001 Returns:
1002 *---------------------------------------------------------------------------*/
1003 NN_FORCE_INLINE MTX44*
MTX44Pivot(MTX44 * pOut,PivotDirection pivot)1004 MTX44Pivot( MTX44* pOut, PivotDirection pivot )
1005 {
1006 #if defined( NN_HARDWARE_CTR )
1007 #if (MTX44PIVOT_CONFIG == D_ORG)
1008 return ARMv6::MTX44PivotC(pOut, pivot);
1009 #elif (MTX44PIVOT_CONFIG == D_FAST_C)
1010 return ARMv6::MTX44PivotC_FAST(pOut, pivot);
1011 #elif (MTX44PIVOT_CONFIG == D_FAST_ASM)
1012 #elif (MTX44PIVOT_CONFIG == D_FAST_C_ALGO)
1013 #elif (MTX44PIVOT_CONFIG == D_FAST_ASM_ALGO)
1014 #endif
1015 #else
1016 #endif // #if defined( NN_HARDWARE_CTR )
1017
1018 }
1019
1020 /*!
1021 @}
1022 */
1023
1024 //-- const 引数を参照にしたオーバーロード
MTX44Copy(MTX44 * pOut,const MTX44 & m)1025 inline MTX44* MTX44Copy(MTX44* pOut, const MTX44& m) { return MTX44Copy( pOut, &m ); }
MTX44IsIdentity(const MTX44 & m)1026 inline bool MTX44IsIdentity(const MTX44& m) { return MTX44IsIdentity( &m ); }
1027
MTX44Add(MTX44 * pOut,const MTX44 & m1,const MTX44 & m2)1028 inline MTX44* MTX44Add(MTX44* pOut, const MTX44& m1, const MTX44& m2) { return MTX44Add( pOut, &m1, &m2 ); }
MTX44Sub(MTX44 * pOut,const MTX44 & m1,const MTX44 & m2)1029 inline MTX44* MTX44Sub(MTX44* pOut, const MTX44& m1, const MTX44& m2) { return MTX44Sub( pOut, &m1, &m2 ); }
MTX44Mult(MTX44 * pOut,const MTX44 & m,f32 f)1030 inline MTX44* MTX44Mult(MTX44* pOut, const MTX44& m, f32 f) { return MTX44Mult( pOut, &m, f ); }
MTX44Mult(MTX44 * pOut,const MTX44 & m1,const MTX44 & m2)1031 inline MTX44* MTX44Mult(MTX44* pOut, const MTX44& m1, const MTX44& m2) { return MTX44Mult( pOut, &m1, &m2 ); }
1032
MTX44Transpose(MTX44 * pOut,const MTX44 & m)1033 inline MTX44* MTX44Transpose(MTX44* pOut, const MTX44& m) { return MTX44Transpose( pOut, &m ); }
MTX44MultArray(MTX44 * pOut,const MTX44 & m1,const MTX44 * pSrc,s32 count)1034 inline MTX44* MTX44MultArray(MTX44* pOut, const MTX44& m1, const MTX44* pSrc, s32 count) { return MTX44MultArray( pOut, &m1, pSrc, count ); }
MTX44Inverse(MTX44 * pOut,const MTX44 & m)1035 inline u32 MTX44Inverse(MTX44* pOut, const MTX44& m) { return MTX44Inverse( pOut, &m ); }
1036
MTX44RotAxisFIdx(MTX44 * pOut,const VEC3 & vAxis,f32 fIdx)1037 inline MTX44* MTX44RotAxisFIdx(MTX44* pOut, const VEC3& vAxis, f32 fIdx) { return MTX44RotAxisFIdx( pOut, &vAxis, fIdx ); }
MTX44RotAxisRad(MTX44 * pOut,const VEC3 & vAxis,f32 fRad)1038 inline MTX44* MTX44RotAxisRad(MTX44* pOut, const VEC3& vAxis, f32 fRad) { return MTX44RotAxisRad( pOut, &vAxis, fRad ); }
MTX44RotAxisDeg(MTX44 * pOut,const VEC3 & vAxis,f32 fDeg)1039 inline MTX44* MTX44RotAxisDeg(MTX44* pOut, const VEC3& vAxis, f32 fDeg) { return MTX44RotAxisDeg( pOut, &vAxis, fDeg ); }
1040
MTX44Scale(MTX44 * pOut,const VEC3 & S)1041 inline MTX44* MTX44Scale(MTX44* pOut, const VEC3& S) { return MTX44Scale(pOut, &S); }
MTX44MultScale(MTX44 * pOut,const MTX44 & M,const VEC3 & S)1042 inline MTX44* MTX44MultScale(MTX44* pOut, const MTX44& M, const VEC3& S) { return MTX44MultScale(pOut, &M, &S); }
MTX44MultScale(MTX44 * pOut,const VEC3 & S,const MTX44 & M)1043 inline MTX44* MTX44MultScale(MTX44* pOut, const VEC3& S, const MTX44& M) { return MTX44MultScale(pOut, &S, &M); }
1044
MTX44Translate(MTX44 * pOut,const VEC3 & T)1045 inline MTX44* MTX44Translate(MTX44* pOut, const VEC3& T) { return MTX44Translate(pOut, &T); }
MTX44MultTranslate(MTX44 * pOut,const MTX44 & M,const VEC3 & T)1046 inline MTX44* MTX44MultTranslate(MTX44* pOut, const MTX44& M, const VEC3& T) { return MTX44MultTranslate(pOut, &M, &T); }
MTX44MultTranslate(MTX44 * pOut,const VEC3 & T,const MTX44 & M)1047 inline MTX44* MTX44MultTranslate(MTX44* pOut, const VEC3& T, const MTX44& M) { return MTX44MultTranslate(pOut, &T, &M); }
1048
1049 } // namespace math
1050 } // namespace nn
1051
1052 #if defined(NN_MATH_AS_INLINE)
1053 #include <nn/math/inline/math_Matrix44.ipp>
1054 #include <nn/math/ARMv6/inline/math_Matrix44.ipp>
1055 #endif
1056
1057 #pragma pop
1058
1059 #endif
1060