*/
return ts.iterator();
}
+
public HashSet<T> ts = new HashSet<T>();
+ public RTree<T> tris = new RTree<T>();
public Mesh score_against = null;
public double score = 0;
score += oldscore;
}
+ private void removeTrianglesFromRTree() {
+ E e = this.e;
+ do {
+ if (e.t != null) e.t.removeFromRTree();
+ e = e.pair.next;
+ } while(e != this.e);
+ }
+ private void addTrianglesToRTree() {
+ E e = this.e;
+ do {
+ if (e.t != null) e.t.addToRTree();
+ e = e.pair.next;
+ } while(e != this.e);
+ }
+
/** does NOT update bound pairs! */
public boolean transform(Matrix m) {
unApplyQuadricToNeighbor();
+ Point oldp = this.p;
try {
if (pointset.get(this.p)==null) throw new Error();
pointset.remove(this);
+ removeTrianglesFromRTree();
float newx = m.a*p.x + m.b*p.y + m.c*p.z + m.d;
float newy = m.e*p.x + m.f*p.y + m.g*p.z + m.h;
float newz = m.i*p.x + m.j*p.y + m.k*p.z + m.l;
this.p = new Point(newx, newy, newz);
+ addTrianglesToRTree();
pointset.add(this);
} catch (Exception e) {
throw new RuntimeException(e);
applyQuadricToNeighbor();
// FIXME: intersection test needed?
- boolean good = true;
+ good = true;
// should recompute fundamental quadrics of all vertices sharing a face, but we defer...
E e = this.e;
e = e.pair.next;
} while(e != this.e);
- if (!ignorecollision)
- for(T t : Mesh.this) {
- if (!good) break;
- e = this.e;
- do {
- if (!t.has(e.p1) && !t.has(e.p2) && e.intersects(t)) { good = false; break; }
- if (e.t != null) {
- //if (!e.t.has(t.e1().p1) && !e.t.has(t.e1().p2) && t.e1().intersects(e.t)) { good = false; break; }
- //if (!e.t.has(t.e2().p1) && !e.t.has(t.e2().p2) && t.e2().intersects(e.t)) { good = false; break; }
- //if (!e.t.has(t.e3().p1) && !e.t.has(t.e3().p2) && t.e3().intersects(e.t)) { good = false; break; }
- }
- e = e.pair.next;
- } while(e != this.e);
+
+ if (!ignorecollision && good) {
+
+ tris.range(new Segment(oldp, this.p),
+ new Visitor<T>() {
+ public void visit(T t) {
+ if (!good) return;
+ E e = Vert.this.e;
+ do {
+ if (!t.has(e.p1) && !t.has(e.p2) && e.intersects(t)) { good = false; }
+ if (e.t != null) {
+ if (!e.t.has(t.e1().p1) && !e.t.has(t.e1().p2) && t.e1().intersects(e.t)) { good = false; }
+ if (!e.t.has(t.e2().p1) && !e.t.has(t.e2().p2) && t.e2().intersects(e.t)) { good = false; }
+ if (!e.t.has(t.e3().p1) && !e.t.has(t.e3().p2) && t.e3().intersects(e.t)) { good = false; }
+ }
+ e = e.pair.next;
+ } while(e != Vert.this.e);
+ }
+ });
+
+ /*
+ for(T t : Mesh.this) {
+ if (!good) break;
+ e = this.e;
+ do {
+ if (!t.has(e.p1) && !t.has(e.p2) && e.intersects(t)) { good = false; break; }
+ if (e.t != null) {
+ if (!e.t.has(t.e1().p1) && !e.t.has(t.e1().p2) && t.e1().intersects(e.t)) { good = false; break; }
+ if (!e.t.has(t.e2().p1) && !e.t.has(t.e2().p2) && t.e2().intersects(e.t)) { good = false; break; }
+ if (!e.t.has(t.e3().p1) && !e.t.has(t.e3().p2) && t.e3().intersects(e.t)) { good = false; break; }
+ }
+ e = e.pair.next;
+ } while(e != this.e);
+ }
+ */
}
+
reComputeErrorAround();
return good;
}
+ private boolean good;
public boolean move(Vec v) {
Matrix m = new Matrix(v);
public final int color;
public final int colorclass;
+ public void removeFromRTree() { tris.remove(this); }
+ public void addToRTree() { tris.insert(this); }
+
public void destroy() {
+ tris.remove(this);
ts.remove(this);
}
this.color = color;
this.colorclass = colorclass;
ts.add(this);
+ tris.add(this);
}
public E e1() { return e1; }
public E e2() { return e1.next; }