aboutsummaryrefslogtreecommitdiff
path: root/PhysX_3.4/Source/GeomUtils/src/GuInternal.cpp
diff options
context:
space:
mode:
authorgit perforce import user <a@b>2016-10-25 12:29:14 -0600
committerSheikh Dawood Abdul Ajees <Sheikh Dawood Abdul Ajees>2016-10-25 18:56:37 -0500
commit3dfe2108cfab31ba3ee5527e217d0d8e99a51162 (patch)
treefa6485c169e50d7415a651bf838f5bcd0fd3bfbd /PhysX_3.4/Source/GeomUtils/src/GuInternal.cpp
downloadphysx-3.4-3dfe2108cfab31ba3ee5527e217d0d8e99a51162.tar.xz
physx-3.4-3dfe2108cfab31ba3ee5527e217d0d8e99a51162.zip
Initial commit:
PhysX 3.4.0 Update @ 21294896 APEX 1.4.0 Update @ 21275617 [CL 21300167]
Diffstat (limited to 'PhysX_3.4/Source/GeomUtils/src/GuInternal.cpp')
-rw-r--r--PhysX_3.4/Source/GeomUtils/src/GuInternal.cpp159
1 files changed, 159 insertions, 0 deletions
diff --git a/PhysX_3.4/Source/GeomUtils/src/GuInternal.cpp b/PhysX_3.4/Source/GeomUtils/src/GuInternal.cpp
new file mode 100644
index 00000000..4e5e25a3
--- /dev/null
+++ b/PhysX_3.4/Source/GeomUtils/src/GuInternal.cpp
@@ -0,0 +1,159 @@
+// This code contains NVIDIA Confidential Information and is disclosed to you
+// under a form of NVIDIA software license agreement provided separately to you.
+//
+// Notice
+// NVIDIA Corporation and its licensors retain all intellectual property and
+// proprietary rights in and to this software and related documentation and
+// any modifications thereto. Any use, reproduction, disclosure, or
+// distribution of this software and related documentation without an express
+// license agreement from NVIDIA Corporation is strictly prohibited.
+//
+// ALL NVIDIA DESIGN SPECIFICATIONS, CODE ARE PROVIDED "AS IS.". NVIDIA MAKES
+// NO WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO
+// THE MATERIALS, AND EXPRESSLY DISCLAIMS ALL IMPLIED WARRANTIES OF NONINFRINGEMENT,
+// MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// Information and code furnished is believed to be accurate and reliable.
+// However, NVIDIA Corporation assumes no responsibility for the consequences of use of such
+// information or for any infringement of patents or other rights of third parties that may
+// result from its use. No license is granted by implication or otherwise under any patent
+// or patent rights of NVIDIA Corporation. Details are subject to change without notice.
+// This code supersedes and replaces all information previously supplied.
+// NVIDIA Corporation products are not authorized for use as critical
+// components in life support devices or systems without express written approval of
+// NVIDIA Corporation.
+//
+// Copyright (c) 2008-2016 NVIDIA Corporation. All rights reserved.
+// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved.
+// Copyright (c) 2001-2004 NovodeX AG. All rights reserved.
+
+
+#include "foundation/PxBounds3.h"
+#include "PsIntrinsics.h"
+#include "GuInternal.h"
+#include "GuBox.h"
+#include "GuVecPlane.h"
+#include "PsMathUtils.h"
+#include "PxCapsuleGeometry.h"
+#include "PsVecMath.h"
+using namespace physx::shdfnd::aos;
+
+using namespace physx;
+
+/**
+Computes the aabb points.
+\param pts [out] 8 box points
+*/
+void Gu::computeBoxPoints(const PxBounds3& bounds, PxVec3* PX_RESTRICT pts)
+{
+ PX_ASSERT(pts);
+
+ // Get box corners
+ const PxVec3& minimum = bounds.minimum;
+ const PxVec3& maximum = bounds.maximum;
+
+ // 7+------+6 0 = ---
+ // /| /| 1 = +--
+ // / | / | 2 = ++-
+ // / 4+---/--+5 3 = -+-
+ // 3+------+2 / y z 4 = --+
+ // | / | / | / 5 = +-+
+ // |/ |/ |/ 6 = +++
+ // 0+------+1 *---x 7 = -++
+
+ // Generate 8 corners of the bbox
+ pts[0] = PxVec3(minimum.x, minimum.y, minimum.z);
+ pts[1] = PxVec3(maximum.x, minimum.y, minimum.z);
+ pts[2] = PxVec3(maximum.x, maximum.y, minimum.z);
+ pts[3] = PxVec3(minimum.x, maximum.y, minimum.z);
+ pts[4] = PxVec3(minimum.x, minimum.y, maximum.z);
+ pts[5] = PxVec3(maximum.x, minimum.y, maximum.z);
+ pts[6] = PxVec3(maximum.x, maximum.y, maximum.z);
+ pts[7] = PxVec3(minimum.x, maximum.y, maximum.z);
+}
+
+PxPlane Gu::getPlane(const PxTransform& pose)
+{
+ const PxVec3 n = pose.q.getBasisVector0();
+ return PxPlane(n, -pose.p.dot(n));
+}
+
+void Gu::computeBoundsAroundVertices(PxBounds3& bounds, PxU32 nbVerts, const PxVec3* PX_RESTRICT verts)
+{
+ // PT: we can safely V4LoadU the first N-1 vertices. We must V3LoadU the last vertex, to make sure we don't read
+ // invalid memory. Since we have to special-case that last vertex anyway, we reuse that code to also initialize
+ // the minV/maxV values (bypassing the need for a 'setEmpty()' initialization).
+
+ if(!nbVerts)
+ {
+ bounds.setEmpty();
+ return;
+ }
+
+ PxU32 nbSafe = nbVerts-1;
+
+ // PT: read last (unsafe) vertex using V3LoadU, initialize minV/maxV
+ const Vec4V lastVertexV = Vec4V_From_Vec3V(V3LoadU(&verts[nbSafe].x));
+ Vec4V minV = lastVertexV;
+ Vec4V maxV = lastVertexV;
+
+ // PT: read N-1 first (safe) vertices using V4LoadU
+ while(nbSafe--)
+ {
+ const Vec4V vertexV = V4LoadU(&verts->x);
+ verts++;
+
+ minV = V4Min(minV, vertexV);
+ maxV = V4Max(maxV, vertexV);
+ }
+
+ StoreBounds(bounds, minV, maxV);
+}
+
+void Gu::computeSweptBox(Gu::Box& dest, const PxVec3& extents, const PxVec3& center, const PxMat33& rot, const PxVec3& unitDir, const PxReal distance)
+{
+ PxVec3 R1, R2;
+ Ps::computeBasis(unitDir, R1, R2);
+
+ PxReal dd[3];
+ dd[0] = PxAbs(rot.column0.dot(unitDir));
+ dd[1] = PxAbs(rot.column1.dot(unitDir));
+ dd[2] = PxAbs(rot.column2.dot(unitDir));
+ PxReal dmax = dd[0];
+ PxU32 ax0=1;
+ PxU32 ax1=2;
+ if(dd[1]>dmax)
+ {
+ dmax=dd[1];
+ ax0=0;
+ ax1=2;
+ }
+ if(dd[2]>dmax)
+ {
+ dmax=dd[2];
+ ax0=0;
+ ax1=1;
+ }
+ if(dd[ax1]<dd[ax0])
+ Ps::swap(ax0, ax1);
+
+ R1 = rot[ax0];
+ R1 -= (R1.dot(unitDir))*unitDir; // Project to plane whose normal is dir
+ R1.normalize();
+ R2 = unitDir.cross(R1);
+
+ dest.setAxes(unitDir, R1, R2);
+
+ PxReal offset[3];
+ offset[0] = distance;
+ offset[1] = distance*(unitDir.dot(R1));
+ offset[2] = distance*(unitDir.dot(R2));
+
+ for(PxU32 r=0; r<3; r++)
+ {
+ const PxVec3& R = dest.rot[r];
+ dest.extents[r] = offset[r]*0.5f + PxAbs(rot.column0.dot(R))*extents.x + PxAbs(rot.column1.dot(R))*extents.y + PxAbs(rot.column2.dot(R))*extents.z;
+ }
+
+ dest.center = center + unitDir*distance*0.5f;
+}