| 157 | // Wrapper function to first process input data |
| 158 | namespace py = pybind11; |
| 159 | py::tuple segment_mesh_wrapper(py::array np_vertices, py::array np_faces, py::array np_colors, const float kthr=0.005, const int segMinVerts=20){ |
| 160 | |
| 161 | // get sizes of objects |
| 162 | auto castedVertices = np_vertices.request(); |
| 163 | auto castedFaces = np_faces.request(); |
| 164 | auto castedColors = np_colors.request(); |
| 165 | uint32_t nVertices = castedVertices.shape[0]; |
| 166 | uint32_t nFaces = castedFaces.shape[0]; |
| 167 | |
| 168 | // Request buffers |
| 169 | float* request_vertices = (float*) castedVertices.ptr; |
| 170 | int* request_faces = (int*) castedFaces.ptr; |
| 171 | float* request_colors = (float*) castedColors.ptr; |
| 172 | |
| 173 | // allocate and parse vectors |
| 174 | vector<vec3f> vertices(nVertices, vec3f(0., 0., 0.)); |
| 175 | vector<vec3f> normals(nVertices, vec3f(0., 0., 0.)); |
| 176 | vector<vec3f> colors(nVertices, vec3f(0., 0., 0.)); |
| 177 | vector<vec3i> faces(nFaces, vec3f(0., 0., 0.)); |
| 178 | |
| 179 | for (int i = 0; i < nVertices; ++i) { |
| 180 | vertices[i] = vec3f(request_vertices[i * 3], request_vertices[i * 3 + 1], request_vertices[i * 3 + 2]); |
| 181 | colors[i] = vec3f(request_colors[i * 3], request_colors[i * 3 + 1], request_colors[i * 3 + 2]); |
| 182 | } |
| 183 | for (int i = 0; i < nFaces; ++i) { |
| 184 | faces[i] = vec3i(request_faces[i * 3], request_faces[i * 3 + 1], request_faces[i * 3 + 2]); |
| 185 | } |
| 186 | |
| 187 | // Parse to MeshDataf object |
| 188 | // std::cout << "Segmenting: " << meshFile << ", threshold: " << kthr << ", min verts: " << segMinVerts << std::endl; |
| 189 | MeshDataf mesh; |
| 190 | mesh.m_Vertices = vertices; |
| 191 | mesh.m_Normals = normals; |
| 192 | mesh.m_Colors = colors; |
| 193 | mesh.m_FaceIndicesVertices = faces; |
| 194 | |
| 195 | // Do the actual processing |
| 196 | // std::cout << "Starting segmentation with " << nVertices << " vertices and " << nFaces << " faces." << std::endl; |
| 197 | std::map<std::pair<int, int>, int> connectivity; |
| 198 | const vector<int> comps = segment_mesh(mesh, kthr, segMinVerts, connectivity); |
| 199 | |
| 200 | // Map comps and connectivity to a [0-N] range instead of vertex indices |
| 201 | std::map<int, int> comp_mapping; |
| 202 | vector<int> comps_new; |
| 203 | comps_new = comps; // copy by value |
| 204 | |
| 205 | // Get sorted unique components |
| 206 | sort(comps_new.begin(), comps_new.end()); |
| 207 | auto last = unique(comps_new.begin(), comps_new.end()); |
| 208 | comps_new.erase(last, comps_new.end()); |
| 209 | |
| 210 | // Add components to mapping |
| 211 | for (int unique_index = 0; unique_index < comps_new.size(); unique_index++) { |
| 212 | comp_mapping.insert(std::pair<int, int>(comps_new[unique_index], unique_index)); |
| 213 | } |
| 214 | |
| 215 | // Map components |
| 216 | comps_new = comps; // copy by value |
nothing calls this directly
no test coverage detected