*/
/*
- * Modified by Jinrong Xie (stonexjr@gmail.com) 12/24/2014
+ * Modified by Jinrong Xie <stonexjr at gmail.com> 12/24/2014
* for Space Navigator support on Windows.
* This code is enhanced by at least supporting 3Dconnexion's
* six degree of freedom navigator.
*/
+#if(_WIN32_WINNT >= 0x0501)
+
#include <GL/freeglut.h>
+#include <stdlib.h>
#include "../fg_internal.h"
enum {
void fgPlatformInitializeSpaceball(void)
{
HWND hwnd;
- sball_initialized = 1;
+ sball_initialized = 1;
if (!fgStructure.CurrentWindow)
{
sball_initialized = 0;
}
hwnd = fgStructure.CurrentWindow->Window.Handle;
- BOOL ok;
- UINT cbSize = sizeof(__fgSpaceball);
- __fgSpaceball.hwndTarget = hwnd;
- ok = RegisterRawInputDevices(&__fgSpaceball, 1, cbSize);
-
- if (!ok){
- __fgSpaceball.hwndTarget = NULL;
- sball_initialized = 0;
+ {
+ BOOL ok;
+ UINT cbSize = sizeof(__fgSpaceball);
+ __fgSpaceball.hwndTarget = hwnd;
+ ok = RegisterRawInputDevices(&__fgSpaceball, 1, cbSize);
+
+ if (!ok){
+ __fgSpaceball.hwndTarget = NULL;
+ sball_initialized = 0;
+ }
}
}
if (res == -1)
return;
- rawInputBuffer = (BYTE*)malloc(size);
+ rawInputBuffer = malloc(size * sizeof *rawInputBuffer);
pRawInput = (PRAWINPUT)rawInputBuffer;
res = GetRawInputData(hRawInput, RID_INPUT, pRawInput, &size, sizeof(RAWINPUTHEADER));
res = GetRawInputDeviceInfo(pRawInput->header.hDevice, RIDI_DEVICEINFO, &sRidDeviceInfo, &size);
if (res == -1)
return;
-
- SFG_Window* window = fgWindowByHandle(hwnd);
- if ((window == NULL))
- return;
-
- if (sRidDeviceInfo.hid.dwVendorId == LOGITECH_VENDOR_ID)
{
- // Motion data comes in two parts: motion type and
- // displacement/rotation along three axis.
- // Orientation is a right handed coordinate system with
- // X goes right, Y goes up and Z goes towards viewer, e.g.
- // the one used in OpenGL
- if (pRawInput->data.hid.bRawData[0] ==
- SPNAV_EVENT_MOTION_TRANSLATION)
- { // Translation vector
- short* pnData = (short*)(&pRawInput->data.hid.bRawData[1]);
- short X = pnData[0];
- short Y = -pnData[2];
- short Z = pnData[1];
- INVOKE_WCB(*window, SpaceMotion, (X, Y, Z));
- }
- else if (pRawInput->data.hid.bRawData[0] ==
+ SFG_Window* window = fgWindowByHandle(hwnd);
+ if ((window == NULL))
+ return;
+
+ if (sRidDeviceInfo.hid.dwVendorId == LOGITECH_VENDOR_ID)
+ {
+ // Motion data comes in two parts: motion type and
+ // displacement/rotation along three axis.
+ // Orientation is a right handed coordinate system with
+ // X goes right, Y goes up and Z goes towards viewer, e.g.
+ // the one used in OpenGL
+ if (pRawInput->data.hid.bRawData[0] ==
+ SPNAV_EVENT_MOTION_TRANSLATION)
+ { // Translation vector
+ short* pnData = (short*)(&pRawInput->data.hid.bRawData[1]);
+ short X = pnData[0];
+ short Y = -pnData[2];
+ short Z = pnData[1];
+ INVOKE_WCB(*window, SpaceMotion, (X, Y, Z));
+ }
+ else if (pRawInput->data.hid.bRawData[0] ==
SPNAV_EVENT_MOTION_ROTATION)
- { // Axis aligned rotation vector
- short* pnData = (short*)(&pRawInput->data.hid.bRawData[1]);
- short rX = pnData[0];
- short rY = -pnData[2];
- short rZ = pnData[1];
- INVOKE_WCB(*window, SpaceRotation, (rX, rY, rZ));
- }
- else if (pRawInput->data.hid.bRawData[0] ==
- SPNAV_EVENT_BUTTON)
- { // State of the keys
- unsigned long dwKeystate = *(unsigned long*)(&pRawInput->data.hid.bRawData[1]);
- unsigned int state = GLUT_UP;
- if (FETCH_WCB(*window, SpaceButton))
- {
- int i;
- for (i = 0; i < 32; i++)
+ { // Axis aligned rotation vector
+ short* pnData = (short*)(&pRawInput->data.hid.bRawData[1]);
+ short rX = pnData[0];
+ short rY = -pnData[2];
+ short rZ = pnData[1];
+ INVOKE_WCB(*window, SpaceRotation, (rX, rY, rZ));
+ }
+ else if (pRawInput->data.hid.bRawData[0] ==
+ SPNAV_EVENT_BUTTON)
+ { // State of the keys
+ unsigned long dwKeystate = *(unsigned long*)(&pRawInput->data.hid.bRawData[1]);
+ unsigned int state = GLUT_UP;
+ if (FETCH_WCB(*window, SpaceButton))
{
- unsigned long stateBefore = __fgSpaceKeystate&(1 << i);
- unsigned long stateNow = dwKeystate&(1 << i);
-
- if (stateBefore && !stateNow)
- INVOKE_WCB(*window, SpaceButton, (stateBefore, GLUT_DOWN));
- if (!stateBefore && stateNow)
- INVOKE_WCB(*window, SpaceButton, (stateNow, GLUT_UP));
-
+ int i;
+ for (i = 0; i < 32; i++)
+ {
+ unsigned long stateBefore = __fgSpaceKeystate&(1 << i);
+ unsigned long stateNow = dwKeystate&(1 << i);
+
+ if (stateBefore && !stateNow)
+ INVOKE_WCB(*window, SpaceButton, (stateBefore, GLUT_UP));
+ if (!stateBefore && stateNow)
+ INVOKE_WCB(*window, SpaceButton, (stateNow, GLUT_DOWN));
+
+ }
}
+ __fgSpaceKeystate = dwKeystate;
}
- __fgSpaceKeystate = dwKeystate;
}
}
-}
\ No newline at end of file
+}
+
+#endif
\ No newline at end of file