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();
1531 void FormMain::on_actionSelObjectVisible_triggered()
1533 FlipVisibleSelectedObject();
1536 void FormMain::on_actionSelObjectVertexOnlyMode_triggered()
1538 GeomObject* obj = m_Scene.GetPrimaryObject();
1542 obj->m_VertexOnlyMode = !obj->m_VertexOnlyMode;
1544 ui.actionSelObjectVertexOnlyMode->setChecked(obj->m_VertexOnlyMode);
1549 void FormMain::on_actionSelObjectFlipFace_triggered()
1551 m_Scene.FlipCurselFace(false);
1553 ui.GLWidgetMain->makeCurrent();
1554 std::vector<MeshBuf*> mv = m_Scene.GetCurSelMeshes();
1555 for (MeshBuf* m : mv)
1557 m_View3d.ReleaseRenderbuffer(m);
1559 ui.GLWidgetMain->doneCurrent();
1564 void FormMain::on_actionSelObjectFlipNormal_triggered()
1566 m_Scene.FlipCurselFace(true);
1568 ui.GLWidgetMain->makeCurrent();
1569 std::vector<MeshBuf*> mv = m_Scene.GetCurSelMeshes();
1570 for (MeshBuf* m : mv)
1572 m_View3d.ReleaseRenderbuffer(m);
1574 ui.GLWidgetMain->doneCurrent();
1579 void FormMain::on_actionSelObjectOpenDir_triggered()
1581 GeomObject* obj = m_Scene.GetPrimaryObject();
1585 if (!obj->IsFileObject())
1588 QString path = QString::fromLocal8Bit(obj->m_FilePath.c_str());
1589 QString p2 = QDir::toNativeSeparators(path);
1590 QGui::ShowExplorerFileSel(p2);
1593 void FormMain::on_actionShowOnlySelected_triggered()
1595 ShowObjectOnlySelected();
1598 void FormMain::on_actionSelObjectTriangulate_triggered()
1600 MeshBuf* mbuf = m_Scene.GetPrimaryMeshbuf();
1604 mbuf->Triangulate();
1606 m_View3d.ReleaseAllRenderBuffer();
1608 RebuildObjectList();
1612 void FormMain::on_actionTreeCollapseAll_triggered()
1614 TreeUtil::SetAllTopExpand(ui.treeObjects, false);
1617 void FormMain::on_actionTreeExpandAll_triggered()
1619 TreeUtil::SetAllTopExpand(ui.treeObjects, true);
1623 void FormMain::on_actionAddSample_triggered()
1625 SampleShapeBuilder::CreateSphere(m_Scene);
1629 void FormMain::on_actionAddGroundPlane_triggered()
1631 SampleShapeBuilder::CreateGroundPlane(m_Scene);
1635 void FormMain::OnDoneAddGeom(void)
1637 QTreeWidget* obj_tree = ui.treeObjects;
1639 const GeomObject& obj = m_Scene.m_Objects.back();
1641 obj_tree->setCurrentItem(NULL);
1642 obj_tree->blockSignals(true);
1644 QTreeWidgetItem* n = CreateObjectTreeNode(obj);
1645 PushbackTreeNode(obj_tree, n);
1646 n->setExpanded(true);
1648 SetPrimayrSelectObjectFromScene();
1650 obj_tree->blockSignals(false);
1652 if (obj_tree->currentItem() == NULL)
1654 if (!m_Scene.m_Objects.empty())
1656 QTreeWidgetItem * j = obj_tree->topLevelItem(0);
1657 obj_tree->setCurrentItem(j);
1664 ResizeTreeColumns(obj_tree, 4);
1666 ResetSequenceSliderRange();
1672 void FormMain::on_actionShaderDefault_triggered(bool)
1674 ChangeShaderMenuMain(ShaderType::Default);
1677 void FormMain::on_actionShaderPhong_triggered(bool)
1679 ChangeShaderMenuMain(ShaderType::Phong);
1682 void FormMain::on_actionShaderCustom_triggered(bool)
1684 ChangeShaderMenuMain(ShaderType::Custom);
1687 void FormMain::on_actionNormalColor_triggered(bool)
1689 ChangeShaderMenuMain(ShaderType::NormalColor);
1692 void FormMain::on_actionDepthColor_triggered(bool)
1694 ChangeShaderMenuMain(ShaderType::DepthColor);
1697 void FormMain::on_actionShadowmap_triggered(bool)
1699 ChangeShaderMenuMain(ShaderType::Shadowmap);
1702 void FormMain::on_actionEnvmap_triggered(bool)
1704 ChangeShaderMenuMain(ShaderType::Envmap);
1707 void FormMain::on_actionIntegrateShader_triggered(bool)
1709 ChangeShaderMenuMain(ShaderType::Integrate);
1712 void FormMain::on_actionMatcapShader_triggered(bool)
1714 ChangeShaderMenuMain(ShaderType::Matcap);
1717 void FormMain::SyncShaderSettingsToGUI(void)
1719 ChangeShaderMenuMain(m_View3d.m_Config.m_ShaderMode);
1722 void FormMain::ChangeShaderMenuMain(ShaderType type)
1724 m_View3d.m_Config.m_ShaderMode = type;
1729 void FormMain::on_actionCreate_Check_triggered()
1731 CreateSampleTextureMain(SampleTextureBuilder::TEX_CHECKER);
1734 void FormMain::on_actionCreate_Stripe_V_triggered()
1736 CreateSampleTextureMain(SampleTextureBuilder::TEX_STRIPE_V);
1739 void FormMain::on_actionCreate_Stripe_H_triggered()
1741 CreateSampleTextureMain(SampleTextureBuilder::TEX_STRIPE_H);
1744 void FormMain::CreateSampleTextureMain(SampleTextureBuilder::TextureType tex_type)
1746 m_ContextShare.BeginDrawTop();
1747 m_Scene.CreateSampleTexture(tex_type);
1748 m_ContextShare.EndDrawTop();
1753 bool FormMain::IsAutUVFit(void) const
1755 return ui.actionUVAutoFit->isChecked();
1759 void FormMain::on_pushDeleteSelectedObject_clicked()
1761 DeleteSelectedObject();
1764 void FormMain::on_treeObjects_itemChanged(QTreeWidgetItem * item, int column)
1766 QTreeWidget* obj_tree = ui.treeObjects;
1770 QTreeWidgetItem* t = item->parent();
1771 bool checked = (item->checkState(1) == Qt::Checked);
1774 int sel_idx = obj_tree->indexOfTopLevelItem(item);
1775 GeomObject& obj = m_Scene.m_Objects[sel_idx];
1776 obj.m_Visible = checked;
1780 int sel_idx = obj_tree->indexOfTopLevelItem(t);
1781 int midx = t->indexOfChild(item);
1783 GeomObject& obj = m_Scene.m_Objects[sel_idx];
1784 MeshBuf& mb = obj.m_MeshAry[midx];
1785 mb.m_Visible = checked;
1793 void FormMain::DeleteSelectedObject()
1795 QTreeWidget* obj_tree = ui.treeObjects;
1796 QTreeWidgetItem* ti = obj_tree->currentItem();
1800 QTreeWidgetItem* pn = ti->parent();
1804 sel_idx = obj_tree->indexOfTopLevelItem(ti);
1806 sel_idx = obj_tree->indexOfTopLevelItem(pn);
1811 m_ContextShare.BeginDrawTop();
1813 m_Scene.RemoveItem(sel_idx);
1815 m_ContextShare.EndDrawTop();
1817 m_View3d.ClearRenderMap();
1819 obj_tree->setCurrentItem(NULL);
1820 obj_tree->takeTopLevelItem(sel_idx);
1822 ResizeTreeColumns(obj_tree, 4);
1824 ti = obj_tree->currentItem();
1825 sel_idx = obj_tree->indexOfTopLevelItem(ti);
1826 m_Scene.m_Sels.SelectObject(sel_idx);
1828 m_Scene.UpdateTransform();
1830 RefreshObjectSelectState();
1832 ResetSequenceSliderRange();
1837 void FormMain::FlipVisibleSelectedObject()
1839 QTreeWidget* obj_tree = ui.treeObjects;
1840 QTreeWidgetItem * item = obj_tree->currentItem();
1844 item->setCheckState(1, FilpState(item->checkState(1)));
1847 Qt::CheckState FormMain::FilpState(Qt::CheckState state) const
1849 if(state == Qt::Checked)
1850 return Qt::Unchecked;
1855 void FormMain::ShowObjectOnlySelected(void)
1857 GeomObject* sel_obj = m_Scene.GetPrimaryObject();
1858 if (sel_obj == NULL)
1861 for (GeomObject& o : m_Scene.m_Objects)
1863 o.m_Visible = (sel_obj == &o);
1866 RebuildObjectList();
1870 void FormMain::ShowAllObject(void)
1872 m_Scene.ShowAllObject();
1874 RebuildObjectList();
1878 void FormMain::HideAllObject(void)
1880 m_Scene.HideAllObject();
1882 RebuildObjectList();
1886 void FormMain::on_actionUVResetView_triggered()
1888 m_View2d.ResetView();
1894 //!
\83\8f\83C
\83\84\81[
\83I
\81[
\83o
\81[
\83\8c\83C
\95\
\8e¦
\8e\9e\82Ì
\90F
\90Ý
\92è
1895 void FormMain::on_actionWireColor_triggered()
1897 m_WireColorSelDlg.exec();
1900 //!
\83f
\83t
\83H
\83\8b\83g
\83}
\83e
\83\8a\83A
\83\8b\82Ì
\90F
\90Ý
\92è
1901 void FormMain::on_actionFaceColor_triggered()
1903 const lib_graph::color4f& c = m_Scene.m_DefaultMaterial.m_Diffuse;
1905 m_DiffuseColorSelDlg.setOption(QColorDialog::ShowAlphaChannel);
1906 m_DiffuseColorSelDlg.setCurrentColor(ToQColor(c));
1907 m_DiffuseColorSelDlg.exec();
1910 //!
\94w
\8ci
\90F
\82Ì
\90Ý
\92è
1911 void FormMain::on_actionBackGroundColor_triggered()
1913 const lib_graph::color4f& c = m_View3d.m_BGColor;
1915 m_BGColorSelDlg.setCurrentColor(ToQColor(c));
1916 m_BGColorSelDlg.exec();
1919 void FormMain::WireOverlayColorChanged(const QColor & color)
1921 lib_graph::color3b& c = m_View3d.m_Config.m_WireColor;
1922 c.set(color.red(), color.green(), color.blue());
1924 m_View3d.ReleaseAllRenderBuffer();
1929 void FormMain::CopyRGB(lib_graph::color4f& c, const QColor & color)
1931 c.r() = (float)color.red() / 255.0f;
1932 c.g() = (float)color.green() / 255.0f;
1933 c.b() = (float)color.blue() / 255.0f;
1936 void FormMain::CopyRGBA(lib_graph::color4f& c, const QColor & color)
1938 c.r() = (float)color.red() / 255.0f;
1939 c.g() = (float)color.green() / 255.0f;
1940 c.b() = (float)color.blue() / 255.0f;
1941 c.a() = (float)color.alpha() / 255.0f;
1944 void FormMain::FaceDiffuseColorChanged(const QColor & color)
1946 lib_graph::color4f& c = m_Scene.m_DefaultMaterial.m_Diffuse;
1949 m_View3d.ReleaseAllRenderBuffer();
1953 void FormMain::BGColorChanged(const QColor & color)
1955 lib_graph::color4f& c = m_View3d.m_BGColor;
1961 void FormMain::SetSelectedMaterialColor(QColor col)
1963 lib_geo::BaseMaterial* mat = m_Scene.GetSelectedMaterial();
1967 if (m_SelMatColorWidget == ui.colorAmbient ) CopyRGBA(mat->m_Ambient , col);
1968 if (m_SelMatColorWidget == ui.colorEmission ) CopyRGBA(mat->m_Emission , col);
1969 if (m_SelMatColorWidget == ui.colorDiffuse ) CopyRGBA(mat->m_Diffuse , col);
1970 if (m_SelMatColorWidget == ui.colorSpecular ) CopyRGBA(mat->m_Specular , col);
1972 SetWidgetColor(m_SelMatColorWidget, col);
1975 void FormMain::SelMatColorChanged(const QColor & color)
1977 SetSelectedMaterialColor(color);
1978 m_View3d.ResetPrimaryObjectLists();
1983 void FormMain::on_actionWindowOptions_triggered()
1985 m_ViewConfigDlg.showNormal();
1986 m_ViewConfigDlg.show();
1987 m_ViewConfigDlg.activateWindow();
1990 void FormMain::on_actionWindowCustomShader_triggered()
1992 if (m_CustomShaderDlg == NULL)
1994 m_CustomShaderDlg = new FormCustomShader(this);
1995 m_CustomShaderDlg->SetShaderLibrary(&m_View3d.m_ShaderLib);
1996 m_CustomShaderDlg->SetParentWidget(ui.GLWidgetMain);
1997 m_CustomShaderDlg->LoadOrSetDefaultCode();
2000 SIGNAL(ShaderBuild()),
2002 SLOT(CustomShaderDlg_ShaderBuild()));
2005 m_CustomShaderDlg->showNormal();
2006 m_CustomShaderDlg->show();
2007 m_CustomShaderDlg->activateWindow();
2011 void FormMain::ConfigChangedDlg_ConfigChanged()
2013 m_View3d.ReleaseAllRenderBuffer();
2017 void FormMain::CrossSectionDlg_ConfigChanged()
2023 void FormMain::OnPaintImage(QPrinter *printer)
2025 QPainter painter(printer);
2027 QRect rect = painter.viewport();
2028 QSize size = this->size();
2029 size.scale(rect.size(), Qt::KeepAspectRatio);//
\8fc
\89¡
\94ä
\88Û
\8e\9d
2031 painter.setViewport(rect.x(), rect.y(), size.width(), size.height());
2032 painter.setWindow(this->rect());
2034 this->render(&painter);
2037 void FormMain::on_actionPrint_triggered()
2042 void FormMain::on_actionPrintPreview_triggered()
2047 void FormMain::PrintImage(bool WithPreview)
2049 //QPrinter printer(QPrinter::ScreenResolution);
2050 QPrinter printer(QPrinter::ScreenResolution);
2054 QPrintPreviewDialog preview(&printer, this);
2055 preview.setWindowFlags( Qt::Window );
2058 SIGNAL(paintRequested(QPrinter *)),
2059 SLOT(OnPaintImage(QPrinter *)));
2061 preview.showMaximized();
2066 QPrintDialog printDialog(&printer, this);
2067 if(printDialog.exec() == QDialog::Accepted)
2068 OnPaintImage(&printer);
2073 void FormMain::on_pushButtonAddCameraRecord_clicked()
2075 m_View3d.RecordCamera();
2077 ui.listCamera->addItem( QString::number(ui.listCamera->count()) );
2082 void FormMain::on_pushButtonDeleteCameraRecord_clicked()
2084 int idx = ui.listCamera->currentRow();
2088 m_View3d.RemoveRecordedCamera(idx);
2090 for (int i = idx+1; i < ui.listCamera->count(); ++i)
2092 ui.listCamera->item(i)->setText(QString::number(i - 1));
2095 ui.listCamera->takeItem(idx);
2100 void FormMain::on_pushCameraRecordClear_clicked()
2102 m_View3d.ClearRecordedCamera();
2104 ui.listCamera->clear();
2109 void FormMain::on_listCamera_itemDoubleClicked(QListWidgetItem *item)
2111 int idx = ui.listCamera->currentRow();
2115 m_View3d.MoveToRecordedCamera(idx, ui.checkCameraAnimation->isChecked());
2118 void FormMain::on_actionSaveCamera_triggered()
2120 QString title = "camera";
2121 QString filter = "Camera File(*.camera)";
2122 QString fileName = GetFilePathFromSaveDlg(title, filter);
2123 if (fileName.isEmpty())
2126 m_View3d.m_CameraRecord.SaveCamera(fileName.toLocal8Bit().data());
2129 void FormMain::on_actionProjectionOrtho_triggered()
2131 ui.actionProjectionOrtho->setChecked(true);
2132 ui.actionProjectionPers->setChecked(false);
2134 m_View3d.m_Camera.m_ProjMode = gl::Camera::PROJ_ORTHO;
2139 void FormMain::on_actionProjectionPers_triggered()
2141 ui.actionProjectionPers->setChecked(true);
2142 ui.actionProjectionOrtho->setChecked(false);
2144 m_View3d.m_Camera.m_ProjMode = gl::Camera::PROJ_PERS;
2150 void FormMain::CustomShaderDlg_ShaderBuild()
2155 void FormMain::OnAnimationTimerUpdated()
2157 static const float rot_speed = 0.005f;
2159 if (ui.actionRotateCamera->isChecked())
2161 m_View3d.m_Camera.m_Manip.Tumble(rot_speed, 0.0f);
2162 UpdateCameraStatus();
2165 if (ui.actionRotateLight->isChecked())
2166 m_View3d.m_ControlLight.m_Position.rotate_y(rot_speed);
2168 if (ui.actionAnimation->isChecked())
2171 if (IsLastSequence())
2172 ui.actionAnimation->setChecked(false);
2178 void FormMain::on_actionRotateCamera_toggled(bool checked)
2183 void FormMain::on_actionRotateLight_toggled(bool checked)
2188 void FormMain::on_actionAnimation_toggled(bool checked)
2192 if (IsLastSequence())
2194 QSlider* s = ui.sliderSequence;
2202 void FormMain::UpdateAnimState(void)
2204 if (IsEnableAnimation())
2205 m_AnimationTimer.start();
2207 m_AnimationTimer.stop();
2210 bool FormMain::IsEnableAnimation(void)
2212 if (ui.actionRotateCamera->isChecked())
2214 if (ui.actionRotateLight->isChecked())
2216 if (ui.actionAnimation->isChecked())
2222 void FormMain::on_actionCrossSectionDlg_triggered()
2224 m_CrossSectionDlg.showNormal();
2225 m_CrossSectionDlg.show();
2226 m_CrossSectionDlg.activateWindow();
2229 void FormMain::on_actionSelectNext_triggered()
2231 AddSelectObjectIdx(1);
2234 void FormMain::on_actionSelectPrev_triggered()
2236 AddSelectObjectIdx(-1);
2239 void FormMain::AddSelectObjectIdx(int step)
2241 QTreeWidget* obj_tree = ui.treeObjects;
2243 int num_obj = obj_tree->topLevelItemCount();
2247 QTreeWidgetItem * i = obj_tree->currentItem();
2248 int idx = obj_tree->indexOfTopLevelItem(i);
2253 else if (idx >= num_obj)
2256 QTreeWidgetItem * j = obj_tree->topLevelItem(idx);
2257 obj_tree->setCurrentItem(j);
2260 void FormMain::on_actionSwitchVisible_triggered()
2262 FlipVisibleSelectedObject();
2265 void FormMain::on_actionActionSelObjectShowOnlyOnce_triggered()
2267 ShowObjectOnlySelected();
2270 void FormMain::on_actionHideAll_triggered()
2275 void FormMain::on_actionShowAll_triggered()
2280 void FormMain::on_actionVertexBuilder_triggered()
2282 FormVertexBuilder builder;
2283 builder.CreateVertex(m_Scene);
2285 RebuildObjectList();
2289 void FormMain::on_actionFullScreen_triggered()
2291 m_FullscreenPanel.ShowWidgetAsFullscreen(ui.splitter, ui.gridLayout_4);
2294 void FormMain::on_actionResetConfig_triggered()
2296 QString msg = QString::fromLocal8Bit("
\90Ý
\92è
\82ð
\83\8a\83Z
\83b
\83g
\82µ
\82Ü
\82·");
2297 if (QMessageBox::question(this, "", msg, QMessageBox::Ok|QMessageBox::Cancel) != QMessageBox::Ok)
2300 setGeometry(m_InitRect);
2302 LoadDefaultConfig();
2304 SyncViewSettingsFromGUI();
2305 SyncUVViewSettingsFromGUI();
2306 ApplyGeomStateFromGUI();
2307 SyncShaderSettingsToGUI();
2310 QString FormMain::GetFilePathFromOpenDlg(const QString& title, const QString& filter)
2312 QString default_path = GetNextDefaultPathForFileDlg();
2313 QString s = QFileDialog::getOpenFileName(this, title, default_path, filter);
2316 m_LastFileDialogDir = QFileInfo(s).absolutePath();
2321 QString FormMain::GetFilePathFromSaveDlg(const QString& title, const QString& filter)
2323 QString default_path = GetNextDefaultPathForFileDlg();
2324 QString s = QFileDialog::getSaveFileName(this, title, default_path, filter);
2327 m_LastFileDialogDir = QFileInfo(s).absolutePath();
2332 bool FormMain::IsSupportedTextureExt(const QString& path) const
2334 QString ext = QFileInfo(path).suffix().toLower();
2336 std::map<QString, bool> types;
2337 types[ "png" ] = true;
2338 types[ "jpg" ] = true;
2339 types[ "jepg" ] = true;
2340 types[ "bmp" ] = true;
2341 types[ "tif" ] = true;
2342 types[ "tiff" ] = true;
2347 QString FormMain::GetSupportedImageFilePathFromDlg(const QString& title)
2349 FileDlgFilterList exts;
2350 exts.Add( "Png" , "png" );
2351 exts.Add( "Jpg" , "jpg" );
2352 exts.Add( "Jpg" , "jpeg" );
2353 exts.Add( "Bmp" , "bmp" );
2354 exts.Add( "Tif" , "tif" );
2355 exts.Add( "Tif" , "tiff" );
2357 QString filter = FileDlgUtil::ExtListToDlgFilter("Image", exts);
2358 return GetFilePathFromOpenDlg(title, filter);
2362 QString FormMain::GetNextDefaultPathForFileDlg(void)
2364 if (m_LastFileDialogDir.isEmpty())
2365 return PathInfo::GetMyDocDirPath();
2367 return m_LastFileDialogDir;
2371 void FormMain::on_toolLoadEnvMap_clicked()
2373 QString fileName = GetSupportedImageFilePathFromDlg("Open envmap");
2374 if (fileName.isEmpty())
2377 LoadEnvMap(fileName);
2380 void FormMain::LoadEnvMap(QString& path)
2382 m_ContextShare.BeginDrawTop();
2383 m_Scene.m_EnvImg.LoadTexture(path.toLocal8Bit().data());
2384 m_ContextShare.EndDrawTop();
2386 QString title = QFileInfo(path).fileName();
2387 ui.editEnvMap->setText(title);
2392 void FormMain::on_buttonReleaseEnvImg_clicked()
2394 m_ContextShare.BeginDrawTop();
2395 m_Scene.m_EnvImg.ClearEnv();
2396 m_ContextShare.EndDrawTop();
2398 ui.editEnvMap->clear();
2403 void FormMain::on_buttonPresetEnvMap_clicked()
2405 if (m_EnvmapDlg == NULL)
2407 m_EnvmapDlg = new EnvmapSelectDlg(this);
2410 SIGNAL(ListSelectChanged()),
2412 SLOT(EnvmapDlg_ListSelectChanged()));
2415 m_EnvmapDlg->show();
2418 void FormMain::EnvmapDlg_ListSelectChanged()
2420 QString p = m_EnvmapDlg->GetSelectedItemPath();
2427 void FormMain::on_toolLoadMatcap_clicked()
2429 QString fileName = GetSupportedImageFilePathFromDlg("Open matcap");
2430 if (fileName.isEmpty())
2433 LoadMatcapImage(fileName);
2436 void FormMain::on_buttonReleaseMatcap_clicked()
2438 m_ContextShare.BeginDrawTop();
2439 m_Scene.m_MatcapImg.ClearEnv();
2440 m_ContextShare.EndDrawTop();
2442 ui.editMatcap->clear();
2447 void FormMain::on_buttonLoadMatcapPreset_clicked()
2449 if (m_MatcapDlg == NULL)
2451 m_MatcapDlg = new MatcapSelectDlg(this);
2454 SIGNAL(ListSelectChanged()),
2456 SLOT(MatcapDlg_ListSelectChanged()));
2459 m_MatcapDlg->show();
2462 void FormMain::MatcapDlg_ListSelectChanged()
2464 QString p = m_MatcapDlg->GetSelectedItemPath();
2471 void FormMain::on_sliderEnvReflection_valueChanged(int value)
2473 float r = GetSliderNormalizedPos(ui.sliderEnvReflection);
2474 m_Scene.m_EnvImg.m_EnvReflection = r;
2480 void FormMain::on_comboCoordinate_currentIndexChanged(int index)
2482 SceneTransform& transform = m_Scene.m_WorldTransform;
2484 int idx = ui.comboCoordinate->currentIndex();
2487 case 0: transform.SetCoordType(geom::SceneTransform::COORD_RUF); break;
2488 case 1: transform.SetCoordType(geom::SceneTransform::COORD_FRU); break;
2489 case 2: transform.SetCoordType(geom::SceneTransform::COORD_UFR); break;
2490 case 3: transform.SetCoordType(geom::SceneTransform::COORD_RUB); break;
2491 case 4: transform.SetCoordType(geom::SceneTransform::COORD_BRU); break;
2492 case 5: transform.SetCoordType(geom::SceneTransform::COORD_UBR); break;
2500 void FormMain::on_sliderShadowDarkness_valueChanged(int value)
2502 int b = ui.sliderShadowDarkness->minimum();
2503 int t = ui.sliderShadowDarkness->maximum();
2505 float r = (float)(value - b) / (float)(t - b);
2506 m_Scene.m_ShadowConfig.m_ShadowDarkness = r;
2511 void FormMain::on_buttonClearAllGeoms_clicked()
2516 //!
\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³
2517 void FormMain::on_checkCameraAnimation_toggled(bool checked)
2522 void FormMain::on_actionOpenAppdir_triggered()
2524 PathInfo::OpenAppDir();
2527 void FormMain::on_actionOpenConfigDir_triggered()
2529 PathInfo::OpenConfigDir();
2532 void FormMain::on_buttonDecGridAxis_clicked()
2534 m_View3d.m_GridAxisScale /= 10.0f;
2538 void FormMain::on_buttonIncGridAxis_clicked()
2540 m_View3d.m_GridAxisScale *= 10.0f;
2544 void FormMain::on_buttonResetGridAxis_clicked()
2546 m_View3d.m_GridAxisScale = 1.0f;
2551 void FormMain::View3D_SelectedObjectChanged(int sel_obj, int sel_mesh)
2553 QTreeWidgetItem* on = ui.treeObjects->topLevelItem(sel_obj);
2557 ui.treeObjects->setCurrentItem(on);
2561 QTreeWidgetItem* mn = on->child(sel_mesh);
2562 ui.treeObjects->setCurrentItem(mn);
2566 void FormMain::View3D_SelectedMatChanged(int sel_idx)
2568 ui.listMaterial->setCurrentRow(sel_idx);
2571 void FormMain::View3D_CameraMoved(void)
2573 UpdateCameraStatus();
2576 void FormMain::View3D_StatusTipChanged(QString msg)
2578 //ui.statusBar->showMessage(msg, 1500);
2581 void FormMain::View3D_SequenceStepped(int step)
2586 void FormMain::View3D_CursorMoved()
2588 Cursor3D& c = m_Scene.m_Cursor3d;
2589 QString x = QString::number(c.CursorPos.x, 'f', 4);
2590 QString y = QString::number(c.CursorPos.y, 'f', 4);
2591 QString z = QString::number(c.CursorPos.z, 'f', 4);
2605 ui.editCursorPos->setText(s);
2608 void FormMain::StepSequence(int step)
2610 QSlider* s = ui.sliderSequence;
2611 s->setValue(s->value() + step);
2614 bool FormMain::IsLastSequence(void)
2616 QSlider* s = ui.sliderSequence;
2617 return s->value() == s->maximum();
2620 void FormMain::UpdateCameraStatus(void)
2622 const Camera& camera = m_View3d.m_Camera;
2623 const lib_gl::CameraManipulator& manip = camera.m_Manip;
2624 const lm::vec3f& vp = manip.m_ViewPos;
2627 manip.GetViewAngles(a, b);
2628 a = a * 180.0f / M_PI;
2629 b = b * 180.0f / M_PI;
2633 msg += QString::number(vp.x, 'f', 2) + " ";
2634 msg += QString::number(vp.y, 'f', 2) + " ";
2635 msg += QString::number(vp.z, 'f', 2);
2639 msg += QString::number(a, 'f', 2) + " ";
2640 msg += QString::number(b, 'f', 2);
2644 msg += QString::number(camera.m_Projection.m_Near, 'f', 2) + " ";
2645 msg += QString::number(camera.m_Projection.m_Far, 'f', 2);
2648 m_StatusBar1->setText(msg);
2651 void FormMain::on_actionCameraFPSMode_toggled(bool arg1)
2653 m_View3d.m_FpsMode = arg1;
2657 void FormMain::actionCursorMenuStates_Toggled(bool)
2659 m_Binder_Cursor.UpdateAllData();
2663 void FormMain::on_actionResetCursor_triggered()
2665 m_Scene.m_Cursor3d.ResetCursorPos();
2666 m_Scene.m_Cursor3d.UpdateNormal(m_View3d.m_Camera.m_Manip.GetFront());
2670 void FormMain::on_actionResetMeasure_triggered()
2672 m_View3d.ResetCursorMeasure();
2677 void FormMain::on_actionPyScript_triggered()
2679 if (m_PyScriptDlg == NULL)
2681 m_PyScriptDlg = new FormPyScript(this);
2682 m_PyScriptDlg->m_Scene = &m_Scene;
2683 m_PyScriptDlg->m_View3d = &m_View3d;
2684 m_PyScriptDlg->m_View2d = &m_View2d;
2687 m_PyScriptDlg->showNormal();
2688 m_PyScriptDlg->show();
2689 m_PyScriptDlg->activateWindow();
2692 void FormMain::on_actionConsole_triggered()
2695 freopen( "CON", "r", stdin );
2696 freopen( "CON", "w", stdout );
2700 void FormMain::on_actionClearVertSelect_triggered()
2702 m_Scene.ClearAllVertSelect();
2707 void FormMain::on_action_About_triggered()
2713 void FormMain::on_action_Association_triggered()
2715 m_AssociationDlg.exec();
2718 void FormMain::on_actionLookDepth_triggered()
2720 m_View3d.LookDepth();
2723 void FormMain::on_actionLook3DCursor_triggered()
2725 m_View3d.Look3DCursor();
2728 void FormMain::on_sliderLightPower_valueChanged(int value)
2730 float val = (float)ui.sliderLightPower->value();
2731 float val_max = (float)ui.sliderLightPower->maximum();
2732 float n = 2.0f * val / val_max;
2734 m_View3d.SetLightStrengthByStdRatio(n);
2736 ui.labelLightPower->setText(QString("LightPower ") + QString::number(n, 'f', 2));
2741 void FormMain::on_buttonResetLightPower_clicked()
2743 ui.sliderLightPower->setValue(1000);
2746 void FormMain::on_checkHoleAroundCursor_clicked(bool checked)
2749 ui.checkShowOnlyAroundCursor->setChecked(false);
2752 m_Scene.m_Cursor3d.CircleClip = Cursor3DCircleClip::Hole;
2754 m_Scene.m_Cursor3d.CircleClip = Cursor3DCircleClip::None;
2759 void FormMain::on_checkShowOnlyAroundCursor_toggled(bool checked)
2762 ui.checkHoleAroundCursor->setChecked(false);
2765 m_Scene.m_Cursor3d.CircleClip = Cursor3DCircleClip::ShowAround;
2767 m_Scene.m_Cursor3d.CircleClip = Cursor3DCircleClip::None;
2772 void FormMain::on_sliderCursorHoleRange_valueChanged(int value)
2774 float val = (float)ui.sliderCursorHoleRange->value();
2775 float maxval = (float)ui.sliderCursorHoleRange->maximum();
2776 float n = val / maxval;
2778 m_Scene.m_Cursor3d.HoleRangeRatio = n;
2782 void FormMain::on_buttonResetCursorHoleRange_clicked()
2787 void FormMain::ResetHoleRange(void)
2789 ui.sliderCursorHoleRange->setValue(500);
2792 void FormMain::on_actionSaveImageToMydoc_triggered()
2794 QString path = PathInfo::GetMyDocDirPath();
2795 QString basename = path + "/" + "qgv_snap_";
2797 QDateTime dt = QDateTime::currentDateTime();
2802 QString tp = dt.toString("yyyyMMdd_hhmmss_zzz");
2803 dst = basename + tp + ".png";
2804 if (!QFile(dst).exists())
2808 ui.GLWidgetMain->grabFrameBuffer().save(dst);
2811 void FormMain::on_actionPostProcNone_triggered()
2813 ChangePostprocMode(PostProcType::None);
2816 void FormMain::on_actionPostProcAntialias_triggered()
2818 ChangePostprocMode(PostProcType::Antialias);
2821 void FormMain::on_actionPostProcBorder_triggered()
2823 ChangePostprocMode(PostProcType::Border);
2826 void FormMain::on_actionPostProcDepthLayerColor_triggered()
2828 ChangePostprocMode(PostProcType::DepthLayerColor);
2831 void FormMain::on_actionPostProcDepthColor_triggered()
2833 ChangePostprocMode(PostProcType::DepthColor);
2836 void FormMain::on_actionPostProcDepthOfField_triggered()
2838 ChangePostprocMode(PostProcType::DepthOfField);
2841 void FormMain::ChangePostprocMode(PostProcType type)
2843 m_View3d.m_Config.m_PPMode = type;
2847 void FormMain::on_sliderDOFPint_valueChanged(int value)
2849 float n = GetSliderNormalizedPos(ui.sliderDOFPint);
2850 m_View3d.m_PPContext.m_DOFPintPos = n;
2855 void FormMain::on_sliderDOFRange_valueChanged(int value)
2857 float n = GetSliderNormalizedPos(ui.sliderDOFRange);
2858 m_View3d.m_PPContext.m_DOFRange = 10.0f * n;
2863 float FormMain::GetSliderNormalizedPos(const QSlider* slider) const
2865 float t = (float)slider->maximum();
2866 float b = (float)slider->minimum();
2867 float v = (float)slider->value();
2869 return (v - b) / (t - b);
2872 void FormMain::on_buttonResetDOFPint_clicked()
2874 ui.sliderDOFPint->setValue(1000);
2877 void FormMain::on_buttonResetDOFRange_clicked()
2879 ui.sliderDOFRange->setValue(1000);
2882 void FormMain::on_actionAddCrossSectionRecord_triggered()
2884 m_Scene.AddCrossSectionRecord();
2888 void FormMain::on_actionClearCrossSectionRecord_triggered()
2890 m_Scene.ClearCrossSectionRecord();
2894 void FormMain::LoadCurSelMatTexture(TextureType type)
2896 QString path = GetSupportedImageFilePathFromDlg("Load Texture");
2900 LoadCurSelMatTexture(type, path);
2903 void FormMain::LoadCurSelMatTexture(TextureType type, QString filepath)
2905 GeomTextureSet* ts = m_Scene.GetSelectedTexture();
2909 MeshBuf* mbuf = ts->GetParent();
2910 std::string fp = filepath.toLocal8Bit().data();
2912 QString name_qs = QFileInfo(filepath).fileName();
2913 std::string name = name_qs.toLocal8Bit().data();
2915 m_ContextShare.BeginDrawTop();
2917 mbuf->ReleaseTextureUnit(ts, type);
2918 gl::GlTexture* tex = mbuf->GetInitTexture(fp, name, m_Scene.m_TexConfig);
2919 ts->SetTextureUnit(type, tex);
2921 if (type == TextureType::Normal)
2922 m_View3d.ReleaseAllRenderBuffer();
2924 m_ContextShare.EndDrawTop();
2926 OnChangedSelectedMaterial();
2930 void FormMain::ReleaseCurSelTexture(TextureType type)
2932 MeshBuf* mbuf = m_Scene.GetPrimaryMeshbuf();
2936 int mat_idx = m_Scene.m_Sels.GetSelMat();
2938 m_ContextShare.BeginDrawTop();
2939 mbuf->ReleaseTextureUnit(mat_idx, type);
2940 m_ContextShare.EndDrawTop();
2942 OnChangedSelectedMaterial();
2946 void FormMain::LoadMatcapImageForCurrentMat(QString& path)
2948 GeomTextureSet* ts = m_Scene.GetSelectedTexture();
2950 QString title = QFileInfo(path).fileName();
2952 m_ContextShare.BeginDrawTop();
2953 ts->TexMatcap.LoadTexture(path.toLocal8Bit().data());
2954 ts->TexMatcap.SetName(title);
2955 m_ContextShare.EndDrawTop();
2957 OnChangedSelectedMaterial();
2961 void FormMain::LoadMatcapImage(QString& path)
2963 MatcapImage& mc = m_Scene.m_MatcapImg;
2965 QString title = QFileInfo(path).fileName();
2967 ui.editMatcap->setText(mc.GetName());
2969 m_ContextShare.BeginDrawTop();
2970 mc.LoadTexture(path.toLocal8Bit().data());
2972 m_ContextShare.EndDrawTop();
2977 void FormMain::on_buttonOpenMatCapEachMaterial_clicked()
2979 QString path = GetSupportedImageFilePathFromDlg("Load Texture");
2983 LoadMatcapImage(path);
2986 void FormMain::on_buttonClearMatCapEachMaterial_clicked()
2988 geom::GeomTextureSet* tex = m_Scene.GetSelectedTexture();
2992 m_ContextShare.BeginDrawTop();
2993 tex->TexMatcap.ClearEnv();
2994 m_ContextShare.EndDrawTop();
2996 ui.editMatCapEachMaterial->clear();
3001 void FormMain::on_buttonOpenCurrentMatColorMap_clicked()
3003 LoadCurSelMatTexture(TextureType::Color);
3006 void FormMain::on_buttonClearCurrentMatColorMap_clicked()
3008 ReleaseCurSelTexture(TextureType::Color);
3011 void FormMain::on_buttonOpenCurrentMatNormalMap_clicked()
3013 LoadCurSelMatTexture(TextureType::Normal);
3016 void FormMain::on_buttonClearCurrentMatNormalMap_clicked()
3018 ReleaseCurSelTexture(TextureType::Normal);
3021 void FormMain::ChangeMatlemColor(QWidget* col_widget)
3023 lib_geo::BaseMaterial* mat = m_Scene.GetSelectedMaterial();
3027 lib_graph::color4f* col;
3029 if (col_widget == ui.colorAmbient ) col = &mat->m_Ambient ;
3030 if (col_widget == ui.colorEmission ) col = &mat->m_Emission ;
3031 if (col_widget == ui.colorDiffuse ) col = &mat->m_Diffuse ;
3032 if (col_widget == ui.colorSpecular ) col = &mat->m_Specular ;
3034 lib_graph::color4f src = *col;
3036 QColor dc = ToQColor(*col);
3038 m_SelMatColorWidget = col_widget;
3040 m_SelMatColorSelDlg.setOption(QColorDialog::ShowAlphaChannel);
3041 m_SelMatColorSelDlg.setCurrentColor(dc);
3042 if (m_SelMatColorSelDlg.exec() == QDialog::Rejected)
3045 SetWidgetColor(col_widget, dc);
3049 void FormMain::on_buttonDiffuse_clicked()
3051 ChangeMatlemColor(ui.colorDiffuse);
3054 void FormMain::on_buttonAmbient_clicked()
3056 ChangeMatlemColor(ui.colorAmbient);
3059 void FormMain::on_buttonEmission_clicked()
3061 ChangeMatlemColor(ui.colorEmission);
3064 void FormMain::on_buttonSpecular_clicked()
3066 ChangeMatlemColor(ui.colorSpecular);
3069 void FormMain::SetWidgetColor(QWidget* w, QColor col)
3071 QString ss = QString("background-color: %1").arg(col.name());
3072 w->setStyleSheet(ss);
3075 void FormMain::on_sliderShininess_valueChanged(int value)
3077 lib_geo::BaseMaterial* mat = m_Scene.GetSelectedMaterial();
3081 float val = (float)ui.sliderShininess->value();
3082 float val_max = (float)ui.sliderShininess->maximum();
3084 float real_val = 200.0f * val / val_max;
3086 mat->m_Shininess = real_val;
3088 ui.labelShininessVal->setText(QString::number(real_val, 'f', 2));
3093 void FormMain::CreateRecentFilesMenu(const std::vector<QString>& path)
3095 QMenu* recents = ui.menuOpenRecent;
3096 recents->actions().clear();
3098 for (size_t i = 0; i < path.size(); ++i)
3100 AddRecentFile(path[path.size() - i - 1]);
3104 void FormMain::CreateRecentFilesFromMenu(std::vector<QString>& path)
3106 QMenu* recents = ui.menuOpenRecent;
3107 for (int i = 0; i < recents->actions().size(); ++i)
3109 QAction* a = recents->actions().at(i);
3110 path.push_back(a->text());
3114 void FormMain::AddRecentFile(const QString& path)
3116 QString path_local = QDir::toNativeSeparators(path);
3118 static const int max_files = 10;
3120 QMenu* recents = ui.menuOpenRecent;
3122 for (int i = 0; i < recents->actions().size(); ++i)
3124 QAction* a = recents->actions().at(i);
3125 if (a->text() == path_local)
3127 recents->removeAction(a);
3132 QAction* new_path = new QAction(path_local, this);
3135 SIGNAL(triggered()),
3137 SLOT(OnOpenRecent()));
3139 if (recents->actions().empty())
3140 recents->addAction(new_path);
3142 recents->insertAction(recents->actions().front(), new_path);
3144 if (recents->actions().size() > max_files)
3146 QAction* a = recents->actions().back();
3147 recents->removeAction(a);
3151 void FormMain::OnOpenRecent()
3153 QAction* a = dynamic_cast<QAction*>(QObject::sender());
3158 QString path = a->text();
3160 if (IsResetSceneOnBeforeLoadFile())
3163 if (OpenGeomFile(path))
3167 void FormMain::on_checkShowOnlySelect_toggled(bool checked)
3169 m_View3d.m_Config.m_ShowOnlySelect = checked;
3173 void FormMain::ResizeTreeColumns(QTreeWidget* t, int num_col)
3175 t->setVisible(false);
3176 t->resizeColumnToContents(0);
3177 t->resizeColumnToContents(1);
3178 t->resizeColumnToContents(2);
3179 t->resizeColumnToContents(3);
3180 t->setVisible(true);
3183 void FormMain::PushbackTreeNode(QTreeWidget* tree, QTreeWidgetItem *node)
3185 int next_idx = tree->topLevelItemCount();
3186 tree->insertTopLevelItem(next_idx, node);
3189 QTreeWidgetItem* FormMain::CreateObjectTreeNode(const geom::GeomObject& obj) const
3191 QTreeWidgetItem* n = new QTreeWidgetItem;
3193 n->setText(0, QString::fromLocal8Bit(obj.m_Name.c_str()));
3194 n->setCheckState(1, obj.m_Visible ? Qt::Checked : Qt::Unchecked);
3195 n->setText(2, QString::number(obj.GetNumTotalVerts()));
3196 n->setText(3, QString::number(obj.GetNumTotalFaces()));
3199 for (const MeshBuf& mbuf : obj.m_MeshAry)
3201 n->addChild(CreateMeshBufNode(obj, mbuf, idx++));
3204 n->setExpanded(true);
3209 QTreeWidgetItem* FormMain::CreateMeshBufNode(const geom::GeomObject& obj, const MeshBuf& mbuf, int idx) const
3211 QTreeWidgetItem* n = new QTreeWidgetItem;
3214 if (mbuf.m_Name.empty())
3215 name = QString::fromLocal8Bit(obj.m_Name.c_str()) + QString::number(idx);
3217 name = QString::fromLocal8Bit(mbuf.m_Name.c_str());
3219 n->setText(0, name);
3220 n->setCheckState(1, mbuf.m_Visible ? Qt::Checked : Qt::Unchecked);
3221 n->setText(2, QString::number(mbuf.GetNumVerts()));
3222 n->setText(3, QString::number(mbuf.GetNumFaces()));
3227 void FormMain::InitObjectListHeader(void)
3230 qs << "Name" << "Visible" << "Verts" << "Faces";
3231 ui.treeObjects->setHeaderLabels(qs);
3234 void FormMain::SetPrimayrSelectObjectFromScene(void)
3236 QTreeWidget* obj_tree = ui.treeObjects;
3238 Selection3D& sels = m_Scene.m_Sels;
3239 if (!sels.IsObjectSelected())
3242 int sel_idx = sels.GetSelObjectIdx();
3244 QTreeWidgetItem* on = obj_tree->topLevelItem(sel_idx);
3248 if (sels.IsMBufSelected())
3250 QTreeWidgetItem* mn = on->child(sels.GetMBufIdx());
3251 obj_tree->setCurrentItem(mn);
3255 obj_tree->setCurrentItem(on);
3259 void FormMain::SetPrimayrSelectObjectToScene(void)
3261 Selection3D& sels = m_Scene.m_Sels;
3263 QTreeWidget* tree = ui.treeObjects;
3265 QTreeWidgetItem* sel_node = tree->currentItem();
3266 if (sel_node == NULL)
3269 QTreeWidgetItem* on = sel_node->parent();
3272 int obj_idx = tree->indexOfTopLevelItem(sel_node);
3273 sels.SelectObject(obj_idx);
3277 int obj_idx = tree->indexOfTopLevelItem(on);
3278 int mb_idx = on->indexOfChild(sel_node);
3279 sels.SelectMBuf(obj_idx, mb_idx);
3283 void FormMain::on_actionReleaseShader_triggered()
3285 m_ContextShare.BeginDrawTop();
3287 m_View3d.m_ShaderLib.ReleaseAllShaders();
3289 m_ContextShare.EndDrawTop();
3292 void FormMain::on_combo2DViewSrcType_currentIndexChanged(int index)
3296 case 0 : return m_View2d.ChangeTextureSource(View2DTexSrc::Color);
3297 case 1 : return m_View2d.ChangeTextureSource(View2DTexSrc::Normal);
3304 void FormMain::on_sliderSequence_valueChanged(int value)
3309 void FormMain::ResetSequenceSliderRange(void)
3311 int m = m_Scene.GetKeyframeMax();
3312 ui.sliderSequence->setMaximum(m);
3316 void FormMain::UpdateSequence(void)
3318 int v = ui.sliderSequence->value();
3319 int m = ui.sliderSequence->maximum();
3321 QString s = QString("%1 / %2").arg(v).arg(m);
3322 ui.labelSequencePos->setText(s);
3324 m_Scene.SetFrame(v);
3326 m_View3d.ReleaseAllRenderBuffer();
3330 void FormMain::on_actionNewStroke_triggered()
3332 m_Scene.m_Cursor3d.CutStroke();
3336 void FormMain::on_actionClearStroke_triggered()
3338 m_Scene.m_Cursor3d.ClearStroke();