X-Git-Url: http://git.megacz.com/?p=anneal.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fqfat%2FMesh.java;h=7c3867295ba1eddbe011cd812f1d739ecd659288;hp=ecee9e5bcfc916ca4d0e3cdba5554cccfe21e986;hb=076fc38f95ee874e4bb01e03cb1021f5d137f35e;hpb=2d6bccf0ca59bca01f2a9942e90c7ddb9399ed44 diff --git a/src/edu/berkeley/qfat/Mesh.java b/src/edu/berkeley/qfat/Mesh.java index ecee9e5..7c38672 100644 --- a/src/edu/berkeley/qfat/Mesh.java +++ b/src/edu/berkeley/qfat/Mesh.java @@ -19,6 +19,47 @@ public class Mesh implements Iterable { private RTree triangles = new RTree(); private PointSet vertices = new PointSet(); + public boolean option_wireframe = false; + public boolean option_errorNormals = false; + public boolean option_selectable = true; + + public void render(GL gl, Matrix m) { + if (option_wireframe) { + gl.glDisable(GL.GL_LIGHTING); + gl.glBegin(GL.GL_LINES); + gl.glColor3f(1, 1, 1); + for (T t : this) { + m.times(t.e1().p1.goodp).glVertex(gl); + m.times(t.e1().p2.goodp).glVertex(gl); + m.times(t.e2().p1.goodp).glVertex(gl); + m.times(t.e2().p2.goodp).glVertex(gl); + m.times(t.e3().p1.goodp).glVertex(gl); + m.times(t.e3().p2.goodp).glVertex(gl); + } + gl.glEnd(); + gl.glEnable(GL.GL_LIGHTING); + return; + } + for(T t : this) { + gl.glColor4f((float)(0.25+(0.05*t.color)), + (float)(0.25+(0.05*t.color)), + (float)(0.75+(0.05*t.color)), + (float)0.3); + t.glTriangle(gl, m); + } + if (option_errorNormals) + for(T t : this) + for(Mesh.Vertex p : new Mesh.Vertex[] { t.v1(), t.v2(), t.v3() }) { + if (p.ok) { + gl.glBegin(GL.GL_LINES); + gl.glColor3f(1, 1, 1); + p.p.glVertex(gl); + p.p.plus(p.norm().times((float)p.error()*10)).glVertex(gl); + gl.glEnd(); + } + } + } + public boolean immutableVertices; public Mesh error_against = null; public double error = 0; @@ -110,6 +151,7 @@ public class Mesh implements Iterable { error += olderror; } + /* public Vertex hack(GL gl, Point mouse) { double dist = Double.MAX_VALUE; Vertex cur = null; @@ -123,6 +165,7 @@ public class Mesh implements Iterable { } return cur; } + */ public float averageTriangleArea() { int count = 0; @@ -204,7 +247,7 @@ public class Mesh implements Iterable { setError(nerror); } - public boolean move(Matrix m, boolean ignoreProblems) { + public boolean move(Vec vv, boolean ignoreProblems) { boolean good = true; @@ -215,21 +258,26 @@ public class Mesh implements Iterable { // M * t1 = M * t1.getMatrix(t2) * t2 if (bindingGroup!=null && this != bindingGroup.getMaster()) { - Matrix v = getBindingMatrix(bindingGroup.getMaster()); - return ((Vertex)bindingGroup.getMaster()).move(v.inverse().times(m).times(v), ignoreProblems); + Matrix m2 = getBindingMatrix(bindingGroup.getMaster()); + Vec v2 = m2.times(vv.plus(getPoint())).minus(m2.times(getPoint())); + return ((Vertex)bindingGroup.getMaster()).move(v2, ignoreProblems); } + Point op = this.p; + Point pp = vv.plus(getPoint()); if (bindingGroup != null) { - Matrix m2 = null; - for(int i=0; i<20 && !m.equals(m2); i++) { - m2 = m.times(getConstraint()); + /* + for(int i=0; i<20 ; i++) { + Point p2 = getConstraint().times(pp); + pp = pp.midpoint(p2); //System.out.println(m.minus(m2)); } - if (!m.equals(m2)) return true; + */ + pp = getConstraint().times(pp); } + pp = pp.minus(op).norm().times(vv.mag()).plus(op); ok = false; - Point op = this.p; - Point pt = m.times(this.p); + Point pt = pp; for(Vertex v : (Iterable)getBoundPeers()) { Point pt2 = v.getBindingMatrix(this).times(pt); /* @@ -261,7 +309,6 @@ public class Mesh implements Iterable { unApplyQuadricToNeighbor(); - boolean illegalbefore = illegal; illegal = false; /*