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