Transform Snap Object: Remove depsgraph when creating context

Currently, this change does not bring functional changes.
But it is necessary to extend the use of the snap system for gizmos,
since, after a Undo, the `depsgraph` pointed by the `snap_context`
has its memory invalidated.

Reviewed By: campbellbarton

Differential Revision: https://developer.blender.org/D7013
This commit is contained in:
Germano Cavalcante 2020-03-09 10:02:11 -03:00
parent 3a10c61a7d
commit a922a097ef
12 changed files with 140 additions and 91 deletions

View File

@ -5677,10 +5677,11 @@ static int add_vertex_invoke(bContext *C, wmOperator *op, const wmEvent *event)
const float mval[2] = {UNPACK2(event->mval)};
struct SnapObjectContext *snap_context = ED_transform_snap_object_context_create_view3d(
vc.bmain, vc.scene, vc.depsgraph, 0, vc.region, vc.v3d);
vc.bmain, vc.scene, 0, vc.region, vc.v3d);
ED_transform_snap_object_project_view3d(
snap_context,
vc.depsgraph,
SCE_SNAP_MODE_FACE,
&(const struct SnapObjectParams){
.snap_select = (vc.obedit != NULL) ? SNAP_NOT_ACTIVE : SNAP_ALL,

View File

@ -276,6 +276,7 @@ static int gizmo_move_modal(bContext *C,
float co[3];
if (ED_transform_snap_object_project_view3d(
inter->snap_context_v3d,
CTX_data_ensure_evaluated_depsgraph(C),
(SCE_SNAP_MODE_VERTEX | SCE_SNAP_MODE_EDGE | SCE_SNAP_MODE_FACE),
&(const struct SnapObjectParams){
.snap_select = SNAP_ALL,
@ -369,12 +370,7 @@ static int gizmo_move_invoke(bContext *C, wmGizmo *gz, const wmEvent *event)
switch (sa->spacetype) {
case SPACE_VIEW3D: {
inter->snap_context_v3d = ED_transform_snap_object_context_create_view3d(
CTX_data_main(C),
CTX_data_scene(C),
CTX_data_ensure_evaluated_depsgraph(C),
0,
CTX_wm_region(C),
CTX_wm_view3d(C));
CTX_data_main(C), CTX_data_scene(C), 0, CTX_wm_region(C), CTX_wm_view3d(C));
break;
}
default:

View File

@ -3426,7 +3426,7 @@ static int gp_strokes_reproject_exec(bContext *C, wmOperator *op)
int cfra_prv = INT_MIN;
/* init snap context for geometry projection */
sctx = ED_transform_snap_object_context_create_view3d(
bmain, scene, depsgraph, 0, region, CTX_wm_view3d(C));
bmain, scene, 0, region, CTX_wm_view3d(C));
/* Go through each editable + selected stroke, adjusting each of its points one by one... */
GP_EDITABLE_STROKES_BEGIN (gpstroke_iter, C, gpl, gps) {
@ -3517,6 +3517,7 @@ static int gp_strokes_reproject_exec(bContext *C, wmOperator *op)
ED_view3d_win_to_ray(region, xy, &ray_start[0], &ray_normal[0]);
if (ED_transform_snap_object_project_ray(sctx,
depsgraph,
&(const struct SnapObjectParams){
.snap_select = SNAP_ALL,
},

View File

@ -79,11 +79,9 @@ struct SnapObjectParams {
typedef struct SnapObjectContext SnapObjectContext;
SnapObjectContext *ED_transform_snap_object_context_create(struct Main *bmain,
struct Scene *scene,
struct Depsgraph *depsgraph,
int flag);
SnapObjectContext *ED_transform_snap_object_context_create_view3d(struct Main *bmain,
struct Scene *scene,
struct Depsgraph *depsgraph,
int flag,
/* extra args for view3d */
const struct ARegion *region,
@ -99,6 +97,7 @@ void ED_transform_snap_object_context_set_editmesh_callbacks(
void *user_data);
bool ED_transform_snap_object_project_ray_ex(struct SnapObjectContext *sctx,
struct Depsgraph *depsgraph,
const struct SnapObjectParams *params,
const float ray_start[3],
const float ray_normal[3],
@ -110,6 +109,7 @@ bool ED_transform_snap_object_project_ray_ex(struct SnapObjectContext *sctx,
struct Object **r_ob,
float r_obmat[4][4]);
bool ED_transform_snap_object_project_ray(SnapObjectContext *sctx,
struct Depsgraph *depsgraph,
const struct SnapObjectParams *params,
const float ray_origin[3],
const float ray_direction[3],
@ -118,6 +118,7 @@ bool ED_transform_snap_object_project_ray(SnapObjectContext *sctx,
float r_no[3]);
bool ED_transform_snap_object_project_ray_all(SnapObjectContext *sctx,
struct Depsgraph *depsgraph,
const struct SnapObjectParams *params,
const float ray_start[3],
const float ray_normal[3],
@ -126,6 +127,7 @@ bool ED_transform_snap_object_project_ray_all(SnapObjectContext *sctx,
struct ListBase *r_hit_list);
short ED_transform_snap_object_project_view3d_ex(struct SnapObjectContext *sctx,
struct Depsgraph *depsgraph,
const unsigned short snap_to,
const struct SnapObjectParams *params,
const float mval[2],
@ -137,6 +139,7 @@ short ED_transform_snap_object_project_view3d_ex(struct SnapObjectContext *sctx,
struct Object **r_ob,
float r_obmat[4][4]);
bool ED_transform_snap_object_project_view3d(struct SnapObjectContext *sctx,
struct Depsgraph *depsgraph,
const unsigned short snap_to,
const struct SnapObjectParams *params,
const float mval[2],
@ -147,6 +150,7 @@ bool ED_transform_snap_object_project_view3d(struct SnapObjectContext *sctx,
float r_no[3]);
bool ED_transform_snap_object_project_all_view3d_ex(SnapObjectContext *sctx,
struct Depsgraph *depsgraph,
const struct SnapObjectParams *params,
const float mval[2],
float ray_depth,

View File

@ -420,7 +420,7 @@ void EDBM_project_snap_verts(
ED_view3d_init_mats_rv3d(obedit, region->regiondata);
struct SnapObjectContext *snap_context = ED_transform_snap_object_context_create_view3d(
bmain, CTX_data_scene(C), depsgraph, 0, region, CTX_wm_view3d(C));
bmain, CTX_data_scene(C), 0, region, CTX_wm_view3d(C));
BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
if (BM_elem_flag_test(eve, BM_ELEM_SELECT)) {
@ -428,6 +428,7 @@ void EDBM_project_snap_verts(
if (ED_view3d_project_float_object(region, eve->co, mval, V3D_PROJ_TEST_NOP) ==
V3D_PROJ_RET_OK) {
if (ED_transform_snap_object_project_view3d(snap_context,
depsgraph,
SCE_SNAP_MODE_FACE,
&(const struct SnapObjectParams){
.snap_select = SNAP_NOT_ACTIVE,

View File

@ -5028,12 +5028,13 @@ void ED_view3d_cursor3d_position_rotation(bContext *C,
float ray_co[3];
struct SnapObjectContext *snap_context = ED_transform_snap_object_context_create_view3d(
bmain, scene, CTX_data_ensure_evaluated_depsgraph(C), 0, region, v3d);
bmain, scene, 0, region, v3d);
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),
SCE_SNAP_MODE_FACE,
&(const struct SnapObjectParams){
.snap_select = SNAP_ALL,

View File

@ -288,12 +288,7 @@ static void ruler_state_set(bContext *C, RulerInfo *ruler_info, int state)
else if (state == RULER_STATE_DRAG) {
memset(&ruler_info->drag_state_prev, 0x0, sizeof(ruler_info->drag_state_prev));
ruler_info->snap_context = ED_transform_snap_object_context_create_view3d(
bmain,
CTX_data_scene(C),
CTX_data_ensure_evaluated_depsgraph(C),
0,
ruler_info->region,
CTX_wm_view3d(C));
bmain, CTX_data_scene(C), 0, ruler_info->region, CTX_wm_view3d(C));
}
else {
BLI_assert(0);
@ -308,7 +303,8 @@ static void view3d_ruler_item_project(RulerInfo *ruler_info, float r_co[3], cons
}
/* use for mousemove events */
static bool view3d_ruler_item_mousemove(RulerInfo *ruler_info,
static bool view3d_ruler_item_mousemove(struct Depsgraph *depsgraph,
RulerInfo *ruler_info,
RulerItem *ruler_item,
const int mval[2],
const bool do_thickness,
@ -336,6 +332,7 @@ static bool view3d_ruler_item_mousemove(RulerInfo *ruler_info,
co_other = ruler_item->co[inter->co_index == 0 ? 2 : 0];
if (ED_transform_snap_object_project_view3d(ruler_info->snap_context,
depsgraph,
SCE_SNAP_MODE_FACE,
&(const struct SnapObjectParams){
.snap_select = SNAP_ALL,
@ -350,6 +347,7 @@ static bool view3d_ruler_item_mousemove(RulerInfo *ruler_info,
/* add some bias */
madd_v3_v3v3fl(ray_start, co, ray_normal, eps_bias);
ED_transform_snap_object_project_ray(ruler_info->snap_context,
depsgraph,
&(const struct SnapObjectParams){
.snap_select = SNAP_ALL,
.use_object_edit_cage = true,
@ -379,6 +377,7 @@ static bool view3d_ruler_item_mousemove(RulerInfo *ruler_info,
if (ED_transform_snap_object_project_view3d(
ruler_info->snap_context,
depsgraph,
(SCE_SNAP_MODE_VERTEX | SCE_SNAP_MODE_EDGE | SCE_SNAP_MODE_FACE |
SCE_SNAP_MODE_EDGE_MIDPOINT | SCE_SNAP_MODE_EDGE_PERPENDICULAR),
&(const struct SnapObjectParams){
@ -922,8 +921,9 @@ static int gizmo_ruler_modal(bContext *C,
if (do_cursor_update) {
if (ruler_info->state == RULER_STATE_DRAG) {
struct Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C);
if (view3d_ruler_item_mousemove(
ruler_info, ruler_item, event->mval, do_thickness, do_snap)) {
depsgraph, ruler_info, ruler_item, event->mval, do_thickness, do_snap)) {
do_draw = true;
}
}
@ -976,7 +976,9 @@ static int gizmo_ruler_invoke(bContext *C, wmGizmo *gz, const wmEvent *event)
}
/* update the new location */
view3d_ruler_item_mousemove(ruler_info, ruler_item_pick, event->mval, false, false);
struct Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C);
view3d_ruler_item_mousemove(
depsgraph, ruler_info, ruler_item_pick, event->mval, false, false);
}
}
else {
@ -1126,9 +1128,10 @@ static int view3d_ruler_add_invoke(bContext *C, wmOperator *op, const wmEvent *e
RulerInfo *ruler_info = gzgroup->customdata;
RulerInteraction *inter = ruler_item->gz.interaction_data;
if (use_depth) {
struct Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C);
/* snap the first point added, not essential but handy */
inter->co_index = 0;
view3d_ruler_item_mousemove(ruler_info, ruler_item, event->mval, false, true);
view3d_ruler_item_mousemove(depsgraph, ruler_info, ruler_item, event->mval, false, true);
copy_v3_v3(inter->drag_start_co, ruler_item->co[inter->co_index]);
}
else {

View File

@ -375,6 +375,7 @@ static bool walk_floor_distance_get(RegionView3D *rv3d,
add_v3_v3(ray_start, dvec_tmp);
ret = ED_transform_snap_object_project_ray(walk->snap_context,
walk->depsgraph,
&(const struct SnapObjectParams){
.snap_select = SNAP_ALL,
},
@ -413,6 +414,7 @@ static bool walk_ray_cast(RegionView3D *rv3d,
normalize_v3(ray_normal);
ret = ED_transform_snap_object_project_ray(walk->snap_context,
walk->depsgraph,
&(const struct SnapObjectParams){
.snap_select = SNAP_ALL,
},
@ -551,7 +553,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(
bmain, walk->scene, CTX_data_ensure_evaluated_depsgraph(C), 0, walk->region, walk->v3d);
bmain, walk->scene, 0, walk->region, walk->v3d);
walk->v3d_camera_control = ED_view3d_cameracontrol_acquire(
walk->depsgraph,

View File

@ -377,6 +377,7 @@ void applyProject(TransInfo *t)
V3D_PROJ_RET_OK) {
if (ED_transform_snap_object_project_view3d(
t->tsnap.object_context,
t->depsgraph,
SCE_SNAP_MODE_FACE,
&(const struct SnapObjectParams){
.snap_select = t->tsnap.modeSelect,
@ -686,7 +687,7 @@ static void initSnappingMode(TransInfo *t)
if (t->spacetype == SPACE_VIEW3D) {
if (t->tsnap.object_context == NULL) {
t->tsnap.object_context = ED_transform_snap_object_context_create_view3d(
bmain, t->scene, t->depsgraph, 0, t->region, t->view);
bmain, t->scene, 0, t->region, t->view);
ED_transform_snap_object_context_set_editmesh_callbacks(
t->tsnap.object_context,
@ -1365,6 +1366,7 @@ short snapObjectsTransform(
float *target = (t->tsnap.status & TARGET_INIT) ? t->tsnap.snapTarget : t->center_global;
return ED_transform_snap_object_project_view3d_ex(
t->tsnap.object_context,
t->depsgraph,
t->scene->toolsettings->snap_mode,
&(const struct SnapObjectParams){
.snap_select = t->tsnap.modeSelect,
@ -1389,17 +1391,26 @@ short snapObjectsTransform(
/** \name Peeling
* \{ */
bool peelObjectsSnapContext(SnapObjectContext *sctx,
const float mval[2],
const struct SnapObjectParams *params,
const bool use_peel_object,
/* return args */
float r_loc[3],
float r_no[3],
float *r_thickness)
bool peelObjectsTransform(TransInfo *t,
const float mval[2],
const bool use_peel_object,
/* return args */
float r_loc[3],
float r_no[3],
float *r_thickness)
{
ListBase depths_peel = {0};
ED_transform_snap_object_project_all_view3d_ex(sctx, params, mval, -1.0f, false, &depths_peel);
ED_transform_snap_object_project_all_view3d_ex(
t->tsnap.object_context,
t->depsgraph,
&(const struct SnapObjectParams){
.snap_select = t->tsnap.modeSelect,
.use_object_edit_cage = (t->flag & T_EDIT) != 0,
},
mval,
-1.0f,
false,
&depths_peel);
if (!BLI_listbase_is_empty(&depths_peel)) {
/* At the moment we only use the hits of the first object */
@ -1455,26 +1466,6 @@ bool peelObjectsSnapContext(SnapObjectContext *sctx,
return false;
}
bool peelObjectsTransform(TransInfo *t,
const float mval[2],
const bool use_peel_object,
/* return args */
float r_loc[3],
float r_no[3],
float *r_thickness)
{
return peelObjectsSnapContext(t->tsnap.object_context,
mval,
&(const struct SnapObjectParams){
.snap_select = t->tsnap.modeSelect,
.use_object_edit_cage = (t->flag & T_EDIT) != 0,
},
use_peel_object,
r_loc,
r_no,
r_thickness);
}
/** \} */
/* -------------------------------------------------------------------- */

View File

@ -35,14 +35,6 @@ bool peelObjectsTransform(struct TransInfo *t,
float r_loc[3],
float r_no[3],
float *r_thickness);
bool peelObjectsSnapContext(struct SnapObjectContext *sctx,
const float mval[2],
const struct SnapObjectParams *params,
const bool use_peel_object,
/* return args */
float r_loc[3],
float r_no[3],
float *r_thickness);
short snapObjectsTransform(struct TransInfo *t,
const float mval[2],

View File

@ -112,7 +112,6 @@ typedef struct SnapObjectData {
struct SnapObjectContext {
Main *bmain;
Scene *scene;
Depsgraph *depsgraph;
int flag;
@ -373,11 +372,12 @@ typedef void (*IterSnapObjsCallback)(SnapObjectContext *sctx,
* \param snap_select: from enum #eSnapSelect.
*/
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(sctx->depsgraph);
ViewLayer *view_layer = DEG_get_input_view_layer(depsgraph);
const View3D *v3d = sctx->v3d_data.v3d;
const eSnapSelect snap_select = params->snap_select;
const bool use_object_edit_cage = params->use_object_edit_cage;
@ -408,10 +408,10 @@ static void iter_snap_objects(SnapObjectContext *sctx,
}
}
Object *obj_eval = DEG_get_evaluated_object(sctx->depsgraph, base->object);
Object *obj_eval = DEG_get_evaluated_object(depsgraph, base->object);
if (obj_eval->transflag & OB_DUPLI) {
DupliObject *dupli_ob;
ListBase *lb = object_duplilist(sctx->depsgraph, sctx->scene, obj_eval);
ListBase *lb = object_duplilist(depsgraph, sctx->scene, obj_eval);
for (dupli_ob = lb->first; dupli_ob; dupli_ob = dupli_ob->next) {
sob_callback(
sctx, use_object_edit_cage, use_backface_culling, dupli_ob->ob, dupli_ob->mat, data);
@ -1113,6 +1113,7 @@ static void raycast_obj_cb(SnapObjectContext *sctx,
* \param r_hit_list: List of #SnapObjectHitDepth (caller must free).
*/
static bool raycastObjects(SnapObjectContext *sctx,
Depsgraph *depsgraph,
const struct SnapObjectParams *params,
const float ray_start[3],
const float ray_dir[3],
@ -1141,7 +1142,7 @@ static bool raycastObjects(SnapObjectContext *sctx,
.ret = false,
};
iter_snap_objects(sctx, params, raycast_obj_cb, &data);
iter_snap_objects(sctx, depsgraph, params, raycast_obj_cb, &data);
return data.ret;
}
@ -2813,6 +2814,7 @@ static void sanp_obj_cb(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 */
@ -2835,7 +2837,7 @@ static short snapObjectsRay(SnapObjectContext *sctx,
.ret = 0,
};
iter_snap_objects(sctx, params, sanp_obj_cb, &data);
iter_snap_objects(sctx, depsgraph, params, sanp_obj_cb, &data);
return data.ret;
}
@ -2846,10 +2848,7 @@ static short snapObjectsRay(SnapObjectContext *sctx,
/** \name Public Object Snapping API
* \{ */
SnapObjectContext *ED_transform_snap_object_context_create(Main *bmain,
Scene *scene,
Depsgraph *depsgraph,
int flag)
SnapObjectContext *ED_transform_snap_object_context_create(Main *bmain, Scene *scene, int flag)
{
SnapObjectContext *sctx = MEM_callocN(sizeof(*sctx), __func__);
@ -2857,7 +2856,6 @@ SnapObjectContext *ED_transform_snap_object_context_create(Main *bmain,
sctx->bmain = bmain;
sctx->scene = scene;
sctx->depsgraph = depsgraph;
sctx->cache.object_map = BLI_ghash_ptr_new(__func__);
/* Initialize as needed (edit-mode only). */
@ -2869,13 +2867,12 @@ SnapObjectContext *ED_transform_snap_object_context_create(Main *bmain,
SnapObjectContext *ED_transform_snap_object_context_create_view3d(Main *bmain,
Scene *scene,
Depsgraph *depsgraph,
int flag,
/* extra args for view3d */
const ARegion *region,
const View3D *v3d)
{
SnapObjectContext *sctx = ED_transform_snap_object_context_create(bmain, scene, depsgraph, flag);
SnapObjectContext *sctx = ED_transform_snap_object_context_create(bmain, scene, flag);
sctx->use_v3d = true;
sctx->v3d_data.region = region;
@ -2916,6 +2913,7 @@ void ED_transform_snap_object_context_set_editmesh_callbacks(
}
bool ED_transform_snap_object_project_ray_ex(SnapObjectContext *sctx,
Depsgraph *depsgraph,
const struct SnapObjectParams *params,
const float ray_start[3],
const float ray_normal[3],
@ -2926,8 +2924,18 @@ bool ED_transform_snap_object_project_ray_ex(SnapObjectContext *sctx,
Object **r_ob,
float r_obmat[4][4])
{
return raycastObjects(
sctx, params, ray_start, ray_normal, ray_depth, r_loc, r_no, r_index, r_ob, r_obmat, NULL);
return raycastObjects(sctx,
depsgraph,
params,
ray_start,
ray_normal,
ray_depth,
r_loc,
r_no,
r_index,
r_ob,
r_obmat,
NULL);
}
/**
@ -2938,6 +2946,7 @@ bool ED_transform_snap_object_project_ray_ex(SnapObjectContext *sctx,
* \param r_hit_list: List of #SnapObjectHitDepth (caller must free).
*/
bool ED_transform_snap_object_project_ray_all(SnapObjectContext *sctx,
Depsgraph *depsgraph,
const struct SnapObjectParams *params,
const float ray_start[3],
const float ray_normal[3],
@ -2953,8 +2962,18 @@ bool ED_transform_snap_object_project_ray_all(SnapObjectContext *sctx,
float ray_depth_prev = ray_depth;
#endif
bool retval = raycastObjects(
sctx, params, ray_start, ray_normal, &ray_depth, NULL, NULL, NULL, NULL, NULL, r_hit_list);
bool retval = raycastObjects(sctx,
depsgraph,
params,
ray_start,
ray_normal,
&ray_depth,
NULL,
NULL,
NULL,
NULL,
NULL,
r_hit_list);
/* meant to be readonly for 'all' hits, ensure it is */
#ifdef DEBUG
@ -2976,6 +2995,7 @@ bool ED_transform_snap_object_project_ray_all(SnapObjectContext *sctx,
* \return Snap success
*/
static bool transform_snap_context_project_ray_impl(SnapObjectContext *sctx,
Depsgraph *depsgraph,
const struct SnapObjectParams *params,
const float ray_start[3],
const float ray_normal[3],
@ -2987,12 +3007,13 @@ static bool transform_snap_context_project_ray_impl(SnapObjectContext *sctx,
/* try snap edge, then face if it fails */
ret = ED_transform_snap_object_project_ray_ex(
sctx, params, ray_start, ray_normal, ray_depth, r_co, r_no, NULL, NULL, NULL);
sctx, depsgraph, 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 struct SnapObjectParams *params,
const float ray_origin[3],
const float ray_direction[3],
@ -3007,11 +3028,12 @@ bool ED_transform_snap_object_project_ray(SnapObjectContext *sctx,
}
return transform_snap_context_project_ray_impl(
sctx, params, ray_origin, ray_direction, ray_depth, r_co, r_no);
sctx, depsgraph, 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 unsigned short snap_to_flag,
const struct SnapObjectParams *params,
const float mval[2],
@ -3041,7 +3063,7 @@ static short transform_snap_context_project_view3d_mixed_impl(
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(sctx->depsgraph,
if (!ED_view3d_win_to_ray_clipped_ex(depsgraph,
sctx->v3d_data.region,
sctx->v3d_data.v3d,
mval,
@ -3054,8 +3076,18 @@ static short transform_snap_context_project_view3d_mixed_impl(
float dummy_ray_depth = BVH_RAYCAST_DIST_MAX;
has_hit = raycastObjects(
sctx, params, ray_start, ray_normal, &dummy_ray_depth, loc, no, &index, &ob, obmat, NULL);
has_hit = raycastObjects(sctx,
depsgraph,
params,
ray_start,
ray_normal,
&dummy_ray_depth,
loc,
no,
&index,
&ob,
obmat,
NULL);
if (has_hit && (snap_to_flag & SCE_SNAP_MODE_FACE)) {
retval = SCE_SNAP_MODE_FACE;
@ -3129,7 +3161,8 @@ static short transform_snap_context_project_view3d_mixed_impl(
snapdata.has_occlusion_plane = true;
}
elem_test = snapObjectsRay(sctx, &snapdata, params, &dist_px_tmp, loc, no, &index, &ob, obmat);
elem_test = snapObjectsRay(
sctx, depsgraph, &snapdata, params, &dist_px_tmp, loc, no, &index, &ob, obmat);
if (elem_test) {
elem = elem_test;
}
@ -3176,6 +3209,7 @@ static short transform_snap_context_project_view3d_mixed_impl(
}
short ED_transform_snap_object_project_view3d_ex(SnapObjectContext *sctx,
Depsgraph *depsgraph,
const unsigned short snap_to,
const struct SnapObjectParams *params,
const float mval[2],
@ -3187,8 +3221,18 @@ short ED_transform_snap_object_project_view3d_ex(SnapObjectContext *sctx,
Object **r_ob,
float r_obmat[4][4])
{
return transform_snap_context_project_view3d_mixed_impl(
sctx, snap_to, params, mval, prev_co, dist_px, r_loc, r_no, r_index, r_ob, r_obmat);
return transform_snap_context_project_view3d_mixed_impl(sctx,
depsgraph,
snap_to,
params,
mval,
prev_co,
dist_px,
r_loc,
r_no,
r_index,
r_ob,
r_obmat);
}
/**
@ -3205,6 +3249,7 @@ short ED_transform_snap_object_project_view3d_ex(SnapObjectContext *sctx,
* \return Snap success
*/
bool ED_transform_snap_object_project_view3d(SnapObjectContext *sctx,
Depsgraph *depsgraph,
const unsigned short snap_to,
const struct SnapObjectParams *params,
const float mval[2],
@ -3213,14 +3258,25 @@ bool ED_transform_snap_object_project_view3d(SnapObjectContext *sctx,
float r_loc[3],
float r_no[3])
{
return ED_transform_snap_object_project_view3d_ex(
sctx, snap_to, params, mval, prev_co, dist_px, r_loc, r_no, NULL, NULL, NULL) != 0;
return ED_transform_snap_object_project_view3d_ex(sctx,
depsgraph,
snap_to,
params,
mval,
prev_co,
dist_px,
r_loc,
r_no,
NULL,
NULL,
NULL) != 0;
}
/**
* see: #ED_transform_snap_object_project_ray_all
*/
bool ED_transform_snap_object_project_all_view3d_ex(SnapObjectContext *sctx,
Depsgraph *depsgraph,
const struct SnapObjectParams *params,
const float mval[2],
float ray_depth,
@ -3229,7 +3285,7 @@ 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(sctx->depsgraph,
if (!ED_view3d_win_to_ray_clipped_ex(depsgraph,
sctx->v3d_data.region,
sctx->v3d_data.v3d,
mval,
@ -3241,7 +3297,7 @@ bool ED_transform_snap_object_project_all_view3d_ex(SnapObjectContext *sctx,
}
return ED_transform_snap_object_project_ray_all(
sctx, params, ray_start, ray_normal, ray_depth, sort, r_hit_list);
sctx, depsgraph, params, ray_start, ray_normal, ray_depth, sort, r_hit_list);
}
/** \} */

View File

@ -161,9 +161,10 @@ static void rna_Scene_ray_cast(Scene *scene,
normalize_v3(direction);
Depsgraph *depsgraph = BKE_scene_get_depsgraph(bmain, scene, view_layer, true);
SnapObjectContext *sctx = ED_transform_snap_object_context_create(bmain, scene, depsgraph, 0);
SnapObjectContext *sctx = ED_transform_snap_object_context_create(bmain, scene, 0);
bool ret = ED_transform_snap_object_project_ray_ex(sctx,
depsgraph,
&(const struct SnapObjectParams){
.snap_select = SNAP_ALL,
},