int i = proxy.index; Vec2 pos = m_positionBuffer.data[i]; proxy.tag = computeTag(m_inverseDiameter * pos.x, m_inverseDiameter * pos.y); for (int i = 0; i < m_proxyCount; i++) { Proxy a = m_proxyBuffer[i]; long rightTag = computeRelativeTag(a.tag, 1, 0); for (int j = i + 1; j < m_proxyCount; j++) { Proxy b = m_proxyBuffer[j]; break; addContact(a.index, b.index); long bottomLeftTag = computeRelativeTag(a.tag, -1, 1); for (; c_index < m_proxyCount; c_index++) { Proxy c = m_proxyBuffer[c_index]; long bottomRightTag = computeRelativeTag(a.tag, 1, 1); break; addContact(a.index, b.index);
/** * @return the kinetic energy that can be lost by damping force */ public float computeParticleCollisionEnergy() { return particleSystem.computeParticleCollisionEnergy(); }
/** * Create a particle whose properties have been defined. No reference to the definition is * retained. A simulation step must occur before it's possible to interact with a newly created * particle. For example, DestroyParticleInShape() will not destroy a particle until Step() has * been called. This function is locked during callbacks. * * @return the index of the particle. */ public int createParticle(ParticleDef def) { assertNotLocked(); return particleSystem.createParticle(def); }
public void queryAABB(ParticleQueryCallback callback, final AABB aabb) { if (m_proxyCount == 0) { return; } final float lowerBoundX = aabb.lowerBound.x; final float lowerBoundY = aabb.lowerBound.y; final float upperBoundX = aabb.upperBound.x; final float upperBoundY = aabb.upperBound.y; int firstProxy = lowerBound(m_proxyBuffer, m_proxyCount, computeTag(m_inverseDiameter * lowerBoundX, m_inverseDiameter * lowerBoundY)); int lastProxy = upperBound(m_proxyBuffer, m_proxyCount, computeTag(m_inverseDiameter * upperBoundX, m_inverseDiameter * upperBoundY)); for (int proxy = firstProxy; proxy < lastProxy; ++proxy) { int i = m_proxyBuffer[proxy].index; final Vec2 p = m_positionBuffer.data[i]; if (lowerBoundX < p.x && p.x < upperBoundX && lowerBoundY < p.y && p.y < upperBoundY) { if (!callback.reportParticle(i)) { break; } } } }
public void joinParticleGroups(ParticleGroup groupA, ParticleGroup groupB) { assert (groupA != groupB); RotateBuffer(groupB.m_firstIndex, groupB.m_lastIndex, m_count); assert (groupB.m_lastIndex == m_count); RotateBuffer(groupA.m_firstIndex, groupA.m_lastIndex, groupB.m_firstIndex); assert (groupA.m_lastIndex == groupB.m_firstIndex); updateContacts(true); if ((particleFlags & k_pairFlags) != 0) { for (int k = 0; k < m_contactCount; k++) { diagram.generate(getParticleStride() / 2); JoinParticleGroupsCallback callback = new JoinParticleGroupsCallback(); callback.system = this; groupA.m_lastIndex = groupB.m_lastIndex; groupB.m_firstIndex = groupB.m_lastIndex; destroyParticleGroup(groupB); computeDepthForGroup(groupA);
public ParticleGroup createParticleGroup(ParticleGroupDef groupDef) { float stride = getParticleStride(); final Transform identity = tempTransform; identity.setIdentity(); Vec2.crossToOutUnsafe(groupDef.getAngularVelocity(), p, particleDef.velocity); particleDef.velocity.addLocal(groupDef.getLinearVelocity()); createParticle(particleDef); updateContacts(true); if ((groupDef.getTypeFlags() & k_pairFlags) != 0) { for (int k = 0; k < m_contactCount; k++) { computeDepthForGroup(group);
final float aabbupperBoundy = aabb.upperBound.y + system.m_particleDiameter; int firstProxy = lowerBound( system.m_proxyBuffer, system.m_proxyCount, computeTag(system.m_inverseDiameter * aabblowerBoundx, system.m_inverseDiameter upperBound( system.m_proxyBuffer, system.m_proxyCount, computeTag(system.m_inverseDiameter * aabbupperBoundx, system.m_inverseDiameter av.x = vx; av.y = vy; final float particleMass = system.getParticleMass(); final float ax = particleMass * (av.x - vx); final float ay = particleMass * (av.y - vy);
final float aabbupperBoundy = aabb.upperBound.y + system.m_particleDiameter; int firstProxy = lowerBound( system.m_proxyBuffer, system.m_proxyCount, computeTag(system.m_inverseDiameter * aabblowerBoundx, system.m_inverseDiameter upperBound( system.m_proxyBuffer, system.m_proxyCount, computeTag(system.m_inverseDiameter * aabbupperBoundx, system.m_inverseDiameter float invAm = (system.m_flagsBuffer.data[a] & ParticleTypeInternal.b2_wallParticle) != 0 ? 0 : system .getParticleInvMass(); final float rpx = ap.x - bp.x; final float rpy = ap.y - bp.y;
system.m_proxyBuffer, system.m_proxyCount, computeTag(system.m_inverseDiameter * aabblowerBoundx, system.m_inverseDiameter system.m_proxyBuffer, system.m_proxyCount, computeTag(system.m_inverseDiameter * aabbupperBoundx, system.m_inverseDiameter av.x = vx; av.y = vy; final float particleMass = system.getParticleMass(); final float ax = particleMass * (av.x - vx); final float ay = particleMass * (av.y - vy);
system.m_proxyBuffer, system.m_proxyCount, computeTag(system.m_inverseDiameter * aabblowerBoundx, system.m_inverseDiameter system.m_proxyBuffer, system.m_proxyCount, computeTag(system.m_inverseDiameter * aabbupperBoundx, system.m_inverseDiameter float invAm = (system.m_flagsBuffer.data[a] & ParticleTypeInternal.b2_wallParticle) != 0 ? 0 : system .getParticleInvMass(); final float rpx = ap.x - bp.x; final float rpy = ap.y - bp.y;
public void destroyParticlesInGroup(ParticleGroup group, boolean callDestructionListener) { for (int i = group.m_firstIndex; i < group.m_lastIndex; i++) { destroyParticle(i, callDestructionListener); } }
/** * Create a particle group whose properties have been defined. No reference to the definition is * retained. This function is locked during callbacks. * * @param def particle group definition * @return particle group */ public ParticleGroup createParticleGroup(ParticleGroupDef def) { assertNotLocked(); return particleSystem.createParticleGroup(def); }
private World(Vec2 gravity, IWorldPool pool, BroadPhase broadPhase) { this.pool = pool; this.gravity.set(gravity); contactManager = new ContactManager(pool, broadPhase); particleSystem = new ParticleSystem(this); }
public void joinParticleGroups(ParticleGroup groupA, ParticleGroup groupB) { assert (groupA != groupB); RotateBuffer(groupB.m_firstIndex, groupB.m_lastIndex, m_count); assert (groupB.m_lastIndex == m_count); RotateBuffer(groupA.m_firstIndex, groupA.m_lastIndex, groupB.m_firstIndex); assert (groupA.m_lastIndex == groupB.m_firstIndex); updateContacts(true); if ((particleFlags & k_pairFlags) != 0) { for (int k = 0; k < m_contactCount; k++) { diagram.generate(getParticleStride() / 2); JoinParticleGroupsCallback callback = new JoinParticleGroupsCallback(); callback.system = this; groupA.m_lastIndex = groupB.m_lastIndex; groupB.m_firstIndex = groupB.m_lastIndex; destroyParticleGroup(groupB); computeDepthForGroup(groupA);
public void queryAABB(ParticleQueryCallback callback, final AABB aabb) { if (m_proxyCount == 0) { return; } final float lowerBoundX = aabb.lowerBound.x; final float lowerBoundY = aabb.lowerBound.y; final float upperBoundX = aabb.upperBound.x; final float upperBoundY = aabb.upperBound.y; int firstProxy = lowerBound(m_proxyBuffer, m_proxyCount, computeTag(m_inverseDiameter * lowerBoundX, m_inverseDiameter * lowerBoundY)); int lastProxy = upperBound(m_proxyBuffer, m_proxyCount, computeTag(m_inverseDiameter * upperBoundX, m_inverseDiameter * upperBoundY)); for (int proxy = firstProxy; proxy < lastProxy; ++proxy) { int i = m_proxyBuffer[proxy].index; final Vec2 p = m_positionBuffer.data[i]; if (lowerBoundX < p.x && p.x < upperBoundX && lowerBoundY < p.y && p.y < upperBoundY) { if (!callback.reportParticle(i)) { break; } } } }
public ParticleGroup createParticleGroup(ParticleGroupDef groupDef) { float stride = getParticleStride(); final Transform identity = tempTransform; identity.setIdentity(); Vec2.crossToOutUnsafe(groupDef.getAngularVelocity(), p, particleDef.velocity); particleDef.velocity.addLocal(groupDef.getLinearVelocity()); createParticle(particleDef); updateContacts(true); if ((groupDef.getTypeFlags() & k_pairFlags) != 0) { for (int k = 0; k < m_contactCount; k++) { computeDepthForGroup(group);
/** * Destroy a particle. The particle is removed after the next step. * * @param index of the particle to destroy * @param callDestructionListener whether to call the destruction listener just before the particle is destroyed */ public void destroyParticle(int index, boolean callDestructionListener) { particleSystem.destroyParticle(index, callDestructionListener); }
/** * Create a particle group whose properties have been defined. No reference to the definition is * retained. This function is locked during callbacks. * * @param def particle group definition * @return particle group */ public ParticleGroup createParticleGroup(ParticleGroupDef def) { assertNotLocked(); return particleSystem.createParticleGroup(def); }
private World(Vec2 gravity, IWorldPool pool, BroadPhase broadPhase) { this.pool = pool; this.gravity.set(gravity); contactManager = new ContactManager(pool, broadPhase); particleSystem = new ParticleSystem(this); }
lowerBound( m_proxyBuffer, m_proxyCount, computeTag(m_inverseDiameter * JBoxUtils.min(point1.x, point2.x) - 1, m_inverseDiameter * JBoxUtils.min(point1.y, point2.y) - 1)); int lastProxy = upperBound( m_proxyBuffer, m_proxyCount, computeTag(m_inverseDiameter * JBoxUtils.max(point1.x, point2.x) + 1, m_inverseDiameter * JBoxUtils.max(point1.y, point2.y) + 1)); float fraction = 1;