ENABLE_3DCONNEXION_DEVICES -> Increased limit of device buttons

This commit is contained in:
Enrico Turri 2019-09-30 15:58:45 +02:00
parent b11704d380
commit d58dedd459
3 changed files with 31 additions and 18 deletions

View File

@ -2551,7 +2551,7 @@ void GLCanvas3D::on_mouse_wheel(wxMouseEvent& evt)
#if ENABLE_3DCONNEXION_DEVICES #if ENABLE_3DCONNEXION_DEVICES
// try to filter out events coming from mouse 3d controller // try to filter out events coming from mouse 3d controller
const Mouse3DController& controller = wxGetApp().plater()->get_mouse3d_controller(); const Mouse3DController& controller = wxGetApp().plater()->get_mouse3d_controller();
if (controller.has_rotation() || controller.has_translation()) if (controller.has_translation_or_rotation())
return; return;
#endif // ENABLE_3DCONNEXION_DEVICES #endif // ENABLE_3DCONNEXION_DEVICES

View File

@ -30,7 +30,7 @@ static const std::vector<int> _3DCONNEXION_DEVICES =
0xc629 // SPACEPILOTPRO = 50729 0xc629 // SPACEPILOTPRO = 50729
}; };
static const unsigned int _3DCONNEXION_BUTTONS_COUNT = 2; static const unsigned int _3DCONNEXION_MAX_BUTTONS_COUNT = 256;
namespace Slic3r { namespace Slic3r {
namespace GUI { namespace GUI {
@ -41,7 +41,6 @@ const float Mouse3DController::State::DefaultRotationScale = 1.0;
Mouse3DController::State::State() Mouse3DController::State::State()
: m_translation(Vec3d::Zero()) : m_translation(Vec3d::Zero())
, m_rotation(Vec3f::Zero()) , m_rotation(Vec3f::Zero())
, m_buttons(_3DCONNEXION_BUTTONS_COUNT, false)
, m_translation_scale(DefaultTranslationScale) , m_translation_scale(DefaultTranslationScale)
, m_rotation_scale(DefaultRotationScale) , m_rotation_scale(DefaultRotationScale)
{ {
@ -62,8 +61,7 @@ void Mouse3DController::State::set_rotation(const Vec3f& rotation)
void Mouse3DController::State::set_button(unsigned int id) void Mouse3DController::State::set_button(unsigned int id)
{ {
std::lock_guard<std::mutex> lock(m_mutex); std::lock_guard<std::mutex> lock(m_mutex);
if (id < _3DCONNEXION_BUTTONS_COUNT) m_buttons.push_back(id);
m_buttons[id] = true;
} }
bool Mouse3DController::State::has_translation() const bool Mouse3DController::State::has_translation() const
@ -71,21 +69,23 @@ bool Mouse3DController::State::has_translation() const
std::lock_guard<std::mutex> lock(m_mutex); std::lock_guard<std::mutex> lock(m_mutex);
return !m_translation.isApprox(Vec3d::Zero()); return !m_translation.isApprox(Vec3d::Zero());
} }
bool Mouse3DController::State::has_rotation() const bool Mouse3DController::State::has_rotation() const
{ {
std::lock_guard<std::mutex> lock(m_mutex); std::lock_guard<std::mutex> lock(m_mutex);
return !m_rotation.isApprox(Vec3f::Zero()); 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 bool Mouse3DController::State::has_any_button() const
{ {
std::lock_guard<std::mutex> lock(m_mutex); std::lock_guard<std::mutex> lock(m_mutex);
for (int i = 0; i < _3DCONNEXION_BUTTONS_COUNT; ++i) return !m_buttons.empty();
{
if (m_buttons[i])
return true;
}
return false;
} }
bool Mouse3DController::State::apply(GLCanvas3D& canvas) bool Mouse3DController::State::apply(GLCanvas3D& canvas)
@ -116,12 +116,17 @@ bool Mouse3DController::State::apply(GLCanvas3D& canvas)
if (has_any_button()) if (has_any_button())
{ {
if (m_buttons[0]) for (unsigned int i : m_buttons)
canvas.set_camera_zoom(1.0); {
else if (m_buttons[1]) switch (i)
canvas.set_camera_zoom(-1.0); {
case 0: { canvas.set_camera_zoom(1.0); break; }
case 1: { canvas.set_camera_zoom(-1.0); break; }
default: { break; }
}
}
m_buttons = std::vector<bool>(_3DCONNEXION_BUTTONS_COUNT, false); m_buttons.clear();
ret = true; ret = true;
} }
@ -314,7 +319,7 @@ void Mouse3DController::collect_input()
} }
case Button: 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)) if (retrieved_data[1] & (0x1 << i))
m_state.set_button(i); m_state.set_button(i);

View File

@ -26,7 +26,7 @@ class Mouse3DController
Vec3d m_translation; Vec3d m_translation;
Vec3f m_rotation; Vec3f m_rotation;
std::vector<bool> m_buttons; std::vector<unsigned int> m_buttons;
double m_translation_scale; double m_translation_scale;
float m_rotation_scale; float m_rotation_scale;
@ -40,8 +40,15 @@ class Mouse3DController
bool has_translation() const; bool has_translation() const;
bool has_rotation() const; bool has_rotation() const;
bool has_translation_or_rotation() const;
bool has_any_button() 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 // return true if any change to the camera took place
bool apply(GLCanvas3D& canvas); bool apply(GLCanvas3D& canvas);
}; };
@ -71,6 +78,7 @@ public:
bool has_translation() const { return m_state.has_translation(); } bool has_translation() const { return m_state.has_translation(); }
bool has_rotation() const { return m_state.has_rotation(); } 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 has_any_button() const { return m_state.has_any_button(); }
bool apply() bool apply()