From 3e81a4e45f4f59f3b013387db2b186a554651b9f Mon Sep 17 00:00:00 2001 From: Jeremy HU Date: Thu, 3 Nov 2022 08:22:12 +1100 Subject: [PATCH] Fix seam UV --- application/sources/uv_map_generator.cc | 26 ++++------------------ dust3d/uv/uv_map_packer.cc | 29 +++++-------------------- dust3d/uv/uv_map_packer.h | 6 ----- 3 files changed, 9 insertions(+), 52 deletions(-) diff --git a/application/sources/uv_map_generator.cc b/application/sources/uv_map_generator.cc index 054a4b02..2f8870c2 100644 --- a/application/sources/uv_map_generator.cc +++ b/application/sources/uv_map_generator.cc @@ -132,28 +132,10 @@ void UvMapGenerator::generateTextureColorImage() colorTexturePainter.setPen(Qt::NoPen); for (const auto& layout : m_mapPacker->packedLayouts()) { - const QImage* image = nullptr; - std::unique_ptr seamImage; - if (layout.isSeam) { - seamImage = std::make_unique(layout.imageWidth, layout.imageHeight, QImage::Format_ARGB32); - seamImage->fill(Qt::red); - for (const auto& it : layout.uvCopyMap) { - const auto& sourceImageId = m_mapPacker->packedLayouts()[it.first].id; - const QImage* sourceImage = ImageForever::get(sourceImageId); - if (nullptr == sourceImage) { - dust3dDebug << "Find image failed:" << sourceImageId.toString(); - continue; - } - // TODO: copy triangle UV from source to seam image - } - //dust3dDebug << "layout.imageWidth:" << layout.imageWidth << "layout.imageHeight:" << layout.imageHeight; - image = seamImage.get(); - } else { - image = ImageForever::get(layout.id); - if (nullptr == image) { - dust3dDebug << "Find image failed:" << layout.id.toString(); - continue; - } + const QImage* image = image = ImageForever::get(layout.id); + if (nullptr == image) { + dust3dDebug << "Find image failed:" << layout.id.toString(); + continue; } QPixmap brushPixmap; if (layout.flipped) { diff --git a/dust3d/uv/uv_map_packer.cc b/dust3d/uv/uv_map_packer.cc index 9d768663..fcb79c9f 100644 --- a/dust3d/uv/uv_map_packer.cc +++ b/dust3d/uv/uv_map_packer.cc @@ -54,41 +54,26 @@ void UvMapPacker::resolveSeamUvs() for (const auto& it : part.localUv) { halfEdgeToUvMap.insert(std::make_pair(std::array { it.first[1], it.first[0] }, - TriangleUv { partIndex, it.second })); + TriangleUv { partIndex, { it.second[1], it.second[0], it.second[2] } })); halfEdgeToUvMap.insert(std::make_pair(std::array { it.first[2], it.first[1] }, - TriangleUv { partIndex, it.second })); + TriangleUv { partIndex, { it.second[2], it.second[1], it.second[0] } })); halfEdgeToUvMap.insert(std::make_pair(std::array { it.first[0], it.first[2] }, - TriangleUv { partIndex, it.second })); + TriangleUv { partIndex, { it.second[0], it.second[2], it.second[1] } })); } } for (size_t seamIndex = 0; seamIndex < m_seams.size(); ++seamIndex) { const auto& seam = m_seams[seamIndex]; - double seamUvMapWidth = 0.0; - double seamUvMapHeight = 0.0; - std::unordered_map, 2>> uvCopyMap; for (const auto& triangle : seam) { auto findUv = halfEdgeToUvMap.find({ triangle.first[0], triangle.first[1] }); if (findUv == halfEdgeToUvMap.end()) continue; const auto& triangleUv = findUv->second; - const auto& part = m_partTriangleUvs[triangleUv.partIndex]; - seamUvMapWidth += std::abs(triangleUv.uv[0].x() - triangleUv.uv[1].x()) * part.width; - seamUvMapHeight += std::abs(triangleUv.uv[0].y() - triangleUv.uv[1].y()) * part.height; - uvCopyMap.insert({ triangleUv.partIndex, { triangleUv.uv, triangle.second } }); + m_partTriangleUvs[triangleUv.partIndex].localUv.insert({ triangle.first, + triangleUv.uv }); } - if (uvCopyMap.empty()) - continue; - Part newPart; - newPart.isSeam = true; - newPart.width = seamUvMapWidth; - newPart.height = seamUvMapHeight; - newPart.uvCopyMap = std::move(uvCopyMap); - newPart.localUv = seam; - m_partTriangleUvs.emplace_back(newPart); - // dust3dDebug << "Seam uv map size:" << seamUvMapWidth << seamUvMapHeight; } } @@ -121,10 +106,6 @@ void UvMapPacker::pack() //dust3dDebug << "left:" << left << "top:" << top << "width:" << width << "height:" << height << "flipped:" << flipped; Layout layout; layout.id = part.id; - layout.isSeam = part.isSeam; - layout.imageWidth = part.width; - layout.imageHeight = part.height; - layout.uvCopyMap = part.uvCopyMap; layout.flipped = flipped; if (flipped) { layout.left = left; diff --git a/dust3d/uv/uv_map_packer.h b/dust3d/uv/uv_map_packer.h index 3873514a..7184229d 100644 --- a/dust3d/uv/uv_map_packer.h +++ b/dust3d/uv/uv_map_packer.h @@ -37,10 +37,8 @@ class UvMapPacker { public: struct Part { Uuid id; - bool isSeam = false; double width = 0.0; double height = 0.0; - std::unordered_map, 2>> uvCopyMap; std::map, std::array> localUv; }; @@ -51,10 +49,6 @@ public: double width = 0.0; double height = 0.0; bool flipped = false; - bool isSeam = false; - size_t imageWidth = 0; - size_t imageHeight = 0; - std::unordered_map, 2>> uvCopyMap; std::map, std::array> globalUv; };