15 #ifdef DEBUG_NDOF_MOTION
17 static const char *progress_string[] = {
18 "not started",
"starting",
"in progress",
"finishing",
"finished"};
21 #ifdef DEBUG_NDOF_BUTTONS
22 static const char *ndof_button_names[] = {
39 "NDOF_BUTTON_ROLL_CW",
40 "NDOF_BUTTON_ROLL_CCW",
41 "NDOF_BUTTON_SPIN_CW",
42 "NDOF_BUTTON_SPIN_CCW",
43 "NDOF_BUTTON_TILT_CW",
44 "NDOF_BUTTON_TILT_CCW",
47 "NDOF_BUTTON_PANZOOM",
48 "NDOF_BUTTON_DOMINANT",
144 m_motionEventPending(false),
149 memset(m_translation, 0,
sizeof(m_translation));
150 memset(m_rotation, 0,
sizeof(m_rotation));
174 switch (product_id) {
178 puts(
"ndof: using SpaceNavigator");
184 puts(
"ndof: using SpaceExplorer");
190 puts(
"ndof: using SpacePilot Pro");
196 puts(
"ndof: using SpaceMouse Pro");
200 m_buttonMask = 0x07C0F137;
206 puts(
"ndof: using SpacePilot");
212 puts(
"ndof: using Spaceball 5000");
217 puts(
"ndof: using SpaceTraveler");
223 printf(
"ndof: unknown Logitech product %04hx\n", product_id);
227 switch (product_id) {
230 puts(
"ndof: using SpaceMouse Wireless");
237 puts(
"ndof: using SpaceMouse Pro Wireless");
241 m_buttonMask = 0x07C0F137;
245 puts(
"ndof: using SpaceMouse Enterprise");
252 printf(
"ndof: unknown 3Dconnexion product %04hx\n", product_id);
256 printf(
"ndof: unknown device %04hx:%04hx\n", vendor_id, product_id);
259 if (m_buttonMask == 0) {
260 m_buttonMask = (int)~(
UINT_MAX << m_buttonCount);
263 #ifdef DEBUG_NDOF_BUTTONS
264 printf(
"ndof: %d buttons -> hex:%X\n", m_buttonCount, m_buttonMask);
272 memcpy(m_translation,
t,
sizeof(m_translation));
274 m_motionEventPending =
true;
279 memcpy(m_rotation,
r,
sizeof(m_rotation));
281 m_motionEventPending =
true;
284 void GHOST_NDOFManager::sendButtonEvent(
NDOF_ButtonT button,
290 "rogue button trying to escape NDOF manager");
293 GHOST_TEventNDOFButtonData *
data = (GHOST_TEventNDOFButtonData *)event->getData();
295 data->action = press ? GHOST_kPress : GHOST_kRelease;
296 data->button = button;
298 #ifdef DEBUG_NDOF_BUTTONS
299 printf(
"%s %s\n", ndof_button_names[button], press ?
"pressed" :
"released");
305 void GHOST_NDOFManager::sendKeyEvent(
GHOST_TKey key,
313 #ifdef DEBUG_NDOF_BUTTONS
314 printf(
"keyboard %s\n", press ?
"down" :
"up");
324 #ifdef DEBUG_NDOF_BUTTONS
325 printf(
"ndof: button %d -> ", button_number);
328 NDOF_ButtonT button = (button_number < m_buttonCount) ? m_hidMap[button_number] :
333 #ifdef DEBUG_NDOF_BUTTONS
334 printf(
"discarded\n");
350 sendButtonEvent(button, press,
time, window);
353 int mask = 1 << button_number;
364 button_bits &= m_buttonMask;
366 int diff = m_buttons ^ button_bits;
368 for (
int button_number = 0; button_number < m_buttonCount; ++button_number) {
369 int mask = 1 << button_number;
372 bool press = button_bits &
mask;
384 else if (dz > 0.5f) {
386 GHOST_PRINTF(
"ndof: dead zone of %.2f is rather high...\n", dz);
395 #define HOME(foo) (ndof->foo == 0.0f)
406 #define HOME(foo) (fabsf(ndof->foo) < threshold)
414 if (!m_motionEventPending)
417 m_motionEventPending =
false;
421 if (window ==
NULL) {
427 GHOST_TEventNDOFMotionData *
data = (GHOST_TEventNDOFMotionData *)event->getData();
432 const float scale = 1.0f / 350.0f;
434 data->tx = scale * m_translation[0];
435 data->ty = scale * m_translation[1];
436 data->tz = scale * m_translation[2];
438 data->rx = scale * m_rotation[0];
439 data->ry = scale * m_rotation[1];
440 data->rz = scale * m_rotation[2];
442 data->dt = 0.001f * (m_motionTime - m_prevMotionTime);
443 m_prevMotionTime = m_motionTime;
449 switch (m_motionState) {
460 #ifdef DEBUG_NDOF_MOTION
461 printf(
"ndof motion ignored -- %s\n", progress_string[
data->progress]);
482 #ifdef DEBUG_NDOF_MOTION
483 printf(
"ndof motion sent -- %s\n", progress_string[
data->progress]);
486 printf(
" T=(%d,%d,%d) R=(%d,%d,%d) raw\n",
493 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
_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 updateButtons(int button_bits, uint64_t time)
void updateButton(int button_number, bool press, uint64_t time)
void updateTranslation(const int t[3], uint64_t time)
GHOST_NDOFManager(GHOST_System &)
void updateRotation(const int r[3], uint64_t time)
bool setDevice(unsigned short vendor_id, unsigned short product_id)
GHOST_WindowManager * getWindowManager() const
GHOST_TSuccess pushEvent(GHOST_IEvent *event)
GHOST_IWindow * getActiveWindow(void) const
ccl_gpu_kernel_postfix ccl_global float int int int int float threshold
ccl_device_inline float4 mask(const int4 &mask, const float4 &a)
IMETHOD Vector diff(const Vector &a, const Vector &b, double dt=1)
unsigned __int64 uint64_t