2 #include "LodGeneratorTestAllPanel.h"
3 #include "../UIs/ui_CLodGeneratorTestAllPanel.h"
4 #include "qfiledialog.h"
5 #include "LODInterface.h"
6 #include "../Util/StringTool.h"
10 using namespace LODGenerator
;
12 static std::map
<int,QString
> ConfigMap
;
13 CLodGeneratorTestAllPanel::CLodGeneratorTestAllPanel(QWidget
*parent
) :
15 ui(new Ui::CLodGeneratorTestAllPanel
)
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()
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();
79 for (int i
=0;i
<allCount
;i
++)
81 int level
= pow(2,i
+1);
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
));
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);
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);
141 void CLodGeneratorTestAllPanel::AutoGenerate()
144 SetState(Ui::eLGS_GeneratePreparePre
);
147 void CLodGeneratorTestAllPanel::GenerateOption()
149 if (m_LodGeneratorOptionsPanel
->isHidden())
151 m_LodGeneratorOptionsPanel
->show();
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
);
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);
187 case Ui::eLGS_GeneratePrepare
:
189 float fProgress
= 0.0f
;
190 float fProgressPercentage
= 0.0f
;
192 bool bFinished
= false;
194 if ( CLodGeneratorInteractionManager::Instance()->LodGenGenerateTick(&fProgress
) )
198 SetState(Ui::eLGS_GenerateMesh
);
203 fProgressPercentage
= 100.0f
*fProgress
;
204 if ( fProgressPercentage
== 0.0f
)
206 text
= "Estimating...";
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
);
226 case Ui::eLGS_GenerateMesh
:
228 ShowMessage("After Generate Prepare");
229 ShowMessage("Before Generate Mesh");
231 SetState(Ui::eLGS_GenerateMaterial
);
232 ShowMessage("After Generate Mesh");
233 UpdateProgress_Signal(85);
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);
248 ShowMessage("Generate All Done");
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
);
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();
333 OnOpenWithPathParameter(CStringTool::CStringToQString(pInstance
->GetParameterFilePath()));
337 if ( filepath
.IsEmpty() )
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
);
350 setCursor(QCursor(Qt::ArrowCursor
));
355 const QString
CLodGeneratorTestAllPanel::LoadedFile()
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()