summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/tesseract/OldParticle.java92
-rw-r--r--src/tesseract/World.java21
-rw-r--r--src/tesseract/objects/Collidable.java10
-rw-r--r--src/tesseract/objects/CollidableObject.java29
-rw-r--r--src/tesseract/objects/CollisionInfo.java5
5 files changed, 64 insertions, 93 deletions
diff --git a/src/tesseract/OldParticle.java b/src/tesseract/OldParticle.java
deleted file mode 100644
index ca77acb..0000000
--- a/src/tesseract/OldParticle.java
+++ /dev/null
@@ -1,92 +0,0 @@
-package tesseract;
-
-import com.sun.j3d.utils.geometry.*;
-import java.awt.*;
-import javax.media.j3d.*;
-import javax.vecmath.*;
-
-import tesseract.objects.Forceable;
-
-public class OldParticle implements Forceable {
- private float inverseMass;
- private Vector3f position, prevPosition;
- private Vector3f velocity;
- private Vector3f force;
- private BranchGroup BG;
- private TransformGroup TG;
-
- private static final float RADIUS = 0.004f;
-
- public OldParticle(Color3f color, Vector3f position, Vector3f velocity) {
- inverseMass = 1;
- this.position = new Vector3f(position);
- prevPosition = new Vector3f(position);
- this.velocity = new Vector3f(velocity);
- force = new Vector3f();
- TG = new TransformGroup();
- TG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
- TG.addChild(createShape(color));
- BG = new BranchGroup();
- BG.setCapability(BranchGroup.ALLOW_DETACH);
- BG.addChild(TG);
- updateTransformGroup();
- }
-
- public float getInverseMass() {
- return inverseMass;
- }
-
- public Vector3f getPosition() {
- return position;
- }
-
- public Vector3f getPreviousPosition() {
- return prevPosition;
- }
-
- public Vector3f getVelocity() {
- return velocity;
- }
-
- public Group getGroup() {
- return BG;
- }
-
- public void detach() {
- BG.detach();
- }
-
- public void addForce(Vector3f force) {
- this.force.add(force);
- }
-
- public void updateState(float duration) {
- // The force vector now becomes the acceleration vector.
- force.scale(inverseMass);
- prevPosition.set(position);
- position.scaleAdd(duration, velocity, position);
- position.scaleAdd(duration * duration / 2, force, position);
- velocity.scaleAdd(duration, force, velocity);
- // The force vector is cleared.
- force.x = force.y = force.z = 0;
- updateTransformGroup();
- }
-
- public void updateTransformGroup() {
- Transform3D tmp = new Transform3D();
- tmp.setTranslation(position);
- TG.setTransform(tmp);
- }
-
- private Node createShape(Color3f color) {
- ColoringAttributes cAttr;
- if (color == null) {
- Color randomColor = Color.getHSBColor((float)Math.random(), 1, 1);
- color = new Color3f(randomColor);
- }
- cAttr = new ColoringAttributes(color, ColoringAttributes.FASTEST);
- Appearance appearance = new Appearance();
- appearance.setColoringAttributes(cAttr);
- return new Sphere(RADIUS, 0, 8, appearance);
- }
-}
diff --git a/src/tesseract/World.java b/src/tesseract/World.java
index 470990b..7da6058 100644
--- a/src/tesseract/World.java
+++ b/src/tesseract/World.java
@@ -17,6 +17,8 @@ import javax.vecmath.Point3d;
import javax.vecmath.Vector3f;
import tesseract.forces.Force;
+import tesseract.objects.Collidable;
+import tesseract.objects.CollisionInfo;
import tesseract.objects.Forceable;
import tesseract.objects.PhysicalObject;
@@ -46,6 +48,11 @@ public class World {
*/
private List<Force> myForces;
+ /**
+ * Objects that can be collided into, a subset of myObjects.
+ */
+ private List<Collidable> myCollidables;
+
//private List<ParticleEmitter> emitters;
//private boolean enableEmitters;
@@ -74,6 +81,7 @@ public class World {
myForces = new LinkedList<Force>();
myObjects = new LinkedList<PhysicalObject>();
+ myCollidables = new LinkedList<Collidable>();
// TODO: Should this go here?
myScene = new BranchGroup();
@@ -162,7 +170,14 @@ public class World {
children.addAll(newChildren);
}
- // TODO: Eventually check for collisions here.
+ // Check for collisions
+ for (Collidable collidable : myCollidables) {
+ if (collidable.hasCollision(obj)) {
+ // Resolve the collision
+ CollisionInfo ci = collidable.calculateCollision(obj);
+ collidable.resolveCollision(obj, ci);
+ }
+ }
// If it leaves the bounds of the world, DESTROY IT
if (!obj.isExisting()
@@ -197,6 +212,10 @@ public class World {
public void addObject(final PhysicalObject obj) {
myScene.addChild(obj.getGroup());
myObjects.add(obj);
+
+ if (obj instanceof Collidable) {
+ myCollidables.add((Collidable) obj);
+ }
}
/**
diff --git a/src/tesseract/objects/Collidable.java b/src/tesseract/objects/Collidable.java
new file mode 100644
index 0000000..48bf40b
--- /dev/null
+++ b/src/tesseract/objects/Collidable.java
@@ -0,0 +1,10 @@
+package tesseract.objects;
+
+public interface Collidable extends Physical {
+
+ boolean hasCollision(final Physical obj);
+
+ CollisionInfo calculateCollision(final Physical obj);
+
+ void resolveCollision(final Physical obj, final CollisionInfo collision);
+}
diff --git a/src/tesseract/objects/CollidableObject.java b/src/tesseract/objects/CollidableObject.java
new file mode 100644
index 0000000..3ab00af
--- /dev/null
+++ b/src/tesseract/objects/CollidableObject.java
@@ -0,0 +1,29 @@
+package tesseract.objects;
+
+import javax.vecmath.Vector3f;
+
+public class CollidableObject extends PhysicalObject implements Collidable {
+
+ public CollidableObject(Vector3f position) {
+ super(position);
+ }
+
+ @Override
+ public CollisionInfo calculateCollision(Physical obj) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public boolean hasCollision(Physical obj) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public void resolveCollision(Physical obj, CollisionInfo collision) {
+ // TODO Auto-generated method stub
+
+ }
+
+}
diff --git a/src/tesseract/objects/CollisionInfo.java b/src/tesseract/objects/CollisionInfo.java
new file mode 100644
index 0000000..3a151e0
--- /dev/null
+++ b/src/tesseract/objects/CollisionInfo.java
@@ -0,0 +1,5 @@
+package tesseract.objects;
+
+public class CollisionInfo {
+
+}