| 111 | |
| 112 | template<typename AdjacencyVector> |
| 113 | void EdgeSplitter::split_edge(const VectorI& edge, |
| 114 | const AdjacencyVector& adj_faces, Float max_length) { |
| 115 | const auto v0 = m_vertices.row(edge[0]); |
| 116 | const auto v1 = m_vertices.row(edge[1]); |
| 117 | Float length = (v0 - v1).norm(); |
| 118 | if (length < max_length) return; |
| 119 | |
| 120 | bool adj_faces_are_valid = true; |
| 121 | for (auto fi : adj_faces) { |
| 122 | adj_faces_are_valid = adj_faces_are_valid && m_face_is_valid[fi]; |
| 123 | } |
| 124 | if (!adj_faces_are_valid) return; |
| 125 | |
| 126 | const size_t base_v_idx = m_vertices.rows() + m_new_vertices.size(); |
| 127 | |
| 128 | std::list<VectorF> edge_vertices = {v0, v1}; |
| 129 | split(edge_vertices, edge_vertices.begin(), length, max_length); |
| 130 | assert(edge_vertices.size() > 2); |
| 131 | |
| 132 | const auto v_begin = std::next(edge_vertices.begin()); |
| 133 | const auto v_end = std::prev(edge_vertices.end()); |
| 134 | for (auto v_itr = v_begin; v_itr != v_end; v_itr++) { |
| 135 | m_new_vertices.push_back(*v_itr); |
| 136 | } |
| 137 | |
| 138 | const size_t num_edge_vertices = edge_vertices.size(); |
| 139 | for (auto fi : adj_faces) { |
| 140 | const auto& f = m_faces.row(fi); |
| 141 | size_t opposite_v_id = get_opposite_vertex_index(f, edge[0], edge[1]); |
| 142 | bool is_correctly_orientated = has_same_orientation( |
| 143 | f, opposite_v_id, edge[0], edge[1]); |
| 144 | for (size_t i=0; i<num_edge_vertices-1; i++) { |
| 145 | size_t curr_idx = i==0 ? edge[0] : i-1 + base_v_idx; |
| 146 | size_t next_idx = i==num_edge_vertices-2 ? edge[1] : i + base_v_idx; |
| 147 | if (is_correctly_orientated) |
| 148 | m_new_faces.emplace_back(opposite_v_id, curr_idx, next_idx); |
| 149 | else |
| 150 | m_new_faces.emplace_back(opposite_v_id, next_idx, curr_idx); |
| 151 | } |
| 152 | |
| 153 | m_face_is_valid[fi] = false; |
| 154 | } |
| 155 | } |
| 156 | |
| 157 | void EdgeSplitter::finalize_geometry() { |
| 158 | if (m_new_vertices.empty()) { |
nothing calls this directly
no test coverage detected