public void BallIterator(cpBody body, cpArbiter arb, ref int count) { cpShape ball, other; arb.GetShapes(out ball, out other); draw.Add(other.bb); count++; }
static bool preSolve(cpArbiter arb, cpSpace space, object o) { cpShape a, b; arb.GetShapes(out a, out b); OneWayPlatform platform = (OneWayPlatform)a.userData; // (OneWayPlatform*)cpShapeGetUserData(a); if (cpVect.cpvdot(arb.GetNormal(), platform.n) < 0) { arb.Ignore(); // cpArbiterIgnore(arb); return(false); } return(true); }
public static bool CollisionBeginCallbackFunc(cpArbiter arb, cpSpace space, CCPhysicsWorld world) { cpShape a, b; arb.GetShapes(out a, out b); CCPhysicsShapeInfo ita = null, itb = null; cp.AssertWarn(CCPhysicsShapeInfo.Map.TryGetValue(a, out ita) && CCPhysicsShapeInfo.Map.TryGetValue(b, out itb)); if (a != null || b != null) { return(false); } CCPhysicsContact contact = new CCPhysicsContact(ita.getShape(), itb.getShape()); arb.data = contact; contact._contactInfo = arb; return(world.CollisionBeginCallback(contact)); }
public bool waterPreSolve(cpArbiter arb, cpSpace space, object o) { cpShape obj1, obj2; arb.GetShapes(out obj1, out obj2); cpPolyShape water = obj1 as cpPolyShape; cpPolyShape poly = obj2 as cpPolyShape; cpBody body = poly.GetBody(); float level = water.GetBB().t; // cpShapeGetBB().t; int count = poly.Count; //cpPolyShapeGetCount(poly.g); int clippedCount = 0; cpVect[] clipped = new cpVect[10]; for (int i = 0, j = count - 1; i < count; j = i, i++) { cpVect a = body.LocalToWorld(poly.GetVert(j)); cpVect b = body.LocalToWorld(poly.GetVert(i)); if (a.y < level) { clipped[clippedCount] = a; clippedCount++; } float a_level = a.y - level; float b_level = b.y - level; if (a_level * b_level < 0.0f) { float t = cp.cpfabs(a_level) / (cp.cpfabs(a_level) + cp.cpfabs(b_level)); clipped[clippedCount] = cpVect.cpvlerp(a, b, t); clippedCount++; } } // Calculate buoyancy from the clipped polygon area float clippedArea = cp.AreaForPoly(clippedCount, clipped, 0.0f); float displacedMass = clippedArea * FLUID_DENSITY; cpVect centroid = cp.CentroidForPoly(clippedCount, clipped); //ChipmunkDebugDrawPolygon(clippedCount, clipped, 0.0f, RGBAColor(0, 0, 1, 1), RGBAColor(0, 0, 1, 0.1f)); //ChipmunkDebugDrawDot(5, centroid, RGBAColor(0, 0, 1, 1)); float dt = space.GetCurrentTimeStep(); cpVect g = space.GetGravity(); // Apply the buoyancy force as an impulse. body.ApplyImpulseAtWorldPoint(cpVect.cpvmult(g, -displacedMass * dt), centroid); // Apply linear damping for the fluid drag. cpVect v_centroid = body.GetVelocityAtWorldPoint(centroid); float k = k_scalar_body(body, centroid, cpVect.cpvnormalize(v_centroid)); float damping = clippedArea * FLUID_DRAG * FLUID_DENSITY; float v_coef = cp.cpfexp(-damping * dt * k); // linear drag // cpfloat v_coef = 1.0/(1.0 + damping*dt*cpvlength(v_centroid)*k); // quadratic drag body.ApplyImpulseAtWorldPoint(cpVect.cpvmult(cpVect.cpvsub(cpVect.cpvmult(v_centroid, v_coef), v_centroid), 1.0f / k), centroid); // Apply angular damping for the fluid drag. cpVect cog = body.LocalToWorld(body.GetCenterOfGravity()); float w_damping = cp.MomentForPoly(FLUID_DRAG * FLUID_DENSITY * clippedArea, clippedCount, clipped, cpVect.cpvneg(cog), 0.0f); body.SetAngularVelocity(body.GetAngularVelocity() * cp.cpfexp(-w_damping * dt / body.GetMoment())); return(true); }