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 ));
334 dbmap.AddBinder(new MenuBinder( ui.actionTransparentStroke , &cursor.TranspStorke ));
336 for (GuiBinder& binder : dbmap.m_BinderMap)
338 MenuBinder* mb = dynamic_cast<MenuBinder*>(&binder);
341 QAction* a = mb->GetMenu();
344 SIGNAL(triggered(bool)),
346 SLOT(actionCursorMenuStates_Toggled(bool)));
352 void FormMain::InitializeGeomStateMenu(void)
354 AddGeomStateAction( ui.actionCentering );
355 AddGeomStateAction( ui.actionAutoResize );
358 void FormMain::AddGeomStateAction(const QAction* action)
362 SIGNAL(triggered(bool)),
364 SLOT(actionGeomStates_Triggered(bool)));
368 void FormMain::InitializeGLView(void)
370 ui.GLWidgetMain->setMouseTracking(true);
371 ui.GLWidgetUV->setMouseTracking(true);
373 ui.GLWidgetMain->SetViewer(&m_View3d);
374 m_View3d.m_Widgets = &m_Widgets;
375 m_View3d.RegisterScene(&m_Scene);
376 m_View3d.InitializeView(ui.GLWidgetMain);
378 ui.GLWidgetUV->SetViewer(&m_View2d);
379 m_View2d.m_Widgets = &m_Widgets;
380 m_View2d.RegisterScene(&m_Scene);
381 m_View2d.InitializeView(ui.GLWidgetUV);
383 m_Widgets.AddWidget(ui.GLWidgetMain);
384 m_Widgets.AddWidget(ui.GLWidgetUV);
386 // OpenGL
\82Ì
\83\8a\83X
\83g
\82Ì
\8b¤
\97L
\89»
389 m_ContextShare.BeginDrawTop();
391 m_Scene.Initialize();
393 m_ContextShare.EndDrawTop();
397 SIGNAL(SelectedObjectChanged(int, int)),
398 SLOT(View3D_SelectedObjectChanged(int, int)));
401 SIGNAL(SelectedMatChanged(int)),
402 SLOT(View3D_SelectedMatChanged(int)));
405 SIGNAL(CameraMoved(void)),
406 SLOT(View3D_CameraMoved(void)));
409 SIGNAL(StatusTipChanged(QString)),
410 SLOT(View3D_StatusTipChanged(QString)));
413 SIGNAL(SequenceStepped(int)),
414 SLOT(View3D_SequenceStepped(int)));
417 SIGNAL(CursorMoved()),
418 SLOT(View3D_CursorMoved()));
421 // OpenGL
\82Ì
\83\8a\83X
\83g
\82Ì
\8b¤
\97L
\89»
422 void FormMain::SetContextShare(void)
424 ui.GLWidgetUV->makeCurrent();
425 m_ContextShare.AddContext( GetDC((HWND)ui.GLWidgetUV->winId()) , wglGetCurrentContext() );
426 ui.GLWidgetUV->doneCurrent();
428 ui.GLWidgetMain->makeCurrent();
429 m_ContextShare.AddContext( GetDC((HWND)ui.GLWidgetUV->winId()) , wglGetCurrentContext() );
430 ui.GLWidgetMain->doneCurrent();
432 m_ContextShare.MakeShare();
435 void FormMain::InitializeCoordinateCombobox(void)
437 ui.comboCoordinate->blockSignals(true);
438 ui.comboCoordinate->addItem("Yup RH"); // RUF
439 ui.comboCoordinate->addItem("Zup RH"); // FRU
440 ui.comboCoordinate->addItem("Xup RH"); // UFR
441 ui.comboCoordinate->addItem("Yup LH"); // RUB
442 ui.comboCoordinate->addItem("Zup LH"); // BRU
443 ui.comboCoordinate->addItem("Xup LH"); // UBR
444 ui.comboCoordinate->blockSignals(false);
447 void FormMain::Initialize2DViewSrcCombobox(void)
449 ui.combo2DViewSrcType->blockSignals(true);
450 ui.combo2DViewSrcType->addItem("Color");
451 ui.combo2DViewSrcType->addItem("Normal");
452 ui.combo2DViewSrcType->blockSignals(false);
455 void FormMain::InitializeStatusBar(void)
457 m_StatusBar0 = new QLabel(this);
458 m_StatusBar1 = new QLabel(this);
459 ui.statusBar->addWidget(m_StatusBar0, 1);
460 ui.statusBar->addWidget(m_StatusBar1, 0);
462 m_StatusBar0->setText("");
464 m_StatusBar1->setMinimumWidth(290);
465 m_StatusBar1->setText("");
468 void FormMain::InitializeFromConfigFiles(void)
470 if (!InitializeConfig(PathInfo::GetGuiConfigFilePath()))
472 InitializeConfig(PathInfo::GetDefaultGuiConfigFilePath());
475 OpenCameraFile(PathInfo::GetCameraLogFilePath());
477 LoadWindowLayout(PathInfo::GetWindowLayoutConfigFilePath());
479 if (!QGui::LoadGUIState(this, PathInfo::GetLayoutConfigFilePath()))
481 QGui::LoadGUIState(this, PathInfo::GetDefaultLayoutConfigFilePath());
485 void FormMain::LoadDefaultConfig(void)
487 InitializeConfig(PathInfo::GetDefaultGuiConfigFilePath());
488 QGui::LoadGUIState(this, PathInfo::GetDefaultLayoutConfigFilePath());
491 void FormMain::SaveConfig(void)
493 PathInfo::CreateConfiDirIfNotExist();
495 SaveConfigFile(PathInfo::GetGuiConfigFilePath());
497 m_View3d.m_CameraRecord.SaveCamera(PathInfo::GetCameraLogFilePath().toLocal8Bit().data());
499 QGui::SaveGUIState(this, PathInfo::GetLayoutConfigFilePath());
501 SaveWindowLayout(PathInfo::GetWindowLayoutConfigFilePath());
504 bool FormMain::InitializeConfig(QString path)
506 View3DConfig& config_3d = m_View3d.m_Config;
509 cfg.m_Config3D = &config_3d;
510 cfg.m_Scene = &m_Scene;
512 if (!cfg.LoadConfigT(path.toLocal8Bit().data()))
515 ui.actionUVAutoFit->setChecked(cfg.m_AutFitUVView);
517 ui.comboCoordinate->setCurrentIndex(cfg.m_CoordType);
519 CreateRecentFilesMenu(cfg.m_RecentFiles);
521 m_Binder_ViewConfig.UpdateAllGUI(true);
522 m_Binder_UVConfig.UpdateAllGUI(true);
523 m_Binder_Scene.UpdateAllGUI(true);
524 m_Binder_Cursor.UpdateAllGUI(true);
526 ApplyGeomStateDataoToGUI();
528 SyncViewSettingsFromGUI();
529 SyncUVViewSettingsFromGUI();
530 SyncShaderSettingsToGUI();
532 m_EnableAllFeatures = cfg.m_EnableAllFeatures;
537 void FormMain::SaveConfigFile(QString path)
540 cfg.m_Config3D = &m_View3d.m_Config;
541 cfg.m_Scene = &m_Scene;
543 cfg.m_EnableAllFeatures = m_EnableAllFeatures;
545 cfg.m_AutFitUVView = ui.actionUVAutoFit ->isChecked();
547 cfg.m_CoordType = ui.comboCoordinate->currentIndex();
549 CreateRecentFilesFromMenu(cfg.m_RecentFiles);
551 cfg.SaveConfigT(path.toLocal8Bit().data());
555 void FormMain::InitializeSubDlg(void)
559 SIGNAL(currentColorChanged(const QColor &)),
561 SLOT(WireOverlayColorChanged(const QColor &)));
563 &m_DiffuseColorSelDlg,
564 SIGNAL(currentColorChanged(const QColor &)),
566 SLOT(FaceDiffuseColorChanged(const QColor &)));
569 SIGNAL(currentColorChanged(const QColor &)),
571 SLOT(BGColorChanged(const QColor &)));
573 &m_SelMatColorSelDlg,
574 SIGNAL(currentColorChanged(const QColor &)),
576 SLOT(SelMatColorChanged(const QColor &)));
578 m_SelMatColorWidget = NULL;
580 m_ViewConfigDlg.InitializeConfigDlg(&m_View3d.m_Config);
583 SIGNAL(ConfigChanged()),
585 SLOT(ConfigChangedDlg_ConfigChanged()));
587 m_CrossSectionDlg.InitializeConfigDlg(&m_View3d);
590 SIGNAL(ConfigChanged()),
592 SLOT(CrossSectionDlg_ConfigChanged()));
595 void FormMain::InitializeAnimation(void)
601 SLOT(OnAnimationTimerUpdated()));
602 m_AnimationTimer.setInterval(20);
605 void FormMain::InitializeMenu(void)
607 m_AGroup_Window = new QActionGroup(this);
608 m_AGroup_Window->setExclusive(true);
609 m_AGroup_Window->addAction( ui.actionWindow_3DView );
610 m_AGroup_Window->addAction( ui.actionWindow_UVView );
611 m_AGroup_Window->addAction( ui.actionWindows_DualView );
613 m_AGroup_Shader = new QActionGroup(this);
614 m_AGroup_Shader->setExclusive(true);
615 m_AGroup_Shader->addAction( ui.actionShaderDefault );
616 m_AGroup_Shader->addAction( ui.actionShaderPhong );
617 m_AGroup_Shader->addAction( ui.actionShaderCustom );
618 m_AGroup_Shader->addAction( ui.actionNormalColor );
619 m_AGroup_Shader->addAction( ui.actionDepthColor );
620 m_AGroup_Shader->addAction( ui.actionShadowmap );
621 m_AGroup_Shader->addAction( ui.actionEnvmap );
622 m_AGroup_Shader->addAction( ui.actionIntegrateShader );
623 m_AGroup_Shader->addAction( ui.actionMatcapShader );
625 m_AGroup_PProc = new QActionGroup(this);
626 m_AGroup_PProc->addAction( ui.actionPostProcNone );
627 m_AGroup_PProc->addAction( ui.actionPostProcAntialias );
628 m_AGroup_PProc->addAction( ui.actionPostProcBorder );
629 m_AGroup_PProc->addAction( ui.actionPostProcDepthLayerColor );
630 m_AGroup_PProc->addAction( ui.actionPostProcDepthColor );
631 m_AGroup_PProc->addAction( ui.actionPostProcDepthOfField );
634 void FormMain::InitContextMenu(void)
636 QList<QAction*> actions;
638 << ui.actionSelObjectVisible
639 << ui.actionSelObjectVertexOnlyMode
640 << ui.actionSelObjectDelete
641 << ui.actionSelObjectReload
642 << ui.actionSelObjectFlipFace
643 << ui.actionSelObjectFlipNormal
644 << ui.actionSelObjectOpenDir
645 << ui.actionActionSelObjectShowOnlyOnce
646 << ui.actionSelObjectTriangulate
647 << ui.actionTreeCollapseAll
648 << ui.actionTreeExpandAll;
650 QTreeWidget* obj_tree = ui.treeObjects;
652 obj_tree->setContextMenuPolicy(Qt::ActionsContextMenu);
653 obj_tree->addActions(actions);
656 void FormMain::ProcArguments(void)
658 QStringList args = QApplication::arguments();
659 for (int i = 1; i < args.size(); ++i)
666 void FormMain::closeEvent(QCloseEvent *e)
674 m_ViewConfigDlg.close();
675 m_CrossSectionDlg.close();
676 m_FullscreenPanel.close();
678 if (m_CustomShaderDlg != NULL)
679 m_CustomShaderDlg->close();
680 if (m_PyScriptDlg != NULL)
681 m_PyScriptDlg->close();
683 if (m_MatcapDlg != NULL)
684 m_MatcapDlg->close();
685 if (m_EnvmapDlg != NULL)
686 m_EnvmapDlg->close();
688 m_ContextShare.BeginDrawTop();
689 m_Scene.FinalizeScene();
690 m_ContextShare.EndDrawTop();
694 bool FormMain::eventFilter(QObject * filterobj, QEvent * filterevt)
696 if (filterobj == ui.editEnvMap)
698 if (filterevt->type() == QEvent::DragEnter)
699 return AcceptDropFilterIfUrl(filterevt);
701 if (filterevt->type() == QEvent::Drop)
702 return OnDropFile_editEnvMap(filterevt);
704 else if (filterobj == ui.editMatcap)
706 if (filterevt->type() == QEvent::DragEnter)
707 return AcceptDropFilterIfUrl(filterevt);
709 if (filterevt->type() == QEvent::Drop)
710 return OnDropFile_editMatcap(filterevt);
712 else if (filterobj == ui.editMatCapEachMaterial)
714 if (filterevt->type() == QEvent::DragEnter)
715 return AcceptDropFilterIfUrl(filterevt);
717 if (filterevt->type() == QEvent::Drop)
718 return OnDropFile_editMatcapEachMat(filterevt);
720 else if (filterobj == ui.editCurrentTexName)
722 if (filterevt->type() == QEvent::DragEnter)
723 return AcceptDropFilterIfUrl(filterevt);
725 if (filterevt->type() == QEvent::Drop)
726 return OnDropFile_editCurrentTexName(filterevt);
728 else if (filterobj == ui.editCurrentMatNormalMap)
730 if (filterevt->type() == QEvent::DragEnter)
731 return AcceptDropFilterIfUrl(filterevt);
733 if (filterevt->type() == QEvent::Drop)
734 return OnDropFile_editCurrentMatNormalMap(filterevt);
737 return QMainWindow::eventFilter(filterobj, filterevt);
740 bool FormMain::OnDropFile_editEnvMap(QEvent * filterevt)
742 QString path = GetFirstLoadableImagePathFromDragEvent(filterevt);
749 bool FormMain::OnDropFile_editMatcap(QEvent * filterevt)
751 QString path = GetFirstLoadableImagePathFromDragEvent(filterevt);
753 LoadMatcapImage(path);
758 bool FormMain::OnDropFile_editMatcapEachMat(QEvent * filterevt)
760 QString path = GetFirstLoadableImagePathFromDragEvent(filterevt);
762 LoadMatcapImageForCurrentMat(path);
767 bool FormMain::OnDropFile_editCurrentTexName(QEvent * filterevt)
769 QString path = GetFirstLoadableImagePathFromDragEvent(filterevt);
771 LoadCurSelMatTexture(TextureType::Color, path);
776 bool FormMain::OnDropFile_editCurrentMatNormalMap(QEvent * filterevt)
778 QString path = GetFirstLoadableImagePathFromDragEvent(filterevt);
780 LoadCurSelMatTexture(TextureType::Normal, path);
785 bool FormMain::AcceptDropFilterIfUrl(QEvent * filterevt)
787 QDragEnterEvent* e = dynamic_cast<QDragEnterEvent*>(filterevt);
791 if (e->mimeData()->hasUrls())
792 e->acceptProposedAction();
797 QString FormMain::GetFirstLoadableImagePathFromDragEvent(QEvent* filterevt)
799 QDropEvent* e = dynamic_cast<QDropEvent*>(filterevt);
803 if (!e->mimeData()->hasUrls())
806 QList<QUrl> urls = e->mimeData()->urls();
807 for (int i = 0; i < urls.size(); ++i)
809 QString path = urls[i].toLocalFile();
810 if (IsSupportedTextureExt(path))
818 void FormMain::CenteringSplitter(void)
820 int w = ui.splitter->width();
824 ui.splitter->setSizes(s);
827 void FormMain::updateView_All(void)
833 void FormMain::updateView_2D(void)
835 ui.GLWidgetUV->update();
838 void FormMain::updateView_3D(void)
840 ui.GLWidgetMain->update();
843 void FormMain::on_actionOpen_triggered()
845 FileDlgFilterList exts;
846 exts.Add( "Wavefront" , "obj" );
847 exts.Add( "STL" , "stl" );
848 exts.Add( "PLY" , "ply" );
849 exts.Add( "Metasequoia" , "mqo" );
850 exts.Add( "Pmd" , "pmd" );
851 exts.Add( "Collada" , "dae" );
852 exts.Add( "DirectX" , "x" );
854 QString filter = FileDlgUtil::ExtListToDlgFilter("Geometry", exts);
855 QString title = "Open file";
856 QString fileName = GetFilePathFromOpenDlg(title, filter);
858 if (fileName.isEmpty())
861 if (IsResetSceneOnBeforeLoadFile())
864 if (OpenGeomFile(fileName))
868 void FormMain::on_actionExit_triggered()
873 void FormMain::actionVisibleStates_Triggered(bool checked)
875 QAction* a = dynamic_cast<QAction*>(QObject::sender());
878 if (a == ui.actionIndexColorMode)
880 ui.actionFixMaterialSilver->setChecked(false);
881 ui.actionFBMaterial->setChecked(false);
883 else if (a == ui.actionFixMaterialSilver)
885 ui.actionIndexColorMode->setChecked(false);
886 ui.actionFBMaterial->setChecked(false);
888 else if (a == ui.actionFBMaterial)
890 ui.actionFixMaterialSilver->setChecked(false);
891 ui.actionIndexColorMode->setChecked(false);
895 SyncViewSettingsFromGUI();
899 void FormMain::SyncViewSettingsFromGUI(void)
901 m_Binder_ViewConfig.UpdateAllData();
903 QAction* menu = GetMenuFromShader(m_View3d.m_Config.m_ShaderMode);
905 menu->setChecked(true);
908 QAction* FormMain::GetMenuFromShader(ShaderType type)
910 switch(m_View3d.m_Config.m_ShaderMode)
912 case ShaderType::Phong : return ui.actionShaderPhong;
913 case ShaderType::Custom : return ui.actionShaderCustom;
914 case ShaderType::NormalColor: return ui.actionNormalColor;
915 case ShaderType::DepthColor : return ui.actionDepthColor;
916 case ShaderType::Shadowmap : return ui.actionShadowmap;
917 case ShaderType::Envmap : return ui.actionEnvmap;
918 case ShaderType::Integrate : return ui.actionIntegrateShader;
919 case ShaderType::Matcap : return ui.actionMatcapShader;
920 case ShaderType::Default : return ui.actionShaderDefault;
928 bool FormMain::SaveWindowLayout(const QString& filepath)
932 config.m_MainWinLeft = geometry().x();
933 config.m_MainWinTop = geometry().y();
934 config.m_MainWinWidth = geometry().width();
935 config.m_MainWinHeight = geometry().height();
936 config.m_IsMaximized = isMaximized();
938 return config.SaveConfig(filepath.toLocal8Bit().data());
941 bool FormMain::LoadWindowLayout(const QString& filepath)
944 if (!config.LoadConfig(filepath.toLocal8Bit().data()))
947 if (config.m_IsMaximized)
950 int l = config.m_MainWinLeft;
951 int t = config.m_MainWinTop;
952 int w = config.m_MainWinWidth;
953 int h = config.m_MainWinHeight;
954 setGeometry(l, t, w, h);
959 void FormMain::actionVisibleStatesUV_Triggered(bool)
961 SyncUVViewSettingsFromGUI();
964 void FormMain::SyncUVViewSettingsFromGUI(void)
966 m_Binder_UVConfig.UpdateAllData();
970 void FormMain::actionSceneStates_Toggled(bool)
972 SyncSceneSettingsFromGUI();
975 void FormMain::SyncSceneSettingsFromGUI(void)
977 m_Binder_Scene.UpdateAllData();
981 void FormMain::on_actionWindow_ToolBarView_triggered(bool checked)
983 ui.toolBar_View->setVisible( ui.actionWindow_ToolBarView->isChecked() );
986 void FormMain::on_actionToolBar_Options_toggled(bool checked)
988 ui.toolBar_Option->setVisible(checked);
991 void FormMain::on_actionToolBar_Operation_toggled(bool checked)
993 ui.toolBar_Operation->setVisible(checked);
996 void FormMain::on_actionCameraDist_triggered()
998 m_View3d.AdjustCameraDistAuto();
1001 void FormMain::on_actionCameraFront_triggered()
1003 m_View3d.MoveCaemraTo(ViewPoint::Front);
1006 void FormMain::on_actionCameraBack_triggered()
1008 m_View3d.MoveCaemraTo(ViewPoint::Back);
1011 void FormMain::on_actionCameraLeft_triggered()
1013 m_View3d.MoveCaemraTo(ViewPoint::Left);
1016 void FormMain::on_actionCameraRight_triggered()
1018 m_View3d.MoveCaemraTo(ViewPoint::Right);
1021 void FormMain::on_actionCameraTop_triggered()
1023 m_View3d.MoveCaemraTo(ViewPoint::Top);
1026 void FormMain::on_actionCameraBottom_triggered()
1028 m_View3d.MoveCaemraTo(ViewPoint::Bottom);
1031 void FormMain::on_actionCameraPers_triggered()
1033 m_View3d.MoveCaemraTo(ViewPoint::Perse);
1036 void FormMain::on_actionCameraLookOrigin_triggered()
1038 m_View3d.MoveLookPosToOrigin();
1041 void FormMain::on_actionCameraLookCenter_triggered()
1043 m_View3d.MoveLookPosToCenter();
1046 void FormMain::on_actionWindow_3DView_triggered(bool checked)
1048 UpdateViewTypeFromMenu();
1051 void FormMain::on_actionWindows_DualView_triggered(bool checked)
1053 UpdateViewTypeFromMenu();
1056 void FormMain::on_actionWindow_UVView_triggered(bool checked)
1058 UpdateViewTypeFromMenu();
1061 void FormMain::UpdateViewTypeFromMenu(void)
1063 if (ui.actionWindows_DualView->isChecked())
1065 ui.frameView3D->setVisible(true);
1066 ui.frameView2D->setVisible(true);
1068 // 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.
1069 static bool firsttime = true;
1073 CenteringSplitter();
1076 if (ui.actionWindow_3DView->isChecked())
1078 ui.frameView3D->setVisible(true);
1079 ui.frameView2D->setVisible(false);
1081 if (ui.actionWindow_UVView->isChecked())
1083 ui.frameView3D->setVisible(false);
1084 ui.frameView2D->setVisible(true);
1088 void FormMain::on_actionWindowMaterialList_triggered()
1090 ShowAndActivateAndRaise(ui.dockMaterial);
1091 ui.listMaterial->setFocus();
1094 void FormMain::on_actionWindowObjectList_triggered()
1096 ShowAndActivateAndRaise(ui.dockObject);
1097 ui.treeObjects->setFocus();
1100 void FormMain::on_actionWindowCameraList_triggered()
1102 ShowAndActivateAndRaise(ui.dockCamera);
1103 ui.listCamera->setFocus();
1106 void FormMain::on_actionWindowScenePanel_triggered()
1108 ShowAndActivateAndRaise(ui.dockScene);
1111 void FormMain::on_actionCursorPanel_triggered()
1113 ShowAndActivateAndRaise(ui.dockCursor);
1116 void FormMain::on_listMaterial_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
1118 m_Scene.m_Sels.SetSelMat(ui.listMaterial->currentRow());
1119 OnChangedSelectedMaterial();
1123 void FormMain::ShowAndActivateAndRaise(QDockWidget* widget)
1125 widget->setVisible(true);
1126 widget->activateWindow();
1130 void FormMain::on_treeObjects_currentItemChanged(QTreeWidgetItem * current, QTreeWidgetItem * previous)
1132 RefreshObjectSelectState();
1135 void FormMain::RefreshObjectSelectState(void)
1137 SetPrimayrSelectObjectToScene();
1139 QListWidget* list_mat = ui.listMaterial;
1142 const MeshBuf* mbuf = m_Scene.GetPrimaryMeshbuf();
1145 const lib_geo::BaseMesh& mesh = mbuf->m_Mesh;
1146 for (const lib_geo::BaseMaterial& mat : mesh.m_Materials)
1148 const std::string& name = mat.m_Name;
1151 list_mat->addItem("--");
1153 list_mat->addItem(QString::fromLocal8Bit(name.c_str()));
1157 const GeomObject* obj = m_Scene.GetPrimaryObject();
1160 ui.actionSelObjectVisible->setChecked(mbuf->IsVisible());
1162 else if (obj != NULL)
1164 ui.actionSelObjectVisible->setChecked(obj->m_Visible);
1168 ui.actionSelObjectVertexOnlyMode->setChecked(obj->m_VertexOnlyMode);
1170 if (list_mat->count() > 0 && list_mat->currentRow() < 0)
1172 list_mat->setCurrentRow(0);
1173 m_Scene.m_Sels.SetSelMat(0);
1174 OnChangedSelectedMaterial();
1180 void FormMain::OnChangedSelectedMaterial(void)
1187 ui.editCurrentTexName->clear();
1189 GeomTextureSet* ts = m_Scene.GetSelectedTexture();
1192 ui.editCurrentTexName->setText("");
1193 ui.editMatCapEachMaterial->setText("");
1197 QString name_c, name_n;
1199 gl::GlTexture* tex_c = ts->GetTexColor();
1201 name_c = QString::fromLocal8Bit(tex_c->GetName().c_str());
1203 gl::GlTexture* tex_n = ts->GetTexNormal();
1205 name_n = QString::fromLocal8Bit(tex_n->GetName().c_str());
1207 ui.editCurrentTexName->setText(name_c);
1208 ui.editCurrentMatNormalMap->setText(name_n);
1210 MatcapImage& matcap = ts->TexMatcap;
1211 ui.editMatCapEachMaterial->setText(matcap.GetName());
1214 lib_geo::BaseMaterial* mat = m_Scene.GetSelectedMaterial();
1217 SetWidgetColor(ui.colorAmbient , ToQColor(mat->m_Ambient));
1218 SetWidgetColor(ui.colorEmission , ToQColor(mat->m_Emission));
1219 SetWidgetColor(ui.colorDiffuse , ToQColor(mat->m_Diffuse));
1220 SetWidgetColor(ui.colorSpecular , ToQColor(mat->m_Specular));
1222 int val_max = ui.sliderShininess->maximum();
1223 int slider_pos = (int)(mat->m_Shininess * (float)val_max / 200.0f);
1224 slider_pos = (lm::min)(val_max, slider_pos);
1225 ui.sliderShininess->blockSignals(true);
1226 ui.sliderShininess->setValue(slider_pos);
1227 ui.sliderShininess->blockSignals(false);
1228 ui.labelShininessVal->setText(QString::number(mat->m_Shininess, 'f', 2));
1234 void FormMain::keyPressEvent(QKeyEvent *e)
1237 if (m.Flag_C() && e->key() == Qt::Key_Tab)
1243 void FormMain::FocusNextSubDlg(void)
1245 std::vector<QDockWidget*> widgets;
1247 if (ui.dockObject ->isVisible()) widgets.push_back( ui.dockObject );
1248 if (ui.dockCamera ->isVisible()) widgets.push_back( ui.dockCamera );
1249 if (ui.dockScene ->isVisible()) widgets.push_back( ui.dockScene );
1250 if (ui.dockMaterial ->isVisible()) widgets.push_back( ui.dockMaterial );
1252 if (widgets.empty())
1255 QDockWidget* next_widget = NULL;
1257 for (size_t i = 0; i < widgets.size(); ++i)
1259 if (widgets[i] == m_LastFocusedDockDlg)
1261 next_widget = widgets[(i + 1) % widgets.size()];
1266 if (next_widget == NULL)
1267 next_widget = widgets.front();
1269 m_LastFocusedDockDlg = next_widget;
1271 next_widget->activateWindow();
1272 next_widget->raise();
1273 next_widget->setFocus();
1276 void FormMain::dragEnterEvent(QDragEnterEvent* e)
1278 if (e->mimeData()->hasUrls())
1279 e->acceptProposedAction();
1282 void FormMain::dropEvent(QDropEvent* e)
1284 if (e->mimeData()->hasUrls())
1286 QList<QUrl> urls = e->mimeData()->urls();
1288 std::vector<QString> geom_files;
1290 for (int i = 0; i < urls.size(); ++i)
1292 QString path = urls[i].toLocalFile();
1293 if (FormatType::IsGeomFileExt(path))
1294 geom_files.push_back(path);
1297 if (!geom_files.empty())
1299 if (IsResetSceneOnBeforeLoadFile())
1302 for (size_t i = 0; i < geom_files.size(); ++i)
1304 if (OpenGeomFile(geom_files[i]))
1309 for (int i = 0; i < urls.size(); ++i)
1311 QString path = urls[i].toLocalFile();
1313 if (IsSupportedTextureExt(path))
1315 OpenFixTextureFile(path);
1319 if (IsCameraFile(path))
1321 OpenCameraFile(path);
1328 bool FormMain::IsResetSceneOnBeforeLoadFile(void) const
1330 if (QApplication::keyboardModifiers() & Qt::ShiftModifier)
1336 //!
\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é.
1337 void FormMain::OpenFixTextureFile(const QString& path)
1339 std::string fname = path.toLocal8Bit().data();
1341 m_ContextShare.BeginDrawTop();
1342 m_Scene.LoadDefaultMatTexture(fname);
1343 m_ContextShare.EndDrawTop();
1348 bool FormMain::OpenGeomFile(const QString& path)
1350 m_Scene.m_ObjSplit = ui.checkSplitOBJ->isChecked();
1352 m_ContextShare.BeginDrawTop();
1357 m_Scene.ImportFileAutoFmt(path);
1359 catch(const FileLoadErrorException& ex)
1362 msg += "Failed Load ";
1363 msg += path + "\n\n";
1364 msg += QString::fromLocal8Bit(ex.what());
1366 QMessageBox::warning(this, "", msg);
1370 m_ContextShare.EndDrawTop();
1372 RebuildObjectList();
1374 ResetSequenceSliderRange();
1381 AddRecentFile(path);
1386 void FormMain::ClearAllObjects(void)
1388 m_ContextShare.BeginDrawTop();
1390 m_Scene.ClearObjects();
1392 m_ContextShare.EndDrawTop();
1394 m_View3d.ClearRenderMap();
1396 RebuildObjectList();
1397 RefreshObjectSelectState();
1402 void FormMain::RebuildObjectList(void)
1404 QTreeWidget* obj_tree = ui.treeObjects;
1406 obj_tree->setCurrentItem(NULL);
1407 obj_tree->blockSignals(true);
1411 obj_tree->setSelectionBehavior(QAbstractItemView::SelectRows);
1412 obj_tree->setSelectionMode(QAbstractItemView::SingleSelection);
1413 obj_tree->setEditTriggers(QAbstractItemView::NoEditTriggers);
1415 obj_tree->setColumnCount(4);
1417 InitObjectListHeader();
1419 for (const geom::GeomObject& obj : m_Scene.m_Objects)
1421 QTreeWidgetItem* n = CreateObjectTreeNode(obj);
1422 PushbackTreeNode(ui.treeObjects, n);
1423 n->setExpanded(true);
1426 SetPrimayrSelectObjectFromScene();
1428 obj_tree->blockSignals(false);
1430 if (obj_tree->currentItem() == NULL)
1432 if (!m_Scene.m_Objects.empty())
1434 QTreeWidgetItem* ti = obj_tree->topLevelItem(0);
1435 obj_tree->setCurrentItem(ti);
1442 ResizeTreeColumns(obj_tree, 4);
1446 bool FormMain::IsCameraFile(const QString& path) const
1448 QFileInfo fInfo( path );
1449 QString ext = fInfo.suffix().toLower();
1450 return (ext == "camera");
1453 bool FormMain::OpenCameraFile(const QString& path)
1455 std::string fname = path.toLocal8Bit().data();
1457 if(!m_View3d.m_CameraRecord.LoadCamera(fname.c_str()))
1460 ui.listCamera->blockSignals(true);
1461 ui.listCamera->clear();
1462 for (size_t i = 0; i < m_View3d.m_CameraRecord.m_Records.size(); ++i)
1464 ui.listCamera->addItem( QString::number(i) );
1466 ui.listCamera->blockSignals(false);
1472 void FormMain::actionGeomStates_Triggered(bool)
1474 ApplyGeomStateFromGUI();
1476 m_Scene.UpdateTransform();
1481 void FormMain::ApplyGeomStateFromGUI(void)
1483 m_Scene.m_Config.m_EnableAutoCentering = ui.actionCentering->isChecked();
1484 m_Scene.m_Config.m_EnableAutoReisze = ui.actionAutoResize->isChecked();
1487 void FormMain::ApplyGeomStateDataoToGUI(void)
1489 ui.actionAutoResize ->setChecked( m_Scene.m_Config.m_EnableAutoReisze );
1490 ui.actionCentering ->setChecked( m_Scene.m_Config.m_EnableAutoCentering );
1492 ui.checkShowOnlySelect->setChecked(m_View3d.m_Config.m_ShowOnlySelect);
1495 void FormMain::on_actionGeomClear_triggered()
1501 void FormMain::on_actionUVFitView_triggered()
1507 void FormMain::on_actionSelObjectDelete_triggered()
1509 DeleteSelectedObject();
1512 void FormMain::on_actionSelObjectReload_triggered()
1514 GeomObject* obj = m_Scene.GetPrimaryObject();
1518 if (!obj->IsFileObject())
1520 QMessageBox::information(this, "", "IsNotFileObject");
1524 m_Scene.ReloadObject(obj);
1526 RebuildObjectList();
1528 m_View3d.ClearRenderMap();
1532 void FormMain::on_actionSelObjectVisible_triggered()
1534 FlipVisibleSelectedObject();
1537 void FormMain::on_actionSelObjectVertexOnlyMode_triggered()
1539 GeomObject* obj = m_Scene.GetPrimaryObject();
1543 obj->m_VertexOnlyMode = !obj->m_VertexOnlyMode;
1545 ui.actionSelObjectVertexOnlyMode->setChecked(obj->m_VertexOnlyMode);
1550 void FormMain::on_actionSelObjectFlipFace_triggered()
1552 m_Scene.FlipCurselFace(false);
1554 ui.GLWidgetMain->makeCurrent();
1555 std::vector<MeshBuf*> mv = m_Scene.GetCurSelMeshes();
1556 for (MeshBuf* m : mv)
1558 m_View3d.ReleaseRenderbuffer(m);
1560 ui.GLWidgetMain->doneCurrent();
1565 void FormMain::on_actionSelObjectFlipNormal_triggered()
1567 m_Scene.FlipCurselFace(true);
1569 ui.GLWidgetMain->makeCurrent();
1570 std::vector<MeshBuf*> mv = m_Scene.GetCurSelMeshes();
1571 for (MeshBuf* m : mv)
1573 m_View3d.ReleaseRenderbuffer(m);
1575 ui.GLWidgetMain->doneCurrent();
1580 void FormMain::on_actionSelObjectOpenDir_triggered()
1582 GeomObject* obj = m_Scene.GetPrimaryObject();
1586 if (!obj->IsFileObject())
1589 QString path = QString::fromLocal8Bit(obj->m_FilePath.c_str());
1590 QString p2 = QDir::toNativeSeparators(path);
1591 QGui::ShowExplorerFileSel(p2);
1594 void FormMain::on_actionShowOnlySelected_triggered()
1596 ShowObjectOnlySelected();
1599 void FormMain::on_actionSelObjectTriangulate_triggered()
1601 MeshBuf* mbuf = m_Scene.GetPrimaryMeshbuf();
1605 mbuf->Triangulate();
1607 m_View3d.ReleaseAllRenderBuffer();
1609 RebuildObjectList();
1613 void FormMain::on_actionTreeCollapseAll_triggered()
1615 TreeUtil::SetAllTopExpand(ui.treeObjects, false);
1618 void FormMain::on_actionTreeExpandAll_triggered()
1620 TreeUtil::SetAllTopExpand(ui.treeObjects, true);
1624 void FormMain::on_actionAddSample_triggered()
1626 SampleShapeBuilder::CreateSphere(m_Scene);
1630 void FormMain::on_actionAddGroundPlane_triggered()
1632 SampleShapeBuilder::CreateGroundPlane(m_Scene);
1636 void FormMain::OnDoneAddGeom(void)
1638 QTreeWidget* obj_tree = ui.treeObjects;
1640 const GeomObject& obj = m_Scene.m_Objects.back();
1642 obj_tree->setCurrentItem(NULL);
1643 obj_tree->blockSignals(true);
1645 QTreeWidgetItem* n = CreateObjectTreeNode(obj);
1646 PushbackTreeNode(obj_tree, n);
1647 n->setExpanded(true);
1649 SetPrimayrSelectObjectFromScene();
1651 obj_tree->blockSignals(false);
1653 if (obj_tree->currentItem() == NULL)
1655 if (!m_Scene.m_Objects.empty())
1657 QTreeWidgetItem * j = obj_tree->topLevelItem(0);
1658 obj_tree->setCurrentItem(j);
1665 ResizeTreeColumns(obj_tree, 4);
1667 ResetSequenceSliderRange();
1673 void FormMain::on_actionShaderDefault_triggered(bool)
1675 ChangeShaderMenuMain(ShaderType::Default);
1678 void FormMain::on_actionShaderPhong_triggered(bool)
1680 ChangeShaderMenuMain(ShaderType::Phong);
1683 void FormMain::on_actionShaderCustom_triggered(bool)
1685 ChangeShaderMenuMain(ShaderType::Custom);
1688 void FormMain::on_actionNormalColor_triggered(bool)
1690 ChangeShaderMenuMain(ShaderType::NormalColor);
1693 void FormMain::on_actionDepthColor_triggered(bool)
1695 ChangeShaderMenuMain(ShaderType::DepthColor);
1698 void FormMain::on_actionShadowmap_triggered(bool)
1700 ChangeShaderMenuMain(ShaderType::Shadowmap);
1703 void FormMain::on_actionEnvmap_triggered(bool)
1705 ChangeShaderMenuMain(ShaderType::Envmap);
1708 void FormMain::on_actionIntegrateShader_triggered(bool)
1710 ChangeShaderMenuMain(ShaderType::Integrate);
1713 void FormMain::on_actionMatcapShader_triggered(bool)
1715 ChangeShaderMenuMain(ShaderType::Matcap);
1718 void FormMain::SyncShaderSettingsToGUI(void)
1720 ChangeShaderMenuMain(m_View3d.m_Config.m_ShaderMode);
1723 void FormMain::ChangeShaderMenuMain(ShaderType type)
1725 m_View3d.m_Config.m_ShaderMode = type;
1730 void FormMain::on_actionCreate_Check_triggered()
1732 CreateSampleTextureMain(SampleTextureBuilder::TEX_CHECKER);
1735 void FormMain::on_actionCreate_Stripe_V_triggered()
1737 CreateSampleTextureMain(SampleTextureBuilder::TEX_STRIPE_V);
1740 void FormMain::on_actionCreate_Stripe_H_triggered()
1742 CreateSampleTextureMain(SampleTextureBuilder::TEX_STRIPE_H);
1745 void FormMain::CreateSampleTextureMain(SampleTextureBuilder::TextureType tex_type)
1747 m_ContextShare.BeginDrawTop();
1748 m_Scene.CreateSampleTexture(tex_type);
1749 m_ContextShare.EndDrawTop();
1754 bool FormMain::IsAutUVFit(void) const
1756 return ui.actionUVAutoFit->isChecked();
1760 void FormMain::on_pushDeleteSelectedObject_clicked()
1762 DeleteSelectedObject();
1765 void FormMain::on_treeObjects_itemChanged(QTreeWidgetItem * item, int column)
1767 QTreeWidget* obj_tree = ui.treeObjects;
1771 QTreeWidgetItem* t = item->parent();
1772 bool checked = (item->checkState(1) == Qt::Checked);
1775 int sel_idx = obj_tree->indexOfTopLevelItem(item);
1776 GeomObject& obj = m_Scene.m_Objects[sel_idx];
1777 obj.m_Visible = checked;
1781 int sel_idx = obj_tree->indexOfTopLevelItem(t);
1782 int midx = t->indexOfChild(item);
1784 GeomObject& obj = m_Scene.m_Objects[sel_idx];
1785 MeshBuf& mb = obj.m_MeshAry[midx];
1786 mb.m_Visible = checked;
1794 void FormMain::DeleteSelectedObject()
1796 QTreeWidget* obj_tree = ui.treeObjects;
1797 QTreeWidgetItem* ti = obj_tree->currentItem();
1801 QTreeWidgetItem* pn = ti->parent();
1805 sel_idx = obj_tree->indexOfTopLevelItem(ti);
1807 sel_idx = obj_tree->indexOfTopLevelItem(pn);
1812 m_ContextShare.BeginDrawTop();
1814 m_Scene.RemoveItem(sel_idx);
1816 m_ContextShare.EndDrawTop();
1818 m_View3d.ClearRenderMap();
1820 obj_tree->setCurrentItem(NULL);
1821 obj_tree->takeTopLevelItem(sel_idx);
1823 ResizeTreeColumns(obj_tree, 4);
1825 ti = obj_tree->currentItem();
1826 sel_idx = obj_tree->indexOfTopLevelItem(ti);
1827 m_Scene.m_Sels.SelectObject(sel_idx);
1829 m_Scene.UpdateTransform();
1831 RefreshObjectSelectState();
1833 ResetSequenceSliderRange();
1838 void FormMain::FlipVisibleSelectedObject()
1840 QTreeWidget* obj_tree = ui.treeObjects;
1841 QTreeWidgetItem * item = obj_tree->currentItem();
1845 item->setCheckState(1, FilpState(item->checkState(1)));
1848 Qt::CheckState FormMain::FilpState(Qt::CheckState state) const
1850 if(state == Qt::Checked)
1851 return Qt::Unchecked;
1856 void FormMain::ShowObjectOnlySelected(void)
1858 GeomObject* sel_obj = m_Scene.GetPrimaryObject();
1859 if (sel_obj == NULL)
1862 for (GeomObject& o : m_Scene.m_Objects)
1864 o.m_Visible = (sel_obj == &o);
1867 RebuildObjectList();
1871 void FormMain::ShowAllObject(void)
1873 m_Scene.ShowAllObject();
1875 RebuildObjectList();
1879 void FormMain::HideAllObject(void)
1881 m_Scene.HideAllObject();
1883 RebuildObjectList();
1887 void FormMain::on_actionUVResetView_triggered()
1889 m_View2d.ResetView();
1895 //!
\83\8f\83C
\83\84\81[
\83I
\81[
\83o
\81[
\83\8c\83C
\95\
\8e¦
\8e\9e\82Ì
\90F
\90Ý
\92è
1896 void FormMain::on_actionWireColor_triggered()
1898 m_WireColorSelDlg.exec();
1901 //!
\83f
\83t
\83H
\83\8b\83g
\83}
\83e
\83\8a\83A
\83\8b\82Ì
\90F
\90Ý
\92è
1902 void FormMain::on_actionFaceColor_triggered()
1904 const lib_graph::color4f& c = m_Scene.m_DefaultMaterial.m_Diffuse;
1906 m_DiffuseColorSelDlg.setOption(QColorDialog::ShowAlphaChannel);
1907 m_DiffuseColorSelDlg.setCurrentColor(ToQColor(c));
1908 m_DiffuseColorSelDlg.exec();
1911 //!
\94w
\8ci
\90F
\82Ì
\90Ý
\92è
1912 void FormMain::on_actionBackGroundColor_triggered()
1914 const lib_graph::color4f& c = m_View3d.m_BGColor;
1916 m_BGColorSelDlg.setCurrentColor(ToQColor(c));
1917 m_BGColorSelDlg.exec();
1920 void FormMain::WireOverlayColorChanged(const QColor & color)
1922 lib_graph::color3b& c = m_View3d.m_Config.m_WireColor;
1923 c.set(color.red(), color.green(), color.blue());
1925 m_View3d.ReleaseAllRenderBuffer();
1930 void FormMain::CopyRGB(lib_graph::color4f& c, const QColor & color)
1932 c.r() = (float)color.red() / 255.0f;
1933 c.g() = (float)color.green() / 255.0f;
1934 c.b() = (float)color.blue() / 255.0f;
1937 void FormMain::CopyRGBA(lib_graph::color4f& c, const QColor & color)
1939 c.r() = (float)color.red() / 255.0f;
1940 c.g() = (float)color.green() / 255.0f;
1941 c.b() = (float)color.blue() / 255.0f;
1942 c.a() = (float)color.alpha() / 255.0f;
1945 void FormMain::FaceDiffuseColorChanged(const QColor & color)
1947 lib_graph::color4f& c = m_Scene.m_DefaultMaterial.m_Diffuse;
1950 m_View3d.ReleaseAllRenderBuffer();
1954 void FormMain::BGColorChanged(const QColor & color)
1956 lib_graph::color4f& c = m_View3d.m_BGColor;
1962 void FormMain::SetSelectedMaterialColor(QColor col)
1964 lib_geo::BaseMaterial* mat = m_Scene.GetSelectedMaterial();
1968 if (m_SelMatColorWidget == ui.colorAmbient ) CopyRGBA(mat->m_Ambient , col);
1969 if (m_SelMatColorWidget == ui.colorEmission ) CopyRGBA(mat->m_Emission , col);
1970 if (m_SelMatColorWidget == ui.colorDiffuse ) CopyRGBA(mat->m_Diffuse , col);
1971 if (m_SelMatColorWidget == ui.colorSpecular ) CopyRGBA(mat->m_Specular , col);
1973 SetWidgetColor(m_SelMatColorWidget, col);
1976 void FormMain::SelMatColorChanged(const QColor & color)
1978 SetSelectedMaterialColor(color);
1979 m_View3d.ResetPrimaryObjectLists();
1984 void FormMain::on_actionWindowOptions_triggered()
1986 m_ViewConfigDlg.showNormal();
1987 m_ViewConfigDlg.show();
1988 m_ViewConfigDlg.activateWindow();
1991 void FormMain::on_actionWindowCustomShader_triggered()
1993 if (m_CustomShaderDlg == NULL)
1995 m_CustomShaderDlg = new FormCustomShader(this);
1996 m_CustomShaderDlg->SetShaderLibrary(&m_View3d.m_ShaderLib);
1997 m_CustomShaderDlg->SetParentWidget(ui.GLWidgetMain);
1998 m_CustomShaderDlg->LoadOrSetDefaultCode();
2001 SIGNAL(ShaderBuild()),
2003 SLOT(CustomShaderDlg_ShaderBuild()));
2006 m_CustomShaderDlg->showNormal();
2007 m_CustomShaderDlg->show();
2008 m_CustomShaderDlg->activateWindow();
2012 void FormMain::ConfigChangedDlg_ConfigChanged()
2014 m_View3d.ReleaseAllRenderBuffer();
2018 void FormMain::CrossSectionDlg_ConfigChanged()
2024 void FormMain::OnPaintImage(QPrinter *printer)
2026 QPainter painter(printer);
2028 QRect rect = painter.viewport();
2029 QSize size = this->size();
2030 size.scale(rect.size(), Qt::KeepAspectRatio);//
\8fc
\89¡
\94ä
\88Û
\8e\9d
2032 painter.setViewport(rect.x(), rect.y(), size.width(), size.height());
2033 painter.setWindow(this->rect());
2035 this->render(&painter);
2038 void FormMain::on_actionPrint_triggered()
2043 void FormMain::on_actionPrintPreview_triggered()
2048 void FormMain::PrintImage(bool WithPreview)
2050 //QPrinter printer(QPrinter::ScreenResolution);
2051 QPrinter printer(QPrinter::ScreenResolution);
2055 QPrintPreviewDialog preview(&printer, this);
2056 preview.setWindowFlags( Qt::Window );
2059 SIGNAL(paintRequested(QPrinter *)),
2060 SLOT(OnPaintImage(QPrinter *)));
2062 preview.showMaximized();
2067 QPrintDialog printDialog(&printer, this);
2068 if(printDialog.exec() == QDialog::Accepted)
2069 OnPaintImage(&printer);
2074 void FormMain::on_pushButtonAddCameraRecord_clicked()
2076 m_View3d.RecordCamera();
2078 ui.listCamera->addItem( QString::number(ui.listCamera->count()) );
2083 void FormMain::on_pushButtonDeleteCameraRecord_clicked()
2085 int idx = ui.listCamera->currentRow();
2089 m_View3d.RemoveRecordedCamera(idx);
2091 for (int i = idx+1; i < ui.listCamera->count(); ++i)
2093 ui.listCamera->item(i)->setText(QString::number(i - 1));
2096 ui.listCamera->takeItem(idx);
2101 void FormMain::on_pushCameraRecordClear_clicked()
2103 m_View3d.ClearRecordedCamera();
2105 ui.listCamera->clear();
2110 void FormMain::on_listCamera_itemDoubleClicked(QListWidgetItem *item)
2112 int idx = ui.listCamera->currentRow();
2116 m_View3d.MoveToRecordedCamera(idx, ui.checkCameraAnimation->isChecked());
2119 void FormMain::on_actionSaveCamera_triggered()
2121 QString title = "camera";
2122 QString filter = "Camera File(*.camera)";
2123 QString fileName = GetFilePathFromSaveDlg(title, filter);
2124 if (fileName.isEmpty())
2127 m_View3d.m_CameraRecord.SaveCamera(fileName.toLocal8Bit().data());
2130 void FormMain::on_actionProjectionOrtho_triggered()
2132 ui.actionProjectionOrtho->setChecked(true);
2133 ui.actionProjectionPers->setChecked(false);
2135 m_View3d.m_Camera.m_ProjMode = gl::Camera::PROJ_ORTHO;
2140 void FormMain::on_actionProjectionPers_triggered()
2142 ui.actionProjectionPers->setChecked(true);
2143 ui.actionProjectionOrtho->setChecked(false);
2145 m_View3d.m_Camera.m_ProjMode = gl::Camera::PROJ_PERS;
2151 void FormMain::CustomShaderDlg_ShaderBuild()
2156 void FormMain::OnAnimationTimerUpdated()
2158 static const float rot_speed = 0.005f;
2160 if (ui.actionRotateCamera->isChecked())
2162 m_View3d.m_Camera.m_Manip.Tumble(rot_speed, 0.0f);
2163 UpdateCameraStatus();
2166 if (ui.actionRotateLight->isChecked())
2167 m_View3d.m_ControlLight.m_Position.rotate_y(rot_speed);
2169 if (ui.actionAnimation->isChecked())
2172 if (IsLastSequence())
2173 ui.actionAnimation->setChecked(false);
2179 void FormMain::on_actionRotateCamera_toggled(bool checked)
2184 void FormMain::on_actionRotateLight_toggled(bool checked)
2189 void FormMain::on_actionAnimation_toggled(bool checked)
2193 if (IsLastSequence())
2195 QSlider* s = ui.sliderSequence;
2203 void FormMain::UpdateAnimState(void)
2205 if (IsEnableAnimation())
2206 m_AnimationTimer.start();
2208 m_AnimationTimer.stop();
2211 bool FormMain::IsEnableAnimation(void)
2213 if (ui.actionRotateCamera->isChecked())
2215 if (ui.actionRotateLight->isChecked())
2217 if (ui.actionAnimation->isChecked())
2223 void FormMain::on_actionCrossSectionDlg_triggered()
2225 m_CrossSectionDlg.showNormal();
2226 m_CrossSectionDlg.show();
2227 m_CrossSectionDlg.activateWindow();
2230 void FormMain::on_actionSelectNext_triggered()
2232 AddSelectObjectIdx(1);
2235 void FormMain::on_actionSelectPrev_triggered()
2237 AddSelectObjectIdx(-1);
2240 void FormMain::AddSelectObjectIdx(int step)
2242 QTreeWidget* obj_tree = ui.treeObjects;
2244 int num_obj = obj_tree->topLevelItemCount();
2248 QTreeWidgetItem * i = obj_tree->currentItem();
2249 int idx = obj_tree->indexOfTopLevelItem(i);
2254 else if (idx >= num_obj)
2257 QTreeWidgetItem * j = obj_tree->topLevelItem(idx);
2258 obj_tree->setCurrentItem(j);
2261 void FormMain::on_actionSwitchVisible_triggered()
2263 FlipVisibleSelectedObject();
2266 void FormMain::on_actionActionSelObjectShowOnlyOnce_triggered()
2268 ShowObjectOnlySelected();
2271 void FormMain::on_actionHideAll_triggered()
2276 void FormMain::on_actionShowAll_triggered()
2281 void FormMain::on_actionVertexBuilder_triggered()
2283 FormVertexBuilder builder;
2284 builder.CreateVertex(m_Scene);
2286 RebuildObjectList();
2290 void FormMain::on_actionFullScreen_triggered()
2292 m_FullscreenPanel.ShowWidgetAsFullscreen(ui.splitter, ui.gridLayout_4);
2295 void FormMain::on_actionResetConfig_triggered()
2297 QString msg = QString::fromLocal8Bit("
\90Ý
\92è
\82ð
\83\8a\83Z
\83b
\83g
\82µ
\82Ü
\82·");
2298 if (QMessageBox::question(this, "", msg, QMessageBox::Ok|QMessageBox::Cancel) != QMessageBox::Ok)
2301 setGeometry(m_InitRect);
2303 LoadDefaultConfig();
2305 SyncViewSettingsFromGUI();
2306 SyncUVViewSettingsFromGUI();
2307 ApplyGeomStateFromGUI();
2308 SyncShaderSettingsToGUI();
2311 QString FormMain::GetFilePathFromOpenDlg(const QString& title, const QString& filter)
2313 QString default_path = GetNextDefaultPathForFileDlg();
2314 QString s = QFileDialog::getOpenFileName(this, title, default_path, filter);
2317 m_LastFileDialogDir = QFileInfo(s).absolutePath();
2322 QString FormMain::GetFilePathFromSaveDlg(const QString& title, const QString& filter)
2324 QString default_path = GetNextDefaultPathForFileDlg();
2325 QString s = QFileDialog::getSaveFileName(this, title, default_path, filter);
2328 m_LastFileDialogDir = QFileInfo(s).absolutePath();
2333 bool FormMain::IsSupportedTextureExt(const QString& path) const
2335 QString ext = QFileInfo(path).suffix().toLower();
2337 std::map<QString, bool> types;
2338 types[ "png" ] = true;
2339 types[ "jpg" ] = true;
2340 types[ "jepg" ] = true;
2341 types[ "bmp" ] = true;
2342 types[ "tif" ] = true;
2343 types[ "tiff" ] = true;
2348 QString FormMain::GetSupportedImageFilePathFromDlg(const QString& title)
2350 FileDlgFilterList exts;
2351 exts.Add( "Png" , "png" );
2352 exts.Add( "Jpg" , "jpg" );
2353 exts.Add( "Jpg" , "jpeg" );
2354 exts.Add( "Bmp" , "bmp" );
2355 exts.Add( "Tif" , "tif" );
2356 exts.Add( "Tif" , "tiff" );
2358 QString filter = FileDlgUtil::ExtListToDlgFilter("Image", exts);
2359 return GetFilePathFromOpenDlg(title, filter);
2363 QString FormMain::GetNextDefaultPathForFileDlg(void)
2365 if (m_LastFileDialogDir.isEmpty())
2366 return PathInfo::GetMyDocDirPath();
2368 return m_LastFileDialogDir;
2372 void FormMain::on_toolLoadEnvMap_clicked()
2374 QString fileName = GetSupportedImageFilePathFromDlg("Open envmap");
2375 if (fileName.isEmpty())
2378 LoadEnvMap(fileName);
2381 void FormMain::LoadEnvMap(QString& path)
2383 m_ContextShare.BeginDrawTop();
2384 m_Scene.m_EnvImg.LoadTexture(path.toLocal8Bit().data());
2385 m_ContextShare.EndDrawTop();
2387 QString title = QFileInfo(path).fileName();
2388 ui.editEnvMap->setText(title);
2393 void FormMain::on_buttonReleaseEnvImg_clicked()
2395 m_ContextShare.BeginDrawTop();
2396 m_Scene.m_EnvImg.ClearEnv();
2397 m_ContextShare.EndDrawTop();
2399 ui.editEnvMap->clear();
2404 void FormMain::on_buttonPresetEnvMap_clicked()
2406 if (m_EnvmapDlg == NULL)
2408 m_EnvmapDlg = new EnvmapSelectDlg(this);
2411 SIGNAL(ListSelectChanged()),
2413 SLOT(EnvmapDlg_ListSelectChanged()));
2416 m_EnvmapDlg->show();
2419 void FormMain::EnvmapDlg_ListSelectChanged()
2421 QString p = m_EnvmapDlg->GetSelectedItemPath();
2428 void FormMain::on_toolLoadMatcap_clicked()
2430 QString fileName = GetSupportedImageFilePathFromDlg("Open matcap");
2431 if (fileName.isEmpty())
2434 LoadMatcapImage(fileName);
2437 void FormMain::on_buttonReleaseMatcap_clicked()
2439 m_ContextShare.BeginDrawTop();
2440 m_Scene.m_MatcapImg.ClearEnv();
2441 m_ContextShare.EndDrawTop();
2443 ui.editMatcap->clear();
2448 void FormMain::on_buttonLoadMatcapPreset_clicked()
2450 if (m_MatcapDlg == NULL)
2452 m_MatcapDlg = new MatcapSelectDlg(this);
2455 SIGNAL(ListSelectChanged()),
2457 SLOT(MatcapDlg_ListSelectChanged()));
2460 m_MatcapDlg->show();
2463 void FormMain::MatcapDlg_ListSelectChanged()
2465 QString p = m_MatcapDlg->GetSelectedItemPath();
2472 void FormMain::on_sliderEnvReflection_valueChanged(int value)
2474 float r = GetSliderNormalizedPos(ui.sliderEnvReflection);
2475 m_Scene.m_EnvImg.m_EnvReflection = r;
2481 void FormMain::on_comboCoordinate_currentIndexChanged(int index)
2483 SceneTransform& transform = m_Scene.m_WorldTransform;
2485 int idx = ui.comboCoordinate->currentIndex();
2488 case 0: transform.SetCoordType(geom::SceneTransform::COORD_RUF); break;
2489 case 1: transform.SetCoordType(geom::SceneTransform::COORD_FRU); break;
2490 case 2: transform.SetCoordType(geom::SceneTransform::COORD_UFR); break;
2491 case 3: transform.SetCoordType(geom::SceneTransform::COORD_RUB); break;
2492 case 4: transform.SetCoordType(geom::SceneTransform::COORD_BRU); break;
2493 case 5: transform.SetCoordType(geom::SceneTransform::COORD_UBR); break;
2501 void FormMain::on_sliderShadowDarkness_valueChanged(int value)
2503 int b = ui.sliderShadowDarkness->minimum();
2504 int t = ui.sliderShadowDarkness->maximum();
2506 float r = (float)(value - b) / (float)(t - b);
2507 m_Scene.m_ShadowConfig.m_ShadowDarkness = r;
2512 void FormMain::on_buttonClearAllGeoms_clicked()
2517 //!
\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³
2518 void FormMain::on_checkCameraAnimation_toggled(bool checked)
2523 void FormMain::on_actionOpenAppdir_triggered()
2525 PathInfo::OpenAppDir();
2528 void FormMain::on_actionOpenConfigDir_triggered()
2530 PathInfo::OpenConfigDir();
2533 void FormMain::on_buttonDecGridAxis_clicked()
2535 m_View3d.m_GridAxisScale /= 10.0f;
2539 void FormMain::on_buttonIncGridAxis_clicked()
2541 m_View3d.m_GridAxisScale *= 10.0f;
2545 void FormMain::on_buttonResetGridAxis_clicked()
2547 m_View3d.m_GridAxisScale = 1.0f;
2552 void FormMain::View3D_SelectedObjectChanged(int sel_obj, int sel_mesh)
2554 QTreeWidgetItem* on = ui.treeObjects->topLevelItem(sel_obj);
2558 ui.treeObjects->setCurrentItem(on);
2562 QTreeWidgetItem* mn = on->child(sel_mesh);
2563 ui.treeObjects->setCurrentItem(mn);
2567 void FormMain::View3D_SelectedMatChanged(int sel_idx)
2569 ui.listMaterial->setCurrentRow(sel_idx);
2572 void FormMain::View3D_CameraMoved(void)
2574 UpdateCameraStatus();
2577 void FormMain::View3D_StatusTipChanged(QString msg)
2579 //ui.statusBar->showMessage(msg, 1500);
2582 void FormMain::View3D_SequenceStepped(int step)
2587 void FormMain::View3D_CursorMoved()
2589 Cursor3D& c = m_Scene.m_Cursor3d;
2590 QString x = QString::number(c.CursorPos.x, 'f', 4);
2591 QString y = QString::number(c.CursorPos.y, 'f', 4);
2592 QString z = QString::number(c.CursorPos.z, 'f', 4);
2606 ui.editCursorPos->setText(s);
2609 void FormMain::StepSequence(int step)
2611 QSlider* s = ui.sliderSequence;
2612 s->setValue(s->value() + step);
2615 bool FormMain::IsLastSequence(void)
2617 QSlider* s = ui.sliderSequence;
2618 return s->value() == s->maximum();
2621 void FormMain::UpdateCameraStatus(void)
2623 const Camera& camera = m_View3d.m_Camera;
2624 const lib_gl::CameraManipulator& manip = camera.m_Manip;
2625 const lm::vec3f& vp = manip.m_ViewPos;
2628 manip.GetViewAngles(a, b);
2629 a = a * 180.0f / M_PI;
2630 b = b * 180.0f / M_PI;
2634 msg += QString::number(vp.x, 'f', 2) + " ";
2635 msg += QString::number(vp.y, 'f', 2) + " ";
2636 msg += QString::number(vp.z, 'f', 2);
2640 msg += QString::number(a, 'f', 2) + " ";
2641 msg += QString::number(b, 'f', 2);
2645 msg += QString::number(camera.m_Projection.m_Near, 'f', 2) + " ";
2646 msg += QString::number(camera.m_Projection.m_Far, 'f', 2);
2649 m_StatusBar1->setText(msg);
2652 void FormMain::on_actionCameraFPSMode_toggled(bool arg1)
2654 m_View3d.m_FpsMode = arg1;
2658 void FormMain::actionCursorMenuStates_Toggled(bool)
2660 m_Binder_Cursor.UpdateAllData();
2664 void FormMain::on_actionResetCursor_triggered()
2666 m_Scene.m_Cursor3d.ResetCursorPos();
2667 m_Scene.m_Cursor3d.UpdateNormal(m_View3d.m_Camera.m_Manip.GetFront());
2671 void FormMain::on_actionResetMeasure_triggered()
2673 m_View3d.ResetCursorMeasure();
2678 void FormMain::on_actionPyScript_triggered()
2680 if (m_PyScriptDlg == NULL)
2682 m_PyScriptDlg = new FormPyScript(this);
2683 m_PyScriptDlg->m_Scene = &m_Scene;
2684 m_PyScriptDlg->m_View3d = &m_View3d;
2685 m_PyScriptDlg->m_View2d = &m_View2d;
2688 m_PyScriptDlg->showNormal();
2689 m_PyScriptDlg->show();
2690 m_PyScriptDlg->activateWindow();
2693 void FormMain::on_actionConsole_triggered()
2696 freopen( "CON", "r", stdin );
2697 freopen( "CON", "w", stdout );
2701 void FormMain::on_actionClearVertSelect_triggered()
2703 m_Scene.ClearAllVertSelect();
2708 void FormMain::on_action_About_triggered()
2714 void FormMain::on_action_Association_triggered()
2716 m_AssociationDlg.exec();
2719 void FormMain::on_actionLookDepth_triggered()
2721 m_View3d.LookDepth();
2724 void FormMain::on_actionLook3DCursor_triggered()
2726 m_View3d.Look3DCursor();
2729 void FormMain::on_sliderLightPower_valueChanged(int value)
2731 float val = (float)ui.sliderLightPower->value();
2732 float val_max = (float)ui.sliderLightPower->maximum();
2733 float n = 2.0f * val / val_max;
2735 m_View3d.SetLightStrengthByStdRatio(n);
2737 ui.labelLightPower->setText(QString("LightPower ") + QString::number(n, 'f', 2));
2742 void FormMain::on_buttonResetLightPower_clicked()
2744 ui.sliderLightPower->setValue(1000);
2747 void FormMain::on_checkHoleAroundCursor_clicked(bool checked)
2750 ui.checkShowOnlyAroundCursor->setChecked(false);
2753 m_Scene.m_Cursor3d.CircleClip = Cursor3DCircleClip::Hole;
2755 m_Scene.m_Cursor3d.CircleClip = Cursor3DCircleClip::None;
2760 void FormMain::on_checkShowOnlyAroundCursor_toggled(bool checked)
2763 ui.checkHoleAroundCursor->setChecked(false);
2766 m_Scene.m_Cursor3d.CircleClip = Cursor3DCircleClip::ShowAround;
2768 m_Scene.m_Cursor3d.CircleClip = Cursor3DCircleClip::None;
2773 void FormMain::on_sliderCursorHoleRange_valueChanged(int value)
2775 float val = (float)ui.sliderCursorHoleRange->value();
2776 float maxval = (float)ui.sliderCursorHoleRange->maximum();
2777 float n = val / maxval;
2779 m_Scene.m_Cursor3d.HoleRangeRatio = n;
2783 void FormMain::on_buttonResetCursorHoleRange_clicked()
2788 void FormMain::ResetHoleRange(void)
2790 ui.sliderCursorHoleRange->setValue(500);
2793 void FormMain::on_actionSaveImageToMydoc_triggered()
2795 QString path = PathInfo::GetMyDocDirPath();
2796 QString basename = path + "/" + "qgv_snap_";
2798 QDateTime dt = QDateTime::currentDateTime();
2803 QString tp = dt.toString("yyyyMMdd_hhmmss_zzz");
2804 dst = basename + tp + ".png";
2805 if (!QFile(dst).exists())
2809 ui.GLWidgetMain->grabFrameBuffer().save(dst);
2812 void FormMain::on_actionPostProcNone_triggered()
2814 ChangePostprocMode(PostProcType::None);
2817 void FormMain::on_actionPostProcAntialias_triggered()
2819 ChangePostprocMode(PostProcType::Antialias);
2822 void FormMain::on_actionPostProcBorder_triggered()
2824 ChangePostprocMode(PostProcType::Border);
2827 void FormMain::on_actionPostProcDepthLayerColor_triggered()
2829 ChangePostprocMode(PostProcType::DepthLayerColor);
2832 void FormMain::on_actionPostProcDepthColor_triggered()
2834 ChangePostprocMode(PostProcType::DepthColor);
2837 void FormMain::on_actionPostProcDepthOfField_triggered()
2839 ChangePostprocMode(PostProcType::DepthOfField);
2842 void FormMain::ChangePostprocMode(PostProcType type)
2844 m_View3d.m_Config.m_PPMode = type;
2848 void FormMain::on_sliderDOFPint_valueChanged(int value)
2850 float n = GetSliderNormalizedPos(ui.sliderDOFPint);
2851 m_View3d.m_PPContext.m_DOFPintPos = n;
2856 void FormMain::on_sliderDOFRange_valueChanged(int value)
2858 float n = GetSliderNormalizedPos(ui.sliderDOFRange);
2859 m_View3d.m_PPContext.m_DOFRange = 10.0f * n;
2864 float FormMain::GetSliderNormalizedPos(const QSlider* slider) const
2866 float t = (float)slider->maximum();
2867 float b = (float)slider->minimum();
2868 float v = (float)slider->value();
2870 return (v - b) / (t - b);
2873 void FormMain::on_buttonResetDOFPint_clicked()
2875 ui.sliderDOFPint->setValue(1000);
2878 void FormMain::on_buttonResetDOFRange_clicked()
2880 ui.sliderDOFRange->setValue(1000);
2883 void FormMain::on_actionAddCrossSectionRecord_triggered()
2885 m_Scene.AddCrossSectionRecord();
2889 void FormMain::on_actionClearCrossSectionRecord_triggered()
2891 m_Scene.ClearCrossSectionRecord();
2895 void FormMain::LoadCurSelMatTexture(TextureType type)
2897 QString path = GetSupportedImageFilePathFromDlg("Load Texture");
2901 LoadCurSelMatTexture(type, path);
2904 void FormMain::LoadCurSelMatTexture(TextureType type, QString filepath)
2906 GeomTextureSet* ts = m_Scene.GetSelectedTexture();
2910 MeshBuf* mbuf = ts->GetParent();
2911 std::string fp = filepath.toLocal8Bit().data();
2913 QString name_qs = QFileInfo(filepath).fileName();
2914 std::string name = name_qs.toLocal8Bit().data();
2916 m_ContextShare.BeginDrawTop();
2918 mbuf->ReleaseTextureUnit(ts, type);
2919 gl::GlTexture* tex = mbuf->GetInitTexture(fp, name, m_Scene.m_TexConfig);
2920 ts->SetTextureUnit(type, tex);
2922 if (type == TextureType::Normal)
2923 m_View3d.ReleaseAllRenderBuffer();
2925 m_ContextShare.EndDrawTop();
2927 OnChangedSelectedMaterial();
2931 void FormMain::ReleaseCurSelTexture(TextureType type)
2933 MeshBuf* mbuf = m_Scene.GetPrimaryMeshbuf();
2937 int mat_idx = m_Scene.m_Sels.GetSelMat();
2939 m_ContextShare.BeginDrawTop();
2940 mbuf->ReleaseTextureUnit(mat_idx, type);
2941 m_ContextShare.EndDrawTop();
2943 OnChangedSelectedMaterial();
2947 void FormMain::LoadMatcapImageForCurrentMat(QString& path)
2949 GeomTextureSet* ts = m_Scene.GetSelectedTexture();
2951 QString title = QFileInfo(path).fileName();
2953 m_ContextShare.BeginDrawTop();
2954 ts->TexMatcap.LoadTexture(path.toLocal8Bit().data());
2955 ts->TexMatcap.SetName(title);
2956 m_ContextShare.EndDrawTop();
2958 OnChangedSelectedMaterial();
2962 void FormMain::LoadMatcapImage(QString& path)
2964 MatcapImage& mc = m_Scene.m_MatcapImg;
2966 QString title = QFileInfo(path).fileName();
2968 ui.editMatcap->setText(mc.GetName());
2970 m_ContextShare.BeginDrawTop();
2971 mc.LoadTexture(path.toLocal8Bit().data());
2973 m_ContextShare.EndDrawTop();
2978 void FormMain::on_buttonOpenMatCapEachMaterial_clicked()
2980 QString path = GetSupportedImageFilePathFromDlg("Load Texture");
2984 LoadMatcapImage(path);
2987 void FormMain::on_buttonClearMatCapEachMaterial_clicked()
2989 geom::GeomTextureSet* tex = m_Scene.GetSelectedTexture();
2993 m_ContextShare.BeginDrawTop();
2994 tex->TexMatcap.ClearEnv();
2995 m_ContextShare.EndDrawTop();
2997 ui.editMatCapEachMaterial->clear();
3002 void FormMain::on_buttonOpenCurrentMatColorMap_clicked()
3004 LoadCurSelMatTexture(TextureType::Color);
3007 void FormMain::on_buttonClearCurrentMatColorMap_clicked()
3009 ReleaseCurSelTexture(TextureType::Color);
3012 void FormMain::on_buttonOpenCurrentMatNormalMap_clicked()
3014 LoadCurSelMatTexture(TextureType::Normal);
3017 void FormMain::on_buttonClearCurrentMatNormalMap_clicked()
3019 ReleaseCurSelTexture(TextureType::Normal);
3022 void FormMain::ChangeMatlemColor(QWidget* col_widget)
3024 lib_geo::BaseMaterial* mat = m_Scene.GetSelectedMaterial();
3028 lib_graph::color4f* col;
3030 if (col_widget == ui.colorAmbient ) col = &mat->m_Ambient ;
3031 if (col_widget == ui.colorEmission ) col = &mat->m_Emission ;
3032 if (col_widget == ui.colorDiffuse ) col = &mat->m_Diffuse ;
3033 if (col_widget == ui.colorSpecular ) col = &mat->m_Specular ;
3035 lib_graph::color4f src = *col;
3037 QColor dc = ToQColor(*col);
3039 m_SelMatColorWidget = col_widget;
3041 m_SelMatColorSelDlg.setOption(QColorDialog::ShowAlphaChannel);
3042 m_SelMatColorSelDlg.setCurrentColor(dc);
3043 if (m_SelMatColorSelDlg.exec() == QDialog::Rejected)
3046 SetWidgetColor(col_widget, dc);
3050 void FormMain::on_buttonDiffuse_clicked()
3052 ChangeMatlemColor(ui.colorDiffuse);
3055 void FormMain::on_buttonAmbient_clicked()
3057 ChangeMatlemColor(ui.colorAmbient);
3060 void FormMain::on_buttonEmission_clicked()
3062 ChangeMatlemColor(ui.colorEmission);
3065 void FormMain::on_buttonSpecular_clicked()
3067 ChangeMatlemColor(ui.colorSpecular);
3070 void FormMain::SetWidgetColor(QWidget* w, QColor col)
3072 QString ss = QString("background-color: %1").arg(col.name());
3073 w->setStyleSheet(ss);
3076 void FormMain::on_sliderShininess_valueChanged(int value)
3078 lib_geo::BaseMaterial* mat = m_Scene.GetSelectedMaterial();
3082 float val = (float)ui.sliderShininess->value();
3083 float val_max = (float)ui.sliderShininess->maximum();
3085 float real_val = 200.0f * val / val_max;
3087 mat->m_Shininess = real_val;
3089 ui.labelShininessVal->setText(QString::number(real_val, 'f', 2));
3094 void FormMain::CreateRecentFilesMenu(const std::vector<QString>& path)
3096 QMenu* recents = ui.menuOpenRecent;
3097 recents->actions().clear();
3099 for (size_t i = 0; i < path.size(); ++i)
3101 AddRecentFile(path[path.size() - i - 1]);
3105 void FormMain::CreateRecentFilesFromMenu(std::vector<QString>& path)
3107 QMenu* recents = ui.menuOpenRecent;
3108 for (int i = 0; i < recents->actions().size(); ++i)
3110 QAction* a = recents->actions().at(i);
3111 path.push_back(a->text());
3115 void FormMain::AddRecentFile(const QString& path)
3117 QString path_local = QDir::toNativeSeparators(path);
3119 static const int max_files = 10;
3121 QMenu* recents = ui.menuOpenRecent;
3123 for (int i = 0; i < recents->actions().size(); ++i)
3125 QAction* a = recents->actions().at(i);
3126 if (a->text() == path_local)
3128 recents->removeAction(a);
3133 QAction* new_path = new QAction(path_local, this);
3136 SIGNAL(triggered()),
3138 SLOT(OnOpenRecent()));
3140 if (recents->actions().empty())
3141 recents->addAction(new_path);
3143 recents->insertAction(recents->actions().front(), new_path);
3145 if (recents->actions().size() > max_files)
3147 QAction* a = recents->actions().back();
3148 recents->removeAction(a);
3152 void FormMain::OnOpenRecent()
3154 QAction* a = dynamic_cast<QAction*>(QObject::sender());
3159 QString path = a->text();
3161 if (IsResetSceneOnBeforeLoadFile())
3164 if (OpenGeomFile(path))
3168 void FormMain::on_checkShowOnlySelect_toggled(bool checked)
3170 m_View3d.m_Config.m_ShowOnlySelect = checked;
3174 void FormMain::ResizeTreeColumns(QTreeWidget* t, int num_col)
3176 t->setVisible(false);
3177 t->resizeColumnToContents(0);
3178 t->resizeColumnToContents(1);
3179 t->resizeColumnToContents(2);
3180 t->resizeColumnToContents(3);
3181 t->setVisible(true);
3184 void FormMain::PushbackTreeNode(QTreeWidget* tree, QTreeWidgetItem *node)
3186 int next_idx = tree->topLevelItemCount();
3187 tree->insertTopLevelItem(next_idx, node);
3190 QTreeWidgetItem* FormMain::CreateObjectTreeNode(const geom::GeomObject& obj) const
3192 QTreeWidgetItem* n = new QTreeWidgetItem;
3194 n->setText(0, QString::fromLocal8Bit(obj.m_Name.c_str()));
3195 n->setCheckState(1, obj.m_Visible ? Qt::Checked : Qt::Unchecked);
3196 n->setText(2, QString::number(obj.GetNumTotalVerts()));
3197 n->setText(3, QString::number(obj.GetNumTotalFaces()));
3200 for (const MeshBuf& mbuf : obj.m_MeshAry)
3202 n->addChild(CreateMeshBufNode(obj, mbuf, idx++));
3205 n->setExpanded(true);
3210 QTreeWidgetItem* FormMain::CreateMeshBufNode(const geom::GeomObject& obj, const MeshBuf& mbuf, int idx) const
3212 QTreeWidgetItem* n = new QTreeWidgetItem;
3215 if (mbuf.m_Name.empty())
3216 name = QString::fromLocal8Bit(obj.m_Name.c_str()) + QString::number(idx);
3218 name = QString::fromLocal8Bit(mbuf.m_Name.c_str());
3220 n->setText(0, name);
3221 n->setCheckState(1, mbuf.m_Visible ? Qt::Checked : Qt::Unchecked);
3222 n->setText(2, QString::number(mbuf.GetNumVerts()));
3223 n->setText(3, QString::number(mbuf.GetNumFaces()));
3228 void FormMain::InitObjectListHeader(void)
3231 qs << "Name" << "Visible" << "Verts" << "Faces";
3232 ui.treeObjects->setHeaderLabels(qs);
3235 void FormMain::SetPrimayrSelectObjectFromScene(void)
3237 QTreeWidget* obj_tree = ui.treeObjects;
3239 Selection3D& sels = m_Scene.m_Sels;
3240 if (!sels.IsObjectSelected())
3243 int sel_idx = sels.GetSelObjectIdx();
3245 QTreeWidgetItem* on = obj_tree->topLevelItem(sel_idx);
3249 if (sels.IsMBufSelected())
3251 QTreeWidgetItem* mn = on->child(sels.GetMBufIdx());
3252 obj_tree->setCurrentItem(mn);
3256 obj_tree->setCurrentItem(on);
3260 void FormMain::SetPrimayrSelectObjectToScene(void)
3262 Selection3D& sels = m_Scene.m_Sels;
3264 QTreeWidget* tree = ui.treeObjects;
3266 QTreeWidgetItem* sel_node = tree->currentItem();
3267 if (sel_node == NULL)
3270 QTreeWidgetItem* on = sel_node->parent();
3273 int obj_idx = tree->indexOfTopLevelItem(sel_node);
3274 sels.SelectObject(obj_idx);
3278 int obj_idx = tree->indexOfTopLevelItem(on);
3279 int mb_idx = on->indexOfChild(sel_node);
3280 sels.SelectMBuf(obj_idx, mb_idx);
3284 void FormMain::on_actionReleaseShader_triggered()
3286 m_ContextShare.BeginDrawTop();
3288 m_View3d.m_ShaderLib.ReleaseAllShaders();
3290 m_ContextShare.EndDrawTop();
3293 void FormMain::on_combo2DViewSrcType_currentIndexChanged(int index)
3297 case 0 : return m_View2d.ChangeTextureSource(View2DTexSrc::Color);
3298 case 1 : return m_View2d.ChangeTextureSource(View2DTexSrc::Normal);
3305 void FormMain::on_sliderSequence_valueChanged(int value)
3310 void FormMain::ResetSequenceSliderRange(void)
3312 int m = m_Scene.GetKeyframeMax();
3313 ui.sliderSequence->setMaximum(m);
3317 void FormMain::UpdateSequence(void)
3319 int v = ui.sliderSequence->value();
3320 int m = ui.sliderSequence->maximum();
3322 QString s = QString("%1 / %2").arg(v).arg(m);
3323 ui.labelSequencePos->setText(s);
3325 m_Scene.SetFrame(v);
3327 m_View3d.ReleaseAllRenderBuffer();
3331 void FormMain::on_actionNewStroke_triggered()
3333 m_Scene.m_Cursor3d.CutStroke();
3337 void FormMain::on_actionClearStroke_triggered()
3339 m_Scene.m_Cursor3d.ClearStroke();