2 #include "LodGeneratorDialog.h"
3 #include "../UIs/ui_clodgeneratordialog.h"
4 #include "LODInterface.h"
5 #include "../Util/StringTool.h"
6 #include "Controls/QuestionDialog.h"
7 #include "QtViewPane.h"
9 using namespace LODGenerator
;
11 REGISTER_VIEWPANE_FACTORY(CLodGeneratorDialog
, "Lod Generator", "Tools", false);
13 CLodGeneratorDialog::CLodGeneratorDialog(QWidget
*parent
) :
14 CDockableEditor(parent
),
15 ui(new Ui::CLodGeneratorDialog
)
19 connect(ui
->cSourceFileWidget
, SIGNAL(FileOpened_Signal()), this, SLOT(FileOpened()));
20 connect(ui
->cSourceFileWidget
, &CLodGeneratorFilePanel::MaterialChanged_Signal
, this, &CLodGeneratorDialog::OnMaterialChange
);
21 connect(ui
->cGeometryGenerationPanelWidget
,SIGNAL(OnMaterialGeneratePrepare_Signal()),this,SLOT(OnMaterialGeneratePrepare()));
22 connect(this,SIGNAL(UpdateObj_Signal(IStatObj
*)),ui
->cGeometryGenerationPanelWidget
,SLOT(UpdateObj(IStatObj
*)));
23 connect(this,SIGNAL(UpdateMaterial_Signal(IMaterial
*)),ui
->cGeometryGenerationPanelWidget
,SLOT(UpdateMaterial(IMaterial
*)));
24 connect(ui
->cMaterialTaskWidget
,SIGNAL(OnGenerateMaterial()),this,SLOT(OnGenerateMaterial()));
26 connect(ui
->cGeometryTaskPanelWidget
,SIGNAL(OnLodChainGenerationFinished()),ui
->cGeometryGenerationPanelWidget
,SLOT(OnLodChainGenerationFinished()));
28 connect(ui
->centralWidget
,SIGNAL(OnGenerateMaterial()),this,SLOT(OnGenerateMaterial()));
30 GetIEditor()->RegisterNotifyListener(this);
33 CLodGeneratorDialog::~CLodGeneratorDialog()
37 GetIEditor()->UnregisterNotifyListener(this);
40 void CLodGeneratorDialog::OnEditorNotifyEvent( EEditorNotifyEvent event
)
44 case eNotify_OnIdleUpdate
:
46 ui
->cGeometryGenerationPanelWidget
->OnIdle();
47 for (int i
=0;i
<ui
->m_vLodPanels
.size();i
++)
49 CMaterialLODGeneratorLodItemOptionsPanel
* pPanel
= ui
->m_vLodPanels
[i
];
60 void CLodGeneratorDialog::OnTextureSizeChanged(int nWidth
, int nHeight
)
62 int curWidth
= nWidth
;
63 int curHeight
= nHeight
;
65 const int nNumLods
= ui
->m_vLodPanels
.size();
66 for (int idx
= 1; idx
< nNumLods
; ++idx
)
68 curWidth
= curWidth
/2;
69 curHeight
= curHeight
/2;
70 ui
->m_vLodPanels
[idx
]->SetTextureSize(curWidth
,curHeight
);
74 void CLodGeneratorDialog::Reset(bool value
)
78 ui
->cSourceFileWidget
->Reset();
79 ui
->cGeometryBakeOptonsWidge
->Reset();
80 ui
->cMaterialBakeOptionsWidget
->Reset();
81 ui
->cGeometryTaskPanelWidget
->Reset();
82 ui
->cGeometryGenerationPanelWidget
->Reset();
84 CLodGeneratorInteractionManager::Instance()->ResetSettings();
86 ui
->cGeometryBakeOptonsWidge
->Update();
87 ui
->cMaterialBakeOptionsWidget
->Update();
89 //if(m_pMatOptionsPanel)
90 // m_pMatOptionsPanel->Update();
93 bool CLodGeneratorDialog::FileOpened()
97 CLodGeneratorInteractionManager
* pInstance
= CLodGeneratorInteractionManager::Instance();
98 string
filepath(CStringTool::QStringToCString(ui
->cSourceFileWidget
->LoadedFile()));
99 if (!pInstance
->LoadStatObj(filepath
))
101 CQuestionDialog::SWarning("File Load Failed", "Failed to load file into the engine, please consult the editor.log");
105 ui
->cSourceFileWidget
->RefreshMaterialFile();
107 return LoadMaterialHelper(ui
->cSourceFileWidget
->MaterialFile());
110 bool CLodGeneratorDialog::OnMaterialChange(const QString
& materialPath
)
112 if (LoadMaterialHelper(materialPath
))
114 CLodGeneratorInteractionManager::Instance()->UpdateFilename(CStringTool::QStringToCString(materialPath
));
120 bool CLodGeneratorDialog::LoadMaterialHelper(const QString
& materialPath
)
122 CLodGeneratorInteractionManager
* pInstance
= CLodGeneratorInteractionManager::Instance();
123 if(!pInstance
->LoadMaterial(CStringTool::QStringToCString(materialPath
)))
125 CQuestionDialog::SWarning("File Load Failed", "Failed to load material file into the engine, please consult the editor.log");
129 ui
->cGeometryGenerationPanelWidget
->CreateExistingLodKeys();
130 OnMaterialGeneratePrepare();
131 ui
->cGeometryBakeOptonsWidge
->Update();
132 ui
->cMaterialBakeOptionsWidget
->Update();
134 UpdateObj_Signal(pInstance
->GetLoadedModel());
139 void CLodGeneratorDialog::ClearLodPanels()
141 for each (CMaterialLODGeneratorLodItemOptionsPanel
* pPanel in ui
->m_vLodPanelParents
)
143 int index
= ui
->LodGeneratorToolBox
->indexOf(pPanel
);
145 ui
->LodGeneratorToolBox
->removeItem(index
);
147 ui
->m_vLodPanelsIdx
.clear();
148 ui
->m_vLodPanels
.clear();
149 ui
->m_vLodPanelParents
.clear();
153 void CLodGeneratorDialog::GenerateLodPanels()
155 CLodGeneratorInteractionManager
* pInstance
= CLodGeneratorInteractionManager::Instance();
159 int nSourceLod
= pInstance
->GetGeometryOption
<int>("nSourceLod");
161 const int nLods
= pInstance
->NumberOfLods();
162 for (int idx
= nSourceLod
+1; idx
< nLods
; ++idx
)
165 int nSubmatIdx
= pInstance
->GetSubMatId(nLodIdx
);
166 bool bAllowTextureSizeControl
= idx
== nSourceLod
+1;
167 CMaterialLODGeneratorLodItemOptionsPanel
* pItemPanel
= new CMaterialLODGeneratorLodItemOptionsPanel();
168 pItemPanel
->SetParams(nLodIdx
,nSubmatIdx
,bAllowTextureSizeControl
);
169 if(bAllowTextureSizeControl
)
170 connect(pItemPanel
,SIGNAL(OnTextureSizeChanged(int,int)),this,SLOT(OnTextureSizeChanged(int,int)));
175 panelName
.Format(CMaterialLODGeneratorLodItemOptionsPanel::kPanelCaption
,idx
);
177 //---------------------------------------------------------------------------------------------------
179 QWidget
* SourceFileWidget
= new QWidget();
180 //SourceFileWidget->setObjectName(QStringLiteral("SourceFileWidget"));
181 SourceFileWidget
->setGeometry(QRect(0, 0, 437, 411));
182 QVBoxLayout
* verticalLayout
= new QVBoxLayout(SourceFileWidget
);
183 verticalLayout
->setSpacing(6);
184 verticalLayout
->setContentsMargins(11, 11, 11, 11);
185 verticalLayout
->setObjectName(QStringLiteral("verticalLayout"));
186 verticalLayout
->setContentsMargins(0, 0, 0, 0);
187 // cSourceFileWidget = new CLodGeneratorFilePanel(SourceFileWidget);
188 // cSourceFileWidget->setObjectName(QStringLiteral("cSourceFileWidget"));
189 QSizePolicy
sizePolicy(QSizePolicy::Preferred
, QSizePolicy::Fixed
);
190 sizePolicy
.setHorizontalStretch(0);
191 sizePolicy
.setVerticalStretch(0);
192 sizePolicy
.setHeightForWidth(pItemPanel
->sizePolicy().hasHeightForWidth());
193 pItemPanel
->setSizePolicy(sizePolicy
);
194 QHBoxLayout
* horizontalLayout
= new QHBoxLayout(pItemPanel
);
195 horizontalLayout
->setSpacing(6);
196 horizontalLayout
->setContentsMargins(11, 11, 11, 11);
197 horizontalLayout
->setObjectName(QStringLiteral("horizontalLayout"));
198 horizontalLayout
->setContentsMargins(0, 0, 0, 0);
200 verticalLayout
->addWidget(pItemPanel
);
202 QSpacerItem
* verticalSpacer
= new QSpacerItem(20, 40, QSizePolicy::Minimum
, QSizePolicy::Expanding
);
204 verticalLayout
->addItem(verticalSpacer
);
207 //---------------------------------------------------------------------------------------------------
209 int index
= ui
->LodGeneratorToolBox
->addItem(SourceFileWidget
,CStringTool::CStringToQString(panelName
));
211 ui
->m_vLodPanelsIdx
.push_back(index
);
212 ui
->m_vLodPanels
.push_back(pItemPanel
);
213 ui
->m_vLodPanelParents
.push_back(SourceFileWidget
);
216 for (int idx
= 1; idx
< nLods
; idx
++)
218 const int nSubMats
= pInstance
->GetSubMatCount(idx
);
221 CQuestionDialog::SWarning("LOD Sub-Material Warning", "Loaded lods have multiple sub-materials please ensure only a single material is used before attempting to bake texture materials");
228 void CLodGeneratorDialog::OnMaterialGeneratePrepare()
230 CLodGeneratorInteractionManager
* pInstance
= CLodGeneratorInteractionManager::Instance();
231 if(!pInstance
->GetLoadedModel())
236 ui
->cMaterialBakeOptionsWidget
->Update();
238 XmlNodeRef settings
= pInstance
->GetSettings("MaterialLodSettings");
239 const int individualLodChildSettings
= settings
->getChildCount();
240 for (int idx
= 0; idx
< individualLodChildSettings
; ++idx
)
242 XmlNodeRef child
= settings
->getChild(idx
);
244 if (!child
->getAttr("nLodId",nLodId
))
247 const int nNumLods
= ui
->m_vLodPanels
.size();
248 for (int panelidx
= 0; panelidx
< nNumLods
; ++panelidx
)
250 if ( ui
->m_vLodPanels
[panelidx
]->LodId() == nLodId
)
252 ui
->m_vLodPanels
[panelidx
]->Serialize(child
,true);
262 bool CLodGeneratorDialog::OnGenerateMaterial()
265 CLodGeneratorInteractionManager::Instance()->ClearResults();
266 const int nNumLods
= ui
->m_vLodPanels
.size();
267 for (int idx
= 0; idx
< nNumLods
; ++idx
)
269 CMaterialLODGeneratorLodItemOptionsPanel
* pPanel
= ui
->m_vLodPanels
[idx
];
270 if (!pPanel
->IsBakingEnabled())
273 int nLodId
= pPanel
->LodId();
274 int nWidth
= pPanel
->Width();
275 int nHeight
= pPanel
->Height();
277 CLodGeneratorInteractionManager::Instance()->RunProcess(nLodId
,nWidth
,nHeight
);
278 pPanel
->UpdateUITextures();
281 CLodGeneratorInteractionManager::Instance()->ClearResults();
287 bool CLodGeneratorDialog::OnSave()
290 CLodGeneratorInteractionManager
* pInstance
= CLodGeneratorInteractionManager::Instance();
292 const int nNumLods
= ui
->m_vLodPanels
.size();
293 for (int idx
= 0; idx
< nNumLods
; ++idx
)
295 CMaterialLODGeneratorLodItemOptionsPanel
* pPanel
= ui
->m_vLodPanels
[idx
];
296 if (!pPanel
->IsBakingEnabled())
299 int nLodId
= pPanel
->LodId();
300 pInstance
->SaveTextures(nLodId
);
303 ui
->cMaterialBakeOptionsWidget
->Update();
305 XmlNodeRef settings
= pInstance
->GetSettings("MaterialLodSettings");
306 settings
->removeAllChilds();
307 for (int idx
= 0; idx
< nNumLods
; ++idx
)
309 CMaterialLODGeneratorLodItemOptionsPanel
* pPanel
= ui
->m_vLodPanels
[idx
];
310 pPanel
->Serialize(settings
,false);
313 // update panel material,cause of reloading
314 for (int idx
= 0; idx
< nNumLods
; ++idx
)
316 CMaterialLODGeneratorLodItemOptionsPanel
* pPanel
= ui
->m_vLodPanels
[idx
];
317 pPanel
->UpdateMaterial();
320 pInstance
->SaveSettings();
324 const char* CLodGeneratorDialog::GetEditorName() const
326 return "LOD Generator";