From 67881213f48e59596d86c578b3d6591cc43e701e Mon Sep 17 00:00:00 2001 From: Jeremy Hu Date: Sun, 3 Nov 2019 21:20:00 +0930 Subject: [PATCH] Fix transparent setting for color texture --- src/texturegenerator.cpp | 62 +++++++++++----------------------------- 1 file changed, 16 insertions(+), 46 deletions(-) diff --git a/src/texturegenerator.cpp b/src/texturegenerator.cpp index 1375e2ef..3840ca8b 100644 --- a/src/texturegenerator.cpp +++ b/src/texturegenerator.cpp @@ -228,7 +228,6 @@ void TextureGenerator::generate() const auto &triangleVertexUvs = *m_outcome->triangleVertexUvs(); const auto &triangleSourceNodes = *m_outcome->triangleSourceNodes(); - const auto &triangleNormals = m_outcome->triangleNormals; const auto &partUvRects = *m_outcome->partUvRects(); std::map partColorMap; @@ -396,10 +395,18 @@ void TextureGenerator::generate() drawGradient(oppositeSource.first, std::get<0>(opposite->second), std::get<1>(opposite->second), std::get<2>(opposite->second), source.first); } - auto drawTexture = [&](const std::map> &map, QPainter &painter) { + auto drawTexture = [&](const std::map> &map, QPainter &painter, bool useAlpha) { for (const auto &it: partUvRects) { const auto &partId = it.first; const auto &rects = it.second; + float alpha = 1.0; + if (useAlpha) { + auto findSourceColorResult = partColorMap.find(partId); + if (findSourceColorResult != partColorMap.end()) { + const auto &color = findSourceColorResult->second; + alpha = color.alphaF(); + } + } auto findTextureResult = map.find(partId); if (findTextureResult != map.end()) { float tileScale = findTextureResult->second.second; @@ -408,6 +415,7 @@ void TextureGenerator::generate() QImage scaledImage = image.scaled(newSize); auto pixmap = QPixmap::fromImage(scaledImage); QPixmap rotatedPixmap; + painter.setOpacity(alpha); for (const auto &rect: rects) { QRectF translatedRect = { rect.left() * TextureGenerator::m_textureSize, @@ -433,66 +441,28 @@ void TextureGenerator::generate() } }; - drawTexture(m_partColorTextureMap, texturePainter); - drawTexture(m_partNormalTextureMap, textureNormalPainter); - drawTexture(m_partMetalnessTextureMap, textureMetalnessPainter); - drawTexture(m_partRoughnessTextureMap, textureRoughnessPainter); - drawTexture(m_partAmbientOcclusionTextureMap, textureAmbientOcclusionPainter); + drawTexture(m_partColorTextureMap, texturePainter, true); + drawTexture(m_partNormalTextureMap, textureNormalPainter, false); + drawTexture(m_partMetalnessTextureMap, textureMetalnessPainter, false); + drawTexture(m_partRoughnessTextureMap, textureRoughnessPainter, false); + drawTexture(m_partAmbientOcclusionTextureMap, textureAmbientOcclusionPainter, false); for (auto i = 0u; i < triangleVertexUvs.size(); i++) { - QPainterPath path; - const std::vector &uv = triangleVertexUvs[i]; - float points[][2] = { - {uv[0][0] * TextureGenerator::m_textureSize, uv[0][1] * TextureGenerator::m_textureSize}, - {uv[1][0] * TextureGenerator::m_textureSize, uv[1][1] * TextureGenerator::m_textureSize}, - {uv[2][0] * TextureGenerator::m_textureSize, uv[2][1] * TextureGenerator::m_textureSize} - }; - path.moveTo(points[0][0], points[0][1]); - path.lineTo(points[1][0], points[1][1]); - path.lineTo(points[2][0], points[2][1]); - path = expandedPainterPath(path); const std::pair &source = triangleSourceNodes[i]; - // Copy normal texture if there is one auto findNormalTextureResult = m_partNormalTextureMap.find(source.first); if (findNormalTextureResult != m_partNormalTextureMap.end()) { - //textureNormalPainter.setClipping(true); - //textureNormalPainter.setClipPath(path); - //textureNormalPainter.drawImage(0, 0, findNormalTextureResult->second); - //textureNormalPainter.setClipping(false); hasNormalMap = true; - }/* else { - const auto &triangleNormal = triangleNormals[i]; - QColor brushColor; - brushColor.setRedF((triangleNormal.x() + 1) / 2); - brushColor.setGreenF((triangleNormal.y() + 1) / 2); - brushColor.setBlueF((triangleNormal.z() + 1) / 2); - textureNormalPainter.fillPath(path, brushColor); - }*/ - // Copy metalness texture if there is one + } auto findMetalnessTextureResult = m_partMetalnessTextureMap.find(source.first); if (findMetalnessTextureResult != m_partMetalnessTextureMap.end()) { - //textureMetalnessPainter.setClipping(true); - //textureMetalnessPainter.setClipPath(path); - //textureMetalnessPainter.drawImage(0, 0, findMetalnessTextureResult->second); - //textureMetalnessPainter.setClipping(false); hasMetalnessMap = true; } - // Copy roughness texture if there is one auto findRoughnessTextureResult = m_partRoughnessTextureMap.find(source.first); if (findRoughnessTextureResult != m_partRoughnessTextureMap.end()) { - //textureRoughnessPainter.setClipping(true); - //textureRoughnessPainter.setClipPath(path); - //textureRoughnessPainter.drawImage(0, 0, findRoughnessTextureResult->second); - //textureRoughnessPainter.setClipping(false); hasRoughnessMap = true; } - // Copy ambient occlusion texture if there is one auto findAmbientOcclusionTextureResult = m_partAmbientOcclusionTextureMap.find(source.first); if (findAmbientOcclusionTextureResult != m_partAmbientOcclusionTextureMap.end()) { - //textureAmbientOcclusionPainter.setClipping(true); - //textureAmbientOcclusionPainter.setClipPath(path); - //textureAmbientOcclusionPainter.drawImage(0, 0, findAmbientOcclusionTextureResult->second); - //textureAmbientOcclusionPainter.setClipping(false); hasAmbientOcclusionMap = true; } }