return;
}
assert(isAbove && isBelow);
IntegerArray indices = new IntegerArray();
int ia = -1;
int ofs = 0;
int n = face.vertexIndex.size();
while (!vertices.get(face.vertexIndex.get(ofs)).flag) {
ofs++;
}
for (int j = 0; j < n; j++) {
int i = (j + ofs) % n;
int i1 = face.vertexIndex.get(i);
int i2 = face.vertexIndex.get((i + 1) % n);
int i3 = face.vertexIndex.get((i + (n - 1)) % n);
Vertex v1 = vertices.get(i1);
Vertex v2 = vertices.get(i2);
Vertex v3 = vertices.get(i3);
if (v1.flag) {
indices.add(i1);
} else { // !v1.isAbove
if (v3.flag) {
Edge edge = new Edge(i3, i1);
Edge edgeRev = edge.reverse();
if (splitMap.containsKey(edgeRev)) {
int index = splitMap.get(edgeRev);
ia = index;
indices.add(index);
} else {
assert(!splitMap.containsKey(edge));
Ray3 ray = new Ray3(v1.position, v3.position);
Point3 p = ray.pointAt(plane.intersect(ray));
int index = addVertex(p);
ia = index;
vertices.get(index).tempInt = -1;
vertices.get(index).flag = true;
indices.add(index);
splitMap.put(edge, index);
}
}
if (v2.flag) {
Edge edge = new Edge(i1, i2);
Edge edgeRev = edge.reverse();
if (splitMap.containsKey(edgeRev)) {
int index = splitMap.get(edgeRev);
assert(ia >= 0);
vertices.get(index).tempInt = ia;
ia = -1;
indices.add(index);
} else {
assert(!splitMap.containsKey(edge));
Ray3 ray = new Ray3(v1.position, v2.position);
Point3 p = ray.pointAt(plane.intersect(ray));
int index = addVertex(p);
assert(ia >= 0);
if (ia < 0) {
ia = -1;
}
vertices.get(index).tempInt = ia;
ia = -1;
vertices.get(index).flag = true;
indices.add(index);
splitMap.put(edge, index);
}
}
}
}
assert(!indices.isEmpty());
face.vertexIndex.clear();
face.vertexIndex.addAll(indices);
face.flag = true;