diff options
Diffstat (limited to 'src/tesseract/World.java')
| -rw-r--r-- | src/tesseract/World.java | 154 | 
1 files changed, 154 insertions, 0 deletions
diff --git a/src/tesseract/World.java b/src/tesseract/World.java new file mode 100644 index 0000000..e7555a5 --- /dev/null +++ b/src/tesseract/World.java @@ -0,0 +1,154 @@ +package tesseract; + +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; + +import javax.media.j3d.BoundingBox; +import javax.media.j3d.BoundingSphere; +import javax.media.j3d.BranchGroup; +import javax.media.j3d.DirectionalLight; +import javax.media.j3d.IndexedLineArray; +import javax.media.j3d.Light; +import javax.media.j3d.Node; +import javax.media.j3d.Shape3D; +import javax.vecmath.Color3f; +import javax.vecmath.Point3d; +import javax.vecmath.Vector3f; + +public class World { +	/** +	 * Root element of the world. +	 */ +	private BranchGroup myScene; +	 +	/** +	 * Bounding box of the world. +	 */ +	private BoundingBox myVirtualWorldBounds; +	 +	/** +	 * A list of the objects in the world.  +	 */ +	private List<Particle> myObjects; +	 +	/** +	 * A list of the forces in the world. +	 */ +	private List<Force> myForces; +	 +	//private List<ParticleEmitter> emitters; +	//private boolean enableEmitters; +	 +	// A list of all the particles in the world +	//private List<Particle> particles; +	 +	// A list of all the objects particles may collide with +	//private List<ParticleCollidableObject> collidables; +	 +	// Available forces +	//private static final ParticleForceGenerator forces[] = {new Gravity(0.4f)}; +	//private boolean activeForces[]; +	 +	// Number of state updates per second +	//private final int UPDATE_RATE = 30; +	 +	public World(final BoundingBox bounds) { +		myVirtualWorldBounds = bounds; + +		myForces = new LinkedList<Force>(); +		myObjects = new LinkedList<Particle>(); +		 +		// TODO: Should this go here? +		myScene = new BranchGroup(); +		myScene.setCapability(BranchGroup.ALLOW_CHILDREN_EXTEND); +		myScene.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE); +		myScene.addChild(createVirtualWorldBoundsShape()); +		addLights(); +		addEmitters(); +		addCollidableObjects(); +		myScene.compile(); +	} + +	 + +	private Node createVirtualWorldBoundsShape() { +		Point3d lower = new Point3d(); +		Point3d upper = new Point3d(); +		virtualWorldBounds.getLower(lower); +		virtualWorldBounds.getUpper(upper); +		 +		double coordinates[] = {lower.x, lower.y, lower.z, upper.x, lower.y, lower.z, +		                       upper.x, lower.y, upper.z, lower.x, lower.y, upper.z, +		                       lower.x, upper.y, lower.z, upper.x, upper.y, lower.z, +		                       upper.x, upper.y, upper.z, lower.x, upper.y, upper.z}; +		int coordinateIndices[] = {0, 1, 1, 2, 2, 3, 3, 0, +		                           4, 5, 5, 6, 6, 7, 7, 4, +		                           0, 4, 1, 5, 2, 6, 3, 7};  +		 +		IndexedLineArray geometry = new IndexedLineArray(coordinates.length / 3, IndexedLineArray.COORDINATES, coordinateIndices.length); +		geometry.setCoordinates(0, coordinates); +		geometry.setCoordinateIndices(0, coordinateIndices); +		 +		return new Shape3D(geometry); +	} + +	private void addLights() { +		Light light = new DirectionalLight(new Color3f(1f, 1f, 1f), new Vector3f(-1f, -1f, -1f)); +		light.setInfluencingBounds(new BoundingSphere(new Point3d(0, 0, 0), 10)); +		scene.addChild(light); +		light = new DirectionalLight(new Color3f(0.3f, 0.1f, 0.1f), new Vector3f(1f, 0f, 0f)); +		light.setInfluencingBounds(new BoundingSphere(new Point3d(0, 0, 0), 10)); +		scene.addChild(light); +	} +	 +	private void addEmitters() { +		emitters.add(new ColorShiftParticleEmitter(new Vector3f(-0.2f, 0.5f, 0))); +	} + +	private void addCollidableObjects() { +		collidables.add(new Circle(0.25f, new Vector3f(-0.2f, 0.3f, 0), new Vector3f(0.6f, 1, 0))); +		collidables.add(new Circle(0.25f, new Vector3f(0.2f, 0.1f, 0), new Vector3f(-0.6f, 1, 0))); +		collidables.add(new Circle(0.25f, new Vector3f(-0.2f, -0.1f, 0), new Vector3f(0.6f, 1, 0))); +		collidables.add(new Circle(0.25f, new Vector3f(0.2f, -0.3f, 0), new Vector3f(-0.6f, 1, 0))); +		 +//		collidables.add(new Circle(0.25f, new Vector3f(0.15f, 0, 0), new Vector3f(0.02f, 1, 0))); +//		collidables.add(new MathMesh(new Vector3f(0.13f, 0, 0), 151)); +		for (ParticleCollidableObject object : collidables) +			scene.addChild(object.getGroup()); +	} + +	public void tick() { +		for (Iterator<Particle> itr = particles.iterator(); itr.hasNext();) { +			Particle particle = itr.next(); +			for (int i = 0; i < forces.length; i++) +				if (activeForces[i]) +					forces[i].applyForceTo(particle); +			particle.updateState(1f / UPDATE_RATE); +			for (ParticleCollidableObject object : collidables) { +				CollisionInfo ci = object.calculateCollision(particle); +				if (ci != null) +					object.resolveCollision(particle, ci); +			} +			if (!virtualWorldBounds.intersect(new Point3d(particle.getPosition()))) { +				particle.detach(); +				itr.remove(); +			} +		} +		if (!enableEmitters) +			return; +		for (ParticleEmitter emitter : emitters) { +			List<Particle> children = emitter.tick(); +			for (Particle particle : children) +				scene.addChild(particle.getGroup()); +			particles.addAll(children); +		} +	} +	 +	/** +	 * @return the root BG of the scene. +	 */ +	public BranchGroup getScene() { +		return myScene; +	} +}	  | 
