1//
2// Redistribution and use in source and binary forms, with or without
3// modification, are permitted provided that the following conditions
4// are met:
5// * Redistributions of source code must retain the above copyright
6// notice, this list of conditions and the following disclaimer.
7// * Redistributions in binary form must reproduce the above copyright
8// notice, this list of conditions and the following disclaimer in the
9// documentation and/or other materials provided with the distribution.
10// * Neither the name of NVIDIA CORPORATION nor the names of its
11// contributors may be used to endorse or promote products derived
12// from this software without specific prior written permission.
13//
14// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
15// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
18// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25//
26// Copyright (c) 2008-2021 NVIDIA Corporation. All rights reserved.
27// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved.
28// Copyright (c) 2001-2004 NovodeX AG. All rights reserved.
29
30#include "extensions/PxSceneQueryExt.h"
31
32using namespace physx;
33
34bool PxSceneQueryExt::raycastAny( const PxScene& scene,
35 const PxVec3& origin, const PxVec3& unitDir, const PxReal distance,
36 PxSceneQueryHit& hit, const PxSceneQueryFilterData& filterData,
37 PxSceneQueryFilterCallback* filterCall, const PxSceneQueryCache* cache)
38{
39 PxSceneQueryFilterData fdAny = filterData;
40 fdAny.flags |= PxQueryFlag::eANY_HIT;
41 PxRaycastBuffer buf;
42 scene.raycast(origin, unitDir, distance, hitCall&: buf, hitFlags: PxHitFlag::eMESH_ANY, filterData: fdAny, filterCall, cache);
43 hit = buf.block;
44 return buf.hasBlock;
45}
46
47bool PxSceneQueryExt::raycastSingle(const PxScene& scene,
48 const PxVec3& origin, const PxVec3& unitDir, const PxReal distance,
49 PxSceneQueryFlags outputFlags, PxRaycastHit& hit,
50 const PxSceneQueryFilterData& filterData,
51 PxSceneQueryFilterCallback* filterCall, const PxSceneQueryCache* cache)
52{
53 PxRaycastBuffer buf;
54 PxQueryFilterData fd1 = filterData;
55 scene.raycast(origin, unitDir, distance, hitCall&: buf, hitFlags: outputFlags, filterData: fd1, filterCall, cache);
56 hit = buf.block;
57 return buf.hasBlock;
58}
59
60PxI32 PxSceneQueryExt::raycastMultiple( const PxScene& scene,
61 const PxVec3& origin, const PxVec3& unitDir, const PxReal distance,
62 PxSceneQueryFlags outputFlags,
63 PxRaycastHit* hitBuffer, PxU32 hitBufferSize, bool& blockingHit,
64 const PxSceneQueryFilterData& filterData,
65 PxSceneQueryFilterCallback* filterCall, const PxSceneQueryCache* cache)
66{
67 PxRaycastBuffer buf(hitBuffer, hitBufferSize);
68 PxQueryFilterData fd1 = filterData;
69 scene.raycast(origin, unitDir, distance, hitCall&: buf, hitFlags: outputFlags, filterData: fd1, filterCall, cache);
70 blockingHit = buf.hasBlock;
71 if(blockingHit)
72 {
73 if(buf.nbTouches < hitBufferSize)
74 {
75 hitBuffer[buf.nbTouches] = buf.block;
76 return PxI32(buf.nbTouches+1);
77 }
78 else // overflow, drop the last touch
79 {
80 hitBuffer[hitBufferSize-1] = buf.block;
81 return -1;
82 }
83 } else
84 // no block
85 return PxI32(buf.nbTouches);
86}
87
88bool PxSceneQueryExt::sweepAny( const PxScene& scene,
89 const PxGeometry& geometry, const PxTransform& pose, const PxVec3& unitDir, const PxReal distance,
90 PxSceneQueryFlags queryFlags,
91 PxSceneQueryHit& hit,
92 const PxSceneQueryFilterData& filterData,
93 PxSceneQueryFilterCallback* filterCall,
94 const PxSceneQueryCache* cache,
95 PxReal inflation)
96{
97 PxSceneQueryFilterData fdAny = filterData;
98 fdAny.flags |= PxQueryFlag::eANY_HIT;
99 PxSweepBuffer buf;
100 scene.sweep(geometry, pose, unitDir, distance, hitCall&: buf, hitFlags: queryFlags, filterData: fdAny, filterCall, cache, inflation);
101 hit = buf.block;
102 return buf.hasBlock;
103}
104
105bool PxSceneQueryExt::sweepSingle( const PxScene& scene,
106 const PxGeometry& geometry, const PxTransform& pose, const PxVec3& unitDir, const PxReal distance,
107 PxSceneQueryFlags outputFlags,
108 PxSweepHit& hit,
109 const PxSceneQueryFilterData& filterData,
110 PxSceneQueryFilterCallback* filterCall,
111 const PxSceneQueryCache* cache,
112 PxReal inflation)
113{
114 PxSweepBuffer buf;
115 PxQueryFilterData fd1 = filterData;
116 scene.sweep(geometry, pose, unitDir, distance, hitCall&: buf, hitFlags: outputFlags, filterData: fd1, filterCall, cache, inflation);
117 hit = buf.block;
118 return buf.hasBlock;
119}
120
121PxI32 PxSceneQueryExt::sweepMultiple( const PxScene& scene,
122 const PxGeometry& geometry, const PxTransform& pose, const PxVec3& unitDir, const PxReal distance,
123 PxSceneQueryFlags outputFlags, PxSweepHit* hitBuffer, PxU32 hitBufferSize, bool& blockingHit,
124 const PxSceneQueryFilterData& filterData,
125 PxSceneQueryFilterCallback* filterCall, const PxSceneQueryCache* cache,
126 PxReal inflation)
127{
128 PxQueryFilterData fd1 = filterData;
129 PxSweepBuffer buf(hitBuffer, hitBufferSize);
130 scene.sweep(geometry, pose, unitDir, distance, hitCall&: buf, hitFlags: outputFlags, filterData: fd1, filterCall, cache, inflation);
131 blockingHit = buf.hasBlock;
132 if(blockingHit)
133 {
134 if(buf.nbTouches < hitBufferSize)
135 {
136 hitBuffer[buf.nbTouches] = buf.block;
137 return PxI32(buf.nbTouches+1);
138 }
139 else // overflow, drop the last touch
140 {
141 hitBuffer[hitBufferSize-1] = buf.block;
142 return -1;
143 }
144 } else
145 // no block
146 return PxI32(buf.nbTouches);
147}
148
149PxI32 PxSceneQueryExt::overlapMultiple( const PxScene& scene,
150 const PxGeometry& geometry, const PxTransform& pose,
151 PxOverlapHit* hitBuffer, PxU32 hitBufferSize,
152 const PxSceneQueryFilterData& filterData,
153 PxSceneQueryFilterCallback* filterCall)
154{
155 PxQueryFilterData fd1 = filterData;
156 fd1.flags |= PxQueryFlag::eNO_BLOCK;
157 PxOverlapBuffer buf(hitBuffer, hitBufferSize);
158 scene.overlap(geometry, pose, hitCall&: buf, filterData: fd1, filterCall);
159 if(buf.hasBlock)
160 {
161 if(buf.nbTouches < hitBufferSize)
162 {
163 hitBuffer[buf.nbTouches] = buf.block;
164 return PxI32(buf.nbTouches+1);
165 }
166 else // overflow, drop the last touch
167 {
168 hitBuffer[hitBufferSize-1] = buf.block;
169 return -1;
170 }
171 } else
172 // no block
173 return PxI32(buf.nbTouches);
174}
175
176bool PxSceneQueryExt::overlapAny( const PxScene& scene,
177 const PxGeometry& geometry, const PxTransform& pose,
178 PxOverlapHit& hit,
179 const PxSceneQueryFilterData& filterData,
180 PxSceneQueryFilterCallback* filterCall)
181{
182 PxSceneQueryFilterData fdAny = filterData;
183 fdAny.flags |= (PxQueryFlag::eANY_HIT | PxQueryFlag::eNO_BLOCK);
184 PxOverlapBuffer buf;
185 scene.overlap(geometry, pose, hitCall&: buf, filterData: fdAny, filterCall);
186 hit = buf.block;
187 return buf.hasBlock;
188}
189

source code of qtquick3dphysics/src/3rdparty/PhysX/source/physxextensions/src/ExtSceneQueryExt.cpp