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);
185 ui.colorAmbient->installEventFilter(this);
186 ui.colorEmission->installEventFilter(this);
187 ui.colorDiffuse->installEventFilter(this);
188 ui.colorSpecular->installEventFilter(this);
191 void FormMain::InitDataBinding(void)
193 InitializeVisiblStateMenu();
194 InitializeUVStateMenu();
195 InitializeSceneStateMenu();
196 InitializeGeomStateMenu();
197 InitializeCursorMenu();
200 void FormMain::InitializeVisiblStateMenu(void)
202 DataBinderMap& dbmap = m_Binder_ViewConfig;
204 View3DConfig& cfg_3d = m_View3d.m_Config;
206 dbmap.AddBinder(new MenuBinder(ui.actionDrawBBox , &cfg_3d.m_DrawBBox ));
207 dbmap.AddBinder(new MenuBinder(ui.actionFaceVBO , &cfg_3d.m_EnableFaceVBO ));
208 dbmap.AddBinder(new MenuBinder(ui.actionVidTopMost , &cfg_3d.m_ShowVidTopMost ));
209 dbmap.AddBinder(new MenuBinder(ui.actionDrawBBoxRange , &cfg_3d.m_DrawBBoxRange ));
210 dbmap.AddBinder(new MenuBinder(ui.actionWireDispList , &cfg_3d.m_EnableWireDispList ));
211 dbmap.AddBinder(new MenuBinder(ui.actionMultisample , &cfg_3d.m_EnableMultisample ));
212 dbmap.AddBinder(new MenuBinder(ui.actionCoverageTransparent , &cfg_3d.m_EnableCoverageTrans ));
213 dbmap.AddBinder(new MenuBinder(ui.actionSeparateSpecular , &cfg_3d.m_SeparateSpecular ));
214 dbmap.AddBinder(new MenuBinder(ui.actionShowSelVertCoord , &cfg_3d.m_ShowSelVertCoord ));
215 dbmap.AddBinder(new MenuBinder(ui.actionHighlightSelected , &cfg_3d.m_HighlightSelected ));
216 dbmap.AddBinder(new MenuBinder(ui.actionFixMaterialSilver , &cfg_3d.m_UseFixMaterial ));
217 dbmap.AddBinder(new MenuBinder(ui.actionShadowmapBuffer , &cfg_3d.m_DrawShadowmapBuf ));
218 dbmap.AddBinder(new MenuBinder(ui.actionEnableTexture3D , &cfg_3d.m_EnableTexture ));
219 dbmap.AddBinder(new MenuBinder(ui.actionEnableLighting , &cfg_3d.m_EnableLighting ));
220 dbmap.AddBinder(new MenuBinder(ui.actionEnableCulling , &cfg_3d.m_EnableCullFace ));
221 dbmap.AddBinder(new MenuBinder(ui.actionDrawWire , &cfg_3d.m_DrawWire ));
222 dbmap.AddBinder(new MenuBinder(ui.actionDrawVid , &cfg_3d.m_DrawVid ));
223 dbmap.AddBinder(new MenuBinder(ui.actionDrawVertNormal , &cfg_3d.m_DrawVertNormal ));
224 dbmap.AddBinder(new MenuBinder(ui.actionDrawVert , &cfg_3d.m_DrawVert ));
225 dbmap.AddBinder(new MenuBinder(ui.actionWireVBO , &cfg_3d.m_EnableWireVBO ));
226 dbmap.AddBinder(new MenuBinder(ui.actionIndexColorMode , &cfg_3d.m_IndexMaterial ));
227 dbmap.AddBinder(new MenuBinder(ui.actionFBMaterial , &cfg_3d.m_FBMaterial ));
228 dbmap.AddBinder(new MenuBinder(ui.actionDrawMiniAxis , &cfg_3d.m_DrawMiniAxis ));
229 dbmap.AddBinder(new MenuBinder(ui.actionDrawLookPos , &cfg_3d.m_DrawLookPos ));
230 dbmap.AddBinder(new MenuBinder(ui.actionDrawLightPos , &cfg_3d.m_DrawLightPosition ));
231 dbmap.AddBinder(new MenuBinder(ui.actionDrawGround , &cfg_3d.m_DrawGround ));
232 dbmap.AddBinder(new MenuBinder(ui.actionDrawFid , &cfg_3d.m_DrawFid ));
233 dbmap.AddBinder(new MenuBinder(ui.actionDrawFace , &cfg_3d.m_DrawFace ));
234 dbmap.AddBinder(new MenuBinder(ui.actionCameraRecords , &cfg_3d.m_DrawCameraRecord ));
235 dbmap.AddBinder(new MenuBinder(ui.actionDrawAxis , &cfg_3d.m_DrawAxis ));
236 dbmap.AddBinder(new MenuBinder(ui.actionDoubleSideShading , &cfg_3d.m_DoubleSideShading ));
237 dbmap.AddBinder(new MenuBinder(ui.actionDirectionalLight , &cfg_3d.m_LightIsDirectional ));
238 dbmap.AddBinder(new MenuBinder(ui.actionCullFrontOrBack , &cfg_3d.m_CullAngle_F ));
239 dbmap.AddBinder(new MenuBinder(ui.actionHighlightMaterial , &cfg_3d.m_HighlightMaterial ));
240 dbmap.AddBinder(new MenuBinder(ui.actionCloseVert , &cfg_3d.m_ShowCloseVertInfo ));
241 dbmap.AddBinder(new MenuBinder(ui.actionCameraRange , &cfg_3d.m_DrawRenderRange ));
242 dbmap.AddBinder(new MenuBinder(ui.actionRenderTime , &cfg_3d.m_ShowRenderTime ));
243 dbmap.AddBinder(new MenuBinder(ui.actionUseFixTexture , &cfg_3d.m_UseFixTexture ));
244 dbmap.AddBinder(new MenuBinder(ui.actionShowSelVertIdx , &cfg_3d.m_ShowSelVertIdx ));
245 dbmap.AddBinder(new MenuBinder(ui.actionShowMeshBound , &cfg_3d.m_ShowMeshBound ));
246 dbmap.AddBinder(new MenuBinder(ui.actionPickTransparent , &cfg_3d.m_PickTransparent ));
247 dbmap.AddBinder(new MenuBinder(ui.actionFlatShading , &cfg_3d.m_EnableFlatShade ));
248 dbmap.AddBinder(new MenuBinder(ui.actionDrawPolylineLenWhl , &cfg_3d.m_DrawPolylineLenWhl ));
249 dbmap.AddBinder(new MenuBinder(ui.actionDrawPolylineLen , &cfg_3d.m_DrawPolylineLen ));
250 dbmap.AddBinder(new MenuBinder(ui.actionDrawPolylineIdx , &cfg_3d.m_DrawPolylineIdx ));
251 dbmap.AddBinder(new MenuBinder(ui.actionDrawPolyline , &cfg_3d.m_DrawPolyline ));
252 dbmap.AddBinder(new MenuBinder(ui.actionDrawBone , &cfg_3d.m_DrawBone ));
253 dbmap.AddBinder(new MenuBinder(ui.actionShowMeasure , &cfg_3d.m_DrawCameraMeasure ));
254 dbmap.AddBinder(new MenuBinder(ui.actionFlipMouseMR , &cfg_3d.m_FlipMouseMR ));
255 dbmap.AddBinder(new MenuBinder(ui.actionSyncLightToCamera , &cfg_3d.m_SyncLightTocamera ));
257 for (GuiBinder& binder : dbmap.m_BinderMap)
259 MenuBinder* mb = dynamic_cast<MenuBinder*>(&binder);
262 QAction* a = mb->GetMenu();
265 SIGNAL(triggered(bool)),
267 SLOT(actionVisibleStates_Triggered(bool)));
272 void FormMain::InitializeUVStateMenu(void)
274 DataBinderMap& dbmap = m_Binder_UVConfig;
276 dbmap.AddBinder(new MenuBinder(ui.actionUVRepeat , &m_View2d.m_RepeatTexture ));
277 dbmap.AddBinder(new MenuBinder(ui.actionUseFixTexture2D , &m_View2d.m_UseFixTexute ));
278 dbmap.AddBinder(new MenuBinder(ui.actionShowVertex2d , &m_View2d.m_DrawVerts ));
279 dbmap.AddBinder(new MenuBinder(ui.actionShowImage2d , &m_View2d.m_EnableTexture ));
280 dbmap.AddBinder(new MenuBinder(ui.actionTextureMipmap , &m_Scene.m_TexConfig.m_EnableMipmap ));
281 dbmap.AddBinder(new MenuBinder(ui.actionTextureCompress , &m_Scene.m_TexConfig.m_EnableCompress ));
282 dbmap.AddBinder(new MenuBinder(ui.actionUVFlipY , &m_Scene.m_TextureTransform.m_FlipY ));
284 for (GuiBinder& binder : dbmap.m_BinderMap)
286 MenuBinder* mb = dynamic_cast<MenuBinder*>(&binder);
289 QAction* a = mb->GetMenu();
292 SIGNAL(triggered(bool)),
294 SLOT(actionVisibleStatesUV_Triggered(bool)));
299 void FormMain::InitializeSceneStateMenu(void)
301 DataBinderMap& dbmap = m_Binder_Scene;
303 dbmap.AddBinder(new CheckboxBinder( ui.checkEnvMap , &m_Scene.m_EnvImg.m_VisibleEnvSphere ));
304 dbmap.AddBinder(new CheckboxBinder( ui.checkEnvReflection , &m_Scene.m_EnvImg.m_IsEnableReflection ));
305 dbmap.AddBinder(new CheckboxBinder( ui.checkShadowEnabled , &m_Scene.m_ShadowConfig.m_EnableShadow ));
306 dbmap.AddBinder(new CheckboxBinder( ui.checkSoftShadow , &m_Scene.m_ShadowConfig.m_EnableSoftShadow ));
308 for (GuiBinder& binder : dbmap.m_BinderMap)
310 CheckboxBinder* mb = dynamic_cast<CheckboxBinder*>(&binder);
313 QCheckBox* c = mb->GetCheckBox();
316 SIGNAL(toggled(bool)),
318 SLOT(actionSceneStates_Toggled(bool)));
323 void FormMain::InitializeCursorMenu(void)
325 DataBinderMap& dbmap = m_Binder_Cursor;
327 Cursor3D& cursor = m_Scene.m_Cursor3d;
328 dbmap.AddBinder(new MenuBinder( ui.actionShowCursor , &cursor.ShowCursor ));
329 dbmap.AddBinder(new MenuBinder( ui.actionCursorToDepth , &cursor.CursorDepth ));
330 dbmap.AddBinder(new MenuBinder( ui.actionCursorCoord , &cursor.ShowCoord ));
331 dbmap.AddBinder(new MenuBinder( ui.actionCheckBaryCoord , &cursor.CheckBaryCoord ));
332 dbmap.AddBinder(new MenuBinder( ui.actionSelectCloseMat , &cursor.SelCloseVert ));
333 dbmap.AddBinder(new MenuBinder( ui.actionCursorAxis , &cursor.ShowAxis ));
334 dbmap.AddBinder(new MenuBinder( ui.actionMeasure , &cursor.ShowMeasure ));
335 dbmap.AddBinder(new MenuBinder( ui.actionMeasureLen , &cursor.ShowMeasureLen ));
336 dbmap.AddBinder(new MenuBinder( ui.actionMeasureXYZ , &cursor.ShowMeasureXYZ ));
337 dbmap.AddBinder(new MenuBinder( ui.actionRecordStroke , &cursor.RecordStroke ));
338 dbmap.AddBinder(new MenuBinder( ui.actionShowStrokeLength , &cursor.ShowStrokeLen ));
339 dbmap.AddBinder(new MenuBinder( ui.actionTransparentStroke , &cursor.TranspStorke ));
341 for (GuiBinder& binder : dbmap.m_BinderMap)
343 MenuBinder* mb = dynamic_cast<MenuBinder*>(&binder);
346 QAction* a = mb->GetMenu();
349 SIGNAL(triggered(bool)),
351 SLOT(actionCursorMenuStates_Toggled(bool)));
357 void FormMain::InitializeGeomStateMenu(void)
359 AddGeomStateAction( ui.actionCentering );
360 AddGeomStateAction( ui.actionAutoResize );
363 void FormMain::AddGeomStateAction(const QAction* action)
367 SIGNAL(triggered(bool)),
369 SLOT(actionGeomStates_Triggered(bool)));
373 void FormMain::InitializeGLView(void)
375 ui.GLWidgetMain->setMouseTracking(true);
376 ui.GLWidgetUV->setMouseTracking(true);
378 ui.GLWidgetMain->SetViewer(&m_View3d);
379 m_View3d.m_Widgets = &m_Widgets;
380 m_View3d.RegisterScene(&m_Scene);
381 m_View3d.InitializeView(ui.GLWidgetMain);
383 ui.GLWidgetUV->SetViewer(&m_View2d);
384 m_View2d.m_Widgets = &m_Widgets;
385 m_View2d.RegisterScene(&m_Scene);
386 m_View2d.InitializeView(ui.GLWidgetUV);
388 m_Widgets.AddWidget(ui.GLWidgetMain);
389 m_Widgets.AddWidget(ui.GLWidgetUV);
391 // OpenGL
\82Ì
\83\8a\83X
\83g
\82Ì
\8b¤
\97L
\89»
394 m_ContextShare.BeginDrawTop();
396 m_Scene.Initialize();
398 m_ContextShare.EndDrawTop();
402 SIGNAL(SelectedObjectChanged(int, int)),
403 SLOT(View3D_SelectedObjectChanged(int, int)));
406 SIGNAL(SelectedMatChanged(int)),
407 SLOT(View3D_SelectedMatChanged(int)));
410 SIGNAL(CameraMoved(void)),
411 SLOT(View3D_CameraMoved(void)));
414 SIGNAL(StatusTipChanged(QString)),
415 SLOT(View3D_StatusTipChanged(QString)));
418 SIGNAL(SequenceStepped(int)),
419 SLOT(View3D_SequenceStepped(int)));
422 SIGNAL(CursorMoved()),
423 SLOT(View3D_CursorMoved()));
426 // OpenGL
\82Ì
\83\8a\83X
\83g
\82Ì
\8b¤
\97L
\89»
427 void FormMain::SetContextShare(void)
429 ui.GLWidgetUV->makeCurrent();
430 m_ContextShare.AddContext( GetDC((HWND)ui.GLWidgetUV->winId()) , wglGetCurrentContext() );
431 ui.GLWidgetUV->doneCurrent();
433 ui.GLWidgetMain->makeCurrent();
434 m_ContextShare.AddContext( GetDC((HWND)ui.GLWidgetUV->winId()) , wglGetCurrentContext() );
435 ui.GLWidgetMain->doneCurrent();
437 m_ContextShare.MakeShare();
440 void FormMain::InitializeCoordinateCombobox(void)
442 ui.comboCoordinate->blockSignals(true);
443 ui.comboCoordinate->addItem("Yup RH"); // RUF
444 ui.comboCoordinate->addItem("Zup RH"); // FRU
445 ui.comboCoordinate->addItem("Xup RH"); // UFR
446 ui.comboCoordinate->addItem("Yup LH"); // RUB
447 ui.comboCoordinate->addItem("Zup LH"); // BRU
448 ui.comboCoordinate->addItem("Xup LH"); // UBR
449 ui.comboCoordinate->blockSignals(false);
452 void FormMain::Initialize2DViewSrcCombobox(void)
454 ui.combo2DViewSrcType->blockSignals(true);
455 ui.combo2DViewSrcType->addItem("Color");
456 ui.combo2DViewSrcType->addItem("Normal");
457 ui.combo2DViewSrcType->blockSignals(false);
460 void FormMain::InitializeStatusBar(void)
462 m_StatusBar0 = new QLabel(this);
463 m_StatusBar1 = new QLabel(this);
464 ui.statusBar->addWidget(m_StatusBar0, 1);
465 ui.statusBar->addWidget(m_StatusBar1, 0);
467 m_StatusBar0->setText("");
469 m_StatusBar1->setMinimumWidth(290);
470 m_StatusBar1->setText("");
473 void FormMain::InitializeFromConfigFiles(void)
475 if (!InitializeConfig(PathInfo::GetGuiConfigFilePath()))
477 InitializeConfig(PathInfo::GetDefaultGuiConfigFilePath());
480 OpenCameraFile(PathInfo::GetCameraLogFilePath());
482 if (!LoadWindowLayout(PathInfo::GetWindowLayoutConfigFilePath()))
484 LoadWindowLayout(PathInfo::GetDefaultWindowLayoutConfigFilePath());
487 if (!QGui::LoadGUIState(this, PathInfo::GetLayoutConfigFilePath()))
489 QGui::LoadGUIState(this, PathInfo::GetDefaultLayoutConfigFilePath());
493 void FormMain::LoadDefaultConfig(void)
495 InitializeConfig(PathInfo::GetDefaultGuiConfigFilePath());
496 QGui::LoadGUIState(this, PathInfo::GetDefaultLayoutConfigFilePath());
497 LoadWindowLayout(PathInfo::GetDefaultWindowLayoutConfigFilePath());
500 void FormMain::SaveConfig(void)
502 PathInfo::CreateConfiDirIfNotExist();
504 SaveConfigFile(PathInfo::GetGuiConfigFilePath());
506 m_View3d.m_CameraRecord.SaveCamera(PathInfo::GetCameraLogFilePath().toLocal8Bit().data());
508 QGui::SaveGUIState(this, PathInfo::GetLayoutConfigFilePath());
510 SaveWindowLayout(PathInfo::GetWindowLayoutConfigFilePath());
513 bool FormMain::InitializeConfig(QString path)
515 View3DConfig& config_3d = m_View3d.m_Config;
518 cfg.m_Config3D = &config_3d;
519 cfg.m_Scene = &m_Scene;
521 if (!cfg.LoadConfigT(path.toLocal8Bit().data()))
524 ui.actionUVAutoFit->setChecked(cfg.m_AutFitUVView);
526 ui.comboCoordinate->setCurrentIndex(cfg.m_CoordType);
528 CreateRecentFilesMenu(cfg.m_RecentFiles);
530 m_Binder_ViewConfig.UpdateAllGUI(true);
531 m_Binder_UVConfig.UpdateAllGUI(true);
532 m_Binder_Scene.UpdateAllGUI(true);
533 m_Binder_Cursor.UpdateAllGUI(true);
535 ApplyGeomStateDataoToGUI();
537 SyncViewSettingsFromGUI();
538 SyncUVViewSettingsFromGUI();
539 SyncShaderSettingsToGUI();
541 m_EnableAllFeatures = cfg.m_EnableAllFeatures;
546 void FormMain::SaveConfigFile(QString path)
549 cfg.m_Config3D = &m_View3d.m_Config;
550 cfg.m_Scene = &m_Scene;
552 cfg.m_EnableAllFeatures = m_EnableAllFeatures;
554 cfg.m_AutFitUVView = ui.actionUVAutoFit ->isChecked();
556 cfg.m_CoordType = ui.comboCoordinate->currentIndex();
558 CreateRecentFilesFromMenu(cfg.m_RecentFiles);
560 cfg.SaveConfigT(path.toLocal8Bit().data());
564 void FormMain::InitializeSubDlg(void)
568 SIGNAL(currentColorChanged(const QColor &)),
570 SLOT(WireOverlayColorChanged(const QColor &)));
572 &m_DiffuseColorSelDlg,
573 SIGNAL(currentColorChanged(const QColor &)),
575 SLOT(FaceDiffuseColorChanged(const QColor &)));
578 SIGNAL(currentColorChanged(const QColor &)),
580 SLOT(BGColorChanged(const QColor &)));
582 &m_SelMatColorSelDlg,
583 SIGNAL(currentColorChanged(const QColor &)),
585 SLOT(SelMatColorChanged(const QColor &)));
587 m_SelMatColorWidget = NULL;
589 m_ViewConfigDlg.InitializeConfigDlg(&m_View3d.m_Config);
592 SIGNAL(ConfigChanged()),
594 SLOT(ConfigChangedDlg_ConfigChanged()));
596 m_CrossSectionDlg.InitializeConfigDlg(&m_View3d);
599 SIGNAL(ConfigChanged()),
601 SLOT(CrossSectionDlg_ConfigChanged()));
604 void FormMain::InitializeAnimation(void)
610 SLOT(OnAnimationTimerUpdated()));
611 m_AnimationTimer.setInterval(20);
614 void FormMain::InitializeMenu(void)
616 m_AGroup_Window = new QActionGroup(this);
617 m_AGroup_Window->setExclusive(true);
618 m_AGroup_Window->addAction( ui.actionWindow_3DView );
619 m_AGroup_Window->addAction( ui.actionWindow_UVView );
620 m_AGroup_Window->addAction( ui.actionWindows_DualView );
622 m_AGroup_Shader = new QActionGroup(this);
623 m_AGroup_Shader->setExclusive(true);
624 m_AGroup_Shader->addAction( ui.actionShaderDefault );
625 m_AGroup_Shader->addAction( ui.actionShaderPhong );
626 m_AGroup_Shader->addAction( ui.actionShaderCustom );
627 m_AGroup_Shader->addAction( ui.actionNormalColor );
628 m_AGroup_Shader->addAction( ui.actionDepthColor );
629 m_AGroup_Shader->addAction( ui.actionShadowmap );
630 m_AGroup_Shader->addAction( ui.actionEnvmap );
631 m_AGroup_Shader->addAction( ui.actionIntegrateShader );
632 m_AGroup_Shader->addAction( ui.actionMatcapShader );
634 m_AGroup_PProc = new QActionGroup(this);
635 m_AGroup_PProc->addAction( ui.actionPostProcNone );
636 m_AGroup_PProc->addAction( ui.actionPostProcAntialias );
637 m_AGroup_PProc->addAction( ui.actionPostProcBorder );
638 m_AGroup_PProc->addAction( ui.actionPostProcDepthLayerColor );
639 m_AGroup_PProc->addAction( ui.actionPostProcDepthColor );
640 m_AGroup_PProc->addAction( ui.actionPostProcDepthOfField );
643 void FormMain::InitContextMenu(void)
645 QList<QAction*> actions;
647 << ui.actionSelObjectVisible
648 << ui.actionSelObjectVertexOnlyMode
649 << ui.actionSelObjectDelete
650 << ui.actionSelObjectReload
651 << ui.actionSelObjectFlipFace
652 << ui.actionSelObjectFlipNormal
653 << ui.actionSelObjectOpenDir
654 << ui.actionActionSelObjectShowOnlyOnce
655 << ui.actionSelObjectTriangulate
656 << ui.actionTreeCollapseAll
657 << ui.actionTreeExpandAll;
659 QTreeWidget* obj_tree = ui.treeObjects;
661 obj_tree->setContextMenuPolicy(Qt::ActionsContextMenu);
662 obj_tree->addActions(actions);
665 void FormMain::ProcArguments(void)
667 QStringList args = QApplication::arguments();
668 for (int i = 1; i < args.size(); ++i)
675 void FormMain::closeEvent(QCloseEvent *e)
683 m_ViewConfigDlg.close();
684 m_CrossSectionDlg.close();
685 m_FullscreenPanel.close();
687 if (m_CustomShaderDlg != NULL)
688 m_CustomShaderDlg->close();
689 if (m_PyScriptDlg != NULL)
690 m_PyScriptDlg->close();
692 if (m_MatcapDlg != NULL)
693 m_MatcapDlg->close();
694 if (m_EnvmapDlg != NULL)
695 m_EnvmapDlg->close();
697 m_ContextShare.BeginDrawTop();
698 m_Scene.FinalizeScene();
699 m_ContextShare.EndDrawTop();
703 bool FormMain::eventFilter(QObject * filterobj, QEvent * filterevt)
705 if (filterobj == ui.editEnvMap)
707 if (filterevt->type() == QEvent::DragEnter)
708 return AcceptDropFilterIfUrl(filterevt);
710 if (filterevt->type() == QEvent::Drop)
711 return OnDropFile_editEnvMap(filterevt);
713 else if (filterobj == ui.editMatcap)
715 if (filterevt->type() == QEvent::DragEnter)
716 return AcceptDropFilterIfUrl(filterevt);
718 if (filterevt->type() == QEvent::Drop)
719 return OnDropFile_editMatcap(filterevt);
721 else if (filterobj == ui.editMatCapEachMaterial)
723 if (filterevt->type() == QEvent::DragEnter)
724 return AcceptDropFilterIfUrl(filterevt);
726 if (filterevt->type() == QEvent::Drop)
727 return OnDropFile_editMatcapEachMat(filterevt);
729 else if (filterobj == ui.editCurrentTexName)
731 if (filterevt->type() == QEvent::DragEnter)
732 return AcceptDropFilterIfUrl(filterevt);
734 if (filterevt->type() == QEvent::Drop)
735 return OnDropFile_editCurrentTexName(filterevt);
737 else if (filterobj == ui.editCurrentMatNormalMap)
739 if (filterevt->type() == QEvent::DragEnter)
740 return AcceptDropFilterIfUrl(filterevt);
742 if (filterevt->type() == QEvent::Drop)
743 return OnDropFile_editCurrentMatNormalMap(filterevt);
745 else if (filterobj == ui.colorAmbient)
747 if (filterevt->type() == QEvent::MouseButtonPress)
748 return colorAmbient_OnButtonDown(filterevt);
750 else if (filterobj == ui.colorEmission)
752 if (filterevt->type() == QEvent::MouseButtonPress)
753 return colorEmission_OnButtonDown(filterevt);
755 else if (filterobj == ui.colorDiffuse)
757 if (filterevt->type() == QEvent::MouseButtonPress)
758 return colorDiffuse_OnButtonDown(filterevt);
760 else if (filterobj == ui.colorSpecular)
762 if (filterevt->type() == QEvent::MouseButtonPress)
763 return colorSpecular_OnButtonDown(filterevt);
766 return QMainWindow::eventFilter(filterobj, filterevt);
769 bool FormMain::OnDropFile_editEnvMap(QEvent * filterevt)
771 QString path = GetFirstLoadableImagePathFromDragEvent(filterevt);
778 bool FormMain::OnDropFile_editMatcap(QEvent * filterevt)
780 QString path = GetFirstLoadableImagePathFromDragEvent(filterevt);
782 LoadMatcapImage(path);
787 bool FormMain::OnDropFile_editMatcapEachMat(QEvent * filterevt)
789 QString path = GetFirstLoadableImagePathFromDragEvent(filterevt);
791 LoadMatcapImageForCurrentMat(path);
796 bool FormMain::OnDropFile_editCurrentTexName(QEvent * filterevt)
798 QString path = GetFirstLoadableImagePathFromDragEvent(filterevt);
800 LoadCurSelMatTexture(TextureType::Color, path);
805 bool FormMain::OnDropFile_editCurrentMatNormalMap(QEvent * filterevt)
807 QString path = GetFirstLoadableImagePathFromDragEvent(filterevt);
809 LoadCurSelMatTexture(TextureType::Normal, path);
814 bool FormMain::AcceptDropFilterIfUrl(QEvent * filterevt)
816 QDragEnterEvent* e = dynamic_cast<QDragEnterEvent*>(filterevt);
820 if (e->mimeData()->hasUrls())
821 e->acceptProposedAction();
826 QString FormMain::GetFirstLoadableImagePathFromDragEvent(QEvent* filterevt)
828 QDropEvent* e = dynamic_cast<QDropEvent*>(filterevt);
832 if (!e->mimeData()->hasUrls())
835 QList<QUrl> urls = e->mimeData()->urls();
836 for (int i = 0; i < urls.size(); ++i)
838 QString path = urls[i].toLocalFile();
839 if (IsSupportedTextureExt(path))
846 bool FormMain::colorAmbient_OnButtonDown(QEvent * filterevt)
848 QMouseEvent * e = dynamic_cast<QMouseEvent *>(filterevt);
849 if (e->buttons() == Qt::LeftButton)
850 ChangeMatlemColor(ui.colorAmbient);
854 bool FormMain::colorEmission_OnButtonDown(QEvent * filterevt)
856 QMouseEvent * e = dynamic_cast<QMouseEvent *>(filterevt);
857 if (e->buttons() == Qt::LeftButton)
858 ChangeMatlemColor(ui.colorEmission);
862 bool FormMain::colorDiffuse_OnButtonDown(QEvent * filterevt)
864 QMouseEvent * e = dynamic_cast<QMouseEvent *>(filterevt);
865 if (e->buttons() == Qt::LeftButton)
866 ChangeMatlemColor(ui.colorDiffuse);
870 bool FormMain::colorSpecular_OnButtonDown(QEvent * filterevt)
872 QMouseEvent * e = dynamic_cast<QMouseEvent *>(filterevt);
873 if (e->buttons() == Qt::LeftButton)
874 ChangeMatlemColor(ui.colorSpecular);
879 void FormMain::CenteringSplitter(void)
881 int w = ui.splitter->width();
885 ui.splitter->setSizes(s);
888 void FormMain::updateView_All(void)
894 void FormMain::updateView_2D(void)
896 ui.GLWidgetUV->update();
899 void FormMain::updateView_3D(void)
901 ui.GLWidgetMain->update();
904 void FormMain::on_actionOpen_triggered()
906 FileDlgFilterList exts;
907 exts.Add( "Wavefront" , "obj" );
908 exts.Add( "STL" , "stl" );
909 exts.Add( "PLY" , "ply" );
910 exts.Add( "Metasequoia" , "mqo" );
911 exts.Add( "Pmd" , "pmd" );
912 exts.Add( "Collada" , "dae" );
913 exts.Add( "DirectX" , "x" );
915 QString filter = FileDlgUtil::ExtListToDlgFilter("Geometry", exts);
916 QString title = "Open file";
917 QString fileName = GetFilePathFromOpenDlg(title, filter);
919 if (fileName.isEmpty())
922 if (IsResetSceneOnBeforeLoadFile())
925 if (OpenGeomFile(fileName))
929 void FormMain::on_actionExit_triggered()
934 void FormMain::actionVisibleStates_Triggered(bool checked)
936 QAction* a = dynamic_cast<QAction*>(QObject::sender());
939 if (a == ui.actionIndexColorMode)
941 ui.actionFixMaterialSilver->setChecked(false);
942 ui.actionFBMaterial->setChecked(false);
944 else if (a == ui.actionFixMaterialSilver)
946 ui.actionIndexColorMode->setChecked(false);
947 ui.actionFBMaterial->setChecked(false);
949 else if (a == ui.actionFBMaterial)
951 ui.actionFixMaterialSilver->setChecked(false);
952 ui.actionIndexColorMode->setChecked(false);
956 SyncViewSettingsFromGUI();
960 void FormMain::SyncViewSettingsFromGUI(void)
962 m_Binder_ViewConfig.UpdateAllData();
964 QAction* menu = GetMenuFromShader(m_View3d.m_Config.m_ShaderMode);
966 menu->setChecked(true);
969 QAction* FormMain::GetMenuFromShader(ShaderType type)
971 switch(m_View3d.m_Config.m_ShaderMode)
973 case ShaderType::Phong : return ui.actionShaderPhong;
974 case ShaderType::Custom : return ui.actionShaderCustom;
975 case ShaderType::NormalColor: return ui.actionNormalColor;
976 case ShaderType::DepthColor : return ui.actionDepthColor;
977 case ShaderType::Shadowmap : return ui.actionShadowmap;
978 case ShaderType::Envmap : return ui.actionEnvmap;
979 case ShaderType::Integrate : return ui.actionIntegrateShader;
980 case ShaderType::Matcap : return ui.actionMatcapShader;
981 case ShaderType::Default : return ui.actionShaderDefault;
989 bool FormMain::SaveWindowLayout(const QString& filepath)
993 config.m_MainWinLeft = geometry().x();
994 config.m_MainWinTop = geometry().y();
995 config.m_MainWinWidth = geometry().width();
996 config.m_MainWinHeight = geometry().height();
997 config.m_IsMaximized = isMaximized();
999 return config.SaveConfig(filepath.toLocal8Bit().data());
1002 bool FormMain::LoadWindowLayout(const QString& filepath)
1004 WindowConfig config;
1005 if (!config.LoadConfig(filepath.toLocal8Bit().data()))
1008 if (config.m_IsMaximized)
1011 int l = config.m_MainWinLeft;
1012 int t = config.m_MainWinTop;
1013 int w = config.m_MainWinWidth;
1014 int h = config.m_MainWinHeight;
1015 setGeometry(l, t, w, h);
1020 void FormMain::actionVisibleStatesUV_Triggered(bool)
1022 SyncUVViewSettingsFromGUI();
1025 void FormMain::SyncUVViewSettingsFromGUI(void)
1027 m_Binder_UVConfig.UpdateAllData();
1031 void FormMain::actionSceneStates_Toggled(bool)
1033 SyncSceneSettingsFromGUI();
1036 void FormMain::SyncSceneSettingsFromGUI(void)
1038 m_Binder_Scene.UpdateAllData();
1042 void FormMain::on_actionWindow_ToolBarView_triggered(bool checked)
1044 ui.toolBar_View->setVisible( ui.actionWindow_ToolBarView->isChecked() );
1047 void FormMain::on_actionToolBar_Options_toggled(bool checked)
1049 ui.toolBar_Option->setVisible(checked);
1052 void FormMain::on_actionToolBar_Operation_toggled(bool checked)
1054 ui.toolBar_Operation->setVisible(checked);
1057 void FormMain::on_actionCameraDist_triggered()
1059 m_View3d.AdjustCameraDistAuto();
1062 void FormMain::on_actionCameraFront_triggered()
1064 m_View3d.MoveCaemraTo(ViewPoint::Front);
1067 void FormMain::on_actionCameraBack_triggered()
1069 m_View3d.MoveCaemraTo(ViewPoint::Back);
1072 void FormMain::on_actionCameraLeft_triggered()
1074 m_View3d.MoveCaemraTo(ViewPoint::Left);
1077 void FormMain::on_actionCameraRight_triggered()
1079 m_View3d.MoveCaemraTo(ViewPoint::Right);
1082 void FormMain::on_actionCameraTop_triggered()
1084 m_View3d.MoveCaemraTo(ViewPoint::Top);
1087 void FormMain::on_actionCameraBottom_triggered()
1089 m_View3d.MoveCaemraTo(ViewPoint::Bottom);
1092 void FormMain::on_actionCameraPers_triggered()
1094 m_View3d.MoveCaemraTo(ViewPoint::Perse);
1097 void FormMain::on_actionCameraLookOrigin_triggered()
1099 m_View3d.MoveLookPosToOrigin();
1102 void FormMain::on_actionCameraLookCenter_triggered()
1104 m_View3d.MoveLookPosToCenter();
1107 void FormMain::on_actionWindow_3DView_triggered(bool checked)
1109 UpdateViewTypeFromMenu();
1112 void FormMain::on_actionWindows_DualView_triggered(bool checked)
1114 UpdateViewTypeFromMenu();
1117 void FormMain::on_actionWindow_UVView_triggered(bool checked)
1119 UpdateViewTypeFromMenu();
1122 void FormMain::UpdateViewTypeFromMenu(void)
1124 if (ui.actionWindows_DualView->isChecked())
1126 ui.frameView3D->setVisible(true);
1127 ui.frameView2D->setVisible(true);
1129 // 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.
1130 static bool firsttime = true;
1134 CenteringSplitter();
1137 if (ui.actionWindow_3DView->isChecked())
1139 ui.frameView3D->setVisible(true);
1140 ui.frameView2D->setVisible(false);
1142 if (ui.actionWindow_UVView->isChecked())
1144 ui.frameView3D->setVisible(false);
1145 ui.frameView2D->setVisible(true);
1149 void FormMain::on_actionWindowMaterialList_triggered()
1151 ShowAndActivateAndRaise(ui.dockMaterial);
1152 ui.listMaterial->setFocus();
1155 void FormMain::on_actionWindowObjectList_triggered()
1157 ShowAndActivateAndRaise(ui.dockObject);
1158 ui.treeObjects->setFocus();
1161 void FormMain::on_actionWindowCameraList_triggered()
1163 ShowAndActivateAndRaise(ui.dockCamera);
1164 ui.listCamera->setFocus();
1167 void FormMain::on_actionWindowScenePanel_triggered()
1169 ShowAndActivateAndRaise(ui.dockScene);
1172 void FormMain::on_actionCursorPanel_triggered()
1174 ShowAndActivateAndRaise(ui.dockCursor);
1177 void FormMain::on_actionIOOptionPanel_triggered()
1179 ShowAndActivateAndRaise(ui.dockIOOption);
1182 void FormMain::on_listMaterial_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
1184 m_Scene.m_Sels.SetSelMat(ui.listMaterial->currentRow());
1185 OnChangedSelectedMaterial();
1189 void FormMain::ShowAndActivateAndRaise(QDockWidget* widget)
1191 widget->setVisible(true);
1192 widget->activateWindow();
1196 void FormMain::on_treeObjects_currentItemChanged(QTreeWidgetItem * current, QTreeWidgetItem * previous)
1198 RefreshObjectSelectState();
1201 void FormMain::RefreshObjectSelectState(void)
1203 SetPrimayrSelectObjectToScene();
1205 QListWidget* list_mat = ui.listMaterial;
1208 const MeshBuf* mbuf = m_Scene.GetPrimaryMeshbuf();
1211 const lib_geo::BaseMesh& mesh = mbuf->m_Mesh;
1212 for (const lib_geo::BaseMaterial& mat : mesh.m_Materials)
1214 const std::string& name = mat.m_Name;
1217 list_mat->addItem("--");
1219 list_mat->addItem(QString::fromLocal8Bit(name.c_str()));
1223 const GeomObject* obj = m_Scene.GetPrimaryObject();
1226 ui.actionSelObjectVisible->setChecked(mbuf->IsVisible());
1228 else if (obj != NULL)
1230 ui.actionSelObjectVisible->setChecked(obj->m_Visible);
1234 ui.actionSelObjectVertexOnlyMode->setChecked(obj->m_VertexOnlyMode);
1236 if (list_mat->count() > 0 && list_mat->currentRow() < 0)
1238 list_mat->setCurrentRow(0);
1239 m_Scene.m_Sels.SetSelMat(0);
1240 OnChangedSelectedMaterial();
1246 void FormMain::OnChangedSelectedMaterial(void)
1253 ui.editCurrentTexName->clear();
1255 GeomTextureSet* ts = m_Scene.GetSelectedTexture();
1258 ui.editCurrentTexName->setText("");
1259 ui.editMatCapEachMaterial->setText("");
1263 QString name_c, name_n;
1265 gl::GlTexture* tex_c = ts->GetTexColor();
1267 name_c = QString::fromLocal8Bit(tex_c->GetName().c_str());
1269 gl::GlTexture* tex_n = ts->GetTexNormal();
1271 name_n = QString::fromLocal8Bit(tex_n->GetName().c_str());
1273 ui.editCurrentTexName->setText(name_c);
1274 ui.editCurrentMatNormalMap->setText(name_n);
1276 MatcapImage& matcap = ts->TexMatcap;
1277 ui.editMatCapEachMaterial->setText(matcap.GetName());
1280 lib_geo::BaseMaterial* mat = m_Scene.GetSelectedMaterial();
1283 SetColorPalleteBG(ui.colorAmbient , ToQColor(mat->m_Ambient));
1284 SetColorPalleteBG(ui.colorEmission , ToQColor(mat->m_Emission));
1285 SetColorPalleteBG(ui.colorDiffuse , ToQColor(mat->m_Diffuse));
1286 SetColorPalleteBG(ui.colorSpecular , ToQColor(mat->m_Specular));
1287 SetMatShininessSliderPos(mat->m_Shininess);
1291 QColor w(255, 255, 255);
1292 SetColorPalleteBG( ui.colorAmbient , w );
1293 SetColorPalleteBG( ui.colorEmission , w );
1294 SetColorPalleteBG( ui.colorDiffuse , w );
1295 SetColorPalleteBG( ui.colorSpecular , w );
1296 SetMatShininessSliderPos(0);
1302 void FormMain::SetMatShininessSliderPos(float shininess)
1304 int val_max = ui.sliderShininess->maximum();
1305 int slider_pos = (int)(shininess * (float)val_max / 200.0f);
1306 slider_pos = (lm::min)(val_max, slider_pos);
1307 ui.sliderShininess->blockSignals(true);
1308 ui.sliderShininess->setValue(slider_pos);
1309 ui.sliderShininess->blockSignals(false);
1310 ui.labelShininessVal->setText(QString::number(shininess, 'f', 2));
1313 void FormMain::keyPressEvent(QKeyEvent *e)
1316 if (m.Flag_C() && e->key() == Qt::Key_Tab)
1322 void FormMain::FocusNextSubDlg(void)
1324 std::vector<QDockWidget*> widgets;
1326 if (ui.dockObject ->isVisible()) widgets.push_back( ui.dockObject );
1327 if (ui.dockCamera ->isVisible()) widgets.push_back( ui.dockCamera );
1328 if (ui.dockScene ->isVisible()) widgets.push_back( ui.dockScene );
1329 if (ui.dockMaterial ->isVisible()) widgets.push_back( ui.dockMaterial );
1331 if (widgets.empty())
1334 QDockWidget* next_widget = NULL;
1336 for (size_t i = 0; i < widgets.size(); ++i)
1338 if (widgets[i] == m_LastFocusedDockDlg)
1340 next_widget = widgets[(i + 1) % widgets.size()];
1345 if (next_widget == NULL)
1346 next_widget = widgets.front();
1348 m_LastFocusedDockDlg = next_widget;
1350 next_widget->activateWindow();
1351 next_widget->raise();
1352 next_widget->setFocus();
1355 void FormMain::dragEnterEvent(QDragEnterEvent* e)
1357 if (e->mimeData()->hasUrls())
1358 e->acceptProposedAction();
1361 void FormMain::dropEvent(QDropEvent* e)
1363 if (e->mimeData()->hasUrls())
1365 QList<QUrl> urls = e->mimeData()->urls();
1367 std::vector<QString> geom_files;
1369 for (int i = 0; i < urls.size(); ++i)
1371 QString path = urls[i].toLocalFile();
1372 if (FormatType::IsGeomFileExt(path))
1373 geom_files.push_back(path);
1376 if (!geom_files.empty())
1378 if (IsResetSceneOnBeforeLoadFile())
1381 for (size_t i = 0; i < geom_files.size(); ++i)
1383 if (OpenGeomFile(geom_files[i]))
1388 for (int i = 0; i < urls.size(); ++i)
1390 QString path = urls[i].toLocalFile();
1392 if (IsSupportedTextureExt(path))
1394 OpenFixTextureFile(path);
1398 if (IsCameraFile(path))
1400 OpenCameraFile(path);
1407 bool FormMain::IsResetSceneOnBeforeLoadFile(void) const
1409 if (QApplication::keyboardModifiers() & Qt::ShiftModifier)
1415 //!
\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é.
1416 void FormMain::OpenFixTextureFile(const QString& path)
1418 std::string fname = path.toLocal8Bit().data();
1420 m_ContextShare.BeginDrawTop();
1421 m_Scene.LoadDefaultMatTexture(fname);
1422 m_ContextShare.EndDrawTop();
1427 bool FormMain::OpenGeomFile(const QString& path)
1429 m_Scene.m_ObjSplit = ui.checkSplitOBJ->isChecked();
1431 m_ContextShare.BeginDrawTop();
1436 m_Scene.ImportFileAutoFmt(path);
1438 catch(const FileLoadErrorException& ex)
1441 msg += "Failed Load ";
1442 msg += path + "\n\n";
1443 msg += QString::fromLocal8Bit(ex.what());
1445 QMessageBox::warning(this, "", msg);
1449 m_ContextShare.EndDrawTop();
1451 RebuildObjectList();
1453 ResetSequenceSliderRange();
1460 AddRecentFile(path);
1465 void FormMain::ClearAllObjects(void)
1467 m_ContextShare.BeginDrawTop();
1469 m_Scene.ClearObjects();
1471 m_ContextShare.EndDrawTop();
1473 m_View3d.ClearRenderMap();
1475 RebuildObjectList();
1476 RefreshObjectSelectState();
1481 void FormMain::RebuildObjectList(void)
1483 QTreeWidget* obj_tree = ui.treeObjects;
1485 obj_tree->setCurrentItem(NULL);
1486 obj_tree->blockSignals(true);
1490 obj_tree->setSelectionBehavior(QAbstractItemView::SelectRows);
1491 obj_tree->setSelectionMode(QAbstractItemView::SingleSelection);
1492 obj_tree->setEditTriggers(QAbstractItemView::NoEditTriggers);
1494 obj_tree->setColumnCount(4);
1496 InitObjectListHeader();
1498 for (const geom::GeomObject& obj : m_Scene.m_Objects)
1500 QTreeWidgetItem* n = CreateObjectTreeNode(obj);
1501 PushbackTreeNode(ui.treeObjects, n);
1502 n->setExpanded(true);
1505 SetPrimayrSelectObjectFromScene();
1507 obj_tree->blockSignals(false);
1509 if (obj_tree->currentItem() == NULL)
1511 if (!m_Scene.m_Objects.empty())
1513 QTreeWidgetItem* ti = obj_tree->topLevelItem(0);
1514 obj_tree->setCurrentItem(ti);
1521 ResizeTreeColumns(obj_tree, 4);
1525 bool FormMain::IsCameraFile(const QString& path) const
1527 QFileInfo fInfo( path );
1528 QString ext = fInfo.suffix().toLower();
1529 return (ext == "camera");
1532 bool FormMain::OpenCameraFile(const QString& path)
1534 std::string fname = path.toLocal8Bit().data();
1536 if(!m_View3d.m_CameraRecord.LoadCamera(fname.c_str()))
1539 ui.listCamera->blockSignals(true);
1540 ui.listCamera->clear();
1541 for (size_t i = 0; i < m_View3d.m_CameraRecord.m_Records.size(); ++i)
1543 ui.listCamera->addItem( QString::number(i) );
1545 ui.listCamera->blockSignals(false);
1551 void FormMain::actionGeomStates_Triggered(bool)
1553 ApplyGeomStateFromGUI();
1555 m_Scene.UpdateTransform();
1560 void FormMain::ApplyGeomStateFromGUI(void)
1562 m_Scene.m_Config.m_EnableAutoCentering = ui.actionCentering->isChecked();
1563 m_Scene.m_Config.m_EnableAutoReisze = ui.actionAutoResize->isChecked();
1566 void FormMain::ApplyGeomStateDataoToGUI(void)
1568 ui.actionAutoResize ->setChecked( m_Scene.m_Config.m_EnableAutoReisze );
1569 ui.actionCentering ->setChecked( m_Scene.m_Config.m_EnableAutoCentering );
1571 ui.checkShowOnlySelect->setChecked(m_View3d.m_Config.m_ShowOnlySelect);
1574 void FormMain::on_actionGeomClear_triggered()
1580 void FormMain::on_actionUVFitView_triggered()
1586 void FormMain::on_actionSelObjectDelete_triggered()
1588 DeleteSelectedObject();
1591 void FormMain::on_actionSelObjectReload_triggered()
1593 GeomObject* obj = m_Scene.GetPrimaryObject();
1597 if (!obj->IsFileObject())
1599 QMessageBox::information(this, "", "IsNotFileObject");
1603 m_Scene.ReloadObject(obj);
1605 RebuildObjectList();
1607 m_View3d.ClearRenderMap();
1611 void FormMain::on_actionSelObjectVisible_triggered()
1613 FlipVisibleSelectedObject();
1616 void FormMain::on_actionSelObjectVertexOnlyMode_triggered()
1618 GeomObject* obj = m_Scene.GetPrimaryObject();
1622 obj->m_VertexOnlyMode = !obj->m_VertexOnlyMode;
1624 ui.actionSelObjectVertexOnlyMode->setChecked(obj->m_VertexOnlyMode);
1629 void FormMain::on_actionSelObjectFlipFace_triggered()
1631 m_Scene.FlipCurselFace(false);
1633 ui.GLWidgetMain->makeCurrent();
1634 std::vector<MeshBuf*> mv = m_Scene.GetCurSelMeshes();
1635 for (MeshBuf* m : mv)
1637 m_View3d.ReleaseRenderbuffer(m);
1639 ui.GLWidgetMain->doneCurrent();
1644 void FormMain::on_actionSelObjectFlipNormal_triggered()
1646 m_Scene.FlipCurselFace(true);
1648 ui.GLWidgetMain->makeCurrent();
1649 std::vector<MeshBuf*> mv = m_Scene.GetCurSelMeshes();
1650 for (MeshBuf* m : mv)
1652 m_View3d.ReleaseRenderbuffer(m);
1654 ui.GLWidgetMain->doneCurrent();
1659 void FormMain::on_actionSelObjectOpenDir_triggered()
1661 GeomObject* obj = m_Scene.GetPrimaryObject();
1665 if (!obj->IsFileObject())
1668 QString path = QString::fromLocal8Bit(obj->m_FilePath.c_str());
1669 QString p2 = QDir::toNativeSeparators(path);
1670 QGui::ShowExplorerFileSel(p2);
1673 void FormMain::on_actionShowOnlySelected_triggered()
1675 ShowObjectOnlySelected();
1678 void FormMain::on_actionSelObjectTriangulate_triggered()
1680 MeshBuf* mbuf = m_Scene.GetPrimaryMeshbuf();
1684 mbuf->Triangulate();
1686 m_View3d.ReleaseAllRenderBuffer();
1688 RebuildObjectList();
1692 void FormMain::on_actionTreeCollapseAll_triggered()
1694 TreeUtil::SetAllTopExpand(ui.treeObjects, false);
1697 void FormMain::on_actionTreeExpandAll_triggered()
1699 TreeUtil::SetAllTopExpand(ui.treeObjects, true);
1703 void FormMain::on_actionAddSample_triggered()
1705 SampleShapeBuilder::CreateSphere(m_Scene);
1709 void FormMain::on_actionAddGroundPlane_triggered()
1711 SampleShapeBuilder::CreateGroundPlane(m_Scene);
1715 void FormMain::OnDoneAddGeom(void)
1717 QTreeWidget* obj_tree = ui.treeObjects;
1719 const GeomObject& obj = m_Scene.m_Objects.back();
1721 obj_tree->setCurrentItem(NULL);
1722 obj_tree->blockSignals(true);
1724 QTreeWidgetItem* n = CreateObjectTreeNode(obj);
1725 PushbackTreeNode(obj_tree, n);
1726 n->setExpanded(true);
1728 SetPrimayrSelectObjectFromScene();
1730 obj_tree->blockSignals(false);
1732 if (obj_tree->currentItem() == NULL)
1734 if (!m_Scene.m_Objects.empty())
1736 QTreeWidgetItem * j = obj_tree->topLevelItem(0);
1737 obj_tree->setCurrentItem(j);
1744 ResizeTreeColumns(obj_tree, 4);
1746 ResetSequenceSliderRange();
1752 void FormMain::on_actionShaderDefault_triggered(bool)
1754 ChangeShaderMenuMain(ShaderType::Default);
1757 void FormMain::on_actionShaderPhong_triggered(bool)
1759 ChangeShaderMenuMain(ShaderType::Phong);
1762 void FormMain::on_actionShaderCustom_triggered(bool)
1764 ChangeShaderMenuMain(ShaderType::Custom);
1767 void FormMain::on_actionNormalColor_triggered(bool)
1769 ChangeShaderMenuMain(ShaderType::NormalColor);
1772 void FormMain::on_actionDepthColor_triggered(bool)
1774 ChangeShaderMenuMain(ShaderType::DepthColor);
1777 void FormMain::on_actionShadowmap_triggered(bool)
1779 ChangeShaderMenuMain(ShaderType::Shadowmap);
1782 void FormMain::on_actionEnvmap_triggered(bool)
1784 ChangeShaderMenuMain(ShaderType::Envmap);
1787 void FormMain::on_actionIntegrateShader_triggered(bool)
1789 ChangeShaderMenuMain(ShaderType::Integrate);
1792 void FormMain::on_actionMatcapShader_triggered(bool)
1794 ChangeShaderMenuMain(ShaderType::Matcap);
1797 void FormMain::SyncShaderSettingsToGUI(void)
1799 ChangeShaderMenuMain(m_View3d.m_Config.m_ShaderMode);
1802 void FormMain::ChangeShaderMenuMain(ShaderType type)
1804 m_View3d.m_Config.m_ShaderMode = type;
1809 void FormMain::on_actionCreate_Check_triggered()
1811 CreateSampleTextureMain(SampleTextureBuilder::TEX_CHECKER);
1814 void FormMain::on_actionCreate_Stripe_V_triggered()
1816 CreateSampleTextureMain(SampleTextureBuilder::TEX_STRIPE_V);
1819 void FormMain::on_actionCreate_Stripe_H_triggered()
1821 CreateSampleTextureMain(SampleTextureBuilder::TEX_STRIPE_H);
1824 void FormMain::CreateSampleTextureMain(SampleTextureBuilder::TextureType tex_type)
1826 m_ContextShare.BeginDrawTop();
1827 m_Scene.CreateSampleTexture(tex_type);
1828 m_ContextShare.EndDrawTop();
1833 bool FormMain::IsAutUVFit(void) const
1835 return ui.actionUVAutoFit->isChecked();
1839 void FormMain::on_pushDeleteSelectedObject_clicked()
1841 DeleteSelectedObject();
1844 void FormMain::on_treeObjects_itemChanged(QTreeWidgetItem * item, int column)
1846 QTreeWidget* obj_tree = ui.treeObjects;
1850 QTreeWidgetItem* t = item->parent();
1851 bool checked = (item->checkState(1) == Qt::Checked);
1854 int sel_idx = obj_tree->indexOfTopLevelItem(item);
1855 GeomObject& obj = m_Scene.m_Objects[sel_idx];
1856 obj.m_Visible = checked;
1860 int sel_idx = obj_tree->indexOfTopLevelItem(t);
1861 int midx = t->indexOfChild(item);
1863 GeomObject& obj = m_Scene.m_Objects[sel_idx];
1864 MeshBuf& mb = obj.m_MeshAry[midx];
1865 mb.m_Visible = checked;
1873 void FormMain::DeleteSelectedObject()
1875 QTreeWidget* obj_tree = ui.treeObjects;
1876 QTreeWidgetItem* ti = obj_tree->currentItem();
1880 QTreeWidgetItem* pn = ti->parent();
1884 sel_idx = obj_tree->indexOfTopLevelItem(ti);
1886 sel_idx = obj_tree->indexOfTopLevelItem(pn);
1891 m_ContextShare.BeginDrawTop();
1893 m_Scene.RemoveItem(sel_idx);
1895 m_ContextShare.EndDrawTop();
1897 m_View3d.ClearRenderMap();
1899 obj_tree->setCurrentItem(NULL);
1900 obj_tree->takeTopLevelItem(sel_idx);
1902 ResizeTreeColumns(obj_tree, 4);
1904 ti = obj_tree->currentItem();
1905 sel_idx = obj_tree->indexOfTopLevelItem(ti);
1906 m_Scene.m_Sels.SelectObject(sel_idx);
1908 m_Scene.UpdateTransform();
1910 RefreshObjectSelectState();
1912 ResetSequenceSliderRange();
1917 void FormMain::FlipVisibleSelectedObject()
1919 QTreeWidget* obj_tree = ui.treeObjects;
1920 QTreeWidgetItem * item = obj_tree->currentItem();
1924 item->setCheckState(1, FilpState(item->checkState(1)));
1927 Qt::CheckState FormMain::FilpState(Qt::CheckState state) const
1929 if(state == Qt::Checked)
1930 return Qt::Unchecked;
1935 void FormMain::ShowObjectOnlySelected(void)
1937 GeomObject* sel_obj = m_Scene.GetPrimaryObject();
1938 if (sel_obj == NULL)
1941 for (GeomObject& o : m_Scene.m_Objects)
1943 o.m_Visible = (sel_obj == &o);
1946 RebuildObjectList();
1950 void FormMain::ShowAllObject(void)
1952 m_Scene.ShowAllObject();
1954 RebuildObjectList();
1958 void FormMain::HideAllObject(void)
1960 m_Scene.HideAllObject();
1962 RebuildObjectList();
1966 void FormMain::on_actionUVResetView_triggered()
1968 m_View2d.ResetView();
1974 //!
\83\8f\83C
\83\84\81[
\83I
\81[
\83o
\81[
\83\8c\83C
\95\
\8e¦
\8e\9e\82Ì
\90F
\90Ý
\92è
1975 void FormMain::on_actionWireColor_triggered()
1977 m_WireColorSelDlg.exec();
1980 //!
\83f
\83t
\83H
\83\8b\83g
\83}
\83e
\83\8a\83A
\83\8b\82Ì
\90F
\90Ý
\92è
1981 void FormMain::on_actionFaceColor_triggered()
1983 const lib_graph::color4f& c = m_Scene.m_DefaultMaterial.m_Diffuse;
1985 m_DiffuseColorSelDlg.setOption(QColorDialog::ShowAlphaChannel);
1986 m_DiffuseColorSelDlg.setCurrentColor(ToQColor(c));
1987 m_DiffuseColorSelDlg.exec();
1990 //!
\94w
\8ci
\90F
\82Ì
\90Ý
\92è
1991 void FormMain::on_actionBackGroundColor_triggered()
1993 const lib_graph::color4f& c = m_View3d.m_BGColor;
1995 m_BGColorSelDlg.setCurrentColor(ToQColor(c));
1996 m_BGColorSelDlg.exec();
1999 void FormMain::WireOverlayColorChanged(const QColor & color)
2001 lib_graph::color3b& c = m_View3d.m_Config.m_WireColor;
2002 c.set(color.red(), color.green(), color.blue());
2004 m_View3d.ReleaseAllRenderBuffer();
2009 void FormMain::CopyRGB(lib_graph::color4f& c, const QColor & color)
2011 c.r() = (float)color.red() / 255.0f;
2012 c.g() = (float)color.green() / 255.0f;
2013 c.b() = (float)color.blue() / 255.0f;
2016 void FormMain::CopyRGBA(lib_graph::color4f& c, const QColor & color)
2018 c.r() = (float)color.red() / 255.0f;
2019 c.g() = (float)color.green() / 255.0f;
2020 c.b() = (float)color.blue() / 255.0f;
2021 c.a() = (float)color.alpha() / 255.0f;
2024 void FormMain::FaceDiffuseColorChanged(const QColor & color)
2026 lib_graph::color4f& c = m_Scene.m_DefaultMaterial.m_Diffuse;
2029 m_View3d.ReleaseAllRenderBuffer();
2033 void FormMain::BGColorChanged(const QColor & color)
2035 lib_graph::color4f& c = m_View3d.m_BGColor;
2041 void FormMain::SetSelectedMaterialColor(QColor col)
2043 lib_geo::BaseMaterial* mat = m_Scene.GetSelectedMaterial();
2047 if (m_SelMatColorWidget == ui.colorAmbient ) CopyRGBA(mat->m_Ambient , col);
2048 if (m_SelMatColorWidget == ui.colorEmission ) CopyRGBA(mat->m_Emission , col);
2049 if (m_SelMatColorWidget == ui.colorDiffuse ) CopyRGBA(mat->m_Diffuse , col);
2050 if (m_SelMatColorWidget == ui.colorSpecular ) CopyRGBA(mat->m_Specular , col);
2052 SetColorPalleteBG(m_SelMatColorWidget, col);
2055 void FormMain::SelMatColorChanged(const QColor & color)
2057 SetSelectedMaterialColor(color);
2058 m_View3d.ResetPrimaryObjectLists();
2063 void FormMain::on_actionWindowOptions_triggered()
2065 m_ViewConfigDlg.showNormal();
2066 m_ViewConfigDlg.show();
2067 m_ViewConfigDlg.activateWindow();
2070 void FormMain::on_actionWindowCustomShader_triggered()
2072 if (m_CustomShaderDlg == NULL)
2074 m_CustomShaderDlg = new FormCustomShader(this);
2075 m_CustomShaderDlg->SetShaderLibrary(&m_View3d.m_ShaderLib);
2076 m_CustomShaderDlg->SetParentWidget(ui.GLWidgetMain);
2077 m_CustomShaderDlg->LoadOrSetDefaultCode();
2080 SIGNAL(ShaderBuild()),
2082 SLOT(CustomShaderDlg_ShaderBuild()));
2085 m_CustomShaderDlg->showNormal();
2086 m_CustomShaderDlg->show();
2087 m_CustomShaderDlg->activateWindow();
2091 void FormMain::ConfigChangedDlg_ConfigChanged()
2093 m_View3d.ReleaseAllRenderBuffer();
2097 void FormMain::CrossSectionDlg_ConfigChanged()
2103 void FormMain::OnPaintImage(QPrinter *printer)
2105 QPainter painter(printer);
2107 QRect rect = painter.viewport();
2108 QSize size = this->size();
2109 size.scale(rect.size(), Qt::KeepAspectRatio);//
\8fc
\89¡
\94ä
\88Û
\8e\9d
2111 painter.setViewport(rect.x(), rect.y(), size.width(), size.height());
2112 painter.setWindow(this->rect());
2114 this->render(&painter);
2117 void FormMain::on_actionPrint_triggered()
2122 void FormMain::on_actionPrintPreview_triggered()
2127 void FormMain::PrintImage(bool WithPreview)
2129 //QPrinter printer(QPrinter::ScreenResolution);
2130 QPrinter printer(QPrinter::ScreenResolution);
2134 QPrintPreviewDialog preview(&printer, this);
2135 preview.setWindowFlags( Qt::Window );
2138 SIGNAL(paintRequested(QPrinter *)),
2139 SLOT(OnPaintImage(QPrinter *)));
2141 preview.showMaximized();
2146 QPrintDialog printDialog(&printer, this);
2147 if(printDialog.exec() == QDialog::Accepted)
2148 OnPaintImage(&printer);
2153 void FormMain::on_pushButtonAddCameraRecord_clicked()
2155 m_View3d.RecordCamera();
2157 ui.listCamera->addItem( QString::number(ui.listCamera->count()) );
2162 void FormMain::on_pushButtonDeleteCameraRecord_clicked()
2164 int idx = ui.listCamera->currentRow();
2168 m_View3d.RemoveRecordedCamera(idx);
2170 for (int i = idx+1; i < ui.listCamera->count(); ++i)
2172 ui.listCamera->item(i)->setText(QString::number(i - 1));
2175 ui.listCamera->takeItem(idx);
2180 void FormMain::on_pushCameraRecordClear_clicked()
2182 m_View3d.ClearRecordedCamera();
2184 ui.listCamera->clear();
2189 void FormMain::on_listCamera_itemDoubleClicked(QListWidgetItem *item)
2191 int idx = ui.listCamera->currentRow();
2195 m_View3d.MoveToRecordedCamera(idx, ui.checkCameraAnimation->isChecked());
2198 void FormMain::on_actionSaveCamera_triggered()
2200 QString title = "camera";
2201 QString filter = "Camera File(*.camera)";
2202 QString fileName = GetFilePathFromSaveDlg(title, filter);
2203 if (fileName.isEmpty())
2206 m_View3d.m_CameraRecord.SaveCamera(fileName.toLocal8Bit().data());
2209 void FormMain::on_actionProjectionOrtho_triggered()
2211 ui.actionProjectionOrtho->setChecked(true);
2212 ui.actionProjectionPers->setChecked(false);
2214 m_View3d.m_Camera.m_ProjMode = gl::Camera::PROJ_ORTHO;
2219 void FormMain::on_actionProjectionPers_triggered()
2221 ui.actionProjectionPers->setChecked(true);
2222 ui.actionProjectionOrtho->setChecked(false);
2224 m_View3d.m_Camera.m_ProjMode = gl::Camera::PROJ_PERS;
2230 void FormMain::CustomShaderDlg_ShaderBuild()
2235 void FormMain::OnAnimationTimerUpdated()
2237 static const float rot_speed = 0.005f;
2239 if (ui.actionRotateCamera->isChecked())
2241 m_View3d.m_Camera.m_Manip.Tumble(rot_speed, 0.0f);
2242 UpdateCameraStatus();
2245 if (ui.actionRotateLight->isChecked())
2246 m_View3d.m_ControlLight.m_Position.rotate_y(rot_speed);
2248 if (ui.actionAnimation->isChecked())
2251 if (IsLastSequence())
2252 ui.actionAnimation->setChecked(false);
2254 else if (ui.actionAnimationRev->isChecked())
2257 if (IsTopSequence())
2258 ui.actionAnimationRev->setChecked(false);
2264 void FormMain::on_actionRotateCamera_toggled(bool checked)
2269 void FormMain::on_actionRotateLight_toggled(bool checked)
2274 void FormMain::on_actionAnimation_toggled(bool checked)
2278 ui.actionAnimationRev->setChecked(false);
2279 if (IsLastSequence())
2281 QSlider* s = ui.sliderSequence;
2286 ui.butonAnimationFwd->blockSignals(true);
2287 ui.butonAnimationFwd->setChecked(checked);
2288 ui.butonAnimationFwd->blockSignals(false);
2293 void FormMain::on_actionAnimationRev_toggled(bool checked)
2297 ui.actionAnimation->setChecked(false);
2298 if (IsTopSequence())
2300 QSlider* s = ui.sliderSequence;
2301 s->setValue(s->maximum());
2305 ui.butonAnimationRev->blockSignals(true);
2306 ui.butonAnimationRev->setChecked(checked);
2307 ui.butonAnimationRev->blockSignals(false);
2312 void FormMain::on_butonAnimationFwd_toggled(bool checked)
2314 ui.actionAnimation->setChecked(checked);
2317 void FormMain::on_butonAnimationRev_toggled(bool checked)
2319 ui.actionAnimationRev->setChecked(checked);
2322 void FormMain::UpdateAnimState(void)
2324 if (IsEnableAnimation())
2325 m_AnimationTimer.start();
2327 m_AnimationTimer.stop();
2330 bool FormMain::IsEnableAnimation(void)
2332 if (ui.actionRotateCamera->isChecked())
2334 if (ui.actionRotateLight->isChecked())
2336 if (ui.actionAnimation->isChecked())
2338 if (ui.actionAnimationRev->isChecked())
2344 void FormMain::on_actionCrossSectionDlg_triggered()
2346 m_CrossSectionDlg.showNormal();
2347 m_CrossSectionDlg.show();
2348 m_CrossSectionDlg.activateWindow();
2351 void FormMain::on_actionSelectNext_triggered()
2353 AddSelectObjectIdx(1);
2356 void FormMain::on_actionSelectPrev_triggered()
2358 AddSelectObjectIdx(-1);
2361 void FormMain::AddSelectObjectIdx(int step)
2363 QTreeWidget* obj_tree = ui.treeObjects;
2365 int num_obj = obj_tree->topLevelItemCount();
2369 QTreeWidgetItem * i = obj_tree->currentItem();
2370 int idx = obj_tree->indexOfTopLevelItem(i);
2375 else if (idx >= num_obj)
2378 QTreeWidgetItem * j = obj_tree->topLevelItem(idx);
2379 obj_tree->setCurrentItem(j);
2382 void FormMain::on_actionSwitchVisible_triggered()
2384 FlipVisibleSelectedObject();
2387 void FormMain::on_actionActionSelObjectShowOnlyOnce_triggered()
2389 ShowObjectOnlySelected();
2392 void FormMain::on_actionHideAll_triggered()
2397 void FormMain::on_actionShowAll_triggered()
2402 void FormMain::on_actionVertexBuilder_triggered()
2404 FormVertexBuilder builder;
2405 builder.CreateVertex(m_Scene);
2407 RebuildObjectList();
2411 void FormMain::on_actionFullScreen_triggered()
2413 m_FullscreenPanel.ShowWidgetAsFullscreen(ui.splitter, ui.gridLayout_4);
2416 void FormMain::on_actionResetConfig_triggered()
2418 QString msg = QString::fromLocal8Bit("
\90Ý
\92è
\82ð
\83\8a\83Z
\83b
\83g
\82µ
\82Ü
\82·");
2419 if (QMessageBox::question(this, "", msg, QMessageBox::Ok|QMessageBox::Cancel) != QMessageBox::Ok)
2422 setGeometry(m_InitRect);
2424 LoadDefaultConfig();
2426 SyncViewSettingsFromGUI();
2427 SyncUVViewSettingsFromGUI();
2428 ApplyGeomStateFromGUI();
2429 SyncShaderSettingsToGUI();
2432 QString FormMain::GetFilePathFromOpenDlg(const QString& title, const QString& filter)
2434 QString default_path = GetNextDefaultPathForFileDlg();
2435 QString s = QFileDialog::getOpenFileName(this, title, default_path, filter);
2438 m_LastFileDialogDir = QFileInfo(s).absolutePath();
2443 QString FormMain::GetFilePathFromSaveDlg(const QString& title, const QString& filter)
2445 QString default_path = GetNextDefaultPathForFileDlg();
2446 QString s = QFileDialog::getSaveFileName(this, title, default_path, filter);
2449 m_LastFileDialogDir = QFileInfo(s).absolutePath();
2454 bool FormMain::IsSupportedTextureExt(const QString& path) const
2456 QString ext = QFileInfo(path).suffix().toLower();
2458 std::map<QString, bool> types;
2459 types[ "png" ] = true;
2460 types[ "jpg" ] = true;
2461 types[ "jepg" ] = true;
2462 types[ "bmp" ] = true;
2463 types[ "tif" ] = true;
2464 types[ "tiff" ] = true;
2469 QString FormMain::GetSupportedImageFilePathFromDlg(const QString& title)
2471 FileDlgFilterList exts;
2472 exts.Add( "Png" , "png" );
2473 exts.Add( "Jpg" , "jpg" );
2474 exts.Add( "Jpg" , "jpeg" );
2475 exts.Add( "Bmp" , "bmp" );
2476 exts.Add( "Tif" , "tif" );
2477 exts.Add( "Tif" , "tiff" );
2479 QString filter = FileDlgUtil::ExtListToDlgFilter("Image", exts);
2480 return GetFilePathFromOpenDlg(title, filter);
2484 QString FormMain::GetNextDefaultPathForFileDlg(void)
2486 if (m_LastFileDialogDir.isEmpty())
2487 return PathInfo::GetMyDocDirPath();
2489 return m_LastFileDialogDir;
2493 void FormMain::on_toolLoadEnvMap_clicked()
2495 QString fileName = GetSupportedImageFilePathFromDlg("Open envmap");
2496 if (fileName.isEmpty())
2499 LoadEnvMap(fileName);
2502 void FormMain::LoadEnvMap(QString& path)
2504 m_ContextShare.BeginDrawTop();
2505 m_Scene.m_EnvImg.LoadTexture(path.toLocal8Bit().data());
2506 m_ContextShare.EndDrawTop();
2508 QString title = QFileInfo(path).fileName();
2509 ui.editEnvMap->setText(title);
2514 void FormMain::on_buttonReleaseEnvImg_clicked()
2516 m_ContextShare.BeginDrawTop();
2517 m_Scene.m_EnvImg.ClearEnv();
2518 m_ContextShare.EndDrawTop();
2520 ui.editEnvMap->clear();
2525 void FormMain::on_buttonPresetEnvMap_clicked()
2527 if (m_EnvmapDlg == NULL)
2529 m_EnvmapDlg = new EnvmapSelectDlg(this);
2532 SIGNAL(ListSelectChanged()),
2534 SLOT(EnvmapDlg_ListSelectChanged()));
2537 m_EnvmapDlg->show();
2540 void FormMain::EnvmapDlg_ListSelectChanged()
2542 QString p = m_EnvmapDlg->GetSelectedItemPath();
2549 void FormMain::on_toolLoadMatcap_clicked()
2551 QString fileName = GetSupportedImageFilePathFromDlg("Open matcap");
2552 if (fileName.isEmpty())
2555 LoadMatcapImage(fileName);
2558 void FormMain::on_buttonReleaseMatcap_clicked()
2560 m_ContextShare.BeginDrawTop();
2561 m_Scene.m_MatcapImg.ClearEnv();
2562 m_ContextShare.EndDrawTop();
2564 ui.editMatcap->clear();
2569 void FormMain::on_buttonLoadMatcapPreset_clicked()
2571 if (m_MatcapDlg == NULL)
2573 m_MatcapDlg = new MatcapSelectDlg(this);
2576 SIGNAL(ListSelectChanged()),
2578 SLOT(MatcapDlg_ListSelectChanged()));
2581 m_MatcapDlg->show();
2584 void FormMain::MatcapDlg_ListSelectChanged()
2586 QString p = m_MatcapDlg->GetSelectedItemPath();
2593 void FormMain::on_sliderEnvReflection_valueChanged(int value)
2595 float r = GetSliderNormalizedPos(ui.sliderEnvReflection);
2596 m_Scene.m_EnvImg.m_EnvReflection = r;
2602 void FormMain::on_comboCoordinate_currentIndexChanged(int index)
2604 SceneTransform& transform = m_Scene.m_WorldTransform;
2606 int idx = ui.comboCoordinate->currentIndex();
2609 case 0: transform.SetCoordType(geom::SceneTransform::COORD_RUF); break;
2610 case 1: transform.SetCoordType(geom::SceneTransform::COORD_FRU); break;
2611 case 2: transform.SetCoordType(geom::SceneTransform::COORD_UFR); break;
2612 case 3: transform.SetCoordType(geom::SceneTransform::COORD_RUB); break;
2613 case 4: transform.SetCoordType(geom::SceneTransform::COORD_BRU); break;
2614 case 5: transform.SetCoordType(geom::SceneTransform::COORD_UBR); break;
2622 void FormMain::on_sliderShadowDarkness_valueChanged(int value)
2624 int b = ui.sliderShadowDarkness->minimum();
2625 int t = ui.sliderShadowDarkness->maximum();
2627 float r = (float)(value - b) / (float)(t - b);
2628 m_Scene.m_ShadowConfig.m_ShadowDarkness = r;
2633 void FormMain::on_buttonClearAllGeoms_clicked()
2638 //!
\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³
2639 void FormMain::on_checkCameraAnimation_toggled(bool checked)
2644 void FormMain::on_actionOpenAppdir_triggered()
2646 PathInfo::OpenAppDir();
2649 void FormMain::on_actionOpenConfigDir_triggered()
2651 PathInfo::OpenConfigDir();
2654 void FormMain::on_buttonDecGridAxis_clicked()
2656 m_View3d.m_GridAxisScale /= 10.0f;
2660 void FormMain::on_buttonIncGridAxis_clicked()
2662 m_View3d.m_GridAxisScale *= 10.0f;
2666 void FormMain::on_buttonResetGridAxis_clicked()
2668 m_View3d.m_GridAxisScale = 1.0f;
2673 void FormMain::View3D_SelectedObjectChanged(int sel_obj, int sel_mesh)
2675 QTreeWidgetItem* on = ui.treeObjects->topLevelItem(sel_obj);
2679 ui.treeObjects->setCurrentItem(on);
2683 QTreeWidgetItem* mn = on->child(sel_mesh);
2684 ui.treeObjects->setCurrentItem(mn);
2688 void FormMain::View3D_SelectedMatChanged(int sel_idx)
2690 ui.listMaterial->setCurrentRow(sel_idx);
2693 void FormMain::View3D_CameraMoved(void)
2695 UpdateCameraStatus();
2698 void FormMain::View3D_StatusTipChanged(QString msg)
2700 //ui.statusBar->showMessage(msg, 1500);
2703 void FormMain::View3D_SequenceStepped(int step)
2708 void FormMain::View3D_CursorMoved()
2710 Cursor3D& c = m_Scene.m_Cursor3d;
2711 QString x = QString::number(c.CursorPos.x, 'f', 4);
2712 QString y = QString::number(c.CursorPos.y, 'f', 4);
2713 QString z = QString::number(c.CursorPos.z, 'f', 4);
2727 ui.editCursorPos->setText(s);
2730 void FormMain::StepSequence(int step)
2732 QSlider* s = ui.sliderSequence;
2733 s->setValue(s->value() + step);
2736 bool FormMain::IsLastSequence(void)
2738 QSlider* s = ui.sliderSequence;
2739 return s->value() == s->maximum();
2742 bool FormMain::IsTopSequence(void)
2744 QSlider* s = ui.sliderSequence;
2745 return s->value() == 0;
2748 void FormMain::UpdateCameraStatus(void)
2750 const Camera& camera = m_View3d.m_Camera;
2751 const lib_gl::CameraManipulator& manip = camera.m_Manip;
2752 const lm::vec3f& vp = manip.m_ViewPos;
2755 manip.GetViewAngles(a, b);
2756 a = a * 180.0f / M_PI;
2757 b = b * 180.0f / M_PI;
2761 msg += QString::number(vp.x, 'f', 2) + " ";
2762 msg += QString::number(vp.y, 'f', 2) + " ";
2763 msg += QString::number(vp.z, 'f', 2);
2767 msg += QString::number(a, 'f', 2) + " ";
2768 msg += QString::number(b, 'f', 2);
2772 msg += QString::number(camera.m_Projection.m_Near, 'f', 2) + " ";
2773 msg += QString::number(camera.m_Projection.m_Far, 'f', 2);
2776 m_StatusBar1->setText(msg);
2779 void FormMain::on_actionCameraFPSMode_toggled(bool arg1)
2781 m_View3d.m_FpsMode = arg1;
2785 void FormMain::actionCursorMenuStates_Toggled(bool)
2787 m_Binder_Cursor.UpdateAllData();
2789 if (QObject::sender() == ui.actionRecordStroke)
2791 m_Scene.m_Cursor3d.CutStroke();
2797 void FormMain::on_actionResetCursor_triggered()
2799 m_Scene.m_Cursor3d.ResetCursorPos();
2800 m_Scene.m_Cursor3d.UpdateNormal(m_View3d.m_Camera.m_Manip.GetFront());
2804 void FormMain::on_actionResetMeasure_triggered()
2806 m_View3d.ResetCursorMeasure();
2811 void FormMain::on_actionPyScript_triggered()
2813 if (m_PyScriptDlg == NULL)
2815 m_PyScriptDlg = new FormPyScript(this);
2816 m_PyScriptDlg->m_Scene = &m_Scene;
2817 m_PyScriptDlg->m_View3d = &m_View3d;
2818 m_PyScriptDlg->m_View2d = &m_View2d;
2821 m_PyScriptDlg->showNormal();
2822 m_PyScriptDlg->show();
2823 m_PyScriptDlg->activateWindow();
2826 void FormMain::on_actionConsole_triggered()
2829 freopen( "CON", "r", stdin );
2830 freopen( "CON", "w", stdout );
2834 void FormMain::on_actionClearVertSelect_triggered()
2836 m_Scene.ClearAllVertSelect();
2841 void FormMain::on_action_About_triggered()
2847 void FormMain::on_action_Association_triggered()
2849 m_AssociationDlg.exec();
2852 void FormMain::on_actionLookDepth_triggered()
2854 m_View3d.LookDepth();
2857 void FormMain::on_actionLook3DCursor_triggered()
2859 m_View3d.Look3DCursor();
2862 void FormMain::on_sliderLightPower_valueChanged(int value)
2864 float val = (float)ui.sliderLightPower->value();
2865 float val_max = (float)ui.sliderLightPower->maximum();
2866 float n = 2.0f * val / val_max;
2868 m_View3d.SetLightStrengthByStdRatio(n);
2870 ui.labelLightPower->setText(QString("LightPower ") + QString::number(n, 'f', 2));
2875 void FormMain::on_buttonResetLightPower_clicked()
2877 ui.sliderLightPower->setValue(1000);
2880 void FormMain::on_checkHoleAroundCursor_clicked(bool checked)
2883 ui.checkShowOnlyAroundCursor->setChecked(false);
2886 m_Scene.m_Cursor3d.CircleClip = Cursor3DCircleClip::Hole;
2888 m_Scene.m_Cursor3d.CircleClip = Cursor3DCircleClip::None;
2893 void FormMain::on_checkShowOnlyAroundCursor_toggled(bool checked)
2896 ui.checkHoleAroundCursor->setChecked(false);
2899 m_Scene.m_Cursor3d.CircleClip = Cursor3DCircleClip::ShowAround;
2901 m_Scene.m_Cursor3d.CircleClip = Cursor3DCircleClip::None;
2906 void FormMain::on_sliderCursorHoleRange_valueChanged(int value)
2908 float val = (float)ui.sliderCursorHoleRange->value();
2909 float maxval = (float)ui.sliderCursorHoleRange->maximum();
2910 float n = val / maxval;
2912 m_Scene.m_Cursor3d.HoleRangeRatio = n;
2916 void FormMain::on_buttonResetCursorHoleRange_clicked()
2921 void FormMain::ResetHoleRange(void)
2923 ui.sliderCursorHoleRange->setValue(500);
2926 void FormMain::on_actionSaveImageToMydoc_triggered()
2928 QString path = PathInfo::GetMyDocDirPath();
2929 QString basename = path + "/" + "qgv_snap_";
2931 QDateTime dt = QDateTime::currentDateTime();
2936 QString tp = dt.toString("yyyyMMdd_hhmmss_zzz");
2937 dst = basename + tp + ".png";
2938 if (!QFile(dst).exists())
2942 ui.GLWidgetMain->grabFrameBuffer().save(dst);
2945 void FormMain::on_actionPostProcNone_triggered()
2947 ChangePostprocMode(PostProcType::None);
2950 void FormMain::on_actionPostProcAntialias_triggered()
2952 ChangePostprocMode(PostProcType::Antialias);
2955 void FormMain::on_actionPostProcBorder_triggered()
2957 ChangePostprocMode(PostProcType::Border);
2960 void FormMain::on_actionPostProcDepthLayerColor_triggered()
2962 ChangePostprocMode(PostProcType::DepthLayerColor);
2965 void FormMain::on_actionPostProcDepthColor_triggered()
2967 ChangePostprocMode(PostProcType::DepthColor);
2970 void FormMain::on_actionPostProcDepthOfField_triggered()
2972 ChangePostprocMode(PostProcType::DepthOfField);
2975 void FormMain::ChangePostprocMode(PostProcType type)
2977 m_View3d.m_Config.m_PPMode = type;
2981 void FormMain::on_sliderDOFPint_valueChanged(int value)
2983 float n = GetSliderNormalizedPos(ui.sliderDOFPint);
2984 m_View3d.m_PPContext.m_DOFPintPos = n;
2989 void FormMain::on_sliderDOFRange_valueChanged(int value)
2991 float n = GetSliderNormalizedPos(ui.sliderDOFRange);
2992 m_View3d.m_PPContext.m_DOFRange = 10.0f * n;
2997 float FormMain::GetSliderNormalizedPos(const QSlider* slider) const
2999 float t = (float)slider->maximum();
3000 float b = (float)slider->minimum();
3001 float v = (float)slider->value();
3003 return (v - b) / (t - b);
3006 void FormMain::on_buttonResetDOFPint_clicked()
3008 ui.sliderDOFPint->setValue(1000);
3011 void FormMain::on_buttonResetDOFRange_clicked()
3013 ui.sliderDOFRange->setValue(1000);
3016 void FormMain::on_actionAddCrossSectionRecord_triggered()
3018 m_Scene.AddCrossSectionRecord();
3022 void FormMain::on_actionClearCrossSectionRecord_triggered()
3024 m_Scene.ClearCrossSectionRecord();
3028 void FormMain::LoadCurSelMatTexture(TextureType type)
3030 QString path = GetSupportedImageFilePathFromDlg("Load Texture");
3034 LoadCurSelMatTexture(type, path);
3037 void FormMain::LoadCurSelMatTexture(TextureType type, QString filepath)
3039 GeomTextureSet* ts = m_Scene.GetSelectedTexture();
3043 MeshBuf* mbuf = ts->GetParent();
3044 std::string fp = filepath.toLocal8Bit().data();
3046 QString name_qs = QFileInfo(filepath).fileName();
3047 std::string name = name_qs.toLocal8Bit().data();
3049 m_ContextShare.BeginDrawTop();
3051 mbuf->ReleaseTextureUnit(ts, type);
3052 gl::GlTexture* tex = mbuf->GetInitTexture(fp, name, m_Scene.m_TexConfig);
3053 ts->SetTextureUnit(type, tex);
3055 if (type == TextureType::Normal)
3056 m_View3d.ReleaseAllRenderBuffer();
3058 m_ContextShare.EndDrawTop();
3060 OnChangedSelectedMaterial();
3064 void FormMain::ReleaseCurSelTexture(TextureType type)
3066 MeshBuf* mbuf = m_Scene.GetPrimaryMeshbuf();
3070 int mat_idx = m_Scene.m_Sels.GetSelMat();
3072 m_ContextShare.BeginDrawTop();
3073 mbuf->ReleaseTextureUnit(mat_idx, type);
3074 m_ContextShare.EndDrawTop();
3076 OnChangedSelectedMaterial();
3080 void FormMain::LoadMatcapImageForCurrentMat(QString& path)
3082 GeomTextureSet* ts = m_Scene.GetSelectedTexture();
3084 QString title = QFileInfo(path).fileName();
3086 m_ContextShare.BeginDrawTop();
3087 ts->TexMatcap.LoadTexture(path.toLocal8Bit().data());
3088 ts->TexMatcap.SetName(title);
3089 m_ContextShare.EndDrawTop();
3091 OnChangedSelectedMaterial();
3095 void FormMain::LoadMatcapImage(QString& path)
3097 MatcapImage& mc = m_Scene.m_MatcapImg;
3099 QString title = QFileInfo(path).fileName();
3101 m_ContextShare.BeginDrawTop();
3102 mc.LoadTexture(path.toLocal8Bit().data());
3104 m_ContextShare.EndDrawTop();
3106 ui.editMatcap->setText(mc.GetName());
3111 void FormMain::on_buttonOpenMatCapEachMaterial_clicked()
3113 QString path = GetSupportedImageFilePathFromDlg("Load Texture");
3117 LoadMatcapImage(path);
3120 void FormMain::on_buttonClearMatCapEachMaterial_clicked()
3122 geom::GeomTextureSet* tex = m_Scene.GetSelectedTexture();
3126 m_ContextShare.BeginDrawTop();
3127 tex->TexMatcap.ClearEnv();
3128 m_ContextShare.EndDrawTop();
3130 ui.editMatCapEachMaterial->clear();
3135 void FormMain::on_buttonOpenCurrentMatColorMap_clicked()
3137 LoadCurSelMatTexture(TextureType::Color);
3140 void FormMain::on_buttonClearCurrentMatColorMap_clicked()
3142 ReleaseCurSelTexture(TextureType::Color);
3145 void FormMain::on_buttonOpenCurrentMatNormalMap_clicked()
3147 LoadCurSelMatTexture(TextureType::Normal);
3150 void FormMain::on_buttonClearCurrentMatNormalMap_clicked()
3152 ReleaseCurSelTexture(TextureType::Normal);
3155 void FormMain::ChangeMatlemColor(QWidget* col_widget)
3157 lib_geo::BaseMaterial* mat = m_Scene.GetSelectedMaterial();
3161 lib_graph::color4f* col = NULL;
3162 if (col_widget == ui.colorAmbient ) col = &mat->m_Ambient ;
3163 if (col_widget == ui.colorEmission ) col = &mat->m_Emission ;
3164 if (col_widget == ui.colorDiffuse ) col = &mat->m_Diffuse ;
3165 if (col_widget == ui.colorSpecular ) col = &mat->m_Specular ;
3167 lib_graph::color4f src = *col;
3169 QColor dc = ToQColor(*col);
3171 m_SelMatColorWidget = col_widget;
3173 m_SelMatColorSelDlg.setOption(QColorDialog::ShowAlphaChannel);
3174 m_SelMatColorSelDlg.setCurrentColor(dc);
3175 if (m_SelMatColorSelDlg.exec() == QDialog::Rejected)
3178 SetColorPalleteBG(col_widget, dc);
3182 void FormMain::SetColorPalleteBG(QWidget* w, QColor col)
3184 QColor border(0, 0, 0);
3185 SetWidgetColor(w, col, border);
3188 void FormMain::SetWidgetColor(QWidget* w, QColor col)
3190 QString ss = QString("background-color: %1").arg(col.name());
3191 w->setStyleSheet(ss);
3194 void FormMain::SetWidgetColor(QWidget* w, QColor col, QColor col_border)
3197 ss += QString("background-color: %1;").arg(col.name());
3198 ss += QString("border: 1px solid %1;").arg(col_border.name());
3199 w->setStyleSheet(ss);
3202 void FormMain::on_sliderShininess_valueChanged(int value)
3204 lib_geo::BaseMaterial* mat = m_Scene.GetSelectedMaterial();
3208 float val = (float)ui.sliderShininess->value();
3209 float val_max = (float)ui.sliderShininess->maximum();
3211 float real_val = 200.0f * val / val_max;
3213 mat->m_Shininess = real_val;
3215 ui.labelShininessVal->setText(QString::number(real_val, 'f', 2));
3220 void FormMain::CreateRecentFilesMenu(const std::vector<QString>& path)
3222 QMenu* recents = ui.menuOpenRecent;
3223 recents->actions().clear();
3225 for (size_t i = 0; i < path.size(); ++i)
3227 AddRecentFile(path[path.size() - i - 1]);
3231 void FormMain::CreateRecentFilesFromMenu(std::vector<QString>& path)
3233 QMenu* recents = ui.menuOpenRecent;
3234 for (int i = 0; i < recents->actions().size(); ++i)
3236 QAction* a = recents->actions().at(i);
3237 path.push_back(a->text());
3241 void FormMain::AddRecentFile(const QString& path)
3243 QString path_local = QDir::toNativeSeparators(path);
3245 static const int max_files = 10;
3247 QMenu* recents = ui.menuOpenRecent;
3249 for (int i = 0; i < recents->actions().size(); ++i)
3251 QAction* a = recents->actions().at(i);
3252 if (a->text() == path_local)
3254 recents->removeAction(a);
3259 QAction* new_path = new QAction(path_local, this);
3262 SIGNAL(triggered()),
3264 SLOT(OnOpenRecent()));
3266 if (recents->actions().empty())
3267 recents->addAction(new_path);
3269 recents->insertAction(recents->actions().front(), new_path);
3271 if (recents->actions().size() > max_files)
3273 QAction* a = recents->actions().back();
3274 recents->removeAction(a);
3278 void FormMain::OnOpenRecent()
3280 QAction* a = dynamic_cast<QAction*>(QObject::sender());
3285 QString path = a->text();
3287 if (IsResetSceneOnBeforeLoadFile())
3290 if (OpenGeomFile(path))
3294 void FormMain::on_checkShowOnlySelect_toggled(bool checked)
3296 m_View3d.m_Config.m_ShowOnlySelect = checked;
3300 void FormMain::ResizeTreeColumns(QTreeWidget* t, int num_col)
3302 t->setVisible(false);
3303 t->resizeColumnToContents(0);
3304 t->resizeColumnToContents(1);
3305 t->resizeColumnToContents(2);
3306 t->resizeColumnToContents(3);
3307 t->setVisible(true);
3310 void FormMain::PushbackTreeNode(QTreeWidget* tree, QTreeWidgetItem *node)
3312 int next_idx = tree->topLevelItemCount();
3313 tree->insertTopLevelItem(next_idx, node);
3316 QTreeWidgetItem* FormMain::CreateObjectTreeNode(const geom::GeomObject& obj) const
3318 QTreeWidgetItem* n = new QTreeWidgetItem;
3320 n->setText(0, QString::fromLocal8Bit(obj.m_Name.c_str()));
3321 n->setCheckState(1, obj.m_Visible ? Qt::Checked : Qt::Unchecked);
3322 n->setText(2, QString::number(obj.GetNumTotalVerts()));
3323 n->setText(3, QString::number(obj.GetNumTotalFaces()));
3326 for (const MeshBuf& mbuf : obj.m_MeshAry)
3328 n->addChild(CreateMeshBufNode(obj, mbuf, idx++));
3331 n->setExpanded(true);
3336 QTreeWidgetItem* FormMain::CreateMeshBufNode(const geom::GeomObject& obj, const MeshBuf& mbuf, int idx) const
3338 QTreeWidgetItem* n = new QTreeWidgetItem;
3341 if (mbuf.m_Name.empty())
3342 name = QString::fromLocal8Bit(obj.m_Name.c_str()) + QString::number(idx);
3344 name = QString::fromLocal8Bit(mbuf.m_Name.c_str());
3346 n->setText(0, name);
3347 n->setCheckState(1, mbuf.m_Visible ? Qt::Checked : Qt::Unchecked);
3348 n->setText(2, QString::number(mbuf.GetNumVerts()));
3349 n->setText(3, QString::number(mbuf.GetNumFaces()));
3354 void FormMain::InitObjectListHeader(void)
3357 qs << "Name" << "Visible" << "Verts" << "Faces";
3358 ui.treeObjects->setHeaderLabels(qs);
3361 void FormMain::SetPrimayrSelectObjectFromScene(void)
3363 QTreeWidget* obj_tree = ui.treeObjects;
3365 Selection3D& sels = m_Scene.m_Sels;
3366 if (!sels.IsObjectSelected())
3369 int sel_idx = sels.GetSelObjectIdx();
3371 QTreeWidgetItem* on = obj_tree->topLevelItem(sel_idx);
3375 if (sels.IsMBufSelected())
3377 QTreeWidgetItem* mn = on->child(sels.GetMBufIdx());
3378 obj_tree->setCurrentItem(mn);
3382 obj_tree->setCurrentItem(on);
3386 void FormMain::SetPrimayrSelectObjectToScene(void)
3388 Selection3D& sels = m_Scene.m_Sels;
3390 QTreeWidget* tree = ui.treeObjects;
3392 QTreeWidgetItem* sel_node = tree->currentItem();
3393 if (sel_node == NULL)
3396 QTreeWidgetItem* on = sel_node->parent();
3399 int obj_idx = tree->indexOfTopLevelItem(sel_node);
3400 sels.SelectObject(obj_idx);
3404 int obj_idx = tree->indexOfTopLevelItem(on);
3405 int mb_idx = on->indexOfChild(sel_node);
3406 sels.SelectMBuf(obj_idx, mb_idx);
3410 void FormMain::on_actionReleaseShader_triggered()
3412 m_ContextShare.BeginDrawTop();
3414 m_View3d.m_ShaderLib.ReleaseAllShaders();
3416 m_ContextShare.EndDrawTop();
3419 void FormMain::on_combo2DViewSrcType_currentIndexChanged(int index)
3423 case 0 : return m_View2d.ChangeTextureSource(View2DTexSrc::Color);
3424 case 1 : return m_View2d.ChangeTextureSource(View2DTexSrc::Normal);
3431 void FormMain::on_sliderSequence_valueChanged(int value)
3436 void FormMain::ResetSequenceSliderRange(void)
3438 int m = m_Scene.GetKeyframeMax();
3439 ui.sliderSequence->setMaximum(m);
3443 void FormMain::UpdateSequence(void)
3445 int v = ui.sliderSequence->value();
3446 int m = ui.sliderSequence->maximum();
3448 QString s = QString("%1 / %2").arg(v).arg(m);
3449 ui.labelSequencePos->setText(s);
3451 m_Scene.SetFrame(v);
3453 m_View3d.ReleaseAllRenderBuffer();
3457 void FormMain::on_actionNewStroke_triggered()
3459 m_Scene.m_Cursor3d.CutStroke();
3463 void FormMain::on_actionClearStroke_triggered()
3465 m_Scene.m_Cursor3d.ClearStroke();