summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJesse Morgan <jesse@jesterpm.net>2011-02-12 18:57:14 +0000
committerJesse Morgan <jesse@jesterpm.net>2011-02-12 18:57:14 +0000
commitc663dffc86a7fcec9f05aaf8a107e6200a35c2fa (patch)
tree4642d001dddf0042854c77cafd245b37cb9062ee /src
parent354a7aa455a016ac179d7f027014e6b9c2a2433a (diff)
Added HalfSpaces to the bounds. Fixed collisions and particle emitters. Corrected typo in PlanarPolygonMenuItem. Added removeForce() to world and cleaned up the force adding/removing.
Diffstat (limited to 'src')
-rw-r--r--src/alden/CollisionDetector.java28
-rw-r--r--src/alden/HalfSpace.java28
-rw-r--r--src/tesseract/TesseractUI.java28
-rw-r--r--src/tesseract/World.java50
-rw-r--r--src/tesseract/menuitems/PlanarPolygonMenuItem.java2
-rw-r--r--src/tesseract/objects/HalfSpace.java17
-rw-r--r--src/tesseract/objects/PhysicalObject.java5
-rw-r--r--src/tesseract/objects/emitters/ParticleEmitter.java1
8 files changed, 113 insertions, 46 deletions
diff --git a/src/alden/CollisionDetector.java b/src/alden/CollisionDetector.java
index f05e9b8..bb7817c 100644
--- a/src/alden/CollisionDetector.java
+++ b/src/alden/CollisionDetector.java
@@ -1,9 +1,27 @@
package alden;
-import com.sun.j3d.utils.geometry.*;
-import java.util.*;
+import java.util.ArrayList;
-import javax.media.j3d.*;
-import javax.vecmath.*;
+import javax.media.j3d.Appearance;
+import javax.media.j3d.Geometry;
+import javax.media.j3d.GeometryArray;
+import javax.media.j3d.Group;
+import javax.media.j3d.IndexedTriangleArray;
+import javax.media.j3d.IndexedTriangleFanArray;
+import javax.media.j3d.IndexedTriangleStripArray;
+import javax.media.j3d.Node;
+import javax.media.j3d.PolygonAttributes;
+import javax.media.j3d.Shape3D;
+import javax.media.j3d.Transform3D;
+import javax.media.j3d.TriangleArray;
+import javax.media.j3d.TriangleFanArray;
+import javax.media.j3d.TriangleStripArray;
+import javax.vecmath.Point3f;
+import javax.vecmath.Tuple3f;
+import javax.vecmath.Vector3f;
+
+import tesseract.objects.HalfSpace;
+
+import com.sun.j3d.utils.geometry.Primitive;
@SuppressWarnings("restriction")
public class CollisionDetector {
@@ -325,7 +343,7 @@ public class CollisionDetector {
for (int i = 0; i < group.numChildren(); i++)
extractVertices(group.getChild(i), vertices);
} else
- throw new IllegalArgumentException("Illegal node type for vertex extraction");
+ throw new IllegalArgumentException("Illegal node type for vertex extraction ");
}
private static void extractVertices(Geometry geometry, Transform3D transform, ArrayList<Vector3f> vertices) {
diff --git a/src/alden/HalfSpace.java b/src/alden/HalfSpace.java
deleted file mode 100644
index 6e414fb..0000000
--- a/src/alden/HalfSpace.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package alden;
-
-import javax.vecmath.Vector3f;
-
-@SuppressWarnings("restriction")
-public class HalfSpace extends CollidableObject {
- protected Vector3f normal;
- // Right-hand side of the plane equation: Ax + By + Cz = D
- protected float intercept;
-
- public HalfSpace(Vector3f position, Vector3f normal) {
- super(Float.POSITIVE_INFINITY);
- this.position.set(position);
- this.normal = new Vector3f(normal);
- this.normal.normalize();
- intercept = this.normal.dot(position);
- }
-
-/* public CollisionInfo calculateCollision(Particle particle) {
- if (Math.signum(normal.dot(particle.getPosition()) - intercept) == Math.signum(normal.dot(particle.getPreviousPosition()) - intercept))
- return null;
-
- Vector3f projection = new Vector3f();
- projection.scaleAdd(-1, position, particle.getPosition());
- float penetration = -projection.dot(normal);
- return new CollisionInfo(normal, penetration);
- }*/
-}
diff --git a/src/tesseract/TesseractUI.java b/src/tesseract/TesseractUI.java
index 99b2fa4..e7749b5 100644
--- a/src/tesseract/TesseractUI.java
+++ b/src/tesseract/TesseractUI.java
@@ -96,18 +96,11 @@ public class TesseractUI extends JFrame {
private Timer myTimer;
/**
- * The gravity of the world
- */
- private Gravity my_gravity;
-
- /**
* UI Constructor.
*/
public TesseractUI() {
super("Tesseract Project");
-
- my_gravity = new Gravity();
-
+
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
myWorld = new World(
@@ -166,6 +159,14 @@ public class TesseractUI extends JFrame {
});
simulationMenu.add(runSim);
+ JMenuItem resetSim = new JCheckBoxMenuItem("Reset Simulator", true);
+ runSim.addActionListener(new ActionListener() {
+ public void actionPerformed(final ActionEvent e) {
+ myWorld.resetWorld();
+ }
+ });
+ simulationMenu.add(resetSim);
+
//Objects
JMenu objectsMenu = new JMenu("Add Object");
for (JMenuItem item : myObjectMenuItems) {
@@ -177,11 +178,18 @@ public class TesseractUI extends JFrame {
JMenu forcesMenu = new JMenu("Add Forces");
JMenuItem gravity = new JCheckBoxMenuItem("Gravity", false);
gravity.addActionListener(new ActionListener() {
+ private Force me;
+
+ // Constructor
+ {
+ me = new Gravity();
+ }
+
public void actionPerformed(ActionEvent e) {
if (((JCheckBoxMenuItem) e.getSource()).isSelected()) {
- myWorld.addForce(my_gravity);
+ myWorld.addForce(me);
} else {
- myWorld.addForce(my_gravity = new Gravity(-.5f));
+ myWorld.removeForce(me);
}
}
});
diff --git a/src/tesseract/World.java b/src/tesseract/World.java
index 7bfe0a6..9b43b87 100644
--- a/src/tesseract/World.java
+++ b/src/tesseract/World.java
@@ -21,6 +21,8 @@ import javax.vecmath.Vector3f;
import tesseract.forces.Force;
import tesseract.objects.PhysicalObject;
+import tesseract.objects.HalfSpace;
+
import com.sun.j3d.utils.picking.PickTool;
import com.sun.j3d.utils.picking.behaviors.PickTranslateBehavior;
import com.sun.j3d.utils.picking.behaviors.PickZoomBehavior;
@@ -101,6 +103,7 @@ public class World {
//myScene.addChild(myPickableObjects);
addLights();
+ addHalfspaces();
myScene.compile();
}
@@ -133,6 +136,27 @@ public class World {
return new Shape3D(geometry);
}
+
+ private void addHalfspaces() {
+ Point3d lower = new Point3d();
+ Point3d upper = new Point3d();
+ myVirtualWorldBounds.getLower(lower);
+ myVirtualWorldBounds.getUpper(upper);
+
+ // Bottom
+ myObjects.add(new HalfSpace(new Vector3f(lower), new Vector3f(0, 1, 0)));
+
+ // Top
+ myObjects.add(new HalfSpace(new Vector3f(upper), new Vector3f(0, -1, 0)));
+
+ // Sides
+ myObjects.add(new HalfSpace(new Vector3f(upper), new Vector3f(0, 0, -1)));
+ myObjects.add(new HalfSpace(new Vector3f(upper), new Vector3f(-1, 0, 0)));
+
+ myObjects.add(new HalfSpace(new Vector3f(lower), new Vector3f(0, 0, 1)));
+ myObjects.add(new HalfSpace(new Vector3f(lower), new Vector3f(1, 0, 0)));
+
+ }
/**
* Add some standard lights to the world.
@@ -193,8 +217,9 @@ public class World {
// Collision Detection
for (int i = 0; i < myObjects.size() - 1; i++) {
- for (int j = i + 1; j < myObjects.size(); j++)
+ for (int j = i + 1; j < myObjects.size(); j++) {
myObjects.get(i).resolveCollisions(myObjects.get(j));
+ }
}
// Add new children to thr world.
@@ -251,4 +276,27 @@ public class World {
public void addForce(final Force force) {
myForces.add(force);
}
+
+ /**
+ * Remove a force from the world.
+ *
+ * @param force The force to remove.
+ */
+ public void removeForce(final Force force) {
+ myForces.remove(force);
+ }
+
+ /**
+ * Remove all forces and objects from the world.
+ */
+ public void resetWorld() {
+ myForces.clear();
+
+ for (PhysicalObject obj : myObjects) {
+ obj.detach();
+ }
+ myObjects.clear();
+
+ addHalfspaces();
+ }
}
diff --git a/src/tesseract/menuitems/PlanarPolygonMenuItem.java b/src/tesseract/menuitems/PlanarPolygonMenuItem.java
index 6759f19..e85cfbc 100644
--- a/src/tesseract/menuitems/PlanarPolygonMenuItem.java
+++ b/src/tesseract/menuitems/PlanarPolygonMenuItem.java
@@ -76,7 +76,7 @@ public class PlanarPolygonMenuItem extends TesseractMenuItem {
setMass(mass);
if (event.getSource() == enterButton) {
- myWorld.addObject(new Ellipsoid(getPosition(), getRadius()));
+ myWorld.addObject(new PlanarPolygon(getPosition(), getRadius()));
params.dispose();
}
}
diff --git a/src/tesseract/objects/HalfSpace.java b/src/tesseract/objects/HalfSpace.java
new file mode 100644
index 0000000..df3f715
--- /dev/null
+++ b/src/tesseract/objects/HalfSpace.java
@@ -0,0 +1,17 @@
+package tesseract.objects;
+
+import javax.vecmath.Vector3f;
+
+public class HalfSpace extends PhysicalObject {
+ public Vector3f normal;
+ // Right-hand side of the plane equation: Ax + By + Cz = D
+ public float intercept;
+
+ public HalfSpace(Vector3f position, Vector3f normal) {
+ super(position, Float.POSITIVE_INFINITY);
+
+ this.normal = new Vector3f(normal);
+ this.normal.normalize();
+ this.intercept = this.normal.dot(position);
+ }
+}
diff --git a/src/tesseract/objects/PhysicalObject.java b/src/tesseract/objects/PhysicalObject.java
index 2634ca2..73e0c91 100644
--- a/src/tesseract/objects/PhysicalObject.java
+++ b/src/tesseract/objects/PhysicalObject.java
@@ -22,9 +22,12 @@ import com.sun.j3d.utils.geometry.Primitive;
* @author Jesse Morgan
*/
public class PhysicalObject extends CollidableObject {
+ protected boolean collidable;
+
public PhysicalObject(final Vector3f thePosition, final float mass) {
super(mass);
this.position.set(thePosition);
+ collidable = true;
}
public List<PhysicalObject> spawnChildren(final float duration) {
@@ -67,7 +70,7 @@ public class PhysicalObject extends CollidableObject {
}
public void resolveCollisions(final PhysicalObject other) {
- if (this.node != null && other.node != null) {
+ if (collidable && other.collidable) {
super.resolveCollisions(other);
}
}
diff --git a/src/tesseract/objects/emitters/ParticleEmitter.java b/src/tesseract/objects/emitters/ParticleEmitter.java
index 5aa391a..15c94a9 100644
--- a/src/tesseract/objects/emitters/ParticleEmitter.java
+++ b/src/tesseract/objects/emitters/ParticleEmitter.java
@@ -43,6 +43,7 @@ public class ParticleEmitter extends PhysicalObject {
final Color3f color) {
super(position, Float.POSITIVE_INFINITY);
+ this.collidable = false;
myCount = 0;
myFrequency = frequency;