diff options
author | Germano Cavalcante <germano.costa@ig.com.br> | 2021-10-12 23:05:56 +0300 |
---|---|---|
committer | Germano Cavalcante <germano.costa@ig.com.br> | 2021-10-13 23:43:29 +0300 |
commit | 91c33c8b99520b6b094265a826cd391929a81716 (patch) | |
tree | ad5f250137549de94c0ea4c93a5a5643ceaf3692 | |
parent | 988b9bc40ce846cdce05961315dc0e2c1dd95e4b (diff) |
Cleanup: Snap Context Refactor
Move runtime parameters out of context creation.
Not being able to choose another region and v3d limits the use of the
snap API.
17 files changed, 278 insertions, 263 deletions
diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c index 9b43e23bd32..d4fdf46d8f4 100644 --- a/source/blender/editors/curve/editcurve.c +++ b/source/blender/editors/curve/editcurve.c @@ -5561,12 +5561,14 @@ static int add_vertex_invoke(bContext *C, wmOperator *op, const wmEvent *event) if (use_proj) { const float mval[2] = {UNPACK2(event->mval)}; - struct SnapObjectContext *snap_context = ED_transform_snap_object_context_create_view3d( - vc.scene, 0, vc.region, vc.v3d); + struct SnapObjectContext *snap_context = ED_transform_snap_object_context_create(vc.scene, + 0); ED_transform_snap_object_project_view3d( snap_context, vc.depsgraph, + vc.region, + vc.v3d, SCE_SNAP_MODE_FACE, &(const struct SnapObjectParams){ .snap_select = (vc.obedit != NULL) ? SNAP_NOT_ACTIVE : SNAP_ALL, diff --git a/source/blender/editors/gizmo_library/gizmo_types/move3d_gizmo.c b/source/blender/editors/gizmo_library/gizmo_types/move3d_gizmo.c index 68322ed56af..ec4837aec3c 100644 --- a/source/blender/editors/gizmo_library/gizmo_types/move3d_gizmo.c +++ b/source/blender/editors/gizmo_library/gizmo_types/move3d_gizmo.c @@ -289,6 +289,8 @@ static int gizmo_move_modal(bContext *C, if (ED_transform_snap_object_project_view3d( inter->snap_context_v3d, CTX_data_ensure_evaluated_depsgraph(C), + region, + CTX_wm_view3d(C), (SCE_SNAP_MODE_VERTEX | SCE_SNAP_MODE_EDGE | SCE_SNAP_MODE_FACE), &(const struct SnapObjectParams){ .snap_select = SNAP_ALL, @@ -381,8 +383,7 @@ static int gizmo_move_invoke(bContext *C, wmGizmo *gz, const wmEvent *event) if (area) { switch (area->spacetype) { case SPACE_VIEW3D: { - inter->snap_context_v3d = ED_transform_snap_object_context_create_view3d( - CTX_data_scene(C), 0, CTX_wm_region(C), CTX_wm_view3d(C)); + inter->snap_context_v3d = ED_transform_snap_object_context_create(CTX_data_scene(C), 0); break; } default: diff --git a/source/blender/editors/gizmo_library/gizmo_types/snap3d_gizmo.c b/source/blender/editors/gizmo_library/gizmo_types/snap3d_gizmo.c index ae2cc05c01b..f673d3e85ef 100644 --- a/source/blender/editors/gizmo_library/gizmo_types/snap3d_gizmo.c +++ b/source/blender/editors/gizmo_library/gizmo_types/snap3d_gizmo.c @@ -278,15 +278,11 @@ void ED_gizmotypes_snap_3d_draw_util(RegionView3D *rv3d, immUnbindProgram(); } -SnapObjectContext *ED_gizmotypes_snap_3d_context_ensure(Scene *scene, - const ARegion *region, - const View3D *v3d, - wmGizmo *gz) +SnapObjectContext *ED_gizmotypes_snap_3d_context_ensure(Scene *scene, wmGizmo *gz) { SnapGizmo3D *snap_gizmo = (SnapGizmo3D *)gz; if (snap_gizmo->snap_context_v3d == NULL) { - snap_gizmo->snap_context_v3d = ED_transform_snap_object_context_create_view3d( - scene, 0, region, v3d); + snap_gizmo->snap_context_v3d = ED_transform_snap_object_context_create(scene, 0); } return snap_gizmo->snap_context_v3d; } @@ -387,6 +383,8 @@ short ED_gizmotypes_snap_3d_update(wmGizmo *gz, snap_elem = ED_transform_snap_object_project_view3d_ex( snap_gizmo->snap_context_v3d, depsgraph, + region, + v3d, snap_elements, &(const struct SnapObjectParams){ .snap_select = snap_select, @@ -576,8 +574,12 @@ static void snap_gizmo_setup(wmGizmo *gz) #ifdef USE_SNAP_DETECT_FROM_KEYMAP_HACK SnapGizmo3D *snap_gizmo = (SnapGizmo3D *)gz; - snap_gizmo->keymap = WM_modalkeymap_find(gz->parent_gzgroup->type->keyconf, - "Generic Gizmo Tweak Modal Map"); + wmKeyConfig *keyconf = gz->parent_gzgroup->type->keyconf; + if (!keyconf) { + /* It can happen when gizmogrouptype is not linked at startup. */ + keyconf = ((wmWindowManager *)G.main->wm.first)->defaultconf; + } + snap_gizmo->keymap = WM_modalkeymap_find(keyconf, "Generic Gizmo Tweak Modal Map"); RNA_enum_value_from_id(snap_gizmo->keymap->modal_items, "SNAP_ON", &snap_gizmo->snap_on); #endif } diff --git a/source/blender/editors/gpencil/gpencil_bake_animation.c b/source/blender/editors/gpencil/gpencil_bake_animation.c index 2d299230124..960f228edd0 100644 --- a/source/blender/editors/gpencil/gpencil_bake_animation.c +++ b/source/blender/editors/gpencil/gpencil_bake_animation.c @@ -213,7 +213,6 @@ static int gpencil_bake_grease_pencil_animation_exec(bContext *C, wmOperator *op Main *bmain = CTX_data_main(C); Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); Scene *scene = CTX_data_scene(C); - ARegion *region = CTX_wm_region(C); View3D *v3d = CTX_wm_view3d(C); ListBase ob_selected_list = {NULL, NULL}; @@ -256,7 +255,7 @@ static int gpencil_bake_grease_pencil_animation_exec(bContext *C, wmOperator *op gsc.ob = ob_gpencil; /* Init snap context for geometry projection. */ - sctx = ED_transform_snap_object_context_create_view3d(scene, 0, region, CTX_wm_view3d(C)); + sctx = ED_transform_snap_object_context_create(scene, 0); } /* Loop all frame range. */ diff --git a/source/blender/editors/gpencil/gpencil_edit.c b/source/blender/editors/gpencil/gpencil_edit.c index 1f31c60367e..90b6db82838 100644 --- a/source/blender/editors/gpencil/gpencil_edit.c +++ b/source/blender/editors/gpencil/gpencil_edit.c @@ -3758,7 +3758,6 @@ static int gpencil_strokes_reproject_exec(bContext *C, wmOperator *op) bGPdata *gpd = ED_gpencil_data_get_active(C); Scene *scene = CTX_data_scene(C); Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); - ARegion *region = CTX_wm_region(C); int oldframe = (int)DEG_get_ctime(depsgraph); const eGP_ReprojectModes mode = RNA_enum_get(op->ptr, "type"); const bool keep_original = RNA_boolean_get(op->ptr, "keep_original"); @@ -3767,7 +3766,7 @@ static int gpencil_strokes_reproject_exec(bContext *C, wmOperator *op) /* Init snap context for geometry projection. */ SnapObjectContext *sctx = NULL; - sctx = ED_transform_snap_object_context_create_view3d(scene, 0, region, CTX_wm_view3d(C)); + sctx = ED_transform_snap_object_context_create(scene, 0); bool changed = false; /* Init space conversion stuff. */ diff --git a/source/blender/editors/gpencil/gpencil_mesh.c b/source/blender/editors/gpencil/gpencil_mesh.c index 079089786d0..11e02b9832f 100644 --- a/source/blender/editors/gpencil/gpencil_mesh.c +++ b/source/blender/editors/gpencil/gpencil_mesh.c @@ -188,7 +188,6 @@ static int gpencil_bake_mesh_animation_exec(bContext *C, wmOperator *op) Main *bmain = CTX_data_main(C); Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); Scene *scene = CTX_data_scene(C); - ARegion *region = CTX_wm_region(C); View3D *v3d = CTX_wm_view3d(C); ListBase ob_selected_list = {NULL, NULL}; @@ -262,7 +261,7 @@ static int gpencil_bake_mesh_animation_exec(bContext *C, wmOperator *op) gsc.ob = ob_gpencil; /* Init snap context for geometry projection. */ - sctx = ED_transform_snap_object_context_create_view3d(scene, 0, region, CTX_wm_view3d(C)); + sctx = ED_transform_snap_object_context_create(scene, 0); /* Tag all existing strokes to avoid reprojections. */ LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) { diff --git a/source/blender/editors/gpencil/gpencil_utils.c b/source/blender/editors/gpencil/gpencil_utils.c index bb05b93ad81..d3640c6eebd 100644 --- a/source/blender/editors/gpencil/gpencil_utils.c +++ b/source/blender/editors/gpencil/gpencil_utils.c @@ -1292,6 +1292,7 @@ void ED_gpencil_stroke_reproject(Depsgraph *depsgraph, depsgraph, region, v3d, xy, &ray_start[0], &ray_normal[0], true); if (ED_transform_snap_object_project_ray(sctx, depsgraph, + v3d, &(const struct SnapObjectParams){ .snap_select = SNAP_ALL, }, diff --git a/source/blender/editors/include/ED_gizmo_library.h b/source/blender/editors/include/ED_gizmo_library.h index 357d5e10fa7..9bef5a17d12 100644 --- a/source/blender/editors/include/ED_gizmo_library.h +++ b/source/blender/editors/include/ED_gizmo_library.h @@ -257,8 +257,6 @@ void ED_gizmotypes_snap_3d_draw_util(struct RegionView3D *rv3d, const uchar color_point[4], const short snap_elem_type); struct SnapObjectContext *ED_gizmotypes_snap_3d_context_ensure(struct Scene *scene, - const struct ARegion *region, - const struct View3D *v3d, struct wmGizmo *gz); typedef enum { diff --git a/source/blender/editors/include/ED_transform_snap_object_context.h b/source/blender/editors/include/ED_transform_snap_object_context.h index 42e73bbf744..c8e8513d104 100644 --- a/source/blender/editors/include/ED_transform_snap_object_context.h +++ b/source/blender/editors/include/ED_transform_snap_object_context.h @@ -83,11 +83,6 @@ struct SnapObjectParams { typedef struct SnapObjectContext SnapObjectContext; SnapObjectContext *ED_transform_snap_object_context_create(struct Scene *scene, int flag); -SnapObjectContext *ED_transform_snap_object_context_create_view3d(struct Scene *scene, - int flag, - /* extra args for view3d */ - const struct ARegion *region, - const struct View3D *v3d); void ED_transform_snap_object_context_destroy(SnapObjectContext *sctx); /* callbacks to filter how snap works */ @@ -100,6 +95,7 @@ void ED_transform_snap_object_context_set_editmesh_callbacks( bool ED_transform_snap_object_project_ray_ex(struct SnapObjectContext *sctx, struct Depsgraph *depsgraph, + const View3D *v3d, const struct SnapObjectParams *params, const float ray_start[3], const float ray_normal[3], @@ -112,6 +108,7 @@ bool ED_transform_snap_object_project_ray_ex(struct SnapObjectContext *sctx, float r_obmat[4][4]); bool ED_transform_snap_object_project_ray(SnapObjectContext *sctx, struct Depsgraph *depsgraph, + const View3D *v3d, const struct SnapObjectParams *params, const float ray_origin[3], const float ray_direction[3], @@ -121,6 +118,7 @@ bool ED_transform_snap_object_project_ray(SnapObjectContext *sctx, bool ED_transform_snap_object_project_ray_all(SnapObjectContext *sctx, struct Depsgraph *depsgraph, + const View3D *v3d, const struct SnapObjectParams *params, const float ray_start[3], const float ray_normal[3], @@ -130,6 +128,8 @@ bool ED_transform_snap_object_project_ray_all(SnapObjectContext *sctx, short ED_transform_snap_object_project_view3d_ex(struct SnapObjectContext *sctx, struct Depsgraph *depsgraph, + const ARegion *region, + const View3D *v3d, const unsigned short snap_to, const struct SnapObjectParams *params, const float mval[2], @@ -142,6 +142,8 @@ short ED_transform_snap_object_project_view3d_ex(struct SnapObjectContext *sctx, float r_obmat[4][4]); bool ED_transform_snap_object_project_view3d(struct SnapObjectContext *sctx, struct Depsgraph *depsgraph, + const ARegion *region, + const View3D *v3d, const unsigned short snap_to, const struct SnapObjectParams *params, const float mval[2], @@ -153,6 +155,8 @@ bool ED_transform_snap_object_project_view3d(struct SnapObjectContext *sctx, bool ED_transform_snap_object_project_all_view3d_ex(SnapObjectContext *sctx, struct Depsgraph *depsgraph, + const ARegion *region, + const View3D *v3d, const struct SnapObjectParams *params, const float mval[2], float ray_depth, diff --git a/source/blender/editors/mesh/editmesh_utils.c b/source/blender/editors/mesh/editmesh_utils.c index c6a8e771362..97303117dd3 100644 --- a/source/blender/editors/mesh/editmesh_utils.c +++ b/source/blender/editors/mesh/editmesh_utils.c @@ -1701,8 +1701,8 @@ void EDBM_project_snap_verts( ED_view3d_init_mats_rv3d(obedit, region->regiondata); - struct SnapObjectContext *snap_context = ED_transform_snap_object_context_create_view3d( - CTX_data_scene(C), 0, region, CTX_wm_view3d(C)); + struct SnapObjectContext *snap_context = ED_transform_snap_object_context_create( + CTX_data_scene(C), 0); BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) { if (BM_elem_flag_test(eve, BM_ELEM_SELECT)) { @@ -1711,6 +1711,8 @@ void EDBM_project_snap_verts( V3D_PROJ_RET_OK) { if (ED_transform_snap_object_project_view3d(snap_context, depsgraph, + region, + CTX_wm_view3d(C), SCE_SNAP_MODE_FACE, &(const struct SnapObjectParams){ .snap_select = SNAP_NOT_ACTIVE, diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c index 6f51d740e55..302862b1a8f 100644 --- a/source/blender/editors/space_view3d/view3d_edit.c +++ b/source/blender/editors/space_view3d/view3d_edit.c @@ -5099,14 +5099,15 @@ void ED_view3d_cursor3d_position_rotation(bContext *C, float ray_no[3]; float ray_co[3]; - struct SnapObjectContext *snap_context = ED_transform_snap_object_context_create_view3d( - scene, 0, region, v3d); + struct SnapObjectContext *snap_context = ED_transform_snap_object_context_create(scene, 0); float obmat[4][4]; Object *ob_dummy = NULL; float dist_px = 0; if (ED_transform_snap_object_project_view3d_ex(snap_context, CTX_data_ensure_evaluated_depsgraph(C), + region, + v3d, SCE_SNAP_MODE_FACE, &(const struct SnapObjectParams){ .snap_select = SNAP_ALL, diff --git a/source/blender/editors/space_view3d/view3d_gizmo_ruler.c b/source/blender/editors/space_view3d/view3d_gizmo_ruler.c index f8278edbcae..573f5348b5e 100644 --- a/source/blender/editors/space_view3d/view3d_gizmo_ruler.c +++ b/source/blender/editors/space_view3d/view3d_gizmo_ruler.c @@ -356,8 +356,7 @@ static bool view3d_ruler_item_mousemove(struct Depsgraph *depsgraph, if (do_thickness && inter->co_index != 1) { Scene *scene = DEG_get_input_scene(depsgraph); View3D *v3d = ruler_info->area->spacedata.first; - SnapObjectContext *snap_context = ED_gizmotypes_snap_3d_context_ensure( - scene, ruler_info->region, v3d, snap_gizmo); + SnapObjectContext *snap_context = ED_gizmotypes_snap_3d_context_ensure(scene, snap_gizmo); const float mval_fl[2] = {UNPACK2(mval)}; float ray_normal[3]; float ray_start[3]; @@ -367,6 +366,8 @@ static bool view3d_ruler_item_mousemove(struct Depsgraph *depsgraph, if (ED_transform_snap_object_project_view3d(snap_context, depsgraph, + ruler_info->region, + v3d, SCE_SNAP_MODE_FACE, &(const struct SnapObjectParams){ .snap_select = SNAP_ALL, @@ -382,6 +383,7 @@ static bool view3d_ruler_item_mousemove(struct Depsgraph *depsgraph, madd_v3_v3v3fl(ray_start, co, ray_normal, eps_bias); ED_transform_snap_object_project_ray(snap_context, depsgraph, + v3d, &(const struct SnapObjectParams){ .snap_select = SNAP_ALL, .edit_mode_type = SNAP_GEOM_CAGE, diff --git a/source/blender/editors/space_view3d/view3d_navigate_walk.c b/source/blender/editors/space_view3d/view3d_navigate_walk.c index 1ac241013ed..83b8c04acb6 100644 --- a/source/blender/editors/space_view3d/view3d_navigate_walk.c +++ b/source/blender/editors/space_view3d/view3d_navigate_walk.c @@ -423,6 +423,7 @@ static bool walk_floor_distance_get(RegionView3D *rv3d, ret = ED_transform_snap_object_project_ray( walk->snap_context, walk->depsgraph, + walk->v3d, &(const struct SnapObjectParams){ .snap_select = SNAP_ALL, /* Avoid having to convert the edit-mesh to a regular mesh. */ @@ -464,6 +465,7 @@ static bool walk_ray_cast(RegionView3D *rv3d, ret = ED_transform_snap_object_project_ray(walk->snap_context, walk->depsgraph, + walk->v3d, &(const struct SnapObjectParams){ .snap_select = SNAP_ALL, }, @@ -602,8 +604,7 @@ static bool initWalkInfo(bContext *C, WalkInfo *walk, wmOperator *op) walk->rv3d->rflag |= RV3D_NAVIGATING; - walk->snap_context = ED_transform_snap_object_context_create_view3d( - walk->scene, 0, walk->region, walk->v3d); + walk->snap_context = ED_transform_snap_object_context_create(walk->scene, 0); walk->v3d_camera_control = ED_view3d_cameracontrol_acquire( walk->depsgraph, walk->scene, walk->v3d, walk->rv3d); diff --git a/source/blender/editors/space_view3d/view3d_placement.c b/source/blender/editors/space_view3d/view3d_placement.c index aa3bf46d2e5..6cd6d85d204 100644 --- a/source/blender/editors/space_view3d/view3d_placement.c +++ b/source/blender/editors/space_view3d/view3d_placement.c @@ -306,6 +306,8 @@ static bool idp_snap_normal_from_gizmo(wmGizmo *gz, float r_normal[3]) */ static bool idp_poject_surface_normal(SnapObjectContext *snap_context, struct Depsgraph *depsgraph, + ARegion *region, + View3D *v3d, const float mval_fl[2], const float mat_fallback[3][3], const float normal_fallback[3], @@ -320,6 +322,8 @@ static bool idp_poject_surface_normal(SnapObjectContext *snap_context, if (ED_transform_snap_object_project_view3d_ex(snap_context, depsgraph, + region, + v3d, SCE_SNAP_MODE_FACE, &(const struct SnapObjectParams){ .snap_select = SNAP_ALL, @@ -885,11 +889,9 @@ static void view3d_interactive_add_calc_plane(bContext *C, /* Set the orientation. */ if ((plane_orient == PLACE_ORIENT_SURFACE) || (plane_depth == PLACE_DEPTH_SURFACE)) { - snap_context = (snap_gizmo ? - ED_gizmotypes_snap_3d_context_ensure(scene, region, v3d, snap_gizmo) : - NULL); + snap_context = (snap_gizmo ? ED_gizmotypes_snap_3d_context_ensure(scene, snap_gizmo) : NULL); if (snap_context == NULL) { - snap_context = ED_transform_snap_object_context_create_view3d(scene, 0, region, v3d); + snap_context = ED_transform_snap_object_context_create(scene, 0); snap_context_free = true; } } @@ -908,6 +910,8 @@ static void view3d_interactive_add_calc_plane(bContext *C, if ((snap_context != NULL) && idp_poject_surface_normal(snap_context, CTX_data_ensure_evaluated_depsgraph(C), + region, + v3d, mval_fl, use_normal_fallback ? r_matrix_orient : NULL, use_normal_fallback ? normal_fallback : NULL, @@ -938,6 +942,8 @@ static void view3d_interactive_add_calc_plane(bContext *C, if ((snap_context != NULL) && ED_transform_snap_object_project_view3d(snap_context, CTX_data_ensure_evaluated_depsgraph(C), + region, + v3d, SCE_SNAP_MODE_FACE, &(const struct SnapObjectParams){ .snap_select = SNAP_ALL, diff --git a/source/blender/editors/transform/transform_snap.c b/source/blender/editors/transform/transform_snap.c index 39a70f5477e..b8a35cb51e3 100644 --- a/source/blender/editors/transform/transform_snap.c +++ b/source/blender/editors/transform/transform_snap.c @@ -374,6 +374,8 @@ void applyProject(TransInfo *t) if (ED_transform_snap_object_project_view3d( t->tsnap.object_context, t->depsgraph, + t->region, + t->view, SCE_SNAP_MODE_FACE, &(const struct SnapObjectParams){ .snap_select = t->tsnap.modeSelect, @@ -671,8 +673,7 @@ static void initSnappingMode(TransInfo *t) if (t->spacetype == SPACE_VIEW3D) { if (t->tsnap.object_context == NULL) { t->tsnap.use_backface_culling = snap_use_backface_culling(t); - t->tsnap.object_context = ED_transform_snap_object_context_create_view3d( - t->scene, 0, t->region, t->view); + t->tsnap.object_context = ED_transform_snap_object_context_create(t->scene, 0); if (t->data_type == TC_MESH_VERTS) { /* Ignore elements being transformed. */ @@ -1245,6 +1246,8 @@ short snapObjectsTransform( return ED_transform_snap_object_project_view3d_ex( t->tsnap.object_context, t->depsgraph, + t->region, + t->view, t->settings->snap_mode, &(const struct SnapObjectParams){ .snap_select = t->tsnap.modeSelect, @@ -1280,6 +1283,8 @@ bool peelObjectsTransform(TransInfo *t, ED_transform_snap_object_project_all_view3d_ex( t->tsnap.object_context, t->depsgraph, + t->region, + t->view, &(const struct SnapObjectParams){ .snap_select = t->tsnap.modeSelect, .edit_mode_type = (t->flag & T_EDIT) != 0 ? SNAP_GEOM_EDIT : SNAP_GEOM_FINAL, diff --git a/source/blender/editors/transform/transform_snap_object.c b/source/blender/editors/transform/transform_snap_object.c index 883a89b8467..5f9250e87f7 100644 --- a/source/blender/editors/transform/transform_snap_object.c +++ b/source/blender/editors/transform/transform_snap_object.c @@ -69,17 +69,6 @@ enum eViewProj { VIEW_PROJ_PERSP = -1, }; -typedef struct SnapData { - float mval[2]; - float pmat[4][4]; /* perspective matrix */ - float win_size[2]; /* win x and y */ - enum eViewProj view_proj; - float clip_plane[MAX_CLIPPLANE_LEN][4]; - short clip_plane_len; - short snap_to_flag; - bool has_occlusion_plane; /* Ignore plane of occlusion in curves. */ -} SnapData; - typedef struct SnapObjectData { enum { SNAP_MESH = 1, @@ -113,14 +102,6 @@ struct SnapObjectContext { int flag; - /* Optional: when performing screen-space projection. - * otherwise this doesn't take viewport into account. */ - bool use_v3d; - struct { - const struct View3D *v3d; - const struct ARegion *region; - } v3d_data; - /* Object -> SnapObjectData map */ struct { GHash *object_map; @@ -138,6 +119,21 @@ struct SnapObjectContext { void *user_data; } edit_mesh; } callbacks; + + struct { + Depsgraph *depsgraph; + const ARegion *region; + const View3D *v3d; + + float mval[2]; + float pmat[4][4]; /* perspective matrix */ + float win_size[2]; /* win x and y */ + enum eViewProj view_proj; + float clip_plane[MAX_CLIPPLANE_LEN][4]; + short clip_plane_len; + short snap_to_flag; + bool has_occlusion_plane; /* Ignore plane of occlusion in curves. */ + } runtime; }; /** \} */ @@ -457,27 +453,25 @@ typedef void (*IterSnapObjsCallback)(SnapObjectContext *sctx, * Walks through all objects in the scene to create the list of objects to snap. */ static void iter_snap_objects(SnapObjectContext *sctx, - Depsgraph *depsgraph, const struct SnapObjectParams *params, IterSnapObjsCallback sob_callback, void *data) { - ViewLayer *view_layer = DEG_get_input_view_layer(depsgraph); - const View3D *v3d = sctx->v3d_data.v3d; + ViewLayer *view_layer = DEG_get_input_view_layer(sctx->runtime.depsgraph); const eSnapSelect snap_select = params->snap_select; const eSnapEditType edit_mode_type = params->edit_mode_type; const bool use_backface_culling = params->use_backface_culling; Base *base_act = view_layer->basact; if (snap_select == SNAP_ONLY_ACTIVE) { - Object *obj_eval = DEG_get_evaluated_object(depsgraph, base_act->object); + Object *obj_eval = DEG_get_evaluated_object(sctx->runtime.depsgraph, base_act->object); sob_callback( sctx, obj_eval, obj_eval->obmat, edit_mode_type, use_backface_culling, true, data); return; } for (Base *base = view_layer->object_bases.first; base != NULL; base = base->next) { - if (!BASE_VISIBLE(v3d, base)) { + if (!BASE_VISIBLE(sctx->runtime.v3d, base)) { continue; } @@ -500,9 +494,9 @@ static void iter_snap_objects(SnapObjectContext *sctx, } } - Object *obj_eval = DEG_get_evaluated_object(depsgraph, base->object); + Object *obj_eval = DEG_get_evaluated_object(sctx->runtime.depsgraph, base->object); if (obj_eval->transflag & OB_DUPLI || BKE_object_has_geometry_set_instances(obj_eval)) { - ListBase *lb = object_duplilist(depsgraph, sctx->scene, obj_eval); + ListBase *lb = object_duplilist(sctx->runtime.depsgraph, sctx->scene, obj_eval); for (DupliObject *dupli_ob = lb->first; dupli_ob; dupli_ob = dupli_ob->next) { BLI_assert(DEG_is_evaluated_object(dupli_ob->ob)); sob_callback(sctx, @@ -1031,12 +1025,6 @@ static void raycast_obj_fn(SnapObjectContext *sctx, bool retval = false; if (use_occlusion_test) { - if ((edit_mode_type == SNAP_GEOM_EDIT) && sctx->use_v3d && - XRAY_FLAG_ENABLED(sctx->v3d_data.v3d)) { - /* Use of occlude geometry in editing mode disabled. */ - return; - } - if (ELEM(ob_eval->dt, OB_BOUNDBOX, OB_WIRE)) { /* Do not hit objects that are in wire or bounding box * display mode. */ @@ -1147,6 +1135,7 @@ static void raycast_obj_fn(SnapObjectContext *sctx, */ static bool raycastObjects(SnapObjectContext *sctx, Depsgraph *depsgraph, + const View3D *v3d, const struct SnapObjectParams *params, const float ray_start[3], const float ray_dir[3], @@ -1162,6 +1151,14 @@ static bool raycastObjects(SnapObjectContext *sctx, float r_obmat[4][4], ListBase *r_hit_list) { + if (v3d && (params->edit_mode_type == SNAP_GEOM_EDIT) && XRAY_FLAG_ENABLED(v3d)) { + /* Use of occlude geometry in editing mode disabled. */ + return false; + } + + sctx->runtime.depsgraph = depsgraph; + sctx->runtime.v3d = v3d; + struct RaycastObjUserData data = { .ray_start = ray_start, .ray_dir = ray_dir, @@ -1177,7 +1174,7 @@ static bool raycastObjects(SnapObjectContext *sctx, .ret = false, }; - iter_snap_objects(sctx, depsgraph, params, raycast_obj_fn, &data); + iter_snap_objects(sctx, params, raycast_obj_fn, &data); return data.ret; } @@ -1554,7 +1551,6 @@ static void cb_snap_tri_verts(void *userdata, * \{ */ static short snap_mesh_polygon(SnapObjectContext *sctx, - SnapData *snapdata, Object *ob_eval, const float obmat[4][4], bool use_backface_culling, @@ -1568,16 +1564,16 @@ static short snap_mesh_polygon(SnapObjectContext *sctx, short elem = 0; float lpmat[4][4]; - mul_m4_m4m4(lpmat, snapdata->pmat, obmat); + mul_m4_m4m4(lpmat, sctx->runtime.pmat, obmat); struct DistProjectedAABBPrecalc neasrest_precalc; dist_squared_to_projected_aabb_precalc( - &neasrest_precalc, lpmat, snapdata->win_size, snapdata->mval); + &neasrest_precalc, lpmat, sctx->runtime.win_size, sctx->runtime.mval); float tobmat[4][4], clip_planes_local[MAX_CLIPPLANE_LEN][4]; transpose_m4_m4(tobmat, obmat); - for (int i = snapdata->clip_plane_len; i--;) { - mul_v4_m4v4(clip_planes_local[i], tobmat, snapdata->clip_plane[i]); + for (int i = sctx->runtime.clip_plane_len; i--;) { + mul_v4_m4v4(clip_planes_local[i], tobmat, sctx->runtime.clip_plane[i]); } BVHTreeNearest nearest = { @@ -1590,14 +1586,14 @@ static short snap_mesh_polygon(SnapObjectContext *sctx, Nearest2dUserData nearest2d; nearest2d_data_init( - sod, snapdata->view_proj == VIEW_PROJ_PERSP, use_backface_culling, &nearest2d); + sod, sctx->runtime.view_proj == VIEW_PROJ_PERSP, use_backface_culling, &nearest2d); if (sod->type == SNAP_MESH) { BVHTreeFromMesh *treedata = &sod->treedata_mesh; const MPoly *mp = &sod->poly[*r_index]; const MLoop *ml = &treedata->loop[mp->loopstart]; - if (snapdata->snap_to_flag & SCE_SNAP_MODE_EDGE) { + if (sctx->runtime.snap_to_flag & SCE_SNAP_MODE_EDGE) { elem = SCE_SNAP_MODE_EDGE; BLI_assert(treedata->edge != NULL); for (int i = mp->totloop; i--; ml++) { @@ -1605,7 +1601,7 @@ static short snap_mesh_polygon(SnapObjectContext *sctx, ml->e, &neasrest_precalc, clip_planes_local, - snapdata->clip_plane_len, + sctx->runtime.clip_plane_len, &nearest); } } @@ -1616,7 +1612,7 @@ static short snap_mesh_polygon(SnapObjectContext *sctx, ml->v, &neasrest_precalc, clip_planes_local, - snapdata->clip_plane_len, + sctx->runtime.clip_plane_len, &nearest); } } @@ -1629,7 +1625,7 @@ static short snap_mesh_polygon(SnapObjectContext *sctx, BMFace *f = BM_face_at_index(em->bm, *r_index); BMLoop *l_iter, *l_first; l_iter = l_first = BM_FACE_FIRST_LOOP(f); - if (snapdata->snap_to_flag & SCE_SNAP_MODE_EDGE) { + if (sctx->runtime.snap_to_flag & SCE_SNAP_MODE_EDGE) { elem = SCE_SNAP_MODE_EDGE; BM_mesh_elem_index_ensure(em->bm, BM_VERT | BM_EDGE); BM_mesh_elem_table_ensure(em->bm, BM_VERT | BM_EDGE); @@ -1638,7 +1634,7 @@ static short snap_mesh_polygon(SnapObjectContext *sctx, BM_elem_index_get(l_iter->e), &neasrest_precalc, clip_planes_local, - snapdata->clip_plane_len, + sctx->runtime.clip_plane_len, &nearest); } while ((l_iter = l_iter->next) != l_first); } @@ -1651,7 +1647,7 @@ static short snap_mesh_polygon(SnapObjectContext *sctx, BM_elem_index_get(l_iter->v), &neasrest_precalc, clip_planes_local, - snapdata->clip_plane_len, + sctx->runtime.clip_plane_len, &nearest); } while ((l_iter = l_iter->next) != l_first); } @@ -1680,7 +1676,6 @@ static short snap_mesh_polygon(SnapObjectContext *sctx, } static short snap_mesh_edge_verts_mixed(SnapObjectContext *sctx, - SnapData *snapdata, Object *ob_eval, const float obmat[4][4], float original_dist_px, @@ -1704,7 +1699,7 @@ static short snap_mesh_edge_verts_mixed(SnapObjectContext *sctx, Nearest2dUserData nearest2d; nearest2d_data_init( - sod, snapdata->view_proj == VIEW_PROJ_PERSP, use_backface_culling, &nearest2d); + sod, sctx->runtime.view_proj == VIEW_PROJ_PERSP, use_backface_culling, &nearest2d); int vindex[2]; nearest2d.get_edge_verts_index(*r_index, nearest2d.userdata, vindex); @@ -1716,10 +1711,10 @@ static short snap_mesh_edge_verts_mixed(SnapObjectContext *sctx, struct DistProjectedAABBPrecalc neasrest_precalc; { float lpmat[4][4]; - mul_m4_m4m4(lpmat, snapdata->pmat, obmat); + mul_m4_m4m4(lpmat, sctx->runtime.pmat, obmat); dist_squared_to_projected_aabb_precalc( - &neasrest_precalc, lpmat, snapdata->win_size, snapdata->mval); + &neasrest_precalc, lpmat, sctx->runtime.win_size, sctx->runtime.mval); } BVHTreeNearest nearest = { @@ -1736,7 +1731,7 @@ static short snap_mesh_edge_verts_mixed(SnapObjectContext *sctx, /* do nothing */ } else { - short snap_to_flag = snapdata->snap_to_flag; + short snap_to_flag = sctx->runtime.snap_to_flag; int e_mode_len = ((snap_to_flag & SCE_SNAP_MODE_EDGE) != 0) + ((snap_to_flag & SCE_SNAP_MODE_VERTEX) != 0) + ((snap_to_flag & SCE_SNAP_MODE_EDGE_MIDPOINT) != 0); @@ -1785,7 +1780,7 @@ static short snap_mesh_edge_verts_mixed(SnapObjectContext *sctx, } } - if (prev_co && (snapdata->snap_to_flag & SCE_SNAP_MODE_EDGE_PERPENDICULAR)) { + if (prev_co && (sctx->runtime.snap_to_flag & SCE_SNAP_MODE_EDGE_PERPENDICULAR)) { float v_near[3], va_g[3], vb_g[3]; mul_v3_m4v3(va_g, obmat, v_pair[0]); @@ -1797,7 +1792,7 @@ static short snap_mesh_edge_verts_mixed(SnapObjectContext *sctx, if (len_squared_v3v3(prev_co, v_near) > FLT_EPSILON) { dist_squared_to_projected_aabb_precalc( - &neasrest_precalc, snapdata->pmat, snapdata->win_size, snapdata->mval); + &neasrest_precalc, sctx->runtime.pmat, sctx->runtime.win_size, sctx->runtime.mval); if (test_projected_vert_dist(&neasrest_precalc, NULL, @@ -1828,7 +1823,7 @@ static short snap_mesh_edge_verts_mixed(SnapObjectContext *sctx, return elem; } -static short snapArmature(SnapData *snapdata, +static short snapArmature(SnapObjectContext *sctx, Object *ob_eval, const float obmat[4][4], /* read/write args */ @@ -1840,35 +1835,39 @@ static short snapArmature(SnapData *snapdata, { short retval = 0; - if (snapdata->snap_to_flag == SCE_SNAP_MODE_FACE) { /* Currently only edge and vert */ + if (sctx->runtime.snap_to_flag == SCE_SNAP_MODE_FACE) { /* Currently only edge and vert */ return retval; } float lpmat[4][4], dist_px_sq = square_f(*dist_px); - mul_m4_m4m4(lpmat, snapdata->pmat, obmat); + mul_m4_m4m4(lpmat, sctx->runtime.pmat, obmat); struct DistProjectedAABBPrecalc neasrest_precalc; dist_squared_to_projected_aabb_precalc( - &neasrest_precalc, lpmat, snapdata->win_size, snapdata->mval); + &neasrest_precalc, lpmat, sctx->runtime.win_size, sctx->runtime.mval); bool use_obedit = ((bArmature *)ob_eval->data)->edbo != NULL; if (use_obedit == false) { /* Test BoundBox */ BoundBox *bb = BKE_armature_boundbox_get(ob_eval); - if (bb && !snap_bound_box_check_dist( - bb->vec[0], bb->vec[6], lpmat, snapdata->win_size, snapdata->mval, dist_px_sq)) { + if (bb && !snap_bound_box_check_dist(bb->vec[0], + bb->vec[6], + lpmat, + sctx->runtime.win_size, + sctx->runtime.mval, + dist_px_sq)) { return retval; } } float tobmat[4][4], clip_planes_local[MAX_CLIPPLANE_LEN][4]; transpose_m4_m4(tobmat, obmat); - for (int i = snapdata->clip_plane_len; i--;) { - mul_v4_m4v4(clip_planes_local[i], tobmat, snapdata->clip_plane[i]); + for (int i = sctx->runtime.clip_plane_len; i--;) { + mul_v4_m4v4(clip_planes_local[i], tobmat, sctx->runtime.clip_plane[i]); } - bool is_persp = snapdata->view_proj == VIEW_PROJ_PERSP; + bool is_persp = sctx->runtime.view_proj == VIEW_PROJ_PERSP; bArmature *arm = ob_eval->data; if (arm->edbo) { @@ -1878,17 +1877,17 @@ static short snapArmature(SnapData *snapdata, if ((eBone->flag & (BONE_HIDDEN_A | BONE_ROOTSEL | BONE_TIPSEL)) == 0) { bool has_vert_snap = false; - if (snapdata->snap_to_flag & SCE_SNAP_MODE_VERTEX) { + if (sctx->runtime.snap_to_flag & SCE_SNAP_MODE_VERTEX) { has_vert_snap = test_projected_vert_dist(&neasrest_precalc, clip_planes_local, - snapdata->clip_plane_len, + sctx->runtime.clip_plane_len, is_persp, eBone->head, &dist_px_sq, r_loc); has_vert_snap |= test_projected_vert_dist(&neasrest_precalc, clip_planes_local, - snapdata->clip_plane_len, + sctx->runtime.clip_plane_len, is_persp, eBone->tail, &dist_px_sq, @@ -1898,10 +1897,10 @@ static short snapArmature(SnapData *snapdata, retval = SCE_SNAP_MODE_VERTEX; } } - if (!has_vert_snap && snapdata->snap_to_flag & SCE_SNAP_MODE_EDGE) { + if (!has_vert_snap && sctx->runtime.snap_to_flag & SCE_SNAP_MODE_EDGE) { if (test_projected_edge_dist(&neasrest_precalc, clip_planes_local, - snapdata->clip_plane_len, + sctx->runtime.clip_plane_len, is_persp, eBone->head, eBone->tail, @@ -1923,17 +1922,17 @@ static short snapArmature(SnapData *snapdata, const float *head_vec = pchan->pose_head; const float *tail_vec = pchan->pose_tail; - if (snapdata->snap_to_flag & SCE_SNAP_MODE_VERTEX) { + if (sctx->runtime.snap_to_flag & SCE_SNAP_MODE_VERTEX) { has_vert_snap = test_projected_vert_dist(&neasrest_precalc, clip_planes_local, - snapdata->clip_plane_len, + sctx->runtime.clip_plane_len, is_persp, head_vec, &dist_px_sq, r_loc); has_vert_snap |= test_projected_vert_dist(&neasrest_precalc, clip_planes_local, - snapdata->clip_plane_len, + sctx->runtime.clip_plane_len, is_persp, tail_vec, &dist_px_sq, @@ -1943,10 +1942,10 @@ static short snapArmature(SnapData *snapdata, retval = SCE_SNAP_MODE_VERTEX; } } - if (!has_vert_snap && snapdata->snap_to_flag & SCE_SNAP_MODE_EDGE) { + if (!has_vert_snap && sctx->runtime.snap_to_flag & SCE_SNAP_MODE_EDGE) { if (test_projected_edge_dist(&neasrest_precalc, clip_planes_local, - snapdata->clip_plane_len, + sctx->runtime.clip_plane_len, is_persp, head_vec, tail_vec, @@ -1972,7 +1971,7 @@ static short snapArmature(SnapData *snapdata, return 0; } -static short snapCurve(SnapData *snapdata, +static short snapCurve(SnapObjectContext *sctx, Object *ob_eval, const float obmat[4][4], bool use_obedit, @@ -1986,7 +1985,7 @@ static short snapCurve(SnapData *snapdata, bool has_snap = false; /* only vertex snapping mode (eg control points and handles) supported for now) */ - if ((snapdata->snap_to_flag & SCE_SNAP_MODE_VERTEX) == 0) { + if ((sctx->runtime.snap_to_flag & SCE_SNAP_MODE_VERTEX) == 0) { return 0; } @@ -1994,19 +1993,23 @@ static short snapCurve(SnapData *snapdata, float dist_px_sq = square_f(*dist_px); float lpmat[4][4]; - mul_m4_m4m4(lpmat, snapdata->pmat, obmat); + mul_m4_m4m4(lpmat, sctx->runtime.pmat, obmat); struct DistProjectedAABBPrecalc neasrest_precalc; dist_squared_to_projected_aabb_precalc( - &neasrest_precalc, lpmat, snapdata->win_size, snapdata->mval); + &neasrest_precalc, lpmat, sctx->runtime.win_size, sctx->runtime.mval); use_obedit = use_obedit && BKE_object_is_in_editmode(ob_eval); if (use_obedit == false) { /* Test BoundBox */ BoundBox *bb = BKE_curve_boundbox_get(ob_eval); - if (bb && !snap_bound_box_check_dist( - bb->vec[0], bb->vec[6], lpmat, snapdata->win_size, snapdata->mval, dist_px_sq)) { + if (bb && !snap_bound_box_check_dist(bb->vec[0], + bb->vec[6], + lpmat, + sctx->runtime.win_size, + sctx->runtime.mval, + dist_px_sq)) { return 0; } } @@ -2014,10 +2017,10 @@ static short snapCurve(SnapData *snapdata, float tobmat[4][4]; transpose_m4_m4(tobmat, obmat); - float(*clip_planes)[4] = snapdata->clip_plane; - int clip_plane_len = snapdata->clip_plane_len; + float(*clip_planes)[4] = sctx->runtime.clip_plane; + int clip_plane_len = sctx->runtime.clip_plane_len; - if (snapdata->has_occlusion_plane) { + if (sctx->runtime.has_occlusion_plane) { /* We snap to vertices even if occluded. */ clip_planes++; clip_plane_len--; @@ -2028,11 +2031,11 @@ static short snapCurve(SnapData *snapdata, mul_v4_m4v4(clip_planes_local[i], tobmat, clip_planes[i]); } - bool is_persp = snapdata->view_proj == VIEW_PROJ_PERSP; + bool is_persp = sctx->runtime.view_proj == VIEW_PROJ_PERSP; for (Nurb *nu = (use_obedit ? cu->editnurb->nurbs.first : cu->nurb.first); nu; nu = nu->next) { for (int u = 0; u < nu->pntsu; u++) { - if (snapdata->snap_to_flag & SCE_SNAP_MODE_VERTEX) { + if (sctx->runtime.snap_to_flag & SCE_SNAP_MODE_VERTEX) { if (use_obedit) { if (nu->bezt) { /* don't snap to selected (moving) or hidden */ @@ -2123,7 +2126,7 @@ static short snapCurve(SnapData *snapdata, } /* may extend later (for now just snaps to empty center) */ -static short snap_object_center(SnapData *snapdata, +static short snap_object_center(const SnapObjectContext *sctx, Object *ob_eval, const float obmat[4][4], /* read/write args */ @@ -2140,24 +2143,24 @@ static short snap_object_center(SnapData *snapdata, } /* for now only vertex supported */ - if (snapdata->snap_to_flag & SCE_SNAP_MODE_VERTEX) { + if (sctx->runtime.snap_to_flag & SCE_SNAP_MODE_VERTEX) { struct DistProjectedAABBPrecalc neasrest_precalc; dist_squared_to_projected_aabb_precalc( - &neasrest_precalc, snapdata->pmat, snapdata->win_size, snapdata->mval); + &neasrest_precalc, sctx->runtime.pmat, sctx->runtime.win_size, sctx->runtime.mval); float tobmat[4][4], clip_planes_local[MAX_CLIPPLANE_LEN][4]; transpose_m4_m4(tobmat, obmat); - for (int i = snapdata->clip_plane_len; i--;) { - mul_v4_m4v4(clip_planes_local[i], tobmat, snapdata->clip_plane[i]); + for (int i = sctx->runtime.clip_plane_len; i--;) { + mul_v4_m4v4(clip_planes_local[i], tobmat, sctx->runtime.clip_plane[i]); } - bool is_persp = snapdata->view_proj == VIEW_PROJ_PERSP; + bool is_persp = sctx->runtime.view_proj == VIEW_PROJ_PERSP; float dist_px_sq = square_f(*dist_px); float co[3]; copy_v3_v3(co, obmat[3]); if (test_projected_vert_dist(&neasrest_precalc, clip_planes_local, - snapdata->clip_plane_len, + sctx->runtime.clip_plane_len, is_persp, co, &dist_px_sq, @@ -2179,7 +2182,6 @@ static short snap_object_center(SnapData *snapdata, } static short snapCamera(const SnapObjectContext *sctx, - SnapData *snapdata, Object *object, float obmat[4][4], /* read/write args */ @@ -2193,7 +2195,7 @@ static short snapCamera(const SnapObjectContext *sctx, Scene *scene = sctx->scene; - bool is_persp = snapdata->view_proj == VIEW_PROJ_PERSP; + bool is_persp = sctx->runtime.view_proj == VIEW_PROJ_PERSP; float dist_px_sq = square_f(*dist_px); float orig_camera_mat[4][4], orig_camera_imat[4][4], imat[4][4]; @@ -2201,7 +2203,7 @@ static short snapCamera(const SnapObjectContext *sctx, MovieTracking *tracking; if (clip == NULL) { - return snap_object_center(snapdata, object, obmat, dist_px, r_loc, r_no, r_index); + return snap_object_center(sctx, object, obmat, dist_px, r_loc, r_no, r_index); } if (object->transflag & OB_DUPLI) { return retval; @@ -2214,10 +2216,10 @@ static short snapCamera(const SnapObjectContext *sctx, invert_m4_m4(orig_camera_imat, orig_camera_mat); invert_m4_m4(imat, obmat); - if (snapdata->snap_to_flag & SCE_SNAP_MODE_VERTEX) { + if (sctx->runtime.snap_to_flag & SCE_SNAP_MODE_VERTEX) { struct DistProjectedAABBPrecalc neasrest_precalc; dist_squared_to_projected_aabb_precalc( - &neasrest_precalc, snapdata->pmat, snapdata->win_size, snapdata->mval); + &neasrest_precalc, sctx->runtime.pmat, sctx->runtime.win_size, sctx->runtime.mval); MovieTrackingObject *tracking_object; for (tracking_object = tracking->objects.first; tracking_object; @@ -2252,8 +2254,8 @@ static short snapCamera(const SnapObjectContext *sctx, mul_m4_v3(vertex_obmat, bundle_pos); if (test_projected_vert_dist(&neasrest_precalc, - snapdata->clip_plane, - snapdata->clip_plane_len, + sctx->runtime.clip_plane, + sctx->runtime.clip_plane_len, is_persp, bundle_pos, &dist_px_sq, @@ -2277,7 +2279,6 @@ static short snapCamera(const SnapObjectContext *sctx, } static short snapMesh(SnapObjectContext *sctx, - SnapData *snapdata, Object *ob_eval, Mesh *me_eval, const float obmat[4][4], @@ -2290,23 +2291,24 @@ static short snapMesh(SnapObjectContext *sctx, float r_no[3], int *r_index) { - BLI_assert(snapdata->snap_to_flag != SCE_SNAP_MODE_FACE); + BLI_assert(sctx->runtime.snap_to_flag != SCE_SNAP_MODE_FACE); if (me_eval->totvert == 0) { return 0; } - if (me_eval->totedge == 0 && !(snapdata->snap_to_flag & SCE_SNAP_MODE_VERTEX)) { + if (me_eval->totedge == 0 && !(sctx->runtime.snap_to_flag & SCE_SNAP_MODE_VERTEX)) { return 0; } float lpmat[4][4]; - mul_m4_m4m4(lpmat, snapdata->pmat, obmat); + mul_m4_m4m4(lpmat, sctx->runtime.pmat, obmat); float dist_px_sq = square_f(*dist_px); /* Test BoundBox */ BoundBox *bb = BKE_mesh_boundbox_get(ob_eval); - if (bb && !snap_bound_box_check_dist( - bb->vec[0], bb->vec[6], lpmat, snapdata->win_size, snapdata->mval, dist_px_sq)) { + if (bb && + !snap_bound_box_check_dist( + bb->vec[0], bb->vec[6], lpmat, sctx->runtime.win_size, sctx->runtime.mval, dist_px_sq)) { return 0; } @@ -2330,7 +2332,7 @@ static short snapMesh(SnapObjectContext *sctx, treedata_tmp.looptri_allocated)); } - if (snapdata->snap_to_flag & SCE_SNAP_MODE_VERTEX) { + if (sctx->runtime.snap_to_flag & SCE_SNAP_MODE_VERTEX) { if (sod->has_loose_vert && sod->bvhtree[1] == NULL) { sod->bvhtree[1] = BKE_bvhtree_from_mesh_get( &treedata_tmp, me_eval, BVHTREE_FROM_LOOSEVERTS, 2); @@ -2353,7 +2355,7 @@ static short snapMesh(SnapObjectContext *sctx, Nearest2dUserData nearest2d; nearest2d_data_init( - sod, snapdata->view_proj == VIEW_PROJ_PERSP, use_backface_culling, &nearest2d); + sod, sctx->runtime.view_proj == VIEW_PROJ_PERSP, use_backface_culling, &nearest2d); BVHTreeNearest nearest = { .index = -1, @@ -2364,18 +2366,18 @@ static short snapMesh(SnapObjectContext *sctx, float tobmat[4][4], clip_planes_local[MAX_CLIPPLANE_LEN][4]; transpose_m4_m4(tobmat, obmat); - for (int i = snapdata->clip_plane_len; i--;) { - mul_v4_m4v4(clip_planes_local[i], tobmat, snapdata->clip_plane[i]); + for (int i = sctx->runtime.clip_plane_len; i--;) { + mul_v4_m4v4(clip_planes_local[i], tobmat, sctx->runtime.clip_plane[i]); } - if (sod->bvhtree[1] && (snapdata->snap_to_flag & SCE_SNAP_MODE_VERTEX)) { + if (sod->bvhtree[1] && (sctx->runtime.snap_to_flag & SCE_SNAP_MODE_VERTEX)) { /* snap to loose verts */ BLI_bvhtree_find_nearest_projected(sod->bvhtree[1], lpmat, - snapdata->win_size, - snapdata->mval, + sctx->runtime.win_size, + sctx->runtime.mval, clip_planes_local, - snapdata->clip_plane_len, + sctx->runtime.clip_plane_len, &nearest, cb_snap_vert, &nearest2d); @@ -2383,15 +2385,15 @@ static short snapMesh(SnapObjectContext *sctx, last_index = nearest.index; } - if (snapdata->snap_to_flag & SCE_SNAP_MODE_EDGE) { + if (sctx->runtime.snap_to_flag & SCE_SNAP_MODE_EDGE) { if (sod->bvhtree[0]) { /* snap to loose edges */ BLI_bvhtree_find_nearest_projected(sod->bvhtree[0], lpmat, - snapdata->win_size, - snapdata->mval, + sctx->runtime.win_size, + sctx->runtime.mval, clip_planes_local, - snapdata->clip_plane_len, + sctx->runtime.clip_plane_len, &nearest, cb_snap_edge, &nearest2d); @@ -2401,10 +2403,10 @@ static short snapMesh(SnapObjectContext *sctx, /* snap to looptris */ BLI_bvhtree_find_nearest_projected(treedata->tree, lpmat, - snapdata->win_size, - snapdata->mval, + sctx->runtime.win_size, + sctx->runtime.mval, clip_planes_local, - snapdata->clip_plane_len, + sctx->runtime.clip_plane_len, &nearest, cb_snap_tri_edges, &nearest2d); @@ -2415,15 +2417,15 @@ static short snapMesh(SnapObjectContext *sctx, } } else { - BLI_assert(snapdata->snap_to_flag & SCE_SNAP_MODE_VERTEX); + BLI_assert(sctx->runtime.snap_to_flag & SCE_SNAP_MODE_VERTEX); if (sod->bvhtree[0]) { /* snap to loose edge verts */ BLI_bvhtree_find_nearest_projected(sod->bvhtree[0], lpmat, - snapdata->win_size, - snapdata->mval, + sctx->runtime.win_size, + sctx->runtime.mval, clip_planes_local, - snapdata->clip_plane_len, + sctx->runtime.clip_plane_len, &nearest, cb_snap_edge_verts, &nearest2d); @@ -2433,10 +2435,10 @@ static short snapMesh(SnapObjectContext *sctx, /* snap to looptri verts */ BLI_bvhtree_find_nearest_projected(treedata->tree, lpmat, - snapdata->win_size, - snapdata->mval, + sctx->runtime.win_size, + sctx->runtime.mval, clip_planes_local, - snapdata->clip_plane_len, + sctx->runtime.clip_plane_len, &nearest, cb_snap_tri_verts, &nearest2d); @@ -2468,7 +2470,6 @@ static short snapMesh(SnapObjectContext *sctx, } static short snapEditMesh(SnapObjectContext *sctx, - SnapData *snapdata, Object *ob_eval, BMEditMesh *em, const float obmat[4][4], @@ -2480,9 +2481,9 @@ static short snapEditMesh(SnapObjectContext *sctx, float r_no[3], int *r_index) { - BLI_assert(snapdata->snap_to_flag != SCE_SNAP_MODE_FACE); + BLI_assert(sctx->runtime.snap_to_flag != SCE_SNAP_MODE_FACE); - if ((snapdata->snap_to_flag & ~SCE_SNAP_MODE_FACE) == SCE_SNAP_MODE_VERTEX) { + if ((sctx->runtime.snap_to_flag & ~SCE_SNAP_MODE_FACE) == SCE_SNAP_MODE_VERTEX) { if (em->bm->totvert == 0) { return 0; } @@ -2494,7 +2495,7 @@ static short snapEditMesh(SnapObjectContext *sctx, } float lpmat[4][4]; - mul_m4_m4m4(lpmat, snapdata->pmat, obmat); + mul_m4_m4m4(lpmat, sctx->runtime.pmat, obmat); float dist_px_sq = square_f(*dist_px); @@ -2504,11 +2505,11 @@ static short snapEditMesh(SnapObjectContext *sctx, /* was BKE_boundbox_ray_hit_check, see: cf6ca226fa58 */ if (!snap_bound_box_check_dist( - sod->min, sod->max, lpmat, snapdata->win_size, snapdata->mval, dist_px_sq)) { + sod->min, sod->max, lpmat, sctx->runtime.win_size, sctx->runtime.mval, dist_px_sq)) { return 0; } - if (snapdata->snap_to_flag & SCE_SNAP_MODE_VERTEX) { + if (sctx->runtime.snap_to_flag & SCE_SNAP_MODE_VERTEX) { BVHTreeFromEditMesh treedata = {.tree = sod->bvhtree[0]}; if (treedata.tree == NULL) { @@ -2540,7 +2541,7 @@ static short snapEditMesh(SnapObjectContext *sctx, } } - if (snapdata->snap_to_flag & SCE_SNAP_MODE_EDGE) { + if (sctx->runtime.snap_to_flag & SCE_SNAP_MODE_EDGE) { BVHTreeFromEditMesh treedata = {.tree = sod->bvhtree[1]}; if (treedata.tree == NULL) { @@ -2574,7 +2575,7 @@ static short snapEditMesh(SnapObjectContext *sctx, Nearest2dUserData nearest2d; nearest2d_data_init( - sod, snapdata->view_proj == VIEW_PROJ_PERSP, use_backface_culling, &nearest2d); + sod, sctx->runtime.view_proj == VIEW_PROJ_PERSP, use_backface_culling, &nearest2d); BVHTreeNearest nearest = { .index = -1, @@ -2585,35 +2586,35 @@ static short snapEditMesh(SnapObjectContext *sctx, float tobmat[4][4], clip_planes_local[MAX_CLIPPLANE_LEN][4]; transpose_m4_m4(tobmat, obmat); - for (int i = snapdata->clip_plane_len; i--;) { - mul_v4_m4v4(clip_planes_local[i], tobmat, snapdata->clip_plane[i]); + for (int i = sctx->runtime.clip_plane_len; i--;) { + mul_v4_m4v4(clip_planes_local[i], tobmat, sctx->runtime.clip_plane[i]); } - if (sod->bvhtree[0] && (snapdata->snap_to_flag & SCE_SNAP_MODE_VERTEX)) { + if (sod->bvhtree[0] && (sctx->runtime.snap_to_flag & SCE_SNAP_MODE_VERTEX)) { BM_mesh_elem_table_ensure(em->bm, BM_VERT); BM_mesh_elem_index_ensure(em->bm, BM_VERT); BLI_bvhtree_find_nearest_projected(sod->bvhtree[0], lpmat, - snapdata->win_size, - snapdata->mval, + sctx->runtime.win_size, + sctx->runtime.mval, clip_planes_local, - snapdata->clip_plane_len, + sctx->runtime.clip_plane_len, &nearest, cb_snap_vert, &nearest2d); } - if (sod->bvhtree[1] && (snapdata->snap_to_flag & SCE_SNAP_MODE_EDGE)) { + if (sod->bvhtree[1] && (sctx->runtime.snap_to_flag & SCE_SNAP_MODE_EDGE)) { int last_index = nearest.index; nearest.index = -1; BM_mesh_elem_table_ensure(em->bm, BM_EDGE | BM_VERT); BM_mesh_elem_index_ensure(em->bm, BM_EDGE | BM_VERT); BLI_bvhtree_find_nearest_projected(sod->bvhtree[1], lpmat, - snapdata->win_size, - snapdata->mval, + sctx->runtime.win_size, + sctx->runtime.mval, clip_planes_local, - snapdata->clip_plane_len, + sctx->runtime.clip_plane_len, &nearest, cb_snap_edge, &nearest2d); @@ -2650,7 +2651,6 @@ static short snapEditMesh(SnapObjectContext *sctx, } struct SnapObjUserData { - SnapData *snapdata; /* read/write args */ float *dist_px; /* return args */ @@ -2686,7 +2686,6 @@ static void snap_obj_fn(SnapObjectContext *sctx, /* Operators only update the editmesh looptris of the original mesh. */ BMEditMesh *em_orig = BKE_editmesh_from_object(DEG_get_original_object(ob_eval)); retval = snapEditMesh(sctx, - dt->snapdata, ob_eval, em_orig, obmat, @@ -2703,7 +2702,6 @@ static void snap_obj_fn(SnapObjectContext *sctx, } retval = snapMesh(sctx, - dt->snapdata, ob_eval, me_eval, obmat, @@ -2716,11 +2714,10 @@ static void snap_obj_fn(SnapObjectContext *sctx, break; } case OB_ARMATURE: - retval = snapArmature( - dt->snapdata, ob_eval, obmat, dt->dist_px, dt->r_loc, dt->r_no, dt->r_index); + retval = snapArmature(sctx, ob_eval, obmat, dt->dist_px, dt->r_loc, dt->r_no, dt->r_index); break; case OB_CURVE: - retval = snapCurve(dt->snapdata, + retval = snapCurve(sctx, ob_eval, obmat, edit_mode_type == SNAP_GEOM_EDIT, @@ -2734,7 +2731,6 @@ static void snap_obj_fn(SnapObjectContext *sctx, Mesh *mesh_eval = BKE_object_get_evaluated_mesh(ob_eval); if (mesh_eval) { retval |= snapMesh(sctx, - dt->snapdata, ob_eval, mesh_eval, obmat, @@ -2751,11 +2747,10 @@ static void snap_obj_fn(SnapObjectContext *sctx, case OB_GPENCIL: case OB_LAMP: retval = snap_object_center( - dt->snapdata, ob_eval, obmat, dt->dist_px, dt->r_loc, dt->r_no, dt->r_index); + sctx, ob_eval, obmat, dt->dist_px, dt->r_loc, dt->r_no, dt->r_index); break; case OB_CAMERA: - retval = snapCamera( - sctx, dt->snapdata, ob_eval, obmat, dt->dist_px, dt->r_loc, dt->r_no, dt->r_index); + retval = snapCamera(sctx, ob_eval, obmat, dt->dist_px, dt->r_loc, dt->r_no, dt->r_index); break; } @@ -2796,8 +2791,6 @@ static void snap_obj_fn(SnapObjectContext *sctx, * \param r_obmat: Object matrix (may not be #Object.obmat with dupli-instances). */ static short snapObjectsRay(SnapObjectContext *sctx, - Depsgraph *depsgraph, - SnapData *snapdata, const struct SnapObjectParams *params, /* read/write args */ /* Parameters below cannot be const, because they are assigned to a @@ -2811,7 +2804,6 @@ static short snapObjectsRay(SnapObjectContext *sctx, float r_obmat[4][4]) { struct SnapObjUserData data = { - .snapdata = snapdata, .dist_px = dist_px, .r_loc = r_loc, .r_no = r_no, @@ -2821,7 +2813,7 @@ static short snapObjectsRay(SnapObjectContext *sctx, .ret = 0, }; - iter_snap_objects(sctx, depsgraph, params, snap_obj_fn, &data); + iter_snap_objects(sctx, params, snap_obj_fn, &data); return data.ret; } @@ -2848,21 +2840,6 @@ SnapObjectContext *ED_transform_snap_object_context_create(Scene *scene, int fla return sctx; } -SnapObjectContext *ED_transform_snap_object_context_create_view3d(Scene *scene, - int flag, - /* extra args for view3d */ - const ARegion *region, - const View3D *v3d) -{ - SnapObjectContext *sctx = ED_transform_snap_object_context_create(scene, flag); - - sctx->use_v3d = true; - sctx->v3d_data.region = region; - sctx->v3d_data.v3d = v3d; - - return sctx; -} - static void snap_object_data_free(void *sod_v) { SnapObjectData *sod = sod_v; @@ -2896,6 +2873,7 @@ void ED_transform_snap_object_context_set_editmesh_callbacks( bool ED_transform_snap_object_project_ray_ex(SnapObjectContext *sctx, Depsgraph *depsgraph, + const View3D *v3d, const struct SnapObjectParams *params, const float ray_start[3], const float ray_normal[3], @@ -2908,6 +2886,7 @@ bool ED_transform_snap_object_project_ray_ex(SnapObjectContext *sctx, { return raycastObjects(sctx, depsgraph, + v3d, params, ray_start, ray_normal, @@ -2929,6 +2908,7 @@ bool ED_transform_snap_object_project_ray_ex(SnapObjectContext *sctx, */ bool ED_transform_snap_object_project_ray_all(SnapObjectContext *sctx, Depsgraph *depsgraph, + const View3D *v3d, const struct SnapObjectParams *params, const float ray_start[3], const float ray_normal[3], @@ -2946,6 +2926,7 @@ bool ED_transform_snap_object_project_ray_all(SnapObjectContext *sctx, bool retval = raycastObjects(sctx, depsgraph, + v3d, params, ray_start, ray_normal, @@ -2978,6 +2959,7 @@ bool ED_transform_snap_object_project_ray_all(SnapObjectContext *sctx, */ static bool transform_snap_context_project_ray_impl(SnapObjectContext *sctx, Depsgraph *depsgraph, + const View3D *v3d, const struct SnapObjectParams *params, const float ray_start[3], const float ray_normal[3], @@ -2988,14 +2970,25 @@ static bool transform_snap_context_project_ray_impl(SnapObjectContext *sctx, bool ret; /* try snap edge, then face if it fails */ - ret = ED_transform_snap_object_project_ray_ex( - sctx, depsgraph, params, ray_start, ray_normal, ray_depth, r_co, r_no, NULL, NULL, NULL); + ret = ED_transform_snap_object_project_ray_ex(sctx, + depsgraph, + v3d, + params, + ray_start, + ray_normal, + ray_depth, + r_co, + r_no, + NULL, + NULL, + NULL); return ret; } bool ED_transform_snap_object_project_ray(SnapObjectContext *sctx, Depsgraph *depsgraph, + const View3D *v3d, const struct SnapObjectParams *params, const float ray_origin[3], const float ray_direction[3], @@ -3010,12 +3003,14 @@ bool ED_transform_snap_object_project_ray(SnapObjectContext *sctx, } return transform_snap_context_project_ray_impl( - sctx, depsgraph, params, ray_origin, ray_direction, ray_depth, r_co, r_no); + sctx, depsgraph, v3d, params, ray_origin, ray_direction, ray_depth, r_co, r_no); } static short transform_snap_context_project_view3d_mixed_impl( SnapObjectContext *sctx, Depsgraph *depsgraph, + const ARegion *region, + const View3D *v3d, const ushort snap_to_flag, const struct SnapObjectParams *params, const float mval[2], @@ -3042,21 +3037,18 @@ static short transform_snap_context_project_view3d_mixed_impl( float obmat[4][4]; int index = -1; - const ARegion *region = sctx->v3d_data.region; const RegionView3D *rv3d = region->regiondata; - bool use_occlusion_test = params->use_occlusion_test && !XRAY_ENABLED(sctx->v3d_data.v3d); + bool use_occlusion_test = params->use_occlusion_test && !XRAY_ENABLED(v3d); + + sctx->runtime.depsgraph = depsgraph; + sctx->runtime.region = region; + sctx->runtime.v3d = v3d; if (snap_to_flag & SCE_SNAP_MODE_FACE || use_occlusion_test) { float ray_start[3], ray_normal[3]; - if (!ED_view3d_win_to_ray_clipped_ex(depsgraph, - sctx->v3d_data.region, - sctx->v3d_data.v3d, - mval, - NULL, - ray_normal, - ray_start, - true)) { + if (!ED_view3d_win_to_ray_clipped_ex( + depsgraph, region, v3d, mval, NULL, ray_normal, ray_start, true)) { return 0; } @@ -3064,6 +3056,7 @@ static short transform_snap_context_project_view3d_mixed_impl( has_hit = raycastObjects(sctx, depsgraph, + v3d, params, ray_start, ray_normal, @@ -3099,24 +3092,28 @@ static short transform_snap_context_project_view3d_mixed_impl( short elem_test, elem = 0; float dist_px_tmp = *dist_px; - SnapData snapdata; - copy_m4_m4(snapdata.pmat, rv3d->persmat); - snapdata.win_size[0] = region->winx; - snapdata.win_size[1] = region->winy; - copy_v2_v2(snapdata.mval, mval); - snapdata.view_proj = rv3d->is_persp ? VIEW_PROJ_PERSP : VIEW_PROJ_ORTHO; + copy_m4_m4(sctx->runtime.pmat, rv3d->persmat); + sctx->runtime.win_size[0] = region->winx; + sctx->runtime.win_size[1] = region->winy; + copy_v2_v2(sctx->runtime.mval, mval); + sctx->runtime.view_proj = rv3d->is_persp ? VIEW_PROJ_PERSP : VIEW_PROJ_ORTHO; /* First snap to edge instead of middle or perpendicular. */ - snapdata.snap_to_flag = snap_to_flag & (SCE_SNAP_MODE_VERTEX | SCE_SNAP_MODE_EDGE); + sctx->runtime.snap_to_flag = snap_to_flag & (SCE_SNAP_MODE_VERTEX | SCE_SNAP_MODE_EDGE); if (snap_to_flag & (SCE_SNAP_MODE_EDGE_MIDPOINT | SCE_SNAP_MODE_EDGE_PERPENDICULAR)) { - snapdata.snap_to_flag |= SCE_SNAP_MODE_EDGE; + sctx->runtime.snap_to_flag |= SCE_SNAP_MODE_EDGE; } - planes_from_projmat( - snapdata.pmat, NULL, NULL, NULL, NULL, snapdata.clip_plane[0], snapdata.clip_plane[1]); + planes_from_projmat(sctx->runtime.pmat, + NULL, + NULL, + NULL, + NULL, + sctx->runtime.clip_plane[0], + sctx->runtime.clip_plane[1]); - snapdata.clip_plane_len = 2; - snapdata.has_occlusion_plane = false; + sctx->runtime.clip_plane_len = 2; + sctx->runtime.has_occlusion_plane = false; /* By convention we only snap to the original elements of a curve. */ if (has_hit && ob_eval->type != OB_CURVE) { @@ -3124,7 +3121,7 @@ static short transform_snap_context_project_view3d_mixed_impl( float new_clipplane[4]; BLI_ASSERT_UNIT_V3(no); plane_from_point_normal_v3(new_clipplane, loc, no); - if (dot_v3v3(snapdata.clip_plane[0], new_clipplane) > 0.0f) { + if (dot_v3v3(sctx->runtime.clip_plane[0], new_clipplane) > 0.0f) { /* The plane is facing the wrong direction. */ negate_v4(new_clipplane); } @@ -3133,30 +3130,22 @@ static short transform_snap_context_project_view3d_mixed_impl( new_clipplane[3] += 0.01f; /* Try to snap only to the polygon. */ - elem_test = snap_mesh_polygon(sctx, - &snapdata, - ob_eval, - obmat, - params->use_backface_culling, - &dist_px_tmp, - loc, - no, - &index); + elem_test = snap_mesh_polygon( + sctx, ob_eval, obmat, params->use_backface_culling, &dist_px_tmp, loc, no, &index); if (elem_test) { elem = elem_test; } /* Add the new clip plane to the beginning of the list. */ - for (int i = snapdata.clip_plane_len; i != 0; i--) { - copy_v4_v4(snapdata.clip_plane[i], snapdata.clip_plane[i - 1]); + for (int i = sctx->runtime.clip_plane_len; i != 0; i--) { + copy_v4_v4(sctx->runtime.clip_plane[i], sctx->runtime.clip_plane[i - 1]); } - copy_v4_v4(snapdata.clip_plane[0], new_clipplane); - snapdata.clip_plane_len++; - snapdata.has_occlusion_plane = true; + copy_v4_v4(sctx->runtime.clip_plane[0], new_clipplane); + sctx->runtime.clip_plane_len++; + sctx->runtime.has_occlusion_plane = true; } - elem_test = snapObjectsRay( - sctx, depsgraph, &snapdata, params, &dist_px_tmp, loc, no, &index, &ob_eval, obmat); + elem_test = snapObjectsRay(sctx, params, &dist_px_tmp, loc, no, &index, &ob_eval, obmat); if (elem_test) { elem = elem_test; } @@ -3164,9 +3153,8 @@ static short transform_snap_context_project_view3d_mixed_impl( if ((elem == SCE_SNAP_MODE_EDGE) && (snap_to_flag & (SCE_SNAP_MODE_VERTEX | SCE_SNAP_MODE_EDGE_MIDPOINT | SCE_SNAP_MODE_EDGE_PERPENDICULAR))) { - snapdata.snap_to_flag = snap_to_flag; + sctx->runtime.snap_to_flag = snap_to_flag; elem = snap_mesh_edge_verts_mixed(sctx, - &snapdata, ob_eval, obmat, *dist_px, @@ -3204,6 +3192,8 @@ static short transform_snap_context_project_view3d_mixed_impl( short ED_transform_snap_object_project_view3d_ex(SnapObjectContext *sctx, Depsgraph *depsgraph, + const ARegion *region, + const View3D *v3d, const ushort snap_to, const struct SnapObjectParams *params, const float mval[2], @@ -3217,6 +3207,8 @@ short ED_transform_snap_object_project_view3d_ex(SnapObjectContext *sctx, { return transform_snap_context_project_view3d_mixed_impl(sctx, depsgraph, + region, + v3d, snap_to, params, mval, @@ -3244,6 +3236,8 @@ short ED_transform_snap_object_project_view3d_ex(SnapObjectContext *sctx, */ bool ED_transform_snap_object_project_view3d(SnapObjectContext *sctx, Depsgraph *depsgraph, + const ARegion *region, + const View3D *v3d, const ushort snap_to, const struct SnapObjectParams *params, const float mval[2], @@ -3254,6 +3248,8 @@ bool ED_transform_snap_object_project_view3d(SnapObjectContext *sctx, { return ED_transform_snap_object_project_view3d_ex(sctx, depsgraph, + region, + v3d, snap_to, params, mval, @@ -3271,6 +3267,8 @@ bool ED_transform_snap_object_project_view3d(SnapObjectContext *sctx, */ bool ED_transform_snap_object_project_all_view3d_ex(SnapObjectContext *sctx, Depsgraph *depsgraph, + const ARegion *region, + const View3D *v3d, const struct SnapObjectParams *params, const float mval[2], float ray_depth, @@ -3279,19 +3277,13 @@ bool ED_transform_snap_object_project_all_view3d_ex(SnapObjectContext *sctx, { float ray_start[3], ray_normal[3]; - if (!ED_view3d_win_to_ray_clipped_ex(depsgraph, - sctx->v3d_data.region, - sctx->v3d_data.v3d, - mval, - NULL, - ray_normal, - ray_start, - true)) { + if (!ED_view3d_win_to_ray_clipped_ex( + depsgraph, region, v3d, mval, NULL, ray_normal, ray_start, true)) { return false; } return ED_transform_snap_object_project_ray_all( - sctx, depsgraph, params, ray_start, ray_normal, ray_depth, sort, r_hit_list); + sctx, depsgraph, v3d, params, ray_start, ray_normal, ray_depth, sort, r_hit_list); } /** \} */ diff --git a/source/blender/makesrna/intern/rna_scene_api.c b/source/blender/makesrna/intern/rna_scene_api.c index 3e292ea89e2..543d69842be 100644 --- a/source/blender/makesrna/intern/rna_scene_api.c +++ b/source/blender/makesrna/intern/rna_scene_api.c @@ -154,6 +154,7 @@ static void rna_Scene_ray_cast(Scene *scene, bool ret = ED_transform_snap_object_project_ray_ex(sctx, depsgraph, + NULL, &(const struct SnapObjectParams){ .snap_select = SNAP_ALL, }, |