From 4a3743e7ddea76d60de342eb6beb72d57de121df Mon Sep 17 00:00:00 2001
From: Electro707 <jamalnetemail@gmail.com>
Date: Mon, 8 Jun 2020 21:35:40 +0000
Subject: [PATCH] 3D viewer flip action

---
 .gitignore                                  | 5 +++++
 3d-viewer/3d_canvas/eda_3d_canvas.cpp       | 7 +++++++
 3d-viewer/3d_viewer/3d_toolbar.cpp          | 3 +++
 3d-viewer/3d_viewer/tools/3d_actions.cpp    | 6 ++++++
 3d-viewer/3d_viewer/tools/3d_actions.h      | 1 +
 3d-viewer/3d_viewer/tools/3d_controller.cpp | 4 ++++
 3d-viewer/3d_viewer_id.h                    | 1 +
 7 files changed, 27 insertions(+)

diff --git a/.gitignore b/.gitignore
index 1deae81416..e444e8e9ac 100644
--- a/.gitignore
+++ b/.gitignore
@@ -104,3 +104,8 @@ CMakeSettings.json
 
 # Sublime Text
 *.sublime-*
+
+# KDevelop
+.kdev4/
+*.kdev4
+
diff --git a/3d-viewer/3d_canvas/eda_3d_canvas.cpp b/3d-viewer/3d_canvas/eda_3d_canvas.cpp
index ead38965f9..03ba99efd2 100644
--- a/3d-viewer/3d_canvas/eda_3d_canvas.cpp
+++ b/3d-viewer/3d_canvas/eda_3d_canvas.cpp
@@ -948,6 +948,13 @@ bool EDA_3D_CANVAS::SetView3D( int aKeycode )
         request_start_moving_camera( glm::min( glm::max( m_camera.ZoomGet(), 0.5f ), 1.125f ) );
         return true;
 
+    case ID_VIEW3D_FLIP:
+        m_camera.SetInterpolateMode( CAMERA_INTERPOLATION::BEZIER );
+        m_camera.SetT0_and_T1_current_T();
+        m_camera.RotateY_T1( glm::radians( 179.999f ) );
+        request_start_moving_camera();
+        return true;
+
     default:
         return false;
     }
diff --git a/3d-viewer/3d_viewer/3d_toolbar.cpp b/3d-viewer/3d_viewer/3d_toolbar.cpp
index c62940c2e7..f2fa876bed 100644
--- a/3d-viewer/3d_viewer/3d_toolbar.cpp
+++ b/3d-viewer/3d_viewer/3d_toolbar.cpp
@@ -87,6 +87,9 @@ void EDA_3D_VIEWER::ReCreateMainToolbar()
     m_mainToolBar->Add( EDA_3D_ACTIONS::rotateZCW );
     m_mainToolBar->Add( EDA_3D_ACTIONS::rotateZCCW );
 
+    KiScaledSeparator( m_mainToolBar, this );
+    m_mainToolBar->Add( EDA_3D_ACTIONS::flipView );
+
     KiScaledSeparator( m_mainToolBar, this );
     m_mainToolBar->Add( EDA_3D_ACTIONS::moveLeft );
     m_mainToolBar->Add( EDA_3D_ACTIONS::moveRight );
diff --git a/3d-viewer/3d_viewer/tools/3d_actions.cpp b/3d-viewer/3d_viewer/tools/3d_actions.cpp
index 8e2c8e24ec..a32661ece9 100644
--- a/3d-viewer/3d_viewer/tools/3d_actions.cpp
+++ b/3d-viewer/3d_viewer/tools/3d_actions.cpp
@@ -109,6 +109,12 @@ TOOL_ACTION EDA_3D_ACTIONS::resetView( "3DViewer.Control.resetView",
         _( "Reset view" ), _( "Reset view" ),
         nullptr, AF_NONE, (void*) ID_VIEW3D_RESET );
 
