Polygon::Polygon(ShapePolygon *src, float mass){
    std::vector<glm::vec2> ofVerts = src->getPoints();
    std::vector<cpVect> verts = toChipmunk(ofVerts);
	cpFloat moment = cpMomentForPoly(mass, verts.size(), verts.data(), cpvzero, cpPolyShapeGetRadius(src->shape));
    DynamicBody::setup(cpShapeGetSpace(src->shape), mass, moment);
    cpSpaceRemoveShape(cpShapeGetSpace(src->shape), src->shape);
    ShapePolygon::setup(src);
    cpShapeSetBody(shape, body);
    cpSpaceAddShape(cpBodyGetSpace(body), shape);
}
float PhysicsShapePolygon::calculateArea()
{
    auto shape = _cpShapes.front();
    int count = cpPolyShapeGetCount(shape);
    cpVect* vecs = new cpVect[count];
    for(int i=0;i<count;++i)
        vecs[i] = cpPolyShapeGetVert(shape, i);
    float area = PhysicsHelper::cpfloat2float(cpAreaForPoly(count, vecs, cpPolyShapeGetRadius(shape)));
    CC_SAFE_DELETE_ARRAY(vecs);
    return area;
}
float PhysicsShapePolygon::calculateDefaultMoment()
{
    if(_mass == PHYSICS_INFINITY)
    {
        return PHYSICS_INFINITY;
    }
    else
    {
        auto shape = _cpShapes.front();
        int count = cpPolyShapeGetCount(shape);
        cpVect* vecs = new cpVect[count];
        for(int i=0;i<count;++i)
            vecs[i] = cpPolyShapeGetVert(shape, i);
        float moment = PhysicsHelper::cpfloat2float(cpMomentForPoly(_mass, count, vecs, cpvzero, cpPolyShapeGetRadius(shape)));
        CC_SAFE_DELETE_ARRAY(vecs);
        return moment;
    }
}