import javax.media.opengl.*;
import javax.media.opengl.glu.*;
import java.util.*;
+import edu.berkeley.qfat.bind.*;
import edu.berkeley.qfat.geom.*;
import edu.berkeley.qfat.geom.Point;
import edu.berkeley.qfat.geom.Polygon;
// TO DO:
+//
+// - Implement "real" constraints (plane, line, point)
+//
+// - Constrained surface subdivision
+// - Edge.flip() gets us the triforce subdivision
+// - Edge.delete() gets us the catmull-clark subdivision
+// - Catmull-Clark: just don't move points if we can't. Need to average the influence of the points on a binding group.
+//
+// - Ability to snap three views to orthgonal
+// - SLIDE UI
+// - left button -> crystal ball
+// - translate
+// - rightbutton/mousewheel zoom
+// - v+click to select vertex
+// - show: constraints, bindings, faces
+//
+// Editing:
+// - fracture edge, face
+// - change aspect ratio
+// - ability to select a point, rotate the model, then move the point
+// - when moving a vertex in one window, show that window's axes in all other windows
+//
+
+
+// TO DO:
// - real anneal
// - solve self-intersection problem
// - get a better test model?
public class Main extends InteractiveMeshViewer {
- public Matrix[] transforms;
+
public static int verts = 1;
if (v.mag() < 0.0001) continue;
v = v.times(-1);
v = v.times(0.5f);
- Point p = Point.ORIGIN.plus(v);
+ Point p = Point.ZERO.plus(v);
v = v.times(-1);
//System.out.println(v);
polygons.add(new Polygon(hs));
}
for(Polygon p : polygons) {
- System.out.println(p.plane.norm + " " + p.plane.dvalue);
+ System.out.println(p.plane.norm() + " " + p.plane.d);
for(HalfSpace hs : halfSpaces) {
if (p.plane==hs) continue;
p = p.intersect(hs);
JFrame f = new JFrame();
f.setLayout(new BorderLayout());
Main main = new Main(f);
+ f.add(main, BorderLayout.CENTER);
f.setJMenuBar(main.new MyMenuBar());
f.pack();
f.show();
es.add(t.e3());
}
for(Mesh.E e : es) {
- if (e.p1.p.x == e.p2.p.x && e.p1.p.y == e.p2.p.y) continue;
- if (e.p1.p.z == e.p2.p.z && e.p1.p.y == e.p2.p.y) continue;
- if (e.p1.p.x == e.p2.p.x && e.p1.p.z == e.p2.p.z) continue;
+ if (e.v1.p.x == e.v2.p.x && e.v1.p.y == e.v2.p.y) continue;
+ if (e.v1.p.z == e.v2.p.z && e.v1.p.y == e.v2.p.y) continue;
+ if (e.v1.p.x == e.v2.p.x && e.v1.p.z == e.v2.p.z) continue;
e.shatter();
}
transforms = new Matrix[] {
//Matrix m = Matrix.scale(1f, 2.1f, 1f);
tile.transform(m);
for(int i=0; i<transforms.length; i++)
- transforms[i] = transforms[i].preMultiplyTranslationalComponentBy(m);
+ transforms[i] = preMultiplyTranslationalComponentBy(transforms[i], m);
fixupTile();
} });
}
+ 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);
+ }
+
}
\ No newline at end of file