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_CONVEXMESH_GEOMETRY
32#define PX_PHYSICS_NX_CONVEXMESH_GEOMETRY
33/** \addtogroup geomutils
34@{
35*/
36#include "geometry/PxGeometry.h"
37#include "geometry/PxMeshScale.h"
38#include "common/PxCoreUtilityTypes.h"
39#include "geometry/PxConvexMesh.h"
40
41#if !PX_DOXYGEN
42namespace physx
43{
44#endif
45
46class PxConvexMesh;
47
48/**
49\brief Flags controlling the simulated behavior of the convex mesh geometry.
50
51Used in ::PxConvexMeshGeometryFlags.
52*/
53struct PxConvexMeshGeometryFlag
54{
55 enum Enum
56 {
57 eTIGHT_BOUNDS = (1<<0) //!< Use tighter (but more expensive to compute) bounds around the convex geometry.
58 };
59};
60
61/**
62\brief collection of set bits defined in PxConvexMeshGeometryFlag.
63
64@see PxConvexMeshGeometryFlag
65*/
66typedef PxFlags<PxConvexMeshGeometryFlag::Enum,PxU8> PxConvexMeshGeometryFlags;
67PX_FLAGS_OPERATORS(PxConvexMeshGeometryFlag::Enum,PxU8)
68
69/**
70\brief Convex mesh geometry class.
71
72This class unifies a convex mesh object with a scaling transform, and
73lets the combined object be used anywhere a PxGeometry is needed.
74
75The scaling is a transform along arbitrary axes contained in the scale object.
76The vertices of the mesh in geometry (or shape) space is the
77PxMeshScale::toMat33() transform, multiplied by the vertex space vertices
78in the PxConvexMesh object.
79*/
80class PxConvexMeshGeometry : public PxGeometry
81{
82public:
83 /**
84 \brief Default constructor.
85
86 Creates an empty object with a NULL mesh and identity scale.
87 */
88 PX_INLINE PxConvexMeshGeometry() :
89 PxGeometry (PxGeometryType::eCONVEXMESH),
90 scale (PxMeshScale(1.0f)),
91 convexMesh (NULL),
92 meshFlags (PxConvexMeshGeometryFlag::eTIGHT_BOUNDS)
93 {}
94
95 /**
96 \brief Constructor.
97 \param[in] mesh Mesh pointer. May be NULL, though this will not make the object valid for shape construction.
98 \param[in] scaling Scale factor.
99 \param[in] flags Mesh flags.
100 \
101 */
102 PX_INLINE PxConvexMeshGeometry( PxConvexMesh* mesh,
103 const PxMeshScale& scaling = PxMeshScale(),
104 PxConvexMeshGeometryFlags flags = PxConvexMeshGeometryFlag::eTIGHT_BOUNDS) :
105 PxGeometry (PxGeometryType::eCONVEXMESH),
106 scale (scaling),
107 convexMesh (mesh),
108 meshFlags (flags)
109 {
110 }
111
112 /**
113 \brief Returns true if the geometry is valid.
114
115 \return True if the current settings are valid for shape creation.
116
117 \note A valid convex mesh has a positive scale value in each direction (scale.x > 0, scale.y > 0, scale.z > 0).
118 It is illegal to call PxRigidActor::createShape and PxPhysics::createShape with a convex that has zero extent in any direction.
119
120 @see PxRigidActor::createShape, PxPhysics::createShape
121 */
122 PX_INLINE bool isValid() const;
123
124public:
125 PxMeshScale scale; //!< The scaling transformation (from vertex space to shape space).
126 PxConvexMesh* convexMesh; //!< A reference to the convex mesh object.
127 PxConvexMeshGeometryFlags meshFlags; //!< Mesh flags.
128 PxPadding<3> paddingFromFlags; //!< padding for mesh flags
129};
130
131
132PX_INLINE bool PxConvexMeshGeometry::isValid() const
133{
134 if(mType != PxGeometryType::eCONVEXMESH)
135 return false;
136 if(!scale.scale.isFinite() || !scale.rotation.isUnit())
137 return false;
138 if(!scale.isValidForConvexMesh())
139 return false;
140 if(!convexMesh)
141 return false;
142
143 return true;
144}
145
146#if !PX_DOXYGEN
147} // namespace physx
148#endif
149
150/** @} */
151#endif
152

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