1/*---------------------------------------------------------------------------* 2 Project: Horizon 3 File: math_Vector4.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: 45840 $ 14 *---------------------------------------------------------------------------*/ 15 16namespace nn { 17namespace math { 18 19/* ------------------------------------------------------------------------ 20 VEC4 21 ------------------------------------------------------------------------ */ 22 23NN_MATH_INLINE VEC4* 24VEC4Add(VEC4* pOut, const VEC4* p1, const VEC4* p2) 25{ 26 pOut->x = p1->x + p2->x; 27 pOut->y = p1->y + p2->y; 28 pOut->z = p1->z + p2->z; 29 pOut->w = p1->w + p2->w; 30 31 return pOut; 32} 33 34NN_MATH_INLINE f32 35VEC4DistSq(const VEC4* p1, const VEC4* p2) 36{ 37 VEC4 tmp; 38 return VEC4LenSq(VEC4Sub(&tmp, p1, p2)); 39} 40 41NN_MATH_INLINE f32 42VEC4Dot(const VEC4* p1, const VEC4* p2) 43{ 44 return p1->x * p2->x + p1->y * p2->y + p1->z * p2->z + p1->w * p2->w; 45} 46 47NN_MATH_INLINE bool 48VEC4IsZero(const VEC4* p) 49{ 50 return p->x == 0.f && p->y == 0.f && p->z == 0.f && p->w == 0.f; 51} 52 53NN_MATH_INLINE bool 54VEC4IsZeroWOne(const VEC4* p) 55{ 56 return p->x == 0.f && p->y == 0.f && p->z == 0.f && p->w == 1.f; 57} 58 59NN_MATH_INLINE f32 60VEC4Len(const VEC4* p) 61{ 62 return FSqrt(VEC4LenSq(p)); 63 64} 65 66NN_MATH_INLINE f32 67VEC4LenSq(const VEC4* __restrict p) 68{ 69 return p->x * p->x + p->y * p->y + p->z * p->z + p->w * p->w; 70 71} 72 73NN_MATH_INLINE VEC4* 74VEC4Lerp(VEC4* pOut, const VEC4* __restrict p1, const VEC4* __restrict p2, f32 t) 75{ 76 // (1-t)*p1 + t*p2 77 pOut->x = p1->x + t * (p2->x - p1->x); 78 pOut->y = p1->y + t * (p2->y - p1->y); 79 pOut->z = p1->z + t * (p2->z - p1->z); 80 pOut->w = p1->w + t * (p2->w - p1->w); 81 82 return pOut; 83} 84 85NN_MATH_INLINE VEC4* 86VEC4Maximize(VEC4* pOut, const VEC4* p1, const VEC4* p2) 87{ 88 pOut->x = (p1->x > p2->x) ? p1->x : p2->x; 89 pOut->y = (p1->y > p2->y) ? p1->y : p2->y; 90 pOut->z = (p1->z > p2->z) ? p1->z : p2->z; 91 pOut->w = (p1->w > p2->w) ? p1->w : p2->w; 92 93 return pOut; 94} 95NN_MATH_INLINE VEC4* 96VEC4Mult(VEC4* pOut, const VEC4* p1, const VEC4* p2) 97{ 98 pOut->x = p1->x * p2->x; 99 pOut->y = p1->y * p2->y; 100 pOut->z = p1->z * p2->z; 101 pOut->w = p1->w * p2->w; 102 return pOut; 103} 104 105NN_MATH_INLINE VEC4* 106VEC4Normalize(VEC4* pOut, const VEC4* p) 107{ 108 (void)VEC4Scale(pOut, p, FrSqrt(VEC4LenSq(p))); 109 110 return pOut; 111} 112 113NN_MATH_INLINE VEC4* 114VEC4SafeNormalize(VEC4* pOut, const VEC4* p, const VEC4& alt) 115{ 116 NN_NULL_ASSERT(pOut); 117 NN_NULL_ASSERT(p); 118 119 f32 mag = VEC4LenSq(p); 120 121 if (mag == 0) 122 { 123 *pOut = alt; 124 125 return pOut; 126 } 127 128 (void)VEC4Scale(pOut, p, FrSqrt(mag)); 129 130 return pOut; 131} 132 133NN_MATH_INLINE VEC4* 134VEC4Minimize(VEC4* pOut, const VEC4* p1, const VEC4* p2) 135{ 136 pOut->x = (p1->x < p2->x) ? p1->x : p2->x; 137 pOut->y = (p1->y < p2->y) ? p1->y : p2->y; 138 pOut->z = (p1->z < p2->z) ? p1->z : p2->z; 139 pOut->w = (p1->w < p2->w) ? p1->w : p2->w; 140 141 return pOut; 142} 143 144NN_MATH_INLINE VEC4* 145VEC4Scale(VEC4* pOut, const VEC4* p, f32 scale) 146{ 147 pOut->x = scale * p->x; 148 pOut->y = scale * p->y; 149 pOut->z = scale * p->z; 150 pOut->w = scale * p->w; 151 152 return pOut; 153} 154 155NN_MATH_INLINE VEC4* 156VEC4Sub(VEC4* pOut, const VEC4* p1, const VEC4* p2) 157{ 158 pOut->x = p1->x - p2->x; 159 pOut->y = p1->y - p2->y; 160 pOut->z = p1->z - p2->z; 161 pOut->w = p1->w - p2->w; 162 163 return pOut; 164} 165 166} // namespace math 167} // namespace nn 168