diff options
author | Campbell Barton <ideasman42@gmail.com> | 2018-05-08 15:18:09 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2018-05-08 16:35:04 +0300 |
commit | a48186c5d74b3d353c5c65cd4a930dd98cc9a603 (patch) | |
tree | c49fd2af2aaac151c5fd1265e414392617043253 /source/blender/editors/space_view3d/view3d_edit.c | |
parent | 53a56b7b6c169b21df475ae94795208501581489 (diff) |
Orientation for 3D cursor
Currently set when setting the cursor location,
optionally used as an orientation type.
Intended for use by tools too.
See: D3208
Diffstat (limited to 'source/blender/editors/space_view3d/view3d_edit.c')
-rw-r--r-- | source/blender/editors/space_view3d/view3d_edit.c | 77 |
1 files changed, 64 insertions, 13 deletions
diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c index 7e05a80781c..95e688dcc08 100644 --- a/source/blender/editors/space_view3d/view3d_edit.c +++ b/source/blender/editors/space_view3d/view3d_edit.c @@ -78,6 +78,7 @@ #include "ED_mesh.h" #include "ED_gpencil.h" #include "ED_view3d.h" +#include "ED_transform_snap_object_context.h" #include "UI_resources.h" @@ -2706,7 +2707,6 @@ static int view3d_all_exec(bContext *C, wmOperator *op) Scene *scene = CTX_data_scene(C); ViewLayer *view_layer = CTX_data_view_layer(C); Base *base; - float *curs; const bool use_all_regions = RNA_boolean_get(op->ptr, "use_all_regions"); const bool skip_camera = (ED_view3d_camera_lock_check(v3d, ar->regiondata) || /* any one of the regions may be locked */ @@ -2719,10 +2719,11 @@ static int view3d_all_exec(bContext *C, wmOperator *op) if (center) { /* in 2.4x this also move the cursor to (0, 0, 0) (with shift+c). */ - curs = ED_view3d_cursor3d_get(scene, v3d); + View3DCursor *cursor = ED_view3d_cursor3d_get(scene, v3d); zero_v3(min); zero_v3(max); - zero_v3(curs); + zero_v3(cursor->location); + unit_qt(cursor->rotation); } else { INIT_MINMAX(min, max); @@ -3038,7 +3039,7 @@ static int viewcenter_cursor_exec(bContext *C, wmOperator *op) /* non camera center */ float new_ofs[3]; - negate_v3_v3(new_ofs, ED_view3d_cursor3d_get(scene, v3d)); + negate_v3_v3(new_ofs, ED_view3d_cursor3d_get(scene, v3d)->location); ED_view3d_smooth_view( C, v3d, ar, smooth_viewtx, &(const V3D_SmoothParams) {.ofs = new_ofs}); @@ -4572,25 +4573,75 @@ void ED_view3d_cursor3d_update(bContext *C, const int mval[2]) { Scene *scene = CTX_data_scene(C); View3D *v3d = CTX_wm_view3d(C); + ARegion *ar = CTX_wm_region(C); + RegionView3D *rv3d = ar->regiondata; - float *fp_curr = ED_view3d_cursor3d_get(scene, v3d); - float fp_prev[3]; + View3DCursor *cursor_curr = ED_view3d_cursor3d_get(scene, v3d); + View3DCursor cursor_prev = *cursor_curr; - copy_v3_v3(fp_prev, fp_curr); + ED_view3d_cursor3d_position(C, cursor_curr->location, mval); + copy_qt_qt(cursor_curr->rotation, rv3d->viewquat); + cursor_curr->rotation[0] *= -1.0f; + + { + struct Main *bmain = CTX_data_main(C); + const float mval_fl[2] = {UNPACK2(mval)}; + float ray_no[3]; + + struct SnapObjectContext *snap_context = ED_transform_snap_object_context_create_view3d( + bmain, scene, CTX_data_depsgraph(C), 0, ar, v3d); + + float obmat[4][4]; + Object *ob_dummy = NULL; + float dist_px = 0; + if (ED_transform_snap_object_project_view3d_ex( + snap_context, + SCE_SNAP_MODE_FACE, + &(const struct SnapObjectParams){ + .snap_select = SNAP_ALL, + .use_object_edit_cage = false, + }, + mval_fl, &dist_px, NULL, + cursor_curr->location, ray_no, NULL, + &ob_dummy, obmat)) + { + float tquat[4]; + /* Math normal (Z). */ + { + float z_src[3] = {0, 0, 1}; + mul_qt_v3(cursor_curr->rotation, z_src); + rotation_between_vecs_to_quat(tquat, z_src, ray_no); + mul_qt_qtqt(cursor_curr->rotation, tquat, cursor_curr->rotation); + } - ED_view3d_cursor3d_position(C, fp_curr, mval); + /* Match object matrix (X). */ + { + const float ortho_axis_dot[3] = { + dot_v3v3(ray_no, obmat[0]), + dot_v3v3(ray_no, obmat[1]), + dot_v3v3(ray_no, obmat[2]), + }; + const int ortho_axis = axis_dominant_v3_ortho_single(ortho_axis_dot); + float x_src[3] = {1, 0, 0}; + float x_dst[3]; + mul_qt_v3(cursor_curr->rotation, x_src); + project_plane_v3_v3v3(x_dst, obmat[ortho_axis], ray_no); + normalize_v3(x_dst); + rotation_between_vecs_to_quat(tquat, x_src, x_dst); + mul_qt_qtqt(cursor_curr->rotation, tquat, cursor_curr->rotation); + } + } + ED_transform_snap_object_context_destroy(snap_context); + } /* offset the cursor lock to avoid jumping to new offset */ if (v3d->ob_centre_cursor) { - ARegion *ar = CTX_wm_region(C); - RegionView3D *rv3d = ar->regiondata; - if (U.uiflag & USER_LOCK_CURSOR_ADJUST) { float co_curr[2], co_prev[2]; - if ((ED_view3d_project_float_global(ar, fp_prev, co_prev, V3D_PROJ_TEST_NOP) == V3D_PROJ_RET_OK) && - (ED_view3d_project_float_global(ar, fp_curr, co_curr, V3D_PROJ_TEST_NOP) == V3D_PROJ_RET_OK)) + if ((ED_view3d_project_float_global(ar, cursor_prev.location, co_prev, V3D_PROJ_TEST_NOP) == V3D_PROJ_RET_OK) && + (ED_view3d_project_float_global(ar, cursor_curr->location, co_curr, V3D_PROJ_TEST_NOP) == V3D_PROJ_RET_OK)) { rv3d->ofs_lock[0] += (co_curr[0] - co_prev[0]) / (ar->winx * 0.5f); rv3d->ofs_lock[1] += (co_curr[1] - co_prev[1]) / (ar->winy * 0.5f); |