+TOOL_ACTION EDA_3D_ACTIONS::flipView( "3DViewer.Control.flipView",
+        AS_ACTIVE,
+        0, "",
+        _( "Flip Board" ), _( "Flip the board view" ),
+        reload2_xpm, AF_NONE, (void*) ID_VIEW3D_FLIP );
+
 TOOL_ACTION EDA_3D_ACTIONS::toggleOrtho( "3DViewer.Control.toggleOrtho",
         AS_GLOBAL, 0, "",
         _( "Toggle orthographic projection" ), _( "Enable/disable orthographic projection" ),
diff --git a/3d-viewer/3d_viewer/tools/3d_actions.h b/3d-viewer/3d_viewer/tools/3d_actions.h
index 51f3d708f7..6b8d1504e5 100644
--- a/3d-viewer/3d_viewer/tools/3d_actions.h
+++ b/3d-viewer/3d_viewer/tools/3d_actions.h
@@ -56,6 +56,7 @@ public:
     static TOOL_ACTION moveDown;
     static TOOL_ACTION homeView;
     static TOOL_ACTION resetView;
+    static TOOL_ACTION flipView;
     static TOOL_ACTION toggleOrtho;
 
     static TOOL_ACTION viewFront;
diff --git a/3d-viewer/3d_viewer/tools/3d_controller.cpp b/3d-viewer/3d_viewer/tools/3d_controller.cpp
index 5fd6818c45..f653bf8762 100644
--- a/3d-viewer/3d_viewer/tools/3d_controller.cpp
+++ b/3d-viewer/3d_viewer/tools/3d_controller.cpp
@@ -51,6 +51,9 @@ bool EDA_3D_CONTROLLER::Init()
     ctxMenu.AddItem( EDA_3D_ACTIONS::viewFront,   SELECTION_CONDITIONS::ShowAlways );
     ctxMenu.AddItem( EDA_3D_ACTIONS::viewBack,    SELECTION_CONDITIONS::ShowAlways );
 
+    ctxMenu.AddSeparator();
+    ctxMenu.AddItem( EDA_3D_ACTIONS::flipView,    SELECTION_CONDITIONS::ShowAlways );
+
     ctxMenu.AddSeparator();
     ctxMenu.AddItem( EDA_3D_ACTIONS::moveLeft,    SELECTION_CONDITIONS::ShowAlways );
     ctxMenu.AddItem( EDA_3D_ACTIONS::moveRight,   SELECTION_CONDITIONS::ShowAlways );
@@ -295,6 +298,7 @@ void EDA_3D_CONTROLLER::setTransitions()
     Go( &EDA_3D_CONTROLLER::ViewControl,        EDA_3D_ACTIONS::pivotCenter.MakeEvent() );
     Go( &EDA_3D_CONTROLLER::ViewControl,        EDA_3D_ACTIONS::homeView.MakeEvent() );
     Go( &EDA_3D_CONTROLLER::ViewControl,        EDA_3D_ACTIONS::resetView.MakeEvent() );
+    Go( &EDA_3D_CONTROLLER::ViewControl,        EDA_3D_ACTIONS::flipView.MakeEvent() );
     Go( &EDA_3D_CONTROLLER::RotateView,         EDA_3D_ACTIONS::rotateXCW.MakeEvent() );
     Go( &EDA_3D_CONTROLLER::RotateView,         EDA_3D_ACTIONS::rotateXCCW.MakeEvent() );
     Go( &EDA_3D_CONTROLLER::RotateView,         EDA_3D_ACTIONS::rotateYCW.MakeEvent() );
diff --git a/3d-viewer/3d_viewer_id.h b/3d-viewer/3d_viewer_id.h
index 596d170963..1a2773e86b 100644
--- a/3d-viewer/3d_viewer_id.h
+++ b/3d-viewer/3d_viewer_id.h
@@ -31,6 +31,7 @@ enum id_3dview_frm
     ID_VIEW3D_FRONT,
     ID_VIEW3D_BACK,
     ID_VIEW3D_RESET,
+    ID_VIEW3D_FLIP,
     ID_TOOL_SCREENCOPY_TOCLIBBOARD,
     ID_MENU3D_COLOR,
     ID_MENU3D_BGCOLOR,