package org.jbox2d.testbed.tests;
import org.jbox2d.collision.shapes.CircleShape;
import org.jbox2d.collision.shapes.PolygonShape;
import org.jbox2d.common.Transform;
import org.jbox2d.common.Vec2;
import org.jbox2d.particle.ParticleColor;
import org.jbox2d.particle.ParticleGroup;
import org.jbox2d.particle.ParticleGroupDef;
import org.jbox2d.particle.ParticleGroupType;
import org.jbox2d.particle.ParticleType;
import org.jbox2d.testbed.framework.TestbedSettings;
import org.jbox2d.testbed.framework.TestbedTest;
public class DrawingParticles extends TestbedTest {
ParticleGroup m_lastGroup;
boolean m_drawing;
int m_particleFlags;
int m_groupFlags;
ParticleColor color = new ParticleColor();
@Override
public void initTest(boolean deserialized) {
{
{
PolygonShape shape = new PolygonShape();
Vec2[] vertices =
new Vec2[] {new Vec2(-40, -20), new Vec2(40, -20), new Vec2(40, 0), new Vec2(-40, 0)};
shape.set(vertices, 4);
getGroundBody().createFixture(shape, 0.0f);
}
{
PolygonShape shape = new PolygonShape();
Vec2[] vertices =
new Vec2[] {new Vec2(-40, -20), new Vec2(-20, -20), new Vec2(-20, 60),
new Vec2(-40, 60)};
shape.set(vertices, 4);
getGroundBody().createFixture(shape, 0.0f);
}
{
PolygonShape shape = new PolygonShape();
Vec2[] vertices =
new Vec2[] {new Vec2(20, -20), new Vec2(40, -20), new Vec2(40, 60), new Vec2(20, 60)};
shape.set(vertices, 4);
getGroundBody().createFixture(shape, 0.0f);
}
{
PolygonShape shape = new PolygonShape();
Vec2[] vertices =
new Vec2[] {new Vec2(-40, 40), new Vec2(40, 40), new Vec2(40, 60), new Vec2(-40, 60)};
shape.set(vertices, 4);
getGroundBody().createFixture(shape, 0.0f);
}
}
m_world.setParticleRadius(0.5f);
m_lastGroup = null;
m_drawing = true;
m_groupFlags = 0;
}
@Override
public void step(TestbedSettings settings) {
super.step(settings);
addTextLine("Keys: (L) liquid, (E) elastic, (S) spring");
addTextLine("(F) rigid, (W) wall, (V) viscous, (T) tensile");
addTextLine("(Z) erase, (X) move");
}
public void keyPressed(char keyChar, int keyCode) {
m_drawing = keyChar != 'x';
m_particleFlags = 0;
m_groupFlags = 0;
color.set((byte)127, (byte)127, (byte)127, (byte)50);
switch (keyChar) {
case 'e':
m_particleFlags = ParticleType.b2_elasticParticle;
m_groupFlags = ParticleGroupType.b2_solidParticleGroup;
break;
case 'p':
m_particleFlags = ParticleType.b2_powderParticle;
break;
case 'f':
m_groupFlags =
ParticleGroupType.b2_rigidParticleGroup | ParticleGroupType.b2_solidParticleGroup;
break;
case 's':
m_particleFlags = ParticleType.b2_springParticle;
m_groupFlags = ParticleGroupType.b2_solidParticleGroup;
break;
case 't':
color.set((byte)0, (byte)127, (byte)0, (byte)50);
m_particleFlags = ParticleType.b2_tensileParticle;
break;
case 'v':
color.set((byte)0, (byte)0, (byte)127, (byte)50);
m_particleFlags = ParticleType.b2_viscousParticle;
break;
case 'w':
m_particleFlags = ParticleType.b2_wallParticle;
m_groupFlags = ParticleGroupType.b2_solidParticleGroup;
break;
case 'z':
m_particleFlags = ParticleType.b2_zombieParticle;
break;
}
}
Transform pxf = new Transform();
CircleShape pshape = new CircleShape();
ParticleGroupDef ppd = new ParticleGroupDef();
@Override
public void mouseDrag(Vec2 p, int button) {
super.mouseDrag(p, button);
if (m_drawing) {
pshape.m_p.set(p);
pshape.m_radius = 2.0f;
pxf.setIdentity();
m_world.destroyParticlesInShape(pshape, pxf);
ppd.shape = pshape;
ppd.color = color;
ppd.flags = m_particleFlags;
ppd.groupFlags = m_groupFlags;
ParticleGroup group = m_world.createParticleGroup(ppd);
if (m_lastGroup != null && group.getGroupFlags() == m_lastGroup.getGroupFlags()) {
m_world.joinParticleGroups(m_lastGroup, group);
} else {
m_lastGroup = group;
}
mouseTracing = false;
}
}
@Override
public void mouseUp(Vec2 p, int button) {
super.mouseUp(p, button);
m_lastGroup = null;
}
@Override
public void particleGroupDestroyed(ParticleGroup group) {
super.particleGroupDestroyed(group);
if (group == m_lastGroup) {
m_lastGroup = null;
}
}
@Override
public String getTestName() {
return "Drawing Particles";
}
}