void CollisionConvexHullShape::initializeConvexHullReduced() { if(minDistanceToCenter > getInnerMargin()) { convexHullShapeReduced = convexHullShape->resize(-getInnerMargin()); }else { //impossible to shrink the convex hull correctly refreshInnerMargin(0.0f); } }
std::shared_ptr<CollisionConvexObject3D> CollisionConvexHullShape::toConvexObject(const PhysicsTransform &physicsTransform) const { ConvexHull3D<float> convexHullWithMargin = transformConvexHull(convexHull, physicsTransform); if(convexHullReduced.get()==nullptr) { //impossible to compute convex hull without margin => use convex hull with margin and set a margin of 0.0 return std::make_shared<CollisionConvexHullObject>(getInnerMargin(), convexHullWithMargin, convexHullWithMargin); } ConvexHull3D<float> convexHullWithoutMargin = transformConvexHull(*convexHullReduced.get(), physicsTransform); return std::make_shared<CollisionConvexHullObject>(getInnerMargin(), convexHullWithMargin, convexHullWithoutMargin); }
std::unique_ptr<CollisionConvexObject3D, ObjectDeleter> CollisionConvexHullShape::toConvexObject(const PhysicsTransform &physicsTransform) const { Transform<float> transform = physicsTransform.toTransform(); auto convexHullWithMargin = std::shared_ptr<ConvexHull3D<float>>(dynamic_cast<ConvexHull3D<float>*>(convexHullShape->toConvexObject(transform).release())); void *memPtr = getObjectsPool()->allocate(sizeof(CollisionConvexHullObject)); if(!convexHullShapeReduced) { //impossible to compute convex hull without margin => use convex hull with margin and set a margin of 0.0 #ifdef _DEBUG assert(getInnerMargin()==0.0f); #endif const std::shared_ptr<ConvexHull3D<float>> &convexHullWithoutMargin(convexHullWithMargin); auto *collisionObjectPtr = new (memPtr) CollisionConvexHullObject(getInnerMargin(), convexHullWithMargin, convexHullWithoutMargin); return std::unique_ptr<CollisionConvexHullObject, ObjectDeleter>(collisionObjectPtr); } auto convexHullWithoutMargin = std::shared_ptr<ConvexHull3D<float>>(dynamic_cast<ConvexHull3D<float>*>(convexHullShapeReduced->toConvexObject(transform).release())); auto *collisionObjectPtr = new (memPtr) CollisionConvexHullObject(getInnerMargin(), convexHullWithMargin, convexHullWithoutMargin); return std::unique_ptr<CollisionConvexHullObject, ObjectDeleter>(collisionObjectPtr); }
void CollisionConvexHullShape::intializeConvexHullReduced() { convexHullReduced = ResizeConvexHullService::instance()->resizeConvexHull(convexHull, -getInnerMargin()); if(convexHullReduced.get()==nullptr) { //impossible to shrink the convex hull correctly refreshInnerMargin(0.0); } }