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"
37 QColor ToQColor(const lib_graph::color4f& c)
39 int r = lm::clamp(0, (int)(c.r() * 255.0f), 255);
40 int g = lm::clamp(0, (int)(c.g() * 255.0f), 255);
41 int b = lm::clamp(0, (int)(c.b() * 255.0f), 255);
42 int a = lm::clamp(0, (int)(c.a() * 255.0f), 255);
44 return QColor(r, g, b, a);
49 FormMain::FormMain(QWidget *parent)
53 , m_CustomShaderDlg(NULL)
58 m_EnableAllFeatures = false;
59 m_LastFocusedDockDlg = NULL;
63 setWindowTitle("QtGeoViewer");
66 InitializeStatusBar();
68 InitializeCoordinateCombobox();
69 Initialize2DViewSrcCombobox();
70 InitializeEventFilter();
75 SyncViewSettingsFromGUI();
76 SyncUVViewSettingsFromGUI();
77 SyncSceneSettingsFromGUI();
78 ApplyGeomStateFromGUI();
79 SyncShaderSettingsToGUI();
81 ui.toolBar_View->setVisible( ui.actionWindow_ToolBarView->isChecked() );
83 UpdateViewTypeFromMenu();
91 InitializeAnimation();
93 InitializeFromConfigFiles();
102 m_InitRect.translate(pos());
109 FormMain::~FormMain()
114 void FormMain::LoadLastWinPos(void)
116 QString file = PathInfo::GetPosConfigFilePath();
117 QSettings conf(file, QSettings::IniFormat);
120 v = conf.value("main/WindowPos");
123 QRect r = v.toRect();
131 move(QPoint(dl, dt));
134 v = conf.value("main/WinState");
138 setWindowState(Qt::WindowMaximized);
142 void FormMain::SaveWinPos(void)
144 QString file = PathInfo::GetPosConfigFilePath();
145 QSettings conf(file, QSettings::IniFormat);
147 conf.setValue("main/WinState", isMaximized());
149 if (isMaximized() || isMinimized())
151 setWindowState(Qt::WindowNoState);
152 QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
158 conf.setValue("main/WindowPos", r);
161 void FormMain::HideFeatures(void)
163 bool b = m_EnableAllFeatures;
165 ui.actionVertexBuilder->setVisible(b);
166 ui.menuPrintRoot->menuAction()->setVisible(b);
167 ui.actionShadowmap->setVisible(b);
168 ui.actionEnvmap->setVisible(b);
169 ui.actionShaderCustom->setVisible(b);
170 ui.actionWindowCustomShader->setVisible(b);
171 ui.actionPyScript->setVisible(b);
172 ui.actionConsole->setVisible(b);
173 ui.actionReleaseShader->setVisible(b);
176 void FormMain::InitializeEventFilter(void)
178 ui.editEnvMap->installEventFilter(this);
179 ui.editMatcap->installEventFilter(this);
181 ui.editCurrentTexName->installEventFilter(this);
182 ui.editCurrentMatNormalMap->installEventFilter(this);
183 ui.editMatCapEachMaterial->installEventFilter(this);
186 void FormMain::InitDataBinding(void)
188 InitializeVisiblStateMenu();
189 InitializeUVStateMenu();
190 InitializeSceneStateMenu();
191 InitializeGeomStateMenu();
192 InitializeCursorMenu();
195 void FormMain::InitializeVisiblStateMenu(void)
197 DataBinderMap& dbmap = m_Binder_ViewConfig;
199 View3DConfig& cfg_3d = m_View3d.m_Config;
201 dbmap.AddBinder(new MenuBinder(ui.actionDrawBBox , &cfg_3d.m_DrawBBox ));
202 dbmap.AddBinder(new MenuBinder(ui.actionFaceVBO , &cfg_3d.m_EnableFaceVBO ));
203 dbmap.AddBinder(new MenuBinder(ui.actionVidTopMost , &cfg_3d.m_ShowVidTopMost ));
204 dbmap.AddBinder(new MenuBinder(ui.actionDrawBBoxRange , &cfg_3d.m_DrawBBoxRange ));
205 dbmap.AddBinder(new MenuBinder(ui.actionWireDispList , &cfg_3d.m_EnableWireDispList ));
206 dbmap.AddBinder(new MenuBinder(ui.actionMultisample , &cfg_3d.m_EnableMultisample ));
207 dbmap.AddBinder(new MenuBinder(ui.actionCoverageTransparent , &cfg_3d.m_EnableCoverageTrans ));
208 dbmap.AddBinder(new MenuBinder(ui.actionSeparateSpecular , &cfg_3d.m_SeparateSpecular ));
209 dbmap.AddBinder(new MenuBinder(ui.actionShowSelVertCoord , &cfg_3d.m_ShowSelVertCoord ));
210 dbmap.AddBinder(new MenuBinder(ui.actionHighlightSelected , &cfg_3d.m_HighlightSelected ));
211 dbmap.AddBinder(new MenuBinder(ui.actionFixMaterialSilver , &cfg_3d.m_UseFixMaterial ));
212 dbmap.AddBinder(new MenuBinder(ui.actionShadowmapBuffer , &cfg_3d.m_DrawShadowmapBuf ));
213 dbmap.AddBinder(new MenuBinder(ui.actionEnableTexture3D , &cfg_3d.m_EnableTexture ));
214 dbmap.AddBinder(new MenuBinder(ui.actionEnableLighting , &cfg_3d.m_EnableLighting ));
215 dbmap.AddBinder(new MenuBinder(ui.actionEnableCulling , &cfg_3d.m_EnableCullFace ));
216 dbmap.AddBinder(new MenuBinder(ui.actionDrawWire , &cfg_3d.m_DrawWire ));
217 dbmap.AddBinder(new MenuBinder(ui.actionDrawVid , &cfg_3d.m_DrawVid ));
218 dbmap.AddBinder(new MenuBinder(ui.actionDrawVertNormal , &cfg_3d.m_DrawVertNormal ));
219 dbmap.AddBinder(new MenuBinder(ui.actionDrawVert , &cfg_3d.m_DrawVert ));
220 dbmap.AddBinder(new MenuBinder(ui.actionWireVBO , &cfg_3d.m_EnableWireVBO ));
221 dbmap.AddBinder(new MenuBinder(ui.actionIndexColorMode , &cfg_3d.m_IndexMaterial ));
222 dbmap.AddBinder(new MenuBinder(ui.actionFBMaterial , &cfg_3d.m_FBMaterial ));
223 dbmap.AddBinder(new MenuBinder(ui.actionDrawMiniAxis , &cfg_3d.m_DrawMiniAxis ));
224 dbmap.AddBinder(new MenuBinder(ui.actionDrawLookPos , &cfg_3d.m_DrawLookPos ));
225 dbmap.AddBinder(new MenuBinder(ui.actionDrawLightPos , &cfg_3d.m_DrawLightPosition ));
226 dbmap.AddBinder(new MenuBinder(ui.actionDrawGround , &cfg_3d.m_DrawGround ));
227 dbmap.AddBinder(new MenuBinder(ui.actionDrawFid , &cfg_3d.m_DrawFid ));
228 dbmap.AddBinder(new MenuBinder(ui.actionDrawFace , &cfg_3d.m_DrawFace ));
229 dbmap.AddBinder(new MenuBinder(ui.actionCameraRecords , &cfg_3d.m_DrawCameraRecord ));
230 dbmap.AddBinder(new MenuBinder(ui.actionDrawAxis , &cfg_3d.m_DrawAxis ));
231 dbmap.AddBinder(new MenuBinder(ui.actionDoubleSideShading , &cfg_3d.m_DoubleSideShading ));
232 dbmap.AddBinder(new MenuBinder(ui.actionDirectionalLight , &cfg_3d.m_LightIsDirectional ));
233 dbmap.AddBinder(new MenuBinder(ui.actionCullFrontOrBack , &cfg_3d.m_CullAngle_F ));
234 dbmap.AddBinder(new MenuBinder(ui.actionHighlightMaterial , &cfg_3d.m_HighlightMaterial ));
235 dbmap.AddBinder(new MenuBinder(ui.actionCloseVert , &cfg_3d.m_ShowCloseVertInfo ));
236 dbmap.AddBinder(new MenuBinder(ui.actionCameraRange , &cfg_3d.m_DrawRenderRange ));
237 dbmap.AddBinder(new MenuBinder(ui.actionRenderTime , &cfg_3d.m_ShowRenderTime ));
238 dbmap.AddBinder(new MenuBinder(ui.actionUseFixTexture , &cfg_3d.m_UseFixTexture ));
239 dbmap.AddBinder(new MenuBinder(ui.actionShowSelVertIdx , &cfg_3d.m_ShowSelVertIdx ));
240 dbmap.AddBinder(new MenuBinder(ui.actionShowMeshBound , &cfg_3d.m_ShowMeshBound ));
241 dbmap.AddBinder(new MenuBinder(ui.actionPickTransparent , &cfg_3d.m_PickTransparent ));
242 dbmap.AddBinder(new MenuBinder(ui.actionFlatShading , &cfg_3d.m_EnableFlatShade ));
243 dbmap.AddBinder(new MenuBinder(ui.actionDrawPolylineLenWhl , &cfg_3d.m_DrawPolylineLenWhl ));
244 dbmap.AddBinder(new MenuBinder(ui.actionDrawPolylineLen , &cfg_3d.m_DrawPolylineLen ));
245 dbmap.AddBinder(new MenuBinder(ui.actionDrawPolylineIdx , &cfg_3d.m_DrawPolylineIdx ));
246 dbmap.AddBinder(new MenuBinder(ui.actionDrawPolyline , &cfg_3d.m_DrawPolyline ));
247 dbmap.AddBinder(new MenuBinder(ui.actionDrawBone , &cfg_3d.m_DrawBone ));
248 dbmap.AddBinder(new MenuBinder(ui.actionShowMeasure , &cfg_3d.m_DrawCameraMeasure ));
249 dbmap.AddBinder(new MenuBinder(ui.actionFlipMouseMR , &cfg_3d.m_FlipMouseMR ));
250 dbmap.AddBinder(new MenuBinder(ui.actionSyncLightToCamera , &cfg_3d.m_SyncLightTocamera ));
252 for (GuiBinder& binder : dbmap.m_BinderMap)
254 MenuBinder* mb = dynamic_cast<MenuBinder*>(&binder);
257 QAction* a = mb->GetMenu();
260 SIGNAL(triggered(bool)),
262 SLOT(actionVisibleStates_Triggered(bool)));
267 void FormMain::InitializeUVStateMenu(void)
269 DataBinderMap& dbmap = m_Binder_UVConfig;
271 dbmap.AddBinder(new MenuBinder(ui.actionUVRepeat , &m_View2d.m_RepeatTexture ));
272 dbmap.AddBinder(new MenuBinder(ui.actionUseFixTexture2D , &m_View2d.m_UseFixTexute ));
273 dbmap.AddBinder(new MenuBinder(ui.actionShowVertex2d , &m_View2d.m_DrawVerts ));
274 dbmap.AddBinder(new MenuBinder(ui.actionShowImage2d , &m_View2d.m_EnableTexture ));
275 dbmap.AddBinder(new MenuBinder(ui.actionTextureMipmap , &m_Scene.m_TexConfig.m_EnableMipmap ));
276 dbmap.AddBinder(new MenuBinder(ui.actionTextureCompress , &m_Scene.m_TexConfig.m_EnableCompress ));
277 dbmap.AddBinder(new MenuBinder(ui.actionUVFlipY , &m_Scene.m_TextureTransform.m_FlipY ));
279 for (GuiBinder& binder : dbmap.m_BinderMap)
281 MenuBinder* mb = dynamic_cast<MenuBinder*>(&binder);
284 QAction* a = mb->GetMenu();
287 SIGNAL(triggered(bool)),
289 SLOT(actionVisibleStatesUV_Triggered(bool)));
294 void FormMain::InitializeSceneStateMenu(void)
296 DataBinderMap& dbmap = m_Binder_Scene;
298 dbmap.AddBinder(new CheckboxBinder( ui.checkEnvMap , &m_Scene.m_EnvImg.m_VisibleEnvSphere ));
299 dbmap.AddBinder(new CheckboxBinder( ui.checkEnvReflection , &m_Scene.m_EnvImg.m_IsEnableReflection ));
300 dbmap.AddBinder(new CheckboxBinder( ui.checkShadowEnabled , &m_Scene.m_ShadowConfig.m_EnableShadow ));
301 dbmap.AddBinder(new CheckboxBinder( ui.checkSoftShadow , &m_Scene.m_ShadowConfig.m_EnableSoftShadow ));
303 for (GuiBinder& binder : dbmap.m_BinderMap)
305 CheckboxBinder* mb = dynamic_cast<CheckboxBinder*>(&binder);
308 QCheckBox* c = mb->GetCheckBox();
311 SIGNAL(toggled(bool)),
313 SLOT(actionSceneStates_Toggled(bool)));
318 void FormMain::InitializeCursorMenu(void)
320 DataBinderMap& dbmap = m_Binder_Cursor;
322 Cursor3D& cursor = m_Scene.m_Cursor3d;
323 dbmap.AddBinder(new MenuBinder( ui.actionShowCursor , &cursor.ShowCursor ));
324 dbmap.AddBinder(new MenuBinder( ui.actionCursorToDepth , &cursor.CursorDepth ));
325 dbmap.AddBinder(new MenuBinder( ui.actionCursorCoord , &cursor.ShowCoord ));
326 dbmap.AddBinder(new MenuBinder( ui.actionCheckBaryCoord , &cursor.CheckBaryCoord ));
327 dbmap.AddBinder(new MenuBinder( ui.actionSelectCloseMat , &cursor.SelCloseVert ));
328 dbmap.AddBinder(new MenuBinder( ui.actionCursorAxis , &cursor.ShowAxis ));
329 dbmap.AddBinder(new MenuBinder( ui.actionMeasure , &cursor.ShowMeasure ));
330 dbmap.AddBinder(new MenuBinder( ui.actionMeasureLen , &cursor.ShowMeasureLen ));
331 dbmap.AddBinder(new MenuBinder( ui.actionMeasureXYZ , &cursor.ShowMeasureXYZ ));
332 dbmap.AddBinder(new MenuBinder( ui.actionRecordStroke , &cursor.RecordStroke ));
333 dbmap.AddBinder(new MenuBinder( ui.actionShowStrokeLength , &cursor.ShowStrokeLen ));
335 for (GuiBinder& binder : dbmap.m_BinderMap)
337 MenuBinder* mb = dynamic_cast<MenuBinder*>(&binder);
340 QAction* a = mb->GetMenu();
343 SIGNAL(triggered(bool)),
345 SLOT(actionCursorMenuStates_Toggled(bool)));
351 void FormMain::InitializeGeomStateMenu(void)
353 AddGeomStateAction( ui.actionCentering );
354 AddGeomStateAction( ui.actionAutoResize );
357 void FormMain::AddGeomStateAction(const QAction* action)
361 SIGNAL(triggered(bool)),
363 SLOT(actionGeomStates_Triggered(bool)));
367 void FormMain::InitializeGLView(void)
369 ui.GLWidgetMain->setMouseTracking(true);
370 ui.GLWidgetUV->setMouseTracking(true);
372 ui.GLWidgetMain->SetViewer(&m_View3d);
373 m_View3d.m_Widgets = &m_Widgets;
374 m_View3d.RegisterScene(&m_Scene);
375 m_View3d.InitializeView(ui.GLWidgetMain);
377 ui.GLWidgetUV->SetViewer(&m_View2d);
378 m_View2d.m_Widgets = &m_Widgets;
379 m_View2d.RegisterScene(&m_Scene);
380 m_View2d.InitializeView(ui.GLWidgetUV);
382 m_Widgets.AddWidget(ui.GLWidgetMain);
383 m_Widgets.AddWidget(ui.GLWidgetUV);
385 // OpenGL
\82Ì
\83\8a\83X
\83g
\82Ì
\8b¤
\97L
\89»
388 m_ContextShare.BeginDrawTop();
390 m_Scene.Initialize();
392 m_ContextShare.EndDrawTop();
396 SIGNAL(SelectedObjectChanged(int, int)),
397 SLOT(View3D_SelectedObjectChanged(int, int)));
400 SIGNAL(SelectedMatChanged(int)),
401 SLOT(View3D_SelectedMatChanged(int)));
404 SIGNAL(CameraMoved(void)),
405 SLOT(View3D_CameraMoved(void)));
408 SIGNAL(StatusTipChanged(QString)),
409 SLOT(View3D_StatusTipChanged(QString)));
412 SIGNAL(SequenceStepped(int)),
413 SLOT(View3D_SequenceStepped(int)));
416 SIGNAL(CursorMoved()),
417 SLOT(View3D_CursorMoved()));
420 // OpenGL
\82Ì
\83\8a\83X
\83g
\82Ì
\8b¤
\97L
\89»
421 void FormMain::SetContextShare(void)
423 ui.GLWidgetUV->makeCurrent();
424 m_ContextShare.AddContext( GetDC((HWND)ui.GLWidgetUV->winId()) , wglGetCurrentContext() );
425 ui.GLWidgetUV->doneCurrent();
427 ui.GLWidgetMain->makeCurrent();
428 m_ContextShare.AddContext( GetDC((HWND)ui.GLWidgetUV->winId()) , wglGetCurrentContext() );
429 ui.GLWidgetMain->doneCurrent();
431 m_ContextShare.MakeShare();
434 void FormMain::InitializeCoordinateCombobox(void)
436 ui.comboCoordinate->blockSignals(true);
437 ui.comboCoordinate->addItem("Yup RH"); // RUF
438 ui.comboCoordinate->addItem("Zup RH"); // FRU
439 ui.comboCoordinate->addItem("Xup RH"); // UFR
440 ui.comboCoordinate->addItem("Yup LH"); // RUB
441 ui.comboCoordinate->addItem("Zup LH"); // BRU
442 ui.comboCoordinate->addItem("Xup LH"); // UBR
443 ui.comboCoordinate->blockSignals(false);
446 void FormMain::Initialize2DViewSrcCombobox(void)
448 ui.combo2DViewSrcType->blockSignals(true);
449 ui.combo2DViewSrcType->addItem("Color");
450 ui.combo2DViewSrcType->addItem("Normal");
451 ui.combo2DViewSrcType->blockSignals(false);
454 void FormMain::InitializeStatusBar(void)
456 m_StatusBar0 = new QLabel(this);
457 m_StatusBar1 = new QLabel(this);
458 ui.statusBar->addWidget(m_StatusBar0, 1);
459 ui.statusBar->addWidget(m_StatusBar1, 0);
461 m_StatusBar0->setText("");
463 m_StatusBar1->setMinimumWidth(290);
464 m_StatusBar1->setText("");
467 void FormMain::InitializeFromConfigFiles(void)
469 if (!InitializeConfig(PathInfo::GetGuiConfigFilePath()))
471 InitializeConfig(PathInfo::GetDefaultGuiConfigFilePath());
474 OpenCameraFile(PathInfo::GetCameraLogFilePath());
476 LoadWindowLayout(PathInfo::GetWindowLayoutConfigFilePath());
478 if (!QGui::LoadGUIState(this, PathInfo::GetLayoutConfigFilePath()))
480 QGui::LoadGUIState(this, PathInfo::GetDefaultLayoutConfigFilePath());
484 void FormMain::LoadDefaultConfig(void)
486 InitializeConfig(PathInfo::GetDefaultGuiConfigFilePath());
487 QGui::LoadGUIState(this, PathInfo::GetDefaultLayoutConfigFilePath());
490 void FormMain::SaveConfig(void)
492 PathInfo::CreateConfiDirIfNotExist();
494 SaveConfigFile(PathInfo::GetGuiConfigFilePath());
496 m_View3d.m_CameraRecord.SaveCamera(PathInfo::GetCameraLogFilePath().toLocal8Bit().data());
498 QGui::SaveGUIState(this, PathInfo::GetLayoutConfigFilePath());
500 SaveWindowLayout(PathInfo::GetWindowLayoutConfigFilePath());
503 bool FormMain::InitializeConfig(QString path)
505 View3DConfig& config_3d = m_View3d.m_Config;
508 cfg.m_Config3D = &config_3d;
509 cfg.m_Scene = &m_Scene;
511 if (!cfg.LoadConfigT(path.toLocal8Bit().data()))
514 ui.actionUVAutoFit->setChecked(cfg.m_AutFitUVView);
516 ui.comboCoordinate->setCurrentIndex(cfg.m_CoordType);
518 CreateRecentFilesMenu(cfg.m_RecentFiles);
520 m_Binder_ViewConfig.UpdateAllGUI(true);
521 m_Binder_UVConfig.UpdateAllGUI(true);
522 m_Binder_Scene.UpdateAllGUI(true);
523 m_Binder_Cursor.UpdateAllGUI(true);
525 ApplyGeomStateDataoToGUI();
527 SyncViewSettingsFromGUI();
528 SyncUVViewSettingsFromGUI();
529 SyncShaderSettingsToGUI();
531 m_EnableAllFeatures = cfg.m_EnableAllFeatures;
536 void FormMain::SaveConfigFile(QString path)
539 cfg.m_Config3D = &m_View3d.m_Config;
540 cfg.m_Scene = &m_Scene;
542 cfg.m_EnableAllFeatures = m_EnableAllFeatures;
544 cfg.m_AutFitUVView = ui.actionUVAutoFit ->isChecked();
546 cfg.m_CoordType = ui.comboCoordinate->currentIndex();
548 CreateRecentFilesFromMenu(cfg.m_RecentFiles);
550 cfg.SaveConfigT(path.toLocal8Bit().data());
554 void FormMain::InitializeSubDlg(void)
558 SIGNAL(currentColorChanged(const QColor &)),
560 SLOT(WireOverlayColorChanged(const QColor &)));
562 &m_DiffuseColorSelDlg,
563 SIGNAL(currentColorChanged(const QColor &)),
565 SLOT(FaceDiffuseColorChanged(const QColor &)));
568 SIGNAL(currentColorChanged(const QColor &)),
570 SLOT(BGColorChanged(const QColor &)));
572 &m_SelMatColorSelDlg,
573 SIGNAL(currentColorChanged(const QColor &)),
575 SLOT(SelMatColorChanged(const QColor &)));
577 m_SelMatColorWidget = NULL;
579 m_ViewConfigDlg.InitializeConfigDlg(&m_View3d.m_Config);
582 SIGNAL(ConfigChanged()),
584 SLOT(ConfigChangedDlg_ConfigChanged()));
586 m_CrossSectionDlg.InitializeConfigDlg(&m_View3d);
589 SIGNAL(ConfigChanged()),
591 SLOT(CrossSectionDlg_ConfigChanged()));
594 void FormMain::InitializeAnimation(void)
600 SLOT(OnAnimationTimerUpdated()));
601 m_AnimationTimer.setInterval(20);
604 void FormMain::InitializeMenu(void)
606 m_AGroup_Window = new QActionGroup(this);
607 m_AGroup_Window->setExclusive(true);
608 m_AGroup_Window->addAction( ui.actionWindow_3DView );
609 m_AGroup_Window->addAction( ui.actionWindow_UVView );
610 m_AGroup_Window->addAction( ui.actionWindows_DualView );
612 m_AGroup_Shader = new QActionGroup(this);
613 m_AGroup_Shader->setExclusive(true);
614 m_AGroup_Shader->addAction( ui.actionShaderDefault );
615 m_AGroup_Shader->addAction( ui.actionShaderPhong );
616 m_AGroup_Shader->addAction( ui.actionShaderCustom );
617 m_AGroup_Shader->addAction( ui.actionNormalColor );
618 m_AGroup_Shader->addAction( ui.actionDepthColor );
619 m_AGroup_Shader->addAction( ui.actionShadowmap );
620 m_AGroup_Shader->addAction( ui.actionEnvmap );
621 m_AGroup_Shader->addAction( ui.actionIntegrateShader );
622 m_AGroup_Shader->addAction( ui.actionMatcapShader );
624 m_AGroup_PProc = new QActionGroup(this);
625 m_AGroup_PProc->addAction( ui.actionPostProcNone );
626 m_AGroup_PProc->addAction( ui.actionPostProcAntialias );
627 m_AGroup_PProc->addAction( ui.actionPostProcBorder );
628 m_AGroup_PProc->addAction( ui.actionPostProcDepthLayerColor );
629 m_AGroup_PProc->addAction( ui.actionPostProcDepthColor );
630 m_AGroup_PProc->addAction( ui.actionPostProcDepthOfField );
633 void FormMain::InitContextMenu(void)
635 QList<QAction*> actions;
637 << ui.actionSelObjectVisible
638 << ui.actionSelObjectVertexOnlyMode
639 << ui.actionSelObjectDelete
640 << ui.actionSelObjectReload
641 << ui.actionSelObjectFlipFace
642 << ui.actionSelObjectFlipNormal
643 << ui.actionSelObjectOpenDir
644 << ui.actionActionSelObjectShowOnlyOnce
645 << ui.actionSelObjectTriangulate
646 << ui.actionTreeCollapseAll
647 << ui.actionTreeExpandAll;
649 QTreeWidget* obj_tree = ui.treeObjects;
651 obj_tree->setContextMenuPolicy(Qt::ActionsContextMenu);
652 obj_tree->addActions(actions);
655 void FormMain::ProcArguments(void)
657 QStringList args = QApplication::arguments();
658 for (int i = 1; i < args.size(); ++i)
665 void FormMain::closeEvent(QCloseEvent *e)
673 m_ViewConfigDlg.close();
674 m_CrossSectionDlg.close();
675 m_FullscreenPanel.close();
677 if (m_CustomShaderDlg != NULL)
678 m_CustomShaderDlg->close();
679 if (m_PyScriptDlg != NULL)
680 m_PyScriptDlg->close();
682 if (m_MatcapDlg != NULL)
683 m_MatcapDlg->close();
684 if (m_EnvmapDlg != NULL)
685 m_EnvmapDlg->close();
687 m_ContextShare.BeginDrawTop();
688 m_Scene.FinalizeScene();
689 m_ContextShare.EndDrawTop();
693 bool FormMain::eventFilter(QObject * filterobj, QEvent * filterevt)
695 if (filterobj == ui.editEnvMap)
697 if (filterevt->type() == QEvent::DragEnter)
698 return AcceptDropFilterIfUrl(filterevt);
700 if (filterevt->type() == QEvent::Drop)
701 return OnDropFile_editEnvMap(filterevt);
703 else if (filterobj == ui.editMatcap)
705 if (filterevt->type() == QEvent::DragEnter)
706 return AcceptDropFilterIfUrl(filterevt);
708 if (filterevt->type() == QEvent::Drop)
709 return OnDropFile_editMatcap(filterevt);
711 else if (filterobj == ui.editMatCapEachMaterial)
713 if (filterevt->type() == QEvent::DragEnter)
714 return AcceptDropFilterIfUrl(filterevt);
716 if (filterevt->type() == QEvent::Drop)
717 return OnDropFile_editMatcapEachMat(filterevt);
719 else if (filterobj == ui.editCurrentTexName)
721 if (filterevt->type() == QEvent::DragEnter)
722 return AcceptDropFilterIfUrl(filterevt);
724 if (filterevt->type() == QEvent::Drop)
725 return OnDropFile_editCurrentTexName(filterevt);
727 else if (filterobj == ui.editCurrentMatNormalMap)
729 if (filterevt->type() == QEvent::DragEnter)
730 return AcceptDropFilterIfUrl(filterevt);
732 if (filterevt->type() == QEvent::Drop)
733 return OnDropFile_editCurrentMatNormalMap(filterevt);
736 return QMainWindow::eventFilter(filterobj, filterevt);
739 bool FormMain::OnDropFile_editEnvMap(QEvent * filterevt)
741 QString path = GetFirstLoadableImagePathFromDragEvent(filterevt);
748 bool FormMain::OnDropFile_editMatcap(QEvent * filterevt)
750 QString path = GetFirstLoadableImagePathFromDragEvent(filterevt);
752 LoadMatcapImage(path);
757 bool FormMain::OnDropFile_editMatcapEachMat(QEvent * filterevt)
759 QString path = GetFirstLoadableImagePathFromDragEvent(filterevt);
761 LoadMatcapImageForCurrentMat(path);
766 bool FormMain::OnDropFile_editCurrentTexName(QEvent * filterevt)
768 QString path = GetFirstLoadableImagePathFromDragEvent(filterevt);
770 LoadCurSelMatTexture(TextureType::Color, path);
775 bool FormMain::OnDropFile_editCurrentMatNormalMap(QEvent * filterevt)
777 QString path = GetFirstLoadableImagePathFromDragEvent(filterevt);
779 LoadCurSelMatTexture(TextureType::Normal, path);
784 bool FormMain::AcceptDropFilterIfUrl(QEvent * filterevt)
786 QDragEnterEvent* e = dynamic_cast<QDragEnterEvent*>(filterevt);
790 if (e->mimeData()->hasUrls())
791 e->acceptProposedAction();
796 QString FormMain::GetFirstLoadableImagePathFromDragEvent(QEvent* filterevt)
798 QDropEvent* e = dynamic_cast<QDropEvent*>(filterevt);
802 if (!e->mimeData()->hasUrls())
805 QList<QUrl> urls = e->mimeData()->urls();
806 for (int i = 0; i < urls.size(); ++i)
808 QString path = urls[i].toLocalFile();
809 if (IsSupportedTextureExt(path))
817 void FormMain::CenteringSplitter(void)
819 int w = ui.splitter->width();
823 ui.splitter->setSizes(s);
826 void FormMain::updateView_All(void)
832 void FormMain::updateView_2D(void)
834 ui.GLWidgetUV->update();
837 void FormMain::updateView_3D(void)
839 ui.GLWidgetMain->update();
842 void FormMain::on_actionOpen_triggered()
844 FileDlgFilterList exts;
845 exts.Add( "Wavefront" , "obj" );
846 exts.Add( "STL" , "stl" );
847 exts.Add( "PLY" , "ply" );
848 exts.Add( "Metasequoia" , "mqo" );
849 exts.Add( "Pmd" , "pmd" );
850 exts.Add( "Collada" , "dae" );
851 exts.Add( "DirectX" , "x" );
853 QString filter = FileDlgUtil::ExtListToDlgFilter("Geometry", exts);
854 QString title = "Open file";
855 QString fileName = GetFilePathFromOpenDlg(title, filter);
857 if (fileName.isEmpty())
860 if (IsResetSceneOnBeforeLoadFile())
863 if (OpenGeomFile(fileName))
867 void FormMain::on_actionExit_triggered()
872 void FormMain::actionVisibleStates_Triggered(bool checked)
874 QAction* a = dynamic_cast<QAction*>(QObject::sender());
877 if (a == ui.actionIndexColorMode)
879 ui.actionFixMaterialSilver->setChecked(false);
880 ui.actionFBMaterial->setChecked(false);
882 else if (a == ui.actionFixMaterialSilver)
884 ui.actionIndexColorMode->setChecked(false);
885 ui.actionFBMaterial->setChecked(false);
887 else if (a == ui.actionFBMaterial)
889 ui.actionFixMaterialSilver->setChecked(false);
890 ui.actionIndexColorMode->setChecked(false);
894 SyncViewSettingsFromGUI();
898 void FormMain::SyncViewSettingsFromGUI(void)
900 m_Binder_ViewConfig.UpdateAllData();
902 QAction* menu = GetMenuFromShader(m_View3d.m_Config.m_ShaderMode);
904 menu->setChecked(true);
907 QAction* FormMain::GetMenuFromShader(ShaderType type)
909 switch(m_View3d.m_Config.m_ShaderMode)
911 case ShaderType::Phong : return ui.actionShaderPhong;
912 case ShaderType::Custom : return ui.actionShaderCustom;
913 case ShaderType::NormalColor: return ui.actionNormalColor;
914 case ShaderType::DepthColor : return ui.actionDepthColor;
915 case ShaderType::Shadowmap : return ui.actionShadowmap;
916 case ShaderType::Envmap : return ui.actionEnvmap;
917 case ShaderType::Integrate : return ui.actionIntegrateShader;
918 case ShaderType::Matcap : return ui.actionMatcapShader;
919 case ShaderType::Default : return ui.actionShaderDefault;
927 bool FormMain::SaveWindowLayout(const QString& filepath)
931 config.m_MainWinLeft = geometry().x();
932 config.m_MainWinTop = geometry().y();
933 config.m_MainWinWidth = geometry().width();
934 config.m_MainWinHeight = geometry().height();
935 config.m_IsMaximized = isMaximized();
937 return config.SaveConfig(filepath.toLocal8Bit().data());
940 bool FormMain::LoadWindowLayout(const QString& filepath)
943 if (!config.LoadConfig(filepath.toLocal8Bit().data()))
946 if (config.m_IsMaximized)
949 int l = config.m_MainWinLeft;
950 int t = config.m_MainWinTop;
951 int w = config.m_MainWinWidth;
952 int h = config.m_MainWinHeight;
953 setGeometry(l, t, w, h);
958 void FormMain::actionVisibleStatesUV_Triggered(bool)
960 SyncUVViewSettingsFromGUI();
963 void FormMain::SyncUVViewSettingsFromGUI(void)
965 m_Binder_UVConfig.UpdateAllData();
969 void FormMain::actionSceneStates_Toggled(bool)
971 SyncSceneSettingsFromGUI();
974 void FormMain::SyncSceneSettingsFromGUI(void)
976 m_Binder_Scene.UpdateAllData();
980 void FormMain::on_actionWindow_ToolBarView_triggered(bool checked)
982 ui.toolBar_View->setVisible( ui.actionWindow_ToolBarView->isChecked() );
985 void FormMain::on_actionToolBar_Options_toggled(bool checked)
987 ui.toolBar_Option->setVisible(checked);
990 void FormMain::on_actionToolBar_Operation_toggled(bool checked)
992 ui.toolBar_Operation->setVisible(checked);
995 void FormMain::on_actionCameraDist_triggered()
997 m_View3d.AdjustCameraDistAuto();
1000 void FormMain::on_actionCameraFront_triggered()
1002 m_View3d.MoveCaemraTo(ViewPoint::Front);
1005 void FormMain::on_actionCameraBack_triggered()
1007 m_View3d.MoveCaemraTo(ViewPoint::Back);
1010 void FormMain::on_actionCameraLeft_triggered()
1012 m_View3d.MoveCaemraTo(ViewPoint::Left);
1015 void FormMain::on_actionCameraRight_triggered()
1017 m_View3d.MoveCaemraTo(ViewPoint::Right);
1020 void FormMain::on_actionCameraTop_triggered()
1022 m_View3d.MoveCaemraTo(ViewPoint::Top);
1025 void FormMain::on_actionCameraBottom_triggered()
1027 m_View3d.MoveCaemraTo(ViewPoint::Bottom);
1030 void FormMain::on_actionCameraPers_triggered()
1032 m_View3d.MoveCaemraTo(ViewPoint::Perse);
1035 void FormMain::on_actionCameraLookOrigin_triggered()
1037 m_View3d.MoveLookPosToOrigin();
1040 void FormMain::on_actionCameraLookCenter_triggered()
1042 m_View3d.MoveLookPosToCenter();
1045 void FormMain::on_actionWindow_3DView_triggered(bool checked)
1047 UpdateViewTypeFromMenu();
1050 void FormMain::on_actionWindows_DualView_triggered(bool checked)
1052 UpdateViewTypeFromMenu();
1055 void FormMain::on_actionWindow_UVView_triggered(bool checked)
1057 UpdateViewTypeFromMenu();
1060 void FormMain::UpdateViewTypeFromMenu(void)
1062 if (ui.actionWindows_DualView->isChecked())
1064 ui.frameView3D->setVisible(true);
1065 ui.frameView2D->setVisible(true);
1067 // 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.
1068 static bool firsttime = true;
1072 CenteringSplitter();
1075 if (ui.actionWindow_3DView->isChecked())
1077 ui.frameView3D->setVisible(true);
1078 ui.frameView2D->setVisible(false);
1080 if (ui.actionWindow_UVView->isChecked())
1082 ui.frameView3D->setVisible(false);
1083 ui.frameView2D->setVisible(true);
1087 void FormMain::on_actionWindowMaterialList_triggered()
1089 ShowAndActivateAndRaise(ui.dockMaterial);
1090 ui.listMaterial->setFocus();
1093 void FormMain::on_actionWindowObjectList_triggered()
1095 ShowAndActivateAndRaise(ui.dockObject);
1096 ui.treeObjects->setFocus();
1099 void FormMain::on_actionWindowCameraList_triggered()
1101 ShowAndActivateAndRaise(ui.dockCamera);
1102 ui.listCamera->setFocus();
1105 void FormMain::on_actionWindowScenePanel_triggered()
1107 ShowAndActivateAndRaise(ui.dockScene);
1110 void FormMain::on_actionCursorPanel_triggered()
1112 ShowAndActivateAndRaise(ui.dockCursor);
1115 void FormMain::on_listMaterial_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
1117 m_Scene.m_Sels.SetSelMat(ui.listMaterial->currentRow());
1118 OnChangedSelectedMaterial();
1122 void FormMain::ShowAndActivateAndRaise(QDockWidget* widget)
1124 widget->setVisible(true);
1125 widget->activateWindow();
1129 void FormMain::on_treeObjects_currentItemChanged(QTreeWidgetItem * current, QTreeWidgetItem * previous)
1131 RefreshObjectSelectState();
1134 void FormMain::RefreshObjectSelectState(void)
1136 SetPrimayrSelectObjectToScene();
1138 QListWidget* list_mat = ui.listMaterial;
1141 const MeshBuf* mbuf = m_Scene.GetPrimaryMeshbuf();
1144 const lib_geo::BaseMesh& mesh = mbuf->m_Mesh;
1145 for (const lib_geo::BaseMaterial& mat : mesh.m_Materials)
1147 const std::string& name = mat.m_Name;
1150 list_mat->addItem("--");
1152 list_mat->addItem(QString::fromLocal8Bit(name.c_str()));
1156 const GeomObject* obj = m_Scene.GetPrimaryObject();
1159 ui.actionSelObjectVisible->setChecked(mbuf->IsVisible());
1161 else if (obj != NULL)
1163 ui.actionSelObjectVisible->setChecked(obj->m_Visible);
1167 ui.actionSelObjectVertexOnlyMode->setChecked(obj->m_VertexOnlyMode);
1169 if (list_mat->count() > 0 && list_mat->currentRow() < 0)
1171 list_mat->setCurrentRow(0);
1172 m_Scene.m_Sels.SetSelMat(0);
1173 OnChangedSelectedMaterial();
1179 void FormMain::OnChangedSelectedMaterial(void)
1186 ui.editCurrentTexName->clear();
1188 GeomTextureSet* ts = m_Scene.GetSelectedTexture();
1191 ui.editCurrentTexName->setText("");
1192 ui.editMatCapEachMaterial->setText("");
1196 QString name_c, name_n;
1198 gl::GlTexture* tex_c = ts->GetTexColor();
1200 name_c = QString::fromLocal8Bit(tex_c->GetName().c_str());
1202 gl::GlTexture* tex_n = ts->GetTexNormal();
1204 name_n = QString::fromLocal8Bit(tex_n->GetName().c_str());
1206 ui.editCurrentTexName->setText(name_c);
1207 ui.editCurrentMatNormalMap->setText(name_n);
1209 MatcapImage& matcap = ts->TexMatcap;
1210 ui.editMatCapEachMaterial->setText(matcap.GetName());
1213 lib_geo::BaseMaterial* mat = m_Scene.GetSelectedMaterial();
1216 SetWidgetColor(ui.colorAmbient , ToQColor(mat->m_Ambient));
1217 SetWidgetColor(ui.colorEmission , ToQColor(mat->m_Emission));
1218 SetWidgetColor(ui.colorDiffuse , ToQColor(mat->m_Diffuse));
1219 SetWidgetColor(ui.colorSpecular , ToQColor(mat->m_Specular));
1221 int val_max = ui.sliderShininess->maximum();
1222 int slider_pos = (int)(mat->m_Shininess * (float)val_max / 200.0f);
1223 slider_pos = (lm::min)(val_max, slider_pos);
1224 ui.sliderShininess->blockSignals(true);
1225 ui.sliderShininess->setValue(slider_pos);
1226 ui.sliderShininess->blockSignals(false);
1227 ui.labelShininessVal->setText(QString::number(mat->m_Shininess, 'f', 2));
1233 void FormMain::keyPressEvent(QKeyEvent *e)
1236 if (m.Flag_C() && e->key() == Qt::Key_Tab)
1242 void FormMain::FocusNextSubDlg(void)
1244 std::vector<QDockWidget*> widgets;
1246 if (ui.dockObject ->isVisible()) widgets.push_back( ui.dockObject );
1247 if (ui.dockCamera ->isVisible()) widgets.push_back( ui.dockCamera );
1248 if (ui.dockScene ->isVisible()) widgets.push_back( ui.dockScene );
1249 if (ui.dockMaterial ->isVisible()) widgets.push_back( ui.dockMaterial );
1251 if (widgets.empty())
1254 QDockWidget* next_widget = NULL;
1256 for (size_t i = 0; i < widgets.size(); ++i)
1258 if (widgets[i] == m_LastFocusedDockDlg)
1260 next_widget = widgets[(i + 1) % widgets.size()];
1265 if (next_widget == NULL)
1266 next_widget = widgets.front();
1268 m_LastFocusedDockDlg = next_widget;
1270 next_widget->activateWindow();
1271 next_widget->raise();
1272 next_widget->setFocus();
1275 void FormMain::dragEnterEvent(QDragEnterEvent* e)
1277 if (e->mimeData()->hasUrls())
1278 e->acceptProposedAction();
1281 void FormMain::dropEvent(QDropEvent* e)
1283 if (e->mimeData()->hasUrls())
1285 QList<QUrl> urls = e->mimeData()->urls();
1287 std::vector<QString> geom_files;
1289 for (int i = 0; i < urls.size(); ++i)
1291 QString path = urls[i].toLocalFile();
1292 if (FormatType::IsGeomFileExt(path))
1293 geom_files.push_back(path);
1296 if (!geom_files.empty())
1298 if (IsResetSceneOnBeforeLoadFile())
1301 for (size_t i = 0; i < geom_files.size(); ++i)
1303 if (OpenGeomFile(geom_files[i]))
1308 for (int i = 0; i < urls.size(); ++i)
1310 QString path = urls[i].toLocalFile();
1312 if (IsSupportedTextureExt(path))
1314 OpenFixTextureFile(path);
1318 if (IsCameraFile(path))
1320 OpenCameraFile(path);
1327 bool FormMain::IsResetSceneOnBeforeLoadFile(void) const
1329 if (QApplication::keyboardModifiers() & Qt::ShiftModifier)
1335 //!
\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é.
1336 void FormMain::OpenFixTextureFile(const QString& path)
1338 std::string fname = path.toLocal8Bit().data();
1340 m_ContextShare.BeginDrawTop();
1341 m_Scene.LoadDefaultMatTexture(fname);
1342 m_ContextShare.EndDrawTop();
1347 bool FormMain::OpenGeomFile(const QString& path)
1349 m_Scene.m_ObjSplit = ui.checkSplitOBJ->isChecked();
1351 m_ContextShare.BeginDrawTop();
1356 m_Scene.ImportFileAutoFmt(path);
1358 catch(const FileLoadErrorException& ex)
1361 msg += "Failed Load ";
1362 msg += path + "\n\n";
1363 msg += QString::fromLocal8Bit(ex.what());
1365 QMessageBox::warning(this, "", msg);
1369 m_ContextShare.EndDrawTop();
1371 RebuildObjectList();
1373 ResetSequenceSliderRange();
1380 AddRecentFile(path);
1385 void FormMain::ClearAllObjects(void)
1387 m_ContextShare.BeginDrawTop();
1389 m_Scene.ClearObjects();
1391 m_ContextShare.EndDrawTop();
1393 m_View3d.ClearRenderMap();
1395 RebuildObjectList();
1396 RefreshObjectSelectState();
1401 void FormMain::RebuildObjectList(void)
1403 QTreeWidget* obj_tree = ui.treeObjects;
1405 obj_tree->setCurrentItem(NULL);
1406 obj_tree->blockSignals(true);
1410 obj_tree->setSelectionBehavior(QAbstractItemView::SelectRows);
1411 obj_tree->setSelectionMode(QAbstractItemView::SingleSelection);
1412 obj_tree->setEditTriggers(QAbstractItemView::NoEditTriggers);
1414 obj_tree->setColumnCount(4);
1416 InitObjectListHeader();
1418 for (const geom::GeomObject& obj : m_Scene.m_Objects)
1420 QTreeWidgetItem* n = CreateObjectTreeNode(obj);
1421 PushbackTreeNode(ui.treeObjects, n);
1422 n->setExpanded(true);
1425 SetPrimayrSelectObjectFromScene();
1427 obj_tree->blockSignals(false);
1429 if (obj_tree->currentItem() == NULL)
1431 if (!m_Scene.m_Objects.empty())
1433 QTreeWidgetItem* ti = obj_tree->topLevelItem(0);
1434 obj_tree->setCurrentItem(ti);
1441 ResizeTreeColumns(obj_tree, 4);
1445 bool FormMain::IsCameraFile(const QString& path) const
1447 QFileInfo fInfo( path );
1448 QString ext = fInfo.suffix().toLower();
1449 return (ext == "camera");
1452 bool FormMain::OpenCameraFile(const QString& path)
1454 std::string fname = path.toLocal8Bit().data();
1456 if(!m_View3d.m_CameraRecord.LoadCamera(fname.c_str()))
1459 ui.listCamera->blockSignals(true);
1460 ui.listCamera->clear();
1461 for (size_t i = 0; i < m_View3d.m_CameraRecord.m_Records.size(); ++i)
1463 ui.listCamera->addItem( QString::number(i) );
1465 ui.listCamera->blockSignals(false);
1471 void FormMain::actionGeomStates_Triggered(bool)
1473 ApplyGeomStateFromGUI();
1475 m_Scene.UpdateTransform();
1480 void FormMain::ApplyGeomStateFromGUI(void)
1482 m_Scene.m_Config.m_EnableAutoCentering = ui.actionCentering->isChecked();
1483 m_Scene.m_Config.m_EnableAutoReisze = ui.actionAutoResize->isChecked();
1486 void FormMain::ApplyGeomStateDataoToGUI(void)
1488 ui.actionAutoResize ->setChecked( m_Scene.m_Config.m_EnableAutoReisze );
1489 ui.actionCentering ->setChecked( m_Scene.m_Config.m_EnableAutoCentering );
1491 ui.checkShowOnlySelect->setChecked(m_View3d.m_Config.m_ShowOnlySelect);
1494 void FormMain::on_actionGeomClear_triggered()
1500 void FormMain::on_actionUVFitView_triggered()
1506 void FormMain::on_actionSelObjectDelete_triggered()
1508 DeleteSelectedObject();
1511 void FormMain::on_actionSelObjectReload_triggered()
1513 GeomObject* obj = m_Scene.GetPrimaryObject();
1517 if (!obj->IsFileObject())
1519 QMessageBox::information(this, "", "IsNotFileObject");
1523 m_Scene.ReloadObject(obj);
1525 RebuildObjectList();
1530 void FormMain::on_actionSelObjectVisible_triggered()
1532 FlipVisibleSelectedObject();
1535 void FormMain::on_actionSelObjectVertexOnlyMode_triggered()
1537 GeomObject* obj = m_Scene.GetPrimaryObject();
1541 obj->m_VertexOnlyMode = !obj->m_VertexOnlyMode;
1543 ui.actionSelObjectVertexOnlyMode->setChecked(obj->m_VertexOnlyMode);
1548 void FormMain::on_actionSelObjectFlipFace_triggered()
1550 m_Scene.FlipCurselFace(false);
1552 ui.GLWidgetMain->makeCurrent();
1553 std::vector<MeshBuf*> mv = m_Scene.GetCurSelMeshes();
1554 for (MeshBuf* m : mv)
1556 m_View3d.ReleaseRenderbuffer(m);
1558 ui.GLWidgetMain->doneCurrent();
1563 void FormMain::on_actionSelObjectFlipNormal_triggered()
1565 m_Scene.FlipCurselFace(true);
1567 ui.GLWidgetMain->makeCurrent();
1568 std::vector<MeshBuf*> mv = m_Scene.GetCurSelMeshes();
1569 for (MeshBuf* m : mv)
1571 m_View3d.ReleaseRenderbuffer(m);
1573 ui.GLWidgetMain->doneCurrent();
1578 void FormMain::on_actionSelObjectOpenDir_triggered()
1580 GeomObject* obj = m_Scene.GetPrimaryObject();
1584 if (!obj->IsFileObject())
1587 QString path = QString::fromLocal8Bit(obj->m_FilePath.c_str());
1588 QString p2 = QDir::toNativeSeparators(path);
1589 QGui::ShowExplorerFileSel(p2);
1592 void FormMain::on_actionShowOnlySelected_triggered()
1594 ShowObjectOnlySelected();
1597 void FormMain::on_actionSelObjectTriangulate_triggered()
1599 MeshBuf* mbuf = m_Scene.GetPrimaryMeshbuf();
1603 mbuf->Triangulate();
1605 m_View3d.ReleaseAllRenderBuffer();
1607 RebuildObjectList();
1611 void FormMain::on_actionTreeCollapseAll_triggered()
1613 TreeUtil::SetAllTopExpand(ui.treeObjects, false);
1616 void FormMain::on_actionTreeExpandAll_triggered()
1618 TreeUtil::SetAllTopExpand(ui.treeObjects, true);
1622 void FormMain::on_actionAddSample_triggered()
1624 SampleShapeBuilder::CreateSphere(m_Scene);
1628 void FormMain::on_actionAddGroundPlane_triggered()
1630 SampleShapeBuilder::CreateGroundPlane(m_Scene);
1634 void FormMain::OnDoneAddGeom(void)
1636 QTreeWidget* obj_tree = ui.treeObjects;
1638 const GeomObject& obj = m_Scene.m_Objects.back();
1640 obj_tree->setCurrentItem(NULL);
1641 obj_tree->blockSignals(true);
1643 QTreeWidgetItem* n = CreateObjectTreeNode(obj);
1644 PushbackTreeNode(obj_tree, n);
1645 n->setExpanded(true);
1647 SetPrimayrSelectObjectFromScene();
1649 obj_tree->blockSignals(false);
1651 if (obj_tree->currentItem() == NULL)
1653 if (!m_Scene.m_Objects.empty())
1655 QTreeWidgetItem * j = obj_tree->topLevelItem(0);
1656 obj_tree->setCurrentItem(j);
1663 ResizeTreeColumns(obj_tree, 4);
1665 ResetSequenceSliderRange();
1671 void FormMain::on_actionShaderDefault_triggered(bool)
1673 ChangeShaderMenuMain(ShaderType::Default);
1676 void FormMain::on_actionShaderPhong_triggered(bool)
1678 ChangeShaderMenuMain(ShaderType::Phong);
1681 void FormMain::on_actionShaderCustom_triggered(bool)
1683 ChangeShaderMenuMain(ShaderType::Custom);
1686 void FormMain::on_actionNormalColor_triggered(bool)
1688 ChangeShaderMenuMain(ShaderType::NormalColor);
1691 void FormMain::on_actionDepthColor_triggered(bool)
1693 ChangeShaderMenuMain(ShaderType::DepthColor);
1696 void FormMain::on_actionShadowmap_triggered(bool)
1698 ChangeShaderMenuMain(ShaderType::Shadowmap);
1701 void FormMain::on_actionEnvmap_triggered(bool)
1703 ChangeShaderMenuMain(ShaderType::Envmap);
1706 void FormMain::on_actionIntegrateShader_triggered(bool)
1708 ChangeShaderMenuMain(ShaderType::Integrate);
1711 void FormMain::on_actionMatcapShader_triggered(bool)
1713 ChangeShaderMenuMain(ShaderType::Matcap);
1716 void FormMain::SyncShaderSettingsToGUI(void)
1718 ChangeShaderMenuMain(m_View3d.m_Config.m_ShaderMode);
1721 void FormMain::ChangeShaderMenuMain(ShaderType type)
1723 m_View3d.m_Config.m_ShaderMode = type;
1728 void FormMain::on_actionCreate_Check_triggered()
1730 CreateSampleTextureMain(SampleTextureBuilder::TEX_CHECKER);
1733 void FormMain::on_actionCreate_Stripe_V_triggered()
1735 CreateSampleTextureMain(SampleTextureBuilder::TEX_STRIPE_V);
1738 void FormMain::on_actionCreate_Stripe_H_triggered()
1740 CreateSampleTextureMain(SampleTextureBuilder::TEX_STRIPE_H);
1743 void FormMain::CreateSampleTextureMain(SampleTextureBuilder::TextureType tex_type)
1745 m_ContextShare.BeginDrawTop();
1746 m_Scene.CreateSampleTexture(tex_type);
1747 m_ContextShare.EndDrawTop();
1752 bool FormMain::IsAutUVFit(void) const
1754 return ui.actionUVAutoFit->isChecked();
1758 void FormMain::on_pushDeleteSelectedObject_clicked()
1760 DeleteSelectedObject();
1763 void FormMain::on_treeObjects_itemChanged(QTreeWidgetItem * item, int column)
1765 QTreeWidget* obj_tree = ui.treeObjects;
1769 QTreeWidgetItem* t = item->parent();
1770 bool checked = (item->checkState(1) == Qt::Checked);
1773 int sel_idx = obj_tree->indexOfTopLevelItem(item);
1774 GeomObject& obj = m_Scene.m_Objects[sel_idx];
1775 obj.m_Visible = checked;
1779 int sel_idx = obj_tree->indexOfTopLevelItem(t);
1780 int midx = t->indexOfChild(item);
1782 GeomObject& obj = m_Scene.m_Objects[sel_idx];
1783 MeshBuf& mb = obj.m_MeshAry[midx];
1784 mb.m_Visible = checked;
1792 void FormMain::DeleteSelectedObject()
1794 QTreeWidget* obj_tree = ui.treeObjects;
1795 QTreeWidgetItem* ti = obj_tree->currentItem();
1799 QTreeWidgetItem* pn = ti->parent();
1803 sel_idx = obj_tree->indexOfTopLevelItem(ti);
1805 sel_idx = obj_tree->indexOfTopLevelItem(pn);
1810 m_ContextShare.BeginDrawTop();
1812 m_Scene.RemoveItem(sel_idx);
1814 m_ContextShare.EndDrawTop();
1816 m_View3d.ClearRenderMap();
1818 obj_tree->setCurrentItem(NULL);
1819 obj_tree->takeTopLevelItem(sel_idx);
1821 ResizeTreeColumns(obj_tree, 4);
1823 ti = obj_tree->currentItem();
1824 sel_idx = obj_tree->indexOfTopLevelItem(ti);
1825 m_Scene.m_Sels.SelectObject(sel_idx);
1827 m_Scene.UpdateTransform();
1829 RefreshObjectSelectState();
1831 ResetSequenceSliderRange();
1836 void FormMain::FlipVisibleSelectedObject()
1838 QTreeWidget* obj_tree = ui.treeObjects;
1839 QTreeWidgetItem * item = obj_tree->currentItem();
1843 item->setCheckState(1, FilpState(item->checkState(1)));
1846 Qt::CheckState FormMain::FilpState(Qt::CheckState state) const
1848 if(state == Qt::Checked)
1849 return Qt::Unchecked;
1854 void FormMain::ShowObjectOnlySelected(void)
1856 GeomObject* sel_obj = m_Scene.GetPrimaryObject();
1857 if (sel_obj == NULL)
1860 for (GeomObject& o : m_Scene.m_Objects)
1862 o.m_Visible = (sel_obj == &o);
1865 RebuildObjectList();
1869 void FormMain::ShowAllObject(void)
1871 m_Scene.ShowAllObject();
1873 RebuildObjectList();
1877 void FormMain::HideAllObject(void)
1879 m_Scene.HideAllObject();
1881 RebuildObjectList();
1885 void FormMain::on_actionUVResetView_triggered()
1887 m_View2d.ResetView();
1893 //!
\83\8f\83C
\83\84\81[
\83I
\81[
\83o
\81[
\83\8c\83C
\95\
\8e¦
\8e\9e\82Ì
\90F
\90Ý
\92è
1894 void FormMain::on_actionWireColor_triggered()
1896 m_WireColorSelDlg.exec();
1899 //!
\83f
\83t
\83H
\83\8b\83g
\83}
\83e
\83\8a\83A
\83\8b\82Ì
\90F
\90Ý
\92è
1900 void FormMain::on_actionFaceColor_triggered()
1902 const lib_graph::color4f& c = m_Scene.m_DefaultMaterial.m_Diffuse;
1904 m_DiffuseColorSelDlg.setOption(QColorDialog::ShowAlphaChannel);
1905 m_DiffuseColorSelDlg.setCurrentColor(ToQColor(c));
1906 m_DiffuseColorSelDlg.exec();
1909 //!
\94w
\8ci
\90F
\82Ì
\90Ý
\92è
1910 void FormMain::on_actionBackGroundColor_triggered()
1912 const lib_graph::color4f& c = m_View3d.m_BGColor;
1914 m_BGColorSelDlg.setCurrentColor(ToQColor(c));
1915 m_BGColorSelDlg.exec();
1918 void FormMain::WireOverlayColorChanged(const QColor & color)
1920 lib_graph::color3b& c = m_View3d.m_Config.m_WireColor;
1921 c.set(color.red(), color.green(), color.blue());
1923 m_View3d.ReleaseAllRenderBuffer();
1928 void FormMain::CopyRGB(lib_graph::color4f& c, const QColor & color)
1930 c.r() = (float)color.red() / 255.0f;
1931 c.g() = (float)color.green() / 255.0f;
1932 c.b() = (float)color.blue() / 255.0f;
1935 void FormMain::CopyRGBA(lib_graph::color4f& c, const QColor & color)
1937 c.r() = (float)color.red() / 255.0f;
1938 c.g() = (float)color.green() / 255.0f;
1939 c.b() = (float)color.blue() / 255.0f;
1940 c.a() = (float)color.alpha() / 255.0f;
1943 void FormMain::FaceDiffuseColorChanged(const QColor & color)
1945 lib_graph::color4f& c = m_Scene.m_DefaultMaterial.m_Diffuse;
1948 m_View3d.ReleaseAllRenderBuffer();
1952 void FormMain::BGColorChanged(const QColor & color)
1954 lib_graph::color4f& c = m_View3d.m_BGColor;
1960 void FormMain::SetSelectedMaterialColor(QColor col)
1962 lib_geo::BaseMaterial* mat = m_Scene.GetSelectedMaterial();
1966 if (m_SelMatColorWidget == ui.colorAmbient ) CopyRGBA(mat->m_Ambient , col);
1967 if (m_SelMatColorWidget == ui.colorEmission ) CopyRGBA(mat->m_Emission , col);
1968 if (m_SelMatColorWidget == ui.colorDiffuse ) CopyRGBA(mat->m_Diffuse , col);
1969 if (m_SelMatColorWidget == ui.colorSpecular ) CopyRGBA(mat->m_Specular , col);
1971 SetWidgetColor(m_SelMatColorWidget, col);
1974 void FormMain::SelMatColorChanged(const QColor & color)
1976 SetSelectedMaterialColor(color);
1977 m_View3d.ResetPrimaryObjectLists();
1982 void FormMain::on_actionWindowOptions_triggered()
1984 m_ViewConfigDlg.showNormal();
1985 m_ViewConfigDlg.show();
1986 m_ViewConfigDlg.activateWindow();
1989 void FormMain::on_actionWindowCustomShader_triggered()
1991 if (m_CustomShaderDlg == NULL)
1993 m_CustomShaderDlg = new FormCustomShader(this);
1994 m_CustomShaderDlg->SetShaderLibrary(&m_View3d.m_ShaderLib);
1995 m_CustomShaderDlg->SetParentWidget(ui.GLWidgetMain);
1996 m_CustomShaderDlg->LoadOrSetDefaultCode();
1999 SIGNAL(ShaderBuild()),
2001 SLOT(CustomShaderDlg_ShaderBuild()));
2004 m_CustomShaderDlg->showNormal();
2005 m_CustomShaderDlg->show();
2006 m_CustomShaderDlg->activateWindow();
2010 void FormMain::ConfigChangedDlg_ConfigChanged()
2012 m_View3d.ReleaseAllRenderBuffer();
2016 void FormMain::CrossSectionDlg_ConfigChanged()
2022 void FormMain::OnPaintImage(QPrinter *printer)
2024 QPainter painter(printer);
2026 QRect rect = painter.viewport();
2027 QSize size = this->size();
2028 size.scale(rect.size(), Qt::KeepAspectRatio);//
\8fc
\89¡
\94ä
\88Û
\8e\9d
2030 painter.setViewport(rect.x(), rect.y(), size.width(), size.height());
2031 painter.setWindow(this->rect());
2033 this->render(&painter);
2036 void FormMain::on_actionPrint_triggered()
2041 void FormMain::on_actionPrintPreview_triggered()
2046 void FormMain::PrintImage(bool WithPreview)
2048 //QPrinter printer(QPrinter::ScreenResolution);
2049 QPrinter printer(QPrinter::ScreenResolution);
2053 QPrintPreviewDialog preview(&printer, this);
2054 preview.setWindowFlags( Qt::Window );
2057 SIGNAL(paintRequested(QPrinter *)),
2058 SLOT(OnPaintImage(QPrinter *)));
2060 preview.showMaximized();
2065 QPrintDialog printDialog(&printer, this);
2066 if(printDialog.exec() == QDialog::Accepted)
2067 OnPaintImage(&printer);
2072 void FormMain::on_pushButtonAddCameraRecord_clicked()
2074 m_View3d.RecordCamera();
2076 ui.listCamera->addItem( QString::number(ui.listCamera->count()) );
2081 void FormMain::on_pushButtonDeleteCameraRecord_clicked()
2083 int idx = ui.listCamera->currentRow();
2087 m_View3d.RemoveRecordedCamera(idx);
2089 for (int i = idx+1; i < ui.listCamera->count(); ++i)
2091 ui.listCamera->item(i)->setText(QString::number(i - 1));
2094 ui.listCamera->takeItem(idx);
2099 void FormMain::on_pushCameraRecordClear_clicked()
2101 m_View3d.ClearRecordedCamera();
2103 ui.listCamera->clear();
2108 void FormMain::on_listCamera_itemDoubleClicked(QListWidgetItem *item)
2110 int idx = ui.listCamera->currentRow();
2114 m_View3d.MoveToRecordedCamera(idx, ui.checkCameraAnimation->isChecked());
2117 void FormMain::on_actionSaveCamera_triggered()
2119 QString title = "camera";
2120 QString filter = "Camera File(*.camera)";
2121 QString fileName = GetFilePathFromSaveDlg(title, filter);
2122 if (fileName.isEmpty())
2125 m_View3d.m_CameraRecord.SaveCamera(fileName.toLocal8Bit().data());
2128 void FormMain::on_actionProjectionOrtho_triggered()
2130 ui.actionProjectionOrtho->setChecked(true);
2131 ui.actionProjectionPers->setChecked(false);
2133 m_View3d.m_Camera.m_ProjMode = gl::Camera::PROJ_ORTHO;
2138 void FormMain::on_actionProjectionPers_triggered()
2140 ui.actionProjectionPers->setChecked(true);
2141 ui.actionProjectionOrtho->setChecked(false);
2143 m_View3d.m_Camera.m_ProjMode = gl::Camera::PROJ_PERS;
2149 void FormMain::CustomShaderDlg_ShaderBuild()
2154 void FormMain::OnAnimationTimerUpdated()
2156 static const float rot_speed = 0.005f;
2158 if (ui.actionRotateCamera->isChecked())
2160 m_View3d.m_Camera.m_Manip.Tumble(rot_speed, 0.0f);
2161 UpdateCameraStatus();
2164 if (ui.actionRotateLight->isChecked())
2165 m_View3d.m_ControlLight.m_Position.rotate_y(rot_speed);
2167 if (ui.actionAnimation->isChecked())
2170 if (IsLastSequence())
2171 ui.actionAnimation->setChecked(false);
2177 void FormMain::on_actionRotateCamera_toggled(bool checked)
2182 void FormMain::on_actionRotateLight_toggled(bool checked)
2187 void FormMain::on_actionAnimation_toggled(bool checked)
2191 if (IsLastSequence())
2193 QSlider* s = ui.sliderSequence;
2201 void FormMain::UpdateAnimState(void)
2203 if (IsEnableAnimation())
2204 m_AnimationTimer.start();
2206 m_AnimationTimer.stop();
2209 bool FormMain::IsEnableAnimation(void)
2211 if (ui.actionRotateCamera->isChecked())
2213 if (ui.actionRotateLight->isChecked())
2215 if (ui.actionAnimation->isChecked())
2221 void FormMain::on_actionCrossSectionDlg_triggered()
2223 m_CrossSectionDlg.showNormal();
2224 m_CrossSectionDlg.show();
2225 m_CrossSectionDlg.activateWindow();
2228 void FormMain::on_actionSelectNext_triggered()
2230 AddSelectObjectIdx(1);
2233 void FormMain::on_actionSelectPrev_triggered()
2235 AddSelectObjectIdx(-1);
2238 void FormMain::AddSelectObjectIdx(int step)
2240 QTreeWidget* obj_tree = ui.treeObjects;
2242 int num_obj = obj_tree->topLevelItemCount();
2246 QTreeWidgetItem * i = obj_tree->currentItem();
2247 int idx = obj_tree->indexOfTopLevelItem(i);
2252 else if (idx >= num_obj)
2255 QTreeWidgetItem * j = obj_tree->topLevelItem(idx);
2256 obj_tree->setCurrentItem(j);
2259 void FormMain::on_actionSwitchVisible_triggered()
2261 FlipVisibleSelectedObject();
2264 void FormMain::on_actionActionSelObjectShowOnlyOnce_triggered()
2266 ShowObjectOnlySelected();
2269 void FormMain::on_actionHideAll_triggered()
2274 void FormMain::on_actionShowAll_triggered()
2279 void FormMain::on_actionVertexBuilder_triggered()
2281 FormVertexBuilder builder;
2282 builder.CreateVertex(m_Scene);
2284 RebuildObjectList();
2288 void FormMain::on_actionFullScreen_triggered()
2290 m_FullscreenPanel.ShowWidgetAsFullscreen(ui.splitter, ui.gridLayout_4);
2293 void FormMain::on_actionResetConfig_triggered()
2295 QString msg = QString::fromLocal8Bit("
\90Ý
\92è
\82ð
\83\8a\83Z
\83b
\83g
\82µ
\82Ü
\82·");
2296 if (QMessageBox::question(this, "", msg, QMessageBox::Ok|QMessageBox::Cancel) != QMessageBox::Ok)
2299 setGeometry(m_InitRect);
2301 LoadDefaultConfig();
2303 SyncViewSettingsFromGUI();
2304 SyncUVViewSettingsFromGUI();
2305 ApplyGeomStateFromGUI();
2306 SyncShaderSettingsToGUI();
2309 QString FormMain::GetFilePathFromOpenDlg(const QString& title, const QString& filter)
2311 QString default_path = GetNextDefaultPathForFileDlg();
2312 QString s = QFileDialog::getOpenFileName(this, title, default_path, filter);
2315 m_LastFileDialogDir = QFileInfo(s).absolutePath();
2320 QString FormMain::GetFilePathFromSaveDlg(const QString& title, const QString& filter)
2322 QString default_path = GetNextDefaultPathForFileDlg();
2323 QString s = QFileDialog::getSaveFileName(this, title, default_path, filter);
2326 m_LastFileDialogDir = QFileInfo(s).absolutePath();
2331 bool FormMain::IsSupportedTextureExt(const QString& path) const
2333 QString ext = QFileInfo(path).suffix().toLower();
2335 std::map<QString, bool> types;
2336 types[ "png" ] = true;
2337 types[ "jpg" ] = true;
2338 types[ "jepg" ] = true;
2339 types[ "bmp" ] = true;
2340 types[ "tif" ] = true;
2341 types[ "tiff" ] = true;
2346 QString FormMain::GetSupportedImageFilePathFromDlg(const QString& title)
2348 FileDlgFilterList exts;
2349 exts.Add( "Png" , "png" );
2350 exts.Add( "Jpg" , "jpg" );
2351 exts.Add( "Jpg" , "jpeg" );
2352 exts.Add( "Bmp" , "bmp" );
2353 exts.Add( "Tif" , "tif" );
2354 exts.Add( "Tif" , "tiff" );
2356 QString filter = FileDlgUtil::ExtListToDlgFilter("Image", exts);
2357 return GetFilePathFromOpenDlg(title, filter);
2361 QString FormMain::GetNextDefaultPathForFileDlg(void)
2363 if (m_LastFileDialogDir.isEmpty())
2364 return PathInfo::GetMyDocDirPath();
2366 return m_LastFileDialogDir;
2370 void FormMain::on_toolLoadEnvMap_clicked()
2372 QString fileName = GetSupportedImageFilePathFromDlg("Open envmap");
2373 if (fileName.isEmpty())
2376 LoadEnvMap(fileName);
2379 void FormMain::LoadEnvMap(QString& path)
2381 m_ContextShare.BeginDrawTop();
2382 m_Scene.m_EnvImg.LoadTexture(path.toLocal8Bit().data());
2383 m_ContextShare.EndDrawTop();
2385 QString title = QFileInfo(path).fileName();
2386 ui.editEnvMap->setText(title);
2391 void FormMain::on_buttonReleaseEnvImg_clicked()
2393 m_ContextShare.BeginDrawTop();
2394 m_Scene.m_EnvImg.ClearEnv();
2395 m_ContextShare.EndDrawTop();
2397 ui.editEnvMap->clear();
2402 void FormMain::on_buttonPresetEnvMap_clicked()
2404 if (m_EnvmapDlg == NULL)
2406 m_EnvmapDlg = new EnvmapSelectDlg(this);
2409 SIGNAL(ListSelectChanged()),
2411 SLOT(EnvmapDlg_ListSelectChanged()));
2414 m_EnvmapDlg->show();
2417 void FormMain::EnvmapDlg_ListSelectChanged()
2419 QString p = m_EnvmapDlg->GetSelectedItemPath();
2426 void FormMain::on_toolLoadMatcap_clicked()
2428 QString fileName = GetSupportedImageFilePathFromDlg("Open matcap");
2429 if (fileName.isEmpty())
2432 LoadMatcapImage(fileName);
2435 void FormMain::on_buttonReleaseMatcap_clicked()
2437 m_ContextShare.BeginDrawTop();
2438 m_Scene.m_MatcapImg.ClearEnv();
2439 m_ContextShare.EndDrawTop();
2441 ui.editMatcap->clear();
2446 void FormMain::on_buttonLoadMatcapPreset_clicked()
2448 if (m_MatcapDlg == NULL)
2450 m_MatcapDlg = new MatcapSelectDlg(this);
2453 SIGNAL(ListSelectChanged()),
2455 SLOT(MatcapDlg_ListSelectChanged()));
2458 m_MatcapDlg->show();
2461 void FormMain::MatcapDlg_ListSelectChanged()
2463 QString p = m_MatcapDlg->GetSelectedItemPath();
2470 void FormMain::on_sliderEnvReflection_valueChanged(int value)
2472 float r = GetSliderNormalizedPos(ui.sliderEnvReflection);
2473 m_Scene.m_EnvImg.m_EnvReflection = r;
2479 void FormMain::on_comboCoordinate_currentIndexChanged(int index)
2481 SceneTransform& transform = m_Scene.m_WorldTransform;
2483 int idx = ui.comboCoordinate->currentIndex();
2486 case 0: transform.SetCoordType(geom::SceneTransform::COORD_RUF); break;
2487 case 1: transform.SetCoordType(geom::SceneTransform::COORD_FRU); break;
2488 case 2: transform.SetCoordType(geom::SceneTransform::COORD_UFR); break;
2489 case 3: transform.SetCoordType(geom::SceneTransform::COORD_RUB); break;
2490 case 4: transform.SetCoordType(geom::SceneTransform::COORD_BRU); break;
2491 case 5: transform.SetCoordType(geom::SceneTransform::COORD_UBR); break;
2499 void FormMain::on_sliderShadowDarkness_valueChanged(int value)
2501 int b = ui.sliderShadowDarkness->minimum();
2502 int t = ui.sliderShadowDarkness->maximum();
2504 float r = (float)(value - b) / (float)(t - b);
2505 m_Scene.m_ShadowConfig.m_ShadowDarkness = r;
2510 void FormMain::on_buttonClearAllGeoms_clicked()
2515 //!
\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³
2516 void FormMain::on_checkCameraAnimation_toggled(bool checked)
2521 void FormMain::on_actionOpenAppdir_triggered()
2523 PathInfo::OpenAppDir();
2526 void FormMain::on_actionOpenConfigDir_triggered()
2528 PathInfo::OpenConfigDir();
2531 void FormMain::on_buttonDecGridAxis_clicked()
2533 m_View3d.m_GridAxisScale /= 10.0f;
2537 void FormMain::on_buttonIncGridAxis_clicked()
2539 m_View3d.m_GridAxisScale *= 10.0f;
2543 void FormMain::on_buttonResetGridAxis_clicked()
2545 m_View3d.m_GridAxisScale = 1.0f;
2550 void FormMain::View3D_SelectedObjectChanged(int sel_obj, int sel_mesh)
2552 QTreeWidgetItem* on = ui.treeObjects->topLevelItem(sel_obj);
2556 ui.treeObjects->setCurrentItem(on);
2560 QTreeWidgetItem* mn = on->child(sel_mesh);
2561 ui.treeObjects->setCurrentItem(mn);
2565 void FormMain::View3D_SelectedMatChanged(int sel_idx)
2567 ui.listMaterial->setCurrentRow(sel_idx);
2570 void FormMain::View3D_CameraMoved(void)
2572 UpdateCameraStatus();
2575 void FormMain::View3D_StatusTipChanged(QString msg)
2577 //ui.statusBar->showMessage(msg, 1500);
2580 void FormMain::View3D_SequenceStepped(int step)
2585 void FormMain::View3D_CursorMoved()
2587 Cursor3D& c = m_Scene.m_Cursor3d;
2588 QString x = QString::number(c.CursorPos.x, 'f', 4);
2589 QString y = QString::number(c.CursorPos.y, 'f', 4);
2590 QString z = QString::number(c.CursorPos.z, 'f', 4);
2604 ui.editCursorPos->setText(s);
2607 void FormMain::StepSequence(int step)
2609 QSlider* s = ui.sliderSequence;
2610 s->setValue(s->value() + step);
2613 bool FormMain::IsLastSequence(void)
2615 QSlider* s = ui.sliderSequence;
2616 return s->value() == s->maximum();
2619 void FormMain::UpdateCameraStatus(void)
2621 const Camera& camera = m_View3d.m_Camera;
2622 const lib_gl::CameraManipulator& manip = camera.m_Manip;
2623 const lm::vec3f& vp = manip.m_ViewPos;
2626 manip.GetViewAngles(a, b);
2627 a = a * 180.0f / M_PI;
2628 b = b * 180.0f / M_PI;
2632 msg += QString::number(vp.x, 'f', 2) + " ";
2633 msg += QString::number(vp.y, 'f', 2) + " ";
2634 msg += QString::number(vp.z, 'f', 2);
2638 msg += QString::number(a, 'f', 2) + " ";
2639 msg += QString::number(b, 'f', 2);
2643 msg += QString::number(camera.m_Projection.m_Near, 'f', 2) + " ";
2644 msg += QString::number(camera.m_Projection.m_Far, 'f', 2);
2647 m_StatusBar1->setText(msg);
2650 void FormMain::on_actionCameraFPSMode_toggled(bool arg1)
2652 m_View3d.m_FpsMode = arg1;
2656 void FormMain::actionCursorMenuStates_Toggled(bool)
2658 m_Binder_Cursor.UpdateAllData();
2662 void FormMain::on_actionResetCursor_triggered()
2664 m_Scene.m_Cursor3d.ResetCursorPos();
2665 m_Scene.m_Cursor3d.UpdateNormal(m_View3d.m_Camera.m_Manip.GetFront());
2669 void FormMain::on_actionResetMeasure_triggered()
2671 m_View3d.ResetCursorMeasure();
2676 void FormMain::on_actionPyScript_triggered()
2678 if (m_PyScriptDlg == NULL)
2680 m_PyScriptDlg = new FormPyScript(this);
2681 m_PyScriptDlg->m_Scene = &m_Scene;
2682 m_PyScriptDlg->m_View3d = &m_View3d;
2683 m_PyScriptDlg->m_View2d = &m_View2d;
2686 m_PyScriptDlg->showNormal();
2687 m_PyScriptDlg->show();
2688 m_PyScriptDlg->activateWindow();
2691 void FormMain::on_actionConsole_triggered()
2694 freopen( "CON", "r", stdin );
2695 freopen( "CON", "w", stdout );
2699 void FormMain::on_actionClearVertSelect_triggered()
2701 m_Scene.ClearAllVertSelect();
2706 void FormMain::on_action_About_triggered()
2712 void FormMain::on_action_Association_triggered()
2714 m_AssociationDlg.exec();
2717 void FormMain::on_actionLookDepth_triggered()
2719 m_View3d.LookDepth();
2722 void FormMain::on_actionLook3DCursor_triggered()
2724 m_View3d.Look3DCursor();
2727 void FormMain::on_sliderLightPower_valueChanged(int value)
2729 float val = (float)ui.sliderLightPower->value();
2730 float val_max = (float)ui.sliderLightPower->maximum();
2731 float n = 2.0f * val / val_max;
2733 m_View3d.SetLightStrengthByStdRatio(n);
2735 ui.labelLightPower->setText(QString("LightPower ") + QString::number(n, 'f', 2));
2740 void FormMain::on_buttonResetLightPower_clicked()
2742 ui.sliderLightPower->setValue(1000);
2745 void FormMain::on_checkHoleAroundCursor_clicked(bool checked)
2748 ui.checkShowOnlyAroundCursor->setChecked(false);
2751 m_Scene.m_Cursor3d.CircleClip = Cursor3DCircleClip::Hole;
2753 m_Scene.m_Cursor3d.CircleClip = Cursor3DCircleClip::None;
2758 void FormMain::on_checkShowOnlyAroundCursor_toggled(bool checked)
2761 ui.checkHoleAroundCursor->setChecked(false);
2764 m_Scene.m_Cursor3d.CircleClip = Cursor3DCircleClip::ShowAround;
2766 m_Scene.m_Cursor3d.CircleClip = Cursor3DCircleClip::None;
2771 void FormMain::on_sliderCursorHoleRange_valueChanged(int value)
2773 float val = (float)ui.sliderCursorHoleRange->value();
2774 float maxval = (float)ui.sliderCursorHoleRange->maximum();
2775 float n = val / maxval;
2777 m_Scene.m_Cursor3d.HoleRangeRatio = n;
2781 void FormMain::on_buttonResetCursorHoleRange_clicked()
2786 void FormMain::ResetHoleRange(void)
2788 ui.sliderCursorHoleRange->setValue(500);
2791 void FormMain::on_actionSaveImageToMydoc_triggered()
2793 QString path = PathInfo::GetMyDocDirPath();
2794 QString basename = path + "/" + "qgv_snap_";
2796 QDateTime dt = QDateTime::currentDateTime();
2801 QString tp = dt.toString("yyyyMMdd_hhmmss_zzz");
2802 dst = basename + tp + ".png";
2803 if (!QFile(dst).exists())
2807 ui.GLWidgetMain->grabFrameBuffer().save(dst);
2810 void FormMain::on_actionPostProcNone_triggered()
2812 ChangePostprocMode(PostProcType::None);
2815 void FormMain::on_actionPostProcAntialias_triggered()
2817 ChangePostprocMode(PostProcType::Antialias);
2820 void FormMain::on_actionPostProcBorder_triggered()
2822 ChangePostprocMode(PostProcType::Border);
2825 void FormMain::on_actionPostProcDepthLayerColor_triggered()
2827 ChangePostprocMode(PostProcType::DepthLayerColor);
2830 void FormMain::on_actionPostProcDepthColor_triggered()
2832 ChangePostprocMode(PostProcType::DepthColor);
2835 void FormMain::on_actionPostProcDepthOfField_triggered()
2837 ChangePostprocMode(PostProcType::DepthOfField);
2840 void FormMain::ChangePostprocMode(PostProcType type)
2842 m_View3d.m_Config.m_PPMode = type;
2846 void FormMain::on_sliderDOFPint_valueChanged(int value)
2848 float n = GetSliderNormalizedPos(ui.sliderDOFPint);
2849 m_View3d.m_PPContext.m_DOFPintPos = n;
2854 void FormMain::on_sliderDOFRange_valueChanged(int value)
2856 float n = GetSliderNormalizedPos(ui.sliderDOFRange);
2857 m_View3d.m_PPContext.m_DOFRange = 10.0f * n;
2862 float FormMain::GetSliderNormalizedPos(const QSlider* slider) const
2864 float t = (float)slider->maximum();
2865 float b = (float)slider->minimum();
2866 float v = (float)slider->value();
2868 return (v - b) / (t - b);
2871 void FormMain::on_buttonResetDOFPint_clicked()
2873 ui.sliderDOFPint->setValue(1000);
2876 void FormMain::on_buttonResetDOFRange_clicked()
2878 ui.sliderDOFRange->setValue(1000);
2881 void FormMain::on_actionAddCrossSectionRecord_triggered()
2883 m_Scene.AddCrossSectionRecord();
2887 void FormMain::on_actionClearCrossSectionRecord_triggered()
2889 m_Scene.ClearCrossSectionRecord();
2893 void FormMain::LoadCurSelMatTexture(TextureType type)
2895 QString path = GetSupportedImageFilePathFromDlg("Load Texture");
2899 LoadCurSelMatTexture(type, path);
2902 void FormMain::LoadCurSelMatTexture(TextureType type, QString filepath)
2904 GeomTextureSet* ts = m_Scene.GetSelectedTexture();
2908 MeshBuf* mbuf = ts->GetParent();
2909 std::string fp = filepath.toLocal8Bit().data();
2911 QString name_qs = QFileInfo(filepath).fileName();
2912 std::string name = name_qs.toLocal8Bit().data();
2914 m_ContextShare.BeginDrawTop();
2916 mbuf->ReleaseTextureUnit(ts, type);
2917 gl::GlTexture* tex = mbuf->GetInitTexture(fp, name, m_Scene.m_TexConfig);
2918 ts->SetTextureUnit(type, tex);
2920 if (type == TextureType::Normal)
2921 m_View3d.ReleaseAllRenderBuffer();
2923 m_ContextShare.EndDrawTop();
2925 OnChangedSelectedMaterial();
2929 void FormMain::ReleaseCurSelTexture(TextureType type)
2931 MeshBuf* mbuf = m_Scene.GetPrimaryMeshbuf();
2935 int mat_idx = m_Scene.m_Sels.GetSelMat();
2937 m_ContextShare.BeginDrawTop();
2938 mbuf->ReleaseTextureUnit(mat_idx, type);
2939 m_ContextShare.EndDrawTop();
2941 OnChangedSelectedMaterial();
2945 void FormMain::LoadMatcapImageForCurrentMat(QString& path)
2947 GeomTextureSet* ts = m_Scene.GetSelectedTexture();
2949 QString title = QFileInfo(path).fileName();
2951 m_ContextShare.BeginDrawTop();
2952 ts->TexMatcap.LoadTexture(path.toLocal8Bit().data());
2953 ts->TexMatcap.SetName(title);
2954 m_ContextShare.EndDrawTop();
2956 OnChangedSelectedMaterial();
2960 void FormMain::LoadMatcapImage(QString& path)
2962 MatcapImage& mc = m_Scene.m_MatcapImg;
2964 QString title = QFileInfo(path).fileName();
2966 ui.editMatcap->setText(mc.GetName());
2968 m_ContextShare.BeginDrawTop();
2969 mc.LoadTexture(path.toLocal8Bit().data());
2971 m_ContextShare.EndDrawTop();
2976 void FormMain::on_buttonOpenMatCapEachMaterial_clicked()
2978 QString path = GetSupportedImageFilePathFromDlg("Load Texture");
2982 LoadMatcapImage(path);
2985 void FormMain::on_buttonClearMatCapEachMaterial_clicked()
2987 geom::GeomTextureSet* tex = m_Scene.GetSelectedTexture();
2991 m_ContextShare.BeginDrawTop();
2992 tex->TexMatcap.ClearEnv();
2993 m_ContextShare.EndDrawTop();
2995 ui.editMatCapEachMaterial->clear();
3000 void FormMain::on_buttonOpenCurrentMatColorMap_clicked()
3002 LoadCurSelMatTexture(TextureType::Color);
3005 void FormMain::on_buttonClearCurrentMatColorMap_clicked()
3007 ReleaseCurSelTexture(TextureType::Color);
3010 void FormMain::on_buttonOpenCurrentMatNormalMap_clicked()
3012 LoadCurSelMatTexture(TextureType::Normal);
3015 void FormMain::on_buttonClearCurrentMatNormalMap_clicked()
3017 ReleaseCurSelTexture(TextureType::Normal);
3020 void FormMain::ChangeMatlemColor(QWidget* col_widget)
3022 lib_geo::BaseMaterial* mat = m_Scene.GetSelectedMaterial();
3026 lib_graph::color4f* col;
3028 if (col_widget == ui.colorAmbient ) col = &mat->m_Ambient ;
3029 if (col_widget == ui.colorEmission ) col = &mat->m_Emission ;
3030 if (col_widget == ui.colorDiffuse ) col = &mat->m_Diffuse ;
3031 if (col_widget == ui.colorSpecular ) col = &mat->m_Specular ;
3033 lib_graph::color4f src = *col;
3035 QColor dc = ToQColor(*col);
3037 m_SelMatColorWidget = col_widget;
3039 m_SelMatColorSelDlg.setOption(QColorDialog::ShowAlphaChannel);
3040 m_SelMatColorSelDlg.setCurrentColor(dc);
3041 if (m_SelMatColorSelDlg.exec() == QDialog::Rejected)
3044 SetWidgetColor(col_widget, dc);
3048 void FormMain::on_buttonDiffuse_clicked()
3050 ChangeMatlemColor(ui.colorDiffuse);
3053 void FormMain::on_buttonAmbient_clicked()
3055 ChangeMatlemColor(ui.colorAmbient);
3058 void FormMain::on_buttonEmission_clicked()
3060 ChangeMatlemColor(ui.colorEmission);
3063 void FormMain::on_buttonSpecular_clicked()
3065 ChangeMatlemColor(ui.colorSpecular);
3068 void FormMain::SetWidgetColor(QWidget* w, QColor col)
3070 QString ss = QString("background-color: %1").arg(col.name());
3071 w->setStyleSheet(ss);
3074 void FormMain::on_sliderShininess_valueChanged(int value)
3076 lib_geo::BaseMaterial* mat = m_Scene.GetSelectedMaterial();
3080 float val = (float)ui.sliderShininess->value();
3081 float val_max = (float)ui.sliderShininess->maximum();
3083 float real_val = 200.0f * val / val_max;
3085 mat->m_Shininess = real_val;
3087 ui.labelShininessVal->setText(QString::number(real_val, 'f', 2));
3092 void FormMain::CreateRecentFilesMenu(const std::vector<QString>& path)
3094 QMenu* recents = ui.menuOpenRecent;
3095 recents->actions().clear();
3097 for (size_t i = 0; i < path.size(); ++i)
3099 AddRecentFile(path[path.size() - i - 1]);
3103 void FormMain::CreateRecentFilesFromMenu(std::vector<QString>& path)
3105 QMenu* recents = ui.menuOpenRecent;
3106 for (int i = 0; i < recents->actions().size(); ++i)
3108 QAction* a = recents->actions().at(i);
3109 path.push_back(a->text());
3113 void FormMain::AddRecentFile(const QString& path)
3115 QString path_local = QDir::toNativeSeparators(path);
3117 static const int max_files = 10;
3119 QMenu* recents = ui.menuOpenRecent;
3121 for (int i = 0; i < recents->actions().size(); ++i)
3123 QAction* a = recents->actions().at(i);
3124 if (a->text() == path_local)
3126 recents->removeAction(a);
3131 QAction* new_path = new QAction(path_local, this);
3134 SIGNAL(triggered()),
3136 SLOT(OnOpenRecent()));
3138 if (recents->actions().empty())
3139 recents->addAction(new_path);
3141 recents->insertAction(recents->actions().front(), new_path);
3143 if (recents->actions().size() > max_files)
3145 QAction* a = recents->actions().back();
3146 recents->removeAction(a);
3150 void FormMain::OnOpenRecent()
3152 QAction* a = dynamic_cast<QAction*>(QObject::sender());
3157 QString path = a->text();
3159 if (IsResetSceneOnBeforeLoadFile())
3162 if (OpenGeomFile(path))
3166 void FormMain::on_checkShowOnlySelect_toggled(bool checked)
3168 m_View3d.m_Config.m_ShowOnlySelect = checked;
3172 void FormMain::ResizeTreeColumns(QTreeWidget* t, int num_col)
3174 t->setVisible(false);
3175 t->resizeColumnToContents(0);
3176 t->resizeColumnToContents(1);
3177 t->resizeColumnToContents(2);
3178 t->resizeColumnToContents(3);
3179 t->setVisible(true);
3182 void FormMain::PushbackTreeNode(QTreeWidget* tree, QTreeWidgetItem *node)
3184 int next_idx = tree->topLevelItemCount();
3185 tree->insertTopLevelItem(next_idx, node);
3188 QTreeWidgetItem* FormMain::CreateObjectTreeNode(const geom::GeomObject& obj) const
3190 QTreeWidgetItem* n = new QTreeWidgetItem;
3192 n->setText(0, QString::fromLocal8Bit(obj.m_Name.c_str()));
3193 n->setCheckState(1, obj.m_Visible ? Qt::Checked : Qt::Unchecked);
3194 n->setText(2, QString::number(obj.GetNumTotalVerts()));
3195 n->setText(3, QString::number(obj.GetNumTotalFaces()));
3198 for (const MeshBuf& mbuf : obj.m_MeshAry)
3200 n->addChild(CreateMeshBufNode(obj, mbuf, idx++));
3203 n->setExpanded(true);
3208 QTreeWidgetItem* FormMain::CreateMeshBufNode(const geom::GeomObject& obj, const MeshBuf& mbuf, int idx) const
3210 QTreeWidgetItem* n = new QTreeWidgetItem;
3213 if (mbuf.m_Name.empty())
3214 name = QString::fromLocal8Bit(obj.m_Name.c_str()) + QString::number(idx);
3216 name = QString::fromLocal8Bit(mbuf.m_Name.c_str());
3218 n->setText(0, name);
3219 n->setCheckState(1, mbuf.m_Visible ? Qt::Checked : Qt::Unchecked);
3220 n->setText(2, QString::number(mbuf.GetNumVerts()));
3221 n->setText(3, QString::number(mbuf.GetNumFaces()));
3226 void FormMain::InitObjectListHeader(void)
3229 qs << "Name" << "Visible" << "Verts" << "Faces";
3230 ui.treeObjects->setHeaderLabels(qs);
3233 void FormMain::SetPrimayrSelectObjectFromScene(void)
3235 QTreeWidget* obj_tree = ui.treeObjects;
3237 Selection3D& sels = m_Scene.m_Sels;
3238 if (!sels.IsObjectSelected())
3241 int sel_idx = sels.GetSelObjectIdx();
3243 QTreeWidgetItem* on = obj_tree->topLevelItem(sel_idx);
3247 if (sels.IsMBufSelected())
3249 QTreeWidgetItem* mn = on->child(sels.GetMBufIdx());
3250 obj_tree->setCurrentItem(mn);
3254 obj_tree->setCurrentItem(on);
3258 void FormMain::SetPrimayrSelectObjectToScene(void)
3260 Selection3D& sels = m_Scene.m_Sels;
3262 QTreeWidget* tree = ui.treeObjects;
3264 QTreeWidgetItem* sel_node = tree->currentItem();
3265 if (sel_node == NULL)
3268 QTreeWidgetItem* on = sel_node->parent();
3271 int obj_idx = tree->indexOfTopLevelItem(sel_node);
3272 sels.SelectObject(obj_idx);
3276 int obj_idx = tree->indexOfTopLevelItem(on);
3277 int mb_idx = on->indexOfChild(sel_node);
3278 sels.SelectMBuf(obj_idx, mb_idx);
3282 void FormMain::on_actionReleaseShader_triggered()
3284 m_ContextShare.BeginDrawTop();
3286 m_View3d.m_ShaderLib.ReleaseAllShaders();
3288 m_ContextShare.EndDrawTop();
3291 void FormMain::on_combo2DViewSrcType_currentIndexChanged(int index)
3295 case 0 : return m_View2d.ChangeTextureSource(View2DTexSrc::Color);
3296 case 1 : return m_View2d.ChangeTextureSource(View2DTexSrc::Normal);
3303 void FormMain::on_sliderSequence_valueChanged(int value)
3308 void FormMain::ResetSequenceSliderRange(void)
3310 int m = m_Scene.GetKeyframeMax();
3311 ui.sliderSequence->setMaximum(m);
3315 void FormMain::UpdateSequence(void)
3317 int v = ui.sliderSequence->value();
3318 int m = ui.sliderSequence->maximum();
3320 QString s = QString("%1 / %2").arg(v).arg(m);
3321 ui.labelSequencePos->setText(s);
3323 m_Scene.SetFrame(v);
3325 m_View3d.ReleaseAllRenderBuffer();
3329 void FormMain::on_actionNewStroke_triggered()
3334 void FormMain::on_actionClearStroke_triggered()