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_TRIANGLEMESH_GEOMETRY
32#define PX_PHYSICS_NX_TRIANGLEMESH_GEOMETRY
33/** \addtogroup geomutils
34@{
35*/
36#include "geometry/PxGeometry.h"
37#include "geometry/PxMeshScale.h"
38#include "common/PxCoreUtilityTypes.h"
39
40#if !PX_DOXYGEN
41namespace physx
42{
43#endif
44
45class PxTriangleMesh;
46
47
48/**
49\brief Flags controlling the simulated behavior of the triangle mesh geometry.
50
51Used in ::PxMeshGeometryFlags.
52*/
53struct PxMeshGeometryFlag
54{
55 enum Enum
56 {
57 eDOUBLE_SIDED = (1<<1) //!< Meshes with this flag set are treated as double-sided.
58 //!< This flag is currently only used for raycasts and sweeps (it is ignored for overlap queries).
59 //!< For detailed specifications of this flag for meshes and heightfields please refer to the Geometry Query section of the user guide.
60 };
61};
62
63/**
64\brief collection of set bits defined in PxMeshGeometryFlag.
65
66@see PxMeshGeometryFlag
67*/
68typedef PxFlags<PxMeshGeometryFlag::Enum,PxU8> PxMeshGeometryFlags;
69PX_FLAGS_OPERATORS(PxMeshGeometryFlag::Enum,PxU8)
70
71/**
72\brief Triangle mesh geometry class.
73
74This class unifies a mesh object with a scaling transform, and
75lets the combined object be used anywhere a PxGeometry is needed.
76
77The scaling is a transform along arbitrary axes contained in the scale object.
78The vertices of the mesh in geometry (or shape) space is the
79PxMeshScale::toMat33() transform, multiplied by the vertex space vertices
80in the PxConvexMesh object.
81*/
82class PxTriangleMeshGeometry : public PxGeometry
83{
84public:
85 /**
86 \brief Default constructor.
87
88 Creates an empty object with a NULL mesh and identity scale.
89 */
90 PX_INLINE PxTriangleMeshGeometry() :
91 PxGeometry (PxGeometryType::eTRIANGLEMESH),
92 triangleMesh(NULL)
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 PxTriangleMeshGeometry( PxTriangleMesh* mesh,
103 const PxMeshScale& scaling = PxMeshScale(),
104 PxMeshGeometryFlags flags = PxMeshGeometryFlags()) :
105 PxGeometry (PxGeometryType::eTRIANGLEMESH),
106 scale (scaling),
107 meshFlags (flags),
108 triangleMesh(mesh)
109 {}
110
111 /**
112 \brief Returns true if the geometry is valid.
113
114 \return True if the current settings are valid for shape creation.
115
116 \note A valid triangle mesh has a positive scale value in each direction (scale.scale.x > 0, scale.scale.y > 0, scale.scale.z > 0).
117 It is illegal to call PxRigidActor::createShape and PxPhysics::createShape with a triangle mesh that has zero extents in any direction.
118
119 @see PxRigidActor::createShape, PxPhysics::createShape
120 */
121 PX_INLINE bool isValid() const;
122
123public:
124 PxMeshScale scale; //!< The scaling transformation.
125 PxMeshGeometryFlags meshFlags; //!< Mesh flags.
126 PxPadding<3> paddingFromFlags; //!< padding for mesh flags
127 PxTriangleMesh* triangleMesh; //!< A reference to the mesh object.
128};
129
130
131PX_INLINE bool PxTriangleMeshGeometry::isValid() const
132{
133 if(mType != PxGeometryType::eTRIANGLEMESH)
134 return false;
135 if(!scale.scale.isFinite() || !scale.rotation.isUnit())
136 return false;
137 if(!scale.isValidForTriangleMesh())
138 return false;
139 if(!triangleMesh)
140 return false;
141
142 return true;
143}
144
145#if !PX_DOXYGEN
146} // namespace physx
147#endif
148
149/** @} */
150#endif
151

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