use of org.jbox2d.common.Vec2 in project libgdx by libgdx.
the class ParticleSystem method solveDamping.
void solveDamping(TimeStep step) {
// reduces normal velocity of each contact
float damping = m_dampingStrength;
for (int k = 0; k < m_bodyContactCount; k++) {
final ParticleBodyContact contact = m_bodyContactBuffer[k];
int a = contact.index;
Body b = contact.body;
float w = contact.weight;
float m = contact.mass;
Vec2 n = contact.normal;
Vec2 p = m_positionBuffer.data[a];
final float tempX = p.x - b.m_sweep.c.x;
final float tempY = p.y - b.m_sweep.c.y;
final Vec2 velA = m_velocityBuffer.data[a];
// getLinearVelocityFromWorldPointToOut, with -= velA
float vx = -b.m_angularVelocity * tempY + b.m_linearVelocity.x - velA.x;
float vy = b.m_angularVelocity * tempX + b.m_linearVelocity.y - velA.y;
// done
float vn = vx * n.x + vy * n.y;
if (vn < 0) {
final Vec2 f = tempVec;
f.x = damping * w * m * vn * n.x;
f.y = damping * w * m * vn * n.y;
final float invMass = getParticleInvMass();
velA.x += invMass * f.x;
velA.y += invMass * f.y;
f.x = -f.x;
f.y = -f.y;
b.applyLinearImpulse(f, p, true);
}
}
for (int k = 0; k < m_contactCount; k++) {
final ParticleContact contact = m_contactBuffer[k];
int a = contact.indexA;
int b = contact.indexB;
float w = contact.weight;
Vec2 n = contact.normal;
final Vec2 velA = m_velocityBuffer.data[a];
final Vec2 velB = m_velocityBuffer.data[b];
final float vx = velB.x - velA.x;
final float vy = velB.y - velA.y;
float vn = vx * n.x + vy * n.y;
if (vn < 0) {
float fx = damping * w * vn * n.x;
float fy = damping * w * vn * n.y;
velA.x += fx;
velA.y += fy;
velB.x -= fx;
velB.y -= fy;
}
}
}
use of org.jbox2d.common.Vec2 in project libgdx by libgdx.
the class ParticleSystem method solveSolid.
void solveSolid(final TimeStep step) {
// applies extra repulsive force from solid particle groups
m_depthBuffer = requestParticleBuffer(m_depthBuffer);
float ejectionStrength = step.inv_dt * m_ejectionStrength;
for (int k = 0; k < m_contactCount; k++) {
final ParticleContact contact = m_contactBuffer[k];
int a = contact.indexA;
int b = contact.indexB;
if (m_groupBuffer[a] != m_groupBuffer[b]) {
float w = contact.weight;
Vec2 n = contact.normal;
float h = m_depthBuffer[a] + m_depthBuffer[b];
final Vec2 va = m_velocityBuffer.data[a];
final Vec2 vb = m_velocityBuffer.data[b];
final float inter = ejectionStrength * h * w;
final float fx = inter * n.x;
final float fy = inter * n.y;
va.x -= fx;
va.y -= fy;
vb.x += fx;
vb.y += fy;
}
}
}
use of org.jbox2d.common.Vec2 in project libgdx by libgdx.
the class ParticleSystem method solvePowder.
void solvePowder(final TimeStep step) {
float powderStrength = m_powderStrength * getCriticalVelocity(step);
float minWeight = 1.0f - Settings.particleStride;
for (int k = 0; k < m_bodyContactCount; k++) {
final ParticleBodyContact contact = m_bodyContactBuffer[k];
int a = contact.index;
if ((m_flagsBuffer.data[a] & ParticleType.b2_powderParticle) != 0) {
float w = contact.weight;
if (w > minWeight) {
Body b = contact.body;
float m = contact.mass;
Vec2 p = m_positionBuffer.data[a];
Vec2 n = contact.normal;
final Vec2 f = tempVec;
final Vec2 va = m_velocityBuffer.data[a];
final float inter = powderStrength * m * (w - minWeight);
final float pInvMass = getParticleInvMass();
f.x = inter * n.x;
f.y = inter * n.y;
va.x -= pInvMass * f.x;
va.y -= pInvMass * f.y;
b.applyLinearImpulse(f, p, true);
}
}
}
for (int k = 0; k < m_contactCount; k++) {
final ParticleContact contact = m_contactBuffer[k];
if ((contact.flags & ParticleType.b2_powderParticle) != 0) {
float w = contact.weight;
if (w > minWeight) {
int a = contact.indexA;
int b = contact.indexB;
Vec2 n = contact.normal;
final Vec2 va = m_velocityBuffer.data[a];
final Vec2 vb = m_velocityBuffer.data[b];
final float inter = powderStrength * (w - minWeight);
final float fx = inter * n.x;
final float fy = inter * n.y;
va.x -= fx;
va.y -= fy;
vb.x += fx;
vb.y += fy;
}
}
}
}
use of org.jbox2d.common.Vec2 in project libgdx by libgdx.
the class ParticleSystem method queryAABB.
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;
}
}
}
}
use of org.jbox2d.common.Vec2 in project libgdx by libgdx.
the class ParticleSystem method solveRigid.
void solveRigid(final TimeStep step) {
for (ParticleGroup group = m_groupList; group != null; group = group.getNext()) {
if ((group.m_groupFlags & ParticleGroupType.b2_rigidParticleGroup) != 0) {
group.updateStatistics();
Vec2 temp = tempVec;
Vec2 cross = tempVec2;
Rot rotation = tempRot;
rotation.set(step.dt * group.m_angularVelocity);
Rot.mulToOutUnsafe(rotation, group.m_center, cross);
temp.set(group.m_linearVelocity).mulLocal(step.dt).addLocal(group.m_center).subLocal(cross);
tempXf.p.set(temp);
tempXf.q.set(rotation);
Transform.mulToOut(tempXf, group.m_transform, group.m_transform);
final Transform velocityTransform = tempXf2;
velocityTransform.p.x = step.inv_dt * tempXf.p.x;
velocityTransform.p.y = step.inv_dt * tempXf.p.y;
velocityTransform.q.s = step.inv_dt * tempXf.q.s;
velocityTransform.q.c = step.inv_dt * (tempXf.q.c - 1);
for (int i = group.m_firstIndex; i < group.m_lastIndex; i++) {
Transform.mulToOutUnsafe(velocityTransform, m_positionBuffer.data[i], m_velocityBuffer.data[i]);
}
}
}
}
Aggregations