+ /*
+ 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();
+ }});
+ tileMenu.add(new MyMenuItem("Brain") { public void hit() {
+ marchingCubes2();
+ }});
+
+ // Finally, add all the menus to the menu bar.
+ add(tileMenu);
+ //add(goalMenu);
+ //add(hideMenu);
+ }