Cleanup: Rearrange Vert and Edge slide functions
And make `trans_mesh_customdata_correction` a more generic utility.
This commit is contained in:
@@ -2088,14 +2088,6 @@ int transformEnd(bContext *C, TransInfo *t)
|
||||
if (t->state != TRANS_STARTING && t->state != TRANS_RUNNING) {
|
||||
/* handle restoring objects */
|
||||
if (t->state == TRANS_CANCEL) {
|
||||
/* exception, edge slide transformed UVs too */
|
||||
if (t->mode == TFM_EDGE_SLIDE) {
|
||||
doEdgeSlide(t, 0.0f);
|
||||
}
|
||||
else if (t->mode == TFM_VERT_SLIDE) {
|
||||
doVertSlide(t, 0.0f);
|
||||
}
|
||||
|
||||
exit_code = OPERATOR_CANCELLED;
|
||||
restoreTransObjects(t); // calls recalcData()
|
||||
}
|
||||
|
||||
@@ -47,8 +47,7 @@ bool clipUVTransform(TransInfo *t, float vec[2], const bool resize);
|
||||
void clipUVData(TransInfo *t);
|
||||
|
||||
/* transform_convert_mesh.c */
|
||||
void trans_mesh_customdata_correction_init(TransInfo *t);
|
||||
void trans_mesh_customdata_correction_apply(struct TransDataContainer *tc, bool is_final);
|
||||
void trans_mesh_customdata_correction_init(TransInfo *t, struct TransDataContainer *tc);
|
||||
|
||||
/* transform_convert_sequencer.c */
|
||||
int transform_convert_sequencer_get_snap_bound(TransInfo *t);
|
||||
|
||||
@@ -1070,17 +1070,12 @@ static void create_trans_vert_customdata_layer(BMVert *v,
|
||||
BLI_ghash_insert(tcld->origverts, v, r_tcld_vert);
|
||||
}
|
||||
|
||||
void trans_mesh_customdata_correction_init(TransInfo *t)
|
||||
void trans_mesh_customdata_correction_init(TransInfo *t, TransDataContainer *tc)
|
||||
{
|
||||
FOREACH_TRANS_DATA_CONTAINER (t, tc) {
|
||||
if (tc->custom.type.data) {
|
||||
if (tc->custom.type.free_cb == trans_mesh_customdata_free_cb) {
|
||||
/* Custom data correction has initiated before. */
|
||||
continue;
|
||||
}
|
||||
else {
|
||||
BLI_assert(false);
|
||||
}
|
||||
BLI_assert(tc->custom.type.free_cb == trans_mesh_customdata_free_cb);
|
||||
return;
|
||||
}
|
||||
int i;
|
||||
|
||||
@@ -1169,7 +1164,6 @@ void trans_mesh_customdata_correction_init(TransInfo *t)
|
||||
tcld->data = tcld_vert;
|
||||
tcld->data_len = data_len;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1313,7 +1307,7 @@ static void trans_mesh_customdata_correction_apply_vert(struct TransCustomDataLa
|
||||
}
|
||||
}
|
||||
|
||||
void trans_mesh_customdata_correction_apply(struct TransDataContainer *tc, bool is_final)
|
||||
static void trans_mesh_customdata_correction_apply(struct TransDataContainer *tc, bool is_final)
|
||||
{
|
||||
struct TransCustomDataLayer *tcld = tc->custom.type.data;
|
||||
if (!tcld) {
|
||||
@@ -1387,11 +1381,10 @@ void recalcData_mesh(TransInfo *t)
|
||||
}
|
||||
}
|
||||
|
||||
if (t->mode == TFM_EDGE_SLIDE) {
|
||||
projectEdgeSlideData(t, false);
|
||||
if (ELEM(t->mode, TFM_EDGE_SLIDE, TFM_VERT_SLIDE)) {
|
||||
FOREACH_TRANS_DATA_CONTAINER (t, tc) {
|
||||
trans_mesh_customdata_correction_apply(tc, false);
|
||||
}
|
||||
else if (t->mode == TFM_VERT_SLIDE) {
|
||||
projectVertSlideData(t, false);
|
||||
}
|
||||
|
||||
FOREACH_TRANS_DATA_CONTAINER (t, tc) {
|
||||
@@ -1410,15 +1403,24 @@ void recalcData_mesh(TransInfo *t)
|
||||
void special_aftertrans_update__mesh(bContext *UNUSED(C), TransInfo *t)
|
||||
{
|
||||
const bool canceled = (t->state == TRANS_CANCEL);
|
||||
|
||||
if (canceled) {
|
||||
/* Exception, edge slide transformed UVs too. */
|
||||
if (t->mode == TFM_EDGE_SLIDE) {
|
||||
/* handle multires re-projection, done
|
||||
* on transform completion since it's
|
||||
* really slow -joeedh */
|
||||
projectEdgeSlideData(t, !canceled);
|
||||
doEdgeSlide(t, 0.0f);
|
||||
}
|
||||
else if (t->mode == TFM_VERT_SLIDE) {
|
||||
/* as above */
|
||||
projectVertSlideData(t, !canceled);
|
||||
doVertSlide(t, 0.0f);
|
||||
}
|
||||
}
|
||||
|
||||
if (ELEM(t->mode, TFM_EDGE_SLIDE, TFM_VERT_SLIDE)) {
|
||||
/* Handle multires re-projection, done
|
||||
* on transform completion since it's
|
||||
* really slow -joeedh. */
|
||||
FOREACH_TRANS_DATA_CONTAINER (t, tc) {
|
||||
trans_mesh_customdata_correction_apply(tc, !canceled);
|
||||
}
|
||||
}
|
||||
|
||||
bool use_automerge = !canceled && (t->flag & (T_AUTOMERGE | T_AUTOSPLIT)) != 0;
|
||||
|
||||
@@ -94,7 +94,6 @@ void initNormalRotation(TransInfo *t);
|
||||
void initSeqSlide(TransInfo *t);
|
||||
|
||||
/* transform_mode_edge_slide.c */
|
||||
void projectEdgeSlideData(TransInfo *t, bool is_final);
|
||||
void drawEdgeSlide(TransInfo *t);
|
||||
void doEdgeSlide(TransInfo *t, float perc);
|
||||
void initEdgeSlide_ex(
|
||||
@@ -153,7 +152,6 @@ void initTrackball(TransInfo *t);
|
||||
void initTranslation(TransInfo *t);
|
||||
|
||||
/* transform_mode_vert_slide.c */
|
||||
void projectVertSlideData(TransInfo *t, bool is_final);
|
||||
void drawVertSlide(TransInfo *t);
|
||||
void doVertSlide(TransInfo *t, float perc);
|
||||
void initVertSlide_ex(TransInfo *t, bool use_even, bool flipped, bool use_clamp);
|
||||
|
||||
@@ -519,7 +519,7 @@ static void calcEdgeSlide_even(TransInfo *t,
|
||||
}
|
||||
}
|
||||
|
||||
static bool createEdgeSlideVerts_double_side(TransInfo *t, TransDataContainer *tc)
|
||||
static EdgeSlideData *createEdgeSlideVerts_double_side(TransInfo *t, TransDataContainer *tc)
|
||||
{
|
||||
BMEditMesh *em = BKE_editmesh_from_object(tc->obedit);
|
||||
BMesh *bm = em->bm;
|
||||
@@ -554,8 +554,9 @@ static bool createEdgeSlideVerts_double_side(TransInfo *t, TransDataContainer *t
|
||||
}
|
||||
|
||||
if (numsel == 0 || numsel > 2) {
|
||||
/* Invalid edge selection. */
|
||||
MEM_freeN(sld);
|
||||
return false; /* invalid edge selection */
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -566,7 +567,7 @@ static bool createEdgeSlideVerts_double_side(TransInfo *t, TransDataContainer *t
|
||||
if (!BM_edge_is_manifold(e) && !BM_edge_is_boundary(e)) {
|
||||
/* can edges with at least once face user */
|
||||
MEM_freeN(sld);
|
||||
return false;
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -595,7 +596,7 @@ static bool createEdgeSlideVerts_double_side(TransInfo *t, TransDataContainer *t
|
||||
if (!j) {
|
||||
MEM_freeN(sld);
|
||||
MEM_freeN(sv_table);
|
||||
return false;
|
||||
return NULL;
|
||||
}
|
||||
sv_tot = j;
|
||||
}
|
||||
@@ -870,18 +871,16 @@ static bool createEdgeSlideVerts_double_side(TransInfo *t, TransDataContainer *t
|
||||
calcEdgeSlide_even(t, tc, sld, mval);
|
||||
}
|
||||
|
||||
tc->custom.mode.data = sld;
|
||||
|
||||
MEM_freeN(sv_table);
|
||||
|
||||
return true;
|
||||
return sld;
|
||||
}
|
||||
|
||||
/**
|
||||
* A simple version of #createEdgeSlideVerts_double_side
|
||||
* Which assumes the longest unselected.
|
||||
*/
|
||||
static bool createEdgeSlideVerts_single_side(TransInfo *t, TransDataContainer *tc)
|
||||
static EdgeSlideData *createEdgeSlideVerts_single_side(TransInfo *t, TransDataContainer *tc)
|
||||
{
|
||||
BMEditMesh *em = BKE_editmesh_from_object(tc->obedit);
|
||||
BMesh *bm = em->bm;
|
||||
@@ -933,7 +932,7 @@ static bool createEdgeSlideVerts_single_side(TransInfo *t, TransDataContainer *t
|
||||
|
||||
if (!j) {
|
||||
MEM_freeN(sld);
|
||||
return false;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
sv_tot = j;
|
||||
@@ -1055,24 +1054,9 @@ static bool createEdgeSlideVerts_single_side(TransInfo *t, TransDataContainer *t
|
||||
calcEdgeSlide_even(t, tc, sld, mval);
|
||||
}
|
||||
|
||||
tc->custom.mode.data = sld;
|
||||
|
||||
MEM_freeN(sv_table);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void projectEdgeSlideData(TransInfo *t, bool is_final)
|
||||
{
|
||||
FOREACH_TRANS_DATA_CONTAINER (t, tc) {
|
||||
EdgeSlideData *sld = tc->custom.mode.data;
|
||||
|
||||
if (sld == NULL) {
|
||||
continue;
|
||||
}
|
||||
|
||||
trans_mesh_customdata_correction_apply(tc, is_final);
|
||||
}
|
||||
return sld;
|
||||
}
|
||||
|
||||
static void freeEdgeSlideVerts(TransInfo *UNUSED(t),
|
||||
@@ -1450,13 +1434,15 @@ void initEdgeSlide_ex(
|
||||
|
||||
if (use_double_side) {
|
||||
FOREACH_TRANS_DATA_CONTAINER (t, tc) {
|
||||
ok |= createEdgeSlideVerts_double_side(t, tc);
|
||||
sld = use_double_side ? createEdgeSlideVerts_double_side(t, tc) :
|
||||
createEdgeSlideVerts_single_side(t, tc);
|
||||
if (sld) {
|
||||
tc->custom.mode.data = sld;
|
||||
tc->custom.mode.free_cb = freeEdgeSlideVerts;
|
||||
trans_mesh_customdata_correction_init(t, tc);
|
||||
ok = true;
|
||||
}
|
||||
}
|
||||
else {
|
||||
FOREACH_TRANS_DATA_CONTAINER (t, tc) {
|
||||
ok |= createEdgeSlideVerts_single_side(t, tc);
|
||||
}
|
||||
}
|
||||
|
||||
if (!ok) {
|
||||
@@ -1464,16 +1450,6 @@ void initEdgeSlide_ex(
|
||||
return;
|
||||
}
|
||||
|
||||
FOREACH_TRANS_DATA_CONTAINER (t, tc) {
|
||||
sld = tc->custom.mode.data;
|
||||
if (!sld) {
|
||||
continue;
|
||||
}
|
||||
tc->custom.mode.free_cb = freeEdgeSlideVerts;
|
||||
}
|
||||
|
||||
trans_mesh_customdata_correction_init(t);
|
||||
|
||||
/* set custom point first if you want value to be initialized by init */
|
||||
calcEdgeSlideCustomPoints(t);
|
||||
initMouseInputMode(t, &t->mouse, INPUT_CUSTOM_RATIO_FLIP);
|
||||
|
||||
@@ -197,7 +197,7 @@ static void calcVertSlideMouseActiveEdges(struct TransInfo *t, const int mval[2]
|
||||
}
|
||||
}
|
||||
|
||||
static bool createVertSlideVerts(TransInfo *t, TransDataContainer *tc)
|
||||
static VertSlideData *createVertSlideVerts(TransInfo *t, const TransDataContainer *tc)
|
||||
{
|
||||
BMEditMesh *em = BKE_editmesh_from_object(tc->obedit);
|
||||
BMesh *bm = em->bm;
|
||||
@@ -234,7 +234,7 @@ static bool createVertSlideVerts(TransInfo *t, TransDataContainer *tc)
|
||||
|
||||
if (!j) {
|
||||
MEM_freeN(sld);
|
||||
return false;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
sv_array = MEM_callocN(sizeof(TransDataVertSlideVert) * j, "sv_array");
|
||||
@@ -272,8 +272,6 @@ static bool createVertSlideVerts(TransInfo *t, TransDataContainer *tc)
|
||||
sld->sv = sv_array;
|
||||
sld->totsv = j;
|
||||
|
||||
tc->custom.mode.data = sld;
|
||||
|
||||
/* most likely will be set below */
|
||||
unit_m4(sld->proj_mat);
|
||||
|
||||
@@ -288,13 +286,7 @@ static bool createVertSlideVerts(TransInfo *t, TransDataContainer *tc)
|
||||
}
|
||||
}
|
||||
|
||||
/* XXX, calc vert slide across all objects */
|
||||
if (tc == t->data_container) {
|
||||
calcVertSlideMouseActiveVert(t, t->mval);
|
||||
calcVertSlideMouseActiveEdges(t, t->mval);
|
||||
}
|
||||
|
||||
return true;
|
||||
return sld;
|
||||
}
|
||||
|
||||
static void freeVertSlideVerts(TransInfo *UNUSED(t),
|
||||
@@ -381,13 +373,6 @@ static eRedrawFlag handleEventVertSlide(struct TransInfo *t, const struct wmEven
|
||||
return TREDRAW_NOTHING;
|
||||
}
|
||||
|
||||
void projectVertSlideData(TransInfo *t, bool is_final)
|
||||
{
|
||||
FOREACH_TRANS_DATA_CONTAINER (t, tc) {
|
||||
trans_mesh_customdata_correction_apply(tc, is_final);
|
||||
}
|
||||
}
|
||||
|
||||
void drawVertSlide(TransInfo *t)
|
||||
{
|
||||
if ((t->mode == TFM_VERT_SLIDE) && TRANS_DATA_CONTAINER_FIRST_OK(t)->custom.mode.data) {
|
||||
@@ -628,10 +613,12 @@ void initVertSlide_ex(TransInfo *t, bool use_even, bool flipped, bool use_clamp)
|
||||
|
||||
bool ok = false;
|
||||
FOREACH_TRANS_DATA_CONTAINER (t, tc) {
|
||||
ok |= createVertSlideVerts(t, tc);
|
||||
VertSlideData *sld = tc->custom.mode.data;
|
||||
VertSlideData *sld = createVertSlideVerts(t, tc);
|
||||
if (sld) {
|
||||
tc->custom.mode.data = sld;
|
||||
tc->custom.mode.free_cb = freeVertSlideVerts;
|
||||
trans_mesh_customdata_correction_init(t, tc);
|
||||
ok = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -640,7 +627,8 @@ void initVertSlide_ex(TransInfo *t, bool use_even, bool flipped, bool use_clamp)
|
||||
return;
|
||||
}
|
||||
|
||||
trans_mesh_customdata_correction_init(t);
|
||||
calcVertSlideMouseActiveVert(t, t->mval);
|
||||
calcVertSlideMouseActiveEdges(t, t->mval);
|
||||
|
||||
/* set custom point first if you want value to be initialized by init */
|
||||
calcVertSlideCustomPoints(t);
|
||||
|
||||
Reference in New Issue
Block a user