diff options
Diffstat (limited to 'source/blender/editors/space_view3d/view3d_cursor_snap.c')
-rw-r--r-- | source/blender/editors/space_view3d/view3d_cursor_snap.c | 73 |
1 files changed, 44 insertions, 29 deletions
diff --git a/source/blender/editors/space_view3d/view3d_cursor_snap.c b/source/blender/editors/space_view3d/view3d_cursor_snap.c index 96a193cc10d..4a1bd6ba945 100644 --- a/source/blender/editors/space_view3d/view3d_cursor_snap.c +++ b/source/blender/editors/space_view3d/view3d_cursor_snap.c @@ -8,11 +8,9 @@ */ #include "DNA_object_types.h" -#include "DNA_scene_types.h" #include "BLI_listbase.h" #include "BLI_rect.h" -#include "DNA_scene_types.h" #include "MEM_guardedalloc.h" @@ -54,7 +52,7 @@ typedef struct SnapCursorDataIntern { struct SnapObjectContext *snap_context_v3d; const Scene *scene; - short snap_elem_hidden; + eSnapMode snap_elem_hidden; float prevpoint_stack[3]; @@ -374,7 +372,7 @@ void ED_view3d_cursor_snap_draw_util(RegionView3D *rv3d, const float normal[3], const uchar color_line[4], const uchar color_point[4], - const short snap_elem_type) + const eSnapMode snap_elem_type) { if (!loc_prev && !loc_curr) { return; @@ -539,9 +537,9 @@ static bool v3d_cursor_is_snap_invert(SnapCursorDataIntern *data_intern, const w /** \name Update * \{ */ -static short v3d_cursor_snap_elements(V3DSnapCursorState *snap_state, Scene *scene) +static eSnapMode v3d_cursor_snap_elements(V3DSnapCursorState *snap_state, Scene *scene) { - short snap_elements = snap_state->snap_elem_force; + eSnapMode snap_elements = snap_state->snap_elem_force; if (!snap_elements) { return scene->toolsettings->snap_mode; } @@ -587,7 +585,7 @@ static void v3d_cursor_snap_update(V3DSnapCursorState *state, v3d_cursor_snap_context_ensure(scene); float co[3], no[3], face_nor[3], obmat[4][4], omat[3][3]; - short snap_elem = 0; + eSnapMode snap_elem = SCE_SNAP_MODE_NONE; int snap_elem_index[3] = {-1, -1, -1}; int index = -1; @@ -596,12 +594,12 @@ static void v3d_cursor_snap_update(V3DSnapCursorState *state, zero_v3(face_nor); unit_m3(omat); - ushort snap_elements = v3d_cursor_snap_elements(state, scene); - data_intern->snap_elem_hidden = 0; + eSnapMode snap_elements = v3d_cursor_snap_elements(state, scene); + data_intern->snap_elem_hidden = SCE_SNAP_MODE_NONE; const bool calc_plane_omat = v3d_cursor_snap_calc_plane(); - if (calc_plane_omat && !(snap_elements & SCE_SNAP_MODE_FACE)) { - data_intern->snap_elem_hidden = SCE_SNAP_MODE_FACE; - snap_elements |= SCE_SNAP_MODE_FACE; + if (calc_plane_omat && !(snap_elements & SCE_SNAP_MODE_FACE_RAYCAST)) { + data_intern->snap_elem_hidden = SCE_SNAP_MODE_FACE_RAYCAST; + snap_elements |= SCE_SNAP_MODE_FACE_RAYCAST; } snap_data->is_enabled = true; @@ -613,16 +611,15 @@ static void v3d_cursor_snap_update(V3DSnapCursorState *state, if (snap_data->is_snap_invert != !(ts->snap_flag & SCE_SNAP)) { snap_data->is_enabled = false; if (!calc_plane_omat) { - snap_data->snap_elem = 0; + snap_data->snap_elem = SCE_SNAP_MODE_NONE; return; } - snap_elements = data_intern->snap_elem_hidden = SCE_SNAP_MODE_FACE; + snap_elements = data_intern->snap_elem_hidden = SCE_SNAP_MODE_FACE_RAYCAST; } } #endif - if (snap_elements & (SCE_SNAP_MODE_VERTEX | SCE_SNAP_MODE_EDGE | SCE_SNAP_MODE_FACE | - SCE_SNAP_MODE_EDGE_MIDPOINT | SCE_SNAP_MODE_EDGE_PERPENDICULAR)) { + if (snap_elements & SCE_SNAP_MODE_GEOM) { float prev_co[3] = {0.0f}; if (state->prevpoint) { copy_v3_v3(prev_co, state->prevpoint); @@ -648,10 +645,11 @@ static void v3d_cursor_snap_update(V3DSnapCursorState *state, v3d, snap_elements, &(const struct SnapObjectParams){ - .snap_select = SNAP_ALL, + .snap_target_select = SCE_SNAP_TARGET_ALL, .edit_mode_type = edit_mode_type, .use_occlusion_test = use_occlusion_test, }, + NULL, mval_fl, prev_co, &dist_px, @@ -663,13 +661,10 @@ static void v3d_cursor_snap_update(V3DSnapCursorState *state, face_nor); } - if (is_zero_v3(face_nor)) { - face_nor[state->plane_axis] = 1.0f; - } - if (calc_plane_omat) { RegionView3D *rv3d = region->regiondata; - bool orient_surface = snap_elem && (state->plane_orient == V3D_PLACE_ORIENT_SURFACE); + bool orient_surface = (snap_elem != SCE_SNAP_MODE_NONE) && + (state->plane_orient == V3D_PLACE_ORIENT_SURFACE); if (orient_surface) { copy_m3_m4(omat, obmat); } @@ -693,16 +688,36 @@ static void v3d_cursor_snap_update(V3DSnapCursorState *state, orthogonalize_m3(omat, state->plane_axis); if (orient_surface) { - if (dot_v3v3(rv3d->viewinv[2], face_nor) < 0.0f) { - negate_v3(face_nor); + if (!is_zero_v3(face_nor)) { + /* Negate the face normal according to the view. */ + float ray_dir[3]; + if (rv3d->is_persp) { + BLI_assert_msg(snap_elem != SCE_SNAP_MODE_NONE, + "Use of variable `co` without it being computed"); + + sub_v3_v3v3(ray_dir, co, rv3d->viewinv[3]); /* No need to normalize. */ + } + else { + negate_v3_v3(ray_dir, rv3d->viewinv[2]); + } + + if (dot_v3v3(ray_dir, face_nor) >= 0.0f) { + negate_v3(face_nor); + } + } + else if (!is_zero_v3(no)) { + copy_v3_v3(face_nor, no); + } + else { + face_nor[state->plane_axis] = 1.0f; } v3d_cursor_poject_surface_normal(face_nor, obmat, omat); } } - float *co_depth = snap_elem ? co : scene->cursor.location; + float *co_depth = (snap_elem != SCE_SNAP_MODE_NONE) ? co : scene->cursor.location; snap_elem &= ~data_intern->snap_elem_hidden; - if (snap_elem == 0) { + if (snap_elem == SCE_SNAP_MODE_NONE) { RegionView3D *rv3d = region->regiondata; const float *plane_normal = omat[state->plane_axis]; bool do_plane_isect = (state->plane_depth != V3D_PLACE_DEPTH_CURSOR_VIEW) && @@ -730,7 +745,7 @@ static void v3d_cursor_snap_update(V3DSnapCursorState *state, (SCE_SNAP_MODE_EDGE | SCE_SNAP_MODE_EDGE_MIDPOINT | SCE_SNAP_MODE_EDGE_PERPENDICULAR)) { snap_elem_index[1] = index; } - else if (snap_elem == SCE_SNAP_MODE_FACE) { + else if (snap_elem == SCE_SNAP_MODE_FACE_RAYCAST) { snap_elem_index[2] = index; } @@ -816,7 +831,7 @@ static void v3d_cursor_snap_draw_fn(bContext *C, int x, int y, void *UNUSED(cust } const bool draw_plane = state->draw_plane || state->draw_box; - if (!snap_data->snap_elem && !draw_plane) { + if (snap_data->snap_elem == SCE_SNAP_MODE_NONE && !draw_plane) { return; } @@ -834,7 +849,7 @@ static void v3d_cursor_snap_draw_fn(bContext *C, int x, int y, void *UNUSED(cust v3d_cursor_plane_draw(rv3d, state->plane_axis, matrix); } - if (snap_data->snap_elem && (state->draw_point || state->draw_box)) { + if (snap_data->snap_elem != SCE_SNAP_MODE_NONE && (state->draw_point || state->draw_box)) { const float *prev_point = (snap_data->snap_elem & SCE_SNAP_MODE_EDGE_PERPENDICULAR) ? state->prevpoint : NULL; |