void PhysicsContact::generateContactData() { if (_contactInfo == nullptr) { return; } cpArbiter* arb = static_cast<cpArbiter*>(_contactInfo); CC_SAFE_DELETE(_preContactData); _preContactData = _contactData; _contactData = new (std::nothrow) PhysicsContactData(); _contactData->count = cpArbiterGetCount(arb); for (int i=0; i<_contactData->count && i<PhysicsContactData::POINT_MAX; ++i) { _contactData->points[i] = PhysicsHelper::cpv2point(cpArbiterGetPoint(arb, i)); } _contactData->normal = _contactData->count > 0 ? PhysicsHelper::cpv2point(cpArbiterGetNormal(arb, 0)) : Vec2::ZERO; }
int MagneticGripperGrippableCollisionPreSolve(cpArbiter* pt_arb, cpSpace* pt_space, void* p_data) { /* Get the shapes involved */ CP_ARBITER_GET_SHAPES(pt_arb, ptGripperShape, ptGrippableShape); /* Get a reference to the gripper data */ SDynamics2DEngineGripperData& sGripperData = *reinterpret_cast<SDynamics2DEngineGripperData*>(ptGripperShape->data); /* The gripper is locked or unlocked? */ if(sGripperData.GripperEntity.IsUnlocked()) { /* The gripper is locked. If it was gripping an object, * release it. Then, process the collision normally */ if(sGripperData.GripperEntity.IsGripping()) { sGripperData.ClearConstraints(); } return 1; } else if(! sGripperData.GripperEntity.IsGripping()) { /* The gripper is unlocked and free, create the joints */ /* Prevent gripper from slipping */ pt_arb->e = 0.0f; // No elasticity pt_arb->u = 1.0f; // Max friction pt_arb->surface_vr = cpvzero; // No surface velocity /* Calculate the anchor point on the grippable body as the centroid of the contact points */ cpVect tGrippableAnchor = cpvzero; for(SInt32 i = 0; i < pt_arb->numContacts; ++i) { tGrippableAnchor = cpvadd(tGrippableAnchor, cpArbiterGetPoint(pt_arb, i)); } tGrippableAnchor = cpvmult(tGrippableAnchor, 1.0f / pt_arb->numContacts); /* Create a constraint */ sGripperData.GripConstraint = cpSpaceAddConstraint(pt_space, cpPivotJointNew( ptGripperShape->body, ptGrippableShape->body, tGrippableAnchor)); sGripperData.GripConstraint->biasCoef = 0.95f; // Correct overlap sGripperData.GripConstraint->maxBias = 0.01f; // Max correction speed sGripperData.GripperEntity.SetGrippedEntity(*reinterpret_cast<CEmbodiedEntity*>(ptGrippableShape->data)); } /* Ignore the collision, the objects are gripped already */ return 0; }
cVect cArbiter::GetPoint( int i ) { return tovect( cpArbiterGetPoint( mArbiter, i ) ); }
JNIEXPORT jfloat JNICALL Java_com_wiyun_engine_chipmunk_Arbiter_getContactPointX (JNIEnv * env, jobject thiz, jint contactIndex) { cpArbiter* arb = (cpArbiter*)env->GetIntField(thiz, g_fid_Arbiter_mPointer); cpVect v = cpArbiterGetPoint(arb, contactIndex); return v.x; }
static int cpArbiter_getPoint(lua_State *L) { cpArbiter *arb = toarbiter(L); int i = luaL_checkint(L, 2); push_cpVect(L, cpArbiterGetPoint(arb, i)); return 2; }
int modArbiterGetPoint(INSTANCE * my, int * params){ cpVect v=cpArbiterGetPoint((cpArbiter *)params[0],params[1]); *(float*)params[2]=v.x; *(float*)params[3]=v.y; return 1; }