PxVec3.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2008-2015, NVIDIA CORPORATION. All rights reserved.
3  *
4  * NVIDIA CORPORATION and its licensors retain all intellectual property
5  * and proprietary rights in and to this software, related documentation
6  * and any modifications thereto. Any use, reproduction, disclosure or
7  * distribution of this software and related documentation without an express
8  * license agreement from NVIDIA CORPORATION is strictly prohibited.
9  */
10 // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved.
11 // Copyright (c) 2001-2004 NovodeX AG. All rights reserved.
12 
13 
14 #ifndef PX_FOUNDATION_PX_VEC3_H
15 #define PX_FOUNDATION_PX_VEC3_H
16 
21 #include "foundation/PxMath.h"
22 
23 #ifndef PX_DOXYGEN
24 namespace physx
25 {
26 #endif
27 
28 
34 class PxVec3
35 {
36 public:
37 
42 
46  PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3(PxZERO r): x(0.0f), y(0.0f), z(0.0f)
47  {
48  PX_UNUSED(r);
49  }
50 
51 
59  explicit PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3(PxReal a): x(a), y(a), z(a) {}
60 
68  PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3(PxReal nx, PxReal ny, PxReal nz): x(nx), y(ny), z(nz) {}
69 
73  PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3(const PxVec3& v): x(v.x), y(v.y), z(v.z) {}
74 
75  //Operators
76 
80  PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3& operator=(const PxVec3& p) { x = p.x; y = p.y; z = p.z; return *this; }
81 
86  {
87  PX_ASSERT(index>=0 && index<=2);
88 
89  return reinterpret_cast<PxReal*>(this)[index];
90  }
91 
95  PX_CUDA_CALLABLE PX_FORCE_INLINE PxReal& operator[](unsigned int index)
96  {
97  PX_ASSERT(index<=2);
98 
99  return reinterpret_cast<PxReal*>(this)[index];
100  }
101 
105  PX_DEPRECATED PX_CUDA_CALLABLE PX_FORCE_INLINE const PxReal& operator[](int index) const
106  {
107  PX_ASSERT(index>=0 && index<=2);
108 
109  return reinterpret_cast<const PxReal*>(this)[index];
110  }
111 
115  PX_CUDA_CALLABLE PX_FORCE_INLINE const PxReal& operator[](unsigned int index) const
116  {
117  PX_ASSERT(index<=2);
118 
119  return reinterpret_cast<const PxReal*>(this)[index];
120  }
124  PX_CUDA_CALLABLE PX_FORCE_INLINE bool operator==(const PxVec3&v) const { return x == v.x && y == v.y && z == v.z; }
125 
129  PX_CUDA_CALLABLE PX_FORCE_INLINE bool operator!=(const PxVec3&v) const { return x != v.x || y != v.y || z != v.z; }
130 
134  PX_CUDA_CALLABLE PX_FORCE_INLINE bool isZero() const { return x==0.0f && y==0.0f && z == 0.0f; }
135 
139  PX_CUDA_CALLABLE PX_INLINE bool isFinite() const
140  {
141  return PxIsFinite(x) && PxIsFinite(y) && PxIsFinite(z);
142  }
143 
147  PX_CUDA_CALLABLE PX_FORCE_INLINE bool isNormalized() const
148  {
149  const float unitTolerance = 1e-4f;
150  return isFinite() && PxAbs(magnitude()-1)<unitTolerance;
151  }
152 
158  PX_CUDA_CALLABLE PX_FORCE_INLINE PxReal magnitudeSquared() const { return x * x + y * y + z * z; }
159 
163  PX_CUDA_CALLABLE PX_FORCE_INLINE PxReal magnitude() const { return PxSqrt(magnitudeSquared()); }
164 
169  {
170  return PxVec3(-x, -y, -z);
171  }
172 
176  PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3 operator +(const PxVec3& v) const { return PxVec3(x + v.x, y + v.y, z + v.z); }
177 
181  PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3 operator -(const PxVec3& v) const { return PxVec3(x - v.x, y - v.y, z - v.z); }
182 
186  PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3 operator *(PxReal f) const { return PxVec3(x * f, y * f, z * f); }
187 
192  {
193  f = 1.0f / f;
194  return PxVec3(x * f, y * f, z * f);
195  }
196 
201  {
202  x += v.x;
203  y += v.y;
204  z += v.z;
205  return *this;
206  }
207 
212  {
213  x -= v.x;
214  y -= v.y;
215  z -= v.z;
216  return *this;
217  }
218 
223  {
224  x *= f;
225  y *= f;
226  z *= f;
227  return *this;
228  }
233  {
234  f = 1.0f/f;
235  x *= f;
236  y *= f;
237  z *= f;
238  return *this;
239  }
240 
245  {
246  return x * v.x + y * v.y + z * v.z;
247  }
248 
253  {
254  return PxVec3(y * v.z - z * v.y,
255  z * v.x - x * v.z,
256  x * v.y - y * v.x);
257  }
258 
262  {
263  const PxReal m = magnitudeSquared();
264  return m>0.0f ? *this * PxRecipSqrt(m) : PxVec3(0,0,0);
265  }
266 
271  {
272  const PxReal m = magnitude();
273  if (m>0.0f)
274  *this /= m;
275  return m;
276  }
277 
283  {
284  const PxReal mag = magnitude();
285  if (mag < PX_NORMALIZATION_EPSILON)
286  return 0.0f;
287  *this *= 1.0f / mag;
288  return mag;
289  }
290 
296  {
297  const PxReal mag = magnitude();
299  *this *= 1.0f / mag;
300  return mag;
301  }
302 
307  {
308  return PxVec3(x*a.x, y*a.y, z*a.z);
309  }
310 
315  {
316  return PxVec3(PxMin(x, v.x), PxMin(y,v.y), PxMin(z,v.z));
317  }
318 
322  PX_CUDA_CALLABLE PX_FORCE_INLINE float minElement() const
323  {
324  return PxMin(x, PxMin(y, z));
325  }
326 
331  {
332  return PxVec3(PxMax(x, v.x), PxMax(y,v.y), PxMax(z,v.z));
333  }
334 
338  PX_CUDA_CALLABLE PX_FORCE_INLINE float maxElement() const
339  {
340  return PxMax(x, PxMax(y, z));
341  }
342 
347  {
348  return PxVec3(PxAbs(x), PxAbs(y), PxAbs(z));
349  }
350 
351 
352  PxReal x,y,z;
353 };
354 
356 {
357  return PxVec3(f * v.x, f * v.y, f * v.z);
358 }
359 
360 #ifndef PX_DOXYGEN
361 } // namespace physx
362 #endif
363 
365 #endif // PX_FOUNDATION_PX_VEC3_H


Copyright © 2008-2015 NVIDIA Corporation, 2701 San Tomas Expressway, Santa Clara, CA 95050 U.S.A. All rights reserved. www.nvidia.com