2019-09-27 12:52:19 +00:00
|
|
|
#ifndef slic3r_Mouse3DController_hpp_
|
|
|
|
#define slic3r_Mouse3DController_hpp_
|
|
|
|
|
|
|
|
#if ENABLE_3DCONNEXION_DEVICES
|
2019-09-27 13:26:13 +00:00
|
|
|
#include "libslic3r/Point.hpp"
|
2019-09-27 12:52:19 +00:00
|
|
|
|
2019-09-30 13:20:23 +00:00
|
|
|
#include "hidapi.h"
|
2019-09-27 13:26:13 +00:00
|
|
|
|
2019-10-08 06:44:50 +00:00
|
|
|
#include <queue>
|
2019-09-27 12:52:19 +00:00
|
|
|
#include <thread>
|
|
|
|
#include <mutex>
|
|
|
|
#include <vector>
|
|
|
|
|
2019-10-10 07:04:44 +00:00
|
|
|
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
|
|
|
#define ENABLE_QUEUE_MAX_SIZE 1
|
|
|
|
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
|
|
|
|
2019-09-27 12:52:19 +00:00
|
|
|
namespace Slic3r {
|
|
|
|
namespace GUI {
|
|
|
|
|
2019-10-03 09:38:31 +00:00
|
|
|
struct Camera;
|
2019-09-27 12:52:19 +00:00
|
|
|
|
|
|
|
class Mouse3DController
|
|
|
|
{
|
|
|
|
class State
|
|
|
|
{
|
2019-10-02 13:55:26 +00:00
|
|
|
public:
|
2019-09-27 12:52:19 +00:00
|
|
|
static const double DefaultTranslationScale;
|
2019-10-08 12:32:05 +00:00
|
|
|
static const double MaxTranslationDeadzone;
|
|
|
|
static const double DefaultTranslationDeadzone;
|
2019-09-27 12:52:19 +00:00
|
|
|
static const float DefaultRotationScale;
|
2019-10-08 12:32:05 +00:00
|
|
|
static const float MaxRotationDeadzone;
|
|
|
|
static const float DefaultRotationDeadzone;
|
2019-09-27 12:52:19 +00:00
|
|
|
|
2019-10-02 13:55:26 +00:00
|
|
|
private:
|
2019-10-08 12:32:05 +00:00
|
|
|
template <typename Number>
|
|
|
|
struct CustomParameters
|
|
|
|
{
|
|
|
|
Number scale;
|
|
|
|
Number deadzone;
|
|
|
|
|
|
|
|
CustomParameters(Number scale, Number deadzone) : scale(scale), deadzone(deadzone) {}
|
|
|
|
};
|
|
|
|
|
2019-10-10 07:04:44 +00:00
|
|
|
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
|
|
|
#if ENABLE_QUEUE_MAX_SIZE
|
|
|
|
template <class T>
|
|
|
|
struct InputQueue
|
|
|
|
{
|
2019-10-10 07:29:55 +00:00
|
|
|
size_t max_size;
|
2019-10-10 07:04:44 +00:00
|
|
|
std::queue<T> queue;
|
2019-10-10 07:29:55 +00:00
|
|
|
|
|
|
|
InputQueue() : max_size(20) {}
|
2019-10-10 07:04:44 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
InputQueue<Vec3d> m_translation;
|
|
|
|
InputQueue<Vec3f> m_rotation;
|
|
|
|
InputQueue<unsigned int> m_buttons;
|
|
|
|
#else
|
|
|
|
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
2019-10-08 06:44:50 +00:00
|
|
|
std::queue<Vec3d> m_translation;
|
|
|
|
std::queue<Vec3f> m_rotation;
|
|
|
|
std::queue<unsigned int> m_buttons;
|
2019-10-10 07:04:44 +00:00
|
|
|
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
|
|
|
#endif // ENABLE_QUEUE_MAX_SIZE
|
|
|
|
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
|
|
|
|
2019-09-27 12:52:19 +00:00
|
|
|
|
2019-10-08 12:32:05 +00:00
|
|
|
CustomParameters<double> m_translation_params;
|
|
|
|
CustomParameters<float> m_rotation_params;
|
2019-09-27 12:52:19 +00:00
|
|
|
|
2019-10-08 06:44:50 +00:00
|
|
|
// When the 3Dconnexion driver is running the system gets, by default, mouse wheel events when rotations around the X axis are detected.
|
|
|
|
// We want to filter these out because we are getting the data directly from the device, bypassing the driver, and those mouse wheel events interfere
|
|
|
|
// by triggering unwanted zoom in/out of the scene
|
|
|
|
// The following variable is used to count the potential mouse wheel events triggered and is updated by:
|
|
|
|
// Mouse3DController::collect_input() through the call to the append_rotation() method
|
|
|
|
// GLCanvas3D::on_mouse_wheel() through the call to the process_mouse_wheel() method
|
|
|
|
// GLCanvas3D::on_idle() through the call to the apply() method
|
|
|
|
unsigned int m_mouse_wheel_counter;
|
|
|
|
|
2019-10-09 13:23:30 +00:00
|
|
|
#if ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT
|
|
|
|
unsigned int m_translation_queue_max_size;
|
|
|
|
unsigned int m_rotation_queue_max_size;
|
|
|
|
unsigned int m_buttons_queue_max_size;
|
|
|
|
#endif // ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT
|
|
|
|
|
2019-09-27 12:52:19 +00:00
|
|
|
public:
|
|
|
|
State();
|
|
|
|
|
2019-10-09 13:23:30 +00:00
|
|
|
void append_translation(const Vec3d& translation)
|
|
|
|
{
|
2019-10-10 08:49:47 +00:00
|
|
|
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
2019-10-10 07:04:44 +00:00
|
|
|
#if ENABLE_QUEUE_MAX_SIZE
|
|
|
|
while (m_translation.queue.size() >= m_translation.max_size)
|
|
|
|
{
|
|
|
|
m_translation.queue.pop();
|
|
|
|
}
|
|
|
|
m_translation.queue.push(translation);
|
|
|
|
#if ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT
|
|
|
|
m_translation_queue_max_size = std::max(m_translation_queue_max_size, (unsigned int)m_translation.queue.size());
|
|
|
|
#endif // ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT
|
|
|
|
#else
|
2019-10-10 08:49:47 +00:00
|
|
|
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
2019-10-09 13:23:30 +00:00
|
|
|
m_translation.push(translation);
|
|
|
|
#if ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT
|
|
|
|
m_translation_queue_max_size = std::max(m_translation_queue_max_size, (unsigned int)m_translation.size());
|
|
|
|
#endif // ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT
|
2019-10-10 08:49:47 +00:00
|
|
|
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
2019-10-10 07:04:44 +00:00
|
|
|
#endif // ENABLE_QUEUE_MAX_SIZE
|
2019-10-10 08:49:47 +00:00
|
|
|
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
2019-10-09 13:23:30 +00:00
|
|
|
}
|
|
|
|
|
2019-10-08 06:44:50 +00:00
|
|
|
void append_rotation(const Vec3f& rotation)
|
|
|
|
{
|
2019-10-10 08:49:47 +00:00
|
|
|
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
2019-10-10 07:04:44 +00:00
|
|
|
#if ENABLE_QUEUE_MAX_SIZE
|
|
|
|
while (m_rotation.queue.size() >= m_rotation.max_size)
|
|
|
|
{
|
|
|
|
m_rotation.queue.pop();
|
|
|
|
}
|
|
|
|
m_rotation.queue.push(rotation);
|
|
|
|
#if ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT
|
|
|
|
m_rotation_queue_max_size = std::max(m_rotation_queue_max_size, (unsigned int)m_rotation.queue.size());
|
|
|
|
#endif // ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT
|
|
|
|
if (rotation(0) != 0.0f)
|
|
|
|
++m_mouse_wheel_counter;
|
|
|
|
#else
|
2019-10-10 08:49:47 +00:00
|
|
|
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
2019-10-08 06:44:50 +00:00
|
|
|
m_rotation.push(rotation);
|
2019-10-09 13:23:30 +00:00
|
|
|
#if ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT
|
|
|
|
m_rotation_queue_max_size = std::max(m_rotation_queue_max_size, (unsigned int)m_rotation.size());
|
|
|
|
#endif // ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT
|
2019-10-08 06:44:50 +00:00
|
|
|
if (rotation(0) != 0.0f)
|
|
|
|
++m_mouse_wheel_counter;
|
2019-10-10 08:49:47 +00:00
|
|
|
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
2019-10-10 07:04:44 +00:00
|
|
|
#endif // ENABLE_QUEUE_MAX_SIZE
|
2019-10-10 08:49:47 +00:00
|
|
|
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
|
|
|
}
|
2019-10-09 13:23:30 +00:00
|
|
|
|
|
|
|
void append_button(unsigned int id)
|
|
|
|
{
|
2019-10-10 08:49:47 +00:00
|
|
|
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
2019-10-10 07:04:44 +00:00
|
|
|
#if ENABLE_QUEUE_MAX_SIZE
|
|
|
|
while (m_buttons.queue.size() >= m_buttons.max_size)
|
|
|
|
{
|
|
|
|
m_buttons.queue.pop();
|
|
|
|
}
|
|
|
|
m_buttons.queue.push(id);
|
|
|
|
#if ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT
|
|
|
|
m_buttons_queue_max_size = std::max(m_buttons_queue_max_size, (unsigned int)m_buttons.queue.size());
|
|
|
|
#endif // ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT
|
|
|
|
#else
|
2019-10-10 08:49:47 +00:00
|
|
|
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
2019-10-09 13:23:30 +00:00
|
|
|
m_buttons.push(id);
|
|
|
|
#if ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT
|
|
|
|
m_buttons_queue_max_size = std::max(m_buttons_queue_max_size, (unsigned int)m_buttons.size());
|
|
|
|
#endif // ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT
|
2019-10-10 08:49:47 +00:00
|
|
|
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
2019-10-10 07:04:44 +00:00
|
|
|
#endif // ENABLE_QUEUE_MAX_SIZE
|
2019-10-09 13:23:30 +00:00
|
|
|
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
2019-10-10 08:49:47 +00:00
|
|
|
}
|
2019-10-08 06:44:50 +00:00
|
|
|
|
2019-10-10 07:04:44 +00:00
|
|
|
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
|
|
|
#if ENABLE_QUEUE_MAX_SIZE
|
|
|
|
bool has_translation() const { return !m_translation.queue.empty(); }
|
|
|
|
bool has_rotation() const { return !m_rotation.queue.empty(); }
|
|
|
|
bool has_button() const { return !m_buttons.queue.empty(); }
|
|
|
|
#else
|
2019-10-10 08:49:47 +00:00
|
|
|
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
2019-10-08 06:44:50 +00:00
|
|
|
bool has_translation() const { return !m_translation.empty(); }
|
|
|
|
bool has_rotation() const { return !m_rotation.empty(); }
|
2019-10-09 12:18:43 +00:00
|
|
|
bool has_button() const { return !m_buttons.empty(); }
|
2019-10-10 08:49:47 +00:00
|
|
|
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
2019-10-10 07:04:44 +00:00
|
|
|
#endif // ENABLE_QUEUE_MAX_SIZE
|
|
|
|
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
2019-10-09 12:18:43 +00:00
|
|
|
|
|
|
|
#if ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT
|
2019-10-10 07:04:44 +00:00
|
|
|
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
|
|
|
#if ENABLE_QUEUE_MAX_SIZE
|
|
|
|
Vec3d get_translation() const { return has_translation() ? m_translation.queue.front() : Vec3d::Zero(); }
|
|
|
|
Vec3f get_rotation() const { return has_rotation() ? m_rotation.queue.front() : Vec3f::Zero(); }
|
|
|
|
unsigned int get_button() const { return has_button() ? m_buttons.queue.front() : 0; }
|
|
|
|
#else
|
|
|
|
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
2019-10-09 12:18:43 +00:00
|
|
|
Vec3d get_translation() const { return has_translation() ? m_translation.front() : Vec3d::Zero(); }
|
|
|
|
Vec3f get_rotation() const { return has_rotation() ? m_rotation.front() : Vec3f::Zero(); }
|
|
|
|
unsigned int get_button() const { return has_button() ? m_buttons.front() : 0; }
|
2019-10-10 07:04:44 +00:00
|
|
|
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
|
|
|
#endif // ENABLE_QUEUE_MAX_SIZE
|
|
|
|
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
2019-10-09 12:18:43 +00:00
|
|
|
#endif // ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT
|
2019-09-27 12:52:19 +00:00
|
|
|
|
2019-10-08 06:44:50 +00:00
|
|
|
bool process_mouse_wheel();
|
|
|
|
|
2019-10-08 12:32:05 +00:00
|
|
|
double get_translation_scale() const { return m_translation_params.scale; }
|
|
|
|
void set_translation_scale(double scale) { m_translation_params.scale = scale; }
|
|
|
|
|
|
|
|
float get_rotation_scale() const { return m_rotation_params.scale; }
|
|
|
|
void set_rotation_scale(float scale) { m_rotation_params.scale = scale; }
|
|
|
|
|
|
|
|
double get_translation_deadzone() const { return m_translation_params.deadzone; }
|
|
|
|
void set_translation_deadzone(double deadzone) { m_translation_params.deadzone = deadzone; }
|
2019-09-30 13:58:45 +00:00
|
|
|
|
2019-10-08 12:32:05 +00:00
|
|
|
float get_rotation_deadzone() const { return m_rotation_params.deadzone; }
|
|
|
|
void set_rotation_deadzone(float deadzone) { m_rotation_params.deadzone = deadzone; }
|
2019-09-30 13:58:45 +00:00
|
|
|
|
2019-10-09 13:23:30 +00:00
|
|
|
#if ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT
|
2019-10-10 08:49:47 +00:00
|
|
|
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
2019-10-10 07:04:44 +00:00
|
|
|
#if ENABLE_QUEUE_MAX_SIZE
|
|
|
|
unsigned int get_translation_queue_size() const { return (unsigned int)m_translation.queue.size(); }
|
|
|
|
unsigned int get_rotation_queue_size() const { return (unsigned int)m_rotation.queue.size(); }
|
|
|
|
unsigned int get_buttons_queue_size() const { return (unsigned int)m_buttons.queue.size(); }
|
|
|
|
#else
|
2019-10-10 08:49:47 +00:00
|
|
|
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
2019-10-09 13:23:30 +00:00
|
|
|
unsigned int get_translation_queue_size() const { return (unsigned int)m_translation.size(); }
|
|
|
|
unsigned int get_rotation_queue_size() const { return (unsigned int)m_rotation.size(); }
|
|
|
|
unsigned int get_buttons_queue_size() const { return (unsigned int)m_buttons.size(); }
|
2019-10-10 08:49:47 +00:00
|
|
|
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
2019-10-10 07:04:44 +00:00
|
|
|
#endif // ENABLE_QUEUE_MAX_SIZE
|
2019-10-10 08:49:47 +00:00
|
|
|
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
2019-10-09 13:23:30 +00:00
|
|
|
|
|
|
|
unsigned int get_translation_queue_max_size() const { return m_translation_queue_max_size; }
|
|
|
|
unsigned int get_rotation_queue_max_size() const { return m_rotation_queue_max_size; }
|
|
|
|
unsigned int get_buttons_queue_max_size() const { return m_buttons_queue_max_size; }
|
|
|
|
#endif // ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT
|
2019-10-10 07:04:44 +00:00
|
|
|
|
|
|
|
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
|
|
|
#if ENABLE_QUEUE_MAX_SIZE
|
|
|
|
size_t get_queues_max_size() const { return m_translation.max_size; }
|
|
|
|
void set_queues_max_size(size_t size)
|
|
|
|
{
|
|
|
|
if (size > 0)
|
|
|
|
{
|
|
|
|
std::cout << "New queues max size: " << size << std::endl;
|
|
|
|
|
|
|
|
m_translation.max_size = size;
|
|
|
|
m_rotation.max_size = size;
|
|
|
|
m_buttons.max_size = size;
|
|
|
|
|
|
|
|
m_translation_queue_max_size = 0;
|
|
|
|
m_rotation_queue_max_size = 0;
|
|
|
|
m_buttons_queue_max_size = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif // ENABLE_QUEUE_MAX_SIZE
|
2019-10-09 13:23:30 +00:00
|
|
|
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
|
|
|
|
2019-09-27 12:52:19 +00:00
|
|
|
// return true if any change to the camera took place
|
2019-10-03 09:38:31 +00:00
|
|
|
bool apply(Camera& camera);
|
2019-09-27 12:52:19 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
bool m_initialized;
|
2019-10-02 13:55:26 +00:00
|
|
|
mutable State m_state;
|
2019-10-03 10:16:59 +00:00
|
|
|
std::mutex m_mutex;
|
2019-09-27 12:52:19 +00:00
|
|
|
std::thread m_thread;
|
|
|
|
hid_device* m_device;
|
2019-10-03 08:26:28 +00:00
|
|
|
std::string m_device_str;
|
2019-09-27 12:52:19 +00:00
|
|
|
bool m_running;
|
2019-10-02 13:55:26 +00:00
|
|
|
bool m_settings_dialog;
|
2019-09-27 12:52:19 +00:00
|
|
|
|
|
|
|
public:
|
|
|
|
Mouse3DController();
|
|
|
|
|
|
|
|
void init();
|
|
|
|
void shutdown();
|
|
|
|
|
|
|
|
bool is_device_connected() const { return m_device != nullptr; }
|
|
|
|
bool is_running() const { return m_running; }
|
|
|
|
|
2019-10-08 06:44:50 +00:00
|
|
|
bool process_mouse_wheel() { std::lock_guard<std::mutex> lock(m_mutex); return m_state.process_mouse_wheel(); }
|
2019-09-27 12:52:19 +00:00
|
|
|
|
2019-10-03 10:16:59 +00:00
|
|
|
bool apply(Camera& camera);
|
2019-09-27 12:52:19 +00:00
|
|
|
|
2019-10-02 13:55:26 +00:00
|
|
|
bool is_settings_dialog_shown() const { return m_settings_dialog; }
|
2019-10-04 08:59:27 +00:00
|
|
|
void show_settings_dialog(bool show) { m_settings_dialog = show && is_running(); }
|
2019-10-03 09:38:31 +00:00
|
|
|
void render_settings_dialog(unsigned int canvas_width, unsigned int canvas_height) const;
|
2019-10-02 13:55:26 +00:00
|
|
|
|
2019-09-27 12:52:19 +00:00
|
|
|
private:
|
2019-10-04 08:59:27 +00:00
|
|
|
bool connect_device();
|
2019-09-27 12:52:19 +00:00
|
|
|
void disconnect_device();
|
|
|
|
void start();
|
|
|
|
void stop() { m_running = false; }
|
|
|
|
|
2019-10-04 08:59:27 +00:00
|
|
|
// secondary thread methods
|
2019-09-27 12:52:19 +00:00
|
|
|
void run();
|
|
|
|
void collect_input();
|
2019-10-08 11:38:08 +00:00
|
|
|
|
|
|
|
typedef std::array<unsigned char, 13> DataPacket;
|
|
|
|
bool handle_packet(const DataPacket& packet);
|
|
|
|
bool handle_wireless_packet(const DataPacket& packet);
|
|
|
|
bool handle_packet_translation(const DataPacket& packet);
|
|
|
|
bool handle_packet_rotation(const DataPacket& packet, unsigned int first_byte);
|
|
|
|
bool handle_packet_button(const DataPacket& packet, unsigned int packet_size);
|
2019-09-27 12:52:19 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace GUI
|
|
|
|
} // namespace Slic3r
|
|
|
|
|
|
|
|
#endif // ENABLE_3DCONNEXION_DEVICES
|
|
|
|
|
|
|
|
#endif // slic3r_Mouse3DController_hpp_
|
|
|
|
|