1/*---------------------------------------------------------------------------*
2  Project:  Horizon
3  File:     math_Matrix43.ipp
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: 13623 $
14 *---------------------------------------------------------------------------*/
15#include <nn/math/math_Matrix43.h>
16
17namespace nn {
18namespace math {
19namespace ARMv6 {
20/*!
21    @name    行列
22    @{
23*/
24
25/*!--------------------------------------------------------------------------*
26  @brief        行列をコピーします。
27
28  @param[out]   pOut  コピー先の行列へのポインタ。
29  @param[in]    p     コピー元の行列へのポインタ
30
31  @return       pOut を返します。
32 *---------------------------------------------------------------------------*/
33NN_MATH_INLINE MTX43*
34MTX43CopyC(MTX43* pOut, const MTX43* p)
35{
36    NN_NULL_ASSERT( pOut );
37    NN_NULL_ASSERT( p );
38
39    if (pOut != p)
40    {
41        *pOut = *p;
42    }
43
44    return pOut;
45}
46
47/*!--------------------------------------------------------------------------*
48  @brief        行列の和を計算します。
49
50  @param[out]   pOut  計算結果を受け取るバッファへのポインタ。p1, p2 と同じ行列を指していても構いません。
51  @param[in]    p1    左辺値へのポインタ。
52  @param[in]    p2    右辺値へのポインタ。
53
54  @return       pOut を返します。
55 *---------------------------------------------------------------------------*/
56NN_MATH_INLINE MTX43*
57MTX43AddC(MTX43* pOut, const MTX43* p1, const MTX43* p2)
58{
59    NN_NULL_ASSERT( pOut );
60    NN_NULL_ASSERT( p1 );
61    NN_NULL_ASSERT( p2 );
62
63    pOut->f._00 = p1->f._00 + p2->f._00;
64    pOut->f._01 = p1->f._01 + p2->f._01;
65    pOut->f._02 = p1->f._02 + p2->f._02;
66
67    pOut->f._10 = p1->f._10 + p2->f._10;
68    pOut->f._11 = p1->f._11 + p2->f._11;
69    pOut->f._12 = p1->f._12 + p2->f._12;
70
71    pOut->f._20 = p1->f._20 + p2->f._20;
72    pOut->f._21 = p1->f._21 + p2->f._21;
73    pOut->f._22 = p1->f._22 + p2->f._22;
74
75    pOut->f._30 = p1->f._30 + p2->f._30;
76    pOut->f._31 = p1->f._31 + p2->f._31;
77    pOut->f._32 = p1->f._32 + p2->f._32;
78
79    return pOut;
80}
81
82/*!--------------------------------------------------------------------------*
83  @brief        行列の積を計算します。
84
85  @param[out]   pOut  計算結果を受け取るバッファへのポインタ。p1, p2 と同じ行列を指していても構いません。
86  @param[in]    p1    左辺値へのポインタ。
87  @param[in]    p2    右辺値へのポインタ。
88
89  @return       pOut を返します。
90 *---------------------------------------------------------------------------*/
91NN_MATH_INLINE MTX43*
92MTX43MultC(MTX43* pOut, const MTX43* __restrict p1, const MTX43* __restrict p2)
93{
94    NN_NULL_ASSERT( pOut );
95    NN_NULL_ASSERT( p1 );
96    NN_NULL_ASSERT( p2 );
97
98    MTX43 mTmp;
99
100    MTX43* __restrict pDst = ( pOut == p1 || pOut == p2 ) ? &mTmp : pOut;
101
102    pDst->f._00 = p1->f._00 * p2->f._00 + p1->f._01 * p2->f._10 + p1->f._02 * p2->f._20;
103    pDst->f._01 = p1->f._00 * p2->f._01 + p1->f._01 * p2->f._11 + p1->f._02 * p2->f._21;
104    pDst->f._02 = p1->f._00 * p2->f._02 + p1->f._01 * p2->f._12 + p1->f._02 * p2->f._22;
105
106    pDst->f._10 = p1->f._10 * p2->f._00 + p1->f._11 * p2->f._10 + p1->f._12 * p2->f._20;
107    pDst->f._11 = p1->f._10 * p2->f._01 + p1->f._11 * p2->f._11 + p1->f._12 * p2->f._21;
108    pDst->f._12 = p1->f._10 * p2->f._02 + p1->f._11 * p2->f._12 + p1->f._12 * p2->f._22;
109
110    pDst->f._20 = p1->f._20 * p2->f._00 + p1->f._21 * p2->f._10 + p1->f._22 * p2->f._20;
111    pDst->f._21 = p1->f._20 * p2->f._01 + p1->f._21 * p2->f._11 + p1->f._22 * p2->f._21;
112    pDst->f._22 = p1->f._20 * p2->f._02 + p1->f._21 * p2->f._12 + p1->f._22 * p2->f._22;
113
114    pDst->f._30 = p1->f._30 * p2->f._00 + p1->f._31 * p2->f._10 + p1->f._32 * p2->f._20 + p2->f._30;
115    pDst->f._31 = p1->f._30 * p2->f._01 + p1->f._31 * p2->f._11 + p1->f._32 * p2->f._21 + p2->f._31;
116    pDst->f._32 = p1->f._30 * p2->f._02 + p1->f._31 * p2->f._12 + p1->f._32 * p2->f._22 + p2->f._32;
117
118    if ( pDst != pOut )
119    {
120        MTX43Copy( pOut, pDst );
121    }
122
123    return pOut;
124}
125
126/*!--------------------------------------------------------------------------*
127  @brief        行列にスカラを乗算します。
128
129  @param[out]   pOut  計算結果を受け取るバッファへのポインタ。p と同じ行列を指していても構いません。
130  @param[in]    p   元となる行列へのポインタ。
131  @param[in]    f   乗算するスカラ値。
132
133  @return       pOut を返します。
134 *---------------------------------------------------------------------------*/
135NN_MATH_INLINE MTX43*
136MTX43MultC(MTX43* pOut, const MTX43* p, f32 f)
137{
138    NN_NULL_ASSERT( pOut );
139    NN_NULL_ASSERT( p );
140
141    pOut->f._00 = p->f._00 * f;
142    pOut->f._01 = p->f._01 * f;
143    pOut->f._02 = p->f._02 * f;
144
145    pOut->f._10 = p->f._10 * f;
146    pOut->f._11 = p->f._11 * f;
147    pOut->f._12 = p->f._12 * f;
148
149    pOut->f._20 = p->f._20 * f;
150    pOut->f._21 = p->f._21 * f;
151    pOut->f._22 = p->f._22 * f;
152
153    pOut->f._30 = p->f._30 * f;
154    pOut->f._31 = p->f._31 * f;
155    pOut->f._32 = p->f._32 * f;
156
157    return pOut;
158}
159
160/*!
161    @}
162*/
163}  // namespace ARMv6
164}  // namespace math
165}  // namespace nn
166