From f31568180465b8c8662a2569942998f697d281b2 Mon Sep 17 00:00:00 2001
From: Enrico Turri <enricoturri@seznam.cz>
Date: Thu, 3 Oct 2019 12:16:59 +0200
Subject: [PATCH] ENABLE_3DCONNEXION_DEVICES -> Refactored Mouse3DController to
 simplify code

---
 src/slic3r/GUI/Mouse3DController.cpp | 89 +++++-----------------------
 src/slic3r/GUI/Mouse3DController.hpp | 27 ++++-----
 2 files changed, 27 insertions(+), 89 deletions(-)

diff --git a/src/slic3r/GUI/Mouse3DController.cpp b/src/slic3r/GUI/Mouse3DController.cpp
index ccf1adfa2..f4e57b372 100644
--- a/src/slic3r/GUI/Mouse3DController.cpp
+++ b/src/slic3r/GUI/Mouse3DController.cpp
@@ -49,72 +49,6 @@ Mouse3DController::State::State()
 {
 }
 
-void Mouse3DController::State::set_translation(const Vec3d& translation)
-{
-    std::lock_guard<std::mutex> lock(m_mutex);
-    m_translation = translation;
-}
-
-void Mouse3DController::State::set_rotation(const Vec3f& rotation)
-{
-    std::lock_guard<std::mutex> lock(m_mutex);
-    m_rotation = rotation;
-}
-
-void Mouse3DController::State::set_button(unsigned int id)
-{
-    std::lock_guard<std::mutex> lock(m_mutex);
-    m_buttons.push_back(id);
-}
-
-void Mouse3DController::State::reset_buttons()
-{
-    std::lock_guard<std::mutex> lock(m_mutex);
-    return m_buttons.clear();
-}
-
-const Vec3d& Mouse3DController::State::get_translation() const
-{
-    std::lock_guard<std::mutex> lock(m_mutex);
-    return m_translation;
-}
-
-const Vec3f& Mouse3DController::State::get_rotation() const
-{
-    std::lock_guard<std::mutex> lock(m_mutex);
-    return m_rotation;
-}
-
-const std::vector<unsigned int>& Mouse3DController::State::get_buttons() const
-{
-    std::lock_guard<std::mutex> lock(m_mutex);
-    return m_buttons;
-}
-
-bool Mouse3DController::State::has_translation() const
-{
-    std::lock_guard<std::mutex> lock(m_mutex);
-    return !m_translation.isApprox(Vec3d::Zero());
-}
-
-bool Mouse3DController::State::has_rotation() const
-{
-    std::lock_guard<std::mutex> lock(m_mutex);
-    return !m_rotation.isApprox(Vec3f::Zero());
-}
-
-bool Mouse3DController::State::has_translation_or_rotation() const
-{
-    std::lock_guard<std::mutex> lock(m_mutex);
-    return !m_translation.isApprox(Vec3d::Zero()) && !m_rotation.isApprox(Vec3f::Zero());
-}
-
-bool Mouse3DController::State::has_any_button() const
-{
-    std::lock_guard<std::mutex> lock(m_mutex);
-    return !m_buttons.empty();
-}
-
 bool Mouse3DController::State::apply(Camera& camera)
 {
     if (!wxGetApp().IsActive())
@@ -124,28 +58,25 @@ bool Mouse3DController::State::apply(Camera& camera)
 
     if (has_translation())
     {
-        Vec3d translation = get_translation();
-        camera.set_target(camera.get_target() + m_translation_scale * (translation(0) * camera.get_dir_right() + translation(1) * camera.get_dir_forward() + translation(2) * camera.get_dir_up()));
-        set_translation(Vec3d::Zero());
+        camera.set_target(camera.get_target() + m_translation_scale * (m_translation(0) * camera.get_dir_right() + m_translation(1) * camera.get_dir_forward() + m_translation(2) * camera.get_dir_up()));
+        m_translation = Vec3d::Zero();
         ret = true;
     }
 
     if (has_rotation())
     {
-        Vec3f rotation = get_rotation();
-        float theta = m_rotation_scale * rotation(0);
-        float phi = m_rotation_scale * rotation(2);
+        float theta = m_rotation_scale * m_rotation(0);
+        float phi = m_rotation_scale * m_rotation(2);
         float sign = camera.inverted_phi ? -1.0f : 1.0f;
         camera.phi += sign * phi;
         camera.set_theta(camera.get_theta() + theta, wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() != ptSLA);
-        set_rotation(Vec3f::Zero());
+        m_rotation = Vec3f::Zero();
         ret = true;
     }
 
     if (has_any_button())
     {
-        std::vector<unsigned int> buttons = get_buttons();
-        for (unsigned int i : buttons)
+        for (unsigned int i : m_buttons)
         {
             switch (i)
             {
@@ -204,6 +135,12 @@ void Mouse3DController::shutdown()
     m_initialized = false;
 }
 
+bool Mouse3DController::apply(Camera& camera)
+{
+    std::lock_guard<std::mutex> lock(m_mutex);
+    return m_state.apply(camera);
+}
+
 void Mouse3DController::render_settings_dialog(unsigned int canvas_width, unsigned int canvas_height) const
 {
     if (!m_running || !m_settings_dialog)
@@ -383,6 +320,8 @@ void Mouse3DController::collect_input()
         return;
     }
 
+    std::lock_guard<std::mutex> lock(m_mutex);
+
     if (res > 0)
     {
         switch (retrieved_data[0])
diff --git a/src/slic3r/GUI/Mouse3DController.hpp b/src/slic3r/GUI/Mouse3DController.hpp
index bfad1b3b2..8abc4299c 100644
--- a/src/slic3r/GUI/Mouse3DController.hpp
+++ b/src/slic3r/GUI/Mouse3DController.hpp
@@ -24,8 +24,6 @@ class Mouse3DController
         static const float DefaultRotationScale;
 
     private:
-        mutable std::mutex m_mutex;
-
         Vec3d m_translation;
         Vec3f m_rotation;
         std::vector<unsigned int> m_buttons;
@@ -36,19 +34,19 @@ class Mouse3DController
     public:
         State();
 
-        void set_translation(const Vec3d& translation);
-        void set_rotation(const Vec3f& rotation);
-        void set_button(unsigned int id);
-        void reset_buttons();
+        void set_translation(const Vec3d& translation) { m_translation = translation; }
+        void set_rotation(const Vec3f& rotation) { m_rotation = rotation; }
+        void set_button(unsigned int id) { m_buttons.push_back(id); }
+        void reset_buttons() { return m_buttons.clear(); }
 
-        const Vec3d& get_translation() const;
-        const Vec3f& get_rotation() const;
-        const std::vector<unsigned int>& get_buttons() const;
+        const Vec3d& get_translation() const { return m_translation; }
+        const Vec3f& get_rotation() const { return m_rotation; }
+        const std::vector<unsigned int>& get_buttons() const { return m_buttons; }
 
-        bool has_translation() const;
-        bool has_rotation() const;
-        bool has_translation_or_rotation() const;
-        bool has_any_button() const;
+        bool has_translation() const { return !m_translation.isApprox(Vec3d::Zero()); }
+        bool has_rotation() const { return !m_rotation.isApprox(Vec3f::Zero()); }
+        bool has_translation_or_rotation() const { return !m_translation.isApprox(Vec3d::Zero()) && !m_rotation.isApprox(Vec3f::Zero()); }
+        bool has_any_button() const { return !m_buttons.empty(); }
 
         double get_translation_scale() const { return m_translation_scale; }
         void set_translation_scale(double scale) { m_translation_scale = scale; }
@@ -62,6 +60,7 @@ class Mouse3DController
 
     bool m_initialized;
     mutable State m_state;
+    std::mutex m_mutex;
     std::thread m_thread;
     hid_device* m_device;
     std::string m_device_str;
@@ -82,7 +81,7 @@ public:
     bool has_translation_or_rotation() const { return m_state.has_translation_or_rotation(); }
     bool has_any_button() const { return m_state.has_any_button(); }
 
-    bool apply(Camera& camera) { return m_state.apply(camera); }
+    bool apply(Camera& camera);
 
     bool is_settings_dialog_shown() const { return m_settings_dialog; }
     void show_settings_dialog(bool show) { m_settings_dialog = show; }