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 /source/blender/editors/transform/transform_snap_object.c | |
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.
Diffstat (limited to 'source/blender/editors/transform/transform_snap_object.c')
-rw-r--r-- | source/blender/editors/transform/transform_snap_object.c | 440 |
1 files changed, 216 insertions, 224 deletions
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); } /** \} */ |