diff options
| author | git perforce import user <a@b> | 2016-10-25 12:29:14 -0600 |
|---|---|---|
| committer | Sheikh Dawood Abdul Ajees <Sheikh Dawood Abdul Ajees> | 2016-10-25 18:56:37 -0500 |
| commit | 3dfe2108cfab31ba3ee5527e217d0d8e99a51162 (patch) | |
| tree | fa6485c169e50d7415a651bf838f5bcd0fd3bfbd /PhysX_3.4/Source/GeomUtils/src/GuInternal.cpp | |
| download | physx-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.cpp | 159 |
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; +} |