static void _set_type(PhysicsInfo *info, PhysicsBody type) { if (info->type == type) return; /* already set */ info->type = type; switch (type) { case PB_KINEMATIC: info->last_pos = cpBodyGetPos(info->body); info->last_ang = cpBodyGetAngle(info->body); /* fall through */ case PB_STATIC: if (!cpBodyIsStatic(info->body)) { cpSpaceRemoveBody(space, info->body); cpSpaceConvertBodyToStatic(space, info->body); } break; case PB_DYNAMIC: cpSpaceConvertBodyToDynamic(space, info->body, info->mass, 1.0); cpSpaceAddBody(space, info->body); _recalculate_moment(info); break; } }
void PhysicsBody::setDynamic(bool dynamic) { if (dynamic != _dynamic) { _dynamic = dynamic; if (dynamic) { if (_world && _cpBody->CP_PRIVATE(space)) { cpSpaceConvertBodyToDynamic(_world->_cpSpace, _cpBody, _mass, _moment); cpSpaceAddBody(_world->_cpSpace, _cpBody); } else { cpBodySetMass(_cpBody, _mass); cpBodySetMoment(_cpBody, _moment); } } else { if (_world && _cpBody->CP_PRIVATE(space)) { cpSpaceRemoveBody(_world->_cpSpace, _cpBody); cpSpaceConvertBodyToStatic(_world->_cpSpace, _cpBody); } else { cpBodySetMass(_cpBody, PHYSICS_INFINITY); cpBodySetMoment(_cpBody, PHYSICS_INFINITY); cpBodySetVel(_cpBody, cpvzero); cpBodySetAngVel(_cpBody, 0.0); } } } }
static void update(cpSpace *space, double dt) { if(ChipmunkDemoRightDown){ cpShape *nearest = cpSpaceNearestPointQueryNearest(space, ChipmunkDemoMouse, 0.0, GRABABLE_MASK_BIT, CP_NO_GROUP, NULL); if(nearest){ cpBody *body = cpShapeGetBody(nearest); if(cpBodyIsStatic(body)){ cpSpaceConvertBodyToDynamic(space, body, pentagon_mass, pentagon_moment); cpSpaceAddBody(space, body); } else { cpSpaceRemoveBody(space, body); cpSpaceConvertBodyToStatic(space, body); } } } cpSpaceStep(space, dt); cpSpaceEachBody(space, &eachBody, NULL); }