diff options
author | David Kocik <kocikdav@gmail.com> | 2020-01-21 16:34:22 +0300 |
---|---|---|
committer | David Kocik <kocikdav@gmail.com> | 2020-01-21 16:44:20 +0300 |
commit | 15391da512f68e5bd748fe52d0f53b841fdbed46 (patch) | |
tree | 5f266bb916bd1c9579cd1bd922afe75853653894 /src/slic3r/GUI/Mouse3DController.cpp | |
parent | 6100a7140605dc750f718512a90fa46b06ce1363 (diff) |
OSX handler for 3dconnexion drivers
Diffstat (limited to 'src/slic3r/GUI/Mouse3DController.cpp')
-rw-r--r-- | src/slic3r/GUI/Mouse3DController.cpp | 78 |
1 files changed, 64 insertions, 14 deletions
diff --git a/src/slic3r/GUI/Mouse3DController.cpp b/src/slic3r/GUI/Mouse3DController.cpp index e28336913..fd58447b5 100644 --- a/src/slic3r/GUI/Mouse3DController.cpp +++ b/src/slic3r/GUI/Mouse3DController.cpp @@ -15,6 +15,9 @@ #include <bitset> +//unofficial linux lib +//#include <spnav.h> + // WARN: If updating these lists, please also update resources/udev/90-3dconnexion.rules static const std::vector<int> _3DCONNEXION_VENDORS = @@ -204,7 +207,11 @@ Mouse3DController::Mouse3DController() , m_device_str("") , m_running(false) , m_show_settings_dialog(false) + , m_mac_mouse_connected(false) , m_settings_dialog_closed_by_user(false) +#if __APPLE__ + ,m_handler_mac(new Mouse3DHandlerMac(this)) +#endif //__APPLE__ { m_last_time = std::chrono::high_resolution_clock::now(); } @@ -244,7 +251,7 @@ bool Mouse3DController::apply(Camera& camera) return false; // check if the user unplugged the device - if (!m_running && is_device_connected()) + if (!is_running() && is_device_connected()) { disconnect_device(); // hides the settings dialog if the user un-plug the device @@ -261,7 +268,7 @@ bool Mouse3DController::apply(Camera& camera) void Mouse3DController::render_settings_dialog(GLCanvas3D& canvas) const { - if (!m_running || !m_show_settings_dialog) + if (!is_running() || !m_show_settings_dialog) return; // when the user clicks on [X] or [Close] button we need to trigger @@ -397,6 +404,9 @@ void Mouse3DController::render_settings_dialog(GLCanvas3D& canvas) const bool Mouse3DController::connect_device() { +#ifdef __APPLE__ + return false; +#endif//__APPLE__ static const long long DETECTION_TIME_MS = 2000; // two seconds if (is_device_connected()) @@ -405,7 +415,7 @@ bool Mouse3DController::connect_device() // check time since last detection took place if (std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::high_resolution_clock::now() - m_last_time).count() < DETECTION_TIME_MS) return false; - + m_last_time = std::chrono::high_resolution_clock::now(); // Enumerates devices @@ -528,7 +538,7 @@ bool Mouse3DController::connect_device() { if (device.second.size() == 1) { -#ifdef __linux__ +#if defined(__linux__) hid_device* test_device = hid_open(device.first.first, device.first.second, nullptr); if (test_device != nullptr) { @@ -536,7 +546,7 @@ bool Mouse3DController::connect_device() #else if (device.second.front().has_valid_usage()) { -#endif // __linux__ +#endif // __linux__ vendor_id = device.first.first; product_id = device.first.second; break; @@ -553,6 +563,7 @@ bool Mouse3DController::connect_device() #if ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT std::cout << "Test device: " << std::hex << device.first.first << std::dec << "/" << std::hex << device.first.second << std::dec << " \"" << data.path << "\""; #endif // ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT + #ifdef __linux__ hid_device* test_device = hid_open_path(data.path.c_str()); if (test_device != nullptr) @@ -567,7 +578,7 @@ bool Mouse3DController::connect_device() hid_close(test_device); break; } -#else +#else // !__linux__ if (data.has_valid_usage()) { path = data.path; @@ -632,7 +643,9 @@ bool Mouse3DController::connect_device() BOOST_LOG_TRIVIAL(info) << "Product id..........: " << product_id << " (" << std::hex << product_id << std::dec << ")"; if (!path.empty()) BOOST_LOG_TRIVIAL(info) << "Path................: '" << path << "'"; - +#if ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT + std::cout << "Opened device." << std::endl; +#endif // ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT // get device parameters from the config, if present double translation_speed = 4.0; float rotation_speed = 4.0; @@ -717,7 +730,7 @@ void Mouse3DController::run() } void Mouse3DController::collect_input() { - DataPacket packet = { 0 }; + DataPacketRaw packet = { 0 }; int res = hid_read_timeout(m_device, packet.data(), packet.size(), 100); if (res < 0) { @@ -725,10 +738,47 @@ void Mouse3DController::collect_input() stop(); return; } - + handle_input(packet, res); +} + +void Mouse3DController::handle_input_axis(const DataPacketAxis& packet) +{ + if (!wxGetApp().IsActive()) + return; + bool appended = false; + //translation + double deadzone = m_state.get_translation_deadzone(); + Vec3d translation(std::abs(packet[0]) > deadzone ? -packet[0] : 0.0, + std::abs(packet[1]) > deadzone ? packet[1] : 0.0, + std::abs(packet[2]) > deadzone ? packet[2] : 0.0); + if (!translation.isApprox(Vec3d::Zero())) + { + m_state.append_translation(translation); + appended = true; + } + //rotation + deadzone = m_state.get_rotation_deadzone(); + Vec3f rotation(std::abs(packet[3]) > deadzone ? -(float)packet[3] : 0.0, + std::abs(packet[4]) > deadzone ? (float)packet[4] : 0.0, + std::abs(packet[5]) > deadzone ? -(float)packet[5] : 0.0); + if (!rotation.isApprox(Vec3f::Zero())) + { + m_state.append_rotation(rotation); + appended = true; + } + if (appended) + { + wxGetApp().plater()->set_current_canvas_as_dirty(); + // ask for an idle event to update 3D scene + wxWakeUpIdle(); + } +} +void Mouse3DController::handle_input(const DataPacketRaw& packet, const int packet_lenght) +{ if (!wxGetApp().IsActive()) return; + int res = packet_lenght; bool updated = false; if (res == 7) @@ -751,7 +801,7 @@ void Mouse3DController::collect_input() } } -bool Mouse3DController::handle_packet(const DataPacket& packet) +bool Mouse3DController::handle_packet(const DataPacketRaw& packet) { switch (packet[0]) { @@ -795,7 +845,7 @@ bool Mouse3DController::handle_packet(const DataPacket& packet) return false; } -bool Mouse3DController::handle_wireless_packet(const DataPacket& packet) +bool Mouse3DController::handle_wireless_packet(const DataPacketRaw& packet) { switch (packet[0]) { @@ -842,7 +892,7 @@ double convert_input(unsigned char first, unsigned char second, double deadzone) return (std::abs(ret) > deadzone) ? ret : 0.0; } -bool Mouse3DController::handle_packet_translation(const DataPacket& packet) +bool Mouse3DController::handle_packet_translation(const DataPacketRaw& packet) { double deadzone = m_state.get_translation_deadzone(); Vec3d translation(-convert_input(packet[1], packet[2], deadzone), @@ -858,7 +908,7 @@ bool Mouse3DController::handle_packet_translation(const DataPacket& packet) return false; } -bool Mouse3DController::handle_packet_rotation(const DataPacket& packet, unsigned int first_byte) +bool Mouse3DController::handle_packet_rotation(const DataPacketRaw& packet, unsigned int first_byte) { double deadzone = (double)m_state.get_rotation_deadzone(); #if ENABLE_6DOF_CAMERA @@ -880,7 +930,7 @@ bool Mouse3DController::handle_packet_rotation(const DataPacket& packet, unsigne return false; } -bool Mouse3DController::handle_packet_button(const DataPacket& packet, unsigned int packet_size) +bool Mouse3DController::handle_packet_button(const DataPacketRaw& packet, unsigned int packet_size) { unsigned int data = 0; for (unsigned int i = 1; i < packet_size; ++i) |