11 #include "FormVertexBuilder.h"
12 #include "FullScreenPanel.h"
14 #include <Qt5Utility/QGui.h>
16 #include <QMessageBox>
17 #include <QFileDialog>
18 #include <QPrintDialog>
19 #include <QPrintPreviewDialog>
21 #include "BuildInfo.h"
23 #include "PostprocLibrary.h"
24 #include "SampleShapeBuilder.h"
25 #include "ShaderLibrary.h"
26 #include "QGVAboutDlg.h"
28 #include "FormCustomShader.h"
29 #include "FormPyScript.h"
30 #include "MatcapSelectDlg.h"
31 #include "EnvmapSelectDlg.h"
32 #include "FileDlgUtil.h"
36 QColor ToQColor(const lib_graph::color4f& c)
38 int r = lm::clamp(0, (int)(c.r() * 255.0f), 255);
39 int g = lm::clamp(0, (int)(c.g() * 255.0f), 255);
40 int b = lm::clamp(0, (int)(c.b() * 255.0f), 255);
41 int a = lm::clamp(0, (int)(c.a() * 255.0f), 255);
43 return QColor(r, g, b, a);
48 FormMain::FormMain(QWidget *parent)
52 , m_CustomShaderDlg(NULL)
57 m_EnableAllFeatures = false;
58 m_LastFocusedDockDlg = NULL;
62 setWindowTitle("QtGeoViewer");
65 InitializeStatusBar();
67 InitializeCoordinateCombobox();
68 Initialize2DViewSrcCombobox();
69 InitializeEventFilter();
74 SyncViewSettingsFromGUI();
75 SyncUVViewSettingsFromGUI();
76 SyncSceneSettingsFromGUI();
77 ApplyGeomStateFromGUI();
78 SyncShaderSettingsToGUI();
80 ui.toolBar_View->setVisible( ui.actionWindow_ToolBarView->isChecked() );
82 UpdateViewTypeFromMenu();
90 InitializeAnimation();
92 InitializeFromConfigFiles();
101 m_InitRect.translate(pos());
108 FormMain::~FormMain()
113 void FormMain::LoadLastWinPos(void)
115 QString file = PathInfo::GetPosConfigFilePath();
116 QSettings conf(file, QSettings::IniFormat);
119 v = conf.value("main/WindowPos");
122 QRect r = v.toRect();
130 move(QPoint(dl, dt));
133 v = conf.value("main/WinState");
137 setWindowState(Qt::WindowMaximized);
141 void FormMain::SaveWinPos(void)
143 QString file = PathInfo::GetPosConfigFilePath();
144 QSettings conf(file, QSettings::IniFormat);
146 conf.setValue("main/WinState", isMaximized());
148 if (isMaximized() || isMinimized())
150 setWindowState(Qt::WindowNoState);
151 QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
157 conf.setValue("main/WindowPos", r);
160 void FormMain::HideFeatures(void)
162 bool b = m_EnableAllFeatures;
164 ui.actionVertexBuilder->setVisible(b);
165 ui.menuPrintRoot->menuAction()->setVisible(b);
166 ui.actionShadowmap->setVisible(b);
167 ui.actionEnvmap->setVisible(b);
168 ui.actionShaderCustom->setVisible(b);
169 ui.actionWindowCustomShader->setVisible(b);
170 ui.actionPyScript->setVisible(b);
171 ui.actionConsole->setVisible(b);
172 ui.actionReleaseShader->setVisible(b);
175 void FormMain::InitializeEventFilter(void)
177 ui.editEnvMap->installEventFilter(this);
178 ui.editMatcap->installEventFilter(this);
180 ui.editCurrentTexName->installEventFilter(this);
181 ui.editCurrentMatNormalMap->installEventFilter(this);
182 ui.editMatCapEachMaterial->installEventFilter(this);
185 void FormMain::InitDataBinding(void)
187 InitializeVisiblStateMenu();
188 InitializeUVStateMenu();
189 InitializeSceneStateMenu();
190 InitializeGeomStateMenu();
191 InitializeCursorMenu();
194 void FormMain::InitializeVisiblStateMenu(void)
196 DataBinderMap& dbmap = m_Binder_ViewConfig;
198 View3DConfig& cfg_3d = m_View3d.m_Config;
200 dbmap.AddBinder(new MenuBinder(ui.actionDrawBBox , &cfg_3d.m_DrawBBox ));
201 dbmap.AddBinder(new MenuBinder(ui.actionFaceVBO , &cfg_3d.m_EnableFaceVBO ));
202 dbmap.AddBinder(new MenuBinder(ui.actionVidTopMost , &cfg_3d.m_ShowVidTopMost ));
203 dbmap.AddBinder(new MenuBinder(ui.actionDrawBBoxRange , &cfg_3d.m_DrawBBoxRange ));
204 dbmap.AddBinder(new MenuBinder(ui.actionWireDispList , &cfg_3d.m_EnableWireDispList ));
205 dbmap.AddBinder(new MenuBinder(ui.actionMultisample , &cfg_3d.m_EnableMultisample ));
206 dbmap.AddBinder(new MenuBinder(ui.actionCoverageTransparent , &cfg_3d.m_EnableCoverageTrans ));
207 dbmap.AddBinder(new MenuBinder(ui.actionSeparateSpecular , &cfg_3d.m_SeparateSpecular ));
208 dbmap.AddBinder(new MenuBinder(ui.actionShowSelVertCoord , &cfg_3d.m_ShowSelVertCoord ));
209 dbmap.AddBinder(new MenuBinder(ui.actionHighlightSelected , &cfg_3d.m_HighlightSelected ));
210 dbmap.AddBinder(new MenuBinder(ui.actionFixMaterialSilver , &cfg_3d.m_UseFixMaterial ));
211 dbmap.AddBinder(new MenuBinder(ui.actionShadowmapBuffer , &cfg_3d.m_DrawShadowmapBuf ));
212 dbmap.AddBinder(new MenuBinder(ui.actionEnableTexture3D , &cfg_3d.m_EnableTexture ));
213 dbmap.AddBinder(new MenuBinder(ui.actionEnableLighting , &cfg_3d.m_EnableLighting ));
214 dbmap.AddBinder(new MenuBinder(ui.actionEnableCulling , &cfg_3d.m_EnableCullFace ));
215 dbmap.AddBinder(new MenuBinder(ui.actionDrawWire , &cfg_3d.m_DrawWire ));
216 dbmap.AddBinder(new MenuBinder(ui.actionDrawVid , &cfg_3d.m_DrawVid ));
217 dbmap.AddBinder(new MenuBinder(ui.actionDrawVertNormal , &cfg_3d.m_DrawVertNormal ));
218 dbmap.AddBinder(new MenuBinder(ui.actionDrawVert , &cfg_3d.m_DrawVert ));
219 dbmap.AddBinder(new MenuBinder(ui.actionWireVBO , &cfg_3d.m_EnableWireVBO ));
220 dbmap.AddBinder(new MenuBinder(ui.actionIndexColorMode , &cfg_3d.m_IndexMaterial ));
221 dbmap.AddBinder(new MenuBinder(ui.actionFBMaterial , &cfg_3d.m_FBMaterial ));
222 dbmap.AddBinder(new MenuBinder(ui.actionDrawMiniAxis , &cfg_3d.m_DrawMiniAxis ));
223 dbmap.AddBinder(new MenuBinder(ui.actionDrawLookPos , &cfg_3d.m_DrawLookPos ));
224 dbmap.AddBinder(new MenuBinder(ui.actionDrawLightPos , &cfg_3d.m_DrawLightPosition ));
225 dbmap.AddBinder(new MenuBinder(ui.actionDrawGround , &cfg_3d.m_DrawGround ));
226 dbmap.AddBinder(new MenuBinder(ui.actionDrawFid , &cfg_3d.m_DrawFid ));
227 dbmap.AddBinder(new MenuBinder(ui.actionDrawFace , &cfg_3d.m_DrawFace ));
228 dbmap.AddBinder(new MenuBinder(ui.actionCameraRecords , &cfg_3d.m_DrawCameraRecord ));
229 dbmap.AddBinder(new MenuBinder(ui.actionDrawAxis , &cfg_3d.m_DrawAxis ));
230 dbmap.AddBinder(new MenuBinder(ui.actionDoubleSideShading , &cfg_3d.m_DoubleSideShading ));
231 dbmap.AddBinder(new MenuBinder(ui.actionDirectionalLight , &cfg_3d.m_LightIsDirectional ));
232 dbmap.AddBinder(new MenuBinder(ui.actionCullFrontOrBack , &cfg_3d.m_CullAngle_F ));
233 dbmap.AddBinder(new MenuBinder(ui.actionHighlightMaterial , &cfg_3d.m_HighlightMaterial ));
234 dbmap.AddBinder(new MenuBinder(ui.actionCloseVert , &cfg_3d.m_ShowCloseVertInfo ));
235 dbmap.AddBinder(new MenuBinder(ui.actionCameraRange , &cfg_3d.m_DrawRenderRange ));
236 dbmap.AddBinder(new MenuBinder(ui.actionRenderTime , &cfg_3d.m_ShowRenderTime ));
237 dbmap.AddBinder(new MenuBinder(ui.actionUseFixTexture , &cfg_3d.m_UseFixTexture ));
238 dbmap.AddBinder(new MenuBinder(ui.actionShowSelVertIdx , &cfg_3d.m_ShowSelVertIdx ));
239 dbmap.AddBinder(new MenuBinder(ui.actionShowMeshBound , &cfg_3d.m_ShowMeshBound ));
240 dbmap.AddBinder(new MenuBinder(ui.actionPickTransparent , &cfg_3d.m_PickTransparent ));
241 dbmap.AddBinder(new MenuBinder(ui.actionFlatShading , &cfg_3d.m_EnableFlatShade ));
242 dbmap.AddBinder(new MenuBinder(ui.actionDrawPolylineLenWhl , &cfg_3d.m_DrawPolylineLenWhl ));
243 dbmap.AddBinder(new MenuBinder(ui.actionDrawPolylineLen , &cfg_3d.m_DrawPolylineLen ));
244 dbmap.AddBinder(new MenuBinder(ui.actionDrawPolylineIdx , &cfg_3d.m_DrawPolylineIdx ));
245 dbmap.AddBinder(new MenuBinder(ui.actionDrawPolyline , &cfg_3d.m_DrawPolyline ));
246 dbmap.AddBinder(new MenuBinder(ui.actionShowMeasure , &cfg_3d.m_DrawCameraMeasure ));
247 dbmap.AddBinder(new MenuBinder(ui.actionFlipMouseMR , &cfg_3d.m_FlipMouseMR ));
248 dbmap.AddBinder(new MenuBinder(ui.actionSyncLightToCamera , &cfg_3d.m_SyncLightTocamera ));
250 for (GuiBinder& binder : dbmap.m_BinderMap)
252 MenuBinder* mb = dynamic_cast<MenuBinder*>(&binder);
255 QAction* a = mb->GetMenu();
258 SIGNAL(triggered(bool)),
260 SLOT(actionVisibleStates_Triggered(bool)));
265 void FormMain::InitializeUVStateMenu(void)
267 DataBinderMap& dbmap = m_Binder_UVConfig;
269 dbmap.AddBinder(new MenuBinder(ui.actionUVRepeat , &m_View2d.m_RepeatTexture ));
270 dbmap.AddBinder(new MenuBinder(ui.actionUseFixTexture2D , &m_View2d.m_UseFixTexute ));
271 dbmap.AddBinder(new MenuBinder(ui.actionShowVertex2d , &m_View2d.m_DrawVerts ));
272 dbmap.AddBinder(new MenuBinder(ui.actionShowImage2d , &m_View2d.m_EnableTexture ));
273 dbmap.AddBinder(new MenuBinder(ui.actionTextureMipmap , &m_Scene.m_TexConfig.m_EnableMipmap ));
274 dbmap.AddBinder(new MenuBinder(ui.actionTextureCompress , &m_Scene.m_TexConfig.m_EnableCompress ));
275 dbmap.AddBinder(new MenuBinder(ui.actionUVFlipY , &m_Scene.m_TextureTransform.m_FlipY ));
277 for (GuiBinder& binder : dbmap.m_BinderMap)
279 MenuBinder* mb = dynamic_cast<MenuBinder*>(&binder);
282 QAction* a = mb->GetMenu();
285 SIGNAL(triggered(bool)),
287 SLOT(actionVisibleStatesUV_Triggered(bool)));
292 void FormMain::InitializeSceneStateMenu(void)
294 DataBinderMap& dbmap = m_Binder_Scene;
296 dbmap.AddBinder(new CheckboxBinder( ui.checkEnvMap , &m_Scene.m_EnvImg.m_VisibleEnvSphere ));
297 dbmap.AddBinder(new CheckboxBinder( ui.checkEnvReflection , &m_Scene.m_EnvImg.m_IsEnableReflection ));
298 dbmap.AddBinder(new CheckboxBinder( ui.checkShadowEnabled , &m_Scene.m_ShadowConfig.m_EnableShadow ));
299 dbmap.AddBinder(new CheckboxBinder( ui.checkSoftShadow , &m_Scene.m_ShadowConfig.m_EnableSoftShadow ));
301 for (GuiBinder& binder : dbmap.m_BinderMap)
303 CheckboxBinder* mb = dynamic_cast<CheckboxBinder*>(&binder);
306 QCheckBox* c = mb->GetCheckBox();
309 SIGNAL(toggled(bool)),
311 SLOT(actionSceneStates_Toggled(bool)));
316 void FormMain::InitializeCursorMenu(void)
318 DataBinderMap& dbmap = m_Binder_Cursor;
320 Cursor3D& cursor = m_Scene.m_Cursor3d;
321 dbmap.AddBinder(new MenuBinder( ui.actionShowCursor , &cursor.ShowCursor ));
322 dbmap.AddBinder(new MenuBinder( ui.actionCursorToDepth , &cursor.CursorDepth ));
323 dbmap.AddBinder(new MenuBinder( ui.actionCursorCoord , &cursor.ShowCoord ));
324 dbmap.AddBinder(new MenuBinder( ui.actionCheckBaryCoord , &cursor.CheckBaryCoord ));
325 dbmap.AddBinder(new MenuBinder( ui.actionSelectCloseMat , &cursor.SelCloseVert ));
326 dbmap.AddBinder(new MenuBinder( ui.actionCursorAxis , &cursor.ShowAxis ));
327 dbmap.AddBinder(new MenuBinder( ui.actionMeasure , &cursor.ShowMeasure ));
328 dbmap.AddBinder(new MenuBinder( ui.actionMeasureLen , &cursor.ShowMeasureLen ));
329 dbmap.AddBinder(new MenuBinder( ui.actionMeasureXYZ , &cursor.ShowMeasureXYZ ));
331 for (GuiBinder& binder : dbmap.m_BinderMap)
333 MenuBinder* mb = dynamic_cast<MenuBinder*>(&binder);
336 QAction* a = mb->GetMenu();
339 SIGNAL(triggered(bool)),
341 SLOT(actionCursorMenuStates_Toggled(bool)));
347 void FormMain::InitializeGeomStateMenu(void)
349 AddGeomStateAction( ui.actionCentering );
350 AddGeomStateAction( ui.actionAutoResize );
353 void FormMain::AddGeomStateAction(const QAction* action)
357 SIGNAL(triggered(bool)),
359 SLOT(actionGeomStates_Triggered(bool)));
363 void FormMain::InitializeGLView(void)
365 ui.GLWidgetMain->setMouseTracking(true);
366 ui.GLWidgetUV->setMouseTracking(true);
368 ui.GLWidgetMain->SetViewer(&m_View3d);
369 m_View3d.m_Widgets = &m_Widgets;
370 m_View3d.RegisterScene(&m_Scene);
371 m_View3d.InitializeView(ui.GLWidgetMain);
373 ui.GLWidgetUV->SetViewer(&m_View2d);
374 m_View2d.m_Widgets = &m_Widgets;
375 m_View2d.RegisterScene(&m_Scene);
376 m_View2d.InitializeView(ui.GLWidgetUV);
378 m_Widgets.AddWidget(ui.GLWidgetMain);
379 m_Widgets.AddWidget(ui.GLWidgetUV);
381 // OpenGL
\82Ì
\83\8a\83X
\83g
\82Ì
\8b¤
\97L
\89»
384 m_ContextShare.BeginDrawTop();
386 m_Scene.Initialize();
388 m_ContextShare.EndDrawTop();
392 SIGNAL(SelectedObjectChanged(int, int)),
393 SLOT(View3D_SelectedObjectChanged(int, int)));
396 SIGNAL(SelectedMatChanged(int)),
397 SLOT(View3D_SelectedMatChanged(int)));
400 SIGNAL(CameraMoved(void)),
401 SLOT(View3D_CameraMoved(void)));
404 SIGNAL(StatusTipChanged(QString)),
405 SLOT(View3D_StatusTipChanged(QString)));
408 // OpenGL
\82Ì
\83\8a\83X
\83g
\82Ì
\8b¤
\97L
\89»
409 void FormMain::SetContextShare(void)
411 ui.GLWidgetUV->makeCurrent();
412 m_ContextShare.AddContext( GetDC((HWND)ui.GLWidgetUV->winId()) , wglGetCurrentContext() );
413 ui.GLWidgetUV->doneCurrent();
415 ui.GLWidgetMain->makeCurrent();
416 m_ContextShare.AddContext( GetDC((HWND)ui.GLWidgetUV->winId()) , wglGetCurrentContext() );
417 ui.GLWidgetMain->doneCurrent();
419 m_ContextShare.MakeShare();
422 void FormMain::InitializeCoordinateCombobox(void)
424 ui.comboCoordinate->blockSignals(true);
425 ui.comboCoordinate->addItem("Yup RH"); // RUF
426 ui.comboCoordinate->addItem("Zup RH"); // FRU
427 ui.comboCoordinate->addItem("Xup RH"); // UFR
428 ui.comboCoordinate->addItem("Yup LH"); // RUB
429 ui.comboCoordinate->addItem("Zup LH"); // BRU
430 ui.comboCoordinate->addItem("Xup LH"); // UBR
431 ui.comboCoordinate->blockSignals(false);
434 void FormMain::Initialize2DViewSrcCombobox(void)
436 ui.combo2DViewSrcType->blockSignals(true);
437 ui.combo2DViewSrcType->addItem("Color");
438 ui.combo2DViewSrcType->addItem("Normal");
439 ui.combo2DViewSrcType->blockSignals(false);
442 void FormMain::InitializeStatusBar(void)
444 m_StatusBar0 = new QLabel(this);
445 m_StatusBar1 = new QLabel(this);
446 ui.statusBar->addWidget(m_StatusBar0, 1);
447 ui.statusBar->addWidget(m_StatusBar1, 0);
449 m_StatusBar0->setText("");
451 m_StatusBar1->setMinimumWidth(290);
452 m_StatusBar1->setText("");
455 void FormMain::InitializeFromConfigFiles(void)
457 if (!InitializeConfig(PathInfo::GetGuiConfigFilePath()))
459 InitializeConfig(PathInfo::GetDefaultGuiConfigFilePath());
462 OpenCameraFile(PathInfo::GetCameraLogFilePath());
464 LoadWindowLayout(PathInfo::GetWindowLayoutConfigFilePath());
466 if (!QGui::LoadGUIState(this, PathInfo::GetLayoutConfigFilePath()))
468 QGui::LoadGUIState(this, PathInfo::GetDefaultLayoutConfigFilePath());
472 void FormMain::LoadDefaultConfig(void)
474 InitializeConfig(PathInfo::GetDefaultGuiConfigFilePath());
475 QGui::LoadGUIState(this, PathInfo::GetDefaultLayoutConfigFilePath());
478 void FormMain::SaveConfig(void)
480 PathInfo::CreateConfiDirIfNotExist();
482 SaveConfigFile(PathInfo::GetGuiConfigFilePath());
484 m_View3d.m_CameraRecord.SaveCamera(PathInfo::GetCameraLogFilePath().toLocal8Bit().data());
486 QGui::SaveGUIState(this, PathInfo::GetLayoutConfigFilePath());
488 SaveWindowLayout(PathInfo::GetWindowLayoutConfigFilePath());
491 bool FormMain::InitializeConfig(QString path)
493 View3DConfig& config_3d = m_View3d.m_Config;
496 cfg.m_Config3D = &config_3d;
497 cfg.m_Scene = &m_Scene;
499 if (!cfg.LoadConfigT(path.toLocal8Bit().data()))
502 ui.actionUVAutoFit->setChecked(cfg.m_AutFitUVView);
504 ui.comboCoordinate->setCurrentIndex(cfg.m_CoordType);
506 CreateRecentFilesMenu(cfg.m_RecentFiles);
508 m_Binder_ViewConfig.UpdateAllGUI(true);
509 m_Binder_UVConfig.UpdateAllGUI(true);
510 m_Binder_Scene.UpdateAllGUI(true);
511 m_Binder_Cursor.UpdateAllGUI(true);
513 ApplyGeomStateDataoToGUI();
515 SyncViewSettingsFromGUI();
516 SyncUVViewSettingsFromGUI();
517 SyncShaderSettingsToGUI();
519 m_EnableAllFeatures = cfg.m_EnableAllFeatures;
524 void FormMain::SaveConfigFile(QString path)
527 cfg.m_Config3D = &m_View3d.m_Config;
528 cfg.m_Scene = &m_Scene;
530 cfg.m_EnableAllFeatures = m_EnableAllFeatures;
532 cfg.m_AutFitUVView = ui.actionUVAutoFit ->isChecked();
534 cfg.m_CoordType = ui.comboCoordinate->currentIndex();
536 CreateRecentFilesFromMenu(cfg.m_RecentFiles);
538 cfg.SaveConfigT(path.toLocal8Bit().data());
542 void FormMain::InitializeSubDlg(void)
546 SIGNAL(currentColorChanged(const QColor &)),
548 SLOT(WireOverlayColorChanged(const QColor &)));
550 &m_DiffuseColorSelDlg,
551 SIGNAL(currentColorChanged(const QColor &)),
553 SLOT(FaceDiffuseColorChanged(const QColor &)));
556 SIGNAL(currentColorChanged(const QColor &)),
558 SLOT(BGColorChanged(const QColor &)));
560 &m_SelMatColorSelDlg,
561 SIGNAL(currentColorChanged(const QColor &)),
563 SLOT(SelMatColorChanged(const QColor &)));
565 m_SelMatColorWidget = NULL;
567 m_ViewConfigDlg.InitializeConfigDlg(&m_View3d.m_Config);
570 SIGNAL(ConfigChanged()),
572 SLOT(ConfigChangedDlg_ConfigChanged()));
574 m_CrossSectionDlg.InitializeConfigDlg(&m_View3d);
577 SIGNAL(ConfigChanged()),
579 SLOT(CrossSectionDlg_ConfigChanged()));
582 void FormMain::InitializeAnimation(void)
588 SLOT(OnRotateTimerUpdated()));
589 m_RotationTimer.setInterval(20);
592 void FormMain::InitializeMenu(void)
594 m_AGroup_Window = new QActionGroup(this);
595 m_AGroup_Window->setExclusive(true);
596 m_AGroup_Window->addAction( ui.actionWindow_3DView );
597 m_AGroup_Window->addAction( ui.actionWindow_UVView );
598 m_AGroup_Window->addAction( ui.actionWindows_DualView );
600 m_AGroup_Shader = new QActionGroup(this);
601 m_AGroup_Shader->setExclusive(true);
602 m_AGroup_Shader->addAction( ui.actionShaderDefault );
603 m_AGroup_Shader->addAction( ui.actionShaderPhong );
604 m_AGroup_Shader->addAction( ui.actionShaderCustom );
605 m_AGroup_Shader->addAction( ui.actionNormalColor );
606 m_AGroup_Shader->addAction( ui.actionDepthColor );
607 m_AGroup_Shader->addAction( ui.actionShadowmap );
608 m_AGroup_Shader->addAction( ui.actionEnvmap );
609 m_AGroup_Shader->addAction( ui.actionIntegrateShader );
610 m_AGroup_Shader->addAction( ui.actionMatcapShader );
612 m_AGroup_PProc = new QActionGroup(this);
613 m_AGroup_PProc->addAction( ui.actionPostProcNone );
614 m_AGroup_PProc->addAction( ui.actionPostProcAntialias );
615 m_AGroup_PProc->addAction( ui.actionPostProcBorder );
616 m_AGroup_PProc->addAction( ui.actionPostProcDepthLayerColor );
617 m_AGroup_PProc->addAction( ui.actionPostProcDepthColor );
618 m_AGroup_PProc->addAction( ui.actionPostProcDepthOfField );
621 void FormMain::InitContextMenu(void)
623 QList<QAction*> actions;
625 << ui.actionSelObjectVisible
626 << ui.actionSelObjectVertexOnlyMode
627 << ui.actionSelObjectDelete
628 << ui.actionSelObjectReload
629 << ui.actionSelObjectFlipFace
630 << ui.actionSelObjectOpenDir
631 << ui.actionActionSelObjectShowOnlyOnce
632 << ui.actionSelObjectTriangulate;
634 QTreeWidget* obj_tree = ui.treeObjects;
636 obj_tree->setContextMenuPolicy(Qt::ActionsContextMenu);
637 obj_tree->addActions(actions);
640 void FormMain::ProcArguments(void)
642 QStringList args = QApplication::arguments();
643 for (int i = 1; i < args.size(); ++i)
650 void FormMain::closeEvent(QCloseEvent *e)
658 m_ViewConfigDlg.close();
659 m_CrossSectionDlg.close();
660 m_FullscreenPanel.close();
662 if (m_CustomShaderDlg != NULL)
663 m_CustomShaderDlg->close();
664 if (m_PyScriptDlg != NULL)
665 m_PyScriptDlg->close();
667 if (m_MatcapDlg != NULL)
668 m_MatcapDlg->close();
669 if (m_EnvmapDlg != NULL)
670 m_EnvmapDlg->close();
672 m_ContextShare.BeginDrawTop();
673 m_Scene.FinalizeScene();
674 m_ContextShare.EndDrawTop();
678 bool FormMain::eventFilter(QObject * filterobj, QEvent * filterevt)
680 if (filterobj == ui.editEnvMap)
682 if (filterevt->type() == QEvent::DragEnter)
683 return AcceptDropFilterIfUrl(filterevt);
685 if (filterevt->type() == QEvent::Drop)
686 return OnDropFile_editEnvMap(filterevt);
688 else if (filterobj == ui.editMatcap)
690 if (filterevt->type() == QEvent::DragEnter)
691 return AcceptDropFilterIfUrl(filterevt);
693 if (filterevt->type() == QEvent::Drop)
694 return OnDropFile_editMatcap(filterevt);
696 else if (filterobj == ui.editMatCapEachMaterial)
698 if (filterevt->type() == QEvent::DragEnter)
699 return AcceptDropFilterIfUrl(filterevt);
701 if (filterevt->type() == QEvent::Drop)
702 return OnDropFile_editMatcapEachMat(filterevt);
704 else if (filterobj == ui.editCurrentTexName)
706 if (filterevt->type() == QEvent::DragEnter)
707 return AcceptDropFilterIfUrl(filterevt);
709 if (filterevt->type() == QEvent::Drop)
710 return OnDropFile_editCurrentTexName(filterevt);
712 else if (filterobj == ui.editCurrentMatNormalMap)
714 if (filterevt->type() == QEvent::DragEnter)
715 return AcceptDropFilterIfUrl(filterevt);
717 if (filterevt->type() == QEvent::Drop)
718 return OnDropFile_editCurrentMatNormalMap(filterevt);
721 return QMainWindow::eventFilter(filterobj, filterevt);
724 bool FormMain::OnDropFile_editEnvMap(QEvent * filterevt)
726 QString path = GetFirstLoadableImagePathFromDragEvent(filterevt);
733 bool FormMain::OnDropFile_editMatcap(QEvent * filterevt)
735 QString path = GetFirstLoadableImagePathFromDragEvent(filterevt);
737 LoadMatcapImage(path);
742 bool FormMain::OnDropFile_editMatcapEachMat(QEvent * filterevt)
744 QString path = GetFirstLoadableImagePathFromDragEvent(filterevt);
746 LoadMatcapImageForCurrentMat(path);
751 bool FormMain::OnDropFile_editCurrentTexName(QEvent * filterevt)
753 QString path = GetFirstLoadableImagePathFromDragEvent(filterevt);
755 LoadCurSelMatTexture(TextureType::Color, path);
760 bool FormMain::OnDropFile_editCurrentMatNormalMap(QEvent * filterevt)
762 QString path = GetFirstLoadableImagePathFromDragEvent(filterevt);
764 LoadCurSelMatTexture(TextureType::Normal, path);
769 bool FormMain::AcceptDropFilterIfUrl(QEvent * filterevt)
771 QDragEnterEvent* e = dynamic_cast<QDragEnterEvent*>(filterevt);
775 if (e->mimeData()->hasUrls())
776 e->acceptProposedAction();
781 QString FormMain::GetFirstLoadableImagePathFromDragEvent(QEvent* filterevt)
783 QDropEvent* e = dynamic_cast<QDropEvent*>(filterevt);
787 if (!e->mimeData()->hasUrls())
790 QList<QUrl> urls = e->mimeData()->urls();
791 for (int i = 0; i < urls.size(); ++i)
793 QString path = urls[i].toLocalFile();
794 if (IsSupportedTextureExt(path))
802 void FormMain::CenteringSplitter(void)
804 int w = ui.splitter->width();
808 ui.splitter->setSizes(s);
811 void FormMain::updateView_All(void)
817 void FormMain::updateView_2D(void)
819 ui.GLWidgetUV->update();
822 void FormMain::updateView_3D(void)
824 ui.GLWidgetMain->update();
827 void FormMain::on_actionOpen_triggered()
829 FileDlgFilterList exts;
830 exts.Add( "Wavefront" , "obj" );
831 exts.Add( "STL" , "stl" );
832 exts.Add( "PLY" , "ply" );
833 exts.Add( "Metasequoia" , "mqo" );
834 exts.Add( "Pmd" , "pmd" );
835 exts.Add( "Collada" , "dae" );
836 exts.Add( "DirectX" , "x" );
838 QString filter = FileDlgUtil::ExtListToDlgFilter("Geometry", exts);
839 QString title = "Open file";
840 QString fileName = GetFilePathFromOpenDlg(title, filter);
842 if (fileName.isEmpty())
845 if (IsResetSceneOnBeforeLoadFile())
848 if (OpenGeomFile(fileName))
852 void FormMain::on_actionExit_triggered()
857 void FormMain::actionVisibleStates_Triggered(bool checked)
859 QAction* a = dynamic_cast<QAction*>(QObject::sender());
862 if (a == ui.actionIndexColorMode)
864 ui.actionFixMaterialSilver->setChecked(false);
865 ui.actionFBMaterial->setChecked(false);
867 else if (a == ui.actionFixMaterialSilver)
869 ui.actionIndexColorMode->setChecked(false);
870 ui.actionFBMaterial->setChecked(false);
872 else if (a == ui.actionFBMaterial)
874 ui.actionFixMaterialSilver->setChecked(false);
875 ui.actionIndexColorMode->setChecked(false);
879 SyncViewSettingsFromGUI();
883 void FormMain::SyncViewSettingsFromGUI(void)
885 m_Binder_ViewConfig.UpdateAllData();
887 QAction* menu = GetMenuFromShader(m_View3d.m_Config.m_ShaderMode);
889 menu->setChecked(true);
892 QAction* FormMain::GetMenuFromShader(ShaderType type)
894 switch(m_View3d.m_Config.m_ShaderMode)
896 case ShaderType::Phong : return ui.actionShaderPhong;
897 case ShaderType::Custom : return ui.actionShaderCustom;
898 case ShaderType::NormalColor: return ui.actionNormalColor;
899 case ShaderType::DepthColor : return ui.actionDepthColor;
900 case ShaderType::Shadowmap : return ui.actionShadowmap;
901 case ShaderType::Envmap : return ui.actionEnvmap;
902 case ShaderType::Integrate : return ui.actionIntegrateShader;
903 case ShaderType::Matcap : return ui.actionMatcapShader;
904 case ShaderType::Default : return ui.actionShaderDefault;
912 bool FormMain::SaveWindowLayout(const QString& filepath)
916 config.m_MainWinLeft = geometry().x();
917 config.m_MainWinTop = geometry().y();
918 config.m_MainWinWidth = geometry().width();
919 config.m_MainWinHeight = geometry().height();
920 config.m_IsMaximized = isMaximized();
922 return config.SaveConfig(filepath.toLocal8Bit().data());
925 bool FormMain::LoadWindowLayout(const QString& filepath)
928 if (!config.LoadConfig(filepath.toLocal8Bit().data()))
931 if (config.m_IsMaximized)
934 int l = config.m_MainWinLeft;
935 int t = config.m_MainWinTop;
936 int w = config.m_MainWinWidth;
937 int h = config.m_MainWinHeight;
938 setGeometry(l, t, w, h);
943 void FormMain::actionVisibleStatesUV_Triggered(bool)
945 SyncUVViewSettingsFromGUI();
948 void FormMain::SyncUVViewSettingsFromGUI(void)
950 m_Binder_UVConfig.UpdateAllData();
954 void FormMain::actionSceneStates_Toggled(bool)
956 SyncSceneSettingsFromGUI();
959 void FormMain::SyncSceneSettingsFromGUI(void)
961 m_Binder_Scene.UpdateAllData();
965 void FormMain::on_actionWindow_ToolBarView_triggered(bool checked)
967 ui.toolBar_View->setVisible( ui.actionWindow_ToolBarView->isChecked() );
970 void FormMain::on_actionToolBar_Options_toggled(bool checked)
972 ui.toolBar_Option->setVisible(checked);
975 void FormMain::on_actionToolBar_Operation_toggled(bool checked)
977 ui.toolBar_Operation->setVisible(checked);
980 void FormMain::on_actionCameraDist_triggered()
982 m_View3d.AdjustCameraDistAuto();
985 void FormMain::on_actionCameraFront_triggered()
987 m_View3d.MoveCaemraTo(ViewPoint::Front);
990 void FormMain::on_actionCameraBack_triggered()
992 m_View3d.MoveCaemraTo(ViewPoint::Back);
995 void FormMain::on_actionCameraLeft_triggered()
997 m_View3d.MoveCaemraTo(ViewPoint::Left);
1000 void FormMain::on_actionCameraRight_triggered()
1002 m_View3d.MoveCaemraTo(ViewPoint::Right);
1005 void FormMain::on_actionCameraTop_triggered()
1007 m_View3d.MoveCaemraTo(ViewPoint::Top);
1010 void FormMain::on_actionCameraBottom_triggered()
1012 m_View3d.MoveCaemraTo(ViewPoint::Bottom);
1015 void FormMain::on_actionCameraPers_triggered()
1017 m_View3d.MoveCaemraTo(ViewPoint::Perse);
1020 void FormMain::on_actionCameraLookOrigin_triggered()
1022 m_View3d.MoveLookPosToOrigin();
1025 void FormMain::on_actionCameraLookCenter_triggered()
1027 m_View3d.MoveLookPosToCenter();
1030 void FormMain::on_actionWindow_3DView_triggered(bool checked)
1032 UpdateViewTypeFromMenu();
1035 void FormMain::on_actionWindows_DualView_triggered(bool checked)
1037 UpdateViewTypeFromMenu();
1040 void FormMain::on_actionWindow_UVView_triggered(bool checked)
1042 UpdateViewTypeFromMenu();
1045 void FormMain::UpdateViewTypeFromMenu(void)
1047 if (ui.actionWindows_DualView->isChecked())
1049 ui.frameView3D->setVisible(true);
1050 ui.frameView2D->setVisible(true);
1052 // TODO:
\89¼.
\8bN
\93®
\8e\9e\82É
\83r
\83\85\81[
\82ð1:1
\82É
\90Ý
\92è
\82Å
\82«
\82È
\82¢
\96â
\91è
\82Ì
\89¼
\91Î
\89\9e.
1053 static bool firsttime = true;
1057 CenteringSplitter();
1060 if (ui.actionWindow_3DView->isChecked())
1062 ui.frameView3D->setVisible(true);
1063 ui.frameView2D->setVisible(false);
1065 if (ui.actionWindow_UVView->isChecked())
1067 ui.frameView3D->setVisible(false);
1068 ui.frameView2D->setVisible(true);
1072 void FormMain::on_actionWindowMaterialList_triggered()
1074 ShowAndActivateAndRaise(ui.dockMaterial);
1075 ui.listMaterial->setFocus();
1078 void FormMain::on_actionWindowObjectList_triggered()
1080 ShowAndActivateAndRaise(ui.dockObject);
1081 ui.treeObjects->setFocus();
1084 void FormMain::on_actionWindowCameraList_triggered()
1086 ShowAndActivateAndRaise(ui.dockCamera);
1087 ui.listCamera->setFocus();
1090 void FormMain::on_actionWindowScenePanel_triggered()
1092 ShowAndActivateAndRaise(ui.dockScene);
1095 void FormMain::on_listMaterial_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
1097 m_Scene.m_Sels.SetSelMat(ui.listMaterial->currentRow());
1098 OnChangedSelectedMaterial();
1102 void FormMain::ShowAndActivateAndRaise(QDockWidget* widget)
1104 widget->setVisible(true);
1105 widget->activateWindow();
1109 void FormMain::on_treeObjects_currentItemChanged(QTreeWidgetItem * current, QTreeWidgetItem * previous)
1111 RefreshObjectSelectState();
1114 void FormMain::RefreshObjectSelectState(void)
1116 SetPrimayrSelectObjectToScene();
1118 QListWidget* list_mat = ui.listMaterial;
1121 const MeshBuf* mbuf = m_Scene.GetPrimaryMeshbuf();
1124 const lib_geo::BaseMesh& mesh = mbuf->m_Mesh;
1125 for (const lib_geo::BaseMaterial& mat : mesh.m_Materials)
1127 const std::string& name = mat.m_Name;
1130 list_mat->addItem("--");
1132 list_mat->addItem(QString::fromLocal8Bit(name.c_str()));
1136 const GeomObject* obj = m_Scene.GetPrimaryObject();
1139 ui.actionSelObjectVisible->setChecked(mbuf->IsVisible());
1141 else if (obj != NULL)
1143 ui.actionSelObjectVisible->setChecked(obj->m_Visible);
1147 ui.actionSelObjectVertexOnlyMode->setChecked(obj->m_VertexOnlyMode);
1149 if (list_mat->count() > 0 && list_mat->currentRow() < 0)
1151 list_mat->setCurrentRow(0);
1152 m_Scene.m_Sels.SetSelMat(0);
1153 OnChangedSelectedMaterial();
1159 void FormMain::OnChangedSelectedMaterial(void)
1166 ui.editCurrentTexName->clear();
1168 GeomTextureSet* ts = m_Scene.GetSelectedTexture();
1171 ui.editCurrentTexName->setText("");
1172 ui.editMatCapEachMaterial->setText("");
1176 QString name_c, name_n;
1178 gl::GlTexture* tex_c = ts->GetTexColor();
1180 name_c = QString::fromLocal8Bit(tex_c->GetName().c_str());
1182 gl::GlTexture* tex_n = ts->GetTexNormal();
1184 name_n = QString::fromLocal8Bit(tex_n->GetName().c_str());
1186 ui.editCurrentTexName->setText(name_c);
1187 ui.editCurrentMatNormalMap->setText(name_n);
1189 MatcapImage& matcap = ts->TexMatcap;
1190 ui.editMatCapEachMaterial->setText(matcap.GetName());
1193 lib_geo::BaseMaterial* mat = m_Scene.GetSelectedMaterial();
1196 SetWidgetColor(ui.colorAmbient , ToQColor(mat->m_Ambient));
1197 SetWidgetColor(ui.colorEmission , ToQColor(mat->m_Emission));
1198 SetWidgetColor(ui.colorDiffuse , ToQColor(mat->m_Diffuse));
1199 SetWidgetColor(ui.colorSpecular , ToQColor(mat->m_Specular));
1201 int val_max = ui.sliderShininess->maximum();
1202 int slider_pos = (int)(mat->m_Shininess * (float)val_max / 200.0f);
1203 slider_pos = (lm::min)(val_max, slider_pos);
1204 ui.sliderShininess->blockSignals(true);
1205 ui.sliderShininess->setValue(slider_pos);
1206 ui.sliderShininess->blockSignals(false);
1207 ui.labelShininessVal->setText(QString::number(mat->m_Shininess, 'f', 2));
1213 void FormMain::keyPressEvent(QKeyEvent *e)
1216 if (m.Flag_C() && e->key() == Qt::Key_Tab)
1222 void FormMain::FocusNextSubDlg(void)
1224 std::vector<QDockWidget*> widgets;
1226 if (ui.dockObject ->isVisible()) widgets.push_back( ui.dockObject );
1227 if (ui.dockCamera ->isVisible()) widgets.push_back( ui.dockCamera );
1228 if (ui.dockScene ->isVisible()) widgets.push_back( ui.dockScene );
1229 if (ui.dockMaterial ->isVisible()) widgets.push_back( ui.dockMaterial );
1231 if (widgets.empty())
1234 QDockWidget* next_widget = NULL;
1236 for (size_t i = 0; i < widgets.size(); ++i)
1238 if (widgets[i] == m_LastFocusedDockDlg)
1240 next_widget = widgets[(i + 1) % widgets.size()];
1245 if (next_widget == NULL)
1246 next_widget = widgets.front();
1248 m_LastFocusedDockDlg = next_widget;
1250 next_widget->activateWindow();
1251 next_widget->raise();
1252 next_widget->setFocus();
1255 void FormMain::dragEnterEvent(QDragEnterEvent* e)
1257 if (e->mimeData()->hasUrls())
1258 e->acceptProposedAction();
1261 void FormMain::dropEvent(QDropEvent* e)
1263 if (e->mimeData()->hasUrls())
1265 QList<QUrl> urls = e->mimeData()->urls();
1267 std::vector<QString> geom_files;
1269 for (int i = 0; i < urls.size(); ++i)
1271 QString path = urls[i].toLocalFile();
1272 if (FormatType::IsGeomFileExt(path))
1273 geom_files.push_back(path);
1276 if (!geom_files.empty())
1278 if (IsResetSceneOnBeforeLoadFile())
1281 for (size_t i = 0; i < geom_files.size(); ++i)
1283 if (OpenGeomFile(geom_files[i]))
1288 for (int i = 0; i < urls.size(); ++i)
1290 QString path = urls[i].toLocalFile();
1292 if (IsSupportedTextureExt(path))
1294 OpenFixTextureFile(path);
1298 if (IsCameraFile(path))
1300 OpenCameraFile(path);
1307 bool FormMain::IsResetSceneOnBeforeLoadFile(void) const
1309 if (QApplication::keyboardModifiers() & Qt::ShiftModifier)
1315 //!
\83I
\83u
\83W
\83F
\83N
\83g
\82Ì
\83}
\83e
\83\8a\83A
\83\8b\82É
\90Ý
\92è
\82³
\82ê
\82½
\82à
\82Ì
\82Æ
\82Í
\95Ê
\82Ì
\83e
\83N
\83X
\83`
\83\83\82ð
\8ew
\92è
\82·
\82é.
1316 void FormMain::OpenFixTextureFile(const QString& path)
1318 std::string fname = path.toLocal8Bit().data();
1320 m_ContextShare.BeginDrawTop();
1321 m_Scene.LoadDefaultMatTexture(fname);
1322 m_ContextShare.EndDrawTop();
1327 bool FormMain::OpenGeomFile(const QString& path)
1329 m_Scene.m_ObjSplit = ui.checkSplitOBJ->isChecked();
1331 m_ContextShare.BeginDrawTop();
1336 m_Scene.ImportFileAutoFmt(path);
1338 catch(const FileLoadErrorException& ex)
1341 msg += "Failed Load ";
1342 msg += path + "\n\n";
1343 msg += QString::fromLocal8Bit(ex.what());
1345 QMessageBox::warning(this, "", msg);
1349 m_ContextShare.EndDrawTop();
1351 RebuildObjectList();
1358 AddRecentFile(path);
1363 void FormMain::ClearAllObjects(void)
1365 m_ContextShare.BeginDrawTop();
1367 m_Scene.ClearObjects();
1369 m_ContextShare.EndDrawTop();
1371 m_View3d.ClearRenderMap();
1373 RebuildObjectList();
1374 RefreshObjectSelectState();
1379 void FormMain::RebuildObjectList(void)
1381 QTreeWidget* obj_tree = ui.treeObjects;
1383 obj_tree->setCurrentItem(NULL);
1384 obj_tree->blockSignals(true);
1388 obj_tree->setSelectionBehavior(QAbstractItemView::SelectRows);
1389 obj_tree->setSelectionMode(QAbstractItemView::SingleSelection);
1390 obj_tree->setEditTriggers(QAbstractItemView::NoEditTriggers);
1392 obj_tree->setColumnCount(4);
1394 InitObjectListHeader();
1396 for (const geom::GeomObject& obj : m_Scene.m_Objects)
1398 QTreeWidgetItem* n = CreateObjectTreeNode(obj);
1399 PushbackTreeNode(ui.treeObjects, n);
1400 n->setExpanded(true);
1403 SetPrimayrSelectObjectFromScene();
1405 obj_tree->blockSignals(false);
1407 if (obj_tree->currentItem() == NULL)
1409 if (!m_Scene.m_Objects.empty())
1411 QTreeWidgetItem* ti = obj_tree->topLevelItem(0);
1412 obj_tree->setCurrentItem(ti);
1419 ResizeTreeColumns(obj_tree, 4);
1423 bool FormMain::IsCameraFile(const QString& path) const
1425 QFileInfo fInfo( path );
1426 QString ext = fInfo.suffix().toLower();
1427 return (ext == "camera");
1430 bool FormMain::OpenCameraFile(const QString& path)
1432 std::string fname = path.toLocal8Bit().data();
1434 if(!m_View3d.m_CameraRecord.LoadCamera(fname.c_str()))
1437 ui.listCamera->blockSignals(true);
1438 ui.listCamera->clear();
1439 for (size_t i = 0; i < m_View3d.m_CameraRecord.m_Records.size(); ++i)
1441 ui.listCamera->addItem( QString::number(i) );
1443 ui.listCamera->blockSignals(false);
1449 void FormMain::actionGeomStates_Triggered(bool)
1451 ApplyGeomStateFromGUI();
1453 m_Scene.UpdateTransform();
1458 void FormMain::ApplyGeomStateFromGUI(void)
1460 m_Scene.m_Config.m_EnableAutoCentering = ui.actionCentering->isChecked();
1461 m_Scene.m_Config.m_EnableAutoReisze = ui.actionAutoResize->isChecked();
1464 void FormMain::ApplyGeomStateDataoToGUI(void)
1466 ui.actionAutoResize ->setChecked( m_Scene.m_Config.m_EnableAutoReisze );
1467 ui.actionCentering ->setChecked( m_Scene.m_Config.m_EnableAutoCentering );
1469 ui.checkShowOnlySelect->setChecked(m_View3d.m_Config.m_ShowOnlySelect);
1472 void FormMain::on_actionGeomClear_triggered()
1478 void FormMain::on_actionUVFitView_triggered()
1484 void FormMain::on_actionSelObjectDelete_triggered()
1486 DeleteSelectedObject();
1489 void FormMain::on_actionSelObjectReload_triggered()
1491 GeomObject* obj = m_Scene.GetPrimaryObject();
1495 if (!obj->IsFileObject())
1497 QMessageBox::information(this, "", "IsNotFileObject");
1501 m_Scene.ReloadObject(obj);
1503 RebuildObjectList();
1508 void FormMain::on_actionSelObjectVisible_triggered()
1510 FlipVisibleSelectedObject();
1513 void FormMain::on_actionSelObjectVertexOnlyMode_triggered()
1515 GeomObject* obj = m_Scene.GetPrimaryObject();
1519 obj->m_VertexOnlyMode = !obj->m_VertexOnlyMode;
1521 ui.actionSelObjectVertexOnlyMode->setChecked(obj->m_VertexOnlyMode);
1526 void FormMain::on_actionSelObjectFlipFace_triggered()
1528 GeomObject* geo = m_Scene.GetPrimaryObject();
1529 MeshBuf* mbuf = m_Scene.GetPrimaryMeshbuf();
1530 if (mbuf == NULL && geo == NULL)
1539 for (MeshBuf& m : geo->m_MeshAry)
1545 ui.GLWidgetMain->makeCurrent();
1546 m_View3d.ReleaseRenderbuffer(mbuf);
1547 ui.GLWidgetMain->doneCurrent();
1552 void FormMain::on_actionSelObjectOpenDir_triggered()
1554 GeomObject* obj = m_Scene.GetPrimaryObject();
1558 if (!obj->IsFileObject())
1561 QString path = QString::fromLocal8Bit(obj->m_FilePath.c_str());
1562 QString p2 = QDir::toNativeSeparators(path);
1563 QGui::ShowExplorerFileSel(p2);
1566 void FormMain::on_actionShowOnlySelected_triggered()
1568 ShowObjectOnlySelected();
1571 void FormMain::on_actionSelObjectTriangulate_triggered()
1573 MeshBuf* mbuf = m_Scene.GetPrimaryMeshbuf();
1577 mbuf->Triangulate();
1579 m_View3d.ReleaseAllRenderBuffer();
1581 RebuildObjectList();
1586 void FormMain::on_actionAddSample_triggered()
1588 SampleShapeBuilder::CreateSphere(m_Scene);
1592 void FormMain::on_actionAddGroundPlane_triggered()
1594 SampleShapeBuilder::CreateGroundPlane(m_Scene);
1598 void FormMain::OnDoneAddGeom(void)
1600 QTreeWidget* obj_tree = ui.treeObjects;
1602 const GeomObject& obj = m_Scene.m_Objects.back();
1604 obj_tree->setCurrentItem(NULL);
1605 obj_tree->blockSignals(true);
1607 QTreeWidgetItem* n = CreateObjectTreeNode(obj);
1608 PushbackTreeNode(obj_tree, n);
1609 n->setExpanded(true);
1611 SetPrimayrSelectObjectFromScene();
1613 obj_tree->blockSignals(false);
1615 if (obj_tree->currentItem() == NULL)
1617 if (!m_Scene.m_Objects.empty())
1619 QTreeWidgetItem * j = obj_tree->topLevelItem(0);
1620 obj_tree->setCurrentItem(j);
1627 ResizeTreeColumns(obj_tree, 4);
1633 void FormMain::on_actionShaderDefault_triggered(bool checked)
1635 ChangeShaderMenuMain(ShaderType::Default);
1638 void FormMain::on_actionShaderPhong_triggered(bool checked)
1640 ChangeShaderMenuMain(ShaderType::Phong);
1643 void FormMain::on_actionShaderCustom_triggered(bool checked)
1645 ChangeShaderMenuMain(ShaderType::Custom);
1648 void FormMain::on_actionNormalColor_triggered(bool checked)
1650 ChangeShaderMenuMain(ShaderType::NormalColor);
1653 void FormMain::on_actionDepthColor_triggered(bool checked)
1655 ChangeShaderMenuMain(ShaderType::DepthColor);
1658 void FormMain::on_actionShadowmap_triggered(bool checked)
1660 ChangeShaderMenuMain(ShaderType::Shadowmap);
1663 void FormMain::on_actionEnvmap_triggered(bool checked)
1665 ChangeShaderMenuMain(ShaderType::Envmap);
1668 void FormMain::on_actionIntegrateShader_triggered(bool checked)
1670 ChangeShaderMenuMain(ShaderType::Integrate);
1673 void FormMain::on_actionMatcapShader_triggered(bool checked)
1675 ChangeShaderMenuMain(ShaderType::Matcap);
1678 void FormMain::SyncShaderSettingsToGUI(void)
1680 ChangeShaderMenuMain(m_View3d.m_Config.m_ShaderMode);
1683 void FormMain::ChangeShaderMenuMain(ShaderType type)
1685 m_View3d.m_Config.m_ShaderMode = type;
1690 void FormMain::on_actionCreate_Check_triggered()
1692 CreateSampleTextureMain(SampleTextureBuilder::TEX_CHECKER);
1695 void FormMain::on_actionCreate_Stripe_V_triggered()
1697 CreateSampleTextureMain(SampleTextureBuilder::TEX_STRIPE_V);
1700 void FormMain::on_actionCreate_Stripe_H_triggered()
1702 CreateSampleTextureMain(SampleTextureBuilder::TEX_STRIPE_H);
1705 void FormMain::CreateSampleTextureMain(SampleTextureBuilder::TextureType tex_type)
1707 m_ContextShare.BeginDrawTop();
1708 m_Scene.CreateSampleTexture(tex_type);
1709 m_ContextShare.EndDrawTop();
1714 bool FormMain::IsAutUVFit(void) const
1716 return ui.actionUVAutoFit->isChecked();
1720 void FormMain::on_pushDeleteSelectedObject_clicked()
1722 DeleteSelectedObject();
1725 void FormMain::on_treeObjects_itemChanged(QTreeWidgetItem * item, int column)
1727 QTreeWidget* obj_tree = ui.treeObjects;
1731 QTreeWidgetItem* t = item->parent();
1732 bool checked = (item->checkState(1) == Qt::Checked);
1735 int sel_idx = obj_tree->indexOfTopLevelItem(item);
1736 GeomObject& obj = m_Scene.m_Objects[sel_idx];
1737 obj.m_Visible = checked;
1741 int sel_idx = obj_tree->indexOfTopLevelItem(t);
1742 int midx = t->indexOfChild(item);
1744 GeomObject& obj = m_Scene.m_Objects[sel_idx];
1745 MeshBuf& mb = obj.m_MeshAry[midx];
1746 mb.m_Visible = checked;
1754 void FormMain::DeleteSelectedObject()
1756 QTreeWidget* obj_tree = ui.treeObjects;
1757 QTreeWidgetItem* ti = obj_tree->currentItem();
1761 QTreeWidgetItem* pn = ti->parent();
1765 sel_idx = obj_tree->indexOfTopLevelItem(ti);
1767 sel_idx = obj_tree->indexOfTopLevelItem(pn);
1772 m_ContextShare.BeginDrawTop();
1774 m_Scene.RemoveItem(sel_idx);
1776 m_ContextShare.EndDrawTop();
1778 m_View3d.ClearRenderMap();
1780 obj_tree->setCurrentItem(NULL);
1781 obj_tree->takeTopLevelItem(sel_idx);
1783 ResizeTreeColumns(obj_tree, 4);
1785 ti = obj_tree->currentItem();
1786 sel_idx = obj_tree->indexOfTopLevelItem(ti);
1787 m_Scene.m_Sels.SelectObject(sel_idx);
1789 m_Scene.UpdateTransform();
1791 RefreshObjectSelectState();
1796 void FormMain::FlipVisibleSelectedObject()
1798 QTreeWidget* obj_tree = ui.treeObjects;
1799 QTreeWidgetItem * item = obj_tree->currentItem();
1803 item->setCheckState(1, FilpState(item->checkState(1)));
1806 Qt::CheckState FormMain::FilpState(Qt::CheckState state) const
1808 if(state == Qt::Checked)
1809 return Qt::Unchecked;
1814 void FormMain::ShowObjectOnlySelected(void)
1816 GeomObject* sel_obj = m_Scene.GetPrimaryObject();
1817 if (sel_obj == NULL)
1820 for (GeomObject& o : m_Scene.m_Objects)
1822 o.m_Visible = (sel_obj == &o);
1825 RebuildObjectList();
1829 void FormMain::ShowAllObject(void)
1831 m_Scene.ShowAllObject();
1833 RebuildObjectList();
1837 void FormMain::HideAllObject(void)
1839 m_Scene.HideAllObject();
1841 RebuildObjectList();
1845 void FormMain::on_actionUVResetView_triggered()
1847 m_View2d.ResetView();
1853 //!
\83\8f\83C
\83\84\81[
\83I
\81[
\83o
\81[
\83\8c\83C
\95\
\8e¦
\8e\9e\82Ì
\90F
\90Ý
\92è
1854 void FormMain::on_actionWireColor_triggered()
1856 m_WireColorSelDlg.exec();
1859 //!
\83f
\83t
\83H
\83\8b\83g
\83}
\83e
\83\8a\83A
\83\8b\82Ì
\90F
\90Ý
\92è
1860 void FormMain::on_actionFaceColor_triggered()
1862 const lib_graph::color4f& c = m_Scene.m_DefaultMaterial.m_Diffuse;
1864 m_DiffuseColorSelDlg.setOption(QColorDialog::ShowAlphaChannel);
1865 m_DiffuseColorSelDlg.setCurrentColor(ToQColor(c));
1866 m_DiffuseColorSelDlg.exec();
1869 //!
\94w
\8ci
\90F
\82Ì
\90Ý
\92è
1870 void FormMain::on_actionBackGroundColor_triggered()
1872 const lib_graph::color4f& c = m_View3d.m_BGColor;
1874 m_BGColorSelDlg.setCurrentColor(ToQColor(c));
1875 m_BGColorSelDlg.exec();
1878 void FormMain::WireOverlayColorChanged(const QColor & color)
1880 lib_graph::color3b& c = m_View3d.m_Config.m_WireColor;
1881 c.set(color.red(), color.green(), color.blue());
1883 m_View3d.ReleaseAllRenderBuffer();
1888 void FormMain::CopyRGB(lib_graph::color4f& c, const QColor & color)
1890 c.r() = (float)color.red() / 255.0f;
1891 c.g() = (float)color.green() / 255.0f;
1892 c.b() = (float)color.blue() / 255.0f;
1895 void FormMain::CopyRGBA(lib_graph::color4f& c, const QColor & color)
1897 c.r() = (float)color.red() / 255.0f;
1898 c.g() = (float)color.green() / 255.0f;
1899 c.b() = (float)color.blue() / 255.0f;
1900 c.a() = (float)color.alpha() / 255.0f;
1903 void FormMain::FaceDiffuseColorChanged(const QColor & color)
1905 lib_graph::color4f& c = m_Scene.m_DefaultMaterial.m_Diffuse;
1908 m_View3d.ReleaseAllRenderBuffer();
1912 void FormMain::BGColorChanged(const QColor & color)
1914 lib_graph::color4f& c = m_View3d.m_BGColor;
1920 void FormMain::SetSelectedMaterialColor(QColor col)
1922 lib_geo::BaseMaterial* mat = m_Scene.GetSelectedMaterial();
1926 if (m_SelMatColorWidget == ui.colorAmbient ) CopyRGBA(mat->m_Ambient , col);
1927 if (m_SelMatColorWidget == ui.colorEmission ) CopyRGBA(mat->m_Emission , col);
1928 if (m_SelMatColorWidget == ui.colorDiffuse ) CopyRGBA(mat->m_Diffuse , col);
1929 if (m_SelMatColorWidget == ui.colorSpecular ) CopyRGBA(mat->m_Specular , col);
1931 SetWidgetColor(m_SelMatColorWidget, col);
1934 void FormMain::SelMatColorChanged(const QColor & color)
1936 SetSelectedMaterialColor(color);
1937 m_View3d.ResetPrimaryObjectLists();
1942 void FormMain::on_actionWindowOptions_triggered()
1944 m_ViewConfigDlg.showNormal();
1945 m_ViewConfigDlg.show();
1946 m_ViewConfigDlg.activateWindow();
1949 void FormMain::on_actionWindowCustomShader_triggered()
1951 if (m_CustomShaderDlg == NULL)
1953 m_CustomShaderDlg = new FormCustomShader(this);
1954 m_CustomShaderDlg->SetShaderLibrary(&m_View3d.m_ShaderLib);
1955 m_CustomShaderDlg->SetParentWidget(ui.GLWidgetMain);
1956 m_CustomShaderDlg->LoadOrSetDefaultCode();
1959 SIGNAL(ShaderBuild()),
1961 SLOT(CustomShaderDlg_ShaderBuild()));
1964 m_CustomShaderDlg->showNormal();
1965 m_CustomShaderDlg->show();
1966 m_CustomShaderDlg->activateWindow();
1970 void FormMain::ConfigChangedDlg_ConfigChanged()
1972 m_View3d.ReleaseAllRenderBuffer();
1976 void FormMain::CrossSectionDlg_ConfigChanged()
1982 void FormMain::OnPaintImage(QPrinter *printer)
1984 QPainter painter(printer);
1986 QRect rect = painter.viewport();
1987 QSize size = this->size();
1988 size.scale(rect.size(), Qt::KeepAspectRatio);//
\8fc
\89¡
\94ä
\88Û
\8e\9d
1990 painter.setViewport(rect.x(), rect.y(), size.width(), size.height());
1991 painter.setWindow(this->rect());
1993 this->render(&painter);
1996 void FormMain::on_actionPrint_triggered()
2001 void FormMain::on_actionPrintPreview_triggered()
2006 void FormMain::PrintImage(bool WithPreview)
2008 //QPrinter printer(QPrinter::ScreenResolution);
2009 QPrinter printer(QPrinter::ScreenResolution);
2013 QPrintPreviewDialog preview(&printer, this);
2014 preview.setWindowFlags( Qt::Window );
2017 SIGNAL(paintRequested(QPrinter *)),
2018 SLOT(OnPaintImage(QPrinter *)));
2020 preview.showMaximized();
2025 QPrintDialog printDialog(&printer, this);
2026 if(printDialog.exec() == QDialog::Accepted)
2027 OnPaintImage(&printer);
2032 void FormMain::on_pushButtonAddCameraRecord_clicked()
2034 m_View3d.RecordCamera();
2036 ui.listCamera->addItem( QString::number(ui.listCamera->count()) );
2041 void FormMain::on_pushButtonDeleteCameraRecord_clicked()
2043 int idx = ui.listCamera->currentRow();
2047 m_View3d.RemoveRecordedCamera(idx);
2049 for (int i = idx+1; i < ui.listCamera->count(); ++i)
2051 ui.listCamera->item(i)->setText(QString::number(i - 1));
2054 ui.listCamera->takeItem(idx);
2059 void FormMain::on_pushCameraRecordClear_clicked()
2061 m_View3d.ClearRecordedCamera();
2063 ui.listCamera->clear();
2068 void FormMain::on_listCamera_itemDoubleClicked(QListWidgetItem *item)
2070 int idx = ui.listCamera->currentRow();
2074 m_View3d.MoveToRecordedCamera(idx, ui.checkCameraAnimation->isChecked());
2077 void FormMain::on_actionSaveCamera_triggered()
2079 QString title = "camera";
2080 QString filter = "Camera File(*.camera)";
2081 QString fileName = GetFilePathFromSaveDlg(title, filter);
2082 if (fileName.isEmpty())
2085 m_View3d.m_CameraRecord.SaveCamera(fileName.toLocal8Bit().data());
2088 void FormMain::on_actionProjectionOrtho_triggered()
2090 ui.actionProjectionOrtho->setChecked(true);
2091 ui.actionProjectionPers->setChecked(false);
2093 m_View3d.m_Camera.m_ProjMode = gl::Camera::PROJ_ORTHO;
2098 void FormMain::on_actionProjectionPers_triggered()
2100 ui.actionProjectionPers->setChecked(true);
2101 ui.actionProjectionOrtho->setChecked(false);
2103 m_View3d.m_Camera.m_ProjMode = gl::Camera::PROJ_PERS;
2109 void FormMain::CustomShaderDlg_ShaderBuild()
2114 void FormMain::OnRotateTimerUpdated()
2116 static const float rot_speed = 0.005f;
2118 if (ui.actionRotateCamera->isChecked())
2120 m_View3d.m_Camera.m_Manip.Tumble(rot_speed, 0.0f);
2121 UpdateCameraStatus();
2124 if (ui.actionRotateLight->isChecked())
2125 m_View3d.m_ControlLight.m_Position.rotate_y(rot_speed);
2130 void FormMain::on_actionRotateCamera_toggled(bool checked)
2132 ToggleLightCamera();
2135 void FormMain::on_actionRotateLight_toggled(bool checked)
2137 ToggleLightCamera();
2140 void FormMain::ToggleLightCamera(void)
2142 bool camera_rotate = ui.actionRotateCamera->isChecked();
2143 bool light_rotate = ui.actionRotateLight->isChecked();
2145 if (camera_rotate || light_rotate)
2146 m_RotationTimer.start();
2148 m_RotationTimer.stop();
2151 void FormMain::on_actionCrossSectionDlg_triggered()
2153 m_CrossSectionDlg.showNormal();
2154 m_CrossSectionDlg.show();
2155 m_CrossSectionDlg.activateWindow();
2158 void FormMain::on_actionSelectNext_triggered()
2160 AddSelectObjectIdx(1);
2163 void FormMain::on_actionSelectPrev_triggered()
2165 AddSelectObjectIdx(-1);
2168 void FormMain::AddSelectObjectIdx(int step)
2170 QTreeWidget* obj_tree = ui.treeObjects;
2172 int num_obj = obj_tree->topLevelItemCount();
2176 QTreeWidgetItem * i = obj_tree->currentItem();
2177 int idx = obj_tree->indexOfTopLevelItem(i);
2182 else if (idx >= num_obj)
2185 QTreeWidgetItem * j = obj_tree->topLevelItem(idx);
2186 obj_tree->setCurrentItem(j);
2189 void FormMain::on_actionSwitchVisible_triggered()
2191 FlipVisibleSelectedObject();
2194 void FormMain::on_actionActionSelObjectShowOnlyOnce_triggered()
2196 ShowObjectOnlySelected();
2199 void FormMain::on_actionHideAll_triggered()
2204 void FormMain::on_actionShowAll_triggered()
2209 void FormMain::on_actionVertexBuilder_triggered()
2211 FormVertexBuilder builder;
2212 builder.CreateVertex(m_Scene);
2214 RebuildObjectList();
2218 void FormMain::on_actionFullScreen_triggered()
2220 m_FullscreenPanel.ShowWidgetAsFullscreen(ui.splitter, ui.gridLayout_4);
2223 void FormMain::on_actionResetConfig_triggered()
2225 QString msg = QString::fromLocal8Bit("
\90Ý
\92è
\82ð
\83\8a\83Z
\83b
\83g
\82µ
\82Ü
\82·");
2226 if (QMessageBox::question(this, "", msg, QMessageBox::Ok|QMessageBox::Cancel) != QMessageBox::Ok)
2229 setGeometry(m_InitRect);
2231 LoadDefaultConfig();
2233 SyncViewSettingsFromGUI();
2234 SyncUVViewSettingsFromGUI();
2235 ApplyGeomStateFromGUI();
2236 SyncShaderSettingsToGUI();
2239 QString FormMain::GetFilePathFromOpenDlg(const QString& title, const QString& filter)
2241 QString default_path = GetNextDefaultPathForFileDlg();
2242 QString s = QFileDialog::getOpenFileName(this, title, default_path, filter);
2245 m_LastFileDialogDir = QFileInfo(s).absolutePath();
2250 QString FormMain::GetFilePathFromSaveDlg(const QString& title, const QString& filter)
2252 QString default_path = GetNextDefaultPathForFileDlg();
2253 QString s = QFileDialog::getSaveFileName(this, title, default_path, filter);
2256 m_LastFileDialogDir = QFileInfo(s).absolutePath();
2261 bool FormMain::IsSupportedTextureExt(const QString& path) const
2263 QString ext = QFileInfo(path).suffix().toLower();
2265 std::map<QString, bool> types;
2266 types[ "png" ] = true;
2267 types[ "jpg" ] = true;
2268 types[ "jepg" ] = true;
2269 types[ "bmp" ] = true;
2270 types[ "tif" ] = true;
2271 types[ "tiff" ] = true;
2276 QString FormMain::GetSupportedImageFilePathFromDlg(const QString& title)
2278 FileDlgFilterList exts;
2279 exts.Add( "Png" , "png" );
2280 exts.Add( "Jpg" , "jpg" );
2281 exts.Add( "Jpg" , "jpeg" );
2282 exts.Add( "Bmp" , "bmp" );
2283 exts.Add( "Tif" , "tif" );
2284 exts.Add( "Tif" , "tiff" );
2286 QString filter = FileDlgUtil::ExtListToDlgFilter("Image", exts);
2287 return GetFilePathFromOpenDlg(title, filter);
2291 QString FormMain::GetNextDefaultPathForFileDlg(void)
2293 if (m_LastFileDialogDir.isEmpty())
2294 return PathInfo::GetMyDocDirPath();
2296 return m_LastFileDialogDir;
2300 void FormMain::on_toolLoadEnvMap_clicked()
2302 QString fileName = GetSupportedImageFilePathFromDlg("Open envmap");
2303 if (fileName.isEmpty())
2306 LoadEnvMap(fileName);
2309 void FormMain::LoadEnvMap(QString& path)
2311 m_ContextShare.BeginDrawTop();
2312 m_Scene.m_EnvImg.LoadTexture(path.toLocal8Bit().data());
2313 m_ContextShare.EndDrawTop();
2315 QString title = QFileInfo(path).fileName();
2316 ui.editEnvMap->setText(title);
2321 void FormMain::on_buttonReleaseEnvImg_clicked()
2323 m_ContextShare.BeginDrawTop();
2324 m_Scene.m_EnvImg.ClearEnv();
2325 m_ContextShare.EndDrawTop();
2327 ui.editEnvMap->clear();
2332 void FormMain::on_buttonPresetEnvMap_clicked()
2334 if (m_EnvmapDlg == NULL)
2336 m_EnvmapDlg = new EnvmapSelectDlg(this);
2339 SIGNAL(ListSelectChanged()),
2341 SLOT(EnvmapDlg_ListSelectChanged()));
2344 m_EnvmapDlg->show();
2347 void FormMain::EnvmapDlg_ListSelectChanged()
2349 QString p = m_EnvmapDlg->GetSelectedItemPath();
2356 void FormMain::on_toolLoadMatcap_clicked()
2358 QString fileName = GetSupportedImageFilePathFromDlg("Open matcap");
2359 if (fileName.isEmpty())
2362 LoadMatcapImage(fileName);
2365 void FormMain::on_buttonReleaseMatcap_clicked()
2367 m_ContextShare.BeginDrawTop();
2368 m_Scene.m_MatcapImg.ClearEnv();
2369 m_ContextShare.EndDrawTop();
2371 ui.editMatcap->clear();
2376 void FormMain::on_buttonLoadMatcapPreset_clicked()
2378 if (m_MatcapDlg == NULL)
2380 m_MatcapDlg = new MatcapSelectDlg(this);
2383 SIGNAL(ListSelectChanged()),
2385 SLOT(MatcapDlg_ListSelectChanged()));
2388 m_MatcapDlg->show();
2391 void FormMain::MatcapDlg_ListSelectChanged()
2393 QString p = m_MatcapDlg->GetSelectedItemPath();
2400 void FormMain::on_sliderEnvReflection_valueChanged(int value)
2402 float r = GetSliderNormalizedPos(ui.sliderEnvReflection);
2403 m_Scene.m_EnvImg.m_EnvReflection = r;
2409 void FormMain::on_comboCoordinate_currentIndexChanged(int index)
2411 SceneTransform& transform = m_Scene.m_WorldTransform;
2413 int idx = ui.comboCoordinate->currentIndex();
2416 case 0: transform.SetCoordType(geom::SceneTransform::COORD_RUF); break;
2417 case 1: transform.SetCoordType(geom::SceneTransform::COORD_FRU); break;
2418 case 2: transform.SetCoordType(geom::SceneTransform::COORD_UFR); break;
2419 case 3: transform.SetCoordType(geom::SceneTransform::COORD_RUB); break;
2420 case 4: transform.SetCoordType(geom::SceneTransform::COORD_BRU); break;
2421 case 5: transform.SetCoordType(geom::SceneTransform::COORD_UBR); break;
2429 void FormMain::on_sliderShadowDarkness_valueChanged(int value)
2431 int b = ui.sliderShadowDarkness->minimum();
2432 int t = ui.sliderShadowDarkness->maximum();
2434 float r = (float)(value - b) / (float)(t - b);
2435 m_Scene.m_ShadowConfig.m_ShadowDarkness = r;
2440 void FormMain::on_buttonClearAllGeoms_clicked()
2445 //!
\83J
\83\81\83\89\88Ê
\92u
\95\9c\8c³
\8b@
\94\
\8eg
\97p
\8e\9e\82Ì
\83A
\83j
\83\81\81[
\83V
\83\87\83\93\97L
\96³
2446 void FormMain::on_checkCameraAnimation_toggled(bool checked)
2451 void FormMain::on_actionOpenAppdir_triggered()
2453 PathInfo::OpenAppDir();
2456 void FormMain::on_actionOpenConfigDir_triggered()
2458 PathInfo::OpenConfigDir();
2461 void FormMain::on_buttonDecGridAxis_clicked()
2463 m_View3d.m_GridAxisScale /= 10.0f;
2467 void FormMain::on_buttonIncGridAxis_clicked()
2469 m_View3d.m_GridAxisScale *= 10.0f;
2473 void FormMain::on_buttonResetGridAxis_clicked()
2475 m_View3d.m_GridAxisScale = 1.0f;
2480 void FormMain::View3D_SelectedObjectChanged(int sel_obj, int sel_mesh)
2482 QTreeWidgetItem* on = ui.treeObjects->topLevelItem(sel_obj);
2486 ui.treeObjects->setCurrentItem(on);
2490 QTreeWidgetItem* mn = on->child(sel_mesh);
2491 ui.treeObjects->setCurrentItem(mn);
2495 void FormMain::View3D_SelectedMatChanged(int sel_idx)
2497 ui.listMaterial->setCurrentRow(sel_idx);
2500 void FormMain::View3D_CameraMoved(void)
2502 UpdateCameraStatus();
2505 void FormMain::View3D_StatusTipChanged(QString msg)
2507 //ui.statusBar->showMessage(msg, 1500);
2510 void FormMain::UpdateCameraStatus(void)
2512 const Camera& camera = m_View3d.m_Camera;
2513 const lib_gl::CameraManipulator& manip = camera.m_Manip;
2514 const lm::vec3f& vp = manip.m_ViewPos;
2517 manip.GetViewAngles(a, b);
2518 a = a * 180.0f / M_PI;
2519 b = b * 180.0f / M_PI;
2523 msg += QString::number(vp.x, 'f', 2) + " ";
2524 msg += QString::number(vp.y, 'f', 2) + " ";
2525 msg += QString::number(vp.z, 'f', 2);
2529 msg += QString::number(a, 'f', 2) + " ";
2530 msg += QString::number(b, 'f', 2);
2534 msg += QString::number(camera.m_Projection.m_Near, 'f', 2) + " ";
2535 msg += QString::number(camera.m_Projection.m_Far, 'f', 2);
2538 m_StatusBar1->setText(msg);
2541 void FormMain::on_actionCameraFPSMode_toggled(bool arg1)
2543 m_View3d.m_FpsMode = arg1;
2547 void FormMain::actionCursorMenuStates_Toggled(bool)
2549 m_Binder_Cursor.UpdateAllData();
2553 void FormMain::on_actionResetCursor_triggered()
2555 m_Scene.m_Cursor3d.ResetCursorPos();
2556 m_Scene.m_Cursor3d.UpdateNormal(m_View3d.m_Camera.m_Manip.GetFront());
2560 void FormMain::on_actionResetMeasure_triggered()
2562 m_View3d.ResetCursorMeasure();
2567 void FormMain::on_actionPyScript_triggered()
2569 if (m_PyScriptDlg == NULL)
2571 m_PyScriptDlg = new FormPyScript(this);
2572 m_PyScriptDlg->m_Scene = &m_Scene;
2573 m_PyScriptDlg->m_View3d = &m_View3d;
2574 m_PyScriptDlg->m_View2d = &m_View2d;
2577 m_PyScriptDlg->showNormal();
2578 m_PyScriptDlg->show();
2579 m_PyScriptDlg->activateWindow();
2582 void FormMain::on_actionConsole_triggered()
2585 freopen( "CON", "r", stdin );
2586 freopen( "CON", "w", stdout );
2590 void FormMain::on_actionClearVertSelect_triggered()
2592 m_Scene.ClearAllVertSelect();
2597 void FormMain::on_action_About_triggered()
2603 void FormMain::on_action_Association_triggered()
2605 m_AssociationDlg.exec();
2608 void FormMain::on_actionLookDepth_triggered()
2610 m_View3d.LookDepth();
2613 void FormMain::on_actionLook3DCursor_triggered()
2615 m_View3d.Look3DCursor();
2618 void FormMain::on_sliderLightPower_valueChanged(int value)
2620 float val = (float)ui.sliderLightPower->value();
2621 float val_max = (float)ui.sliderLightPower->maximum();
2622 float n = 2.0f * val / val_max;
2624 m_View3d.SetLightStrengthByStdRatio(n);
2626 ui.labelLightPower->setText(QString("LightPower ") + QString::number(n, 'f', 2));
2631 void FormMain::on_buttonResetLightPower_clicked()
2633 ui.sliderLightPower->setValue(1000);
2636 void FormMain::on_checkHoleAroundCursor_clicked(bool checked)
2639 ui.checkShowOnlyAroundCursor->setChecked(false);
2642 m_Scene.m_Cursor3d.CircleClip = Cursor3DCircleClip::Hole;
2644 m_Scene.m_Cursor3d.CircleClip = Cursor3DCircleClip::None;
2649 void FormMain::on_checkShowOnlyAroundCursor_toggled(bool checked)
2652 ui.checkHoleAroundCursor->setChecked(false);
2655 m_Scene.m_Cursor3d.CircleClip = Cursor3DCircleClip::ShowAround;
2657 m_Scene.m_Cursor3d.CircleClip = Cursor3DCircleClip::None;
2662 void FormMain::on_sliderCursorHoleRange_valueChanged(int value)
2664 float val = (float)ui.sliderCursorHoleRange->value();
2665 float maxval = (float)ui.sliderCursorHoleRange->maximum();
2666 float n = val / maxval;
2668 m_Scene.m_Cursor3d.HoleRangeRatio = n;
2672 void FormMain::on_buttonResetCursorHoleRange_clicked()
2677 void FormMain::ResetHoleRange(void)
2679 ui.sliderCursorHoleRange->setValue(500);
2682 void FormMain::on_actionSaveImageToMydoc_triggered()
2684 QString path = PathInfo::GetMyDocDirPath();
2685 QString basename = path + "/" + "qgv_snap_";
2687 QDateTime dt = QDateTime::currentDateTime();
2692 QString tp = dt.toString("yyyyMMdd_hhmmss_zzz");
2693 dst = basename + tp + ".png";
2694 if (!QFile(dst).exists())
2698 ui.GLWidgetMain->grabFrameBuffer().save(dst);
2701 void FormMain::on_actionPostProcNone_triggered()
2703 ChangePostprocMode(PostProcType::None);
2706 void FormMain::on_actionPostProcAntialias_triggered()
2708 ChangePostprocMode(PostProcType::Antialias);
2711 void FormMain::on_actionPostProcBorder_triggered()
2713 ChangePostprocMode(PostProcType::Border);
2716 void FormMain::on_actionPostProcDepthLayerColor_triggered()
2718 ChangePostprocMode(PostProcType::DepthLayerColor);
2721 void FormMain::on_actionPostProcDepthColor_triggered()
2723 ChangePostprocMode(PostProcType::DepthColor);
2726 void FormMain::on_actionPostProcDepthOfField_triggered()
2728 ChangePostprocMode(PostProcType::DepthOfField);
2731 void FormMain::ChangePostprocMode(PostProcType type)
2733 m_View3d.m_Config.m_PPMode = type;
2737 void FormMain::on_sliderDOFPint_valueChanged(int value)
2739 float n = GetSliderNormalizedPos(ui.sliderDOFPint);
2740 m_View3d.m_PPContext.m_DOFPintPos = n;
2745 void FormMain::on_sliderDOFRange_valueChanged(int value)
2747 float n = GetSliderNormalizedPos(ui.sliderDOFRange);
2748 m_View3d.m_PPContext.m_DOFRange = 10.0f * n;
2753 float FormMain::GetSliderNormalizedPos(const QSlider* slider) const
2755 float t = (float)slider->maximum();
2756 float b = (float)slider->minimum();
2757 float v = (float)slider->value();
2759 return (v - b) / (t - b);
2762 void FormMain::on_buttonResetDOFPint_clicked()
2764 ui.sliderDOFPint->setValue(1000);
2767 void FormMain::on_buttonResetDOFRange_clicked()
2769 ui.sliderDOFRange->setValue(1000);
2772 void FormMain::on_actionAddCrossSectionRecord_triggered()
2774 m_Scene.AddCrossSectionRecord();
2778 void FormMain::on_actionClearCrossSectionRecord_triggered()
2780 m_Scene.ClearCrossSectionRecord();
2784 void FormMain::LoadCurSelMatTexture(TextureType type)
2786 QString path = GetSupportedImageFilePathFromDlg("Load Texture");
2790 LoadCurSelMatTexture(type, path);
2793 void FormMain::LoadCurSelMatTexture(TextureType type, QString filepath)
2795 GeomTextureSet* ts = m_Scene.GetSelectedTexture();
2799 MeshBuf* mbuf = ts->GetParent();
2800 std::string fp = filepath.toLocal8Bit().data();
2802 QString name_qs = QFileInfo(filepath).fileName();
2803 std::string name = name_qs.toLocal8Bit().data();
2805 m_ContextShare.BeginDrawTop();
2807 mbuf->ReleaseTextureUnit(ts, type);
2808 gl::GlTexture* tex = mbuf->GetInitTexture(fp, name, m_Scene.m_TexConfig);
2809 ts->SetTextureUnit(type, tex);
2811 if (type == TextureType::Normal)
2812 m_View3d.ReleaseAllRenderBuffer();
2814 m_ContextShare.EndDrawTop();
2816 OnChangedSelectedMaterial();
2820 void FormMain::ReleaseCurSelTexture(TextureType type)
2822 MeshBuf* mbuf = m_Scene.GetPrimaryMeshbuf();
2826 int mat_idx = m_Scene.m_Sels.GetSelMat();
2828 m_ContextShare.BeginDrawTop();
2829 mbuf->ReleaseTextureUnit(mat_idx, type);
2830 m_ContextShare.EndDrawTop();
2832 OnChangedSelectedMaterial();
2836 void FormMain::LoadMatcapImageForCurrentMat(QString& path)
2838 GeomTextureSet* ts = m_Scene.GetSelectedTexture();
2840 QString title = QFileInfo(path).fileName();
2842 m_ContextShare.BeginDrawTop();
2843 ts->TexMatcap.LoadTexture(path.toLocal8Bit().data());
2844 ts->TexMatcap.SetName(title);
2845 m_ContextShare.EndDrawTop();
2847 OnChangedSelectedMaterial();
2851 void FormMain::LoadMatcapImage(QString& path)
2853 MatcapImage& mc = m_Scene.m_MatcapImg;
2855 QString title = QFileInfo(path).fileName();
2857 ui.editMatcap->setText(mc.GetName());
2859 m_ContextShare.BeginDrawTop();
2860 mc.LoadTexture(path.toLocal8Bit().data());
2862 m_ContextShare.EndDrawTop();
2867 void FormMain::on_buttonOpenMatCapEachMaterial_clicked()
2869 QString path = GetSupportedImageFilePathFromDlg("Load Texture");
2873 LoadMatcapImage(path);
2876 void FormMain::on_buttonClearMatCapEachMaterial_clicked()
2878 geom::GeomTextureSet* tex = m_Scene.GetSelectedTexture();
2882 m_ContextShare.BeginDrawTop();
2883 tex->TexMatcap.ClearEnv();
2884 m_ContextShare.EndDrawTop();
2886 ui.editMatCapEachMaterial->clear();
2891 void FormMain::on_buttonOpenCurrentMatColorMap_clicked()
2893 LoadCurSelMatTexture(TextureType::Color);
2896 void FormMain::on_buttonClearCurrentMatColorMap_clicked()
2898 ReleaseCurSelTexture(TextureType::Color);
2901 void FormMain::on_buttonOpenCurrentMatNormalMap_clicked()
2903 LoadCurSelMatTexture(TextureType::Normal);
2906 void FormMain::on_buttonClearCurrentMatNormalMap_clicked()
2908 ReleaseCurSelTexture(TextureType::Normal);
2911 void FormMain::ChangeMatlemColor(QWidget* col_widget)
2913 lib_geo::BaseMaterial* mat = m_Scene.GetSelectedMaterial();
2917 lib_graph::color4f* col;
2919 if (col_widget == ui.colorAmbient ) col = &mat->m_Ambient ;
2920 if (col_widget == ui.colorEmission ) col = &mat->m_Emission ;
2921 if (col_widget == ui.colorDiffuse ) col = &mat->m_Diffuse ;
2922 if (col_widget == ui.colorSpecular ) col = &mat->m_Specular ;
2924 lib_graph::color4f src = *col;
2926 QColor dc = ToQColor(*col);
2928 m_SelMatColorWidget = col_widget;
2930 m_SelMatColorSelDlg.setOption(QColorDialog::ShowAlphaChannel);
2931 m_SelMatColorSelDlg.setCurrentColor(dc);
2932 if (m_SelMatColorSelDlg.exec() == QDialog::Rejected)
2935 SetWidgetColor(col_widget, dc);
2939 void FormMain::on_buttonDiffuse_clicked()
2941 ChangeMatlemColor(ui.colorDiffuse);
2944 void FormMain::on_buttonAmbient_clicked()
2946 ChangeMatlemColor(ui.colorAmbient);
2949 void FormMain::on_buttonEmission_clicked()
2951 ChangeMatlemColor(ui.colorEmission);
2954 void FormMain::on_buttonSpecular_clicked()
2956 ChangeMatlemColor(ui.colorSpecular);
2959 void FormMain::SetWidgetColor(QWidget* w, QColor col)
2961 QString ss = QString("background-color: %1").arg(col.name());
2962 w->setStyleSheet(ss);
2965 void FormMain::on_sliderShininess_valueChanged(int value)
2967 lib_geo::BaseMaterial* mat = m_Scene.GetSelectedMaterial();
2971 float val = (float)ui.sliderShininess->value();
2972 float val_max = (float)ui.sliderShininess->maximum();
2974 float real_val = 200.0f * val / val_max;
2976 mat->m_Shininess = real_val;
2978 ui.labelShininessVal->setText(QString::number(real_val, 'f', 2));
2983 void FormMain::CreateRecentFilesMenu(const std::vector<QString>& path)
2985 QMenu* recents = ui.menuOpenRecent;
2986 recents->actions().clear();
2988 for (size_t i = 0; i < path.size(); ++i)
2990 AddRecentFile(path[path.size() - i - 1]);
2994 void FormMain::CreateRecentFilesFromMenu(std::vector<QString>& path)
2996 QMenu* recents = ui.menuOpenRecent;
2997 for (int i = 0; i < recents->actions().size(); ++i)
2999 QAction* a = recents->actions().at(i);
3000 path.push_back(a->text());
3004 void FormMain::AddRecentFile(const QString& path)
3006 QString path_local = QDir::toNativeSeparators(path);
3008 static const int max_files = 10;
3010 QMenu* recents = ui.menuOpenRecent;
3012 for (int i = 0; i < recents->actions().size(); ++i)
3014 QAction* a = recents->actions().at(i);
3015 if (a->text() == path_local)
3017 recents->removeAction(a);
3022 QAction* new_path = new QAction(path_local, this);
3025 SIGNAL(triggered()),
3027 SLOT(OnOpenRecent()));
3029 if (recents->actions().empty())
3030 recents->addAction(new_path);
3032 recents->insertAction(recents->actions().front(), new_path);
3034 if (recents->actions().size() > max_files)
3036 QAction* a = recents->actions().back();
3037 recents->removeAction(a);
3041 void FormMain::OnOpenRecent()
3043 QAction* a = dynamic_cast<QAction*>(QObject::sender());
3048 QString path = a->text();
3050 if (IsResetSceneOnBeforeLoadFile())
3053 if (OpenGeomFile(path))
3057 void FormMain::on_checkShowOnlySelect_toggled(bool checked)
3059 m_View3d.m_Config.m_ShowOnlySelect = checked;
3063 void FormMain::ResizeTreeColumns(QTreeWidget* t, int num_col)
3065 t->setVisible(false);
3066 t->resizeColumnToContents(0);
3067 t->resizeColumnToContents(1);
3068 t->resizeColumnToContents(2);
3069 t->resizeColumnToContents(3);
3070 t->setVisible(true);
3073 void FormMain::PushbackTreeNode(QTreeWidget* tree, QTreeWidgetItem *node)
3075 int next_idx = tree->topLevelItemCount();
3076 tree->insertTopLevelItem(next_idx, node);
3079 QTreeWidgetItem* FormMain::CreateObjectTreeNode(const geom::GeomObject& obj) const
3081 QTreeWidgetItem* n = new QTreeWidgetItem;
3083 n->setText(0, QString::fromLocal8Bit(obj.m_Name.c_str()));
3084 n->setCheckState(1, obj.m_Visible ? Qt::Checked : Qt::Unchecked);
3085 n->setText(2, QString::number(obj.GetNumTotalVerts()));
3086 n->setText(3, QString::number(obj.GetNumTotalFaces()));
3089 for (const MeshBuf& mbuf : obj.m_MeshAry)
3091 n->addChild(CreateMeshBufNode(obj, mbuf, idx++));
3094 n->setExpanded(true);
3099 QTreeWidgetItem* FormMain::CreateMeshBufNode(const geom::GeomObject& obj, const MeshBuf& mbuf, int idx) const
3101 QTreeWidgetItem* n = new QTreeWidgetItem;
3104 if (mbuf.m_Name.empty())
3105 name = QString::fromLocal8Bit(obj.m_Name.c_str()) + QString::number(idx);
3107 name = QString::fromLocal8Bit(mbuf.m_Name.c_str());
3109 n->setText(0, name);
3110 n->setCheckState(1, mbuf.m_Visible ? Qt::Checked : Qt::Unchecked);
3111 n->setText(2, QString::number(mbuf.GetNumVerts()));
3112 n->setText(3, QString::number(mbuf.GetNumFaces()));
3117 void FormMain::InitObjectListHeader(void)
3120 qs << "Name" << "Visible" << "Verts" << "Faces";
3121 ui.treeObjects->setHeaderLabels(qs);
3124 void FormMain::SetPrimayrSelectObjectFromScene(void)
3126 QTreeWidget* obj_tree = ui.treeObjects;
3128 Selection3D& sels = m_Scene.m_Sels;
3129 if (!sels.IsObjectSelected())
3132 int sel_idx = sels.GetSelObjectIdx();
3134 QTreeWidgetItem* on = obj_tree->topLevelItem(sel_idx);
3138 if (sels.IsMBufSelected())
3140 QTreeWidgetItem* mn = on->child(sels.GetMBufIdx());
3141 obj_tree->setCurrentItem(mn);
3145 obj_tree->setCurrentItem(on);
3149 void FormMain::SetPrimayrSelectObjectToScene(void)
3151 Selection3D& sels = m_Scene.m_Sels;
3153 QTreeWidget* tree = ui.treeObjects;
3155 QTreeWidgetItem* sel_node = tree->currentItem();
3156 if (sel_node == NULL)
3159 QTreeWidgetItem* on = sel_node->parent();
3162 int obj_idx = tree->indexOfTopLevelItem(sel_node);
3163 sels.SelectObject(obj_idx);
3167 int obj_idx = tree->indexOfTopLevelItem(on);
3168 int mb_idx = on->indexOfChild(sel_node);
3169 sels.SelectMBuf(obj_idx, mb_idx);
3173 void FormMain::on_actionReleaseShader_triggered()
3175 m_ContextShare.BeginDrawTop();
3177 m_View3d.m_ShaderLib.ReleaseAllShaders();
3179 m_ContextShare.EndDrawTop();
3182 void FormMain::on_combo2DViewSrcType_currentIndexChanged(int index)
3186 case 0 : return m_View2d.ChangeTextureSource(View2DTexSrc::Color);
3187 case 1 : return m_View2d.ChangeTextureSource(View2DTexSrc::Normal);