1 |
#include "BGImagePageFinal.h" |
2 |
#include "ui_BGImagePageFinal.h" |
3 |
|
4 |
BGImagePageFinal::BGImagePageFinal(QString appDir, Logger *myLogger, QString bgImagesLocation, QWidget *parent) : |
5 |
QWizardPage(parent), |
6 |
ui(new Ui::BGImagePageFinal) |
7 |
{ |
8 |
ui->setupUi(this); |
9 |
this->appDir = appDir; |
10 |
this->myLogger = myLogger; |
11 |
this->bgImagesLocation = bgImagesLocation; |
12 |
this->oniSplitCommands = new QStringList(); |
13 |
this->myOniSplitConverter = new Converter(this->appDir, this->myLogger, this->oniSplitCommands); |
14 |
|
15 |
ui->lbComplete->setText("<html>The wizard is now complete. The images have been created. " |
16 |
"You can view all created files clicking <a href=' '>here.</a><br />" |
17 |
"<br />Click restart to create more background images from the wizard beggining, " |
18 |
"otherwise click finish.</html>"); // Don't use rich text in qtdesigner because it generates platform dependent code |
19 |
|
20 |
connectSlots(); |
21 |
} |
22 |
|
23 |
void BGImagePageFinal::initializePage(){ |
24 |
startProcessing(); |
25 |
} |
26 |
|
27 |
void BGImagePageFinal::startProcessing(){ |
28 |
// page 1 |
29 |
QString imagePath; |
30 |
QString imageType; |
31 |
// page 2 |
32 |
bool createTXMB; |
33 |
bool createTXMP; |
34 |
QString imageCustomName; |
35 |
QString txmbName; |
36 |
QString levelId; |
37 |
|
38 |
imagePath = field("leImageFullPath").toString(); |
39 |
imageType = field("lbImageType").toString(); |
40 |
createTXMB = field("cbCreateTXMB").toBool(); |
41 |
createTXMP = field("cbCreateTXMP").toBool(); |
42 |
imageCustomName = field("leImageName").toString(); |
43 |
txmbName = field("leTXMBName").toString(); |
44 |
levelId = field("leLevelId").toString(); |
45 |
|
46 |
|
47 |
QImage sourceImage(imagePath); |
48 |
QList<QString> imagesSplitted; |
49 |
|
50 |
// Check if images folder exists and create it if necessary |
51 |
QDir saveDir(this->bgImagesLocation); |
52 |
|
53 |
if(!saveDir.exists()) |
54 |
{ |
55 |
saveDir.mkpath("."); // http://stackoverflow.com/questions/2241808/checking-if-a-folder-exists-and-creating-folders-in-qt-c thanks Petrucio |
56 |
} |
57 |
|
58 |
imagesSplitted = splitIntoMultipleImages(sourceImage, imageCustomName, imageType); |
59 |
|
60 |
// Image divided with sucess |
61 |
if(imagesSplitted.size() > 0 && createTXMP){ |
62 |
|
63 |
// call creations of TXMP files (oni split command) |
64 |
this->oniSplitCommands->clear(); |
65 |
|
66 |
for(const QString ¤tFile : imagesSplitted){ |
67 |
this->oniSplitCommands->append("-create:txmp " + Util::insertQuotes(this->bgImagesLocation) + " -format:bgr32 " + Util::insertQuotes(currentFile)); |
68 |
} |
69 |
|
70 |
this->myOniSplitConverter->start(); // finally process the onisplit commands |
71 |
this->myOniSplitConverter->wait(); // wait for it to complete |
72 |
|
73 |
if(createTXMB){ |
74 |
|
75 |
QString txmbXmlFile = createTxmbXmlFile(imagesSplitted, txmbName, sourceImage.size(), levelId); |
76 |
|
77 |
if(txmbXmlFile.isEmpty()) |
78 |
{ |
79 |
UtilVago::showAndLogErrorPopUp(this->myLogger, "Couldn't create TXMB xml file!"); |
80 |
return; |
81 |
} |
82 |
|
83 |
// Create TXMB oni files |
84 |
this->oniSplitCommands->clear(); |
85 |
this->oniSplitCommands->append("-create " + Util::insertQuotes(this->bgImagesLocation) + " " + Util::insertQuotes(txmbXmlFile)); |
86 |
this->myOniSplitConverter->start(); |
87 |
this->myOniSplitConverter->wait(); |
88 |
} |
89 |
} |
90 |
} |
91 |
|
92 |
QString BGImagePageFinal::createTxmbXmlFile(QList<QString> imagesSplitted, QString fileName, const QSize &imageSize, QString levelId){ |
93 |
QString filePath = this->bgImagesLocation + "/" + fileName + ".xml"; |
94 |
|
95 |
// If it's empty assume zero |
96 |
if(levelId.trimmed().isEmpty()){ |
97 |
levelId = "0"; |
98 |
} |
99 |
|
100 |
pugi::xml_document doc; |
101 |
|
102 |
pugi::xml_node rootNode = doc.append_child("Oni"); |
103 |
pugi::xml_node txmbNode = rootNode.append_child("TXMB"); |
104 |
txmbNode.append_child("Width").append_child(pugi::xml_node_type::node_pcdata).set_value(QString::number(imageSize.width()).toLatin1().data()); |
105 |
txmbNode.append_child("Height").append_child(pugi::xml_node_type::node_pcdata).set_value(QString::number(imageSize.height()).toLatin1().data()); |
106 |
pugi::xml_node texturesNode = txmbNode.append_child("Textures"); |
107 |
|
108 |
for(const QString &currSplittedImage : imagesSplitted) |
109 |
{ |
110 |
QFileInfo currImageFile(currSplittedImage); |
111 |
texturesNode.append_child("Link").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr(currImageFile.baseName())); |
112 |
} |
113 |
|
114 |
txmbNode.append_attribute("id").set_value(Util::qStrToCstr(levelId)); |
115 |
|
116 |
if(!doc.save_file(Util::qStrToCstr(filePath))){ |
117 |
return ""; |
118 |
} |
119 |
|
120 |
return filePath; |
121 |
} |
122 |
|
123 |
// returns number of images created from the split |
124 |
QList<QString> BGImagePageFinal::splitIntoMultipleImages(QImage sourceImage, QString imageName, QString imageType){ |
125 |
|
126 |
QList<QString> splittedImages; |
127 |
|
128 |
QVector<int> horizontalSideSizes = getSplitSizes(sourceImage.width()); |
129 |
|
130 |
QVector<int> verticalSideSizes = getSplitSizes(sourceImage.height()); |
131 |
|
132 |
int currentVerticalPosition = 0; |
133 |
int currentHorizontalPosition = 0; |
134 |
|
135 |
for(const int currentVerticalSize : verticalSideSizes){ |
136 |
|
137 |
for(const int currentHorizontalSize : horizontalSideSizes){ |
138 |
|
139 |
QImage dividedImage = sourceImage.copy(currentHorizontalPosition,currentVerticalPosition,currentHorizontalSize,currentVerticalSize); |
140 |
QString currentImageId = QString::number(splittedImages.size()+1); |
141 |
|
142 |
// Not used. It added 0 when the number was less than 10 |
143 |
// if(currentImageId.length() == 1){ |
144 |
// currentImageId = "0" + currentImageId; |
145 |
// } |
146 |
|
147 |
QString imageDestinationPath = this->bgImagesLocation + "/" + imageName + currentImageId + "." + imageType; |
148 |
|
149 |
if(!dividedImage.save(imageDestinationPath)){ |
150 |
UtilVago::showAndLogErrorPopUp(this->myLogger, "Couldn't save image " + imageDestinationPath + "! Files weren't created correctly."); |
151 |
return QList<QString>(); |
152 |
} |
153 |
|
154 |
currentHorizontalPosition += currentHorizontalSize; |
155 |
|
156 |
splittedImages.append(imageDestinationPath); |
157 |
} |
158 |
|
159 |
currentHorizontalPosition = 0; |
160 |
currentVerticalPosition += currentVerticalSize; |
161 |
} |
162 |
|
163 |
return splittedImages; |
164 |
} |
165 |
|
166 |
QVector<int> BGImagePageFinal::getSplitSizes(int imageSideSize) |
167 |
{ |
168 |
int remainingSideSize = imageSideSize; |
169 |
constexpr int regularSize = 256; |
170 |
|
171 |
QVector<int> splitSizes; |
172 |
|
173 |
while(remainingSideSize > 0){ |
174 |
|
175 |
if(remainingSideSize-regularSize < 0){ |
176 |
splitSizes.append(remainingSideSize); |
177 |
remainingSideSize -= remainingSideSize; |
178 |
break; |
179 |
} |
180 |
|
181 |
splitSizes.append(regularSize); |
182 |
|
183 |
remainingSideSize -= regularSize; |
184 |
|
185 |
} |
186 |
|
187 |
if(remainingSideSize != 0) |
188 |
{ |
189 |
splitSizes.clear(); |
190 |
} |
191 |
|
192 |
return splitSizes; |
193 |
} |
194 |
|
195 |
void BGImagePageFinal::openBGImagesFolder(){ |
196 |
QDesktopServices::openUrl(QUrl("file:///"+this->bgImagesLocation)); |
197 |
} |
198 |
|
199 |
void BGImagePageFinal::catchOniSplitProcessingErrors(QString result, int numErrors){ |
200 |
|
201 |
if(numErrors!=0){ |
202 |
QString sNumErrors=QString::number(numErrors); |
203 |
bool isWarning = false; |
204 |
|
205 |
|
206 |
if(result.startsWith("Warning: Texture")){ |
207 |
isWarning = true; |
208 |
} |
209 |
|
210 |
if(numErrors>1){ |
211 |
|
212 |
result = result+"\n This is the last of " + sNumErrors; |
213 |
|
214 |
if(!isWarning){ |
215 |
result += " errors."; |
216 |
} |
217 |
else{ |
218 |
result += " messages."; |
219 |
} |
220 |
} |
221 |
|
222 |
if(isWarning){ |
223 |
UtilVago::showWarningPopUpLogButton(result); |
224 |
} |
225 |
else{ |
226 |
UtilVago::showErrorPopUpLogButton(result); |
227 |
} |
228 |
} |
229 |
} |
230 |
|
231 |
void BGImagePageFinal::connectSlots(){ |
232 |
connect(this->myOniSplitConverter, SIGNAL(resultConversion(QString, int)), this, SLOT(catchOniSplitProcessingErrors(QString, int))); |
233 |
connect(ui->lbComplete, SIGNAL(linkActivated(const QString & )), this, SLOT(openBGImagesFolder())); |
234 |
} |
235 |
|
236 |
BGImagePageFinal::~BGImagePageFinal() |
237 |
{ |
238 |
delete ui; |
239 |
} |