Nur in blender-2.44-spacenav: cscope.out. diff -aur blender-2.44/intern/ghost/GHOST_C-api.h blender-2.44-spacenav/intern/ghost/GHOST_C-api.h --- blender-2.44/intern/ghost/GHOST_C-api.h 2006-08-03 16:16:30.000000000 +0200 +++ blender-2.44-spacenav/intern/ghost/GHOST_C-api.h 2007-05-20 14:58:27.000000000 +0200 @@ -615,6 +615,13 @@ extern const GHOST_TabletData *GHOST_GetTabletData(GHOST_WindowHandle windowhandle); /** + * Returns the status of the Space Navigator + * @param windowhandle The handle to the window + * @return Status of the Space Navigator + */ +extern const GHOST_SpaceNavData *GHOST_GetSpaceNavData(GHOST_WindowHandle windowhandle); + +/** * Access to rectangle width. * @param rectanglehandle The handle to the rectangle * @return width of the rectangle diff -aur blender-2.44/intern/ghost/GHOST_IWindow.h blender-2.44-spacenav/intern/ghost/GHOST_IWindow.h --- blender-2.44/intern/ghost/GHOST_IWindow.h 2006-08-03 16:16:30.000000000 +0200 +++ blender-2.44-spacenav/intern/ghost/GHOST_IWindow.h 2007-05-20 14:57:11.000000000 +0200 @@ -206,6 +206,12 @@ * @return The tablet data (pressure etc). */ virtual const GHOST_TabletData* GetTabletData() = 0; + + /** + * Returns the space navigator data + * @return the spcae navigaotr data + */ + virtual const GHOST_SpaceNavData* GetSpaceNavData() = 0; /*************************************************************************************** ** Cursor management functionality diff -aur blender-2.44/intern/ghost/GHOST_Types.h blender-2.44-spacenav/intern/ghost/GHOST_Types.h --- blender-2.44/intern/ghost/GHOST_Types.h 2007-04-12 18:51:46.000000000 +0200 +++ blender-2.44-spacenav/intern/ghost/GHOST_Types.h 2007-05-27 23:12:46.000000000 +0200 @@ -70,6 +70,22 @@ } GHOST_TabletData; +/* Patch for SpaceNavigator: Data type for a 6d input devices such as 3dconnexion SpaceNavigator + * value[0]: x-axis, movement left to right + * value[1]: y-axis, movement far to near + * value[2]: z-axis, movement up to down + * value[3]: x-axis rotation, tilting forward to backward + * value[4]: y-axis rotation, tilting right to left + * value[5]: z-axis rotation, rotating around upward axis left to right +*/ +typedef struct GHOST_SpaceNavData { + int count; + float values[6]; + int button_left; /* left button pressed if 1 */ + int button_right; /* right button pressed if 1 */ +} GHOST_SpaceNavData; + + typedef enum { GHOST_kNotVisible = 0, GHOST_kPartiallyVisible, @@ -144,6 +160,7 @@ GHOST_kEventWindowDeactivate, GHOST_kEventWindowUpdate, GHOST_kEventWindowSize, + GHOST_kEventSpaceMotion, // XInput Event for Space Navigator GHOST_kNumEventTypes } GHOST_TEventType; diff -aur blender-2.44/intern/ghost/intern/GHOST_C-api.cpp blender-2.44-spacenav/intern/ghost/intern/GHOST_C-api.cpp --- blender-2.44/intern/ghost/intern/GHOST_C-api.cpp 2006-10-24 18:42:12.000000000 +0200 +++ blender-2.44-spacenav/intern/ghost/intern/GHOST_C-api.cpp 2007-05-20 15:07:02.000000000 +0200 @@ -656,6 +656,10 @@ return ((GHOST_IWindow*)windowhandle)->GetTabletData(); } +extern const GHOST_SpaceNavData* GHOST_GetSpaceNavData(GHOST_WindowHandle windowhandle) +{ + return ((GHOST_IWindow*)windowhandle)->GetSpaceNavData(); +} GHOST_TInt32 GHOST_GetWidthRectangle(GHOST_RectangleHandle rectanglehandle) { diff -aur blender-2.44/intern/ghost/intern/GHOST_SystemX11.cpp blender-2.44-spacenav/intern/ghost/intern/GHOST_SystemX11.cpp --- blender-2.44/intern/ghost/intern/GHOST_SystemX11.cpp 2007-04-12 18:51:46.000000000 +0200 +++ blender-2.44-spacenav/intern/ghost/intern/GHOST_SystemX11.cpp 2007-05-28 16:51:16.000000000 +0200 @@ -528,7 +528,40 @@ window->GetXTablet().CommonData.Active= 2; } else if(xe->type == window->GetXTablet().ProxOutEvent) + { window->GetXTablet().CommonData.Active= 0; + } + else if(xe->type == window->GetXSpaceNav().MotionEvent) + { + int i; + XDeviceMotionEvent* data = (XDeviceMotionEvent*)xe; + GHOST_SpaceNavData *snd = &window->GetXSpaceNav().CommonData; + struct timeval tv_cur; + + gettimeofday(&tv_cur, NULL); + window->GetXSpaceNav().CommonData.count++; + + for(i=0; i<6; i++) + snd->values[i] = (float)(data->axis_data[i])*0.001; + +/* + printf("SpaceNav MotionEvent pan_x=%5d pan_y=%5d zoom=%5d tilt_x=%5d tilt_y=%5d twist=%5d\n", + data->axis_data[0], data->axis_data[1], data->axis_data[2], + data->axis_data[3], data->axis_data[4], data->axis_data[5]); +*/ + + /* Send event max. once per millisecond */ + if(abs(tv_cur.tv_usec - window->GetXSpaceNav().timestamp.tv_usec) > 1000) { + window->GetXSpaceNav().timestamp.tv_sec = tv_cur.tv_sec; + window->GetXSpaceNav().timestamp.tv_sec = tv_cur.tv_usec; + + g_event = new + GHOST_Event( + getMilliSeconds(), + GHOST_kEventSpaceMotion, + window); + } + } break; } Nur in blender-2.44-spacenav/intern/ghost/intern: .GHOST_SystemX11.cpp.swp. diff -aur blender-2.44/intern/ghost/intern/GHOST_WindowX11.cpp blender-2.44-spacenav/intern/ghost/intern/GHOST_WindowX11.cpp --- blender-2.44/intern/ghost/intern/GHOST_WindowX11.cpp 2007-04-16 20:32:35.000000000 +0200 +++ blender-2.44-spacenav/intern/ghost/intern/GHOST_WindowX11.cpp 2007-05-28 16:50:54.000000000 +0200 @@ -251,6 +251,9 @@ m_xtablet.EraserDevice = 0; m_xtablet.CommonData.Active= 0; + m_xspacenav.SpaceNavDevice = 0; + m_xspacenav.CommonData.count = 0; + /* Install our error handler to override Xlib's termination behavior */ old_handler = XSetErrorHandler(ApplicationErrorHandler) ; @@ -285,6 +288,12 @@ m_xtablet.EraserDevice = XOpenDevice(m_display, m_xtablet.EraserID); if (m_xtablet.EraserDevice == NULL) m_xtablet.EraserID= 0; } + if(!strncmp(device_info[i].name, "SpaceNav[0]", strlen("SpaceNav[0]"))) { + printf("Found SpaceNavigator device %s\n", device_info[i].name); + m_xspacenav.SpaceNavID = device_info[i].id; + m_xspacenav.SpaceNavDevice = XOpenDevice(m_display, m_xspacenav.SpaceNavID); + if (m_xspacenav.SpaceNavDevice == NULL) m_xspacenav.SpaceNavID = 0; + } } /* Restore handler */ @@ -312,6 +321,10 @@ ProximityOut(m_xtablet.EraserDevice, m_xtablet.ProxOutEvent, ev); if(ev) xevents[dcount++] = ev; } + if(m_xspacenav.SpaceNavDevice) { + DeviceMotionNotify(m_xspacenav.SpaceNavDevice, m_xspacenav.MotionEvent, ev); + if(ev) xevents[dcount++] = ev; + } XSelectExtensionEvent(m_display, m_window, xevents, dcount); } diff -aur blender-2.44/intern/ghost/intern/GHOST_WindowX11.h blender-2.44-spacenav/intern/ghost/intern/GHOST_WindowX11.h --- blender-2.44/intern/ghost/intern/GHOST_WindowX11.h 2006-08-03 20:54:39.000000000 +0200 +++ blender-2.44-spacenav/intern/ghost/intern/GHOST_WindowX11.h 2007-05-28 16:49:15.000000000 +0200 @@ -213,6 +213,28 @@ const GHOST_TabletData* GetTabletData() { return &m_xtablet.CommonData; } + + /* Space Navigator */ + class XSpaceNav + { + public: + GHOST_SpaceNavData CommonData; + struct timeval timestamp; + + XDevice* SpaceNavDevice; + + XID SpaceNavID; + + int MotionEvent; + }; + + XSpaceNav& GetXSpaceNav() + { return m_xspacenav; } + + const GHOST_SpaceNavData* GetSpaceNavData() + { return &m_xspacenav.CommonData; } + + protected: /** * Tries to install a rendering context in this window. @@ -328,6 +350,9 @@ /* Tablet devices */ XTablet m_xtablet; + + /* Space Navigator device */ + XSpaceNav m_xspacenav; }; Nur in blender-2.44-spacenav/obj: linux-glibc2.5-i386. Nur in blender-2.44-spacenav: .sconsign.dblite. diff -aur blender-2.44/source/blender/include/mydevice.h blender-2.44-spacenav/source/blender/include/mydevice.h --- blender-2.44/source/blender/include/mydevice.h 2007-04-12 18:51:51.000000000 +0200 +++ blender-2.44-spacenav/source/blender/include/mydevice.h 2007-05-26 01:00:48.000000000 +0200 @@ -49,6 +49,7 @@ #define MOUSEY 0x005 #define WHEELUPMOUSE 0x00a #define WHEELDOWNMOUSE 0x00b +#define SPACENAV 0x00c /* timers */ diff -aur blender-2.44/source/blender/src/editimasel.c blender-2.44-spacenav/source/blender/src/editimasel.c --- blender-2.44/source/blender/src/editimasel.c 2007-01-22 17:32:28.000000000 +0100 +++ blender-2.44-spacenav/source/blender/src/editimasel.c 2007-05-26 01:20:30.000000000 +0200 @@ -260,7 +260,7 @@ queredraw = 1; } break; - + case WHEELUPMOUSE: case WHEELDOWNMOUSE: switch(area_event){ diff -aur blender-2.44/source/blender/src/ghostwinlay.c blender-2.44-spacenav/source/blender/src/ghostwinlay.c --- blender-2.44/source/blender/src/ghostwinlay.c 2007-04-12 18:55:57.000000000 +0200 +++ blender-2.44-spacenav/source/blender/src/ghostwinlay.c 2007-05-28 11:05:17.000000000 +0200 @@ -96,11 +96,13 @@ * --Matt */ float pressure; /* tablet pressure - 0.0 (no pressure) to 1.0 (full pressure) */ - /* mouse clicks and non-contacting stylus buttons generate pressure of 0.0. */ + /* mouse clicks and non-contacting stylus buttons generate pressure of 0.0. */ float xtilt, ytilt; /* tablet tilt value - x and y components of 3D angle - * ranging from 0.0 (pen upright) to 1.0 (pen fully leaning over) */ + * ranging from 0.0 (pen upright) to 1.0 (pen fully leaning over) */ short activedevice; /* Active input device currently in use (DEV_MOUSE, DEV_STYLUS, DEV_ERASER) */ - + + float spacenav_values[6]; + int spacenav_count; /* Tracks the faked mouse button, if non-zero it is * the event number of the last faked button. @@ -511,6 +513,22 @@ } } +static void update_spacenav_data(Window *win, GHOST_WindowHandle ghostwin) { + const GHOST_SpaceNavData *snd = GHOST_GetSpaceNavData(ghostwin); + int i; + + /* if there is space navigator data from an active space navigator device then use it, + * otherwise set all space navigator rleated data to default */ + if (snd != NULL) { + for(i=0; i<6; i++) + win->spacenav_values[i] = snd->values[i]; + win->spacenav_count = snd->count; + } else { + for(i=0; i<6; i++) + win->spacenav_values[i] = 0.0; + } +} + static int event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr private) { @@ -554,6 +572,14 @@ } break; } + case GHOST_kEventSpaceMotion: { + if(win->active == 1) { + update_spacenav_data(win, ghostwin); + window_handle(win, SPACENAV, 1); + } + break; + + } case GHOST_kEventButtonDown: case GHOST_kEventButtonUp: { GHOST_TEventButtonData *bd= data; @@ -750,6 +776,15 @@ return win->activedevice; } +int window_get_spacenav_values(Window *win, float *snvals) { + int i; + + for(i=0; i<6; i++) + snvals[i]=win->spacenav_values[i]; + + return(win->spacenav_count); +} + void window_get_position(Window *win, int *posx_r, int *posy_r) { *posx_r= win->position[0]; *posy_r= win->position[1]; diff -aur blender-2.44/source/blender/src/space.c blender-2.44-spacenav/source/blender/src/space.c --- blender-2.44/source/blender/src/space.c 2007-05-09 16:41:37.000000000 +0200 +++ blender-2.44-spacenav/source/blender/src/space.c 2007-05-26 01:22:48.000000000 +0200 @@ -1193,7 +1193,7 @@ viewmove(0); } break; - + case WHEELUPMOUSE: /* Regular: Zoom in */ /* Shift: Scroll up */ @@ -1490,6 +1490,10 @@ switch(event) { + case SPACENAV: + viewmove(3); + break; + /* Afterqueue events */ case BACKBUFDRAW: backdrawview3d(1); diff -aur blender-2.44/source/blender/src/view.c blender-2.44-spacenav/source/blender/src/view.c --- blender-2.44/source/blender/src/view.c 2007-05-09 16:41:37.000000000 +0200 +++ blender-2.44-spacenav/source/blender/src/view.c 2007-05-28 16:47:57.000000000 +0200 @@ -89,6 +89,8 @@ #include "PIL_time.h" /* smoothview */ +#include "winlay.h" + #define TRACKBALLSIZE (1.1) #define BL_NEAR_CLIP 0.001 @@ -541,7 +543,14 @@ short mvalball[2], mval[2], mvalo[2]; short use_sel = 0; short preview3d_event= 1; - + float snval[6], snvalo[6]; + int snval_count=0, snval_counto=0; + double timeout, frametime, oneframe, oneframeo; + int i; + + winlay_process_events(0); + snval_count = window_get_spacenav_values(winlay_get_active_window(), snval); + /* 3D window may not be defined */ if( !G.vd ) { fprintf( stderr, "G.vd == NULL in viewmove()\n" ); @@ -560,7 +569,7 @@ mvalball[0]= mvalo[0]; /* needed for turntable to work */ mvalball[1]= mvalo[1]; dist0= G.vd->dist; - + calctrackballvec(&curarea->winrct, mvalo, firstvec); /* cumultime(0); */ @@ -587,16 +596,42 @@ else ofs[0] = ofs[1] = ofs[2] = 0.0f; + /* spacenav needs ofs & obofs no matter what */ + VECCOPY(ofs, G.vd->ofs); + if (ob) { + obofs[0] = -ob->obmat[3][0]; + obofs[1] = -ob->obmat[3][1]; + obofs[2] = -ob->obmat[3][2]; + } + else { + VECCOPY(obofs, ofs); + } + reverse= 1.0f; if (G.vd->persmat[2][1] < 0.0f) reverse= -1.0f; + timeout = PIL_check_seconds_timer()+0.02; + frametime = 0.01; + oneframeo = timeout - frametime; + while(TRUE) { + double cursec; getmouseco_sc(mval); - + + winlay_process_events(0); + snval_counto = snval_count; + for(i=0; i<6; i++) snvalo[i] = snval[i]; + snval_count = window_get_spacenav_values(winlay_get_active_window(), snval); + + if(mode==3) { + cursec = PIL_check_seconds_timer(); + if (cursec > timeout) break; + } + // if playanim = alt+A, screenhandlers are for animated UI, python, etc - if(mval[0]!=mvalo[0] || mval[1]!=mvalo[1] || (G.f & G_PLAYANIM) || do_screenhandlers(G.curscreen)) { - + if(mval[0]!=mvalo[0] || mval[1]!=mvalo[1] || (G.f & G_PLAYANIM) || do_screenhandlers(G.curscreen) + || snval[0]!=snvalo[0] || snval[1]!=snvalo[1] || snval[2]!=snvalo[2] || snval[3]!=snvalo[3] || snval[4]!=snvalo[4] || snval[5]!=snvalo[5]) { if(firsttime) { firsttime= 0; @@ -727,7 +762,7 @@ VecAddf(G.vd->ofs, G.vd->ofs, dvec); } } - else if(mode==2) { + else if(mode==2) { if(U.viewzoom==USER_ZOOM_CONT) { // oldstyle zoom G.vd->dist*= 1.0+(float)(mvalo[0]-mval[0]+mvalo[1]-mval[1])/1000.0; @@ -760,7 +795,147 @@ if(G.vd->persp==0 || G.vd->persp==2) preview3d_event= 0; } - + + else if(mode==3) { + /* spacenav in orthographic projection */ + if(G.vd->persp == 0) { + if ((snval[0]!=snvalo[0] || snval[1]!=snvalo[1])) { + float dx, dy; + dx = -25.0*(snval[0]-snvalo[0]); + dy = 25.0*(snval[1]-snvalo[1]); + window_to_3d(dvec, dx, dy); + VecAddf(G.vd->ofs, G.vd->ofs, dvec); + } + + if (snval[2] != snvalo[2]) { + G.vd->dist *= 1.0-0.05*(snval[2]-snvalo[2]); + if(G.vd->dist<0.001*G.vd->grid) G.vd->dist= 0.001*G.vd->grid; + if(G.vd->dist>10.0*G.vd->far) G.vd->dist=10.0*G.vd->far; + + preview3d_event= 0; + } + + if (snval[3] != snvalo[3] || snval[4] != snvalo[4]) { + float m[3][3]; + float m_inv[3][3]; + float xvec[3] = {1,0,0}; + const float sensitivity = 0.05; + + /* Get the 3x3 matrix and its inverse from the quaternion */ + QuatToMat3(G.vd->viewquat, m); + Mat3Inv(m_inv,m); + + /* Determine the direction of the x vector (for rotating up and down) */ + /* This can likely be compuated directly from the quaternion. */ + Mat3MulVecfl(m_inv,xvec); + + /* Perform the up/down rotation spin vertically half as fast as horizontally */ + phi = -sensitivity * 0.5 * (snval[3]-snvalo[3]); + si = sin(phi); + q1[0] = cos(phi); + q1[1] = si * xvec[0]; + q1[2] = si * xvec[1]; + q1[3] = si * xvec[2]; + QuatMul(G.vd->viewquat, G.vd->viewquat, q1); + + if (1 || use_sel) { + QuatConj(q1); /* conj == inv for unit quat */ + VecSubf(G.vd->ofs, G.vd->ofs, obofs); + QuatMulVecf(q1, G.vd->ofs); + VecAddf(G.vd->ofs, G.vd->ofs, obofs); + } + + /* Perform the orbital rotation twist the knob, y axis */ + phi = sensitivity * reverse * (snval[4]-snvalo[4]); + q1[0] = cos(phi); + q1[1] = q1[2] = 0.0; + q1[3] = sin(phi); + QuatMul(G.vd->viewquat, G.vd->viewquat, q1); + + if (1 || use_sel) { + QuatConj(q1); + VecSubf(G.vd->ofs, G.vd->ofs, obofs); + QuatMulVecf(q1, G.vd->ofs); + VecAddf(G.vd->ofs, G.vd->ofs, obofs); + } + } + + } + /* spacenav in perspective projection */ + else if(G.vd->persp == 1) { + if ((snval[0]!=snvalo[0] || snval[1] != snvalo[1] || snval[2]!=snvalo[2])) { + float dx, dy, dz; + dx = -25.0*(snval[0]-snvalo[0]) * G.vd->zfac/curarea->winx; + dy = 25.0*(snval[2]-snvalo[2]) * G.vd->zfac/curarea->winy; + dz = 1.0*(snval[1]-snvalo[1]) * G.vd->zfac/(curarea->winx/2+curarea->winy/2); + + dvec[0]= G.vd->persinv[0][0]*dx + G.vd->persinv[1][0]*dy + G.vd->persinv[2][0]*dz; + dvec[1]= G.vd->persinv[0][1]*dx + G.vd->persinv[1][1]*dy + G.vd->persinv[2][1]*dz; + dvec[2]= G.vd->persinv[0][2]*dx + G.vd->persinv[1][2]*dy + G.vd->persinv[2][2]*dz; + VecAddf(G.vd->ofs, G.vd->ofs, dvec); + } + + if (snval[3] != snvalo[3]) { + float m[3][3]; + float m_inv[3][3]; + float xvec[3] = {1,0,0}; + const float sensitivity = 0.05; + + QuatToMat3(G.vd->viewquat, m); + Mat3Inv(m_inv,m); + Mat3MulVecfl(m_inv,xvec); + + phi = -sensitivity * 0.5 * (snval[3]-snvalo[3]); + si = sin(phi); + q1[0] = cos(phi); + q1[1] = si * xvec[0]; + q1[2] = si * xvec[1]; + q1[3] = si * xvec[2]; + + QuatMul(G.vd->viewquat, G.vd->viewquat, q1); + QuatConj(q1); + VecSubf(G.vd->ofs, G.vd->ofs, obofs); + QuatMulVecf(q1, G.vd->ofs); + VecAddf(G.vd->ofs, G.vd->ofs, obofs); + } + + if (snval[5] != snvalo[5]) { + float m[3][3]; + float m_inv[3][3]; + float xvec[3] = {1,0,0}; + const float sensitivity = 0.05; + + /* Get the 3x3 matrix and its inverse from the quaternion */ + QuatToMat3(G.vd->viewquat, m); + Mat3Inv(m_inv,m); + + /* Determine the direction of the x vector (for rotating up and down) */ + /* This can likely be compuated directly from the quaternion. */ + Mat3MulVecfl(m_inv,xvec); + + + phi = sensitivity * reverse * (snval[5]-snvalo[5]); + q1[0] = cos(phi); + q1[1] = q1[2] = 0.0; + q1[3] = sin(phi); + QuatMul(G.vd->viewquat, G.vd->viewquat, q1); + + if (1 || use_sel) { + QuatConj(q1); + VecSubf(G.vd->ofs, G.vd->ofs, obofs); + QuatMulVecf(q1, G.vd->ofs); + VecAddf(G.vd->ofs, G.vd->ofs, obofs); + } + } + + if (snval[4] != snvalo[4]) { + /* FIXME */ + } + } + + timeout = PIL_check_seconds_timer() + 0.05; + } + mvalo[0]= mval[0]; mvalo[1]= mval[1]; @@ -784,9 +959,11 @@ BIF_wait_for_statechange(); } - + /* this in the end, otherwise get_mbut does not work on a PC... */ - if( !(get_mbut() & (L_MOUSE|M_MOUSE))) break; + if( mode != 3 && (!(get_mbut() & (L_MOUSE|M_MOUSE)))) + break; + } if(G.vd->depths) G.vd->depths->damaged= 1; diff -aur blender-2.44/source/blender/src/winlay.h blender-2.44-spacenav/source/blender/src/winlay.h --- blender-2.44/source/blender/src/winlay.h 2007-04-12 18:51:52.000000000 +0200 +++ blender-2.44-spacenav/source/blender/src/winlay.h 2007-05-25 22:54:58.000000000 +0200 @@ -62,6 +62,8 @@ void window_get_tilt(Window *win, float *xtilt, float *ytilt); short window_get_activedevice(Window *win); +void winlay_get_spacenav_values(Window *win, float *snvals); + void window_get_position (Window *win, int *posx_r, int *poxy_r); void window_get_size (Window *win, int *width_r, int *height_r); diff -aur blender-2.44/source/nan_definitions.mk blender-2.44-spacenav/source/nan_definitions.mk --- blender-2.44/source/nan_definitions.mk 2007-05-07 18:10:23.000000000 +0200 +++ blender-2.44-spacenav/source/nan_definitions.mk 2007-05-19 22:25:08.000000000 +0200 @@ -359,7 +359,7 @@ ifeq ($(CPU),ia64) export NAN_PYTHON_VERSION ?= 2.2 else - export NAN_PYTHON_VERSION ?= 2.3 + export NAN_PYTHON_VERSION ?= 2.5 endif export NAN_PYTHON_BINARY ?= $(NAN_PYTHON)/bin/python$(NAN_PYTHON_VERSION) export NAN_OPENAL ?= /usr Nur in blender-2.44-spacenav/tools: bcolors.pyc. Nur in blender-2.44-spacenav/tools: Blender.pyc. Nur in blender-2.44-spacenav/tools: btools.pyc. Nur in blender-2.44-spacenav/tools: __init__.pyc.