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