Revision control

++ // Copyright (c) 2001-2004 NovodeX AG. All rights reserved.
++ // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved.
++ // SPDX-FileCopyrightText: Copyright (c) 2008-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
++ // SPDX-License-Identifier: Apache-2.0
++
++ #ifndef PX_TRIANGLE_MESH_GEOMETRY_H
++ #define PX_TRIANGLE_MESH_GEOMETRY_H
++
++ #include "geometry/PxGeometry.h"
++ #include "geometry/PxMeshScale.h"
++ #include "common/PxCoreUtilityTypes.h"
++
++ #if !PX_DOXYGEN
++ namespace physx
++ {
++ #endif
++
++ class PxTriangleMesh;
++
++ /**
++ \brief Flags controlling the simulated behavior of the triangle mesh geometry.
++
++ Used in ::PxMeshGeometryFlags.
++ */
++ struct PxMeshGeometryFlag
++ {
++ enum Enum
++ {
++ eTIGHT_BOUNDS = (1<<0), //!< Use tighter (but more expensive to compute) bounds around the triangle mesh geometry.
++ eDOUBLE_SIDED = (1<<1) //!< Meshes with this flag set are treated as double-sided.
++ //!< This flag is currently only used for raycasts and sweeps. It is ignored for overlap queries and has no effect on contact generation, i.e. simulation.
++ //!< For detailed specifications of this flag for meshes and heightfields please refer to the Geometry Query section of the user guide.
++ //!< For double-sided collision meshes, consider duplicating their faces with flipped normals.
++ };
++ };
++
++ /**
++ \brief collection of set bits defined in PxMeshGeometryFlag.
++
++ \see PxMeshGeometryFlag
++ */
++ typedef PxFlags<PxMeshGeometryFlag::Enum,PxU8> PxMeshGeometryFlags;
++ PX_FLAGS_OPERATORS(PxMeshGeometryFlag::Enum,PxU8)
++
++ /**
++ \brief Triangle mesh geometry class.
++
++ This class unifies a mesh object with a scaling transform, and
++ lets the combined object be used anywhere a PxGeometry is needed.
++
++ The scaling is a transform along arbitrary axes contained in the scale object.
++ The vertices of the mesh in geometry (or shape) space is the
++ PxMeshScale::toMat33() transform, multiplied by the vertex space vertices
++ in the PxTriangleMeshGeometry object.
++ */
++ class PxTriangleMeshGeometry : public PxGeometry
++ {
++ public:
++ /**
++ \brief Constructor. By default creates an empty object with a NULL mesh and identity scale.
++
++ \param[in] mesh Mesh pointer. May be NULL, though this will not make the object valid for shape construction.
++ \param[in] scaling Scale factor.
++ \param[in] flags Mesh flags.
++ */
++ PX_INLINE PxTriangleMeshGeometry( PxTriangleMesh* mesh = NULL,
++ const PxMeshScale& scaling = PxMeshScale(),
++ PxMeshGeometryFlags flags = PxMeshGeometryFlags()) :
++ PxGeometry (PxGeometryType::eTRIANGLEMESH),
++ scale (scaling),
++ meshFlags (flags),
++ triangleMesh(mesh)
++ {}
++
++ /**
++ \brief Copy constructor.
++
++ \param[in] that Other object
++ */
++ PX_INLINE PxTriangleMeshGeometry(const PxTriangleMeshGeometry& that) :
++ PxGeometry (that),
++ scale (that.scale),
++ meshFlags (that.meshFlags),
++ triangleMesh(that.triangleMesh)
++ {}
++
++ /**
++ \brief Assignment operator
++ */
++ PX_INLINE void operator=(const PxTriangleMeshGeometry& that)
++ {
++ mType = that.mType;
++ scale = that.scale;
++ meshFlags = that.meshFlags;
++ triangleMesh = that.triangleMesh;
++ }
++
++ /**
++ \brief Returns true if the geometry is valid.
++
++ \return True if the current settings are valid for shape creation.
++
++ \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).
++ It is illegal to call PxPhysics::createShape with a triangle mesh that has zero extents in any direction.
++
++ \see PxPhysics::createShape
++ */
++ PX_INLINE bool isValid() const;
++
++ public:
++ PxMeshScale scale; //!< The scaling transformation.
++ PxMeshGeometryFlags meshFlags; //!< Mesh flags.
++ PxPadding<3> paddingFromFlags; //!< padding for mesh flags
++ PxTriangleMesh* triangleMesh; //!< A reference to the mesh object.
++ };
++
++ PX_INLINE bool PxTriangleMeshGeometry::isValid() const
++ {
++ if(mType != PxGeometryType::eTRIANGLEMESH)
++ return false;
++ if(!scale.scale.isFinite() || !scale.rotation.isUnit())
++ return false;
++ if(!scale.isValidForTriangleMesh())
++ return false;
++ if(!triangleMesh)
++ return false;
++
++ return true;
++ }
++
++ #if !PX_DOXYGEN
++ } // namespace physx
++ #endif
++
++ #endif