bool EdgeCollector::extractBoundaryEdgeloop(EdgeList & el, Edgeloop & edgeloop) { if (el.empty()) return false; osg::ref_ptr<Edge> current = el.back(); el.pop_back(); // ** init the Edgeloop edgeloop._edgeList.push_back(current.get()); bool done = false; while (!done) { bool found = false; EdgeList::iterator it = el.begin(), end = el.end(); while (it != end && !found) { if (current->endConnected(*(it->get()))) { found = true; } else { ++it; } } if (!found) { OSG_WARN << "extractBoundaryEdgeloop : unable to close edge loop" << std::endl; return false; } else { edgeloop._edgeList.push_back(it->get()); current = it->get(); el.erase(it); if (edgeloop.isClosed()) done = true; } } return true; }