protected void calculateHorizon(Point3d eyePnt, HalfEdge edge0, Face face, Vector horizon) {
        // oldFaces.add (face);
        deleteFacePoints(face, null);
        face.mark = Face.DELETED;
        if (LOG.isDebugEnabled()) {
            LOG.debug("  visiting face " + face.getVertexString());
        }
        HalfEdge edge;
        if (edge0 == null) {
            edge0 = face.getEdge(0);
            edge = edge0;
        } else {
            edge = edge0.getNext();
        }
        do {
            Face oppFace = edge.oppositeFace();
            if (oppFace.mark == Face.VISIBLE) {
                if (oppFace.distanceToPlane(eyePnt) > tolerance) {
                    calculateHorizon(eyePnt, edge.getOpposite(), oppFace, horizon);
                } else {
                    horizon.add(edge);
                    if (LOG.isDebugEnabled()) {
                        LOG.debug("  adding horizon edge " + edge.getVertexString());
                    }
                }
            }
            edge = edge.getNext();
        } while (edge != edge0);
    }