Fixed loadOptimizedMeshQuery() when the TextureMesh has more than 1 texture. (#1538)

This commit is contained in:
matlabbe
2025-06-17 20:16:53 -07:00
parent 6e439d2342
commit 0536ddf0c9
2 changed files with 13 additions and 5 deletions
+5 -3
View File
@@ -5526,7 +5526,7 @@ cv::Mat DBDriverSqlite3::loadOptimizedMeshQuery(
materialPolygons[p][i] = serializedPolygons.at<int>(t + p*polygonSize + i); materialPolygons[p][i] = serializedPolygons.at<int>(t + p*polygonSize + i);
} }
} }
t+=materialPolygons.size()*polygonSize; t+=materialPolygons.size()*polygonSize-1;
polygons->push_back(materialPolygons); polygons->push_back(materialPolygons);
} }
} }
@@ -5543,7 +5543,7 @@ cv::Mat DBDriverSqlite3::loadOptimizedMeshQuery(
UASSERT(serializedTexCoords.total()); UASSERT(serializedTexCoords.total());
for(int t=0; t<serializedTexCoords.cols; ++t) for(int t=0; t<serializedTexCoords.cols; ++t)
{ {
UASSERT(int(serializedTexCoords.at<float>(t)) > 0); UASSERT_MSG(int(serializedTexCoords.at<float>(t)) > 0, uFormat("serializedTexCoords.at<float>(%d)=%f", t, serializedTexCoords.at<float>(t)).c_str());
#if PCL_VERSION_COMPARE(>=, 1, 8, 0) #if PCL_VERSION_COMPARE(>=, 1, 8, 0)
std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > materialtexCoords(int(serializedTexCoords.at<float>(t))); std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > materialtexCoords(int(serializedTexCoords.at<float>(t)));
#else #else
@@ -5556,8 +5556,10 @@ cv::Mat DBDriverSqlite3::loadOptimizedMeshQuery(
{ {
materialtexCoords[p][0] = serializedTexCoords.at<float>(t + p*2); materialtexCoords[p][0] = serializedTexCoords.at<float>(t + p*2);
materialtexCoords[p][1] = serializedTexCoords.at<float>(t + p*2 + 1); materialtexCoords[p][1] = serializedTexCoords.at<float>(t + p*2 + 1);
UASSERT(materialtexCoords[p][0]>=0.0f && materialtexCoords[p][0] <= 1.0f);
UASSERT(materialtexCoords[p][1]>=0.0f && materialtexCoords[p][1] <= 1.0f);
} }
t+=materialtexCoords.size()*2; t+=materialtexCoords.size()*2-1;
texCoords->push_back(materialtexCoords); texCoords->push_back(materialtexCoords);
} }
} }
+8 -2
View File
@@ -3481,18 +3481,24 @@ void DatabaseViewer::exportOptimizedMesh()
path += ".obj"; path += ".obj";
} }
QString baseName = QFileInfo(path).baseName(); QString baseName = QFileInfo(path).baseName();
UDEBUG("Materials: %d", mesh->tex_materials.size());
if(mesh->tex_materials.size() == 1) if(mesh->tex_materials.size() == 1)
{ {
mesh->tex_materials.at(0).tex_file = baseName.toStdString() + ".png"; mesh->tex_materials.at(0).tex_file = baseName.toStdString() + ".png";
cv::imwrite((QFileInfo(path).absoluteDir().absolutePath()+QDir::separator()+baseName).toStdString() + ".png", textures); std::string filename = (QFileInfo(path).absoluteDir().absolutePath()+QDir::separator()+baseName).toStdString() + ".png";
cv::imwrite(filename, textures);
UDEBUG("Saved %s", filename.c_str());
} }
else else
{ {
QDir(QFileInfo(path).absoluteDir().absolutePath()).mkdir(baseName);
for(unsigned int i=0; i<mesh->tex_materials.size(); ++i) for(unsigned int i=0; i<mesh->tex_materials.size(); ++i)
{ {
mesh->tex_materials.at(i).tex_file = (baseName+QDir::separator()+QString::number(i)+".png").toStdString(); mesh->tex_materials.at(i).tex_file = (baseName+QDir::separator()+QString::number(i)+".png").toStdString();
UASSERT((i+1)*textures.rows <= (unsigned int)textures.cols); UASSERT((i+1)*textures.rows <= (unsigned int)textures.cols);
cv::imwrite((QFileInfo(path).absoluteDir().absolutePath()+QDir::separator()+baseName+QDir::separator()+QString::number(i)+".png").toStdString(), textures(cv::Range::all(), cv::Range(i*textures.rows, (i+1)*textures.rows))); std::string filename = (QFileInfo(path).absoluteDir().absolutePath()+QDir::separator()+baseName+QDir::separator()+QString::number(i)+".png").toStdString();
cv::imwrite(filename, textures(cv::Range::all(), cv::Range(i*textures.rows, (i+1)*textures.rows)));
UDEBUG("Saved %s", filename.c_str());
} }
} }
pcl::io::saveOBJFile(path.toStdString(), *mesh); pcl::io::saveOBJFile(path.toStdString(), *mesh);