public void transform(Matrix m) {
ArrayList<Vertex> set = new ArrayList<Vertex>();
for(Vertex v : vertices) set.add(v);
- for(Vertex v : set) v.transform(m);
+ for(Vertex v : set) v.transform(m.times(v.p), true);
}
public void rebuild() { /*vertices.rebuild();*/ }
/** a vertex in the mesh */
public final class Vertex extends HasQuadric implements Visitor {
- public Point p;
+ public Point p, oldp;
E e; // some edge *leaving* this point
Matrix binding = Matrix.ONE;
}
/** does NOT update bound pairs! */
- public boolean transform(Matrix m) {
+ public boolean transform(Point newp, boolean ignoreProblems) {
+ this.oldp = this.p;
if (immutableVertices) throw new Error();
unApplyQuadricToNeighbor();
- Point oldp = this.p;
if (vertices.get(this.p)==null) throw new Error();
vertices.remove(this);
for(E e = this.e; e!=null; e=e.pair.next==this.e?null:e.pair.next)
if (e.t != null) e.t.removeFromRTree();
- this.p = m.times(this.p);
+ this.p = newp;
for(E e = this.e; e!=null; e=e.pair.next==this.e?null:e.pair.next)
if (e.t != null) e.t.addToRTree();
vertices.add(this);
good = true;
- for(E e = this.e; e!=null; e=e.pair.next==this.e?null:e.pair.next) {
- if (Math.abs(e.crossAngle()) > (Math.PI * 0.9) || Math.abs(e.next.crossAngle()) > (Math.PI * 0.9)) good = false;
- if (e.t.aspect() < 0.1) good = false;
- e.p2.quadricStale = true;
- }
+ if (!ignoreProblems)
+ for(E e = this.e; e!=null; e=e.pair.next==this.e?null:e.pair.next) {
+ if (Math.abs(e.crossAngle()) > (Math.PI * 0.9) || Math.abs(e.next.crossAngle()) > (Math.PI * 0.9)) good = false;
+ if (e.t.aspect() < 0.1) good = false;
+ e.p2.quadricStale = true;
+ }
- if (!ignorecollision && good) triangles.range(oldp, this.p, (Visitor<T>)this);
+ if (!ignorecollision && !ignoreProblems && good)
+ triangles.range(oldp, this.p, (Visitor<T>)this);
return good;
}
Matrix m = Matrix.translate(v);
boolean good = true;
for(Vertex p = this; p != null; p = (p.bound_to==this)?null:p.bound_to)
- good &= p.transform(m);
+ good &= p.transform(m.times(p.p), false);
for(Vertex p = this; p != null; p = (p.bound_to==this)?null:p.bound_to)
- if (good)
- p.reComputeErrorAround();
- else
- p.transform(Matrix.translate(v.times(-1)));
+ if (good) p.reComputeErrorAround();
+ else p.transform(p.oldp, true);
return good;
}