aboutsummaryrefslogtreecommitdiff
path: root/PhysX_3.4/Source/PhysXCooking/src
diff options
context:
space:
mode:
authorSheikh Dawood Abdul Ajees <[email protected]>2017-05-12 17:45:18 -0500
committerSheikh Dawood Abdul Ajees <[email protected]>2017-05-12 17:45:18 -0500
commit7f12de60542edc8f1c6683e6b4cdce8570e51456 (patch)
tree0b5d533bae189ea286257b5ab78b635fafb19aa0 /PhysX_3.4/Source/PhysXCooking/src
parentPhysX 3.4, APEX 1.4 patch release @22017166 (diff)
downloadphysx-3.4-7f12de60542edc8f1c6683e6b4cdce8570e51456.tar.xz
physx-3.4-7f12de60542edc8f1c6683e6b4cdce8570e51456.zip
PhysX 3.4, APEX 1.4 patch release @22121272
Diffstat (limited to 'PhysX_3.4/Source/PhysXCooking/src')
-rw-r--r--PhysX_3.4/Source/PhysXCooking/src/Cooking.cpp30
-rw-r--r--PhysX_3.4/Source/PhysXCooking/src/Cooking.h30
-rw-r--r--PhysX_3.4/Source/PhysXCooking/src/convex/BigConvexDataBuilder.cpp14
-rw-r--r--PhysX_3.4/Source/PhysXCooking/src/convex/ConvexHullBuilder.cpp77
-rw-r--r--PhysX_3.4/Source/PhysXCooking/src/convex/ConvexHullBuilder.h6
-rw-r--r--PhysX_3.4/Source/PhysXCooking/src/convex/ConvexHullLib.h3
-rw-r--r--PhysX_3.4/Source/PhysXCooking/src/convex/ConvexMeshBuilder.cpp10
-rw-r--r--PhysX_3.4/Source/PhysXCooking/src/convex/ConvexMeshBuilder.h4
-rw-r--r--PhysX_3.4/Source/PhysXCooking/src/convex/InflationConvexHullLib.h3
-rw-r--r--PhysX_3.4/Source/PhysXCooking/src/convex/QuickHullConvexHullLib.cpp153
-rw-r--r--PhysX_3.4/Source/PhysXCooking/src/convex/QuickHullConvexHullLib.h8
11 files changed, 188 insertions, 150 deletions
diff --git a/PhysX_3.4/Source/PhysXCooking/src/Cooking.cpp b/PhysX_3.4/Source/PhysXCooking/src/Cooking.cpp
index 8dbdec16..fc23c0eb 100644
--- a/PhysX_3.4/Source/PhysXCooking/src/Cooking.cpp
+++ b/PhysX_3.4/Source/PhysXCooking/src/Cooking.cpp
@@ -65,14 +65,14 @@ void Cooking::setParams(const PxCookingParams& params)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-const PxCookingParams& Cooking::getParams()
+const PxCookingParams& Cooking::getParams() const
{
return mParams;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-bool Cooking::platformMismatch()
+bool Cooking::platformMismatch() const
{
// Get current endianness (the one for the platform where cooking is performed)
PxI8 currentEndian = Ps::littleEndian();
@@ -100,7 +100,7 @@ void Cooking::release()
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-bool Cooking::validateTriangleMesh(const PxTriangleMeshDesc& desc)
+bool Cooking::validateTriangleMesh(const PxTriangleMeshDesc& desc) const
{
// cooking code does lots of float bitwise reinterpretation that generates exceptions
PX_FPU_GUARD;
@@ -118,7 +118,7 @@ bool Cooking::validateTriangleMesh(const PxTriangleMeshDesc& desc)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-bool Cooking::cookTriangleMesh(TriangleMeshBuilder& builder, const PxTriangleMeshDesc& desc, PxOutputStream& stream, PxTriangleMeshCookingResult::Enum* condition)
+bool Cooking::cookTriangleMesh(TriangleMeshBuilder& builder, const PxTriangleMeshDesc& desc, PxOutputStream& stream, PxTriangleMeshCookingResult::Enum* condition) const
{
// cooking code does lots of float bitwise reinterpretation that generates exceptions
PX_FPU_GUARD;
@@ -136,7 +136,7 @@ bool Cooking::cookTriangleMesh(TriangleMeshBuilder& builder, const PxTriangleMes
return true;
}
-bool Cooking::cookTriangleMesh(const PxTriangleMeshDesc& desc, PxOutputStream& stream, PxTriangleMeshCookingResult::Enum* condition)
+bool Cooking::cookTriangleMesh(const PxTriangleMeshDesc& desc, PxOutputStream& stream, PxTriangleMeshCookingResult::Enum* condition) const
{
if((mParams.midphaseDesc.getType() == PxMeshMidPhase::eINVALID) || (mParams.midphaseDesc.getType() == PxMeshMidPhase::eBVH33))
{
@@ -150,7 +150,7 @@ bool Cooking::cookTriangleMesh(const PxTriangleMeshDesc& desc, PxOutputStream& s
}
}
-PxTriangleMesh* Cooking::createTriangleMesh(TriangleMeshBuilder& builder, const PxTriangleMeshDesc& desc, PxPhysicsInsertionCallback& insertionCallback)
+PxTriangleMesh* Cooking::createTriangleMesh(TriangleMeshBuilder& builder, const PxTriangleMeshDesc& desc, PxPhysicsInsertionCallback& insertionCallback) const
{
// cooking code does lots of float bitwise reinterpretation that generates exceptions
PX_FPU_GUARD;
@@ -171,7 +171,7 @@ PxTriangleMesh* Cooking::createTriangleMesh(TriangleMeshBuilder& builder, const
return static_cast<PxTriangleMesh*>(insertionCallback.buildObjectFromData(type, &builder.getMeshData()));
}
-PxTriangleMesh* Cooking::createTriangleMesh(const PxTriangleMeshDesc& desc, PxPhysicsInsertionCallback& insertionCallback)
+PxTriangleMesh* Cooking::createTriangleMesh(const PxTriangleMeshDesc& desc, PxPhysicsInsertionCallback& insertionCallback) const
{
if((mParams.midphaseDesc.getType() == PxMeshMidPhase::eINVALID) || (mParams.midphaseDesc.getType() == PxMeshMidPhase::eBVH33))
{
@@ -188,7 +188,7 @@ PxTriangleMesh* Cooking::createTriangleMesh(const PxTriangleMeshDesc& desc, PxPh
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// cook convex mesh from given desc, internal function to be shared between create/cook convex mesh
bool Cooking::cookConvexMeshInternal(const PxConvexMeshDesc& desc_, ConvexMeshBuilder& meshBuilder, ConvexHullLib* hullLib,
- PxConvexMeshCookingResult::Enum* condition)
+ PxConvexMeshCookingResult::Enum* condition) const
{
if (condition)
*condition = PxConvexMeshCookingResult::eFAILURE;
@@ -244,7 +244,7 @@ bool Cooking::cookConvexMeshInternal(const PxConvexMeshDesc& desc_, ConvexMeshBu
return false;
}
- if (!meshBuilder.build(desc, mParams.gaussMapLimit, false, hullLib ? false : true))
+ if (!meshBuilder.build(desc, mParams.gaussMapLimit, false, hullLib))
{
return false;
}
@@ -259,7 +259,7 @@ bool Cooking::cookConvexMeshInternal(const PxConvexMeshDesc& desc_, ConvexMeshBu
//////////////////////////////////////////////////////////////////////////
// cook convex mesh from given desc, save the results into stream
-bool Cooking::cookConvexMesh(const PxConvexMeshDesc& desc_, PxOutputStream& stream, PxConvexMeshCookingResult::Enum* condition)
+bool Cooking::cookConvexMesh(const PxConvexMeshDesc& desc_, PxOutputStream& stream, PxConvexMeshCookingResult::Enum* condition) const
{
PX_FPU_GUARD;
// choose cooking library if needed
@@ -314,7 +314,7 @@ bool Cooking::cookConvexMesh(const PxConvexMeshDesc& desc_, PxOutputStream& stre
//////////////////////////////////////////////////////////////////////////
// cook convex mesh from given desc, copy the results into internal convex mesh
// and insert the mesh into PxPhysics
-PxConvexMesh* Cooking::createConvexMesh(const PxConvexMeshDesc& desc_, PxPhysicsInsertionCallback& insertionCallback)
+PxConvexMesh* Cooking::createConvexMesh(const PxConvexMeshDesc& desc_, PxPhysicsInsertionCallback& insertionCallback) const
{
PX_FPU_GUARD;
// choose cooking library if needed
@@ -381,7 +381,7 @@ PxConvexMesh* Cooking::createConvexMesh(const PxConvexMeshDesc& desc_, PxPhysics
//////////////////////////////////////////////////////////////////////////
-bool Cooking::validateConvexMesh(const PxConvexMeshDesc& desc)
+bool Cooking::validateConvexMesh(const PxConvexMeshDesc& desc) const
{
ConvexMeshBuilder mesh(mParams.buildGPUData);
return mesh.build(desc, mParams.gaussMapLimit, true);
@@ -390,7 +390,7 @@ bool Cooking::validateConvexMesh(const PxConvexMeshDesc& desc)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
bool Cooking::computeHullPolygons(const PxSimpleTriangleMesh& mesh, PxAllocatorCallback& inCallback,PxU32& nbVerts, PxVec3*& vertices,
- PxU32& nbIndices, PxU32*& indices, PxU32& nbPolygons, PxHullPolygon*& hullPolygons)
+ PxU32& nbIndices, PxU32*& indices, PxU32& nbPolygons, PxHullPolygon*& hullPolygons) const
{
PxVec3* geometry = reinterpret_cast<PxVec3*>(PxAlloca(sizeof(PxVec3)*mesh.points.count));
Cooking::gatherStrided(mesh.points.data, geometry, mesh.points.count, sizeof(PxVec3), mesh.points.stride);
@@ -425,7 +425,7 @@ bool Cooking::computeHullPolygons(const PxSimpleTriangleMesh& mesh, PxAllocatorC
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-bool Cooking::cookHeightField(const PxHeightFieldDesc& desc, PxOutputStream& stream)
+bool Cooking::cookHeightField(const PxHeightFieldDesc& desc, PxOutputStream& stream) const
{
PX_FPU_GUARD;
@@ -458,7 +458,7 @@ bool Cooking::cookHeightField(const PxHeightFieldDesc& desc, PxOutputStream& str
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-PxHeightField* Cooking::createHeightField(const PxHeightFieldDesc& desc, PxPhysicsInsertionCallback& insertionCallback)
+PxHeightField* Cooking::createHeightField(const PxHeightFieldDesc& desc, PxPhysicsInsertionCallback& insertionCallback) const
{
PX_FPU_GUARD;
diff --git a/PhysX_3.4/Source/PhysXCooking/src/Cooking.h b/PhysX_3.4/Source/PhysXCooking/src/Cooking.h
index ad2fefd4..220ce386 100644
--- a/PhysX_3.4/Source/PhysXCooking/src/Cooking.h
+++ b/PhysX_3.4/Source/PhysXCooking/src/Cooking.h
@@ -47,19 +47,19 @@ public:
virtual void release();
virtual void setParams(const PxCookingParams& params);
- virtual const PxCookingParams& getParams();
- virtual bool platformMismatch();
- virtual bool cookTriangleMesh(const PxTriangleMeshDesc& desc, PxOutputStream& stream, PxTriangleMeshCookingResult::Enum* condition = NULL);
- virtual PxTriangleMesh* createTriangleMesh(const PxTriangleMeshDesc& desc, PxPhysicsInsertionCallback& insertionCallback);
- virtual bool validateTriangleMesh(const PxTriangleMeshDesc& desc);
+ virtual const PxCookingParams& getParams() const;
+ virtual bool platformMismatch() const;
+ virtual bool cookTriangleMesh(const PxTriangleMeshDesc& desc, PxOutputStream& stream, PxTriangleMeshCookingResult::Enum* condition = NULL) const;
+ virtual PxTriangleMesh* createTriangleMesh(const PxTriangleMeshDesc& desc, PxPhysicsInsertionCallback& insertionCallback) const;
+ virtual bool validateTriangleMesh(const PxTriangleMeshDesc& desc) const;
- virtual bool cookConvexMesh(const PxConvexMeshDesc& desc, PxOutputStream& stream, PxConvexMeshCookingResult::Enum* condition);
- virtual PxConvexMesh* createConvexMesh(const PxConvexMeshDesc& desc, PxPhysicsInsertionCallback& insertionCallback);
- virtual bool validateConvexMesh(const PxConvexMeshDesc& desc);
+ virtual bool cookConvexMesh(const PxConvexMeshDesc& desc, PxOutputStream& stream, PxConvexMeshCookingResult::Enum* condition) const;
+ virtual PxConvexMesh* createConvexMesh(const PxConvexMeshDesc& desc, PxPhysicsInsertionCallback& insertionCallback) const;
+ virtual bool validateConvexMesh(const PxConvexMeshDesc& desc) const;
virtual bool computeHullPolygons(const PxSimpleTriangleMesh& mesh, PxAllocatorCallback& inCallback,PxU32& nbVerts, PxVec3*& vertices,
- PxU32& nbIndices, PxU32*& indices, PxU32& nbPolygons, PxHullPolygon*& hullPolygons);
- virtual bool cookHeightField(const PxHeightFieldDesc& desc, PxOutputStream& stream);
- virtual PxHeightField* createHeightField(const PxHeightFieldDesc& desc, PxPhysicsInsertionCallback& insertionCallback);
+ PxU32& nbIndices, PxU32*& indices, PxU32& nbPolygons, PxHullPolygon*& hullPolygons) const;
+ virtual bool cookHeightField(const PxHeightFieldDesc& desc, PxOutputStream& stream) const;
+ virtual PxHeightField* createHeightField(const PxHeightFieldDesc& desc, PxPhysicsInsertionCallback& insertionCallback) const;
PX_FORCE_INLINE static void gatherStrided(const void* src, void* dst, PxU32 nbElem, PxU32 elemSize, PxU32 stride)
{
@@ -74,13 +74,13 @@ public:
}
private:
- bool cookConvexMeshInternal(const PxConvexMeshDesc& desc, ConvexMeshBuilder& meshBuilder, ConvexHullLib* hullLib, PxConvexMeshCookingResult::Enum* condition);
+ bool cookConvexMeshInternal(const PxConvexMeshDesc& desc, ConvexMeshBuilder& meshBuilder, ConvexHullLib* hullLib, PxConvexMeshCookingResult::Enum* condition) const;
+ bool cookTriangleMesh(TriangleMeshBuilder& builder, const PxTriangleMeshDesc& desc, PxOutputStream& stream, PxTriangleMeshCookingResult::Enum* condition) const;
+ PxTriangleMesh* createTriangleMesh(TriangleMeshBuilder& builder, const PxTriangleMeshDesc& desc, PxPhysicsInsertionCallback& insertionCallback) const;
private:
- PxCookingParams mParams;
+ PxCookingParams mParams;
- bool cookTriangleMesh(TriangleMeshBuilder& builder, const PxTriangleMeshDesc& desc, PxOutputStream& stream, PxTriangleMeshCookingResult::Enum* condition);
- PxTriangleMesh* createTriangleMesh(TriangleMeshBuilder& builder, const PxTriangleMeshDesc& desc, PxPhysicsInsertionCallback& insertionCallback);
};
}
diff --git a/PhysX_3.4/Source/PhysXCooking/src/convex/BigConvexDataBuilder.cpp b/PhysX_3.4/Source/PhysXCooking/src/convex/BigConvexDataBuilder.cpp
index f7ef03dd..0021d3a4 100644
--- a/PhysX_3.4/Source/PhysXCooking/src/convex/BigConvexDataBuilder.cpp
+++ b/PhysX_3.4/Source/PhysXCooking/src/convex/BigConvexDataBuilder.cpp
@@ -108,8 +108,6 @@ bool BigConvexDataBuilder::save(PxOutputStream& stream, bool platformMismatch) c
// we dont compute the edges again here, we have them temporary stored in mHullDataFacesByAllEdges8 structure
bool BigConvexDataBuilder::computeValencies(const ConvexHullBuilder& meshBuilder)
{
- PX_ASSERT(meshBuilder.mHullDataFacesByAllEdges8);
-
// Create valencies
const PxU32 numVertices = meshBuilder.mHull->mNbHullVertices;
mSVM->mData.mNbVerts = numVertices;
@@ -159,8 +157,10 @@ bool BigConvexDataBuilder::computeValencies(const ConvexHullBuilder& meshBuilder
mSVM->mData.mAdjacentVerts[mSVM->mData.mValencies[vertexIndex].mOffset++] = prevIndex;
numAdj++;
// now traverse the neighbors
- PxU8 n0 = meshBuilder.mHullDataFacesByAllEdges8[(meshBuilder.mHullDataPolygons[i].mVRef8 + j)*2];
- PxU8 n1 = meshBuilder.mHullDataFacesByAllEdges8[(meshBuilder.mHullDataPolygons[i].mVRef8 + j)*2 + 1];
+ const PxU16 edgeIndex = PxU16(meshBuilder.mEdgeData16[meshBuilder.mHullDataPolygons[i].mVRef8 + j]*2);
+ PxU8 n0 = meshBuilder.mHullDataFacesByEdges8[edgeIndex];
+ PxU8 n1 = meshBuilder.mHullDataFacesByEdges8[edgeIndex + 1];
+
PxU32 neighborPolygon = n0 == i ? n1 : n0;
while (neighborPolygon != i)
{
@@ -192,8 +192,10 @@ bool BigConvexDataBuilder::computeValencies(const ConvexHullBuilder& meshBuilder
}
// now move to next neighbor
- n0 = meshBuilder.mHullDataFacesByAllEdges8[(meshBuilder.mHullDataPolygons[neighborPolygon].mVRef8 + nextEdgeIndex)*2];
- n1 = meshBuilder.mHullDataFacesByAllEdges8[(meshBuilder.mHullDataPolygons[neighborPolygon].mVRef8 + nextEdgeIndex)*2 + 1];
+ const PxU16 edgeIndex2 = PxU16(meshBuilder.mEdgeData16[(meshBuilder.mHullDataPolygons[neighborPolygon].mVRef8 + nextEdgeIndex)]*2);
+ n0 = meshBuilder.mHullDataFacesByEdges8[edgeIndex2];
+ n1 = meshBuilder.mHullDataFacesByEdges8[edgeIndex2 + 1];
+
neighborPolygon = n0 == neighborPolygon ? n1 : n0;
}
vertexMarker[vertexIndex] = numAdj;
diff --git a/PhysX_3.4/Source/PhysXCooking/src/convex/ConvexHullBuilder.cpp b/PhysX_3.4/Source/PhysXCooking/src/convex/ConvexHullBuilder.cpp
index a28c404e..35dac326 100644
--- a/PhysX_3.4/Source/PhysXCooking/src/convex/ConvexHullBuilder.cpp
+++ b/PhysX_3.4/Source/PhysXCooking/src/convex/ConvexHullBuilder.cpp
@@ -37,6 +37,7 @@
#include "PxCooking.h"
#include "CookingUtils.h"
#include "ConvexHullBuilder.h"
+#include "ConvexHullLib.h"
#include "CmRadixSortBuffered.h"
#include "MeshCleaner.h"
#include "PsArray.h"
@@ -62,7 +63,6 @@ ConvexHullBuilder::ConvexHullBuilder(Gu::ConvexHullData* hull, const bool buildG
mHullDataVertexData8 (NULL),
mHullDataFacesByEdges8 (NULL),
mHullDataFacesByVertices8 (NULL),
- mHullDataFacesByAllEdges8 (NULL),
mEdgeData16 (NULL),
mEdges (NULL),
mHull (hull),
@@ -82,7 +82,6 @@ ConvexHullBuilder::~ConvexHullBuilder()
PX_DELETE_POD(mHullDataVertexData8);
PX_DELETE_POD(mHullDataFacesByEdges8);
PX_DELETE_POD(mHullDataFacesByVertices8);
- PX_DELETE_POD(mHullDataFacesByAllEdges8);
}
//////////////////////////////////////////////////////////////////////////
@@ -92,8 +91,10 @@ ConvexHullBuilder::~ConvexHullBuilder()
// \param indices [in] indices array
// \param nbPolygons [in] number of polygons
// \param hullPolygons [in] polygons array
+// \param doValidation [in] specifies whether we should run the validation code
+// \param hullLib [in] if hullLib is provided, we can reuse the hull create data, hulllib is NULL in case of user provided polygons
bool ConvexHullBuilder::init(PxU32 nbVerts, const PxVec3* verts, const PxU32* indices, const PxU32 nbIndices,
- const PxU32 nbPolygons, const PxHullPolygon* hullPolygons, PxU32 gaussMapVertexLimit, bool doValidation, bool userPolygons)
+ const PxU32 nbPolygons, const PxHullPolygon* hullPolygons, bool doValidation, ConvexHullLib* hullLib)
{
PX_ASSERT(indices);
PX_ASSERT(verts);
@@ -106,7 +107,6 @@ bool ConvexHullBuilder::init(PxU32 nbVerts, const PxVec3* verts, const PxU32* in
mHullDataVertexData8 = NULL;
mHullDataFacesByEdges8 = NULL;
mHullDataFacesByVertices8 = NULL;
- mHullDataFacesByAllEdges8 = NULL;
mEdges = NULL;
mEdgeData16 = NULL;
@@ -153,13 +153,20 @@ bool ConvexHullBuilder::init(PxU32 nbVerts, const PxVec3* verts, const PxU32* in
dest += numVerts;
}
- if(!calculateVertexMapTable(nbPolygons, userPolygons))
+ if(!calculateVertexMapTable(nbPolygons, (hullLib != NULL) ? false : true))
return false;
// moved create edge list here from save, copy. This is a part of the validation process and
// we need to create the edge list anyway
- if (!createEdgeList(doValidation, nbIndices, mHull->mNbHullVertices > gaussMapVertexLimit ? true : false))
- return false;
+ if(!hullLib || !hullLib->createEdgeList(nbIndices, mHullDataVertexData8, &mHullDataFacesByEdges8, &mEdgeData16, &mEdges))
+ {
+ if (!createEdgeList(doValidation, nbIndices))
+ return false;
+ }
+ else
+ {
+ mHull->mNbEdges = PxU16(nbIndices/2);
+ }
#ifdef USE_PRECOMPUTED_HULL_PROJECTION
// Loop through polygons
@@ -524,7 +531,7 @@ bool ConvexHullBuilder::calculateVertexMapTable(PxU32 nbPolygons, bool userPolyg
//////////////////////////////////////////////////////////////////////////
// create edge list
-bool ConvexHullBuilder::createEdgeList(bool doValidation, PxU32 nbEdges, bool prepareBigHullData)
+bool ConvexHullBuilder::createEdgeList(bool doValidation, PxU32 nbEdges)
{
// Code below could be greatly simplified if we assume manifold meshes!
@@ -562,11 +569,6 @@ bool ConvexHullBuilder::createEdgeList(bool doValidation, PxU32 nbEdges, bool pr
return false;
}
- if (prepareBigHullData)
- {
- mHullDataFacesByAllEdges8 = PX_NEW(PxU8)[nbEdges * 2];
- }
-
// 1) Get some bytes: I need one EdgesRefs for each face, and some temp buffers
// Face indices by edge indices. First face is the one where the edge is ordered from tail to head.
@@ -642,37 +644,6 @@ bool ConvexHullBuilder::createEdgeList(bool doValidation, PxU32 nbEdges, bool pr
mHull->mNbEdges = 0; // #non-redundant edges
- // A.B. Comment out the early exit temporary since we need to precompute the additonal edge data for GPU
- //if (!doValidation)
- //{
- // // TODO avoroshilov: this codepath is not supported
-
- // for (PxU32 i = 0; i < nbEdgesUnshared; i = i + 2)
- // {
- // const PxU32 sortedIndex = sorted[i]; // Between 0 and Nb
- // const PxU32 nextSortedIndex = sorted[i + 1]; // Between 0 and Nb
- // const PxU32 polyID = polyIndex[sortedIndex]; // Poly index
- // const PxU32 nextPolyID = polyIndex[nextSortedIndex]; // Poly index
- //
- // mHullDataFacesByEdges8[(mHull->mNbEdges) * 2] = Ps::to8(polyID);
- // mHullDataFacesByEdges8[(mHull->mNbEdges) * 2 + 1] = Ps::to8(nextPolyID);
-
- // // store the full edge data for later use in big convex hull valencies computation
- // if(mHullDataFacesByAllEdges8)
- // {
- // mHullDataFacesByAllEdges8[edgeData[sortedIndex] * 2] = Ps::to8(polyID);
- // mHullDataFacesByAllEdges8[edgeData[sortedIndex] * 2 + 1] = Ps::to8(nextPolyID);
-
- // mHullDataFacesByAllEdges8[edgeData[nextSortedIndex] * 2] = Ps::to8(polyID);
- // mHullDataFacesByAllEdges8[edgeData[nextSortedIndex] * 2 + 1] = Ps::to8(nextPolyID);
- // }
- // mHull->mNbEdges++;
- // }
-
- // PX_DELETE_POD(bufferAdd);
- // return true;
- //}
-
// 4) Loop through all possible edges
// - clean edges list by removing redundant edges
// - create EdgesRef list
@@ -685,7 +656,6 @@ bool ConvexHullBuilder::createEdgeList(bool doValidation, PxU32 nbEdges, bool pr
PxU32 previousRef0 = PX_INVALID_U32;
PxU32 previousRef1 = PX_INVALID_U32;
- PxU32 previousIndex = PX_INVALID_U32;
PxU32 previousPolyId = PX_INVALID_U32;
PxU16 nbHullEdges = 0;
@@ -732,23 +702,6 @@ bool ConvexHullBuilder::createEdgeList(bool doValidation, PxU32 nbEdges, bool pr
mEdgeData16[mHullDataPolygons[polyID].mVRef8 + vertexID] = Ps::to16(i / 2);
- if (mHullDataFacesByAllEdges8)
- {
- if (previousIndex != PX_INVALID_U32)
- {
- // store the full edge data for later use in big convex hull valencies computation
- mHullDataFacesByAllEdges8[edgeData[sortedIndex] * 2] = Ps::to8(polyID);
- mHullDataFacesByAllEdges8[edgeData[sortedIndex] * 2 + 1] = Ps::to8(polyIndex[previousIndex]);
-
- mHullDataFacesByAllEdges8[edgeData[previousIndex] * 2] = Ps::to8(polyID);
- mHullDataFacesByAllEdges8[edgeData[previousIndex] * 2 + 1] = Ps::to8(polyIndex[previousIndex]);
- previousIndex = PX_INVALID_U32;
- }
- else
- {
- previousIndex = sortedIndex;
- }
- }
// Create mEdgesRef on the fly
polyIndex2[i] = polyID;
diff --git a/PhysX_3.4/Source/PhysXCooking/src/convex/ConvexHullBuilder.h b/PhysX_3.4/Source/PhysXCooking/src/convex/ConvexHullBuilder.h
index 7d2215e2..da0ffaf3 100644
--- a/PhysX_3.4/Source/PhysXCooking/src/convex/ConvexHullBuilder.h
+++ b/PhysX_3.4/Source/PhysXCooking/src/convex/ConvexHullBuilder.h
@@ -38,6 +38,7 @@
namespace physx
{
struct PxHullPolygon;
+ class ConvexHullLib;
namespace Gu
{
@@ -57,12 +58,12 @@ namespace physx
~ConvexHullBuilder();
bool init(PxU32 nbVerts, const PxVec3* verts, const PxU32* indices, const PxU32 nbIndices, const PxU32 nbPolygons,
- const PxHullPolygon* hullPolygons, PxU32 gaussMapVertexLimit, bool doValidation = true, bool userPolygons = false);
+ const PxHullPolygon* hullPolygons, bool doValidation = true, ConvexHullLib* hullLib = NULL);
bool save(PxOutputStream& stream, bool platformMismatch) const;
bool copy(Gu::ConvexHullData& hullData, PxU32& nb);
- bool createEdgeList(bool doValidation, PxU32 nbEdges, bool prepareBigHullData);
+ bool createEdgeList(bool doValidation, PxU32 nbEdges);
bool checkHullPolygons() const;
bool calculateVertexMapTable(PxU32 nbPolygons, bool userPolygons = false);
@@ -78,7 +79,6 @@ namespace physx
PxU8* mHullDataVertexData8;
PxU8* mHullDataFacesByEdges8;
PxU8* mHullDataFacesByVertices8;
- PxU8* mHullDataFacesByAllEdges8; // data used fom big hull valencies computation
PxU16* mEdgeData16; //!< Edge indices indexed by hull polygons
PxU16* mEdges; //!< Edge to vertex mapping
diff --git a/PhysX_3.4/Source/PhysXCooking/src/convex/ConvexHullLib.h b/PhysX_3.4/Source/PhysXCooking/src/convex/ConvexHullLib.h
index cd8f766e..06ff9adc 100644
--- a/PhysX_3.4/Source/PhysXCooking/src/convex/ConvexHullLib.h
+++ b/PhysX_3.4/Source/PhysXCooking/src/convex/ConvexHullLib.h
@@ -58,6 +58,9 @@ namespace physx
// fills the PxConvexMeshDesc with computed hull data
virtual void fillConvexMeshDesc(PxConvexMeshDesc& desc) = 0;
+ // compute the edge list information if possible
+ virtual bool createEdgeList(const PxU32 nbIndices, const PxU8* indices, PxU8** hullDataFacesByEdges8, PxU16** edgeData16, PxU16** edges) = 0;
+
static const PxU32 gpuMaxVertsPerFace = 32;
protected:
diff --git a/PhysX_3.4/Source/PhysXCooking/src/convex/ConvexMeshBuilder.cpp b/PhysX_3.4/Source/PhysXCooking/src/convex/ConvexMeshBuilder.cpp
index bfdf0bef..0d283d9f 100644
--- a/PhysX_3.4/Source/PhysXCooking/src/convex/ConvexMeshBuilder.cpp
+++ b/PhysX_3.4/Source/PhysXCooking/src/convex/ConvexMeshBuilder.cpp
@@ -66,7 +66,7 @@ ConvexMeshBuilder::~ConvexMeshBuilder()
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// load the mesh data from given polygons
-bool ConvexMeshBuilder::build(const PxConvexMeshDesc& desc, PxU32 gaussMapVertexLimit, bool validateOnly, bool userPolygons)
+bool ConvexMeshBuilder::build(const PxConvexMeshDesc& desc, PxU32 gaussMapVertexLimit, bool validateOnly, ConvexHullLib* hullLib)
{
if(!desc.isValid())
{
@@ -74,7 +74,7 @@ bool ConvexMeshBuilder::build(const PxConvexMeshDesc& desc, PxU32 gaussMapVertex
return false;
}
- if(!loadConvexHull(desc, gaussMapVertexLimit, userPolygons))
+ if(!loadConvexHull(desc, hullLib))
return false;
// Compute local bounds (*after* hull has been created)
@@ -239,7 +239,7 @@ void ConvexMeshBuilder::computeMassInfo(bool lowerPrecision)
#pragma warning(disable:4996) // permitting use of gatherStrided until we have a replacement.
#endif
-bool ConvexMeshBuilder::loadConvexHull(const PxConvexMeshDesc& desc, PxU32 gaussMapVertexLimit, bool userPolygons)
+bool ConvexMeshBuilder::loadConvexHull(const PxConvexMeshDesc& desc, ConvexHullLib* hullLib)
{
// gather points
PxVec3* geometry = reinterpret_cast<PxVec3*>(PxAlloca(sizeof(PxVec3)*desc.points.count));
@@ -281,7 +281,7 @@ bool ConvexMeshBuilder::loadConvexHull(const PxConvexMeshDesc& desc, PxU32 gauss
Cooking::gatherStrided(desc.polygons.data,hullPolygons,desc.polygons.count,sizeof(PxHullPolygon),desc.polygons.stride);
// if user polygons, make sure the largest one is the first one
- if (userPolygons)
+ if (!hullLib)
{
PxU32 largestPolygon = 0;
for (PxU32 i = 1; i < desc.polygons.count; i++)
@@ -299,7 +299,7 @@ bool ConvexMeshBuilder::loadConvexHull(const PxConvexMeshDesc& desc, PxU32 gauss
}
const bool doValidation = desc.flags & PxConvexFlag::eDISABLE_MESH_VALIDATION ? false : true;
- if(!hullBuilder.init(desc.points.count, geometry, topology, desc.indices.count, desc.polygons.count, hullPolygons, gaussMapVertexLimit, doValidation))
+ if(!hullBuilder.init(desc.points.count, geometry, topology, desc.indices.count, desc.polygons.count, hullPolygons, doValidation, hullLib))
{
Ps::getFoundation().error(PxErrorCode::eINTERNAL_ERROR, __FILE__, __LINE__, "Gu::ConvexMesh::loadConvexHull: convex hull init failed!");
return false;
diff --git a/PhysX_3.4/Source/PhysXCooking/src/convex/ConvexMeshBuilder.h b/PhysX_3.4/Source/PhysXCooking/src/convex/ConvexMeshBuilder.h
index cdfe0376..e81c68cc 100644
--- a/PhysX_3.4/Source/PhysXCooking/src/convex/ConvexMeshBuilder.h
+++ b/PhysX_3.4/Source/PhysXCooking/src/convex/ConvexMeshBuilder.h
@@ -47,7 +47,7 @@ namespace physx
// loads the computed or given convex hull from descriptor.
// the descriptor does contain polygons directly, triangles are not allowed
- bool build(const PxConvexMeshDesc&, PxU32 gaussMapVertexLimit, bool validateOnly = false, bool userPolygons = false);
+ bool build(const PxConvexMeshDesc&, PxU32 gaussMapVertexLimit, bool validateOnly = false, ConvexHullLib* hullLib = NULL);
// save the convex mesh into stream
bool save(PxOutputStream& stream, bool platformMismatch) const;
@@ -56,7 +56,7 @@ namespace physx
bool copy(Gu::ConvexHullData& convexData, PxU32& nb);
// loads the convex mesh from given polygons
- bool loadConvexHull(const PxConvexMeshDesc&, PxU32 gaussMapVertexLimit, bool userPolygons);
+ bool loadConvexHull(const PxConvexMeshDesc&, ConvexHullLib* hullLib);
// computed hull polygons from given triangles
bool computeHullPolygons(const PxU32& nbVerts,const PxVec3* verts, const PxU32& nbTriangles, const PxU32* triangles, PxAllocatorCallback& inAllocator,
diff --git a/PhysX_3.4/Source/PhysXCooking/src/convex/InflationConvexHullLib.h b/PhysX_3.4/Source/PhysXCooking/src/convex/InflationConvexHullLib.h
index 3713bdb7..ee03a15d 100644
--- a/PhysX_3.4/Source/PhysXCooking/src/convex/InflationConvexHullLib.h
+++ b/PhysX_3.4/Source/PhysXCooking/src/convex/InflationConvexHullLib.h
@@ -96,6 +96,9 @@ namespace physx
// computes the convex hull from provided points
virtual PxConvexMeshCookingResult::Enum createConvexHull();
+ // Inflation convex hull does not store edge information so we cannot provide the edge list
+ virtual bool createEdgeList(const PxU32 , const PxU8* , PxU8** , PxU16** , PxU16** ) { return false; }
+
// fills the convexmeshdesc with computed hull data
virtual void fillConvexMeshDesc(PxConvexMeshDesc& desc);
diff --git a/PhysX_3.4/Source/PhysXCooking/src/convex/QuickHullConvexHullLib.cpp b/PhysX_3.4/Source/PhysXCooking/src/convex/QuickHullConvexHullLib.cpp
index eab6f336..881c9218 100644
--- a/PhysX_3.4/Source/PhysXCooking/src/convex/QuickHullConvexHullLib.cpp
+++ b/PhysX_3.4/Source/PhysXCooking/src/convex/QuickHullConvexHullLib.cpp
@@ -182,12 +182,12 @@ namespace local
// representation of quick hull half edge
struct QuickHullHalfEdge
{
- QuickHullHalfEdge() : prev(NULL), next(NULL), twin(NULL), face(NULL)
+ QuickHullHalfEdge() : prev(NULL), next(NULL), twin(NULL), face(NULL), edgeIndex(0xFFFFFFFF)
{
}
QuickHullHalfEdge(PxU32 )
- : prev(NULL), next(NULL), twin(NULL), face(NULL)
+ : prev(NULL), next(NULL), twin(NULL), face(NULL), edgeIndex(0xFFFFFFFF)
{
}
@@ -199,6 +199,8 @@ namespace local
QuickHullFace* face; // face where the edge belong
+ PxU32 edgeIndex; // edge index used for edge creation
+
PX_FORCE_INLINE const QuickHullVertex& getTail() const
{
return tail;
@@ -256,17 +258,18 @@ namespace local
QuickHullFace* nextFace; // used to indicate next free face in faceList
PxU32 index; // face index for compare identification
+ PxU8 outIndex; // face index used for output descriptor
public:
QuickHullFace()
: edge(NULL), numEdges(0), conflictList(NULL), area(0.0f), planeOffset(0.0f), expandOffset(-FLT_MAX),
- state(eVISIBLE), nextFace(NULL)
+ state(eVISIBLE), nextFace(NULL), outIndex(0)
{
}
QuickHullFace(PxU32 ind)
: edge(NULL), numEdges(0), conflictList(NULL), area(0.0f), planeOffset(0.0f), expandOffset(-FLT_MAX),
- state(eVISIBLE), nextFace(NULL), index(ind)
+ state(eVISIBLE), nextFace(NULL), index(ind), outIndex(0)
{
}
@@ -1778,7 +1781,7 @@ namespace local
//////////////////////////////////////////////////////////////////////////
QuickHullConvexHullLib::QuickHullConvexHullLib(const PxConvexMeshDesc& desc, const PxCookingParams& params)
- : ConvexHullLib(desc, params),mQuickHull(NULL), mCropedConvexHull(NULL), mVertsOut(NULL), mIndicesOut(NULL), mPolygonsOut(NULL)
+ : ConvexHullLib(desc, params),mQuickHull(NULL), mCropedConvexHull(NULL), mOutMemoryBuffer(NULL), mFaceTranslateTable(NULL)
{
mQuickHull = PX_NEW_TEMP(local::QuickHull)(params, desc);
mQuickHull->preallocate(desc.points.count);
@@ -1796,9 +1799,8 @@ QuickHullConvexHullLib::~QuickHullConvexHullLib()
PX_DELETE(mCropedConvexHull);
}
- PX_FREE(mVertsOut);
- PX_FREE(mPolygonsOut);
- PX_FREE(mIndicesOut);
+ PX_FREE(mOutMemoryBuffer);
+ mFaceTranslateTable = NULL; // memory is a part of mOutMemoryBuffer
}
//////////////////////////////////////////////////////////////////////////
@@ -2224,9 +2226,8 @@ PxConvexMeshCookingResult::Enum QuickHullConvexHullLib::expandHullOBB()
computeOBBFromConvex(convexDesc, sides, obbTransform);
// free the memory used for the convex mesh desc
- PX_FREE_AND_RESET(mVertsOut);
- PX_FREE_AND_RESET(mPolygonsOut);
- PX_FREE_AND_RESET(mIndicesOut);
+ PX_FREE_AND_RESET(mOutMemoryBuffer);
+ mFaceTranslateTable = NULL;
// crop the OBB
PxU32 maxplanes = PxMin(PxU32(256), expandPlanes.size());
@@ -2279,8 +2280,72 @@ PxConvexMeshCookingResult::Enum QuickHullConvexHullLib::expandHullOBB()
return PxConvexMeshCookingResult::eSUCCESS;
}
+//////////////////////////////////////////////////////////////////////////
+
+bool QuickHullConvexHullLib::createEdgeList(const PxU32 nbIndices, const PxU8* indices, PxU8** outHullDataFacesByEdges8, PxU16** outEdgeData16, PxU16** outEdges)
+{
+ // if we croped hull, we dont have the edge information, early exit
+ if (mCropedConvexHull)
+ return false;
+
+ PX_ASSERT(mQuickHull);
+
+ // Make sure we did recieved empty buffers
+ PX_ASSERT(*outHullDataFacesByEdges8 == NULL);
+ PX_ASSERT(*outEdges == NULL);
+ PX_ASSERT(*outEdgeData16 == NULL);
+
+ // Allocated the out bufferts
+ PxU8* hullDataFacesByEdges8 = PX_NEW(PxU8)[nbIndices];
+ PxU16* edges = PX_NEW(PxU16)[nbIndices];
+ PxU16* edgeData16 = PX_NEW(PxU16)[nbIndices];
+
+ *outHullDataFacesByEdges8 = hullDataFacesByEdges8;
+ *outEdges = edges;
+ *outEdgeData16 = edgeData16;
+
+ PxU16 edgeIndex = 0;
+ PxU32 edgeOffset = 0;
+ for(PxU32 i = 0; i < mQuickHull->mNumHullFaces; i++)
+ {
+ const local::QuickHullFace& face = *mQuickHull->mHullFaces[mFaceTranslateTable[i]];
+
+ // Face must be visible
+ PX_ASSERT(face.state == local::QuickHullFace::eVISIBLE);
+
+ // parse the edges
+ const PxU32 startEdgeOffset = edgeOffset;
+ local::QuickHullHalfEdge* hedge = face.edge;
+ do
+ {
+ // check if hedge has been stored
+ if(hedge->edgeIndex == 0xFFFFFFFF)
+ {
+ edges[edgeIndex*2] = indices[edgeOffset];
+ edges[edgeIndex*2 + 1] = indices[(hedge->next != face.edge) ? edgeOffset + 1 : startEdgeOffset];
+
+ hullDataFacesByEdges8[edgeIndex*2] = hedge->face->outIndex;
+ hullDataFacesByEdges8[edgeIndex*2 + 1] = hedge->next->twin->face->outIndex;
+ edgeData16[edgeOffset] = edgeIndex;
+ hedge->edgeIndex = edgeIndex;
+ hedge->next->twin->prev->edgeIndex = edgeIndex;
+
+ edgeIndex++;
+ }
+ else
+ {
+ edgeData16[edgeOffset] = Ps::to16(hedge->edgeIndex);
+ }
+
+ hedge = hedge->next;
+ edgeOffset++;
+ } while (hedge != face.edge);
+ }
+
+ return true;
+}
//////////////////////////////////////////////////////////////////////////
// fill the descriptor with computed verts, indices and polygons
@@ -2317,12 +2382,20 @@ void QuickHullConvexHullLib::fillConvexMeshDescFromQuickHull(PxConvexMeshDesc& d
}
// allocate out buffers
- PxU32* indices = reinterpret_cast<PxU32*> (PX_ALLOC_TEMP(sizeof(PxU32)*numIndices, "PxU32"));
- PxI32* translateTable = reinterpret_cast<PxI32*> (PX_ALLOC_TEMP(sizeof(PxU32)*mQuickHull->mNumVertices, "PxU32"));
+ const PxU32 indicesBufferSize = sizeof(PxU32)*numIndices;
+ const PxU32 verticesBufferSize = sizeof(PxVec3)*mQuickHull->mNumVertices + 1;
+ const PxU32 facesBufferSize = sizeof(PxHullPolygon)*numFacesOut;
+ const PxU32 faceTranslationTableSize = sizeof(PxU16)*numFacesOut;
+ const PxU32 translationTableSize = sizeof(PxU32)*mQuickHull->mNumVertices;
+ const PxU32 bufferMemorySize = indicesBufferSize + verticesBufferSize + facesBufferSize + faceTranslationTableSize + translationTableSize;
+ mOutMemoryBuffer = reinterpret_cast<PxU8*>(PX_ALLOC_TEMP(bufferMemorySize, "ConvexMeshDesc"));
+
+ PxU32* indices = reinterpret_cast<PxU32*> (mOutMemoryBuffer);
+ PxVec3* vertices = reinterpret_cast<PxVec3*> (mOutMemoryBuffer + indicesBufferSize);
+ PxHullPolygon* polygons = reinterpret_cast<PxHullPolygon*> (mOutMemoryBuffer + indicesBufferSize + verticesBufferSize);
+ mFaceTranslateTable = reinterpret_cast<PxU16*> (mOutMemoryBuffer + indicesBufferSize + verticesBufferSize + facesBufferSize);
+ PxI32* translateTable = reinterpret_cast<PxI32*> (mOutMemoryBuffer + indicesBufferSize + verticesBufferSize + facesBufferSize + faceTranslationTableSize);
PxMemSet(translateTable,-1,mQuickHull->mNumVertices*sizeof(PxU32));
- // allocate additional vec3 for V4 safe load in VolumeInteration
- PxVec3* vertices = reinterpret_cast<PxVec3*> (PX_ALLOC_TEMP(sizeof(PxVec3)*mQuickHull->mNumVertices + 1, "PxVec3"));
- PxHullPolygon* polygons = reinterpret_cast<PxHullPolygon*> (PX_ALLOC_TEMP(sizeof(PxHullPolygon)*numFacesOut, "PxHullPolygon"));
// go over the hullPolygons and mark valid vertices, create translateTable
PxU32 numVertices = 0;
@@ -2380,12 +2453,13 @@ void QuickHullConvexHullLib::fillConvexMeshDescFromQuickHull(PxConvexMeshDesc& d
faceIndex = (i == largestFace) ? 0 : i;
}
- const local::QuickHullFace& face = *mQuickHull->mHullFaces[faceIndex];
+ local::QuickHullFace& face = *mQuickHull->mHullFaces[faceIndex];
if(face.state == local::QuickHullFace::eVISIBLE)
{
//create index data
local::QuickHullHalfEdge* he = face.edge;
PxU32 index = 0;
+ he->edgeIndex = 0xFFFFFFFF;
indices[index + indexOffset] = PxU32(translateTable[he->tail.index]);
index++;
he = he->next;
@@ -2393,6 +2467,7 @@ void QuickHullConvexHullLib::fillConvexMeshDescFromQuickHull(PxConvexMeshDesc& d
{
indices[index + indexOffset] = PxU32(translateTable[he->tail.index]);
index++;
+ he->edgeIndex = 0xFFFFFFFF;
he = he->next;
}
@@ -2407,17 +2482,13 @@ void QuickHullConvexHullLib::fillConvexMeshDescFromQuickHull(PxConvexMeshDesc& d
polygon.mNbVerts = face.numEdges;
indexOffset += face.numEdges;
polygons[numFacesOut] = polygon;
+ mFaceTranslateTable[numFacesOut] = Ps::to16(faceIndex);
+ face.outIndex = Ps::to8(numFacesOut);
numFacesOut++;
}
}
- PX_ASSERT(mQuickHull->mNumHullFaces == numFacesOut);
-
- mVertsOut = vertices;
- mIndicesOut = indices;
- mPolygonsOut = polygons;
-
- PX_FREE(translateTable);
+ PX_ASSERT(mQuickHull->mNumHullFaces == numFacesOut);
}
//////////////////////////////////////////////////////////////////////////
@@ -2426,17 +2497,21 @@ void QuickHullConvexHullLib::fillConvexMeshDescFromCroppedHull(PxConvexMeshDesc&
{
PX_ASSERT(mCropedConvexHull);
- // parse the hullOut and fill the result with vertices and polygons
- mIndicesOut = reinterpret_cast<PxU32*> (PX_ALLOC_TEMP(sizeof(PxU32)*(mCropedConvexHull->getEdges().size()), "PxU32"));
- PxU32 numIndices = mCropedConvexHull->getEdges().size();
-
- PxU32 numPolygons = mCropedConvexHull->getFacets().size();
- mPolygonsOut = reinterpret_cast<PxHullPolygon*> (PX_ALLOC_TEMP(sizeof(PxHullPolygon)*numPolygons, "PxHullPolygon"));
+ // allocate the output buffers
+ const PxU32 numIndices = mCropedConvexHull->getEdges().size();
+ const PxU32 numPolygons = mCropedConvexHull->getFacets().size();
+ const PxU32 numVertices = mCropedConvexHull->getVertices().size();
+ const PxU32 indicesBufferSize = sizeof(PxU32)*numIndices;
+ const PxU32 facesBufferSize = sizeof(PxHullPolygon)*numPolygons;
+ const PxU32 verticesBufferSize = sizeof(PxVec3)*numVertices + 1; // allocate additional vec3 for V4 safe load in VolumeInteration
+ const PxU32 bufferMemorySize = indicesBufferSize + verticesBufferSize + facesBufferSize;
+ mOutMemoryBuffer = reinterpret_cast<PxU8*>(PX_ALLOC_TEMP(bufferMemorySize, "ConvexMeshDesc"));
- // allocate additional vec3 for V4 safe load in VolumeInteration
- mVertsOut = reinterpret_cast<PxVec3*> (PX_ALLOC_TEMP(sizeof(PxVec3)*mCropedConvexHull->getVertices().size() + 1, "PxVec3"));
- PxU32 numVertices = mCropedConvexHull->getVertices().size();
- PxMemCopy(mVertsOut, mCropedConvexHull->getVertices().begin(), sizeof(PxVec3)*numVertices);
+ // parse the hullOut and fill the result with vertices and polygons
+ PxU32* indicesOut = reinterpret_cast<PxU32*> (mOutMemoryBuffer);
+ PxHullPolygon* polygonsOut = reinterpret_cast<PxHullPolygon*> (mOutMemoryBuffer + indicesBufferSize);
+ PxVec3* vertsOut = reinterpret_cast<PxVec3*> (mOutMemoryBuffer + indicesBufferSize + facesBufferSize);
+ PxMemCopy(vertsOut, mCropedConvexHull->getVertices().begin(), sizeof(PxVec3)*numVertices);
PxU32 i = 0;
PxU32 k = 0;
@@ -2444,7 +2519,7 @@ void QuickHullConvexHullLib::fillConvexMeshDescFromCroppedHull(PxConvexMeshDesc&
while (i < mCropedConvexHull->getEdges().size())
{
j = 1;
- PxHullPolygon& polygon = mPolygonsOut[k];
+ PxHullPolygon& polygon = polygonsOut[k];
// get num indices per polygon
while (j + i < mCropedConvexHull->getEdges().size() && mCropedConvexHull->getEdges()[i].p == mCropedConvexHull->getEdges()[i + j].p)
{
@@ -2462,7 +2537,7 @@ void QuickHullConvexHullLib::fillConvexMeshDescFromCroppedHull(PxConvexMeshDesc&
while (j--)
{
- mIndicesOut[i] = mCropedConvexHull->getEdges()[i].v;
+ indicesOut[i] = mCropedConvexHull->getEdges()[i].v;
i++;
}
k++;
@@ -2472,15 +2547,15 @@ void QuickHullConvexHullLib::fillConvexMeshDescFromCroppedHull(PxConvexMeshDesc&
outDesc.indices.count = numIndices;
outDesc.indices.stride = sizeof(PxU32);
- outDesc.indices.data = mIndicesOut;
+ outDesc.indices.data = indicesOut;
outDesc.points.count = numVertices;
outDesc.points.stride = sizeof(PxVec3);
- outDesc.points.data = mVertsOut;
+ outDesc.points.data = vertsOut;
outDesc.polygons.count = numPolygons;
outDesc.polygons.stride = sizeof(PxHullPolygon);
- outDesc.polygons.data = mPolygonsOut;
+ outDesc.polygons.data = polygonsOut;
swapLargestFace(outDesc);
}
diff --git a/PhysX_3.4/Source/PhysXCooking/src/convex/QuickHullConvexHullLib.h b/PhysX_3.4/Source/PhysXCooking/src/convex/QuickHullConvexHullLib.h
index b8e657a9..0a9df992 100644
--- a/PhysX_3.4/Source/PhysXCooking/src/convex/QuickHullConvexHullLib.h
+++ b/PhysX_3.4/Source/PhysXCooking/src/convex/QuickHullConvexHullLib.h
@@ -66,6 +66,9 @@ namespace physx
// fills the convexmeshdesc with computed hull data
virtual void fillConvexMeshDesc(PxConvexMeshDesc& desc);
+ // provide the edge list information
+ virtual bool createEdgeList(const PxU32, const PxU8* , PxU8** , PxU16** , PxU16** );
+
protected:
// if vertex limit reached we need to expand the hull using the OBB slicing
PxConvexMeshCookingResult::Enum expandHullOBB();
@@ -88,9 +91,8 @@ namespace physx
local::QuickHull* mQuickHull; // the internal quick hull representation
ConvexHull* mCropedConvexHull; //the hull cropped from OBB, used for vertex limit path
- PxVec3* mVertsOut; // vertices for output
- PxU32* mIndicesOut; // inidices for output
- PxHullPolygon* mPolygonsOut; // polygons for output
+ PxU8* mOutMemoryBuffer; // memory buffer used for output data
+ PxU16* mFaceTranslateTable; // translation table mapping output faces to internal quick hull table
};
}