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);
		}
	}