Revision control
Copy as Markdown
// 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 GU_MESH_DEPENETRATION_H
#define GU_MESH_DEPENETRATION_H
#include "common/PxPhysXCommonConfig.h"
#include "geometry/PxGeometryHit.h"
#include "geometry/PxTriangleMesh.h"
namespace physx
{
class PxTriangleMeshGeometry;
class PxMeshScale;
namespace Gu
{
/**
Depenetrates two triangle meshes in a given direction (reference code).
This is a slow experimental iterative algorithm.
\param meshGeom0 [in] geom for 1st mesh
\param meshGeom1 [in] geom for 2nd mesh
\param pose0 [in] pose for 1st mesh
\param pose1 [in] pose for 2nd mesh
\param dir [in] depenetration direction
\param maxIter [in] max number of iterations allowed
\param nbIter [out] number of iterations used
\return Displacement vector
*/
PX_PHYSX_COMMON_API PxVec3 depenetrateMeshesRef(const PxTriangleMeshGeometry& meshGeom0, const PxTriangleMeshGeometry& meshGeom1, const PxTransform& pose0, const PxTransform& pose1, const PxVec3& dir, PxU32 maxIter = 10000, PxU32* nbIter = NULL);
/**
Depenetrates two triangle meshes in a given direction.
This is a faster experimental iterative algorithm.
\param meshGeom0 [in] geom for 1st mesh
\param meshGeom1 [in] geom for 2nd mesh
\param pose0 [in] pose for 1st mesh
\param pose1 [in] pose for 2nd mesh
\param dir [in] depenetration direction
\param maxIter [in] max number of iterations allowed
\param nbIter [out] number of iterations used
\return Displacement vector
*/
PX_PHYSX_COMMON_API PxVec3 depenetrateMeshes(const PxTriangleMeshGeometry& meshGeom0, const PxTriangleMeshGeometry& meshGeom1, const PxTransform& pose0, const PxTransform& pose1, const PxVec3& dir, PxU32 maxIter = 10000, PxU32* nbIter = NULL);
//////////////////////////////////////////////////////////////////////////////
// Use this version to avoid virtual calls
PX_FORCE_INLINE void getVertexReferences(PxU32& vref0, PxU32& vref1, PxU32& vref2, PxU32 triIndex, const void* triangles, PxU32 has16BitIndices)
{
if(has16BitIndices)
{
const PxU16* triangles16 = reinterpret_cast<const PxU16*>(triangles);
vref0 = triangles16[triIndex*3+0];
vref1 = triangles16[triIndex*3+1];
vref2 = triangles16[triIndex*3+2];
}
else
{
const PxU32* triangles32 = reinterpret_cast<const PxU32*>(triangles);
vref0 = triangles32[triIndex*3+0];
vref1 = triangles32[triIndex*3+1];
vref2 = triangles32[triIndex*3+2];
}
}
// This version has 2 virtual calls to PxTriangleMesh
PX_FORCE_INLINE void getVertexReferences(PxU32& vref0, PxU32& vref1, PxU32& vref2, const PxTriangleMesh* tm, PxU32 triIndex)
{
getVertexReferences(vref0, vref1, vref2, triIndex, tm->getTriangles(), tm->getTriangleMeshFlags() & PxTriangleMeshFlag::e16_BIT_INDICES);
}
PX_PHYSX_COMMON_API void getTriangle(PxVec3& p0, PxVec3& p1, PxVec3& p2, PxU32 triangleIndex, const PxTriangleMeshGeometry& meshGeom, const PxTransform* meshPose);
//////////////////////////////////////////////////////////////////////////////
class EdgeList;
PX_PHYSX_COMMON_API void computeDepenetrationVectors(PxU32 nbDirs, PxVec3* dirs);
struct MaxLocalDepthContext
{
PX_FORCE_INLINE MaxLocalDepthContext() : mUserDirs(NULL), mNbUserDirs(0), mMinDepthCutoff(-PX_MAX_F32), mMaxDepthCutoff(PX_MAX_F32), mIncludeSATAxes(true), mIterative(false)
{
}
const PxVec3* mUserDirs;
PxU32 mNbUserDirs;
float mMinDepthCutoff;
float mMaxDepthCutoff;
bool mIncludeSATAxes;
bool mIterative;
};
PX_PHYSX_COMMON_API float computeMaxLocalDepth( const PxTriangleMeshGeometry& meshGeom0, const PxTransform& meshPose0, const EdgeList* edgeList0,
const PxTriangleMeshGeometry& meshGeom1, const PxTransform& meshPose1, const EdgeList* edgeList1,
PxU32 nbPairs, const PxGeomIndexPair* pairs, const MaxLocalDepthContext& context);
PX_PHYSX_COMMON_API float computeMaxLocalDepthBasic(const PxTriangleMeshGeometry& meshGeom0, const PxTransform& meshPose0,
const PxTriangleMeshGeometry& meshGeom1, const PxTransform& meshPose1,
PxU32 nbPairs, const PxGeomIndexPair* pairs);
} // namespace Gu
}
#endif