package org.jbox2d.testbed.tests;
import org.jbox2d.collision.shapes.CircleShape;
import org.jbox2d.collision.shapes.EdgeShape;
import org.jbox2d.collision.shapes.PolygonShape;
import org.jbox2d.common.Vec2;
import org.jbox2d.dynamics.Body;
import org.jbox2d.dynamics.BodyDef;
import org.jbox2d.dynamics.BodyType;
import org.jbox2d.particle.ParticleGroupDef;
import org.jbox2d.particle.ParticleType;
import org.jbox2d.testbed.framework.TestbedSettings;
import org.jbox2d.testbed.framework.TestbedTest;
public class ParticleTypes extends TestbedTest {
Body circle;
int flags = ParticleType.b2_tensileParticle;
@Override
public void initTest(boolean deserialized) {
{
BodyDef bd = new BodyDef();
Body ground = m_world.createBody(bd);
{
PolygonShape shape = new PolygonShape();
Vec2[] vertices =
new Vec2[] {new Vec2(-40, -10), new Vec2(40, -10), new Vec2(40, 0), new Vec2(-40, 0)};
shape.set(vertices, 4);
ground.createFixture(shape, 0.0f);
}
{
PolygonShape shape = new PolygonShape();
Vec2[] vertices =
new Vec2[] {new Vec2(-40, -1), new Vec2(-20, -1), new Vec2(-20, 20), new Vec2(-40, 30)};
shape.set(vertices, 4);
ground.createFixture(shape, 0.0f);
}
{
PolygonShape shape = new PolygonShape();
Vec2[] vertices =
new Vec2[] {new Vec2(20, -1), new Vec2(40, -1), new Vec2(40, 30), new Vec2(20, 20)};
shape.set(vertices, 4);
ground.createFixture(shape, 0.0f);
}
}
m_world.setParticleRadius(0.2f);
{
PolygonShape shape = new PolygonShape();
shape.setAsBox(20, 10, new Vec2(0, 10), 0);
ParticleGroupDef pd = new ParticleGroupDef();
pd.flags = pd.flags;
pd.shape = shape;
m_world.createParticleGroup(pd);
}
{
BodyDef bd = new BodyDef();
bd.type = BodyType.KINEMATIC;
Body body = m_world.createBody(bd);
circle = body;
CircleShape shape = new CircleShape();
shape.m_p.set(0, 5);
shape.m_radius = 1;
body.createFixture(shape, 0.1f);
body.setLinearVelocity(new Vec2(-6, 0.0f));
}
{
BodyDef bd = new BodyDef();
bd.type = BodyType.DYNAMIC;
Body body = m_world.createBody(bd);
PolygonShape shape = new PolygonShape();
shape.setAsBox(1, 1, new Vec2(-10, 5), 0);
body.createFixture(shape, 0.1f);
}
{
BodyDef bd = new BodyDef();
bd.type = BodyType.DYNAMIC;
Body body = m_world.createBody(bd);
PolygonShape shape = new PolygonShape();
shape.setAsBox(1, 1, new Vec2(10, 5), 0.5f);
body.createFixture(shape, 0.1f);
}
{
BodyDef bd = new BodyDef();
bd.type = BodyType.DYNAMIC;
Body body = m_world.createBody(bd);
EdgeShape shape = new EdgeShape();
shape.set(new Vec2(0, 20), new Vec2(1, 21));
body.createFixture(shape, 0.1f);
}
{
BodyDef bd = new BodyDef();
bd.type = BodyType.DYNAMIC;
Body body = m_world.createBody(bd);
EdgeShape shape = new EdgeShape();
shape.set(new Vec2(3, 20), new Vec2(4, 21));
body.createFixture(shape, 0.1f);
}
{
BodyDef bd = new BodyDef();
bd.type = BodyType.DYNAMIC;
Body body = m_world.createBody(bd);
EdgeShape shape = new EdgeShape();
shape.set(new Vec2(-3, 21), new Vec2(-2, 20));
body.createFixture(shape, 0.1f);
}
}
@Override
public void step(TestbedSettings settings) {
super.step(settings);
Vec2 p = circle.getTransform().p;
Vec2 v = circle.getLinearVelocity();
if ((p.x < -10.0f && v.x < 0.0f) || (p.x > 10.0f && v.x > 0.0f)) {
v.x = -v.x;
circle.setLinearVelocity(v);
}
int[] flagsBuffer = m_world.getParticleFlagsBuffer();
for (int i = 0; i < m_world.getParticleCount(); i++) {
flagsBuffer[i] = flags;
}
addTextLine("'a' Clear");
addTextLine("'e' Elastic " + ((flags & ParticleType.b2_elasticParticle) != 0));
addTextLine("'q' Powder " + ((flags & ParticleType.b2_powderParticle) != 0));
addTextLine("'t' Tensile " + ((flags & ParticleType.b2_tensileParticle) != 0));
addTextLine("'v' Viscous " + ((flags & ParticleType.b2_viscousParticle) != 0));
}
@Override
public void keyPressed(char keyCar, int keyCode) {
super.keyPressed(keyCar, keyCode);
int toggle = 0;
switch (keyCar) {
case 'a':
flags = 0;
break;
case 'e':
toggle = ParticleType.b2_elasticParticle;
break;
case 'q':
toggle = ParticleType.b2_powderParticle;
break;
case 't':
toggle = ParticleType.b2_tensileParticle;
break;
case 'v':
toggle = ParticleType.b2_viscousParticle;
break;
}
if (toggle != 0) {
if ((flags & toggle) != 0) {
flags = flags & ~toggle;
} else {
flags = flags | toggle;
}
}
}
@Override
public String getTestName() {
return "ParticleTypes";
}
}