/**
*
*/
package org.jbox2d.dynamics;
import java.util.HashSet;
import java.util.Set;
/**
* Holder for a group of bodies.
* @author eric
*/
public class BodyGroup {
private final Set<BodyGroup> children = new HashSet<BodyGroup>();
private final Set<Body> bodies = new HashSet<Body>();
private final World world;
/** Create a BodyGroup from a group of bodies. */
public BodyGroup(Body... bodies) {
World w = null;
for (Body b:bodies) {
this.bodies.add(b);
if (w == null) w = b.getWorld();
else if (b.getWorld() != w) assert(false):"Cannot add bodies from different worlds to a BodyGroup";
}
world = w;
}
/** Create a BodyGroup from a group of BodyGroups. */
public BodyGroup(BodyGroup... groups) {
World w = null;
for (BodyGroup bg:groups) {
this.children.add(bg);
if (w == null) w = bg.getWorld();
else if (bg.getWorld() != w) assert(false):"Cannot add BodyGroups from different worlds to a BodyGroup";
}
world = w;
}
/** Get child BodyGroups. Does not return children-of-children.*/
public Set<BodyGroup> getChildren() {
return children;
}
/**
* Get bodies. Does not return bodies that are members of child BodyGroups.
* @see #getBodiesDeep()
*/
public Set<Body> getBodies() {
return bodies;
}
/**
* Get all bodies in this group and all children, recursively.
* @see #getBodies() for non-recursive version
*/
public Set<Body> getBodiesDeep() {
Set<Body> res = new HashSet<Body>();
res.addAll(bodies);
for (BodyGroup bg:children) {
res.addAll(bg.getBodiesDeep());
}
return res;
}
/** @return the world this BodyGroup lives in */
public World getWorld() {
return world;
}
/**
* Create a BodyGroup by traversing the joint tree from a seed body.
* @param seed
*/
public static BodyGroup fromSeedConnectedByJoints(Body seed) {
Set<Body> bodies = seed.getConnectedDynamicBodyIsland();
return new BodyGroup(bodies.toArray(new Body[bodies.size()]));
}
}