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