source: s10k/Vago/bgImageWizard/bgimagepagefinal.cpp@ 1092

Last change on this file since 1092 was 1058, checked in by s10k, 8 years ago

Vago 1.2

File size: 8.1 KB
Line 
1#include "BGImagePageFinal.h"
2#include "ui_BGImagePageFinal.h"
3
4BGImagePageFinal::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
23void BGImagePageFinal::initializePage(){
24 startProcessing();
25}
26
27void 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 &currentFile : 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
92QString 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
124QList<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
166QVector<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
195void BGImagePageFinal::openBGImagesFolder(){
196 QDesktopServices::openUrl(QUrl("file:///"+this->bgImagesLocation));
197}
198
199void 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
231void 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
236BGImagePageFinal::~BGImagePageFinal()
237{
238 delete ui;
239}
Note: See TracBrowser for help on using the repository browser.