From 99c64e05a6a7cdd8b2e5bf88706165ebdb5101d1 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 6 Aug 2010 03:52:13 +0000 Subject: bugfix/functionality fix [#21752] 3D cursor vanished and does not come back Setting the 3d cursor in perspective mode would keep the cursor behind the viewport, now check if the cursor is begind the viewport and use the orbit location to set the cursor depth rather then the existing plane. --- source/blender/editors/include/ED_view3d.h | 2 +- source/blender/editors/space_view3d/view3d_edit.c | 13 +++++++++++-- source/blender/editors/space_view3d/view3d_view.c | 10 +++++++--- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/source/blender/editors/include/ED_view3d.h b/source/blender/editors/include/ED_view3d.h index bb4a7543d90..1da51af5e28 100644 --- a/source/blender/editors/include/ED_view3d.h +++ b/source/blender/editors/include/ED_view3d.h @@ -72,7 +72,7 @@ typedef struct ViewDepths { float *give_cursor(struct Scene *scene, struct View3D *v3d); -void initgrabz(struct RegionView3D *rv3d, float x, float y, float z); +int initgrabz(struct RegionView3D *rv3d, float x, float y, float z); void window_to_3d(struct ARegion *ar, float *vec, short mx, short my); void window_to_3d_delta(struct ARegion *ar, float *vec, short mx, short my); void view3d_unproject(struct bglMats *mats, float out[3], const short x, const short y, const float z); diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c index 2e26988877f..e71899e40f7 100644 --- a/source/blender/editors/space_view3d/view3d_edit.c +++ b/source/blender/editors/space_view3d/view3d_edit.c @@ -2396,7 +2396,7 @@ static int set_3dcursor_invoke(bContext *C, wmOperator *op, wmEvent *event) float dx, dy, fz, *fp = NULL, dvec[3], oldcurs[3]; short mx, my, mval[2]; // short ctrl= 0; // XXX - + int flip; fp= give_cursor(scene, v3d); // if(obedit && ctrl) lr_click= 1; @@ -2404,9 +2404,18 @@ static int set_3dcursor_invoke(bContext *C, wmOperator *op, wmEvent *event) mx= event->x - ar->winrct.xmin; my= event->y - ar->winrct.ymin; + project_short_noclip(ar, fp, mval); + flip= initgrabz(rv3d, fp[0], fp[1], fp[2]); + + /* reset the depth based on the view offset */ + if(flip) { + negate_v3_v3(fp, rv3d->ofs); - initgrabz(rv3d, fp[0], fp[1], fp[2]); + /* re initialize */ + project_short_noclip(ar, fp, mval); + flip= initgrabz(rv3d, fp[0], fp[1], fp[2]); + } if(mval[0]!=IS_CLIPPED) { short depth_used = 0; diff --git a/source/blender/editors/space_view3d/view3d_view.c b/source/blender/editors/space_view3d/view3d_view.c index b681f15433c..b2bc071122f 100644 --- a/source/blender/editors/space_view3d/view3d_view.c +++ b/source/blender/editors/space_view3d/view3d_view.c @@ -588,11 +588,13 @@ void viewvector(RegionView3D *rv3d, float coord[3], float vec[3]) normalize_v3(vec); } -void initgrabz(RegionView3D *rv3d, float x, float y, float z) +int initgrabz(RegionView3D *rv3d, float x, float y, float z) { - if(rv3d==NULL) return; + int flip= FALSE; + if(rv3d==NULL) return flip; rv3d->zfac= rv3d->persmat[0][3]*x+ rv3d->persmat[1][3]*y+ rv3d->persmat[2][3]*z+ rv3d->persmat[3][3]; - + if (rv3d->zfac < 0.0f) + flip= TRUE; /* if x,y,z is exactly the viewport offset, zfac is 0 and we don't want that * (accounting for near zero values) * */ @@ -605,6 +607,8 @@ void initgrabz(RegionView3D *rv3d, float x, float y, float z) // -- Aligorith, 2009Aug31 //if (rv3d->zfac < 0.0f) rv3d->zfac = 1.0f; if (rv3d->zfac < 0.0f) rv3d->zfac= -rv3d->zfac; + + return flip; } /* always call initgrabz */ -- cgit v1.2.3