diff options
Diffstat (limited to 'src/tesseract')
-rw-r--r-- | src/tesseract/TesseractUI.java | 50 | ||||
-rw-r--r-- | src/tesseract/World.java | 45 | ||||
-rw-r--r-- | src/tesseract/objects/CollidableObject.java | 5 | ||||
-rw-r--r-- | src/tesseract/objects/ForceableObject.java | 3 | ||||
-rw-r--r-- | src/tesseract/objects/Particle.java | 4 | ||||
-rw-r--r-- | src/tesseract/objects/Physical.java | 7 | ||||
-rw-r--r-- | src/tesseract/objects/PhysicalObject.java | 76 |
7 files changed, 166 insertions, 24 deletions
diff --git a/src/tesseract/TesseractUI.java b/src/tesseract/TesseractUI.java index a13f537..de7dba3 100644 --- a/src/tesseract/TesseractUI.java +++ b/src/tesseract/TesseractUI.java @@ -13,6 +13,7 @@ import javax.media.j3d.BoundingBox; import javax.media.j3d.Canvas3D; import javax.media.j3d.Transform3D; import javax.media.j3d.TransformGroup; +import javax.swing.JCheckBoxMenuItem; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; @@ -23,14 +24,9 @@ import javax.swing.Timer; import javax.vecmath.Point3d; import javax.vecmath.Vector3f; -import tesseract.forces.Gravity; -import tesseract.menuitems.EllipsoidMenuItem; import tesseract.menuitems.ParticleEmitterMenuItem; import tesseract.menuitems.ParticleMenuItem; -import tesseract.menuitems.PlanarPolygonMenuItem; import tesseract.objects.Particle; -import tesseract.objects.PlanarPolygon; -import tesseract.objects.emitters.ParticleEmitter; import com.sun.j3d.utils.universe.SimpleUniverse; @@ -87,6 +83,11 @@ public class TesseractUI extends JFrame { private JMenuItem[] myObjectMenuItems; /** + * World Timer. + */ + private Timer myTimer; + + /** * UI Constructor. */ public TesseractUI() { @@ -100,8 +101,8 @@ public class TesseractUI extends JFrame { myObjectMenuItems = new JMenuItem[] { new ParticleEmitterMenuItem(myWorld), new ParticleMenuItem(myWorld), - new PlanarPolygonMenuItem(myWorld), - new EllipsoidMenuItem(myWorld) + //new PlanarPolygonMenuItem(myWorld), + //new EllipsoidMenuItem(myWorld) }; createMenu(); @@ -116,10 +117,11 @@ public class TesseractUI extends JFrame { // THIS IS WHERE OBJECTS ARE FORCED INTO EXISTANCE // TODO: REMOVE TEST CODE - //myWorld.addObject(new Particle(new Vector3f(0, 0, 0), null)); + myWorld.addObject(new Particle(new Vector3f(0, 0, 0), null)); //myWorld.addForce(new Gravity()); //myWorld.addObject(new ParticleEmitter(new Vector3f(0, 0.49f, 0), 0.5f, null)); //myWorld.addObject(new PlanarPolygon(new Vector3f(0, 0.49f, 0), 0.25f)); + //myWorld.addObject(new Icosahedron(new Vector3f(), 1, 0.00001f)); } /** @@ -165,6 +167,21 @@ public class TesseractUI extends JFrame { } */ + // Simulator Start/Stop + JMenuItem runSim = new JCheckBoxMenuItem("Run Simulator", true); + runSim.addActionListener(new ActionListener() { + public void actionPerformed(final ActionEvent e) { + if (((JCheckBoxMenuItem) e.getSource()).isSelected()) { + myTimer.start(); + + } else { + myTimer.stop(); + } + } + }); + simulationMenu.add(runSim); + + // Exit Menu Item JMenuItem exit = new JMenuItem("Exit"); exit.addActionListener(new ActionListener() { @@ -197,7 +214,10 @@ public class TesseractUI extends JFrame { // Add the scene BG. universe.addBranchGraph(myWorld.getScene()); - + + // Setup the Mouse Behaviors + myWorld.setupMouseBehaviors(myCanvas); + // Add the canvas to the frame. add(myCanvas); @@ -207,6 +227,11 @@ public class TesseractUI extends JFrame { private MouseEvent lastDragEvent = null; public void mouseDragged(final MouseEvent e) { + if ((e.getModifiersEx() & MouseEvent.BUTTON1_DOWN_MASK) == 0 + || (e.getModifiersEx() & MouseEvent.ALT_DOWN_MASK) != 0) { + return; + } + if (lastDragEvent != null) { cameraXRotation += Math.toRadians(e.getY() - lastDragEvent.getY()) / 3; @@ -246,13 +271,16 @@ public class TesseractUI extends JFrame { }); // Setup the timer. - new Timer(MILISECONDS_IN_SECOND / UPDATE_RATE, new ActionListener() { + myTimer = new Timer(MILISECONDS_IN_SECOND / UPDATE_RATE, + new ActionListener() { public void actionPerformed(final ActionEvent e) { myCanvas.stopRenderer(); myWorld.tick(); myCanvas.startRenderer(); } - }).start(); + }); + + myTimer.start(); } diff --git a/src/tesseract/World.java b/src/tesseract/World.java index 7da6058..f11f48e 100644 --- a/src/tesseract/World.java +++ b/src/tesseract/World.java @@ -5,8 +5,10 @@ import java.util.LinkedList; import java.util.List; import javax.media.j3d.BoundingBox; +import javax.media.j3d.BoundingLeaf; import javax.media.j3d.BoundingSphere; import javax.media.j3d.BranchGroup; +import javax.media.j3d.Canvas3D; import javax.media.j3d.DirectionalLight; import javax.media.j3d.IndexedLineArray; import javax.media.j3d.Light; @@ -22,6 +24,10 @@ import tesseract.objects.CollisionInfo; import tesseract.objects.Forceable; import tesseract.objects.PhysicalObject; +import com.sun.j3d.utils.picking.PickTool; +import com.sun.j3d.utils.picking.behaviors.PickTranslateBehavior; +import com.sun.j3d.utils.picking.behaviors.PickZoomBehavior; + /** * Model of the 3D world. * @@ -34,6 +40,11 @@ public class World { private BranchGroup myScene; /** + * Pickable Objects. + */ + private BranchGroup myPickableObjects; + + /** * Bounding box of the world. */ private BoundingBox myVirtualWorldBounds; @@ -87,8 +98,19 @@ public class World { myScene = new BranchGroup(); myScene.setCapability(BranchGroup.ALLOW_CHILDREN_EXTEND); myScene.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE); + + BoundingLeaf originLeaf = new BoundingLeaf(new BoundingSphere()); + myScene.addChild(originLeaf); + myScene.addChild(createVirtualWorldBoundsShape()); + + myPickableObjects = new BranchGroup(); + myPickableObjects.setCapability(BranchGroup.ALLOW_CHILDREN_EXTEND); + myPickableObjects.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE); + //myScene.addChild(myPickableObjects); + addLights(); + myScene.compile(); } @@ -205,12 +227,33 @@ public class World { } /** + * Setup mouse behaviors in the world. + * + * @param canvas The canvas to tie the events to. + */ + public void setupMouseBehaviors(final Canvas3D canvas) { + //BranchGroup pickables = new BranchGroup(); + myPickableObjects.addChild(new PickTranslateBehavior(myPickableObjects, canvas, myVirtualWorldBounds, PickTool.GEOMETRY)); + myPickableObjects.addChild(new PickZoomBehavior(myPickableObjects, canvas, myVirtualWorldBounds, PickTool.GEOMETRY)); + myScene.addChild(myPickableObjects); + + /*myPickableObjects.addChild( + new PickTranslateBehavior(myPickableObjects, canvas, + myVirtualWorldBounds, PickTool.GEOMETRY)); + + myPickableObjects.addChild( + new PickZoomBehavior(myPickableObjects, canvas, + myVirtualWorldBounds, PickTool.GEOMETRY)); + */ + } + + /** * Add a new object to the world. * * @param obj The object to add */ public void addObject(final PhysicalObject obj) { - myScene.addChild(obj.getGroup()); + myPickableObjects.addChild(obj.getGroup()); myObjects.add(obj); if (obj instanceof Collidable) { diff --git a/src/tesseract/objects/CollidableObject.java b/src/tesseract/objects/CollidableObject.java index 3ab00af..96248ac 100644 --- a/src/tesseract/objects/CollidableObject.java +++ b/src/tesseract/objects/CollidableObject.java @@ -2,25 +2,22 @@ package tesseract.objects; import javax.vecmath.Vector3f; -public class CollidableObject extends PhysicalObject implements Collidable { +public abstract 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/ForceableObject.java b/src/tesseract/objects/ForceableObject.java index 3100a5a..b918452 100644 --- a/src/tesseract/objects/ForceableObject.java +++ b/src/tesseract/objects/ForceableObject.java @@ -9,7 +9,8 @@ import javax.vecmath.Vector3f; * * @author Jesse Morgan */ -public class ForceableObject extends PhysicalObject implements Forceable { +public abstract class ForceableObject + extends PhysicalObject implements Forceable { /** * The inverse of the object's mass. */ diff --git a/src/tesseract/objects/Particle.java b/src/tesseract/objects/Particle.java index 8307c55..b2f66e4 100644 --- a/src/tesseract/objects/Particle.java +++ b/src/tesseract/objects/Particle.java @@ -74,7 +74,7 @@ public class Particle extends ForceableObject { cAttr = new ColoringAttributes(color, ColoringAttributes.FASTEST); Appearance appearance = new Appearance(); appearance.setColoringAttributes(cAttr); - return new Sphere(RADIUS, 0, DIVISIONS, appearance); + return new Sphere(RADIUS, Sphere.ENABLE_GEOMETRY_PICKING, + DIVISIONS, appearance); } - } diff --git a/src/tesseract/objects/Physical.java b/src/tesseract/objects/Physical.java index abf8c0f..40d50ee 100644 --- a/src/tesseract/objects/Physical.java +++ b/src/tesseract/objects/Physical.java @@ -13,4 +13,11 @@ public interface Physical { * @return The position of the object in the world. */ Vector3f getPosition(); + + /** + * Set the object's position. + * + * @param position The new position. + */ + void setPosition(Vector3f position); } diff --git a/src/tesseract/objects/PhysicalObject.java b/src/tesseract/objects/PhysicalObject.java index 11ae9d2..23da734 100644 --- a/src/tesseract/objects/PhysicalObject.java +++ b/src/tesseract/objects/PhysicalObject.java @@ -1,11 +1,17 @@ package tesseract.objects; +import java.util.Enumeration; import java.util.List; +import javax.media.j3d.Behavior; +import javax.media.j3d.BoundingBox; +import javax.media.j3d.BoundingLeaf; import javax.media.j3d.BranchGroup; -import javax.media.j3d.Group; import javax.media.j3d.Transform3D; import javax.media.j3d.TransformGroup; +import javax.media.j3d.WakeupOnTransformChange; +import javax.vecmath.Point3d; +import javax.vecmath.Point3f; import javax.vecmath.Vector3f; /** @@ -16,7 +22,7 @@ import javax.vecmath.Vector3f; * * @author Jesse Morgan */ -public abstract class PhysicalObject implements Physical { +public abstract class PhysicalObject extends TransformGroup implements Physical { /** * The object's current position. */ @@ -38,26 +44,44 @@ public abstract class PhysicalObject implements Physical { protected boolean myExistance; /** + * + */ + private int skipTGUpdates; + + /** * Constructor for a PhysicalObject. * * @param position Initial position. */ public PhysicalObject(final Vector3f position) { + skipTGUpdates = 0; myPosition = new Vector3f(position); myExistance = true; - myTransformGroup = new TransformGroup(); + myTransformGroup = this; //new TransformGroup(); myTransformGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); + myTransformGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); + myTransformGroup.setCapability(TransformGroup.ENABLE_PICK_REPORTING); + myBranchGroup = new BranchGroup(); myBranchGroup.setCapability(BranchGroup.ALLOW_DETACH); myBranchGroup.addChild(myTransformGroup); + //myBranchGroup.addChild(new TGUpdateBehavior(null)); updateTransformGroup(); } + public void setTransform(Transform3D t1) { + super.setTransform(t1); + + Point3f pos = new Point3f(myPosition); + t1.transform(pos); + myPosition = new Vector3f(pos); + } + /** * @return The object's position. */ @@ -66,6 +90,16 @@ public abstract class PhysicalObject implements Physical { } /** + * Update the object's position. + * + * @param position The new position. + */ + public void setPosition(final Vector3f position) { + myPosition = new Vector3f(position); + updateTransformGroup(); + } + + /** * @return The transform group of the object. */ protected TransformGroup getTransformGroup() { @@ -76,7 +110,7 @@ public abstract class PhysicalObject implements Physical { /** * @return Get the BranchGroup. */ - public Group getGroup() { + public BranchGroup getGroup() { return myBranchGroup; } @@ -102,7 +136,9 @@ public abstract class PhysicalObject implements Physical { protected void updateTransformGroup() { Transform3D tmp = new Transform3D(); tmp.setTranslation(myPosition); - myTransformGroup.setTransform(tmp); + + skipTGUpdates++; + super.setTransform(tmp); } /** @@ -113,5 +149,35 @@ public abstract class PhysicalObject implements Physical { public List<PhysicalObject> updateState(final float duration) { return null; } + + private class TGUpdateBehavior extends Behavior { + public TGUpdateBehavior(final BoundingLeaf boundingLeaf) { + //setSchedulingBoundingLeaf(boundingLeaf); + setSchedulingBounds(new BoundingBox(new Point3d(-0.5, -0.5, -0.5), + new Point3d(0.5, 0.5, 0.5))); + } + public void initialize() { + wakeupOn(new WakeupOnTransformChange(getTransformGroup())); + } + + public void processStimulus(final Enumeration e) { + if (skipTGUpdates == 0) { + System.out.println(myPosition); + + Transform3D t3d = new Transform3D(); + getTransformGroup().getTransform(t3d); + + Point3f pos = new Point3f(myPosition); + t3d.transform(pos); + System.out.println(pos); + myPosition = new Vector3f(pos); + } else { + skipTGUpdates--; + System.out.println("Skip"); + } + + wakeupOn(new WakeupOnTransformChange(getTransformGroup())); + } + } } |