[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