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
31#ifndef PX_PHYSICS_NX_HEIGHTFIELD_GEOMETRY
32#define PX_PHYSICS_NX_HEIGHTFIELD_GEOMETRY
33/** \addtogroup geomutils
34@{
35*/
36#include "geometry/PxTriangleMeshGeometry.h"
37#include "common/PxCoreUtilityTypes.h"
38
39#if !PX_DOXYGEN
40namespace physx
41{
42#endif
43
44#define PX_MIN_HEIGHTFIELD_XZ_SCALE 1e-8f
45#define PX_MIN_HEIGHTFIELD_Y_SCALE (0.0001f / PxReal(0xFFFF))
46
47class PxHeightField;
48
49/**
50\brief Height field geometry class.
51
52This class allows to create a scaled height field geometry instance.
53
54There is a minimum allowed value for Y and XZ scaling - PX_MIN_HEIGHTFIELD_XZ_SCALE, heightfield creation will fail if XZ value is below this value.
55*/
56class PxHeightFieldGeometry : public PxGeometry
57{
58public:
59 PX_INLINE PxHeightFieldGeometry() :
60 PxGeometry (PxGeometryType::eHEIGHTFIELD),
61 heightField (NULL),
62 heightScale (1.0f),
63 rowScale (1.0f),
64 columnScale (1.0f),
65 heightFieldFlags(0)
66 {}
67
68 PX_INLINE PxHeightFieldGeometry(PxHeightField* hf,
69 PxMeshGeometryFlags flags,
70 PxReal heightScale_,
71 PxReal rowScale_,
72 PxReal columnScale_) :
73 PxGeometry (PxGeometryType::eHEIGHTFIELD),
74 heightField (hf) ,
75 heightScale (heightScale_),
76 rowScale (rowScale_),
77 columnScale (columnScale_),
78 heightFieldFlags (flags)
79 {
80 }
81
82 /**
83 \brief Returns true if the geometry is valid.
84
85 \return True if the current settings are valid
86
87 \note A valid height field has a positive scale value in each direction (heightScale > 0, rowScale > 0, columnScale > 0).
88 It is illegal to call PxRigidActor::createShape and PxPhysics::createShape with a height field that has zero extents in any direction.
89
90 @see PxRigidActor::createShape, PxPhysics::createShape
91 */
92 PX_INLINE bool isValid() const;
93
94public:
95 /**
96 \brief The height field data.
97 */
98 PxHeightField* heightField;
99
100 /**
101 \brief The scaling factor for the height field in vertical direction (y direction in local space).
102 */
103 PxReal heightScale;
104
105 /**
106 \brief The scaling factor for the height field in the row direction (x direction in local space).
107 */
108 PxReal rowScale;
109
110 /**
111 \brief The scaling factor for the height field in the column direction (z direction in local space).
112 */
113 PxReal columnScale;
114
115 /**
116 \brief Flags to specify some collision properties for the height field.
117 */
118 PxMeshGeometryFlags heightFieldFlags;
119
120 PxPadding<3> paddingFromFlags; //!< padding for mesh flags.
121};
122
123
124PX_INLINE bool PxHeightFieldGeometry::isValid() const
125{
126 if (mType != PxGeometryType::eHEIGHTFIELD)
127 return false;
128 if (!PxIsFinite(f: heightScale) || !PxIsFinite(f: rowScale) || !PxIsFinite(f: columnScale))
129 return false;
130 if (rowScale < PX_MIN_HEIGHTFIELD_XZ_SCALE || columnScale < PX_MIN_HEIGHTFIELD_XZ_SCALE || heightScale < PX_MIN_HEIGHTFIELD_Y_SCALE)
131 return false;
132 if (!heightField)
133 return false;
134
135 return true;
136}
137
138#if !PX_DOXYGEN
139} // namespace physx
140#endif
141
142/** @} */
143#endif
144

source code of qtquick3dphysics/src/3rdparty/PhysX/include/geometry/PxHeightFieldGeometry.h