[Bf-committers] [Bf-blender-cvs] SVN commit: /data/svn/bf-blender [37394] branches/merwin-spacenav: SpaceNav works on Linux
M.G. Kishalmi
lmg at kishalmi.net
Sat Jun 11 12:06:17 CEST 2011
hey Mike,
good to see you're makin' progress! :)
in order to get your branch compiled on linux with cmake, I had to tweak it
a bit.
* install the 'libspnav-dev' package
* added the NDOFManagerX11 files to ghosts CMakeLists.txt
* added "CMAKE_EXE_LINKER_FLAGS_RELEASE -lspnav"
ideally you'd add some cmake flag like WITH_SPACENAV that also does a
library check and add the proper compile and linking flags,
didn't know how to, so I went the bruteforce way. maybe some cmake guru can
help here?
running was straight forward after:
* run 'spacenavd' (had to run it sudo or it wouldn't create the .sock)
keep it up!
hth,
mario
Index: intern/ghost/CMakeLists.txt
===================================================================
--- intern/ghost/CMakeLists.txt (revision 37401)
+++ intern/ghost/CMakeLists.txt (working copy)
@@ -168,11 +168,13 @@
intern/GHOST_SystemX11.cpp
intern/GHOST_SystemPathsX11.cpp
intern/GHOST_WindowX11.cpp
+ intern/GHOST_NDOFManagerX11.cpp
intern/GHOST_DisplayManagerX11.h
intern/GHOST_SystemX11.h
intern/GHOST_SystemPathsX11.h
intern/GHOST_WindowX11.h
+ intern/GHOST_NDOFManagerX11.h
)
On Sat, Jun 11, 2011 at 2:25 AM, Mike Erwin <significant.bit at gmail.com>wrote:
> 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. @@
> _______________________________________________
> Bf-blender-cvs mailing list
> Bf-blender-cvs at blender.org
> http://lists.blender.org/mailman/listinfo/bf-blender-cvs
>
More information about the Bf-committers
mailing list