/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // compute polygons from given triangles. This is support function used in extensions. We do not accept triangles as an input for convex mesh desc. bool ConvexMeshBuilder::computeHullPolygons(const PxU32& nbVerts,const PxVec3* verts, const PxU32& nbTriangles, const PxU32* triangles, PxAllocatorCallback& inAllocator, PxU32& outNbVerts, PxVec3*& outVertices , PxU32& nbIndices, PxU32*& indices, PxU32& nbPolygons, PxHullPolygon*& polygons) { if(!hullBuilder.computeHullPolygons(nbVerts,verts,nbTriangles,triangles)) { Ps::getFoundation().error(PxErrorCode::eINTERNAL_ERROR, __FILE__, __LINE__, "ConvexMeshBuilder::computeHullPolygons: compute convex hull polygons failed. Provided triangles dont form a convex hull."); return false; } outNbVerts = hullBuilder.mHull->mNbHullVertices; nbPolygons = hullBuilder.mHull->mNbPolygons; outVertices = reinterpret_cast<PxVec3*>(inAllocator.allocate(outNbVerts*sizeof(PxVec3),"PxVec3",__FILE__,__LINE__)); PxMemCopy(outVertices,hullBuilder.mHullDataHullVertices,outNbVerts*sizeof(PxVec3)); nbIndices = 0; for (PxU32 i = 0; i < nbPolygons; i++) { nbIndices += hullBuilder.mHullDataPolygons[i].mNbVerts; } indices = reinterpret_cast<PxU32*>(inAllocator.allocate(nbIndices*sizeof(PxU32),"PxU32",__FILE__,__LINE__)); for (PxU32 i = 0; i < nbIndices; i++) { indices[i] = hullBuilder.mHullDataVertexData8[i]; } polygons = reinterpret_cast<PxHullPolygon*>(inAllocator.allocate(nbPolygons*sizeof(PxHullPolygon),"PxHullPolygon",__FILE__,__LINE__)); for (PxU32 i = 0; i < nbPolygons; i++) { const Gu::HullPolygonData& polygonData = hullBuilder.mHullDataPolygons[i]; PxHullPolygon& outPolygon = polygons[i]; outPolygon.mPlane[0] = polygonData.mPlane.n.x; outPolygon.mPlane[1] = polygonData.mPlane.n.y; outPolygon.mPlane[2] = polygonData.mPlane.n.z; outPolygon.mPlane[3] = polygonData.mPlane.d; outPolygon.mNbVerts = polygonData.mNbVerts; outPolygon.mIndexBase = polygonData.mVRef8; for (PxU32 j = 0; j < polygonData.mNbVerts; j++) { PX_ASSERT(indices[outPolygon.mIndexBase + j] == hullBuilder.mHullDataVertexData8[polygonData.mVRef8+j]); } } return true; }
void reserve() { if (count+1 > capacity) { PxU32 oldCapacity = capacity; capacity = NextPowerOfTwo(capacity+1); Controller **newData = (Controller**)mAllocator->allocate(capacity*sizeof(Controller*), 0, __FILE__, __LINE__); Ps::memCopy(newData,data,oldCapacity*sizeof(Controller*)); if(data) mAllocator->deallocate(data); data = newData; } }