Add spacenavd support (#1769)
This commit is contained in:
parent
5f848b7a93
commit
27eb7bbe9f
3 changed files with 91 additions and 1 deletions
|
@ -568,6 +568,20 @@ else ()
|
|||
"OpenVDB installation with the OPENVDB_FIND_MODULE_PATH cache variable.")
|
||||
endif ()
|
||||
|
||||
find_path(SPNAV_INCLUDE_DIR spnav.h)
|
||||
if (SPNAV_INCLUDE_DIR)
|
||||
find_library(HAVE_SPNAV spnav)
|
||||
if (HAVE_SPNAV)
|
||||
add_definitions(-DHAVE_SPNAV)
|
||||
add_library(libspnav SHARED IMPORTED)
|
||||
target_link_libraries(libspnav INTERFACE spnav)
|
||||
message(STATUS "SPNAV library found")
|
||||
else()
|
||||
message(STATUS "SPNAV library NOT found, Spacenavd not supported")
|
||||
endif()
|
||||
else()
|
||||
message(STATUS "SPNAV library NOT found, Spacenavd not supported")
|
||||
endif()
|
||||
|
||||
set(TOP_LEVEL_PROJECT_DIR ${PROJECT_SOURCE_DIR})
|
||||
function(orcaslicer_copy_dlls target config postfix output_dlls)
|
||||
|
|
|
@ -528,6 +528,10 @@ if (SLIC3R_STATIC)
|
|||
target_compile_definitions(libslic3r_gui PUBLIC -DwxDEBUG_LEVEL=0)
|
||||
endif()
|
||||
|
||||
if (HAVE_SPNAV)
|
||||
target_link_libraries(libslic3r_gui spnav)
|
||||
endif()
|
||||
|
||||
if (SLIC3R_STATIC AND NOT SLIC3R_STATIC_EXCLUDE_CURL AND UNIX AND NOT APPLE)
|
||||
target_compile_definitions(libslic3r_gui PRIVATE OPENSSL_CERT_OVERRIDE)
|
||||
endif ()
|
||||
|
|
|
@ -17,7 +17,9 @@
|
|||
#include <bitset>
|
||||
|
||||
//unofficial linux lib
|
||||
//#include <spnav.h>
|
||||
#ifdef HAVE_SPNAV
|
||||
#include <spnav.h>
|
||||
#endif
|
||||
|
||||
// WARN: If updating these lists, please also update resources/udev/90-3dconnexion.rules
|
||||
|
||||
|
@ -773,6 +775,31 @@ void Mouse3DController::shutdown()
|
|||
// Main routine of the worker thread.
|
||||
void Mouse3DController::run()
|
||||
{
|
||||
#ifdef HAVE_SPNAV
|
||||
if (spnav_open() == -1) {
|
||||
// Give up.
|
||||
BOOST_LOG_TRIVIAL(error) << "Unable to open connection to spacenavd";
|
||||
return;
|
||||
}
|
||||
m_connected = true;
|
||||
|
||||
for (;;) {
|
||||
{
|
||||
std::scoped_lock lock(m_params_ui_mutex);
|
||||
if (m_stop)
|
||||
break;
|
||||
if (m_params_ui_changed) {
|
||||
m_params = m_params_ui;
|
||||
m_params_ui_changed = false;
|
||||
}
|
||||
}
|
||||
this->collect_input();
|
||||
}
|
||||
|
||||
m_connected = false;
|
||||
// Finalize the spnav library
|
||||
spnav_close();
|
||||
#else
|
||||
// Initialize the hidapi library
|
||||
int res = hid_init();
|
||||
if (res != 0) {
|
||||
|
@ -817,6 +844,7 @@ void Mouse3DController::run()
|
|||
|
||||
// Finalize the hidapi library
|
||||
hid_exit();
|
||||
#endif
|
||||
}
|
||||
|
||||
bool Mouse3DController::connect_device()
|
||||
|
@ -1106,8 +1134,51 @@ void Mouse3DController::disconnect_device()
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef HAVE_SPNAV
|
||||
// Convert a signed 16bit word from a 3DConnexion mouse HID packet into a double coordinate, apply a dead zone.
|
||||
static double convert_spnav_input(int value)
|
||||
{
|
||||
return (double)value/100;
|
||||
}
|
||||
#endif
|
||||
|
||||
void Mouse3DController::collect_input()
|
||||
{
|
||||
#ifdef HAVE_SPNAV
|
||||
// Read packet, block maximum 100 ms. That means when closing the application, closing the application will be delayed by 100 ms.
|
||||
int fd = spnav_fd();
|
||||
|
||||
if (fd != -1) {
|
||||
fd_set fds;
|
||||
struct timeval tv = {.tv_sec = 0, .tv_usec = 100000};
|
||||
|
||||
FD_ZERO(&fds);
|
||||
FD_SET(fd, &fds);
|
||||
if (select(fd + 1, &fds, NULL, NULL, &tv) == 1) {
|
||||
spnav_event ev = {};
|
||||
switch (spnav_poll_event(&ev)) {
|
||||
case SPNAV_EVENT_MOTION: {
|
||||
Vec3d translation(-convert_spnav_input(ev.motion.x), convert_spnav_input(ev.motion.y), -convert_spnav_input(ev.motion.z));
|
||||
if (!translation.isApprox(Vec3d::Zero())) {
|
||||
m_state.append_translation(translation, m_params.input_queue_max_size);
|
||||
}
|
||||
Vec3f rotation(convert_spnav_input(ev.motion.rx), convert_spnav_input(ev.motion.ry), -convert_spnav_input(ev.motion.rz));
|
||||
if (!rotation.isApprox(Vec3f::Zero())) {
|
||||
m_state.append_rotation(rotation, m_params.input_queue_max_size);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SPNAV_EVENT_BUTTON:
|
||||
if (ev.button.press)
|
||||
m_state.append_button((unsigned int)ev.button.bnum, m_params.input_queue_max_size);
|
||||
break;
|
||||
}
|
||||
wxGetApp().plater()->set_current_canvas_as_dirty();
|
||||
// ask for an idle event to update 3D scene
|
||||
wxWakeUpIdle();
|
||||
}
|
||||
}
|
||||
#else
|
||||
DataPacketRaw packet = { 0 };
|
||||
// Read packet, block maximum 100 ms. That means when closing the application, closing the application will be delayed by 100 ms.
|
||||
int res = hid_read_timeout(m_device, packet.data(), packet.size(), 100);
|
||||
|
@ -1116,6 +1187,7 @@ void Mouse3DController::collect_input()
|
|||
this->disconnect_device();
|
||||
} else
|
||||
this->handle_input(packet, res, m_params, m_state);
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
|
|
Loading…
Reference in a new issue