/*---------------------------------------------------------------------------* Project: Horizon File: math_Vector4.ipp Copyright (C)2009-2010 Nintendo Co., Ltd. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. $Revision: 18015 $ *---------------------------------------------------------------------------*/ namespace nn { namespace math { /* ------------------------------------------------------------------------ VEC4 ------------------------------------------------------------------------ */ /*! @name ベクトル @{ */ /*!--------------------------------------------------------------------------* @brief ベクトルがゼロベクトルかどうか判定します。 @param[in] p 判定対象のベクトルへのポインタ。 @return p がゼロベクトルであれば true そうでなければ false を返します。 *---------------------------------------------------------------------------*/ NN_MATH_INLINE bool VEC4IsZero(const VEC4* p) { return p->x == 0.f && p->y == 0.f && p->z == 0.f && p->w == 0.f; } /*!--------------------------------------------------------------------------* @brief 同次座標でベクトルがゼロベクトルかどうか判定します。 @param[in] p 判定対象のベクトルへのポインタ。 @return p がゼロベクトルであれば true そうでなければ false を返します。 *---------------------------------------------------------------------------*/ NN_MATH_INLINE bool VEC4IsZeroWOne(const VEC4* p) { return p->x == 0.f && p->y == 0.f && p->z == 0.f && p->w == 1.f; } /*!--------------------------------------------------------------------------* @brief ベクトルの和を計算します。 @param[out] pOut 計算結果を受け取るバッファへのポインタ。p1, p2 と同じベクトルを指していても構いません。 @param[in] p1 左辺値へのポインタ @param[in] p2 右辺値へのポインタ @return pOut を返します。 *---------------------------------------------------------------------------*/ NN_MATH_INLINE VEC4* VEC4Add(VEC4* pOut, const VEC4* p1, const VEC4* p2) { pOut->x = p1->x + p2->x; pOut->y = p1->y + p2->y; pOut->z = p1->z + p2->z; pOut->w = p1->w + p2->w; return pOut; } /*!--------------------------------------------------------------------------* @brief ベクトルの差を計算します。 @param[out] pOut 計算結果を受け取るバッファへのポインタ。p1, p2 と同じベクトルを指していても構いません。 @param[in] p1 左辺値へのポインタ @param[in] p2 右辺値へのポインタ @return pOut を返します。 *---------------------------------------------------------------------------*/ NN_MATH_INLINE VEC4* VEC4Sub(VEC4* pOut, const VEC4* p1, const VEC4* p2) { pOut->x = p1->x - p2->x; pOut->y = p1->y - p2->y; pOut->z = p1->z - p2->z; pOut->w = p1->w - p2->w; return pOut; } /*!--------------------------------------------------------------------------* @brief ベクトルの積を計算します。 @param[out] pOut 計算結果を受け取るバッファへのポインタ。p1, p2 と同じベクトルを指していても構いません。 @param[in] p1 左辺値へのポインタ @param[in] p2 右辺値へのポインタ @return pOut を返します。 *---------------------------------------------------------------------------*/ NN_MATH_INLINE VEC4* VEC4Mult(VEC4* pOut, const VEC4* p1, const VEC4* p2) { pOut->x = p1->x * p2->x; pOut->y = p1->y * p2->y; pOut->z = p1->z * p2->z; pOut->w = p1->w * p2->w; return pOut; } /*!--------------------------------------------------------------------------* @brief ベクトルのスカラー倍を計算します。 @param[out] pOut 計算結果を受け取るバッファへのポインタ。p と同じベクトルを指していても構いません。 @param[in] p 左辺値へのポインタ @param[in] scale 掛ける数 @return pOut を返します。 *---------------------------------------------------------------------------*/ NN_MATH_INLINE VEC4* VEC4Scale(VEC4* pOut, const VEC4* p, f32 scale) { pOut->x = scale * p->x; pOut->y = scale * p->y; pOut->z = scale * p->z; pOut->w = scale * p->w; return pOut; } /*!--------------------------------------------------------------------------* @brief 2つのベクトル間の線形補間を計算します。 @param[out] pOut 計算結果を受け取るバッファへのポインタ。p1, p2 と同じベクトルを指していても構いません。 @param[in] p1 線形補間の始点となるベクトルへのポインタ @param[in] p2 線形補間の終点となるベクトルへのポインタ @param[in] t 線形補間のパラメータ。0.0 であれば p1 が 1.0 であれば p2 が結果となります。 @return pOut を返します。 *---------------------------------------------------------------------------*/ NN_MATH_INLINE VEC4* VEC4Lerp(VEC4* pOut, const VEC4* __restrict p1, const VEC4* __restrict p2, f32 t) { // (1-t)*p1 + t*p2 pOut->x = p1->x + t * (p2->x - p1->x); pOut->y = p1->y + t * (p2->y - p1->y); pOut->z = p1->z + t * (p2->z - p1->z); pOut->w = p1->w + t * (p2->w - p1->w); return pOut; } /*!--------------------------------------------------------------------------* @brief ベクトルの内積を計算します。 @param[in] p1 左辺値へのポインタ @param[in] p2 右辺値へのポインタ @return p1 と p2 の内積を返します。 *---------------------------------------------------------------------------*/ NN_MATH_INLINE f32 VEC4Dot(const VEC4* p1, const VEC4* p2) { return p1->x * p2->x + p1->y * p2->y + p1->z * p2->z + p1->w * p2->w; } /*!--------------------------------------------------------------------------* @brief ベクトルの長さの2乗を計算します。 @param[in] p 対象のベクトルへのポインタ。 @return p の長さの2乗を返します。 *---------------------------------------------------------------------------*/ NN_MATH_INLINE f32 VEC4LenSq(const VEC4* __restrict p) { return p->x * p->x + p->y * p->y + p->z * p->z + p->w * p->w; } /*!--------------------------------------------------------------------------* @brief ベクトルの長さを計算します。 @param[in] p 対象のベクトルへのポインタ。 @return p の長さを返します。 *---------------------------------------------------------------------------*/ f32 VEC4Len(const VEC4* p) { return FSqrt(VEC4LenSq(p)); } /*!--------------------------------------------------------------------------* @brief ベクトルを正規化します。 @param[out] pOut 計算結果を受け取るバッファへのポインタ。p と同じベクトルを指していても構いません。 @param[in] p 対象のベクトルへのポインタ @return pOut を返します。 *---------------------------------------------------------------------------*/ NN_MATH_INLINE VEC4* VEC4Normalize(VEC4* pOut, const VEC4* p) { (void)VEC4Scale(pOut, p, FrSqrt(VEC4LenSq(p))); return pOut; } /*!--------------------------------------------------------------------------* @brief ベクトルを正規化します。 正規化に失敗した場合は指定されたベクトルを設定します。 @param[out] pOut 計算結果を受け取るバッファへのポインタ。p と同じベクトルを指していても構いません。 @param[in] p 対象のベクトルへのポインタ @param[in] alt 正規化に失敗した場合に設定するベクトル @return pOut を返します。 *---------------------------------------------------------------------------*/ NN_MATH_INLINE VEC4* VEC4SafeNormalize(VEC4* pOut, const VEC4* p, const VEC4& alt) { NN_NULL_ASSERT(pOut); NN_NULL_ASSERT(p); f32 mag = VEC4LenSq(p); if (mag == 0) { *pOut = alt; return pOut; } (void)VEC4Scale(pOut, p, FrSqrt(mag)); return pOut; } /*!--------------------------------------------------------------------------* @brief 2つのベクトル間の距離の2乗を計算します。 @param[in] p1 左辺値へのポインタ @param[in] p2 右辺値へのポインタ @return p1 と p2 の距離の2乗を返します。 *---------------------------------------------------------------------------*/ NN_MATH_INLINE f32 VEC4DistSq(const VEC4* p1, const VEC4* p2) { VEC4 tmp; return VEC4LenSq(VEC4Sub(&tmp, p1, p2)); } /*!--------------------------------------------------------------------------* @brief 2つのベクトルのそれぞれの成分の最大値から構成されるベクトルを作成します。 @param[out] pOut 計算結果を受け取るバッファへのポインタ。p1, p2 と同じベクトルを指していても構いません。 @param[in] p1 対象のベクトル1へのポインタ。 @param[in] p2 対象のベクトル2へのポインタ。 @return pOut を返します。 *---------------------------------------------------------------------------*/ NN_MATH_INLINE VEC4* VEC4Maximize(VEC4* pOut, const VEC4* p1, const VEC4* p2) { pOut->x = (p1->x > p2->x) ? p1->x : p2->x; pOut->y = (p1->y > p2->y) ? p1->y : p2->y; pOut->z = (p1->z > p2->z) ? p1->z : p2->z; pOut->w = (p1->w > p2->w) ? p1->w : p2->w; return pOut; } /*!--------------------------------------------------------------------------* @brief 2つのベクトルのそれぞれの成分の最小値から構成されるベクトルを作成します。 @param[out] pOut 計算結果を受け取るバッファへのポインタ。p1, p2 と同じベクトルを指していても構いません。 @param[in] p1 対象のベクトル1へのポインタ。 @param[in] p2 対象のベクトル2へのポインタ。 @return pOut を返します。 *---------------------------------------------------------------------------*/ NN_MATH_INLINE VEC4* VEC4Minimize(VEC4* pOut, const VEC4* p1, const VEC4* p2) { pOut->x = (p1->x < p2->x) ? p1->x : p2->x; pOut->y = (p1->y < p2->y) ? p1->y : p2->y; pOut->z = (p1->z < p2->z) ? p1->z : p2->z; pOut->w = (p1->w < p2->w) ? p1->w : p2->w; return pOut; } /*! @} */ } // namespace math } // namespace nn