From e370806b38388bb501ab99f9eb65fe2ff10d9133 Mon Sep 17 00:00:00 2001 From: Germano Cavalcante Date: Fri, 3 Jun 2016 16:54:58 +1000 Subject: Cleanup & simplify snapping functions - the name of the enumerator `SNAP_NOT_OBEDIT` was changed to `SNAP_NOT_ACTIVE`. - the parameter `snap_to_flag` was moved to outside `SnapObjectParams`. - the member `use_object_edit` was renamed to `use_object_edit_cage`. - added the arg `params` in `ED_transform_snap_object_project_ray`. - simplifications in the loop of the function `snapObjectsRay`. --- source/blender/editors/transform/transform_snap.c | 39 +++---- .../editors/transform/transform_snap_object.c | 113 ++++++++------------- 2 files changed, 66 insertions(+), 86 deletions(-) (limited to 'source/blender/editors/transform') diff --git a/source/blender/editors/transform/transform_snap.c b/source/blender/editors/transform/transform_snap.c index e72db4105a4..e1cf7436236 100644 --- a/source/blender/editors/transform/transform_snap.c +++ b/source/blender/editors/transform/transform_snap.c @@ -324,7 +324,7 @@ void applyProject(TransInfo *t) if (ED_view3d_project_float_global(t->ar, iloc, mval_fl, V3D_PROJ_TEST_NOP) == V3D_PROJ_RET_OK) { if (snapObjectsTransform( - t, mval_fl, t->tsnap.modeSelect, &dist_px, + t, mval_fl, &dist_px, loc, no)) { // if (t->flag & (T_EDIT|T_POSE)) { @@ -553,10 +553,10 @@ static void initSnappingMode(TransInfo *t) { /* Exclude editmesh if using proportional edit */ if ((obedit->type == OB_MESH) && (t->flag & T_PROP_EDIT)) { - t->tsnap.modeSelect = SNAP_NOT_OBEDIT; + t->tsnap.modeSelect = SNAP_NOT_ACTIVE; } else { - t->tsnap.modeSelect = t->tsnap.snap_self ? SNAP_ALL : SNAP_NOT_OBEDIT; + t->tsnap.modeSelect = t->tsnap.snap_self ? SNAP_ALL : SNAP_NOT_ACTIVE; } } /* Particles edit mode*/ @@ -964,14 +964,14 @@ static void CalcSnapGeometry(TransInfo *t, float *UNUSED(vec)) if (t->tsnap.mode == SCE_SNAP_MODE_VOLUME) { found = peelObjectsTransform( - t, mval, t->tsnap.modeSelect, + t, mval, (t->settings->snap_flag & SCE_SNAP_PEEL_OBJECT) != 0, loc, no, NULL); } else { zero_v3(no); /* objects won't set this */ found = snapObjectsTransform( - t, mval, t->tsnap.modeSelect, &dist_px, + t, mval, &dist_px, loc, no); } @@ -1207,17 +1207,16 @@ static void TargetSnapClosest(TransInfo *t) } bool snapObjectsTransform( - TransInfo *t, const float mval[2], SnapSelect snap_select, + TransInfo *t, const float mval[2], float *dist_px, float r_loc[3], float r_no[3]) { return ED_transform_snap_object_project_view3d_ex( t->tsnap.object_context, + t->scene->toolsettings->snap_mode, &(const struct SnapObjectParams){ - .snap_select = snap_select, - .snap_to = t->scene->toolsettings->snap_mode, - .use_object_edit = (t->flag & T_EDIT) != 0, - .use_object_active = (t->options & CTX_GPENCIL_STROKES) == 0, + .snap_select = ((t->options & CTX_GPENCIL_STROKES) != 0) ? SNAP_NOT_ACTIVE : t->tsnap.modeSelect, + .use_object_edit_cage = (t->flag & T_EDIT) != 0, }, mval, dist_px, NULL, r_loc, r_no, NULL); @@ -1228,18 +1227,16 @@ bool snapObjectsTransform( bool peelObjectsSnapContext( SnapObjectContext *sctx, - const float mval[2], SnapSelect snap_select, bool use_peel_object, + 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) { ListBase depths_peel = {0}; ED_transform_snap_object_project_all_view3d_ex( sctx, - &(const struct SnapObjectParams){ - .snap_to = SCE_SNAP_MODE_FACE, - .snap_select = snap_select, - .use_object_edit = true, - }, + params, mval, -1.0f, false, &depths_peel); @@ -1299,13 +1296,19 @@ bool peelObjectsSnapContext( bool peelObjectsTransform( TransInfo *t, - const float mval[2], SnapSelect snap_select, bool use_peel_object, + 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, snap_select, use_peel_object, + mval, + &(const struct SnapObjectParams){ + .snap_select = ((t->options & CTX_GPENCIL_STROKES) != 0) ? SNAP_NOT_ACTIVE : t->tsnap.modeSelect, + .use_object_edit_cage = (t->flag & T_EDIT) != 0, + }, + use_peel_object, r_loc, r_no, r_thickness); } diff --git a/source/blender/editors/transform/transform_snap_object.c b/source/blender/editors/transform/transform_snap_object.c index 4a79310b753..d7486372c36 100644 --- a/source/blender/editors/transform/transform_snap_object.c +++ b/source/blender/editors/transform/transform_snap_object.c @@ -1314,39 +1314,28 @@ static bool snapObject( static bool snapObjectsRay( SnapObjectContext *sctx, - SnapSelect snap_select, const short snap_to, + const unsigned short snap_to, const SnapSelect snap_select, + const bool use_object_edit_cage, const float mval[2], float *dist_px, - /* special handling of active and edit objects */ - Base *base_act, Object *obedit, const float ray_start[3], const float ray_normal[3], const float ray_origin[3], float *ray_depth, /* return args */ float r_loc[3], float r_no[3], int *r_index, Object **r_ob, float r_obmat[4][4], ListBase *r_hit_list) { - Base *base; bool retval = false; - bool snap_obedit_first = snap_select == SNAP_ALL && obedit; unsigned int ob_index = 0; - - if (snap_obedit_first) { - Object *ob = obedit; - - retval |= snapObject( - sctx, ob, ob->obmat, true, snap_to, - mval, dist_px, ob_index++, - ray_start, ray_normal, ray_origin, ray_depth, - r_loc, r_no, r_index, r_ob, r_obmat, r_hit_list); - } + Object *obedit = use_object_edit_cage ? sctx->scene->obedit : NULL; /* Need an exception for particle edit because the base is flagged with BA_HAS_RECALC_DATA * which makes the loop skip it, even the derived mesh will never change * * To solve that problem, we do it first as an exception. * */ - base = base_act; - if (base && base->object && base->object->mode & OB_MODE_PARTICLE_EDIT) { - Object *ob = base->object; + Base *base_act = sctx->scene->basact; + if (base_act && base_act->object && base_act->object->mode & OB_MODE_PARTICLE_EDIT) { + Object *ob = base_act->object; + retval |= snapObject( sctx, ob, ob->obmat, false, snap_to, mval, dist_px, ob_index++, @@ -1354,16 +1343,25 @@ static bool snapObjectsRay( r_loc, r_no, r_index, r_ob, r_obmat, r_hit_list); } - for (base = sctx->scene->base.first; base != NULL; base = base->next) { + bool ignore_object_selected = false, ignore_object_active = false; + switch (snap_select) { + case SNAP_ALL: + break; + case SNAP_NOT_SELECTED: + ignore_object_selected = true; + break; + case SNAP_NOT_ACTIVE: + ignore_object_active = true; + break; + } + for (Base *base = sctx->scene->base.first; base != NULL; base = base->next) { if ((BASE_VISIBLE_BGMODE(sctx->v3d_data.v3d, sctx->scene, base)) && (base->flag & (BA_HAS_RECALC_OB | BA_HAS_RECALC_DATA)) == 0 && - ((snap_select == SNAP_NOT_SELECTED && (base->flag & (SELECT | BA_WAS_SEL)) == 0) || - (ELEM(snap_select, SNAP_ALL, SNAP_NOT_OBEDIT) && base != base_act))) + !((ignore_object_selected && (base->flag & (SELECT | BA_WAS_SEL))) || + (ignore_object_active && base == base_act))) { Object *ob = base->object; - Object *ob_snap = ob; - bool use_obedit = false; if (ob->transflag & OB_DUPLI) { DupliObject *dupli_ob; @@ -1383,19 +1381,8 @@ static bool snapObjectsRay( free_object_duplilist(lb); } - if (obedit) { - if ((ob == obedit) && - (snap_obedit_first || (snap_select == SNAP_NOT_OBEDIT))) - { - continue; - } - - if (ob->data == obedit->data) { - /* for linked objects, use the same object but a different matrix */ - use_obedit = true; - ob_snap = obedit; - } - } + bool use_obedit = (obedit != NULL) && (ob->data == obedit->data); + Object *ob_snap = use_obedit ? obedit : ob; retval |= snapObject( sctx, ob_snap, ob->obmat, use_obedit, snap_to, @@ -1500,22 +1487,18 @@ void ED_transform_snap_object_context_set_editmesh_callbacks( bool ED_transform_snap_object_project_ray_ex( SnapObjectContext *sctx, + const unsigned short snap_to, const struct SnapObjectParams *params, const float ray_start[3], const float ray_normal[3], float *ray_depth, float r_loc[3], float r_no[3], int *r_index, Object **r_ob, float r_obmat[4][4]) { - Base *base_act = params->use_object_active ? sctx->scene->basact : NULL; - Object *obedit = params->use_object_edit ? sctx->scene->obedit : NULL; - return snapObjectsRay( sctx, - params->snap_select, params->snap_to, + snap_to, params->snap_select, params->use_object_edit_cage, NULL, NULL, - base_act, obedit, ray_start, ray_normal, ray_start, ray_depth, - r_loc, r_no, r_index, - r_ob, r_obmat, NULL); + r_loc, r_no, r_index, r_ob, r_obmat, NULL); } /** @@ -1527,14 +1510,12 @@ bool ED_transform_snap_object_project_ray_ex( */ bool ED_transform_snap_object_project_ray_all( SnapObjectContext *sctx, + const unsigned short snap_to, const struct SnapObjectParams *params, const float ray_start[3], const float ray_normal[3], float ray_depth, bool sort, ListBase *r_hit_list) { - Base *base_act = params->use_object_active ? sctx->scene->basact : NULL; - Object *obedit = params->use_object_edit ? sctx->scene->obedit : NULL; - if (ray_depth == -1.0f) { ray_depth = BVH_RAYCAST_DIST_MAX; } @@ -1545,9 +1526,8 @@ bool ED_transform_snap_object_project_ray_all( bool retval = snapObjectsRay( sctx, - params->snap_select, params->snap_to, + snap_to, params->snap_select, params->use_object_edit_cage, NULL, NULL, - base_act, obedit, ray_start, ray_normal, ray_start, &ray_depth, NULL, NULL, NULL, NULL, NULL, r_hit_list); @@ -1573,6 +1553,7 @@ bool ED_transform_snap_object_project_ray_all( */ static bool transform_snap_context_project_ray_impl( SnapObjectContext *sctx, + const struct SnapObjectParams *params, const float ray_start[3], const float ray_normal[3], float *ray_depth, float r_co[3], float r_no[3]) { @@ -1581,11 +1562,8 @@ static bool transform_snap_context_project_ray_impl( /* try snap edge, then face if it fails */ ret = ED_transform_snap_object_project_ray_ex( sctx, - &(const struct SnapObjectParams){ - .snap_select = SNAP_ALL, - .snap_to = SCE_SNAP_MODE_FACE, - .use_object_edit = (sctx->scene->obedit != NULL), - }, + SCE_SNAP_MODE_FACE, + params, ray_start, ray_normal, ray_depth, r_co, r_no, NULL, NULL, NULL); @@ -1595,6 +1573,7 @@ static bool transform_snap_context_project_ray_impl( bool ED_transform_snap_object_project_ray( SnapObjectContext *sctx, + const struct SnapObjectParams *params, const float ray_origin[3], const float ray_direction[3], float *ray_depth, float r_co[3], float r_no[3]) { @@ -1611,12 +1590,14 @@ bool ED_transform_snap_object_project_ray( return transform_snap_context_project_ray_impl( sctx, + params, ray_origin, ray_direction, ray_depth, r_co, r_no); } static bool transform_snap_context_project_view3d_mixed_impl( SnapObjectContext *sctx, + const unsigned short snap_to_flag, const struct SnapObjectParams *params, const float mval[2], float *dist_px, bool use_depth, @@ -1632,22 +1613,18 @@ static bool transform_snap_context_project_view3d_mixed_impl( const int elem_type[3] = {SCE_SNAP_MODE_VERTEX, SCE_SNAP_MODE_EDGE, SCE_SNAP_MODE_FACE}; - BLI_assert(params->snap_to_flag != 0); - BLI_assert((params->snap_to_flag & ~(1 | 2 | 4)) == 0); - - struct SnapObjectParams params_temp = *params; + BLI_assert(snap_to_flag != 0); + BLI_assert((snap_to_flag & ~(1 | 2 | 4)) == 0); for (int i = 0; i < 3; i++) { - if ((params->snap_to_flag & (1 << i)) && (is_hit == false || use_depth)) { + if ((snap_to_flag & (1 << i)) && (is_hit == false || use_depth)) { if (use_depth == false) { ray_depth = BVH_RAYCAST_DIST_MAX; } - params_temp.snap_to = elem_type[i]; - if (ED_transform_snap_object_project_view3d( sctx, - ¶ms_temp, + elem_type[i], params, mval, dist_px, &ray_depth, r_co, r_no)) { @@ -1674,6 +1651,7 @@ static bool transform_snap_context_project_view3d_mixed_impl( */ bool ED_transform_snap_object_project_view3d_mixed( SnapObjectContext *sctx, + const unsigned short snap_to_flag, const struct SnapObjectParams *params, const float mval_fl[2], float *dist_px, bool use_depth, @@ -1681,13 +1659,14 @@ bool ED_transform_snap_object_project_view3d_mixed( { return transform_snap_context_project_view3d_mixed_impl( sctx, - params, + snap_to_flag, params, mval_fl, dist_px, use_depth, r_co, r_no); } bool ED_transform_snap_object_project_view3d_ex( SnapObjectContext *sctx, + const unsigned short snap_to, const struct SnapObjectParams *params, const float mval[2], float *dist_px, float *ray_depth, @@ -1708,19 +1687,17 @@ bool ED_transform_snap_object_project_view3d_ex( return false; } - Base *base_act = params->use_object_active ? sctx->scene->basact : NULL; - Object *obedit = params->use_object_edit ? sctx->scene->obedit : NULL; return snapObjectsRay( sctx, - params->snap_select, params->snap_to, + snap_to, params->snap_select, params->use_object_edit_cage, mval, dist_px, - base_act, obedit, ray_start, ray_normal, ray_orgigin, ray_depth, r_loc, r_no, r_index, NULL, NULL, NULL); } bool ED_transform_snap_object_project_view3d( SnapObjectContext *sctx, + const unsigned short snap_to, const struct SnapObjectParams *params, const float mval[2], float *dist_px, float *ray_depth, @@ -1728,6 +1705,7 @@ bool ED_transform_snap_object_project_view3d( { return ED_transform_snap_object_project_view3d_ex( sctx, + snap_to, params, mval, dist_px, ray_depth, @@ -1746,8 +1724,6 @@ bool ED_transform_snap_object_project_all_view3d_ex( { float ray_start[3], ray_normal[3]; - BLI_assert(params->snap_to == SCE_SNAP_MODE_FACE); - if (!ED_view3d_win_to_ray_ex( sctx->v3d_data.ar, sctx->v3d_data.v3d, mval, NULL, ray_normal, ray_start, true)) @@ -1757,6 +1733,7 @@ bool ED_transform_snap_object_project_all_view3d_ex( return ED_transform_snap_object_project_ray_all( sctx, + SCE_SNAP_MODE_FACE, params, ray_start, ray_normal, ray_depth, sort, r_hit_list); -- cgit v1.2.3