[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