From f2fc58c699afc4c8ed4dcdea648b1b56794c8644 Mon Sep 17 00:00:00 2001 From: Jeremy HU Date: Sat, 29 Oct 2022 10:30:22 +1100 Subject: [PATCH] Remove materials Material will be integrated into part property. --- application/application.pro | 16 - application/resources.qrc | 1 - application/resources/material-demo-model.ds3 | Bin 249675 -> 0 bytes application/sources/document.cc | 272 +------ application/sources/document.h | 68 +- application/sources/document_saver.cc | 11 - application/sources/document_window.cc | 36 +- application/sources/document_window.h | 1 - application/sources/material.cc | 34 - application/sources/material.h | 18 - application/sources/material_edit_widget.cc | 335 --------- application/sources/material_edit_widget.h | 65 -- application/sources/material_layer.cc | 1 - application/sources/material_layer.h | 20 - application/sources/material_list_widget.cc | 308 -------- application/sources/material_list_widget.h | 48 -- application/sources/material_manage_widget.cc | 64 -- application/sources/material_manage_widget.h | 30 - .../sources/material_previews_generator.cc | 131 ---- .../sources/material_previews_generator.h | 30 - application/sources/material_widget.cc | 98 --- application/sources/material_widget.h | 38 - application/sources/texture_generator.cc | 702 ------------------ application/sources/texture_generator.h | 65 -- application/sources/theme.cc | 2 - application/sources/theme.h | 1 - application/sources/uv_map_generator.cc | 116 ++- application/sources/uv_map_generator.h | 20 + dust3d/uv/uv_map_packer.cc | 16 +- 29 files changed, 165 insertions(+), 2382 deletions(-) delete mode 100644 application/resources/material-demo-model.ds3 delete mode 100644 application/sources/material.cc delete mode 100644 application/sources/material.h delete mode 100644 application/sources/material_edit_widget.cc delete mode 100644 application/sources/material_edit_widget.h delete mode 100644 application/sources/material_layer.cc delete mode 100644 application/sources/material_layer.h delete mode 100644 application/sources/material_list_widget.cc delete mode 100644 application/sources/material_list_widget.h delete mode 100644 application/sources/material_manage_widget.cc delete mode 100644 application/sources/material_manage_widget.h delete mode 100644 application/sources/material_previews_generator.cc delete mode 100644 application/sources/material_previews_generator.h delete mode 100644 application/sources/material_widget.cc delete mode 100644 application/sources/material_widget.h delete mode 100644 application/sources/texture_generator.cc delete mode 100644 application/sources/texture_generator.h diff --git a/application/application.pro b/application/application.pro index 98a4716a..b576c7e7 100644 --- a/application/application.pro +++ b/application/application.pro @@ -145,20 +145,6 @@ SOURCES += sources/log_browser.cc HEADERS += sources/log_browser_dialog.h SOURCES += sources/log_browser_dialog.cc SOURCES += sources/main.cc -HEADERS += sources/material.h -SOURCES += sources/material.cc -HEADERS += sources/material_edit_widget.h -SOURCES += sources/material_edit_widget.cc -HEADERS += sources/material_layer.h -SOURCES += sources/material_layer.cc -HEADERS += sources/material_list_widget.h -SOURCES += sources/material_list_widget.cc -HEADERS += sources/material_manage_widget.h -SOURCES += sources/material_manage_widget.cc -HEADERS += sources/material_previews_generator.h -SOURCES += sources/material_previews_generator.cc -HEADERS += sources/material_widget.h -SOURCES += sources/material_widget.cc HEADERS += sources/mesh_generator.h SOURCES += sources/mesh_generator.cc HEADERS += sources/mesh_preview_images_generator.h @@ -195,8 +181,6 @@ HEADERS += sources/skeleton_ik_mover.h SOURCES += sources/skeleton_ik_mover.cc HEADERS += sources/spinnable_toolbar_icon.h SOURCES += sources/spinnable_toolbar_icon.cc -HEADERS += sources/texture_generator.h -SOURCES += sources/texture_generator.cc HEADERS += sources/theme.h SOURCES += sources/theme.cc HEADERS += sources/toolbar_button.h diff --git a/application/resources.qrc b/application/resources.qrc index 478d27cc..3b78ef15 100644 --- a/application/resources.qrc +++ b/application/resources.qrc @@ -25,7 +25,6 @@ resources/toolbar_z_disabled.svg resources/toolbar_radius.svg resources/toolbar_radius_disabled.svg - resources/material-demo-model.ds3 resources/model-addax.ds3 resources/model-banana.ds3 resources/model-bicycle.ds3 diff --git a/application/resources/material-demo-model.ds3 b/application/resources/material-demo-model.ds3 deleted file mode 100644 index 23a04e6d5e6f10415df4e4f3a93f33f967450ff3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 249675 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 &;fj* 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 XDrz)H{@GwabyFH6SvBMIq>~;V8 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

ZFJNF$p{qMR~`-g8* zwSXawTD>w0?*_LqY4d3UUd(XW+q@x##*GPB$yJ$SDKHdm_Y{{)7l5-%V)b-Oe9P-6 z-mrVf$FqqbqM!46l`@`_(ZPnFF$e-bpP{k8^vGHXuWQyYo#g2LFn_|Jf8EQ5tD47h z_Cb8QVbxY95vw+hG4SH2L&{7msLIZuq>QA%vI@)^o$-8-$-ez~j65>(0d*q&+41p2o=rdWefigi2n50j zbEReqv?M_|+|APmgg z1D4h$73EgTzFdB24nWgi|3{^3G~+lsJHBnMo5Mi_2(z2m`1*Mpk!tegfG!6)pY__9 zp(xTY5*7=?ZOMD`R#DGAA1*4oan&Ek&TWXej6auRp5zz^{wV~?LjV#3DN6#@5iDJv zjlxd|=1y?+Kk;NT(S_GV-8nh-EQ_Dm6R(&FUkkT-^ZvaLdj6yPq*ucY^@!i=N`ya0 z((-X5Q^36Pv$Ftbm%WUbPfaPN=m4i~aQ1UHbY1XkrN%P>qK)0%3jO9-=R0YrrO zhQl;0#(9v9JY|lBc+asc;};D+rOXJ`H%q9K(cM=GaD|pTsfx?vqsw)CFM23gs%*k= zQ3TLworPHK2k_*XEw>K%kSH;kv$}jiIaD`=bc0eq+Hdbd23*6NJ+-*pLvpspThOQ#r^-w4Fi|U z04^7>W|M+r<3F{-%SAFA2wSe$ykz!Nb1?8%P}e~Jbe?AAX3BA@c2Vk{*T*gvuY5Pb z=rEx06JCbynf7MH1yoT5irS`{F|dBoCx1zq0Vm5FDBBfKuXC-5JI!6x7MnSiT%J!Y zgrj}O1IC>rK!x>pV}o>D@4Zl(ZPIkUl}Bd|ud(qt#TRck=CFgb+aP}%-;|V+a^WAD z=qUR2)fx-Vm_Zsq?f^?_dN-`2wQg0_5M?MC&eHg2Ulna-!;!im+Qfi7VNEgrc&jUi z!{qg=yqnfDTl-g9NcDA)rSM$Y>I&;~12Q)~E#8B0rr;g&o)}^y;~n$RzQ^O;BpYyR z?r3ubp?M^&b-~YxzklpSN1tR@bks2j9vH%Odw)dWacY-M6Zy-T+~y(fjIs&4_k9dr zrb56c@1WOa)!;lIzm>z`VLkL;+w;Gl;E?rEM>0DTwWMftLdIP%^GLdK5u&%JEbudT zBdc5nQ7Zg%MbQe%!DZ+l|Afhq)pv@8xr>kYCanDkXadJH)9i%ki(eH9d>@>Kx;z~2 zC*lO|$RG$Jy-tGwqZ-gQj=}B&!@eyzwits9iOf{e)I(zJRPeQ!3Wn<1Q|!fcb`Hso zuiR$+3pGz13L=^G%+zHJEqA83?iwaB=D=z+=!VVF?aWl%02#;KPY2QhOGmr3(*Uyt z00}7B!HJMp76cd`;-IT^NnIO`OyGF}%e*o7<-Hz6$ljLk&{9-3c0` zkLpcQc}+0133Q{+AuVHLw}sLMCdhuG9)8|a1W9TRw=!sHCnZq>-eJ)$L@SMv>^d$V zF8=KqtyZj-p5I|R3M#N~z z{AoonpM?iu{*ew}QD7#I0jROT*s)73HrS2Q0OD^RWopGy?tT)5d(^p$v_J2#FAFYy zK`X@)K{^$5UH?5_kc7n#xZCJ+kHo&LPuv{o&k}v!TSf(RSh+mV^c%RQr+f&qyP+X< zu>1Bsrp1ku4sWlPh>H(?WGQ%GUXPxabdt8Ae42JLO!h<25%|2Clx&ROPBeE<9DLnQ z;7OQ0L1i6n?z>FGpY1Rh@_6q(58TW#rhz*vj8AJwGjhK#xj5TNZZ_hvklfI6{>IpO z_Nk*&GeeOm|F(0O}i z1Fp5CxI?^<|NOFzp}7C5Ztmmzu>WxZ=z5aN_8G!Da`Z7~^u*RH?Zr(IIb`W{KUh40Bb@tyA-- zRF)SO@XdAq`dlpg)PHtek(#-Ve2S&N%Kw7>?bABN?i#aI4QGW>|>CUzYc7KRl(=am(kk6u5)n#dd!#-A*yx+YwTd z@9&=D--h-%6aBiAq`BEEiSGNjehA$( zrhX8soG&-4Y5ZvyxhlR!Z*VyLc)~loDpX!GJ)(xe|M@+$#`K4J*H;8pfj1L(Y9anwWBQE%h9_|w4t%#Wq!)5 zAlGrgCF113WB{~Q$UTJ;fja`4Pl27p=*ryffRBw*k|Gs7loW+!%=ji4-3407* zz7)onc}6hetS7B#{V%BXCHp8wgg89K`QT&JY&3sUz;+v{J--pUZ-CPM&%Ig;L~%HB z!1;@s6$yItuP15rwt7Vm;;ldS-9Q;$Yf;qJ(~0=U6q7$ZLGLZbcGZE4u zSpPIgB$O$gZTkCA=aqaJ-DsU_97OmnpQ_kLtEjHM%!3-PeBeE6r&W04_xCj)q^o%V zh3qKszjb2e?CvBlZA|}kpOUC9#+mx7@+xORCBk3(;qX@STA3ZZr?+pk<@>}f}7DXFa?>3@Ji15)b+ka7t53{|NRq5FxUb6So@6G25$V~M0tt>``inxT`9BtHyM zWRfk7_aLXeIQRSmKibS|&0`>KLmvd{b#!`l>kme#ioP;GHr$7HejIe~x$(>9OGfT> zN%>9&f0l#dGF!RhTI4dXQ0el}t)3SnNv zVSt$hJ-fIu!AWq=Ssz234;41g@d=1KB%g>W$*DI@=XLaxc|S>2EW#<-9eq>tNNH&9Hd!J+CMEU#D);iAx?h1%bKxjFbFWLy zze$#A&kG2Cd>uVsWL?$1zvzC}7C`?zvC3a@cW=y@+fh%Mism(fV#7ror2nln{>#f2 zh|_}-R-H-9;J$9hd_gVAsz&2niWh``+_*xofXL2z0v@L-@Ml>Y7vljUod>dNW!ay7 zdJu+0yk;Uny;Q~Ir{g5~P)>X>Gq`I&@BQc&BzEztlGt56`2h zQ0B?BQxaXVLrT4hME$AE5BRBL@a&|O$;(UZ=Te=3VRjOeF=Ka%5gF)Y5CjOiSu!?W z8}@GcoEZ?(XTD++-jwCNoz$PzBykw96ZH~n^86Cf!DYx?SpeA@!s2wb%|L1*jMx7p z@>$5$>}hY}-728~spZAAgc<}BRBU7U&J|%5j;rBfaR#UNge5}JePeXDFYfoHvIZ;j z&<#_GRO^3n%-R8S4nTElnMweJK+@i4Eei{u7vG)+&C|oPlr**Xbi`uZW5A786 zf2sX>3FvMJ0mFx2FtT7&72?>^^QQduo&@LeyvZATa*~@4gDu^h*?aGlgKr3{6j%Kq zV!4oy@%i z%g6%59Lfw@Td?J|D92$scB%dsxP6{;%+B(F0exDjV8p7;6&hmvm^Vy3Wwh*+M#J%r zLY_00r_S*T@9l#K9N#I@==?Sy(^~nXcq6YZ%heA>`>VYF_R-E#SJdXWZ+r#AExez@ zQT`YX=HnE4dp2d=#B=AYqj$!eEZ2R3`~lRbpE*Kp+ZZPAzbLKBMwlB0gx}LG*r|<& zDka#FwLa-w2VSUv4_%|pXTLs##bQAY3Yf+mp*i|o-R6U$4?Z#{bezf(^2oKB|2`3N zcJNA!9_mebFj1OatvLNeCqE4?nXjG8aCV_V>v-c)C6>sztrNXdC6Oypm;o5uC~{;YdAeu z8vQvCiGW*&_<|SvoqKz0YnT;IHe=CAgSjOo$I)fac;zBz7|ULB!)o2}sJm7Ef!zFP z+zz(zM4lsqv#Xm%lx?NMe{o@7>ebBeUAe9w(c@xceSX&3YayVD`>%Gw#?B{xLSPeN zY8^_*VXZA?;nL<+ltX&kh$;4+7553tPT>h~5o3y_5{|v3Hp?yFD46!8 z4wH`(u}u;D;=Q)X ziy>1JEdfNRg7Zi;r$)<_A;U}HTQHhT0qJRLh!SBS1Lb8q2E#R3y&*K3?VSCmw!s|j zDrA|`D6eVKWYm@n`)K^~C6ML-d=w~ez+wXAdmMVelhowoo|TQ<6Mr(U-~0Y**Q3K5 z%=v8J(j6S0mtEwUlt>bP&LAqKjtYHaJZ8K zfOGJ`rRsB|#oELtFda2Ld;~xuUNi570P(jKOarO8y<=O`=JW5=807sRB0yGJ({u4C z-eJ-y%7>dAQHH&*4_NZZk0=_1^Vwys&@}JL_XkS%1Ety*bFi`=J%{hrq(6!6*t8^S zNh4`x)Q)7_f@10Cd89&Cm1sYBKEnSbnD0vE35}zvBZ%6;=_z^-&%jQ(RQEOjTdqL; z`O`1>CcQ*NHr@`;MVAyJa|Tr%AKKM%^)HIxf2cU;>Y^Yh3j?==t4elp^0Ofi`6;EfB$yQGGb=Z63_oDQD= zTo=Hj0vPG5qC4XlXIE?q2YU8qjVVQV&*3ZC@udK|&Srqyg8Ja%0AS>RsNYNu;C}KE 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%0DxsJdfx7%aK#k>gLiC<|0y6r^QD<)1(DJ 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%0D199AElW9 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

Fw!? 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

e+ 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 H #include #include @@ -1423,14 +1422,6 @@ bool Document::originSettled() const return !qFuzzyIsNull(getOriginX()) && !qFuzzyIsNull(getOriginY()) && !qFuzzyIsNull(getOriginZ()); } -const Material* Document::findMaterial(dust3d::Uuid materialId) const -{ - auto it = materialMap.find(materialId); - if (it == materialMap.end()) - return nullptr; - return &it->second; -} - void Document::setNodeCutRotation(dust3d::Uuid nodeId, float cutRotation) { auto node = nodeMap.find(nodeId); @@ -1571,8 +1562,7 @@ void Document::setEditMode(DocumentEditMode mode) } void Document::toSnapshot(dust3d::Snapshot* snapshot, const std::set& limitNodeIds, - DocumentToSnapshotFor forWhat, - const std::set& limitMaterialIds) const + DocumentToSnapshotFor forWhat) const { if (DocumentToSnapshotFor::Document == forWhat || DocumentToSnapshotFor::Nodes == forWhat) { std::set limitPartIds; @@ -1640,8 +1630,6 @@ void Document::toSnapshot(dust3d::Snapshot* snapshot, const std::setrootComponent["children"] = children; } } - if (DocumentToSnapshotFor::Document == forWhat || DocumentToSnapshotFor::Materials == forWhat) { - for (const auto& materialId : materialIdList) { - if (!limitMaterialIds.empty() && limitMaterialIds.find(materialId) == limitMaterialIds.end()) - continue; - auto findMaterialResult = materialMap.find(materialId); - if (findMaterialResult == materialMap.end()) { - qDebug() << "Find material failed:" << materialId; - continue; - } - auto& materialIt = *findMaterialResult; - std::map material; - material["id"] = materialIt.second.id.toString(); - material["type"] = "MetalRoughness"; - if (!materialIt.second.name.isEmpty()) - material["name"] = materialIt.second.name.toUtf8().constData(); - std::vector, std::vector>>> layers; - for (const auto& layer : materialIt.second.layers) { - std::vector> maps; - for (const auto& mapItem : layer.maps) { - std::map textureMap; - textureMap["for"] = TextureTypeToString(mapItem.forWhat); - textureMap["linkDataType"] = "imageId"; - textureMap["linkData"] = mapItem.imageId.toString(); - maps.push_back(textureMap); - } - std::map layerAttributes; - if (!qFuzzyCompare((float)layer.tileScale, (float)1.0)) - layerAttributes["tileScale"] = std::to_string(layer.tileScale); - layers.push_back({ layerAttributes, maps }); - } - snapshot->materials.push_back(std::make_pair(material, layers)); - } - } if (DocumentToSnapshotFor::Document == forWhat) { std::map canvas; canvas["originX"] = std::to_string(getOriginX()); @@ -1787,49 +1742,6 @@ void Document::addFromSnapshot(const dust3d::Snapshot& snapshot, enum SnapshotSo std::set inversePartIds; std::map oldNewIdMap; - for (const auto& materialIt : snapshot.materials) { - const auto& materialAttributes = materialIt.first; - auto materialType = dust3d::String::valueOrEmpty(materialAttributes, "type"); - if ("MetalRoughness" != materialType) { - qDebug() << "Unsupported material type:" << materialType; - continue; - } - dust3d::Uuid oldMaterialId = dust3d::Uuid(dust3d::String::valueOrEmpty(materialAttributes, "id")); - dust3d::Uuid newMaterialId = SnapshotSource::Import == source ? oldMaterialId : dust3d::Uuid::createUuid(); - oldNewIdMap[oldMaterialId] = newMaterialId; - if (materialMap.end() == materialMap.find(newMaterialId)) { - auto& newMaterial = materialMap[newMaterialId]; - newMaterial.id = newMaterialId; - newMaterial.name = dust3d::String::valueOrEmpty(materialAttributes, "name").c_str(); - for (const auto& layerIt : materialIt.second) { - MaterialLayer layer; - auto findTileScale = layerIt.first.find("tileScale"); - if (findTileScale != layerIt.first.end()) - layer.tileScale = dust3d::String::toFloat(findTileScale->second); - for (const auto& mapItem : layerIt.second) { - auto textureTypeString = dust3d::String::valueOrEmpty(mapItem, "for"); - auto textureType = dust3d::TextureTypeFromString(textureTypeString.c_str()); - if (dust3d::TextureType::None == textureType) { - qDebug() << "Unsupported texture type:" << textureTypeString; - continue; - } - auto linkTypeString = dust3d::String::valueOrEmpty(mapItem, "linkDataType"); - if ("imageId" != linkTypeString) { - qDebug() << "Unsupported link data type:" << linkTypeString; - continue; - } - auto imageId = dust3d::Uuid(dust3d::String::valueOrEmpty(mapItem, "linkData")); - MaterialMap materialMap; - materialMap.imageId = imageId; - materialMap.forWhat = textureType; - layer.maps.push_back(materialMap); - } - newMaterial.layers.push_back(layer); - } - materialIdList.push_back(newMaterialId); - emit materialAdded(newMaterialId); - } - } std::map cutFaceLinkedIdModifyMap; for (const auto& partKv : snapshot.parts) { const auto newUuid = dust3d::Uuid::createUuid(); @@ -1895,9 +1807,6 @@ void Document::addFromSnapshot(const dust3d::Snapshot& snapshot, enum SnapshotSo const auto& hollowThicknessIt = partKv.second.find("hollowThickness"); if (hollowThicknessIt != partKv.second.end()) part.hollowThickness = dust3d::String::toFloat(hollowThicknessIt->second); - const auto& materialIdIt = partKv.second.find("materialId"); - if (materialIdIt != partKv.second.end()) - part.materialId = oldNewIdMap[dust3d::Uuid(materialIdIt->second)]; part.countershaded = dust3d::String::isTrue(dust3d::String::valueOrEmpty(partKv.second, "countershaded")); part.smooth = dust3d::String::isTrue(dust3d::String::valueOrEmpty(partKv.second, "smooth")); newAddedPartIds.insert(part.id); @@ -2054,9 +1963,6 @@ void Document::addFromSnapshot(const dust3d::Snapshot& snapshot, enum SnapshotSo for (const auto& edgeIt : newAddedEdgeIds) { emit checkEdge(edgeIt); } - - if (!snapshot.materials.empty()) - emit materialListChanged(); } void Document::silentReset() @@ -2068,8 +1974,6 @@ void Document::silentReset() edgeMap.clear(); partMap.clear(); componentMap.clear(); - materialMap.clear(); - materialIdList.clear(); rootComponent = SkeletonComponent(); } @@ -2244,29 +2148,31 @@ void Document::generateTexture() m_isTextureObsolete = false; - dust3d::Snapshot* snapshot = new dust3d::Snapshot; - toSnapshot(snapshot); + auto object = std::make_unique(*m_postProcessedObject); + + auto snapshot = std::make_unique(); + toSnapshot(snapshot.get()); QThread* thread = new QThread; - m_textureGenerator = new TextureGenerator(*m_postProcessedObject, snapshot); + m_textureGenerator = new UvMapGenerator(std::move(object), std::move(snapshot)); m_textureGenerator->moveToThread(thread); - connect(thread, &QThread::started, m_textureGenerator, &TextureGenerator::process); - connect(m_textureGenerator, &TextureGenerator::finished, this, &Document::textureReady); - connect(m_textureGenerator, &TextureGenerator::finished, thread, &QThread::quit); + connect(thread, &QThread::started, m_textureGenerator, &UvMapGenerator::process); + connect(m_textureGenerator, &UvMapGenerator::finished, this, &Document::textureReady); + connect(m_textureGenerator, &UvMapGenerator::finished, thread, &QThread::quit); connect(thread, &QThread::finished, thread, &QThread::deleteLater); thread->start(); } void Document::textureReady() { - updateTextureImage(m_textureGenerator->takeResultTextureColorImage()); - updateTextureNormalImage(m_textureGenerator->takeResultTextureNormalImage()); - updateTextureMetalnessImage(m_textureGenerator->takeResultTextureMetalnessImage()); - updateTextureRoughnessImage(m_textureGenerator->takeResultTextureRoughnessImage()); - updateTextureAmbientOcclusionImage(m_textureGenerator->takeResultTextureAmbientOcclusionImage()); + updateTextureImage(m_textureGenerator->takeResultTextureColorImage().release()); + updateTextureNormalImage(m_textureGenerator->takeResultTextureNormalImage().release()); + updateTextureMetalnessImage(m_textureGenerator->takeResultTextureMetalnessImage().release()); + updateTextureRoughnessImage(m_textureGenerator->takeResultTextureRoughnessImage().release()); + updateTextureAmbientOcclusionImage(m_textureGenerator->takeResultTextureAmbientOcclusionImage().release()); delete m_resultTextureMesh; - m_resultTextureMesh = m_textureGenerator->takeResultMesh(); + m_resultTextureMesh = m_textureGenerator->takeResultMesh().release(); m_postProcessedObject->alphaEnabled = m_textureGenerator->hasTransparencySettings(); @@ -2486,21 +2392,6 @@ void Document::setPartDeformUnified(dust3d::Uuid partId, bool unified) emit skeletonChanged(); } -void Document::setPartMaterialId(dust3d::Uuid partId, dust3d::Uuid materialId) -{ - auto part = partMap.find(partId); - if (part == partMap.end()) { - qDebug() << "Part not found:" << partId; - return; - } - if (part->second.materialId == materialId) - return; - part->second.materialId = materialId; - part->second.dirty = true; - emit partMaterialIdChanged(partId); - emit textureChanged(); -} - void Document::setPartRoundState(dust3d::Uuid partId, bool rounded) { auto part = partMap.find(partId); @@ -2758,17 +2649,6 @@ bool Document::hasPastableNodesInClipboard() const return false; } -bool Document::hasPastableMaterialsInClipboard() const -{ - const QClipboard* clipboard = QApplication::clipboard(); - const QMimeData* mimeData = clipboard->mimeData(); - if (mimeData->hasText()) { - if (-1 != mimeData->text().indexOf("= 2; @@ -2816,126 +2696,6 @@ void Document::checkExportReadyState() emit exportReady(); } -void Document::addMaterial(dust3d::Uuid materialId, QString name, std::vector layers) -{ - auto findMaterialResult = materialMap.find(materialId); - if (findMaterialResult != materialMap.end()) { - qDebug() << "Material already exist:" << materialId; - return; - } - - dust3d::Uuid newMaterialId = materialId; - auto& material = materialMap[newMaterialId]; - material.id = newMaterialId; - - material.name = name; - material.layers = layers; - material.dirty = true; - - materialIdList.push_back(newMaterialId); - - emit materialAdded(newMaterialId); - emit materialListChanged(); - emit optionsChanged(); -} - -void Document::removeMaterial(dust3d::Uuid materialId) -{ - auto findMaterialResult = materialMap.find(materialId); - if (findMaterialResult == materialMap.end()) { - qDebug() << "Remove a none exist material:" << materialId; - return; - } - materialIdList.erase(std::remove(materialIdList.begin(), materialIdList.end(), materialId), materialIdList.end()); - materialMap.erase(findMaterialResult); - - emit materialListChanged(); - emit materialRemoved(materialId); - emit optionsChanged(); -} - -void Document::setMaterialLayers(dust3d::Uuid materialId, std::vector layers) -{ - auto findMaterialResult = materialMap.find(materialId); - if (findMaterialResult == materialMap.end()) { - qDebug() << "Find material failed:" << materialId; - return; - } - findMaterialResult->second.layers = layers; - findMaterialResult->second.dirty = true; - emit materialLayersChanged(materialId); - emit textureChanged(); - emit optionsChanged(); -} - -void Document::renameMaterial(dust3d::Uuid materialId, QString name) -{ - auto findMaterialResult = materialMap.find(materialId); - if (findMaterialResult == materialMap.end()) { - qDebug() << "Find material failed:" << materialId; - return; - } - if (findMaterialResult->second.name == name) - return; - - findMaterialResult->second.name = name; - emit materialNameChanged(materialId); - emit materialListChanged(); - emit optionsChanged(); -} - -void Document::generateMaterialPreviews() -{ - if (nullptr != m_materialPreviewsGenerator) { - return; - } - - QThread* thread = new QThread; - m_materialPreviewsGenerator = new MaterialPreviewsGenerator(); - bool hasDirtyMaterial = false; - for (auto& materialIt : materialMap) { - if (!materialIt.second.dirty) - continue; - m_materialPreviewsGenerator->addMaterial(materialIt.first, materialIt.second.layers); - materialIt.second.dirty = false; - hasDirtyMaterial = true; - } - if (!hasDirtyMaterial) { - delete m_materialPreviewsGenerator; - m_materialPreviewsGenerator = nullptr; - delete thread; - return; - } - - qDebug() << "Material previews generating.."; - - m_materialPreviewsGenerator->moveToThread(thread); - connect(thread, &QThread::started, m_materialPreviewsGenerator, &MaterialPreviewsGenerator::process); - connect(m_materialPreviewsGenerator, &MaterialPreviewsGenerator::finished, this, &Document::materialPreviewsReady); - connect(m_materialPreviewsGenerator, &MaterialPreviewsGenerator::finished, thread, &QThread::quit); - connect(thread, &QThread::finished, thread, &QThread::deleteLater); - thread->start(); -} - -void Document::materialPreviewsReady() -{ - for (const auto& materialId : m_materialPreviewsGenerator->generatedPreviewMaterialIds()) { - auto material = materialMap.find(materialId); - if (material != materialMap.end()) { - ModelMesh* resultPartPreviewMesh = m_materialPreviewsGenerator->takePreview(materialId); - material->second.updatePreviewMesh(resultPartPreviewMesh); - emit materialPreviewChanged(materialId); - } - } - - delete m_materialPreviewsGenerator; - m_materialPreviewsGenerator = nullptr; - - qDebug() << "Material previews generation done"; - - generateMaterialPreviews(); -} - bool Document::isMeshGenerating() const { return nullptr != m_meshGenerator; diff --git a/application/sources/document.h b/application/sources/document.h index 0c5b8809..8a890491 100644 --- a/application/sources/document.h +++ b/application/sources/document.h @@ -2,7 +2,6 @@ #define DUST3D_APPLICATION_DOCUMENT_H_ #include "debug.h" -#include "material_layer.h" #include "model_mesh.h" #include "monochrome_mesh.h" #include "theme.h" @@ -165,7 +164,6 @@ public: float cutRotation; dust3d::CutFace cutFace; dust3d::Uuid cutFaceLinkedId; - dust3d::Uuid materialId; dust3d::PartTarget target; float colorSolubility; float metalness; @@ -338,10 +336,6 @@ public: { return cutRotationAdjusted() || cutFaceAdjusted() || hollowThicknessAdjusted(); } - bool materialAdjusted() const - { - return !materialId.isNull(); - } bool isEditVisible() const { return visible && !disabled; @@ -364,7 +358,6 @@ public: cutFaceLinkedId = other.cutFaceLinkedId; componentId = other.componentId; dirty = other.dirty; - materialId = other.materialId; target = other.target; colorSolubility = other.colorSolubility; countershaded = other.countershaded; @@ -551,8 +544,7 @@ private: std::set m_childrenIdSet; }; -class MaterialPreviewsGenerator; -class TextureGenerator; +class UvMapGenerator; class MeshGenerator; class MeshResultPostProcessor; @@ -561,40 +553,9 @@ public: dust3d::Snapshot snapshot; }; -class Material { -public: - Material() - { - } - ~Material() - { - delete m_previewMesh; - } - dust3d::Uuid id; - QString name; - bool dirty = true; - std::vector layers; - void updatePreviewMesh(ModelMesh* previewMesh) - { - delete m_previewMesh; - m_previewMesh = previewMesh; - } - ModelMesh* takePreviewMesh() const - { - if (nullptr == m_previewMesh) - return nullptr; - return new ModelMesh(*m_previewMesh); - } - -private: - Q_DISABLE_COPY(Material); - ModelMesh* m_previewMesh = nullptr; -}; - enum class DocumentToSnapshotFor { Document = 0, - Nodes, - Materials + Nodes }; class Document : public QObject { @@ -618,7 +579,6 @@ signals: void partColorStateChanged(dust3d::Uuid partId); void partCutRotationChanged(dust3d::Uuid partId); void partCutFaceChanged(dust3d::Uuid partId); - void partMaterialIdChanged(dust3d::Uuid partId); void partChamferStateChanged(dust3d::Uuid partId); void partTargetChanged(dust3d::Uuid partId); void partColorSolubilityChanged(dust3d::Uuid partId); @@ -638,12 +598,6 @@ signals: void uncheckAll(); void checkNode(dust3d::Uuid nodeId); void checkEdge(dust3d::Uuid edgeId); - void materialAdded(dust3d::Uuid materialId); - void materialRemoved(dust3d::Uuid materialId); - void materialListChanged(); - void materialNameChanged(dust3d::Uuid materialId); - void materialLayersChanged(dust3d::Uuid materialId); - void materialPreviewChanged(dust3d::Uuid materialId); void meshGenerating(); void postProcessing(); void textureGenerating(); @@ -706,9 +660,6 @@ public: // need initialize public: Document(); ~Document(); - std::map materialMap; - std::vector materialIdList; - bool undoable() const; bool redoable() const; bool hasPastableNodesInClipboard() const; @@ -717,8 +668,7 @@ public: bool isEdgeEditable(dust3d::Uuid edgeId) const; void copyNodes(std::set nodeIdSet) const; void toSnapshot(dust3d::Snapshot* snapshot, const std::set& limitNodeIds = std::set(), - DocumentToSnapshotFor forWhat = DocumentToSnapshotFor::Document, - const std::set& limitMaterialIds = std::set()) const; + DocumentToSnapshotFor forWhat = DocumentToSnapshotFor::Document) const; void fromSnapshot(const dust3d::Snapshot& snapshot); enum class SnapshotSource { Unknown, @@ -726,7 +676,6 @@ public: Import }; void addFromSnapshot(const dust3d::Snapshot& snapshot, enum SnapshotSource source = SnapshotSource::Paste); - const Material* findMaterial(dust3d::Uuid materialId) const; ModelMesh* takeResultMesh(); MonochromeMesh* takeWireframeMesh(); ModelMesh* takePaintedMesh(); @@ -740,7 +689,6 @@ public: void updateTextureMetalnessImage(QImage* image); void updateTextureRoughnessImage(QImage* image); void updateTextureAmbientOcclusionImage(QImage* image); - bool hasPastableMaterialsInClipboard() const; const dust3d::Object& currentPostProcessedObject() const; bool isExportReady() const; bool isPostProcessResultObsolete() const; @@ -822,8 +770,6 @@ public slots: void textureReady(); void postProcess(); void postProcessedMeshResultReady(); - void generateMaterialPreviews(); - void materialPreviewsReady(); void setPartSubdivState(dust3d::Uuid partId, bool subdived); void setPartXmirrorState(dust3d::Uuid partId, bool mirrored); void setPartDeformThickness(dust3d::Uuid partId, float thickness); @@ -834,7 +780,6 @@ public slots: void setPartCutRotation(dust3d::Uuid partId, float cutRotation); void setPartCutFace(dust3d::Uuid partId, dust3d::CutFace cutFace); void setPartCutFaceLinkedId(dust3d::Uuid partId, dust3d::Uuid linkedId); - void setPartMaterialId(dust3d::Uuid partId, dust3d::Uuid materialId); void setPartChamferState(dust3d::Uuid partId, bool chamfered); void setPartTarget(dust3d::Uuid partId, dust3d::PartTarget target); void setPartColorSolubility(dust3d::Uuid partId, float solubility); @@ -852,10 +797,6 @@ public slots: void silentReset(); void toggleSmoothNormal(); void enableWeld(bool enabled); - void addMaterial(dust3d::Uuid materialId, QString name, std::vector); - void removeMaterial(dust3d::Uuid materialId); - void setMaterialLayers(dust3d::Uuid materialId, std::vector layers); - void renameMaterial(dust3d::Uuid materialId, QString name); void removeNode(dust3d::Uuid nodeId); void removeEdge(dust3d::Uuid edgeId); void removePart(dust3d::Uuid partId); @@ -932,14 +873,13 @@ private: int m_batchChangeRefCount = 0; dust3d::Object* m_currentObject = nullptr; bool m_isTextureObsolete = false; - TextureGenerator* m_textureGenerator = nullptr; + UvMapGenerator* m_textureGenerator = nullptr; bool m_isPostProcessResultObsolete = false; MeshResultPostProcessor* m_postProcessor = nullptr; dust3d::Object* m_postProcessedObject = new dust3d::Object; ModelMesh* m_resultTextureMesh = nullptr; unsigned long long m_textureImageUpdateVersion = 0; bool m_smoothNormal = false; - MaterialPreviewsGenerator* m_materialPreviewsGenerator = nullptr; quint64 m_meshGenerationId = 0; quint64 m_nextMeshGenerationId = 0; void* m_generatedCacheContext = nullptr; diff --git a/application/sources/document_saver.cc b/application/sources/document_saver.cc index 1a7aebba..95f83bbc 100644 --- a/application/sources/document_saver.cc +++ b/application/sources/document_saver.cc @@ -39,17 +39,6 @@ void DocumentSaver::collectUsedResourceIds(const dust3d::Snapshot* snapshot, dust3d::Uuid imageId = dust3d::Uuid(findImageIdString->second); imageIds.insert(imageId); } - for (const auto& material : snapshot->materials) { - for (auto& layer : material.second) { - for (auto& mapItem : layer.second) { - auto findImageIdString = mapItem.find("linkData"); - if (findImageIdString == mapItem.end()) - continue; - dust3d::Uuid imageId = dust3d::Uuid(findImageIdString->second); - imageIds.insert(imageId); - } - } - } } bool DocumentSaver::save(const QString* filename, diff --git a/application/sources/document_window.cc b/application/sources/document_window.cc index 96613b4b..7bb1f310 100644 --- a/application/sources/document_window.cc +++ b/application/sources/document_window.cc @@ -10,14 +10,13 @@ #include "horizontal_line_widget.h" #include "image_forever.h" #include "log_browser.h" -#include "material_manage_widget.h" #include "part_manage_widget.h" #include "preferences.h" #include "skeleton_graphics_widget.h" #include "spinnable_toolbar_icon.h" -#include "texture_generator.h" #include "theme.h" #include "updates_check_widget.h" +#include "uv_map_generator.h" #include "version.h" #include #include @@ -270,21 +269,6 @@ DocumentWindow::DocumentWindow() partsDocker->setWidget(m_partManageWidget); addDockWidget(Qt::RightDockWidgetArea, partsDocker); - QDockWidget* materialDocker = new QDockWidget(tr("Materials"), this); - materialDocker->setAllowedAreas(Qt::RightDockWidgetArea); - MaterialManageWidget* materialManageWidget = new MaterialManageWidget(m_document, materialDocker); - materialDocker->setWidget(materialManageWidget); - connect(materialManageWidget, &MaterialManageWidget::registerDialog, this, &DocumentWindow::registerDialog); - connect(materialManageWidget, &MaterialManageWidget::unregisterDialog, this, &DocumentWindow::unregisterDialog); - addDockWidget(Qt::RightDockWidgetArea, materialDocker); - connect(materialDocker, &QDockWidget::topLevelChanged, [=](bool topLevel) { - Q_UNUSED(topLevel); - for (const auto& material : m_document->materialMap) - emit m_document->materialPreviewChanged(material.first); - }); - - tabifyDockWidget(partsDocker, materialDocker); - partsDocker->raise(); QWidget* titleBarWidget = new QWidget; @@ -431,13 +415,6 @@ DocumentWindow::DocumentWindow() }); m_windowMenu->addAction(m_showPartsListAction); - m_showMaterialsAction = new QAction(tr("Materials"), this); - connect(m_showMaterialsAction, &QAction::triggered, [=]() { - materialDocker->show(); - materialDocker->raise(); - }); - m_windowMenu->addAction(m_showMaterialsAction); - QMenu* dialogsMenu = m_windowMenu->addMenu(tr("Dialogs")); connect(dialogsMenu, &QMenu::aboutToShow, [=]() { dialogsMenu->clear(); @@ -667,15 +644,6 @@ DocumentWindow::DocumentWindow() connect(m_document, &Document::zlockStateChanged, this, &DocumentWindow::updateZlockButtonState); connect(m_document, &Document::radiusLockStateChanged, this, &DocumentWindow::updateRadiusLockButtonState); - connect(m_document, &Document::materialAdded, this, [=](dust3d::Uuid materialId) { - Q_UNUSED(materialId); - m_document->generateMaterialPreviews(); - }); - connect(m_document, &Document::materialLayersChanged, this, [=](dust3d::Uuid materialId) { - Q_UNUSED(materialId); - m_document->generateMaterialPreviews(); - }); - initializeShortcuts(); connect(this, &DocumentWindow::initialized, m_document, &Document::uiReady); @@ -1088,7 +1056,7 @@ void DocumentWindow::exportGlbToFilename(const QString& filename) } QApplication::setOverrideCursor(Qt::WaitCursor); dust3d::Object skeletonResult = m_document->currentPostProcessedObject(); - QImage* textureMetalnessRoughnessAmbientOcclusionImage = TextureGenerator::combineMetalnessRoughnessAmbientOcclusionImages(m_document->textureMetalnessImage, + QImage* textureMetalnessRoughnessAmbientOcclusionImage = UvMapGenerator::combineMetalnessRoughnessAmbientOcclusionImages(m_document->textureMetalnessImage, m_document->textureRoughnessImage, m_document->textureAmbientOcclusionImage); GlbFileWriter glbFileWriter(skeletonResult, filename, diff --git a/application/sources/document_window.h b/application/sources/document_window.h index f9140b96..dcbdc273 100644 --- a/application/sources/document_window.h +++ b/application/sources/document_window.h @@ -144,7 +144,6 @@ private: QMenu* m_windowMenu = nullptr; QAction* m_showPartsListAction = nullptr; QAction* m_showDebugDialogAction = nullptr; - QAction* m_showMaterialsAction = nullptr; QMenu* m_helpMenu = nullptr; QAction* m_gotoHomepageAction = nullptr; diff --git a/application/sources/material.cc b/application/sources/material.cc deleted file mode 100644 index c5c1026c..00000000 --- a/application/sources/material.cc +++ /dev/null @@ -1,34 +0,0 @@ -#include "material.h" -#include "image_forever.h" - -void initializeMaterialTexturesFromSnapshot(const dust3d::Snapshot& snapshot, - const dust3d::Uuid& materialId, - MaterialTextures& materialTextures, - float& tileScale) -{ - auto materialIdString = materialId.toString(); - for (const auto& materialItem : snapshot.materials) { - if (materialIdString != dust3d::String::valueOrEmpty(materialItem.first, "id")) - continue; - for (const auto& layer : materialItem.second) { - //FIXME: Only support one layer currently - auto findTileScale = layer.first.find("tileScale"); - if (findTileScale != layer.first.end()) - tileScale = dust3d::String::toFloat(findTileScale->second); - for (const auto& mapItem : layer.second) { - auto textureType = dust3d::TextureTypeFromString(dust3d::String::valueOrEmpty(mapItem, "for").c_str()); - if (textureType != dust3d::TextureType::None) { - int index = (int)textureType - 1; - if (index >= 0 && index < (int)dust3d::TextureType::Count - 1) { - if ("imageId" == dust3d::String::valueOrEmpty(mapItem, "linkDataType")) { - auto imageIdString = dust3d::String::valueOrEmpty(mapItem, "linkData"); - materialTextures.textureImages[index] = ImageForever::get(dust3d::Uuid(imageIdString)); - } - } - } - } - break; - } - break; - } -} diff --git a/application/sources/material.h b/application/sources/material.h deleted file mode 100644 index b69357b5..00000000 --- a/application/sources/material.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef DUST3D_APPLICATION_MATERIAL_H_ -#define DUST3D_APPLICATION_MATERIAL_H_ - -#include -#include -#include -#include - -struct MaterialTextures { - const QImage* textureImages[(int)dust3d::TextureType::Count - 1] = { nullptr }; -}; - -void initializeMaterialTexturesFromSnapshot(const dust3d::Snapshot& snapshot, - const dust3d::Uuid& materialId, - MaterialTextures& materialTextures, - float& tileScale); - -#endif diff --git a/application/sources/material_edit_widget.cc b/application/sources/material_edit_widget.cc deleted file mode 100644 index bcb7df51..00000000 --- a/application/sources/material_edit_widget.cc +++ /dev/null @@ -1,335 +0,0 @@ -#include "material_edit_widget.h" -#include "document.h" -#include "float_number_widget.h" -#include "horizontal_line_widget.h" -#include "image_forever.h" -#include "theme.h" -#include "version.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -ImagePreviewWidget* MaterialEditWidget::createMapButton() -{ - ImagePreviewWidget* mapButton = new ImagePreviewWidget; - mapButton->setFixedSize(Theme::partPreviewImageSize * 2, Theme::partPreviewImageSize * 2); - updateMapButtonBackground(mapButton, nullptr); - return mapButton; -} - -QImage* MaterialEditWidget::pickImage() -{ - QString fileName = QFileDialog::getOpenFileName(this, QString(), QString(), - tr("Image Files (*.png *.jpg *.bmp)")) - .trimmed(); - if (fileName.isEmpty()) - return nullptr; - QImage* image = new QImage(); - if (!image->load(fileName)) - return nullptr; - return image; -} - -MaterialEditWidget::MaterialEditWidget(const Document* document, QWidget* parent) - : QDialog(parent) - , m_document(document) -{ - setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); - - m_layers.resize(1); - - m_previewWidget = new ModelWidget(this); - m_previewWidget->setMinimumSize(128, 128); - m_previewWidget->resize(512, 512); - m_previewWidget->move(-128, -128); - m_previewWidget->setNotGraphics(true); - - QFont nameFont; - nameFont.setWeight(QFont::Light); - nameFont.setBold(false); - - QGridLayout* mapLayout = new QGridLayout; - int row = 0; - int col = 0; - for (int i = 1; i < (int)dust3d::TextureType::Count; i++) { - QVBoxLayout* textureManageLayout = new QVBoxLayout; - - MaterialMap item; - item.forWhat = (dust3d::TextureType)i; - m_layers[0].maps.push_back(item); - - ImagePreviewWidget* imageButton = createMapButton(); - connect(imageButton, &ImagePreviewWidget::clicked, [=]() { - QImage* image = pickImage(); - if (nullptr == image) - return; - m_layers[0].maps[(int)i - 1].imageId = ImageForever::add(image); - updateMapButtonBackground(imageButton, image); - delete image; - emit layersAdjusted(); - }); - - QLabel* nameLabel = new QLabel(tr(dust3d::TextureTypeToDispName(item.forWhat).c_str())); - nameLabel->setFont(nameFont); - - QPushButton* eraser = new QPushButton(QChar(fa::eraser)); - Theme::initAwesomeToolButton(eraser); - - connect(eraser, &QPushButton::clicked, [=]() { - m_layers[0].maps[(int)i - 1].imageId = dust3d::Uuid(); - updateMapButtonBackground(imageButton, nullptr); - emit layersAdjusted(); - }); - - QHBoxLayout* textureTitleLayout = new QHBoxLayout; - textureTitleLayout->addWidget(eraser); - textureTitleLayout->addWidget(nameLabel); - textureTitleLayout->addStretch(); - - textureManageLayout->addWidget(imageButton); - textureManageLayout->addLayout(textureTitleLayout); - m_textureMapButtons[i - 1] = imageButton; - - mapLayout->addLayout(textureManageLayout, row, col++); - if (col == 2) { - col = 0; - row++; - } - } - - QVBoxLayout* rightLayout = new QVBoxLayout; - rightLayout->addStretch(); - rightLayout->addLayout(mapLayout); - rightLayout->addStretch(); - - QHBoxLayout* paramtersLayout = new QHBoxLayout; - paramtersLayout->setContentsMargins(256, 0, 0, 0); - paramtersLayout->addStretch(); - paramtersLayout->addLayout(rightLayout); - - m_nameEdit = new QLineEdit; - connect(m_nameEdit, &QLineEdit::textChanged, this, [=]() { - m_unsaved = true; - updateTitle(); - }); - QPushButton* saveButton = new QPushButton(tr("Save")); - connect(saveButton, &QPushButton::clicked, this, &MaterialEditWidget::save); - saveButton->setDefault(true); - - FloatNumberWidget* tileScaleWidget = new FloatNumberWidget; - tileScaleWidget->setItemName(tr("Tile Scale")); - tileScaleWidget->setRange(0.01, 1.0); - tileScaleWidget->setValue(m_layers[0].tileScale); - - m_tileScaleSlider = tileScaleWidget; - - connect(tileScaleWidget, &FloatNumberWidget::valueChanged, [=](float value) { - m_layers[0].tileScale = value; - emit layersAdjusted(); - }); - - QPushButton* tileScaleEraser = new QPushButton(QChar(fa::eraser)); - Theme::initAwesomeToolButton(tileScaleEraser); - - connect(tileScaleEraser, &QPushButton::clicked, [=]() { - tileScaleWidget->setValue(1.0); - }); - - QHBoxLayout* tileScaleLayout = new QHBoxLayout; - tileScaleLayout->addWidget(tileScaleEraser); - tileScaleLayout->addWidget(tileScaleWidget); - tileScaleLayout->addStretch(); - - QHBoxLayout* baseInfoLayout = new QHBoxLayout; - baseInfoLayout->addWidget(new QLabel(tr("Name"))); - baseInfoLayout->addWidget(m_nameEdit); - baseInfoLayout->addStretch(); - baseInfoLayout->addWidget(saveButton); - - QVBoxLayout* mainLayout = new QVBoxLayout; - mainLayout->addLayout(paramtersLayout); - mainLayout->addStretch(); - mainLayout->addWidget(new HorizontalLineWidget()); - mainLayout->addLayout(tileScaleLayout); - mainLayout->addLayout(baseInfoLayout); - - setLayout(mainLayout); - - connect(this, &MaterialEditWidget::layersAdjusted, this, &MaterialEditWidget::updatePreview); - connect(this, &MaterialEditWidget::layersAdjusted, [=]() { - m_unsaved = true; - updateTitle(); - }); - connect(this, &MaterialEditWidget::addMaterial, document, &Document::addMaterial); - connect(this, &MaterialEditWidget::renameMaterial, document, &Document::renameMaterial); - connect(this, &MaterialEditWidget::setMaterialLayers, document, &Document::setMaterialLayers); - - updatePreview(); - updateTitle(); -} - -void MaterialEditWidget::updateMapButtonBackground(ImagePreviewWidget* button, const QImage* image) -{ - if (nullptr == image) - button->updateImage(QImage()); - else - button->updateImage(*image); -} - -void MaterialEditWidget::reject() -{ - close(); -} - -void MaterialEditWidget::closeEvent(QCloseEvent* event) -{ - if (m_unsaved && !m_closed) { - QMessageBox::StandardButton answer = QMessageBox::question(this, - APP_NAME, - tr("Do you really want to close while there are unsaved changes?"), - QMessageBox::Yes | QMessageBox::No, - QMessageBox::No); - if (answer != QMessageBox::Yes) { - event->ignore(); - return; - } - } - m_closed = true; - hide(); - if (nullptr != m_materialPreviewsGenerator) { - event->ignore(); - return; - } - event->accept(); -} - -QSize MaterialEditWidget::sizeHint() const -{ - return QSize(0, 200); -} - -MaterialEditWidget::~MaterialEditWidget() -{ - Q_ASSERT(nullptr == m_materialPreviewsGenerator); -} - -void MaterialEditWidget::updatePreview() -{ - if (m_closed) - return; - - if (nullptr != m_materialPreviewsGenerator) { - m_isPreviewDirty = true; - return; - } - - m_isPreviewDirty = false; - - qDebug() << "Material preview generating.."; - - QThread* thread = new QThread; - m_materialPreviewsGenerator = new MaterialPreviewsGenerator(); - m_materialPreviewsGenerator->addMaterial(dust3d::Uuid(), m_layers); - m_materialPreviewsGenerator->moveToThread(thread); - connect(thread, &QThread::started, m_materialPreviewsGenerator, &MaterialPreviewsGenerator::process); - connect(m_materialPreviewsGenerator, &MaterialPreviewsGenerator::finished, this, &MaterialEditWidget::previewReady); - connect(m_materialPreviewsGenerator, &MaterialPreviewsGenerator::finished, thread, &QThread::quit); - connect(thread, &QThread::finished, thread, &QThread::deleteLater); - thread->start(); -} - -void MaterialEditWidget::previewReady() -{ - m_previewWidget->updateMesh(m_materialPreviewsGenerator->takePreview(dust3d::Uuid())); - - delete m_materialPreviewsGenerator; - m_materialPreviewsGenerator = nullptr; - - qDebug() << "Material preview generation done"; - - if (m_closed) { - close(); - return; - } - - if (m_isPreviewDirty) - updatePreview(); -} - -void MaterialEditWidget::setEditMaterialId(dust3d::Uuid materialId) -{ - if (m_materialId == materialId) - return; - - m_materialId = materialId; - updateTitle(); -} - -void MaterialEditWidget::updateTitle() -{ - if (m_materialId.isNull()) { - setWindowTitle(applicationTitle(tr("New") + (m_unsaved ? "*" : ""))); - return; - } - const Material* material = m_document->findMaterial(m_materialId); - if (nullptr == material) { - qDebug() << "Find material failed:" << m_materialId; - return; - } - setWindowTitle(applicationTitle(material->name + (m_unsaved ? "*" : ""))); -} - -void MaterialEditWidget::setEditMaterialName(QString name) -{ - m_nameEdit->setText(name); - updateTitle(); -} - -void MaterialEditWidget::setEditMaterialLayers(std::vector layers) -{ - for (int i = 1; i < (int)dust3d::TextureType::Count; i++) { - m_layers[0].maps[i - 1].imageId = dust3d::Uuid(); - } - if (!layers.empty()) { - for (const auto& layer : layers) { - m_layers[0].tileScale = layer.tileScale; - for (const auto& mapItem : layer.maps) { - int index = (int)mapItem.forWhat - 1; - if (index >= 0 && index < (int)dust3d::TextureType::Count - 1) { - m_layers[0].maps[index].imageId = mapItem.imageId; - } - } - } - m_tileScaleSlider->setValue(m_layers[0].tileScale); - } - for (int i = 1; i < (int)dust3d::TextureType::Count; i++) { - updateMapButtonBackground(m_textureMapButtons[i - 1], ImageForever::get(m_layers[0].maps[i - 1].imageId)); - } - updatePreview(); -} - -void MaterialEditWidget::clearUnsaveState() -{ - m_unsaved = false; - updateTitle(); -} - -void MaterialEditWidget::save() -{ - if (m_materialId.isNull()) { - m_materialId = dust3d::Uuid::createUuid(); - emit addMaterial(m_materialId, m_nameEdit->text(), m_layers); - } else if (m_unsaved) { - emit renameMaterial(m_materialId, m_nameEdit->text()); - emit setMaterialLayers(m_materialId, m_layers); - } - clearUnsaveState(); -} diff --git a/application/sources/material_edit_widget.h b/application/sources/material_edit_widget.h deleted file mode 100644 index 63359f8a..00000000 --- a/application/sources/material_edit_widget.h +++ /dev/null @@ -1,65 +0,0 @@ -#ifndef DUST3D_APPLICATION_MATERIAL_EDIT_WIDGET_H_ -#define DUST3D_APPLICATION_MATERIAL_EDIT_WIDGET_H_ - -#include "float_number_widget.h" -#include "image_preview_widget.h" -#include "material_layer.h" -#include "material_previews_generator.h" -#include "model_widget.h" -#include -#include -#include -#include - -class Document; - -enum class PopupWidgetType { - PitchYawRoll, - Intersection -}; - -class MaterialEditWidget : public QDialog { - Q_OBJECT -signals: - void addMaterial(dust3d::Uuid materialId, QString name, std::vector layers); - void removeMaterial(dust3d::Uuid materialId); - void setMaterialLayers(dust3d::Uuid materialId, std::vector layers); - void renameMaterial(dust3d::Uuid materialId, QString name); - void layersAdjusted(); - -public: - MaterialEditWidget(const Document* document, QWidget* parent = nullptr); - ~MaterialEditWidget(); -public slots: - void updatePreview(); - void setEditMaterialId(dust3d::Uuid materialId); - void setEditMaterialName(QString name); - void setEditMaterialLayers(std::vector layers); - void updateTitle(); - void save(); - void clearUnsaveState(); - void previewReady(); - -protected: - QSize sizeHint() const override; - void closeEvent(QCloseEvent* event) override; - void reject() override; - -private: - void updateMapButtonBackground(ImagePreviewWidget* button, const QImage* image); - ImagePreviewWidget* createMapButton(); - QImage* pickImage(); - const Document* m_document = nullptr; - MaterialPreviewsGenerator* m_materialPreviewsGenerator = nullptr; - ModelWidget* m_previewWidget = nullptr; - FloatNumberWidget* m_tileScaleSlider = nullptr; - bool m_isPreviewDirty = false; - bool m_closed = false; - dust3d::Uuid m_materialId; - bool m_unsaved = false; - QLineEdit* m_nameEdit = nullptr; - std::vector m_layers; - ImagePreviewWidget* m_textureMapButtons[(int)dust3d::TextureType::Count - 1] = { nullptr }; -}; - -#endif diff --git a/application/sources/material_layer.cc b/application/sources/material_layer.cc deleted file mode 100644 index 93debe1a..00000000 --- a/application/sources/material_layer.cc +++ /dev/null @@ -1 +0,0 @@ -#include "material_layer.h" diff --git a/application/sources/material_layer.h b/application/sources/material_layer.h deleted file mode 100644 index 9d7cacba..00000000 --- a/application/sources/material_layer.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef DUST3D_APPLICATION_MATERIAL_LAYER_H_ -#define DUST3D_APPLICATION_MATERIAL_LAYER_H_ - -#include -#include -#include - -class MaterialMap { -public: - dust3d::TextureType forWhat; - dust3d::Uuid imageId; -}; - -class MaterialLayer { -public: - std::vector maps; - float tileScale = 1.0; -}; - -#endif diff --git a/application/sources/material_list_widget.cc b/application/sources/material_list_widget.cc deleted file mode 100644 index 52045288..00000000 --- a/application/sources/material_list_widget.cc +++ /dev/null @@ -1,308 +0,0 @@ -#include "material_list_widget.h" -#include "document.h" -#include -#include -#include -#include -#include -#include - -MaterialListWidget::MaterialListWidget(const Document* document, QWidget* parent) - : QTreeWidget(parent) - , m_document(document) -{ - setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); - setFocusPolicy(Qt::NoFocus); - setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - - setAutoScroll(false); - - setHeaderHidden(true); - - QPalette palette = this->palette(); - palette.setColor(QPalette::Window, Qt::transparent); - palette.setColor(QPalette::Base, Qt::transparent); - setPalette(palette); - - setStyleSheet("QTreeView {qproperty-indentation: 0;}"); - - setContentsMargins(0, 0, 0, 0); - - connect(document, &Document::materialListChanged, this, &MaterialListWidget::reload); - connect(document, &Document::cleanup, this, &MaterialListWidget::removeAllContent); - - connect(this, &MaterialListWidget::removeMaterial, document, &Document::removeMaterial); - - setContextMenuPolicy(Qt::CustomContextMenu); - connect(this, &QTreeWidget::customContextMenuRequested, this, &MaterialListWidget::showContextMenu); - - reload(); -} - -void MaterialListWidget::enableMultipleSelection(bool enabled) -{ - m_multipleSelectionEnabled = enabled; -} - -void MaterialListWidget::materialRemoved(dust3d::Uuid materialId) -{ - if (m_currentSelectedMaterialId == materialId) - m_currentSelectedMaterialId = dust3d::Uuid(); - m_selectedMaterialIds.erase(materialId); - m_itemMap.erase(materialId); -} - -void MaterialListWidget::updateMaterialSelectState(dust3d::Uuid materialId, bool selected) -{ - auto findItemResult = m_itemMap.find(materialId); - if (findItemResult == m_itemMap.end()) { - qDebug() << "Find material item failed:" << materialId; - return; - } - MaterialWidget* materialWidget = (MaterialWidget*)itemWidget(findItemResult->second.first, findItemResult->second.second); - materialWidget->updateCheckedState(selected); -} - -void MaterialListWidget::selectMaterial(dust3d::Uuid materialId, bool multiple) -{ - if (multiple) { - if (!m_currentSelectedMaterialId.isNull()) { - m_selectedMaterialIds.insert(m_currentSelectedMaterialId); - m_currentSelectedMaterialId = dust3d::Uuid(); - } - if (m_selectedMaterialIds.find(materialId) != m_selectedMaterialIds.end()) { - updateMaterialSelectState(materialId, false); - m_selectedMaterialIds.erase(materialId); - } else { - if (m_multipleSelectionEnabled || m_selectedMaterialIds.empty()) { - updateMaterialSelectState(materialId, true); - m_selectedMaterialIds.insert(materialId); - } - } - if (m_selectedMaterialIds.size() > 1) { - return; - } - if (m_selectedMaterialIds.size() == 1) - materialId = *m_selectedMaterialIds.begin(); - else { - materialId = dust3d::Uuid(); - emit currentSelectedMaterialChanged(materialId); - } - } - if (!m_selectedMaterialIds.empty()) { - for (const auto& id : m_selectedMaterialIds) { - updateMaterialSelectState(id, false); - } - m_selectedMaterialIds.clear(); - } - if (m_currentSelectedMaterialId != materialId) { - if (!m_currentSelectedMaterialId.isNull()) { - updateMaterialSelectState(m_currentSelectedMaterialId, false); - } - m_currentSelectedMaterialId = materialId; - if (!m_currentSelectedMaterialId.isNull()) { - updateMaterialSelectState(m_currentSelectedMaterialId, true); - } - emit currentSelectedMaterialChanged(m_currentSelectedMaterialId); - } -} - -void MaterialListWidget::mousePressEvent(QMouseEvent* event) -{ - QModelIndex itemIndex = indexAt(event->pos()); - QTreeView::mousePressEvent(event); - if (event->button() == Qt::LeftButton) { - bool multiple = QGuiApplication::queryKeyboardModifiers().testFlag(Qt::ControlModifier); - if (itemIndex.isValid()) { - QTreeWidgetItem* item = itemFromIndex(itemIndex); - auto materialId = dust3d::Uuid(item->data(itemIndex.column(), Qt::UserRole).toString().toUtf8().constData()); - if (QGuiApplication::queryKeyboardModifiers().testFlag(Qt::ShiftModifier)) { - bool startAdd = false; - bool stopAdd = false; - std::vector waitQueue; - for (const auto& childId : m_document->materialIdList) { - if (m_shiftStartMaterialId == childId || materialId == childId) { - if (startAdd) { - stopAdd = true; - } else { - startAdd = true; - } - } - if (startAdd) - waitQueue.push_back(childId); - if (stopAdd) - break; - } - if (stopAdd && !waitQueue.empty()) { - if (!m_selectedMaterialIds.empty()) { - for (const auto& id : m_selectedMaterialIds) { - updateMaterialSelectState(id, false); - } - m_selectedMaterialIds.clear(); - } - if (!m_currentSelectedMaterialId.isNull()) { - m_currentSelectedMaterialId = dust3d::Uuid(); - } - for (const auto& waitId : waitQueue) { - selectMaterial(waitId, true); - } - } - return; - } else { - m_shiftStartMaterialId = materialId; - } - selectMaterial(materialId, multiple); - return; - } - if (!multiple) - selectMaterial(dust3d::Uuid()); - } -} - -bool MaterialListWidget::isMaterialSelected(dust3d::Uuid materialId) -{ - return (m_currentSelectedMaterialId == materialId || m_selectedMaterialIds.find(materialId) != m_selectedMaterialIds.end()); -} - -void MaterialListWidget::showContextMenu(const QPoint& pos) -{ - if (!m_hasContextMenu) - return; - - QMenu contextMenu(this); - - std::set unorderedMaterialIds = m_selectedMaterialIds; - if (!m_currentSelectedMaterialId.isNull()) - unorderedMaterialIds.insert(m_currentSelectedMaterialId); - - std::vector materialIds; - for (const auto& cand : m_document->materialIdList) { - if (unorderedMaterialIds.find(cand) != unorderedMaterialIds.end()) - materialIds.push_back(cand); - } - - QAction modifyAction(tr("Modify"), this); - if (materialIds.size() == 1) { - connect(&modifyAction, &QAction::triggered, this, [=]() { - emit modifyMaterial(*materialIds.begin()); - }); - contextMenu.addAction(&modifyAction); - } - - QAction copyAction(tr("Copy"), this); - if (!materialIds.empty()) { - connect(©Action, &QAction::triggered, this, &MaterialListWidget::copy); - contextMenu.addAction(©Action); - } - - QAction pasteAction(tr("Paste"), this); - if (m_document->hasPastableMaterialsInClipboard()) { - connect(&pasteAction, &QAction::triggered, m_document, &Document::paste); - contextMenu.addAction(&pasteAction); - } - - QAction deleteAction(tr("Delete"), this); - if (!materialIds.empty()) { - connect(&deleteAction, &QAction::triggered, [=]() { - for (const auto& materialId : materialIds) - emit removeMaterial(materialId); - }); - contextMenu.addAction(&deleteAction); - } - - contextMenu.exec(mapToGlobal(pos)); -} - -void MaterialListWidget::resizeEvent(QResizeEvent* event) -{ - QTreeWidget::resizeEvent(event); - if (calculateColumnCount() != columnCount()) - reload(); -} - -int MaterialListWidget::calculateColumnCount() -{ - if (nullptr == parentWidget()) - return 0; - - int columns = parentWidget()->width() / Theme::materialPreviewImageSize; - if (0 == columns) - columns = 1; - return columns; -} - -void MaterialListWidget::reload() -{ - removeAllContent(); - - int columns = calculateColumnCount(); - if (0 == columns) - return; - - int columnWidth = parentWidget()->width() / columns; - - //qDebug() << "parentWidth:" << parentWidget()->width() << "columnWidth:" << columnWidth << "columns:" << columns; - - setColumnCount(columns); - for (int i = 0; i < columns; i++) - setColumnWidth(i, columnWidth); - - std::vector orderedMaterialIdList = m_document->materialIdList; - std::sort(orderedMaterialIdList.begin(), orderedMaterialIdList.end(), [&](const dust3d::Uuid& firstMaterialId, const dust3d::Uuid& secondMaterialId) { - const auto* firstMaterial = m_document->findMaterial(firstMaterialId); - const auto* secondMaterial = m_document->findMaterial(secondMaterialId); - if (nullptr == firstMaterial || nullptr == secondMaterial) - return false; - return QString::compare(firstMaterial->name, secondMaterial->name, Qt::CaseInsensitive) < 0; - }); - - decltype(orderedMaterialIdList.size()) materialIndex = 0; - while (materialIndex < orderedMaterialIdList.size()) { - QTreeWidgetItem* item = new QTreeWidgetItem(this); - item->setFlags((item->flags() | Qt::ItemIsEnabled) & ~(Qt::ItemIsSelectable) & ~(Qt::ItemIsEditable)); - for (int col = 0; col < columns && materialIndex < orderedMaterialIdList.size(); col++, materialIndex++) { - const auto& materialId = orderedMaterialIdList[materialIndex]; - item->setSizeHint(col, QSize(columnWidth, MaterialWidget::preferredHeight() + 2)); - item->setData(col, Qt::UserRole, QString(materialId.toString().c_str())); - MaterialWidget* widget = new MaterialWidget(m_document, materialId); - connect(widget, &MaterialWidget::modifyMaterial, this, &MaterialListWidget::modifyMaterial); - setItemWidget(item, col, widget); - widget->reload(); - widget->updateCheckedState(isMaterialSelected(materialId)); - m_itemMap[materialId] = std::make_pair(item, col); - } - invisibleRootItem()->addChild(item); - } -} - -void MaterialListWidget::setHasContextMenu(bool hasContextMenu) -{ - m_hasContextMenu = hasContextMenu; -} - -void MaterialListWidget::removeAllContent() -{ - m_itemMap.clear(); - clear(); -} - -void MaterialListWidget::copy() -{ - if (m_selectedMaterialIds.empty() && m_currentSelectedMaterialId.isNull()) - return; - - std::set limitMaterialIds = m_selectedMaterialIds; - if (!m_currentSelectedMaterialId.isNull()) - limitMaterialIds.insert(m_currentSelectedMaterialId); - - std::set emptySet; - - dust3d::Snapshot snapshot; - m_document->toSnapshot(&snapshot, emptySet, DocumentToSnapshotFor::Materials, - limitMaterialIds); - - std::string snapshotXml; - dust3d::saveSnapshotToXmlString(snapshot, snapshotXml); - QClipboard* clipboard = QApplication::clipboard(); - clipboard->setText(snapshotXml.c_str()); -} diff --git a/application/sources/material_list_widget.h b/application/sources/material_list_widget.h deleted file mode 100644 index db8b4ad3..00000000 --- a/application/sources/material_list_widget.h +++ /dev/null @@ -1,48 +0,0 @@ -#ifndef DUST3D_APPLICATION_MATERIAL_LIST_WIDGET_H_ -#define DUST3D_APPLICATION_MATERIAL_LIST_WIDGET_H_ - -#include "material_widget.h" -#include -#include -#include - -class Document; - -class MaterialListWidget : public QTreeWidget { - Q_OBJECT -signals: - void removeMaterial(dust3d::Uuid materialId); - void modifyMaterial(dust3d::Uuid materialId); - void cornerButtonClicked(dust3d::Uuid materialId); - void currentSelectedMaterialChanged(dust3d::Uuid materialId); - -public: - MaterialListWidget(const Document* document, QWidget* parent = nullptr); - bool isMaterialSelected(dust3d::Uuid materialId); - void enableMultipleSelection(bool enabled); -public slots: - void reload(); - void removeAllContent(); - void materialRemoved(dust3d::Uuid materialId); - void showContextMenu(const QPoint& pos); - void selectMaterial(dust3d::Uuid materialId, bool multiple = false); - void copy(); - void setHasContextMenu(bool hasContextMenu); - -protected: - void resizeEvent(QResizeEvent* event) override; - void mousePressEvent(QMouseEvent* event) override; - -private: - int calculateColumnCount(); - void updateMaterialSelectState(dust3d::Uuid materialId, bool selected); - const Document* m_document = nullptr; - std::map> m_itemMap; - std::set m_selectedMaterialIds; - dust3d::Uuid m_currentSelectedMaterialId; - dust3d::Uuid m_shiftStartMaterialId; - bool m_hasContextMenu = true; - bool m_multipleSelectionEnabled = true; -}; - -#endif diff --git a/application/sources/material_manage_widget.cc b/application/sources/material_manage_widget.cc deleted file mode 100644 index 8905cd8f..00000000 --- a/application/sources/material_manage_widget.cc +++ /dev/null @@ -1,64 +0,0 @@ -#include "material_manage_widget.h" -#include "document.h" -#include "info_label.h" -#include "material_edit_widget.h" -#include "theme.h" -#include -#include -#include - -MaterialManageWidget::MaterialManageWidget(const Document* document, QWidget* parent) - : QWidget(parent) - , m_document(document) -{ - QPushButton* addMaterialButton = new QPushButton(Theme::awesome()->icon(fa::plus), tr("Add Material...")); - - connect(addMaterialButton, &QPushButton::clicked, this, &MaterialManageWidget::showAddMaterialDialog); - - QHBoxLayout* toolsLayout = new QHBoxLayout; - toolsLayout->addWidget(addMaterialButton); - - m_materialListWidget = new MaterialListWidget(document); - connect(m_materialListWidget, &MaterialListWidget::modifyMaterial, this, &MaterialManageWidget::showMaterialDialog); - - QVBoxLayout* mainLayout = new QVBoxLayout; - mainLayout->addLayout(toolsLayout); - mainLayout->addWidget(m_materialListWidget); - - setLayout(mainLayout); -} - -MaterialListWidget* MaterialManageWidget::materialListWidget() -{ - return m_materialListWidget; -} - -QSize MaterialManageWidget::sizeHint() const -{ - return QSize(Theme::sidebarPreferredWidth, 0); -} - -void MaterialManageWidget::showAddMaterialDialog() -{ - showMaterialDialog(dust3d::Uuid()); -} - -void MaterialManageWidget::showMaterialDialog(dust3d::Uuid materialId) -{ - MaterialEditWidget* materialEditWidget = new MaterialEditWidget(m_document); - materialEditWidget->setAttribute(Qt::WA_DeleteOnClose); - if (!materialId.isNull()) { - const Material* material = m_document->findMaterial(materialId); - if (nullptr != material) { - materialEditWidget->setEditMaterialId(materialId); - materialEditWidget->setEditMaterialName(material->name); - materialEditWidget->setEditMaterialLayers(material->layers); - materialEditWidget->clearUnsaveState(); - } - } - materialEditWidget->show(); - connect(materialEditWidget, &QDialog::destroyed, [=]() { - emit unregisterDialog((QWidget*)materialEditWidget); - }); - emit registerDialog((QWidget*)materialEditWidget); -} diff --git a/application/sources/material_manage_widget.h b/application/sources/material_manage_widget.h deleted file mode 100644 index 9310e609..00000000 --- a/application/sources/material_manage_widget.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef DUST3D_APPLICATION_MATERIAL_MANAGE_WIDGET_H_ -#define DUST3D_APPLICATION_MATERIAL_MANAGE_WIDGET_H_ - -#include "material_list_widget.h" -#include - -class Document; - -class MaterialManageWidget : public QWidget { - Q_OBJECT -signals: - void registerDialog(QWidget* widget); - void unregisterDialog(QWidget* widget); - -public: - MaterialManageWidget(const Document* document, QWidget* parent = nullptr); - MaterialListWidget* materialListWidget(); - -protected: - virtual QSize sizeHint() const; -public slots: - void showAddMaterialDialog(); - void showMaterialDialog(dust3d::Uuid materialId); - -private: - const Document* m_document = nullptr; - MaterialListWidget* m_materialListWidget = nullptr; -}; - -#endif diff --git a/application/sources/material_previews_generator.cc b/application/sources/material_previews_generator.cc deleted file mode 100644 index a0857a05..00000000 --- a/application/sources/material_previews_generator.cc +++ /dev/null @@ -1,131 +0,0 @@ -#include "material_previews_generator.h" -#include "image_forever.h" -#include "mesh_generator.h" -#include "mesh_result_post_processor.h" -#include "texture_generator.h" -#include -#include -#include -#include -#include -#include - -MaterialPreviewsGenerator::MaterialPreviewsGenerator() -{ -} - -MaterialPreviewsGenerator::~MaterialPreviewsGenerator() -{ - for (auto& item : m_previews) { - delete item.second; - } -} - -void MaterialPreviewsGenerator::addMaterial(dust3d::Uuid materialId, const std::vector& layers) -{ - m_materials.push_back({ materialId, layers }); -} - -const std::set& MaterialPreviewsGenerator::generatedPreviewMaterialIds() -{ - return m_generatedMaterialIds; -} - -ModelMesh* MaterialPreviewsGenerator::takePreview(dust3d::Uuid materialId) -{ - ModelMesh* resultMesh = m_previews[materialId]; - m_previews[materialId] = nullptr; - return resultMesh; -} - -void MaterialPreviewsGenerator::generate() -{ - dust3d::Snapshot* snapshot = new dust3d::Snapshot; - - QFile file(":/resources/material-demo-model.ds3"); - file.open(QFile::ReadOnly); - QByteArray fileData = file.readAll(); - - std::vector partIds; - dust3d::Ds3FileReader ds3Reader((const std::uint8_t*)fileData.data(), fileData.size()); - for (int i = 0; i < (int)ds3Reader.items().size(); ++i) { - dust3d::Ds3ReaderItem item = ds3Reader.items().at(i); - if (item.type == "model") { - std::vector data; - ds3Reader.loadItem(item.name, &data); - std::string xmlString((char*)data.data(), data.size()); - dust3d::loadSnapshotFromXmlString(snapshot, (char*)xmlString.c_str()); - for (const auto& item : snapshot->parts) { - partIds.push_back(dust3d::Uuid(item.first)); - } - } - } - - dust3d::MeshGenerator::GeneratedCacheContext* cacheContext = new dust3d::MeshGenerator::GeneratedCacheContext(); - MeshGenerator* meshGenerator = new MeshGenerator(snapshot); - meshGenerator->setGeneratedCacheContext(cacheContext); - - meshGenerator->generate(); - for (const auto& mirror : cacheContext->partMirrorIdMap) { - partIds.push_back(dust3d::Uuid(mirror.first)); - } - - dust3d::Object* object = meshGenerator->takeObject(); - if (nullptr != object) { - MeshResultPostProcessor* poseProcessor = new MeshResultPostProcessor(*object); - poseProcessor->poseProcess(); - delete object; - object = poseProcessor->takePostProcessedObject(); - delete poseProcessor; - } - - if (nullptr != object) { - for (const auto& material : m_materials) { - TextureGenerator* textureGenerator = new TextureGenerator(*object); - for (const auto& layer : material.second) { - for (const auto& mapItem : layer.maps) { - const QImage* image = ImageForever::get(mapItem.imageId); - if (nullptr == image) - continue; - for (const auto& partId : partIds) { - if (dust3d::TextureType::BaseColor == mapItem.forWhat) - textureGenerator->addPartColorMap(partId, image, layer.tileScale); - else if (dust3d::TextureType::Normal == mapItem.forWhat) - textureGenerator->addPartNormalMap(partId, image, layer.tileScale); - else if (dust3d::TextureType::Metallic == mapItem.forWhat) - textureGenerator->addPartMetalnessMap(partId, image, layer.tileScale); - else if (dust3d::TextureType::Roughness == mapItem.forWhat) - textureGenerator->addPartRoughnessMap(partId, image, layer.tileScale); - else if (dust3d::TextureType::AmbientOcclusion == mapItem.forWhat) - textureGenerator->addPartAmbientOcclusionMap(partId, image, layer.tileScale); - } - } - } - textureGenerator->generate(); - ModelMesh* texturedResultMesh = textureGenerator->takeResultMesh(); - if (nullptr != texturedResultMesh) { - m_previews[material.first] = new ModelMesh(*texturedResultMesh); - m_generatedMaterialIds.insert(material.first); - delete texturedResultMesh; - } - delete textureGenerator; - } - } - - delete object; - - delete meshGenerator; - delete cacheContext; -} - -void MaterialPreviewsGenerator::process() -{ - QElapsedTimer countTimeConsumed; - countTimeConsumed.start(); - - generate(); - - qDebug() << "The material previews generation took" << countTimeConsumed.elapsed() << "milliseconds"; - - emit finished(); -} diff --git a/application/sources/material_previews_generator.h b/application/sources/material_previews_generator.h deleted file mode 100644 index 6f1fa2b6..00000000 --- a/application/sources/material_previews_generator.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef DUST3D_APPLICATION_MATERIAL_PREVIEWS_GENERATOR_H_ -#define DUST3D_APPLICATION_MATERIAL_PREVIEWS_GENERATOR_H_ - -#include "material_layer.h" -#include "model_mesh.h" -#include -#include -#include - -class MaterialPreviewsGenerator : public QObject { - Q_OBJECT -public: - MaterialPreviewsGenerator(); - ~MaterialPreviewsGenerator(); - void addMaterial(dust3d::Uuid materialId, const std::vector& layers); - const std::set& generatedPreviewMaterialIds(); - ModelMesh* takePreview(dust3d::Uuid materialId); - void generate(); -signals: - void finished(); -public slots: - void process(); - -private: - std::vector>> m_materials; - std::map m_previews; - std::set m_generatedMaterialIds; -}; - -#endif diff --git a/application/sources/material_widget.cc b/application/sources/material_widget.cc deleted file mode 100644 index 768e64d1..00000000 --- a/application/sources/material_widget.cc +++ /dev/null @@ -1,98 +0,0 @@ -#include "material_widget.h" -#include "document.h" -#include - -MaterialWidget::MaterialWidget(const Document* document, dust3d::Uuid materialId) - : m_materialId(materialId) - , m_document(document) -{ - setObjectName("MaterialFrame"); - - m_previewWidget = new ModelWidget(this); - m_previewWidget->setAttribute(Qt::WA_TransparentForMouseEvents); - m_previewWidget->setFixedSize(Theme::materialPreviewImageSize, Theme::materialPreviewImageSize); - m_previewWidget->enableMove(false); - m_previewWidget->enableZoom(false); - - m_nameLabel = new QLabel; - m_nameLabel->setAlignment(Qt::AlignCenter); - m_nameLabel->setStyleSheet("background: qlineargradient(x1:0.5 y1:-15.5, x2:0.5 y2:1, stop:0 " + Theme::white.name() + ", stop:1 #252525);"); - - QFont nameFont; - nameFont.setWeight(QFont::Light); - nameFont.setBold(false); - m_nameLabel->setFont(nameFont); - - QVBoxLayout* mainLayout = new QVBoxLayout; - mainLayout->setContentsMargins(0, 0, 0, 0); - mainLayout->addStretch(); - mainLayout->addWidget(m_nameLabel); - - setLayout(mainLayout); - - setFixedSize(Theme::materialPreviewImageSize, MaterialWidget::preferredHeight()); - - connect(document, &Document::materialNameChanged, this, &MaterialWidget::updateName); - connect(document, &Document::materialPreviewChanged, this, &MaterialWidget::updatePreview); -} - -void MaterialWidget::resizeEvent(QResizeEvent* event) -{ - QWidget::resizeEvent(event); - m_previewWidget->move((width() - Theme::materialPreviewImageSize) / 2, 0); -} - -int MaterialWidget::preferredHeight() -{ - return Theme::materialPreviewImageSize; -} - -void MaterialWidget::reload() -{ - updatePreview(m_materialId); - updateName(m_materialId); -} - -void MaterialWidget::updatePreview(dust3d::Uuid materialId) -{ - if (materialId != m_materialId) - return; - const Material* material = m_document->findMaterial(m_materialId); - if (!material) { - qDebug() << "Material not found:" << m_materialId; - return; - } - ModelMesh* previewMesh = material->takePreviewMesh(); - m_previewWidget->updateMesh(previewMesh); -} - -void MaterialWidget::updateName(dust3d::Uuid materialId) -{ - if (materialId != m_materialId) - return; - const Material* material = m_document->findMaterial(m_materialId); - if (!material) { - qDebug() << "Material not found:" << m_materialId; - return; - } - m_nameLabel->setText(material->name); -} - -void MaterialWidget::updateCheckedState(bool checked) -{ - if (checked) - setStyleSheet("#MaterialFrame {border: 1px solid " + Theme::red.name() + ";}"); - else - setStyleSheet("#MaterialFrame {border: 1px solid transparent;}"); -} - -ModelWidget* MaterialWidget::previewWidget() -{ - return m_previewWidget; -} - -void MaterialWidget::mouseDoubleClickEvent(QMouseEvent* event) -{ - QFrame::mouseDoubleClickEvent(event); - emit modifyMaterial(m_materialId); -} diff --git a/application/sources/material_widget.h b/application/sources/material_widget.h deleted file mode 100644 index 4734ae58..00000000 --- a/application/sources/material_widget.h +++ /dev/null @@ -1,38 +0,0 @@ -#ifndef DUST3D_APPLICATION_MATERIAL_WIDGET_H_ -#define DUST3D_APPLICATION_MATERIAL_WIDGET_H_ - -#include "model_widget.h" -#include -#include -#include -#include - -class Document; - -class MaterialWidget : public QFrame { - Q_OBJECT -signals: - void modifyMaterial(dust3d::Uuid materialId); - -public: - MaterialWidget(const Document* document, dust3d::Uuid materialId); - static int preferredHeight(); - ModelWidget* previewWidget(); - -protected: - void mouseDoubleClickEvent(QMouseEvent* event) override; - void resizeEvent(QResizeEvent* event) override; -public slots: - void reload(); - void updatePreview(dust3d::Uuid materialId); - void updateName(dust3d::Uuid materialId); - void updateCheckedState(bool checked); - -private: - dust3d::Uuid m_materialId; - const Document* m_document = nullptr; - ModelWidget* m_previewWidget = nullptr; - QLabel* m_nameLabel = nullptr; -}; - -#endif diff --git a/application/sources/texture_generator.cc b/application/sources/texture_generator.cc deleted file mode 100644 index 6790fa5f..00000000 --- a/application/sources/texture_generator.cc +++ /dev/null @@ -1,702 +0,0 @@ -#include "texture_generator.h" -#include "debug.h" -#include "material.h" -#include "theme.h" -#include -#include -#include -#include -#include -#include -#include - -QColor TextureGenerator::m_defaultTextureColor = Qt::transparent; - -TextureGenerator::TextureGenerator(const dust3d::Object& object, dust3d::Snapshot* snapshot) - : m_snapshot(snapshot) -{ - m_object = new dust3d::Object(); - *m_object = object; -} - -TextureGenerator::~TextureGenerator() -{ - delete m_object; - delete m_resultTextureColorImage; - delete m_resultTextureNormalImage; - delete m_resultTextureRoughnessImage; - delete m_resultTextureMetalnessImage; - delete m_resultTextureAmbientOcclusionImage; - delete m_resultMesh; - delete m_snapshot; -} - -QImage* TextureGenerator::takeResultTextureColorImage() -{ - QImage* resultTextureColorImage = m_resultTextureColorImage; - m_resultTextureColorImage = nullptr; - return resultTextureColorImage; -} - -QImage* TextureGenerator::takeResultTextureNormalImage() -{ - QImage* resultTextureNormalImage = m_resultTextureNormalImage; - m_resultTextureNormalImage = nullptr; - return resultTextureNormalImage; -} - -QImage* TextureGenerator::takeResultTextureRoughnessImage() -{ - QImage* resultTextureRoughnessImage = m_resultTextureRoughnessImage; - m_resultTextureRoughnessImage = nullptr; - return resultTextureRoughnessImage; -} - -QImage* TextureGenerator::takeResultTextureMetalnessImage() -{ - QImage* resultTextureMetalnessImage = m_resultTextureMetalnessImage; - m_resultTextureMetalnessImage = nullptr; - return resultTextureMetalnessImage; -} - -QImage* TextureGenerator::takeResultTextureAmbientOcclusionImage() -{ - QImage* resultTextureAmbientOcclusionImage = m_resultTextureAmbientOcclusionImage; - m_resultTextureAmbientOcclusionImage = nullptr; - return resultTextureAmbientOcclusionImage; -} - -dust3d::Object* TextureGenerator::takeObject() -{ - dust3d::Object* object = m_object; - m_object = nullptr; - return object; -} - -ModelMesh* TextureGenerator::takeResultMesh() -{ - ModelMesh* resultMesh = m_resultMesh; - m_resultMesh = nullptr; - return resultMesh; -} - -void TextureGenerator::addPartColorMap(dust3d::Uuid partId, const QImage* image, float tileScale) -{ - if (nullptr == image) - return; - m_partColorTextureMap[partId] = std::make_pair(*image, tileScale); -} - -void TextureGenerator::addPartNormalMap(dust3d::Uuid partId, const QImage* image, float tileScale) -{ - if (nullptr == image) - return; - m_partNormalTextureMap[partId] = std::make_pair(*image, tileScale); -} - -void TextureGenerator::addPartMetalnessMap(dust3d::Uuid partId, const QImage* image, float tileScale) -{ - if (nullptr == image) - return; - m_partMetalnessTextureMap[partId] = std::make_pair(*image, tileScale); -} - -void TextureGenerator::addPartRoughnessMap(dust3d::Uuid partId, const QImage* image, float tileScale) -{ - if (nullptr == image) - return; - m_partRoughnessTextureMap[partId] = std::make_pair(*image, tileScale); -} - -void TextureGenerator::addPartAmbientOcclusionMap(dust3d::Uuid partId, const QImage* image, float tileScale) -{ - if (nullptr == image) - return; - m_partAmbientOcclusionTextureMap[partId] = std::make_pair(*image, tileScale); -} - -void TextureGenerator::prepare() -{ - if (nullptr == m_snapshot) - return; - - std::map updatedMaterialIdMap; - std::map updatedCountershadedMap; - for (const auto& partIt : m_snapshot->parts) { - dust3d::Uuid materialId; - auto materialIdIt = partIt.second.find("materialId"); - if (materialIdIt != partIt.second.end()) - materialId = dust3d::Uuid(materialIdIt->second); - dust3d::Uuid partId = dust3d::Uuid(partIt.first); - updatedMaterialIdMap.insert({ partId, materialId }); - updatedCountershadedMap.insert({ partId, - dust3d::String::isTrue(dust3d::String::valueOrEmpty(partIt.second, "countershaded")) }); - } - for (const auto& bmeshNode : m_object->nodes) { - - bool countershaded = bmeshNode.countershaded; - auto findUpdatedCountershadedMap = updatedCountershadedMap.find(bmeshNode.mirrorFromPartId.isNull() ? bmeshNode.partId : bmeshNode.mirrorFromPartId); - if (findUpdatedCountershadedMap != updatedCountershadedMap.end()) - countershaded = findUpdatedCountershadedMap->second; - if (countershaded) - m_countershadedPartIds.insert(bmeshNode.partId); - - for (size_t i = 0; i < (int)dust3d::TextureType::Count - 1; ++i) { - dust3d::TextureType forWhat = (dust3d::TextureType)(i + 1); - MaterialTextures materialTextures; - dust3d::Uuid materialId = bmeshNode.materialId; - auto findUpdatedMaterialIdResult = updatedMaterialIdMap.find(bmeshNode.mirrorFromPartId.isNull() ? bmeshNode.partId : bmeshNode.mirrorFromPartId); - if (findUpdatedMaterialIdResult != updatedMaterialIdMap.end()) - materialId = findUpdatedMaterialIdResult->second; - float tileScale = 1.0; - initializeMaterialTexturesFromSnapshot(*m_snapshot, materialId, materialTextures, tileScale); - const QImage* image = materialTextures.textureImages[i]; - if (nullptr != image) { - if (dust3d::TextureType::BaseColor == forWhat) - addPartColorMap(bmeshNode.partId, image, tileScale); - else if (dust3d::TextureType::Normal == forWhat) - addPartNormalMap(bmeshNode.partId, image, tileScale); - else if (dust3d::TextureType::Metallic == forWhat) - addPartMetalnessMap(bmeshNode.partId, image, tileScale); - else if (dust3d::TextureType::Roughness == forWhat) - addPartRoughnessMap(bmeshNode.partId, image, tileScale); - else if (dust3d::TextureType::AmbientOcclusion == forWhat) - addPartAmbientOcclusionMap(bmeshNode.partId, image, tileScale); - } - } - } -} - -bool TextureGenerator::hasTransparencySettings() -{ - return m_hasTransparencySettings; -} - -void TextureGenerator::generate() -{ - m_resultMesh = new ModelMesh(*m_object); - - if (nullptr == m_object->triangleVertexUvs()) - return; - if (nullptr == m_object->triangleSourceNodes()) - return; - if (nullptr == m_object->partUvRects()) - return; - - QElapsedTimer countTimeConsumed; - countTimeConsumed.start(); - - prepare(); - - bool hasNormalMap = false; - bool hasMetalnessMap = false; - bool hasRoughnessMap = false; - bool hasAmbientOcclusionMap = false; - - const auto& triangleVertexUvs = *m_object->triangleVertexUvs(); - const auto& triangleSourceNodes = *m_object->triangleSourceNodes(); - const auto& partUvRects = *m_object->partUvRects(); - const auto& triangleNormals = m_object->triangleNormals; - - std::map partColorMap; - std::map, const dust3d::ObjectNode*> nodeMap; - std::map partColorSolubilityMap; - std::map partMetalnessMap; - std::map partRoughnessMap; - for (const auto& item : m_object->nodes) { - if (!m_hasTransparencySettings) { - if (!qFuzzyCompare(1.0, item.color.alpha())) - m_hasTransparencySettings = true; - } - nodeMap.insert({ { item.partId, item.nodeId }, &item }); - partColorMap.insert({ item.partId, QColor(item.color.toString().c_str()) }); - partColorSolubilityMap.insert({ item.partId, item.colorSolubility }); - partMetalnessMap.insert({ item.partId, item.metalness }); - partRoughnessMap.insert({ item.partId, item.roughness }); - } - - m_resultTextureColorImage = new QImage(TextureGenerator::m_textureSize, TextureGenerator::m_textureSize, QImage::Format_ARGB32); - m_resultTextureColorImage->fill(m_hasTransparencySettings ? m_defaultTextureColor : Qt::white); - - m_resultTextureNormalImage = new QImage(TextureGenerator::m_textureSize, TextureGenerator::m_textureSize, QImage::Format_ARGB32); - m_resultTextureNormalImage->fill(QColor(128, 128, 255)); - - m_resultTextureMetalnessImage = new QImage(TextureGenerator::m_textureSize, TextureGenerator::m_textureSize, QImage::Format_ARGB32); - m_resultTextureMetalnessImage->fill(Qt::black); - - m_resultTextureRoughnessImage = new QImage(TextureGenerator::m_textureSize, TextureGenerator::m_textureSize, QImage::Format_ARGB32); - m_resultTextureRoughnessImage->fill(Qt::white); - - m_resultTextureAmbientOcclusionImage = new QImage(TextureGenerator::m_textureSize, TextureGenerator::m_textureSize, QImage::Format_ARGB32); - m_resultTextureAmbientOcclusionImage->fill(Qt::white); - - QColor borderColor = Qt::darkGray; - QPen pen(borderColor); - - QPainter texturePainter; - texturePainter.begin(m_resultTextureColorImage); - texturePainter.setRenderHint(QPainter::Antialiasing); - texturePainter.setRenderHint(QPainter::HighQualityAntialiasing); - - QPainter textureNormalPainter; - textureNormalPainter.begin(m_resultTextureNormalImage); - textureNormalPainter.setRenderHint(QPainter::Antialiasing); - textureNormalPainter.setRenderHint(QPainter::HighQualityAntialiasing); - - QPainter textureMetalnessPainter; - textureMetalnessPainter.begin(m_resultTextureMetalnessImage); - textureMetalnessPainter.setRenderHint(QPainter::Antialiasing); - textureMetalnessPainter.setRenderHint(QPainter::HighQualityAntialiasing); - - QPainter textureRoughnessPainter; - textureRoughnessPainter.begin(m_resultTextureRoughnessImage); - textureRoughnessPainter.setRenderHint(QPainter::Antialiasing); - textureRoughnessPainter.setRenderHint(QPainter::HighQualityAntialiasing); - - QPainter textureAmbientOcclusionPainter; - textureAmbientOcclusionPainter.begin(m_resultTextureAmbientOcclusionImage); - textureAmbientOcclusionPainter.setRenderHint(QPainter::Antialiasing); - textureAmbientOcclusionPainter.setRenderHint(QPainter::HighQualityAntialiasing); - - texturePainter.setPen(Qt::NoPen); - - for (const auto& it : partUvRects) { - const auto& partId = it.first; - const auto& rects = it.second; - auto findSourceColorResult = partColorMap.find(partId); - if (findSourceColorResult != partColorMap.end()) { - const auto& color = findSourceColorResult->second; - QBrush brush(color); - float fillExpandSize = 2; - for (const auto& rect : rects) { - QRectF translatedRect = { - rect.left() * TextureGenerator::m_textureSize - fillExpandSize, - rect.top() * TextureGenerator::m_textureSize - fillExpandSize, - rect.width() * TextureGenerator::m_textureSize + fillExpandSize * 2, - rect.height() * TextureGenerator::m_textureSize + fillExpandSize * 2 - }; - texturePainter.fillRect(translatedRect, brush); - } - } - } - - for (const auto& it : partUvRects) { - const auto& partId = it.first; - const auto& rects = it.second; - auto findMetalnessResult = partMetalnessMap.find(partId); - if (findMetalnessResult != partMetalnessMap.end()) { - if (qFuzzyCompare(findMetalnessResult->second, (float)0.0)) - continue; - const auto& color = QColor(findMetalnessResult->second * 255, - findMetalnessResult->second * 255, - findMetalnessResult->second * 255); - QBrush brush(color); - float fillExpandSize = 2; - for (const auto& rect : rects) { - QRectF translatedRect = { - rect.left() * TextureGenerator::m_textureSize - fillExpandSize, - rect.top() * TextureGenerator::m_textureSize - fillExpandSize, - rect.width() * TextureGenerator::m_textureSize + fillExpandSize * 2, - rect.height() * TextureGenerator::m_textureSize + fillExpandSize * 2 - }; - textureMetalnessPainter.fillRect(translatedRect, brush); - hasMetalnessMap = true; - } - } - } - - for (const auto& it : partUvRects) { - const auto& partId = it.first; - const auto& rects = it.second; - auto findRoughnessResult = partRoughnessMap.find(partId); - if (findRoughnessResult != partRoughnessMap.end()) { - if (qFuzzyCompare(findRoughnessResult->second, (float)1.0)) - continue; - const auto& color = QColor(findRoughnessResult->second * 255, - findRoughnessResult->second * 255, - findRoughnessResult->second * 255); - QBrush brush(color); - float fillExpandSize = 2; - for (const auto& rect : rects) { - QRectF translatedRect = { - rect.left() * TextureGenerator::m_textureSize - fillExpandSize, - rect.top() * TextureGenerator::m_textureSize - fillExpandSize, - rect.width() * TextureGenerator::m_textureSize + fillExpandSize * 2, - rect.height() * TextureGenerator::m_textureSize + fillExpandSize * 2 - }; - textureRoughnessPainter.fillRect(translatedRect, brush); - hasRoughnessMap = true; - } - } - } - - 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()) { - const auto& pixmap = findTextureResult->second.first; - const auto& rotatedPixmap = findTextureResult->second.second; - painter.setOpacity(alpha); - for (const auto& rect : rects) { - QRectF translatedRect = { - rect.left() * TextureGenerator::m_textureSize, - rect.top() * TextureGenerator::m_textureSize, - rect.width() * TextureGenerator::m_textureSize, - rect.height() * TextureGenerator::m_textureSize - }; - if (translatedRect.width() < translatedRect.height()) { - painter.drawTiledPixmap(translatedRect, rotatedPixmap, QPointF(rect.top(), rect.left())); - } else { - painter.drawTiledPixmap(translatedRect, pixmap, QPointF(rect.left(), rect.top())); - } - } - painter.setOpacity(1.0); - } - } - }; - - auto convertTextureImageToPixmap = [&](const std::map>& sourceMap, - std::map>& targetMap) { - for (const auto& it : sourceMap) { - float tileScale = it.second.second; - const auto& image = it.second.first; - auto newSize = image.size() * tileScale; - QImage scaledImage = image.scaled(newSize); - QPoint center = scaledImage.rect().center(); - QMatrix matrix; - matrix.translate(center.x(), center.y()); - matrix.rotate(90); - auto rotatedImage = scaledImage.transformed(matrix).mirrored(true, false); - targetMap[it.first] = std::make_pair(QPixmap::fromImage(scaledImage), - QPixmap::fromImage(rotatedImage)); - } - }; - - std::map> partColorTexturePixmaps; - std::map> partNormalTexturePixmaps; - std::map> partMetalnessTexturePixmaps; - std::map> partRoughnessTexturePixmaps; - std::map> partAmbientOcclusionTexturePixmaps; - - convertTextureImageToPixmap(m_partColorTextureMap, partColorTexturePixmaps); - convertTextureImageToPixmap(m_partNormalTextureMap, partNormalTexturePixmaps); - convertTextureImageToPixmap(m_partMetalnessTextureMap, partMetalnessTexturePixmaps); - convertTextureImageToPixmap(m_partRoughnessTextureMap, partRoughnessTexturePixmaps); - convertTextureImageToPixmap(m_partAmbientOcclusionTextureMap, partAmbientOcclusionTexturePixmaps); - - drawTexture(partColorTexturePixmaps, texturePainter, true); - drawTexture(partNormalTexturePixmaps, textureNormalPainter, false); - drawTexture(partMetalnessTexturePixmaps, textureMetalnessPainter, false); - drawTexture(partRoughnessTexturePixmaps, textureRoughnessPainter, false); - drawTexture(partAmbientOcclusionTexturePixmaps, textureAmbientOcclusionPainter, false); - - auto drawBySolubility = [&](const dust3d::Uuid& partId, size_t triangleIndex, size_t firstVertexIndex, size_t secondVertexIndex, - const dust3d::Uuid& neighborPartId) { - const std::vector& uv = triangleVertexUvs[triangleIndex]; - const auto& allRects = partUvRects.find(partId); - if (allRects == partUvRects.end()) { - qDebug() << "Found part uv rects failed"; - return; - } - const auto& firstPoint = uv[firstVertexIndex]; - const auto& secondPoint = uv[secondVertexIndex]; - auto edgeLength = (firstPoint - secondPoint).length(); - auto middlePoint = (firstPoint + secondPoint) / 2.0; - float alpha = 1.0; - const auto& findColor = partColorMap.find(partId); - if (findColor == partColorMap.end()) - return; - alpha = findColor->second.alphaF(); - const auto& findNeighborColorSolubility = partColorSolubilityMap.find(neighborPartId); - if (findNeighborColorSolubility == partColorSolubilityMap.end()) - return; - if (qFuzzyIsNull(findNeighborColorSolubility->second)) - return; - const auto& findNeighborColor = partColorMap.find(neighborPartId); - if (findNeighborColor == partColorMap.end()) - return; - for (const auto& it : allRects->second) { - if (it.contains(firstPoint.x(), firstPoint.y()) || it.contains(secondPoint.x(), secondPoint.y())) { - float finalRadius = (it.width() + it.height()) * 0.5 * findNeighborColorSolubility->second; - if (finalRadius < edgeLength) - finalRadius = edgeLength; - dust3d::Rectangle fillTarget((middlePoint.x() - finalRadius), - (middlePoint.y() - finalRadius), - (finalRadius + finalRadius), - (finalRadius + finalRadius)); - auto clippedRect = it.intersected(fillTarget); - QRectF translatedRect = { - clippedRect.left() * TextureGenerator::m_textureSize, - clippedRect.top() * TextureGenerator::m_textureSize, - clippedRect.width() * TextureGenerator::m_textureSize, - clippedRect.height() * TextureGenerator::m_textureSize - }; - texturePainter.setOpacity(alpha); - auto findTextureResult = partColorTexturePixmaps.find(neighborPartId); - if (findTextureResult != partColorTexturePixmaps.end()) { - const auto& pixmap = findTextureResult->second.first; - const auto& rotatedPixmap = findTextureResult->second.second; - - QImage tmpImage(translatedRect.width(), translatedRect.height(), QImage::Format_ARGB32); - QPixmap tmpPixmap = QPixmap::fromImage(tmpImage); - QPainter tmpPainter; - QRectF tmpImageFrame = QRectF(0, 0, translatedRect.width(), translatedRect.height()); - - // Fill tiled texture - tmpPainter.begin(&tmpPixmap); - tmpPainter.setOpacity(alpha); - if (it.width() < it.height()) { - tmpPainter.drawTiledPixmap(tmpImageFrame, rotatedPixmap, QPointF(translatedRect.top(), translatedRect.left())); - } else { - tmpPainter.drawTiledPixmap(tmpImageFrame, pixmap, translatedRect.topLeft()); - } - tmpPainter.setOpacity(1.0); - tmpPainter.end(); - - // Apply gradient - QRadialGradient gradient(QPointF(middlePoint.x() * TextureGenerator::m_textureSize - translatedRect.left(), - middlePoint.y() * TextureGenerator::m_textureSize - translatedRect.top()), - finalRadius * TextureGenerator::m_textureSize); - gradient.setColorAt(0.0, findNeighborColor->second); - gradient.setColorAt(1.0, Qt::transparent); - - tmpPainter.begin(&tmpPixmap); - tmpPainter.setCompositionMode(QPainter::CompositionMode_DestinationIn); - tmpPainter.fillRect(tmpImageFrame, gradient); - tmpPainter.end(); - - texturePainter.drawPixmap(translatedRect, tmpPixmap, tmpImageFrame); - } else { - QRadialGradient gradient(QPointF(middlePoint.x() * TextureGenerator::m_textureSize, - middlePoint.y() * TextureGenerator::m_textureSize), - finalRadius * TextureGenerator::m_textureSize); - gradient.setColorAt(0.0, findNeighborColor->second); - gradient.setColorAt(1.0, Qt::transparent); - texturePainter.fillRect(translatedRect, gradient); - } - texturePainter.setOpacity(1.0); - break; - } - } - }; - - std::map, std::tuple> halfEdgeToTriangleMap; - for (size_t i = 0; i < m_object->triangles.size(); ++i) { - const auto& triangleIndices = m_object->triangles[i]; - if (triangleIndices.size() != 3) { - qDebug() << "Found invalid triangle indices"; - continue; - } - for (size_t j = 0; j < triangleIndices.size(); ++j) { - size_t k = (j + 1) % triangleIndices.size(); - halfEdgeToTriangleMap.insert(std::make_pair(std::make_pair(triangleIndices[j], triangleIndices[k]), - std::make_tuple(i, j, k))); - } - } - for (const auto& it : halfEdgeToTriangleMap) { - auto oppositeHalfEdge = std::make_pair(it.first.second, it.first.first); - const auto& opposite = halfEdgeToTriangleMap.find(oppositeHalfEdge); - if (opposite == halfEdgeToTriangleMap.end()) - continue; - const std::pair& source = triangleSourceNodes[std::get<0>(it.second)]; - const std::pair& oppositeSource = triangleSourceNodes[std::get<0>(opposite->second)]; - if (source.first == oppositeSource.first) - continue; - drawBySolubility(source.first, std::get<0>(it.second), std::get<1>(it.second), std::get<2>(it.second), oppositeSource.first); - drawBySolubility(oppositeSource.first, std::get<0>(opposite->second), std::get<1>(opposite->second), std::get<2>(opposite->second), source.first); - } - - // Draw belly white - texturePainter.setCompositionMode(QPainter::CompositionMode_SoftLight); - for (size_t triangleIndex = 0; triangleIndex < m_object->triangles.size(); ++triangleIndex) { - const auto& normal = triangleNormals[triangleIndex]; - const std::pair& source = triangleSourceNodes[triangleIndex]; - const auto& partId = source.first; - if (m_countershadedPartIds.find(partId) == m_countershadedPartIds.end()) - continue; - - const auto& allRects = partUvRects.find(partId); - if (allRects == partUvRects.end()) { - qDebug() << "Found part uv rects failed"; - continue; - } - - const auto& findObjectNode = nodeMap.find(source); - if (findObjectNode == nodeMap.end()) - continue; - const dust3d::ObjectNode* objectNode = findObjectNode->second; - if (qAbs(dust3d::Vector3::dotProduct(objectNode->direction, dust3d::Vector3(0, 1, 0))) >= 0.707) { - if (dust3d::Vector3::dotProduct(normal, dust3d::Vector3(0, 0, 1)) <= 0.0) - continue; - } else { - if (dust3d::Vector3::dotProduct(normal, dust3d::Vector3(0, -1, 0)) <= 0.0) - continue; - } - - const auto& triangleIndices = m_object->triangles[triangleIndex]; - if (triangleIndices.size() != 3) { - qDebug() << "Found invalid triangle indices"; - continue; - } - - const std::vector& uv = triangleVertexUvs[triangleIndex]; - dust3d::Vector2 middlePoint = (uv[0] + uv[1] + uv[2]) / 3.0; - float finalRadius = ((uv[0] - uv[1]).length() + (uv[1] - uv[2]).length() + (uv[2] - uv[0]).length()) / 3.0; - QRadialGradient gradient(QPointF(middlePoint.x() * TextureGenerator::m_textureSize, - middlePoint.y() * TextureGenerator::m_textureSize), - finalRadius * TextureGenerator::m_textureSize); - gradient.setColorAt(0.0, Qt::white); - gradient.setColorAt(1.0, Qt::transparent); - for (const auto& it : allRects->second) { - if (it.contains(middlePoint.x(), middlePoint.y())) { - dust3d::Rectangle fillTarget((middlePoint.x() - finalRadius), - (middlePoint.y() - finalRadius), - (finalRadius + finalRadius), - (finalRadius + finalRadius)); - auto clippedRect = it.intersected(fillTarget); - QRectF translatedRect = { - clippedRect.left() * TextureGenerator::m_textureSize, - clippedRect.top() * TextureGenerator::m_textureSize, - clippedRect.width() * TextureGenerator::m_textureSize, - clippedRect.height() * TextureGenerator::m_textureSize - }; - texturePainter.fillRect(translatedRect, gradient); - } - } - - // Fill the neighbor halfedges - for (int i = 0; i < 3; ++i) { - int j = (i + 1) % 3; - auto oppositeHalfEdge = std::make_pair(triangleIndices[j], triangleIndices[i]); - const auto& opposite = halfEdgeToTriangleMap.find(oppositeHalfEdge); - if (opposite == halfEdgeToTriangleMap.end()) - continue; - auto oppositeTriangleIndex = std::get<0>(opposite->second); - const std::pair& oppositeSource = triangleSourceNodes[oppositeTriangleIndex]; - if (partId == oppositeSource.first) - continue; - const auto& oppositeAllRects = partUvRects.find(oppositeSource.first); - if (oppositeAllRects == partUvRects.end()) { - qDebug() << "Found part uv rects failed"; - continue; - } - const std::vector& oppositeUv = triangleVertexUvs[oppositeTriangleIndex]; - dust3d::Vector2 oppositeMiddlePoint = (oppositeUv[std::get<1>(opposite->second)] + oppositeUv[std::get<2>(opposite->second)]) * 0.5; - QRadialGradient oppositeGradient(QPointF(oppositeMiddlePoint.x() * TextureGenerator::m_textureSize, - oppositeMiddlePoint.y() * TextureGenerator::m_textureSize), - finalRadius * TextureGenerator::m_textureSize); - oppositeGradient.setColorAt(0.0, Qt::white); - oppositeGradient.setColorAt(1.0, Qt::transparent); - for (const auto& it : oppositeAllRects->second) { - if (it.contains(oppositeMiddlePoint.x(), oppositeMiddlePoint.y())) { - dust3d::Rectangle fillTarget((oppositeMiddlePoint.x() - finalRadius), - (oppositeMiddlePoint.y() - finalRadius), - (finalRadius + finalRadius), - (finalRadius + finalRadius)); - auto clippedRect = it.intersected(fillTarget); - QRectF translatedRect = { - clippedRect.left() * TextureGenerator::m_textureSize, - clippedRect.top() * TextureGenerator::m_textureSize, - clippedRect.width() * TextureGenerator::m_textureSize, - clippedRect.height() * TextureGenerator::m_textureSize - }; - texturePainter.fillRect(translatedRect, oppositeGradient); - } - } - } - } - - hasNormalMap = !m_partNormalTextureMap.empty(); - if (!m_partMetalnessTextureMap.empty()) - hasMetalnessMap = true; - if (!m_partRoughnessTextureMap.empty()) - hasRoughnessMap = true; - hasAmbientOcclusionMap = !m_partAmbientOcclusionTextureMap.empty(); - - texturePainter.end(); - textureNormalPainter.end(); - textureMetalnessPainter.end(); - textureRoughnessPainter.end(); - textureAmbientOcclusionPainter.end(); - - if (!hasNormalMap) { - delete m_resultTextureNormalImage; - m_resultTextureNormalImage = nullptr; - } - - if (!hasMetalnessMap && !hasRoughnessMap && !hasAmbientOcclusionMap) { - delete m_resultTextureMetalnessImage; - m_resultTextureMetalnessImage = nullptr; - - delete m_resultTextureRoughnessImage; - m_resultTextureRoughnessImage = nullptr; - - delete m_resultTextureAmbientOcclusionImage; - m_resultTextureAmbientOcclusionImage = nullptr; - } - - m_resultMesh->setTextureImage(new QImage(*m_resultTextureColorImage)); - if (nullptr != m_resultTextureNormalImage) - m_resultMesh->setNormalMapImage(new QImage(*m_resultTextureNormalImage)); - if (hasMetalnessMap || hasRoughnessMap || hasAmbientOcclusionMap) { - m_resultMesh->setMetalnessRoughnessAmbientOcclusionMapImage(combineMetalnessRoughnessAmbientOcclusionImages( - m_resultTextureMetalnessImage, - m_resultTextureRoughnessImage, - m_resultTextureAmbientOcclusionImage)); - m_resultMesh->setHasMetalnessInImage(hasMetalnessMap); - m_resultMesh->setHasRoughnessInImage(hasRoughnessMap); - m_resultMesh->setHasAmbientOcclusionInImage(hasAmbientOcclusionMap); - } - - qDebug() << "The texture[" << TextureGenerator::m_textureSize << "x" << TextureGenerator::m_textureSize << "] generation took" << countTimeConsumed.elapsed() << "milliseconds"; -} - -QImage* TextureGenerator::combineMetalnessRoughnessAmbientOcclusionImages(QImage* metalnessImage, - QImage* roughnessImage, - QImage* ambientOcclusionImage) -{ - QImage* textureMetalnessRoughnessAmbientOcclusionImage = nullptr; - if (nullptr != metalnessImage || nullptr != roughnessImage || nullptr != ambientOcclusionImage) { - int textureSize = 0; - if (nullptr != metalnessImage) - textureSize = metalnessImage->height(); - if (nullptr != roughnessImage) - textureSize = roughnessImage->height(); - if (nullptr != ambientOcclusionImage) - textureSize = ambientOcclusionImage->height(); - if (textureSize > 0) { - textureMetalnessRoughnessAmbientOcclusionImage = new QImage(textureSize, textureSize, QImage::Format_ARGB32); - textureMetalnessRoughnessAmbientOcclusionImage->fill(QColor(255, 255, 0)); - for (int row = 0; row < textureMetalnessRoughnessAmbientOcclusionImage->height(); ++row) { - for (int col = 0; col < textureMetalnessRoughnessAmbientOcclusionImage->width(); ++col) { - QColor color(255, 255, 0); - if (nullptr != metalnessImage) - color.setBlue(qGray(metalnessImage->pixel(col, row))); - if (nullptr != roughnessImage) - color.setGreen(qGray(roughnessImage->pixel(col, row))); - if (nullptr != ambientOcclusionImage) - color.setRed(qGray(ambientOcclusionImage->pixel(col, row))); - textureMetalnessRoughnessAmbientOcclusionImage->setPixelColor(col, row, color); - } - } - } - } - return textureMetalnessRoughnessAmbientOcclusionImage; -} - -void TextureGenerator::process() -{ - generate(); - - emit finished(); -} diff --git a/application/sources/texture_generator.h b/application/sources/texture_generator.h deleted file mode 100644 index 30984ad1..00000000 --- a/application/sources/texture_generator.h +++ /dev/null @@ -1,65 +0,0 @@ -#ifndef DUST3D_APPLICATION_TEXTURE_GENERATOR_H_ -#define DUST3D_APPLICATION_TEXTURE_GENERATOR_H_ - -#include "model_mesh.h" -#include -#include -#include -#include -#include -#include -#include - -class TextureGenerator : public QObject { - Q_OBJECT -public: - TextureGenerator(const dust3d::Object& object, dust3d::Snapshot* snapshot = nullptr); - ~TextureGenerator(); - QImage* takeResultTextureColorImage(); - QImage* takeResultTextureNormalImage(); - QImage* takeResultTextureRoughnessImage(); - QImage* takeResultTextureMetalnessImage(); - QImage* takeResultTextureAmbientOcclusionImage(); - dust3d::Object* takeObject(); - ModelMesh* takeResultMesh(); - bool hasTransparencySettings(); - void addPartColorMap(dust3d::Uuid partId, const QImage* image, float tileScale); - void addPartNormalMap(dust3d::Uuid partId, const QImage* image, float tileScale); - void addPartMetalnessMap(dust3d::Uuid partId, const QImage* image, float tileScale); - void addPartRoughnessMap(dust3d::Uuid partId, const QImage* image, float tileScale); - void addPartAmbientOcclusionMap(dust3d::Uuid partId, const QImage* image, float tileScale); - void generate(); - static QImage* combineMetalnessRoughnessAmbientOcclusionImages(QImage* metalnessImage, - QImage* roughnessImage, - QImage* ambientOcclusionImage); -signals: - void finished(); -public slots: - void process(); - -public: - static QColor m_defaultTextureColor; - -private: - void prepare(); - -private: - dust3d::Object* m_object = nullptr; - QImage* m_resultTextureColorImage = nullptr; - QImage* m_resultTextureNormalImage = nullptr; - QImage* m_resultTextureRoughnessImage = nullptr; - QImage* m_resultTextureMetalnessImage = nullptr; - QImage* m_resultTextureAmbientOcclusionImage = nullptr; - ModelMesh* m_resultMesh = nullptr; - std::map> m_partColorTextureMap; - std::map> m_partNormalTextureMap; - std::map> m_partMetalnessTextureMap; - std::map> m_partRoughnessTextureMap; - std::map> m_partAmbientOcclusionTextureMap; - std::set m_countershadedPartIds; - dust3d::Snapshot* m_snapshot = nullptr; - bool m_hasTransparencySettings = false; - int m_textureSize = 1024; -}; - -#endif diff --git a/application/sources/theme.cc b/application/sources/theme.cc index 22304c1f..92d19142 100644 --- a/application/sources/theme.cc +++ b/application/sources/theme.cc @@ -20,7 +20,6 @@ int Theme::toolIconSize = 0; int Theme::miniIconFontSize = 0; int Theme::miniIconSize = 0; int Theme::partPreviewImageSize = 0; -int Theme::materialPreviewImageSize = 0; int Theme::sidebarPreferredWidth = 0; int Theme::previewIconBorderSize = 0; int Theme::previewIconMargin = 0; @@ -57,7 +56,6 @@ void Theme::initialize() Theme::miniIconSize = (int)(Theme::miniIconFontSize * 1.67); Theme::partPreviewImageSize = (Theme::miniIconSize * 2.3); Theme::sidebarPreferredWidth = Theme::partPreviewImageSize * 4.5; - Theme::materialPreviewImageSize = Theme::sidebarPreferredWidth * 0.4; Theme::previewIconBorderSize = std::max(1, Theme::partPreviewImageSize / 20); Theme::previewIconMargin = std::max(1, Theme::previewIconBorderSize / 2); Theme::previewIconBorderRadius = std::max(3, Theme::partPreviewImageSize / 10); diff --git a/application/sources/theme.h b/application/sources/theme.h index ca21d8c0..124d0046 100644 --- a/application/sources/theme.h +++ b/application/sources/theme.h @@ -25,7 +25,6 @@ public: static int miniIconFontSize; static int miniIconSize; static int partPreviewImageSize; - static int materialPreviewImageSize; static int sidebarPreferredWidth; static int previewIconBorderSize; static int previewIconMargin; diff --git a/application/sources/uv_map_generator.cc b/application/sources/uv_map_generator.cc index 45e59a74..532c32e0 100644 --- a/application/sources/uv_map_generator.cc +++ b/application/sources/uv_map_generator.cc @@ -1,7 +1,11 @@ #include "uv_map_generator.h" #include "image_forever.h" +#include +#include #include +size_t UvMapGenerator::m_textureSize = 1024; + UvMapGenerator::UvMapGenerator(std::unique_ptr object, std::unique_ptr snapshot) : m_object(std::move(object)) , m_snapshot(std::move(snapshot)) @@ -14,16 +18,53 @@ void UvMapGenerator::process() emit finished(); } +std::unique_ptr UvMapGenerator::takeResultTextureColorImage() +{ + return std::move(m_textureColorImage); +} + +std::unique_ptr UvMapGenerator::takeResultTextureNormalImage() +{ + return std::move(m_textureNormalImage); +} + +std::unique_ptr UvMapGenerator::takeResultTextureRoughnessImage() +{ + return std::move(m_textureRoughnessImage); +} + +std::unique_ptr UvMapGenerator::takeResultTextureMetalnessImage() +{ + return std::move(m_textureMetalnessImage); +} + +std::unique_ptr UvMapGenerator::takeResultTextureAmbientOcclusionImage() +{ + return std::move(m_textureAmbientOcclusionImage); +} + +std::unique_ptr UvMapGenerator::takeResultMesh() +{ + return std::move(m_mesh); +} + std::unique_ptr UvMapGenerator::takeObject() { return std::move(m_object); } +bool UvMapGenerator::hasTransparencySettings() const +{ + return m_hasTransparencySettings; +} + void UvMapGenerator::generate() { if (nullptr == m_object) return; + m_mesh = std::make_unique(*m_object); + if (nullptr == m_snapshot) return; @@ -50,5 +91,78 @@ void UvMapGenerator::generate() m_mapPacker->pack(); - // TODO: + m_textureColorImage = std::make_unique(UvMapGenerator::m_textureSize, UvMapGenerator::m_textureSize, QImage::Format_ARGB32); + m_textureColorImage->fill(Qt::white); + + QPainter colorTexturePainter; + colorTexturePainter.begin(m_textureColorImage.get()); + colorTexturePainter.setRenderHint(QPainter::Antialiasing); + colorTexturePainter.setRenderHint(QPainter::HighQualityAntialiasing); + colorTexturePainter.setPen(Qt::NoPen); + + for (const auto& layout : m_mapPacker->packedLayouts()) { + auto findPart = m_snapshot->parts.find(layout.id.toString()); + if (findPart == m_snapshot->parts.end()) + continue; + const auto& colorImageIdIt = findPart->second.find("colorImageId"); + if (colorImageIdIt == findPart->second.end()) + continue; + auto imageId = dust3d::Uuid(colorImageIdIt->second); + const QImage* image = ImageForever::get(imageId); + if (nullptr == image) + continue; + QPixmap brushPixmap; + if (layout.flipped) { + auto scaledImage = image->scaled(QSize(layout.height * UvMapGenerator::m_textureSize, + layout.width * UvMapGenerator::m_textureSize)); + QPoint center = scaledImage.rect().center(); + QMatrix matrix; + matrix.translate(center.x(), center.y()); + matrix.rotate(90); + auto rotatedImage = scaledImage.transformed(matrix).mirrored(true, false); + brushPixmap = QPixmap::fromImage(rotatedImage); + } else { + auto scaledImage = image->scaled(QSize(layout.width * UvMapGenerator::m_textureSize, + layout.height * UvMapGenerator::m_textureSize)); + brushPixmap = QPixmap::fromImage(scaledImage); + } + colorTexturePainter.drawPixmap(layout.left * UvMapGenerator::m_textureSize, + layout.top * UvMapGenerator::m_textureSize, + brushPixmap); + } + + colorTexturePainter.end(); +} + +QImage* UvMapGenerator::combineMetalnessRoughnessAmbientOcclusionImages(QImage* metalnessImage, + QImage* roughnessImage, + QImage* ambientOcclusionImage) +{ + QImage* textureMetalnessRoughnessAmbientOcclusionImage = nullptr; + if (nullptr != metalnessImage || nullptr != roughnessImage || nullptr != ambientOcclusionImage) { + int textureSize = 0; + if (nullptr != metalnessImage) + textureSize = metalnessImage->height(); + if (nullptr != roughnessImage) + textureSize = roughnessImage->height(); + if (nullptr != ambientOcclusionImage) + textureSize = ambientOcclusionImage->height(); + if (textureSize > 0) { + textureMetalnessRoughnessAmbientOcclusionImage = new QImage(textureSize, textureSize, QImage::Format_ARGB32); + textureMetalnessRoughnessAmbientOcclusionImage->fill(QColor(255, 255, 0)); + for (int row = 0; row < textureMetalnessRoughnessAmbientOcclusionImage->height(); ++row) { + for (int col = 0; col < textureMetalnessRoughnessAmbientOcclusionImage->width(); ++col) { + QColor color(255, 255, 0); + if (nullptr != metalnessImage) + color.setBlue(qGray(metalnessImage->pixel(col, row))); + if (nullptr != roughnessImage) + color.setGreen(qGray(roughnessImage->pixel(col, row))); + if (nullptr != ambientOcclusionImage) + color.setRed(qGray(ambientOcclusionImage->pixel(col, row))); + textureMetalnessRoughnessAmbientOcclusionImage->setPixelColor(col, row, color); + } + } + } + } + return textureMetalnessRoughnessAmbientOcclusionImage; } diff --git a/application/sources/uv_map_generator.h b/application/sources/uv_map_generator.h index 6afceeff..0fbba0ab 100644 --- a/application/sources/uv_map_generator.h +++ b/application/sources/uv_map_generator.h @@ -1,6 +1,8 @@ #ifndef DUST3D_APPLICATION_UV_MAP_GENERATOR_H_ #define DUST3D_APPLICATION_UV_MAP_GENERATOR_H_ +#include "model_mesh.h" +#include #include #include #include @@ -12,7 +14,17 @@ class UvMapGenerator : public QObject { public: UvMapGenerator(std::unique_ptr object, std::unique_ptr snapshot); void generate(); + std::unique_ptr takeResultTextureColorImage(); + std::unique_ptr takeResultTextureNormalImage(); + std::unique_ptr takeResultTextureRoughnessImage(); + std::unique_ptr takeResultTextureMetalnessImage(); + std::unique_ptr takeResultTextureAmbientOcclusionImage(); + std::unique_ptr takeResultMesh(); std::unique_ptr takeObject(); + bool hasTransparencySettings() const; + static QImage* combineMetalnessRoughnessAmbientOcclusionImages(QImage* metalnessImage, + QImage* roughnessImage, + QImage* ambientOcclusionImage); signals: void finished(); public slots: @@ -22,6 +34,14 @@ private: std::unique_ptr m_object; std::unique_ptr m_snapshot; std::unique_ptr m_mapPacker; + std::unique_ptr m_textureColorImage; + std::unique_ptr m_textureNormalImage; + std::unique_ptr m_textureRoughnessImage; + std::unique_ptr m_textureMetalnessImage; + std::unique_ptr m_textureAmbientOcclusionImage; + std::unique_ptr m_mesh; + bool m_hasTransparencySettings = false; + static size_t m_textureSize; }; #endif diff --git a/dust3d/uv/uv_map_packer.cc b/dust3d/uv/uv_map_packer.cc index 5ce035d8..1e187fee 100644 --- a/dust3d/uv/uv_map_packer.cc +++ b/dust3d/uv/uv_map_packer.cc @@ -61,15 +61,15 @@ void UvMapPacker::pack() layout.id = part.id; layout.flipped = flipped; if (flipped) { - layout.left = left; - layout.top = top; - layout.width = height; - layout.height = width; + layout.left = left / m_packedTextureSize; + layout.top = top / m_packedTextureSize; + layout.width = height / m_packedTextureSize; + layout.height = width / m_packedTextureSize; } else { - layout.left = left; - layout.top = top; - layout.width = width; - layout.height = height; + layout.left = left / m_packedTextureSize; + layout.top = top / m_packedTextureSize; + layout.width = width / m_packedTextureSize; + layout.height = height / m_packedTextureSize; } if (flipped) { for (auto& it : part.localUv) {