!B (Sandbox) (CE-21795) Importing models with multisubmaterials via fbx switches...
[CRYENGINE.git] / Code / Sandbox / Plugins / LodGeneratorPlugin / panel / LodGeneratorTestAllPanel.cpp
bloba64e74b3e09de4963b5f002e283df139306a3114
1 #include "StdAfx.h"
2 #include "LodGeneratorTestAllPanel.h"
3 #include "../UIs/ui_CLodGeneratorTestAllPanel.h"
4 #include "qfiledialog.h"
5 #include "LODInterface.h"
6 #include "../Util/StringTool.h"
7 #include <Map>
8 #include <string>
10 using namespace LODGenerator;
12 static std::map<int,QString> ConfigMap;
13 CLodGeneratorTestAllPanel::CLodGeneratorTestAllPanel(QWidget *parent) :
14 QWidget(parent),
15 ui(new Ui::CLodGeneratorTestAllPanel)
17 ui->setupUi(this);
19 connect(ui->SelectMeshButton, SIGNAL(clicked()), this, SLOT(SelectMeshFile_Slot()));
20 connect(ui->SelectObjButton, SIGNAL(clicked()), this, SLOT(SelectObjFile_Slot()));
21 //connect(ui->SelectMaterialButton, SIGNAL(clicked()), this, SLOT(SelectMaterial_Slot()));
23 connect(ui->AutoGenerateButton, SIGNAL(clicked()), this, SLOT(AutoGenerate()));
24 connect(ui->GenerateOptionButton, SIGNAL(clicked()), this, SLOT(GenerateOption()));
26 connect(ui->GenerateConifgCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(SelectConfig_Slot(int)));
28 connect(this,SIGNAL(SelectMeshFile_Signal(const QString)),ui->SelectMeshPathEdit,SLOT(setText(const QString)));
29 //connect(this,SIGNAL(SelectMateralFile_Signal(const QString)),ui->SelectMaterialPathEdit,SLOT(setText(const QString)));
31 //-------------------------------------------------------------------------------------------------------------
33 connect(this,SIGNAL(UpdateProgress_Signal(int)),ui->AutoGenerateProgress,SLOT(setValue(int)));
36 m_LodGeneratorState = Ui::eLGS_None;
38 UpdateProgress_Signal(0);
40 m_LodGeneratorOptionsPanel = new CLodGeneratorOptionsPanel(NULL);
41 m_LodGeneratorOptionsPanel->hide();
43 ConfigMap[6] = "Six Lods";
44 ConfigMap[5] = "Five Lods";
45 ConfigMap[4] = "Four Lods";
46 ConfigMap[3] = "Tree Lods";
47 ConfigMap[2] = "Two Lods";
48 ConfigMap[1] = "One Lods";
49 ConfigMap[0] = "No Lods";
51 for (int i=0;i<ConfigMap.size();i++)
53 ui->GenerateConifgCombo->addItem(ConfigMap[i]);
56 //-------------------------------------------------------------------------------------------------------------
59 CLodGeneratorTestAllPanel::~CLodGeneratorTestAllPanel()
61 delete ui;
63 if (m_LodGeneratorOptionsPanel != NULL)
64 delete m_LodGeneratorOptionsPanel;
67 void CLodGeneratorTestAllPanel::UpdateConfig()
69 CLodGeneratorInteractionManager* pInstance = CLodGeneratorInteractionManager::Instance();
70 const int nLods = pInstance->NumberOfLods();
71 if(nLods >=1 && nLods <= ConfigMap.size())
72 ui->GenerateConifgCombo->setCurrentIndex(nLods - 1);
75 void CLodGeneratorTestAllPanel::SelectConfig_Slot(int index)
77 m_LodInfoList.clear();
78 int allCount = index;
79 for (int i=0;i<allCount;i++)
81 int level = pow(2,i+1);
82 Ui::LodInfo lodInfo;
83 lodInfo.percentage = 100.0/level;
84 lodInfo.width = 2048/level;
85 lodInfo.height = 2048/level;
86 m_LodInfoList.push_back(lodInfo);
90 void CLodGeneratorTestAllPanel::SetState(Ui::ELodGeneratorState lodGeneratorState)
92 m_LodGeneratorState = lodGeneratorState;
95 void CLodGeneratorTestAllPanel::ShowMessage(std::string message)
97 CryLog("Lod Generator Auto: %s",message.c_str());
98 //ui->MessageShow->append(message);
101 void CLodGeneratorTestAllPanel::SelectMaterial_Slot()
103 setCursor(QCursor(Qt::WaitCursor));
104 CLodGeneratorInteractionManager::Instance()->OpenMaterialEditor();
105 setCursor(QCursor(Qt::ArrowCursor));
108 void CLodGeneratorTestAllPanel::SelectMeshFile_Slot()
110 m_MeshPath = QFileDialog::getOpenFileName(this, tr("Select File"), "", tr("Mesh (*.cgf)"));
111 CString material(CLodGeneratorInteractionManager::Instance()->GetDefaultBrushMaterial(CStringTool::QStringToCString(m_MeshPath)));
113 SelectMeshFile_Signal(m_MeshPath);
114 SelectMateralFile_Signal(CStringTool::CStringToQString(material));
116 FileOpened();
118 UpdateConfig();
121 bool CLodGeneratorTestAllPanel::FileOpened()
123 CLodGeneratorInteractionManager* pInstance = CLodGeneratorInteractionManager::Instance();
124 CString filepath(CStringTool::QStringToCString(LoadedFile()));
125 if(!pInstance->LoadStatObj(filepath))
127 CryMessageBox("Failed to load file into the engine, please consult the editor.log","File Load Failed",0);
128 return false;
131 CString materialpath(CStringTool::QStringToCString(MaterialFile()));
132 if(!pInstance->LoadMaterial(materialpath))
134 CryMessageBox("Failed to load material file into the engine, please consult the editor.log","File Load Failed",0);
135 return false;
138 return TRUE;
141 void CLodGeneratorTestAllPanel::AutoGenerate()
143 TaskStarted();
144 SetState(Ui::eLGS_GeneratePreparePre);
147 void CLodGeneratorTestAllPanel::GenerateOption()
149 if (m_LodGeneratorOptionsPanel->isHidden())
151 m_LodGeneratorOptionsPanel->show();
153 else
155 m_LodGeneratorOptionsPanel->hide();
159 void CLodGeneratorTestAllPanel::TaskStarted()
161 m_nTimerId = startTimer(1000);
164 void CLodGeneratorTestAllPanel::TaskFinished()
166 if ( m_nTimerId != 0 )
167 killTimer(m_nTimerId);
168 m_nTimerId = 0;
171 void CLodGeneratorTestAllPanel::timerEvent( QTimerEvent *event )
173 switch (m_LodGeneratorState)
175 case Ui::eLGS_GeneratePreparePre:
177 ShowMessage("Before Generate Pre Prepare");
178 CLodGeneratorInteractionManager::Instance()->LodGenGenerate();
179 m_StartTime = QTime::currentTime();
180 SetState(Ui::eLGS_GeneratePrepare);
181 ShowMessage("After Generate Pre Prepare");
182 ShowMessage("Before Generate Prepare");
184 UpdateProgress_Signal(0);
186 break;
187 case Ui::eLGS_GeneratePrepare:
189 float fProgress = 0.0f;
190 float fProgressPercentage = 0.0f;
191 QString text;
192 bool bFinished = false;
194 if ( CLodGeneratorInteractionManager::Instance()->LodGenGenerateTick(&fProgress) )
196 text = "Finished!";
197 bFinished = true;
198 SetState(Ui::eLGS_GenerateMesh);
200 else
202 bFinished = false;
203 fProgressPercentage = 100.0f*fProgress;
204 if ( fProgressPercentage == 0.0f )
206 text = "Estimating...";
208 else
210 QTime time = QTime::currentTime();
212 float fExpendedTime = (time.msecsSinceStartOfDay() - m_StartTime.msecsSinceStartOfDay())/1000.0f;
213 float fTotalSeconds = (fExpendedTime / fProgressPercentage) * 100.0f;
214 float fTimeLeft = fTotalSeconds - fExpendedTime;
215 int hours = (int)(fTimeLeft / (60.0f *60.0f));
216 fTimeLeft -= hours * (60.0f *60.0f);
217 int Minutes = (int)(fTimeLeft / 60.0f);
218 int Seconds = (((int)fTimeLeft) % 60);
219 text = QString("ETA %1 Hours %2 Minutes %3 Seconds Remaining").arg(QString::number(hours),QString::number(Minutes),QString::number(Seconds));
222 UpdateProgress_Signal(80.0f*fProgress);
225 break;
226 case Ui::eLGS_GenerateMesh:
228 ShowMessage("After Generate Prepare");
229 ShowMessage("Before Generate Mesh");
230 OnGenerateMeshs();
231 SetState(Ui::eLGS_GenerateMaterial);
232 ShowMessage("After Generate Mesh");
233 UpdateProgress_Signal(85);
235 break;
236 case Ui::eLGS_GenerateMaterial:
238 ShowMessage("Before Generate Material");
239 OnGenerateMaterials();
240 SetState(Ui::eLGS_None);
241 ShowMessage("After Generate Material");
242 UpdateProgress_Signal(100);
244 break;
245 case Ui::eLGS_None:
247 TaskFinished();
248 ShowMessage("Generate All Done");
250 break;
251 default:
252 break;
256 void CLodGeneratorTestAllPanel::OnGenerateMeshs()
258 CLodGeneratorInteractionManager* pInstance = CLodGeneratorInteractionManager::Instance();
259 int highestLod = pInstance->GetHighestLod();
261 if ( highestLod > 0 )
263 if ( CryMessageBox("Lods already exist for this model, generating will overwrite any existing lods.","Overwrite existing lods?",MB_OKCANCEL) == IDCANCEL )
268 const int lods = m_LodInfoList.size();
270 pInstance->ClearUnusedLods(lods);
272 int nSourceLod = pInstance->GetGeometryOption<int>("nSourceLod");
273 for ( int idx = 1; idx <= lods ; ++idx )
275 Ui::LodInfo& lodInfo = m_LodInfoList[idx - 1];
276 pInstance->GenerateLod(nSourceLod+idx,lodInfo.percentage);
277 lodInfo.lod = idx;
279 pInstance->SaveSettings();
280 pInstance->ReloadModel();
284 void CLodGeneratorTestAllPanel::OnGenerateMaterials()
286 CLodGeneratorInteractionManager::Instance()->ClearResults();
287 const int nNumLods = m_LodInfoList.size();
288 for (int idx = 0; idx < nNumLods; ++idx)
290 Ui::LodInfo& lodInfo = m_LodInfoList[idx];
291 int nLodId = lodInfo.lod;
292 int nWidth = lodInfo.width;
293 int nHeight = lodInfo.height;
295 CLodGeneratorInteractionManager::Instance()->RunProcess(nLodId,nWidth,nHeight);
298 for (int idx = 0; idx < nNumLods; ++idx)
300 Ui::LodInfo& lodInfo = m_LodInfoList[idx];
301 int nLodId = lodInfo.lod;
302 CLodGeneratorInteractionManager::Instance()->SaveTextures(nLodId);
305 CLodGeneratorInteractionManager::Instance()->ClearResults();
308 void CLodGeneratorTestAllPanel::OnOpenWithPathParameter(const QString& objectPath )
310 if(!objectPath.isEmpty())
312 CLodGeneratorInteractionManager* pInstance = CLodGeneratorInteractionManager::Instance();
313 m_MaterialPath = CStringTool::CStringToQString(pInstance->GetDefaultBrushMaterial(CStringTool::QStringToCString(objectPath)));
315 m_MeshPath = objectPath;
317 SelectMeshFile_Signal(m_MeshPath);
318 SelectMateralFile_Signal(m_MaterialPath);
320 pInstance->SetParameterFilePath("");
324 void CLodGeneratorTestAllPanel::SelectObjFile_Slot()
326 CLodGeneratorInteractionManager* pInstance = CLodGeneratorInteractionManager::Instance();
327 CString filepath(pInstance->GetParameterFilePath());
329 if( filepath.IsEmpty() )
330 filepath = pInstance->GetSelectedBrushFilepath();
331 else
333 OnOpenWithPathParameter(CStringTool::CStringToQString(pInstance->GetParameterFilePath()));
334 return;
337 if ( filepath.IsEmpty() )
338 return;
340 setCursor(QCursor(Qt::WaitCursor));
342 m_MeshPath = CStringTool::CStringToQString(filepath);
343 m_MaterialPath = CStringTool::CStringToQString(pInstance->GetSelectedBrushMaterial());
345 SelectMeshFile_Signal(m_MeshPath);
346 SelectMateralFile_Signal(m_MaterialPath);
348 FileOpened();
350 setCursor(QCursor(Qt::ArrowCursor));
352 UpdateConfig();
355 const QString CLodGeneratorTestAllPanel::LoadedFile()
357 return m_MeshPath;
360 const QString CLodGeneratorTestAllPanel::MaterialFile()
362 return m_MaterialPath;
365 const void CLodGeneratorTestAllPanel::RefreshMaterialFile()
367 CLodGeneratorInteractionManager* pInstance = CLodGeneratorInteractionManager::Instance();
369 setCursor(QCursor(Qt::WaitCursor));
370 m_MaterialPath = CStringTool::CStringToQString(CLodGeneratorInteractionManager::Instance()->GetDefaultBrushMaterial(CStringTool::QStringToCString(m_MeshPath)));
372 SelectMateralFile_Signal(m_MaterialPath);
373 setCursor(QCursor(Qt::ArrowCursor));
376 void CLodGeneratorTestAllPanel::Reset()