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:
parent
3a10c61a7d
commit
a922a097ef
|
@ -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,
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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,
|
||||
},
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
/** \} */
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
|
|
|
@ -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],
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
/** \} */
|
||||
|
|
|
@ -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,
|
||||
},
|
||||
|
|
Loading…
Reference in New Issue