diff --git a/src/libslic3r/Format/OBJ.cpp b/src/libslic3r/Format/OBJ.cpp index 8c504a642..0433e917c 100644 --- a/src/libslic3r/Format/OBJ.cpp +++ b/src/libslic3r/Format/OBJ.cpp @@ -165,12 +165,7 @@ bool load_obj(const char *path, TriangleMesh *meshptr, ObjInfo& obj_info, std::s } else { for (size_t k = 0; k < data.usemtls.size(); k++) { auto mtl = data.usemtls[k]; - if (mtl.vertexIdxEnd == -1 && face_index >= (mtl.vertexIdxFirst / ONE_FACE_SIZE)) { - set_face_color(face_index, data.usemtls[k].name); - break; - } else if (mtl.vertexIdxEnd != -1 && - face_index >= (mtl.vertexIdxFirst / ONE_FACE_SIZE) - && face_index < (mtl.vertexIdxEnd / ONE_FACE_SIZE)) { + if (face_index >= mtl.face_start && face_index <= mtl.face_end) { set_face_color(face_index, data.usemtls[k].name); break; } diff --git a/src/libslic3r/Format/objparser.cpp b/src/libslic3r/Format/objparser.cpp index 917f33d41..c56d6930c 100644 --- a/src/libslic3r/Format/objparser.cpp +++ b/src/libslic3r/Format/objparser.cpp @@ -251,6 +251,24 @@ static bool obj_parseline(const char *line, ObjData &data) data.vertices.push_back(vertex); EATWS(); } + if (data.usemtls.size() > 0) { + data.usemtls.back().vertexIdxEnd = (int) data.vertices.size(); + } + if (data.usemtls.size() > 0) { + int face_index_count = 0; + for (int i = data.vertices.size() - 1; i >= 0; i--) { + if (data.vertices[i].coordIdx == -1) { + break; + } + face_index_count++; + } + if (face_index_count == 3) {//tri + data.usemtls.back().face_end++; + } else if (face_index_count == 4) {//quad + data.usemtls.back().face_end++; + data.usemtls.back().face_end++; + } + } vertex.coordIdx = -1; vertex.normalIdx = -1; vertex.textureCoordIdx = -1; @@ -289,6 +307,16 @@ static bool obj_parseline(const char *line, ObjData &data) usemtl.vertexIdxFirst = (int)data.vertices.size(); usemtl.name = line; data.usemtls.push_back(usemtl); + if (data.usemtls.size() == 1) { + data.usemtls.back().face_start = 0; + } + else {//>=2 + auto count = data.usemtls.size(); + auto& last_usemtl = data.usemtls[count-1]; + auto& last_last_usemtl = data.usemtls[count - 2]; + last_usemtl.face_start = last_last_usemtl.face_end + 1; + } + data.usemtls.back().face_end = data.usemtls.back().face_start - 1; break; } case 'o': diff --git a/src/libslic3r/Format/objparser.hpp b/src/libslic3r/Format/objparser.hpp index 5c4a3ca2a..48493de3d 100644 --- a/src/libslic3r/Format/objparser.hpp +++ b/src/libslic3r/Format/objparser.hpp @@ -27,6 +27,8 @@ struct ObjUseMtl { int vertexIdxFirst; int vertexIdxEnd{-1}; + int face_start; + int face_end{-1}; std::string name; }; diff --git a/src/libslic3r/ObjColorUtils.hpp b/src/libslic3r/ObjColorUtils.hpp index 2e8565e42..4fe924fab 100644 --- a/src/libslic3r/ObjColorUtils.hpp +++ b/src/libslic3r/ObjColorUtils.hpp @@ -57,16 +57,19 @@ public: convert_color_space(flatten_image8UC3, image8UC3, color_space); cv::Mat image32FC3(image8UC3.rows, 1, CV_32FC3); - for (int i = 0; i < image8UC3.rows; i++) image32FC3.at(i, 0) = image8UC3.at(i, 0); + for (int i = 0; i < image8UC3.rows; i++) + image32FC3.at(i, 0) = image8UC3.at(i, 0); - int best_cluster = 1, cur_score = 0, best_score = 100; + int best_cluster = 1; + double cur_score, best_score = 100; int max_cluster = ori_colors.size(); num_cluster = fmin(num_cluster, max_cluster); if (num_cluster < 1) { cur_score = kmeans(image32FC3, 1, this->m_flatten_labels, cv::TermCriteria(cv::TermCriteria::EPS + cv::TermCriteria::COUNT, 300, 0.5), 3, cv::KMEANS_PP_CENTERS); best_score = cur_score; for (int cur_cluster = 2; cur_cluster < 16; cur_cluster++) { - if (cur_cluster > max_cluster) break; + if (cur_cluster > max_cluster) + break; cur_score = kmeans(image32FC3, cur_cluster, this->m_flatten_labels, cv::TermCriteria(cv::TermCriteria::EPS + cv::TermCriteria::COUNT, 300, 0.5), 3, cv::KMEANS_PP_CENTERS); best_cluster = cur_score < best_score ? cur_cluster : best_cluster; @@ -79,7 +82,8 @@ public: kmeans(image32FC3, best_cluster, this->m_flatten_labels, cv::TermCriteria(cv::TermCriteria::EPS + cv::TermCriteria::COUNT, 300, 0.5), 3, cv::KMEANS_PP_CENTERS, centers32FC3); this->m_centers8UC3 = cv::Mat(best_cluster, 1, CV_8UC3); - for (int i = 0; i < best_cluster; i++) this->m_centers8UC3.at(i) = centers32FC3.at(i); + for (int i = 0; i < best_cluster; i++) + this->m_centers8UC3.at(i) = centers32FC3.at(i); convert_color_space(this->m_centers8UC3, this->m_centers8UC3, color_space, true);