From d58dedd4596e580856ef0f5009dc37fb83583746 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Mon, 30 Sep 2019 15:58:45 +0200 Subject: [PATCH] ENABLE_3DCONNEXION_DEVICES -> Increased limit of device buttons --- src/slic3r/GUI/GLCanvas3D.cpp | 2 +- src/slic3r/GUI/Mouse3DController.cpp | 37 ++++++++++++++++------------ src/slic3r/GUI/Mouse3DController.hpp | 10 +++++++- 3 files changed, 31 insertions(+), 18 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 4588084fc1..ea7992783a 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -2551,7 +2551,7 @@ void GLCanvas3D::on_mouse_wheel(wxMouseEvent& evt) #if ENABLE_3DCONNEXION_DEVICES // try to filter out events coming from mouse 3d controller const Mouse3DController& controller = wxGetApp().plater()->get_mouse3d_controller(); - if (controller.has_rotation() || controller.has_translation()) + if (controller.has_translation_or_rotation()) return; #endif // ENABLE_3DCONNEXION_DEVICES diff --git a/src/slic3r/GUI/Mouse3DController.cpp b/src/slic3r/GUI/Mouse3DController.cpp index f00f03c13a..10022915a7 100644 --- a/src/slic3r/GUI/Mouse3DController.cpp +++ b/src/slic3r/GUI/Mouse3DController.cpp @@ -30,7 +30,7 @@ static const std::vector _3DCONNEXION_DEVICES = 0xc629 // SPACEPILOTPRO = 50729 }; -static const unsigned int _3DCONNEXION_BUTTONS_COUNT = 2; +static const unsigned int _3DCONNEXION_MAX_BUTTONS_COUNT = 256; namespace Slic3r { namespace GUI { @@ -41,7 +41,6 @@ const float Mouse3DController::State::DefaultRotationScale = 1.0; Mouse3DController::State::State() : m_translation(Vec3d::Zero()) , m_rotation(Vec3f::Zero()) - , m_buttons(_3DCONNEXION_BUTTONS_COUNT, false) , m_translation_scale(DefaultTranslationScale) , m_rotation_scale(DefaultRotationScale) { @@ -62,8 +61,7 @@ void Mouse3DController::State::set_rotation(const Vec3f& rotation) void Mouse3DController::State::set_button(unsigned int id) { std::lock_guard lock(m_mutex); - if (id < _3DCONNEXION_BUTTONS_COUNT) - m_buttons[id] = true; + m_buttons.push_back(id); } bool Mouse3DController::State::has_translation() const @@ -71,21 +69,23 @@ bool Mouse3DController::State::has_translation() const std::lock_guard lock(m_mutex); return !m_translation.isApprox(Vec3d::Zero()); } + bool Mouse3DController::State::has_rotation() const { std::lock_guard lock(m_mutex); return !m_rotation.isApprox(Vec3f::Zero()); } +bool Mouse3DController::State::has_translation_or_rotation() const +{ + std::lock_guard lock(m_mutex); + return !m_translation.isApprox(Vec3d::Zero()) && !m_rotation.isApprox(Vec3f::Zero()); +} + bool Mouse3DController::State::has_any_button() const { std::lock_guard lock(m_mutex); - for (int i = 0; i < _3DCONNEXION_BUTTONS_COUNT; ++i) - { - if (m_buttons[i]) - return true; - } - return false; + return !m_buttons.empty(); } bool Mouse3DController::State::apply(GLCanvas3D& canvas) @@ -116,12 +116,17 @@ bool Mouse3DController::State::apply(GLCanvas3D& canvas) if (has_any_button()) { - if (m_buttons[0]) - canvas.set_camera_zoom(1.0); - else if (m_buttons[1]) - canvas.set_camera_zoom(-1.0); + for (unsigned int i : m_buttons) + { + switch (i) + { + case 0: { canvas.set_camera_zoom(1.0); break; } + case 1: { canvas.set_camera_zoom(-1.0); break; } + default: { break; } + } + } - m_buttons = std::vector(_3DCONNEXION_BUTTONS_COUNT, false); + m_buttons.clear(); ret = true; } @@ -314,7 +319,7 @@ void Mouse3DController::collect_input() } case Button: { - for (unsigned int i = 0; i < _3DCONNEXION_BUTTONS_COUNT; ++i) + for (unsigned int i = 0; i < _3DCONNEXION_MAX_BUTTONS_COUNT; ++i) { if (retrieved_data[1] & (0x1 << i)) m_state.set_button(i); diff --git a/src/slic3r/GUI/Mouse3DController.hpp b/src/slic3r/GUI/Mouse3DController.hpp index 9c7f1ce5ec..64fa34a44c 100644 --- a/src/slic3r/GUI/Mouse3DController.hpp +++ b/src/slic3r/GUI/Mouse3DController.hpp @@ -26,7 +26,7 @@ class Mouse3DController Vec3d m_translation; Vec3f m_rotation; - std::vector m_buttons; + std::vector m_buttons; double m_translation_scale; float m_rotation_scale; @@ -40,8 +40,15 @@ class Mouse3DController bool has_translation() const; bool has_rotation() const; + bool has_translation_or_rotation() const; bool has_any_button() const; + double get_translation_scale() const { return m_translation_scale; } + void set_translation_scale(double scale) { m_translation_scale = scale; } + + float get_rotation_scale() const { return m_rotation_scale; } + void set_rotation_scale(float scale) { m_rotation_scale = scale; } + // return true if any change to the camera took place bool apply(GLCanvas3D& canvas); }; @@ -71,6 +78,7 @@ public: bool has_translation() const { return m_state.has_translation(); } bool has_rotation() const { return m_state.has_rotation(); } + 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()