diff options
-rw-r--r-- | intern/ghost/GHOST_Types.h | 3 | ||||
-rw-r--r-- | intern/ghost/intern/GHOST_SystemCarbon.cpp | 17 | ||||
-rwxr-xr-x | intern/ghost/intern/GHOST_SystemX11.cpp | 32 | ||||
-rw-r--r-- | source/blender/include/BSE_view.h | 1 | ||||
-rw-r--r-- | source/blender/include/mydevice.h | 1 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_view3d_types.h | 3 | ||||
-rw-r--r-- | source/blender/src/ghostwinlay.c | 8 | ||||
-rw-r--r-- | source/blender/src/header_view3d.c | 23 | ||||
-rw-r--r-- | source/blender/src/space.c | 24 | ||||
-rwxr-xr-x | source/blender/src/transform.c | 12 | ||||
-rw-r--r-- | source/blender/src/view.c | 83 |
11 files changed, 147 insertions, 60 deletions
diff --git a/intern/ghost/GHOST_Types.h b/intern/ghost/GHOST_Types.h index 0de4c162ab8..379b3323f53 100644 --- a/intern/ghost/GHOST_Types.h +++ b/intern/ghost/GHOST_Types.h @@ -137,7 +137,8 @@ typedef enum { GHOST_kEventButtonUp, /// Mouse button event GHOST_kEventWheel, /// Mouse wheel event - GHOST_kEventNDOFMotion, /// N degree of freedom device motion event + GHOST_kEventNDOFMotion, /// N degree of freedom device motion event + GHOST_kEventNDOFButton, /// N degree of freedom device button event GHOST_kEventKeyDown, GHOST_kEventKeyUp, diff --git a/intern/ghost/intern/GHOST_SystemCarbon.cpp b/intern/ghost/intern/GHOST_SystemCarbon.cpp index 056addddeb1..756de42f227 100644 --- a/intern/ghost/intern/GHOST_SystemCarbon.cpp +++ b/intern/ghost/intern/GHOST_SystemCarbon.cpp @@ -984,7 +984,7 @@ bool GHOST_SystemCarbon::handleMouseDown(EventRef event) GHOST_ASSERT(ghostWindow, "GHOST_SystemCarbon::handleMouseEvent: ghostWindow==0"); if (::TrackGoAway(window, mousePos)) { - // todo: add option-close, because itØs in the HIG + // todo: add option-close, because itÿs in the HIG // if (event.modifiers & optionKey) { // Close the clean documents, others will be confirmed one by one. //} @@ -1069,6 +1069,7 @@ OSStatus GHOST_SystemCarbon::sEventHandlerProc(EventHandlerCallRef handler, Even OSStatus err = eventNotHandledErr; GHOST_IWindow* window; GHOST_TEventNDOFData data; + UInt32 kind; switch (::GetEventClass(event)) { @@ -1090,7 +1091,19 @@ OSStatus GHOST_SystemCarbon::sEventHandlerProc(EventHandlerCallRef handler, Even case kEventClassBlender : window = sys->m_windowManager->getActiveWindow(); sys->m_ndofManager->GHOST_NDOFGetDatas(data); - sys->m_eventManager->pushEvent(new GHOST_EventNDOF(sys->getMilliSeconds(), GHOST_kEventNDOFMotion, window, data)); + kind = ::GetEventKind(event); + + switch (kind) + { + case 1: + sys->m_eventManager->pushEvent(new GHOST_EventNDOF(sys->getMilliSeconds(), GHOST_kEventNDOFMotion, window, data)); + // printf("motion\n"); + break; + case 2: + sys->m_eventManager->pushEvent(new GHOST_EventNDOF(sys->getMilliSeconds(), GHOST_kEventNDOFButton, window, data)); +// printf("button\n"); + break; + } err = noErr; break; default : diff --git a/intern/ghost/intern/GHOST_SystemX11.cpp b/intern/ghost/intern/GHOST_SystemX11.cpp index e3d4ee405e8..f3891995f54 100755 --- a/intern/ghost/intern/GHOST_SystemX11.cpp +++ b/intern/ghost/intern/GHOST_SystemX11.cpp @@ -462,25 +462,21 @@ GHOST_SystemX11::processEvent(XEvent *xe) } else #endif if (sNdofInfo.currValues) { - sNdofInfo.currValues->changed = 1; - sNdofInfo.currValues->delta = xcme.data.s[8] - sNdofInfo.currValues->time; - sNdofInfo.currValues->time = xcme.data.s[8]; - sNdofInfo.currValues->tx = xcme.data.s[2] >> 4; - sNdofInfo.currValues->ty = xcme.data.s[3] >> 4; - sNdofInfo.currValues->tz = xcme.data.s[4] >> 4; - sNdofInfo.currValues->rx = xcme.data.s[5]; - sNdofInfo.currValues->ry = xcme.data.s[6]; - sNdofInfo.currValues->rz = xcme.data.s[7]; - - /*fprintf(stderr, "ClientMessage: [%d %d %d][%d %d %d] t=%llu\n", - sNdofInfo.currValues->tx, sNdofInfo.currValues->ty, - sNdofInfo.currValues->tz, sNdofInfo.currValues->rx, - sNdofInfo.currValues->ry, sNdofInfo.currValues->rz, - sNdofInfo.currValues->time); */ + GHOST_TEventNDOFData data; + data.changed = 1; + data.delta = xcme.data.s[8] - data.time; + data.time = xcme.data.s[8]; + data.tx = xcme.data.s[2] >> 4; + data.ty = xcme.data.s[3] >> 4; + data.tz = xcme.data.s[4] >> 4; + data.rx = xcme.data.s[5]; + data.ry = xcme.data.s[6]; + data.rz = xcme.data.s[7]; + + g_event = new GHOST_EventNDOF(getMilliSeconds(), + GHOST_kEventNDOFMotion, + window, data); - g_event = new GHOST_EventNDOF(getMilliSeconds(), - GHOST_kEventNDOFMotion, - window, *sNdofInfo.currValues); } else { /* Unknown client message, ignore */ } diff --git a/source/blender/include/BSE_view.h b/source/blender/include/BSE_view.h index d625cbab595..94834d2c771 100644 --- a/source/blender/include/BSE_view.h +++ b/source/blender/include/BSE_view.h @@ -76,6 +76,7 @@ void sdrawbox(short x1, short y1, short x2, short y2); void calctrackballvecfirst(struct rcti *area, short *mval, float *vec); void calctrackballvec(struct rcti *area, short *mval, float *vec); void viewmove(int mode); +void viewmoveNDOFfly(int mode); void viewmoveNDOF(int mode); int get_view3d_viewplane(int winxi, int winyi, rctf *viewplane, float *clipsta, float *clipend, float *pixsize); diff --git a/source/blender/include/mydevice.h b/source/blender/include/mydevice.h index af20c093a16..9a8d154e030 100644 --- a/source/blender/include/mydevice.h +++ b/source/blender/include/mydevice.h @@ -72,6 +72,7 @@ /* N-degre of freedom device : 500 */ #define NDOFMOTION 500 +#define NDOFBUTTON 501 /* standard keyboard */ diff --git a/source/blender/makesdna/DNA_view3d_types.h b/source/blender/makesdna/DNA_view3d_types.h index 27cd20c3210..8734e504cf4 100644 --- a/source/blender/makesdna/DNA_view3d_types.h +++ b/source/blender/makesdna/DNA_view3d_types.h @@ -139,7 +139,8 @@ typedef struct View3D { short snap_target; - short pad2; + char ndofmode; /* mode of transform for 6DOF devices 0 normal, 1 fly, 2 ob transform */ + char ndoffilter; /*filter for 6DOF devices 0 normal, 1 dominant */ void *properties_storage; /* Nkey panel stores stuff here, not in file */ diff --git a/source/blender/src/ghostwinlay.c b/source/blender/src/ghostwinlay.c index f960356d7b5..907d0320b57 100644 --- a/source/blender/src/ghostwinlay.c +++ b/source/blender/src/ghostwinlay.c @@ -586,7 +586,13 @@ static int event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr private) ; break; } - + case GHOST_kEventNDOFButton: { + GHOST_TEventNDOFData *sb= data; + +// printf("this is a button %i\n", sb->buttons); + window_handle(win, NDOFBUTTON, sb->buttons); + break; + } case GHOST_kEventCursorMove: { if(win->active == 1) { GHOST_TEventCursorData *cd= data; diff --git a/source/blender/src/header_view3d.c b/source/blender/src/header_view3d.c index 0178ae25e89..5688b514a95 100644 --- a/source/blender/src/header_view3d.c +++ b/source/blender/src/header_view3d.c @@ -5258,7 +5258,28 @@ void view3d_buttons(void) } uiDefIconBut(block, BUT, B_VIEWRENDER, ICON_SCENE_DEHLT, xco,0,XIC,YIC, NULL, 0, 1.0, 0, 0, "Render this window (hold CTRL for anim)"); - + + { + char tempstring[256]; + switch (G.vd->ndofmode) { + case 0: + sprintf(tempstring,"6dof : %s %s", "turntable",((G.vd->ndoffilter==1) ? "dominant" : "")); + break; + case 1: + sprintf(tempstring,"6dof : %s %s", "fly",((G.vd->ndoffilter==1) ? "dominant" : "")); + break; + case 2: + sprintf(tempstring,"6dof : %s %s", "transform",((G.vd->ndoffilter==1) ? "dominant" : "")); + break; + default: + tempstring[0]=0; + break; + } + uiDefBut(block, LABEL,0,tempstring, + xco+=XIC*2,0,150,YIC, 0, 1.0, 0, 0, 0, + ""); + + } if (ob && (ob->flag & OB_POSEMODE)) { xco+= XIC/2; uiBlockBeginAlign(block); diff --git a/source/blender/src/space.c b/source/blender/src/space.c index c09f2e79243..cc3109cb57a 100644 --- a/source/blender/src/space.c +++ b/source/blender/src/space.c @@ -1567,10 +1567,29 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt) doredraw= 1; break; - case NDOFMOTION: - viewmoveNDOF(1); + case NDOFMOTION: + if (G.vd->ndofmode == 0) { + viewmoveNDOF(1); + } else if (G.vd->ndofmode == 1) { + viewmoveNDOFfly(1); + } else { + ; + } + break; + case NDOFBUTTON: + if (val == 1) { + G.vd->ndofmode +=1; + if (G.vd->ndofmode > 2) /* we have currently 3 modes : 0 original, 1 fly, 2 transform */ + G.vd->ndofmode = 0; + } + if (val == 2) { + G.vd->ndoffilter =(G.vd->ndoffilter == 1 ? 0 : 1); + } + allqueue(REDRAWHEADERS, 0); + break; + case ONEKEY: if(G.qual==LR_CTRLKEY) { flip_subdivison(1); @@ -2584,6 +2603,7 @@ static void initview3d(ScrArea *sa) vd->gridflag &= ~V3D_SHOW_Z; vd->depths= NULL; + vd->ndofmode=0; } diff --git a/source/blender/src/transform.c b/source/blender/src/transform.c index e2819cc3693..9e6c1b68937 100755 --- a/source/blender/src/transform.c +++ b/source/blender/src/transform.c @@ -726,9 +726,9 @@ static void transformEvent(unsigned short event, short val) { else view_editmove(event); Trans.redraw= 1; break; - case NDOFMOTION: - viewmoveNDOF(0); - break; +// case NDOFMOTION: +// viewmoveNDOF(1); + // break; } Trans.redraw |= handleNumInput(&(Trans.num), event); Trans.redraw |= handleSnapping(&Trans, event); @@ -1075,9 +1075,9 @@ void ManipulatorTransform() case RETKEY: Trans.state = TRANS_CONFIRM; break; - case NDOFMOTION: - viewmoveNDOF(0); - break; + // case NDOFMOTION: + // viewmoveNDOF(1); + // break; } if(val) { switch(event) { diff --git a/source/blender/src/view.c b/source/blender/src/view.c index c84addcf0ff..06782b1a873 100644 --- a/source/blender/src/view.c +++ b/source/blender/src/view.c @@ -545,13 +545,24 @@ void calctrackballvec(rcti *area, short *mval, float *vec) // can be increased for improved response from // small deflections of the device input. + +// lukep notes : i disagree on the range. +// the normal 3Dconnection driver give +/-400 +// on defaut range in other applications +// and up to +/- 1000 if set to maximum +// because i remove the scaling by delta, +// which was a bad idea as it depend of the system +// speed and os, i changed the scaling values, but +// those are still not ok + + float ndof_axis_scale[6] = { - +2.0, // Tx - +2.0, // Tz - +2.0, // Ty - +0.25, // Rx - +0.25, // Rz - +0.25 // Ry + +0.01, // Tx + +0.01, // Tz + +0.01, // Ty + +0.0015, // Rx + +0.0015, // Rz + +0.0015 // Ry }; // statics for controlling G.vd->dist corrections. @@ -563,10 +574,20 @@ float m_dist; void getndof(float *sbval); -#define USE_NEW_NDOFMOVE +static filterNDOFvalues(float *sbval) +{ + int i=0; + float max = 0.0; + + for (i =0; i<5;i++) + if (fabs(sbval[i]) > max) + max = fabs(sbval[i]); + for (i =0; i<5;i++) + if (fabs(sbval[i]) != max ) + sbval[i]=0.0; +} -#ifdef USE_NEW_NDOFMOVE -void viewmoveNDOF(int mode) +void viewmoveNDOFfly(int mode) { int i; float phi; @@ -589,16 +610,18 @@ void viewmoveNDOF(int mode) // fetch the current state of the ndof device getndof(dval); - for(i=0;i<7;i++) printf("%f ",dval[i]); - printf("\n"); + if (G.vd->ndoffilter) + filterNDOFvalues(fval); + +// for(i=0;i<7;i++) printf("%f ",dval[i]); +// printf("\n"); // Scale input values - if(dval[6] == 0) return; // guard against divide by zero +// if(dval[6] == 0) return; // guard against divide by zero for(i=0;i<6;i++) { - dval[i] = dval[i] / dval[6]; // this should be moved to device specific // user scaling dval[i] = dval[i] * ndof_axis_scale[i]; @@ -695,7 +718,6 @@ void viewmoveNDOF(int mode) /*---------------------------------------------------- * refresh the screen */ - scrarea_do_windraw(curarea); screen_swapbuffers(); @@ -704,8 +726,6 @@ void viewmoveNDOF(int mode) BIF_view3d_previewrender_signal(curarea, PR_DBASE|PR_DISPRECT); } -#endif - void viewmove(int mode) { Object *ob = OBACT; @@ -994,10 +1014,6 @@ void viewmove(int mode) } - -#ifndef USE_NEW_NDOFMOVE - - void viewmoveNDOF(int mode) { static double prevTime = 0.0; @@ -1057,19 +1073,31 @@ void viewmoveNDOF(int mode) /* fetch the current state of the ndof device */ getndof(fval); - // printf(" motion command %f %f %f %f %f %f %f \n", fval[0], fval[1], fval[2], - // fval[3], fval[4], fval[5], fval[6]); - + // printf(" motion command %f %f %f %f %f %f %f \n", fval[0], fval[1], fval[2], + // fval[3], fval[4], fval[5], fval[6]); + if (G.vd->ndoffilter) + filterNDOFvalues(fval); + // put scaling back here, was previously in ghostwinlay fval[0] = fval[0] * (1.0f/1024.0f); fval[1] = fval[1] * (1.0f/1024.0f); fval[2] = fval[2] * (1.0f/1024.0f); - fval[3] = fval[3] * 0.00003f; - fval[4] = fval[4] * 0.00003f; - fval[5] = fval[5] * 0.00003f; + fval[3] = fval[3] * 0.00005f; + fval[4] = fval[4] * 0.00005f; + fval[5] = fval[5] * 0.00005f; fval[6] = fval[6] / 1000000.0f; - + + // scale more if not in perspective mode + if (G.vd->persp == 0) { + fval[0] = fval[0] * 0.05f; + fval[1] = fval[1] * 0.05f; + fval[2] = fval[2] * 0.05f; + fval[3] = fval[3] * 0.9f; + fval[4] = fval[4] * 0.9f; + fval[5] = fval[5] * 0.9f; + } + /* set object offset */ if (ob) { @@ -1169,7 +1197,6 @@ void viewmoveNDOF(int mode) screen_swapbuffers(); } -#endif /* Gets the lens and clipping values from a camera of lamp type object */ |