28 #ifdef DEBUG_NDOF_MOTION
30 static const char *progress_string[] = {
31 "not started",
"starting",
"in progress",
"finishing",
"finished"};
34 #ifdef DEBUG_NDOF_BUTTONS
35 static const char *ndof_button_names[] = {
52 "NDOF_BUTTON_ROLL_CW",
53 "NDOF_BUTTON_ROLL_CCW",
54 "NDOF_BUTTON_SPIN_CW",
55 "NDOF_BUTTON_SPIN_CCW",
56 "NDOF_BUTTON_TILT_CW",
57 "NDOF_BUTTON_TILT_CCW",
60 "NDOF_BUTTON_PANZOOM",
61 "NDOF_BUTTON_DOMINANT",
157 m_motionEventPending(false),
162 memset(m_translation, 0,
sizeof(m_translation));
163 memset(m_rotation, 0,
sizeof(m_rotation));
187 switch (product_id) {
191 puts(
"ndof: using SpaceNavigator");
197 puts(
"ndof: using SpaceExplorer");
203 puts(
"ndof: using SpacePilot Pro");
209 puts(
"ndof: using SpaceMouse Pro");
213 m_buttonMask = 0x07C0F137;
219 puts(
"ndof: using SpacePilot");
225 puts(
"ndof: using Spaceball 5000");
230 puts(
"ndof: using SpaceTraveler");
236 printf(
"ndof: unknown Logitech product %04hx\n", product_id);
240 switch (product_id) {
243 puts(
"ndof: using SpaceMouse Wireless");
250 puts(
"ndof: using SpaceMouse Pro Wireless");
254 m_buttonMask = 0x07C0F137;
258 puts(
"ndof: using SpaceMouse Enterprise");
265 printf(
"ndof: unknown 3Dconnexion product %04hx\n", product_id);
269 printf(
"ndof: unknown device %04hx:%04hx\n", vendor_id, product_id);
272 if (m_buttonMask == 0)
273 m_buttonMask = (int)~(
UINT_MAX << m_buttonCount);
275 #ifdef DEBUG_NDOF_BUTTONS
276 printf(
"ndof: %d buttons -> hex:%X\n", m_buttonCount, m_buttonMask);
284 memcpy(m_translation,
t,
sizeof(m_translation));
286 m_motionEventPending =
true;
291 memcpy(m_rotation,
r,
sizeof(m_rotation));
293 m_motionEventPending =
true;
296 void GHOST_NDOFManager::sendButtonEvent(
NDOF_ButtonT button,
302 "rogue button trying to escape NDOF manager");
305 GHOST_TEventNDOFButtonData *
data = (GHOST_TEventNDOFButtonData *)event->getData();
307 data->action = press ? GHOST_kPress : GHOST_kRelease;
308 data->button = button;
310 #ifdef DEBUG_NDOF_BUTTONS
311 printf(
"%s %s\n", ndof_button_names[button], press ?
"pressed" :
"released");
317 void GHOST_NDOFManager::sendKeyEvent(
GHOST_TKey key,
325 #ifdef DEBUG_NDOF_BUTTONS
326 printf(
"keyboard %s\n", press ?
"down" :
"up");
336 #ifdef DEBUG_NDOF_BUTTONS
337 printf(
"ndof: button %d -> ", button_number);
340 NDOF_ButtonT button = (button_number < m_buttonCount) ? m_hidMap[button_number] :
345 #ifdef DEBUG_NDOF_BUTTONS
346 printf(
"discarded\n");
362 sendButtonEvent(button, press,
time, window);
365 int mask = 1 << button_number;
376 button_bits &= m_buttonMask;
378 int diff = m_buttons ^ button_bits;
380 for (
int button_number = 0; button_number < m_buttonCount; ++button_number) {
381 int mask = 1 << button_number;
384 bool press = button_bits &
mask;
396 else if (dz > 0.5f) {
398 GHOST_PRINTF(
"ndof: dead zone of %.2f is rather high...\n", dz);
407 #define HOME(foo) (ndof->foo == 0.0f)
414 if (threshold == 0.0f) {
418 #define HOME(foo) (fabsf(ndof->foo) < threshold)
426 if (!m_motionEventPending)
429 m_motionEventPending =
false;
433 if (window ==
NULL) {
439 GHOST_TEventNDOFMotionData *
data = (GHOST_TEventNDOFMotionData *)event->getData();
444 const float scale = 1.0f / 350.0f;
446 data->tx = scale * m_translation[0];
447 data->ty = scale * m_translation[1];
448 data->tz = scale * m_translation[2];
450 data->rx = scale * m_rotation[0];
451 data->ry = scale * m_rotation[1];
452 data->rz = scale * m_rotation[2];
454 data->dt = 0.001f * (m_motionTime - m_prevMotionTime);
455 m_prevMotionTime = m_motionTime;
461 switch (m_motionState) {
472 #ifdef DEBUG_NDOF_MOTION
473 printf(
"ndof motion ignored -- %s\n", progress_string[
data->progress]);
492 #ifdef DEBUG_NDOF_MOTION
493 printf(
"ndof motion sent -- %s\n", progress_string[
data->progress]);
496 printf(
" T=(%d,%d,%d) R=(%d,%d,%d) raw\n",
503 printf(
" T=(%.2f,%.2f,%.2f) R=(%.2f,%.2f,%.2f) dt=%.3f\n",
#define GHOST_PRINTF(x,...)
#define GHOST_ASSERT(x, info)
static const NDOF_ButtonT Modern3Dx_HID_map[]
static const int genericButtonCount
static bool atHomePosition(GHOST_TEventNDOFMotionData *ndof)
static const NDOF_ButtonT SpacePilot_HID_map[]
static const NDOF_ButtonT SpaceExplorer_HID_map[]
static const NDOF_ButtonT Generic_HID_map[]
static bool nearHomePosition(GHOST_TEventNDOFMotionData *ndof, float threshold)
@ NDOF_SpaceMouseProWireless
@ NDOF_SpaceMouseWireless
@ NDOF_SpaceMouseEnterprise
unsigned long long GHOST_TUns64
@ GHOST_kEventKeyDown
Trackpad event.
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble u2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLdouble GLdouble v2 _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLdouble GLdouble nz _GL_VOID_RET _GL_VOID GLfloat GLfloat nz _GL_VOID_RET _GL_VOID GLint GLint nz _GL_VOID_RET _GL_VOID GLshort GLshort nz _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const GLfloat *values _GL_VOID_RET _GL_VOID GLsizei const GLushort *values _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID const GLuint const GLclampf *priorities _GL_VOID_RET _GL_VOID GLdouble y _GL_VOID_RET _GL_VOID GLfloat y _GL_VOID_RET _GL_VOID GLint y _GL_VOID_RET _GL_VOID GLshort y _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLfloat GLfloat z _GL_VOID_RET _GL_VOID GLint GLint z _GL_VOID_RET _GL_VOID GLshort GLshort z _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble w _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat w _GL_VOID_RET _GL_VOID GLint GLint GLint w _GL_VOID_RET _GL_VOID GLshort GLshort GLshort w _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble y2 _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat y2 _GL_VOID_RET _GL_VOID GLint GLint GLint y2 _GL_VOID_RET _GL_VOID GLshort GLshort GLshort y2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLuint *buffer _GL_VOID_RET _GL_VOID GLdouble t _GL_VOID_RET _GL_VOID GLfloat t _GL_VOID_RET _GL_VOID GLint t _GL_VOID_RET _GL_VOID GLshort t _GL_VOID_RET _GL_VOID GLdouble GLdouble r _GL_VOID_RET _GL_VOID GLfloat GLfloat r _GL_VOID_RET _GL_VOID GLint GLint r _GL_VOID_RET _GL_VOID GLshort GLshort r _GL_VOID_RET _GL_VOID GLdouble GLdouble r
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble u2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLdouble GLdouble v2 _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLdouble GLdouble nz _GL_VOID_RET _GL_VOID GLfloat GLfloat nz _GL_VOID_RET _GL_VOID GLint GLint nz _GL_VOID_RET _GL_VOID GLshort GLshort nz _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const GLfloat *values _GL_VOID_RET _GL_VOID GLsizei const GLushort *values _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID const GLuint const GLclampf *priorities _GL_VOID_RET _GL_VOID GLdouble y _GL_VOID_RET _GL_VOID GLfloat y _GL_VOID_RET _GL_VOID GLint y _GL_VOID_RET _GL_VOID GLshort y _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLfloat GLfloat z _GL_VOID_RET _GL_VOID GLint GLint z _GL_VOID_RET _GL_VOID GLshort GLshort z _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble w _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat w _GL_VOID_RET _GL_VOID GLint GLint GLint w _GL_VOID_RET _GL_VOID GLshort GLshort GLshort w _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble y2 _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat y2 _GL_VOID_RET _GL_VOID GLint GLint GLint y2 _GL_VOID_RET _GL_VOID GLshort GLshort GLshort y2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLuint *buffer _GL_VOID_RET _GL_VOID GLdouble t _GL_VOID_RET _GL_VOID GLfloat t _GL_VOID_RET _GL_VOID GLint t _GL_VOID_RET _GL_VOID GLshort t _GL_VOID_RET _GL_VOID GLdouble t
void updateTranslation(const int t[3], GHOST_TUns64 time)
void updateButtons(int button_bits, GHOST_TUns64 time)
void updateButton(int button_number, bool press, GHOST_TUns64 time)
GHOST_NDOFManager(GHOST_System &)
bool setDevice(unsigned short vendor_id, unsigned short product_id)
void updateRotation(const int r[3], GHOST_TUns64 time)
GHOST_WindowManager * getWindowManager() const
GHOST_TSuccess pushEvent(GHOST_IEvent *event)
GHOST_IWindow * getActiveWindow(void) const
IMETHOD Vector diff(const Vector &a, const Vector &b, double dt=1)
ccl_device_inline float4 mask(const int4 &mask, const float4 &a)