summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sand.jpgbin0 -> 76583 bytes
-rw-r--r--snow.jpgbin0 -> 229094 bytes
-rw-r--r--src/tesseract/TesseractUI.java65
-rw-r--r--src/tesseract/World.java2
-rw-r--r--src/tesseract/objects/Ground.java123
5 files changed, 157 insertions, 33 deletions
diff --git a/sand.jpg b/sand.jpg
new file mode 100644
index 0000000..f58f6cd
--- /dev/null
+++ b/sand.jpg
Binary files differ
diff --git a/snow.jpg b/snow.jpg
new file mode 100644
index 0000000..d0bf382
--- /dev/null
+++ b/snow.jpg
Binary files differ
diff --git a/src/tesseract/TesseractUI.java b/src/tesseract/TesseractUI.java
index 33acf37..bb032c7 100644
--- a/src/tesseract/TesseractUI.java
+++ b/src/tesseract/TesseractUI.java
@@ -56,6 +56,7 @@ import tesseract.newmenu.NewParticleMenuItem;
import tesseract.newmenu.NewPlanarPolygonMenuItem;
import tesseract.newmenu.NewSurfBoardMenuItem;
import tesseract.newmenu.NewToroidMenuItem;
+import tesseract.objects.Ground;
import tesseract.objects.PhysicalObject;
import tesseract.objects.blimp.Blimp;
import tesseract.objects.remote.RemoteObjectMenu;
@@ -164,17 +165,8 @@ public class TesseractUI extends JFrame {
new Point3d(UNIT / 2, UNIT / 2, UNIT / 2)),
myPeer);
- //Set Background
- BoundingBox bounds = myWorld.getBounds();
- TextureLoader t = new TextureLoader("Alien.jpg", myCanvas);
- Background background = new Background(t.getImage());
- background.setImageScaleMode(Background.SCALE_FIT_MAX); // Tiles the image
- background.setApplicationBounds(bounds);
- BranchGroup bg = new BranchGroup();
- bg.addChild(background);
-
- BranchGroup scene = myWorld.getScene();
- scene.addChild(bg);
+ createBackground();
+ createGround();
Blimp blimp = new Blimp(new Vector3f(0,0,0), .7f);
myWorld.addObject(blimp);
@@ -397,6 +389,7 @@ public class TesseractUI extends JFrame {
originLinear.setSelected(false);
originQuadradic.setSelected(false);
airDrag.setSelected(false);
+ createGround();
}
});
simulationMenu.add(resetSim);
@@ -502,7 +495,9 @@ public class TesseractUI extends JFrame {
public void mouseDragged(final MouseEvent e) {
if (lastDragEvent != null) {
- if (myCurrentObject != null) {
+
+ //Disable the ground from being pickable
+ if (myCurrentObject != null && !(myCurrentObject instanceof Ground)) {
float scale = 0.001f;
int xdiff = e.getX() - lastDragEvent.getX();
@@ -622,28 +617,32 @@ public class TesseractUI extends JFrame {
}
});
}
-}
+
+ /**
+ * Creates the ground
+ */
+ public void createGround(){
+ Ground ground = new Ground(new Vector3f(0f, -.51f, 0f), 5f);
+ myWorld.addObject(ground);
+ }
+
+ /**
+ * Create background image
+ */
+ private void createBackground() {
+ //Set Background
+ BoundingBox bounds = myWorld.getBounds();
+ TextureLoader t = new TextureLoader("Alien.jpg", myCanvas);
+ Background background = new Background(t.getImage());
+ background.setImageScaleMode(Background.SCALE_FIT_MAX); // Tiles the image
+ background.setApplicationBounds(bounds);
+ BranchGroup bg = new BranchGroup();
+ bg.addChild(background);
+ BranchGroup scene = myWorld.getScene();
+ scene.addChild(bg);
+ }
+}
-/*
-JCheckBoxMenuItem cMenuItem = new JCheckBoxMenuItem("Enable Particle Emitters", enableEmitters);
-cMenuItem.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- enableEmitters = !enableEmitters;
- }
-});
-menu.add(cMenuItem);
-for (int i = 0; i < forces.length; i++) {
- cMenuItem = new JCheckBoxMenuItem(forces[i].toString(), activeForces[i]);
- cMenuItem.setActionCommand(i + "");
- cMenuItem.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- int index = Integer.parseInt(e.getActionCommand());
- activeForces[index] = !activeForces[index];
- }
- });
- menu.add(cMenuItem);
-}
-*/
diff --git a/src/tesseract/World.java b/src/tesseract/World.java
index 7b8d7cb..ac13bb1 100644
--- a/src/tesseract/World.java
+++ b/src/tesseract/World.java
@@ -24,6 +24,7 @@ import javax.vecmath.Point3d;
import javax.vecmath.Vector3f;
import tesseract.forces.Force;
+import tesseract.objects.Ground;
import tesseract.objects.HalfSpace;
import tesseract.objects.Particle;
import tesseract.objects.PhysicalObject;
@@ -381,6 +382,7 @@ public class World implements Observer {
myObjects.clear();
addHalfspaces();
+
}
/**
diff --git a/src/tesseract/objects/Ground.java b/src/tesseract/objects/Ground.java
new file mode 100644
index 0000000..980e9dd
--- /dev/null
+++ b/src/tesseract/objects/Ground.java
@@ -0,0 +1,123 @@
+/*
+ * Class PlanarPolygon
+ * TCSS 491 Computational Worlds
+ * Steve Bradshaw
+ */
+
+package tesseract.objects;
+
+import javax.media.j3d.Appearance;
+import javax.media.j3d.Geometry;
+import javax.media.j3d.ImageComponent2D;
+import javax.media.j3d.Material;
+import javax.media.j3d.Node;
+import javax.media.j3d.PolygonAttributes;
+import javax.media.j3d.Shape3D;
+import javax.media.j3d.Texture;
+import javax.media.j3d.Texture2D;
+import javax.media.j3d.TriangleFanArray;
+import javax.vecmath.Point3f;
+import javax.vecmath.TexCoord2f;
+import javax.vecmath.Vector3f;
+
+import com.sun.j3d.utils.geometry.GeometryInfo;
+import com.sun.j3d.utils.geometry.NormalGenerator;
+import com.sun.j3d.utils.image.TextureLoader;
+
+/**
+ * This class creates an gourn object using Mathew Aldens design
+ * of a circle, but this adds lava texture and lower divisions
+ *
+ * @author Steve Bradshaw & Mathew Alden
+ * @version 8 Feb 2011
+ */
+public class Ground extends PhysicalObject {
+
+ /**
+ * Default mass.
+ */
+ private static final float DEFAULT_MASS = Float.POSITIVE_INFINITY;
+
+ /**
+ * Number of divisions in the sphere.
+ */
+ public static final int DEFAULT_DIVISIONS = 8;
+
+ /**
+ * A Default radius.
+ */
+ public static final float DEFAULT_RADIUS = 100f;
+
+ /**
+ * Create a new Ellipsoid.
+ *
+ * @param position Initial position.
+ * @param radius a float for the size of the base sphere.
+ */
+ public Ground(final Vector3f position, final float radius) {
+ super(position, DEFAULT_MASS);
+
+ setShape(createShape(radius, DEFAULT_DIVISIONS));
+
+ /*if (inverseMass != 0) {
+ inverseInertiaTensor.m00 = 1f / 4 / inverseMass * radius * radius;
+ inverseInertiaTensor.m11 = 2 * inverseInertiaTensor.m00;
+ inverseInertiaTensor.m22 = inverseInertiaTensor.m00;
+ inverseInertiaTensor.invert();
+ }*/
+ updateTransformGroup();
+
+ }
+
+ /**
+ * This method creates a planar polygon shape with lava texture.
+ *
+ * @param radius a float for the size of the base polygon.
+ * @param divisions an int for the number of divisons.
+ * @param appearance an Appearance object.
+ * @return Node a polygon.
+ */
+ private Node createShape(final float radius, final int divisions) {
+ TriangleFanArray geometry = new TriangleFanArray(divisions,
+ TriangleFanArray.COORDINATES | TriangleFanArray.TEXTURE_COORDINATE_2, new int[] {divisions});
+ for (int i = 0; i < divisions; i++) {
+ float baseX = (float)Math.cos(2 * Math.PI * i / divisions);
+ float baseZ = -(float)Math.sin(2 * Math.PI * i / divisions);
+ geometry.setCoordinate(i, new Point3f(radius * baseX, 0, radius * baseZ));
+ geometry.setTextureCoordinate(0, i, new TexCoord2f((baseX + 1) / 2, (-baseZ + 1) / 2));
+ }
+
+ GeometryInfo gInfo = new GeometryInfo(geometry);
+ new NormalGenerator().generateNormals(gInfo);
+ gInfo.convertToIndexedTriangles();
+ Shape3D polygon = new Shape3D(gInfo.getGeometryArray());
+
+ TextureLoader tl = new TextureLoader("sand.jpg", null);
+ ImageComponent2D image = tl.getImage();
+ int width = image.getWidth();
+ int height = image.getHeight();
+ Texture2D texture = new Texture2D(Texture.MULTI_LEVEL_MIPMAP, Texture.RGB, width, height);
+
+ int imageLevel = 0;
+ texture.setImage(imageLevel, image);
+ while (width > 1 || height > 1) {
+ imageLevel++;
+ if (width > 1) width /= 2;
+ if (height > 1) height /= 2;
+ texture.setImage(imageLevel, tl.getScaledImage(width, height));
+ }
+ texture.setMagFilter(Texture2D.NICEST);
+ texture.setMinFilter(Texture2D.NICEST);
+ Material mat = new Material();
+ mat.setDiffuseColor(1, 0, 0);
+
+ Appearance appearance = new Appearance();
+ appearance.setTexture(texture);
+ appearance.setMaterial(mat);
+ PolygonAttributes polyAttr = new PolygonAttributes(PolygonAttributes.POLYGON_FILL, PolygonAttributes.CULL_NONE, 0);
+ appearance.setPolygonAttributes(polyAttr);
+ geometry.setCapability(Geometry.ALLOW_INTERSECT);
+ polygon = new Shape3D(geometry, appearance);
+ return polygon;
+ }
+}