RavEngine
Loading...
Searching...
No Matches
GuDistancePointTetrahedron.h
1// Redistribution and use in source and binary forms, with or without
2// modification, are permitted provided that the following conditions
3// are met:
4// * Redistributions of source code must retain the above copyright
5// notice, this list of conditions and the following disclaimer.
6// * Redistributions in binary form must reproduce the above copyright
7// notice, this list of conditions and the following disclaimer in the
8// documentation and/or other materials provided with the distribution.
9// * Neither the name of NVIDIA CORPORATION nor the names of its
10// contributors may be used to endorse or promote products derived
11// from this software without specific prior written permission.
12//
13// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
14// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
17// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24//
25// Copyright (c) 2008-2022 NVIDIA Corporation. All rights reserved.
26// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved.
27// Copyright (c) 2001-2004 NovodeX AG. All rights reserved.
28
29#ifndef GU_DISTANCE_POINT_TETRAHEDRON_H
30#define GU_DISTANCE_POINT_TETRAHEDRON_H
31
32#include "foundation/PxVec3.h"
33#include "foundation/PxVec4.h"
34#include "GuDistancePointTriangle.h"
35#include "common/PxPhysXCommonConfig.h"
36
37namespace physx
38{
39 namespace Gu
40 {
41 PX_PHYSX_COMMON_API PxVec4 PointOutsideOfPlane4(const PxVec3& p, const PxVec3& _a, const PxVec3& _b,
42 const PxVec3& _c, const PxVec3& _d);
43
44 PX_PHYSX_COMMON_API PxVec3 closestPtPointTetrahedron(const PxVec3& p, const PxVec3& a, const PxVec3& b, const PxVec3& c, const PxVec3& d, const PxVec4& result);
45
46 PX_INLINE PX_CUDA_CALLABLE PxVec3 closestPtPointTetrahedron(const PxVec3& p, const PxVec3& a, const PxVec3& b, const PxVec3& c, const PxVec3& d)
47 {
48 const PxVec3 ab = b - a;
49 const PxVec3 ac = c - a;
50 const PxVec3 ad = d - a;
51 const PxVec3 bc = c - b;
52 const PxVec3 bd = d - b;
53
54 //point to face 0, 1, 2
55 PxVec3 bestClosestPt = closestPtPointTriangle2(p, a, b, c, ab, ac);
56 PxReal bestSqDist = bestClosestPt.dot(bestClosestPt);
57
58 // 0, 2, 3
59 PxVec3 closestPt = closestPtPointTriangle2(p, a, c, d, ac, ad);
60 PxReal sqDist = closestPt.dot(closestPt);
61 if (sqDist < bestSqDist)
62 {
63 bestClosestPt = closestPt;
64 bestSqDist = sqDist;
65 }
66
67 // 0, 3, 1
68 closestPt = closestPtPointTriangle2(p, a, d, b, ad, ab);
69 sqDist = closestPt.dot(closestPt);
70 if (sqDist < bestSqDist)
71 {
72 bestClosestPt = closestPt;
73 bestSqDist = sqDist;
74 }
75
76 // 1, 3, 2
77 closestPt = closestPtPointTriangle2(p, b, d, c, bd, bc);
78 sqDist = closestPt.dot(closestPt);
79 if (sqDist < bestSqDist)
80 {
81 bestClosestPt = closestPt;
82 bestSqDist = sqDist;
83 }
84
85 return bestClosestPt;
86 }
87
88 }
89}
90
91#endif
92
#define PX_INLINE
Definition PxPreprocessor.h:320
Sorts an array of objects in ascending order, assuming that the predicate implements the < operator:
Definition PxBoxController.h:39