1/*---------------------------------------------------------------------------*
2  Project:  Horizon
3  File:     math_Vector3.ipp
4  Copyright (C)2009-2010 Nintendo Co., Ltd.  All rights reserved.
5  These coded instructions, statements, and computer programs contain
6  proprietary information of Nintendo of America Inc. and/or Nintendo
7  Company Ltd., and are protected by Federal copyright law. They may
8  not be disclosed to third parties or copied or duplicated in any form,
9  in whole or in part, without the prior written consent of Nintendo.
10  $Revision: 17995 $
11 *---------------------------------------------------------------------------
12
13
14*/
15
16#include <cmath>
17
18namespace nn {
19namespace math {
20
21/* ------------------------------------------------------------------------
22        VEC3
23   ------------------------------------------------------------------------ */
24
25/* Please see man pages for details
26
27
28*/
29
30/*
31
32
33
34
35
36*/
37NN_MATH_INLINE bool
38VEC3IsZero(const VEC3* p)
39{
40    return p->x == 0.f && p->y == 0.f && p->z == 0.f;
41}
42
43/*
44
45
46
47
48
49
50
51*/
52NN_MATH_INLINE VEC3*
53VEC3Maximize(VEC3* pOut, const VEC3* p1, const VEC3* p2)
54{
55    pOut->x = (p1->x > p2->x) ? p1->x : p2->x;
56    pOut->y = (p1->y > p2->y) ? p1->y : p2->y;
57    pOut->z = (p1->z > p2->z) ? p1->z : p2->z;
58
59    return pOut;
60}
61
62
63
64/*
65
66
67
68
69
70
71
72*/
73NN_MATH_INLINE VEC3*
74VEC3Minimize(VEC3* pOut, const VEC3* p1, const VEC3* p2)
75{
76    pOut->x = (p1->x < p2->x) ? p1->x : p2->x;
77    pOut->y = (p1->y < p2->y) ? p1->y : p2->y;
78    pOut->z = (p1->z < p2->z) ? p1->z : p2->z;
79
80    return pOut;
81}
82
83
84/*
85
86
87
88
89
90
91
92
93*/
94NN_MATH_INLINE VEC3*
95VEC3Cross(VEC3* pOut, const VEC3* p1, const VEC3* p2)
96{
97    NN_NULL_ASSERT(pOut);
98    NN_NULL_ASSERT(p1);
99    NN_NULL_ASSERT(p2);
100
101    VEC3 tmpVec;
102
103    tmpVec.x = ( p1->y * p2->z ) - ( p1->z * p2->y );
104    tmpVec.y = ( p1->z * p2->x ) - ( p1->x * p2->z );
105    tmpVec.z = ( p1->x * p2->y ) - ( p1->y * p2->x );
106
107    pOut->x = tmpVec.x;
108    pOut->y = tmpVec.y;
109    pOut->z = tmpVec.z;
110
111    return pOut;
112}
113
114
115/*
116
117
118
119
120
121
122
123
124*/
125NN_MATH_INLINE VEC3*
126VEC3SafeNormalize(VEC3* pOut, const VEC3* p, const VEC3& alt)
127{
128    NN_NULL_ASSERT(pOut);
129    NN_NULL_ASSERT(p);
130
131    register f32 x, y, z, mag;
132
133    x = p->x;
134    y = p->y;
135    z = p->z;
136
137    mag = (x * x) + (y * y) + (z * z);
138
139    if (mag == 0)
140    {
141        *pOut = alt;
142
143        return pOut;
144    }
145
146    mag = 1.0f / ::std::sqrtf(mag);
147
148    x *= mag;
149    y *= mag;
150    z *= mag;
151
152    pOut->x = x;
153    pOut->y = y;
154    pOut->z = z;
155
156    return pOut;
157}
158
159
160/*
161
162
163
164
165
166
167*/
168NN_MATH_INLINE f32
169VEC3SquareDist(const VEC3* p1, const VEC3* p2)
170{
171    NN_NULL_ASSERT( p1 );
172    NN_NULL_ASSERT( p2 );
173
174    VEC3 diff;
175
176    diff.x = p1->x - p2->x;
177    diff.y = p1->y - p2->y;
178    diff.z = p1->z - p2->z;
179
180    return (diff.x * diff.x) + (diff.y * diff.y) + (diff.z * diff.z);
181}
182
183/*
184
185*/
186
187}  // namespace math
188}  // namespace nn
189