From 033976c152a23455d37bb90898037a477cd737bd Mon Sep 17 00:00:00 2001 From: Steve Date: Wed, 16 Mar 2011 09:02:22 +0000 Subject: couldn't help myself. added the ground disabled its pickable in mouse stuff on the ground implemented re-insert of ground after reset add two images snow and sand created separate methods for ground and background --- src/tesseract/TesseractUI.java | 65 ++++++++++---------- src/tesseract/World.java | 2 + src/tesseract/objects/Ground.java | 123 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 157 insertions(+), 33 deletions(-) create mode 100644 src/tesseract/objects/Ground.java (limited to 'src') 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; + } +} -- cgit v1.2.3