コード例 #1
0
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;
}
コード例 #2
0
 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;
 }
コード例 #3
0
ファイル: carbiter.cpp プロジェクト: dogtwelve/eepp
cVect cArbiter::GetPoint( int i ) {
	return tovect( cpArbiterGetPoint( mArbiter, i ) );
}
コード例 #4
0
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;
}
コード例 #5
0
ファイル: cpArbiter-lua.c プロジェクト: balijanos/rpi64
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;
}
コード例 #6
0
ファイル: arbitros.c プロジェクト: segafan/bennugd-monolithic
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;
}