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