[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [37394] branches/merwin-spacenav: SpaceNav works on Linux
Mike Erwin
significant.bit at gmail.com
Sat Jun 11 02:25:48 CEST 2011
Revision: 37394
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37394
Author: merwin
Date: 2011-06-11 00:25:48 +0000 (Sat, 11 Jun 2011)
Log Message:
-----------
SpaceNav works on Linux
Modified Paths:
--------------
branches/merwin-spacenav/intern/ghost/GHOST_Types.h
branches/merwin-spacenav/intern/ghost/intern/GHOST_EventManager.cpp
branches/merwin-spacenav/intern/ghost/intern/GHOST_NDOFManager.cpp
branches/merwin-spacenav/intern/ghost/intern/GHOST_NDOFManager.h
branches/merwin-spacenav/intern/ghost/intern/GHOST_NDOFManagerX11.h
branches/merwin-spacenav/intern/ghost/intern/GHOST_SystemWin32.cpp
branches/merwin-spacenav/intern/ghost/intern/GHOST_SystemX11.cpp
branches/merwin-spacenav/intern/ghost/intern/GHOST_SystemX11.h
branches/merwin-spacenav/source/blender/editors/space_view3d/view3d_edit.c
branches/merwin-spacenav/source/blender/windowmanager/intern/wm_event_system.c
branches/merwin-spacenav/source/blender/windowmanager/intern/wm_window.c
Added Paths:
-----------
branches/merwin-spacenav/intern/ghost/intern/GHOST_NDOFManagerX11.cpp
Modified: branches/merwin-spacenav/intern/ghost/GHOST_Types.h
===================================================================
--- branches/merwin-spacenav/intern/ghost/GHOST_Types.h 2011-06-11 00:22:35 UTC (rev 37393)
+++ branches/merwin-spacenav/intern/ghost/GHOST_Types.h 2011-06-11 00:25:48 UTC (rev 37394)
@@ -47,11 +47,6 @@
typedef int GHOST_TInt32;
typedef unsigned int GHOST_TUns32;
-#ifdef WIN32
-#define WM_BLND_NDOF_AXIS WM_USER + 1
-#define WM_BLND_NDOF_BTN WM_USER + 2
-#endif
-
#if defined(WIN32) && !defined(FREE_WINDOWS)
typedef __int64 GHOST_TInt64;
typedef unsigned __int64 GHOST_TUns64;
Modified: branches/merwin-spacenav/intern/ghost/intern/GHOST_EventManager.cpp
===================================================================
--- branches/merwin-spacenav/intern/ghost/intern/GHOST_EventManager.cpp 2011-06-11 00:22:35 UTC (rev 37393)
+++ branches/merwin-spacenav/intern/ghost/intern/GHOST_EventManager.cpp 2011-06-11 00:25:48 UTC (rev 37394)
@@ -42,8 +42,8 @@
#include "GHOST_EventManager.h"
#include <algorithm>
#include "GHOST_Debug.h"
+#include <stdio.h> // [mce] temp debug
-
GHOST_EventManager::GHOST_EventManager()
{
}
@@ -111,6 +111,7 @@
bool GHOST_EventManager::dispatchEvent(GHOST_IEvent* event)
{
bool handled;
+ printf("dispatching %d\n", event->getType());
if (event) {
handled = true;
TConsumerVector::iterator iter;
Modified: branches/merwin-spacenav/intern/ghost/intern/GHOST_NDOFManager.cpp
===================================================================
--- branches/merwin-spacenav/intern/ghost/intern/GHOST_NDOFManager.cpp 2011-06-11 00:22:35 UTC (rev 37393)
+++ branches/merwin-spacenav/intern/ghost/intern/GHOST_NDOFManager.cpp 2011-06-11 00:25:48 UTC (rev 37394)
@@ -16,7 +16,7 @@
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* Contributor(s):
- * Mike Erwin
+ * Mike Erwin
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -54,12 +54,33 @@
m_atRest = false;
}
-void GHOST_NDOFManager::updateButtons(unsigned short buttons, GHOST_TUns64 time)
+void GHOST_NDOFManager::updateButton(int button_number, bool press, GHOST_TUns64 time)
{
GHOST_IWindow* window = m_system.getWindowManager()->getActiveWindow();
- unsigned short diff = m_buttons ^ buttons;
+ GHOST_EventNDOFButton* event = new GHOST_EventNDOFButton(time, window);
+ GHOST_TEventNDOFButtonData* data = (GHOST_TEventNDOFButtonData*) event->getData();
+ data->action = press ? GHOST_kPress : GHOST_kRelease;
+ data->button = button_number + 1;
+
+ printf("sending button %d %s\n", data->button, (data->action == GHOST_kPress) ? "pressed" : "released");
+
+ m_system.pushEvent(event);
+
+ unsigned short mask = 1 << button_number;
+ if (press)
+ m_buttons |= mask; // set this button's bit
+ else
+ m_buttons &= ~mask; // clear this button's bit
+ }
+
+void GHOST_NDOFManager::updateButtons(unsigned short button_bits, GHOST_TUns64 time)
+ {
+ GHOST_IWindow* window = m_system.getWindowManager()->getActiveWindow();
+
+ unsigned short diff = m_buttons ^ button_bits;
+
for (int i = 0; i < 16; ++i)
{
unsigned short mask = 1 << i;
@@ -69,16 +90,16 @@
GHOST_EventNDOFButton* event = new GHOST_EventNDOFButton(time, window);
GHOST_TEventNDOFButtonData* data = (GHOST_TEventNDOFButtonData*) event->getData();
- data->action = (buttons & mask) ? GHOST_kPress : GHOST_kRelease;
+ data->action = (button_bits & mask) ? GHOST_kPress : GHOST_kRelease;
data->button = i + 1;
- // printf("sending button %d %s\n", data->button, (data->action == GHOST_kPress) ? "pressed" : "released");
+ printf("sending button %d %s\n", data->button, (data->action == GHOST_kPress) ? "pressed" : "released");
m_system.pushEvent(event);
}
}
- m_buttons = buttons;
+ m_buttons = button_bits;
}
bool GHOST_NDOFManager::sendMotionEvent()
@@ -109,14 +130,16 @@
m_prevMotionTime = m_motionTime;
- // printf("sending T=(%.2f,%.2f,%.2f) R=(%.2f,%.2f,%.2f) dt=%.3f\n",
- // data->tx, data->ty, data->tz, data->rx, data->ry, data->rz, data->dt);
+ printf("sending T=(%.2f,%.2f,%.2f) R=(%.2f,%.2f,%.2f) dt=%.3f\n",
+ data->tx, data->ty, data->tz, data->rx, data->ry, data->rz, data->dt);
m_system.pushEvent(event);
// 'at rest' test goes at the end so that the first 'rest' event gets sent
m_atRest = m_rotation[0] == 0 && m_rotation[1] == 0 && m_rotation[2] == 0 &&
m_translation[0] == 0 && m_translation[1] == 0 && m_translation[2] == 0;
+ // this needs to be aware of calibration -- 0.01 0.01 0.03 might be 'rest'
return true;
}
+
Modified: branches/merwin-spacenav/intern/ghost/intern/GHOST_NDOFManager.h
===================================================================
--- branches/merwin-spacenav/intern/ghost/intern/GHOST_NDOFManager.h 2011-06-11 00:22:35 UTC (rev 37393)
+++ branches/merwin-spacenav/intern/ghost/intern/GHOST_NDOFManager.h 2011-06-11 00:25:48 UTC (rev 37394)
@@ -15,7 +15,8 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
- * Contributor(s): none yet.
+ * Contributor(s):
+ * Mike Erwin
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -40,27 +41,28 @@
// the latest raw data from the device
void updateTranslation(short t[3], GHOST_TUns64 time);
void updateRotation(short r[3], GHOST_TUns64 time);
- // this one sends events immediately for changed buttons
- void updateButtons(unsigned short b, GHOST_TUns64 time);
+ // send events immediately for changed buttons
+ void updateButton(int button_number, bool press, GHOST_TUns64 time);
+ void updateButtons(unsigned short button_bits, GHOST_TUns64 time);
// processes most recent raw data into an NDOFMotion event and sends it
// returns whether an event was sent
- virtual bool sendMotionEvent();
+ bool sendMotionEvent();
protected:
GHOST_System& m_system;
short m_translation[3];
short m_rotation[3];
- unsigned short m_buttons;
+ unsigned short m_buttons; // bit field
- GHOST_TUns64 m_motionTime;
+ GHOST_TUns64 m_motionTime; // in milliseconds
GHOST_TUns64 m_prevMotionTime; // time of most recent Motion event sent
bool m_atRest;
- void updateMotionTime(GHOST_TUns64 t);
- void resetMotion();
+// void updateMotionTime(GHOST_TUns64 t);
+// void resetMotion();
};
+#endif
-#endif
Added: branches/merwin-spacenav/intern/ghost/intern/GHOST_NDOFManagerX11.cpp
===================================================================
--- branches/merwin-spacenav/intern/ghost/intern/GHOST_NDOFManagerX11.cpp (rev 0)
+++ branches/merwin-spacenav/intern/ghost/intern/GHOST_NDOFManagerX11.cpp 2011-06-11 00:25:48 UTC (rev 37394)
@@ -0,0 +1,86 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s):
+ * Mike Erwin
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include "GHOST_NDOFManagerX11.h"
+#include "GHOST_SystemX11.h"
+#include <spnav.h>
+#include <stdio.h>
+
+
+GHOST_NDOFManagerX11::GHOST_NDOFManagerX11(GHOST_System& sys)
+ : GHOST_NDOFManager(sys)
+ {
+ if (spnav_open() != -1)
+ {
+ m_available = true;
+ }
+ else
+ {
+ printf("<!> SpaceNav driver not found\n");
+ // This isn't a hard error, just means the user doesn't have a SpaceNavigator.
+ m_available = false;
+ }
+ }
+
+GHOST_NDOFManagerX11::~GHOST_NDOFManagerX11()
+ {
+ if (m_available)
+ {
+ spnav_remove_events(SPNAV_EVENT_ANY); // ask nuclear if this is needed
+ spnav_close();
+ }
+ }
+
+bool GHOST_NDOFManagerX11::available()
+ {
+ return m_available;
+ }
+
+bool GHOST_NDOFManagerX11::processEvents()
+ {
+ GHOST_TUns64 now = m_system.getMilliSeconds();
+
+ bool anyProcessed = false;
+ spnav_event e;
+ while (spnav_poll_event(&e))
+ {
+ switch (e.type)
+ {
+ case SPNAV_EVENT_MOTION:
+ {
+ short t[3] = {e.motion.x, e.motion.y, e.motion.z};
+ short r[3] = {e.motion.rx, e.motion.ry, e.motion.rz};
+
+ updateTranslation(t, now);
+ updateRotation(r, now);
+ break;
+ }
+ case SPNAV_EVENT_BUTTON:
+ updateButton(e.button.bnum, e.button.press, now);
+ break;
+ }
+ anyProcessed = true;
+ }
+ return anyProcessed;
+ }
+
Modified: branches/merwin-spacenav/intern/ghost/intern/GHOST_NDOFManagerX11.h
===================================================================
--- branches/merwin-spacenav/intern/ghost/intern/GHOST_NDOFManagerX11.h 2011-06-11 00:22:35 UTC (rev 37393)
+++ branches/merwin-spacenav/intern/ghost/intern/GHOST_NDOFManagerX11.h 2011-06-11 00:25:48 UTC (rev 37394)
@@ -15,7 +15,8 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
- * Contributor(s): none yet.
+ * Contributor(s):
+ * Mike Erwin
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -24,77 +25,18 @@
#define _GHOST_NDOFMANAGERX11_H_
#include "GHOST_NDOFManager.h"
-#include "GHOST_Types.h"
-#include "GHOST_WindowX11.h"
-#include "GHOST_EventNDOF.h"
-#include <X11/Xlib.h>
-#include <stdio.h>
class GHOST_NDOFManagerX11 : public GHOST_NDOFManager
-{
-GHOST_WindowX11 * m_ghost_window_x11;
-
+ {
public:
- GHOST_NDOFManagerX11(GHOST_System& sys)
- : GHOST_NDOFManager(sys)
- {}
+ GHOST_NDOFManagerX11(GHOST_System&);
+ ~GHOST_NDOFManagerX11();
+ bool available();
+ bool processEvents();
- void setGHOSTWindowX11(GHOST_WindowX11 * w){
- if (m_ghost_window_x11 == NULL)
- m_ghost_window_x11 = w;
- }
+private:
+ bool m_available;
+ };
- GHOST_WindowX11 * getGHOSTWindowX11(){
- return m_ghost_window_x11;
- }
-
- // whether multi-axis functionality is available (via the OS or driver)
- // does not imply that a device is plugged in or being used
- bool available()
- {
- // never available since I've not yet written it!
- return true;
- }
-
- virtual bool sendMotionEvent()
- {
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list