Fix T46451: edge slide even and flipped not available in redo popup.

This commit is contained in:
Brecht Van Lommel 2015-10-12 16:44:07 +02:00
parent 591f4549c9
commit ee688e24a7
Notes: blender-bot 2023-03-24 17:05:22 +01:00
Referenced by issue #46451, Edge Slide can not be setted
4 changed files with 69 additions and 53 deletions

View File

@ -168,11 +168,12 @@ static void applyBoneEnvelope(TransInfo *t, const int mval[2]);
static void initBoneRoll(TransInfo *t);
static void applyBoneRoll(TransInfo *t, const int mval[2]);
static void initEdgeSlide_ex(TransInfo *t, bool use_double_side);
static void initEdgeSlide_ex(TransInfo *t, bool use_double_side, bool use_even, bool flipped);
static void initEdgeSlide(TransInfo *t);
static eRedrawFlag handleEventEdgeSlide(TransInfo *t, const struct wmEvent *event);
static void applyEdgeSlide(TransInfo *t, const int mval[2]);
static void initVertSlide_ex(TransInfo *t, bool use_even, bool flipped);
static void initVertSlide(TransInfo *t);
static eRedrawFlag handleEventVertSlide(TransInfo *t, const struct wmEvent *event);
static void applyVertSlide(TransInfo *t, const int mval[2]);
@ -2229,12 +2230,18 @@ bool initTransform(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve
case TFM_EDGE_SLIDE:
{
const bool use_double_side = (op ? !RNA_boolean_get(op->ptr, "single_side") : true);
initEdgeSlide_ex(t, use_double_side);
const bool use_even = (op ? RNA_boolean_get(op->ptr, "use_even") : false);
const bool flipped = (op ? RNA_boolean_get(op->ptr, "flipped") : false);
initEdgeSlide_ex(t, use_double_side, use_even, flipped);
break;
}
case TFM_VERT_SLIDE:
initVertSlide(t);
{
const bool use_even = (op ? RNA_boolean_get(op->ptr, "use_even") : false);
const bool flipped = (op ? RNA_boolean_get(op->ptr, "flipped") : false);
initVertSlide_ex(t, use_even, flipped);
break;
}
case TFM_BONE_ROLL:
initBoneRoll(t);
break;
@ -5973,7 +5980,7 @@ static void calcEdgeSlide_mval_range(
}
}
static void calcEdgeSlide_non_proportional(
static void calcEdgeSlide_even(
TransInfo *t, EdgeSlideData *sld, const float mval[2])
{
TransDataEdgeSlideVert *sv = sld->sv;
@ -6019,7 +6026,7 @@ static void calcEdgeSlide_non_proportional(
}
}
static bool createEdgeSlideVerts_double_side(TransInfo *t)
static bool createEdgeSlideVerts_double_side(TransInfo *t, bool use_even, bool flipped)
{
BMEditMesh *em = BKE_editmesh_from_object(t->obedit);
BMesh *bm = em->bm;
@ -6038,9 +6045,9 @@ static bool createEdgeSlideVerts_double_side(TransInfo *t)
slide_origdata_init_flag(t, &sld->orig_data);
sld->is_proportional = true;
sld->use_even = use_even;
sld->curr_sv_index = 0;
sld->flipped_vtx = false;
sld->flipped = flipped;
/*ensure valid selection*/
BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
@ -6346,7 +6353,7 @@ static bool createEdgeSlideVerts_double_side(TransInfo *t)
slide_origdata_create_data(t, &sld->orig_data, (TransDataGenericSlideVert *)sld->sv, sizeof(*sld->sv), sld->totsv);
if (rv3d) {
calcEdgeSlide_non_proportional(t, sld, mval);
calcEdgeSlide_even(t, sld, mval);
}
sld->em = em;
@ -6364,7 +6371,7 @@ static bool createEdgeSlideVerts_double_side(TransInfo *t)
* A simple version of #createEdgeSlideVerts_double_side
* Which assumes the longest unselected.
*/
static bool createEdgeSlideVerts_single_side(TransInfo *t)
static bool createEdgeSlideVerts_single_side(TransInfo *t, bool use_even, bool flipped)
{
BMEditMesh *em = BKE_editmesh_from_object(t->obedit);
BMesh *bm = em->bm;
@ -6389,10 +6396,10 @@ static bool createEdgeSlideVerts_single_side(TransInfo *t)
slide_origdata_init_flag(t, &sld->orig_data);
sld->is_proportional = true;
sld->use_even = use_even;
sld->curr_sv_index = 0;
/* heppans to be best for single-sided */
sld->flipped_vtx = true;
/* happens to be best for single-sided */
sld->flipped = !flipped;
/* ensure valid selection */
j = 0;
@ -6538,7 +6545,7 @@ static bool createEdgeSlideVerts_single_side(TransInfo *t)
slide_origdata_create_data(t, &sld->orig_data, (TransDataGenericSlideVert *)sld->sv, sizeof(*sld->sv), sld->totsv);
if (rv3d) {
calcEdgeSlide_non_proportional(t, sld, mval);
calcEdgeSlide_even(t, sld, mval);
}
sld->em = em;
@ -6586,7 +6593,7 @@ void freeEdgeSlideVerts(TransInfo *t)
t->customData = NULL;
}
static void initEdgeSlide_ex(TransInfo *t, bool use_double_side)
static void initEdgeSlide_ex(TransInfo *t, bool use_double_side, bool use_even, bool flipped)
{
EdgeSlideData *sld;
bool ok;
@ -6596,10 +6603,10 @@ static void initEdgeSlide_ex(TransInfo *t, bool use_double_side)
t->handleEvent = handleEventEdgeSlide;
if (use_double_side) {
ok = createEdgeSlideVerts_double_side(t);
ok = createEdgeSlideVerts_double_side(t, use_even, flipped);
}
else {
ok = createEdgeSlideVerts_single_side(t);
ok = createEdgeSlideVerts_single_side(t, use_even, flipped);
}
if (!ok) {
@ -6633,7 +6640,7 @@ static void initEdgeSlide_ex(TransInfo *t, bool use_double_side)
static void initEdgeSlide(TransInfo *t)
{
initEdgeSlide_ex(t, true);
initEdgeSlide_ex(t, true, false, false);
}
static eRedrawFlag handleEventEdgeSlide(struct TransInfo *t, const struct wmEvent *event)
@ -6645,16 +6652,14 @@ static eRedrawFlag handleEventEdgeSlide(struct TransInfo *t, const struct wmEven
switch (event->type) {
case EKEY:
if (event->val == KM_PRESS) {
sld->is_proportional = !sld->is_proportional;
sld->use_even = !sld->use_even;
calcEdgeSlideCustomPoints(t);
return TREDRAW_HARD;
}
break;
case FKEY:
if (event->val == KM_PRESS) {
if (sld->is_proportional == false) {
sld->flipped_vtx = !sld->flipped_vtx;
}
sld->flipped = !sld->flipped;
calcEdgeSlideCustomPoints(t);
return TREDRAW_HARD;
}
@ -6694,8 +6699,8 @@ static void drawEdgeSlide(TransInfo *t)
EdgeSlideData *sld = t->customData;
const bool is_clamp = !(t->flag & T_ALT_TRANSFORM);
/* Non-Prop mode */
if ((sld->is_proportional == false) || (is_clamp == false)) {
/* Even mode */
if ((sld->use_even == true) || (is_clamp == false)) {
View3D *v3d = t->view;
const float line_size = UI_GetThemeValuef(TH_OUTLINE_WIDTH) + 0.5f;
@ -6710,7 +6715,7 @@ static void drawEdgeSlide(TransInfo *t)
glMultMatrixf(t->obedit->obmat);
if (sld->is_proportional == false) {
if (sld->use_even == true) {
float co_a[3], co_b[3], co_mark[3];
TransDataEdgeSlideVert *curr_sv = &sld->sv[sld->curr_sv_index];
const float fac = (sld->perc + 1.0f) / 2.0f;
@ -6737,7 +6742,7 @@ static void drawEdgeSlide(TransInfo *t)
UI_ThemeColorShadeAlpha(TH_SELECT, -30, alpha_shade);
glPointSize(ctrl_size);
bglBegin(GL_POINTS);
if (sld->flipped_vtx) {
if (sld->flipped) {
if (curr_sv->v_side[1]) bglVertex3fv(curr_sv->v_side[1]->co);
}
else {
@ -6813,7 +6818,7 @@ static void doEdgeSlide(TransInfo *t, float perc)
sld->perc = perc;
sv = svlist;
if (sld->is_proportional == true) {
if (sld->use_even == false) {
const bool is_clamp = !(t->flag & T_ALT_TRANSFORM);
if (is_clamp) {
const int side_index = (perc < 0.0f);
@ -6843,7 +6848,7 @@ static void doEdgeSlide(TransInfo *t, float perc)
}
else {
/**
* Implementation note, non proportional mode ignores the starting positions and uses only the
* Implementation note, even mode ignores the starting positions and uses only the
* a/b verts, this could be changed/improved so the distance is still met but the verts are moved along
* their original path (which may not be straight), however how it works now is OK and matches 2.4x - Campbell
*
@ -6851,7 +6856,7 @@ static void doEdgeSlide(TransInfo *t, float perc)
* is the same as the distance between the original vert locations, same goes for the lines below.
*/
TransDataEdgeSlideVert *curr_sv = &sld->sv[sld->curr_sv_index];
const float curr_length_perc = curr_sv->edge_len * (((sld->flipped_vtx ? perc : -perc) + 1.0f) / 2.0f);
const float curr_length_perc = curr_sv->edge_len * (((sld->flipped ? perc : -perc) + 1.0f) / 2.0f);
float co_a[3];
float co_b[3];
@ -6863,7 +6868,7 @@ static void doEdgeSlide(TransInfo *t, float perc)
add_v3_v3v3(co_a, sv->v_co_orig, sv->dir_side[0]);
add_v3_v3v3(co_b, sv->v_co_orig, sv->dir_side[1]);
if (sld->flipped_vtx) {
if (sld->flipped) {
interp_line_v3_v3v3v3(sv->v->co, co_b, sv->v_co_orig, co_a, fac);
}
else {
@ -6880,8 +6885,8 @@ static void applyEdgeSlide(TransInfo *t, const int UNUSED(mval[2]))
size_t ofs = 0;
float final;
EdgeSlideData *sld = t->customData;
bool flipped = sld->flipped_vtx;
bool is_proportional = sld->is_proportional;
bool flipped = sld->flipped;
bool use_even = sld->use_even;
const bool is_clamp = !(t->flag & T_ALT_TRANSFORM);
const bool is_constrained = !(is_clamp == false || hasNumInput(&t->num));
@ -6908,8 +6913,8 @@ static void applyEdgeSlide(TransInfo *t, const int UNUSED(mval[2]))
else {
ofs += BLI_snprintf(str + ofs, MAX_INFO_LEN - ofs, "%.4f ", final);
}
ofs += BLI_snprintf(str + ofs, MAX_INFO_LEN - ofs, IFACE_("(E)ven: %s, "), WM_bool_as_string(!is_proportional));
if (!is_proportional) {
ofs += BLI_snprintf(str + ofs, MAX_INFO_LEN - ofs, IFACE_("(E)ven: %s, "), WM_bool_as_string(use_even));
if (use_even) {
ofs += BLI_snprintf(str + ofs, MAX_INFO_LEN - ofs, IFACE_("(F)lipped: %s, "), WM_bool_as_string(flipped));
}
ofs += BLI_snprintf(str + ofs, MAX_INFO_LEN - ofs, IFACE_("Alt or (C)lamp: %s"), WM_bool_as_string(is_clamp));
@ -6950,7 +6955,7 @@ static void calcVertSlideCustomPoints(struct TransInfo *t)
ARRAY_SET_ITEMS(mval_start, co_orig_2d[0] + mval_ofs[0], co_orig_2d[1] + mval_ofs[1]);
ARRAY_SET_ITEMS(mval_end, co_curr_2d[0] + mval_ofs[0], co_curr_2d[1] + mval_ofs[1]);
if (sld->flipped_vtx && sld->is_proportional == false) {
if (sld->flipped && sld->use_even) {
setCustomPoints(t, &t->mouse, mval_start, mval_end);
}
else {
@ -7041,7 +7046,7 @@ static void calcVertSlideMouseActiveEdges(struct TransInfo *t, const int mval[2]
}
}
static bool createVertSlideVerts(TransInfo *t)
static bool createVertSlideVerts(TransInfo *t, bool use_even, bool flipped)
{
BMEditMesh *em = BKE_editmesh_from_object(t->obedit);
BMesh *bm = em->bm;
@ -7055,9 +7060,9 @@ static bool createVertSlideVerts(TransInfo *t)
slide_origdata_init_flag(t, &sld->orig_data);
sld->is_proportional = true;
sld->use_even = use_even;
sld->curr_sv_index = 0;
sld->flipped_vtx = false;
sld->flipped = flipped;
j = 0;
BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
@ -7191,7 +7196,7 @@ void freeVertSlideVerts(TransInfo *t)
t->customData = NULL;
}
static void initVertSlide(TransInfo *t)
static void initVertSlide_ex(TransInfo *t, bool use_even, bool flipped)
{
VertSlideData *sld;
@ -7199,7 +7204,7 @@ static void initVertSlide(TransInfo *t)
t->transform = applyVertSlide;
t->handleEvent = handleEventVertSlide;
if (!createVertSlideVerts(t)) {
if (!createVertSlideVerts(t, use_even, flipped)) {
t->state = TRANS_CANCEL;
return;
}
@ -7228,6 +7233,11 @@ static void initVertSlide(TransInfo *t)
t->flag |= T_NO_CONSTRAINT | T_NO_PROJECT;
}
static void initVertSlide(TransInfo *t)
{
initVertSlide_ex(t, false, false);
}
static eRedrawFlag handleEventVertSlide(struct TransInfo *t, const struct wmEvent *event)
{
if (t->mode == TFM_VERT_SLIDE) {
@ -7237,8 +7247,8 @@ static eRedrawFlag handleEventVertSlide(struct TransInfo *t, const struct wmEven
switch (event->type) {
case EKEY:
if (event->val == KM_PRESS) {
sld->is_proportional = !sld->is_proportional;
if (sld->flipped_vtx) {
sld->use_even = !sld->use_even;
if (sld->flipped) {
calcVertSlideCustomPoints(t);
}
return TREDRAW_HARD;
@ -7246,7 +7256,7 @@ static eRedrawFlag handleEventVertSlide(struct TransInfo *t, const struct wmEven
break;
case FKEY:
if (event->val == KM_PRESS) {
sld->flipped_vtx = !sld->flipped_vtx;
sld->flipped = !sld->flipped;
calcVertSlideCustomPoints(t);
return TREDRAW_HARD;
}
@ -7345,7 +7355,7 @@ static void drawVertSlide(TransInfo *t)
glPointSize(ctrl_size);
bglBegin(GL_POINTS);
bglVertex3fv((sld->flipped_vtx && sld->is_proportional == false) ?
bglVertex3fv((sld->flipped && sld->use_even) ?
curr_sv->co_link_orig_3d[curr_sv->co_link_curr] :
curr_sv->co_orig_3d);
bglEnd();
@ -7403,7 +7413,7 @@ static void doVertSlide(TransInfo *t, float perc)
sld->perc = perc;
sv = svlist;
if (sld->is_proportional == true) {
if (sld->use_even == false) {
for (i = 0; i < sld->totsv; i++, sv++) {
interp_v3_v3v3(sv->v->co, sv->co_orig_3d, sv->co_link_orig_3d[sv->co_link_curr], perc);
}
@ -7421,7 +7431,7 @@ static void doVertSlide(TransInfo *t, float perc)
edge_len = normalize_v3(dir);
if (edge_len > FLT_EPSILON) {
if (sld->flipped_vtx) {
if (sld->flipped) {
madd_v3_v3v3fl(sv->v->co, sv->co_link_orig_3d[sv->co_link_curr], dir, -tperc);
}
else {
@ -7441,8 +7451,8 @@ static void applyVertSlide(TransInfo *t, const int UNUSED(mval[2]))
size_t ofs = 0;
float final;
VertSlideData *sld = t->customData;
const bool flipped = sld->flipped_vtx;
const bool is_proportional = sld->is_proportional;
const bool flipped = sld->flipped;
const bool use_even = sld->use_even;
const bool is_clamp = !(t->flag & T_ALT_TRANSFORM);
const bool is_constrained = !(is_clamp == false || hasNumInput(&t->num));
@ -7469,8 +7479,8 @@ static void applyVertSlide(TransInfo *t, const int UNUSED(mval[2]))
else {
ofs += BLI_snprintf(str + ofs, MAX_INFO_LEN - ofs, "%.4f ", final);
}
ofs += BLI_snprintf(str + ofs, MAX_INFO_LEN - ofs, IFACE_("(E)ven: %s, "), WM_bool_as_string(!is_proportional));
if (!is_proportional) {
ofs += BLI_snprintf(str + ofs, MAX_INFO_LEN - ofs, IFACE_("(E)ven: %s, "), WM_bool_as_string(use_even));
if (use_even) {
ofs += BLI_snprintf(str + ofs, MAX_INFO_LEN - ofs, IFACE_("(F)lipped: %s, "), WM_bool_as_string(flipped));
}
ofs += BLI_snprintf(str + ofs, MAX_INFO_LEN - ofs, IFACE_("Alt or (C)lamp: %s"), WM_bool_as_string(is_clamp));

View File

@ -252,8 +252,8 @@ typedef struct EdgeSlideData {
float perc;
bool is_proportional;
bool flipped_vtx;
bool use_even;
bool flipped;
int curr_sv_index;
@ -284,8 +284,8 @@ typedef struct VertSlideData {
float perc;
bool is_proportional;
bool flipped_vtx;
bool use_even;
bool flipped;
int curr_sv_index;

View File

@ -851,6 +851,8 @@ static void TRANSFORM_OT_edge_slide(struct wmOperatorType *ot)
prop = RNA_def_boolean(ot->srna, "single_side", false, "Single Side", "");
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
RNA_def_boolean(ot->srna, "use_even", false, "Even", "Makes the edge loop match the shape of the adjacent edge loop.");
RNA_def_boolean(ot->srna, "flipped", false, "Flipped", "When Even mode is active, flips between the two adjacent edge loops");
Transform_Properties(ot, P_MIRROR | P_SNAP | P_CORRECT_UV);
}
@ -871,6 +873,8 @@ static void TRANSFORM_OT_vert_slide(struct wmOperatorType *ot)
ot->poll = ED_operator_editmesh_region_view3d;
RNA_def_float_factor(ot->srna, "value", 0, -10.0f, 10.0f, "Factor", "", -1.0f, 1.0f);
RNA_def_boolean(ot->srna, "use_even", false, "Even", "Makes the edge loop match the shape of the adjacent edge loop.");
RNA_def_boolean(ot->srna, "flipped", false, "Flipped", "When Even mode is active, flips between the two adjacent edge loops");
Transform_Properties(ot, P_MIRROR | P_SNAP | P_CORRECT_UV);
}

View File

@ -1558,6 +1558,8 @@ static uiBlock *wm_block_create_redo(bContext *C, ARegion *ar, void *arg_op)
if (op->type->flag & OPTYPE_MACRO) {
for (op = op->macro.first; op; op = op->next) {
uiLayoutOperatorButs(C, layout, op, NULL, 'H', UI_LAYOUT_OP_SHOW_TITLE);
if (op->next)
uiItemS(layout);
}
}
else {