RavEngine
Loading...
Searching...
No Matches
GuBV4_BoxOverlap_Internal.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_BV4_BOX_OVERLAP_INTERNAL_H
30#define GU_BV4_BOX_OVERLAP_INTERNAL_H
31
32#include "GuBV4_Common.h"
33
34 template<class ParamsT>
35 PX_FORCE_INLINE void precomputeData(ParamsT* PX_RESTRICT dst, PxMat33* PX_RESTRICT absRot, const PxMat33* PX_RESTRICT boxToModelR)
36 {
37 // Precompute absolute box-to-model rotation matrix
38 dst->mPreca0_PaddedAligned.x = boxToModelR->column0.x;
39 dst->mPreca0_PaddedAligned.y = boxToModelR->column1.y;
40 dst->mPreca0_PaddedAligned.z = boxToModelR->column2.z;
41
42 dst->mPreca1_PaddedAligned.x = boxToModelR->column0.y;
43 dst->mPreca1_PaddedAligned.y = boxToModelR->column1.z;
44 dst->mPreca1_PaddedAligned.z = boxToModelR->column2.x;
45
46 dst->mPreca2_PaddedAligned.x = boxToModelR->column0.z;
47 dst->mPreca2_PaddedAligned.y = boxToModelR->column1.x;
48 dst->mPreca2_PaddedAligned.z = boxToModelR->column2.y;
49
50 // Epsilon value prevents floating-point inaccuracies (strategy borrowed from RAPID)
51 const PxReal epsilon = 1e-6f;
52 absRot->column0.x = dst->mPreca0b_PaddedAligned.x = epsilon + fabsf(boxToModelR->column0.x);
53 absRot->column0.y = dst->mPreca1b_PaddedAligned.x = epsilon + fabsf(boxToModelR->column0.y);
54 absRot->column0.z = dst->mPreca2b_PaddedAligned.x = epsilon + fabsf(boxToModelR->column0.z);
55
56 absRot->column1.x = dst->mPreca2b_PaddedAligned.y = epsilon + fabsf(boxToModelR->column1.x);
57 absRot->column1.y = dst->mPreca0b_PaddedAligned.y = epsilon + fabsf(boxToModelR->column1.y);
58 absRot->column1.z = dst->mPreca1b_PaddedAligned.y = epsilon + fabsf(boxToModelR->column1.z);
59
60 absRot->column2.x = dst->mPreca1b_PaddedAligned.z = epsilon + fabsf(boxToModelR->column2.x);
61 absRot->column2.y = dst->mPreca2b_PaddedAligned.z = epsilon + fabsf(boxToModelR->column2.y);
62 absRot->column2.z = dst->mPreca0b_PaddedAligned.z = epsilon + fabsf(boxToModelR->column2.z);
63 }
64
65 template<class ParamsT>
66 PX_FORCE_INLINE void setupBoxData(ParamsT* PX_RESTRICT dst, const PxVec3& extents, const PxMat33* PX_RESTRICT mAR)
67 {
68 dst->mBoxExtents_PaddedAligned = extents;
69
70 const float Ex = extents.x;
71 const float Ey = extents.y;
72 const float Ez = extents.z;
73 dst->mBB_PaddedAligned.x = Ex*mAR->column0.x + Ey*mAR->column1.x + Ez*mAR->column2.x;
74 dst->mBB_PaddedAligned.y = Ex*mAR->column0.y + Ey*mAR->column1.y + Ez*mAR->column2.y;
75 dst->mBB_PaddedAligned.z = Ex*mAR->column0.z + Ey*mAR->column1.z + Ez*mAR->column2.z;
76 }
77
78 struct OBBTestParams // Data needed to perform the OBB-OBB overlap test
79 {
80 BV4_ALIGN16(PxVec3p mCenterOrMinCoeff_PaddedAligned);
81 BV4_ALIGN16(PxVec3p mExtentsOrMaxCoeff_PaddedAligned);
82 BV4_ALIGN16(PxVec3p mTBoxToModel_PaddedAligned);
83 BV4_ALIGN16(PxVec3p mBB_PaddedAligned);
84 BV4_ALIGN16(PxVec3p mBoxExtents_PaddedAligned);
85
86 BV4_ALIGN16(PxVec3p mPreca0_PaddedAligned);
87 BV4_ALIGN16(PxVec3p mPreca1_PaddedAligned);
88 BV4_ALIGN16(PxVec3p mPreca2_PaddedAligned);
89 BV4_ALIGN16(PxVec3p mPreca0b_PaddedAligned);
90 BV4_ALIGN16(PxVec3p mPreca1b_PaddedAligned);
91 BV4_ALIGN16(PxVec3p mPreca2b_PaddedAligned);
92
93 PX_FORCE_INLINE void precomputeBoxData(const PxVec3& extents, const PxMat33* PX_RESTRICT box_to_model)
94 {
95 PxMat33 absRot;
96 precomputeData(this, &absRot, box_to_model);
97
98 setupBoxData(this, extents, &absRot);
99 }
100 };
101
102#endif // GU_BV4_BOX_OVERLAP_INTERNAL_H
GLM_FUNC_DECL GLM_CONSTEXPR genType epsilon()
Return the epsilon constant for floating point types.
Definition scalar_constants.inl:6
#define PX_RESTRICT
Definition PxPreprocessor.h:355
#define PX_FORCE_INLINE
Definition PxPreprocessor.h:335
Definition GuBV4_BoxOverlap_Internal.h:79
BV4_ALIGN16(PxVec3p mTBoxToModel_PaddedAligned)
Translation from obb space to model space.
PX_FORCE_INLINE void precomputeBoxData(const PxVec3 &extents, const PxMat33 *PX_RESTRICT box_to_model)
Definition GuBV4_BoxOverlap_Internal.h:93