+ public class MyMenuBar extends JMenuBar {
+
+ public MyMenuBar() {
+
+ JMenu tileMenu = new JMenu("Tile");
+ JMenu goalMenu = new JMenu("Goal");
+ JMenu hideMenu = new JMenu("Actions");
+
+ hideMenu.add(new MyMenuItem("Start Anneal") { public void hit() { anneal = true; }});
+ hideMenu.add(new MyMenuItem("Stop Anneal") { public void hit() { anneal = false; }});
+ hideMenu.add(new MyMenuItem("Reset to high temperature") { public void hit() { temp = 1; }});
+ hideMenu.add(new MyMenuItem("Subdivide surface") { public void hit() { breaks++; }});
+ hideMenu.add(new MyMenuItem("Show Goal") { public void hit() { goalon = true; }});
+ hideMenu.add(new MyMenuItem("Hide Goal") { public void hit() { goalon = false; }});
+ hideMenu.add(new MyMenuItem("Show All Neighbors") { public void hit() { neighbors = true; }});
+ hideMenu.add(new MyMenuItem("Show One Neighbor Wireframe") { public void hit() { neighborsWireOne = true; }});
+ hideMenu.add(new MyMenuItem("Show All Neighbors Wireframe") { public void hit() { neighborsWire = true; neighborsWireOne = false;}});
+ hideMenu.add(new MyMenuItem("Hide Neighbors") { public void hit() { neighborsWire = false; neighborsWireOne = false; neighbors = false; }});
+
+ goalMenu.add(new MyMenuItem("Fish with face") { public void hit() {
+ loadGoal("face.stl");
+ //goal.transform(Matrix.rotate(new Vec(0, 1, 0), (float)(Math.PI/2)));
+ goal.transform(Matrix.rotate(new Vec(0, 0, 1), (float)(Math.PI/2)));
+ //goal.transform(Matrix.scale(1, 2.2f, 1));
+ float factor = (float)Math.pow(tile.volume() / goal.volume(), 1.0/3.0);
+ //factor = factor * 0.8f;
+ goal.transform(Matrix.scale(0.3f));
+ //goal.transform(Matrix.rotate(new Vec(0,1,0), (float)(Math.PI*1/3)));
+ goal.transform(Matrix.rotate(new Vec(1,0,0), (float)(Math.PI*1/3)));
+ fixupGoal(true, false);
+ //goal.transform(Matrix.translate(new Vec(0.145f, 0, 0)));
+ fixupGoal(false, true);
+ }});
+ goalMenu.add(new MyMenuItem("Fish") { public void hit() {
+ loadGoal("fish.stl");
+ //goal.transform(Matrix.rotate(new Vec(0, 1, 0), (float)(Math.PI/2)));
+ goal.transform(Matrix.rotate(new Vec(0, 0, 1), (float)(Math.PI/2)));
+ goal.transform(Matrix.scale(1, 2.2f, 1));
+ float factor = (float)Math.pow(tile.volume() / goal.volume(), 1.0/3.0);
+ factor = factor * 0.8f;
+ goal.transform(Matrix.scale(factor));
+ fixupGoal(true, false);
+ //goal.transform(Matrix.translate(new Vec(0.145f, 0, 0)));
+ fixupGoal(false, true);
+ }});
+ goalMenu.add(new MyMenuItem("Hammerhead Fish") { public void hit() {
+ loadGoal("fish.stl");
+ goal.transform(Matrix.rotate(new Vec(0, 1, 0), (float)(Math.PI/2)));
+ goal.transform(Matrix.rotate(new Vec(0, 0, 1), (float)(3*Math.PI/2)));
+ float factor = (float)Math.pow(tile.volume() / goal.volume(), 1.0/3.0);
+ factor *= 0.75f;
+ goal.transform(Matrix.scale(factor));
+ fixupGoal();
+ }});
+ goalMenu.add(new MyMenuItem("Vertical Fish") { public void hit() {
+ loadGoal("fish.stl");
+ //goal.transform(Matrix.rotate(new Vec(0, 0, 1), (float)(Math.PI/2)));
+ //goal.transform(Matrix.rotate(new Vec(1, 0, 0), (float)(Math.PI/2)));
+ float factor = (float)Math.pow(tile.volume() / goal.volume(), 1.0/3.0);
+ goal.transform(Matrix.scale(factor/1.6f));
+ fixupGoal();
+ }});
+ goalMenu.add(new MyMenuItem("Torus") { public void hit() {
+ loadGoal("torus.stl");
+ float factor = (float)Math.pow(tile.volume() / goal.volume(), 1.0/3.0);
+ goal.transform(Matrix.scale(factor/2.5f));
+ goal.transform(Matrix.rotate(new Vec(0, 1, 0), (float)(Math.PI/2)));
+ fixupGoal();
+ }});
+ tileMenu.add(new MyMenuItem("Hex Brick") { public void hit() {
+ hexBrick(false, false);
+ }});
+ tileMenu.add(new MyMenuItem("Hex Brick, offset planes") { public void hit() {
+ hexBrick(true, false);
+ }});
+ tileMenu.add(new MyMenuItem("Hex Brick, rotated") { public void hit() {
+ hexBrick(false, true);
+ }});
+ tileMenu.add(new MyMenuItem("Temp (do not use)") { public void hit() {
+ setTile(new Mesh(false));
+ float width = (float)0.8;
+ float depth = (float)0.08;
+ float height = (float)0.4;
+
+ float rshift = width/2;
+ float lshift = -(width/2);
+ float halfup = 0;
+ //float shift = height/2;
+ //width = (width*2)/3;
+ float shift = 0;
+ transforms = new Matrix[] {
+
+ Matrix.translate(new Vec(lshift/2, depth, -shift)),
+ Matrix.translate(new Vec(rshift/2, depth, -shift)),
+ Matrix.translate(new Vec(lshift/2, -depth, -shift)),
+ Matrix.translate(new Vec(rshift/2, -depth, -shift)),
+
+ Matrix.translate(new Vec(lshift, depth/2, -shift)),
+ Matrix.translate(new Vec(rshift, depth/2, -shift)),
+ Matrix.translate(new Vec(lshift, -depth/2, -shift)),
+ Matrix.translate(new Vec(rshift, -depth/2, -shift)),
+
+
+ /*
+ Matrix.translate(new Vec(lshift, depth, -shift)),
+ Matrix.translate(new Vec(rshift, depth, -shift)),
+ Matrix.translate(new Vec(lshift, -depth, -shift)),
+ Matrix.translate(new Vec(rshift, -depth, -shift)),
+ */
+ /*
+ Matrix.translate(new Vec(lshift, depth, shift)),
+ Matrix.translate(new Vec(rshift, depth, shift)),
+ Matrix.translate(new Vec(lshift, -depth, shift)),
+ Matrix.translate(new Vec(rshift, -depth, shift)),
+ */
+ //Matrix.translate(new Vec(0, depth, 0)).times(Matrix.rotate(new Vec(0, 0, 1), (float)Math.PI)),
+ //Matrix.translate(new Vec(0, -depth, 0)).times(Matrix.rotate(new Vec(0, 0, 1), (float)Math.PI)),
+ //Matrix.translate(new Vec(0, 0, height)).times(Matrix.rotate(new Vec(0, 0, 1), (float)Math.PI)),
+ //Matrix.translate(new Vec(0, 0, -height)).times(Matrix.rotate(new Vec(0, 0, 1), (float)Math.PI)),
+
+ //Matrix.translate(new Vec(0, depth, 0)),
+ //Matrix.translate(new Vec(0, -depth, 0)),
+ Matrix.translate(new Vec(0, 0, height)),
+ Matrix.translate(new Vec(0, 0, -height)),
+
+ //Matrix.translate(new Vec(lshift, depth, height/2)),
+ //Matrix.translate(new Vec(lshift, depth, -height/2)),
+ //Matrix.translate(new Vec(rshift, -depth, height/2)),
+ //Matrix.translate(new Vec(rshift, -depth, -height/2)),
+ //Matrix.translate(new Vec(rshift, 0, height)),
+ //Matrix.translate(new Vec(rshift, 0, -height)),
+
+ Matrix.translate(new Vec( width, 0, 0)),
+ Matrix.translate(new Vec(-width, 0, 0)),
+
+ Matrix.ONE
+ };
+ fixupTile();
+ } });
+ tileMenu.add(new MyMenuItem("Dense Packing (hex)") { public void hit() {
+ setTile(new Mesh(false));
+ float width = (float)3.2;
+ float depth = (float)0.32;
+ float height = (float)1.6;
+ float unit = 0.4f;
+ float r = unit/2;
+ float sin = (float)(unit * Math.sin(Math.PI/3));
+ float cos = (float)(unit * Math.cos(Math.PI/3));
+ float x = (float)(r*Math.tan(Math.PI/6));
+ float z = (float)(r/Math.cos(Math.PI/6));
+ height = 2*r*(float)Math.sqrt(2f/3f);
+
+ /*
+ r *= 0.3f;
+ cos *= 0.3f;
+ unit *= 0.3f;
+ */
+
+ /*
+ sin *= 0.3f;
+ x *= 0.3f;
+ z *= 0.3f;
+ */
+ transforms = new Matrix[] {
+ Matrix.translate(new Vec(-unit, 0, 0)),
+ Matrix.translate(new Vec( unit, 0, 0)),
+ Matrix.translate(new Vec(-cos, 0, sin)),
+ Matrix.translate(new Vec( cos, 0, sin)),
+ Matrix.translate(new Vec(-cos, 0, -sin)),
+ Matrix.translate(new Vec( cos, 0, -sin)),
+ Matrix.translate(new Vec( 0, height, z)),
+ Matrix.translate(new Vec(-r, height, -x)),
+ Matrix.translate(new Vec( r, height, -x)),
+ Matrix.translate(new Vec( 0, -height, -z)),
+ Matrix.translate(new Vec(-r, -height, x)),
+ Matrix.translate(new Vec( r, -height, x)),
+ Matrix.ONE,
+ };
+ generateTile(transforms, tile);
+ fixupTile();
+ } });
+
+ tileMenu.add(new MyMenuItem("Slim Dense Packing (Cubic)") { public void hit() {
+ setTile(new Mesh(false));
+ float unit = 0.4f;
+ float r = unit/2;
+ float sin = (float)(unit * Math.sin(Math.PI/3));
+ float cos = (float)(unit * Math.cos(Math.PI/3));
+ float x = (float)(r*Math.tan(Math.PI/6));
+ float z = (float)(r/Math.cos(Math.PI/6));
+ float height = 2*r*(float)Math.sqrt(2f/3f);
+
+ transforms = new Matrix[] {
+
+ //Matrix.reflect(new Vec( 0, height, -z).norm()),
+
+ Matrix.translate(new Vec(-unit, 0, 0)),
+ Matrix.translate(new Vec( unit, 0, 0)),
+ Matrix.translate(new Vec(-cos, 0, sin)),
+ Matrix.translate(new Vec( cos, 0, sin)),
+ Matrix.translate(new Vec(-cos, 0, -sin)),
+ Matrix.translate(new Vec( cos, 0, -sin)),
+
+ Matrix.translate(new Vec( 0, height, -z)),
+ Matrix.translate(new Vec(-r, height, x)),
+ Matrix.translate(new Vec( r, height, x)),
+ Matrix.translate(new Vec( 0, -height, z)),
+ Matrix.translate(new Vec(-r, -height, -x)),
+ Matrix.translate(new Vec( r, -height, -x)),
+
+ /*
+ Matrix.translate(new Vec( 0, height, -z)).times(Matrix.rotate(new Vec(0,1,0), (float)Math.PI)),
+ Matrix.translate(new Vec(-r, height, x)).times(Matrix.rotate(new Vec(0,1,0), (float)Math.PI)),
+ Matrix.translate(new Vec( r, height, x)).times(Matrix.rotate(new Vec(0,1,0), (float)Math.PI)),
+ Matrix.translate(new Vec( 0, -height, -z)).times(Matrix.rotate(new Vec(0,1,0), (float)Math.PI)),
+ Matrix.translate(new Vec(-r, -height, x)).times(Matrix.rotate(new Vec(0,1,0), (float)Math.PI)),
+ Matrix.translate(new Vec( r, -height, x)).times(Matrix.rotate(new Vec(0,1,0), (float)Math.PI)),
+ */
+
+ /*
+ Matrix.translate(new Vec( 0, height, -z)).times(Matrix.scale(-1,1,-1)),
+ Matrix.translate(new Vec(-r, height, x)).times(Matrix.scale(-1,1,-1)),
+ Matrix.translate(new Vec( r, height, x)).times(Matrix.scale(-1,1,-1)),
+ Matrix.translate(new Vec( 0, -height, -z)).times(Matrix.scale(-1,1,-1)),
+ Matrix.translate(new Vec(-r, -height, x)).times(Matrix.scale(-1,1,-1)),
+ Matrix.translate(new Vec( r, -height, x)).times(Matrix.scale(-1,1,-1)),
+ */
+ Matrix.ONE
+ };
+ generateTile(transforms, tile);
+
+
+ transforms = new Matrix[] {
+ Matrix.reflect(new Vec( 0, height, -z).norm()),
+ //Matrix.reflect(new Vec( 0, -height, z)),
+ Matrix.ONE,
+ Matrix.translate(new Vec(-unit, 0, 0)),
+ Matrix.translate(new Vec( unit, 0, 0)),
+ /*
+ Matrix.translate(new Vec(-cos, 0, sin)),
+ Matrix.translate(new Vec( cos, 0, sin)),
+ Matrix.translate(new Vec(-cos, 0, -sin)),
+ Matrix.translate(new Vec( cos, 0, -sin)),
+
+ Matrix.translate(new Vec( 0, height, -z)),
+ Matrix.translate(new Vec(-r, height, x)),
+ Matrix.translate(new Vec( r, height, x)),
+ Matrix.translate(new Vec( 0, -height, z)),
+ Matrix.translate(new Vec(-r, -height, -x)),
+ Matrix.translate(new Vec( r, -height, -x)),
+ */
+ };
+
+
+ //for(int i=0; i<transforms.length; i++) transforms[i] = Matrix.translate(m.times(vecs[i]));
+
+ Matrix m = Matrix.scale(1.9f, 1f ,1);
+ //Matrix m = Matrix.scale(1f, 2.1f, 1f);
+ tile.transform(m);
+ for(int i=0; i<transforms.length; i++)
+ transforms[i] = preMultiplyTranslationalComponentBy(transforms[i], m);
+
+
+ fixupTile();
+
+ } });
+ tileMenu.add(new MyMenuItem("Genus-1") { public void hit() {
+ synchronized(this) {
+ setTile(new Mesh(false));
+ Matrix mm = Matrix.scale(0.1f);
+ float height = 4;
+ float width = 4;
+ float depth = 1;
+ // top
+ quad(tile, mm,
+ new Point( 2, 2, 0),
+ new Point( 1, 1, -1),
+ new Point(-1, 1, -1),
+ new Point(-2, 2, 0));
+ quad(tile, mm,
+ new Point(-2, 2, 0),
+ new Point(-1, 1, 1),
+ new Point( 1, 1, 1),
+ new Point( 2, 2, 0));
+ quad(tile, mm,
+ new Point( 1, 1, -1),
+ new Point( 1, 1, 1),
+ new Point(-1, 1, 1),
+ new Point(-1, 1, -1));
+
+ // bottom
+ quad(tile, mm,
+ new Point(-2, -2, 0),
+ new Point(-1, -1, -1),
+ new Point( 1, -1, -1),
+ new Point( 2, -2, 0));
+ quad(tile, mm,
+ new Point( 2, -2, 0),
+ new Point( 1, -1, 1),
+ new Point(-1, -1, 1),
+ new Point(-2, -2, 0));
+ quad(tile, mm,
+ new Point(-1, -1, -1),
+ new Point(-1, -1, 1),
+ new Point( 1, -1, 1),
+ new Point( 1, -1, -1));
+
+ // left
+ quad(tile, mm,
+ new Point( 2, -2, 0),
+ new Point( 1, -1, -1),
+ new Point( 1, 1, -1),
+ new Point( 2, 2, 0));
+ quad(tile, mm,
+ new Point( 2, 2, 0),
+ new Point( 1, 1, 1),
+ new Point( 1, -1, 1),
+ new Point( 2, -2, 0));
+ quad(tile, mm,
+ new Point( 1, -1, -1),
+ new Point( 1, -1, 1),
+ new Point( 1, 1, 1),
+ new Point( 1, 1, -1));
+
+ // bottom
+ quad(tile, mm,
+ new Point(-2, 2, 0),
+ new Point(-1, 1, -1),
+ new Point(-1, -1, -1),
+ new Point(-2, -2, 0));
+ quad(tile, mm,
+ new Point(-2, -2, 0),
+ new Point(-1, -1, 1),
+ new Point(-1, 1, 1),
+ new Point(-2, 2, 0));
+ quad(tile, mm,
+ new Point(-1, 1, -1),
+ new Point(-1, 1, 1),
+ new Point(-1, -1, 1),
+ new Point(-1, -1, -1));
+
+ height = 4;
+ width = 4;
+ depth = 1;
+
+
+ transforms = new Matrix[] {
+ Matrix.translate(new Vec(0, 0.2f,0))
+ .times(Matrix.rotate(new Vec(0,1,0), (float)(1*Math.PI/2))),
+
+ Matrix.translate(new Vec(0,-0.2f,0))
+ .times(Matrix.rotate(new Vec(0,1,0), (float)(-1*Math.PI/2))),
+
+ Matrix.translate(new Vec( 0.2f,0,0))
+ .times(Matrix.rotate(new Vec(1,0,0), (float)(1*Math.PI/2))),
+
+ Matrix.translate(new Vec(-0.2f,0,0))
+ .times(Matrix.rotate(new Vec(1,0,0), (float)(-1*Math.PI/2))),
+
+
+ //Matrix.rotate(new Vec(0,0,1), (float)(1*Math.PI/2)),
+
+ /*
+ Matrix.rotate(new Vec(0,0,1), (float)(1*Math.PI/2)),
+
+ Matrix.rotate(new Vec(0,0,1), (float)(3*Math.PI/2)),
+ Matrix.rotate(new Vec(1,0,0), (float)(2*Math.PI/2)),
+ */
+
+ //Matrix.rotate(new Vec(0,0,1), (float)(2*Math.PI/2)),
+ //Matrix.scale(1,-1,1),
+
+ //Matrix.translate(new Vec( 0.2f, 0,0))
+ //.times(Matrix.rotate(new Vec(0,0,1), (float)( 1*Math.PI/2)))
+ //.times(Matrix.rotate(new Vec(0,1,0), (float)( 3*Math.PI/2))),
+
+ //Matrix.translate(new Vec(-0.2f, 0,0))
+ //.times(Matrix.rotate(new Vec(0,0,1), (float)( 3*Math.PI/2)))
+ //.times(Matrix.rotate(new Vec(0,1,0), (float)( 3*Math.PI/2))),
+
+ //Matrix.rotate(new Vec(0,0,1), (float)( 0*Math.PI/2))
+ //.times(Matrix.translate(new Vec(0, -0.2f, 0)))
+ //.times(Matrix.rotate(new Vec(0,1,0), (float)( 1*Math.PI/2))),
+ //Matrix.rotate(new Vec(0,0,1), (float)( 1*Math.PI/2))
+ //.times(Matrix.translate(new Vec(0, -0.2f, 0)))
+ //.times(Matrix.rotate(new Vec(0,1,0), (float)( 1*Math.PI/2))),
+
+ //Matrix.rotate(new Vec(0,0,1), (float)( 0*Math.PI/2))
+ //.times(Matrix.translate(new Vec(0, -0.2f, 0)))
+ //.times(Matrix.rotate(new Vec(0,1,0), (float)( 1*Math.PI/2))),
+ //Matrix.rotate(new Vec(0,0,1), (float)( 0*Math.PI/2))
+ //.times(Matrix.translate(new Vec(0, -0.2f, 0)))
+ //.times(Matrix.rotate(new Vec(0,1,0), (float)( 1*Math.PI/2))),
+
+ Matrix.ONE,
+ };
+ fixupTile();
+ }}});
+ tileMenu.add(new MyMenuItem("Hammerhead") { public void hit() {
+ synchronized(this) {
+ setTile(new Mesh(false));
+ Matrix mm = Matrix.ONE;
+ float height1 = .1f;
+ float height2 = .1f;
+ float width = .4f;
+ float depth = .1f;
+ // top
+ Point a1 = new Point( -width/2, height2/2, -depth/2);
+ Point b1 = new Point( 0, height2/2, -depth/2);
+ Point c1 = new Point( 0, height1+height2/2, -depth/2);
+ Point d1 = new Point( width/2, height1+height2/2, -depth/2);
+ Point e1 = new Point( width/2, height2/2, -depth/2);
+ Point f1 = new Point( width/2, -height2/2, -depth/2);
+ Point g1 = new Point( width/2,-height1-height2/2, -depth/2);
+ Point h1 = new Point( 0,-height1-height2/2, -depth/2);
+ Point i1 = new Point( 0, -height2/2, -depth/2);
+ Point j1 = new Point( -width/2, -height2/2, -depth/2);
+ Point a2 = new Point( -width/2, height2/2, depth/2);
+ Point b2 = new Point( 0, height2/2, depth/2);
+ Point c2 = new Point( 0, height1+height2/2, depth/2);
+ Point d2 = new Point( width/2, height1+height2/2, depth/2);
+ Point e2 = new Point( width/2, height2/2, depth/2);
+ Point f2 = new Point( width/2, -height2/2, depth/2);
+ Point g2 = new Point( width/2,-height1-height2/2, depth/2);
+ Point h2 = new Point( 0,-height1-height2/2, depth/2);
+ Point i2 = new Point( 0, -height2/2, depth/2);
+ Point j2 = new Point( -width/2, -height2/2, depth/2);
+
+ quad(tile, mm, a1, b1, i1, j1);
+ quad(tile, mm, c1, d1, e1, b1);
+ quad(tile, mm, b1, e1, f1, i1);
+ quad(tile, mm, i1, f1, g1, h1);
+
+ quad(tile, mm, j2, i2, b2, a2);
+ quad(tile, mm, b2, e2, d2, c2);
+ quad(tile, mm, i2, f2, e2, b2);
+ quad(tile, mm, h2, g2, f2, i2);
+
+ quad(tile, mm, d1, d2, e2, e1);
+ quad(tile, mm, e1, e2, f2, f1);
+ quad(tile, mm, f1, f2, g2, g1);
+ quad(tile, mm, h1, g1, g2, h2);
+ quad(tile, mm, i2, i1, h1, h2);
+ quad(tile, mm, j1, i1, i2, j2);
+ quad(tile, mm, a2, a1, j1, j2);
+ quad(tile, mm, a1, a2, b2, b1);
+ quad(tile, mm, c2, c1, b1, b2);
+ quad(tile, mm, c1, c2, d2, d1);
+
+ transforms = new Matrix[] {
+
+ mm.times(Matrix.translate(new Vec( width, 0, 0))),
+ mm.times(Matrix.translate(new Vec( -width, 0, 0))),
+ mm.times(Matrix.translate(new Vec(-width/2, height1+height2, 0))),
+ mm.times(Matrix.translate(new Vec( width/2, height1+height2, 0))),
+ mm.times(Matrix.translate(new Vec(-width/2,-height1-height2, 0))),
+ mm.times(Matrix.translate(new Vec( width/2,-height1-height2, 0))),
+
+ mm.times(Matrix.translate(new Vec( width/2, 0, depth))),
+ mm.times(Matrix.translate(new Vec( -width/2, 0, depth))),
+ mm.times(Matrix.translate(new Vec( 0, height1+height2, depth))),
+ mm.times(Matrix.translate(new Vec( 0,-height1-height2, depth))),
+
+ mm.times(Matrix.translate(new Vec( width/2, 0, -depth))),
+ mm.times(Matrix.translate(new Vec( -width/2, 0, -depth))),
+ mm.times(Matrix.translate(new Vec( 0, height1+height2, -depth))),
+ mm.times(Matrix.translate(new Vec( 0,-height1-height2, -depth))),
+
+ Matrix.ONE
+ };
+ fixupTile();
+ }}});
+ tileMenu.add(new MyMenuItem("Marching Cubes") { public void hit() {
+ marchingCubes();
+ }});
+
+ // Finally, add all the menus to the menu bar.
+ add(tileMenu);
+ //add(goalMenu);
+ //add(hideMenu);
+ }
+
+ }
+
+ private static Matrix preMultiplyTranslationalComponentBy(Matrix mthis, Matrix mm) {
+ Vec v = mm.times(mthis.getTranslationalComponent());
+ return new Matrix(mthis.a, mthis.b, mthis.c, v.x,
+ mthis.e, mthis.f, mthis.g, v.y,
+ mthis.i, mthis.j, mthis.k, v.z,
+ mthis.m, mthis.n, mthis.o, 1);
+ }
+
+//////////////////////////////////////////////////////////////////////////////
+ public void breakit() {